ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDliZjcxNGEuLjFkMzVmMTAgMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtMTU3MywxMiArMTU3Myw4IEBACiBTOiBDemVjaCBSZXB1YmxpYwogCiBOOiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbgotRTogbmtiakBpbWFnZS5kawotVzogaHR0cDovL3d3dy5pbWFnZS5kay9+bmtiagorRTogbmtiajE5NzBAaG90bWFpbC5jb20KIEQ6IE1pc2NlbGxhbmVvdXMga2VybmVsIHVwZGF0ZXMgYW5kIGZpeGVzLgotUzogRHIuIEhvbHN0cyBWZWogMzQsIGxlamwuIDE2NAotUzogREstODIzMCDFYnlo+GoKLVM6IERlbm1hcmsKIAogTjogTWljaGFlbCBLLiBKb2huc29uCiBFOiBqb2huc29ubUByZWRoYXQuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlIGIvRG9jdW1lbnRhdGlvbi9Db2RpbmdTdHlsZQppbmRleCBjZTVkMmMwLi42ZDI0MTJlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0NvZGluZ1N0eWxlCisrKyBiL0RvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKQEAgLTE1NSw3ICsxNTUsODMgQEAKIFNlZSBuZXh0IGNoYXB0ZXIuCiAKIAotCQlDaGFwdGVyIDU6IEZ1bmN0aW9ucworCQlDaGFwdGVyIDU6IFR5cGVkZWZzCisKK1BsZWFzZSBkb24ndCB1c2UgdGhpbmdzIGxpa2UgInZwc190Ii4KKworSXQncyBhIF9taXN0YWtlXyB0byB1c2UgdHlwZWRlZiBmb3Igc3RydWN0dXJlcyBhbmQgcG9pbnRlcnMuIFdoZW4geW91IHNlZSBhCisKKwl2cHNfdCBhOworCitpbiB0aGUgc291cmNlLCB3aGF0IGRvZXMgaXQgbWVhbj8KKworSW4gY29udHJhc3QsIGlmIGl0IHNheXMKKworCXN0cnVjdCB2aXJ0dWFsX2NvbnRhaW5lciAqYTsKKworeW91IGNhbiBhY3R1YWxseSB0ZWxsIHdoYXQgImEiIGlzLgorCitMb3RzIG9mIHBlb3BsZSB0aGluayB0aGF0IHR5cGVkZWZzICJoZWxwIHJlYWRhYmlsaXR5Ii4gTm90IHNvLiBUaGV5IGFyZQordXNlZnVsIG9ubHkgZm9yOgorCisgKGEpIHRvdGFsbHkgb3BhcXVlIG9iamVjdHMgKHdoZXJlIHRoZSB0eXBlZGVmIGlzIGFjdGl2ZWx5IHVzZWQgdG8gX2hpZGVfCisgICAgIHdoYXQgdGhlIG9iamVjdCBpcykuCisKKyAgICAgRXhhbXBsZTogInB0ZV90IiBldGMuIG9wYXF1ZSBvYmplY3RzIHRoYXQgeW91IGNhbiBvbmx5IGFjY2VzcyB1c2luZworICAgICB0aGUgcHJvcGVyIGFjY2Vzc29yIGZ1bmN0aW9ucy4KKworICAgICBOT1RFISBPcGFxdWVuZXNzIGFuZCAiYWNjZXNzb3IgZnVuY3Rpb25zIiBhcmUgbm90IGdvb2QgaW4gdGhlbXNlbHZlcy4KKyAgICAgVGhlIHJlYXNvbiB3ZSBoYXZlIHRoZW0gZm9yIHRoaW5ncyBsaWtlIHB0ZV90IGV0Yy4gaXMgdGhhdCB0aGVyZQorICAgICByZWFsbHkgaXMgYWJzb2x1dGVseSBfemVyb18gcG9ydGFibHkgYWNjZXNzaWJsZSBpbmZvcm1hdGlvbiB0aGVyZS4KKworIChiKSBDbGVhciBpbnRlZ2VyIHR5cGVzLCB3aGVyZSB0aGUgYWJzdHJhY3Rpb24gX2hlbHBzXyBhdm9pZCBjb25mdXNpb24KKyAgICAgd2hldGhlciBpdCBpcyAiaW50IiBvciAibG9uZyIuCisKKyAgICAgdTgvdTE2L3UzMiBhcmUgcGVyZmVjdGx5IGZpbmUgdHlwZWRlZnMsIGFsdGhvdWdoIHRoZXkgZml0IGludG8KKyAgICAgY2F0ZWdvcnkgKGQpIGJldHRlciB0aGFuIGhlcmUuCisKKyAgICAgTk9URSEgQWdhaW4gLSB0aGVyZSBuZWVkcyB0byBiZSBhIF9yZWFzb25fIGZvciB0aGlzLiBJZiBzb21ldGhpbmcgaXMKKyAgICAgInVuc2lnbmVkIGxvbmciLCB0aGVuIHRoZXJlJ3Mgbm8gcmVhc29uIHRvIGRvCisKKwl0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbXlmbGFnc190OworCisgICAgIGJ1dCBpZiB0aGVyZSBpcyBhIGNsZWFyIHJlYXNvbiBmb3Igd2h5IGl0IHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcworICAgICBtaWdodCBiZSBhbiAidW5zaWduZWQgaW50IiBhbmQgdW5kZXIgb3RoZXIgY29uZmlndXJhdGlvbnMgbWlnaHQgYmUKKyAgICAgInVuc2lnbmVkIGxvbmciLCB0aGVuIGJ5IGFsbCBtZWFucyBnbyBhaGVhZCBhbmQgdXNlIGEgdHlwZWRlZi4KKworIChjKSB3aGVuIHlvdSB1c2Ugc3BhcnNlIHRvIGxpdGVyYWxseSBjcmVhdGUgYSBfbmV3XyB0eXBlIGZvcgorICAgICB0eXBlLWNoZWNraW5nLgorCisgKGQpIE5ldyB0eXBlcyB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIHN0YW5kYXJkIEM5OSB0eXBlcywgaW4gY2VydGFpbgorICAgICBleGNlcHRpb25hbCBjaXJjdW1zdGFuY2VzLgorCisgICAgIEFsdGhvdWdoIGl0IHdvdWxkIG9ubHkgdGFrZSBhIHNob3J0IGFtb3VudCBvZiB0aW1lIGZvciB0aGUgZXllcyBhbmQKKyAgICAgYnJhaW4gdG8gYmVjb21lIGFjY3VzdG9tZWQgdG8gdGhlIHN0YW5kYXJkIHR5cGVzIGxpa2UgJ3VpbnQzMl90JywKKyAgICAgc29tZSBwZW9wbGUgb2JqZWN0IHRvIHRoZWlyIHVzZSBhbnl3YXkuCisKKyAgICAgVGhlcmVmb3JlLCB0aGUgTGludXgtc3BlY2lmaWMgJ3U4L3UxNi91MzIvdTY0JyB0eXBlcyBhbmQgdGhlaXIKKyAgICAgc2lnbmVkIGVxdWl2YWxlbnRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gc3RhbmRhcmQgdHlwZXMgYXJlCisgICAgIHBlcm1pdHRlZCAtLSBhbHRob3VnaCB0aGV5IGFyZSBub3QgbWFuZGF0b3J5IGluIG5ldyBjb2RlIG9mIHlvdXIKKyAgICAgb3duLgorCisgICAgIFdoZW4gZWRpdGluZyBleGlzdGluZyBjb2RlIHdoaWNoIGFscmVhZHkgdXNlcyBvbmUgb3IgdGhlIG90aGVyIHNldAorICAgICBvZiB0eXBlcywgeW91IHNob3VsZCBjb25mb3JtIHRvIHRoZSBleGlzdGluZyBjaG9pY2VzIGluIHRoYXQgY29kZS4KKworIChlKSBUeXBlcyBzYWZlIGZvciB1c2UgaW4gdXNlcnNwYWNlLgorCisgICAgIEluIGNlcnRhaW4gc3RydWN0dXJlcyB3aGljaCBhcmUgdmlzaWJsZSB0byB1c2Vyc3BhY2UsIHdlIGNhbm5vdAorICAgICByZXF1aXJlIEM5OSB0eXBlcyBhbmQgY2Fubm90IHVzZSB0aGUgJ3UzMicgZm9ybSBhYm92ZS4gVGh1cywgd2UKKyAgICAgdXNlIF9fdTMyIGFuZCBzaW1pbGFyIHR5cGVzIGluIGFsbCBzdHJ1Y3R1cmVzIHdoaWNoIGFyZSBzaGFyZWQKKyAgICAgd2l0aCB1c2Vyc3BhY2UuCisKK01heWJlIHRoZXJlIGFyZSBvdGhlciBjYXNlcyB0b28sIGJ1dCB0aGUgcnVsZSBzaG91bGQgYmFzaWNhbGx5IGJlIHRvIE5FVkVSCitFVkVSIHVzZSBhIHR5cGVkZWYgdW5sZXNzIHlvdSBjYW4gY2xlYXJseSBtYXRjaCBvbmUgb2YgdGhvc2UgcnVsZXMuCisKK0luIGdlbmVyYWwsIGEgcG9pbnRlciwgb3IgYSBzdHJ1Y3QgdGhhdCBoYXMgZWxlbWVudHMgdGhhdCBjYW4gcmVhc29uYWJseQorYmUgZGlyZWN0bHkgYWNjZXNzZWQgc2hvdWxkIF9uZXZlcl8gYmUgYSB0eXBlZGVmLgorCisKKwkJQ2hhcHRlciA2OiBGdW5jdGlvbnMKIAogRnVuY3Rpb25zIHNob3VsZCBiZSBzaG9ydCBhbmQgc3dlZXQsIGFuZCBkbyBqdXN0IG9uZSB0aGluZy4gIFRoZXkgc2hvdWxkCiBmaXQgb24gb25lIG9yIHR3byBzY3JlZW5mdWxzIG9mIHRleHQgKHRoZSBJU08vQU5TSSBzY3JlZW4gc2l6ZSBpcyA4MHgyNCwKQEAgLTE4Myw3ICsyNTksNyBAQAogdG8gdW5kZXJzdGFuZCB3aGF0IHlvdSBkaWQgMiB3ZWVrcyBmcm9tIG5vdy4KIAogCi0JCUNoYXB0ZXIgNjogQ2VudHJhbGl6ZWQgZXhpdGluZyBvZiBmdW5jdGlvbnMKKwkJQ2hhcHRlciA3OiBDZW50cmFsaXplZCBleGl0aW5nIG9mIGZ1bmN0aW9ucwogCiBBbGJlaXQgZGVwcmVjYXRlZCBieSBzb21lIHBlb3BsZSwgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGdvdG8gc3RhdGVtZW50IGlzCiB1c2VkIGZyZXF1ZW50bHkgYnkgY29tcGlsZXJzIGluIGZvcm0gb2YgdGhlIHVuY29uZGl0aW9uYWwganVtcCBpbnN0cnVjdGlvbi4KQEAgLTIyMCw3ICsyOTYsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLQkJQ2hhcHRlciA3OiBDb21tZW50aW5nCisJCUNoYXB0ZXIgODogQ29tbWVudGluZwogCiBDb21tZW50cyBhcmUgZ29vZCwgYnV0IHRoZXJlIGlzIGFsc28gYSBkYW5nZXIgb2Ygb3Zlci1jb21tZW50aW5nLiAgTkVWRVIKIHRyeSB0byBleHBsYWluIEhPVyB5b3VyIGNvZGUgd29ya3MgaW4gYSBjb21tZW50OiBpdCdzIG11Y2ggYmV0dGVyIHRvCkBAIC0yNDAsNyArMzE2LDcgQEAKIFNlZSB0aGUgZmlsZXMgRG9jdW1lbnRhdGlvbi9rZXJuZWwtZG9jLW5hbm8tSE9XVE8udHh0IGFuZCBzY3JpcHRzL2tlcm5lbC1kb2MKIGZvciBkZXRhaWxzLgogCi0JCUNoYXB0ZXIgODogWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0CisJCUNoYXB0ZXIgOTogWW91J3ZlIG1hZGUgYSBtZXNzIG9mIGl0CiAKIFRoYXQncyBPSywgd2UgYWxsIGRvLiAgWW91J3ZlIHByb2JhYmx5IGJlZW4gdG9sZCBieSB5b3VyIGxvbmctdGltZSBVbml4CiB1c2VyIGhlbHBlciB0aGF0ICJHTlUgZW1hY3MiIGF1dG9tYXRpY2FsbHkgZm9ybWF0cyB0aGUgQyBzb3VyY2VzIGZvcgpAQCAtMjg4LDcgKzM2NCw3IEBACiByZW1lbWJlcjogImluZGVudCIgaXMgbm90IGEgZml4IGZvciBiYWQgcHJvZ3JhbW1pbmcuCiAKIAotCQlDaGFwdGVyIDk6IENvbmZpZ3VyYXRpb24tZmlsZXMKKwkJQ2hhcHRlciAxMDogQ29uZmlndXJhdGlvbi1maWxlcwogCiBGb3IgY29uZmlndXJhdGlvbiBvcHRpb25zIChhcmNoL3h4eC9LY29uZmlnLCBhbmQgYWxsIHRoZSBLY29uZmlnIGZpbGVzKSwKIHNvbWV3aGF0IGRpZmZlcmVudCBpbmRlbnRhdGlvbiBpcyB1c2VkLgpAQCAtMzEzLDcgKzM4OSw3IEBACiBleHBlcmltZW50YWwgb3B0aW9ucyBzaG91bGQgYmUgZGVub3RlZCAoRVhQRVJJTUVOVEFMKS4KIAogCi0JCUNoYXB0ZXIgMTA6IERhdGEgc3RydWN0dXJlcworCQlDaGFwdGVyIDExOiBEYXRhIHN0cnVjdHVyZXMKIAogRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgaGF2ZSB2aXNpYmlsaXR5IG91dHNpZGUgdGhlIHNpbmdsZS10aHJlYWRlZAogZW52aXJvbm1lbnQgdGhleSBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGluIHNob3VsZCBhbHdheXMgaGF2ZQpAQCAtMzQ0LDcgKzQyMCw3IEBACiBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IG9uIGl0LCB5b3UgYWxtb3N0IGNlcnRhaW5seSBoYXZlIGEgYnVnLgogCiAKLQkJQ2hhcHRlciAxMTogTWFjcm9zLCBFbnVtcyBhbmQgUlRMCisJCUNoYXB0ZXIgMTI6IE1hY3JvcywgRW51bXMgYW5kIFJUTAogCiBOYW1lcyBvZiBtYWNyb3MgZGVmaW5pbmcgY29uc3RhbnRzIGFuZCBsYWJlbHMgaW4gZW51bXMgYXJlIGNhcGl0YWxpemVkLgogCkBAIC0zOTksNyArNDc1LDcgQEAKIGNvdmVycyBSVEwgd2hpY2ggaXMgdXNlZCBmcmVxdWVudGx5IHdpdGggYXNzZW1ibHkgbGFuZ3VhZ2UgaW4gdGhlIGtlcm5lbC4KIAogCi0JCUNoYXB0ZXIgMTI6IFByaW50aW5nIGtlcm5lbCBtZXNzYWdlcworCQlDaGFwdGVyIDEzOiBQcmludGluZyBrZXJuZWwgbWVzc2FnZXMKIAogS2VybmVsIGRldmVsb3BlcnMgbGlrZSB0byBiZSBzZWVuIGFzIGxpdGVyYXRlLiBEbyBtaW5kIHRoZSBzcGVsbGluZwogb2Yga2VybmVsIG1lc3NhZ2VzIHRvIG1ha2UgYSBnb29kIGltcHJlc3Npb24uIERvIG5vdCB1c2UgY3JpcHBsZWQKQEAgLTQxMCw3ICs0ODYsNyBAQAogUHJpbnRpbmcgbnVtYmVycyBpbiBwYXJlbnRoZXNlcyAoJWQpIGFkZHMgbm8gdmFsdWUgYW5kIHNob3VsZCBiZSBhdm9pZGVkLgogCiAKLQkJQ2hhcHRlciAxMzogQWxsb2NhdGluZyBtZW1vcnkKKwkJQ2hhcHRlciAxNDogQWxsb2NhdGluZyBtZW1vcnkKIAogVGhlIGtlcm5lbCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGdlbmVyYWwgcHVycG9zZSBtZW1vcnkgYWxsb2NhdG9yczoKIGttYWxsb2MoKSwga3phbGxvYygpLCBrY2FsbG9jKCksIGFuZCB2bWFsbG9jKCkuICBQbGVhc2UgcmVmZXIgdG8gdGhlIEFQSQpAQCAtNDI5LDcgKzUwNSw3IEBACiBsYW5ndWFnZS4KIAogCi0JCUNoYXB0ZXIgMTQ6IFRoZSBpbmxpbmUgZGlzZWFzZQorCQlDaGFwdGVyIDE1OiBUaGUgaW5saW5lIGRpc2Vhc2UKIAogVGhlcmUgYXBwZWFycyB0byBiZSBhIGNvbW1vbiBtaXNwZXJjZXB0aW9uIHRoYXQgZ2NjIGhhcyBhIG1hZ2ljICJtYWtlIG1lCiBmYXN0ZXIiIHNwZWVkdXAgb3B0aW9uIGNhbGxlZCAiaW5saW5lIi4gV2hpbGUgdGhlIHVzZSBvZiBpbmxpbmVzIGNhbiBiZQpAQCAtNDU3LDcgKzUzMyw3IEBACiAKIAogCi0JCUNoYXB0ZXIgMTU6IFJlZmVyZW5jZXMKKwkJQXBwZW5kaXggSTogUmVmZXJlbmNlcwogCiBUaGUgQyBQcm9ncmFtbWluZyBMYW5ndWFnZSwgU2Vjb25kIEVkaXRpb24KIGJ5IEJyaWFuIFcuIEtlcm5pZ2hhbiBhbmQgRGVubmlzIE0uIFJpdGNoaWUuCkBAIC00ODEsNCArNTU3LDQgQEAKIGh0dHA6Ly93d3cua3JvYWguY29tL2xpbnV4L3RhbGtzL29sc18yMDAyX2tlcm5lbF9jb2RpbmdzdHlsZV90YWxrL2h0bWwvCiAKIC0tCi1MYXN0IHVwZGF0ZWQgb24gMzAgRGVjZW1iZXIgMjAwNSBieSBhIGNvbW11bml0eSBlZmZvcnQgb24gTEtNTC4KK0xhc3QgdXBkYXRlZCBvbiAzMCBBcHJpbCAyMDA2LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpLnRtcGwKaW5kZXggY2EwMmUwNC4uMzYzMGEwZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2sva2VybmVsLWFwaS50bXBsCkBAIC02Miw2ICs2Miw4IEBACiAgICAgIDxzZWN0MT48dGl0bGU+SW50ZXJuYWwgRnVuY3Rpb25zPC90aXRsZT4KICFJa2VybmVsL2V4aXQuYwogIUlrZXJuZWwvc2lnbmFsLmMKKyFJaW5jbHVkZS9saW51eC9rdGhyZWFkLmgKKyFFa2VybmVsL2t0aHJlYWQuYwogICAgICA8L3NlY3QxPgogCiAgICAgIDxzZWN0MT48dGl0bGU+S2VybmVsIG9iamVjdHMgbWFuaXB1bGF0aW9uPC90aXRsZT4KQEAgLTExNCw5ICsxMTYsMzMgQEAKICAgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCisgIDxjaGFwdGVyIGlkPSJrZXJuZWwtbGliIj4KKyAgICAgPHRpdGxlPkJhc2ljIEtlcm5lbCBMaWJyYXJ5IEZ1bmN0aW9uczwvdGl0bGU+CisKKyAgICAgPHBhcmE+CisgICAgICAgVGhlIExpbnV4IGtlcm5lbCBwcm92aWRlcyBtb3JlIGJhc2ljIHV0aWxpdHkgZnVuY3Rpb25zLgorICAgICA8L3BhcmE+CisKKyAgICAgPHNlY3QxPjx0aXRsZT5CaXRtYXAgT3BlcmF0aW9uczwvdGl0bGU+CishRWxpYi9iaXRtYXAuYworIUlsaWIvYml0bWFwLmMKKyAgICAgPC9zZWN0MT4KKworICAgICA8c2VjdDE+PHRpdGxlPkNvbW1hbmQtbGluZSBQYXJzaW5nPC90aXRsZT4KKyFFbGliL2NtZGxpbmUuYworICAgICA8L3NlY3QxPgorCisgICAgIDxzZWN0MT48dGl0bGU+Q1JDIEZ1bmN0aW9uczwvdGl0bGU+CishRWxpYi9jcmMxNi5jCishRWxpYi9jcmMzMi5jCishRWxpYi9jcmMtY2NpdHQuYworICAgICA8L3NlY3QxPgorICA8L2NoYXB0ZXI+CisKICAgPGNoYXB0ZXIgaWQ9Im1tIj4KICAgICAgPHRpdGxlPk1lbW9yeSBNYW5hZ2VtZW50IGluIExpbnV4PC90aXRsZT4KICAgICAgPHNlY3QxPjx0aXRsZT5UaGUgU2xhYiBDYWNoZTwvdGl0bGU+CishSWluY2x1ZGUvbGludXgvc2xhYi5oCiAhRW1tL3NsYWIuYwogICAgICA8L3NlY3QxPgogICAgICA8c2VjdDE+PHRpdGxlPlVzZXIgU3BhY2UgTWVtb3J5IEFjY2VzczwvdGl0bGU+CkBAIC0yODAsMTIgKzMwNiwxMyBAQAogICAgICA8c2VjdDE+PHRpdGxlPk1UUlIgSGFuZGxpbmc8L3RpdGxlPgogIUVhcmNoL2kzODYva2VybmVsL2NwdS9tdHJyL21haW4uYwogICAgICA8L3NlY3QxPgorCiAgICAgIDxzZWN0MT48dGl0bGU+UENJIFN1cHBvcnQgTGlicmFyeTwvdGl0bGU+CiAhRWRyaXZlcnMvcGNpL3BjaS5jCiAhRWRyaXZlcnMvcGNpL3BjaS1kcml2ZXIuYwogIUVkcml2ZXJzL3BjaS9yZW1vdmUuYwogIUVkcml2ZXJzL3BjaS9wY2ktYWNwaS5jCi08IS0tIGtlcm5lbGRvYyBkb2VzIG5vdCB1bmRlcnN0YW5kIHRvIF9fZGV2aW5pdAorPCEtLSBrZXJuZWxkb2MgZG9lcyBub3QgdW5kZXJzdGFuZCBfX2RldmluaXQKIFghRWRyaXZlcnMvcGNpL3NlYXJjaC5jCiAgLS0+CiAhRWRyaXZlcnMvcGNpL21zaS5jCkBAIC0zMTQsNiArMzQxLDEzIEBACiAgICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KIAorICA8Y2hhcHRlciBpZD0iZmlybXdhcmUiPgorICAgICA8dGl0bGU+RmlybXdhcmUgSW50ZXJmYWNlczwvdGl0bGU+CisgICAgIDxzZWN0MT48dGl0bGU+RE1JIEludGVyZmFjZXM8L3RpdGxlPgorIUVkcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKyAgICAgPC9zZWN0MT4KKyAgPC9jaGFwdGVyPgorCiAgIDxjaGFwdGVyIGlkPSJkZXZmcyI+CiAgICAgIDx0aXRsZT5UaGUgRGV2aWNlIEZpbGUgU3lzdGVtPC90aXRsZT4KICFFZnMvZGV2ZnMvYmFzZS5jCkBAIC0zMzEsNiArMzY1LDE4IEBACiAhRXNlY3VyaXR5L3NlY3VyaXR5LmMKICAgPC9jaGFwdGVyPgogCisgIDxjaGFwdGVyIGlkPSJhdWRpdCI+CisgICAgIDx0aXRsZT5BdWRpdCBJbnRlcmZhY2VzPC90aXRsZT4KKyFFa2VybmVsL2F1ZGl0LmMKKyFJa2VybmVsL2F1ZGl0c2MuYworIUlrZXJuZWwvYXVkaXRmaWx0ZXIuYworICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9ImFjY291bnRpbmciPgorICAgICA8dGl0bGU+QWNjb3VudGluZyBGcmFtZXdvcms8L3RpdGxlPgorIUlrZXJuZWwvYWNjdC5jCisgIDwvY2hhcHRlcj4KKwogICA8Y2hhcHRlciBpZD0icG1mdW5jcyI+CiAgICAgIDx0aXRsZT5Qb3dlciBNYW5hZ2VtZW50PC90aXRsZT4KICFFa2VybmVsL3Bvd2VyL3BtLmMKQEAgLTM5MCw3ICs0MzYsNiBAQAogICAgICA8L3NlY3QxPgogICA8L2NoYXB0ZXI+CiAKLQogICA8Y2hhcHRlciBpZD0iYmxrZGV2Ij4KICAgICAgPHRpdGxlPkJsb2NrIERldmljZXM8L3RpdGxlPgogIUVibG9jay9sbF9yd19ibGsuYwpAQCAtNDAxLDYgKzQ0NiwxNCBAQAogIUVkcml2ZXJzL2NoYXIvbWlzYy5jCiAgIDwvY2hhcHRlcj4KIAorICA8Y2hhcHRlciBpZD0icGFycG9ydGRldiI+CisgICAgIDx0aXRsZT5QYXJhbGxlbCBQb3J0IERldmljZXM8L3RpdGxlPgorIUlpbmNsdWRlL2xpbnV4L3BhcnBvcnQuaAorIUVkcml2ZXJzL3BhcnBvcnQvaWVlZTEyODQuYworIUVkcml2ZXJzL3BhcnBvcnQvc2hhcmUuYworIUlkcml2ZXJzL3BhcnBvcnQvZGFpc3kuYworICA8L2NoYXB0ZXI+CisKICAgPGNoYXB0ZXIgaWQ9InZpZGRldiI+CiAgICAgIDx0aXRsZT5WaWRlbzRMaW51eDwvdGl0bGU+CiAhRWRyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xpYmF0YS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2xpYmF0YS50bXBsCmluZGV4IGY4NjliMDMuLmU5N2MzMjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbGliYXRhLnRtcGwKQEAgLTE2OSw2ICsxNjksMjIgQEAKIAogCTwvc2VjdDI+CiAKKwk8c2VjdDI+PHRpdGxlPlBJTyBkYXRhIHJlYWQvd3JpdGU8L3RpdGxlPgorCTxwcm9ncmFtbGlzdGluZz4KK3ZvaWQgKCpkYXRhX3hmZXIpIChzdHJ1Y3QgYXRhX2RldmljZSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCwgaW50KTsKKwk8L3Byb2dyYW1saXN0aW5nPgorCisJPHBhcmE+CitBbGwgYm1kbWEtc3R5bGUgZHJpdmVycyBtdXN0IGltcGxlbWVudCB0aGlzIGhvb2suICBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwKK29wZXJhdGlvbiB0aGF0IGFjdHVhbGx5IGNvcGllcyB0aGUgZGF0YSBieXRlcyBkdXJpbmcgYSBQSU8gZGF0YQordHJhbnNmZXIuCitUeXBpY2FsbHkgdGhlIGRyaXZlcgord2lsbCBjaG9vc2Ugb25lIG9mIGF0YV9waW9fZGF0YV94ZmVyX25vaXJxKCksIGF0YV9waW9fZGF0YV94ZmVyKCksIG9yCithdGFfbW1pb19kYXRhX3hmZXIoKS4KKwk8L3BhcmE+CisKKwk8L3NlY3QyPgorCiAJPHNlY3QyPjx0aXRsZT5BVEEgY29tbWFuZCBleGVjdXRlPC90aXRsZT4KIAk8cHJvZ3JhbWxpc3Rpbmc+CiB2b2lkICgqZXhlY19jb21tYW5kKShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Zik7CkBAIC0yMDQsMTEgKzIyMCwxMCBAQAogCTxwcm9ncmFtbGlzdGluZz4KIHU4ICAgKCpjaGVja19zdGF0dXMpKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogdTggICAoKmNoZWNrX2FsdHN0YXR1cykoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci11OCAgICgqY2hlY2tfZXJyKShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAk8L3Byb2dyYW1saXN0aW5nPgogCiAJPHBhcmE+Ci0JUmVhZHMgdGhlIFN0YXR1cy9BbHRTdGF0dXMvRXJyb3IgQVRBIHNoYWRvdyByZWdpc3RlciBmcm9tCisJUmVhZHMgdGhlIFN0YXR1cy9BbHRTdGF0dXMgQVRBIHNoYWRvdyByZWdpc3RlciBmcm9tCiAJaGFyZHdhcmUuICBPbiBzb21lIGhhcmR3YXJlLCByZWFkaW5nIHRoZSBTdGF0dXMgcmVnaXN0ZXIgaGFzCiAJdGhlIHNpZGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgY29uZGl0aW9uLgogCU1vc3QgZHJpdmVycyBmb3IgdGFza2ZpbGUtYmFzZWQgaGFyZHdhcmUgdXNlCkBAIC0yNjksMjMgKzI4NCw2IEBACiAKIAk8L3NlY3QyPgogCi0JPHNlY3QyPjx0aXRsZT5SZXNldCBBVEEgYnVzPC90aXRsZT4KLQk8cHJvZ3JhbWxpc3Rpbmc+Ci12b2lkICgqcGh5X3Jlc2V0KSAoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci0JPC9wcm9ncmFtbGlzdGluZz4KLQotCTxwYXJhPgotCVRoZSB2ZXJ5IGZpcnN0IHN0ZXAgaW4gdGhlIHByb2JlIHBoYXNlLiAgQWN0aW9ucyB2YXJ5IGRlcGVuZGluZwotCW9uIHRoZSBidXMgdHlwZSwgdHlwaWNhbGx5LiAgQWZ0ZXIgd2FraW5nIHVwIHRoZSBkZXZpY2UgYW5kIHByb2JpbmcKLQlmb3IgZGV2aWNlIHByZXNlbmNlIChQQVRBIGFuZCBTQVRBKSwgdHlwaWNhbGx5IGEgc29mdCByZXNldAotCShTUlNUKSB3aWxsIGJlIHBlcmZvcm1lZC4gIERyaXZlcnMgdHlwaWNhbGx5IHVzZSB0aGUgaGVscGVyCi0JZnVuY3Rpb25zIGF0YV9idXNfcmVzZXQoKSBvciBzYXRhX3BoeV9yZXNldCgpIGZvciB0aGlzIGhvb2suCi0JTWFueSBTQVRBIGRyaXZlcnMgdXNlIHNhdGFfcGh5X3Jlc2V0KCkgb3IgY2FsbCBpdCBmcm9tIHdpdGhpbgotCXRoZWlyIG93biBwaHlfcmVzZXQoKSBmdW5jdGlvbnMuCi0JPC9wYXJhPgotCi0JPC9zZWN0Mj4KLQogCTxzZWN0Mj48dGl0bGU+Q29udHJvbCBQQ0kgSURFIEJNRE1BIGVuZ2luZTwvdGl0bGU+CiAJPHByb2dyYW1saXN0aW5nPgogdm9pZCAoKmJtZG1hX3NldHVwKSAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CkBAIC0zNTQsMTYgKzM1Miw3NCBAQAogCiAJPC9zZWN0Mj4KIAotCTxzZWN0Mj48dGl0bGU+VGltZW91dCAoZXJyb3IpIGhhbmRsaW5nPC90aXRsZT4KKwk8c2VjdDI+PHRpdGxlPkV4Y2VwdGlvbiBhbmQgcHJvYmUgaGFuZGxpbmcgKEVIKTwvdGl0bGU+CiAJPHByb2dyYW1saXN0aW5nPgogdm9pZCAoKmVuZ190aW1lb3V0KSAoc3RydWN0IGF0YV9wb3J0ICphcCk7Cit2b2lkICgqcGh5X3Jlc2V0KSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CiAJPC9wcm9ncmFtbGlzdGluZz4KIAogCTxwYXJhPgotVGhpcyBpcyBhIGhpZ2ggbGV2ZWwgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb24sIGNhbGxlZCBmcm9tIHRoZQotZXJyb3IgaGFuZGxpbmcgdGhyZWFkLCB3aGVuIGEgY29tbWFuZCB0aW1lcyBvdXQuICBNb3N0IG5ld2VyCi1oYXJkd2FyZSB3aWxsIGltcGxlbWVudCBpdHMgb3duIGVycm9yIGhhbmRsaW5nIGNvZGUgaGVyZS4gIElERSBCTURNQQotZHJpdmVycyBtYXkgdXNlIHRoZSBoZWxwZXIgZnVuY3Rpb24gYXRhX2VuZ190aW1lb3V0KCkuCitEZXByZWNhdGVkLiAgVXNlIC0+ZXJyb3JfaGFuZGxlcigpIGluc3RlYWQuCisJPC9wYXJhPgorCisJPHByb2dyYW1saXN0aW5nPgordm9pZCAoKmZyZWV6ZSkgKHN0cnVjdCBhdGFfcG9ydCAqYXApOwordm9pZCAoKnRoYXcpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKKwk8L3Byb2dyYW1saXN0aW5nPgorCisJPHBhcmE+CithdGFfcG9ydF9mcmVlemUoKSBpcyBjYWxsZWQgd2hlbiBIU00gdmlvbGF0aW9ucyBvciBzb21lIG90aGVyCitjb25kaXRpb24gZGlzcnVwdHMgbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUgcG9ydC4gIEEgZnJvemVuIHBvcnQKK2lzIG5vdCBhbGxvd2VkIHRvIHBlcmZvcm0gYW55IG9wZXJhdGlvbiB1bnRpbCB0aGUgcG9ydCBpcwordGhhd2VkLCB3aGljaCB1c3VhbGx5IGZvbGxvd3MgYSBzdWNjZXNzZnVsIHJlc2V0LgorCTwvcGFyYT4KKworCTxwYXJhPgorVGhlIG9wdGlvbmFsIC0+ZnJlZXplKCkgY2FsbGJhY2sgY2FuIGJlIHVzZWQgZm9yIGZyZWV6aW5nIHRoZSBwb3J0CitoYXJkd2FyZS13aXNlIChlLmcuIG1hc2sgaW50ZXJydXB0IGFuZCBzdG9wIERNQSBlbmdpbmUpLiAgSWYgYQorcG9ydCBjYW5ub3QgYmUgZnJvemVuIGhhcmR3YXJlLXdpc2UsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgorbXVzdCBhY2sgYW5kIGNsZWFyIGludGVycnVwdHMgdW5jb25kaXRpb25hbGx5IHdoaWxlIHRoZSBwb3J0CitpcyBmcm96ZW4uCisJPC9wYXJhPgorCTxwYXJhPgorVGhlIG9wdGlvbmFsIC0+dGhhdygpIGNhbGxiYWNrIGlzIGNhbGxlZCB0byBwZXJmb3JtIHRoZSBvcHBvc2l0ZSBvZiAtPmZyZWV6ZSgpOgorcHJlcGFyZSB0aGUgcG9ydCBmb3Igbm9ybWFsIG9wZXJhdGlvbiBvbmNlIGFnYWluLiAgVW5tYXNrIGludGVycnVwdHMsCitzdGFydCBETUEgZW5naW5lLCBldGMuCisJPC9wYXJhPgorCisJPHByb2dyYW1saXN0aW5nPgordm9pZCAoKmVycm9yX2hhbmRsZXIpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKKwk8L3Byb2dyYW1saXN0aW5nPgorCisJPHBhcmE+CistPmVycm9yX2hhbmRsZXIoKSBpcyBhIGRyaXZlcidzIGhvb2sgaW50byBwcm9iZSwgaG90cGx1ZywgYW5kIHJlY292ZXJ5CithbmQgb3RoZXIgZXhjZXB0aW9uYWwgY29uZGl0aW9ucy4gIFRoZSBwcmltYXJ5IHJlc3BvbnNpYmlsaXR5IG9mIGFuCitpbXBsZW1lbnRhdGlvbiBpcyB0byBjYWxsIGF0YV9kb19laCgpIG9yIGF0YV9ibWRtYV9kcml2ZV9laCgpIHdpdGggYSBzZXQKK29mIEVIIGhvb2tzIGFzIGFyZ3VtZW50czoKKwk8L3BhcmE+CisKKwk8cGFyYT4KKydwcmVyZXNldCcgaG9vayAobWF5IGJlIE5VTEwpIGlzIGNhbGxlZCBkdXJpbmcgYW4gRUggcmVzZXQsIGJlZm9yZSBhbnkgb3RoZXIgYWN0aW9ucworYXJlIHRha2VuLgorCTwvcGFyYT4KKworCTxwYXJhPgorJ3Bvc3RyZXNldCcgaG9vayAobWF5IGJlIE5VTEwpIGlzIGNhbGxlZCBhZnRlciB0aGUgRUggcmVzZXQgaXMgcGVyZm9ybWVkLiAgQmFzZWQgb24KK2V4aXN0aW5nIGNvbmRpdGlvbnMsIHNldmVyaXR5IG9mIHRoZSBwcm9ibGVtLCBhbmQgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLAorCTwvcGFyYT4KKworCTxwYXJhPgorRWl0aGVyICdzb2Z0cmVzZXQnIChtYXkgYmUgTlVMTCkgb3IgJ2hhcmRyZXNldCcgKG1heSBiZSBOVUxMKSB3aWxsIGJlCitjYWxsZWQgdG8gcGVyZm9ybSB0aGUgbG93LWxldmVsIEVIIHJlc2V0LgorCTwvcGFyYT4KKworCTxwcm9ncmFtbGlzdGluZz4KK3ZvaWQgKCpwb3N0X2ludGVybmFsX2NtZCkgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworCTwvcHJvZ3JhbWxpc3Rpbmc+CisKKwk8cGFyYT4KK1BlcmZvcm0gYW55IGhhcmR3YXJlLXNwZWNpZmljIGFjdGlvbnMgbmVjZXNzYXJ5IHRvIGZpbmlzaCBwcm9jZXNzaW5nCithZnRlciBleGVjdXRpbmcgYSBwcm9iZS10aW1lIG9yIEVILXRpbWUgY29tbWFuZCB2aWEgYXRhX2V4ZWNfaW50ZXJuYWwoKS4KIAk8L3BhcmE+CiAKIAk8L3NlY3QyPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKaW5kZXggNDllMjdjYy4uMWQ1MGNmMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CkBAIC0xNDQsOSArMTQ0LDQ3IEBACiAJd2hldGhlciB0aGUgaW5jcmVhc2VkIHNwZWVkIGlzIHdvcnRoIGl0LgogCiA4LglBbHRob3VnaCBzeW5jaHJvbml6ZV9yY3UoKSBpcyBhIGJpdCBzbG93ZXIgdGhhbiBpcyBjYWxsX3JjdSgpLAotCWl0IHVzdWFsbHkgcmVzdWx0cyBpbiBzaW1wbGVyIGNvZGUuICBTbywgdW5sZXNzIHVwZGF0ZSBwZXJmb3JtYW5jZQotCWlzIGltcG9ydGFudCBvciB0aGUgdXBkYXRlcnMgY2Fubm90IGJsb2NrLCBzeW5jaHJvbml6ZV9yY3UoKQotCXNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gY2FsbF9yY3UoKS4KKwlpdCB1c3VhbGx5IHJlc3VsdHMgaW4gc2ltcGxlciBjb2RlLiAgU28sIHVubGVzcyB1cGRhdGUKKwlwZXJmb3JtYW5jZSBpcyBjcml0aWNhbGx5IGltcG9ydGFudCBvciB0aGUgdXBkYXRlcnMgY2Fubm90IGJsb2NrLAorCXN5bmNocm9uaXplX3JjdSgpIHNob3VsZCBiZSB1c2VkIGluIHByZWZlcmVuY2UgdG8gY2FsbF9yY3UoKS4KKworCUFuIGVzcGVjaWFsbHkgaW1wb3J0YW50IHByb3BlcnR5IG9mIHRoZSBzeW5jaHJvbml6ZV9yY3UoKQorCXByaW1pdGl2ZSBpcyB0aGF0IGl0IGF1dG9tYXRpY2FsbHkgc2VsZi1saW1pdHM6IGlmIGdyYWNlIHBlcmlvZHMKKwlhcmUgZGVsYXllZCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGVuIHRoZSBzeW5jaHJvbml6ZV9yY3UoKQorCXByaW1pdGl2ZSB3aWxsIGNvcnJlc3BvbmRpbmdseSBkZWxheSB1cGRhdGVzLiAgSW4gY29udHJhc3QsCisJY29kZSB1c2luZyBjYWxsX3JjdSgpIHNob3VsZCBleHBsaWNpdGx5IGxpbWl0IHVwZGF0ZSByYXRlIGluCisJY2FzZXMgd2hlcmUgZ3JhY2UgcGVyaW9kcyBhcmUgZGVsYXllZCwgYXMgZmFpbGluZyB0byBkbyBzbyBjYW4KKwlyZXN1bHQgaW4gZXhjZXNzaXZlIHJlYWx0aW1lIGxhdGVuY2llcyBvciBldmVuIE9PTSBjb25kaXRpb25zLgorCisJV2F5cyBvZiBnYWluaW5nIHRoaXMgc2VsZi1saW1pdGluZyBwcm9wZXJ0eSB3aGVuIHVzaW5nIGNhbGxfcmN1KCkKKwlpbmNsdWRlOgorCisJYS4JS2VlcGluZyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZGF0YS1zdHJ1Y3R1cmUgZWxlbWVudHMKKwkJdXNlZCBieSB0aGUgUkNVLXByb3RlY3RlZCBkYXRhIHN0cnVjdHVyZSwgaW5jbHVkaW5nIHRob3NlCisJCXdhaXRpbmcgZm9yIGEgZ3JhY2UgcGVyaW9kIHRvIGVsYXBzZS4gIEVuZm9yY2UgYSBsaW1pdAorCQlvbiB0aGlzIG51bWJlciwgc3RhbGxpbmcgdXBkYXRlcyBhcyBuZWVkZWQgdG8gYWxsb3cKKwkJcHJldmlvdXNseSBkZWZlcnJlZCBmcmVlcyB0byBjb21wbGV0ZS4KKworCQlBbHRlcm5hdGl2ZWx5LCBsaW1pdCBvbmx5IHRoZSBudW1iZXIgYXdhaXRpbmcgZGVmZXJyZWQKKwkJZnJlZSByYXRoZXIgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLgorCisJYi4JTGltaXRpbmcgdXBkYXRlIHJhdGUuICBGb3IgZXhhbXBsZSwgaWYgdXBkYXRlcyBvY2N1ciBvbmx5CisJCW9uY2UgcGVyIGhvdXIsIHRoZW4gbm8gZXhwbGljaXQgcmF0ZSBsaW1pdGluZyBpcyByZXF1aXJlZCwKKwkJdW5sZXNzIHlvdXIgc3lzdGVtIGlzIGFscmVhZHkgYmFkbHkgYnJva2VuLiAgVGhlIGRjYWNoZQorCQlzdWJzeXN0ZW0gdGFrZXMgdGhpcyBhcHByb2FjaCAtLSB1cGRhdGVzIGFyZSBndWFyZGVkCisJCWJ5IGEgZ2xvYmFsIGxvY2ssIGxpbWl0aW5nIHRoZWlyIHJhdGUuCisKKwljLglUcnVzdGVkIHVwZGF0ZSAtLSBpZiB1cGRhdGVzIGNhbiBvbmx5IGJlIGRvbmUgbWFudWFsbHkgYnkKKwkJc3VwZXJ1c2VyIG9yIHNvbWUgb3RoZXIgdHJ1c3RlZCB1c2VyLCB0aGVuIGl0IG1pZ2h0IG5vdAorCQliZSBuZWNlc3NhcnkgdG8gYXV0b21hdGljYWxseSBsaW1pdCB0aGVtLiAgVGhlIHRoZW9yeQorCQloZXJlIGlzIHRoYXQgc3VwZXJ1c2VyIGFscmVhZHkgaGFzIGxvdHMgb2Ygd2F5cyB0byBjcmFzaAorCQl0aGUgbWFjaGluZS4KKworCWQuCVVzZSBjYWxsX3JjdV9iaCgpIHJhdGhlciB0aGFuIGNhbGxfcmN1KCksIGluIG9yZGVyIHRvIHRha2UKKwkJYWR2YW50YWdlIG9mIGNhbGxfcmN1X2JoKCkncyBmYXN0ZXIgZ3JhY2UgcGVyaW9kcy4KKworCWUuCVBlcmlvZGljYWxseSBpbnZva2Ugc3luY2hyb25pemVfcmN1KCksIHBlcm1pdHRpbmcgYSBsaW1pdGVkCisJCW51bWJlciBvZiB1cGRhdGVzIHBlciBncmFjZSBwZXJpb2QuCiAKIDkuCUFsbCBSQ1UgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlcywgd2hpY2ggaW5jbHVkZQogCWxpc3RfZm9yX2VhY2hfcmN1KCksIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KCksCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dAppbmRleCAwN2NiOTNiLi40ZjQxYTYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKQEAgLTE4NCw3ICsxODQsMTcgQEAKIAlibG9ja2luZywgaXQgcmVnaXN0ZXJzIGEgZnVuY3Rpb24gYW5kIGFyZ3VtZW50IHdoaWNoIGFyZSBpbnZva2VkCiAJYWZ0ZXIgYWxsIG9uZ29pbmcgUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBoYXZlIGNvbXBsZXRlZC4KIAlUaGlzIGNhbGxiYWNrIHZhcmlhbnQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBpbiBzaXR1YXRpb25zIHdoZXJlCi0JaXQgaXMgaWxsZWdhbCB0byBibG9jay4KKwlpdCBpcyBpbGxlZ2FsIHRvIGJsb2NrIG9yIHdoZXJlIHVwZGF0ZS1zaWRlIHBlcmZvcm1hbmNlIGlzCisJY3JpdGljYWxseSBpbXBvcnRhbnQuCisKKwlIb3dldmVyLCB0aGUgY2FsbF9yY3UoKSBBUEkgc2hvdWxkIG5vdCBiZSB1c2VkIGxpZ2h0bHksIGFzIHVzZQorCW9mIHRoZSBzeW5jaHJvbml6ZV9yY3UoKSBBUEkgZ2VuZXJhbGx5IHJlc3VsdHMgaW4gc2ltcGxlciBjb2RlLgorCUluIGFkZGl0aW9uLCB0aGUgc3luY2hyb25pemVfcmN1KCkgQVBJIGhhcyB0aGUgbmljZSBwcm9wZXJ0eQorCW9mIGF1dG9tYXRpY2FsbHkgbGltaXRpbmcgdXBkYXRlIHJhdGUgc2hvdWxkIGdyYWNlIHBlcmlvZHMKKwliZSBkZWxheWVkLiAgVGhpcyBwcm9wZXJ0eSByZXN1bHRzIGluIHN5c3RlbSByZXNpbGllbmNlIGluIGZhY2UKKwlvZiBkZW5pYWwtb2Ytc2VydmljZSBhdHRhY2tzLiAgQ29kZSB1c2luZyBjYWxsX3JjdSgpIHNob3VsZCBsaW1pdAorCXVwZGF0ZSByYXRlIGluIG9yZGVyIHRvIGdhaW4gdGhpcyBzYW1lIHNvcnQgb2YgcmVzaWxpZW5jZS4gIFNlZQorCWNoZWNrbGlzdC50eHQgZm9yIHNvbWUgYXBwcm9hY2hlcyB0byBsaW1pdGluZyB0aGUgdXBkYXRlIHJhdGUuCiAKIHJjdV9hc3NpZ25fcG9pbnRlcigpCiAKQEAgLTc5MCw3ICs4MDAsNiBAQAogCiBSQ1UgZ3JhY2UgcGVyaW9kOgogCi0Jc3luY2hyb25pemVfa2VybmVsIChkZXByZWNhdGVkKQogCXN5bmNocm9uaXplX25ldAogCXN5bmNocm9uaXplX3NjaGVkCiAJc3luY2hyb25pemVfcmN1CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdCBiL0RvY3VtZW50YXRpb24vU3VibWl0Q2hlY2tsaXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzAwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL1N1Ym1pdENoZWNrbGlzdApAQCAtMCwwICsxLDU3IEBACitMaW51eCBLZXJuZWwgcGF0Y2ggc3VtYml0dGFsIGNoZWNrbGlzdAorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSGVyZSBhcmUgc29tZSBiYXNpYyB0aGluZ3MgdGhhdCBkZXZlbG9wZXJzIHNob3VsZCBkbyBpZiB0aGV5Cit3YW50IHRvIHNlZSB0aGVpciBrZXJuZWwgcGF0Y2ggc3VibWl0dGFscyBhY2NlcHRlZCBxdWlja2VyLgorCitUaGVzZSBhcmUgYWxsIGFib3ZlIGFuZCBiZXlvbmQgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBpcyBwcm92aWRlZAoraW4gRG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlcyBhbmQgZWxzZXdoZXJlIGFib3V0IHN1Ym1pdHRpbmcKK0xpbnV4IGtlcm5lbCBwYXRjaGVzLgorCisKKworLSBCdWlsZHMgY2xlYW5seSB3aXRoIGFwcGxpY2FibGUgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgPXksID1tLCBhbmQgPW4uCisgIE5vIGdjYyB3YXJuaW5ncy9lcnJvcnMsIG5vIGxpbmtlciB3YXJuaW5ncy9lcnJvcnMuCisKKy0gUGFzc2VzIGFsbG5vY29uZmlnLCBhbGxtb2Rjb25maWcKKworLSBCdWlsZHMgb24gbXVsdGlwbGUgQ1BVIGFyY2gtZXMgYnkgdXNpbmcgbG9jYWwgY3Jvc3MtY29tcGlsZSB0b29scworICBvciBzb21ldGhpbmcgbGlrZSBQTE0gYXQgT1NETC4KKworLSBwcGM2NCBpcyBhIGdvb2QgYXJjaGl0ZWN0dXJlIGZvciBjcm9zcy1jb21waWxhdGlvbiBjaGVja2luZyBiZWNhdXNlIGl0CisgIHRlbmRzIHRvIHVzZSBgdW5zaWduZWQgbG9uZycgZm9yIDY0LWJpdCBxdWFudGl0aWVzLgorCistIE1hdGNoZXMga2VybmVsIGNvZGluZyBzdHlsZSghKQorCistIEFueSBuZXcgb3IgbW9kaWZpZWQgQ09ORklHIG9wdGlvbnMgZG9uJ3QgbXVjayB1cCB0aGUgY29uZmlnIG1lbnUuCisKKy0gQWxsIG5ldyBLY29uZmlnIG9wdGlvbnMgaGF2ZSBoZWxwIHRleHQuCisKKy0gSGFzIGJlZW4gY2FyZWZ1bGx5IHJldmlld2VkIHdpdGggcmVzcGVjdCB0byByZWxldmFudCBLY29uZmlnCisgIGNvbWJpbmF0aW9ucy4gIFRoaXMgaXMgdmVyeSBoYXJkIHRvIGdldCByaWdodCB3aXRoIHRlc3RpbmcgLS0KKyAgYnJhaW5wb3dlciBwYXlzIG9mZiBoZXJlLgorCistIENoZWNrIGNsZWFubHkgd2l0aCBzcGFyc2UuCisKKy0gVXNlICdtYWtlIGNoZWNrc3RhY2snIGFuZCAnbWFrZSBuYW1lc3BhY2VjaGVjaycgYW5kIGZpeCBhbnkKKyAgcHJvYmxlbXMgdGhhdCB0aGV5IGZpbmQuICBOb3RlOiAgY2hlY2tzdGFjayBkb2VzIG5vdCBwb2ludCBvdXQKKyAgcHJvYmxlbXMgZXhwbGljaXRseSwgYnV0IGFueSBvbmUgZnVuY3Rpb24gdGhhdCB1c2VzIG1vcmUgdGhhbgorICA1MTIgYnl0ZXMgb24gdGhlIHN0YWNrIGlzIGEgY2FuZGlkYXRlIGZvciBjaGFuZ2UuCisKKy0gSW5jbHVkZSBrZXJuZWwtZG9jIHRvIGRvY3VtZW50IGdsb2JhbCBrZXJuZWwgQVBJcy4gIChOb3QgcmVxdWlyZWQKKyAgZm9yIHN0YXRpYyBmdW5jdGlvbnMsIGJ1dCBPSyB0aGVyZSBhbHNvLikgIFVzZSAnbWFrZSBodG1sZG9jcycKKyAgb3IgJ21ha2UgbWFuZG9jcycgdG8gY2hlY2sgdGhlIGtlcm5lbC1kb2MgYW5kIGZpeCBhbnkgaXNzdWVzLgorCistIEhhcyBiZWVuIHRlc3RlZCB3aXRoIENPTkZJR19QUkVFTVBULCBDT05GSUdfREVCVUdfUFJFRU1QVCwKKyAgQ09ORklHX0RFQlVHX1NMQUIsIENPTkZJR19ERUJVR19QQUdFQUxMT0MsIENPTkZJR19ERUJVR19NVVRFWEVTLAorICBDT05GSUdfREVCVUdfU1BJTkxPQ0ssIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBhbGwgc2ltdWx0YW5lb3VzbHkKKyAgZW5hYmxlZC4KKworLSBIYXMgYmVlbiBidWlsZC0gYW5kIHJ1bnRpbWUgdGVzdGVkIHdpdGggYW5kIHdpdGhvdXQgQ09ORklHX1NNUCBhbmQKKyAgQ09ORklHX1BSRUVNUFQuCisKKy0gSWYgdGhlIHBhdGNoIGFmZmVjdHMgSU8vRGlzaywgZXRjOiBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBhbmQgd2l0aG91dAorICBDT05GSUdfTEJELgorCisKKzIwMDYtQVBSLTI3CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dAppbmRleCBiMzY5YThjLi40YWFmNjhmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlcy50eHQKQEAgLTMsNyArMyw3IEBACiAKIAkgICAgIE1haW50YWluZWQgYnkgVG9yYmVuIE1hdGhpYXNlbiA8ZGV2aWNlQGxhbmFuYS5vcmc+CiAKLQkJICAgICAgTGFzdCByZXZpc2VkOiAyNSBKYW51YXJ5IDIwMDUKKwkJICAgICAgTGFzdCByZXZpc2VkOiAxNSBNYXkgMjAwNgogCiBUaGlzIGxpc3QgaXMgdGhlIExpbnV4IERldmljZSBMaXN0LCB0aGUgb2ZmaWNpYWwgcmVnaXN0cnkgb2YgYWxsb2NhdGVkCiBkZXZpY2UgbnVtYmVycyBhbmQgL2RldiBkaXJlY3Rvcnkgbm9kZXMgZm9yIHRoZSBMaW51eCBvcGVyYXRpbmcKQEAgLTk0LDcgKzk0LDYgQEAKIAkJICA5ID0gL2Rldi91cmFuZG9tCUZhc3RlciwgbGVzcyBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW4uCiAJCSAxMCA9IC9kZXYvYWlvCQlBc3luY3Jvbm91cyBJL08gbm90aWZpY2F0aW9uIGludGVyZmFjZQogCQkgMTEgPSAvZGV2L2ttc2cJCVdyaXRlcyB0byB0aGlzIGNvbWUgb3V0IGFzIHByaW50aydzCi0JCSAxMiA9IC9kZXYvb2xkbWVtCUFjY2VzcyB0byBjcmFzaCBkdW1wIGZyb20ga2V4ZWMga2VybmVsCiAgIDEgYmxvY2sJUkFNIGRpc2sKIAkJICAwID0gL2Rldi9yYW0wCQlGaXJzdCBSQU0gZGlzawogCQkgIDEgPSAvZGV2L3JhbTEJCVNlY29uZCBSQU0gZGlzawpAQCAtMjYyLDEzICsyNjEsMTMgQEAKIAkJTk9URTogVGhlc2UgZGV2aWNlcyBwZXJtaXQgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MuCiAKICAgNyBibG9jawlMb29wYmFjayBkZXZpY2VzCi0JCSAgMCA9IC9kZXYvbG9vcDAJRmlyc3QgbG9vcGJhY2sgZGV2aWNlCi0JCSAgMSA9IC9kZXYvbG9vcDEJU2Vjb25kIGxvb3BiYWNrIGRldmljZQorCQkgIDAgPSAvZGV2L2xvb3AwCUZpcnN0IGxvb3AgZGV2aWNlCisJCSAgMSA9IC9kZXYvbG9vcDEJU2Vjb25kIGxvb3AgZGV2aWNlCiAJCSAgICAuLi4KIAotCQlUaGUgbG9vcGJhY2sgZGV2aWNlcyBhcmUgdXNlZCB0byBtb3VudCBmaWxlc3lzdGVtcyBub3QKKwkJVGhlIGxvb3AgZGV2aWNlcyBhcmUgdXNlZCB0byBtb3VudCBmaWxlc3lzdGVtcyBub3QKIAkJYXNzb2NpYXRlZCB3aXRoIGJsb2NrIGRldmljZXMuCVRoZSBiaW5kaW5nIHRvIHRoZQotCQlsb29wYmFjayBkZXZpY2VzIGlzIGhhbmRsZWQgYnkgbW91bnQoOCkgb3IgbG9zZXR1cCg4KS4KKwkJbG9vcCBkZXZpY2VzIGlzIGhhbmRsZWQgYnkgbW91bnQoOCkgb3IgbG9zZXR1cCg4KS4KIAogICA4IGJsb2NrCVNDU0kgZGlzayBkZXZpY2VzICgwLTE1KQogCQkgIDAgPSAvZGV2L3NkYQkJRmlyc3QgU0NTSSBkaXNrIHdob2xlIGRpc2sKQEAgLTk0Myw3ICs5NDIsNyBAQAogCQkyNDAgPSAvZGV2L2Z0bHAJCUZUTCBvbiAxNnRoIE1lbW9yeSBUZWNobm9sb2d5IERldmljZSAKIAogCQlQYXJ0aXRpb25zIGFyZSBoYW5kbGVkIGluIHRoZSBzYW1lIHdheSBhcyBmb3IgSURFCi0JCWRpc2tzIChzZWUgbWFqb3IgbnVtYmVyIDMpIGV4cGVjdCB0aGF0IHRoZSBwYXJ0aXRpb24KKwkJZGlza3MgKHNlZSBtYWpvciBudW1iZXIgMykgZXhjZXB0IHRoYXQgdGhlIHBhcnRpdGlvbgogCQlsaW1pdCBpcyAxNSByYXRoZXIgdGhhbiA2MyBwZXIgZGlzayAoc2FtZSBhcyBTQ1NJLikKIAogIDQ1IGNoYXIJaXNkbjRsaW51eCBJU0ROIEJSSSBkcml2ZXIKQEAgLTExNjgsNyArMTE2Nyw3IEBACiAJCVRoZSBmaWxlbmFtZSBvZiB0aGUgZW5jcnlwdGVkIGNvbnRhaW5lciBhbmQgdGhlIHBhc3N3b3JkcwogCQlhcmUgc2VudCB2aWEgaW9jdGxzICh1c2luZyB0aGUgc2Rtb3VudCB0b29sKSB0byB0aGUgbWFzdGVyCiAJCW5vZGUgd2hpY2ggdGhlbiBhY3RpdmF0ZXMgdGhlbSB2aWEgb25lIG9mIHRoZQotCQkvZGV2L3NjcmFtZGlzay94IG5vZGVzIGZvciBsb29wYmFjayBtb3VudGluZyAoYWxsIGhhbmRsZWQKKwkJL2Rldi9zY3JhbWRpc2sveCBub2RlcyBmb3IgbG9vcCBtb3VudGluZyAoYWxsIGhhbmRsZWQKIAkJdGhyb3VnaCB0aGUgc2Rtb3VudCB0b29sKS4KIAogCQlSZXF1ZXN0ZWQgYnk6IGFuZHlAc2NyYW1kaXNrbGludXgub3JnCkBAIC0yNTM4LDE4ICsyNTM3LDMyIEBACiAJCSAgMCA9IC9kZXYvdXNiL2xwMAlGaXJzdCBVU0IgcHJpbnRlcgogCQkgICAgLi4uCiAJCSAxNSA9IC9kZXYvdXNiL2xwMTUJMTZ0aCBVU0IgcHJpbnRlcgotCQkgMTYgPSAvZGV2L3VzYi9tb3VzZTAJRmlyc3QgVVNCIG1vdXNlCi0JCSAgICAuLi4KLQkJIDMxID0gL2Rldi91c2IvbW91c2UxNQkxNnRoIFVTQiBtb3VzZQotCQkgMzIgPSAvZGV2L3VzYi9lejAJRmlyc3QgVVNCIGZpcm13YXJlIGxvYWRlcgotCQkgICAgLi4uCi0JCSA0NyA9IC9kZXYvdXNiL2V6MTUJMTZ0aCBVU0IgZmlybXdhcmUgbG9hZGVyCiAJCSA0OCA9IC9kZXYvdXNiL3NjYW5uZXIwCUZpcnN0IFVTQiBzY2FubmVyCiAJCSAgICAuLi4KIAkJIDYzID0gL2Rldi91c2Ivc2Nhbm5lcjE1IDE2dGggVVNCIHNjYW5uZXIKIAkJIDY0ID0gL2Rldi91c2IvcmlvNTAwCURpYW1vbmQgUmlvIDUwMAogCQkgNjUgPSAvZGV2L3VzYi91c2JsY2QJVVNCTENEIEludGVyZmFjZSAoaW5mb0B1c2JsY2QuZGUpCiAJCSA2NiA9IC9kZXYvdXNiL2NwYWQwCVN5bmFwdGljcyBjUGFkIChtb3VzZS9MQ0QpCisJCSA5NiA9IC9kZXYvdXNiL2hpZGRldjAJMXN0IFVTQiBISUQgZGV2aWNlCisJCSAgICAuLi4KKwkJMTExID0gL2Rldi91c2IvaGlkZGV2MTUJMTZ0aCBVU0IgSElEIGRldmljZQorCQkxMTIgPSAvZGV2L3VzYi9hdWVyMAkxc3QgYXVlcnN3YWxkIElTRE4gZGV2aWNlCisJCSAgICAuLi4KKwkJMTI3ID0gL2Rldi91c2IvYXVlcjE1CTE2dGggYXVlcnN3YWxkIElTRE4gZGV2aWNlCisJCTEyOCA9IC9kZXYvdXNiL2JybHZncjAJRmlyc3QgQnJhaWxsZSBWb3lhZ2VyIGRldmljZQorCQkgICAgLi4uCisJCTEzMSA9IC9kZXYvdXNiL2JybHZncjMJRm91cnRoIEJyYWlsbGUgVm95YWdlciBkZXZpY2UKKwkJMTMyID0gL2Rldi91c2IvaWRtb3VzZQlJRCBNb3VzZSAoZmluZ2VycHJpbnQgc2Nhbm5lcikgZGV2aWNlCisJCTEzMyA9IC9kZXYvdXNiL3Npc3VzYnZnYTEJRmlyc3QgU2lTVVNCIFZHQSBkZXZpY2UKKwkJICAgIC4uLgorCQkxNDAgPSAvZGV2L3VzYi9zaXN1c2J2Z2E4CUVpZ3RoIFNJU1VTQiBWR0EgZGV2aWNlCisJCTE0NCA9IC9kZXYvdXNiL2xjZAlVU0IgTENEIGRldmljZQorCQkxNjAgPSAvZGV2L3VzYi9sZWdvdXNidG93ZXIwCTFzdCBVU0IgTGVnb3Rvd2VyIGRldmljZQorCQkgICAgLi4uCisJCTE3NSA9IC9kZXYvdXNiL2xlZ291c2J0b3dlcjE1CTE2dGggVVNCIExlZ290b3dlciBkZXZpY2UKKwkJMjQwID0gL2Rldi91c2IvZGFidXNiMAlGaXJzdCBkYXVidXNiIGRldmljZQorCQkgICAgLi4uCisJCTI0MyA9IC9kZXYvdXNiL2RhYnVzYjMJRm91cnRoIGRhYnVzYiBkZXZpY2UKIAogMTgwIGJsb2NrCVVTQiBibG9jayBkZXZpY2VzCiAJCTAgPSAvZGV2L3ViYQkJRmlyc3QgVVNCIGJsb2NrIGRldmljZQpAQCAtMjcxMCw2ICsyNzIzLDE3IEBACiAJCSAgMSA9IC9kZXYvY3B1LzEvbXNyCQlNU1JzIG9uIENQVSAxCiAJCSAgICAuLi4KIAorMjAyIGJsb2NrCVhlbiBWaXJ0dWFsIEJsb2NrIERldmljZQorCQkgIDAgPSAvZGV2L3h2ZGEgICAgICAgRmlyc3QgWGVuIFZCRCB3aG9sZSBkaXNrCisJCSAgMTYgPSAvZGV2L3h2ZGIgICAgICBTZWNvbmQgWGVuIFZCRCB3aG9sZSBkaXNrCisJCSAgMzIgPSAvZGV2L3h2ZGMgICAgICBUaGlyZCBYZW4gVkJEIHdob2xlIGRpc2sKKwkJICAgIC4uLgorCQkgIDI0MCA9IC9kZXYveHZkcCAgICAgU2l4dGVlbnRoIFhlbiBWQkQgd2hvbGUgZGlzaworCisgICAgICAgICAgICAgICAgUGFydGl0aW9ucyBhcmUgaGFuZGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgZm9yIElERQorICAgICAgICAgICAgICAgIGRpc2tzIChzZWUgbWFqb3IgbnVtYmVyIDMpIGV4Y2VwdCB0aGF0IHRoZSBsaW1pdCBvbgorICAgICAgICAgICAgICAgIHBhcnRpdGlvbnMgaXMgMTUuCisKIDIwMyBjaGFyCUNQVSBDUFVJRCBpbmZvcm1hdGlvbgogCQkgIDAgPSAvZGV2L2NwdS8wL2NwdWlkCQlDUFVJRCBvbiBDUFUgMAogCQkgIDEgPSAvZGV2L2NwdS8xL2NwdWlkCQlDUFVJRCBvbiBDUFUgMQpAQCAtMjc0NywxMSArMjc3MSwyNyBAQAogCQkgNDYgPSAvZGV2L3R0eUNQTTAJCVBQQyBDUE0gKFNDQyBvciBTTUMpIC0gcG9ydCAwCiAJCSAgICAuLi4KIAkJIDQ3ID0gL2Rldi90dHlDUE01CQlQUEMgQ1BNIChTQ0Mgb3IgU01DKSAtIHBvcnQgNQotCQkgNTAgPSAvZGV2L3R0eUlPQzQwCQlBbHRpeCBzZXJpYWwgY2FyZAorCQkgNTAgPSAvZGV2L3R0eUlPQzAJCUFsdGl4IHNlcmlhbCBjYXJkCiAJCSAgICAuLi4KLQkJIDgxID0gL2Rldi90dHlJT0M0MzEJCUFsdGl4IHNlcmlhbCBjYXJkCi0JCSA4MiA9IC9kZXYvdHR5VlIwICAgICAgICAgICAgICAgTkVDIFZSNDEwMCBzZXJpZXMgU0lVCi0JCSA4MyA9IC9kZXYvdHR5VlIxICAgICAgICAgICAgICAgTkVDIFZSNDEwMCBzZXJpZXMgRFNJVQorCQkgODEgPSAvZGV2L3R0eUlPQzMxCQlBbHRpeCBzZXJpYWwgY2FyZAorCQkgODIgPSAvZGV2L3R0eVZSMAkJTkVDIFZSNDEwMCBzZXJpZXMgU0lVCisJCSA4MyA9IC9kZXYvdHR5VlIxCQlORUMgVlI0MTAwIHNlcmllcyBEU0lVCisJCSA4NCA9IC9kZXYvdHR5SU9DODQJCUFsdGl4IGlvYzQgc2VyaWFsIGNhcmQKKwkJICAgIC4uLgorCQkgMTE1ID0gL2Rldi90dHlJT0MxMTUJCUFsdGl4IGlvYzQgc2VyaWFsIGNhcmQKKwkJIDExNiA9IC9kZXYvdHR5U0lPQzAJCUFsdGl4IGlvYzMgc2VyaWFsIGNhcmQKKwkJICAgIC4uLgorCQkgMTQ3ID0gL2Rldi90dHlTSU9DMzEJCUFsdGl4IGlvYzMgc2VyaWFsIGNhcmQKKwkJIDE0OCA9IC9kZXYvdHR5UFNDMAkJUFBDIFBTQyAtIHBvcnQgMAorCQkgICAgLi4uCisJCSAxNTMgPSAvZGV2L3R0eVBTQzUJCVBQQyBQU0MgLSBwb3J0IDUKKwkJIDE1NCA9IC9kZXYvdHR5QVQwCQlBVE1FTCBzZXJpYWwgcG9ydCAwCisJCSAgICAuLi4KKwkJIDE2OSA9IC9kZXYvdHR5QVQxNQkJQVRNRUwgc2VyaWFsIHBvcnQgMTUKKwkJIDE3MCA9IC9kZXYvdHR5TlgwCQlIaWxzY2hlciBuZXRYIHNlcmlhbCBwb3J0IDAKKwkJICAgIC4uLgorCQkgMTg1ID0gL2Rldi90dHlOWDE1CQlIaWxzY2hlciBuZXRYIHNlcmlhbCBwb3J0IDE1CisJCSAxODYgPSAvZGV2L3R0eUowCQlKVEFHMSBEQ0MgcHJvdG9jb2wgYmFzZWQgc2VyaWFsIHBvcnQgZW11bGF0aW9uCiAKIDIwNSBjaGFyCUxvdy1kZW5zaXR5IHNlcmlhbCBwb3J0cyAoYWx0ZXJuYXRlIGRldmljZSkKIAkJICAwID0gL2Rldi9jdWx1MAkJQ2FsbG91dCBkZXZpY2UgZm9yIHR0eUxVMApAQCAtMjc4Niw4ICsyODI2LDggQEAKIAkJIDUwID0gL2Rldi9jdWlvYzQwCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5SU9DNDAKIAkJICAgIC4uLgogCQkgODEgPSAvZGV2L2N1aW9jNDMxCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5SU9DNDMxCi0JCSA4MiA9IC9kZXYvY3V2cjAgICAgICAgICAgICAgICAgQ2FsbG91dCBkZXZpY2UgZm9yIHR0eVZSMAotCQkgODMgPSAvZGV2L2N1dnIxICAgICAgICAgICAgICAgIENhbGxvdXQgZGV2aWNlIGZvciB0dHlWUjEKKwkJIDgyID0gL2Rldi9jdXZyMAkJQ2FsbG91dCBkZXZpY2UgZm9yIHR0eVZSMAorCQkgODMgPSAvZGV2L2N1dnIxCQlDYWxsb3V0IGRldmljZSBmb3IgdHR5VlIxCiAKIAogMjA2IGNoYXIJT25TdHJlYW0gU0MteDAgdGFwZSBkZXZpY2VzCkBAIC0yODk3LDcgKzI5MzcsNiBAQAogCQkgICAgLi4uCiAJCTE5NiA9IC9kZXYvZHZiL2FkYXB0ZXIzL3ZpZGVvMCAgICBmaXJzdCB2aWRlbyBkZWNvZGVyIG9mIGZvdXJ0aCBjYXJkCiAKLQogMjE2IGNoYXIJQmx1ZXRvb3RoIFJGQ09NTSBUVFkgZGV2aWNlcwogCQkgIDAgPSAvZGV2L3JmY29tbTAJCUZpcnN0IEJsdWV0b290aCBSRkNPTU0gVFRZIGRldmljZQogCQkgIDEgPSAvZGV2L3JmY29tbTEJCVNlY29uZCBCbHVldG9vdGggUkZDT01NIFRUWSBkZXZpY2UKQEAgLTMwMDIsMTIgKzMwNDEsNDMgQEAKIAkJaW9jdGwoKSdzIGNhbiBiZSB1c2VkIHRvIHJld2luZCB0aGUgdGFwZSByZWdhcmRsZXNzIG9mCiAJCXRoZSBkZXZpY2UgdXNlZCB0byBhY2Nlc3MgaXQuCiAKLTIzMSBjaGFyCUluZmluaUJhbmQgTUFECisyMzEgY2hhcglJbmZpbmlCYW5kCiAJCTAgPSAvZGV2L2luZmluaWJhbmQvdW1hZDAKIAkJMSA9IC9kZXYvaW5maW5pYmFuZC91bWFkMQotCQkgLi4uCisJCSAgLi4uCisJCTYzID0gL2Rldi9pbmZpbmliYW5kL3VtYWQ2MyAgICA2M3JkIEluZmluaUJhbmRNYWQgZGV2aWNlCisJCTY0ID0gL2Rldi9pbmZpbmliYW5kL2lzc20wICAgICBGaXJzdCBJbmZpbmlCYW5kIElzU00gZGV2aWNlCisJCTY1ID0gL2Rldi9pbmZpbmliYW5kL2lzc20xICAgICBTZWNvbmQgSW5maW5pQmFuZCBJc1NNIGRldmljZQorCQkgIC4uLgorCQkxMjcgPSAvZGV2L2luZmluaWJhbmQvaXNzbTYzICAgIDYzcmQgSW5maW5pQmFuZCBJc1NNIGRldmljZQorCQkxMjggPSAvZGV2L2luZmluaWJhbmQvdXZlcmJzMCAgIEZpcnN0IEluZmluaUJhbmQgdmVyYnMgZGV2aWNlCisJCTEyOSA9IC9kZXYvaW5maW5pYmFuZC91dmVyYnMxICAgU2Vjb25kIEluZmluaUJhbmQgdmVyYnMgZGV2aWNlCisJCSAgLi4uCisJCTE1OSA9IC9kZXYvaW5maW5pYmFuZC91dmVyYnMzMSAgMzFzdCBJbmZpbmlCYW5kIHZlcmJzIGRldmljZQogCi0yMzItMjM5CQlVTkFTU0lHTkVECisyMzIgY2hhcglCaW9tZXRyaWMgRGV2aWNlcworCQkwID0gL2Rldi9iaW9tZXRyaWMvc2Vuc29yMC9maW5nZXJwcmludAlmaXJzdCBmaW5nZXJwcmludCBzZW5zb3Igb24gZmlyc3QgZGV2aWNlCisJCTEgPSAvZGV2L2Jpb21ldHJpYy9zZW5zb3IwL2lyaXMJCWZpcnN0IGlyaXMgc2Vuc29yIG9uIGZpcnN0IGRldmljZQorCQkyID0gL2Rldi9iaW9tZXRyaWMvc2Vuc29yMC9yZXRpbmEJZmlyc3QgcmV0aW5hIHNlbnNvciBvbiBmaXJzdCBkZXZpY2UKKwkJMyA9IC9kZXYvYmlvbWV0cmljL3NlbnNvcjAvdm9pY2VwcmludAlmaXJzdCB2b2ljZXByaW50IHNlbnNvciBvbiBmaXJzdCBkZXZpY2UKKwkJNCA9IC9kZXYvYmlvbWV0cmljL3NlbnNvcjAvZmFjaWFsCWZpcnN0IGZhY2lhbCBzZW5zb3Igb24gZmlyc3QgZGV2aWNlCisJCTUgPSAvZGV2L2Jpb21ldHJpYy9zZW5zb3IwL2hhbmQJCWZpcnN0IGhhbmQgc2Vuc29yIG9uIGZpcnN0IGRldmljZQorCQkgIC4uLgorCQkxMCA9IC9kZXYvYmlvbWV0cmljL3NlbnNvcjEvZmluZ2VycHJpbnQJZmlyc3QgZmluZ2VycHJpbnQgc2Vuc29yIG9uIHNlY29uZCBkZXZpY2UKKwkJICAuLi4KKwkJMjAgPSAvZGV2L2Jpb21ldHJpYy9zZW5zb3IyL2ZpbmdlcnByaW50CWZpcnN0IGZpbmdlcnByaW50IHNlbnNvciBvbiB0aGlyZCBkZXZpY2UKKwkJICAuLi4KKworMjMzIGNoYXIJUGF0aFNjYWxlIEluZmluaVBhdGggaW50ZXJjb25uZWN0CisJCTAgPSAvZGV2L2lwYXRoICAgICAgICBQcmltYXJ5IGRldmljZSBmb3IgcHJvZ3JhbXMgKGFueSB1bml0KQorCQkxID0gL2Rldi9pcGF0aDAgICAgICAgQWNjZXNzIHNwZWNpZmljYWxseSB0byB1bml0IDAKKwkJMiA9IC9kZXYvaXBhdGgxICAgICAgIEFjY2VzcyBzcGVjaWZpY2FsbHkgdG8gdW5pdCAxCisJCSAgLi4uCisJCTQgPSAvZGV2L2lwYXRoMyAgICAgICBBY2Nlc3Mgc3BlY2lmaWNhbGx5IHRvIHVuaXQgMworCQkxMjkgPSAvZGV2L2lwYXRoX3NtYSAgICBEZXZpY2UgdXNlZCBieSBTdWJuZXQgTWFuYWdlbWVudCBBZ2VudAorCQkxMzAgPSAvZGV2L2lwYXRoX2RpYWcgICBEZXZpY2UgdXNlZCBieSBkaWFnbm9zdGljcyBwcm9ncmFtcworCisyMzQtMjM5CQlVTkFTU0lHTkVECiAKIDI0MC0yNTQgY2hhcglMT0NBTC9FWFBFUklNRU5UQUwgVVNFCiAyNDAtMjU0IGJsb2NrCUxPQ0FML0VYUEVSSU1FTlRBTCBVU0UKQEAgLTMwMjEsNiArMzA5MSwyOCBAQAogCQlUaGlzIG1ham9yIGlzIHJlc2VydmVkIHRvIGFzc2lzdCB0aGUgZXhwYW5zaW9uIHRvIGEKIAkJbGFyZ2VyIG51bWJlciBzcGFjZS4gIE5vIGRldmljZSBub2RlcyB3aXRoIHRoaXMgbWFqb3IKIAkJc2hvdWxkIGV2ZXIgYmUgY3JlYXRlZCBvbiB0aGUgZmlsZXN5c3RlbS4KKwkJKFRoaXMgaXMgcHJvYmFseSBub3QgdHJ1ZSBhbnltb3JlLCBidXQgSSdsbCBsZWF2ZSBpdAorCQlmb3Igbm93IC9Ub3JiZW4pCisKKy0tLUxBUkdFIE1BSk9SUyEhISEhLS0tCisKKzI1NiBjaGFyCUVxdWlub3ggU1NUIG11bHRpLXBvcnQgc2VyaWFsIGJvYXJkcworCQkgICAwID0gL2Rldi90dHlFUTAJRmlyc3Qgc2VyaWFsIHBvcnQgb24gZmlyc3QgRXF1aW5veCBTU1QgYm9hcmQKKwkJIDEyNyA9IC9kZXYvdHR5RVExMjcJTGFzdCBzZXJpYWwgcG9ydCBvbiBmaXJzdCBFcXVpbm94IFNTVCBib2FyZAorCQkgMTI4ID0gL2Rldi90dHlFUTEyOAlGaXJzdCBzZXJpYWwgcG9ydCBvbiBzZWNvbmQgRXF1aW5veCBTU1QgYm9hcmQKKwkJICAuLi4KKwkJMTAyNyA9IC9kZXYvdHR5RVExMDI3CUxhc3Qgc2VyaWFsIHBvcnQgb24gZWlnaHRoIEVxdWlub3ggU1NUIGJvYXJkCisKKzI1NiBibG9jawlSZXNpZGVudCBGbGFzaCBEaXNrIEZsYXNoIFRyYW5zbGF0aW9uIExheWVyCisJCSAgMCA9IC9kZXYvcmZkYQkJRmlyc3QgUkZEIEZUTCBsYXllcgorCQkgMTYgPSAvZGV2L3JmZGIJCVNlY29uZCBSRkQgRlRMIGxheWVyCisJCSAgLi4uCisJCTI0MCA9IC9kZXYvcmZkcAkJMTZ0aCBSRkQgRlRMIGxheWVyCisKKzI1NyBjaGFyCVBob2VuaXggVGVjaG5vbG9naWVzIENyeXB0b2dyYXBoaWMgU2VydmljZXMgRHJpdmVyCisJCSAgMCA9IC9kZXYvcHRsc2VjCUNyeXB0byBTZXJ2aWNlcyBEcml2ZXIKKworCiAKICAqKioqCUFERElUSU9OQUwgL2RldiBESVJFQ1RPUlkgRU5UUklFUwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZjcyOTMyOS4uMDI3Mjg1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMzMsMjEgKzMzLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLVdoYXQ6CVJDVSBBUEkgbW92ZXMgdG8gRVhQT1JUX1NZTUJPTF9HUEwKLVdoZW46CUFwcmlsIDIwMDYKLUZpbGVzOglpbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgsIGtlcm5lbC9yY3VwZGF0ZS5jCi1XaHk6CU91dHNpZGUgb2YgTGludXgsIHRoZSBvbmx5IGltcGxlbWVudGF0aW9ucyBvZiBhbnl0aGluZyBldmVuCi0JdmFndWVseSByZXNlbWJsaW5nIFJDVSB0aGF0IEkgYW0gYXdhcmUgb2YgYXJlIGluIERZTklYL3B0eCwKLQlWTS9YQSwgVG9ybmFkbywgYW5kIEs0Mi4gIEkgZG8gbm90IGV4cGVjdCBhbnlvbmUgdG8gcG9ydCBiaW5hcnkKLQlkcml2ZXJzIG9yIGtlcm5lbCBtb2R1bGVzIGZyb20gYW55IG9mIHRoZXNlLCBzaW5jZSB0aGUgZmlyc3QgdHdvCi0JYXJlIG93bmVkIGJ5IElCTSBhbmQgdGhlIGxhc3QgdHdvIGFyZSBvcGVuLXNvdXJjZSByZXNlYXJjaCBPU2VzLgotCVNvIHRoZXNlIHdpbGwgbW92ZSB0byBHUEwgYWZ0ZXIgYSBncmFjZSBwZXJpb2QgdG8gYWxsb3cKLQlwZW9wbGUsIHdobyBtaWdodCBiZSB1c2luZyBpbXBsZW1lbnRhdGlvbnMgdGhhdCBJIGFtIG5vdCBhd2FyZQotCW9mLCB0byBhZGp1c3QgdG8gdGhpcyB1cGNvbWluZyBjaGFuZ2UuCi1XaG86CVBhdWwgRS4gTWNLZW5uZXkgPHBhdWxtY2tAdXMuaWJtLmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CXJhdzEzOTQ6IHJlcXVlc3RzIG9mIHR5cGUgUkFXMTM5NF9SRVFfSVNPX1NFTkQsIFJBVzEzOTRfUkVRX0lTT19MSVNURU4KIFdoZW46CU5vdmVtYmVyIDIwMDYKIFdoeToJRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIG5ldyBpb2N0bC1iYXNlZCByYXdpc28gaW50ZXJmYWNlLCB3aGljaCBpcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCmluZGV4IDEwNDVkYTUuLmQzMWVmYmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZworKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKQEAgLTk5LDcgKzk5LDcgQEAKIAlpbnQgKCpzeW5jX2ZzKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgd2FpdCk7CiAJdm9pZCAoKndyaXRlX3N1cGVyX2xvY2tmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIAl2b2lkICgqdW5sb2NrZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0JaW50ICgqc3RhdGZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworCWludCAoKnN0YXRmcykgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiAJaW50ICgqcmVtb3VudF9mcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKIAl2b2lkICgqY2xlYXJfaW5vZGUpIChzdHJ1Y3QgaW5vZGUgKik7CiAJdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKQEAgLTE0MiwxNSArMTQyLDE2IEBACiAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaWxlX3N5c3RlbV90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogcHJvdG90eXBlczoKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqZ2V0X3NiKSAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LAotCQkJY29uc3QgY2hhciAqLCB2b2lkICopOworCXN0cnVjdCBpbnQgKCpnZXRfc2IpIChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqLCBpbnQsCisJCQljb25zdCBjaGFyICosIHZvaWQgKiwgc3RydWN0IHZmc21vdW50ICopOwogCXZvaWQgKCpraWxsX3NiKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogbG9ja2luZyBydWxlczoKIAkJbWF5IGJsb2NrCUJLTAogZ2V0X3NiCQl5ZXMJCXllcwoga2lsbF9zYgkJeWVzCQl5ZXMKIAotLT5nZXRfc2IoKSByZXR1cm5zIGVycm9yIG9yIGEgbG9ja2VkIHN1cGVyYmxvY2sgKGV4Y2x1c2l2ZSBvbiAtPnNfdW1vdW50KS4KKy0+Z2V0X3NiKCkgcmV0dXJucyBlcnJvciBvciAwIHdpdGggbG9ja2VkIHN1cGVyYmxvY2sgYXR0YWNoZWQgdG8gdGhlIHZmc21vdW50CisoZXhjbHVzaXZlIG9uIC0+c191bW91bnQpLgogLT5raWxsX3NiKCkgdGFrZXMgYSB3cml0ZS1sb2NrZWQgc3VwZXJibG9jaywgZG9lcyBhbGwgc2h1dGRvd24gd29yayBvbiBpdCwKIHVubG9ja3MgYW5kIGRyb3BzIHRoZSByZWZlcmVuY2UuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYXV0b21vdW50LXN1cHBvcnQudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hdXRvbW91bnQtc3VwcG9ydC50eHQKaW5kZXggNThjNjVhMS4uN2NhYzIwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hdXRvbW91bnQtc3VwcG9ydC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hdXRvbW91bnQtc3VwcG9ydC50eHQKQEAgLTE5LDcgKzE5LDcgQEAKIAogICgyKSBIYXZlIHRoZSBmb2xsb3dfbGluaygpIG9wIGRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAKLSAgICAgKGEpIENhbGwgZG9fa2Vybl9tb3VudCgpIHRvIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGZpbGVzeXN0ZW0gdG8gc2V0IHVwIGEKKyAgICAgKGEpIENhbGwgdmZzX2tlcm5fbW91bnQoKSB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSBmaWxlc3lzdGVtIHRvIHNldCB1cCBhCiAgICAgICAgICBzdXBlcmJsb2NrIGFuZCBnYWluIGEgdmZzbW91bnQgc3RydWN0dXJlIHJlcHJlc2VudGluZyBpdC4KIAogICAgICAoYikgQ29weSB0aGUgbmFtZWlkYXRhIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50IGFuZCBzdWJzdGl0dXRlIHRoZSBkZW50cnkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Z1c2UudHh0CmluZGV4IDMzZjc0MzEuLmE1ODRmMDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZnVzZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mdXNlLnR4dApAQCAtMTgsNiArMTgsMTQgQEAKICAgdXNlci4gIE5PVEU6IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIG1vdW50cyBhbGxvd2VkIHdpdGggdGhlICJ1c2VyIgogICBvcHRpb24gaW4gL2V0Yy9mc3RhYiwgd2hpY2ggaXMgbm90IGRpc2N1c3NlZCBoZXJlLgogCitGaWxlc3lzdGVtIGNvbm5lY3Rpb246CisKKyAgQSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIGZpbGVzeXN0ZW0gZGFlbW9uIGFuZCB0aGUga2VybmVsLiAgVGhlCisgIGNvbm5lY3Rpb24gZXhpc3RzIHVudGlsIGVpdGhlciB0aGUgZGFlbW9uIGRpZXMsIG9yIHRoZSBmaWxlc3lzdGVtIGlzCisgIHVtb3VudGVkLiAgTm90ZSB0aGF0IGRldGFjaGluZyAob3IgbGF6eSB1bW91bnRpbmcpIHRoZSBmaWxlc3lzdGVtCisgIGRvZXMgX25vdF8gYnJlYWsgdGhlIGNvbm5lY3Rpb24sIGluIHRoaXMgY2FzZSBpdCB3aWxsIGV4aXN0IHVudGlsCisgIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgZmlsZXN5c3RlbSBpcyByZWxlYXNlZC4KKwogTW91bnQgb3duZXI6CiAKICAgVGhlIHVzZXIgd2hvIGRvZXMgdGhlIG1vdW50aW5nLgpAQCAtODYsMTYgKzk0LDIwIEBACiAgIFRoZSBkZWZhdWx0IGlzIGluZmluaXRlLiAgTm90ZSB0aGF0IHRoZSBzaXplIG9mIHJlYWQgcmVxdWVzdHMgaXMKICAgbGltaXRlZCBhbnl3YXkgdG8gMzIgcGFnZXMgKHdoaWNoIGlzIDEyOGtieXRlIG9uIGkzODYpLgogCi1TeXNmcwotfn5+fn4KK0NvbnRyb2wgZmlsZXN5c3RlbQorfn5+fn5+fn5+fn5+fn5+fn5+CiAKLUZVU0Ugc2V0cyB1cCB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeSBpbiBzeXNmczoKK1RoZXJlJ3MgYSBjb250cm9sIGZpbGVzeXN0ZW0gZm9yIEZVU0UsIHdoaWNoIGNhbiBiZSBtb3VudGVkIGJ5OgogCi0gIC9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucy9OLworICBtb3VudCAtdCBmdXNlY3RsIG5vbmUgL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zCiAKLXdoZXJlIE4gaXMgYW4gaW5jcmVhc2luZyBudW1iZXIgYWxsb2NhdGVkIHRvIGVhY2ggbmV3IGNvbm5lY3Rpb24uCitNb3VudGluZyBpdCB1bmRlciB0aGUgJy9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucycgZGlyZWN0b3J5IG1ha2VzIGl0CitiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMuCiAKLUZvciBlYWNoIGNvbm5lY3Rpb24gdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkOgorVW5kZXIgdGhlIGZ1c2UgY29udHJvbCBmaWxlc3lzdGVtIGVhY2ggY29ubmVjdGlvbiBoYXMgYSBkaXJlY3RvcnkKK25hbWVkIGJ5IGEgdW5pcXVlIG51bWJlci4KKworRm9yIGVhY2ggY29ubmVjdGlvbiB0aGUgZm9sbG93aW5nIGZpbGVzIGV4aXN0IHdpdGhpbiB0aGlzIGRpcmVjdG9yeToKIAogICd3YWl0aW5nJwogCkBAIC0xMTAsNyArMTIyLDQ3IEBACiAgIGNvbm5lY3Rpb24uICBUaGlzIG1lYW5zIHRoYXQgYWxsIHdhaXRpbmcgcmVxdWVzdHMgd2lsbCBiZSBhYm9ydGVkIGFuCiAgIGVycm9yIHJldHVybmVkIGZvciBhbGwgYWJvcnRlZCBhbmQgbmV3IHJlcXVlc3RzLgogCi1Pbmx5IGEgcHJpdmlsZWdlZCB1c2VyIG1heSByZWFkIG9yIHdyaXRlIHRoZXNlIGF0dHJpYnV0ZXMuCitPbmx5IHRoZSBvd25lciBvZiB0aGUgbW91bnQgbWF5IHJlYWQgb3Igd3JpdGUgdGhlc2UgZmlsZXMuCisKK0ludGVycnVwdGluZyBmaWxlc3lzdGVtIG9wZXJhdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgYSBwcm9jZXNzIGlzc3VpbmcgYSBGVVNFIGZpbGVzeXN0ZW0gcmVxdWVzdCBpcyBpbnRlcnJ1cHRlZCwgdGhlCitmb2xsb3dpbmcgd2lsbCBoYXBwZW46CisKKyAgMSkgSWYgdGhlIHJlcXVlc3QgaXMgbm90IHlldCBzZW50IHRvIHVzZXJzcGFjZSBBTkQgdGhlIHNpZ25hbCBpcworICAgICBmYXRhbCAoU0lHS0lMTCBvciB1bmhhbmRsZWQgZmF0YWwgc2lnbmFsKSwgdGhlbiB0aGUgcmVxdWVzdCBpcworICAgICBkZXF1ZXVlZCBhbmQgcmV0dXJucyBpbW1lZGlhdGVseS4KKworICAyKSBJZiB0aGUgcmVxdWVzdCBpcyBub3QgeWV0IHNlbnQgdG8gdXNlcnNwYWNlIEFORCB0aGUgc2lnbmFsIGlzIG5vdAorICAgICBmYXRhbCwgdGhlbiBhbiAnaW50ZXJydXB0ZWQnIGZsYWcgaXMgc2V0IGZvciB0aGUgcmVxdWVzdC4gIFdoZW4KKyAgICAgdGhlIHJlcXVlc3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHRyYW5zZmVyZWQgdG8gdXNlcnNwYWNlIGFuZAorICAgICB0aGlzIGZsYWcgaXMgc2V0LCBhbiBJTlRFUlJVUFQgcmVxdWVzdCBpcyBxdWV1ZWQuCisKKyAgMykgSWYgdGhlIHJlcXVlc3QgaXMgYWxyZWFkeSBzZW50IHRvIHVzZXJzcGFjZSwgdGhlbiBhbiBJTlRFUlJVUFQKKyAgICAgcmVxdWVzdCBpcyBxdWV1ZWQuCisKK0lOVEVSUlVQVCByZXF1ZXN0cyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBvdGhlciByZXF1ZXN0cywgc28gdGhlCit1c2Vyc3BhY2UgZmlsZXN5c3RlbSB3aWxsIHJlY2VpdmUgcXVldWVkIElOVEVSUlVQVHMgYmVmb3JlIGFueSBvdGhlcnMuCisKK1RoZSB1c2Vyc3BhY2UgZmlsZXN5c3RlbSBtYXkgaWdub3JlIHRoZSBJTlRFUlJVUFQgcmVxdWVzdHMgZW50aXJlbHksCitvciBtYXkgaG9ub3IgdGhlbSBieSBzZW5kaW5nIGEgcmVwbHkgdG8gdGhlIF9vcmlnaW5hbF8gcmVxdWVzdCwgd2l0aAordGhlIGVycm9yIHNldCB0byBFSU5UUi4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSB0aGF0IHRoZXJlJ3MgYSByYWNlIGJldHdlZW4gcHJvY2Vzc2luZyB0aGUKK29yaWdpbmFsIHJlcXVlc3QgYW5kIGl0J3MgSU5URVJSVVBUIHJlcXVlc3QuICBUaGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6CisKKyAgMSkgVGhlIElOVEVSUlVQVCByZXF1ZXN0IGlzIHByb2Nlc3NlZCBiZWZvcmUgdGhlIG9yaWdpbmFsIHJlcXVlc3QgaXMKKyAgICAgcHJvY2Vzc2VkCisKKyAgMikgVGhlIElOVEVSUlVQVCByZXF1ZXN0IGlzIHByb2Nlc3NlZCBhZnRlciB0aGUgb3JpZ2luYWwgcmVxdWVzdCBoYXMKKyAgICAgYmVlbiBhbnN3ZXJlZAorCitJZiB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgZmluZCB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgaXQgc2hvdWxkIHdhaXQgZm9yCitzb21lIHRpbWVvdXQgYW5kL29yIGEgbnVtYmVyIG9mIG5ldyByZXF1ZXN0cyB0byBhcnJpdmUsIGFmdGVyIHdoaWNoIGl0CitzaG91bGQgcmVwbHkgdG8gdGhlIElOVEVSUlVQVCByZXF1ZXN0IHdpdGggYW4gRUFHQUlOIGVycm9yLiAgSW4gY2FzZQorMSkgdGhlIElOVEVSUlVQVCByZXF1ZXN0IHdpbGwgYmUgcmVxdWV1ZWQuICBJbiBjYXNlIDIpIHRoZSBJTlRFUlJVUFQKK3JlcGx5IHdpbGwgYmUgaWdub3JlZC4KIAogQWJvcnRpbmcgYSBmaWxlc3lzdGVtIGNvbm5lY3Rpb24KIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC0xMzksOCArMTkxLDggQEAKICAgLSBVc2UgZm9yY2VkIHVtb3VudCAodW1vdW50IC1mKS4gIFdvcmtzIGluIGFsbCBjYXNlcyBidXQgb25seSBpZgogICAgIGZpbGVzeXN0ZW0gaXMgc3RpbGwgYXR0YWNoZWQgKGl0IGhhc24ndCBiZWVuIGxhenkgdW5tb3VudGVkKQogCi0gIC0gQWJvcnQgZmlsZXN5c3RlbSB0aHJvdWdoIHRoZSBzeXNmcyBpbnRlcmZhY2UuICBNb3N0IHBvd2VyZnVsCi0gICAgbWV0aG9kLCBhbHdheXMgd29ya3MuCisgIC0gQWJvcnQgZmlsZXN5c3RlbSB0aHJvdWdoIHRoZSBGVVNFIGNvbnRyb2wgZmlsZXN5c3RlbS4gIE1vc3QKKyAgICBwb3dlcmZ1bCBtZXRob2QsIGFsd2F5cyB3b3Jrcy4KIAogSG93IGRvIG5vbi1wcml2aWxlZ2VkIG1vdW50cyB3b3JrPwogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpAQCAtMzA0LDI1ICszNTYsNyBAQAogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICBmb3IgImZpbGUiXQogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICpERUFETE9DSyoKIAotVGhlIHNvbHV0aW9uIGZvciB0aGlzIGlzIHRvIGFsbG93IHJlcXVlc3RzIHRvIGJlIGludGVycnVwdGVkIHdoaWxlCi10aGV5IGFyZSBpbiB1c2Vyc3BhY2U6Ci0KLSB8ICAgICAgW2ludGVycnVwdGVkIGJ5IHNpZ25hbF0gICAgICAgfAotIHwgICAgPGZ1c2VfdW5saW5rKCkgICAgICAgICAgICAgICAgICB8Ci0gfCAgICBbcmVsZWFzZSBzZW1hcGhvcmVdICAgICAgICAgICAgIHwgICAgW3NlbWFwaG9yZSBhY3F1aXJlZF0KLSB8ICA8c3lzX3VubGluaygpICAgICAgICAgICAgICAgICAgICAgfAotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgID5mdXNlX3VubGluaygpCi0gfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICBbcXVldWUgcmVxIG9uIGZjLT5wZW5kaW5nXQotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3dha2UgdXAgZmMtPndhaXRxXQotIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgW3NsZWVwIG9uIHJlcS0+d2FpdHFdCi0KLUlmIHRoZSBmaWxlc3lzdGVtIGRhZW1vbiB3YXMgc2luZ2xlIHRocmVhZGVkLCB0aGlzIHdpbGwgc3RvcCBoZXJlLAotc2luY2UgdGhlcmUncyBubyBvdGhlciB0aHJlYWQgdG8gZGVxdWV1ZSBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdC4KLUluIHRoaXMgY2FzZSB0aGUgc29sdXRpb24gaXMgdG8ga2lsbCB0aGUgRlVTRSBkYWVtb24gYXMgd2VsbC4gIElmCi10aGVyZSBhcmUgbXVsdGlwbGUgc2VydmluZyB0aHJlYWRzLCB5b3UganVzdCBoYXZlIHRvIGtpbGwgdGhlbSBhcwotbG9uZyBhcyBhbnkgcmVtYWluLgotCi1Nb3JhbDogYSBmaWxlc3lzdGVtIHdoaWNoIGRlYWRsb2NrcywgY2FuIHNvb24gZmluZCBpdHNlbGYgZGVhZC4KK1RoZSBzb2x1dGlvbiBmb3IgdGhpcyBpcyB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSB0byBiZSBhYm9ydGVkLgogCiBTY2VuYXJpbyAyIC0gVHJpY2t5IGRlYWRsb2NrCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNTUsMjQgKzM4OSwxNCBAQAogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICBbbG9jayBwYWdlXQogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAqIERFQURMT0NLICoKIAotU29sdXRpb24gaXMgYWdhaW4gdG8gbGV0IHRoZSB0aGUgcmVxdWVzdCBiZSBpbnRlcnJ1cHRlZCAobm90Ci1lbGFib3JhdGVkIGZ1cnRoZXIpLgorU29sdXRpb24gaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGFib3ZlLgogCi1BbiBhZGRpdGlvbmFsIHByb2JsZW0gaXMgdGhhdCB3aGlsZSB0aGUgd3JpdGUgYnVmZmVyIGlzIGJlaW5nCi1jb3BpZWQgdG8gdGhlIHJlcXVlc3QsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIGludGVycnVwdGVkLiAgVGhpcwotaXMgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGUgY29weSBtYXkgbm90IGJlIHZhbGlkCi1hZnRlciB0aGUgcmVxdWVzdCBpcyBpbnRlcnJ1cHRlZC4KK0FuIGFkZGl0aW9uYWwgcHJvYmxlbSBpcyB0aGF0IHdoaWxlIHRoZSB3cml0ZSBidWZmZXIgaXMgYmVpbmcgY29waWVkCit0byB0aGUgcmVxdWVzdCwgdGhlIHJlcXVlc3QgbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQvYWJvcnRlZC4gIFRoaXMgaXMKK2JlY2F1c2UgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3Mgb2YgdGhlIGNvcHkgbWF5IG5vdCBiZSB2YWxpZCBhZnRlciB0aGUKK3JlcXVlc3QgaGFzIHJldHVybmVkLgogCi1UaGlzIGlzIHNvbHZlZCB3aXRoIGRvaW5nIHRoZSBjb3B5IGF0b21pY2FsbHksIGFuZCBhbGxvd2luZwotaW50ZXJydXB0aW9uIHdoaWxlIHRoZSBwYWdlKHMpIGJlbG9uZ2luZyB0byB0aGUgd3JpdGUgYnVmZmVyIGFyZQotZmF1bHRlZCB3aXRoIGdldF91c2VyX3BhZ2VzKCkuICBUaGUgJ3JlcS0+bG9ja2VkJyBmbGFnIGluZGljYXRlcwotd2hlbiB0aGUgY29weSBpcyB0YWtpbmcgcGxhY2UsIGFuZCBpbnRlcnJ1cHRpb24gaXMgZGVsYXllZCB1bnRpbAotdGhpcyBmbGFnIGlzIHVuc2V0LgotCi1TY2VuYXJpbyAzIC0gVHJpY2t5IGRlYWRsb2NrIHdpdGggYXN5bmNocm9ub3VzIHJlYWQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UaGUgc2FtZSBzaXR1YXRpb24gYXMgYWJvdmUsIGV4Y2VwdCB0aHJlYWQtMSB3aWxsIHdhaXQgb24gcGFnZSBsb2NrCi1hbmQgaGVuY2UgaXQgd2lsbCBiZSB1bmludGVycnVwdGlibGUgYXMgd2VsbC4gIFRoZSBzb2x1dGlvbiBpcyB0bwotYWJvcnQgdGhlIGNvbm5lY3Rpb24gd2l0aCBmb3JjZWQgdW1vdW50IChpZiBtb3VudCBpcyBhdHRhY2hlZCkgb3IKLXRocm91Z2ggdGhlIGFib3J0IGF0dHJpYnV0ZSBpbiBzeXNmcy4KK1RoaXMgaXMgc29sdmVkIHdpdGggZG9pbmcgdGhlIGNvcHkgYXRvbWljYWxseSwgYW5kIGFsbG93aW5nIGFib3J0Cit3aGlsZSB0aGUgcGFnZShzKSBiZWxvbmdpbmcgdG8gdGhlIHdyaXRlIGJ1ZmZlciBhcmUgZmF1bHRlZCB3aXRoCitnZXRfdXNlcl9wYWdlcygpLiAgVGhlICdyZXEtPmxvY2tlZCcgZmxhZyBpbmRpY2F0ZXMgd2hlbiB0aGUgY29weSBpcwordGFraW5nIHBsYWNlLCBhbmQgYWJvcnQgaXMgZGVsYXllZCB1bnRpbCB0aGlzIGZsYWcgaXMgdW5zZXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcKaW5kZXggMmYzODg0Ni4uNTUzMTY5NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZwpAQCAtNTAsMTAgKzUwLDExIEBACiBzdWNjZXNzIGFuZCBuZWdhdGl2ZSBudW1iZXIgaW4gY2FzZSBvZiBlcnJvciAoLUVJTlZBTCB1bmxlc3MgeW91IGhhdmUgbW9yZQogaW5mb3JtYXRpdmUgZXJyb3IgdmFsdWUgdG8gcmVwb3J0KS4gIENhbGwgaXQgZm9vX2ZpbGxfc3VwZXIoKS4gIE5vdyBkZWNsYXJlCiAKLXN0cnVjdCBzdXBlcl9ibG9jayBmb29fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitpbnQgZm9vX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQyX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGZvb19maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAogKG9yIHNpbWlsYXIgd2l0aCBzL2JkZXYvbm9kZXYvIG9yIHMvYmRldi9zaW5nbGUvLCBkZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmFtZnMtcm9vdGZzLWluaXRyYW1mcy50eHQgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3JhbWZzLXJvb3Rmcy1pbml0cmFtZnMudHh0CmluZGV4IDYwYWI2MWUuLjI1OTgxZTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcmFtZnMtcm9vdGZzLWluaXRyYW1mcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9yYW1mcy1yb290ZnMtaW5pdHJhbWZzLnR4dApAQCAtNzAsMTEgKzcwLDEzIEBACiBXaGF0IGlzIHJvb3Rmcz8KIC0tLS0tLS0tLS0tLS0tLQogCi1Sb290ZnMgaXMgYSBzcGVjaWFsIGluc3RhbmNlIG9mIHJhbWZzLCB3aGljaCBpcyBhbHdheXMgcHJlc2VudCBpbiAyLjYgc3lzdGVtcy4KLShJdCdzIHVzZWQgaW50ZXJuYWxseSBhcyB0aGUgc3RhcnRpbmcgYW5kIHN0b3BwaW5nIHBvaW50IGZvciBzZWFyY2hlcyBvZiB0aGUKLWtlcm5lbCdzIGRvdWJseS1saW5rZWQgbGlzdCBvZiBtb3VudCBwb2ludHMuKQorUm9vdGZzIGlzIGEgc3BlY2lhbCBpbnN0YW5jZSBvZiByYW1mcyAob3IgdG1wZnMsIGlmIHRoYXQncyBlbmFibGVkKSwgd2hpY2ggaXMKK2Fsd2F5cyBwcmVzZW50IGluIDIuNiBzeXN0ZW1zLiAgWW91IGNhbid0IHVubW91bnQgcm9vdGZzIGZvciBhcHByb3hpbWF0ZWx5IHRoZQorc2FtZSByZWFzb24geW91IGNhbid0IGtpbGwgdGhlIGluaXQgcHJvY2VzczsgcmF0aGVyIHRoYW4gaGF2aW5nIHNwZWNpYWwgY29kZQordG8gY2hlY2sgZm9yIGFuZCBoYW5kbGUgYW4gZW1wdHkgbGlzdCwgaXQncyBzbWFsbGVyIGFuZCBzaW1wbGVyIGZvciB0aGUga2VybmVsCit0byBqdXN0IG1ha2Ugc3VyZSBjZXJ0YWluIGxpc3RzIGNhbid0IGJlY29tZSBlbXB0eS4KIAotTW9zdCBzeXN0ZW1zIGp1c3QgbW91bnQgYW5vdGhlciBmaWxlc3lzdGVtIG92ZXIgaXQgYW5kIGlnbm9yZSBpdC4gIFRoZQorTW9zdCBzeXN0ZW1zIGp1c3QgbW91bnQgYW5vdGhlciBmaWxlc3lzdGVtIG92ZXIgcm9vdGZzIGFuZCBpZ25vcmUgaXQuICBUaGUKIGFtb3VudCBvZiBzcGFjZSBhbiBlbXB0eSBpbnN0YW5jZSBvZiByYW1mcyB0YWtlcyB1cCBpcyB0aW55LgogCiBXaGF0IGlzIGluaXRyYW1mcz8KQEAgLTkyLDE0ICs5NCwxNiBAQAogCiBBbGwgdGhpcyBkaWZmZXJzIGZyb20gdGhlIG9sZCBpbml0cmQgaW4gc2V2ZXJhbCB3YXlzOgogCi0gIC0gVGhlIG9sZCBpbml0cmQgd2FzIGEgc2VwYXJhdGUgZmlsZSwgd2hpbGUgdGhlIGluaXRyYW1mcyBhcmNoaXZlIGlzIGxpbmtlZAotICAgIGludG8gdGhlIGxpbnV4IGtlcm5lbCBpbWFnZS4gIChUaGUgZGlyZWN0b3J5IGxpbnV4LSovdXNyIGlzIGRldm90ZWQgdG8KLSAgICBnZW5lcmF0aW5nIHRoaXMgYXJjaGl2ZSBkdXJpbmcgdGhlIGJ1aWxkLikKKyAgLSBUaGUgb2xkIGluaXRyZCB3YXMgYWx3YXlzIGEgc2VwYXJhdGUgZmlsZSwgd2hpbGUgdGhlIGluaXRyYW1mcyBhcmNoaXZlIGlzCisgICAgbGlua2VkIGludG8gdGhlIGxpbnV4IGtlcm5lbCBpbWFnZS4gIChUaGUgZGlyZWN0b3J5IGxpbnV4LSovdXNyIGlzIGRldm90ZWQKKyAgICB0byBnZW5lcmF0aW5nIHRoaXMgYXJjaGl2ZSBkdXJpbmcgdGhlIGJ1aWxkLikKIAogICAtIFRoZSBvbGQgaW5pdHJkIGZpbGUgd2FzIGEgZ3ppcHBlZCBmaWxlc3lzdGVtIGltYWdlIChpbiBzb21lIGZpbGUgZm9ybWF0LAotICAgIHN1Y2ggYXMgZXh0MiwgdGhhdCBoYWQgdG8gYmUgYnVpbHQgaW50byB0aGUga2VybmVsKSwgd2hpbGUgdGhlIG5ldworICAgIHN1Y2ggYXMgZXh0MiwgdGhhdCBuZWVkZWQgYSBkcml2ZXIgYnVpbHQgaW50byB0aGUga2VybmVsKSwgd2hpbGUgdGhlIG5ldwogICAgIGluaXRyYW1mcyBhcmNoaXZlIGlzIGEgZ3ppcHBlZCBjcGlvIGFyY2hpdmUgKGxpa2UgdGFyIG9ubHkgc2ltcGxlciwKLSAgICBzZWUgY3BpbygxKSBhbmQgRG9jdW1lbnRhdGlvbi9lYXJseS11c2Vyc3BhY2UvYnVmZmVyLWZvcm1hdC50eHQpLgorICAgIHNlZSBjcGlvKDEpIGFuZCBEb2N1bWVudGF0aW9uL2Vhcmx5LXVzZXJzcGFjZS9idWZmZXItZm9ybWF0LnR4dCkuICBUaGUKKyAgICBrZXJuZWwncyBjcGlvIGV4dHJhY3Rpb24gY29kZSBpcyBub3Qgb25seSBleHRyZW1lbHkgc21hbGwsIGl0J3MgYWxzbworICAgIF9faW5pdCBkYXRhIHRoYXQgY2FuIGJlIGRpc2NhcmRlZCBkdXJpbmcgdGhlIGJvb3QgcHJvY2Vzcy4KIAogICAtIFRoZSBwcm9ncmFtIHJ1biBieSB0aGUgb2xkIGluaXRyZCAod2hpY2ggd2FzIGNhbGxlZCAvaW5pdHJkLCBub3QgL2luaXQpIGRpZAogICAgIHNvbWUgc2V0dXAgYW5kIHRoZW4gcmV0dXJuZWQgdG8gdGhlIGtlcm5lbCwgd2hpbGUgdGhlIGluaXQgcHJvZ3JhbSBmcm9tCkBAIC0xMjQsMTMgKzEyOCwxNCBAQAogCiBUaGUgMi42IGtlcm5lbCBidWlsZCBwcm9jZXNzIGFsd2F5cyBjcmVhdGVzIGEgZ3ppcHBlZCBjcGlvIGZvcm1hdCBpbml0cmFtZnMKIGFyY2hpdmUgYW5kIGxpbmtzIGl0IGludG8gdGhlIHJlc3VsdGluZyBrZXJuZWwgYmluYXJ5LiAgQnkgZGVmYXVsdCwgdGhpcwotYXJjaGl2ZSBpcyBlbXB0eSAoY29uc3VtaW5nIDEzNCBieXRlcyBvbiB4ODYpLiAgVGhlIGNvbmZpZyBvcHRpb24KLUNPTkZJR19JTklUUkFNRlNfU09VUkNFIChmb3Igc29tZSByZWFzb24gYnVyaWVkIHVuZGVyIGRldmljZXMtPmJsb2NrIGRldmljZXMKLWluIG1lbnVjb25maWcsIGFuZCBsaXZpbmcgaW4gdXNyL0tjb25maWcpIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBzb3VyY2UgZm9yCi10aGUgaW5pdHJhbWZzIGFyY2hpdmUsIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUKLXJlc3VsdGluZyBiaW5hcnkuICBUaGlzIG9wdGlvbiBjYW4gcG9pbnQgdG8gYW4gZXhpc3RpbmcgZ3ppcHBlZCBjcGlvIGFyY2hpdmUsIGEKLWRpcmVjdG9yeSBjb250YWluaW5nIGZpbGVzIHRvIGJlIGFyY2hpdmVkLCBvciBhIHRleHQgZmlsZSBzcGVjaWZpY2F0aW9uIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKK2FyY2hpdmUgaXMgZW1wdHkgKGNvbnN1bWluZyAxMzQgYnl0ZXMgb24geDg2KS4KKworVGhlIGNvbmZpZyBvcHRpb24gQ09ORklHX0lOSVRSQU1GU19TT1VSQ0UgKGZvciBzb21lIHJlYXNvbiBidXJpZWQgdW5kZXIKK2RldmljZXMtPmJsb2NrIGRldmljZXMgaW4gbWVudWNvbmZpZywgYW5kIGxpdmluZyBpbiB1c3IvS2NvbmZpZykgY2FuIGJlIHVzZWQKK3RvIHNwZWNpZnkgYSBzb3VyY2UgZm9yIHRoZSBpbml0cmFtZnMgYXJjaGl2ZSwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGJlCitpbmNvcnBvcmF0ZWQgaW50byB0aGUgcmVzdWx0aW5nIGJpbmFyeS4gIFRoaXMgb3B0aW9uIGNhbiBwb2ludCB0byBhbiBleGlzdGluZworZ3ppcHBlZCBjcGlvIGFyY2hpdmUsIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgZmlsZXMgdG8gYmUgYXJjaGl2ZWQsIG9yIGEgdGV4dAorZmlsZSBzcGVjaWZpY2F0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBleGFtcGxlOgogCiAgIGRpciAvZGV2IDc1NSAwIDAKICAgbm9kIC9kZXYvY29uc29sZSA2NDQgMCAwIGMgNSAxCkBAIC0xNDYsMjMgKzE1MSw4NCBAQAogUnVuICJ1c3IvZ2VuX2luaXRfY3BpbyIgKGFmdGVyIHRoZSBrZXJuZWwgYnVpbGQpIHRvIGdldCBhIHVzYWdlIG1lc3NhZ2UKIGRvY3VtZW50aW5nIHRoZSBhYm92ZSBmaWxlIGZvcm1hdC4KIAotT25lIGFkdmFudGFnZSBvZiB0aGUgdGV4dCBmaWxlIGlzIHRoYXQgcm9vdCBhY2Nlc3MgaXMgbm90IHJlcXVpcmVkIHRvCitPbmUgYWR2YW50YWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgaXMgdGhhdCByb290IGFjY2VzcyBpcyBub3QgcmVxdWlyZWQgdG8KIHNldCBwZXJtaXNzaW9ucyBvciBjcmVhdGUgZGV2aWNlIG5vZGVzIGluIHRoZSBuZXcgYXJjaGl2ZS4gIChOb3RlIHRoYXQgdGhvc2UKIHR3byBleGFtcGxlICJmaWxlIiBlbnRyaWVzIGV4cGVjdCB0byBmaW5kIGZpbGVzIG5hbWVkICJpbml0LnNoIiBhbmQgImJ1c3lib3giIGluCiBhIGRpcmVjdG9yeSBjYWxsZWQgImluaXRyYW1mcyIsIHVuZGVyIHRoZSBsaW51eC0yLjYuKiBkaXJlY3RvcnkuICBTZWUKIERvY3VtZW50YXRpb24vZWFybHktdXNlcnNwYWNlL1JFQURNRSBmb3IgbW9yZSBkZXRhaWxzLikKIAotVGhlIGtlcm5lbCBkb2VzIG5vdCBkZXBlbmQgb24gZXh0ZXJuYWwgY3BpbyB0b29scywgZ2VuX2luaXRfY3BpbyBpcyBjcmVhdGVkCi1mcm9tIHVzci9nZW5faW5pdF9jcGlvLmMgd2hpY2ggaXMgZW50aXJlbHkgc2VsZi1jb250YWluZWQsIGFuZCB0aGUga2VybmVsJ3MKLWJvb3QtdGltZSBleHRyYWN0b3IgaXMgYWxzbyAob2J2aW91c2x5KSBzZWxmLWNvbnRhaW5lZC4gIEhvd2V2ZXIsIGlmIHlvdSBfZG9fCi1oYXBwZW4gdG8gaGF2ZSBjcGlvIGluc3RhbGxlZCwgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGV4dHJhY3QgdGhlCi1nZW5lcmF0ZWQgY3BpbyBpbWFnZSBiYWNrIGludG8gaXRzIGNvbXBvbmVudCBmaWxlczoKK1RoZSBrZXJuZWwgZG9lcyBub3QgZGVwZW5kIG9uIGV4dGVybmFsIGNwaW8gdG9vbHMuICBJZiB5b3Ugc3BlY2lmeSBhCitkaXJlY3RvcnkgaW5zdGVhZCBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgdGhlIGtlcm5lbCdzIGJ1aWxkIGluZnJhc3RydWN0dXJlCitjcmVhdGVzIGEgY29uZmlndXJhdGlvbiBmaWxlIGZyb20gdGhhdCBkaXJlY3RvcnkgKHVzci9NYWtlZmlsZSBjYWxscworc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2gpLCBhbmQgcHJvY2VlZHMgdG8gcGFja2FnZSB1cCB0aGF0IGRpcmVjdG9yeQordXNpbmcgdGhlIGNvbmZpZyBmaWxlIChieSBmZWVkaW5nIGl0IHRvIHVzci9nZW5faW5pdF9jcGlvLCB3aGljaCBpcyBjcmVhdGVkCitmcm9tIHVzci9nZW5faW5pdF9jcGlvLmMpLiAgVGhlIGtlcm5lbCdzIGJ1aWxkLXRpbWUgY3BpbyBjcmVhdGlvbiBjb2RlIGlzCitlbnRpcmVseSBzZWxmLWNvbnRhaW5lZCwgYW5kIHRoZSBrZXJuZWwncyBib290LXRpbWUgZXh0cmFjdG9yIGlzIGFsc28KKyhvYnZpb3VzbHkpIHNlbGYtY29udGFpbmVkLgorCitUaGUgb25lIHRoaW5nIHlvdSBtaWdodCBuZWVkIGV4dGVybmFsIGNwaW8gdXRpbGl0aWVzIGluc3RhbGxlZCBmb3IgaXMgY3JlYXRpbmcKK29yIGV4dHJhY3RpbmcgeW91ciBvd24gcHJlcHJlcGFyZWQgY3BpbyBmaWxlcyB0byBmZWVkIHRvIHRoZSBrZXJuZWwgYnVpbGQKKyhpbnN0ZWFkIG9mIGEgY29uZmlnIGZpbGUgb3IgZGlyZWN0b3J5KS4KKworVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgY2FuIGV4dHJhY3QgYSBjcGlvIGltYWdlIChlaXRoZXIgYnkgdGhlIGFib3ZlIHNjcmlwdAorb3IgYnkgdGhlIGtlcm5lbCBidWlsZCkgYmFjayBpbnRvIGl0cyBjb21wb25lbnQgZmlsZXM6CiAKICAgY3BpbyAtaSAtZCAtSCBuZXdjIC1GIGluaXRyYW1mc19kYXRhLmNwaW8gLS1uby1hYnNvbHV0ZS1maWxlbmFtZXMKIAorVGhlIGZvbGxvd2luZyBzaGVsbCBzY3JpcHQgY2FuIGNyZWF0ZSBhIHByZWJ1aWx0IGNwaW8gYXJjaGl2ZSB5b3UgY2FuCit1c2UgaW4gcGxhY2Ugb2YgdGhlIGFib3ZlIGNvbmZpZyBmaWxlOgorCisgICMhL2Jpbi9zaAorCisgICMgQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4gYW5kIFRpbWVTeXMgQ29ycG9yYXRpb24uCisgICMgTGljZW5zZWQgdW5kZXIgR1BMIHZlcnNpb24gMgorCisgIGlmIFsgJCMgLW5lIDIgXQorICB0aGVuCisgICAgZWNobyAidXNhZ2U6IG1raW5pdHJhbWZzIGRpcmVjdG9yeSBpbWFnZW5hbWUuY3Bpby5neiIKKyAgICBleGl0IDEKKyAgZmkKKworICBpZiBbIC1kICIkMSIgXQorICB0aGVuCisgICAgZWNobyAiY3JlYXRpbmcgJDIgZnJvbSAkMSIKKyAgICAoY2QgIiQxIjsgZmluZCAuIHwgY3BpbyAtbyAtSCBuZXdjIHwgZ3ppcCkgPiAiJDIiCisgIGVsc2UKKyAgICBlY2hvICJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgZGlyZWN0b3J5IgorICAgIGV4aXQgMQorICBmaQorCitOb3RlOiBUaGUgY3BpbyBtYW4gcGFnZSBjb250YWlucyBzb21lIGJhZCBhZHZpY2UgdGhhdCB3aWxsIGJyZWFrIHlvdXIgaW5pdHJhbWZzCithcmNoaXZlIGlmIHlvdSBmb2xsb3cgaXQuICBJdCBzYXlzICJBIHR5cGljYWwgd2F5IHRvIGdlbmVyYXRlIHRoZSBsaXN0CitvZiBmaWxlbmFtZXMgaXMgd2l0aCB0aGUgZmluZCBjb21tYW5kOyB5b3Ugc2hvdWxkIGdpdmUgZmluZCB0aGUgLWRlcHRoIG9wdGlvbgordG8gbWluaW1pemUgcHJvYmxlbXMgd2l0aCBwZXJtaXNzaW9ucyBvbiBkaXJlY3RvcmllcyB0aGF0IGFyZSB1bndyaXRhYmxlIG9yIG5vdAorc2VhcmNoYWJsZS4iICBEb24ndCBkbyB0aGlzIHdoZW4gY3JlYXRpbmcgaW5pdHJhbWZzLmNwaW8uZ3ogaW1hZ2VzLCBpdCB3b24ndAord29yay4gIFRoZSBMaW51eCBrZXJuZWwgY3BpbyBleHRyYWN0b3Igd29uJ3QgY3JlYXRlIGZpbGVzIGluIGEgZGlyZWN0b3J5IHRoYXQKK2RvZXNuJ3QgZXhpc3QsIHNvIHRoZSBkaXJlY3RvcnkgZW50cmllcyBtdXN0IGdvIGJlZm9yZSB0aGUgZmlsZXMgdGhhdCBnbyBpbgordGhvc2UgZGlyZWN0b3JpZXMuICBUaGUgYWJvdmUgc2NyaXB0IGdldHMgdGhlbSBpbiB0aGUgcmlnaHQgb3JkZXIuCisKK0V4dGVybmFsIGluaXRyYW1mcyBpbWFnZXM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB0aGUga2VybmVsIGhhcyBpbml0cmQgc3VwcG9ydCBlbmFibGVkLCBhbiBleHRlcm5hbCBjcGlvLmd6IGFyY2hpdmUgY2FuIGFsc28KK2JlIHBhc3NlZCBpbnRvIGEgMi42IGtlcm5lbCBpbiBwbGFjZSBvZiBhbiBpbml0cmQuICBJbiB0aGlzIGNhc2UsIHRoZSBrZXJuZWwKK3dpbGwgYXV0b2RldGVjdCB0aGUgdHlwZSAoaW5pdHJhbWZzLCBub3QgaW5pdHJkKSBhbmQgZXh0cmFjdCB0aGUgZXh0ZXJuYWwgY3BpbworYXJjaGl2ZSBpbnRvIHJvb3RmcyBiZWZvcmUgdHJ5aW5nIHRvIHJ1biAvaW5pdC4KKworVGhpcyBoYXMgdGhlIG1lbW9yeSBlZmZpY2llbmN5IGFkdmFudGFnZXMgb2YgaW5pdHJhbWZzIChubyByYW1kaXNrIGJsb2NrCitkZXZpY2UpIGJ1dCB0aGUgc2VwYXJhdGUgcGFja2FnaW5nIG9mIGluaXRyZCAod2hpY2ggaXMgbmljZSBpZiB5b3UgaGF2ZQorbm9uLUdQTCBjb2RlIHlvdSdkIGxpa2UgdG8gcnVuIGZyb20gaW5pdHJhbWZzLCB3aXRob3V0IGNvbmZsYXRpbmcgaXQgd2l0aAordGhlIEdQTCBsaWNlbnNlZCBMaW51eCBrZXJuZWwgYmluYXJ5KS4KKworSXQgY2FuIGFsc28gYmUgdXNlZCB0byBzdXBwbGVtZW50IHRoZSBrZXJuZWwncyBidWlsdC1pbiBpbml0YW1mcyBpbWFnZS4gIFRoZQorZmlsZXMgaW4gdGhlIGV4dGVybmFsIGFyY2hpdmUgd2lsbCBvdmVyd3JpdGUgYW55IGNvbmZsaWN0aW5nIGZpbGVzIGluCit0aGUgYnVpbHQtaW4gaW5pdHJhbWZzIGFyY2hpdmUuICBTb21lIGRpc3RyaWJ1dG9ycyBhbHNvIHByZWZlciB0byBjdXN0b21pemUKK2Egc2luZ2xlIGtlcm5lbCBpbWFnZSB3aXRoIHRhc2stc3BlY2lmaWMgaW5pdHJhbWZzIGltYWdlcywgd2l0aG91dCByZWNvbXBpbGluZy4KKwogQ29udGVudHMgb2YgaW5pdHJhbWZzOgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitBbiBpbml0cmFtZnMgYXJjaGl2ZSBpcyBhIGNvbXBsZXRlIHNlbGYtY29udGFpbmVkIHJvb3QgZmlsZXN5c3RlbSBmb3IgTGludXguCiBJZiB5b3UgZG9uJ3QgYWxyZWFkeSB1bmRlcnN0YW5kIHdoYXQgc2hhcmVkIGxpYnJhcmllcywgZGV2aWNlcywgYW5kIHBhdGhzCiB5b3UgbmVlZCB0byBnZXQgYSBtaW5pbWFsIHJvb3QgZmlsZXN5c3RlbSB1cCBhbmQgcnVubmluZywgaGVyZSBhcmUgc29tZQogcmVmZXJlbmNlczoKQEAgLTE3NiwxMyArMjQyLDM2IEBACiAKIEkgdXNlIHVDbGliYyAoaHR0cDovL3d3dy51Y2xpYmMub3JnKSBhbmQgYnVzeWJveCAoaHR0cDovL3d3dy5idXN5Ym94Lm5ldCkKIG15c2VsZi4gIFRoZXNlIGFyZSBMR1BMIGFuZCBHUEwsIHJlc3BlY3RpdmVseS4gIChBIHNlbGYtY29udGFpbmVkIGluaXRyYW1mcwotcGFja2FnZSBpcyBwbGFubmVkIGZvciB0aGUgYnVzeWJveCAxLjIgcmVsZWFzZS4pCitwYWNrYWdlIGlzIHBsYW5uZWQgZm9yIHRoZSBidXN5Ym94IDEuMyByZWxlYXNlLikKIAogSW4gdGhlb3J5IHlvdSBjb3VsZCB1c2UgZ2xpYmMsIGJ1dCB0aGF0J3Mgbm90IHdlbGwgc3VpdGVkIGZvciBzbWFsbCBlbWJlZGRlZAogdXNlcyBsaWtlIHRoaXMuICAoQSAiaGVsbG8gd29ybGQiIHByb2dyYW0gc3RhdGljYWxseSBsaW5rZWQgYWdhaW5zdCBnbGliYyBpcwogb3ZlciA0MDBrLiAgV2l0aCB1Q2xpYmMgaXQncyA3ay4gIEFsc28gbm90ZSB0aGF0IGdsaWJjIGRsb3BlbnMgbGlibnNzIHRvIGRvCiBuYW1lIGxvb2t1cHMsIGV2ZW4gd2hlbiBvdGhlcndpc2Ugc3RhdGljYWxseSBsaW5rZWQuKQogCitBIGdvb2QgZmlyc3Qgc3RlcCBpcyB0byBnZXQgaW5pdHJhbWZzIHRvIHJ1biBhIHN0YXRpY2FsbHkgbGlua2VkICJoZWxsbyB3b3JsZCIKK3Byb2dyYW0gYXMgaW5pdCwgYW5kIHRlc3QgaXQgdW5kZXIgYW4gZW11bGF0b3IgbGlrZSBxZW11ICh3d3cucWVtdS5vcmcpIG9yCitVc2VyIE1vZGUgTGludXgsIGxpa2Ugc286CisKKyAgY2F0ID4gaGVsbG8uYyA8PCBFT0YKKyAgI2luY2x1ZGUgPHN0ZGlvLmg+CisgICNpbmNsdWRlIDx1bmlzdGQuaD4KKworICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQorICB7CisgICAgcHJpbnRmKCJIZWxsbyB3b3JsZCFcbiIpOworICAgIHNsZWVwKDk5OTk5OTk5OSk7CisgIH0KKyAgRU9GCisgIGdjYyAtc3RhdGljIGhlbGxvMi5jIC1vIGluaXQKKyAgZWNobyBpbml0IHwgY3BpbyAtbyAtSCBuZXdjIHwgZ3ppcCA+IHRlc3QuY3Bpby5negorICAjIFRlc3RpbmcgZXh0ZXJuYWwgaW5pdHJhbWZzIHVzaW5nIHRoZSBpbml0cmQgbG9hZGluZyBtZWNoYW5pc20uCisgIHFlbXUgLWtlcm5lbCAvYm9vdC92bWxpbnV6IC1pbml0cmQgdGVzdC5jcGlvLmd6IC9kZXYvemVybworCitXaGVuIGRlYnVnZ2luZyBhIG5vcm1hbCByb290IGZpbGVzeXN0ZW0sIGl0J3MgbmljZSB0byBiZSBhYmxlIHRvIGJvb3Qgd2l0aAorImluaXQ9L2Jpbi9zaCIuICBUaGUgaW5pdHJhbWZzIGVxdWl2YWxlbnQgaXMgInJkaW5pdD0vYmluL3NoIiwgYW5kIGl0J3MKK2p1c3QgYXMgdXNlZnVsLgorCiBXaHkgY3BpbyByYXRoZXIgdGhhbiB0YXI/CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTI0MSw3ICszMzAsNyBAQAogRnV0dXJlIGRpcmVjdGlvbnM6CiAtLS0tLS0tLS0tLS0tLS0tLS0KIAotVG9kYXkgKDIuNi4xNCksIGluaXRyYW1mcyBpcyBhbHdheXMgY29tcGlsZWQgaW4sIGJ1dCBub3QgYWx3YXlzIHVzZWQuICBUaGUKK1RvZGF5ICgyLjYuMTYpLCBpbml0cmFtZnMgaXMgYWx3YXlzIGNvbXBpbGVkIGluLCBidXQgbm90IGFsd2F5cyB1c2VkLiAgVGhlCiBrZXJuZWwgZmFsbHMgYmFjayB0byBsZWdhY3kgYm9vdCBjb2RlIHRoYXQgaXMgcmVhY2hlZCBvbmx5IGlmIGluaXRyYW1mcyBkb2VzCiBub3QgY29udGFpbiBhbiAvaW5pdCBwcm9ncmFtLiAgVGhlIGZhbGxiYWNrIGlzIGxlZ2FjeSBjb2RlLCB0aGVyZSB0byBlbnN1cmUgYQogc21vb3RoIHRyYW5zaXRpb24gYW5kIGFsbG93aW5nIGVhcmx5IGJvb3QgZnVuY3Rpb25hbGl0eSB0byBncmFkdWFsbHkgbW92ZSB0bwpAQCAtMjU4LDggKzM0Nyw5IEBACiAKIFRoaXMga2luZCBvZiBjb21wbGV4aXR5ICh3aGljaCBpbmV2aXRhYmx5IGluY2x1ZGVzIHBvbGljeSkgaXMgcmlnaHRseSBoYW5kbGVkCiBpbiB1c2Vyc3BhY2UuICBCb3RoIGtsaWJjIGFuZCBidXN5Ym94L3VDbGliYyBhcmUgd29ya2luZyBvbiBzaW1wbGUgaW5pdHJhbWZzCi1wYWNrYWdlcyB0byBkcm9wIGludG8gYSBrZXJuZWwgYnVpbGQsIGFuZCB3aGVuIHN0YW5kYXJkIHNvbHV0aW9ucyBhcmUgcmVhZHkKLWFuZCB3aWRlbHkgZGVwbG95ZWQsIHRoZSBrZXJuZWwncyBsZWdhY3kgZWFybHkgYm9vdCBjb2RlIHdpbGwgYmVjb21lIG9ic29sZXRlCi1hbmQgYSBjYW5kaWRhdGUgZm9yIHRoZSBmZWF0dXJlIHJlbW92YWwgc2NoZWR1bGUuCitwYWNrYWdlcyB0byBkcm9wIGludG8gYSBrZXJuZWwgYnVpbGQuCiAKLUJ1dCB0aGF0J3MgYSB3aGlsZSBvZmYgeWV0LgorVGhlIGtsaWJjIHBhY2thZ2UgaGFzIG5vdyBiZWVuIGFjY2VwdGVkIGludG8gQW5kcmV3IE1vcnRvbidzIDIuNi4xNy1tbSB0cmVlLgorVGhlIGtlcm5lbCdzIGN1cnJlbnQgZWFybHkgYm9vdCBjb2RlIChwYXJ0aXRpb24gZGV0ZWN0aW9uLCBldGMpIHdpbGwgcHJvYmFibHkKK2JlIG1pZ3JhdGVkIGludG8gYSBkZWZhdWx0IGluaXRyYW1mcywgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCB1c2VkIGJ5IHRoZQora2VybmVsIGJ1aWxkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CmluZGV4IDNhMmU1NTIuLjlkM2FlZDYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKQEAgLTExMyw4ICsxMTMsOCBAQAogc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGZzX2ZsYWdzOwotICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKigqZ2V0X3NiKSAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICopOworICAgICAgICBzdHJ1Y3QgaW50ICgqZ2V0X3NiKSAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKICAgICAgICAgdm9pZCAoKmtpbGxfc2IpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAgICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyOwogICAgICAgICBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIG5leHQ7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgaW50ICgqc3luY19mcykoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOwogICAgICAgICB2b2lkICgqd3JpdGVfc3VwZXJfbG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogICAgICAgICB2b2lkICgqdW5sb2NrZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci0gICAgICAgIGludCAoKnN0YXRmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKKyAgICAgICAgaW50ICgqc3RhdGZzKSAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKICAgICAgICAgaW50ICgqcmVtb3VudF9mcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKICAgICAgICAgdm9pZCAoKmNsZWFyX2lub2RlKSAoc3RydWN0IGlub2RlICopOwogICAgICAgICB2b2lkICgqdW1vdW50X2JlZ2luKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FiaXR1Z3VydQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNkYjUyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUKQEAgLTAsMCArMSw1OSBAQAorS2VybmVsIGRyaXZlciBhYml0dWd1cnUKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBBYml0IHVHdXJ1IChIYXJkd2FyZSBNb25pdG9yIHBhcnQgb25seSkKKyAgICBQcmVmaXg6ICdhYml0dWd1cnUnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IElTQSAweDBFMAorICAgIERhdGFzaGVldDogTm90IGF2YWlsYWJsZSwgdGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gcmV2ZXJzZSBlbmdpbmVlcmluZy4KKwlBICJEYXRhc2hlZXQiIGhhcyBiZWVuIHdyaXR0ZW4gYmFzZWQgb24gdGhlIHJldmVyc2UgZW5naW5lZXJpbmcgaXQKKwlzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBzYW1lIGRpciBhcyB0aGlzIGZpbGUgdW5kZXIgdGhlIG5hbWUKKwlhYml0dWd1cnUtZGF0YXNoZWV0LgorCitBdXRob3JzOgorCUhhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiwKKwkoSW5pdGlhbCByZXZlcnNlIGVuZ2luZWVyaW5nIGRvbmUgYnkgT2xsZSBTYW5kYmVyZworCSA8b2xsZWJ1bGxAZ21haWwuY29tPikKKworCitNb2R1bGUgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0KKworKiBmb3JjZTogYm9vbAkJRm9yY2UgZGV0ZWN0aW9uLiBOb3RlIHRoaXMgcGFyYW1ldGVyIG9ubHkgY2F1c2VzIHRoZQorCQkJZGV0ZWN0aW9uIHRvIGJlIHNraXBwZWQsIGlmIHRoZSB1R3VydSBjYW4ndCBiZSByZWFkCisJCQl0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIChpbnNtb2QpIHdpbGwgc3RpbGwgZmFpbC4KKyogZmFuX3NlbnNvcnM6IGludAlUZWxsIHRoZSBkcml2ZXIgaG93IG1hbnkgZmFuIHNwZWVkIHNlbnNvcnMgdGhlcmUgYXJlCisJCQlvbiB5b3VyIG1vdGhlcmJvYXJkLiBEZWZhdWx0OiAwIChhdXRvZGV0ZWN0KS4KKyogcHdtczogaW50CQlUZWxsIHRoZSBkcml2ZXIgaG93IG1hbnkgZmFuIHNwZWVkIGNvbnRyb2xzIChmYW4KKwkJCXB3bXMpIHlvdXIgbW90aGVyYm9hcmQgaGFzLiBEZWZhdWx0OiAwIChhdXRvZGV0ZWN0KS4KKyogdmVyYm9zZTogaW50CQlIb3cgdmVyYm9zZSBzaG91bGQgdGhlIGRyaXZlciBiZT8gKDAtMyk6CisJCQkgICAwIG5vcm1hbCBvdXRwdXQKKwkJCSAgIDEgKyB2ZXJib3NlIGVycm9yIHJlcG9ydGluZworCQkJICAgMiArIHNlbnNvcnMgdHlwZSBwcm9iaW5nIGluZm9cbiIKKwkJCSAgIDMgKyByZXRyeWFibGUgZXJyb3IgcmVwb3J0aW5nCisJCQlEZWZhdWx0OiAyICh0aGUgZHJpdmVyIGlzIHN0aWxsIGluIHRoZSB0ZXN0aW5nIHBoYXNlKQorCitOb3RpY2UgaWYgeW91IG5lZWQgYW55IG9mIHRoZSBmaXJzdCB0aHJlZSBvcHRpb25zIGFib3ZlIHBsZWFzZSBpbnNtb2QgdGhlCitkcml2ZXIgd2l0aCB2ZXJib3NlIHNldCB0byAzIGFuZCBtYWlsIG1lIDxqLncuci5kZWdvZWRlQGhocy5ubD4gdGhlIG91dHB1dCBvZjoKK2RtZXNnIHwgZ3JlcCBhYml0dWd1cnUKKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGhhcmR3YXJlIG1vbml0b3JpbmcgZmVhdHVyZXMgb2YgdGhlIEFiaXQgdUd1cnUgY2hpcAorZm91bmQgb24gQWJpdCB1R3VydSBmZWF0dXJpbmcgbW90aGVyYm9hcmRzIChtb3N0IG1vZGVybiBBYml0IG1vdGhlcmJvYXJkcykuCisKK1RoZSB1R3VydSBjaGlwIGluIHJlYWxpdHkgaXMgYSBXaW5ib25kIFc4M0w5NTBEIGluIGRpc2d1aXNlIChkZXNwaXRlIEFiaXQKK2NsYWltaW5nIGl0IGlzICJhIG5ldyBtaWNyb3Byb2Nlc3NvciBkZXNpZ25lZCBieSB0aGUgQUJJVCBFbmdpbmVlcnMiKS4KK1VuZm9ydHVuYXRseSB0aGlzIGRvZXNuJ3QgaGVscCBzaW5jZSB0aGUgVzgzTDk1MEQgaXMgYSBnZW5lcmljCittaWNyb2NvbnRyb2xsZXIgd2l0aCBhIGN1c3RvbSBBYml0IGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gaXQuCisKK0Rlc3BpdGUgQWJpdCBub3QgcmVsZWFzaW5nIGFueSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHVHdXJ1LCBPbGxlCitTYW5kYmVyZyA8b2xsZWJ1bGxAZ21haWwuY29tPiBoYXMgbWFuYWdlZCB0byByZXZlcnNlIGVuZ2luZWVyIHRoZSBzZW5zb3IgcGFydAorb2YgdGhlIHVHdXJ1LiBXaXRob3V0IGhpcyB3b3JrIHRoaXMgZHJpdmVyIHdvdWxkIG5vdCBoYXZlIGJlZW4gcG9zc2libGUuCisKK0tub3duIElzc3VlcworLS0tLS0tLS0tLS0tCisKK1RoZSB2b2x0YWdlIGFuZCBmcmVxdWVuY3kgY29udHJvbCBwYXJ0cyBvZiB0aGUgQWJpdCB1R3VydSBhcmUgbm90IHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldCBiL0RvY3VtZW50YXRpb24vaHdtb24vYWJpdHVndXJ1LWRhdGFzaGVldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY1YTliCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9hYml0dWd1cnUtZGF0YXNoZWV0CkBAIC0wLDAgKzEsMzEyIEBACit1R3VydSBkYXRhc2hlZXQKKz09PT09PT09PT09PT09PQorCitGaXJzdCBvZiBhbGwsIHdoYXQgSSBrbm93IGFib3V0IHVHdXJ1IGlzIG5vIGZhY3QgYmFzZWQgb24gYW55IGhlbHAsIGhpbnRzIG9yCitkYXRhc2hlZXQgZnJvbSBBYml0LiBUaGUgZGF0YSBJIGhhdmUgZ290IG9uIHVHdXJ1IGhhdmUgSSBhc3NlbWJsZWQgdGhyb3VnaAorbXkgd2VhayBrbm93bGVkZ2UgaW4gImJhY2t3YXJkcyBlbmdpbmVlcmluZyIuCitBbmQganVzdCBmb3IgdGhlIHJlY29yZCwgeW91IG1heSBoYXZlIG5vdGljZWQgdUd1cnUgaXNuJ3QgYSBjaGlwIGRldmVsb3BlZCBieQorQWJpdCwgYXMgdGhleSBjbGFpbSBpdCB0byBiZS4gSXQncyByZWFseSBqdXN0IGFuIG1pY3JvcHJvY2Vzc29yICh1QykgY3JlYXRlZCBieQorV2luYm9uZCAoVzgzTDk1MEQpLiBBbmQgbm8sIHJlYWRpbmcgdGhlIG1hbnVhbCBmb3IgdGhpcyBzcGVjaWZpYyB1QyBvcgorbWFpbGluZyAgV2luZGJvbmQgZm9yIGhlbHAgd29uJ3QgZ2l2ZSBhbnkgdXNlZnVsbCBkYXRhIGFib3V0IHVHdXJ1LCBhcyBpdCBpcwordGhlIHByb2dyYW0gaW5zaWRlIHRoZSB1QyB0aGF0IGlzIHJlc3BvbmRpbmcgdG8gY2FsbHMuCisKK09sbGUgU2FuZGJlcmcgPG9sbGVidWxsQGdtYWlsLmNvbT4sIDIwMDUtMDUtMjUKKworCitPcmlnaW5hbCB2ZXJzaW9uIGJ5IE9sbGUgU2FuZGJlcmcgd2hvIGRpZCB0aGUgaGVhdnkgbGlmdGluZyBvZiB0aGUgaW5pdGlhbAorcmV2ZXJzZSBlbmdpbmVlcmluZy4gVGhpcyB2ZXJzaW9uIGhhcyBiZWVuIGFsbW9zdCBmdWxseSByZXdyaXR0ZW4gZm9yIGNsYXJpdHkKK2FuZCBleHRlbmRlZCB3aXRoIHdyaXRlIHN1cHBvcnQgYW5kIGluZm8gb24gbW9yZSBkYXRhYmFua3MsIHRoZSB3cml0ZSBzdXBwb3J0CitpcyBvbmNlIGFnYWluIHJldmVyc2UgZW5naW5lZXJlZCBieSBPbGxlIHRoZSBhZGRpdGlvbmFsIGRhdGFiYW5rcyBoYXZlIGJlZW4KK3JldmVyc2UgZW5naW5lZXJlZCBieSBtZS4gSSB3b3VsZCBsaWtlIHRvIGV4cHJlc3MgbXkgdGhhbmtzIHRvIE9sbGUsIHRoaXMKK2RvY3VtZW50IGFuZCB0aGUgTGludXggZHJpdmVyIGNvdWxkIG5vdCBoYXZlIGJlZW4gd3JpdHRlbiB3aXRob3V0IGhpcyBlZmZvcnRzLgorCitOb3RlOiBiZWNhdXNlIG9mIHRoZSBsYWNrIG9mIHNwZWNzIG9ubHkgdGhlIHNlbnNvcnMgcGFydCBvZiB0aGUgdUd1cnUgaXMKK2Rlc2NyaWJlZCBoZXJlIGFuZCBub3QgdGhlIENQVSAvIFJBTSAvIGV0YyB2b2x0YWdlICYgZnJlcXVlbmN5IGNvbnRyb2wuCisKK0hhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPiwgMjgtMDEtMjAwNgorCisKK0RldGVjdGlvbgorPT09PT09PT09CisKK0FzIGZhciBhcyBrbm93biB0aGUgdUd1cnUgaXMgYWx3YXlzIHBsYWNlZCBhdCBhbmQgdXNpbmcgdGhlIChJU0EpIEkvTy1wb3J0cworMHhFMCBhbmQgMHhFNCwgc28gd2UgZG9uJ3QgaGF2ZSB0byBzY2FuIGFueSBwb3J0LXJhbmdlLCBqdXN0IGNoZWNrIHdoYXQgdGhlIHR3bworcG9ydHMgYXJlIGhvbGRpbmcgZm9yIGRldGVjdGlvbi4gV2Ugd2lsbCByZWZlciB0byAweEUwIGFzIENNRCAoY29tbWFuZC1wb3J0KQorYW5kIDB4RTQgYXMgREFUQSBiZWNhdXNlIEFiaXQgcmVmZXJzIHRvIHRoZW0gd2l0aCB0aGVzZSBuYW1lcy4KKworSWYgREFUQSBob2xkcyAweDAwIG9yIDB4MDggYW5kIENNRCBob2xkcyAweDAwIG9yIDB4QUMgYW4gdUd1cnUgY291bGQgYmUKK3ByZXNlbnQuIFdlIGhhdmUgdG8gY2hlY2sgZm9yIHR3byBkaWZmZXJlbnQgdmFsdWVzIGF0IGRhdGEtcG9ydCwgYmVjYXVzZQorYWZ0ZXIgYSByZWJvb3QgdUd1cnUgd2lsbCBob2xkIDB4MDAgaGVyZSwgYnV0IGlmIHRoZSBkcml2ZXIgaXMgcmVtb3ZlZCBhbmQKK2xhdGVyIG9uIGF0dGFjaGVkIGFnYWluIGRhdGEtcG9ydCB3aWxsIGhvbGQgMHgwOCwgbW9yZSBhYm91dCB0aGlzIGxhdGVyLgorCitBZnRlciB3aWRlciB0ZXN0aW5nIG9mIHRoZSBMaW51eCBrZXJuZWwgZHJpdmVyIHNvbWUgdmFyaWFudHMgb2YgdGhlIHVHdXJ1IGhhdmUKK3R1cm5lZCB1cCB3aGljaCB3aWxsIGhvbGQgMHgwMCBpbnN0ZWFkIG9mIDB4QUMgYXQgdGhlIENNRCBwb3J0LCB0aHVzIHdlIGFsc28KK2hhdmUgdG8gdGVzdCBDTUQgZm9yIHR3byBkaWZmZXJlbnQgdmFsdWVzLiBPbiB0aGVzZSB1R3VydSdzIERBVEEgd2lsbCBpbml0YWxseQoraG9sZCAweDA5IGFuZCB3aWxsIG9ubHkgaG9sZCAweDA4IGFmdGVyIHJlYWRpbmcgQ01EIGZpcnN0LCBzbyBDTUQgbXVzdCBiZSByZWFkCitmaXJzdCEKKworVG8gYmUgcmVhbGx5IHN1cmUgYW4gdUd1cnUgaXMgcHJlc2VudCBhIHRlc3QgcmVhZCBvZiBvbmUgb3IgbW9yZSByZWdpc3Rlcgorc2V0cyBzaG91bGQgYmUgZG9uZS4KKworCitSZWFkaW5nIC8gV3JpdGluZworPT09PT09PT09PT09PT09PT0KKworQWRkcmVzc2luZworLS0tLS0tLS0tLQorCitUaGUgdUd1cnUgaGFzIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBhZGRyZXNzaW5nIGxldmVscy4gVGhlIGZpcnN0IGFkZHJlc3NpbmcKK2xldmVsIHdlIHdpbGwgY2FsbCBiYW5rcy4gQSBiYW5rIGhvbGRzIGRhdGEgZm9yIG9uZSBvciBtb3JlIHNlbnNvcnMuIFRoZSBkYXRhCitpbiBhIGJhbmsgZm9yIGEgc2Vuc29yIGlzIG9uZSBvciBtb3JlIGJ5dGVzIGxhcmdlLgorCitUaGUgbnVtYmVyIG9mIGJ5dGVzIGlzIGZpeGVkIGZvciBhIGdpdmVuIGJhbmssIHlvdSBzaG91bGQgYWx3YXlzIHJlYWQgb3Igd3JpdGUKK3RoYXQgbWFueSBieXRlcywgcmVhZGluZyAvIHdyaXRpbmcgbW9yZSB3aWxsIGZhaWwsIHRoZSByZXN1bHRzIHdoZW4gd3JpdGluZworbGVzcyB0aGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIGEgZ2l2ZW4gYmFuayBhcmUgdW5kZXRlcm1pbmVkLgorCitTZWUgYmVsb3cgZm9yIGFsbCBrbm93biBiYW5rIGFkZHJlc3NlcywgbnVtYmVycyBvZiBzZW5zb3JzIGluIHRoYXQgYmFuaywKK251bWJlciBvZiBieXRlcyBkYXRhIHBlciBzZW5zb3IgYW5kIGNvbnRlbnRzL21lYW5pbmcgb2YgdGhvc2UgYnl0ZXMuCisKK0FsdGhvdWdoIGJvdGggdGhpcyBkb2N1bWVudCBhbmQgdGhlIGtlcm5lbCBkcml2ZXIgaGF2ZSBrZXB0IHRoZSBzZW5zb3IKK3Rlcm1pbm9saWd5IGZvciB0aGUgYWRkcmVzc2luZyB3aXRoaW4gYSBiYW5rIHRoaXMgaXMgbm90IDEwMCUgY29ycmVjdCwgaW4KK2JhbmsgMHgyNCBmb3IgZXhhbXBsZSB0aGUgYWRkcmVzc2luZyB3aXRoaW4gdGhlIGJhbmsgc2VsZWN0cyBhIFBXTSBvdXRwdXQgbm90CithIHNlbnNvci4KKworTm90aWNlIHRoYXQgc29tZSBiYW5rcyBoYXZlIGJvdGggYSByZWFkIGFuZCBhIHdyaXRlIGFkZHJlc3MgdGhpcyBpcyBob3cgdGhlCit1R3VydSBkZXRlcm1pbmVzIGlmIGEgcmVhZCBmcm9tIG9yIGEgd3JpdGUgdG8gdGhlIGJhbmsgaXMgdGFraW5nIHBsYWNlLCB0aHVzCit3aGVuIHJlYWRpbmcgeW91IHNob3VsZCBhbHdheXMgdXNlIHRoZSByZWFkIGFkZHJlc3MgYW5kIHdoZW4gd3JpdGluZyB0aGUKK3dyaXRlIGFkZHJlc3MuIFRoZSB3cml0ZSBhZGRyZXNzIGlzIGFsd2F5cyBvbmUgKDEpIG1vcmUgdGhlbiB0aGUgcmVhZCBhZGRyZXNzLgorCisKK3VHdXJ1IHJlYWR5CistLS0tLS0tLS0tLQorCitCZWZvcmUgeW91IGNhbiByZWFkIGZyb20gb3Igd3JpdGUgdG8gdGhlIHVHdXJ1IHlvdSBtdXN0IGZpcnN0IHB1dCB0aGUgdUd1cnUKK2luICJyZWFkeSIgbW9kZS4KKworVG8gcHV0IHRoZSB1R3VydSBpbiByZWFkeSBtb2RlIGZpcnN0IHdyaXRlIDB4MDAgdG8gREFUQSBhbmQgdGhlbiB3YWl0IGZvciBEQVRBCit0byBob2xkIDB4MDksIERBVEEgc2hvdWxkIHJlYWQgMHgwOSB3aXRoaW4gMjUwIHJlYWQgY3ljbGVzLgorCitOZXh0IENNRCBfbXVzdF8gYmUgcmVhZCBhbmQgc2hvdWxkIGhvbGQgMHhBQywgdXN1YWxseSBDTUQgd2lsbCBob2xkIDB4QUMgdGhlCitmaXJzdCByZWFkIGJ1dCBzb21ldGltZXMgaXQgdGFrZXMgYSB3aGlsZSBiZWZvcmUgQ01EIGhvbGRzIDB4QUMgYW5kIHRodXMgaXQKK2hhcyB0byBiZSByZWFkIGEgbnVtYmVyIG9mIHRpbWVzIChtYXggNTApLgorCitBZnRlciByZWFkaW5nIENNRCwgREFUQSBzaG91bGQgaG9sZCAweDA4IHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVHdXJ1IGlzIHJlYWR5Citmb3IgaW5wdXQuIEFzIGFib3ZlIERBVEEgd2lsbCB1c3VhbGx5IGhvbGQgMHgwOCB0aGUgZmlyc3QgcmVhZCBidXQgbm90IGFsd2F5cy4KK1RoaXMgc3RlcCBjYW4gYmUgc2tpcHBlZCwgYnV0IGl0IGlzIHVuZGV0ZXJtaW5lZCB3aGF0IGhhcHBlbnMgaWYgdGhlIHVHdXJ1IGhhcworbm90IHlldCByZXBvcnRlZCAweDA4IGF0IERBVEEgYW5kIHlvdSBwcm9jZWVkIHdpdGggd3JpdGluZyBhIGJhbmsgYWRkcmVzcy4KKworCitTZW5kaW5nIGJhbmsgYW5kIHNlbnNvciBhZGRyZXNzZXMgdG8gdGhlIHVHdXJ1CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpcnN0IHRoZSB1R3VydSBtdXN0IGJlIGluICJyZWFkeSIgbW9kZSBhcyBkZXNjcmliZWQgYWJvdmUsIERBVEEgc2hvdWxkIGhvbGQKKzB4MDggaW5kaWNhdGluZyB0aGF0IHRoZSB1R3VydSB3YW50cyBpbnB1dCwgaW4gdGhpcyBjYXNlIHRoZSBiYW5rIGFkZHJlc3MuCisKK05leHQgd3JpdGUgdGhlIGJhbmsgYWRkcmVzcyB0byBEQVRBLiBBZnRlciB0aGUgYmFuayBhZGRyZXNzIGhhcyBiZWVuIHdyaXR0ZW4KK3dhaXQgZm9yIHRvIERBVEEgdG8gaG9sZCAweDA4IGFnYWluIGluZGljYXRpbmcgdGhhdCBpdCB3YW50cyAvIGlzIHJlYWR5IGZvcgorbW9yZSBpbnB1dCAobWF4IDI1MCByZWFkcykuCisKK09uY2UgREFUQSBob2xkcyAweDA4IGFnYWluIHdyaXRlIHRoZSBzZW5zb3IgYWRkcmVzcyB0byBDTUQuCisKKworUmVhZGluZworLS0tLS0tLQorCitGaXJzdCBzZW5kIHRoZSBiYW5rIGFuZCBzZW5zb3IgYWRkcmVzc2VzIGFzIGRlc2NyaWJlZCBhYm92ZS4KK1RoZW4gZm9yIGVhY2ggYnl0ZSBvZiBkYXRhIHlvdSB3YW50IHRvIHJlYWQgd2FpdCBmb3IgREFUQSB0byBob2xkIDB4MDEKK3doaWNoIGluZGljYXRlcyB0aGF0IHRoZSB1R3VydSBpcyByZWFkeSB0byBiZSByZWFkIChtYXggMjUwIHJlYWRzKSBhbmQgb25jZQorREFUQSBob2xkcyAweDAxIHJlYWQgdGhlIGJ5dGUgZnJvbSBDTUQuCisKK09uY2UgYWxsIGJ5dGVzIGhhdmUgYmVlbiByZWFkIGRhdGEgd2lsbCBob2xkIDB4MDksIGJ1dCB0aGVyZSBpcyBubyByZWFzb24gdG8KK3Rlc3QgZm9yIHRoaXMuIE5vdGljZSB0aGF0IHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgYmFuayBhZGRyZXNzIGRlcGVuZGVudCBzZWUKK2Fib3ZlIGFuZCBiZWxvdy4KKworQWZ0ZXIgY29tcGxldGluZyBhIHN1Y2Nlc3NmdWxsIHJlYWQgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KK3JlYWR5IG1vZGUsIHNvIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHJlYWQgLyB3cml0ZSBjeWNsZS4gVGhpcyB3YXkKK2lmIHlvdXIgcHJvZ3JhbSAvIGRyaXZlciBpcyB1bmxvYWRlZCBhbmQgbGF0ZXIgbG9hZGVkIGFnYWluIHRoZSBkZXRlY3Rpb24KK2FsZ29yaXRobSBkZXNjcmliZWQgYWJvdmUgd2lsbCBzdGlsbCB3b3JrLgorCisKKworV3JpdGluZworLS0tLS0tLQorCitGaXJzdCBzZW5kIHRoZSBiYW5rIGFuZCBzZW5zb3IgYWRkcmVzc2VzIGFzIGRlc2NyaWJlZCBhYm92ZS4KK1RoZW4gZm9yIGVhY2ggYnl0ZSBvZiBkYXRhIHlvdSB3YW50IHRvIHdyaXRlIHdhaXQgZm9yIERBVEEgdG8gaG9sZCAweDAwCit3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdUd1cnUgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbiAobWF4IDI1MCByZWFkcykgYW5kCitvbmNlIERBVEEgaG9sZHMgMHgwMCB3cml0ZSB0aGUgYnl0ZSB0byBDTUQuCisKK09uY2UgYWxsIGJ5dGVzIGhhdmUgYmVlbiB3cml0dGVuIHdhaXQgZm9yIERBVEEgdG8gaG9sZCAweDAxIChtYXggMjUwIHJlYWRzKQorZG9uJ3QgYXNrIHdoeSB0aGlzIGlzIHRoZSB3YXkgaXQgaXMuCisKK09uY2UgREFUQSBob2xkcyAweDAxIHJlYWQgQ01EIGl0IHNob3VsZCBob2xkIDB4QUMgbm93LgorCitBZnRlciBjb21wbGV0aW5nIGEgc3VjY2Vzc2Z1bGwgd3JpdGUgaXQgaXMgYWR2aXNlZCB0byBwdXQgdGhlIHVHdXJ1IGJhY2sgaW4KK3JlYWR5IG1vZGUsIHNvIHRoYXQgaXQgaXMgcmVhZHkgZm9yIHRoZSBuZXh0IHJlYWQgLyB3cml0ZSBjeWNsZS4gVGhpcyB3YXkKK2lmIHlvdXIgcHJvZ3JhbSAvIGRyaXZlciBpcyB1bmxvYWRlZCBhbmQgbGF0ZXIgbG9hZGVkIGFnYWluIHRoZSBkZXRlY3Rpb24KK2FsZ29yaXRobSBkZXNjcmliZWQgYWJvdmUgd2lsbCBzdGlsbCB3b3JrLgorCisKK0dvdGNoYXMKKy0tLS0tLS0KKworQWZ0ZXIgd2lkZXIgdGVzdGluZyBvZiB0aGUgTGludXgga2VybmVsIGRyaXZlciBzb21lIHZhcmlhbnRzIG9mIHRoZSB1R3VydSBoYXZlCit0dXJuZWQgdXAgd2hpY2ggZG8gbm90IGhvbGQgMHgwOCBhdCBEQVRBIHdpdGhpbiAyNTAgcmVhZHMgYWZ0ZXIgd3JpdGluZyB0aGUKK2JhbmsgYWRkcmVzcy4gV2l0aCB0aGVzZSB2ZXJzaW9ucyB0aGlzIGhhcHBlbnMgcXVpdGUgZnJlcXVlbnQsIHVzaW5nIGxhcmdlcgordGltZW91dHMgZG9lc24ndCBoZWxwLCB0aGV5IGp1c3QgZ28gb2ZmbGluZSBmb3IgYSBzZWNvbmQgb3IgMiwgZG9pbmcgc29tZQoraW50ZXJuYWwgY2FsbGlicmF0aW9uIG9yIHdoYXRldmVyLiBZb3VyIGNvZGUgc2hvdWxkIGJlIHByZXBhcmVkIHRvIGhhbmRsZQordGhpcyBhbmQgaW4gY2FzZSBvZiBubyByZXNwb25zZSBpbiB0aGlzIHNwZWNpZmljIGNhc2UganVzdCBnb3RvIHNsZWVwIGZvciBhCit3aGlsZSBhbmQgdGhlbiByZXRyeS4KKworCitBZGRyZXNzIE1hcAorPT09PT09PT09PT0KKworQmFuayAweDIwIEFsYXJtcyAoUikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGJhbmsgY29udGFpbnMgMCBzZW5zb3JzLCBpb3cgdGhlIHNlbnNvciBhZGRyZXNzIGlzIGlnbm9yZWQgKGJ1dCBtdXN0IGJlCit3cml0dGVuKSBqdXN0IHVzZSAwLiBCYW5rIDB4MjAgY29udGFpbnMgMyBieXRlczoKKworQnl0ZSAwOgorVGhpcyBieXRlIGhvbGRzIHRoZSBhbGFybSBmbGFncyBmb3Igc2Vuc29yIDAtNyBvZiBTZW5zb3IgQmFuazEsIHdpdGggYml0IDAKK2NvcnJlc3BvbmRpbmcgdG8gc2Vuc29yIDAsIDEgdG8gMSwgZXRjLgorCitCeXRlIDE6CitUaGlzIGJ5dGUgaG9sZHMgdGhlIGFsYXJtIGZsYWdzIGZvciBzZW5zb3IgOC0xNSBvZiBTZW5zb3IgQmFuazEsIHdpdGggYml0IDAKK2NvcnJlc3BvbmRpbmcgdG8gc2Vuc29yIDgsIDEgdG8gOSwgZXRjLgorCitCeXRlIDI6CitUaGlzIGJ5dGUgaG9sZHMgdGhlIGFsYXJtIGZsYWdzIGZvciBzZW5zb3IgMC01IG9mIFNlbnNvciBCYW5rMiwgd2l0aCBiaXQgMAorY29ycmVzcG9uZGluZyB0byBzZW5zb3IgMCwgMSB0byAxLCBldGMuCisKKworQmFuayAweDIxIFNlbnNvciBCYW5rMSBWYWx1ZXMgLyBSZWFkaW5ncyAoUikKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGJhbmsgY29udGFpbnMgMTYgc2Vuc29ycywgZm9yIGVhY2ggc2Vuc29yIGl0IGNvbnRhaW5zIDEgYnl0ZS4KK1NvIGZhciB0aGUgZm9sbG93aW5nIHNlbnNvcnMgYXJlIGtub3duIHRvIGJlIGF2YWlsYWJsZSBvbiBhbGwgbW90aGVyYm9hcmRzOgorU2Vuc29yICAwIENQVSB0ZW1wCitTZW5zb3IgIDEgU1lTIHRlbXAKK1NlbnNvciAgMyBDUFUgY29yZSB2b2x0CitTZW5zb3IgIDQgRERSIHZvbHQKK1NlbnNvciAxMCBERFIgVnR0IHZvbHQKK1NlbnNvciAxNSBQV00gdGVtcAorCitCeXRlIDA6CitUaGlzIGJ5dGUgaG9sZHMgdGhlIHJlYWRpbmcgZnJvbSB0aGUgc2Vuc29yLiBTZW5zb3JzIGluIEJhbmsxIGNhbiBiZSBib3RoCit2b2x0IGFuZCB0ZW1wIHNlbnNvcnMsIHRoaXMgaXMgbW90aGVyYm9hcmQgc3BlY2lmaWMuIFRoZSB1R3VydSBob3dldmVyIGRvZXMKK3NlZW0gdG8ga25vdyAoYmUgcHJvZ3JhbW1lZCB3aXRoKSB3aGF0IGtpbmRvZmYgc2Vuc29yIGlzIGF0dGFjaGVkIHNlZSBTZW5zb3IKK0JhbmsxIFNldHRpbmdzIGRlc2NyaXB0aW9uLgorCitWb2x0IHNlbnNvcnMgdXNlIGEgbGluZWFyIHNjYWxlLCBhIHJlYWRpbmcgMCBjb3JyZXNwb25kcyB3aXRoIDAgdm9sdCBhbmQgYQorcmVhZGluZyBvZiAyNTUgd2l0aCAzNDk0IG1WLiBUaGUgc2Vuc29ycyBmb3IgaGlnaGVyIHZvbHRhZ2VzIGhvd2V2ZXIgYXJlCitjb25uZWN0ZWQgdGhyb3VnaCBhIGRpdmlzaW9uIGNpcmN1aXQuIFRoZSBjdXJyZW50bHkga25vd24gZGl2aXNpb24gY2lyY3VpdHMKK2luIHVzZSByZXN1bHQgaW4gcmFuZ2VzIG9mOiAwLTQzNjFtViwgMC02MjQ4bVYgb3IgMC0xNDUxMG1WLiAzLjMgdm9sdCBzb3VyY2VzCit1c2UgdGhlIDAtNDM2MW1WIHJhbmdlLCA1IHZvbHQgdGhlIDAtNjI0OG1WIGFuZCAxMiB2b2x0IHRoZSAwLTE0NTEwbVYgLgorCitUZW1wIHNlbnNvcnMgYWxzbyB1c2UgYSBsaW5lYXIgc2NhbGUsIGEgcmVhZGluZyBvZiAwIGNvcnJlc3BvbmRzIHdpdGggMCBkZWdyZWUKK0NlbHNpdXMgYW5kIGEgcmVhZGluZyBvZiAyNTUgd2l0aCBhIHJlYWRpbmcgb2YgMjU1IGRlZ3JlZXMgQ2Vsc2l1cy4KKworCitCYW5rIDB4MjIgU2Vuc29yIEJhbmsxIFNldHRpbmdzIChSKQorQmFuayAweDIzIFNlbnNvciBCYW5rMSBTZXR0aW5ncyAoVykKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgYmFuayBjb250YWlucyAxNiBzZW5zb3JzLCBmb3IgZWFjaCBzZW5zb3IgaXQgY29udGFpbnMgMyBieXRlcy4gRWFjaAorc2V0IG9mIDMgYnl0ZXMgY29udGFpbnMgdGhlIHNldHRpbmdzIGZvciB0aGUgc2Vuc29yIHdpdGggdGhlIHNhbWUgc2Vuc29yCithZGRyZXNzIGluIEJhbmsgMHgyMSAuCisKK0J5dGUgMDoKK0FsYXJtIGJlaGF2aW91ciBmb3IgdGhlIHNlbGVjdGVkIHNlbnNvci4gQSAxIGVuYWJsZXMgdGhlIGRlc2NyaWJlZCBiZWhhdmlvdXIuCitCaXQgMDogR2l2ZSBhbiBhbGFybSBpZiBtZWFzdXJlZCB0ZW1wIGlzIG92ZXIgdGhlIHdhcm5pbmcgdGhyZXNob2xkCShSVykgKgorQml0IDE6IEdpdmUgYW4gYWxhcm0gaWYgbWVhc3VyZWQgdm9sdCBpcyBvdmVyIHRoZSBtYXggdGhyZXNob2xkCQkoUlcpICoqCitCaXQgMjogR2l2ZSBhbiBhbGFybSBpZiBtZWFzdXJlZCB2b2x0IGlzIHVuZGVyIHRoZSBtaW4gdGhyZXNob2xkCShSVykgKioKK0JpdCAzOiBCZWVwIGlmIGFsYXJtCQkJCQkJCShSVykKK0JpdCA0OiAxIGlmIGFsYXJtIGNhdXNlIG1lYXN1cmVkIHRlbXAgaXMgb3ZlciB0aGUgd2FybmluZyB0aHJlc2hvbGQJKFIpCitCaXQgNTogMSBpZiBhbGFybSBjYXVzZSBtZWFzdXJlZCB2b2x0IGlzIG92ZXIgdGhlIG1heCB0aHJlc2hvbGQJCShSKQorQml0IDY6IDEgaWYgYWxhcm0gY2F1c2UgbWVhc3VyZWQgdm9sdCBpcyB1bmRlciB0aGUgbWluIHRocmVzaG9sZAkoUikKK0JpdCA3OiBWb2x0IHNlbnNvcjogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGVuIDQgc2Vjb25kcwkoUlcpCisgICAgICAgVGVtcCBzZW5zb3I6IFNodXRkb3duIGlmIHRlbXAgaXMgb3ZlciB0aGUgc2h1dGRvd24gdGhyZXNob2xkCShSVykKKworKiAgVGhpcyBiaXQgaXMgb25seSBob25vcmVkL3VzZWQgYnkgdGhlIHVHdXJ1IGlmIGEgdGVtcCBzZW5zb3IgaXMgY29ubmVjdGVkCisqKiBUaGlzIGJpdCBpcyBvbmx5IGhvbm9yZWQvdXNlZCBieSB0aGUgdUd1cnUgaWYgYSB2b2x0IHNlbnNvciBpcyBjb25uZWN0ZWQKK05vdGUgd2l0aCBzb21lIHRyaWNrZXJ5IHRoaXMgY2FuIGJlIHVzZWQgdG8gZmluZCBvdXQgd2hhdCBraW5kYSBzZW5zb3IgaXMKK2RldGVjdGVkIHNlZSB0aGUgTGludXgga2VybmVsIGRyaXZlciBmb3IgYW4gZXhhbXBsZSB3aXRoIG1hbnkgY29tbWVudHMgb24KK2hvdyB0b2RvIHRoaXMuCisKK0J5dGUgMToKK1RlbXAgc2Vuc29yOiB3YXJuaW5nIHRocmVzaG9sZCAgKHNjYWxlIGFzIGJhbmsgMHgyMSkKK1ZvbHQgc2Vuc29yOiBtaW4gdGhyZXNob2xkICAgICAgKHNjYWxlIGFzIGJhbmsgMHgyMSkKKworQnl0ZSAyOgorVGVtcCBzZW5zb3I6IHNodXRkb3duIHRocmVzaG9sZCAoc2NhbGUgYXMgYmFuayAweDIxKQorVm9sdCBzZW5zb3I6IG1heCB0aHJlc2hvbGQgICAgICAoc2NhbGUgYXMgYmFuayAweDIxKQorCisKK0JhbmsgMHgyNCBQV00gb3V0cHV0cyBmb3IgRkFOJ3MgKFIpCitCYW5rIDB4MjUgUFdNIG91dHB1dHMgZm9yIEZBTidzIChXKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBiYW5rIGNvbnRhaW5zIDMgInNlbnNvcnMiLCBmb3IgZWFjaCBzZW5zb3IgaXQgY29udGFpbnMgNSBieXRlcy4KK1NlbnNvciAwIHVzdWFsbHkgY29udHJvbHMgdGhlIENQVSBmYW4KK1NlbnNvciAxIHVzdWFsbHkgY29udHJvbHMgdGhlIE5CIChvciBjaGlwc2V0IGZvciBzaW5nbGUgY2hpcCkgZmFuCitTZW5zb3IgMiB1c3VhbGx5IGNvbnRyb2xzIHRoZSBTeXN0ZW0gZmFuCisKK0J5dGUgMDoKK0ZsYWcgMHg4MCB0byBlbmFibGUgY29udHJvbCwgRmFuIHJ1bnMgYXQgMTAwJSB3aGVuIGRpc2FibGVkLgorbG93IG5pYmJsZSAodGVtcClzZW5zb3IgYWRkcmVzcyBhdCBiYW5rIDB4MjEgdXNlZCBmb3IgY29udHJvbC4KKworQnl0ZSAxOgorMC0yNTUgPSAwLTEydiAobGluZWFyKSwgc3BlY2lmeSB2b2x0YWdlIGF0IHdoaWNoIGZhbiB3aWxsIHJvdGF0ZSB3aGVuIHVuZGVyCitsb3cgdGhyZXNob2xkIHRlbXAgKHNwZWNpZmllZCBpbiBieXRlIDMpCisKK0J5dGUgMjoKKzAtMjU1ID0gMC0xMnYgKGxpbmVhciksIHNwZWNpZnkgdm9sdGFnZSBhdCB3aGljaCBmYW4gd2lsbCByb3RhdGUgd2hlbiBhYm92ZQoraGlnaCB0aHJlc2hvbGQgdGVtcCAoc3BlY2lmaWVkIGluIGJ5dGUgNCkKKworQnl0ZSAzOgorTG93IHRocmVzaG9sZCB0ZW1wICAoc2NhbGUgYXMgYmFuayAweDIxKQorCitieXRlIDQ6CitIaWdoIHRocmVzaG9sZCB0ZW1wIChzY2FsZSBhcyBiYW5rIDB4MjEpCisKKworQmFuayAweDI2IFNlbnNvcnMgQmFuazIgVmFsdWVzIC8gUmVhZGluZ3MgKFIpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBiYW5rIGNvbnRhaW5zIDYgc2Vuc29ycyAoQUZBSUspLCBmb3IgZWFjaCBzZW5zb3IgaXQgY29udGFpbnMgMSBieXRlLgorU28gZmFyIHRoZSBmb2xsb3dpbmcgc2Vuc29ycyBhcmUga25vd24gdG8gYmUgYXZhaWxhYmxlIG9uIGFsbCBtb3RoZXJib2FyZHM6CitTZW5zb3IgMDogQ1BVIGZhbiBzcGVlZAorU2Vuc29yIDE6IE5CIChvciBjaGlwc2V0IGZvciBzaW5nbGUgY2hpcCkgZmFuIHNwZWVkCitTZW5zb3IgMjogU1lTIGZhbiBzcGVlZAorCitCeXRlIDA6CitUaGlzIGJ5dGUgaG9sZHMgdGhlIHJlYWRpbmcgZnJvbSB0aGUgc2Vuc29yLiAwLTI1NSA9IDAtMTUzMDAgKGxpbmVhcikKKworCitCYW5rIDB4MjcgU2Vuc29ycyBCYW5rMiBTZXR0aW5ncyAoUikKK0JhbmsgMHgyOCBTZW5zb3JzIEJhbmsyIFNldHRpbmdzIChXKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgYmFuayBjb250YWlucyA2IHNlbnNvcnMgKEFGQUlLKSwgZm9yIGVhY2ggc2Vuc29yIGl0IGNvbnRhaW5zIDIgYnl0ZXMuCisKK0J5dGUgMDoKK0FsYXJtIGJlaGF2aW91ciBmb3IgdGhlIHNlbGVjdGVkIHNlbnNvci4gQSAxIGVuYWJsZXMgdGhlIGRlc2NyaWJlZCBiZWhhdmlvdXIuCitCaXQgMDogR2l2ZSBhbiBhbGFybSBpZiBtZWFzdXJlZCBycG0gaXMgdW5kZXIgdGhlIG1pbiB0aHJlc2hvbGQJKFJXKQorQml0IDM6IEJlZXAgaWYgYWxhcm0JCQkJCQkoUlcpCitCaXQgNzogU2h1dGRvd24gaWYgYWxhcm0gcGVyc2lzdCBmb3IgbW9yZSB0aGVuIDQgc2Vjb25kcwkoUlcpCisKK0J5dGUgMToKK21pbiB0aHJlc2hvbGQgKHNjYWxlIGFzIGJhbmsgMHgyNikKKworCitXYXJuaW5nIGZvciB0aGUgYWR2ZW50ZXJvdXMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBIHdvcmQgb2YgY2F1dGlvbiB0byB0aG9zZSB3aG8gd2FudCB0byBleHBlcmltZW50IGFuZCBzZWUgaWYgdGhleSBjYW4gZmlndXJlCit0aGUgdm9sdGFnZSAvIGNsb2NrIHByb2dyYW1taW5nIG91dCwgSSB0cmllZCByZWFkaW5nIGFuZCBvbmx5IHJlYWRpbmcgYmFua3MKKzAtMHgzMCB3aXRoIHRoZSByZWFkaW5nIGNvZGUgdXNlZCBmb3IgdGhlIHNlbnNvciBiYW5rcyAoMHgyMC0weDI4KSBhbmQgdGhpcworcmVzdWx0ZWQgaW4gYSBfcGVybWFuZW50XyByZXByb2dyYW1taW5nIG9mIHRoZSB2b2x0YWdlcywgbHVja2lseSBJIGhhZCB0aGUKK3NlbnNvcnMgcGFydCBjb25maWd1cmVkIHNvIHRoYXQgaXQgd291bGQgc2h1dGRvd24gbXkgc3lzdGVtIG9uIGFueSBvdXQgb2Ygc3BlYwordm9sdGFnZXMgd2hpY2ggcHJvcHJhYmx5IHNhZmVkIG15IGNvbXB1dGVyIChhZnRlciBhIHJlYm9vdCBJIG1hbmFnZWQgdG8KK2ltbWVkaWF0bHkgZW50ZXIgdGhlIGJpb3MgYW5kIHJlbG9hZCB0aGUgZGVmYXVsdHMpLiBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQKK3RoZSByZWFkL3dyaXRlIGN5Y2xlIGZvciB0aGUgbm9uIHNlbnNvciBwYXJ0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzZW5zb3IgcGFydC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG03MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG03MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRkM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTcwCkBAIC0wLDAgKzEsMzEgQEAKK0tlcm5lbCBkcml2ZXIgbG03MAorPT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MAorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE03MC5odG1sCisKK0F1dGhvcjoKKyAgICAgICAgS2Fpd2FuIE4gQmlsbGltb3JpYSA8a2Fpd2FuQGRlc2lnbmVyZ3JhcGhpeC5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNzAKK3RlbXBlcmF0dXJlIHNlbnNvci4KKworVGhlIExNNzAgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXAgc3VwcG9ydHMgYSBzaW5nbGUgdGVtcGVyYXR1cmUgc2Vuc29yLgorSXQgY29tbXVuaWNhdGVzIHdpdGggYSBob3N0IHByb2Nlc3NvciAob3IgbWljcm9jb250cm9sbGVyKSB2aWEgYW4KK1NQSS9NaWNyb3dpcmUgQnVzIGludGVyZmFjZS4KKworQ29tbXVuaWNhdGlvbiB3aXRoIHRoZSBMTTcwIGlzIHNpbXBsZTogd2hlbiB0aGUgdGVtcGVyYXR1cmUgaXMgdG8gYmUgc2Vuc2VkLAordGhlIGRyaXZlciBhY2Nlc3NlcyB0aGUgTE03MCB1c2luZyBTUEkgY29tbXVuaWNhdGlvbjogMTYgU0NMSyBjeWNsZXMKK2NvbXByaXNlIHRoZSBNT1NJL01JU08gbG9vcC4gQXQgdGhlIGVuZCBvZiB0aGUgdHJhbnNmZXIsIHRoZSAxMS1iaXQgMidzCitjb21wbGVtZW50IGRpZ2l0YWwgdGVtcGVyYXR1cmUgKHNlbnQgdmlhIHRoZSBTSU8gbGluZSksIGlzIGF2YWlsYWJsZSBpbiB0aGUKK2RyaXZlciBmb3IgaW50ZXJwcmV0YXRpb24uIFRoaXMgZHJpdmVyIG1ha2VzIHVzZSBvZiB0aGUga2VybmVsJ3MgaW4tY29yZQorU1BJIHN1cHBvcnQuCisKK1RoYW5rcyB0bworLS0tLS0tLS0tCitKZWFuIERlbHZhcmUgPGtoYWxpQGxpbnV4LWZyLm9yZz4gZm9yIG1lbnRvcmluZyB0aGUgaHdtb24tc2lkZSBkcml2ZXIKK2RldmVsb3BtZW50LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTgzCmluZGV4IDA2MWQ5ZWQuLmY3YWFkMTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vbG04MworKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtODMKQEAgLTcsNiArNywxMCBAQAogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxOCAtIDB4MWEsIDB4MjkgLSAweDJiLCAweDRjIC0gMHg0ZQogICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIHdlYnNpdGUKICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODMuaHRtbAorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE04MgorICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxOCAtIDB4MWEsIDB4MjkgLSAweDJiLCAweDRjIC0gMHg0ZQorICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yIHdlYnNpdGUKKyAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNODIuaHRtbAogCiAKIEF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CkBAIC0xNSwxMCArMTksMTEgQEAKIC0tLS0tLS0tLS0tCiAKIFRoZSBMTTgzIGlzIGEgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IuIEl0IHNlbnNlcyBpdHMgb3duIHRlbXBlcmF0dXJlIGFzCi13ZWxsIGFzIHRoZSB0ZW1wZXJhdHVyZSBvZiB1cCB0byB0aHJlZSBleHRlcm5hbCBkaW9kZXMuIEl0IGlzIGNvbXBhdGlibGUKLXdpdGggbWFueSBvdGhlciBkZXZpY2VzIHN1Y2ggYXMgdGhlIExNODQgYW5kIGFsbCBvdGhlciBBRE0xMDIxIGNsb25lcy4KLVRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgTE04MyBhbmQgdGhlIExNODQgaW4gdGhhdCB0aGUgbGF0ZXIgY2FuCi1vbmx5IHNlbnNlIHRoZSB0ZW1wZXJhdHVyZSBvZiBvbmUgZXh0ZXJuYWwgZGlvZGUuCit3ZWxsIGFzIHRoZSB0ZW1wZXJhdHVyZSBvZiB1cCB0byB0aHJlZSBleHRlcm5hbCBkaW9kZXMuIFRoZSBMTTgyIGlzCithIHN0cmlwcGVkIGRvd24gdmVyc2lvbiBvZiB0aGUgTE04MyB0aGF0IG9ubHkgc3VwcG9ydHMgb25lIGV4dGVybmFsIGRpb2RlLgorQm90aCBhcmUgY29tcGF0aWJsZSB3aXRoIG1hbnkgb3RoZXIgZGV2aWNlcyBzdWNoIGFzIHRoZSBMTTg0IGFuZCBhbGwKK290aGVyIEFETTEwMjEgY2xvbmVzLiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIExNODMgYW5kIHRoZSBMTTg0CitpbiB0aGF0IHRoZSBsYXRlciBjYW4gb25seSBzZW5zZSB0aGUgdGVtcGVyYXR1cmUgb2Ygb25lIGV4dGVybmFsIGRpb2RlLgogCiBVc2luZyB0aGUgYWRtMTAyMSBkcml2ZXIgZm9yIGEgTE04MyBzaG91bGQgd29yaywgYnV0IG9ubHkgdHdvIHRlbXBlcmF0dXJlcwogd2lsbCBiZSByZXBvcnRlZCBpbnN0ZWFkIG9mIGZvdXIuCkBAIC0zMCwxMiArMzUsMTYgQEAKIAogQ29uZmlybWVkIG1vdGhlcmJvYXJkczoKICAgICBTQlMgICAgICAgICBQMDE0CisgICAgU0JTICAgICAgICAgUFNMMDkKIAogVW5jb25maXJtZWQgbW90aGVyYm9hcmRzOgogICAgIEdpZ2FieXRlICAgIEdBLThJSzExMDAKICAgICBJd2lsbCAgICAgICBNUFgyCiAgICAgU29sdGVrICAgICAgU0wtNzVEUlY1CiAKK1RoZSBMTTgyIGlzIGNvbmZpcm1lZCB0byBoYXZlIGJlZW4gZm91bmQgb24gbW9zdCBBTUQgR2VvZGUgcmVmZXJlbmNlCitkZXNpZ25zIGFuZCB0ZXN0IHBsYXRmb3Jtcy4KKwogVGhlIGRyaXZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdGVzdGVkIGJ5IE1hZ251cyBGb3Jzc3Ry9m0sIHdobyBJJ2QKIGxpa2UgdG8gdGhhbmsgaGVyZS4gTW9yZSB0ZXN0ZXJzIHdpbGwgYmUgb2YgY291cnNlIHdlbGNvbWUuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTE5MiBiL0RvY3VtZW50YXRpb24vaHdtb24vc21zYzQ3bTE5MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ2NDUzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zbXNjNDdtMTkyCkBAIC0wLDAgKzEsMTAyIEBACitLZXJuZWwgZHJpdmVyIHNtc2M0N20xOTIKKz09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgY2hpcHM6CisgICogU01TQyBMUEM0N00xOTIgYW5kIExQQzQ3TTk5NworICAgIFByZWZpeDogJ3Ntc2M0N20xOTInCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJjIC0gMHgyZAorICAgIERhdGFzaGVldDogVGhlIGRhdGFzaGVldCBmb3IgTFBDNDdNMTkyIGlzIHB1YmxpY2x5IGF2YWlsYWJsZSBmcm9tCisgICAgICAgICAgICAgICBodHRwOi8vd3d3LnNtc2MuY29tLworICAgICAgICAgICAgICAgVGhlIExQQzQ3TTk5NyBpcyBjb21wYXRpYmxlIGZvciBoYXJkd2FyZSBtb25pdG9yaW5nLgorCitBdXRob3I6IEhhcnRtdXQgUmljayA8bGludXhAcmljay5jbGFyYW5ldC5kZT4KKyAgICAgICAgU3BlY2lhbCB0aGFua3MgdG8gSmVhbiBEZWx2YXJlIGZvciBjYXJlZnVsIGNoZWNraW5nCisgICAgICAgIG9mIHRoZSBjb2RlIGFuZCBtYW55IGhlbHBmdWwgY29tbWVudHMgYW5kIHN1Z2dlc3Rpb25zLgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBzZW5zb3IgY2FwYWJpbGl0aWVzCitvZiB0aGUgU01TQyBMUEM0N00xOTIgYW5kIExQQzQ3TTk5NyBTdXBlci1JL08gY2hpcHMuCisKK1RoZXNlIGNoaXBzIHN1cHBvcnQgMyB0ZW1wZXJhdHVyZSBjaGFubmVscyBhbmQgOCB2b2x0YWdlIGlucHV0cworYXMgd2VsbCBhcyBDUFUgdm9sdGFnZSBWSUQgaW5wdXQuCisKK1RoZXkgZG8gYWxzbyBoYXZlIGZhbiBtb25pdG9yaW5nIGFuZCBjb250cm9sIGNhcGFiaWxpdGllcywgYnV0IHRoZQordGhlc2UgZmVhdHVyZXMgYXJlIGFjY2Vzc2VkIHZpYSBJU0EgYnVzIGFuZCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzCitkcml2ZXIuIFVzZSB0aGUgJ3Ntc2M0N20xJyBkcml2ZXIgZm9yIGZhbiBtb25pdG9yaW5nIGFuZCBjb250cm9sLgorCitWb2x0YWdlcyBhbmQgdGVtcGVyYXR1cmVzIGFyZSBtZWFzdXJlZCBieSBhbiA4LWJpdCBBREMsIHRoZSByZXNvbHV0aW9uCitvZiB0aGUgdGVtcGVyYXR1cmVzIGlzIDEgYml0IHBlciBkZWdyZWUgQy4KK1ZvbHRhZ2VzIGFyZSBzY2FsZWQgc3VjaCB0aGF0IHRoZSBub21pbmFsIHZvbHRhZ2UgY29ycmVzcG9uZHMgdG8KKzE5MiBjb3VudHMsIGkuZS4gMy80IG9mIHRoZSBmdWxsIHJhbmdlLiBUaHVzIHRoZSBhdmFpbGFibGUgcmFuZ2UgZm9yCitlYWNoIHZvbHRhZ2UgY2hhbm5lbCBpcyAwViAuLi4gMjU1LzE5Mioobm9taW5hbCB2b2x0YWdlKSwgdGhlIHJlc29sdXRpb24KK2lzIDEgYml0IHBlciAobm9taW5hbCB2b2x0YWdlKS8xOTIuCitCb3RoIHZvbHRhZ2UgYW5kIHRlbXBlcmF0dXJlIHZhbHVlcyBhcmUgc2NhbGVkIGJ5IDEwMDAsIHRoZSBzeXMgZmlsZXMKK3Nob3cgdm9sdGFnZXMgaW4gbVYgYW5kIHRlbXBlcmF0dXJlcyBpbiB1bml0cyBvZiAwLjAwMSBkZWdDLgorCitUaGUgKzEyViBhbmFsb2cgdm9sdGFnZSBpbnB1dCBjaGFubmVsIChpbjRfaW5wdXQpIGlzIG11bHRpcGxleGVkIHdpdGgKK2JpdCA0IG9mIHRoZSBlbmNvZGVkIENQVSB2b2x0YWdlLiBUaGlzIG1lYW5zIHRoYXQgeW91IGVpdGhlciBnZXQKK2EgKzEyViB2b2x0YWdlIG1lYXN1cmVtZW50IG9yIGEgNSBiaXQgQ1BVIFZJRCwgYnV0IG5vdCBib3RoLgorVGhlIGRlZmF1bHQgc2V0dGluZyBpcyB0byB1c2UgdGhlIHBpbiBhcyAxMlYgaW5wdXQsIGFuZCB1c2Ugb25seSA0IGJpdCBWSUQuCitUaGlzIGRyaXZlciBhc3N1bWVzIHRoYXQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyCitpcyBjb3JyZWN0LCBpLmUuIHRoYXQgdGhlIEJJT1MgaGFzIHVwZGF0ZWQgdGhlIGNvbmZpZ3VyYXRpb24gaWYKK3RoZSBtb3RoZXJib2FyZCBoYXMgdGhpcyBpbnB1dCB3aXJlZCB0byBWSUQ0LgorCitUaGUgdGVtcGVyYXR1cmUgYW5kIHZvbHRhZ2UgcmVhZGluZ3MgYXJlIHVwZGF0ZWQgb25jZSBldmVyeSAxLjUgc2Vjb25kcy4KK1JlYWRpbmcgdGhlbSBtb3JlIG9mdGVuIHJlcGVhdHMgdGhlIHNhbWUgdmFsdWVzLgorCisKK3N5c2ZzIGludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tCisKK2luMF9pbnB1dAktICsyLjVWIHZvbHRhZ2UgaW5wdXQKK2luMV9pbnB1dAktIENQVSB2b2x0YWdlIGlucHV0IChub21pbmFsIDIuMjVWKQoraW4yX2lucHV0CS0gKzMuM1Ygdm9sdGFnZSBpbnB1dAoraW4zX2lucHV0CS0gKzVWIHZvbHRhZ2UgaW5wdXQKK2luNF9pbnB1dAktICsxMlYgdm9sdGFnZSBpbnB1dCAobWF5IGJlIG1pc3NpbmcgaWYgdXNlZCBhcyBWSUQ0KQoraW41X2lucHV0CS0gVmNjIHZvbHRhZ2UgaW5wdXQgKG5vbWluYWwgMy4zVikKKwkJICBUaGlzIGlzIHRoZSBzdXBwbHkgdm9sdGFnZSBvZiB0aGUgc2Vuc29yIGNoaXAgaXRzZWxmLgoraW42X2lucHV0CS0gKzEuNVYgdm9sdGFnZSBpbnB1dAoraW43X2lucHV0CS0gKzEuOFYgdm9sdGFnZSBpbnB1dAorCitpblswLTddX21pbiwKK2luWzAtN11fbWF4CS0gbG93ZXIgYW5kIHVwcGVyIGFsYXJtIHRocmVzaG9sZHMgZm9yIGluWzAtN11faW5wdXQgcmVhZGluZworCisJCSAgQWxsIHZvbHRhZ2VzIGFyZSByZWFkIGFuZCB3cml0dGVuIGluIG1WLgorCitpblswLTddX2FsYXJtCS0gYWxhcm0gZmxhZ3MgZm9yIHZvbHRhZ2UgaW5wdXRzCisJCSAgVGhlc2UgZmlsZXMgcmVhZCAnMScgaW4gY2FzZSBvZiBhbGFybSwgJzAnIG90aGVyd2lzZS4KKwordGVtcDFfaW5wdXQJLSBjaGlwIHRlbXBlcmF0dXJlIG1lYXN1cmVkIGJ5IG9uLWNoaXAgZGlvZGUKK3RlbXBbMi0zXV9pbnB1dAktIHRlbXBlcmF0dXJlIG1lYXN1cmVkIGJ5IGV4dGVybmFsIGRpb2RlcyAob25lIG9mIHRoZXNlIHdvdWxkCisJCSAgdHlwaWNhbGx5IGJlIHdpcmVkIHRvIHRoZSBkaW9kZSBpbnNpZGUgdGhlIENQVSkKKwordGVtcFsxLTNdX21pbiwKK3RlbXBbMS0zXV9tYXgJLSBsb3dlciBhbmQgdXBwZXIgYWxhcm0gdGhyZXNob2xkcyBmb3IgdGVtcGVyYXR1cmVzCisKK3RlbXBbMS0zXV9vZmZzZXQgLSB0ZW1wZXJhdHVyZSBvZmZzZXQgcmVnaXN0ZXJzCisJCSAgVGhlIGNoaXAgYWRkcyB0aGUgb2Zmc2V0cyBzdG9yZWQgaW4gdGhlc2UgcmVnaXN0ZXJzIHRvCisJCSAgdGhlIGNvcnJlc3BvbmRpbmcgdGVtcGVyYXR1cmUgcmVhZGluZ3MuCisJCSAgTm90ZSB0aGF0IHRlbXAxIGFuZCB0ZW1wMiBvZmZzZXRzIHNoYXJlIHRoZSBzYW1lIHJlZ2lzdGVyLAorCQkgIHRoZXkgY2Fubm90IGJvdGggYmUgZGlmZmVyZW50IGZyb20gemVybyBhdCB0aGUgc2FtZSB0aW1lLgorCQkgIFdyaXRpbmcgYSBub24temVybyBudW1iZXIgdG8gb25lIG9mIHRoZW0gd2lsbCByZXNldCB0aGUgb3RoZXIKKwkJICBvZmZzZXQgdG8gemVyby4KKworCQkgIEFsbCB0ZW1wZXJhdHVyZXMgYW5kIG9mZnNldHMgYXJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4KKwkJICB1bml0cyBvZiAwLjAwMSBkZWdDLgorCit0ZW1wWzEtM11fYWxhcm0gLSBhbGFybSBmbGFncyBmb3IgdGVtcGVyYXR1cmUgaW5wdXRzLCAnMScgaW4gY2FzZSBvZiBhbGFybSwKKwkJICAnMCcgb3RoZXJ3aXNlLgordGVtcFsyLTNdX2lucHV0X2ZhdWx0IC0gZGlvZGUgZmF1bHQgZmxhZ3MgZm9yIHRlbXBlcmF0dXJlIGlucHV0cyAyIGFuZCAzLgorCQkgIEEgZmF1bHQgaXMgZGV0ZWN0ZWQgaWYgdGhlIHR3byBwaW5zIGZvciB0aGUgY29ycmVzcG9uZGluZworCQkgIHNlbnNvciBhcmUgb3BlbiBvciBzaG9ydGVkLCBvciBhbnkgb2YgdGhlIHR3byBpcyBzaG9ydGVkCisJCSAgdG8gZ3JvdW5kIG9yIFZjYy4gJzEnIGluZGljYXRlcyBhIGRpb2RlIGZhdWx0LgorCitjcHUwX3ZpZAktIENQVSB2b2x0YWdlIGFzIHJlY2VpdmVkIGZyb20gdGhlIENQVQorCit2cm0JCS0gQ1BVIFZJRCBzdGFuZGFyZCB1c2VkIGZvciBkZWNvZGluZyBDUFUgdm9sdGFnZQorCisJCSAgVGhlICpfbWluLCAqX21heCwgKl9vZmZzZXQgYW5kIHZybSBmaWxlcyBjYW4gYmUgcmVhZCBhbmQKKwkJICB3cml0dGVuLCBhbGwgb3RoZXJzIGFyZSByZWFkLW9ubHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3N5c2ZzLWludGVyZmFjZSBiL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCmluZGV4IGEwZDBhYjIuLmQxZDM5MGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlCkBAIC0zLDE1ICszLDE1IEBACiAKIFRoZSBsaWJzZW5zb3JzIGxpYnJhcnkgb2ZmZXJzIGFuIGludGVyZmFjZSB0byB0aGUgcmF3IHNlbnNvcnMgZGF0YQogdGhyb3VnaCB0aGUgc3lzZnMgaW50ZXJmYWNlLiBTZWUgbGlic2Vuc29ycyBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgZm9yCi1tb3JlIGZ1cnRoZXIgaW5mb3JtYXRpb24uIEFzIG9mIHdyaXRpbmcgdGhpcyBkb2N1bWVudCwgbGlic2Vuc29ycwotKGZyb20gbG1fc2Vuc29ycyAyLjguMykgaXMgaGVhdmlseSBjaGlwLWRlcGVuZGFudC4gQWRkaW5nIG9yIHVwZGF0aW5nCitmdXJ0aGVyIGluZm9ybWF0aW9uLiBBcyBvZiB3cml0aW5nIHRoaXMgZG9jdW1lbnQsIGxpYnNlbnNvcnMKKyhmcm9tIGxtX3NlbnNvcnMgMi44LjMpIGlzIGhlYXZpbHkgY2hpcC1kZXBlbmRlbnQuIEFkZGluZyBvciB1cGRhdGluZwogc3VwcG9ydCBmb3IgYW55IGdpdmVuIGNoaXAgcmVxdWlyZXMgbW9kaWZ5aW5nIHRoZSBsaWJyYXJ5J3MgY29kZS4KIFRoaXMgaXMgYmVjYXVzZSBsaWJzZW5zb3JzIHdhcyB3cml0dGVuIGZvciB0aGUgcHJvY2ZzIGludGVyZmFjZQogb2xkZXIga2VybmVsIG1vZHVsZXMgd2VyZSB1c2luZywgd2hpY2ggd2Fzbid0IHN0YW5kYXJkaXplZCBlbm91Z2guCiBSZWNlbnQgdmVyc2lvbnMgb2YgbGlic2Vuc29ycyAoZnJvbSBsbV9zZW5zb3JzIDIuOC4yIGFuZCBsYXRlcikgaGF2ZQogc3VwcG9ydCBmb3IgdGhlIHN5c2ZzIGludGVyZmFjZSwgdGhvdWdoLgogCi1UaGUgbmV3IHN5c2ZzIGludGVyZmFjZSB3YXMgZGVzaWduZWQgdG8gYmUgYXMgY2hpcC1pbmRlcGVuZGFudCBhcworVGhlIG5ldyBzeXNmcyBpbnRlcmZhY2Ugd2FzIGRlc2lnbmVkIHRvIGJlIGFzIGNoaXAtaW5kZXBlbmRlbnQgYXMKIHBvc3NpYmxlLgogCiBOb3RlIHRoYXQgbW90aGVyYm9hcmRzIHZhcnkgd2lkZWx5IGluIHRoZSBjb25uZWN0aW9ucyB0byBzZW5zb3IgY2hpcHMuCkBAIC0yNCw3ICsyNCw3IEBACiBjYW4gY2hhbmdlIGZyb20gbW90aGVyYm9hcmQgdG8gbW90aGVyYm9hcmQsIHRoZSBjb252ZXJzaW9ucyBjYW5ub3QgYmUKIGhhcmQgY29kZWQgaW50byB0aGUgZHJpdmVyIGFuZCBoYXZlIHRvIGJlIGRvbmUgaW4gdXNlciBzcGFjZS4KIAotRm9yIHRoaXMgcmVhc29uLCBldmVuIGlmIHdlIGFpbSBhdCBhIGNoaXAtaW5kZXBlbmRhbnQgbGlic2Vuc29ycywgaXQgd2lsbAorRm9yIHRoaXMgcmVhc29uLCBldmVuIGlmIHdlIGFpbSBhdCBhIGNoaXAtaW5kZXBlbmRlbnQgbGlic2Vuc29ycywgaXQgd2lsbAogc3RpbGwgcmVxdWlyZSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoZS5nLiAvZXRjL3NlbnNvcnMuY29uZikgZm9yIHByb3BlcgogdmFsdWVzIGNvbnZlcnNpb24sIGxhYmVsaW5nIG9mIGlucHV0cyBhbmQgaGlkaW5nIG9mIHVudXNlZCBpbnB1dHMuCiAKQEAgLTM5LDE1ICszOSwxNiBAQAogdGhpcyBzdGFuZGFyZC4KIAogTm90ZSB0aGF0IHRoaXMgc3RhbmRhcmQgaXNuJ3QgY29tcGxldGVseSBlc3RhYmxpc2hlZCB5ZXQsIHNvIGl0IGlzIHN1YmplY3QKLXRvIGNoYW5nZXMsIGV2ZW4gaW1wb3J0YW50IG9uZXMuIE9uZSBtb3JlIHJlYXNvbiB0byB1c2UgdGhlIGxpYnJhcnkgaW5zdGVhZAotb2YgYWNjZXNzaW5nIHN5c2ZzIGZpbGVzIGRpcmVjdGx5LgordG8gY2hhbmdlcy4gSWYgeW91IGFyZSB3cml0aW5nIGEgbmV3IGhhcmR3YXJlIG1vbml0b3JpbmcgZHJpdmVyIHRob3NlCitmZWF0dXJlcyBjYW4ndCBzZWVtIHRvIGZpdCBpbiB0aGlzIGludGVyZmFjZSwgcGxlYXNlIGNvbnRhY3QgdXMgd2l0aCB5b3VyCitleHRlbnNpb24gcHJvcG9zYWwuIEtlZXAgaW4gbWluZCB0aGF0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgbXVzdCBiZQorcHJlc2VydmVkLgogCiBFYWNoIGNoaXAgZ2V0cyBpdHMgb3duIGRpcmVjdG9yeSBpbiB0aGUgc3lzZnMgL3N5cy9kZXZpY2VzIHRyZWUuICBUbwotZmluZCBhbGwgc2Vuc29yIGNoaXBzLCBpdCBpcyBlYXNpZXIgdG8gZm9sbG93IHRoZSBzeW1saW5rcyBmcm9tCi0vc3lzL2kyYy9kZXZpY2VzLworZmluZCBhbGwgc2Vuc29yIGNoaXBzLCBpdCBpcyBlYXNpZXIgdG8gZm9sbG93IHRoZSBkZXZpY2Ugc3ltbGlua3MgZnJvbQorL3N5cy9jbGFzcy9od21vbi9od21vbiouCiAKLUFsbCBzeXNmcyB2YWx1ZXMgYXJlIGZpeGVkIHBvaW50IG51bWJlcnMuICBUbyBnZXQgdGhlIHRydWUgdmFsdWUgb2Ygc29tZQotb2YgdGhlIHZhbHVlcywgeW91IHNob3VsZCBkaXZpZGUgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KK0FsbCBzeXNmcyB2YWx1ZXMgYXJlIGZpeGVkIHBvaW50IG51bWJlcnMuCiAKIFRoZXJlIGlzIG9ubHkgb25lIHZhbHVlIHBlciBmaWxlLCB1bmxpa2UgdGhlIG9sZGVyIC9wcm9jIHNwZWNpZmljYXRpb24uCiBUaGUgY29tbW9uIHNjaGVtZSBmb3IgZmlsZXMgbmFtaW5nIGlzOiA8dHlwZT48bnVtYmVyPl88aXRlbT4uIFVzdWFsCkBAIC02OSwyOCArNzAsNDAgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitbMC0qXQlkZW5vdGVzIGFueSBwb3NpdGl2ZSBudW1iZXIgc3RhcnRpbmcgZnJvbSAwCitbMS0qXQlkZW5vdGVzIGFueSBwb3NpdGl2ZSBudW1iZXIgc3RhcnRpbmcgZnJvbSAxCitSTwlyZWFkIG9ubHkgdmFsdWUKK1JXCXJlYWQvd3JpdGUgdmFsdWUKKworUmVhZC93cml0ZSB2YWx1ZXMgbWF5IGJlIHJlYWQtb25seSBmb3Igc29tZSBjaGlwcywgZGVwZW5kaW5nIG9uIHRoZQoraGFyZHdhcmUgaW1wbGVtZW50YXRpb24uCisKK0FsbCBlbnRyaWVzIGFyZSBvcHRpb25hbCwgYW5kIHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgaW4gYSBnaXZlbiBkcml2ZXIKK2lmIHRoZSBjaGlwIGhhcyB0aGUgZmVhdHVyZS4KKwogKioqKioqKioqKioqCiAqIFZvbHRhZ2VzICoKICoqKioqKioqKioqKgogCi1pblswLThdX21pbglWb2x0YWdlIG1pbiB2YWx1ZS4KK2luWzAtKl1fbWluCVZvbHRhZ2UgbWluIHZhbHVlLgogCQlVbml0OiBtaWxsaXZvbHQKLQkJUmVhZC9Xcml0ZQorCQlSVwogCQkKLWluWzAtOF1fbWF4CVZvbHRhZ2UgbWF4IHZhbHVlLgoraW5bMC0qXV9tYXgJVm9sdGFnZSBtYXggdmFsdWUuCiAJCVVuaXQ6IG1pbGxpdm9sdAotCQlSZWFkL1dyaXRlCisJCVJXCiAJCQotaW5bMC04XV9pbnB1dAlWb2x0YWdlIGlucHV0IHZhbHVlLgoraW5bMC0qXV9pbnB1dAlWb2x0YWdlIGlucHV0IHZhbHVlLgogCQlVbml0OiBtaWxsaXZvbHQKLQkJUmVhZCBvbmx5CisJCVJPCisJCVZvbHRhZ2UgbWVhc3VyZWQgb24gdGhlIGNoaXAgcGluLgogCQlBY3R1YWwgdm9sdGFnZSBkZXBlbmRzIG9uIHRoZSBzY2FsaW5nIHJlc2lzdG9ycyBvbiB0aGUKIAkJbW90aGVyYm9hcmQsIGFzIHJlY29tbWVuZGVkIGluIHRoZSBjaGlwIGRhdGFzaGVldC4KIAkJVGhpcyB2YXJpZXMgYnkgY2hpcCBhbmQgYnkgbW90aGVyYm9hcmQuCiAJCUJlY2F1c2Ugb2YgdGhpcyB2YXJpYXRpb24sIHZhbHVlcyBhcmUgZ2VuZXJhbGx5IE5PVCBzY2FsZWQKIAkJYnkgdGhlIGNoaXAgZHJpdmVyLCBhbmQgbXVzdCBiZSBkb25lIGJ5IHRoZSBhcHBsaWNhdGlvbi4KIAkJSG93ZXZlciwgc29tZSBkcml2ZXJzIChub3RhYmx5IGxtODcgYW5kIHZpYTY4NmEpCi0JCWRvIHNjYWxlLCB3aXRoIHZhcmlvdXMgZGVncmVlcyBvZiBzdWNjZXNzLgorCQlkbyBzY2FsZSwgYmVjYXVzZSBvZiBpbnRlcm5hbCByZXNpc3RvcnMgYnVpbHQgaW50byBhIGNoaXAuCiAJCVRoZXNlIGRyaXZlcnMgd2lsbCBvdXRwdXQgdGhlIGFjdHVhbCB2b2x0YWdlLgogCiAJCVR5cGljYWwgdXNhZ2U6CkBAIC0xMDQsNTggKzExNyw3MiBAQAogCQkJaW43XyoJdmFyaWVzCiAJCQlpbjhfKgl2YXJpZXMKIAotY3B1WzAtMV1fdmlkCUNQVSBjb3JlIHJlZmVyZW5jZSB2b2x0YWdlLgorY3B1WzAtKl1fdmlkCUNQVSBjb3JlIHJlZmVyZW5jZSB2b2x0YWdlLgogCQlVbml0OiBtaWxsaXZvbHQKLQkJUmVhZCBvbmx5LgorCQlSTwogCQlOb3QgYWx3YXlzIGNvcnJlY3QuCiAKIHZybQkJVm9sdGFnZSBSZWd1bGF0b3IgTW9kdWxlIHZlcnNpb24gbnVtYmVyLiAKLQkJUmVhZCBvbmx5LgotCQlUd28gZGlnaXQgbnVtYmVyLCBmaXJzdCBpcyBtYWpvciB2ZXJzaW9uLCBzZWNvbmQgaXMKLQkJbWlub3IgdmVyc2lvbi4KKwkJUlcgKGJ1dCBjaGFuZ2luZyBpdCBzaG91bGQgbm8gbW9yZSBiZSBuZWNlc3NhcnkpCisJCU9yaWdpbmFsbHkgdGhlIFZSTSBzdGFuZGFyZCB2ZXJzaW9uIG11bHRpcGxpZWQgYnkgMTAsIGJ1dCBub3cKKwkJYW4gYXJiaXRyYXJ5IG51bWJlciwgYXMgbm90IGFsbCBzdGFuZGFyZHMgaGF2ZSBhIHZlcnNpb24KKwkJbnVtYmVyLgogCQlBZmZlY3RzIHRoZSB3YXkgdGhlIGRyaXZlciBjYWxjdWxhdGVzIHRoZSBDUFUgY29yZSByZWZlcmVuY2UKIAkJdm9sdGFnZSBmcm9tIHRoZSB2aWQgcGlucy4KIAorQWxzbyBzZWUgdGhlIEFsYXJtcyBzZWN0aW9uIGZvciBzdGF0dXMgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHZvbHRhZ2VzLgorCiAKICoqKioqKioqCiAqIEZhbnMgKgogKioqKioqKioKIAotZmFuWzEtM11fbWluCUZhbiBtaW5pbXVtIHZhbHVlCitmYW5bMS0qXV9taW4JRmFuIG1pbmltdW0gdmFsdWUKIAkJVW5pdDogcmV2b2x1dGlvbi9taW4gKFJQTSkKLQkJUmVhZC9Xcml0ZS4KKwkJUlcKIAotZmFuWzEtM11faW5wdXQJRmFuIGlucHV0IHZhbHVlLgorZmFuWzEtKl1faW5wdXQJRmFuIGlucHV0IHZhbHVlLgogCQlVbml0OiByZXZvbHV0aW9uL21pbiAoUlBNKQotCQlSZWFkIG9ubHkuCisJCVJPCiAKLWZhblsxLTNdX2RpdglGYW4gZGl2aXNvci4KK2ZhblsxLSpdX2RpdglGYW4gZGl2aXNvci4KIAkJSW50ZWdlciB2YWx1ZSBpbiBwb3dlcnMgb2YgdHdvICgxLCAyLCA0LCA4LCAxNiwgMzIsIDY0LCAxMjgpLgorCQlSVwogCQlTb21lIGNoaXBzIG9ubHkgc3VwcG9ydCB2YWx1ZXMgMSwgMiwgNCBhbmQgOC4KIAkJTm90ZSB0aGF0IHRoaXMgaXMgYWN0dWFsbHkgYW4gaW50ZXJuYWwgY2xvY2sgZGl2aXNvciwgd2hpY2gKIAkJYWZmZWN0cyB0aGUgbWVhc3VyYWJsZSBzcGVlZCByYW5nZSwgbm90IHRoZSByZWFkIHZhbHVlLgogCitBbHNvIHNlZSB0aGUgQWxhcm1zIHNlY3Rpb24gZm9yIHN0YXR1cyBmbGFncyBhc3NvY2lhdGVkIHdpdGggZmFucy4KKworCiAqKioqKioqCiAqIFBXTSAqCiAqKioqKioqCiAKLXB3bVsxLTNdCVB1bHNlIHdpZHRoIG1vZHVsYXRpb24gZmFuIGNvbnRyb2wuCitwd21bMS0qXQlQdWxzZSB3aWR0aCBtb2R1bGF0aW9uIGZhbiBjb250cm9sLgogCQlJbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIHRvIDI1NQotCQlSZWFkL1dyaXRlCisJCVJXCiAJCTI1NSBpcyBtYXggb3IgMTAwJS4KIAotcHdtWzEtM11fZW5hYmxlCitwd21bMS0qXV9lbmFibGUKIAkJU3dpdGNoIFBXTSBvbiBhbmQgb2ZmLgogCQlOb3QgYWx3YXlzIHByZXNlbnQgZXZlbiBpZiBmYW4qX3B3bSBpcy4KLQkJMCB0byB0dXJuIG9mZgotCQkxIHRvIHR1cm4gb24gaW4gbWFudWFsIG1vZGUKLQkJMiB0byB0dXJuIG9uIGluIGF1dG9tYXRpYyBtb2RlCi0JCVJlYWQvV3JpdGUKKwkJMDogdHVybiBvZmYKKwkJMTogdHVybiBvbiBpbiBtYW51YWwgbW9kZQorCQkyKzogdHVybiBvbiBpbiBhdXRvbWF0aWMgbW9kZQorCQlDaGVjayBpbmRpdmlkdWFsIGNoaXAgZG9jdW1lbnRhdGlvbiBmaWxlcyBmb3IgYXV0b21hdGljIG1vZGUgZGV0YWlscy4KKwkJUlcKKworcHdtWzEtKl1fbW9kZQorCQkwOiBEQyBtb2RlCisJCTE6IFBXTSBtb2RlCisJCVJXCiAKIHB3bVsxLSpdX2F1dG9fY2hhbm5lbHNfdGVtcAogCQlTZWxlY3Qgd2hpY2ggdGVtcGVyYXR1cmUgY2hhbm5lbHMgYWZmZWN0IHRoaXMgUFdNIG91dHB1dCBpbgogCQlhdXRvIG1vZGUuIEJpdGZpZWxkLCAxIGlzIHRlbXAxLCAyIGlzIHRlbXAyLCA0IGlzIHRlbXAzIGV0Yy4uLgogCQlXaGljaCB2YWx1ZXMgYXJlIHBvc3NpYmxlIGRlcGVuZCBvbiB0aGUgY2hpcCB1c2VkLgorCQlSVwogCiBwd21bMS0qXV9hdXRvX3BvaW50WzEtKl1fcHdtCiBwd21bMS0qXV9hdXRvX3BvaW50WzEtKl1fdGVtcApAQCAtMTYzLDYgKzE5MCw3IEBACiAJCURlZmluZSB0aGUgUFdNIHZzIHRlbXBlcmF0dXJlIGN1cnZlLiBOdW1iZXIgb2YgdHJpcCBwb2ludHMgaXMKIAkJY2hpcC1kZXBlbmRlbnQuIFVzZSB0aGlzIGZvciBjaGlwcyB3aGljaCBhc3NvY2lhdGUgdHJpcCBwb2ludHMKIAkJdG8gUFdNIG91dHB1dCBjaGFubmVscy4KKwkJUlcKIAogT1IKIApAQCAtMTcyLDUwICsyMDAsNTcgQEAKIAkJRGVmaW5lIHRoZSBQV00gdnMgdGVtcGVyYXR1cmUgY3VydmUuIE51bWJlciBvZiB0cmlwIHBvaW50cyBpcwogCQljaGlwLWRlcGVuZGVudC4gVXNlIHRoaXMgZm9yIGNoaXBzIHdoaWNoIGFzc29jaWF0ZSB0cmlwIHBvaW50cwogCQl0byB0ZW1wZXJhdHVyZSBjaGFubmVscy4KKwkJUlcKIAogCiAqKioqKioqKioqKioqKioqCiAqIFRlbXBlcmF0dXJlcyAqCiAqKioqKioqKioqKioqKioqCiAKLXRlbXBbMS0zXV90eXBlCVNlbnNvciB0eXBlIHNlbGVjdGlvbi4KK3RlbXBbMS0qXV90eXBlCVNlbnNvciB0eXBlIHNlbGVjdGlvbi4KIAkJSW50ZWdlcnMgMSB0byA0IG9yIHRoZXJtaXN0b3IgQmV0YSB2YWx1ZSAodHlwaWNhbGx5IDM0MzUpCi0JCVJlYWQvV3JpdGUuCisJCVJXCiAJCTE6IFBJSS9DZWxlcm9uIERpb2RlCiAJCTI6IDM5MDQgdHJhbnNpc3RvcgogCQkzOiB0aGVybWFsIGRpb2RlCiAJCTQ6IHRoZXJtaXN0b3IgKGRlZmF1bHQvdW5rbm93biBCZXRhKQogCQlOb3QgYWxsIHR5cGVzIGFyZSBzdXBwb3J0ZWQgYnkgYWxsIGNoaXBzCiAKLXRlbXBbMS00XV9tYXgJVGVtcGVyYXR1cmUgbWF4IHZhbHVlLgotCQlVbml0OiBtaWxsaWRlZ3JlZSBDZWxjaXVzCi0JCVJlYWQvV3JpdGUgdmFsdWUuCit0ZW1wWzEtKl1fbWF4CVRlbXBlcmF0dXJlIG1heCB2YWx1ZS4KKwkJVW5pdDogbWlsbGlkZWdyZWUgQ2Vsc2l1cyAob3IgbWlsbGl2b2x0LCBzZWUgYmVsb3cpCisJCVJXCiAKLXRlbXBbMS0zXV9taW4JVGVtcGVyYXR1cmUgbWluIHZhbHVlLgotCQlVbml0OiBtaWxsaWRlZ3JlZSBDZWxjaXVzCi0JCVJlYWQvV3JpdGUgdmFsdWUuCit0ZW1wWzEtKl1fbWluCVRlbXBlcmF0dXJlIG1pbiB2YWx1ZS4KKwkJVW5pdDogbWlsbGlkZWdyZWUgQ2Vsc2l1cworCQlSVwogCi10ZW1wWzEtM11fbWF4X2h5c3QKK3RlbXBbMS0qXV9tYXhfaHlzdAogCQlUZW1wZXJhdHVyZSBoeXN0ZXJlc2lzIHZhbHVlIGZvciBtYXggbGltaXQuCi0JCVVuaXQ6IG1pbGxpZGVncmVlIENlbGNpdXMKKwkJVW5pdDogbWlsbGlkZWdyZWUgQ2Vsc2l1cwogCQlNdXN0IGJlIHJlcG9ydGVkIGFzIGFuIGFic29sdXRlIHRlbXBlcmF0dXJlLCBOT1QgYSBkZWx0YQogCQlmcm9tIHRoZSBtYXggdmFsdWUuCi0JCVJlYWQvV3JpdGUgdmFsdWUuCisJCVJXCiAKLXRlbXBbMS00XV9pbnB1dCBUZW1wZXJhdHVyZSBpbnB1dCB2YWx1ZS4KLQkJVW5pdDogbWlsbGlkZWdyZWUgQ2VsY2l1cwotCQlSZWFkIG9ubHkgdmFsdWUuCit0ZW1wWzEtKl1faW5wdXQgVGVtcGVyYXR1cmUgaW5wdXQgdmFsdWUuCisJCVVuaXQ6IG1pbGxpZGVncmVlIENlbHNpdXMKKwkJUk8KIAotdGVtcFsxLTRdX2NyaXQJVGVtcGVyYXR1cmUgY3JpdGljYWwgdmFsdWUsIHR5cGljYWxseSBncmVhdGVyIHRoYW4KK3RlbXBbMS0qXV9jcml0CVRlbXBlcmF0dXJlIGNyaXRpY2FsIHZhbHVlLCB0eXBpY2FsbHkgZ3JlYXRlciB0aGFuCiAJCWNvcnJlc3BvbmRpbmcgdGVtcF9tYXggdmFsdWVzLgotCQlVbml0OiBtaWxsaWRlZ3JlZSBDZWxjaXVzCi0JCVJlYWQvV3JpdGUgdmFsdWUuCisJCVVuaXQ6IG1pbGxpZGVncmVlIENlbHNpdXMKKwkJUlcKIAotdGVtcFsxLTJdX2NyaXRfaHlzdAordGVtcFsxLSpdX2NyaXRfaHlzdAogCQlUZW1wZXJhdHVyZSBoeXN0ZXJlc2lzIHZhbHVlIGZvciBjcml0aWNhbCBsaW1pdC4KLQkJVW5pdDogbWlsbGlkZWdyZWUgQ2VsY2l1cworCQlVbml0OiBtaWxsaWRlZ3JlZSBDZWxzaXVzCiAJCU11c3QgYmUgcmVwb3J0ZWQgYXMgYW4gYWJzb2x1dGUgdGVtcGVyYXR1cmUsIE5PVCBhIGRlbHRhCiAJCWZyb20gdGhlIGNyaXRpY2FsIHZhbHVlLgorCQlSVworCit0ZW1wWzEtNF1fb2Zmc2V0CisJCVRlbXBlcmF0dXJlIG9mZnNldCB3aGljaCBpcyBhZGRlZCB0byB0aGUgdGVtcGVyYXR1cmUgcmVhZGluZworCQlieSB0aGUgY2hpcC4KKwkJVW5pdDogbWlsbGlkZWdyZWUgQ2Vsc2l1cwogCQlSZWFkL1dyaXRlIHZhbHVlLgogCiAJCUlmIHRoZXJlIGFyZSBtdWx0aXBsZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCB0ZW1wMV8qIGlzCkBAIC0yMjUsNiArMjYwLDE3IEBACiAJCWl0c2VsZiwgZm9yIGV4YW1wbGUgdGhlIHRoZXJtYWwgZGlvZGUgaW5zaWRlIHRoZSBDUFUgb3IKIAkJYSB0aGVybWlzdG9yIG5lYXJieS4KIAorU29tZSBjaGlwcyBtZWFzdXJlIHRlbXBlcmF0dXJlIHVzaW5nIGV4dGVybmFsIHRoZXJtaXN0b3JzIGFuZCBhbiBBREMsIGFuZAorcmVwb3J0IHRoZSB0ZW1wZXJhdHVyZSBtZWFzdXJlbWVudCBhcyBhIHZvbHRhZ2UuIENvbnZlcnRpbmcgdGhpcyB2b2x0YWdlCitiYWNrIHRvIGEgdGVtcGVyYXR1cmUgKG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kIGZvciBsaW1pdHMpIHJlcXVpcmVzCittYXRoZW1hdGljYWwgZnVuY3Rpb25zIG5vdCBhdmFpbGFibGUgaW4gdGhlIGtlcm5lbCwgc28gdGhlIGNvbnZlcnNpb24KK211c3Qgb2NjdXIgaW4gdXNlciBzcGFjZS4gRm9yIHRoZXNlIGNoaXBzLCBhbGwgdGVtcCogZmlsZXMgZGVzY3JpYmVkCithYm92ZSBzaG91bGQgY29udGFpbiB2YWx1ZXMgZXhwcmVzc2VkIGluIG1pbGxpdm9sdCBpbnN0ZWFkIG9mIG1pbGxpZGVncmVlCitDZWxzaXVzLiBJbiBvdGhlciB3b3Jkcywgc3VjaCB0ZW1wZXJhdHVyZSBjaGFubmVscyBhcmUgaGFuZGxlZCBhcyB2b2x0YWdlCitjaGFubmVscyBieSB0aGUgZHJpdmVyLgorCitBbHNvIHNlZSB0aGUgQWxhcm1zIHNlY3Rpb24gZm9yIHN0YXR1cyBmbGFncyBhc3NvY2lhdGVkIHdpdGggdGVtcGVyYXR1cmVzLgorCiAKICoqKioqKioqKioqKgogKiBDdXJyZW50cyAqCkBAIC0yMzMsMjUgKzI3OSw4OCBAQAogTm90ZSB0aGF0IG5vIGtub3duIGNoaXAgcHJvdmlkZXMgY3VycmVudCBtZWFzdXJlbWVudHMgYXMgb2Ygd3JpdGluZywKIHNvIHRoaXMgcGFydCBpcyB0aGVvcmV0aWNhbCwgc28gdG8gc2F5LgogCi1jdXJyWzEtbl1fbWF4CUN1cnJlbnQgbWF4IHZhbHVlCitjdXJyWzEtKl1fbWF4CUN1cnJlbnQgbWF4IHZhbHVlCiAJCVVuaXQ6IG1pbGxpYW1wZXJlCi0JCVJlYWQvV3JpdGUuCisJCVJXCiAKLWN1cnJbMS1uXV9taW4JQ3VycmVudCBtaW4gdmFsdWUuCitjdXJyWzEtKl1fbWluCUN1cnJlbnQgbWluIHZhbHVlLgogCQlVbml0OiBtaWxsaWFtcGVyZQotCQlSZWFkL1dyaXRlLgorCQlSVwogCi1jdXJyWzEtbl1faW5wdXQJQ3VycmVudCBpbnB1dCB2YWx1ZQorY3VyclsxLSpdX2lucHV0CUN1cnJlbnQgaW5wdXQgdmFsdWUKIAkJVW5pdDogbWlsbGlhbXBlcmUKLQkJUmVhZCBvbmx5LgorCQlSTwogCiAKLSoqKioqKioqKgotKiBPdGhlciAqCi0qKioqKioqKioKKyoqKioqKioqKioKKyogQWxhcm1zICoKKyoqKioqKioqKioKKworRWFjaCBjaGFubmVsIG9yIGxpbWl0IG1heSBoYXZlIGFuIGFzc29jaWF0ZWQgYWxhcm0gZmlsZSwgY29udGFpbmluZyBhCitib29sZWFuIHZhbHVlLiAxIG1lYW5zIHRoYW4gYW4gYWxhcm0gY29uZGl0aW9uIGV4aXN0cywgMCBtZWFucyBubyBhbGFybS4KKworVXN1YWxseSBhIGdpdmVuIGNoaXAgd2lsbCBlaXRoZXIgdXNlIGNoYW5uZWwtcmVsYXRlZCBhbGFybXMsIG9yCitsaW1pdC1yZWxhdGVkIGFsYXJtcywgbm90IGJvdGguIFRoZSBkcml2ZXIgc2hvdWxkIGp1c3QgcmVmbGVjdCB0aGUgaGFyZHdhcmUKK2ltcGxlbWVudGF0aW9uLgorCitpblswLSpdX2FsYXJtCitmYW5bMS0qXV9hbGFybQordGVtcFsxLSpdX2FsYXJtCisJCUNoYW5uZWwgYWxhcm0KKwkJMDogbm8gYWxhcm0KKwkJMTogYWxhcm0KKwkJUk8KKworT1IKKworaW5bMC0qXV9taW5fYWxhcm0KK2luWzAtKl1fbWF4X2FsYXJtCitmYW5bMS0qXV9taW5fYWxhcm0KK3RlbXBbMS0qXV9taW5fYWxhcm0KK3RlbXBbMS0qXV9tYXhfYWxhcm0KK3RlbXBbMS0qXV9jcml0X2FsYXJtCisJCUxpbWl0IGFsYXJtCisJCTA6IG5vIGFsYXJtCisJCTE6IGFsYXJtCisJCVJPCisKK0VhY2ggaW5wdXQgY2hhbm5lbCBtYXkgaGF2ZSBhbiBhc3NvY2lhdGVkIGZhdWx0IGZpbGUuIFRoaXMgY2FuIGJlIHVzZWQKK3RvIG5vdGlmeSBvcGVuIGRpb2RlcywgdW5jb25uZWN0ZWQgZmFucyBldGMuIHdoZXJlIHRoZSBoYXJkd2FyZQorc3VwcG9ydHMgaXQuIFdoZW4gdGhpcyBib29sZWFuIGhhcyB2YWx1ZSAxLCB0aGUgbWVhc3VyZW1lbnQgZm9yIHRoYXQKK2NoYW5uZWwgc2hvdWxkIG5vdCBiZSB0cnVzdGVkLgorCitpblswLSpdX2lucHV0X2ZhdWx0CitmYW5bMS0qXV9pbnB1dF9mYXVsdAordGVtcFsxLSpdX2lucHV0X2ZhdWx0CisJCUlucHV0IGZhdWx0IGNvbmRpdGlvbgorCQkwOiBubyBmYXVsdCBvY2N1cmVkCisJCTE6IGZhdWx0IGNvbmRpdGlvbgorCQlSTworCitTb21lIGNoaXBzIGFsc28gb2ZmZXIgdGhlIHBvc3NpYmlsaXR5IHRvIGdldCBiZWVwZWQgd2hlbiBhbiBhbGFybSBvY2N1cnM6CisKK2JlZXBfZW5hYmxlCU1hc3RlciBiZWVwIGVuYWJsZQorCQkwOiBubyBiZWVwcworCQkxOiBiZWVwcworCQlSVworCitpblswLSpdX2JlZXAKK2ZhblsxLSpdX2JlZXAKK3RlbXBbMS0qXV9iZWVwCisJCUNoYW5uZWwgYmVlcAorCQkwOiBkaXNhYmxlCisJCTE6IGVuYWJsZQorCQlSVworCitJbiB0aGVvcnksIGEgY2hpcCBjb3VsZCBwcm92aWRlIHBlci1saW1pdCBiZWVwIG1hc2tpbmcsIGJ1dCBubyBzdWNoIGNoaXAKK3dhcyBzZWVuIHNvIGZhci4KKworT2xkIGRyaXZlcnMgcHJvdmlkZWQgYSBkaWZmZXJlbnQsIG5vbi1zdGFuZGFyZCBpbnRlcmZhY2UgdG8gYWxhcm1zIGFuZAorYmVlcHMuIFRoZXNlIGludGVyZmFjZSBmaWxlcyBhcmUgZGVwcmVjYXRlZCwgYnV0IHdpbGwgYmUga2VwdCBhcm91bmQKK2ZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnM6CiAKIGFsYXJtcwkJQWxhcm0gYml0bWFzay4KLQkJUmVhZCBvbmx5LgorCQlSTwogCQlJbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIG9uZSB0byBmb3VyIGJ5dGVzLgogCQlBICcxJyBiaXQgbWVhbnMgYW4gYWxhcm0uCiAJCUNoaXBzIHNob3VsZCBiZSBwcm9ncmFtbWVkIGZvciAnY29tcGFyYXRvcicgbW9kZSBzbyB0aGF0CkBAIC0yNTksMzUgKzM2OCwyNiBAQAogCQlpZiBpdCBpcyBzdGlsbCB2YWxpZC4KIAkJR2VuZXJhbGx5IGEgZGlyZWN0IHJlcHJlc2VudGF0aW9uIG9mIGEgY2hpcCdzIGludGVybmFsCiAJCWFsYXJtIHJlZ2lzdGVyczsgdGhlcmUgaXMgbm8gc3RhbmRhcmQgZm9yIHRoZSBwb3NpdGlvbgotCQlvZiBpbmRpdmlkdWFsIGJpdHMuCisJCW9mIGluZGl2aWR1YWwgYml0cy4gRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIHRoaXMKKwkJaW50ZXJmYWNlIGZpbGUgZm9yIG5ldyBkcml2ZXJzIGlzIGRpc2NvdXJhZ2VkLiBVc2UKKwkJaW5kaXZpZHVhbCAqX2FsYXJtIGFuZCAqX2ZhdWx0IGZpbGVzIGluc3RlYWQuCiAJCUJpdHMgYXJlIGRlZmluZWQgaW4ga2VybmVsL2luY2x1ZGUvc2Vuc29ycy5oLgogCi1hbGFybXNfaW4JQWxhcm0gYml0bWFzayByZWxhdGl2ZSB0byBpbiAodm9sdGFnZSkgY2hhbm5lbHMKLQkJUmVhZCBvbmx5Ci0JCUEgJzEnIGJpdCBtZWFucyBhbiBhbGFybSwgTFNCIGNvcnJlc3BvbmRzIHRvIGluMCBhbmQgc28gb24KLQkJUHJlZmVyZWQgdG8gJ2FsYXJtcycgZm9yIG5ld2VyIGNoaXBzCi0KLWFsYXJtc19mYW4JQWxhcm0gYml0bWFzayByZWxhdGl2ZSB0byBmYW4gY2hhbm5lbHMKLQkJUmVhZCBvbmx5Ci0JCUEgJzEnIGJpdCBtZWFucyBhbiBhbGFybSwgTFNCIGNvcnJlc3BvbmRzIHRvIGZhbjEgYW5kIHNvIG9uCi0JCVByZWZlcmVkIHRvICdhbGFybXMnIGZvciBuZXdlciBjaGlwcwotCi1hbGFybXNfdGVtcAlBbGFybSBiaXRtYXNrIHJlbGF0aXZlIHRvIHRlbXAgKHRlbXBlcmF0dXJlKSBjaGFubmVscwotCQlSZWFkIG9ubHkKLQkJQSAnMScgYml0IG1lYW5zIGFuIGFsYXJtLCBMU0IgY29ycmVzcG9uZHMgdG8gdGVtcDEgYW5kIHNvIG9uCi0JCVByZWZlcmVkIHRvICdhbGFybXMnIGZvciBuZXdlciBjaGlwcwotCi1iZWVwX2VuYWJsZQlCZWVwL2ludGVycnVwdCBlbmFibGUKLQkJMCB0byBkaXNhYmxlLgotCQkxIHRvIGVuYWJsZS4KLQkJUmVhZC9Xcml0ZQotCiBiZWVwX21hc2sJQml0bWFzayBmb3IgYmVlcC4KLQkJU2FtZSBmb3JtYXQgYXMgJ2FsYXJtcycgd2l0aCB0aGUgc2FtZSBiaXQgbG9jYXRpb25zLgotCQlSZWFkL1dyaXRlCisJCVNhbWUgZm9ybWF0IGFzICdhbGFybXMnIHdpdGggdGhlIHNhbWUgYml0IGxvY2F0aW9ucywKKwkJdXNlIGRpc2NvdXJhZ2VkIGZvciB0aGUgc2FtZSByZWFzb24uIFVzZSBpbmRpdmlkdWFsCisJCSpfYmVlcCBmaWxlcyBpbnN0ZWFkLgorCQlSVworCisKKyoqKioqKioqKgorKiBPdGhlciAqCisqKioqKioqKioKIAogZWVwcm9tCQlSYXcgRUVQUk9NIGRhdGEgaW4gYmluYXJ5IGZvcm0uCi0JCVJlYWQgb25seS4KKwkJUk8KIAogcGVjCQlFbmFibGUgb3IgZGlzYWJsZSBQRUMgKFNNQnVzIG9ubHkpCi0JCVJlYWQvV3JpdGUKKwkJMDogZGlzYWJsZQorCQkxOiBlbmFibGUKKwkJUlcKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vdXNlcnNwYWNlLXRvb2xzIGIvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKaW5kZXggMjYyMmFhYy4uMTk5MDBhOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi91c2Vyc3BhY2UtdG9vbHMKQEAgLTYsMzEgKzYsMzIgQEAKIGFyZSBhbHNvIGNvbm5lY3RlZCBkaXJlY3RseSB0aHJvdWdoIHRoZSBJU0EgYnVzLgogCiBUaGUga2VybmVsIGRyaXZlcnMgbWFrZSB0aGUgZGF0YSBmcm9tIHRoZSBzZW5zb3IgY2hpcHMgYXZhaWxhYmxlIGluIHRoZSAvc3lzCi12aXJ0dWFsIGZpbGVzeXN0ZW0uIFVzZXJzcGFjZSB0b29scyBhcmUgdGhlbiB1c2VkIHRvIGRpc3BsYXkgb3Igc2V0IG9yIHRoZQotZGF0YSBpbiBhIG1vcmUgZnJpZW5kbHkgbWFubmVyLgordmlydHVhbCBmaWxlc3lzdGVtLiBVc2Vyc3BhY2UgdG9vbHMgYXJlIHRoZW4gdXNlZCB0byBkaXNwbGF5IHRoZSBtZWFzdXJlZAordmFsdWVzIG9yIGNvbmZpZ3VyZSB0aGUgY2hpcHMgaW4gYSBtb3JlIGZyaWVuZGx5IG1hbm5lci4KIAogTG0tc2Vuc29ycwogLS0tLS0tLS0tLQogCi1Db3JlIHNldCBvZiB1dGlsaXRlcyB0aGF0IHdpbGwgYWxsb3cgeW91IHRvIG9idGFpbiBoZWFsdGggaW5mb3JtYXRpb24sCitDb3JlIHNldCBvZiB1dGlsaXRpZXMgdGhhdCB3aWxsIGFsbG93IHlvdSB0byBvYnRhaW4gaGVhbHRoIGluZm9ybWF0aW9uLAogc2V0dXAgbW9uaXRvcmluZyBsaW1pdHMgZXRjLiBZb3UgY2FuIGdldCB0aGVtIG9uIHRoZWlyIGhvbWVwYWdlCiBodHRwOi8vd3d3LmxtLXNlbnNvcnMubnUvIG9yIGFzIGEgcGFja2FnZSBmcm9tIHlvdXIgTGludXggZGlzdHJpYnV0aW9uLgogCiBJZiBmcm9tIHdlYnNpdGU6Ci1HZXQgbG1zZW5zb3JzIGZyb20gcHJvamVjdCB3ZWIgc2l0ZS4gUGxlYXNlIG5vdGUsIHlvdSBuZWVkIG9ubHkgdXNlcnNwYWNlCi1wYXJ0LCBzbyBjb21waWxlIHdpdGggIm1ha2UgdXNlcl9pbnN0YWxsIiB0YXJnZXQuCitHZXQgbG0tc2Vuc29ycyBmcm9tIHByb2plY3Qgd2ViIHNpdGUuIFBsZWFzZSBub3RlLCB5b3UgbmVlZCBvbmx5IHVzZXJzcGFjZQorcGFydCwgc28gY29tcGlsZSB3aXRoICJtYWtlIHVzZXIiIGFuZCBpbnN0YWxsIHdpdGggIm1ha2UgdXNlcl9pbnN0YWxsIi4KIAogR2VuZXJhbCBoaW50cyB0byBnZXQgdGhpbmdzIHdvcmtpbmc6CiAKIDApIGdldCBsbS1zZW5zb3JzIHVzZXJzcGFjZSB1dGlscwotMSkgY29tcGlsZSBhbGwgZHJpdmVycyBpbiBJMkMgc2VjdGlvbiBhcyBtb2R1bGVzIGluIHlvdXIga2VybmVsCisxKSBjb21waWxlIGFsbCBkcml2ZXJzIGluIEkyQyBhbmQgSGFyZHdhcmUgTW9uaXRvcmluZyBzZWN0aW9ucyBhcyBtb2R1bGVzCisgICBpbiB5b3VyIGtlcm5lbAogMikgcnVuIHNlbnNvcnMtZGV0ZWN0IHNjcmlwdCwgaXQgd2lsbCB0ZWxsIHlvdSB3aGF0IG1vZHVsZXMgeW91IG5lZWQgdG8gbG9hZC4KIDMpIGxvYWQgdGhlbSBhbmQgcnVuICJzZW5zb3JzIiBjb21tYW5kLCB5b3Ugc2hvdWxkIHNlZSBzb21lIHJlc3VsdHMuCiA0KSBmaXggc2Vuc29ycy5jb25mLCBsYWJlbHMsIGxpbWl0cywgZmFuIGRpdmlzb3JzCiA1KSBpZiBhbnkgbW9yZSBwcm9ibGVtcyBjb25zdWx0IEZBUSwgb3IgZG9jdW1lbnRhdGlvbgogCi1PdGhlciB1dGlsaXRlcwotLS0tLS0tLS0tLS0tLS0KK090aGVyIHV0aWxpdGllcworLS0tLS0tLS0tLS0tLS0tCiAKIElmIHlvdSB3YW50IHNvbWUgZ3JhcGhpY2FsIGluZGljYXRvcnMgb2Ygc3lzdGVtIGhlYWx0aCBsb29rIGZvciBhcHBsaWNhdGlvbnMKIGxpa2U6IGdrcmVsbG0sIGtzZW5zb3JzLCB4c2Vuc29ycywgd210ZW1wLCB3bXNlbnNvcnMsIHdtZ3RlbXAsIGtzeXNndWFyZGQsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MWQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3c4Mzc5MWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhMzgzNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vdzgzNzkxZApAQCAtMCwwICsxLDExMyBAQAorS2VybmVsIGRyaXZlciB3ODM3OTFkCis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIFdpbmJvbmQgVzgzNzkxRAorICAgIFByZWZpeDogJ3c4Mzc5MWQnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDJjIC0gMHgyZgorICAgIERhdGFzaGVldDogaHR0cDovL3d3dy53aW5ib25kLXVzYS5jb20vcHJvZHVjdHMvd2luYm9uZF9wcm9kdWN0cy9wZGZzL1BDSUMvVzgzNzkxRGEucGRmCisKK0F1dGhvcjogQ2hhcmxlcyBTcGlyYWtpcyA8YmV6YXVyQGdtYWlsLmNvbT4KKworVGhpcyBkcml2ZXIgd2FzIGRlcml2ZWQgZnJvbSB0aGUgdzgzNzgxZC5jIGFuZCB3ODM3OTJkLmMgc291cmNlIGZpbGVzLgorCitDcmVkaXRzOgorICB3ODM3ODFkLmM6CisgICAgRnJvZG8gTG9vaWphYXJkIDxmcm9kb2xAZGRzLm5sPiwKKyAgICBQaGlsaXAgRWRlbGJyb2NrIDxwaGlsQG5ldHJvZWRnZS5jb20+LAorICAgIGFuZCBNYXJrIFN0dWRlYmFrZXIgPG1kc3h5ejEyM0B5YWhvby5jb20+CisgIHc4Mzc5MmQuYzoKKyAgICBDaHVuaGFvIEh1YW5nIDxEWlNoZW5AV2luYm9uZC5jb20udHc+LAorICAgIFJ1ZG9sZiBNYXJlayA8ci5tYXJla0BzaC5jdnV0LmN6PgorCitNb2R1bGUgUGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLS0KKworKiBpbml0IGJvb2xlYW4KKyAgKGRlZmF1bHQgMCkKKyAgVXNlICdpbml0PTEnIHRvIGhhdmUgdGhlIGRyaXZlciBkbyBleHRyYSBzb2Z0d2FyZSBpbml0aWFsaXphdGlvbnMuCisgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGRvIHRoZSBtaW5pbXVtIGluaXRpYWxpemF0aW9uIHBvc3NpYmxlCisgIGFuZCBkZXBlbmQgb24gdGhlIEJJT1MgdG8gcHJvcGVybHkgc2V0dXAgdGhlIGNoaXAuIElmIHlvdSBrbm93IHlvdQorICBoYXZlIGEgdzgzNzkxZCBhbmQgeW91J3JlIGhhdmluZyBwcm9ibGVtcywgdHJ5IGluaXQ9MSBiZWZvcmUgdHJ5aW5nCisgIHJlc2V0PTEuCisKKyogcmVzZXQgYm9vbGVhbgorICAoZGVmYXVsdCAwKQorICBVc2UgJ3Jlc2V0PTEnIHRvIHJlc2V0IHRoZSBjaGlwICh2aWEgaW5kZXggMHg0MCwgYml0IDcpLiBUaGUgZGVmYXVsdAorICBiZWhhdmlvciBpcyBubyBjaGlwIHJlc2V0IHRvIHByZXNlcnZlIEJJT1Mgc2V0dGluZ3MuCisKKyogZm9yY2Vfc3ViY2xpZW50cz1idXMsY2FkZHIsc2FkZHIsc2FkZHIKKyAgVGhpcyBpcyB1c2VkIHRvIGZvcmNlIHRoZSBpMmMgYWRkcmVzc2VzIGZvciBzdWJjbGllbnRzIG9mCisgIGEgY2VydGFpbiBjaGlwLiBFeGFtcGxlIHVzYWdlIGlzIGBmb3JjZV9zdWJjbGllbnRzPTAsMHgyZiwweDRhLDB4NGInCisgIHRvIGZvcmNlIHRoZSBzdWJjbGllbnRzIG9mIGNoaXAgMHgyZiBvbiBidXMgMCB0byBpMmMgYWRkcmVzc2VzCisgIDB4NGEgYW5kIDB4NGIuCisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIFdpbmJvbmQgVzgzNzkxRCBjaGlwLgorCitEZXRlY3Rpb24gb2YgdGhlIGNoaXAgY2FuIHNvbWV0aW1lcyBiZSBmb2lsZWQgYmVjYXVzZSBpdCBjYW4gYmUgaW4gYW4KK2ludGVybmFsIHN0YXRlIHRoYXQgYWxsb3dzIG5vIGNsZWFuIGFjY2VzcyAoQmFuayB3aXRoIElEIHJlZ2lzdGVyIGlzIG5vdAorY3VycmVudGx5IHNlbGVjdGVkKS4gSWYgeW91IGtub3cgdGhlIGFkZHJlc3Mgb2YgdGhlIGNoaXAsIHVzZSBhICdmb3JjZScKK3BhcmFtZXRlcjsgdGhpcyB3aWxsIHB1dCBpdCBpbnRvIGEgbW9yZSB3ZWxsLWJlaGF2ZWQgc3RhdGUgZmlyc3QuCisKK1RoZSBkcml2ZXIgaW1wbGVtZW50cyB0aHJlZSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBmaXZlIGZhbiByb3RhdGlvbiBzcGVlZAorc2Vuc29ycywgYW5kIHRlbiB2b2x0YWdlIHNlbnNvcnMuCisKK1RlbXBlcmF0dXJlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBDZWxzaXVzIGFuZCBtZWFzdXJlbWVudCByZXNvbHV0aW9uIGlzIDEKK2RlZ0MgZm9yIHRlbXAxIGFuZCAwLjUgZGVnQyBmb3IgdGVtcDIgYW5kIHRlbXAzLiBBbiBhbGFybSBpcyB0cmlnZ2VyZWQgd2hlbgordGhlIHRlbXBlcmF0dXJlIGdldHMgaGlnaGVyIHRoYW4gdGhlIE92ZXJ0ZW1wZXJhdHVyZSBTaHV0ZG93biB2YWx1ZTsgaXQgc3RheXMKK29uIHVudGlsIHRoZSB0ZW1wZXJhdHVyZSBmYWxscyBiZWxvdyB0aGUgSHlzdGVyZXNpcyB2YWx1ZS4KKworRmFuIHJvdGF0aW9uIHNwZWVkcyBhcmUgcmVwb3J0ZWQgaW4gUlBNIChyb3RhdGlvbnMgcGVyIG1pbnV0ZSkuIEFuIGFsYXJtIGlzCit0cmlnZ2VyZWQgaWYgdGhlIHJvdGF0aW9uIHNwZWVkIGhhcyBkcm9wcGVkIGJlbG93IGEgcHJvZ3JhbW1hYmxlIGxpbWl0LiBGYW4KK3JlYWRpbmdzIGNhbiBiZSBkaXZpZGVkIGJ5IGEgcHJvZ3JhbW1hYmxlIGRpdmlkZXIgKDEsIDIsIDQsIDggZm9yIGZhbiAxLzIvMworYW5kIDEsIDIsIDQsIDgsIDE2LCAzMiwgNjQgb3IgMTI4IGZvciBmYW4gNC81KSB0byBnaXZlIHRoZSByZWFkaW5ncyBtb3JlCityYW5nZSBvciBhY2N1cmFjeS4KKworVm9sdGFnZSBzZW5zb3JzIChhbHNvIGtub3duIGFzIElOIHNlbnNvcnMpIHJlcG9ydCB0aGVpciB2YWx1ZXMgaW4gbWlsbGl2b2x0cy4KK0FuIGFsYXJtIGlzIHRyaWdnZXJlZCBpZiB0aGUgdm9sdGFnZSBoYXMgY3Jvc3NlZCBhIHByb2dyYW1tYWJsZSBtaW5pbXVtCitvciBtYXhpbXVtIGxpbWl0LgorCitBbGFybXMgYXJlIHByb3ZpZGVkIGFzIG91dHB1dCBmcm9tIGEgInJlYWx0aW1lIHN0YXR1cyByZWdpc3RlciIuIFRoZQorZm9sbG93aW5nIGJpdHMgYXJlIGRlZmluZWQ6CisKK2JpdCAtIGFsYXJtIG9uOgorMCAgLSBWY29yZQorMSAgLSBWSU5SMAorMiAgLSArMy4zVklOCiszICAtIDVWREQKKzQgIC0gdGVtcDEKKzUgIC0gdGVtcDIKKzYgIC0gZmFuMQorNyAgLSBmYW4yCis4ICAtICsxMlZJTgorOSAgLSAtMTJWSU4KKzEwIC0gLTVWSU4KKzExIC0gZmFuMworMTIgLSBjaGFzc2lzCisxMyAtIHRlbXAzCisxNCAtIFZJTlIxCisxNSAtIHJlc2VydmVkCisxNiAtIHRhcnQxCisxNyAtIHRhcnQyCisxOCAtIHRhcnQzCisxOSAtIFZTQgorMjAgLSBWQkFUCisyMSAtIGZhbjQKKzIyIC0gZmFuNQorMjMgLSByZXNlcnZlZAorCitXaGVuIGFuIGFsYXJtIGdvZXMgb2ZmLCB5b3UgY2FuIGJlIHdhcm5lZCBieSBhIGJlZXBpbmcgc2lnbmFsIHRocm91Z2ggeW91cgorY29tcHV0ZXIgc3BlYWtlci4gSXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIGFsbCBiZWVwaW5nIGdsb2JhbGx5LCBvciBvbmx5Cit0aGUgYmVlcGluZyBmb3Igc29tZSBhbGFybXMuCisKK1RoZSBkcml2ZXIgb25seSByZWFkcyB0aGUgY2hpcCB2YWx1ZXMgZWFjaCAzIHNlY29uZHM7IHJlYWRpbmcgdGhlbSBtb3JlCitvZnRlbiB3aWxsIGRvIG5vIGhhcm0sIGJ1dCB3aWxsIHJldHVybiAnb2xkJyB2YWx1ZXMuCisKK1c4Mzc5MUQgVE9ETzoKKy0tLS0tLS0tLS0tLS0tLQorUHJvdmlkZSBhIHBhdGNoIGZvciBwZXItZmlsZSBhbGFybXMgYXMgZGlzY3Vzc2VkIG9uIHRoZSBtYWlsaW5nIGxpc3QKK1Byb3ZpZGUgYSBwYXRjaCBmb3Igc21hcnQtZmFuIGNvbnRyb2wgKHN0aWxsIG5lZWQgYXBwcm9wcmlhdGUgbW90aGVyYm9hcmQvZmFucykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMSBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtaTgwMQppbmRleCBmZDRiMjcxLi5lNDZjMjM0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLWk4MDEKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1pODAxCkBAIC0yMSw4ICsyMSw3IEBACiBNb2R1bGUgUGFyYW1ldGVycwogLS0tLS0tLS0tLS0tLS0tLS0KIAotKiBmb3JjZV9hZGRyOiBpbnQKLSAgRm9yY2libHkgZW5hYmxlIHRoZSBJQ0ggYXQgdGhlIGdpdmVuIGFkZHJlc3MuIEVYVFJFTUVMWSBEQU5HRVJPVVMhCitOb25lLgogCiAKIERlc2NyaXB0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIKaW5kZXggZDc1MTI4Mi4uY2Q0OWM0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1uZm9yY2UyCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMgpAQCAtNyw2ICs3LDggQEAKICAgKiBuRm9yY2UzIDI1MEdiIE1DUCAgICAgICAgICAxMGRlOjAwRTQgCiAgICogbkZvcmNlNCBNQ1AgICAgICAgICAgICAgICAgMTBkZTowMDUyCiAgICogbkZvcmNlNCBNQ1AtMDQgICAgICAgICAgICAgMTBkZTowMDM0CisgICogbkZvcmNlNCBNQ1A1MSAgICAgICAgICAgICAgMTBkZTowMjY0CisgICogbkZvcmNlNCBNQ1A1NSAgICAgICAgICAgICAgMTBkZTowMzY4CiAKIERhdGFzaGVldDogbm90IHB1YmxpY2FsbHkgYXZhaWxhYmxlLCBidXQgc2VlbXMgdG8gYmUgc2ltaWxhciB0byB0aGUKICAgICAgICAgICAgQU1ELTgxMTEgU01CdXMgMi4wIGFkYXB0ZXIuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW9jb3JlcyBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtb2NvcmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2ViYjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW9jb3JlcwpAQCAtMCwwICsxLDUxIEBACitLZXJuZWwgZHJpdmVyIGkyYy1vY29yZXMKKworU3VwcG9ydGVkIGFkYXB0ZXJzOgorICAqIE9wZW5Db3Jlcy5vcmcgSTJDIGNvbnRyb2xsZXIgYnkgUmljaGFyZCBIZXJ2ZWlsbGUgKHNlZSBkYXRhc2hlZXQgbGluaykKKyAgICBEYXRhc2hlZXQ6IGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9wcm9qZWN0cy5jZ2kvd2ViL2kyYy9vdmVydmlldworCitBdXRob3I6IFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitpMmMtb2NvcmVzIGlzIGFuIGkyYyBidXMgZHJpdmVyIGZvciB0aGUgT3BlbkNvcmVzLm9yZyBJMkMgY29udHJvbGxlcgorSVAgY29yZSBieSBSaWNoYXJkIEhlcnZlaWxsZS4KKworVXNhZ2UKKy0tLS0tCisKK2kyYy1vY29yZXMgdXNlcyB0aGUgcGxhdGZvcm0gYnVzLCBzbyB5b3UgbmVlZCB0byBwcm92aWRlIGEgc3RydWN0CitwbGF0Zm9ybV9kZXZpY2Ugd2l0aCB0aGUgYmFzZSBhZGRyZXNzIGFuZCBpbnRlcnJ1cHQgbnVtYmVyLiBUaGUKK2Rldi5wbGF0Zm9ybV9kYXRhIG9mIHRoZSBkZXZpY2Ugc2hvdWxkIGFsc28gcG9pbnQgdG8gYSBzdHJ1Y3QKK29jb3Jlc19pMmNfcGxhdGZvcm1fZGF0YSAoc2VlIGxpbnV4L2kyYy1vY29yZXMuaCkgZGVzY3JpYmluZyB0aGUKK2Rpc3RhbmNlIGJldHdlZW4gcmVnaXN0ZXJzIGFuZCB0aGUgaW5wdXQgY2xvY2sgc3BlZWQuCisKK0UuRy4gc29tZXRoaW5nIGxpa2U6CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugb2NvcmVzX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gTVlJMkNfQkFTRUFERFIsCisJCS5lbmQJPSBNWUkyQ19CQVNFQUREUiArIDgsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzFdID0geworCQkuc3RhcnQJPSBNWUkyQ19JUlEsCisJCS5lbmQJPSBNWUkyQ19JUlEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG9jb3Jlc19pMmNfcGxhdGZvcm1fZGF0YSBteWkyY19kYXRhID0geworCS5yZWdzdGVwCT0gMiwJCS8qIHR3byBieXRlcyBiZXR3ZWVuIHJlZ2lzdGVycyAqLworCS5jbG9ja19raHoJPSA1MDAwMCwJLyogaW5wdXQgY2xvY2sgb2YgNTBNSHogKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG15aTJjID0geworCS5uYW1lCQkJPSAib2NvcmVzLWkyYyIsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmbXlpMmNfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUob2NvcmVzX3Jlc291cmNlcyksCisJLnJlc291cmNlCQk9IG9jb3Jlc19yZXNvdXJjZXMsCit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NCBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtcGlpeDQKaW5kZXggYTFjOGY1OC4uOTIxNDc2MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1waWl4NAorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLXBpaXg0CkBAIC02LDYgKzYsOCBAQAogICAgIERhdGFzaGVldDogUHVibGljbHkgYXZhaWxhYmxlIGF0IHRoZSBJbnRlbCB3ZWJzaXRlCiAgICogU2VydmVyV29ya3MgT1NCNCwgQ1NCNSwgQ1NCNiBhbmQgSFQtMTAwMCBzb3V0aGJyaWRnZXMKICAgICBEYXRhc2hlZXQ6IE9ubHkgYXZhaWxhYmxlIHZpYSBOREEgZnJvbSBTZXJ2ZXJXb3JrcworICAqIEFUSSBJWFAgc291dGhicmlkZ2VzIElYUDIwMCwgSVhQMzAwLCBJWFA0MDAKKyAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUKICAgKiBTdGFuZGFyZCBNaWNyb3N5c3RlbXMgKFNNU0MpIFNMQzkwRTY2IChWaWN0b3J5NjYpIHNvdXRoYnJpZGdlCiAgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgdGhlIFNNU0Mgd2Vic2l0ZSBodHRwOi8vd3d3LnNtc2MuY29tCiAKQEAgLTIxLDggKzIzLDYgQEAKICAgRm9yY2libHkgZW5hYmxlIHRoZSBQSUlYNC4gREFOR0VST1VTIQogKiBmb3JjZV9hZGRyOiBpbnQKICAgRm9yY2libHkgZW5hYmxlIHRoZSBQSUlYNCBhdCB0aGUgZ2l2ZW4gYWRkcmVzcy4gRVhUUkVNRUxZIERBTkdFUk9VUyEKLSogZml4X2hzdGNmZzogaW50Ci0gIEZpeCBjb25maWcgcmVnaXN0ZXIuIE5lZWRlZCBvbiBzb21lIGJvYXJkcyAoRm9yY2UgQ1BDSTczNSkuCiAKIAogRGVzY3JpcHRpb24KQEAgLTYzLDEwICs2MywzNiBAQAogVGhlIFBJSVgvUElJWDMgZG9lcyBub3QgaW1wbGVtZW50IGFuIFNNQnVzIG9yIEkyQyBidXMsIHNvIHlvdSBjYW4ndCB1c2UKIHRoaXMgZHJpdmVyIG9uIHRob3NlIG1haW5ib2FyZHMuCiAKLVRoZSBTZXJ2ZXJXb3JrcyBTb3V0aGJyaWRnZXMsIHRoZSBJbnRlbCA0NDBNWCwgYW5kIHRoZSBWaWN0b3J5NzY2IGFyZQorVGhlIFNlcnZlcldvcmtzIFNvdXRoYnJpZGdlcywgdGhlIEludGVsIDQ0ME1YLCBhbmQgdGhlIFZpY3Rvcnk2NiBhcmUKIGlkZW50aWNhbCB0byB0aGUgUElJWDQgaW4gSTJDL1NNQnVzIHN1cHBvcnQuCiAKLUEgZmV3IE9TQjQgc291dGhicmlkZ2VzIGFyZSBrbm93biB0byBiZSBtaXNjb25maWd1cmVkIGJ5IHRoZSBCSU9TLiBJbiB0aGlzCi1jYXNlLCB5b3UgaGF2ZSB5b3UgdXNlIHRoZSBmaXhfaHN0Y2ZnIG1vZHVsZSBwYXJhbWV0ZXIuIERvIG5vdCB1c2UgaXQKLXVubGVzcyB5b3Uga25vdyB5b3UgaGF2ZSB0bywgYmVjYXVzZSBpbiBzb21lIGNhc2VzIGl0IGFsc28gYnJlYWtzCi1jb25maWd1cmF0aW9uIG9uIHNvdXRoYnJpZGdlcyB0aGF0IGRvbid0IG5lZWQgaXQuCitJZiB5b3Ugb3duIEZvcmNlIENQQ0k3MzUgbW90aGVyYm9hcmQgb3Igb3RoZXIgT1NCNCBiYXNlZCBzeXN0ZW1zIHlvdSBtYXkgbmVlZAordG8gY2hhbmdlIHRoZSBTTUJ1cyBJbnRlcnJ1cHQgU2VsZWN0IHJlZ2lzdGVyIHNvIHRoZSBTTUJ1cyBjb250cm9sbGVyIHVzZXMKK3RoZSBTTUkgbW9kZS4KKworMSkgVXNlIGxzcGNpIGNvbW1hbmQgYW5kIGxvY2F0ZSB0aGUgUENJIGRldmljZSB3aXRoIHRoZSBTTUJ1cyBjb250cm9sbGVyOgorICAgMDA6MGYuMCBJU0EgYnJpZGdlOiBTZXJ2ZXJXb3JrcyBPU0I0IFNvdXRoIEJyaWRnZSAocmV2IDRmKQorICAgVGhlIGxpbmUgbWF5IHZhcnkgZm9yIGRpZmZlcmVudCBjaGlwc2V0cy4gUGxlYXNlIGNvbnN1bHQgdGhlIGRyaXZlciBzb3VyY2UKKyAgIGZvciBhbGwgcG9zc2libGUgUENJIGlkcyAoYW5kIGxzcGNpIC1uIHRvIG1hdGNoIHRoZW0pLiBMZXRzIGFzc3VtZSB0aGUKKyAgIGRldmljZSBpcyBsb2NhdGVkIGF0IDAwOjBmLjAuCisyKSBOb3cgeW91IGp1c3QgbmVlZCB0byBjaGFuZ2UgdGhlIHZhbHVlIGluIDB4RDIgcmVnaXN0ZXIuIEdldCBpdCBmaXJzdCB3aXRoCisgICBjb21tYW5kOiBsc3BjaSAteHh4IC1zIDAwOjBmLjAKKyAgIElmIHRoZSB2YWx1ZSBpcyAweDMgdGhlbiB5b3UgbmVlZCB0byBjaGFuZ2UgaXQgdG8gMHgxCisgICBzZXRwY2kgIC1zIDAwOjBmLjAgZDIuYj0xCisKK1BsZWFzZSBub3RlIHRoYXQgeW91IGRvbid0IG5lZWQgdG8gZG8gdGhhdCBpbiBhbGwgY2FzZXMsIGp1c3Qgd2hlbiB0aGUgU01CdXMgaXMKK25vdCB3b3JraW5nIHByb3Blcmx5LgorCisKK0hhcmR3YXJlLXNwZWNpZmljIGlzc3VlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIHdpbGwgcmVmdXNlIHRvIGxvYWQgb24gSUJNIHN5c3RlbXMgd2l0aCBhbiBJbnRlbCBQSUlYNCBTTUJ1cy4KK1NvbWUgb2YgdGhlc2UgbWFjaGluZXMgaGF2ZSBhbiBSRklEIEVFUFJPTSAoMjRSRjA4KSBjb25uZWN0ZWQgdG8gdGhlIFNNQnVzLAord2hpY2ggY2FuIGVhc2lseSBnZXQgY29ycnVwdGVkIGR1ZSB0byBhIHN0YXRlIG1hY2hpbmUgYnVnLiBUaGVzZSBhcmUgbW9zdGx5CitUaGlua3BhZCBsYXB0b3BzLCBidXQgZGVza3RvcCBzeXN0ZW1zIG1heSBhbHNvIGJlIGFmZmVjdGVkLiBXZSBoYXZlIG5vIGxpc3QKK29mIGFsbCBhZmZlY3RlZCBzeXN0ZW1zLCBzbyB0aGUgb25seSBzYWZlIHNvbHV0aW9uIHdhcyB0byBwcmV2ZW50IGFjY2VzcyB0bwordGhlIFNNQnVzIG9uIGFsbCBJQk0gc3lzdGVtcyAoZGV0ZWN0ZWQgdXNpbmcgRE1JIGRhdGEuKQorCitGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgcmVhZDoKK2h0dHA6Ly93d3cyLmxtLXNlbnNvcnMubnUvfmxtNzgvY3ZzL2xtX3NlbnNvcnMyL1JFQURNRS50aGlua3BhZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL3NjeDIwMF9hY2IgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvc2N4MjAwX2FjYgppbmRleCBmNTBlNjk5Li43YzA3ODgzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvc2N4MjAwX2FjYgorKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvc2N4MjAwX2FjYgpAQCAtMiwxNCArMiwzMSBAQAogCiBBdXRob3I6IENocmlzdGVyIFdlaW5pZ2VsIDx3aW5nZWxAbmFuby1zeXN0ZW0uY29tPgogCitUaGUgZHJpdmVyIHN1cGVyc2VkZXMgdGhlIG9sZGVyLCBuZXZlciBtZXJnZWQgZHJpdmVyIG5hbWVkIGkyYy1uc2NhY2IuCisKIE1vZHVsZSBQYXJhbWV0ZXJzCiAtLS0tLS0tLS0tLS0tLS0tLQogCi0qIGJhc2U6IGludAorKiBiYXNlOiB1cCB0byA0IGludHMKICAgQmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBBQ0NFU1MuYnVzIGNvbnRyb2xsZXJzIG9uIFNDeDIwMCBhbmQgU0MxMTAwIGRldmljZXMKIAorICBCeSBkZWZhdWx0IHRoZSBkcml2ZXIgdXNlcyB0d28gYmFzZSBhZGRyZXNzZXMgMHg4MjAgYW5kIDB4ODQwLgorICBJZiB5b3Ugd2FudCBvbmx5IG9uZSBiYXNlIGFkZHJlc3MsIHNwZWNpZnkgdGhlIHNlY29uZCBhcyAwIHNvIGFzIHRvCisgIG92ZXJyaWRlIHRoaXMgZGVmYXVsdC4KKwogRGVzY3JpcHRpb24KIC0tLS0tLS0tLS0tCiAKIEVuYWJsZSB0aGUgdXNlIG9mIHRoZSBBQ0NFU1MuYnVzIGNvbnRyb2xsZXIgb24gdGhlIEdlb2RlIFNDeDIwMCBhbmQKIFNDMTEwMCBwcm9jZXNzb3JzIGFuZCB0aGUgQ1M1NTM1IGFuZCBDUzU1MzYgR2VvZGUgY29tcGFuaW9uIGRldmljZXMuCisKK0RldmljZS1zcGVjaWZpYyBub3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBTQzExMDAgV1JBUCBib2FyZHMgYXJlIGtub3duIHRvIHVzZSBiYXNlIGFkZHJlc3NlcyAweDgxMCBhbmQgMHg4MjAuCitJZiB0aGUgc2N4MjAwX2FjYiBkcml2ZXIgaXMgYnVpbHQgaW50byB0aGUga2VybmVsLCBhZGQgdGhlIGZvbGxvd2luZworcGFyYW1ldGVyIHRvIHlvdXIgYm9vdCBjb21tYW5kIGxpbmU6CisgIHNjeDIwMF9hY2IuYmFzZT0weDgxMCwweDgyMAorSWYgdGhlIHNjeDIwMF9hY2IgZHJpdmVyIGlzIGJ1aWx0IGFzIGEgbW9kdWxlLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvCit0aGUgZmlsZSAvZXRjL21vZHByb2JlLmNvbmYgaW5zdGVhZDoKKyAgb3B0aW9ucyBzY3gyMDBfYWNiIGJhc2U9MHg4MTAsMHg4MjAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaWE2NC9hbGlhc2luZy50eHQgYi9Eb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZjlhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0CkBAIC0wLDAgKzEsMjA4IEBACisJICAgICAgICAgTUVNT1JZIEFUVFJJQlVURSBBTElBU0lORyBPTiBJQS02NAorCisJCQkgICBCam9ybiBIZWxnYWFzCisJCSAgICAgICA8Ympvcm4uaGVsZ2Fhc0BocC5jb20+CisJCQkgICAgTWF5IDQsIDIwMDYKKworCitNRU1PUlkgQVRUUklCVVRFUworCisgICAgSXRhbml1bSBzdXBwb3J0cyBzZXZlcmFsIGF0dHJpYnV0ZXMgZm9yIHZpcnR1YWwgbWVtb3J5IHJlZmVyZW5jZXMuCisgICAgVGhlIGF0dHJpYnV0ZSBpcyBwYXJ0IG9mIHRoZSB2aXJ0dWFsIHRyYW5zbGF0aW9uLCBpLmUuLCBpdCBpcworICAgIGNvbnRhaW5lZCBpbiB0aGUgVExCIGVudHJ5LiAgVGhlIG9uZXMgb2YgbW9zdCBpbnRlcmVzdCB0byB0aGUgTGludXgKKyAgICBrZXJuZWwgYXJlOgorCisJV0IJCVdyaXRlLWJhY2sgKGNhY2hlYWJsZSkKKwlVQwkJVW5jYWNoZWFibGUKKwlXQwkJV3JpdGUtY29hbGVzY2luZworCisgICAgU3lzdGVtIG1lbW9yeSB0eXBpY2FsbHkgdXNlcyB0aGUgV0IgYXR0cmlidXRlLiAgVGhlIFVDIGF0dHJpYnV0ZSBpcworICAgIHVzZWQgZm9yIG1lbW9yeS1tYXBwZWQgSS9PIGRldmljZXMuICBUaGUgV0MgYXR0cmlidXRlIGlzIHVuY2FjaGVhYmxlCisgICAgbGlrZSBVQyBpcywgYnV0IHdyaXRlcyBtYXkgYmUgZGVsYXllZCBhbmQgY29tYmluZWQgdG8gaW5jcmVhc2UKKyAgICBwZXJmb3JtYW5jZSBmb3IgdGhpbmdzIGxpa2UgZnJhbWUgYnVmZmVycy4KKworICAgIFRoZSBJdGFuaXVtIGFyY2hpdGVjdHVyZSByZXF1aXJlcyB0aGF0IHdlIGF2b2lkIGFjY2Vzc2luZyB0aGUgc2FtZQorICAgIHBhZ2Ugd2l0aCBib3RoIGEgY2FjaGVhYmxlIG1hcHBpbmcgYW5kIGFuIHVuY2FjaGVhYmxlIG1hcHBpbmdbMV0uCisKKyAgICBUaGUgZGVzaWduIG9mIHRoZSBjaGlwc2V0IGRldGVybWluZXMgd2hpY2ggYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkCisgICAgb24gd2hpY2ggcmVnaW9ucyBvZiB0aGUgYWRkcmVzcyBzcGFjZS4gIEZvciBleGFtcGxlLCBzb21lIGNoaXBzZXRzCisgICAgc3VwcG9ydCBlaXRoZXIgV0Igb3IgVUMgYWNjZXNzIHRvIG1haW4gbWVtb3J5LCB3aGlsZSBvdGhlcnMgc3VwcG9ydAorICAgIG9ubHkgV0IgYWNjZXNzLgorCitNRU1PUlkgTUFQCisKKyAgICBQbGF0Zm9ybSBmaXJtd2FyZSBkZXNjcmliZXMgdGhlIHBoeXNpY2FsIG1lbW9yeSBtYXAgYW5kIHRoZQorICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBlYWNoIHJlZ2lvbi4gIEF0IGJvb3QtdGltZSwgdGhlIGtlcm5lbCB1c2VzCisgICAgdGhlIEVGSSBHZXRNZW1vcnlNYXAoKSBpbnRlcmZhY2UuICBBQ1BJIGNhbiBhbHNvIGRlc2NyaWJlIG1lbW9yeQorICAgIGRldmljZXMgYW5kIHRoZSBhdHRyaWJ1dGVzIHRoZXkgc3VwcG9ydCwgYnV0IExpbnV4L2lhNjQgY3VycmVudGx5CisgICAgZG9lc24ndCB1c2UgdGhpcyBpbmZvcm1hdGlvbi4KKworICAgIFRoZSBrZXJuZWwgdXNlcyB0aGUgZWZpX21lbW1hcCB0YWJsZSByZXR1cm5lZCBmcm9tIEdldE1lbW9yeU1hcCgpIHRvCisgICAgbGVhcm4gdGhlIGF0dHJpYnV0ZXMgc3VwcG9ydGVkIGJ5IGVhY2ggcmVnaW9uIG9mIHBoeXNpY2FsIGFkZHJlc3MKKyAgICBzcGFjZS4gIFVuZm9ydHVuYXRlbHksIHRoaXMgdGFibGUgZG9lcyBub3QgY29tcGxldGVseSBkZXNjcmliZSB0aGUKKyAgICBhZGRyZXNzIHNwYWNlIGJlY2F1c2Ugc29tZSBtYWNoaW5lcyBvbWl0IHNvbWUgb3IgYWxsIG9mIHRoZSBNTUlPCisgICAgcmVnaW9ucyBmcm9tIHRoZSBtYXAuCisKKyAgICBUaGUga2VybmVsIG1haW50YWlucyBhbm90aGVyIHRhYmxlLCBrZXJuX21lbW1hcCwgd2hpY2ggZGVzY3JpYmVzIHRoZQorICAgIG1lbW9yeSBMaW51eCBpcyBhY3R1YWxseSB1c2luZyBhbmQgdGhlIGF0dHJpYnV0ZSBmb3IgZWFjaCByZWdpb24uCisgICAgVGhpcyBjb250YWlucyBvbmx5IHN5c3RlbSBtZW1vcnk7IGl0IGRvZXMgbm90IGNvbnRhaW4gTU1JTyBzcGFjZS4KKworICAgIFRoZSBrZXJuX21lbW1hcCB0YWJsZSB0eXBpY2FsbHkgY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgc3lzdGVtCisgICAgbWVtb3J5IGRlc2NyaWJlZCBieSB0aGUgZWZpX21lbW1hcC4gIExpbnV4L2lhNjQgY2FuJ3QgdXNlIGFsbCBtZW1vcnkKKyAgICBpbiB0aGUgc3lzdGVtIGJlY2F1c2Ugb2YgY29uc3RyYWludHMgaW1wb3NlZCBieSB0aGUgaWRlbnRpdHkgbWFwcGluZworICAgIHNjaGVtZS4KKworICAgIFRoZSBlZmlfbWVtbWFwIHRhYmxlIGlzIHByZXNlcnZlZCB1bm1vZGlmaWVkIGJlY2F1c2UgdGhlIG9yaWdpbmFsCisgICAgYm9vdC10aW1lIGluZm9ybWF0aW9uIGlzIHJlcXVpcmVkIGZvciBrZXhlYy4KKworS0VSTkVMIElERU5USVRZIE1BUFBJTkdTCisKKyAgICBMaW51eC9pYTY0IGlkZW50aXR5IG1hcHBpbmdzIGFyZSBkb25lIHdpdGggbGFyZ2UgcGFnZXMsIGN1cnJlbnRseQorICAgIGVpdGhlciAxNk1CIG9yIDY0TUIsIHJlZmVycmVkIHRvIGFzICJncmFudWxlcy4iICBDYWNoZWFibGUgbWFwcGluZ3MKKyAgICBhcmUgc3BlY3VsYXRpdmVbMl0sIHNvIHRoZSBwcm9jZXNzb3IgY2FuIHJlYWQgYW55IGxvY2F0aW9uIGluIHRoZQorICAgIHBhZ2UgYXQgYW55IHRpbWUsIGluZGVwZW5kZW50IG9mIHRoZSBwcm9ncmFtbWVyJ3MgaW50ZW50aW9ucy4gIFRoaXMKKyAgICBtZWFucyB0aGF0IHRvIGF2b2lkIGF0dHJpYnV0ZSBhbGlhc2luZywgTGludXggY2FuIGNyZWF0ZSBhIGNhY2hlYWJsZQorICAgIGlkZW50aXR5IG1hcHBpbmcgb25seSB3aGVuIHRoZSBlbnRpcmUgZ3JhbnVsZSBzdXBwb3J0cyBjYWNoZWFibGUKKyAgICBhY2Nlc3MuCisKKyAgICBUaGVyZWZvcmUsIGtlcm5fbWVtbWFwIGNvbnRhaW5zIG9ubHkgZnVsbCBncmFudWxlLXNpemVkIHJlZ2lvbnMgdGhhdAorICAgIGNhbiByZWZlcmVuY2VkIHNhZmVseSBieSBhbiBpZGVudGl0eSBtYXBwaW5nLgorCisgICAgVW5jYWNoZWFibGUgbWFwcGluZ3MgYXJlIG5vdCBzcGVjdWxhdGl2ZSwgc28gdGhlIHByb2Nlc3NvciB3aWxsCisgICAgZ2VuZXJhdGUgVUMgYWNjZXNzZXMgb25seSB0byBsb2NhdGlvbnMgZXhwbGljaXRseSByZWZlcmVuY2VkIGJ5CisgICAgc29mdHdhcmUuICBUaGlzIGFsbG93cyBVQyBpZGVudGl0eSBtYXBwaW5ncyB0byBjb3ZlciBncmFudWxlcyB0aGF0CisgICAgYXJlIG9ubHkgcGFydGlhbGx5IHBvcHVsYXRlZCwgb3IgcG9wdWxhdGVkIHdpdGggYSBjb21iaW5hdGlvbiBvZiBVQworICAgIGFuZCBXQiByZWdpb25zLgorCitVU0VSIE1BUFBJTkdTCisKKyAgICBVc2VyIG1hcHBpbmdzIGFyZSB0eXBpY2FsbHkgZG9uZSB3aXRoIDE2SyBvciA2NEsgcGFnZXMuICBUaGUgc21hbGxlcgorICAgIHBhZ2Ugc2l6ZSBhbGxvd3MgbW9yZSBmbGV4aWJpbGl0eSBiZWNhdXNlIG9ubHkgMTZLIG9yIDY0SyBoYXMgdG8gYmUKKyAgICBob21vZ2VuZW91cyB3aXRoIHJlc3BlY3QgdG8gbWVtb3J5IGF0dHJpYnV0ZXMuCisKK1BPVEVOVElBTCBBVFRSSUJVVEUgQUxJQVNJTkcgQ0FTRVMKKworICAgIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdGhlIGtlcm5lbCBjcmVhdGVzIG5ldyBtYXBwaW5nczoKKworICAgIG1tYXAgb2YgL2Rldi9tZW0KKworCVRoaXMgdXNlcyByZW1hcF9wZm5fcmFuZ2UoKSwgd2hpY2ggY3JlYXRlcyB1c2VyIG1hcHBpbmdzLiAgVGhlc2UKKwltYXBwaW5ncyBtYXkgYmUgZWl0aGVyIFdCIG9yIFVDLiAgSWYgdGhlIHJlZ2lvbiBiZWluZyBtYXBwZWQKKwloYXBwZW5zIHRvIGJlIGluIGtlcm5fbWVtbWFwLCBtZWFuaW5nIHRoYXQgaXQgbWF5IGFsc28gYmUgbWFwcGVkCisJYnkgYSBrZXJuZWwgaWRlbnRpdHkgbWFwcGluZywgdGhlIHVzZXIgbWFwcGluZyBtdXN0IHVzZSB0aGUgc2FtZQorCWF0dHJpYnV0ZSBhcyB0aGUga2VybmVsIG1hcHBpbmcuCisKKwlJZiB0aGUgcmVnaW9uIGlzIG5vdCBpbiBrZXJuX21lbW1hcCwgdGhlIHVzZXIgbWFwcGluZyBzaG91bGQgdXNlCisJYW4gYXR0cmlidXRlIHJlcG9ydGVkIGFzIGJlaW5nIHN1cHBvcnRlZCBpbiB0aGUgRUZJIG1lbW9yeSBtYXAuCisKKwlTaW5jZSB0aGUgRUZJIG1lbW9yeSBtYXAgZG9lcyBub3QgZGVzY3JpYmUgTU1JTyBvbiBzb21lCisJbWFjaGluZXMsIHRoaXMgc2hvdWxkIHVzZSBhbiB1bmNhY2hlYWJsZSBtYXBwaW5nIGFzIGEgZmFsbGJhY2suCisKKyAgICBtbWFwIG9mIC9zeXMvY2xhc3MvcGNpX2J1cy8uLi4vbGVnYWN5X21lbQorCisJVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gbW1hcCBvZiAvZGV2L21lbSwgZXhjZXB0IHRoYXQgbGVnYWN5X21lbQorCW9ubHkgYWxsb3dzIG1tYXAgb2YgdGhlIG9uZSBtZWdhYnl0ZSAibGVnYWN5IE1NSU8iIGFyZWEgZm9yIGEKKwlzcGVjaWZpYyBQQ0kgYnVzLiAgVHlwaWNhbGx5IHRoaXMgaXMgdGhlIGZpcnN0IG1lZ2FieXRlIG9mCisJcGh5c2ljYWwgYWRkcmVzcyBzcGFjZSwgYnV0IGl0IG1heSBiZSBkaWZmZXJlbnQgb24gbWFjaGluZXMgd2l0aAorCXNldmVyYWwgVkdBIGRldmljZXMuCisKKwkiWCIgdXNlcyB0aGlzIHRvIGFjY2VzcyBWR0EgZnJhbWUgYnVmZmVycy4gIFVzaW5nIGxlZ2FjeV9tZW0KKwlyYXRoZXIgdGhhbiAvZGV2L21lbSBhbGxvd3MgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIFggdG8gdGFsayB0bworCWRpZmZlcmVudCBWR0EgY2FyZHMuCisKKwlUaGUgL2Rldi9tZW0gbW1hcCBjb25zdHJhaW50cyBhcHBseS4KKworCUhvd2V2ZXIsIHNpbmNlIHRoaXMgaXMgZm9yIG1hcHBpbmcgbGVnYWN5IE1NSU8gc3BhY2UsIFdCIGFjY2VzcworCWRvZXMgbm90IG1ha2Ugc2Vuc2UuICBUaGlzIG1hdHRlcnMgb24gbWFjaGluZXMgd2l0aG91dCBsZWdhY3kKKwlWR0Egc3VwcG9ydDogdGhlc2UgbWFjaGluZXMgbWF5IGhhdmUgV0IgbWVtb3J5IGZvciB0aGUgZW50aXJlCisJZmlyc3QgbWVnYWJ5dGUgKG9yIGV2ZW4gdGhlIGVudGlyZSBmaXJzdCBncmFudWxlKS4KKworCU9uIHRoZXNlIG1hY2hpbmVzLCB3ZSBjb3VsZCBtbWFwIGxlZ2FjeV9tZW0gYXMgV0IsIHdoaWNoIHdvdWxkCisJYmUgc2FmZSBpbiB0ZXJtcyBvZiBhdHRyaWJ1dGUgYWxpYXNpbmcsIGJ1dCBYIGhhcyBubyB3YXkgb2YKKwlrbm93aW5nIHRoYXQgaXQgaXMgYWNjZXNzaW5nIHJlZ3VsYXIgbWVtb3J5LCBub3QgYSBmcmFtZSBidWZmZXIsCisJc28gdGhlIGtlcm5lbCBzaG91bGQgZmFpbCB0aGUgbW1hcCByYXRoZXIgdGhhbiBkb2luZyBpdCB3aXRoIFdCLgorCisgICAgcmVhZC93cml0ZSBvZiAvZGV2L21lbQorCisJVGhpcyB1c2VzIGNvcHlfZnJvbV91c2VyKCksIHdoaWNoIGltcGxpY2l0bHkgdXNlcyBhIGtlcm5lbAorCWlkZW50aXR5IG1hcHBpbmcuICBUaGlzIGlzIG9idmlvdXNseSBzYWZlIGZvciB0aGluZ3MgaW4KKwlrZXJuX21lbW1hcC4KKworCVRoZXJlIG1heSBiZSBjb3JuZXIgY2FzZXMgb2YgdGhpbmdzIHRoYXQgYXJlIG5vdCBpbiBrZXJuX21lbW1hcCwKKwlidXQgY291bGQgYmUgYWNjZXNzZWQgdGhpcyB3YXkuICBGb3IgZXhhbXBsZSwgcmVnaXN0ZXJzIGluIE1NSU8KKwlzcGFjZSBhcmUgbm90IGluIGtlcm5fbWVtbWFwLCBidXQgY291bGQgYmUgYWNjZXNzZWQgd2l0aCBhIFVDCisJbWFwcGluZy4gIFRoaXMgd291bGQgbm90IGNhdXNlIGF0dHJpYnV0ZSBhbGlhc2luZy4gIEJ1dAorCXJlZ2lzdGVycyB0eXBpY2FsbHkgY2FuIGJlIGFjY2Vzc2VkIG9ubHkgd2l0aCBmb3VyLWJ5dGUgb3IKKwllaWdodC1ieXRlIGFjY2Vzc2VzLCBhbmQgdGhlIGNvcHlfZnJvbV91c2VyKCkgcGF0aCBkb2Vzbid0IGFsbG93CisJYW55IGNvbnRyb2wgb3ZlciB0aGUgYWNjZXNzIHNpemUsIHNvIHRoaXMgd291bGQgYmUgZGFuZ2Vyb3VzLgorCisgICAgaW9yZW1hcCgpCisKKwlUaGlzIHJldHVybnMgYSBrZXJuZWwgaWRlbnRpdHkgbWFwcGluZyBmb3IgdXNlIGluc2lkZSB0aGUKKwlrZXJuZWwuCisKKwlJZiB0aGUgcmVnaW9uIGlzIGluIGtlcm5fbWVtbWFwLCB3ZSBzaG91bGQgdXNlIHRoZSBhdHRyaWJ1dGUKKwlzcGVjaWZpZWQgdGhlcmUuICBPdGhlcndpc2UsIGlmIHRoZSBFRkkgbWVtb3J5IG1hcCByZXBvcnRzIHRoYXQKKwl0aGUgZW50aXJlIGdyYW51bGUgc3VwcG9ydHMgV0IsIHdlIHNob3VsZCB1c2UgdGhhdCAoZ3JhbnVsZXMKKwl0aGF0IGFyZSBwYXJ0aWFsbHkgcmVzZXJ2ZWQgb3Igb2NjdXBpZWQgYnkgZmlybXdhcmUgZG8gbm90IGFwcGVhcgorCWluIGtlcm5fbWVtbWFwKS4gIE90aGVyd2lzZSwgd2Ugc2hvdWxkIHVzZSBhIFVDIG1hcHBpbmcuCisKK1BBU1QgUFJPQkxFTSBDQVNFUworCisgICAgbW1hcCBvZiB2YXJpb3VzIE1NSU8gcmVnaW9ucyBmcm9tIC9kZXYvbWVtIGJ5ICJYIiBvbiBJbnRlbCBwbGF0Zm9ybXMKKworICAgICAgVGhlIEVGSSBtZW1vcnkgbWFwIG1heSBub3QgcmVwb3J0IHRoZXNlIE1NSU8gcmVnaW9ucy4KKworICAgICAgVGhlc2UgbXVzdCBiZSBhbGxvd2VkIHNvIHRoYXQgWCB3aWxsIHdvcmsuICBUaGlzIG1lYW5zIHRoYXQKKyAgICAgIHdoZW4gdGhlIEVGSSBtZW1vcnkgbWFwIGlzIGluY29tcGxldGUsIGV2ZXJ5IC9kZXYvbWVtIG1tYXAgbXVzdAorICAgICAgc3VjY2VlZC4gIEl0IG1heSBjcmVhdGUgZWl0aGVyIFdCIG9yIFVDIHVzZXIgbWFwcGluZ3MsIGRlcGVuZGluZworICAgICAgb24gd2hldGhlciB0aGUgcmVnaW9uIGlzIGluIGtlcm5fbWVtbWFwIG9yIHRoZSBFRkkgbWVtb3J5IG1hcC4KKworICAgIG1tYXAgb2YgMHgwLTB4QTAwMDAgL2Rldi9tZW0gYnkgImh3aW5mbyIgb24gSFAgc3gxMDAwIHdpdGggVkdBIGVuYWJsZWQKKworICAgICAgU2VlIGh0dHBzOi8vYnVnemlsbGEubm92ZWxsLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTQwODU4LgorCisgICAgICBUaGUgRUZJIG1lbW9yeSBtYXAgcmVwb3J0cyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgICAgICAgIDB4MDAwMDAtMHg5RkZGRiBXQiBvbmx5CisgICAgICAgIDB4QTAwMDAtMHhCRkZGRiBVQyBvbmx5IChWR0EgZnJhbWUgYnVmZmVyKQorICAgICAgICAweEMwMDAwLTB4RkZGRkYgV0Igb25seQorCisgICAgICBUaGlzIG1tYXAgaXMgZG9uZSB3aXRoIHVzZXIgcGFnZXMsIG5vdCBrZXJuZWwgaWRlbnRpdHkgbWFwcGluZ3MsCisgICAgICBzbyBpdCBpcyBzYWZlIHRvIHVzZSBXQiBtYXBwaW5ncy4KKworICAgICAgVGhlIGtlcm5lbCBWR0EgZHJpdmVyIG1heSBpb3JlbWFwIHRoZSBWR0EgZnJhbWUgYnVmZmVyIGF0IDB4QTAwMDAsCisgICAgICB3aGljaCB3aWxsIHVzZSBhIGdyYW51bGUtc2l6ZWQgVUMgbWFwcGluZyBjb3ZlcmluZyAwLTB4RkZGRkYuICBUaGlzCisgICAgICBncmFudWxlIGNvdmVycyBzb21lIFdCLW9ubHkgbWVtb3J5LCBidXQgc2luY2UgVUMgaXMgbm9uLXNwZWN1bGF0aXZlLAorICAgICAgdGhlIHByb2Nlc3NvciB3aWxsIG5ldmVyIGdlbmVyYXRlIGFuIHVuY2FjaGVhYmxlIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgIFdCLW9ubHkgYXJlYXMgdW5sZXNzIHRoZSBkcml2ZXIgZXhwbGljaXRseSB0b3VjaGVzIHRoZW0uCisKKyAgICBtbWFwIG9mIDB4MC0weEZGRkZGIGxlZ2FjeV9tZW0gYnkgIlgiCisKKyAgICAgIElmIHRoZSBFRkkgbWVtb3J5IG1hcCByZXBvcnRzIHRoaXMgZW50aXJlIHJhbmdlIGFzIFdCLCB0aGVyZQorICAgICAgaXMgbm8gVkdBIE1NSU8gaG9sZSwgYW5kIHRoZSBtbWFwIHNob3VsZCBmYWlsIG9yIGJlIGRvbmUgd2l0aAorICAgICAgYSBXQiBtYXBwaW5nLgorCisgICAgICBUaGVyZSdzIG5vIGVhc3kgd2F5IGZvciBYIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSAweEEwMDAwLTB4QkZGRkYKKyAgICAgIHJlZ2lvbiBpcyBhIGZyYW1lIGJ1ZmZlciBvciBqdXN0IG1lbW9yeSwgc28gSSB0aGluayBpdCdzIGJlc3QgdG8KKyAgICAgIGp1c3QgZmFpbCB0aGlzIG1tYXAgcmVxdWVzdCByYXRoZXIgdGhhbiB1c2luZyBhIFdCIG1hcHBpbmcuICBBcworICAgICAgZmFyIGFzIEkga25vdywgdGhlcmUncyBubyBuZWVkIHRvIG1hcCBsZWdhY3lfbWVtIHdpdGggV0IKKyAgICAgIG1hcHBpbmdzLgorCisgICAgICBPdGhlcndpc2UsIGEgVUMgbWFwcGluZyBvZiB0aGUgZW50aXJlIHJlZ2lvbiBpcyBwcm9iYWJseSBzYWZlLgorICAgICAgVGhlIFZHQSBob2xlIG1lYW5zIHRoZSByZWdpb24gd2lsbCBub3QgYmUgaW4ga2Vybl9tZW1tYXAuICBUaGUKKyAgICAgIEhQIHN4MTAwMCBjaGlwc2V0IGRvZXNuJ3Qgc3VwcG9ydCBVQyBhY2Nlc3MgdG8gdGhlIG1lbW9yeSBzdXJyb3VuZGluZworICAgICAgdGhlIFZHQSBob2xlLCBidXQgWCBkb2Vzbid0IG5lZWQgdGhhdCBhcmVhIGFueXdheSBhbmQgc2hvdWxkIG5vdAorICAgICAgcmVmZXJlbmNlIGl0LgorCisgICAgbW1hcCBvZiAweEEwMDAwLTB4QkZGRkYgbGVnYWN5X21lbSBieSAiWCIgb24gSFAgc3gxMDAwIHdpdGggVkdBIGRpc2FibGVkCisKKyAgICAgIFRoZSBFRkkgbWVtb3J5IG1hcCByZXBvcnRzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgMHgwMDAwMC0weEZGRkZGIFdCIG9ubHkgKG5vIFZHQSBNTUlPIGhvbGUpCisKKyAgICAgIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIHByZXZpb3VzIGNhc2UsIGFuZCB0aGUgbW1hcCBzaG91bGQKKyAgICAgIGZhaWwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBhYm92ZS4KKworTk9URVMKKworICAgIFsxXSBTRE0gcmV2IDIuMiwgdm9sIDIsIHNlYyA0LjQuMS4KKyAgICBbMl0gU0RNIHJldiAyLjIsIHZvbCAyLCBzZWMgNC40LjYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQgYi9Eb2N1bWVudGF0aW9uL2lvY3RsLW51bWJlci50eHQKaW5kZXggMTcxYTQ0ZS4uMTU0MzgwMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9pb2N0bC1udW1iZXIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW9jdGwtbnVtYmVyLnR4dApAQCAtODUsNyArODUsOSBAQAogCQkJCQk8bWFpbHRvOm1hYXNzZW5AdW5pLWZyZWlidXJnLmRlPgogJ0MnCWFsbAlsaW51eC9zb3VuZGNhcmQuaAogJ0QnCWFsbAlhc20tczM5MC9kYXNkLmgKKydFJwlhbGwJbGludXgvaW5wdXQuaAogJ0YnCWFsbAlsaW51eC9mYi5oCisnSCcJYWxsCWxpbnV4L2hpZGRldi5oCiAnSScJYWxsCWxpbnV4L2lzZG4uaAogJ0onCTAwLTFGCWRyaXZlcnMvc2NzaS9nZHRoX2lvY3RsLmgKICdLJwlhbGwJbGludXgva2QuaApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZHVtcC9rZHVtcC50eHQgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAppbmRleCAyMTJjZjNjLi4wOGJhZmE4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dApAQCAtMSwxNTUgKzEsMzI1IEBACi1Eb2N1bWVudGF0aW9uIGZvciBrZHVtcCAtIHRoZSBrZXhlYy1iYXNlZCBjcmFzaCBkdW1waW5nIHNvbHV0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEb2N1bWVudGF0aW9uIGZvciBLZHVtcCAtIFRoZSBrZXhlYy1iYXNlZCBDcmFzaCBEdW1waW5nIFNvbHV0aW9uCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLURFU0lHTgotPT09PT09CitUaGlzIGRvY3VtZW50IGluY2x1ZGVzIG92ZXJ2aWV3LCBzZXR1cCBhbmQgaW5zdGFsbGF0aW9uLCBhbmQgYW5hbHlzaXMKK2luZm9ybWF0aW9uLgogCi1LZHVtcCB1c2VzIGtleGVjIHRvIHJlYm9vdCB0byBhIHNlY29uZCBrZXJuZWwgd2hlbmV2ZXIgYSBkdW1wIG5lZWRzIHRvIGJlCi10YWtlbi4gVGhpcyBzZWNvbmQga2VybmVsIGlzIGJvb3RlZCB3aXRoIHZlcnkgbGl0dGxlIG1lbW9yeS4gVGhlIGZpcnN0IGtlcm5lbAotcmVzZXJ2ZXMgdGhlIHNlY3Rpb24gb2YgbWVtb3J5IHRoYXQgdGhlIHNlY29uZCBrZXJuZWwgdXNlcy4gVGhpcyBlbnN1cmVzIHRoYXQKLW9uLWdvaW5nIERNQSBmcm9tIHRoZSBmaXJzdCBrZXJuZWwgZG9lcyBub3QgY29ycnVwdCB0aGUgc2Vjb25kIGtlcm5lbC4KK092ZXJ2aWV3Cis9PT09PT09PQogCi1BbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCBDb3JlIGltYWdlIGlzIGVuY29kZWQgaW4gRUxGIGZvcm1hdCBhbmQKLXN0b3JlZCBpbiByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeSBiZWZvcmUgY3Jhc2guIFBoeXNpY2FsIGFkZHJlc3Mgb2Ygc3RhcnQgb2YKLUVMRiBoZWFkZXIgaXMgcGFzc2VkIHRvIG5ldyBrZXJuZWwgdGhyb3VnaCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIGVsZmNvcmVoZHI9LgorS2R1bXAgdXNlcyBrZXhlYyB0byBxdWlja2x5IGJvb3QgdG8gYSBkdW1wLWNhcHR1cmUga2VybmVsIHdoZW5ldmVyIGEKK2R1bXAgb2YgdGhlIHN5c3RlbSBrZXJuZWwncyBtZW1vcnkgbmVlZHMgdG8gYmUgdGFrZW4gKGZvciBleGFtcGxlLCB3aGVuCit0aGUgc3lzdGVtIHBhbmljcykuIFRoZSBzeXN0ZW0ga2VybmVsJ3MgbWVtb3J5IGltYWdlIGlzIHByZXNlcnZlZCBhY3Jvc3MKK3RoZSByZWJvb3QgYW5kIGlzIGFjY2Vzc2libGUgdG8gdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCiAKLU9uIGkzODYsIHRoZSBmaXJzdCA2NDAgS0Igb2YgcGh5c2ljYWwgbWVtb3J5IGlzIG5lZWRlZCB0byBib290LCBpcnJlc3BlY3RpdmUKLW9mIHdoZXJlIHRoZSBrZXJuZWwgbG9hZHMuIEhlbmNlLCB0aGlzIHJlZ2lvbiBpcyBiYWNrZWQgdXAgYnkga2V4ZWMganVzdCBiZWZvcmUKLXJlYm9vdGluZyBpbnRvIHRoZSBuZXcga2VybmVsLgorWW91IGNhbiB1c2UgY29tbW9uIExpbnV4IGNvbW1hbmRzLCBzdWNoIGFzIGNwIGFuZCBzY3AsIHRvIGNvcHkgdGhlCittZW1vcnkgaW1hZ2UgdG8gYSBkdW1wIGZpbGUgb24gdGhlIGxvY2FsIGRpc2ssIG9yIGFjcm9zcyB0aGUgbmV0d29yayB0bworYSByZW1vdGUgc3lzdGVtLgogCi1JbiB0aGUgc2Vjb25kIGtlcm5lbCwgIm9sZCBtZW1vcnkiIGNhbiBiZSBhY2Nlc3NlZCBpbiB0d28gd2F5cy4KK0tkdW1wIGFuZCBrZXhlYyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCBvbiB0aGUgeDg2LCB4ODZfNjQsIGFuZCBwcGM2NAorYXJjaGl0ZWN0dXJlcy4KIAotLSBUaGUgZmlyc3Qgb25lIGlzIHRocm91Z2ggYSAvZGV2L29sZG1lbSBkZXZpY2UgaW50ZXJmYWNlLiBBIGNhcHR1cmUgdXRpbGl0eQotICBjYW4gcmVhZCB0aGUgZGV2aWNlIGZpbGUgYW5kIHdyaXRlIG91dCB0aGUgbWVtb3J5IGluIHJhdyBmb3JtYXQuIFRoaXMgaXMgcmF3Ci0gIGR1bXAgb2YgbWVtb3J5IGFuZCBhbmFseXNpcy9jYXB0dXJlIHRvb2wgc2hvdWxkIGJlIGludGVsbGlnZW50IGVub3VnaCB0bwotICBkZXRlcm1pbmUgd2hlcmUgdG8gbG9vayBmb3IgdGhlIHJpZ2h0IGluZm9ybWF0aW9uLiBFTEYgaGVhZGVycyAoZWxmY29yZWhkcj0pCi0gIGNhbiBiZWNvbWUgaGFuZHkgaGVyZS4KK1doZW4gdGhlIHN5c3RlbSBrZXJuZWwgYm9vdHMsIGl0IHJlc2VydmVzIGEgc21hbGwgc2VjdGlvbiBvZiBtZW1vcnkgZm9yCit0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4gVGhpcyBlbnN1cmVzIHRoYXQgb25nb2luZyBEaXJlY3QgTWVtb3J5IEFjY2VzcworKERNQSkgZnJvbSB0aGUgc3lzdGVtIGtlcm5lbCBkb2VzIG5vdCBjb3JydXB0IHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLgorVGhlIGtleGVjIC1wIGNvbW1hbmQgbG9hZHMgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgaW50byB0aGlzIHJlc2VydmVkCittZW1vcnkuCiAKLS0gVGhlIHNlY29uZCBpbnRlcmZhY2UgaXMgdGhyb3VnaCAvcHJvYy92bWNvcmUuIFRoaXMgZXhwb3J0cyB0aGUgZHVtcCBhcyBhbiBFTEYKLSAgZm9ybWF0IGZpbGUgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gb3V0IHVzaW5nIGFueSBmaWxlIGNvcHkgY29tbWFuZAotICAoY3AsIHNjcCwgZXRjKS4gRnVydGhlciwgZ2RiIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gbGltaXRlZCBkZWJ1Z2dpbmcgb24KLSAgdGhlIGR1bXAgZmlsZS4gVGhpcyBtZXRob2QgZW5zdXJlcyBtZXRob2RzIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGNvcnJlY3QKLSAgb3JkZXJpbmcgb2YgdGhlIGR1bXAgcGFnZXMgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IDY0MCBLQiB0aGF0IGhhcyBiZWVuCi0gIHJlbG9jYXRlZCkuCitPbiB4ODYgbWFjaGluZXMsIHRoZSBmaXJzdCA2NDAgS0Igb2YgcGh5c2ljYWwgbWVtb3J5IGlzIG5lZWRlZCB0byBib290LAorcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUga2VybmVsIGxvYWRzLiBUaGVyZWZvcmUsIGtleGVjIGJhY2tzIHVwIHRoaXMKK3JlZ2lvbiBqdXN0IGJlZm9yZSByZWJvb3RpbmcgaW50byB0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4KIAotU0VUVVAKLT09PT09CitBbGwgb2YgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtIGtlcm5lbCdzIGNvcmUgaW1hZ2UgaXMKK2VuY29kZWQgaW4gdGhlIEVMRiBmb3JtYXQsIGFuZCBzdG9yZWQgaW4gYSByZXNlcnZlZCBhcmVhIG9mIG1lbW9yeQorYmVmb3JlIGEgY3Jhc2guIFRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBzdGFydCBvZiB0aGUgRUxGIGhlYWRlciBpcworcGFzc2VkIHRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIHRocm91Z2ggdGhlIGVsZmNvcmVoZHI9IGJvb3QKK3BhcmFtZXRlci4KIAotMSkgRG93bmxvYWQgdGhlIHVwc3RyZWFtIGtleGVjLXRvb2xzIHVzZXJzcGFjZSBwYWNrYWdlIGZyb20KLSAgIGh0dHA6Ly93d3cueG1pc3Npb24uY29tL35lYmllZGVybS9maWxlcy9rZXhlYy9rZXhlYy10b29scy0xLjEwMS50YXIuZ3ouCitXaXRoIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLCB5b3UgY2FuIGFjY2VzcyB0aGUgbWVtb3J5IGltYWdlLCBvciAib2xkCittZW1vcnksIiBpbiB0d28gd2F5czoKIAotICAgQXBwbHkgdGhlIGxhdGVzdCBjb25zb2xpZGF0ZWQga2R1bXAgcGF0Y2ggb24gdG9wIG9mIGtleGVjLXRvb2xzLTEuMTAxCi0gICBmcm9tIGh0dHA6Ly9sc2Uuc291cmNlZm9yZ2UubmV0L2tkdW1wLy4gVGhpcyBhcnJhbmdtZW50IGhhcyBiZWVuIG1hZGUKLSAgIHRpbGwgYWxsIHRoZSB1c2Vyc3BhY2UgcGF0Y2hlcyBzdXBwb3J0aW5nIGtkdW1wIGFyZSBpbnRlZ3JhdGVkIHdpdGgKLSAgIHVwc3RyZWFtIGtleGVjLXRvb2xzIHVzZXJzcGFjZS4KKy0gVGhyb3VnaCBhIC9kZXYvb2xkbWVtIGRldmljZSBpbnRlcmZhY2UuIEEgY2FwdHVyZSB1dGlsaXR5IGNhbiByZWFkIHRoZQorICBkZXZpY2UgZmlsZSBhbmQgd3JpdGUgb3V0IHRoZSBtZW1vcnkgaW4gcmF3IGZvcm1hdC4gVGhpcyBpcyBhIHJhdyBkdW1wCisgIG9mIG1lbW9yeS4gQW5hbHlzaXMgYW5kIGNhcHR1cmUgdG9vbHMgbXVzdCBiZSBpbnRlbGxpZ2VudCBlbm91Z2ggdG8KKyAgZGV0ZXJtaW5lIHdoZXJlIHRvIGxvb2sgZm9yIHRoZSByaWdodCBpbmZvcm1hdGlvbi4KIAotMikgRG93bmxvYWQgYW5kIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSAoMi42LjEzLXJjMSBvbndhcmRzKSB2YW5pbGxhIGtlcm5lbHMuCi0gICBUd28ga2VybmVscyBuZWVkIHRvIGJlIGJ1aWx0IGluIG9yZGVyIHRvIGdldCB0aGlzIGZlYXR1cmUgd29ya2luZy4KLSAgIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRvIHByb3Blcmx5IGNvbmZpZ3VyZSB0aGUgdHdvIGtlcm5lbHMgc3BlY2lmaWMKLSAgIHRvIGtleGVjIGFuZCBrZHVtcCBmZWF0dXJlczoKLQotICBBKSBGaXJzdCBrZXJuZWwgb3IgcmVndWxhciBrZXJuZWw6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgIGEpIEVuYWJsZSAia2V4ZWMgc3lzdGVtIGNhbGwiIGZlYXR1cmUgKGluIFByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcykuCi0gICAgICBDT05GSUdfS0VYRUM9eQotICAgYikgRW5hYmxlICJzeXNmcyBmaWxlIHN5c3RlbSBzdXBwb3J0IiAoaW4gUHNldWRvIGZpbGVzeXN0ZW1zKS4KLSAgICAgIENPTkZJR19TWVNGUz15Ci0gICBjKSBtYWtlCi0gICBkKSBCb290IGludG8gZmlyc3Qga2VybmVsIHdpdGggdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgImNyYXNoa2VybmVsPVlAWCIuCi0gICAgICBVc2UgYXBwcm9wcmlhdGUgdmFsdWVzIGZvciBYIGFuZCBZLiBZIGRlbm90ZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUKLSAgICAgIGZvciB0aGUgc2Vjb25kIGtlcm5lbCwgYW5kIFggZGVub3RlcyBhdCB3aGF0IHBoeXNpY2FsIGFkZHJlc3MgdGhlCi0gICAgICByZXNlcnZlZCBtZW1vcnkgc2VjdGlvbiBzdGFydHMuIEZvciBleGFtcGxlOiAiY3Jhc2hrZXJuZWw9NjRNQDE2TSIuCistIFRocm91Z2ggL3Byb2Mvdm1jb3JlLiBUaGlzIGV4cG9ydHMgdGhlIGR1bXAgYXMgYW4gRUxGLWZvcm1hdCBmaWxlIHRoYXQKKyAgeW91IGNhbiB3cml0ZSBvdXQgdXNpbmcgZmlsZSBjb3B5IGNvbW1hbmRzIHN1Y2ggYXMgY3Agb3Igc2NwLiBGdXJ0aGVyLAorICB5b3UgY2FuIHVzZSBhbmFseXNpcyB0b29scyBzdWNoIGFzIHRoZSBHTlUgRGVidWdnZXIgKEdEQikgYW5kIHRoZSBDcmFzaAorICB0b29sIHRvIGRlYnVnIHRoZSBkdW1wIGZpbGUuIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCB0aGUgZHVtcCBwYWdlcyBhcmUKKyAgY29ycmVjdGx5IG9yZGVyZWQuCiAKIAotICBCKSBTZWNvbmQga2VybmVsIG9yIGR1bXAgY2FwdHVyZSBrZXJuZWw6Ci0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgYSkgRm9yIGkzODYgYXJjaGl0ZWN0dXJlIGVuYWJsZSBIaWdobWVtIHN1cHBvcnQKLSAgICAgIENPTkZJR19ISUdITUVNPXkKLSAgIGIpIEVuYWJsZSAia2VybmVsIGNyYXNoIGR1bXBzIiBmZWF0dXJlICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikKLSAgICAgIENPTkZJR19DUkFTSF9EVU1QPXkKLSAgIGMpIE1ha2Ugc3VyZSBhIHN1aXRhYmxlIHZhbHVlIGZvciAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzCi0gICAgICBsb2FkZWQiICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikuIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZQotICAgICAgaXMgMHgxMDAwMDAwICgxNk1CKSBhbmQgaXQgc2hvdWxkIGJlIHNhbWUgYXMgWCAoU2VlIG9wdGlvbiBkIGFib3ZlKSwKLSAgICAgIGUuZy4sIDE2IE1CIG9yIDB4MTAwMDAwMC4KLSAgICAgIENPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAKLSAgIGQpIEVuYWJsZSAiL3Byb2Mvdm1jb3JlIHN1cHBvcnQiIChPcHRpb25hbCwgdW5kZXIgIlBzZXVkbyBmaWxlc3lzdGVtcyIpLgotICAgICAgQ09ORklHX1BST0NfVk1DT1JFPXkKK1NldHVwIGFuZCBJbnN0YWxsYXRpb24KKz09PT09PT09PT09PT09PT09PT09PT0KIAotMykgQWZ0ZXIgYm9vdGluZyB0byByZWd1bGFyIGtlcm5lbCBvciBmaXJzdCBrZXJuZWwsIGxvYWQgdGhlIHNlY29uZCBrZXJuZWwKLSAgIHVzaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKK0luc3RhbGwga2V4ZWMtdG9vbHMgYW5kIHRoZSBLZHVtcCBwYXRjaAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgIGtleGVjIC1wIDxzZWNvbmQta2VybmVsPiAtLWFyZ3MtbGludXggLS1lbGYzMi1jb3JlLWhlYWRlcnMKLSAgIC0tYXBwZW5kPSJyb290PTxyb290LWRldj4gaW5pdCAxIGlycXBvbGwgbWF4Y3B1cz0xIgorMSkgTG9naW4gYXMgdGhlIHJvb3QgdXNlci4KIAotICAgTm90ZXM6Ci0gICA9PT09PT0KLSAgICAgaSkgPHNlY29uZC1rZXJuZWw+IGhhcyB0byBiZSBhIHZtbGludXggaW1hZ2UgaWUgdW5jb21wcmVzc2VkIGVsZiBpbWFnZS4KLSAgICAgICAgYnpJbWFnZSB3aWxsIG5vdCB3b3JrLCBhcyBvZiBub3cuCi0gICAgaWkpIC0tYXJncy1saW51eCBoYXMgdG8gYmUgc3BlaWNmaWVkIGFzIGlmIGtleGVjIGl0IGxvYWRpbmcgYW4gZWxmIGltYWdlLAotICAgICAgICBpdCBuZWVkcyB0byBrbm93IHRoYXQgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCBhcmUgb2YgbGludXggdHlwZS4KLSAgIGlpaSkgQnkgZGVmYXVsdCBFTEYgaGVhZGVycyBhcmUgc3RvcmVkIGluIEVMRjY0IGZvcm1hdCB0byBzdXBwb3J0IHN5c3RlbXMKLSAgICAgICAgd2l0aCBtb3JlIHRoYW4gNEdCIG1lbW9yeS4gT3B0aW9uIC0tZWxmMzItY29yZS1oZWFkZXJzIGZvcmNlcyBnZW5lcmF0aW9uCi0gICAgICAgIG9mIEVMRjMyIGhlYWRlcnMuIFRoZSByZWFzb24gZm9yIHRoaXMgb3B0aW9uIGJlaW5nLCBhcyBvZiBub3cgZ2RiIGNhbgotICAgICAgICBub3Qgb3BlbiB2bWNvcmUgZmlsZSB3aXRoIEVMRjY0IGhlYWRlcnMgb24gYSAzMiBiaXQgc3lzdGVtcy4gU28gRUxGMzIKLSAgICAgICAgaGVhZGVycyBjYW4gYmUgdXNlZCBpZiBvbmUgaGFzIG5vbi1QQUUgc3lzdGVtcyBhbmQgaGVuY2UgbWVtb3J5IGxlc3MKLSAgICAgICAgdGhhbiA0R0IuCi0gICAgaXYpIFNwZWNpZnkgImlycXBvbGwiIGFzIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIuIFRoaXMgcmVkdWNlcyBkcml2ZXIKLSAgICAgICAgIGluaXRpYWxpemF0aW9uIGZhaWx1cmVzIGluIHNlY29uZCBrZXJuZWwgZHVlIHRvIHNoYXJlZCBpbnRlcnJ1cHRzLgotICAgICB2KSA8cm9vdC1kZXY+IG5lZWRzIHRvIGJlIHNwZWNpZmllZCBpbiBhIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvIHRoZSByb290Ci0gICAgICAgIGRldmljZSBuYW1lIGluIHRoZSBvdXRwdXQgb2YgbW91bnQgY29tbWFuZC4KLSAgICB2aSkgSWYgeW91IGhhdmUgYnVpbHQgdGhlIGRyaXZlcnMgcmVxdWlyZWQgdG8gbW91bnQgcm9vdCBmaWxlIHN5c3RlbSBhcwotICAgICAgICBtb2R1bGVzIGluIDxzZWNvbmQta2VybmVsPiwgdGhlbiwgc3BlY2lmeQotICAgICAgICAtLWluaXRyZD08aW5pdHJkLWZvci1zZWNvbmQta2VybmVsPi4KLSAgIHZpaSkgU3BlY2lmeSBtYXhjcHVzPTEgYXMsIGlmIGR1cmluZyBmaXJzdCBrZXJuZWwgcnVuLCBpZiBwYW5pYyBoYXBwZW5zIG9uCi0gICAgICAgIG5vbi1ib290IGNwdXMsIHNlY29uZCBrZXJuZWwgZG9lc24ndCBzZWVtIHRvIGJlIGJvb3QgdXAgYWxsIHRoZSBjcHVzLgotICAgICAgICBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGFsd2F5cyBidWlsdCB0aGUgc2Vjb25kIGtlcm5lbCB3aXRob3V0IFNNUAotICAgICAgICBzdXBwb3J0IGllIENPTkZJR19TTVA9bgorMikgRG93bmxvYWQgdGhlIGtleGVjLXRvb2xzIHVzZXItc3BhY2UgcGFja2FnZSBmcm9tIHRoZSBmb2xsb3dpbmcgVVJMOgogCi00KSBBZnRlciBzdWNjZXNzZnVsbHkgbG9hZGluZyB0aGUgc2Vjb25kIGtlcm5lbCBhcyBhYm92ZSwgaWYgYSBwYW5pYyBvY2N1cnMKLSAgIHN5c3RlbSByZWJvb3RzIGludG8gdGhlIHNlY29uZCBrZXJuZWwuIEEgbW9kdWxlIGNhbiBiZSB3cml0dGVuIHRvIGZvcmNlCi0gICB0aGUgcGFuaWMgb3IgIkFMVC1TeXNScS1jIiBjYW4gYmUgdXNlZCBpbml0aWF0ZSBhIGNyYXNoIGR1bXAgZm9yIHRlc3RpbmcKLSAgIHB1cnBvc2VzLgorICAgaHR0cDovL3d3dy54bWlzc2lvbi5jb20vfmViaWVkZXJtL2ZpbGVzL2tleGVjL2tleGVjLXRvb2xzLTEuMTAxLnRhci5negogCi01KSBPbmNlIHRoZSBzZWNvbmQga2VybmVsIGhhcyBib290ZWQsIHdyaXRlIG91dCB0aGUgZHVtcCBmaWxlIHVzaW5nCiszKSBVbnBhY2sgdGhlIHRhcmJhbGwgd2l0aCB0aGUgdGFyIGNvbW1hbmQsIGFzIGZvbGxvd3M6CisKKyAgIHRhciB4dnB6ZiBrZXhlYy10b29scy0xLjEwMS50YXIuZ3oKKworNCkgRG93bmxvYWQgdGhlIGxhdGVzdCBjb25zb2xpZGF0ZWQgS2R1bXAgcGF0Y2ggZnJvbSB0aGUgZm9sbG93aW5nIFVSTDoKKworICAgaHR0cDovL2xzZS5zb3VyY2Vmb3JnZS5uZXQva2R1bXAvCisKKyAgIChUaGlzIGxvY2F0aW9uIGlzIGJlaW5nIHVzZWQgdW50aWwgYWxsIHRoZSB1c2VyLXNwYWNlIEtkdW1wIHBhdGNoZXMKKyAgIGFyZSBpbnRlZ3JhdGVkIHdpdGggdGhlIGtleGVjLXRvb2xzIHBhY2thZ2UuKQorCis1KSBDaGFuZ2UgdG8gdGhlIGtleGVjLXRvb2xzLTEuMTAxIGRpcmVjdG9yeSwgYXMgZm9sbG93czoKKworICAgY2Qga2V4ZWMtdG9vbHMtMS4xMDEKKworNikgQXBwbHkgdGhlIGNvbnNvbGlkYXRlZCBwYXRjaCB0byB0aGUga2V4ZWMtdG9vbHMtMS4xMDEgc291cmNlIHRyZWUKKyAgIHdpdGggdGhlIHBhdGNoIGNvbW1hbmQsIGFzIGZvbGxvd3MuIChNb2RpZnkgdGhlIHBhdGggdG8gdGhlIGRvd25sb2FkZWQKKyAgIHBhdGNoIGFzIG5lY2Vzc2FyeS4pCisKKyAgIHBhdGNoIC1wMSA8IC9wYXRoLXRvLWtkdW1wLXBhdGNoL2tleGVjLXRvb2xzLTEuMTAxLWtkdW1wLnBhdGNoCisKKzcpIENvbmZpZ3VyZSB0aGUgcGFja2FnZSwgYXMgZm9sbG93czoKKworICAgLi9jb25maWd1cmUKKworOCkgQ29tcGlsZSB0aGUgcGFja2FnZSwgYXMgZm9sbG93czoKKworICAgbWFrZQorCis5KSBJbnN0YWxsIHRoZSBwYWNrYWdlLCBhcyBmb2xsb3dzOgorCisgICBtYWtlIGluc3RhbGwKKworCitEb3dubG9hZCBhbmQgYnVpbGQgdGhlIHN5c3RlbSBhbmQgZHVtcC1jYXB0dXJlIGtlcm5lbHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitEb3dubG9hZCB0aGUgbWFpbmxpbmUgKHZhbmlsbGEpIGtlcm5lbCBzb3VyY2UgY29kZSAoMi42LjEzLXJjMSBvciBuZXdlcikKK2Zyb20gaHR0cDovL3d3dy5rZXJuZWwub3JnLiBUd28ga2VybmVscyBtdXN0IGJlIGJ1aWx0OiBhIHN5c3RlbSBrZXJuZWwKK2FuZCBhIGR1bXAtY2FwdHVyZSBrZXJuZWwuIFVzZSB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGNvbmZpZ3VyZSB0aGVzZQora2VybmVscyB3aXRoIHRoZSBuZWNlc3Nhcnkga2V4ZWMgYW5kIEtkdW1wIGZlYXR1cmVzOgorCitTeXN0ZW0ga2VybmVsCistLS0tLS0tLS0tLS0tCisKKzEpIEVuYWJsZSAia2V4ZWMgc3lzdGVtIGNhbGwiIGluICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMuIgorCisgICBDT05GSUdfS0VYRUM9eQorCisyKSBFbmFibGUgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGluICJGaWxlc3lzdGVtIiAtPiAiUHNldWRvCisgICBmaWxlc3lzdGVtcy4iIFRoaXMgaXMgdXN1YWxseSBlbmFibGVkIGJ5IGRlZmF1bHQuCisKKyAgIENPTkZJR19TWVNGUz15CisKKyAgIE5vdGUgdGhhdCAic3lzZnMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgbWlnaHQgbm90IGFwcGVhciBpbiB0aGUgIlBzZXVkbworICAgZmlsZXN5c3RlbXMiIG1lbnUgaWYgIkNvbmZpZ3VyZSBzdGFuZGFyZCBrZXJuZWwgZmVhdHVyZXMgKGZvciBzbWFsbAorICAgc3lzdGVtcykiIGlzIG5vdCBlbmFibGVkIGluICJHZW5lcmFsIFNldHVwLiIgSW4gdGhpcyBjYXNlLCBjaGVjayB0aGUKKyAgIC5jb25maWcgZmlsZSBpdHNlbGYgdG8gZW5zdXJlIHRoYXQgc3lzZnMgaXMgdHVybmVkIG9uLCBhcyBmb2xsb3dzOgorCisgICBncmVwICdDT05GSUdfU1lTRlMnIC5jb25maWcKKworMykgRW5hYmxlICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBkZWJ1ZyBpbmZvIiBpbiAiS2VybmVsIGhhY2tpbmcuIgorCisgICBDT05GSUdfREVCVUdfSU5GTz1ZCisKKyAgIFRoaXMgY2F1c2VzIHRoZSBrZXJuZWwgdG8gYmUgYnVpbHQgd2l0aCBkZWJ1ZyBzeW1ib2xzLiBUaGUgZHVtcAorICAgYW5hbHlzaXMgdG9vbHMgcmVxdWlyZSBhIHZtbGludXggd2l0aCBkZWJ1ZyBzeW1ib2xzIGluIG9yZGVyIHRvIHJlYWQKKyAgIGFuZCBhbmFseXplIGEgZHVtcCBmaWxlLgorCis0KSBNYWtlIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzLiBVcGRhdGUgdGhlIGJvb3QgbG9hZGVyCisgICAoc3VjaCBhcyBncnViLCB5YWJvb3QsIG9yIGxpbG8pIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXMgbmVjZXNzYXJ5LgorCis1KSBCb290IHRoZSBzeXN0ZW0ga2VybmVsIHdpdGggdGhlIGJvb3QgcGFyYW1ldGVyICJjcmFzaGtlcm5lbD1ZQFgiLAorICAgd2hlcmUgWSBzcGVjaWZpZXMgaG93IG11Y2ggbWVtb3J5IHRvIHJlc2VydmUgZm9yIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsCisgICBhbmQgWCBzcGVjaWZpZXMgdGhlIGJlZ2lubmluZyBvZiB0aGlzIHJlc2VydmVkIG1lbW9yeS4gRm9yIGV4YW1wbGUsCisgICAiY3Jhc2hrZXJuZWw9NjRNQDE2TSIgdGVsbHMgdGhlIHN5c3RlbSBrZXJuZWwgdG8gcmVzZXJ2ZSA2NCBNQiBvZiBtZW1vcnkKKyAgIHN0YXJ0aW5nIGF0IHBoeXNpY2FsIGFkZHJlc3MgMHgwMTAwMDAwMCBmb3IgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCisKKyAgIE9uIHg4NiBhbmQgeDg2XzY0LCB1c2UgImNyYXNoa2VybmVsPTY0TUAxNk0iLgorCisgICBPbiBwcGM2NCwgdXNlICJjcmFzaGtlcm5lbD0xMjhNQDMyTSIuCisKKworVGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEpIFVuZGVyICJHZW5lcmFsIHNldHVwLCIgYXBwZW5kICIta2R1bXAiIHRvIHRoZSBjdXJyZW50IHN0cmluZyBpbgorICAgIkxvY2FsIHZlcnNpb24uIgorCisyKSBPbiB4ODYsIGVuYWJsZSBoaWdoIG1lbW9yeSBzdXBwb3J0IHVuZGVyICJQcm9jZXNzb3IgdHlwZSBhbmQKKyAgIGZlYXR1cmVzIjoKKworICAgQ09ORklHX0hJR0hNRU02NEc9eQorICAgb3IKKyAgIENPTkZJR19ISUdITUVNNEcKKworMykgT24geDg2IGFuZCB4ODZfNjQsIGRpc2FibGUgc3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydAorICAgdW5kZXIgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyI6CisKKyAgIENPTkZJR19TTVA9bgorICAgKElmIENPTkZJR19TTVA9eSwgdGhlbiBzcGVjaWZ5IG1heGNwdXM9MSBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorICAgd2hlbiBsb2FkaW5nIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLCBzZWUgc2VjdGlvbiAiTG9hZCB0aGUgRHVtcC1jYXB0dXJlCisgICBLZXJuZWwiLikKKworNCkgT24gcHBjNjQsIGRpc2FibGUgTlVNQSBzdXBwb3J0IGFuZCBlbmFibGUgRU1CRURERUQgc3VwcG9ydDoKKworICAgQ09ORklHX05VTUE9bgorICAgQ09ORklHX0VNQkVEREVEPXkKKyAgIENPTkZJR19FRUg9TiBmb3IgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwKKworNSkgRW5hYmxlICJrZXJuZWwgY3Jhc2ggZHVtcHMiIHN1cHBvcnQgdW5kZXIgIlByb2Nlc3NvciB0eXBlIGFuZAorICAgZmVhdHVyZXMiOgorCisgICBDT05GSUdfQ1JBU0hfRFVNUD15CisKKzYpIFVzZSBhIHN1aXRhYmxlIHZhbHVlIGZvciAiUGh5c2ljYWwgYWRkcmVzcyB3aGVyZSB0aGUga2VybmVsIGlzCisgICBsb2FkZWQiICh1bmRlciAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIikuIFRoaXMgb25seSBhcHBlYXJzIHdoZW4KKyAgICJrZXJuZWwgY3Jhc2ggZHVtcHMiIGlzIGVuYWJsZWQuIEJ5IGRlZmF1bHQgdGhpcyB2YWx1ZSBpcyAweDEwMDAwMDAKKyAgICgxNk1CKS4gSXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIFggaW4gdGhlICJjcmFzaGtlcm5lbD1ZQFgiIGJvb3QKKyAgIHBhcmFtZXRlciBkaXNjdXNzZWQgYWJvdmUuCisKKyAgIE9uIHg4NiBhbmQgeDg2XzY0LCB1c2UgIkNPTkZJR19QSFlTSUNBTF9TVEFSVD0weDEwMDAwMDAiLgorCisgICBPbiBwcGM2NCB0aGUgdmFsdWUgaXMgYXV0b21hdGljYWxseSBzZXQgYXQgMzJNQiB3aGVuCisgICBDT05GSUdfQ1JBU0hfRFVNUCBpcyBzZXQuCisKKzYpIE9wdGlvbmFsbHkgZW5hYmxlICIvcHJvYy92bWNvcmUgc3VwcG9ydCIgdW5kZXIgIkZpbGVzeXN0ZW1zIiAtPgorICAgIlBzZXVkbyBmaWxlc3lzdGVtcyIuCisKKyAgIENPTkZJR19QUk9DX1ZNQ09SRT15CisgICAoQ09ORklHX1BST0NfVk1DT1JFIGlzIHNldCBieSBkZWZhdWx0IHdoZW4gQ09ORklHX0NSQVNIX0RVTVAgaXMgc2VsZWN0ZWQuKQorCis3KSBNYWtlIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwgYW5kIGl0cyBtb2R1bGVzLiBETyBOT1QgYWRkIHRoaXMga2VybmVsCisgICB0byB0aGUgYm9vdCBsb2FkZXIgY29uZmlndXJhdGlvbiBmaWxlcy4KKworCitMb2FkIHRoZSBEdW1wLWNhcHR1cmUgS2VybmVsCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIGJvb3RpbmcgdG8gdGhlIHN5c3RlbSBrZXJuZWwsIGxvYWQgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgdXNpbmcKK3RoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAga2V4ZWMgLXAgPGR1bXAtY2FwdHVyZS1rZXJuZWw+IFwKKyAgIC0taW5pdHJkPTxpbml0cmQtZm9yLWR1bXAtY2FwdHVyZS1rZXJuZWw+IC0tYXJncy1saW51eCBcCisgICAtLWFwcGVuZD0icm9vdD08cm9vdC1kZXY+IGluaXQgMSBpcnFwb2xsIgorCisKK05vdGVzIG9uIGxvYWRpbmcgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWw6CisKKyogPGR1bXAtY2FwdHVyZS1rZXJuZWw+IG11c3QgYmUgYSB2bWxpbnV4IGltYWdlICh0aGF0IGlzLCBhbgorICB1bmNvbXByZXNzZWQgRUxGIGltYWdlKS4gYnpJbWFnZSBkb2VzIG5vdCB3b3JrIGF0IHRoaXMgdGltZS4KKworKiBCeSBkZWZhdWx0LCB0aGUgRUxGIGhlYWRlcnMgYXJlIHN0b3JlZCBpbiBFTEY2NCBmb3JtYXQgdG8gc3VwcG9ydAorICBzeXN0ZW1zIHdpdGggbW9yZSB0aGFuIDRHQiBtZW1vcnkuIFRoZSAtLWVsZjMyLWNvcmUtaGVhZGVycyBvcHRpb24gY2FuCisgIGJlIHVzZWQgdG8gZm9yY2UgdGhlIGdlbmVyYXRpb24gb2YgRUxGMzIgaGVhZGVycy4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgYmVjYXVzZSBHREIgY3VycmVudGx5IGNhbm5vdCBvcGVuIHZtY29yZSBmaWxlcyB3aXRoIEVMRjY0IGhlYWRlcnMgb24KKyAgMzItYml0IHN5c3RlbXMuIEVMRjMyIGhlYWRlcnMgY2FuIGJlIHVzZWQgb24gbm9uLVBBRSBzeXN0ZW1zICh0aGF0IGlzLAorICBsZXNzIHRoYW4gNEdCIG9mIG1lbW9yeSkuCisKKyogVGhlICJpcnFwb2xsIiBib290IHBhcmFtZXRlciByZWR1Y2VzIGRyaXZlciBpbml0aWFsaXphdGlvbiBmYWlsdXJlcworICBkdWUgdG8gc2hhcmVkIGludGVycnVwdHMgaW4gdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwuCisKKyogWW91IG11c3Qgc3BlY2lmeSA8cm9vdC1kZXY+IGluIHRoZSBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgcm9vdAorICBkZXZpY2UgbmFtZSBpbiB0aGUgb3V0cHV0IG9mIG1vdW50IGNvbW1hbmQuCisKKyogImluaXQgMSIgYm9vdHMgdGhlIGR1bXAtY2FwdHVyZSBrZXJuZWwgaW50byBzaW5nbGUtdXNlciBtb2RlIHdpdGhvdXQKKyAgbmV0d29ya2luZy4gSWYgeW91IHdhbnQgbmV0d29ya2luZywgdXNlICJpbml0IDMuIgorCisKK0tlcm5lbCBQYW5pYworPT09PT09PT09PT09CisKK0FmdGVyIHN1Y2Nlc3NmdWxseSBsb2FkaW5nIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGFzIHByZXZpb3VzbHkKK2Rlc2NyaWJlZCwgdGhlIHN5c3RlbSB3aWxsIHJlYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGlmIGEKK3N5c3RlbSBjcmFzaCBpcyB0cmlnZ2VyZWQuICBUcmlnZ2VyIHBvaW50cyBhcmUgbG9jYXRlZCBpbiBwYW5pYygpLAorZGllKCksIGRpZV9ubWkoKSBhbmQgaW4gdGhlIHN5c3JxIGhhbmRsZXIgKEFMVC1TeXNScS1jKS4KKworVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdpbGwgZXhlY3V0ZSBhIGNyYXNoIHRyaWdnZXIgcG9pbnQ6CisKK0lmIGEgaGFyZCBsb2NrdXAgaXMgZGV0ZWN0ZWQgYW5kICJOTUkgd2F0Y2hkb2ciIGlzIGNvbmZpZ3VyZWQsIHRoZSBzeXN0ZW0KK3dpbGwgYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsICggZGllX25taSgpICkuCisKK0lmIGRpZSgpIGlzIGNhbGxlZCwgYW5kIGl0IGhhcHBlbnMgdG8gYmUgYSB0aHJlYWQgd2l0aCBwaWQgMCBvciAxLCBvciBkaWUoKQoraXMgY2FsbGVkIGluc2lkZSBpbnRlcnJ1cHQgY29udGV4dCBvciBkaWUoKSBpcyBjYWxsZWQgYW5kIHBhbmljX29uX29vcHMgaXMgc2V0LAordGhlIHN5c3RlbSB3aWxsIGJvb3QgaW50byB0aGUgZHVtcC1jYXB0dXJlIGtlcm5lbC4KKworT24gcG93ZXJlcnBjIHN5c3RlbXMgd2hlbiBhIHNvZnQtcmVzZXQgaXMgZ2VuZXJhdGVkLCBkaWUoKSBpcyBjYWxsZWQgYnkgYWxsIGNwdXMgYW5kIHRoZSBzeXN0ZW0gc3lzdGVtIHdpbGwgYm9vdCBpbnRvIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsLgorCitGb3IgdGVzdGluZyBwdXJwb3NlcywgeW91IGNhbiB0cmlnZ2VyIGEgY3Jhc2ggYnkgdXNpbmcgIkFMVC1TeXNScS1jIiwKKyJlY2hvIGMgPiAvcHJvYy9zeXNycS10cmlnZ2VyIG9yIHdyaXRlIGEgbW9kdWxlIHRvIGZvcmNlIHRoZSBwYW5pYy4KKworV3JpdGUgT3V0IHRoZSBEdW1wIEZpbGUKKz09PT09PT09PT09PT09PT09PT09PT09CisKK0FmdGVyIHRoZSBkdW1wLWNhcHR1cmUga2VybmVsIGlzIGJvb3RlZCwgd3JpdGUgb3V0IHRoZSBkdW1wIGZpbGUgd2l0aAordGhlIGZvbGxvd2luZyBjb21tYW5kOgogCiAgICBjcCAvcHJvYy92bWNvcmUgPGR1bXAtZmlsZT4KIAotICAgRHVtcCBtZW1vcnkgY2FuIGFsc28gYmUgYWNjZXNzZWQgYXMgYSAvZGV2L29sZG1lbSBkZXZpY2UgZm9yIGEgbGluZWFyL3JhdwotICAgdmlldy4gIFRvIGNyZWF0ZSB0aGUgZGV2aWNlLCB0eXBlOgorWW91IGNhbiBhbHNvIGFjY2VzcyBkdW1wZWQgbWVtb3J5IGFzIGEgL2Rldi9vbGRtZW0gZGV2aWNlIGZvciBhIGxpbmVhcgorYW5kIHJhdyB2aWV3LiBUbyBjcmVhdGUgdGhlIGRldmljZSwgdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKIAotICAgbWtub2QgL2Rldi9vbGRtZW0gYyAxIDEyCisgICAgbWtub2QgL2Rldi9vbGRtZW0gYyAxIDEyCiAKLSAgIFVzZSAiZGQiIHdpdGggc3VpdGFibGUgb3B0aW9ucyBmb3IgY291bnQsIGJzIGFuZCBza2lwIHRvIGFjY2VzcyBzcGVjaWZpYwotICAgcG9ydGlvbnMgb2YgdGhlIGR1bXAuCitVc2UgdGhlIGRkIGNvbW1hbmQgd2l0aCBzdWl0YWJsZSBvcHRpb25zIGZvciBjb3VudCwgYnMsIGFuZCBza2lwIHRvCithY2Nlc3Mgc3BlY2lmaWMgcG9ydGlvbnMgb2YgdGhlIGR1bXAuCiAKLSAgIEVudGlyZSBtZW1vcnk6ICBkZCBpZj0vZGV2L29sZG1lbSBvZj1vbGRtZW0uMDAxCitUbyBzZWUgdGhlIGVudGlyZSBtZW1vcnksIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisKKyAgIGRkIGlmPS9kZXYvb2xkbWVtIG9mPW9sZG1lbS4wMDEKIAogCi1BTkFMWVNJUworQW5hbHlzaXMKID09PT09PT09Ci1MaW1pdGVkIGFuYWx5c2lzIGNhbiBiZSBkb25lIHVzaW5nIGdkYiBvbiB0aGUgZHVtcCBmaWxlIGNvcGllZCBvdXQgb2YKLS9wcm9jL3ZtY29yZS4gVXNlIHZtbGludXggYnVpbHQgd2l0aCAtZyBhbmQgcnVuCiAKLSAgZ2RiIHZtbGludXggPGR1bXAtZmlsZT4KK0JlZm9yZSBhbmFseXppbmcgdGhlIGR1bXAgaW1hZ2UsIHlvdSBzaG91bGQgcmVib290IGludG8gYSBzdGFibGUga2VybmVsLgogCi1TdGFjayB0cmFjZSBmb3IgdGhlIHRhc2sgb24gcHJvY2Vzc29yIDAsIHJlZ2lzdGVyIGRpc3BsYXksIG1lbW9yeSBkaXNwbGF5Ci13b3JrIGZpbmUuCitZb3UgY2FuIGRvIGxpbWl0ZWQgYW5hbHlzaXMgdXNpbmcgR0RCIG9uIHRoZSBkdW1wIGZpbGUgY29waWVkIG91dCBvZgorL3Byb2Mvdm1jb3JlLiBVc2UgdGhlIGRlYnVnIHZtbGludXggYnVpbHQgd2l0aCAtZyBhbmQgcnVuIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQ6CiAKLU5vdGU6IGdkYiBjYW5ub3QgYW5hbHlzZSBjb3JlIGZpbGVzIGdlbmVyYXRlZCBpbiBFTEY2NCBmb3JtYXQgZm9yIGkzODYuCisgICBnZGIgdm1saW51eCA8ZHVtcC1maWxlPgogCi1MYXRlc3QgImNyYXNoIiAoY3Jhc2gtNC4wLTIuMTgpIGFzIGF2YWlsYWJsZSBvbiBEYXZlIEFuZGVyc29uJ3Mgc2l0ZQotaHR0cDovL3Blb3BsZS5yZWRoYXQuY29tL35hbmRlcnNvbi8gd29ya3Mgd2VsbCB3aXRoIGtkdW1wIGZvcm1hdC4KK1N0YWNrIHRyYWNlIGZvciB0aGUgdGFzayBvbiBwcm9jZXNzb3IgMCwgcmVnaXN0ZXIgZGlzcGxheSwgYW5kIG1lbW9yeQorZGlzcGxheSB3b3JrIGZpbmUuCisKK05vdGU6IEdEQiBjYW5ub3QgYW5hbHl6ZSBjb3JlIGZpbGVzIGdlbmVyYXRlZCBpbiBFTEY2NCBmb3JtYXQgZm9yIHg4Ni4KK09uIHN5c3RlbXMgd2l0aCBhIG1heGltdW0gb2YgNEdCIG9mIG1lbW9yeSwgeW91IGNhbiBnZW5lcmF0ZQorRUxGMzItZm9ybWF0IGhlYWRlcnMgdXNpbmcgdGhlIC0tZWxmMzItY29yZS1oZWFkZXJzIGtlcm5lbCBvcHRpb24gb24gdGhlCitkdW1wIGtlcm5lbC4KKworWW91IGNhbiBhbHNvIHVzZSB0aGUgQ3Jhc2ggdXRpbGl0eSB0byBhbmFseXplIGR1bXAgZmlsZXMgaW4gS2R1bXAKK2Zvcm1hdC4gQ3Jhc2ggaXMgYXZhaWxhYmxlIG9uIERhdmUgQW5kZXJzb24ncyBzaXRlIGF0IHRoZSBmb2xsb3dpbmcgVVJMOgorCisgICBodHRwOi8vcGVvcGxlLnJlZGhhdC5jb20vfmFuZGVyc29uLwogCiAKLVRPRE8KLT09PT0KLTEpIFByb3ZpZGUgYSBrZXJuZWwgcGFnZXMgZmlsdGVyaW5nIG1lY2hhbmlzbSBzbyB0aGF0IGNvcmUgZmlsZSBzaXplIGlzIG5vdAotICAgaW5zYW5lIG9uIHN5c3RlbXMgaGF2aW5nIGh1Z2UgbWVtb3J5IGJhbmtzLgotMikgUmVsb2NhdGFibGUga2VybmVsIGNhbiBoZWxwIGluIG1haW50YWluaW5nIG11bHRpcGxlIGtlcm5lbHMgZm9yIGNyYXNoZHVtcAotICAgYW5kIHNhbWUga2VybmVsIGFzIHRoZSBmaXJzdCBrZXJuZWwgY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSB0aGUgZHVtcC4KK1RvIERvCis9PT09PQorCisxKSBQcm92aWRlIGEga2VybmVsIHBhZ2VzIGZpbHRlcmluZyBtZWNoYW5pc20sIHNvIGNvcmUgZmlsZSBzaXplIGlzIG5vdAorICAgZXh0cmVtZSBvbiBzeXN0ZW1zIHdpdGggaHVnZSBtZW1vcnkgYmFua3MuCisKKzIpIFJlbG9jYXRhYmxlIGtlcm5lbCBjYW4gaGVscCBpbiBtYWludGFpbmluZyBtdWx0aXBsZSBrZXJuZWxzIGZvcgorICAgY3Jhc2hfZHVtcCwgYW5kIHRoZSBzYW1lIGtlcm5lbCBhcyB0aGUgc3lzdGVtIGtlcm5lbCBjYW4gYmUgdXNlZCB0bworICAgY2FwdHVyZSB0aGUgZHVtcC4KIAogCi1DT05UQUNUCitDb250YWN0CiA9PT09PT09CisKIFZpdmVrIEdveWFsICh2Z295YWxAaW4uaWJtLmNvbSkKIE1hbmVlc2ggU29uaSAobWFuZWVzaEBpbi5pYm0uY29tKQorCisKK1RyYWRlbWFyaworPT09PT09PT09CisKK0xpbnV4IGlzIGEgdHJhZGVtYXJrIG9mIExpbnVzIFRvcnZhbGRzIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlcgorY291bnRyaWVzLCBvciBib3RoLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBhOWQzYTE3Li5iY2E2ZjM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMTQ3LDYgKzE0Nyw5IEBACiAJYWNwaV9pcnFfaXNhPQlbSFcsQUNQSV0gSWYgaXJxX2JhbGFuY2UsIG1hcmsgbGlzdGVkIElSUXMgdXNlZCBieSBJU0EKIAkJCUZvcm1hdDogPGlycT4sPGlycT4uLi4KIAorCWFjcGlfb3NfbmFtZT0JW0hXLEFDUEldIFRlbGwgQUNQSSBCSU9TIHRoZSBuYW1lIG9mIHRoZSBPUworCQkJRm9ybWF0OiBUbyBzcG9vZiBhcyBXaW5kb3dzIDk4OiA9Ik1pY3Jvc29mdCBXaW5kb3dzIgorCiAJYWNwaV9vc2k9CVtIVyxBQ1BJXSBlbXB0eSBwYXJhbSBkaXNhYmxlcyBfT1NJCiAKIAlhY3BpX3NlcmlhbGl6ZQlbSFcsQUNQSV0gZm9yY2Ugc2VyaWFsaXphdGlvbiBvZiBBTUwgbWV0aG9kcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dCBiL0RvY3VtZW50YXRpb24va2V5cy50eHQKaW5kZXggYWFhMDFiMC4uM2JiZTE1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9rZXlzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tleXMudHh0CkBAIC0xOSw2ICsxOSw3IEBACiAJLSBLZXkgb3ZlcnZpZXcKIAktIEtleSBzZXJ2aWNlIG92ZXJ2aWV3CiAJLSBLZXkgYWNjZXNzIHBlcm1pc3Npb25zCisJLSBTRUxpbnV4IHN1cHBvcnQKIAktIE5ldyBwcm9jZnMgZmlsZXMKIAktIFVzZXJzcGFjZSBzeXN0ZW0gY2FsbCBpbnRlcmZhY2UKIAktIEtlcm5lbCBzZXJ2aWNlcwpAQCAtMjMyLDYgKzIzMywzNCBAQAogdGhlIGtleSBvciBoYXZpbmcgdGhlIHN5c2FkbWluIGNhcGFiaWxpdHkgaXMgc3VmZmljaWVudC4KIAogCis9PT09PT09PT09PT09PT0KK1NFTElOVVggU1VQUE9SVAorPT09PT09PT09PT09PT09CisKK1RoZSBzZWN1cml0eSBjbGFzcyAia2V5IiBoYXMgYmVlbiBhZGRlZCB0byBTRUxpbnV4IHNvIHRoYXQgbWFuZGF0b3J5IGFjY2VzcworY29udHJvbHMgY2FuIGJlIGFwcGxpZWQgdG8ga2V5cyBjcmVhdGVkIHdpdGhpbiB2YXJpb3VzIGNvbnRleHRzLiAgVGhpcyBzdXBwb3J0CitpcyBwcmVsaW1pbmFyeSwgYW5kIGlzIGxpa2VseSB0byBjaGFuZ2UgcXVpdGUgc2lnbmlmaWNhbnRseSBpbiB0aGUgbmVhciBmdXR1cmUuCitDdXJyZW50bHksIGFsbCBvZiB0aGUgYmFzaWMgcGVybWlzc2lvbnMgZXhwbGFpbmVkIGFib3ZlIGFyZSBwcm92aWRlZCBpbiBTRUxpbnV4CithcyB3ZWxsOyBTRSBMaW51eCBpcyBzaW1wbHkgaW52b2tlZCBhZnRlciBhbGwgYmFzaWMgcGVybWlzc2lvbiBjaGVja3MgaGF2ZSBiZWVuCitwZXJmb3JtZWQuCisKK0VhY2gga2V5IGlzIGxhYmVsZWQgd2l0aCB0aGUgc2FtZSBjb250ZXh0IGFzIHRoZSB0YXNrIHRvIHdoaWNoIGl0IGJlbG9uZ3MuCitUeXBpY2FsbHksIHRoaXMgaXMgdGhlIHNhbWUgdGFzayB0aGF0IHdhcyBydW5uaW5nIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZC4KK1RoZSBkZWZhdWx0IGtleXJpbmdzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBidXQgaW4gYSB3YXkgdGhhdCBpcyB2ZXJ5CitpbnR1aXRpdmU6CisKKyAoKikgVGhlIHVzZXIgYW5kIHVzZXIgc2Vzc2lvbiBrZXlyaW5ncyB0aGF0IGFyZSBjcmVhdGVkIHdoZW4gdGhlIHVzZXIgbG9ncyBpbgorICAgICBhcmUgY3VycmVudGx5IGxhYmVsZWQgd2l0aCB0aGUgY29udGV4dCBvZiB0aGUgbG9naW4gbWFuYWdlci4KKworICgqKSBUaGUga2V5cmluZ3MgYXNzb2NpYXRlZCB3aXRoIG5ldyB0aHJlYWRzIGFyZSBlYWNoIGxhYmVsZWQgd2l0aCB0aGUgY29udGV4dAorICAgICBvZiB0aGVpciBhc3NvY2lhdGVkIHRocmVhZCwgYW5kIGJvdGggc2Vzc2lvbiBhbmQgcHJvY2VzcyBrZXlyaW5ncyBhcmUKKyAgICAgaGFuZGxlZCBzaW1pbGFybHkuCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgdGhlIGRlZmF1bHQga2V5cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSByb290IHVzZXIgYXJlCitsYWJlbGVkIHdpdGggdGhlIGRlZmF1bHQga2VybmVsIGNvbnRleHQsIHNpbmNlIHRoZXkgYXJlIGNyZWF0ZWQgZWFybHkgaW4gdGhlCitib290IHByb2Nlc3MsIGJlZm9yZSByb290IGhhcyBhIGNoYW5jZSB0byBsb2cgaW4uCisKKwogPT09PT09PT09PT09PT09PQogTkVXIFBST0NGUyBGSUxFUwogPT09PT09PT09PT09PT09PQpAQCAtOTM1LDYgKzk2NCwxNiBAQAogICAgICBJdCBpcyBub3Qgc2FmZSB0byBzbGVlcCBpbiB0aGlzIG1ldGhvZDsgdGhlIGNhbGxlciBtYXkgaG9sZCBzcGlubG9ja3MuCiAKIAorICgqKSB2b2lkICgqcmV2b2tlKShzdHJ1Y3Qga2V5ICprZXkpOworCisgICAgIFRoaXMgbWV0aG9kIGlzIG9wdGlvbmFsLiAgSXQgaXMgY2FsbGVkIHRvIGRpc2NhcmQgcGFydCBvZiB0aGUgcGF5bG9hZAorICAgICBkYXRhIHVwb24gYSBrZXkgYmVpbmcgcmV2b2tlZC4gIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRoZSBrZXkgc2VtYXBob3JlCisgICAgIHdyaXRlLWxvY2tlZC4KKworICAgICBJdCBpcyBzYWZlIHRvIHNsZWVwIGluIHRoaXMgbWV0aG9kLCB0aG91Z2ggY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gYXZvaWQKKyAgICAgYSBkZWFkbG9jayBhZ2FpbnN0IHRoZSBrZXkgc2VtYXBob3JlLgorCisKICAoKikgdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBrZXkgKmtleSk7CiAKICAgICAgVGhpcyBtZXRob2QgaXMgb3B0aW9uYWwuIEl0IGlzIGNhbGxlZCB0byBkaXNjYXJkIHRoZSBwYXlsb2FkIGRhdGEgb24gYSBrZXkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dCBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAppbmRleCA0NzEwODQ1Li5jZjBkNTQxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CkBAIC0yNjIsOSArMjYyLDE0IEBACiBDUFUgdG8gcmVzdHJpY3QgdGhlIG9yZGVyLgogCiBNZW1vcnkgYmFycmllcnMgYXJlIHN1Y2ggaW50ZXJ2ZW50aW9ucy4gIFRoZXkgaW1wb3NlIGEgcGVyY2VpdmVkIHBhcnRpYWwKLW9yZGVyaW5nIGJldHdlZW4gdGhlIG1lbW9yeSBvcGVyYXRpb25zIHNwZWNpZmllZCBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgYmFycmllci4KLVRoZXkgcmVxdWVzdCB0aGF0IHRoZSBzZXF1ZW5jZSBvZiBtZW1vcnkgZXZlbnRzIGdlbmVyYXRlZCBhcHBlYXJzIHRvIG90aGVyCi1wYXJ0cyBvZiB0aGUgc3lzdGVtIGFzIGlmIHRoZSBiYXJyaWVyIGlzIGVmZmVjdGl2ZSBvbiB0aGF0IENQVS4KK29yZGVyaW5nIG92ZXIgdGhlIG1lbW9yeSBvcGVyYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mIHRoZSBiYXJyaWVyLgorCitTdWNoIGVuZm9yY2VtZW50IGlzIGltcG9ydGFudCBiZWNhdXNlIHRoZSBDUFVzIGFuZCBvdGhlciBkZXZpY2VzIGluIGEgc3lzdGVtCitjYW4gdXNlIGEgdmFyaWV0eSBvZiB0cmlja3MgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSAtIGluY2x1ZGluZyByZW9yZGVyaW5nLAorZGVmZXJyYWwgYW5kIGNvbWJpbmF0aW9uIG9mIG1lbW9yeSBvcGVyYXRpb25zOyBzcGVjdWxhdGl2ZSBsb2Fkczsgc3BlY3VsYXRpdmUKK2JyYW5jaCBwcmVkaWN0aW9uIGFuZCB2YXJpb3VzIHR5cGVzIG9mIGNhY2hpbmcuICBNZW1vcnkgYmFycmllcnMgYXJlIHVzZWQgdG8KK292ZXJyaWRlIG9yIHN1cHByZXNzIHRoZXNlIHRyaWNrcywgYWxsb3dpbmcgdGhlIGNvZGUgdG8gc2FuZWx5IGNvbnRyb2wgdGhlCitpbnRlcmFjdGlvbiBvZiBtdWx0aXBsZSBDUFVzIGFuZC9vciBkZXZpY2VzLgogCiAKIFZBUklFVElFUyBPRiBNRU1PUlkgQkFSUklFUgpAQCAtMjgyLDcgKzI4Nyw3IEBACiAgICAgIEEgd3JpdGUgYmFycmllciBpcyBhIHBhcnRpYWwgb3JkZXJpbmcgb24gc3RvcmVzIG9ubHk7IGl0IGlzIG5vdCByZXF1aXJlZAogICAgICB0byBoYXZlIGFueSBlZmZlY3Qgb24gbG9hZHMuCiAKLSAgICAgQSBDUFUgY2FuIGJlIHZpZXdlZCBhcyBhcyBjb21taXRpbmcgYSBzZXF1ZW5jZSBvZiBzdG9yZSBvcGVyYXRpb25zIHRvIHRoZQorICAgICBBIENQVSBjYW4gYmUgdmlld2VkIGFzIGNvbW1pdHRpbmcgYSBzZXF1ZW5jZSBvZiBzdG9yZSBvcGVyYXRpb25zIHRvIHRoZQogICAgICBtZW1vcnkgc3lzdGVtIGFzIHRpbWUgcHJvZ3Jlc3Nlcy4gIEFsbCBzdG9yZXMgYmVmb3JlIGEgd3JpdGUgYmFycmllciB3aWxsCiAgICAgIG9jY3VyIGluIHRoZSBzZXF1ZW5jZSBfYmVmb3JlXyBhbGwgdGhlIHN0b3JlcyBhZnRlciB0aGUgd3JpdGUgYmFycmllci4KIApAQCAtNDEzLDcgKzQxOCw3IEBACiAgICAgIGluZGlyZWN0IGVmZmVjdCB3aWxsIGJlIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgc2Vjb25kIENQVSBzZWVzIHRoZSBlZmZlY3RzCiAgICAgIG9mIHRoZSBmaXJzdCBDUFUncyBhY2Nlc3NlcyBvY2N1ciwgYnV0IHNlZSB0aGUgbmV4dCBwb2ludDoKIAotICgqKSBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgYSBDUFUgd2lsbCBzZWUgdGhlIGNvcnJlY3Qgb3JkZXIgb2YgZWZmZWN0cworICgqKSBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBhIENQVSB3aWxsIHNlZSB0aGUgY29ycmVjdCBvcmRlciBvZiBlZmZlY3RzCiAgICAgIGZyb20gYSBzZWNvbmQgQ1BVJ3MgYWNjZXNzZXMsIGV2ZW4gX2lmXyB0aGUgc2Vjb25kIENQVSB1c2VzIGEgbWVtb3J5CiAgICAgIGJhcnJpZXIsIHVubGVzcyB0aGUgZmlyc3QgQ1BVIF9hbHNvXyB1c2VzIGEgbWF0Y2hpbmcgbWVtb3J5IGJhcnJpZXIgKHNlZQogICAgICB0aGUgc3Vic2VjdGlvbiBvbiAiU01QIEJhcnJpZXIgUGFpcmluZyIpLgpAQCAtNDYxLDggKzQ2Niw4IEBACiBpc24ndCwgYW5kIHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBvYnNlcnZlZCBvbiBjZXJ0YWluIHJlYWwgQ1BVcyAoc3VjaCBhcyB0aGUgREVDCiBBbHBoYSkuCiAKLVRvIGRlYWwgd2l0aCB0aGlzLCBhIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVyIG11c3QgYmUgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUKLWFkZHJlc3MgbG9hZCBhbmQgdGhlIGRhdGEgbG9hZDoKK1RvIGRlYWwgd2l0aCB0aGlzLCBhIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVyIG9yIGJldHRlciBtdXN0IGJlIGluc2VydGVkCitiZXR3ZWVuIHRoZSBhZGRyZXNzIGxvYWQgYW5kIHRoZSBkYXRhIGxvYWQ6CiAKIAlDUFUgMQkJQ1BVIDIKIAk9PT09PT09PT09PT09PT0JPT09PT09PT09PT09PT09CkBAIC00ODQsNyArNDg5LDcgQEAKIHZhcmlhYmxlIEIgbWlnaHQgYmUgc3RvcmVkIGluIGFuIGV2ZW4tbnVtYmVyZWQgY2FjaGUgbGluZS4gIFRoZW4sIGlmIHRoZQogZXZlbi1udW1iZXJlZCBiYW5rIG9mIHRoZSByZWFkaW5nIENQVSdzIGNhY2hlIGlzIGV4dHJlbWVseSBidXN5IHdoaWxlIHRoZQogb2RkLW51bWJlcmVkIGJhbmsgaXMgaWRsZSwgb25lIGNhbiBzZWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgcG9pbnRlciBQICgmQiksCi1idXQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQiAoMSkuCitidXQgdGhlIG9sZCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQiAoMikuCiAKIAogQW5vdGhlciBleGFtcGxlIG9mIHdoZXJlIGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVycyBtaWdodCBieSByZXF1aXJlZCBpcyB3aGVyZSBhCkBAIC03NDQsNyArNzQ5LDcgQEAKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICAgICA6CiAKIAotSWYsIGhvd2V2ZXIsIGEgcmVhZCBiYXJyaWVyIHdlcmUgdG8gYmUgcGxhY2VkIGJldHdlZW4gdGhlIGxvYWQgb2YgRSBhbmQgdGhlCitJZiwgaG93ZXZlciwgYSByZWFkIGJhcnJpZXIgd2VyZSB0byBiZSBwbGFjZWQgYmV0d2VlbiB0aGUgbG9hZCBvZiBCIGFuZCB0aGUKIGxvYWQgb2YgQSBvbiBDUFUgMjoKIAogCUNQVSAxCQkJQ1BVIDIKQEAgLTE0NjEsOSArMTQ2Niw4IEBACiAKIE9uIGEgVVAgc3lzdGVtIC0gd2hlcmUgdGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0gLSB0aGUgc21wX21iKCkgaXMganVzdCBhCiBjb21waWxlciBiYXJyaWVyLCB0aHVzIG1ha2luZyBzdXJlIHRoZSBjb21waWxlciBlbWl0cyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZQotcmlnaHQgb3JkZXIgd2l0aG91dCBhY3R1YWxseSBpbnRlcnZlbmluZyBpbiB0aGUgQ1BVLiAgU2luY2UgdGhlcmUgdGhlcmUncyBvbmx5Ci1vbmUgQ1BVLCB0aGF0IENQVSdzIGRlcGVuZGVuY3kgb3JkZXJpbmcgbG9naWMgd2lsbCB0YWtlIGNhcmUgb2YgZXZlcnl0aGluZwotZWxzZS4KK3JpZ2h0IG9yZGVyIHdpdGhvdXQgYWN0dWFsbHkgaW50ZXJ2ZW5pbmcgaW4gdGhlIENQVS4gIFNpbmNlIHRoZXJlJ3Mgb25seSBvbmUKK0NQVSwgdGhhdCBDUFUncyBkZXBlbmRlbmN5IG9yZGVyaW5nIGxvZ2ljIHdpbGwgdGFrZSBjYXJlIG9mIGV2ZXJ5dGhpbmcgZWxzZS4KIAogCiBBVE9NSUMgT1BFUkFUSU9OUwpAQCAtMTY0MCw5ICsxNjQ0LDkgQEAKIAogICAgICBUaGUgUENJIGJ1cywgYW1vbmdzdCBvdGhlcnMsIGRlZmluZXMgYW4gSS9PIHNwYWNlIGNvbmNlcHQgLSB3aGljaCBvbiBzdWNoCiAgICAgIENQVXMgYXMgaTM4NiBhbmQgeDg2XzY0IGNwdXMgcmVhZGlseSBtYXBzIHRvIHRoZSBDUFUncyBjb25jZXB0IG9mIEkvTwotICAgICBzcGFjZS4gIEhvd2V2ZXIsIGl0IG1heSBhbHNvIG1hcHBlZCBhcyBhIHZpcnR1YWwgSS9PIHNwYWNlIGluIHRoZSBDUFUncwotICAgICBtZW1vcnkgbWFwLCBwYXJ0aWN1bGFybHkgb24gdGhvc2UgQ1BVcyB0aGF0IGRvbid0IHN1cHBvcnQgYWx0ZXJuYXRlCi0gICAgIEkvTyBzcGFjZXMuCisgICAgIHNwYWNlLiAgSG93ZXZlciwgaXQgbWF5IGFsc28gYmUgbWFwcGVkIGFzIGEgdmlydHVhbCBJL08gc3BhY2UgaW4gdGhlIENQVSdzCisgICAgIG1lbW9yeSBtYXAsIHBhcnRpY3VsYXJseSBvbiB0aG9zZSBDUFVzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBhbHRlcm5hdGUgSS9PCisgICAgIHNwYWNlcy4KIAogICAgICBBY2Nlc3NlcyB0byB0aGlzIHNwYWNlIG1heSBiZSBmdWxseSBzeW5jaHJvbm91cyAoYXMgb24gaTM4NiksIGJ1dAogICAgICBpbnRlcm1lZGlhcnkgYnJpZGdlcyAoc3VjaCBhcyB0aGUgUENJIGhvc3QgYnJpZGdlKSBtYXkgbm90IGZ1bGx5IGhvbm91cgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3R1bnRhcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHVudGFwLnR4dAppbmRleCA3Njc1MGZiLi44MzljYmI3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHVudGFwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdHVudGFwLnR4dApAQCAtMzksMTAgKzM5LDEzIEBACiAgICAgIG1rbm9kIC9kZXYvbmV0L3R1biBjIDEwIDIwMAogICAKICAgU2V0IHBlcm1pc3Npb25zOgotICAgICBlLmcuIGNobW9kIDA3MDAgL2Rldi9uZXQvdHVuCi0gICAgIGlmIHlvdSB3YW50IHRoZSBkZXZpY2Ugb25seSBhY2Nlc3NpYmxlIGJ5IHJvb3QuIEdpdmluZyByZWd1bGFyIHVzZXJzIHRoZQotICAgICByaWdodCB0byBhc3NpZ24gbmV0d29yayBkZXZpY2VzIGlzIE5PVCBhIGdvb2QgaWRlYS4gVXNlcnMgY291bGQgYXNzaWduCi0gICAgIGJvZ3VzIG5ldHdvcmsgaW50ZXJmYWNlcyB0byB0cmljayBmaXJld2FsbHMgb3IgYWRtaW5pc3RyYXRvcnMuCisgICAgIGUuZy4gY2htb2QgMDY2NiAvZGV2L25ldC90dW4KKyAgICAgVGhlcmUncyBubyBoYXJtIGluIGFsbG93aW5nIHRoZSBkZXZpY2UgdG8gYmUgYWNjZXNzaWJsZSBieSBub24tcm9vdCB1c2VycywKKyAgICAgc2luY2UgQ0FQX05FVF9BRE1JTiBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgbmV0d29yayBkZXZpY2VzIG9yIGZvciAKKyAgICAgY29ubmVjdGluZyB0byBuZXR3b3JrIGRldmljZXMgd2hpY2ggYXJlbid0IG93bmVkIGJ5IHRoZSB1c2VyIGluIHF1ZXN0aW9uLgorICAgICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgcGVyc2lzdGVudCBkZXZpY2VzIGFuZCBnaXZlIG93bmVyc2hpcCBvZiB0aGVtIHRvIAorICAgICB1bnByaXZpbGVnZWQgdXNlcnMsIHRoZW4geW91IG5lZWQgdGhlIC9kZXYvbmV0L3R1biBkZXZpY2UgdG8gYmUgdXNhYmxlIGJ5CisgICAgIHRob3NlIHVzZXJzLgogCiAgIERyaXZlciBtb2R1bGUgYXV0b2xvYWRpbmcKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9wY2kudHh0CmluZGV4IDY2YmJiZjEuLjMyNDJlNWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3BjaS50eHQKQEAgLTIxMyw5ICsyMTMsMTcgQEAKIAogICAgU2VlIERvY3VtZW50YXRpb24vSU8tbWFwcGluZy50eHQgZm9yIGhvdyB0byBhY2Nlc3MgZGV2aWNlIG1lbW9yeS4KIAotICAgWW91IHN0aWxsIG5lZWQgdG8gY2FsbCByZXF1ZXN0X3JlZ2lvbigpIGZvciBJL08gcmVnaW9ucyBhbmQKLXJlcXVlc3RfbWVtX3JlZ2lvbigpIGZvciBtZW1vcnkgcmVnaW9ucyB0byBtYWtlIHN1cmUgbm9ib2R5IGVsc2UgaXMgdXNpbmcgdGhlCi1zYW1lIGRldmljZS4KKyAgIFRoZSBkZXZpY2UgZHJpdmVyIG5lZWRzIHRvIGNhbGwgcGNpX3JlcXVlc3RfcmVnaW9uKCkgdG8gbWFrZSBzdXJlCitubyBvdGhlciBkZXZpY2UgaXMgYWxyZWFkeSB1c2luZyB0aGUgc2FtZSByZXNvdXJjZS4gVGhlIGRyaXZlciBpcyBleHBlY3RlZAordG8gZGV0ZXJtaW5lIE1NSU8gYW5kIElPIFBvcnQgcmVzb3VyY2UgYXZhaWxhYmlsaXR5IF9iZWZvcmVfIGNhbGxpbmcKK3BjaV9lbmFibGVfZGV2aWNlKCkuICBDb252ZXJzZWx5LCBkcml2ZXJzIHNob3VsZCBjYWxsIHBjaV9yZWxlYXNlX3JlZ2lvbigpCitfYWZ0ZXJfIGNhbGxpbmcgcGNpX2Rpc2FibGVfZGV2aWNlKCkuIFRoZSBpZGVhIGlzIHRvIHByZXZlbnQgdHdvIGRldmljZXMKK2NvbGxpZGluZyBvbiB0aGUgc2FtZSBhZGRyZXNzIHJhbmdlLgorCitHZW5lcmljIGZsYXZvcnMgb2YgcGNpX3JlcXVlc3RfcmVnaW9uKCkgYXJlIHJlcXVlc3RfbWVtX3JlZ2lvbigpCisoZm9yIE1NSU8gcmFuZ2VzKSBhbmQgcmVxdWVzdF9yZWdpb24oKSAoZm9yIElPIFBvcnQgcmFuZ2VzKS4KK1VzZSB0aGVzZSBmb3IgYWRkcmVzcyByZXNvdXJjZXMgdGhhdCBhcmUgbm90IGRlc2NyaWJlZCBieSAibm9ybWFsIiBQQ0kKK2ludGVyZmFjZXMgKGUuZy4gQkFSKS4KIAogICAgQWxsIGludGVycnVwdCBoYW5kbGVycyBzaG91bGQgYmUgcmVnaXN0ZXJlZCB3aXRoIFNBX1NISVJRIGFuZCB1c2UgdGhlIGRldmlkCiB0byBtYXAgSVJRcyB0byBkZXZpY2VzIChyZW1lbWJlciB0aGF0IGFsbCBQQ0kgaW50ZXJydXB0cyBhcmUgc2hhcmVkKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dCBiL0RvY3VtZW50YXRpb24vcG93ZXIvc3dzdXNwLnR4dAppbmRleCA1MTZjNTAxLi44MjNiMmNmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3N3c3VzcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9zd3N1c3AudHh0CkBAIC0zNTAsOSArMzUwLDM0IEBACiAKIEE6IElmIHlvdSB3YW50IHRvIHNlZSBhbnkgbm9uLWVycm9yIGtlcm5lbCBtZXNzYWdlcyBvbiB0aGUgdmlydHVhbAogdGVybWluYWwgdGhlIGtlcm5lbCBzd2l0Y2hlcyB0byBkdXJpbmcgc3VzcGVuZCwgeW91IGhhdmUgdG8gc2V0IHRoZQota2VybmVsIGNvbnNvbGUgbG9nbGV2ZWwgdG8gYXQgbGVhc3QgNSwgZm9yIGV4YW1wbGUgYnkgZG9pbmcKK2tlcm5lbCBjb25zb2xlIGxvZ2xldmVsIHRvIGF0IGxlYXN0IDQgKEtFUk5fV0FSTklORyksIGZvciBleGFtcGxlIGJ5Citkb2luZwogCi0JZWNobyA1ID4gL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKKwkjIHNhdmUgdGhlIG9sZCBsb2dsZXZlbAorCXJlYWQgTE9HTEVWRUwgRFVNTVkgPCAvcHJvYy9zeXMva2VybmVsL3ByaW50aworCSMgc2V0IHRoZSBsb2dsZXZlbCBzbyB3ZSBzZWUgdGhlIHByb2dyZXNzIGJhci4KKwkjIGlmIHRoZSBsZXZlbCBpcyBoaWdoZXIgdGhhbiBuZWVkZWQsIHdlIGxlYXZlIGl0IGFsb25lLgorCWlmIFsgJExPR0xFVkVMIC1sdCA1IF07IHRoZW4KKwkgICAgICAgIGVjaG8gNSA+IC9wcm9jL3N5cy9rZXJuZWwvcHJpbnRrCisJCWZpCisKKyAgICAgICAgSU1HX1NaPTAKKyAgICAgICAgcmVhZCBJTUdfU1ogPCAvc3lzL3Bvd2VyL2ltYWdlX3NpemUKKyAgICAgICAgZWNobyAtbiBkaXNrID4gL3N5cy9wb3dlci9zdGF0ZQorICAgICAgICBSRVQ9JD8KKyAgICAgICAgIworICAgICAgICAjIHRoZSBsb2dpYyBoZXJlIGlzOgorICAgICAgICAjIGlmIGltYWdlX3NpemUgPiAwICh3aXRob3V0IGtlcm5lbCBzdXBwb3J0LCBJTUdfU1ogd2lsbCBiZSB6ZXJvKSwKKyAgICAgICAgIyB0aGVuIHRyeSBhZ2FpbiB3aXRoIGltYWdlX3NpemUgc2V0IHRvIHplcm8uCisJaWYgWyAkUkVUIC1uZSAwIC1hICRJTUdfU1ogLW5lIDAgXTsgdGhlbiAjIHRyeSBhZ2FpbiB3aXRoIG1pbmltYWwgaW1hZ2Ugc2l6ZQorICAgICAgICAgICAgICAgIGVjaG8gMCA+IC9zeXMvcG93ZXIvaW1hZ2Vfc2l6ZQorICAgICAgICAgICAgICAgIGVjaG8gLW4gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKKyAgICAgICAgICAgICAgICBSRVQ9JD8KKyAgICAgICAgZmkKKworCSMgcmVzdG9yZSBwcmV2aW91cyBsb2dsZXZlbAorCWVjaG8gJExPR0xFVkVMID4gL3Byb2Mvc3lzL2tlcm5lbC9wcmludGsKKwlleGl0ICRSRVQKIAogUTogSXMgdGhpcyB0cnVlIHRoYXQgaWYgSSBoYXZlIGEgbW91bnRlZCBmaWxlc3lzdGVtIG9uIGEgVVNCIGRldmljZSBhbmQKIEkgc3VzcGVuZCB0byBkaXNrLCBJIGNhbiBsb3NlIGRhdGEgdW5sZXNzIHRoZSBmaWxlc3lzdGVtIGhhcyBiZWVuIG1vdW50ZWQKQEAgLTM4MCwzICs0MDUsMTcgQEAKIEZpcmV3aXJlLCBDb21wYWN0Rmxhc2gsIE1NQywgZXh0ZXJuYWwgU0FUQSwgb3IgZXZlbiBJREUgaG90cGx1ZyBiYXlzKQogYmVmb3JlIHN1c3BlbmRpbmc7IHRoZW4gcmVtb3VudCB0aGVtIGFmdGVyIHJlc3VtaW5nLgogCitROiBJIHVwZ3JhZGVkIHRoZSBrZXJuZWwgZnJvbSAyLjYuMTUgdG8gMi42LjE2LiBCb3RoIGtlcm5lbHMgd2VyZQorY29tcGlsZWQgd2l0aCB0aGUgc2ltaWxhciBjb25maWd1cmF0aW9uIGZpbGVzLiBBbnl3YXkgSSBmb3VuZCB0aGF0CitzdXNwZW5kIHRvIGRpc2sgKGFuZCByZXN1bWUpIGlzIG11Y2ggc2xvd2VyIG9uIDIuNi4xNiBjb21wYXJlZCB0bworMi42LjE1LiBBbnkgaWRlYSBmb3Igd2h5IHRoYXQgbWlnaHQgaGFwcGVuIG9yIGhvdyBjYW4gSSBzcGVlZCBpdCB1cD8KKworQTogVGhpcyBpcyBiZWNhdXNlIHRoZSBzaXplIG9mIHRoZSBzdXNwZW5kIGltYWdlIGlzIG5vdyBncmVhdGVyIHRoYW4KK2ZvciAyLjYuMTUgKGJ5IHNhdmluZyBtb3JlIGRhdGEgd2UgY2FuIGdldCBtb3JlIHJlc3BvbnNpdmUgc3lzdGVtCithZnRlciByZXN1bWUpLgorCitUaGVyZSdzIHRoZSAvc3lzL3Bvd2VyL2ltYWdlX3NpemUga25vYiB0aGF0IGNvbnRyb2xzIHRoZSBzaXplIG9mIHRoZQoraW1hZ2UuICBJZiB5b3Ugc2V0IGl0IHRvIDAgKGVnLiBieSBlY2hvIDAgPiAvc3lzL3Bvd2VyL2ltYWdlX3NpemUgYXMKK3Jvb3QpLCB0aGUgMi42LjE1IGJlaGF2aW9yIHNob3VsZCBiZSByZXN0b3JlZC4gIElmIGl0IGlzIHN0aWxsIHRvbworc2xvdywgdGFrZSBhIGxvb2sgYXQgc3VzcGVuZC5zZi5uZXQgLS0gdXNlcmxhbmQgc3VzcGVuZCBpcyBmYXN0ZXIgYW5kCitzdXBwb3J0cyBMWkYgY29tcHJlc3Npb24gdG8gc3BlZWQgaXQgdXAgZnVydGhlci4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcG93ZXIvdmlkZW8udHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQKaW5kZXggNDNhODg5Zi4uZDg1OWZhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci92aWRlby50eHQKQEAgLTkwLDYgKzkwLDcgQEAKIE1vZGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFjayAob3IgImhvdyB0byBkbyBpdCIpCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEFjZXIgQXNwaXJlIDE0MDZMQwkJb2xlJ3MgbGF0ZSBCSU9TIGluaXQgKDcpLCB0dXJuIG9mZiBEUkkKK0FjZXIgVE0gMjMwCQkJczNfYmlvcyAoMikKIEFjZXIgVE0gMjQyRlgJCQl2YmV0b29sICg2KQogQWNlciBUTSBDMTEwCQkJdmlkZW9fcG9zdCAoOCkKIEFjZXIgVE0gQzMwMCAgICAgICAgICAgICAgICAgICAgdmdhPW5vcm1hbCAob25seSBzdXNwZW5kIG9uIGNvbnNvbGUsIG5vdCBpbiBYKSwgdmJldG9vbCAoNikgb3IgdmlkZW9fcG9zdCAoOCkKQEAgLTExNSw2ICsxMTYsNyBAQAogRGVsbCBJbnNwaXJvbiA0MDAwCQk/Pz8gKCopCiBEZWxsIEluc3Bpcm9uIDUwMG0JCT8/PyAoKikKIERlbGwgSW5zcGlyb24gNTEwbQkJPz8/CitEZWxsIEluc3Bpcm9uIDUxNTAJCXZiZXRvb2wgbmVlZGVkICg2KQogRGVsbCBJbnNwaXJvbiA2MDBtCQk/Pz8gKCopCiBEZWxsIEluc3Bpcm9uIDgyMDAJCT8/PyAoKikKIERlbGwgSW5zcGlyb24gODUwMAkJPz8/ICgqKQpAQCAtMTI1LDYgKzEyNyw3IEBACiBIUCBQYXZpbGlvbiBaRDcwMDAJCXZiZXRvb2wgcG9zdCBuZWVkZWQsIG5lZWQgb3Blbi1zb3VyY2UgbnYgZHJpdmVyIGZvciBYCiBIUCBPbW5pYm9vayBYRTMJYXRobG9uIHZlcnNpb24Jbm9uZSAoMSkKIEhQIE9tbmlib29rIFhFM0dDCQlub25lICgxKSwgdmlkZW8gaXMgUzMgU2F2YWdlL0lYLU1WCitIUCBPbW5pYm9vayBYRTNMLUdGCQl2YmV0b29sICg2KQogSFAgT21uaWJvb2sgNTE1MAkJbm9uZSAoMSksIChTMSBhbHNvIHdvcmtzIE9LKQogSUJNIFRQIFQyMCwgbW9kZWwgMjY0Ny00NEcJbm9uZSAoMSksIHZpZGVvIGlzIFMzIEluYy4gODZDMjcwLTI5NCBTYXZhZ2UvSVgtTVYsIHZlc2FmYiBnZXRzICJpbnRlcmVzdGluZyIgYnV0IFggd29yay4KIElCTSBUUCBBMzEgLyBUeXBlIDI2NTItTTVHICAgICAgczNfbW9kZSAoMykgW3dvcmtzIG9rIHdpdGggQklPUyAxLjA0IDIwMDItMDgtMjMsIGJ1dCBub3QgYXQgYWxsIHdpdGggQklPUyAxLjExIDIwMDQtMTEtMDUgOi0oXQpAQCAtMTU3LDYgKzE2MCw3IEBACiBTb255IFZhaW8gdmduLVM1ODBCSAkJdmdhPW5vcm1hbCwgYnV0IHN1c3BlbmQgZnJvbSBYLiBDb25zb2xlIHdpbGwgYmUgYmxhbmsgdW5sZXNzIHlvdSByZXR1cm4gdG8gWC4KIFNvbnkgVmFpbyB2Z24tRlMxMTVCCQlzM19iaW9zICgyKSxzM19tb2RlICg0KQogVG9zaGliYSBMaWJyZXR0byBMNQkJbm9uZSAoMSkKK1Rvc2hpYmEgTGlicmV0dG8gMTAwQ1QvMTEwQ1QgICAgdmJldG9vbCAoNikKIFRvc2hpYmEgUG9ydGVnZSAzMDIwQ1QJCXMzX21vZGUgKDMpCiBUb3NoaWJhIFNhdGVsbGl0ZSA0MDMwQ0RUCXMzX21vZGUgKDMpIChTMSBhbHNvIHdvcmtzIE9LKQogVG9zaGliYSBTYXRlbGxpdGUgNDA4MFhDRFQgICAgICBzM19tb2RlICgzKSAoUzEgYWxzbyB3b3JrcyBPSykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcnRjLnR4dCBiL0RvY3VtZW50YXRpb24vcnRjLnR4dAppbmRleCA5NWQxN2IzLi4yYTU4Zjk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CkBAIC00NCw4ICs0NCwxMCBAQAogUHJvZ3JhbW1pbmcgYW5kL29yIGVuYWJsaW5nIGludGVycnVwdCBmcmVxdWVuY2llcyBncmVhdGVyIHRoYW4gNjRIeiBpcwogb25seSBhbGxvd2VkIGJ5IHJvb3QuIFRoaXMgaXMgcGVyaGFwcyBhIGJpdCBjb25zZXJ2YXRpdmUsIGJ1dCB3ZSBkb24ndCB3YW50CiBhbiBldmlsIHVzZXIgZ2VuZXJhdGluZyBsb3RzIG9mIElSUXMgb24gYSBzbG93IDM4NnN4LTE2LCB3aGVyZSBpdCBtaWdodCBoYXZlCi1hIG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4gIE5vdGUgdGhhdCB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaXMgb25seQotYSBmZXcgbGluZXMgb2YgY29kZSB0byBtaW5pbWl6ZSBhbnkgcG9zc2liaWxpdHkgb2YgdGhpcyBlZmZlY3QuCithIG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4gVGhpcyA2NEh6IGxpbWl0IGNhbiBiZSBjaGFuZ2VkIGJ5IHdyaXRpbmcKK2EgZGlmZmVyZW50IHZhbHVlIHRvIC9wcm9jL3N5cy9kZXYvcnRjL21heC11c2VyLWZyZXEuIE5vdGUgdGhhdCB0aGUKK2ludGVycnVwdCBoYW5kbGVyIGlzIG9ubHkgYSBmZXcgbGluZXMgb2YgY29kZSB0byBtaW5pbWl6ZSBhbnkgcG9zc2liaWxpdHkKK29mIHRoaXMgZWZmZWN0LgogCiBBbHNvLCBpZiB0aGUga2VybmVsIHRpbWUgaXMgc3luY2hyb25pemVkIHdpdGggYW4gZXh0ZXJuYWwgc291cmNlLCB0aGUgCiBrZXJuZWwgd2lsbCB3cml0ZSB0aGUgdGltZSBiYWNrIHRvIHRoZSBDTU9TIGNsb2NrIGV2ZXJ5IDExIG1pbnV0ZXMuIEluIApAQCAtODEsNiArODMsNyBAQAogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQUxTQS1Db25maWd1cmF0aW9uLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CmluZGV4IDBlZTJjN2QuLjg3ZDc2YTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9BTFNBLUNvbmZpZ3VyYXRpb24udHh0CkBAIC0zNjYsNyArMzY2LDkgQEAKIAogICAgIE1vZHVsZSBmb3IgQy1NZWRpYSBDTUk4MzM4IGFuZCA4NzM4IFBDSSBzb3VuZCBjYXJkcy4KIAotICAgIG1wdV9wb3J0CS0gMHgzMDAsMHgzMTAsMHgzMjAsMHgzMzAsIDAgPSBkaXNhYmxlIChkZWZhdWx0KQorICAgIG1wdV9wb3J0CS0gMHgzMDAsMHgzMTAsMHgzMjAsMHgzMzAgPSBsZWdhY3kgcG9ydCwKKwkJICAxID0gaW50ZWdyYXRlZCBQQ0kgcG9ydCwKKwkJICAwID0gZGlzYWJsZSAoZGVmYXVsdCkKICAgICBmbV9wb3J0ICAgICAtIDB4Mzg4IChkZWZhdWx0KSwgMCA9IGRpc2FibGUgKGRlZmF1bHQpCiAgICAgc29mdF9hYzMgICAgLSBTb2Z0d2FyZS1jb252ZXJzaW9uIG9mIHJhdyBTUERJRiBwYWNrZXRzIChtb2RlbCAwMzMgb25seSkKICAgICAgICAgICAgICAgICAgIChkZWZhdWx0ID0gMSkKQEAgLTQ2OCw3ICs0NzAsNyBAQAogCiAgICAgTW9kdWxlIGZvciBtdWx0aWZ1bmN0aW9uIENTNTUzNSBjb21wYW5pb24gUENJIGRldmljZQogCi0gICAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgbXVsdGlwbGUgY2FyZHMuCisgICAgVGhlIHBvd2VyLW1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgogCiAgIE1vZHVsZSBzbmQtZHQwMTl4CiAgIC0tLS0tLS0tLS0tLS0tLS0tCkBAIC03MDcsOCArNzA5LDEwIEBACiAgIE1vZHVsZSBzbmQtaGRhLWludGVsCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBNb2R1bGUgZm9yIEludGVsIEhEIEF1ZGlvIChJQ0g2LCBJQ0g2TSwgSUNINyksIEFUSSBTQjQ1MCwKLQkgICAgICAgVklBIFZUODI1MS9WVDgyMzdBCisgICAgTW9kdWxlIGZvciBJbnRlbCBIRCBBdWRpbyAoSUNINiwgSUNINk0sIEVTQjIsIElDSDcsIElDSDgpLAorCQlBVEkgU0I0NTAsIFNCNjAwLCBSUzYwMCwKKwkJVklBIFZUODI1MS9WVDgyMzdBLAorCQlTSVM5NjYsIFVMSSBNNTQ2MQogCiAgICAgbW9kZWwJLSBmb3JjZSB0aGUgbW9kZWwgbmFtZQogICAgIHBvc2l0aW9uX2ZpeCAtIEZpeCBETUEgcG9pbnRlciAoMCA9IGF1dG8sIDEgPSBub25lLCAyID0gUE9TQlVGLCAzID0gRklGTyBzaXplKQpAQCAtNzc4LDYgKzc4Miw3IEBACiAJQUQxOTgxCiAJICBiYXNpYwkJMy1qYWNrIChkZWZhdWx0KQogCSAgaHAJCUhQIG54NjMyMAorCSAgdGhpbmtwYWQJTGVub3ZvIFRoaW5rcGFkIFQ2MC9YNjAvWjYwCiAKIAlBRDE5ODZBCiAJICA2c3RhY2sJNi1qYWNrLCBzZXBhcmF0ZSBzdXJyb3VuZHMgKGRlZmF1bHQpCkBAIC0xNjMzLDkgKzE2MzgsNyBAQAogCiAgICAgQWJvdXQgY2FwdHVyZSBJQkwsIHNlZSB0aGUgZGVzY3JpcHRpb24gb2Ygc25kLXZ4MjIyIG1vZHVsZS4KIAotICAgIE5vdGU6IHRoZSBkcml2ZXIgaXMgYnVpbGQgb25seSB3aGVuIENPTkZJR19JU0EgaXMgc2V0LgotICAgIAotICAgIE5vdGUyOiBzbmQtdnhwNDQwIGRyaXZlciBpcyBtZXJnZWQgdG8gc25kLXZ4cG9ja2V0IGRyaXZlciBzaW5jZQorICAgIE5vdGU6IHNuZC12eHA0NDAgZHJpdmVyIGlzIG1lcmdlZCB0byBzbmQtdnhwb2NrZXQgZHJpdmVyIHNpbmNlCiAgICAgICAgICAgIEFMU0EgMS4wLjEwLgogCiAgICAgVGhlIHBvd2VyLW1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgpAQCAtMTY2Miw4ICsxNjY1LDYgQEAKIAogICAgIE1vZHVsZSBmb3IgU291bmQgQ29yZSBQREF1ZGlvQ0Ygc291bmQgY2FyZC4KIAotICAgIE5vdGU6IHRoZSBkcml2ZXIgaXMgYnVpbGQgb25seSB3aGVuIENPTkZJR19JU0EgaXMgc2V0LgotCiAgICAgVGhlIHBvd2VyLW1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Eb2NCb29rL3dyaXRpbmctYW4tYWxzYS1kcml2ZXIudG1wbAppbmRleCAxZmFmNzYzLi42MzVjYmI5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvRG9jQm9vay93cml0aW5nLWFuLWFsc2EtZHJpdmVyLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0RvY0Jvb2svd3JpdGluZy1hbi1hbHNhLWRyaXZlci50bXBsCkBAIC00MjE1LDcgKzQyMTUsNyBAQAogICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KIDwhW0NEQVRBWwogICBzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwotICBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19NUFU0MDEsIHBvcnQsIGludGVncmF0ZWQsCisgIHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwgcG9ydCwgaW5mb19mbGFncywKICAgICAgICAgICAgICAgICAgICAgICBpcnEsIGlycV9mbGFncywgJnJtaWRpKTsKIF1dPgogICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CkBAIC00MjQyLDE1ICs0MjQyLDM2IEBACiAgICAgICA8L3BhcmE+CiAKICAgICAgIDxwYXJhPgorCVRoZSA1dGggYXJndW1lbnQgaXMgYml0ZmxhZ3MgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCiAgICAgICAgIFdoZW4gdGhlIGkvbyBwb3J0IGFkZHJlc3MgYWJvdmUgaXMgYSBwYXJ0IG9mIHRoZSBQQ0kgaS9vCiAgICAgICByZWdpb24sIHRoZSBNUFU0MDEgaS9vIHBvcnQgbWlnaHQgaGF2ZSBiZWVuIGFscmVhZHkgYWxsb2NhdGVkCi0gICAgICAocmVzZXJ2ZWQpIGJ5IHRoZSBkcml2ZXIgaXRzZWxmLiBJbiBzdWNoIGEgY2FzZSwgcGFzcyBub24temVybwotICAgICAgdG8gdGhlIDV0aCBhcmd1bWVudAotICAgICAgKDxwYXJhbWV0ZXI+aW50ZWdyYXRlZDwvcGFyYW1ldGVyPikuIE90aGVyd2lzZSwgcGFzcyAwIHRvIGl0LAorICAgICAgKHJlc2VydmVkKSBieSB0aGUgZHJpdmVyIGl0c2VsZi4gSW4gc3VjaCBhIGNhc2UsIHBhc3MgYSBiaXQgZmxhZworICAgICAgPGNvbnN0YW50Pk1QVTQwMV9JTkZPX0lOVEVHUkFURUQ8L2NvbnN0YW50PiwKICAgICAgIGFuZCAKICAgICAgIHRoZSBtcHU0MDEtdWFydCBsYXllciB3aWxsIGFsbG9jYXRlIHRoZSBpL28gcG9ydHMgYnkgaXRzZWxmLiAKICAgICAgIDwvcGFyYT4KIAorCTxwYXJhPgorCVdoZW4gdGhlIGNvbnRyb2xsZXIgc3VwcG9ydHMgb25seSB0aGUgaW5wdXQgb3Igb3V0cHV0IE1JREkgc3RyZWFtLAorCXBhc3MgPGNvbnN0YW50Pk1QVTQwMV9JTkZPX0lOUFVUPC9jb25zdGFudD4gb3IKKwk8Y29uc3RhbnQ+TVBVNDAxX0lORk9fT1VUUFVUPC9jb25zdGFudD4gYml0ZmxhZywgcmVzcGVjdGl2ZWx5LgorCVRoZW4gdGhlIHJhd21pZGkgaW5zdGFuY2UgaXMgY3JlYXRlZCBhcyBhIHNpbmdsZSBzdHJlYW0uCisJPC9wYXJhPgorCisJPHBhcmE+CisJPGNvbnN0YW50Pk1QVTQwMV9JTkZPX01NSU88L2NvbnN0YW50PiBiaXRmbGFnIGlzIHVzZWQgdG8gY2hhbmdlCisJdGhlIGFjY2VzcyBtZXRob2QgdG8gTU1JTyAodmlhIHJlYWRiIGFuZCB3cml0ZWIpIGluc3RlYWQgb2YKKwlpb2IgYW5kIG91dGIuICBJbiB0aGlzIGNhc2UsIHlvdSBoYXZlIHRvIHBhc3MgdGhlIGlvbWFwcGVkIGFkZHJlc3MKKwl0byA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X25ldygpPC9mdW5jdGlvbj4uCisJPC9wYXJhPgorCisJPHBhcmE+CisJV2hlbiA8Y29uc3RhbnQ+TVBVNDAxX0lORk9fVFhfSVJRPC9jb25zdGFudD4gaXMgc2V0LCB0aGUgb3V0cHV0CisJc3RyZWFtIGlzbid0IGNoZWNrZWQgaW4gdGhlIGRlZmF1bHQgaW50ZXJydXB0IGhhbmRsZXIuICBUaGUgZHJpdmVyCisJbmVlZHMgdG8gY2FsbCA8ZnVuY3Rpb24+c25kX21wdTQwMV91YXJ0X2ludGVycnVwdF90eCgpPC9mdW5jdGlvbj4KKwlieSBpdHNlbGYgdG8gc3RhcnQgcHJvY2Vzc2luZyB0aGUgb3V0cHV0IHN0cmVhbSBpbiBpcnEgaGFuZGxlci4KKwk8L3BhcmE+CisKICAgICAgIDxwYXJhPgogICAgICAgICBVc3VhbGx5LCB0aGUgcG9ydCBhZGRyZXNzIGNvcnJlc3BvbmRzIHRvIHRoZSBjb21tYW5kIHBvcnQgYW5kCiAgICAgICAgIHBvcnQgKyAxIGNvcnJlc3BvbmRzIHRvIHRoZSBkYXRhIHBvcnQuIElmIG5vdCwgeW91IG1heSBjaGFuZ2UKQEAgLTUzMzMsNyArNTM1NCw3IEBACiAgICAgICA8aW5mb3JtYWxleGFtcGxlPgogICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+CiA8IVtDREFUQVsKLSAgc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCByZWFkX3NpemUsIG15X3Byb2NfcmVhZCk7CisgIHNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgbXlfcHJvY19yZWFkKTsKIF1dPgogICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgogICAgICAgPC9pbmZvcm1hbGV4YW1wbGU+CkBAIC01Mzk0LDcgKzU0MTUsNiBAQAogICAgICAgPGluZm9ybWFsZXhhbXBsZT4KICAgICAgICAgPHByb2dyYW1saXN0aW5nPgogPCFbQ0RBVEFbCi0gIGVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDI1NjsKICAgZW50cnktPmMudGV4dC53cml0ZSA9IG15X3Byb2Nfd3JpdGU7CiBdXT4KICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KQEAgLTU0MDIsMjIgKzU0MjIsNiBAQAogICAgIDwvcGFyYT4KIAogICAgIDxwYXJhPgotICAgIFRoZSBidWZmZXIgc2l6ZSBmb3IgcmVhZCBpcyBzZXQgdG8gMTAyNCBpbXBsaWNpdGx5IGJ5Ci0gICAgPGZ1bmN0aW9uPnNuZF9pbmZvX3NldF90ZXh0X29wcygpPC9mdW5jdGlvbj4uICBJdCBzaG91bGQgc3VmZmljZQotICAgIGluIG1vc3QgY2FzZXMgKHRoZSBzaXplIHdpbGwgYmUgYWxpZ25lZCB0bwotICAgIDxjb25zdGFudD5QQUdFX1NJWkU8L2NvbnN0YW50PiBhbnl3YXkpLCBidXQgaWYgeW91IG5lZWQgdG8gaGFuZGxlCi0gICAgdmVyeSBsYXJnZSB0ZXh0IGZpbGVzLCB5b3UgY2FuIHNldCBpdCBleHBsaWNpdGx5LCB0b28uCi0KLSAgICAgIDxpbmZvcm1hbGV4YW1wbGU+Ci0gICAgICAgIDxwcm9ncmFtbGlzdGluZz4KLTwhW0NEQVRBWwotICBlbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDY1NTM2OwotXV0+Ci0gICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gICAgICA8L2luZm9ybWFsZXhhbXBsZT4KLSAgICA8L3BhcmE+Ci0KLSAgICA8cGFyYT4KICAgICAgIEZvciB0aGUgd3JpdGUgY2FsbGJhY2ssIHlvdSBjYW4gdXNlCiAgICAgPGZ1bmN0aW9uPnNuZF9pbmZvX2dldF9saW5lKCk8L2Z1bmN0aW9uPiB0byBnZXQgYSB0ZXh0IGxpbmUsIGFuZAogICAgIDxmdW5jdGlvbj5zbmRfaW5mb19nZXRfc3RyKCk8L2Z1bmN0aW9uPiB0byByZXRyaWV2ZSBhIHN0cmluZyBmcm9tCkBAIC01NTYyLDcgKzU1NjYsNyBAQAogCSAgcG93ZXIgc3RhdHVzLjwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+Q2FsbCA8ZnVuY3Rpb24+c25kX3BjbV9zdXNwZW5kX2FsbCgpPC9mdW5jdGlvbj4gdG8gc3VzcGVuZCB0aGUgcnVubmluZyBQQ00gc3RyZWFtcy48L3BhcmE+PC9saXN0aXRlbT4KIAk8bGlzdGl0ZW0+PHBhcmE+SWYgQUM5NyBjb2RlY3MgYXJlIHVzZWQsIGNhbGwKLQk8ZnVuY3Rpb24+c25kX2FjOTdfcmVzdW1lKCk8L2Z1bmN0aW9uPiBmb3IgZWFjaCBjb2RlYy48L3BhcmE+PC9saXN0aXRlbT4KKwk8ZnVuY3Rpb24+c25kX2FjOTdfc3VzcGVuZCgpPC9mdW5jdGlvbj4gZm9yIGVhY2ggY29kZWMuPC9wYXJhPjwvbGlzdGl0ZW0+CiAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5TYXZlIHRoZSByZWdpc3RlciB2YWx1ZXMgaWYgbmVjZXNzYXJ5LjwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+U3RvcCB0aGUgaGFyZHdhcmUgaWYgbmVjZXNzYXJ5LjwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+RGlzYWJsZSB0aGUgUENJIGRldmljZSBieSBjYWxsaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwYXJjL3NidXNfZHJpdmVycy50eHQgYi9Eb2N1bWVudGF0aW9uL3NwYXJjL3NidXNfZHJpdmVycy50eHQKaW5kZXggODc2MTk1ZC4uNGI5MzUxNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGFyYy9zYnVzX2RyaXZlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3BhcmMvc2J1c19kcml2ZXJzLnR4dApAQCAtMjUsNDIgKzI1LDg0IEBACiB1c2VkIG1lbWJlcnMgb2YgdGhpcyBzdHJ1Y3R1cmUsIGFuZCB0aGVpciB0eXBpY2FsIHVzYWdlLAogd2lsbCBiZSBkZXRhaWxlZCBiZWxvdy4KIAotCUhlcmUgaXMgaG93IHByb2JpbmcgaXMgcGVyZm9ybWVkIGJ5IGFuIFNCVVMgZHJpdmVyCi11bmRlciBMaW51eDoKKwlIZXJlIGlzIGEgcGllY2Ugb2Ygc2tlbGV0b24gY29kZSBmb3IgcGVyb2ZtaW5nIGEgZGV2aWNlCitwcm9iZSBpbiBhbiBTQlVTIGRyaXZlcnVuZGVyIExpbnV4OgogCi0Jc3RhdGljIHZvaWQgaW5pdF9vbmVfbXlkZXZpY2Uoc3RydWN0IHNidXNfZGV2ICpzZGV2KQorCXN0YXRpYyBpbnQgX19kZXZpbml0IG15ZGV2aWNlX3Byb2JlX29uZShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCiAJeworCQlzdHJ1Y3QgbXlzZGV2aWNlICptcCA9IGt6YWxsb2Moc2l6ZW9mKCptcCksIEdGUF9LRVJORUwpOworCisJCWlmICghbXApCisJCQlyZXR1cm4gLUVOT0RFVjsKKworCQkuLi4KKwkJZGV2X3NldF9kcnZkYXRhKCZzZGV2LT5vZmRldi5kZXYsIG1wKTsKKwkJcmV0dXJuIDA7CiAJCS4uLgogCX0KIAotCXN0YXRpYyBpbnQgbXlkZXZpY2VfbWF0Y2goc3RydWN0IHNidXNfZGV2ICpzZGV2KQorCXN0YXRpYyBpbnQgX19kZXZpbml0IG15ZGV2aWNlX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIAl7Ci0JCWlmIChzb21lX2NyaXRlcmlhKHNkZXYpKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAwOworCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOworCisJCXJldHVybiBteWRldmljZV9wcm9iZV9vbmUoc2Rldik7CiAJfQogCi0Jc3RhdGljIHZvaWQgbXlkZXZpY2VfcHJvYmUodm9pZCkKKwlzdGF0aWMgaW50IF9fZGV2ZXhpdCBteWRldmljZV9yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQogCXsKLQkJc3RydWN0IHNidXNfYnVzICpzYnVzOwotCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7CisJCXN0cnVjdCBteWRldmljZSAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKIAotCQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLQkJCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgewotCQkJCWlmIChteWRldmljZV9tYXRjaChzZGV2KSkKLQkJCQkJaW5pdF9vbmVfbXlkZXZpY2Uoc2Rldik7Ci0JCQl9Ci0JCX0KKwkJcmV0dXJuIG15ZGV2aWNlX3JlbW92ZV9vbmUoc2RldiwgbXApOwogCX0KIAotCUFsbCB0aGlzIGRvZXMgaXMgd2FsayB0aHJvdWdoIGFsbCBTQlVTIGRldmljZXMgaW4gdGhlCi1zeXN0ZW0sIGNoZWNrcyBlYWNoIHRvIHNlZSBpZiBpdCBpcyBvZiB0aGUgdHlwZSB3aGljaAoteW91ciBkcml2ZXIgaXMgd3JpdHRlbiBmb3IsIGFuZCBpZiBzbyBpdCBjYWxscyB0aGUgaW5pdAotcm91dGluZSB0byBhdHRhY2ggdGhlIGRldmljZSBhbmQgcHJlcGFyZSB0byBkcml2ZSBpdC4KKwlzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBteWRldmljZV9tYXRjaFtdID0geworCQl7CisJCQkubmFtZSA9ICJteWRldmljZSIsCisJCX0sCisJCXt9LAorCX07CiAKLQkiaW5pdF9vbmVfbXlkZXZpY2UiIG1pZ2h0IGRvIHRoaW5ncyBsaWtlIGFsbG9jYXRlIHNvZnR3YXJlCi1zdGF0ZSBzdHJ1Y3R1cmVzLCBtYXAgaW4gSS9PIHJlZ2lzdGVycywgcGxhY2UgdGhlIGhhcmR3YXJlCi1pbnRvIGFuIGluaXRpYWxpemVkIHN0YXRlLCBldGMuCisJTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXlkZXZpY2VfbWF0Y2gpOworCisJc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXlkZXZpY2VfZHJpdmVyID0geworCQkubmFtZQkJPSAibXlkZXZpY2UiLAorCQkubWF0Y2hfdGFibGUJPSBteWRldmljZV9tYXRjaCwKKwkJLnByb2JlCQk9IG15ZGV2aWNlX3Byb2JlLAorCQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKG15ZGV2aWNlX3JlbW92ZSksCisJfTsKKworCXN0YXRpYyBpbnQgX19pbml0IG15ZGV2aWNlX2luaXQodm9pZCkKKwl7CisJCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJm15ZGV2aWNlX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworCX0KKworCXN0YXRpYyB2b2lkIF9fZXhpdCBteWRldmljZV9leGl0KHZvaWQpCisJeworCQlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbXlkZXZpY2VfZHJpdmVyKTsKKwl9CisKKwltb2R1bGVfaW5pdChteWRldmljZV9pbml0KTsKKwltb2R1bGVfZXhpdChteWRldmljZV9leGl0KTsKKworCVRoZSBteWRldmljZV9tYXRjaCB0YWJsZSBpcyBhIHNlcmllcyBvZiBlbnRyaWVzIHdoaWNoCitkZXNjcmliZXMgd2hhdCBTQlVTIGRldmljZXMgeW91ciBkcml2ZXIgaXMgbWVhbnQgZm9yLiAgSW4gdGhlCitzaW1wbGVzdCBjYXNlIHlvdSBzcGVjaWZ5IGEgc3RyaW5nIGZvciB0aGUgJ25hbWUnIGZpZWxkLiAgRXZlcnkKK1NCVVMgZGV2aWNlIHdpdGggYSAnbmFtZScgcHJvcGVydHkgbWF0Y2hpbmcgeW91ciBzdHJpbmcgd2lsbAorYmUgcGFzc2VkIG9uZS1ieS1vbmUgdG8geW91ciAucHJvYmUgbWV0aG9kLgorCisJWW91IHNob3VsZCBzdG9yZSBhd2F5IHlvdXIgZGV2aWNlIHByaXZhdGUgc3RhdGUgc3RydWN0dXJlCitwb2ludGVyIGluIHRoZSBkcnZkYXRhIGFyZWEgc28gdGhhdCB5b3UgY2FuIHJldHJpZXZlIGl0IGxhdGVyIG9uCitpbiB5b3VyIC5yZW1vdmUgbWV0aG9kLgorCisJQW55IG1lbW9yeSBhbGxvY2F0ZWQsIHJlZ2lzdGVycyBtYXBwZWQsIElSUXMgcmVnaXN0ZXJlZCwKK2V0Yy4gbXVzdCBiZSB1bmRvbmUgYnkgeW91ciAucmVtb3ZlIG1ldGhvZCBzbyB0aGF0IGFsbCByZXNvdXJjZXMKK29mIHlvdXIgZGV2aWNlIGFyZSByZWxhc2VkIGJ5IHRoZSB0aW1lIGl0IHJldHVybnMuCisKKwlZb3Ugc2hvdWxkIF9OT1RfIHVzZSB0aGUgZm9yX2VhY2hfc2J1cygpLCBmb3JfZWFjaF9zYnVzZGV2KCksCithbmQgZm9yX2FsbF9zYnVzZGV2KCkgaW50ZXJmYWNlcy4gIFRoZXkgYXJlIGRlcHJlY2F0ZWQsIHdpbGwgYmUKK3JlbW92ZWQsIGFuZCBubyBuZXcgZHJpdmVyIHNob3VsZCByZWZlcmVuY2UgdGhlbSBldmVyLgogCiAJCU1hcHBpbmcgYW5kIEFjY2Vzc2luZyBJL08gUmVnaXN0ZXJzCiAKQEAgLTI2MywxMCArMzA1LDMgQEAKIAlMYW5jZSBkcml2ZXIgYWJ1c2VzIGNvbnNpc3RlbnQgbWFwcGluZ3MgZm9yIGRhdGEgdHJhbnNmZXIuCiBJdCBpcyBhIG5pZnR5IHRyaWNrIHdoaWNoIHdlIGRvIG5vdCBwYXJ0aWN1bGFybHkgcmVjb21tZW5kLi4uCiBKdXN0IGNoZWNrIGl0IG91dCBhbmQga25vdyB0aGF0IGl0J3MgbGVnYWwuCi0KLQkJCUJhZCBleGFtcGxlcywgZG8gTk9UIHVzZQotCi0JZHJpdmVycy92aWRlby9jZ3NpeC5jCi0JVGhpcyBvbmUgdXNlcyByZXN1bHQgb2Ygc2J1c19pb3JlbWFwIGFzIGlmIGl0IGlzIGFuIGFkZHJlc3MuCi1UaGlzIGRvZXMgTk9UIHdvcmsgb24gc3BhcmM2NCBhbmQgdGhlcmVmb3JlIGlzIGJyb2tlbi4gV2Ugd2lsbAotY29udmVydCBpdCBhdCBhIGxhdGVyIGRhdGUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQgYi9Eb2N1bWVudGF0aW9uL3NwYXJzZS50eHQKaW5kZXggM2YxYzU0Ni4uNWEzMTFjMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zcGFyc2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc3BhcnNlLnR4dApAQCAtMSw1ICsxLDYgQEAKIENvcHlyaWdodCAyMDA0IExpbnVzIFRvcnZhbGRzCiBDb3B5cmlnaHQgMjAwNCBQYXZlbCBNYWNoZWsgPHBhdmVsQHN1c2UuY3o+CitDb3B5cmlnaHQgMjAwNiBCb2IgQ29wZWxhbmQgPG1lQGJvYmNvcGVsYW5kLmNvbT4KIAogVXNpbmcgc3BhcnNlIGZvciB0eXBlY2hlY2tpbmcKIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CkBAIC00MSwxNSArNDIsOCBAQAogdnMgY3B1LWVuZGlhbiB2cyB3aGF0ZXZlciksIGFuZCB0aGVyZSB0aGUgY29uc3RhbnQgIjAiIHJlYWxseSBfaXNfCiBzcGVjaWFsLgogCi1Vc2UKLQotCW1ha2UgQz1bMTJdIENGPS1XYml0d2lzZQotCi1vciB5b3UgZG9uJ3QgZ2V0IGFueSBjaGVja2luZyBhdCBhbGwuCi0KLQotV2hlcmUgdG8gZ2V0IHNwYXJzZQotfn5+fn5+fn5+fn5+fn5+fn5+fgorR2V0dGluZyBzcGFyc2UKK35+fn5+fn5+fn5+fn5+CiAKIFdpdGggZ2l0LCB5b3UgY2FuIGp1c3QgZ2V0IGl0IGZyb20KIApAQCAtNTcsNyArNTEsNyBAQAogCiBhbmQgRGF2ZUogaGFzIHRhci1iYWxscyBhdAogCi0JaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9naXQtc25hcHNob3RzL3NwYXJzZS8KKyAgICAgICAgaHR0cDovL3d3dy5jb2RlbW9ua2V5Lm9yZy51ay9wcm9qZWN0cy9naXQtc25hcHNob3RzL3NwYXJzZS8KIAogCiBPbmNlIHlvdSBoYXZlIGl0LCBqdXN0IGRvCkBAIC02NSw4ICs1OSwyMCBAQAogICAgICAgICBtYWtlCiAgICAgICAgIG1ha2UgaW5zdGFsbAogCi1hcyB5b3VyIHJlZ3VsYXIgdXNlciwgYW5kIGl0IHdpbGwgaW5zdGFsbCBzcGFyc2UgaW4geW91ciB+L2JpbiBkaXJlY3RvcnkuCi1BZnRlciB0aGF0LCBkb2luZyBhIGtlcm5lbCBtYWtlIHdpdGggIm1ha2UgQz0xIiB3aWxsIHJ1biBzcGFyc2Ugb24gYWxsIHRoZQotQyBmaWxlcyB0aGF0IGdldCByZWNvbXBpbGVkLCBvciB3aXRoICJtYWtlIEM9MiIgd2lsbCBydW4gc3BhcnNlIG9uIHRoZQotZmlsZXMgd2hldGhlciB0aGV5IG5lZWQgdG8gYmUgcmVjb21waWxlZCBvciBub3QgKGllIHRoZSBsYXR0ZXIgaXMgZmFzdCB3YXkKLXRvIGNoZWNrIHRoZSB3aG9sZSB0cmVlIGlmIHlvdSBoYXZlIGFscmVhZHkgYnVpbHQgaXQpLgorYXMgYSByZWd1bGFyIHVzZXIsIGFuZCBpdCB3aWxsIGluc3RhbGwgc3BhcnNlIGluIHlvdXIgfi9iaW4gZGlyZWN0b3J5LgorCitVc2luZyBzcGFyc2UKK35+fn5+fn5+fn5+fgorCitEbyBhIGtlcm5lbCBtYWtlIHdpdGggIm1ha2UgQz0xIiB0byBydW4gc3BhcnNlIG9uIGFsbCB0aGUgQyBmaWxlcyB0aGF0IGdldAorcmVjb21waWxlZCwgb3IgdXNlICJtYWtlIEM9MiIgdG8gcnVuIHNwYXJzZSBvbiB0aGUgZmlsZXMgd2hldGhlciB0aGV5IG5lZWQgdG8KK2JlIHJlY29tcGlsZWQgb3Igbm90LiAgVGhlIGxhdHRlciBpcyBhIGZhc3Qgd2F5IHRvIGNoZWNrIHRoZSB3aG9sZSB0cmVlIGlmIHlvdQoraGF2ZSBhbHJlYWR5IGJ1aWx0IGl0LgorCitUaGUgb3B0aW9uYWwgbWFrZSB2YXJpYWJsZSBDRiBjYW4gYmUgdXNlZCB0byBwYXNzIGFyZ3VtZW50cyB0byBzcGFyc2UuICBUaGUKK2J1aWxkIHN5c3RlbSBwYXNzZXMgLVdiaXR3aXNlIHRvIHNwYXJzZSBhdXRvbWF0aWNhbGx5LiAgVG8gcGVyZm9ybSBlbmRpYW5uZXNzCitjaGVja3MsIHlvdSBtYXkgZGVmaW5lIF9fQ0hFQ0tfRU5ESUFOX186CisKKyAgICAgICAgbWFrZSBDPTIgQ0Y9Ii1EX19DSEVDS19FTkRJQU5fXyIKKworVGhlc2UgY2hlY2tzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0IGFzIHRoZXkgZ2VuZXJhdGUgYSBob3N0IG9mIHdhcm5pbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0IGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CmluZGV4IGE0NmMxMGYuLjJkYzI0NmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKQEAgLTI5LDYgKzI5LDcgQEAKIC0gZHJvcC1jYWNoZXMKIC0gem9uZV9yZWNsYWltX21vZGUKIC0gem9uZV9yZWNsYWltX2ludGVydmFsCistIHBhbmljX29uX29vbQogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0xNzgsMyArMTc5LDE1IEBACiBSZWR1Y2UgdGhlIGludGVydmFsIGlmIHVuZGVzaXJlZCBvZmYgbm9kZSBhbGxvY2F0aW9ucyBvY2N1ci4gSG93ZXZlciwgdG9vCiBmcmVxdWVudCBzY2FucyB3aWxsIGhhdmUgYSBuZWdhdGl2ZSBpbXBhY3Qgb25vZmYgbm9kZSBhbGxvY2F0aW9uIHBlcmZvcm1hbmNlLgogCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3BhbmljX29uX29vbQorCitUaGlzIGVuYWJsZXMgb3IgZGlzYWJsZXMgcGFuaWMgb24gb3V0LW9mLW1lbW9yeSBmZWF0dXJlLiAgSWYgdGhpcyBpcyBzZXQgdG8gMSwKK3RoZSBrZXJuZWwgcGFuaWNzIHdoZW4gb3V0LW9mLW1lbW9yeSBoYXBwZW5zLiAgSWYgdGhpcyBpcyBzZXQgdG8gMCwgdGhlIGtlcm5lbAord2lsbCBraWxsIHNvbWUgcm9ndWUgcHJvY2VzcywgY2FsbGVkIG9vbV9raWxsZXIuICBVc3VhbGx5LCBvb21fa2lsbGVyIGNhbiBraWxsCityb2d1ZSBwcm9jZXNzZXMgYW5kIHN5c3RlbSB3aWxsIHN1cnZpdmUuICBJZiB5b3Ugd2FudCB0byBwYW5pYyB0aGUgc3lzdGVtCityYXRoZXIgdGhhbiBraWxsaW5nIHJvZ3VlIHByb2Nlc3Nlcywgc2V0IHRoaXMgdG8gMS4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zeXNycS50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAppbmRleCBhZDBiZWRmLi5lMDE4OGEyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3N5c3JxLnR4dApAQCAtMTE1LDggKzExNSw5IEBACiB3aGVuIHlvdSB3b3VsZCB0cnkgdG8gbG9naW4uIEl0IHdpbGwga2lsbCBhbGwgcHJvZ3JhbXMgb24gZ2l2ZW4gY29uc29sZQogYW5kIHRodXMgbGV0dGluZyB5b3UgbWFrZSBzdXJlIHRoYXQgdGhlIGxvZ2luIHByb21wdCB5b3Ugc2VlIGlzIGFjdHVhbGx5CiB0aGUgb25lIGZyb20gaW5pdCwgbm90IHNvbWUgdHJvamFuIHByb2dyYW0uCi1JTVBPUlRBTlQ6SW4gaXRzIHRydWUgZm9ybSBpdCBpcyBub3QgYSB0cnVlIFNBSyBsaWtlIHRoZSBvbmUgaW4gICA6SU1QT1JUQU5UCi1JTVBPUlRBTlQ6YzIgY29tcGxpYW50IHN5c3RlbXMsIGFuZCBpdCBzaG91bGQgYmUgbWlzdG9vayBhcyBzdWNoLiA6SU1QT1JUQU5UCitJTVBPUlRBTlQ6IEluIGl0cyB0cnVlIGZvcm0gaXQgaXMgbm90IGEgdHJ1ZSBTQUsgbGlrZSB0aGUgb25lIGluIGEgOklNUE9SVEFOVAorSU1QT1JUQU5UOiBjMiBjb21wbGlhbnQgc3lzdGVtLCBhbmQgaXQgc2hvdWxkIG5vdCBiZSBtaXN0YWtlbiBhcyAgIDpJTVBPUlRBTlQKK0lNUE9SVEFOVDogc3VjaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6SU1QT1JUQU5UCiAgICAgICAgSXQgc2VlbXMgb3RoZXIgZmluZCBpdCB1c2VmdWwgYXMgKFN5c3RlbSBBdHRlbnRpb24gS2V5KSB3aGljaCBpcwogdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gZXhpdCBhIHByb2dyYW0gdGhhdCB3aWxsIG5vdCBsZXQgeW91IHN3aXRjaCBjb25zb2xlcy4KIChGb3IgZXhhbXBsZSwgWCBvciBhIHN2Z2FsaWIgcHJvZ3JhbS4pCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmJ0dHYKaW5kZXggYjcyNzA2Yy4uNGVmYTQ2NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5idHR2CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuYnR0dgpAQCAtODcsNyArODcsNyBAQAogIDg2IC0+IE9zcHJleSAxMDEvMTUxIHcvIHN2aWQKICA4NyAtPiBPc3ByZXkgMjAwLzIwMS8yNTAvMjUxCiAgODggLT4gT3NwcmV5IDIwMC8yNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswMDcwOmZmMDFdCi0gODkgLT4gT3NwcmV5IDIxMC8yMjAKKyA4OSAtPiBPc3ByZXkgMjEwLzIyMC8yMzAKICA5MCAtPiBPc3ByZXkgNTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ZmYwMl0KICA5MSAtPiBPc3ByZXkgNTQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ZmYwNF0KICA5MiAtPiBPc3ByZXkgMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ZmYwM10KQEAgLTExMSw3ICsxMTEsNyBAQAogMTEwIC0+IElWQy0xMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmYwMDphMTMyXQogMTExIC0+IElWQy0xMjBHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmYwMDphMTgyLGZmMDE6YTE4MixmZjAyOmExODIsZmYwMzphMTgyLGZmMDQ6YTE4MixmZjA1OmExODIsZmYwNjphMTgyLGZmMDc6YTE4MixmZjA4OmExODIsZmYwOTphMTgyLGZmMGE6YTE4MixmZjBiOmExODIsZmYwYzphMTgyLGZmMGQ6YTE4MixmZjBlOmExODIsZmYwZjphMTgyXQogMTEyIC0+IHBjSERUViBIRC0yMDAwIFRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNzA2MzoyMDAwXQotMTEzIC0+IFR3aW5oYW4gRFNUICsgY2xvbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTFiZDowMDI2LDE4MjI6MDAwMSwyNzBmOmZjMDBdCisxMTMgLT4gVHdpbmhhbiBEU1QgKyBjbG9uZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMWJkOjAwMjYsMTgyMjowMDAxLDI3MGY6ZmMwMCwxODIyOjAwMjZdCiAxMTQgLT4gV2luZmFzdCBWQzEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDdkOjY2MDddCiAxMTUgLT4gVGVwcHJvIFRFVi01NjAvSW50ZXJWaXNpb24gSVYtNTYwCiAxMTYgLT4gU0lNVVMgR1ZDMTEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthYTZhOjgyYjJdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKaW5kZXggM2IzOWE5MS4uNmNiNjNkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OApAQCAtMTUsNyArMTUsNyBAQAogIDE0IC0+IEtXb3JsZC9WU3RyZWFtIFhQZXJ0IERWQi1UICAgICAgICAgICAgICAgICAgICAgICAgICBbMTdkZTowOGE2XQogIDE1IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkYjAwXQogIDE2IC0+IEtXb3JsZCBMVFY4ODNSRgotIDE3IC0+IERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkODEwXQorIDE3IC0+IERWaUNPIEZ1c2lvbkhEVFYgMyBHb2xkLVEgICAgICAgICAgICAgICAgICAgICAgICAgICBbMThhYzpkODEwLDE4YWM6ZDgwMF0KICAxOCAtPiBIYXVwcGF1Z2UgTm92YS1UIERWQi1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6OTAwMiwwMDcwOjkwMDFdCiAgMTkgLT4gQ29uZXhhbnQgRFZCLVQgcmVmZXJlbmNlIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgIFsxNGYxOjAxODddCiAgMjAgLT4gUHJvdmlkZW8gUFYyNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNTQwOjI1ODBdCkBAIC00MCw4ICs0MCwxMyBAQAogIDM5IC0+IEtXb3JsZCBEVkItUyAxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTdkZTowOGIyXQogIDQwIC0+IEhhdXBwYXVnZSBXaW5UVi1IVlIxMTAwIERWQi1UL0h5YnJpZCAgICAgICAgICAgICAgICBbMDA3MDo5NDAwLDAwNzA6OTQwMl0KICA0MSAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTEwMCBEVkItVC9IeWJyaWQgKExvdyBQcm9maWxlKSAgWzAwNzA6OTgwMCwwMDcwOjk4MDJdCi0gNDIgLT4gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UIFBybyAgICAgICAgICAgICAgICAgICAgIFsxODIyOjAwMjVdCisgNDIgLT4gZGlnaXRhbG5vdyBETlRWIExpdmUhIERWQi1UIFBybyAgICAgICAgICAgICAgICAgICAgIFsxODIyOjAwMjUsMTgyMjowMDE5XQogIDQzIC0+IEtXb3JsZC9WU3RyZWFtIFhQZXJ0IERWQi1UIHdpdGggY3gyMjcwMiAgICAgICAgICAgICBbMTdkZTowOGExXQogIDQ0IC0+IERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgRHVhbCBEaWdpdGFsICAgICAgICAgICAgICAgICBbMThhYzpkYjUwLDE4YWM6ZGI1NF0KICA0NSAtPiBLV29ybGQgSGFyZHdhcmVNcGVnVFYgWFBlcnQgICAgICAgICAgICAgICAgICAgICAgICAgWzE3ZGU6MDg0MF0KICA0NiAtPiBEVmlDTyBGdXNpb25IRFRWIERWQi1UIEh5YnJpZCAgICAgICAgICAgICAgICAgICAgICAgWzE4YWM6ZGI0MCwxOGFjOmRiNDRdCisgNDcgLT4gcGNIRFRWIEhENTUwMCBIRFRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs3MDYzOjU1MDBdCisgNDggLT4gS3dvcmxkIE1DRSAyMDAgRGVsdXhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxN2RlOjA4NDFdCisgNDkgLT4gUGl4ZWxWaWV3IFBsYXlUViBQNzAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNTU0OjQ4MTNdCisgNTAgLT4gTlBHIFRlY2ggUmVhbCBUViBGTSBUb3AgMTAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxNGYxOjA4NDJdCisgNTEgLT4gV2luRmFzdCBEVFYyMDAwIEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMDdkOjY2NWVdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKaW5kZXggYmNhNTA5MC4uOTA2OGI2NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNApAQCAtOTMsMyArOTMsNCBAQAogIDkyIC0+IEFWZXJNZWRpYSBBMTY5IEIxICAgICAgICAgICAgICAgICAgICAgICAgWzE0NjE6NjM2MF0KICA5MyAtPiBNZWRpb24gNzEzNCBCcmlkZ2UgIzIgICAgICAgICAgICAgICAgICAgIFsxNmJlOjAwMDVdCiAgOTQgLT4gTGlmZVZpZXcgRmx5RFZCLVQgSHlicmlkIENhcmRidXMgICAgICAgICBbNTE2ODozMzA2LDUxNjg6MzUwMl0KKyA5NSAtPiBMaWZlVmlldyBGbHlWSURFTzMwMDAgKE5UU0MpICAgICAgICAgICAgIFs1MTY5OjAxMzhdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgppbmRleCAxYmNkYWM2Li40NDEzNGYwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKQEAgLTYyLDcgKzYyLDcgQEAKIHR1bmVyPTYxIC0gVGVuYSBUTkY5NTMzLUQvSUYvVE5GOTUzMy1CL0RGCiB0dW5lcj02MiAtIFBoaWxpcHMgVEVBNTc2N0hOIEZNIFJhZGlvCiB0dW5lcj02MyAtIFBoaWxpcHMgRk1EMTIxNk1FIE1LMyBIeWJyaWQgVHVuZXIKLXR1bmVyPTY0IC0gTEcgVERWUy1IMDYyRi9UVUE2MDM0Cit0dW5lcj02NCAtIExHIFREVlMtSDA2eEYKIHR1bmVyPTY1IC0gWW1lYyBUVkY2NlQ1LUIvREZGCiB0dW5lcj02NiAtIExHIFRBTE4gc2VyaWVzCiB0dW5lcj02NyAtIFBoaWxpcHMgVEQxMzE2IEh5YnJpZCBUdW5lcgpAQCAtNzEsMyArNzEsNCBAQAogdHVuZXI9NzAgLSBTYW1zdW5nIFRDUE4gMjEyMVAzMEEKIHR1bmVyPTcxIC0gWGNlaXZlIHhjMzAyOAogdHVuZXI9NzIgLSBUaG9tc29uIEZFNjYwMAordHVuZXI9NzMgLSBTYW1zdW5nIFRDUEcgNjEyMVAzMEEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ1FjYW0udHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQKaW5kZXggNDY0ZTRjZS4uYWRlODY1MSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DUWNhbS50eHQKQEAgLTE4NSwyMDcgKzE4NSwxMCBAQAogCiA5LjAgLS0tIEEgc2FtcGxlIHByb2dyYW0gdXNpbmcgdjRsZ3JhYmJlciwKIAotVGhpcyBwcm9ncmFtIGlzIGEgc2ltcGxlIGltYWdlIGdyYWJiZXIgdGhhdCB3aWxsIGNvcHkgYSBmcmFtZSBmcm9tIHRoZQordjRsZ3JhYiBpcyBhIHNpbXBsZSBpbWFnZSBncmFiYmVyIHRoYXQgd2lsbCBjb3B5IGEgZnJhbWUgZnJvbSB0aGUKIGZpcnN0IHZpZGVvIGRldmljZSwgL2Rldi92aWRlbzAgdG8gc3RhbmRhcmQgb3V0cHV0IGluIHBvcnRhYmxlIHBpeG1hcAotZm9ybWF0ICgucHBtKSAgVXNpbmcgdGhpcyBsaWtlOiAndjRsZ3JhYiB8IGNvbnZlcnQgLSBjLXFjYW0uanBnJwotcHJvZHVjZWQgdGhpcyBwaWN0dXJlIG9mIG1lIGF0Ci0gICAgaHR0cDovL211Zy5zeXMudmlyZ2luaWEuZWR1L35kcmY1bi9leHRyYXMvYy1xY2FtLmpwZwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tIDg8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qIFNpbXBsZSBWaWRlbzRMaW51eCBpbWFnZSBncmFiYmVyLiAqLwotLyoKLSAqCVZpZGVvNExpbnV4IERyaXZlciBUZXN0L0V4YW1wbGUgRnJhbWVncmFiYmluZyBQcm9ncmFtCi0gKgotICoJQ29tcGlsZSB3aXRoOgotICoJCWdjYyAtcyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIHY0bGdyYWIuYyAtbyB2NGxncmFiCi0gKiAgICAgIFVzZSBhczoKLSAqICAgICAgICAgICAgICB2NGxncmFiID5pbWFnZS5wcG0KLSAqCi0gKglDb3B5cmlnaHQgKEMpIDE5OTgtMDUtMDMsIFBoaWwgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Ci0gKiAgICAgIENvcGllZCBmcm9tIGh0dHA6Ly93d3cudGF6ZW5kYS5kZW1vbi5jby51ay9waGlsL3ZncmFiYmVyLmMKLSAqICAgICAgd2l0aCBtaW5vciBtb2RpZmljYXRpb25zIChEYXZlIEZvcnJlc3QsIGRyZjVuQHZpcmdpbmlhLmVkdSkuCi0gKgotICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLQotI2RlZmluZSBGSUxFICIvZGV2L3ZpZGVvMCIKLQotLyogU3RvbGUgdGhpcyBmcm9tIHR2c2V0LmMgKi8KLQotI2RlZmluZSBSRUFEX1ZJREVPX1BJWEVMKGJ1ZiwgZm9ybWF0LCBkZXB0aCwgciwgZywgYikgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXN3aXRjaCAoZm9ybWF0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJY2FzZSBWSURFT19QQUxFVFRFX0dSRVk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlzd2l0Y2ggKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJY2FzZSA0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQljYXNlIDY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCWNhc2UgODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCShyKSA9IChnKSA9IChiKSA9ICgqYnVmKysgPDwgOCk7XAotCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCVwKLQkJCQljYXNlIDE2OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkocikgPSAoZykgPSAoYikgPSAgICAgICAgICAgICAgIFwKLQkJCQkJCSooKHVuc2lnbmVkIHNob3J0ICopIGJ1Zik7ICAgICAgXAotCQkJCQlidWYgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCXVuc2lnbmVkIHNob3J0IHRtcCA9ICoodW5zaWduZWQgc2hvcnQgKilidWY7ICAgIFwKLQkJCShyKSA9IHRtcCYweEY4MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShnKSA9ICh0bXA8PDUpJjB4RkMwMDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShiKSA9ICh0bXA8PDExKSYweEY4MDA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJ1ZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCQkJCQkJXAotCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCNTU1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShyKSA9IChidWZbMF0mMHhGOCk8PDg7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCShnKSA9ICgoYnVmWzBdIDw8IDUgfCBidWZbMV0gPj4gMykmMHhGOCk8PDg7ICAgIFwKLQkJCShiKSA9ICgoYnVmWzFdIDw8IDIgKSAmIDB4RjgpPDw4OyAgICAgICAgICAgICAgIFwKLQkJCWJ1ZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQkJCQkJCVwKLQkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkocikgPSBidWZbMF0gPDwgODsgKGcpID0gYnVmWzFdIDw8IDg7ICAgICAgICAgICBcCi0JCQkoYikgPSBidWZbMl0gPDwgODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlidWYgKz0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJCQkJCQlcCi0JCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJZnByaW50ZihzdGRlcnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCSJGb3JtYXQgJWQgbm90IHlldCBzdXBwb3J0ZWRcbiIsICAgICAgICBcCi0JCQkJZm9ybWF0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1pbnQgZ2V0X2JyaWdodG5lc3NfYWRqKHVuc2lnbmVkIGNoYXIgKmltYWdlLCBsb25nIHNpemUsIGludCAqYnJpZ2h0bmVzcykgewotICBsb25nIGksIHRvdCA9IDA7Ci0gIGZvciAoaT0wO2k8c2l6ZSozO2krKykKLSAgICB0b3QgKz0gaW1hZ2VbaV07Ci0gICpicmlnaHRuZXNzID0gKDEyOCAtIHRvdC8oc2l6ZSozKSkvMzsKLSAgcmV0dXJuICEoKHRvdC8oc2l6ZSozKSkgPj0gMTI2ICYmICh0b3QvKHNpemUqMykpIDw9IDEzMCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqIGFyZ3YpCi17Ci0gIGludCBmZCA9IG9wZW4oRklMRSwgT19SRE9OTFkpLCBmOwotICBzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSBjYXA7Ci0gIHN0cnVjdCB2aWRlb193aW5kb3cgd2luOwotICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSB2cGljOwotCi0gIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgKnNyYzsKLSAgaW50IGJwcCA9IDI0LCByLCBnLCBiOwotICB1bnNpZ25lZCBpbnQgaSwgc3JjX2RlcHRoOwotCi0gIGlmIChmZCA8IDApIHsKLSAgICBwZXJyb3IoRklMRSk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGlmIChpb2N0bChmZCwgVklESU9DR0NBUCwgJmNhcCkgPCAwKSB7Ci0gICAgcGVycm9yKCJWSURJT0dDQVAiKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIigiIEZJTEUgIiBub3QgYSB2aWRlbzRsaW51eCBkZXZpY2U/KVxuIik7Ci0gICAgY2xvc2UoZmQpOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBpZiAoaW9jdGwoZmQsIFZJRElPQ0dXSU4sICZ3aW4pIDwgMCkgewotICAgIHBlcnJvcigiVklESU9DR1dJTiIpOwotICAgIGNsb3NlKGZkKTsKLSAgICBleGl0KDEpOwotICB9Ci0KLSAgaWYgKGlvY3RsKGZkLCBWSURJT0NHUElDVCwgJnZwaWMpIDwgMCkgewotICAgIHBlcnJvcigiVklESU9DR1BJQ1QiKTsKLSAgICBjbG9zZShmZCk7Ci0gICAgZXhpdCgxKTsKLSAgfQotCi0gIGlmIChjYXAudHlwZSAmIFZJRF9UWVBFX01PTk9DSFJPTUUpIHsKLSAgICB2cGljLmRlcHRoPTg7Ci0gICAgdnBpYy5wYWxldHRlPVZJREVPX1BBTEVUVEVfR1JFWTsgICAgLyogOGJpdCBncmV5ICovCi0gICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYykgPCAwKSB7Ci0gICAgICB2cGljLmRlcHRoPTY7Ci0gICAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKLQl2cGljLmRlcHRoPTQ7Ci0JaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYykgPCAwKSB7Ci0JICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBmaW5kIGEgc3VwcG9ydGVkIGNhcHR1cmUgZm9ybWF0LlxuIik7Ci0JICBjbG9zZShmZCk7Ci0JICBleGl0KDEpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdnBpYy5kZXB0aD0yNDsKLSAgICB2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0IyNDsKLQotICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpIDwgMCkgewotICAgICAgdnBpYy5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCNTY1OwotICAgICAgdnBpYy5kZXB0aD0xNjsKLQotICAgICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYyk9PS0xKSB7Ci0JdnBpYy5wYWxldHRlPVZJREVPX1BBTEVUVEVfUkdCNTU1OwotCXZwaWMuZGVwdGg9MTU7Ci0KLQlpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKT09LTEpIHsKLQkgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZpbmQgYSBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXQuXG4iKTsKLQkgIHJldHVybiAtMTsKLQl9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgYnVmZmVyID0gbWFsbG9jKHdpbi53aWR0aCAqIHdpbi5oZWlnaHQgKiBicHApOwotICBpZiAoIWJ1ZmZlcikgewotICAgIGZwcmludGYoc3RkZXJyLCAiT3V0IG9mIG1lbW9yeS5cbiIpOwotICAgIGV4aXQoMSk7Ci0gIH0KLQotICBkbyB7Ci0gICAgaW50IG5ld2JyaWdodDsKLSAgICByZWFkKGZkLCBidWZmZXIsIHdpbi53aWR0aCAqIHdpbi5oZWlnaHQgKiBicHApOwotICAgIGYgPSBnZXRfYnJpZ2h0bmVzc19hZGooYnVmZmVyLCB3aW4ud2lkdGggKiB3aW4uaGVpZ2h0LCAmbmV3YnJpZ2h0KTsKLSAgICBpZiAoZikgewotICAgICAgdnBpYy5icmlnaHRuZXNzICs9IChuZXdicmlnaHQgPDwgOCk7Ci0gICAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKT09LTEpIHsKLQlwZXJyb3IoIlZJRElPU1BJQ1QiKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0gd2hpbGUgKGYpOwotCi0gIGZwcmludGYoc3Rkb3V0LCAiUDZcbiVkICVkIDI1NVxuIiwgd2luLndpZHRoLCB3aW4uaGVpZ2h0KTsKLQotICBzcmMgPSBidWZmZXI7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHdpbi53aWR0aCAqIHdpbi5oZWlnaHQ7IGkrKykgewotICAgIFJFQURfVklERU9fUElYRUwoc3JjLCB2cGljLnBhbGV0dGUsIHNyY19kZXB0aCwgciwgZywgYik7Ci0gICAgZnB1dGMocj4+OCwgc3Rkb3V0KTsKLSAgICBmcHV0YyhnPj44LCBzdGRvdXQpOwotICAgIGZwdXRjKGI+PjgsIHN0ZG91dCk7Ci0gIH0KLQotICBjbG9zZShmZCk7Ci0gIHJldHVybiAwOwotfQotLS0tLS0tLS0tLS0tLS0tLS0tLS0gODwgLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZm9ybWF0ICgucHBtKSAgVG8gcHJvZHVjZSAuanBnIG91dHB1dCwgeW91IGNhbiB1c2UgaXQgbGlrZSB0aGlzOgorJ3Y0bGdyYWIgfCBjb252ZXJ0IC0gYy1xY2FtLmpwZycKIAogCiAxMC4wIC0tLSBPdGhlciBJbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbiBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvWm9yYW4KaW5kZXggYmU5ZjIxYi4uMDQwYTJjOCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9ab3JhbgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L1pvcmFuCkBAIC0zMyw2ICszMywyMSBAQAogTm9ybXM6IFBBTCwgU0VDQU0gKDcyMHg1NzYgQCAyNSBmcHMpLCBOVFNDICg3MjB4NDgwIEAgMjkuOTcgZnBzKQogQ2FyZCBudW1iZXI6IDcKIAorQXZlck1lZGlhIDYgRXllcyBBVlM2RVlFUzoKKyogWm9yYW4genIzNjA2NyBQQ0kgY29udHJvbGxlcgorKiBab3JhbiB6cjM2MDYwIE1KUEVHIGNvZGVjCisqIFNhbXN1bmcga3MwMTI3IFRWIGRlY29kZXIKKyogQ29uZXhhbnQgYnQ4NjYgIFRWIGVuY29kZXIKK0RyaXZlcnMgdG8gdXNlOiB2aWRlb2RldiwgaTJjLWNvcmUsIGkyYy1hbGdvLWJpdCwKKwkJdmlkZW9jb2RlYywga3MwMTI3LCBidDg2NiwgenIzNjA2MCwgenIzNjA2NworSW5wdXRzL291dHB1dHM6IFNpeCBwaHlzaWNhbCBpbnB1dHMuIDEtNiBhcmUgY29tcG9zaXRlLAorCQkxLTIsIDMtNCwgNS02IGRvdWJsZXMgYXMgUy12aWRlbywKKwkJMS0zIHRyaXBsZXMgYXMgY29tcG9uZW50LgorCQlPbmUgY29tcG9zaXRlIG91dHB1dC4KK05vcm1zOiBQQUwsIFNFQ0FNICg3MjB4NTc2IEAgMjUgZnBzKSwgTlRTQyAoNzIweDQ4MCBAIDI5Ljk3IGZwcykKK0NhcmQgbnVtYmVyOiA4CitOb3QgYXV0b2RldGVjdGVkLCBjYXJkPTggaXMgbmVjZXNzYXJ5LgorCiBMaW51eCBNZWRpYSBMYWJzIExNTDMzOgogKiBab3JhbiB6cjM2MDY3IFBDSSBjb250cm9sbGVyCiAqIFpvcmFuIHpyMzYwNjAgTUpQRUcgY29kZWMKQEAgLTE5Miw2ICsyMDcsMTAgQEAKIHdhcyBpbnRyb2R1Y2VkIGluIDE5OTYsIGlzIHVzZWQgaW4gdGhlIERDMzAgYW5kIERDMzArIGFuZAogY2FuIGhhbmRsZTogUEFMIEIvRy9IL0ksIFBBTCBOLCBQQUwgTSwgTlRTQyBNLCBOVFNDIDQ0LCBQQUwgNjAsIFNFQ0FNLE5UU0MgQ29tYgogCitTYW1zdW5nIGtzMDEyNyBUViBkZWNvZGVyCitpcyB1c2VkIGluIHRoZSBBVlM2RVlFUyBjYXJkIGFuZAorY2FuIGhhbmRsZTogTlRTQy1NL04vNDQsIFBBTC1NL04vQi9HL0gvSS9EL0svTCBhbmQgU0VDQU0KKwogPT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIDEuMiBXaGF0IHRoZSBUViBlbmNvZGVyIGNhbiBkbyBhbiB3aGF0IG5vdApAQCAtMjIxLDYgKzI0MCwxMCBAQAogd2FzIGludHJvZHVjZWQgaW4gMTk5MSwgaXMgdXNlZCBpbiB0aGUgREMxMCBvbGQKIGNhbiBnZW5lcmF0ZTogUEFMICwgTlRTQyAsIFNFQ0FNCiAKK0NvbmV4YW50IGJ0ODY2IFRWIGVuY29kZXIKK2lzIHVzZWQgaW4gQVZTNkVZRVMsIGFuZAorY2FuIGdlbmVyYXRlOiBOVFNDL1BBTCwgUEFMrU0sIFBBTK1OCisKIFRoZSBhZHY3MTd4LCBzaG91bGQgYmUgYWJsZSB0byBwcm9kdWNlIFBBTCBOLiBCdXQgeW91IGZpbmQgbm90aGluZyBQQUwgTgogc3BlY2lmaWMgaW4gdGhlIHJlZ2lzdGVycy4gU2VlbSB0aGF0IHlvdSBoYXZlIHRvIHJldXNlIGEgb3RoZXIgc3RhbmRhcmQKIHRvIGdlbmVyYXRlIFBBTCBOLCBtYXliZSBpdCB3b3VsZCB3b3JrIGlmIHlvdSB1c2UgdGhlIFBBTCBNIHNldHRpbmdzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NPTlRSSUJVVE9SUyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvYnR0di9DT05UUklCVVRPUlMKaW5kZXggYWVmNDlkYi4uOGFhZDZkZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9idHR2L0NPTlRSSUJVVE9SUworKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2J0dHYvQ09OVFJJQlVUT1JTCkBAIC0xLDQgKzEsNCBAQAotQ29udHJpYnV0b3JzIHRvIGJ0dHY6IAorQ29udHJpYnV0b3JzIHRvIGJ0dHY6CiAKIE1pY2hhZWwgQ2h1IDxtbWNodUBwb2JveC5jb20+CiAgIEF2ZXJNZWRpYSBmaXggYW5kIG1vcmUgZmxleGlibGUgY2FyZCByZWNvZ25pdGlvbgpAQCAtOCw4ICs4LDggQEAKIAogQ2hyaXMgS2xlaXRzY2gKICAgSGFyZHdhcmUgSTJDCi0gIAotR2VyZCBLbm9yciA8a3JheGVsQGNzLnR1LWJlcmxpbi5kZT4gCisKK0dlcmQgS25vcnIgPGtyYXhlbEBjcy50dS1iZXJsaW4uZGU+CiAgIFJhZGlvIGNhcmQgKElUVCBzb3VuZCBwcm9jZXNzb3IpCiAKIGJpZ2Zvb3QgPGJpZ2Zvb3RAbmV0LXdheS5uZXQ+CkBAIC0xOCw3ICsxOCw3IEBACiAKIAogKyBtYW55IG1vcmUgKHBsZWFzZSBtYWlsIG1lIGlmIHlvdSBhcmUgbWlzc2luZyBpbiB0aGlzIGxpc3QgYW5kIHdvdWxkCi0gICAgICAgICAgICAgbGlrZSB0byBiZSBtZW50aW9uZWQpCisJICAgICBsaWtlIHRvIGJlIG1lbnRpb25lZCkKIAogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1jYWxsaW5nLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1jYWxsaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDIxMTgxCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWNhbGxpbmcudHh0CkBAIC0wLDAgKzEsNjkgQEAKK1RoaXMgcGFnZSBkZXNjcmliZXMgaG93IHRvIG1ha2UgY2FsbHMgdG8gdGhlIGZpcm13YXJlIGFwaS4KKworSG93IHRvIGNhbGwKKz09PT09PT09PT09CisKK1RoZSBwcmVmZXJyZWQgY2FsbGluZyBjb252ZW50aW9uIGlzIGtub3duIGFzIHRoZSBmaXJtd2FyZSBtYWlsYm94LiBUaGUKK21haWxib3hlcyBhcmUgYmFzaWNhbGx5IGEgZml4ZWQgbGVuZ3RoIGFycmF5IHRoYXQgc2VydmVzIGFzIHRoZSBjYWxsLXN0YWNrLgorCitGaXJtd2FyZSBtYWlsYm94ZXMgY2FuIGJlIGxvY2F0ZWQgYnkgc2VhcmNoaW5nIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyIG1lbW9yeQorZm9yIGEgMTYgYnl0ZSBzaWduYXR1cmUuIFRoYXQgc2lnbmF0dXJlIHdpbGwgYmUgbG9jYXRlZCBvbiBhIDI1Ni1ieXRlIGJvdW5kYXJ5LgorCitTaWduYXR1cmU6CisweDc4LCAweDU2LCAweDM0LCAweDEyLCAweDEyLCAweDc4LCAweDU2LCAweDM0LAorMHgzNCwgMHgxMiwgMHg3OCwgMHg1NiwgMHg1NiwgMHgzNCwgMHgxMiwgMHg3OAorCitUaGUgZmlybXdhcmUgaW1wbGVtZW50cyAyMCBtYWlsYm94ZXMgb2YgMjAgMzItYml0IHdvcmRzLiBUaGUgZmlyc3QgMTAgYXJlCityZXNlcnZlZCBmb3IgQVBJIGNhbGxzLiBUaGUgc2Vjb25kIDEwIGFyZSB1c2VkIGJ5IHRoZSBmaXJtd2FyZSBmb3IgZXZlbnQKK25vdGlmaWNhdGlvbi4KKworICBJbmRleCAgTmFtZQorICAtLS0tLSAgLS0tLQorICAwICAgICAgRmxhZ3MKKyAgMSAgICAgIENvbW1hbmQKKyAgMiAgICAgIFJldHVybiB2YWx1ZQorICAzICAgICAgVGltZW91dAorICA0LTE5ICAgUGFyYW1ldGVyL1Jlc3VsdAorCisKK1RoZSBmbGFncyBhcmUgZGVmaW5lZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLiBUaGUgZGlyZWN0aW9uIGlzIGZyb20gdGhlCitwZXJzcGVjdGl2ZSBvZiB0aGUgZmlybXdhcmUuCisKKyAgQml0ICBEaXJlY3Rpb24gIFB1cnBvc2UKKyAgLS0tICAtLS0tLS0tLS0gIC0tLS0tLS0KKyAgMiAgICBPICAgICAgICAgIEZpcm13YXJlIGhhcyBwcm9jZXNzZWQgdGhlIGNvbW1hbmQuCisgIDEgICAgSSAgICAgICAgICBEcml2ZXIgaGFzIGZpbmlzaGVkIHNldHRpbmcgdGhlIHBhcmFtZXRlcnMuCisgIDAgICAgSSAgICAgICAgICBEcml2ZXIgaXMgdXNpbmcgdGhpcyBtYWlsYm94LgorCisKK1RoZSBjb21tYW5kIGlzIGEgMzItYml0IGVudW1lcmF0b3IuIFRoZSBBUEkgc3BlY2lmaWNzIG1heSBiZSBmb3VuZCBpbiB0aGUKK2Z3LSotYXBpLnR4dCBkb2N1bWVudHMuCisKK1RoZSByZXR1cm4gdmFsdWUgaXMgYSAzMi1iaXQgZW51bWVyYXRvci4gT25seSB0d28gdmFsdWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZDoKKzA9c3VjY2VzcyBhbmQgLTE9Y29tbWFuZCB1bmRlZmluZWQuCisKK1RoZXJlIGFyZSAxNiBwYXJhbWV0ZXJzL3Jlc3VsdHMgMzItYml0IGZpZWxkcy4gVGhlIGRyaXZlciBwb3B1bGF0ZXMgdGhlc2UgZmllbGRzCit3aXRoIHZhbHVlcyBmb3IgYWxsIHRoZSBwYXJhbWV0ZXJzIHJlcXVpcmVkIGJ5IHRoZSBjYWxsLiBUaGUgZHJpdmVyIG92ZXJ3cml0ZXMKK3RoZXNlIGZpZWxkcyB3aXRoIHJlc3VsdCB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGwuIFRoZSBBUEkgc3BlY2lmaWNzIG1heSBiZQorZm91bmQgaW4gdGhlIGZ3LSotYXBpLnR4dCBkb2N1bWVudHMuCisKK1RoZSB0aW1lb3V0IHZhbHVlIHByb3RlY3RzIHRoZSBjYXJkIGZyb20gYSBodW5nIGRyaXZlciB0aHJlYWQuIElmIHRoZSBkcml2ZXIKK2RvZXNuJ3QgaGFuZGxlIHRoZSBjb21wbGV0ZWQgY2FsbCB3aXRoaW4gdGhlIHRpbWVvdXQgc3BlY2lmaWVkLCB0aGUgZmlybXdhcmUKK3dpbGwgcmVzZXQgdGhhdCBtYWlsYm94LgorCitUbyBtYWtlIGFuIEFQSSBjYWxsLCB0aGUgZHJpdmVyIGl0ZXJhdGVzIG92ZXIgZWFjaCBtYWlsYm94IGxvb2tpbmcgZm9yIHRoZQorZmlyc3Qgb25lIGF2YWlsYWJsZSAoYml0IDAgaGFzIGJlZW4gY2xlYXJlZCkuIFRoZSBkcml2ZXIgc2V0cyB0aGF0IGJpdCwgZmlsbHMKK2luIHRoZSBjb21tYW5kIGVudW1lcmF0b3IsIHRoZSB0aW1lb3V0IHZhbHVlIGFuZCBhbnkgcmVxdWlyZWQgcGFyYW1ldGVycy4gVGhlCitkcml2ZXIgdGhlbiBzZXRzIHRoZSBwYXJhbWV0ZXIgcmVhZHkgYml0IChiaXQgMSkuIFRoZSBmaXJtd2FyZSBzY2FucyB0aGUKK21haWxib3hlcyBmb3IgcGVuZGluZyBjb21tYW5kcywgcHJvY2Vzc2VzIHRoZW0sIHNldHMgdGhlIHJlc3VsdCBjb2RlLCBwb3B1bGF0ZXMKK3RoZSByZXN1bHQgdmFsdWUgYXJyYXkgd2l0aCB0aGF0IGNhbGwncyByZXR1cm4gdmFsdWVzIGFuZCBzZXRzIHRoZSBjYWxsCitjb21wbGV0ZSBiaXQgKGJpdCAyKS4gT25jZSBiaXQgMiBpcyBzZXQsIHRoZSBkcml2ZXIgc2hvdWxkIHJldHJpZXZlIHRoZSByZXN1bHRzCithbmQgY2xlYXIgYWxsIHRoZSBmbGFncy4gSWYgdGhlIGRyaXZlciBkb2VzIG5vdCBwZXJmb3JtIHRoaXMgdGFzayB3aXRoaW4gdGhlCit0aW1lIHNldCBpbiB0aGUgdGltZW91dCByZWdpc3RlciwgdGhlIGZpcm13YXJlIHdpbGwgcmVzZXQgdGhhdCBtYWlsYm94LgorCitFdmVudCBub3RpZmljYXRpb25zIGFyZSBzZW50IGZyb20gdGhlIGZpcm13YXJlIHRvIHRoZSBob3N0LiBUaGUgaG9zdCB0ZWxscyB0aGUKK2Zpcm13YXJlIHdoaWNoIGV2ZW50cyBpdCBpcyBpbnRlcmVzdGVkIGluIHZpYSBhbiBBUEkgY2FsbC4gVGhhdCBjYWxsIHRlbGxzIHRoZQorZmlybXdhcmUgd2hpY2ggbm90aWZpY2F0aW9uIG1haWxib3ggdG8gdXNlLiBUaGUgZmlybXdhcmUgc2lnbmFscyB0aGUgaG9zdCB2aWEKK2FuIGludGVycnVwdC4gT25seSB0aGUgMTYgUmVzdWx0cyBmaWVsZHMgYXJlIHVzZWQsIHRoZSBGbGFncywgQ29tbWFuZCwgUmV0dXJuCit2YWx1ZSBhbmQgVGltZW91dCB3b3JkcyBhcmUgbm90IHVzZWQuCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1kZWNvZGVyLWFwaS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZGVjb2Rlci1hcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZjRmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZGVjb2Rlci1hcGkudHh0CkBAIC0wLDAgKzEsMzE5IEBACitEZWNvZGVyIGZpcm13YXJlIEFQSSBkZXNjcmlwdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTm90ZTogdGhpcyBBUEkgaXMgcGFydCBvZiB0aGUgZGVjb2RlciBmaXJtd2FyZSwgc28gaXQncyBjeDIzNDE1IG9ubHkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfUElOR19GVworRW51bSAJMC8weDAwCitEZXNjcmlwdGlvbgorCVRoaXMgQVBJIGNhbGwgZG9lcyBub3RoaW5nLiBJdCBtYXkgYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgZmlybXdhcmUKKwlpcyByZXNwb25kaW5nLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NUQVJUX1BMQVlCQUNLCitFbnVtIAkxLzB4MDEKK0Rlc2NyaXB0aW9uCisJQmVnaW4gb3IgcmVzdW1lIHBsYXliYWNrLgorUGFyYW1bMF0KKwkwIGJhc2VkIGZyYW1lIG51bWJlciBpbiBHT1AgdG8gYmVnaW4gcGxheWJhY2sgZnJvbS4KK1BhcmFtWzFdCisJU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbXV0ZWQgYXVkaW8gZnJhbWVzIHRvIHBsYXkgYmVmb3JlIG5vcm1hbAorCWF1ZGlvIHJlc3VtZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU1RPUF9QTEFZQkFDSworRW51bSAJMi8weDAyCitEZXNjcmlwdGlvbgorCUVuZHMgcGxheWJhY2sgYW5kIGNsZWFycyBhbGwgZGVjb2RlciBidWZmZXJzLiBJZiBQVFMgaXMgbm90IHplcm8sCisJcGxheWJhY2sgc3RvcHMgYXQgc3BlY2lmaWVkIFBUUy4KK1BhcmFtWzBdCisJRGlzcGxheSAwPWxhc3QgZnJhbWUsIDE9YmxhY2sKK1BhcmFtWzFdCisJUFRTIGxvdworUGFyYW1bMl0KKwlQVFMgaGlnaAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX1NFVF9QTEFZQkFDS19TUEVFRAorRW51bSAJMy8weDAzCitEZXNjcmlwdGlvbgorCVBsYXliYWNrIHN0cmVhbSBhdCBzcGVlZCBvdGhlciB0aGFuIG5vcm1hbC4gVGhlcmUgYXJlIHR3byBtb2RlcyBvZgorCW9wZXJhdGlvbjoKKwkgICAgU21vb3RoOiBob3N0IHRyYW5zZmVycyBlbnRpcmUgc3RyZWFtIGFuZCBmaXJtd2FyZSBkcm9wcyB1bnVzZWQKKwkJICAgIGZyYW1lcy4KKwkgICAgQ29hcnNlOiBob3N0IGRyb3BzIGZyYW1lcyBiYXNlZCBvbiBpbmRleGluZyBhcyByZXF1aXJlZCB0byBhY2hpZXZlCisJCSAgICBkZXNpcmVkIHNwZWVkLgorUGFyYW1bMF0KKwlCaXRtYXA6CisJICAgIDA6NyAgMCBub3JtYWwKKwkJIDEgZmFzdCBvbmx5ICIxLjUgdGltZXMiCisJCSBuIG5YIGZhc3QsIDEvblggc2xvdworCSAgICAzMCAgIEZyYW1lZHJvcDoKKwkJICAgICAnMCcgZHVyaW5nIDEuNSB0aW1lcyBwbGF5LCBldmVyeSBvdGhlciBCIGZyYW1lIGlzIGRyb3BwZWQKKwkJICAgICAnMScgZHVyaW5nIDEuNSB0aW1lcyBwbGF5LCBzdHJlYW0gaXMgdW5jaGFuZ2VkIChiaXRyYXRlCisJCQkgbXVzdCBub3QgZXhjZWVkIDhtYnBzKQorCSAgICAzMSAgIFNwZWVkOgorCQkgICAgICcwJyBzbG93CisJCSAgICAgJzEnIGZhc3QKK1BhcmFtWzFdCisJRGlyZWN0aW9uOiAwPWZvcndhcmQsIDE9cmV2ZXJzZQorUGFyYW1bMl0KKwlQaWN0dXJlIG1hc2s6CisJICAgIDE9SSBmcmFtZXMKKwkgICAgMz1JLCBQIGZyYW1lcworCSAgICA3PUksIFAsIEIgZnJhbWVzCitQYXJhbVszXQorCUIgZnJhbWVzIHBlciBHT1AgKGZvciByZXZlcnNlIHBsYXkgb25seSkKK1BhcmFtWzRdCisJTXV0ZSBhdWRpbzogMD1kaXNhYmxlLCAxPWVuYWJsZQorUGFyYW1bNV0KKwlEaXNwbGF5IDA9ZnJhbWUsIDE9ZmllbGQKK1BhcmFtWzZdCisJU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbXV0ZWQgYXVkaW8gZnJhbWVzIHRvIHBsYXkgYmVmb3JlIG5vcm1hbCBhdWRpbworCXJlc3VtZXMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU1RFUF9WSURFTworRW51bSAJNS8weDA1CitEZXNjcmlwdGlvbgorCUVhY2ggY2FsbCB0byB0aGlzIEFQSSBzdGVwcyB0aGUgcGxheWJhY2sgdG8gdGhlIG5leHQgdW5pdCBkZWZpbmVkIGJlbG93CisJaW4gdGhlIGN1cnJlbnQgcGxheWJhY2sgZGlyZWN0aW9uLgorUGFyYW1bMF0KKwkwPWZyYW1lLCAxPXRvcCBmaWVsZCwgMj1ib3R0b20gZmllbGQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfRE1BX0JMT0NLX1NJWkUKK0VudW0gCTgvMHgwOAorRGVzY3JpcHRpb24KKwlTZXQgRE1BIHRyYW5zZmVyIGJsb2NrIHNpemUuIENvdW50ZXJwYXJ0IHRvIEFQSSAweEM5CitQYXJhbVswXQorCURNQSB0cmFuc2ZlciBibG9jayBzaXplIGluIGJ5dGVzLiBBIGRpZmZlcmVudCBzaXplIG1heSBiZSBzcGVjaWZpZWQKKwl3aGVuIGlzc3VpbmcgdGhlIERNQSB0cmFuc2ZlciBjb21tYW5kLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX0dFVF9YRkVSX0lORk8KK0VudW0gCTkvMHgwOQorRGVzY3JpcHRpb24KKwlUaGlzIEFQSSBjYWxsIG1heSBiZSB1c2VkIHRvIGRldGVjdCBhbiBlbmQgb2Ygc3RyZWFtIGNvbmR0aW9uLgorUmVzdWx0WzBdCisJU3RyZWFtIHR5cGUKK1Jlc3VsdFsxXQorCUFkZHJlc3Mgb2Zmc2V0CitSZXN1bHRbMl0KKwlNYXhpbXVtIGJ5dGVzIHRvIHRyYW5zZmVyCitSZXN1bHRbM10KKwlCdWZmZXIgZnVsbG5lc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19HRVRfRE1BX1NUQVRVUworRW51bSAJMTAvMHgwQQorRGVzY3JpcHRpb24KKwlTdGF0dXMgb2YgdGhlIGxhc3QgRE1BIHRyYW5zZmVyCitSZXN1bHRbMF0KKwlCaXQgMSBzZXQgbWVhbnMgdHJhbnNmZXIgY29tcGxldGUKKwlCaXQgMiBzZXQgbWVhbnMgRE1BIGVycm9yCisJQml0IDMgc2V0IG1lYW5zIGxpbmtlZCBsaXN0IGVycm9yCitSZXN1bHRbMV0KKwlETUEgdHlwZTogMD1NUEVHLCAxPU9TRCwgMj1ZVVYKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TQ0hFRF9ETUFfRlJPTV9IT1NUCitFbnVtIAkxMS8weDBCCitEZXNjcmlwdGlvbgorCVNldHVwIERNQSBmcm9tIGhvc3Qgb3BlcmF0aW9uLiBDb3VudGVycGFydCB0byBBUEkgMHhDQworUGFyYW1bMF0KKwlNZW1vcnkgYWRkcmVzcyBvZiBsaW5rIGxpc3QKK1BhcmFtWzFdCisJVG90YWwgIyBvZiBieXRlcyB0byB0cmFuc2ZlcgorUGFyYW1bMl0KKwlETUEgdHlwZSAoMD1NUEVHLCAxPU9TRCwgMj1ZVVYpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfUEFVU0VfUExBWUJBQ0sKK0VudW0gCTEzLzB4MEQKK0Rlc2NyaXB0aW9uCisJRnJlZXplIHBsYXliYWNrIGltbWVkaWF0ZWx5LiBJbiB0aGlzIG1vZGUsIHdoZW4gaW50ZXJuYWwgYnVmZmVycyBhcmUKKwlmdWxsLCBubyBtb3JlIGRhdGEgd2lsbCBiZSBhY2NlcHRlZCBhbmQgZGF0YSByZXF1ZXN0IElSUXMgd2lsbCBiZQorCW1hc2tlZC4KK1BhcmFtWzBdCisJRGlzcGxheTogMD1sYXN0IGZyYW1lLCAxPWJsYWNrCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfSEFMVF9GVworRW51bSAJMTQvMHgwRQorRGVzY3JpcHRpb24KKwlUaGUgZmlybXdhcmUgaXMgaGFsdGVkIGFuZCBubyBmdXJ0aGVyIEFQSSBjYWxscyBhcmUgc2VydmljZWQgdW50aWwKKwl0aGUgZmlybXdhcmUgaXMgdXBsb2FkZWQgYWdhaW4uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU0VUX1NUQU5EQVJECitFbnVtIAkxNi8weDEwCitEZXNjcmlwdGlvbgorCVNlbGVjdHMgZGlzcGxheSBzdGFuZGFyZAorUGFyYW1bMF0KKwkwPU5UU0MsIDE9UEFMCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfR0VUX1ZFUlNJT04KK0VudW0gCTE3LzB4MTEKK0Rlc2NyaXB0aW9uCisJUmV0dXJucyBkZWNvZGVyIGZpcm13YXJlIHZlcnNpb24gaW5mb3JtYXRpb24KK1Jlc3VsdFswXQorCVZlcnNpb24gYml0bWFzazoKKwkgICAgQml0cyAgMDoxNSBidWlsZAorCSAgICBCaXRzIDE2OjIzIG1pbm9yCisJICAgIEJpdHMgMjQ6MzEgbWFqb3IKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfU1RSRUFNX0lOUFVUCitFbnVtIAkyMC8weDE0CitEZXNjcmlwdGlvbgorCVNlbGVjdCBkZWNvZGVyIHN0cmVhbSBpbnB1dCBwb3J0CitQYXJhbVswXQorCTA9bWVtb3J5IChkZWZhdWx0KSwgMT1zdHJlYW1pbmcKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19HRVRfVElNSU5HX0lORk8KK0VudW0gCTIxLzB4MTUKK0Rlc2NyaXB0aW9uCisJUmV0dXJucyB0aW1pbmcgaW5mb3JtYXRpb24gZnJvbSBzdGFydCBvZiBwbGF5YmFjaworUmVzdWx0WzBdCisJRnJhbWUgY291bnQgYnkgZGVjb2RlIG9yZGVyCitSZXN1bHRbMV0KKwlWaWRlbyBQVFMgYml0cyAwOjMxIGJ5IGRpc3BsYXkgb3JkZXIKK1Jlc3VsdFsyXQorCVZpZGVvIFBUUyBiaXQgMzIgYnkgZGlzcGxheSBvcmRlcgorUmVzdWx0WzNdCisJU0NSIGJpdHMgMDozMSBieSBkaXNwbGF5IG9yZGVyCitSZXN1bHRbNF0KKwlTQ1IgYml0IDMyIGJ5IGRpc3BsYXkgb3JkZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfQVVESU9fTU9ERQorRW51bSAJMjIvMHgxNgorRGVzY3JpcHRpb24KKwlTZWxlY3QgYXVkaW8gbW9kZQorUGFyYW1bMF0KKwlEdWFsIG1vbm8gbW9kZSBhY3Rpb24KK1BhcmFtWzFdCisJU3RlcmVvIG1vZGUgYWN0aW9uOgorCSAgICAwPVN0ZXJlbywgMT1MZWZ0LCAyPVJpZ2h0LCAzPU1vbm8sIDQ9U3dhcCwgLTE9VW5jaGFuZ2VkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU0VUX0VWRU5UX05PVElGSUNBVElPTgorRW51bSAJMjMvMHgxNworRGVzY3JpcHRpb24KKwlTZXR1cCBmaXJtd2FyZSB0byBub3RpZnkgdGhlIGhvc3QgYWJvdXQgYSBwYXJ0aWN1bGFyIGV2ZW50LgorCUNvdW50ZXJwYXJ0IHRvIEFQSSAweEQ1CitQYXJhbVswXQorCUV2ZW50OiAwPUF1ZGlvIG1vZGUgY2hhbmdlIGJldHdlZW4gc3RlcmVvIGFuZCBkdWFsIGNoYW5uZWwKK1BhcmFtWzFdCisJTm90aWZpY2F0aW9uIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorUGFyYW1bMl0KKwlJbnRlcnJ1cHQgYml0CitQYXJhbVszXQorCU1haWxib3ggc2xvdCwgLTEgaWYgbm8gbWFpbGJveCByZXF1aXJlZC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfRElTUExBWV9CVUZGRVJTCitFbnVtIAkyNC8weDE4CitEZXNjcmlwdGlvbgorCU51bWJlciBvZiBkaXNwbGF5IGJ1ZmZlcnMuIFRvIGRlY29kZSBhbGwgZnJhbWVzIGluIHJldmVyc2UgcGxheWJhY2sgeW91CisJbXVzdCB1c2UgbmluZSBidWZmZXJzLgorUGFyYW1bMF0KKwkwPXNpeCBidWZmZXJzLCAxPW5pbmUgYnVmZmVycworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfREVDX0VYVFJBQ1RfVkJJCitFbnVtIAkyNS8weDE5CitEZXNjcmlwdGlvbgorCUV4dHJhY3RzIFZCSSBkYXRhCitQYXJhbVswXQorCTA9ZXh0cmFjdCBmcm9tIGV4dGVuc2lvbiAmIHVzZXIgZGF0YSwgMT1leHRyYWN0IGZyb20gcHJpdmF0ZSBwYWNrZXRzCitSZXN1bHRbMF0KKwlWQkkgdGFibGUgbG9jYXRpb24KK1Jlc3VsdFsxXQorCVZCSSB0YWJsZSBzaXplCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9ERUNfU0VUX0RFQ09ERVJfU09VUkNFCitFbnVtIAkyNi8weDFBCitEZXNjcmlwdGlvbgorCVNlbGVjdHMgZGVjb2RlciBzb3VyY2UuIEVuc3VyZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGlzCisJQVBJIG1hdGNoIHRoZSBlbmNvZGVyIHNldHRpbmdzLgorUGFyYW1bMF0KKwlNb2RlOiAwPU1QRUcgZnJvbSBob3N0LCAxPVlVViBmcm9tIGVuY29kZXIsIDI9WVVWIGZyb20gaG9zdAorUGFyYW1bMV0KKwlZVVYgcGljdHVyZSB3aWR0aAorUGFyYW1bMl0KKwlZVVYgcGljdHVyZSBoZWlnaHQKK1BhcmFtWzNdCisJQml0bWFwOiBzZWUgUGFyYW1bMF0gb2YgQVBJIDB4QkQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfQVVESU9fT1VUUFVUCitFbnVtIAkyNy8weDFCCitEZXNjcmlwdGlvbgorCVNlbGVjdCBhdWRpbyBvdXRwdXQgZm9ybWF0CitQYXJhbVswXQorCUJpdG1hc2s6CisJICAgICAwOjEgIERhdGEgc2l6ZToKKwkJICAgICAgJzAwJyAxNiBiaXQKKwkJICAgICAgJzAxJyAyMCBiaXQKKwkJICAgICAgJzEwJyAyNCBiaXQKKwkgICAgIDI6NyAgVW51c2VkCisJICAgICA4OjkgIE1vZGU6CisJCSAgICAgICcwMCcgMiBjaGFubmVscworCQkgICAgICAnMDEnIDQgY2hhbm5lbHMKKwkJICAgICAgJzEwJyA2IGNoYW5uZWxzCisJCSAgICAgICcxMScgNiBjaGFubmVscyB3aXRoIG9uZSBsaW5lIGRhdGEgbW9kZQorCQkJICAgKGZvciBsZWZ0IGp1c3RpZmllZCBNU0IgZmlyc3QgbW9kZSwgMjAgYml0IG9ubHkpCisJICAgIDEwOjExIFVudXNlZAorCSAgICAxMjoxMyBDaGFubmVsIGZvcm1hdDoKKwkJICAgICAgJzAwJyByaWdodCBqdXN0aWZpZWQgTVNCIGZpcnN0IG1vZGUKKwkJICAgICAgJzAxJyBsZWZ0IGp1c3RpZmllZCBNU0IgZmlyc3QgbW9kZQorCQkgICAgICAnMTAnIEkyUyBtb2RlCisJICAgIDE0OjE1IFVudXNlZAorCSAgICAxNjoyMSBSaWdodCBqdXN0aWZ5IGJpdCBjb3VudAorCSAgICAyMjozMSBVbnVzZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfQVZfREVMQVkKK0VudW0gCTI4LzB4MUMKK0Rlc2NyaXB0aW9uCisJU2V0IGF1ZGlvL3ZpZGVvIGRlbGF5IGluIDkwS2h6IHRpY2tzCitQYXJhbVswXQorCTA9QS9WIGluIHN5bmMsIG5lZ2F0aXZlPWF1ZGlvIGxhZ3MsIHBvc2l0aXZlPXZpZGVvIGxhZ3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0RFQ19TRVRfUFJFQlVGRkVSSU5HCitFbnVtIAkzMC8weDFFCitEZXNjcmlwdGlvbgorCURlY29kZXIgcHJlYnVmZmVyaW5nLCB3aGVuIGVuYWJsZWQgdXAgdG8gMTI4S0IgYXJlIGJ1ZmZlcmVkIGZvcgorCXN0cmVhbXMgPDhtcGJzIG9yIDY0MEtCIGZvciBzdHJlYW1zID44bWJwcworUGFyYW1bMF0KKwkwPW9mZiwgMT1vbgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWRtYS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZG1hLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTIzZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWRtYS50eHQKQEAgLTAsMCArMSw5NCBAQAorVGhpcyBwYWdlIGRlc2NyaWJlcyB0aGUgc3RydWN0dXJlcyBhbmQgcHJvY2VkdXJlcyB1c2VkIGJ5IHRoZSBjeDIzNDF4IERNQQorZW5naW5lLgorCitJbnRyb2R1Y3Rpb24KKz09PT09PT09PT09PQorCitUaGUgY3gyMzQxeCBQQ0kgaW50ZXJmYWNlIGlzIGJ1c21hc3RlciBjYXBhYmxlLiBUaGlzIG1lYW5zIGl0IGhhcyBhIERNQQorZW5naW5lIHRvIGVmZmljaWVudGx5IHRyYW5zZmVyIGxhcmdlIHZvbHVtZXMgb2YgZGF0YSBiZXR3ZWVuIHRoZSBjYXJkIGFuZCBtYWluCittZW1vcnkgd2l0aG91dCByZXF1aXJpbmcgaGVscCBmcm9tIGEgQ1BVLiBMaWtlIG1vc3QgaGFyZHdhcmUsIGl0IG11c3Qgb3BlcmF0ZQorb24gY29udGlndW91cyBwaHlzaWNhbCBtZW1vcnkuIFRoaXMgaXMgZGlmZmljdWx0IHRvIGNvbWUgYnkgaW4gbGFyZ2UgcXVhbnRpdGllcworb24gdmlydHVhbCBtZW1vcnkgbWFjaGluZXMuCisKK1RoZXJlZm9yZSwgaXQgYWxzbyBzdXBwb3J0cyBhIHRlY2huaXF1ZSBjYWxsZWQgInNjYXR0ZXItZ2F0aGVyIi4gVGhlIGNhcmQgY2FuCit0cmFuc2ZlciBtdWx0aXBsZSBidWZmZXJzIGluIG9uZSBvcGVyYXRpb24uIEluc3RlYWQgb2YgYWxsb2NhdGluZyBvbmUgbGFyZ2UKK2NvbnRpZ3VvdXMgYnVmZmVyLCB0aGUgZHJpdmVyIGNhbiBhbGxvY2F0ZSBzZXZlcmFsIHNtYWxsZXIgYnVmZmVycy4KKworSW4gcHJhY3RpY2UsIEkndmUgc2VlbiB0aGUgYXZlcmFnZSB0cmFuc2ZlciB0byBiZSByb3VnaGx5IDgwSywgYnV0IHRyYW5zZmVycworYWJvdmUgMTI4SyB3ZXJlIG5vdCB1bmNvbW1vbiwgcGFydGljdWxhcmx5IGF0IHN0YXJ0dXAuIFRoZSAxMjhLIGZpZ3VyZSBpcworaW1wb3J0YW50LCBiZWNhdXNlIHRoYXQgaXMgdGhlIGxhcmdlc3QgYmxvY2sgdGhhdCB0aGUga2VybmVsIGNhbiBub3JtYWxseQorYWxsb2NhdGUuIEV2ZW4gc3RpbGwsIDEyOEsgYmxvY2tzIGFyZSBoYXJkIHRvIGNvbWUgYnksIHNvIHRoZSBkcml2ZXIgd3JpdGVyIGlzCit1cmdlZCB0byBjaG9vc2UgYSBzbWFsbGVyIGJsb2NrIHNpemUgYW5kIGxlYXJuIHRoZSBzY2F0dGVyLWdhdGhlciB0ZWNobmlxdWUuCisKK01haWxib3ggIzEwIGlzIHJlc2VydmVkIGZvciBETUEgdHJhbnNmZXIgaW5mb3JtYXRpb24uCisKK0Zsb3cKKz09PT0KKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcywgaW4gZ2VuZXJhbCwgdGhlIG9yZGVyIG9mIGV2ZW50cyB3aGVuIGhhbmRsaW5nIERNQQordHJhbnNmZXJzLiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb2xsb3dzIHRoaXMgc2VjdGlvbi4KKworLSBUaGUgY2FyZCByYWlzZXMgdGhlIEVuY29kZXIgaW50ZXJydXB0LgorLSBUaGUgZHJpdmVyIHJlYWRzIHRoZSB0cmFuc2ZlciB0eXBlLCBvZmZzZXQgYW5kIHNpemUgZnJvbSBNYWlsYm94ICMxMC4KKy0gVGhlIGRyaXZlciBjb25zdHJ1Y3RzIHRoZSBzY2F0dGVyLWdhdGhlciBhcnJheSBmcm9tIGVub3VnaCBmcmVlIGRtYSBidWZmZXJzCisgIHRvIGNvdmVyIHRoZSBzaXplLgorLSBUaGUgZHJpdmVyIHNjaGVkdWxlcyB0aGUgRE1BIHRyYW5zZmVyIHZpYSB0aGUgU2NoZWR1bGVETUF0b0hvc3QgQVBJIGNhbGwuCistIFRoZSBjYXJkIHJhaXNlcyB0aGUgRE1BIENvbXBsZXRlIGludGVycnVwdC4KKy0gVGhlIGRyaXZlciBjaGVja3MgdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXIgZm9yIGFueSBlcnJvcnMuCistIFRoZSBkcml2ZXIgcG9zdC1wcm9jZXNzZXMgdGhlIG5ld2x5IHRyYW5zZmVycmVkIGJ1ZmZlcnMuCisKK05PVEUhIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIEVuY29kZXIgYW5kIERNQSBDb21wbGV0ZSBpbnRlcnJ1cHRzIGdldCByYWlzZWQKK3NpbXVsdGFuZW91c2x5LiAoRW5kIG9mIHRoZSBsYXN0LCBzdGFydCBvZiB0aGUgbmV4dCwgZXRjLikKKworTWFpbGJveCAjMTAKKz09PT09PT09PT09CisKK1RoZSBGbGFncywgQ29tbWFuZCwgUmV0dXJuIFZhbHVlIGFuZCBUaW1lb3V0IGZpZWxkcyBhcmUgaWdub3JlZC4KKworTmFtZTogICAgICAgTWFpbGJveCAjMTAKK1Jlc3VsdHNbMF06IFR5cGU6IDA6IE1QRUcuCitSZXN1bHRzWzFdOiBPZmZzZXQ6IFRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgY2FyZCdzIG1lbW9yeSBzcGFjZS4KK1Jlc3VsdHNbMl06IFNpemU6IFRoZSBleGFjdCBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIuCisKK015IHNwZWN1bGF0aW9uIGlzIHRoYXQgc2luY2UgdGhlIFN0YXJ0Q2FwdHVyZSBBUEkgaGFzIGEgY2FwdHVyZSB0eXBlIG9mICJSQVciCithdmFpbGFibGUsIHRoYXQgdGhlIHR5cGUgZmllbGQgd2lsbCBoYXZlIG90aGVyIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gWVVWCithbmQgUENNIGRhdGEuCisKK1NjYXR0ZXItR2F0aGVyIEFycmF5Cis9PT09PT09PT09PT09PT09PT09PQorCitUaGUgc2NhdHRlci1nYXRoZXIgYXJyYXkgaXMgYSBjb250aWd1b3VzbHkgYWxsb2NhdGVkIGJsb2NrIG9mIG1lbW9yeSB0aGF0Cit0ZWxscyB0aGUgY2FyZCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBvZiBlYWNoIGRhdGEtYmxvY2sgdG8gdHJhbnNmZXIuCitDYXJkICJhZGRyZXNzZXMiIGFyZSBkZXJpdmVkIGZyb20gdGhlIG9mZnNldCBzdXBwbGllZCBieSBNYWlsYm94ICMxMC4gSG9zdAorYWRkcmVzc2VzIGFyZSB0aGUgcGh5c2ljYWwgbWVtb3J5IGxvY2F0aW9uIG9mIHRoZSB0YXJnZXQgRE1BIGJ1ZmZlci4KKworRWFjaCBTLUcgYXJyYXkgZWxlbWVudCBpcyBhIHN0cnVjdCBvZiB0aHJlZSAzMi1iaXQgd29yZHMuIFRoZSBmaXJzdCB3b3JkIGlzCit0aGUgc291cmNlIGFkZHJlc3MsIHRoZSBzZWNvbmQgaXMgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MuIEJvdGggdGFrZSB1cCB0aGUKK2VudGlyZSAzMiBiaXRzLiBUaGUgbG93ZXN0IDE2IGJpdHMgb2YgdGhlIHRoaXJkIHdvcmQgaXMgdGhlIHRyYW5zZmVyIGJ5dGUKK2NvdW50LiBUaGUgaGlnaC1iaXQgb2YgdGhlIHRoaXJkIHdvcmQgaXMgdGhlICJsYXN0IiBmbGFnLiBUaGUgbGFzdC1mbGFnIHRlbGxzCit0aGUgY2FyZCB0byByYWlzZSB0aGUgRE1BX0RPTkUgaW50ZXJydXB0LiBGcm9tIGhhcmQgcGVyc29uYWwgZXhwZXJpZW5jZSwgaWYKK3lvdSBmb3JnZXQgdG8gc2V0IHRoaXMgYml0LCB0aGUgY2FyZCB3aWxsIHN0aWxsICJ3b3JrIiBidXQgdGhlIHN0cmVhbSB3aWxsCittb3N0IGxpa2VseSBnZXQgY29ycnVwdGVkLgorCitUaGUgdHJhbnNmZXIgY291bnQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDI1Ni4gVGhlcmVmb3JlLCB0aGUgZHJpdmVyIHdpbGwgbmVlZAordG8gdHJhY2sgaG93IG11Y2ggZGF0YSBpbiB0aGUgdGFyZ2V0IGJ1ZmZlciBpcyB2YWxpZCBhbmQgZGVhbCB3aXRoIGl0CithY2NvcmRpbmdseS4KKworQXJyYXkgRWxlbWVudDoKKworLSAzMi1iaXQgU291cmNlIEFkZHJlc3MKKy0gMzItYml0IERlc3RpbmF0aW9uIEFkZHJlc3MKKy0gMTYtYml0IHJlc2VydmVkIChoaWdoIGJpdCBpcyB0aGUgbGFzdCBmbGFnKQorLSAxNi1iaXQgYnl0ZSBjb3VudAorCitETUEgVHJhbnNmZXIgU3RhdHVzCis9PT09PT09PT09PT09PT09PT09CisKK1JlZ2lzdGVyIDB4MDAwNCBob2xkcyB0aGUgRE1BIFRyYW5zZmVyIFN0YXR1czoKKworQml0Cis0ICAgU2NhdHRlci1HYXRoZXIgYXJyYXkgZXJyb3IKKzMgICBETUEgd3JpdGUgZXJyb3IKKzIgICBETUEgcmVhZCBlcnJvcgorMSAgIHdyaXRlIGNvbXBsZXRlZAorMCAgIHJlYWQgY29tcGxldGVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctZW5jb2Rlci1hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWVuY29kZXItYXBpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LWVuY29kZXItYXBpLnR4dApAQCAtMCwwICsxLDY5NCBAQAorRW5jb2RlciBmaXJtd2FyZSBBUEkgZGVzY3JpcHRpb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfUElOR19GVworRW51bSAJMTI4LzB4ODAKK0Rlc2NyaXB0aW9uCisJRG9lcyBub3RoaW5nLiBDYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgZmlybXdhcmUgaXMgcmVzcG9uZGluZy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TVEFSVF9DQVBUVVJFCitFbnVtIAkxMjkvMHg4MQorRGVzY3JpcHRpb24KKwlDb21tZW5jZXMgdGhlIGNhcHR1cmUgb2YgdmlkZW8sIGF1ZGlvIGFuZC9vciBWQkkgZGF0YS4gQWxsIGVuY29kaW5nCisJcGFyYW1ldGVycyBtdXN0IGJlIGluaXRpYWxpemVkIHByaW9yIHRvIHRoaXMgQVBJIGNhbGwuIENhcHR1cmVzIGZyYW1lcworCWNvbnRpbnVvdXNseSBvciB1bnRpbCBhIHByZWRlZmluZWQgbnVtYmVyIG9mIGZyYW1lcyBoYXZlIGJlZW4gY2FwdHVyZWQuCitQYXJhbVswXQorCUNhcHR1cmUgc3RyZWFtIHR5cGU6CisJICAgIDA9TVBFRworCSAgICAxPVJhdworCSAgICAyPVJhdyBwYXNzdGhyb3VnaAorCSAgICAzPVZCSQorCitQYXJhbVsxXQorCUJpdG1hc2s6CisJICAgIEJpdCAwIHdoZW4gc2V0LCBjYXB0dXJlcyBZVVYKKwkgICAgQml0IDEgd2hlbiBzZXQsIGNhcHR1cmVzIFBDTSBhdWRpbworCSAgICBCaXQgMiB3aGVuIHNldCwgY2FwdHVyZXMgVkJJIChzYW1lIGFzIHBhcmFtWzBdPTMpCisJICAgIEJpdCAzIHdoZW4gc2V0LCB0aGUgY2FwdHVyZSBkZXN0aW5hdGlvbiBpcyB0aGUgZGVjb2RlcgorCQkoc2FtZSBhcyBwYXJhbVswXT0yKQorCSAgICBCaXQgNCB3aGVuIHNldCwgdGhlIGNhcHR1cmUgZGVzdGluYXRpb24gaXMgdGhlIGhvc3QKKwlOb3RlOiB0aGlzIHBhcmFtZXRlciBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFJBVyBjYXB0dXJlIHR5cGUuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFCitFbnVtIAkxMzAvMHg4MgorRGVzY3JpcHRpb24KKwlFbmRzIGEgY2FwdHVyZSBpbiBwcm9ncmVzcworUGFyYW1bMF0KKwkwPXN0b3AgYXQgZW5kIG9mIEdPUCAoZ2VuZXJhdGVzIElSUSkKKwkxPXN0b3AgaW1tZWRpYXRlIChubyBJUlEpCitQYXJhbVsxXQorCVN0cmVhbSB0eXBlIHRvIHN0b3AsIHNlZSBwYXJhbVswXSBvZiBBUEkgMHg4MQorUGFyYW1bMl0KKwlTdWJ0eXBlLCBzZWUgcGFyYW1bMV0gb2YgQVBJIDB4ODEKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfQVVESU9fSUQKK0VudW0gCTEzNy8weDg5CitEZXNjcmlwdGlvbgorCUFzc2lnbnMgdGhlIHRyYW5zcG9ydCBzdHJlYW0gSUQgb2YgdGhlIGVuY29kZWQgYXVkaW8gc3RyZWFtCitQYXJhbVswXQorCUF1ZGlvIFN0cmVhbSBJRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9WSURFT19JRAorRW51bSAJMTM5LzB4OEIKK0Rlc2NyaXB0aW9uCisJU2V0IHZpZGVvIHRyYW5zcG9ydCBzdHJlYW0gSUQKK1BhcmFtWzBdCisJVmlkZW8gc3RyZWFtIElECisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1BDUl9JRAorRW51bSAJMTQxLzB4OEQKK0Rlc2NyaXB0aW9uCisJQXNzaWducyB0aGUgdHJhbnNwb3J0IHN0cmVhbSBJRCBmb3IgUENSIHBhY2tldHMKK1BhcmFtWzBdCisJUENSIFN0cmVhbSBJRAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9GUkFNRV9SQVRFCitFbnVtIAkxNDMvMHg4RgorRGVzY3JpcHRpb24KKwlTZXQgdmlkZW8gZnJhbWVzIHBlciBzZWNvbmQuIENoYW5nZSBvY2N1cnMgYXQgc3RhcnQgb2YgbmV3IEdPUC4KK1BhcmFtWzBdCisJMD0zMGZwcworCTE9MjVmcHMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfRlJBTUVfU0laRQorRW51bSAJMTQ1LzB4OTEKK0Rlc2NyaXB0aW9uCisJU2VsZWN0IHZpZGVvIHN0cmVhbSBlbmNvZGluZyByZXNvbHV0aW9uLgorUGFyYW1bMF0KKwlIZWlnaHQgaW4gbGluZXMuIERlZmF1bHQgNDgwCitQYXJhbVsxXQorCVdpZHRoIGluIHBpeGVscy4gRGVmYXVsdCA3MjAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfQklUX1JBVEUKK0VudW0gCTE0OS8weDk1CitEZXNjcmlwdGlvbgorCUFzc2lnbiBhdmVyYWdlIHZpZGVvIHN0cmVhbSBiaXRyYXRlLiBOb3RlIG9uIHRoZSBsYXN0IHRocmVlIHBhcmFtczoKKwlQYXJhbVszXSBhbmQgWzRdIHNlZW0gdG8gYmUgYWx3YXlzIDAsIHBhcmFtIFs1XSBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZC4KK1BhcmFtWzBdCisJMD12YXJpYWJsZSBiaXRyYXRlLCAxPWNvbnN0YW50IGJpdHJhdGUKK1BhcmFtWzFdCisJYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQKK1BhcmFtWzJdCisJcGVhayBiaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCwgZGl2aWRlZCBieSA0MDAKK1BhcmFtWzNdCisJTXV4IGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLCBkaXZpZGVkIGJ5IDQwMC4gTWF5IGJlIDAgKGRlZmF1bHQpLgorUGFyYW1bNF0KKwlSYXRlIENvbnRyb2wgVkJSIFBhZGRpbmcKK1BhcmFtWzVdCisJVkJWIEJ1ZmZlciB1c2VkIGJ5IGVuY29kZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfR09QX1BST1BFUlRJRVMKK0VudW0gCTE1MS8weDk3CitEZXNjcmlwdGlvbgorCVNldHVwIHRoZSBHT1Agc3RydWN0dXJlCitQYXJhbVswXQorCUdPUCBzaXplIChtYXhpbXVtIGlzIDM0KQorUGFyYW1bMV0KKwlOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiB0aGUgSSBhbmQgUCBmcmFtZSwgcGx1cyAxLgorCUZvciBleGFtcGxlOiBJQkJQQkJQQkJQQkIgLS0+IEdPUCBzaXplOiAxMiwgbnVtYmVyIG9mIEIgZnJhbWVzOiAyKzEgPSAzCisJTm90ZSB0aGF0IEdPUCBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAoQi1mcmFtZXMgKyAxKS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfQVNQRUNUX1JBVElPCitFbnVtIAkxNTMvMHg5OQorRGVzY3JpcHRpb24KKwlTZXRzIHRoZSBlbmNvZGluZyBhc3BlY3QgcmF0aW8uIENoYW5nZXMgaW4gdGhlIGFzcGVjdCByYXRpbyB0YWtlIGVmZmVjdAorCWF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBHT1AuCitQYXJhbVswXQorCScwMDAwJyBmb3JiaWRkZW4KKwknMDAwMScgMToxIHNxdWFyZQorCScwMDEwJyA0OjMKKwknMDAxMScgMTY6OQorCScwMTAwJyAyLjIxOjEKKwknMDEwMScgcmVzZXJ2ZWQKKwkgLi4uLgorCScxMTExJyByZXNlcnZlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9ETlJfRklMVEVSX01PREUKK0VudW0gCTE1NS8weDlCCitEZXNjcmlwdGlvbgorCUFzc2lnbiBEeW5hbWljIE5vaXNlIFJlZHVjdGlvbiBvcGVyYXRpbmcgbW9kZQorUGFyYW1bMF0KKwlCaXQwOiBTcGF0aWFsIGZpbHRlciwgc2V0PWF1dG8sIGNsZWFyPW1hbnVhbAorCUJpdDE6IFRlbXBvcmFsIGZpbHRlciwgc2V0PWF1dG8sIGNsZWFyPW1hbnVhbAorUGFyYW1bMV0KKwlNZWRpYW4gZmlsdGVyOgorCSAgICAwPURpc2FibGVkCisJICAgIDE9SG9yaXpvbnRhbAorCSAgICAyPVZlcnRpY2FsCisJICAgIDM9SG9yaXovVmVydAorCSAgICA0PURpYWdvbmFsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfUFJPUFMKK0VudW0gCTE1Ny8weDlECitEZXNjcmlwdGlvbgorCVRoZXNlIER5bmFtaWMgTm9pc2UgUmVkdWN0aW9uIGZpbHRlciB2YWx1ZXMgYXJlIG9ubHkgbWVhbmluZ2Z1bCB3aGVuCisJdGhlIHJlc3BlY3RpdmUgZmlsdGVyIGlzIHNldCB0byAibWFudWFsIiAoU2VlIEFQSSAweDlCKQorUGFyYW1bMF0KKwlTcGF0aWFsIGZpbHRlcjogZGVmYXVsdCAwLCByYW5nZSAwOjE1CitQYXJhbVsxXQorCVRlbXBvcmFsIGZpbHRlcjogZGVmYXVsdCAwLCByYW5nZSAwOjMxCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0NPUklOR19MRVZFTFMKK0VudW0gCTE1OS8weDlGCitEZXNjcmlwdGlvbgorCUFzc2lnbiBEeW5hbWljIE5vaXNlIFJlZHVjdGlvbiBtZWRpYW4gZmlsdGVyIHByb3BlcnRpZXMuCitQYXJhbVswXQorCVRocmVzaG9sZCBhYm92ZSB3aGljaCB0aGUgbHVtaW5hbmNlIG1lZGlhbiBmaWx0ZXIgaXMgZW5hYmxlZC4KKwlEZWZhdWx0OiAwLCByYW5nZSAwOjI1NQorUGFyYW1bMV0KKwlUaHJlc2hvbGQgYmVsb3cgd2hpY2ggdGhlIGx1bWluYW5jZSBtZWRpYW4gZmlsdGVyIGlzIGVuYWJsZWQuCisJRGVmYXVsdDogMjU1LCByYW5nZSAwOjI1NQorUGFyYW1bMl0KKwlUaHJlc2hvbGQgYWJvdmUgd2hpY2ggdGhlIGNocm9taW5hbmNlIG1lZGlhbiBmaWx0ZXIgaXMgZW5hYmxlZC4KKwlEZWZhdWx0OiAwLCByYW5nZSAwOjI1NQorUGFyYW1bM10KKwlUaHJlc2hvbGQgYmVsb3cgd2hpY2ggdGhlIGNocm9taW5hbmNlIG1lZGlhbiBmaWx0ZXIgaXMgZW5hYmxlZC4KKwlEZWZhdWx0OiAyNTUsIHJhbmdlIDA6MjU1CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1NQQVRJQUxfRklMVEVSX1RZUEUKK0VudW0gCTE2MS8weEExCitEZXNjcmlwdGlvbgorCUFzc2lnbiBzcGF0aWFsIHByZWZpbHRlciBwYXJhbWV0ZXJzCitQYXJhbVswXQorCUx1bWluYW5jZSBmaWx0ZXIKKwkgICAgMD1PZmYKKwkgICAgMT0xRCBIb3Jpem9udGFsCisJICAgIDI9MUQgVmVydGljYWwKKwkgICAgMz0yRCBIL1YgU2VwYXJhYmxlIChkZWZhdWx0KQorCSAgICA0PTJEIFN5bW1ldHJpYyBub24tc2VwYXJhYmxlCitQYXJhbVsxXQorCUNocm9taW5hbmNlIGZpbHRlcgorCSAgICAwPU9mZgorCSAgICAxPTFEIEhvcml6b250YWwgKGRlZmF1bHQpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUXzNfMl9QVUxMRE9XTgorRW51bSAJMTc3LzB4QjEKK0Rlc2NyaXB0aW9uCisJMzoyIHB1bGxkb3duIHByb3BlcnRpZXMKK1BhcmFtWzBdCisJMD1lbmFibGVkCisJMT1kaXNhYmxlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9WQklfTElORQorRW51bSAJMTgzLzB4QjcKK0Rlc2NyaXB0aW9uCisJU2VsZWN0cyBWQkkgbGluZSBudW1iZXIuCitQYXJhbVswXQorCUJpdHMgMDo0IAlsaW5lIG51bWJlcgorCUJpdCAgMzEJCTA9dG9wX2ZpZWxkLCAxPWJvdHRvbV9maWVsZAorCUJpdHMgMDozMSAJYWxsIHNldCBzcGVjaWZpZXMgImFsbCBsaW5lcyIKK1BhcmFtWzFdCisJVkJJIGxpbmUgaW5mb3JtYXRpb24gZmVhdHVyZXM6IDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZAorUGFyYW1bMl0KKwlTbGljaW5nOiAwPU5vbmUsIDE9Q2xvc2VkIENhcHRpb24KKwlBbG1vc3QgY2VydGFpbmx5IG5vdCBpbXBsZW1lbnRlZC4gU2V0IHRvIDAuCitQYXJhbVszXQorCUx1bWluYW5jZSBzYW1wbGVzIGluIHRoaXMgbGluZS4KKwlBbG1vc3QgY2VydGFpbmx5IG5vdCBpbXBsZW1lbnRlZC4gU2V0IHRvIDAuCitQYXJhbVs0XQorCUNocm9taW5hbmNlIHNhbXBsZXMgaW4gdGhpcyBsaW5lCisJQWxtb3N0IGNlcnRhaW5seSBub3QgaW1wbGVtZW50ZWQuIFNldCB0byAwLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9TVFJFQU1fVFlQRQorRW51bSAJMTg1LzB4QjkKK0Rlc2NyaXB0aW9uCisJQXNzaWduIHN0cmVhbSB0eXBlCisJTm90ZTogVHJhbnNwb3J0IHN0cmVhbSBpcyBub3Qgd29ya2luZyBpbiByZWNlbnQgZmlybXdhcmVzLgorCUFuZCBpbiBvbGRlciBmaXJtd2FyZXMgdGhlIHRpbWVzdGFtcHMgaW4gdGhlIFRTIHNlZW0gdG8gYmUKKwl1bnJlbGlhYmxlLgorUGFyYW1bMF0KKwkgMD1Qcm9ncmFtIHN0cmVhbQorCSAxPVRyYW5zcG9ydCBzdHJlYW0KKwkgMj1NUEVHMSBzdHJlYW0KKwkgMz1QRVMgQS9WIHN0cmVhbQorCSA1PVBFUyBWaWRlbyBzdHJlYW0KKwkgNz1QRVMgQXVkaW8gc3RyZWFtCisJMTA9RFZEIHN0cmVhbQorCTExPVZDRCBzdHJlYW0KKwkxMj1TVkNEIHN0cmVhbQorCTEzPURWRF9TMSBzdHJlYW0KKwkxND1EVkRfUzIgc3RyZWFtCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX09VVFBVVF9QT1JUCitFbnVtIAkxODcvMHhCQgorRGVzY3JpcHRpb24KKwlBc3NpZ24gc3RyZWFtIG91dHB1dCBwb3J0LiBOb3JtYWxseSAwIHdoZW4gdGhlIGRhdGEgaXMgY29waWVkIHRocm91Z2gKKwl0aGUgUENJIGJ1cyAoRE1BKSwgYW5kIDEgd2hlbiB0aGUgZGF0YSBpcyBzdHJlYW1lZCB0byBhbm90aGVyIGNoaXAKKwkocHZydXNiIGFuZCBjeDg4LWJsYWNrYmlyZCkuCitQYXJhbVswXQorCTA9TWVtb3J5IChkZWZhdWx0KQorCTE9U3RyZWFtaW5nCisJMj1TZXJpYWwKK1BhcmFtWzFdCisJVW5rbm93biwgYnV0IGxlYXZpbmcgdGhpcyB0byAwIHNlZW1zIHRvIHdvcmsgYmVzdC4gSW5kaWNhdGlvbnMgYXJlIHRoYXQKKwl0aGlzIG1pZ2h0IGhhdmUgdG8gZG8gd2l0aCBVU0Igc3VwcG9ydCwgYWx0aG91Z2ggcGFzc2luZyBhbnl0aGluZyBidXQgMAorCW9ubCBicmVha3MgdGhpbmdzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9BVURJT19QUk9QRVJUSUVTCitFbnVtIAkxODkvMHhCRAorRGVzY3JpcHRpb24KKwlTZXQgYXVkaW8gc3RyZWFtIHByb3BlcnRpZXMsIG1heSBiZSBjYWxsZWQgd2hpbGUgZW5jb2RpbmcgaXMgaW4gcHJvZ3Jlc3MuCisJTm90ZTogYWxsIGJpdGZpZWxkcyBhcmUgY29uc2lzdGVudCB3aXRoIElTTzExMTcyIGRvY3VtZW50YXRpb24gZXhjZXB0CisJYml0cyAyOjMgd2hpY2ggSVNPIGRvY3MgZGVmaW5lIGFzOgorCQknMTEnIExheWVyIEkKKwkJJzEwJyBMYXllciBJSQorCQknMDEnIExheWVyIElJSQorCQknMDAnIFVuZGVmaW5lZAorCVRoaXMgZGlzY3JlcGFuY3kgbWF5IGluZGljYXRlIGEgcG9zc2libGUgZXJyb3IgaW4gdGhlIGRvY3VtZW50YXRpb24uCisJVGVzdGluZyBpbmRpY2F0ZWQgdGhhdCBvbmx5IExheWVyIElJIGlzIGFjdHVhbGx5IHdvcmtpbmcsIGFuZCB0aGF0CisJdGhlIG1pbmltdW0gYml0cmF0ZSBzaG91bGQgYmUgMTkyIGticHMuCitQYXJhbVswXQorCUJpdG1hc2s6CisJICAgMDoxICAnMDAnIDQ0LjFLaHoKKwkJJzAxJyA0OEtoegorCQknMTAnIDMyS2h6CisJCScxMScgcmVzZXJ2ZWQKKworCSAgIDI6MyAgJzAxJz1MYXllciBJCisJCScxMCc9TGF5ZXIgSUkKKworCSAgIDQ6NyAgQml0cmF0ZToKKwkJICAgICBJbmRleCB8IExheWVyIEkgICAgIHwgTGF5ZXIgSUkKKwkJICAgICAtLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKwkJICAgICcwMDAwJyB8IGZyZWUgZm9ybWF0IHwgZnJlZSBmb3JtYXQKKwkJICAgICcwMDAxJyB8ICAzMiBrYml0L3MgIHwgIDMyIGtiaXQvcworCQkgICAgJzAwMTAnIHwgIDY0IGtiaXQvcyAgfCAgNDgga2JpdC9zCisJCSAgICAnMDAxMScgfCAgOTYga2JpdC9zICB8ICA1NiBrYml0L3MKKwkJICAgICcwMTAwJyB8IDEyOCBrYml0L3MgIHwgIDY0IGtiaXQvcworCQkgICAgJzAxMDEnIHwgMTYwIGtiaXQvcyAgfCAgODAga2JpdC9zCisJCSAgICAnMDExMCcgfCAxOTIga2JpdC9zICB8ICA5NiBrYml0L3MKKwkJICAgICcwMTExJyB8IDIyNCBrYml0L3MgIHwgMTEyIGtiaXQvcworCQkgICAgJzEwMDAnIHwgMjU2IGtiaXQvcyAgfCAxMjgga2JpdC9zCisJCSAgICAnMTAwMScgfCAyODgga2JpdC9zICB8IDE2MCBrYml0L3MKKwkJICAgICcxMDEwJyB8IDMyMCBrYml0L3MgIHwgMTkyIGtiaXQvcworCQkgICAgJzEwMTEnIHwgMzUyIGtiaXQvcyAgfCAyMjQga2JpdC9zCisJCSAgICAnMTEwMCcgfCAzODQga2JpdC9zICB8IDI1NiBrYml0L3MKKwkJICAgICcxMTAxJyB8IDQxNiBrYml0L3MgIHwgMzIwIGtiaXQvcworCQkgICAgJzExMTAnIHwgNDQ4IGtiaXQvcyAgfCAzODQga2JpdC9zCisJCU5vdGU6IEZvciBMYXllciBJSSwgbm90IGFsbCBjb21iaW5hdGlvbnMgb2YgdG90YWwgYml0cmF0ZQorCQlhbmQgbW9kZSBhcmUgYWxsb3dlZC4gU2VlIElTTzExMTcyLTMgMy1Bbm5leCBCLCBUYWJsZSAzLUIuMgorCisJICAgODo5ICAnMDAnPVN0ZXJlbworCQknMDEnPUpvaW50U3RlcmVvCisJCScxMCc9RHVhbAorCQknMTEnPU1vbm8KKwkJTm90ZTogdGVzdGluZyBzZWVtcyB0byBpbmRpY2F0ZSB0aGF0IE1vbm8gYW5kIHBvc3NpYmx5CisJCUpvaW50U3RlcmVvIGFyZSBub3Qgd29ya2luZyAoZGVmYXVsdCB0byBzdGVyZW8pLgorCQlEdWFsIGRvZXMgd29yaywgdGhvdWdoLgorCisJICAxMDoxMSBNb2RlIEV4dGVuc2lvbiB1c2VkIGluIGpvaW50X3N0ZXJlbyBtb2RlLgorCQlJbiBMYXllciBJIGFuZCBJSSB0aGV5IGluZGljYXRlIHdoaWNoIHN1YmJhbmRzIGFyZSBpbgorCQlpbnRlbnNpdHlfc3RlcmVvLiBBbGwgb3RoZXIgc3ViYmFuZHMgYXJlIGNvZGVkIGluIHN0ZXJlby4KKwkJICAgICcwMCcgc3ViYmFuZHMgNC0zMSBpbiBpbnRlbnNpdHlfc3RlcmVvLCBib3VuZD09NAorCQkgICAgJzAxJyBzdWJiYW5kcyA4LTMxIGluIGludGVuc2l0eV9zdGVyZW8sIGJvdW5kPT04CisJCSAgICAnMTAnIHN1YmJhbmRzIDEyLTMxIGluIGludGVuc2l0eV9zdGVyZW8sIGJvdW5kPT0xMgorCQkgICAgJzExJyBzdWJiYW5kcyAxNi0zMSBpbiBpbnRlbnNpdHlfc3RlcmVvLCBib3VuZD09MTYKKworCSAgMTI6MTMgRW1waGFzaXM6CisJCSAgICAnMDAnIE5vbmUKKwkJICAgICcwMScgNTAvMTV1UworCQkgICAgJzEwJyByZXNlcnZlZAorCQkgICAgJzExJyBDQ0lUVCBKLjE3CisKKwkgIDE0IAlDUkM6CisJCSAgICAnMCcgb2ZmCisJCSAgICAnMScgb24KKworCSAgMTUgICAgQ29weXJpZ2h0OgorCQkgICAgJzAnIG9mZgorCQkgICAgJzEnIG9uCisKKwkgIDE2ICAgIEdlbmVyYXRpb246CisJCSAgICAnMCcgY29weQorCQkgICAgJzEnIG9yaWdpbmFsCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfSEFMVF9GVworRW51bSAJMTk1LzB4QzMKK0Rlc2NyaXB0aW9uCisJVGhlIGZpcm13YXJlIGlzIGhhbHRlZCBhbmQgbm8gZnVydGhlciBBUEkgY2FsbHMgYXJlIHNlcnZpY2VkIHVudGlsIHRoZQorCWZpcm13YXJlIGlzIHVwbG9hZGVkIGFnYWluLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX0dFVF9WRVJTSU9OCitFbnVtIAkxOTYvMHhDNAorRGVzY3JpcHRpb24KKwlSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBlbmNvZGVyIGZpcm13YXJlLgorUmVzdWx0WzBdCisJVmVyc2lvbiBiaXRtYXNrOgorCSAgICBCaXRzICAwOjE1IGJ1aWxkCisJICAgIEJpdHMgMTY6MjMgbWlub3IKKwkgICAgQml0cyAyNDozMSBtYWpvcgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9HT1BfQ0xPU1VSRQorRW51bSAJMTk3LzB4QzUKK0Rlc2NyaXB0aW9uCisJQXNzaWducyB0aGUgR09QIG9wZW4vY2xvc2UgcHJvcGVydHkuCitQYXJhbVswXQorCTA9T3BlbgorCTE9Q2xvc2VkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfR0VUX1NFUV9FTkQKK0VudW0gCTE5OC8weEM2CitEZXNjcmlwdGlvbgorCU9idGFpbnMgdGhlIHNlcXVlbmNlIGVuZCBjb2RlIG9mIHRoZSBlbmNvZGVyJ3MgYnVmZmVyLiBXaGVuIGEgY2FwdHVyZQorCWlzIHN0YXJ0ZWQgYSBudW1iZXIgb2YgaW50ZXJydXB0cyBhcmUgc3RpbGwgZ2VuZXJhdGVkLCB0aGUgbGFzdCBvZgorCXdoaWNoIHdpbGwgaGF2ZSBSZXN1bHRbMF0gc2V0IHRvIDEgYW5kIFJlc3VsdFsxXSB3aWxsIGNvbnRhaW4gdGhlIHNpemUKKwlvZiB0aGUgYnVmZmVyLgorUmVzdWx0WzBdCisJU3RhdGUgb2YgdGhlIHRyYW5zZmVyICgxIGlmIGxhc3QgYnVmZmVyKQorUmVzdWx0WzFdCisJSWYgUmVzdWx0WzBdIGlzIDEsIHRoaXMgY29udGFpbnMgdGhlIHNpemUgb2YgdGhlIGxhc3QgYnVmZmVyLCB1bmRlZmluZWQKKwlvdGhlcndpc2UuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1BHTV9JTkRFWF9JTkZPCitFbnVtIAkxOTkvMHhDNworRGVzY3JpcHRpb24KKwlTZXRzIHRoZSBQcm9ncmFtIEluZGV4IEluZm9ybWF0aW9uLgorUGFyYW1bMF0KKwlQaWN0dXJlIE1hc2s6CisJICAgIDA9Tm8gaW5kZXggY2FwdHVyZQorCSAgICAxPUkgZnJhbWVzCisJICAgIDM9SSxQIGZyYW1lcworCSAgICA3PUksUCxCIGZyYW1lcworUGFyYW1bMV0KKwlFbGVtZW50cyByZXF1ZXN0ZWQgKHVwIHRvIDQwMCkKK1Jlc3VsdFswXQorCU9mZnNldCBpbiBTREYgbWVtb3J5IG9mIHRoZSB0YWJsZS4KK1Jlc3VsdFsxXQorCU51bWJlciBvZiBhbGxvY2F0ZWQgZWxlbWVudHMgdXAgdG8gYSBtYXhpbXVtIG9mIFBhcmFtWzFdCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX1ZCSV9DT05GSUcKK0VudW0gCTIwMC8weEM4CitEZXNjcmlwdGlvbgorCUNvbmZpZ3VyZSBWQkkgc2V0dGluZ3MKK1BhcmFtWzBdCisJQml0bWFwOgorCSAgICAwICAgIE1vZGUgJzAnIFNsaWNlZCwgJzEnIFJhdworCSAgICAxOjMgIEluc2VydGlvbjoKKwkJICAgICAnMDAwJyBpbnNlcnQgaW4gZXh0ZW5zaW9uICYgdXNlciBkYXRhCisJCSAgICAgJzAwMScgaW5zZXJ0IGluIHByaXZhdGUgcGFja2V0cworCQkgICAgICcwMTAnIHNlcGFyYXRlIHN0cmVhbSBhbmQgdXNlciBkYXRhCisJCSAgICAgJzExMScgc2VwYXJhdGUgc3RyZWFtIGFuZCBwcml2YXRlIGRhdGEKKwkgICAgODoxNSBTdHJlYW0gSUQgKG5vcm1hbGx5IDB4QkQpCitQYXJhbVsxXQorCUZyYW1lcyBwZXIgaW50ZXJydXB0IChtYXggOCkuIE9ubHkgdmFsaWQgaW4gcmF3IG1vZGUuCitQYXJhbVsyXQorCVRvdGFsIHJhdyBWQkkgZnJhbWVzLiBPbmx5IHZhbGlkIGluIHJhdyBtb2RlLgorUGFyYW1bM10KKwlTdGFydCBjb2RlcworUGFyYW1bNF0KKwlTdG9wIGNvZGVzCitQYXJhbVs1XQorCUxpbmVzIHBlciBmcmFtZQorUGFyYW1bNl0KKwlCeXRlIHBlciBsaW5lCitSZXN1bHRbMF0KKwlPYnNlcnZlZCBmcmFtZXMgcGVyIGludGVycnVwdCBpbiByYXcgbW9kZSBvbmx5LiBSYWdlIDEgdG8gUGFyYW1bMV0KK1Jlc3VsdFsxXQorCU9ic2VydmVkIG51bWJlciBvZiBmcmFtZXMgaW4gcmF3IG1vZGUuIFJhbmdlIDEgdG8gUGFyYW1bMl0KK1Jlc3VsdFsyXQorCU1lbW9yeSBvZmZzZXQgdG8gc3RhcnQgb3IgcmF3IFZCSSBkYXRhCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0RNQV9CTE9DS19TSVpFCitFbnVtIAkyMDEvMHhDOQorRGVzY3JpcHRpb24KKwlTZXQgRE1BIHRyYW5zZmVyIGJsb2NrIHNpemUKK1BhcmFtWzBdCisJRE1BIHRyYW5zZmVyIGJsb2NrIHNpemUgaW4gYnl0ZXMgb3IgZnJhbWVzLiBXaGVuIHVuaXQgaXMgYnl0ZXMsCisJc3VwcG9ydGVkIGJsb2NrIHNpemVzIGFyZSAyXjcsIDJeOCBhbmQgMl45IGJ5dGVzLgorUGFyYW1bMV0KKwlVbml0OiAwPWJ5dGVzLCAxPWZyYW1lcworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX0dFVF9QUkVWX0RNQV9JTkZPX01CXzEwCitFbnVtIAkyMDIvMHhDQQorRGVzY3JpcHRpb24KKwlSZXR1cm5zIGluZm9ybWF0aW9uIG9uIHRoZSBwcmV2aW91cyBETUEgdHJhbnNmZXIgaW4gY29uanVuY3Rpb24gd2l0aAorCWJpdCAyNyBvZiB0aGUgaW50ZXJydXB0IG1hc2suIFVzZXMgbWFpbGJveCAxMC4KK1Jlc3VsdFswXQorCVR5cGUgb2Ygc3RyZWFtCitSZXN1bHRbMV0KKwlBZGRyZXNzIE9mZnNldAorUmVzdWx0WzJdCisJTWF4aW11bSBzaXplIG9mIHRyYW5zZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfR0VUX1BSRVZfRE1BX0lORk9fTUJfOQorRW51bSAJMjAzLzB4Q0IKK0Rlc2NyaXB0aW9uCisJUmV0dXJucyBpbmZvcm1hdGlvbiBvbiB0aGUgcHJldmlvdXMgRE1BIHRyYW5zZmVyIGluIGNvbmp1bmN0aW9uIHdpdGgKKwliaXQgMjcgb2YgdGhlIGludGVycnVwdCBtYXNrLiBVc2VzIG1haWxib3ggOS4KK1Jlc3VsdFswXQorCVN0YXR1cyBiaXRzOgorCSAgICBCaXQgMCBzZXQgaW5kaWNhdGVzIHRyYW5zZmVyIGNvbXBsZXRlCisJICAgIEJpdCAyIHNldCBpbmRpY2F0ZXMgdHJhbnNmZXIgZXJyb3IKKwkgICAgQml0IDQgc2V0IGluZGljYXRlcyBsaW5rZWQgbGlzdCBlcnJvcgorUmVzdWx0WzFdCisJRE1BIHR5cGUKK1Jlc3VsdFsyXQorCVByZXNlbnRhdGlvbiBUaW1lIFN0YW1wIGJpdHMgMC4uMzEKK1Jlc3VsdFszXQorCVByZXNlbnRhdGlvbiBUaW1lIFN0YW1wIGJpdCAzMgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NDSEVEX0RNQV9UT19IT1NUCitFbnVtIAkyMDQvMHhDQworRGVzY3JpcHRpb24KKwlTZXR1cCBETUEgdG8gaG9zdCBvcGVyYXRpb24KK1BhcmFtWzBdCisJTWVtb3J5IGFkZHJlc3Mgb2YgbGluayBsaXN0CitQYXJhbVsxXQorCUxlbmd0aCBvZiBsaW5rIGxpc3QgKHd0Zjogd2hhdCB1bml0cyA/Pz8pCitQYXJhbVsyXQorCURNQSB0eXBlICgwPU1QRUcpCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfSU5JVElBTElaRV9JTlBVVAorRW51bSAJMjA1LzB4Q0QKK0Rlc2NyaXB0aW9uCisJSW5pdGlhbGl6ZXMgdGhlIHZpZGVvIGlucHV0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX0RST1BfUkFURQorRW51bSAJMjA4LzB4RDAKK0Rlc2NyaXB0aW9uCisJRm9yIGVhY2ggZnJhbWUgY2FwdHVyZWQsIHNraXAgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMuCitQYXJhbVswXQorCU51bWJlciBvZiBmcmFtZXMgdG8gc2tpcAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1BBVVNFX0VOQ09ERVIKK0VudW0gCTIxMC8weEQyCitEZXNjcmlwdGlvbgorCUR1cmluZyBhIHBhdXNlIGNvbmRpdGlvbiwgYWxsIGZyYW1lcyBhcmUgZHJvcHBlZCBpbnN0ZWFkIG9mIGJlaW5nIGVuY29kZWQuCitQYXJhbVswXQorCTA9UGF1c2UgZW5jb2RpbmcKKwkxPUNvbnRpbnVlIGVuY29kaW5nCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfUkVGUkVTSF9JTlBVVAorRW51bSAJMjExLzB4RDMKK0Rlc2NyaXB0aW9uCisJUmVmcmVzaGVzIHRoZSB2aWRlbyBpbnB1dAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9DT1BZUklHSFQKK0VudW0gCTIxMi8weEQ0CitEZXNjcmlwdGlvbgorCVNldHMgc3RyZWFtIGNvcHlyaWdodCBwcm9wZXJ0eQorUGFyYW1bMF0KKwkwPVN0cmVhbSBpcyBub3QgY29weXJpZ2h0ZWQKKwkxPVN0cmVhbSBpcyBjb3B5cmlnaHRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfRU5DX1NFVF9FVkVOVF9OT1RJRklDQVRJT04KK0VudW0gCTIxMy8weEQ1CitEZXNjcmlwdGlvbgorCVNldHVwIGZpcm13YXJlIHRvIG5vdGlmeSB0aGUgaG9zdCBhYm91dCBhIHBhcnRpY3VsYXIgZXZlbnQuIEhvc3QgbXVzdAorCXVubWFzayB0aGUgaW50ZXJydXB0IGJpdC4KK1BhcmFtWzBdCisJRXZlbnQgKDA9cmVmcmVzaCBlbmNvZGVyIGlucHV0KQorUGFyYW1bMV0KKwlOb3RpZmljYXRpb24gMD1kaXNhYmxlZCAxPWVuYWJsZWQKK1BhcmFtWzJdCisJSW50ZXJydXB0IGJpdAorUGFyYW1bM10KKwlNYWlsYm94IHNsb3QsIC0xIGlmIG5vIG1haWxib3ggcmVxdWlyZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfU0VUX05VTV9WU1lOQ19MSU5FUworRW51bSAJMjE0LzB4RDYKK0Rlc2NyaXB0aW9uCisJRGVwZW5kaW5nIG9uIHRoZSBhbmFsb2cgdmlkZW8gZGVjb2RlciB1c2VkLCB0aGlzIGFzc2lnbnMgdGhlIG51bWJlcgorCW9mIGxpbmVzIGZvciBmaWVsZCAxIGFuZCAyLgorUGFyYW1bMF0KKwlGaWVsZCAxIG51bWJlciBvZiBsaW5lczoKKwkgICAgMHgwMEVGIGZvciBTQUE3MTE0CisJICAgIDB4MDBGMCBmb3IgU0FBNzExNQorCSAgICAweDAxMDUgZm9yIE1pY3JvbmFzCitQYXJhbVsxXQorCUZpZWxkIDIgbnVtYmVyIG9mIGxpbmVzOgorCSAgICAweDAwRUYgZm9yIFNBQTcxMTQKKwkgICAgMHgwMEYwIGZvciBTQUE3MTE1CisJICAgIDB4MDEwNiBmb3IgTWljcm9uYXMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19TRVRfUExBQ0VIT0xERVIKK0VudW0gCTIxNS8weEQ3CitEZXNjcmlwdGlvbgorCVByb3ZpZGVzIGEgbWVjaGFuaXNtIG9mIGluc2VydGluZyBjdXN0b20gdXNlciBkYXRhIGluIHRoZSBNUEVHIHN0cmVhbS4KK1BhcmFtWzBdCisJMD1leHRlbnNpb24gJiB1c2VyIGRhdGEKKwkxPXByaXZhdGUgcGFja2V0IHdpdGggc3RyZWFtIElEIDB4QkQKK1BhcmFtWzFdCisJUmF0ZSBhdCB3aGljaCB0byBpbnNlcnQgZGF0YSwgaW4gdW5pdHMgb2YgZnJhbWVzIChmb3IgcHJpdmF0ZSBwYWNrZXQpCisJb3IgR09QcyAoZm9yIGV4dC4gJiB1c2VyIGRhdGEpCitQYXJhbVsyXQorCU51bWJlciBvZiBkYXRhIERXT1JEcyAoYmVsb3cpIHRvIGluc2VydAorUGFyYW1bM10KKwlDdXN0b20gZGF0YSAwCitQYXJhbVs0XQorCUN1c3RvbSBkYXRhIDEKK1BhcmFtWzVdCisJQ3VzdG9tIGRhdGEgMgorUGFyYW1bNl0KKwlDdXN0b20gZGF0YSAzCitQYXJhbVs3XQorCUN1c3RvbSBkYXRhIDQKK1BhcmFtWzhdCisJQ3VzdG9tIGRhdGEgNQorUGFyYW1bOV0KKwlDdXN0b20gZGF0YSA2CitQYXJhbVsxMF0KKwlDdXN0b20gZGF0YSA3CitQYXJhbVsxMV0KKwlDdXN0b20gZGF0YSA4CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfTVVURV9WSURFTworRW51bSAJMjE3LzB4RDkKK0Rlc2NyaXB0aW9uCisJVmlkZW8gbXV0aW5nCitQYXJhbVswXQorCUJpdCB1c2FnZToKKwkgMCAgICAJJzAnPXZpZGVvIG5vdCBtdXRlZAorCQknMSc9dmlkZW8gbXV0ZWQsIGNyZWF0ZXMgZnJhbWVzIHdpdGggdGhlIFlVViBjb2xvciBkZWZpbmVkIGJlbG93CisJIDE6NyAgCVVudXNlZAorCSA4OjE1IAlWIGNocm9taW5hbmNlIGluZm9ybWF0aW9uCisJMTY6MjMgCVUgY2hyb21pbmFuY2UgaW5mb3JtYXRpb24KKwkyNDozMSAJWSBsdW1pbmFuY2UgaW5mb3JtYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX0VOQ19NVVRFX0FVRElPCitFbnVtIAkyMTgvMHhEQQorRGVzY3JpcHRpb24KKwlBdWRpbyBtdXRpbmcKK1BhcmFtWzBdCisJMD1hdWRpbyBub3QgbXV0ZWQKKwkxPWF1ZGlvIG11dGVkIChwcm9kdWNlcyBzaWxlbnQgbXBlZyBhdWRpbyBzdHJlYW0pCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfVU5LTk9XTgorRW51bSAJMjE5LzB4REIKK0Rlc2NyaXB0aW9uCisJVW5rbm93biBBUEksIGl0J3MgdXNlZCBieSBIYXVwcGF1Z2UgdGhvdWdoLgorUGFyYW1bMF0KKwkwIFRoaXMgaXMgdGhlIHZhbHVlIEhhdXBwYXVnZSB1c2VzLCBVbmtub3duIHdoYXQgaXQgbWVhbnMuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9FTkNfTUlTQworRW51bSAJMjIwLzB4REMKK0Rlc2NyaXB0aW9uCisJTWlzY2VsbGFuZW91cyBhY3Rpb25zLiBOb3Qga25vd24gZm9yIDEwMCUgd2hhdCBpdCBkb2VzLiBJdCdzIHJlYWxseSBhCisJc29ydCBvZiBpb2N0bCBjYWxsLiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgY29tbWFuZCBudW1iZXIsIHRoZSBzZWNvbmQKKwl0aGUgdmFsdWUuCitQYXJhbVswXQorCUNvbW1hbmQgbnVtYmVyOgorCSAxPXNldCBpbml0aWFsIFNDUiB2YWx1ZSB3aGVuIHN0YXJ0aW5nIGVuY29kaW5nLgorCSAyPXNldCBxdWFsaXR5IG1vZGUgKGFwcGFyZW50bHkgc29tZSB0ZXN0IHNldHRpbmcpLgorCSAzPXNldHVwIGFkdmFuY2VkIFZJTSBwcm90ZWN0aW9uIGhhbmRsaW5nIChzdXBwb3NlZGx5IG9ubHkgZm9yIHRoZSBjeDIzNDE2CisJICAgZm9yIHJhdyBZVVYpLgorCSAgIEFjdHVhbGx5IGl0IGxvb2tzIGxpa2UgdGhpcyBzaG91bGQgYmUgMCBmb3Igc2FhNzExNC81IGJhc2VkIGNhcmQgYW5kIDEKKwkgICBmb3IgY3gyNTg0MCBiYXNlZCBjYXJkcy4KKwkgND1nZW5lcmF0ZSBhcnRpZmljaWFsIFBUUyB0aW1lc3RhbXBzCisJIDU9VVNCIGZsdXNoIG1vZGUKKwkgNj1zb21ldGhpbmcgdG8gZG8gd2l0aCB0aGUgcXVhbnRpemF0aW9uIG1hdHJpeAorCSA3PXNldCBuYXZpZ2F0aW9uIHBhY2sgaW5zZXJ0aW9uIGZvciBEVkQKKwkgOD1lbmFibGUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiAoc2VlbXMgdG8gYmUgYSBmYWlsdXJlKQorCSA5PXNldCBoaXN0b3J5IHBhcmFtZXRlcnMgb2YgdGhlIHZpZGVvIGlucHV0IG1vZHVsZQorCTEwPXNldCBpbnB1dCBmaWVsZCBvcmRlciBvZiBWSU0KKwkxMT1zZXQgcXVhbnRpemF0aW9uIG1hdHJpeAorCTEyPXJlc2V0IGF1ZGlvIGludGVyZmFjZQorCTEzPXNldCBhdWRpbyB2b2x1bWUgZGVsYXkKKwkxND1zZXQgYXVkaW8gZGVsYXkKKworUGFyYW1bMV0KKwlDb21tYW5kIHZhbHVlLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW1lbW9yeS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2N4MjM0MXgvZnctbWVtb3J5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjBhYWQzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW1lbW9yeS50eHQKQEAgLTAsMCArMSwxNDEgQEAKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBjeDIzNDF4IG1lbW9yeSBtYXAgYW5kIGRvY3VtZW50cyBzb21lIG9mIHRoZSByZWdpc3Rlcgorc3BhY2UuCisKK1dhcm5pbmchIFRoaXMgaW5mb3JtYXRpb24gd2FzIGZpZ3VyZWQgb3V0IGZyb20gc2VhcmNoaW5nIHRocm91Z2ggdGhlIG1lbW9yeSBhbmQKK3JlZ2lzdGVycywgdGhpcyBpbmZvcm1hdGlvbiBtYXkgbm90IGJlIGNvcnJlY3QgYW5kIGlzIGNlcnRhaW5seSBub3QgY29tcGxldGUsIGFuZAord2FzIG5vdCBkZXJpdmVkIGZyb20gYW55dGhpbmcgbW9yZSB0aGFuIHNlYXJjaGluZyB0aHJvdWdoIHRoZSBtZW1vcnkgc3BhY2Ugd2l0aAorY29tbWFuZHMgbGlrZToKKworCWl2dHZjdGwgLU8gbWluPTB4MDIwMDAwMDAsbWF4PTB4MDIwMDAwZmYKKworU28gdGFrZSB0aGlzIGFzIGlzLCBJJ20gYWx3YXlzIHNlYXJjaGluZyBmb3IgbW9yZSBzdHVmZiwgaXQncyBhIGxhcmdlCityZWdpc3RlciBzcGFjZSA6LSkuCisKK01lbW9yeSBNYXAKKz09PT09PT09PT0KKworVGhlIGN4MjM0MXggZXhwb3NlcyBpdHMgZW50aXJlIDY0TSBtZW1vcnkgc3BhY2UgdG8gdGhlIFBDSSBob3N0IHZpYSB0aGUgUENJIEJBUjAKKyhCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMCkuIFRoZSBhZGRyZXNzZXMgaGVyZSBhcmUgb2Zmc2V0cyByZWxhdGl2ZSB0byB0aGUKK2FkZHJlc3MgaGVsZCBpbiBCQVIwLgorCisweDAwMDAwMDAwLTB4MDBmZmZmZmYgRW5jb2RlciBtZW1vcnkgc3BhY2UKKzB4MDAwMDAwMDAtMHgwMDAzZmZmZiBFbmNvZGUucm9tCisgICAgICA/Pz8tPz8/ICAgICAgICAgTVBFRyBidWZmZXIocykKKyAgICAgID8/Py0/Pz8gICAgICAgICBSYXcgdmlkZW8gY2FwdHVyZSBidWZmZXIocykKKyAgICAgID8/Py0/Pz8gICAgICAgICBSYXcgYXVkaW8gY2FwdHVyZSBidWZmZXIocykKKyAgICAgID8/Py0/Pz8gICAgICAgICBEaXNwbGF5IGJ1ZmZlcnMgKDYgb3IgOSkKKworMHgwMTAwMDAwMC0weDAxZmZmZmZmIERlY29kZXIgbWVtb3J5IHNwYWNlCisweDAxMDAwMDAwLTB4MDEwM2ZmZmYgRGVjb2RlLnJvbQorICAgICAgPz8/LT8/PyAgICAgICAgIE1QRUcgYnVmZmVycyhzKQorMHgwMTE0YjAwMC0weDAxMTVhZmZmIEF1ZGlvLnJvbSAoZGVwcmVjYXRlZD8pCisKKzB4MDIwMDAwMDAtMHgwMjAwZmZmZiBSZWdpc3RlciBTcGFjZQorCitSZWdpc3RlcnMKKz09PT09PT09PQorCitUaGUgcmVnaXN0ZXJzIG9jY3VweSB0aGUgNjRrIHNwYWNlIHN0YXJ0aW5nIGF0IHRoZSAweDAyMDAwMDAwIG9mZnNldCBmcm9tIEJBUjAuCitBbGwgb2YgdGhlc2UgcmVnaXN0ZXJzIGFyZSAzMiBiaXRzIHdpZGUuCisKK0RNQSBSZWdpc3RlcnMgMHgwMDAtMHhmZjoKKworIDB4MDAgLSBDb250cm9sOgorCTA9cmVzZXQvY2FuY2VsLCAxPXJlYWQsIDI9d3JpdGUsIDQ9c3RvcAorIDB4MDQgLSBETUEgc3RhdHVzOgorCTE9cmVhZCBidXN5LCAyPXdyaXRlIGJ1c3ksIDQ9cmVhZCBlcnJvciwgOD13cml0ZSBlcnJvciwgMTY9bGluayBsaXN0IGVycm9yCisgMHgwOCAtIHBjaSBETUEgcG9pbnRlciBmb3IgcmVhZCBsaW5rIGxpc3QKKyAweDBjIC0gcGNpIERNQSBwb2ludGVyIGZvciB3cml0ZSBsaW5rIGxpc3QKKyAweDEwIC0gcmVhZC93cml0ZSBETUEgZW5hYmxlOgorCTE9cmVhZCBlbmFibGUsIDI9d3JpdGUgZW5hYmxlCisgMHgxNCAtIGFsd2F5cyAweGZmZmZmZmZmLCBpZiBzZXQgYW55IGxvd2VyIGluc3RhYmlsaXR5IG9jY3VycywgMHgwMCBjcmFzaGVzCisgMHgxOCAtID8/CisgMHgxYyAtIGFsd2F5cyAweDIwIG9yIDMyLCBzbWFsbGVyIHZhbHVlcyBzbG93IGRvd24gRE1BIHRyYW5zYWN0aW9ucworIDB4MjAgLSBhbHdheXMgdmFsdWUgb2YgMHg3ODBhMDEwYQorIDB4MjQtMHgzYyAtIHVzdWFsbHkganVzdCByYW5kb20gdmFsdWVzPz8/CisgMHg0MCAtIEludGVycnVwdCBzdGF0dXMKKyAweDQ0IC0gV3JpdGUgYSBiaXQgaGVyZSBhbmQgc2hvd3MgdXAgaW4gSW50ZXJydXB0IHN0YXR1cyAweDQwCisgMHg0OCAtIEludGVycnVwdCBNYXNrCisgMHg0QyAtIGFsd2F5cyB2YWx1ZSBvZiAweGZmZmRmZmZmLAorCWlmIGNoYW5nZWQgdG8gMHhmZmZmZmZmZiBETUEgd3JpdGUgaW50ZXJydXB0cyBicmVhay4KKyAweDUwIC0gYWx3YXlzIDB4ZmZmZmZmZmYKKyAweDU0IC0gYWx3YXlzIDB4ZmZmZmZmZmYgKDB4NGMsIDB4NTAsIDB4NTQgc2VlbSBsaWtlIGludGVycnVwdCBtYXNrcywgYXJlCisJMyBwcm9jZXNzb3JzIG9uIGNoaXAsIEphdmEgb25lcywgVlBVLCBTUFUsIEFQVSwgbWF5YmUgdGhlc2UgYXJlIHRoZQorCWludGVycnVwdCBtYXNrcz8/PykuCisgMHg2MC0weDdDIC0gcmFuZG9tIHZhbHVlcworIDB4ODAgLSBmaXJzdCB3cml0ZSBsaW5rZWQgbGlzdCByZWcsIGZvciBFbmNvZGVyIE1lbW9yeSBhZGRyCisgMHg4NCAtIGZpcnN0IHdyaXRlIGxpbmtlZCBsaXN0IHJlZywgZm9yIHBjaSBtZW1vcnkgYWRkcgorIDB4ODggLSBmaXJzdCB3cml0ZSBsaW5rZWQgbGlzdCByZWcsIGZvciBsZW5ndGggb2YgYnVmZmVyIGluIG1lbW9yeSBhZGRyCisJKHwweDgwMDAwMDAwIG9yIHRoaXMgZm9yIGxhc3QgbGluaykKKyAweDhjLTB4Y2MgLSByZXN0IG9mIHdyaXRlIGxpbmtlZCBsaXN0IHJlZywgOCBzZXRzIG9mIDMgdG90YWwsIERNQSBnb2VzIGhlcmUKKwlmcm9tIGxpbmtlZCBsaXN0IGFkZHIgaW4gcmVnIDB4MGMsIGZpcm13YXJlIG11c3QgcHVzaCB0aHJvdWdoIG9yCisJc29tZXRoaW5nLgorIDB4ZTAgLSBmaXJzdCAoYW5kIG9ubHkpIHJlYWQgbGlua2VkIGxpc3QgcmVnLCBmb3IgcGNpIG1lbW9yeSBhZGRyCisgMHhlNCAtIGZpcnN0IChhbmQgb25seSkgcmVhZCBsaW5rZWQgbGlzdCByZWcsIGZvciBEZWNvZGVyIG1lbW9yeSBhZGRyCisgMHhlOCAtIGZpcnN0IChhbmQgb25seSkgcmVhZCBsaW5rZWQgbGlzdCByZWcsIGZvciBsZW5ndGggb2YgYnVmZmVyCisgMHhlYy0weGZmIC0gTm90aGluZyBzZWVtcyB0byBiZSBpbiB0aGVzZSByZWdpc3RlcnMsIDB4ZWMtZjQgYXJlIDB4MDAwMDAwMDAuCisKK01lbW9yeSBsb2NhdGlvbnMgZm9yIEVuY29kZXIgQnVmZmVycyAweDcwMC0weDdmZjoKKworVGhlc2UgcmVnaXN0ZXJzIHNob3cgb2Zmc2V0cyBvZiBtZW1vcnkgbG9jYXRpb25zIHBlcnRhaW5pbmcgdG8gZWFjaAorYnVmZmVyIGFyZWEgdXNlZCBmb3IgZW5jb2RpbmcsIGhhdmUgdG8gc2hpZnQgdGhlbSBieSA8PDEgZmlyc3QuCisKKzB4MDdGODogRW5jb2RlciBTRFJBTSByZWZyZXNoCisweDA3RkM6IEVuY29kZXIgU0RSQU0gcHJlLWNoYXJnZQorCitNZW1vcnkgbG9jYXRpb25zIGZvciBEZWNvZGVyIEJ1ZmZlcnMgMHg4MDAtMHg4ZmY6CisKK1RoZXNlIHJlZ2lzdGVycyBzaG93IG9mZnNldHMgb2YgbWVtb3J5IGxvY2F0aW9ucyBwZXJ0YWluaW5nIHRvIGVhY2gKK2J1ZmZlciBhcmVhIHVzZWQgZm9yIGRlY29kaW5nLCBoYXZlIHRvIHNoaWZ0IHRoZW0gYnkgPDwxIGZpcnN0LgorCisweDA4Rjg6IERlY29kZXIgU0RSQU0gcmVmcmVzaAorMHgwOEZDOiBEZWNvZGVyIFNEUkFNIHByZS1jaGFyZ2UKKworT3RoZXIgbWVtb3J5IGxvY2F0aW9uczoKKworMHgyODAwOiBWaWRlbyBEaXNwbGF5IE1vZHVsZSBjb250cm9sCisweDJEMDA6IEFPIChhdWRpbyBvdXRwdXQ/KSBjb250cm9sCisweDJEMjQ6IEJ5dGVzIEZsdXNoZWQKKzB4NzAwMDogTFNCIEkyQyB3cml0ZSBjbG9jayBiaXQgKGludmVydGVkKQorMHg3MDA0OiBMU0IgSTJDIHdyaXRlIGRhdGEgYml0IChpbnZlcnRlZCkKKzB4NzAwODogTFNCIEkyQyByZWFkIGNsb2NrIGJpdAorMHg3MDBjOiBMU0IgSTJDIHJlYWQgZGF0YSBiaXQKKzB4OTAwODogR1BJTyBnZXQgaW5wdXQgc3RhdGUKKzB4OTAwYzogR1BJTyBzZXQgb3V0cHV0IHN0YXRlCisweDkwMjA6IEdQSU8gZGlyZWN0aW9uIChCaXQ3IChHUElPIDAuLjcpIC0gMDppbnB1dCwgMTpvdXRwdXQpCisweDkwNTA6IFNQVSBjb250cm9sCisweDkwNTQ6IFJlc2V0IEhXIGJsb2NrcworMHg5MDU4OiBWUFUgY29udHJvbAorMHhBMDE4OiBCaXQ2OiBpbnRlcnJ1cHQgcGVuZGluZz8KKzB4QTA2NDogQVBVIGNvbW1hbmQKKworCitJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBkZWZpbml0aW9uIG9mIHRoZSBiaXRzIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIDB4MDA0MCwgYW5kIHRoZQoraW50ZXJydXB0IG1hc2sgMHgwMDQ4LiBJZiBhIGJpdCBpcyBjbGVhcmVkIGluIHRoZSBtYXNrLCB0aGVuIHdlIHdhbnQgb3VyIElTUiB0bworZXhlY3V0ZS4KKworQml0CiszMSBFbmNvZGVyIFN0YXJ0IENhcHR1cmUKKzMwIEVuY29kZXIgRU9TCisyOSBFbmNvZGVyIFZCSSBjYXB0dXJlCisyOCBFbmNvZGVyIFZpZGVvIElucHV0IE1vZHVsZSByZXNldCBldmVudAorMjcgRW5jb2RlciBETUEgY29tcGxldGUKKzI2CisyNSBEZWNvZGVyIGNvcHkgcHJvdGVjdCBkZXRlY3Rpb24gZXZlbnQKKzI0IERlY29kZXIgYXVkaW8gbW9kZSBjaGFuZ2UgZGV0ZWN0aW9uIGV2ZW50CisyMworMjIgRGVjb2RlciBkYXRhIHJlcXVlc3QKKzIxIERlY29kZXIgSS1GcmFtZT8gZG9uZQorMjAgRGVjb2RlciBETUEgY29tcGxldGUKKzE5IERlY29kZXIgVkJJIHJlLWluc2VydGlvbgorMTggRGVjb2RlciBETUEgZXJyIChsaW5rZWQtbGlzdCBiYWQpCisKK01pc3NpbmcKK0VuY29kZXIgQVBJIGNhbGwgY29tcGxldGVkCitEZWNvZGVyIEFQSSBjYWxsIGNvbXBsZXRlZAorRW5jb2RlciBBUEkgcG9zdCg/KQorRGVjb2RlciBBUEkgcG9zdCg/KQorRGVjb2RlciBWVFJBQ0UgZXZlbnQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1vc2QtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy1vc2QtYXBpLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTk4YWUzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LW9zZC1hcGkudHh0CkBAIC0wLDAgKzEsMzQyIEBACitPU0QgZmlybXdhcmUgQVBJIGRlc2NyaXB0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK05vdGU6IHRoaXMgQVBJIGlzIHBhcnQgb2YgdGhlIGRlY29kZXIgZmlybXdhcmUsIHNvIGl0J3MgY3gyMzQxNSBvbmx5LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX0dFVF9GUkFNRUJVRkZFUgorRW51bSAJNjUvMHg0MQorRGVzY3JpcHRpb24KKwlSZXR1cm4gYmFzZSBhbmQgbGVuZ3RoIG9mIGNvbnRpZ3VvdXMgT1NEIG1lbW9yeS4KK1Jlc3VsdFswXQorCU9TRCBiYXNlIGFkZHJlc3MKK1Jlc3VsdFsxXQorCU9TRCBsZW5ndGgKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfUElYRUxfRk9STUFUCitFbnVtIAk2Ni8weDQyCitEZXNjcmlwdGlvbgorCVF1ZXJ5IE9TRCBmb3JtYXQKK1Jlc3VsdFswXQorCTA9OGJpdCBpbmRleCwgND1BbHBoYVJHQiA4Ojg6ODo4CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX1BJWEVMX0ZPUk1BVAorRW51bSAJNjcvMHg0MworRGVzY3JpcHRpb24KKwlBc3NpZ24gcGl4ZWwgZm9ybWF0CitQYXJhbVswXQorCTA9OGJpdCBpbmRleCwgND1BbHBoYVJHQiA4Ojg6ODo4CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfR0VUX1NUQVRFCitFbnVtIAk2OC8weDQ0CitEZXNjcmlwdGlvbgorCVF1ZXJ5IE9TRCBzdGF0ZQorUmVzdWx0WzBdCisJQml0ICAwICAgMD1vZmYsIDE9b24KKwlCaXRzIDE6MiBhbHBoYSBjb250cm9sCisJQml0cyAzOjUgcGl4ZWwgZm9ybWF0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX1NUQVRFCitFbnVtIAk2OS8weDQ1CitEZXNjcmlwdGlvbgorCU9TRCBzd2l0Y2gKK1BhcmFtWzBdCisJMD1vZmYsIDE9b24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfT1NEX0NPT1JEUworRW51bSAJNzAvMHg0NgorRGVzY3JpcHRpb24KKwlSZXRyaWV2ZSBjb29yZGluYXRlcyBvZiBPU0QgYXJlYSBibGVuZGVkIHdpdGggdmlkZW8KK1Jlc3VsdFswXQorCU9TRCBidWZmZXIgYWRkcmVzcworUmVzdWx0WzFdCisJU3RyaWRlIGluIHBpeGVscworUmVzdWx0WzJdCisJTGluZXMgaW4gT1NEIGJ1ZmZlcgorUmVzdWx0WzNdCisJSG9yaXpvbnRhbCBvZmZzZXQgaW4gYnVmZmVyCitSZXN1bHRbNF0KKwlWZXJ0aWNhbCBvZmZzZXQgaW4gYnVmZmVyCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX09TRF9DT09SRFMKK0VudW0gCTcxLzB4NDcKK0Rlc2NyaXB0aW9uCisJQXNzaWduIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgT1NEIGFyZWEgdG8gYmxlbmQgd2l0aCB2aWRlbworUGFyYW1bMF0KKwlidWZmZXIgYWRkcmVzcworUGFyYW1bMV0KKwlidWZmZXIgc3RyaWRlIGluIHBpeGVscworUGFyYW1bMl0KKwlsaW5lcyBpbiBidWZmZXIKK1BhcmFtWzNdCisJaG9yaXpvbnRhbCBvZmZzZXQKK1BhcmFtWzRdCisJdmVydGljYWwgb2Zmc2V0CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfR0VUX1NDUkVFTl9DT09SRFMKK0VudW0gCTcyLzB4NDgKK0Rlc2NyaXB0aW9uCisJUmV0cmlldmUgT1NEIHNjcmVlbiBhcmVhIGNvb3JkaW5hdGVzCitSZXN1bHRbMF0KKwl0b3AgbGVmdCBob3Jpem9udGFsIG9mZnNldAorUmVzdWx0WzFdCisJdG9wIGxlZnQgdmVydGljYWwgb2Zmc2V0CitSZXN1bHRbMl0KKwlib3R0b20gcmlnaHQgaG90aXpvbnRhbCBvZmZzZXQKK1Jlc3VsdFszXQorCWJvdHRvbSByaWdodCB2ZXJ0aWNhbCBvZmZzZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfU0NSRUVOX0NPT1JEUworRW51bSAJNzMvMHg0OQorRGVzY3JpcHRpb24KKwlBc3NpZ24gdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBzY3JlZW4gYXJlYSB0byBibGVuZCB3aXRoIHZpZGVvCitQYXJhbVswXQorCXRvcCBsZWZ0IGhvcml6b250YWwgb2Zmc2V0CitQYXJhbVsxXQorCXRvcCBsZWZ0IHZlcnRpY2FsIG9mZnNldAorUGFyYW1bMl0KKwlib3R0b20gbGVmdCBob3Jpem9udGFsIG9mZnNldAorUGFyYW1bM10KKwlib3R0b20gbGVmdCB2ZXJ0aWNhbCBvZmZzZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfR0xPQkFMX0FMUEhBCitFbnVtIAk3NC8weDRBCitEZXNjcmlwdGlvbgorCVJldHJpZXZlIE9TRCBnbG9iYWwgYWxwaGEKK1Jlc3VsdFswXQorCWdsb2JhbCBhbHBoYTogMD1vZmYsIDE9b24KK1Jlc3VsdFsxXQorCWJpdHMgMDo3IGdsb2JhbCBhbHBoYQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX1NFVF9HTE9CQUxfQUxQSEEKK0VudW0gCTc1LzB4NEIKK0Rlc2NyaXB0aW9uCisJVXBkYXRlIGdsb2JhbCBhbHBoYQorUGFyYW1bMF0KKwlnbG9iYWwgYWxwaGE6IDA9b2ZmLCAxPW9uCitQYXJhbVsxXQorCWdsb2JhbCBhbHBoYSAoOCBiaXRzKQorUGFyYW1bMl0KKwlsb2NhbCBhbHBoYTogMD1vbiwgMT1vZmYKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfQkxFTkRfQ09PUkRTCitFbnVtIAk3OC8weDRDCitEZXNjcmlwdGlvbgorCU1vdmUgc3RhcnQgb2YgYmxlbmRpbmcgYXJlYSB3aXRoaW4gZGlzcGxheSBidWZmZXIKK1BhcmFtWzBdCisJaG9yaXpvbnRhbCBvZmZzZXQgaW4gYnVmZmVyCitQYXJhbVsxXQorCXZlcnRpY2FsIG9mZnNldCBpbiBidWZmZXIKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9HRVRfRkxJQ0tFUl9TVEFURQorRW51bSAJNzkvMHg0RgorRGVzY3JpcHRpb24KKwlSZXRyaWV2ZSBmbGlja2VyIHJlZHVjdGlvbiBtb2R1bGUgc3RhdGUKK1Jlc3VsdFswXQorCWZsaWNrZXIgc3RhdGU6IDA9b2ZmLCAxPW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX0ZMSUNLRVJfU1RBVEUKK0VudW0gCTgwLzB4NTAKK0Rlc2NyaXB0aW9uCisJU2V0IGZsaWNrZXIgcmVkdWN0aW9uIG1vZHVsZSBzdGF0ZQorUGFyYW1bMF0KKwlTdGF0ZTogMD1vZmYsIDE9b24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9CTFRfQ09QWQorRW51bSAJODIvMHg1MgorRGVzY3JpcHRpb24KKwlCTFQgY29weQorUGFyYW1bMF0KKycwMDAwJyAgemVybworJzAwMDEnIH5kZXN0aW5hdGlvbiBBTkQgfnNvdXJjZQorJzAwMTAnIH5kZXN0aW5hdGlvbiBBTkQgIHNvdXJjZQorJzAwMTEnIH5kZXN0aW5hdGlvbgorJzAxMDAnICBkZXN0aW5hdGlvbiBBTkQgfnNvdXJjZQorJzAxMDEnICAgICAgICAgICAgICAgICAgfnNvdXJjZQorJzAxMTAnICBkZXN0aW5hdGlvbiBYT1IgIHNvdXJjZQorJzAxMTEnIH5kZXN0aW5hdGlvbiBPUiAgfnNvdXJjZQorJzEwMDAnIH5kZXN0aW5hdGlvbiBBTkQgfnNvdXJjZQorJzEwMDEnICBkZXN0aW5hdGlvbiBYTk9SIHNvdXJjZQorJzEwMTAnICAgICAgICAgICAgICAgICAgIHNvdXJjZQorJzEwMTEnIH5kZXN0aW5hdGlvbiBPUiAgIHNvdXJjZQorJzExMDAnICBkZXN0aW5hdGlvbgorJzExMDEnICBkZXN0aW5hdGlvbiBPUiAgfnNvdXJjZQorJzExMTAnICBkZXN0aW5hdGlvbiBPUiAgIHNvdXJjZQorJzExMTEnICBvbmUKKworUGFyYW1bMV0KKwlSZXN1bHRpbmcgYWxwaGEgYmxlbmRpbmcKKwkgICAgJzAxJyBzb3VyY2VfYWxwaGEKKwkgICAgJzEwJyBkZXN0aW5hdGlvbl9hbHBoYQorCSAgICAnMTEnIHNvdXJjZV9hbHBoYSpkZXN0aW5hdGlvbl9hbHBoYSsxCisJCSAoemVybyBpZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWxwaGEgYXJlIHplcm8pCitQYXJhbVsyXQorCScwMCcgb3V0cHV0X3BpeGVsID0gc291cmNlX3BpeGVsCisKKwknMDEnIGlmIHNvdXJjZV9hbHBoYT0wOgorCQkgb3V0cHV0X3BpeGVsID0gZGVzdGluYXRpb25fcGl4ZWwKKwkgICAgIGlmIDI1NiA+IHNvdXJjZV9hbHBoYSA+IDE6CisJCSBvdXRwdXRfcGl4ZWwgPSAoKHNvdXJjZV9hbHBoYSArIDEpKnNvdXJjZV9waXhlbCArCisJCQkJICgyNTUgLSBzb3VyY2VfYWxwaGEpKmRlc3RpbmF0aW9uX3BpeGVsKS8yNTYKKworCScxMCcgaWYgZGVzdGluYXRpb25fYWxwaGE9MDoKKwkJIG91dHB1dF9waXhlbCA9IHNvdXJjZV9waXhlbAorCSAgICAgIGlmIDI1NSA+IGRlc3RpbmF0aW9uX2FscGhhID4gMDoKKwkJIG91dHB1dF9waXhlbCA9ICgoMjU1IC0gZGVzdGluYXRpb25fYWxwaGEpKnNvdXJjZV9waXhlbCArCisJCQkJIChkZXN0aW5hdGlvbl9hbHBoYSArIDEpKmRlc3RpbmF0aW9uX3BpeGVsKS8yNTYKKworCScxMScgaWYgc291cmNlX2FscGhhPTA6CisJCSBzb3VyY2VfdGVtcCA9IDAKKwkgICAgIGlmIHNvdXJjZV9hbHBoYT0yNTU6CisJCSBzb3VyY2VfdGVtcCA9IHNvdXJjZV9waXhlbCoyNTYKKwkgICAgIGlmIDI1NSA+IHNvdXJjZV9hbHBoYSA+IDA6CisJCSBzb3VyY2VfdGVtcCA9IHNvdXJjZV9waXhlbCooc291cmNlX2FscGhhICsgMSkKKwkgICAgIGlmIGRlc3RpbmF0aW9uX2FscGhhPTA6CisJCSBkZXN0aW5hdGlvbl90ZW1wID0gMAorCSAgICAgaWYgZGVzdGluYXRpb25fYWxwaGE9MjU1OgorCQkgZGVzdGluYXRpb25fdGVtcCA9IGRlc3RpbmF0aW9uX3BpeGVsKjI1NgorCSAgICAgaWYgMjU1ID4gZGVzdGluYXRpb25fYWxwaGEgPiAwOgorCQkgZGVzdGluYXRpb25fdGVtcCA9IGRlc3RpbmF0aW9uX3BpeGVsKihkZXN0aW5hdGlvbl9hbHBoYSArIDEpCisJICAgICBvdXRwdXRfcGl4ZWwgPSAoc291cmNlX3RlbXAgKyBkZXN0aW5hdGlvbl90ZW1wKS8yNTYKK1BhcmFtWzNdCisJd2lkdGgKK1BhcmFtWzRdCisJaGVpZ2h0CitQYXJhbVs1XQorCWRlc3RpbmF0aW9uIHBpeGVsIG1hc2sKK1BhcmFtWzZdCisJZGVzdGluYXRpb24gcmVjdGFuZ2xlIHN0YXJ0IGFkZHJlc3MKK1BhcmFtWzddCisJZGVzdGluYXRpb24gc3RyaWRlIGluIGR3b3JkcworUGFyYW1bOF0KKwlzb3VyY2Ugc3RyaWRlIGluIGR3b3JkcworUGFyYW1bOV0KKwlzb3VyY2UgcmVjdGFuZ2xlIHN0YXJ0IGFkZHJlc3MKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9CTFRfRklMTAorRW51bSAJODMvMHg1MworRGVzY3JpcHRpb24KKwlCTFQgZmlsbCBjb2xvcgorUGFyYW1bMF0KKwlTYW1lIGFzIFBhcmFtWzBdIG9uIEFQSSAweDUyCitQYXJhbVsxXQorCVNhbWUgYXMgUGFyYW1bMV0gb24gQVBJIDB4NTIKK1BhcmFtWzJdCisJU2FtZSBhcyBQYXJhbVsyXSBvbiBBUEkgMHg1MgorUGFyYW1bM10KKwl3aWR0aAorUGFyYW1bNF0KKwloZWlnaHQKK1BhcmFtWzVdCisJZGVzdGluYXRpb24gcGl4ZWwgbWFzaworUGFyYW1bNl0KKwlkZXN0aW5hdGlvbiByZWN0YW5nbGUgc3RhcnQgYWRkcmVzcworUGFyYW1bN10KKwlkZXN0aW5hdGlvbiBzdHJpZGUgaW4gZHdvcmRzCitQYXJhbVs4XQorCWNvbG9yIGZpbGwgdmFsdWUKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9CTFRfVEVYVAorRW51bSAJODQvMHg1NAorRGVzY3JpcHRpb24KKwlCTFQgZm9yIDggYml0IGFscGhhIHRleHQgc291cmNlCitQYXJhbVswXQorCVNhbWUgYXMgUGFyYW1bMF0gb24gQVBJIDB4NTIKK1BhcmFtWzFdCisJU2FtZSBhcyBQYXJhbVsxXSBvbiBBUEkgMHg1MgorUGFyYW1bMl0KKwlTYW1lIGFzIFBhcmFtWzJdIG9uIEFQSSAweDUyCitQYXJhbVszXQorCXdpZHRoCitQYXJhbVs0XQorCWhlaWdodAorUGFyYW1bNV0KKwlkZXN0aW5hdGlvbiBwaXhlbCBtYXNrCitQYXJhbVs2XQorCWRlc3RpbmF0aW9uIHJlY3RhbmdsZSBzdGFydCBhZGRyZXNzCitQYXJhbVs3XQorCWRlc3RpbmF0aW9uIHN0cmlkZSBpbiBkd29yZHMKK1BhcmFtWzhdCisJc291cmNlIHN0cmlkZSBpbiBkd29yZHMKK1BhcmFtWzldCisJc291cmNlIHJlY3RhbmdsZSBzdGFydCBhZGRyZXNzCitQYXJhbVsxMF0KKwljb2xvciBmaWxsIHZhbHVlCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfU0VUX0ZSQU1FQlVGRkVSX1dJTkRPVworRW51bSAJODYvMHg1NgorRGVzY3JpcHRpb24KKwlQb3NpdGlvbnMgdGhlIG1haW4gb3V0cHV0IHdpbmRvdyBvbiB0aGUgc2NyZWVuLiBUaGUgY29vcmRpbmF0ZXMgbXVzdCBiZQorCXN1Y2ggdGhhdCB0aGUgZW50aXJlIHdpbmRvdyBmaXRzIG9uIHRoZSBzY3JlZW4uCitQYXJhbVswXQorCXdpbmRvdyB3aWR0aAorUGFyYW1bMV0KKwl3aW5kb3cgaGVpZ2h0CitQYXJhbVsyXQorCXRvcCBsZWZ0IHdpbmRvdyBjb3JuZXIgaG9yaXpvbnRhbCBvZmZzZXQKK1BhcmFtWzNdCisJdG9wIGxlZnQgd2luZG93IGNvcm5lciB2ZXJ0aWNhbCBvZmZzZXQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOYW1lIAlDWDIzNDFYX09TRF9TRVRfQ0hST01BX0tFWQorRW51bSAJOTYvMHg2MAorRGVzY3JpcHRpb24KKwlDaHJvbWEga2V5IHN3aXRjaCBhbmQgY29sb3IKK1BhcmFtWzBdCisJc3RhdGU6IDA9b2ZmLCAxPW9uCitQYXJhbVsxXQorCWNvbG9yCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTmFtZSAJQ1gyMzQxWF9PU0RfR0VUX0FMUEhBX0NPTlRFTlRfSU5ERVgKK0VudW0gCTk3LzB4NjEKK0Rlc2NyaXB0aW9uCisJUmV0cmlldmUgYWxwaGEgY29udGVudCBpbmRleAorUmVzdWx0WzBdCisJYWxwaGEgY29udGVudCBpbmRleCwgUmFuZ2UgMDoxNQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05hbWUgCUNYMjM0MVhfT1NEX1NFVF9BTFBIQV9DT05URU5UX0lOREVYCitFbnVtIAk5OC8weDYyCitEZXNjcmlwdGlvbgorCUFzc2lnbiBhbHBoYSBjb250ZW50IGluZGV4CitQYXJhbVswXQorCWFscGhhIGNvbnRlbnQgaW5kZXgsIHJhbmdlIDA6MTUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy11cGxvYWQudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDIzNDF4L2Z3LXVwbG9hZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjNTAyYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3gyMzQxeC9mdy11cGxvYWQudHh0CkBAIC0wLDAgKzEsNDkgQEAKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byB1cGxvYWQgdGhlIGN4MjM0MXggZmlybXdhcmUgdG8gdGhlIGNhcmQuCisKK0hvdyB0byBmaW5kCis9PT09PT09PT09PQorCitTZWUgdGhlIHdlYiBwYWdlcyBvZiB0aGUgdmFyaW91cyBwcm9qZWN0cyB0aGF0IHVzZXMgdGhpcyBjaGlwIGZvciBpbmZvcm1hdGlvbgorb24gaG93IHRvIG9idGFpbiB0aGUgZmlybXdhcmUuCisKK1RoZSBmaXJtd2FyZSBzdG9yZWQgaW4gYSBXaW5kb3dzIGRyaXZlciBjYW4gYmUgZGV0ZWN0ZWQgYXMgZm9sbG93czoKKworLSBFYWNoIGZpcm13YXJlIGltYWdlIGlzIDI1NmsgYnl0ZXMuCistIFRoZSAxc3QgMzItYml0IHdvcmQgb2YgdGhlIEVuY29kZXIgaW1hZ2UgaXMgMHgwMDAwZGE3CistIFRoZSAxc3QgMzItYml0IHdvcmQgb2YgdGhlIERlY29kZXIgaW1hZ2UgaXMgMHgwMDAwM2E3CistIFRoZSAybmQgMzItYml0IHdvcmQgb2YgYm90aCBpbWFnZXMgaXMgMHhhYTU1YmI2NgorCitIb3cgdG8gbG9hZAorPT09PT09PT09PT0KKworLSBJc3N1ZSB0aGUgRldhcGkgY29tbWFuZCB0byBzdG9wIHRoZSBlbmNvZGVyIGlmIGl0IGlzIHJ1bm5pbmcuIFdhaXQgZm9yIHRoZQorICBjb21tYW5kIHRvIGNvbXBsZXRlLgorLSBJc3N1ZSB0aGUgRldhcGkgY29tbWFuZCB0byBzdG9wIHRoZSBkZWNvZGVyIGlmIGl0IGlzIHJ1bm5pbmcuIFdhaXQgZm9yIHRoZQorICBjb21tYW5kIHRvIGNvbXBsZXRlLgorLSBJc3N1ZSB0aGUgSTJDIGNvbW1hbmQgdG8gdGhlIGRpZ2l0aXplciB0byBzdG9wIGVtaXR0aW5nIFZTWU5DIGV2ZW50cy4KKy0gSXNzdWUgdGhlIEZXYXBpIGNvbW1hbmQgdG8gaGFsdCB0aGUgZW5jb2RlcidzIGZpcm13YXJlLgorLSBTbGVlcCBmb3IgMTBtcy4KKy0gSXNzdWUgdGhlIEZXYXBpIGNvbW1hbmQgdG8gaGFsdCB0aGUgZGVjb2RlcidzIGZpcm13YXJlLgorLSBTbGVlcCBmb3IgMTBtcy4KKy0gV3JpdGUgMHgwMDAwMDAwMCB0byByZWdpc3RlciAweDI4MDAgdG8gc3RvcCB0aGUgVmlkZW8gRGlzcGxheSBNb2R1bGUuCistIFdyaXRlIDB4MDAwMDAwMDUgdG8gcmVnaXN0ZXIgMHgyRDAwIHRvIHN0b3AgdGhlIEFPIChhdWRpbyBvdXRwdXQ/KS4KKy0gV3JpdGUgMHgwMDAwMDAwMCB0byByZWdpc3RlciAweEEwNjQgdG8gcGluZz8gdGhlIEFQVS4KKy0gV3JpdGUgMHhGRkZGRkZGRSB0byByZWdpc3RlciAweDkwNTggdG8gc3RvcCB0aGUgVlBVLgorLSBXcml0ZSAweEZGRkZGRkZGIHRvIHJlZ2lzdGVyIDB4OTA1NCB0byByZXNldCB0aGUgSFcgYmxvY2tzLgorLSBXcml0ZSAweDAwMDAwMDAxIHRvIHJlZ2lzdGVyIDB4OTA1MCB0byBzdG9wIHRoZSBTUFUuCistIFNsZWVwIGZvciAxMG1zLgorLSBXcml0ZSAweDAwMDAwMDFBIHRvIHJlZ2lzdGVyIDB4MDdGQyB0byBpbml0IHRoZSBFbmNvZGVyIFNEUkFNJ3MgcHJlLWNoYXJnZS4KKy0gV3JpdGUgMHg4MDAwMDY0MCB0byByZWdpc3RlciAweDA3RjggdG8gaW5pdCB0aGUgRW5jb2RlciBTRFJBTSdzIHJlZnJlc2ggdG8gMXVzLgorLSBXcml0ZSAweDAwMDAwMDFBIHRvIHJlZ2lzdGVyIDB4MDhGQyB0byBpbml0IHRoZSBEZWNvZGVyIFNEUkFNJ3MgcHJlLWNoYXJnZS4KKy0gV3JpdGUgMHg4MDAwMDY0MCB0byByZWdpc3RlciAweDA4RjggdG8gaW5pdCB0aGUgRGVjb2RlciBTRFJBTSdzIHJlZnJlc2ggdG8gMXVzLgorLSBTbGVlcCBmb3IgNTEybXMuICg2MDBtcyBpcyByZWNvbW1lbmRlZCkKKy0gVHJhbnNmZXIgdGhlIGVuY29kZXIncyBmaXJtd2FyZSBpbWFnZSB0byBvZmZzZXQgMCBpbiBFbmNvZGVyIG1lbW9yeSBzcGFjZS4KKy0gVHJhbnNmZXIgdGhlIGRlY29kZXIncyBmaXJtd2FyZSBpbWFnZSB0byBvZmZzZXQgMCBpbiBEZWNvZGVyIG1lbW9yeSBzcGFjZS4KKy0gVXNlIGEgcmVhZC1tb2RpZnktd3JpdGUgb3BlcmF0aW9uIHRvIENsZWFyIGJpdCAwIG9mIHJlZ2lzdGVyIDB4OTA1MCB0bworICByZS1lbmFibGUgdGhlIFNQVS4KKy0gU2xlZXAgZm9yIDEgc2Vjb25kLgorLSBVc2UgYSByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb24gdG8gQ2xlYXIgYml0cyAzIGFuZCAwIG9mIHJlZ2lzdGVyIDB4OTA1OAorICB0byByZS1lbmFibGUgdGhlIFZQVS4KKy0gU2xlZXAgZm9yIDEgc2Vjb25kLgorLSBJc3N1ZSBzdGF0dXMgQVBJIGNvbW1hbmRzIHRvIGJvdGggZmlybXdhcmUgaW1hZ2VzIHRvIHZlcmlmeS4KKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9jeDg4L2hhdXBwYXVnZS13aW50di1jeDg4LWlyLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3g4OC9oYXVwcGF1Z2Utd2ludHYtY3g4OC1pci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmZWMzMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvY3g4OC9oYXVwcGF1Z2Utd2ludHYtY3g4OC1pci50eHQKQEAgLTAsMCArMSw1NCBAQAorVGhlIGNvbnRyb2xzIGZvciB0aGUgbXV4IGFyZSBHUElPIFswLDFdIGZvciBzb3VyY2UsIGFuZCBHUElPIDIgZm9yIG11dGluZy4KKworR1BJTzAgIEdQSU8xCisgIDAgICAgICAgIDAgICAgVFYgQXVkaW8KKyAgMSAgICAgICAgMCAgICBGTSByYWRpbworICAwICAgICAgICAxICAgIExpbmUtSW4KKyAgMSAgICAgICAgMSAgICBNb25vIHR1bmVyIGJ5cGFzcyBvciBDRCBwYXNzdGhydSAodHVuZXIgc3BlY2lmaWMpCisKK0dQSU8gMTYoaSBiZWxpZXZlKSBpcyB0aWVkIHRvIHRoZSBJUiBwb3J0IChpZiBwcmVzZW50KS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz5Gcm9tIHRoZSBkYXRhIHNoZWV0OgorIFJlZ2lzdGVyIDI0J2gyMDAwNCAgUENJIEludGVycnVwdCBTdGF0dXMKKyAgYml0IFsxOF0gIElSX1NNUF9JTlQgU2V0IHdoZW4gMzIgaW5wdXQgc2FtcGxlcyBoYXZlIGJlZW4gY29sbGVjdGVkIG92ZXIKKyAgZ3Bpb1sxNl0gcGluIGludG8gR1BfU0FNUExFIHJlZ2lzdGVyLgorCitXaGF0J3MgbWlzc2luZyBmcm9tIHRoZSBkYXRhIHNoZWV0OgorCitTZXR1cCA0S0h6IHNhbXBsaW5nIHJhdGUgKHJvdWdobHkgMnggb3ZlcnNhbXBsZWQ7IGdvb2QgZW5vdWdoIGZvciBvdXIgUkM1Citjb21wYXQgcmVtb3RlKQorc2V0IHJlZ2lzdGVyIDB4MzVDMDUwIHRvICAweGE4MGE4MAorCitlbmFibGUgc2FtcGxpbmcKK3NldCByZWdpc3RlciAweDM1QzA1NCB0byAweDUKKworT2YgY291cnNlLCBlbmFibGUgdGhlIElSUSBiaXQgMTggaW4gdGhlIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIC4oYW5kCitwcm92aWRlIGZvciBhIGhhbmRsZXIpCisKK0dQX1NBTVBMRSByZWdpc3RlciBpcyBhdCAweDM1QzA1OAorCitCaXRzIGFyZSB0aGVuIHJpZ2h0IHNoaWZ0ZWQgaW50byB0aGUgR1BfU0FNUExFIHJlZ2lzdGVyIGF0IHRoZSBzcGVjaWZpZWQKK3JhdGU7IHlvdSBnZXQgYW4gaW50ZXJydXB0IHdoZW4gYSBmdWxsIERXT1JEIGlzIHJlY2lldmVkLgorWW91IG5lZWQgdG8gcmVjb3ZlciB0aGUgYWN0dWFsIFJDNSBiaXRzIG91dCBvZiB0aGUgKG92ZXJzYW1wbGVkKSBJUiBzZW5zb3IKK2JpdHMuIChIaW50OiBsb29rIGZvciB0aGUgMC8xYW5kIDEvMCBjcm9zc2luZ3Mgb2YgdGhlIFJDNSBiaS1waGFzZSBkYXRhKSAgQW4KK2FjdHVhbCByYXcgUkM1IGNvZGUgd2lsbCBzcGFuIDItMyBEV09SRFMsIGRlcGVuZGluZyBvbiB0aGUgYWN0dWFsIGFsaWdubWVudC4KKworSSdtIHByZXR0eSBzdXJlIHdoZW4gbm8gSVIgc2lnbmFsIGlzIHByZXNlbnQgdGhlIHJlY2VpdmVyIGlzIGFsd2F5cyBpbiBhCittYXJraW5nIHN0YXRlKDEpOyBidXQgc3RyYXkgbGlnaHQsIGV0YyBjYW4gY2F1c2UgaW50ZXJtaXR0ZW50IG5vaXNlIHZhbHVlcworYXMgd2VsbC4gIFJlbWVtYmVyLCB0aGlzIGlzIGEgZnJlZSBydW5uaW5nIHNhbXBsZSBvZiB0aGUgSVIgcmVjZWl2ZXIgc3RhdGUKK292ZXIgdGltZSwgc28gZG9uJ3QgYXNzdW1lIGFueSBzYW1wbGUgc3RhcnRzIGF0IGFueSBwYXJ0aWN1bGFyIHBsYWNlLgorCitodHRwOi8vd3d3LmF0bWVsLmNvbS9keW4vcmVzb3VyY2VzL3Byb2RfZG9jdW1lbnRzL2RvYzI4MTcucGRmCitUaGlzIGRhdGEgc2hlZXQgKGdvb2dsZSBzZWFyY2gpIHNlZW1zIHRvIGhhdmUgYSBsb3ZlbHkgZGVzY3JpcHRpb24gb2YgdGhlCitSQzUgYmFzaWNzCisKK2h0dHA6Ly91c2Vycy5wYW5kb3JhLmJlL25lbnlhL2VsZWN0cm9uaWNzL3JjNS8gIGFuZCBtb3JlIGRhdGEKKworaHR0cDovL3d3dy5lZS53YXNoaW5ndG9uLmVkdS9jaXJjdWl0X2FyY2hpdmUvdGV4dC9pcl9kZWNvZGUudHh0CithbmQgZXZlbiBhIHJlZmVyZW5jZSB0byBob3cgdG8gZGVjb2RlIGEgYmktcGhhc2UgZGF0YSBzdHJlYW0uCisKK2h0dHA6Ly93d3cueHM0YWxsLm5sL35zYnAva25vd2xlZGdlL2lyL3JjNS5odG0KK3N0aWxsIG1vcmUgaW5mbworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2V0NjF4MjUxLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZXQ2MXgyNTEudHh0CmluZGV4IDI5MzQwMjguLmNkNTg0ZjIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZXQ2MXgyNTEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvZXQ2MXgyNTEudHh0CkBAIC0xLDkgKzEsOSBAQAogCi0gICAgICAgICAgICAgICAgICAgICAgIEVUNjFYWzEyXTUxIFBDIENhbWVyYSBDb250cm9sbGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgZm9yIExpbnV4Ci0gICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkgICAgICAgRVQ2MVhbMTJdNTEgUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisJCQkJRHJpdmVyIGZvciBMaW51eAorCQkgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERvY3VtZW50YXRpb24gLQorCQkJICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCiAKIAogSW5kZXgKQEAgLTE1Niw0NiArMTU2LDQ2IEBACiBUeXBlOiAgICAgICAgICAgc2hvcnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDwtMXxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNwZWNpZnkgVjRMMiBtaW5vciBtb2RlIG51bWJlcjoKLSAgICAgICAgICAgICAgICAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICBuID0gdXNlIG1pbm9yIG51bWJlciBuCi0gICAgICAgICAgICAgICAgWW91IGNhbiBzcGVjaWZ5IHVwIHRvIDY0IGNhbWVyYXMgdGhpcyB3YXkuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAotICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IG9uZSBhbmQgZm9yIGV2ZXJ5Ci0gICAgICAgICAgICAgICAgb3RoZXIgY2FtZXJhLgorCQktMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQorCQkgbiA9IHVzZSBtaW5vciBudW1iZXIgbgorCQlZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KKwkJRm9yIGV4YW1wbGU6CisJCXZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIHRoZSBzZWNvbmQKKwkJcmVnaXN0ZXJlZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKKwkJb3RoZXIgY2FtZXJhLgogRGVmYXVsdDogICAgICAgIC0xCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZm9yY2VfbXVubWFwCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBGb3JjZSB0aGUgYXBwbGljYXRpb24gdG8gdW5tYXAgcHJldmlvdXNseSBtYXBwZWQgYnVmZmVyIG1lbW9yeQotICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKLSAgICAgICAgICAgICAgICBhbGwgdGhlIGFwcGxpY2F0aW9ucyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCi0gICAgICAgICAgICAgICAgMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCi0gICAgICAgICAgICAgICAgMSA9IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcgKHNhdmUgbWVtb3J5KQorCQliZWZvcmUgY2FsbGluZyBhbnkgVklESU9DX1NfQ1JPUCBvciBWSURJT0NfU19GTVQgaW9jdGwncy4gTm90CisJCWFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcworCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCisJCTAgPSBkbyBub3QgZm9yY2UgbWVtb3J5IHVubWFwcGluZworCQkxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCiBEZWZhdWx0OiAgICAgICAgMAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGZyYW1lX3RpbWVvdXQKIFR5cGU6ICAgICAgICAgICB1aW50IGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBUaW1lb3V0IGZvciBhIHZpZGVvIGZyYW1lIGluIHNlY29uZHMuIFRoaXMgcGFyYW1ldGVyIGlzCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgZm9yIGVhY2ggZGV0ZWN0ZWQgY2FtZXJhLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgorCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorCQljaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBkZWJ1ZwogVHlwZTogICAgICAgICAgIHVzaG9ydAogU3ludGF4OiAgICAgICAgIDxuPgogRGVzY3JpcHRpb246ICAgIERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDM6Ci0gICAgICAgICAgICAgICAgMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCi0gICAgICAgICAgICAgICAgMSA9IGNyaXRpY2FsIGVycm9ycwotICAgICAgICAgICAgICAgIDIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKLSAgICAgICAgICAgICAgICAzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgTGV2ZWwgMyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5IG9uZSBkZXZpY2UKLSAgICAgICAgICAgICAgICBpcyB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucwotICAgICAgICAgICAgICAgIGFib3V0IHRoZSBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4gVGhpcyBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZQotICAgICAgICAgICAgICAgIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCTAgPSBub25lICh1c2UgY2FyZWZ1bGx5KQorCQkxID0gY3JpdGljYWwgZXJyb3JzCisJCTIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKKwkJMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcworCQlMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQorCQlpcyB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucworCQlhYm91dCB0aGUgaGFyZHdhcmUgYmVpbmcgZGV0ZWN0ZWQuIFRoaXMgbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUKKwkJY2hhbmdlZCBhdCBydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KIERlZmF1bHQ6ICAgICAgICAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvaWJtY2FtLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvaWJtY2FtLnR4dAppbmRleCA0YTQwYTJlLi4zOTdhOTRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L2libWNhbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9pYm1jYW0udHh0CkBAIC0yMSw3ICsyMSw3IEBACiBTdXBwb3J0ZWQgY29udHJvbHM6CiAtIGJ5IFY0TDogQ29udHJhc3QsICBCcmlnaHRuZXNzLCBDb2xvciwgSHVlCiAtIGJ5IGRyaXZlciBvcHRpb25zOiBmcmFtZSByYXRlLCBsaWdodGluZyBjb25kaXRpb25zLCB2aWRlbyBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHBpY3R1cmUgc2V0dGluZ3MsIHNoYXJwbmVzcy4KKwkJICAgICBkZWZhdWx0IHBpY3R1cmUgc2V0dGluZ3MsIHNoYXJwbmVzcy4KIAogU1VQUE9SVEVEIENBTUVSQVM6CiAKQEAgLTE5MSw2NiArMTkxLDY2IEBACiBpbml0X21vZGVsMl95YiAgSW50ZWdlciAgICAgICAgIDAuLjI1NSBbMHhhMF0gICBpbml0X21vZGVsMl95Yj0yMDAKIAogZGVidWcgICAgICAgICAgIFlvdSBkb24ndCBuZWVkIHRoaXMgb3B0aW9uIHVubGVzcyB5b3UgYXJlIGEgZGV2ZWxvcGVyLgotICAgICAgICAgICAgICAgIElmIHlvdSBhcmUgYSBkZXZlbG9wZXIgdGhlbiB5b3Ugd2lsbCBzZWUgaW4gdGhlIGNvZGUKLSAgICAgICAgICAgICAgICB3aGF0IHZhbHVlcyBkbyB3aGF0LiAwPW9mZi4KKwkJSWYgeW91IGFyZSBhIGRldmVsb3BlciB0aGVuIHlvdSB3aWxsIHNlZSBpbiB0aGUgY29kZQorCQl3aGF0IHZhbHVlcyBkbyB3aGF0LiAwPW9mZi4KIAogZmxhZ3MgICAgICAgICAgIFRoaXMgaXMgYSBiaXQgbWFzaywgYW5kIHlvdSBjYW4gY29tYmluZSBhbnkgbnVtYmVyIG9mCi0gICAgICAgICAgICAgICAgYml0cyB0byBwcm9kdWNlIHdoYXQgeW91IHdhbnQuIFVzdWFsbHkgeW91IGRvbid0IHdhbnQKLSAgICAgICAgICAgICAgICBhbnkgb2YgZXh0cmEgZmVhdHVyZXMgdGhpcyBvcHRpb24gcHJvdmlkZXM6CisJCWJpdHMgdG8gcHJvZHVjZSB3aGF0IHlvdSB3YW50LiBVc3VhbGx5IHlvdSBkb24ndCB3YW50CisJCWFueSBvZiBleHRyYSBmZWF0dXJlcyB0aGlzIG9wdGlvbiBwcm92aWRlczoKIAotICAgICAgICAgICAgICAgIEZMQUdTX1JFVFJZX1ZJRElPQ1NZTkMgIDEgIFRoaXMgYml0IGFsbG93cyB0byByZXRyeSBmYWlsZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSURJT0NTWU5DIGlvY3RscyB3aXRob3V0IGZhaWxpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lsbCB3b3JrIHdpdGggeGF3dHYsIHdpbGwgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB4cmVhbHByb2R1Y2VyLiBEZWZhdWx0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNldC4KLSAgICAgICAgICAgICAgICBGTEFHU19NT05PQ0hST01FICAgICAgICAyICBBY3RpdmF0ZXMgbW9ub2Nocm9tZSAoYi93KSBtb2RlLgotICAgICAgICAgICAgICAgIEZMQUdTX0RJU1BMQVlfSElOVFMgICAgIDQgIFNob3dzIGNvbG9yZWQgcGl4ZWxzIHdoaWNoIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWdpYyBtZWFuaW5nIHRvIGRldmVsb3BlcnMuCi0gICAgICAgICAgICAgICAgRkxBR1NfT1ZFUkxBWV9TVEFUUyAgICAgOCAgU2hvd3MgdGlueSBudW1iZXJzIG9uIHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgb25seSBmb3IgZGVidWdnaW5nLgotICAgICAgICAgICAgICAgIEZMQUdTX0ZPUkNFX1RFU1RQQVRURVJOIDE2IFNob3dzIGJsdWUgc2NyZWVuIHdpdGggbnVtYmVycy4KLSAgICAgICAgICAgICAgICBGTEFHU19TRVBBUkFURV9GUkFNRVMgICAzMiBTaG93cyBlYWNoIGZyYW1lIHNlcGFyYXRlbHksIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgd2FzIHJlY2VpdmVkIGZyb20gdGhlIGNhbWVyYS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IChub3Qgc2V0KSBpcyB0byBtaXggdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2VkaW5nIGZyYW1lIGluIHRvIGNvbXBlbnNhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igb2NjYXNpb25hbCBsb3NzIG9mIElzb2MgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGhpZ2ggZnJhbWUgcmF0ZXMuCi0gICAgICAgICAgICAgICAgRkxBR1NfQ0xFQU5fRlJBTUVTICAgICAgNjQgRm9yY2VzICJjbGVhbnVwIiBvZiBlYWNoIGZyYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgdG8gdXNlOyByZWxldmFudCBvbmx5IGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxBR1NfU0VQQVJBVEVfRlJBTUVTIGlzIHNldC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGlzIG5vdCB0byBjbGVhbiBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBhIGxpdHRsZSBmYXN0ZXIgYnV0IG1heQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2UgZmxpY2tlciBpZiBmcmFtZSByYXRlIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vIGhpZ2ggYW5kIElzb2MgZGF0YSBnZXRzIGxvc3QuCi0gICAgICAgICAgICAgICAgRkxBR1NfTk9fREVDT0RJTkcgICAgICAxMjggVGhpcyBmbGFnIHR1cm5zIHRoZSB2aWRlbyBzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyIG9mZiwgYW5kIGR1bXBzIHRoZSByYXcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc29jIGRhdGEgZnJvbSB0aGUgY2FtZXJhIGludG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVhZGluZyBwcm9jZXNzLiBVc2VmdWwgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZlbG9wZXJzLCBidXQgbm90IHRvIHVzZXJzLgorCQlGTEFHU19SRVRSWV9WSURJT0NTWU5DICAxICBUaGlzIGJpdCBhbGxvd3MgdG8gcmV0cnkgZmFpbGVkCisJCQkJCSAgIFZJRElPQ1NZTkMgaW9jdGxzIHdpdGhvdXQgZmFpbGluZy4KKwkJCQkJICAgV2lsbCB3b3JrIHdpdGggeGF3dHYsIHdpbGwgbm90CisJCQkJCSAgIHdpdGggeHJlYWxwcm9kdWNlci4gRGVmYXVsdCBpcworCQkJCQkgICBub3Qgc2V0LgorCQlGTEFHU19NT05PQ0hST01FICAgICAgICAyICBBY3RpdmF0ZXMgbW9ub2Nocm9tZSAoYi93KSBtb2RlLgorCQlGTEFHU19ESVNQTEFZX0hJTlRTICAgICA0ICBTaG93cyBjb2xvcmVkIHBpeGVscyB3aGljaCBoYXZlCisJCQkJCSAgIG1hZ2ljIG1lYW5pbmcgdG8gZGV2ZWxvcGVycy4KKwkJRkxBR1NfT1ZFUkxBWV9TVEFUUyAgICAgOCAgU2hvd3MgdGlueSBudW1iZXJzIG9uIHNjcmVlbiwKKwkJCQkJICAgdXNlZnVsIG9ubHkgZm9yIGRlYnVnZ2luZy4KKwkJRkxBR1NfRk9SQ0VfVEVTVFBBVFRFUk4gMTYgU2hvd3MgYmx1ZSBzY3JlZW4gd2l0aCBudW1iZXJzLgorCQlGTEFHU19TRVBBUkFURV9GUkFNRVMgICAzMiBTaG93cyBlYWNoIGZyYW1lIHNlcGFyYXRlbHksIGFzCisJCQkJCSAgIGl0IHdhcyByZWNlaXZlZCBmcm9tIHRoZSBjYW1lcmEuCisJCQkJCSAgIERlZmF1bHQgKG5vdCBzZXQpIGlzIHRvIG1peCB0aGUKKwkJCQkJICAgcHJlY2VkaW5nIGZyYW1lIGluIHRvIGNvbXBlbnNhdGUKKwkJCQkJICAgZm9yIG9jY2FzaW9uYWwgbG9zcyBvZiBJc29jIGRhdGEKKwkJCQkJICAgb24gaGlnaCBmcmFtZSByYXRlcy4KKwkJRkxBR1NfQ0xFQU5fRlJBTUVTICAgICAgNjQgRm9yY2VzICJjbGVhbnVwIiBvZiBlYWNoIGZyYW1lCisJCQkJCSAgIHByaW9yIHRvIHVzZTsgcmVsZXZhbnQgb25seSBpZgorCQkJCQkgICBGTEFHU19TRVBBUkFURV9GUkFNRVMgaXMgc2V0LgorCQkJCQkgICBEZWZhdWx0IGlzIG5vdCB0byBjbGVhbiBmcmFtZXMsCisJCQkJCSAgIHRoaXMgaXMgYSBsaXR0bGUgZmFzdGVyIGJ1dCBtYXkKKwkJCQkJICAgcHJvZHVjZSBmbGlja2VyIGlmIGZyYW1lIHJhdGUgaXMKKwkJCQkJICAgdG9vIGhpZ2ggYW5kIElzb2MgZGF0YSBnZXRzIGxvc3QuCisJCUZMQUdTX05PX0RFQ09ESU5HICAgICAgMTI4IFRoaXMgZmxhZyB0dXJucyB0aGUgdmlkZW8gc3RyZWFtCisJCQkJCSAgIGRlY29kZXIgb2ZmLCBhbmQgZHVtcHMgdGhlIHJhdworCQkJCQkgICBJc29jIGRhdGEgZnJvbSB0aGUgY2FtZXJhIGludG8KKwkJCQkJICAgdGhlIHJlYWRpbmcgcHJvY2Vzcy4gVXNlZnVsIHRvCisJCQkJCSAgIGRldmVsb3BlcnMsIGJ1dCBub3QgdG8gdXNlcnMuCiAKIGZyYW1lcmF0ZSAgICAgICBUaGlzIHNldHRpbmcgY29udHJvbHMgZnJhbWUgcmF0ZSBvZiB0aGUgY2FtZXJhLiBUaGlzIGlzCi0gICAgICAgICAgICAgICAgYW4gYXBwcm94aW1hdGUgc2V0dGluZyAoaW4gdGVybXMgb2YgIndvcnN0IiAuLi4gImJlc3QiKQotICAgICAgICAgICAgICAgIGJlY2F1c2UgY2FtZXJhIGNoYW5nZXMgZnJhbWUgcmF0ZSBkZXBlbmRpbmcgb24gYW1vdW50Ci0gICAgICAgICAgICAgICAgb2YgbGlnaHQgYXZhaWxhYmxlLiBTZXR0aW5nIDAgaXMgc2xvd2VzdCwgNiBpcyBmYXN0ZXN0LgotICAgICAgICAgICAgICAgIEJld2FyZSAtIGZhc3Qgc2V0dGluZ3MgYXJlIHZlcnkgZGVtYW5kaW5nIGFuZCBtYXkgbm90Ci0gICAgICAgICAgICAgICAgd29yayB3ZWxsIHdpdGggYWxsIHZpZGVvIHNpemVzLiBCZSBjb25zZXJ2YXRpdmUuCisJCWFuIGFwcHJveGltYXRlIHNldHRpbmcgKGluIHRlcm1zIG9mICJ3b3JzdCIgLi4uICJiZXN0IikKKwkJYmVjYXVzZSBjYW1lcmEgY2hhbmdlcyBmcmFtZSByYXRlIGRlcGVuZGluZyBvbiBhbW91bnQKKwkJb2YgbGlnaHQgYXZhaWxhYmxlLiBTZXR0aW5nIDAgaXMgc2xvd2VzdCwgNiBpcyBmYXN0ZXN0LgorCQlCZXdhcmUgLSBmYXN0IHNldHRpbmdzIGFyZSB2ZXJ5IGRlbWFuZGluZyBhbmQgbWF5IG5vdAorCQl3b3JrIHdlbGwgd2l0aCBhbGwgdmlkZW8gc2l6ZXMuIEJlIGNvbnNlcnZhdGl2ZS4KIAogaHVlX2NvcnJlY3Rpb24gIFRoaXMgaGlnaGx5IG9wdGlvbmFsIHNldHRpbmcgYWxsb3dzIHRvIGFkanVzdCB0aGUKLSAgICAgICAgICAgICAgICBodWUgb2YgdGhlIGltYWdlIGluIGEgd2F5IHNsaWdodGx5IGRpZmZlcmVudCBmcm9tCi0gICAgICAgICAgICAgICAgd2hhdCB1c3VhbCAiaHVlIiBjb250cm9sIGRvZXMuIEJvdGggY29udHJvbHMgYWZmZWN0Ci0gICAgICAgICAgICAgICAgWVVWIGNvbG9yc3BhY2U6IHJlZ3VsYXIgImh1ZSIgY29udHJvbCBhZGp1c3RzIG9ubHkKLSAgICAgICAgICAgICAgICBVIGNvbXBvbmVudCwgYW5kIHRoaXMgImh1ZV9jb3JyZWN0aW9uIiBvcHRpb24gc2ltaWxhcmx5Ci0gICAgICAgICAgICAgICAgYWRqdXN0cyBvbmx5IFYgY29tcG9uZW50LiBIb3dldmVyIHVzdWFsbHkgaXQgaXMgZW5vdWdoCi0gICAgICAgICAgICAgICAgdG8gdHdlYWsgb25seSBVIG9yIFYgdG8gY29tcGVuc2F0ZSBmb3IgY29sb3JlZCBsaWdodCBvcgotICAgICAgICAgICAgICAgIGNvbG9yIHRlbXBlcmF0dXJlOyB0aGlzIG9wdGlvbiBzaW1wbHkgYWxsb3dzIG1vcmUKLSAgICAgICAgICAgICAgICBjb21wbGljYXRlZCBjb3JyZWN0aW9uIHdoZW4gYW5kIGlmIGl0IGlzIG5lY2Vzc2FyeS4KKwkJaHVlIG9mIHRoZSBpbWFnZSBpbiBhIHdheSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbQorCQl3aGF0IHVzdWFsICJodWUiIGNvbnRyb2wgZG9lcy4gQm90aCBjb250cm9scyBhZmZlY3QKKwkJWVVWIGNvbG9yc3BhY2U6IHJlZ3VsYXIgImh1ZSIgY29udHJvbCBhZGp1c3RzIG9ubHkKKwkJVSBjb21wb25lbnQsIGFuZCB0aGlzICJodWVfY29ycmVjdGlvbiIgb3B0aW9uIHNpbWlsYXJseQorCQlhZGp1c3RzIG9ubHkgViBjb21wb25lbnQuIEhvd2V2ZXIgdXN1YWxseSBpdCBpcyBlbm91Z2gKKwkJdG8gdHdlYWsgb25seSBVIG9yIFYgdG8gY29tcGVuc2F0ZSBmb3IgY29sb3JlZCBsaWdodCBvcgorCQljb2xvciB0ZW1wZXJhdHVyZTsgdGhpcyBvcHRpb24gc2ltcGx5IGFsbG93cyBtb3JlCisJCWNvbXBsaWNhdGVkIGNvcnJlY3Rpb24gd2hlbiBhbmQgaWYgaXQgaXMgbmVjZXNzYXJ5LgogCiBpbml0X2JyaWdodG5lc3MgVGhlc2Ugc2V0dGluZ3Mgc3BlY2lmeSBfaW5pdGlhbF8gdmFsdWVzIHdoaWNoIHdpbGwgYmUKIGluaXRfY29udHJhc3QgICB1c2VkIHRvIHNldCB1cCB0aGUgY2FtZXJhLiBJZiB5b3VyIFY0TCBhcHBsaWNhdGlvbiBoYXMKIGluaXRfY29sb3IgICAgICBpdHMgb3duIGNvbnRyb2xzIHRvIGFkanVzdCB0aGUgcGljdHVyZSB0aGVuIHRoZXNlCiBpbml0X2h1ZSAgICAgICAgY29udHJvbHMgd2lsbCBiZSB1c2VkIHRvby4gVGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8KLSAgICAgICAgICAgICAgICBwcmVjb25maWd1cmUgdGhlIGNhbWVyYSB3aGVuIGl0IGdldHMgY29ubmVjdGVkLCBiZWZvcmUKLSAgICAgICAgICAgICAgICBhbnkgVjRMIGFwcGxpY2F0aW9uIGNvbm5lY3RzIHRvIGl0LiBHb29kIGZvciB3ZWJjYW1zLgorCQlwcmVjb25maWd1cmUgdGhlIGNhbWVyYSB3aGVuIGl0IGdldHMgY29ubmVjdGVkLCBiZWZvcmUKKwkJYW55IFY0TCBhcHBsaWNhdGlvbiBjb25uZWN0cyB0byBpdC4gR29vZCBmb3Igd2ViY2Ftcy4KIAogaW5pdF9tb2RlbDJfcmcgIFRoZXNlIGluaXRpYWwgc2V0dGluZ3MgYWx0ZXIgY29sb3IgYmFsYW5jZSBvZiB0aGUKIGluaXRfbW9kZWwyX3JnMiBjYW1lcmEgb24gaGFyZHdhcmUgbGV2ZWwuIEFsbCBmb3VyIHNldHRpbmdzIG1heSBiZSB1c2VkCkBAIC0yNTgsNDcgKzI1OCw0NyBAQAogaW5pdF9tb2RlbDJfeWIgIHNldHRpbmdzIG9ubHkgYXBwbHkgdG8gTW9kZWwgMiBjYW1lcmFzLgogCiBsaWdodGluZyAgICAgICAgVGhpcyBvcHRpb24gc2VsZWN0cyBvbmUgb2YgdGhyZWUgaGFyZHdhcmUtZGVmaW5lZAotICAgICAgICAgICAgICAgIHBob3Rvc2Vuc2l0aXZpdHkgc2V0dGluZ3Mgb2YgdGhlIGNhbWVyYS4gMD1icmlnaHQgbGlnaHQsCi0gICAgICAgICAgICAgICAgMT1NZWRpdW0gKGRlZmF1bHQpLCAyPUxvdyBsaWdodC4gVGhpcyBzZXR0aW5nIGFmZmVjdHMKLSAgICAgICAgICAgICAgICBmcmFtZSByYXRlOiB0aGUgZGltbWVyIHRoZSBsaWdodGluZyB0aGUgbG93ZXIgdGhlIGZyYW1lCi0gICAgICAgICAgICAgICAgcmF0ZSAoYmVjYXVzZSBsb25nZXIgZXhwb3NpdGlvbiB0aW1lIGlzIG5lZWRlZCkuIFRoZQotICAgICAgICAgICAgICAgIE1vZGVsIDIgY2FtZXJhcyBhbGxvdyB2YWx1ZXMgbW9yZSB0aGFuIDIgZm9yIHRoaXMgb3B0aW9uLAotICAgICAgICAgICAgICAgIHRodXMgZW5hYmxpbmcgZXh0cmVtZWx5IGhpZ2ggc2Vuc2l0aXZpdHkgYXQgY29zdCBvZiBmcmFtZQotICAgICAgICAgICAgICAgIHJhdGUsIGNvbG9yIHNhdHVyYXRpb24gYW5kIGltYWdpbmcgc2Vuc29yIG5vaXNlLgorCQlwaG90b3NlbnNpdGl2aXR5IHNldHRpbmdzIG9mIHRoZSBjYW1lcmEuIDA9YnJpZ2h0IGxpZ2h0LAorCQkxPU1lZGl1bSAoZGVmYXVsdCksIDI9TG93IGxpZ2h0LiBUaGlzIHNldHRpbmcgYWZmZWN0cworCQlmcmFtZSByYXRlOiB0aGUgZGltbWVyIHRoZSBsaWdodGluZyB0aGUgbG93ZXIgdGhlIGZyYW1lCisJCXJhdGUgKGJlY2F1c2UgbG9uZ2VyIGV4cG9zaXRpb24gdGltZSBpcyBuZWVkZWQpLiBUaGUKKwkJTW9kZWwgMiBjYW1lcmFzIGFsbG93IHZhbHVlcyBtb3JlIHRoYW4gMiBmb3IgdGhpcyBvcHRpb24sCisJCXRodXMgZW5hYmxpbmcgZXh0cmVtZWx5IGhpZ2ggc2Vuc2l0aXZpdHkgYXQgY29zdCBvZiBmcmFtZQorCQlyYXRlLCBjb2xvciBzYXR1cmF0aW9uIGFuZCBpbWFnaW5nIHNlbnNvciBub2lzZS4KIAogc2hhcnBuZXNzICAgICAgIFRoaXMgb3B0aW9uIGNvbnRyb2xzIHNtb290aGluZyAobm9pc2UgcmVkdWN0aW9uKQotICAgICAgICAgICAgICAgIG1hZGUgYnkgY2FtZXJhLiBTZXR0aW5nIDAgaXMgbW9zdCBzbW9vdGgsIHNldHRpbmcgNgotICAgICAgICAgICAgICAgIGlzIG1vc3Qgc2hhcnAuIEJlIGF3YXJlIHRoYXQgQ01PUyBzZW5zb3IgdXNlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICBjYW1lcmEgaXMgcHJldHR5IG5vaXN5LCBzbyBpZiB5b3UgY2hvb3NlIDYgeW91IHdpbGwKLSAgICAgICAgICAgICAgICBiZSBncmVldGVkIHdpdGggInNub3d5IiBpbWFnZS4gRGVmYXVsdCBpcyA0LiBNb2RlbCAyCi0gICAgICAgICAgICAgICAgY2FtZXJhcyBkbyBub3Qgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisJCW1hZGUgYnkgY2FtZXJhLiBTZXR0aW5nIDAgaXMgbW9zdCBzbW9vdGgsIHNldHRpbmcgNgorCQlpcyBtb3N0IHNoYXJwLiBCZSBhd2FyZSB0aGF0IENNT1Mgc2Vuc29yIHVzZWQgaW4gdGhlCisJCWNhbWVyYSBpcyBwcmV0dHkgbm9pc3ksIHNvIGlmIHlvdSBjaG9vc2UgNiB5b3Ugd2lsbAorCQliZSBncmVldGVkIHdpdGggInNub3d5IiBpbWFnZS4gRGVmYXVsdCBpcyA0LiBNb2RlbCAyCisJCWNhbWVyYXMgZG8gbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLgogCiBzaXplICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNob29zZXMgb25lIG9mIHNldmVyYWwgaW1hZ2Ugc2l6ZXMgdGhhdCBhcmUKLSAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuIENhbWVyYXMgbWF5IHN1cHBvcnQgbW9yZSwgYnV0Ci0gICAgICAgICAgICAgICAgaXQncyBkaWZmaWN1bHQgdG8gcmV2ZXJzZS1lbmdpbmVlciBhbGwgZm9ybWF0cy4KLSAgICAgICAgICAgICAgICBGb2xsb3dpbmcgdmlkZW8gc2l6ZXMgYXJlIHN1cHBvcnRlZDoKKwkJc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyLiBDYW1lcmFzIG1heSBzdXBwb3J0IG1vcmUsIGJ1dAorCQlpdCdzIGRpZmZpY3VsdCB0byByZXZlcnNlLWVuZ2luZWVyIGFsbCBmb3JtYXRzLgorCQlGb2xsb3dpbmcgdmlkZW8gc2l6ZXMgYXJlIHN1cHBvcnRlZDoKIAotICAgICAgICAgICAgICAgIHNpemU9MCAgICAgMTI4eDk2ICAoTW9kZWwgMSBvbmx5KQotICAgICAgICAgICAgICAgIHNpemU9MSAgICAgMTYweDEyMAotICAgICAgICAgICAgICAgIHNpemU9MiAgICAgMTc2eDE0NAotICAgICAgICAgICAgICAgIHNpemU9MyAgICAgMzIweDI0MCAoTW9kZWwgMiBvbmx5KQotICAgICAgICAgICAgICAgIHNpemU9NCAgICAgMzUyeDI0MCAoTW9kZWwgMiBvbmx5KQotICAgICAgICAgICAgICAgIHNpemU9NSAgICAgMzUyeDI4OAotICAgICAgICAgICAgICAgIHNpemU9NiAgICAgNjQweDQ4MCAoTW9kZWwgMyBvbmx5KQorCQlzaXplPTAgICAgIDEyOHg5NiAgKE1vZGVsIDEgb25seSkKKwkJc2l6ZT0xICAgICAxNjB4MTIwCisJCXNpemU9MiAgICAgMTc2eDE0NAorCQlzaXplPTMgICAgIDMyMHgyNDAgKE1vZGVsIDIgb25seSkKKwkJc2l6ZT00ICAgICAzNTJ4MjQwIChNb2RlbCAyIG9ubHkpCisJCXNpemU9NSAgICAgMzUyeDI4OAorCQlzaXplPTYgICAgIDY0MHg0ODAgKE1vZGVsIDMgb25seSkKIAotICAgICAgICAgICAgICAgIFRoZSAzNTJ4Mjg4IGlzIHRoZSBuYXRpdmUgc2l6ZSBvZiB0aGUgTW9kZWwgMSBzZW5zb3IKLSAgICAgICAgICAgICAgICBhcnJheSwgc28gaXQncyB0aGUgYmVzdCByZXNvbHV0aW9uIHRoZSBjYW1lcmEgY2FuCi0gICAgICAgICAgICAgICAgeWllbGQuIFRoZSBiZXN0IHJlc29sdXRpb24gb2YgTW9kZWwgMiBpcyAxNzZ4MTQ0LCBhbmQKLSAgICAgICAgICAgICAgICBsYXJnZXIgaW1hZ2VzIGFyZSBwcm9kdWNlZCBieSBzdHJldGNoaW5nIHRoZSBiaXRtYXAuCi0gICAgICAgICAgICAgICAgTW9kZWwgMyBoYXMgc2Vuc29yIHdpdGggNjQweDQ4MCBncmlkLCBhbmQgaXQgd29ya3MgdG9vLAotICAgICAgICAgICAgICAgIGJ1dCB0aGUgZnJhbWUgcmF0ZSB3aWxsIGJlIGV4Y2VwdGlvbmFsbHkgbG93ICgxLTIgRlBTKTsKLSAgICAgICAgICAgICAgICBpdCBtYXkgYmUgc3RpbGwgT0sgZm9yIHNvbWUgYXBwbGljYXRpb25zLCBsaWtlIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgIENob29zZSB0aGUgaW1hZ2Ugc2l6ZSB5b3UgbmVlZC4gVGhlIHNtYWxsZXIgaW1hZ2UgY2FuCi0gICAgICAgICAgICAgICAgc3VwcG9ydCBmYXN0ZXIgZnJhbWUgcmF0ZS4gRGVmYXVsdCBpcyAzNTJ4Mjg4LgorCQlUaGUgMzUyeDI4OCBpcyB0aGUgbmF0aXZlIHNpemUgb2YgdGhlIE1vZGVsIDEgc2Vuc29yCisJCWFycmF5LCBzbyBpdCdzIHRoZSBiZXN0IHJlc29sdXRpb24gdGhlIGNhbWVyYSBjYW4KKwkJeWllbGQuIFRoZSBiZXN0IHJlc29sdXRpb24gb2YgTW9kZWwgMiBpcyAxNzZ4MTQ0LCBhbmQKKwkJbGFyZ2VyIGltYWdlcyBhcmUgcHJvZHVjZWQgYnkgc3RyZXRjaGluZyB0aGUgYml0bWFwLgorCQlNb2RlbCAzIGhhcyBzZW5zb3Igd2l0aCA2NDB4NDgwIGdyaWQsIGFuZCBpdCB3b3JrcyB0b28sCisJCWJ1dCB0aGUgZnJhbWUgcmF0ZSB3aWxsIGJlIGV4Y2VwdGlvbmFsbHkgbG93ICgxLTIgRlBTKTsKKwkJaXQgbWF5IGJlIHN0aWxsIE9LIGZvciBzb21lIGFwcGxpY2F0aW9ucywgbGlrZSBzZWN1cml0eS4KKwkJQ2hvb3NlIHRoZSBpbWFnZSBzaXplIHlvdSBuZWVkLiBUaGUgc21hbGxlciBpbWFnZSBjYW4KKwkJc3VwcG9ydCBmYXN0ZXIgZnJhbWUgcmF0ZS4gRGVmYXVsdCBpcyAzNTJ4Mjg4LgogCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdGhlIFRyb3VibGVzaG9vdGluZyBGQVEgdmlzaXQgdGhpcyBVUkw6CiAKLSAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvaWJtY2FtLworCQlodHRwOi8vd3d3LmxpbnV4LXVzYi5vcmcvaWJtY2FtLwogCiBXSEFUIE5FRURTIFRPIEJFIERPTkU6CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvb3Y1MTEudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9vdjUxMS50eHQKaW5kZXggMTQyNzQxZS4uNzlhZjYxMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9vdjUxMS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9vdjUxMS50eHQKQEAgLTgxLDcgKzgxLDcgQEAKICAgVFlQRTogaW50ZWdlciAoQm9vbGVhbikKICAgREVGQVVMVDogMQogICBERVNDOiBCcmlnaHRuZXNzIGlzIG5vcm1hbGx5IHVuZGVyIGF1dG9tYXRpYyBjb250cm9sIGFuZCBjYW4ndCBiZSBzZXQKLSAgICAgICAgbWFudWFsbHkgYnkgdGhlIHZpZGVvIGFwcC4gU2V0IHRvIDAgZm9yIG1hbnVhbCBjb250cm9sLgorCW1hbnVhbGx5IGJ5IHRoZSB2aWRlbyBhcHAuIFNldCB0byAwIGZvciBtYW51YWwgY29udHJvbC4KIAogICBOQU1FOiBhdXRvZ2FpbgogICBUWVBFOiBpbnRlZ2VyIChCb29sZWFuKQpAQCAtOTcsMTMgKzk3LDEzIEBACiAgIFRZUEU6IGludGVnZXIgKDAtNikKICAgREVGQVVMVDogMwogICBERVNDOiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHByaW50aW5nIGRlYnVnIG1lc3NhZ2VzLiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSwKLSAgICAgICAgdGhlIG1vcmUgaXMgcHJpbnRlZC4gVGhlIGxldmVscyBhcmUgY3VtdWxhdGl2ZSwgYW5kIGFyZSBhcyBmb2xsb3dzOgotICAgICAgICAgIDA9bm8gZGVidWcgbWVzc2FnZXMKLSAgICAgICAgICAxPWluaXQvZGV0ZWN0aW9uL3VubG9hZCBhbmQgb3RoZXIgc2lnbmlmaWNhbnQgbWVzc2FnZXMKLSAgICAgICAgICAyPXNvbWUgd2FybmluZyBtZXNzYWdlcwotICAgICAgICAgIDM9Y29uZmlnL2NvbnRyb2wgZnVuY3Rpb24gY2FsbHMKLSAgICAgICAgICA0PW1vc3QgZnVuY3Rpb24gY2FsbHMgYW5kIGRhdGEgcGFyc2luZyBtZXNzYWdlcwotICAgICAgICAgIDU9aGlnaGx5IHJlcGV0aXRpdmUgbWVzZ3MKKwl0aGUgbW9yZSBpcyBwcmludGVkLiBUaGUgbGV2ZWxzIGFyZSBjdW11bGF0aXZlLCBhbmQgYXJlIGFzIGZvbGxvd3M6CisJICAwPW5vIGRlYnVnIG1lc3NhZ2VzCisJICAxPWluaXQvZGV0ZWN0aW9uL3VubG9hZCBhbmQgb3RoZXIgc2lnbmlmaWNhbnQgbWVzc2FnZXMKKwkgIDI9c29tZSB3YXJuaW5nIG1lc3NhZ2VzCisJICAzPWNvbmZpZy9jb250cm9sIGZ1bmN0aW9uIGNhbGxzCisJICA0PW1vc3QgZnVuY3Rpb24gY2FsbHMgYW5kIGRhdGEgcGFyc2luZyBtZXNzYWdlcworCSAgNT1oaWdobHkgcmVwZXRpdGl2ZSBtZXNncwogCiAgIE5BTUU6IHNuYXBzaG90CiAgIFRZUEU6IGludGVnZXIgKEJvb2xlYW4pCkBAIC0xMTYsMjQgKzExNiwyNCBAQAogICBUWVBFOiBpbnRlZ2VyICgxLTQgZm9yIE9WNTExLCAxLTMxIGZvciBPVjUxMSspCiAgIERFRkFVTFQ6IDEKICAgREVTQzogTnVtYmVyIG9mIGNhbWVyYXMgYWxsb3dlZCB0byBzdHJlYW0gc2ltdWx0YW5lb3VzbHkgb24gYSBzaW5nbGUgYnVzLgotICAgICAgICBWYWx1ZXMgaGlnaGVyIHRoYW4gMSByZWR1Y2UgdGhlIGRhdGEgcmF0ZSBvZiBlYWNoIGNhbWVyYSwgYWxsb3dpbmcgdHdvCi0gICAgICAgIG9yIG1vcmUgdG8gYmUgdXNlZCBhdCBvbmNlLiBJZiB5b3UgaGF2ZSBhIGNvbXBsaWNhdGVkIHNldHVwIGludm9sdmluZwotICAgICAgICBib3RoIE9WNTExIGFuZCBPVjUxMSsgY2FtZXJhcywgdHJpYWwtYW5kLWVycm9yIG1heSBiZSBuZWNlc3NhcnkgZm9yCi0gICAgICAgIGZpbmRpbmcgdGhlIG9wdGltdW0gc2V0dGluZy4KKwlWYWx1ZXMgaGlnaGVyIHRoYW4gMSByZWR1Y2UgdGhlIGRhdGEgcmF0ZSBvZiBlYWNoIGNhbWVyYSwgYWxsb3dpbmcgdHdvCisJb3IgbW9yZSB0byBiZSB1c2VkIGF0IG9uY2UuIElmIHlvdSBoYXZlIGEgY29tcGxpY2F0ZWQgc2V0dXAgaW52b2x2aW5nCisJYm90aCBPVjUxMSBhbmQgT1Y1MTErIGNhbWVyYXMsIHRyaWFsLWFuZC1lcnJvciBtYXkgYmUgbmVjZXNzYXJ5IGZvcgorCWZpbmRpbmcgdGhlIG9wdGltdW0gc2V0dGluZy4KIAogICBOQU1FOiBjb21wcmVzcwogICBUWVBFOiBpbnRlZ2VyIChCb29sZWFuKQogICBERUZBVUxUOiAwCiAgIERFU0M6IFNldCB0aGlzIHRvIDEgdG8gdHVybiBvbiB0aGUgY2FtZXJhJ3MgY29tcHJlc3Npb24gZW5naW5lLiBUaGlzIGNhbgotICAgICAgICBwb3RlbnRpYWxseSBpbmNyZWFzZSB0aGUgZnJhbWUgcmF0ZSBhdCB0aGUgZXhwZW5zZSBvZiBxdWFsaXR5LCBpZiB5b3UKLSAgICAgICAgaGF2ZSBhIGZhc3QgQ1BVLiBZb3UgbXVzdCBsb2FkIHRoZSBwcm9wZXIgY29tcHJlc3Npb24gbW9kdWxlIGZvciB5b3VyCi0gICAgICAgIGNhbWVyYSBiZWZvcmUgc3RhcnRpbmcgeW91ciBhcHBsaWNhdGlvbiAob3Y1MTFfZGVjb21wIG9yIG92NTE4X2RlY29tcCkuCisJcG90ZW50aWFsbHkgaW5jcmVhc2UgdGhlIGZyYW1lIHJhdGUgYXQgdGhlIGV4cGVuc2Ugb2YgcXVhbGl0eSwgaWYgeW91CisJaGF2ZSBhIGZhc3QgQ1BVLiBZb3UgbXVzdCBsb2FkIHRoZSBwcm9wZXIgY29tcHJlc3Npb24gbW9kdWxlIGZvciB5b3VyCisJY2FtZXJhIGJlZm9yZSBzdGFydGluZyB5b3VyIGFwcGxpY2F0aW9uIChvdjUxMV9kZWNvbXAgb3Igb3Y1MThfZGVjb21wKS4KIAogICBOQU1FOiB0ZXN0cGF0CiAgIFRZUEU6IGludGVnZXIgKEJvb2xlYW4pCiAgIERFRkFVTFQ6IDAKICAgREVTQzogVGhpcyBjb25maWd1cmVzIHRoZSBjYW1lcmEncyBzZW5zb3IgdG8gdHJhbnNtaXQgYSBjb2xvcmVkIHRlc3QtcGF0dGVybgotICAgICAgICBpbnN0ZWFkIG9mIGFuIGltYWdlLiBUaGlzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHlldC4KKwlpbnN0ZWFkIG9mIGFuIGltYWdlLiBUaGlzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHlldC4KIAogICBOQU1FOiBkdW1wcGl4CiAgIFRZUEU6IGludGVnZXIgKDAtMikKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3NuOWMxMDIudHh0CmluZGV4IDE0MjkyMGIuLjFkMjA4OTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvc245YzEwMi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9zbjljMTAyLnR4dApAQCAtMSw5ICsxLDkgQEAKIAotICAgICAgICAgICAgICAgICAgICAgICAgIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBmb3IgTGludXgKLSAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkJIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzCisJCQkJRHJpdmVyIGZvciBMaW51eAorCQkJID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIERvY3VtZW50YXRpb24gLQorCQkJICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCiAKIAogSW5kZXgKQEAgLTE3Niw0NiArMTc2LDQ2IEBACiBUeXBlOiAgICAgICAgICAgc2hvcnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDwtMXxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNwZWNpZnkgVjRMMiBtaW5vciBtb2RlIG51bWJlcjoKLSAgICAgICAgICAgICAgICAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICBuID0gdXNlIG1pbm9yIG51bWJlciBuCi0gICAgICAgICAgICAgICAgWW91IGNhbiBzcGVjaWZ5IHVwIHRvIDY0IGNhbWVyYXMgdGhpcyB3YXkuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAotICAgICAgICAgICAgICAgIHJlY29nbml6ZWQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IG9uZSBhbmQgZm9yIGV2ZXJ5Ci0gICAgICAgICAgICAgICAgb3RoZXIgY2FtZXJhLgorCQktMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQorCQkgbiA9IHVzZSBtaW5vciBudW1iZXIgbgorCQlZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KKwkJRm9yIGV4YW1wbGU6CisJCXZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIHRoZSBzZWNvbmQKKwkJcmVjb2duaXplZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKKwkJb3RoZXIgY2FtZXJhLgogRGVmYXVsdDogICAgICAgIC0xCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZm9yY2VfbXVubWFwCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBGb3JjZSB0aGUgYXBwbGljYXRpb24gdG8gdW5tYXAgcHJldmlvdXNseSBtYXBwZWQgYnVmZmVyIG1lbW9yeQotICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKLSAgICAgICAgICAgICAgICBhbGwgdGhlIGFwcGxpY2F0aW9ucyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCi0gICAgICAgICAgICAgICAgMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCi0gICAgICAgICAgICAgICAgMSA9IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcgKHNhdmUgbWVtb3J5KQorCQliZWZvcmUgY2FsbGluZyBhbnkgVklESU9DX1NfQ1JPUCBvciBWSURJT0NfU19GTVQgaW9jdGwncy4gTm90CisJCWFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcworCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCisJCTAgPSBkbyBub3QgZm9yY2UgbWVtb3J5IHVubWFwcGluZworCQkxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCiBEZWZhdWx0OiAgICAgICAgMAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGZyYW1lX3RpbWVvdXQKIFR5cGU6ICAgICAgICAgICB1aW50IGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBUaW1lb3V0IGZvciBhIHZpZGVvIGZyYW1lIGluIHNlY29uZHMuIFRoaXMgcGFyYW1ldGVyIGlzCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgZm9yIGVhY2ggZGV0ZWN0ZWQgY2FtZXJhLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgorCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorCQljaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBkZWJ1ZwogVHlwZTogICAgICAgICAgIHVzaG9ydAogU3ludGF4OiAgICAgICAgIDxuPgogRGVzY3JpcHRpb246ICAgIERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDM6Ci0gICAgICAgICAgICAgICAgMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCi0gICAgICAgICAgICAgICAgMSA9IGNyaXRpY2FsIGVycm9ycwotICAgICAgICAgICAgICAgIDIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKLSAgICAgICAgICAgICAgICAzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgTGV2ZWwgMyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5IG9uZSBkZXZpY2UKLSAgICAgICAgICAgICAgICBpcyB1c2VkLiBJdCBhbHNvIHNob3dzIHNvbWUgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgaGFyZHdhcmUgYmVpbmcgZGV0ZWN0ZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBjaGFuZ2VkIGF0Ci0gICAgICAgICAgICAgICAgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCTAgPSBub25lICh1c2UgY2FyZWZ1bGx5KQorCQkxID0gY3JpdGljYWwgZXJyb3JzCisJCTIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKKwkJMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcworCQlMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQorCQlpcyB1c2VkLiBJdCBhbHNvIHNob3dzIHNvbWUgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhlCisJCWhhcmR3YXJlIGJlaW5nIGRldGVjdGVkLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUgY2hhbmdlZCBhdAorCQlydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KIERlZmF1bHQ6ICAgICAgICAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTI4MCwyNCArMjgwLDI0IEBACiAweDA0ICAgIDB4QzQgICAgICAgICAgRnJhbWUgc3luY2hyb25pc2F0aW9uIHBhdHRlcm4uCiAweDA1ICAgIDB4OTYgICAgICAgICAgRnJhbWUgc3luY2hyb25pc2F0aW9uIHBhdHRlcm4uCiAweDA2ICAgIDB4WFggICAgICAgICAgVW5rbm93biBtZWFuaW5nLiBUaGUgZXhhY3QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2hpcDsKLSAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSB2YWx1ZXMgYXJlIDB4MDAsIDB4MDEgYW5kIDB4MjAuCisJCSAgICAgIHBvc3NpYmxlIHZhbHVlcyBhcmUgMHgwMCwgMHgwMSBhbmQgMHgyMC4KIDB4MDcgICAgMHhYWCAgICAgICAgICBWYXJpYWJsZSB2YWx1ZSwgd2hvc2UgYml0cyBhcmUgZmYwMHV6emMsIHdoZXJlIGZmIGlzIGEKLSAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBjb3VudGVyLCB1IGlzIHVua25vd24sIHp6IGlzIGEgc2l6ZSBpbmRpY2F0b3IKLSAgICAgICAgICAgICAgICAgICAgICAoMDAgPSBWR0EsIDAxID0gU0lGLCAxMCA9IFFTSUYpIGFuZCBjIHN0YW5kcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb24gZW5hYmxlZCIgKDEgPSB5ZXMsIDAgPSBubykuCisJCSAgICAgIGZyYW1lIGNvdW50ZXIsIHUgaXMgdW5rbm93biwgenogaXMgYSBzaXplIGluZGljYXRvcgorCQkgICAgICAoMDAgPSBWR0EsIDAxID0gU0lGLCAxMCA9IFFTSUYpIGFuZCBjIHN0YW5kcyBmb3IKKwkJICAgICAgImNvbXByZXNzaW9uIGVuYWJsZWQiICgxID0geWVzLCAwID0gbm8pLgogMHgwOCAgICAweFhYICAgICAgICAgIEJyaWdodG5lc3Mgc3VtIGluc2lkZSBBdXRvLUV4cG9zdXJlIGFyZWEgKGxvdy1ieXRlKS4KIDB4MDkgICAgMHhYWCAgICAgICAgICBCcmlnaHRuZXNzIHN1bSBpbnNpZGUgQXV0by1FeHBvc3VyZSBhcmVhIChoaWdoLWJ5dGUpLgotICAgICAgICAgICAgICAgICAgICAgIEZvciBhIHB1cmUgd2hpdGUgaW1hZ2UsIHRoaXMgbnVtYmVyIHdpbGwgYmUgZXF1YWwgdG8gNTAwCi0gICAgICAgICAgICAgICAgICAgICAgdGltZXMgdGhlIGFyZWEgb2YgdGhlIHNwZWNpZmllZCBBRSBhcmVhLiBGb3IgaW1hZ2VzCi0gICAgICAgICAgICAgICAgICAgICAgdGhhdCBhcmUgbm90IHB1cmUgd2hpdGUsIHRoZSB2YWx1ZSBzY2FsZXMgZG93biBhY2NvcmRpbmcKLSAgICAgICAgICAgICAgICAgICAgICB0byByZWxhdGl2ZSB3aGl0ZW5lc3MuCisJCSAgICAgIEZvciBhIHB1cmUgd2hpdGUgaW1hZ2UsIHRoaXMgbnVtYmVyIHdpbGwgYmUgZXF1YWwgdG8gNTAwCisJCSAgICAgIHRpbWVzIHRoZSBhcmVhIG9mIHRoZSBzcGVjaWZpZWQgQUUgYXJlYS4gRm9yIGltYWdlcworCQkgICAgICB0aGF0IGFyZSBub3QgcHVyZSB3aGl0ZSwgdGhlIHZhbHVlIHNjYWxlcyBkb3duIGFjY29yZGluZworCQkgICAgICB0byByZWxhdGl2ZSB3aGl0ZW5lc3MuCiAweDBBICAgIDB4WFggICAgICAgICAgQnJpZ2h0bmVzcyBzdW0gb3V0c2lkZSBBdXRvLUV4cG9zdXJlIGFyZWEgKGxvdy1ieXRlKS4KIDB4MEIgICAgMHhYWCAgICAgICAgICBCcmlnaHRuZXNzIHN1bSBvdXRzaWRlIEF1dG8tRXhwb3N1cmUgYXJlYSAoaGlnaC1ieXRlKS4KLSAgICAgICAgICAgICAgICAgICAgICBGb3IgYSBwdXJlIHdoaXRlIGltYWdlLCB0aGlzIG51bWJlciB3aWxsIGJlIGVxdWFsIHRvIDEyNQotICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIHRoZSBhcmVhIG91dHNpZGUgb2YgdGhlIHNwZWNpZmllZCBBRSBhcmVhLiBGb3IKLSAgICAgICAgICAgICAgICAgICAgICBpbWFnZXMgdGhhdCBhcmUgbm90IHB1cmUgd2hpdGUsIHRoZSB2YWx1ZSBzY2FsZXMgZG93bgotICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byByZWxhdGl2ZSB3aGl0ZW5lc3MuCi0gICAgICAgICAgICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHJlbGF0aXZlIHdoaXRlbmVzcy4KKwkJICAgICAgRm9yIGEgcHVyZSB3aGl0ZSBpbWFnZSwgdGhpcyBudW1iZXIgd2lsbCBiZSBlcXVhbCB0byAxMjUKKwkJICAgICAgdGltZXMgdGhlIGFyZWEgb3V0c2lkZSBvZiB0aGUgc3BlY2lmaWVkIEFFIGFyZWEuIEZvcgorCQkgICAgICBpbWFnZXMgdGhhdCBhcmUgbm90IHB1cmUgd2hpdGUsIHRoZSB2YWx1ZSBzY2FsZXMgZG93bgorCQkgICAgICBhY2NvcmRpbmcgdG8gcmVsYXRpdmUgd2hpdGVuZXNzLgorCQkgICAgICBhY2NvcmRpbmcgdG8gcmVsYXRpdmUgd2hpdGVuZXNzLgogCiBUaGUgZm9sbG93aW5nIGJ5dGVzIGFyZSB1c2VkIGJ5IHRoZSBTTjlDMTAzIGJyaWRnZSBvbmx5OgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bGdyYWIuYyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsZ3JhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OWI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bGdyYWIuYwpAQCAtMCwwICsxLDE5MiBAQAorLyogU2ltcGxlIFZpZGVvNExpbnV4IGltYWdlIGdyYWJiZXIuICovCisvKgorICoJVmlkZW80TGludXggRHJpdmVyIFRlc3QvRXhhbXBsZSBGcmFtZWdyYWJiaW5nIFByb2dyYW0KKyAqCisgKglDb21waWxlIHdpdGg6CisgKgkJZ2NjIC1zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgdjRsZ3JhYi5jIC1vIHY0bGdyYWIKKyAqICAgICAgVXNlIGFzOgorICogICAgICAgICAgICAgIHY0bGdyYWIgPmltYWdlLnBwbQorICoKKyAqCUNvcHlyaWdodCAoQykgMTk5OC0wNS0wMywgUGhpbCBCbHVuZGVsbCA8cGhpbGJAZ251Lm9yZz4KKyAqICAgICAgQ29waWVkIGZyb20gaHR0cDovL3d3dy50YXplbmRhLmRlbW9uLmNvLnVrL3BoaWwvdmdyYWJiZXIuYworICogICAgICB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMgKERhdmUgRm9ycmVzdCwgZHJmNW5AdmlyZ2luaWEuZWR1KS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjZGVmaW5lIEZJTEUgIi9kZXYvdmlkZW8wIgorCisvKiBTdG9sZSB0aGlzIGZyb20gdHZzZXQuYyAqLworCisjZGVmaW5lIFJFQURfVklERU9fUElYRUwoYnVmLCBmb3JtYXQsIGRlcHRoLCByLCBnLCBiKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3dpdGNoIChmb3JtYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQljYXNlIFZJREVPX1BBTEVUVEVfR1JFWTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXN3aXRjaCAoZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQljYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCWNhc2UgNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJY2FzZSA4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJKHIpID0gKGcpID0gKGIpID0gKCpidWYrKyA8PCA4KTtcCisJCQkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorCQkJCWNhc2UgMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCShyKSA9IChnKSA9IChiKSA9ICAgICAgICAgICAgICAgXAorCQkJCQkJKigodW5zaWduZWQgc2hvcnQgKikgYnVmKTsgICAgICBcCisJCQkJCWJ1ZiArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQlicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJY2FzZSBWSURFT19QQUxFVFRFX1JHQjU2NTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJdW5zaWduZWQgc2hvcnQgdG1wID0gKih1bnNpZ25lZCBzaG9ydCAqKWJ1ZjsgICAgXAorCQkJKHIpID0gdG1wJjB4RjgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKGcpID0gKHRtcDw8NSkmMHhGQzAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKGIpID0gKHRtcDw8MTEpJjB4RjgwMDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnVmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJCQkJCQlcCisJCWNhc2UgVklERU9fUEFMRVRURV9SR0I1NTU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKHIpID0gKGJ1ZlswXSYweEY4KTw8ODsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJKGcpID0gKChidWZbMF0gPDwgNSB8IGJ1ZlsxXSA+PiAzKSYweEY4KTw8ODsgICAgXAorCQkJKGIpID0gKChidWZbMV0gPDwgMiApICYgMHhGOCk8PDg7ICAgICAgICAgICAgICAgXAorCQkJYnVmICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCQkJCQkJXAorCQljYXNlIFZJREVPX1BBTEVUVEVfUkdCMjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCShyKSA9IGJ1ZlswXSA8PCA4OyAoZykgPSBidWZbMV0gPDwgODsgICAgICAgICAgIFwKKwkJCShiKSA9IGJ1ZlsyXSA8PCA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJ1ZiArPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCWJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCQkJCQkJCVwKKwkJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQlmcHJpbnRmKHN0ZGVyciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCQkJIkZvcm1hdCAlZCBub3QgeWV0IHN1cHBvcnRlZFxuIiwgICAgICAgIFwKKwkJCQlmb3JtYXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK2ludCBnZXRfYnJpZ2h0bmVzc19hZGoodW5zaWduZWQgY2hhciAqaW1hZ2UsIGxvbmcgc2l6ZSwgaW50ICpicmlnaHRuZXNzKSB7CisgIGxvbmcgaSwgdG90ID0gMDsKKyAgZm9yIChpPTA7aTxzaXplKjM7aSsrKQorICAgIHRvdCArPSBpbWFnZVtpXTsKKyAgKmJyaWdodG5lc3MgPSAoMTI4IC0gdG90LyhzaXplKjMpKS8zOworICByZXR1cm4gISgodG90LyhzaXplKjMpKSA+PSAxMjYgJiYgKHRvdC8oc2l6ZSozKSkgPD0gMTMwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgaW50IGZkID0gb3BlbihGSUxFLCBPX1JET05MWSksIGY7CisgIHN0cnVjdCB2aWRlb19jYXBhYmlsaXR5IGNhcDsKKyAgc3RydWN0IHZpZGVvX3dpbmRvdyB3aW47CisgIHN0cnVjdCB2aWRlb19waWN0dXJlIHZwaWM7CisKKyAgdW5zaWduZWQgY2hhciAqYnVmZmVyLCAqc3JjOworICBpbnQgYnBwID0gMjQsIHIsIGcsIGI7CisgIHVuc2lnbmVkIGludCBpLCBzcmNfZGVwdGg7CisKKyAgaWYgKGZkIDwgMCkgeworICAgIHBlcnJvcihGSUxFKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgaWYgKGlvY3RsKGZkLCBWSURJT0NHQ0FQLCAmY2FwKSA8IDApIHsKKyAgICBwZXJyb3IoIlZJRElPR0NBUCIpOworICAgIGZwcmludGYoc3RkZXJyLCAiKCIgRklMRSAiIG5vdCBhIHZpZGVvNGxpbnV4IGRldmljZT8pXG4iKTsKKyAgICBjbG9zZShmZCk7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGlmIChpb2N0bChmZCwgVklESU9DR1dJTiwgJndpbikgPCAwKSB7CisgICAgcGVycm9yKCJWSURJT0NHV0lOIik7CisgICAgY2xvc2UoZmQpOworICAgIGV4aXQoMSk7CisgIH0KKworICBpZiAoaW9jdGwoZmQsIFZJRElPQ0dQSUNULCAmdnBpYykgPCAwKSB7CisgICAgcGVycm9yKCJWSURJT0NHUElDVCIpOworICAgIGNsb3NlKGZkKTsKKyAgICBleGl0KDEpOworICB9CisKKyAgaWYgKGNhcC50eXBlICYgVklEX1RZUEVfTU9OT0NIUk9NRSkgeworICAgIHZwaWMuZGVwdGg9ODsKKyAgICB2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9HUkVZOyAgICAvKiA4Yml0IGdyZXkgKi8KKyAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKKyAgICAgIHZwaWMuZGVwdGg9NjsKKyAgICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpIDwgMCkgeworCXZwaWMuZGVwdGg9NDsKKwlpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKSA8IDApIHsKKwkgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGZpbmQgYSBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXQuXG4iKTsKKwkgIGNsb3NlKGZkKTsKKwkgIGV4aXQoMSk7CisJfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2cGljLmRlcHRoPTI0OworICAgIHZwaWMucGFsZXR0ZT1WSURFT19QQUxFVFRFX1JHQjI0OworCisgICAgaWYoaW9jdGwoZmQsIFZJRElPQ1NQSUNULCAmdnBpYykgPCAwKSB7CisgICAgICB2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NjU7CisgICAgICB2cGljLmRlcHRoPTE2OworCisgICAgICBpZihpb2N0bChmZCwgVklESU9DU1BJQ1QsICZ2cGljKT09LTEpIHsKKwl2cGljLnBhbGV0dGU9VklERU9fUEFMRVRURV9SR0I1NTU7CisJdnBpYy5kZXB0aD0xNTsKKworCWlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpPT0tMSkgeworCSAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZmluZCBhIHN1cHBvcnRlZCBjYXB0dXJlIGZvcm1hdC5cbiIpOworCSAgcmV0dXJuIC0xOworCX0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBidWZmZXIgPSBtYWxsb2Mod2luLndpZHRoICogd2luLmhlaWdodCAqIGJwcCk7CisgIGlmICghYnVmZmVyKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXQgb2YgbWVtb3J5LlxuIik7CisgICAgZXhpdCgxKTsKKyAgfQorCisgIGRvIHsKKyAgICBpbnQgbmV3YnJpZ2h0OworICAgIHJlYWQoZmQsIGJ1ZmZlciwgd2luLndpZHRoICogd2luLmhlaWdodCAqIGJwcCk7CisgICAgZiA9IGdldF9icmlnaHRuZXNzX2FkaihidWZmZXIsIHdpbi53aWR0aCAqIHdpbi5oZWlnaHQsICZuZXdicmlnaHQpOworICAgIGlmIChmKSB7CisgICAgICB2cGljLmJyaWdodG5lc3MgKz0gKG5ld2JyaWdodCA8PCA4KTsKKyAgICAgIGlmKGlvY3RsKGZkLCBWSURJT0NTUElDVCwgJnZwaWMpPT0tMSkgeworCXBlcnJvcigiVklESU9TUElDVCIpOworCWJyZWFrOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoZik7CisKKyAgZnByaW50ZihzdGRvdXQsICJQNlxuJWQgJWQgMjU1XG4iLCB3aW4ud2lkdGgsIHdpbi5oZWlnaHQpOworCisgIHNyYyA9IGJ1ZmZlcjsKKworICBmb3IgKGkgPSAwOyBpIDwgd2luLndpZHRoICogd2luLmhlaWdodDsgaSsrKSB7CisgICAgUkVBRF9WSURFT19QSVhFTChzcmMsIHZwaWMucGFsZXR0ZSwgc3JjX2RlcHRoLCByLCBnLCBiKTsKKyAgICBmcHV0YyhyPj44LCBzdGRvdXQpOworICAgIGZwdXRjKGc+PjgsIHN0ZG91dCk7CisgICAgZnB1dGMoYj4+OCwgc3Rkb3V0KTsKKyAgfQorCisgIGNsb3NlKGZkKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC93OTk2OGNmLnR4dAppbmRleCAzYjcwNGYyLi4wZDUzY2U3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdzk5NjhjZi50eHQKQEAgLTEsOSArMSw5IEBACiAKLSAgICAgICAgICAgICAgICAgICBXOTk2Wzg3XUNGIEpQRUcgVVNCIER1YWwgTW9kZSBDYW1lcmEgQ2hpcAotICAgICAgICAgICAgICAgICAgICAgRHJpdmVyIGZvciBMaW51eCAyLjYgKGJhc2ljIHZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJICAgVzk5Nls4N11DRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXAKKwkJICAgICBEcml2ZXIgZm9yIExpbnV4IDIuNiAoYmFzaWMgdmVyc2lvbikKKwkJICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCisJCQkgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KIAogCiBJbmRleApAQCAtMTg4LDU3ICsxODgsNTcgQEAKIFR5cGU6ICAgICAgICAgICAgYm9vbAogU3ludGF4OiAgICAgICAgICA8MHwxPgogRGVzY3JpcHRpb246ICAgICBBdXRvbWF0aWMgJ292Y2FtY2hpcCcgbW9kdWxlIGxvYWRpbmc6IDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4KLSAgICAgICAgICAgICAgICAgSWYgZW5hYmxlZCwgJ2luc21vZCcgc2VhcmNoZXMgZm9yIHRoZSByZXF1aXJlZCAnb3ZjYW1jaGlwJwotICAgICAgICAgICAgICAgICBtb2R1bGUgaW4gdGhlIHN5c3RlbSwgYWNjb3JkaW5nIHRvIGl0cyBjb25maWd1cmF0aW9uLCBhbmQKLSAgICAgICAgICAgICAgICAgbG9hZHMgdGhhdCBtb2R1bGUgYXV0b21hdGljYWxseS4gVGhpcyBhY3Rpb24gaXMgcGVyZm9ybWVkIGFzCi0gICAgICAgICAgICAgICAgIG9uY2Ugc29vbiBhcyB0aGUgJ3c5OTY4Y2YnIG1vZHVsZSBpcyBsb2FkZWQgaW50byBtZW1vcnkuCisJCSBJZiBlbmFibGVkLCAnaW5zbW9kJyBzZWFyY2hlcyBmb3IgdGhlIHJlcXVpcmVkICdvdmNhbWNoaXAnCisJCSBtb2R1bGUgaW4gdGhlIHN5c3RlbSwgYWNjb3JkaW5nIHRvIGl0cyBjb25maWd1cmF0aW9uLCBhbmQKKwkJIGxvYWRzIHRoYXQgbW9kdWxlIGF1dG9tYXRpY2FsbHkuIFRoaXMgYWN0aW9uIGlzIHBlcmZvcm1lZCBhcworCQkgb25jZSBzb29uIGFzIHRoZSAndzk5NjhjZicgbW9kdWxlIGlzIGxvYWRlZCBpbnRvIG1lbW9yeS4KIERlZmF1bHQ6ICAgICAgICAgMQogTm90ZTogICAgICAgICAgICBUaGUga2VybmVsIG11c3QgYmUgY29tcGlsZWQgd2l0aCB0aGUgQ09ORklHX0tNT0Qgb3B0aW9uCi0gICAgICAgICAgICAgICAgIGVuYWJsZWQgZm9yIHRoZSAnb3ZjYW1jaGlwJyBtb2R1bGUgdG8gYmUgbG9hZGVkIGFuZCBmb3IKLSAgICAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgdG8gYmUgcHJlc2VudC4KKwkJIGVuYWJsZWQgZm9yIHRoZSAnb3ZjYW1jaGlwJyBtb2R1bGUgdG8gYmUgbG9hZGVkIGFuZCBmb3IKKwkJIHRoaXMgcGFyYW1ldGVyIHRvIGJlIHByZXNlbnQuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgc2ltY2FtcwogVHlwZTogICAgICAgICAgIGludAogU3ludGF4OiAgICAgICAgIDxuPgogRGVzY3JpcHRpb246ICAgIE51bWJlciBvZiBjYW1lcmFzIGFsbG93ZWQgdG8gc3RyZWFtIHNpbXVsdGFuZW91c2x5LgotICAgICAgICAgICAgICAgIG4gbWF5IHZhcnkgZnJvbSAwIHRvIDMyLgorCQluIG1heSB2YXJ5IGZyb20gMCB0byAzMi4KIERlZmF1bHQ6ICAgICAgICAzMgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIHZpZGVvX25yCiBUeXBlOiAgICAgICAgICAgaW50IGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8LTF8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBTcGVjaWZ5IFY0TCBtaW5vciBtb2RlIG51bWJlci4KLSAgICAgICAgICAgICAgICAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICBuID0gdXNlIG1pbm9yIG51bWJlciBuCi0gICAgICAgICAgICAgICAgWW91IGNhbiBzcGVjaWZ5IHVwIHRvIDMyIGNhbWVyYXMgdGhpcyB3YXkuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAotICAgICAgICAgICAgICAgIHJlY29nbml6ZWQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IG9uZSBhbmQgZm9yIGV2ZXJ5Ci0gICAgICAgICAgICAgICAgb3RoZXIgY2FtZXJhLgorCQktMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQorCQkgbiA9IHVzZSBtaW5vciBudW1iZXIgbgorCQlZb3UgY2FuIHNwZWNpZnkgdXAgdG8gMzIgY2FtZXJhcyB0aGlzIHdheS4KKwkJRm9yIGV4YW1wbGU6CisJCXZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIHRoZSBzZWNvbmQKKwkJcmVjb2duaXplZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKKwkJb3RoZXIgY2FtZXJhLgogRGVmYXVsdDogICAgICAgIC0xCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgcGFja2V0X3NpemUKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNwZWNpZnkgdGhlIG1heGltdW0gZGF0YSBwYXlsb2FkIHNpemUgaW4gYnl0ZXMgZm9yIGFsdGVybmF0ZQotICAgICAgICAgICAgICAgIHNldHRpbmdzLCBmb3IgZWFjaCBkZXZpY2UuIG4gaXMgc2NhbGVkIGJldHdlZW4gNjMgYW5kIDEwMjMuCisJCXNldHRpbmdzLCBmb3IgZWFjaCBkZXZpY2UuIG4gaXMgc2NhbGVkIGJldHdlZW4gNjMgYW5kIDEwMjMuCiBEZWZhdWx0OiAgICAgICAgMTAyMwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIG1heF9idWZmZXJzCiBUeXBlOiAgICAgICAgICAgaW50IGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBGb3IgYWR2YW5jZWQgdXNlcnMuCi0gICAgICAgICAgICAgICAgU3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmlkZW8gZnJhbWUgYnVmZmVycyB0byBhbGxvY2F0ZQotICAgICAgICAgICAgICAgIGZvciBlYWNoIGRldmljZSwgZnJvbSAyIHRvIDMyLgorCQlTcGVjaWZ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2aWRlbyBmcmFtZSBidWZmZXJzIHRvIGFsbG9jYXRlCisJCWZvciBlYWNoIGRldmljZSwgZnJvbSAyIHRvIDMyLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBkb3VibGVfYnVmZmVyCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBIYXJkd2FyZSBkb3VibGUgYnVmZmVyaW5nOiAwIGRpc2FibGVkLCAxIGVuYWJsZWQuCi0gICAgICAgICAgICAgICAgSXQgc2hvdWxkIGJlIGVuYWJsZWQgaWYgeW91IHdhbnQgc21vb3RoIHZpZGVvIG91dHB1dDogaWYgeW91Ci0gICAgICAgICAgICAgICAgb2J0YWluIG91dCBvZiBzeW5jLiB2aWRlbywgZGlzYWJsZSBpdCwgb3IgdHJ5IHRvCi0gICAgICAgICAgICAgICAgZGVjcmVhc2UgdGhlICdjbG9ja2RpdicgbW9kdWxlIHBhcmFtZXRlciB2YWx1ZS4KKwkJSXQgc2hvdWxkIGJlIGVuYWJsZWQgaWYgeW91IHdhbnQgc21vb3RoIHZpZGVvIG91dHB1dDogaWYgeW91CisJCW9idGFpbiBvdXQgb2Ygc3luYy4gdmlkZW8sIGRpc2FibGUgaXQsIG9yIHRyeSB0bworCQlkZWNyZWFzZSB0aGUgJ2Nsb2NrZGl2JyBtb2R1bGUgcGFyYW1ldGVyIHZhbHVlLgogRGVmYXVsdDogICAgICAgIDEgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBjbGFtcGluZwpAQCAtMjUxLDkgKzI1MSw5IEBACiBUeXBlOiAgICAgICAgICAgaW50IGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxfDJbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgVmlkZW8gZmlsdGVyIHR5cGUuCi0gICAgICAgICAgICAgICAgMCBub25lLCAxICgxLTItMSkgMy10YXAgZmlsdGVyLCAyICgyLTMtNi0zLTIpIDUtdGFwIGZpbHRlci4KLSAgICAgICAgICAgICAgICBUaGUgZmlsdGVyIGlzIHVzZWQgdG8gcmVkdWNlIG5vaXNlIGFuZCBhbGlhc2luZyBhcnRpZmFjdHMKLSAgICAgICAgICAgICAgICBwcm9kdWNlZCBieSB0aGUgQ0NEIG9yIENNT1MgaW1hZ2Ugc2Vuc29yLgorCQkwIG5vbmUsIDEgKDEtMi0xKSAzLXRhcCBmaWx0ZXIsIDIgKDItMy02LTMtMikgNS10YXAgZmlsdGVyLgorCQlUaGUgZmlsdGVyIGlzIHVzZWQgdG8gcmVkdWNlIG5vaXNlIGFuZCBhbGlhc2luZyBhcnRpZmFjdHMKKwkJcHJvZHVjZWQgYnkgdGhlIENDRCBvciBDTU9TIGltYWdlIHNlbnNvci4KIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgbGFyZ2V2aWV3CkBAIC0yNjYsOSArMjY2LDkgQEAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNvZnR3YXJlIHNjYWxpbmcgKGZvciBub24tY29tcHJlc3NlZCB2aWRlbyBvbmx5KToKLSAgICAgICAgICAgICAgICAwIGRpc2FibGVkLCAxIGVuYWJsZWQuCi0gICAgICAgICAgICAgICAgRGlzYWJsZSBpdCBpZiB5b3UgaGF2ZSBhIHNsb3cgQ1BVIG9yIHlvdSBkb24ndCBoYXZlIGVub3VnaAotICAgICAgICAgICAgICAgIG1lbW9yeS4KKwkJMCBkaXNhYmxlZCwgMSBlbmFibGVkLgorCQlEaXNhYmxlIGl0IGlmIHlvdSBoYXZlIGEgc2xvdyBDUFUgb3IgeW91IGRvbid0IGhhdmUgZW5vdWdoCisJCW1lbW9yeS4KIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiBOb3RlOiAgICAgICAgICAgSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IHRvIDAuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yNzYsMzYgKzI3NiwzNiBAQAogVHlwZTogICAgICAgICAgIGludCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MXwyWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNvZnR3YXJlIHZpZGVvIGRlY29tcHJlc3Npb246Ci0gICAgICAgICAgICAgICAgMCA9IGRpc2FibGVzIGRlY29tcHJlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgKGRvZXNuJ3QgYWxsb3cgZm9ybWF0cyBuZWVkaW5nIGRlY29tcHJlc3Npb24pLgotICAgICAgICAgICAgICAgIDEgPSBmb3JjZXMgZGVjb21wcmVzc2lvbgotICAgICAgICAgICAgICAgICAgICAoYWxsb3dzIGZvcm1hdHMgbmVlZGluZyBkZWNvbXByZXNzaW9uIG9ubHkpLgotICAgICAgICAgICAgICAgIDIgPSBhbGxvd3MgYW55IHBlcm1pdHRlZCBmb3JtYXRzLgotICAgICAgICAgICAgICAgIEZvcm1hdHMgc3VwcG9ydGluZyAoZGUpY29tcHJlc3NlZCB2aWRlbyBhcmUgWVVWNDIyUCBhbmQKLSAgICAgICAgICAgICAgICBZVVY0MjBQL1lVVjQyMCBpbiBhbnkgcmVzb2x1dGlvbnMgd2hlcmUgd2lkdGggYW5kIGhlaWdodCBhcmUKLSAgICAgICAgICAgICAgICBtdWx0aXBsZXMgb2YgMTYuCisJCTAgPSBkaXNhYmxlcyBkZWNvbXByZXNzaW9uCisJCSAgICAoZG9lc24ndCBhbGxvdyBmb3JtYXRzIG5lZWRpbmcgZGVjb21wcmVzc2lvbikuCisJCTEgPSBmb3JjZXMgZGVjb21wcmVzc2lvbgorCQkgICAgKGFsbG93cyBmb3JtYXRzIG5lZWRpbmcgZGVjb21wcmVzc2lvbiBvbmx5KS4KKwkJMiA9IGFsbG93cyBhbnkgcGVybWl0dGVkIGZvcm1hdHMuCisJCUZvcm1hdHMgc3VwcG9ydGluZyAoZGUpY29tcHJlc3NlZCB2aWRlbyBhcmUgWVVWNDIyUCBhbmQKKwkJWVVWNDIwUC9ZVVY0MjAgaW4gYW55IHJlc29sdXRpb25zIHdoZXJlIHdpZHRoIGFuZCBoZWlnaHQgYXJlCisJCW11bHRpcGxlcyBvZiAxNi4KIERlZmF1bHQ6ICAgICAgICAyIGZvciBldmVyeSBkZXZpY2UuCiBOb3RlOiAgICAgICAgICAgSWYgJ3c5OTY4Y2YtdnBwJyBpcyBub3QgcHJlc2VudCwgZm9yY2luZyBkZWNvbXByZXNzaW9uIGlzIG5vdAotICAgICAgICAgICAgICAgIGFsbG93ZWQ7IGluIHRoaXMgY2FzZSB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gMi4KKwkJYWxsb3dlZDsgaW4gdGhpcyBjYXNlIHRoaXMgcGFyYW1ldGVyIGlzIHNldCB0byAyLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGZvcmNlX3BhbGV0dGUKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDl8MTB8MTN8MTV8OHw3fDF8NnwzfDR8NVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBGb3JjZSBwaWN0dXJlIHBhbGV0dGUuCi0gICAgICAgICAgICAgICAgSW4gb3JkZXI6Ci0gICAgICAgICAgICAgICAgIDAgPSBPZmYgLSBhbGxvd3MgYW55IG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKLSAgICAgICAgICAgICAgICAgOSA9IFVZVlkgICAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGRpc2FibGVkCi0gICAgICAgICAgICAgICAgMTAgPSBZVVY0MjAgIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkCi0gICAgICAgICAgICAgICAgMTMgPSBZVVY0MjJQIDE2IGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkCi0gICAgICAgICAgICAgICAgMTUgPSBZVVY0MjBQIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkCi0gICAgICAgICAgICAgICAgIDggPSBZVVZZICAgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDcgPSBZVVY0MjIgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDEgPSBHUkVZICAgICA4IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDYgPSBSR0I1NTUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDMgPSBSR0I1NjUgIDE2IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDQgPSBSR0IyNCAgIDI0IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgIDUgPSBSR0IzMiAgIDMyIGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCi0gICAgICAgICAgICAgICAgV2hlbiBub3QgMCwgdGhpcyBwYXJhbWV0ZXIgd2lsbCBvdmVycmlkZSAnZGVjb21wcmVzc2lvbicuCisJCUluIG9yZGVyOgorCQkgMCA9IE9mZiAtIGFsbG93cyBhbnkgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgorCQkgOSA9IFVZVlkgICAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGRpc2FibGVkCisJCTEwID0gWVVWNDIwICAxMiBicHAgLSBPcmlnaW5hbCB2aWRlbywgY29tcHJlc3Npb24gZW5hYmxlZAorCQkxMyA9IFlVVjQyMlAgMTYgYnBwIC0gT3JpZ2luYWwgdmlkZW8sIGNvbXByZXNzaW9uIGVuYWJsZWQKKwkJMTUgPSBZVVY0MjBQIDEyIGJwcCAtIE9yaWdpbmFsIHZpZGVvLCBjb21wcmVzc2lvbiBlbmFibGVkCisJCSA4ID0gWVVWWSAgICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWQorCQkgNyA9IFlVVjQyMiAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKKwkJIDEgPSBHUkVZICAgICA4IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCisJCSA2ID0gUkdCNTU1ICAxNiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWQorCQkgMyA9IFJHQjU2NSAgMTYgYnBwIC0gU29mdHdhcmUgY29udmVyc2lvbiBmcm9tIFVZVlkKKwkJIDQgPSBSR0IyNCAgIDI0IGJwcCAtIFNvZnR3YXJlIGNvbnZlcnNpb24gZnJvbSBVWVZZCisJCSA1ID0gUkdCMzIgICAzMiBicHAgLSBTb2Z0d2FyZSBjb252ZXJzaW9uIGZyb20gVVlWWQorCQlXaGVuIG5vdCAwLCB0aGlzIHBhcmFtZXRlciB3aWxsIG92ZXJyaWRlICdkZWNvbXByZXNzaW9uJy4KIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuIEluaXRpYWwgcGFsZXR0ZSBpcyA5IChVWVZZKS4KIE5vdGU6ICAgICAgICAgICBJZiAndzk5NjhjZi12cHAnIGlzIG5vdCBwcmVzZW50LCB0aGlzIHBhcmFtZXRlciBpcyBzZXQgdG8gOS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMxMyw3NyArMzEzLDc3IEBACiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBSZWFkIFJHQiB2aWRlbyBkYXRhIGluc3RlYWQgb2YgQkdSOgotICAgICAgICAgICAgICAgIDEgPSB1c2UgUkdCIGNvbXBvbmVudCBvcmRlcmluZy4KLSAgICAgICAgICAgICAgICAwID0gdXNlIEJHUiBjb21wb25lbnQgb3JkZXJpbmcuCi0gICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaGFzIGVmZmVjdCB3aGVuIHVzaW5nIFJHQlggcGFsZXR0ZXMgb25seS4KKwkJMSA9IHVzZSBSR0IgY29tcG9uZW50IG9yZGVyaW5nLgorCQkwID0gdXNlIEJHUiBjb21wb25lbnQgb3JkZXJpbmcuCisJCVRoaXMgcGFyYW1ldGVyIGhhcyBlZmZlY3Qgd2hlbiB1c2luZyBSR0JYIHBhbGV0dGVzIG9ubHkuCiBEZWZhdWx0OiAgICAgICAgMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGF1dG9icmlnaHQKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEltYWdlIHNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgYnJpZ2h0bmVzczoKLSAgICAgICAgICAgICAgICAwID0gbm8sIDEgPSB5ZXMKKwkJMCA9IG5vLCAxID0geWVzCiBEZWZhdWx0OiAgICAgICAgMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGF1dG9leHAKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEltYWdlIHNlbnNvciBhdXRvbWF0aWNhbGx5IGNoYW5nZXMgZXhwb3N1cmU6Ci0gICAgICAgICAgICAgICAgMCA9IG5vLCAxID0geWVzCisJCTAgPSBubywgMSA9IHllcwogRGVmYXVsdDogICAgICAgIDEgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBsaWdodGZyZXEKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDw1MHw2MFssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBMaWdodCBmcmVxdWVuY3kgaW4gSHo6Ci0gICAgICAgICAgICAgICAgNTAgZm9yIEV1cm9wZWFuIGFuZCBBc2lhbiBsaWdodGluZywgNjAgZm9yIEFtZXJpY2FuIGxpZ2h0aW5nLgorCQk1MCBmb3IgRXVyb3BlYW4gYW5kIEFzaWFuIGxpZ2h0aW5nLCA2MCBmb3IgQW1lcmljYW4gbGlnaHRpbmcuCiBEZWZhdWx0OiAgICAgICAgNTAgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBiYW5kaW5nZmlsdGVyCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBCYW5kaW5nIGZpbHRlciB0byByZWR1Y2UgZWZmZWN0cyBvZiBmbHVvcmVzY2VudAotICAgICAgICAgICAgICAgIGxpZ2h0aW5nOgotICAgICAgICAgICAgICAgIDAgZGlzYWJsZWQsIDEgZW5hYmxlZC4KLSAgICAgICAgICAgICAgICBUaGlzIGZpbHRlciB0cmllcyB0byByZWR1Y2UgdGhlIHBhdHRlcm4gb2YgaG9yaXpvbnRhbAotICAgICAgICAgICAgICAgIGxpZ2h0L2RhcmsgYmFuZHMgY2F1c2VkIGJ5IHNvbWUgKHVzdWFsbHkgZmx1b3Jlc2NlbnQpIGxpZ2h0aW5nLgorCQlsaWdodGluZzoKKwkJMCBkaXNhYmxlZCwgMSBlbmFibGVkLgorCQlUaGlzIGZpbHRlciB0cmllcyB0byByZWR1Y2UgdGhlIHBhdHRlcm4gb2YgaG9yaXpvbnRhbAorCQlsaWdodC9kYXJrIGJhbmRzIGNhdXNlZCBieSBzb21lICh1c3VhbGx5IGZsdW9yZXNjZW50KSBsaWdodGluZy4KIERlZmF1bHQ6ICAgICAgICAwIGZvciBldmVyeSBkZXZpY2UuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgY2xvY2tkaXYKIFR5cGU6ICAgICAgICAgICBpbnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwtMXxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIEZvcmNlIHBpeGVsIGNsb2NrIGRpdmlzb3IgdG8gYSBzcGVjaWZpYyB2YWx1ZSAoZm9yIGV4cGVydHMpOgotICAgICAgICAgICAgICAgIG4gbWF5IHZhcnkgZnJvbSAwIHRvIDEyNy4KLSAgICAgICAgICAgICAgICAtMSBmb3IgYXV0b21hdGljIHZhbHVlLgotICAgICAgICAgICAgICAgIFNlZSBhbHNvIHRoZSAnZG91YmxlX2J1ZmZlcicgbW9kdWxlIHBhcmFtZXRlci4KKwkJbiBtYXkgdmFyeSBmcm9tIDAgdG8gMTI3LgorCQktMSBmb3IgYXV0b21hdGljIHZhbHVlLgorCQlTZWUgYWxzbyB0aGUgJ2RvdWJsZV9idWZmZXInIG1vZHVsZSBwYXJhbWV0ZXIuCiBEZWZhdWx0OiAgICAgICAgLTEgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBiYWNrbGlnaHQKIFR5cGU6ICAgICAgICAgICBib29sIGFycmF5IChtaW4gPSAwLCBtYXggPSAzMikKIFN5bnRheDogICAgICAgICA8MHwxWywuLi5dPgogRGVzY3JpcHRpb246ICAgIE9iamVjdHMgYXJlIGxpdCBmcm9tIGJlaGluZDoKLSAgICAgICAgICAgICAgICAwID0gbm8sIDEgPSB5ZXMKKwkJMCA9IG5vLCAxID0geWVzCiBEZWZhdWx0OiAgICAgICAgMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIG1pcnJvcgogVHlwZTogICAgICAgICAgIGJvb2wgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDMyKQogU3ludGF4OiAgICAgICAgIDwwfDFbLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgUmV2ZXJzZSBpbWFnZSBob3Jpem9udGFsbHk6Ci0gICAgICAgICAgICAgICAgMCA9IG5vLCAxID0geWVzCisJCTAgPSBubywgMSA9IHllcwogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBtb25vY2hyb21lCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBUaGUgaW1hZ2Ugc2Vuc29yIGlzIG1vbm9jaHJvbWU6Ci0gICAgICAgICAgICAgICAgMCA9IG5vLCAxID0geWVzCisJCTAgPSBubywgMSA9IHllcwogRGVmYXVsdDogICAgICAgIDAgZm9yIGV2ZXJ5IGRldmljZS4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBicmlnaHRuZXNzCiBUeXBlOiAgICAgICAgICAgbG9uZyBhcnJheSAobWluID0gMCwgbWF4ID0gMzIpCiBTeW50YXg6ICAgICAgICAgPG5bLC4uLl0+CiBEZXNjcmlwdGlvbjogICAgU2V0IHBpY3R1cmUgYnJpZ2h0bmVzcyAoMC02NTUzNSkuCi0gICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdCBpZiAnYXV0b2JyaWdodCcgaXMgZW5hYmxlZC4KKwkJVGhpcyBwYXJhbWV0ZXIgaGFzIG5vIGVmZmVjdCBpZiAnYXV0b2JyaWdodCcgaXMgZW5hYmxlZC4KIERlZmF1bHQ6ICAgICAgICAzMTAwMCBmb3IgZXZlcnkgZGV2aWNlLgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGh1ZQpAQCAtNDE0LDIzICs0MTQsMjMgQEAKIFR5cGU6ICAgICAgICAgICBpbnQKIFN5bnRheDogICAgICAgICA8bj4KIERlc2NyaXB0aW9uOiAgICBEZWJ1Z2dpbmcgaW5mb3JtYXRpb24gbGV2ZWwsIGZyb20gMCB0byA2OgotICAgICAgICAgICAgICAgIDAgPSBub25lICh1c2UgY2FyZWZ1bGx5KQotICAgICAgICAgICAgICAgIDEgPSBjcml0aWNhbCBlcnJvcnMKLSAgICAgICAgICAgICAgICAyID0gc2lnbmlmaWNhbnQgaW5mb3JtYXRpb25zCi0gICAgICAgICAgICAgICAgMyA9IGNvbmZpZ3VyYXRpb24gb3IgZ2VuZXJhbCBtZXNzYWdlcwotICAgICAgICAgICAgICAgIDQgPSB3YXJuaW5ncwotICAgICAgICAgICAgICAgIDUgPSBjYWxsZWQgZnVuY3Rpb25zCi0gICAgICAgICAgICAgICAgNiA9IGZ1bmN0aW9uIGludGVybmFscwotICAgICAgICAgICAgICAgIExldmVsIDUgYW5kIDYgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lCi0gICAgICAgICAgICAgICAgZGV2aWNlIGlzIHVzZWQuCisJCTAgPSBub25lICh1c2UgY2FyZWZ1bGx5KQorCQkxID0gY3JpdGljYWwgZXJyb3JzCisJCTIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKKwkJMyA9IGNvbmZpZ3VyYXRpb24gb3IgZ2VuZXJhbCBtZXNzYWdlcworCQk0ID0gd2FybmluZ3MKKwkJNSA9IGNhbGxlZCBmdW5jdGlvbnMKKwkJNiA9IGZ1bmN0aW9uIGludGVybmFscworCQlMZXZlbCA1IGFuZCA2IGFyZSB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5IG9uZQorCQlkZXZpY2UgaXMgdXNlZC4KIERlZmF1bHQ6ICAgICAgICAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgc3BlY2lmaWNfZGVidWcKIFR5cGU6ICAgICAgICAgICBib29sCiBTeW50YXg6ICAgICAgICAgPDB8MT4KIERlc2NyaXB0aW9uOiAgICBFbmFibGUgb3IgZGlzYWJsZSBzcGVjaWZpYyBkZWJ1Z2dpbmcgbWVzc2FnZXM6Ci0gICAgICAgICAgICAgICAgMCA9IHByaW50IG1lc3NhZ2VzIGNvbmNlcm5pbmcgZXZlcnkgbGV2ZWwgPD0gJ2RlYnVnJyBsZXZlbC4KLSAgICAgICAgICAgICAgICAxID0gcHJpbnQgbWVzc2FnZXMgY29uY2VybmluZyB0aGUgbGV2ZWwgaW5kaWNhdGVkIGJ5ICdkZWJ1ZycuCisJCTAgPSBwcmludCBtZXNzYWdlcyBjb25jZXJuaW5nIGV2ZXJ5IGxldmVsIDw9ICdkZWJ1ZycgbGV2ZWwuCisJCTEgPSBwcmludCBtZXNzYWdlcyBjb25jZXJuaW5nIHRoZSBsZXZlbCBpbmRpY2F0ZWQgYnkgJ2RlYnVnJy4KIERlZmF1bHQ6ICAgICAgICAwCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvemMwMzAxLnR4dCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvemMwMzAxLnR4dAppbmRleCBmNTUyNjJjLi5mNDA2ZjVlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pjMDMwMS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC96YzAzMDEudHh0CkBAIC0xLDkgKzEsOSBAQAogCi0gICAgICAgICAgICAgICAgICAgIFpDMDMwMSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXIgZm9yIExpbnV4Ci0gICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCSAgICAgIFpDMDMwMSBhbmQgWkMwMzAxUCBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcAorCQkJCURyaXZlciBmb3IgTGludXgKKwkgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRG9jdW1lbnRhdGlvbiAtCisJCQkgICAgICAgLSBEb2N1bWVudGF0aW9uIC0KIAogCiBJbmRleApAQCAtNTEsMTMgKzUxLDEzIEBACiAKIDQuIE92ZXJ2aWV3IGFuZCBmZWF0dXJlcwogPT09PT09PT09PT09PT09PT09PT09PT09Ci1UaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgdmlkZW8gaW50ZXJmYWNlIG9mIHRoZSBkZXZpY2VzIG1vdW50aW5nIHRoZSBaQzAzMDEKLUltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwLgorVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIHZpZGVvIGludGVyZmFjZSBvZiB0aGUgZGV2aWNlcyBtb3VudGluZyB0aGUgWkMwMzAxIG9yCitaQzAzMDFQIEltYWdlIFByb2Nlc3NvcnMgYW5kIENvbnRyb2wgQ2hpcHMuCiAKIFRoZSBkcml2ZXIgcmVsaWVzIG9uIHRoZSBWaWRlbzRMaW51eDIgYW5kIFVTQiBjb3JlIG1vZHVsZXMuIEl0IGhhcyBiZWVuCiBkZXNpZ25lZCB0byBydW4gcHJvcGVybHkgb24gU01QIHN5c3RlbXMgYXMgd2VsbC4KIAotVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBaQzAzMDEgZHJpdmVyIGNhbiBiZSBmb3VuZCBhdCB0aGUgZm9sbG93aW5nIFVSTDoKK1RoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgWkMwMzAxW1BdIGRyaXZlciBjYW4gYmUgZm91bmQgYXQgdGhlIGZvbGxvd2luZyBVUkw6CiBodHRwOi8vd3d3LmxpbnV4LXByb2plY3RzLm9yZy8KIAogU29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgdGhlIGRyaXZlciBhcmU6CkBAIC0xMTcsNyArMTE3LDcgQEAKIAogQW5kIGZpbmFsbHk6CiAKLQkjIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKKwkjIFY0TCBVU0IgZGV2aWNlcwogCSMKIAlDT05GSUdfVVNCX1pDMDMwMT1tCiAKQEAgLTE0Niw0NiArMTQ2LDQ2IEBACiBUeXBlOiAgICAgICAgICAgc2hvcnQgYXJyYXkgKG1pbiA9IDAsIG1heCA9IDY0KQogU3ludGF4OiAgICAgICAgIDwtMXxuWywuLi5dPgogRGVzY3JpcHRpb246ICAgIFNwZWNpZnkgVjRMMiBtaW5vciBtb2RlIG51bWJlcjoKLSAgICAgICAgICAgICAgICAtMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICBuID0gdXNlIG1pbm9yIG51bWJlciBuCi0gICAgICAgICAgICAgICAgWW91IGNhbiBzcGVjaWZ5IHVwIHRvIDY0IGNhbWVyYXMgdGhpcyB3YXkuCi0gICAgICAgICAgICAgICAgRm9yIGV4YW1wbGU6Ci0gICAgICAgICAgICAgICAgdmlkZW9fbnI9LTEsMiwtMSB3b3VsZCBhc3NpZ24gbWlub3IgbnVtYmVyIDIgdG8gdGhlIHNlY29uZAotICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgY2FtZXJhIGFuZCB1c2UgYXV0byBmb3IgdGhlIGZpcnN0IG9uZSBhbmQgZm9yIGV2ZXJ5Ci0gICAgICAgICAgICAgICAgb3RoZXIgY2FtZXJhLgorCQktMSA9IHVzZSBuZXh0IGF2YWlsYWJsZQorCQkgbiA9IHVzZSBtaW5vciBudW1iZXIgbgorCQlZb3UgY2FuIHNwZWNpZnkgdXAgdG8gNjQgY2FtZXJhcyB0aGlzIHdheS4KKwkJRm9yIGV4YW1wbGU6CisJCXZpZGVvX25yPS0xLDIsLTEgd291bGQgYXNzaWduIG1pbm9yIG51bWJlciAyIHRvIHRoZSBzZWNvbmQKKwkJcmVnaXN0ZXJlZCBjYW1lcmEgYW5kIHVzZSBhdXRvIGZvciB0aGUgZmlyc3Qgb25lIGFuZCBmb3IgZXZlcnkKKwkJb3RoZXIgY2FtZXJhLgogRGVmYXVsdDogICAgICAgIC0xCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBOYW1lOiAgICAgICAgICAgZm9yY2VfbXVubWFwCiBUeXBlOiAgICAgICAgICAgYm9vbCBhcnJheSAobWluID0gMCwgbWF4ID0gNjQpCiBTeW50YXg6ICAgICAgICAgPDB8MVssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBGb3JjZSB0aGUgYXBwbGljYXRpb24gdG8gdW5tYXAgcHJldmlvdXNseSBtYXBwZWQgYnVmZmVyIG1lbW9yeQotICAgICAgICAgICAgICAgIGJlZm9yZSBjYWxsaW5nIGFueSBWSURJT0NfU19DUk9QIG9yIFZJRElPQ19TX0ZNVCBpb2N0bCdzLiBOb3QKLSAgICAgICAgICAgICAgICBhbGwgdGhlIGFwcGxpY2F0aW9ucyBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gVGhpcyBwYXJhbWV0ZXIgaXMKLSAgICAgICAgICAgICAgICBzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCi0gICAgICAgICAgICAgICAgMCA9IGRvIG5vdCBmb3JjZSBtZW1vcnkgdW5tYXBwaW5nCi0gICAgICAgICAgICAgICAgMSA9IGZvcmNlIG1lbW9yeSB1bm1hcHBpbmcgKHNhdmUgbWVtb3J5KQorCQliZWZvcmUgY2FsbGluZyBhbnkgVklESU9DX1NfQ1JPUCBvciBWSURJT0NfU19GTVQgaW9jdGwncy4gTm90CisJCWFsbCB0aGUgYXBwbGljYXRpb25zIHN1cHBvcnQgdGhpcyBmZWF0dXJlLiBUaGlzIHBhcmFtZXRlciBpcworCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuCisJCTAgPSBkbyBub3QgZm9yY2UgbWVtb3J5IHVubWFwcGluZworCQkxID0gZm9yY2UgbWVtb3J5IHVubWFwcGluZyAoc2F2ZSBtZW1vcnkpCiBEZWZhdWx0OiAgICAgICAgMAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogTmFtZTogICAgICAgICAgIGZyYW1lX3RpbWVvdXQKIFR5cGU6ICAgICAgICAgICB1aW50IGFycmF5IChtaW4gPSAwLCBtYXggPSA2NCkKIFN5bnRheDogICAgICAgICA8blssLi4uXT4KIERlc2NyaXB0aW9uOiAgICBUaW1lb3V0IGZvciBhIHZpZGVvIGZyYW1lIGluIHNlY29uZHMuIFRoaXMgcGFyYW1ldGVyIGlzCi0gICAgICAgICAgICAgICAgc3BlY2lmaWMgZm9yIGVhY2ggZGV0ZWN0ZWQgY2FtZXJhLiBUaGlzIHBhcmFtZXRlciBjYW4gYmUKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgorCQlzcGVjaWZpYyBmb3IgZWFjaCBkZXRlY3RlZCBjYW1lcmEuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZQorCQljaGFuZ2VkIGF0IHJ1bnRpbWUgdGhhbmtzIHRvIHRoZSAvc3lzIGZpbGVzeXN0ZW0gaW50ZXJmYWNlLgogRGVmYXVsdDogICAgICAgIDIKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIE5hbWU6ICAgICAgICAgICBkZWJ1ZwogVHlwZTogICAgICAgICAgIHVzaG9ydAogU3ludGF4OiAgICAgICAgIDxuPgogRGVzY3JpcHRpb246ICAgIERlYnVnZ2luZyBpbmZvcm1hdGlvbiBsZXZlbCwgZnJvbSAwIHRvIDM6Ci0gICAgICAgICAgICAgICAgMCA9IG5vbmUgKHVzZSBjYXJlZnVsbHkpCi0gICAgICAgICAgICAgICAgMSA9IGNyaXRpY2FsIGVycm9ycwotICAgICAgICAgICAgICAgIDIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKLSAgICAgICAgICAgICAgICAzID0gbW9yZSB2ZXJib3NlIG1lc3NhZ2VzCi0gICAgICAgICAgICAgICAgTGV2ZWwgMyBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb25seSwgd2hlbiBvbmx5IG9uZSBkZXZpY2UKLSAgICAgICAgICAgICAgICBpcyB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucwotICAgICAgICAgICAgICAgIGFib3V0IHRoZSBoYXJkd2FyZSBiZWluZyBkZXRlY3RlZC4gVGhpcyBtb2R1bGUgcGFyYW1ldGVyIGNhbiBiZQotICAgICAgICAgICAgICAgIGNoYW5nZWQgYXQgcnVudGltZSB0aGFua3MgdG8gdGhlIC9zeXMgZmlsZXN5c3RlbSBpbnRlcmZhY2UuCisJCTAgPSBub25lICh1c2UgY2FyZWZ1bGx5KQorCQkxID0gY3JpdGljYWwgZXJyb3JzCisJCTIgPSBzaWduaWZpY2FudCBpbmZvcm1hdGlvbnMKKwkJMyA9IG1vcmUgdmVyYm9zZSBtZXNzYWdlcworCQlMZXZlbCAzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBvbmx5LCB3aGVuIG9ubHkgb25lIGRldmljZQorCQlpcyB1c2VkIGF0IHRoZSBzYW1lIHRpbWUuIEl0IGFsc28gc2hvd3Mgc29tZSBtb3JlIGluZm9ybWF0aW9ucworCQlhYm91dCB0aGUgaGFyZHdhcmUgYmVpbmcgZGV0ZWN0ZWQuIFRoaXMgbW9kdWxlIHBhcmFtZXRlciBjYW4gYmUKKwkJY2hhbmdlZCBhdCBydW50aW1lIHRoYW5rcyB0byB0aGUgL3N5cyBmaWxlc3lzdGVtIGludGVyZmFjZS4KIERlZmF1bHQ6ICAgICAgICAyCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTIwNCwxMSArMjA0LDI1IEBACiAweDA0MWUgICAgIDB4NDAxNwogMHgwNDFlICAgICAweDQwMWMKIDB4MDQxZSAgICAgMHg0MDFlCisweDA0MWUgICAgIDB4NDAxZgorMHgwNDFlICAgICAweDQwMjIKIDB4MDQxZSAgICAgMHg0MDM0CiAweDA0MWUgICAgIDB4NDAzNQorMHgwNDFlICAgICAweDQwMzYKKzB4MDQxZSAgICAgMHg0MDNhCisweDA0NTggICAgIDB4NzAwNworMHgwNDU4ICAgICAweDcwMEMKKzB4MDQ1OCAgICAgMHg3MDBmCisweDA0NmQgICAgIDB4MDhhZQorMHgwNTVmICAgICAweGQwMDMKKzB4MDU1ZiAgICAgMHhkMDA0CiAweDA0NmQgICAgIDB4MDhhZQogMHgwYWM4ICAgICAweDAzMDEKKzB4MGFjOCAgICAgMHgzMDFiCisweDBhYzggICAgIDB4MzAzYgorMHgxMGZkICAgICAweDAxMjgKIDB4MTBmZCAgICAgMHg4MDUwCisweDEwZmQgICAgIDB4ODA0ZQogCiBUaGUgbGlzdCBhYm92ZSBkb2VzIG5vdCBpbXBseSB0aGF0IGFsbCB0aG9zZSBkZXZpY2VzIHdvcmsgd2l0aCB0aGlzIGRyaXZlcjogdXAKIHVudGlsIG5vdyBvbmx5IHRoZSBvbmVzIHRoYXQgbW91bnQgdGhlIGZvbGxvd2luZyBpbWFnZSBzZW5zb3JzIGFyZSBzdXBwb3J0ZWQ7CkBAIC0yMTcsNiArMjMxLDcgQEAKIE1vZGVsICAgICAgIE1hbnVmYWN0dXJlcgogLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tCiBQQVMyMDJCQ0IgICBQaXhBcnQgSW1hZ2luZywgSW5jLgorUEItMDMzMCAgICAgUGhvdG9iaXQgQ29ycG9yYXRpb24KIAogCiA5LiBOb3RlcyBmb3IgVjRMMiBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzCkBAIC0yNTAsNSArMjY1LDYgQEAKICAgYmVlbiB0YWtlbiBmcm9tIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBaQzAzMHggVmlkZW80TGludXgxIGRyaXZlciB3cml0dGVuCiAgIGJ5IEFuZHJldyBCaXJrZXR0IDxhbmR5QG5vYnVncy5vcmc+OwogLSBUaGUgaW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDEgY29udHJvbGxlciBjb25uZWN0ZWQgdG8gdGhlIFBBUzIwMkJDQgotICBpbWFnZSBzZW5zb3IgaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggZHJpdmVyIG1haW50YWluZWQgYnkKLSAgTWljaGVsIFhoYWFyZCA8bXhoYWFyZEBtYWdpYy5mcj4uCisgIGFuZCBQQi0wMzMwIGltYWdlIHNlbnNvcnMgaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggZHJpdmVyIG1haW50YWluZWQKKyAgYnkgTWljaGVsIFhoYWFyZCA8bXhoYWFyZEBtYWdpYy5mcj47CistIFN0YW5pc2xhdiBMZWNoZXYgZG9uYXRlZCBvbmUgY2FtZXJhLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9wYWdlX21pZ3JhdGlvbiBiL0RvY3VtZW50YXRpb24vdm0vcGFnZV9taWdyYXRpb24KaW5kZXggMGRkNGVmMy4uOTlmODlhYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92bS9wYWdlX21pZ3JhdGlvbgorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3BhZ2VfbWlncmF0aW9uCkBAIC0yNiw4ICsyNiwxMyBAQAogTWFudWFsIG1pZ3JhdGlvbiBpcyB1c2VmdWwgaWYgZm9yIGV4YW1wbGUgdGhlIHNjaGVkdWxlciBoYXMgcmVsb2NhdGVkCiBhIHByb2Nlc3MgdG8gYSBwcm9jZXNzb3Igb24gYSBkaXN0YW50IG5vZGUuIEEgYmF0Y2ggc2NoZWR1bGVyIG9yIGFuCiBhZG1pbmlzdHJhdG9yIG1heSBkZXRlY3QgdGhlIHNpdHVhdGlvbiBhbmQgbW92ZSB0aGUgcGFnZXMgb2YgdGhlIHByb2Nlc3MKLW5lYXJlciB0byB0aGUgbmV3IHByb2Nlc3Nvci4gQXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlIHdlIG1heSBoYXZlCi1zb21lIG1lY2hhbmlzbSBpbiB0aGUgc2NoZWR1bGVyIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IG1vdmUgdGhlIHBhZ2VzLgorbmVhcmVyIHRvIHRoZSBuZXcgcHJvY2Vzc29yLiBUaGUga2VybmVsIGl0c2VsZiBkb2VzIG9ubHkgcHJvdmlkZQorbWFudWFsIHBhZ2UgbWlncmF0aW9uIHN1cHBvcnQuIEF1dG9tYXRpYyBwYWdlIG1pZ3JhdGlvbiBtYXkgYmUgaW1wbGVtZW50ZWQKK3Rocm91Z2ggdXNlciBzcGFjZSBwcm9jZXNzZXMgdGhhdCBtb3ZlIHBhZ2VzLiBBIHNwZWNpYWwgZnVuY3Rpb24gY2FsbAorIm1vdmVfcGFnZXMiIGFsbG93cyB0aGUgbW92aW5nIG9mIGluZGl2aWR1YWwgcGFnZXMgd2l0aGluIGEgcHJvY2Vzcy4KK0EgTlVNQSBwcm9maWxlciBtYXkgZi5lLiBvYnRhaW4gYSBsb2cgc2hvd2luZyBmcmVxdWVudCBvZmYgbm9kZQorYWNjZXNzZXMgYW5kIG1heSB1c2UgdGhlIHJlc3VsdCB0byBtb3ZlIHBhZ2VzIHRvIG1vcmUgYWR2YW50YWdlb3VzCitsb2NhdGlvbnMuCiAKIExhcmdlciBpbnN0YWxsYXRpb25zIHVzdWFsbHkgcGFydGl0aW9uIHRoZSBzeXN0ZW0gdXNpbmcgY3B1c2V0cyBpbnRvCiBzZWN0aW9ucyBvZiBub2Rlcy4gUGF1bCBKYWNrc29uIGhhcyBlcXVpcHBlZCBjcHVzZXRzIHdpdGggdGhlIGFiaWxpdHkgdG8KQEAgLTYyLDIyICs2NywxNCBAQAogICAgSXQgYWxzbyBwcmV2ZW50cyB0aGUgc3dhcHBlciBvciBvdGhlciBzY2FucyB0byBlbmNvdW50ZXIKICAgIHRoZSBwYWdlLgogCi0yLiBHZW5lcmF0ZSBhIGxpc3Qgb2YgbmV3bHkgYWxsb2NhdGVzIHBhZ2UuIFRoZXNlIHBhZ2VzIHdpbGwgY29udGFpbiB0aGUKLSAgIGNvbnRlbnRzIG9mIHRoZSBwYWdlcyBmcm9tIHRoZSBmaXJzdCBsaXN0IGFmdGVyIHBhZ2UgbWlncmF0aW9uIGlzCi0gICBjb21wbGV0ZS4KKzIuIFdlIG5lZWQgdG8gaGF2ZSBhIGZ1bmN0aW9uIG9mIHR5cGUgbmV3X3BhZ2VfdCB0aGF0IGNhbiBiZQorICAgcGFzc2VkIHRvIG1pZ3JhdGVfcGFnZXMoKS4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZmlndXJlIG91dAorICAgaG93IHRvIGFsbG9jYXRlIHRoZSBjb3JyZWN0IG5ldyBwYWdlIGdpdmVuIHRoZSBvbGQgcGFnZS4KIAogMy4gVGhlIG1pZ3JhdGVfcGFnZXMoKSBmdW5jdGlvbiBpcyBjYWxsZWQgd2hpY2ggYXR0ZW1wdHMKLSAgIHRvIGRvIHRoZSBtaWdyYXRpb24uIEl0IHJldHVybnMgdGhlIG1vdmVkIHBhZ2VzIGluIHRoZQotICAgbGlzdCBzcGVjaWZpZWQgYXMgdGhlIHRoaXJkIHBhcmFtZXRlciBhbmQgdGhlIGZhaWxlZAotICAgbWlncmF0aW9ucyBpbiB0aGUgZm91cnRoIHBhcmFtZXRlci4gVGhlIGZpcnN0IHBhcmFtZXRlcgotICAgd2lsbCBjb250YWluIHRoZSBwYWdlcyB0aGF0IGNvdWxkIHN0aWxsIGJlIHJldHJpZWQuCi0KLTQuIFRoZSBsZWZ0b3ZlciBwYWdlcyBvZiB2YXJpb3VzIHR5cGVzIGFyZSByZXR1cm5lZAotICAgdG8gdGhlIExSVSB1c2luZyBwdXRiYWNrX3RvX2xydV9wYWdlcygpIG9yIG90aGVyd2lzZQotICAgZGlzcG9zZWQgb2YuIFRoZSBwYWdlcyB3aWxsIHN0aWxsIGhhdmUgdGhlIHJlZmNvdW50IGFzCi0gICBpbmNyZWFzZWQgYnkgaXNvbGF0ZV9scnVfcGFnZXMoKSBpZiBwdXRiYWNrX3RvX2xydV9wYWdlcygpIGlzIG5vdAotICAgdXNlZCEgVGhlIGtlcm5lbCBtYXkgd2FudCB0byBoYW5kbGUgdGhlIHZhcmlvdXMgY2FzZXMgb2YgZmFpbHVyZXMgaW4KLSAgIGRpZmZlcmVudCB3YXlzLgorICAgdG8gZG8gdGhlIG1pZ3JhdGlvbi4gSXQgd2lsbCBjYWxsIHRoZSBmdW5jdGlvbiB0byBhbGxvY2F0ZQorICAgdGhlIG5ldyBwYWdlIGZvciBlYWNoIHBhZ2UgdGhhdCBpcyBjb25zaWRlcmVkIGZvcgorICAgbW92aW5nLgogCiBCLiBIb3cgbWlncmF0ZV9wYWdlcygpIHdvcmtzCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05Myw4MyArOTAsNTggQEAKIAogMi4gSW5zdXJlIHRoYXQgd3JpdGViYWNrIGlzIGNvbXBsZXRlLgogCi0zLiBNYWtlIHN1cmUgdGhhdCB0aGUgcGFnZSBoYXMgYXNzaWduZWQgc3dhcCBjYWNoZSBlbnRyeSBpZgotICAgaXQgaXMgYW4gYW5vbnlvdXMgcGFnZS4gVGhlIHN3YXAgY2FjaGUgcmVmZXJlbmNlIGlzIG5lY2Vzc2FyeQotICAgdG8gcHJlc2VydmUgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW4gaW4gdGhlIHBhZ2UgdGFibGUgbWFwcyB3aGlsZQotICAgcGFnZSBtaWdyYXRpb24gb2NjdXJzLgotCi00LiBQcmVwIHRoZSBuZXcgcGFnZSB0aGF0IHdlIHdhbnQgdG8gbW92ZSB0by4gSXQgaXMgbG9ja2VkCiszLiBQcmVwIHRoZSBuZXcgcGFnZSB0aGF0IHdlIHdhbnQgdG8gbW92ZSB0by4gSXQgaXMgbG9ja2VkCiAgICBhbmQgc2V0IHRvIG5vdCBiZWluZyB1cHRvZGF0ZSBzbyB0aGF0IGFsbCBhY2Nlc3NlcyB0byB0aGUgbmV3CiAgICBwYWdlIGltbWVkaWF0ZWx5IGxvY2sgd2hpbGUgdGhlIG1vdmUgaXMgaW4gcHJvZ3Jlc3MuCiAKLTUuIEFsbCB0aGUgcGFnZSB0YWJsZSByZWZlcmVuY2VzIHRvIHRoZSBwYWdlIGFyZSBlaXRoZXIgZHJvcHBlZCAoZmlsZQotICAgYmFja2VkIHBhZ2VzKSBvciBjb252ZXJ0ZWQgdG8gc3dhcCByZWZlcmVuY2VzIChhbm9ueW1vdXMgcGFnZXMpLgotICAgVGhpcyBzaG91bGQgZGVjcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudC4KKzQuIFRoZSBuZXcgcGFnZSBpcyBwcmVwcGVkIHdpdGggc29tZSBzZXR0aW5ncyBmcm9tIHRoZSBvbGQgcGFnZSBzbyB0aGF0CisgICBhY2Nlc3NlcyB0byB0aGUgbmV3IHBhZ2Ugd2lsbCBkaXNjb3ZlciBhIHBhZ2Ugd2l0aCB0aGUgY29ycmVjdCBzZXR0aW5ncy4KKworNS4gQWxsIHRoZSBwYWdlIHRhYmxlIHJlZmVyZW5jZXMgdG8gdGhlIHBhZ2UgYXJlIGNvbnZlcnRlZAorICAgdG8gbWlncmF0aW9uIGVudHJpZXMgb3IgZHJvcHBlZCAobm9ubGluZWFyIHZtYXMpLgorICAgVGhpcyBkZWNyZWFzZSB0aGUgbWFwY291bnQgb2YgYSBwYWdlLiBJZiB0aGUgcmVzdWx0aW5nCisgICBtYXBjb3VudCBpcyBub3QgemVybyB0aGVuIHdlIGRvIG5vdCBtaWdyYXRlIHRoZSBwYWdlLgorICAgQWxsIHVzZXIgc3BhY2UgcHJvY2Vzc2VzIHRoYXQgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIHBhZ2UKKyAgIHdpbGwgbm93IHdhaXQgb24gdGhlIHBhZ2UgbG9jay4KIAogNi4gVGhlIHJhZGl4IHRyZWUgbG9jayBpcyB0YWtlbi4gVGhpcyB3aWxsIGNhdXNlIGFsbCBwcm9jZXNzZXMgdHJ5aW5nCi0gICB0byByZWVzdGFibGlzaCBhIHB0ZSB0byBibG9jayBvbiB0aGUgcmFkaXggdHJlZSBzcGlubG9jay4KKyAgIHRvIGFjY2VzcyB0aGUgcGFnZSB2aWEgdGhlIG1hcHBpbmcgdG8gYmxvY2sgb24gdGhlIHJhZGl4IHRyZWUgc3BpbmxvY2suCiAKIDcuIFRoZSByZWZjb3VudCBvZiB0aGUgcGFnZSBpcyBleGFtaW5lZCBhbmQgd2UgYmFjayBvdXQgaWYgcmVmZXJlbmNlcyByZW1haW4KICAgIG90aGVyd2lzZSB3ZSBrbm93IHRoYXQgd2UgYXJlIHRoZSBvbmx5IG9uZSByZWZlcmVuY2luZyB0aGlzIHBhZ2UuCiAKIDguIFRoZSByYWRpeCB0cmVlIGlzIGNoZWNrZWQgYW5kIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHBvaW50ZXIgdG8gdGhpcwotICAgcGFnZSB0aGVuIHdlIGJhY2sgb3V0IGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1vZGlmaWVkIHRoZSBtYXBwaW5nIGZpcnN0LgorICAgcGFnZSB0aGVuIHdlIGJhY2sgb3V0IGJlY2F1c2Ugc29tZW9uZSBlbHNlIG1vZGlmaWVkIHRoZSByYWRpeCB0cmVlLgogCi05LiBUaGUgbWFwcGluZyBpcyBjaGVja2VkLiBJZiB0aGUgbWFwcGluZyBpcyBnb25lIHRoZW4gYSB0cnVuY2F0ZSBhY3Rpb24gbWF5Ci0gICBiZSBpbiBwcm9ncmVzcyBhbmQgd2UgYmFjayBvdXQuCis5LiBUaGUgcmFkaXggdHJlZSBpcyBjaGFuZ2VkIHRvIHBvaW50IHRvIHRoZSBuZXcgcGFnZS4KIAotMTAuIFRoZSBuZXcgcGFnZSBpcyBwcmVwcGVkIHdpdGggc29tZSBzZXR0aW5ncyBmcm9tIHRoZSBvbGQgcGFnZSBzbyB0aGF0Ci0gICBhY2Nlc3NlcyB0byB0aGUgbmV3IHBhZ2Ugd2lsbCBiZSBkaXNjb3ZlcmVkIHRvIGhhdmUgdGhlIGNvcnJlY3Qgc2V0dGluZ3MuCisxMC4gVGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2xkIHBhZ2UgaXMgZHJvcHBlZCBiZWNhdXNlIHRoZSByYWRpeCB0cmVlCisgICAgcmVmZXJlbmNlIGlzIGdvbmUuIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXcgcGFnZSBpcyBlc3RhYmxpc2hlZCBiZWNhdXNlCisgICAgdGhlIG5ldyBwYWdlIGlzIHJlZmVyZW5jZWQgdG8gYnkgdGhlIHJhZGl4IHRyZWUuCiAKLTExLiBUaGUgcmFkaXggdHJlZSBpcyBjaGFuZ2VkIHRvIHBvaW50IHRvIHRoZSBuZXcgcGFnZS4KKzExLiBUaGUgcmFkaXggdHJlZSBsb2NrIGlzIGRyb3BwZWQuIFdpdGggdGhhdCBsb29rdXBzIGluIHRoZSBtYXBwaW5nCisgICAgYmVjb21lIHBvc3NpYmxlIGFnYWluLiBQcm9jZXNzZXMgd2lsbCBtb3ZlIGZyb20gc3Bpbm5pbmcgb24gdGhlIHRyZWVfbG9jaworICAgIHRvIHNsZWVwaW5nIG9uIHRoZSBsb2NrZWQgbmV3IHBhZ2UuCiAKLTEyLiBUaGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvbGQgcGFnZSBpcyBkcm9wcGVkIGJlY2F1c2UgdGhlIHJhZGl4IHRyZWUKLSAgICByZWZlcmVuY2UgaXMgZ29uZS4KKzEyLiBUaGUgcGFnZSBjb250ZW50cyBhcmUgY29waWVkIHRvIHRoZSBuZXcgcGFnZS4KIAotMTMuIFRoZSByYWRpeCB0cmVlIGxvY2sgaXMgZHJvcHBlZC4gV2l0aCB0aGF0IGxvb2t1cHMgYmVjb21lIHBvc3NpYmxlIGFnYWluCi0gICAgYW5kIG90aGVyIHByb2Nlc3NlcyB3aWxsIG1vdmUgZnJvbSBzcGlubmluZyBvbiB0aGUgdHJlZSBsb2NrIHRvIHNsZWVwaW5nIG9uCi0gICAgdGhlIGxvY2tlZCBuZXcgcGFnZS4KKzEzLiBUaGUgcmVtYWluaW5nIHBhZ2UgZmxhZ3MgYXJlIGNvcGllZCB0byB0aGUgbmV3IHBhZ2UuCiAKLTE0LiBUaGUgcGFnZSBjb250ZW50cyBhcmUgY29waWVkIHRvIHRoZSBuZXcgcGFnZS4KKzE0LiBUaGUgb2xkIHBhZ2UgZmxhZ3MgYXJlIGNsZWFyZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcGFnZSBkb2VzCisgICAgbm90IHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFueW1vcmUuCiAKLTE1LiBUaGUgcmVtYWluaW5nIHBhZ2UgZmxhZ3MgYXJlIGNvcGllZCB0byB0aGUgbmV3IHBhZ2UuCisxNS4gUXVldWVkIHVwIHdyaXRlYmFjayBvbiB0aGUgbmV3IHBhZ2UgaXMgdHJpZ2dlcmVkLgogCi0xNi4gVGhlIG9sZCBwYWdlIGZsYWdzIGFyZSBjbGVhcmVkIHRvIGluZGljYXRlIHRoYXQgdGhlIHBhZ2UgZG9lcwotICAgIG5vdCB1c2UgYW55IGluZm9ybWF0aW9uIGFueW1vcmUuCi0KLTE3LiBRdWV1ZWQgdXAgd3JpdGViYWNrIG9uIHRoZSBuZXcgcGFnZSBpcyB0cmlnZ2VyZWQuCi0KLTE4LiBJZiBzd2FwIHB0ZSdzIHdlcmUgZ2VuZXJhdGVkIGZvciB0aGUgcGFnZSB0aGVuIHJlcGxhY2UgdGhlbSB3aXRoIHJlYWwKLSAgICBwdGVzLiBUaGlzIHdpbGwgcmVlbmFibGUgYWNjZXNzIGZvciBwcm9jZXNzZXMgbm90IGJsb2NrZWQgYnkgdGhlIHBhZ2UgbG9jay4KKzE2LiBJZiBtaWdyYXRpb24gZW50cmllcyB3ZXJlIHBhZ2UgdGhlbiByZXBsYWNlIHRoZW0gd2l0aCByZWFsIHB0ZXMuIERvaW5nCisgICAgc28gd2lsbCBlbmFibGUgYWNjZXNzIGZvciB1c2VyIHNwYWNlIHByb2Nlc3NlcyBub3QgYWxyZWFkeSB3YWl0aW5nIGZvcgorICAgIHRoZSBwYWdlIGxvY2suCiAKIDE5LiBUaGUgcGFnZSBsb2NrcyBhcmUgZHJvcHBlZCBmcm9tIHRoZSBvbGQgYW5kIG5ldyBwYWdlLgotICAgIFByb2Nlc3NlcyB3YWl0aW5nIG9uIHRoZSBwYWdlIGxvY2sgY2FuIGNvbnRpbnVlLgorICAgIFByb2Nlc3NlcyB3YWl0aW5nIG9uIHRoZSBwYWdlIGxvY2sgd2lsbCByZWRvIHRoZWlyIHBhZ2UgZmF1bHRzCisgICAgYW5kIHdpbGwgcmVhY2ggdGhlIG5ldyBwYWdlLgogCiAyMC4gVGhlIG5ldyBwYWdlIGlzIG1vdmVkIHRvIHRoZSBMUlUgYW5kIGNhbiBiZSBzY2FubmVkIGJ5IHRoZSBzd2FwcGVyCiAgICAgZXRjIGFnYWluLgogCi1UT0RPIGxpc3QKLS0tLS0tLS0tLQotCi0tIFBhZ2UgbWlncmF0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2Ygc3dhcCBoYW5kbGVzIHRvIHByZXNlcnZlIHRoZQotICBpbmZvcm1hdGlvbiBvZiB0aGUgYW5vbnltb3VzIHBhZ2UgdGFibGUgZW50cmllcy4gVGhpcyBtZWFucyB0aGF0IHN3YXAKLSAgc3BhY2UgaXMgcmVzZXJ2ZWQgYnV0IG5ldmVyIHVzZWQuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzd2FwIGhhbmRsZXMgdXNlZAotICBpcyBkZXRlcm1pbmVkIGJ5IENIVU5LX1NJWkUgKHNlZSBtbS9tZW1wb2xpY3kuYykgcGVyIG9uZ29pbmcgbWlncmF0aW9uLgotICBSZXNlcnZhdGlvbiBvZiBwYWdlcyBjb3VsZCBiZSBhdm9pZGVkIGJ5IGhhdmluZyBhIHNwZWNpYWwgdHlwZSBvZiBzd2FwCi0gIGhhbmRsZSB0aGF0IGRvZXMgbm90IHJlcXVpcmUgc3dhcCBzcGFjZSBhbmQgdGhhdCB3b3VsZCBvbmx5IHRyYWNrIHRoZSBwYWdlCi0gIHJlZmVyZW5jZXMuIFNvbWV0aGluZyBsaWtlIHRoYXQgd2FzIHByb3Bvc2VkIGJ5IE1hcmNlbG8gVG9zYXR0aSBpbiB0aGUKLSAgcGFzdCAoc2VhcmNoIGZvciBtaWdyYXRpb24gY2FjaGUgb24gbGttbCBvciBsaW51eC1tbUBrdmFjay5vcmcpLgotCi0tIFBhZ2UgbWlncmF0aW9uIHVubWFwcyBwdGVzIGZvciBmaWxlIGJhY2tlZCBwYWdlcyBhbmQgcmVxdWlyZXMgcGFnZQotICBmYXVsdHMgdG8gcmVlc3RhYmxpc2ggdGhlc2UgcHRlcy4gVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgYnkgc29tZWhvdwotICByZWNvcmRpbmcgdGhlIHJlZmVyZW5jZXMgYmVmb3JlIG1pZ3JhdGlvbiBhbmQgdGhlbiByZWVzdGFibGlzaCB0aGVtIGxhdGVyLgotICBIb3dldmVyLCB0aGVyZSBhcmUgc2V2ZXJhbCBsb2NraW5nIGNoYWxsZW5nZXMgdGhhdCBoYXZlIHRvIGJlIG92ZXJjb21lCi0gIGJlZm9yZSB0aGlzIGlzIHBvc3NpYmxlLgotCi0tIFBhZ2UgbWlncmF0aW9uIGdlbmVyYXRlcyByZWFkIHB0ZXMgZm9yIGFub255bW91cyBwYWdlcy4gRGlydHkgcGFnZQotICBmYXVsdHMgYXJlIHJlcXVpcmVkIHRvIG1ha2UgdGhlIHBhZ2VzIHdyaXRhYmxlIGFnYWluLiBJdCBtYXkgYmUgcG9zc2libGUKLSAgdG8gZ2VuZXJhdGUgYSBwdGUgbWFya2VkIGRpcnR5IGlmIGl0IGlzIGtub3duIHRoYXQgdGhlIHBhZ2UgaXMgZGlydHkgYW5kCi0gIHRoYXQgdGhpcyBwcm9jZXNzIGhhcyB0aGUgb25seSByZWZlcmVuY2UgdG8gdGhhdCBwYWdlLgotCi1DaHJpc3RvcGggTGFtZXRlciwgTWFyY2ggOCwgMjAwNi4KK0NocmlzdG9waCBMYW1ldGVyLCBNYXkgOCwgMjAwNi4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93MS9tYXN0ZXJzL2RzMjQ5MCBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhNDkxOAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vdzEvbWFzdGVycy9kczI0OTAKQEAgLTAsMCArMSwxOCBAQAorS2VybmVsIGRyaXZlciBkczI0OTAKKz09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBNYXhpbSBEUzI0OTAgYmFzZWQKKworQXV0aG9yOiBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgorCisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgTWFpeG0vRGFsbGFzIFNlbWljb25kdWN0b3IgRFMyNDkwIGlzIGEgY2hpcAord2hpY2ggYWxsb3dzIHRvIGJ1aWxkIFVTQiA8LT4gVzEgYnJpZGdlcy4KKworRFM5NDkwKFIpIGlzIGEgVVNCIDwtPiBXMSBidXMgbWFzdGVyIGRldmljZQord2hpY2ggaGFzIDB4ODEgZmFtaWx5IElEIGludGVncmF0ZWQgY2hpcCBhbmQgRFMyNDkwCitsb3ctbGV2ZWwgb3BlcmF0aW9uYWwgY2hpcC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvdzEuZ2VuZXJpYyBiL0RvY3VtZW50YXRpb24vdzEvdzEuZ2VuZXJpYwppbmRleCBmOTM3ZmJlLi40YzY1MDlkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3cxL3cxLmdlbmVyaWMKKysrIGIvRG9jdW1lbnRhdGlvbi93MS93MS5nZW5lcmljCkBAIC0yNyw4ICsyNywxOSBAQAogCiBXaGVuIGEgZGV2aWNlIGlzIGZvdW5kIG9uIHRoZSBidXMsIHcxIGNvcmUgY2hlY2tzIGlmIGRyaXZlciBmb3IgaXQncyBmYW1pbHkgaXMKIGxvYWRlZC4gSWYgc28sIHRoZSBmYW1pbHkgZHJpdmVyIGlzIGF0dGFjaGVkIHRvIHRoZSBzbGF2ZS4KLUlmIHRoZXJlIGlzIG5vIGRyaXZlciBmb3IgdGhlIGZhbWlseSwgYSBzaW1wbGUgc3lzZnMgZW50cnkgaXMgY3JlYXRlZAotZm9yIHRoZSBzbGF2ZSBkZXZpY2UuCitJZiB0aGVyZSBpcyBubyBkcml2ZXIgZm9yIHRoZSBmYW1pbHksIGRlZmF1bHQgb25lIGlzIGFzc2lnbmVkLCB3aGljaCBhbGxvd3MgdG8gcGVyZm9ybQorYWxtb3N0IGFueSBraW5kIG9mIG9wZXJhdGlvbnMuIEVhY2ggbG9naWNhbCBvcGVyYXRpb24gaXMgYSB0cmFuc2FjdGlvbgoraW4gbmF0dXJlLCB3aGljaCBjYW4gY29udGFpbiBzZXZlcmFsICh0d28gb3Igb25lKSBsb3ctbGV2ZWwgb3BlcmF0aW9ucy4KK0xldCdzIHNlZSBob3cgb25lIGNhbiByZWFkIEVFUFJPTSBjb250ZXh0OgorMS4gb25lIG11c3Qgd3JpdGUgY29udHJvbCBidWZmZXIsIGkuZS4gYnVmZmVyIGNvbnRhaW5pbmcgY29tbWFuZCBieXRlCithbmQgdHdvIGJ5dGUgYWRkcmVzcy4gQXQgdGhpcyBzdGVwIGJ1cyBpcyByZXNldCBhbmQgYXBwcm9wcmlhdGUgZGV2aWNlCitpcyBzZWxlY3RlZCB1c2luZyBlaXRoZXIgVzFfU0tJUF9ST00gb3IgVzFfTUFUQ0hfUk9NIGNvbW1hbmQuCitUaGVuIHByb3ZpZGVkIGNvbnRyb2wgYnVmZmVyIGlzIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIHdpcmUuCisyLiByZWFkaW5nLiBUaGlzIHdpbGwgaXNzdWUgcmVhZGluZyBlZXByb20gcmVzcG9uc2UuCisKK0l0IGlzIHBvc3NpYmxlIHRoYXQgYmV0d2VlbiAxLiBhbmQgMi4gdzEgbWFzdGVyIHRocmVhZCB3aWxsIHJlc2V0IGJ1cyBmb3Igc2VhcmNoaW5nCithbmQgc2xhdmUgZGV2aWNlIHdpbGwgYmUgZXZlbiByZW1vdmVkLCBidXQgaW4gdGhpcyBjYXNlIDB4ZmYgd2lsbAorYmUgcmVhZCwgc2luY2Ugbm8gZGV2aWNlIHdhcyBzZWxlY3RlZC4KIAogCiBXMSBkZXZpY2UgZmFtaWxpZXMKQEAgLTg5LDQgKzEwMCw1IEBACiBuYW1lICAgICAgICAgICAgICAgLSB0aGUgZGV2aWNlIG5hbWUsIHVzdWFsbHkgdGhlIHNhbWUgYXMgdGhlIGRpcmVjdG9yeSBuYW1lCiB3MV9zbGF2ZSAgICAgICAgICAgLSAob3B0aW9uYWwpIGEgYmluYXJ5IGZpbGUgd2hvc2UgbWVhbmluZyBkZXBlbmRzIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgZmFtaWx5IGRyaXZlcgotCitydwkJICAgLSAob3B0aW9uYWwpIGNyZWF0ZWQgZm9yIHNsYXZlIGRldmljZXMgd2hpY2ggZG8gbm90IGhhdmUKKwkJICAgICBhcHByb3ByaWF0ZSBmYW1pbHkgZHJpdmVyLiBBbGxvd3MgdG8gcmVhZC93cml0ZSBiaW5hcnkgZGF0YS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluayBiL0RvY3VtZW50YXRpb24vdzEvdzEubmV0bGluawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQwYzdjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi93MS93MS5uZXRsaW5rCkBAIC0wLDAgKzEsOTggQEAKK1VzZXJzcGFjZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIG92ZXIgY29ubmVjdG9yIFsxXS4KKworCitNZXNzYWdlIHR5cGVzLgorPT09PT09PT09PT09PQorCitUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgbWVzc2FnZXMgYmV0d2VlbiB3MSBjb3JlIGFuZCB1c2Vyc3BhY2U6CisxLiBFdmVudHMuIFRoZXkgYXJlIGdlbmVyYXRlZCBlYWNoIHRpbWUgbmV3IG1hc3RlciBvciBzbGF2ZSBkZXZpY2UgZm91bmQKKwllaXRoZXIgZHVlIHRvIGF1dG9tYXRpYyBvciByZXF1ZXN0ZWQgc2VhcmNoLgorMi4gVXNlcnNwYWNlIGNvbW1hbmRzLiBJbmNsdWRlcyByZWFkL3dyaXRlIGFuZCBzZWFyY2gvYWxhcm0gc2VhcmNoIGNvbWFtbmRzLgorMy4gUmVwbGllcyB0byB1c2Vyc3BhY2UgY29tbWFuZHMuCisKKworUHJvdG9jb2wuCis9PT09PT09PQorCitbc3RydWN0IGNuX21zZ10gLSBjb25uZWN0b3IgaGVhZGVyLiBJdCdzIGxlbmd0aCBmaWVsZCBpcyBlcXVhbCB0byBzaXplIG9mIHRoZSBhdHRhY2hlZCBkYXRhLgorW3N0cnVjdCB3MV9uZXRsaW5rX21zZ10gLSB3MSBuZXRsaW5rIGhlYWRlci4KKwlfX3U4IHR5cGUgCS0gbWVzc2FnZSB0eXBlLgorCQkJVzFfU0xBVkVfQUREL1cxX1NMQVZFX1JFTU9WRSAtIHNsYXZlIGFkZC9yZW1vdmUgZXZlbnRzLgorCQkJVzFfTUFTVEVSX0FERC9XMV9NQVNURVJfUkVNT1ZFIC0gbWFzdGVyIGFkZC9yZW1vdmUgZXZlbnRzLgorCQkJVzFfTUFTVEVSX0NNRCAtIHVzZXJzcGFjZSBjb21tYW5kIGZvciBidXMgbWFzdGVyIGRldmljZSAoc2VhcmNoL2FsYXJtIHNlYXJjaCkuCisJCQlXMV9TTEFWRV9DTUQgLSB1c2Vyc3BhY2UgY29tbWFuZCBmb3Igc2xhdmUgZGV2aWNlIChyZWFkL3dyaXRlLyBzZWFyY2gvYWxhcm0gc2VhcmNoCisJCQkJCWZvciBidXMgbWFzdGVyIGRldmljZSB3aGVyZSBnaXZlbiBzbGF2ZSBkZXZpY2UgZm91bmQpLgorCV9fdTggcmVzCS0gcmVzZXJ2ZWQKKwlfX3UxNiBsZW4JLSBzaXplIG9mIGF0dGFjaGVkIHRvIHRoaXMgaGVhZGVyIGRhdGEuCisJdW5pb24geworCQlfX3U4IGlkOwkJCSAtIHNsYXZlIHVuaXF1ZSBkZXZpY2UgaWQKKwkJc3RydWN0IHcxX21zdCB7CisJCQlfX3UzMgkJaWQ7CSAtIG1hc3RlcidzIGlkLgorCQkJX191MzIJCXJlczsJIC0gcmVzZXJ2ZWQKKwkJfSBtc3Q7CisJfSBpZDsKKworW3N0cnVjcnQgdzFfbmV0bGlua19jbWRdIC0gY29tbWFuZCBmb3IgZ2l2ZWQgbWFzdGVyIG9yIHNsYXZlIGRldmljZS4KKwlfX3U4IGNtZAktIGNvbW1hbmQgb3Bjb2RlLgorCQkJVzFfQ01EX1JFQUQgCS0gcmVhZCBjb21tYW5kLgorCQkJVzFfQ01EX1dSSVRFCS0gd3JpdGUgY29tbWFuZC4KKwkJCVcxX0NNRF9TRUFSQ0gJLSBzZWFyY2ggY29tbWFuZC4KKwkJCVcxX0NNRF9BTEFSTV9TRUFSQ0ggLSBhbGFybSBzZWFyY2ggY29tbWFuZC4KKwlfX3U4IHJlcwktIHJlc2VydmVkCisJX191MTYgbGVuCS0gbGVuZ3RoIG9mIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KKwkJCUZvciByZWFkIGNvbW1hbmQgZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCBsaWtlIGZvciB3cml0ZSBjb21tYW5kLgorCV9fdTggZGF0YVswXQktIGRhdGEgZm9yIHRoaXMgY29tbWFuZC4KKworCitFYWNoIGNvbm5lY3RvciBtZXNzYWdlIGNhbiBpbmNsdWRlIG9uZSBvciBtb3JlIHcxX25ldGxpbmtfbXNnIHdpdGggemVybyBvZiBtb3JlIGF0dGFjaGVkIHcxX25ldGxpbmtfY21kIG1lc3NhZ2VzLgorCitGb3IgZXZlbnQgbWVzc2FnZXMgdGhlcmUgYXJlIG5vIHcxX25ldGxpbmtfY21kIGVtYmVkZGVkIHN0cnVjdHVyZXMsIG9ubHkgY29ubmVjdG9yIGhlYWRlcgorYW5kIHcxX25ldGxpbmtfbXNnIHN0cnVjdXRyZSB3aXRoICJsZW4iIGZpZWxkIGJlaW5nIHplcm8gYW5kIGZpbGxlZCB0eXBlIChvbmUgb2YgZXZlbnQgdHlwZXMpCithbmQgaWQgLSBlaXRoZXIgOCBieXRlcyBvZiBzbGF2ZSB1bmlxdWUgaWQgaW4gaG9zdCBvcmRlciwgb3IgbWFzdGVyJ3MgaWQsIHdoaWNoIGlzIGFzc2lnbmVkCit0byBidXMgbWFzdGVyIGRldmljZSB3aGVuIGl0IGlzIGFkZGVkIHRvIHcxIGNvcmUuCisKK0N1cnJlbnRseSByZXBsaWVzIHRvIHVzZXJzcGFjZSBjb21tYW5kcyBhcmUgb25seSBnZW5lcmF0ZWQgZm9yIHJlYWQgY29tbWFuZCByZXF1ZXN0LgorT25lIHJlcGx5IGlzIGdlbmVyYXRlZCBleGFjdGx5IGZvciBvbmUgdzFfbmV0bGlua19jbWQgcmVhZCByZXF1ZXN0LgorUmVwbGllcyBhcmUgbm90IGNvbWJpbmVkIHdoZW4gc2VudCAtIGkuZS4gdHlwaWNhbCByZXBseSBtZXNzYWdlcyBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CitbY25fbXNnXVt3MV9uZXRsaW5rX21zZ11bdzFfbmV0bGlua19jbWRdCitjbl9tc2cubGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOwordzFfbmV0bGlua19tc2cubGVuID0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKyBjbWQtPmxlbjsKK3cxX25ldGxpbmtfY21kLmxlbiA9IGNtZC0+bGVuOworCisKK09wZXJhdGlvbiBzdGVwcyBpbiB3MSBjb3JlIHdoZW4gbmV3IGNvbW1hbmQgaXMgcmVjZWl2ZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1doZW4gbmV3IG1lc3NhZ2UgKHcxX25ldGxpbmtfbXNnKSBpcyByZWNlaXZlZCB3MSBjb3JlIGRldGVjdHMgaWYgaXQgaXMgbWFzdGVyIG9mIHNsYXZlIHJlcXVlc3QsCithY2NvcmRpbmcgdG8gdzFfbmV0bGlua19tc2cudHlwZSBmaWVsZC4KK1RoZW4gbWFzdGVyIG9yIHNsYXZlIGRldmljZSBpcyBzZWFyY2hlZCBmb3IuCitXaGVuIGZvdW5kLCBtYXN0ZXIgZGV2aWNlIChyZXF1ZXN0ZWQgb3IgdGhvc2Ugb25lIG9uIHdoZXJlIHNsYXZlIGRldmljZSBpcyBmb3VuZCkgaXMgbG9ja2VkLgorSWYgc2xhdmUgY29tbWFuZCBpcyByZXF1ZXN0ZWQsIHRoZW4gcmVzZXQvc2VsZWN0IHByb2NlZHVyZSBpcyBzdGFydGVkIHRvIHNlbGVjdCBnaXZlbiBkZXZpY2UuCisKK1RoZW4gYWxsIHJlcXVlc3RlZCBpbiB3MV9uZXRsaW5rX21zZyBvcGVyYXRpb25zIGFyZSBwZXJmb3JtZWQgb25lIGJ5IG9uZS4KK0lmIGNvbW1hbmQgcmVxdWlyZXMgcmVwbHkgKGxpa2UgcmVhZCBjb21tYW5kKSBpdCBpcyBzZW50IG9uIGNvbW1hbmQgY29tcGxldGlvbi4KKworV2hlbiBhbGwgY29tbWFuZHMgKHcxX25ldGxpbmtfY21kKSBhcmUgcHJvY2Vzc2VkIG11c3RlciBkZXZpY2UgaXMgdW5sb2NrZWQKK2FuZCBuZXh0IHcxX25ldGxpbmtfbXNnIGhlYWRlciBwcm9jZXNzaW5nIHN0YXJ0ZWQuCisKKworQ29ubmVjdG9yIFsxXSBzcGVjaWZpYyBkb2N1bWVudGF0aW9uLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0VhY2ggY29ubmVjdG9yIG1lc3NhZ2UgaW5jbHVkZXMgdHdvIHUzMiBmaWVsZHMgYXMgImFkZHJlc3MiLgordzEgdXNlcyBDTl9XMV9JRFggYW5kIENOX1cxX1ZBTCBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvY29ubmVjdG9yLmggaGVhZGVyLgorRWFjaCBtZXNzYWdlIGFsc28gaW5jbHVkZXMgc2VxdWVuY2UgYW5kIGFja25vd2xlZGdlIG51bWJlcnMuCitTZXF1ZW5jZSBudW1iZXIgZm9yIGV2ZW50IG1lc3NhZ2VzIGlzIGFwcHJvcHJpYXRlIGJ1cyBtYXN0ZXIgc2VxdWVuY2UgbnVtYmVyIGluY3JlYXNlZCB3aXRoCitlYWNoIGV2ZW50IG1lc3NhZ2Ugc2VudCAidGhyb3VnaCIgdGhpcyBtYXN0ZXIuCitTZXF1ZW5jZSBudW1iZXIgZm9yIHVzZXJzcGFjZSByZXF1ZXN0cyBpcyBzZXQgYnkgdXNlcnNwYWNlIGFwcGxpY2F0aW9uLgorU2VxdWVuY2UgbnVtYmVyIGZvciByZXBseSBpcyB0aGUgc2FtZSBhcyB3YXMgaW4gcmVxdWVzdCwgYW5kCithY2tub3dsZWRnZSBudW1iZXIgaXMgc2V0IHRvIHNlcSsxLgorCisKK0FkZGl0aW9uYWwgZG9jdW1hbnRpb24sIHNvdXJjZSBjb2RlIGV4YW1wbGVzLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworMS4gRG9jdW1lbnRhdGlvbi9jb25uZWN0b3IKKzIuIGh0dHA6Ly90c2VydmljZS5uZXQucnUvfnMwbWJyZS9hcmNoaXZlL3cxCitUaGlzIGFyY2hpdmUgaW5jbHVkZXMgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHcxZC5jIHdoaWNoCit1c2VzIHJlYWQvd3JpdGUvc2VhcmNoIGNvbW1hbmRzIGZvciBhbGwgbWFzdGVyL3NsYXZlIGRldmljZXMgZm91bmQgb24gdGhlIGJ1cy4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggZDEwZTYyOS4uNGRjZDJmMSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTE4MSw2ICsxODEsMTIgQEAKIEw6CWxpbnV4LWFpb0BrdmFjay5vcmcKIFM6CVN1cHBvcnRlZAogCitBQklUIFVHVVJVIEhBUkRXQVJFIE1PTklUT1IgRFJJVkVSCitQOglIYW5zIGRlIEdvZWRlCitNOglqLncuci5kZWdvZWRlQGhocy5ubAorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworUzoJTWFpbnRhaW5lZAorCiBBQ0VOSUMgRFJJVkVSCiBQOglKZXMgU29yZW5zZW4KIE06CWplc0B0cmFpbmVkLW1vbmtleS5vcmcKQEAgLTU2OCw2ICs1NzQsMTIgQEAKIFc6CWh0dHA6Ly93d3cucGVuZ3VpbnBwYy5vcmcvcHBjNjQvCiBTOglTdXBwb3J0ZWQKIAorQlJPQURDT00gQjQ0IDEwLzEwMCBFVEhFUk5FVCBEUklWRVIKK1A6CUdhcnkgWmFtYnJhbm8KK006CXphbWJyYW5vQGJyb2FkY29tLmNvbQorTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIEJST0FEQ09NIEJOWDIgR0lHQUJJVCBFVEhFUk5FVCBEUklWRVIKIFA6CU1pY2hhZWwgQ2hhbgogTToJbWNoYW5AYnJvYWRjb20uY29tCkBAIC0yMDU3LDYgKzIwNjksMTIgQEAKIEw6ICAgICAgbGludXgtZmJkZXYtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0CiBTOiAgICAgIE1haW50YWluZWQKIAorT1BFTkNPUkVTIEkyQyBCVVMgRFJJVkVSCitQOglQZXRlciBLb3JzZ2FhcmQKK006CWphY21ldEBzdW5zaXRlLmRrCitMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCitTOglNYWludGFpbmVkCisKIE9SQUNMRSBDTFVTVEVSIEZJTEVTWVNURU0gMiAoT0NGUzIpCiBQOglNYXJrIEZhc2hlaAogTToJbWFyay5mYXNoZWhAb3JhY2xlLmNvbQpAQCAtMjUyOCwxMiArMjU0Niw2IEBACiBXOglodHRwOi8vd3d3LndpbmlzY2hob2Zlci5hdC9saW51eHNpc3VzYnZnYS5zaHRtbAogUzoJTWFpbnRhaW5lZAogCi1TTVNDNDdNMSBIQVJEV0FSRSBNT05JVE9SIERSSVZFUgotUDoJSmVhbiBEZWx2YXJlCi1NOglraGFsaUBsaW51eC1mci5vcmcKLUw6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKLVM6CU9kZCBGaXhlcwotCiBTTUIgRklMRVNZU1RFTQogUDoJVXJiYW4gV2lkbWFyawogTToJdXJiYW5AdGVzdHN0YXRpb24uY29tCkBAIC0zMTQ2LDEyICszMTU4LDYgQEAKIFc6CWh0dHA6Ly9wcm9qZWN0cy5kcnpldXMuY3gvd2JzZAogUzoJTWFpbnRhaW5lZAogCi1XODNMNzg1VFMgSEFSRFdBUkUgTU9OSVRPUiBEUklWRVIKLVA6CUplYW4gRGVsdmFyZQotTToJa2hhbGlAbGludXgtZnIub3JnCi1MOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCi1TOglPZGQgRml4ZXMKLQogV0FUQ0hET0cgREVWSUNFIERSSVZFUlMKIFA6CVdpbSBWYW4gU2Vicm9lY2sKIE06CXdpbUBpZ3VhbmEuYmUKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9hbHBoYV9rc3ltcy5jCmluZGV4IDJiMjQ1YWQuLmQzODQ4YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL2FscGhhX2tzeW1zLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvYWxwaGFfa3N5bXMuYwpAQCAtNTMsMTAgKzUzLDYgQEAKIGV4dGVybiB2b2lkIF9fcmVtcXUgKHZvaWQpOwogCiBFWFBPUlRfU1lNQk9MKGFscGhhX212KTsKLUVYUE9SVF9TWU1CT0woZW5hYmxlX2lycSk7Ci1FWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9pcnFfbm9zeW5jKTsKLUVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX21hc2spOwogRVhQT1JUX1NZTUJPTChzY3JlZW5faW5mbyk7CiBFWFBPUlRfU1lNQk9MKHBlcmZfaXJxKTsKIEVYUE9SVF9TWU1CT0woY2FsbGJhY2tfZ2V0ZW52KTsKQEAgLTY4LDE5ICs2NCwxMyBAQAogCiAvKiBwbGF0Zm9ybSBkZXBlbmRlbnQgc3VwcG9ydCAqLwogRVhQT1JUX1NZTUJPTChzdHJjYXQpOwotRVhQT1JUX1NZTUJPTChzdHJjbXApOwogRVhQT1JUX1NZTUJPTChzdHJjcHkpOwogRVhQT1JUX1NZTUJPTChzdHJsZW4pOwotRVhQT1JUX1NZTUJPTChzdHJuY21wKTsKIEVYUE9SVF9TWU1CT0woc3RybmNweSk7Ci1FWFBPUlRfU1lNQk9MKHN0cm5sZW4pOwogRVhQT1JUX1NZTUJPTChzdHJuY2F0KTsKLUVYUE9SVF9TWU1CT0woc3Ryc3RyKTsKIEVYUE9SVF9TWU1CT0woc3RyY2hyKTsKIEVYUE9SVF9TWU1CT0woc3RycmNocik7Ci1FWFBPUlRfU1lNQk9MKG1lbWNtcCk7CiBFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOwotRVhQT1JUX1NZTUJPTChtZW1zY2FuKTsKIEVYUE9SVF9TWU1CT0woX19tZW1jcHkpOwogRVhQT1JUX1NZTUJPTChfX21lbXNldCk7CiBFWFBPUlRfU1lNQk9MKF9fbWVtc2V0dyk7CkBAIC0xMjIsMTEgKzExMiw5IEBACiAKIC8qIEluLWtlcm5lbCBzeXN0ZW0gY2FsbHMuICAqLwogRVhQT1JUX1NZTUJPTChrZXJuZWxfdGhyZWFkKTsKLUVYUE9SVF9TWU1CT0woc3lzX29wZW4pOwogRVhQT1JUX1NZTUJPTChzeXNfZHVwKTsKIEVYUE9SVF9TWU1CT0woc3lzX2V4aXQpOwogRVhQT1JUX1NZTUJPTChzeXNfd3JpdGUpOwotRVhQT1JUX1NZTUJPTChzeXNfcmVhZCk7CiBFWFBPUlRfU1lNQk9MKHN5c19sc2Vlayk7CiBFWFBPUlRfU1lNQk9MKGV4ZWN2ZSk7CiBFWFBPUlRfU1lNQk9MKHN5c19zZXRzaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvb3NmX3N5cy5jCmluZGV4IDMxYWZlM2QuLmUxNWRjZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL29zZl9zeXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9vc2Zfc3lzLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCSAgICAgIHVuc2lnbmVkIGxvbmcgYnVmc2l6KQogewogCXN0cnVjdCBrc3RhdGZzIGxpbnV4X3N0YXQ7Ci0JaW50IGVycm9yID0gdmZzX3N0YXRmcyhkZW50cnktPmRfaW5vZGUtPmlfc2IsICZsaW51eF9zdGF0KTsKKwlpbnQgZXJyb3IgPSB2ZnNfc3RhdGZzKGRlbnRyeSwgJmxpbnV4X3N0YXQpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gbGludXhfdG9fb3NmX3N0YXRmcygmbGludXhfc3RhdCwgYnVmZmVyLCBidWZzaXopOwogCXJldHVybiBlcnJvcjsJCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYWxwaGEva2VybmVsL3NpZ25hbC5jCmluZGV4IDJlNDVlODYuLjc0MWRhMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3NpZ25hbC5jCkBAIC0zNzUsNyArMzc1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3VzZXIgKgogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHVuc2lnbmVkIGxvbmcgc3AsIHNpemVfdCBmcmFtZV9zaXplKQogewotCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgIT0gMCAmJiAhIG9uX3NpZ19zdGFjayhzcCkpCisJaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAhPSAwICYmICEgc2FzX3NzX2ZsYWdzKHNwKSkKIAkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKIAogCXJldHVybiAodm9pZCBfX3VzZXIgKikoKHNwIC0gZnJhbWVfc2l6ZSkgJiAtMzJ1bCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUgYi9hcmNoL2FybS9jb21tb24vTWFrZWZpbGUKaW5kZXggODQ3ZTNlNi4uZTEyODlhMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNCBAQAogb2JqLSQoQ09ORklHX1NIQVJQU0xfUE0pCSs9IHNoYXJwc2xfcG0ubwogb2JqLSQoQ09ORklHX1NIQVJQX1NDT09QKQkrPSBzY29vcC5vCiBvYmotJChDT05GSUdfQVJDSF9JWFAyMDAwKQkrPSB1ZW5naW5lLm8KK29iai0kKENPTkZJR19BUkNIX0lYUDIzWFgpCSs9IHVlbmdpbmUubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jIGIvYXJjaC9hcm0vY29tbW9uL2RtYWJvdW5jZS5jCmluZGV4IDc5NzFkMGQuLjViN2MyNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbW1vbi9kbWFib3VuY2UuYworKysgYi9hcmNoL2FybS9jb21tb24vZG1hYm91bmNlLmMKQEAgLTc3LDYgKzc3LDggQEAKICNlbmRpZgogCXN0cnVjdCBkbWFib3VuY2VfcG9vbAlzbWFsbDsKIAlzdHJ1Y3QgZG1hYm91bmNlX3Bvb2wJbGFyZ2U7CisKKwlyd2xvY2tfdCBsb2NrOwogfTsKIAogc3RhdGljIExJU1RfSEVBRChkbWFib3VuY2VfZGV2cyk7CkBAIC0xMTYsNiArMTE4LDcgQEAKIAlzdHJ1Y3Qgc2FmZV9idWZmZXIgKmJ1ZjsKIAlzdHJ1Y3QgZG1hYm91bmNlX3Bvb2wgKnBvb2w7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZGV2aWNlX2luZm8tPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsIHNpemU9JWQsIGRpcj0lZClcbiIsCiAJCV9fZnVuY19fLCBwdHIsIHNpemUsIGRpcik7CkBAIC0xNjMsOCArMTY2LDEyIEBACiAJCXByaW50X2FsbG9jX3N0YXRzKGRldmljZV9pbmZvKTsKICNlbmRpZgogCisJd3JpdGVfbG9ja19pcnFzYXZlKCZkZXZpY2VfaW5mby0+bG9jaywgZmxhZ3MpOworCiAJbGlzdF9hZGQoJmJ1Zi0+bm9kZSwgJmRldmljZV9pbmZvLT5zYWZlX2J1ZmZlcnMpOwogCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisKIAlyZXR1cm4gYnVmOwogfQogCkBAIC0xNzIsMjIgKzE3OSwzMiBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2FmZV9idWZmZXIgKgogZmluZF9zYWZlX2J1ZmZlcihzdHJ1Y3QgZG1hYm91bmNlX2RldmljZV9pbmZvICpkZXZpY2VfaW5mbywgZG1hX2FkZHJfdCBzYWZlX2RtYV9hZGRyKQogewotCXN0cnVjdCBzYWZlX2J1ZmZlciAqYjsKKwlzdHJ1Y3Qgc2FmZV9idWZmZXIgKmIgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWFkX2xvY2tfaXJxc2F2ZSgmZGV2aWNlX2luZm8tPmxvY2ssIGZsYWdzKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYiwgJmRldmljZV9pbmZvLT5zYWZlX2J1ZmZlcnMsIG5vZGUpCiAJCWlmIChiLT5zYWZlX2RtYV9hZGRyID09IHNhZmVfZG1hX2FkZHIpCi0JCQlyZXR1cm4gYjsKKwkJCWJyZWFrOwogCi0JcmV0dXJuIE5VTEw7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlX2luZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCiBmcmVlX3NhZmVfYnVmZmVyKHN0cnVjdCBkbWFib3VuY2VfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvLCBzdHJ1Y3Qgc2FmZV9idWZmZXIgKmJ1ZikKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJZGV2X2RiZyhkZXZpY2VfaW5mby0+ZGV2LCAiJXMoYnVmPSVwKVxuIiwgX19mdW5jX18sIGJ1Zik7CiAKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmRldmljZV9pbmZvLT5sb2NrLCBmbGFncyk7CisKIAlsaXN0X2RlbCgmYnVmLT5ub2RlKTsKIAorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZkZXZpY2VfaW5mby0+bG9jaywgZmxhZ3MpOworCiAJaWYgKGJ1Zi0+cG9vbCkKIAkJZG1hX3Bvb2xfZnJlZShidWYtPnBvb2wtPnBvb2wsIGJ1Zi0+c2FmZSwgYnVmLT5zYWZlX2RtYV9hZGRyKTsKIAllbHNlCkBAIC0zOTYsNyArNDEzLDYgQEAKIGRtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAogCWRldl9kYmcoZGV2LCAiJXMocHRyPSVwLHNpemU9JWQsZGlyPSV4KVxuIiwKQEAgLTQwNCwxMiArNDIwLDggQEAKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCiAJZG1hX2FkZHIgPSBtYXBfc2luZ2xlKGRldiwgcHRyLCBzaXplLCBkaXIpOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCiAJcmV0dXJuIGRtYV9hZGRyOwogfQogCkBAIC00MjQsMjUgKzQzNiwxOCBAQAogZG1hX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAogCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlkZXZfZGJnKGRldiwgIiVzKHB0cj0lcCxzaXplPSVkLGRpcj0leClcbiIsCiAJCV9fZnVuY19fLCAodm9pZCAqKSBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCiAJdW5tYXBfc2luZ2xlKGRldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIGludAogZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKIAkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCkBAIC00NTAsOCArNDU1LDYgQEAKIAogCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwogCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCiAJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBpKyssIHNnKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBzZy0+cGFnZTsKIAkJdW5zaWduZWQgaW50IG9mZnNldCA9IHNnLT5vZmZzZXQ7CkBAIC00NjIsOCArNDY1LDYgQEAKIAkJCW1hcF9zaW5nbGUoZGV2LCBwdHIsIGxlbmd0aCwgZGlyKTsKIAl9CiAKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KIAlyZXR1cm4gbmVudHM7CiB9CiAKQEAgLTQ3MSw3ICs0NzIsNiBAQAogZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKIAogCWRldl9kYmcoZGV2LCAiJXMoc2c9JXAsbmVudHM9JWQsZGlyPSV4KVxuIiwKQEAgLTQ3OSw1NSArNDc5LDM4IEBACiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQogCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrLCBzZysrKSB7CiAJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzZy0+ZG1hX2FkZHJlc3M7CiAJCXVuc2lnbmVkIGludCBsZW5ndGggPSBzZy0+bGVuZ3RoOwogCiAJCXVubWFwX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBsZW5ndGgsIGRpcik7CiAJfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiB2b2lkCiBkbWFfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAogCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsc2l6ZT0lZCxkaXI9JXgpXG4iLAogCQlfX2Z1bmNfXywgKHZvaWQgKikgZG1hX2FkZHIsIHNpemUsIGRpcik7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiB2b2lkCiBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHNpemVfdCBzaXplLAogCQkJCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCiAJZGV2X2RiZyhkZXYsICIlcyhwdHI9JXAsc2l6ZT0lZCxkaXI9JXgpXG4iLAogCQlfX2Z1bmNfXywgKHZvaWQgKikgZG1hX2FkZHIsIHNpemUsIGRpcik7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiB2b2lkCiBkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCkBAIC01MzUsMjMgKzUxOCwxOCBAQAogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewogCQlkbWFfYWRkcl90IGRtYV9hZGRyID0gc2ctPmRtYV9hZGRyZXNzOwogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2ctPmxlbmd0aDsKIAogCQlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBsZW5ndGgsIGRpcik7CiAJfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiB2b2lkCiBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAogCQkJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAKIAlkZXZfZGJnKGRldiwgIiVzKHNnPSVwLG5lbnRzPSVkLGRpcj0leClcbiIsCkBAIC01NTksMTYgKzUzNywxMiBAQAogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbmVudHM7IGkrKywgc2crKykgewogCQlkbWFfYWRkcl90IGRtYV9hZGRyID0gc2ctPmRtYV9hZGRyZXNzOwogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gc2ctPmxlbmd0aDsKIAogCQlzeW5jX3NpbmdsZShkZXYsIGRtYV9hZGRyLCBsZW5ndGgsIGRpcik7CiAJfQotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CkBAIC02MjIsNiArNTk2LDcgQEAKIAogCWRldmljZV9pbmZvLT5kZXYgPSBkZXY7CiAJSU5JVF9MSVNUX0hFQUQoJmRldmljZV9pbmZvLT5zYWZlX2J1ZmZlcnMpOworCXJ3bG9ja19pbml0KCZkZXZpY2VfaW5mby0+bG9jayk7CiAKICNpZmRlZiBTVEFUUwogCWRldmljZV9pbmZvLT50b3RhbF9hbGxvY3MgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3VlbmdpbmUuYyBiL2FyY2gvYXJtL2NvbW1vbi91ZW5naW5lLmMKaW5kZXggYTEzMTBiNy4uZGZjYTU5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL3VlbmdpbmUuYworKysgYi9hcmNoL2FybS9jb21tb24vdWVuZ2luZS5jCkBAIC0xOCwxMCArMTgsMjYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9peHAyMDAwLXJlZ3MuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS91ZW5naW5lLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKKyNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0lYUDIwMDApCisjZGVmaW5lIElYUF9VRU5HSU5FX0NTUl9WSVJUX0JBU0UJSVhQMjAwMF9VRU5HSU5FX0NTUl9WSVJUX0JBU0UKKyNkZWZpbmUgSVhQX1BST0RVQ1RfSUQJCQlJWFAyMDAwX1BST0RVQ1RfSUQKKyNkZWZpbmUgSVhQX01JU0NfQ09OVFJPTAkJSVhQMjAwMF9NSVNDX0NPTlRST0wKKyNkZWZpbmUgSVhQX1JFU0VUMQkJCUlYUDIwMDBfUkVTRVQxCisjZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSVhQMjNYWCkKKyNkZWZpbmUgSVhQX1VFTkdJTkVfQ1NSX1ZJUlRfQkFTRQlJWFAyM1hYX1VFTkdJTkVfQ1NSX1ZJUlRfQkFTRQorI2RlZmluZSBJWFBfUFJPRFVDVF9JRAkJCUlYUDIzWFhfUFJPRFVDVF9JRAorI2RlZmluZSBJWFBfTUlTQ19DT05UUk9MCQlJWFAyM1hYX01JU0NfQ09OVFJPTAorI2RlZmluZSBJWFBfUkVTRVQxCQkJSVhQMjNYWF9SRVNFVDEKKyNlbHNlCisjZXJyb3IgdW5rbm93biBwbGF0Zm9ybQorI2VuZGlmCisjZW5kaWYKKwogI2RlZmluZSBVU1RPUkVfQUREUkVTUwkJCTB4MDAwCiAjZGVmaW5lIFVTVE9SRV9EQVRBX0xPV0VSCQkweDAwNAogI2RlZmluZSBVU1RPUkVfREFUQV9VUFBFUgkJMHgwMDgKQEAgLTQzLDcgKzU5LDcgQEAKIAogc3RhdGljIHZvaWQgKml4cDIwMDBfdWVuZ2luZV9jc3JfYXJlYShpbnQgdWVuZ2luZSkKIHsKLQlyZXR1cm4gKCh2b2lkICopSVhQMjAwMF9VRU5HSU5FX0NTUl9WSVJUX0JBU0UpICsgKHVlbmdpbmUgPDwgMTApOworCXJldHVybiAoKHZvaWQgKilJWFBfVUVOR0lORV9DU1JfVklSVF9CQVNFKSArICh1ZW5naW5lIDw8IDEwKTsKIH0KIAogLyoKQEAgLTkxLDggKzEwNywxMyBAQAogCiB2b2lkIGl4cDIwMDBfdWVuZ2luZV9yZXNldCh1MzIgdWVuZ2luZV9tYXNrKQogewotCWl4cDIwMDBfcmVnX3dyYihJWFAyMDAwX1JFU0VUMSwgdWVuZ2luZV9tYXNrICYgaXhwMjAwMF91ZW5naW5lX21hc2spOwotCWl4cDIwMDBfcmVnX3dyYihJWFAyMDAwX1JFU0VUMSwgMCk7CisJdTMyIHZhbHVlOworCisJdmFsdWUgPSBpeHAyMDAwX3JlZ19yZWFkKElYUF9SRVNFVDEpICYgfml4cDIwMDBfdWVuZ2luZV9tYXNrOworCisJdWVuZ2luZV9tYXNrICY9IGl4cDIwMDBfdWVuZ2luZV9tYXNrOworCWl4cDIwMDBfcmVnX3dyYihJWFBfUkVTRVQxLCB2YWx1ZSB8IHVlbmdpbmVfbWFzayk7CisJaXhwMjAwMF9yZWdfd3JiKElYUF9SRVNFVDEsIHZhbHVlKTsKIH0KIEVYUE9SVF9TWU1CT0woaXhwMjAwMF91ZW5naW5lX3Jlc2V0KTsKIApAQCAtMjM1LDExICsyNTYsMTIgQEAKIAl1MzIgcHJvZHVjdF9pZDsKIAl1MzIgcmV2OwogCi0JcHJvZHVjdF9pZCA9IGl4cDIwMDBfcmVnX3JlYWQoSVhQMjAwMF9QUk9EVUNUX0lEKTsKKwlwcm9kdWN0X2lkID0gaXhwMjAwMF9yZWdfcmVhZChJWFBfUFJPRFVDVF9JRCk7CiAJaWYgKCgocHJvZHVjdF9pZCA+PiAxNikgJiAweDFmKSAhPSAwKQogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAoKHByb2R1Y3RfaWQgPj4gOCkgJiAweGZmKSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfSVhQMjAwMAogCWNhc2UgMDoJCS8qIElYUDI4MDAgKi8KIAkJaWYgKCEoYy0+Y3B1X21vZGVsX2JpdG1hc2sgJiA0KSkKIAkJCXJldHVybiAwOwpAQCAtMjU0LDYgKzI3NiwxNCBAQAogCQlpZiAoIShjLT5jcHVfbW9kZWxfYml0bWFzayAmIDIpKQogCQkJcmV0dXJuIDA7CiAJCWJyZWFrOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVJDSF9JWFAyM1hYCisJY2FzZSA0OgkJLyogSVhQMjN4eCAqLworCQlpZiAoIShjLT5jcHVfbW9kZWxfYml0bWFzayAmIDB4M2YwKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKyNlbmRpZgogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CkBAIC00MzIsNyArNDYyLDggQEAKIAkvKgogCSAqIERldGVybWluZSBudW1iZXIgb2YgbWljcm9lbmdpbmVzIHByZXNlbnQuCiAJICovCi0Jc3dpdGNoICgoaXhwMjAwMF9yZWdfcmVhZChJWFAyMDAwX1BST0RVQ1RfSUQpID4+IDgpICYgMHgxZmZmKSB7CisJc3dpdGNoICgoaXhwMjAwMF9yZWdfcmVhZChJWFBfUFJPRFVDVF9JRCkgPj4gOCkgJiAweDFmZmYpIHsKKyNpZmRlZiBDT05GSUdfQVJDSF9JWFAyMDAwCiAJY2FzZSAwOgkJLyogSVhQMjgwMCAqLwogCWNhc2UgMToJCS8qIElYUDI4NTAgKi8KIAkJaXhwMjAwMF91ZW5naW5lX21hc2sgPSAweDAwZmYwMGZmOwpAQCAtNDQxLDEwICs0NzIsMTcgQEAKIAljYXNlIDI6CQkvKiBJWFAyNDAwICovCiAJCWl4cDIwMDBfdWVuZ2luZV9tYXNrID0gMHgwMDBmMDAwZjsKIAkJYnJlYWs7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BUkNIX0lYUDIzWFgKKwljYXNlIDQ6CQkvKiBJWFAyM3h4ICovCisJCWl4cDIwMDBfdWVuZ2luZV9tYXNrID0gKCpJWFAyM1hYX0VYUF9DRkdfRlVTRSA+PiA4KSAmIDB4ZjsKKwkJYnJlYWs7CisjZW5kaWYKIAogCWRlZmF1bHQ6CiAJCXByaW50ayhLRVJOX0lORk8gIkRldGVjdGVkIHVua25vd24gSVhQMjAwMCBtb2RlbCAoJS44eClcbiIsCi0JCQkodW5zaWduZWQgaW50KWl4cDIwMDBfcmVnX3JlYWQoSVhQMjAwMF9QUk9EVUNUX0lEKSk7CisJCQkodW5zaWduZWQgaW50KWl4cDIwMDBfcmVnX3JlYWQoSVhQX1BST0RVQ1RfSUQpKTsKIAkJaXhwMjAwMF91ZW5naW5lX21hc2sgPSAweDAwMDAwMDAwOwogCQlicmVhazsKIAl9CkBAIC00NTcsMTUgKzQ5NSwxNSBAQAogCS8qCiAJICogU3luY2hyb25pc2UgdGltZXN0YW1wIGNvdW50ZXJzIGFjcm9zcyBhbGwgbWljcm9lbmdpbmVzLgogCSAqLwotCXZhbHVlID0gaXhwMjAwMF9yZWdfcmVhZChJWFAyMDAwX01JU0NfQ09OVFJPTCk7Ci0JaXhwMjAwMF9yZWdfd3JiKElYUDIwMDBfTUlTQ19DT05UUk9MLCB2YWx1ZSAmIH4weDgwKTsKKwl2YWx1ZSA9IGl4cDIwMDBfcmVnX3JlYWQoSVhQX01JU0NfQ09OVFJPTCk7CisJaXhwMjAwMF9yZWdfd3JiKElYUF9NSVNDX0NPTlRST0wsIHZhbHVlICYgfjB4ODApOwogCWZvciAodWVuZ2luZSA9IDA7IHVlbmdpbmUgPCAzMjsgdWVuZ2luZSsrKSB7CiAJCWlmIChpeHAyMDAwX3VlbmdpbmVfbWFzayAmICgxIDw8IHVlbmdpbmUpKSB7CiAJCQlpeHAyMDAwX3VlbmdpbmVfY3NyX3dyaXRlKHVlbmdpbmUsIFRJTUVTVEFNUF9MT1csIDApOwogCQkJaXhwMjAwMF91ZW5naW5lX2Nzcl93cml0ZSh1ZW5naW5lLCBUSU1FU1RBTVBfSElHSCwgMCk7CiAJCX0KIAl9Ci0JaXhwMjAwMF9yZWdfd3JiKElYUDIwMDBfTUlTQ19DT05UUk9MLCB2YWx1ZSB8IDB4ODApOworCWl4cDIwMDBfcmVnX3dyYihJWFBfTUlTQ19DT05UUk9MLCB2YWx1ZSB8IDB4ODApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb25maWdzL2xwZDI3MF9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL2xwZDI3MF9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4YmJlNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NvbmZpZ3MvbHBkMjcwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk2MyBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE3LWdpdDIKKyMgV2VkIEp1biAyMSAyMjoyMDoxOCAyMDA2CisjCitDT05GSUdfQVJNPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX1JXU0VNX0dFTkVSSUNfU1BJTkxPQ0s9eQorQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CitDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0FSQ0hfTVREX1hJUD15CitDT05GSUdfVkVDVE9SU19CQVNFPTB4ZmZmZjAwMDAKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0JST0tFTl9PTl9TTVA9eQorQ09ORklHX0lOSVRfRU5WX0FSR19MSU1JVD0zMgorCisjCisjIEdlbmVyYWwgc2V0dXAKKyMKK0NPTkZJR19MT0NBTFZFUlNJT049IiIKK0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTz15CitDT05GSUdfU1dBUD15CitDT05GSUdfU1lTVklQQz15CisjIENPTkZJR19QT1NJWF9NUVVFVUUgaXMgbm90IHNldAorIyBDT05GSUdfQlNEX1BST0NFU1NfQUNDVCBpcyBub3Qgc2V0CitDT05GSUdfU1lTQ1RMPXkKKyMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lLQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTEFZIGlzIG5vdCBzZXQKK0NPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfVUlEMTY9eQorQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKKyMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUyBpcyBub3Qgc2V0CitDT05GSUdfSE9UUExVRz15CitDT05GSUdfUFJJTlRLPXkKK0NPTkZJR19CVUc9eQorQ09ORklHX0VMRl9DT1JFPXkKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorQ09ORklHX1NMQUI9eQorIyBDT05GSUdfVElOWV9TSE1FTSBpcyBub3Qgc2V0CitDT05GSUdfQkFTRV9TTUFMTD0wCisjIENPTkZJR19TTE9CIGlzIG5vdCBzZXQKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworQ09ORklHX01PRFVMRVM9eQorIyBDT05GSUdfTU9EVUxFX1VOTE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RWRVJTSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfS01PRCBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKKworIworIyBTeXN0ZW0gVHlwZQorIworIyBDT05GSUdfQVJDSF9BQUVDMjAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lOVEVHUkFUT1IgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9SRUFMVklFVyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1ZFUlNBVElMRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0FUOTFSTTkyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9DTFBTNzUwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0NMUFM3MTFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfQ08yODUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9FQlNBMTEwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRVA5M1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfRk9PVEJSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX05FVFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9INzIwWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lNWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lPUDNYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0lYUDIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9JWFAyM1hYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfTDcyMDAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QTlg0MDA4IGlzIG5vdCBzZXQKK0NPTkZJR19BUkNIX1BYQT15CisjIENPTkZJR19BUkNIX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1NBMTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX1MzQzI0MTAgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9TSEFSSyBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0xIN0E0MFggaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9PTUFQIGlzIG5vdCBzZXQKKworIworIyBJbnRlbCBQWEEyeHggSW1wbGVtZW50YXRpb25zCisjCisjIENPTkZJR19BUkNIX0xVQkJPQ0sgaXMgbm90IHNldAorQ09ORklHX01BQ0hfTE9HSUNQRF9QWEEyNzA9eQorIyBDT05GSUdfTUFDSF9NQUlOU1RPTkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJDSF9QWEFfSURQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BYQV9TSEFSUFNMIGlzIG5vdCBzZXQKK0NPTkZJR19QWEEyN3g9eQorQ09ORklHX0lXTU1YVD15CisKKyMKKyMgUHJvY2Vzc29yIFR5cGUKKyMKK0NPTkZJR19DUFVfMzI9eQorQ09ORklHX0NQVV9YU0NBTEU9eQorQ09ORklHX0NQVV8zMnY1PXkKK0NPTkZJR19DUFVfQUJSVF9FVjVUPXkKK0NPTkZJR19DUFVfQ0FDSEVfVklWVD15CitDT05GSUdfQ1BVX1RMQl9WNFdCST15CisKKyMKKyMgUHJvY2Vzc29yIEZlYXR1cmVzCisjCisjIENPTkZJR19BUk1fVEhVTUIgaXMgbm90IHNldAorQ09ORklHX1hTQ0FMRV9QTVU9eQorCisjCisjIEJ1cyBzdXBwb3J0CisjCisKKyMKKyMgUENDQVJEIChQQ01DSUEvQ2FyZEJ1cykgc3VwcG9ydAorIworIyBDT05GSUdfUENDQVJEIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgRmVhdHVyZXMKKyMKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CitDT05GSUdfSFo9MTAwCisjIENPTkZJR19BRUFCSSBpcyBub3Qgc2V0CisjIENPTkZJR19BUkNIX0RJU0NPTlRJR01FTV9FTkFCTEUgaXMgbm90IHNldAorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NDA5NgorQ09ORklHX0FMSUdOTUVOVF9UUkFQPXkKKworIworIyBCb290IG9wdGlvbnMKKyMKK0NPTkZJR19aQk9PVF9ST01fVEVYVD0weDAKK0NPTkZJR19aQk9PVF9ST01fQlNTPTB4MAorQ09ORklHX0NNRExJTkU9InJvb3Q9L2Rldi9uZnMgaXA9Ym9vdHAgY29uc29sZT10dHlTMCwxMTUyMDAgbWVtPTY0TSIKKyMgQ09ORklHX1hJUF9LRVJORUwgaXMgbm90IHNldAorCisjCisjIEZsb2F0aW5nIHBvaW50IGVtdWxhdGlvbgorIworCisjCisjIEF0IGxlYXN0IG9uZSBlbXVsYXRpb24gbXVzdCBiZSBzZWxlY3RlZAorIworQ09ORklHX0ZQRV9OV0ZQRT15CisjIENPTkZJR19GUEVfTldGUEVfWFAgaXMgbm90IHNldAorIyBDT05GSUdfRlBFX0ZBU1RGUEUgaXMgbm90IHNldAorCisjCisjIFVzZXJzcGFjZSBiaW5hcnkgZm9ybWF0cworIworQ09ORklHX0JJTkZNVF9FTEY9eQorIyBDT05GSUdfQklORk1UX0FPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorIyBDT05GSUdfQVJUSFVSIGlzIG5vdCBzZXQKKworIworIyBQb3dlciBtYW5hZ2VtZW50IG9wdGlvbnMKKyMKKyMgQ09ORklHX1BNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BNX0xFR0FDWSBpcyBub3Qgc2V0CisjIENPTkZJR19QTV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19BUE0gaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfUEFDS0VUIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNPXkKKyMgQ09ORklHX1hGUk1fVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKKyMgQ09ORklHX0lQX01VTFRJQ0FTVCBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9BRFZBTkNFRF9ST1VURVIgaXMgbm90IHNldAorQ09ORklHX0lQX0ZJQl9IQVNIPXkKK0NPTkZJR19JUF9QTlA9eQorIyBDT05GSUdfSVBfUE5QX0RIQ1AgaXMgbm90IHNldAorQ09ORklHX0lQX1BOUF9CT09UUD15CisjIENPTkZJR19JUF9QTlBfUkFSUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBJUCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfSVBHUkUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CisjIENPTkZJR19TWU5fQ09PS0lFUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0FIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfRVNQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9UVU5ORUwgaXMgbm90IHNldAorQ09ORklHX0lORVRfWEZSTV9NT0RFX1RSQU5TUE9SVD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfVFVOTkVMPXkKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRXT1JLX1NFQ01BUksgaXMgbm90IHNldAorIyBDT05GSUdfTkVURklMVEVSIGlzIG5vdCBzZXQKKworIworIyBEQ0NQIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX0lQX0RDQ1AgaXMgbm90IHNldAorCisjCisjIFNDVFAgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfU0NUUCBpcyBub3Qgc2V0CisKKyMKKyMgVElQQyBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19USVBDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTSBpcyBub3Qgc2V0CisjIENPTkZJR19CUklER0UgaXMgbm90IHNldAorIyBDT05GSUdfVkxBTl84MDIxUSBpcyBub3Qgc2V0CisjIENPTkZJR19ERUNORVQgaXMgbm90IHNldAorIyBDT05GSUdfTExDMiBpcyBub3Qgc2V0CisjIENPTkZJR19JUFggaXMgbm90IHNldAorIyBDT05GSUdfQVRBTEsgaXMgbm90IHNldAorIyBDT05GSUdfWDI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0xBUEIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0RJVkVSVCBpcyBub3Qgc2V0CisjIENPTkZJR19FQ09ORVQgaXMgbm90IHNldAorIyBDT05GSUdfV0FOX1JPVVRFUiBpcyBub3Qgc2V0CisKKyMKKyMgUW9TIGFuZC9vciBmYWlyIHF1ZXVlaW5nCisjCisjIENPTkZJR19ORVRfU0NIRUQgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgdGVzdGluZworIworIyBDT05GSUdfTkVUX1BLVEdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19IQU1SQURJTyBpcyBub3Qgc2V0CisjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lFRUU4MDIxMSBpcyBub3Qgc2V0CisKKyMKKyMgRGV2aWNlIERyaXZlcnMKKyMKKworIworIyBHZW5lcmljIERyaXZlciBPcHRpb25zCisjCitDT05GSUdfU1RBTkRBTE9ORT15CitDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRD15CisjIENPTkZJR19GV19MT0FERVIgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKK0NPTkZJR19NVEQ9eQorIyBDT05GSUdfTVREX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DT05DQVQgaXMgbm90IHNldAorQ09ORklHX01URF9QQVJUSVRJT05TPXkKK0NPTkZJR19NVERfUkVEQk9PVF9QQVJUUz15CitDT05GSUdfTVREX1JFREJPT1RfRElSRUNUT1JZX0JMT0NLPS0xCisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19VTkFMTE9DQVRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUkVEQk9PVF9QQVJUU19SRUFET05MWSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ01ETElORV9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQUZTX1BBUlRTIGlzIG5vdCBzZXQKKworIworIyBVc2VyIE1vZHVsZXMgQW5kIFRyYW5zbGF0aW9uIExheWVycworIworQ09ORklHX01URF9DSEFSPXkKK0NPTkZJR19NVERfQkxPQ0s9eQorIyBDT05GSUdfRlRMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GVEwgaXMgbm90IHNldAorIyBDT05GSUdfSU5GVEwgaXMgbm90IHNldAorIyBDT05GSUdfUkZEX0ZUTCBpcyBub3Qgc2V0CisKKyMKKyMgUkFNL1JPTS9GbGFzaCBjaGlwIGRyaXZlcnMKKyMKK0NPTkZJR19NVERfQ0ZJPXkKKyMgQ09ORklHX01URF9KRURFQ1BST0JFIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfR0VOX1BST0JFPXkKK0NPTkZJR19NVERfQ0ZJX0FEVl9PUFRJT05TPXkKK0NPTkZJR19NVERfQ0ZJX05PU1dBUD15CisjIENPTkZJR19NVERfQ0ZJX0JFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0xFX0JZVEVfU1dBUCBpcyBub3Qgc2V0CitDT05GSUdfTVREX0NGSV9HRU9NRVRSWT15CitDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzE9eQorQ09ORklHX01URF9NQVBfQkFOS19XSURUSF8yPXkKK0NPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfND15CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfOCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTUFQX0JBTktfV0lEVEhfMTYgaXMgbm90IHNldAorIyBDT05GSUdfTVREX01BUF9CQU5LX1dJRFRIXzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9DRklfSTEgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSTI9eQorIyBDT05GSUdfTVREX0NGSV9JNCBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfQ0ZJX0k4IGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9PVFAgaXMgbm90IHNldAorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorIyBDT05GSUdfTVREX0NGSV9BTURTVEQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0NGSV9TVEFBIGlzIG5vdCBzZXQKK0NPTkZJR19NVERfQ0ZJX1VUSUw9eQorIyBDT05GSUdfTVREX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BQlNFTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVREX09CU09MRVRFX0NISVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9YSVAgaXMgbm90IHNldAorCisjCisjIE1hcHBpbmcgZHJpdmVycyBmb3IgY2hpcCBhY2Nlc3MKKyMKKyMgQ09ORklHX01URF9DT01QTEVYX01BUFBJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFlTTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9BUk1fSU5URUdSQVRPUiBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfU0hBUlBfU0wgaXMgbm90IHNldAorIyBDT05GSUdfTVREX1BMQVRSQU0gaXMgbm90IHNldAorCisjCisjIFNlbGYtY29udGFpbmVkIE1URCBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTVREX1NMUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9QSFJBTSBpcyBub3Qgc2V0CisjIENPTkZJR19NVERfTVREUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01URF9CTE9DSzJNVEQgaXMgbm90IHNldAorCisjCisjIERpc2stT24tQ2hpcCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX0RPQzIwMDAgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDEgaXMgbm90IHNldAorIyBDT05GSUdfTVREX0RPQzIwMDFQTFVTIGlzIG5vdCBzZXQKKworIworIyBOQU5EIEZsYXNoIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19NVERfTkFORCBpcyBub3Qgc2V0CisKKyMKKyMgT25lTkFORCBGbGFzaCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfTVREX09ORU5BTkQgaXMgbm90IHNldAorCisjCisjIFBhcmFsbGVsIHBvcnQgc3VwcG9ydAorIworIyBDT05GSUdfUEFSUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgUGx1ZyBhbmQgUGxheSBzdXBwb3J0CisjCisKKyMKKyMgQmxvY2sgZGV2aWNlcworIworIyBDT05GSUdfQkxLX0RFVl9DT1dfQ09NTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1JBTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lOSVRSRCBpcyBub3Qgc2V0CisjIENPTkZJR19DRFJPTV9QS1RDRFZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CisKKyMKKyMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAorIworQ09ORklHX0lERT15CitDT05GSUdfQkxLX0RFVl9JREU9eQorCisjCisjIFBsZWFzZSBzZWUgRG9jdW1lbnRhdGlvbi9pZGUudHh0IGZvciBoZWxwL2luZm8gb24gSURFIGRyaXZlcworIworIyBDT05GSUdfQkxLX0RFVl9JREVfU0FUQSBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JREVESVNLPXkKKyMgQ09ORklHX0lERURJU0tfTVVMVElfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFVEFQRSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERUZMT1BQWSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfVEFTS19JT0NUTCBpcyBub3Qgc2V0CisKKyMKKyMgSURFIGNoaXBzZXQgc3VwcG9ydC9idWdmaXhlcworIworIyBDT05GSUdfSURFX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfSURFX0FSTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19JREVETUFfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hEIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGRldmljZSBzdXBwb3J0CisjCisjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorCisjCisjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCisjCisjIENPTkZJR19NRCBpcyBub3Qgc2V0CisKKyMKKyMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKworIworIyBJRUVFIDEzOTQgKEZpcmVXaXJlKSBzdXBwb3J0CisjCisKKyMKKyMgSTJPIGRldmljZSBzdXBwb3J0CisjCisKKyMKKyMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX05FVERFVklDRVM9eQorIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BIWUxJQiBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorQ09ORklHX1NNQzkxWD15CisjIENPTkZJR19ETTkwMDAgaXMgbm90IHNldAorIyBDT05GSUdfU01DOTExWCBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKKyMKKworIworIyBFdGhlcm5ldCAoMTAwMDAgTWJpdCkKKyMKKworIworIyBUb2tlbiBSaW5nIGRldmljZXMKKyMKKworIworIyBXaXJlbGVzcyBMQU4gKG5vbi1oYW1yYWRpbykKKyMKKyMgQ09ORklHX05FVF9SQURJTyBpcyBub3Qgc2V0CisKKyMKKyMgV2FuIGludGVyZmFjZXMKKyMKKyMgQ09ORklHX1dBTiBpcyBub3Qgc2V0CisjIENPTkZJR19QUFAgaXMgbm90IHNldAorIyBDT05GSUdfU0xJUCBpcyBub3Qgc2V0CisjIENPTkZJR19TSEFQRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkVUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRQT0xMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgaXMgbm90IHNldAorCisjCisjIElTRE4gc3Vic3lzdGVtCisjCisjIENPTkZJR19JU0ROIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCitDT05GSUdfSU5QVVRfTU9VU0VERVY9eQorQ09ORklHX0lOUFVUX01PVVNFREVWX1BTQVVYPXkKK0NPTkZJR19JTlBVVF9NT1VTRURFVl9TQ1JFRU5fWD0xMDI0CitDT05GSUdfSU5QVVRfTU9VU0VERVZfU0NSRUVOX1k9NzY4CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorQ09ORklHX0lOUFVUX0VWREVWPXkKKyMgQ09ORklHX0lOUFVUX0VWQlVHIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBEZXZpY2UgRHJpdmVycworIworQ09ORklHX0lOUFVUX0tFWUJPQVJEPXkKK0NPTkZJR19LRVlCT0FSRF9BVEtCRD15CisjIENPTkZJR19LRVlCT0FSRF9TVU5LQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTEtLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfWFRLQkQgaXMgbm90IHNldAorIyBDT05GSUdfS0VZQk9BUkRfTkVXVE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX0pPWVNUSUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX1RPVUNIU0NSRUVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOUFVUX01JU0MgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIEkvTyBwb3J0cworIworQ09ORklHX1NFUklPPXkKKyMgQ09ORklHX1NFUklPX1NFUlBPUlQgaXMgbm90IHNldAorQ09ORklHX1NFUklPX0xJQlBTMj15CisjIENPTkZJR19TRVJJT19SQVcgaXMgbm90IHNldAorIyBDT05GSUdfR0FNRVBPUlQgaXMgbm90IHNldAorCisjCisjIENoYXJhY3RlciBkZXZpY2VzCisjCitDT05GSUdfVlQ9eQorQ09ORklHX1ZUX0NPTlNPTEU9eQorQ09ORklHX0hXX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworIyBDT05GSUdfU0VSSUFMXzgyNTAgaXMgbm90IHNldAorCisjCisjIE5vbi04MjUwIHNlcmlhbCBwb3J0IHN1cHBvcnQKKyMKK0NPTkZJR19TRVJJQUxfUFhBPXkKK0NPTkZJR19TRVJJQUxfUFhBX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKK0NPTkZJR19VTklYOThfUFRZUz15CitDT05GSUdfTEVHQUNZX1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CisKKyMKKyMgSVBNSQorIworIyBDT05GSUdfSVBNSV9IQU5ETEVSIGlzIG5vdCBzZXQKKworIworIyBXYXRjaGRvZyBDYXJkcworIworIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorIyBDT05GSUdfTlZSQU0gaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBUUE0gZGV2aWNlcworIworIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0CisjIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQyBpcyBub3Qgc2V0CisKKyMKKyMgU1BJIHN1cHBvcnQKKyMKKyMgQ09ORklHX1NQSSBpcyBub3Qgc2V0CisjIENPTkZJR19TUElfTUFTVEVSIGlzIG5vdCBzZXQKKworIworIyBEYWxsYXMncyAxLXdpcmUgYnVzCisjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CisjCitDT05GSUdfSFdNT049eQorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTl9ERUJVR19DSElQIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBMRUQgZGV2aWNlcworIworIyBDT05GSUdfTkVXX0xFRFMgaXMgbm90IHNldAorCisjCisjIExFRCBkcml2ZXJzCisjCisKKyMKKyMgTEVEIFRyaWdnZXJzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorQ09ORklHX1ZJREVPX1Y0TDI9eQorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworQ09ORklHX0ZCPXkKK0NPTkZJR19GQl9DRkJfRklMTFJFQ1Q9eQorQ09ORklHX0ZCX0NGQl9DT1BZQVJFQT15CitDT05GSUdfRkJfQ0ZCX0lNQUdFQkxJVD15CisjIENPTkZJR19GQl9NQUNNT0RFUyBpcyBub3Qgc2V0CitDT05GSUdfRkJfRklSTVdBUkVfRURJRD15CisjIENPTkZJR19GQl9NT0RFX0hFTFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVElMRUJMSVRUSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCX1MxRDEzWFhYIGlzIG5vdCBzZXQKK0NPTkZJR19GQl9QWEE9eQorIyBDT05GSUdfRkJfUFhBX1BBUkFNRVRFUlMgaXMgbm90IHNldAorIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCisjIENPTkZJR19WR0FfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CitDT05GSUdfRlJBTUVCVUZGRVJfQ09OU09MRT15CisjIENPTkZJR19GUkFNRUJVRkZFUl9DT05TT0xFX1JPVEFUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZPTlRTIGlzIG5vdCBzZXQKK0NPTkZJR19GT05UXzh4OD15CitDT05GSUdfRk9OVF84eDE2PXkKKworIworIyBMb2dvIGNvbmZpZ3VyYXRpb24KKyMKK0NPTkZJR19MT0dPPXkKK0NPTkZJR19MT0dPX0xJTlVYX01PTk89eQorQ09ORklHX0xPR09fTElOVVhfVkdBMTY9eQorQ09ORklHX0xPR09fTElOVVhfQ0xVVDIyND15CisjIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCitDT05GSUdfU09VTkQ9eQorCisjCisjIEFkdmFuY2VkIExpbnV4IFNvdW5kIEFyY2hpdGVjdHVyZQorIworQ09ORklHX1NORD15CitDT05GSUdfU05EX1RJTUVSPXkKK0NPTkZJR19TTkRfUENNPXkKKyMgQ09ORklHX1NORF9TRVFVRU5DRVIgaXMgbm90IHNldAorIyBDT05GSUdfU05EX01JWEVSX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUENNX09TUyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQSSBpcyBub3Qgc2V0CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKKyMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAorCisjCisjIEdlbmVyaWMgZGV2aWNlcworIworQ09ORklHX1NORF9BQzk3X0NPREVDPXkKK0NPTkZJR19TTkRfQUM5N19CVVM9eQorIyBDT05GSUdfU05EX0RVTU1ZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NVFBBViBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfU0VSSUFMX1UxNjU1MCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTVBVNDAxIGlzIG5vdCBzZXQKKworIworIyBBTFNBIEFSTSBkZXZpY2VzCisjCitDT05GSUdfU05EX1BYQTJYWF9QQ009eQorQ09ORklHX1NORF9QWEEyWFhfQUM5Nz15CisKKyMKKyMgT3BlbiBTb3VuZCBTeXN0ZW0KKyMKKyMgQ09ORklHX1NPVU5EX1BSSU1FIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKKyMgQ09ORklHX1VTQl9BUkNIX0hBU19FSENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQiBpcyBub3Qgc2V0CisKKyMKKyMgTk9URTogVVNCX1NUT1JBR0UgZW5hYmxlcyBTQ1NJLCBhbmQgJ1NDU0kgZGlzayBzdXBwb3J0JworIworCisjCisjIFVTQiBHYWRnZXQgU3VwcG9ydAorIworIyBDT05GSUdfVVNCX0dBREdFVCBpcyBub3Qgc2V0CisKKyMKKyMgTU1DL1NEIENhcmQgc3VwcG9ydAorIworIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKK0NPTkZJR19SVENfTElCPXkKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CisjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CitDT05GSUdfRE5PVElGWT15CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworQ09ORklHX0ZBVF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CitDT05GSUdfRkFUX0RFRkFVTFRfQ09ERVBBR0U9NDM3CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19TWVNGUz15CisjIENPTkZJR19UTVBGUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVUdFVExCX1BBR0UgaXMgbm90IHNldAorQ09ORklHX1JBTUZTPXkKKyMgQ09ORklHX0NPTkZJR0ZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBNaXNjZWxsYW5lb3VzIGZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19BREZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU1BMVVNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkVGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0pGRlMyX0ZTPXkKK0NPTkZJR19KRkZTMl9GU19ERUJVRz0wCitDT05GSUdfSkZGUzJfRlNfV1JJVEVCVUZGRVI9eQorIyBDT05GSUdfSkZGUzJfU1VNTUFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19KRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19KRkZTMl9aTElCPXkKK0NPTkZJR19KRkZTMl9SVElNRT15CisjIENPTkZJR19KRkZTMl9SVUJJTiBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorIyBDT05GSUdfTkZTX1YzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkZTRCBpcyBub3Qgc2V0CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0xPQ0tEPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKKyMgQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRCBpcyBub3Qgc2V0CitDT05GSUdfTVNET1NfUEFSVElUSU9OPXkKKworIworIyBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorIworQ09ORklHX05MUz15CitDT05GSUdfTkxTX0RFRkFVTFQ9Imlzbzg4NTktMSIKKyMgQ09ORklHX05MU19DT0RFUEFHRV80MzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzczNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODU1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85NDkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg3NCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV84IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV8xMjUxIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19BU0NJSSBpcyBub3Qgc2V0CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CisjIENPTkZJR19OTFNfSVNPODg1OV8yIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzMgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV81IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzYgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV85IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1IgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0tPSThfVSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvZmlsaW5nIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BST0ZJTElORyBpcyBub3Qgc2V0CisKKyMKKyMgS2VybmVsIGhhY2tpbmcKKyMKKyMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX01VVEVYRVMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfU1BJTkxPQ0tfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfQlVHVkVSQk9TRT15CitDT05GSUdfREVCVUdfSU5GTz15CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CitDT05GSUdfRlJBTUVfUE9JTlRFUj15CisjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX1VTRVI9eQorIyBDT05GSUdfREVCVUdfV0FJVFEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0VSUk9SUz15CitDT05GSUdfREVCVUdfTEw9eQorIyBDT05GSUdfREVCVUdfSUNFRENDIGlzIG5vdCBzZXQKKworIworIyBTZWN1cml0eSBvcHRpb25zCisjCisjIENPTkZJR19LRVlTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZIGlzIG5vdCBzZXQKKworIworIyBDcnlwdG9ncmFwaGljIG9wdGlvbnMKKyMKKyMgQ09ORklHX0NSWVBUTyBpcyBub3Qgc2V0CisKKyMKKyMgSGFyZHdhcmUgY3J5cHRvIGRldmljZXMKKyMKKworIworIyBMaWJyYXJ5IHJvdXRpbmVzCisjCisjIENPTkZJR19DUkNfQ0NJVFQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JDMTYgaXMgbm90IHNldAorQ09ORklHX0NSQzMyPXkKKyMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfWkxJQl9JTkZMQVRFPXkKK0NPTkZJR19aTElCX0RFRkxBVEU9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCmluZGV4IGRlNjA2ZGYuLjMwMmZjMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKQEAgLTcwMiw3ICs3MDIsNiBAQAogCS8qCiAJICogTWFyayB0aGlzIGFzIElPCiAJICovCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9TSE0gfCBWTV9MT0NLRUQgfCBWTV9JTzsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwogCiAJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHBoeXMsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwppbmRleCBhYjhlNjAwLi44NmM5MjUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxhc20vZ2x1ZS5oPgogI2luY2x1ZGUgPGFzbS92ZnBtYWNyb3MuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9lbnRyeS1tYWNyby5TPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CiAKICNpbmNsdWRlICJlbnRyeS1oZWFkZXIuUyIKIApAQCAtNTYwLDEwICs1NjEsOCBAQAogCWFkZAlpcCwgcjEsICNUSV9DUFVfU0FWRQogCWxkcglyMywgW3IyLCAjVElfVFBfVkFMVUVdCiAJc3RtaWEJaXAhLCB7cjQgLSBzbCwgZnAsIHNwLCBscn0JQCBTdG9yZSBtb3N0IHJlZ3Mgb24gc3RhY2sKLSNpZm5kZWYgQ09ORklHX01NVQotCWFkZAlyMiwgcjIsICNUSV9DUFVfRE9NQUlOCi0jZWxzZQotCWxkcglyNiwgW3IyLCAjVElfQ1BVX0RPTUFJTl0hCisjaWZkZWYgQ09ORklHX01NVQorCWxkcglyNiwgW3IyLCAjVElfQ1BVX0RPTUFJTl0KICNlbmRpZgogI2lmIF9fTElOVVhfQVJNX0FSQ0hfXyA+PSA2CiAjaWZkZWYgQ09ORklHX0NQVV8zMnY2SwpAQCAtNTg1LDIxICs1ODQsMjAgQEAKICNpZmRlZiBDT05GSUdfTU1VCiAJbWNyCXAxNSwgMCwgcjYsIGMzLCBjMCwgMAkJQCBTZXQgZG9tYWluIHJlZ2lzdGVyCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfVkZQCi0JQCBBbHdheXMgZGlzYWJsZSBWRlAgc28gd2UgY2FuIGxhemlseSBzYXZlL3Jlc3RvcmUgdGhlIG9sZAotCUAgc3RhdGUuIFRoaXMgb2NjdXJzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcmV2aW91cyB0aHJlYWQuCi0JVkZQRk1SWAlyNCwgRlBFWEMKLQliaWMJcjQsIHI0LCAjRlBFWENfRU5BQkxFCi0JVkZQRk1YUglGUEVYQywgcjQKLSNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0lXTU1YVCkKIAlibAlpd21teHRfdGFza19zd2l0Y2gKICNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9YU0NBTEUpCi0JYWRkCXI0LCByMiwgIzQwCQkJQCBjcHVfY29udGV4dF9zYXZlLT5leHRyYQorCWFkZAlyNCwgcjIsICNUSV9DUFVfRE9NQUlOICsgNDAJQCBjcHVfY29udGV4dF9zYXZlLT5leHRyYQogCWxkbWliCXI0LCB7cjQsIHI1fQogCW1hcglhY2MwLCByNCwgcjUKICNlbmRpZgotCWxkbWliCXIyLCB7cjQgLSBzbCwgZnAsIHNwLCBwY30JQCBMb2FkIGFsbCByZWdzIHNhdmVkIHByZXZpb3VzbHkKKwltb3YJcjUsIHIwCisJYWRkCXI0LCByMiwgI1RJX0NQVV9TQVZFCisJbGRyCXIwLCA9dGhyZWFkX25vdGlmeV9oZWFkCisJbW92CXIxLCAjVEhSRUFEX05PVElGWV9TV0lUQ0gKKwlibAlhdG9taWNfbm90aWZpZXJfY2FsbF9jaGFpbgorCW1vdglyMCwgcjUKKwlsZG1pYQlyNCwge3I0IC0gc2wsIGZwLCBzcCwgcGN9CUAgTG9hZCBhbGwgcmVncyBzYXZlZCBwcmV2aW91c2x5CiAKIAlfX0lOSVQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2lycS5jIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCmluZGV4IGJjYzE5ZmIuLmVjMjBmODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaXJxLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAqLwogI2RlZmluZSBNQVhfSVJRX0NOVAkxMDAwMDAKIAotc3RhdGljIGludCBub2lycWRlYnVnOworc3RhdGljIGludCBub2lycWRlYnVnIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBpcnFfZXJyX2NvdW50Owogc3RhdGljIERFRklORV9TUElOTE9DSyhpcnFfY29udHJvbGxlcl9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoaXJxX3BlbmRpbmcpOwpAQCAtODEsNyArODEsNyBAQAogCiB2b2lkIGRvX2JhZF9JUlEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycWRlc2MgKmRlc2MsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWlycV9lcnJfY291bnQgKz0gMTsKKwlpcnFfZXJyX2NvdW50Kys7CiAJcHJpbnRrKEtFUk5fRVJSICJJUlE6IHNwdXJpb3VzIGludGVycnVwdCAlZFxuIiwgaXJxKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TIGIvYXJjaC9hcm0va2VybmVsL2l3bW14dC5TCmluZGV4IDI0YzdiMDQuLmEzYmFlOTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9pd21teHQuUworKysgYi9hcmNoL2FybS9rZXJuZWwvaXdtbXh0LlMKQEAgLTI3Myw3ICsyNzMsNyBAQAogICoKICAqIHIwID0gcHJldmlvdXMgdGFza19zdHJ1Y3QgcG9pbnRlciAobXVzdCBiZSBwcmVzZXJ2ZWQpCiAgKiByMSA9IHByZXZpb3VzIHRocmVhZF9pbmZvIHBvaW50ZXIKLSAqIHIyID0gbmV4dCB0aHJlYWRfaW5mby5jcHVfZG9tYWluIHBvaW50ZXIgKG11c3QgYmUgcHJlc2VydmVkKQorICogcjIgPSBuZXh0IHRocmVhZF9pbmZvIHBvaW50ZXIgKG11c3QgYmUgcHJlc2VydmVkKQogICoKICAqIENhbGxlZCBvbmx5IGZyb20gX19zd2l0Y2hfdG8gd2l0aCB0YXNrIHByZWVtcHRpb24gZGlzYWJsZWQuCiAgKiBObyBuZWVkIHRvIGNhcmUgYWJvdXQgcHJlc2VydmluZyByNCBhbmQgYWJvdmUuCkBAIC0yODUsNyArMjg1LDcgQEAKIAlibmUJMWYJCQkJQCB5ZXM6IGJsb2NrIHRoZW0gZm9yIG5leHQgdGFzawogCiAJbGRyCXI1LCA9Y29uY2FuX293bmVyCi0JYWRkCXI2LCByMiwgIyhUSV9JV01NWFRfU1RBVEUgLSBUSV9DUFVfRE9NQUlOKSBAIGdldCBuZXh0IHRhc2sgQ29uY2FuIHNhdmUgYXJlYQorCWFkZAlyNiwgcjIsICNUSV9JV01NWFRfU1RBVEUJQCBnZXQgbmV4dCB0YXNrIENvbmNhbiBzYXZlIGFyZWEKIAlsZHIJcjUsIFtyNV0JCQlAIGdldCBjdXJyZW50IENvbmNhbiBvd25lcgogCXRlcQlyNSwgcjYJCQkJQCBuZXh0IHRhc2sgb3ducyBpdD8KIAltb3ZuZQlwYywgbHIJCQkJQCBubzogbGVhdmUgQ29uY2FuIGRpc2FibGVkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwppbmRleCAxN2MzOGRiLi5lMWM3N2VlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vbGVkcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9ub3RpZnkuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KIApAQCAtMzM4LDEzICszMzksOSBAQAogewogfQogCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2ZwX2luaXQodW5pb24gZnBfc3RhdGUgKmZwKQotewotCW1lbXNldChmcCwgMCwgc2l6ZW9mKHVuaW9uIGZwX3N0YXRlKSk7Ci19CitBVE9NSUNfTk9USUZJRVJfSEVBRCh0aHJlYWRfbm90aWZ5X2hlYWQpOwogCi12b2lkICgqZnBfaW5pdCkodW5pb24gZnBfc3RhdGUgKikgPSBkZWZhdWx0X2ZwX2luaXQ7Ci1FWFBPUlRfU1lNQk9MKGZwX2luaXQpOworRVhQT1JUX1NZTUJPTF9HUEwodGhyZWFkX25vdGlmeV9oZWFkKTsKIAogdm9pZCBmbHVzaF90aHJlYWQodm9pZCkKIHsKQEAgLTM1MywyMiArMzUwLDIxIEBACiAKIAltZW1zZXQodGhyZWFkLT51c2VkX2NwLCAwLCBzaXplb2YodGhyZWFkLT51c2VkX2NwKSk7CiAJbWVtc2V0KCZ0c2stPnRocmVhZC5kZWJ1ZywgMCwgc2l6ZW9mKHN0cnVjdCBkZWJ1Z19pbmZvKSk7CisJbWVtc2V0KCZ0aHJlYWQtPmZwc3RhdGUsIDAsIHNpemVvZih1bmlvbiBmcF9zdGF0ZSkpOworCisJdGhyZWFkX25vdGlmeShUSFJFQURfTk9USUZZX0ZMVVNILCB0aHJlYWQpOwogI2lmIGRlZmluZWQoQ09ORklHX0lXTU1YVCkKIAlpd21teHRfdGFza19yZWxlYXNlKHRocmVhZCk7CiAjZW5kaWYKLQlmcF9pbml0KCZ0aHJlYWQtPmZwc3RhdGUpOwotI2lmIGRlZmluZWQoQ09ORklHX1ZGUCkKLQl2ZnBfZmx1c2hfdGhyZWFkKCZ0aHJlYWQtPnZmcHN0YXRlKTsKLSNlbmRpZgogfQogCiB2b2lkIHJlbGVhc2VfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqZGVhZF90YXNrKQogewotI2lmIGRlZmluZWQoQ09ORklHX1ZGUCkKLQl2ZnBfcmVsZWFzZV90aHJlYWQoJnRhc2tfdGhyZWFkX2luZm8oZGVhZF90YXNrKS0+dmZwc3RhdGUpOwotI2VuZGlmCisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB0YXNrX3RocmVhZF9pbmZvKGRlYWRfdGFzayk7CisKKwl0aHJlYWRfbm90aWZ5KFRIUkVBRF9OT1RJRllfUkVMRUFTRSwgdGhyZWFkKTsKICNpZiBkZWZpbmVkKENPTkZJR19JV01NWFQpCi0JaXdtbXh0X3Rhc2tfcmVsZWFzZSh0YXNrX3RocmVhZF9pbmZvKGRlYWRfdGFzaykpOworCWl3bW14dF90YXNrX3JlbGVhc2UodGhyZWFkKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYTBjZDBhOS4uMWNlMDVlYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwpAQCAtMTM0LDE3ICsxMzQsNiBAQAogCiAjaWZkZWYgQ09ORklHX0lXTU1YVAogCi0vKiBpd21teHRfYXJlYSBpcyAweDk4IGJ5dGVzIGxvbmcsIHByZWNlZWRlZCBieSA4IGJ5dGVzIG9mIHNpZ25hdHVyZSAqLwotI2RlZmluZSBJV01NWFRfU1RPUkFHRV9TSVpFCSgweDk4ICsgOCkKLSNkZWZpbmUgSVdNTVhUX01BR0lDMAkJMHgxMmVmODQyYQotI2RlZmluZSBJV01NWFRfTUFHSUMxCQkweDFjMDdjYTcxCi0KLXN0cnVjdCBpd21teHRfc2lnZnJhbWUgewotCXVuc2lnbmVkIGxvbmcJbWFnaWMwOwotCXVuc2lnbmVkIGxvbmcJbWFnaWMxOwotCXVuc2lnbmVkIGxvbmcJc3RvcmFnZVsweDk4LzRdOwotfTsKLQogc3RhdGljIGludCBwcmVzZXJ2ZV9pd21teHRfY29udGV4dChzdHJ1Y3QgaXdtbXh0X3NpZ2ZyYW1lICpmcmFtZSkKIHsKIAljaGFyIGtidWZbc2l6ZW9mKCpmcmFtZSkgKyA4XTsKQEAgLTE1Miw4ICsxNDEsOCBAQAogCiAJLyogdGhlIGlXTU1YdCBjb250ZXh0IG11c3QgYmUgNjQgYml0IGFsaWduZWQgKi8KIAlrZnJhbWUgPSAoc3RydWN0IGl3bW14dF9zaWdmcmFtZSAqKSgodW5zaWduZWQgbG9uZykoa2J1ZiArIDgpICYgfjcpOwotCWtmcmFtZS0+bWFnaWMwID0gSVdNTVhUX01BR0lDMDsKLQlrZnJhbWUtPm1hZ2ljMSA9IElXTU1YVF9NQUdJQzE7CisJa2ZyYW1lLT5tYWdpYyA9IElXTU1YVF9NQUdJQzsKKwlrZnJhbWUtPnNpemUgPSBJV01NWFRfU1RPUkFHRV9TSVpFOwogCWl3bW14dF90YXNrX2NvcHkoY3VycmVudF90aHJlYWRfaW5mbygpLCAma2ZyYW1lLT5zdG9yYWdlKTsKIAlyZXR1cm4gX19jb3B5X3RvX3VzZXIoZnJhbWUsIGtmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpOwogfQpAQCAtMTY3LDggKzE1Niw4IEBACiAJa2ZyYW1lID0gKHN0cnVjdCBpd21teHRfc2lnZnJhbWUgKikoKHVuc2lnbmVkIGxvbmcpKGtidWYgKyA4KSAmIH43KTsKIAlpZiAoX19jb3B5X2Zyb21fdXNlcihrZnJhbWUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCXJldHVybiAtMTsKLQlpZiAoa2ZyYW1lLT5tYWdpYzAgIT0gSVdNTVhUX01BR0lDMCB8fAotCSAgICBrZnJhbWUtPm1hZ2ljMSAhPSBJV01NWFRfTUFHSUMxKQorCWlmIChrZnJhbWUtPm1hZ2ljICE9IElXTU1YVF9NQUdJQyB8fAorCSAgICBrZnJhbWUtPnNpemUgIT0gSVdNTVhUX1NUT1JBR0VfU0laRSkKIAkJcmV0dXJuIC0xOwogCWl3bW14dF90YXNrX3Jlc3RvcmUoY3VycmVudF90aHJlYWRfaW5mbygpLCAma2ZyYW1lLT5zdG9yYWdlKTsKIAlyZXR1cm4gMDsKQEAgLTE3Nyw3MCArMTY2LDYxIEBACiAjZW5kaWYKIAogLyoKLSAqIEF1eGlsaWFyeSBzaWduYWwgZnJhbWUuICBUaGlzIHNhdmVzIHN0dWZmIGxpa2UgRlAgc3RhdGUuCi0gKiBUaGUgbGF5b3V0IG9mIHRoaXMgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSB1c2VyIEFCSS4KLSAqLwotc3RydWN0IGF1eF9zaWdmcmFtZSB7Ci0jaWZkZWYgQ09ORklHX0lXTU1YVAotCXN0cnVjdCBpd21teHRfc2lnZnJhbWUJaXdtbXh0OwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1ZGUAotCXVuaW9uIHZmcF9zdGF0ZQkJdmZwOwotI2VuZGlmCi19OwotCi0vKgogICogRG8gYSBzaWduYWwgcmV0dXJuOyB1bmRvIHRoZSBzaWduYWwgc3RhY2suICBUaGVzZSBhcmUgYWxpZ25lZCB0byA2NC1iaXQuCiAgKi8KIHN0cnVjdCBzaWdmcmFtZSB7Ci0Jc3RydWN0IHNpZ2NvbnRleHQgc2M7Ci0JdW5zaWduZWQgbG9uZyBleHRyYW1hc2tbX05TSUdfV09SRFMtMV07CisJc3RydWN0IHVjb250ZXh0IHVjOwogCXVuc2lnbmVkIGxvbmcgcmV0Y29kZVsyXTsKLQlzdHJ1Y3QgYXV4X3NpZ2ZyYW1lIGF1eCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiB9OwogCiBzdHJ1Y3QgcnRfc2lnZnJhbWUgewotCXN0cnVjdCBzaWdpbmZvIF9fdXNlciAqcGluZm87Ci0Jdm9pZCBfX3VzZXIgKnB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwotCXN0cnVjdCB1Y29udGV4dCB1YzsKLQl1bnNpZ25lZCBsb25nIHJldGNvZGVbMl07Ci0Jc3RydWN0IGF1eF9zaWdmcmFtZSBhdXggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg4KSkpOworCXN0cnVjdCBzaWdmcmFtZSBzaWc7CiB9OwogCi1zdGF0aWMgaW50Ci1yZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsCi0JCSAgIHN0cnVjdCBhdXhfc2lnZnJhbWUgX191c2VyICphdXgpCitzdGF0aWMgaW50IHJlc3RvcmVfc2lnZnJhbWUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKnNmKQogewotCWludCBlcnIgPSAwOworCXN0cnVjdCBhdXhfc2lnZnJhbWUgX191c2VyICphdXg7CisJc2lnc2V0X3Qgc2V0OworCWludCBlcnI7CiAKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMCwgJnNjLT5hcm1fcjAsIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEsICZzYy0+YXJtX3IxLCBlcnIpOwotCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IyLCAmc2MtPmFybV9yMiwgZXJyKTsKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMywgJnNjLT5hcm1fcjMsIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjQsICZzYy0+YXJtX3I0LCBlcnIpOwotCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I1LCAmc2MtPmFybV9yNSwgZXJyKTsKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNiwgJnNjLT5hcm1fcjYsIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjcsICZzYy0+YXJtX3I3LCBlcnIpOwotCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I4LCAmc2MtPmFybV9yOCwgZXJyKTsKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yOSwgJnNjLT5hcm1fcjksIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEwLCAmc2MtPmFybV9yMTAsIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fZnAsICZzYy0+YXJtX2ZwLCBlcnIpOwotCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX2lwLCAmc2MtPmFybV9pcCwgZXJyKTsKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9zcCwgJnNjLT5hcm1fc3AsIGVycik7Ci0JX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fbHIsICZzYy0+YXJtX2xyLCBlcnIpOwotCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3BjLCAmc2MtPmFybV9wYywgZXJyKTsKLQlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9jcHNyLCAmc2MtPmFybV9jcHNyLCBlcnIpOworCWVyciA9IF9fY29weV9mcm9tX3VzZXIoJnNldCwgJnNmLT51Yy51Y19zaWdtYXNrLCBzaXplb2Yoc2V0KSk7CisJaWYgKGVyciA9PSAwKSB7CisJCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOworCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwkJY3VycmVudC0+YmxvY2tlZCA9IHNldDsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwl9CisKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMCwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjAsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3IxLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IyLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yMiwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMywgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjMsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjQsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3I0LCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I1LCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yNSwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNiwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjYsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjcsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3I3LCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I4LCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yOCwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yOSwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjksIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEwLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yMTAsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fZnAsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX2ZwLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX2lwLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9pcCwgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9zcCwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fc3AsIGVycik7CisJX19nZXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fbHIsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX2xyLCBlcnIpOworCV9fZ2V0X3VzZXJfZXJyb3IocmVncy0+QVJNX3BjLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9wYywgZXJyKTsKKwlfX2dldF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9jcHNyLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9jcHNyLCBlcnIpOwogCiAJZXJyIHw9ICF2YWxpZF91c2VyX3JlZ3MocmVncyk7CiAKKwlhdXggPSAoc3RydWN0IGF1eF9zaWdmcmFtZSBfX3VzZXIgKikgc2YtPnVjLnVjX3JlZ3NwYWNlOwogI2lmZGVmIENPTkZJR19JV01NWFQKIAlpZiAoZXJyID09IDAgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfVVNJTkdfSVdNTVhUKSkKIAkJZXJyIHw9IHJlc3RvcmVfaXdtbXh0X2NvbnRleHQoJmF1eC0+aXdtbXh0KTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19WRlAKIC8vCWlmIChlcnIgPT0gMCkKLS8vCQllcnIgfD0gdmZwX3Jlc3RvcmVfc3RhdGUoJmF1eC0+dmZwKTsKKy8vCQllcnIgfD0gdmZwX3Jlc3RvcmVfc3RhdGUoJnNmLT5hdXgudmZwKTsKICNlbmRpZgogCiAJcmV0dXJuIGVycjsKQEAgLTI0OSw3ICsyMjksNiBAQAogYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlzaWdzZXRfdCBzZXQ7CiAKIAkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CkBAIC0yNjYsMTkgKzI0NSw4IEBACiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZiAoKmZyYW1lKSkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0JaWYgKF9fZ2V0X3VzZXIoc2V0LnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKQotCSAgICB8fCAoX05TSUdfV09SRFMgPiAxCi0JICAgICAgICAmJiBfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnWzFdLCAmZnJhbWUtPmV4dHJhbWFzaywKLQkJCQkgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKSkpCi0JCWdvdG8gYmFkZnJhbWU7CiAKLQlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQotCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT5zYywgJmZyYW1lLT5hdXgpKQorCWlmIChyZXN0b3JlX3NpZ2ZyYW1lKHJlZ3MsIGZyYW1lKSkKIAkJZ290byBiYWRmcmFtZTsKIAogCS8qIFNlbmQgU0lHVFJBUCBpZiB3ZSdyZSBzaW5nbGUtc3RlcHBpbmcgKi8KQEAgLTI5Nyw3ICsyNjUsNiBAQAogYXNtbGlua2FnZSBpbnQgc3lzX3J0X3NpZ3JldHVybihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlzaWdzZXRfdCBzZXQ7CiAKIAkvKiBBbHdheXMgbWFrZSBhbnkgcGVuZGluZyByZXN0YXJ0ZWQgc3lzdGVtIGNhbGxzIHJldHVybiAtRUlOVFIgKi8KIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CkBAIC0zMTQsMTkgKzI4MSwxMSBAQAogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyYW1lLCBzaXplb2YgKCpmcmFtZSkpKQogCQlnb3RvIGJhZGZyYW1lOwotCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQorCisJaWYgKHJlc3RvcmVfc2lnZnJhbWUocmVncywgJmZyYW1lLT5zaWcpKQogCQlnb3RvIGJhZGZyYW1lOwogCi0Jc2lnZGVsc2V0bWFzaygmc2V0LCB+X0JMT0NLQUJMRSk7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+YmxvY2tlZCA9IHNldDsKLQlyZWNhbGNfc2lncGVuZGluZygpOwotCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0KLQlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZmcmFtZS0+YXV4KSkKLQkJZ290byBiYWRmcmFtZTsKLQotCWlmIChkb19zaWdhbHRzdGFjaygmZnJhbWUtPnVjLnVjX3N0YWNrLCBOVUxMLCByZWdzLT5BUk1fc3ApID09IC1FRkFVTFQpCisJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+c2lnLnVjLnVjX3N0YWNrLCBOVUxMLCByZWdzLT5BUk1fc3ApID09IC1FRkFVTFQpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAkvKiBTZW5kIFNJR1RSQVAgaWYgd2UncmUgc2luZ2xlLXN0ZXBwaW5nICovCkBAIC0zNDMsNDIgKzMwMiw0NiBAQAogfQogCiBzdGF0aWMgaW50Ci1zZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsIHN0cnVjdCBhdXhfc2lnZnJhbWUgX191c2VyICphdXgsCi0JCSBzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBtYXNrKQorc2V0dXBfc2lnZnJhbWUoc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqc2YsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdzZXRfdCAqc2V0KQogeworCXN0cnVjdCBhdXhfc2lnZnJhbWUgX191c2VyICphdXg7CiAJaW50IGVyciA9IDA7CiAKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMCwgJnNjLT5hcm1fcjAsIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEsICZzYy0+YXJtX3IxLCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IyLCAmc2MtPmFybV9yMiwgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMywgJnNjLT5hcm1fcjMsIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjQsICZzYy0+YXJtX3I0LCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I1LCAmc2MtPmFybV9yNSwgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNiwgJnNjLT5hcm1fcjYsIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjcsICZzYy0+YXJtX3I3LCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I4LCAmc2MtPmFybV9yOCwgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yOSwgJnNjLT5hcm1fcjksIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjEwLCAmc2MtPmFybV9yMTAsIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fZnAsICZzYy0+YXJtX2ZwLCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX2lwLCAmc2MtPmFybV9pcCwgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9zcCwgJnNjLT5hcm1fc3AsIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fbHIsICZzYy0+YXJtX2xyLCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3BjLCAmc2MtPmFybV9wYywgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9jcHNyLCAmc2MtPmFybV9jcHNyLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IwLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yMCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMSwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjEsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjIsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3IyLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3IzLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yMywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNCwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjQsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjUsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3I1LCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I2LCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yNiwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yNywgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fcjcsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcjgsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3I4LCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3I5LCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9yOSwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9yMTAsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3IxMCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9mcCwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fZnAsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1faXAsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX2lwLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX3NwLCAmc2YtPnVjLnVjX21jb250ZXh0LmFybV9zcCwgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHJlZ3MtPkFSTV9sciwgJnNmLT51Yy51Y19tY29udGV4dC5hcm1fbHIsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihyZWdzLT5BUk1fcGMsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX3BjLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IocmVncy0+QVJNX2Nwc3IsICZzZi0+dWMudWNfbWNvbnRleHQuYXJtX2Nwc3IsIGVycik7CiAKLQlfX3B1dF91c2VyX2Vycm9yKGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCAmc2MtPnRyYXBfbm8sIGVycik7Ci0JX19wdXRfdXNlcl9lcnJvcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNjLT5lcnJvcl9jb2RlLCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IoY3VycmVudC0+dGhyZWFkLmFkZHJlc3MsICZzYy0+ZmF1bHRfYWRkcmVzcywgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKG1hc2ssICZzYy0+b2xkbWFzaywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKGN1cnJlbnQtPnRocmVhZC50cmFwX25vLCAmc2YtPnVjLnVjX21jb250ZXh0LnRyYXBfbm8sIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihjdXJyZW50LT50aHJlYWQuZXJyb3JfY29kZSwgJnNmLT51Yy51Y19tY29udGV4dC5lcnJvcl9jb2RlLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IoY3VycmVudC0+dGhyZWFkLmFkZHJlc3MsICZzZi0+dWMudWNfbWNvbnRleHQuZmF1bHRfYWRkcmVzcywgZXJyKTsKKwlfX3B1dF91c2VyX2Vycm9yKHNldC0+c2lnWzBdLCAmc2YtPnVjLnVjX21jb250ZXh0Lm9sZG1hc2ssIGVycik7CiAKKwllcnIgfD0gX19jb3B5X3RvX3VzZXIoJnNmLT51Yy51Y19zaWdtYXNrLCBzZXQsIHNpemVvZigqc2V0KSk7CisKKwlhdXggPSAoc3RydWN0IGF1eF9zaWdmcmFtZSBfX3VzZXIgKikgc2YtPnVjLnVjX3JlZ3NwYWNlOwogI2lmZGVmIENPTkZJR19JV01NWFQKIAlpZiAoZXJyID09IDAgJiYgdGVzdF90aHJlYWRfZmxhZyhUSUZfVVNJTkdfSVdNTVhUKSkKIAkJZXJyIHw9IHByZXNlcnZlX2l3bW14dF9jb250ZXh0KCZhdXgtPml3bW14dCk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVkZQCiAvLwlpZiAoZXJyID09IDApCi0vLwkJZXJyIHw9IHZmcF9zYXZlX3N0YXRlKCZhdXgtPnZmcCk7CisvLwkJZXJyIHw9IHZmcF9zYXZlX3N0YXRlKCZzZi0+YXV4LnZmcCk7CiAjZW5kaWYKKwlfX3B1dF91c2VyX2Vycm9yKDAsICZhdXgtPmVuZF9tYWdpYywgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00ODcsMTMgKzQ1MCwxMiBAQAogCWlmICghZnJhbWUpCiAJCXJldHVybiAxOwogCi0JZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT5zYywgJmZyYW1lLT5hdXgsIHJlZ3MsIHNldC0+c2lnWzBdKTsKKwkvKgorCSAqIFNldCB1Yy51Y19mbGFncyB0byBhIHZhbHVlIHdoaWNoIHNjLnRyYXBfbm8gd291bGQgbmV2ZXIgaGF2ZS4KKwkgKi8KKwlfX3B1dF91c2VyX2Vycm9yKDB4NWFjM2MzNWEsICZmcmFtZS0+dWMudWNfZmxhZ3MsIGVycik7CiAKLQlpZiAoX05TSUdfV09SRFMgPiAxKSB7Ci0JCWVyciB8PSBfX2NvcHlfdG9fdXNlcihmcmFtZS0+ZXh0cmFtYXNrLCAmc2V0LT5zaWdbMV0sCi0JCQkJICAgICAgc2l6ZW9mKGZyYW1lLT5leHRyYW1hc2spKTsKLQl9Ci0KKwllcnIgfD0gc2V0dXBfc2lnZnJhbWUoZnJhbWUsIHJlZ3MsIHNldCk7CiAJaWYgKGVyciA9PSAwKQogCQllcnIgPSBzZXR1cF9yZXR1cm4ocmVncywga2EsIGZyYW1lLT5yZXRjb2RlLCBmcmFtZSwgdXNpZyk7CiAKQEAgLTUxMSwyNSArNDczLDIwIEBACiAJaWYgKCFmcmFtZSkKIAkJcmV0dXJuIDE7CiAKLQlfX3B1dF91c2VyX2Vycm9yKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbywgZXJyKTsKLQlfX3B1dF91c2VyX2Vycm9yKCZmcmFtZS0+dWMsICZmcmFtZS0+cHVjLCBlcnIpOwogCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sIGluZm8pOwogCi0JX19wdXRfdXNlcl9lcnJvcigwLCAmZnJhbWUtPnVjLnVjX2ZsYWdzLCBlcnIpOwotCV9fcHV0X3VzZXJfZXJyb3IoTlVMTCwgJmZyYW1lLT51Yy51Y19saW5rLCBlcnIpOworCV9fcHV0X3VzZXJfZXJyb3IoMCwgJmZyYW1lLT5zaWcudWMudWNfZmxhZ3MsIGVycik7CisJX19wdXRfdXNlcl9lcnJvcihOVUxMLCAmZnJhbWUtPnNpZy51Yy51Y19saW5rLCBlcnIpOwogCiAJbWVtc2V0KCZzdGFjaywgMCwgc2l6ZW9mKHN0YWNrKSk7CiAJc3RhY2suc3Nfc3AgPSAodm9pZCBfX3VzZXIgKiljdXJyZW50LT5zYXNfc3Nfc3A7CiAJc3RhY2suc3NfZmxhZ3MgPSBzYXNfc3NfZmxhZ3MocmVncy0+QVJNX3NwKTsKIAlzdGFjay5zc19zaXplID0gY3VycmVudC0+c2FzX3NzX3NpemU7Ci0JZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+dWMudWNfc3RhY2ssICZzdGFjaywgc2l6ZW9mKHN0YWNrKSk7CisJZXJyIHw9IF9fY29weV90b191c2VyKCZmcmFtZS0+c2lnLnVjLnVjX3N0YWNrLCAmc3RhY2ssIHNpemVvZihzdGFjaykpOwogCi0JZXJyIHw9IHNldHVwX3NpZ2NvbnRleHQoJmZyYW1lLT51Yy51Y19tY29udGV4dCwgJmZyYW1lLT5hdXgsCi0JCQkJcmVncywgc2V0LT5zaWdbMF0pOwotCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKCpzZXQpKTsKLQorCWVyciB8PSBzZXR1cF9zaWdmcmFtZSgmZnJhbWUtPnNpZywgcmVncywgc2V0KTsKIAlpZiAoZXJyID09IDApCi0JCWVyciA9IHNldHVwX3JldHVybihyZWdzLCBrYSwgZnJhbWUtPnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKKwkJZXJyID0gc2V0dXBfcmV0dXJuKHJlZ3MsIGthLCBmcmFtZS0+c2lnLnJldGNvZGUsIGZyYW1lLCB1c2lnKTsKIAogCWlmIChlcnIgPT0gMCkgewogCQkvKgpAQCAtNTM4LDcgKzQ5NSw3IEBACiAJCSAqICAgLS0gUGV0ZXIgTWF5ZGVsbCA8cG1heWRlbGxAY2hpYXJrLmdyZWVuZW5kLm9yZy51az4gMjAwMC0xMi0wNgogCQkgKi8KIAkJcmVncy0+QVJNX3IxID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5pbmZvOwotCQlyZWdzLT5BUk1fcjIgPSAodW5zaWduZWQgbG9uZykmZnJhbWUtPnVjOworCQlyZWdzLT5BUk1fcjIgPSAodW5zaWduZWQgbG9uZykmZnJhbWUtPnNpZy51YzsKIAl9CiAKIAlyZXR1cm4gZXJyOwpAQCAtNjY1LDE3ICs2MjIsMzMgQEAKIAlpZiAoc3lzY2FsbCkgewogCQlpZiAocmVncy0+QVJNX3IwID09IC1FUkVTVEFSVF9SRVNUQVJUQkxPQ0spIHsKIAkJCWlmICh0aHVtYl9tb2RlKHJlZ3MpKSB7Ci0JCQkJcmVncy0+QVJNX3I3ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGw7CisJCQkJcmVncy0+QVJNX3I3ID0gX19OUl9yZXN0YXJ0X3N5c2NhbGwgLSBfX05SX1NZU0NBTExfQkFTRTsKIAkJCQlyZWdzLT5BUk1fcGMgLT0gMjsKIAkJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChDT05GSUdfQUVBQkkpICYmICFkZWZpbmVkKENPTkZJR19PQUJJX0NPTVBBVCkKKwkJCQlyZWdzLT5BUk1fcjcgPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKKwkJCQlyZWdzLT5BUk1fcGMgLT0gNDsKKyNlbHNlCiAJCQkJdTMyIF9fdXNlciAqdXNwOworCQkJCXUzMiBzd2l2YWwgPSBfX05SX3Jlc3RhcnRfc3lzY2FsbDsKIAogCQkJCXJlZ3MtPkFSTV9zcCAtPSAxMjsKIAkJCQl1c3AgPSAodTMyIF9fdXNlciAqKXJlZ3MtPkFSTV9zcDsKIAorCQkJCS8qCisJCQkJICogRWl0aGVyIHdlIHN1cHBvcnRzIE9BQkkgb25seSwgb3Igd2UgaGF2ZQorCQkJCSAqIEVBQkkgd2l0aCB0aGUgT0FCSSBjb21wYXQgbGF5ZXIgZW5hYmxlZC4KKwkJCQkgKiBJbiB0aGUgbGF0ZXIgY2FzZSB3ZSBkb24ndCBrbm93IGlmIHVzZXIKKwkJCQkgKiBzcGFjZSBpcyBFQUJJIG9yIG5vdCwgYW5kIGlmIG5vdCB3ZSBtdXN0CisJCQkJICogbm90IGNsb2JiZXIgcjcuICBBbHdheXMgdXNpbmcgdGhlIE9BQkkKKwkJCQkgKiBzeXNjYWxsIHNvbHZlcyB0aGF0IGlzc3VlIGFuZCB3b3JrcyBmb3IKKwkJCQkgKiBhbGwgdGhvc2UgY2FzZXMuCisJCQkJICovCisJCQkJc3dpdmFsID0gc3dpdmFsIC0gX19OUl9TWVNDQUxMX0JBU0UgKyBfX05SX09BQklfU1lTQ0FMTF9CQVNFOworCiAJCQkJcHV0X3VzZXIocmVncy0+QVJNX3BjLCAmdXNwWzBdKTsKIAkJCQkvKiBzd2kgX19OUl9yZXN0YXJ0X3N5c2NhbGwgKi8KLQkJCQlwdXRfdXNlcigweGVmMDAwMDAwIHwgX19OUl9yZXN0YXJ0X3N5c2NhbGwsICZ1c3BbMV0pOworCQkJCXB1dF91c2VyKDB4ZWYwMDAwMDAgfCBzd2l2YWwsICZ1c3BbMV0pOwogCQkJCS8qIGxkcglwYywgW3NwXSwgIzEyICovCiAJCQkJcHV0X3VzZXIoMHhlNDlkZjAwYywgJnVzcFsyXSk7CiAKQEAgLTY4Myw2ICs2NTYsNyBAQAogCQkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKHVzcCArIDMpKTsKIAogCQkJCXJlZ3MtPkFSTV9wYyA9IHJlZ3MtPkFSTV9zcCArIDQ7CisjZW5kaWYKIAkJCX0KIAkJfQogCQlpZiAocmVncy0+QVJNX3IwID09IC1FUkVTVEFSVE5PSEFORCB8fApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZQppbmRleCA1MzkzYWY5Li4wNWE0OGEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKICMKICMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCiAjCi1vYmoteQkJCTo9IGNvcmUubworb2JqLXkJCQk6PSBjb3JlLm8gY2xvY2subwogb2JqLW0JCQk6PQogb2JqLW4JCQk6PQogb2JqLQkJCTo9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jbG9jay5jIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFkNzgyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY2xvY2suYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIGFyY2gvYXJtL21hY2gtZXA5M3h4L2Nsb2NrLmMKKyAqIENsb2NrIGNvbnRyb2wgZm9yIENpcnJ1cyBFUDkzeHggY2hpcHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IExlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitzdHJ1Y3QgY2xrIHsKKwljaGFyCQkqbmFtZTsKKwl1bnNpZ25lZCBsb25nCXJhdGU7CisJaW50CQl1c2VyczsKKwl1MzIJCWVuYWJsZV9yZWc7CisJdTMyCQllbmFibGVfbWFzazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wbGwxID0geworCS5uYW1lCQk9ICJwbGwxIiwKK307CitzdGF0aWMgc3RydWN0IGNsayBjbGtfZiA9IHsKKwkubmFtZQkJPSAiZmNsayIsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2ggPSB7CisJLm5hbWUJCT0gImhjbGsiLAorfTsKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19wID0geworCS5uYW1lCQk9ICJwY2xrIiwKK307CitzdGF0aWMgc3RydWN0IGNsayBjbGtfcGxsMiA9IHsKKwkubmFtZQkJPSAicGxsMiIsCit9Oworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VzYl9ob3N0ID0geworCS5uYW1lCQk9ICJ1c2JfaG9zdCIsCisJLmVuYWJsZV9yZWcJPSBFUDkzWFhfU1lTQ09OX0NMT0NLX0NPTlRST0wsCisJLmVuYWJsZV9tYXNrCT0gRVA5M1hYX1NZU0NPTl9DTE9DS19VU0hfRU4sCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgY2xrICpjbG9ja3NbXSA9IHsKKwkmY2xrX3BsbDEsCisJJmNsa19mLAorCSZjbGtfaCwKKwkmY2xrX3AsCisJJmNsa19wbGwyLAorCSZjbGtfdXNiX2hvc3QsCit9OworCitzdHJ1Y3QgY2xrICpjbGtfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbG9ja3MpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoY2xvY2tzW2ldLT5uYW1lLCBpZCkpCisJCQlyZXR1cm4gY2xvY2tzW2ldOworCX0KKworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorCitpbnQgY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaWYgKCFjbGstPnVzZXJzKysgJiYgY2xrLT5lbmFibGVfcmVnKSB7CisJCXUzMiB2YWx1ZTsKKworCQl2YWx1ZSA9IF9fcmF3X3JlYWRsKGNsay0+ZW5hYmxlX3JlZyk7CisJCV9fcmF3X3dyaXRlbCh2YWx1ZSB8IGNsay0+ZW5hYmxlX21hc2ssIGNsay0+ZW5hYmxlX3JlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgY2xrX2Rpc2FibGUoc3RydWN0IGNsayAqY2xrKQoreworCWlmICghLS1jbGstPnVzZXJzICYmIGNsay0+ZW5hYmxlX3JlZykgeworCQl1MzIgdmFsdWU7CisKKwkJdmFsdWUgPSBfX3Jhd19yZWFkbChjbGstPmVuYWJsZV9yZWcpOworCQlfX3Jhd193cml0ZWwodmFsdWUgJiB+Y2xrLT5lbmFibGVfbWFzaywgY2xrLT5lbmFibGVfcmVnKTsKKwl9Cit9CisKK3Vuc2lnbmVkIGxvbmcgY2xrX2dldF9yYXRlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlyZXR1cm4gY2xrLT5yYXRlOworfQorCit2b2lkIGNsa19wdXQoc3RydWN0IGNsayAqY2xrKQoreworfQorCisKKworc3RhdGljIGNoYXIgZmNsa19kaXZpc29yc1tdID0geyAxLCAyLCA0LCA4LCAxNiwgMSwgMSwgMSB9Oworc3RhdGljIGNoYXIgaGNsa19kaXZpc29yc1tdID0geyAxLCAyLCA0LCA1LCA2LCA4LCAxNiwgMzIgfTsKK3N0YXRpYyBjaGFyIHBjbGtfZGl2aXNvcnNbXSA9IHsgMSwgMiwgNCwgOCB9OworCisvKgorICogUExMIHJhdGUgPSAxNC43NDU2IE1IeiAqIChYMUZCRCArIDEpICogKFgyRkJEICsgMSkgLyAoWDJJUEQgKyAxKSAvIDJeUFMKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19wbGxfcmF0ZSh1MzIgY29uZmlnX3dvcmQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHJhdGU7CisJaW50IGk7CisKKwlyYXRlID0gMTQ3NDU2MDA7CisJcmF0ZSAqPSAoKGNvbmZpZ193b3JkID4+IDExKSAmIDB4MWYpICsgMTsJCS8qIFgxRkJEICovCisJcmF0ZSAqPSAoKGNvbmZpZ193b3JkID4+IDUpICYgMHgzZikgKyAxOwkJLyogWDJGQkQgKi8KKwlkb19kaXYocmF0ZSwgKGNvbmZpZ193b3JkICYgMHgxZikgKyAxKTsJCQkvKiBYMklQRCAqLworCWZvciAoaSA9IDA7IGkgPCAoKGNvbmZpZ193b3JkID4+IDE2KSAmIDMpOyBpKyspCQkvKiBQUyAqLworCQlyYXRlID4+PSAxOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKXJhdGU7Cit9CisKK3ZvaWQgZXA5M3h4X2Nsb2NrX2luaXQodm9pZCkKK3sKKwl1MzIgdmFsdWU7CisKKwl2YWx1ZSA9IF9fcmF3X3JlYWRsKEVQOTNYWF9TWVNDT05fQ0xPQ0tfU0VUMSk7CisJaWYgKCEodmFsdWUgJiAweDAwODAwMDAwKSkgewkJCS8qIFBMTDEgYnlwYXNzZWQ/ICAqLworCQljbGtfcGxsMS5yYXRlID0gMTQ3NDU2MDA7CisJfSBlbHNlIHsKKwkJY2xrX3BsbDEucmF0ZSA9IGNhbGNfcGxsX3JhdGUodmFsdWUpOworCX0KKwljbGtfZi5yYXRlID0gY2xrX3BsbDEucmF0ZSAvIGZjbGtfZGl2aXNvcnNbKHZhbHVlID4+IDI1KSAmIDB4N107CisJY2xrX2gucmF0ZSA9IGNsa19wbGwxLnJhdGUgLyBoY2xrX2Rpdmlzb3JzWyh2YWx1ZSA+PiAyMCkgJiAweDddOworCWNsa19wLnJhdGUgPSBjbGtfaC5yYXRlIC8gcGNsa19kaXZpc29yc1sodmFsdWUgPj4gMTgpICYgMHgzXTsKKworCXZhbHVlID0gX19yYXdfcmVhZGwoRVA5M1hYX1NZU0NPTl9DTE9DS19TRVQyKTsKKwlpZiAoISh2YWx1ZSAmIDB4MDAwODAwMDApKSB7CQkJLyogUExMMiBieXBhc3NlZD8gICovCisJCWNsa19wbGwyLnJhdGUgPSAxNDc0NTYwMDsKKwl9IGVsc2UgaWYgKHZhbHVlICYgMHgwMDA0MDAwMCkgewkJLyogUExMMiBlbmFibGVkPyAgKi8KKwkJY2xrX3BsbDIucmF0ZSA9IGNhbGNfcGxsX3JhdGUodmFsdWUpOworCX0gZWxzZSB7CisJCWNsa19wbGwyLnJhdGUgPSAwOworCX0KKwljbGtfdXNiX2hvc3QucmF0ZSA9IGNsa19wbGwyLnJhdGUgLyAoKCh2YWx1ZSA+PiAyOCkgJiAweGYpICsgMSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJlcDkzeHg6IFBMTDEgcnVubmluZyBhdCAlbGQgTUh6LCBQTEwyIGF0ICVsZCBNSHpcbiIsCisJCWNsa19wbGwxLnJhdGUgLyAxMDAwMDAwLCBjbGtfcGxsMi5yYXRlIC8gMTAwMDAwMCk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXA5M3h4OiBGQ0xLICVsZCBNSHosIEhDTEsgJWxkIE1IeiwgUENMSyAlbGQgTUh6XG4iLAorCQljbGtfZi5yYXRlIC8gMTAwMDAwMCwgY2xrX2gucmF0ZSAvIDEwMDAwMDAsCisJCWNsa19wLnJhdGUgLyAxMDAwMDAwKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtZXA5M3h4L2NvcmUuYwppbmRleCBkY2Q0MTc2Li4xZmU3M2MwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1lcDkzeHgvY29yZS5jCkBAIC0xMDMsNyArMTAzLDggQEAKIAl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKIAogCV9fcmF3X3dyaXRlbCgxLCBFUDkzWFhfVElNRVIxX0NMRUFSKTsKLQl3aGlsZSAoX19yYXdfcmVhZGwoRVA5M1hYX1RJTUVSNF9WQUxVRV9MT1cpIC0gbGFzdF9qaWZmeV90aW1lCisJd2hpbGUgKChzaWduZWQgbG9uZykKKwkJKF9fcmF3X3JlYWRsKEVQOTNYWF9USU1FUjRfVkFMVUVfTE9XKSAtIGxhc3RfamlmZnlfdGltZSkKIAkJCQkJCT49IFRJTUVSNF9USUNLU19QRVJfSklGRlkpIHsKIAkJbGFzdF9qaWZmeV90aW1lICs9IFRJTUVSNF9USUNLU19QRVJfSklGRlk7CiAJCXRpbWVyX3RpY2socmVncyk7CkBAIC0xMjQsNyArMTI1LDcgQEAKIHsKIAkvKiBFbmFibGUgcGVyaW9kaWMgSFogdGltZXIuICAqLwogCV9fcmF3X3dyaXRlbCgweDQ4LCBFUDkzWFhfVElNRVIxX0NPTlRST0wpOwotCV9fcmF3X3dyaXRlbCgoNTA4MDAwIC8gSFopIC0gMSwgRVA5M1hYX1RJTUVSMV9MT0FEKTsKKwlfX3Jhd193cml0ZWwoKDUwODQ2OSAvIEhaKSAtIDEsIEVQOTNYWF9USU1FUjFfTE9BRCk7CiAJX19yYXdfd3JpdGVsKDB4YzgsIEVQOTNYWF9USU1FUjFfQ09OVFJPTCk7CiAKIAkvKiBFbmFibGUgbG9zdCBqaWZmeSB0aW1lci4gICovCkBAIC00MzIsMTAgKzQzMywzNyBAQAogfTsKIAogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGVwOTN4eF9vaGNpX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gRVA5M1hYX1VTQl9QSFlTX0JBU0UsCisJCS5lbmQJPSBFUDkzWFhfVVNCX1BIWVNfQkFTRSArIDB4MGZmZiwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IElSUV9FUDkzWFhfVVNCLAorCQkuZW5kCT0gSVJRX0VQOTNYWF9VU0IsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBlcDkzeHhfb2hjaV9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImVwOTN4eC1vaGNpIiwKKwkuaWQJCT0gLTEsCisJLmRldgkJPSB7CisJCS5kbWFfbWFzawkJPSAodm9pZCAqKTB4ZmZmZmZmZmYsCisJCS5jb2hlcmVudF9kbWFfbWFzawk9IDB4ZmZmZmZmZmYsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUoZXA5M3h4X29oY2lfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBlcDkzeHhfb2hjaV9yZXNvdXJjZXMsCit9OworCisKIHZvaWQgX19pbml0IGVwOTN4eF9pbml0X2RldmljZXModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgdjsKIAorCWVwOTN4eF9jbG9ja19pbml0KCk7CisKIAkvKgogCSAqIERpc2FsbG93IGFjY2VzcyB0byBNYXZlcmlja0NydW5jaCBpbml0aWFsbHkuCiAJICovCkBAIC00NDksNCArNDc3LDUgQEAKIAlhbWJhX2RldmljZV9yZWdpc3RlcigmdWFydDNfZGV2aWNlLCAmaW9tZW1fcmVzb3VyY2UpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfcnRjX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlcDkzeHhfb2hjaV9kZXZpY2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvZ2VzYmM5MzEyLmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwppbmRleCBkMThmY2IxLi40N2NjNmM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC9nZXNiYzkzMTIuYwpAQCAtMTYsMTYgKzE2LDM4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9waHlzbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAKK3N0YXRpYyBzdHJ1Y3QgcGh5c21hcF9mbGFzaF9kYXRhIGdlc2JjOTMxMl9mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSA0LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBnZXNiYzkzMTJfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IDB4NjAwMDAwMDAsCisJLmVuZAkJPSAweDYwODAwMDAwLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGdlc2JjOTMxMl9mbGFzaCA9IHsKKwkubmFtZQkJPSAicGh5c21hcC1mbGFzaCIsCisJLmlkCQk9IDAsCisJLmRldgkJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJmdlc2JjOTMxMl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZnZXNiYzkzMTJfZmxhc2hfcmVzb3VyY2UsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgZ2VzYmM5MzEyX2luaXRfbWFjaGluZSh2b2lkKQogewogCWVwOTN4eF9pbml0X2RldmljZXMoKTsKLQlwaHlzbWFwX2NvbmZpZ3VyZSgweDYwMDAwMDAwLCAweDAwODAwMDAwLCA0LCBOVUxMKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJmdlc2JjOTMxMl9mbGFzaCk7CiB9CiAKIE1BQ0hJTkVfU1RBUlQoR0VTQkM5MzEyLCAiR2xvbWF0aW9uIEdFU0JDLTkzMTItc3giKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1lcDkzeHgvdHM3Mnh4LmMgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwppbmRleCBlMjQ1NjZiLi42ZTVhNTZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYworKysgYi9hcmNoL2FybS9tYWNoLWVwOTN4eC90czcyeHguYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9tdGQvcGh5c21hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L200OHQ4Ni5oPgpAQCAtMTExLDYgKzExMiwyNiBAQAogCX0KIH0KIAorc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgdHM3Mnh4X2ZsYXNoX2RhdGEgPSB7CisJLndpZHRoCQk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRzNzJ4eF9mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gVFM3MlhYX05PUl9QSFlTX0JBU0UsCisJLmVuZAkJPSBUUzcyWFhfTk9SX1BIWVNfQkFTRSArIDB4MDEwMDAwMDAsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgdHM3Mnh4X2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmdHM3Mnh4X2ZsYXNoX2RhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IDEsCisJLnJlc291cmNlCT0gJnRzNzJ4eF9mbGFzaF9yZXNvdXJjZSwKK307CisKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHRzNzJ4eF9ydGNfcmVhZGJ5dGUodW5zaWduZWQgbG9uZyBhZGRyKQogewogCV9fcmF3X3dyaXRlYihhZGRyLCBUUzcyWFhfUlRDX0lOREVYX1ZJUlRfQkFTRSk7CkBAIC0xNDEsNyArMTYyLDcgQEAKIHsKIAllcDkzeHhfaW5pdF9kZXZpY2VzKCk7CiAJaWYgKGJvYXJkX2lzX3RzNzIwMCgpKQotCQlwaHlzbWFwX2NvbmZpZ3VyZShUUzcyWFhfTk9SX1BIWVNfQkFTRSwgMHgwMTAwMDAwMCwgMSwgTlVMTCk7CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmdHM3Mnh4X2ZsYXNoKTsKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnRzNzJ4eF9ydGNfZGV2aWNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvZG1hLmMgYi9hcmNoL2FybS9tYWNoLWlteC9kbWEuYwppbmRleCA0Y2E1MWRjLi4zNjU3ODg3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9kbWEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9kbWEuYwpAQCAtMTUsNiArMTUsOSBAQAogICogICAgICAgICAgICAgQ2hhbmdlZCB0byBzdXBwb3J0IHNjYXR0ZXIgZ2F0aGVyIERNQQogICogICAgICAgICAgICAgYnkgdGFraW5nIFJ1c3NlbGwncyBjb2RlIGZyb20gUmlzY1BDCiAgKgorICogIDIwMDYtMDUtMzEgUGF2ZWwgUGlzYSA8cGlzYUBjbXAuZmVsay5jdnV0LmN6PgorICogICAgICAgICAgICAgQ29ycmVjdGVkIGVycm9yIGhhbmRsaW5nIGNvZGUuCisgKgogICovCiAKICN1bmRlZiBERUJVRwpAQCAtMjc3LDcgKzI4MCw3IEBACiBpbnQKIGlteF9kbWFfc2V0dXBfaGFuZGxlcnMoaW14X2RtYWNoX3QgZG1hX2NoLAogCQkgICAgICAgdm9pZCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQkgICAgICAgdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAorCQkgICAgICAgdm9pZCAoKmVycl9oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICosIGludCksCiAJCSAgICAgICB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgKmlteGRtYSA9ICZpbXhfZG1hX2NoYW5uZWxzW2RtYV9jaF07CkBAIC00NjMsNDMgKzQ2Niw1MyBAQAogCWludCBpLCBkaXNyID0gRElTUjsKIAlzdHJ1Y3QgaW14X2RtYV9jaGFubmVsICpjaGFubmVsOwogCXVuc2lnbmVkIGludCBlcnJfbWFzayA9IERCVE9TUiB8IERSVE9TUiB8IERTRVNSIHwgREJPU1I7CisJaW50IGVycmNvZGU7CiAKLQlESVNSID0gZGlzcjsKKwlESVNSID0gZGlzciAmIGVycl9tYXNrOwogCWZvciAoaSA9IDA7IGkgPCBJTVhfRE1BX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYoIShlcnJfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOwogCQljaGFubmVsID0gJmlteF9kbWFfY2hhbm5lbHNbaV07CisJCWVycmNvZGUgPSAwOwogCi0JCWlmICgoZXJyX21hc2sgJiAxIDw8IGkpICYmIGNoYW5uZWwtPm5hbWUKLQkJICAgICYmIGNoYW5uZWwtPmVycl9oYW5kbGVyKSB7Ci0JCQljaGFubmVsLT5lcnJfaGFuZGxlcihpLCBjaGFubmVsLT5kYXRhLCByZWdzKTsKKwkJaWYgKERCVE9TUiAmICgxIDw8IGkpKSB7CisJCQlEQlRPU1IgPSAoMSA8PCBpKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfQlVSU1Q7CisJCX0KKwkJaWYgKERSVE9TUiAmICgxIDw8IGkpKSB7CisJCQlEUlRPU1IgPSAoMSA8PCBpKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfUkVRVUVTVDsKKwkJfQorCQlpZiAoRFNFU1IgJiAoMSA8PCBpKSkgeworCQkJRFNFU1IgPSAoMSA8PCBpKTsKKwkJCWVycmNvZGUgfD0gSU1YX0RNQV9FUlJfVFJBTlNGRVI7CisJCX0KKwkJaWYgKERCT1NSICYgKDEgPDwgaSkpIHsKKwkJCURCT1NSID0gKDEgPDwgaSk7CisJCQllcnJjb2RlIHw9IElNWF9ETUFfRVJSX0JVRkZFUjsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBjbGVhbmluZyBvZiBAc2cgZmllbGQgd291bGQgYmUgcXVlc3Rpb25hYmxlCisJCSAqIHRoZXJlLCBiZWNhdXNlIGl0cyB2YWx1ZSBjYW4gaGVscCB0byBjb21wdXRlCisJCSAqIHJlbWFpbmluZy90cmFuc2ZlcmVkIGJ5dGVzIGNvdW50IGluIHRoZSBoYW5kbGVyCisJCSAqLworCQkvKmlteF9kbWFfY2hhbm5lbHNbaV0uc2cgPSBOVUxMOyovCisKKwkJaWYgKGNoYW5uZWwtPm5hbWUgJiYgY2hhbm5lbC0+ZXJyX2hhbmRsZXIpIHsKKwkJCWNoYW5uZWwtPmVycl9oYW5kbGVyKGksIGNoYW5uZWwtPmRhdGEsIHJlZ3MsIGVycmNvZGUpOwogCQkJY29udGludWU7CiAJCX0KIAogCQlpbXhfZG1hX2NoYW5uZWxzW2ldLnNnID0gTlVMTDsKIAotCQlpZiAoREJUT1NSICYgKDEgPDwgaSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiQnVyc3QgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCi0JCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7Ci0JCQlEQlRPU1IgfD0gKDEgPDwgaSk7Ci0JCX0KLQkJaWYgKERSVE9TUiAmICgxIDw8IGkpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgIlJlcXVlc3QgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCi0JCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7Ci0JCQlEUlRPU1IgfD0gKDEgPDwgaSk7Ci0JCX0KLQkJaWYgKERTRVNSICYgKDEgPDwgaSkpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiVHJhbnNmZXIgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCi0JCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7Ci0JCQlEU0VTUiB8PSAoMSA8PCBpKTsKLQkJfQotCQlpZiAoREJPU1IgJiAoMSA8PCBpKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJICAgICAgICJCdWZmZXIgb3ZlcmZsb3cgdGltZW91dCBvbiBjaGFubmVsICVkICglcylcbiIsCi0JCQkgICAgICAgaSwgY2hhbm5lbC0+bmFtZSk7Ci0JCQlEQk9TUiB8PSAoMSA8PCBpKTsKLQkJfQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiRE1BIHRpbWVvdXQgb24gY2hhbm5lbCAlZCAoJXMpIC0lcyVzJXMlc1xuIiwKKwkJICAgICAgIGksIGNoYW5uZWwtPm5hbWUsCisJCSAgICAgICBlcnJjb2RlJklNWF9ETUFfRVJSX0JVUlNUPyAgICAiIGJ1cnN0IjoiIiwKKwkJICAgICAgIGVycmNvZGUmSU1YX0RNQV9FUlJfUkVRVUVTVD8gICIgcmVxdWVzdCI6IiIsCisJCSAgICAgICBlcnJjb2RlJklNWF9ETUFfRVJSX1RSQU5TRkVSPyAiIHRyYW5zZmVyIjoiIiwKKwkJICAgICAgIGVycmNvZGUmSU1YX0RNQV9FUlJfQlVGRkVSPyAgICIgYnVmZmVyIjoiIik7CiAJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIwMDAvY29yZS5jCmluZGV4IDZlOGQ1MDQuLmViZTQzOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2NvcmUuYwpAQCAtMjExLDcgKzIxMSw4IEBACiAJLyogY2xlYXIgdGltZXIgMSAqLwogCWl4cDIwMDBfcmVnX3dyYihJWFAyMDAwX1QxX0NMUiwgMSk7CiAKLQl3aGlsZSAoKG5leHRfamlmZnlfdGltZSAtICptaXNzaW5nX2ppZmZ5X3RpbWVyX2NzcikgPiB0aWNrc19wZXJfamlmZnkpIHsKKwl3aGlsZSAoKHNpZ25lZCBsb25nKShuZXh0X2ppZmZ5X3RpbWUgLSAqbWlzc2luZ19qaWZmeV90aW1lcl9jc3IpCisJCQkJCQkJPj0gdGlja3NfcGVyX2ppZmZ5KSB7CiAJCXRpbWVyX3RpY2socmVncyk7CiAJCW5leHRfamlmZnlfdGltZSAtPSB0aWNrc19wZXJfamlmZnk7CiAJfQpAQCAtMzAxLDYgKzMwMiw3IEBACiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woZ3Bpb19saW5lX2NvbmZpZyk7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9jb3JlLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvY29yZS5jCmluZGV4IGFmZmQxZDUuLjA1MWUzZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2NvcmUuYwpAQCAtMzM0LDcgKzMzNCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogVGltZXItdGljayBmdW5jdGlvbnMgZm9yIElYUDIzeHgKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBDTE9DS19USUNLU19QRVJfVVNFQwlDTE9DS19USUNLX1JBVEUgLyAoVVNFQ19QRVJfU0VDKQorI2RlZmluZSBDTE9DS19USUNLU19QRVJfVVNFQwkoQ0xPQ0tfVElDS19SQVRFIC8gVVNFQ19QRVJfU0VDKQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBuZXh0X2ppZmZ5X3RpbWU7CiAKQEAgLTM1Myw3ICszNTMsNyBAQAogewogCS8qIENsZWFyIFBlbmRpbmcgSW50ZXJydXB0IGJ5IHdyaXRpbmcgJzEnIHRvIGl0ICovCiAJKklYUDIzWFhfVElNRVJfU1RBVFVTID0gSVhQMjNYWF9USU1FUjFfSU5UX1BFTkQ7Ci0Jd2hpbGUgKCgqSVhQMjNYWF9USU1FUl9DT05UIC0gbmV4dF9qaWZmeV90aW1lKSA+IExBVENIKSB7CisJd2hpbGUgKChzaWduZWQgbG9uZykoKklYUDIzWFhfVElNRVJfQ09OVCAtIG5leHRfamlmZnlfdGltZSkgPj0gTEFUQ0gpIHsKIAkJdGltZXJfdGljayhyZWdzKTsKIAkJbmV4dF9qaWZmeV90aW1lICs9IExBVENIOwogCX0KQEAgLTQzOSw1ICs0MzksNiBAQAogCiB2b2lkIF9faW5pdCBpeHAyM3h4X3N5c19pbml0KHZvaWQpCiB7CisJKklYUDIzWFhfRVhQX1VOSVRfRlVTRSB8PSAweGY7CiAJcGxhdGZvcm1fYWRkX2RldmljZXMoaXhwMjN4eF9kZXZpY2VzLCBBUlJBWV9TSVpFKGl4cDIzeHhfZGV2aWNlcykpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2VzcHJlc3NvLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYwppbmRleCBiZjY4OGMxLi5kYzVlNDg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvZXNwcmVzc28uYwpAQCAtNTMsOSArNTMsMjkgQEAKIH07CiBzdWJzeXNfaW5pdGNhbGwoZXNwcmVzc29fcGNpX2luaXQpOwogCitzdGF0aWMgc3RydWN0IHBoeXNtYXBfZmxhc2hfZGF0YSBlc3ByZXNzb19mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBlc3ByZXNzb19mbGFzaF9yZXNvdXJjZSA9IHsKKwkuc3RhcnQJCT0gMHg5MDAwMDAwMCwKKwkuZW5kCQk9IDB4OTIwMDAwMDAsCisJLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgZXNwcmVzc29fZmxhc2ggPSB7CisJLm5hbWUJCT0gInBoeXNtYXAtZmxhc2giLAorCS5pZAkJPSAwLAorCS5kZXYJCT0geworCQkucGxhdGZvcm1fZGF0YQk9ICZlc3ByZXNzb19mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZlc3ByZXNzb19mbGFzaF9yZXNvdXJjZSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBlc3ByZXNzb19pbml0KHZvaWQpCiB7Ci0JcGh5c21hcF9jb25maWd1cmUoMHg5MDAwMDAwMCwgMHgwMjAwMDAwMCwgMiwgTlVMTCk7CisJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZlc3ByZXNzb19mbGFzaCk7CiAKIAkvKgogCSAqIE1hcmsgZmxhc2ggYXMgd3JpdGVhYmxlLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2l4ZHAyMzUxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwppbmRleCAwMDE0NmMzLi41MzViMzM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwpAQCAtMjk4LDkgKzI5OCwyOSBAQAogCWlvdGFibGVfaW5pdChpeGRwMjM1MV9pb19kZXNjLCBBUlJBWV9TSVpFKGl4ZHAyMzUxX2lvX2Rlc2MpKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgaXhkcDIzNTFfZmxhc2hfZGF0YSA9IHsKKwkud2lkdGgJCT0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaXhkcDIzNTFfZmxhc2hfcmVzb3VyY2UgPSB7CisJLnN0YXJ0CQk9IDB4OTAwMDAwMDAsCisJLmVuZAkJPSAweDk0MDAwMDAwLAorCS5mbGFncwkJPSBJT1JFU09VUkNFX01FTSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGl4ZHAyMzUxX2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmaXhkcDIzNTFfZmxhc2hfZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gMSwKKwkucmVzb3VyY2UJPSAmaXhkcDIzNTFfZmxhc2hfcmVzb3VyY2UsCit9OworCiBzdGF0aWMgdm9pZCBfX2luaXQgaXhkcDIzNTFfaW5pdCh2b2lkKQogewotCXBoeXNtYXBfY29uZmlndXJlKDB4OTAwMDAwMDAsIDB4MDQwMDAwMDAsIDEsIE5VTEwpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmaXhkcDIzNTFfZmxhc2gpOwogCiAJLyoKIAkgKiBNYXJrIGZsYXNoIGFzIHdyaXRlYWJsZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKaW5kZXggNDNjMTRlNy4uYjlmNWQxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCkBAIC0xMzcsOSArMTM3LDI5IEBACiAKIHN1YnN5c19pbml0Y2FsbChyb2FkcnVubmVyX3BjaV9pbml0KTsKIAorc3RhdGljIHN0cnVjdCBwaHlzbWFwX2ZsYXNoX2RhdGEgcm9hZHJ1bm5lcl9mbGFzaF9kYXRhID0geworCS53aWR0aAkJPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSByb2FkcnVubmVyX2ZsYXNoX3Jlc291cmNlID0geworCS5zdGFydAkJPSAweDkwMDAwMDAwLAorCS5lbmQJCT0gMHg5NDAwMDAwMCwKKwkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSByb2FkcnVubmVyX2ZsYXNoID0geworCS5uYW1lCQk9ICJwaHlzbWFwLWZsYXNoIiwKKwkuaWQJCT0gMCwKKwkuZGV2CQk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSAmcm9hZHJ1bm5lcl9mbGFzaF9kYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSAxLAorCS5yZXNvdXJjZQk9ICZyb2FkcnVubmVyX2ZsYXNoX3Jlc291cmNlLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHJvYWRydW5uZXJfaW5pdCh2b2lkKQogewotCXBoeXNtYXBfY29uZmlndXJlKDB4OTAwMDAwMDAsIDB4MDQwMDAwMDAsIDIsIE5VTEwpOworCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcm9hZHJ1bm5lcl9mbGFzaCk7CiAKIAkvKgogCSAqIE1hcmsgZmxhc2ggYXMgd3JpdGVhYmxlCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDAwYjc2MWYuLmJmMjVhNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkvKgogCSAqIENhdGNoIHVwIHdpdGggdGhlIHJlYWwgaWRlYSBvZiB0aW1lCiAJICovCi0Jd2hpbGUgKCgqSVhQNFhYX09TVFMgLSBsYXN0X2ppZmZ5X3RpbWUpID4gTEFUQ0gpIHsKKwl3aGlsZSAoKHNpZ25lZCBsb25nKSgqSVhQNFhYX09TVFMgLSBsYXN0X2ppZmZ5X3RpbWUpID49IExBVENIKSB7CiAJCXRpbWVyX3RpY2socmVncyk7CiAJCWxhc3RfamlmZnlfdGltZSArPSBMQVRDSDsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBvd2VyLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBvd2VyLmMKaW5kZXggOTlkMzMzZC4uYTM3NDVlZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wb3dlci5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcG93ZXIuYwpAQCAtMjAsMTEgKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi1leHRlcm4gdm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBuYXMxMDBkX3Jlc2V0X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBTaWduYWwgaW5pdCB0byBkbyB0aGUgY3RybGFsdGRlbCBhY3Rpb24sIHRoaXMgd2lsbCBieXBhc3MgaW5pdCBpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1zZXR1cC5jCmluZGV4IGEzYjRjNmEuLjlhMzE0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXNldHVwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMzcsNiArMzgsMzYgQEAKIAkucmVzb3VyY2UJCT0gJm5hczEwMGRfZmxhc2hfcmVzb3VyY2UsCiB9OwogCisjaWZkZWYgQ09ORklHX0xFRFNfSVhQNFhYCitzdGF0aWMgc3RydWN0IHJlc291cmNlIG5hczEwMGRfbGVkX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJCT0gIndsYW4iLCAgIC8qIGdyZWVuIGxlZCAqLworCQkuc3RhcnQJCT0gMCwKKwkJLmVuZAkJPSAwLAorCQkuZmxhZ3MJCT0gSVhQNFhYX0dQSU9fTE9XLAorCX0sCisJeworCQkubmFtZQkJPSAicmVhZHkiLCAgLyogYmx1ZSBwb3dlciBsZWQgKG9mZiBpcyBmbGFzaGluZyEpICovCisJCS5zdGFydAkJPSAxNSwKKwkJLmVuZAkJPSAxNSwKKwkJLmZsYWdzCQk9IElYUDRYWF9HUElPX0xPVywKKwl9LAorCXsKKwkJLm5hbWUJCT0gImRpc2siLCAgIC8qIHllbGxvdyBsZWQgKi8KKwkJLnN0YXJ0CQk9IDMsCisJCS5lbmQJCT0gMywKKwkJLmZsYWdzCQk9IElYUDRYWF9HUElPX0xPVywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbmFzMTAwZF9sZWRzID0geworCS5uYW1lCQkJPSAiSVhQNFhYLUdQSU8tTEVEIiwKKwkuaWQJCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobmFzMTAwZF9sZWRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJCT0gbmFzMTAwZF9sZWRfcmVzb3VyY2VzLAorfTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGl4cDR4eF9pMmNfcGlucyBuYXMxMDBkX2kyY19ncGlvX3BpbnMgPSB7CiAJLnNkYV9waW4JCT0gTkFTMTAwRF9TREFfUElOLAogCS5zY2xfcGluCQk9IE5BUzEwMERfU0NMX1BJTiwKQEAgLTk1LDcgKzEyNiw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbmFzMTAwZF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmbmFzMTAwZF9pMmNfY29udHJvbGxlciwKIAkmbmFzMTAwZF9mbGFzaCwKLQkmbmFzMTAwZF91YXJ0LAorI2lmZGVmIENPTkZJR19MRURTX0lYUDRYWAorCSZuYXMxMDBkX2xlZHMsCisjZW5kaWYKIH07CiAKIHN0YXRpYyB2b2lkIG5hczEwMGRfcG93ZXJfb2ZmKHZvaWQpCkBAIC0xMjIsNiArMTU1LDEyIEBACiAKIAlwbV9wb3dlcl9vZmYgPSBuYXMxMDBkX3Bvd2VyX29mZjsKIAorCS8qIFRoaXMgaXMgb25seSB1c2VmdWwgb24gYSBtb2RpZmllZCBtYWNoaW5lLCBidXQgaXQgaXMgdmFsdWFibGUKKwkgKiB0byBoYXZlIGl0IGZpcnN0IGluIG9yZGVyIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcywgYW5kIHNvIHRoYXQKKwkgKiBpdCBkb2VzICpub3QqIGdldCByZW1vdmVkIGlmIHBsYXRmb3JtX2FkZF9kZXZpY2VzIGZhaWxzIQorCSAqLworCSh2b2lkKXBsYXRmb3JtX2RldmljZV9yZWdpc3RlcigmbmFzMTAwZF91YXJ0KTsKKwogCXBsYXRmb3JtX2FkZF9kZXZpY2VzKG5hczEwMGRfZGV2aWNlcywgQVJSQVlfU0laRShuYXMxMDBkX2RldmljZXMpKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcG93ZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBvd2VyLmMKaW5kZXggZDgwYzM2Mi4uNmQzOGU5NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcG93ZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1wb3dlci5jCkBAIC0yMCwxMSArMjAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKLWV4dGVybiB2b2lkIGN0cmxfYWx0X2RlbCh2b2lkKTsKLQogc3RhdGljIGlycXJldHVybl90IG5zbHUyX3Bvd2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBTaWduYWwgaW5pdCB0byBkbyB0aGUgY3RybGFsdGRlbCBhY3Rpb24sIHRoaXMgd2lsbCBieXBhc3MgaW5pdCBpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXNldHVwLmMKaW5kZXggNTU0MTFmMi4uNzQ5YTMzNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9uc2x1Mi1zZXR1cC5jCkBAIC03LDYgKzcsNyBAQAogICogICAgICBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCiAgKgogICogQXV0aG9yOiBNYXJrIFJha2VzIDxtcmFrZXMgYXQgbWFjLmNvbT4KKyAqIEF1dGhvcjogUm9kIFdoaXRieSA8cm9kQHdoaXRieS5pZC5hdT4KICAqIE1haW50YWluZXJzOiBodHRwOi8vd3d3Lm5zbHUyLWxpbnV4Lm9yZy8KICAqCiAgKiBGaXhlZCBtaXNzaW5nIGluaXRfdGltZSBpbiBNQUNISU5FX1NUQVJUIGthczExIDEwLzIyLzA0CkBAIC0xNiw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaWFsXzgyNTAuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAKICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KQEAgLTQzLDYgKzQ1LDQyIEBACiAJLnNjbF9waW4JCT0gTlNMVTJfU0NMX1BJTiwKIH07CiAKKyNpZmRlZiBDT05GSUdfTEVEU19JWFA0WFgKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbnNsdTJfbGVkX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUJCT0gInJlYWR5IiwgIC8qIGdyZWVuIGxlZCAqLworCQkuc3RhcnQJCT0gTlNMVTJfTEVEX0dSTiwKKwkJLmVuZAkJPSBOU0xVMl9MRURfR1JOLAorCQkuZmxhZ3MJCT0gSVhQNFhYX0dQSU9fSElHSCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gInN0YXR1cyIsIC8qIHJlZCBsZWQgKi8KKwkJLnN0YXJ0CQk9IE5TTFUyX0xFRF9SRUQsCisJCS5lbmQJCT0gTlNMVTJfTEVEX1JFRCwKKwkJLmZsYWdzCQk9IElYUDRYWF9HUElPX0hJR0gsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJkaXNrLTEiLAorCQkuc3RhcnQJCT0gTlNMVTJfTEVEX0RJU0sxLAorCQkuZW5kCQk9IE5TTFUyX0xFRF9ESVNLMSwKKwkJLmZsYWdzCQk9IElYUDRYWF9HUElPX0xPVywKKwl9LAorCXsKKwkJLm5hbWUJCT0gImRpc2stMiIsCisJCS5zdGFydAkJPSBOU0xVMl9MRURfRElTSzIsCisJCS5lbmQJCT0gTlNMVTJfTEVEX0RJU0syLAorCQkuZmxhZ3MJCT0gSVhQNFhYX0dQSU9fTE9XLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBuc2x1Ml9sZWRzID0geworCS5uYW1lCQkJPSAiSVhQNFhYLUdQSU8tTEVEIiwKKwkuaWQJCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCQk9IEFSUkFZX1NJWkUobnNsdTJfbGVkX3Jlc291cmNlcyksCisJLnJlc291cmNlCQk9IG5zbHUyX2xlZF9yZXNvdXJjZXMsCit9OworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIG5zbHUyX2kyY19jb250cm9sbGVyID0gewogCS5uYW1lCQkJPSAiSVhQNFhYLUkyQyIsCiAJLmlkCQkJPSAwLApAQCAtMTAyLDggKzE0MCwxMCBAQAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm5zbHUyX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZuc2x1Ml9pMmNfY29udHJvbGxlciwKIAkmbnNsdTJfZmxhc2gsCi0JJm5zbHUyX3VhcnQsCiAJJm5zbHUyX2JlZXBlciwKKyNpZmRlZiBDT05GSUdfTEVEU19JWFA0WFgKKwkmbnNsdTJfbGVkcywKKyNlbmRpZgogfTsKIAogc3RhdGljIHZvaWQgbnNsdTJfcG93ZXJfb2ZmKHZvaWQpCkBAIC0xMjcsNiArMTY3LDEyIEBACiAKIAlwbV9wb3dlcl9vZmYgPSBuc2x1Ml9wb3dlcl9vZmY7CiAKKwkvKiBUaGlzIGlzIG9ubHkgdXNlZnVsIG9uIGEgbW9kaWZpZWQgbWFjaGluZSwgYnV0IGl0IGlzIHZhbHVhYmxlCisJICogdG8gaGF2ZSBpdCBmaXJzdCBpbiBvcmRlciB0byBzZWUgZGVidWcgbWVzc2FnZXMsIGFuZCBzbyB0aGF0CisJICogaXQgZG9lcyAqbm90KiBnZXQgcmVtb3ZlZCBpZiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyBmYWlscyEKKwkgKi8KKwkodm9pZClwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJm5zbHUyX3VhcnQpOworCiAJcGxhdGZvcm1fYWRkX2RldmljZXMobnNsdTJfZGV2aWNlcywgQVJSQVlfU0laRShuc2x1Ml9kZXZpY2VzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAxL2JvYXJkLWFtcy1kZWx0YS5jCmluZGV4IDYxNzhmMDQuLjczZGYzMmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvYm9hcmQtYW1zLWRlbHRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMS9ib2FyZC1hbXMtZGVsdGEuYwpAQCAtODQsNiArODQsMTUgQEAKIAl7IE9NQVBfVEFHX1VBUlQsCSZhbXNfZGVsdGFfdWFydF9jb25maWcgfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGFtc19kZWx0YV9sZWRfZGV2aWNlID0geworCS5uYW1lCT0gImFtcy1kZWx0YS1sZWQiLAorCS5pZAk9IC0xCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqYW1zX2RlbHRhX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZhbXNfZGVsdGFfbGVkX2RldmljZSwKK307CisKIHN0YXRpYyB2b2lkIF9faW5pdCBhbXNfZGVsdGFfaW5pdCh2b2lkKQogewogCWlvdGFibGVfaW5pdChhbXNfZGVsdGFfaW9fZGVzYywgQVJSQVlfU0laRShhbXNfZGVsdGFfaW9fZGVzYykpOwpAQCAtOTQsNiArMTAzLDggQEAKIAogCS8qIENsZWFyIGxhdGNoMiAoTkFORCwgTENELCBtb2RlbSBlbmFibGUpICovCiAJYW1zX2RlbHRhX2xhdGNoMl93cml0ZSh+MCwgMCk7CisKKwlwbGF0Zm9ybV9hZGRfZGV2aWNlcyhhbXNfZGVsdGFfZGV2aWNlcywgQVJSQVlfU0laRShhbXNfZGVsdGFfZGV2aWNlcykpOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgYW1zX2RlbHRhX21hcF9pbyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wbng0MDA4L2Nsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvY2xvY2suYwppbmRleCAyODViMjJmLi5mNTgyZWQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXBueDQwMDgvY2xvY2suYwpAQCAtNzY3LDYgKzc2Nyw1NCBAQAogCSZ1YXJ0Nl9jaywKIH07CiAKK3N0YXRpYyBpbnQgbG9jYWxfY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIShjbGstPmZsYWdzICYgRklYRURfUkFURSkgJiYgIWNsay0+cmF0ZSAmJiBjbGstPnNldF9yYXRlCisJICAgICYmIGNsay0+dXNlcl9yYXRlKQorCQlyZXQgPSBjbGstPnNldF9yYXRlKGNsaywgY2xrLT51c2VyX3JhdGUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGxvY2FsX2Nsa19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoIShjbGstPmZsYWdzICYgRklYRURfUkFURSkgJiYgY2xrLT5yYXRlICYmIGNsay0+c2V0X3JhdGUpCisJCWNsay0+c2V0X3JhdGUoY2xrLCAwKTsKK30KKworc3RhdGljIHZvaWQgbG9jYWxfY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsaykKK3sKKwlpZiAoY2xrLT51c2Vjb3VudCA+IDAgJiYgISgtLWNsay0+dXNlY291bnQpKSB7CisJCWxvY2FsX2Nsa19kaXNhYmxlKGNsayk7CisJCWlmIChjbGstPnBhcmVudCkKKwkJCWxvY2FsX2Nsa191bnVzZShjbGstPnBhcmVudCk7CisJfQorfQorCitzdGF0aWMgaW50IGxvY2FsX2Nsa191c2Uoc3RydWN0IGNsayAqY2xrKQoreworCWludCByZXQgPSAwOworCWlmIChjbGstPnVzZWNvdW50KysgPT0gMCkgeworCQlpZiAoY2xrLT5wYXJlbnQpCisJCQlyZXQgPSBsb2NhbF9jbGtfdXNlKGNsay0+cGFyZW50KTsKKworCQlpZiAocmV0ICE9IDApIHsKKwkJCWNsay0+dXNlY291bnQtLTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gbG9jYWxfY2xrX2VuYWJsZShjbGspOworCisJCWlmIChyZXQgIT0gMCAmJiBjbGstPnBhcmVudCkgeworCQkJbG9jYWxfY2xrX3VudXNlKGNsay0+cGFyZW50KTsKKwkJCWNsay0+dXNlY291bnQtLTsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGxvY2FsX3NldF9yYXRlKHN0cnVjdCBjbGsgKmNsaywgdTMyIHJhdGUpCiB7CiAJaW50IHJldCA9IC1FSU5WQUw7CkBAIC04NDcsMjggKzg5NSwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChjbGtfZ2V0X3JhdGUpOwogCi1zdGF0aWMgaW50IGxvY2FsX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrKQotewotCWludCByZXQgPSAwOwotCi0JaWYgKCEoY2xrLT5mbGFncyAmIEZJWEVEX1JBVEUpICYmICFjbGstPnJhdGUgJiYgY2xrLT5zZXRfcmF0ZQotCSAgICAmJiBjbGstPnVzZXJfcmF0ZSkKLQkJcmV0ID0gY2xrLT5zZXRfcmF0ZShjbGssIGNsay0+dXNlcl9yYXRlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBsb2NhbF9jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaWYgKCEoY2xrLT5mbGFncyAmIEZJWEVEX1JBVEUpICYmIGNsay0+cmF0ZSAmJiBjbGstPnNldF9yYXRlKQotCQljbGstPnNldF9yYXRlKGNsaywgMCk7Ci19Ci0KIGludCBjbGtfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaykKIHsKIAlpbnQgcmV0ID0gMDsKIAogCWNsb2NrX2xvY2soKTsKLQlyZXQgPSBsb2NhbF9jbGtfZW5hYmxlKGNsayk7CisJcmV0ID0gbG9jYWxfY2xrX3VzZShjbGspOwogCWNsb2NrX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CkBAIC04NzgsNzAgKzkxMCwxMSBAQAogdm9pZCBjbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7CiAJY2xvY2tfbG9jaygpOwotCWxvY2FsX2Nsa19kaXNhYmxlKGNsayk7Ci0JY2xvY2tfdW5sb2NrKCk7Ci19Ci0KLUVYUE9SVF9TWU1CT0woY2xrX2Rpc2FibGUpOwotCi1zdGF0aWMgdm9pZCBsb2NhbF9jbGtfdW51c2Uoc3RydWN0IGNsayAqY2xrKQotewotCWlmIChjbGstPnVzZWNvdW50ID4gMCAmJiAhKC0tY2xrLT51c2Vjb3VudCkpIHsKLQkJbG9jYWxfY2xrX2Rpc2FibGUoY2xrKTsKLQkJaWYgKGNsay0+cGFyZW50KQotCQkJbG9jYWxfY2xrX3VudXNlKGNsay0+cGFyZW50KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgbG9jYWxfY2xrX3VzZShzdHJ1Y3QgY2xrICpjbGspCi17Ci0JaW50IHJldCA9IDA7Ci0JaWYgKGNsay0+dXNlY291bnQrKyA9PSAwKSB7Ci0JCWlmIChjbGstPnBhcmVudCkKLQkJCXJldCA9IGxvY2FsX2Nsa191c2UoY2xrLT5wYXJlbnQpOwotCi0JCWlmIChyZXQgIT0gMCkgewotCQkJY2xrLT51c2Vjb3VudC0tOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCQlyZXQgPSBsb2NhbF9jbGtfZW5hYmxlKGNsayk7Ci0KLQkJaWYgKHJldCAhPSAwICYmIGNsay0+cGFyZW50KSB7Ci0JCQlsb2NhbF9jbGtfdW51c2UoY2xrLT5wYXJlbnQpOwotCQkJY2xrLT51c2Vjb3VudC0tOwotCQl9Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qIFRoZSBtYWluIHB1cnBvc2Ugb2YgY2xrX3VzZSBhbnMgY2xrX3VudXNlIGZ1bmN0aW9ucwotICogaXMgdG8gY29udHJvbCBzd2l0Y2hpbmcgMTNNSHogb3NjaWxsYXRvciBhbmQgUExMMSAoMTMnTUh6KSwKLSAqIHNvIHRoYXQgdGhleSBhcmUgZGlzYWJsZWQgd2hlbmV2ZXIgbm9uZSBvZiBQTEwyLTUgaXMgdXNpbmcgdGhlbS4KLSAqIEFsdGhvdWdoIGluIHRoZW9yeSB0aGVzZSBmdW5jdGlvbnMgc2hvdWxkIHdvcmsgd2l0aCBhbnkgY2xvY2ssCi0gKiBwbGVhc2UgdXNlIHRoZW0gb25seSBvbiBQTEwyIC0gUExMNSB0byBhdm9pZCBjb25mdXNpb24uCi0gKi8KLWludCBjbGtfdXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWNsb2NrX2xvY2soKTsKLQlyZXQgPSBsb2NhbF9jbGtfdXNlKGNsayk7Ci0JY2xvY2tfdW5sb2NrKCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woY2xrX3VzZSk7Ci0KLXZvaWQgY2xrX3VudXNlKHN0cnVjdCBjbGsgKmNsaykKLXsKLQotCWNsb2NrX2xvY2soKTsKIAlsb2NhbF9jbGtfdW51c2UoY2xrKTsKIAljbG9ja191bmxvY2soKTsKIH0KIAotRVhQT1JUX1NZTUJPTChjbGtfdW51c2UpOworRVhQT1JUX1NZTUJPTChjbGtfZGlzYWJsZSk7CiAKIGxvbmcgY2xrX3JvdW5kX3JhdGUoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCiB7CkBAIC05OTUsNyArOTY4LDcgQEAKIAkJCV9fRlVOQ1RJT05fXywgKCpjbGtwKS0+bmFtZSwgKCpjbGtwKS0+cmF0ZSk7CiAJfQogCi0JY2xrX3VzZSgmY2tfcGxsNCk7CisJbG9jYWxfY2xrX3VzZSgmY2tfcGxsNCk7CiAKIAkvKiBpZiBja18xM01IeiBpcyBub3QgdXNlZCwgZGlzYWJsZSBpdC4gKi8KIAlpZiAoY2tfMTNNSHoudXNlY291bnQgPT0gMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYyBiL2FyY2gvYXJtL21hY2gtcG54NDAwOC9zZXJpYWwuYwppbmRleCAxMDMyMjM4Li45NWExYjNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXBueDQwMDgvc2VyaWFsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1wbng0MDA4L3NlcmlhbC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9wbS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2dwaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9hcmNoL2Nsb2NrLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKaW5kZXggMGMzMzQxMy4uZjVkOWNkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL0tjb25maWcKQEAgLTgxLDYgKzgxLDEyIEBACiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0NDAKIAlzZWxlY3QgQ1BVX1MzQzI0NDIKIAorY29uZmlnIE1BQ0hfU01ESzI0MTMKKwlib29sICJTTURLMjQxMyIKKwlzZWxlY3QgQ1BVX1MzQzI0MTIKKwlzZWxlY3QgTUFDSF9TTURLCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgYXJlIHVzaW5nIGFuIFNNREsyNDEzCiAKIGNvbmZpZyBNQUNIX1ZSMTAwMAogCWJvb2wgIlRob3Jjb20gVlIxMDAwIgpAQCAtMTE0LDEzICsxMjAsMzMgQEAKIAogZW5kbWVudQogCitjb25maWcgUzNDMjQxMF9DTE9DSworCWJvb2wKKwloZWxwCisJICBDbG9jayBjb2RlIGZvciB0aGUgUzNDMjQxMCwgYW5kIHNpbWlsYXIgcHJvY2Vzc29ycworCiBjb25maWcgQ1BVX1MzQzI0MTAKIAlib29sCiAJZGVwZW5kcyBvbiBBUkNIX1MzQzI0MTAKKwlzZWxlY3QgUzNDMjQxMF9DTE9DSwogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIFMzQzI0MTAgYW5kIFMzQzI0MTBBIGZhbWlseSBmcm9tIHRoZSBTM0MyNFhYIGxpbmUKIAkgIG9mIFNhbXN1bmcgTW9iaWxlIENQVXMuCiAKKyMgaW50ZXJuYWwgbm9kZSB0byBzaWduaWZ5IGlmIHdlIGFyZSBvbmx5IGRlYWxpbmcgd2l0aCBhbiBTM0MyNDEyCisKK2NvbmZpZyBDUFVfUzNDMjQxMl9PTkxZCisJYm9vbAorCWRlcGVuZHMgb24gQVJDSF9TM0MyNDEwICYmICFDUFVfUzNDMjQwMCAmJiAhQ1BVX1MzQzI0MTAgJiYgXAorCQkgICAhQ1BVX1MzQzI0NDAgJiYgIUNQVV9TM0MyNDQyICYmIENQVV9TM0MyNDEyCisJZGVmYXVsdCB5IGlmIENQVV9TM0MyNDEyCisKK2NvbmZpZyBDUFVfUzNDMjQxMgorCWJvb2wKKwlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBTM0MyNDEyIGFuZCBTM0MyNDEzIFNvQ3MgZnJvbSB0aGUgUzNDMjRYWCBsaW5lCisKIGNvbmZpZyBDUFVfUzNDMjQ0WAogCWJvb2wKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMCAmJiAoQ1BVX1MzQzI0NDAgfHwgQ1BVX1MzQzI0NDIpCkBAIC0xMzAsNiArMTU2LDcgQEAKIGNvbmZpZyBDUFVfUzNDMjQ0MAogCWJvb2wKIAlkZXBlbmRzIG9uIEFSQ0hfUzNDMjQxMAorCXNlbGVjdCBTM0MyNDEwX0NMT0NLCiAJc2VsZWN0IENQVV9TM0MyNDRYCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgUzNDMjQ0MCBTYW1zdW5nIE1vYmlsZSBDUFUgYmFzZWQgc3lzdGVtcy4KQEAgLTEzNyw2ICsxNjQsNyBAQAogY29uZmlnIENQVV9TM0MyNDQyCiAJYm9vbAogCWRlcGVuZHMgb24gQVJDSF9TM0MyNDIwCisJc2VsZWN0IFMzQzI0MTBfQ0xPQ0sKIAlzZWxlY3QgQ1BVX1MzQzI0NFgKIAloZWxwCiAJICBTdXBwb3J0IGZvciBTM0MyNDQyIFNhbXN1bmcgTW9iaWxlIENQVSBiYXNlZCBzeXN0ZW1zLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL01ha2VmaWxlCmluZGV4IDVlMDkzNTUuLjBjNzkzODYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvTWFrZWZpbGUKQEAgLTI0LDExICsyNCwyMCBAQAogb2JqLSQoQ09ORklHX1BNKQkgICArPSBwbS5vIHNsZWVwLm8KIG9iai0kKENPTkZJR19QTV9TSU1URUMpCSAgICs9IHBtLXNpbXRlYy5vCiAKKyMgUzNDMjQxMiBzdXBwb3J0CitvYmotJChDT05GSUdfQ1BVX1MzQzI0MTIpICArPSBzM2MyNDEyLm8KK29iai0kKENPTkZJR19DUFVfUzNDMjQxMikgICs9IHMzYzI0MTItY2xvY2subworCisjCiAjIFMzQzI0NFggc3VwcG9ydAogCiBvYmotJChDT05GSUdfQ1BVX1MzQzI0NFgpICArPSBzM2MyNDR4Lm8KIG9iai0kKENPTkZJR19DUFVfUzNDMjQ0WCkgICs9IHMzYzI0NHgtaXJxLm8KIAorIyBDbG9jayBjb250cm9sCisKK29iai0kKENPTkZJR19TM0MyNDEwX0NMT0NLKSArPSBzM2MyNDEwLWNsb2NrLm8KKwogIyBTM0MyNDQwIHN1cHBvcnQKIAogb2JqLSQoQ09ORklHX0NQVV9TM0MyNDQwKSAgKz0gczNjMjQ0MC5vIHMzYzI0NDAtZHNjLm8KQEAgLTUzLDYgKzYyLDcgQEAKIG9iai0kKENPTkZJR19BUkNIX0gxOTQwKQkrPSBtYWNoLWgxOTQwLm8KIG9iai0kKENPTkZJR19NQUNIX04zMCkJCSs9IG1hY2gtbjMwLm8KIG9iai0kKENPTkZJR19BUkNIX1NNREsyNDEwKQkrPSBtYWNoLXNtZGsyNDEwLm8KK29iai0kKENPTkZJR19NQUNIX1NNREsyNDEzKQkrPSBtYWNoLXNtZGsyNDEzLm8KIG9iai0kKENPTkZJR19BUkNIX1MzQzI0NDApCSs9IG1hY2gtc21kazI0NDAubwogb2JqLSQoQ09ORklHX01BQ0hfVlIxMDAwKQkrPSBtYWNoLXZyMTAwMC5vIHVzYi1zaW10ZWMubwogb2JqLSQoQ09ORklHX01BQ0hfUlgzNzE1KQkrPSBtYWNoLXJ4MzcxNS5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCmluZGV4IDk5ZDE3NDYuLmUxM2ZiNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5jCkBAIC0zLDcgKzMsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzCiAgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CiAgKgotICogUzNDMjQxMCBDbG9jayBjb250cm9sIHN1cHBvcnQKKyAqIFMzQzI0WFggQ29yZSBjbG9jayBjb250cm9sIHN1cHBvcnQKICAqCiAgKiBCYXNlZCBvbiwgYW5kIGNvZGUgZnJvbSBsaW51eC9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jbG9jay5jCiAgKioKQEAgLTU2LDI1ICs1Niw2IEBACiAKIERFRklORV9NVVRFWChjbG9ja3NfbXV0ZXgpOwogCi0vKiBvbGQgZnVuY3Rpb25zICovCi0KLXZvaWQgaW5saW5lIHMzYzI0eHhfY2xrX2VuYWJsZSh1bnNpZ25lZCBpbnQgY2xvY2tzLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQotewotCXVuc2lnbmVkIGxvbmcgY2xrY29uOwotCi0JY2xrY29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtDT04pOwotCi0JaWYgKGVuYWJsZSkKLQkJY2xrY29uIHw9IGNsb2NrczsKLQllbHNlCi0JCWNsa2NvbiAmPSB+Y2xvY2tzOwotCi0JLyogZW5zdXJlIG5vbmUgb2YgdGhlIHNwZWNpYWwgZnVuY3Rpb24gYml0cyBzZXQgKi8KLQljbGtjb24gJj0gfihTM0MyNDEwX0NMS0NPTl9JRExFfFMzQzI0MTBfQ0xLQ09OX1BPV0VSIHwgMyk7Ci0KLQlfX3Jhd193cml0ZWwoY2xrY29uLCBTM0MyNDEwX0NMS0NPTik7Ci19Ci0KIC8qIGVuYWJsZSBhbmQgZGlzYWJsZSBjYWxscyBmb3IgdXNlIHdpdGggdGhlIGNsayBzdHJ1Y3QgKi8KIAogc3RhdGljIGludCBjbGtfbnVsbF9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQpAQCAtODIsMTIgKzYzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHMzYzI0eHhfY2xrY29uX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JczNjMjR4eF9jbGtfZW5hYmxlKGNsay0+Y3RybGJpdCwgZW5hYmxlKTsKLQlyZXR1cm4gMDsKLX0KLQogLyogQ2xvY2sgQVBJIGNhbGxzICovCiAKIHN0cnVjdCBjbGsgKmNsa19nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCkKQEAgLTE3Myw4ICsxNDgsMTEgQEAKIAlpZiAoY2xrLT5yYXRlICE9IDApCiAJCXJldHVybiBjbGstPnJhdGU7CiAKLQl3aGlsZSAoY2xrLT5wYXJlbnQgIT0gTlVMTCAmJiBjbGstPnJhdGUgPT0gMCkKLQkJY2xrID0gY2xrLT5wYXJlbnQ7CisJaWYgKGNsay0+Z2V0X3JhdGUgIT0gTlVMTCkKKwkJcmV0dXJuIChjbGstPmdldF9yYXRlKShjbGspOworCisJaWYgKGNsay0+cGFyZW50ICE9IE5VTEwpCisJCXJldHVybiBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOwogCiAJcmV0dXJuIGNsay0+cmF0ZTsKIH0KQEAgLTIzMywzMSArMjExLDkgQEAKIEVYUE9SVF9TWU1CT0woY2xrX2dldF9wYXJlbnQpOwogRVhQT1JUX1NZTUJPTChjbGtfc2V0X3BhcmVudCk7CiAKLS8qIGJhc2UgY2xvY2sgZW5hYmxlICovCi0KLXN0YXRpYyBpbnQgczNjMjR4eF91cGxsX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCi17Ci0JdW5zaWduZWQgbG9uZyBjbGtzbG93ID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtTTE9XKTsKLQl1bnNpZ25lZCBsb25nIG9yaWcgPSBjbGtzbG93OwotCi0JaWYgKGVuYWJsZSkKLQkJY2xrc2xvdyAmPSB+UzNDMjQxMF9DTEtTTE9XX1VDTEtfT0ZGOwotCWVsc2UKLQkJY2xrc2xvdyB8PSBTM0MyNDEwX0NMS1NMT1dfVUNMS19PRkY7Ci0KLQlfX3Jhd193cml0ZWwoY2xrc2xvdywgUzNDMjQxMF9DTEtTTE9XKTsKLQotCS8qIGlmIHdlIHN0YXJ0ZWQgdGhlIFVQTEwsIHRoZW4gYWxsb3cgdG8gc2V0dGxlICovCi0KLQlpZiAoZW5hYmxlICYmIChvcmlnICYgUzNDMjQxMF9DTEtTTE9XX1VDTEtfT0ZGKSkKLQkJdWRlbGF5KDIwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogYmFzZSBjbG9ja3MgKi8KIAotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3h0YWwgPSB7CitzdHJ1Y3QgY2xrIGNsa194dGFsID0gewogCS5uYW1lCQk9ICJ4dGFsIiwKIAkuaWQJCT0gLTEsCiAJLnJhdGUJCT0gMCwKQEAgLTI2NSwyMyArMjIxLDI3IEBACiAJLmN0cmxiaXQJPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VwbGwgPSB7CitzdHJ1Y3QgY2xrIGNsa19tcGxsID0geworCS5uYW1lCQk9ICJtcGxsIiwKKwkuaWQJCT0gLTEsCit9OworCitzdHJ1Y3QgY2xrIGNsa191cGxsID0gewogCS5uYW1lCQk9ICJ1cGxsIiwKIAkuaWQJCT0gLTEsCiAJLnBhcmVudAkJPSBOVUxMLAotCS5lbmFibGUJCT0gczNjMjR4eF91cGxsX2VuYWJsZSwKIAkuY3RybGJpdAk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfZiA9IHsKK3N0cnVjdCBjbGsgY2xrX2YgPSB7CiAJLm5hbWUJCT0gImZjbGsiLAogCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAwLAotCS5wYXJlbnQJCT0gTlVMTCwKKwkucGFyZW50CQk9ICZjbGtfbXBsbCwKIAkuY3RybGJpdAk9IDAsCiB9OwogCi1zdGF0aWMgc3RydWN0IGNsayBjbGtfaCA9IHsKK3N0cnVjdCBjbGsgY2xrX2ggPSB7CiAJLm5hbWUJCT0gImhjbGsiLAogCS5pZAkJPSAtMSwKIAkucmF0ZQkJPSAwLApAQCAtMjg5LDcgKzI0OSw3IEBACiAJLmN0cmxiaXQJPSAwLAogfTsKIAotc3RhdGljIHN0cnVjdCBjbGsgY2xrX3AgPSB7CitzdHJ1Y3QgY2xrIGNsa19wID0gewogCS5uYW1lCQk9ICJwY2xrIiwKIAkuaWQJCT0gLTEsCiAJLnJhdGUJCT0gMCwKQEAgLTMwOCwxNCArMjY4LDE0IEBACiAKIHN0YXRpYyBpbnQgczNjMjR4eF9kY2xrX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCiB7Ci0JdW5zaWduZWQgbG9uZyBkY2xrY29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9EQ0xLQ09OKTsKKwl1bnNpZ25lZCBsb25nIGRjbGtjb24gPSBfX3Jhd19yZWFkbChTM0MyNFhYX0RDTEtDT04pOwogCiAJaWYgKGVuYWJsZSkKIAkJZGNsa2NvbiB8PSBjbGstPmN0cmxiaXQ7CiAJZWxzZQogCQlkY2xrY29uICY9IH5jbGstPmN0cmxiaXQ7CiAKLQlfX3Jhd193cml0ZWwoZGNsa2NvbiwgUzNDMjQxMF9EQ0xLQ09OKTsKKwlfX3Jhd193cml0ZWwoZGNsa2NvbiwgUzNDMjRYWF9EQ0xLQ09OKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzM0LDcgKzI5NCw3IEBACiAKIAljbGstPnBhcmVudCA9IHBhcmVudDsKIAotCWRjbGtjb24gPSBfX3Jhd19yZWFkbChTM0MyNDEwX0RDTEtDT04pOworCWRjbGtjb24gPSBfX3Jhd19yZWFkbChTM0MyNFhYX0RDTEtDT04pOwogCiAJaWYgKGNsay0+Y3RybGJpdCA9PSBTM0MyNDEwX0RDTEtDT05fRENMSzBFTikgewogCQlpZiAodWNsaykKQEAgLTM0OCw3ICszMDgsNyBAQAogCQkJZGNsa2NvbiAmPSB+UzNDMjQxMF9EQ0xLQ09OX0RDTEsxX1VDTEs7CiAJfQogCi0JX19yYXdfd3JpdGVsKGRjbGtjb24sIFMzQzI0MTBfRENMS0NPTik7CisJX19yYXdfd3JpdGVsKGRjbGtjb24sIFMzQzI0WFhfRENMS0NPTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNiwxMDggKzM4Niw2IEBACiAJLmlkCQk9IC0xLAogfTsKIAotCi0vKiBzdGFuZGFyZCBjbG9jayBkZWZpbml0aW9ucyAqLwotCi1zdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0gewotCXsKLQkJLm5hbWUJCT0gIm5hbmQiLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19oLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9OQU5ELAotCX0sIHsKLQkJLm5hbWUJCT0gImxjZCIsCi0JCS5pZAkJPSAtMSwKLQkJLnBhcmVudAkJPSAmY2xrX2gsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0xDREMsCi0JfSwgewotCQkubmFtZQkJPSAidXNiLWhvc3QiLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19oLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VU0JILAotCX0sIHsKLQkJLm5hbWUJCT0gInVzYi1kZXZpY2UiLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19oLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VU0JELAotCX0sIHsKLQkJLm5hbWUJCT0gInRpbWVycyIsCi0JCS5pZAkJPSAtMSwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1BXTVQsCi0JfSwgewotCQkubmFtZQkJPSAic2RpIiwKLQkJLmlkCQk9IC0xLAotCQkucGFyZW50CQk9ICZjbGtfcCwKLQkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCi0JCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fU0RJLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMCwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1VBUlQwLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMSwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1VBUlQxLAotCX0sIHsKLQkJLm5hbWUJCT0gInVhcnQiLAotCQkuaWQJCT0gMiwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1VBUlQyLAotCX0sIHsKLQkJLm5hbWUJCT0gImdwaW8iLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19wLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9HUElPLAotCX0sIHsKLQkJLm5hbWUJCT0gInJ0YyIsCi0JCS5pZAkJPSAtMSwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1JUQywKLQl9LCB7Ci0JCS5uYW1lCQk9ICJhZGMiLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19wLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9BREMsCi0JfSwgewotCQkubmFtZQkJPSAiaTJjIiwKLQkJLmlkCQk9IC0xLAotCQkucGFyZW50CQk9ICZjbGtfcCwKLQkJLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCi0JCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fSUlDLAotCX0sIHsKLQkJLm5hbWUJCT0gImlpcyIsCi0JCS5pZAkJPSAtMSwKLQkJLnBhcmVudAkJPSAmY2xrX3AsCi0JCS5lbmFibGUJCT0gczNjMjR4eF9jbGtjb25fZW5hYmxlLAotCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0lJUywKLQl9LCB7Ci0JCS5uYW1lCQk9ICJzcGkiLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19wLAotCQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKLQkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9TUEksCi0JfSwgewotCQkubmFtZQkJPSAid2F0Y2hkb2ciLAotCQkuaWQJCT0gLTEsCi0JCS5wYXJlbnQJCT0gJmNsa19wLAotCQkuY3RybGJpdAk9IDAsCi0JfQotfTsKLQogLyogaW5pdGlhbGlzZSB0aGUgY2xvY2sgc3lzdGVtICovCiAKIGludCBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKHN0cnVjdCBjbGsgKmNsaykKQEAgLTUzNywxNCArMzk1LDYgQEAKIAlpZiAoY2xrLT5lbmFibGUgPT0gTlVMTCkKIAkJY2xrLT5lbmFibGUgPSBjbGtfbnVsbF9lbmFibGU7CiAKLQkvKiBpZiB0aGlzIGlzIGEgc3RhbmRhcmQgY2xvY2ssIHNldCB0aGUgdXNhZ2Ugc3RhdGUgKi8KLQotCWlmIChjbGstPmN0cmxiaXQgJiYgY2xrLT5lbmFibGUgPT0gczNjMjR4eF9jbGtjb25fZW5hYmxlKSB7Ci0JCXVuc2lnbmVkIGxvbmcgY2xrY29uID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtDT04pOwotCi0JCWNsay0+dXNhZ2UgPSAoY2xrY29uICYgY2xrLT5jdHJsYml0KSA/IDEgOiAwOwotCX0KLQogCS8qIGFkZCB0byB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY2xvY2tzICovCiAKIAltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwpAQCAtNTYxLDQ0ICs0MTEsMTggQEAKIAkJCQl1bnNpZ25lZCBsb25nIGhjbGssCiAJCQkJdW5zaWduZWQgbG9uZyBwY2xrKQogewotCXVuc2lnbmVkIGxvbmcgdXBsbGNvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfVVBMTENPTik7Ci0JdW5zaWduZWQgbG9uZyBjbGtzbG93ID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtTTE9XKTsKLQlzdHJ1Y3QgY2xrICpjbGtwID0gaW5pdF9jbG9ja3M7Ci0JaW50IHB0cjsKLQlpbnQgcmV0OwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiUzNDMjQxMCBDbG9ja3MsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CisJcHJpbnRrKEtFUk5fSU5GTyAiUzNDMjRYWCBDbG9ja3MsIChjKSAyMDA0IFNpbXRlYyBFbGVjdHJvbmljc1xuIik7CiAKIAkvKiBpbml0aWFsaXNlIHRoZSBtYWluIHN5c3RlbSBjbG9ja3MgKi8KIAogCWNsa194dGFsLnJhdGUgPSB4dGFsOwotCWNsa191cGxsLnJhdGUgPSBzM2MyNDEwX2dldF9wbGwodXBsbGNvbiwgeHRhbCk7CisJY2xrX3VwbGwucmF0ZSA9IHMzYzI0MTBfZ2V0X3BsbChfX3Jhd19yZWFkbChTM0MyNDEwX1VQTExDT04pLCB4dGFsKTsKIAorCWNsa19tcGxsLnJhdGUgPSBmY2xrOwogCWNsa19oLnJhdGUgPSBoY2xrOwogCWNsa19wLnJhdGUgPSBwY2xrOwogCWNsa19mLnJhdGUgPSBmY2xrOwogCi0JLyogV2UgbXVzdCBiZSBjYXJlZnVsIGRpc2FibGluZyB0aGUgY2xvY2tzIHdlIGFyZSBub3QgaW50ZW5kaW5nIHRvCi0JICogYmUgdXNpbmcgYXQgYm9vdCB0aW1lLCBhcyBzdWJzeXRlbXMgc3VjaCBhcyB0aGUgTENEIHdoaWNoIGRvCi0JICogdGhlaXIgb3duIERNQSByZXF1ZXN0cyB0byB0aGUgYnVzIGNhbiBjYXVzZSB0aGUgc3lzdGVtIHRvIGxvY2t1cAotCSAqIGlmIHRoZXkgd2hlcmUgaW4gdGhlIG1pZGRsZSBvZiByZXF1ZXN0aW5nIGJ1cyBhY2Nlc3MuCi0JICoKLQkgKiBEaXNhYmxpbmcgdGhlIExDRCBjbG9jayBpZiB0aGUgTENEIGlzIGFjdGl2ZSBpcyB2ZXJ5IGRhbmdlcm91cywKLQkgKiBhbmQgdGhlcmVmb3JlIHRoZSBib290bG9hZGVyIHNob3VsZCBiZSAgY2FyZWZ1bCB0byBub3QgZW5hYmxlCi0JICogdGhlIExDRCBjbG9jayBpZiBpdCBpcyBub3QgbmVlZGVkLgotCSovCi0KLQltdXRleF9sb2NrKCZjbG9ja3NfbXV0ZXgpOwotCi0JczNjMjR4eF9jbGtfZW5hYmxlKFMzQzI0MTBfQ0xLQ09OX05BTkQsIDApOwotCXMzYzI0eHhfY2xrX2VuYWJsZShTM0MyNDEwX0NMS0NPTl9VU0JILCAwKTsKLQlzM2MyNHh4X2Nsa19lbmFibGUoUzNDMjQxMF9DTEtDT05fVVNCRCwgMCk7Ci0JczNjMjR4eF9jbGtfZW5hYmxlKFMzQzI0MTBfQ0xLQ09OX0FEQywgMCk7Ci0JczNjMjR4eF9jbGtfZW5hYmxlKFMzQzI0MTBfQ0xLQ09OX0lJQywgMCk7Ci0JczNjMjR4eF9jbGtfZW5hYmxlKFMzQzI0MTBfQ0xLQ09OX1NQSSwgMCk7Ci0KLQltdXRleF91bmxvY2soJmNsb2Nrc19tdXRleCk7Ci0KIAkvKiBhc3N1bWUgdWFydCBjbG9ja3MgYXJlIGNvcnJlY3RseSBzZXR1cCAqLwogCiAJLyogcmVnaXN0ZXIgb3VyIGNsb2NrcyAqLwpAQCAtNjA2LDYgKzQzMCw5IEBACiAJaWYgKHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soJmNsa194dGFsKSA8IDApCiAJCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIHJlZ2lzdGVyIG1hc3RlciB4dGFsXG4iKTsKIAorCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfbXBsbCkgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBtcGxsIGNsb2NrXG4iKTsKKwogCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfdXBsbCkgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciB1cGxsIGNsb2NrXG4iKTsKIApAQCAtNjE4LDI3ICs0NDUsNSBAQAogCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfcCkgPCAwKQogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciBjcHUgcGNsa1xuIik7CiAKLQotCWlmIChzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKCZjbGtfdXNiX2J1cykgPCAwKQotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byByZWdpc3RlciB1c2IgYnVzIGNsb2NrXG4iKTsKLQotCS8qIHJlZ2lzdGVyIGNsb2NrcyBmcm9tIGNsb2NrIGFycmF5ICovCi0KLQlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoaW5pdF9jbG9ja3MpOyBwdHIrKywgY2xrcCsrKSB7Ci0JCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soY2xrcCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjbG9jayAlcyAoJWQpXG4iLAotCQkJICAgICAgIGNsa3AtPm5hbWUsIHJldCk7Ci0JCX0KLQl9Ci0KLQkvKiBzaG93IHRoZSBjbG9jay1zbG93IHZhbHVlICovCi0KLQlwcmludGsoIkNMT0NLOiBTbG93IG1vZGUgKCVsZC4lbGQgTUh6KSwgJXMsIE1QTEwgJXMsIFVQTEwgJXNcbiIsCi0JICAgICAgIHByaW50X21oeih4dGFsIC8gKCAyICogUzNDMjQxMF9DTEtTTE9XX0dFVF9TTE9XVkFMKGNsa3Nsb3cpKSksCi0JICAgICAgIChjbGtzbG93ICYgUzNDMjQxMF9DTEtTTE9XX1NMT1cpID8gInNsb3ciIDogImZhc3QiLAotCSAgICAgICAoY2xrc2xvdyAmIFMzQzI0MTBfQ0xLU0xPV19NUExMX09GRikgPyAib2ZmIiA6ICJvbiIsCi0JICAgICAgIChjbGtzbG93ICYgUzNDMjQxMF9DTEtTTE9XX1VDTEtfT0ZGKSA/ICJvZmYiIDogIm9uIik7Ci0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jbG9jay5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmgKaW5kZXggMDFiYjQ1OC4uN2YwZWEwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2Nsb2NrLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogCWludAkJICAgICgqZW5hYmxlKShzdHJ1Y3QgY2xrICosIGludCBlbmFibGUpOwogCWludAkJICAgICgqc2V0X3JhdGUpKHN0cnVjdCBjbGsgKmMsIHVuc2lnbmVkIGxvbmcgcmF0ZSk7CisJdW5zaWduZWQgbG9uZwkgICAgKCpnZXRfcmF0ZSkoc3RydWN0IGNsayAqYyk7CiAJdW5zaWduZWQgbG9uZwkgICAgKCpyb3VuZF9yYXRlKShzdHJ1Y3QgY2xrICpjLCB1bnNpZ25lZCBsb25nIHJhdGUpOwogCWludAkJICAgICgqc2V0X3BhcmVudCkoc3RydWN0IGNsayAqYywgc3RydWN0IGNsayAqcGFyZW50KTsKIH07CkBAIC0zNiw2ICszNywxNSBAQAogCiBleHRlcm4gc3RydWN0IGNsayBjbGtfdXNiX2J1czsKIAorLyogY29yZSBjbG9jayBzdXBwb3J0ICovCisKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19mOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX2g7CitleHRlcm4gc3RydWN0IGNsayBjbGtfcDsKK2V4dGVybiBzdHJ1Y3QgY2xrIGNsa19tcGxsOworZXh0ZXJuIHN0cnVjdCBjbGsgY2xrX3VwbGw7CitleHRlcm4gc3RydWN0IGNsayBjbGtfeHRhbDsKKwogLyogZXhwb3J0cyBmb3IgYXJjaC9hcm0vbWFjaC1zM2MyNDEwCiAgKgogICogUGxlYXNlIERPIE5PVCB1c2UgdGhlc2Ugb3V0c2lkZSBvZiBhcmNoL2FybS9tYWNoLXMzYzI0MTAKQEAgLTQzLDcgKzUzLDggQEAKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCBjbG9ja3NfbXV0ZXg7CiAKLWV4dGVybiBpbnQgczNjMjR4eF9jbGtjb25fZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSk7CitleHRlcm4gaW50IHMzYzI0MTBfY2xrY29uX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpOworCiBleHRlcm4gaW50IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soc3RydWN0IGNsayAqY2xrKTsKIAogZXh0ZXJuIGludCBzM2MyNHh4X3NldHVwX2Nsb2Nrcyh1bnNpZ25lZCBsb25nIHh0YWwsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmMKaW5kZXggNTI4NDJlNi4uMWMzYzZhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgImNsb2NrLmgiCiAjaW5jbHVkZSAiczNjMjQwMC5oIgogI2luY2x1ZGUgInMzYzI0MTAuaCIKKyNpbmNsdWRlICJzM2MyNDEyLmgiCiAjaW5jbHVkZSAiczNjMjQ0eC5oIgogI2luY2x1ZGUgInMzYzI0NDAuaCIKICNpbmNsdWRlICJzM2MyNDQyLmgiCkBAIC02Miw2ICs2Myw3IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQwMFtdICA9ICJTM0MyNDAwIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMFtdICA9ICJTM0MyNDEwIjsKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMltdICA9ICJTM0MyNDEyIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MFtdICA9ICJTM0MyNDQwIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQ0MltdICA9ICJTM0MyNDQyIjsKIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVfczNjMjQxMGFbXSA9ICJTM0MyNDEwQSI7CkBAIC0xMTQsNiArMTE2LDE1IEBACiAJCS5uYW1lCQk9IG5hbWVfczNjMjQ0MgogCX0sCiAJeworCQkuaWRjb2RlCQk9IDB4MzI0MTIwMDEsCisJCS5pZG1hc2sJCT0gMHhmZmZmZmZmZiwKKwkJLm1hcF9pbwkJPSBzM2MyNDEyX21hcF9pbywKKwkJLmluaXRfY2xvY2tzCT0gczNjMjQxMl9pbml0X2Nsb2NrcywKKwkJLmluaXRfdWFydHMJPSBzM2MyNDEyX2luaXRfdWFydHMsCisJCS5pbml0CQk9IHMzYzI0MTJfaW5pdCwKKwkJLm5hbWUJCT0gbmFtZV9zM2MyNDEyLAorCX0sCisJewogCQkuaWRjb2RlCQk9IDB4MCwgICAvKiBTM0MyNDAwIGRvZXNuJ3QgaGF2ZSBhbiBpZGNvZGUgKi8KIAkJLmlkbWFzawkJPSAweGZmZmZmZmZmLAogCQkubWFwX2lvCQk9IHMzYzI0MDBfbWFwX2lvLApAQCAtMTcxLDYgKzE4MiwyNCBAQAogCiBzdGF0aWMgc3RydWN0IGNwdV90YWJsZSAqY3B1OwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y1KHZvaWQpCit7CisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEzKQorCXJldHVybiBfX3Jhd19yZWFkbChTM0MyNDEyX0dTVEFUVVMxKTsKKyNlbHNlCisJcmV0dXJuIDFVTDsJLyogZG9uJ3QgbG9vayBsaWtlIGFuIDI0MDAgKi8KKyNlbmRpZgorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y0KHZvaWQpCit7CisjaWZuZGVmIENPTkZJR19DUFVfUzNDMjQwMAorCXJldHVybiBfX3Jhd19yZWFkbChTM0MyNDEwX0dTVEFUVVMxKTsKKyNlbHNlCisJcmV0dXJuIDBVTDsKKyNlbmRpZgorfQorCiB2b2lkIF9faW5pdCBzM2MyNHh4X2luaXRfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgaWRjb2RlID0gMHgwOwpAQCAtMTc4LDkgKzIwNywxMSBAQAogCS8qIGluaXRpYWxpc2UgdGhlIGlvIGRlc2NyaXB0b3JzIHdlIG5lZWQgZm9yIGluaXRpYWxpc2F0aW9uICovCiAJaW90YWJsZV9pbml0KHMzY19pb2Rlc2MsIEFSUkFZX1NJWkUoczNjX2lvZGVzYykpOwogCi0jaWZuZGVmIENPTkZJR19DUFVfUzNDMjQwMAotCWlkY29kZSA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfR1NUQVRVUzEpOwotI2VuZGlmCisJaWYgKGNwdV9hcmNoaXRlY3R1cmUoKSA+PSBDUFVfQVJDSF9BUk12NSkgeworCQlpZGNvZGUgPSBzM2MyNHh4X3JlYWRfaWRjb2RlX3Y1KCk7CisJfSBlbHNlIHsKKwkJaWRjb2RlID0gczNjMjR4eF9yZWFkX2lkY29kZV92NCgpOworCX0KIAogCWNwdSA9IHMzY19sb29rdXBfY3B1KGlkY29kZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuaCBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9jcHUuaAppbmRleCA0MDg2Mjg5Li5iMGVkOWQyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY3B1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2NwdS5oCkBAIC03Myw1ICs3Myw3IEBACiAKIC8qIHN5c3RlbSBkZXZpY2UgY2xhc3NlcyAqLwogCitleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBzM2MyNDEwX3N5c2NsYXNzOworZXh0ZXJuIHN0cnVjdCBzeXNkZXZfY2xhc3MgczNjMjQxMl9zeXNjbGFzczsKIGV4dGVybiBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHMzYzI0NDBfc3lzY2xhc3M7CiBleHRlcm4gc3RydWN0IHN5c2Rldl9jbGFzcyBzM2MyNDQyX3N5c2NsYXNzOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL2lycS5jCmluZGV4IDY2ZDhjMDYuLjY4MjJkYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9pcnEuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvaXJxLmMKQEAgLTE5MSwxMyArMTkxLDkgQEAKIAkuYWNrCSAgID0gczNjX2lycV9hY2ssCiAJLm1hc2sJICAgPSBzM2NfaXJxX21hc2ssCiAJLnVubWFzawkgICA9IHMzY19pcnFfdW5tYXNrLAotCS5zZXRfd2FrZQkgICA9IHMzY19pcnFfd2FrZQorCS5zZXRfd2FrZSAgPSBzM2NfaXJxX3dha2UKIH07CiAKLS8qIFMzQzI0MTBfRUlOVE1BU0sKLSAqIFMzQzI0MTBfRUlOVFBFTkQKLSAqLwotCiBzdGF0aWMgdm9pZAogczNjX2lycWV4dF9tYXNrKHVuc2lnbmVkIGludCBpcnFubykKIHsKQEAgLTIwNSw5ICsyMDEsOSBAQAogCiAJaXJxbm8gLT0gRVhUSU5UX09GRjsKIAotCW1hc2sgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0VJTlRNQVNLKTsKKwltYXNrID0gX19yYXdfcmVhZGwoUzNDMjRYWF9FSU5UTUFTSyk7CiAJbWFzayB8PSAoIDFVTCA8PCBpcnFubyk7Ci0JX19yYXdfd3JpdGVsKG1hc2ssIFMzQzI0MTBfRUlOVE1BU0spOworCV9fcmF3X3dyaXRlbChtYXNrLCBTM0MyNFhYX0VJTlRNQVNLKTsKIAogCWlmIChpcnFubyA8PSAoSVJRX0VJTlQ3IC0gRVhUSU5UX09GRikpIHsKIAkJLyogY2hlY2sgdG8gc2VlIGlmIGFsbCBuZWVkIG1hc2tpbmcgKi8KQEAgLTIzMiwxMSArMjI4LDExIEBACiAJYml0ID0gMVVMIDw8IChpcnFubyAtIEVYVElOVF9PRkYpOwogCiAKLQltYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UTUFTSyk7CisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRUlOVE1BU0spOwogCi0JX19yYXdfd3JpdGVsKGJpdCwgUzNDMjQxMF9FSU5UUEVORCk7CisJX19yYXdfd3JpdGVsKGJpdCwgUzNDMjRYWF9FSU5UUEVORCk7CiAKLQlyZXEgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0VJTlRQRU5EKTsKKwlyZXEgPSBfX3Jhd19yZWFkbChTM0MyNFhYX0VJTlRQRU5EKTsKIAlyZXEgJj0gfm1hc2s7CiAKIAkvKiBub3Qgc3VyZSBpZiB3ZSBzaG91bGQgYmUgYWNraW5nIHRoZSBwYXJlbnQgaXJxLi4uICovCkBAIC0yNTcsOSArMjUzLDkgQEAKIAogCWlycW5vIC09IEVYVElOVF9PRkY7CiAKLQltYXNrID0gX19yYXdfcmVhZGwoUzNDMjQxMF9FSU5UTUFTSyk7CisJbWFzayA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRUlOVE1BU0spOwogCW1hc2sgJj0gfiggMVVMIDw8IGlycW5vKTsKLQlfX3Jhd193cml0ZWwobWFzaywgUzNDMjQxMF9FSU5UTUFTSyk7CisJX19yYXdfd3JpdGVsKG1hc2ssIFMzQzI0WFhfRUlOVE1BU0spOwogCiAJczNjX2lycV91bm1hc2soKGlycW5vIDw9IChJUlFfRUlOVDcgLSBFWFRJTlRfT0ZGKSkgPyBJUlFfRUlOVDR0NyA6IElSUV9FSU5UOHQyMyk7CiB9CkBAIC0yNzUsMjggKzI3MSwyOCBAQAogCWlmICgoaXJxID49IElSUV9FSU5UMCkgJiYgKGlycSA8PSBJUlFfRUlOVDMpKQogCXsKIAkJZ3Bjb25fcmVnID0gUzNDMjQxMF9HUEZDT047Ci0JCWV4dGludF9yZWcgPSBTM0MyNDEwX0VYVElOVDA7CisJCWV4dGludF9yZWcgPSBTM0MyNFhYX0VYVElOVDA7CiAJCWdwY29uX29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDApICogMjsKIAkJZXh0aW50X29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDApICogNDsKIAl9CiAJZWxzZSBpZiAoKGlycSA+PSBJUlFfRUlOVDQpICYmIChpcnEgPD0gSVJRX0VJTlQ3KSkKIAl7CiAJCWdwY29uX3JlZyA9IFMzQzI0MTBfR1BGQ09OOwotCQlleHRpbnRfcmVnID0gUzNDMjQxMF9FWFRJTlQwOworCQlleHRpbnRfcmVnID0gUzNDMjRYWF9FWFRJTlQwOwogCQlncGNvbl9vZmZzZXQgPSAoaXJxIC0gKEVYVElOVF9PRkYpKSAqIDI7CiAJCWV4dGludF9vZmZzZXQgPSAoaXJxIC0gKEVYVElOVF9PRkYpKSAqIDQ7CiAJfQogCWVsc2UgaWYgKChpcnEgPj0gSVJRX0VJTlQ4KSAmJiAoaXJxIDw9IElSUV9FSU5UMTUpKQogCXsKIAkJZ3Bjb25fcmVnID0gUzNDMjQxMF9HUEdDT047Ci0JCWV4dGludF9yZWcgPSBTM0MyNDEwX0VYVElOVDE7CisJCWV4dGludF9yZWcgPSBTM0MyNFhYX0VYVElOVDE7CiAJCWdwY29uX29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDgpICogMjsKIAkJZXh0aW50X29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDgpICogNDsKIAl9CiAJZWxzZSBpZiAoKGlycSA+PSBJUlFfRUlOVDE2KSAmJiAoaXJxIDw9IElSUV9FSU5UMjMpKQogCXsKIAkJZ3Bjb25fcmVnID0gUzNDMjQxMF9HUEdDT047Ci0JCWV4dGludF9yZWcgPSBTM0MyNDEwX0VYVElOVDI7CisJCWV4dGludF9yZWcgPSBTM0MyNFhYX0VYVElOVDI7CiAJCWdwY29uX29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDgpICogMjsKIAkJZXh0aW50X29mZnNldCA9IChpcnEgLSBJUlFfRUlOVDE2KSAqIDQ7CiAJfSBlbHNlCkBAIC01NzIsNiArNTY4LDIzIEBACiAJczNjX2lycV9kZW11eF91YXJ0KElSUV9TM0NVQVJUX1JYMiwgcmVncyk7CiB9CiAKK3N0YXRpYyB2b2lkCitzM2NfaXJxX2RlbXV4X2V4dGludCh1bnNpZ25lZCBpbnQgaXJxLAorCQkgICAgIHN0cnVjdCBpcnFkZXNjICpkZXNjLAorCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZWludHBuZCA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRUlOVFBFTkQpOworCXVuc2lnbmVkIGxvbmcgZWludG1zayA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRUlOVE1BU0spOworCisJZWludHBuZCAmPSB+ZWludG1zazsKKworCWlmIChlaW50cG5kKSB7CisJCWlycSA9IGZscyhlaW50cG5kKTsKKwkJaXJxICs9IChJUlFfRUlOVDQgLSAoNCArIDEpKTsKKworCQlkZXNjX2hhbmRsZV9pcnEoaXJxLCBpcnFfZGVzYyArIGlycSwgcmVncyk7CisJfQorfQogCiAvKiBzM2MyNHh4X2luaXRfaXJxCiAgKgpAQCAtNTkxLDEyICs2MDQsMTIgQEAKIAogCWxhc3QgPSAwOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJcGVuZCA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfRUlOVFBFTkQpOworCQlwZW5kID0gX19yYXdfcmVhZGwoUzNDMjRYWF9FSU5UUEVORCk7CiAKIAkJaWYgKHBlbmQgPT0gMCB8fCBwZW5kID09IGxhc3QpCiAJCQlicmVhazsKIAotCQlfX3Jhd193cml0ZWwocGVuZCwgUzNDMjQxMF9FSU5UUEVORCk7CisJCV9fcmF3X3dyaXRlbChwZW5kLCBTM0MyNFhYX0VJTlRQRU5EKTsKIAkJcHJpbnRrKCJpcnE6IGNsZWFyaW5nIHBlbmRpbmcgZXh0IHN0YXR1cyAlMDh4XG4iLCAoaW50KXBlbmQpOwogCQlsYXN0ID0gcGVuZDsKIAl9CkBAIC02MzAsMTIgKzY0MywxNCBAQAogCiAJaXJxZGJmKCJzM2MyNDEwX2luaXRfaXJxOiByZWdpc3RlcmluZyBzM2MyNDEwIGludGVycnVwdCBoYW5kbGVyc1xuIik7CiAKLQlmb3IgKGlycW5vID0gSVJRX0JBVFRfRkxUOyBpcnFubyA8PSBJUlFfQURDUEFSRU5UOyBpcnFubysrKSB7CisJZm9yIChpcnFubyA9IElSUV9FSU5UNHQ3OyBpcnFubyA8PSBJUlFfQURDUEFSRU5UOyBpcnFubysrKSB7CiAJCS8qIHNldCBhbGwgdGhlIHMzYzI0MTAgaW50ZXJuYWwgaXJxcyAqLwogCiAJCXN3aXRjaCAoaXJxbm8pIHsKIAkJCS8qIGRlYWwgd2l0aCB0aGUgc3BlY2lhbCBJUlFzIChjYXNjYWRlZCkgKi8KIAorCQljYXNlIElSUV9FSU5UNHQ3OgorCQljYXNlIElSUV9FSU5UOHQyMzoKIAkJY2FzZSBJUlFfVUFSVDA6CiAJCWNhc2UgSVJRX1VBUlQxOgogCQljYXNlIElSUV9VQVJUMjoKQEAgLTY1OSwxMiArNjc0LDE0IEBACiAKIAkvKiBzZXR1cCB0aGUgY2FzY2FkZSBpcnEgaGFuZGxlcnMgKi8KIAorCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9FSU5UNHQ3LCBzM2NfaXJxX2RlbXV4X2V4dGludCk7CisJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX0VJTlQ4dDIzLCBzM2NfaXJxX2RlbXV4X2V4dGludCk7CisKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfVUFSVDAsIHMzY19pcnFfZGVtdXhfdWFydDApOwogCXNldF9pcnFfY2hhaW5lZF9oYW5kbGVyKElSUV9VQVJUMSwgczNjX2lycV9kZW11eF91YXJ0MSk7CiAJc2V0X2lycV9jaGFpbmVkX2hhbmRsZXIoSVJRX1VBUlQyLCBzM2NfaXJxX2RlbXV4X3VhcnQyKTsKIAlzZXRfaXJxX2NoYWluZWRfaGFuZGxlcihJUlFfQURDUEFSRU5ULCBzM2NfaXJxX2RlbXV4X2FkYyk7CiAKLQogCS8qIGV4dGVybmFsIGludGVycnVwdHMgKi8KIAogCWZvciAoaXJxbm8gPSBJUlFfRUlOVDA7IGlycW5vIDw9IElSUV9FSU5UMzsgaXJxbm8rKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL21hY2gtc21kazI0MTMuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlZjdkMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEzLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9tYWNoLXNtZGsyNDEzLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhhbmtzIHRvIERpbWl0eSBBbmRyaWMgKFRvbVRvbSkgYW5kIFN0ZXZlbiBSeXUgKFNhbXN1bmcpIGZvciB0aGUKKyAqIGxvYW5zIG9mIFNNREsyNDEzIHRvIHdvcmsgd2l0aC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoL2lycS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2lvbWQuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKworLy8jaW5jbHVkZSA8YXNtL2RlYnVnLWxsLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1zZXJpYWwuaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWxjZC5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvaWRsZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2ZiLmg+CisKKyNpbmNsdWRlICJzM2MyNDEwLmgiCisjaW5jbHVkZSAiczNjMjQxMi5oIgorI2luY2x1ZGUgImNsb2NrLmgiCisjaW5jbHVkZSAiZGV2cy5oIgorI2luY2x1ZGUgImNwdS5oIgorCisjaW5jbHVkZSAiY29tbW9uLXNtZGsuaCIKKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBzbWRrMjQxM19pb2Rlc2NbXSBfX2luaXRkYXRhID0geworfTsKKworc3RhdGljIHN0cnVjdCBzM2MyNDEwX3VhcnRjZmcgc21kazI0MTNfdWFydGNmZ3NbXSBfX2luaXRkYXRhID0geworCVswXSA9IHsKKwkJLmh3cG9ydAkgICAgID0gMCwKKwkJLmZsYWdzCSAgICAgPSAwLAorCQkudWNvbgkgICAgID0gMHgzYzUsCisJCS51bGNvbgkgICAgID0gMHgwMywKKwkJLnVmY29uCSAgICAgPSAweDUxLAorCX0sCisJWzFdID0geworCQkuaHdwb3J0CSAgICAgPSAxLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSAweDNjNSwKKwkJLnVsY29uCSAgICAgPSAweDAzLAorCQkudWZjb24JICAgICA9IDB4NTEsCisJfSwKKwkvKiBJUiBwb3J0ICovCisJWzJdID0geworCQkuaHdwb3J0CSAgICAgPSAyLAorCQkuZmxhZ3MJICAgICA9IDAsCisJCS51Y29uCSAgICAgPSAweDNjNSwKKwkJLnVsY29uCSAgICAgPSAweDQzLAorCQkudWZjb24JICAgICA9IDB4NTEsCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNtZGsyNDEzX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZzM2NfZGV2aWNlX3VzYiwKKwkvLyZzM2NfZGV2aWNlX2xjZCwKKwkmczNjX2RldmljZV93ZHQsCisJJnMzY19kZXZpY2VfaTJjLAorCSZzM2NfZGV2aWNlX2lpcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF9ib2FyZCBzbWRrMjQxM19ib2FyZCBfX2luaXRkYXRhID0geworCS5kZXZpY2VzICAgICAgID0gc21kazI0MTNfZGV2aWNlcywKKwkuZGV2aWNlc19jb3VudCA9IEFSUkFZX1NJWkUoc21kazI0MTNfZGV2aWNlcykKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzbWRrMjQxM19maXh1cChzdHJ1Y3QgbWFjaGluZV9kZXNjICpkZXNjLAorCQkJCSAgc3RydWN0IHRhZyAqdGFncywgY2hhciAqKmNtZGxpbmUsCisJCQkJICBzdHJ1Y3QgbWVtaW5mbyAqbWkpCit7CisJaWYgKHRhZ3MgIT0gcGh5c190b192aXJ0KFMzQzI0MTBfU0RSQU1fUEEgKyAweDEwMCkpIHsKKwkJbWktPm5yX2JhbmtzPTE7CisJCW1pLT5iYW5rWzBdLnN0YXJ0ID0gMHgzMDAwMDAwMDsKKwkJbWktPmJhbmtbMF0uc2l6ZSA9IFNaXzY0TTsKKwkJbWktPmJhbmtbMF0ubm9kZSA9IDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21kazI0MTNfbWFwX2lvKHZvaWQpCit7CisJczNjMjR4eF9pbml0X2lvKHNtZGsyNDEzX2lvZGVzYywgQVJSQVlfU0laRShzbWRrMjQxM19pb2Rlc2MpKTsKKwlzM2MyNHh4X2luaXRfY2xvY2tzKDEyMDAwMDAwKTsKKwlzM2MyNHh4X2luaXRfdWFydHMoc21kazI0MTNfdWFydGNmZ3MsIEFSUkFZX1NJWkUoc21kazI0MTNfdWFydGNmZ3MpKTsKKwlzM2MyNHh4X3NldF9ib2FyZCgmc21kazI0MTNfYm9hcmQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc21kazI0MTNfbWFjaGluZV9pbml0KHZvaWQpCit7CisJc21ka19tYWNoaW5lX2luaXQoKTsKK30KKworTUFDSElORV9TVEFSVChTM0MyNDEzLCAiU01ESzI0MTMiKQorCS8qIE1haW50YWluZXI6IEJlbiBEb29rcyA8YmVuQGZsdWZmLm9yZz4gKi8KKwkucGh5c19pbwk9IFMzQzI0MTBfUEFfVUFSVCwKKwkuaW9fcGdfb2Zmc3QJPSAoKCh1MzIpUzNDMjRYWF9WQV9VQVJUKSA+PiAxOCkgJiAweGZmZmMsCisJLmJvb3RfcGFyYW1zCT0gUzNDMjQxMF9TRFJBTV9QQSArIDB4MTAwLAorCisJLmZpeHVwCQk9IHNtZGsyNDEzX2ZpeHVwLAorCS5pbml0X2lycQk9IHMzYzI0eHhfaW5pdF9pcnEsCisJLm1hcF9pbwkJPSBzbWRrMjQxM19tYXBfaW8sCisJLmluaXRfbWFjaGluZQk9IHNtZGsyNDEzX21hY2hpbmVfaW5pdCwKKwkudGltZXIJCT0gJnMzYzI0eHhfdGltZXIsCitNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3BtLXNpbXRlYy5jCmluZGV4IDRjN2NjZWYuLjdiMjQ0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9wbS1zaW10ZWMuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvcG0tc2ltdGVjLmMKQEAgLTQ4LDcgKzQ4LDggQEAKIAogCS8qIGNoZWNrIHdoaWNoIG1hY2hpbmUgd2UgYXJlIHJ1bm5pbmcgb24gKi8KIAotCWlmICghbWFjaGluZV9pc19iYXN0KCkgJiYgIW1hY2hpbmVfaXNfdnIxMDAwKCkgJiYgIW1hY2hpbmVfaXNfYW51YmlzKCkpCisJaWYgKCFtYWNoaW5lX2lzX2Jhc3QoKSAmJiAhbWFjaGluZV9pc192cjEwMDAoKSAmJgorCSAgICAhbWFjaGluZV9pc19hbnViaXMoKSAmJiAhbWFjaGluZV9pc19vc2lyaXMoKSkKIAkJcmV0dXJuIDA7CiAKIAlwcmludGsoS0VSTl9JTkZPICJTaW10ZWMgQm9hcmQgUG93ZXIgTWFuYW5nZW1lbnQiIENPUFlSSUdIVCAiXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLWNsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1jbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzE4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1jbG9jay5jCkBAIC0wLDAgKzEsMjcxIEBACisvKiBsaW51eC9hcmNoL2FybS9tYWNoLXMzYzI0MTAvY2xvY2suYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBTM0MyNDEwLFMzQzI0NDAsUzNDMjQ0MiBDbG9jayBjb250cm9sIHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1jbG9jay5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJjcHUuaCIKKworaW50IHMzYzI0MTBfY2xrY29uX2VuYWJsZShzdHJ1Y3QgY2xrICpjbGssIGludCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IGNsb2NrcyA9IGNsay0+Y3RybGJpdDsKKwl1bnNpZ25lZCBsb25nIGNsa2NvbjsKKworCWNsa2NvbiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLQ09OKTsKKworCWlmIChlbmFibGUpCisJCWNsa2NvbiB8PSBjbG9ja3M7CisJZWxzZQorCQljbGtjb24gJj0gfmNsb2NrczsKKworCS8qIGVuc3VyZSBub25lIG9mIHRoZSBzcGVjaWFsIGZ1bmN0aW9uIGJpdHMgc2V0ICovCisJY2xrY29uICY9IH4oUzNDMjQxMF9DTEtDT05fSURMRXxTM0MyNDEwX0NMS0NPTl9QT1dFUik7CisKKwlfX3Jhd193cml0ZWwoY2xrY29uLCBTM0MyNDEwX0NMS0NPTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEwX3VwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNsa3Nsb3cgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS1NMT1cpOworCXVuc2lnbmVkIGxvbmcgb3JpZyA9IGNsa3Nsb3c7CisKKwlpZiAoZW5hYmxlKQorCQljbGtzbG93ICY9IH5TM0MyNDEwX0NMS1NMT1dfVUNMS19PRkY7CisJZWxzZQorCQljbGtzbG93IHw9IFMzQzI0MTBfQ0xLU0xPV19VQ0xLX09GRjsKKworCV9fcmF3X3dyaXRlbChjbGtzbG93LCBTM0MyNDEwX0NMS1NMT1cpOworCisJLyogaWYgd2Ugc3RhcnRlZCB0aGUgVVBMTCwgdGhlbiBhbGxvdyB0byBzZXR0bGUgKi8KKworCWlmIChlbmFibGUgJiYgKG9yaWcgJiBTM0MyNDEwX0NMS1NMT1dfVUNMS19PRkYpKQorCQl1ZGVsYXkoMjAwKTsKKworCXJldHVybiAwOworfQorCisvKiBzdGFuZGFyZCBjbG9jayBkZWZpbml0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc19kaXNhYmxlW10gPSB7CisJeworCQkubmFtZQkJPSAibmFuZCIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX05BTkQsCisJfSwgeworCQkubmFtZQkJPSAic2RpIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fU0RJLAorCX0sIHsKKwkJLm5hbWUJCT0gImFkYyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0FEQywKKwl9LCB7CisJCS5uYW1lCQk9ICJpMmMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9JSUMsCisJfSwgeworCQkubmFtZQkJPSAiaWlzIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fSUlTLAorCX0sIHsKKwkJLm5hbWUJCT0gInNwaSIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1NQSSwKKwl9Cit9OworCitzdGF0aWMgc3RydWN0IGNsayBpbml0X2Nsb2Nrc1tdID0geworCXsKKwkJLm5hbWUJCT0gImxjZCIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0xDREMsCisJfSwgeworCQkubmFtZQkJPSAiZ3BpbyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX0dQSU8sCisJfSwgeworCQkubmFtZQkJPSAidXNiLWhvc3QiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VU0JILAorCX0sIHsKKwkJLm5hbWUJCT0gInVzYi1kZXZpY2UiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEwX0NMS0NPTl9VU0JELAorCX0sIHsKKwkJLm5hbWUJCT0gInRpbWVycyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMF9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTBfQ0xLQ09OX1BXTVQsCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5pZAkJPSAwLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVUFSVDAsCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5pZAkJPSAxLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVUFSVDEsCisJfSwgeworCQkubmFtZQkJPSAidWFydCIsCisJCS5pZAkJPSAyLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fVUFSVDIsCisJfSwgeworCQkubmFtZQkJPSAicnRjIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMF9DTEtDT05fUlRDLAorCX0sIHsKKwkJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmN0cmxiaXQJPSAwLAorCX0sIHsKKwkJLm5hbWUJCT0gInVzYi1idXMtaG9zdCIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3VzYl9idXMsCisJfSwgeworCQkubmFtZQkJPSAidXNiLWJ1cy1nYWRnZXQiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa191c2JfYnVzLAorCX0sCit9OworCisvKiBzM2MyNDEwX2Jhc2VjbGtfYWRkKCkKKyAqCisgKiBBZGQgYWxsIHRoZSBjbG9ja3MgdXNlZCBieSB0aGUgczNjMjQxMCBvciBjb21wYXRpYmxlIENQVXMKKyAqIHN1Y2ggYXMgdGhlIFMzQzI0NDAgYW5kIFMzQzI0NDIuCisgKgorICogV2UgY2Fubm90IHVzZSBhIHN5c3RlbSBkZXZpY2UgYXMgd2UgYXJlIG5lZWRlZCBiZWZvcmUgYW55CisgKiBvZiB0aGUgaW5pdC1jYWxscyB0aGF0IGluaXRpYWxpc2UgdGhlIGRldmljZXMgYXJlIGFjdHVhbGx5CisgKiBkb25lLgorKi8KKworaW50IF9faW5pdCBzM2MyNDEwX2Jhc2VjbGtfYWRkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtzbG93ID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtTTE9XKTsKKwl1bnNpZ25lZCBsb25nIGNsa2NvbiAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0NPTik7CisJc3RydWN0IGNsayAqY2xrcDsKKwlzdHJ1Y3QgY2xrICp4dGFsOworCWludCByZXQ7CisJaW50IHB0cjsKKworCWNsa191cGxsLmVuYWJsZSA9IHMzYzI0MTBfdXBsbF9lbmFibGU7CisKKwlpZiAoczNjMjR4eF9yZWdpc3Rlcl9jbG9jaygmY2xrX3VzYl9idXMpIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gcmVnaXN0ZXIgdXNiIGJ1cyBjbG9ja1xuIik7CisKKwkvKiByZWdpc3RlciBjbG9ja3MgZnJvbSBjbG9jayBhcnJheSAqLworCisJY2xrcCA9IGluaXRfY2xvY2tzOworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShpbml0X2Nsb2Nrcyk7IHB0cisrLCBjbGtwKyspIHsKKwkJLyogZW5zdXJlIHRoYXQgd2Ugbm90ZSB0aGUgY2xvY2sgc3RhdGUgKi8KKworCQljbGtwLT51c2FnZSA9IGNsa2NvbiAmIGNsa3AtPmN0cmxiaXQgPyAxIDogMDsKKworCQlyZXQgPSBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKGNsa3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjbGtwLT5uYW1lLCByZXQpOworCQl9CisJfQorCisJLyogV2UgbXVzdCBiZSBjYXJlZnVsIGRpc2FibGluZyB0aGUgY2xvY2tzIHdlIGFyZSBub3QgaW50ZW5kaW5nIHRvCisJICogYmUgdXNpbmcgYXQgYm9vdCB0aW1lLCBhcyBzdWJzeXRlbXMgc3VjaCBhcyB0aGUgTENEIHdoaWNoIGRvCisJICogdGhlaXIgb3duIERNQSByZXF1ZXN0cyB0byB0aGUgYnVzIGNhbiBjYXVzZSB0aGUgc3lzdGVtIHRvIGxvY2t1cAorCSAqIGlmIHRoZXkgd2hlcmUgaW4gdGhlIG1pZGRsZSBvZiByZXF1ZXN0aW5nIGJ1cyBhY2Nlc3MuCisJICoKKwkgKiBEaXNhYmxpbmcgdGhlIExDRCBjbG9jayBpZiB0aGUgTENEIGlzIGFjdGl2ZSBpcyB2ZXJ5IGRhbmdlcm91cywKKwkgKiBhbmQgdGhlcmVmb3JlIHRoZSBib290bG9hZGVyIHNob3VsZCBiZSBjYXJlZnVsIHRvIG5vdCBlbmFibGUKKwkgKiB0aGUgTENEIGNsb2NrIGlmIGl0IGlzIG5vdCBuZWVkZWQuCisJKi8KKworCS8qIGluc3RhbGwgKGFuZCBkaXNhYmxlKSB0aGUgY2xvY2tzIHdlIGRvIG5vdCBuZWVkIGltbWVkaWF0ZWx5ICovCisKKwljbGtwID0gaW5pdF9jbG9ja3NfZGlzYWJsZTsKKwlmb3IgKHB0ciA9IDA7IHB0ciA8IEFSUkFZX1NJWkUoaW5pdF9jbG9ja3NfZGlzYWJsZSk7IHB0cisrLCBjbGtwKyspIHsKKworCQlyZXQgPSBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKGNsa3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjbGtwLT5uYW1lLCByZXQpOworCQl9CisKKwkJczNjMjQxMF9jbGtjb25fZW5hYmxlKGNsa3AsIDApOworCX0KKworCS8qIHNob3cgdGhlIGNsb2NrLXNsb3cgdmFsdWUgKi8KKworCXh0YWwgPSBjbGtfZ2V0KE5VTEwsICJ4dGFsIik7CisKKwlwcmludGsoIkNMT0NLOiBTbG93IG1vZGUgKCVsZC4lbGQgTUh6KSwgJXMsIE1QTEwgJXMsIFVQTEwgJXNcbiIsCisJICAgICAgIHByaW50X21oeihjbGtfZ2V0X3JhdGUoeHRhbCkgLworCQkJICggMiAqIFMzQzI0MTBfQ0xLU0xPV19HRVRfU0xPV1ZBTChjbGtzbG93KSkpLAorCSAgICAgICAoY2xrc2xvdyAmIFMzQzI0MTBfQ0xLU0xPV19TTE9XKSA/ICJzbG93IiA6ICJmYXN0IiwKKwkgICAgICAgKGNsa3Nsb3cgJiBTM0MyNDEwX0NMS1NMT1dfTVBMTF9PRkYpID8gIm9mZiIgOiAib24iLAorCSAgICAgICAoY2xrc2xvdyAmIFMzQzI0MTBfQ0xLU0xPV19VQ0xLX09GRikgPyAib2ZmIiA6ICJvbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1ncGlvLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC1ncGlvLmMKaW5kZXggZDVlMWNhZS4uNDcxYTcxNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAtZ3Bpby5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLWdwaW8uYwpAQCAtMTgsOSArMTgsNiBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKgotICogQ2hhbmdlbG9nCi0gKgkxNS1KYW4tMjAwNiAgTENWUiAgU3BsaXR0ZWQgZnJvbSBncGlvLmMKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zOCw3ICszNSw3IEBACiBpbnQgczNjMjQxMF9ncGlvX2lycWZpbHRlcih1bnNpZ25lZCBpbnQgcGluLCB1bnNpZ25lZCBpbnQgb24sCiAJCQkgICB1bnNpZ25lZCBpbnQgY29uZmlnKQogewotCXZvaWQgX19pb21lbSAqcmVnID0gUzNDMjQxMF9FSU5GTFQwOworCXZvaWQgX19pb21lbSAqcmVnID0gUzNDMjRYWF9FSU5GTFQwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKQEAgLTQ3LDcgKzQ0LDcgQEAKIAogCWNvbmZpZyAmPSAweGZmOwogCi0JcGluIC09IFMzQzI0MTBfR1BHOF9FSU5UMTY7CisJcGluIC09IFMzQzI0MTBfR1BHODsKIAlyZWcgKz0gcGluICYgfjM7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CkBAIC02MSwxMCArNTgsMTAgQEAKIAogCS8qIHVwZGF0ZSBmaWx0ZXIgZW5hYmxlICovCiAKLQl2YWwgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0VYVElOVDIpOworCXZhbCA9IF9fcmF3X3JlYWRsKFMzQzI0WFhfRVhUSU5UMik7CiAJdmFsICY9IH4oMSA8PCAoKHBpbiAqIDQpICsgMykpOwogCXZhbCB8PSBvbiA8PCAoKHBpbiAqIDQpICsgMyk7Ci0JX19yYXdfd3JpdGVsKHZhbCwgUzNDMjQxMF9FWFRJTlQyKTsKKwlfX3Jhd193cml0ZWwodmFsLCBTM0MyNFhYX0VYVElOVDIpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC03NSw3ICs3Miw3IEBACiAKIGludCBzM2MyNDEwX2dwaW9fZ2V0aXJxKHVuc2lnbmVkIGludCBwaW4pCiB7Ci0JaWYgKHBpbiA8IFMzQzI0MTBfR1BGMCB8fCBwaW4gPiBTM0MyNDEwX0dQRzE1X0VJTlQyMykKKwlpZiAocGluIDwgUzNDMjQxMF9HUEYwIHx8IHBpbiA+IFMzQzI0MTBfR1BHMTUpCiAJCXJldHVybiAtMTsJLyogbm90IHZhbGlkIGludGVycnVwdHMgKi8KIAogCWlmIChwaW4gPCBTM0MyNDEwX0dQRzAgJiYgcGluID4gUzNDMjQxMF9HUEY3KQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmMKaW5kZXggMDg1MmU4Ny4uYTExMGNmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgpAQCAtMTA4LDExICsxMDksMzMgQEAKIAkgKi8KIAogCXMzYzI0eHhfc2V0dXBfY2xvY2tzKHh0YWwsIGZjbGssIGhjbGssIHBjbGspOworCXMzYzI0MTBfYmFzZWNsa19hZGQoKTsKIH0KIAorc3RydWN0IHN5c2Rldl9jbGFzcyBzM2MyNDEwX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInMzYzI0MTAtY29yZSIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNfZGV2aWNlIHMzYzI0MTBfc3lzZGV2ID0geworCS5jbHMJCT0gJnMzYzI0MTBfc3lzY2xhc3MsCit9OworCisvKiBuZWVkIHRvIHJlZ2lzdGVyIGNsYXNzIGJlZm9yZSB3ZSBhY3R1YWxseSByZWdpc3RlciB0aGUgZGV2aWNlLCBhbmQKKyAqIHdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBpdCBoYXMgYmVlbiBpbml0aWFsaXNlZCBiZWZvcmUgYW55IG9mIHRoZQorICogZHJpdmVycyBldmVuIHRyeSB0byB1c2UgaXQgKGV2ZW4gaWYgbm90IG9uIGFuIHMzYzI0NDAgYmFzZWQgc3lzdGVtKQorICogYXMgYSBkcml2ZXIgd2hpY2ggbWF5IHN1cHBvcnQgYm90aCAyNDEwIGFuZCAyNDQwIG1heSB0cnkgYW5kIHVzZSBpdC4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0MTBfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmczNjMjQxMF9zeXNjbGFzcyk7Cit9CisKK2NvcmVfaW5pdGNhbGwoczNjMjQxMF9jb3JlX2luaXQpOworCiBpbnQgX19pbml0IHMzYzI0MTBfaW5pdCh2b2lkKQogewogCXByaW50aygiUzNDMjQxMDogSW5pdGlhbGlzaW5nIGFyY2hpdGVjdHVyZVxuIik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gc3lzZGV2X3JlZ2lzdGVyKCZzM2MyNDEwX3N5c2Rldik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTAuaAppbmRleCA0ZDUzMTJhLi43M2YxYTI0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEwLmgKQEAgLTI5LDYgKzI5LDggQEAKIAogZXh0ZXJuIHZvaWQgczNjMjQxMF9pbml0X2Nsb2NrcyhpbnQgeHRhbCk7CiAKK2V4dGVybiAgaW50IHMzYzI0MTBfYmFzZWNsa19hZGQodm9pZCk7CisKICNlbHNlCiAjZGVmaW5lIHMzYzI0MTBfaW5pdF9jbG9ja3MgTlVMTAogI2RlZmluZSBzM2MyNDEwX2luaXRfdWFydHMgTlVMTApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTItY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZWQzZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWNsb2NrLmMKQEAgLTAsMCArMSw3MTEgQEAKKy8qIGxpbnV4L2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLWNsb2NrLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogUzNDMjQxMixTM0MyNDEzIENsb2NrIGNvbnRyb2wgc3VwcG9ydAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWNsb2NrLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1ncGlvLmg+CisKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgImNwdS5oIgorCisvKiBXZSBjdXJyZW50bHkgaGF2ZSB0byBhc3N1bWUgdGhhdCB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcKKyAqIGZyb20gdGhlIFhUUGxsIGlucHV0LCBhbmQgdGhhdCBhbGwgKioqUkVGQ0xLcyBhcmUgYmVpbmcKKyAqIGZlZCBmcm9tIGl0LCBhcyB3ZSBjYW5ub3QgcmVhZCB0aGUgc3RhdGUgb2YgT01bNF0gZnJvbQorICogc29mdHdhcmUuCisgKgorICogSXQgd291bGQgYmUgcG9zc2libGUgZm9yIGVhY2ggYm9hcmQgaW5pdGlhbGlzYXRpb24gdG8KKyAqIHNldCB0aGUgY29ycmVjdCBtdXhpbmcgYXQgaW5pdGlhbGlzYXRpb24KKyovCisKK2ludCBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUoc3RydWN0IGNsayAqY2xrLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGludCBjbG9ja3MgPSBjbGstPmN0cmxiaXQ7CisJdW5zaWduZWQgbG9uZyBjbGtjb247CisKKwljbGtjb24gPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0NPTik7CisKKwlpZiAoZW5hYmxlKQorCQljbGtjb24gfD0gY2xvY2tzOworCWVsc2UKKwkJY2xrY29uICY9IH5jbG9ja3M7CisKKwlfX3Jhd193cml0ZWwoY2xrY29uLCBTM0MyNDEwX0NMS0NPTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEyX3VwbGxfZW5hYmxlKHN0cnVjdCBjbGsgKmNsaywgaW50IGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBsb25nIHVwbGxjb24gPSBfX3Jhd19yZWFkbChTM0MyNDEwX1VQTExDT04pOworCXVuc2lnbmVkIGxvbmcgb3JpZyA9IHVwbGxjb247CisKKwlpZiAoIWVuYWJsZSkKKwkJdXBsbGNvbiB8PSBTM0MyNDEyX1BMTENPTl9PRkY7CisJZWxzZQorCQl1cGxsY29uICY9IH5TM0MyNDEyX1BMTENPTl9PRkY7CisKKwlfX3Jhd193cml0ZWwodXBsbGNvbiwgUzNDMjQxMF9VUExMQ09OKTsKKworCS8qIGFsbG93IH4xNTB1UyBmb3IgdGhlIFBMTCB0byBzZXR0bGUgYW5kIGxvY2sgKi8KKworCWlmIChlbmFibGUgJiYgKG9yaWcgJiBTM0MyNDEyX1BMTENPTl9PRkYpKQorCQl1ZGVsYXkoMTUwKTsKKworCXJldHVybiAwOworfQorCisvKiBjbG9jayBzZWxlY3Rpb25zICovCisKKy8qIENQVSBFWFRDTEsgaW5wdXQgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19leHQgPSB7CisJLm5hbWUJCT0gImV4dGNsayIsCisJLmlkCQk9IC0xLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2VyZWZjbGsgPSB7CisJLm5hbWUJCT0gImVyZWZjbGsiLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191cmVmY2xrID0geworCS5uYW1lCQk9ICJ1cmVmY2xrIiwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cGFyZW50X3VzeXNjbGsoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0NMS1NSQyk7CisKKwlpZiAocGFyZW50ID09ICZjbGtfdXJlZmNsaykKKwkJY2xrc3JjICY9IH5TM0MyNDEyX0NMS1NSQ19VU1lTQ0xLX1VQTEw7CisJZWxzZSBpZiAocGFyZW50ID09ICZjbGtfdXBsbCkKKwkJY2xrc3JjIHw9IFMzQzI0MTJfQ0xLU1JDX1VTWVNDTEtfVVBMTDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlfX3Jhd193cml0ZWwoY2xrc3JjLCBTM0MyNDEyX0NMS1NSQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191c3lzY2xrID0geworCS5uYW1lCQk9ICJ1c3lzY2xrIiwKKwkuaWQJCT0gLTEsCisJLnBhcmVudAkJPSAmY2xrX3h0YWwsCisJLnNldF9wYXJlbnQJPSBzM2MyNDEyX3NldHBhcmVudF91c3lzY2xrLAorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX21yZWZjbGsgPSB7CisJLm5hbWUJCT0gIm1yZWZjbGsiLAorCS5wYXJlbnQJCT0gJmNsa194dGFsLAorCS5pZAkJPSAtMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa19tZGl2Y2xrID0geworCS5uYW1lCQk9ICJtZGl2Y2xrIiwKKwkucGFyZW50CQk9ICZjbGtfeHRhbCwKKwkuaWQJCT0gLTEsCit9OworCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cGFyZW50X3VzYnNyYyhzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNsa3NyYyA9IF9fcmF3X3JlYWRsKFMzQzI0MTJfQ0xLU1JDKTsKKworCWlmIChwYXJlbnQgPT0gJmNsa191c3lzY2xrKQorCQljbGtzcmMgJj0gflMzQzI0MTJfQ0xLU1JDX1VTQkNMS19IQ0xLOworCWVsc2UgaWYgKHBhcmVudCA9PSAmY2xrX2gpCisJCWNsa3NyYyB8PSBTM0MyNDEyX0NMS1NSQ19VU0JDTEtfSENMSzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlfX3Jhd193cml0ZWwoY2xrc3JjLCBTM0MyNDEyX0NMS1NSQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0MTJfcm91bmRyYXRlX3VzYnNyYyhzdHJ1Y3QgY2xrICpjbGssCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwlpbnQgZGl2OworCisJaWYgKHJhdGUgPiBwYXJlbnRfcmF0ZSkKKwkJcmV0dXJuIHBhcmVudF9yYXRlOworCisJZGl2ID0gcGFyZW50X3JhdGUgLyByYXRlOworCWlmIChkaXYgPiAyKQorCQlkaXYgPSAyOworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzM2MyNDEyX2dldHJhdGVfdXNic3JjKHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGRpdiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLRElWTik7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgLyAoKGRpdiAmIFMzQzI0MTJfQ0xLRElWTl9VU0I0OERJVikgPyAyIDogMSk7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMl9zZXRyYXRlX3VzYnNyYyhzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGNsa2Rpdm4gPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0RJVk4pOworCisJcmF0ZSA9IHMzYzI0MTJfcm91bmRyYXRlX3VzYnNyYyhjbGssIHJhdGUpOworCisJaWYgKChwYXJlbnRfcmF0ZSAvIHJhdGUpID09IDIpCisJCWNsa2Rpdm4gfD0gUzNDMjQxMl9DTEtESVZOX1VTQjQ4RElWOworCWVsc2UKKwkJY2xrZGl2biAmPSB+UzNDMjQxMl9DTEtESVZOX1VTQjQ4RElWOworCisJX19yYXdfd3JpdGVsKGNsa2Rpdm4sIFMzQzI0MTBfQ0xLRElWTik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2xrIGNsa191c2JzcmMgPSB7CisJLm5hbWUJCT0gInVzYnNyYyIsCisJLmlkCQk9IC0xLAorCS5nZXRfcmF0ZQk9IHMzYzI0MTJfZ2V0cmF0ZV91c2JzcmMsCisJLnNldF9yYXRlCT0gczNjMjQxMl9zZXRyYXRlX3VzYnNyYywKKwkucm91bmRfcmF0ZQk9IHMzYzI0MTJfcm91bmRyYXRlX3VzYnNyYywKKwkuc2V0X3BhcmVudAk9IHMzYzI0MTJfc2V0cGFyZW50X3VzYnNyYywKK307CisKK3N0YXRpYyBpbnQgczNjMjQxMl9zZXRwYXJlbnRfbXN5c2NsayhzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNsa3NyYyA9IF9fcmF3X3JlYWRsKFMzQzI0MTJfQ0xLU1JDKTsKKworCWlmIChwYXJlbnQgPT0gJmNsa19tZGl2Y2xrKQorCQljbGtzcmMgJj0gflMzQzI0MTJfQ0xLU1JDX01TWVNDTEtfTVBMTDsKKwllbHNlIGlmIChwYXJlbnQgPT0gJmNsa191cGxsKQorCQljbGtzcmMgfD0gUzNDMjQxMl9DTEtTUkNfTVNZU0NMS19NUExMOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljbGstPnBhcmVudCA9IHBhcmVudDsKKworCV9fcmF3X3dyaXRlbChjbGtzcmMsIFMzQzI0MTJfQ0xLU1JDKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX21zeXNjbGsgPSB7CisJLm5hbWUJCT0gIm1zeXNjbGsiLAorCS5pZAkJPSAtMSwKKwkuc2V0X3BhcmVudAk9IHMzYzI0MTJfc2V0cGFyZW50X21zeXNjbGssCit9OworCisvKiB0aGVzZSBuZXh0IGNsb2NrcyBoYXZlIGFuIGRpdmlkZXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlbSwKKyAqIHNvIHdlIGNhbiByZWdpc3RlciB0aGVtIHdpdGggdGhlaXIgZGl2aWRlciBhbmQgbGVhdmUgb3V0IHRoZQorICogaW50ZXJtZWRpYXRlIGNsb2NrIHN0YWdlCisqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjQxMl9yb3VuZHJhdGVfY2xrc3JjKHN0cnVjdCBjbGsgKmNsaywKKwkJCQkJICAgICAgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCWludCBkaXY7CisKKwlpZiAocmF0ZSA+IHBhcmVudF9yYXRlKQorCQlyZXR1cm4gcGFyZW50X3JhdGU7CisKKwkvKiBub3RlLCB3ZSByZW1vdmUgdGhlICsvLSAxIGNhbGN1bGF0aW9ucyBhcyB0aGV5IGNhbmNlbCBvdXQgKi8KKworCWRpdiA9IChyYXRlIC8gcGFyZW50X3JhdGUpOworCisJaWYgKGRpdiA8IDEpCisJCWRpdiA9IDE7CisJZWxzZSBpZiAoZGl2ID4gMTYpCisJCWRpdiA9IDE2OworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gZGl2OworfQorCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cGFyZW50X3VhcnQoc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0NMS1NSQyk7CisKKwlpZiAocGFyZW50ID09ICZjbGtfZXJlZmNsaykKKwkJY2xrc3JjICY9IH5TM0MyNDEyX0NMS1NSQ19VQVJUQ0xLX01QTEw7CisJZWxzZSBpZiAocGFyZW50ID09ICZjbGtfbXBsbCkKKwkJY2xrc3JjIHw9IFMzQzI0MTJfQ0xLU1JDX1VBUlRDTEtfTVBMTDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlfX3Jhd193cml0ZWwoY2xrc3JjLCBTM0MyNDEyX0NMS1NSQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0MTJfZ2V0cmF0ZV91YXJ0KHN0cnVjdCBjbGsgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGRpdiA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLRElWTik7CisKKwlkaXYgJj0gUzNDMjQxMl9DTEtESVZOX1VBUlRESVZfTUFTSzsKKwlkaXYgPj49IFMzQzI0MTJfQ0xLRElWTl9VQVJURElWX1NISUZUOworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gKGRpdiArIDEpOworfQorCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cmF0ZV91YXJ0KHN0cnVjdCBjbGsgKmNsaywgdW5zaWduZWQgbG9uZyByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgY2xrZGl2biA9IF9fcmF3X3JlYWRsKFMzQzI0MTBfQ0xLRElWTik7CisKKwlyYXRlID0gczNjMjQxMl9yb3VuZHJhdGVfY2xrc3JjKGNsaywgcmF0ZSk7CisKKwljbGtkaXZuICY9IH5TM0MyNDEyX0NMS0RJVk5fVUFSVERJVl9NQVNLOworCWNsa2Rpdm4gfD0gKChwYXJlbnRfcmF0ZSAvIHJhdGUpIC0gMSkgPDwgUzNDMjQxMl9DTEtESVZOX1VBUlRESVZfU0hJRlQ7CisKKwlfX3Jhd193cml0ZWwoY2xrZGl2biwgUzNDMjQxMF9DTEtESVZOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX3VhcnQgPSB7CisJLm5hbWUJCT0gInVhcnRjbGsiLAorCS5pZAkJPSAtMSwKKwkuZ2V0X3JhdGUJPSBzM2MyNDEyX2dldHJhdGVfdWFydCwKKwkuc2V0X3JhdGUJPSBzM2MyNDEyX3NldHJhdGVfdWFydCwKKwkuc2V0X3BhcmVudAk9IHMzYzI0MTJfc2V0cGFyZW50X3VhcnQsCisJLnJvdW5kX3JhdGUJPSBzM2MyNDEyX3JvdW5kcmF0ZV9jbGtzcmMsCit9OworCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cGFyZW50X2kycyhzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBjbGsgKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNsa3NyYyA9IF9fcmF3X3JlYWRsKFMzQzI0MTJfQ0xLU1JDKTsKKworCWlmIChwYXJlbnQgPT0gJmNsa19lcmVmY2xrKQorCQljbGtzcmMgJj0gflMzQzI0MTJfQ0xLU1JDX0kyU0NMS19NUExMOworCWVsc2UgaWYgKHBhcmVudCA9PSAmY2xrX21wbGwpCisJCWNsa3NyYyB8PSBTM0MyNDEyX0NMS1NSQ19JMlNDTEtfTVBMTDsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJY2xrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlfX3Jhd193cml0ZWwoY2xrc3JjLCBTM0MyNDEyX0NMS1NSQyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHMzYzI0MTJfZ2V0cmF0ZV9pMnMoc3RydWN0IGNsayAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X3JhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrLT5wYXJlbnQpOworCXVuc2lnbmVkIGxvbmcgZGl2ID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtESVZOKTsKKworCWRpdiAmPSBTM0MyNDEyX0NMS0RJVk5fSTJTRElWX01BU0s7CisJZGl2ID4+PSBTM0MyNDEyX0NMS0RJVk5fSTJTRElWX1NISUZUOworCisJcmV0dXJuIHBhcmVudF9yYXRlIC8gKGRpdiArIDEpOworfQorCitzdGF0aWMgaW50IHMzYzI0MTJfc2V0cmF0ZV9pMnMoc3RydWN0IGNsayAqY2xrLCB1bnNpZ25lZCBsb25nIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBjbGtkaXZuID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtESVZOKTsKKworCXJhdGUgPSBzM2MyNDEyX3JvdW5kcmF0ZV9jbGtzcmMoY2xrLCByYXRlKTsKKworCWNsa2Rpdm4gJj0gflMzQzI0MTJfQ0xLRElWTl9JMlNESVZfTUFTSzsKKwljbGtkaXZuIHw9ICgocGFyZW50X3JhdGUgLyByYXRlKSAtIDEpIDw8IFMzQzI0MTJfQ0xLRElWTl9JMlNESVZfU0hJRlQ7CisKKwlfX3Jhd193cml0ZWwoY2xrZGl2biwgUzNDMjQxMF9DTEtESVZOKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBjbGsgY2xrX2kycyA9IHsKKwkubmFtZQkJPSAiaTJzY2xrIiwKKwkuaWQJCT0gLTEsCisJLmdldF9yYXRlCT0gczNjMjQxMl9nZXRyYXRlX2kycywKKwkuc2V0X3JhdGUJPSBzM2MyNDEyX3NldHJhdGVfaTJzLAorCS5zZXRfcGFyZW50CT0gczNjMjQxMl9zZXRwYXJlbnRfaTJzLAorCS5yb3VuZF9yYXRlCT0gczNjMjQxMl9yb3VuZHJhdGVfY2xrc3JjLAorfTsKKworc3RhdGljIGludCBzM2MyNDEyX3NldHBhcmVudF9jYW0oc3RydWN0IGNsayAqY2xrLCBzdHJ1Y3QgY2xrICpwYXJlbnQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0NMS1NSQyk7CisKKwlpZiAocGFyZW50ID09ICZjbGtfdXN5c2NsaykKKwkJY2xrc3JjICY9IH5TM0MyNDEyX0NMS1NSQ19DQU1DTEtfSENMSzsKKwllbHNlIGlmIChwYXJlbnQgPT0gJmNsa19oKQorCQljbGtzcmMgfD0gUzNDMjQxMl9DTEtTUkNfQ0FNQ0xLX0hDTEs7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNsay0+cGFyZW50ID0gcGFyZW50OworCisJX19yYXdfd3JpdGVsKGNsa3NyYywgUzNDMjQxMl9DTEtTUkMpOworCXJldHVybiAwOworfQorc3RhdGljIHVuc2lnbmVkIGxvbmcgczNjMjQxMl9nZXRyYXRlX2NhbShzdHJ1Y3QgY2xrICpjbGspCit7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGstPnBhcmVudCk7CisJdW5zaWduZWQgbG9uZyBkaXYgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0RJVk4pOworCisJZGl2ICY9IFMzQzI0MTJfQ0xLRElWTl9DQU1ESVZfTUFTSzsKKwlkaXYgPj49IFMzQzI0MTJfQ0xLRElWTl9DQU1ESVZfU0hJRlQ7CisKKwlyZXR1cm4gcGFyZW50X3JhdGUgLyAoZGl2ICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMl9zZXRyYXRlX2NhbShzdHJ1Y3QgY2xrICpjbGssIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9yYXRlID0gY2xrX2dldF9yYXRlKGNsay0+cGFyZW50KTsKKwl1bnNpZ25lZCBsb25nIGNsa2Rpdm4gPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0RJVk4pOworCisJcmF0ZSA9IHMzYzI0MTJfcm91bmRyYXRlX2Nsa3NyYyhjbGssIHJhdGUpOworCisJY2xrZGl2biAmPSB+UzNDMjQxMl9DTEtESVZOX0NBTURJVl9NQVNLOworCWNsa2Rpdm4gfD0gKChwYXJlbnRfcmF0ZSAvIHJhdGUpIC0gMSkgPDwgUzNDMjQxMl9DTEtESVZOX0NBTURJVl9TSElGVDsKKworCV9fcmF3X3dyaXRlbChjbGtkaXZuLCBTM0MyNDEwX0NMS0RJVk4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGNsayBjbGtfY2FtID0geworCS5uYW1lCQk9ICJjYW1pZi11cGxsIiwJLyogc2FtZSBhcyAyNDQwIG5hbWUgKi8KKwkuaWQJCT0gLTEsCisJLmdldF9yYXRlCT0gczNjMjQxMl9nZXRyYXRlX2NhbSwKKwkuc2V0X3JhdGUJPSBzM2MyNDEyX3NldHJhdGVfY2FtLAorCS5zZXRfcGFyZW50CT0gczNjMjQxMl9zZXRwYXJlbnRfY2FtLAorCS5yb3VuZF9yYXRlCT0gczNjMjQxMl9yb3VuZHJhdGVfY2xrc3JjLAorfTsKKworLyogc3RhbmRhcmQgY2xvY2sgZGVmaW5pdGlvbnMgKi8KKworc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NfZGlzYWJsZVtdID0geworCXsKKwkJLm5hbWUJCT0gIm5hbmQiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9OQU5ELAorCX0sIHsKKwkJLm5hbWUJCT0gInNkaSIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1NESSwKKwl9LCB7CisJCS5uYW1lCQk9ICJhZGMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9BREMsCisJfSwgeworCQkubmFtZQkJPSAiaTJjIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fSUlDLAorCX0sIHsKKwkJLm5hbWUJCT0gImlpcyIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX3AsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0lJUywKKwl9LCB7CisJCS5uYW1lCQk9ICJzcGkiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9TUEksCisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjbGsgaW5pdF9jbG9ja3NbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJkbWEiLAorCQkuaWQJCT0gMCwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0RNQTAsCisJfSwgeworCQkubmFtZQkJPSAiZG1hIiwKKwkJLmlkCQk9IDEsCisJCS5wYXJlbnQJCT0gJmNsa19oLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9ETUExLAorCX0sIHsKKwkJLm5hbWUJCT0gImRtYSIsCisJCS5pZAkJPSAyLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fRE1BMiwKKwl9LCB7CisJCS5uYW1lCQk9ICJkbWEiLAorCQkuaWQJCT0gMywKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX0RNQTMsCisJfSwgeworCQkubmFtZQkJPSAibGNkIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfaCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fTENEQywKKwl9LCB7CisJCS5uYW1lCQk9ICJncGlvIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fR1BJTywKKwl9LCB7CisJCS5uYW1lCQk9ICJ1c2ItaG9zdCIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1VTQkgsCisJfSwgeworCQkubmFtZQkJPSAidXNiLWRldmljZSIsCisJCS5pZAkJPSAtMSwKKwkJLnBhcmVudAkJPSAmY2xrX2gsCisJCS5lbmFibGUJCT0gczNjMjQxMl9jbGtjb25fZW5hYmxlLAorCQkuY3RybGJpdAk9IFMzQzI0MTJfQ0xLQ09OX1VTQkQsCisJfSwgeworCQkubmFtZQkJPSAidGltZXJzIiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfcCwKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fUFdNVCwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDAsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VQVJUMCwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VQVJUMSwKKwl9LCB7CisJCS5uYW1lCQk9ICJ1YXJ0IiwKKwkJLmlkCQk9IDIsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VQVJUMiwKKwl9LCB7CisJCS5uYW1lCQk9ICJydGMiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9SVEMsCisJfSwgeworCQkubmFtZQkJPSAid2F0Y2hkb2ciLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa19wLAorCQkuY3RybGJpdAk9IDAsCisJfSwgeworCQkubmFtZQkJPSAidXNiLWJ1cy1nYWRnZXQiLAorCQkuaWQJCT0gLTEsCisJCS5wYXJlbnQJCT0gJmNsa191c2JfYnVzLAorCQkuZW5hYmxlCQk9IHMzYzI0MTJfY2xrY29uX2VuYWJsZSwKKwkJLmN0cmxiaXQJPSBTM0MyNDEyX0NMS0NPTl9VU0JfREVWNDgsCisJfSwgeworCQkubmFtZQkJPSAidXNiLWJ1cy1ob3N0IiwKKwkJLmlkCQk9IC0xLAorCQkucGFyZW50CQk9ICZjbGtfdXNiX2J1cywKKwkJLmVuYWJsZQkJPSBzM2MyNDEyX2Nsa2Nvbl9lbmFibGUsCisJCS5jdHJsYml0CT0gUzNDMjQxMl9DTEtDT05fVVNCX0hPU1Q0OCwKKwl9Cit9OworCisvKiBjbG9ja3MgdG8gYWRkIHdoZXJlIHdlIG5lZWQgdG8gY2hlY2sgdGhlaXIgcGFyZW50YWdlICovCisKK3N0cnVjdCBjbGtfaW5pdCB7CisJc3RydWN0IGNsawkqY2xrOworCXVuc2lnbmVkIGludAkgYml0OworCXN0cnVjdCBjbGsJKnNyY18wOworCXN0cnVjdCBjbGsJKnNyY18xOworfTsKKworc3RydWN0IGNsa19pbml0IGNsa3Nfc3JjW10gX19pbml0ZGF0YSA9IHsKKwl7CisJCS5jbGsJPSAmY2xrX3VzeXNjbGssCisJCS5iaXQJPSBTM0MyNDEyX0NMS1NSQ19VU0JDTEtfSENMSywKKwkJLnNyY18wCT0gJmNsa191cmVmY2xrLAorCQkuc3JjXzEJPSAmY2xrX3VwbGwsCisJfSwgeworCQkuY2xrCT0gJmNsa19pMnMsCisJCS5iaXQJPSBTM0MyNDEyX0NMS1NSQ19JMlNDTEtfTVBMTCwKKwkJLnNyY18wCT0gJmNsa19lcmVmY2xrLAorCQkuc3JjXzEJPSAmY2xrX21wbGwsCisJfSwgeworCQkuY2xrCT0gJmNsa19jYW0sCisJCS5iaXQJPSBTM0MyNDEyX0NMS1NSQ19DQU1DTEtfSENMSywKKwkJLnNyY18wCT0gJmNsa191c3lzY2xrLAorCQkuc3JjXzEJPSAmY2xrX2gsCisJfSwgeworCQkuY2xrCT0gJmNsa19tc3lzY2xrLAorCQkuYml0CT0gUzNDMjQxMl9DTEtTUkNfTVNZU0NMS19NUExMLAorCQkuc3JjXzAJPSAmY2xrX21kaXZjbGssCisJCS5zcmNfMQk9ICZjbGtfbXBsbCwKKwl9LCB7CisJCS5jbGsJPSAmY2xrX3VhcnQsCisJCS5iaXQJPSBTM0MyNDEyX0NMS1NSQ19VQVJUQ0xLX01QTEwsCisJCS5zcmNfMAk9ICZjbGtfZXJlZmNsaywKKwkJLnNyY18xCT0gJmNsa19tcGxsLAorCX0sIHsKKwkJLmNsawk9ICZjbGtfdXNic3JjLAorCQkuYml0CT0gUzNDMjQxMl9DTEtTUkNfVVNCQ0xLX0hDTEssCisJCS5zcmNfMAk9ICZjbGtfdXN5c2NsaywKKwkJLnNyY18xCT0gJmNsa19oLAorCX0sCit9OworCisvKiBzM2MyNDEyX2Nsa19pbml0cGFyZW50cworICoKKyAqIEluaXRpYWxpc2UgdGhlIHBhcmVudHMgZm9yIHRoZSBjbG9ja3MgdGhhdCB3ZSBnZXQgYXQgc3RhcnQtdGltZQorKi8KKworc3RhdGljIHZvaWQgX19pbml0IHMzYzI0MTJfY2xrX2luaXRwYXJlbnRzKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtzcmMgPSBfX3Jhd19yZWFkbChTM0MyNDEyX0NMS1NSQyk7CisJc3RydWN0IGNsa19pbml0ICpjaXAgPSBjbGtzX3NyYzsKKwlzdHJ1Y3QgY2xrICpzcmM7CisJaW50IHB0cjsKKwlpbnQgcmV0OworCisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGNsa3Nfc3JjKTsgcHRyKyssIGNpcCsrKSB7CisJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soY2lwLT5jbGspOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjaXAtPmNsay0+bmFtZSwgcmV0KTsKKwkJfQorCisJCXNyYyA9IChjbGtzcmMgJiBjaXAtPmJpdCkgPyBjaXAtPnNyY18xIDogY2lwLT5zcmNfMDsKKworCQlwcmludGsoS0VSTl9JTkZPICIlczogcGFyZW50ICVzXG4iLCBjaXAtPmNsay0+bmFtZSwgc3JjLT5uYW1lKTsKKwkJY2xrX3NldF9wYXJlbnQoY2lwLT5jbGssIHNyYyk7CisJfQorfQorCisvKiBjbG9ja3MgdG8gYWRkIHN0cmFpZ2h0IGF3YXkgKi8KKworc3RydWN0IGNsayAqY2xrc1tdIF9faW5pdGRhdGEgPSB7CisJJmNsa19leHQsCisJJmNsa191c2JfYnVzLAorCSZjbGtfZXJlZmNsaywKKwkmY2xrX3VyZWZjbGssCisJJmNsa19tcmVmY2xrLAorfTsKKworaW50IF9faW5pdCBzM2MyNDEyX2Jhc2VjbGtfYWRkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjbGtjb24gID0gX19yYXdfcmVhZGwoUzNDMjQxMF9DTEtDT04pOworCXN0cnVjdCBjbGsgKmNsa3A7CisJaW50IHJldDsKKwlpbnQgcHRyOworCisJY2xrX3VwbGwuZW5hYmxlID0gczNjMjQxMl91cGxsX2VuYWJsZTsKKwljbGtfdXNiX2J1cy5wYXJlbnQgPSAmY2xrX3VzYnNyYzsKKwljbGtfdXNiX2J1cy5yYXRlID0gMHgwOworCisJczNjMjQxMl9jbGtfaW5pdHBhcmVudHMoKTsKKworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShjbGtzKTsgcHRyKyspIHsKKwkJY2xrcCA9IGNsa3NbcHRyXTsKKworCQlyZXQgPSBzM2MyNHh4X3JlZ2lzdGVyX2Nsb2NrKGNsa3ApOworCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgY2xvY2sgJXMgKCVkKVxuIiwKKwkJCSAgICAgICBjbGtwLT5uYW1lLCByZXQpOworCQl9CisJfQorCisJLyogZW5zdXJlIHVzYiBidXMgY2xvY2sgaXMgd2l0aGluIGNvcnJlY3QgcmF0ZSBvZiA0OE1IeiAqLworCisJaWYgKGNsa19nZXRfcmF0ZSgmY2xrX3VzYl9idXMpICE9ICg0OCAqIDEwMDAgKiAxMDAwKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJXYXJuaW5nOiBVU0IgYnVzIGNsb2NrIG5vdCBhdCA0OE1IelxuIik7CisKKwkJLyogZm9yIHRoZSBtb21lbnQsIGxldCdzIHVzZSB0aGUgVVBMTCwgYW5kIHNlZSBpZiB3ZSBjYW4KKwkJICogZ2V0IDQ4TUh6ICovCisKKwkJY2xrX3NldF9wYXJlbnQoJmNsa191c3lzY2xrLCAmY2xrX3VwbGwpOworCQljbGtfc2V0X3BhcmVudCgmY2xrX3VzYnNyYywgJmNsa191c3lzY2xrKTsKKwkJY2xrX3NldF9yYXRlKCZjbGtfdXNic3JjLCA0OCoxMDAwKjEwMDApOworCX0KKworCXByaW50aygiUzNDMjQxMjogdXBsbCAlcywgJWxkLiUwM2xkIE1IeiwgdXNiLWJ1cyAlbGQuJTAzbGQgTUh6XG4iLAorCSAgICAgICAoX19yYXdfcmVhZGwoUzNDMjQxMF9VUExMQ09OKSAmIFMzQzI0MTJfUExMQ09OX09GRikgPyAib2ZmIjoib24iLAorCSAgICAgICBwcmludF9taHooY2xrX2dldF9yYXRlKCZjbGtfdXBsbCkpLAorCSAgICAgICBwcmludF9taHooY2xrX2dldF9yYXRlKCZjbGtfdXNiX2J1cykpKTsKKworCS8qIHJlZ2lzdGVyIGNsb2NrcyBmcm9tIGNsb2NrIGFycmF5ICovCisKKwljbGtwID0gaW5pdF9jbG9ja3M7CisJZm9yIChwdHIgPSAwOyBwdHIgPCBBUlJBWV9TSVpFKGluaXRfY2xvY2tzKTsgcHRyKyssIGNsa3ArKykgeworCQkvKiBlbnN1cmUgdGhhdCB3ZSBub3RlIHRoZSBjbG9jayBzdGF0ZSAqLworCisJCWNsa3AtPnVzYWdlID0gY2xrY29uICYgY2xrcC0+Y3RybGJpdCA/IDEgOiAwOworCisJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soY2xrcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjbG9jayAlcyAoJWQpXG4iLAorCQkJICAgICAgIGNsa3AtPm5hbWUsIHJldCk7CisJCX0KKwl9CisKKwkvKiBXZSBtdXN0IGJlIGNhcmVmdWwgZGlzYWJsaW5nIHRoZSBjbG9ja3Mgd2UgYXJlIG5vdCBpbnRlbmRpbmcgdG8KKwkgKiBiZSB1c2luZyBhdCBib290IHRpbWUsIGFzIHN1YnN5dGVtcyBzdWNoIGFzIHRoZSBMQ0Qgd2hpY2ggZG8KKwkgKiB0aGVpciBvd24gRE1BIHJlcXVlc3RzIHRvIHRoZSBidXMgY2FuIGNhdXNlIHRoZSBzeXN0ZW0gdG8gbG9ja3VwCisJICogaWYgdGhleSB3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHJlcXVlc3RpbmcgYnVzIGFjY2Vzcy4KKwkgKgorCSAqIERpc2FibGluZyB0aGUgTENEIGNsb2NrIGlmIHRoZSBMQ0QgaXMgYWN0aXZlIGlzIHZlcnkgZGFuZ2Vyb3VzLAorCSAqIGFuZCB0aGVyZWZvcmUgdGhlIGJvb3Rsb2FkZXIgc2hvdWxkIGJlIGNhcmVmdWwgdG8gbm90IGVuYWJsZQorCSAqIHRoZSBMQ0QgY2xvY2sgaWYgaXQgaXMgbm90IG5lZWRlZC4KKwkqLworCisJLyogaW5zdGFsbCAoYW5kIGRpc2FibGUpIHRoZSBjbG9ja3Mgd2UgZG8gbm90IG5lZWQgaW1tZWRpYXRlbHkgKi8KKworCWNsa3AgPSBpbml0X2Nsb2Nrc19kaXNhYmxlOworCWZvciAocHRyID0gMDsgcHRyIDwgQVJSQVlfU0laRShpbml0X2Nsb2Nrc19kaXNhYmxlKTsgcHRyKyssIGNsa3ArKykgeworCisJCXJldCA9IHMzYzI0eHhfcmVnaXN0ZXJfY2xvY2soY2xrcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBjbG9jayAlcyAoJWQpXG4iLAorCQkJICAgICAgIGNsa3AtPm5hbWUsIHJldCk7CisJCX0KKworCQlzM2MyNDEyX2Nsa2Nvbl9lbmFibGUoY2xrcCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRmZmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTIuYwpAQCAtMCwwICsxLDE5NSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0MTIuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBTaW10ZWMgRWxlY3Ryb25pY3MKKyAqCUJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4KKyAqCisgKiBodHRwOi8vYXJtbGludXguc2ltdGVjLmNvLnVrLy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIE1vZGlmaWNhdGlvbnM6CisgKiAgICAgMTYtTWF5LTIwMDMgQkpEICBDcmVhdGVkIGluaXRpYWwgdmVyc2lvbgorICogICAgIDE2LUF1Zy0yMDAzIEJKRCAgRml4ZWQgaGVhZGVyIGZpbGVzIGFuZCBjb3B5cmlnaHQsIGFkZGVkIFVSTAorICogICAgIDA1LVNlcC0yMDAzIEJKRCAgTW92ZWQgdG8ga2VybmVsIHYyLjYKKyAqICAgICAxOC1KYW4tMjAwNCBCSkQgIEFkZGVkIHNlcmlhbCBwb3J0IGNvbmZpZ3VyYXRpb24KKyAqICAgICAyMS1BdWctMjAwNCBCSkQgIEFkZGVkIG5ldyBzdHJ1Y3QgczNjMjQxMF9ib2FyZCBoYW5kbGVyCisgKiAgICAgMjgtU2VwLTIwMDQgQkpEICBVcGRhdGVzIGZvciBuZXcgc2VyaWFsIHBvcnQgYml0cworICogICAgIDA0LU5vdi0yMDA0IEJKRCAgVXBkYXRlZCBVQVJUIGNvbmZpZ3VyYXRpb24gcHJvY2VzcworICogICAgIDEwLUphbi0yMDA1IEJKRCAgUmVtb3ZlZCBzM2MyNDEwX2Nsb2NrX3RpY2tfcmF0ZQorICogICAgIDEzLUF1Zy0yMDA1IERBICAgUmVtb3ZlZCBVQVJUIGZyb20gaW5pdGlhbCBJL08gbWFwcGluZ3MKKyovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtY2xvY2suaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLXNlcmlhbC5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpby5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL3JlZ3MtZ3Bpb2ouaD4KKyNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWRzYy5oPgorCisjaW5jbHVkZSAiczNjMjQxMi5oIgorI2luY2x1ZGUgImNwdS5oIgorI2luY2x1ZGUgImRldnMuaCIKKyNpbmNsdWRlICJjbG9jay5oIgorI2luY2x1ZGUgInBtLmgiCisKKyNpZm5kZWYgQ09ORklHX0NQVV9TM0MyNDEyX09OTFkKK3ZvaWQgX19pb21lbSAqczNjMjR4eF92YV9ncGlvMiA9IFMzQzI0WFhfVkFfR1BJTzsKKyNlbmRpZgorCisvKiBJbml0aWFsIElPIG1hcHBpbmdzICovCisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgczNjMjQxMl9pb2Rlc2NbXSBfX2luaXRkYXRhID0geworCUlPREVTQ19FTlQoQ0xLUFdSKSwKKwlJT0RFU0NfRU5UKExDRCksCisJSU9ERVNDX0VOVChUSU1FUiksCisJSU9ERVNDX0VOVChBREMpLAorCUlPREVTQ19FTlQoV0FUQ0hET0cpLAorfTsKKworLyogdWFydCByZWdpc3RyYXRpb24gcHJvY2VzcyAqLworCit2b2lkIF9faW5pdCBzM2MyNDEyX2luaXRfdWFydHMoc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnLCBpbnQgbm8pCit7CisJczNjMjR4eF9pbml0X3VhcnRkZXZzKCJzM2MyNDEyLXVhcnQiLCBzM2MyNDEwX3VhcnRfcmVzb3VyY2VzLCBjZmcsIG5vKTsKKworCS8qIHJlbmFtZSBkZXZpY2VzIHRoYXQgYXJlIHMzYzI0MTIvczNjMjQxMyBzcGVjaWZpYyAqLworCXMzY19kZXZpY2Vfc2RpLm5hbWUgID0gInMzYzI0MTItc2RpIjsKKwlzM2NfZGV2aWNlX25hbmQubmFtZSA9ICJzM2MyNDEyLW5hbmQiOworfQorCisvKiBzM2MyNDEyX21hcF9pbworICoKKyAqIHJlZ2lzdGVyIHRoZSBzdGFuZGFyZCBjcHUgSU8gYXJlYXMsIGFuZCBhbnkgcGFzc2VkIGluIGZyb20gdGhlCisgKiBtYWNoaW5lIHNwZWNpZmljIGluaXRpYWxpc2F0aW9uLgorKi8KKwordm9pZCBfX2luaXQgczNjMjQxMl9tYXBfaW8oc3RydWN0IG1hcF9kZXNjICptYWNoX2Rlc2MsIGludCBtYWNoX3NpemUpCit7CisJLyogbW92ZSBiYXNlIG9mIElPICovCisKKwlzM2MyNHh4X3ZhX2dwaW8yID0gUzNDMjRYWF9WQV9HUElPICsgMHgxMDsKKworCS8qIHJlZ2lzdGVyIG91ciBpby10YWJsZXMgKi8KKworCWlvdGFibGVfaW5pdChzM2MyNDEyX2lvZGVzYywgQVJSQVlfU0laRShzM2MyNDEyX2lvZGVzYykpOworCWlvdGFibGVfaW5pdChtYWNoX2Rlc2MsIG1hY2hfc2l6ZSk7Cit9CisKK3ZvaWQgX19pbml0IHMzYzI0MTJfaW5pdF9jbG9ja3MoaW50IHh0YWwpCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisJdW5zaWduZWQgbG9uZyBmY2xrOworCXVuc2lnbmVkIGxvbmcgaGNsazsKKwl1bnNpZ25lZCBsb25nIHBjbGs7CisKKwkvKiBub3cgd2UndmUgZ290IG91ciBtYWNoaW5lIGJpdHMgaW5pdGlhbGlzZWQsIHdvcmsgb3V0IHdoYXQKKwkgKiBjbG9ja3Mgd2UndmUgZ290ICovCisKKwlmY2xrID0gczNjMjQxMF9nZXRfcGxsKF9fcmF3X3JlYWRsKFMzQzI0MTBfTVBMTENPTiksIHh0YWwqMik7CisKKwl0bXAgPSBfX3Jhd19yZWFkbChTM0MyNDEwX0NMS0RJVk4pOworCisJLyogd29yayBvdXQgY2xvY2sgc2NhbGluZ3MgKi8KKworCWhjbGsgPSBmY2xrIC8gKCh0bXAgJiBTM0MyNDEyX0NMS0RJVk5fSERJVk5fTUFTSykgKyAxKTsKKwloY2xrIC89ICgodG1wICYgUzNDMjQyMV9DTEtESVZOX0FSTURJVk4pID8gMiA6IDEpOworCXBjbGsgPSBoY2xrIC8gKCh0bXAgJiBTM0MyNDEyX0NMS0RJVk5fUERJVk4pID8gMiA6IDEpOworCisJLyogcHJpbnQgYnJpZWZ0IHN1bW1hcnkgb2YgY2xvY2tzLCBldGMgKi8KKworCXByaW50aygiUzNDMjQxMjogY29yZSAlbGQuJTAzbGQgTUh6LCBtZW1vcnkgJWxkLiUwM2xkIE1IeiwgcGVyaXBoZXJhbCAlbGQuJTAzbGQgTUh6XG4iLAorCSAgICAgICBwcmludF9taHooZmNsayksIHByaW50X21oeihoY2xrKSwgcHJpbnRfbWh6KHBjbGspKTsKKworCS8qIGluaXRpYWxpc2UgdGhlIGNsb2NrcyBoZXJlLCB0byBhbGxvdyBvdGhlciB0aGluZ3MgbGlrZSB0aGUKKwkgKiBjb25zb2xlIHRvIHVzZSB0aGVtCisJICovCisKKwlzM2MyNHh4X3NldHVwX2Nsb2Nrcyh4dGFsLCBmY2xrLCBoY2xrLCBwY2xrKTsKKwlzM2MyNDEyX2Jhc2VjbGtfYWRkKCk7Cit9CisKKy8qIG5lZWQgdG8gcmVnaXN0ZXIgY2xhc3MgYmVmb3JlIHdlIGFjdHVhbGx5IHJlZ2lzdGVyIHRoZSBkZXZpY2UsIGFuZAorICogd2UgYWxzbyBuZWVkIHRvIGVuc3VyZSB0aGF0IGl0IGhhcyBiZWVuIGluaXRpYWxpc2VkIGJlZm9yZSBhbnkgb2YgdGhlCisgKiBkcml2ZXJzIGV2ZW4gdHJ5IHRvIHVzZSBpdCAoZXZlbiBpZiBub3Qgb24gYW4gczNjMjQxMiBiYXNlZCBzeXN0ZW0pCisgKiBhcyBhIGRyaXZlciB3aGljaCBtYXkgc3VwcG9ydCBib3RoIDI0MTAgYW5kIDI0NDAgbWF5IHRyeSBhbmQgdXNlIGl0LgorKi8KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIHN0cnVjdCBzbGVlcF9zYXZlIHMzYzI0MTJfc2xlZXBbXSA9IHsKKwlTQVZFX0lURU0oUzNDMjQxMl9EU0MwKSwKKwlTQVZFX0lURU0oUzNDMjQxMl9EU0MxKSwKKwlTQVZFX0lURU0oUzNDMjQxM19HUEpEQVQpLAorCVNBVkVfSVRFTShTM0MyNDEzX0dQSkNPTiksCisJU0FWRV9JVEVNKFMzQzI0MTNfR1BKVVApLAorCisJLyogc2F2ZSB0aGUgc2xlZXAgY29uZmlndXJhdGlvbiBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGVzZQorCSAqIGdldCBkYW1hZ2VkIGR1cmluZyB3YWtldXAgKi8KKworCVNBVkVfSVRFTShTM0MyNDEyX0dQQlNMUENPTiksCisJU0FWRV9JVEVNKFMzQzI0MTJfR1BDU0xQQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMl9HUERTTFBDT04pLAorCVNBVkVfSVRFTShTM0MyNDEyX0dQRVNMUENPTiksCisJU0FWRV9JVEVNKFMzQzI0MTJfR1BGU0xQQ09OKSwKKwlTQVZFX0lURU0oUzNDMjQxMl9HUEdTTFBDT04pLAorCVNBVkVfSVRFTShTM0MyNDEyX0dQSFNMUENPTiksCisJU0FWRV9JVEVNKFMzQzI0MTNfR1BKU0xQQ09OKSwKK307CisKK3N0YXRpYyBpbnQgczNjMjQxMl9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzM2MyNDEwX3BtX2RvX3NhdmUoczNjMjQxMl9zbGVlcCwgQVJSQVlfU0laRShzM2MyNDEyX3NsZWVwKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczNjMjQxMl9yZXN1bWUoc3RydWN0IHN5c19kZXZpY2UgKmRldikKK3sKKwlzM2MyNDEwX3BtX2RvX3Jlc3RvcmUoczNjMjQxMl9zbGVlcCwgQVJSQVlfU0laRShzM2MyNDEyX3NsZWVwKSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIHMzYzI0MTJfc3VzcGVuZCBOVUxMCisjZGVmaW5lIHMzYzI0MTJfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RydWN0IHN5c2Rldl9jbGFzcyBzM2MyNDEyX3N5c2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInMzYzI0MTItY29yZSIpLAorCS5zdXNwZW5kCT0gczNjMjQxMl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gczNjMjQxMl9yZXN1bWUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHMzYzI0MTJfY29yZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHN5c2Rldl9jbGFzc19yZWdpc3RlcigmczNjMjQxMl9zeXNjbGFzcyk7Cit9CisKK2NvcmVfaW5pdGNhbGwoczNjMjQxMl9jb3JlX2luaXQpOworCitzdGF0aWMgc3RydWN0IHN5c19kZXZpY2UgczNjMjQxMl9zeXNkZXYgPSB7CisJLmNscwkJPSAmczNjMjQxMl9zeXNjbGFzcywKK307CisKK2ludCBfX2luaXQgczNjMjQxMl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJTM0MyNDEyOiBJbml0aWFsaXNpbmcgYXJjaGl0ZWN0dXJlXG4iKTsKKworCXJldHVybiBzeXNkZXZfcmVnaXN0ZXIoJnMzYzI0MTJfc3lzZGV2KTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLmggYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZTU2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQxMi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGFyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDEyLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogSGVhZGVyIGZpbGUgZm9yIHMzYzI0MTIgY3B1IHN1cHBvcnQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorKi8KKworI2lmZGVmIENPTkZJR19DUFVfUzNDMjQxMgorCitleHRlcm4gIGludCBzM2MyNDEyX2luaXQodm9pZCk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfbWFwX2lvKHN0cnVjdCBtYXBfZGVzYyAqbWFjaF9kZXNjLCBpbnQgc2l6ZSk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF91YXJ0cyhzdHJ1Y3QgczNjMjQxMF91YXJ0Y2ZnICpjZmcsIGludCBubyk7CisKK2V4dGVybiB2b2lkIHMzYzI0MTJfaW5pdF9jbG9ja3MoaW50IHh0YWwpOworCitleHRlcm4gIGludCBzM2MyNDEyX2Jhc2VjbGtfYWRkKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgczNjMjQxMl9pbml0X2Nsb2NrcyBOVUxMCisjZGVmaW5lIHMzYzI0MTJfaW5pdF91YXJ0cyBOVUxMCisjZGVmaW5lIHMzYzI0MTJfbWFwX2lvIE5VTEwKKyNkZWZpbmUgczNjMjQxMl9pbml0IE5VTEwKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtY2xvY2suYyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQwLWNsb2NrLmMKaW5kZXggZDdhMzBlZC4uMTU3OTY4NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDAtY2xvY2suYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0MC1jbG9jay5jCkBAIC05MSw3ICs5MSw3IEBACiBzdGF0aWMgc3RydWN0IGNsayBzM2MyNDQwX2Nsa19jYW0gPSB7CiAJLm5hbWUJCT0gImNhbWlmIiwKIAkuaWQJCT0gLTEsCi0JLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJLmN0cmxiaXQJPSBTM0MyNDQwX0NMS0NPTl9DQU1FUkEsCiB9OwogCkBAIC0xMDUsNyArMTA1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgY2xrIHMzYzI0NDBfY2xrX2FjOTcgPSB7CiAJLm5hbWUJCT0gImFjOTciLAogCS5pZAkJPSAtMSwKLQkuZW5hYmxlCQk9IHMzYzI0eHhfY2xrY29uX2VuYWJsZSwKKwkuZW5hYmxlCQk9IHMzYzI0MTBfY2xrY29uX2VuYWJsZSwKIAkuY3RybGJpdAk9IFMzQzI0NDBfQ0xLQ09OX0NBTUVSQSwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQyLWNsb2NrLmMgYi9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0Mi1jbG9jay5jCmluZGV4IDViN2IzMDEuLmQ5ZjU0YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDQyLWNsb2NrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NDItY2xvY2suYwpAQCAtMTAyLDcgKzEwMiw3IEBACiBzdGF0aWMgc3RydWN0IGNsayBzM2MyNDQyX2Nsa19jYW0gPSB7CiAJLm5hbWUJCT0gImNhbWlmIiwKIAkuaWQJCT0gLTEsCi0JLmVuYWJsZQkJPSBzM2MyNHh4X2Nsa2Nvbl9lbmFibGUsCisJLmVuYWJsZQkJPSBzM2MyNDEwX2Nsa2Nvbl9lbmFibGUsCiAJLmN0cmxiaXQJPSBTM0MyNDQwX0NMS0NPTl9DQU1FUkEsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0eC5jIGIvYXJjaC9hcm0vbWFjaC1zM2MyNDEwL3MzYzI0NHguYwppbmRleCA5Njg1MmE3Li44MzhiYzUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzI0MTAvczNjMjQ0eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjMjQxMC9zM2MyNDR4LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vYXJjaC9yZWdzLWdwaW9qLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2gvcmVncy1kc2MuaD4KIAorI2luY2x1ZGUgInMzYzI0MTAuaCIKICNpbmNsdWRlICJzM2MyNDQwLmgiCiAjaW5jbHVkZSAiczNjMjQ0eC5oIgogI2luY2x1ZGUgImNsb2NrLmgiCkBAIC0xMTgsNiArMTE5LDcgQEAKIAkgKi8KIAogCXMzYzI0eHhfc2V0dXBfY2xvY2tzKHh0YWwsIGZjbGssIGhjbGssIHBjbGspOworCXMzYzI0MTBfYmFzZWNsa19hZGQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19QTQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vS2NvbmZpZyBiL2FyY2gvYXJtL21tL0tjb25maWcKaW5kZXggNDIyMWQwNS4uZWNmNWUyMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vS2NvbmZpZworKysgYi9hcmNoL2FybS9tbS9LY29uZmlnCkBAIC02MSw5ICs2MSw5IEBACiAKICMgQVJNOTIwVAogY29uZmlnIENQVV9BUk05MjBUCi0JYm9vbCAiU3VwcG9ydCBBUk05MjBUIHByb2Nlc3NvciIgaWYgIUFSQ0hfUzNDMjQxMAotCWRlcGVuZHMgb24gQVJDSF9FUDkzWFggfHwgQVJDSF9JTlRFR1JBVE9SIHx8IEFSQ0hfUzNDMjQxMCB8fCBBUkNIX0lNWCB8fCBBUkNIX0FBRUMyMDAwIHx8IEFSQ0hfQVQ5MVJNOTIwMAotCWRlZmF1bHQgeSBpZiBBUkNIX1MzQzI0MTAgfHwgQVJDSF9BVDkxUk05MjAwCisJYm9vbCAiU3VwcG9ydCBBUk05MjBUIHByb2Nlc3NvciIKKwlkZXBlbmRzIG9uIEFSQ0hfRVA5M1hYIHx8IEFSQ0hfSU5URUdSQVRPUiB8fCBDUFVfUzNDMjQxMCB8fCBDUFVfUzNDMjQ0MCB8fCBDUFVfUzNDMjQ0MiB8fCBBUkNIX0lNWCB8fCBBUkNIX0FBRUMyMDAwIHx8IEFSQ0hfQVQ5MVJNOTIwMAorCWRlZmF1bHQgeSBpZiBDUFVfUzNDMjQxMCB8fCBDUFVfUzNDMjQ0MCB8fCBDUFVfUzNDMjQ0MiB8fCBBUkNIX0FUOTFSTTkyMDAKIAlzZWxlY3QgQ1BVXzMydjQKIAlzZWxlY3QgQ1BVX0FCUlRfRVY0VAogCXNlbGVjdCBDUFVfQ0FDSEVfVjRXVApAQCAtMTIxLDggKzEyMSw4IEBACiAjIEFSTTkyNlQKIGNvbmZpZyBDUFVfQVJNOTI2VAogCWJvb2wgIlN1cHBvcnQgQVJNOTI2VCBwcm9jZXNzb3IiCi0JZGVwZW5kcyBvbiBBUkNIX0lOVEVHUkFUT1IgfHwgQVJDSF9WRVJTQVRJTEVfUEIgfHwgTUFDSF9WRVJTQVRJTEVfQUIgfHwgQVJDSF9PTUFQNzMwIHx8IEFSQ0hfT01BUDE2WFggfHwgTUFDSF9SRUFMVklFV19FQiB8fCBBUkNIX1BOWDQwMDggfHwgQVJDSF9ORVRYCi0JZGVmYXVsdCB5IGlmIEFSQ0hfVkVSU0FUSUxFX1BCIHx8IE1BQ0hfVkVSU0FUSUxFX0FCIHx8IEFSQ0hfT01BUDczMCB8fCBBUkNIX09NQVAxNlhYIHx8IEFSQ0hfUE5YNDAwOCB8fCBBUkNIX05FVFgKKwlkZXBlbmRzIG9uIEFSQ0hfSU5URUdSQVRPUiB8fCBBUkNIX1ZFUlNBVElMRV9QQiB8fCBNQUNIX1ZFUlNBVElMRV9BQiB8fCBBUkNIX09NQVA3MzAgfHwgQVJDSF9PTUFQMTZYWCB8fCBNQUNIX1JFQUxWSUVXX0VCIHx8IEFSQ0hfUE5YNDAwOCB8fCBBUkNIX05FVFggfHwgQ1BVX1MzQzI0MTIKKwlkZWZhdWx0IHkgaWYgQVJDSF9WRVJTQVRJTEVfUEIgfHwgTUFDSF9WRVJTQVRJTEVfQUIgfHwgQVJDSF9PTUFQNzMwIHx8IEFSQ0hfT01BUDE2WFggfHwgQVJDSF9QTlg0MDA4IHx8IEFSQ0hfTkVUWCB8fCBDUFVfUzNDMjQxMgogCXNlbGVjdCBDUFVfMzJ2NQogCXNlbGVjdCBDUFVfQUJSVF9FVjVUSgogCXNlbGVjdCBDUFVfQ0FDSEVfVklWVApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYyBiL2FyY2gvYXJtL253ZnBlL2ZwbW9kdWxlLmMKaW5kZXggMmRmZTFhYy4uN2Q5NzdkMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbndmcGUvZnBtb2R1bGUuYworKysgYi9hcmNoL2FybS9ud2ZwZS9mcG1vZHVsZS5jCkBAIC0zMyw3ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0vKiBYWFggKi8KKworI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CiAKICNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKICNpbmNsdWRlICJmcG9wY29kZS5oIgpAQCAtNTYsMTYgKzU3LDI4IEBACiBleHRlcm4gY2hhciBmcGVfdHlwZVtdOwogI2VuZGlmCiAKK3N0YXRpYyBpbnQgbndmcGVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnYpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB2OworCisJaWYgKGNtZCA9PSBUSFJFQURfTk9USUZZX0ZMVVNIKQorCQlud2ZwZV9pbml0X2ZwYSgmdGhyZWFkLT5mcHN0YXRlKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBud2ZwZV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG53ZnBlX25vdGlmeSwKK307CisKIC8qIGtlcm5lbCBmdW5jdGlvbiBwcm90b3R5cGVzIHJlcXVpcmVkICovCiB2b2lkIGZwX3NldHVwKHZvaWQpOwogCiAvKiBleHRlcm5hbCBkZWNsYXJhdGlvbnMgZm9yIHNhdmVkIGtlcm5lbCBzeW1ib2xzICovCiBleHRlcm4gdm9pZCAoKmtlcm5fZnBfZW50ZXIpKHZvaWQpOwotZXh0ZXJuIHZvaWQgKCpmcF9pbml0KSh1bmlvbiBmcF9zdGF0ZSAqKTsKIAogLyogT3JpZ2luYWwgdmFsdWUgb2YgZnBfZW50ZXIgZnJvbSBrZXJuZWwgYmVmb3JlIHBhdGNoZWQgYnkgZnBlX2luaXQuICovCiBzdGF0aWMgdm9pZCAoKm9yaWdfZnBfZW50ZXIpKHZvaWQpOwotc3RhdGljIHZvaWQgKCpvcmlnX2ZwX2luaXQpKHVuaW9uIGZwX3N0YXRlICopOwogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwogZXh0ZXJuIHZvaWQgbndmcGVfZW50ZXIodm9pZCk7CkBAIC04OCwyMCArMTAxLDIwIEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiTmV0V2luZGVyIEZsb2F0aW5nIFBvaW50IEVtdWxhdG9yIFYwLjk3ICgiCiAJICAgICAgIE5XRlBFX0JJVFMgIiBwcmVjaXNpb24pXG4iKTsKIAorCXRocmVhZF9yZWdpc3Rlcl9ub3RpZmllcigmbndmcGVfbm90aWZpZXJfYmxvY2spOworCiAJLyogU2F2ZSBwb2ludGVyIHRvIHRoZSBvbGQgRlAgaGFuZGxlciBhbmQgdGhlbiBwYXRjaCBvdXJzZWx2ZXMgaW4gKi8KIAlvcmlnX2ZwX2VudGVyID0ga2Vybl9mcF9lbnRlcjsKLQlvcmlnX2ZwX2luaXQgPSBmcF9pbml0OwogCWtlcm5fZnBfZW50ZXIgPSBud2ZwZV9lbnRlcjsKLQlmcF9pbml0ID0gbndmcGVfaW5pdF9mcGE7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZwZV9leGl0KHZvaWQpCiB7CisJdGhyZWFkX3VucmVnaXN0ZXJfbm90aWZpZXIoJm53ZnBlX25vdGlmaWVyX2Jsb2NrKTsKIAkvKiBSZXN0b3JlIHRoZSB2YWx1ZXMgd2Ugc2F2ZWQgZWFybGllci4gKi8KIAlrZXJuX2ZwX2VudGVyID0gb3JpZ19mcF9lbnRlcjsKLQlmcF9pbml0ID0gb3JpZ19mcF9pbml0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL3RpbWVyMzJrLmMgYi9hcmNoL2FybS9wbGF0LW9tYXAvdGltZXIzMmsuYwppbmRleCBiMmE5NDNiLi4zNDYxYTZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW9tYXAvdGltZXIzMmsuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvdGltZXIzMmsuYwpAQCAtMjEwLDcgKzIxMCw4IEBACiAKIAlub3cgPSBvbWFwXzMya19zeW5jX3RpbWVyX3JlYWQoKTsKIAotCXdoaWxlIChub3cgLSBvbWFwXzMya19sYXN0X3RpY2sgPj0gT01BUF8zMktfVElDS1NfUEVSX0haKSB7CisJd2hpbGUgKChzaWduZWQgbG9uZykobm93IC0gb21hcF8zMmtfbGFzdF90aWNrKQorCQkJCQkJPj0gT01BUF8zMktfVElDS1NfUEVSX0haKSB7CiAJCW9tYXBfMzJrX2xhc3RfdGljayArPSBPTUFQXzMyS19USUNLU19QRVJfSFo7CiAJCXRpbWVyX3RpY2socmVncyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL01ha2VmaWxlIGIvYXJjaC9hcm0vdmZwL01ha2VmaWxlCmluZGV4IGFmYWJhYzMuLjdlMTM2ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS92ZnAvTWFrZWZpbGUKQEAgLTcsNiArNyw5IEBACiAjIEVYVFJBX0NGTEFHUyA6PSAtRERFQlVHCiAjIEVYVFJBX0FGTEFHUyA6PSAtRERFQlVHCiAKK0FGTEFHUwkJOj0kKEFGTEFHUzotbXNvZnQtZmxvYXQ9LVdhLC1tZnB1PXNvZnR2ZnArdmZwKQorTERGTEFHUwkJKz0tLW5vLXdhcm4tbWlzbWF0Y2gKKwogb2JqLXkJCQkrPSB2ZnAubwogCi12ZnAtJChDT05GSUdfVkZQKQkrPSBlbnRyeS5vIHZmcG1vZHVsZS5vIHZmcGh3Lm8gdmZwc2luZ2xlLm8gdmZwZG91YmxlLm8KK3ZmcC0kKENPTkZJR19WRlApCSs9IHZmcG1vZHVsZS5vIGVudHJ5Lm8gdmZwaHcubyB2ZnBzaW5nbGUubyB2ZnBkb3VibGUubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcGh3LlMgYi9hcmNoL2FybS92ZnAvdmZwaHcuUwppbmRleCBhM2Y2NWI0Li5lYjY4M2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybS92ZnAvdmZwaHcuUworKysgYi9hcmNoL2FybS92ZnAvdmZwaHcuUwpAQCAtMTkyLDcgKzE5Miw3IEBACiAJYWRkCXBjLCBwYywgcjAsIGxzbCAjMwogCW1vdglyMCwgcjAKIAkuaXJwCWRyLDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUKLQltcnJjCXAxMSwgMSwgcjAsIHIxLCBjXGRyCUAgZm1ycmQJcjAsIHIxLCBkXGRyCisJZm1ycmQJcjAsIHIxLCBkXGRyCiAJbW92CXBjLCBscgogCS5lbmRyCiAKQEAgLTIwNiw2ICsyMDYsNiBAQAogCWFkZAlwYywgcGMsIHIwLCBsc2wgIzMKIAltb3YJcjAsIHIwCiAJLmlycAlkciwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1Ci0JbWNycglwMTEsIDEsIHIxLCByMiwgY1xkcglAIGZtZHJyCXIxLCByMiwgZFxkcgorCWZtZHJyCWRcZHIsIHIxLCByMgogCW1vdglwYywgbHIKIAkuZW5kcgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jIGIvYXJjaC9hcm0vdmZwL3ZmcG1vZHVsZS5jCmluZGV4IDAzNDg2YmUuLjI0NzZmNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3ZmcC92ZnBtb2R1bGUuYworKysgYi9hcmNoL2FybS92ZnAvdmZwbW9kdWxlLmMKQEAgLTE1LDYgKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS90aHJlYWRfbm90aWZ5Lmg+CiAjaW5jbHVkZSA8YXNtL3ZmcC5oPgogCiAjaW5jbHVkZSAidmZwaW5zdHIuaCIKQEAgLTM2LDM3ICszOCw1NCBAQAogICovCiB1bnNpZ25lZCBpbnQgVkZQX2FyY2g7CiAKLS8qCi0gKiBQZXItdGhyZWFkIFZGUCBpbml0aWFsaXNhdGlvbi4KLSAqLwotdm9pZCB2ZnBfZmx1c2hfdGhyZWFkKHVuaW9uIHZmcF9zdGF0ZSAqdmZwKQorc3RhdGljIGludCB2ZnBfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqdikKIHsKLQltZW1zZXQodmZwLCAwLCBzaXplb2YodW5pb24gdmZwX3N0YXRlKSk7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aHJlYWQgPSB2OworCXVuaW9uIHZmcF9zdGF0ZSAqdmZwID0gJnRocmVhZC0+dmZwc3RhdGU7CiAKLQl2ZnAtPmhhcmQuZnBleGMgPSBGUEVYQ19FTkFCTEU7Ci0JdmZwLT5oYXJkLmZwc2NyID0gRlBTQ1JfUk9VTkRfTkVBUkVTVDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVEhSRUFEX05PVElGWV9GTFVTSDoKKwkJLyoKKwkJICogUGVyLXRocmVhZCBWRlAgaW5pdGlhbGlzYXRpb24uCisJCSAqLworCQltZW1zZXQodmZwLCAwLCBzaXplb2YodW5pb24gdmZwX3N0YXRlKSk7CiAKLQkvKgotCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXNlIGl0IGZpcnN0LgotCSAqLwotCWZteHIoRlBFWEMsIGZtcngoRlBFWEMpICYgfkZQRVhDX0VOQUJMRSk7CisJCXZmcC0+aGFyZC5mcGV4YyA9IEZQRVhDX0VOQUJMRTsKKwkJdmZwLT5oYXJkLmZwc2NyID0gRlBTQ1JfUk9VTkRfTkVBUkVTVDsKIAotCS8qCi0JICogRW5zdXJlIHdlIGRvbid0IHRyeSB0byBvdmVyd3JpdGUgb3VyIG5ld2x5IGluaXRpYWxpc2VkCi0JICogc3RhdGUgaW5mb3JtYXRpb24gb24gdGhlIGZpcnN0IGZhdWx0LgotCSAqLwotCWlmIChsYXN0X1ZGUF9jb250ZXh0ID09IHZmcCkKLQkJbGFzdF9WRlBfY29udGV4dCA9IE5VTEw7CisJCS8qCisJCSAqIERpc2FibGUgVkZQIHRvIGVuc3VyZSB3ZSBpbml0aWFsaXNlIGl0IGZpcnN0LgorCQkgKi8KKwkJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU5BQkxFKTsKKworCQkvKgorCQkgKiBGQUxMVEhST1VHSDogRW5zdXJlIHdlIGRvbid0IHRyeSB0byBvdmVyd3JpdGUgb3VyIG5ld2x5CisJCSAqIGluaXRpYWxpc2VkIHN0YXRlIGluZm9ybWF0aW9uIG9uIHRoZSBmaXJzdCBmYXVsdC4KKwkJICovCisKKwljYXNlIFRIUkVBRF9OT1RJRllfUkVMRUFTRToKKwkJLyoKKwkJICogUGVyLXRocmVhZCBWRlAgY2xlYW51cC4KKwkJICovCisJCWlmIChsYXN0X1ZGUF9jb250ZXh0ID09IHZmcCkKKwkJCWxhc3RfVkZQX2NvbnRleHQgPSBOVUxMOworCQlicmVhazsKKworCWNhc2UgVEhSRUFEX05PVElGWV9TV0lUQ0g6CisJCS8qCisJCSAqIEFsd2F5cyBkaXNhYmxlIFZGUCBzbyB3ZSBjYW4gbGF6aWx5IHNhdmUvcmVzdG9yZSB0aGUKKwkJICogb2xkIHN0YXRlLgorCQkgKi8KKwkJZm14cihGUEVYQywgZm1yeChGUEVYQykgJiB+RlBFWENfRU5BQkxFKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi0vKgotICogUGVyLXRocmVhZCBWRlAgY2xlYW51cC4KLSAqLwotdm9pZCB2ZnBfcmVsZWFzZV90aHJlYWQodW5pb24gdmZwX3N0YXRlICp2ZnApCi17Ci0JaWYgKGxhc3RfVkZQX2NvbnRleHQgPT0gdmZwKQotCQlsYXN0X1ZGUF9jb250ZXh0ID0gTlVMTDsKLX0KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdmZwX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsCT0gdmZwX25vdGlmaWVyLAorfTsKIAogLyoKICAqIFJhaXNlIGEgU0lHRlBFIGZvciB0aGUgY3VycmVudCBwcm9jZXNzLgpAQCAtMjgxLDYgKzMwMCw4IEBACiAJCQkodmZwc2lkICYgRlBTSURfVkFSSUFOVF9NQVNLKSA+PiBGUFNJRF9WQVJJQU5UX0JJVCwKIAkJCSh2ZnBzaWQgJiBGUFNJRF9SRVZfTUFTSykgPj4gRlBTSURfUkVWX0JJVCk7CiAJCXZmcF92ZWN0b3IgPSB2ZnBfc3VwcG9ydF9lbnRyeTsKKworCQl0aHJlYWRfcmVnaXN0ZXJfbm90aWZpZXIoJnZmcF9ub3RpZmllcl9ibG9jayk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNpL2Jpb3MuYyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9kcml2ZXJzL3BjaS9iaW9zLmMKaW5kZXggMjRiYzE0OS4uMWU5ZDA2MiAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjMyL2RyaXZlcnMvcGNpL2Jpb3MuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIvZHJpdmVycy9wY2kvYmlvcy5jCkBAIC0yNyw4ICsyNyw2IEBACiAJLyogTGVhdmUgdm1fcGdvZmYgYXMtaXMsIHRoZSBQQ0kgc3BhY2UgYWRkcmVzcyBpcyB0aGUgcGh5c2ljYWwKIAkgKiBhZGRyZXNzIG9uIHRoaXMgcGxhdGZvcm0uCiAJICovCi0Jdm1hLT52bV9mbGFncyB8PSAoVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU8pOwotCiAJcHJvdCA9IHBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocHJvdCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKaW5kZXggYTliNTk1Mi4uODFkOTRlNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9mcnYva2VybmVsL2VudHJ5LlMKQEAgLTE0NzQsNyArMTQ3NCw3IEBACiAJLmxvbmcgc3lzX21rbm9kYXQKIAkubG9uZyBzeXNfZmNob3duYXQKIAkubG9uZyBzeXNfZnV0aW1lc2F0Ci0JLmxvbmcgc3lzX25ld2ZzdGF0YXQJCS8qIDMwMCAqLworCS5sb25nIHN5c19mc3RhdGF0NjQJCS8qIDMwMCAqLwogCS5sb25nIHN5c191bmxpbmthdAogCS5sb25nIHN5c19yZW5hbWVhdAogCS5sb25nIHN5c19saW5rYXQKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9mcnZfa3N5bXMuYyBiL2FyY2gvZnJ2L2tlcm5lbC9mcnZfa3N5bXMuYwppbmRleCAwZjI3M2E3Li5kZWU2MzdmIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvZnJ2X2tzeW1zLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL2Zydl9rc3ltcy5jCkBAIC0yNiwxNiArMjYsNiBAQAogRVhQT1JUX1NZTUJPTChfX2lvcmVtYXApOwogRVhQT1JUX1NZTUJPTChpb3VubWFwKTsKIAotRVhQT1JUX1NZTUJPTChzdHJubGVuKTsKLUVYUE9SVF9TWU1CT0woc3RycmNocik7Ci1FWFBPUlRfU1lNQk9MKHN0cnN0cik7Ci1FWFBPUlRfU1lNQk9MKHN0cmNocik7Ci1FWFBPUlRfU1lNQk9MKHN0cmNhdCk7Ci1FWFBPUlRfU1lNQk9MKHN0cmxlbik7Ci1FWFBPUlRfU1lNQk9MKHN0cmNtcCk7Ci1FWFBPUlRfU1lNQk9MKHN0cm5jbXApOwotRVhQT1JUX1NZTUJPTChzdHJuY3B5KTsKLQogRVhQT1JUX1NZTUJPTChpcF9mYXN0X2NzdW0pOwogCiAjaWYgMApAQCAtNDQsOCArMzQsNiBAQAogI2VuZGlmCiBFWFBPUlRfU1lNQk9MKGtlcm5lbF90aHJlYWQpOwogCi1FWFBPUlRfU1lNQk9MKGVuYWJsZV9pcnEpOwotRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycSk7CiBFWFBPUlRfU1lNQk9MKF9fcmVzX2J1c19jbG9ja19zcGVlZF9IWik7CiBFWFBPUlRfU1lNQk9MKF9fcGFnZV9vZmZzZXQpOwogRVhQT1JUX1NZTUJPTChfX21lbWNweV91c2VyKTsKQEAgLTYyLDE4ICs1MCwxMiBAQAogCiBFWFBPUlRfU1lNQk9MKF9fZGVidWdfYnVnX3RyYXApOwogCi0vKiBOZXR3b3JraW5nIGhlbHBlciByb3V0aW5lcy4gKi8KLUVYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOwotCiAvKiBUaGUgZm9sbG93aW5nIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleSdyZSBub3QgY2FsbGVkCiAgICBleHBsaWNpdGx5ICh0aGUgQyBjb21waWxlciBnZW5lcmF0ZXMgdGhlbSkuICBGb3J0dW5hdGVseSwKICAgIHRoZWlyIGludGVyZmFjZSBpc24ndCBnb25uYSBjaGFuZ2UgYW55IHRpbWUgc29vbiBub3csIHNvCiAgICBpdCdzIE9LIHRvIGxlYXZlIGl0IG91dCBvZiB2ZXJzaW9uIGNvbnRyb2wuICAqLwogRVhQT1JUX1NZTUJPTChtZW1jcHkpOwogRVhQT1JUX1NZTUJPTChtZW1zZXQpOwotRVhQT1JUX1NZTUJPTChtZW1jbXApOwotRVhQT1JUX1NZTUJPTChtZW1zY2FuKTsKLUVYUE9SVF9TWU1CT0wobWVtbW92ZSk7CiAKIEVYUE9SVF9TWU1CT0woX19vdXRzbF9ucyk7CiBFWFBPUlRfU1lNQk9MKF9faW5zbF9ucyk7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvaXJxLXJvdXRpbmcuYyBiL2FyY2gvZnJ2L2tlcm5lbC9pcnEtcm91dGluZy5jCmluZGV4IGQ0Nzc2ZDEuLmI5MGI3MGEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9pcnEtcm91dGluZy5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9pcnEtcm91dGluZy5jCkBAIC0xMTIsNyArMTEyLDcgQEAKICNkZWZpbmUgX19DUFVVQVJUKFgsIEEpCQkJCQkJXAogCVtYXSA9IHsJCQkJCQkJXAogCQkubXV4bmFtZQk9ICJ1YXJ0IiwJCQlcCi0JCS5tdXhkYXRhCT0gKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSBBLAlcCisJCS5tdXhkYXRhCT0gKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSh1bnNpZ25lZCBsb25nKUEsXAogCQkuaXJxbWFzawk9IDEgPDwgSVJRX0NQVV9VQVJUIyNYLAkJXAogCQkuZG9pcnEJCT0gZnJ2X2NwdXVhcnRfZG9pcnEsCQlcCiAJfQpAQCAtMTM2LDcgKzEzNiw3IEBACiAjZGVmaW5lIF9fQ1BVRE1BKFgsIEEpCQkJCQkJXAogCVtYXSA9IHsJCQkJCQkJXAogCQkubXV4bmFtZQk9ICJkbWEiLAkJCVwKLQkJLm11eGRhdGEJPSAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIEEsCVwKKwkJLm11eGRhdGEJPSAodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopKHVuc2lnbmVkIGxvbmcpQSxcCiAJCS5pcnFtYXNrCT0gMSA8PCBJUlFfQ1BVX0RNQSMjWCwJCVwKIAkJLmRvaXJxCQk9IGZydl9jcHVkbWFfZG9pcnEsCQlcCiAJfQpAQCAtMTY0LDcgKzE2NCw3IEBACiAjZGVmaW5lIF9fQ1BVVElNRVIoWCkJCQkJCQlcCiAJW1hdID0gewkJCQkJCQlcCiAJCS5tdXhuYW1lCT0gInRpbWVyIiwJCQlcCi0JCS5tdXhkYXRhCT0gMCwJCQkJXAorCQkubXV4ZGF0YQk9IE5VTEwsCQkJCVwKIAkJLmlycW1hc2sJPSAxIDw8IElSUV9DUFVfVElNRVIjI1gsCVwKIAkJLmRvaXJxCQk9IGZydl9jcHV0aW1lcl9kb2lycSwJCVwKIAl9CkBAIC0xODcsNyArMTg3LDcgQEAKICNkZWZpbmUgX19DUFVFWFRFUk5BTChYKQkJCQkJXAogCVtYXSA9IHsJCQkJCQkJXAogCQkubXV4bmFtZQk9ICJleHQiLAkJCVwKLQkJLm11eGRhdGEJPSAwLAkJCQlcCisJCS5tdXhkYXRhCT0gTlVMTCwJCQkJXAogCQkuaXJxbWFzawk9IDEgPDwgSVJRX0NQVV9FWFRFUk5BTCMjWCwJXAogCQkuZG9pcnEJCT0gZnJ2X2NwdWV4dGVybmFsX2RvaXJxLAlcCiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL2lycS5jIGIvYXJjaC9mcnYva2VybmVsL2lycS5jCmluZGV4IDExZmEzMjYuLjhiMTEyYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvaXJxLmMKQEAgLTYyNSw3ICs2MjUsNyBAQAogCiAjZGVmaW5lIEhFWF9ESUdJVFMgOAogCi1zdGF0aWMgdW5zaWduZWQgaW50IHBhcnNlX2hleF92YWx1ZSAoY29uc3QgY2hhciAqYnVmZmVyLAorc3RhdGljIHVuc2lnbmVkIGludCBwYXJzZV9oZXhfdmFsdWUgKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nICpyZXQpCiB7CiAJdW5zaWduZWQgY2hhciBoZXhudW0gW0hFWF9ESUdJVFNdOwpAQCAtNjcyLDcgKzY3Miw3IEBACiAJcmV0dXJuIHNwcmludGYgKHBhZ2UsICIlMDhseFxuIiwgKm1hc2spOwogfQogCi1zdGF0aWMgaW50IHByb2ZfY3B1X21hc2tfd3JpdGVfcHJvYyAoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwKK3N0YXRpYyBpbnQgcHJvZl9jcHVfbWFza193cml0ZV9wcm9jIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKIAkJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKIHsKIAl1bnNpZ25lZCBsb25nICptYXNrID0gKHVuc2lnbmVkIGxvbmcgKikgZGF0YSwgZnVsbF9jb3VudCA9IGNvdW50LCBlcnI7CkBAIC03MTEsNyArNzExLDcgQEAKIAlpbnQgaTsKIAogCS8qIGNyZWF0ZSAvcHJvYy9pcnEgKi8KLQlyb290X2lycV9kaXIgPSBwcm9jX21rZGlyKCJpcnEiLCAwKTsKKwlyb290X2lycV9kaXIgPSBwcm9jX21rZGlyKCJpcnEiLCBOVUxMKTsKIAogCS8qIGNyZWF0ZSAvcHJvYy9pcnEvcHJvZl9jcHVfbWFzayAqLwogCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInByb2ZfY3B1X21hc2siLCAwNjAwLCByb290X2lycV9kaXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3BtLmMgYi9hcmNoL2Zydi9rZXJuZWwvcG0uYwppbmRleCBmMGI4ZmZmLi40M2NlMjhhMTMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9wbS5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9wbS5jCkBAIC0xMzcsNyArMTM3LDcgQEAKICNkZWZpbmUgQ1RMX1BNX1AwIDQKICNkZWZpbmUgQ1RMX1BNX0NNIDUKIAotc3RhdGljIGludCB1c2VyX2F0b2koY2hhciAqdWJ1Ziwgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgdXNlcl9hdG9pKGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgbGVuKQogewogCWNoYXIgYnVmWzE2XTsKIAl1bnNpZ25lZCBsb25nIHJldDsKQEAgLTE1OSw3ICsxNTksNyBAQAogICogU2VuZCB1cyB0byBzbGVlcC4KICAqLwogc3RhdGljIGludCBzeXNjdGxfcG1fZG9fc3VzcGVuZChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCQl2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQorCQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQogewogCWludCByZXR2YWwsIG1vZGU7CiAKQEAgLTIxNSw3ICsyMTUsNyBAQAogCiAKIHN0YXRpYyBpbnQgY21vZGVfcHJvY2N0bChjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJCSB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQorCQkJIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQogewogCWludCBuZXdfY21vZGU7CiAKQEAgLTIyNyw5ICsyMjcsOSBAQAogCXJldHVybiB0cnlfc2V0X2Ntb2RlKG5ld19jbW9kZSk/OipsZW5wOwogfQogCi1zdGF0aWMgaW50IGNtb2RlX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLCBpbnQgKm5hbWUsIGludCBubGVuLAotCQkJdm9pZCAqb2xkdmFsLCBzaXplX3QgKm9sZGxlbnAsCi0JCQl2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorc3RhdGljIGludCBjbW9kZV9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCQl2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkJdm9pZCBfX3VzZXIgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCiB7CiAJaWYgKG9sZHZhbCAmJiBvbGRsZW5wKSB7CiAJCXNpemVfdCBvbGRsZW47CkBAIC0yNDAsNyArMjQwLDcgQEAKIAkJaWYgKG9sZGxlbiAhPSBzaXplb2YoaW50KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChwdXRfdXNlcihjbG9ja19jbW9kZV9jdXJyZW50LCAodW5zaWduZWQgaW50ICopb2xkdmFsKSB8fAorCQlpZiAocHV0X3VzZXIoY2xvY2tfY21vZGVfY3VycmVudCwgKHVuc2lnbmVkIF9fdXNlciAqKW9sZHZhbCkgfHwKIAkJICAgIHB1dF91c2VyKHNpemVvZihpbnQpLCBvbGRsZW5wKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KQEAgLTI1MCw3ICsyNTAsNyBAQAogCQlpZiAobmV3bGVuICE9IHNpemVvZihpbnQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKGdldF91c2VyKG5ld19jbW9kZSwgKGludCAqKW5ld3ZhbCkpCisJCWlmIChnZXRfdXNlcihuZXdfY21vZGUsIChpbnQgX191c2VyICopbmV3dmFsKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCiAJCXJldHVybiB0cnlfc2V0X2Ntb2RlKG5ld19jbW9kZSk/OjE7CkBAIC0zMTgsNyArMzE4LDcgQEAKIH0KIAogc3RhdGljIGludCBwMF9wcm9jY3RsKGN0bF90YWJsZSAqY3RsLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQorCQkgICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqZnBvcykKIHsKIAlpbnQgbmV3X3AwOwogCkBAIC0zMzAsOSArMzMwLDkgQEAKIAlyZXR1cm4gdHJ5X3NldF9wMChuZXdfcDApPzoqbGVucDsKIH0KIAotc3RhdGljIGludCBwMF9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50ICpuYW1lLCBpbnQgbmxlbiwKLQkJICAgICB2b2lkICpvbGR2YWwsIHNpemVfdCAqb2xkbGVucCwKLQkJICAgICB2b2lkICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQorc3RhdGljIGludCBwMF9zeXNjdGwoY3RsX3RhYmxlICp0YWJsZSwgaW50IF9fdXNlciAqbmFtZSwgaW50IG5sZW4sCisJCSAgICAgdm9pZCBfX3VzZXIgKm9sZHZhbCwgc2l6ZV90IF9fdXNlciAqb2xkbGVucCwKKwkJICAgICB2b2lkIF9fdXNlciAqbmV3dmFsLCBzaXplX3QgbmV3bGVuLCB2b2lkICoqY29udGV4dCkKIHsKIAlpZiAob2xkdmFsICYmIG9sZGxlbnApIHsKIAkJc2l6ZV90IG9sZGxlbjsKQEAgLTM0Myw3ICszNDMsNyBAQAogCQlpZiAob2xkbGVuICE9IHNpemVvZihpbnQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKHB1dF91c2VyKGNsb2NrX3AwX2N1cnJlbnQsICh1bnNpZ25lZCBpbnQgKilvbGR2YWwpIHx8CisJCWlmIChwdXRfdXNlcihjbG9ja19wMF9jdXJyZW50LCAodW5zaWduZWQgX191c2VyICopb2xkdmFsKSB8fAogCQkgICAgcHV0X3VzZXIoc2l6ZW9mKGludCksIG9sZGxlbnApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCWlmIChuZXdsZW4gIT0gc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoZ2V0X3VzZXIobmV3X3AwLCAoaW50ICopbmV3dmFsKSkKKwkJaWYgKGdldF91c2VyKG5ld19wMCwgKGludCBfX3VzZXIgKiluZXd2YWwpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJcmV0dXJuIHRyeV9zZXRfcDAobmV3X3AwKT86MTsKQEAgLTM2Miw3ICszNjIsNyBAQAogfQogCiBzdGF0aWMgaW50IGNtX3Byb2NjdGwoY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCSAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKmZwb3MpCisJCSAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpmcG9zKQogewogCWludCBuZXdfY207CiAKQEAgLTM3NCw5ICszNzQsOSBAQAogCXJldHVybiB0cnlfc2V0X2NtKG5ld19jbSk/OipsZW5wOwogfQogCi1zdGF0aWMgaW50IGNtX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLCBpbnQgKm5hbWUsIGludCBubGVuLAotCQkgICAgIHZvaWQgKm9sZHZhbCwgc2l6ZV90ICpvbGRsZW5wLAotCQkgICAgIHZvaWQgKm5ld3ZhbCwgc2l6ZV90IG5ld2xlbiwgdm9pZCAqKmNvbnRleHQpCitzdGF0aWMgaW50IGNtX3N5c2N0bChjdGxfdGFibGUgKnRhYmxlLCBpbnQgX191c2VyICpuYW1lLCBpbnQgbmxlbiwKKwkJICAgICB2b2lkIF9fdXNlciAqb2xkdmFsLCBzaXplX3QgX191c2VyICpvbGRsZW5wLAorCQkgICAgIHZvaWQgX191c2VyICpuZXd2YWwsIHNpemVfdCBuZXdsZW4sIHZvaWQgKipjb250ZXh0KQogewogCWlmIChvbGR2YWwgJiYgb2xkbGVucCkgewogCQlzaXplX3Qgb2xkbGVuOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCWlmIChvbGRsZW4gIT0gc2l6ZW9mKGludCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAocHV0X3VzZXIoY2xvY2tfY21fY3VycmVudCwgKHVuc2lnbmVkIGludCAqKW9sZHZhbCkgfHwKKwkJaWYgKHB1dF91c2VyKGNsb2NrX2NtX2N1cnJlbnQsICh1bnNpZ25lZCBfX3VzZXIgKilvbGR2YWwpIHx8CiAJCSAgICBwdXRfdXNlcihzaXplb2YoaW50KSwgb2xkbGVucCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0zOTcsNyArMzk3LDcgQEAKIAkJaWYgKG5ld2xlbiAhPSBzaXplb2YoaW50KSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChnZXRfdXNlcihuZXdfY20sIChpbnQgKiluZXd2YWwpKQorCQlpZiAoZ2V0X3VzZXIobmV3X2NtLCAoaW50IF9fdXNlciAqKW5ld3ZhbCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQlyZXR1cm4gdHJ5X3NldF9jbShuZXdfY20pPzoxOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvZnJ2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggMGZmZjhhNi4uNDg5ZTZjNCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yNDYsNyArMjQ2LDcgQEAKIC8qCiAgKiBzeXNfZXhlY3ZlKCkgZXhlY3V0ZXMgYSBuZXcgcHJvZ3JhbS4KICAqLwotYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApCithc21saW5rYWdlIGludCBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICpuYW1lLCBjaGFyIF9fdXNlciAqIF9fdXNlciAqYXJndiwgY2hhciBfX3VzZXIgKiBfX3VzZXIgKmVudnApCiB7CiAJaW50IGVycm9yOwogCWNoYXIgKiBmaWxlbmFtZTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKaW5kZXggNTkwOGRlYS4uMWY3ZDY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NldHVwLmMKQEAgLTgxNCw3ICs4MTQsNyBAQAogCSAqIC0gYnkgbm93IHRoZSBzdGFjayBpcyBwYXJ0IG9mIHRoZSBpbml0IHRhc2sgKi8KIAlwcmludGsoIk1lbW9yeSAlMDhseC0lMDhseFxuIiwgbWVtb3J5X3N0YXJ0LCBtZW1vcnlfZW5kKTsKIAotCWlmIChtZW1vcnlfc3RhcnQgPT0gbWVtb3J5X2VuZCkgQlVHKCk7CisJQlVHX09OKG1lbW9yeV9zdGFydCA9PSBtZW1vcnlfZW5kKTsKIAogCWluaXRfbW0uc3RhcnRfY29kZSA9ICh1bnNpZ25lZCBsb25nKSAmX3N0ZXh0OwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dDsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYwppbmRleCA2NzljMWQ1Li5iOGE1ODgyIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCkBAIC05OCw3ICs5OCw3IEBACiAKIHN0cnVjdCBzaWdmcmFtZQogewotCXZvaWQgKCpwcmV0Y29kZSkodm9pZCk7CisJX19zaWdyZXN0b3JlX3QgcHJldGNvZGU7CiAJaW50IHNpZzsKIAlzdHJ1Y3Qgc2lnY29udGV4dCBzYzsKIAl1bnNpZ25lZCBsb25nIGV4dHJhbWFza1tfTlNJR19XT1JEUy0xXTsKQEAgLTEwNywxMCArMTA3LDEwIEBACiAKIHN0cnVjdCBydF9zaWdmcmFtZQogewotCXZvaWQgKCpwcmV0Y29kZSkodm9pZCk7CisJX19zaWdyZXN0b3JlX3QgcHJldGNvZGU7CiAJaW50IHNpZzsKLQlzdHJ1Y3Qgc2lnaW5mbyAqcGluZm87Ci0Jdm9pZCAqcHVjOworCXN0cnVjdCBzaWdpbmZvIF9fdXNlciAqcGluZm87CisJdm9pZCBfX3VzZXIgKnB1YzsKIAlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB1Y29udGV4dCB1YzsKIAl1aW50MzJfdCByZXRjb2RlWzJdOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIAkvKiBUaGlzIGlzIHRoZSBYL09wZW4gc2FuY3Rpb25lZCBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLiAgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgewotCQlpZiAoISBvbl9zaWdfc3RhY2soc3ApKQorCQlpZiAoISBzYXNfc3NfZmxhZ3Moc3ApKQogCQkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKIAl9CiAKQEAgLTI4NCw3ICsyODQsNyBAQAogCQkgKglzZXRsb3MJI19fTlJfc2lncmV0dXJuLGdyNwogCQkgKgl0aXJhCWdyMCwwCiAJCSAqLwotCQlpZiAoX19wdXRfdXNlcigodm9pZCAoKikodm9pZCkpZnJhbWUtPnJldGNvZGUsICZmcmFtZS0+cHJldGNvZGUpIHx8CisJCWlmIChfX3B1dF91c2VyKChfX3NpZ3Jlc3RvcmVfdClmcmFtZS0+cmV0Y29kZSwgJmZyYW1lLT5wcmV0Y29kZSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoMHg4ZWZjMDAwMHxfX05SX3NpZ3JldHVybiwgJmZyYW1lLT5yZXRjb2RlWzBdKSB8fAogCQkgICAgX19wdXRfdXNlcigweGMwNzAwMDAwLCAmZnJhbWUtPnJldGNvZGVbMV0pKQogCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CkBAIC0zMDAsNyArMzAwLDcgQEAKIAogCWlmIChnZXRfcGVyc29uYWxpdHkgJiBGRFBJQ19GVU5DUFRSUykgewogCQlzdHJ1Y3QgZmRwaWNfZnVuY19kZXNjcmlwdG9yIF9fdXNlciAqZnVuY3B0ciA9Ci0JCQkoc3RydWN0IGZkcGljX2Z1bmNfZGVzY3JpcHRvciAqKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwkJCShzdHJ1Y3QgZmRwaWNfZnVuY19kZXNjcmlwdG9yIF9fdXNlciAqKSBrYS0+c2Euc2FfaGFuZGxlcjsKIAkJX19nZXRfdXNlcihfX2ZyYW1lLT5wYywgJmZ1bmNwdHItPnRleHQpOwogCQlfX2dldF91c2VyKF9fZnJhbWUtPmdyMTUsICZmdW5jcHRyLT5HT1QpOwogCX0gZWxzZSB7CkBAIC0zNTksOCArMzU5LDggQEAKIAogCS8qIENyZWF0ZSB0aGUgdWNvbnRleHQuICAqLwogCWlmIChfX3B1dF91c2VyKDAsICZmcmFtZS0+dWMudWNfZmxhZ3MpIHx8Ci0JICAgIF9fcHV0X3VzZXIoMCwgJmZyYW1lLT51Yy51Y19saW5rKSB8fAotCSAgICBfX3B1dF91c2VyKCh2b2lkKiljdXJyZW50LT5zYXNfc3Nfc3AsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc3ApIHx8CisJICAgIF9fcHV0X3VzZXIoTlVMTCwgJmZyYW1lLT51Yy51Y19saW5rKSB8fAorCSAgICBfX3B1dF91c2VyKCh2b2lkIF9fdXNlciAqKWN1cnJlbnQtPnNhc19zc19zcCwgJmZyYW1lLT51Yy51Y19zdGFjay5zc19zcCkgfHwKIAkgICAgX19wdXRfdXNlcihzYXNfc3NfZmxhZ3MoX19mcmFtZS0+c3ApLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX2ZsYWdzKSB8fAogCSAgICBfX3B1dF91c2VyKGN1cnJlbnQtPnNhc19zc19zaXplLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NpemUpKQogCQlnb3RvIGdpdmVfc2lnc2VndjsKQEAgLTM4Miw3ICszODIsNyBAQAogCQkgKglzZXRsb3MJI19fTlJfc2lncmV0dXJuLGdyNwogCQkgKgl0aXJhCWdyMCwwCiAJCSAqLwotCQlpZiAoX19wdXRfdXNlcigodm9pZCAoKikodm9pZCkpZnJhbWUtPnJldGNvZGUsICZmcmFtZS0+cHJldGNvZGUpIHx8CisJCWlmIChfX3B1dF91c2VyKChfX3NpZ3Jlc3RvcmVfdClmcmFtZS0+cmV0Y29kZSwgJmZyYW1lLT5wcmV0Y29kZSkgfHwKIAkJICAgIF9fcHV0X3VzZXIoMHg4ZWZjMDAwMHxfX05SX3J0X3NpZ3JldHVybiwgJmZyYW1lLT5yZXRjb2RlWzBdKSB8fAogCQkgICAgX19wdXRfdXNlcigweGMwNzAwMDAwLCAmZnJhbWUtPnJldGNvZGVbMV0pKQogCQkJZ290byBnaXZlX3NpZ3NlZ3Y7CkBAIC0zOTgsNyArMzk4LDcgQEAKIAlfX2ZyYW1lLT5ncjkgPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOwogCiAJaWYgKGdldF9wZXJzb25hbGl0eSAmIEZEUElDX0ZVTkNQVFJTKSB7Ci0JCXN0cnVjdCBmZHBpY19mdW5jX2Rlc2NyaXB0b3IgKmZ1bmNwdHIgPQorCQlzdHJ1Y3QgZmRwaWNfZnVuY19kZXNjcmlwdG9yIF9fdXNlciAqZnVuY3B0ciA9CiAJCQkoc3RydWN0IGZkcGljX2Z1bmNfZGVzY3JpcHRvciBfX3VzZXIgKikga2EtPnNhLnNhX2hhbmRsZXI7CiAJCV9fZ2V0X3VzZXIoX19mcmFtZS0+cGMsICZmdW5jcHRyLT50ZXh0KTsKIAkJX19nZXRfdXNlcihfX2ZyYW1lLT5ncjE1LCAmZnVuY3B0ci0+R09UKTsKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMgYi9hcmNoL2Zydi9rZXJuZWwvc3lzX2Zydi5jCmluZGV4IDkzMWFhNmQuLmM0ZDQzNDggMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9zeXNfZnJ2LmMKKysrIGIvYXJjaC9mcnYva2VybmVsL3N5c19mcnYuYwpAQCAtMzIsNyArMzIsNyBAQAogICogc3lzX3BpcGUoKSBpcyB0aGUgbm9ybWFsIEMgY2FsbGluZyBzdGFuZGFyZCBmb3IgY3JlYXRpbmcKICAqIGEgcGlwZS4gSXQncyBub3QgdGhlIHdheSB1bml4IHRyYWRpdGlvbmFsbHkgZG9lcyB0aGlzLCB0aG91Z2guCiAgKi8KLWFzbWxpbmthZ2UgbG9uZyBzeXNfcGlwZSh1bnNpZ25lZCBsb25nICogZmlsZGVzKQorYXNtbGlua2FnZSBsb25nIHN5c19waXBlKHVuc2lnbmVkIGxvbmcgX191c2VyICogZmlsZGVzKQogewogCWludCBmZFsyXTsKIAlpbnQgZXJyb3I7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvc3lzY3RsLmMgYi9hcmNoL2Zydi9rZXJuZWwvc3lzY3RsLmMKaW5kZXggNDA4YjBmMy4uYjkwODg2MyAxMDA2NDQKLS0tIGEvYXJjaC9mcnYva2VybmVsL3N5c2N0bC5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9zeXNjdGwuYwpAQCAtNDksNyArNDksNyBAQAogICogaGFuZGxlIHJlcXVlc3RzIHRvIGR5bmFtaWNhbGx5IHN3aXRjaCB0aGUgd3JpdGUgY2FjaGluZyBtb2RlIGRlbGl2ZXJlZCBieSAvcHJvYwogICovCiBzdGF0aWMgaW50IHByb2NjdGxfZnJ2X2NhY2hlbW9kZShjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxwLAotCQkJCSB2b2lkICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAl1bnNpZ25lZCBsb25nIGhzcjA7CiAJY2hhciBidWZmWzhdOwpAQCAtMTIzLDcgKzEyMyw3IEBACiAgKi8KICNpZmRlZiBDT05GSUdfTU1VCiBzdGF0aWMgaW50IHByb2NjdGxfZnJ2X3Bpbl9jeG5yKGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwgc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKKwkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKIAlwaWRfdCBwaWQ7CiAJY2hhciBidWZmWzE2XSwgKnA7CmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvdWFjY2Vzcy5jIGIvYXJjaC9mcnYva2VybmVsL3VhY2Nlc3MuYwppbmRleCA5Yjc1MWMwLi45ZmI3NzFhIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9rZXJuZWwvdWFjY2Vzcy5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC91YWNjZXNzLmMKQEAgLTE3LDcgKzE3LDcgQEAKIC8qCiAgKiBjb3B5IGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIHVzZXJzcGFjZQogICovCi1sb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KQorbG9uZyBzdHJuY3B5X2Zyb21fdXNlcihjaGFyICpkc3QsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXg7CiAJY2hhciAqcCwgY2g7CkBAIC03MCw5ICs3MCw5IEBACiAgKgogICogUmV0dXJuIDAgb24gZXhjZXB0aW9uLCBhIHZhbHVlIGdyZWF0ZXIgdGhhbiBOIGlmIHRvbyBsb25nCiAgKi8KLWxvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgKnNyYywgbG9uZyBjb3VudCkKK2xvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgY291bnQpCiB7Ci0JY29uc3QgY2hhciAqcDsKKwljb25zdCBjaGFyIF9fdXNlciAqcDsKIAlsb25nIGVyciA9IDA7CiAJY2hhciBjaDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktaXJxLmMKaW5kZXggYzRhMTE0NC4uNDVhZTM5ZCAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS1pcnEuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLWlycS5jCkBAIC0zMiwxMSArMzIsMTEgQEAKICAqLwogCiBzdGF0aWMgY29uc3QgdWludDhfdCBfX2luaXRkYXRhIHBjaV9idXMwX2lycV9yb3V0aW5nWzMyXVs0XSA9IHsKLQlbMCBdIHsJSVJRX0ZQR0FfTUI4Njk0M19QQ0lfSU5UQSB9LAotCVsxNl0gewlJUlFfRlBHQV9SVEw4MDI5X0lOVEEgfSwKLQlbMTddIHsJSVJRX0ZQR0FfUENJX0lOVEMsIElSUV9GUEdBX1BDSV9JTlRELCBJUlFfRlBHQV9QQ0lfSU5UQSwgSVJRX0ZQR0FfUENJX0lOVEIgfSwKLQlbMThdIHsJSVJRX0ZQR0FfUENJX0lOVEIsIElSUV9GUEdBX1BDSV9JTlRDLCBJUlFfRlBHQV9QQ0lfSU5URCwgSVJRX0ZQR0FfUENJX0lOVEEgfSwKLQlbMTldIHsJSVJRX0ZQR0FfUENJX0lOVEEsIElSUV9GUEdBX1BDSV9JTlRCLCBJUlFfRlBHQV9QQ0lfSU5UQywgSVJRX0ZQR0FfUENJX0lOVEQgfSwKKwlbMCBdID0geyBJUlFfRlBHQV9NQjg2OTQzX1BDSV9JTlRBIH0sCisJWzE2XSA9IHsgSVJRX0ZQR0FfUlRMODAyOV9JTlRBIH0sCisJWzE3XSA9IHsgSVJRX0ZQR0FfUENJX0lOVEMsIElSUV9GUEdBX1BDSV9JTlRELCBJUlFfRlBHQV9QQ0lfSU5UQSwgSVJRX0ZQR0FfUENJX0lOVEIgfSwKKwlbMThdID0geyBJUlFfRlBHQV9QQ0lfSU5UQiwgSVJRX0ZQR0FfUENJX0lOVEMsIElSUV9GUEdBX1BDSV9JTlRELCBJUlFfRlBHQV9QQ0lfSU5UQSB9LAorCVsxOV0gPSB7IElSUV9GUEdBX1BDSV9JTlRBLCBJUlFfRlBHQV9QQ0lfSU5UQiwgSVJRX0ZQR0FfUENJX0lOVEMsIElSUV9GUEdBX1BDSV9JTlREIH0sCiB9OwogCiB2b2lkIF9faW5pdCBwY2liaW9zX2lycV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9tbS9rbWFwLmMgYi9hcmNoL2Zydi9tbS9rbWFwLmMKaW5kZXggYzU0ZjE4ZS4uNDBiNjJjNSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbW0va21hcC5jCisrKyBiL2FyY2gvZnJ2L21tL2ttYXAuYwpAQCAtMzEsMTUgKzMxLDE1IEBACiAgKiBNYXAgc29tZSBwaHlzaWNhbCBhZGRyZXNzIHJhbmdlIGludG8gdGhlIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgogICovCiAKLXZvaWQgKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBjYWNoZWZsYWcpCit2b2lkIF9faW9tZW0gKl9faW9yZW1hcCh1bnNpZ25lZCBsb25nIHBoeXNhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBjYWNoZWZsYWcpCiB7Ci0JcmV0dXJuICh2b2lkICopcGh5c2FkZHI7CisJcmV0dXJuICh2b2lkIF9faW9tZW0gKilwaHlzYWRkcjsKIH0KIAogLyoKICAqIFVubWFwIGEgaW9yZW1hcCgpZWQgcmVnaW9uIGFnYWluCiAgKi8KLXZvaWQgaW91bm1hcCh2b2lkICphZGRyKQordm9pZCBpb3VubWFwKHZvaWQgdm9sYXRpbGUgX19pb21lbSAqYWRkcikKIHsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9oODMwMC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCBmMTNkNWU4Li43Nzg3ZjcwIDEwMDY0NAotLS0gYS9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2g4MzAwL2tlcm5lbC9zaWduYWwuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiAKIAkvKiBUaGlzIGlzIHRoZSBYL09wZW4gc2FuY3Rpb25lZCBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLiAgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgewotCQlpZiAoIW9uX3NpZ19zdGFjayh1c3ApKQorCQlpZiAoIXNhc19zc19mbGFncyh1c3ApKQogCQkJdXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CiAJfQogCXJldHVybiAodm9pZCAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggOGRmYTMwNS4uMTU5NjEwMSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTE3Myw2ICsxNzMsMTIgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAJZGVwZW5kcyBvbiBOVU1BICYmIChYODZfU1VNTUlUIHx8IFg4Nl9HRU5FUklDQVJDSCkKKwlzZWxlY3QgQUNQSV9OVU1BCisKK2NvbmZpZyBIQVZFX0FSQ0hfUEFSU0VfU1JBVAorICAgICAgIGJvb2wKKyAgICAgICBkZWZhdWx0IHkKKyAgICAgICBkZXBlbmRzIG9uIEFDUElfU1JBVAogCiBjb25maWcgWDg2X1NVTU1JVF9OVU1BCiAJYm9vbApAQCAtMjI0LDcgKzIzMCw2IEBACiBjb25maWcgU0NIRURfU01UCiAJYm9vbCAiU01UIChIeXBlcnRocmVhZGluZykgc2NoZWR1bGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTVAKLQlkZWZhdWx0IG9mZgogCWhlbHAKIAkgIFNNVCBzY2hlZHVsZXIgc3VwcG9ydCBpbXByb3ZlcyB0aGUgQ1BVIHNjaGVkdWxlcidzIGRlY2lzaW9uIG1ha2luZwogCSAgd2hlbiBkZWFsaW5nIHdpdGggSW50ZWwgUGVudGl1bSA0IGNoaXBzIHdpdGggSHlwZXJUaHJlYWRpbmcgYXQgYQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggNDBlNWFiYS4uOTdjYTE3MSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0yMDIsNiArMjAyLDggQEAKIAkJaWYgKG1jZmctPmNvbmZpZ1tpXS5iYXNlX3Jlc2VydmVkKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYCiAJCQkgICAgICAgIk1NQ09ORklHIG5vdCBpbiBsb3cgNEdCIG9mIG1lbW9yeVxuIik7CisJCQlrZnJlZShwY2lfbW1jZmdfY29uZmlnKTsKKwkJCXBjaV9tbWNmZ19jb25maWdfbnVtID0gMDsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfQpAQCAtMjE1LDcgKzIxNyw3IEBACiB7CiAJc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqbWFkdCA9IE5VTEw7CiAKLQlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSkKKwlpZiAoIXBoeXNfYWRkciB8fCAhc2l6ZSB8fCAhY3B1X2hhc19hcGljKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1hZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfbWFkdCAqKV9fYWNwaV9tYXBfdGFibGUocGh5c19hZGRyLCBzaXplKTsKQEAgLTYyMSw5ICs2MjMsOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BhcnNlX2ZhZHQodW5zaWduZWQgbG9uZyBwaHlzLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7Ci0Jc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpmYWR0ID0gTlVMTDsKKwlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpmYWR0ID0gTlVMTDsKIAotCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopX19hY3BpX21hcF90YWJsZShwaHlzLCBzaXplKTsKKwlmYWR0ID0gKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKilfX2FjcGlfbWFwX3RhYmxlKHBoeXMsIHNpemUpOwogCWlmICghZmFkdCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiVW5hYmxlIHRvIG1hcCBGQURUXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC03NTQsNyArNzU2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKCFjcHVfaGFzX2FwaWMpCisJaWYgKCFjcHVfaGFzX2FwaWMpIAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvcHJvY2Vzc29yLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvcHJvY2Vzc29yLmMKaW5kZXggOWY0Y2MwMi4uYjU0ZmRlZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYwpAQCAtNDcsNyArNDcsNyBAQAogCWJ1ZlsyXSA9IEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVA7CiAKIAlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9FU1QpKQotCQlidWZbMl0gfD0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOworCQlidWZbMl0gfD0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU1dTTVA7CiAKIAlvYmotPnR5cGUgPSBBQ1BJX1RZUEVfQlVGRkVSOwogCW9iai0+YnVmZmVyLmxlbmd0aCA9IDEyOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3NsZWVwLmMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwppbmRleCAxY2IyYjE4Li40ZWU4MzU3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvc2xlZXAuYwpAQCAtOCwzMCArOCwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorCiAjaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCiAvKiBhZGRyZXNzIGluIGxvdyBtZW1vcnkgb2YgdGhlIHdha2V1cCByb3V0aW5lLiAqLwogdW5zaWduZWQgbG9uZyBhY3BpX3dha2V1cF9hZGRyZXNzID0gMDsKIHVuc2lnbmVkIGxvbmcgYWNwaV92aWRlb19mbGFnczsKIGV4dGVybiBjaGFyIHdha2V1cF9zdGFydCwgd2FrZXVwX2VuZDsKIAotZXh0ZXJuIHZvaWQgemFwX2xvd19tYXBwaW5ncyh2b2lkKTsKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgRkFTVENBTEwoYWNwaV9jb3B5X3dha2V1cF9yb3V0aW5lKHVuc2lnbmVkIGxvbmcpKTsKIAotc3RhdGljIHZvaWQgaW5pdF9sb3dfbWFwcGluZyhwZ2RfdCAqIHBnZCwgaW50IHBnZF9saW1pdCkKLXsKLQlpbnQgcGdkX29mcyA9IDA7Ci0KLQl3aGlsZSAoKHBnZF9vZnMgPCBwZ2RfbGltaXQpCi0JICAgICAgICYmIChwZ2Rfb2ZzICsgVVNFUl9QVFJTX1BFUl9QR0QgPCBQVFJTX1BFUl9QR0QpKSB7Ci0JCXNldF9wZ2QocGdkLCAqKHBnZCArIFVTRVJfUFRSU19QRVJfUEdEKSk7Ci0JCXBnZF9vZnMrKywgcGdkKys7Ci0JfQotCWZsdXNoX3RsYl9hbGwoKTsKLX0KLQogLyoqCiAgKiBhY3BpX3NhdmVfc3RhdGVfbWVtIC0gc2F2ZSBrZXJuZWwgc3RhdGUKICAqCkBAIC00Miw3ICsyOSw2IEBACiB7CiAJaWYgKCFhY3BpX3dha2V1cF9hZGRyZXNzKQogCQlyZXR1cm4gMTsKLQlpbml0X2xvd19tYXBwaW5nKHN3YXBwZXJfcGdfZGlyLCBVU0VSX1BUUlNfUEVSX1BHRCk7CiAJbWVtY3B5KCh2b2lkICopYWNwaV93YWtldXBfYWRkcmVzcywgJndha2V1cF9zdGFydCwKIAkgICAgICAgJndha2V1cF9lbmQgLSAmd2FrZXVwX3N0YXJ0KTsKIAlhY3BpX2NvcHlfd2FrZXVwX3JvdXRpbmUoYWNwaV93YWtldXBfYWRkcmVzcyk7CkBAIC01NSw3ICs0MSw2IEBACiAgKi8KIHZvaWQgYWNwaV9yZXN0b3JlX3N0YXRlX21lbSh2b2lkKQogewotCXphcF9sb3dfbWFwcGluZ3MoKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvd2FrZXVwLlMKaW5kZXggN2M3NGZlMC4uOWY0MDhlZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL3dha2V1cC5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS93YWtldXAuUwpAQCAtNTYsNyArNTYsNyBAQAogMToKIAogCSMgc2V0IHVwIHBhZ2UgdGFibGUKLQltb3ZsCSRzd2FwcGVyX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCAlZWF4CisJbW92bAkkc3dzdXNwX3BnX2Rpci1fX1BBR0VfT0ZGU0VULCAlZWF4CiAJbW92bAklZWF4LCAlY3IzCiAKIAl0ZXN0bAkkMSwgcmVhbF9lZmVyX3NhdmVfcmVzdG9yZSAtIHdha2V1cF9jb2RlCkBAIC0yNjUsMTEgKzI2NSw2IEBACiAJbW92bAkkMHgxMjM0NTY3OCwgc2F2ZWRfbWFnaWMKIAlyZXQKIAotLmRhdGEKLUFMSUdOCi1FTlRSWShzYXZlZF9tYWdpYykJLmxvbmcJMAotRU5UUlkoc2F2ZWRfZWlwKQkubG9uZwkwCi0KIHNhdmVfcmVnaXN0ZXJzOgogCWxlYWwJNCglZXNwKSwgJWVheAogCW1vdmwJJWVheCwgc2F2ZWRfY29udGV4dF9lc3AKQEAgLTMwNCw3ICsyOTksMTEgQEAKIAljYWxsCXJlc3RvcmVfcHJvY2Vzc29yX3N0YXRlCiAJcmV0CiAKKy5kYXRhCiBBTElHTgorRU5UUlkoc2F2ZWRfbWFnaWMpCS5sb25nCTAKK0VOVFJZKHNhdmVkX2VpcCkJLmxvbmcJMAorCiAjIHNhdmVkIHJlZ2lzdGVycwogc2F2ZWRfZ2R0OgkubG9uZwkwLDAKIHNhdmVkX2lkdDoJLmxvbmcJMCwwCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCmluZGV4IDNkNGIyZjMuLjVhYjU5YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBpYy5jCkBAIC02Miw3ICs2Miw3IEBACiAKIHN0YXRpYyB2b2lkIGFwaWNfcG1fYWN0aXZhdGUodm9pZCk7CiAKLWludCBtb2Rlcm5fYXBpYyh2b2lkKQorc3RhdGljIGludCBtb2Rlcm5fYXBpYyh2b2lkKQogewogCXVuc2lnbmVkIGludCBsdnIsIHZlcnNpb247CiAJLyogQU1EIHN5c3RlbXMgdXNlIG9sZCBBUElDIHZlcnNpb25zLCBzbyBjaGVjayB0aGUgQ1BVICovCkBAIC0xMTMsNyArMTEzLDcgQEAKIH0KIAogLyogVXNpbmcgQVBJQyB0byBnZW5lcmF0ZSBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0PyAqLwotaW50IHVzaW5nX2FwaWNfdGltZXIgPSAwOworaW50IHVzaW5nX2FwaWNfdGltZXIgX19yZWFkX21vc3RseSA9IDA7CiAKIHN0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCmluZGV4IGRmMGUxNzQuLjllODE5ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYwpAQCAtMzc0LDE0ICszNzQsMTQgQEAKIAl1bnNpZ25lZCBzaG9ydAlzZWdtZW50OwogfQkJCQlhcG1fYmlvc19lbnRyeTsKIHN0YXRpYyBpbnQJCQljbG9ja19zbG93ZWQ7Ci1zdGF0aWMgaW50CQkJaWRsZV90aHJlc2hvbGQgPSBERUZBVUxUX0lETEVfVEhSRVNIT0xEOwotc3RhdGljIGludAkJCWlkbGVfcGVyaW9kID0gREVGQVVMVF9JRExFX1BFUklPRDsKK3N0YXRpYyBpbnQJCQlpZGxlX3RocmVzaG9sZCBfX3JlYWRfbW9zdGx5ID0gREVGQVVMVF9JRExFX1RIUkVTSE9MRDsKK3N0YXRpYyBpbnQJCQlpZGxlX3BlcmlvZCBfX3JlYWRfbW9zdGx5ID0gREVGQVVMVF9JRExFX1BFUklPRDsKIHN0YXRpYyBpbnQJCQlzZXRfcG1faWRsZTsKIHN0YXRpYyBpbnQJCQlzdXNwZW5kc19wZW5kaW5nOwogc3RhdGljIGludAkJCXN0YW5kYnlzX3BlbmRpbmc7CiBzdGF0aWMgaW50CQkJaWdub3JlX3N5c19zdXNwZW5kOwogc3RhdGljIGludAkJCWlnbm9yZV9ub3JtYWxfcmVzdW1lOwotc3RhdGljIGludAkJCWJvdW5jZV9pbnRlcnZhbCA9IERFRkFVTFRfQk9VTkNFX0lOVEVSVkFMOworc3RhdGljIGludAkJCWJvdW5jZV9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ID0gREVGQVVMVF9CT1VOQ0VfSU5URVJWQUw7CiAKICNpZmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKICMJZGVmaW5lCWNsb2NrX2Ntb3NfZGlmZgkwCkBAIC0zOTAsOCArMzkwLDggQEAKIHN0YXRpYyBsb25nCQkJY2xvY2tfY21vc19kaWZmOwogc3RhdGljIGludAkJCWdvdF9jbG9ja19kaWZmOwogI2VuZGlmCi1zdGF0aWMgaW50CQkJZGVidWc7Ci1zdGF0aWMgaW50CQkJc21wOworc3RhdGljIGludAkJCWRlYnVnIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50CQkJc21wIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgaW50CQkJYXBtX2Rpc2FibGVkID0gLTE7CiAjaWZkZWYgQ09ORklHX1NNUAogc3RhdGljIGludAkJCXBvd2VyX29mZjsKQEAgLTQwMyw4ICs0MDMsOCBAQAogI2Vsc2UKIHN0YXRpYyBpbnQJCQlyZWFsbW9kZV9wb3dlcl9vZmY7CiAjZW5kaWYKLXN0YXRpYyBpbnQJCQlleGl0X2thcG1kOwotc3RhdGljIGludAkJCWthcG1kX3J1bm5pbmc7CitzdGF0aWMgaW50CQkJZXhpdF9rYXBtZCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludAkJCWthcG1kX3J1bm5pbmcgX19yZWFkX21vc3RseTsKICNpZmRlZiBDT05GSUdfQVBNX0FMTE9XX0lOVFMKIHN0YXRpYyBpbnQJCQlhbGxvd19pbnRzID0gMTsKICNlbHNlCkBAIC00MTYsMTUgKzQxNiwxNSBAQAogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGFwbV9zdXNwZW5kX3dhaXRxdWV1ZSk7CiBzdGF0aWMgc3RydWN0IGFwbV91c2VyICoJdXNlcl9saXN0Owogc3RhdGljIERFRklORV9TUElOTE9DSyh1c2VyX2xpc3RfbG9jayk7Ci1zdGF0aWMgc3RydWN0IGRlc2Nfc3RydWN0CWJhZF9iaW9zX2Rlc2MgPSB7IDAsIDB4MDA0MDkyMDAgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QJYmFkX2Jpb3NfZGVzYyA9IHsgMCwgMHgwMDQwOTIwMCB9OwogCi1zdGF0aWMgY2hhcgkJCWRyaXZlcl92ZXJzaW9uW10gPSAiMS4xNmFjIjsJLyogbm8gc3BhY2VzICovCitzdGF0aWMgY29uc3QgY2hhcgkJZHJpdmVyX3ZlcnNpb25bXSA9ICIxLjE2YWMiOwkvKiBubyBzcGFjZXMgKi8KIAogLyoKICAqCUFQTSBldmVudCBuYW1lcyB0YWtlbiBmcm9tIHRoZSBBUE0gMS4yIHNwZWNpZmljYXRpb24uIFRoZXNlIGFyZQogICoJdGhlIG1lc3NhZ2UgY29kZXMgdGhhdCB0aGUgQklPUyB1c2VzIHRvIHRlbGwgdXMgYWJvdXQgZXZlbnRzCiAgKi8KLXN0YXRpYyBjaGFyICoJYXBtX2V2ZW50X25hbWVbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICoJY29uc3QgYXBtX2V2ZW50X25hbWVbXSA9IHsKIAkic3lzdGVtIHN0YW5kYnkiLAogCSJzeXN0ZW0gc3VzcGVuZCIsCiAJIm5vcm1hbCByZXN1bWUiLApAQCAtNjE2LDcgKzYxNiw3IEBACiAgKglAZWN4X2luOiBFQ1ggcmVnaXN0ZXIgdmFsdWUgZm9yIEJJT1MgY2FsbAogICoJQGVheDogRUFYIHJlZ2lzdGVyIG9uIHJldHVybiBmcm9tIHRoZSBCSU9TIGNhbGwKICAqCi0gKglNYWtlIGEgQklPUyBjYWxsIHRoYXQgZG9lcyBvbmx5IHJldHVybnMgb25lIHZhbHVlLCBvciBqdXN0IHN0YXR1cy4KKyAqCU1ha2UgYSBCSU9TIGNhbGwgdGhhdCByZXR1cm5zIG9uZSB2YWx1ZSBvbmx5LCBvciBqdXN0IHN0YXR1cy4KICAqCUlmIHRoZXJlIGlzIGFuIGVycm9yLCB0aGVuIHRoZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIGluIEFICiAgKgkoYml0cyA4LTE1IG9mIGVheCkgYW5kIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBub24temVyby4gVGhpcyBpcwogICoJdXNlZCBmb3Igc2ltcGxlciBCSU9TIG9wZXJhdGlvbnMuIFRoaXMgY2FsbCBtYXkgaG9sZCBpbnRlcnJ1cHRzCkBAIC04MjIsNyArODIyLDcgQEAKICNkZWZpbmUgSURMRV9DQUxDX0xJTUlUICAgKEhaICogMTAwKQogI2RlZmluZSBJRExFX0xFQUtZX01BWCAgICAxNgogCi1zdGF0aWMgdm9pZCAoKm9yaWdpbmFsX3BtX2lkbGUpKHZvaWQpOworc3RhdGljIHZvaWQgKCpvcmlnaW5hbF9wbV9pZGxlKSh2b2lkKSBfX3JlYWRfbW9zdGx5OwogCiAvKioKICAqIGFwbV9jcHVfaWRsZQkJLQljcHUgaWRsaW5nIGZvciBBUE0gY2FwYWJsZSBMaW51eApAQCAtMTA2Myw3ICsxMDYzLDggQEAKICAKIHN0YXRpYyBpbnQgYXBtX2NvbnNvbGVfYmxhbmsoaW50IGJsYW5rKQogewotCWludCBlcnJvciwgaTsKKwlpbnQgZXJyb3IgPSBBUE1fTk9UX0VOR0FHRUQ7IC8qIHNpbGVuY2UgZ2NjICovCisJaW50IGk7CiAJdV9zaG9ydCBzdGF0ZTsKIAlzdGF0aWMgY29uc3QgdV9zaG9ydCBkZXZbM10gPSB7IDB4MTAwLCAweDFGRiwgMHgxMDEgfTsKIApAQCAtMTEwNCw3ICsxMTA1LDggQEAKIAogc3RhdGljIGFwbV9ldmVudF90IGdldF9xdWV1ZWRfZXZlbnQoc3RydWN0IGFwbV91c2VyICphcykKIHsKLQlhcy0+ZXZlbnRfdGFpbCA9IChhcy0+ZXZlbnRfdGFpbCArIDEpICUgQVBNX01BWF9FVkVOVFM7CisJaWYgKCsrYXMtPmV2ZW50X3RhaWwgPj0gQVBNX01BWF9FVkVOVFMpCisJCWFzLT5ldmVudF90YWlsID0gMDsKIAlyZXR1cm4gYXMtPmV2ZW50c1thcy0+ZXZlbnRfdGFpbF07CiB9CiAKQEAgLTExMTgsMTMgKzExMjAsMTYgQEAKIAlmb3IgKGFzID0gdXNlcl9saXN0OyBhcyAhPSBOVUxMOyBhcyA9IGFzLT5uZXh0KSB7CiAJCWlmICgoYXMgPT0gc2VuZGVyKSB8fCAoIWFzLT5yZWFkZXIpKQogCQkJY29udGludWU7Ci0JCWFzLT5ldmVudF9oZWFkID0gKGFzLT5ldmVudF9oZWFkICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwkJaWYgKCsrYXMtPmV2ZW50X2hlYWQgPj0gQVBNX01BWF9FVkVOVFMpCisJCQlhcy0+ZXZlbnRfaGVhZCA9IDA7CisKIAkJaWYgKGFzLT5ldmVudF9oZWFkID09IGFzLT5ldmVudF90YWlsKSB7CiAJCQlzdGF0aWMgaW50IG5vdGlmaWVkOwogCiAJCQlpZiAobm90aWZpZWQrKyA9PSAwKQogCQkJICAgIHByaW50ayhLRVJOX0VSUiAiYXBtOiBhbiBldmVudCBxdWV1ZSBvdmVyZmxvd2VkXG4iKTsKLQkJCWFzLT5ldmVudF90YWlsID0gKGFzLT5ldmVudF90YWlsICsgMSkgJSBBUE1fTUFYX0VWRU5UUzsKKwkJCWlmICgrK2FzLT5ldmVudF90YWlsID49IEFQTV9NQVhfRVZFTlRTKQorCQkJCWFzLT5ldmVudF90YWlsID0gMDsKIAkJfQogCQlhcy0+ZXZlbnRzW2FzLT5ldmVudF9oZWFkXSA9IGV2ZW50OwogCQlpZiAoKCFhcy0+c3VzZXIpIHx8ICghYXMtPndyaXRlcikpCkBAIC0xMjgyLDcgKzEyODcsNyBAQAogc3RhdGljIGFwbV9ldmVudF90IGdldF9ldmVudCh2b2lkKQogewogCWludAkJZXJyb3I7Ci0JYXBtX2V2ZW50X3QJZXZlbnQ7CisJYXBtX2V2ZW50X3QJZXZlbnQgPSBBUE1fTk9fRVZFTlRTOyAvKiBzaWxlbmNlIGdjYyAqLwogCWFwbV9ldmVudGluZm9fdAlpbmZvOwogCiAJc3RhdGljIGludCBub3RpZmllZDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggYTA2YTQ5MC4uNDRmMmM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTExLDYgKzExLDggQEAKICNpbmNsdWRlIDxhc20vbXNyLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbWNlLmg+CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9hY3BpLWNwdWZyZXEuYwppbmRleCAxYTdiZGNlLi41ZmQ2NTMyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKQEAgLTQ4LDEyICs0OCwxMyBAQAogCiAKIHN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gewotCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQlhY3BpX2RhdGE7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSphY3BpX2RhdGE7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlCQkqZnJlcV90YWJsZTsKIAl1bnNpZ25lZCBpbnQJCQkJcmVzdW1lOwogfTsKIAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmFjcGlfaW9fZGF0YVtOUl9DUFVTXTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJKmFjcGlfcGVyZl9kYXRhW05SX0NQVVNdOwogCiBzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGFjcGlfY3B1ZnJlcV9kcml2ZXI7CiAKQEAgLTEwNCw2NCArMTA1LDQzIEBACiB7CiAJdTE2CQkJcG9ydCA9IDA7CiAJdTgJCQliaXRfd2lkdGggPSAwOwotCWludAkJCXJldDsKLQl1MzIJCQl2YWx1ZSA9IDA7CiAJaW50CQkJaSA9IDA7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXMgICAgY3B1ZnJlcV9mcmVxczsKLQljcHVtYXNrX3QJCXNhdmVkX21hc2s7CisJaW50CQkJcmV0ID0gMDsKKwl1MzIJCQl2YWx1ZSA9IDA7CiAJaW50CQkJcmV0dmFsOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQkqcGVyZjsKIAogCWRwcmludGsoImFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZVxuIik7CiAKLQkvKgotCSAqIFRCRDogVXNlIHNvbWV0aGluZyBvdGhlciB0aGFuIHNldF9jcHVzX2FsbG93ZWQuCi0JICogQXMgc2V0X2NwdXNfYWxsb3dlZCBpcyBhIGJpdCByYWN5LCAKLQkgKiB3aXRoIGFueSBvdGhlciBzZXRfY3B1c19hbGxvd2VkIGZvciB0aGlzIHByb2Nlc3MuCi0JICovCi0Jc2F2ZWRfbWFzayA9IGN1cnJlbnQtPmNwdXNfYWxsb3dlZDsKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KGNwdSkpOwotCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gY3B1KSB7Ci0JCXJldHVybiAoLUVBR0FJTik7Ci0JfQotCQotCWlmIChzdGF0ZSA9PSBkYXRhLT5hY3BpX2RhdGEuc3RhdGUpIHsKKwlyZXR2YWwgPSAwOworCXBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CQorCWlmIChzdGF0ZSA9PSBwZXJmLT5zdGF0ZSkgewogCQlpZiAodW5saWtlbHkoZGF0YS0+cmVzdW1lKSkgewogCQkJZHByaW50aygiQ2FsbGVkIGFmdGVyIHJlc3VtZSwgcmVzZXR0aW5nIHRvIFAlZFxuIiwgc3RhdGUpOwogCQkJZGF0YS0+cmVzdW1lID0gMDsKIAkJfSBlbHNlIHsKIAkJCWRwcmludGsoIkFscmVhZHkgYXQgdGFyZ2V0IHN0YXRlIChQJWQpXG4iLCBzdGF0ZSk7Ci0JCQlyZXR2YWwgPSAwOwotCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJCXJldHVybiAocmV0dmFsKTsKIAkJfQogCX0KIAotCWRwcmludGsoIlRyYW5zaXRpb25pbmcgZnJvbSBQJWQgdG8gUCVkXG4iLAotCQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUsIHN0YXRlKTsKLQotCS8qIGNwdWZyZXEgZnJlcXVlbmN5IHN0cnVjdCAqLwotCWNwdWZyZXFfZnJlcXMuY3B1ID0gY3B1OwotCWNwdWZyZXFfZnJlcXMub2xkID0gZGF0YS0+ZnJlcV90YWJsZVtkYXRhLT5hY3BpX2RhdGEuc3RhdGVdLmZyZXF1ZW5jeTsKLQljcHVmcmVxX2ZyZXFzLm5ldyA9IGRhdGEtPmZyZXFfdGFibGVbc3RhdGVdLmZyZXF1ZW5jeTsKLQotCS8qIG5vdGlmeSBjcHVmcmVxICovCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmY3B1ZnJlcV9mcmVxcywgQ1BVRlJFUV9QUkVDSEFOR0UpOworCWRwcmludGsoIlRyYW5zaXRpb25pbmcgZnJvbSBQJWQgdG8gUCVkXG4iLCBwZXJmLT5zdGF0ZSwgc3RhdGUpOwogCiAJLyoKIAkgKiBGaXJzdCB3ZSB3cml0ZSB0aGUgdGFyZ2V0IHN0YXRlJ3MgJ2NvbnRyb2wnIHZhbHVlIHRvIHRoZQogCSAqIGNvbnRyb2xfcmVnaXN0ZXIuCiAJICovCiAKLQlwb3J0ID0gZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuYWRkcmVzczsKLQliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuY29udHJvbF9yZWdpc3Rlci5iaXRfd2lkdGg7Ci0JdmFsdWUgPSAodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW3N0YXRlXS5jb250cm9sOworCXBvcnQgPSBwZXJmLT5jb250cm9sX3JlZ2lzdGVyLmFkZHJlc3M7CisJYml0X3dpZHRoID0gcGVyZi0+Y29udHJvbF9yZWdpc3Rlci5iaXRfd2lkdGg7CisJdmFsdWUgPSAodTMyKSBwZXJmLT5zdGF0ZXNbc3RhdGVdLmNvbnRyb2w7CiAKIAlkcHJpbnRrKCJXcml0aW5nIDB4JTA4eCB0byBwb3J0IDB4JTA0eFxuIiwgdmFsdWUsIHBvcnQpOwogCiAJcmV0ID0gYWNwaV9wcm9jZXNzb3Jfd3JpdGVfcG9ydChwb3J0LCBiaXRfd2lkdGgsIHZhbHVlKTsKIAlpZiAocmV0KSB7CiAJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7Ci0JCXJldHZhbCA9IHJldDsKLQkJZ290byBtaWdyYXRlX2VuZDsKKwkJcmV0dXJuIChyZXQpOwogCX0KIAogCS8qCkBAIC0xNzcsNDggKzE1NywzNSBAQAogCQkgKiBiZWZvcmUgZ2l2aW5nIHVwLgogCQkgKi8KIAotCQlwb3J0ID0gZGF0YS0+YWNwaV9kYXRhLnN0YXR1c19yZWdpc3Rlci5hZGRyZXNzOwotCQliaXRfd2lkdGggPSBkYXRhLT5hY3BpX2RhdGEuc3RhdHVzX3JlZ2lzdGVyLmJpdF93aWR0aDsKKwkJcG9ydCA9IHBlcmYtPnN0YXR1c19yZWdpc3Rlci5hZGRyZXNzOworCQliaXRfd2lkdGggPSBwZXJmLT5zdGF0dXNfcmVnaXN0ZXIuYml0X3dpZHRoOwogCiAJCWRwcmludGsoIkxvb2tpbmcgZm9yIDB4JTA4eCBmcm9tIHBvcnQgMHglMDR4XG4iLAotCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKKwkJCSh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uc3RhdHVzLCBwb3J0KTsKIAotCQlmb3IgKGk9MDsgaTwxMDA7IGkrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKIAkJCXJldCA9IGFjcGlfcHJvY2Vzc29yX3JlYWRfcG9ydChwb3J0LCBiaXRfd2lkdGgsICZ2YWx1ZSk7CiAJCQlpZiAocmV0KSB7CQogCQkJCWRwcmludGsoIkludmFsaWQgcG9ydCB3aWR0aCAweCUwNHhcbiIsIGJpdF93aWR0aCk7Ci0JCQkJcmV0dmFsID0gcmV0OwotCQkJCWdvdG8gbWlncmF0ZV9lbmQ7CisJCQkJcmV0dXJuIChyZXQpOwogCQkJfQotCQkJaWYgKHZhbHVlID09ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLnN0YXR1cykKKwkJCWlmICh2YWx1ZSA9PSAodTMyKSBwZXJmLT5zdGF0ZXNbc3RhdGVdLnN0YXR1cykKIAkJCQlicmVhazsKIAkJCXVkZWxheSgxMCk7CiAJCX0KIAl9IGVsc2UgewotCQl2YWx1ZSA9ICh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbc3RhdGVdLnN0YXR1czsKKwkJdmFsdWUgPSAodTMyKSBwZXJmLT5zdGF0ZXNbc3RhdGVdLnN0YXR1czsKIAl9CiAKLQkvKiBub3RpZnkgY3B1ZnJlcSAqLwotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlpZiAodW5saWtlbHkodmFsdWUgIT0gKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSkgewotCQl1bnNpZ25lZCBpbnQgdG1wID0gY3B1ZnJlcV9mcmVxcy5uZXc7Ci0JCWNwdWZyZXFfZnJlcXMubmV3ID0gY3B1ZnJlcV9mcmVxcy5vbGQ7Ci0JCWNwdWZyZXFfZnJlcXMub2xkID0gdG1wOwotCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZjcHVmcmVxX2ZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0JCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmNwdWZyZXFfZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJaWYgKHVubGlrZWx5KHZhbHVlICE9ICh1MzIpIHBlcmYtPnN0YXRlc1tzdGF0ZV0uc3RhdHVzKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJhY3BpLWNwdWZyZXE6IFRyYW5zaXRpb24gZmFpbGVkXG4iKTsKIAkJcmV0dmFsID0gLUVOT0RFVjsKLQkJZ290byBtaWdyYXRlX2VuZDsKKwkJcmV0dXJuIChyZXR2YWwpOwogCX0KIAogCWRwcmludGsoIlRyYW5zaXRpb24gc3VjY2Vzc2Z1bCBhZnRlciAlZCBtaWNyb3NlY29uZHNcbiIsIGkgKiAxMCk7CiAKLQlkYXRhLT5hY3BpX2RhdGEuc3RhdGUgPSBzdGF0ZTsKLQotCXJldHZhbCA9IDA7Ci1taWdyYXRlX2VuZDoKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIHNhdmVkX21hc2spOworCXBlcmYtPnN0YXRlID0gc3RhdGU7CiAJcmV0dXJuIChyZXR2YWwpOwogfQogCkBAIC0yMzAsOCArMTk3LDE3IEBACiAJdW5zaWduZWQgaW50IHJlbGF0aW9uKQogewogCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8gKmRhdGEgPSBhY3BpX2lvX2RhdGFbcG9saWN5LT5jcHVdOworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqcGVyZjsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyBmcmVxczsKKwljcHVtYXNrX3Qgb25saW5lX3BvbGljeV9jcHVzOworCWNwdW1hc2tfdCBzYXZlZF9tYXNrOworCWNwdW1hc2tfdCBzZXRfbWFzazsKKwljcHVtYXNrX3QgY292ZXJlZF9jcHVzOworCXVuc2lnbmVkIGludCBjdXJfc3RhdGUgPSAwOwogCXVuc2lnbmVkIGludCBuZXh0X3N0YXRlID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQgajsKKwl1bnNpZ25lZCBpbnQgdG1wOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX3NldHBvbGljeVxuIik7CiAKQEAgLTI0MCwxMSArMjE2LDk1IEBACiAJCQl0YXJnZXRfZnJlcSwKIAkJCXJlbGF0aW9uLAogCQkJJm5leHRfc3RhdGUpOwotCWlmIChyZXN1bHQpCisJaWYgKHVubGlrZWx5KHJlc3VsdCkpCiAJCXJldHVybiAocmVzdWx0KTsKIAotCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3NldF9wZXJmb3JtYW5jZSAoZGF0YSwgcG9saWN5LT5jcHUsIG5leHRfc3RhdGUpOworCXBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CisJY3VyX3N0YXRlID0gcGVyZi0+c3RhdGU7CisJZnJlcXMub2xkID0gZGF0YS0+ZnJlcV90YWJsZVtjdXJfc3RhdGVdLmZyZXF1ZW5jeTsKKwlmcmVxcy5uZXcgPSBkYXRhLT5mcmVxX3RhYmxlW25leHRfc3RhdGVdLmZyZXF1ZW5jeTsKIAorI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCS8qIGNwdWZyZXEgaG9sZHMgdGhlIGhvdHBsdWcgbG9jaywgc28gd2UgYXJlIHNhZmUgZnJvbSBoZXJlIG9uICovCisJY3B1c19hbmQob25saW5lX3BvbGljeV9jcHVzLCBjcHVfb25saW5lX21hcCwgcG9saWN5LT5jcHVzKTsKKyNlbHNlCisJb25saW5lX3BvbGljeV9jcHVzID0gcG9saWN5LT5jcHVzOworI2VuZGlmCisKKwlmb3JfZWFjaF9jcHVfbWFzayhqLCBvbmxpbmVfcG9saWN5X2NwdXMpIHsKKwkJZnJlcXMuY3B1ID0gajsKKwkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwl9CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gY2FsbCBkcml2ZXItPnRhcmdldCgpIG9uIGFsbCBvciBhbnkgQ1BVIGluCisJICogcG9saWN5LT5jcHVzLCBkZXBlbmRpbmcgb24gcG9saWN5LT5zaGFyZWRfdHlwZS4KKwkgKi8KKwlzYXZlZF9tYXNrID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOworCWNwdXNfY2xlYXIoY292ZXJlZF9jcHVzKTsKKwlmb3JfZWFjaF9jcHVfbWFzayhqLCBvbmxpbmVfcG9saWN5X2NwdXMpIHsKKwkJLyoKKwkJICogU3VwcG9ydCBmb3IgU01QIHN5c3RlbXMuCisJCSAqIE1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyBvbiBDUFUgdGhhdCB3YW50cyB0byBjaGFuZ2UgZnJlcQorCQkgKi8KKwkJY3B1c19jbGVhcihzZXRfbWFzayk7CisJCWlmIChwb2xpY3ktPnNoYXJlZF90eXBlID09IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZKQorCQkJY3B1c19vcihzZXRfbWFzaywgc2V0X21hc2ssIG9ubGluZV9wb2xpY3lfY3B1cyk7CisJCWVsc2UKKwkJCWNwdV9zZXQoaiwgc2V0X21hc2spOworCisJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgc2V0X21hc2spOworCQlpZiAodW5saWtlbHkoIWNwdV9pc3NldChzbXBfcHJvY2Vzc29yX2lkKCksIHNldF9tYXNrKSkpIHsKKwkJCWRwcmludGsoImNvdWxkbid0IGxpbWl0IHRvIENQVXMgaW4gdGhpcyBkb21haW5cbiIpOworCQkJcmVzdWx0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJcmVzdWx0ID0gYWNwaV9wcm9jZXNzb3Jfc2V0X3BlcmZvcm1hbmNlIChkYXRhLCBqLCBuZXh0X3N0YXRlKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJcmVzdWx0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBvbGljeS0+c2hhcmVkX3R5cGUgPT0gQ1BVRlJFUV9TSEFSRURfVFlQRV9BTlkpCisJCQlicmVhazsKKyAKKwkJY3B1X3NldChqLCBjb3ZlcmVkX2NwdXMpOworCX0KKworCWZvcl9lYWNoX2NwdV9tYXNrKGosIG9ubGluZV9wb2xpY3lfY3B1cykgeworCQlmcmVxcy5jcHUgPSBqOworCQljcHVmcmVxX25vdGlmeV90cmFuc2l0aW9uKCZmcmVxcywgQ1BVRlJFUV9QT1NUQ0hBTkdFKTsKKwl9CisKKwlpZiAodW5saWtlbHkocmVzdWx0KSkgeworCQkvKgorCQkgKiBXZSBoYXZlIGZhaWxlZCBoYWxmd2F5IHRocm91Z2ggdGhlIGZyZXF1ZW5jeSBjaGFuZ2UuCisJCSAqIFdlIGhhdmUgc2VudCBjYWxsYmFja3MgdG8gb25saW5lX3BvbGljeV9jcHVzIGFuZAorCQkgKiBhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2UoKSBoYXMgYmVlbiBjYWxsZWQgb24gCisJCSAqIGNvdmVyZF9jcHVzLiBCZXN0IGVmZm9ydCB1bmRvLi4KKwkJICovCisKKwkJaWYgKCFjcHVzX2VtcHR5KGNvdmVyZWRfY3B1cykpIHsKKwkJCWZvcl9lYWNoX2NwdV9tYXNrKGosIGNvdmVyZWRfY3B1cykgeworCQkJCXBvbGljeS0+Y3B1ID0gajsKKwkJCQlhY3BpX3Byb2Nlc3Nvcl9zZXRfcGVyZm9ybWFuY2UgKGRhdGEsIAorCQkJCQkJaiwgCisJCQkJCQljdXJfc3RhdGUpOworCQkJfQorCQl9CisKKwkJdG1wID0gZnJlcXMubmV3OworCQlmcmVxcy5uZXcgPSBmcmVxcy5vbGQ7CisJCWZyZXFzLm9sZCA9IHRtcDsKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgb25saW5lX3BvbGljeV9jcHVzKSB7CisJCQlmcmVxcy5jcHUgPSBqOworCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCQl9CisJfQorCisJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKIAlyZXR1cm4gKHJlc3VsdCk7CiB9CiAKQEAgLTI3MCwzMCArMzMwLDY1IEBACiAJc3RydWN0IGNwdWZyZXFfYWNwaV9pbwkqZGF0YSwKIAl1bnNpZ25lZCBpbnQJCWNwdSkKIHsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UJKnBlcmYgPSBkYXRhLT5hY3BpX2RhdGE7CisKIAlpZiAoY3B1X2toeikgewogCQkvKiBzZWFyY2ggdGhlIGNsb3Nlc3QgbWF0Y2ggdG8gY3B1X2toeiAqLwogCQl1bnNpZ25lZCBpbnQgaTsKIAkJdW5zaWduZWQgbG9uZyBmcmVxOwotCQl1bnNpZ25lZCBsb25nIGZyZXFuID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CisJCXVuc2lnbmVkIGxvbmcgZnJlcW4gPSBwZXJmLT5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCi0JCWZvciAoaT0wOyBpIDwgKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCAtIDEpOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IChwZXJmLT5zdGF0ZV9jb3VudCAtIDEpOyBpKyspIHsKIAkJCWZyZXEgPSBmcmVxbjsKLQkJCWZyZXFuID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpKzFdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJCWZyZXFuID0gcGVyZi0+c3RhdGVzW2krMV0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwogCQkJaWYgKCgyICogY3B1X2toeikgPiAoZnJlcW4gKyBmcmVxKSkgewotCQkJCWRhdGEtPmFjcGlfZGF0YS5zdGF0ZSA9IGk7CisJCQkJcGVyZi0+c3RhdGUgPSBpOwogCQkJCXJldHVybiAoZnJlcSk7CiAJCQl9CiAJCX0KLQkJZGF0YS0+YWNwaV9kYXRhLnN0YXRlID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IC0gMTsKKwkJcGVyZi0+c3RhdGUgPSBwZXJmLT5zdGF0ZV9jb3VudCAtIDE7CiAJCXJldHVybiAoZnJlcW4pOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCS8qIGFzc3VtZSBDUFUgaXMgYXQgUDAuLi4gKi8KLQkJZGF0YS0+YWNwaV9kYXRhLnN0YXRlID0gMDsKLQkJcmV0dXJuIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOwotCQorCQlwZXJmLT5zdGF0ZSA9IDA7CisJCXJldHVybiBwZXJmLT5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCX0KIH0KIAogCisvKgorICogYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXQgLSBpbml0aWFsaXplIEFDUEkgUC1TdGF0ZXMgbGlicmFyeQorICoKKyAqIEluaXRpYWxpemUgdGhlIEFDUEkgUC1TdGF0ZXMgbGlicmFyeSAoZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMpCisgKiBpbiBvcmRlciB0byBkZXRlcm1pbmUgY29ycmVjdCBmcmVxdWVuY3kgYW5kIHZvbHRhZ2UgcGFpcmluZ3MuIFdlIGNhbgorICogZG8gX1BEQyBhbmQgX1BTRCBhbmQgZmluZCBvdXQgdGhlIHByb2Nlc3NvciBkZXBlbmRlbmN5IGZvciB0aGUKKyAqIGFjdHVhbCBpbml0IHRoYXQgd2lsbCBoYXBwZW4gbGF0ZXIuLi4KKyAqLworc3RhdGljIGludCBhY3BpX2NwdWZyZXFfZWFybHlfaW5pdF9hY3BpKHZvaWQpCit7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSpkYXRhOworCXVuc2lnbmVkIGludAkJCQlpLCBqOworCisJZHByaW50aygiYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRcbiIpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSksIAorCQkJR0ZQX0tFUk5FTCk7CisJCWlmICghZGF0YSkgeworCQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJCQlrZnJlZShhY3BpX3BlcmZfZGF0YVtqXSk7CisJCQkJYWNwaV9wZXJmX2RhdGFbal0gPSBOVUxMOworCQkJfQorCQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJfQorCQlhY3BpX3BlcmZfZGF0YVtpXSA9IGRhdGE7CisJfQorCisJLyogRG8gaW5pdGlhbGl6YXRpb24gaW4gQUNQSSBjb3JlICovCisJYWNwaV9wcm9jZXNzb3JfcHJlcmVnaXN0ZXJfcGVyZm9ybWFuY2UoYWNwaV9wZXJmX2RhdGEpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBhY3BpX2NwdWZyZXFfY3B1X2luaXQgKAogCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAgICpwb2xpY3kpCkBAIC0zMDMsNDEgKzM5OCw1MSBAQAogCXN0cnVjdCBjcHVmcmVxX2FjcGlfaW8JKmRhdGE7CiAJdW5zaWduZWQgaW50CQlyZXN1bHQgPSAwOwogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YVtwb2xpY3ktPmNwdV07CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSpwZXJmOwogCiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2NwdV9pbml0XG4iKTsKIAorCWlmICghYWNwaV9wZXJmX2RhdGFbY3B1XSkKKwkJcmV0dXJuICgtRU5PREVWKTsKKwogCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9hY3BpX2lvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gKC1FTk9NRU0pOwogCisJZGF0YS0+YWNwaV9kYXRhID0gYWNwaV9wZXJmX2RhdGFbY3B1XTsKIAlhY3BpX2lvX2RhdGFbY3B1XSA9IGRhdGE7CiAKLQlyZXN1bHQgPSBhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmZGF0YS0+YWNwaV9kYXRhLCBjcHUpOworCXJlc3VsdCA9IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKGRhdGEtPmFjcGlfZGF0YSwgY3B1KTsKIAogCWlmIChyZXN1bHQpCiAJCWdvdG8gZXJyX2ZyZWU7CiAKKwlwZXJmID0gZGF0YS0+YWNwaV9kYXRhOworCXBvbGljeS0+Y3B1cyA9IHBlcmYtPnNoYXJlZF9jcHVfbWFwOworCXBvbGljeS0+c2hhcmVkX3R5cGUgPSBwZXJmLT5zaGFyZWRfdHlwZTsKKwogCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQykpIHsKIAkJYWNwaV9jcHVmcmVxX2RyaXZlci5mbGFncyB8PSBDUFVGUkVRX0NPTlNUX0xPT1BTOwogCX0KIAogCS8qIGNhcGFiaWxpdHkgY2hlY2sgKi8KLQlpZiAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IDw9IDEpIHsKKwlpZiAocGVyZi0+c3RhdGVfY291bnQgPD0gMSkgewogCQlkcHJpbnRrKCJObyBQLVN0YXRlc1xuIik7CiAJCXJlc3VsdCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX3VucmVnOwogCX0KLQlpZiAoKGRhdGEtPmFjcGlfZGF0YS5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgfHwKLQkgICAgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfU1lTVEVNX0lPKSkgeworCisJaWYgKChwZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkICE9IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykgfHwKKwkgICAgKHBlcmYtPnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9TWVNURU1fSU8pKSB7CiAJCWRwcmludGsoIlVuc3VwcG9ydGVkIGFkZHJlc3Mgc3BhY2UgWyVkLCAlZF1cbiIsCi0JCQkodTMyKSAoZGF0YS0+YWNwaV9kYXRhLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQpLAotCQkJKHUzMikgKGRhdGEtPmFjcGlfZGF0YS5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKKwkJCSh1MzIpIChwZXJmLT5jb250cm9sX3JlZ2lzdGVyLnNwYWNlX2lkKSwKKwkJCSh1MzIpIChwZXJmLT5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfdW5yZWc7CiAJfQogCiAJLyogYWxsb2MgZnJlcV90YWJsZSAqLwotCWRhdGEtPmZyZXFfdGFibGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUpICogKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZV9jb3VudCArIDEpLCBHRlBfS0VSTkVMKTsKKwlkYXRhLT5mcmVxX3RhYmxlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqIChwZXJmLT5zdGF0ZV9jb3VudCArIDEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEtPmZyZXFfdGFibGUpIHsKIAkJcmVzdWx0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfdW5yZWc7CkBAIC0zNDUsOSArNDUwLDkgQEAKIAogCS8qIGRldGVjdCB0cmFuc2l0aW9uIGxhdGVuY3kgKi8KIAlwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5ID0gMDsKLQlmb3IgKGk9MDsgaTxkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQ7IGkrKykgewotCQlpZiAoKGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMCkgPiBwb2xpY3ktPmNwdWluZm8udHJhbnNpdGlvbl9sYXRlbmN5KQotCQkJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMDsKKwlmb3IgKGk9MDsgaTxwZXJmLT5zdGF0ZV9jb3VudDsgaSsrKSB7CisJCWlmICgocGVyZi0+c3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSAqIDEwMDApID4gcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSkKKwkJCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSBwZXJmLT5zdGF0ZXNbaV0udHJhbnNpdGlvbl9sYXRlbmN5ICogMTAwMDsKIAl9CiAJcG9saWN5LT5nb3Zlcm5vciA9IENQVUZSRVFfREVGQVVMVF9HT1ZFUk5PUjsKIApAQCAtMzU1LDExICs0NjAsMTEgQEAKIAlwb2xpY3ktPmN1ciA9IGFjcGlfY3B1ZnJlcV9ndWVzc19mcmVxKGRhdGEsIHBvbGljeS0+Y3B1KTsKIAogCS8qIHRhYmxlIGluaXQgKi8KLQlmb3IgKGk9MDsgaTw9ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspCisJZm9yIChpPTA7IGk8PXBlcmYtPnN0YXRlX2NvdW50OyBpKyspCiAJewogCQlkYXRhLT5mcmVxX3RhYmxlW2ldLmluZGV4ID0gaTsKLQkJaWYgKGk8ZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50KQotCQkJZGF0YS0+ZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKwkJaWYgKGk8cGVyZi0+c3RhdGVfY291bnQpCisJCQlkYXRhLT5mcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IHBlcmYtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CiAJCWVsc2UKIAkJCWRhdGEtPmZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CiAJfQpAQCAtMzc0LDEyICs0NzksMTIgQEAKIAogCXByaW50ayhLRVJOX0lORk8gImFjcGktY3B1ZnJlcTogQ1BVJXUgLSBBQ1BJIHBlcmZvcm1hbmNlIG1hbmFnZW1lbnQgYWN0aXZhdGVkLlxuIiwKIAkgICAgICAgY3B1KTsKLQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50OyBpKyspCisJZm9yIChpID0gMDsgaSA8IHBlcmYtPnN0YXRlX2NvdW50OyBpKyspCiAJCWRwcmludGsoIiAgICAgJWNQJWQ6ICVkIE1IeiwgJWQgbVcsICVkIHVTXG4iLAotCQkJKGkgPT0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlPycqJzonICcpLCBpLAotCQkJKHUzMikgZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwKLQkJCSh1MzIpIGRhdGEtPmFjcGlfZGF0YS5zdGF0ZXNbaV0ucG93ZXIsCi0JCQkodTMyKSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnRyYW5zaXRpb25fbGF0ZW5jeSk7CisJCQkoaSA9PSBwZXJmLT5zdGF0ZT8nKic6JyAnKSwgaSwKKwkJCSh1MzIpIHBlcmYtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwKKwkJCSh1MzIpIHBlcmYtPnN0YXRlc1tpXS5wb3dlciwKKwkJCSh1MzIpIHBlcmYtPnN0YXRlc1tpXS50cmFuc2l0aW9uX2xhdGVuY3kpOwogCiAJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfZ2V0X2F0dHIoZGF0YS0+ZnJlcV90YWJsZSwgcG9saWN5LT5jcHUpOwogCQpAQCAtMzk0LDcgKzQ5OSw3IEBACiAgZXJyX2ZyZXFmcmVlOgogCWtmcmVlKGRhdGEtPmZyZXFfdGFibGUpOwogIGVycl91bnJlZzoKLQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZkYXRhLT5hY3BpX2RhdGEsIGNwdSk7CisJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShwZXJmLCBjcHUpOwogIGVycl9mcmVlOgogCWtmcmVlKGRhdGEpOwogCWFjcGlfaW9fZGF0YVtjcHVdID0gTlVMTDsKQEAgLTQxNSw3ICs1MjAsNyBAQAogCWlmIChkYXRhKSB7CiAJCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3B1dF9hdHRyKHBvbGljeS0+Y3B1KTsKIAkJYWNwaV9pb19kYXRhW3BvbGljeS0+Y3B1XSA9IE5VTEw7Ci0JCWFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2UoJmRhdGEtPmFjcGlfZGF0YSwgcG9saWN5LT5jcHUpOworCQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKGRhdGEtPmFjcGlfZGF0YSwgcG9saWN5LT5jcHUpOwogCQlrZnJlZShkYXRhKTsKIAl9CiAKQEAgLTQ2Miw3ICs1NjcsMTAgQEAKIAogCWRwcmludGsoImFjcGlfY3B1ZnJlcV9pbml0XG4iKTsKIAotIAlyZXN1bHQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9jcHVmcmVxX2RyaXZlcik7CisJcmVzdWx0ID0gYWNwaV9jcHVmcmVxX2Vhcmx5X2luaXRfYWNwaSgpOworCisJaWYgKCFyZXN1bHQpCisgCQlyZXN1bHQgPSBjcHVmcmVxX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9jcHVmcmVxX2RyaXZlcik7CiAJCiAJcmV0dXJuIChyZXN1bHQpOwogfQpAQCAtNDcxLDEwICs1NzksMTUgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdAogYWNwaV9jcHVmcmVxX2V4aXQgKHZvaWQpCiB7CisJdW5zaWduZWQgaW50CWk7CiAJZHByaW50aygiYWNwaV9jcHVmcmVxX2V4aXRcbiIpOwogCiAJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9jcHVmcmVxX2RyaXZlcik7CiAKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlrZnJlZShhY3BpX3BlcmZfZGF0YVtpXSk7CisJCWFjcGlfcGVyZl9kYXRhW2ldID0gTlVMTDsKKwl9CiAJcmV0dXJuOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggYjQyNzdmNS4uMmQ2NDkxNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTIwLDcgKzEyMCw3IEBACiB7CiAJdTMyIGxvLCBoaTsKIAotCWlmIChjcHVfZmFtaWx5KQorCWlmIChjcHVfZmFtaWx5ID09IENQVV9IV19QU1RBVEUpCiAJCXJldHVybiAwOwogCiAJcmRtc3IoTVNSX0ZJRFZJRF9TVEFUVVMsIGxvLCBoaSk7CkBAIC0xMzYsNyArMTM2LDcgQEAKIAl1MzIgbG8sIGhpOwogCXUzMiBpID0gMDsKIAotCWlmIChjcHVfZmFtaWx5KSB7CisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkgewogCQlyZG1zcihNU1JfUFNUQVRFX1NUQVRVUywgbG8sIGhpKTsKIAkJaSA9IGxvICYgSFdfUFNUQVRFX01BU0s7CiAJCXJkbXNyKE1TUl9QU1RBVEVfREVGX0JBU0UgKyBpLCBsbywgaGkpOwpAQCAtNTk4LDcgKzU5OCw3IEBACiAJaW50IGo7CiAJZm9yIChqID0gMDsgaiA8IGRhdGEtPm51bXBzOyBqKyspIHsKIAkJaWYgKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmZyZXF1ZW5jeSAhPSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQpIHsKLQkJCWlmIChjcHVfZmFtaWx5KSB7CisJCQlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiICAgJWQgOiBmaWQgMHgleCBnaWQgMHgleCAoJWQgTUh6KVxuIiwgaiwgKGRhdGEtPnBvd2Vybm93X3RhYmxlW2pdLmluZGV4ICYgMHhmZjAwKSA+PiA4LAogCQkJCShkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5pbmRleCAmIDB4ZmYwMDAwKSA+PiAxNiwKIAkJCQlkYXRhLT5wb3dlcm5vd190YWJsZVtqXS5mcmVxdWVuY3kvMTAwMCk7CkBAIC03NTgsNyArNzU4LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X1BPV0VSTk9XX0s4X0FDUEkKIHN0YXRpYyB2b2lkIHBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhzdHJ1Y3QgcG93ZXJub3dfazhfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IGluZGV4KQogewotCWlmICghZGF0YS0+YWNwaV9kYXRhLnN0YXRlX2NvdW50IHx8IGNwdV9mYW1pbHkpCisJaWYgKCFkYXRhLT5hY3BpX2RhdGEuc3RhdGVfY291bnQgfHwgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkpCiAJCXJldHVybjsKIAogCWRhdGEtPmlydCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2luZGV4XS5jb250cm9sID4+IElSVF9TSElGVCkgJiBJUlRfTUFTSzsKQEAgLTgwMSw3ICs4MDEsNyBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCi0JaWYgKGNwdV9mYW1pbHkpCisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKIAkJcmV0X3ZhbCA9IGZpbGxfcG93ZXJub3dfdGFibGVfcHN0YXRlKGRhdGEsIHBvd2Vybm93X3RhYmxlKTsKIAllbHNlCiAJCXJldF92YWwgPSBmaWxsX3Bvd2Vybm93X3RhYmxlX2ZpZHZpZChkYXRhLCBwb3dlcm5vd190YWJsZSk7CkBAIC04ODUsOCArODg1LDggQEAKIAkJdTMyIHZpZDsKIAogCQlpZiAoZGF0YS0+ZXh0dHlwZSkgewotCQkJZmlkID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5zdGF0dXMgJiBGSURfTUFTSzsKLQkJCXZpZCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cyA+PiBWSURfU0hJRlQpICYgVklEX01BU0s7CisJCQlmaWQgPSBkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cyAmIEVYVF9GSURfTUFTSzsKKwkJCXZpZCA9IChkYXRhLT5hY3BpX2RhdGEuc3RhdGVzW2ldLnN0YXR1cyA+PiBWSURfU0hJRlQpICYgRVhUX1ZJRF9NQVNLOwogCQl9IGVsc2UgewogCQkJZmlkID0gZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sICYgRklEX01BU0s7CiAJCQl2aWQgPSAoZGF0YS0+YWNwaV9kYXRhLnN0YXRlc1tpXS5jb250cm9sID4+IFZJRF9TSElGVCkgJiBWSURfTUFTSzsKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQogCQlnb3RvIGVycl9vdXQ7CiAKLQlpZiAoY3B1X2ZhbWlseSkKKwlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKQogCQlkcHJpbnRrKCJ0YXJnOiBjdXJyIGZpZCAweCV4LCBkaWQgMHgleFxuIiwKIAkJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJ2aWQpOwogCWVsc2UgewpAQCAtMTEwMyw3ICsxMTAzLDcgQEAKIAogCXBvd2Vybm93X2s4X2FjcGlfcHN0X3ZhbHVlcyhkYXRhLCBuZXdzdGF0ZSk7CiAKLQlpZiAoY3B1X2ZhbWlseSkKKwlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKQogCQlyZXQgPSB0cmFuc2l0aW9uX2ZyZXF1ZW5jeV9wc3RhdGUoZGF0YSwgbmV3c3RhdGUpOwogCWVsc2UKIAkJcmV0ID0gdHJhbnNpdGlvbl9mcmVxdWVuY3lfZmlkdmlkKGRhdGEsIG5ld3N0YXRlKTsKQEAgLTExMTUsNyArMTExNSw3IEBACiAJfQogCW11dGV4X3VubG9jaygmZmlkdmlkX211dGV4KTsKIAotCWlmIChjcHVfZmFtaWx5KQorCWlmIChjcHVfZmFtaWx5ID09IENQVV9IV19QU1RBVEUpCiAJCXBvbC0+Y3VyID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZGRpZChkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJyZGlkKTsKIAllbHNlCiAJCXBvbC0+Y3VyID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZChkYXRhLT5jdXJyZmlkKTsKQEAgLTExNjMsNyArMTE2Myw3IEBACiAJCSAqIFVzZSB0aGUgUFNCIEJJT1Mgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgYXZhaWxhYmUgb24KIAkJICogYW4gVVAgdmVyc2lvbiwgYW5kIGlzIGRlcHJlY2F0ZWQgYnkgQU1ELgogCQkgKi8KLQkJaWYgKChudW1fb25saW5lX2NwdXMoKSAhPSAxKSB8fCAobnVtX3Bvc3NpYmxlX2NwdXMoKSAhPSAxKSkgeworCQlpZiAobnVtX29ubGluZV9jcHVzKCkgIT0gMSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTVAgc3lzdGVtcyBub3Qgc3VwcG9ydGVkIGJ5IFBTQiBCSU9TIHN0cnVjdHVyZVxuIik7CiAJCQlrZnJlZShkYXRhKTsKIAkJCXJldHVybiAtRU5PREVWOwpAQCAtMTE5NywxNCArMTE5NywxNCBAQAogCWlmIChxdWVyeV9jdXJyZW50X3ZhbHVlc193aXRoX3BlbmRpbmdfd2FpdChkYXRhKSkKIAkJZ290byBlcnJfb3V0OwogCi0JaWYgKCFjcHVfZmFtaWx5KQorCWlmIChjcHVfZmFtaWx5ID09IENQVV9PUFRFUk9OKQogCQlmaWR2aWRfbXNyX2luaXQoKTsKIAogCS8qIHJ1biBvbiBhbnkgQ1BVIGFnYWluICovCiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBvbGRtYXNrKTsKIAogCXBvbC0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7Ci0JaWYgKGNwdV9mYW1pbHkpCisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKIAkJcG9sLT5jcHVzID0gY3B1bWFza19vZl9jcHUocG9sLT5jcHUpOwogCWVsc2UKIAkJcG9sLT5jcHVzID0gY3B1X2NvcmVfbWFwW3BvbC0+Y3B1XTsKQEAgLTEyMTUsNyArMTIxNSw3IEBACiAJcG9sLT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9ICgoKGRhdGEtPnJ2byArIDgpICogZGF0YS0+dnN0YWJsZSAqIFZTVF9VTklUU18yMFVTKQogCSAgICArICgzICogKDEgPDwgZGF0YS0+aXJ0KSAqIDEwKSkgKiAxMDAwOwogCi0JaWYgKGNwdV9mYW1pbHkpCisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKIAkJcG9sLT5jdXIgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkZGlkKGRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJkaWQpOwogCWVsc2UKIAkJcG9sLT5jdXIgPSBmaW5kX2toel9mcmVxX2Zyb21fZmlkKGRhdGEtPmN1cnJmaWQpOwpAQCAtMTIzMiw3ICsxMjMyLDcgQEAKIAogCWNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2dldF9hdHRyKGRhdGEtPnBvd2Vybm93X3RhYmxlLCBwb2wtPmNwdSk7CiAKLQlpZiAoY3B1X2ZhbWlseSkKKwlpZiAoY3B1X2ZhbWlseSA9PSBDUFVfSFdfUFNUQVRFKQogCQlkcHJpbnRrKCJjcHVfaW5pdCBkb25lLCBjdXJyZW50IGZpZCAweCV4LCBkaWQgMHgleFxuIiwKIAkJCWRhdGEtPmN1cnJmaWQsIGRhdGEtPmN1cnJkaWQpOwogCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaCBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguaAppbmRleCBiZjhhZDllLi4wZmIyYTMwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmgKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5oCkBAIC0xNjksNyArMTY5LDkgQEAKICNkZWZpbmUgTVZTX01BU0sgICAgICAgIDMKICNkZWZpbmUgVlNUX01BU0sgICAgIDB4N2YKICNkZWZpbmUgVklEX01BU0sgICAgIDB4MWYKLSNkZWZpbmUgRklEX01BU0sgICAgIDB4M2YKKyNkZWZpbmUgRklEX01BU0sgICAgIDB4MWYKKyNkZWZpbmUgRVhUX1ZJRF9NQVNLIDB4M2YKKyNkZWZpbmUgRVhUX0ZJRF9NQVNLIDB4M2YKIAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKaW5kZXggY2U1NGZmMS4uZjdlNDM1NiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9zcGVlZHN0ZXAtY2VudHJpbm8uYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3NwZWVkc3RlcC1jZW50cmluby5jCkBAIC0yLDE5ICsyLDE1IEBACiAgKiBjcHVmcmVxIGRyaXZlciBmb3IgRW5oYW5jZWQgU3BlZWRTdGVwLCBhcyBmb3VuZCBpbiBJbnRlbCdzIFBlbnRpdW0KICAqIE0gKHBhcnQgb2YgdGhlIENlbnRyaW5vIGNoaXBzZXQpLgogICoKKyAqIFNpbmNlIHRoZSBvcmlnaW5hbCBQZW50aXVtIE0sIG1vc3QgbmV3IEludGVsIENQVXMgc3VwcG9ydCBFbmhhbmNlZAorICogU3BlZWRTdGVwLgorICoKICAqIERlc3BpdGUgdGhlICJTcGVlZFN0ZXAiIGluIHRoZSBuYW1lLCB0aGlzIGlzIGFsbW9zdCBlbnRpcmVseSB1bmxpa2UKICAqIHRyYWRpdGlvbmFsIFNwZWVkU3RlcC4KICAqCiAgKiBNb2RlbGxlZCBvbiBzcGVlZHN0ZXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMyBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+Ci0gKgotICogV0FSTklORyBXQVJOSU5HIFdBUk5JTkcKLSAqCi0gKiBUaGlzIGRyaXZlciBtYW5pcHVsYXRlcyB0aGUgUEVSRl9DVEwgTVNSLCB3aGljaCBpcyBvbmx5IHNvbWV3aGF0Ci0gKiBkb2N1bWVudGVkLiAgV2hpbGUgaXQgc2VlbXMgdG8gd29yayBvbiBteSBsYXB0b3AsIGl0IGhhcyBub3QgYmVlbgotICogdGVzdGVkIGFueXdoZXJlIGVsc2UsIGFuZCBpdCBtYXkgbm90IHdvcmsgZm9yIHlvdSwgZG8gc3RyYW5nZQotICogdGhpbmdzIG9yIHNpbXBseSBjcmFzaC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zNiw3ICszMiw3IEBACiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KIAogI2RlZmluZSBQRlgJCSJzcGVlZHN0ZXAtY2VudHJpbm86ICIKLSNkZWZpbmUgTUFJTlRBSU5FUgkiSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QGdvb3Aub3JnPiIKKyNkZWZpbmUgTUFJTlRBSU5FUgkiY3B1ZnJlcUBsaXN0cy5saW51eC5vcmcudWsiCiAKICNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAic3BlZWRzdGVwLWNlbnRyaW5vIiwgbXNnKQogCkBAIC0zNTEsNyArMzQ3LDM2IEBACiAKICNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgcDsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKmFjcGlfcGVyZl9kYXRhW05SX0NQVVNdOworCisvKgorICogY2VudHJpbm9fY3B1X2Vhcmx5X2luaXRfYWNwaSAtIERvIHRoZSBwcmVyZWdpc3RlcmluZyB3aXRoIEFDUEkgUC1TdGF0ZXMKKyAqIGxpYnJhcnkKKyAqCisgKiBCZWZvcmUgZG9pbmcgdGhlIGFjdHVhbCBpbml0LCB3ZSBuZWVkIHRvIGRvIF9QU0QgcmVsYXRlZCBzZXR1cCB3aGVuZXZlcgorICogc3VwcG9ydGVkIGJ5IHRoZSBCSU9TLiBUaGVzZSBhcmUgaGFuZGxlZCBieSB0aGlzIGVhcmx5X2luaXQgcm91dGluZS4KKyAqLworc3RhdGljIGludCBjZW50cmlub19jcHVfZWFybHlfaW5pdF9hY3BpKHZvaWQpCit7CisJdW5zaWduZWQgaW50CWksIGo7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSpkYXRhOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSksIAorCQkJCUdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEpIHsKKwkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCQkJa2ZyZWUoYWNwaV9wZXJmX2RhdGFbal0pOworCQkJCWFjcGlfcGVyZl9kYXRhW2pdID0gTlVMTDsKKwkJCX0KKwkJCXJldHVybiAoLUVOT01FTSk7CisJCX0KKwkJYWNwaV9wZXJmX2RhdGFbaV0gPSBkYXRhOworCX0KKworCWFjcGlfcHJvY2Vzc29yX3ByZXJlZ2lzdGVyX3BlcmZvcm1hbmNlKGFjcGlfcGVyZl9kYXRhKTsKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIGNlbnRyaW5vX2NwdV9pbml0X2FjcGkgLSByZWdpc3RlciB3aXRoIEFDUEkgUC1TdGF0ZXMgbGlicmFyeQpAQCAtMzY1LDQ2ICszOTAsNTEgQEAKIAl1bnNpZ25lZCBsb25nCQkJY3VyX2ZyZXE7CiAJaW50CQkJCXJlc3VsdCA9IDAsIGk7CiAJdW5zaWduZWQgaW50CQkJY3B1ID0gcG9saWN5LT5jcHU7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlCSpwOworCisJcCA9IGFjcGlfcGVyZl9kYXRhW2NwdV07CiAKIAkvKiByZWdpc3RlciB3aXRoIEFDUEkgY29yZSAqLwotCWlmIChhY3BpX3Byb2Nlc3Nvcl9yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmcCwgY3B1KSkgewotCQlkcHJpbnRrKCJvYnRhaW5pbmcgQUNQSSBkYXRhIGZhaWxlZFxuIik7CisJaWYgKGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKHAsIGNwdSkpIHsKKwkJZHByaW50ayhQRlggIm9idGFpbmluZyBBQ1BJIGRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQorCXBvbGljeS0+Y3B1cyA9IHAtPnNoYXJlZF9jcHVfbWFwOworCXBvbGljeS0+c2hhcmVkX3R5cGUgPSBwLT5zaGFyZWRfdHlwZTsKIAogCS8qIHZlcmlmeSB0aGUgYWNwaV9kYXRhICovCi0JaWYgKHAuc3RhdGVfY291bnQgPD0gMSkgeworCWlmIChwLT5zdGF0ZV9jb3VudCA8PSAxKSB7CiAJCWRwcmludGsoIk5vIFAtU3RhdGVzXG4iKTsKIAkJcmVzdWx0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJfdW5yZWc7CiAJfQogCi0JaWYgKChwLmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8Ci0JICAgIChwLnN0YXR1c19yZWdpc3Rlci5zcGFjZV9pZCAhPSBBQ1BJX0FEUl9TUEFDRV9GSVhFRF9IQVJEV0FSRSkpIHsKKwlpZiAoKHAtPmNvbnRyb2xfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpIHx8CisJICAgIChwLT5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQgIT0gQUNQSV9BRFJfU1BBQ0VfRklYRURfSEFSRFdBUkUpKSB7CiAJCWRwcmludGsoIkludmFsaWQgY29udHJvbC9zdGF0dXMgcmVnaXN0ZXJzICgleCAtICV4KVxuIiwKLQkJCXAuY29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCwgcC5zdGF0dXNfcmVnaXN0ZXIuc3BhY2VfaWQpOworCQkJcC0+Y29udHJvbF9yZWdpc3Rlci5zcGFjZV9pZCwgcC0+c3RhdHVzX3JlZ2lzdGVyLnNwYWNlX2lkKTsKIAkJcmVzdWx0ID0gLUVJTzsKIAkJZ290byBlcnJfdW5yZWc7CiAJfQogCi0JZm9yIChpPTA7IGk8cC5zdGF0ZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChwLnN0YXRlc1tpXS5jb250cm9sICE9IHAuc3RhdGVzW2ldLnN0YXR1cykgeworCWZvciAoaT0wOyBpPHAtPnN0YXRlX2NvdW50OyBpKyspIHsKKwkJaWYgKHAtPnN0YXRlc1tpXS5jb250cm9sICE9IHAtPnN0YXRlc1tpXS5zdGF0dXMpIHsKIAkJCWRwcmludGsoIkRpZmZlcmVudCBjb250cm9sICglbGx1KSBhbmQgc3RhdHVzIHZhbHVlcyAoJWxsdSlcbiIsCi0JCQkJcC5zdGF0ZXNbaV0uY29udHJvbCwgcC5zdGF0ZXNbaV0uc3RhdHVzKTsKKwkJCQlwLT5zdGF0ZXNbaV0uY29udHJvbCwgcC0+c3RhdGVzW2ldLnN0YXR1cyk7CiAJCQlyZXN1bHQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfdW5yZWc7CiAJCX0KIAotCQlpZiAoIXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5KSB7CisJCWlmICghcC0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5KSB7CiAJCQlkcHJpbnRrKCJaZXJvIGNvcmUgZnJlcXVlbmN5IGZvciBzdGF0ZSAldVxuIiwgaSk7CiAJCQlyZXN1bHQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJfdW5yZWc7CiAJCX0KIAotCQlpZiAocC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPiBwLnN0YXRlc1swXS5jb3JlX2ZyZXF1ZW5jeSkgeworCQlpZiAocC0+c3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ID4gcC0+c3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5KSB7CiAJCQlkcHJpbnRrKCJQJXUgaGFzIGxhcmdlciBmcmVxdWVuY3kgKCVsbHUpIHRoYW4gUDAgKCVsbHUpLCBza2lwcGluZ1xuIiwgaSwKLQkJCQlwLnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwgcC5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kpOwotCQkJcC5zdGF0ZXNbaV0uY29yZV9mcmVxdWVuY3kgPSAwOworCQkJCXAtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSwgcC0+c3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5KTsKKwkJCXAtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSA9IDA7CiAJCQljb250aW51ZTsKIAkJfQogCX0KQEAgLTQxNiwyNiArNDQ2LDI2IEBACiAJfQogCiAJY2VudHJpbm9fbW9kZWxbY3B1XS0+bW9kZWxfbmFtZT1OVUxMOwotCWNlbnRyaW5vX21vZGVsW2NwdV0tPm1heF9mcmVxID0gcC5zdGF0ZXNbMF0uY29yZV9mcmVxdWVuY3kgKiAxMDAwOworCWNlbnRyaW5vX21vZGVsW2NwdV0tPm1heF9mcmVxID0gcC0+c3RhdGVzWzBdLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKIAljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMgPSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlKSAqCi0JCQkJCSAgICAgKHAuc3RhdGVfY291bnQgKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCSAgICAgKHAtPnN0YXRlX2NvdW50ICsgMSksIEdGUF9LRVJORUwpOwogICAgICAgICBpZiAoIWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cykgewogICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07CiAgICAgICAgICAgICAgICAgZ290byBlcnJfa2ZyZWU7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGk9MDsgaTxwLnN0YXRlX2NvdW50OyBpKyspIHsKLQkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmluZGV4ID0gcC5zdGF0ZXNbaV0uY29udHJvbDsKLQkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSA9IHAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5ICogMTAwMDsKKyAgICAgICAgZm9yIChpPTA7IGk8cC0+c3RhdGVfY291bnQ7IGkrKykgeworCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbaV0uaW5kZXggPSBwLT5zdGF0ZXNbaV0uY29udHJvbDsKKwkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSA9IHAtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSAqIDEwMDA7CiAJCWRwcmludGsoImFkZGluZyBzdGF0ZSAlaSB3aXRoIGZyZXF1ZW5jeSAldSBhbmQgY29udHJvbCB2YWx1ZSAlMDR4XG4iLCAKIAkJCWksIGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5mcmVxdWVuY3ksIGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tpXS5pbmRleCk7CiAJfQotCWNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1twLnN0YXRlX2NvdW50XS5mcmVxdWVuY3kgPSBDUFVGUkVRX1RBQkxFX0VORDsKKwljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHNbcC0+c3RhdGVfY291bnRdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOwogCiAJY3VyX2ZyZXEgPSBnZXRfY3VyX2ZyZXEoY3B1KTsKIAotCWZvciAoaT0wOyBpPHAuc3RhdGVfY291bnQ7IGkrKykgewotCQlpZiAoIXAuc3RhdGVzW2ldLmNvcmVfZnJlcXVlbmN5KSB7CisJZm9yIChpPTA7IGk8cC0+c3RhdGVfY291bnQ7IGkrKykgeworCQlpZiAoIXAtPnN0YXRlc1tpXS5jb3JlX2ZyZXF1ZW5jeSkgewogCQkJZHByaW50aygic2tpcHBpbmcgc3RhdGUgJXVcbiIsIGkpOwogCQkJY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKIAkJCWNvbnRpbnVlOwpAQCAtNDUxLDcgKzQ4MSw3IEBACiAJCX0KIAogCQlpZiAoY3VyX2ZyZXEgPT0gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW2ldLmZyZXF1ZW5jeSkKLQkJCXAuc3RhdGUgPSBpOworCQkJcC0+c3RhdGUgPSBpOwogCX0KIAogCS8qIG5vdGlmeSBCSU9TIHRoYXQgd2UgZXhpc3QgKi8KQEAgLTQ2NCwxMiArNDk0LDEzIEBACiAgZXJyX2tmcmVlOgogCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0pOwogIGVycl91bnJlZzoKLQlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKCZwLCBjcHUpOwotCWRwcmludGsoImludmFsaWQgQUNQSSBkYXRhXG4iKTsKKwlhY3BpX3Byb2Nlc3Nvcl91bnJlZ2lzdGVyX3BlcmZvcm1hbmNlKHAsIGNwdSk7CisJZHByaW50ayhQRlggImludmFsaWQgQUNQSSBkYXRhXG4iKTsKIAlyZXR1cm4gKHJlc3VsdCk7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgY2VudHJpbm9fY3B1X2luaXRfYWNwaShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkgeyByZXR1cm4gLUVOT0RFVjsgfQorc3RhdGljIGlubGluZSBpbnQgY2VudHJpbm9fY3B1X2Vhcmx5X2luaXRfYWNwaSh2b2lkKSB7IHJldHVybiAwOyB9CiAjZW5kaWYKIAogc3RhdGljIGludCBjZW50cmlub19jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKQEAgLTU1NSwxMCArNTg2LDE1IEBACiAKICNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCiAJaWYgKCFjZW50cmlub19tb2RlbFtjcHVdLT5tb2RlbF9uYW1lKSB7Ci0JCWRwcmludGsoInVucmVnaXN0ZXJpbmcgYW5kIGZyZWVpbmcgQUNQSSBkYXRhXG4iKTsKLQkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSgmcCwgY3B1KTsKLQkJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKTsKLQkJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XSk7CisJCXN0YXRpYyBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfcGVyZm9ybWFuY2UgKnA7CisKKwkJaWYgKGFjcGlfcGVyZl9kYXRhW2NwdV0pIHsKKwkJCXAgPSBhY3BpX3BlcmZfZGF0YVtjcHVdOworCQkJZHByaW50aygidW5yZWdpc3RlcmluZyBhbmQgZnJlZWluZyBBQ1BJIGRhdGFcbiIpOworCQkJYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZShwLCBjcHUpOworCQkJa2ZyZWUoY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzKTsKKwkJCWtmcmVlKGNlbnRyaW5vX21vZGVsW2NwdV0pOworCQl9CiAJfQogI2VuZGlmCiAKQEAgLTU5Miw2MyArNjI4LDEyOCBAQAogCQkJICAgIHVuc2lnbmVkIGludCByZWxhdGlvbikKIHsKIAl1bnNpZ25lZCBpbnQgICAgbmV3c3RhdGUgPSAwOwotCXVuc2lnbmVkIGludAltc3IsIG9sZG1zciwgaCwgY3B1ID0gcG9saWN5LT5jcHU7CisJdW5zaWduZWQgaW50CW1zciwgb2xkbXNyID0gMCwgaCA9IDAsIGNwdSA9IHBvbGljeS0+Y3B1OwogCXN0cnVjdCBjcHVmcmVxX2ZyZXFzCWZyZXFzOworCWNwdW1hc2tfdAkJb25saW5lX3BvbGljeV9jcHVzOwogCWNwdW1hc2tfdAkJc2F2ZWRfbWFzazsKLQlpbnQJCQlyZXR2YWw7CisJY3B1bWFza190CQlzZXRfbWFzazsKKwljcHVtYXNrX3QJCWNvdmVyZWRfY3B1czsKKwlpbnQJCQlyZXR2YWwgPSAwOworCXVuc2lnbmVkIGludAkJaiwgaywgZmlyc3RfY3B1LCB0bXA7CiAKLQlpZiAoY2VudHJpbm9fbW9kZWxbY3B1XSA9PSBOVUxMKQorCWlmICh1bmxpa2VseShjZW50cmlub19tb2RlbFtjcHVdID09IE5VTEwpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qCi0JICogU3VwcG9ydCBmb3IgU01QIHN5c3RlbXMuCi0JICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIHRoZSBDUFUgdGhhdCB3YW50cyB0byBjaGFuZ2UgZnJlcXVlbmN5Ci0JICovCisJaWYgKHVubGlrZWx5KGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksCisJCQljZW50cmlub19tb2RlbFtjcHVdLT5vcF9wb2ludHMsCisJCQl0YXJnZXRfZnJlcSwKKwkJCXJlbGF0aW9uLAorCQkJJm5ld3N0YXRlKSkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLyogY3B1ZnJlcSBob2xkcyB0aGUgaG90cGx1ZyBsb2NrLCBzbyB3ZSBhcmUgc2FmZSBmcm9tIGhlcmUgb24gKi8KKwljcHVzX2FuZChvbmxpbmVfcG9saWN5X2NwdXMsIGNwdV9vbmxpbmVfbWFwLCBwb2xpY3ktPmNwdXMpOworI2Vsc2UKKwlvbmxpbmVfcG9saWN5X2NwdXMgPSBwb2xpY3ktPmNwdXM7CisjZW5kaWYKKwogCXNhdmVkX21hc2sgPSBjdXJyZW50LT5jcHVzX2FsbG93ZWQ7Ci0Jc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBwb2xpY3ktPmNwdXMpOwotCWlmICghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgcG9saWN5LT5jcHVzKSkgewotCQlkcHJpbnRrKCJjb3VsZG4ndCBsaW1pdCB0byBDUFVzIGluIHRoaXMgZG9tYWluXG4iKTsKLQkJcmV0dXJuKC1FQUdBSU4pOworCWZpcnN0X2NwdSA9IDE7CisJY3B1c19jbGVhcihjb3ZlcmVkX2NwdXMpOworCWZvcl9lYWNoX2NwdV9tYXNrKGosIG9ubGluZV9wb2xpY3lfY3B1cykgeworCQkvKgorCQkgKiBTdXBwb3J0IGZvciBTTVAgc3lzdGVtcy4KKwkJICogTWFrZSBzdXJlIHdlIGFyZSBydW5uaW5nIG9uIENQVSB0aGF0IHdhbnRzIHRvIGNoYW5nZSBmcmVxCisJCSAqLworCQljcHVzX2NsZWFyKHNldF9tYXNrKTsKKwkJaWYgKHBvbGljeS0+c2hhcmVkX3R5cGUgPT0gQ1BVRlJFUV9TSEFSRURfVFlQRV9BTlkpCisJCQljcHVzX29yKHNldF9tYXNrLCBzZXRfbWFzaywgb25saW5lX3BvbGljeV9jcHVzKTsKKwkJZWxzZQorCQkJY3B1X3NldChqLCBzZXRfbWFzayk7CisKKwkJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzZXRfbWFzayk7CisJCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgc2V0X21hc2spKSkgeworCQkJZHByaW50aygiY291bGRuJ3QgbGltaXQgdG8gQ1BVcyBpbiB0aGlzIGRvbWFpblxuIik7CisJCQlyZXR2YWwgPSAtRUFHQUlOOworCQkJaWYgKGZpcnN0X2NwdSkgeworCQkJCS8qIFdlIGhhdmVuJ3Qgc3RhcnRlZCB0aGUgdHJhbnNpdGlvbiB5ZXQuICovCisJCQkJZ290byBtaWdyYXRlX2VuZDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJbXNyID0gY2VudHJpbm9fbW9kZWxbY3B1XS0+b3BfcG9pbnRzW25ld3N0YXRlXS5pbmRleDsKKworCQlpZiAoZmlyc3RfY3B1KSB7CisJCQlyZG1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKwkJCWlmIChtc3IgPT0gKG9sZG1zciAmIDB4ZmZmZikpIHsKKwkJCQlkcHJpbnRrKCJubyBjaGFuZ2UgbmVlZGVkIC0gbXNyIHdhcyBhbmQgbmVlZHMgIgorCQkJCQkidG8gYmUgJXhcbiIsIG9sZG1zcik7CisJCQkJcmV0dmFsID0gMDsKKwkJCQlnb3RvIG1pZ3JhdGVfZW5kOworCQkJfQorCisJCQlmcmVxcy5vbGQgPSBleHRyYWN0X2Nsb2NrKG9sZG1zciwgY3B1LCAwKTsKKwkJCWZyZXFzLm5ldyA9IGV4dHJhY3RfY2xvY2sobXNyLCBjcHUsIDApOworCisJCQlkcHJpbnRrKCJ0YXJnZXQ9JWRrSHogb2xkPSVkIG5ldz0lZCBtc3I9JTA0eFxuIiwKKwkJCQl0YXJnZXRfZnJlcSwgZnJlcXMub2xkLCBmcmVxcy5uZXcsIG1zcik7CisKKwkJCWZvcl9lYWNoX2NwdV9tYXNrKGssIG9ubGluZV9wb2xpY3lfY3B1cykgeworCQkJCWZyZXFzLmNwdSA9IGs7CisJCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsCisJCQkJCUNQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJCX0KKworCQkJZmlyc3RfY3B1ID0gMDsKKwkJCS8qIGFsbCBidXQgMTYgTFNCIGFyZSByZXNlcnZlZCwgdHJlYXQgdGhlbSB3aXRoIGNhcmUgKi8KKwkJCW9sZG1zciAmPSB+MHhmZmZmOworCQkJbXNyICY9IDB4ZmZmZjsKKwkJCW9sZG1zciB8PSBtc3I7CisJCX0KKworCQl3cm1zcihNU1JfSUEzMl9QRVJGX0NUTCwgb2xkbXNyLCBoKTsKKwkJaWYgKHBvbGljeS0+c2hhcmVkX3R5cGUgPT0gQ1BVRlJFUV9TSEFSRURfVFlQRV9BTlkpCisJCQlicmVhazsKKworCQljcHVfc2V0KGosIGNvdmVyZWRfY3B1cyk7CiAJfQogCi0JaWYgKGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX3RhcmdldChwb2xpY3ksIGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50cywgdGFyZ2V0X2ZyZXEsCi0JCQkJCSAgIHJlbGF0aW9uLCAmbmV3c3RhdGUpKSB7Ci0JCXJldHZhbCA9IC1FSU5WQUw7Ci0JCWdvdG8gbWlncmF0ZV9lbmQ7CisJZm9yX2VhY2hfY3B1X21hc2soaywgb25saW5lX3BvbGljeV9jcHVzKSB7CisJCWZyZXFzLmNwdSA9IGs7CisJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOwogCX0KIAotCW1zciA9IGNlbnRyaW5vX21vZGVsW2NwdV0tPm9wX3BvaW50c1tuZXdzdGF0ZV0uaW5kZXg7Ci0JcmRtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIG9sZG1zciwgaCk7CisJaWYgKHVubGlrZWx5KHJldHZhbCkpIHsKKwkJLyoKKwkJICogV2UgaGF2ZSBmYWlsZWQgaGFsZndheSB0aHJvdWdoIHRoZSBmcmVxdWVuY3kgY2hhbmdlLgorCQkgKiBXZSBoYXZlIHNlbnQgY2FsbGJhY2tzIHRvIHBvbGljeS0+Y3B1cyBhbmQKKwkJICogTVNScyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuIG9uIGNvdmVyZF9jcHVzLgorCQkgKiBCZXN0IGVmZm9ydCB1bmRvLi4KKwkJICovCiAKLQlpZiAobXNyID09IChvbGRtc3IgJiAweGZmZmYpKSB7Ci0JCXJldHZhbCA9IDA7Ci0JCWRwcmludGsoIm5vIGNoYW5nZSBuZWVkZWQgLSBtc3Igd2FzIGFuZCBuZWVkcyB0byBiZSAleFxuIiwgb2xkbXNyKTsKLQkJZ290byBtaWdyYXRlX2VuZDsKKwkJaWYgKCFjcHVzX2VtcHR5KGNvdmVyZWRfY3B1cykpIHsKKwkJCWZvcl9lYWNoX2NwdV9tYXNrKGosIGNvdmVyZWRfY3B1cykgeworCQkJCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgY3B1bWFza19vZl9jcHUoaikpOworCQkJCXdybXNyKE1TUl9JQTMyX1BFUkZfQ1RMLCBvbGRtc3IsIGgpOworCQkJfQorCQl9CisKKwkJdG1wID0gZnJlcXMubmV3OworCQlmcmVxcy5uZXcgPSBmcmVxcy5vbGQ7CisJCWZyZXFzLm9sZCA9IHRtcDsKKwkJZm9yX2VhY2hfY3B1X21hc2soaiwgb25saW5lX3BvbGljeV9jcHVzKSB7CisJCQlmcmVxcy5jcHUgPSBqOworCQkJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUFJFQ0hBTkdFKTsKKwkJCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BPU1RDSEFOR0UpOworCQl9CiAJfQogCi0JZnJlcXMuY3B1ID0gY3B1OwotCWZyZXFzLm9sZCA9IGV4dHJhY3RfY2xvY2sob2xkbXNyLCBjcHUsIDApOwotCWZyZXFzLm5ldyA9IGV4dHJhY3RfY2xvY2sobXNyLCBjcHUsIDApOwotCi0JZHByaW50aygidGFyZ2V0PSVka0h6IG9sZD0lZCBuZXc9JWQgbXNyPSUwNHhcbiIsCi0JCXRhcmdldF9mcmVxLCBmcmVxcy5vbGQsIGZyZXFzLm5ldywgbXNyKTsKLQotCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7Ci0KLQkvKiBhbGwgYnV0IDE2IExTQiBhcmUgInJlc2VydmVkIiwgc28gdHJlYXQgdGhlbSB3aXRoCi0JICAgY2FyZSAqLwotCW9sZG1zciAmPSB+MHhmZmZmOwotCW1zciAmPSAweGZmZmY7Ci0Jb2xkbXNyIHw9IG1zcjsKLQotCXdybXNyKE1TUl9JQTMyX1BFUkZfQ1RMLCBvbGRtc3IsIGgpOwotCi0JY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7Ci0KLQlyZXR2YWwgPSAwOwogbWlncmF0ZV9lbmQ6CiAJc2V0X2NwdXNfYWxsb3dlZChjdXJyZW50LCBzYXZlZF9tYXNrKTsKLQlyZXR1cm4gKHJldHZhbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnJlcV9hdHRyKiBjZW50cmlub19hdHRyW10gPSB7CkBAIC02OTAsMTIgKzc5MSwyNSBAQAogCWlmICghY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCiAJCXJldHVybiAtRU5PREVWOwogCisJY2VudHJpbm9fY3B1X2Vhcmx5X2luaXRfYWNwaSgpOworCiAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZjZW50cmlub19kcml2ZXIpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgY2VudHJpbm9fZXhpdCh2b2lkKQogeworI2lmZGVmIENPTkZJR19YODZfU1BFRURTVEVQX0NFTlRSSU5PX0FDUEkKKwl1bnNpZ25lZCBpbnQgajsKKyNlbmRpZgorCQogCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJmNlbnRyaW5vX2RyaXZlcik7CisKKyNpZmRlZiBDT05GSUdfWDg2X1NQRUVEU1RFUF9DRU5UUklOT19BQ1BJCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJa2ZyZWUoYWNwaV9wZXJmX2RhdGFbal0pOworCQlhY3BpX3BlcmZfZGF0YVtqXSA9IE5VTEw7CisJfQorI2VuZGlmCiB9CiAKIE1PRFVMRV9BVVRIT1IgKCJKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+Iik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3lyaXguYwppbmRleCAwMGYyZTA1Li5mYzMyYzgwIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jeXJpeC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2N5cml4LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3lyaXhfNTV4MFtdID0geworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGRhdGEgY3lyaXhfNTV4MFtdID0gewogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MTApIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQ1lSSVgsIFBDSV9ERVZJQ0VfSURfQ1lSSVhfNTUyMCkgfSwKIAl7IH0sCkBAIC0yNzIsMTQgKzI3MiwxNSBAQAogCiAJCXByaW50ayhLRVJOX0lORk8gIldvcmtpbmcgYXJvdW5kIEN5cml4IE1lZGlhR1ggdmlydHVhbCBETUEgYnVncy5cbiIpOwogCQlpc2FfZG1hX2JyaWRnZV9idWdneSA9IDI7Ci0jZW5kaWYJCQotCQljLT54ODZfY2FjaGVfc2l6ZT0xNjsJLyogWWVwIDE2SyBpbnRlZ3JhdGVkIGNhY2hlIHRoYXRzIGl0ICovCi0gCisKKwogCQkvKgogCQkgKiAgVGhlIDU1MTAvNTUyMCBjb21wYW5pb24gY2hpcHMgaGF2ZSBhIGZ1bmt5IFBJVC4KIAkJICovICAKIAkJaWYgKHBjaV9kZXZfcHJlc2VudChjeXJpeF81NXgwKSkKIAkJCXBpdF9sYXRjaF9idWdneSA9IDE7CisjZW5kaWYKKwkJYy0+eDg2X2NhY2hlX3NpemU9MTY7CS8qIFllcCAxNksgaW50ZWdyYXRlZCBjYWNoZSB0aGF0cyBpdCAqLwogCiAJCS8qIEdYbSBzdXBwb3J0cyBleHRlbmRlZCBjcHVpZCBsZXZlbHMgJ2FsYScgQU1EICovCiAJCWlmIChjLT5jcHVpZF9sZXZlbCA9PSAyKSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9wcm9jLmMKaW5kZXggZjk0Y2RiNy4uYTE5ZmNiMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvcHJvYy5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L3Byb2MuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAJCS8qIFZJQS9DeXJpeC9DZW50YXVyLWRlZmluZWQgKi8KIAkJTlVMTCwgTlVMTCwgInJuZyIsICJybmdfZW4iLCBOVUxMLCBOVUxMLCAiYWNlIiwgImFjZV9lbiIsCi0JCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCSJhY2UyIiwgImFjZTJfZW4iLCAicGhlIiwgInBoZV9lbiIsICJwbW0iLCAicG1tX2VuIiwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcmFzaC5jCmluZGV4IDJiMGNmY2UuLjIxZGMxYmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL2kzODYva2VybmVsL2NyYXNoLmMKQEAgLTExNCw3ICsxMTQsOCBAQAogCWF0b21pY19kZWMoJndhaXRpbmdfZm9yX2NyYXNoX2lwaSk7CiAJLyogQXNzdW1lIGhsdCB3b3JrcyAqLwogCWhhbHQoKTsKLQlmb3IoOzspOworCWZvciAoOzspCisJCWNwdV9yZWxheCgpOwogCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMgYi9hcmNoL2kzODYva2VybmVsL2RvdWJsZWZhdWx0LmMKaW5kZXggNWVkYjFkMy4uYjRkMTRjMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9kb3VibGVmYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvZG91YmxlZmF1bHQuYwpAQCAtNDQsNyArNDQsOCBAQAogCQl9CiAJfQogCi0JZm9yICg7OykgLyogbm90aGluZyAqLzsKKwlmb3IgKDs7KQorCQljcHVfcmVsYXgoKTsKIH0KIAogc3RydWN0IHRzc19zdHJ1Y3QgZG91YmxlZmF1bHRfdHNzIF9fY2FjaGVsaW5lX2FsaWduZWQgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2kzODcuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCmluZGV4IGQ3NTUyNDcuLmM0MzUxOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTM4Ny5jCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIEhBVkVfSFdGUCAxCiAjZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbXhjc3JfZmVhdHVyZV9tYXNrID0gMHhmZmZmZmZmZjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG14Y3NyX2ZlYXR1cmVfbWFzayBfX3JlYWRfbW9zdGx5ID0gMHhmZmZmZmZmZjsKIAogdm9pZCBteGNzcl9mZWF0dXJlX21hc2tfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCmluZGV4IDMyM2VmOGEuLmI3NjM2YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKQEAgLTI3MSw4ICsyNzEsOCBAQAogCSAqIHRoZSBrZXJuZWwgaW5pdGlhbGl6YXRpb24gY29kZSBjYW4gZ2V0IGl0CiAJICogb3V0IG9mLgogCSAqLwotCW91dGIoMHhmZiwgMHgyMSk7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KLQlvdXRiKDB4ZmYsIDB4QTEpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCisJb3V0YigweGZmLCBQSUNfTUFTVEVSX0lNUik7CS8qIG1hc2sgYWxsIG9mIDgyNTlBLTEgKi8KKwlvdXRiKDB4ZmYsIFBJQ19TTEFWRV9JTVIpOwkvKiBtYXNrIGFsbCBvZiA4MjU5QS0xICovCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaW9fYXBpYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKaW5kZXggZDcwZjJhZC4uYTYyZGYzZSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMKQEAgLTI2Nyw3ICsyNjcsNyBAQAogIyBpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCkgKi8KICMgaW5jbHVkZSA8bGludXgvdGltZXIuaD4JLyogdGltZV9hZnRlcigpICovCiAgCi0jIGlmZGVmIENPTkZJR19CQUxBTkNFRF9JUlFfREVCVUcKKyNpZmRlZiBDT05GSUdfQkFMQU5DRURfSVJRX0RFQlVHCiAjICBkZWZpbmUgVERwcmludGsoeC4uLikgZG8geyBwcmludGsoIjwlbGQ6JXM6JWQ+OiAiLCBqaWZmaWVzLCBfX0ZJTEVfXywgX19MSU5FX18pOyBwcmludGsoeCk7IH0gd2hpbGUgKDApCiAjICBkZWZpbmUgRHByaW50ayh4Li4uKSBkbyB7IFREcHJpbnRrKHgpOyB9IHdoaWxlICgwKQogIyBlbHNlCkBAIC0yNzUsMTAgKzI3NSwxNSBAQAogIyAgZGVmaW5lIERwcmludGsoeC4uLikgCiAjIGVuZGlmCiAKLQogI2RlZmluZSBJUlFCQUxBTkNFX0NIRUNLX0FSQ0ggLTk5OQotc3RhdGljIGludCBpcnFiYWxhbmNlX2Rpc2FibGVkID0gSVJRQkFMQU5DRV9DSEVDS19BUkNIOwotc3RhdGljIGludCBwaHlzaWNhbF9iYWxhbmNlID0gMDsKKyNkZWZpbmUgTUFYX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTAkoNSpIWikKKyNkZWZpbmUgTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTAkoSFovMikKKyNkZWZpbmUgQkFMQU5DRURfSVJRX01PUkVfREVMVEEJCShIWi8xMCkKKyNkZWZpbmUgQkFMQU5DRURfSVJRX0xFU1NfREVMVEEJCShIWikKKworc3RhdGljIGludCBpcnFiYWxhbmNlX2Rpc2FibGVkIF9fcmVhZF9tb3N0bHkgPSBJUlFCQUxBTkNFX0NIRUNLX0FSQ0g7CitzdGF0aWMgaW50IHBoeXNpY2FsX2JhbGFuY2UgX19yZWFkX21vc3RseTsKK3N0YXRpYyBsb25nIGJhbGFuY2VkX2lycV9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ID0gTUFYX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTDsKIAogc3RhdGljIHN0cnVjdCBpcnFfY3B1X2luZm8gewogCXVuc2lnbmVkIGxvbmcgKiBsYXN0X2lycTsKQEAgLTI5NywxMiArMzAyLDE0IEBACiAKICNkZWZpbmUgQ1BVX1RPX1BBQ0tBR0VJTkRFWChpKSAoZmlyc3RfY3B1KGNwdV9zaWJsaW5nX21hcFtpXSkpCiAKLSNkZWZpbmUgTUFYX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTAkoNSpIWikKLSNkZWZpbmUgTUlOX0JBTEFOQ0VEX0lSUV9JTlRFUlZBTAkoSFovMikKLSNkZWZpbmUgQkFMQU5DRURfSVJRX01PUkVfREVMVEEJCShIWi8xMCkKLSNkZWZpbmUgQkFMQU5DRURfSVJRX0xFU1NfREVMVEEJCShIWikKK3N0YXRpYyBjcHVtYXNrX3QgYmFsYW5jZV9pcnFfYWZmaW5pdHlbTlJfSVJRU10gPSB7CisJWzAgLi4uIE5SX0lSUVMtMV0gPSBDUFVfTUFTS19BTEwKK307CiAKLXN0YXRpYyBsb25nIGJhbGFuY2VkX2lycV9pbnRlcnZhbCA9IE1BWF9CQUxBTkNFRF9JUlFfSU5URVJWQUw7Cit2b2lkIHNldF9iYWxhbmNlX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKKwliYWxhbmNlX2lycV9hZmZpbml0eVtpcnFdID0gbWFzazsKK30KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbW92ZShpbnQgY3Vycl9jcHUsIGNwdW1hc2tfdCBhbGxvd2VkX21hc2ssCiAJCQl1bnNpZ25lZCBsb25nIG5vdywgaW50IGRpcmVjdGlvbikKQEAgLTM0MCw3ICszNDcsNyBAQAogCWlmIChpcnFiYWxhbmNlX2Rpc2FibGVkKQogCQlyZXR1cm47IAogCi0JY3B1c19hbmQoYWxsb3dlZF9tYXNrLCBjcHVfb25saW5lX21hcCwgaXJxX2FmZmluaXR5W2lycV0pOworCWNwdXNfYW5kKGFsbG93ZWRfbWFzaywgY3B1X29ubGluZV9tYXAsIGJhbGFuY2VfaXJxX2FmZmluaXR5W2lycV0pOwogCW5ld19jcHUgPSBtb3ZlKGNwdSwgYWxsb3dlZF9tYXNrLCBub3csIDEpOwogCWlmIChjcHUgIT0gbmV3X2NwdSkgewogCQlzZXRfcGVuZGluZ19pcnEoaXJxLCBjcHVtYXNrX29mX2NwdShuZXdfY3B1KSk7CkBAIC01MjksNyArNTM2LDkgQEAKIAkJfQogCX0KIAotCWNwdXNfYW5kKGFsbG93ZWRfbWFzaywgY3B1X29ubGluZV9tYXAsIGlycV9hZmZpbml0eVtzZWxlY3RlZF9pcnFdKTsKKwljcHVzX2FuZChhbGxvd2VkX21hc2ssCisJCWNwdV9vbmxpbmVfbWFwLAorCQliYWxhbmNlX2lycV9hZmZpbml0eVtzZWxlY3RlZF9pcnFdKTsKIAl0YXJnZXRfY3B1X21hc2sgPSBjcHVtYXNrX29mX2NwdShtaW5fbG9hZGVkKTsKIAljcHVzX2FuZCh0bXAsIHRhcmdldF9jcHVfbWFzaywgYWxsb3dlZF9tYXNrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMKaW5kZXggZjNhOWM3OC4uNDljZTRjMyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC00Miw4ICs0Miw4IEBACiAJdTMyICAgICAgICAgICAgICAgICAgICAgc3RhY2tbVEhSRUFEX1NJWkUvc2l6ZW9mKHUzMildOwogfTsKIAotc3RhdGljIHVuaW9uIGlycV9jdHggKmhhcmRpcnFfY3R4W05SX0NQVVNdOwotc3RhdGljIHVuaW9uIGlycV9jdHggKnNvZnRpcnFfY3R4W05SX0NQVVNdOworc3RhdGljIHVuaW9uIGlycV9jdHggKmhhcmRpcnFfY3R4W05SX0NQVVNdIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgdW5pb24gaXJxX2N0eCAqc29mdGlycV9jdHhbTlJfQ1BVU10gX19yZWFkX21vc3RseTsKICNlbmRpZgogCiAvKgpAQCAtOTUsNiArOTUsMTQgQEAKIAkJaXJxY3R4LT50aW5mby50YXNrID0gY3VyY3R4LT50aW5mby50YXNrOwogCQlpcnFjdHgtPnRpbmZvLnByZXZpb3VzX2VzcCA9IGN1cnJlbnRfc3RhY2tfcG9pbnRlcjsKIAorCQkvKgorCQkgKiBDb3B5IHRoZSBzb2Z0aXJxIGJpdHMgaW4gcHJlZW1wdF9jb3VudCBzbyB0aGF0IHRoZQorCQkgKiBzb2Z0aXJxIGNoZWNrcyB3b3JrIGluIHRoZSBoYXJkaXJxIGNvbnRleHQuCisJCSAqLworCQlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgPQorCQkJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50ICYgflNPRlRJUlFfTUFTSyB8CisJCQljdXJjdHgtPnRpbmZvLnByZWVtcHRfY291bnQgJiBTT0ZUSVJRX01BU0s7CisKIAkJYXNtIHZvbGF0aWxlKAogCQkJIiAgICAgICB4Y2hnbCAgICUlZWJ4LCUlZXNwICAgICAgXG4iCiAJCQkiICAgICAgIGNhbGwgICAgX19kb19JUlEgICAgICAgICBcbiIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwva3Byb2Jlcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKaW5kZXggMzg4MDZmNC4uMzk1YTlhNiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9rcHJvYmVzLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IChzdHJ1Y3QgZGllX2FyZ3MgKilkYXRhOwogCWludCByZXQgPSBOT1RJRllfRE9ORTsKIAotCWlmIChhcmdzLT5yZWdzICYmIHVzZXJfbW9kZShhcmdzLT5yZWdzKSkKKwlpZiAoYXJncy0+cmVncyAmJiB1c2VyX21vZGVfdm0oYXJncy0+cmVncykpCiAJCXJldHVybiByZXQ7CiAKIAlzd2l0Y2ggKHZhbCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvbWljcm9jb2RlLmMKaW5kZXggZTdjMTM4Zi4uMGE4NjU4OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9taWNyb2NvZGUuYworKysgYi9hcmNoL2kzODYva2VybmVsL21pY3JvY29kZS5jCkBAIC05MSw3ICs5MSwxMCBAQAogTU9EVUxFX0FVVEhPUigiVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLSNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0Igorc3RhdGljIGludCB2ZXJib3NlOworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7CisKKyNkZWZpbmUgTUlDUk9DT0RFX1ZFUlNJT04gCSIxLjE0YSIKIAogI2RlZmluZSBERUZBVUxUX1VDT0RFX0RBVEFTSVpFIAkoMjAwMCkgCSAgLyogMjAwMCBieXRlcyAqLwogI2RlZmluZSBNQ19IRUFERVJfU0laRQkJKHNpemVvZiAobWljcm9jb2RlX2hlYWRlcl90KSkgIAkgIC8qIDQ4IGJ5dGVzICovCkBAIC0xMjIsMTQgKzEyNSwxNSBAQAogCiB0eXBlZGVmIGVudW0gbWNfZXJyb3JfY29kZSB7CiAJTUNfU1VDQ0VTUyAJPSAwLAotCU1DX05PVEZPVU5EIAk9IDEsCi0JTUNfTUFSS0VEIAk9IDIsCi0JTUNfQUxMT0NBVEVEIAk9IDMsCisJTUNfSUdOT1JFRCAJPSAxLAorCU1DX05PVEZPVU5EIAk9IDIsCisJTUNfTUFSS0VEIAk9IDMsCisJTUNfQUxMT0NBVEVEIAk9IDQsCiB9IG1jX2Vycm9yX2NvZGVfdDsKIAogc3RhdGljIHN0cnVjdCB1Y29kZV9jcHVfaW5mbyB7CiAJdW5zaWduZWQgaW50IHNpZzsKLQl1bnNpZ25lZCBpbnQgcGY7CisJdW5zaWduZWQgaW50IHBmLCBvcmlnX3BmOwogCXVuc2lnbmVkIGludCByZXY7CiAJdW5zaWduZWQgaW50IGNrc3VtOwogCW1jX2Vycm9yX2NvZGVfdCBlcnI7CkBAIC0xNjQsNiArMTY4LDcgQEAKIAkJCXJkbXNyKE1TUl9JQTMyX1BMQVRGT1JNX0lELCB2YWxbMF0sIHZhbFsxXSk7CiAJCQl1Y2ktPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKIAkJfQorCQl1Y2ktPm9yaWdfcGYgPSB1Y2ktPnBmOwogCX0KIAogCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CkBAIC0xOTcsMjEgKzIwMiwzNCBAQAogCXByX2RlYnVnKCIgICBDaGVja3N1bSAweCV4XG4iLCBja3N1bSk7CiAKIAlpZiAobWNfaGVhZGVyLT5yZXYgPCB1Y2ktPnJldikgewotCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQgbm90ICd1cGdyYWRpbmcnIHRvIGVhcmxpZXIgcmV2aXNpb24iCi0JCSAgICAgICAiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdV9udW0sIG1jX2hlYWRlci0+cmV2LCB1Y2ktPnJldik7Ci0JCWdvdG8gb3V0OworCQlpZiAodWNpLT5lcnIgPT0gTUNfTk9URk9VTkQpIHsKKwkJCXVjaS0+ZXJyID0gTUNfSUdOT1JFRDsKKwkJCXVjaS0+Y2tzdW0gPSBtY19oZWFkZXItPnJldjsKKwkJfSBlbHNlIGlmICh1Y2ktPmVyciA9PSBNQ19JR05PUkVEICYmIHVjaS0+Y2tzdW0gPCBtY19oZWFkZXItPnJldikKKwkJCXVjaS0+Y2tzdW0gPSBtY19oZWFkZXItPnJldjsKIAl9IGVsc2UgaWYgKG1jX2hlYWRlci0+cmV2ID09IHVjaS0+cmV2KSB7Ci0JCS8qIG5vdGlmeSB0aGUgY2FsbGVyIG9mIHN1Y2Nlc3Mgb24gdGhpcyBjcHUgKi8KLQkJdWNpLT5lcnIgPSBNQ19TVUNDRVNTOwotCQlnb3RvIG91dDsKKwkJaWYgKHVjaS0+ZXJyIDwgTUNfTUFSS0VEKSB7CisJCQkvKiBub3RpZnkgdGhlIGNhbGxlciBvZiBzdWNjZXNzIG9uIHRoaXMgY3B1ICovCisJCQl1Y2ktPmVyciA9IE1DX1NVQ0NFU1M7CisJCX0KKwl9IGVsc2UgaWYgKHVjaS0+ZXJyICE9IE1DX0FMTE9DQVRFRCB8fCBtY19oZWFkZXItPnJldiA+IHVjaS0+bWMtPmhkci5yZXYpIHsKKwkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGggIgorCQkJIiByZXZpc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLCBjcHVfbnVtLCBtY19oZWFkZXItPnJldiwgdWNpLT5yZXYpOworCQl1Y2ktPmNrc3VtID0gY2tzdW07CisJCXVjaS0+cGYgPSBwZjsgLyoga2VlcCB0aGUgb3JpZ2luYWwgbWMgcGYgZm9yIGNrc3VtIGNhbGN1bGF0aW9uICovCisJCXVjaS0+ZXJyID0gTUNfTUFSS0VEOyAvKiBmb3VuZCB0aGUgbWF0Y2ggKi8KKwkJZm9yX2VhY2hfb25saW5lX2NwdShjcHVfbnVtKSB7CisJCQlpZiAodWNvZGVfY3B1X2luZm8gKyBjcHVfbnVtICE9IHVjaQorCQkJICAgICYmIHVjb2RlX2NwdV9pbmZvW2NwdV9udW1dLm1jID09IHVjaS0+bWMpIHsKKwkJCQl1Y2ktPm1jID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAodWNpLT5tYyAhPSBOVUxMKSB7CisJCQl2ZnJlZSh1Y2ktPm1jKTsKKwkJCXVjaS0+bWMgPSBOVUxMOworCQl9CiAJfQotCi0JcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgdXBkYXRlIHdpdGggIgotCQkiIHJldmlzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGNwdV9udW0sIG1jX2hlYWRlci0+cmV2LCB1Y2ktPnJldik7Ci0JdWNpLT5ja3N1bSA9IGNrc3VtOwotCXVjaS0+cGYgPSBwZjsgLyoga2VlcCB0aGUgb3JpZ2luYWwgbWMgcGYgZm9yIGNrc3VtIGNhbGN1bGF0aW9uICovCi0JdWNpLT5lcnIgPSBNQ19NQVJLRUQ7IC8qIGZvdW5kIHRoZSBtYXRjaCAqLwotb3V0OgogCXJldHVybjsKIH0KIApAQCAtMjUzLDEwICsyNzEsOCBAQAogCiAJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X251bSkgewogCQkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07Ci0JCQlpZiAodWNpLT5lcnIgIT0gTUNfTk9URk9VTkQpIC8qIGFscmVhZHkgZm91bmQgYSBtYXRjaCBvciBub3QgYW4gb25saW5lIGNwdSovCi0JCQkJY29udGludWU7CiAKLQkJCWlmIChzaWdtYXRjaChtY19oZWFkZXIuc2lnLCB1Y2ktPnNpZywgbWNfaGVhZGVyLnBmLCB1Y2ktPnBmKSkKKwkJCWlmIChzaWdtYXRjaChtY19oZWFkZXIuc2lnLCB1Y2ktPnNpZywgbWNfaGVhZGVyLnBmLCB1Y2ktPm9yaWdfcGYpKQogCQkJCW1hcmtfbWljcm9jb2RlX3VwZGF0ZShjcHVfbnVtLCAmbWNfaGVhZGVyLCBtY19oZWFkZXIuc2lnLCBtY19oZWFkZXIucGYsIG1jX2hlYWRlci5ja3N1bSk7CiAJCX0KIApAQCAtMjk1LDkgKzMxMSw4IEBACiAJCQkJfQogCQkJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1X251bSkgewogCQkJCQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKLQkJCQkJaWYgKHVjaS0+ZXJyICE9IE1DX05PVEZPVU5EKSAvKiBhbHJlYWR5IGZvdW5kIGEgbWF0Y2ggb3Igbm90IGFuIG9ubGluZSBjcHUqLwotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChzaWdtYXRjaChleHRfc2lnLnNpZywgdWNpLT5zaWcsIGV4dF9zaWcucGYsIHVjaS0+cGYpKSB7CisKKwkJCQkJaWYgKHNpZ21hdGNoKGV4dF9zaWcuc2lnLCB1Y2ktPnNpZywgZXh0X3NpZy5wZiwgdWNpLT5vcmlnX3BmKSkgewogCQkJCQkJbWFya19taWNyb2NvZGVfdXBkYXRlKGNwdV9udW0sICZtY19oZWFkZXIsIGV4dF9zaWcuc2lnLCBleHRfc2lnLnBmLCBleHRfc2lnLmNrc3VtKTsKIAkJCQkJfQogCQkJCX0KQEAgLTM2OCw2ICszODMsMTMgQEAKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1X251bTsKIAogCWlmICh1Y2ktPm1jID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCWlmICh1Y2ktPmVyciA9PSBNQ19TVUNDRVNTKQorCQkJCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogQ1BVJWQgYWxyZWFkeSBhdCByZXZpc2lvbiAweCV4XG4iLAorCQkJCQljcHVfbnVtLCB1Y2ktPnJldik7CisJCQllbHNlCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBObyBuZXcgbWljcm9jb2RlIGRhdGEgZm9yIENQVSVkXG4iLCBjcHVfbnVtKTsKKwkJfQogCQlyZXR1cm47CiAJfQogCkBAIC00MjYsNiArNDQ4LDkgQEAKIAkJCQkJdWNvZGVfY3B1X2luZm9bal0ubWMgPSBOVUxMOwogCQkJfQogCQl9CisJCWlmICh1Y29kZV9jcHVfaW5mb1tpXS5lcnIgPT0gTUNfSUdOT1JFRCAmJiB2ZXJib3NlKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWljcm9jb2RlOiBDUFUlZCBub3QgJ3VwZ3JhZGluZycgdG8gZWFybGllciByZXZpc2lvbiIKKwkJCSAgICAgICAiIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsIGksIHVjb2RlX2NwdV9pbmZvW2ldLmNrc3VtLCB1Y29kZV9jcHVfaW5mb1tpXS5yZXYpOwogCX0KIG91dDoKIAlyZXR1cm4gZXJyb3I7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NldHVwLmMgYi9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKaW5kZXggZGQ2YjBlMy4uNmMxNjM5OCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyYXNoX2R1bXAuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAKICNpbmNsdWRlIDx2aWRlby9lZGlkLmg+CiAKQEAgLTYwLDcgKzYxLDcgQEAKICNpbmNsdWRlIDxhc20vaW9fYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9pc3QuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlICJzZXR1cF9hcmNoX3ByZS5oIgorI2luY2x1ZGUgPHNldHVwX2FyY2guaD4KICNpbmNsdWRlIDxiaW9zX2ViZGEuaD4KIAogLyogRm9yd2FyZCBEZWNsYXJhdGlvbi4gKi8KQEAgLTQxMCw4ICs0MTEsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGFkZF9tZW1vcnlfcmVnaW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCit2b2lkIF9faW5pdCBhZGRfbWVtb3J5X3JlZ2lvbih1bnNpZ25lZCBsb25nIGxvbmcgc3RhcnQsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgaW50IHR5cGUpCiB7CiAJaW50IHg7CiAKQEAgLTQ3NCw3ICs0NzUsNyBAQAogc3RhdGljIHN0cnVjdCBlODIwZW50cnkgKm92ZXJsYXBfbGlzdFtFODIwTUFYXSBfX2luaXRkYXRhOwogc3RhdGljIHN0cnVjdCBlODIwZW50cnkgbmV3X2Jpb3NbRTgyME1BWF0gX19pbml0ZGF0YTsKIAotc3RhdGljIGludCBfX2luaXQgc2FuaXRpemVfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGNoYXIgKiBwbnJfbWFwKQoraW50IF9faW5pdCBzYW5pdGl6ZV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgY2hhciAqIHBucl9tYXApCiB7CiAJc3RydWN0IGNoYW5nZV9tZW1iZXIgKmNoYW5nZV90bXA7CiAJdW5zaWduZWQgbG9uZyBjdXJyZW50X3R5cGUsIGxhc3RfdHlwZTsKQEAgLTY0Myw3ICs2NDQsNyBAQAogICogdGhpbmtwYWQgNTYweCwgZm9yIGV4YW1wbGUsIGRvZXMgbm90IGNvb3BlcmF0ZSB3aXRoIHRoZSBtZW1vcnkKICAqIGRldGVjdGlvbiBjb2RlLikKICAqLwotc3RhdGljIGludCBfX2luaXQgY29weV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgaW50IG5yX21hcCkKK2ludCBfX2luaXQgY29weV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgaW50IG5yX21hcCkKIHsKIAkvKiBPbmx5IG9uZSBtZW1vcnkgcmVnaW9uIChvciBuZWdhdGl2ZSk/IElnbm9yZSBpdCAqLwogCWlmIChucl9tYXAgPCAyKQpAQCAtNzAxLDEyICs3MDIsNiBAQAogfQogI2VuZGlmCiAKLS8qCi0gKiBEbyBOT1QgRVZFUiBsb29rIGF0IHRoZSBCSU9TIG1lbW9yeSBzaXplIGxvY2F0aW9uLgotICogSXQgZG9lcyBub3Qgd29yayBvbiBtYW55IG1hY2hpbmVzLgotICovCi0jZGVmaW5lIExPV01FTVNJWkUoKQkoMHg5ZjAwMCkKLQogc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX2NtZGxpbmVfZWFybHkgKGNoYXIgKiogY21kbGluZV9wKQogewogCWNoYXIgYyA9ICcgJywgKnRvID0gY29tbWFuZF9saW5lLCAqZnJvbSA9IHNhdmVkX2NvbW1hbmRfbGluZTsKQEAgLTE0MjMsOCArMTQxOCw2IEBACiAJCXBjaV9tZW1fc3RhcnQsIGdhcHN0YXJ0LCBnYXBzaXplKTsKIH0KIAotc3RhdGljIGNoYXIgKiBfX2luaXQgbWFjaGluZV9zcGVjaWZpY19tZW1vcnlfc2V0dXAodm9pZCk7Ci0KICNpZmRlZiBDT05GSUdfTUNBCiBzdGF0aWMgdm9pZCBzZXRfbWNhX2J1cyhpbnQgeCkKIHsKQEAgLTE0MzQsNiArMTQyNywxMTEgQEAKIHN0YXRpYyB2b2lkIHNldF9tY2FfYnVzKGludCB4KSB7IH0KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKK3N0YXRpYyB2b2lkIF9faW5pdCBtYXJrX25vc2F2ZV9wYWdlX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXdoaWxlIChzdGFydCA8PSBlbmQpIHsKKwkJcGFnZSA9IHBmbl90b19wYWdlKHN0YXJ0KTsKKwkJU2V0UGFnZU5vc2F2ZShwYWdlKTsKKwkJc3RhcnQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlODIwX25vc2F2ZV9yZXNlcnZlZF9wYWdlcyh2b2lkKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgcl9zdGFydCA9IDAsIHJfZW5kID0gMDsKKworCS8qIEFzc3VtZSBlODIwIG1hcCBpcyBzb3J0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgeworCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCisJCXN0YXJ0ID0gUEZOX0RPV04oZWktPmFkZHIpOworCQllbmQgPSBQRk5fVVAoZWktPmFkZHIgKyBlaS0+c2l6ZSk7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQljb250aW51ZTsKKwkJaWYgKGVpLT50eXBlID09IEU4MjBfUkVTRVJWRUQpCisJCQljb250aW51ZTsKKwkJcl9lbmQgPSBzdGFydDsKKwkJLyoKKwkJICogSGlnaG1lbSAnUmVzZXJ2ZWQnIHBhZ2VzIGFyZSBtYXJrZWQgYXMgcmVzZXJ2ZWQsIHN3c3VzcAorCQkgKiB3aWxsIG5vdCBzYXZlL3Jlc3RvcmUgdGhlbSwgc28gd2UgaWdub3JlIHRoZXNlIHBhZ2VzIGhlcmUuCisJCSAqLworCQlpZiAocl9lbmQgPiBtYXhfbG93X3BmbikKKwkJCXJfZW5kID0gbWF4X2xvd19wZm47CisJCWlmIChyX2VuZCA+IHJfc3RhcnQpCisJCQltYXJrX25vc2F2ZV9wYWdlX3JhbmdlKHJfc3RhcnQsIHJfZW5kLTEpOworCQlpZiAocl9lbmQgPj0gbWF4X2xvd19wZm4pCisJCQlicmVhazsKKwkJcl9zdGFydCA9IGVuZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlODIwX3NhdmVfYWNwaV9wYWdlcyh2b2lkKQoreworCWludCBpOworCisJLyogQXNzdW1lIGU4MjAgbWFwIGlzIHNvcnRlZCAqLworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwkJc3RhcnQgPSBlaS0+YWRkcjsKKwkJZW5kID0gZWktPmFkZHIgKyBlaS0+c2l6ZTsKKwkJaWYgKHN0YXJ0ID49IGVuZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZWktPnR5cGUgIT0gRTgyMF9BQ1BJICYmIGVpLT50eXBlICE9IEU4MjBfTlZTKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIElmIHRoZSByZWdpb24gaXMgYmVsb3cgbWF4X2xvd19wZm4sIGl0IHdpbGwgYmUKKwkJICogc2F2ZWQvcmVzdG9yZWQgYnkgc3dzdXNwIGZvbGxvdyAnUkFNJyB0eXBlLgorCQkgKi8KKwkJaWYgKHN0YXJ0IDwgKG1heF9sb3dfcGZuIDw8IFBBR0VfU0hJRlQpKQorCQkJc3RhcnQgPSBtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZUOworCQkvKgorCQkgKiBIaWdobWVtIHBhZ2VzIChBQ1BJIE5WUy9EYXRhKSBhcmUgcmVzZXJ2ZWQsIGJ1dCBzd3N1c3AKKwkJICogaGlnaG1lbSBzYXZlL3Jlc3RvcmUgd2lsbCBub3Qgc2F2ZS9yZXN0b3JlIHRoZW0uIFdlIG1hcmtlZAorCQkgKiB0aGVtIGFzIGFyY2ggc2F2ZWFibGUgcGFnZXMgaGVyZQorCQkgKi8KKwkJaWYgKGVuZCA+IHN0YXJ0KQorCQkJc3dzdXNwX2FkZF9hcmNoX3BhZ2VzKHN0YXJ0LCBlbmQpOworCX0KK30KKworZXh0ZXJuIGNoYXIgX19zdGFydF9yb2RhdGEsIF9fZW5kX3JvZGF0YTsKKy8qCisgKiBCSU9TIHJlc2VydmVkIHJlZ2lvbi9ob2xlIC0gbm8gc2F2ZS9yZXN0b3JlCisgKiBBQ1BJIE5WUyAtIHNhdmUvcmVzdG9yZQorICogQUNQSSBEYXRhIC0gdGhpcyBpcyBhIGxpdHRsZSB0cmlja3ksIHRoZSBtZW0gY291bGQgYmUgdXNlZCBieSBPUyBhZnRlciBPUworICogcmVhZHMgdGFibGVzIGZyb20gdGhlIHJlZ2lvbiwgYnV0IGFueXdheSBzYXZlL3Jlc3RvcmUgdGhlIG1lbW9yeSBoYXNuJ3QgYW55CisgKiBzaWRlIGVmZmVjdCBhbmQgTGludXggcnVudGltZSBtb2R1bGUgbG9hZC91bmxvYWQgbWlnaHQgdXNlIGl0LgorICoga2VybmVsIHJvZGF0YSAtIG5vIHNhdmUvcmVzdG9yZSAoa2VybmVsIHJvZGF0YSBpc24ndCBjaGFuZ2VkKQorICovCitzdGF0aWMgaW50IF9faW5pdCBtYXJrX25vc2F2ZV9wYWdlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcGZuX3N0YXJ0LCBwZm5fZW5kOworCisJLyogRklYTUU6IHByb3ZpZGUgYSB2ZXJzaW9uIGZvciBlZmkgQklPUyAqLworCWlmIChlZmlfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisJLyogQklPUyByZXNlcnZlZCByZWdpb25zICYgaG9sZXMgKi8KKwllODIwX25vc2F2ZV9yZXNlcnZlZF9wYWdlcygpOworCisJLyoga2VybmVsIHJvZGF0YSAqLworCXBmbl9zdGFydCA9IFBGTl9VUCh2aXJ0X3RvX3BoeXMoJl9fc3RhcnRfcm9kYXRhKSk7CisJcGZuX2VuZCA9IFBGTl9ET1dOKHZpcnRfdG9fcGh5cygmX19lbmRfcm9kYXRhKSk7CisJbWFya19ub3NhdmVfcGFnZV9yYW5nZShwZm5fc3RhcnQsIHBmbl9lbmQtMSk7CisKKwkvKiByZWNvcmQgQUNQSSBEYXRhL05WUyBhcyBzYXZlYWJsZSAqLworCWU4MjBfc2F2ZV9hY3BpX3BhZ2VzKCk7CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwobWFya19ub3NhdmVfcGFnZXMpOworI2VuZGlmCisKIC8qCiAgKiBEZXRlcm1pbmUgaWYgd2Ugd2VyZSBsb2FkZWQgYnkgYW4gRUZJIGxvYWRlci4gIElmIHNvLCB0aGVuIHdlIGhhdmUgYWxzbyBiZWVuCiAgKiBwYXNzZWQgdGhlIGVmaSBtZW1tYXAsIHN5c3RhYiwgZXRjLiwgc28gd2Ugc2hvdWxkIHVzZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMKQEAgLTE2MDIsNyArMTcwMCw2IEBACiB9CiBkZXZpY2VfaW5pdGNhbGwoYWRkX3Bjc3Brcik7CiAKLSNpbmNsdWRlICJzZXR1cF9hcmNoX3Bvc3QuaCIKIC8qCiAgKiBMb2NhbCBWYXJpYWJsZXM6CiAgKiBtb2RlOmMKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggODI1YjJiNC4uYmQwY2E1YyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCQkgKiBhbGwgQVBzIHN5bmNocm9uaXplIGJ1dCB0aGV5IGxvb3Agb24gJz09IG51bV9jcHVzJwogCQkgKi8KIAkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKS0xKQotCQkJbWIoKTsKKwkJCWNwdV9yZWxheCgpOwogCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RvcCwgMCk7CiAJCXdtYigpOwogCQkvKgpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCSAqIFdhaXQgZm9yIGFsbCBBUHMgdG8gbGVhdmUgdGhlIHN5bmNocm9uaXphdGlvbiBwb2ludDoKIAkJICovCiAJCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2NvdW50X3N0b3ApICE9IG51bV9ib290aW5nX2NwdXMoKS0xKQotCQkJbWIoKTsKKwkJCWNwdV9yZWxheCgpOwogCQlhdG9taWNfc2V0KCZ0c2NfY291bnRfc3RhcnQsIDApOwogCQl3bWIoKTsKIAkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0b3ApOwpAQCAtMzMzLDE5ICszMzMsMjEgQEAKIAkgKiB0aGlzIGdldHMgY2FsbGVkLCBzbyB3ZSBmaXJzdCB3YWl0IGZvciB0aGUgQlAgdG8KIAkgKiBmaW5pc2ggU01QIGluaXRpYWxpemF0aW9uOgogCSAqLwotCXdoaWxlICghYXRvbWljX3JlYWQoJnRzY19zdGFydF9mbGFnKSkgbWIoKTsKKwl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Nfc3RhcnRfZmxhZykpCisJCWNwdV9yZWxheCgpOwogCiAJZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKIAkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0YXJ0KTsKIAkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2NfY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCW1iKCk7CisJCQljcHVfcmVsYXgoKTsKIAogCQlyZHRzY2xsKHRzY192YWx1ZXNbc21wX3Byb2Nlc3Nvcl9pZCgpXSk7CiAJCWlmIChpID09IE5SX0xPT1BTLTEpCiAJCQl3cml0ZV90c2MoMCwgMCk7CiAKIAkJYXRvbWljX2luYygmdHNjX2NvdW50X3N0b3ApOwotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzY19jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCkpIG1iKCk7CisJCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjX2NvdW50X3N0b3ApICE9IG51bV9ib290aW5nX2NwdXMoKSkKKwkJCWNwdV9yZWxheCgpOwogCX0KIH0KICN1bmRlZiBOUl9MT09QUwpAQCAtMTQzMyw3ICsxNDM1LDcgQEAKIAkvKiBVbmxlYXNoIHRoZSBDUFUhICovCiAJY3B1X3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7CiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCi0JCW1iKCk7CisJCWNwdV9yZWxheCgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3NyYXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCmluZGV4IDUyYjNlZDUuLjk4OWM4NTIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc3JhdC5jCkBAIC0zOSw3ICszOSw2IEBACiAjZGVmaW5lIE5PREVfQVJSQVlfT0ZGU0VUKHgpCSgoeCkgJSA4KQkvKiA4IGJpdHMvY2hhciAqLwogI2RlZmluZSBCTUFQX1NFVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSB8PSAxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpCiAjZGVmaW5lIEJNQVBfVEVTVChibWFwLCBiaXQpCSgoYm1hcClbTk9ERV9BUlJBWV9JTkRFWChiaXQpXSAmICgxIDw8IE5PREVfQVJSQVlfT0ZGU0VUKGJpdCkpKQotI2RlZmluZSBNQVhfUFhNX0RPTUFJTlMJCTI1NgkvKiAxIGJ5dGUgYW5kIG5vIHByb21pc2VzIGFib3V0IHZhbHVlcyAqLwogLyogYml0bWFwIGxlbmd0aDsgX1BYTSBpcyBhdCBtb3N0IDI1NSAqLwogI2RlZmluZSBQWE1fQklUTUFQX0xFTiAoTUFYX1BYTV9ET01BSU5TIC8gOCkgCiBzdGF0aWMgdTggcHhtX2JpdG1hcFtQWE1fQklUTUFQX0xFTl07CS8qIGJpdG1hcCBvZiBwcm94aW1pdHkgZG9tYWlucyAqLwpAQCAtMjEzLDE5ICsyMTIsMTEgQEAKIAkJbm9kZV9lbmRfcGZuW25pZF0gPSBtZW1vcnlfY2h1bmstPmVuZF9wZm47CiB9CiAKLXN0YXRpYyB1OCBweG1fdG9fbmlkX21hcFtNQVhfUFhNX0RPTUFJTlNdOy8qIF9QWE0gdG8gbG9naWNhbCBub2RlIElEIG1hcCAqLwotCi1pbnQgcHhtX3RvX25vZGUoaW50IHB4bSkKLXsKLQlyZXR1cm4gcHhtX3RvX25pZF9tYXBbcHhtXTsKLX0KLQogLyogUGFyc2UgdGhlIEFDUEkgU3RhdGljIFJlc291cmNlIEFmZmluaXR5IFRhYmxlICovCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpMjBfcGFyc2Vfc3JhdChzdHJ1Y3QgYWNwaV90YWJsZV9zcmF0ICpzcmF0cCkKIHsKIAl1OCAqc3RhcnQsICplbmQsICpwOwogCWludCBpLCBqLCBuaWQ7Ci0JdTggbmlkX3RvX3B4bV9tYXBbTUFYX05VTU5PREVTXTsvKiBsb2dpY2FsIG5vZGUgSUQgdG8gX1BYTSBtYXAgKi8KIAogCXN0YXJ0ID0gKHU4ICopKCYoc3JhdHAtPnJlc2VydmVkKSArIDEpOwkvKiBza2lwIGhlYWRlciAqLwogCXAgPSBzdGFydDsKQEAgLTIzNSwxMCArMjI2LDYgQEAKIAltZW1zZXQobm9kZV9tZW1vcnlfY2h1bmssIDAsIHNpemVvZihub2RlX21lbW9yeV9jaHVuaykpOwogCW1lbXNldCh6aG9sZXNfc2l6ZSwgMCwgc2l6ZW9mKHpob2xlc19zaXplKSk7CiAKLQkvKiAtMSBpbiB0aGVzZSBtYXBzIG1lYW5zIG5vdCBhdmFpbGFibGUgKi8KLQltZW1zZXQocHhtX3RvX25pZF9tYXAsIC0xLCBzaXplb2YocHhtX3RvX25pZF9tYXApKTsKLQltZW1zZXQobmlkX3RvX3B4bV9tYXAsIC0xLCBzaXplb2YobmlkX3RvX3B4bV9tYXApKTsKLQogCW51bV9tZW1vcnlfY2h1bmtzID0gMDsKIAl3aGlsZSAocCA8IGVuZCkgewogCQlzd2l0Y2ggKCpwKSB7CkBAIC0yNzgsOSArMjY1LDcgQEAKIAlub2Rlc19jbGVhcihub2RlX29ubGluZV9tYXApOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfUFhNX0RPTUFJTlM7IGkrKykgewogCQlpZiAoQk1BUF9URVNUKHB4bV9iaXRtYXAsIGkpKSB7Ci0JCQluaWQgPSBudW1fb25saW5lX25vZGVzKCk7Ci0JCQlweG1fdG9fbmlkX21hcFtpXSA9IG5pZDsKLQkJCW5pZF90b19weG1fbWFwW25pZF0gPSBpOworCQkJaW50IG5pZCA9IGFjcGlfbWFwX3B4bV90b19ub2RlKGkpOwogCQkJbm9kZV9zZXRfb25saW5lKG5pZCk7CiAJCX0KIAl9CkBAIC0yODgsNyArMjczLDcgQEAKIAogCS8qIHNldCBjbm9kZSBpZCBpbiBtZW1vcnkgY2h1bmsgc3RydWN0dXJlICovCiAJZm9yIChpID0gMDsgaSA8IG51bV9tZW1vcnlfY2h1bmtzOyBpKyspCi0JCW5vZGVfbWVtb3J5X2NodW5rW2ldLm5pZCA9IHB4bV90b19uaWRfbWFwW25vZGVfbWVtb3J5X2NodW5rW2ldLnB4bV07CisJCW5vZGVfbWVtb3J5X2NodW5rW2ldLm5pZCA9IHB4bV90b19ub2RlKG5vZGVfbWVtb3J5X2NodW5rW2ldLnB4bSk7CiAKIAlwcmludGsoInB4bSBiaXRtYXA6ICIpOwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocHhtX2JpdG1hcCk7IGkrKykgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCBhZjU2OTg3Li5kZDYzZDQ3IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUworKysgYi9hcmNoL2kzODYva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtMzE2LDMgKzMxNiw0IEBACiAJLmxvbmcgc3lzX3N5bmNfZmlsZV9yYW5nZQogCS5sb25nIHN5c190ZWUJCQkvKiAzMTUgKi8KIAkubG9uZyBzeXNfdm1zcGxpY2UKKwkubG9uZyBzeXNfbW92ZV9wYWdlcwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90cmFwcy5jCmluZGV4IDBlNDk4MzYuLmRjYzE0NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2kzODYva2VybmVsL3RyYXBzLmMKQEAgLTE0OSw2ICsxNDksMTIgQEAKIAl3aGlsZSAodmFsaWRfc3RhY2tfcHRyKHRpbmZvLCAodm9pZCAqKWVicCkpIHsKIAkJYWRkciA9ICoodW5zaWduZWQgbG9uZyAqKShlYnAgKyA0KTsKIAkJcHJpbnRlZCA9IHByaW50X2FkZHJfYW5kX3N5bWJvbChhZGRyLCBsb2dfbHZsLCBwcmludGVkKTsKKwkJLyoKKwkJICogYnJlYWsgb3V0IG9mIHJlY3Vyc2l2ZSBlbnRyaWVzIChzdWNoIGFzCisJCSAqIGVuZF9vZl9zdGFja19zdG9wX3Vud2luZF9mdW5jdGlvbik6CisJIAkgKi8KKwkJaWYgKGVicCA9PSAqKHVuc2lnbmVkIGxvbmcgKillYnApCisJCQlicmVhazsKIAkJZWJwID0gKih1bnNpZ25lZCBsb25nICopZWJwOwogCX0KICNlbHNlCkBAIC0yNjgsOCArMjc0LDkgQEAKIAkJcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCwgZXNwKTsKIAlwcmludGsoS0VSTl9FTUVSRyAiZHM6ICUwNHggICBlczogJTA0eCAgIHNzOiAlMDR4XG4iLAogCQlyZWdzLT54ZHMgJiAweGZmZmYsIHJlZ3MtPnhlcyAmIDB4ZmZmZiwgc3MpOwotCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICVzIChwaWQ6ICVkLCB0aHJlYWRpbmZvPSVwIHRhc2s9JXApIiwKLQkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjdXJyZW50X3RocmVhZF9pbmZvKCksIGN1cnJlbnQpOworCXByaW50ayhLRVJOX0VNRVJHICJQcm9jZXNzICUuKnMgKHBpZDogJWQsIHRpPSVwIHRhc2s9JXAgdGFzay50aT0lcCkiLAorCQlUQVNLX0NPTU1fTEVOLCBjdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCWN1cnJlbnRfdGhyZWFkX2luZm8oKSwgY3VycmVudCwgY3VycmVudC0+dGhyZWFkX2luZm8pOwogCS8qCiAJICogV2hlbiBpbi1rZXJuZWwsIHdlIGFsc28gcHJpbnQgb3V0IHRoZSBzdGFjayBhbmQgY29kZSBhdCB0aGUKIAkgKiB0aW1lIG9mIHRoZSBmYXVsdC4uCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2kzODYva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggODgzMTMwMy4uNzUxMmYzOSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMzcsNiArMzcsMTMgQEAKIAogICBST0RBVEEKIAorICAuID0gQUxJR04oNCk7CisgIF9fdHJhY2VkYXRhX3N0YXJ0ID0gLjsKKyAgLnRyYWNlZGF0YSA6IEFUKEFERFIoLnRyYWNlZGF0YSkgLSBMT0FEX09GRlNFVCkgeworCSooLnRyYWNlZGF0YSkKKyAgfQorICBfX3RyYWNlZGF0YV9lbmQgPSAuOworCiAgIC8qIHdyaXRlYWJsZSAqLwogICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsJLyogRGF0YSAqLwogCSooLmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMgYi9hcmNoL2kzODYvbGliL3VzZXJjb3B5LmMKaW5kZXggNGNmOTgxZC4uYzVhYTY1ZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2xpYi91c2VyY29weS5jCisrKyBiL2FyY2gvaTM4Ni9saWIvdXNlcmNvcHkuYwpAQCAtNDI1LDE1ICs0MjUsMjEyIEBACiAJCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOwogCXJldHVybiBzaXplOwogfQorCisvKgorICogTm9uIFRlbXBvcmFsIEhpbnQgdmVyc2lvbiBvZiBfX2NvcHlfdXNlcl96ZXJvaW5nX2ludGVsLiAgSXQgaXMgY2FjaGUgYXdhcmUuCisgKiBoeW9zaGlva0BtaXJhY2xlbGludXguY29tCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19jb3B5X3VzZXJfemVyb2luZ19pbnRlbF9ub2NhY2hlKHZvaWQgKnRvLAorCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisgICAgICAgIGludCBkMCwgZDE7CisKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXygKKwkgICAgICAgIiAgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCSAgICAgICAiMDogICAgICBtb3ZsIDMyKCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIiAgICAgICAgY21wbCAkNjcsICUwXG4iCisJICAgICAgICIgICAgICAgIGpiZSAyZlxuIgorCSAgICAgICAiMTogICAgICBtb3ZsIDY0KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIiAgICAgICAgLmFsaWduIDIsMHg5MFxuIgorCSAgICAgICAiMjogICAgICBtb3ZsIDAoJTQpLCAlJWVheFxuIgorCSAgICAgICAiMjE6ICAgICBtb3ZsIDQoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDAoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgNCglMylcbiIKKwkgICAgICAgIjM6ICAgICAgbW92bCA4KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjMxOiAgICAgbW92bCAxMiglNCksJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCA4KCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDEyKCUzKVxuIgorCSAgICAgICAiNDogICAgICBtb3ZsIDE2KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjQxOiAgICAgbW92bCAyMCglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgMTYoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgMjAoJTMpXG4iCisJICAgICAgICIxMDogICAgIG1vdmwgMjQoJTQpLCAlJWVheFxuIgorCSAgICAgICAiNTE6ICAgICBtb3ZsIDI4KCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCAyNCglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCAyOCglMylcbiIKKwkgICAgICAgIjExOiAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJICAgICAgICI2MTogICAgIG1vdmwgMzYoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDMyKCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDM2KCUzKVxuIgorCSAgICAgICAiMTI6ICAgICBtb3ZsIDQwKCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjcxOiAgICAgbW92bCA0NCglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgNDAoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgNDQoJTMpXG4iCisJICAgICAgICIxMzogICAgIG1vdmwgNDgoJTQpLCAlJWVheFxuIgorCSAgICAgICAiODE6ICAgICBtb3ZsIDUyKCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCA0OCglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCA1MiglMylcbiIKKwkgICAgICAgIjE0OiAgICAgbW92bCA1NiglNCksICUlZWF4XG4iCisJICAgICAgICI5MTogICAgIG1vdmwgNjAoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDU2KCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDYwKCUzKVxuIgorCSAgICAgICAiICAgICAgICBhZGRsICQtNjQsICUwXG4iCisJICAgICAgICIgICAgICAgIGFkZGwgJDY0LCAlNFxuIgorCSAgICAgICAiICAgICAgICBhZGRsICQ2NCwgJTNcbiIKKwkgICAgICAgIiAgICAgICAgY21wbCAkNjMsICUwXG4iCisJICAgICAgICIgICAgICAgIGphICAwYlxuIgorCSAgICAgICAiICAgICAgICBzZmVuY2UgXG4iCisJICAgICAgICI1OiAgICAgIG1vdmwgICUwLCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICBzaHJsICAkMiwgJTBcbiIKKwkgICAgICAgIiAgICAgICAgYW5kbCAkMywgJSVlYXhcbiIKKwkgICAgICAgIiAgICAgICAgY2xkXG4iCisJICAgICAgICI2OiAgICAgIHJlcDsgbW92c2xcbiIKKwkgICAgICAgIiAgICAgICAgbW92bCAlJWVheCwlMFxuIgorCSAgICAgICAiNzogICAgICByZXA7IG1vdnNiXG4iCisJICAgICAgICI4OlxuIgorCSAgICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCSAgICAgICAiOTogICAgICBsZWEgMCglJWVheCwlMCw0KSwlMFxuIgorCSAgICAgICAiMTY6ICAgICBwdXNobCAlMFxuIgorCSAgICAgICAiICAgICAgICBwdXNobCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICB4b3JsICUlZWF4LCUlZWF4XG4iCisJICAgICAgICIgICAgICAgIHJlcDsgc3Rvc2JcbiIKKwkgICAgICAgIiAgICAgICAgcG9wbCAlJWVheFxuIgorCSAgICAgICAiICAgICAgICBwb3BsICUwXG4iCisJICAgICAgICIgICAgICAgIGptcCA4YlxuIgorCSAgICAgICAiLnByZXZpb3VzXG4iCisJICAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCisJICAgICAgICIJLmFsaWduIDRcbiIKKwkgICAgICAgIgkubG9uZyAwYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAyYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAyMWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgM2IsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMzFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDRiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDQxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxMGIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNTFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDExYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA2MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMTJiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDcxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxM2IsMTZiXG4iCisJICAgICAgICIJLmxvbmcgODFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDE0YiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA5MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNmIsOWJcbiIKKwkgICAgICAgIiAgICAgICAgLmxvbmcgN2IsMTZiXG4iCisJICAgICAgICIucHJldmlvdXMiCisJICAgICAgIDogIj0mYyIoc2l6ZSksICI9JkQiIChkMCksICI9JlMiIChkMSkKKwkgICAgICAgOiAgIjEiKHRvKSwgIjIiKGZyb20pLCAiMCIoc2l6ZSkKKwkgICAgICAgOiAiZWF4IiwgImVkeCIsICJtZW1vcnkiKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19jb3B5X3VzZXJfaW50ZWxfbm9jYWNoZSh2b2lkICp0bywKKwkJCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKQoreworICAgICAgICBpbnQgZDAsIGQxOworCisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJICAgICAgICIgICAgICAgIC5hbGlnbiAyLDB4OTBcbiIKKwkgICAgICAgIjA6ICAgICAgbW92bCAzMiglNCksICUlZWF4XG4iCisJICAgICAgICIgICAgICAgIGNtcGwgJDY3LCAlMFxuIgorCSAgICAgICAiICAgICAgICBqYmUgMmZcbiIKKwkgICAgICAgIjE6ICAgICAgbW92bCA2NCglNCksICUlZWF4XG4iCisJICAgICAgICIgICAgICAgIC5hbGlnbiAyLDB4OTBcbiIKKwkgICAgICAgIjI6ICAgICAgbW92bCAwKCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjIxOiAgICAgbW92bCA0KCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCAwKCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDQoJTMpXG4iCisJICAgICAgICIzOiAgICAgIG1vdmwgOCglNCksICUlZWF4XG4iCisJICAgICAgICIzMTogICAgIG1vdmwgMTIoJTQpLCUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgOCglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCAxMiglMylcbiIKKwkgICAgICAgIjQ6ICAgICAgbW92bCAxNiglNCksICUlZWF4XG4iCisJICAgICAgICI0MTogICAgIG1vdmwgMjAoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDE2KCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDIwKCUzKVxuIgorCSAgICAgICAiMTA6ICAgICBtb3ZsIDI0KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjUxOiAgICAgbW92bCAyOCglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgMjQoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgMjgoJTMpXG4iCisJICAgICAgICIxMTogICAgIG1vdmwgMzIoJTQpLCAlJWVheFxuIgorCSAgICAgICAiNjE6ICAgICBtb3ZsIDM2KCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCAzMiglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCAzNiglMylcbiIKKwkgICAgICAgIjEyOiAgICAgbW92bCA0MCglNCksICUlZWF4XG4iCisJICAgICAgICI3MTogICAgIG1vdmwgNDQoJTQpLCAlJWVkeFxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlYXgsIDQwKCUzKVxuIgorCSAgICAgICAiICAgICAgICBtb3ZudGkgJSVlZHgsIDQ0KCUzKVxuIgorCSAgICAgICAiMTM6ICAgICBtb3ZsIDQ4KCU0KSwgJSVlYXhcbiIKKwkgICAgICAgIjgxOiAgICAgbW92bCA1MiglNCksICUlZWR4XG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVheCwgNDgoJTMpXG4iCisJICAgICAgICIgICAgICAgIG1vdm50aSAlJWVkeCwgNTIoJTMpXG4iCisJICAgICAgICIxNDogICAgIG1vdmwgNTYoJTQpLCAlJWVheFxuIgorCSAgICAgICAiOTE6ICAgICBtb3ZsIDYwKCU0KSwgJSVlZHhcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWF4LCA1NiglMylcbiIKKwkgICAgICAgIiAgICAgICAgbW92bnRpICUlZWR4LCA2MCglMylcbiIKKwkgICAgICAgIiAgICAgICAgYWRkbCAkLTY0LCAlMFxuIgorCSAgICAgICAiICAgICAgICBhZGRsICQ2NCwgJTRcbiIKKwkgICAgICAgIiAgICAgICAgYWRkbCAkNjQsICUzXG4iCisJICAgICAgICIgICAgICAgIGNtcGwgJDYzLCAlMFxuIgorCSAgICAgICAiICAgICAgICBqYSAgMGJcbiIKKwkgICAgICAgIiAgICAgICAgc2ZlbmNlIFxuIgorCSAgICAgICAiNTogICAgICBtb3ZsICAlMCwgJSVlYXhcbiIKKwkgICAgICAgIiAgICAgICAgc2hybCAgJDIsICUwXG4iCisJICAgICAgICIgICAgICAgIGFuZGwgJDMsICUlZWF4XG4iCisJICAgICAgICIgICAgICAgIGNsZFxuIgorCSAgICAgICAiNjogICAgICByZXA7IG1vdnNsXG4iCisJICAgICAgICIgICAgICAgIG1vdmwgJSVlYXgsJTBcbiIKKwkgICAgICAgIjc6ICAgICAgcmVwOyBtb3ZzYlxuIgorCSAgICAgICAiODpcbiIKKwkgICAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkgICAgICAgIjk6ICAgICAgbGVhIDAoJSVlYXgsJTAsNCksJTBcbiIKKwkgICAgICAgIjE2OiAgICAgam1wIDhiXG4iCisJICAgICAgICIucHJldmlvdXNcbiIKKwkgICAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkgICAgICAgIgkuYWxpZ24gNFxuIgorCSAgICAgICAiCS5sb25nIDBiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDJiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDIxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAzYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAzMWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNGIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNDFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDEwYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA1MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMTFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDYxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyAxMmIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgNzFiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDEzYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA4MWIsMTZiXG4iCisJICAgICAgICIJLmxvbmcgMTRiLDE2YlxuIgorCSAgICAgICAiCS5sb25nIDkxYiwxNmJcbiIKKwkgICAgICAgIgkubG9uZyA2Yiw5YlxuIgorCSAgICAgICAiICAgICAgICAubG9uZyA3YiwxNmJcbiIKKwkgICAgICAgIi5wcmV2aW91cyIKKwkgICAgICAgOiAiPSZjIihzaXplKSwgIj0mRCIgKGQwKSwgIj0mUyIgKGQxKQorCSAgICAgICA6ICAiMSIodG8pLCAiMiIoZnJvbSksICIwIihzaXplKQorCSAgICAgICA6ICJlYXgiLCAiZWR4IiwgIm1lbW9yeSIpOworCXJldHVybiBzaXplOworfQorCiAjZWxzZQorCiAvKgogICogTGVhdmUgdGhlc2UgZGVjbGFyZWQgYnV0IHVuZGVmaW5lZC4gIFRoZXkgc2hvdWxkIG5vdCBiZSBhbnkgcmVmZXJlbmNlcyB0bwogICogdGhlbQogICovCi11bnNpZ25lZCBsb25nCi1fX2NvcHlfdXNlcl96ZXJvaW5nX2ludGVsKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKLXVuc2lnbmVkIGxvbmcKLV9fY29weV91c2VyX2ludGVsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBzaXplKTsKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X3VzZXJfemVyb2luZ19pbnRlbCh2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSk7Cit1bnNpZ25lZCBsb25nIF9fY29weV91c2VyX2ludGVsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwKKwkJCQkJdW5zaWduZWQgbG9uZyBzaXplKTsKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X3VzZXJfemVyb2luZ19pbnRlbF9ub2NhY2hlKHZvaWQgKnRvLAorCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIHNpemUpOwogI2VuZGlmIC8qIENPTkZJR19YODZfSU5URUxfVVNFUkNPUFkgKi8KIAogLyogR2VuZXJpYyBhcmJpdHJhcnkgc2l6ZWQgY29weS4gICovCkBAIC01MTUsOCArNzEyLDggQEAKIAkJOiAibWVtb3J5Iik7CQkJCQkJXAogfSB3aGlsZSAoMCkKIAotCi11bnNpZ25lZCBsb25nIF9fY29weV90b191c2VyX2xsKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQordW5zaWduZWQgbG9uZyBfX2NvcHlfdG9fdXNlcl9sbCh2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sCisJCQkJdW5zaWduZWQgbG9uZyBuKQogewogCUJVR19PTigobG9uZykgbiA8IDApOwogI2lmbmRlZiBDT05GSUdfWDg2X1dQX1dPUktTX09LCkBAIC01NzYsOCArNzczLDggQEAKIH0KIEVYUE9SVF9TWU1CT0woX19jb3B5X3RvX3VzZXJfbGwpOwogCi11bnNpZ25lZCBsb25nCi1fX2NvcHlfZnJvbV91c2VyX2xsKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQordW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2xsKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJCQkJdW5zaWduZWQgbG9uZyBuKQogewogCUJVR19PTigobG9uZyluIDwgMCk7CiAJaWYgKG1vdnNsX2lzX29rKHRvLCBmcm9tLCBuKSkKQEAgLTU4OCw2ICs3ODUsNDkgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19jb3B5X2Zyb21fdXNlcl9sbCk7CiAKK3Vuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9sbF9ub3plcm8odm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQkgdW5zaWduZWQgbG9uZyBuKQoreworCUJVR19PTigobG9uZyluIDwgMCk7CisJaWYgKG1vdnNsX2lzX29rKHRvLCBmcm9tLCBuKSkKKwkJX19jb3B5X3VzZXIodG8sIGZyb20sIG4pOworCWVsc2UKKwkJbiA9IF9fY29weV91c2VyX2ludGVsKCh2b2lkIF9fdXNlciAqKXRvLAorCQkJCSAgICAgIChjb25zdCB2b2lkICopZnJvbSwgbik7CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKF9fY29weV9mcm9tX3VzZXJfbGxfbm96ZXJvKTsKKwordW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2xsX25vY2FjaGUodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQl1bnNpZ25lZCBsb25nIG4pCit7CisJQlVHX09OKChsb25nKW4gPCAwKTsKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisJaWYgKCBuID4gNjQgJiYgY3B1X2hhc194bW0yKQorICAgICAgICAgICAgICAgIG4gPSBfX2NvcHlfdXNlcl96ZXJvaW5nX2ludGVsX25vY2FjaGUodG8sIGZyb20sIG4pOworCWVsc2UKKwkJX19jb3B5X3VzZXJfemVyb2luZyh0bywgZnJvbSwgbik7CisjZWxzZQorICAgICAgICBfX2NvcHlfdXNlcl96ZXJvaW5nKHRvLCBmcm9tLCBuKTsKKyNlbmRpZgorCXJldHVybiBuOworfQorCit1bnNpZ25lZCBsb25nIF9fY29weV9mcm9tX3VzZXJfbGxfbm9jYWNoZV9ub3plcm8odm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLAorCQkJCQl1bnNpZ25lZCBsb25nIG4pCit7CisJQlVHX09OKChsb25nKW4gPCAwKTsKKyNpZmRlZiBDT05GSUdfWDg2X0lOVEVMX1VTRVJDT1BZCisJaWYgKCBuID4gNjQgJiYgY3B1X2hhc194bW0yKQorICAgICAgICAgICAgICAgIG4gPSBfX2NvcHlfdXNlcl9pbnRlbF9ub2NhY2hlKHRvLCBmcm9tLCBuKTsKKwllbHNlCisJCV9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKyNlbHNlCisgICAgICAgIF9fY29weV91c2VyKHRvLCBmcm9tLCBuKTsKKyNlbmRpZgorCXJldHVybiBuOworfQorCiAvKioKICAqIGNvcHlfdG9fdXNlcjogLSBDb3B5IGEgYmxvY2sgb2YgZGF0YSBpbnRvIHVzZXIgc3BhY2UuCiAgKiBAdG86ICAgRGVzdGluYXRpb24gYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCBiNGE3NDU1Li4wMDQ4MzdjIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCkBAIC04LDYgKzgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAjZGVmaW5lIERFRkFVTFRfU0VORF9JUEkJKDEpCkBAIC0xMzAsMyArMTMyLDQ0IEBACiB9CiAKIGxhdGVfaW5pdGNhbGwocHJpbnRfaXBpX21vZGUpOworCisvKioKKyAqIG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwIC0gSG9vayBmb3IgbWFjaGluZSBzcGVjaWZpYyBtZW1vcnkgc2V0dXAuCisgKgorICogRGVzY3JpcHRpb246CisgKglUaGlzIGlzIGluY2x1ZGVkIGxhdGUgaW4ga2VybmVsL3NldHVwLmMgc28gdGhhdCBpdCBjYW4gbWFrZQorICoJdXNlIG9mIGFsbCBvZiB0aGUgc3RhdGljIGZ1bmN0aW9ucy4KKyAqKi8KKworY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKQoreworCWNoYXIgKndobzsKKworCisJd2hvID0gIkJJT1MtZTgyMCI7CisKKwkvKgorCSAqIFRyeSB0byBjb3B5IHRoZSBCSU9TLXN1cHBsaWVkIEU4MjAtbWFwLgorCSAqCisJICogT3RoZXJ3aXNlIGZha2UgYSBtZW1vcnkgbWFwOyBvbmUgc2VjdGlvbiBmcm9tIDBrLT42NDBrLAorCSAqIHRoZSBuZXh0IHNlY3Rpb24gZnJvbSAxbWItPmFwcHJvcHJpYXRlX21lbV9rCisJICovCisJc2FuaXRpemVfZTgyMF9tYXAoRTgyMF9NQVAsICZFODIwX01BUF9OUik7CisJaWYgKGNvcHlfZTgyMF9tYXAoRTgyMF9NQVAsIEU4MjBfTUFQX05SKSA8IDApIHsKKwkJdW5zaWduZWQgbG9uZyBtZW1fc2l6ZTsKKworCQkvKiBjb21wYXJlIHJlc3VsdHMgZnJvbSBvdGhlciBtZXRob2RzIGFuZCB0YWtlIHRoZSBncmVhdGVyICovCisJCWlmIChBTFRfTUVNX0sgPCBFWFRfTUVNX0spIHsKKwkJCW1lbV9zaXplID0gRVhUX01FTV9LOworCQkJd2hvID0gIkJJT1MtODgiOworCQl9IGVsc2UgeworCQkJbWVtX3NpemUgPSBBTFRfTUVNX0s7CisJCQl3aG8gPSAiQklPUy1lODAxIjsKKwkJfQorCisJCWU4MjAubnJfbWFwID0gMDsKKwkJYWRkX21lbW9yeV9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7CisJCWFkZF9tZW1vcnlfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSA8PCAxMCwgRTgyMF9SQU0pOworICAJfQorCXJldHVybiB3aG87Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbWFjaC12aXN3cy9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtdmlzd3Mvc2V0dXAuYwppbmRleCAwN2ZhYzdlLi44YTllMWE2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC12aXN3cy9zZXR1cC5jCisrKyBiL2FyY2gvaTM4Ni9tYWNoLXZpc3dzL3NldHVwLmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2FyY2hfaG9va3MuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZTgyMC5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgImNvYmFsdC5oIgogI2luY2x1ZGUgInBpaXg0LmgiCiAKQEAgLTEzMywzICsxMzUsNTAgQEAKIAkvKiBXaXJlIGNwdSBJRFQgZW50cnkgdG8gcy93IGhhbmRsZXIgKGFuZCBDb2JhbHQgQVBJQyB0byBJRFQpICovCiAJc2V0dXBfaXJxKDAsICZpcnEwKTsKIH0KKworLyogSG9vayBmb3IgbWFjaGluZSBzcGVjaWZpYyBtZW1vcnkgc2V0dXAuICovCisKKyNkZWZpbmUgTUIgKDEwMjQgKiAxMDI0KQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZ2l2d2ZiX21lbV9waHlzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fc2l6ZTsKKworbG9uZyBsb25nIG1lbV9zaXplIF9faW5pdGRhdGEgPSAwOworCitjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCit7CisJbG9uZyBsb25nIGdmeF9tZW1fc2l6ZSA9IDggKiBNQjsKKworCW1lbV9zaXplID0gQUxUX01FTV9LOworCisJaWYgKCFtZW1fc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCb290bG9hZGVyIGRpZG4ndCBzZXQgbWVtb3J5IHNpemUsIHVwZ3JhZGUgaXQgIVxuIik7CisJCW1lbV9zaXplID0gMTI4ICogTUI7CisJfQorCisJLyoKKwkgKiB0aGlzIGhhcmRjb2RlcyB0aGUgZ3JhcGhpY3MgbWVtb3J5IHRvIDggTUIKKwkgKiBpdCByZWFsbHkgc2hvdWxkIGJlIHNpemVkIGR5bmFtaWNhbGx5IChvciBhdCBsZWFzdAorCSAqIHNldCBhcyBhIGJvb3QgcGFyYW0pCisJICovCisJaWYgKCFzZ2l2d2ZiX21lbV9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlZmF1bHRpbmcgdG8gOCBNQiBmcmFtZWJ1ZmZlciBzaXplXG4iKTsKKwkJc2dpdndmYl9tZW1fc2l6ZSA9IDggKiBNQjsKKwl9CisKKwkvKgorCSAqIFRyaW0gdG8gbmVhcmVzdCBNQgorCSAqLworCXNnaXZ3ZmJfbWVtX3NpemUgJj0gfigoMSA8PCAyMCkgLSAxKTsKKwlzZ2l2d2ZiX21lbV9waHlzID0gbWVtX3NpemUgLSBnZnhfbWVtX3NpemU7CisKKwlhZGRfbWVtb3J5X3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKKwlhZGRfbWVtb3J5X3JlZ2lvbihISUdIX01FTU9SWSwgbWVtX3NpemUgLSBzZ2l2d2ZiX21lbV9zaXplIC0gSElHSF9NRU1PUlksIEU4MjBfUkFNKTsKKwlhZGRfbWVtb3J5X3JlZ2lvbihzZ2l2d2ZiX21lbV9waHlzLCBzZ2l2d2ZiX21lbV9zaXplLCBFODIwX1JFU0VSVkVEKTsKKworCXJldHVybiAiUFJPTSI7CisKKwkvKiBSZW1vdmUgZ2NjIHdhcm5pbmdzICovCisJKHZvaWQpIHNhbml0aXplX2U4MjBfbWFwKE5VTEwsIE5VTEwpOworCSh2b2lkKSBjb3B5X2U4MjBfbWFwKE5VTEwsIDApOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jIGIvYXJjaC9pMzg2L21hY2gtdm95YWdlci9zZXR1cC5jCmluZGV4IDdkOGEzYWMuLjBlMjI1MDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tYWNoLXZveWFnZXIvc2V0dXAuYworKysgYi9hcmNoL2kzODYvbWFjaC12b3lhZ2VyL3NldHVwLmMKQEAgLTcsNiArNyw5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8YXNtL2FjcGkuaD4KICNpbmNsdWRlIDxhc20vYXJjaF9ob29rcy5oPgorI2luY2x1ZGUgPGFzbS92b3lhZ2VyLmg+CisjaW5jbHVkZSA8YXNtL2U4MjAuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAogdm9pZCBfX2luaXQgcHJlX2ludHJfaW5pdF9ob29rKHZvaWQpCiB7CkBAIC00NSwzICs0OCw3NCBAQAogewogCXNldHVwX2lycSgwLCAmaXJxMCk7CiB9CisKKy8qIEhvb2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLiAqLworCitjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCit7CisJY2hhciAqd2hvOworCisJd2hvID0gIk5PVCBWT1lBR0VSIjsKKworCWlmKHZveWFnZXJfbGV2ZWwgPT0gNSkgeworCQlfX3UzMiBhZGRyLCBsZW5ndGg7CisJCWludCBpOworCisJCXdobyA9ICJWb3lhZ2VyLVNVUyI7CisKKwkJZTgyMC5ucl9tYXAgPSAwOworCQlmb3IoaT0wOyB2b3lhZ2VyX21lbW9yeV9kZXRlY3QoaSwgJmFkZHIsICZsZW5ndGgpOyBpKyspIHsKKwkJCWFkZF9tZW1vcnlfcmVnaW9uKGFkZHIsIGxlbmd0aCwgRTgyMF9SQU0pOworCQl9CisJCXJldHVybiB3aG87CisJfSBlbHNlIGlmKHZveWFnZXJfbGV2ZWwgPT0gNCkgeworCQlfX3UzMiB0b207CisJCV9fdTE2IGNhdGJhc2UgPSBpbmIoVk9ZQUdFUl9TU1BCX1JFTE9DQVRJT05fUE9SVCk8PDg7CisJCS8qIHNlbGVjdCB0aGUgRElOTyBjb25maWcgc3BhY2UgKi8KKwkJb3V0YihWT1lBR0VSX0RJTk8sIFZPWUFHRVJfQ0FUX0NPTkZJR19QT1JUKTsKKwkJLyogUmVhZCBESU5PIHRvcCBvZiBtZW1vcnkgcmVnaXN0ZXIgKi8KKwkJdG9tID0gKChpbmIoY2F0YmFzZSArIDB4NCkgJiAweGYwKSA8PCAxNikKKwkJCSsgKChpbmIoY2F0YmFzZSArIDB4NSkgJiAweDdmKSA8PCAyNCk7CisKKwkJaWYoaW5iKGNhdGJhc2UpICE9IFZPWUFHRVJfRElOTykgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWb3lhZ2VyOiBGYWlsZWQgdG8gZ2V0IERJTk8gZm9yIEw0LCBzZXR0aW5nIHRvbSB0byBFWFRfTUVNX0tcbiIpOworCQkJdG9tID0gKEVYVF9NRU1fSyk8PDEwOworCQl9CisJCXdobyA9ICJWb3lhZ2VyLVRPTSI7CisJCWFkZF9tZW1vcnlfcmVnaW9uKDAsIDB4OWYwMDAsIEU4MjBfUkFNKTsKKwkJLyogbWFwIGZyb20gMU0gdG8gdG9wIG9mIG1lbW9yeSAqLworCQlhZGRfbWVtb3J5X3JlZ2lvbigxKjEwMjQqMTAyNCwgdG9tIC0gMSoxMDI0KjEwMjQsIEU4MjBfUkFNKTsKKwkJLyogRklYTUU6IFNob3VsZCBjaGVjayB0aGUgQVNJQ3MgdG8gc2VlIGlmIEkgbmVlZCB0bworCQkgKiB0YWtlIG91dCB0aGUgOE0gd2luZG93LiAgSnVzdCBkbyBpdCBhdCB0aGUgbW9tZW50CisJCSAqICovCisJCWFkZF9tZW1vcnlfcmVnaW9uKDgqMTAyNCoxMDI0LCA4KjEwMjQqMTAyNCwgRTgyMF9SRVNFUlZFRCk7CisJCXJldHVybiB3aG87CisJfQorCisJd2hvID0gIkJJT1MtZTgyMCI7CisKKwkvKgorCSAqIFRyeSB0byBjb3B5IHRoZSBCSU9TLXN1cHBsaWVkIEU4MjAtbWFwLgorCSAqCisJICogT3RoZXJ3aXNlIGZha2UgYSBtZW1vcnkgbWFwOyBvbmUgc2VjdGlvbiBmcm9tIDBrLT42NDBrLAorCSAqIHRoZSBuZXh0IHNlY3Rpb24gZnJvbSAxbWItPmFwcHJvcHJpYXRlX21lbV9rCisJICovCisJc2FuaXRpemVfZTgyMF9tYXAoRTgyMF9NQVAsICZFODIwX01BUF9OUik7CisJaWYgKGNvcHlfZTgyMF9tYXAoRTgyMF9NQVAsIEU4MjBfTUFQX05SKSA8IDApIHsKKwkJdW5zaWduZWQgbG9uZyBtZW1fc2l6ZTsKKworCQkvKiBjb21wYXJlIHJlc3VsdHMgZnJvbSBvdGhlciBtZXRob2RzIGFuZCB0YWtlIHRoZSBncmVhdGVyICovCisJCWlmIChBTFRfTUVNX0sgPCBFWFRfTUVNX0spIHsKKwkJCW1lbV9zaXplID0gRVhUX01FTV9LOworCQkJd2hvID0gIkJJT1MtODgiOworCQl9IGVsc2UgeworCQkJbWVtX3NpemUgPSBBTFRfTUVNX0s7CisJCQl3aG8gPSAiQklPUy1lODAxIjsKKwkJfQorCisJCWU4MjAubnJfbWFwID0gMDsKKwkJYWRkX21lbW9yeV9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7CisJCWFkZF9tZW1vcnlfcmVnaW9uKEhJR0hfTUVNT1JZLCBtZW1fc2l6ZSA8PCAxMCwgRTgyMF9SQU0pOworICAJfQorCXJldHVybiB3aG87Cit9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vZmF1bHQuYyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCmluZGV4IDdmMGZjZjIuLmJkNmZlOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCisrKyBiL2FyY2gvaTM4Ni9tbS9mYXVsdC5jCkBAIC03NywxMiArNzcsMTUgQEAKIAl1bnNpZ25lZCBzZWcgPSByZWdzLT54Y3MgJiAweGZmZmY7CiAJdTMyIHNlZ19hciwgc2VnX2xpbWl0LCBiYXNlLCAqZGVzYzsKIAorCS8qIFVubGlrZWx5LCBidXQgbXVzdCBjb21lIGJlZm9yZSBzZWdtZW50IGNoZWNrcy4gKi8KKwlpZiAodW5saWtlbHkocmVncy0+ZWZsYWdzICYgVk1fTUFTSykpIHsKKwkJYmFzZSA9IHNlZyA8PCA0OworCQkqZWlwX2xpbWl0ID0gYmFzZSArIDB4ZmZmZjsKKwkJcmV0dXJuIGJhc2UgKyAoZWlwICYgMHhmZmZmKTsKKwl9CisKIAkvKiBUaGUgc3RhbmRhcmQga2VybmVsL3VzZXIgYWRkcmVzcyBzcGFjZSBsaW1pdC4gKi8KIAkqZWlwX2xpbWl0ID0gKHNlZyAmIDMpID8gVVNFUl9EUy5zZWcgOiBLRVJORUxfRFMuc2VnOwotCi0JLyogVW5saWtlbHksIGJ1dCBtdXN0IGNvbWUgYmVmb3JlIHNlZ21lbnQgY2hlY2tzLiAqLwotCWlmICh1bmxpa2VseSgocmVncy0+ZWZsYWdzICYgVk1fTUFTSykgIT0gMCkpCi0JCXJldHVybiBlaXAgKyAoc2VnIDw8IDQpOwogCQogCS8qIEJ5IGZhciB0aGUgbW9zdCBjb21tb24gY2FzZXMuICovCiAJaWYgKGxpa2VseShzZWcgPT0gX19VU0VSX0NTIHx8IHNlZyA9PSBfX0tFUk5FTF9DUykpCkBAIC0zODAsMTIgKzM4MywxMiBAQAogCQlnb3RvIGJhZF9hcmVhOwogCWlmIChlcnJvcl9jb2RlICYgNCkgewogCQkvKgotCQkgKiBhY2Nlc3NpbmcgdGhlIHN0YWNrIGJlbG93ICVlc3AgaXMgYWx3YXlzIGEgYnVnLgotCQkgKiBUaGUgIisgMzIiIGlzIHRoZXJlIGR1ZSB0byBzb21lIGluc3RydWN0aW9ucyAobGlrZQotCQkgKiBwdXNoYSkgZG9pbmcgcG9zdC1kZWNyZW1lbnQgb24gdGhlIHN0YWNrIGFuZCB0aGF0Ci0JCSAqIGRvZXNuJ3Qgc2hvdyB1cCB1bnRpbCBsYXRlci4uCisJCSAqIEFjY2Vzc2luZyB0aGUgc3RhY2sgYmVsb3cgJWVzcCBpcyBhbHdheXMgYSBidWcuCisJCSAqIFRoZSBsYXJnZSBjdXNoaW9uIGFsbG93cyBpbnN0cnVjdGlvbnMgbGlrZSBlbnRlcgorCQkgKiBhbmQgcHVzaGEgdG8gd29yay4gICgiZW50ZXIgJDY1NTM1LCQzMSIgcHVzaGVzCisJCSAqIDMyIHBvaW50ZXJzIGFuZCB0aGVuIGRlY3JlbWVudHMgJWVzcCBieSA2NTUzNS4pCiAJCSAqLwotCQlpZiAoYWRkcmVzcyArIDMyIDwgcmVncy0+ZXNwKQorCQlpZiAoYWRkcmVzcyArIDY1NTM2ICsgMzIgKiBzaXplb2YodW5zaWduZWQgbG9uZykgPCByZWdzLT5lc3ApCiAJCQlnb3RvIGJhZF9hcmVhOwogCX0KIAlpZiAoZXhwYW5kX3N0YWNrKHZtYSwgYWRkcmVzcykpCmRpZmYgLS1naXQgYS9hcmNoL2kzODYvbW0vaW5pdC5jIGIvYXJjaC9pMzg2L21tL2luaXQuYwppbmRleCAzZGYxMzcxLi5iZjE5NTEzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbW0vaW5pdC5jCisrKyBiL2FyY2gvaTM4Ni9tbS9pbml0LmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zODQsNyArMzg1LDcgQEAKICNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHX1NPRlRXQVJFX1NVU1BFTkQKKyNpZiBkZWZpbmVkKENPTkZJR19TT0ZUV0FSRV9TVVNQRU5EKSB8fCBkZWZpbmVkKENPTkZJR19BQ1BJX1NMRUVQKQogLyoKICAqIFN3YXAgc3VzcGVuZCAmIGZyaWVuZHMgbmVlZCB0aGlzIGZvciByZXN1bWUgYmVjYXVzZSB0aGluZ3MgbGlrZSB0aGUgaW50ZWwtYWdwCiAgKiBkcml2ZXIgbWlnaHQgaGF2ZSBzcGxpdCB1cCBhIGtlcm5lbCA0TUIgbWFwcGluZy4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKaW5kZXggOTJjM2Q5Zi4uMDg4N2IzNCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9pMzg2L21tL3BhZ2VhdHRyLmMKQEAgLTIwOSwxOSArMjA5LDE5IEBACiB9CiAKIHZvaWQgZ2xvYmFsX2ZsdXNoX3RsYih2b2lkKQoteyAKLQlMSVNUX0hFQUQobCk7Cit7CisJc3RydWN0IGxpc3RfaGVhZCBsOwogCXN0cnVjdCBwYWdlICpwZywgKm5leHQ7CiAKIAlCVUdfT04oaXJxc19kaXNhYmxlZCgpKTsKIAogCXNwaW5fbG9ja19pcnEoJmNwYV9sb2NrKTsKLQlsaXN0X3NwbGljZV9pbml0KCZkZl9saXN0LCAmbCk7CisJbGlzdF9yZXBsYWNlX2luaXQoJmRmX2xpc3QsICZsKTsKIAlzcGluX3VubG9ja19pcnEoJmNwYV9sb2NrKTsKIAlmbHVzaF9tYXAoKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGcsIG5leHQsICZsLCBscnUpCiAJCV9fZnJlZV9wYWdlKHBnKTsKLX0gCit9CiAKICNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCiB2b2lkIGtlcm5lbF9tYXBfcGFnZXMoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcywgaW50IGVuYWJsZSkKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL2kzODYvcGNpL2NvbW1vbi5jCmluZGV4IGRiZWNlNzcuLmM2MjRiNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9jb21tb24uYwpAQCAtMjg4LDYgKzI4OCw3IEBACiAKIHZvaWQgcGNpYmlvc19kaXNhYmxlX2RldmljZSAoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKKwlwY2liaW9zX2Rpc2FibGVfcmVzb3VyY2VzKGRldik7CiAJaWYgKHBjaWJpb3NfZGlzYWJsZV9pcnEpCiAJCXBjaWJpb3NfZGlzYWJsZV9pcnEoZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaTM4Ni5jIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKaW5kZXggZWQyYzhjOC4uYTE1MWY3YSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L3BjaS9pMzg2LmMKKysrIGIvYXJjaC9pMzg2L3BjaS9pMzg2LmMKQEAgLTI0Miw2ICsyNDIsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBwY2liaW9zX2Rpc2FibGVfcmVzb3VyY2VzKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJdTE2IGNtZDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgUENJX0NPTU1BTkQsICZjbWQpOworCWNtZCAmPSB+KFBDSV9DT01NQU5EX0lPIHwgUENJX0NPTU1BTkRfTUVNT1JZKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfQ09NTUFORCwgY21kKTsKK30KKwogLyoKICAqICBJZiB3ZSBzZXQgdXAgYSBkZXZpY2UgZm9yIGJ1cyBtYXN0ZXJpbmcsIHdlIG5lZWQgdG8gY2hlY2sgdGhlIGxhdGVuY3kKICAqICB0aW1lciBhcyBjZXJ0YWluIGNyYXBweSBCSU9TZXMgZm9yZ2V0IHRvIHNldCBpdCBwcm9wZXJseS4KQEAgLTI3Niw4ICsyODUsNiBAQAogCS8qIExlYXZlIHZtX3Bnb2ZmIGFzLWlzLCB0aGUgUENJIHNwYWNlIGFkZHJlc3MgaXMgdGhlIHBoeXNpY2FsCiAJICogYWRkcmVzcyBvbiB0aGlzIHBsYXRmb3JtLgogCSAqLwotCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX1NITSB8IFZNX0xPQ0tFRCB8IFZNX0lPKTsKLQogCXByb3QgPSBwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KTsKIAlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPiAzKQogCQlwcm90IHw9IF9QQUdFX1BDRCB8IF9QQUdFX1BXVDsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMgYi9hcmNoL2kzODYvcGNpL2lycS5jCmluZGV4IDA2ZGFiMDAuLjhjZTY5NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvaXJxLmMKKysrIGIvYXJjaC9pMzg2L3BjaS9pcnEuYwpAQCAtMTk4LDE0ICsxOTgsMTQgQEAKICAqLwogc3RhdGljIGludCBwaXJxX2FsaV9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxbWFwWzE2XSA9IHsgMCwgOSwgMywgMTAsIDQsIDUsIDcsIDYsIDEsIDExLCAwLCAxMiwgMCwgMTQsIDAsIDE1IH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXJxbWFwWzE2XSA9IHsgMCwgOSwgMywgMTAsIDQsIDUsIDcsIDYsIDEsIDExLCAwLCAxMiwgMCwgMTQsIDAsIDE1IH07CiAKIAlyZXR1cm4gaXJxbWFwW3JlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NDgsIHBpcnEtMSldOwogfQogCiBzdGF0aWMgaW50IHBpcnFfYWxpX3NldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSwgaW50IGlycSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBpcnFtYXBbMTZdID0geyAwLCA4LCAwLCAyLCA0LCA1LCA3LCA2LCAwLCAxLCAzLCA5LCAxMSwgMCwgMTMsIDE1IH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgaXJxbWFwWzE2XSA9IHsgMCwgOCwgMCwgMiwgNCwgNSwgNywgNiwgMCwgMSwgMywgOSwgMTEsIDAsIDEzLCAxNSB9OwogCXVuc2lnbmVkIGludCB2YWwgPSBpcnFtYXBbaXJxXTsKIAkJCiAJaWYgKHZhbCkgewpAQCAtMjU2LDEzICsyNTYsMTMgQEAKICAqLwogc3RhdGljIGludCBwaXJxX3ZpYTU4Nl9nZXQoc3RydWN0IHBjaV9kZXYgKnJvdXRlciwgc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHBpcnEpCiB7Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBwaXJxbWFwWzRdID0geyAzLCAyLCA1LCAxIH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwaXJxbWFwWzRdID0geyAzLCAyLCA1LCAxIH07CiAJcmV0dXJuIHJlYWRfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NTUsIHBpcnFtYXBbcGlycS0xXSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlycV92aWE1ODZfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQogewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgcGlycW1hcFs0XSA9IHsgMywgMiwgNSwgMSB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGlycW1hcFs0XSA9IHsgMywgMiwgNSwgMSB9OwogCXdyaXRlX2NvbmZpZ19ueWJibGUocm91dGVyLCAweDU1LCBwaXJxbWFwW3BpcnEtMV0sIGlycSk7CiAJcmV0dXJuIDE7CiB9CkBAIC0yNzQsMTMgKzI3NCwxMyBAQAogICovCiBzdGF0aWMgaW50IHBpcnFfaXRlX2dldChzdHJ1Y3QgcGNpX2RldiAqcm91dGVyLCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgcGlycSkKIHsKLQlzdGF0aWMgdW5zaWduZWQgY2hhciBwaXJxbWFwWzRdID0geyAxLCAwLCAyLCAzIH07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcGlycW1hcFs0XSA9IHsgMSwgMCwgMiwgMyB9OwogCXJldHVybiByZWFkX2NvbmZpZ19ueWJibGUocm91dGVyLDB4NDMsIHBpcnFtYXBbcGlycS0xXSk7CiB9CiAKIHN0YXRpYyBpbnQgcGlycV9pdGVfc2V0KHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaXJxLCBpbnQgaXJxKQogewotCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBpcnFtYXBbNF0gPSB7IDEsIDAsIDIsIDMgfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwaXJxbWFwWzRdID0geyAxLCAwLCAyLCAzIH07CiAJd3JpdGVfY29uZmlnX255YmJsZShyb3V0ZXIsIDB4NDMsIHBpcnFtYXBbcGlycS0xXSwgaXJxKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTUwNSw3ICs1MDUsNyBAQAogCiBzdGF0aWMgX19pbml0IGludCBpbnRlbF9yb3V0ZXJfcHJvYmUoc3RydWN0IGlycV9yb3V0ZXIgKnIsIHN0cnVjdCBwY2lfZGV2ICpyb3V0ZXIsIHUxNiBkZXZpY2UpCiB7Ci0Jc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHBpcnFfNDQwZ3hbXSA9IHsKKwlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0ZGF0YSBwaXJxXzQ0MGd4W10gPSB7CiAJCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzR1hfMCkgfSwKIAkJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI0NDNHWF8yKSB9LAogCQl7IH0sCkBAIC04ODAsNiArODgwLDcgQEAKIAkoKCEocGNpX3Byb2JlICYgUENJX1VTRV9QSVJRX01BU0spKSB8fCAoKDEgPDwgaXJxKSAmIG1hc2spKSApIHsKIAkJREJHKCIgLT4gZ290IElSUSAlZFxuIiwgaXJxKTsKIAkJbXNnID0gIkZvdW5kIjsKKwkJZWlzYV9zZXRfbGV2ZWxfaXJxKGlycSk7CiAJfSBlbHNlIGlmIChuZXdpcnEgJiYgci0+c2V0ICYmIChkZXYtPmNsYXNzID4+IDgpICE9IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkgewogCQlEQkcoIiAtPiBhc3NpZ25pbmcgSVJRICVkIiwgbmV3aXJxKTsKIAkJaWYgKHItPnNldChwaXJxX3JvdXRlcl9kZXYsIGRldiwgcGlycSwgbmV3aXJxKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jIGIvYXJjaC9pMzg2L3BjaS9tbWNvbmZpZy5jCmluZGV4IDZiMWVhMGMuLmU1NDViMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wY2kvbW1jb25maWcuYworKysgYi9hcmNoL2kzODYvcGNpL21tY29uZmlnLmMKQEAgLTE1LDcgKzE1LDkgQEAKICNpbmNsdWRlIDxhc20vZTgyMC5oPgogI2luY2x1ZGUgInBjaS5oIgogCi0jZGVmaW5lIE1NQ09ORklHX0FQRVJfU0laRSAoMjU2KjEwMjQqMTAyNCkKKy8qIGFwZXJ0dXJlIGlzIHVwIHRvIDI1Nk1CIGJ1dCBCSU9TIG1heSByZXNlcnZlIGxlc3MgKi8KKyNkZWZpbmUgTU1DT05GSUdfQVBFUl9NSU4JKDIgKiAxMDI0KjEwMjQpCisjZGVmaW5lIE1NQ09ORklHX0FQRVJfTUFYCSgyNTYgKiAxMDI0KjEwMjQpCiAKIC8qIEFzc3VtZSBzeXN0ZW1zIHdpdGggbW9yZSBidXNzZXMgaGF2ZSBjb3JyZWN0IE1DRkcgKi8KICNkZWZpbmUgTUFYX0NIRUNLX0JVUyAxNgpAQCAtMTk3LDkgKzE5OSwxMCBAQAogCQlyZXR1cm47CiAKIAlpZiAoIWU4MjBfYWxsX21hcHBlZChwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcywKLQkJCXBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzICsgTU1DT05GSUdfQVBFUl9TSVpFLAorCQkJcGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MgKyBNTUNPTkZJR19BUEVSX01JTiwKIAkJCUU4MjBfUkVTRVJWRUQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUENJOiBCSU9TIEJ1ZzogTUNGRyBhcmVhIGlzIG5vdCBFODIwLXJlc2VydmVkXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IEJJT1MgQnVnOiBNQ0ZHIGFyZWEgYXQgJXggaXMgbm90IEU4MjAtcmVzZXJ2ZWRcbiIsCisJCQkJcGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MpOwogCQlwcmludGsoS0VSTl9FUlIgIlBDSTogTm90IHVzaW5nIE1NQ09ORklHLlxuIik7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2kzODYvcGNpL3BjaS5oIGIvYXJjaC9pMzg2L3BjaS9wY2kuaAppbmRleCAxMjAzNWUyLi4xMmJmM2Q4IDEwMDY0NAotLS0gYS9hcmNoL2kzODYvcGNpL3BjaS5oCisrKyBiL2FyY2gvaTM4Ni9wY2kvcGNpLmgKQEAgLTM1LDYgKzM1LDcgQEAKIAogdm9pZCBwY2liaW9zX3Jlc291cmNlX3N1cnZleSh2b2lkKTsKIGludCBwY2liaW9zX2VuYWJsZV9yZXNvdXJjZXMoc3RydWN0IHBjaV9kZXYgKiwgaW50KTsKK3ZvaWQgcGNpYmlvc19kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqKTsKIAogLyogcGNpLXBjLmMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jIGIvYXJjaC9pMzg2L3Bvd2VyL2NwdS5jCmluZGV4IDc5YjIzNzAuLmU2NTE3OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9wb3dlci9jcHUuYworKysgYi9hcmNoL2kzODYvcG93ZXIvY3B1LmMKQEAgLTEwLDYgKzEwLDggQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNpbmNsdWRlIDxhc20vbWNlLmg+CiAKIHN0YXRpYyBzdHJ1Y3Qgc2F2ZWRfY29udGV4dCBzYXZlZF9jb250ZXh0OwogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDBmMzA3NmEuLjE4MzE4NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC03Nyw2ICs3Nyw3IEBACiBjb25maWcgSUE2NF9HRU5FUklDCiAJYm9vbCAiZ2VuZXJpYyIKIAlzZWxlY3QgQUNQSQorCXNlbGVjdCBQQ0kKIAlzZWxlY3QgTlVNQQogCXNlbGVjdCBBQ1BJX05VTUEKIAloZWxwCkBAIC0yNzMsNyArMjc0LDYgQEAKIGNvbmZpZyBTQ0hFRF9TTVQKIAlib29sICJTTVQgc2NoZWR1bGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBTTVAKLQlkZWZhdWx0IG9mZgogCWhlbHAKIAkgIEltcHJvdmVzIHRoZSBDUFUgc2NoZWR1bGVyJ3MgZGVjaXNpb24gbWFraW5nIHdoZW4gZGVhbGluZyB3aXRoCiAJICBJbnRlbCBJQTY0IGNoaXBzIHdpdGggTXVsdGlUaHJlYWRpbmcgYXQgYSBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZApAQCAtNDQ5LDYgKzQ0OSw4IEBACiAJYm9vbAogCWRlZmF1bHQgUENJCiAKK3NvdXJjZSAiZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvcGNpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY2kvaG90cGx1Zy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L01ha2VmaWxlIGIvYXJjaC9pYTY0L01ha2VmaWxlCmluZGV4IDgwZWE3NTAuLjIxMDMzZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9NYWtlZmlsZQorKysgYi9hcmNoL2lhNjQvTWFrZWZpbGUKQEAgLTcxLDYgKzcxLDggQEAKIAogY29tcHJlc3NlZDogdm1saW51eC5negogCit2bWxpbnV6OiB2bWxpbnV4Lmd6CisKIHZtbGludXguZ3o6IHZtbGludXgKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICRACiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMgYi9hcmNoL2lhNjQvaHAvY29tbW9uL3NiYV9pb21tdS5jCmluZGV4IGJkY2NkMGIuLjU4MjVkZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9jb21tb24vc2JhX2lvbW11LmMKKysrIGIvYXJjaC9pYTY0L2hwL2NvbW1vbi9zYmFfaW9tbXUuYwpAQCAtMTk1OCw3ICsxOTU4LDcgQEAKIAlpZiAocHhtIDwgMCkKIAkJcmV0dXJuOwogCi0Jbm9kZSA9IHB4bV90b19uaWRfbWFwW3B4bV07CisJbm9kZSA9IHB4bV90b19ub2RlKHB4bSk7CiAKIAlpZiAobm9kZSA+PSBNQVhfTlVNTk9ERVMgfHwgIW5vZGVfb25saW5lKG5vZGUpKQogCQlyZXR1cm47CkBAIC0xOTk5LDcgKzE5OTksNyBAQAogCQlpZiAoIWlvdnBfc2hpZnQpCiAJCQlpb3ZwX3NoaWZ0ID0gbWluKFBBR0VfU0hJRlQsIDE2KTsKIAl9Ci0JQUNQSV9NRU1fRlJFRShkZXZfaW5mbyk7CisJa2ZyZWUoZGV2X2luZm8pOwogCiAJLyoKIAkgKiBkZWZhdWx0IGFueXRoaW5nIG5vdCBjYXVnaHQgYWJvdmUgb3Igc3BlY2lmaWVkIG9uIGNtZGxpbmUgdG8gNGsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggNThjOTNhMy4uY2ExNmQ5NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTY4LDggKzY4LDYgQEAKIHVuc2lnbmVkIGNoYXIgYWNwaV9rYmRfY29udHJvbGxlcl9wcmVzZW50ID0gMTsKIHVuc2lnbmVkIGNoYXIgYWNwaV9sZWdhY3lfZGV2aWNlczsKIAotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIGFjcGlfbWFkdF9yZXY7Ci0KIHVuc2lnbmVkIGludCBhY3BpX2NwZWlfb3ZlcnJpZGU7CiB1bnNpZ25lZCBpbnQgYWNwaV9jcGVpX3BoeXNfY3B1aWQ7CiAKQEAgLTI0Myw2ICsyNDEsOCBAQAogCXJldHVybiBpb3NhcGljX2luaXQoaW9zYXBpYy0+YWRkcmVzcywgaW9zYXBpYy0+Z2xvYmFsX2lycV9iYXNlKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXRkYXRhIGFjcGlfbWFkdF9yZXY7CisKIHN0YXRpYyBpbnQgX19pbml0CiBhY3BpX3BhcnNlX3BsYXRfaW50X3NyYyhhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqIGhlYWRlciwKIAkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtNDE1LDkgKzQxNSw2IEBACiBzdGF0aWMgdTMyIF9fZGV2aW5pdGRhdGEgcHhtX2ZsYWdbUFhNX0ZMQUdfTEVOXTsKICNkZWZpbmUgcHhtX2JpdF9zZXQoYml0KQkoc2V0X2JpdChiaXQsKHZvaWQgKilweG1fZmxhZykpCiAjZGVmaW5lIHB4bV9iaXRfdGVzdChiaXQpCSh0ZXN0X2JpdChiaXQsKHZvaWQgKilweG1fZmxhZykpCi0vKiBtYXBzIHRvIGNvbnZlcnQgYmV0d2VlbiBwcm94aW1pdHkgZG9tYWluIGFuZCBsb2dpY2FsIG5vZGUgSUQgKi8KLWludCBfX2RldmluaXRkYXRhIHB4bV90b19uaWRfbWFwW01BWF9QWE1fRE9NQUlOU107Ci1pbnQgX19pbml0ZGF0YSBuaWRfdG9fcHhtX21hcFtNQVhfTlVNTk9ERVNdOwogc3RhdGljIHN0cnVjdCBhY3BpX3RhYmxlX3NsaXQgX19pbml0ZGF0YSAqc2xpdF90YWJsZTsKIAogc3RhdGljIGludCBnZXRfcHJvY2Vzc29yX3Byb3hpbWl0eV9kb21haW4oc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSkKQEAgLTUzMywyMiArNTMwLDE3IEBACiAJICogTUNEIC0gVGhpcyBjYW4gcHJvYmFibHkgYmUgZHJvcHBlZCBub3cuICBObyBuZWVkIGZvciBweG0gSUQgdG8gbm9kZSBJRAogCSAqIG1hcHBpbmcgd2l0aCBzcGFyc2Ugbm9kZSBudW1iZXJpbmcgaWZmIE1BWF9QWE1fRE9NQUlOUyA8PSBNQVhfTlVNTk9ERVMuCiAJICovCi0JLyogY2FsY3VsYXRlIHRvdGFsIG51bWJlciBvZiBub2RlcyBpbiBzeXN0ZW0gZnJvbSBQWE0gYml0bWFwICovCi0JbWVtc2V0KHB4bV90b19uaWRfbWFwLCAtMSwgc2l6ZW9mKHB4bV90b19uaWRfbWFwKSk7Ci0JbWVtc2V0KG5pZF90b19weG1fbWFwLCAtMSwgc2l6ZW9mKG5pZF90b19weG1fbWFwKSk7CiAJbm9kZXNfY2xlYXIobm9kZV9vbmxpbmVfbWFwKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BYTV9ET01BSU5TOyBpKyspIHsKIAkJaWYgKHB4bV9iaXRfdGVzdChpKSkgewotCQkJaW50IG5pZCA9IG51bV9vbmxpbmVfbm9kZXMoKTsKLQkJCXB4bV90b19uaWRfbWFwW2ldID0gbmlkOwotCQkJbmlkX3RvX3B4bV9tYXBbbmlkXSA9IGk7CisJCQlpbnQgbmlkID0gYWNwaV9tYXBfcHhtX3RvX25vZGUoaSk7CiAJCQlub2RlX3NldF9vbmxpbmUobmlkKTsKIAkJfQogCX0KIAogCS8qIHNldCBsb2dpY2FsIG5vZGUgaWQgaW4gbWVtb3J5IGNodW5rIHN0cnVjdHVyZSAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fbm9kZV9tZW1ibGtzOyBpKyspCi0JCW5vZGVfbWVtYmxrW2ldLm5pZCA9IHB4bV90b19uaWRfbWFwW25vZGVfbWVtYmxrW2ldLm5pZF07CisJCW5vZGVfbWVtYmxrW2ldLm5pZCA9IHB4bV90b19ub2RlKG5vZGVfbWVtYmxrW2ldLm5pZCk7CiAKIAkvKiBhc3NpZ24gbWVtb3J5IGJhbmsgbnVtYmVycyBmb3IgZWFjaCBjaHVuayBvbiBlYWNoIG5vZGUgKi8KIAlmb3JfZWFjaF9vbmxpbmVfbm9kZShpKSB7CkBAIC01NjIsNyArNTU0LDcgQEAKIAogCS8qIHNldCBsb2dpY2FsIG5vZGUgaWQgaW4gY3B1IHN0cnVjdHVyZSAqLwogCWZvciAoaSA9IDA7IGkgPCBzcmF0X251bV9jcHVzOyBpKyspCi0JCW5vZGVfY3B1aWRbaV0ubmlkID0gcHhtX3RvX25pZF9tYXBbbm9kZV9jcHVpZFtpXS5uaWRdOworCQlub2RlX2NwdWlkW2ldLm5pZCA9IHB4bV90b19ub2RlKG5vZGVfY3B1aWRbaV0ubmlkKTsKIAogCXByaW50ayhLRVJOX0lORk8gIk51bWJlciBvZiBsb2dpY2FsIG5vZGVzIGluIHN5c3RlbSA9ICVkXG4iLAogCSAgICAgICBudW1fb25saW5lX25vZGVzKCkpOwpAQCAtNTc1LDExICs1NjcsMTEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgc2xpdF90YWJsZS0+bG9jYWxpdGllczsgaSsrKSB7CiAJCWlmICghcHhtX2JpdF90ZXN0KGkpKQogCQkJY29udGludWU7Ci0JCW5vZGVfZnJvbSA9IHB4bV90b19uaWRfbWFwW2ldOworCQlub2RlX2Zyb20gPSBweG1fdG9fbm9kZShpKTsKIAkJZm9yIChqID0gMDsgaiA8IHNsaXRfdGFibGUtPmxvY2FsaXRpZXM7IGorKykgewogCQkJaWYgKCFweG1fYml0X3Rlc3QoaikpCiAJCQkJY29udGludWU7Ci0JCQlub2RlX3RvID0gcHhtX3RvX25pZF9tYXBbal07CisJCQlub2RlX3RvID0gcHhtX3RvX25vZGUoaik7CiAJCQlub2RlX2Rpc3RhbmNlKG5vZGVfZnJvbSwgbm9kZV90bykgPQogCQkJICAgIHNsaXRfdGFibGUtPmVudHJ5W2kgKiBzbGl0X3RhYmxlLT5sb2NhbGl0aWVzICsgal07CiAJCX0KQEAgLTYyNiw3ICs2MTgsNyBAQAogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9mYWR0KHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpmYWR0X2hlYWRlcjsKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmZhZHQ7CisJc3RydWN0IGZhZHRfZGVzY3JpcHRvciAqZmFkdDsKIAogCWlmICghcGh5c19hZGRyIHx8ICFzaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTYzNSw3ICs2MjcsNyBAQAogCWlmIChmYWR0X2hlYWRlci0+cmV2aXNpb24gIT0gMykKIAkJcmV0dXJuIC1FTk9ERVY7CS8qIE9ubHkgZGVhbCB3aXRoIEFDUEkgMi4wIEZBRFQgKi8KIAotCWZhZHQgPSAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICopZmFkdF9oZWFkZXI7CisJZmFkdCA9IChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICopZmFkdF9oZWFkZXI7CiAKIAlpZiAoIShmYWR0LT5pYXBjX2Jvb3RfYXJjaCAmIEJBRl84MDQyX0tFWUJPQVJEX0NPTlRST0xMRVIpKQogCQlhY3BpX2tiZF9jb250cm9sbGVyX3ByZXNlbnQgPSAwOwpAQCAtNzg1LDkgKzc3Nyw5IEBACiAKIAkvKgogCSAqIEFzc3VtaW5nIHRoYXQgdGhlIGNvbnRhaW5lciBkcml2ZXIgd291bGQgaGF2ZSBzZXQgdGhlIHByb3hpbWl0eQotCSAqIGRvbWFpbiBhbmQgd291bGQgaGF2ZSBpbml0aWFsaXplZCBweG1fdG9fbmlkX21hcFtweG1faWRdICYmIHB4bV9mbGFnCisJICogZG9tYWluIGFuZCB3b3VsZCBoYXZlIGluaXRpYWxpemVkIHB4bV90b19ub2RlKHB4bV9pZCkgJiYgcHhtX2ZsYWcKIAkgKi8KLQlub2RlX2NwdWlkW2NwdV0ubmlkID0gKHB4bV9pZCA8IDApID8gMCA6IHB4bV90b19uaWRfbWFwW3B4bV9pZF07CisJbm9kZV9jcHVpZFtjcHVdLm5pZCA9IChweG1faWQgPCAwKSA/IDAgOiBweG1fdG9fbm9kZShweG1faWQpOwogCiAJbm9kZV9jcHVpZFtjcHVdLnBoeXNfaWQgPSBwaHlzaWQ7CiAjZW5kaWYKQEAgLTk2Niw3ICs5NTgsNyBAQAogCWlmIChweG0gPCAwKQogCQlyZXR1cm4gQUVfT0s7CiAKLQlub2RlID0gcHhtX3RvX25pZF9tYXBbcHhtXTsKKwlub2RlID0gcHhtX3RvX25vZGUocHhtKTsKIAogCWlmIChub2RlID49IE1BWF9OVU1OT0RFUyB8fCAhbm9kZV9vbmxpbmUobm9kZSkgfHwKIAkgICAgY3B1c19lbXB0eShub2RlX3RvX2NwdW1hc2sobm9kZSkpKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDc3MjI1NjUuLjE2ZTdiNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIxNywxNiArMjE3LDI0IEBACiAJREVGSU5FKElBNjRfTUNBX0NQVV9JTklUX1NUQUNLX09GRlNFVCwKIAkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X21jYV9jcHUsIGluaXRfc3RhY2spKTsKIAlCTEFOSygpOwotCURFRklORShJQTY0X1NBTF9PU19TVEFURV9DT01NT05fT0ZGU0VULAotCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBzYWxfcmEpKTsKIAlERUZJTkUoSUE2NF9TQUxfT1NfU1RBVEVfT1NfR1BfT0ZGU0VULAogCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBvc19ncCkpOwotCURFRklORShJQTY0X1NBTF9PU19TVEFURV9QQUxfTUlOX1NUQVRFX09GRlNFVCwKLQkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSwgcGFsX21pbl9zdGF0ZSkpOwogCURFRklORShJQTY0X1NBTF9PU19TVEFURV9QUk9DX1NUQVRFX1BBUkFNX09GRlNFVCwKIAkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSwgcHJvY19zdGF0ZV9wYXJhbSkpOworCURFRklORShJQTY0X1NBTF9PU19TVEFURV9TQUxfUkFfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBzYWxfcmEpKTsKKwlERUZJTkUoSUE2NF9TQUxfT1NfU1RBVEVfU0FMX0dQX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSwgc2FsX2dwKSk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX1BBTF9NSU5fU1RBVEVfT0ZGU0VULAorCSAgICAgICBvZmZzZXRvZiAoc3RydWN0IGlhNjRfc2FsX29zX3N0YXRlLCBwYWxfbWluX3N0YXRlKSk7CisJREVGSU5FKElBNjRfU0FMX09TX1NUQVRFX09TX1NUQVRVU19PRkZTRVQsCisJICAgICAgIG9mZnNldG9mIChzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUsIG9zX3N0YXR1cykpOworCURFRklORShJQTY0X1NBTF9PU19TVEFURV9DT05URVhUX09GRlNFVCwKKwkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSwgY29udGV4dCkpOwogCURFRklORShJQTY0X1NBTF9PU19TVEFURV9TSVpFLAogCSAgICAgICBzaXplb2YgKHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSkpOworCUJMQU5LKCk7CisKIAlERUZJTkUoSUE2NF9QTVNBX0dSX09GRlNFVCwKIAkgICAgICAgb2Zmc2V0b2YgKHN0cnVjdCBwYWxfbWluX3N0YXRlX2FyZWFfcywgcG1zYV9ncikpOwogCURFRklORShJQTY0X1BNU0FfQkFOSzFfR1JfT0ZGU0VULApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKaW5kZXggMTJjZmVkYy4uYzMzZDBiYSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCkBAIC04LDYgKzgsOCBAQAogICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDMgSGV3bGV0dC1QYWNrYXJkIENvLgogICoJRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgogICoJU3RlcGhhbmUgRXJhbmlhbiA8ZXJhbmlhbkBocGwuaHAuY29tPgorICogKGMpIENvcHlyaWdodCAyMDA2IEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAuCisgKglCam9ybiBIZWxnYWFzIDxiam9ybi5oZWxnYWFzQGhwLmNvbT4KICAqCiAgKiBBbGwgRUZJIFJ1bnRpbWUgU2VydmljZXMgYXJlIG5vdCBpbXBsZW1lbnRlZCB5ZXQgYXMgRUZJIG9ubHkKICAqIHN1cHBvcnRzIHBoeXNpY2FsIG1vZGUgYWRkcmVzc2luZyBvbiBTb2Z0U0RWLiBUaGlzIGlzIHRvIGJlIGZpeGVkCkBAIC02MjIsNiArNjI0LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qga2Vybl9tZW1kZXNjICoKK2tlcm5fbWVtb3J5X2Rlc2NyaXB0b3IgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQoreworCXN0cnVjdCBrZXJuX21lbWRlc2MgKm1kOworCisJZm9yIChtZCA9IGtlcm5fbWVtbWFwOyBtZC0+c3RhcnQgIT0gfjBVTDsgbWQrKykgeworCQlpZiAocGh5c19hZGRyIC0gbWQtPnN0YXJ0IDwgKG1kLT5udW1fcGFnZXMgPDwgRUZJX1BBR0VfU0hJRlQpKQorCQkJIHJldHVybiBtZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBlZmlfbWVtb3J5X2Rlc2NfdCAqCiBlZmlfbWVtb3J5X2Rlc2NyaXB0b3IgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKQogewpAQCAtNjQyLDI2ICs2NTYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50Ci1lZmlfbWVtbWFwX2hhc19tbWlvICh2b2lkKQotewotCXZvaWQgKmVmaV9tYXBfc3RhcnQsICplZmlfbWFwX2VuZCwgKnA7Ci0JZWZpX21lbW9yeV9kZXNjX3QgKm1kOwotCXU2NCBlZmlfZGVzY19zaXplOwotCi0JZWZpX21hcF9zdGFydCA9IF9fdmEoaWE2NF9ib290X3BhcmFtLT5lZmlfbWVtbWFwKTsKLQllZmlfbWFwX2VuZCAgID0gZWZpX21hcF9zdGFydCArIGlhNjRfYm9vdF9wYXJhbS0+ZWZpX21lbW1hcF9zaXplOwotCWVmaV9kZXNjX3NpemUgPSBpYTY0X2Jvb3RfcGFyYW0tPmVmaV9tZW1kZXNjX3NpemU7Ci0KLQlmb3IgKHAgPSBlZmlfbWFwX3N0YXJ0OyBwIDwgZWZpX21hcF9lbmQ7IHAgKz0gZWZpX2Rlc2Nfc2l6ZSkgewotCQltZCA9IHA7Ci0KLQkJaWYgKG1kLT50eXBlID09IEVGSV9NRU1PUllfTUFQUEVEX0lPKQotCQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOwotfQotCiB1MzIKIGVmaV9tZW1fdHlwZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpCiB7CkBAIC02ODMsNzEgKzY3NywxMjUgQEAKIH0KIEVYUE9SVF9TWU1CT0woZWZpX21lbV9hdHRyaWJ1dGVzKTsKIAotLyoKLSAqIERldGVybWluZXMgd2hldGhlciB0aGUgbWVtb3J5IGF0IHBoeXNfYWRkciBzdXBwb3J0cyB0aGUgZGVzaXJlZAotICogYXR0cmlidXRlIChXQiwgVUMsIGV0YykuICBJZiB0aGlzIHJldHVybnMgMSwgdGhlIGNhbGxlciBjYW4gc2FmZWx5Ci0gKiBhY2Nlc3Mgc2l6ZSBieXRlcyBhdCBwaHlzX2FkZHIgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KLSAqLwotaW50Ci1lZmlfbWVtX2F0dHJpYnV0ZV9yYW5nZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTY0IGF0dHIpCit1NjQKK2VmaV9tZW1fYXR0cmlidXRlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgZW5kID0gcGh5c19hZGRyICsgc2l6ZTsKIAllZmlfbWVtb3J5X2Rlc2NfdCAqbWQgPSBlZmlfbWVtb3J5X2Rlc2NyaXB0b3IocGh5c19hZGRyKTsKKwl1NjQgYXR0cjsKKworCWlmICghbWQpCisJCXJldHVybiAwOwogCiAJLyoKLQkgKiBTb21lIGZpcm13YXJlIGRvZXNuJ3QgcmVwb3J0IE1NSU8gcmVnaW9ucyBpbiB0aGUgRUZJIG1lbW9yeQotCSAqIG1hcC4gIFRoZSBJbnRlbCBCaWdTdXIgKGEuay5hLiBIUCBpMjAwMCkgaGFzIHRoaXMgcHJvYmxlbS4KLQkgKiBPbiB0aG9zZSBwbGF0Zm9ybXMsIHdlIGhhdmUgdG8gYXNzdW1lIFVDIGlzIHZhbGlkIGV2ZXJ5d2hlcmUuCisJICogRUZJX01FTU9SWV9SVU5USU1FIGlzIG5vdCBhIG1lbW9yeSBhdHRyaWJ1dGU7IGl0IGp1c3QgdGVsbHMKKwkgKiB0aGUga2VybmVsIHRoYXQgZmlybXdhcmUgbmVlZHMgdGhpcyByZWdpb24gbWFwcGVkLgogCSAqLwotCWlmICghbWQgfHwgKG1kLT5hdHRyaWJ1dGUgJiBhdHRyKSAhPSBhdHRyKSB7Ci0JCWlmIChhdHRyID09IEVGSV9NRU1PUllfVUMgJiYgIWVmaV9tZW1tYXBfaGFzX21taW8oKSkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMDsKLQl9Ci0KKwlhdHRyID0gbWQtPmF0dHJpYnV0ZSAmIH5FRklfTUVNT1JZX1JVTlRJTUU7CiAJZG8gewogCQl1bnNpZ25lZCBsb25nIG1kX2VuZCA9IGVmaV9tZF9lbmQobWQpOwogCiAJCWlmIChlbmQgPD0gbWRfZW5kKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gYXR0cjsKIAogCQltZCA9IGVmaV9tZW1vcnlfZGVzY3JpcHRvcihtZF9lbmQpOwotCQlpZiAoIW1kIHx8IChtZC0+YXR0cmlidXRlICYgYXR0cikgIT0gYXR0cikKKwkJaWYgKCFtZCB8fCAobWQtPmF0dHJpYnV0ZSAmIH5FRklfTUVNT1JZX1JVTlRJTUUpICE9IGF0dHIpCiAJCQlyZXR1cm4gMDsKIAl9IHdoaWxlIChtZCk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBGb3IgL2Rldi9tZW0sIHdlIG9ubHkgYWxsb3cgcmVhZCAmIHdyaXRlIHN5c3RlbSBjYWxscyB0byBhY2Nlc3MKLSAqIHdyaXRlLWJhY2sgbWVtb3J5LCBiZWNhdXNlIHJlYWQgJiB3cml0ZSBkb24ndCBhbGxvdyB0aGUgdXNlciB0bwotICogY29udHJvbCBhY2Nlc3Mgc2l6ZS4KLSAqLwordTY0CitrZXJuX21lbV9hdHRyaWJ1dGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwaHlzX2FkZHIgKyBzaXplOworCXN0cnVjdCBrZXJuX21lbWRlc2MgKm1kOworCXU2NCBhdHRyOworCisJLyoKKwkgKiBUaGlzIGlzIGEgaGFjayBmb3IgaW9yZW1hcCBjYWxscyBiZWZvcmUgd2Ugc2V0IHVwIGtlcm5fbWVtbWFwLgorCSAqIE1heWJlIHdlIHNob3VsZCBkbyBlZmlfbWVtbWFwX2luaXQoKSBlYXJsaWVyIGluc3RlYWQuCisJICovCisJaWYgKCFrZXJuX21lbW1hcCkgeworCQlhdHRyID0gZWZpX21lbV9hdHRyaWJ1dGUocGh5c19hZGRyLCBzaXplKTsKKwkJaWYgKGF0dHIgJiBFRklfTUVNT1JZX1dCKQorCQkJcmV0dXJuIEVGSV9NRU1PUllfV0I7CisJCXJldHVybiAwOworCX0KKworCW1kID0ga2Vybl9tZW1vcnlfZGVzY3JpcHRvcihwaHlzX2FkZHIpOworCWlmICghbWQpCisJCXJldHVybiAwOworCisJYXR0ciA9IG1kLT5hdHRyaWJ1dGU7CisJZG8geworCQl1bnNpZ25lZCBsb25nIG1kX2VuZCA9IGttZF9lbmQobWQpOworCisJCWlmIChlbmQgPD0gbWRfZW5kKQorCQkJcmV0dXJuIGF0dHI7CisKKwkJbWQgPSBrZXJuX21lbW9yeV9kZXNjcmlwdG9yKG1kX2VuZCk7CisJCWlmICghbWQgfHwgbWQtPmF0dHJpYnV0ZSAhPSBhdHRyKQorCQkJcmV0dXJuIDA7CisJfSB3aGlsZSAobWQpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChrZXJuX21lbV9hdHRyaWJ1dGUpOworCiBpbnQKIHZhbGlkX3BoeXNfYWRkcl9yYW5nZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlyZXR1cm4gZWZpX21lbV9hdHRyaWJ1dGVfcmFuZ2UocGh5c19hZGRyLCBzaXplLCBFRklfTUVNT1JZX1dCKTsKKwl1NjQgYXR0cjsKKworCS8qCisJICogL2Rldi9tZW0gcmVhZHMgYW5kIHdyaXRlcyB1c2UgY29weV90b191c2VyKCksIHdoaWNoIGltcGxpY2l0bHkKKwkgKiB1c2VzIGEgZ3JhbnVsZS1zaXplZCBrZXJuZWwgaWRlbnRpdHkgbWFwcGluZy4gIEl0J3MgcmVhbGx5CisJICogb25seSBzYWZlIHRvIGRvIHRoaXMgZm9yIHJlZ2lvbnMgaW4ga2Vybl9tZW1tYXAuICBGb3IgbW9yZQorCSAqIGRldGFpbHMsIHNlZSBEb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0LgorCSAqLworCWF0dHIgPSBrZXJuX21lbV9hdHRyaWJ1dGUocGh5c19hZGRyLCBzaXplKTsKKwlpZiAoYXR0ciAmIEVGSV9NRU1PUllfV0IgfHwgYXR0ciAmIEVGSV9NRU1PUllfVUMpCisJCXJldHVybiAxOworCXJldHVybiAwOwogfQogCi0vKgotICogV2UgYWxsb3cgbW1hcCBvZiBhbnl0aGluZyBpbiB0aGUgRUZJIG1lbW9yeSBtYXAgdGhhdCBzdXBwb3J0cwotICogZWl0aGVyIHdyaXRlLWJhY2sgb3IgdW5jYWNoZWFibGUgYWNjZXNzLiAgRm9yIHVuY2FjaGVhYmxlIHJlZ2lvbnMsCi0gKiB0aGUgc3VwcG9ydGVkIGFjY2VzcyBzaXplcyBhcmUgc3lzdGVtLWRlcGVuZGVudCwgYW5kIHRoZSB1c2VyIGlzCi0gKiByZXNwb25zaWJsZSBmb3IgdXNpbmcgdGhlIGNvcnJlY3Qgc2l6ZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGN1cnJlbnRseSBhbGxvdyBhY2Nlc3MgdG8gaG90LWFkZGVkIG1lbW9yeSwKLSAqIGJlY2F1c2UgdGhhdCBkb2Vzbid0IGFwcGVhciBpbiB0aGUgYm9vdC10aW1lIEVGSSBtZW1vcnkgbWFwLgotICovCiBpbnQKIHZhbGlkX21tYXBfcGh5c19hZGRyX3JhbmdlICh1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWlmIChlZmlfbWVtX2F0dHJpYnV0ZV9yYW5nZShwaHlzX2FkZHIsIHNpemUsIEVGSV9NRU1PUllfV0IpKQotCQlyZXR1cm4gMTsKKwkvKgorCSAqIE1NSU8gcmVnaW9ucyBhcmUgb2Z0ZW4gbWlzc2luZyBmcm9tIHRoZSBFRkkgbWVtb3J5IG1hcC4KKwkgKiBXZSBtdXN0IGFsbG93IG1tYXAgb2YgdGhlbSBmb3IgcHJvZ3JhbXMgbGlrZSBYLCBzbyB3ZQorCSAqIGN1cnJlbnRseSBjYW4ndCBkbyBhbnkgdXNlZnVsIHZhbGlkYXRpb24uCisJICovCisJcmV0dXJuIDE7Cit9CiAKLQlpZiAoZWZpX21lbV9hdHRyaWJ1dGVfcmFuZ2UocGh5c19hZGRyLCBzaXplLCBFRklfTUVNT1JZX1VDKSkKLQkJcmV0dXJuIDE7CitwZ3Byb3RfdAorcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgcGZuLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCSAgICAgcGdwcm90X3Qgdm1hX3Byb3QpCit7CisJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIgPSBwZm4gPDwgUEFHRV9TSElGVDsKKwl1NjQgYXR0cjsKIAotCXJldHVybiAwOworCS8qCisJICogRm9yIC9kZXYvbWVtIG1tYXAsIHdlIHVzZSB1c2VyIG1hcHBpbmdzLCBidXQgaWYgdGhlIHJlZ2lvbiBpcworCSAqIGluIGtlcm5fbWVtbWFwIChhbmQgaGVuY2UgbWF5IGJlIGNvdmVyZWQgYnkgYSBrZXJuZWwgbWFwcGluZyksCisJICogd2UgbXVzdCB1c2UgdGhlIHNhbWUgYXR0cmlidXRlIGFzIHRoZSBrZXJuZWwgbWFwcGluZy4KKwkgKi8KKwlhdHRyID0ga2Vybl9tZW1fYXR0cmlidXRlKHBoeXNfYWRkciwgc2l6ZSk7CisJaWYgKGF0dHIgJiBFRklfTUVNT1JZX1dCKQorCQlyZXR1cm4gcGdwcm90X2NhY2hlYWJsZSh2bWFfcHJvdCk7CisJZWxzZSBpZiAoYXR0ciAmIEVGSV9NRU1PUllfVUMpCisJCXJldHVybiBwZ3Byb3Rfbm9uY2FjaGVkKHZtYV9wcm90KTsKKworCS8qCisJICogU29tZSBjaGlwc2V0cyBkb24ndCBzdXBwb3J0IFVDIGFjY2VzcyB0byBtZW1vcnkuICBJZgorCSAqIFdCIGlzIHN1cHBvcnRlZCwgd2UgcHJlZmVyIHRoYXQuCisJICovCisJaWYgKGVmaV9tZW1fYXR0cmlidXRlKHBoeXNfYWRkciwgc2l6ZSkgJiBFRklfTUVNT1JZX1dCKQorCQlyZXR1cm4gcGdwcm90X2NhY2hlYWJsZSh2bWFfcHJvdCk7CisKKwlyZXR1cm4gcGdwcm90X25vbmNhY2hlZCh2bWFfcHJvdCk7CiB9CiAKIGludCBfX2luaXQKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpX3N0dWIuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZWZpX3N0dWIuUwppbmRleCA1YTdmZTcwLi5hNTZlMTYxIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VmaV9zdHViLlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmlfc3R1Yi5TCkBAIC02MSw3ICs2MSw3IEBACiAJb3IgbG9jMz1sb2MzLHIxNwogCW1vdiBiNj1yMgogCTs7Ci0JYW5kY20gcjE2PWxvYzMscjE2CQkvLyBnZXQgcHNyIHdpdGggSVQsIERULCBhbmQgUlQgYml0cyBjbGVhcmVkCisJYW5kY20gcjE2PWxvYzMscjE2CS8vIGdldCBwc3Igd2l0aCBJVCwgRFQsIGFuZCBSVCBiaXRzIGNsZWFyZWQKIAlici5jYWxsLnNwdGsubWFueSBycD1pYTY0X3N3aXRjaF9tb2RlX3BoeXMKIC5yZXQwOgltb3Ygb3V0ND1pbjUKIAltb3Ygb3V0MD1pbjEKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuUwppbmRleCBiY2I4MGNhLi4zMmM5OTlmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5TCkBAIC0xNTg0LDcgKzE1ODQsNyBAQAogCWRhdGE4IHN5c19rZXljdGwKIAlkYXRhOCBzeXNfaW9wcmlvX3NldAogCWRhdGE4IHN5c19pb3ByaW9fZ2V0CQkJLy8gMTI3NQotCWRhdGE4IHN5c19uaV9zeXNjYWxsCisJZGF0YTggc3lzX21vdmVfcGFnZXMKIAlkYXRhOCBzeXNfaW5vdGlmeV9pbml0CiAJZGF0YTggc3lzX2lub3RpZnlfYWRkX3dhdGNoCiAJZGF0YTggc3lzX2lub3RpZnlfcm1fd2F0Y2gKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuaCBiL2FyY2gvaWE2NC9rZXJuZWwvZW50cnkuaAppbmRleCA3OGVlYjA3Li5lYmMzZGZiIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL2VudHJ5LmgKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lbnRyeS5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNkZWZpbmUgUFQoZikJCShJQTY0X1BUX1JFR1NfIyNmIyNfT0ZGU0VUKQogI2RlZmluZSBTVyhmKQkJKElBNjRfU1dJVENIX1NUQUNLXyMjZiMjX09GRlNFVCkKKyNkZWZpbmUgU09TKGYpCQkoSUE2NF9TQUxfT1NfU1RBVEVfIyNmIyNfT0ZGU0VUKQogCiAjZGVmaW5lIFBUX1JFR1NfU0FWRVMob2ZmKQkJCVwKIAkudW53YWJpIDMsICdpJzsJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pcnFfaWE2NC5jCmluZGV4IDZjNGQ1OWYuLmVmOWEyYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvaXJxX2lhNjQuYworKysgYi9hcmNoL2lhNjQva2VybmVsL2lycV9pYTY0LmMKQEAgLTQ2LDYgKzQ2LDEwIEBACiAKICNkZWZpbmUgSVJRX0RFQlVHCTAKIAorLyogVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gaW4gcGxhdGZvcm1faXJxX2luaXQgKi8KK2ludCBpYTY0X2ZpcnN0X2RldmljZV92ZWN0b3IgPSBJQTY0X0RFRl9GSVJTVF9ERVZJQ0VfVkVDVE9SOworaW50IGlhNjRfbGFzdF9kZXZpY2VfdmVjdG9yID0gSUE2NF9ERUZfTEFTVF9ERVZJQ0VfVkVDVE9SOworCiAvKiBkZWZhdWx0IGJhc2UgYWRkciBvZiBJUEkgdGFibGUgKi8KIHZvaWQgX19pb21lbSAqaXBpX2Jhc2VfYWRkciA9ICgodm9pZCBfX2lvbWVtICopCiAJCQkgICAgICAgKF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQgfCBJQTY0X0lQSV9ERUZBVUxUX0JBU0VfQUREUikpOwpAQCAtNjAsNyArNjQsNyBAQAogfTsKIEVYUE9SVF9TWU1CT0woaXNhX2lycV90b192ZWN0b3JfbWFwKTsKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgaWE2NF92ZWN0b3JfbWFza1tCSVRTX1RPX0xPTkdTKElBNjRfTlVNX0RFVklDRV9WRUNUT1JTKV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpYTY0X3ZlY3Rvcl9tYXNrW0JJVFNfVE9fTE9OR1MoSUE2NF9NQVhfREVWSUNFX1ZFQ1RPUlMpXTsKIAogaW50CiBhc3NpZ25faXJxX3ZlY3RvciAoaW50IGlycSkKQEAgLTg5LDYgKzkzLDE5IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkb3VibGUgZnJlZSFcbiIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKK2ludAorcmVzZXJ2ZV9pcnFfdmVjdG9yIChpbnQgdmVjdG9yKQoreworCWludCBwb3M7CisKKwlpZiAodmVjdG9yIDwgSUE2NF9GSVJTVF9ERVZJQ0VfVkVDVE9SIHx8CisJICAgIHZlY3RvciA+IElBNjRfTEFTVF9ERVZJQ0VfVkVDVE9SKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBvcyA9IHZlY3RvciAtIElBNjRfRklSU1RfREVWSUNFX1ZFQ1RPUjsKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdChwb3MsIGlhNjRfdmVjdG9yX21hc2spOworfQorCiAjaWZkZWYgQ09ORklHX1NNUAogIwlkZWZpbmUgSVNfUkVTQ0hFRFVMRSh2ZWMpCSh2ZWMgPT0gSUE2NF9JUElfUkVTQ0hFRFVMRSkKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21jYV9hc20uUyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCmluZGV4IDZkZmYwMjQuLmMxYmQxZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWNhX2FzbS5TCkBAIC0xNTksNyArMTU5LDcgQEAKIAlHRVRfSUE2NF9NQ0FfREFUQShyMikKIAkvLyBVc2luZyBNQ0Egc3RhY2ssIHN0cnVjdCBpYTY0X3NhbF9vc19zdGF0ZSwgdmFyaWFibGUgcHJvY19zdGF0ZV9wYXJhbQogCTs7Ci0JYWRkIHIzPUlBNjRfTUNBX0NQVV9NQ0FfU1RBQ0tfT0ZGU0VUK01DQV9TT1NfT0ZGU0VUK0lBNjRfU0FMX09TX1NUQVRFX1BST0NfU1RBVEVfUEFSQU1fT0ZGU0VULCByMgorCWFkZCByMz1JQTY0X01DQV9DUFVfTUNBX1NUQUNLX09GRlNFVCtNQ0FfU09TX09GRlNFVCtTT1MoUFJPQ19TVEFURV9QQVJBTSksIHIyCiAJOzsKIAlsZDggcjE4PVtyM10JCQkJLy8gR2V0IHByb2Nlc3NvciBzdGF0ZSBwYXJhbWV0ZXIgb24gZXhpc3RpbmcgUEFMRV9DSEVDSy4KIAk7OwpAQCAtNDc5LDkgKzQ3OSwxMSBAQAogCXN0OCBbdGVtcDJdPXIxMSwxNgkvLyBydl9yYwogCW1vdiByMTE9Y3IuaWlwYQogCTs7Ci0Jc3Q4IFt0ZW1wMV09cjE4LDE2CS8vIHByb2Nfc3RhdGVfcGFyYW0KLQlzdDggW3RlbXAyXT1yMTksMTYJLy8gbW9uYXJjaAorCXN0OCBbdGVtcDFdPXIxOAkJLy8gcHJvY19zdGF0ZV9wYXJhbQorCXN0OCBbdGVtcDJdPXIxOQkJLy8gbW9uYXJjaAogCW1vdiByNj1JQTY0X0tSKENVUlJFTlQpCisJYWRkIHRlbXAxPVNPUyhTQUxfUkEpLCByZWdzCisJYWRkIHRlbXAyPVNPUyhTQUxfR1ApLCByZWdzCiAJOzsKIAlzdDggW3RlbXAxXT1yMTIsMTYJLy8gc2FsX3JhCiAJc3Q4IFt0ZW1wMl09cjEwLDE2CS8vIHNhbF9ncApAQCAtNTAzLDEyICs1MDUsMTQgQEAKIAlzdDggW3RlbXAyXT1yMTEsMTYJLy8gY3IuaWlwYQogCW1vdiByMTI9Y3IuaWltCiAJOzsKLQlzdDggW3RlbXAxXT1yMTIsMTYJLy8gY3IuaWltCisJc3Q4IFt0ZW1wMV09cjEyCQkvLyBjci5paW0KIChwMSkJbW92IHIxMj1JQTY0X01DQV9DT0xEX0JPT1QKIChwMikJbW92IHIxMj1JQTY0X0lOSVRfV0FSTV9CT09UCiAJbW92IHI2PWNyLmloYQorCWFkZCB0ZW1wMT1TT1MoT1NfU1RBVFVTKSwgcmVncwogCTs7Ci0Jc3Q4IFt0ZW1wMl09cjYsMTYJLy8gY3IuaWhhCisJc3Q4IFt0ZW1wMl09cjYJCS8vIGNyLmloYQorCWFkZCB0ZW1wMj1TT1MoQ09OVEVYVCksIHJlZ3MKIAlzdDggW3RlbXAxXT1yMTIJCS8vIG9zX3N0YXR1cywgZGVmYXVsdCBpcyBjb2xkIGJvb3QKIAltb3YgcjY9SUE2NF9NQ0FfU0FNRV9DT05URVhUCiAJOzsKQEAgLTgyMCw4ICs4MjQsOCBAQAogCS8vIFJlc3RvcmUgdGhlIFNBTCB0byBPUyBzdGF0ZS4gVGhlIHByZXZpb3VzIGNvZGUgbGVmdCByZWdzIGF0IHB0X3JlZ3MuCiAJYWRkIHJlZ3M9TUNBX1NPU19PRkZTRVQtTUNBX1BUX1JFR1NfT0ZGU0VULCByZWdzCiAJOzsKLQlhZGQgdGVtcDE9SUE2NF9TQUxfT1NfU1RBVEVfQ09NTU9OX09GRlNFVCwgcmVncwotCWFkZCB0ZW1wMj1JQTY0X1NBTF9PU19TVEFURV9DT01NT05fT0ZGU0VUKzgsIHJlZ3MKKwlhZGQgdGVtcDE9U09TKFNBTF9SQSksIHJlZ3MKKwlhZGQgdGVtcDI9U09TKFNBTF9HUCksIHJlZ3MKIAk7OwogCWxkOCByMTI9W3RlbXAxXSwxNgkvLyBzYWxfcmEKIAlsZDggcjk9W3RlbXAyXSwxNgkvLyBzYWxfZ3AKQEAgLTg0Miw4ICs4NDYsMTAgQEAKIAk7OwogCW1vdiBjci5pdGlyPXRlbXAzCiAJbW92IGNyLmlpcGE9dGVtcDQKLQlsZDggdGVtcDM9W3RlbXAxXSwxNgkvLyBjci5paW0KLQlsZDggdGVtcDQ9W3RlbXAyXSwxNgkvLyBjci5paGEKKwlsZDggdGVtcDM9W3RlbXAxXQkvLyBjci5paW0KKwlsZDggdGVtcDQ9W3RlbXAyXQkJLy8gY3IuaWhhCisJYWRkIHRlbXAxPVNPUyhPU19TVEFUVVMpLCByZWdzCisJYWRkIHRlbXAyPVNPUyhDT05URVhUKSwgcmVncwogCTs7CiAJbW92IGNyLmlpbT10ZW1wMwogCW1vdiBjci5paGE9dGVtcDQKQEAgLTkxNiw3ICs5MjIsNyBAQAogCiBpYTY0X25ld19zdGFjazoKIAlhZGQgcmVncz1NQ0FfUFRfUkVHU19PRkZTRVQsIHIzCi0JYWRkIHRlbXAyPU1DQV9TT1NfT0ZGU0VUK0lBNjRfU0FMX09TX1NUQVRFX1BBTF9NSU5fU1RBVEVfT0ZGU0VULCByMworCWFkZCB0ZW1wMj1NQ0FfU09TX09GRlNFVCtTT1MoUEFMX01JTl9TVEFURSksIHIzCiAJbW92IGIwPXIyCQkJLy8gc2F2ZSByZXR1cm4gYWRkcmVzcwogCUdFVF9JQTY0X01DQV9EQVRBKHRlbXAxKQogCWludmFsYQpAQCAtMTAyMCw3ICsxMDI2LDcgQEAKIAogaWE2NF9zZXRfa2VybmVsX3JlZ2lzdGVyczoKIAlhZGQgdGVtcDM9TUNBX1NQX09GRlNFVCwgcjMKLQlhZGQgdGVtcDQ9TUNBX1NPU19PRkZTRVQrSUE2NF9TQUxfT1NfU1RBVEVfT1NfR1BfT0ZGU0VULCByMworCWFkZCB0ZW1wND1NQ0FfU09TX09GRlNFVCtTT1MoT1NfR1ApLCByMwogCW1vdiBiMD1yMgkJLy8gc2F2ZSByZXR1cm4gYWRkcmVzcwogCUdFVF9JQTY0X01DQV9EQVRBKHRlbXAxKQogCTs7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3BlcmZtb24uYyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCmluZGV4IDA3N2YyMTIuLjZkN2JjOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvcGVyZm1vbi5jCkBAIC01MzIsNyArNTMyLDYgQEAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqcGZtX3N5c2N0bF9oZWFkZXI7CiAKIHN0YXRpYyBpbnQgcGZtX2NvbnRleHRfdW5sb2FkKHBmbV9jb250ZXh0X3QgKmN0eCwgdm9pZCAqYXJnLCBpbnQgY291bnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXN0YXRpYyBpbnQgcGZtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKTsKIAogI2RlZmluZSBwZm1fZ2V0X2NwdV92YXIodikJCV9faWE2NF9wZXJfY3B1X3Zhcih2KQogI2RlZmluZSBwZm1fZ2V0X2NwdV9kYXRhKGEsYikJCXBlcl9jcHUoYSwgYikKQEAgLTU5NSwxMCArNTk0LDExIEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCi1wZm1mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50CitwZm1mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCisJICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAicGZtOiIsIE5VTEwsIFBGTUZTX01BR0lDKTsKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAicGZtOiIsIE5VTEwsIFBGTUZTX01BR0lDLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcGZtX2ZzX3R5cGUgPSB7CkBAIC0xNzczLDcgKzE3NzMsNyBAQAogICogV2hlbiBjYWxsZXIgaXMgc2VsZi1tb25pdG9yaW5nLCB0aGUgY29udGV4dCBpcyB1bmxvYWRlZC4KICAqLwogc3RhdGljIGludAotcGZtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwKQorcGZtX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQogewogCXBmbV9jb250ZXh0X3QgKmN0eDsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NhbC5jIGIvYXJjaC9pYTY0L2tlcm5lbC9zYWwuYwppbmRleCAwNTZmN2E2Li43N2ZhNjU5IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3NhbC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2FsLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0CiBjaGVja19zYWxfY2FjaGVfZmx1c2ggKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFncywgaXR2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNwdTsKIAl1NjQgdmVjdG9yOwogCkBAIC0yMzgsOSArMjM4LDYgQEAKIAkgKiBTY2hlZHVsZSBhIHRpbWVyIGludGVycnVwdCwgd2FpdCB1bnRpbCBpdCdzIHJlcG9ydGVkLCBhbmQgc2VlIGlmCiAJICogU0FMX0NBQ0hFX0ZMVVNIIGRyb3BzIGl0LgogCSAqLwotCWl0diA9IGlhNjRfZ2V0X2l0digpOwotCUJVR19PTigoaXR2ICYgKDEgPDwgMTYpKSA9PSAwKTsKLQogCWlhNjRfc2V0X2l0dihJQTY0X1RJTUVSX1ZFQ1RPUik7CiAJaWE2NF9zZXRfaXRtKGlhNjRfZ2V0X2l0YygpICsgMTAwMCk7CiAKQEAgLTI2MCw3ICsyNTcsNiBAQAogCQlpYTY0X2VvaSgpOwogCX0KIAotCWlhNjRfc2V0X2l0dihpdHYpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlwdXRfY3B1KCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMgYi9hcmNoL2lhNjQva2VybmVsL3NldHVwLmMKaW5kZXggZTRkZmRhMS4uNmRiYTJkNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvc2V0dXAuYwpAQCAtMjYwLDYgKzI2MCw3IEBACiAJbisrOwogCiAJbnVtX3JzdmRfcmVnaW9ucyA9IG47CisJQlVHX09OKElBNjRfTUFYX1JTVkRfUkVHSU9OUyArIDEgPCBuKTsKIAogCXNvcnRfcmVnaW9ucyhyc3ZkX3JlZ2lvbiwgbnVtX3JzdmRfcmVnaW9ucyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMgYi9hcmNoL2lhNjQva2VybmVsL3RvcG9sb2d5LmMKaW5kZXggNGYzYTE2Yi4uODc5ZWRiNSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC90b3BvbG9neS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvdG9wb2xvZ3kuYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAludW1fc2hhcmVkID0gKGludCkgY3NpLm51bV9zaGFyZWQ7CiAJZG8gewotCQlmb3JfZWFjaF9jcHUoaikKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopCiAJCQlpZiAoY3B1X2RhdGEoY3B1KS0+c29ja2V0X2lkID09IGNwdV9kYXRhKGopLT5zb2NrZXRfaWQKIAkJCQkmJiBjcHVfZGF0YShqKS0+Y29yZV9pZCA9PSBjc2kubG9nMV9jaWQKIAkJCQkmJiBjcHVfZGF0YShqKS0+dGhyZWFkX2lkID09IGNzaS5sb2cxX3RpZCkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYyBiL2FyY2gvaWE2NC9rZXJuZWwvdW5jYWNoZWQuYwppbmRleCBmY2QyYmFkLi41ZjAzYjllIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQva2VybmVsL3VuY2FjaGVkLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC91bmNhY2hlZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMjksMTUgKzI5LDggQEAKICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KICNpbmNsdWRlIDxhc20vc24vYXJjaC5oPgogCi0jZGVmaW5lIERFQlVHCTAKIAotI2lmIERFQlVHCi0jZGVmaW5lIGRwcmludGsJCQlwcmludGsKLSNlbHNlCi0jZGVmaW5lIGRwcmludGsoeC4uLikJCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCi12b2lkIF9faW5pdCBlZmlfbWVtbWFwX3dhbGtfdWMgKGVmaV9mcmVlbWVtX2NhbGxiYWNrX3QgY2FsbGJhY2spOworZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tZW1tYXBfd2Fsa191YyhlZmlfZnJlZW1lbV9jYWxsYmFja190LCB2b2lkICopOwogCiAjZGVmaW5lIE1BWF9VTkNBQ0hFRF9HUkFOVUxFUwk1CiBzdGF0aWMgaW50IGFsbG9jYXRlZF9ncmFudWxlczsKQEAgLTYwLDYgKzUzLDcgQEAKIHN0YXRpYyB2b2lkIHVuY2FjaGVkX2lwaV9tY19kcmFpbih2b2lkICpkYXRhKQogewogCWludCBzdGF0dXM7CisKIAlzdGF0dXMgPSBpYTY0X3BhbF9tY19kcmFpbigpOwogCWlmIChzdGF0dXMpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImlhNjRfcGFsX21jX2RyYWluKCkgZmFpbGVkIHdpdGggJWkgb24gIgpAQCAtNjcsMzAgKzYxLDM1IEBACiB9CiAKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLXVuY2FjaGVkX2dldF9uZXdfY2h1bmsoc3RydWN0IGdlbl9wb29sICpwb29scCkKKy8qCisgKiBBZGQgYSBuZXcgY2h1bmsgb2YgdW5jYWNoZWQgbWVtb3J5IHBhZ2VzIHRvIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqCisgKiBAcG9vbDogcG9vbCB0byBhZGQgbmV3IGNodW5rIG9mIHVuY2FjaGVkIG1lbW9yeSB0bworICogQG5pZDogbm9kZSBpZCBvZiBub2RlIHRvIGFsbG9jYXRlIG1lbW9yeSBmcm9tLCBvciAtMQorICoKKyAqIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGZpcnN0IGFsbG9jYXRpbmcgYSBncmFudWxlIG9mIGNhY2hlZCBtZW1vcnkgcGFnZXMKKyAqIGFuZCB0aGVuIGNvbnZlcnRpbmcgdGhlbSB0byB1bmNhY2hlZCBtZW1vcnkgcGFnZXMuCisgKi8KK3N0YXRpYyBpbnQgdW5jYWNoZWRfYWRkX2NodW5rKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgaW50IG5pZCkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICp0bXA7CiAJaW50IHN0YXR1cywgaTsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIG5vZGU7CisJdW5zaWduZWQgbG9uZyBjX2FkZHIsIHVjX2FkZHI7CiAKIAlpZiAoYWxsb2NhdGVkX2dyYW51bGVzID49IE1BWF9VTkNBQ0hFRF9HUkFOVUxFUykKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtMTsKIAotCW5vZGUgPSBwb29scC0+cHJpdmF0ZTsKLQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTywKKwkvKiBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgZ3JhbnVsZSdzIHdvcnRoIG9mIGNhY2hlZCBtZW1vcnkgcGFnZXMgKi8KKworCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5pZCwgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sCiAJCQkJSUE2NF9HUkFOVUxFX1NISUZULVBBR0VfU0hJRlQpOwotCi0JZHByaW50ayhLRVJOX0lORk8gImdldF9uZXdfY2h1bmsgcGFnZSAlcCwgYWRkciAlbHhcbiIsCi0JCXBhZ2UsICh1bnNpZ25lZCBsb25nKShwYWdlLXZtZW1fbWFwKSA8PCBQQUdFX1NISUZUKTsKLQotCS8qCi0JICogRG8gbWFnaWMgaWYgbm8gbWVtIG9uIGxvY2FsIG5vZGUhIFhYWAotCSAqLwogCWlmICghcGFnZSkKLQkJcmV0dXJuIDA7Ci0JdG1wID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlyZXR1cm4gLTE7CisKKwkvKiBjb252ZXJ0IHRoZSBtZW1vcnkgcGFnZXMgZnJvbSBjYWNoZWQgdG8gdW5jYWNoZWQgKi8KKworCWNfYWRkciA9ICh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1Y19hZGRyID0gY19hZGRyIC0gUEFHRV9PRkZTRVQgKyBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUOwogCiAJLyoKIAkgKiBUaGVyZSdzIGEgc21hbGwgcmFjZSBoZXJlIHdoZXJlIGl0J3MgcG9zc2libGUgZm9yIHNvbWVvbmUgdG8KQEAgLTEwMCw3NiArOTksOTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgKElBNjRfR1JBTlVMRV9TSVpFIC8gUEFHRV9TSVpFKTsgaSsrKQogCQlTZXRQYWdlVW5jYWNoZWQoJnBhZ2VbaV0pOwogCi0JZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh0bXAsIHRtcCArIElBNjRfR1JBTlVMRV9TSVpFKTsKKwlmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVjX2FkZHIsIHVjX2FkZGRyICsgSUE2NF9HUkFOVUxFX1NJWkUpOwogCiAJc3RhdHVzID0gaWE2NF9wYWxfcHJlZmV0Y2hfdmlzaWJpbGl0eShQQUxfVklTSUJJTElUWV9QSFlTSUNBTCk7Ci0KLQlkcHJpbnRrKEtFUk5fSU5GTyAicGFsX3ByZWZldGNoX3Zpc2liaWxpdHkoKSByZXR1cm5zICVpIG9uIGNwdSAlaVxuIiwKLQkJc3RhdHVzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQogCWlmICghc3RhdHVzKSB7CiAJCXN0YXR1cyA9IHNtcF9jYWxsX2Z1bmN0aW9uKHVuY2FjaGVkX2lwaV92aXNpYmlsaXR5LCBOVUxMLCAwLCAxKTsKIAkJaWYgKHN0YXR1cykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNtcF9jYWxsX2Z1bmN0aW9uIGZhaWxlZCBmb3IgIgotCQkJICAgICAgICJ1bmNhY2hlZF9pcGlfdmlzaWJpbGl0eSEgKCVpKVxuIiwgc3RhdHVzKTsKKwkJCWdvdG8gZmFpbGVkOwogCX0KIAorCXByZWVtcHRfZGlzYWJsZSgpOworCiAJaWYgKGlhNjRfcGxhdGZvcm1faXMoInNuMiIpKQotCQlzbl9mbHVzaF9hbGxfY2FjaGVzKCh1bnNpZ25lZCBsb25nKXRtcCwgSUE2NF9HUkFOVUxFX1NJWkUpOworCQlzbl9mbHVzaF9hbGxfY2FjaGVzKHVjX2FkZHIsIElBNjRfR1JBTlVMRV9TSVpFKTsKIAllbHNlCi0JCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZyl0bXAsCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcpdG1wK0lBNjRfR1JBTlVMRV9TSVpFKTsKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKHVjX2FkZHIsIHVjX2FkZHIgKyBJQTY0X0dSQU5VTEVfU0laRSk7CisKKwkvKiBmbHVzaCB0aGUganVzdCBpbnRyb2R1Y2VkIHVuY2FjaGVkIHRyYW5zbGF0aW9uIGZyb20gdGhlIFRMQiAqLworCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKKworCXByZWVtcHRfZW5hYmxlKCk7CiAKIAlpYTY0X3BhbF9tY19kcmFpbigpOwogCXN0YXR1cyA9IHNtcF9jYWxsX2Z1bmN0aW9uKHVuY2FjaGVkX2lwaV9tY19kcmFpbiwgTlVMTCwgMCwgMSk7CiAJaWYgKHN0YXR1cykKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAic21wX2NhbGxfZnVuY3Rpb24gZmFpbGVkIGZvciAiCi0JCSAgICAgICAidW5jYWNoZWRfaXBpX21jX2RyYWluISAoJWkpXG4iLCBzdGF0dXMpOworCQlnb3RvIGZhaWxlZDsKIAotCWFkZHIgPSAodW5zaWduZWQgbG9uZyl0bXAgLSBQQUdFX09GRlNFVCArIF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQ7CisJLyoKKwkgKiBUaGUgY2h1bmsgb2YgbWVtb3J5IHBhZ2VzIGhhcyBiZWVuIGNvbnZlcnRlZCB0byB1bmNhY2hlZCBzbyBub3cgd2UKKwkgKiBjYW4gYWRkIGl0IHRvIHRoZSBwb29sLgorCSAqLworCXN0YXR1cyA9IGdlbl9wb29sX2FkZChwb29sLCB1Y19hZGRyLCBJQTY0X0dSQU5VTEVfU0laRSwgbmlkKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIGZhaWxlZDsKIAogCWFsbG9jYXRlZF9ncmFudWxlcysrOwotCXJldHVybiBhZGRyOworCXJldHVybiAwOworCisJLyogZmFpbGVkIHRvIGNvbnZlcnQgb3IgYWRkIHRoZSBjaHVuayBzbyBnaXZlIGl0IGJhY2sgdG8gdGhlIGtlcm5lbCAqLworZmFpbGVkOgorCWZvciAoaSA9IDA7IGkgPCAoSUE2NF9HUkFOVUxFX1NJWkUgLyBQQUdFX1NJWkUpOyBpKyspCisJCUNsZWFyUGFnZVVuY2FjaGVkKCZwYWdlW2ldKTsKKworCWZyZWVfcGFnZXMoY19hZGRyLCBJQTY0X0dSQU5VTEVfU0hJRlQtUEFHRV9TSElGVCk7CisJcmV0dXJuIC0xOwogfQogCiAKIC8qCiAgKiB1bmNhY2hlZF9hbGxvY19wYWdlCiAgKgorICogQHN0YXJ0aW5nX25pZDogbm9kZSBpZCBvZiBub2RlIHRvIHN0YXJ0IHdpdGgsIG9yIC0xCisgKgogICogQWxsb2NhdGUgMSB1bmNhY2hlZCBwYWdlLiBBbGxvY2F0ZXMgb24gdGhlIHJlcXVlc3RlZCBub2RlLiBJZiBubwogICogdW5jYWNoZWQgcGFnZXMgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcmVxdWVzdGVkIG5vZGUsIHJvdW5kcm9iaW4gc3RhcnRpbmcKLSAqIHdpdGggaGlnaGVyIG5vZGVzLgorICogd2l0aCB0aGUgbmV4dCBoaWdoZXIgbm9kZS4KICAqLwotdW5zaWduZWQgbG9uZwotdW5jYWNoZWRfYWxsb2NfcGFnZShpbnQgbmlkKQordW5zaWduZWQgbG9uZyB1bmNhY2hlZF9hbGxvY19wYWdlKGludCBzdGFydGluZ19uaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBtYWRkcjsKKwl1bnNpZ25lZCBsb25nIHVjX2FkZHI7CisJc3RydWN0IGdlbl9wb29sICpwb29sOworCWludCBuaWQ7CiAKLQltYWRkciA9IGdlbl9wb29sX2FsbG9jKHVuY2FjaGVkX3Bvb2xbbmlkXSwgUEFHRV9TSVpFKTsKKwlpZiAodW5saWtlbHkoc3RhcnRpbmdfbmlkID49IE1BWF9OVU1OT0RFUykpCisJCXJldHVybiAwOwogCi0JZHByaW50ayhLRVJOX0RFQlVHICJ1bmNhY2hlZF9hbGxvY19wYWdlIHJldHVybnMgJWx4IG9uIG5vZGUgJWlcbiIsCi0JCW1hZGRyLCBuaWQpOworCWlmIChzdGFydGluZ19uaWQgPCAwKQorCQlzdGFydGluZ19uaWQgPSBudW1hX25vZGVfaWQoKTsKKwluaWQgPSBzdGFydGluZ19uaWQ7CiAKLQkvKgotCSAqIElmIG5vIG1lbW9yeSBpcyBhdmFpbGJsZSBvbiBvdXIgbG9jYWwgbm9kZSwgdHJ5IHRoZQotCSAqIHJlbWFpbmluZyBub2RlcyBpbiB0aGUgc3lzdGVtLgotCSAqLwotCWlmICghbWFkZHIpIHsKLQkJaW50IGk7CisJZG8geworCQlpZiAoIW5vZGVfb25saW5lKG5pZCkpCisJCQljb250aW51ZTsKKwkJcG9vbCA9IHVuY2FjaGVkX3Bvb2xbbmlkXTsKKwkJaWYgKHBvb2wgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlkbyB7CisJCQl1Y19hZGRyID0gZ2VuX3Bvb2xfYWxsb2MocG9vbCwgUEFHRV9TSVpFKTsKKwkJCWlmICh1Y19hZGRyICE9IDApCisJCQkJcmV0dXJuIHVjX2FkZHI7CisJCX0gd2hpbGUgKHVuY2FjaGVkX2FkZF9jaHVuayhwb29sLCBuaWQpID09IDApOwogCi0JCWZvciAoaSA9IE1BWF9OVU1OT0RFUyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA9PSBuaWQgfHwgIW5vZGVfb25saW5lKGkpKQotCQkJCWNvbnRpbnVlOwotCQkJbWFkZHIgPSBnZW5fcG9vbF9hbGxvYyh1bmNhY2hlZF9wb29sW2ldLCBQQUdFX1NJWkUpOwotCQkJZHByaW50ayhLRVJOX0RFQlVHICJ1bmNhY2hlZF9hbGxvY19wYWdlIGFsdGVybmF0ZSBzZWFyY2ggIgotCQkJCSJyZXR1cm5zICVseCBvbiBub2RlICVpXG4iLCBtYWRkciwgaSk7Ci0JCQlpZiAobWFkZHIpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwl9IHdoaWxlICgobmlkID0gKG5pZCArIDEpICUgTUFYX05VTU5PREVTKSAhPSBzdGFydGluZ19uaWQpOwogCi0JcmV0dXJuIG1hZGRyOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh1bmNhY2hlZF9hbGxvY19wYWdlKTsKIApAQCAtMTc3LDIxICsxOTAsMjIgQEAKIC8qCiAgKiB1bmNhY2hlZF9mcmVlX3BhZ2UKICAqCisgKiBAdWNfYWRkcjogdW5jYWNoZWQgYWRkcmVzcyBvZiBwYWdlIHRvIGZyZWUKKyAqCiAgKiBGcmVlIGEgc2luZ2xlIHVuY2FjaGVkIHBhZ2UuCiAgKi8KLXZvaWQKLXVuY2FjaGVkX2ZyZWVfcGFnZSh1bnNpZ25lZCBsb25nIG1hZGRyKQordm9pZCB1bmNhY2hlZF9mcmVlX3BhZ2UodW5zaWduZWQgbG9uZyB1Y19hZGRyKQogewotCWludCBub2RlOworCWludCBuaWQgPSBwYWRkcl90b19uaWQodWNfYWRkciAtIF9fSUE2NF9VTkNBQ0hFRF9PRkZTRVQpOworCXN0cnVjdCBnZW5fcG9vbCAqcG9vbCA9IHVuY2FjaGVkX3Bvb2xbbmlkXTsKIAotCW5vZGUgPSBwYWRkcl90b19uaWQobWFkZHIgLSBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUKTsKKwlpZiAodW5saWtlbHkocG9vbCA9PSBOVUxMKSkKKwkJcmV0dXJuOwogCi0JZHByaW50ayhLRVJOX0RFQlVHICJ1bmNhY2hlZF9mcmVlX3BhZ2UoJWx4KSBvbiBub2RlICVpXG4iLCBtYWRkciwgbm9kZSk7CisJaWYgKCh1Y19hZGRyICYgKDBYRlVMIDw8IDYwKSkgIT0gX19JQTY0X1VOQ0FDSEVEX09GRlNFVCkKKwkJcGFuaWMoInVuY2FjaGVkX2ZyZWVfcGFnZSBpbnZhbGlkIGFkZHJlc3MgJWx4XG4iLCB1Y19hZGRyKTsKIAotCWlmICgobWFkZHIgJiAoMFhGVUwgPDwgNjApKSAhPSBfX0lBNjRfVU5DQUNIRURfT0ZGU0VUKQotCQlwYW5pYygidW5jYWNoZWRfZnJlZV9wYWdlIGludmFsaWQgYWRkcmVzcyAlbHhcbiIsIG1hZGRyKTsKLQotCWdlbl9wb29sX2ZyZWUodW5jYWNoZWRfcG9vbFtub2RlXSwgbWFkZHIsIFBBR0VfU0laRSk7CisJZ2VuX3Bvb2xfZnJlZShwb29sLCB1Y19hZGRyLCBQQUdFX1NJWkUpOwogfQogRVhQT1JUX1NZTUJPTCh1bmNhY2hlZF9mcmVlX3BhZ2UpOwogCkBAIC0xOTksNDMgKzIxMywzOSBAQAogLyoKICAqIHVuY2FjaGVkX2J1aWxkX21lbW1hcCwKICAqCisgKiBAdWNfc3RhcnQ6IHVuY2FjaGVkIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgYSBjaHVuayBvZiB1bmNhY2hlZCBtZW1vcnkKKyAqIEB1Y19lbmQ6IHVuY2FjaGVkIGVuZGluZyBhZGRyZXNzIG9mIGEgY2h1bmsgb2YgdW5jYWNoZWQgbWVtb3J5CisgKiBAYXJnOiBpZ25vcmVkLCAoTlVMTCBhcmd1bWVudCBwYXNzZWQgaW4gb24gY2FsbCB0byBlZmlfbWVtbWFwX3dhbGtfdWMoKSkKKyAqCiAgKiBDYWxsZWQgYXQgYm9vdCB0aW1lIHRvIGJ1aWxkIGEgbWFwIG9mIHBhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgZm9yCiAgKiBtZW1vcnkgc3BlY2lhbCBvcGVyYXRpb25zLgogICovCi1zdGF0aWMgaW50IF9faW5pdAotdW5jYWNoZWRfYnVpbGRfbWVtbWFwKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IF9faW5pdCB1bmNhY2hlZF9idWlsZF9tZW1tYXAodW5zaWduZWQgbG9uZyB1Y19zdGFydCwKKwkJCQkJdW5zaWduZWQgbG9uZyB1Y19lbmQsIHZvaWQgKmFyZykKIHsKLQlsb25nIGxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCWludCBub2RlOwotCi0JZHByaW50ayhLRVJOX0VSUiAidW5jYWNoZWRfYnVpbGRfbWVtbWFwKCVseCAlbHgpXG4iLCBzdGFydCwgZW5kKTsKKwlpbnQgbmlkID0gcGFkZHJfdG9fbmlkKHVjX3N0YXJ0IC0gX19JQTY0X1VOQ0FDSEVEX09GRlNFVCk7CisJc3RydWN0IGdlbl9wb29sICpwb29sID0gdW5jYWNoZWRfcG9vbFtuaWRdOworCXNpemVfdCBzaXplID0gdWNfZW5kIC0gdWNfc3RhcnQ7CiAKIAl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JbWVtc2V0KChjaGFyICopc3RhcnQsIDAsIGxlbmd0aCk7CiAKLQlub2RlID0gcGFkZHJfdG9fbmlkKHN0YXJ0IC0gX19JQTY0X1VOQ0FDSEVEX09GRlNFVCk7Ci0KLQlmb3IgKDsgc3RhcnQgPCBlbmQgOyBzdGFydCArPSBQQUdFX1NJWkUpIHsKLQkJZHByaW50ayhLRVJOX0lORk8gInN0aWNraW5nICVseCBpbnRvIHRoZSBwb29sIVxuIiwgc3RhcnQpOwotCQlnZW5fcG9vbF9mcmVlKHVuY2FjaGVkX3Bvb2xbbm9kZV0sIHN0YXJ0LCBQQUdFX1NJWkUpOworCWlmIChwb29sICE9IE5VTEwpIHsKKwkJbWVtc2V0KChjaGFyICopdWNfc3RhcnQsIDAsIHNpemUpOworCQkodm9pZCkgZ2VuX3Bvb2xfYWRkKHBvb2wsIHVjX3N0YXJ0LCBzaXplLCBuaWQpOwogCX0KLQogCXJldHVybiAwOwogfQogCiAKLXN0YXRpYyBpbnQgX19pbml0IHVuY2FjaGVkX2luaXQodm9pZCkgewotCWludCBpOworc3RhdGljIGludCBfX2luaXQgdW5jYWNoZWRfaW5pdCh2b2lkKQoreworCWludCBuaWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTU5PREVTOyBpKyspIHsKLQkJaWYgKCFub2RlX29ubGluZShpKSkKLQkJCWNvbnRpbnVlOwotCQl1bmNhY2hlZF9wb29sW2ldID0gZ2VuX3Bvb2xfY3JlYXRlKDAsIElBNjRfR1JBTlVMRV9TSElGVCwKLQkJCQkJCSAgICZ1bmNhY2hlZF9nZXRfbmV3X2NodW5rLCBpKTsKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShuaWQpIHsKKwkJdW5jYWNoZWRfcG9vbFtuaWRdID0gZ2VuX3Bvb2xfY3JlYXRlKFBBR0VfU0hJRlQsIG5pZCk7CiAJfQogCi0JZWZpX21lbW1hcF93YWxrX3VjKHVuY2FjaGVkX2J1aWxkX21lbW1hcCk7Ci0KKwllZmlfbWVtbWFwX3dhbGtfdWModW5jYWNoZWRfYnVpbGRfbWVtbWFwLCBOVUxMKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2luaXQuYyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKaW5kZXggY2FmYTg3Ny4uMTFmMDgwMCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2luaXQuYworKysgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCkBAIC02NzEsOSArNjcxLDExIEBACiAKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYWRkX21lbW9yeSk7CiAKIGludCByZW1vdmVfbWVtb3J5KHU2NCBzdGFydCwgdTY0IHNpemUpCiB7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyZW1vdmVfbWVtb3J5KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L21tL2lvcmVtYXAuYyBiL2FyY2gvaWE2NC9tbS9pb3JlbWFwLmMKaW5kZXggNjQzY2NjNi4uMDdiZDAyYiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2lvcmVtYXAuYworKysgYi9hcmNoL2lhNjQvbW0vaW9yZW1hcC5jCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21lbWluaXQuaD4KIAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKgogX19pb3JlbWFwICh1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBzaXplKQpAQCAtMjEsMTYgKzIyLDI5IEBACiB2b2lkIF9faW9tZW0gKgogaW9yZW1hcCAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlpZiAoZWZpX21lbV9hdHRyaWJ1dGVfcmFuZ2Uob2Zmc2V0LCBzaXplLCBFRklfTUVNT1JZX1dCKSkKLQkJcmV0dXJuIHBoeXNfdG9fdmlydChvZmZzZXQpOworCXU2NCBhdHRyOworCXVuc2lnbmVkIGxvbmcgZ3Jhbl9iYXNlLCBncmFuX3NpemU7CiAKLQlpZiAoZWZpX21lbV9hdHRyaWJ1dGVfcmFuZ2Uob2Zmc2V0LCBzaXplLCBFRklfTUVNT1JZX1VDKSkKKwkvKgorCSAqIEZvciB0aGluZ3MgaW4ga2Vybl9tZW1tYXAsIHdlIG11c3QgdXNlIHRoZSBzYW1lIGF0dHJpYnV0ZQorCSAqIGFzIHRoZSByZXN0IG9mIHRoZSBrZXJuZWwuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUKKwkgKiBEb2N1bWVudGF0aW9uL2lhNjQvYWxpYXNpbmcudHh0LgorCSAqLworCWF0dHIgPSBrZXJuX21lbV9hdHRyaWJ1dGUob2Zmc2V0LCBzaXplKTsKKwlpZiAoYXR0ciAmIEVGSV9NRU1PUllfV0IpCisJCXJldHVybiBwaHlzX3RvX3ZpcnQob2Zmc2V0KTsKKwllbHNlIGlmIChhdHRyICYgRUZJX01FTU9SWV9VQykKIAkJcmV0dXJuIF9faW9yZW1hcChvZmZzZXQsIHNpemUpOwogCiAJLyoKLQkgKiBTb21lZGF5IHRoaXMgc2hvdWxkIGNoZWNrIEFDUEkgcmVzb3VyY2VzIHNvIHdlCi0JICogY2FuIGRvIHRoZSByaWdodCB0aGluZyBmb3IgaG90LXBsdWdnZWQgcmVnaW9ucy4KKwkgKiBTb21lIGNoaXBzZXRzIGRvbid0IHN1cHBvcnQgVUMgYWNjZXNzIHRvIG1lbW9yeS4gIElmCisJICogV0IgaXMgc3VwcG9ydGVkIGZvciB0aGUgd2hvbGUgZ3JhbnVsZSwgd2UgcHJlZmVyIHRoYXQuCiAJICovCisJZ3Jhbl9iYXNlID0gR1JBTlVMRVJPVU5ERE9XTihvZmZzZXQpOworCWdyYW5fc2l6ZSA9IEdSQU5VTEVST1VORFVQKG9mZnNldCArIHNpemUpIC0gZ3Jhbl9iYXNlOworCWlmIChlZmlfbWVtX2F0dHJpYnV0ZShncmFuX2Jhc2UsIGdyYW5fc2l6ZSkgJiBFRklfTUVNT1JZX1dCKQorCQlyZXR1cm4gcGh5c190b192aXJ0KG9mZnNldCk7CisKIAlyZXR1cm4gX19pb3JlbWFwKG9mZnNldCwgc2l6ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKGlvcmVtYXApOwpAQCAtMzgsNiArNTIsOSBAQAogdm9pZCBfX2lvbWVtICoKIGlvcmVtYXBfbm9jYWNoZSAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKKwlpZiAoa2Vybl9tZW1fYXR0cmlidXRlKG9mZnNldCwgc2l6ZSkgJiBFRklfTUVNT1JZX1dCKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiBfX2lvcmVtYXAob2Zmc2V0LCBzaXplKTsKIH0KIEVYUE9SVF9TWU1CT0woaW9yZW1hcF9ub2NhY2hlKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9wY2kvcGNpLmMgYi9hcmNoL2lhNjQvcGNpL3BjaS5jCmluZGV4IGFiODI5YTIuLjc3Mzc1YTUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9wY2kvcGNpLmMKKysrIGIvYXJjaC9pYTY0L3BjaS9wY2kuYwpAQCAtMzUyLDcgKzM1Miw3IEBACiAJcHhtID0gYWNwaV9nZXRfcHhtKGNvbnRyb2xsZXItPmFjcGlfaGFuZGxlKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCWlmIChweG0gPj0gMCkKLQkJY29udHJvbGxlci0+bm9kZSA9IHB4bV90b19uaWRfbWFwW3B4bV07CisJCWNvbnRyb2xsZXItPm5vZGUgPSBweG1fdG9fbm9kZShweG0pOwogI2VuZGlmCiAKIAlhY3BpX3dhbGtfcmVzb3VyY2VzKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQ1JTLCBjb3VudF93aW5kb3csCkBAIC02MDIsOCArNjAyLDYgQEAKIAkgKiBMZWF2ZSB2bV9wZ29mZiBhcy1pcywgdGhlIFBDSSBzcGFjZSBhZGRyZXNzIGlzIHRoZSBwaHlzaWNhbAogCSAqIGFkZHJlc3Mgb24gdGhpcyBwbGF0Zm9ybS4KIAkgKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9SRVNFUlZFRCB8IFZNX0lPKTsKLQogCWlmICh3cml0ZV9jb21iaW5lICYmIGVmaV9yYW5nZV9pc193Yyh2bWEtPnZtX3N0YXJ0LAogCQkJCQkgICAgIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCkpCiAJCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X3dyaXRlY29tYmluZSh2bWEtPnZtX3BhZ2VfcHJvdCk7CkBAIC02NDUsMTggKzY0MywzMCBAQAogaW50CiBwY2lfbW1hcF9sZWdhY3lfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJcGdwcm90X3QgcHJvdDsKIAljaGFyICphZGRyOwogCisJLyoKKwkgKiBBdm9pZCBhdHRyaWJ1dGUgYWxpYXNpbmcuICBTZWUgRG9jdW1lbnRhdGlvbi9pYTY0L2FsaWFzaW5nLnR4dAorCSAqIGZvciBtb3JlIGRldGFpbHMuCisJICovCisJaWYgKCF2YWxpZF9tbWFwX3BoeXNfYWRkcl9yYW5nZSh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQsIHNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcm90ID0gcGh5c19tZW1fYWNjZXNzX3Byb3QoTlVMTCwgdm1hLT52bV9wZ29mZiwgc2l6ZSwKKwkJCQkgICAgdm1hLT52bV9wYWdlX3Byb3QpOworCWlmIChwZ3Byb3RfdmFsKHByb3QpICE9IHBncHJvdF92YWwocGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWFkZHIgPSBwY2lfZ2V0X2xlZ2FjeV9tZW0oYnVzKTsKIAlpZiAoSVNfRVJSKGFkZHIpKQogCQlyZXR1cm4gUFRSX0VSUihhZGRyKTsKIAogCXZtYS0+dm1fcGdvZmYgKz0gKHVuc2lnbmVkIGxvbmcpYWRkciA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7Ci0Jdm1hLT52bV9mbGFncyB8PSAoVk1fU0hNIHwgVk1fUkVTRVJWRUQgfCBWTV9JTyk7CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwcm90OwogCiAJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCi0JCQkgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCQkgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwppbmRleCA1MTAxYWM0Li5kYzA5YTZhIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwpAQCAtNTgsNyArNTgsNyBAQAogICovCiAKIHN0YXRpYyBkbWFfYWRkcl90Ci1zbl9kZWZhdWx0X3BjaV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGxvbmcgcGFkZHIsIHNpemVfdCBzaXplKQorc25fZGVmYXVsdF9wY2lfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBsb25nIHBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IHR5cGUpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC00NTcsMTMgKzQ1Nyw2IEBACiAJCXBjaWRldl9pbmZvLT5wZGlfc25faXJxX2luZm8gPSBOVUxMOwogCQlrZnJlZShzbl9pcnFfaW5mbyk7CiAJfQotCi0JLyoKLQkgKiBNU0kgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgb24gYWx0aXguICBSZW1vdmUgdGhpcyB3aGVuCi0JICogdGhlIE1TSSBhYnN0cmFjdGlvbiBwYXRjaGVzIGFyZSBpbnRlZ3JhdGVkIGludG8gdGhlIGtlcm5lbAotCSAqIChzb21ldGltZSBhZnRlciAyLjYuMTYgcmVsZWFzZXMpCi0JICovCi0JZGV2LT5ub19tc2kgPSAxOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggYzI2NWUwMi4uZGM4ZTJiNiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0yNiwxMSArMjYsMTEgQEAKIAogaW50IHNuX2ZvcmNlX2ludGVycnVwdF9mbGFnID0gMTsKIGV4dGVybiBpbnQgc25faW9pZl9pbml0ZWQ7Ci1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqKnNuX2lycV9saDsKK3N0cnVjdCBsaXN0X2hlYWQgKipzbl9pcnFfbGg7CiBzdGF0aWMgc3BpbmxvY2tfdCBzbl9pcnFfaW5mb19sb2NrID0gU1BJTl9MT0NLX1VOTE9DS0VEOyAvKiBub24tSVJRIGxvY2sgKi8KIAotc3RhdGljIGlubGluZSB1NjQgc25faW50cl9hbGxvYyhuYXNpZF90IGxvY2FsX25hc2lkLCBpbnQgbG9jYWxfd2lkZ2V0LAotCQkJCSAgICAgdTY0IHNuX2lycV9pbmZvLAordTY0IHNuX2ludHJfYWxsb2MobmFzaWRfdCBsb2NhbF9uYXNpZCwgaW50IGxvY2FsX3dpZGdldCwKKwkJCQkgICAgIHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8sCiAJCQkJICAgICBpbnQgcmVxX2lycSwgbmFzaWRfdCByZXFfbmFzaWQsCiAJCQkJICAgICBpbnQgcmVxX3NsaWNlKQogewpAQCAtNDAsMTIgKzQwLDEzIEBACiAKIAlTQUxfQ0FMTF9OT0xPQ0socmV0X3N0dWZmLCAodTY0KSBTTl9TQUxfSU9JRl9JTlRFUlJVUFQsCiAJCQkodTY0KSBTQUxfSU5UUl9BTExPQywgKHU2NCkgbG9jYWxfbmFzaWQsCi0JCQkodTY0KSBsb2NhbF93aWRnZXQsICh1NjQpIHNuX2lycV9pbmZvLCAodTY0KSByZXFfaXJxLAorCQkJKHU2NCkgbG9jYWxfd2lkZ2V0LCBfX3BhKHNuX2lycV9pbmZvKSwgKHU2NCkgcmVxX2lycSwKIAkJCSh1NjQpIHJlcV9uYXNpZCwgKHU2NCkgcmVxX3NsaWNlKTsKKwogCXJldHVybiByZXRfc3R1ZmYuc3RhdHVzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25faW50cl9mcmVlKG5hc2lkX3QgbG9jYWxfbmFzaWQsIGludCBsb2NhbF93aWRnZXQsCit2b2lkIHNuX2ludHJfZnJlZShuYXNpZF90IGxvY2FsX25hc2lkLCBpbnQgbG9jYWxfd2lkZ2V0LAogCQkJCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8pCiB7CiAJc3RydWN0IGlhNjRfc2FsX3JldHZhbCByZXRfc3R1ZmY7CkBAIC0xMTIsNzMgKzExMyw5MSBAQAogCiBzdGF0aWMgdm9pZCBzbl9pcnFfaW5mb19mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCk7CiAKK3N0cnVjdCBzbl9pcnFfaW5mbyAqc25fcmV0YXJnZXRfdmVjdG9yKHN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8sCisJCQkJICAgICAgIG5hc2lkX3QgbmFzaWQsIGludCBzbGljZSkKK3sKKwlpbnQgdmVjdG9yOworCWludCBjcHVwaHlzOworCWludDY0X3QgYnJpZGdlOworCWludCBsb2NhbF93aWRnZXQsIHN0YXR1czsKKwluYXNpZF90IGxvY2FsX25hc2lkOworCXN0cnVjdCBzbl9pcnFfaW5mbyAqbmV3X2lycV9pbmZvOworCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnBjaV9wcm92aWRlcjsKKworCW5ld19pcnFfaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmIChuZXdfaXJxX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1jcHkobmV3X2lycV9pbmZvLCBzbl9pcnFfaW5mbywgc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbykpOworCisJYnJpZGdlID0gKHU2NCkgbmV3X2lycV9pbmZvLT5pcnFfYnJpZGdlOworCWlmICghYnJpZGdlKSB7CisJCWtmcmVlKG5ld19pcnFfaW5mbyk7CisJCXJldHVybiBOVUxMOyAvKiBpcnEgaXMgbm90IGEgZGV2aWNlIGludGVycnVwdCAqLworCX0KKworCWxvY2FsX25hc2lkID0gTkFTSURfR0VUKGJyaWRnZSk7CisKKwlpZiAobG9jYWxfbmFzaWQgJiAxKQorCQlsb2NhbF93aWRnZXQgPSBUSU9fU1dJTl9XSURHRVROVU0oYnJpZGdlKTsKKwllbHNlCisJCWxvY2FsX3dpZGdldCA9IFNXSU5fV0lER0VUTlVNKGJyaWRnZSk7CisKKwl2ZWN0b3IgPSBzbl9pcnFfaW5mby0+aXJxX2lycTsKKwkvKiBGcmVlIHRoZSBvbGQgUFJPTSBuZXdfaXJxX2luZm8gc3RydWN0dXJlICovCisJc25faW50cl9mcmVlKGxvY2FsX25hc2lkLCBsb2NhbF93aWRnZXQsIG5ld19pcnFfaW5mbyk7CisJLyogVXBkYXRlIGtlcm5lbHMgbmV3X2lycV9pbmZvIHdpdGggbmV3IHRhcmdldCBpbmZvICovCisJdW5yZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOworCisJLyogYWxsb2NhdGUgYSBuZXcgUFJPTSBuZXdfaXJxX2luZm8gc3RydWN0ICovCisJc3RhdHVzID0gc25faW50cl9hbGxvYyhsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LAorCQkJICAgICAgIG5ld19pcnFfaW5mbywgdmVjdG9yLAorCQkJICAgICAgIG5hc2lkLCBzbGljZSk7CisKKwkvKiBTQUwgY2FsbCBmYWlsZWQgKi8KKwlpZiAoc3RhdHVzKSB7CisJCWtmcmVlKG5ld19pcnFfaW5mbyk7CisJCXJldHVybiBOVUxMOworCX0KKworCWNwdXBoeXMgPSBuYXNpZF9zbGljZV90b19jcHVpZChuYXNpZCwgc2xpY2UpOworCW5ld19pcnFfaW5mby0+aXJxX2NwdWlkID0gY3B1cGh5czsKKwlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOworCisJcGNpX3Byb3ZpZGVyID0gc25fcGNpX3Byb3ZpZGVyW25ld19pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlXTsKKworCS8qCisJICogSWYgdGhpcyByZXByZXNlbnRzIGEgbGluZSBpbnRlcnJ1cHQsIHRhcmdldCBpdC4gIElmIGl0J3MKKwkgKiBhbiBtc2kgKGlycV9pbnRfYml0IDwgMCksIGl0J3MgYWxyZWFkeSB0YXJnZXRlZC4KKwkgKi8KKwlpZiAobmV3X2lycV9pbmZvLT5pcnFfaW50X2JpdCA+PSAwICYmCisJICAgIHBjaV9wcm92aWRlciAmJiBwY2lfcHJvdmlkZXItPnRhcmdldF9pbnRlcnJ1cHQpCisJCShwY2lfcHJvdmlkZXItPnRhcmdldF9pbnRlcnJ1cHQpKG5ld19pcnFfaW5mbyk7CisKKwlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOworCWxpc3RfcmVwbGFjZV9yY3UoJnNuX2lycV9pbmZvLT5saXN0LCAmbmV3X2lycV9pbmZvLT5saXN0KTsKKwlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7CisJY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOworCisjaWZkZWYgQ09ORklHX1NNUAorCXNldF9pcnFfYWZmaW5pdHlfaW5mbygodmVjdG9yICYgMHhmZiksIGNwdXBoeXMsIDApOworI2VuZGlmCisKKwlyZXR1cm4gbmV3X2lycV9pbmZvOworfQorCiBzdGF0aWMgdm9pZCBzbl9zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8sICpzbl9pcnFfaW5mb19zYWZlOwotCWludCBjcHVpZCwgY3B1cGh5czsKKwluYXNpZF90IG5hc2lkOworCWludCBzbGljZTsKIAotCWNwdWlkID0gZmlyc3RfY3B1KG1hc2spOwotCWNwdXBoeXMgPSBjcHVfcGh5c2ljYWxfaWQoY3B1aWQpOworCW5hc2lkID0gY3B1aWRfdG9fbmFzaWQoZmlyc3RfY3B1KG1hc2spKTsKKwlzbGljZSA9IGNwdWlkX3RvX3NsaWNlKGZpcnN0X2NwdShtYXNrKSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCi0JCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KSB7Ci0JCXU2NCBicmlkZ2U7Ci0JCWludCBsb2NhbF93aWRnZXQsIHN0YXR1czsKLQkJbmFzaWRfdCBsb2NhbF9uYXNpZDsKLQkJc3RydWN0IHNuX2lycV9pbmZvICpuZXdfaXJxX2luZm87Ci0JCXN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnBjaV9wcm92aWRlcjsKLQotCQluZXdfaXJxX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc25faXJxX2luZm8pLCBHRlBfQVRPTUlDKTsKLQkJaWYgKG5ld19pcnFfaW5mbyA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCW1lbWNweShuZXdfaXJxX2luZm8sIHNuX2lycV9pbmZvLCBzaXplb2Yoc3RydWN0IHNuX2lycV9pbmZvKSk7Ci0KLQkJYnJpZGdlID0gKHU2NCkgbmV3X2lycV9pbmZvLT5pcnFfYnJpZGdlOwotCQlpZiAoIWJyaWRnZSkgewotCQkJa2ZyZWUobmV3X2lycV9pbmZvKTsKLQkJCWJyZWFrOyAvKiBpcnEgaXMgbm90IGEgZGV2aWNlIGludGVycnVwdCAqLwotCQl9Ci0KLQkJbG9jYWxfbmFzaWQgPSBOQVNJRF9HRVQoYnJpZGdlKTsKLQotCQlpZiAobG9jYWxfbmFzaWQgJiAxKQotCQkJbG9jYWxfd2lkZ2V0ID0gVElPX1NXSU5fV0lER0VUTlVNKGJyaWRnZSk7Ci0JCWVsc2UKLQkJCWxvY2FsX3dpZGdldCA9IFNXSU5fV0lER0VUTlVNKGJyaWRnZSk7Ci0KLQkJLyogRnJlZSB0aGUgb2xkIFBST00gbmV3X2lycV9pbmZvIHN0cnVjdHVyZSAqLwotCQlzbl9pbnRyX2ZyZWUobG9jYWxfbmFzaWQsIGxvY2FsX3dpZGdldCwgbmV3X2lycV9pbmZvKTsKLQkJLyogVXBkYXRlIGtlcm5lbHMgbmV3X2lycV9pbmZvIHdpdGggbmV3IHRhcmdldCBpbmZvICovCi0JCXVucmVnaXN0ZXJfaW50cl9wZGEobmV3X2lycV9pbmZvKTsKLQotCQkvKiBhbGxvY2F0ZSBhIG5ldyBQUk9NIG5ld19pcnFfaW5mbyBzdHJ1Y3QgKi8KLQkJc3RhdHVzID0gc25faW50cl9hbGxvYyhsb2NhbF9uYXNpZCwgbG9jYWxfd2lkZ2V0LAotCQkJCSAgICAgICBfX3BhKG5ld19pcnFfaW5mbyksIGlycSwKLQkJCQkgICAgICAgY3B1aWRfdG9fbmFzaWQoY3B1aWQpLAotCQkJCSAgICAgICBjcHVpZF90b19zbGljZShjcHVpZCkpOwotCi0JCS8qIFNBTCBjYWxsIGZhaWxlZCAqLwotCQlpZiAoc3RhdHVzKSB7Ci0JCQlrZnJlZShuZXdfaXJxX2luZm8pOwotCQkJYnJlYWs7Ci0JCX0KLQotCQluZXdfaXJxX2luZm8tPmlycV9jcHVpZCA9IGNwdWlkOwotCQlyZWdpc3Rlcl9pbnRyX3BkYShuZXdfaXJxX2luZm8pOwotCi0JCXBjaV9wcm92aWRlciA9IHNuX3BjaV9wcm92aWRlcltuZXdfaXJxX2luZm8tPmlycV9icmlkZ2VfdHlwZV07Ci0JCWlmIChwY2lfcHJvdmlkZXIgJiYgcGNpX3Byb3ZpZGVyLT50YXJnZXRfaW50ZXJydXB0KQotCQkJKHBjaV9wcm92aWRlci0+dGFyZ2V0X2ludGVycnVwdCkobmV3X2lycV9pbmZvKTsKLQotCQlzcGluX2xvY2soJnNuX2lycV9pbmZvX2xvY2spOwotCQlsaXN0X3JlcGxhY2VfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCwgJm5ld19pcnFfaW5mby0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKLQkJY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOwotCi0jaWZkZWYgQ09ORklHX1NNUAotCQlzZXRfaXJxX2FmZmluaXR5X2luZm8oKGlycSAmIDB4ZmYpLCBjcHVwaHlzLCAwKTsKLSNlbmRpZgotCX0KKwkJCQkgc25faXJxX2xoW2lycV0sIGxpc3QpCisJCSh2b2lkKXNuX3JldGFyZ2V0X3ZlY3Rvcihzbl9pcnFfaW5mbywgbmFzaWQsIHNsaWNlKTsKIH0KIAogc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGlycV90eXBlX3NuID0gewpAQCAtMjAyLDYgKzIyMSw5IEBACiAJaW50IGk7CiAJaXJxX2Rlc2NfdCAqYmFzZV9kZXNjID0gaXJxX2Rlc2M7CiAKKwlpYTY0X2ZpcnN0X2RldmljZV92ZWN0b3IgPSBJQTY0X1NOMl9GSVJTVF9ERVZJQ0VfVkVDVE9SOworCWlhNjRfbGFzdF9kZXZpY2VfdmVjdG9yID0gSUE2NF9TTjJfTEFTVF9ERVZJQ0VfVkVDVE9SOworCiAJZm9yIChpID0gMDsgaSA8IE5SX0lSUVM7IGkrKykgewogCQlpZiAoYmFzZV9kZXNjW2ldLmhhbmRsZXIgPT0gJm5vX2lycV90eXBlKSB7CiAJCQliYXNlX2Rlc2NbaV0uaGFuZGxlciA9ICZpcnFfdHlwZV9zbjsKQEAgLTI4NSw2ICszMDcsNyBAQAogCS8qIGxpbmsgaXQgaW50byB0aGUgc25faXJxW2lycV0gbGlzdCAqLwogCXNwaW5fbG9jaygmc25faXJxX2luZm9fbG9jayk7CiAJbGlzdF9hZGRfcmN1KCZzbl9pcnFfaW5mby0+bGlzdCwgc25faXJxX2xoW3NuX2lycV9pbmZvLT5pcnFfaXJxXSk7CisJcmVzZXJ2ZV9pcnFfdmVjdG9yKHNuX2lycV9pbmZvLT5pcnFfaXJxKTsKIAlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7CiAKIAlyZWdpc3Rlcl9pbnRyX3BkYShzbl9pcnFfaW5mbyk7CkBAIC0zMTAsOCArMzMzLDExIEBACiAJc3Bpbl9sb2NrKCZzbl9pcnFfaW5mb19sb2NrKTsKIAlsaXN0X2RlbF9yY3UoJnNuX2lycV9pbmZvLT5saXN0KTsKIAlzcGluX3VubG9jaygmc25faXJxX2luZm9fbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoc25faXJxX2xoW3NuX2lycV9pbmZvLT5pcnFfaXJxXSkpCisJCWZyZWVfaXJxX3ZlY3Rvcihzbl9pcnFfaW5mby0+aXJxX2lycSk7CiAJY2FsbF9yY3UoJnNuX2lycV9pbmZvLT5yY3UsIHNuX2lycV9pbmZvX2ZyZWUpOwogCXBjaV9kZXZfcHV0KHBjaV9kZXYpOworCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zZXR1cC5jCmluZGV4IDMwOTg4ZGYuLjkzNTc3YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL3NldHVwLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCWludCBpOwogCWludCBuaWQ7CiAKLQluaWQgPSBweG1fdG9fbmlkX21hcFtweG1dOworCW5pZCA9IHB4bV90b19ub2RlKHB4bSk7CiAJZm9yIChpID0gMDsgaSA8IG51bV9ub2RlX21lbWJsa3M7IGkrKykgewogCQlpZiAobm9kZV9tZW1ibGtbaV0ubmlkID09IG5pZCkgewogCQkJcmV0dXJuIE5BU0lEX0dFVChub2RlX21lbWJsa1tpXS5zdGFydF9wYWRkcik7CkBAIC03MDQsNyArNzA0LDcgQEAKIAkgKiBjbm9kZSA9PSBub2RlIGZvciBhbGwgQyAmIE0gYnJpY2tzLgogCSAqLwogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJbmFzaWQgPSBweG1fdG9fbmFzaWQobmlkX3RvX3B4bV9tYXBbbm9kZV0pOworCQluYXNpZCA9IHB4bV90b19uYXNpZChub2RlX3RvX3B4bShub2RlKSk7CiAJCXNuX2Nub2RlaWRfdG9fbmFzaWRbbm9kZV0gPSBuYXNpZDsKIAkJcGh5c2ljYWxfbm9kZV9tYXBbbmFzaWRdID0gbm9kZTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9jYWNoZS5jIGIvYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvY2FjaGUuYwppbmRleCBiYzNjZmExLi4yODYyY2IzIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9jYWNoZS5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL2NhY2hlLmMKQEAgLTMsMTEgKzMsMTIgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzLCAyMDA2IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zbi9hcmNoLmg+CiAKIC8qKgogICogc25fZmx1c2hfYWxsX2NhY2hlcyAtIGZsdXNoIGEgcmFuZ2Ugb2YgYWRkcmVzcyBmcm9tIGFsbCBjYWNoZXMgKGluY2wuIEw0KQpAQCAtMTcsMTggKzE4LDI0IEBACiAgKiBGbHVzaCBhIHJhbmdlIG9mIGFkZHJlc3NlcyBmcm9tIGFsbCBjYWNoZXMgaW5jbHVkaW5nIEw0LiAKICAqIEFsbCBhZGRyZXNzZXMgZnVsbHkgb3IgcGFydGlhbGx5IGNvbnRhaW5lZCB3aXRoaW4gCiAgKiBAZmx1c2hfYWRkciB0byBAZmx1c2hfYWRkciArIEBieXRlcyBhcmUgZmx1c2hlZAotICogZnJvbSB0aGUgYWxsIGNhY2hlcy4KKyAqIGZyb20gYWxsIGNhY2hlcy4KICAqLwogdm9pZAogc25fZmx1c2hfYWxsX2NhY2hlcyhsb25nIGZsdXNoX2FkZHIsIGxvbmcgYnl0ZXMpCiB7Ci0JZmx1c2hfaWNhY2hlX3JhbmdlKGZsdXNoX2FkZHIsIGZsdXNoX2FkZHIrYnl0ZXMpOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IGZsdXNoX2FkZHI7CisKKwkvKiBTSHViMSByZXF1aXJlcyBhIGNhY2hlZCBhZGRyZXNzICovCisJaWYgKGlzX3NodWIxKCkgJiYgKGFkZHIgJiBSR05fQklUUykgPT0gUkdOX0JBU0UoUkdOX1VOQ0FDSEVEKSkKKwkJYWRkciA9IChhZGRyIC0gUkdOX0JBU0UoUkdOX1VOQ0FDSEVEKSkgKyBSR05fQkFTRShSR05fS0VSTkVMKTsKKworCWZsdXNoX2ljYWNoZV9yYW5nZShhZGRyLCBhZGRyICsgYnl0ZXMpOwogCS8qCiAJICogVGhlIGxhc3QgY2FsbCBtYXkgaGF2ZSByZXR1cm5lZCBiZWZvcmUgdGhlIGNhY2hlcwogCSAqIHdlcmUgYWN0dWFsbHkgZmx1c2hlZCwgc28gd2UgY2FsbCBpdCBhZ2FpbiB0byBtYWtlCiAJICogc3VyZS4KIAkgKi8KLQlmbHVzaF9pY2FjaGVfcmFuZ2UoZmx1c2hfYWRkciwgZmx1c2hfYWRkcitieXRlcyk7CisJZmx1c2hfaWNhY2hlX3JhbmdlKGFkZHIsIGFkZHIgKyBieXRlcyk7CiAJbWIoKTsKIH0KIEVYUE9SVF9TWU1CT0woc25fZmx1c2hfYWxsX2NhY2hlcyk7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvc24va2VybmVsL3NuMi9zbl9od3BlcmYuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCmluZGV4IDczOWM5NDguLjlhOGEyOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvc24yL3NuX2h3cGVyZi5jCkBAIC01MSw2ICs1MSw4IEBACiBzdGF0aWMgaW50IHNuX2h3cGVyZl9pbml0KHZvaWQpOwogc3RhdGljIERFQ0xBUkVfTVVURVgoc25faHdwZXJmX2luaXRfbXV0ZXgpOwogCisjZGVmaW5lIGNub2RlX3Bvc3NpYmxlKG4pCSgobikgPCBudW1fY25vZGVzKQorCiBzdGF0aWMgaW50IHNuX2h3cGVyZl9lbnVtX29iamVjdHMoaW50ICpub2JqLCBzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICoqcmV0KQogewogCWludCBlOwpAQCAtMTI3LDE0ICsxMjksMTQgQEAKIAkJfQogCX0KIAotCXJldHVybiBub2RlX3Bvc3NpYmxlKGNub2RlKSA/IGNub2RlIDogLTE7CisJcmV0dXJuIGNub2RlX3Bvc3NpYmxlKGNub2RlKSA/IGNub2RlIDogLTE7CiB9CiAKIHN0YXRpYyBpbnQgc25faHdwZXJmX29ial90b19jbm9kZShzdHJ1Y3Qgc25faHdwZXJmX29iamVjdF9pbmZvICogb2JqKQogewogCWlmICghU05fSFdQRVJGX0lTX05PREUob2JqKSAmJiAhU05fSFdQRVJGX0lTX0lPTk9ERShvYmopKQogCQlCVUcoKTsKLQlpZiAoIW9iai0+c25faHdwX3RoaXNfcGFydCkKKwlpZiAoU05fSFdQRVJGX0ZPUkVJR04ob2JqKSkKIAkJcmV0dXJuIC0xOwogCXJldHVybiBzbl9od3BlcmZfZ2VvaWRfdG9fY25vZGUob2JqLT5sb2NhdGlvbik7CiB9CkBAIC0xOTksMTIgKzIwMSwxMiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBzbl9od3BlcmZfaGFzX2NwdXMoY25vZGVpZF90IG5vZGUpCiB7Ci0JcmV0dXJuIG5vZGVfb25saW5lKG5vZGUpICYmIG5yX2NwdXNfbm9kZShub2RlKTsKKwlyZXR1cm4gbm9kZSA8IE1BWF9OVU1OT0RFUyAmJiBub2RlX29ubGluZShub2RlKSAmJiBucl9jcHVzX25vZGUobm9kZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNuX2h3cGVyZl9oYXNfbWVtKGNub2RlaWRfdCBub2RlKQogewotCXJldHVybiBub2RlX29ubGluZShub2RlKSAmJiBOT0RFX0RBVEEobm9kZSktPm5vZGVfcHJlc2VudF9wYWdlczsKKwlyZXR1cm4gbm9kZSA8IE1BWF9OVU1OT0RFUyAmJiBub2RlX29ubGluZShub2RlKSAmJiBOT0RFX0RBVEEobm9kZSktPm5vZGVfcHJlc2VudF9wYWdlczsKIH0KIAogc3RhdGljIHN0cnVjdCBzbl9od3BlcmZfb2JqZWN0X2luZm8gKgpAQCAtMjM3LDcgKzIzOSw3IEBACiAJaW50IGZvdW5kX21lbSA9IDA7CiAJaW50IGZvdW5kX2NwdSA9IDA7CiAKLQlpZiAoIW5vZGVfcG9zc2libGUobm9kZSkpCisJaWYgKCFjbm9kZV9wb3NzaWJsZShub2RlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoc25faHdwZXJmX2hhc19jcHVzKG5vZGUpKSB7CkBAIC00NDIsNyArNDQ0LDcgQEAKIAlzZXFfcHJpbnRmKHMsICIlcyAlZCAlcyAlcyBhc2ljICVzIiwgc2xhYm5hbWUsIG9yZGluYWwsIG9iai0+bG9jYXRpb24sCiAJCW9iai0+c25faHdwX3RoaXNfcGFydCA/ICJsb2NhbCIgOiAic2hhcmVkIiwgb2JqLT5uYW1lKTsKIAotCWlmICghU05fSFdQRVJGX0lTX05PREUob2JqKSAmJiAhU05fSFdQRVJGX0lTX0lPTk9ERShvYmopKQorCWlmIChvcmRpbmFsIDwgMCB8fCAoIVNOX0hXUEVSRl9JU19OT0RFKG9iaikgJiYgIVNOX0hXUEVSRl9JU19JT05PREUob2JqKSkpCiAJCXNlcV9wdXRjKHMsICdcbicpOwogCWVsc2UgewogCQljbm9kZWlkX3QgbmVhcl9tZW0gPSAtMTsKQEAgLTQ2OCwyMiArNDcwLDI0IEBACiAJCS8qCiAJCSAqIENQVXMgb24gdGhpcyBub2RlLCBpZiBhbnkKIAkJICovCi0JCWNwdW1hc2sgPSBub2RlX3RvX2NwdW1hc2sob3JkaW5hbCk7Ci0JCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQkJaWYgKGNwdV9pc3NldChpLCBjcHVtYXNrKSkgewotCQkJCXNsaWNlID0gJ2EnICsgY3B1aWRfdG9fc2xpY2UoaSk7Ci0JCQkJYyA9IGNwdV9kYXRhKGkpOwotCQkJCXNlcV9wcmludGYocywgImNwdSAlZCAlcyVjIGxvY2FsIgotCQkJCQkiIGZyZXEgJWx1TUh6LCBhcmNoIGlhNjQiLAotCQkJCQlpLCBvYmotPmxvY2F0aW9uLCBzbGljZSwKLQkJCQkJYy0+cHJvY19mcmVxIC8gMTAwMDAwMCk7Ci0JCQkJZm9yX2VhY2hfb25saW5lX2NwdShqKSB7Ci0JCQkJCXNlcV9wcmludGYocywgaiA/ICI6JWQiIDogIiwgZGlzdCAlZCIsCi0JCQkJCQlub2RlX2Rpc3RhbmNlKAotCQkJCQkJICAgIGNwdV90b19ub2RlKGkpLAotCQkJCQkJICAgIGNwdV90b19ub2RlKGopKSk7CisJCWlmICghU05fSFdQRVJGX0lTX0lPTk9ERShvYmopKSB7CisJCQljcHVtYXNrID0gbm9kZV90b19jcHVtYXNrKG9yZGluYWwpOworCQkJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCQkJaWYgKGNwdV9pc3NldChpLCBjcHVtYXNrKSkgeworCQkJCQlzbGljZSA9ICdhJyArIGNwdWlkX3RvX3NsaWNlKGkpOworCQkJCQljID0gY3B1X2RhdGEoaSk7CisJCQkJCXNlcV9wcmludGYocywgImNwdSAlZCAlcyVjIGxvY2FsIgorCQkJCQkJIiBmcmVxICVsdU1IeiwgYXJjaCBpYTY0IiwKKwkJCQkJCWksIG9iai0+bG9jYXRpb24sIHNsaWNlLAorCQkJCQkJYy0+cHJvY19mcmVxIC8gMTAwMDAwMCk7CisJCQkJCWZvcl9lYWNoX29ubGluZV9jcHUoaikgeworCQkJCQkJc2VxX3ByaW50ZihzLCBqID8gIjolZCIgOiAiLCBkaXN0ICVkIiwKKwkJCQkJCQlub2RlX2Rpc3RhbmNlKAorCQkJCQkJICAgIAljcHVfdG9fbm9kZShpKSwKKwkJCQkJCSAgICAJY3B1X3RvX25vZGUoaikpKTsKKwkJCQkJfQorCQkJCQlzZXFfcHV0YyhzLCAnXG4nKTsKIAkJCQl9Ci0JCQkJc2VxX3B1dGMocywgJ1xuJyk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MjMsNyArNTI3LDcgQEAKIAkJCWlmIChvYmotPnNuX2h3cF90aGlzX3BhcnQgJiYgcC0+c25faHdwX3RoaXNfcGFydCkKIAkJCQkvKiBib3RoIGVuZHMgbG9jYWwgdG8gdGhpcyBwYXJ0aXRpb24gKi8KIAkJCQlzZXFfcHV0cyhzLCAiIGxvY2FsIik7Ci0JCQllbHNlIGlmICghb2JqLT5zbl9od3BfdGhpc19wYXJ0ICYmICFwLT5zbl9od3BfdGhpc19wYXJ0KQorCQkJZWxzZSBpZiAoU05fSFdQRVJGX0ZPUkVJR04ocCkpCiAJCQkJLyogYm90aCBlbmRzIG9mIHRoZSBsaW5rIGluIGZvcmVpZ24gcGFydGl0b24gKi8KIAkJCQlzZXFfcHV0cyhzLCAiIGZvcmVpZ24iKTsKIAkJCWVsc2UKQEAgLTc3Niw3ICs3ODAsNyBAQAogCiAJY2FzZSBTTl9IV1BFUkZfR0VUX05PREVfTkFTSUQ6CiAJCWlmIChhLnN6ICE9IHNpemVvZih1NjQpIHx8Ci0JCSAgIChub2RlID0gYS5hcmcpIDwgMCB8fCAhbm9kZV9wb3NzaWJsZShub2RlKSkgeworCQkgICAobm9kZSA9IGEuYXJnKSA8IDAgfHwgIWNub2RlX3Bvc3NpYmxlKG5vZGUpKSB7CiAJCQlyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvcGNpX2RtYS5jIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKaW5kZXggYjRiODRjMi4uN2EyOTFhMiAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS9wY2lfZG1hLmMKQEAgLTExLDcgKzExLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vc24vcGNpYnJfcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgogI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KICNpbmNsdWRlIDxhc20vc24vc25fc2FsLmg+CkBAIC0xMTMsNyArMTEzLDggQEAKIAkgKiByZXNvdXJjZXMuCiAJICovCiAKLQkqZG1hX2hhbmRsZSA9IHByb3ZpZGVyLT5kbWFfbWFwX2NvbnNpc3RlbnQocGRldiwgcGh5c19hZGRyLCBzaXplKTsKKwkqZG1hX2hhbmRsZSA9IHByb3ZpZGVyLT5kbWFfbWFwX2NvbnNpc3RlbnQocGRldiwgcGh5c19hZGRyLCBzaXplLAorCQkJCQkJICAgU05fRE1BX0FERFJfUEhZUyk7CiAJaWYgKCEqZG1hX2hhbmRsZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBvdXQgb2YgQVRFc1xuIiwgX19GVU5DVElPTl9fKTsKIAkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljcHVhZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOwpAQCAtMTc2LDcgKzE3Nyw3IEBACiAJQlVHX09OKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpOwogCiAJcGh5c19hZGRyID0gX19wYShjcHVfYWRkcik7Ci0JZG1hX2FkZHIgPSBwcm92aWRlci0+ZG1hX21hcChwZGV2LCBwaHlzX2FkZHIsIHNpemUpOworCWRtYV9hZGRyID0gcHJvdmlkZXItPmRtYV9tYXAocGRldiwgcGh5c19hZGRyLCBzaXplLCBTTl9ETUFfQUREUl9QSFlTKTsKIAlpZiAoIWRtYV9hZGRyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBBVEVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCQlyZXR1cm4gMDsKQEAgLTI2MCw3ICsyNjEsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBuaHdlbnRyaWVzOyBpKyssIHNnKyspIHsKIAkJcGh5c19hZGRyID0gU0dfRU5UX1BIWVNfQUREUkVTUyhzZyk7CiAJCXNnLT5kbWFfYWRkcmVzcyA9IHByb3ZpZGVyLT5kbWFfbWFwKHBkZXYsCi0JCQkJCQkgICAgcGh5c19hZGRyLCBzZy0+bGVuZ3RoKTsKKwkJCQkJCSAgICBwaHlzX2FkZHIsIHNnLT5sZW5ndGgsCisJCQkJCQkgICAgU05fRE1BX0FERFJfUEhZUyk7CiAKIAkJaWYgKCFzZy0+ZG1hX2FkZHJlc3MpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiJXM6IG91dCBvZiBBVEVzXG4iLCBfX0ZVTkNUSU9OX18pOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYyBiL2FyY2gvaWE2NC9zbi9wY2kvcGNpYnIvcGNpYnJfZG1hLmMKaW5kZXggOWY4NmJiNi4uYTg2YzdiOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL3BjaS9wY2lici9wY2licl9kbWEuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3BjaWJyL3BjaWJyX2RtYS5jCkBAIC00MSw3ICs0MSw3IEBACiAKIHN0YXRpYyBkbWFfYWRkcl90CiBwY2licl9kbWFtYXBfYXRlMzIoc3RydWN0IHBjaWRldl9pbmZvICppbmZvLAotCQkgICB1NjQgcGFkZHIsIHNpemVfdCByZXFfc2l6ZSwgdTY0IGZsYWdzKQorCQkgICB1NjQgcGFkZHIsIHNpemVfdCByZXFfc2l6ZSwgdTY0IGZsYWdzLCBpbnQgZG1hX2ZsYWdzKQogewogCiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbyA9IGluZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvOwpAQCAtODEsOSArODEsMTIgQEAKIAlpZiAoSVNfUENJWChwY2lidXNfaW5mbykpCiAJCWF0ZV9mbGFncyAmPSB+KFBDSTMyX0FURV9QUkVGKTsKIAotCXhpb19hZGRyID0KLQkgICAgSVNfUElDX1NPRlQocGNpYnVzX2luZm8pID8gUEhZU19UT19ETUEocGFkZHIpIDoKLQkgICAgUEhZU19UT19USU9ETUEocGFkZHIpOworCWlmIChTTl9ETUFfQUREUlRZUEUoZG1hX2ZsYWdzID09IFNOX0RNQV9BRERSX1BIWVMpKQorCQl4aW9fYWRkciA9IElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSA/IFBIWVNfVE9fRE1BKHBhZGRyKSA6CisJICAgIAkJCQkJICAgICAgUEhZU19UT19USU9ETUEocGFkZHIpOworCWVsc2UKKwkJeGlvX2FkZHIgPSBwYWRkcjsKKwogCW9mZnNldCA9IElPUEdPRkYoeGlvX2FkZHIpOwogCWF0ZSA9IGF0ZV9mbGFncyB8ICh4aW9fYWRkciAtIG9mZnNldCk7CiAKQEAgLTkxLDYgKzk0LDEzIEBACiAJaWYgKElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSkgewogCQlhdGUgfD0gKHBjaWJ1c19pbmZvLT5wYmlfaHViX3hpZCA8PCBQSUNfQVRFX1RBUkdFVElEX1NIRlQpOwogCX0KKworCS8qCisJICogSWYgd2UncmUgbWFwcGluZyBmb3IgTVNJLCBzZXQgdGhlIE1TSSBiaXQgaW4gdGhlIEFURQorCSAqLworCWlmIChkbWFfZmxhZ3MgJiBTTl9ETUFfTVNJKQorCQlhdGUgfD0gUENJMzJfQVRFX01TSTsKKwogCWF0ZV93cml0ZShwY2lidXNfaW5mbywgYXRlX2luZGV4LCBhdGVfY291bnQsIGF0ZSk7CiAKIAkvKgpAQCAtMTA1LDIwICsxMTUsMjcgQEAKIAlpZiAocGNpYnVzX2luZm8tPnBiaV9kZXZyZWdbaW50ZXJuYWxfZGV2aWNlXSAmIFBDSUJSX0RFVl9TV0FQX0RJUikKIAkJQVRFX1NXQVBfT04ocGNpX2FkZHIpOwogCisKIAlyZXR1cm4gcGNpX2FkZHI7CiB9CiAKIHN0YXRpYyBkbWFfYWRkcl90CiBwY2licl9kbWF0cmFuc19kaXJlY3Q2NChzdHJ1Y3QgcGNpZGV2X2luZm8gKiBpbmZvLCB1NjQgcGFkZHIsCi0JCQl1NjQgZG1hX2F0dHJpYnV0ZXMpCisJCQl1NjQgZG1hX2F0dHJpYnV0ZXMsIGludCBkbWFfZmxhZ3MpCiB7CiAJc3RydWN0IHBjaWJ1c19pbmZvICpwY2lidXNfaW5mbyA9IChzdHJ1Y3QgcGNpYnVzX2luZm8gKikKIAkgICAgKChpbmZvLT5wZGlfaG9zdF9wY2lkZXZfaW5mbyktPnBkaV9wY2lidXNfaW5mbyk7CiAJdTY0IHBjaV9hZGRyOwogCiAJLyogVHJhbnNsYXRlIHRvIENyb3NzdGFsayBWaWV3IG9mIFBoeXNpY2FsIEFkZHJlc3MgKi8KLQlwY2lfYWRkciA9IChJU19QSUNfU09GVChwY2lidXNfaW5mbykgPyBQSFlTX1RPX0RNQShwYWRkcikgOgotCQkgICAgUEhZU19UT19USU9ETUEocGFkZHIpKSB8IGRtYV9hdHRyaWJ1dGVzOworCWlmIChTTl9ETUFfQUREUlRZUEUoZG1hX2ZsYWdzKSA9PSBTTl9ETUFfQUREUl9QSFlTKQorCQlwY2lfYWRkciA9IElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSA/CisJCQkJUEhZU19UT19ETUEocGFkZHIpIDoKKwkJICAgIAkJUEhZU19UT19USU9ETUEocGFkZHIpIHwgZG1hX2F0dHJpYnV0ZXM7CisJZWxzZQorCQlwY2lfYWRkciA9IElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSA/CisJCQkJcGFkZHIgOgorCQkJCXBhZGRyIHwgZG1hX2F0dHJpYnV0ZXM7CiAKIAkvKiBIYW5kbGUgQnVzIG1vZGUgKi8KIAlpZiAoSVNfUENJWChwY2lidXNfaW5mbykpCkBAIC0xMzAsNyArMTQ3LDkgQEAKIAkJICAgICgodTY0KSBwY2lidXNfaW5mby0+CiAJCSAgICAgcGJpX2h1Yl94aWQgPDwgUElDX1BDSTY0X0FUVFJfVEFSR19TSEZUKTsKIAl9IGVsc2UKLQkJcGNpX2FkZHIgfD0gVElPQ1BfUENJNjRfQ01EVFlQRV9NRU07CisJCXBjaV9hZGRyIHw9IChkbWFfZmxhZ3MgJiBTTl9ETUFfTVNJKSA/CisJCQkJVElPQ1BfUENJNjRfQ01EVFlQRV9NU0kgOgorCQkJCVRJT0NQX1BDSTY0X0NNRFRZUEVfTUVNOwogCiAJLyogSWYgUENJIG1vZGUsIGZ1bmMgemVybyB1c2VzIFZDSEFOMCwgZXZlcnkgb3RoZXIgZnVuYyB1c2VzIFZDSEFOMSAqLwogCWlmICghSVNfUENJWChwY2lidXNfaW5mbykgJiYgUENJX0ZVTkMoaW5mby0+cGRpX2xpbnV4X3BjaWRldi0+ZGV2Zm4pKQpAQCAtMTQxLDcgKzE2MCw3IEBACiAKIHN0YXRpYyBkbWFfYWRkcl90CiBwY2licl9kbWF0cmFuc19kaXJlY3QzMihzdHJ1Y3QgcGNpZGV2X2luZm8gKiBpbmZvLAotCQkJdTY0IHBhZGRyLCBzaXplX3QgcmVxX3NpemUsIHU2NCBmbGFncykKKwkJCXU2NCBwYWRkciwgc2l6ZV90IHJlcV9zaXplLCB1NjQgZmxhZ3MsIGludCBkbWFfZmxhZ3MpCiB7CiAJc3RydWN0IHBjaWRldl9pbmZvICpwY2lkZXZfaW5mbyA9IGluZm8tPnBkaV9ob3N0X3BjaWRldl9pbmZvOwogCXN0cnVjdCBwY2lidXNfaW5mbyAqcGNpYnVzX2luZm8gPSAoc3RydWN0IHBjaWJ1c19pbmZvICopcGNpZGV2X2luZm8tPgpAQCAtMTU2LDggKzE3NSwxNCBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQl4aW9fYWRkciA9IElTX1BJQ19TT0ZUKHBjaWJ1c19pbmZvKSA/IFBIWVNfVE9fRE1BKHBhZGRyKSA6Ci0JICAgIFBIWVNfVE9fVElPRE1BKHBhZGRyKTsKKwlpZiAoZG1hX2ZsYWdzICYgU05fRE1BX01TSSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoU05fRE1BX0FERFJUWVBFKGRtYV9mbGFncykgPT0gU05fRE1BX0FERFJfUEhZUykKKwkJeGlvX2FkZHIgPSBJU19QSUNfU09GVChwY2lidXNfaW5mbykgPyBQSFlTX1RPX0RNQShwYWRkcikgOgorCSAgICAJCQkJCSAgICAgIFBIWVNfVE9fVElPRE1BKHBhZGRyKTsKKwllbHNlCisJCXhpb19hZGRyID0gcGFkZHI7CiAKIAl4aW9fYmFzZSA9IHBjaWJ1c19pbmZvLT5wYmlfZGlyX3hiYXNlOwogCW9mZnNldCA9IHhpb19hZGRyIC0geGlvX2Jhc2U7CkBAIC0zMjcsNyArMzUyLDcgQEAKICAqLwogCiBkbWFfYWRkcl90Ci1wY2licl9kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICogaHdkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCBzaXplX3Qgc2l6ZSkKK3BjaWJyX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKiBod2RldiwgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZG1hX2ZsYWdzKQogewogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8oaHdkZXYpOwpAQCAtMzQ0LDExICszNjksMTEgQEAKIAkJICovCiAKIAkJZG1hX2hhbmRsZSA9IHBjaWJyX2RtYXRyYW5zX2RpcmVjdDY0KHBjaWRldl9pbmZvLCBwaHlzX2FkZHIsCi0JCQkJCQkgICAgIFBDSTY0X0FUVFJfUFJFRik7CisJCQkJCQkgICAgIFBDSTY0X0FUVFJfUFJFRiwgZG1hX2ZsYWdzKTsKIAl9IGVsc2UgewogCQkvKiBIYW5kbGUgMzItNjMgYml0IGNhcmRzIHZpYSBkaXJlY3QgbWFwcGluZyAqLwogCQlkbWFfaGFuZGxlID0gcGNpYnJfZG1hdHJhbnNfZGlyZWN0MzIocGNpZGV2X2luZm8sIHBoeXNfYWRkciwKLQkJCQkJCSAgICAgc2l6ZSwgMCk7CisJCQkJCQkgICAgIHNpemUsIDAsIGRtYV9mbGFncyk7CiAJCWlmICghZG1hX2hhbmRsZSkgewogCQkJLyoKIAkJCSAqIEl0IGlzIGEgMzIgYml0IGNhcmQgYW5kIHdlIGNhbm5vdCBkbyBkaXJlY3QgbWFwcGluZywKQEAgLTM1Niw3ICszODEsOCBAQAogCQkJICovCiAKIAkJCWRtYV9oYW5kbGUgPSBwY2licl9kbWFtYXBfYXRlMzIocGNpZGV2X2luZm8sIHBoeXNfYWRkciwKLQkJCQkJCQlzaXplLCBQQ0kzMl9BVEVfUFJFRik7CisJCQkJCQkJc2l6ZSwgUENJMzJfQVRFX1BSRUYsCisJCQkJCQkJZG1hX2ZsYWdzKTsKIAkJfQogCX0KIApAQCAtMzY1LDE4ICszOTEsMTggQEAKIAogZG1hX2FkZHJfdAogcGNpYnJfZG1hX21hcF9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICogaHdkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCQkJIHNpemVfdCBzaXplKQorCQkJIHNpemVfdCBzaXplLCBpbnQgZG1hX2ZsYWdzKQogewogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlzdHJ1Y3QgcGNpZGV2X2luZm8gKnBjaWRldl9pbmZvID0gU05fUENJREVWX0lORk8oaHdkZXYpOwogCiAJaWYgKGh3ZGV2LT5kZXYuY29oZXJlbnRfZG1hX21hc2sgPT0gfjBVTCkgewogCQlkbWFfaGFuZGxlID0gcGNpYnJfZG1hdHJhbnNfZGlyZWN0NjQocGNpZGV2X2luZm8sIHBoeXNfYWRkciwKLQkJCQkJICAgIFBDSTY0X0FUVFJfQkFSKTsKKwkJCQkJICAgIFBDSTY0X0FUVFJfQkFSLCBkbWFfZmxhZ3MpOwogCX0gZWxzZSB7CiAJCWRtYV9oYW5kbGUgPSAoZG1hX2FkZHJfdCkgcGNpYnJfZG1hbWFwX2F0ZTMyKHBjaWRldl9pbmZvLAogCQkJCQkJICAgIHBoeXNfYWRkciwgc2l6ZSwKLQkJCQkJCSAgICBQQ0kzMl9BVEVfQkFSKTsKKwkJCQkJCSAgICBQQ0kzMl9BVEVfQkFSLCBkbWFfZmxhZ3MpOwogCX0KIAogCXJldHVybiBkbWFfaGFuZGxlOwpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jYV9wcm92aWRlci5jCmluZGV4IGJlMDE3NjkuLjIwZGU3MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2FfcHJvdmlkZXIuYworKysgYi9hcmNoL2lhNjQvc24vcGNpL3Rpb2NhX3Byb3ZpZGVyLmMKQEAgLTUxNSwxMSArNTE1LDE3IEBACiAgKiB1c2UgdGhlIEdBUlQgbWFwcGVkIG1vZGUuCiAgKi8KIHN0YXRpYyB1NjQKLXRpb2NhX2RtYV9tYXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBwYWRkciwgc2l6ZV90IGJ5dGVfY291bnQpCit0aW9jYV9kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LCBpbnQgZG1hX2ZsYWdzKQogewogCXU2NCBtYXBhZGRyOwogCiAJLyoKKwkgKiBOb3Qgc3VwcG9ydGVkIGZvciBub3cgLi4uCisJICovCisJaWYgKGRtYV9mbGFncyAmIFNOX0RNQV9NU0kpCisJCXJldHVybiAwOworCisJLyoKIAkgKiBJZiBjYXJkIGlzIDY0IG9yIDQ4IGJpdCBhZGRyZXNhYmxlLCB1c2UgYSBkaXJlY3QgbWFwcGluZy4gIDMyCiAJICogYml0IGRpcmVjdCBpcyBzbyByZXN0cmljdGl2ZSB3LnIudC4gd2hlcmUgdGhlIG1lbW9yeSByZXNpZGVzIHRoYXQKIAkgKiB3ZSBkb24ndCB1c2UgaXQgZXZlbiB0aG91Z2ggQ0EgaGFzIHNvbWUgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYyBiL2FyY2gvaWE2NC9zbi9wY2kvdGlvY2VfcHJvdmlkZXIuYwppbmRleCA4MzMyOTU2Li4yZDc5NDg1IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24vcGNpL3Rpb2NlX3Byb3ZpZGVyLmMKKysrIGIvYXJjaC9pYTY0L3NuL3BjaS90aW9jZV9wcm92aWRlci5jCkBAIC0zLDcgKzMsNyBAQAogICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQogICogZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAqLwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KQEAgLTE3MCw3ICsxNzAsOCBAQAogCShBVEVfUEFHRSgoc3RhcnQpKyhsZW4pLTEsIHBhZ2VzaXplKSAtIEFURV9QQUdFKHN0YXJ0LCBwYWdlc2l6ZSkgKyAxKQogCiAjZGVmaW5lIEFURV9WQUxJRChhdGUpCSgoYXRlKSAmICgxVUwgPDwgNjMpKQotI2RlZmluZSBBVEVfTUFLRShhZGRyLCBwcykgKCgoYWRkcikgJiB+QVRFX1BBR0VNQVNLKHBzKSkgfCAoMVVMIDw8IDYzKSkKKyNkZWZpbmUgQVRFX01BS0UoYWRkciwgcHMsIG1zaSkgXAorCSgoKGFkZHIpICYgfkFURV9QQUdFTUFTSyhwcykpIHwgKDFVTCA8PCA2MykgfCAoKG1zaSk/KDFVTCA8PCA2Mik6MCkpCiAKIC8qCiAgKiBGbGF2b3JzIG9mIGF0ZS1iYXNlZCBtYXBwaW5nIHN1cHBvcnRlZCBieSB0aW9jZV9hbGxvY19tYXAoKQpAQCAtMTk2LDE1ICsxOTcsMTcgQEAKICAqCiAgKiA2MyAgICAtIG11c3QgYmUgMSB0byBpbmRpY2F0ZSBkNjQgbW9kZSB0byBDRSBoYXJkd2FyZQogICogNjIgICAgLSBiYXJyaWVyIGJpdCAuLi4gY29udHJvbGxlZCB3aXRoIHRpb2NlX2RtYV9iYXJyaWVyKCkKLSAqIDYxICAgIC0gMCBzaW5jZSB0aGlzIGlzIG5vdCBhbiBNU0kgdHJhbnNhY3Rpb24KKyAqIDYxICAgIC0gbXNpIGJpdCAuLi4gc3BlY2lmaWVkIHRocm91Z2ggZG1hX2ZsYWdzCiAgKiA2MDo1NCAtIHJlc2VydmVkLCBNQloKICAqLwogc3RhdGljIHU2NAotdGlvY2VfZG1hX2Q2NCh1bnNpZ25lZCBsb25nIGN0X2FkZHIpCit0aW9jZV9kbWFfZDY0KHVuc2lnbmVkIGxvbmcgY3RfYWRkciwgaW50IGRtYV9mbGFncykKIHsKIAl1NjQgYnVzX2FkZHI7CiAKIAlidXNfYWRkciA9IGN0X2FkZHIgfCAoMVVMIDw8IDYzKTsKKwlpZiAoZG1hX2ZsYWdzICYgU05fRE1BX01TSSkKKwkJYnVzX2FkZHIgfD0gKDFVTCA8PCA2MSk7CiAKIAlyZXR1cm4gYnVzX2FkZHI7CiB9CkBAIC0yNjEsNyArMjY0LDcgQEAKICAqLwogc3RhdGljIHU2NAogdGlvY2VfYWxsb2NfbWFwKHN0cnVjdCB0aW9jZV9rZXJuZWwgKmNlX2tlcm4sIGludCB0eXBlLCBpbnQgcG9ydCwKLQkJdTY0IGN0X2FkZHIsIGludCBsZW4pCisJCXU2NCBjdF9hZGRyLCBpbnQgbGVuLCBpbnQgZG1hX2ZsYWdzKQogewogCWludCBpOwogCWludCBqOwpAQCAtMjcwLDYgKzI3Myw3IEBACiAJaW50IGVudHJpZXM7CiAJaW50IG5hdGVzOwogCXU2NCBwYWdlc2l6ZTsKKwlpbnQgbXNpX2NhcGFibGUsIG1zaV93YW50ZWQ7CiAJdTY0ICphdGVfc2hhZG93OwogCXU2NCAqYXRlX3JlZzsKIAl1NjQgYWRkcjsKQEAgLTI5MSw2ICsyOTUsNyBAQAogCQlhdGVfcmVnID0gY2VfbW1yLT5jZV91cmVfYXRlMzI0MDsKIAkJcGFnZXNpemUgPSBjZV9rZXJuLT5jZV9hdGUzMjQwX3BhZ2VzaXplOwogCQlidXNfYmFzZSA9IFRJT0NFX00zMl9NSU47CisJCW1zaV9jYXBhYmxlID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBUSU9DRV9BVEVfTTQwOgogCQlmaXJzdCA9IDA7CkBAIC0yOTksNiArMzA0LDcgQEAKIAkJYXRlX3JlZyA9IGNlX21tci0+Y2VfdXJlX2F0ZTQwOwogCQlwYWdlc2l6ZSA9IE1CKDY0KTsKIAkJYnVzX2Jhc2UgPSBUSU9DRV9NNDBfTUlOOworCQltc2lfY2FwYWJsZSA9IDA7CiAJCWJyZWFrOwogCWNhc2UgVElPQ0VfQVRFX000MFM6CiAJCS8qCkBAIC0zMTEsMTEgKzMxNywxNiBAQAogCQlhdGVfcmVnID0gY2VfbW1yLT5jZV91cmVfYXRlMzI0MDsKIAkJcGFnZXNpemUgPSBHQigxNik7CiAJCWJ1c19iYXNlID0gVElPQ0VfTTQwU19NSU47CisJCW1zaV9jYXBhYmxlID0gMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIDA7CiAJfQogCisJbXNpX3dhbnRlZCA9IGRtYV9mbGFncyAmIFNOX0RNQV9NU0k7CisJaWYgKG1zaV93YW50ZWQgJiYgIW1zaV9jYXBhYmxlKQorCQlyZXR1cm4gMDsKKwogCW5hdGVzID0gQVRFX05QQUdFUyhjdF9hZGRyLCBsZW4sIHBhZ2VzaXplKTsKIAlpZiAobmF0ZXMgPiBlbnRyaWVzKQogCQlyZXR1cm4gMDsKQEAgLTM0NCw3ICszNTUsNyBAQAogCWZvciAoaiA9IDA7IGogPCBuYXRlczsgaisrKSB7CiAJCXU2NCBhdGU7CiAKLQkJYXRlID0gQVRFX01BS0UoYWRkciwgcGFnZXNpemUpOworCQlhdGUgPSBBVEVfTUFLRShhZGRyLCBwYWdlc2l6ZSwgbXNpX3dhbnRlZCk7CiAJCWF0ZV9zaGFkb3dbaSArIGpdID0gYXRlOwogCQl0aW9jZV9tbXJfc3RvcmVpKGNlX2tlcm4sICZhdGVfcmVnW2kgKyBqXSwgYXRlKTsKIAkJYWRkciArPSBwYWdlc2l6ZTsKQEAgLTM3MSw3ICszODIsNyBAQAogICogTWFwIEBwYWRkciBpbnRvIDMyLWJpdCBidXMgc3BhY2Ugb2YgdGhlIENFIGFzc29jaWF0ZWQgd2l0aCBAcGNpZGV2X2luZm8uCiAgKi8KIHN0YXRpYyB1NjQKLXRpb2NlX2RtYV9kMzIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU2NCBjdF9hZGRyKQordGlvY2VfZG1hX2QzMihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IGN0X2FkZHIsIGludCBkbWFfZmxhZ3MpCiB7CiAJaW50IGRtYV9vazsKIAlpbnQgcG9ydDsKQEAgLTM4MSw2ICszOTIsOSBAQAogCXU2NCBjdF9sb3dlcjsKIAlkbWFfYWRkcl90IGJ1c19hZGRyOwogCisJaWYgKGRtYV9mbGFncyAmIFNOX0RNQV9NU0kpCisJCXJldHVybiAwOworCiAJY3RfdXBwZXIgPSBjdF9hZGRyICYgfjB4M2ZmZmZmZmZVTDsKIAljdF9sb3dlciA9IGN0X2FkZHIgJiAweDNmZmZmZmZmVUw7CiAKQEAgLTUwNyw3ICs1MjEsNyBAQAogICovCiBzdGF0aWMgdTY0CiB0aW9jZV9kb19kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LAotCQkgaW50IGJhcnJpZXIpCisJCSBpbnQgYmFycmllciwgaW50IGRtYV9mbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCBjdF9hZGRyOwpAQCAtNTIzLDE1ICs1MzcsMTggQEAKIAlpZiAoZG1hX21hc2sgPCAweDdmZmZmZmZmVUwpCiAJCXJldHVybiAwOwogCi0JY3RfYWRkciA9IFBIWVNfVE9fVElPRE1BKHBhZGRyKTsKKwlpZiAoU05fRE1BX0FERFJUWVBFKGRtYV9mbGFncykgPT0gU05fRE1BX0FERFJfUEhZUykKKwkJY3RfYWRkciA9IFBIWVNfVE9fVElPRE1BKHBhZGRyKTsKKwllbHNlCisJCWN0X2FkZHIgPSBwYWRkcjsKIAogCS8qCiAJICogSWYgdGhlIGRldmljZSBjYW4gZ2VuZXJhdGUgNjQgYml0IGFkZHJlc3NlcywgY3JlYXRlIGEgRDY0IG1hcC4KLQkgKiBTaW5jZSB0aGlzIHNob3VsZCBuZXZlciBmYWlsLCBieXBhc3MgdGhlIHJlc3Qgb2YgdGhlIGNoZWNrcy4KIAkgKi8KIAlpZiAoZG1hX21hc2sgPT0gfjBVTCkgewotCQltYXBhZGRyID0gdGlvY2VfZG1hX2Q2NChjdF9hZGRyKTsKLQkJZ290byBkbWFfbWFwX2RvbmU7CisJCW1hcGFkZHIgPSB0aW9jZV9kbWFfZDY0KGN0X2FkZHIsIGRtYV9mbGFncyk7CisJCWlmIChtYXBhZGRyKQorCQkJZ290byBkbWFfbWFwX2RvbmU7CiAJfQogCiAJcGNpZGV2X3RvX3Rpb2NlKHBkZXYsIE5VTEwsICZjZV9rZXJuLCAmcG9ydCk7CkBAIC01NzQsMTggKzU5MSwyMiBAQAogCiAJCWlmIChieXRlX2NvdW50ID4gTUIoNjQpKSB7CiAJCQltYXBhZGRyID0gdGlvY2VfYWxsb2NfbWFwKGNlX2tlcm4sIFRJT0NFX0FURV9NNDBTLAotCQkJCQkJICBwb3J0LCBjdF9hZGRyLCBieXRlX2NvdW50KTsKKwkJCQkJCSAgcG9ydCwgY3RfYWRkciwgYnl0ZV9jb3VudCwKKwkJCQkJCSAgZG1hX2ZsYWdzKTsKIAkJCWlmICghbWFwYWRkcikKIAkJCQltYXBhZGRyID0KIAkJCQkgICAgdGlvY2VfYWxsb2NfbWFwKGNlX2tlcm4sIFRJT0NFX0FURV9NNDAsIC0xLAotCQkJCQkJICAgIGN0X2FkZHIsIGJ5dGVfY291bnQpOworCQkJCQkJICAgIGN0X2FkZHIsIGJ5dGVfY291bnQsCisJCQkJCQkgICAgZG1hX2ZsYWdzKTsKIAkJfSBlbHNlIHsKIAkJCW1hcGFkZHIgPSB0aW9jZV9hbGxvY19tYXAoY2Vfa2VybiwgVElPQ0VfQVRFX000MCwgLTEsCi0JCQkJCQkgIGN0X2FkZHIsIGJ5dGVfY291bnQpOworCQkJCQkJICBjdF9hZGRyLCBieXRlX2NvdW50LAorCQkJCQkJICBkbWFfZmxhZ3MpOwogCQkJaWYgKCFtYXBhZGRyKQogCQkJCW1hcGFkZHIgPQogCQkJCSAgICB0aW9jZV9hbGxvY19tYXAoY2Vfa2VybiwgVElPQ0VfQVRFX000MFMsCi0JCQkJCQkgICAgcG9ydCwgY3RfYWRkciwgYnl0ZV9jb3VudCk7CisJCQkJCQkgICAgcG9ydCwgY3RfYWRkciwgYnl0ZV9jb3VudCwKKwkJCQkJCSAgICBkbWFfZmxhZ3MpOwogCQl9CiAJfQogCkBAIC01OTMsNyArNjE0LDcgQEAKIAkgKiAzMi1iaXQgZGlyZWN0IGlzIHRoZSBuZXh0IG1vZGUgdG8gdHJ5CiAJICovCiAJaWYgKCFtYXBhZGRyICYmIGRtYV9tYXNrID49IDB4ZmZmZmZmZmZVTCkKLQkJbWFwYWRkciA9IHRpb2NlX2RtYV9kMzIocGRldiwgY3RfYWRkcik7CisJCW1hcGFkZHIgPSB0aW9jZV9kbWFfZDMyKHBkZXYsIGN0X2FkZHIsIGRtYV9mbGFncyk7CiAKIAkvKgogCSAqIExhc3QgcmVzb3J0LCB0cnkgMzItYml0IEFURS1iYXNlZCBtYXAuCkBAIC02MDEsNyArNjIyLDcgQEAKIAlpZiAoIW1hcGFkZHIpCiAJCW1hcGFkZHIgPQogCQkgICAgdGlvY2VfYWxsb2NfbWFwKGNlX2tlcm4sIFRJT0NFX0FURV9NMzIsIC0xLCBjdF9hZGRyLAotCQkJCSAgICBieXRlX2NvdW50KTsKKwkJCQkgICAgYnl0ZV9jb3VudCwgZG1hX2ZsYWdzKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNlX2tlcm4tPmNlX2xvY2ssIGZsYWdzKTsKIApAQCAtNjIyLDkgKzY0Myw5IEBACiAgKiBpbiB0aGUgYWRkcmVzcy4KICAqLwogc3RhdGljIHU2NAotdGlvY2VfZG1hKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50KQordGlvY2VfZG1hKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LCBpbnQgZG1hX2ZsYWdzKQogewotCXJldHVybiB0aW9jZV9kb19kbWFfbWFwKHBkZXYsIHBhZGRyLCBieXRlX2NvdW50LCAwKTsKKwlyZXR1cm4gdGlvY2VfZG9fZG1hX21hcChwZGV2LCBwYWRkciwgYnl0ZV9jb3VudCwgMCwgZG1hX2ZsYWdzKTsKIH0KIAogLyoqCkBAIC02MzYsOSArNjU3LDkgQEAKICAqIFNpbXBseSBjYWxsIHRpb2NlX2RvX2RtYV9tYXAoKSB0byBjcmVhdGUgYSBtYXAgd2l0aCB0aGUgYmFycmllciBiaXQgc2V0CiAgKiBpbiB0aGUgYWRkcmVzcy4KICAqLyBzdGF0aWMgdTY0Ci10aW9jZV9kbWFfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTY0IHBhZGRyLCBzaXplX3QgYnl0ZV9jb3VudCkKK3Rpb2NlX2RtYV9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1NjQgcGFkZHIsIHNpemVfdCBieXRlX2NvdW50LCBpbnQgZG1hX2ZsYWdzKQogewotCXJldHVybiB0aW9jZV9kb19kbWFfbWFwKHBkZXYsIHBhZGRyLCBieXRlX2NvdW50LCAxKTsKKwlyZXR1cm4gdGlvY2VfZG9fZG1hX21hcChwZGV2LCBwYWRkciwgYnl0ZV9jb3VudCwgMSwgZG1hX2ZsYWdzKTsKIH0KIAogLyoqCkBAIC02OTYsNyArNzE3LDcgQEAKIAl3aGlsZSAoYXRlX2luZGV4IDw9IGxhc3RfYXRlKSB7CiAJCXU2NCBhdGU7CiAKLQkJYXRlID0gQVRFX01BS0UoMHhkZWFkYmVlZiwgcHMpOworCQlhdGUgPSBBVEVfTUFLRSgweGRlYWRiZWVmLCBwcywgMCk7CiAJCWNlX2tlcm4tPmNlX2F0ZTMyNDBfc2hhZG93W2F0ZV9pbmRleF0gPSBhdGU7CiAJCXRpb2NlX21tcl9zdG9yZWkoY2Vfa2VybiwgJmNlX21tci0+Y2VfdXJlX2F0ZTMyNDBbYXRlX2luZGV4XSwKIAkJCQkgYXRlKTsKQEAgLTEwMDIsNyArMTAyMyw3IEBACiAJdGlvY2VfbW1yX3NldGkodGlvY2Vfa2VybiwgJnRpb2NlX21tci0+Y2VfYWRtX2ludF9zdGF0dXNfYWxpYXMsIH4wVUxMKTsKIAl0aW9jZV9tbXJfc2V0aSh0aW9jZV9rZXJuLCAmdGlvY2VfbW1yLT5jZV9hZG1fZXJyb3Jfc3VtbWFyeV9hbGlhcywKIAkJICAgICAgIH4wVUxMKTsKLQl0aW9jZV9tbXJfc2V0aSh0aW9jZV9rZXJuLCAmdGlvY2VfbW1yLT5jZV9kcmVfY29tcF9lcnJfYWRkciwgfjBVTEwpOworCXRpb2NlX21tcl9zZXRpKHRpb2NlX2tlcm4sICZ0aW9jZV9tbXItPmNlX2RyZV9jb21wX2Vycl9hZGRyLCAwVUxMKTsKIAogCWlmIChyZXF1ZXN0X2lycShTR0lfUENJQVNJQ19FUlJPUiwKIAkJCXRpb2NlX2Vycm9yX2ludHJfaGFuZGxlciwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9hbWlnYV9rc3ltcy5jIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKaW5kZXggYjdiZDg0Yy4uOGYyZTA1OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2FtaWdhX2tzeW1zLmMKQEAgLTIzLDggKzIzLDYgQEAKIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9zaXplKTsKIEVYUE9SVF9TWU1CT0woYW1pZ2FfYXVkaW9fcGVyaW9kKTsKIEVYUE9SVF9TWU1CT0woYW1pZ2FfYXVkaW9fbWluX3BlcmlvZCk7Ci1FWFBPUlRfU1lNQk9MKGFtaWdhX2RvX2lycSk7Ci1FWFBPUlRfU1lNQk9MKGFtaWdhX2RvX2lycV9saXN0KTsKIAogI2lmZGVmIENPTkZJR19BTUlHQV9QQ01DSUEKICAgRVhQT1JUX1NZTUJPTChwY21jaWFfcmVzZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYyBiL2FyY2gvbTY4ay9hbWlnYS9hbWlpbnRzLmMKaW5kZXggYjBhYTYxYi4uZjk0MDNmNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2FtaWludHMuYworKysgYi9hcmNoL202OGsvYW1pZ2EvYW1paW50cy5jCkBAIC0zNSw2MCArMzUsMjkgQEAKICAqICAgICAgICAgICAvSmVzCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAKLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgogI2luY2x1ZGUgPGFzbS9hbWlwY21jaWEuaD4KIAotZXh0ZXJuIGludCBjaWFfcmVxdWVzdF9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsaW50IGlycSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGNpYV9mcmVlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGNpYV9pbml0X0lSUShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSk7Ci1leHRlcm4gaW50IGNpYV9nZXRfaXJxX2xpc3Qoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHN0cnVjdCBzZXFfZmlsZSAqcCk7CitzdGF0aWMgdm9pZCBhbWlnYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOworc3RhdGljIHZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDEoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IGFtaV9pbnQzKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKK3N0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgYW1pX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwogCi0vKiBpcnEgbm9kZSB2YXJpYWJsZXMgZm9yIGFtaWdhIGludGVycnVwdCBzb3VyY2VzICovCi1zdGF0aWMgaXJxX25vZGVfdCAqYW1pX2lycV9saXN0W0FNSV9TVERfSVJRU107Ci0KLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBhbWlnYV9pbnRlbmFfdmFsc1tBTUlfU1REX0lSUVNdID0gewotCVtJUlFfQU1JR0FfVkVSVEJdCT0gSUZfVkVSVEIsCi0JW0lSUV9BTUlHQV9DT1BQRVJdCT0gSUZfQ09QRVIsCi0JW0lSUV9BTUlHQV9BVUQwXQk9IElGX0FVRDAsCi0JW0lSUV9BTUlHQV9BVUQxXQk9IElGX0FVRDEsCi0JW0lSUV9BTUlHQV9BVUQyXQk9IElGX0FVRDIsCi0JW0lSUV9BTUlHQV9BVUQzXQk9IElGX0FVRDMsCi0JW0lSUV9BTUlHQV9CTElUXQk9IElGX0JMSVQsCi0JW0lSUV9BTUlHQV9EU0tTWU5dCT0gSUZfRFNLU1lOLAotCVtJUlFfQU1JR0FfRFNLQkxLXQk9IElGX0RTS0JMSywKLQlbSVJRX0FNSUdBX1JCRl0JCT0gSUZfUkJGLAotCVtJUlFfQU1JR0FfVEJFXQkJPSBJRl9UQkUsCi0JW0lSUV9BTUlHQV9TT0ZUXQk9IElGX1NPRlQsCi0JW0lSUV9BTUlHQV9QT1JUU10JPSBJRl9QT1JUUywKLQlbSVJRX0FNSUdBX0VYVEVSXQk9IElGX0VYVEVSCitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGFtaWdhX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJhbWlnYSIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gYW1pZ2FfZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IGFtaWdhX2Rpc2FibGVfaXJxLAogfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFtaV9zZXJ2ZXJzW0FNSV9TVERfSVJRU10gPSB7Ci0JW0lSUV9BTUlHQV9WRVJUQl0JPSAxLAotCVtJUlFfQU1JR0FfUE9SVFNdCT0gMSwKLQlbSVJRX0FNSUdBX0VYVEVSXQk9IDEKLX07Ci0KLXN0YXRpYyBzaG9ydCBhbWlfYWJsZWNvdW50W0FNSV9JUlFTXTsKLQotc3RhdGljIGlycXJldHVybl90IGFtaV9iYWRpbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JbnVtX3NwdXJpb3VzICs9IDE7Ci0JcmV0dXJuIElSUV9OT05FOwotfQogCiAvKgogICogdm9pZCBhbWlnYV9pbml0X0lSUSh2b2lkKQpAQCAtMTAzLDIzICs3MiwxMiBAQAogCiB2b2lkIF9faW5pdCBhbWlnYV9pbml0X0lSUSh2b2lkKQogewotCWludCBpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzEsIGFtaV9pbnQxLCAwLCAiaW50MSIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzMsIGFtaV9pbnQzLCAwLCAiaW50MyIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIGFtaV9pbnQ0LCAwLCAiaW50NCIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIGFtaV9pbnQ1LCAwLCAiaW50NSIsIE5VTEwpOwogCi0JLyogaW5pdGlhbGl6ZSBoYW5kbGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBBTUlfU1REX0lSUVM7IGkrKykgewotCQlpZiAoYW1pX3NlcnZlcnNbaV0pIHsKLQkJCWFtaV9pcnFfbGlzdFtpXSA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlhbWlfaXJxX2xpc3RbaV0gPSBuZXdfaXJxX25vZGUoKTsKLQkJCWFtaV9pcnFfbGlzdFtpXS0+aGFuZGxlciA9IGFtaV9iYWRpbnQ7Ci0JCQlhbWlfaXJxX2xpc3RbaV0tPmZsYWdzICAgPSAwOwotCQkJYW1pX2lycV9saXN0W2ldLT5kZXZfaWQgID0gTlVMTDsKLQkJCWFtaV9pcnFfbGlzdFtpXS0+ZGV2bmFtZSA9IE5VTEw7Ci0JCQlhbWlfaXJxX2xpc3RbaV0tPm5leHQgICAgPSBOVUxMOwotCQl9Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBBTUlfSVJRUzsgaSsrKQotCQlhbWlfYWJsZWNvdW50W2ldID0gMDsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZhbWlnYV9pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsIEFNSV9TVERfSVJRUyk7CiAKIAkvKiB0dXJuIG9mZiBQQ01DSUEgaW50ZXJydXB0cyAqLwogCWlmIChBTUlHQUhXX1BSRVNFTlQoUENNQ0lBKSkKQEAgLTEzNCwyNDkgKzkyLDIxIEBACiAJY2lhX2luaXRfSVJRKCZjaWFiX2Jhc2UpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBhbWlnYV9pbnNlcnRfaXJxKGlycV9ub2RlX3QgKipsaXN0LCBpcnFfbm9kZV90ICpub2RlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqY3VyOwotCi0JaWYgKCFub2RlLT5kZXZfaWQpCi0JCXByaW50aygiJXM6IFdhcm5pbmc6IGRldl9pZCBvZiAlcyBpcyB6ZXJvXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBub2RlLT5kZXZuYW1lKTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWN1ciA9ICpsaXN0OwotCi0JaWYgKG5vZGUtPmZsYWdzICYgU0FfSU5URVJSVVBUKSB7Ci0JCWlmIChub2RlLT5mbGFncyAmIFNBX1NISVJRKQotCQkJcmV0dXJuIC1FQlVTWTsKLQkJLyoKLQkJICogVGhlcmUgc2hvdWxkIG5ldmVyIGJlIG1vcmUgdGhhbiBvbmUKLQkJICovCi0JCXdoaWxlIChjdXIgJiYgY3VyLT5mbGFncyAmIFNBX0lOVEVSUlVQVCkgewotCQkJbGlzdCA9ICZjdXItPm5leHQ7Ci0JCQljdXIgPSBjdXItPm5leHQ7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoY3VyKSB7Ci0JCQlsaXN0ID0gJmN1ci0+bmV4dDsKLQkJCWN1ciA9IGN1ci0+bmV4dDsKLQkJfQotCX0KLQotCW5vZGUtPm5leHQgPSBjdXI7Ci0JKmxpc3QgPSBub2RlOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYW1pZ2FfZGVsZXRlX2lycShpcnFfbm9kZV90ICoqbGlzdCwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWZvciAobm9kZSA9ICpsaXN0OyBub2RlOyBsaXN0ID0gJm5vZGUtPm5leHQsIG5vZGUgPSAqbGlzdCkgewotCQlpZiAobm9kZS0+ZGV2X2lkID09IGRldl9pZCkgewotCQkJKmxpc3QgPSBub2RlLT5uZXh0OwotCQkJLyogTWFyayBpdCBhcyBmcmVlLiAqLwotCQkJbm9kZS0+aGFuZGxlciA9IE5VTEw7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXByaW50ayAoIiVzOiB0cmllZCB0byByZW1vdmUgaW52YWxpZCBpcnFcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLS8qCi0gKiBhbWlnYV9yZXF1ZXN0X2lycSA6IGFkZCBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZvciBhIHBhcnRpY3VsYXIKLSAqICAgICAgICAgICAgICAgICAgICAgbWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlLgotICogICAgICAgICAgICAgICAgICAgICBJZiB0aGUgYWRkaXRpb24gd2FzIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgMC4KLSAqLwotCi1pbnQgYW1pZ2FfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJICAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlycV9ub2RlX3QgKm5vZGU7Ci0JaW50IGVycm9yID0gMDsKLQotCWlmIChpcnEgPj0gQU1JX0lSUVMpIHsKLQkJcHJpbnRrICgiJXM6IFVua25vd24gSVJRICVkIGZyb20gJXNcbiIsIF9fRlVOQ1RJT05fXywKLQkJCWlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQVVUTykKLQkJcmV0dXJuIGNwdV9yZXF1ZXN0X2lycShpcnEgLSBJUlFfQU1JR0FfQVVUTywgaGFuZGxlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgZGV2bmFtZSwgZGV2X2lkKTsKLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUIpCi0JCXJldHVybiBjaWFfcmVxdWVzdF9pcnEoJmNpYWJfYmFzZSwgaXJxIC0gSVJRX0FNSUdBX0NJQUIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0KLQlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFBKQotCQlyZXR1cm4gY2lhX3JlcXVlc3RfaXJxKCZjaWFhX2Jhc2UsIGlycSAtIElSUV9BTUlHQV9DSUFBLAotCQkgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIsIGZsYWdzLCBkZXZuYW1lLCBkZXZfaWQpOwotCi0JLyoKLQkgKiBJUlFfQU1JR0FfUE9SVFMgJiBJUlFfQU1JR0FfRVhURVIgZGVmYXVsdHMgdG8gc2hhcmVkLAotCSAqIHdlIGNvdWxkIGFkZCBhIGNoZWNrIGhlcmUgZm9yIHRoZSBTQV9TSElSUSBmbGFnIGJ1dCBhbGwgZHJpdmVycwotCSAqIHNob3VsZCBiZSBhd2FyZSBvZiBzaGFyaW5nIGFueXdheS4KLQkgKi8KLQlpZiAoYW1pX3NlcnZlcnNbaXJxXSkgewotCQlpZiAoIShub2RlID0gbmV3X2lycV9ub2RlKCkpKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW5vZGUtPmhhbmRsZXIgPSBoYW5kbGVyOwotCQlub2RlLT5mbGFncyAgID0gZmxhZ3M7Ci0JCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JCW5vZGUtPmRldm5hbWUgPSBkZXZuYW1lOwotCQlub2RlLT5uZXh0ICAgID0gTlVMTDsKLQkJZXJyb3IgPSBhbWlnYV9pbnNlcnRfaXJxKCZhbWlfaXJxX2xpc3RbaXJxXSwgbm9kZSk7Ci0JfSBlbHNlIHsKLQkJYW1pX2lycV9saXN0W2lycV0tPmhhbmRsZXIgPSBoYW5kbGVyOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZmxhZ3MgICA9IGZsYWdzOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICA9IGRldl9pZDsKLQkJYW1pX2lycV9saXN0W2lycV0tPmRldm5hbWUgPSBkZXZuYW1lOwotCX0KLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JaWYgKGlycSA8IElSUV9BTUlHQV9QT1JUUyAmJiAhYW1pX2FibGVjb3VudFtpcnFdKQotCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKLQotCXJldHVybiBlcnJvcjsKLX0KLQotdm9pZCBhbWlnYV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA+PSBBTUlfSVJRUykgewotCQlwcmludGsgKCIlczogVW5rbm93biBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0FVVE8pCi0JCWNwdV9mcmVlX2lycShpcnEgLSBJUlFfQU1JR0FfQVVUTywgZGV2X2lkKTsKLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUIpIHsKLQkJY2lhX2ZyZWVfaXJxKCZjaWFiX2Jhc2UsIGlycSAtIElSUV9BTUlHQV9DSUFCLCBkZXZfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQSkgewotCQljaWFfZnJlZV9pcnEoJmNpYWFfYmFzZSwgaXJxIC0gSVJRX0FNSUdBX0NJQUEsIGRldl9pZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoYW1pX3NlcnZlcnNbaXJxXSkgewotCQlhbWlnYV9kZWxldGVfaXJxKCZhbWlfaXJxX2xpc3RbaXJxXSwgZGV2X2lkKTsKLQkJLyogaWYgc2VydmVyIGxpc3QgZW1wdHksIGRpc2FibGUgdGhlIGludGVycnVwdCAqLwotCQlpZiAoIWFtaV9pcnFfbGlzdFtpcnFdICYmIGlycSA8IElSUV9BTUlHQV9QT1JUUykKLQkJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBhbWlnYV9pbnRlbmFfdmFsc1tpcnFdOwotCX0gZWxzZSB7Ci0JCWlmIChhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICE9IGRldl9pZCkKLQkJCXByaW50aygiJXM6IHJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2bmFtZSk7Ci0JCWFtaV9pcnFfbGlzdFtpcnFdLT5oYW5kbGVyID0gYW1pX2JhZGludDsKLQkJYW1pX2lycV9saXN0W2lycV0tPmZsYWdzICAgPSAwOwotCQlhbWlfaXJxX2xpc3RbaXJxXS0+ZGV2X2lkICA9IE5VTEw7Ci0JCWFtaV9pcnFfbGlzdFtpcnFdLT5kZXZuYW1lID0gTlVMTDsKLQkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07Ci0JfQotfQotCiAvKgogICogRW5hYmxlL2Rpc2FibGUgYSBwYXJ0aWN1bGFyIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KICAqIE5vdGUgdGhhdCB0aGlzIG1heSBhZmZlY3Qgb3RoZXIgaW50ZXJydXB0cyBpbiBjYXNlIG9mIGEgc2hhcmVkIGludGVycnVwdC4KICAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBhIF92ZXJ5XyBzaG9ydCB0aW1lIHRvIGNoYW5nZSBzb21lCiAgKiBpbnRlcm5hbCBkYXRhLCB0aGF0IG1heSBub3QgYmUgY2hhbmdlZCBieSB0aGUgaW50ZXJydXB0IGF0IHRoZSBzYW1lIHRpbWUuCi0gKiBhbWlfKGVuYWJsZXxkaXNhYmxlKV9pcnEgY2FsbHMgbWF5IGFsc28gYmUgbmVzdGVkLgogICovCiAKLXZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgYW1pZ2FfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCWlmIChpcnEgPj0gQU1JX0lSUVMpIHsKLQkJcHJpbnRrKCIlczogVW5rbm93biBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICgtLWFtaV9hYmxlY291bnRbaXJxXSkKLQkJcmV0dXJuOwotCi0JLyogTm8gYWN0aW9uIGZvciBhdXRvLXZlY3RvciBpbnRlcnJ1cHRzICovCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQVVUTyl7Ci0JCXByaW50aygiJXM6IFRyeWluZyB0byBlbmFibGUgYXV0by12ZWN0b3IgSVJRICVpXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEgLSBJUlFfQU1JR0FfQVVUTyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaXJxID49IElSUV9BTUlHQV9DSUFCKSB7Ci0JCWNpYV9zZXRfaXJxKCZjaWFiX2Jhc2UsICgxIDw8IChpcnEgLSBJUlFfQU1JR0FfQ0lBQikpKTsKLQkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIENJQV9JQ1JfU0VUQ0xSIHwKLQkJICAgICAgICAgICAgICgxIDw8IChpcnEgLSBJUlFfQU1JR0FfQ0lBQikpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUEpIHsKLQkJY2lhX3NldF9pcnEoJmNpYWFfYmFzZSwgKDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSkpOwotCQljaWFfYWJsZV9pcnEoJmNpYWFfYmFzZSwgQ0lBX0lDUl9TRVRDTFIgfAotCQkgICAgICAgICAgICAgKDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSkpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogZW5hYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgKDEgPDwgKGlycSAtIElSUV9VU0VSKSk7CiB9CiAKLXZvaWQgYW1pZ2FfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3N0YXRpYyB2b2lkIGFtaWdhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaWYgKGlycSA+PSBBTUlfSVJRUykgewotCQlwcmludGsoIiVzOiBVbmtub3duIElSUSAlZFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFtaV9hYmxlY291bnRbaXJxXSsrKQotCQlyZXR1cm47Ci0KLQkvKiBObyBhY3Rpb24gZm9yIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KLQlpZiAoaXJxID49IElSUV9BTUlHQV9BVVRPKSB7Ci0JCXByaW50aygiJXM6IFRyeWluZyB0byBkaXNhYmxlIGF1dG8tdmVjdG9yIElSUSAlaVxuIiwKLQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxIC0gSVJRX0FNSUdBX0FVVE8pOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikgewotCQljaWFfYWJsZV9pcnEoJmNpYWJfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUIpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnEgPj0gSVJRX0FNSUdBX0NJQUEpIHsKLQkJY2lhX2FibGVfaXJxKCZjaWFhX2Jhc2UsIDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBkaXNhYmxlIHRoZSBpbnRlcnJ1cHQgKi8KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gYW1pZ2FfaW50ZW5hX3ZhbHNbaXJxXTsKLX0KLQotaW5saW5lIHZvaWQgYW1pZ2FfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0rKzsKLQlhbWlfaXJxX2xpc3RbaXJxXS0+aGFuZGxlcihpcnEsIGFtaV9pcnFfbGlzdFtpcnFdLT5kZXZfaWQsIGZwKTsKLX0KLQotdm9pZCBhbWlnYV9kb19pcnFfbGlzdChpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwotCi0JYW1pZ2FfY3VzdG9tLmludHJlcSA9IGFtaWdhX2ludGVuYV92YWxzW2lycV07Ci0KLQlmb3IgKG5vZGUgPSBhbWlfaXJxX2xpc3RbaXJxXTsgbm9kZTsgbm9kZSA9IG5vZGUtPm5leHQpCi0JCW5vZGUtPmhhbmRsZXIoaXJxLCBub2RlLT5kZXZfaWQsIGZwKTsKKwlhbWlnYV9jdXN0b20uaW50ZW5hID0gMSA8PCAoaXJxIC0gSVJRX1VTRVIpOwogfQogCiAvKgpAQCAtMzkwLDE5ICsxMjAsMTkgQEAKIAkvKiBpZiBzZXJpYWwgdHJhbnNtaXQgYnVmZmVyIGVtcHR5LCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX1RCRSkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfVEJFOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX1RCRSwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1RCRSwgZnApOwogCX0KIAogCS8qIGlmIGZsb3BweSBkaXNrIHRyYW5zZmVyIGNvbXBsZXRlLCBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0RTS0JMSykgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfRFNLQkxLOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0RTS0JMSywgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0RTS0JMSywgZnApOwogCX0KIAogCS8qIGlmIHNvZnR3YXJlIGludGVycnVwdCBzZXQsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfU09GVCkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfU09GVDsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9TT0ZULCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfU09GVCwgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00MTQsMTggKzE0NCwyMCBAQAogCS8qIGlmIGEgYmxpdHRlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0JMSVQpIHsKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0JMSVQ7Ci0JCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQkxJVCwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0JMSVQsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGNvcHBlciBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0NPUEVSKSB7CiAJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9DT1BFUjsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9DT1BQRVIsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9DT1BQRVIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIHZlcnRpY2FsIGJsYW5rIGludGVycnVwdCAqLwotCWlmIChpbnRzICYgSUZfVkVSVEIpCi0JCWFtaWdhX2RvX2lycV9saXN0KElSUV9BTUlHQV9WRVJUQiwgZnApOworCWlmIChpbnRzICYgSUZfVkVSVEIpIHsKKwkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1ZFUlRCOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX1ZFUlRCLCBmcCk7CisJfQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNDM2LDI1ICsxNjgsMjUgQEAKIAkvKiBpZiBhdWRpbyAwIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMCkgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMDsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQwLCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMCwgZnApOwogCX0KIAogCS8qIGlmIGF1ZGlvIDEgaW50ZXJydXB0ICovCiAJaWYgKGludHMgJiBJRl9BVUQxKSB7CiAJCWFtaWdhX2N1c3RvbS5pbnRyZXEgPSBJRl9BVUQxOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0FVRDEsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9BVUQxLCBmcCk7CiAJfQogCiAJLyogaWYgYXVkaW8gMiBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0FVRDIpIHsKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX0FVRDI7Ci0JCWFtaWdhX2RvX2lycShJUlFfQU1JR0FfQVVEMiwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0FVRDIsIGZwKTsKIAl9CiAKIAkvKiBpZiBhdWRpbyAzIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfQVVEMykgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfQVVEMzsKLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9BVUQzLCBmcCk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfQU1JR0FfQVVEMywgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC00NjYsNTUgKzE5OCwxMyBAQAogCS8qIGlmIHNlcmlhbCByZWNlaXZlIGJ1ZmZlciBmdWxsIGludGVycnVwdCAqLwogCWlmIChpbnRzICYgSUZfUkJGKSB7CiAJCS8qIGFja25vd2xlZGdlIG9mIElGX1JCRiBtdXN0IGJlIGRvbmUgYnkgdGhlIHNlcmlhbCBpbnRlcnJ1cHQgKi8KLQkJYW1pZ2FfZG9faXJxKElSUV9BTUlHQV9SQkYsIGZwKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9BTUlHQV9SQkYsIGZwKTsKIAl9CiAKIAkvKiBpZiBhIGRpc2sgc3luYyBpbnRlcnJ1cHQgKi8KIAlpZiAoaW50cyAmIElGX0RTS1NZTikgewogCQlhbWlnYV9jdXN0b20uaW50cmVxID0gSUZfRFNLU1lOOwotCQlhbWlnYV9kb19pcnEoSVJRX0FNSUdBX0RTS1NZTiwgZnApOworCQltNjhrX2hhbmRsZV9pbnQoSVJRX0FNSUdBX0RTS1NZTiwgZnApOwogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhbWlfaW50NyhpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlwYW5pYyAoImxldmVsIDcgaW50ZXJydXB0IHJlY2VpdmVkXG4iKTsKLX0KLQotaXJxcmV0dXJuX3QgKCphbWlnYV9kZWZhdWx0X2hhbmRsZXJbU1lTX0lSUVNdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikgPSB7Ci0JWzBdID0gYW1pX2JhZGludCwKLQlbMV0gPSBhbWlfaW50MSwKLQlbMl0gPSBhbWlfYmFkaW50LAotCVszXSA9IGFtaV9pbnQzLAotCVs0XSA9IGFtaV9pbnQ0LAotCVs1XSA9IGFtaV9pbnQ1LAotCVs2XSA9IGFtaV9iYWRpbnQsCi0JWzddID0gYW1pX2ludDcKLX07Ci0KLWludCBzaG93X2FtaWdhX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCWludCBpOwotCWlycV9ub2RlX3QgKm5vZGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQU1JX1NURF9JUlFTOyBpKyspIHsKLQkJaWYgKCEobm9kZSA9IGFtaV9pcnFfbGlzdFtpXSkpCi0JCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihwLCAiYW1pICAlMmQ6ICUxMHUgIiwgaSwKLQkJICAgICAgICAgICAgICAga3N0YXRfY3B1KDApLmlycXNbU1lTX0lSUVMgKyBpXSk7Ci0JCWRvIHsKLQkJCWlmIChub2RlLT5mbGFncyAmIFNBX0lOVEVSUlVQVCkKLQkJCQlzZXFfcHV0cyhwLCAiRiAiKTsKLQkJCWVsc2UKLQkJCQlzZXFfcHV0cyhwLCAiICAiKTsKLQkJCXNlcV9wcmludGYocCwgIiVzXG4iLCBub2RlLT5kZXZuYW1lKTsKLQkJCWlmICgobm9kZSA9IG5vZGUtPm5leHQpKQotCQkJCXNlcV9wdXRzKHAsICIgICAgICAgICAgICAgICAgICAgICIpOwotCQl9IHdoaWxlIChub2RlKTsKLQl9Ci0KLQljaWFfZ2V0X2lycV9saXN0KCZjaWFhX2Jhc2UsIHApOwotCWNpYV9nZXRfaXJxX2xpc3QoJmNpYWJfYmFzZSwgcCk7Ci0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYW1pZ2EvY2lhLmMgYi9hcmNoL202OGsvYW1pZ2EvY2lhLmMKaW5kZXggOTQ3NmViOS4uMDk1NmU0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2FtaWdhL2NpYS5jCisrKyBiL2FyY2gvbTY4ay9hbWlnYS9jaWEuYwpAQCAtMjksMjEgKzI5LDE4IEBACiAJdW5zaWduZWQgc2hvcnQgaW50X21hc2s7CiAJaW50IGhhbmRsZXJfaXJxLCBjaWFfaXJxLCBzZXJ2ZXJfaXJxOwogCWNoYXIgKm5hbWU7Ci0JaXJxX2hhbmRsZXJfdCBpcnFfbGlzdFtDSUFfSVJRU107CiB9IGNpYWFfYmFzZSA9IHsKIAkuY2lhCQk9ICZjaWFhLAogCS5pbnRfbWFzawk9IElGX1BPUlRTLAotCS5oYW5kbGVyX2lycQk9IElSUV9BTUlHQV9BVVRPXzIsCisJLmhhbmRsZXJfaXJxCT0gSVJRX0FNSUdBX1BPUlRTLAogCS5jaWFfaXJxCT0gSVJRX0FNSUdBX0NJQUEsCi0JLnNlcnZlcl9pcnEJPSBJUlFfQU1JR0FfUE9SVFMsCi0JLm5hbWUJCT0gIkNJQUEgaGFuZGxlciIKKwkubmFtZQkJPSAiQ0lBQSIKIH0sIGNpYWJfYmFzZSA9IHsKIAkuY2lhCQk9ICZjaWFiLAogCS5pbnRfbWFzawk9IElGX0VYVEVSLAotCS5oYW5kbGVyX2lycQk9IElSUV9BTUlHQV9BVVRPXzYsCisJLmhhbmRsZXJfaXJxCT0gSVJRX0FNSUdBX0VYVEVSLAogCS5jaWFfaXJxCT0gSVJRX0FNSUdBX0NJQUIsCi0JLnNlcnZlcl9pcnEJPSBJUlFfQU1JR0FfRVhURVIsCi0JLm5hbWUJCT0gIkNJQUIgaGFuZGxlciIKKwkubmFtZQkJPSAiQ0lBQiIKIH07CiAKIC8qCkBAIC02NiwxMyArNjMsMTEgQEAKIAogLyoKICAqICBFbmFibGUgb3IgZGlzYWJsZSBDSUEgaW50ZXJydXB0cywgcmV0dXJuIG9sZCBpbnRlcnJ1cHQgbWFzaywKLSAqICBpbnRlcnJ1cHRzIHdpbGwgb25seSBiZSBlbmFibGVkIGlmIGEgaGFuZGxlciBleGlzdHMKICAqLwogCiB1bnNpZ25lZCBjaGFyIGNpYV9hYmxlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgY2hhciBtYXNrKQogewotCXVuc2lnbmVkIGNoYXIgb2xkLCB0bXA7Ci0JaW50IGk7CisJdW5zaWduZWQgY2hhciBvbGQ7CiAKIAlvbGQgPSBiYXNlLT5pY3JfbWFzazsKIAliYXNlLT5pY3JfZGF0YSB8PSBiYXNlLT5jaWEtPmljcjsKQEAgLTgyLDk5ICs3NywxMDQgQEAKIAllbHNlCiAJCWJhc2UtPmljcl9tYXNrICY9IH5tYXNrOwogCWJhc2UtPmljcl9tYXNrICY9IENJQV9JQ1JfQUxMOwotCWZvciAoaSA9IDAsIHRtcCA9IDE7IGkgPCBDSUFfSVJRUzsgaSsrLCB0bXAgPDw9IDEpIHsKLQkJaWYgKCh0bXAgJiBiYXNlLT5pY3JfbWFzaykgJiYgIWJhc2UtPmlycV9saXN0W2ldLmhhbmRsZXIpIHsKLQkJCWJhc2UtPmljcl9tYXNrICY9IH50bXA7Ci0JCQliYXNlLT5jaWEtPmljciA9IHRtcDsKLQkJfQotCX0KIAlpZiAoYmFzZS0+aWNyX2RhdGEgJiBiYXNlLT5pY3JfbWFzaykKIAkJYW1pZ2FfY3VzdG9tLmludHJlcSA9IElGX1NFVENMUiB8IGJhc2UtPmludF9tYXNrOwogCXJldHVybiBvbGQ7CiB9CiAKLWludCBjaWFfcmVxdWVzdF9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHVuc2lnbmVkIGludCBpcnEsCi0gICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0JdW5zaWduZWQgY2hhciBtYXNrOwotCi0JYmFzZS0+aXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQliYXNlLT5pcnFfbGlzdFtpcnFdLmZsYWdzICAgPSBmbGFnczsKLQliYXNlLT5pcnFfbGlzdFtpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JYmFzZS0+aXJxX2xpc3RbaXJxXS5kZXZuYW1lID0gZGV2bmFtZTsKLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0ICovCi0JbWFzayA9IDEgPDwgaXJxOwotCWNpYV9zZXRfaXJxKGJhc2UsIG1hc2spOwotCWNpYV9hYmxlX2lycShiYXNlLCBDSUFfSUNSX1NFVENMUiB8IG1hc2spOwotCXJldHVybiAwOwotfQotCi12b2lkIGNpYV9mcmVlX2lycShzdHJ1Y3QgY2lhYmFzZSAqYmFzZSwgdW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChiYXNlLT5pcnFfbGlzdFtpcnFdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IHJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlaSBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBiYXNlLT5jaWFfaXJxICsgaXJxLAotCQkgICAgICAgYmFzZS0+aXJxX2xpc3RbaXJxXS5kZXZuYW1lKTsKLQotCWJhc2UtPmlycV9saXN0W2lycV0uaGFuZGxlciA9IE5VTEw7Ci0JYmFzZS0+aXJxX2xpc3RbaXJxXS5mbGFncyAgID0gMDsKLQotCWNpYV9hYmxlX2lycShiYXNlLCAxIDw8IGlycSk7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBjaWFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKIHsKIAlzdHJ1Y3QgY2lhYmFzZSAqYmFzZSA9IChzdHJ1Y3QgY2lhYmFzZSAqKWRldl9pZDsKLQlpbnQgbWFjaF9pcnEsIGk7CisJaW50IG1hY2hfaXJxOwogCXVuc2lnbmVkIGNoYXIgaW50czsKIAogCW1hY2hfaXJxID0gYmFzZS0+Y2lhX2lycTsKLQlpcnEgPSBTWVNfSVJRUyArIG1hY2hfaXJxOwogCWludHMgPSBjaWFfc2V0X2lycShiYXNlLCBDSUFfSUNSX0FMTCk7CiAJYW1pZ2FfY3VzdG9tLmludHJlcSA9IGJhc2UtPmludF9tYXNrOwotCWZvciAoaSA9IDA7IGkgPCBDSUFfSVJRUzsgaSsrLCBpcnErKywgbWFjaF9pcnErKykgewotCQlpZiAoaW50cyAmIDEpIHsKLQkJCWtzdGF0X2NwdSgwKS5pcnFzW2lycV0rKzsKLQkJCWJhc2UtPmlycV9saXN0W2ldLmhhbmRsZXIobWFjaF9pcnEsIGJhc2UtPmlycV9saXN0W2ldLmRldl9pZCwgZnApOwotCQl9Ci0JCWludHMgPj49IDE7CisJZm9yICg7IGludHM7IG1hY2hfaXJxKyssIGludHMgPj49IDEpIHsKKwkJaWYgKGludHMgJiAxKQorCQkJbTY4a19oYW5kbGVfaW50KG1hY2hfaXJxLCBmcCk7CiAJfQotCWFtaWdhX2RvX2lycV9saXN0KGJhc2UtPnNlcnZlcl9pcnEsIGZwKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNpYV9lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJdW5zaWduZWQgY2hhciBtYXNrOworCisJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikgeworCQltYXNrID0gMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUIpOworCQljaWFfc2V0X2lycSgmY2lhYl9iYXNlLCBtYXNrKTsKKwkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIENJQV9JQ1JfU0VUQ0xSIHwgbWFzayk7CisJfSBlbHNlIHsKKwkJbWFzayA9IDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFBKTsKKwkJY2lhX3NldF9pcnEoJmNpYWFfYmFzZSwgbWFzayk7CisJCWNpYV9hYmxlX2lycSgmY2lhYV9iYXNlLCBDSUFfSUNSX1NFVENMUiB8IG1hc2spOworCX0KK30KKworc3RhdGljIHZvaWQgY2lhX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKGlycSA+PSBJUlFfQU1JR0FfQ0lBQikKKwkJY2lhX2FibGVfaXJxKCZjaWFiX2Jhc2UsIDEgPDwgKGlycSAtIElSUV9BTUlHQV9DSUFCKSk7CisJZWxzZQorCQljaWFfYWJsZV9pcnEoJmNpYWFfYmFzZSwgMSA8PCAoaXJxIC0gSVJRX0FNSUdBX0NJQUEpKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBjaWFfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gImNpYSIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gY2lhX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBjaWFfZGlzYWJsZV9pcnEsCit9OworCisvKgorICogT3ZlcnJpZGUgYXV0byBpcnEgMiAmIDYgYW5kIHVzZSB0aGVtIGFzIGdlbmVyYWwgY2hhaW4KKyAqIGZvciBleHRlcm5hbCBpbnRlcnJ1cHRzLCB3ZSBsaW5rIHRoZSBDSUEgaW50ZXJydXB0IHNvdXJjZXMKKyAqIGludG8gdGhpcyBjaGFpbi4KKyAqLworCitzdGF0aWMgdm9pZCBhdXRvX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgSVJRX0FVVE9fMjoKKwkJYW1pZ2FfY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX1BPUlRTOworCQlicmVhazsKKwljYXNlIElSUV9BVVRPXzY6CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9FWFRFUjsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBhdXRvX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIElSUV9BVVRPXzI6CisJCWFtaWdhX2N1c3RvbS5pbnRlbmEgPSBJRl9QT1JUUzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfQVVUT182OgorCQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfRVhURVI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdXRvX2lycV9jb250cm9sbGVyID0geworCS5uYW1lCQk9ICJhdXRvIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLmVuYWJsZQkJPSBhdXRvX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBhdXRvX2Rpc2FibGVfaXJxLAorfTsKKwogdm9pZCBfX2luaXQgY2lhX2luaXRfSVJRKHN0cnVjdCBjaWFiYXNlICpiYXNlKQogewotCWludCBpOwotCi0JLyogaW5pdCBpc3IgaGFuZGxlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQ0lBX0lSUVM7IGkrKykgewotCQliYXNlLT5pcnFfbGlzdFtpXS5oYW5kbGVyID0gTlVMTDsKLQkJYmFzZS0+aXJxX2xpc3RbaV0uZmxhZ3MgICA9IDA7Ci0JfQorCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJmNpYV9pcnFfY29udHJvbGxlciwgYmFzZS0+Y2lhX2lycSwgQ0lBX0lSUVMpOwogCiAJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0IGFuZCB0dXJuIG9mZiBhbGwgaW50ZXJydXB0cyAqLwogCWNpYV9zZXRfaXJxKGJhc2UsIENJQV9JQ1JfQUxMKTsKIAljaWFfYWJsZV9pcnEoYmFzZSwgQ0lBX0lDUl9BTEwpOwogCi0JLyogaW5zdGFsbCBDSUEgaGFuZGxlciAqLwotCXJlcXVlc3RfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCBjaWFfaGFuZGxlciwgMCwgYmFzZS0+bmFtZSwgYmFzZSk7Ci0KLQlhbWlnYV9jdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgYmFzZS0+aW50X21hc2s7Ci19Ci0KLWludCBjaWFfZ2V0X2lycV9saXN0KHN0cnVjdCBjaWFiYXNlICpiYXNlLCBzdHJ1Y3Qgc2VxX2ZpbGUgKnApCi17Ci0JaW50IGksIGo7Ci0KLQlqID0gYmFzZS0+Y2lhX2lycTsKLQlmb3IgKGkgPSAwOyBpIDwgQ0lBX0lSUVM7IGkrKykgewotCQlzZXFfcHJpbnRmKHAsICJjaWEgICUyZDogJTEwZCAiLCBqICsgaSwKLQkJCSAgICAgICBrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGogKyBpXSk7Ci0JCXNlcV9wdXRzKHAsICIgICIpOwotCQlzZXFfcHJpbnRmKHAsICIlc1xuIiwgYmFzZS0+aXJxX2xpc3RbaV0uZGV2bmFtZSk7Ci0JfQotCXJldHVybiAwOworCS8qIG92ZXJyaWRlIGF1dG8gaW50IGFuZCBpbnN0YWxsIENJQSBoYW5kbGVyICovCisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXV0b19pcnFfY29udHJvbGxlciwgYmFzZS0+aGFuZGxlcl9pcnEsIDEpOworCW02OGtfaXJxX3N0YXJ0dXAoYmFzZS0+aGFuZGxlcl9pcnEpOworCXJlcXVlc3RfaXJxKGJhc2UtPmhhbmRsZXJfaXJxLCBjaWFfaGFuZGxlciwgU0FfU0hJUlEsIGJhc2UtPm5hbWUsIGJhc2UpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2FtaWdhL2NvbmZpZy5jCmluZGV4IDEyZTM3MDYuLmI1YjhhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jb25maWcuYworKysgYi9hcmNoL202OGsvYW1pZ2EvY29uZmlnLmMKQEAgLTg3LDE3ICs4Nyw4IEBACiBzdGF0aWMgdm9pZCBhbWlnYV9zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIC8qIGFtaWdhIHNwZWNpZmljIGlycSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGFtaWdhX2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiBpcnFyZXR1cm5fdCAoKmFtaWdhX2RlZmF1bHRfaGFuZGxlcltdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIGludCBhbWlnYV9yZXF1ZXN0X2lycSAodW5zaWduZWQgaW50IGlycSwKLQkJCSAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwKLQkJCSAgICAgIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gdm9pZCBhbWlnYV9mcmVlX2lycSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGFtaWdhX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBhbWlnYV9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIGFtaWdhX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50IGFtaWdhX2dldF9oYXJkd2FyZV9saXN0KGNoYXIgKmJ1ZmZlcik7Ci1leHRlcm4gaW50IHNob3dfYW1pZ2FfaW50ZXJydXB0cyAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7CiAvKiBhbWlnYSBzcGVjaWZpYyB0aW1lciBmdW5jdGlvbnMgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGFtaWdhX2dldHRpbWVvZmZzZXQgKHZvaWQpOwogc3RhdGljIGludCBhMzAwMF9od2NsayAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CkBAIC0zOTIsMTQgKzM4Myw4IEBACiAKICAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBhbWlnYV9zY2hlZF9pbml0OwogICBtYWNoX2luaXRfSVJRICAgICAgICA9IGFtaWdhX2luaXRfSVJROwotICBtYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZhbWlnYV9kZWZhdWx0X2hhbmRsZXI7Ci0gIG1hY2hfcmVxdWVzdF9pcnEgICAgID0gYW1pZ2FfcmVxdWVzdF9pcnE7Ci0gIG1hY2hfZnJlZV9pcnEgICAgICAgID0gYW1pZ2FfZnJlZV9pcnE7Ci0gIGVuYWJsZV9pcnEgICAgICAgICAgID0gYW1pZ2FfZW5hYmxlX2lycTsKLSAgZGlzYWJsZV9pcnEgICAgICAgICAgPSBhbWlnYV9kaXNhYmxlX2lycTsKICAgbWFjaF9nZXRfbW9kZWwgICAgICAgPSBhbWlnYV9nZXRfbW9kZWw7CiAgIG1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBhbWlnYV9nZXRfaGFyZHdhcmVfbGlzdDsKLSAgbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X2FtaWdhX2ludGVycnVwdHM7CiAgIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gYW1pZ2FfZ2V0dGltZW9mZnNldDsKICAgaWYgKEFNSUdBSFdfUFJFU0VOVChBMzAwMF9DTEspKXsKICAgICBtYWNoX2h3Y2xrICAgICAgICAgPSBhMzAwMF9od2NsazsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vTWFrZWZpbGUgYi9hcmNoL202OGsvYXBvbGxvL01ha2VmaWxlCmluZGV4IDM5MjY0ZjMuLjc2YTA1NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIExpbnV4IGFyY2gvbTY4ay9hbWlnYSBzb3VyY2UgZGlyZWN0b3J5CiAjCiAKLW9iai15CQk6PSBjb25maWcubyBkbl9pbnRzLm8gZG1hLm8KK29iai15CQk6PSBjb25maWcubyBkbl9pbnRzLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMgYi9hcmNoL202OGsvYXBvbGxvL2NvbmZpZy5jCmluZGV4IGQ0MDE5NjIuLjk5YzcwOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2Fwb2xsby9jb25maWcuYwpAQCAtMjgsMTEgKzI4LDYgQEAKIAogZXh0ZXJuIHZvaWQgZG5fc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCx2b2lkICosc3RydWN0IHB0X3JlZ3MgKikpOwogZXh0ZXJuIHZvaWQgZG5faW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50IGRuX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIHZvaWQgZG5fZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGRuX2VuYWJsZV9pcnEodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGRuX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IHNob3dfZG5faW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGRuX2dldHRpbWVvZmZzZXQodm9pZCk7CiBleHRlcm4gaW50IGRuX2R1bW15X2h3Y2xrKGludCwgc3RydWN0IHJ0Y190aW1lICopOwogZXh0ZXJuIGludCBkbl9kdW1teV9zZXRfY2xvY2tfbW1zcyh1bnNpZ25lZCBsb25nKTsKQEAgLTQwLDEzICszNSwxMSBAQAogZXh0ZXJuIHZvaWQgZG5fZHVtbXlfd2FpdGJ1dCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgZmJfaW5mbyAqZG5fZmJfaW5pdChsb25nICopOwogZXh0ZXJuIHZvaWQgZG5fZHVtbXlfZGVidWdfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGRuX2R1bW15X3ZpZGVvX3NldHVwKGNoYXIgKixpbnQgKik7CiBleHRlcm4gaXJxcmV0dXJuX3QgZG5fcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiBzdGF0aWMgdm9pZCBkbl9oZWFydGJlYXQoaW50IG9uKTsKICNlbmRpZgogc3RhdGljIGlycXJldHVybl90IGRuX3RpbWVyX2ludChpbnQgaXJxLHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgKCpzY2hlZF90aW1lcl9oYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik9TlVMTDsKIHN0YXRpYyB2b2lkIGRuX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgY29uc3QgY2hhciAqYXBvbGxvX21vZGVsc1tdID0gewogCVtBUE9MTE9fRE4zMDAwLUFQT0xMT19ETjMwMDBdID0gIkROMzAwMCAoT3R0ZXIpIiwKQEAgLTE2NCwxNyArMTU3LDEwIEBACiAKIAltYWNoX3NjaGVkX2luaXQ9ZG5fc2NoZWRfaW5pdDsgLyogKi8KIAltYWNoX2luaXRfSVJRPWRuX2luaXRfSVJROwotCW1hY2hfZGVmYXVsdF9oYW5kbGVyPU5VTEw7Ci0JbWFjaF9yZXF1ZXN0X2lycSAgICAgPSBkbl9yZXF1ZXN0X2lycTsKLQltYWNoX2ZyZWVfaXJxICAgICAgICA9IGRuX2ZyZWVfaXJxOwotCWVuYWJsZV9pcnEgICAgICA9IGRuX2VuYWJsZV9pcnE7Ci0JZGlzYWJsZV9pcnEgICAgID0gZG5fZGlzYWJsZV9pcnE7Ci0JbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X2RuX2ludGVycnVwdHM7CiAJbWFjaF9nZXR0aW1lb2Zmc2V0ICAgPSBkbl9nZXR0aW1lb2Zmc2V0OwogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsKIAltYWNoX2h3Y2xrICAgICAgICAgICA9IGRuX2R1bW15X2h3Y2xrOyAvKiAqLwogCW1hY2hfc2V0X2Nsb2NrX21tc3MgID0gZG5fZHVtbXlfc2V0X2Nsb2NrX21tc3M7IC8qICovCi0JbWFjaF9wcm9jZXNzX2ludCAgICAgPSBkbl9wcm9jZXNzX2ludDsKIAltYWNoX3Jlc2V0CSAgICAgPSBkbl9kdW1teV9yZXNldDsgIC8qICovCiAjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAogCW1hY2hfaGVhcnRiZWF0ID0gZG5faGVhcnRiZWF0OwpAQCAtMTg5LDExICsxNzUsMTMgQEAKIAogfQogCi1pcnFyZXR1cm5fdCBkbl90aW1lcl9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApIHsKK2lycXJldHVybl90IGRuX3RpbWVyX2ludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlpcnFyZXR1cm5fdCAoKnRpbWVyX2hhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGRldl9pZDsKIAogCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgeDsKIAotCXNjaGVkX3RpbWVyX2hhbmRsZXIoaXJxLGRldl9pZCxmcCk7CisJdGltZXJfaGFuZGxlcihpcnEsIGRldl9pZCwgZnApOwogCiAJeD0qKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrMyk7CiAJeD0qKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrNSk7CkBAIC0yMTcsOSArMjA1LDcgQEAKIAlwcmludGsoIiooMHgxMDgwMykgJTAyeFxuIiwqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikodGltZXIrMHgzKSk7CiAjZW5kaWYKIAotCXNjaGVkX3RpbWVyX2hhbmRsZXI9dGltZXJfcm91dGluZTsKLQlyZXF1ZXN0X2lycSgwLGRuX3RpbWVyX2ludCwwLE5VTEwsTlVMTCk7Ci0KKwlyZXF1ZXN0X2lycShJUlFfQVBPTExPLCBkbl90aW1lcl9pbnQsIDAsICJ0aW1lIiwgdGltZXJfcm91dGluZSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgZG5fZ2V0dGltZW9mZnNldCh2b2lkKSB7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXBvbGxvL2RuX2ludHMuYyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCmluZGV4IGEzMTI1OTMuLjlmZTA3ODAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCisrKyBiL2FyY2gvbTY4ay9hcG9sbG8vZG5faW50cy5jCkBAIC0xLDEyNSArMSw0NCBAQAotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9hcG9sbG9ody5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCi1zdGF0aWMgaXJxX2hhbmRsZXJfdCBkbl9pcnFzWzE2XTsKLQotaXJxcmV0dXJuX3QgZG5fcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQordm9pZCBkbl9wcm9jZXNzX2ludCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0gIGlycXJldHVybl90IHJlcyA9IElSUV9OT05FOworCW02OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKIAotICBpZihkbl9pcnFzW2lycS0xNjBdLmhhbmRsZXIpIHsKLSAgICByZXMgPSBkbl9pcnFzW2lycS0xNjBdLmhhbmRsZXIoaXJxLGRuX2lycXNbaXJxLTE2MF0uZGV2X2lkLGZwKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGsoInNwdXJpb3VzIGlycSAlZCBvY2N1cnJlZFxuIixpcnEpOwotICB9Ci0KLSAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2EpPTB4MjA7Ci0gICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKT0weDIwOwotCi0gIHJldHVybiByZXM7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2EpPTB4MjA7CisJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IpPTB4MjA7CiB9CiAKLXZvaWQgZG5faW5pdF9JUlEodm9pZCkgewotCi0gIGludCBpOwotCi0gIGZvcihpPTA7aTwxNjtpKyspIHsKLSAgICBkbl9pcnFzW2ldLmhhbmRsZXI9TlVMTDsKLSAgICBkbl9pcnFzW2ldLmZsYWdzPUlSUV9GTEdfU1REOwotICAgIGRuX2lycXNbaV0uZGV2X2lkPU5VTEw7Ci0gICAgZG5faXJxc1tpXS5kZXZuYW1lPU5VTEw7Ci0gIH0KLQoraW50IGFwb2xsb19pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQoreworCWlmIChpcnEgPCA4KQorCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikocGljYSsxKSAmPSB+KDEgPDwgaXJxKTsKKwllbHNlCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKzEpICY9IH4oMSA8PCAoaXJxIC0gOCkpOworCXJldHVybiAwOwogfQogCi1pbnQgZG5fcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkgewotCi0gIGlmKChpcnE8MCkgfHwgKGlycT4xNSkpIHsKLSAgICBwcmludGsoIlRyeWluZyB0byByZXF1ZXN0IGludmFsaWQgSVJRXG4iKTsKLSAgICByZXR1cm4gLUVOWElPOwotICB9Ci0KLSAgaWYoIWRuX2lycXNbaXJxXS5oYW5kbGVyKSB7Ci0gICAgZG5faXJxc1tpcnFdLmhhbmRsZXI9aGFuZGxlcjsKLSAgICBkbl9pcnFzW2lycV0uZmxhZ3M9SVJRX0ZMR19TVEQ7Ci0gICAgZG5faXJxc1tpcnFdLmRldl9pZD1kZXZfaWQ7Ci0gICAgZG5faXJxc1tpcnFdLmRldm5hbWU9ZGV2bmFtZTsKLSAgICBpZihpcnE8OCkKLSAgICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNhKzEpJj1+KDE8PGlycSk7Ci0gICAgZWxzZQotICAgICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IrMSkmPX4oMTw8KGlycS04KSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotICBlbHNlIHsKLSAgICBwcmludGsoIlRyeWluZyB0byByZXF1ZXN0IGFscmVhZHkgYXNzaWduZWQgaXJxICVkXG4iLGlycSk7Ci0gICAgcmV0dXJuIC1FTlhJTzsKLSAgfQotCit2b2lkIGFwb2xsb19pcnFfc2h1dGRvd24odW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDwgOCkKKwkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2ErMSkgfD0gKDEgPDwgaXJxKTsKKwllbHNlCisJCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShwaWNiKzEpIHw9ICgxIDw8IChpcnEgLSA4KSk7CiB9CiAKLXZvaWQgZG5fZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKSB7CitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGFwb2xsb19pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiYXBvbGxvIiwKKwkubG9jayAgICAgICAgICAgPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAgICAgICAgID0gYXBvbGxvX2lycV9zdGFydHVwLAorCS5zaHV0ZG93biAgICAgICA9IGFwb2xsb19pcnFfc2h1dGRvd24sCit9OwogCi0gIGlmKChpcnE8MCkgfHwgKGlycT4xNSkpIHsKLSAgICBwcmludGsoIlRyeWluZyB0byBmcmVlIGludmFsaWQgSVJRXG4iKTsKLSAgICByZXR1cm4gOwotICB9CiAKLSAgaWYoaXJxPDgpCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2ErMSl8PSgxPDxpcnEpOwotICBlbHNlCi0gICAgKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopKHBpY2IrMSl8PSgxPDwoaXJxLTgpKTsKLQotICBkbl9pcnFzW2lycV0uaGFuZGxlcj1OVUxMOwotICBkbl9pcnFzW2lycV0uZmxhZ3M9SVJRX0ZMR19TVEQ7Ci0gIGRuX2lycXNbaXJxXS5kZXZfaWQ9TlVMTDsKLSAgZG5faXJxc1tpcnFdLmRldm5hbWU9TlVMTDsKLQotICByZXR1cm4gOwotCi19Ci0KLXZvaWQgZG5fZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKSB7Ci0KLSAgcHJpbnRrKCJkbiBlbmFibGUgaXJxXG4iKTsKLQotfQotCi12b2lkIGRuX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpIHsKLQotICBwcmludGsoImRuIGRpc2FibGUgaXJxXG4iKTsKLQotfQotCi1pbnQgc2hvd19kbl9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikgewotCi0gIHByaW50aygiZG4gZ2V0IGlycSBsaXN0XG4iKTsKLQotICByZXR1cm4gMDsKLQotfQotCi1zdHJ1Y3QgZmJfaW5mbyAqZG5fZHVtbXlfZmJfaW5pdChsb25nICptZW1fc3RhcnQpIHsKLQotICBwcmludGsoImZiIGluaXRcbiIpOwotCi0gIHJldHVybiBOVUxMOwotCi19Ci0KLXZvaWQgZG5fZHVtbXlfdmlkZW9fc2V0dXAoY2hhciAqb3B0aW9ucyxpbnQgKmludHMpIHsKLQotICBwcmludGsoIm5vIHZpZGVvIHlldFxuIik7Ci0KK3ZvaWQgZG5faW5pdF9JUlEodm9pZCkKK3sKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSICsgOTYsIDE2LCBkbl9wcm9jZXNzX2ludCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXBvbGxvX2lycV9jb250cm9sbGVyLCBJUlFfQVBPTExPLCAxNik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jIGIvYXJjaC9tNjhrL2F0YXJpL2F0YWludHMuYwppbmRleCAwNzZmNDc5Li5lY2UxM2NiIDEwMDY0NAotLS0gYS9hcmNoL202OGsvYXRhcmkvYXRhaW50cy5jCisrKyBiL2FyY2gvbTY4ay9hdGFyaS9hdGFpbnRzLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogICogdGhlIHNyIGNvcHkgaW4gdGhlIGZyYW1lLgogICovCiAKKyNpZiAwCiAKICNkZWZpbmUJTlVNX0lOVF9TT1VSQ0VTCSg4ICsgTlVNX0FUQVJJX1NPVVJDRVMpCiAKQEAgLTEzMywxMyArMTM0LDYgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpcnFwYXJhbSBpcnFfcGFyYW1bTlVNX0lOVF9TT1VSQ0VTXTsKIAotLyoKLSAqIEJpdG1hcCBmb3IgZnJlZSBpbnRlcnJ1cHQgdmVjdG9yIG51bWJlcnMKLSAqIChuZXcgdmVjdG9ycyBzdGFydGluZyBmcm9tIDB4NzAgY2FuIGJlIGFsbG9jYXRlZCBieQotICogYXRhcmlfcmVnaXN0ZXJfdm1lX2ludCgpKQotICovCi1zdGF0aWMgaW50IGZyZWVfdm1lX3ZlY19iaXRtYXA7Ci0KIC8qIGNoZWNrIGZvciB2YWxpZCBpbnQgbnVtYmVyIChjb21wbGV4LCBzaWdoLi4uKSAqLwogI2RlZmluZQlJU19WQUxJRF9JTlROTyhuKQkJCQkJCQkJCQkJXAogCSgobikgPiAwICYmCQkJCQkJCQkJCQkJCQlcCkBAIC0zMDEsNiArMjk1LDE0IEBACiApOwogCWZvciAoOzspOwogfQorI2VuZGlmCisKKy8qCisgKiBCaXRtYXAgZm9yIGZyZWUgaW50ZXJydXB0IHZlY3RvciBudW1iZXJzCisgKiAobmV3IHZlY3RvcnMgc3RhcnRpbmcgZnJvbSAweDcwIGNhbiBiZSBhbGxvY2F0ZWQgYnkKKyAqIGF0YXJpX3JlZ2lzdGVyX3ZtZV9pbnQoKSkKKyAqLworc3RhdGljIGludCBmcmVlX3ZtZV92ZWNfYml0bWFwOwogCiAvKiBHSzoKICAqIEhCTCBJUlEgaGFuZGxlciBmb3IgRmFsY29uLiBOb2JvZHkgbmVlZHMgaXQgOi0pCkBAIC0zMTMsMTMgKzMxNSwzNCBAQAogCSJvcncJIzB4MjAwLCVzcEBcblx0IgkvKiBzZXQgc2F2ZWQgaXBsIHRvIDIgKi8KIAkicnRlIik7CiAKLS8qIERlZmluZWQgaW4gZW50cnkuUzsgb25seSBpbmNyZW1lbnRzICdudW1fc3B1cmlvdXMnICovCi1hc21saW5rYWdlIHZvaWQgYmFkX2ludGVycnVwdCh2b2lkKTsKLQotZXh0ZXJuIHZvaWQgYXRhcmlfbWljcm93aXJlX2NtZCggaW50IGNtZCApOworZXh0ZXJuIHZvaWQgYXRhcmlfbWljcm93aXJlX2NtZChpbnQgY21kKTsKIAogZXh0ZXJuIGludCBhdGFyaV9TQ0NfcmVzZXRfZG9uZTsKIAorc3RhdGljIGludCBhdGFyaV9zdGFydHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCW02OGtfaXJxX3N0YXJ0dXAoaXJxKTsKKwlhdGFyaV90dXJub25faXJxKGlycSk7CisJYXRhcmlfZW5hYmxlX2lycShpcnEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdGFyaV9zaHV0ZG93bl9pcnEodW5zaWduZWQgaW50IGlycSkKK3sKKwlhdGFyaV9kaXNhYmxlX2lycShpcnEpOworCWF0YXJpX3R1cm5vZmZfaXJxKGlycSk7CisJbTY4a19pcnFfc2h1dGRvd24oaXJxKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBhdGFyaV9pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZQkJPSAiYXRhcmkiLAorCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkuc3RhcnR1cAk9IGF0YXJpX3N0YXJ0dXBfaXJxLAorCS5zaHV0ZG93bgk9IGF0YXJpX3NodXRkb3duX2lycSwKKwkuZW5hYmxlCQk9IGF0YXJpX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBhdGFyaV9kaXNhYmxlX2lycSwKK307CisKIC8qCiAgKiB2b2lkIGF0YXJpX2luaXRfSVJRICh2b2lkKQogICoKQEAgLTMzMywxMiArMzU2LDggQEAKIAogdm9pZCBfX2luaXQgYXRhcmlfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKLQotCS8qIGluaXRpYWxpemUgdGhlIHZlY3RvciB0YWJsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fSU5UX1NPVVJDRVM7ICsraSkgewotCQl2ZWN0b3JzW0lSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpXSA9IGJhZF9pbnRlcnJ1cHQ7Ci0JfQorCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmYXRhcmlfaXJxX2NvbnRyb2xsZXIsIDEsIE5VTV9BVEFSSV9TT1VSQ0VTIC0gMSk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBNRlAocykgKi8KIApAQCAtMzc4LDggKzM5Nyw3IEBACiAJCQkJCQkJCQkgKiBlbmFibGVkIGluIFZNRSBtYXNrCiAJCQkJCQkJCQkgKi8KIAkJdHRfc2N1LnZtZV9tYXNrID0gMHg2MDsJCS8qIGVuYWJsZSBNRlAgYW5kIFNDQyBpbnRzICovCi0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCS8qIElmIG5vIFNDVSBhbmQgbm8gSGFkZXMsIHRoZSBIU1lOQyBpbnRlcnJ1cHQgbmVlZHMgdG8gYmUKIAkJICogZGlzYWJsZWQgdGhpcyB3YXkuIChFbHNlIF9pbnRoYW5kbGVyIGluIGtlcm5lbC9zeXNfY2FsbC5TCiAJCSAqIGdldHMgb3ZlcnJ1bnMpCkBAIC00MDQsMTg0ICs0MjIsNiBAQAogfQogCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBhdGFyaV9jYWxsX2lycV9saXN0KCBpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCApCi17Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWZvciAobm9kZSA9IChpcnFfbm9kZV90ICopZGV2X2lkOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkKLQkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCwgZnApOwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotCi0vKgotICogYXRhcmlfcmVxdWVzdF9pcnEgOiBhZGQgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYSBwYXJ0aWN1bGFyCi0gKiAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgc3BlY2lmaWMgaW50ZXJydXB0IHNvdXJjZS4KLSAqICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIGFkZGl0aW9uIHdhcyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIDAuCi0gKi8KLQotaW50IGF0YXJpX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgdmVjdG9yOwotCXVuc2lnbmVkIGxvbmcgb2ZsYWdzID0gZmxhZ3M7Ci0KLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgaXMgYSBoYWNrIHRvIG1ha2Ugc29tZSBQQ0kgY2FyZCBkcml2ZXJzIHdvcmssCi0JICogd2hpY2ggc2V0IHRoZSBTQV9TSElSUSBmbGFnLgotCSAqLwotCi0JZmxhZ3MgJj0gflNBX1NISVJROwotCi0JaWYgKGZsYWdzID09IFNBX0lOVEVSUlVQVCkgewotCQlwcmludGsgKCIlczogU0FfSU5URVJSVVBUIGNoYW5nZWQgdG8gSVJRX1RZUEVfU0xPVyBmb3IgJXNcbiIsCi0JCQlfX0ZVTkNUSU9OX18sIGRldm5hbWUpOwotCQlmbGFncyA9IElSUV9UWVBFX1NMT1c7Ci0JfQotCWlmIChmbGFncyA8IElSUV9UWVBFX1NMT1cgfHwgZmxhZ3MgPiBJUlFfVFlQRV9QUklPKSB7Ci0JCXByaW50ayAoIiVzOiBCYWQgaXJxIHR5cGUgMHglbHggPDB4JWx4PiByZXF1ZXN0ZWQgZnJvbSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGZsYWdzLCBvZmxhZ3MsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKCFJU19WQUxJRF9JTlROTyhpcnEpKSB7Ci0JCXByaW50ayAoIiVzOiBVbmtub3duIGlycSAlZCByZXF1ZXN0ZWQgZnJvbSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCXZlY3RvciA9IElSUV9TT1VSQ0VfVE9fVkVDVE9SKGlycSk7Ci0KLQkvKgotCSAqIENoZWNrIHR5cGUvc291cmNlIGNvbWJpbmF0aW9uOiBzbG93IGludHMgYXJlIChjdXJyZW50bHkpCi0JICogb25seSBwb3NzaWJsZSBmb3IgTUZQLWludGVycnVwdHMuCi0JICovCi0JaWYgKGZsYWdzID09IElSUV9UWVBFX1NMT1cgJiYKLQkJKGlycSA8IFNUTUZQX1NPVVJDRV9CQVNFIHx8IGlycSA+PSBTQ0NfU09VUkNFX0JBU0UpKSB7Ci0JCXByaW50ayAoIiVzOiBTbG93IGlycSByZXF1ZXN0ZWQgZm9yIG5vbi1NRlAgc291cmNlICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAodmVjdG9yc1t2ZWN0b3JdID09IGJhZF9pbnRlcnJ1cHQpIHsKLQkJLyogaW50IGhhcyBubyBoYW5kbGVyIHlldCAqLwotCQlpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCQlpcnFfaGFuZGxlcltpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JCWlycV9wYXJhbVtpcnFdLmZsYWdzICAgPSBmbGFnczsKLQkJaXJxX3BhcmFtW2lycV0uZGV2bmFtZSA9IGRldm5hbWU7Ci0JCXZlY3RvcnNbdmVjdG9yXSA9Ci0JCQkoZmxhZ3MgPT0gSVJRX1RZUEVfU0xPVykgPyBzbG93X2hhbmRsZXJzW2lycS1TVE1GUF9TT1VSQ0VfQkFTRV0gOgotCQkJKGZsYWdzID09IElSUV9UWVBFX0ZBU1QpID8gYXRhcmlfZmFzdF9pcnFfaGFuZGxlciA6Ci0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgIGF0YXJpX3ByaW9faXJxX2hhbmRsZXI7Ci0JCS8qIElmIE1GUCBpbnQsIGFsc28gZW5hYmxlIGFuZCB1bWFzayBpdCAqLwotCQlhdGFyaV90dXJub25faXJxKGlycSk7Ci0JCWF0YXJpX2VuYWJsZV9pcnEoaXJxKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0JZWxzZSBpZiAoaXJxX3BhcmFtW2lycV0uZmxhZ3MgPT0gZmxhZ3MpIHsKLQkJLyogb2xkIGhhbmRsZXIgaXMgb2Ygc2FtZSB0eXBlIC0+IGhhbmRsZXJzIGNhbiBiZSBjaGFpbmVkICovCi0JCWlycV9ub2RlX3QgKm5vZGU7Ci0JCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JCWlmIChpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgIT0gYXRhcmlfY2FsbF9pcnFfbGlzdCkgewotCQkJLyogT25seSBvbmUgaGFuZGxlciB5ZXQsIG1ha2UgYSBub2RlIGZvciB0aGlzIGZpcnN0IG9uZSAqLwotCQkJaWYgKCEobm9kZSA9IG5ld19pcnFfbm9kZSgpKSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCW5vZGUtPmhhbmRsZXIgPSBpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXI7Ci0JCQlub2RlLT5kZXZfaWQgID0gaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7Ci0JCQlub2RlLT5kZXZuYW1lID0gaXJxX3BhcmFtW2lycV0uZGV2bmFtZTsKLQkJCW5vZGUtPm5leHQgPSBOVUxMOwotCi0JCQlpcnFfaGFuZGxlcltpcnFdLmhhbmRsZXIgPSBhdGFyaV9jYWxsX2lycV9saXN0OwotCQkJaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQgID0gbm9kZTsKLQkJCWlycV9wYXJhbVtpcnFdLmRldm5hbWUgICA9ICJjaGFpbmVkIjsKLQkJfQotCi0JCWlmICghKG5vZGUgPSBuZXdfaXJxX25vZGUoKSkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJbm9kZS0+aGFuZGxlciA9IGhhbmRsZXI7Ci0JCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7Ci0JCW5vZGUtPmRldm5hbWUgPSBkZXZuYW1lOwotCQkvKiBuZXcgaGFuZGxlcnMgYXJlIHB1dCBpbiBmcm9udCBvZiB0aGUgcXVldWUgKi8KLQkJbm9kZS0+bmV4dCA9IGlycV9oYW5kbGVyW2lycV0uZGV2X2lkOwotCQlpcnFfaGFuZGxlcltpcnFdLmRldl9pZCA9IG5vZGU7Ci0KLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlwcmludGsgKCIlczogSXJxICVkIGFsbG9jYXRlZCBieSBvdGhlciB0eXBlIGludCAoY2FsbCBmcm9tICVzKVxuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotfQotCi12b2lkIGF0YXJpX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCB2ZWN0b3I7Ci0JaXJxX25vZGVfdCAqKmxpc3QsICpub2RlOwotCi0JaWYgKCFJU19WQUxJRF9JTlROTyhpcnEpKSB7Ci0JCXByaW50aygiJXM6IFVua25vd24gaXJxICVkXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl2ZWN0b3IgPSBJUlFfU09VUkNFX1RPX1ZFQ1RPUihpcnEpOwotCWlmICh2ZWN0b3JzW3ZlY3Rvcl0gPT0gYmFkX2ludGVycnVwdCkKLQkJZ290byBub3RfZm91bmQ7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQlpZiAoaXJxX2hhbmRsZXJbaXJxXS5oYW5kbGVyICE9IGF0YXJpX2NhbGxfaXJxX2xpc3QpIHsKLQkJLyogSXQncyB0aGUgb25seSBoYW5kbGVyIGZvciB0aGUgaW50ZXJydXB0ICovCi0JCWlmIChpcnFfaGFuZGxlcltpcnFdLmRldl9pZCAhPSBkZXZfaWQpIHsKLQkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJCWdvdG8gbm90X2ZvdW5kOwotCQl9Ci0JCWlycV9oYW5kbGVyW2lycV0uaGFuZGxlciA9IE5VTEw7Ci0JCWlycV9oYW5kbGVyW2lycV0uZGV2X2lkICA9IE5VTEw7Ci0JCWlycV9wYXJhbVtpcnFdLmRldm5hbWUgICA9IE5VTEw7Ci0JCXZlY3RvcnNbdmVjdG9yXSA9IGJhZF9pbnRlcnJ1cHQ7Ci0JCS8qIElmIE1GUCBpbnQsIGFsc28gZGlzYWJsZSBpdCAqLwotCQlhdGFyaV9kaXNhYmxlX2lycShpcnEpOwotCQlhdGFyaV90dXJub2ZmX2lycShpcnEpOwotCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFRoZSBpbnRlcnJ1cHQgaXMgY2hhaW5lZCwgZmluZCB0aGUgaXJxIG9uIHRoZSBsaXN0ICovCi0JZm9yKGxpc3QgPSAoaXJxX25vZGVfdCAqKikmaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7ICpsaXN0OyBsaXN0ID0gJigqbGlzdCktPm5leHQpIHsKLQkJaWYgKCgqbGlzdCktPmRldl9pZCA9PSBkZXZfaWQpIGJyZWFrOwotCX0KLQlpZiAoISpsaXN0KSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJZ290byBub3RfZm91bmQ7Ci0JfQotCi0JKCpsaXN0KS0+aGFuZGxlciA9IE5VTEw7IC8qIE1hcmsgaXQgYXMgZnJlZSBmb3IgcmVhbGxvY2F0aW9uICovCi0JKmxpc3QgPSAoKmxpc3QpLT5uZXh0OwotCi0JLyogSWYgdGhlcmUncyBub3cgb25seSBvbmUgaGFuZGxlciwgdW5jaGFpbiB0aGUgaW50ZXJydXB0LCBpLmUuIHBsdWcgaW4KLQkgKiB0aGUgaGFuZGxlciBkaXJlY3RseSBhZ2FpbiBhbmQgb21pdCBhdGFyaV9jYWxsX2lycV9saXN0ICovCi0Jbm9kZSA9IChpcnFfbm9kZV90ICopaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQ7Ci0JaWYgKG5vZGUgJiYgIW5vZGUtPm5leHQpIHsKLQkJaXJxX2hhbmRsZXJbaXJxXS5oYW5kbGVyID0gbm9kZS0+aGFuZGxlcjsKLQkJaXJxX2hhbmRsZXJbaXJxXS5kZXZfaWQgID0gbm9kZS0+ZGV2X2lkOwotCQlpcnFfcGFyYW1baXJxXS5kZXZuYW1lICAgPSBub2RlLT5kZXZuYW1lOwotCQlub2RlLT5oYW5kbGVyID0gTlVMTDsgLyogTWFyayBpdCBhcyBmcmVlIGZvciByZWFsbG9jYXRpb24gKi8KLQl9Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JcmV0dXJuOwotCi1ub3RfZm91bmQ6Ci0JcHJpbnRrKCIlczogdHJpZWQgdG8gcmVtb3ZlIGludmFsaWQgaXJxXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybjsKLX0KLQotCiAvKgogICogYXRhcmlfcmVnaXN0ZXJfdm1lX2ludCgpIHJldHVybnMgdGhlIG51bWJlciBvZiBhIGZyZWUgaW50ZXJydXB0IHZlY3RvciBmb3IKICAqIGhhcmR3YXJlIHdpdGggYSBwcm9ncmFtbWFibGUgaW50IHZlY3RvciAocHJvYmFibHkgYSBWTUUgYm9hcmQpLgpAQCAtNTkxLDU4ICs0MzEsMjQgQEAKIHsKIAlpbnQgaTsKIAotCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCi0JCWlmKChmcmVlX3ZtZV92ZWNfYml0bWFwICYgKDEgPDwgaSkpID09IDApCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWlmICgoZnJlZV92bWVfdmVjX2JpdG1hcCAmICgxIDw8IGkpKSA9PSAwKQogCQkJYnJlYWs7CiAKLQlpZihpID09IDE2KQorCWlmIChpID09IDE2KQogCQlyZXR1cm4gMDsKIAogCWZyZWVfdm1lX3ZlY19iaXRtYXAgfD0gMSA8PCBpOwotCXJldHVybiAoVk1FX1NPVVJDRV9CQVNFICsgaSk7CisJcmV0dXJuIFZNRV9TT1VSQ0VfQkFTRSArIGk7CiB9CiAKIAogdm9pZCBhdGFyaV91bnJlZ2lzdGVyX3ZtZV9pbnQodW5zaWduZWQgbG9uZyBpcnEpCiB7Ci0JaWYoaXJxID49IFZNRV9TT1VSQ0VfQkFTRSAmJiBpcnEgPCBWTUVfU09VUkNFX0JBU0UgKyBWTUVfTUFYX1NPVVJDRVMpIHsKKwlpZiAoaXJxID49IFZNRV9TT1VSQ0VfQkFTRSAmJiBpcnEgPCBWTUVfU09VUkNFX0JBU0UgKyBWTUVfTUFYX1NPVVJDRVMpIHsKIAkJaXJxIC09IFZNRV9TT1VSQ0VfQkFTRTsKIAkJZnJlZV92bWVfdmVjX2JpdG1hcCAmPSB+KDEgPDwgaXJxKTsKIAl9CiB9CiAKIAotaW50IHNob3dfYXRhcmlfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lOVF9TT1VSQ0VTOyArK2kpIHsKLQkJaWYgKHZlY3RvcnNbSVJRX1NPVVJDRV9UT19WRUNUT1IoaSldID09IGJhZF9pbnRlcnJ1cHQpCi0JCQljb250aW51ZTsKLQkJaWYgKGkgPCBTVE1GUF9TT1VSQ0VfQkFTRSkKLQkJCXNlcV9wcmludGYocCwgImF1dG8gJTJkOiAlMTB1ICIsCi0JCQkJICAgICAgIGksIGtzdGF0X2NwdSgwKS5pcnFzW2ldKTsKLQkJZWxzZQotCQkJc2VxX3ByaW50ZihwLCAidmVjICQlMDJ4OiAlMTB1ICIsCi0JCQkJICAgICAgIElSUV9TT1VSQ0VfVE9fVkVDVE9SKGkpLAotCQkJCSAgICAgICBrc3RhdF9jcHUoMCkuaXJxc1tpXSk7Ci0KLQkJaWYgKGlycV9oYW5kbGVyW2ldLmhhbmRsZXIgIT0gYXRhcmlfY2FsbF9pcnFfbGlzdCkgewotCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIGlycV9wYXJhbVtpXS5kZXZuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCWlycV9ub2RlX3QgKm47Ci0JCQlmb3IoIG4gPSAoaXJxX25vZGVfdCAqKWlycV9oYW5kbGVyW2ldLmRldl9pZDsgbjsgbiA9IG4tPm5leHQgKSB7Ci0JCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIG4tPmRldm5hbWUpOwotCQkJCWlmIChuLT5uZXh0KQotCQkJCQlzZXFfcHV0cyhwLCAiICAgICAgICAgICAgICAgICAgICAiICk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG51bV9zcHVyaW91cykKLQkJc2VxX3ByaW50ZihwLCAic3B1cmlvLjogJTEwdVxuIiwgbnVtX3NwdXJpb3VzKTsKLQotCXJldHVybiAwOwotfQotCi0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYyBiL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYwppbmRleCAxMDEyYjA4ZTUuLjcyNzI4OWEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hdGFyaS9jb25maWcuYworKysgYi9hcmNoL202OGsvYXRhcmkvY29uZmlnLmMKQEAgLTU3LDEyICs1Nyw2IEBACiAKIC8qIGF0YXJpIHNwZWNpZmljIGlycSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkIGF0YXJpX2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiBpbnQgYXRhcmlfcmVxdWVzdF9pcnEgKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKTsKLWV4dGVybiB2b2lkIGF0YXJpX2ZyZWVfaXJxICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotZXh0ZXJuIHZvaWQgYXRhcmlfZW5hYmxlX2lycSAodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkIGF0YXJpX2Rpc2FibGVfaXJxICh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIGludCBzaG93X2F0YXJpX2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgYXRhcmlfbWtzb3VuZCggdW5zaWduZWQgaW50IGNvdW50LCB1bnNpZ25lZCBpbnQgdGlja3MgKTsKICNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCiBzdGF0aWMgdm9pZCBhdGFyaV9oZWFydGJlYXQoIGludCBvbiApOwpAQCAtMjMyLDEzICsyMjYsOCBAQAogCiAgICAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSBhdGFyaV9zY2hlZF9pbml0OwogICAgIG1hY2hfaW5pdF9JUlEgICAgICAgID0gYXRhcmlfaW5pdF9JUlE7Ci0gICAgbWFjaF9yZXF1ZXN0X2lycSAgICAgPSBhdGFyaV9yZXF1ZXN0X2lycTsKLSAgICBtYWNoX2ZyZWVfaXJxICAgICAgICA9IGF0YXJpX2ZyZWVfaXJxOwotICAgIGVuYWJsZV9pcnEgICAgICAgICAgID0gYXRhcmlfZW5hYmxlX2lycTsKLSAgICBkaXNhYmxlX2lycSAgICAgICAgICA9IGF0YXJpX2Rpc2FibGVfaXJxOwogICAgIG1hY2hfZ2V0X21vZGVsCSA9IGF0YXJpX2dldF9tb2RlbDsKICAgICBtYWNoX2dldF9oYXJkd2FyZV9saXN0ID0gYXRhcmlfZ2V0X2hhcmR3YXJlX2xpc3Q7Ci0gICAgbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19hdGFyaV9pbnRlcnJ1cHRzOwogICAgIG1hY2hfZ2V0dGltZW9mZnNldCAgID0gYXRhcmlfZ2V0dGltZW9mZnNldDsKICAgICBtYWNoX3Jlc2V0ICAgICAgICAgICA9IGF0YXJpX3Jlc2V0OwogICAgIG1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmY7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvYnZtZTYwMDAvTWFrZWZpbGUgYi9hcmNoL202OGsvYnZtZTYwMDAvTWFrZWZpbGUKaW5kZXggMjM0OGU2Yy4uZDgxNzQwMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2J2bWU2MDAwL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9idm1lNjAwMC9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIExpbnV4IGFyY2gvbTY4ay9idm1lNjAwMCBzb3VyY2UgZGlyZWN0b3J5CiAjCiAKLW9iai15CQk6PSBjb25maWcubyBidm1laW50cy5vIHJ0Yy5vCitvYmoteQkJOj0gY29uZmlnLm8gcnRjLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9idm1lNjAwMC9idm1laW50cy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2J2bWVpbnRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OGE4ZGYuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2J2bWU2MDAwL2J2bWVpbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoKLSAqIGFyY2gvbTY4ay9idm1lNjAwMC9idm1laW50cy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KLSAqCi0gKiBiYXNlZCBvbiBhbWlpbnRzLmMgLS0gQW1pZ2EgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBSRUFETUUubGVnYWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBidm1lNjAwMF9kZWZoYW5kIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci0KLS8qCi0gKiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIDQgZWxlbWVudHMgb25seSwgZm9yIHNwZWVkLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWlycXJldHVybl90CSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0Jdm9pZAkJKmRldl9pZDsKLQljb25zdCBjaGFyCSpkZXZuYW1lOwotCXVuc2lnbmVkCWNvdW50OwotfSBpcnFfdGFiWzI1Nl07Ci0KLS8qCi0gKiB2b2lkIGJ2bWU2MDAwX2luaXRfSVJRICh2b2lkKQotICoKLSAqIFBhcmFtZXRlcnM6CU5vbmUKLSAqCi0gKiBSZXR1cm5zOglOb3RoaW5nCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKLSAqIHRoZSBidm1lNjAwMCBJUlEgaGFuZGxpbmcgcm91dGluZXMuCi0gKi8KLQotdm9pZCBidm1lNjAwMF9pbml0X0lSUSAodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotCQlpcnFfdGFiW2ldLmhhbmRsZXIgPSBidm1lNjAwMF9kZWZoYW5kOwotCQlpcnFfdGFiW2ldLmZsYWdzID0gSVJRX0ZMR19TVEQ7Ci0JCWlycV90YWJbaV0uZGV2X2lkID0gTlVMTDsKLQkJaXJxX3RhYltpXS5kZXZuYW1lID0gTlVMTDsKLQkJaXJxX3RhYltpXS5jb3VudCA9IDA7Ci0JfQotfQotCi1pbnQgYnZtZTYwMDBfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPiAyNTUpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotI2lmIDAKLQkvKiBOb3RoaW5nIHNwZWNpYWwgYWJvdXQgYXV0by12ZWN0b3JlZCBkZXZpY2VzIGZvciB0aGUgQlZNRTYwMDAsCi0JICogYnV0IHRyZWF0IGl0IHNwZWNpYWxseSB0byBhdm9pZCBjaGFuZ2VzIGVsc2V3aGVyZS4KLQkgKi8KLQotCWlmIChpcnEgPj0gVkVDX0lOVDEgJiYgaXJxIDw9IFZFQ19JTlQ3KQotCQlyZXR1cm4gY3B1X3JlcXVlc3RfaXJxKGlycSAtIFZFQ19TUFVSLCBoYW5kbGVyLCBmbGFncywKLQkJCQkJCWRldm5hbWUsIGRldl9pZCk7Ci0jZW5kaWYKLQlpZiAoIShpcnFfdGFiW2lycV0uZmxhZ3MgJiBJUlFfRkxHX1NURCkpIHsKLQkJaWYgKGlycV90YWJbaXJxXS5mbGFncyAmIElSUV9GTEdfTE9DSykgewotCQkJcHJpbnRrKCIlczogSVJRICVkIGZyb20gJXMgaXMgbm90IHJlcGxhY2VhYmxlXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JCWlmIChmbGFncyAmIElSUV9GTEdfUkVQTEFDRSkgewotCQkJcHJpbnRrKCIlczogJXMgY2FuJ3QgcmVwbGFjZSBJUlEgJWQgZnJvbSAlc1xuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGRldm5hbWUsIGlycSwgaXJxX3RhYltpcnFdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLQlpcnFfdGFiW2lycV0uaGFuZGxlciA9IGhhbmRsZXI7Ci0JaXJxX3RhYltpcnFdLmZsYWdzICAgPSBmbGFnczsKLQlpcnFfdGFiW2lycV0uZGV2X2lkICA9IGRldl9pZDsKLQlpcnFfdGFiW2lycV0uZGV2bmFtZSA9IGRldm5hbWU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYnZtZTYwMDBfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPiAyNTUpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwgX19GVU5DVElPTl9fLCBpcnEpOwotCQlyZXR1cm47Ci0JfQotI2lmIDAKLQlpZiAoaXJxID49IFZFQ19JTlQxICYmIGlycSA8PSBWRUNfSU5UNykgewotCQljcHVfZnJlZV9pcnEoaXJxIC0gVkVDX1NQVVIsIGRldl9pZCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQlpZiAoaXJxX3RhYltpcnFdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxXS5kZXZuYW1lKTsKLQotCWlycV90YWJbaXJxXS5oYW5kbGVyID0gYnZtZTYwMDBfZGVmaGFuZDsKLQlpcnFfdGFiW2lycV0uZmxhZ3MgICA9IElSUV9GTEdfU1REOwotCWlycV90YWJbaXJxXS5kZXZfaWQgID0gTlVMTDsKLQlpcnFfdGFiW2lycV0uZGV2bmFtZSA9IE5VTEw7Ci19Ci0KLWlycXJldHVybl90IGJ2bWU2MDAwX3Byb2Nlc3NfaW50ICh1bnNpZ25lZCBsb25nIHZlYywgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmICh2ZWMgPiAyNTUpIHsKLQkJcHJpbnRrICgiYnZtZTYwMDBfcHJvY2Vzc19pbnQ6IElsbGVnYWwgdmVjdG9yICVsZCIsIHZlYyk7Ci0JCXJldHVybiBJUlFfTk9ORTsKLQl9IGVsc2UgewotCQlpcnFfdGFiW3ZlY10uY291bnQrKzsKLQkJaXJxX3RhYlt2ZWNdLmhhbmRsZXIodmVjLCBpcnFfdGFiW3ZlY10uZGV2X2lkLCBmcCk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci19Ci0KLWludCBzaG93X2J2bWU2MDAwX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCWlmIChpcnFfdGFiW2ldLmNvdW50KQotCQkJc2VxX3ByaW50ZihwLCAiVmVjIDB4JTAyeDogJThkICAlc1xuIiwKLQkJCSAgICBpLCBpcnFfdGFiW2ldLmNvdW50LAotCQkJICAgIGlycV90YWJbaV0uZGV2bmFtZSA/IGlycV90YWJbaV0uZGV2bmFtZSA6ICJmcmVlIik7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBidm1lNjAwMF9kZWZoYW5kIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlwcmludGsgKCJVbmtub3duIGludGVycnVwdCAweCUwMnhcbiIsIGlycSk7Ci0JcmV0dXJuIElSUV9OT05FOwotfQotCi12b2lkIGJ2bWU2MDAwX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KLQotdm9pZCBidm1lNjAwMF9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL2J2bWU2MDAwL2NvbmZpZy5jCmluZGV4IGM5MGNiNWYuLmQxZTkxNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9idm1lNjAwMC9jb25maWcuYworKysgYi9hcmNoL202OGsvYnZtZTYwMDAvY29uZmlnLmMKQEAgLTM2LDE1ICszNiw4IEBACiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vYnZtZTYwMDBody5oPgogCi1leHRlcm4gaXJxcmV0dXJuX3QgYnZtZTYwMDBfcHJvY2Vzc19pbnQgKGludCBsZXZlbCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgYnZtZTYwMDBfaW5pdF9JUlEgKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnZtZTYwMDBfZnJlZV9pcnEgKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgIHNob3dfYnZtZTYwMDBfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIGJ2bWU2MDAwX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBidm1lNjAwMF9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIGJ2bWU2MDAwX2dldF9tb2RlbChjaGFyICptb2RlbCk7CiBzdGF0aWMgaW50ICBidm1lNjAwMF9nZXRfaGFyZHdhcmVfbGlzdChjaGFyICpidWZmZXIpOwotZXh0ZXJuIGludCAgYnZtZTYwMDBfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCBidm1lNjAwMF9zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGJ2bWU2MDAwX2dldHRpbWVvZmZzZXQgKHZvaWQpOwogZXh0ZXJuIGludCBidm1lNjAwMF9od2NsayAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CkBAIC0xMDAsNiArOTMsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCisgKiB0aGUgYnZtZTYwMDAgSVJRIGhhbmRsaW5nIHJvdXRpbmVzLgorICovCitzdGF0aWMgdm9pZCBidm1lNjAwMF9pbml0X0lSUSh2b2lkKQoreworCW02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQoVkVDX1VTRVIsIDE5MiwgTlVMTCk7Cit9CiAKIHZvaWQgX19pbml0IGNvbmZpZ19idm1lNjAwMCh2b2lkKQogewpAQCAtMTI3LDEyICsxMjgsNiBAQAogICAgIG1hY2hfaHdjbGsgICAgICAgICAgID0gYnZtZTYwMDBfaHdjbGs7CiAgICAgbWFjaF9zZXRfY2xvY2tfbW1zcwkgPSBidm1lNjAwMF9zZXRfY2xvY2tfbW1zczsKICAgICBtYWNoX3Jlc2V0CQkgPSBidm1lNjAwMF9yZXNldDsKLSAgICBtYWNoX2ZyZWVfaXJxCSA9IGJ2bWU2MDAwX2ZyZWVfaXJxOwotICAgIG1hY2hfcHJvY2Vzc19pbnQJID0gYnZtZTYwMDBfcHJvY2Vzc19pbnQ7Ci0gICAgbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19idm1lNjAwMF9pbnRlcnJ1cHRzOwotICAgIG1hY2hfcmVxdWVzdF9pcnEJID0gYnZtZTYwMDBfcmVxdWVzdF9pcnE7Ci0gICAgZW5hYmxlX2lycQkJID0gYnZtZTYwMDBfZW5hYmxlX2lycTsKLSAgICBkaXNhYmxlX2lycSAgICAgICAgICA9IGJ2bWU2MDAwX2Rpc2FibGVfaXJxOwogICAgIG1hY2hfZ2V0X21vZGVsICAgICAgID0gYnZtZTYwMDBfZ2V0X21vZGVsOwogICAgIG1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBidm1lNjAwMF9nZXRfaGFyZHdhcmVfbGlzdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2hwMzAwL01ha2VmaWxlIGIvYXJjaC9tNjhrL2hwMzAwL01ha2VmaWxlCmluZGV4IDg5YjYzMTcuLjI4OGI5YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9ocDMwMC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvaHAzMDAvTWFrZWZpbGUKQEAgLTIsNCArMiw0IEBACiAjIE1ha2VmaWxlIGZvciBMaW51eCBhcmNoL202OGsvaHAzMDAgc291cmNlIGRpcmVjdG9yeQogIwogCi1vYmoteQkJOj0ga3N5bXMubyBjb25maWcubyBpbnRzLm8gdGltZS5vIHJlYm9vdC5vCitvYmoteQkJOj0ga3N5bXMubyBjb25maWcubyB0aW1lLm8gcmVib290Lm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYyBiL2FyY2gvbTY4ay9ocDMwMC9jb25maWcuYwppbmRleCA2ZDEyOWVlLi4yZWYyNzFjIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaHAzMDAvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL2hwMzAwL2NvbmZpZy5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8YXNtL2hwMzAwaHcuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKLSNpbmNsdWRlICJpbnRzLmgiCiAjaW5jbHVkZSAidGltZS5oIgogCiB1bnNpZ25lZCBsb25nIGhwMzAwX21vZGVsOwpAQCAtNjQsOCArNjMsNiBAQAogc3RhdGljIGNoYXIgaHAzMDBfbW9kZWxfbmFtZVsxM10gPSAiSFA5MDAwLyI7CiAKIGV4dGVybiB2b2lkIGhwMzAwX3Jlc2V0KHZvaWQpOwotZXh0ZXJuIGlycXJldHVybl90ICgqaHAzMDBfZGVmYXVsdF9oYW5kbGVyW10pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiBpbnQgc2hvd19ocDMwMF9pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwogI2lmZGVmIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFCiBleHRlcm4gaW50IGhwMzAwX3NldHVwX3NlcmlhbF9jb25zb2xlKHZvaWQpIF9faW5pdDsKICNlbmRpZgpAQCAtMjQ1LDE2ICsyNDIsMTYgQEAKIAkJaHAzMDBfcnRjX3JlYWQoUlRDX1JFR19TRUMyKTsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGhwMzAwX2luaXRfSVJRKHZvaWQpCit7Cit9CisKIHZvaWQgX19pbml0IGNvbmZpZ19ocDMwMCh2b2lkKQogewogCW1hY2hfc2NoZWRfaW5pdCAgICAgID0gaHAzMDBfc2NoZWRfaW5pdDsKIAltYWNoX2luaXRfSVJRICAgICAgICA9IGhwMzAwX2luaXRfSVJROwotCW1hY2hfcmVxdWVzdF9pcnEgICAgID0gaHAzMDBfcmVxdWVzdF9pcnE7Ci0JbWFjaF9mcmVlX2lycSAgICAgICAgPSBocDMwMF9mcmVlX2lycTsKIAltYWNoX2dldF9tb2RlbCAgICAgICA9IGhwMzAwX2dldF9tb2RlbDsKLQltYWNoX2dldF9pcnFfbGlzdCAgICA9IHNob3dfaHAzMDBfaW50ZXJydXB0czsKIAltYWNoX2dldHRpbWVvZmZzZXQgICA9IGhwMzAwX2dldHRpbWVvZmZzZXQ7Ci0JbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmaHAzMDBfZGVmYXVsdF9oYW5kbGVyOwogCW1hY2hfaHdjbGsJICAgICA9IGhwMzAwX2h3Y2xrOwogCW1hY2hfZ2V0X3NzCSAgICAgPSBocDMwMF9nZXRfc3M7CiAJbWFjaF9yZXNldCAgICAgICAgICAgPSBocDMwMF9yZXNldDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9ocDMwMC9pbnRzLmMgYi9hcmNoL202OGsvaHAzMDAvaW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzViYjQwLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9ocDMwMC9pbnRzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoKLSAqICBsaW51eC9hcmNoL202OGsvaHAzMDAvaW50cy5jCi0gKgotICogIENvcHlyaWdodCAoQykgMTk5OCBQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Ci0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgSFAzMDAtc3BlY2lmaWMgaW50ZXJydXB0IGhhbmRsaW5nLgotICogIFdlIG9ubHkgdXNlIHRoZSBhdXRvdmVjdG9yIGludGVycnVwdHMsIGFuZCB0aGVyZWZvcmUgd2UgbmVlZCB0bwotICogIG1haW50YWluIGxpc3RzIG9mIGRldmljZXMgc2hhcmluZyBlYWNoIGlwbC4KLSAqICBbaXBsIGxpc3QgY29kZSBhZGRlZCBieSBQZXRlciBNYXlkZWxsIDxwbWF5ZGVsbEBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPiAwNi8xOTk4XQotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotI2luY2x1ZGUgImludHMuaCIKLQotLyogRWFjaCBpcGwgaGFzIGEgbGlua2VkIGxpc3Qgb2YgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZXMuCi0gKiBTZXJ2aWNlIHJvdXRpbmVzIGFyZSBhZGRlZCB2aWEgaHAzMDBfcmVxdWVzdF9pcnEoKSBhbmQgcmVtb3ZlZAotICogdmlhIGhwMzAwX2ZyZWVfaXJxKCkuIFRoZSBkZXZpY2UgZHJpdmVyIHNob3VsZCBzZXQgSVJRX0ZMR19GQVNUCi0gKiBpZiBpdCBuZWVkcyB0byBiZSBzZXJ2aWNlZCBlYXJseSAoZWcgRklGT2xlc3MgVUFSVHMpOyB0aGlzIHdpbGwKLSAqIGNhdXNlIGl0IHRvIGJlIGFkZGVkIGF0IHRoZSBmcm9udCBvZiB0aGUgcXVldWUgcmF0aGVyIHRoYW4KLSAqIHRoZSBiYWNrLgotICogQ3VycmVudGx5IElSUV9GTEdfU0xPVyBhbmQgZmxhZ3M9MCBhcmUgdHJlYXRlZCBpZGVudGljYWxseTsgaWYKLSAqIHdlIG5lZWRlZCB0aHJlZSBsZXZlbHMgb2YgcHJpb3JpdHkgd2UgY291bGQgZGlzdGluZ3Vpc2ggdGhlbQotICogYnV0IHRoaXMgc3RyaWtlcyBtZSBhcyBtaWxkbHkgdWdseS4uLgotICovCi0KLS8qIHdlIHN0YXJ0IHdpdGggbm8gZW50cmllcyBpbiBhbnkgbGlzdCAqLwotc3RhdGljIGlycV9ub2RlX3QgKmhwMzAwX2lycV9saXN0W0hQMzAwX05VTV9JUlFTXTsKLQotc3RhdGljIHNwaW5sb2NrX3QgaXJxbGlzdF9sb2NrOwotCi0vKiBUaGlzIGhhbmRsZXIgcmVjZWl2ZXMgYWxsIGludGVycnVwdHMsIGRpc3BhdGNoaW5nIHRoZW0gdG8gdGhlIHJlZ2lzdGVyZWQgaGFuZGxlcnMgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBocDMwMF9pbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLSAgICAgICAgaXJxX25vZGVfdCAqdDsKLSAgICAgICAgLyogV2UganVzdCBnaXZlIGV2ZXJ5IGhhbmRsZXIgb24gdGhlIGNoYWluIGFuIG9wcG9ydHVuaXR5IHRvIGhhbmRsZQotICAgICAgICAgKiB0aGUgaW50ZXJydXB0LCBpbiBwcmlvcml0eSBvcmRlci4KLSAgICAgICAgICovCi0gICAgICAgIGZvcih0ID0gaHAzMDBfaXJxX2xpc3RbaXJxXTsgdDsgdD10LT5uZXh0KQotICAgICAgICAgICAgICAgIHQtPmhhbmRsZXIoaXJxLCB0LT5kZXZfaWQsIGZwKTsKLSAgICAgICAgLyogV2UgY291bGQgcHV0IGluIHNvbWUgYWNjb3VudGluZyByb3V0aW5lcywgY2hlY2tzIGZvciBzdHJheSBpbnRlcnJ1cHRzLAotICAgICAgICAgKiBldGMsIGluIGhlcmUuIE5vdGUgdGhhdCBjdXJyZW50bHkgd2UgY2FuJ3QgdGVsbCB3aGV0aGVyIG9yIG5vdAotICAgICAgICAgKiBhIGhhbmRsZXIgaGFuZGxlcyB0aGUgaW50ZXJydXB0LCB0aG91Z2guCi0gICAgICAgICAqLwotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGhwMzAwX2JhZGludChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQludW1fc3B1cmlvdXMgKz0gMTsKLQlyZXR1cm4gSVJRX05PTkU7Ci19Ci0KLWlycXJldHVybl90ICgqaHAzMDBfZGVmYXVsdF9oYW5kbGVyW1NZU19JUlFTXSkoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopID0gewotCVswXSA9IGhwMzAwX2JhZGludCwKLQlbMV0gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbMl0gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbM10gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbNF0gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbNV0gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbNl0gPSBocDMwMF9pbnRfaGFuZGxlciwKLQlbN10gPSBocDMwMF9pbnRfaGFuZGxlcgotfTsKLQotLyogZGV2X2lkIGhhZCBiZXR0ZXIgYmUgdW5pcXVlIHRvIGVhY2ggaGFuZGxlciBiZWNhdXNlIGl0J3MgdGhlIG9ubHkgd2F5IHdlIGhhdmUKLSAqIHRvIGRpc3Rpbmd1aXNoIGhhbmRsZXJzIHdoZW4gcmVtb3ZpbmcgdGhlbS4uLgotICoKLSAqIEl0IHdvdWxkIGJlIHByZXR0eSBlYXN5IHRvIHN1cHBvcnQgSVJRX0ZMR19MT0NLIChoYW5kbGVyIGlzIG5vdCByZXBsYWNhYmxlKQotICogYW5kIElSUV9GTEdfUkVQTEFDRSAoaGFuZGxlciByZXBsYWNlcyBleGlzdGluZyBvbmUgd2l0aCB0aGlzIGRldl9pZCkKLSAqIGlmIHdlIHdhbnRlZCB0by4gSVJRX0ZMR19GQVNUIGlzIG5lZWRlZCBmb3IgZGV2aWNlcyB3aGVyZSBpbnRlcnJ1cHQgbGF0ZW5jeQotICogbWF0dGVycyAoZWcgdGhlIGRyZWFkZWQgRklGT2xlc3MgVUFSVC4uLikKLSAqLwotaW50IGhwMzAwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0gICAgICAgICAgICAgICAgICAgICAgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLSAgICAgICAgaXJxX25vZGVfdCAqdCwgKm4gPSBuZXdfaXJxX25vZGUoKTsKLQotICAgICAgICBpZiAoIW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvb3BzLCBubyBmcmVlIG5vZGVzICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci0KLSAgICAgICAgaWYgKCFocDMwMF9pcnFfbGlzdFtpcnFdKSB7Ci0gICAgICAgICAgICAgICAgLyogbm8gbGlzdCB5ZXQgKi8KLSAgICAgICAgICAgICAgICBocDMwMF9pcnFfbGlzdFtpcnFdID0gbjsKLSAgICAgICAgICAgICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIGlmIChmbGFncyAmIElSUV9GTEdfRkFTVCkgewotICAgICAgICAgICAgICAgIC8qIGluc2VydCBhdCBoZWFkIG9mIGxpc3QgKi8KLSAgICAgICAgICAgICAgICBuLT5uZXh0ID0gaHAzMDBfaXJxX2xpc3RbaXJxXTsKLSAgICAgICAgICAgICAgICBocDMwMF9pcnFfbGlzdFtpcnFdID0gbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBpbnNlcnQgYXQgZW5kIG9mIGxpc3QgKi8KLSAgICAgICAgICAgICAgICBmb3IodCA9IGhwMzAwX2lycV9saXN0W2lycV07IHQtPm5leHQ7IHQgPSB0LT5uZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLzsKLSAgICAgICAgICAgICAgICBuLT5uZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB0LT5uZXh0ID0gbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbGwgaW4gbiBhcHByb3ByaWF0ZWx5ICovCi0gICAgICAgIG4tPmhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICBuLT5mbGFncyA9IGZsYWdzOwotICAgICAgICBuLT5kZXZfaWQgPSBkZXZfaWQ7Ci0gICAgICAgIG4tPmRldm5hbWUgPSBkZXZuYW1lOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycWxpc3RfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi12b2lkIGhwMzAwX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLSAgICAgICAgaXJxX25vZGVfdCAqdDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci0KLSAgICAgICAgdCA9IGhwMzAwX2lycV9saXN0W2lycV07Ci0gICAgICAgIGlmICghdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIGhhbmRsZXJzIGF0IGFsbCBmb3IgdGhhdCBJUlEgKi8KLSAgICAgICAgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiaHAzMDBfZnJlZV9pcnE6IGF0dGVtcHQgdG8gcmVtb3ZlIG5vbmV4aXN0ZW50IGhhbmRsZXIgZm9yIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHQtPmRldl9pZCA9PSBkZXZfaWQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92aW5nIGZpcnN0IGhhbmRsZXIgb24gY2hhaW4gKi8KLSAgICAgICAgICAgICAgICB0LT5mbGFncyA9IElSUV9GTEdfU1REOyAgICAgICAgICAgLyogd2UgcHJvYmFibHkgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlc2UgKi8KLSAgICAgICAgICAgICAgICB0LT5kZXZfaWQgPSBOVUxMOwotICAgICAgICAgICAgICAgIHQtPmRldm5hbWUgPSBOVUxMOwotICAgICAgICAgICAgICAgIHQtPmhhbmRsZXIgPSBOVUxMOyAgICAgICAgICAgICAgICAvKiBmcmVlcyB0aGlzIGlycV9ub2RlX3QgKi8KLSAgICAgICAgICAgICAgICBocDMwMF9pcnFfbGlzdFtpcnFdID0gdC0+bmV4dDsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJxbGlzdF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE9LLCBtdXN0IGJlIHJlbW92aW5nIGZyb20gbWlkZGxlIG9mIHRoZSBjaGFpbiAqLwotCi0gICAgICAgIGZvciAodCA9IGhwMzAwX2lycV9saXN0W2lycV07IHQtPm5leHQgJiYgdC0+bmV4dC0+ZGV2X2lkICE9IGRldl9pZDsgdCA9IHQtPm5leHQpCi0gICAgICAgICAgICAgICAgLyogZG8gbm90aGluZyAqLzsKLSAgICAgICAgaWYgKCF0LT5uZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJocDMwMF9mcmVlX2lycTogYXR0ZW1wdCB0byByZW1vdmUgbm9uZXhpc3RlbnQgaGFuZGxlciBmb3IgSVJRICVkXG4iLCBpcnEpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIC8qIHJlbW92ZSB0aGUgZW50cnkgYWZ0ZXIgdDogKi8KLSAgICAgICAgdC0+bmV4dC0+ZmxhZ3MgPSBJUlFfRkxHX1NURDsKLSAgICAgICAgdC0+bmV4dC0+ZGV2X2lkID0gTlVMTDsKLQl0LT5uZXh0LT5kZXZuYW1lID0gTlVMTDsKLQl0LT5uZXh0LT5oYW5kbGVyID0gTlVMTDsKLSAgICAgICAgdC0+bmV4dCA9IHQtPm5leHQtPm5leHQ7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFsaXN0X2xvY2ssIGZsYWdzKTsKLX0KLQotaW50IHNob3dfaHAzMDBfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pbml0IGhwMzAwX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmlycWxpc3RfbG9jayk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaHAzMDAvaW50cy5oIGIvYXJjaC9tNjhrL2hwMzAwL2ludHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNmYWJlMi4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvaHAzMDAvaW50cy5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1leHRlcm4gdm9pZCBocDMwMF9pbml0X0lSUSh2b2lkKTsKLWV4dGVybiB2b2lkICgqaHAzMDBfaGFuZGxlcnNbOF0pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiB2b2lkIGhwMzAwX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gaW50IGhwMzAwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLQkJdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKTsKLQotLyogbnVtYmVyIG9mIGludGVycnVwdHMsIGluY2x1ZGVzIDAgKHdoYXQncyB0aGF0PykgKi8KLSNkZWZpbmUgSFAzMDBfTlVNX0lSUVMgOApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYyBiL2FyY2gvbTY4ay9ocDMwMC90aW1lLmMKaW5kZXggOGRhNWIxYi4uN2RmMDU2NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2hwMzAwL3RpbWUuYworKysgYi9hcmNoL202OGsvaHAzMDAvdGltZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogI2luY2x1ZGUgPGFzbS9ibGlua2VuLmg+Ci0jaW5jbHVkZSAiaW50cy5oIgogCiAvKiBDbG9jayBoYXJkd2FyZSBkZWZpbml0aW9ucyAqLwogCkBAIC03MSw3ICs3MCw3IEBACiAKICAgYXNtIHZvbGF0aWxlKCIgbW92cHcgJTAsJTFAKDUpIiA6IDogImQiIChJTlRWQUwpLCAiYSIgKENMT0NLQkFTRSkpOwogCi0gIGNwdV9yZXF1ZXN0X2lycSg2LCBocDMwMF90aWNrLCBJUlFfRkxHX1NURCwgInRpbWVyIHRpY2siLCB2ZWN0b3IpOworICByZXF1ZXN0X2lycShJUlFfQVVUT182LCBocDMwMF90aWNrLCBJUlFfRkxHX1NURCwgInRpbWVyIHRpY2siLCB2ZWN0b3IpOwogCiAgIG91dF84KENMT0NLQkFTRSArIENMS0NSMiwgMHgxKTsJCS8qIHNlbGVjdCBDUjEgKi8KICAgb3V0XzgoQ0xPQ0tCQVNFICsgQ0xLQ1IxLCAweDQwKTsJCS8qIGVuYWJsZSBpcnEgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCmluZGV4IDQ1ODkyNWMuLmRhZTYwOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw4ICs5LDggQEAKIGVuZGlmCiBleHRyYS15CSs9IHZtbGludXgubGRzCiAKLW9iai15CQk6PSBlbnRyeS5vIHByb2Nlc3MubyB0cmFwcy5vIGludHMubyBzaWduYWwubyBwdHJhY2UubyBcCi0JCQlzeXNfbTY4ay5vIHRpbWUubyBzZW1hcGhvcmUubyBzZXR1cC5vIG02OGtfa3N5bXMubworb2JqLXkJOj0gZW50cnkubyBwcm9jZXNzLm8gdHJhcHMubyBpbnRzLm8gZG1hLm8gc2lnbmFsLm8gcHRyYWNlLm8gXAorCSAgIHN5c19tNjhrLm8gdGltZS5vIHNlbWFwaG9yZS5vIHNldHVwLm8gbTY4a19rc3ltcy5vCiAKIG9iai0kKENPTkZJR19QQ0kpCSs9IGJpb3MzMi5vCiBvYmotJChDT05GSUdfTU9EVUxFUykJKz0gbW9kdWxlLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZG1hLmMgYi9hcmNoL202OGsva2VybmVsL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDQ5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL202OGsva2VybmVsL2RtYS5jCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorCit2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSBkbWFfYWRkcl90ICpoYW5kbGUsIGludCBmbGFnKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqKm1hcDsKKwlwZ3Byb3RfdCBwZ3Byb3Q7CisJdm9pZCAqYWRkcjsKKwlpbnQgaSwgb3JkZXI7CisKKwlwcl9kZWJ1ZygiZG1hX2FsbG9jX2NvaGVyZW50OiAlZCwleFxuIiwgc2l6ZSwgZmxhZyk7CisKKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKworCXBhZ2UgPSBhbGxvY19wYWdlcyhmbGFnLCBvcmRlcik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKworCSpoYW5kbGUgPSBwYWdlX3RvX3BoeXMocGFnZSk7CisJbWFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgPDwgb3JkZXIsIGZsYWcgJiB+X19HRlBfRE1BKTsKKwlpZiAoIW1hcCkgeworCQlfX2ZyZWVfcGFnZXMocGFnZSwgb3JkZXIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3BsaXRfcGFnZShwYWdlLCBvcmRlcik7CisKKwlvcmRlciA9IDEgPDwgb3JkZXI7CisJc2l6ZSA+Pj0gUEFHRV9TSElGVDsKKwltYXBbMF0gPSBwYWdlOworCWZvciAoaSA9IDE7IGkgPCBzaXplOyBpKyspCisJCW1hcFtpXSA9IHBhZ2UgKyBpOworCWZvciAoOyBpIDwgb3JkZXI7IGkrKykKKwkJX19mcmVlX3BhZ2UocGFnZSArIGkpOworCXBncHJvdCA9IF9fcGdwcm90KF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0RJUlRZKTsKKwlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApCisJCXBncHJvdF92YWwocGdwcm90KSB8PSBfUEFHRV9HTE9CQUwwNDAgfCBfUEFHRV9OT0NBQ0hFX1M7CisJZWxzZQorCQlwZ3Byb3RfdmFsKHBncHJvdCkgfD0gX1BBR0VfTk9DQUNIRTAzMDsKKwlhZGRyID0gdm1hcChtYXAsIHNpemUsIGZsYWcsIHBncHJvdCk7CisJa2ZyZWUobWFwKTsKKworCXJldHVybiBhZGRyOworfQorRVhQT1JUX1NZTUJPTChkbWFfYWxsb2NfY29oZXJlbnQpOworCit2b2lkIGRtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCSAgICAgICB2b2lkICphZGRyLCBkbWFfYWRkcl90IGhhbmRsZSkKK3sKKwlwcl9kZWJ1ZygiZG1hX2ZyZWVfY29oZXJlbnQ6ICVwLCAleFxuIiwgYWRkciwgaGFuZGxlKTsKKwl2ZnJlZShhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2ZyZWVfY29oZXJlbnQpOworCitpbmxpbmUgdm9pZCBkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBETUFfVE9fREVWSUNFOgorCQljYWNoZV9wdXNoKGhhbmRsZSwgc2l6ZSk7CisJCWJyZWFrOworCWNhc2UgRE1BX0ZST01fREVWSUNFOgorCQljYWNoZV9jbGVhcihoYW5kbGUsIHNpemUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKCJkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZTogdW5zdXBwb3J0ZWQgZGlyICV1XG4iLCBkaXIpOworCQlicmVhazsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKKwordm9pZCBkbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG5lbnRzLAorCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgc2crKywgaSsrKQorCQlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIHNnLT5kbWFfYWRkcmVzcywgc2ctPmxlbmd0aCwgZGlyKTsKK30KK0VYUE9SVF9TWU1CT0woZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7CisKK2RtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCSAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWRtYV9hZGRyX3QgaGFuZGxlID0gdmlydF90b19idXMoYWRkcik7CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGhhbmRsZSwgc2l6ZSwgZGlyKTsKKwlyZXR1cm4gaGFuZGxlOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3NpbmdsZSk7CisKK2RtYV9hZGRyX3QgZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJZG1hX2FkZHJfdCBoYW5kbGUgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7CisKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkZXYsIGhhbmRsZSwgc2l6ZSwgZGlyKTsKKwlyZXR1cm4gaGFuZGxlOworfQorRVhQT1JUX1NZTUJPTChkbWFfbWFwX3BhZ2UpOworCitpbnQgZG1hX21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5lbnRzOyBzZysrLCBpKyspIHsKKwkJc2ctPmRtYV9hZGRyZXNzID0gcGFnZV90b19waHlzKHNnLT5wYWdlKSArIHNnLT5vZmZzZXQ7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRldiwgc2ctPmRtYV9hZGRyZXNzLCBzZy0+bGVuZ3RoLCBkaXIpOworCX0KKwlyZXR1cm4gbmVudHM7Cit9CitFWFBPUlRfU1lNQk9MKGRtYV9tYXBfc2cpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCmluZGV4IDMyMGZkZTAuLjQ0OWI2MmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKQEAgLTQ1LDkgKzQ1LDExIEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKIC5nbG9ibCBzeXN0ZW1fY2FsbCwgYnVzZXJyLCB0cmFwLCByZXN1bWUKLS5nbG9ibCBpbnRoYW5kbGVyLCBzeXNfY2FsbF90YWJsZQorLmdsb2JsIHN5c19jYWxsX3RhYmxlCiAuZ2xvYmwgc3lzX2ZvcmssIHN5c19jbG9uZSwgc3lzX3Zmb3JrCiAuZ2xvYmwgcmV0X2Zyb21faW50ZXJydXB0LCBiYWRfaW50ZXJydXB0CisuZ2xvYmwgYXV0b19pcnFoYW5kbGVyX2ZpeHVwCisuZ2xvYmwgdXNlcl9pcnF2ZWNfZml4dXAsIHVzZXJfaXJxaGFuZGxlcl9maXh1cAogCiAudGV4dAogRU5UUlkoYnVzZXJyKQpAQCAtMTkxLDY1ICsxOTMsMjkgQEAKIAlqYnJhCXJlc3VtZV91c2Vyc3BhY2UKIAogCi0jaWYgMAotI2lmZGVmIENPTkZJR19BTUlHQQotYW1pX2ludGhhbmRsZXI6Ci0JYWRkcWwJIzEsaXJxX3N0YXQrQ1BVU1RBVF9MT0NBTF9JUlFfQ09VTlQKKy8qIFRoaXMgaXMgdGhlIG1haW4gaW50ZXJydXB0IGhhbmRsZXIgZm9yIGF1dG92ZWN0b3IgaW50ZXJydXB0cyAqLworCitFTlRSWShhdXRvX2ludGhhbmRsZXIpCiAJU0FWRV9BTExfSU5UCiAJR0VUX0NVUlJFTlQoJWQwKQotCi0JYmZleHR1CSVzcEAoUFRfVkVDVE9SKXsjNCwjMTJ9LCVkMAotCW1vdmVsCSVkMCwlYTAKLQlhZGRxbAkjMSwlYTBAKGtzdGF0K1NUQVRfSVJRLVZFQ09GRihWRUNfU1BVUikpCi0JbW92ZWwJJWEwQChhdXRvaXJxX2xpc3QtVkVDT0ZGKFZFQ19TUFVSKSksJWEwCi0KLXwgYW1pZ2EgdmVjdG9yIGludCBoYW5kbGVyIGdldCB0aGUgcmVxIG1hc2sgaW5zdGVhZCBvZiBpcnEgdmVjdG9yCi0JbGVhCUNVU1RPTUJBU0UsJWExCi0JbW92ZXcJJWExQChDX0lOVFJFUVIpLCVkMAotCWFuZHcJJWExQChDX0lOVEVOQVIpLCVkMAotCi18IHByZXBhcmUgc3RhY2sgKHB1c2ggZnJhbWUgcG9pbnRlciwgZGV2X2lkICYgcmVxIG1hc2spCi0JcGVhCSVzcEAKLQltb3ZlbAklYTBAKElSUV9ERVZJRCksJXNwQC0KLQltb3ZlbAklZDAsJXNwQC0KLQlwZWEJJXBjQChyZXRfZnJvbV9pbnRlcnJ1cHQ6dykKLQlqYnJhCUAoSVJRX0hBTkRMRVIsJWEwKUAoMCkKLQotRU5UUlkobm1pX2hhbmRsZXIpCi0JcnRlCi0jZW5kaWYKLSNlbmRpZgotCi0vKgotKiogVGhpcyBpcyB0aGUgbWFpbiBpbnRlcnJ1cHQgaGFuZGxlciwgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgcHJvY2Vzc19pbnQoKQotKi8KLWludGhhbmRsZXI6Ci0JU0FWRV9BTExfSU5UCi0JR0VUX0NVUlJFTlQoJWQwKQotCWFkZHFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzIpCisJYWRkcWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKIAkJCQkJfCAgcHV0IGV4Y2VwdGlvbiAjIGluIGQwCi0JYmZleHR1ICVzcEAoUFRfVkVDVE9SKXsjNCwjMTB9LCVkMAorCWJmZXh0dQklc3BAKFBUX1ZFQ1RPUil7IzQsIzEwfSwlZDAKKwlzdWJ3CSNWRUNfU1BVUiwlZDAKIAogCW1vdmVsCSVzcCwlc3BALQogCW1vdmVsCSVkMCwlc3BALQkJfCAgcHV0IHZlY3RvciAjIG9uIHN0YWNrCi0jaWYgZGVmaW5lZChNQUNIX1E0MF9PTkxZKSAmJiBkZWZpbmVkKENPTkZJR19CTEtfREVWX0ZEKQotCWJ0c3RiCSM0LDB4ZmYwMDAwMDAJCXwgUTQwIGZsb3BweSBuZWVkcyB2ZXJ5IHNwZWNpYWwgdHJlYXRtZW50IC4uLgotCWpiZXEJMWYKLQlidHN0YgkjMywweGZmMDAwMDA0Ci0JamJlcQkxZgotCWpic3IJZmxvcHB5X2hhcmRpbnQKLQlqYnJhCTNmCi0xOgotI2VuZGlmCi0JamJzcglwcm9jZXNzX2ludAkJfCAgcHJvY2VzcyB0aGUgSVJRCi0zOglhZGRxbAkjOCwlc3AJCQl8ICBwb3AgcGFyYW1ldGVycyBvZmYgc3RhY2sKK2F1dG9faXJxaGFuZGxlcl9maXh1cCA9IC4gKyAyCisJanNyCW02OGtfaGFuZGxlX2ludAkJfCAgcHJvY2VzcyB0aGUgSVJRCisJYWRkcWwJIzgsJXNwCQkJfCAgcG9wIHBhcmFtZXRlcnMgb2ZmIHN0YWNrCiAKIHJldF9mcm9tX2ludGVycnVwdDoKLQlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsyKQotCWplcQkxZgotMjoKLQlSRVNUT1JFX0FMTAotMToKKwlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQorCWplcQlyZXRfZnJvbV9sYXN0X2ludGVycnVwdAorMjoJUkVTVE9SRV9BTEwKKworCUFMSUdOCityZXRfZnJvbV9sYXN0X2ludGVycnVwdDoKIAltb3ZlcQkjKH5BTExPV0lOVD4+OCkmMHhmZiwlZDAKIAlhbmRiCSVzcEAoUFRfU1IpLCVkMAogCWpuZQkyYgpAQCAtMjYwLDEyICsyMjYsNDIgQEAKIAlwZWEJcmV0X2Zyb21fZXhjZXB0aW9uCiAJanJhCWRvX3NvZnRpcnEKIAorLyogSGFuZGxlciBmb3IgdXNlciBkZWZpbmVkIGludGVycnVwdCB2ZWN0b3JzICovCisKK0VOVFJZKHVzZXJfaW50aGFuZGxlcikKKwlTQVZFX0FMTF9JTlQKKwlHRVRfQ1VSUkVOVCglZDApCisJYWRkcWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKKwkJCQkJfCAgcHV0IGV4Y2VwdGlvbiAjIGluIGQwCisJYmZleHR1CSVzcEAoUFRfVkVDVE9SKXsjNCwjMTB9LCVkMAordXNlcl9pcnF2ZWNfZml4dXAgPSAuICsgMgorCXN1YncJI1ZFQ19VU0VSLCVkMAorCisJbW92ZWwJJXNwLCVzcEAtCisJbW92ZWwJJWQwLCVzcEAtCQl8ICBwdXQgdmVjdG9yICMgb24gc3RhY2sKK3VzZXJfaXJxaGFuZGxlcl9maXh1cCA9IC4gKyAyCisJanNyCW02OGtfaGFuZGxlX2ludAkJfCAgcHJvY2VzcyB0aGUgSVJRCisJYWRkcWwJIzgsJXNwCQkJfCAgcG9wIHBhcmFtZXRlcnMgb2ZmIHN0YWNrCisKKwlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQorCWplcQlyZXRfZnJvbV9sYXN0X2ludGVycnVwdAorCVJFU1RPUkVfQUxMCiAKIC8qIEhhbmRsZXIgZm9yIHVuaW5pdGlhbGl6ZWQgYW5kIHNwdXJpb3VzIGludGVycnVwdHMgKi8KIAotYmFkX2ludGVycnVwdDoKLQlhZGRxbAkjMSxudW1fc3B1cmlvdXMKLQlydGUKK0VOVFJZKGJhZF9pbnRoYW5kbGVyKQorCVNBVkVfQUxMX0lOVAorCUdFVF9DVVJSRU5UKCVkMCkKKwlhZGRxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQorCisJbW92ZWwJJXNwLCVzcEAtCisJanNyCWhhbmRsZV9iYWRpbnQKKwlhZGRxbAkjNCwlc3AKKworCXN1YnFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJamVxCXJldF9mcm9tX2xhc3RfaW50ZXJydXB0CisJUkVTVE9SRV9BTEwKKwogCiBFTlRSWShzeXNfZm9yaykKIAlTQVZFX1NXSVRDSF9TVEFDSwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9pbnRzLmMgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwppbmRleCA1MTRkMzIzLi41YTgzNDRiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2ludHMuYworKysgYi9hcmNoL202OGsva2VybmVsL2ludHMuYwpAQCAtMzksNDcgKzM5LDQwIEBACiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpZmRlZiBDT05GSUdfUTQwCiAjaW5jbHVkZSA8YXNtL3E0MGludHMuaD4KICNlbmRpZgogCi0vKiB0YWJsZSBmb3Igc3lzdGVtIGludGVycnVwdCBoYW5kbGVycyAqLwotc3RhdGljIGlycV9oYW5kbGVyX3QgaXJxX2xpc3RbU1lTX0lSUVNdOworZXh0ZXJuIHUzMiBhdXRvX2lycWhhbmRsZXJfZml4dXBbXTsKK2V4dGVybiB1MzIgdXNlcl9pcnFoYW5kbGVyX2ZpeHVwW107CitleHRlcm4gdTE2IHVzZXJfaXJxdmVjX2ZpeHVwW107CiAKLXN0YXRpYyBjb25zdCBjaGFyICpkZWZhdWx0X25hbWVzW1NZU19JUlFTXSA9IHsKLQlbMF0gPSAic3B1cmlvdXMgaW50IiwKLQlbMV0gPSAiaW50MSBoYW5kbGVyIiwKLQlbMl0gPSAiaW50MiBoYW5kbGVyIiwKLQlbM10gPSAiaW50MyBoYW5kbGVyIiwKLQlbNF0gPSAiaW50NCBoYW5kbGVyIiwKLQlbNV0gPSAiaW50NSBoYW5kbGVyIiwKLQlbNl0gPSAiaW50NiBoYW5kbGVyIiwKLQlbN10gPSAiaW50NyBoYW5kbGVyIgorLyogdGFibGUgZm9yIHN5c3RlbSBpbnRlcnJ1cHQgaGFuZGxlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaXJxX25vZGUgKmlycV9saXN0W05SX0lSUVNdOworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciAqaXJxX2NvbnRyb2xsZXJbTlJfSVJRU107CitzdGF0aWMgaW50IGlycV9kZXB0aFtOUl9JUlFTXTsKKworc3RhdGljIGludCBtNjhrX2ZpcnN0X3VzZXJfdmVjOworCitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIGF1dG9faXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gImF1dG8iLAorCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkuc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCisJLnNodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCiB9OwogCi0vKiBUaGUgbnVtYmVyIG9mIHNwdXJpb3VzIGludGVycnVwdHMgKi8KLXZvbGF0aWxlIHVuc2lnbmVkIGludCBudW1fc3B1cmlvdXM7CitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIHVzZXJfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gInVzZXIiLAorCS5sb2NrCQk9IFNQSU5fTE9DS19VTkxPQ0tFRCwKKwkuc3RhcnR1cAk9IG02OGtfaXJxX3N0YXJ0dXAsCisJLnNodXRkb3duCT0gbTY4a19pcnFfc2h1dGRvd24sCit9OwogCiAjZGVmaW5lIE5VTV9JUlFfTk9ERVMgMTAwCiBzdGF0aWMgaXJxX25vZGVfdCBub2Rlc1tOVU1fSVJRX05PREVTXTsKIAotc3RhdGljIHZvaWQgZHVtbXlfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGR1bW15X2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotc3RhdGljIGludCBkdW1teV9yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLAotCQlpcnFyZXR1cm5fdCAoKmhhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7Ci1zdGF0aWMgdm9pZCBkdW1teV9mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotCi12b2lkICgqZW5hYmxlX2lycSkgKHVuc2lnbmVkIGludCkgPSBkdW1teV9lbmFibGVfaXJxOwotdm9pZCAoKmRpc2FibGVfaXJxKSAodW5zaWduZWQgaW50KSA9IGR1bW15X2Rpc2FibGVfaXJxOwotCi1pbnQgKCptYWNoX3JlcXVlc3RfaXJxKSAodW5zaWduZWQgaW50LCBpcnFyZXR1cm5fdCAoKikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcsIGNvbnN0IGNoYXIgKiwgdm9pZCAqKSA9IGR1bW15X3JlcXVlc3RfaXJxOwotdm9pZCAoKm1hY2hfZnJlZV9pcnEpICh1bnNpZ25lZCBpbnQsIHZvaWQgKikgPSBkdW1teV9mcmVlX2lycTsKLQotdm9pZCBpbml0X2lycV9wcm9jKHZvaWQpOwotCiAvKgogICogdm9pZCBpbml0X0lSUSh2b2lkKQogICoKQEAgLTk1LDE4ICs4OCw3NiBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFNZU19JUlFTOyBpKyspIHsKLQkJaWYgKG1hY2hfZGVmYXVsdF9oYW5kbGVyKQotCQkJaXJxX2xpc3RbaV0uaGFuZGxlciA9ICgqbWFjaF9kZWZhdWx0X2hhbmRsZXIpW2ldOwotCQlpcnFfbGlzdFtpXS5mbGFncyAgID0gMDsKLQkJaXJxX2xpc3RbaV0uZGV2X2lkICA9IE5VTEw7Ci0JCWlycV9saXN0W2ldLmRldm5hbWUgPSBkZWZhdWx0X25hbWVzW2ldOworCS8qIGFzc2VtYmx5IGlycSBlbnRyeSBjb2RlIHJlbGllcyBvbiB0aGlzLi4uICovCisJaWYgKEhBUkRJUlFfTUFTSyAhPSAweDAwZmYwMDAwKSB7CisJCWV4dGVybiB2b2lkIGhhcmRpcnFfbWFza19pc19icm9rZW4odm9pZCk7CisJCWhhcmRpcnFfbWFza19pc19icm9rZW4oKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lSUV9OT0RFUzsgaSsrKQotCQlub2Rlc1tpXS5oYW5kbGVyID0gTlVMTDsKKwlmb3IgKGkgPSBJUlFfQVVUT18xOyBpIDw9IElSUV9BVVRPXzc7IGkrKykKKwkJaXJxX2NvbnRyb2xsZXJbaV0gPSAmYXV0b19pcnFfY29udHJvbGxlcjsKIAotCW1hY2hfaW5pdF9JUlEgKCk7CisJbWFjaF9pbml0X0lSUSgpOworfQorCisvKioKKyAqIG02OGtfc2V0dXBfYXV0b19pbnRlcnJ1cHQKKyAqIEBoYW5kbGVyOiBjYWxsZWQgZnJvbSBhdXRvIHZlY3RvciBpbnRlcnJ1cHRzCisgKgorICogc2V0dXAgdGhlIGhhbmRsZXIgdG8gYmUgY2FsbGVkIGZyb20gYXV0byB2ZWN0b3IgaW50ZXJydXB0cyBpbnN0ZWFkIG9mIHRoZQorICogc3RhbmRhcmQgbTY4a19oYW5kbGVfaW50KCksIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggaXJxIG51bWJlcnMgaW4gdGhlIHJhbmdlCisgKiBmcm9tIElSUV9BVVRPXzEgLSBJUlFfQVVUT183LgorICovCit2b2lkIF9faW5pdCBtNjhrX3NldHVwX2F1dG9faW50ZXJydXB0KHZvaWQgKCpoYW5kbGVyKSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopKQoreworCWlmIChoYW5kbGVyKQorCQkqYXV0b19pcnFoYW5kbGVyX2ZpeHVwID0gKHUzMiloYW5kbGVyOworCWZsdXNoX2ljYWNoZSgpOworfQorCisvKioKKyAqIG02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQKKyAqIEB2ZWM6IGZpcnN0IHVzZXIgdmVjdG9yIGludGVycnVwdCB0byBoYW5kbGUKKyAqIEBjbnQ6IG51bWJlciBvZiBhY3RpdmUgdXNlciB2ZWN0b3IgaW50ZXJydXB0cworICogQGhhbmRsZXI6IGNhbGxlZCBmcm9tIHVzZXIgdmVjdG9yIGludGVycnVwdHMKKyAqCisgKiBzZXR1cCB1c2VyIHZlY3RvciBpbnRlcnJ1cHRzLCB0aGlzIGluY2x1ZGVzIGFjdGl2YXRpbmcgdGhlIHNwZWNpZmllZCByYW5nZQorICogb2YgaW50ZXJydXB0cywgb25seSB0aGVuIHRoZXNlIGludGVycnVwdHMgY2FuIGJlIHJlcXVlc3RlZCAobm90ZTogdGhpcyBpcworICogZGlmZmVyZW50IGZyb20gYXV0byB2ZWN0b3IgaW50ZXJydXB0cykuIEFuIG9wdGlvbmFsIGhhbmRsZXIgY2FuIGJlIGluc3RhbGxlZAorICogdG8gYmUgY2FsbGVkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgbTY4a19oYW5kbGVfaW50KCksIGl0IHdpbGwgYmUgY2FsbGVkCisgKiB3aXRoIGlycSBudW1iZXJzIHN0YXJ0aW5nIGZyb20gSVJRX1VTRVIuCisgKi8KK3ZvaWQgX19pbml0IG02OGtfc2V0dXBfdXNlcl9pbnRlcnJ1cHQodW5zaWduZWQgaW50IHZlYywgdW5zaWduZWQgaW50IGNudCwKKwkJCQkgICAgICB2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSkKK3sKKwlpbnQgaTsKKworCW02OGtfZmlyc3RfdXNlcl92ZWMgPSB2ZWM7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKQorCQlpcnFfY29udHJvbGxlcltJUlFfVVNFUiArIGldID0gJnVzZXJfaXJxX2NvbnRyb2xsZXI7CisJKnVzZXJfaXJxdmVjX2ZpeHVwID0gdmVjIC0gSVJRX1VTRVI7CisJaWYgKGhhbmRsZXIpCisJCSp1c2VyX2lycWhhbmRsZXJfZml4dXAgPSAodTMyKWhhbmRsZXI7CisJZmx1c2hfaWNhY2hlKCk7Cit9CisKKy8qKgorICogbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcgorICogQGNvbnRyOiBpcnEgY29udHJvbGxlciB3aGljaCBjb250cm9scyBzcGVjaWZpZWQgaXJxCisgKiBAaXJxOiBmaXJzdCBpcnEgdG8gYmUgbWFuYWdlZCBieSB0aGUgY29udHJvbGxlcgorICoKKyAqIENoYW5nZSB0aGUgY29udHJvbGxlciBmb3IgdGhlIHNwZWNpZmllZCByYW5nZSBvZiBpcnEsIHdoaWNoIHdpbGwgYmUgdXNlZCB0bworICogbWFuYWdlIHRoZXNlIGlycS4gYXV0by91c2VyIGlycSBhbHJlYWR5IGhhdmUgYSBkZWZhdWx0IGNvbnRyb2xsZXIsIHdoaWNoIGNhbgorICogYmUgY2hhbmdlZCBhcyB3ZWxsLCBidXQgdGhlIGNvbnRyb2xsZXIgcHJvYmFibHkgc2hvdWxkIHVzZSBtNjhrX2lycV9zdGFydHVwLworICogbTY4a19pcnFfc2h1dGRvd24uCisgKi8KK3ZvaWQgbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcihzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyLCB1bnNpZ25lZCBpbnQgaXJxLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCWlycV9jb250cm9sbGVyW2lycSArIGldID0gY29udHI7CiB9CiAKIGlycV9ub2RlX3QgKm5ld19pcnFfbm9kZSh2b2lkKQpAQCAtMTE0LDg0ICsxNjUsMTgzIEBACiAJaXJxX25vZGVfdCAqbm9kZTsKIAlzaG9ydCBpOwogCi0JZm9yIChub2RlID0gbm9kZXMsIGkgPSBOVU1fSVJRX05PREVTLTE7IGkgPj0gMDsgbm9kZSsrLCBpLS0pCi0JCWlmICghbm9kZS0+aGFuZGxlcikKKwlmb3IgKG5vZGUgPSBub2RlcywgaSA9IE5VTV9JUlFfTk9ERVMtMTsgaSA+PSAwOyBub2RlKyssIGktLSkgeworCQlpZiAoIW5vZGUtPmhhbmRsZXIpIHsKKwkJCW1lbXNldChub2RlLCAwLCBzaXplb2YoKm5vZGUpKTsKIAkJCXJldHVybiBub2RlOworCQl9CisJfQogCiAJcHJpbnRrICgibmV3X2lycV9ub2RlOiBvdXQgb2Ygbm9kZXNcbiIpOwogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogV2Ugd2lsbCBrZWVwIHRoZXNlIGZ1bmN0aW9ucyB1bnRpbCBJIGhhdmUgY29udmluY2VkIExpbnVzIHRvIG1vdmUKLSAqIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGVtIGZyb20gaW5jbHVkZS9saW51eC9zY2hlZC5oIHRvCi0gKiBpbmNsdWRlL2FzbS9pcnEuaC4KLSAqLworaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKKwlzdHJ1Y3QgaXJxX25vZGUgKipwcmV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIShjb250ciA9IGlycV9jb250cm9sbGVyW2lycV0pKSB7CisJCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBub2RlLT5kZXZuYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY29udHItPmxvY2ssIGZsYWdzKTsKKworCXByZXYgPSBpcnFfbGlzdCArIGlycTsKKwlpZiAoKnByZXYpIHsKKwkJLyogQ2FuJ3Qgc2hhcmUgaW50ZXJydXB0cyB1bmxlc3MgYm90aCBhZ3JlZSB0byAqLworCQlpZiAoISgoKnByZXYpLT5mbGFncyAmIG5vZGUtPmZsYWdzICYgU0FfU0hJUlEpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQl3aGlsZSAoKnByZXYpCisJCQlwcmV2ID0gJigqcHJldiktPm5leHQ7CisJfQorCisJaWYgKCFpcnFfbGlzdFtpcnFdKSB7CisJCWlmIChjb250ci0+c3RhcnR1cCkKKwkJCWNvbnRyLT5zdGFydHVwKGlycSk7CisJCWVsc2UKKwkJCWNvbnRyLT5lbmFibGUoaXJxKTsKKwl9CisJbm9kZS0+bmV4dCA9IE5VTEw7CisJKnByZXYgPSBub2RlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCiBpbnQgcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKIAkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAogCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCiB7Ci0JcmV0dXJuIG1hY2hfcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLCBmbGFncywgZGV2bmFtZSwgZGV2X2lkKTsKKwlzdHJ1Y3QgaXJxX25vZGUgKm5vZGU7CisJaW50IHJlczsKKworCW5vZGUgPSBuZXdfaXJxX25vZGUoKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCisJbm9kZS0+aGFuZGxlciA9IGhhbmRsZXI7CisJbm9kZS0+ZmxhZ3MgICA9IGZsYWdzOworCW5vZGUtPmRldl9pZCAgPSBkZXZfaWQ7CisJbm9kZS0+ZGV2bmFtZSA9IGRldm5hbWU7CisKKwlyZXMgPSBzZXR1cF9pcnEoaXJxLCBub2RlKTsKKwlpZiAocmVzKQorCQlub2RlLT5oYW5kbGVyID0gTlVMTDsKKworCXJldHVybiByZXM7CiB9CiAKIEVYUE9SVF9TWU1CT0wocmVxdWVzdF9pcnEpOwogCiB2b2lkIGZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQltYWNoX2ZyZWVfaXJxKGlycSwgZGV2X2lkKTsKLX0KKwlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOworCXN0cnVjdCBpcnFfbm9kZSAqKnAsICpub2RlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLUVYUE9SVF9TWU1CT0woZnJlZV9pcnEpOwotCi1pbnQgY3B1X3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0gICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0JaWYgKGlycSA8IElSUTEgfHwgaXJxID4gSVJRNykgewotCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0jaWYgMAotCWlmICghKGlycV9saXN0W2lycV0uZmxhZ3MgJiBJUlFfRkxHX1NURCkpIHsKLQkJaWYgKGlycV9saXN0W2lycV0uZmxhZ3MgJiBJUlFfRkxHX0xPQ0spIHsKLQkJCXByaW50aygiJXM6IElSUSAlZCBmcm9tICVzIGlzIG5vdCByZXBsYWNlYWJsZVxuIiwKLQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX2xpc3RbaXJxXS5kZXZuYW1lKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJaWYgKCEoZmxhZ3MgJiBJUlFfRkxHX1JFUExBQ0UpKSB7Ci0JCQlwcmludGsoIiVzOiAlcyBjYW4ndCByZXBsYWNlIElSUSAlZCBmcm9tICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGV2bmFtZSwgaXJxLCBpcnFfbGlzdFtpcnFdLmRldm5hbWUpOwotCQkJcmV0dXJuIC1FQlVTWTsKLQkJfQotCX0KLSNlbmRpZgotCi0JaXJxX2xpc3RbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfbGlzdFtpcnFdLmZsYWdzICAgPSBmbGFnczsKLQlpcnFfbGlzdFtpcnFdLmRldl9pZCAgPSBkZXZfaWQ7Ci0JaXJxX2xpc3RbaXJxXS5kZXZuYW1lID0gZGV2bmFtZTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBjcHVfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPCBJUlExIHx8IGlycSA+IElSUTcpIHsKKwlpZiAoaXJxID49IE5SX0lSUVMgfHwgIShjb250ciA9IGlycV9jb250cm9sbGVyW2lycV0pKSB7CiAJCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChpcnFfbGlzdFtpcnFdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV9saXN0W2lycV0uZGV2bmFtZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7CiAKLQlpcnFfbGlzdFtpcnFdLmhhbmRsZXIgPSAoKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtpcnFdOwotCWlycV9saXN0W2lycV0uZmxhZ3MgICA9IDA7Ci0JaXJxX2xpc3RbaXJxXS5kZXZfaWQgID0gTlVMTDsKLQlpcnFfbGlzdFtpcnFdLmRldm5hbWUgPSBkZWZhdWx0X25hbWVzW2lycV07CisJcCA9IGlycV9saXN0ICsgaXJxOworCXdoaWxlICgobm9kZSA9ICpwKSkgeworCQlpZiAobm9kZS0+ZGV2X2lkID09IGRldl9pZCkKKwkJCWJyZWFrOworCQlwID0gJm5vZGUtPm5leHQ7CisJfQorCisJaWYgKG5vZGUpIHsKKwkJKnAgPSBub2RlLT5uZXh0OworCQlub2RlLT5oYW5kbGVyID0gTlVMTDsKKwl9IGVsc2UKKwkJcHJpbnRrKCIlczogUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEpOworCisJaWYgKCFpcnFfbGlzdFtpcnFdKSB7CisJCWlmIChjb250ci0+c2h1dGRvd24pCisJCQljb250ci0+c2h1dGRvd24oaXJxKTsKKwkJZWxzZQorCQkJY29udHItPmRpc2FibGUoaXJxKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOwogfQogCitFWFBPUlRfU1lNQk9MKGZyZWVfaXJxKTsKKwordm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlycV9jb250cm9sbGVyICpjb250cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGlycSA+PSBOUl9JUlFTIHx8ICEoY29udHIgPSBpcnFfY29udHJvbGxlcltpcnFdKSkgeworCQlwcmludGsoIiVzOiBJbmNvcnJlY3QgSVJRICVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyLT5sb2NrLCBmbGFncyk7CisJaWYgKGlycV9kZXB0aFtpcnFdKSB7CisJCWlmICghLS1pcnFfZGVwdGhbaXJxXSkgeworCQkJaWYgKGNvbnRyLT5lbmFibGUpCisJCQkJY29udHItPmVuYWJsZShpcnEpOworCQl9CisJfSBlbHNlCisJCVdBUk5fT04oMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHItPmxvY2ssIGZsYWdzKTsKK30KKworRVhQT1JUX1NZTUJPTChlbmFibGVfaXJxKTsKKwordm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfY29udHJvbGxlciAqY29udHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpcnEgPj0gTlJfSVJRUyB8fCAhKGNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaXJxXSkpIHsKKwkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgaXJxKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjb250ci0+bG9jaywgZmxhZ3MpOworCWlmICghaXJxX2RlcHRoW2lycV0rKykgeworCQlpZiAoY29udHItPmRpc2FibGUpCisJCQljb250ci0+ZGlzYWJsZShpcnEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250ci0+bG9jaywgZmxhZ3MpOworfQorCitFWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKKworaW50IG02OGtfaXJxX3N0YXJ0dXAodW5zaWduZWQgaW50IGlycSkKK3sKKwlpZiAoaXJxIDw9IElSUV9BVVRPXzcpCisJCXZlY3RvcnNbVkVDX1NQVVIgKyBpcnFdID0gYXV0b19pbnRoYW5kbGVyOworCWVsc2UKKwkJdmVjdG9yc1ttNjhrX2ZpcnN0X3VzZXJfdmVjICsgaXJxIC0gSVJRX1VTRVJdID0gdXNlcl9pbnRoYW5kbGVyOworCXJldHVybiAwOworfQorCit2b2lkIG02OGtfaXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKGlycSA8PSBJUlFfQVVUT183KQorCQl2ZWN0b3JzW1ZFQ19TUFVSICsgaXJxXSA9IGJhZF9pbnRoYW5kbGVyOworCWVsc2UKKwkJdmVjdG9yc1ttNjhrX2ZpcnN0X3VzZXJfdmVjICsgaXJxIC0gSVJRX1VTRVJdID0gYmFkX2ludGhhbmRsZXI7Cit9CisKKwogLyoKICAqIERvIHdlIG5lZWQgdGhlc2UgcHJvYmUgZnVuY3Rpb25zIG9uIHRoZSBtNjhrPwogICoKQEAgLTIxOSw1OCArMzY5LDUwIEBACiAKIEVYUE9SVF9TWU1CT0wocHJvYmVfaXJxX29mZik7CiAKLXN0YXRpYyB2b2lkIGR1bW15X2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKK3Vuc2lnbmVkIGludCBpcnFfY2Fub25pY2FsaXplKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJpbnRrKCJjYWxsaW5nIHVuaW5pdGlhbGl6ZWQgZW5hYmxlX2lycSgpXG4iKTsKKyNpZmRlZiBDT05GSUdfUTQwCisJaWYgKE1BQ0hfSVNfUTQwICYmIGlycSA9PSAxMSkKKwkJaXJxID0gMTA7CisjZW5kaWYKKwlyZXR1cm4gaXJxOwogfQogCi1zdGF0aWMgdm9pZCBkdW1teV9kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQorRVhQT1JUX1NZTUJPTChpcnFfY2Fub25pY2FsaXplKTsKKworYXNtbGlua2FnZSB2b2lkIG02OGtfaGFuZGxlX2ludCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlwcmludGsoImNhbGxpbmcgdW5pbml0aWFsaXplZCBkaXNhYmxlX2lycSgpXG4iKTsKKwlzdHJ1Y3QgaXJxX25vZGUgKm5vZGU7CisKKwlrc3RhdF9jcHUoMCkuaXJxc1tpcnFdKys7CisJbm9kZSA9IGlycV9saXN0W2lycV07CisJZG8geworCQlub2RlLT5oYW5kbGVyKGlycSwgbm9kZS0+ZGV2X2lkLCByZWdzKTsKKwkJbm9kZSA9IG5vZGUtPm5leHQ7CisJfSB3aGlsZSAobm9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgZHVtbXlfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCithc21saW5rYWdlIHZvaWQgaGFuZGxlX2JhZGludChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlwcmludGsoImNhbGxpbmcgdW5pbml0aWFsaXplZCByZXF1ZXN0X2lycSgpXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtbXlfZnJlZV9pcnEodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXByaW50aygiY2FsbGluZyB1bmluaXRpYWxpemVkIGRpc2FibGVfaXJxKClcbiIpOwotfQotCi1hc21saW5rYWdlIHZvaWQgcHJvY2Vzc19pbnQodW5zaWduZWQgbG9uZyB2ZWMsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpZiAodmVjID49IFZFQ19JTlQxICYmIHZlYyA8PSBWRUNfSU5UNyAmJiAhTUFDSF9JU19CVk1FNjAwMCkgewotCQl2ZWMgLT0gVkVDX1NQVVI7Ci0JCWtzdGF0X2NwdSgwKS5pcnFzW3ZlY10rKzsKLQkJaXJxX2xpc3RbdmVjXS5oYW5kbGVyKHZlYywgaXJxX2xpc3RbdmVjXS5kZXZfaWQsIGZwKTsKLQl9IGVsc2UgewotCQlpZiAobWFjaF9wcm9jZXNzX2ludCkKLQkJCW1hY2hfcHJvY2Vzc19pbnQodmVjLCBmcCk7Ci0JCWVsc2UKLQkJCXBhbmljKCJDYW4ndCBwcm9jZXNzIGludGVycnVwdCB2ZWN0b3IgJWxkXG4iLCB2ZWMpOwotCQlyZXR1cm47Ci0JfQorCWtzdGF0X2NwdSgwKS5pcnFzWzBdKys7CisJcHJpbnRrKCJ1bmV4cGVjdGVkIGludGVycnVwdCBmcm9tICV1XG4iLCByZWdzLT52ZWN0b3IpOwogfQogCiBpbnQgc2hvd19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKIHsKKwlzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKmNvbnRyOworCXN0cnVjdCBpcnFfbm9kZSAqbm9kZTsKIAlpbnQgaSA9ICoobG9mZl90ICopIHY7CiAKIAkvKiBhdXRvdmVjdG9yIGludGVycnVwdHMgKi8KLQlpZiAoaSA8IFNZU19JUlFTKSB7Ci0JCWlmIChtYWNoX2RlZmF1bHRfaGFuZGxlcikgewotCQkJc2VxX3ByaW50ZihwLCAiYXV0byAlMmQ6ICUxMHUgIiwgaSwKLQkJCSAgICAgICAgICAgICAgIGkgPyBrc3RhdF9jcHUoMCkuaXJxc1tpXSA6IG51bV9zcHVyaW91cyk7Ci0JCQlzZXFfcHV0cyhwLCAiICAiKTsKLQkJCXNlcV9wcmludGYocCwgIiVzXG4iLCBpcnFfbGlzdFtpXS5kZXZuYW1lKTsKLQkJfQotCX0gZWxzZSBpZiAoaSA9PSBTWVNfSVJRUykKLQkJbWFjaF9nZXRfaXJxX2xpc3QocCwgdik7CisJaWYgKGlycV9saXN0W2ldKSB7CisJCWNvbnRyID0gaXJxX2NvbnRyb2xsZXJbaV07CisJCW5vZGUgPSBpcnFfbGlzdFtpXTsKKwkJc2VxX3ByaW50ZihwLCAiJS04cyAlM3U6ICUxMHUgJXMiLCBjb250ci0+bmFtZSwgaSwga3N0YXRfY3B1KDApLmlycXNbaV0sIG5vZGUtPmRldm5hbWUpOworCQl3aGlsZSAoKG5vZGUgPSBub2RlLT5uZXh0KSkKKwkJCXNlcV9wcmludGYocCwgIiwgJXMiLCBub2RlLT5kZXZuYW1lKTsKKwkJc2VxX3B1dHMocCwgIlxuIik7CisJfQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IDViNzk1MmUuLjFmNWUxYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCkBAIC01Nyw4ICs1Nyw2IEBACiBFWFBPUlRfU1lNQk9MKHN0cm5sZW4pOwogRVhQT1JUX1NZTUJPTChzdHJyY2hyKTsKIEVYUE9SVF9TWU1CT0woc3Ryc3RyKTsKLUVYUE9SVF9TWU1CT0woZW5hYmxlX2lycSk7Ci1FWFBPUlRfU1lNQk9MKGRpc2FibGVfaXJxKTsKIEVYUE9SVF9TWU1CT0woa2VybmVsX3RocmVhZCk7CiAjaWZkZWYgQ09ORklHX1ZNRQogRVhQT1JUX1NZTUJPTCh2bWVfYnJkdHlwZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NldHVwLmMgYi9hcmNoL202OGsva2VybmVsL3NldHVwLmMKaW5kZXggNzUwZDViMy4uMjE0YTk1ZiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXAuYwpAQCAtNjgsMTEgKzY4LDggQEAKIHZvaWQgKCptYWNoX3NjaGVkX2luaXQpIChpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSkgX19pbml0ZGF0YSA9IE5VTEw7CiAvKiBtYWNoaW5lIGRlcGVuZGVudCBpcnEgZnVuY3Rpb25zICovCiB2b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpIF9faW5pdGRhdGEgPSBOVUxMOwotaXJxcmV0dXJuX3QgKCooKm1hY2hfZGVmYXVsdF9oYW5kbGVyKVtdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogdm9pZCAoKm1hY2hfZ2V0X21vZGVsKSAoY2hhciAqbW9kZWwpOwogaW50ICgqbWFjaF9nZXRfaGFyZHdhcmVfbGlzdCkgKGNoYXIgKmJ1ZmZlcik7Ci1pbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotaXJxcmV0dXJuX3QgKCptYWNoX3Byb2Nlc3NfaW50KSAoaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IHRpbWVyIGZ1bmN0aW9ucyAqLwogdW5zaWduZWQgbG9uZyAoKm1hY2hfZ2V0dGltZW9mZnNldCkgKHZvaWQpOwogaW50ICgqbWFjaF9od2NsaykgKGludCwgc3RydWN0IHJ0Y190aW1lKik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NjY5MTdiLi5mOWFmODkzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKQEAgLTc2Myw3ICs3NjMsNyBAQAogCiAJLyogVGhpcyBpcyB0aGUgWC9PcGVuIHNhbmN0aW9uZWQgc2lnbmFsIHN0YWNrIHN3aXRjaGluZy4gICovCiAJaWYgKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spIHsKLQkJaWYgKCFvbl9zaWdfc3RhY2sodXNwKSkKKwkJaWYgKCFzYXNfc3NfZmxhZ3ModXNwKSkKIAkJCXVzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCX0KIAlyZXR1cm4gKHZvaWQgX191c2VyICopKCh1c3AgLSBmcmFtZV9zaXplKSAmIC04VUwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCmluZGV4IGNkZjU4ZmIuLmU4NmRlN2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKIGFzbWxpbmthZ2Ugdm9pZCBzeXN0ZW1fY2FsbCh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBidXNlcnIodm9pZCk7CiBhc21saW5rYWdlIHZvaWQgdHJhcCh2b2lkKTsKLWFzbWxpbmthZ2Ugdm9pZCBpbnRoYW5kbGVyKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIG5taWhhbmRsZXIodm9pZCk7CiAjaWZkZWYgQ09ORklHX002OEtGUFVfRU1VCiBhc21saW5rYWdlIHZvaWQgZnB1X2VtdSh2b2lkKTsKQEAgLTUzLDUxICs1Miw3IEBACiAKIGVfdmVjdG9yIHZlY3RvcnNbMjU2XSA9IHsKIAlbVkVDX0JVU0VSUl0JPSBidXNlcnIsCi0JW1ZFQ19BRERSRVJSXQk9IHRyYXAsCi0JW1ZFQ19JTExFR0FMXQk9IHRyYXAsCi0JW1ZFQ19aRVJPRElWXQk9IHRyYXAsCi0JW1ZFQ19DSEtdCT0gdHJhcCwKLQlbVkVDX1RSQVBdCT0gdHJhcCwKLQlbVkVDX1BSSVZdCT0gdHJhcCwKLQlbVkVDX1RSQUNFXQk9IHRyYXAsCi0JW1ZFQ19MSU5FMTBdCT0gdHJhcCwKLQlbVkVDX0xJTkUxMV0JPSB0cmFwLAotCVtWRUNfUkVTVjEyXQk9IHRyYXAsCi0JW1ZFQ19DT1BST0NdCT0gdHJhcCwKLQlbVkVDX0ZPUk1BVF0JPSB0cmFwLAotCVtWRUNfVU5JTlRdCT0gdHJhcCwKLQlbVkVDX1JFU1YxNl0JPSB0cmFwLAotCVtWRUNfUkVTVjE3XQk9IHRyYXAsCi0JW1ZFQ19SRVNWMThdCT0gdHJhcCwKLQlbVkVDX1JFU1YxOV0JPSB0cmFwLAotCVtWRUNfUkVTVjIwXQk9IHRyYXAsCi0JW1ZFQ19SRVNWMjFdCT0gdHJhcCwKLQlbVkVDX1JFU1YyMl0JPSB0cmFwLAotCVtWRUNfUkVTVjIzXQk9IHRyYXAsCi0JW1ZFQ19TUFVSXQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQxXQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQyXQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQzXQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQ0XQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQ1XQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQ2XQk9IGludGhhbmRsZXIsCi0JW1ZFQ19JTlQ3XQk9IGludGhhbmRsZXIsCiAJW1ZFQ19TWVNdCT0gc3lzdGVtX2NhbGwsCi0JW1ZFQ19UUkFQMV0JPSB0cmFwLAotCVtWRUNfVFJBUDJdCT0gdHJhcCwKLQlbVkVDX1RSQVAzXQk9IHRyYXAsCi0JW1ZFQ19UUkFQNF0JPSB0cmFwLAotCVtWRUNfVFJBUDVdCT0gdHJhcCwKLQlbVkVDX1RSQVA2XQk9IHRyYXAsCi0JW1ZFQ19UUkFQN10JPSB0cmFwLAotCVtWRUNfVFJBUDhdCT0gdHJhcCwKLQlbVkVDX1RSQVA5XQk9IHRyYXAsCi0JW1ZFQ19UUkFQMTBdCT0gdHJhcCwKLQlbVkVDX1RSQVAxMV0JPSB0cmFwLAotCVtWRUNfVFJBUDEyXQk9IHRyYXAsCi0JW1ZFQ19UUkFQMTNdCT0gdHJhcCwKLQlbVkVDX1RSQVAxNF0JPSB0cmFwLAotCVtWRUNfVFJBUDE1XQk9IHRyYXAsCiB9OwogCiAvKiBubWkgaGFuZGxlciBmb3IgdGhlIEFtaWdhICovCkBAIC0xMTQsNyArNjksNyBAQAogCWlmKE1BQ0hfSVNfU1VOM1gpIHsKIAkJZXh0ZXJuIGVfdmVjdG9yICpzdW4zeF9wcm9tX3ZicjsKIAotCQlfX2FzbV9fIHZvbGF0aWxlICgibW92ZWMgJSV2YnIsICUwIiA6ICI9ciIgKCh2b2lkKilzdW4zeF9wcm9tX3ZicikpOworCQlfX2FzbV9fIHZvbGF0aWxlICgibW92ZWMgJSV2YnIsICUwIiA6ICI9ciIgKHN1bjN4X3Byb21fdmJyKSk7CiAJfQogCiAJLyogc2V0dXAgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgdGFibGUgKi8KQEAgLTEzMiwxMiArODcsMTUgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDQ4OyBpIDwgNjQ7IGkrKykKKwlmb3IgKGkgPSBWRUNfU1BVUjsgaSA8PSBWRUNfSU5UNzsgaSsrKQorCQl2ZWN0b3JzW2ldID0gYmFkX2ludGhhbmRsZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgVkVDX1VTRVI7IGkrKykKIAkJaWYgKCF2ZWN0b3JzW2ldKQogCQkJdmVjdG9yc1tpXSA9IHRyYXA7CiAKLQlmb3IgKGkgPSA2NDsgaSA8IDI1NjsgaSsrKQotCQl2ZWN0b3JzW2ldID0gaW50aGFuZGxlcjsKKwlmb3IgKGkgPSBWRUNfVVNFUjsgaSA8IDI1NjsgaSsrKQorCQl2ZWN0b3JzW2ldID0gYmFkX2ludGhhbmRsZXI7CiAKICNpZmRlZiBDT05GSUdfTTY4S0ZQVV9FTVUKIAlpZiAoRlBVX0lTX0VNVSkKQEAgLTkyNyw3MSArODg1LDk0IEBACiB2b2lkIHNob3dfcmVnaXN0ZXJzKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBmcmFtZSAqZnAgPSAoc3RydWN0IGZyYW1lICopcmVnczsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJdTE2IGMsICpjcDsKIAl1bnNpZ25lZCBsb25nIGFkZHI7CiAJaW50IGk7CiAKKwlwcmludF9tb2R1bGVzKCk7CisJcHJpbnRrKCJQQzogWzwlMDhseD5dIixyZWdzLT5wYyk7CisJcHJpbnRfc3ltYm9sKCIgJXMiLCByZWdzLT5wYyk7CisJcHJpbnRrKCJcblNSOiAlMDR4ICBTUDogJXAgIGEyOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+c3IsIHJlZ3MsIHJlZ3MtPmEyKTsKKwlwcmludGsoImQwOiAlMDhseCAgICBkMTogJTA4bHggICAgZDI6ICUwOGx4ICAgIGQzOiAlMDhseFxuIiwKKwkgICAgICAgcmVncy0+ZDAsIHJlZ3MtPmQxLCByZWdzLT5kMiwgcmVncy0+ZDMpOworCXByaW50aygiZDQ6ICUwOGx4ICAgIGQ1OiAlMDhseCAgICBhMDogJTA4bHggICAgYTE6ICUwOGx4XG4iLAorCSAgICAgICByZWdzLT5kNCwgcmVncy0+ZDUsIHJlZ3MtPmEwLCByZWdzLT5hMSk7CisKKwlwcmludGsoIlByb2Nlc3MgJXMgKHBpZDogJWQsIHRhc2s9JXApXG4iLAorCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGN1cnJlbnQpOwogCWFkZHIgPSAodW5zaWduZWQgbG9uZykmZnAtPnVuOwotCXByaW50aygiRnJhbWUgZm9ybWF0PSVYICIsIGZwLT5wdHJlZ3MuZm9ybWF0KTsKLQlzd2l0Y2ggKGZwLT5wdHJlZ3MuZm9ybWF0KSB7CisJcHJpbnRrKCJGcmFtZSBmb3JtYXQ9JVggIiwgcmVncy0+Zm9ybWF0KTsKKwlzd2l0Y2ggKHJlZ3MtPmZvcm1hdCkgewogCWNhc2UgMHgyOgotCSAgICBwcmludGsoImluc3RyIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQyLmlhZGRyKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDIpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKCJpbnN0ciBhZGRyPSUwOGx4XG4iLCBmcC0+dW4uZm10Mi5pYWRkcik7CisJCWFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQyKTsKKwkJYnJlYWs7CiAJY2FzZSAweDM6Ci0JICAgIHByaW50aygiZWZmIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQzLmVmZmFkZHIpOwotCSAgICBhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Myk7Ci0JICAgIGJyZWFrOworCQlwcmludGsoImVmZiBhZGRyPSUwOGx4XG4iLCBmcC0+dW4uZm10My5lZmZhZGRyKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDMpOworCQlicmVhazsKIAljYXNlIDB4NDoKLQkgICAgcHJpbnRrKChDUFVfSVNfMDYwID8gImZhdWx0IGFkZHI9JTA4bHggZnNsdz0lMDhseFxuIgotCQkgICAgOiAiZWZmIGFkZHI9JTA4bHggcGM9JTA4bHhcbiIpLAotCQkgICBmcC0+dW4uZm10NC5lZmZhZGRyLCBmcC0+dW4uZm10NC5wYyk7Ci0JICAgIGFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQ0KTsKLQkgICAgYnJlYWs7CisJCXByaW50aygoQ1BVX0lTXzA2MCA/ICJmYXVsdCBhZGRyPSUwOGx4IGZzbHc9JTA4bHhcbiIKKwkJCTogImVmZiBhZGRyPSUwOGx4IHBjPSUwOGx4XG4iKSwKKwkJCWZwLT51bi5mbXQ0LmVmZmFkZHIsIGZwLT51bi5mbXQ0LnBjKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDQpOworCQlicmVhazsKIAljYXNlIDB4NzoKLQkgICAgcHJpbnRrKCJlZmYgYWRkcj0lMDhseCBzc3c9JTA0eCBmYWRkcj0lMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdDcuZWZmYWRkciwgZnAtPnVuLmZtdDcuc3N3LCBmcC0+dW4uZm10Ny5mYWRkcik7Ci0JICAgIHByaW50aygid2IgMSBzdGF0L2FkZHIvZGF0YTogJTA0eCAlMDhseCAlMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdDcud2IxcywgZnAtPnVuLmZtdDcud2IxYSwgZnAtPnVuLmZtdDcud2IxZHBkMCk7Ci0JICAgIHByaW50aygid2IgMiBzdGF0L2FkZHIvZGF0YTogJTA0eCAlMDhseCAlMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdDcud2IycywgZnAtPnVuLmZtdDcud2IyYSwgZnAtPnVuLmZtdDcud2IyZCk7Ci0JICAgIHByaW50aygid2IgMyBzdGF0L2FkZHIvZGF0YTogJTA0eCAlMDhseCAlMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdDcud2IzcywgZnAtPnVuLmZtdDcud2IzYSwgZnAtPnVuLmZtdDcud2IzZCk7Ci0JICAgIHByaW50aygicHVzaCBkYXRhOiAlMDhseCAlMDhseCAlMDhseCAlMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdDcud2IxZHBkMCwgZnAtPnVuLmZtdDcucGQxLCBmcC0+dW4uZm10Ny5wZDIsCi0JCSAgIGZwLT51bi5mbXQ3LnBkMyk7Ci0JICAgIGFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQ3KTsKLQkgICAgYnJlYWs7CisJCXByaW50aygiZWZmIGFkZHI9JTA4bHggc3N3PSUwNHggZmFkZHI9JTA4bHhcbiIsCisJCQlmcC0+dW4uZm10Ny5lZmZhZGRyLCBmcC0+dW4uZm10Ny5zc3csIGZwLT51bi5mbXQ3LmZhZGRyKTsKKwkJcHJpbnRrKCJ3YiAxIHN0YXQvYWRkci9kYXRhOiAlMDR4ICUwOGx4ICUwOGx4XG4iLAorCQkJZnAtPnVuLmZtdDcud2IxcywgZnAtPnVuLmZtdDcud2IxYSwgZnAtPnVuLmZtdDcud2IxZHBkMCk7CisJCXByaW50aygid2IgMiBzdGF0L2FkZHIvZGF0YTogJTA0eCAlMDhseCAlMDhseFxuIiwKKwkJCWZwLT51bi5mbXQ3LndiMnMsIGZwLT51bi5mbXQ3LndiMmEsIGZwLT51bi5mbXQ3LndiMmQpOworCQlwcmludGsoIndiIDMgc3RhdC9hZGRyL2RhdGE6ICUwNHggJTA4bHggJTA4bHhcbiIsCisJCQlmcC0+dW4uZm10Ny53YjNzLCBmcC0+dW4uZm10Ny53YjNhLCBmcC0+dW4uZm10Ny53YjNkKTsKKwkJcHJpbnRrKCJwdXNoIGRhdGE6ICUwOGx4ICUwOGx4ICUwOGx4ICUwOGx4XG4iLAorCQkJZnAtPnVuLmZtdDcud2IxZHBkMCwgZnAtPnVuLmZtdDcucGQxLCBmcC0+dW4uZm10Ny5wZDIsCisJCQlmcC0+dW4uZm10Ny5wZDMpOworCQlhZGRyICs9IHNpemVvZihmcC0+dW4uZm10Nyk7CisJCWJyZWFrOwogCWNhc2UgMHg5OgotCSAgICBwcmludGsoImluc3RyIGFkZHI9JTA4bHhcbiIsIGZwLT51bi5mbXQ5LmlhZGRyKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdDkpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKCJpbnN0ciBhZGRyPSUwOGx4XG4iLCBmcC0+dW4uZm10OS5pYWRkcik7CisJCWFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXQ5KTsKKwkJYnJlYWs7CiAJY2FzZSAweGE6Ci0JICAgIHByaW50aygic3N3PSUwNHggaXNjPSUwNHggaXNiPSUwNHggZGFkZHI9JTA4bHggZG9idWY9JTA4bHhcbiIsCi0JCSAgIGZwLT51bi5mbXRhLnNzdywgZnAtPnVuLmZtdGEuaXNjLCBmcC0+dW4uZm10YS5pc2IsCi0JCSAgIGZwLT51bi5mbXRhLmRhZGRyLCBmcC0+dW4uZm10YS5kb2J1Zik7Ci0JICAgIGFkZHIgKz0gc2l6ZW9mKGZwLT51bi5mbXRhKTsKLQkgICAgYnJlYWs7CisJCXByaW50aygic3N3PSUwNHggaXNjPSUwNHggaXNiPSUwNHggZGFkZHI9JTA4bHggZG9idWY9JTA4bHhcbiIsCisJCQlmcC0+dW4uZm10YS5zc3csIGZwLT51bi5mbXRhLmlzYywgZnAtPnVuLmZtdGEuaXNiLAorCQkJZnAtPnVuLmZtdGEuZGFkZHIsIGZwLT51bi5mbXRhLmRvYnVmKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdGEpOworCQlicmVhazsKIAljYXNlIDB4YjoKLQkgICAgcHJpbnRrKCJzc3c9JTA0eCBpc2M9JTA0eCBpc2I9JTA0eCBkYWRkcj0lMDhseCBkb2J1Zj0lMDhseFxuIiwKLQkJICAgZnAtPnVuLmZtdGIuc3N3LCBmcC0+dW4uZm10Yi5pc2MsIGZwLT51bi5mbXRiLmlzYiwKLQkJICAgZnAtPnVuLmZtdGIuZGFkZHIsIGZwLT51bi5mbXRiLmRvYnVmKTsKLQkgICAgcHJpbnRrKCJiYWRkcj0lMDhseCBkaWJ1Zj0lMDhseCB2ZXI9JXhcbiIsCi0JCSAgIGZwLT51bi5mbXRiLmJhZGRyLCBmcC0+dW4uZm10Yi5kaWJ1ZiwgZnAtPnVuLmZtdGIudmVyKTsKLQkgICAgYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdGIpOwotCSAgICBicmVhazsKKwkJcHJpbnRrKCJzc3c9JTA0eCBpc2M9JTA0eCBpc2I9JTA0eCBkYWRkcj0lMDhseCBkb2J1Zj0lMDhseFxuIiwKKwkJCWZwLT51bi5mbXRiLnNzdywgZnAtPnVuLmZtdGIuaXNjLCBmcC0+dW4uZm10Yi5pc2IsCisJCQlmcC0+dW4uZm10Yi5kYWRkciwgZnAtPnVuLmZtdGIuZG9idWYpOworCQlwcmludGsoImJhZGRyPSUwOGx4IGRpYnVmPSUwOGx4IHZlcj0leFxuIiwKKwkJCWZwLT51bi5mbXRiLmJhZGRyLCBmcC0+dW4uZm10Yi5kaWJ1ZiwgZnAtPnVuLmZtdGIudmVyKTsKKwkJYWRkciArPSBzaXplb2YoZnAtPnVuLmZtdGIpOworCQlicmVhazsKIAlkZWZhdWx0OgotCSAgICBwcmludGsoIlxuIik7CisJCXByaW50aygiXG4iKTsKIAl9CiAJc2hvd19zdGFjayhOVUxMLCAodW5zaWduZWQgbG9uZyAqKWFkZHIpOwogCi0JcHJpbnRrKCJDb2RlOiAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJcHJpbnRrKCIlMDR4ICIsIDB4ZmZmZiAmICgoc2hvcnQgKikgZnAtPnB0cmVncy5wYylbaV0pOworCXByaW50aygiQ29kZToiKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwljcCA9ICh1MTYgKilyZWdzLT5wYzsKKwlmb3IgKGkgPSAtODsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKGdldF91c2VyKGMsIGNwICsgaSkgJiYgaSA+PSAwKSB7CisJCQlwcmludGsoIiBCYWQgUEMgdmFsdWUuIik7CisJCQlicmVhazsKKwkJfQorCQlwcmludGsoaSA/ICIgJTA0eCIgOiAiIDwlMDR4PiIsIGMpOworCX0KKwlzZXRfZnMob2xkX2ZzKTsKIAlwcmludGsgKCJcbiIpOwogfQogCiB2b2lkIHNob3dfc3RhY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCB1bnNpZ25lZCBsb25nICpzdGFjaykKIHsKKwl1bnNpZ25lZCBsb25nICpwOwogCXVuc2lnbmVkIGxvbmcgKmVuZHN0YWNrOwogCWludCBpOwogCkBAIC0xMDA0LDEyICs5ODUsMTMgQEAKIAllbmRzdGFjayA9ICh1bnNpZ25lZCBsb25nICopKCgodW5zaWduZWQgbG9uZylzdGFjayArIFRIUkVBRF9TSVpFIC0gMSkgJiAtVEhSRUFEX1NJWkUpOwogCiAJcHJpbnRrKCJTdGFjayBmcm9tICUwOGx4OiIsICh1bnNpZ25lZCBsb25nKXN0YWNrKTsKKwlwID0gc3RhY2s7CiAJZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7Ci0JCWlmIChzdGFjayArIDEgPiBlbmRzdGFjaykKKwkJaWYgKHAgKyAxID4gZW5kc3RhY2spCiAJCQlicmVhazsKIAkJaWYgKGkgJSA4ID09IDApCiAJCQlwcmludGsoIlxuICAgICAgICIpOwotCQlwcmludGsoIiAlMDhseCIsICpzdGFjaysrKTsKKwkJcHJpbnRrKCIgJTA4bHgiLCAqcCsrKTsKIAl9CiAJcHJpbnRrKCJcbiIpOwogCXNob3dfdHJhY2Uoc3RhY2spOwpAQCAtMTE4OCwxOSArMTE3MCw3IEBACiAKIAljb25zb2xlX3ZlcmJvc2UoKTsKIAlwcmludGsoIiVzOiAlMDh4XG4iLHN0cixucik7Ci0JcHJpbnRfbW9kdWxlcygpOwotCXByaW50aygiUEM6IFs8JTA4bHg+XSIsZnAtPnBjKTsKLQlwcmludF9zeW1ib2woIiAlc1xuIiwgZnAtPnBjKTsKLQlwcmludGsoIlxuU1I6ICUwNHggIFNQOiAlcCAgYTI6ICUwOGx4XG4iLAotCSAgICAgICBmcC0+c3IsIGZwLCBmcC0+YTIpOwotCXByaW50aygiZDA6ICUwOGx4ICAgIGQxOiAlMDhseCAgICBkMjogJTA4bHggICAgZDM6ICUwOGx4XG4iLAotCSAgICAgICBmcC0+ZDAsIGZwLT5kMSwgZnAtPmQyLCBmcC0+ZDMpOwotCXByaW50aygiZDQ6ICUwOGx4ICAgIGQ1OiAlMDhseCAgICBhMDogJTA4bHggICAgYTE6ICUwOGx4XG4iLAotCSAgICAgICBmcC0+ZDQsIGZwLT5kNSwgZnAtPmEwLCBmcC0+YTEpOwotCi0JcHJpbnRrKCJQcm9jZXNzICVzIChwaWQ6ICVkLCBzdGFja3BhZ2U9JTA4bHgpXG4iLAotCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIFBBR0VfU0laRSsodW5zaWduZWQgbG9uZyljdXJyZW50KTsKLQlzaG93X3N0YWNrKE5VTEwsICh1bnNpZ25lZCBsb25nICopZnApOworCXNob3dfcmVnaXN0ZXJzKGZwKTsKIAlkb19leGl0KFNJR1NFR1YpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL01ha2VmaWxlIGIvYXJjaC9tNjhrL2xpYi9NYWtlZmlsZQppbmRleCBlYmU1MWE1Li42YmJmMTlmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9saWIvTWFrZWZpbGUKQEAgLTQsNSArNCw1IEBACiAKIEVYVFJBX0FGTEFHUyA6PSAtdHJhZGl0aW9uYWwKIAotbGliLXkJCTo9IGFzaGxkaTMubyBhc2hyZGkzLm8gbHNocmRpMy5vIG11bGRpMy5vIFwKLQkJCWNoZWNrc3VtLm8gc3RyaW5nLm8gc2VtYXBob3JlLm8KK2xpYi15CTo9IGFzaGxkaTMubyBhc2hyZGkzLm8gbHNocmRpMy5vIG11bGRpMy5vIFwKKwkgICBjaGVja3N1bS5vIHN0cmluZy5vIHNlbWFwaG9yZS5vIHVhY2Nlc3MubwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi91YWNjZXNzLmMgYi9hcmNoL202OGsvbGliL3VhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmMxODhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2xpYi91YWNjZXNzLmMKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3Vuc2lnbmVkIGxvbmcgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgdG1wLCByZXM7CisKKwlhc20gdm9sYXRpbGUgKCJcbiIKKwkJIgl0c3QubAklMFxuIgorCQkiCWplcQkyZlxuIgorCQkiMToJbW92ZXMubAkoJTEpKywlM1xuIgorCQkiCW1vdmUubAklMywoJTIpK1xuIgorCQkiCXN1YnEubAkjMSwlMFxuIgorCQkiCWpuZQkxYlxuIgorCQkiMjoJYnRzdAkjMSwlNVxuIgorCQkiCWplcQk0ZlxuIgorCQkiMzoJbW92ZXMudwkoJTEpKywlM1xuIgorCQkiCW1vdmUudwklMywoJTIpK1xuIgorCQkiNDoJYnRzdAkjMCwlNVxuIgorCQkiCWplcQk2ZlxuIgorCQkiNToJbW92ZXMuYgkoJTEpKywlM1xuIgorCQkiCW1vdmUuYiAgJTMsKCUyKStcbiIKKwkJIjY6XG4iCisJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkiCS5ldmVuXG4iCisJCSIxMDoJbW92ZS5sCSUwLCUzXG4iCisJCSI3OgljbHIubAkoJTIpK1xuIgorCQkiCXN1YnEubAkjMSwlM1xuIgorCQkiCWpuZQk3YlxuIgorCQkiCWxzbC5sCSMyLCUwXG4iCisJCSIJYnRzdAkjMSwlNVxuIgorCQkiCWplcQk4ZlxuIgorCQkiMzA6CWNsci53CSglMikrXG4iCisJCSIJYWRkcS5sCSMyLCUwXG4iCisJCSI4OglidHN0CSMwLCU1XG4iCisJCSIJamVxCTZiXG4iCisJCSI1MDoJY2xyLmIJKCUyKStcbiIKKwkJIglhZGRxLmwJIzEsJTBcbiIKKwkJIglqcmEJNmJcbiIKKwkJIgkucHJldmlvdXNcbiIKKwkJIlxuIgorCQkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24JNFxuIgorCQkiCS5sb25nCTFiLDEwYlxuIgorCQkiCS5sb25nCTNiLDMwYlxuIgorCQkiCS5sb25nCTViLDUwYlxuIgorCQkiCS5wcmV2aW91cyIKKwkJOiAiPWQiIChyZXMpLCAiK2EiIChmcm9tKSwgIithIiAodG8pLCAiPSZyIiAodG1wKQorCQk6ICIwIiAobiAvIDQpLCAiZCIgKG4gJiAzKSk7CisKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfY29weV9mcm9tX3VzZXIpOworCit1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgdG1wLCByZXM7CisKKwlhc20gdm9sYXRpbGUgKCJcbiIKKwkJIgl0c3QubAklMFxuIgorCQkiCWplcQk0ZlxuIgorCQkiMToJbW92ZS5sCSglMSkrLCUzXG4iCisJCSIyOgltb3Zlcy5sCSUzLCglMikrXG4iCisJCSIzOglzdWJxLmwJIzEsJTBcbiIKKwkJIglqbmUJMWJcbiIKKwkJIjQ6CWJ0c3QJIzEsJTVcbiIKKwkJIglqZXEJNmZcbiIKKwkJIgltb3ZlLncJKCUxKSssJTNcbiIKKwkJIjU6CW1vdmVzLncJJTMsKCUyKStcbiIKKwkJIjY6CWJ0c3QJIzAsJTVcbiIKKwkJIglqZXEJOGZcbiIKKwkJIgltb3ZlLmIJKCUxKSssJTNcbiIKKwkJIjc6CW1vdmVzLmIgICUzLCglMikrXG4iCisJCSI4OlxuIgorCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkJIgkuZXZlblxuIgorCQkiMjA6CWxzbC5sCSMyLCUwXG4iCisJCSI1MDoJYWRkLmwJJTUsJTBcbiIKKwkJIglqcmEJN2JcbiIKKwkJIgkucHJldmlvdXNcbiIKKwkJIlxuIgorCQkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24JNFxuIgorCQkiCS5sb25nCTJiLDIwYlxuIgorCQkiCS5sb25nCTNiLDIwYlxuIgorCQkiCS5sb25nCTViLDUwYlxuIgorCQkiCS5sb25nCTZiLDUwYlxuIgorCQkiCS5sb25nCTdiLDUwYlxuIgorCQkiCS5sb25nCThiLDUwYlxuIgorCQkiCS5wcmV2aW91cyIKKwkJOiAiPWQiIChyZXMpLCAiK2EiIChmcm9tKSwgIithIiAodG8pLCAiPSZyIiAodG1wKQorCQk6ICIwIiAobiAvIDQpLCAiZCIgKG4gJiAzKSk7CisKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChfX2dlbmVyaWNfY29weV90b191c2VyKTsKKworLyoKKyAqIENvcHkgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgorICovCitsb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKK3sKKwlsb25nIHJlczsKKwljaGFyIGM7CisKKwlpZiAoY291bnQgPD0gMCkKKwkJcmV0dXJuIGNvdW50OworCisJYXNtIHZvbGF0aWxlICgiXG4iCisJCSIxOgltb3Zlcy5iCSglMikrLCU0XG4iCisJCSIJbW92ZS5iCSU0LCglMSkrXG4iCisJCSIJamVxCTJmXG4iCisJCSIJc3VicS5sCSMxLCUzXG4iCisJCSIJam5lCTFiXG4iCisJCSIyOglzdWIubAklMywlMFxuIgorCQkiMzpcbiIKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSIJLmV2ZW5cbiIKKwkJIjEwOgltb3ZlLmwJJTUsJTBcbiIKKwkJIglqcmEJM2JcbiIKKwkJIgkucHJldmlvdXNcbiIKKwkJIlxuIgorCQkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKKwkJIgkuYWxpZ24JNFxuIgorCQkiCS5sb25nCTFiLDEwYlxuIgorCQkiCS5wcmV2aW91cyIKKwkJOiAiPWQiIChyZXMpLCAiK2EiIChkc3QpLCAiK2EiIChzcmMpLCAiK3IiIChjb3VudCksICI9JmQiIChjKQorCQk6ICJpIiAoLUVGQVVMVCksICIwIiAoY291bnQpKTsKKworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHN0cm5jcHlfZnJvbV91c2VyKTsKKworLyoKKyAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHN0cmluZyAoaW5jbHVkaW5nIHRoZSBlbmRpbmcgMCkKKyAqCisgKiBSZXR1cm4gMCBvbiBleGNlcHRpb24sIGEgdmFsdWUgZ3JlYXRlciB0aGFuIE4gaWYgdG9vIGxvbmcKKyAqLworbG9uZyBzdHJubGVuX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBuKQoreworCWNoYXIgYzsKKwlsb25nIHJlczsKKworCWFzbSB2b2xhdGlsZSAoIlxuIgorCQkiMToJc3VicS5sCSMxLCUxXG4iCisJCSIJam1pCTNmXG4iCisJCSIyOgltb3Zlcy5iCSglMCkrLCUyXG4iCisJCSIJdHN0LmIJJTJcbiIKKwkJIglqbmUJMWJcbiIKKwkJIglqcmEJNGZcbiIKKwkJIlxuIgorCQkiMzoJYWRkcS5sCSMxLCUwXG4iCisJCSI0OglzdWIubAklNCwlMFxuIgorCQkiNTpcbiIKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCisJCSIJLmV2ZW5cbiIKKwkJIjIwOglzdWIubAklMCwlMFxuIgorCQkiCWpyYQk1YlxuIgorCQkiCS5wcmV2aW91c1xuIgorCQkiXG4iCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbgk0XG4iCisJCSIJLmxvbmcJMmIsMjBiXG4iCisJCSIJLnByZXZpb3VzXG4iCisJCTogIj0mYSIgKHJlcyksICIrZCIgKG4pLCAiPSZkIiAoYykKKwkJOiAiMCIgKHNyYyksICJyIiAoc3JjKSk7CisKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChzdHJubGVuX3VzZXIpOworCisvKgorICogWmVybyBVc2Vyc3BhY2UKKyAqLworCit1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisKKwlhc20gdm9sYXRpbGUgKCJcbiIKKwkJIgl0c3QubAklMFxuIgorCQkiCWplcQkzZlxuIgorCQkiMToJbW92ZXMubAklMiwoJTEpK1xuIgorCQkiMjoJc3VicS5sCSMxLCUwXG4iCisJCSIJam5lCTFiXG4iCisJCSIzOglidHN0CSMxLCU0XG4iCisJCSIJamVxCTVmXG4iCisJCSI0Ogltb3Zlcy53CSUyLCglMSkrXG4iCisJCSI1OglidHN0CSMwLCU0XG4iCisJCSIJamVxCTdmXG4iCisJCSI2Ogltb3Zlcy5iCSUyLCglMSlcbiIKKwkJIjc6XG4iCisJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgorCQkiCS5ldmVuXG4iCisJCSIxMDoJbHNsLmwJIzIsJTBcbiIKKwkJIjQwOglhZGQubAklNCwlMFxuIgorCQkiCWpyYQk3YlxuIgorCQkiCS5wcmV2aW91c1xuIgorCQkiXG4iCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorCQkiCS5hbGlnbgk0XG4iCisJCSIJLmxvbmcJMWIsMTBiXG4iCisJCSIJLmxvbmcJMmIsMTBiXG4iCisJCSIJLmxvbmcJNGIsNDBiXG4iCisJCSIJLmxvbmcJNWIsNDBiXG4iCisJCSIJLmxvbmcJNmIsNDBiXG4iCisJCSIJLmxvbmcJN2IsNDBiXG4iCisJCSIJLnByZXZpb3VzIgorCQk6ICI9ZCIgKHJlcyksICIrYSIgKHRvKQorCQk6ICJyIiAoMCksICIwIiAobiAvIDQpLCAiZCIgKG4gJiAzKSk7CisKKyAgICByZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChjbGVhcl91c2VyKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMgYi9hcmNoL202OGsvbWFjL2JhYm9vbi5jCmluZGV4IGIxOWI3ZGQuLjZlYWE4ODEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvYmFib29uLmMKKysrIGIvYXJjaC9tNjhrL21hYy9iYWJvb24uYwpAQCAtODEsNyArODEsNyBAQAogCWZvciAoaSA9IDAsIGlycV9iaXQgPSAxIDsgaSA8IDMgOyBpKyssIGlycV9iaXQgPDw9IDEpIHsKIAkgICAgICAgIGlmIChldmVudHMgJiBpcnFfYml0LyogJiBiYWJvb25fYWN0aXZlKi8pIHsKIAkJCWJhYm9vbl9hY3RpdmUgJj0gfmlycV9iaXQ7Ci0JCQltYWNfZG9faXJxX2xpc3QoSVJRX0JBQk9PTl8wICsgaSwgcmVncyk7CisJCQltNjhrX2hhbmRsZV9pbnQoSVJRX0JBQk9PTl8wICsgaSwgcmVncyk7CiAJCQliYWJvb25fYWN0aXZlIHw9IGlycV9iaXQ7CiAJCQliYWJvb24tPm1iX2lmciAmPSB+aXJxX2JpdDsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9jb25maWcuYyBiL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKaW5kZXggMTRmOGQzZjQuLjVhOTk5MGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL21hYy9jb25maWcuYwpAQCAtODksMzggKzg5LDExIEBACiAKIHN0YXRpYyB2b2lkIG1hY19nZXRfbW9kZWwoY2hhciAqc3RyKTsKIAotdm9pZCBtYWNfYmFuZyhpbnQgaXJxLCB2b2lkICp2ZWN0b3IsIHN0cnVjdCBwdF9yZWdzICpwKQotewotCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyAuLi5cbiIpOwotCW1hY19yZXNldCgpOwotfQotCiBzdGF0aWMgdm9pZCBtYWNfc2NoZWRfaW5pdChpcnFyZXR1cm5fdCAoKnZlY3RvcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKQogewogCXZpYV9pbml0X2Nsb2NrKHZlY3Rvcik7CiB9CiAKLSNpZiAwCi12b2lkIG1hY193YWl0YnV0ICh2b2lkKQotewotCTsKLX0KLSNlbmRpZgotCi1leHRlcm4gaXJxcmV0dXJuX3QgbWFjX2RlZmF1bHRfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLWlycXJldHVybl90ICgqbWFjX2hhbmRsZXJzWzhdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik9Ci17Ci0JbWFjX2RlZmF1bHRfaGFuZGxlciwKLQltYWNfZGVmYXVsdF9oYW5kbGVyLAotCW1hY19kZWZhdWx0X2hhbmRsZXIsCi0JbWFjX2RlZmF1bHRfaGFuZGxlciwKLQltYWNfZGVmYXVsdF9oYW5kbGVyLAotCW1hY19kZWZhdWx0X2hhbmRsZXIsCi0JbWFjX2RlZmF1bHRfaGFuZGxlciwKLQltYWNfZGVmYXVsdF9oYW5kbGVyCi19OwotCiAvKgogICogUGFyc2UgYSBNYWNpbnRvc2gtc3BlY2lmaWMgcmVjb3JkIGluIHRoZSBib290aW5mbwogICovCkBAIC0xOTYsMTMgKzE2OSw3IEBACiAKIAltYWNoX3NjaGVkX2luaXQgICAgICA9IG1hY19zY2hlZF9pbml0OwogCW1hY2hfaW5pdF9JUlEgICAgICAgID0gbWFjX2luaXRfSVJROwotCW1hY2hfcmVxdWVzdF9pcnEgICAgID0gbWFjX3JlcXVlc3RfaXJxOwotCW1hY2hfZnJlZV9pcnEgICAgICAgID0gbWFjX2ZyZWVfaXJxOwotCWVuYWJsZV9pcnEgICAgICAgICAgID0gbWFjX2VuYWJsZV9pcnE7Ci0JZGlzYWJsZV9pcnEgICAgICAgICAgPSBtYWNfZGlzYWJsZV9pcnE7CiAJbWFjaF9nZXRfbW9kZWwJID0gbWFjX2dldF9tb2RlbDsKLQltYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZtYWNfaGFuZGxlcnM7Ci0JbWFjaF9nZXRfaXJxX2xpc3QgICAgPSBzaG93X21hY19pbnRlcnJ1cHRzOwogCW1hY2hfZ2V0dGltZW9mZnNldCAgID0gbWFjX2dldHRpbWVvZmZzZXQ7CiAjd2FybmluZyBtb3ZlIHRvIGFkYi92aWEgaW5pdAogI2lmIDAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYWMvaW9wLmMgYi9hcmNoL202OGsvbWFjL2lvcC5jCmluZGV4IDkxNzlhMzcuLjRjOGVjZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvaW9wLmMKKysrIGIvYXJjaC9tNjhrL21hYy9pb3AuYwpAQCAtMzE3LDcgKzMxNyw3IEBACiB7CiAJaWYgKGlvcF9pc21fcHJlc2VudCkgewogCQlpZiAob3NzX3ByZXNlbnQpIHsKLQkJCWNwdV9yZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUElTTSwgaW9wX2lzbV9pcnEsCisJCQlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUElTTSwgaW9wX2lzbV9pcnEsCiAJCQkJCUlSUV9GTEdfTE9DSywgIklTTSBJT1AiLAogCQkJCQkodm9pZCAqKSBJT1BfTlVNX0lTTSk7CiAJCQlvc3NfaXJxX2VuYWJsZShJUlFfTUFDX0FEQik7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL21hY2ludHMuYyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCmluZGV4IDE4MDk2MDEuLjY5NGIxNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvbWFjaW50cy5jCkBAIC0xMzcsMTQgKzEzNyw2IEBACiAjZGVmaW5lIERFQlVHX1NQVVJJT1VTCiAjZGVmaW5lIFNIVVRVUF9TT05JQwogCi0vKgotICogVGhlIG1hY19pcnFfbGlzdCBhcnJheSBpcyBhbiBhcnJheSBvZiBsaW5rZWQgbGlzdHMgb2YgaXJxX25vZGVfdCBub2Rlcy4KLSAqIEVhY2ggbm9kZSBjb250YWlucyBvbmUgaGFuZGxlciB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIGludGVycnVwdAotICogb2NjdXJzLCB3aXRoIGZhc3QgaGFuZGxlcnMgbGlzdGVkIGJlZm9yZSBzbG93IGhhbmRsZXJzLgotICovCi0KLWlycV9ub2RlX3QgKm1hY19pcnFfbGlzdFtOVU1fTUFDX1NPVVJDRVNdOwotCiAvKiBTQ0MgaW50ZXJydXB0IG1hc2sgKi8KIAogc3RhdGljIGludCBzY2NfbWFzazsKQEAgLTIwOSwzNCArMjAxLDM3IEBACiAgKiBTQ0MgaW50ZXJydXB0IHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIHZvaWQgc2NjX2lycV9lbmFibGUoaW50KTsKLXN0YXRpYyB2b2lkIHNjY19pcnFfZGlzYWJsZShpbnQpOworc3RhdGljIHZvaWQgc2NjX2lycV9lbmFibGUodW5zaWduZWQgaW50KTsKK3N0YXRpYyB2b2lkIHNjY19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQpOwogCiAvKgogICogY29uc29sZV9sb2dsZXZlbCBkZXRlcm1pbmVzIE5NSSBoYW5kbGVyIGZ1bmN0aW9uCiAgKi8KIAotZXh0ZXJuIGlycXJldHVybl90IG1hY19iYW5nKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGlycXJldHVybl90IG1hY19ubWlfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiBpcnFyZXR1cm5fdCBtYWNfZGVidWdfaGFuZGxlcihpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiAKIC8qICNkZWZpbmUgREVCVUdfTUFDSU5UUyAqLwogCitzdGF0aWMgdm9pZCBtYWNfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKK3N0YXRpYyB2b2lkIG1hY19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKKworc3RhdGljIHN0cnVjdCBpcnFfY29udHJvbGxlciBtYWNfaXJxX2NvbnRyb2xsZXIgPSB7CisJLm5hbWUJCT0gIm1hYyIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5lbmFibGUJCT0gbWFjX2VuYWJsZV9pcnEsCisJLmRpc2FibGUJPSBtYWNfZGlzYWJsZV9pcnEsCit9OworCiB2b2lkIG1hY19pbml0X0lSUSh2b2lkKQogewotICAgICAgICBpbnQgaTsKLQogI2lmZGVmIERFQlVHX01BQ0lOVFMKIAlwcmludGsoIm1hY19pbml0X0lSUSgpOiBTZXR0aW5nIHRoaW5ncyB1cC4uLlxuIik7CiAjZW5kaWYKLQkvKiBJbml0aWFsaXplIHRoZSBJUlEgaGFuZGxlciBsaXN0cy4gSW5pdGlhbGx5IGVhY2ggbGlzdCBpcyBlbXB0eSwgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fTUFDX1NPVVJDRVM7IGkrKykgewotCQltYWNfaXJxX2xpc3RbaV0gPSBOVUxMOwotCX0KLQogCXNjY19tYXNrID0gMDsKIAorCW02OGtfc2V0dXBfaXJxX2NvbnRyb2xsZXIoJm1hY19pcnFfY29udHJvbGxlciwgSVJRX1VTRVIsCisJCQkJICBOVU1fTUFDX1NPVVJDRVMgLSBJUlFfVVNFUik7CiAJLyogTWFrZSBzdXJlIHRoZSBTT05JQyBpbnRlcnJ1cHQgaXMgY2xlYXJlZCBvciB0aGluZ3MgZ2V0IHVnbHkgKi8KICNpZmRlZiBTSFVUVVBfU09OSUMKIAlwcmludGsoIktpbGxpbmcgb25ib2FyZCBzb25pYy4uLiAiKTsKQEAgLTI1MywxNSArMjQ4LDE2IEBACiAJICogYXQgbGV2ZWxzIDEtNy4gTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGVsc2V3aGVyZS4KIAkgKi8KIAotCWlmIChvc3NfcHJlc2VudCkgeworCWlmIChvc3NfcHJlc2VudCkKIAkJb3NzX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKLQl9IGVsc2UgeworCWVsc2UKIAkJdmlhX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKLQl9Ci0JaWYgKHBzY19wcmVzZW50KSBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cygpOwotCWlmIChiYWJvb25fcHJlc2VudCkgYmFib29uX3JlZ2lzdGVyX2ludGVycnVwdHMoKTsKKwlpZiAocHNjX3ByZXNlbnQpCisJCXBzY19yZWdpc3Rlcl9pbnRlcnJ1cHRzKCk7CisJaWYgKGJhYm9vbl9wcmVzZW50KQorCQliYWJvb25fcmVnaXN0ZXJfaW50ZXJydXB0cygpOwogCWlvcF9yZWdpc3Rlcl9pbnRlcnJ1cHRzKCk7Ci0JY3B1X3JlcXVlc3RfaXJxKDcsIG1hY19ubWlfaGFuZGxlciwgSVJRX0ZMR19MT0NLLCAiTk1JIiwKKwlyZXF1ZXN0X2lycShJUlFfQVVUT183LCBtYWNfbm1pX2hhbmRsZXIsIDAsICJOTUkiLAogCQkJbWFjX25taV9oYW5kbGVyKTsKICNpZmRlZiBERUJVR19NQUNJTlRTCiAJcHJpbnRrKCJtYWNfaW5pdF9JUlEoKTogRG9uZSFcbiIpOwpAQCAtMjY5LDEwNCArMjY1LDYgQEAKIH0KIAogLyoKLSAqIFJvdXRpbmVzIHRvIHdvcmsgd2l0aCBpcnFfbm9kZV90J3Mgb24gbGlua2VkIGxpc3RzIGxpZnRlZCBmcm9tCi0gKiB0aGUgQW1pZ2EgY29kZSB3cml0dGVuIGJ5IFJvbWFuIFppcHBlbC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFjX2luc2VydF9pcnEoaXJxX25vZGVfdCAqKmxpc3QsIGlycV9ub2RlX3QgKm5vZGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpcnFfbm9kZV90ICpjdXI7Ci0KLQlpZiAoIW5vZGUtPmRldl9pZCkKLQkJcHJpbnRrKCIlczogV2FybmluZzogZGV2X2lkIG9mICVzIGlzIHplcm9cbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIG5vZGUtPmRldm5hbWUpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JY3VyID0gKmxpc3Q7Ci0KLQlpZiAobm9kZS0+ZmxhZ3MgJiBJUlFfRkxHX0ZBU1QpIHsKLQkJbm9kZS0+ZmxhZ3MgJj0gfklSUV9GTEdfU0xPVzsKLQkJd2hpbGUgKGN1ciAmJiBjdXItPmZsYWdzICYgSVJRX0ZMR19GQVNUKSB7Ci0JCQlsaXN0ID0gJmN1ci0+bmV4dDsKLQkJCWN1ciA9IGN1ci0+bmV4dDsKLQkJfQotCX0gZWxzZSBpZiAobm9kZS0+ZmxhZ3MgJiBJUlFfRkxHX1NMT1cpIHsKLQkJd2hpbGUgKGN1cikgewotCQkJbGlzdCA9ICZjdXItPm5leHQ7Ci0JCQljdXIgPSBjdXItPm5leHQ7Ci0JCX0KLQl9IGVsc2UgewotCQl3aGlsZSAoY3VyICYmICEoY3VyLT5mbGFncyAmIElSUV9GTEdfU0xPVykpIHsKLQkJCWxpc3QgPSAmY3VyLT5uZXh0OwotCQkJY3VyID0gY3VyLT5uZXh0OwotCQl9Ci0JfQotCi0Jbm9kZS0+bmV4dCA9IGN1cjsKLQkqbGlzdCA9IG5vZGU7Ci0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZGVsZXRlX2lycShpcnFfbm9kZV90ICoqbGlzdCwgdm9pZCAqZGV2X2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaXJxX25vZGVfdCAqbm9kZTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWZvciAobm9kZSA9ICpsaXN0OyBub2RlOyBsaXN0ID0gJm5vZGUtPm5leHQsIG5vZGUgPSAqbGlzdCkgewotCQlpZiAobm9kZS0+ZGV2X2lkID09IGRldl9pZCkgewotCQkJKmxpc3QgPSBub2RlLT5uZXh0OwotCQkJLyogTWFyayBpdCBhcyBmcmVlLiAqLwotCQkJbm9kZS0+aGFuZGxlciA9IE5VTEw7Ci0JCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCXByaW50ayAoIiVzOiB0cmllZCB0byByZW1vdmUgaW52YWxpZCBpcnFcbiIsIF9fRlVOQ1RJT05fXyk7Ci19Ci0KLS8qCi0gKiBDYWxsIGFsbCB0aGUgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4gaW50ZXJydXB0LiBGYXN0IGhhbmRsZXJzIGFyZSBjYWxsZWQKLSAqIGZpcnN0IGZvbGxvd2VkIGJ5IHNsb3cgaGFuZGxlcnMuCi0gKgotICogVGhpcyBjb2RlIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIEFtaWdhIGNvZGUgd3JpdHRlbiBieSBSb21hbiBaaXBwZWwuCi0gKi8KLQotdm9pZCBtYWNfZG9faXJxX2xpc3QoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlycV9ub2RlX3QgKm5vZGUsICpzbG93X25vZGVzOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlrc3RhdF9jcHUoMCkuaXJxc1tpcnFdKys7Ci0KLSNpZmRlZiBERUJVR19TUFVSSU9VUwotCWlmICghbWFjX2lycV9saXN0W2lycV0gJiYgKGNvbnNvbGVfbG9nbGV2ZWwgPiA3KSkgewotCQlwcmludGsoIm1hY19kb19pcnFfbGlzdDogc3B1cmlvdXMgaW50ZXJydXB0ICVkIVxuIiwgaXJxKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JLyogc2VydmUgZmlyc3QgZmFzdCBhbmQgbm9ybWFsIGhhbmRsZXJzICovCi0JZm9yIChub2RlID0gbWFjX2lycV9saXN0W2lycV07Ci0JICAgICBub2RlICYmICghKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TTE9XKSk7Ci0JICAgICBub2RlID0gbm9kZS0+bmV4dCkKLQkJbm9kZS0+aGFuZGxlcihpcnEsIG5vZGUtPmRldl9pZCwgZnApOwotCWlmICghbm9kZSkgcmV0dXJuOwotCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOwotCWxvY2FsX2lycV9yZXN0b3JlKChmbGFncyAmIH4weDA3MDApIHwgKGZwLT5zciAmIDB4MDcwMCkpOwotCS8qIGlmIHNsb3cgaGFuZGxlcnMgZXhpc3RzLCBzZXJ2ZSB0aGVtIG5vdyAqLwotCXNsb3dfbm9kZXMgPSBub2RlOwotCWZvciAoOyBub2RlOyBub2RlID0gbm9kZS0+bmV4dCkgewotCQlub2RlLT5oYW5kbGVyKGlycSwgbm9kZS0+ZGV2X2lkLCBmcCk7Ci0JfQotfQotCi0vKgogICogIG1hY19lbmFibGVfaXJxIC0gZW5hYmxlIGFuIGludGVycnVwdCBzb3VyY2UKICAqIG1hY19kaXNhYmxlX2lycSAtIGRpc2FibGUgYW4gaW50ZXJydXB0IHNvdXJjZQogICogICBtYWNfY2xlYXJfaXJxIC0gY2xlYXJzIGEgcGVuZGluZyBpbnRlcnJ1cHQKQEAgLTM3NSwyNzYgKzI3MywxMjQgQEAKICAqIFRoZXNlIHJvdXRpbmVzIGFyZSBqdXN0IGRpc3BhdGNoZXJzIHRvIHRoZSBWSUEvT1NTL1BTQyByb3V0aW5lcy4KICAqLwogCi12b2lkIG1hY19lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQorc3RhdGljIHZvaWQgbWFjX2VuYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpbnQgaXJxX3NyYwk9IElSUV9TUkMoaXJxKTsKKwlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7Ci0JCWNhc2UgMTogdmlhX2lycV9lbmFibGUoaXJxKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCWNhc2UgNzogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9lbmFibGUoaXJxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlhX2lycV9lbmFibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQljYXNlIDY6IGlmIChwc2NfcHJlc2VudCkgewotCQkJCXBzY19pcnFfZW5hYmxlKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9lbmFibGUoaXJxKTsKLQkJCX0gZWxzZSBpZiAoaXJxX3NyYyA9PSA0KSB7Ci0JCQkJc2NjX2lycV9lbmFibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDg6IGlmIChiYWJvb25fcHJlc2VudCkgewotCQkJCWJhYm9vbl9pcnFfZW5hYmxlKGlycSk7Ci0JCQl9Ci0JCQlicmVhazsKKwljYXNlIDE6CisJCXZpYV9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfZW5hYmxlKGlycSk7CisJCWVsc2UKKwkJCXZpYV9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwkJaWYgKHBzY19wcmVzZW50KQorCQkJcHNjX2lycV9lbmFibGUoaXJxKTsKKwkJZWxzZSBpZiAob3NzX3ByZXNlbnQpCisJCQlvc3NfaXJxX2VuYWJsZShpcnEpOworCQllbHNlIGlmIChpcnFfc3JjID09IDQpCisJCQlzY2NfaXJxX2VuYWJsZShpcnEpOworCQlicmVhazsKKwljYXNlIDg6CisJCWlmIChiYWJvb25fcHJlc2VudCkKKwkJCWJhYm9vbl9pcnFfZW5hYmxlKGlycSk7CisJCWJyZWFrOwogCX0KIH0KIAotdm9pZCBtYWNfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBtYWNfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlpbnQgaXJxX3NyYwk9IElSUV9TUkMoaXJxKTsKKwlpbnQgaXJxX3NyYyA9IElSUV9TUkMoaXJxKTsKIAogCXN3aXRjaChpcnFfc3JjKSB7Ci0JCWNhc2UgMTogdmlhX2lycV9kaXNhYmxlKGlycSk7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQljYXNlIDc6IGlmIChvc3NfcHJlc2VudCkgewotCQkJCW9zc19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWFfaXJxX2Rpc2FibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCWNhc2UgNDoKLQkJY2FzZSA1OgotCQljYXNlIDY6IGlmIChwc2NfcHJlc2VudCkgewotCQkJCXBzY19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIGlmIChvc3NfcHJlc2VudCkgewotCQkJCW9zc19pcnFfZGlzYWJsZShpcnEpOwotCQkJfSBlbHNlIGlmIChpcnFfc3JjID09IDQpIHsKLQkJCQlzY2NfaXJxX2Rpc2FibGUoaXJxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDg6IGlmIChiYWJvb25fcHJlc2VudCkgewotCQkJCWJhYm9vbl9pcnFfZGlzYWJsZShpcnEpOwotCQkJfQotCQkJYnJlYWs7CisJY2FzZSAxOgorCQl2aWFfaXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCWNhc2UgNzoKKwkJaWYgKG9zc19wcmVzZW50KQorCQkJb3NzX2lycV9kaXNhYmxlKGlycSk7CisJCWVsc2UKKwkJCXZpYV9pcnFfZGlzYWJsZShpcnEpOworCQlicmVhazsKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCWlmIChwc2NfcHJlc2VudCkKKwkJCXBzY19pcnFfZGlzYWJsZShpcnEpOworCQllbHNlIGlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfZGlzYWJsZShpcnEpOworCQllbHNlIGlmIChpcnFfc3JjID09IDQpCisJCQlzY2NfaXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlpZiAoYmFib29uX3ByZXNlbnQpCisJCQliYWJvb25faXJxX2Rpc2FibGUoaXJxKTsKKwkJYnJlYWs7CiAJfQogfQogCi12b2lkIG1hY19jbGVhcl9pcnEoIHVuc2lnbmVkIGludCBpcnEgKQordm9pZCBtYWNfY2xlYXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3dpdGNoKElSUV9TUkMoaXJxKSkgewotCQljYXNlIDE6IHZpYV9pcnFfY2xlYXIoaXJxKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCWNhc2UgNzogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9jbGVhcihpcnEpOwotCQkJfSBlbHNlIHsKLQkJCQl2aWFfaXJxX2NsZWFyKGlycSk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJY2FzZSA2OiBpZiAocHNjX3ByZXNlbnQpIHsKLQkJCQlwc2NfaXJxX2NsZWFyKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJb3NzX2lycV9jbGVhcihpcnEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODogaWYgKGJhYm9vbl9wcmVzZW50KSB7Ci0JCQkJYmFib29uX2lycV9jbGVhcihpcnEpOwotCQkJfQotCQkJYnJlYWs7CisJY2FzZSAxOgorCQl2aWFfaXJxX2NsZWFyKGlycSk7CisJCWJyZWFrOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCW9zc19pcnFfY2xlYXIoaXJxKTsKKwkJZWxzZQorCQkJdmlhX2lycV9jbGVhcihpcnEpOworCQlicmVhazsKKwljYXNlIDM6CisJY2FzZSA0OgorCWNhc2UgNToKKwljYXNlIDY6CisJCWlmIChwc2NfcHJlc2VudCkKKwkJCXBzY19pcnFfY2xlYXIoaXJxKTsKKwkJZWxzZSBpZiAob3NzX3ByZXNlbnQpCisJCQlvc3NfaXJxX2NsZWFyKGlycSk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJaWYgKGJhYm9vbl9wcmVzZW50KQorCQkJYmFib29uX2lycV9jbGVhcihpcnEpOworCQlicmVhazsKIAl9CiB9CiAKLWludCBtYWNfaXJxX3BlbmRpbmcoIHVuc2lnbmVkIGludCBpcnEgKQoraW50IG1hY19pcnFfcGVuZGluZyh1bnNpZ25lZCBpbnQgaXJxKQogewogCXN3aXRjaChJUlFfU1JDKGlycSkpIHsKLQkJY2FzZSAxOiByZXR1cm4gdmlhX2lycV9wZW5kaW5nKGlycSk7Ci0JCWNhc2UgMjoKLQkJY2FzZSA3OiBpZiAob3NzX3ByZXNlbnQpIHsKLQkJCQlyZXR1cm4gb3NzX2lycV9wZW5kaW5nKGlycSk7Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiB2aWFfaXJxX3BlbmRpbmcoaXJxKTsKLQkJCX0KLQkJY2FzZSAzOgotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJY2FzZSA2OiBpZiAocHNjX3ByZXNlbnQpIHsKLQkJCQlyZXR1cm4gcHNjX2lycV9wZW5kaW5nKGlycSk7Ci0JCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJcmV0dXJuIG9zc19pcnFfcGVuZGluZyhpcnEpOwotCQkJfQorCWNhc2UgMToKKwkJcmV0dXJuIHZpYV9pcnFfcGVuZGluZyhpcnEpOworCWNhc2UgMjoKKwljYXNlIDc6CisJCWlmIChvc3NfcHJlc2VudCkKKwkJCXJldHVybiBvc3NfaXJxX3BlbmRpbmcoaXJxKTsKKwkJZWxzZQorCQkJcmV0dXJuIHZpYV9pcnFfcGVuZGluZyhpcnEpOworCWNhc2UgMzoKKwljYXNlIDQ6CisJY2FzZSA1OgorCWNhc2UgNjoKKwkJaWYgKHBzY19wcmVzZW50KQorCQkJcmV0dXJuIHBzY19pcnFfcGVuZGluZyhpcnEpOworCQllbHNlIGlmIChvc3NfcHJlc2VudCkKKwkJCXJldHVybiBvc3NfaXJxX3BlbmRpbmcoaXJxKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBBZGQgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSB0byBhbiBpbnRlcnJ1cHQgc291cmNlLgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCi0gKgotICogRklYTUU6IFlvdSBjYW4gcmVnaXN0ZXIgaW50ZXJydXB0cyBvbiBub25leGlzdGVudCBzb3VyY2UgKGllIFBTQzQgb24gYQotICogICAgICAgIG5vbi1QU0MgbWFjaGluZSkuIFdlIHNob3VsZCByZXR1cm4gLUVJTlZBTCBpbiB0aG9zZSBjYXNlcy4KLSAqLwotCi1pbnQgbWFjX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCSAgICBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpcnFfbm9kZV90ICpub2RlOwotCi0jaWZkZWYgREVCVUdfTUFDSU5UUwotCXByaW50ayAoIiVzOiBpcnEgJWQgcmVxdWVzdGVkIGZvciAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotI2VuZGlmCi0KLQlpZiAoaXJxIDwgVklBMV9TT1VSQ0VfQkFTRSkgewotCQlyZXR1cm4gY3B1X3JlcXVlc3RfaXJxKGlycSwgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0JfQotCi0JaWYgKGlycSA+PSBOVU1fTUFDX1NPVVJDRVMpIHsKLQkJcHJpbnRrICgiJXM6IHVua25vd24gaXJxICVkIHJlcXVlc3RlZCBieSAlc1xuIiwKLQkJICAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JfQotCi0JLyogR2V0IGEgbm9kZSBhbmQgc3RpY2sgaXQgb250byB0aGUgcmlnaHQgbGlzdCAqLwotCi0JaWYgKCEobm9kZSA9IG5ld19pcnFfbm9kZSgpKSkgcmV0dXJuIC1FTk9NRU07Ci0KLQlub2RlLT5oYW5kbGVyCT0gaGFuZGxlcjsKLQlub2RlLT5mbGFncwk9IGZsYWdzOwotCW5vZGUtPmRldl9pZAk9IGRldl9pZDsKLQlub2RlLT5kZXZuYW1lCT0gZGV2bmFtZTsKLQlub2RlLT5uZXh0CT0gTlVMTDsKLQltYWNfaW5zZXJ0X2lycSgmbWFjX2lycV9saXN0W2lycV0sIG5vZGUpOwotCi0JLyogTm93IGVuYWJsZSB0aGUgSVJRIHNvdXJjZSAqLwotCi0JbWFjX2VuYWJsZV9pcnEoaXJxKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogUmVtb3ZlcyBhbiBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lIGZyb20gYW4gaW50ZXJydXB0IHNvdXJjZS4KLSAqLwotCi12b2lkIG1hY19mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0jaWZkZWYgREVCVUdfTUFDSU5UUwotCXByaW50ayAoIiVzOiBpcnEgJWQgZnJlZWQgYnkgJXBcbiIsIF9fRlVOQ1RJT05fXywgaXJxLCBkZXZfaWQpOwotI2VuZGlmCi0KLQlpZiAoaXJxIDwgVklBMV9TT1VSQ0VfQkFTRSkgewotCQljcHVfZnJlZV9pcnEoaXJxLCBkZXZfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGlycSA+PSBOVU1fTUFDX1NPVVJDRVMpIHsKLQkJcHJpbnRrICgiJXM6IHVua25vd24gaXJxICVkIGZyZWVkXG4iLAotCQkgICAgICAgIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCW1hY19kZWxldGVfaXJxKCZtYWNfaXJxX2xpc3RbaXJxXSwgZGV2X2lkKTsKLQotCS8qIElmIHRoZSBsaXN0IGZvciB0aGlzIGludGVycnVwdCBpcyAqLwotCS8qIGVtcHR5IHRoZW4gZGlzYWJsZSB0aGUgc291cmNlLiAgICAqLwotCi0JaWYgKCFtYWNfaXJxX2xpc3RbaXJxXSkgewotCQltYWNfZGlzYWJsZV9pcnEoaXJxKTsKLQl9Ci19Ci0KLS8qCi0gKiBHZW5lcmF0ZSBhIHByZXR0eSBsaXN0aW5nIGZvciAvcHJvYy9pbnRlcnJ1cHRzCi0gKgotICogQnkgdGhlIHRpbWUgd2UncmUgY2FsbGVkIHRoZSBhdXRvdmVjdG9yIGludGVycnVwdCBsaXN0IGhhcyBhbHJlYWR5IGJlZW4KLSAqIGdlbmVyYXRlZCwgc28gd2UganVzdCBuZWVkIHRvIGRvIHRoZSBtYWNoc3BlYyBpbnRlcnJ1cHRzLgotICoKLSAqIDk5MDUwNiAoam10KSAtIHJld3JpdHRlbiB0byBoYW5kbGUgY2hhaW5lZCBtYWNoc3BlYyBpbnRlcnJ1cHQgaGFuZGxlcnMuCi0gKiAgICAgICAgICAgICAgICBBbHNvIHJlbW92ZWQgZGlzcGxheSBvZiBudW1fc3B1cmlvdXMgaXQgaXMgYWxyZWFkeQotICoJCSAgZGlzcGxheWVkIGZvciB1cyBhcyBhdXRvdmVjdG9yIGlycSAwLgotICovCi0KLWludCBzaG93X21hY19pbnRlcnJ1cHRzKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQlpcnFfbm9kZV90ICpub2RlOwotCWNoYXIgKmJhc2U7Ci0KLQkvKiBEb24ndCBkbyBOdWJ1cyBpbnRlcnJ1cHRzIGluIHRoaXMgbG9vcDsgd2UgZG8gdGhlbSBzZXBhcmF0ZWx5ICAqLwotCS8qIGJlbG93IHNvIHRoYXQgd2UgY2FuIHByaW50IHNsb3QgbnVtYmVycyBpbnN0ZWFkIG9mIElSUSBudW1iZXJzICovCi0KLQlmb3IgKGkgPSBWSUExX1NPVVJDRV9CQVNFIDsgaSA8IE5VTV9NQUNfU09VUkNFUyA7ICsraSkgewotCi0JCS8qIE5vbmV4aXN0YW50IGludGVycnVwdCBvciBub3RoaW5nIHJlZ2lzdGVyZWQ7IHNraXAgaXQuICovCi0KLQkJaWYgKChub2RlID0gbWFjX2lycV9saXN0W2ldKSA9PSBOVUxMKSBjb250aW51ZTsKLQkJaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TVEQpIGNvbnRpbnVlOwotCi0JCWJhc2UgPSAiIjsKLQkJc3dpdGNoKElSUV9TUkMoaSkpIHsKLQkJCWNhc2UgMTogYmFzZSA9ICJ2aWExIjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjogaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAib3NzIjsKLQkJCQl9IGVsc2UgewotCQkJCQliYXNlID0gInZpYTIiOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCWNhc2UgNDoKLQkJCWNhc2UgNToKLQkJCWNhc2UgNjogaWYgKHBzY19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAicHNjIjsKLQkJCQl9IGVsc2UgaWYgKG9zc19wcmVzZW50KSB7Ci0JCQkJCWJhc2UgPSAib3NzIjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoSVJRX1NSQyhpKSA9PSA0KSBiYXNlID0gInNjYyI7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSA3OiBiYXNlID0gIm5idXMiOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OiBiYXNlID0gImJibiI7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJc2VxX3ByaW50ZihwLCAiJTRzICUyZDogJTEwdSAiLCBiYXNlLCBpLCBrc3RhdF9jcHUoMCkuaXJxc1tpXSk7Ci0KLQkJZG8gewotCQkJaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19GQVNUKSB7Ci0JCQkJc2VxX3B1dHMocCwgIkYgIik7Ci0JCQl9IGVsc2UgaWYgKG5vZGUtPmZsYWdzICYgSVJRX0ZMR19TTE9XKSB7Ci0JCQkJc2VxX3B1dHMocCwgIlMgIik7Ci0JCQl9IGVsc2UgewotCQkJCXNlcV9wdXRzKHAsICIgICIpOwotCQkJfQotCQkJc2VxX3ByaW50ZihwLCAiJXNcbiIsIG5vZGUtPmRldm5hbWUpOwotCQkJaWYgKChub2RlID0gbm9kZS0+bmV4dCkpIHsKLQkJCQlzZXFfcHV0cyhwLCAiICAgICAgICAgICAgICAgICAgICAiKTsKLQkJCX0KLQkJfSB3aGlsZShub2RlKTsKLQotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtYWNfZGVmYXVsdF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0jaWZkZWYgREVCVUdfU1BVUklPVVMKLQlwcmludGsoIlVuZXhwZWN0ZWQgSVJRICVkIG9uIGRldmljZSAlcFxuIiwgaXJxLCBkZXZfaWQpOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBpbnQgbnVtX2RlYnVnWzhdOwogCiBpcnFyZXR1cm5fdCBtYWNfZGVidWdfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtNjg0LDcgKzQzMCw3IEBACiAJd2hpbGUgKG5taV9ob2xkID09IDEpCiAJCXVkZWxheSgxMDAwKTsKIAotCWlmICggY29uc29sZV9sb2dsZXZlbCA+PSA4ICkgeworCWlmIChjb25zb2xlX2xvZ2xldmVsID49IDgpIHsKICNpZiAwCiAJCXNob3dfc3RhdGUoKTsKIAkJcHJpbnRrKCJQQzogJTA4bHhcblNSOiAlMDR4ICBTUDogJXBcbiIsIGZwLT5wYywgZnAtPnNyLCBmcCk7CkBAIC03MTMsMTQgKzQ1OSwxNiBAQAogICogZG9uZSBpbiBoYXJkd2FyZSAob25seSB0aGUgUFNDIGNhbiBkbyB0aGF0LikKICAqLwogCi1zdGF0aWMgdm9pZCBzY2NfaXJxX2VuYWJsZShpbnQgaXJxKSB7Ci0JaW50IGlycV9pZHggICAgID0gSVJRX0lEWChpcnEpOworc3RhdGljIHZvaWQgc2NjX2lycV9lbmFibGUodW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgaXJxX2lkeCA9IElSUV9JRFgoaXJxKTsKIAogCXNjY19tYXNrIHw9ICgxIDw8IGlycV9pZHgpOwogfQogCi1zdGF0aWMgdm9pZCBzY2NfaXJxX2Rpc2FibGUoaW50IGlycSkgewotCWludCBpcnFfaWR4ICAgICA9IElSUV9JRFgoaXJxKTsKK3N0YXRpYyB2b2lkIHNjY19pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgaXJxKQoreworCWludCBpcnFfaWR4ID0gSVJRX0lEWChpcnEpOwogCiAJc2NjX21hc2sgJj0gfigxIDw8IGlycV9pZHgpOwogfQpAQCAtNzU1LDYgKzUwMyw4IEBACiAJLyogYW5kIHNpbmNlIHRoZXkncmUgYXV0b3ZlY3RvciBpbnRlcnJ1cHRzIHRoZXkgKi8KIAkvKiBwcmV0dHkgbXVjaCBraWxsIHRoZSBzeXN0ZW0uICAgICAgICAgICAgICAgICAqLwogCi0JaWYgKHJlZyAmIDB4MzgpIG1hY19kb19pcnFfbGlzdChJUlFfU0NDQSwgcmVncyk7Ci0JaWYgKHJlZyAmIDB4MDcpIG1hY19kb19pcnFfbGlzdChJUlFfU0NDQiwgcmVncyk7CisJaWYgKHJlZyAmIDB4MzgpCisJCW02OGtfaGFuZGxlX2ludChJUlFfU0NDQSwgcmVncyk7CisJaWYgKHJlZyAmIDB4MDcpCisJCW02OGtfaGFuZGxlX2ludChJUlFfU0NDQiwgcmVncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWFjL29zcy5jIGIvYXJjaC9tNjhrL21hYy9vc3MuYwppbmRleCAzMzM1NDc2Li42M2UwNDM2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWFjL29zcy5jCisrKyBiL2FyY2gvbTY4ay9tYWMvb3NzLmMKQEAgLTY3LDE1ICs2NywxNSBAQAogCiB2b2lkIF9faW5pdCBvc3NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQogewotCWNwdV9yZXF1ZXN0X2lycShPU1NfSVJRTEVWX1NDU0ksIG9zc19pcnEsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX1NDU0ksIG9zc19pcnEsIElSUV9GTEdfTE9DSywKIAkJCSJzY3NpIiwgKHZvaWQgKikgb3NzKTsKLQljcHVfcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9JT1BTQ0MsIG1hY19zY2NfZGlzcGF0Y2gsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX0lPUFNDQywgbWFjX3NjY19kaXNwYXRjaCwgSVJRX0ZMR19MT0NLLAogCQkJInNjYyIsIG1hY19zY2NfZGlzcGF0Y2gpOwotCWNwdV9yZXF1ZXN0X2lycShPU1NfSVJRTEVWX05VQlVTLCBvc3NfbnVidXNfaXJxLCBJUlFfRkxHX0xPQ0ssCisJcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9OVUJVUywgb3NzX251YnVzX2lycSwgSVJRX0ZMR19MT0NLLAogCQkJIm51YnVzIiwgKHZvaWQgKikgb3NzKTsKLQljcHVfcmVxdWVzdF9pcnEoT1NTX0lSUUxFVl9TT1VORCwgb3NzX2lycSwgSVJRX0ZMR19MT0NLLAorCXJlcXVlc3RfaXJxKE9TU19JUlFMRVZfU09VTkQsIG9zc19pcnEsIElSUV9GTEdfTE9DSywKIAkJCSJzb3VuZCIsICh2b2lkICopIG9zcyk7Ci0JY3B1X3JlcXVlc3RfaXJxKE9TU19JUlFMRVZfVklBMSwgdmlhMV9pcnEsIElSUV9GTEdfTE9DSywKKwlyZXF1ZXN0X2lycShPU1NfSVJRTEVWX1ZJQTEsIHZpYTFfaXJxLCBJUlFfRkxHX0xPQ0ssCiAJCQkidmlhMSIsICh2b2lkICopIHZpYTEpOwogfQogCkBAIC0xMTMsNyArMTEzLDcgQEAKIAkJb3NzLT5pcnFfcGVuZGluZyAmPSB+T1NTX0lQX1NPVU5EOwogCX0gZWxzZSBpZiAoZXZlbnRzICYgT1NTX0lQX1NDU0kpIHsKIAkJb3NzLT5pcnFfbGV2ZWxbT1NTX1NDU0ldID0gT1NTX0lSUUxFVl9ESVNBQkxFRDsKLQkJbWFjX2RvX2lycV9saXN0KElSUV9NQUNfU0NTSSwgcmVncyk7CisJCW02OGtfaGFuZGxlX2ludChJUlFfTUFDX1NDU0ksIHJlZ3MpOwogCQlvc3MtPmlycV9wZW5kaW5nICY9IH5PU1NfSVBfU0NTSTsKIAkJb3NzLT5pcnFfbGV2ZWxbT1NTX1NDU0ldID0gT1NTX0lSUUxFVl9TQ1NJOwogCX0gZWxzZSB7CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlmb3IgKGkgPSAwLCBpcnFfYml0ID0gMSA7IGkgPCA2IDsgaSsrLCBpcnFfYml0IDw8PSAxKSB7CiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQlvc3MtPmlycV9sZXZlbFtpXSA9IE9TU19JUlFMRVZfRElTQUJMRUQ7Ci0JCQltYWNfZG9faXJxX2xpc3QoTlVCVVNfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKKwkJCW02OGtfaGFuZGxlX2ludChOVUJVU19TT1VSQ0VfQkFTRSArIGksIHJlZ3MpOwogCQkJb3NzLT5pcnFfcGVuZGluZyAmPSB+aXJxX2JpdDsKIAkJCW9zcy0+aXJxX2xldmVsW2ldID0gT1NTX0lSUUxFVl9OVUJVUzsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9wc2MuYyBiL2FyY2gvbTY4ay9tYWMvcHNjLmMKaW5kZXggZTcyMzg0ZS4uZTI2MjE4MCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9wc2MuYworKysgYi9hcmNoL202OGsvbWFjL3BzYy5jCkBAIC0xMTcsMTAgKzExNywxMCBAQAogCiB2b2lkIF9faW5pdCBwc2NfcmVnaXN0ZXJfaW50ZXJydXB0cyh2b2lkKQogewotCWNwdV9yZXF1ZXN0X2lycSgzLCBwc2NfaXJxLCBJUlFfRkxHX0xPQ0ssICJwc2MzIiwgKHZvaWQgKikgMHgzMCk7Ci0JY3B1X3JlcXVlc3RfaXJxKDQsIHBzY19pcnEsIElSUV9GTEdfTE9DSywgInBzYzQiLCAodm9pZCAqKSAweDQwKTsKLQljcHVfcmVxdWVzdF9pcnEoNSwgcHNjX2lycSwgSVJRX0ZMR19MT0NLLCAicHNjNSIsICh2b2lkICopIDB4NTApOwotCWNwdV9yZXF1ZXN0X2lycSg2LCBwc2NfaXJxLCBJUlFfRkxHX0xPQ0ssICJwc2M2IiwgKHZvaWQgKikgMHg2MCk7CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fMywgcHNjX2lycSwgMCwgInBzYzMiLCAodm9pZCAqKSAweDMwKTsKKwlyZXF1ZXN0X2lycShJUlFfQVVUT180LCBwc2NfaXJxLCAwLCAicHNjNCIsICh2b2lkICopIDB4NDApOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzUsIHBzY19pcnEsIDAsICJwc2M1IiwgKHZvaWQgKikgMHg1MCk7CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fNiwgcHNjX2lycSwgMCwgInBzYzYiLCAodm9pZCAqKSAweDYwKTsKIH0KIAogLyoKQEAgLTE0OSw3ICsxNDksNyBAQAogCWZvciAoaSA9IDAsIGlycV9iaXQgPSAxIDsgaSA8IDQgOyBpKyssIGlycV9iaXQgPDw9IDEpIHsKIAkgICAgICAgIGlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQlwc2Nfd3JpdGVfYnl0ZShwSUVSLCBpcnFfYml0KTsKLQkJCW1hY19kb19pcnFfbGlzdChiYXNlX2lycSArIGksIHJlZ3MpOworCQkJbTY4a19oYW5kbGVfaW50KGJhc2VfaXJxICsgaSwgcmVncyk7CiAJCQlwc2Nfd3JpdGVfYnl0ZShwSUZSLCBpcnFfYml0KTsKIAkJCXBzY193cml0ZV9ieXRlKHBJRVIsIGlycV9iaXQgfCAweDgwKTsKIAkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy92aWEuYyBiL2FyY2gvbTY4ay9tYWMvdmlhLmMKaW5kZXggY2Q1MjhiZi4uYzRhYTM0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy92aWEuYworKysgYi9hcmNoL202OGsvbWFjL3ZpYS5jCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkZS5oPgogCi0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+CiAjaW5jbHVkZSA8YXNtL2Jvb3RpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL21hY2ludG9zaC5oPgogI2luY2x1ZGUgPGFzbS9tYWNpbnRzLmg+CkBAIC03MSw3ICs3MCw2IEBACiB2b2lkIHZpYV9pcnFfZGlzYWJsZShpbnQgaXJxKTsKIHZvaWQgdmlhX2lycV9jbGVhcihpbnQgaXJxKTsKIAotZXh0ZXJuIGlycXJldHVybl90IG1hY19iYW5nKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiBpcnFyZXR1cm5fdCBtYWNfc2NjX2Rpc3BhdGNoKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIGV4dGVybiBpbnQgb3NzX3ByZXNlbnQ7CiAKQEAgLTIxMiwxMSArMjEwLDYgQEAKIAkJCWJyZWFrOwogCX0KICNlbHNlCi0JLyogVGhlIGFsZXJuYXRlIElSUSBtYXBwaW5nIHNlZW1zIHRvIGp1c3Qgbm90IHdvcmsuIEFueW9uZSB3aXRoIGEgICAqLwotCS8qIHN1cHBvcnRlZCBtYWNoaW5lIGlzIHdlbGNvbWUgdG8gdGFrZSBhIHN0YWIgYXQgZml4aW5nIGl0LiBJdCAgICAgKi8KLQkvKiBfc2hvdWxkXyB3b3JrIG9uIHRoZSBmb2xsb3dpbmcgUXVhZHJhczogNjEwLDY1MCw3MDAsODAwLDkwMCw5NTAgICovCi0JLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMTk5OS0wNi0xMiAoam10KSAqLwotCiAJdmlhX2FsdF9tYXBwaW5nID0gMDsKICNlbmRpZgogCkBAIC0yNjAsMjcgKzI1MywyMSBAQAogdm9pZCBfX2luaXQgdmlhX3JlZ2lzdGVyX2ludGVycnVwdHModm9pZCkKIHsKIAlpZiAodmlhX2FsdF9tYXBwaW5nKSB7Ci0JCWNwdV9yZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKKwkJcmVxdWVzdF9pcnEoSVJRX0FVVE9fMSwgdmlhMV9pcnEsCiAJCQkJSVJRX0ZMR19MT0NLfElSUV9GTEdfRkFTVCwgInNvZnR3YXJlIiwKIAkJCQkodm9pZCAqKSB2aWExKTsKLQkJY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzYsIHZpYTFfaXJxLAorCQlyZXF1ZXN0X2lycShJUlFfQVVUT182LCB2aWExX2lycSwKIAkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCiAJCQkJKHZvaWQgKikgdmlhMSk7CiAJfSBlbHNlIHsKLQkJY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzEsIHZpYTFfaXJxLAorCQlyZXF1ZXN0X2lycShJUlFfQVVUT18xLCB2aWExX2lycSwKIAkJCQlJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULCAidmlhMSIsCiAJCQkJKHZvaWQgKikgdmlhMSk7Ci0jaWYgMCAvKiBpbnRlcmZlcmVzIHdpdGggc2VyaWFsIG9uIHNvbWUgbWFjaGluZXMgKi8KLQkJaWYgKCFwc2NfcHJlc2VudCkgewotCQkJY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzYsIG1hY19iYW5nLCBJUlFfRkxHX0xPQ0ssCi0JCQkJCSJPZmYgU3dpdGNoIiwgbWFjX2JhbmcpOwotCQl9Ci0jZW5kaWYKIAl9Ci0JY3B1X3JlcXVlc3RfaXJxKElSUV9BVVRPXzIsIHZpYTJfaXJxLCBJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULAorCXJlcXVlc3RfaXJxKElSUV9BVVRPXzIsIHZpYTJfaXJxLCBJUlFfRkxHX0xPQ0t8SVJRX0ZMR19GQVNULAogCQkJInZpYTIiLCAodm9pZCAqKSB2aWEyKTsKIAlpZiAoIXBzY19wcmVzZW50KSB7Ci0JCWNwdV9yZXF1ZXN0X2lycShJUlFfQVVUT180LCBtYWNfc2NjX2Rpc3BhdGNoLCBJUlFfRkxHX0xPQ0ssCisJCXJlcXVlc3RfaXJxKElSUV9BVVRPXzQsIG1hY19zY2NfZGlzcGF0Y2gsIElSUV9GTEdfTE9DSywKIAkJCQkic2NjIiwgbWFjX3NjY19kaXNwYXRjaCk7CiAJfQogCXJlcXVlc3RfaXJxKElSUV9NQUNfTlVCVVMsIHZpYV9udWJ1c19pcnEsIElSUV9GTEdfTE9DS3xJUlFfRkxHX0ZBU1QsCkBAIC00MzcsNyArNDI0LDcgQEAKIAlmb3IgKGkgPSAwLCBpcnFfYml0ID0gMSA7IGkgPCA3IDsgaSsrLCBpcnFfYml0IDw8PSAxKQogCQlpZiAoZXZlbnRzICYgaXJxX2JpdCkgewogCQkJdmlhMVt2SUVSXSA9IGlycV9iaXQ7Ci0JCQltYWNfZG9faXJxX2xpc3QoVklBMV9TT1VSQ0VfQkFTRSArIGksIHJlZ3MpOworCQkJbTY4a19oYW5kbGVfaW50KFZJQTFfU09VUkNFX0JBU0UgKyBpLCByZWdzKTsKIAkJCXZpYTFbdklGUl0gPSBpcnFfYml0OwogCQkJdmlhMVt2SUVSXSA9IGlycV9iaXQgfCAweDgwOwogCQl9CkBAIC00NTIsNyArNDM5LDcgQEAKIAkJLyogTm8sIGl0IHdvbid0IGJlIHNldC4gdGhhdCdzIHdoeSB3ZSdyZSBkb2luZyB0aGlzLiAqLwogCQl2aWFfaXJxX2Rpc2FibGUoSVJRX01BQ19OVUJVUyk7CiAJCXZpYV9pcnFfY2xlYXIoSVJRX01BQ19OVUJVUyk7Ci0JCW1hY19kb19pcnFfbGlzdChJUlFfTUFDX05VQlVTLCByZWdzKTsKKwkJbTY4a19oYW5kbGVfaW50KElSUV9NQUNfTlVCVVMsIHJlZ3MpOwogCQl2aWFfaXJxX2VuYWJsZShJUlFfTUFDX05VQlVTKTsKIAl9CiAjZW5kaWYKQEAgLTQ3MSw4ICs0NTgsOCBAQAogCWZvciAoaSA9IDAsIGlycV9iaXQgPSAxIDsgaSA8IDcgOyBpKyssIGlycV9iaXQgPDw9IDEpCiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQl2aWEyW2dJRVJdID0gaXJxX2JpdDsKLQkJCW1hY19kb19pcnFfbGlzdChWSUEyX1NPVVJDRV9CQVNFICsgaSwgcmVncyk7CiAJCQl2aWEyW2dJRlJdID0gaXJxX2JpdCB8IHJidl9jbGVhcjsKKwkJCW02OGtfaGFuZGxlX2ludChWSUEyX1NPVVJDRV9CQVNFICsgaSwgcmVncyk7CiAJCQl2aWEyW2dJRVJdID0gaXJxX2JpdCB8IDB4ODA7CiAJCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC00OTQsNyArNDgxLDcgQEAKIAlmb3IgKGkgPSAwLCBpcnFfYml0ID0gMSA7IGkgPCA3IDsgaSsrLCBpcnFfYml0IDw8PSAxKSB7CiAJCWlmIChldmVudHMgJiBpcnFfYml0KSB7CiAJCQl2aWFfaXJxX2Rpc2FibGUoTlVCVVNfU09VUkNFX0JBU0UgKyBpKTsKLQkJCW1hY19kb19pcnFfbGlzdChOVUJVU19TT1VSQ0VfQkFTRSArIGksIHJlZ3MpOworCQkJbTY4a19oYW5kbGVfaW50KE5VQlVTX1NPVVJDRV9CQVNFICsgaSwgcmVncyk7CiAJCQl2aWFfaXJxX2VuYWJsZShOVUJVU19TT1VSQ0VfQkFTRSArIGkpOwogCQl9CiAJfQpAQCAtNTI5LDYgKzUxNiw3IEBACiAJCX0KIAkJdmlhMltnSUVSXSA9IGlycV9iaXQgfCAweDgwOwogCX0gZWxzZSBpZiAoaXJxX3NyYyA9PSA3KSB7CisJCW51YnVzX2FjdGl2ZSB8PSBpcnFfYml0OwogCQlpZiAocmJ2X3ByZXNlbnQpIHsKIAkJCS8qIGVuYWJsZSB0aGUgc2xvdCBpbnRlcnJ1cHQuIFNJRVIgd29ya3MgbGlrZSBJRVIuICovCiAJCQl2aWEyW3JTSUVSXSA9IElFUl9TRVRfQklUKGlycV9pZHgpOwpAQCAtNTUwLDcgKzUzOCw2IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCW51YnVzX2FjdGl2ZSB8PSBpcnFfYml0OwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2ttYXAuYyBiL2FyY2gvbTY4ay9tbS9rbWFwLmMKaW5kZXggODVhZDE5YS4uNDNmZmFiMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2ttYXAuYworKysgYi9hcmNoL202OGsvbW0va21hcC5jCkBAIC0yNTksMTMgKzI1OSwxNSBAQAogCiAJCWlmIChDUFVfSVNfMDIwX09SXzAzMCkgewogCQkJaW50IHBtZF9vZmYgPSAodmlydGFkZHIvUFRSVFJFRVNJWkUpICYgMTU7CisJCQlpbnQgcG1kX3R5cGUgPSBwbWRfZGlyLT5wbWRbcG1kX29mZl0gJiBfREVTQ1RZUEVfTUFTSzsKIAotCQkJaWYgKChwbWRfZGlyLT5wbWRbcG1kX29mZl0gJiBfREVTQ1RZUEVfTUFTSykgPT0gX1BBR0VfUFJFU0VOVCkgeworCQkJaWYgKHBtZF90eXBlID09IF9QQUdFX1BSRVNFTlQpIHsKIAkJCQlwbWRfZGlyLT5wbWRbcG1kX29mZl0gPSAwOwogCQkJCXZpcnRhZGRyICs9IFBUUlRSRUVTSVpFOwogCQkJCXNpemUgLT0gUFRSVFJFRVNJWkU7CiAJCQkJY29udGludWU7Ci0JCQl9CisJCQl9IGVsc2UgaWYgKHBtZF90eXBlID09IDApCisJCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAocG1kX2JhZCgqcG1kX2RpcikpIHsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9tb3Rvcm9sYS5jIGIvYXJjaC9tNjhrL21tL21vdG9yb2xhLmMKaW5kZXggYWZiNTdlZS4uYmRiMTExMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL21vdG9yb2xhLmMKKysrIGIvYXJjaC9tNjhrL21tL21vdG9yb2xhLmMKQEAgLTIwMyw3ICsyMDMsNyBAQAogewogCWludCBjaHVuazsKIAl1bnNpZ25lZCBsb25nIG1lbV9hdmFpbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyB6b25lc19zaXplWzNdID0geyAwLCB9OworCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdID0geyAwLCB9OwogCiAjaWZkZWYgREVCVUcKIAl7CkBAIC0yNTcsMTIgKzI1NywxMiBAQAogI2lmZGVmIERFQlVHCiAJcHJpbnRrICgiYmVmb3JlIGZyZWVfYXJlYV9pbml0XG4iKTsKICNlbmRpZgotCXpvbmVzX3NpemVbMF0gPSAobWFjaF9tYXhfZG1hX2FkZHJlc3MgPCAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSA/Ci0JCQkgKG1hY2hfbWF4X2RtYV9hZGRyZXNzKzEpIDogKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpOwotCXpvbmVzX3NpemVbMV0gPSAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSAtIHpvbmVzX3NpemVbMF07CisJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSAobWFjaF9tYXhfZG1hX2FkZHJlc3MgPCAodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSA/CisJCQkJKG1hY2hfbWF4X2RtYV9hZGRyZXNzKzEpIDogKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpOworCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID0gKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkgLSB6b25lc19zaXplWzBdOwogCi0Jem9uZXNfc2l6ZVswXSA9ICh6b25lc19zaXplWzBdIC0gUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQ7Ci0Jem9uZXNfc2l6ZVsxXSA+Pj0gUEFHRV9TSElGVDsKKwl6b25lc19zaXplW1pPTkVfRE1BXSA9ICh6b25lc19zaXplW1pPTkVfRE1BXSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUOworCXpvbmVzX3NpemVbWk9ORV9OT1JNQUxdID4+PSBQQUdFX1NISUZUOwogCiAJZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vc3VuM21tdS5jIGIvYXJjaC9tNjhrL21tL3N1bjNtbXUuYwppbmRleCBhNDdiZTE5Li5hYzY2NDBhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbW0vc3VuM21tdS5jCisrKyBiL2FyY2gvbTY4ay9tbS9zdW4zbW11LmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiAJdW5zaWduZWQgbG9uZyBuZXh0X3BndGFibGU7CiAJdW5zaWduZWQgbG9uZyBib290bWVtX2VuZDsKLQl1bnNpZ25lZCBsb25nIHpvbmVzX3NpemVbM10gPSB7MCwgMCwgMH07CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU10gPSB7IDAsIH07CiAJdW5zaWduZWQgbG9uZyBzaXplOwogCiAKQEAgLTkyLDggKzkyLDcgQEAKIAljdXJyZW50LT5tbSA9IE5VTEw7CiAKIAkvKiBtZW1vcnkgc2l6aW5nIGlzIGEgaGFjayBzdG9sZW4gZnJvbSBtb3Rvcm9sYS5jLi4gIGhvcGUgaXQgd29ya3MgZm9yIHVzICovCi0Jem9uZXNfc2l6ZVswXSA9ICgodW5zaWduZWQgbG9uZyloaWdoX21lbW9yeSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUOwotCXpvbmVzX3NpemVbMV0gPSAwOworCXpvbmVzX3NpemVbWk9ORV9ETUFdID0gKCh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5IC0gUEFHRV9PRkZTRVQpID4+IFBBR0VfU0hJRlQ7CiAKIAlmcmVlX2FyZWFfaW5pdCh6b25lc19zaXplKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNDcvMTQ3aW50cy5jIGIvYXJjaC9tNjhrL212bWUxNDcvMTQ3aW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE3NDRlLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9tdm1lMTQ3LzE0N2ludHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKgotICogYXJjaC9tNjhrL212bWUxNDcvMTQ3aW50cy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk3IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KLSAqCi0gKiBiYXNlZCBvbiBhbWlpbnRzLmMgLS0gQW1pZ2EgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBSRUFETUUubGVnYWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3RyYXBzLmg+Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtdm1lMTQ3X2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKLQotLyoKLSAqIFRoaXMgc2hvdWxkIGlkZWFsbHkgYmUgNCBlbGVtZW50cyBvbmx5LCBmb3Igc3BlZWQuCi0gKi8KLQotc3RhdGljIHN0cnVjdCB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQl2b2lkCQkqZGV2X2lkOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci0JdW5zaWduZWQJY291bnQ7Ci19IGlycV90YWJbMjU2XTsKLQotLyoKLSAqIHZvaWQgbXZtZTE0N19pbml0X0lSUSAodm9pZCkKLSAqCi0gKiBQYXJhbWV0ZXJzOglOb25lCi0gKgotICogUmV0dXJuczoJTm90aGluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCi0gKiB0aGUgbXZtZTE0NyBJUlEgaGFuZGxpbmcgcm91dGluZXMuCi0gKi8KLQotdm9pZCBtdm1lMTQ3X2luaXRfSVJRICh2b2lkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0JCWlycV90YWJbaV0uaGFuZGxlciA9IG12bWUxNDdfZGVmaGFuZDsKLQkJaXJxX3RhYltpXS5mbGFncyA9IElSUV9GTEdfU1REOwotCQlpcnFfdGFiW2ldLmRldl9pZCA9IE5VTEw7Ci0JCWlycV90YWJbaV0uZGV2bmFtZSA9IE5VTEw7Ci0JCWlycV90YWJbaV0uY291bnQgPSAwOwotCX0KLX0KLQotaW50IG12bWUxNDdfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotCWlmIChpcnEgPiAyNTUpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCWlmICghKGlycV90YWJbaXJxXS5mbGFncyAmIElSUV9GTEdfU1REKSkgewotCQlpZiAoaXJxX3RhYltpcnFdLmZsYWdzICYgSVJRX0ZMR19MT0NLKSB7Ci0JCQlwcmludGsoIiVzOiBJUlEgJWQgZnJvbSAlcyBpcyBub3QgcmVwbGFjZWFibGVcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxXS5kZXZuYW1lKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJaWYgKGZsYWdzICYgSVJRX0ZMR19SRVBMQUNFKSB7Ci0JCQlwcmludGsoIiVzOiAlcyBjYW4ndCByZXBsYWNlIElSUSAlZCBmcm9tICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGV2bmFtZSwgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JfQotCWlycV90YWJbaXJxXS5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfdGFiW2lycV0uZmxhZ3MgICA9IGZsYWdzOwotCWlycV90YWJbaXJxXS5kZXZfaWQgID0gZGV2X2lkOwotCWlycV90YWJbaXJxXS5kZXZuYW1lID0gZGV2bmFtZTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtdm1lMTQ3X2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAoaXJxX3RhYltpcnFdLmRldl9pZCAhPSBkZXZfaWQpCi0JCXByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxXS5kZXZuYW1lKTsKLQotCWlycV90YWJbaXJxXS5oYW5kbGVyID0gbXZtZTE0N19kZWZoYW5kOwotCWlycV90YWJbaXJxXS5mbGFncyAgID0gSVJRX0ZMR19TVEQ7Ci0JaXJxX3RhYltpcnFdLmRldl9pZCAgPSBOVUxMOwotCWlycV90YWJbaXJxXS5kZXZuYW1lID0gTlVMTDsKLX0KLQotaXJxcmV0dXJuX3QgbXZtZTE0N19wcm9jZXNzX2ludCAodW5zaWduZWQgbG9uZyB2ZWMsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlpZiAodmVjID4gMjU1KSB7Ci0JCXByaW50ayAoIm12bWUxNDdfcHJvY2Vzc19pbnQ6IElsbGVnYWwgdmVjdG9yICVsZFxuIiwgdmVjKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0gZWxzZSB7Ci0JCWlycV90YWJbdmVjXS5jb3VudCsrOwotCQlpcnFfdGFiW3ZlY10uaGFuZGxlcih2ZWMsIGlycV90YWJbdmVjXS5kZXZfaWQsIGZwKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLX0KLQotaW50IHNob3dfbXZtZTE0N19pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLQkJaWYgKGlycV90YWJbaV0uY291bnQpCi0JCQlzZXFfcHJpbnRmKHAsICJWZWMgMHglMDJ4OiAlOGQgICVzXG4iLAotCQkJICAgIGksIGlycV90YWJbaV0uY291bnQsCi0JCQkgICAgaXJxX3RhYltpXS5kZXZuYW1lID8gaXJxX3RhYltpXS5kZXZuYW1lIDogImZyZWUiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlycXJldHVybl90IG12bWUxNDdfZGVmaGFuZCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JcHJpbnRrICgiVW5rbm93biBpbnRlcnJ1cHQgMHglMDJ4XG4iLCBpcnEpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotdm9pZCBtdm1lMTQ3X2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KLQotdm9pZCBtdm1lMTQ3X2Rpc2FibGVfaXJxICh1bnNpZ25lZCBpbnQgaXJxKQotewotfQotCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbXZtZTE0Ny9NYWtlZmlsZSBiL2FyY2gvbTY4ay9tdm1lMTQ3L01ha2VmaWxlCmluZGV4IGYwMTUzZWQuLmEzNmQzOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tdm1lMTQ3L01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9tdm1lMTQ3L01ha2VmaWxlCkBAIC0yLDQgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgTGludXggYXJjaC9tNjhrL212bWUxNDcgc291cmNlIGRpcmVjdG9yeQogIwogCi1vYmoteQkJOj0gY29uZmlnLm8gMTQ3aW50cy5vCitvYmoteQkJOj0gY29uZmlnLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTQ3L2NvbmZpZy5jIGIvYXJjaC9tNjhrL212bWUxNDcvY29uZmlnLmMKaW5kZXggMGZjZjk3Mi4uMGNkMGU1YiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL212bWUxNDcvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL212bWUxNDcvY29uZmlnLmMKQEAgLTM2LDE1ICszNiw4IEBACiAjaW5jbHVkZSA8YXNtL212bWUxNDdody5oPgogCiAKLWV4dGVybiBpcnFyZXR1cm5fdCBtdm1lMTQ3X3Byb2Nlc3NfaW50IChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLWV4dGVybiB2b2lkIG12bWUxNDdfaW5pdF9JUlEgKHZvaWQpOwotZXh0ZXJuIHZvaWQgbXZtZTE0N19mcmVlX2lycSAodW5zaWduZWQgaW50LCB2b2lkICopOwotZXh0ZXJuIGludCAgc2hvd19tdm1lMTQ3X2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgbXZtZTE0N19lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgbXZtZTE0N19kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIG12bWUxNDdfZ2V0X21vZGVsKGNoYXIgKm1vZGVsKTsKIHN0YXRpYyBpbnQgIG12bWUxNDdfZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqYnVmZmVyKTsKLWV4dGVybiBpbnQgbXZtZTE0N19yZXF1ZXN0X2lycSAodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCBtdm1lMTQ3X3NjaGVkX2luaXQoaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXZtZTE0N19nZXR0aW1lb2Zmc2V0ICh2b2lkKTsKIGV4dGVybiBpbnQgbXZtZTE0N19od2NsayAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CkBAIC05MSw2ICs4NCwxNSBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKKyAqIHRoZSBtdm1lMTQ3IElSUSBoYW5kbGluZyByb3V0aW5lcy4KKyAqLworCit2b2lkIG12bWUxNDdfaW5pdF9JUlEodm9pZCkKK3sKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOworfQogCiB2b2lkIF9faW5pdCBjb25maWdfbXZtZTE0Nyh2b2lkKQogewpAQCAtMTAxLDEyICsxMDMsNiBAQAogCW1hY2hfaHdjbGsJCT0gbXZtZTE0N19od2NsazsKIAltYWNoX3NldF9jbG9ja19tbXNzCT0gbXZtZTE0N19zZXRfY2xvY2tfbW1zczsKIAltYWNoX3Jlc2V0CQk9IG12bWUxNDdfcmVzZXQ7Ci0JbWFjaF9mcmVlX2lycQkJPSBtdm1lMTQ3X2ZyZWVfaXJxOwotCW1hY2hfcHJvY2Vzc19pbnQJPSBtdm1lMTQ3X3Byb2Nlc3NfaW50OwotCW1hY2hfZ2V0X2lycV9saXN0CT0gc2hvd19tdm1lMTQ3X2ludGVycnVwdHM7Ci0JbWFjaF9yZXF1ZXN0X2lycQk9IG12bWUxNDdfcmVxdWVzdF9pcnE7Ci0JZW5hYmxlX2lycQkJPSBtdm1lMTQ3X2VuYWJsZV9pcnE7Ci0JZGlzYWJsZV9pcnEJCT0gbXZtZTE0N19kaXNhYmxlX2lycTsKIAltYWNoX2dldF9tb2RlbAkJPSBtdm1lMTQ3X2dldF9tb2RlbDsKIAltYWNoX2dldF9oYXJkd2FyZV9saXN0CT0gbXZtZTE0N19nZXRfaGFyZHdhcmVfbGlzdDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvMTZ4aW50cy5jIGIvYXJjaC9tNjhrL212bWUxNngvMTZ4aW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTNlZjczLi4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9tdm1lMTZ4LzE2eGludHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKgotICogYXJjaC9tNjhrL212bWUxNngvMTZ4aW50cy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1IFJpY2hhcmQgSGlyc3QgW3JpY2hhcmRAc2xlZXBpZS5kZW1vbi5jby51a10KLSAqCi0gKiBiYXNlZCBvbiBhbWlpbnRzLmMgLS0gQW1pZ2EgTGludXggaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUKLSAqCi0gKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBSRUFETUUubGVnYWwgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotCi0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBtdm1lMTZ4X2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKLQotLyoKLSAqIFRoaXMgc2hvdWxkIGlkZWFsbHkgYmUgNCBlbGVtZW50cyBvbmx5LCBmb3Igc3BlZWQuCi0gKi8KLQotc3RhdGljIHN0cnVjdCB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQl2b2lkCQkqZGV2X2lkOwotCWNvbnN0IGNoYXIJKmRldm5hbWU7Ci0JdW5zaWduZWQJY291bnQ7Ci19IGlycV90YWJbMTkyXTsKLQotLyoKLSAqIHZvaWQgbXZtZTE2eF9pbml0X0lSUSAodm9pZCkKLSAqCi0gKiBQYXJhbWV0ZXJzOglOb25lCi0gKgotICogUmV0dXJuczoJTm90aGluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGR1cmluZyBrZXJuZWwgc3RhcnR1cCB0byBpbml0aWFsaXplCi0gKiB0aGUgbXZtZTE2eCBJUlEgaGFuZGxpbmcgcm91dGluZXMuICBTaG91bGQgcHJvYmFibHkgZW5zdXJlCi0gKiB0aGF0IHRoZSBiYXNlIHZlY3RvcnMgZm9yIHRoZSBWTUVDaGlwMiBhbmQgUENDQ2hpcDIgYXJlIHZhbGlkLgotICovCi0KLXZvaWQgbXZtZTE2eF9pbml0X0lSUSAodm9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAxOTI7IGkrKykgewotCQlpcnFfdGFiW2ldLmhhbmRsZXIgPSBtdm1lMTZ4X2RlZmhhbmQ7Ci0JCWlycV90YWJbaV0uZmxhZ3MgPSBJUlFfRkxHX1NURDsKLQkJaXJxX3RhYltpXS5kZXZfaWQgPSBOVUxMOwotCQlpcnFfdGFiW2ldLmRldm5hbWUgPSBOVUxMOwotCQlpcnFfdGFiW2ldLmNvdW50ID0gMDsKLQl9Ci19Ci0KLWludCBtdm1lMTZ4X3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsCi0JCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxIDwgNjQgfHwgaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQgZnJvbSAlc1xuIiwgX19GVU5DVElPTl9fLCBpcnEsIGRldm5hbWUpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQotCWlmICghKGlycV90YWJbaXJxLTY0XS5mbGFncyAmIElSUV9GTEdfU1REKSkgewotCQlpZiAoaXJxX3RhYltpcnEtNjRdLmZsYWdzICYgSVJRX0ZMR19MT0NLKSB7Ci0JCQlwcmludGsoIiVzOiBJUlEgJWQgZnJvbSAlcyBpcyBub3QgcmVwbGFjZWFibGVcbiIsCi0JCQkgICAgICAgX19GVU5DVElPTl9fLCBpcnEsIGlycV90YWJbaXJxLTY0XS5kZXZuYW1lKTsKLQkJCXJldHVybiAtRUJVU1k7Ci0JCX0KLQkJaWYgKGZsYWdzICYgSVJRX0ZMR19SRVBMQUNFKSB7Ci0JCQlwcmludGsoIiVzOiAlcyBjYW4ndCByZXBsYWNlIElSUSAlZCBmcm9tICVzXG4iLAotCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZGV2bmFtZSwgaXJxLCBpcnFfdGFiW2lycS02NF0uZGV2bmFtZSk7Ci0JCQlyZXR1cm4gLUVCVVNZOwotCQl9Ci0JfQotCWlycV90YWJbaXJxLTY0XS5oYW5kbGVyID0gaGFuZGxlcjsKLQlpcnFfdGFiW2lycS02NF0uZmxhZ3MgICA9IGZsYWdzOwotCWlycV90YWJbaXJxLTY0XS5kZXZfaWQgID0gZGV2X2lkOwotCWlycV90YWJbaXJxLTY0XS5kZXZuYW1lID0gZGV2bmFtZTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBtdm1lMTZ4X2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxIDwgNjQgfHwgaXJxID4gMjU1KSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChpcnFfdGFiW2lycS02NF0uZGV2X2lkICE9IGRldl9pZCkKLQkJcHJpbnRrKCIlczogUmVtb3ZpbmcgcHJvYmFibHkgd3JvbmcgSVJRICVkIGZyb20gJXNcbiIsCi0JCSAgICAgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX3RhYltpcnEtNjRdLmRldm5hbWUpOwotCi0JaXJxX3RhYltpcnEtNjRdLmhhbmRsZXIgPSBtdm1lMTZ4X2RlZmhhbmQ7Ci0JaXJxX3RhYltpcnEtNjRdLmZsYWdzICAgPSBJUlFfRkxHX1NURDsKLQlpcnFfdGFiW2lycS02NF0uZGV2X2lkICA9IE5VTEw7Ci0JaXJxX3RhYltpcnEtNjRdLmRldm5hbWUgPSBOVUxMOwotfQotCi1pcnFyZXR1cm5fdCBtdm1lMTZ4X3Byb2Nlc3NfaW50ICh1bnNpZ25lZCBsb25nIHZlYywgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmICh2ZWMgPCA2NCB8fCB2ZWMgPiAyNTUpIHsKLQkJcHJpbnRrICgibXZtZTE2eF9wcm9jZXNzX2ludDogSWxsZWdhbCB2ZWN0b3IgJWxkIiwgdmVjKTsKLQkJcmV0dXJuIElSUV9OT05FOwotCX0gZWxzZSB7Ci0JCWlycV90YWJbdmVjLTY0XS5jb3VudCsrOwotCQlpcnFfdGFiW3ZlYy02NF0uaGFuZGxlcih2ZWMsIGlycV90YWJbdmVjLTY0XS5kZXZfaWQsIGZwKTsKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0KLX0KLQotaW50IHNob3dfbXZtZTE2eF9pbnRlcnJ1cHRzIChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspIHsKLQkJaWYgKGlycV90YWJbaV0uY291bnQpCi0JCQlzZXFfcHJpbnRmKHAsICJWZWMgMHglMDJ4OiAlOGQgICVzXG4iLAotCQkJICAgIGkrNjQsIGlycV90YWJbaV0uY291bnQsCi0JCQkgICAgaXJxX3RhYltpXS5kZXZuYW1lID8gaXJxX3RhYltpXS5kZXZuYW1lIDogImZyZWUiKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGlycXJldHVybl90IG12bWUxNnhfZGVmaGFuZCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCi17Ci0JcHJpbnRrICgiVW5rbm93biBpbnRlcnJ1cHQgMHglMDJ4XG4iLCBpcnEpOwotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotCi12b2lkIG12bWUxNnhfZW5hYmxlX2lycSAodW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQotCi12b2lkIG12bWUxNnhfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCi17Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL212bWUxNngvTWFrZWZpbGUgYi9hcmNoL202OGsvbXZtZTE2eC9NYWtlZmlsZQppbmRleCA1MTI5ZjU2Li45NTBlODJmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbXZtZTE2eC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvbXZtZTE2eC9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIExpbnV4IGFyY2gvbTY4ay9tdm1lMTZ4IHNvdXJjZSBkaXJlY3RvcnkKICMKIAotb2JqLXkJCTo9IGNvbmZpZy5vIDE2eGludHMubyBydGMubyBtdm1lMTZ4X2tzeW1zLm8KK29iai15CQk6PSBjb25maWcubyBydGMubyBtdm1lMTZ4X2tzeW1zLm8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tdm1lMTZ4L2NvbmZpZy5jIGIvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKaW5kZXggMjZjZTgxYy4uY2UyNzI3ZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL212bWUxNngvY29uZmlnLmMKQEAgLTQwLDE1ICs0MCw4IEBACiAKIHN0YXRpYyBNSzQ4VDA4cHRyX3Qgdm9sYXRpbGUgcnRjID0gKE1LNDhUMDhwdHJfdClNVk1FX1JUQ19CQVNFOwogCi1leHRlcm4gaXJxcmV0dXJuX3QgbXZtZTE2eF9wcm9jZXNzX2ludCAoaW50IGxldmVsLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gdm9pZCBtdm1lMTZ4X2luaXRfSVJRICh2b2lkKTsKLWV4dGVybiB2b2lkIG12bWUxNnhfZnJlZV9pcnEgKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgc2hvd19tdm1lMTZ4X2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgbXZtZTE2eF9lbmFibGVfaXJxICh1bnNpZ25lZCBpbnQpOwotZXh0ZXJuIHZvaWQgbXZtZTE2eF9kaXNhYmxlX2lycSAodW5zaWduZWQgaW50KTsKIHN0YXRpYyB2b2lkIG12bWUxNnhfZ2V0X21vZGVsKGNoYXIgKm1vZGVsKTsKIHN0YXRpYyBpbnQgIG12bWUxNnhfZ2V0X2hhcmR3YXJlX2xpc3QoY2hhciAqYnVmZmVyKTsKLWV4dGVybiBpbnQgIG12bWUxNnhfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7CiBleHRlcm4gdm9pZCBtdm1lMTZ4X3NjaGVkX2luaXQoaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXZtZTE2eF9nZXR0aW1lb2Zmc2V0ICh2b2lkKTsKIGV4dGVybiBpbnQgbXZtZTE2eF9od2NsayAoaW50LCBzdHJ1Y3QgcnRjX3RpbWUgKik7CkBAIC0xMjAsNiArMTEzLDE2IEBACiAgICAgcmV0dXJuIChsZW4pOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZHVyaW5nIGtlcm5lbCBzdGFydHVwIHRvIGluaXRpYWxpemUKKyAqIHRoZSBtdm1lMTZ4IElSUSBoYW5kbGluZyByb3V0aW5lcy4gIFNob3VsZCBwcm9iYWJseSBlbnN1cmUKKyAqIHRoYXQgdGhlIGJhc2UgdmVjdG9ycyBmb3IgdGhlIFZNRUNoaXAyIGFuZCBQQ0NDaGlwMiBhcmUgdmFsaWQuCisgKi8KKworc3RhdGljIHZvaWQgbXZtZTE2eF9pbml0X0lSUSAodm9pZCkKK3sKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOworfQogCiAjZGVmaW5lIHBjYzJjaGlwCSgodm9sYXRpbGUgdV9jaGFyICopMHhmZmY0MjAwMCkKICNkZWZpbmUgUGNjU0NDTUlDUgkweDFkCkBAIC0xMzgsMTIgKzE0MSw2IEBACiAgICAgbWFjaF9od2NsayAgICAgICAgICAgPSBtdm1lMTZ4X2h3Y2xrOwogICAgIG1hY2hfc2V0X2Nsb2NrX21tc3MJID0gbXZtZTE2eF9zZXRfY2xvY2tfbW1zczsKICAgICBtYWNoX3Jlc2V0CQkgPSBtdm1lMTZ4X3Jlc2V0OwotICAgIG1hY2hfZnJlZV9pcnEJID0gbXZtZTE2eF9mcmVlX2lycTsKLSAgICBtYWNoX3Byb2Nlc3NfaW50CSA9IG12bWUxNnhfcHJvY2Vzc19pbnQ7Ci0gICAgbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19tdm1lMTZ4X2ludGVycnVwdHM7Ci0gICAgbWFjaF9yZXF1ZXN0X2lycQkgPSBtdm1lMTZ4X3JlcXVlc3RfaXJxOwotICAgIGVuYWJsZV9pcnEgICAgICAgICAgID0gbXZtZTE2eF9lbmFibGVfaXJxOwotICAgIGRpc2FibGVfaXJxICAgICAgICAgID0gbXZtZTE2eF9kaXNhYmxlX2lycTsKICAgICBtYWNoX2dldF9tb2RlbCAgICAgICA9IG12bWUxNnhfZ2V0X21vZGVsOwogICAgIG1hY2hfZ2V0X2hhcmR3YXJlX2xpc3QgPSBtdm1lMTZ4X2dldF9oYXJkd2FyZV9saXN0OwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jIGIvYXJjaC9tNjhrL3E0MC9jb25maWcuYwppbmRleCA1ZTBmOWIwLi5lZmE1MmQzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcTQwL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9xNDAvY29uZmlnLmMKQEAgLTM3LDE1ICszNyw5IEBACiAjaW5jbHVkZSA8YXNtL3E0MF9tYXN0ZXIuaD4KIAogZXh0ZXJuIGlycXJldHVybl90IHE0MF9wcm9jZXNzX2ludCAoaW50IGxldmVsLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCpxNDBfZGVmYXVsdF9oYW5kbGVyW10pIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7ICAvKiBhZGRlZCBqdXN0IGZvciBkZWJ1Z2dpbmcgKi8KIGV4dGVybiB2b2lkIHE0MF9pbml0X0lSUSAodm9pZCk7Ci1leHRlcm4gdm9pZCBxNDBfZnJlZV9pcnEgKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLWV4dGVybiBpbnQgIHNob3dfcTQwX2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgcTQwX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBxNDBfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBxNDBfZ2V0X21vZGVsKGNoYXIgKm1vZGVsKTsKIHN0YXRpYyBpbnQgIHE0MF9nZXRfaGFyZHdhcmVfbGlzdChjaGFyICpidWZmZXIpOwotZXh0ZXJuIGludCAgcTQwX3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCBpcnEsIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgcTQwX3NjaGVkX2luaXQoaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBxNDBfZ2V0dGltZW9mZnNldCAodm9pZCk7CkBAIC0xNzUsMTMgKzE2OSw2IEBACiAgICAgbWFjaF9zZXRfY2xvY2tfbW1zcwkgPSBxNDBfc2V0X2Nsb2NrX21tc3M7CiAKICAgICBtYWNoX3Jlc2V0CQkgPSBxNDBfcmVzZXQ7Ci0gICAgbWFjaF9mcmVlX2lycQkgPSBxNDBfZnJlZV9pcnE7Ci0gICAgbWFjaF9wcm9jZXNzX2ludAkgPSBxNDBfcHJvY2Vzc19pbnQ7Ci0gICAgbWFjaF9nZXRfaXJxX2xpc3QJID0gc2hvd19xNDBfaW50ZXJydXB0czsKLSAgICBtYWNoX3JlcXVlc3RfaXJxCSA9IHE0MF9yZXF1ZXN0X2lycTsKLSAgICBlbmFibGVfaXJxCQkgPSBxNDBfZW5hYmxlX2lycTsKLSAgICBkaXNhYmxlX2lycSAgICAgICAgICA9IHE0MF9kaXNhYmxlX2lycTsKLSAgICBtYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZxNDBfZGVmYXVsdF9oYW5kbGVyOwogICAgIG1hY2hfZ2V0X21vZGVsICAgICAgID0gcTQwX2dldF9tb2RlbDsKICAgICBtYWNoX2dldF9oYXJkd2FyZV9saXN0ID0gcTQwX2dldF9oYXJkd2FyZV9saXN0OwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcTQwL3E0MGludHMuYyBiL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCmluZGV4IGY4ZWNjMjYuLjQ3MmY0MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCisrKyBiL2FyY2gvbTY4ay9xNDAvcTQwaW50cy5jCkBAIC0xNCwxMyArMTQsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogCi0jaW5jbHVkZSA8YXNtL3J0Yy5oPgogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgpAQCAtMzksMjkgKzM0LDM3IEBACiAgKgogKi8KIAotZXh0ZXJuIGludCBpbnRzX2luaXRlZDsKK3N0YXRpYyB2b2lkIHE0MF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdm9pZCBxNDBfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQpOworc3RhdGljIHZvaWQgcTQwX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CiAKK3Vuc2lnbmVkIHNob3J0IHE0MF9hYmxlY291bnRbMzVdOwordW5zaWduZWQgc2hvcnQgcTQwX3N0YXRlWzM1XTsKIAotaXJxcmV0dXJuX3QgcTQwX2lycTJfaGFuZGxlciAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgaW50IHE0MF9pcnFfc3RhcnR1cCh1bnNpZ25lZCBpbnQgaXJxKQoreworCS8qIHRlc3QgZm9yIElTQSBpbnRzIG5vdCBpbXBsZW1lbnRlZCBieSBIVyAqLworCXN3aXRjaCAoaXJxKSB7CisJY2FzZSAxOiBjYXNlIDI6IGNhc2UgODogY2FzZSA5OgorCWNhc2UgMTE6IGNhc2UgMTI6IGNhc2UgMTM6CisJCXByaW50aygiJXM6IElTQSBJUlEgJWQgbm90IGltcGxlbWVudGVkIGJ5IEhXXG4iLCBfX0ZVTkNUSU9OX18sIGlycSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCXJldHVybiAwOworfQogCitzdGF0aWMgdm9pZCBxNDBfaXJxX3NodXRkb3duKHVuc2lnbmVkIGludCBpcnEpCit7Cit9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBxNDBfZGVmaGFuZCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApOwotc3RhdGljIGlycXJldHVybl90IGRlZmF1bHRfaGFuZGxlcihpbnQgbGV2LCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLQotCi0jZGVmaW5lIERFVk5BTUVfU0laRSAyNAotCi1zdGF0aWMgc3RydWN0IHE0MF9pcnFfbm9kZSB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKLQl2b2lkCQkqZGV2X2lkOwotICAvKiAgICAgICAgc3RydWN0IHE0MF9pcnFfbm9kZSAqbmV4dDsqLwotICAgICAgICBjaGFyCSAgICAgICAgZGV2bmFtZVtERVZOQU1FX1NJWkVdOwotCXVuc2lnbmVkCWNvdW50OwotICAgICAgICB1bnNpZ25lZCBzaG9ydCAgc3RhdGU7Ci19IGlycV90YWJbUTQwX0lSUV9NQVgrMV07Ci0KLXNob3J0IHVuc2lnbmVkIHE0MF9hYmxlY291bnRbUTQwX0lSUV9NQVgrMV07CitzdGF0aWMgc3RydWN0IGlycV9jb250cm9sbGVyIHE0MF9pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZQkJPSAicTQwIiwKKwkubG9jawkJPSBTUElOX0xPQ0tfVU5MT0NLRUQsCisJLnN0YXJ0dXAJPSBxNDBfaXJxX3N0YXJ0dXAsCisJLnNodXRkb3duCT0gcTQwX2lycV9zaHV0ZG93biwKKwkuZW5hYmxlCQk9IHE0MF9lbmFibGVfaXJxLAorCS5kaXNhYmxlCT0gcTQwX2Rpc2FibGVfaXJxLAorfTsKIAogLyoKICAqIHZvaWQgcTQwX2luaXRfSVJRICh2b2lkKQpAQCAtNzQsMTM5ICs3NywyOSBAQAogICogdGhlIHE0MCBJUlEgaGFuZGxpbmcgcm91dGluZXMuCiAgKi8KIAotc3RhdGljIGludCBkaXNhYmxlZD0wOworc3RhdGljIGludCBkaXNhYmxlZDsKIAotdm9pZCBxNDBfaW5pdF9JUlEgKHZvaWQpCit2b2lkIHE0MF9pbml0X0lSUSh2b2lkKQogewotCWludCBpOwotCi0JZGlzYWJsZWQ9MDsKLQlmb3IgKGkgPSAwOyBpIDw9IFE0MF9JUlFfTUFYOyBpKyspIHsKLQkJaXJxX3RhYltpXS5oYW5kbGVyID0gcTQwX2RlZmhhbmQ7Ci0JCWlycV90YWJbaV0uZmxhZ3MgPSAwOwotCQlpcnFfdGFiW2ldLmRldl9pZCA9IE5VTEw7Ci0JCS8qCQlpcnFfdGFiW2ldLm5leHQgPSBOVUxMOyovCi0JCWlycV90YWJbaV0uZGV2bmFtZVswXSA9IDA7Ci0JCWlycV90YWJbaV0uY291bnQgPSAwOwotCQlpcnFfdGFiW2ldLnN0YXRlID0wOwotCQlxNDBfYWJsZWNvdW50W2ldPTA7ICAgLyogYWxsIGVuYWJsZWQgKi8KLQl9CisJbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcigmcTQwX2lycV9jb250cm9sbGVyLCAxLCBRNDBfSVJRX01BWCk7CiAKIAkvKiBzZXR1cCBoYW5kbGVyIGZvciBJU0EgaW50cyAqLwotCWNwdV9yZXF1ZXN0X2lycShJUlEyLCBxNDBfaXJxMl9oYW5kbGVyLCAwLCAicTQwIElTQSBhbmQgbWFzdGVyIGNoaXAiLAotCQkJTlVMTCk7CisJbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdChxNDBfaXJxX2hhbmRsZXIpOworCisJbTY4a19pcnFfc3RhcnR1cChJUlFfQVVUT18yKTsKKwltNjhrX2lycV9zdGFydHVwKElSUV9BVVRPXzQpOwogCiAJLyogbm93IGVuYWJsZSBzb21lIGludHMuLiAqLwotCW1hc3Rlcl9vdXRiKDEsRVhUX0VOQUJMRV9SRUcpOyAgLyogSVNBIElSUSA1LTE1ICovCisJbWFzdGVyX291dGIoMSwgRVhUX0VOQUJMRV9SRUcpOyAgLyogSVNBIElSUSA1LTE1ICovCiAKIAkvKiBtYWtlIHN1cmUga2V5Ym9hcmQgSVJRIGlzIGRpc2FibGVkICovCi0JbWFzdGVyX291dGIoMCxLRVlfSVJRX0VOQUJMRV9SRUcpOworCW1hc3Rlcl9vdXRiKDAsIEtFWV9JUlFfRU5BQkxFX1JFRyk7CiB9CiAKLWludCBxNDBfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLQkJaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkKQotewotICAvKnByaW50aygicTQwX3JlcXVlc3RfaXJxICVkLCAlc1xuIixpcnEsZGV2bmFtZSk7Ki8KLQotCWlmIChpcnEgPiBRNDBfSVJRX01BWCB8fCAoaXJxPjE1ICYmIGlycTwzMikpIHsKLQkJcHJpbnRrKCIlczogSW5jb3JyZWN0IElSUSAlZCBmcm9tICVzXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JLyogdGVzdCBmb3IgSVNBIGludHMgbm90IGltcGxlbWVudGVkIGJ5IEhXICovCi0Jc3dpdGNoIChpcnEpCi0JICB7Ci0JICBjYXNlIDE6IGNhc2UgMjogY2FzZSA4OiBjYXNlIDk6Ci0JICBjYXNlIDEyOiBjYXNlIDEzOgotCSAgICBwcmludGsoIiVzOiBJU0EgSVJRICVkIGZyb20gJXMgbm90IGltcGxlbWVudGVkIGJ5IEhXXG4iLCBfX0ZVTkNUSU9OX18sIGlycSwgZGV2bmFtZSk7Ci0JICAgIHJldHVybiAtRU5YSU87Ci0JICBjYXNlIDExOgotCSAgICBwcmludGsoIndhcm5pbmcgSVJRIDEwIGFuZCAxMSBub3QgZGlzdGluZ3Vpc2hhYmxlXG4iKTsKLQkgICAgaXJxPTEwOwotCSAgZGVmYXVsdDoKLQkgICAgOwotCSAgfQotCi0JaWYgKGlycTxRNDBfSVJRX1NBTVBMRSkKLQkgIHsKLQkgICAgaWYgKGlycV90YWJbaXJxXS5kZXZfaWQgIT0gTlVMTCkKLQkJICB7Ci0JCSAgICBwcmludGsoIiVzOiBJUlEgJWQgZnJvbSAlcyBpcyBub3QgcmVwbGFjZWFibGVcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIGlycSwgaXJxX3RhYltpcnFdLmRldm5hbWUpOwotCQkgICAgcmV0dXJuIC1FQlVTWTsKLQkJICB9Ci0JICAgIC8qcHJpbnRrKCJJUlEgJWQgc2V0IHRvIGhhbmRsZXIgJXBcbiIsaXJxLGhhbmRsZXIpOyovCi0JICAgIGlmIChkZXZfaWQ9PU5VTEwpCi0JCSAgewotCQlwcmludGsoIldBUk5JTkc6IGRldl9pZCA9PSBOVUxMIGluIHJlcXVlc3RfaXJxXG4iKTsKLQkJZGV2X2lkPSh2b2lkKikxOwotCSAgICAgIH0KLQkgICAgaXJxX3RhYltpcnFdLmhhbmRsZXIgPSBoYW5kbGVyOwotCSAgICBpcnFfdGFiW2lycV0uZmxhZ3MgICA9IGZsYWdzOwotCSAgICBpcnFfdGFiW2lycV0uZGV2X2lkICA9IGRldl9pZDsKLQkgICAgc3RybGNweShpcnFfdGFiW2lycV0uZGV2bmFtZSxkZXZuYW1lLHNpemVvZihpcnFfdGFiW2lycV0uZGV2bmFtZSkpOwotCSAgICBpcnFfdGFiW2lycV0uc3RhdGUgPSAwOwotCSAgICByZXR1cm4gMDsKLQkgIH0KLQllbHNlIHsKLQkgIC8qIFE0MF9JUlFfU0FNUExFIDpzb21ld2hhdCBzcGVjaWFsIGFjdGlvbnMgcmVxdWlyZWQgaGVyZSAuLiovCi0JICBjcHVfcmVxdWVzdF9pcnEoNCwgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0JICBjcHVfcmVxdWVzdF9pcnEoNiwgaGFuZGxlciwgZmxhZ3MsIGRldm5hbWUsIGRldl9pZCk7Ci0JICByZXR1cm4gMDsKLQl9Ci19Ci0KLXZvaWQgcTQwX2ZyZWVfaXJxKHVuc2lnbmVkIGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpZiAoaXJxID4gUTQwX0lSUV9NQVggfHwgKGlycT4xNSAmJiBpcnE8MzIpKSB7Ci0JCXByaW50aygiJXM6IEluY29ycmVjdCBJUlEgJWQsIGRldl9pZCAleCBcbiIsIF9fRlVOQ1RJT05fXywgaXJxLCAodW5zaWduZWQpZGV2X2lkKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHRlc3QgZm9yIElTQSBpbnRzIG5vdCBpbXBsZW1lbnRlZCBieSBIVyAqLwotCXN3aXRjaCAoaXJxKQotCSAgewotCSAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgODogY2FzZSA5OgotCSAgY2FzZSAxMjogY2FzZSAxMzoKLQkgICAgcHJpbnRrKCIlczogSVNBIElSUSAlZCBmcm9tICV4IGludmFsaWRcbiIsIF9fRlVOQ1RJT05fXywgaXJxLCAodW5zaWduZWQpZGV2X2lkKTsKLQkgICAgcmV0dXJuOwotCSAgY2FzZSAxMTogaXJxPTEwOwotCSAgZGVmYXVsdDoKLQkgICAgOwotCSAgfQotCi0JaWYgKGlycTxRNDBfSVJRX1NBTVBMRSkKLQkgIHsKLQkgICAgaWYgKGlycV90YWJbaXJxXS5kZXZfaWQgIT0gZGV2X2lkKQotCSAgICAgIHByaW50aygiJXM6IFJlbW92aW5nIHByb2JhYmx5IHdyb25nIElSUSAlZCBmcm9tICVzXG4iLAotCQkgICAgIF9fRlVOQ1RJT05fXywgaXJxLCBpcnFfdGFiW2lycV0uZGV2bmFtZSk7Ci0KLQkgICAgaXJxX3RhYltpcnFdLmhhbmRsZXIgPSBxNDBfZGVmaGFuZDsKLQkgICAgaXJxX3RhYltpcnFdLmZsYWdzICAgPSAwOwotCSAgICBpcnFfdGFiW2lycV0uZGV2X2lkICA9IE5VTEw7Ci0JICAgIC8qIGlycV90YWJbaXJxXS5kZXZuYW1lID0gTlVMTDsgKi8KLQkgICAgLyogZG8gbm90IHJlc2V0IHN0YXRlICEhICovCi0JICB9Ci0JZWxzZQotCSAgeyAvKiA9PSBRNDBfSVJRX1NBTVBMRSAqLwotCSAgICBjcHVfZnJlZV9pcnEoNCwgZGV2X2lkKTsKLQkgICAgY3B1X2ZyZWVfaXJxKDYsIGRldl9pZCk7Ci0JICB9Ci19Ci0KLQotaXJxcmV0dXJuX3QgcTQwX3Byb2Nlc3NfaW50IChpbnQgbGV2ZWwsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLSAgcHJpbnRrKCJ1bmV4cGVjdGVkIGludGVycnVwdCB2ZWM9JXgsIHBjPSVseCwgZDA9JWx4LCBkMF9vcmlnPSVseCwgZDE9JWx4LCBkMj0lbHhcbiIsCi0gICAgICAgICAgbGV2ZWwsIGZwLT5wYywgZnAtPmQwLCBmcC0+b3JpZ19kMCwgZnAtPmQxLCBmcC0+ZDIpOwotICBwcmludGsoIlx0SUlSUV9SRUcgPSAleCwgRUlSUV9SRUcgPSAleFxuIixtYXN0ZXJfaW5iKElJUlFfUkVHKSxtYXN0ZXJfaW5iKEVJUlFfUkVHKSk7Ci0gIHJldHVybiBJUlFfSEFORExFRDsKLX0KIAogLyoKICAqIHRoaXMgc3R1ZmYgZG9lc24ndCByZWFsbHkgYmVsb25nIGhlcmUuLgotKi8KKyAqLwogCiBpbnQgcWxfdGlja3M7ICAgICAgICAgICAgICAvKiAyMDBIeiB0aWNrcyBzaW5jZSBsYXN0IGppZmZpZSAqLwogc3RhdGljIGludCBzb3VuZF90aWNrczsKQEAgLTIxNSw1NCArMTA4LDUzIEBACiAKIHZvaWQgcTQwX21rc291bmQodW5zaWduZWQgaW50IGh6LCB1bnNpZ25lZCBpbnQgdGlja3MpCiB7Ci0gIC8qIGZvciBub3cgaWdub3JlIGh6LCBleGNlcHQgdGhhdCBoej09MCBzd2l0Y2hlcyBvZmYgc291bmQgKi8KLSAgLyogc2ltcGx5IGFsdGVybmF0ZSB0aGUgYW1wbCAoMTI4LVNWT0wpLSgxMjgrU1ZPTCktLi4tLi4gYXQgMjAwSHogKi8KLSAgaWYgKGh6PT0wKQotICAgIHsKLSAgICAgIGlmIChzb3VuZF90aWNrcykKLQlzb3VuZF90aWNrcz0xOworCS8qIGZvciBub3cgaWdub3JlIGh6LCBleGNlcHQgdGhhdCBoej09MCBzd2l0Y2hlcyBvZmYgc291bmQgKi8KKwkvKiBzaW1wbHkgYWx0ZXJuYXRlIHRoZSBhbXBsICgxMjgtU1ZPTCktKDEyOCtTVk9MKS0uLi0uLiBhdCAyMDBIeiAqLworCWlmIChoeiA9PSAwKSB7CisJCWlmIChzb3VuZF90aWNrcykKKwkJCXNvdW5kX3RpY2tzID0gMTsKIAotICAgICAgKkRBQ19MRUZUPTEyODsKLSAgICAgICpEQUNfUklHSFQ9MTI4OworCQkqREFDX0xFRlQgPSAxMjg7CisJCSpEQUNfUklHSFQgPSAxMjg7CiAKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIC8qIHNvdW5kIGl0c2VsZiBpcyBkb25lIGluIHE0MF90aW1lcl9pbnQgKi8KLSAgaWYgKHNvdW5kX3RpY2tzID09IDApIHNvdW5kX3RpY2tzPTEwMDA7IC8qIHByZXR0eSBsb25nIGJlZXAgKi8KLSAgc291bmRfdGlja3M9dGlja3M8PDE7CisJCXJldHVybjsKKwl9CisJLyogc291bmQgaXRzZWxmIGlzIGRvbmUgaW4gcTQwX3RpbWVyX2ludCAqLworCWlmIChzb3VuZF90aWNrcyA9PSAwKQorCQlzb3VuZF90aWNrcyA9IDEwMDA7IC8qIHByZXR0eSBsb25nIGJlZXAgKi8KKwlzb3VuZF90aWNrcyA9IHRpY2tzIDw8IDE7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCAoKnE0MF90aW1lcl9yb3V0aW5lKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBxNDBfdGltZXJfaW50IChpbnQgaXJxLCB2b2lkICogZGV2LCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCiB7Ci0gICAgcWxfdGlja3MgPSBxbF90aWNrcyA/IDAgOiAxOwotICAgIGlmIChzb3VuZF90aWNrcykKLSAgICAgIHsKLQl1bnNpZ25lZCBjaGFyIHN2YWw9KHNvdW5kX3RpY2tzICYgMSkgPyAxMjgtU1ZPTCA6IDEyOCtTVk9MOwotCXNvdW5kX3RpY2tzLS07Ci0JKkRBQ19MRUZUPXN2YWw7Ci0JKkRBQ19SSUdIVD1zdmFsOwotICAgICAgfQorCXFsX3RpY2tzID0gcWxfdGlja3MgPyAwIDogMTsKKwlpZiAoc291bmRfdGlja3MpIHsKKwkJdW5zaWduZWQgY2hhciBzdmFsPShzb3VuZF90aWNrcyAmIDEpID8gMTI4LVNWT0wgOiAxMjgrU1ZPTDsKKwkJc291bmRfdGlja3MtLTsKKwkJKkRBQ19MRUZUPXN2YWw7CisJCSpEQUNfUklHSFQ9c3ZhbDsKKwl9CiAKLSAgICBpZiAoIXFsX3RpY2tzKQotCXE0MF90aW1lcl9yb3V0aW5lKGlycSwgZGV2LCByZWdzKTsKLSAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CisJaWYgKCFxbF90aWNrcykKKwkJcTQwX3RpbWVyX3JvdXRpbmUoaXJxLCBkZXYsIHJlZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAogdm9pZCBxNDBfc2NoZWRfaW5pdCAoaXJxcmV0dXJuX3QgKCp0aW1lcl9yb3V0aW5lKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikpCiB7Ci0gICAgaW50IHRpbWVyX2lycTsKKwlpbnQgdGltZXJfaXJxOwogCi0gICAgcTQwX3RpbWVyX3JvdXRpbmUgPSB0aW1lcl9yb3V0aW5lOwotICAgIHRpbWVyX2lycT1RNDBfSVJRX0ZSQU1FOworCXE0MF90aW1lcl9yb3V0aW5lID0gdGltZXJfcm91dGluZTsKKwl0aW1lcl9pcnEgPSBRNDBfSVJRX0ZSQU1FOwogCi0gICAgaWYgKHJlcXVlc3RfaXJxKHRpbWVyX2lycSwgcTQwX3RpbWVyX2ludCwgMCwKKwlpZiAocmVxdWVzdF9pcnEodGltZXJfaXJxLCBxNDBfdGltZXJfaW50LCAwLAogCQkJCSJ0aW1lciIsIHE0MF90aW1lcl9pbnQpKQotCXBhbmljICgiQ291bGRuJ3QgcmVnaXN0ZXIgdGltZXIgaW50Iik7CisJCXBhbmljKCJDb3VsZG4ndCByZWdpc3RlciB0aW1lciBpbnQiKTsKIAotICAgIG1hc3Rlcl9vdXRiKC0xLEZSQU1FX0NMRUFSX1JFRyk7Ci0gICAgbWFzdGVyX291dGIoIDEsRlJBTUVfUkFURV9SRUcpOworCW1hc3Rlcl9vdXRiKC0xLCBGUkFNRV9DTEVBUl9SRUcpOworCW1hc3Rlcl9vdXRiKCAxLCBGUkFNRV9SQVRFX1JFRyk7CiB9CiAKIApAQCAtMzA4LDE2OSArMjAwLDEzMiBAQAogc3RhdGljIGludCBhbGlhc2VkX2lycT0wOyAgLyogaG93IG1hbnkgdGltZXMgaW5zaWRlIGhhbmRsZXIgPyovCiAKIAotLyogZ290IGxldmVsIDIgaW50ZXJydXB0LCBkaXNwYXRjaCB0byBJU0Egb3Iga2V5Ym9hcmQvdGltZXIgSVJRcyAqLwotaXJxcmV0dXJuX3QgcTQwX2lycTJfaGFuZGxlciAoaW50IHZlYywgdm9pZCAqZGV2bmFtZSwgc3RydWN0IHB0X3JlZ3MgKmZwKQorLyogZ290IGludGVycnVwdCwgZGlzcGF0Y2ggdG8gSVNBIG9yIGtleWJvYXJkL3RpbWVyIElSUXMgKi8KK3N0YXRpYyB2b2lkIHE0MF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0gIHVuc2lnbmVkIG1pciwgbWVyOwotICBpbnQgaXJxLGk7CisJdW5zaWduZWQgbWlyLCBtZXI7CisJaW50IGk7CiAKIC8vcmVwZWF0OgotICBtaXI9bWFzdGVyX2luYihJSVJRX1JFRyk7Ci0gIGlmIChtaXImUTQwX0lSUV9GUkFNRV9NQVNLKSB7Ci0JICBpcnFfdGFiW1E0MF9JUlFfRlJBTUVdLmNvdW50Kys7Ci0JICBpcnFfdGFiW1E0MF9JUlFfRlJBTUVdLmhhbmRsZXIoUTQwX0lSUV9GUkFNRSxpcnFfdGFiW1E0MF9JUlFfRlJBTUVdLmRldl9pZCxmcCk7Ci0JICBtYXN0ZXJfb3V0YigtMSxGUkFNRV9DTEVBUl9SRUcpOwotICB9Ci0gIGlmICgobWlyJlE0MF9JUlFfU0VSX01BU0spIHx8IChtaXImUTQwX0lSUV9FWFRfTUFTSykpIHsKLQkgIG1lcj1tYXN0ZXJfaW5iKEVJUlFfUkVHKTsKLQkgIGZvciAoaT0wOyBlaXJxc1tpXS5tYXNrOyBpKyspIHsKLQkJICBpZiAobWVyJihlaXJxc1tpXS5tYXNrKSkgewotCQkJICBpcnE9ZWlycXNbaV0uaXJxOworCW1pciA9IG1hc3Rlcl9pbmIoSUlSUV9SRUcpOworI2lmZGVmIENPTkZJR19CTEtfREVWX0ZECisJaWYgKChtaXIgJiBRNDBfSVJRX0VYVF9NQVNLKSAmJgorCSAgICAobWFzdGVyX2luYihFSVJRX1JFRykgJiBRNDBfSVJRNl9NQVNLKSkgeworCQlmbG9wcHlfaGFyZGludCgpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDQ6CisJY2FzZSA2OgorCQltNjhrX2hhbmRsZV9pbnQoUTQwX0lSUV9TQU1QTEUsIGZwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobWlyICYgUTQwX0lSUV9GUkFNRV9NQVNLKSB7CisJCW02OGtfaGFuZGxlX2ludChRNDBfSVJRX0ZSQU1FLCBmcCk7CisJCW1hc3Rlcl9vdXRiKC0xLCBGUkFNRV9DTEVBUl9SRUcpOworCX0KKwlpZiAoKG1pciAmIFE0MF9JUlFfU0VSX01BU0spIHx8IChtaXIgJiBRNDBfSVJRX0VYVF9NQVNLKSkgeworCQltZXIgPSBtYXN0ZXJfaW5iKEVJUlFfUkVHKTsKKwkJZm9yIChpID0gMDsgZWlycXNbaV0ubWFzazsgaSsrKSB7CisJCQlpZiAobWVyICYgZWlycXNbaV0ubWFzaykgeworCQkJCWlycSA9IGVpcnFzW2ldLmlycTsKIC8qCiAgKiBUaGVyZSBpcyBhIGxpdHRsZSBtZXNzIHdydCB3aGljaCBJUlEgcmVhbGx5IGNhdXNlZCB0aGlzIGlycSByZXF1ZXN0LiBUaGUKICAqIG1haW4gcHJvYmxlbSBpcyB0aGF0IElJUlFfUkVHIGFuZCBFSVJRX1JFRyByZWZsZWN0IHRoZSBzdGF0ZSB3aGVuIHRoZXkKICAqIGFyZSByZWFkIC0gd2hpY2ggaXMgbG9uZyBhZnRlciB0aGUgcmVxdWVzdCBjYW1lIGluLiBJbiB0aGVvcnkgSVJRcyBzaG91bGQKICAqIG5vdCBqdXN0IGdvIGF3YXkgYnV0IHRoZXkgb2NjYXNzaW9uYWxseSBkbwogICovCi0JCQkgIGlmIChpcnE+NCAmJiBpcnE8PTE1ICYmIG1leHRfZGlzYWJsZWQpIHsKLQkJCQkgIC8qYWxpYXNlZF9pcnErKzsqLwotCQkJCSAgZ290byBpaXJxOwotCQkJICB9Ci0JCQkgIGlmIChpcnFfdGFiW2lycV0uaGFuZGxlciA9PSBxNDBfZGVmaGFuZCApIHsKLQkJCQkgIHByaW50aygiaGFuZGxlciBmb3IgSVJRICVkIG5vdCBkZWZpbmVkXG4iLGlycSk7Ci0JCQkJICBjb250aW51ZTsgLyogaWdub3JlIHVuaW5pdGVkIElOVHMgOi0oICovCi0JCQkgIH0KLQkJCSAgaWYgKCBpcnFfdGFiW2lycV0uc3RhdGUgJiBJUlFfSU5QUk9HUkVTUyApIHsKLQkJCQkgIC8qIHNvbWUgaGFuZGxlcnMgZG8gbG9jYWxfaXJxX2VuYWJsZSgpIGZvciBpcnEgbGF0ZW5jeSByZWFzb25zLCAqLwotCQkJCSAgLyogaG93ZXZlciByZWVudGVyaW5nIGFuIGFjdGl2ZSBpcnEgaGFuZGxlciBpcyBub3QgcGVybWl0dGVkICovCisJCQkJaWYgKGlycSA+IDQgJiYgaXJxIDw9IDE1ICYmIG1leHRfZGlzYWJsZWQpIHsKKwkJCQkJLyphbGlhc2VkX2lycSsrOyovCisJCQkJCWdvdG8gaWlycTsKKwkJCQl9CisJCQkJaWYgKHE0MF9zdGF0ZVtpcnFdICYgSVJRX0lOUFJPR1JFU1MpIHsKKwkJCQkJLyogc29tZSBoYW5kbGVycyBkbyBsb2NhbF9pcnFfZW5hYmxlKCkgZm9yIGlycSBsYXRlbmN5IHJlYXNvbnMsICovCisJCQkJCS8qIGhvd2V2ZXIgcmVlbnRlcmluZyBhbiBhY3RpdmUgaXJxIGhhbmRsZXIgaXMgbm90IHBlcm1pdHRlZCAqLwogI2lmZGVmIElQX1VTRV9ESVNBQkxFCi0JCQkJICAvKiBpbiB0aGVvcnkgdGhpcyBpcyB0aGUgYmV0dGVyIHdheSB0byBkbyBpdCBiZWNhdXNlIGl0IHN0aWxsICovCi0JCQkJICAvKiBsZXRzIHRocm91Z2ggZWcgdGhlIHNlcmlhbCBpcnFzLCB1bmZvcnR1bmF0ZWx5IGl0IGNyYXNoZXMgKi8KLQkJCQkgIGRpc2FibGVfaXJxKGlycSk7Ci0JCQkJICBkaXNhYmxlZD0xOworCQkJCQkvKiBpbiB0aGVvcnkgdGhpcyBpcyB0aGUgYmV0dGVyIHdheSB0byBkbyBpdCBiZWNhdXNlIGl0IHN0aWxsICovCisJCQkJCS8qIGxldHMgdGhyb3VnaCBlZyB0aGUgc2VyaWFsIGlycXMsIHVuZm9ydHVuYXRlbHkgaXQgY3Jhc2hlcyAqLworCQkJCQlkaXNhYmxlX2lycShpcnEpOworCQkJCQlkaXNhYmxlZCA9IDE7CiAjZWxzZQotCQkJCSAgLypwcmludGsoIklSUV9JTlBST0dSRVNTIGRldGVjdGVkIGZvciBpcnEgJWQsIGRpc2FibGluZyAtICVzIGRpc2FibGVkXG4iLGlycSxkaXNhYmxlZCA/ICJhbHJlYWR5IiA6ICJub3QgeWV0Iik7ICovCi0JCQkJICBmcC0+c3IgPSAoKChmcC0+c3IpICYgKH4weDcwMCkpKzB4MjAwKTsKLQkJCQkgIGRpc2FibGVkPTE7CisJCQkJCS8qcHJpbnRrKCJJUlFfSU5QUk9HUkVTUyBkZXRlY3RlZCBmb3IgaXJxICVkLCBkaXNhYmxpbmcgLSAlcyBkaXNhYmxlZFxuIiwKKwkJCQkJCWlycSwgZGlzYWJsZWQgPyAiYWxyZWFkeSIgOiAibm90IHlldCIpOyAqLworCQkJCQlmcC0+c3IgPSAoKChmcC0+c3IpICYgKH4weDcwMCkpKzB4MjAwKTsKKwkJCQkJZGlzYWJsZWQgPSAxOwogI2VuZGlmCi0JCQkJICBnb3RvIGlpcnE7Ci0JCQkgIH0KLQkJCSAgaXJxX3RhYltpcnFdLmNvdW50Kys7Ci0JCQkgIGlycV90YWJbaXJxXS5zdGF0ZSB8PSBJUlFfSU5QUk9HUkVTUzsKLQkJCSAgaXJxX3RhYltpcnFdLmhhbmRsZXIoaXJxLGlycV90YWJbaXJxXS5kZXZfaWQsZnApOwotCQkJICBpcnFfdGFiW2lycV0uc3RhdGUgJj0gfklSUV9JTlBST0dSRVNTOworCQkJCQlnb3RvIGlpcnE7CisJCQkJfQorCQkJCXE0MF9zdGF0ZVtpcnFdIHw9IElSUV9JTlBST0dSRVNTOworCQkJCW02OGtfaGFuZGxlX2ludChpcnEsIGZwKTsKKwkJCQlxNDBfc3RhdGVbaXJxXSAmPSB+SVJRX0lOUFJPR1JFU1M7CiAKLQkJCSAgLyogbmFpdmVseSBlbmFibGUgZXZlcnl0aGluZywgaWYgdGhhdCBmYWlscyB0aGFuICAgICovCi0JCQkgIC8qIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSByZWVudGVyZWQgaW1tZWRpYXRlbHkgdGh1cyAqLwotCQkJICAvKiBnZXR0aW5nIGFub3RoZXIgY2hhbmNlIHRvIGRpc2FibGUgdGhlIElSUSAgICAgICAgKi8KKwkJCQkvKiBuYWl2ZWx5IGVuYWJsZSBldmVyeXRoaW5nLCBpZiB0aGF0IGZhaWxzIHRoYW4gICAgKi8KKwkJCQkvKiB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgcmVlbnRlcmVkIGltbWVkaWF0ZWx5IHRodXMgKi8KKwkJCQkvKiBnZXR0aW5nIGFub3RoZXIgY2hhbmNlIHRvIGRpc2FibGUgdGhlIElSUSAgICAgICAgKi8KIAotCQkJICBpZiAoIGRpc2FibGVkICkgeworCQkJCWlmIChkaXNhYmxlZCkgewogI2lmZGVmIElQX1VTRV9ESVNBQkxFCi0JCQkJICBpZiAoaXJxPjQpewotCQkJCQkgIGRpc2FibGVkPTA7Ci0JCQkJCSAgZW5hYmxlX2lycShpcnEpO30KKwkJCQkJaWYgKGlycSA+IDQpIHsKKwkJCQkJCWRpc2FibGVkID0gMDsKKwkJCQkJCWVuYWJsZV9pcnEoaXJxKTsKKwkJCQkJfQogI2Vsc2UKLQkJCQkgIGRpc2FibGVkPTA7Ci0JCQkJICAvKnByaW50aygicmVlbmFibGluZyBpcnEgJWRcbiIsaXJxKTsgKi8KKwkJCQkJZGlzYWJsZWQgPSAwOworCQkJCQkvKnByaW50aygicmVlbmFibGluZyBpcnEgJWRcbiIsIGlycSk7ICovCiAjZW5kaWYKLQkJCSAgfQorCQkJCX0KIC8vIHVzZWQgdG8gZG8gJ2dvdG8gcmVwZWF0OycgaGVyZSwgdGhpcyBkZWxheWVkIGJoIHByb2Nlc3NpbmcgdG9vIGxvbmcKLQkJCSAgcmV0dXJuIElSUV9IQU5ETEVEOwotCQkgIH0KLQkgIH0KLQkgIGlmIChtZXIgJiYgY2NsZWlycT4wICYmICFhbGlhc2VkX2lycSkKLQkJICBwcmludGsoIklTQSBpbnRlcnJ1cHQgZnJvbSB1bmtub3duIHNvdXJjZT8gRUlSUV9SRUcgPSAleFxuIixtZXIpLGNjbGVpcnEtLTsKLSAgfQotIGlpcnE6Ci0gIG1pcj1tYXN0ZXJfaW5iKElJUlFfUkVHKTsKLSAgLyogc2hvdWxkIHRlc3Qgd2hldGhlciBrZXlib2FyZCBpcnEgaXMgcmVhbGx5IGVuYWJsZWQsIGRvaW5nIGl0IGluIGRlZmhhbmQgKi8KLSAgaWYgKG1pciZRNDBfSVJRX0tFWUJfTUFTSykgewotCSAgaXJxX3RhYltRNDBfSVJRX0tFWUJPQVJEXS5jb3VudCsrOwotCSAgaXJxX3RhYltRNDBfSVJRX0tFWUJPQVJEXS5oYW5kbGVyKFE0MF9JUlFfS0VZQk9BUkQsaXJxX3RhYltRNDBfSVJRX0tFWUJPQVJEXS5kZXZfaWQsZnApOwotICB9Ci0gIHJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaW50IHNob3dfcTQwX2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gUTQwX0lSUV9NQVg7IGkrKykgewotCQlpZiAoaXJxX3RhYltpXS5jb3VudCkKLQkJICAgICAgc2VxX3ByaW50ZihwLCAiJXNJUlEgJTAyZDogJThkICAlcyVzXG4iLAotCQkJICAgICAgKGk8PTE1KSA/ICJJU0EtIiA6ICIgICAgIiAsCi0JCQkgICAgaSwgaXJxX3RhYltpXS5jb3VudCwKLQkJCSAgICBpcnFfdGFiW2ldLmRldm5hbWVbMF0gPyBpcnFfdGFiW2ldLmRldm5hbWUgOiAiPyIsCi0JCQkgICAgaXJxX3RhYltpXS5oYW5kbGVyID09IHE0MF9kZWZoYW5kID8KLQkJCQkJIiAobm93IHVuYXNzaWduZWQpIiA6ICIiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKG1lciAmJiBjY2xlaXJxID4gMCAmJiAhYWxpYXNlZF9pcnEpIHsKKwkJCXByaW50aygiSVNBIGludGVycnVwdCBmcm9tIHVua25vd24gc291cmNlPyBFSVJRX1JFRyA9ICV4XG4iLG1lcik7CisJCQljY2xlaXJxLS07CisJCX0KIAl9Ci0JcmV0dXJuIDA7CisgaWlycToKKwltaXIgPSBtYXN0ZXJfaW5iKElJUlFfUkVHKTsKKwkvKiBzaG91bGQgdGVzdCB3aGV0aGVyIGtleWJvYXJkIGlycSBpcyByZWFsbHkgZW5hYmxlZCwgZG9pbmcgaXQgaW4gZGVmaGFuZCAqLworCWlmIChtaXIgJiBRNDBfSVJRX0tFWUJfTUFTSykKKwkJbTY4a19oYW5kbGVfaW50KFE0MF9JUlFfS0VZQk9BUkQsIGZwKTsKKworCXJldHVybjsKIH0KIAotCi1zdGF0aWMgaXJxcmV0dXJuX3QgcTQwX2RlZmhhbmQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQordm9pZCBxNDBfZW5hYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotICAgICAgICBpZiAoaXJxIT1RNDBfSVJRX0tFWUJPQVJEKQotCSAgICAgcHJpbnRrICgiVW5rbm93biBxNDAgaW50ZXJydXB0ICVkXG4iLCBpcnEpOwotCWVsc2UgbWFzdGVyX291dGIoLTEsS0VZQk9BUkRfVU5MT0NLX1JFRyk7Ci0JcmV0dXJuIElSUV9OT05FOworCWlmIChpcnEgPj0gNSAmJiBpcnEgPD0gMTUpIHsKKwkJbWV4dF9kaXNhYmxlZC0tOworCQlpZiAobWV4dF9kaXNhYmxlZCA+IDApCisJCQlwcmludGsoInE0MF9lbmFibGVfaXJxIDogbmVzdGVkIGRpc2FibGUvZW5hYmxlXG4iKTsKKwkJaWYgKG1leHRfZGlzYWJsZWQgPT0gMCkKKwkJCW1hc3Rlcl9vdXRiKDEsIEVYVF9FTkFCTEVfUkVHKTsKKwl9CiB9Ci1zdGF0aWMgaXJxcmV0dXJuX3QgZGVmYXVsdF9oYW5kbGVyKGludCBsZXYsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCisKKwordm9pZCBxNDBfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQlwcmludGsgKCJVbmluaXRpYWxpc2VkIGludGVycnVwdCBsZXZlbCAlZFxuIiwgbGV2KTsKLQlyZXR1cm4gSVJRX05PTkU7CisJLyogZGlzYWJsZSBJU0EgaXFzIDogb25seSBkbyBzb21ldGhpbmcgaWYgdGhlIGRyaXZlciBoYXMgYmVlbgorCSAqIHZlcmlmaWVkIHRvIGJlIFE0MCAiY29tcGF0aWJsZSIgLSByaWdodCBub3cgSURFLCBORTJLCisJICogQW55IGRyaXZlciBzaG91bGQgbm90IGF0dGVtcHQgdG8gc2xlZXAgYWNyb3NzIGRpc2FibGVfaXJxICEhCisJICovCisKKwlpZiAoaXJxID49IDUgJiYgaXJxIDw9IDE1KSB7CisJCW1hc3Rlcl9vdXRiKDAsIEVYVF9FTkFCTEVfUkVHKTsKKwkJbWV4dF9kaXNhYmxlZCsrOworCQlpZiAobWV4dF9kaXNhYmxlZCA+IDEpCisJCQlwcmludGsoImRpc2FibGVfaXJxIG5lc3RpbmcgY291bnQgJWRcbiIsbWV4dF9kaXNhYmxlZCk7CisJfQogfQogCi1pcnFyZXR1cm5fdCAoKnE0MF9kZWZhdWx0X2hhbmRsZXJbU1lTX0lSUVNdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikgPSB7Ci0JIFswXSA9IGRlZmF1bHRfaGFuZGxlciwKLQkgWzFdID0gZGVmYXVsdF9oYW5kbGVyLAotCSBbMl0gPSBkZWZhdWx0X2hhbmRsZXIsCi0JIFszXSA9IGRlZmF1bHRfaGFuZGxlciwKLQkgWzRdID0gZGVmYXVsdF9oYW5kbGVyLAotCSBbNV0gPSBkZWZhdWx0X2hhbmRsZXIsCi0JIFs2XSA9IGRlZmF1bHRfaGFuZGxlciwKLQkgWzddID0gZGVmYXVsdF9oYW5kbGVyCi19OwotCi0KLXZvaWQgcTQwX2VuYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCit1bnNpZ25lZCBsb25nIHE0MF9wcm9iZV9pcnFfb24odm9pZCkKIHsKLSAgaWYgKCBpcnE+PTUgJiYgaXJxPD0xNSApCi0gIHsKLSAgICBtZXh0X2Rpc2FibGVkLS07Ci0gICAgaWYgKG1leHRfZGlzYWJsZWQ+MCkKLQkgIHByaW50aygicTQwX2VuYWJsZV9pcnEgOiBuZXN0ZWQgZGlzYWJsZS9lbmFibGVcbiIpOwotICAgIGlmIChtZXh0X2Rpc2FibGVkPT0wKQotICAgIG1hc3Rlcl9vdXRiKDEsRVhUX0VOQUJMRV9SRUcpOwotICAgIH0KKwlwcmludGsoImlycSBwcm9iaW5nIG5vdCB3b3JraW5nIC0gcmVjb25maWd1cmUgdGhlIGRyaXZlciB0byBhdm9pZCB0aGlzXG4iKTsKKwlyZXR1cm4gLTE7CiB9Ci0KLQotdm9pZCBxNDBfZGlzYWJsZV9pcnEgKHVuc2lnbmVkIGludCBpcnEpCitpbnQgcTQwX3Byb2JlX2lycV9vZmYodW5zaWduZWQgbG9uZyBpcnFzKQogewotICAvKiBkaXNhYmxlIElTQSBpcXMgOiBvbmx5IGRvIHNvbWV0aGluZyBpZiB0aGUgZHJpdmVyIGhhcyBiZWVuCi0gICAqIHZlcmlmaWVkIHRvIGJlIFE0MCAiY29tcGF0aWJsZSIgLSByaWdodCBub3cgSURFLCBORTJLCi0gICAqIEFueSBkcml2ZXIgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHNsZWVwIGFjcm9zcyBkaXNhYmxlX2lycSAhIQotICAgKi8KLQotICBpZiAoIGlycT49NSAmJiBpcnE8PTE1ICkgewotICAgIG1hc3Rlcl9vdXRiKDAsRVhUX0VOQUJMRV9SRUcpOwotICAgIG1leHRfZGlzYWJsZWQrKzsKLSAgICBpZiAobWV4dF9kaXNhYmxlZD4xKSBwcmludGsoImRpc2FibGVfaXJxIG5lc3RpbmcgY291bnQgJWRcbiIsbWV4dF9kaXNhYmxlZCk7Ci0gIH0KKwlyZXR1cm4gLTE7CiB9Ci0KLXVuc2lnbmVkIGxvbmcgcTQwX3Byb2JlX2lycV9vbiAodm9pZCkKLXsKLSAgcHJpbnRrKCJpcnEgcHJvYmluZyBub3Qgd29ya2luZyAtIHJlY29uZmlndXJlIHRoZSBkcml2ZXIgdG8gYXZvaWQgdGhpc1xuIik7Ci0gIHJldHVybiAtMTsKLX0KLWludCBxNDBfcHJvYmVfaXJxX29mZiAodW5zaWduZWQgbG9uZyBpcnFzKQotewotICByZXR1cm4gLTE7Ci19Ci0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogY29tcGlsZS1jb21tYW5kOiAibTY4ay1saW51eC1nY2MgLURfX0tFUk5FTF9fIC1JL2hvbWUvcnovbHgvbGludXgtMi4yLjYvaW5jbHVkZSAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciAtcGlwZSAtZm5vLXN0cmVuZ3RoLXJlZHVjZSAtZmZpeGVkLWEyIC1tNjgwNDAgICAtYyAtbyBxNDBpbnRzLm8gcTQwaW50cy5jIgotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuMy9jb25maWcuYyBiL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCmluZGV4IGYxY2EwZGYuLjU1M2MzMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zL2NvbmZpZy5jCkBAIC0zNiw3ICszNiw2IEBACiBjaGFyIHN1bjNfcmVzZXJ2ZWRfcG1lZ1tTVU4zX1BNRUdTX05VTV07CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHN1bjNfZ2V0dGltZW9mZnNldCh2b2lkKTsKLWV4dGVybiBpbnQgc2hvd19zdW4zX2ludGVycnVwdHMgKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICopOwogZXh0ZXJuIHZvaWQgc3VuM19zY2hlZF9pbml0KGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIGV4dGVybiB2b2lkIHN1bjNfZ2V0X21vZGVsIChjaGFyKiBtb2RlbCk7CiBleHRlcm4gdm9pZCBpZHByb21faW5pdCAodm9pZCk7CkBAIC0xNDcsMTMgKzE0Niw2IEBACiAKICAgICAgICAgbWFjaF9zY2hlZF9pbml0ICAgICAgPSAgc3VuM19zY2hlZF9pbml0OwogICAgICAgICBtYWNoX2luaXRfSVJRICAgICAgICA9ICBzdW4zX2luaXRfSVJROwotICAgICAgICBtYWNoX2RlZmF1bHRfaGFuZGxlciA9ICZzdW4zX2RlZmF1bHRfaGFuZGxlcjsKLSAgICAgICAgbWFjaF9yZXF1ZXN0X2lycSAgICAgPSAgc3VuM19yZXF1ZXN0X2lycTsKLSAgICAgICAgbWFjaF9mcmVlX2lycSAgICAgICAgPSAgc3VuM19mcmVlX2lycTsKLQllbmFibGVfaXJxCSAgICAgPSAgc3VuM19lbmFibGVfaXJxOwotICAgICAgICBkaXNhYmxlX2lycQkgICAgID0gIHN1bjNfZGlzYWJsZV9pcnE7Ci0JbWFjaF9wcm9jZXNzX2ludCAgICAgPSAgc3VuM19wcm9jZXNzX2ludDsKLSAgICAgICAgbWFjaF9nZXRfaXJxX2xpc3QgICAgPSAgc2hvd19zdW4zX2ludGVycnVwdHM7CiAgICAgICAgIG1hY2hfcmVzZXQgICAgICAgICAgID0gIHN1bjNfcmVib290OwogCW1hY2hfZ2V0dGltZW9mZnNldCAgID0gIHN1bjNfZ2V0dGltZW9mZnNldDsKIAltYWNoX2dldF9tb2RlbAkgICAgID0gIHN1bjNfZ2V0X21vZGVsOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYyBiL2FyY2gvbTY4ay9zdW4zL3N1bjNpbnRzLmMKaW5kZXggZTYyYTAzMy4uMDkxMjQzNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjMvc3VuM2ludHMuYworKysgYi9hcmNoL202OGsvc3VuMy9zdW4zaW50cy5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogZXh0ZXJuIHZvaWQgc3VuM19sZWRzICh1bnNpZ25lZCBjaGFyKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCBzdW4zX2ludGhhbmRsZShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CiAKIHZvaWQgc3VuM19kaXNhYmxlX2ludGVycnVwdHModm9pZCkKIHsKQEAgLTQwLDQ4ICszOSwzMCBAQAogCiB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBzdW4zX2ludHJlZzsKIAotdm9pZCBzdW4zX2luc2VydF9pcnEoaXJxX25vZGVfdCAqKmxpc3QsIGlycV9ub2RlX3QgKm5vZGUpCi17Ci19Ci0KLXZvaWQgc3VuM19kZWxldGVfaXJxKGlycV9ub2RlX3QgKipsaXN0LCB2b2lkICpkZXZfaWQpCi17Ci19Ci0KIHZvaWQgc3VuM19lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JKnN1bjNfaW50cmVnIHw9ICAoMTw8aXJxKTsKKwkqc3VuM19pbnRyZWcgfD0gICgxIDw8IGlycSk7CiB9CiAKIHZvaWQgc3VuM19kaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCSpzdW4zX2ludHJlZyAmPSB+KDE8PGlycSk7Ci19Ci0KLWlubGluZSB2b2lkIHN1bjNfZG9faXJxKGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCkKLXsKLQlrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0rKzsKLQkqc3VuM19pbnRyZWcgJj0gfigxPDxpcnEpOwotCSpzdW4zX2ludHJlZyB8PSAgKDE8PGlycSk7CisJKnN1bjNfaW50cmVnICY9IH4oMSA8PCBpcnEpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3VuM19pbnQ3KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQogewotCXN1bjNfZG9faXJxKGlycSxmcCk7Ci0JaWYoIShrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0gJSAyMDAwKSkKLQkJc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUytpcnFdJTE2MDAwKQotCQkJICAvMjAwMF0pOworCSpzdW4zX2ludHJlZyB8PSAgKDEgPDwgaXJxKTsKKwlpZiAoIShrc3RhdF9jcHUoMCkuaXJxc1tpcnFdICUgMjAwMCkpCisJCXN1bjNfbGVkcyhsZWRfcGF0dGVyblsoa3N0YXRfY3B1KDApLmlycXNbaXJxXSAlIDE2MDAwKSAvIDIwMDBdKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzdW4zX2ludDUoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZnApCiB7Ci0gICAgICAgIGtzdGF0X2NwdSgwKS5pcnFzW1NZU19JUlFTICsgaXJxXSsrOwogI2lmZGVmIENPTkZJR19TVU4zCiAJaW50ZXJzaWxfY2xlYXIoKTsKICNlbmRpZgotICAgICAgICAqc3VuM19pbnRyZWcgJj0gfigxPDxpcnEpOwotICAgICAgICAqc3VuM19pbnRyZWcgfD0gICgxPDxpcnEpOworICAgICAgICAqc3VuM19pbnRyZWcgfD0gICgxIDw8IGlycSk7CiAjaWZkZWYgQ09ORklHX1NVTjMKIAlpbnRlcnNpbF9jbGVhcigpOwogI2VuZGlmCkBAIC04OSw2NSArNzAsOCBAQAogI2lmbmRlZiBDT05GSUdfU01QCiAJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGZwKSk7CiAjZW5kaWYKLSAgICAgICAgaWYoIShrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0gJSAyMCkpCi0gICAgICAgICAgICAgICAgc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUytpcnFdJTE2MCkKLSAgICAgICAgICAgICAgICAvMjBdKTsKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIGhhbmRsZSByZXF1ZXN0ZWQgaW50cywgZXhjZXB0aW5nIDUgYW5kIDcsIHdoaWNoIGFsd2F5cyBkbyB0aGUgc2FtZQotICAgdGhpbmcgKi8KLWlycXJldHVybl90ICgqc3VuM19kZWZhdWx0X2hhbmRsZXJbU1lTX0lSUVNdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKikgPSB7Ci0JWzBdID0gc3VuM19pbnRoYW5kbGUsCi0JWzFdID0gc3VuM19pbnRoYW5kbGUsCi0JWzJdID0gc3VuM19pbnRoYW5kbGUsCi0JWzNdID0gc3VuM19pbnRoYW5kbGUsCi0JWzRdID0gc3VuM19pbnRoYW5kbGUsCi0JWzVdID0gc3VuM19pbnQ1LAotCVs2XSA9IHN1bjNfaW50aGFuZGxlLAotCVs3XSA9IHN1bjNfaW50NwotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmRldl9uYW1lc1tTWVNfSVJRU10gPSB7Ci0JWzVdID0gInRpbWVyIiwKLQlbN10gPSAiaW50NyBoYW5kbGVyIgotfTsKLXN0YXRpYyB2b2lkICpkZXZfaWRzW1NZU19JUlFTXTsKLXN0YXRpYyBpcnFyZXR1cm5fdCAoKnN1bjNfaW50aGFuZGxlcltTWVNfSVJRU10pKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IHsKLQlbNV0gPSBzdW4zX2ludDUsCi0JWzddID0gc3VuM19pbnQ3Ci19Owotc3RhdGljIGlycXJldHVybl90ICgqc3VuM192ZWNoYW5kbGVyW1NVTjNfSU5UX1ZFQ1NdKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci1zdGF0aWMgdm9pZCAqdmVjX2lkc1tTVU4zX0lOVF9WRUNTXTsKLXN0YXRpYyBjb25zdCBjaGFyICp2ZWNfbmFtZXNbU1VOM19JTlRfVkVDU107Ci1zdGF0aWMgaW50IHZlY19pbnRzW1NVTjNfSU5UX1ZFQ1NdOwotCi0KLWludCBzaG93X3N1bjNfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCi17Ci0JaW50IGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCAoU1VOM19JTlRfVkVDUy0xKTsgaSsrKSB7Ci0JCWlmKHN1bjNfdmVjaGFuZGxlcltpXSAhPSBOVUxMKSB7Ci0JCQlzZXFfcHJpbnRmKHAsICJ2ZWMgJTNkOiAlMTB1ICVzXG4iLCBpKzY0LAotCQkJCSAgIHZlY19pbnRzW2ldLAotCQkJCSAgICh2ZWNfbmFtZXNbaV0pID8gdmVjX25hbWVzW2ldIDoKLQkJCQkgICAic3VuM192ZWNoYW5kbGVyIik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHN1bjNfaW50aGFuZGxlKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQotewotCWlmKHN1bjNfaW50aGFuZGxlcltpcnFdID09IE5VTEwpCi0JCXBhbmljICgiYmFkIGludGVycnVwdCAlZCByZWNlaXZlZCAoaWQgJXApXG4iLGlycSwgZGV2X2lkKTsKLQotICAgICAgICBrc3RhdF9jcHUoMCkuaXJxc1tTWVNfSVJRUyArIGlycV0rKzsKLSAgICAgICAgKnN1bjNfaW50cmVnICY9IH4oMTw8aXJxKTsKLQotCXN1bjNfaW50aGFuZGxlcltpcnFdKGlycSwgZGV2X2lkc1tpcnFdLCBmcCk7CisgICAgICAgIGlmICghKGtzdGF0X2NwdSgwKS5pcnFzW2lycV0gJSAyMCkpCisgICAgICAgICAgICAgICAgc3VuM19sZWRzKGxlZF9wYXR0ZXJuWyhrc3RhdF9jcHUoMCkuaXJxc1tpcnFdICUgMTYwKSAvIDIwXSk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xNTcsMTA5ICs4MSwzMSBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIHZvaWQgc3VuM19pbnRoYW5kbGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworICAgICAgICAqc3VuM19pbnRyZWcgJj0gfigxIDw8IGlycSk7CisKKwltNjhrX2hhbmRsZV9pbnQoaXJxLCBmcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgc3VuM19pcnFfY29udHJvbGxlciA9IHsKKwkubmFtZQkJPSAic3VuMyIsCisJLmxvY2sJCT0gU1BJTl9MT0NLX1VOTE9DS0VELAorCS5zdGFydHVwCT0gbTY4a19pcnFfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBtNjhrX2lycV9zaHV0ZG93biwKKwkuZW5hYmxlCQk9IHN1bjNfZW5hYmxlX2lycSwKKwkuZGlzYWJsZQk9IHN1bjNfZGlzYWJsZV9pcnEsCit9OworCiB2b2lkIHN1bjNfaW5pdF9JUlEodm9pZCkKIHsKLQlpbnQgaTsKLQogCSpzdW4zX2ludHJlZyA9IDE7CiAKLQlmb3IoaSA9IDA7IGkgPCBTWVNfSVJRUzsgaSsrKQotCXsKLQkJaWYoZGV2X25hbWVzW2ldKQotCQkJY3B1X3JlcXVlc3RfaXJxKGksIHN1bjNfZGVmYXVsdF9oYW5kbGVyW2ldLCAwLAotCQkJCQlkZXZfbmFtZXNbaV0sIE5VTEwpOwotCX0KKwltNjhrX3NldHVwX2F1dG9faW50ZXJydXB0KHN1bjNfaW50aGFuZGxlKTsKKwltNjhrX3NldHVwX2lycV9jb250cm9sbGVyKCZzdW4zX2lycV9jb250cm9sbGVyLCBJUlFfQVVUT18xLCA3KTsKKwltNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KFZFQ19VU0VSLCAxOTIsIE5VTEwpOwogCi0JZm9yKGkgPSAwOyBpIDwgMTkyOyBpKyspCi0JCXN1bjNfdmVjaGFuZGxlcltpXSA9IE5VTEw7Ci0KLQlzdW4zX3ZlY2hhbmRsZXJbMTkxXSA9IHN1bjNfdmVjMjU1OwotfQotCi1pbnQgc3VuM19yZXF1ZXN0X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBpcnFyZXR1cm5fdCAoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkZXZfaWQpCi17Ci0KLQlpZihpcnEgPCBTWVNfSVJRUykgewotCQlpZihzdW4zX2ludGhhbmRsZXJbaXJxXSAhPSBOVUxMKSB7Ci0JCQlwcmludGsoInN1bjNfcmVxdWVzdF9pcnE6IHJlcXVlc3QgZm9yIGlycSAlZCAtLSBhbHJlYWR5IHRha2VuIVxuIiwgaXJxKTsKLQkJCXJldHVybiAxOwotCQl9Ci0KLQkJc3VuM19pbnRoYW5kbGVyW2lycV0gPSBoYW5kbGVyOwotCQlkZXZfaWRzW2lycV0gPSBkZXZfaWQ7Ci0JCWRldl9uYW1lc1tpcnFdID0gZGV2bmFtZTsKLQotCQkvKiBzZXR0aW5nIGRldm5hbWUgd291bGQgYmUgbmljZSAqLwotCQljcHVfcmVxdWVzdF9pcnEoaXJxLCBzdW4zX2RlZmF1bHRfaGFuZGxlcltpcnFdLCAwLCBkZXZuYW1lLAotCQkJCU5VTEwpOwotCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCWlmKChpcnEgPj0gNjQpICYmIChpcnEgPD0gMjU1KSkgewotCQkgICAgICAgIGludCB2ZWM7Ci0KLQkJCXZlYyA9IGlycSAtIDY0OwotCQkJaWYoc3VuM192ZWNoYW5kbGVyW3ZlY10gIT0gTlVMTCkgewotCQkJCXByaW50aygic3VuM19yZXF1ZXN0X2lycTogcmVxdWVzdCBmb3IgdmVjICVkIC0tIGFscmVhZHkgdGFrZW4hXG4iLCBpcnEpOwotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlzdW4zX3ZlY2hhbmRsZXJbdmVjXSA9IGhhbmRsZXI7Ci0JCQl2ZWNfaWRzW3ZlY10gPSBkZXZfaWQ7Ci0JCQl2ZWNfbmFtZXNbdmVjXSA9IGRldm5hbWU7Ci0JCQl2ZWNfaW50c1t2ZWNdID0gMDsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlwcmludGsoInN1bjNfcmVxdWVzdF9pcnE6IGludmFsaWQgaXJxICVkXG4iLCBpcnEpOwotCXJldHVybiAxOwotCi19Ci0KLXZvaWQgc3VuM19mcmVlX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0KLQlpZihpcnEgPCBTWVNfSVJRUykgewotCQlpZihzdW4zX2ludGhhbmRsZXJbaXJxXSA9PSBOVUxMKQotCQkJcGFuaWMoInN1bjNfZnJlZV9pbnQ6IGF0dGVtcHQgdG8gZnJlZSB1bnVzZWQgaXJxICVkXG4iLCBpcnEpOwotCQlpZihkZXZfaWRzW2lycV0gIT0gZGV2X2lkKQotCQkJcGFuaWMoInN1bjNfZnJlZV9pbnQ6IGluY29ycmVjdCBkZXZfaWQgZm9yIGlycSAlZFxuIiwgaXJxKTsKLQotCQlzdW4zX2ludGhhbmRsZXJbaXJxXSA9IE5VTEw7Ci0JCXJldHVybjsKLQl9IGVsc2UgaWYoKGlycSA+PSA2NCkgJiYgKGlycSA8PSAyNTUpKSB7Ci0JCWludCB2ZWM7Ci0KLQkJdmVjID0gaXJxIC0gNjQ7Ci0JCWlmKHN1bjNfdmVjaGFuZGxlclt2ZWNdID09IE5VTEwpCi0JCQlwYW5pYygic3VuM19mcmVlX2ludDogYXR0ZW1wdCB0byBmcmVlIHVudXNlZCB2ZWN0b3IgJWRcbiIsIGlycSk7Ci0JCWlmKHZlY19pZHNbaXJxXSAhPSBkZXZfaWQpCi0JCQlwYW5pYygic3VuM19mcmVlX2ludDogaW5jb3JyZWN0IGRldl9pZCBmb3IgdmVjICVkXG4iLCBpcnEpOwotCi0JCXN1bjNfdmVjaGFuZGxlclt2ZWNdID0gTlVMTDsKLQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCXBhbmljKCJzdW4zX2ZyZWVfaXJxOiBpbnZhbGlkIGlycSAlZFxuIiwgaXJxKTsKLQl9Ci19Ci0KLWlycXJldHVybl90IHN1bjNfcHJvY2Vzc19pbnQoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0KLQlpZigoaXJxID49IDY0KSAmJiAoaXJxIDw9IDI1NSkpIHsKLQkJaW50IHZlYzsKLQotCQl2ZWMgPSBpcnEgLSA2NDsKLQkJaWYoc3VuM192ZWNoYW5kbGVyW3ZlY10gPT0gTlVMTCkKLQkJCXBhbmljICgiYmFkIGludGVycnVwdCB2ZWN0b3IgJWQgcmVjZWl2ZWRcbiIsaXJxKTsKLQotCQl2ZWNfaW50c1t2ZWNdKys7Ci0JCXJldHVybiBzdW4zX3ZlY2hhbmRsZXJbdmVjXShpcnEsIHZlY19pZHNbdmVjXSwgcmVncyk7Ci0JfSBlbHNlIHsKLQkJcGFuaWMoInN1bjNfcHJvY2Vzc19pbnQ6IHVuYWJsZSB0byBoYW5kbGUgaW50ZXJydXB0IHZlY3RvciAlZFxuIiwKLQkJICAgICAgaXJxKTsKLQl9CisJcmVxdWVzdF9pcnEoSVJRX0FVVE9fNSwgc3VuM19pbnQ1LCAwLCAiaW50NSIsIE5VTEwpOworCXJlcXVlc3RfaXJxKElSUV9BVVRPXzcsIHN1bjNfaW50NywgMCwgImludDciLCBOVUxMKTsKKwlyZXF1ZXN0X2lycShJUlFfVVNFUisxMjcsIHN1bjNfdmVjMjU1LCAwLCAidmVjMjU1IiwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMgYi9hcmNoL202OGsvc3VuM3gvY29uZmlnLmMKaW5kZXggMDkyMGY1ZC4uNTJmYjE3NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3N1bjN4L2NvbmZpZy5jCisrKyBiL2FyY2gvbTY4ay9zdW4zeC9jb25maWcuYwpAQCAtNTIsMTcgKzUyLDEwIEBACiAKIAlzdW4zeF9wcm9tX2luaXQoKTsKIAotCW1hY2hfZ2V0X2lycV9saXN0CSA9IHNob3dfc3VuM19pbnRlcnJ1cHRzOwogCW1hY2hfbWF4X2RtYV9hZGRyZXNzID0gMHhmZmZmZmZmZjsgLyogd2UgY2FuIERNQSBhbnl3aGVyZSwgd2hlZSAqLwogCi0JbWFjaF9kZWZhdWx0X2hhbmRsZXIgPSAmc3VuM19kZWZhdWx0X2hhbmRsZXI7CiAJbWFjaF9zY2hlZF9pbml0ICAgICAgPSBzdW4zeF9zY2hlZF9pbml0OwogCW1hY2hfaW5pdF9JUlEgICAgICAgID0gc3VuM19pbml0X0lSUTsKLQllbmFibGVfaXJxICAgICAgICAgICA9IHN1bjNfZW5hYmxlX2lycTsKLQlkaXNhYmxlX2lycSAgICAgICAgICA9IHN1bjNfZGlzYWJsZV9pcnE7Ci0JbWFjaF9yZXF1ZXN0X2lycSAgICAgPSBzdW4zX3JlcXVlc3RfaXJxOwotCW1hY2hfZnJlZV9pcnEgICAgICAgID0gc3VuM19mcmVlX2lycTsKLQltYWNoX3Byb2Nlc3NfaW50ICAgICA9IHN1bjNfcHJvY2Vzc19pbnQ7CiAKIAltYWNoX2dldHRpbWVvZmZzZXQgICA9IHN1bjN4X2dldHRpbWVvZmZzZXQ7CiAJbWFjaF9yZXNldCAgICAgICAgICAgPSBzdW4zeF9yZWJvb3Q7CmRpZmYgLS1naXQgYS9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL202OGtub21tdS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZTFiM2FhMy4uOGUyYzVhOCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrbm9tbXUva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4a25vbW11L2tlcm5lbC9zaWduYWwuYwpAQCAtNTUzLDcgKzU1Myw3IEBACiAKIAkvKiBUaGlzIGlzIHRoZSBYL09wZW4gc2FuY3Rpb25lZCBzaWduYWwgc3RhY2sgc3dpdGNoaW5nLiAgKi8KIAlpZiAoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgewotCQlpZiAoIW9uX3NpZ19zdGFjayh1c3ApKQorCQlpZiAoIXNhc19zc19mbGFncyh1c3ApKQogCQkJdXNwID0gY3VycmVudC0+c2FzX3NzX3NwICsgY3VycmVudC0+c2FzX3NzX3NpemU7CiAJfQogCXJldHVybiAodm9pZCAqKSgodXNwIC0gZnJhbWVfc2l6ZSkgJiAtOFVMKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvaXJpeHNpZy5jIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKaW5kZXggYTliZjZjYy4uNjc2ZTg2OCAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9pcml4c2lnLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC01NDAsOCArNTQxLDYgQEAKICNkZWZpbmUgSVJJWF9QX1BHSUQgICAyCiAjZGVmaW5lIElSSVhfUF9BTEwgICAgNwogCi1leHRlcm4gaW50IGdldHJ1c2FnZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50LCBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqKTsKLQogI2RlZmluZSBXX0VYSVRFRCAgICAgMQogI2RlZmluZSBXX1RSQVBQRUQgICAgMgogI2RlZmluZSBXX1NUT1BQRUQgICAgNApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TIGIvYXJjaC9taXBzL2tlcm5lbC9zY2FsbDMyLW8zMi5TCmluZGV4IGEwYWMwZTUuLjJkMmZkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2NhbGwzMi1vMzIuUworKysgYi9hcmNoL21pcHMva2VybmVsL3NjYWxsMzItbzMyLlMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCXN5cwlzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiAxCiAJc3lzCXN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwgMgkvKiA0MTY1ICovCiAJc3lzCXN5c19uYW5vc2xlZXAsCQkyCi0Jc3lzCXN5c19tcmVtYXAsCQk0CisJc3lzCXN5c19tcmVtYXAsCQk1CiAJc3lzCXN5c19hY2NlcHQJCTMKIAlzeXMJc3lzX2JpbmQJCTMKIAlzeXMJc3lzX2Nvbm5lY3QJCTMJLyogNDE3MCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zeXNpcml4LmMgYi9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYwppbmRleCA1NDA3Yjc4Li4xMTM3ZGQ2IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYworKysgYi9hcmNoL21pcHMva2VybmVsL3N5c2lyaXguYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0yMzUsNyArMjM2LDYgQEAKICN1bmRlZiBERUJVR19QUk9DR1JQUwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBpcml4X21hcGVsZihpbnQgZmQsIHN0cnVjdCBlbGZfcGhkciBfX3VzZXIgKnVzZXJfcGhkcnAsIGludCBjbnQpOwotZXh0ZXJuIGludCBnZXRydXNhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgd2hvLCBzdHJ1Y3QgcnVzYWdlIF9fdXNlciAqcnUpOwogZXh0ZXJuIGNoYXIgKnByb21fZ2V0ZW52KGNoYXIgKm5hbWUpOwogZXh0ZXJuIGxvbmcgcHJvbV9zZXRlbnYoY2hhciAqbmFtZSwgY2hhciAqdmFsdWUpOwogCkBAIC02OTQsNyArNjk0LDcgQEAKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSB2ZnNfc3RhdGZzKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJmtidWYpOworCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnksICZrYnVmKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gZHB1dF9hbmRfb3V0OwogCkBAIC03MzIsNyArNzMyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAma2J1Zik7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LCAma2J1Zik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mOwogCkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZm5hbWUsICZuZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnMobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAma2J1Zik7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKG5kLmRlbnRyeSwgJmtidWYpOwogCWlmIChlcnJvcikKIAkJZ290byBkcHV0X2FuZF9vdXQ7CiAKQEAgLTE0MDYsNyArMTQwNiw3IEBACiAJCWVycm9yID0gLUVCQURGOwogCQlnb3RvIG91dDsKIAl9Ci0JZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAma2J1Zik7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LCAma2J1Zik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mOwogCkBAIC0xNjExLDcgKzE2MTEsNyBAQAogCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZm5hbWUsICZuZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnMobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAma2J1Zik7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKG5kLmRlbnRyeSwgJmtidWYpOwogCWlmIChlcnJvcikKIAkJZ290byBkcHV0X2FuZF9vdXQ7CiAKQEAgLTE2NTgsNyArMTY1OCw3IEBACiAJCWVycm9yID0gLUVCQURGOwogCQlnb3RvIG91dDsKIAl9Ci0JZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAma2J1Zik7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LCAma2J1Zik7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dF9mOwogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9ocHV4L3N5c19ocHV4LmMgYi9hcmNoL3BhcmlzYy9ocHV4L3N5c19ocHV4LmMKaW5kZXggMDUyNzNjYy4uY2I2OTcyNyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaHB1eC9zeXNfaHB1eC5jCisrKyBiL2FyY2gvcGFyaXNjL2hwdXgvc3lzX2hwdXguYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJcyA9IHVzZXJfZ2V0X3N1cGVyKGRldik7CiAJaWYgKHMgPT0gTlVMTCkKIAkJZ290byBvdXQ7Ci0JZXJyID0gdmZzX3N0YXRmcyhzLCAmc2J1Zik7CisJZXJyID0gdmZzX3N0YXRmcyhzLT5zX3Jvb3QsICZzYnVmKTsKIAlkcm9wX3N1cGVyKHMpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwpAQCAtMTg2LDEyICsxODYsMTIgQEAKICAgICAgaW50MTZfdCBmX3BhZDsKIH07CiAKLXN0YXRpYyBpbnQgdmZzX3N0YXRmc19ocHV4KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBocHV4X3N0YXRmcyAqYnVmKQorc3RhdGljIGludCB2ZnNfc3RhdGZzX2hwdXgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaHB1eF9zdGF0ZnMgKmJ1ZikKIHsKIAlzdHJ1Y3Qga3N0YXRmcyBzdDsKIAlpbnQgcmV0dmFsOwogCQotCXJldHZhbCA9IHZmc19zdGF0ZnMoc2IsICZzdCk7CisJcmV0dmFsID0gdmZzX3N0YXRmcyhkZW50cnksICZzdCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOwogCWlmICghZXJyb3IpIHsKIAkJc3RydWN0IGhwdXhfc3RhdGZzIHRtcDsKLQkJZXJyb3IgPSB2ZnNfc3RhdGZzX2hwdXgobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwkJZXJyb3IgPSB2ZnNfc3RhdGZzX2hwdXgobmQuZGVudHJ5LCAmdG1wKTsKIAkJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCiAJCQllcnJvciA9IC1FRkFVTFQ7CiAJCXBhdGhfcmVsZWFzZSgmbmQpOwpAQCAtMjM3LDcgKzIzNyw3IEBACiAJZmlsZSA9IGZnZXQoZmQpOwogCWlmICghZmlsZSkKIAkJZ290byBvdXQ7Ci0JZXJyb3IgPSB2ZnNfc3RhdGZzX2hwdXgoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCWVycm9yID0gdmZzX3N0YXRmc19ocHV4KGZpbGUtPmZfZGVudHJ5LCAmdG1wKTsKIAlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJZXJyb3IgPSAtRUZBVUxUOwogCWZwdXQoZmlsZSk7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDU3NjdlOC4uY2MzOGVkZiAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zaWduYWwuYwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAJREJHKDEsImdldF9zaWdmcmFtZToga2EgPSAlI2x4LCBzcCA9ICUjbHgsIGZyYW1lX3NpemUgPSAlI2x4XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpa2EsIHNwLCBmcmFtZV9zaXplKTsKIAkKLQlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICE9IDAgJiYgISBvbl9zaWdfc3RhY2soc3ApKQorCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgIT0gMCAmJiAhIHNhc19zc19mbGFncyhzcCkpCiAJCXNwID0gY3VycmVudC0+c2FzX3NzX3NwOyAvKiBTdGFja3MgZ3JvdyB1cCEgKi8KIAogCURCRygxLCJnZXRfc2lnZnJhbWU6IFJldHVybmluZyBzcCA9ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKXNwKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKaW5kZXggNjcyOWM5OC4uZTkyMmE4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19GSU5EX05FWFRfQklUCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgUFBDCiAJYm9vbAogCWRlZmF1bHQgeQpAQCAtMTM3LDYgKzE0MSwxNSBAQAogCXNlbGVjdCBGU0xfU09DCiAJc2VsZWN0IDg1eHgKIAorY29uZmlnIFBQQ184Nnh4CisJYm9vbCAiRnJlZXNjYWxlIDg2eHgiCisJc2VsZWN0IDZ4eAorCXNlbGVjdCBGU0xfU09DCisJc2VsZWN0IFBQQ19GUFUKKwlzZWxlY3QgQUxUSVZFQworCWhlbHAKKwkgIFRoZSBGcmVlc2NhbGUgRTYwMCBTb0NzIGhhdmUgNzR4eCBjb3Jlcy4KKwogY29uZmlnIDQweAogCWJvb2wgIkFNQ0MgNDB4IgogCkBAIC0zMzYsNyArMzQ5LDcgQEAKIAogY29uZmlnIFBQQ19QU0VSSUVTCiAJZGVwZW5kcyBvbiBQUENfTVVMVElQTEFURk9STSAmJiBQUEM2NAotCWJvb2wgIiAgSUJNIHBTZXJpZXMgJiBuZXcgKFBPV0VSNS1iYXNlZCkgaVNlcmllcyIKKwlib29sICJJQk0gcFNlcmllcyAmIG5ldyAoUE9XRVI1LWJhc2VkKSBpU2VyaWVzIgogCXNlbGVjdCBQUENfSTgyNTkKIAlzZWxlY3QgUFBDX1JUQVMKIAlzZWxlY3QgUlRBU19FUlJPUl9MT0dHSU5HCkBAIC0zNDQsNyArMzU3LDcgQEAKIAlkZWZhdWx0IHkKIAogY29uZmlnIFBQQ19DSFJQCi0JYm9vbCAiICBDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtIChDSFJQKSBiYXNlZCBtYWNoaW5lcyIKKwlib29sICJDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtIChDSFJQKSBiYXNlZCBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyCiAJc2VsZWN0IFBQQ19JODI1OQogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCkBAIC0zNTQsNyArMzY3LDcgQEAKIAlkZWZhdWx0IHkKIAogY29uZmlnIFBQQ19QTUFDCi0JYm9vbCAiICBBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKKwlib29sICJBcHBsZSBQb3dlck1hYyBiYXNlZCBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kgaWYgUFBDMzIKIAlzZWxlY3QgUFBDX01QQzEwNiBpZiBQUEMzMgpAQCAtMzcwLDcgKzM4Myw3IEBACiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBQUENfUFJFUAotCWJvb2wgIiAgUG93ZXJQQyBSZWZlcmVuY2UgUGxhdGZvcm0gKFBSZVApIGJhc2VkIG1hY2hpbmVzIgorCWJvb2wgIlBvd2VyUEMgUmVmZXJlbmNlIFBsYXRmb3JtIChQUmVQKSBiYXNlZCBtYWNoaW5lcyIKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzMyICYmIEJST0tFTgogCXNlbGVjdCBQUENfSTgyNTkKIAlzZWxlY3QgUFBDX0lORElSRUNUX1BDSQpAQCAtMzc5LDcgKzM5Miw3IEBACiAKIGNvbmZpZyBQUENfTUFQTEUKIAlkZXBlbmRzIG9uIFBQQ19NVUxUSVBMQVRGT1JNICYmIFBQQzY0Ci0JYm9vbCAiICBNYXBsZSA5NzBGWCBFdmFsdWF0aW9uIEJvYXJkIgorCWJvb2wgIk1hcGxlIDk3MEZYIEV2YWx1YXRpb24gQm9hcmQiCiAJc2VsZWN0IFUzX0RBUlQKIAlzZWxlY3QgTVBJQ19CUk9LRU5fVTMKIAlzZWxlY3QgR0VORVJJQ19UQlNZTkMKQEAgLTM5MSw4ICs0MDQsMTggQEAKIAkgIEZvciBtb3JlIGluZm9ybWF0aW9ucywgcmVmZXIgdG8gPGh0dHA6Ly93d3cuOTcwZXZhbC5jb20+CiAKIGNvbmZpZyBQUENfQ0VMTAotCWJvb2wgIiAgQ2VsbCBCcm9hZGJhbmQgUHJvY2Vzc29yIEFyY2hpdGVjdHVyZSIKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfQ0VMTF9OQVRJVkUKKwlib29sCisJc2VsZWN0IFBQQ19DRUxMCisJZGVmYXVsdCBuCisKK2NvbmZpZyBQUENfSUJNX0NFTExfQkxBREUKKwlib29sICIgIElCTSBDZWxsIEJsYWRlIgogCWRlcGVuZHMgb24gUFBDX01VTFRJUExBVEZPUk0gJiYgUFBDNjQKKwlzZWxlY3QgUFBDX0NFTExfTkFUSVZFCiAJc2VsZWN0IFBQQ19SVEFTCiAJc2VsZWN0IE1NSU9fTlZSQU0KIAlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKQEAgLTQzOSwxMSArNDYyLDYgQEAKIAlkZXBlbmRzIG9uIFBQQ19NQVBMRQogCWRlZmF1bHQgeQogCi1jb25maWcgQ0VMTF9JSUMKLQlkZXBlbmRzIG9uIFBQQ19DRUxMCi0JYm9vbAotCWRlZmF1bHQgeQotCiBjb25maWcgSUJNVklPCiAJZGVwZW5kcyBvbiBQUENfUFNFUklFUyB8fCBQUENfSVNFUklFUwogCWJvb2wKQEAgLTU0NSw2ICs1NjMsNyBAQAogc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvS2NvbmZpZwogc291cmNlIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCitzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKIHNvdXJjZSBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzh4eC9LY29uZmlnCiBzb3VyY2UgYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL0tjb25maWcKIApAQCAtNjk5LDcgKzcxOCw2IEBACiBjb25maWcgU0NIRURfU01UCiAJYm9vbCAiU01UIChIeXBlcnRocmVhZGluZykgc2NoZWR1bGVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQUEM2NCAmJiBTTVAKLQlkZWZhdWx0IG9mZgogCWhlbHAKIAkgIFNNVCBzY2hlZHVsZXIgc3VwcG9ydCBpbXByb3ZlcyB0aGUgQ1BVIHNjaGVkdWxlcidzIGRlY2lzaW9uIG1ha2luZwogCSAgd2hlbiBkZWFsaW5nIHdpdGggUE9XRVI1IGNwdXMgYXQgYSBjb3N0IG9mIHNsaWdodGx5IGluY3JlYXNlZApAQCAtNzc2LDYgKzc5NCw3IEBACiAKIGNvbmZpZyBQUENfSTgyNTkKIAlib29sCisJZGVmYXVsdCB5IGlmIE1QQzg2NDFfSFBDTgogCWRlZmF1bHQgbgogCiBjb25maWcgUFBDX0lORElSRUNUX1BDSQpAQCAtNzk4LDggKzgxNyw4IEBACiAJYm9vbAogCiBjb25maWcgUENJCi0JYm9vbCAiUENJIHN1cHBvcnQiIGlmIDQweCB8fCBDUE0yIHx8IFBQQ184M3h4IHx8IFBQQ184NXh4IHx8IFBQQ19NUEM1Mnh4IHx8IChFTUJFRERFRCAmJiBQUENfSVNFUklFUykKLQlkZWZhdWx0IHkgaWYgITQweCAmJiAhQ1BNMiAmJiAhOHh4ICYmICFBUFVTICYmICFQUENfODN4eCAmJiAhUFBDXzg1eHgKKwlib29sICJQQ0kgc3VwcG9ydCIgaWYgNDB4IHx8IENQTTIgfHwgUFBDXzgzeHggfHwgUFBDXzg1eHggfHwgUFBDXzg2eHggfHwgUFBDX01QQzUyeHggfHwgKEVNQkVEREVEICYmIFBQQ19JU0VSSUVTKQorCWRlZmF1bHQgeSBpZiAhNDB4ICYmICFDUE0yICYmICE4eHggJiYgIUFQVVMgJiYgIVBQQ184M3h4ICYmICFQUENfODV4eCAmJiAhUFBDXzg2eHgKIAlkZWZhdWx0IFBDSV9QRVJNRURJQSBpZiAhNHh4ICYmICFDUE0yICYmICE4eHggJiYgQVBVUwogCWRlZmF1bHQgUENJX1FTUEFOIGlmICE0eHggJiYgIUNQTTIgJiYgOHh4CiAJaGVscApAQCAtODI3LDEyICs4NDYsMTIgQEAKIAlkZWZhdWx0IHkKIAogY29uZmlnIDgyNjBfUENJOQotCWJvb2wgIiAgRW5hYmxlIHdvcmthcm91bmQgZm9yIE1QQzgyNnggZXJyYXR1bSBQQ0kgOSIKKwlib29sICJFbmFibGUgd29ya2Fyb3VuZCBmb3IgTVBDODI2eCBlcnJhdHVtIFBDSSA5IgogCWRlcGVuZHMgb24gUENJXzgyNjAgJiYgIUFEUzgyNzIKIAlkZWZhdWx0IHkKIAogY2hvaWNlCi0JcHJvbXB0ICIgIElETUEgY2hhbm5lbCBmb3IgUENJIDkgd29ya2Fyb3VuZCIKKwlwcm9tcHQgIklETUEgY2hhbm5lbCBmb3IgUENJIDkgd29ya2Fyb3VuZCIKIAlkZXBlbmRzIG9uIDgyNjBfUENJOQogCiBjb25maWcgODI2MF9QQ0k5X0lETUExCkBAIC04NDksNiArODY4LDggQEAKIAogZW5kY2hvaWNlCiAKK3NvdXJjZSAiZHJpdmVycy9wY2kvcGNpZS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvcGNpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9wY21jaWEvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9LY29uZmlnLmRlYnVnIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKaW5kZXggOGQ0OGU5ZS4uYzY5MDA2YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKKysrIGIvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcKQEAgLTExMCwxMyArMTEwLDE2IEBACiAJZGVwZW5kcyBvbiA0eHggfHwgTE9QRUMgfHwgTVY2NFg2MCB8fCBQUExVUyB8fCBQUlBNQzgwMCB8fCBcCiAJCVBQQ19HRU41NTAgfHwgUFBDX01QQzUyeHgKIAorY29uZmlnIFBQQ19FQVJMWV9ERUJVRworCWJvb2wgIkVhcmx5IGRlYnVnZ2luZyAoZGFuZ2Vyb3VzKSIKKwogY2hvaWNlCi0JcHJvbXB0ICJFYXJseSBkZWJ1Z2dpbmcgKGRhbmdlcm91cykiCi0JYm9vbAotCW9wdGlvbmFsCisJcHJvbXB0ICJFYXJseSBkZWJ1Z2dpbmcgY29uc29sZSIKKwlkZXBlbmRzIG9uIFBQQ19FQVJMWV9ERUJVRwogCWhlbHAKLQkgIEVuYWJsZSBlYXJseSBkZWJ1Z2dpbmcuIENhcmVmdWwsIGlmIHlvdSBlbmFibGUgZGVidWdnaW5nIGZvciB0aGUKLQkgIHdyb25nIHR5cGUgb2YgbWFjaGluZSB5b3VyIGtlcm5lbCBfd2lsbCBub3QgYm9vdF8uCisJICBVc2UgdGhlIHNlbGVjdGVkIGNvbnNvbGUgZm9yIGVhcmx5IGRlYnVnZ2luZy4gQ2FyZWZ1bCwgaWYgeW91CisJICBlbmFibGUgZGVidWdnaW5nIGZvciB0aGUgd3JvbmcgdHlwZSBvZiBtYWNoaW5lIHlvdXIga2VybmVsCisJICBfd2lsbCBub3QgYm9vdF8uCiAKIGNvbmZpZyBQUENfRUFSTFlfREVCVUdfTFBBUgogCWJvb2wgIkxQQVIgSFYgQ29uc29sZSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQppbmRleCBlZDViMjZhLi4wMTY2N2QxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL01ha2VmaWxlCkBAIC0xMDgsNyArMTA4LDYgQEAKIENGTEFHUwkJKz0gLW1jcHU9cG93ZXJwYwogZW5kaWYKIAotY3B1LWFzLSQoQ09ORklHX1BQQzY0QlJJREdFKQkrPSAtV2EsLW1wcGM2NGJyaWRnZQogY3B1LWFzLSQoQ09ORklHXzR4eCkJCSs9IC1XYSwtbTQwNQogY3B1LWFzLSQoQ09ORklHXzZ4eCkJCSs9IC1XYSwtbWFsdGl2ZWMKIGNwdS1hcy0kKENPTkZJR19QT1dFUjQpCQkrPSAtV2EsLW1hbHRpdmVjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCmluZGV4IDg0MGFlNTkuLmQ5NjFiZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L01ha2VmaWxlCkBAIC0yOSw4ICsyOSw4IEBACiBPQkpDT1BZX0NPRkZfQVJHUyA6PSAtTyBhaXhjb2ZmLXJzNjAwMCAtLXNldC1zdGFydCAweDUwMDAwMAogT0JKQ09QWV9NSUJfQVJHUyAgOj0gLU8gYWl4Y29mZi1yczYwMDAgLVIgLnN0YWIgLVIgLnN0YWJzdHIgLVIgLmNvbW1lbnQKIAotemxpYiAgICAgICA6PSBpbmZibG9jay5jIGluZmNvZGVzLmMgaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jIGluZnV0aWwuYwotemxpYmhlYWRlciA6PSBpbmZibG9jay5oIGluZmNvZGVzLmggaW5mZmFzdC5oIGluZnRyZWVzLmggaW5mdXRpbC5oCit6bGliICAgICAgIDo9IGluZmZhc3QuYyBpbmZsYXRlLmMgaW5mdHJlZXMuYworemxpYmhlYWRlciA6PSBpbmZmYXN0LmggaW5mZml4ZWQuaCBpbmZsYXRlLmggaW5mdHJlZXMuaCBpbmZ1dGlsLmgKIHpsaWJsaW51eGhlYWRlciA6PSB6bGliLmggemNvbmYuaCB6dXRpbC5oCiAKICQoYWRkcHJlZml4ICQob2JqKS8sJCh6bGliKSBtYWluLm8pOiAkKGFkZHByZWZpeCAkKG9iaikvLCQoemxpYmxpbnV4aGVhZGVyKSkgJChhZGRwcmVmaXggJChvYmopLywkKHpsaWJoZWFkZXIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jIGIvYXJjaC9wb3dlcnBjL2Jvb3QvbWFpbi5jCmluZGV4IDgxNjQ0NmYuLmI2NjYzNGMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L21haW4uYworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9tYWluLmMKQEAgLTMzLDYgKzMzLDE0IEBACiBleHRlcm4gY2hhciBfaW5pdHJkX3N0YXJ0W107CiBleHRlcm4gY2hhciBfaW5pdHJkX2VuZFtdOwogCisvKiBBIGJ1ZmZlciB0aGF0IG1heSBiZSBlZGl0ZWQgYnkgdG9vbHMgb3BlcmF0aW5nIG9uIGEgekltYWdlIGJpbmFyeSBzbyBhcyB0bworICogZWRpdCB0aGUgY29tbWFuZCBsaW5lIHBhc3NlZCB0byB2bWxpbnV4IChieSBzZXR0aW5nIC9jaG9zZW4vYm9vdGFyZ3MpLgorICogVGhlIGJ1ZmZlciBpcyBwdXQgaW4gaXQncyBvd24gc2VjdGlvbiBzbyB0aGF0IHRvb2xzIG1heSBsb2NhdGUgaXQgZWFzaWVyLgorICovCitzdGF0aWMgY2hhciBidWlsdGluX2NtZGxpbmVbNTEyXQorCV9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fYnVpbHRpbl9jbWRsaW5lIikpKTsKKworCiBzdHJ1Y3QgYWRkcl9yYW5nZSB7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGxvbmcgc2l6ZTsKQEAgLTIwNCw2ICsyMTIsMjMgQEAKIAlyZXR1cm4gMTsKIH0KIAordm9pZCBleHBvcnRfY21kbGluZSh2b2lkKiBjaG9zZW5faGFuZGxlKQoreworICAgICAgICBpbnQgbGVuOworICAgICAgICBjaGFyIGNtZGxpbmVbMl0gPSB7IDAsIDAgfTsKKworCWlmIChidWlsdGluX2NtZGxpbmVbMF0gPT0gMCkKKwkJcmV0dXJuOworCisgICAgICAgIGxlbiA9IGdldHByb3AoY2hvc2VuX2hhbmRsZSwgImJvb3RhcmdzIiwgY21kbGluZSwgc2l6ZW9mKGNtZGxpbmUpKTsKKyAgICAgICAgaWYgKGxlbiA+IDAgJiYgY21kbGluZVswXSAhPSAwKQorCQlyZXR1cm47CisKKwlzZXRwcm9wKGNob3Nlbl9oYW5kbGUsICJib290YXJncyIsIGJ1aWx0aW5fY21kbGluZSwKKwkJc3RybGVuKGJ1aWx0aW5fY21kbGluZSkgKyAxKTsKK30KKworCiB2b2lkIHN0YXJ0KHVuc2lnbmVkIGxvbmcgYTEsIHVuc2lnbmVkIGxvbmcgYTIsIHZvaWQgKnByb21wdHIsIHZvaWQgKnNwKQogewogCWludCBsZW47CkBAIC0yODksNiArMzE0LDggQEAKIAkJbWVtbW92ZSgodm9pZCAqKXZtbGludXguYWRkciwodm9pZCAqKXZtbGludXouYWRkcix2bWxpbnV6LnNpemUpOwogCX0KIAorCWV4cG9ydF9jbWRsaW5lKGNob3Nlbl9oYW5kbGUpOworCiAJLyogU2tpcCBvdmVyIHRoZSBFTEYgaGVhZGVyICovCiAjaWZkZWYgREVCVUcKIAlwcmludGYoIi4uLiBza2lwcGluZyAweCVseCBieXRlcyBvZiBFTEYgaGVhZGVyXG5cciIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmggYi9hcmNoL3Bvd2VycGMvYm9vdC9wcm9tLmgKaW5kZXggM2UyZGRkNC4uYTU3YjE4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvcHJvbS5oCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3Byb20uaApAQCAtMzEsNCArMzEsMTEgQEAKIAlyZXR1cm4gY2FsbF9wcm9tKCJnZXRwcm9wIiwgNCwgMSwgcGhhbmRsZSwgbmFtZSwgYnVmLCBidWZsZW4pOwogfQogCisKK3N0YXRpYyBpbmxpbmUgaW50IHNldHByb3Aodm9pZCAqcGhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQoreworCXJldHVybiBjYWxsX3Byb20oInNldHByb3AiLCA0LCAxLCBwaGFuZGxlLCBuYW1lLCBidWYsIGJ1Zmxlbik7Cit9CisKICNlbmRpZgkJCQkvKiBfUFBDX0JPT1RfUFJPTV9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY2VsbF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZwppbmRleCBkYmU0MjFkLi5iOGI4ZDQ2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jZWxsX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNgotIyBUaHUgTWFyIDIzIDIwOjQ4OjA5IDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNworIyBNb24gSnVuIDE5IDE3OjIzOjAzIDIwMDYKICMKIENPTkZJR19QUEM2ND15CiBDT05GSUdfNjRCSVQ9eQpAQCAtMTEsNiArMTEsNyBAQAogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19HRU5FUklDX0ZJTkRfTkVYVF9CSVQ9eQogQ09ORklHX1BQQz15CiBDT05GSUdfRUFSTFlfUFJJTlRLPXkKIENPTkZJR19DT01QQVQ9eQpAQCAtNTUsNyArNTYsNyBAQAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogQ09ORklHX0lLQ09ORklHPXkKIENPTkZJR19JS0NPTkZJR19QUk9DPXkKLSMgQ09ORklHX0NQVVNFVFMgaXMgbm90IHNldAorQ09ORklHX0NQVVNFVFM9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKIENPTkZJR19DQ19PUFRJTUlaRV9GT1JfU0laRT15CkBAIC0xMTYsMTMgKzExNywxNSBAQAogIyBDT05GSUdfUFBDX1BNQUMgaXMgbm90IHNldAogIyBDT05GSUdfUFBDX01BUExFIGlzIG5vdCBzZXQKIENPTkZJR19QUENfQ0VMTD15CitDT05GSUdfUFBDX0NFTExfTkFUSVZFPXkKK0NPTkZJR19QUENfSUJNX0NFTExfQkxBREU9eQorQ09ORklHX1BQQ19TWVNURU1TSU09eQogIyBDT05GSUdfVTNfREFSVCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDX1JUQVM9eQogIyBDT05GSUdfUlRBU19FUlJPUl9MT0dHSU5HIGlzIG5vdCBzZXQKIENPTkZJR19SVEFTX1BST0M9eQogQ09ORklHX1JUQVNfRkxBU0g9eQogQ09ORklHX01NSU9fTlZSQU09eQotQ09ORklHX0NFTExfSUlDPXkKICMgQ09ORklHX1BQQ19NUEMxMDYgaXMgbm90IHNldAogIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldApAQCAtMTMyLDcgKzEzNSw5IEBACiAjIENlbGwgQnJvYWRiYW5kIEVuZ2luZSBvcHRpb25zCiAjCiBDT05GSUdfU1BVX0ZTPW0KK0NPTkZJR19TUFVfQkFTRT15CiBDT05GSUdfU1BVRlNfTU1BUD15CitDT05GSUdfQ0JFX1JBUz15CiAKICMKICMgS2VybmVsIG9wdGlvbnMKQEAgLTE1MiwyMCArMTU3LDI0IEBACiBDT05GSUdfS0VYRUM9eQogIyBDT05GSUdfQ1JBU0hfRFVNUCBpcyBub3Qgc2V0CiBDT05GSUdfSVJRX0FMTF9DUFVTPXkKLSMgQ09ORklHX05VTUEgaXMgbm90IHNldAorQ09ORklHX05VTUE9eQorQ09ORklHX05PREVTX1NISUZUPTQKIENPTkZJR19BUkNIX1NFTEVDVF9NRU1PUllfTU9ERUw9eQotQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0VOQUJMRT15CiBDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CiAjIENPTkZJR19GTEFUTUVNX01BTlVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMPXkKIENPTkZJR19TUEFSU0VNRU09eQorQ09ORklHX05FRURfTVVMVElQTEVfTk9ERVM9eQogQ09ORklHX0hBVkVfTUVNT1JZX1BSRVNFTlQ9eQogIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BBUlNFTUVNX0VYVFJFTUU9eQotIyBDT05GSUdfTUVNT1JZX0hPVFBMVUcgaXMgbm90IHNldAorQ09ORklHX01FTU9SWV9IT1RQTFVHPXkKIENPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfTUlHUkFUSU9OPXkKK0NPTkZJR19IQVZFX0FSQ0hfRUFSTFlfUEZOX1RPX05JRD15CitDT05GSUdfQVJDSF9NRU1PUllfUFJPQkU9eQogIyBDT05GSUdfUFBDXzY0S19QQUdFUyBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURfU01UPXkKIENPTkZJR19QUk9DX0RFVklDRVRSRUU9eQpAQCAtMTgyLDYgKzE5MSw3IEBACiAjIENPTkZJR19QUENfSU5ESVJFQ1RfUENJIGlzIG5vdCBzZXQKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKK0NPTkZJR19QQ0lFUE9SVEJVUz15CiAjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAogCiAjCkBAIC00NzYsNyArNDg2LDcgQEAKICMKIENPTkZJR19ORVRERVZJQ0VTPXkKICMgQ09ORklHX0RVTU1ZIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAorQ09ORklHX0JPTkRJTkc9eQogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CiAKQEAgLTYyNCw2ICs2MzQsNyBAQAogIyBDT05GSUdfTl9IRExDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NQRUNJQUxJWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TWCBpcyBub3Qgc2V0CisjIENPTkZJR19SSU8gaXMgbm90IHNldAogIyBDT05GSUdfU1RBTERSViBpcyBub3Qgc2V0CiAKICMKQEAgLTc2Niw2ICs3NzcsNyBAQAogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwpAQCAtMTA1NCwxMSArMTA2Niw3IEBACiAjIENPTkZJR19YTU9OIGlzIG5vdCBzZXQKIENPTkZJR19JUlFTVEFDS1M9eQogIyBDT05GSUdfQk9PVFhfVEVYVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfTFBBUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfRzUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX1JUQVMgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX01BUExFIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19JU0VSSUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVRyBpcyBub3Qgc2V0CiAKICMKICMgU2VjdXJpdHkgb3B0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9jZHNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9jZHNfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYjAyMmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2Nkc19kZWZjb25maWcKQEAgLTAsMCArMSw4NDYgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNgorIyBTdW4gQXByICAyIDExOjIzOjQyIDIwMDYKKyMKKyMgQ09ORklHX1BQQzY0IGlzIG5vdCBzZXQKK0NPTkZJR19QUEMzMj15CitDT05GSUdfUFBDX01FUkdFPXkKK0NPTkZJR19NTVU9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQorQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKK0NPTkZJR19QUEM9eQorQ09ORklHX0VBUkxZX1BSSU5USz15CitDT05GSUdfR0VORVJJQ19OVlJBTT15CitDT05GSUdfU0NIRURfTk9fTk9fT01JVF9GUkFNRV9QT0lOVEVSPXkKK0NPTkZJR19BUkNIX01BWV9IQVZFX1BDX0ZEQz15CitDT05GSUdfUFBDX09GPXkKK0NPTkZJR19QUENfVURCR18xNjU1MD15CisjIENPTkZJR19HRU5FUklDX1RCU1lOQyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUZBVUxUX1VJTUFHRSBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2Vzc29yIHN1cHBvcnQKKyMKKyMgQ09ORklHX0NMQVNTSUMzMiBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfNTJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODJ4eCBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfODN4eCBpcyBub3Qgc2V0CitDT05GSUdfUFBDXzg1eHg9eQorIyBDT05GSUdfNDB4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzQ0eCBpcyBub3Qgc2V0CisjIENPTkZJR184eHggaXMgbm90IHNldAorIyBDT05GSUdfRTIwMCBpcyBub3Qgc2V0CitDT05GSUdfODV4eD15CitDT05GSUdfRTUwMD15CitDT05GSUdfQk9PS0U9eQorQ09ORklHX0ZTTF9CT09LRT15CisjIENPTkZJR19QSFlTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19TUEU9eQorCisjCisjIENvZGUgbWF0dXJpdHkgbGV2ZWwgb3B0aW9ucworIworQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfQlJPS0VOX09OX1NNUD15CitDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCisKKyMKKyMgR2VuZXJhbCBzZXR1cAorIworQ09ORklHX0xPQ0FMVkVSU0lPTj0iIgorQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPPXkKK0NPTkZJR19TV0FQPXkKK0NPTkZJR19TWVNWSVBDPXkKKyMgQ09ORklHX1BPU0lYX01RVUVVRSBpcyBub3Qgc2V0CisjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUIGlzIG5vdCBzZXQKK0NPTkZJR19TWVNDVEw9eQorIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAorIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKKyMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfS0FMTFNZTVM9eQorIyBDT05GSUdfS0FMTFNZTVNfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgbm90IHNldAorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKK0NPTkZJR19FTEZfQ09SRT15CitDT05GSUdfQkFTRV9GVUxMPXkKK0NPTkZJR19GVVRFWD15CitDT05GSUdfRVBPTEw9eQorQ09ORklHX1NITUVNPXkKK0NPTkZJR19TTEFCPXkKKyMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAorQ09ORklHX0JBU0VfU01BTEw9MAorIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CisKKyMKKyMgTG9hZGFibGUgbW9kdWxlIHN1cHBvcnQKKyMKKyMgQ09ORklHX01PRFVMRVMgaXMgbm90IHNldAorCisjCisjIEJsb2NrIGxheWVyCisjCisjIENPTkZJR19MQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19MU0YgaXMgbm90IHNldAorCisjCisjIElPIFNjaGVkdWxlcnMKKyMKK0NPTkZJR19JT1NDSEVEX05PT1A9eQorQ09ORklHX0lPU0NIRURfQVM9eQorQ09ORklHX0lPU0NIRURfREVBRExJTkU9eQorQ09ORklHX0lPU0NIRURfQ0ZRPXkKK0NPTkZJR19ERUZBVUxUX0FTPXkKKyMgQ09ORklHX0RFRkFVTFRfREVBRExJTkUgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImFudGljaXBhdG9yeSIKK0NPTkZJR19NUElDPXkKKyMgQ09ORklHX1dBTlRfRUFSTFlfU0VSSUFMIGlzIG5vdCBzZXQKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0CisjCisjIENPTkZJR19NUEM4NTQwX0FEUyBpcyBub3Qgc2V0CitDT05GSUdfTVBDODV4eF9DRFM9eQorQ09ORklHX01QQzg1NDA9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCisjIENPTkZJR19ISUdITUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CitDT05GSUdfSFpfMjUwPXkKKyMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAorQ09ORklHX0haPTI1MAorQ09ORklHX1BSRUVNUFRfTk9ORT15CisjIENPTkZJR19QUkVFTVBUX1ZPTFVOVEFSWSBpcyBub3Qgc2V0CisjIENPTkZJR19QUkVFTVBUIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfRUxGPXkKK0NPTkZJR19CSU5GTVRfTUlTQz15CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorQ09ORklHX0FSQ0hfRkxBVE1FTV9FTkFCTEU9eQorQ09ORklHX1NFTEVDVF9NRU1PUllfTU9ERUw9eQorQ09ORklHX0ZMQVRNRU1fTUFOVUFMPXkKKyMgQ09ORklHX0RJU0NPTlRJR01FTV9NQU5VQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1BBUlNFTUVNX01BTlVBTCBpcyBub3Qgc2V0CitDT05GSUdfRkxBVE1FTT15CitDT05GSUdfRkxBVF9OT0RFX01FTV9NQVA9eQorIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CitDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CisjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldAorIyBDT05GSUdfUE0gaXMgbm90IHNldAorIyBDT05GSUdfU09GVFdBUkVfU1VTUEVORCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19QUENfSTgyNTk9eQorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0k9eQorQ09ORklHX0ZTTF9TT0M9eQorQ09ORklHX1BDST15CitDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBQQ0NBUkQgKFBDTUNJQS9DYXJkQnVzKSBzdXBwb3J0CisjCisjIENPTkZJR19QQ0NBUkQgaXMgbm90IHNldAorCisjCisjIFBDSSBIb3RwbHVnIFN1cHBvcnQKKyMKKyMgQ09ORklHX0hPVFBMVUdfUENJIGlzIG5vdCBzZXQKKworIworIyBBZHZhbmNlZCBzZXR1cAorIworIyBDT05GSUdfQURWQU5DRURfT1BUSU9OUyBpcyBub3Qgc2V0CisKKyMKKyMgRGVmYXVsdCBzZXR0aW5ncyBmb3IgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSB1c2VkCisjCitDT05GSUdfSElHSE1FTV9TVEFSVD0weGZlMDAwMDAwCitDT05GSUdfTE9XTUVNX1NJWkU9MHgzMDAwMDAwMAorQ09ORklHX0tFUk5FTF9TVEFSVD0weGMwMDAwMDAwCitDT05GSUdfVEFTS19TSVpFPTB4ODAwMDAwMDAKK0NPTkZJR19CT09UX0xPQUQ9MHgwMDgwMDAwMAorCisjCisjIE5ldHdvcmtpbmcKKyMKK0NPTkZJR19ORVQ9eQorCisjCisjIE5ldHdvcmtpbmcgb3B0aW9ucworIworIyBDT05GSUdfTkVUREVCVUcgaXMgbm90IHNldAorQ09ORklHX1BBQ0tFVD15CisjIENPTkZJR19QQUNLRVRfTU1BUCBpcyBub3Qgc2V0CitDT05GSUdfVU5JWD15CisjIENPTkZJR19ORVRfS0VZIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9NVUxUSUNBU1Q9eQorIyBDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19JUF9GSUJfSEFTSD15CitDT05GSUdfSVBfUE5QPXkKK0NPTkZJR19JUF9QTlBfREhDUD15CitDT05GSUdfSVBfUE5QX0JPT1RQPXkKKyMgQ09ORklHX0lQX1BOUF9SQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9JUEdSRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CitDT05GSUdfU1lOX0NPT0tJRVM9eQorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CisjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKKyMgQ09ORklHX0ZXX0xPQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19EUklWRVIgaXMgbm90IHNldAorCisjCisjIENvbm5lY3RvciAtIHVuaWZpZWQgdXNlcnNwYWNlIDwtPiBrZXJuZWxzcGFjZSBsaW5rZXIKKyMKKyMgQ09ORklHX0NPTk5FQ1RPUiBpcyBub3Qgc2V0CisKKyMKKyMgTWVtb3J5IFRlY2hub2xvZ3kgRGV2aWNlcyAoTVREKQorIworIyBDT05GSUdfTVREIGlzIG5vdCBzZXQKKworIworIyBQYXJhbGxlbCBwb3J0IHN1cHBvcnQKKyMKKyMgQ09ORklHX1BBUlBPUlQgaXMgbm90IHNldAorCisjCisjIFBsdWcgYW5kIFBsYXkgc3VwcG9ydAorIworCisjCisjIEJsb2NrIGRldmljZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfRkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9EQSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfQ1BRX0NJU1NfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9EQUM5NjAgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9VTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQ09XX0NPTU1PTiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9MT09QPXkKKyMgQ09ORklHX0JMS19ERVZfQ1JZUFRPTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX05CRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NYOCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX0NPVU5UPTE2CitDT05GSUdfQkxLX0RFVl9SQU1fU0laRT0zMjc2OAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKKyMgQ09ORklHX0NEUk9NX1BLVENEVkQgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKKworIworIyBBVEEvQVRBUEkvTUZNL1JMTCBzdXBwb3J0CisjCitDT05GSUdfSURFPXkKK0NPTkZJR19CTEtfREVWX0lERT15CisKKyMKKyMgUGxlYXNlIHNlZSBEb2N1bWVudGF0aW9uL2lkZS50eHQgZm9yIGhlbHAvaW5mbyBvbiBJREUgZHJpdmVzCisjCisjIENPTkZJR19CTEtfREVWX0lERV9TQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRElTSyBpcyBub3Qgc2V0CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAorCisjCisjIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKKyMKK0NPTkZJR19JREVfR0VORVJJQz15CitDT05GSUdfQkxLX0RFVl9JREVQQ0k9eQorQ09ORklHX0lERVBDSV9TSEFSRV9JUlE9eQorIyBDT05GSUdfQkxLX0RFVl9PRkZCT0FSRCBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9HRU5FUklDPXkKKyMgQ09ORklHX0JMS19ERVZfT1BUSTYyMSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NMODJDMTA1IGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lERURNQV9QQ0k9eQorIyBDT05GSUdfQkxLX0RFVl9JREVETUFfRk9SQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9QQ0lfQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0FFQzYyWFggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfQU1ENzRYWCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NNRDY0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9DWTgyQzY5MyBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUyMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NTNTUzMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM0WCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0hQVDM2NiBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NDMTIwMCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1BJSVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JVDgyMVggaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OUzg3NDE1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfUERDMjAyWFhfTkVXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU1ZXS1MgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TSUlNQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfU0xDOTBFNjYgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9UUk0yOTAgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfVklBODJDWFhYPXkKKyMgQ09ORklHX0lERV9BUk0gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRE1BPXkKKyMgQ09ORklHX0lERURNQV9JVkIgaXMgbm90IHNldAorIyBDT05GSUdfSURFRE1BX0FVVE8gaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9IRCBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1dJTkRGQVJNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CisjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CisjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VRVUFMSVpFUiBpcyBub3Qgc2V0CisjIENPTkZJR19UVU4gaXMgbm90IHNldAorCisjCisjIEFSQ25ldCBkZXZpY2VzCisjCisjIENPTkZJR19BUkNORVQgaXMgbm90IHNldAorCisjCisjIFBIWSBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX1BIWUxJQj15CisKKyMKKyMgTUlJIFBIWSBkZXZpY2UgZHJpdmVycworIworIyBDT05GSUdfTUFSVkVMTF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfREFWSUNPTV9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfUVNFTUlfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xYVF9QSFkgaXMgbm90IHNldAorIyBDT05GSUdfQ0lDQURBX1BIWSBpcyBub3Qgc2V0CisKKyMKKyMgRXRoZXJuZXQgKDEwIG9yIDEwME1iaXQpCisjCitDT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19NSUk9eQorIyBDT05GSUdfSEFQUFlNRUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTkdFTSBpcyBub3Qgc2V0CisjIENPTkZJR19DQVNTSU5JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfM0NPTSBpcyBub3Qgc2V0CisKKyMKKyMgVHVsaXAgZmFtaWx5IG5ldHdvcmsgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX05FVF9UVUxJUCBpcyBub3Qgc2V0CisjIENPTkZJR19IUDEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUENJIGlzIG5vdCBzZXQKKworIworIyBFdGhlcm5ldCAoMTAwMCBNYml0KQorIworIyBDT05GSUdfQUNFTklDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RMMksgaXMgbm90IHNldAorQ09ORklHX0UxMDAwPXkKK0NPTkZJR19FMTAwMF9OQVBJPXkKKyMgQ09ORklHX0UxMDAwX0RJU0FCTEVfUEFDS0VUX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TODM4MjAgaXMgbm90IHNldAorIyBDT05GSUdfSEFNQUNISSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRUxMT1dGSU4gaXMgbm90IHNldAorIyBDT05GSUdfUjgxNjkgaXMgbm90IHNldAorIyBDT05GSUdfU0lTMTkwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLR0UgaXMgbm90IHNldAorIyBDT05GSUdfU0tZMiBpcyBub3Qgc2V0CisjIENPTkZJR19TSzk4TElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJR09OMyBpcyBub3Qgc2V0CisjIENPTkZJR19CTlgyIGlzIG5vdCBzZXQKK0NPTkZJR19HSUFORkFSPXkKK0NPTkZJR19HRkFSX05BUEk9eQorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworIyBDT05GSUdfVlQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSUFMX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKworIworIyBTZXJpYWwgZHJpdmVycworIworQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorQ09ORklHX0xFR0FDWV9QVFlTPXkKK0NPTkZJR19MRUdBQ1lfUFRZX0NPVU5UPTI1NgorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKK0NPTkZJR19HRU5fUlRDPXkKKyMgQ09ORklHX0dFTl9SVENfWCBpcyBub3Qgc2V0CisjIENPTkZJR19EVExLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1IzOTY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0FQUExJQ09NIGlzIG5vdCBzZXQKKworIworIyBGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIKKyMKKyMgQ09ORklHX0FHUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUk0gaXMgbm90IHNldAorIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CisKKyMKKyMgVFBNIGRldmljZXMKKyMKKyMgQ09ORklHX1RDR19UUE0gaXMgbm90IHNldAorIyBDT05GSUdfVEVMQ0xPQ0sgaXMgbm90IHNldAorCisjCisjIEkyQyBzdXBwb3J0CisjCisjIENPTkZJR19JMkMgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworQ09ORklHX0hXTU9OPXkKKyMgQ09ORklHX0hXTU9OX1ZJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0Y3MTgwNUYgaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzYyBkZXZpY2VzCisjCisKKyMKKyMgTXVsdGltZWRpYSBkZXZpY2VzCisjCisjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAorCisjCisjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKKyMKKyMgQ09ORklHX0RWQiBpcyBub3Qgc2V0CisKKyMKKyMgR3JhcGhpY3Mgc3VwcG9ydAorIworIyBDT05GSUdfRkIgaXMgbm90IHNldAorCisjCisjIFNvdW5kCisjCisjIENPTkZJR19TT1VORCBpcyBub3Qgc2V0CisKKyMKKyMgVVNCIHN1cHBvcnQKKyMKK0NPTkZJR19VU0JfQVJDSF9IQVNfSENEPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfT0hDST15CitDT05GSUdfVVNCX0FSQ0hfSEFTX0VIQ0k9eQorIyBDT05GSUdfVVNCIGlzIG5vdCBzZXQKKworIworIyBOT1RFOiBVU0JfU1RPUkFHRSBlbmFibGVzIFNDU0ksIGFuZCAnU0NTSSBkaXNrIHN1cHBvcnQnCisjCisKKyMKKyMgVVNCIEdhZGdldCBTdXBwb3J0CisjCisjIENPTkZJR19VU0JfR0FER0VUIGlzIG5vdCBzZXQKKworIworIyBNTUMvU0QgQ2FyZCBzdXBwb3J0CisjCisjIENPTkZJR19NTUMgaXMgbm90IHNldAorCisjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgSW5maW5pQmFuZCBzdXBwb3J0CisjCisjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKKworIworIyBFREFDIC0gZXJyb3IgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgKFJBUykgKEVYUEVSSU1FTlRBTCkKKyMKKworIworIyBSZWFsIFRpbWUgQ2xvY2sKKyMKKyMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CisKKyMKKyMgRmlsZSBzeXN0ZW1zCisjCitDT05GSUdfRVhUMl9GUz15CisjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTPXkKK0NPTkZJR19FWFQzX0ZTX1hBVFRSPXkKKyMgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAorQ09ORklHX0pCRD15CisjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAorQ09ORklHX0ZTX01CQ0FDSEU9eQorIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19YRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAorIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAorQ09ORklHX0lOT1RJRlk9eQorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorQ09ORklHX0ROT1RJRlk9eQorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRlVTRV9GUyBpcyBub3Qgc2V0CisKKyMKKyMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfSVNPOTY2MF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VREZfRlMgaXMgbm90IHNldAorCisjCisjIERPUy9GQVQvTlQgRmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX01TRE9TX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZGQVRfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTlRGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgUHNldWRvIGZpbGVzeXN0ZW1zCisjCitDT05GSUdfUFJPQ19GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfU1lTRlM9eQorQ09ORklHX1RNUEZTPXkKKyMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CitDT05GSUdfUkFNRlM9eQorIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKKyMKKyMgQ09ORklHX0FERlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEZTUExVU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZYRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSFBGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19RTlg0RlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCisjCitDT05GSUdfTkZTX0ZTPXkKKyMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorIyBDT05GSUdfTkZTX0RJUkVDVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU0QgaXMgbm90IHNldAorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTkZTX0NPTU1PTj15CitDT05GSUdfU1VOUlBDPXkKKyMgQ09ORklHX1JQQ1NFQ19HU1NfS1JCNSBpcyBub3Qgc2V0CisjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DUF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DT0RBX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR185UF9GUyBpcyBub3Qgc2V0CisKKyMKKyMgUGFydGl0aW9uIFR5cGVzCisjCitDT05GSUdfUEFSVElUSU9OX0FEVkFOQ0VEPXkKKyMgQ09ORklHX0FDT1JOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19PU0ZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FNSUdBX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFSSV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTUFDX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NU0RPU19QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfTERNX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TR0lfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VOX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19LQVJNQV9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRUZJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisKKyMKKyMgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyMKKyMgQ09ORklHX05MUyBpcyBub3Qgc2V0CisKKyMKKyMgTGlicmFyeSByb3V0aW5lcworIworIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKK0NPTkZJR19DUkMzMj15CisjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAorCisjCisjIEluc3RydW1lbnRhdGlvbiBTdXBwb3J0CisjCisjIENPTkZJR19QUk9GSUxJTkcgaXMgbm90IHNldAorCisjCisjIEtlcm5lbCBoYWNraW5nCisjCisjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CitDT05GSUdfREVCVUdfS0VSTkVMPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfREVURUNUX1NPRlRMT0NLVVA9eQorIyBDT05GSUdfU0NIRURTVEFUUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TTEFCIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19NVVRFWEVTPXkKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0tPQkpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODY0MV9ocGNuX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg2NDFfaHBjbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhMzBmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg2NDFfaHBjbl9kZWZjb25maWcKQEAgLTAsMCArMSw5MjEgQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNy1yYzMKKyMgRnJpIEp1biAxNiAxMDo0NzowOSAyMDA2CisjCisjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CitDT05GSUdfUFBDMzI9eQorQ09ORklHX1BQQ19NRVJHRT15CitDT05GSUdfTU1VPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITT15CitDT05GSUdfR0VORVJJQ19IV0VJR0hUPXkKK0NPTkZJR19HRU5FUklDX0NBTElCUkFURV9ERUxBWT15CitDT05GSUdfUFBDPXkKK0NPTkZJR19FQVJMWV9QUklOVEs9eQorQ09ORklHX0dFTkVSSUNfTlZSQU09eQorQ09ORklHX1NDSEVEX05PX05PX09NSVRfRlJBTUVfUE9JTlRFUj15CitDT05GSUdfQVJDSF9NQVlfSEFWRV9QQ19GREM9eQorQ09ORklHX1BQQ19PRj15CitDT05GSUdfUFBDX1VEQkdfMTY1NTA9eQorQ09ORklHX0dFTkVSSUNfVEJTWU5DPXkKKyMgQ09ORklHX0RFRkFVTFRfVUlNQUdFIGlzIG5vdCBzZXQKKworIworIyBQcm9jZXNzb3Igc3VwcG9ydAorIworIyBDT05GSUdfQ0xBU1NJQzMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ181Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184M3h4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKK0NPTkZJR19QUENfODZ4eD15CisjIENPTkZJR180MHggaXMgbm90IHNldAorIyBDT05GSUdfNDR4IGlzIG5vdCBzZXQKKyMgQ09ORklHXzh4eCBpcyBub3Qgc2V0CisjIENPTkZJR19FMjAwIGlzIG5vdCBzZXQKK0NPTkZJR182eHg9eQorQ09ORklHX1BQQ19GUFU9eQorQ09ORklHX0FMVElWRUM9eQorQ09ORklHX1BQQ19TVERfTU1VPXkKK0NPTkZJR19QUENfU1REX01NVV8zMj15CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTIKKworIworIyBDb2RlIG1hdHVyaXR5IGxldmVsIG9wdGlvbnMKKyMKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX0xPQ0tfS0VSTkVMPXkKK0NPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKKworIworIyBHZW5lcmFsIHNldHVwCisjCitDT05GSUdfTE9DQUxWRVJTSU9OPSIiCisjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZU1ZJUEMgaXMgbm90IHNldAorIyBDT05GSUdfUE9TSVhfTVFVRVVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTD15CisjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CitDT05GSUdfSUtDT05GSUc9eQorQ09ORklHX0lLQ09ORklHX1BST0M9eQorIyBDT05GSUdfQ1BVU0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CitDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgorIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorQ09ORklHX0VNQkVEREVEPXkKK0NPTkZJR19LQUxMU1lNUz15CisjIENPTkZJR19LQUxMU1lNU19BTEwgaXMgbm90IHNldAorQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorQ09ORklHX0hPVFBMVUc9eQorQ09ORklHX1BSSU5USz15CitDT05GSUdfQlVHPXkKKyMgQ09ORklHX0VMRl9DT1JFIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX0ZVTEw9eQorQ09ORklHX0ZVVEVYPXkKK0NPTkZJR19FUE9MTD15CitDT05GSUdfU0hNRU09eQorIyBDT05GSUdfU0xBQiBpcyBub3Qgc2V0CisjIENPTkZJR19USU5ZX1NITUVNIGlzIG5vdCBzZXQKK0NPTkZJR19CQVNFX1NNQUxMPTAKK0NPTkZJR19TTE9CPXkKKworIworIyBMb2FkYWJsZSBtb2R1bGUgc3VwcG9ydAorIworIyBDT05GSUdfTU9EVUxFUyBpcyBub3Qgc2V0CisKKyMKKyMgQmxvY2sgbGF5ZXIKKyMKKyMgQ09ORklHX0xCRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lPX1RSQUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTRiBpcyBub3Qgc2V0CisKKyMKKyMgSU8gU2NoZWR1bGVycworIworQ09ORklHX0lPU0NIRURfTk9PUD15CisjIENPTkZJR19JT1NDSEVEX0FTIGlzIG5vdCBzZXQKK0NPTkZJR19JT1NDSEVEX0RFQURMSU5FPXkKKyMgQ09ORklHX0lPU0NIRURfQ0ZRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFRkFVTFRfQVMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfREVBRExJTkU9eQorIyBDT05GSUdfREVGQVVMVF9DRlEgaXMgbm90IHNldAorIyBDT05GSUdfREVGQVVMVF9OT09QIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX0lPU0NIRUQ9ImRlYWRsaW5lIgorQ09ORklHX01QSUM9eQorIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAorQ09ORklHX1BQQ19JTkRJUkVDVF9QQ0lfQkU9eQorCisjCisjIFBsYXRmb3JtIFN1cHBvcnQKKyMKK0NPTkZJR19NUEM4NjQxX0hQQ049eQorQ09ORklHX01QQzg2NDE9eQorCisjCisjIEtlcm5lbCBvcHRpb25zCisjCitDT05GSUdfSElHSE1FTT15CisjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAorIyBDT05GSUdfSFpfMjUwIGlzIG5vdCBzZXQKK0NPTkZJR19IWl8xMDAwPXkKK0NPTkZJR19IWj0xMDAwCitDT05GSUdfUFJFRU1QVF9OT05FPXkKKyMgQ09ORklHX1BSRUVNUFRfVk9MVU5UQVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAorQ09ORklHX1BSRUVNUFRfQktMPXkKK0NPTkZJR19CSU5GTVRfRUxGPXkKKyMgQ09ORklHX0JJTkZNVF9NSVNDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSUV9BTExfQ1BVUyBpcyBub3Qgc2V0CitDT05GSUdfQVJDSF9GTEFUTUVNX0VOQUJMRT15CitDT05GSUdfU0VMRUNUX01FTU9SWV9NT0RFTD15CitDT05GSUdfRkxBVE1FTV9NQU5VQUw9eQorIyBDT05GSUdfRElTQ09OVElHTUVNX01BTlVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19TUEFSU0VNRU1fTUFOVUFMIGlzIG5vdCBzZXQKK0NPTkZJR19GTEFUTUVNPXkKK0NPTkZJR19GTEFUX05PREVfTUVNX01BUD15CisjIENPTkZJR19TUEFSU0VNRU1fU1RBVElDIGlzIG5vdCBzZXQKK0NPTkZJR19TUExJVF9QVExPQ0tfQ1BVUz00CitDT05GSUdfUFJPQ19ERVZJQ0VUUkVFPXkKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19QTSBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19JU0FfRE1BX0FQST15CisKKyMKKyMgQnVzIG9wdGlvbnMKKyMKK0NPTkZJR19HRU5FUklDX0lTQV9ETUE9eQorQ09ORklHX1BQQ19JODI1OT15CitDT05GSUdfUFBDX0lORElSRUNUX1BDST15CitDT05GSUdfRlNMX1NPQz15CitDT05GSUdfUENJPXkKK0NPTkZJR19QQ0lfRE9NQUlOUz15CisjIENPTkZJR19QQ0lfREVCVUcgaXMgbm90IHNldAorCisjCisjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKKyMKKyMgQ09ORklHX1BDQ0FSRCBpcyBub3Qgc2V0CisKKyMKKyMgUENJIEhvdHBsdWcgU3VwcG9ydAorIworIyBDT05GSUdfSE9UUExVR19QQ0kgaXMgbm90IHNldAorCisjCisjIEFkdmFuY2VkIHNldHVwCisjCisjIENPTkZJR19BRFZBTkNFRF9PUFRJT05TIGlzIG5vdCBzZXQKKworIworIyBEZWZhdWx0IHNldHRpbmdzIGZvciBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHVzZWQKKyMKK0NPTkZJR19ISUdITUVNX1NUQVJUPTB4ZmUwMDAwMDAKK0NPTkZJR19MT1dNRU1fU0laRT0weDMwMDAwMDAwCitDT05GSUdfS0VSTkVMX1NUQVJUPTB4YzAwMDAwMDAKK0NPTkZJR19UQVNLX1NJWkU9MHg4MDAwMDAwMAorQ09ORklHX0JPT1RfTE9BRD0weDAwODAwMDAwCisKKyMKKyMgTmV0d29ya2luZworIworQ09ORklHX05FVD15CisKKyMKKyMgTmV0d29ya2luZyBvcHRpb25zCisjCisjIENPTkZJR19ORVRERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfUEFDS0VUPXkKKyMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19VTklYPXkKKyMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX0lORVQ9eQorIyBDT05GSUdfSVBfTVVMVElDQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CitDT05GSUdfSVBfRklCX0hBU0g9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfSVBfUE5QX1JBUlA9eQorIyBDT05GSUdfTkVUX0lQSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0lQR1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUEQgaXMgbm90IHNldAorIyBDT05GSUdfU1lOX0NPT0tJRVMgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX0lQQ09NUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVUX0RJQUc9eQorQ09ORklHX0lORVRfVENQX0RJQUc9eQorIyBDT05GSUdfVENQX0NPTkdfQURWQU5DRUQgaXMgbm90IHNldAorQ09ORklHX1RDUF9DT05HX0JJQz15CitDT05GSUdfSVBWNj15CisjIENPTkZJR19JUFY2X1BSSVZBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfSVBWNl9ST1VURVJfUFJFRiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9BSCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9FU1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVDZfSVBDT01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JUFY2X1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRGSUxURVIgaXMgbm90IHNldAorCisjCisjIERDQ1AgQ29uZmlndXJhdGlvbiAoRVhQRVJJTUVOVEFMKQorIworIyBDT05GSUdfSVBfRENDUCBpcyBub3Qgc2V0CisKKyMKKyMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCisjCisjIENPTkZJR19JUF9TQ1RQIGlzIG5vdCBzZXQKKworIworIyBUSVBDIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKKyMKKyMgQ09ORklHX1RJUEMgaXMgbm90IHNldAorIyBDT05GSUdfQVRNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSSURHRSBpcyBub3Qgc2V0CisjIENPTkZJR19WTEFOXzgwMjFRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQ05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19MTEMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQWCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFMSyBpcyBub3Qgc2V0CisjIENPTkZJR19YMjUgaXMgbm90IHNldAorIyBDT05GSUdfTEFQQiBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRElWRVJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CisjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKworIworIyBRb1MgYW5kL29yIGZhaXIgcXVldWVpbmcKKyMKKyMgQ09ORklHX05FVF9TQ0hFRCBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayB0ZXN0aW5nCisjCisjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTVJBRElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lSREEgaXMgbm90IHNldAorIyBDT05GSUdfQlQgaXMgbm90IHNldAorIyBDT05GSUdfSUVFRTgwMjExIGlzIG5vdCBzZXQKKworIworIyBEZXZpY2UgRHJpdmVycworIworCisjCisjIEdlbmVyaWMgRHJpdmVyIE9wdGlvbnMKKyMKK0NPTkZJR19TVEFOREFMT05FPXkKK0NPTkZJR19QUkVWRU5UX0ZJUk1XQVJFX0JVSUxEPXkKK0NPTkZJR19GV19MT0FERVI9eQorIyBDT05GSUdfREVCVUdfRFJJVkVSIGlzIG5vdCBzZXQKKworIworIyBDb25uZWN0b3IgLSB1bmlmaWVkIHVzZXJzcGFjZSA8LT4ga2VybmVsc3BhY2UgbGlua2VyCisjCisjIENPTkZJR19DT05ORUNUT1IgaXMgbm90IHNldAorCisjCisjIE1lbW9yeSBUZWNobm9sb2d5IERldmljZXMgKE1URCkKKyMKKyMgQ09ORklHX01URCBpcyBub3Qgc2V0CisKKyMKKyMgUGFyYWxsZWwgcG9ydCBzdXBwb3J0CisjCisjIENPTkZJR19QQVJQT1JUIGlzIG5vdCBzZXQKKworIworIyBQbHVnIGFuZCBQbGF5IHN1cHBvcnQKKyMKKworIworIyBCbG9jayBkZXZpY2VzCisjCisjIENPTkZJR19CTEtfREVWX0ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19DUFFfREEgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0NQUV9DSVNTX0RBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfREFDOTYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfVU1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0NPV19DT01NT04gaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfTE9PUD15CisjIENPTkZJR19CTEtfREVWX0NSWVBUT0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9OQkQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TWDggaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9DT1VOVD0xNgorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MTMxMDcyCitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorIyBDT05GSUdfQ0RST01fUEtUQ0RWRCBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfT1ZFUl9FVEggaXMgbm90IHNldAorCisjCisjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKKyMKKyMgQ09ORklHX0lERSBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfUkFJRF9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJIGlzIG5vdCBzZXQKKworIworIyBNdWx0aS1kZXZpY2Ugc3VwcG9ydCAoUkFJRCBhbmQgTFZNKQorIworIyBDT05GSUdfTUQgaXMgbm90IHNldAorCisjCisjIEZ1c2lvbiBNUFQgZGV2aWNlIHN1cHBvcnQKKyMKKyMgQ09ORklHX0ZVU0lPTiBpcyBub3Qgc2V0CisKKyMKKyMgSUVFRSAxMzk0IChGaXJlV2lyZSkgc3VwcG9ydAorIworIyBDT05GSUdfSUVFRTEzOTQgaXMgbm90IHNldAorCisjCisjIEkyTyBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfSTJPIGlzIG5vdCBzZXQKKworIworIyBNYWNpbnRvc2ggZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX1dJTkRGQVJNIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JrIGRldmljZSBzdXBwb3J0CisjCitDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfRFVNTVk9eQorIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CisjIENPTkZJR19FUVVBTElaRVIgaXMgbm90IHNldAorIyBDT05GSUdfVFVOIGlzIG5vdCBzZXQKKworIworIyBBUkNuZXQgZGV2aWNlcworIworIyBDT05GSUdfQVJDTkVUIGlzIG5vdCBzZXQKKworIworIyBQSFkgZGV2aWNlIHN1cHBvcnQKKyMKK0NPTkZJR19QSFlMSUI9eQorCisjCisjIE1JSSBQSFkgZGV2aWNlIGRyaXZlcnMKKyMKKyMgQ09ORklHX01BUlZFTExfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RBVklDT01fUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FTRU1JX1BIWSBpcyBub3Qgc2V0CisjIENPTkZJR19MWFRfUEhZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJQ0FEQV9QSFkgaXMgbm90IHNldAorQ09ORklHX1ZJVEVTU0VfUEhZPXkKKworIworIyBFdGhlcm5ldCAoMTAgb3IgMTAwTWJpdCkKKyMKK0NPTkZJR19ORVRfRVRIRVJORVQ9eQorQ09ORklHX01JST15CisjIENPTkZJR19IQVBQWU1FQUwgaXMgbm90IHNldAorIyBDT05GSUdfU1VOR0VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NBU1NJTkkgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NIGlzIG5vdCBzZXQKKworIworIyBUdWxpcCBmYW1pbHkgbmV0d29yayBkZXZpY2Ugc3VwcG9ydAorIworIyBDT05GSUdfTkVUX1RVTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hQMTAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9QQ0kgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwIE1iaXQpCisjCisjIENPTkZJR19BQ0VOSUMgaXMgbm90IHNldAorIyBDT05GSUdfREwySyBpcyBub3Qgc2V0CisjIENPTkZJR19FMTAwMCBpcyBub3Qgc2V0CisjIENPTkZJR19OUzgzODIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTUFDSEkgaXMgbm90IHNldAorIyBDT05GSUdfWUVMTE9XRklOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1I4MTY5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NJUzE5MCBpcyBub3Qgc2V0CisjIENPTkZJR19TS0dFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NLWTIgaXMgbm90IHNldAorIyBDT05GSUdfU0s5OExJTiBpcyBub3Qgc2V0CisjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAorIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CitDT05GSUdfR0lBTkZBUj15CisjIENPTkZJR19HRkFSX05BUEkgaXMgbm90IHNldAorCisjCisjIEV0aGVybmV0ICgxMDAwMCBNYml0KQorIworIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19JWEdCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1MySU8gaXMgbm90IHNldAorCisjCisjIFRva2VuIFJpbmcgZGV2aWNlcworIworIyBDT05GSUdfVFIgaXMgbm90IHNldAorCisjCisjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQorIworIyBDT05GSUdfTkVUX1JBRElPIGlzIG5vdCBzZXQKKworIworIyBXYW4gaW50ZXJmYWNlcworIworIyBDT05GSUdfV0FOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZEREkgaXMgbm90IHNldAorIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAorIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfU0hBUEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfTkVUUE9MTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSIGlzIG5vdCBzZXQKKworIworIyBJU0ROIHN1YnN5c3RlbQorIworIyBDT05GSUdfSVNETiBpcyBub3Qgc2V0CisKKyMKKyMgVGVsZXBob255IFN1cHBvcnQKKyMKKyMgQ09ORklHX1BIT05FIGlzIG5vdCBzZXQKKworIworIyBJbnB1dCBkZXZpY2Ugc3VwcG9ydAorIworQ09ORklHX0lOUFVUPXkKKworIworIyBVc2VybGFuZCBpbnRlcmZhY2VzCisjCisjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfVFNERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZERVYgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVRfRVZCVUcgaXMgbm90IHNldAorCisjCisjIElucHV0IERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19JTlBVVF9LRVlCT0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NT1VTRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9KT1lTVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVF9NSVNDIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBJL08gcG9ydHMKKyMKK0NPTkZJR19TRVJJTz15CitDT05GSUdfU0VSSU9fSTgwNDI9eQorQ09ORklHX1NFUklPX1NFUlBPUlQ9eQorIyBDT05GSUdfU0VSSU9fUENJUFMyIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJT19MSUJQUzI9eQorIyBDT05GSUdfU0VSSU9fUkFXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dBTUVQT1JUIGlzIG5vdCBzZXQKKworIworIyBDaGFyYWN0ZXIgZGV2aWNlcworIworQ09ORklHX1ZUPXkKK0NPTkZJR19WVF9DT05TT0xFPXkKK0NPTkZJR19IV19DT05TT0xFPXkKKyMgQ09ORklHX1NFUklBTF9OT05TVEFOREFSRCBpcyBub3Qgc2V0CisKKyMKKyMgU2VyaWFsIGRyaXZlcnMKKyMKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfUENJPXkKK0NPTkZJR19TRVJJQUxfODI1MF9OUl9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfUlVOVElNRV9VQVJUUz0yCitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX01BTllfUE9SVFM9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfREVURUNUX0lSUT15CitDT05GSUdfU0VSSUFMXzgyNTBfUlNBPXkKKworIworIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CisjCitDT05GSUdfU0VSSUFMX0NPUkU9eQorQ09ORklHX1NFUklBTF9DT1JFX0NPTlNPTEU9eQorIyBDT05GSUdfU0VSSUFMX0pTTSBpcyBub3Qgc2V0CitDT05GSUdfVU5JWDk4X1BUWVM9eQorIyBDT05GSUdfTEVHQUNZX1BUWVMgaXMgbm90IHNldAorCisjCisjIElQTUkKKyMKKyMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CisKKyMKKyMgV2F0Y2hkb2cgQ2FyZHMKKyMKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX05WUkFNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAorIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CisjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CisjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0CisKKyMKKyMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCisjCisjIENPTkZJR19BR1AgaXMgbm90IHNldAorIyBDT05GSUdfRFJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JBV19EUklWRVIgaXMgbm90IHNldAorCisjCisjIFRQTSBkZXZpY2VzCisjCisjIENPTkZJR19UQ0dfVFBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFTENMT0NLIGlzIG5vdCBzZXQKKworIworIyBJMkMgc3VwcG9ydAorIworQ09ORklHX0kyQz15CisjIENPTkZJR19JMkNfQ0hBUkRFViBpcyBub3Qgc2V0CisKKyMKKyMgSTJDIEFsZ29yaXRobXMKKyMKKyMgQ09ORklHX0kyQ19BTEdPQklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEdPUENBIGlzIG5vdCBzZXQKKworIworIyBJMkMgSGFyZHdhcmUgQnVzIHN1cHBvcnQKKyMKKyMgQ09ORklHX0kyQ19BTEkxNTM1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNTYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTEkxNVgzIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19BTUQ3NTYgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0FNRDgxMTEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MDEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0k4MTAgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1BJSVg0IGlzIG5vdCBzZXQKK0NPTkZJR19JMkNfTVBDPXkKKyMgQ09ORklHX0kyQ19ORk9SQ0UyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzU1OTUgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1NJUzYzMCBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfU0lTOTZYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19WSUEgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX1ZJQVBSTyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfVk9PRE9PMyBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfUENBX0lTQSBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBJMkMgQ2hpcCBzdXBwb3J0CisjCisjIENPTkZJR19TRU5TT1JTX0RTMTMzNyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0RTMTM3NCBpcyBub3Qgc2V0CitDT05GSUdfU0VOU09SU19FRVBST009eQorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfUENBOTUzOSBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDRjg1OTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NNDFUMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19NQVg2ODc1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19BTEdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0kyQ19ERUJVR19CVVMgaXMgbm90IHNldAorIyBDT05GSUdfSTJDX0RFQlVHX0NISVAgaXMgbm90IHNldAorCisjCisjIFNQSSBzdXBwb3J0CisjCisjIENPTkZJR19TUEkgaXMgbm90IHNldAorIyBDT05GSUdfU1BJX01BU1RFUiBpcyBub3Qgc2V0CisKKyMKKyMgRGFsbGFzJ3MgMS13aXJlIGJ1cworIworIyBDT05GSUdfVzEgaXMgbm90IHNldAorCisjCisjIEhhcmR3YXJlIE1vbml0b3Jpbmcgc3VwcG9ydAorIworIyBDT05GSUdfSFdNT04gaXMgbm90IHNldAorIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKworIworIyBNaXNjIGRldmljZXMKKyMKKworIworIyBNdWx0aW1lZGlhIGRldmljZXMKKyMKKyMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CisKKyMKKyMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcworIworIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKworIworIyBHcmFwaGljcyBzdXBwb3J0CisjCisjIENPTkZJR19GQiBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBkaXNwbGF5IGRyaXZlciBzdXBwb3J0CisjCitDT05GSUdfVkdBX0NPTlNPTEU9eQorIyBDT05GSUdfVkdBQ09OX1NPRlRfU0NST0xMQkFDSyBpcyBub3Qgc2V0CitDT05GSUdfRFVNTVlfQ09OU09MRT15CisKKyMKKyMgU291bmQKKyMKKyMgQ09ORklHX1NPVU5EIGlzIG5vdCBzZXQKKworIworIyBVU0Igc3VwcG9ydAorIworQ09ORklHX1VTQl9BUkNIX0hBU19IQ0Q9eQorQ09ORklHX1VTQl9BUkNIX0hBU19PSENJPXkKK0NPTkZJR19VU0JfQVJDSF9IQVNfRUhDST15CisjIENPTkZJR19VU0IgaXMgbm90IHNldAorCisjCisjIE5PVEU6IFVTQl9TVE9SQUdFIGVuYWJsZXMgU0NTSSwgYW5kICdTQ1NJIGRpc2sgc3VwcG9ydCcKKyMKKworIworIyBVU0IgR2FkZ2V0IFN1cHBvcnQKKyMKKyMgQ09ORklHX1VTQl9HQURHRVQgaXMgbm90IHNldAorCisjCisjIE1NQy9TRCBDYXJkIHN1cHBvcnQKKyMKKyMgQ09ORklHX01NQyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRldmljZXMKKyMKKyMgQ09ORklHX05FV19MRURTIGlzIG5vdCBzZXQKKworIworIyBMRUQgZHJpdmVycworIworCisjCisjIExFRCBUcmlnZ2VycworIworCisjCisjIEluZmluaUJhbmQgc3VwcG9ydAorIworIyBDT05GSUdfSU5GSU5JQkFORCBpcyBub3Qgc2V0CisKKyMKKyMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCisjCisKKyMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCisjIEZpbGUgc3lzdGVtcworIworQ09ORklHX0VYVDJfRlM9eQorIyBDT05GSUdfRVhUMl9GU19YQVRUUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQyX0ZTX1hJUCBpcyBub3Qgc2V0CitDT05GSUdfRVhUM19GUz15CitDT05GSUdfRVhUM19GU19YQVRUUj15CisjIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZIGlzIG5vdCBzZXQKK0NPTkZJR19KQkQ9eQorIyBDT05GSUdfSkJEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19GU19NQkNBQ0hFPXkKKyMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01JTklYX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOT1RJRlkgaXMgbm90IHNldAorIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAorIyBDT05GSUdfRE5PVElGWSBpcyBub3Qgc2V0CisjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTNF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFX0ZTIGlzIG5vdCBzZXQKKworIworIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCisjCisjIENPTkZJR19JU085NjYwX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VERl9GUyBpcyBub3Qgc2V0CisKKyMKKyMgRE9TL0ZBVC9OVCBGaWxlc3lzdGVtcworIworIyBDT05GSUdfTVNET1NfRlMgaXMgbm90IHNldAorIyBDT05GSUdfVkZBVF9GUyBpcyBub3Qgc2V0CisjIENPTkZJR19OVEZTX0ZTIGlzIG5vdCBzZXQKKworIworIyBQc2V1ZG8gZmlsZXN5c3RlbXMKKyMKK0NPTkZJR19QUk9DX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19TWVNGUz15CitDT05GSUdfVE1QRlM9eQorIyBDT05GSUdfSFVHRVRMQl9QQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19SQU1GUz15CisjIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcworIworIyBDT05GSUdfQURGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19BRkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRlNQTFVTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JFRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQkZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfVlhGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IUEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1FOWDRGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNWX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VGU19GUyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29yayBGaWxlIFN5c3RlbXMKKyMKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CisjIENPTkZJR19ORlNfVjNfQUNMIGlzIG5vdCBzZXQKKyMgQ09ORklHX05GU19WNCBpcyBub3Qgc2V0CisjIENPTkZJR19ORlNfRElSRUNUSU8gaXMgbm90IHNldAorQ09ORklHX05GU0Q9eQorIyBDT05GSUdfTkZTRF9WMyBpcyBub3Qgc2V0CitDT05GSUdfTkZTRF9UQ1A9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19MT0NLRD15CitDT05GSUdfTE9DS0RfVjQ9eQorQ09ORklHX0VYUE9SVEZTPXkKK0NPTkZJR19ORlNfQ09NTU9OPXkKK0NPTkZJR19TVU5SUEM9eQorIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1JQQ1NFQ19HU1NfU1BLTTMgaXMgbm90IHNldAorIyBDT05GSUdfU01CX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NJRlMgaXMgbm90IHNldAorIyBDT05GSUdfTkNQX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NPREFfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHXzlQX0ZTIGlzIG5vdCBzZXQKKworIworIyBQYXJ0aXRpb24gVHlwZXMKKyMKK0NPTkZJR19QQVJUSVRJT05fQURWQU5DRUQ9eQorIyBDT05GSUdfQUNPUk5fUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX09TRl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfQU1JR0FfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUQVJJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19NQUNfUEFSVElUSU9OIGlzIG5vdCBzZXQKK0NPTkZJR19NU0RPU19QQVJUSVRJT049eQorIyBDT05GSUdfQlNEX0RJU0tMQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfTERNX1BBUlRJVElPTj15CisjIENPTkZJR19MRE1fREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0dJX1BBUlRJVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19VTFRSSVhfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVTl9QQVJUSVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfS0FSTUFfUEFSVElUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGSV9QQVJUSVRJT04gaXMgbm90IHNldAorCisjCisjIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisjCitDT05GSUdfTkxTPXkKK0NPTkZJR19OTFNfREVGQVVMVD0iaXNvODg1OS0xIgorIyBDT05GSUdfTkxTX0NPREVQQUdFXzQzNyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfNzM3IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV83NzUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1MCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODUyIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NTUgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg1NyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2MiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODYzIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzg2NSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV84NjkgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzkzNiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfOTUwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19DT0RFUEFHRV85MzIgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzk0OSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfQ09ERVBBR0VfODc0IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzggaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTAgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0FTQ0lJIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzEgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfMiBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8zIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzQgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV82IGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19JU084ODU5XzcgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX0lTTzg4NTlfOSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xMyBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNCBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfSVNPODg1OV8xNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTFNfS09JOF9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX05MU19LT0k4X1UgaXMgbm90IHNldAorIyBDT05GSUdfTkxTX1VURjggaXMgbm90IHNldAorCisjCisjIExpYnJhcnkgcm91dGluZXMKKyMKKyMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CisjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CitDT05GSUdfQ1JDMzI9eQorIyBDT05GSUdfTElCQ1JDMzJDIGlzIG5vdCBzZXQKKworIworIyBJbnN0cnVtZW50YXRpb24gU3VwcG9ydAorIworIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKKworIworIyBLZXJuZWwgaGFja2luZworIworIyBDT05GSUdfUFJJTlRLX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAorQ09ORklHX0RFQlVHX0tFUk5FTD15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0RFVEVDVF9TT0ZUTE9DS1VQPXkKKyMgQ09ORklHX1NDSEVEU1RBVFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0hJR0hNRU0gaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfSU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19WTSBpcyBub3Qgc2V0CisjIENPTkZJR19VTldJTkRfSU5GTyBpcyBub3Qgc2V0CitDT05GSUdfRk9SQ0VEX0lOTElOSU5HPXkKKyMgQ09ORklHX1JDVV9UT1JUVVJFX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdHRVIgaXMgbm90IHNldAorIyBDT05GSUdfQkRJX1NXSVRDSCBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBUyBpcyBub3Qgc2V0CisjIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorCisjCisjIFNlY3VyaXR5IG9wdGlvbnMKKyMKKyMgQ09ORklHX0tFWVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VDVVJJVFkgaXMgbm90IHNldAorCisjCisjIENyeXB0b2dyYXBoaWMgb3B0aW9ucworIworIyBDT05GSUdfQ1JZUFRPIGlzIG5vdCBzZXQKKworIworIyBIYXJkd2FyZSBjcnlwdG8gZGV2aWNlcworIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcG1hYzMyX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BtYWMzMl9kZWZjb25maWcKaW5kZXggNTdhMDI3OS4uYWRkYzc5MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcG1hYzMyX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wbWFjMzJfZGVmY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE2LXJjNgotIyBXZWQgTWFyIDE1IDE2OjIxOjMyIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNy1yYzUKKyMgTW9uIE1heSAyOSAxNDo0Nzo0OSAyMDA2CiAjCiAjIENPTkZJR19QUEM2NCBpcyBub3Qgc2V0CiBDT05GSUdfUFBDMzI9eQpAQCAtOSw2ICs5LDcgQEAKIENPTkZJR19NTVU9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQogQ09ORklHX1JXU0VNX1hDSEdBRERfQUxHT1JJVEhNPXkKK0NPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKIENPTkZJR19QUEM9eQogQ09ORklHX0VBUkxZX1BSSU5USz15CkBAIC0yNywxMSArMjgsMTEgQEAKICMgQ09ORklHX1BQQ181Mnh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184Mnh4IGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ184M3h4IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BQQ184NXh4IGlzIG5vdCBzZXQKICMgQ09ORklHXzQweCBpcyBub3Qgc2V0CiAjIENPTkZJR180NHggaXMgbm90IHNldAogIyBDT05GSUdfOHh4IGlzIG5vdCBzZXQKICMgQ09ORklHX0UyMDAgaXMgbm90IHNldAotIyBDT05GSUdfRTUwMCBpcyBub3Qgc2V0CiBDT05GSUdfNnh4PXkKIENPTkZJR19QUENfRlBVPXkKIENPTkZJR19BTFRJVkVDPXkKQEAgLTU5LDYgKzYwLDcgQEAKICMgQ09ORklHX0FVRElUIGlzIG5vdCBzZXQKIENPTkZJR19JS0NPTkZJRz15CiBDT05GSUdfSUtDT05GSUdfUFJPQz15CisjIENPTkZJR19SRUxBWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5JVFJBTUZTX1NPVVJDRT0iIgogIyBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldApAQCAtNzMsMTAgKzc1LDYgQEAKIENPTkZJR19GVVRFWD15CiBDT05GSUdfRVBPTEw9eQogQ09ORklHX1NITUVNPXkKLUNPTkZJR19DQ19BTElHTl9GVU5DVElPTlM9MAotQ09ORklHX0NDX0FMSUdOX0xBQkVMUz0wCi1DT05GSUdfQ0NfQUxJR05fTE9PUFM9MAotQ09ORklHX0NDX0FMSUdOX0pVTVBTPTAKIENPTkZJR19TTEFCPXkKICMgQ09ORklHX1RJTllfU0hNRU0gaXMgbm90IHNldAogQ09ORklHX0JBU0VfU01BTEw9MApAQCAtODgsNyArODYsNiBAQAogQ09ORklHX01PRFVMRVM9eQogQ09ORklHX01PRFVMRV9VTkxPQUQ9eQogQ09ORklHX01PRFVMRV9GT1JDRV9VTkxPQUQ9eQotQ09ORklHX09CU09MRVRFX01PRFBBUk09eQogIyBDT05GSUdfTU9EVkVSU0lPTlMgaXMgbm90IHNldAogIyBDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMIGlzIG5vdCBzZXQKIENPTkZJR19LTU9EPXkKQEAgLTk3LDYgKzk0LDggQEAKICMgQmxvY2sgbGF5ZXIKICMKIENPTkZJR19MQkQ9eQorIyBDT05GSUdfQkxLX0RFVl9JT19UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfTFNGPXkKIAogIwogIyBJTyBTY2hlZHVsZXJzCkBAIC0xMjQsNiArMTIzLDcgQEAKICMgQ09ORklHX1BQQ19SVEFTIGlzIG5vdCBzZXQKICMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAogQ09ORklHX1BQQ19NUEMxMDY9eQorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAogQ09ORklHX0NQVV9GUkVRPXkKIENPTkZJR19DUFVfRlJFUV9UQUJMRT15CiAjIENPTkZJR19DUFVfRlJFUV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xODIsNyArMTgyLDYgQEAKIENPTkZJR19QUENfSU5ESVJFQ1RfUENJPXkKIENPTkZJR19QQ0k9eQogQ09ORklHX1BDSV9ET01BSU5TPXkKLUNPTkZJR19QQ0lfTEVHQUNZX1BST0M9eQogIyBDT05GSUdfUENJX0RFQlVHIGlzIG5vdCBzZXQKIAogIwpAQCAtMjM5LDcgKzIzOCw5IEBACiBDT05GSUdfUEFDS0VUPXkKICMgQ09ORklHX1BBQ0tFVF9NTUFQIGlzIG5vdCBzZXQKIENPTkZJR19VTklYPXkKLSMgQ09ORklHX05FVF9LRVkgaXMgbm90IHNldAorQ09ORklHX1hGUk09eQorQ09ORklHX1hGUk1fVVNFUj15CitDT05GSUdfTkVUX0tFWT15CiBDT05GSUdfSU5FVD15CiBDT05GSUdfSVBfTVVMVElDQVNUPXkKICMgQ09ORklHX0lQX0FEVkFOQ0VEX1JPVVRFUiBpcyBub3Qgc2V0CkBAIC0yNTAsOSArMjUxLDEwIEBACiAjIENPTkZJR19JUF9NUk9VVEUgaXMgbm90IHNldAogIyBDT05GSUdfQVJQRCBpcyBub3Qgc2V0CiBDT05GSUdfU1lOX0NPT0tJRVM9eQotIyBDT05GSUdfSU5FVF9BSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19JTkVUX0VTUCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVF9BSD15CitDT05GSUdfSU5FVF9FU1A9eQogIyBDT05GSUdfSU5FVF9JUENPTVAgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVF9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKQEAgLTI2NCw2ICsyNjYsOCBAQAogIwogIyBDT05GSUdfSVBfVlMgaXMgbm90IHNldAogIyBDT05GSUdfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9YRlJNX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUNl9UVU5ORUwgaXMgbm90IHNldAogQ09ORklHX05FVEZJTFRFUj15CiAjIENPTkZJR19ORVRGSUxURVJfREVCVUcgaXMgbm90IHNldAogCkBAIC0yNzgsMTIgKzI4MiwxNSBAQAogQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTk9UUkFDSz1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0NPTU1FTlQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQotIyBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1AgaXMgbm90IHNldAorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRVNQPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTEVOR1RIPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTElNSVQ9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUM9bQogQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUE9MSUNZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTVVMVElQT1JUPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfUEtUVFlQRT1tCiBDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQUxNPW0KIENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfU0NUUD1tCkBAIC0zMDUsMTUgKzMxMiwxNSBAQAogQ09ORklHX0lQX05GX1RGVFA9bQogQ09ORklHX0lQX05GX0FNQU5EQT1tCiBDT05GSUdfSVBfTkZfUFBUUD1tCitDT05GSUdfSVBfTkZfSDMyMz1tCiAjIENPTkZJR19JUF9ORl9RVUVVRSBpcyBub3Qgc2V0CiBDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQogQ09ORklHX0lQX05GX01BVENIX0lQUkFOR0U9bQotQ09ORklHX0lQX05GX01BVENIX01VTFRJUE9SVD1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfVE9TPW0KIENPTkZJR19JUF9ORl9NQVRDSF9SRUNFTlQ9bQogQ09ORklHX0lQX05GX01BVENIX0VDTj1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfRFNDUD1tCi1DT05GSUdfSVBfTkZfTUFUQ0hfQUhfRVNQPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9BSD1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfVFRMPW0KIENPTkZJR19JUF9ORl9NQVRDSF9PV05FUj1tCiBDT05GSUdfSVBfTkZfTUFUQ0hfQUREUlRZUEU9bQpAQCAtMzM1LDYgKzM0Miw3IEBACiBDT05GSUdfSVBfTkZfTkFUX1RGVFA9bQogQ09ORklHX0lQX05GX05BVF9BTUFOREE9bQogQ09ORklHX0lQX05GX05BVF9QUFRQPW0KK0NPTkZJR19JUF9ORl9OQVRfSDMyMz1tCiBDT05GSUdfSVBfTkZfTUFOR0xFPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfVE9TPW0KIENPTkZJR19JUF9ORl9UQVJHRVRfRUNOPW0KQEAgLTM1MCwxMCArMzU4LDEyIEBACiAjCiBDT05GSUdfSVBfRENDUD1tCiBDT05GSUdfSU5FVF9EQ0NQX0RJQUc9bQorQ09ORklHX0lQX0RDQ1BfQUNLVkVDPXkKIAogIwogIyBEQ0NQIENDSURzIENvbmZpZ3VyYXRpb24gKEVYUEVSSU1FTlRBTCkKICMKK0NPTkZJR19JUF9EQ0NQX0NDSUQyPW0KIENPTkZJR19JUF9EQ0NQX0NDSUQzPW0KIENPTkZJR19JUF9EQ0NQX1RGUkNfTElCPW0KIApAQCAtMzYxLDcgKzM3MSw2IEBACiAjIERDQ1AgS2VybmVsIEhhY2tpbmcKICMKICMgQ09ORklHX0lQX0RDQ1BfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfSVBfRENDUF9VTkxPQURfSEFDSyBpcyBub3Qgc2V0CiAKICMKICMgU0NUUCBDb25maWd1cmF0aW9uIChFWFBFUklNRU5UQUwpCkBAIC00NzcsNiArNDg2LDggQEAKIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfV0VQPW0KIENPTkZJR19JRUVFODAyMTFfQ1JZUFRfQ0NNUD1tCiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVA9bQorIyBDT05GSUdfSUVFRTgwMjExX1NPRlRNQUMgaXMgbm90IHNldAorQ09ORklHX1dJUkVMRVNTX0VYVD15CiAKICMKICMgRGV2aWNlIERyaXZlcnMKQEAgLTY2Miw5ICs2NzMsOCBAQAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0xNgogQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9TWU01M0M4WFhfTU1JTz15CiAjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ1NJX1FMT0dJQ19GQyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CkBAIC02OTQsMTYgKzcwNCwxNyBAQAogQ09ORklHX01EX0xJTkVBUj1tCiBDT05GSUdfTURfUkFJRDA9bQogQ09ORklHX01EX1JBSUQxPW0KLSMgQ09ORklHX01EX1JBSUQxMCBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDEwPW0KIENPTkZJR19NRF9SQUlENT1tCitDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15CiBDT05GSUdfTURfUkFJRDY9bQogQ09ORklHX01EX01VTFRJUEFUSD1tCiBDT05GSUdfTURfRkFVTFRZPW0KIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ETV9DUllQVD1tCi0jIENPTkZJR19ETV9TTkFQU0hPVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19ETV9NSVJST1IgaXMgbm90IHNldAotIyBDT05GSUdfRE1fWkVSTyBpcyBub3Qgc2V0CitDT05GSUdfRE1fU05BUFNIT1Q9bQorQ09ORklHX0RNX01JUlJPUj1tCitDT05GSUdfRE1fWkVSTz1tCiAjIENPTkZJR19ETV9NVUxUSVBBVEggaXMgbm90IHNldAogCiAjCkBAIC03NDAsNyArNzUxLDcgQEAKIENPTkZJR19JRUVFMTM5NF9WSURFTzEzOTQ9bQogQ09ORklHX0lFRUUxMzk0X1NCUDI9bQogIyBDT05GSUdfSUVFRTEzOTRfU0JQMl9QSFlTX0RNQSBpcyBub3Qgc2V0Ci1DT05GSUdfSUVFRTEzOTRfRVRIMTM5ND1tCisjIENPTkZJR19JRUVFMTM5NF9FVEgxMzk0IGlzIG5vdCBzZXQKIENPTkZJR19JRUVFMTM5NF9EVjEzOTQ9bQogQ09ORklHX0lFRUUxMzk0X1JBV0lPPW0KIApAQCAtNzY5LDEwICs3ODAsMTAgQEAKICMgTmV0d29yayBkZXZpY2Ugc3VwcG9ydAogIwogQ09ORklHX05FVERFVklDRVM9eQotIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAorQ09ORklHX0RVTU1ZPW0KICMgQ09ORklHX0JPTkRJTkcgaXMgbm90IHNldAogIyBDT05GSUdfRVFVQUxJWkVSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1RVTiBpcyBub3Qgc2V0CitDT05GSUdfVFVOPW0KIAogIwogIyBBUkNuZXQgZGV2aWNlcwpAQCAtODU3LDYgKzg2OCw3IEBACiAjIFdpcmVsZXNzIExBTiAobm9uLWhhbXJhZGlvKQogIwogQ09ORklHX05FVF9SQURJTz15CisjIENPTkZJR19ORVRfV0lSRUxFU1NfUlRORVRMSU5LIGlzIG5vdCBzZXQKIAogIwogIyBPYnNvbGV0ZSBXaXJlbGVzcyBjYXJkcyBzdXBwb3J0IChwcmUtODAyLjExKQpAQCAtOTkyLDYgKzEwMDQsNyBAQAogIyBTZXJpYWwgZHJpdmVycwogIwogQ09ORklHX1NFUklBTF84MjUwPW0KK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9bQogIyBDT05GSUdfU0VSSUFMXzgyNTBfQ1MgaXMgbm90IHNldAogQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKIENPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKQEAgLTEwMjcsNiArMTA0MCw3IEBACiAjIEZ0YXBlLCB0aGUgZmxvcHB5IHRhcGUgZGV2aWNlIGRyaXZlcgogIwogQ09ORklHX0FHUD1tCisjIENPTkZJR19BR1BfVklBIGlzIG5vdCBzZXQKIENPTkZJR19BR1BfVU5JTk9SVEg9bQogQ09ORklHX0RSTT1tCiAjIENPTkZJR19EUk1fVERGWCBpcyBub3Qgc2V0CkBAIC0xMDgxLDcgKzEwOTUsNiBAQAogIyBDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1BST1NBVkFHRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfU0FWQUdFNCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TQ3gyMDBfQUNCIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19TSVM2MzAgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NJUzk2WCBpcyBub3Qgc2V0CkBAIC0xMTAwLDEwICsxMTEzLDggQEAKICMgQ09ORklHX1NFTlNPUlNfUENGODU3NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDQTk1MzkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUlRDODU2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX000MVQwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAotIyBDT05GSUdfUlRDX1gxMjA1X0kyQyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQ09SRSBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQUxHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfREVCVUdfQlVTIGlzIG5vdCBzZXQKQEAgLTExMzEsMTggKzExNDIsMTYgQEAKICMKIAogIwotIyBNdWx0aW1lZGlhIENhcGFiaWxpdGllcyBQb3J0IGRyaXZlcnMKLSMKLQotIwogIyBNdWx0aW1lZGlhIGRldmljZXMKICMKICMgQ09ORklHX1ZJREVPX0RFViBpcyBub3Qgc2V0CitDT05GSUdfVklERU9fVjRMMj15CiAKICMKICMgRGlnaXRhbCBWaWRlbyBCcm9hZGNhc3RpbmcgRGV2aWNlcwogIwogIyBDT05GSUdfRFZCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAogCiAjCiAjIEdyYXBoaWNzIHN1cHBvcnQKQEAgLTExNTIsNiArMTE2MSw3IEBACiBDT05GSUdfRkJfQ0ZCX0NPUFlBUkVBPXkKIENPTkZJR19GQl9DRkJfSU1BR0VCTElUPXkKIENPTkZJR19GQl9NQUNNT0RFUz15CitDT05GSUdfRkJfRklSTVdBUkVfRURJRD15CiBDT05GSUdfRkJfTU9ERV9IRUxQRVJTPXkKIENPTkZJR19GQl9USUxFQkxJVFRJTkc9eQogIyBDT05GSUdfRkJfQ0lSUlVTIGlzIG5vdCBzZXQKQEAgLTExNzUsNyArMTE4NSw2IEBACiAjIENPTkZJR19GQl9NQVRST1hfRyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NQVRST1hfSTJDIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01BVFJPWF9NVUxUSUhFQUQgaXMgbm90IHNldAotIyBDT05GSUdfRkJfUkFERU9OX09MRCBpcyBub3Qgc2V0CiBDT05GSUdfRkJfUkFERU9OPXkKIENPTkZJR19GQl9SQURFT05fSTJDPXkKICMgQ09ORklHX0ZCX1JBREVPTl9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xMjM0LDkgKzEyNDMsMTEgQEAKIENPTkZJR19TTkRfT1NTRU1VTD15CiBDT05GSUdfU05EX01JWEVSX09TUz1tCiBDT05GSUdfU05EX1BDTV9PU1M9bQorQ09ORklHX1NORF9QQ01fT1NTX1BMVUdJTlM9eQogQ09ORklHX1NORF9TRVFVRU5DRVJfT1NTPXkKICMgQ09ORklHX1NORF9EWU5BTUlDX01JTk9SUyBpcyBub3Qgc2V0CiBDT05GSUdfU05EX1NVUFBPUlRfT0xEX0FQST15CitDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTPXkKICMgQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfREVCVUcgaXMgbm90IHNldAogCkBAIC0xMjUzLDYgKzEyNjQsNyBAQAogIyBQQ0kgZGV2aWNlcwogIwogIyBDT05GSUdfU05EX0FEMTg4OSBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfQUxTMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9BTFM0MDAwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9BTEk1NDUxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9BVElJWFAgaXMgbm90IHNldApAQCAtMTI4NSw2ICsxMjk3LDcgQEAKICMgQ09ORklHX1NORF9NSVhBUlQgaXMgbm90IHNldAogIyBDT05GSUdfU05EX05NMjU2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9QQ1hIUiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfUklQVElERSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfUk1FMzIgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2IGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9STUU5NjUyIGlzIG5vdCBzZXQKQEAgLTEzMTAsNiArMTMyMyw4IEBACiAjCiAjIFBDTUNJQSBkZXZpY2VzCiAjCisjIENPTkZJR19TTkRfVlhQT0NLRVQgaXMgbm90IHNldAorIyBDT05GSUdfU05EX1BEQVVESU9DRiBpcyBub3Qgc2V0CiAKICMKICMgT3BlbiBTb3VuZCBTeXN0ZW0KQEAgLTEzMjEsNiArMTMzNiw3IEBACiAjCiBDT05GSUdfVVNCX0FSQ0hfSEFTX0hDRD15CiBDT05GSUdfVVNCX0FSQ0hfSEFTX09IQ0k9eQorQ09ORklHX1VTQl9BUkNIX0hBU19FSENJPXkKIENPTkZJR19VU0I9eQogIyBDT05GSUdfVVNCX0RFQlVHIGlzIG5vdCBzZXQKIApAQCAtMTMzNiw3ICsxMzUyLDkgQEAKICMKICMgVVNCIEhvc3QgQ29udHJvbGxlciBEcml2ZXJzCiAjCi0jIENPTkZJR19VU0JfRUhDSV9IQ0QgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX0hDRD1tCitDT05GSUdfVVNCX0VIQ0lfU1BMSVRfSVNPPXkKK0NPTkZJR19VU0JfRUhDSV9ST09UX0hVQl9UVD15CiAjIENPTkZJR19VU0JfSVNQMTE2WF9IQ0QgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD15CiAjIENPTkZJR19VU0JfT0hDSV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKQEAgLTEzNDcsNyArMTM2NSw2IEBACiAjCiAjIFVTQiBEZXZpY2UgQ2xhc3MgZHJpdmVycwogIwotIyBDT05GSUdfT0JTT0xFVEVfT1NTX1VTQl9EUklWRVIgaXMgbm90IHNldAogQ09ORklHX1VTQl9BQ009bQogQ09ORklHX1VTQl9QUklOVEVSPW0KIApAQCAtMTM1OCw3ICsxMzc1LDE3IEBACiAjCiAjIG1heSBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KICMKLSMgQ09ORklHX1VTQl9TVE9SQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19VU0JfU1RPUkFHRT1tCisjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9EQVRBRkFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0ZSRUVDT00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfSVNEMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX0RQQ00gaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfVVNCQVQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NUT1JBR0VfU0REUjA5IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TVE9SQUdFX1NERFI1NSBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9KVU1QU0hPVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1RPUkFHRV9BTEFVREEgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xJQlVTVUFMIGlzIG5vdCBzZXQKIAogIwpAQCAtMTM3NCw5ICsxNDAxLDcgQEAKICMgQ09ORklHX1VTQl9BQ0VDQUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0tCVEFCIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QT1dFUk1BVEUgaXMgbm90IHNldAotIyBDT05GSUdfVVNCX01UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfSVRNVE9VQ0ggaXMgbm90IHNldAotIyBDT05GSUdfVVNCX0VHQUxBWCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfVE9VQ0hTQ1JFRU4gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1lFQUxJTksgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1hQQUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0FUSV9SRU1PVEUgaXMgbm90IHNldApAQCAtMTM5MSwxNSArMTQxNiw2IEBACiAjIENPTkZJR19VU0JfTUlDUk9URUsgaXMgbm90IHNldAogCiAjCi0jIFVTQiBNdWx0aW1lZGlhIGRldmljZXMKLSMKLSMgQ09ORklHX1VTQl9EQUJVU0IgaXMgbm90IHNldAotCi0jCi0jIFZpZGVvNExpbnV4IHN1cHBvcnQgaXMgbmVlZGVkIGZvciBVU0IgTXVsdGltZWRpYSBkZXZpY2Ugc3VwcG9ydAotIwotCi0jCiAjIFVTQiBOZXR3b3JrIEFkYXB0ZXJzCiAjCiAjIENPTkZJR19VU0JfQ0FUQyBpcyBub3Qgc2V0CkBAIC0xNDI5LDYgKzE0NDUsNyBAQAogIyBDT05GSUdfVVNCX1NFUklBTF9HRU5FUklDIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfQUlSUFJJTUUgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9BTllEQVRBIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TRVJJQUxfQVJLMzExNiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0JFTEtJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX1dISVRFSEVBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0RJR0lfQUNDRUxFUE9SVCBpcyBub3Qgc2V0CkBAIC0xNDM2LDYgKzE0NTMsNyBAQAogIyBDT05GSUdfVVNCX1NFUklBTF9DWVBSRVNTX004IGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9TRVJJQUxfRU1QRUcgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9GVERJX1NJTyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX0ZVTlNPRlQgaXMgbm90IHNldAogQ09ORklHX1VTQl9TRVJJQUxfVklTT1I9bQogQ09ORklHX1VTQl9TRVJJQUxfSVBBUT1tCiAjIENPTkZJR19VU0JfU0VSSUFMX0lSIGlzIG5vdCBzZXQKQEAgLTE0NjAsNiArMTQ3OCw3IEBACiAjIENPTkZJR19VU0JfU0VSSUFMX0tMU0kgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9LT0JJTF9TQ1QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9NQ1RfVTIzMiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU0VSSUFMX05BVk1BTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX1BMMjMwMyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0VSSUFMX0hQNFggaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1NFUklBTF9TQUZFIGlzIG5vdCBzZXQKQEAgLTE0ODQsNiArMTUwMyw3IEBACiAjIENPTkZJR19VU0JfUEhJREdFVEtJVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfUEhJREdFVFNFUlZPIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9JRE1PVVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9TSVNVU0JWR0EgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9URVNUIGlzIG5vdCBzZXQKIApAQCAtMTUwMiw2ICsxNTIyLDE5IEBACiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogCiAjCisjIExFRCBkZXZpY2VzCisjCisjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CisKKyMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIwogIyBJbmZpbmlCYW5kIHN1cHBvcnQKICMKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldApAQCAtMTUxMSw2ICsxNTQ0LDExIEBACiAjCiAKICMKKyMgUmVhbCBUaW1lIENsb2NrCisjCisjIENPTkZJR19SVENfQ0xBU1MgaXMgbm90IHNldAorCisjCiAjIEZpbGUgc3lzdGVtcwogIwogQ09ORklHX0VYVDJfRlM9eQpAQCAtMTUxOCwxNCArMTU1NiwxNCBAQAogIyBDT05GSUdfRVhUMl9GU19YSVAgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQogQ09ORklHX0VYVDNfRlNfWEFUVFI9eQotIyBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkgaXMgbm90IHNldAogQ09ORklHX0pCRD15CiAjIENPTkZJR19KQkRfREVCVUcgaXMgbm90IHNldAogQ09ORklHX0ZTX01CQ0FDSEU9eQogIyBDT05GSUdfUkVJU0VSRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfSkZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZTX1BPU0lYX0FDTCBpcyBub3Qgc2V0CitDT05GSUdfRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19NSU5JWF9GUyBpcyBub3Qgc2V0CkBAIC0xNTM0LDcgKzE1NzIsNyBAQAogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQogIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0FVVE9GUzRfRlMgaXMgbm90IHNldAorQ09ORklHX0FVVE9GUzRfRlM9bQogQ09ORklHX0ZVU0VfRlM9bQogCiAjCkBAIC0xNTY2LDcgKzE2MDQsNiBAQAogQ09ORklHX1RNUEZTPXkKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQotQ09ORklHX1JFTEFZRlNfRlM9bQogIyBDT05GSUdfQ09ORklHRlNfRlMgaXMgbm90IHNldAogCiAjCkBAIC0xNTkwLDE3ICsxNjI3LDI0IEBACiAjIE5ldHdvcmsgRmlsZSBTeXN0ZW1zCiAjCiBDT05GSUdfTkZTX0ZTPXkKLSMgQ09ORklHX05GU19WMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19ORlNfVjQgaXMgbm90IHNldAorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1YzX0FDTD15CitDT05GSUdfTkZTX1Y0PXkKICMgQ09ORklHX05GU19ESVJFQ1RJTyBpcyBub3Qgc2V0Ci1DT05GSUdfTkZTRD15Ci0jIENPTkZJR19ORlNEX1YzIGlzIG5vdCBzZXQKLSMgQ09ORklHX05GU0RfVENQIGlzIG5vdCBzZXQKK0NPTkZJR19ORlNEPW0KK0NPTkZJR19ORlNEX1YyX0FDTD15CitDT05GSUdfTkZTRF9WMz15CitDT05GSUdfTkZTRF9WM19BQ0w9eQorQ09ORklHX05GU0RfVjQ9eQorQ09ORklHX05GU0RfVENQPXkKIENPTkZJR19MT0NLRD15Ci1DT05GSUdfRVhQT1JURlM9eQorQ09ORklHX0xPQ0tEX1Y0PXkKK0NPTkZJR19FWFBPUlRGUz1tCitDT05GSUdfTkZTX0FDTF9TVVBQT1JUPXkKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQotIyBDT05GSUdfUlBDU0VDX0dTU19LUkI1IGlzIG5vdCBzZXQKK0NPTkZJR19TVU5SUENfR1NTPXkKK0NPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiBDT05GSUdfU01CX0ZTPW0KICMgQ09ORklHX1NNQl9OTFNfREVGQVVMVCBpcyBub3Qgc2V0CkBAIC0xNjgxLDcgKzE3MjUsNyBAQAogQ09ORklHX0NSQ19DQ0lUVD15CiBDT05GSUdfQ1JDMTY9eQogQ09ORklHX0NSQzMyPXkKLSMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CitDT05GSUdfTElCQ1JDMzJDPW0KIENPTkZJR19aTElCX0lORkxBVEU9eQogQ09ORklHX1pMSUJfREVGTEFURT15CiBDT05GSUdfVEVYVFNFQVJDSD15CkBAIC0xNzM1LDI5ICsxNzc5LDI5IEBACiAjIENyeXB0b2dyYXBoaWMgb3B0aW9ucwogIwogQ09ORklHX0NSWVBUTz15Ci0jIENPTkZJR19DUllQVE9fSE1BQyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fTUQ0IGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19NRDUgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTEgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1NIQTI1NiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fU0hBNTEyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19XUDUxMiBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fVEdSMTkyIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19ERVMgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0JMT1dGSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19UV09GSVNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX0NSWVBUT19TRVJQRU5UIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fSE1BQz15CitDT05GSUdfQ1JZUFRPX05VTEw9bQorQ09ORklHX0NSWVBUT19NRDQ9bQorQ09ORklHX0NSWVBUT19NRDU9eQorQ09ORklHX0NSWVBUT19TSEExPXkKK0NPTkZJR19DUllQVE9fU0hBMjU2PW0KK0NPTkZJR19DUllQVE9fU0hBNTEyPW0KK0NPTkZJR19DUllQVE9fV1A1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19ERVM9eQorQ09ORklHX0NSWVBUT19CTE9XRklTSD1tCitDT05GSUdfQ1JZUFRPX1RXT0ZJU0g9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KIENPTkZJR19DUllQVE9fQUVTPW0KLSMgQ09ORklHX0NSWVBUT19DQVNUNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fQ0FTVDYgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX1RFQSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0NBU1Q1PW0KK0NPTkZJR19DUllQVE9fQ0FTVDY9bQorQ09ORklHX0NSWVBUT19URUE9bQogQ09ORklHX0NSWVBUT19BUkM0PW0KLSMgQ09ORklHX0NSWVBUT19LSEFaQUQgaXMgbm90IHNldAotIyBDT05GSUdfQ1JZUFRPX0FOVUJJUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19DUllQVE9fREVGTEFURSBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCitDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCitDT05GSUdfQ1JZUFRPX0RFRkxBVEU9bQogQ09ORklHX0NSWVBUT19NSUNIQUVMX01JQz1tCi0jIENPTkZJR19DUllQVE9fQ1JDMzJDIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fQ1JDMzJDPW0KICMgQ09ORklHX0NSWVBUT19URVNUIGlzIG5vdCBzZXQKIAogIwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwppbmRleCA1OGU2OGNlLi4zMTcwOGFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xNy1yYzEKLSMgV2VkIEFwciAxOSAxMTo0ODowMCAyMDA2CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTctcmM0CisjIFN1biBNYXkgMjggMDc6MjY6NTYgMjAwNgogIwogQ09ORklHX1BQQzY0PXkKIENPTkZJR182NEJJVD15CkBAIC0xMSw2ICsxMSw3IEBACiBDT05GSUdfUldTRU1fWENIR0FERF9BTEdPUklUSE09eQogQ09ORklHX0dFTkVSSUNfSFdFSUdIVD15CiBDT05GSUdfR0VORVJJQ19DQUxJQlJBVEVfREVMQVk9eQorQ09ORklHX0dFTkVSSUNfRklORF9ORVhUX0JJVD15CiBDT05GSUdfUFBDPXkKIENPTkZJR19FQVJMWV9QUklOVEs9eQogQ09ORklHX0NPTVBBVD15CkBAIC0xMjYsOCArMTI3LDkgQEAKIENPTkZJR19SVEFTX0ZMQVNIPW0KICMgQ09ORklHX01NSU9fTlZSQU0gaXMgbm90IHNldAogQ09ORklHX0lCTVZJTz15Ci0jIENPTkZJR19JQk1FQlVTIGlzIG5vdCBzZXQKK0NPTkZJR19JQk1FQlVTPXkKICMgQ09ORklHX1BQQ19NUEMxMDYgaXMgbm90IHNldAorIyBDT05GSUdfUFBDXzk3MF9OQVAgaXMgbm90IHNldAogIyBDT05GSUdfQ1BVX0ZSRVEgaXMgbm90IHNldAogIyBDT05GSUdfV0FOVF9FQVJMWV9TRVJJQUwgaXMgbm90IHNldAogCkBAIC0xNDMsNyArMTQ1LDcgQEAKICMgQ09ORklHX1BSRUVNUFQgaXMgbm90IHNldAogIyBDT05GSUdfUFJFRU1QVF9CS0wgaXMgbm90IHNldAogQ09ORklHX0JJTkZNVF9FTEY9eQotIyBDT05GSUdfQklORk1UX01JU0MgaXMgbm90IHNldAorQ09ORklHX0JJTkZNVF9NSVNDPW0KIENPTkZJR19GT1JDRV9NQVhfWk9ORU9SREVSPTEzCiBDT05GSUdfSU9NTVVfVk1FUkdFPXkKIENPTkZJR19IT1RQTFVHX0NQVT15CkBAIC0xNTUsNiArMTU3LDcgQEAKIENPTkZJR19TQ0FOTE9HPW0KIENPTkZJR19MUEFSQ0ZHPXkKIENPTkZJR19OVU1BPXkKK0NPTkZJR19OT0RFU19TSElGVD00CiBDT05GSUdfQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19BUkNIX1NQQVJTRU1FTV9FTkFCTEU9eQogQ09ORklHX0FSQ0hfU1BBUlNFTUVNX0RFRkFVTFQ9eQpAQCAtNDY3LDcgKzQ3MCw3IEBACiBDT05GSUdfU0NTSV9TUElfQVRUUlM9eQogQ09ORklHX1NDU0lfRkNfQVRUUlM9eQogQ09ORklHX1NDU0lfSVNDU0lfQVRUUlM9bQotIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfU0FTX0FUVFJTPW0KIAogIwogIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCkBAIC00OTksMTMgKzUwMiwxOCBAQAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RNQV9BRERSRVNTSU5HX01PREU9MAogQ09ORklHX1NDU0lfU1lNNTNDOFhYX0RFRkFVTFRfVEFHUz0xNgogQ09ORklHX1NDU0lfU1lNNTNDOFhYX01BWF9UQUdTPTY0Ci0jIENPTkZJR19TQ1NJX1NZTTUzQzhYWF9JT01BUFBFRCBpcyBub3Qgc2V0CitDT05GSUdfU0NTSV9TWU01M0M4WFhfTU1JTz15CiBDT05GSUdfU0NTSV9JUFI9eQogQ09ORklHX1NDU0lfSVBSX1RSQUNFPXkKIENPTkZJR19TQ1NJX0lQUl9EVU1QPXkKLSMgQ09ORklHX1NDU0lfUUxPR0lDX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfUUxPR0lDXzEyODAgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSV9RTEFfRkMgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUUxBX0ZDPW0KK0NPTkZJR19TQ1NJX1FMQTJYWFhfRU1CRURERURfRklSTVdBUkU9eQorQ09ORklHX1NDU0lfUUxBMjFYWD1tCitDT05GSUdfU0NTSV9RTEEyMlhYPW0KK0NPTkZJR19TQ1NJX1FMQTIzMDA9bQorQ09ORklHX1NDU0lfUUxBMjMyMj1tCitDT05GSUdfU0NTSV9RTEEyNFhYPW0KIENPTkZJR19TQ1NJX0xQRkM9bQogIyBDT05GSUdfU0NTSV9EQzM5NXggaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9EQzM5MFQgaXMgbm90IHNldApAQCAtNTIxLDcgKzUyOSw3IEBACiBDT05GSUdfTURfUkFJRDE9eQogQ09ORklHX01EX1JBSUQxMD1tCiBDT05GSUdfTURfUkFJRDU9eQotIyBDT05GSUdfTURfUkFJRDVfUkVTSEFQRSBpcyBub3Qgc2V0CitDT05GSUdfTURfUkFJRDVfUkVTSEFQRT15CiBDT05GSUdfTURfUkFJRDY9bQogQ09ORklHX01EX01VTFRJUEFUSD1tCiBDT05GSUdfTURfRkFVTFRZPW0KQEAgLTc2NCw3ICs3NzIsNyBAQAogQ09ORklHX1NFUklBTF9DT1JFPXkKIENPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKIENPTkZJR19TRVJJQUxfSUNPTT1tCi0jIENPTkZJR19TRVJJQUxfSlNNIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfSlNNPW0KIENPTkZJR19VTklYOThfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWVM9eQogQ09ORklHX0xFR0FDWV9QVFlfQ09VTlQ9MjU2CkBAIC03NzMsNyArNzgxLDcgQEAKICMgQ09ORklHX1RJUEFSIGlzIG5vdCBzZXQKIENPTkZJR19IVkNfRFJJVkVSPXkKIENPTkZJR19IVkNfQ09OU09MRT15Ci0jIENPTkZJR19IVkNfUlRBUyBpcyBub3Qgc2V0CitDT05GSUdfSFZDX1JUQVM9eQogQ09ORklHX0hWQ1M9bQogCiAjCkBAIC0xMDMxLDkgKzEwMzksNyBAQAogIyBDT05GSUdfVVNCX0FDRUNBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX1BPV0VSTUFURSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfTVRPVUNIIGlzIG5vdCBzZXQKLSMgQ09ORklHX1VTQl9JVE1UT1VDSCBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfRUdBTEFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTQl9UT1VDSFNDUkVFTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfWUVBTElOSyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfWFBBRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVRJX1JFTU9URSBpcyBub3Qgc2V0CkBAIC0xMTA1LDE2ICsxMTExLDI1IEBACiAjIENPTkZJR19ORVdfTEVEUyBpcyBub3Qgc2V0CiAKICMKKyMgTEVEIGRyaXZlcnMKKyMKKworIworIyBMRUQgVHJpZ2dlcnMKKyMKKworIwogIyBJbmZpbmlCYW5kIHN1cHBvcnQKICMKIENPTkZJR19JTkZJTklCQU5EPW0KLSMgQ09ORklHX0lORklOSUJBTkRfVVNFUl9NQUQgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUyBpcyBub3Qgc2V0CitDT05GSUdfSU5GSU5JQkFORF9VU0VSX01BRD1tCitDT05GSUdfSU5GSU5JQkFORF9VU0VSX0FDQ0VTUz1tCiBDT05GSUdfSU5GSU5JQkFORF9NVEhDQT1tCi0jIENPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19JTkZJTklCQU5EX01USENBX0RFQlVHPXkKIENPTkZJR19JTkZJTklCQU5EX0lQT0lCPW0KLSMgQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfSU5GSU5JQkFORF9TUlAgaXMgbm90IHNldAorQ09ORklHX0lORklOSUJBTkRfSVBPSUJfREVCVUc9eQorIyBDT05GSUdfSU5GSU5JQkFORF9JUE9JQl9ERUJVR19EQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19JTkZJTklCQU5EX1NSUD1tCiAKICMKICMgRURBQyAtIGVycm9yIGRldGVjdGlvbiBhbmQgcmVwb3J0aW5nIChSQVMpIChFWFBFUklNRU5UQUwpCkBAIC0xMTU5LDE1ICsxMTc0LDE1IEBACiBDT05GSUdfWEZTX1NFQ1VSSVRZPXkKIENPTkZJR19YRlNfUE9TSVhfQUNMPXkKICMgQ09ORklHX1hGU19SVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19PQ0ZTMl9GUyBpcyBub3Qgc2V0CitDT05GSUdfT0NGUzJfRlM9bQogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQogIyBDT05GSUdfUVVPVEEgaXMgbm90IHNldAogQ09ORklHX0ROT1RJRlk9eQotQ09ORklHX0FVVE9GU19GUz1tCi0jIENPTkZJR19BVVRPRlM0X0ZTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0ZVU0VfRlMgaXMgbm90IHNldAorIyBDT05GSUdfQVVUT0ZTX0ZTIGlzIG5vdCBzZXQKK0NPTkZJR19BVVRPRlM0X0ZTPW0KK0NPTkZJR19GVVNFX0ZTPW0KIAogIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCkBAIC0xMTk5LDcgKzEyMTQsNyBAQAogQ09ORklHX0hVR0VUTEJGUz15CiBDT05GSUdfSFVHRVRMQl9QQUdFPXkKIENPTkZJR19SQU1GUz15Ci0jIENPTkZJR19DT05GSUdGU19GUyBpcyBub3Qgc2V0CitDT05GSUdfQ09ORklHRlNfRlM9bQogCiAjCiAjIE1pc2NlbGxhbmVvdXMgZmlsZXN5c3RlbXMKQEAgLTEzMTcsNyArMTMzMiw3IEBACiAjCiBDT05GSUdfUFJPRklMSU5HPXkKIENPTkZJR19PUFJPRklMRT15Ci0jIENPTkZJR19LUFJPQkVTIGlzIG5vdCBzZXQKK0NPTkZJR19LUFJPQkVTPXkKIAogIwogIyBLZXJuZWwgaGFja2luZwpAQCAtMTMyOSw3ICsxMzQ0LDcgQEAKIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUD15CiAjIENPTkZJR19TQ0hFRFNUQVRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NMQUIgaXMgbm90IHNldAotQ09ORklHX0RFQlVHX01VVEVYRVM9eQorIyBDT05GSUdfREVCVUdfTVVURVhFUyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKQEAgLTEzMzksMTcgKzEzNTQsMTMgQEAKIENPTkZJR19GT1JDRURfSU5MSU5JTkc9eQogIyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVCBpcyBub3Qgc2V0CiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15Ci1DT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQorIyBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0UgaXMgbm90IHNldAogQ09ORklHX0RFQlVHR0VSPXkKIENPTkZJR19YTU9OPXkKIENPTkZJR19YTU9OX0RFRkFVTFQ9eQogQ09ORklHX0lSUVNUQUNLUz15CiAjIENPTkZJR19CT09UWF9URVhUIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19MUEFSIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BQQ19FQVJMWV9ERUJVR19HNSBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfUlRBUyBpcyBub3Qgc2V0Ci0jIENPTkZJR19QUENfRUFSTFlfREVCVUdfTUFQTEUgaXMgbm90IHNldAotIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHX0lTRVJJRVMgaXMgbm90IHNldAorIyBDT05GSUdfUFBDX0VBUkxZX0RFQlVHIGlzIG5vdCBzZXQKIAogIwogIyBTZWN1cml0eSBvcHRpb25zCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FsaWduLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FsaWduLmMKaW5kZXggZmFhZWM5Yy4uNDczNGI1ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hbGlnbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYWxpZ24uYwpAQCAtMzUsMTcgKzM1LDE5IEBACiAKICNkZWZpbmUgSU5WQUxJRAl7IDAsIDAgfQogCi0jZGVmaW5lIExECTEJLyogbG9hZCAqLwotI2RlZmluZSBTVAkyCS8qIHN0b3JlICovCi0jZGVmaW5lCVNFCTQJLyogc2lnbi1leHRlbmQgdmFsdWUgKi8KLSNkZWZpbmUgRgk4CS8qIHRvL2Zyb20gZnAgcmVncyAqLwotI2RlZmluZSBVCTB4MTAJLyogdXBkYXRlIGluZGV4IHJlZ2lzdGVyICovCi0jZGVmaW5lIE0JMHgyMAkvKiBtdWx0aXBsZSBsb2FkL3N0b3JlICovCi0jZGVmaW5lIFNXCTB4NDAJLyogYnl0ZSBzd2FwIGludCBvciAuLi4gKi8KLSNkZWZpbmUgUwkweDQwCS8qIC4uLiBzaW5nbGUtcHJlY2lzaW9uIGZwICovCi0jZGVmaW5lIFNYCTB4NDAJLyogYnl0ZSBjb3VudCBpbiBYRVIgKi8KKy8qIEJpdHMgaW4gdGhlIGZsYWdzIGZpZWxkICovCisjZGVmaW5lIExECTAJLyogbG9hZCAqLworI2RlZmluZSBTVAkxCS8qIHN0b3JlICovCisjZGVmaW5lCVNFCTIJLyogc2lnbi1leHRlbmQgdmFsdWUgKi8KKyNkZWZpbmUgRgk0CS8qIHRvL2Zyb20gZnAgcmVncyAqLworI2RlZmluZSBVCTgJLyogdXBkYXRlIGluZGV4IHJlZ2lzdGVyICovCisjZGVmaW5lIE0JMHgxMAkvKiBtdWx0aXBsZSBsb2FkL3N0b3JlICovCisjZGVmaW5lIFNXCTB4MjAJLyogYnl0ZSBzd2FwICovCisjZGVmaW5lIFMJMHg0MAkvKiBzaW5nbGUtcHJlY2lzaW9uIGZwIG9yLi4uICovCisjZGVmaW5lIFNYCTB4NDAJLyogLi4uIGJ5dGUgY291bnQgaW4gWEVSICovCiAjZGVmaW5lIEhBUkQJMHg4MAkvKiBzdHJpbmcsIHN0d2N4LiAqLwogCisvKiBEU0lTUiBiaXRzIHJlcG9ydGVkIGZvciBhIERDQlogaW5zdHJ1Y3Rpb246ICovCiAjZGVmaW5lIERDQloJMHg1ZgkvKiA4eHgvODJ4eCBkY2J6IGZhdWx0cyB3aGVuIGNhY2hlIG5vdCBlbmFibGVkICovCiAKICNkZWZpbmUgU1dBUChhLCBiKQkodCA9IChhKSwgKGEpID0gKGIpLCAoYikgPSB0KQpAQCAtMjU2LDEyICsyNTgsMTYgQEAKICNkZWZpbmUgUkVHX0JZVEUocnAsIGkpCQkqKCh1OCAqKShycCkgKyAoaSkpCiAjZW5kaWYKIAorI2RlZmluZSBTV0laX1BUUihwKQkJKCh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSgocCkgXiBzd2l6KSkKKwogc3RhdGljIGludCBlbXVsYXRlX211bHRpcGxlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBjaGFyIF9fdXNlciAqYWRkciwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgbmIsCi0JCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgaW5zdHIpCisJCQkgICAgdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgaW5zdHIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBzd2l6KQogewogCXVuc2lnbmVkIGxvbmcgKnJwdHI7Ci0JdW5zaWduZWQgaW50IG5iMCwgaTsKKwl1bnNpZ25lZCBpbnQgbmIwLCBpLCBic3dpejsKKwl1bnNpZ25lZCBsb25nIHA7CiAKIAkvKgogCSAqIFdlIGRvIG5vdCB0cnkgdG8gZW11bGF0ZSA4IGJ5dGVzIG11bHRpcGxlIGFzIHRoZXkgYXJlbid0IHJlYWxseQpAQCAtMjgwLDkgKzI4NiwxMiBAQAogCQkJaWYgKG5iID09IDApCiAJCQkJcmV0dXJuIDE7CiAJCX0gZWxzZSB7Ci0JCQlpZiAoX19nZXRfdXNlcihpbnN0ciwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGludCBfX3VzZXIgKilyZWdzLT5uaXApKQorCQkJdW5zaWduZWQgbG9uZyBwYyA9IHJlZ3MtPm5pcCBeIChzd2l6ICYgNCk7CisKKwkJCWlmIChfX2dldF91c2VyKGluc3RyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXBjKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChzd2l6ID09IDAgJiYgKGZsYWdzICYgU1cpKQorCQkJCWluc3RyID0gY3B1X3RvX2xlMzIoaW5zdHIpOwogCQkJbmIgPSAoaW5zdHIgPj4gMTEpICYgMHgxZjsKIAkJCWlmIChuYiA9PSAwKQogCQkJCW5iID0gMzI7CkBAIC0zMDAsNyArMzA5LDEwIEBACiAJCXJldHVybiAtRUZBVUxUOwkvKiBiYWQgYWRkcmVzcyAqLwogCiAJcnB0ciA9ICZyZWdzLT5ncHJbcmVnXTsKLQlpZiAoZmxhZ3MgJiBMRCkgeworCXAgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKKwlic3dpeiA9IChmbGFncyAmIFNXKT8gMzogMDsKKworCWlmICghKGZsYWdzICYgU1QpKSB7CiAJCS8qCiAJCSAqIFRoaXMgemVyb2VzIHRoZSB0b3AgNCBieXRlcyBvZiB0aGUgYWZmZWN0ZWQgcmVnaXN0ZXJzCiAJCSAqIGluIDY0LWJpdCBtb2RlLCBhbmQgYWxzbyB6ZXJvZXMgb3V0IGFueSByZW1haW5pbmcKQEAgLTMxMSwyNiArMzIzLDI4IEBACiAJCQltZW1zZXQoJnJlZ3MtPmdwclswXSwgMCwKIAkJCSAgICAgICAoKG5iMCArIDMpIC8gNCkgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBuYjsgKytpKQotCQkJaWYgKF9fZ2V0X3VzZXIoUkVHX0JZVEUocnB0ciwgaSksIGFkZHIgKyBpKSkKKwkJZm9yIChpID0gMDsgaSA8IG5iOyArK2ksICsrcCkKKwkJCWlmIChfX2dldF91c2VyKFJFR19CWVRFKHJwdHIsIGkgXiBic3dpeiksIFNXSVpfUFRSKHApKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKG5iMCA+IDApIHsKIAkJCXJwdHIgPSAmcmVncy0+Z3ByWzBdOwogCQkJYWRkciArPSBuYjsKLQkJCWZvciAoaSA9IDA7IGkgPCBuYjA7ICsraSkKLQkJCQlpZiAoX19nZXRfdXNlcihSRUdfQllURShycHRyLCBpKSwgYWRkciArIGkpKQorCQkJZm9yIChpID0gMDsgaSA8IG5iMDsgKytpLCArK3ApCisJCQkJaWYgKF9fZ2V0X3VzZXIoUkVHX0JZVEUocnB0ciwgaSBeIGJzd2l6KSwKKwkJCQkJICAgICAgIFNXSVpfUFRSKHApKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAogCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBuYjsgKytpKQotCQkJaWYgKF9fcHV0X3VzZXIoUkVHX0JZVEUocnB0ciwgaSksIGFkZHIgKyBpKSkKKwkJZm9yIChpID0gMDsgaSA8IG5iOyArK2ksICsrcCkKKwkJCWlmIChfX3B1dF91c2VyKFJFR19CWVRFKHJwdHIsIGkgXiBic3dpeiksIFNXSVpfUFRSKHApKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKG5iMCA+IDApIHsKIAkJCXJwdHIgPSAmcmVncy0+Z3ByWzBdOwogCQkJYWRkciArPSBuYjsKLQkJCWZvciAoaSA9IDA7IGkgPCBuYjA7ICsraSkKLQkJCQlpZiAoX19wdXRfdXNlcihSRUdfQllURShycHRyLCBpKSwgYWRkciArIGkpKQorCQkJZm9yIChpID0gMDsgaSA8IG5iMDsgKytpLCArK3ApCisJCQkJaWYgKF9fcHV0X3VzZXIoUkVHX0JZVEUocnB0ciwgaSBeIGJzd2l6KSwKKwkJCQkJICAgICAgIFNXSVpfUFRSKHApKSkKIAkJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAl9CkBAIC0zNTIsNyArMzY2LDcgQEAKIAl1bnNpZ25lZCBpbnQgcmVnLCBhcmVnOwogCXVuc2lnbmVkIGludCBkc2lzcjsKIAl1bnNpZ25lZCBjaGFyIF9fdXNlciAqYWRkcjsKLQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqcDsKKwl1bnNpZ25lZCBsb25nIHAsIHN3aXo7CiAJaW50IHJldCwgdDsKIAl1bmlvbiB7CiAJCXU2NCBsbDsKQEAgLTM4MCwxMSArMzk0LDE1IEBACiAJICogbGV0J3MgbWFrZSBvbmUgdXAgZnJvbSB0aGUgaW5zdHJ1Y3Rpb24KIAkgKi8KIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfTk9EU0lTUkFMSUdOKSkgewotCQl1bnNpZ25lZCBpbnQgcmVhbF9pbnN0cjsKLQkJaWYgKHVubGlrZWx5KF9fZ2V0X3VzZXIocmVhbF9pbnN0ciwKLQkJCQkJKHVuc2lnbmVkIGludCBfX3VzZXIgKilyZWdzLT5uaXApKSkKKwkJdW5zaWduZWQgbG9uZyBwYyA9IHJlZ3MtPm5pcDsKKworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFBDX0xFKSAmJiAocmVncy0+bXNyICYgTVNSX0xFKSkKKwkJCXBjIF49IDQ7CisJCWlmICh1bmxpa2VseShfX2dldF91c2VyKGluc3RyLCAodW5zaWduZWQgaW50IF9fdXNlciAqKXBjKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJZHNpc3IgPSBtYWtlX2RzaXNyKHJlYWxfaW5zdHIpOworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUkVBTF9MRSkgJiYgKHJlZ3MtPm1zciAmIE1TUl9MRSkpCisJCQlpbnN0ciA9IGNwdV90b19sZTMyKGluc3RyKTsKKwkJZHNpc3IgPSBtYWtlX2RzaXNyKGluc3RyKTsKIAl9CiAKIAkvKiBleHRyYWN0IHRoZSBvcGVyYXRpb24gYW5kIHJlZ2lzdGVycyBmcm9tIHRoZSBkc2lzciAqLwpAQCAtMzk3LDYgKzQxNSwyNCBAQAogCW5iID0gYWxpZ25pbmZvW2luc3RyXS5sZW47CiAJZmxhZ3MgPSBhbGlnbmluZm9baW5zdHJdLmZsYWdzOwogCisJLyogQnl0ZXN3YXAgbGl0dGxlIGVuZGlhbiBsb2FkcyBhbmQgc3RvcmVzICovCisJc3dpeiA9IDA7CisJaWYgKHJlZ3MtPm1zciAmIE1TUl9MRSkgeworCQlmbGFncyBePSBTVzsKKwkJLyoKKwkJICogU28tY2FsbGVkICJQb3dlclBDIGxpdHRsZSBlbmRpYW4iIG1vZGUgd29ya3MgYnkKKwkJICogc3dpenpsaW5nIGFkZHJlc3NlcyByYXRoZXIgdGhhbiBieSBhY3R1YWxseSBkb2luZworCQkgKiBhbnkgYnl0ZS1zd2FwcGluZy4gIFRvIGVtdWxhdGUgdGhpcywgd2UgWE9SIGVhY2gKKwkJICogYnl0ZSBhZGRyZXNzIHdpdGggNy4gIFdlIGFsc28gYnl0ZS1zd2FwLCBiZWNhdXNlCisJCSAqIHRoZSBwcm9jZXNzb3IncyBhZGRyZXNzIHN3aXp6bGluZyBkZXBlbmRzIG9uIHRoZQorCQkgKiBvcGVyYW5kIHNpemUgKGl0IHhvcnMgdGhlIGFkZHJlc3Mgd2l0aCA3IGZvciBieXRlcywKKwkJICogNiBmb3IgaGFsZndvcmRzLCA0IGZvciB3b3JkcywgMCBmb3IgZG91Ymxld29yZHMpIGJ1dAorCQkgKiB3ZSB3aWxsIHhvciB3aXRoIDcgYW5kIGxvYWQvc3RvcmUgZWFjaCBieXRlIHNlcGFyYXRlbHkuCisJCSAqLworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUFBDX0xFKSkKKwkJCXN3aXogPSA3OworCX0KKwogCS8qIERBUiBoYXMgdGhlIG9wZXJhbmQgZWZmZWN0aXZlIGFkZHJlc3MgKi8KIAlhZGRyID0gKHVuc2lnbmVkIGNoYXIgX191c2VyICopcmVncy0+ZGFyOwogCkBAIC00MTIsNyArNDQ4LDggQEAKIAkgKiBmdW5jdGlvbgogCSAqLwogCWlmIChmbGFncyAmIE0pCi0JCXJldHVybiBlbXVsYXRlX211bHRpcGxlKHJlZ3MsIGFkZHIsIHJlZywgbmIsIGZsYWdzLCBpbnN0cik7CisJCXJldHVybiBlbXVsYXRlX211bHRpcGxlKHJlZ3MsIGFkZHIsIHJlZywgbmIsCisJCQkJCWZsYWdzLCBpbnN0ciwgc3dpeik7CiAKIAkvKiBWZXJpZnkgdGhlIGFkZHJlc3Mgb2YgdGhlIG9wZXJhbmQgKi8KIAlpZiAodW5saWtlbHkodXNlcl9tb2RlKHJlZ3MpICYmCkBAIC00MzEsNTEgKzQ2OCw3MSBAQAogCS8qIElmIHdlIGFyZSBsb2FkaW5nLCBnZXQgdGhlIGRhdGEgZnJvbSB1c2VyIHNwYWNlLCBlbHNlCiAJICogZ2V0IGl0IGZyb20gcmVnaXN0ZXIgdmFsdWVzCiAJICovCi0JaWYgKGZsYWdzICYgTEQpIHsKKwlpZiAoIShmbGFncyAmIFNUKSkgewogCQlkYXRhLmxsID0gMDsKIAkJcmV0ID0gMDsKLQkJcCA9IGFkZHI7CisJCXAgPSAodW5zaWduZWQgbG9uZykgYWRkcjsKIAkJc3dpdGNoIChuYikgewogCQljYXNlIDg6Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbMF0sIHArKyk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbMV0sIHArKyk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbMl0sIHArKyk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbM10sIHArKyk7CisJCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbMF0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzFdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyKGRhdGEudlsyXSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbM10sIFNXSVpfUFRSKHArKykpOwogCQljYXNlIDQ6Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbNF0sIHArKyk7Ci0JCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbNV0sIHArKyk7CisJCQlyZXQgfD0gX19nZXRfdXNlcihkYXRhLnZbNF0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzVdLCBTV0laX1BUUihwKyspKTsKIAkJY2FzZSAyOgotCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzZdLCBwKyspOwotCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzddLCBwKyspOworCQkJcmV0IHw9IF9fZ2V0X3VzZXIoZGF0YS52WzZdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX2dldF91c2VyKGRhdGEudls3XSwgU1dJWl9QVFIocCsrKSk7CiAJCQlpZiAodW5saWtlbHkocmV0KSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCX0gZWxzZSBpZiAoZmxhZ3MgJiBGKQorCX0gZWxzZSBpZiAoZmxhZ3MgJiBGKSB7CiAJCWRhdGEuZGQgPSBjdXJyZW50LT50aHJlYWQuZnByW3JlZ107Ci0JZWxzZQorCQlpZiAoZmxhZ3MgJiBTKSB7CisJCQkvKiBTaW5nbGUtcHJlY2lzaW9uIEZQIHN0b3JlIHJlcXVpcmVzIGNvbnZlcnNpb24uLi4gKi8KKyNpZmRlZiBDT05GSUdfUFBDX0ZQVQorCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQllbmFibGVfa2VybmVsX2ZwKCk7CisJCQljdnRfZGYoJmRhdGEuZGQsIChmbG9hdCAqKSZkYXRhLnZbNF0sICZjdXJyZW50LT50aHJlYWQpOworCQkJcHJlZW1wdF9lbmFibGUoKTsKKyNlbHNlCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQl9CisJfSBlbHNlCiAJCWRhdGEubGwgPSByZWdzLT5ncHJbcmVnXTsKIAotCS8qIFBlcmZvcm0gb3RoZXIgbWlzYyBvcGVyYXRpb25zIGxpa2Ugc2lnbiBleHRlbnNpb24sIGJ5dGVzd2FwLAorCWlmIChmbGFncyAmIFNXKSB7CisJCXN3aXRjaCAobmIpIHsKKwkJY2FzZSA4OgorCQkJU1dBUChkYXRhLnZbMF0sIGRhdGEudls3XSk7CisJCQlTV0FQKGRhdGEudlsxXSwgZGF0YS52WzZdKTsKKwkJCVNXQVAoZGF0YS52WzJdLCBkYXRhLnZbNV0pOworCQkJU1dBUChkYXRhLnZbM10sIGRhdGEudls0XSk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJU1dBUChkYXRhLnZbNF0sIGRhdGEudls3XSk7CisJCQlTV0FQKGRhdGEudls1XSwgZGF0YS52WzZdKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlTV0FQKGRhdGEudls2XSwgZGF0YS52WzddKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogUGVyZm9ybSBvdGhlciBtaXNjIG9wZXJhdGlvbnMgbGlrZSBzaWduIGV4dGVuc2lvbgogCSAqIG9yIGZsb2F0aW5nIHBvaW50IHNpbmdsZSBwcmVjaXNpb24gY29udmVyc2lvbgogCSAqLwotCXN3aXRjaCAoZmxhZ3MgJiB+VSkgeworCXN3aXRjaCAoZmxhZ3MgJiB+KFV8U1cpKSB7CiAJY2FzZSBMRCtTRToJLyogc2lnbiBleHRlbmQgKi8KIAkJaWYgKCBuYiA9PSAyICkKIAkJCWRhdGEubGwgPSBkYXRhLngxNi5sb3cxNjsKIAkJZWxzZQkvKiBuYiBtdXN0IGJlIDQgKi8KIAkJCWRhdGEubGwgPSBkYXRhLngzMi5sb3czMjsKIAkJYnJlYWs7Ci0JY2FzZSBMRCtTOgkvKiBieXRlLXN3YXAgKi8KLQljYXNlIFNUK1M6Ci0JCWlmIChuYiA9PSAyKSB7Ci0JCQlTV0FQKGRhdGEudls2XSwgZGF0YS52WzddKTsKLQkJfSBlbHNlIHsKLQkJCVNXQVAoZGF0YS52WzRdLCBkYXRhLnZbN10pOwotCQkJU1dBUChkYXRhLnZbNV0sIGRhdGEudls2XSk7Ci0JCX0KLQkJYnJlYWs7CiAKLQkvKiBTaW5nbGUtcHJlY2lzaW9uIEZQIGxvYWQgYW5kIHN0b3JlIHJlcXVpcmUgY29udmVyc2lvbnMuLi4gKi8KKwkvKiBTaW5nbGUtcHJlY2lzaW9uIEZQIGxvYWQgcmVxdWlyZXMgY29udmVyc2lvbi4uLiAqLwogCWNhc2UgTEQrRitTOgogI2lmZGVmIENPTkZJR19QUENfRlBVCiAJCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtNDg2LDM0ICs1NDMsMjQgQEAKIAkJcmV0dXJuIDA7CiAjZW5kaWYKIAkJYnJlYWs7Ci0JY2FzZSBTVCtGK1M6Ci0jaWZkZWYgQ09ORklHX1BQQ19GUFUKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JCWVuYWJsZV9rZXJuZWxfZnAoKTsKLQkJY3Z0X2RmKCZkYXRhLmRkLCAoZmxvYXQgKikmZGF0YS52WzRdLCAmY3VycmVudC0+dGhyZWFkKTsKLQkJcHJlZW1wdF9lbmFibGUoKTsKLSNlbHNlCi0JCXJldHVybiAwOwotI2VuZGlmCi0JCWJyZWFrOwogCX0KIAogCS8qIFN0b3JlIHJlc3VsdCB0byBtZW1vcnkgb3IgdXBkYXRlIHJlZ2lzdGVycyAqLwogCWlmIChmbGFncyAmIFNUKSB7CiAJCXJldCA9IDA7Ci0JCXAgPSBhZGRyOworCQlwID0gKHVuc2lnbmVkIGxvbmcpIGFkZHI7CiAJCXN3aXRjaCAobmIpIHsKIAkJY2FzZSA4OgotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzBdLCBwKyspOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzFdLCBwKyspOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzJdLCBwKyspOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzNdLCBwKyspOworCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzBdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudlsxXSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcihkYXRhLnZbMl0sIFNXSVpfUFRSKHArKykpOworCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzNdLCBTV0laX1BUUihwKyspKTsKIAkJY2FzZSA0OgotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzRdLCBwKyspOwotCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzVdLCBwKyspOworCQkJcmV0IHw9IF9fcHV0X3VzZXIoZGF0YS52WzRdLCBTV0laX1BUUihwKyspKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudls1XSwgU1dJWl9QVFIocCsrKSk7CiAJCWNhc2UgMjoKLQkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudls2XSwgcCsrKTsKLQkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudls3XSwgcCsrKTsKKwkJCXJldCB8PSBfX3B1dF91c2VyKGRhdGEudls2XSwgU1dJWl9QVFIocCsrKSk7CisJCQlyZXQgfD0gX19wdXRfdXNlcihkYXRhLnZbN10sIFNXSVpfUFRSKHArKykpOwogCQl9CiAJCWlmICh1bmxpa2VseShyZXQpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOGY4NWM1ZS4uZmYyOTQwNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTIyLDkgKzEyMiw4IEBACiAJREVGSU5FKFBBQ0FTTEJDQUNIRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzbGJfY2FjaGUpKTsKIAlERUZJTkUoUEFDQVNMQkNBQ0hFUFRSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9jYWNoZV9wdHIpKTsKIAlERUZJTkUoUEFDQUNPTlRFWFRJRCwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBjb250ZXh0LmlkKSk7Ci0jaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQlERUZJTkUoUEFDQVBHRElSLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHBnZGlyKSk7Ci0jZW5kaWYKKwlERUZJTkUoUEFDQUNPTlRFWFRTTExQLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGNvbnRleHQuc2xscCkpOworCURFRklORShQQUNBVk1BTExPQ1NMTFAsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgdm1hbGxvY19zbGxwKSk7CiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCURFRklORShQQUNBTE9XSFRMQkFSRUFTLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGNvbnRleHQubG93X2h0bGJfYXJlYXMpKTsKIAlERUZJTkUoUEFDQUhJR0hIVExCQVJFQVMsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgY29udGV4dC5oaWdoX2h0bGJfYXJlYXMpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwXzZ4eC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMKaW5kZXggNTVlZDc3MS4uMzY1MzgxZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfNnh4LlMKQEAgLTIxMCw5ICsyMTAsMTEgQEAKIAkgKiB0aGUgZmlybXdhcmUuIElmIGFueSwgd2UgZGlzYWJsZSBOQVAgY2FwYWJpbGl0eSBhcwogCSAqIGl0J3Mga25vd24gdG8gYmUgYm9ndXMgb24gcmV2IDIuMSBhbmQgZWFybGllcgogCSAqLworQkVHSU5fRlRSX1NFQ1RJT04KIAltZnNwcglyMTEsU1BSTl9MM0NSCiAJYW5kaXMuCXIxMSxyMTEsTDNDUl9MM0VAaAogCWJlcQkxZgorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfTDNDUikKIAlsd3oJcjYsQ1BVX1NQRUNfRkVBVFVSRVMocjUpCiAJYW5kaS4JcjAscjYsQ1BVX0ZUUl9MM19ESVNBQkxFX05BUAogCWJlcQkxZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfcG93ZXI0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwppbmRleCBiNjFkODZlLi4yNzE0MTgzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9wb3dlcjQuUwpAQCAtNzMsMjMgKzczLDYgQEAKIAlpc3luYwogCWJscgogCi1fR0xPQkFMKF9fc2V0dXBfY3B1X3Bvd2VyNCkKLQlibHIKLQotX0dMT0JBTChfX3NldHVwX2NwdV9iZSkKLSAgICAgICAgLyogU2V0IGxhcmdlIHBhZ2Ugc2l6ZXMgTFA9MDogMTZNQiwgTFA9MTogNjRLQiAqLwotICAgICAgICBhZGRpICAgIHIzLCAwLCAgMAotICAgICAgICBvcmkgICAgIHIzLCByMywgSElENl9MQgotICAgICAgICBzbGRpICAgIHIzLCByMywgMzIKLSAgICAgICAgbm9yICAgICByMywgcjMsIHIzCi0gICAgICAgIG1mc3ByICAgcjQsIFNQUk5fSElENgotICAgICAgICBhbmQgICAgIHI0LCByNCwgcjMKLSAgICAgICAgYWRkaSAgICByMywgMCwgMHgwMjAwMAotICAgICAgICBzbGRpICAgIHIzLCByMywgMzIKLSAgICAgICAgb3IgICAgICByNCwgcjQsIHIzCi0gICAgICAgIG10c3ByICAgU1BSTl9ISUQ2LCByNAotCWJscgotCiBfR0xPQkFMKF9fc2V0dXBfY3B1X3BwYzk3MCkKIAltZnNwcglyMCxTUFJOX0hJRDAKIAlsaQlyMTEsNQkJCS8qIGNsZWFyIERPWkUgYW5kIFNMRUVQICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKaW5kZXggM2Y3MTgyZC4uMWMxMTQ4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYwpAQCAtMzAsMTEgKzMwLDcgQEAKICAqIHBhcnQgb2YgdGhlIGNwdXRhYmxlIHRob3VnaC4gVGhhdCBoYXMgdG8gYmUgZml4ZWQgZm9yIGJvdGggcHBjMzIKICAqIGFuZCBwcGM2NAogICovCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci1leHRlcm4gdm9pZCBfX3NldHVwX2NwdV9wb3dlcjModW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7Ci1leHRlcm4gdm9pZCBfX3NldHVwX2NwdV9wb3dlcjQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7Ci1leHRlcm4gdm9pZCBfX3NldHVwX2NwdV9iZSh1bnNpZ25lZCBsb25nIG9mZnNldCwgc3RydWN0IGNwdV9zcGVjKiBzcGVjKTsKLSNlbHNlCisjaWZkZWYgQ09ORklHX1BQQzMyCiBleHRlcm4gdm9pZCBfX3NldHVwX2NwdV82MDModW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7CiBleHRlcm4gdm9pZCBfX3NldHVwX2NwdV82MDQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7CiBleHRlcm4gdm9pZCBfX3NldHVwX2NwdV83NTAodW5zaWduZWQgbG9uZyBvZmZzZXQsIHN0cnVjdCBjcHVfc3BlYyogc3BlYyk7CkBAIC01OCw3ICs1NCw4IEBACiAjZGVmaW5lIENPTU1PTl9VU0VSX1BPV0VSNV9QTFVTCShDT01NT05fVVNFUl9QUEM2NCB8IFBQQ19GRUFUVVJFX1BPV0VSNV9QTFVTfFwKIAkJCQkgUFBDX0ZFQVRVUkVfU01UIHwgUFBDX0ZFQVRVUkVfSUNBQ0hFX1NOT09QKQogI2RlZmluZSBDT01NT05fVVNFUl9QT1dFUjYJKENPTU1PTl9VU0VSX1BQQzY0IHwgUFBDX0ZFQVRVUkVfQVJDSF8yXzA1IHxcCi0JCQkJIFBQQ19GRUFUVVJFX1NNVCB8IFBQQ19GRUFUVVJFX0lDQUNIRV9TTk9PUCkKKwkJCQkgUFBDX0ZFQVRVUkVfU01UIHwgUFBDX0ZFQVRVUkVfSUNBQ0hFX1NOT09QIHwgXAorCQkJCSBQUENfRkVBVFVSRV9UUlVFX0xFKQogI2RlZmluZSBDT01NT05fVVNFUl9CT09LRQkoUFBDX0ZFQVRVUkVfMzIgfCBQUENfRkVBVFVSRV9IQVNfTU1VIHwgXAogCQkJCSBQUENfRkVBVFVSRV9CT09LRSkKIApAQCAtNzgsMTEgKzc1LDEwIEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDQwMDAwMCwKIAkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCkiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BPV0VSMywKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfUFBDNjQsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0fFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gOCwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjMsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjMiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKIAkJLnBsYXRmb3JtCQk9ICJwb3dlcjMiLApAQCAtOTIsMTEgKzg4LDEwIEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDQxMDAwMCwKIAkJLmNwdV9uYW1lCQk9ICJQT1dFUjMgKDYzMCspIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjMsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BQQzY0LAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QUEM2NHxQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDgsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXIzLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvcG93ZXIzIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1JTNjQsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXIzIiwKQEAgLTExMCw3ICsxMDUsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKIAkJLnBsYXRmb3JtCQk9ICJyczY0IiwKQEAgLTEyNCw3ICsxMTgsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKIAkJLnBsYXRmb3JtCQk9ICJyczY0IiwKQEAgLTEzOCw3ICsxMzEsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKIAkJLnBsYXRmb3JtCQk9ICJyczY0IiwKQEAgLTE1Miw3ICsxNDQsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyMywKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3JzNjQiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUlM2NCwKIAkJLnBsYXRmb3JtCQk9ICJyczY0IiwKQEAgLTE2Niw3ICsxNTcsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKQEAgLTE4MCw3ICsxNzAsNiBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNCIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI0IiwKQEAgLTIwMCwxNyArMTg5LDExIEBACiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCiAJCS5wbGF0Zm9ybQkJPSAicHBjOTcwIiwKIAl9LAotI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwotI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KSB8fCBkZWZpbmVkKENPTkZJR19QT1dFUjQpCiAJewkvKiBQUEM5NzBGWCAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwM2MwMDAwLAogCQkuY3B1X25hbWUJCT0gIlBQQzk3MEZYIiwKLSNpZmRlZiBDT05GSUdfUFBDMzIKLQkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU185NzBfMzIsCi0jZWxzZQogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTX1BQQzk3MCwKLSNlbmRpZgogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjQgfAogCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCkBAIC0yMjEsOCArMjA0LDYgQEAKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKIAkJLnBsYXRmb3JtCQk9ICJwcGM5NzAiLAogCX0sCi0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDNjQpIHx8IGRlZmluZWQoQ09ORklHX1BPV0VSNCkgKi8KLSNpZmRlZiBDT05GSUdfUFBDNjQKIAl7CS8qIFBQQzk3ME1QICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDA0NDAwMDAsCkBAIC0yMzIsNiArMjEzLDcgQEAKIAkJCVBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLm51bV9wbWNzCQk9IDgsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcHBjOTcwLAogCQkub3Byb2ZpbGVfY3B1X3R5cGUJPSAicHBjNjQvOTcwIiwKIAkJLm9wcm9maWxlX3R5cGUJCT0gUFBDX09QUk9GSUxFX1BPV0VSNCwKQEAgLTI0Niw5ICsyMjgsMTMgQEAKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAogCQkubnVtX3BtY3MJCT0gNiwKLQkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjQsCiAJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjUiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkvKiBTSUhWIC8gU0lQUiBiaXRzIGFyZSBpbXBsZW1lbnRlZCBvbiBQT1dFUjQrIChHUSkKKwkJICogYW5kIGFib3ZlIGJ1dCBvbmx5IHdvcmtzIG9uIFBPV0VSNSBhbmQgYWJvdmUKKwkJICovCisJCS5vcHJvZmlsZV9tbWNyYV9zaWh2CT0gTU1DUkFfU0lIViwKKwkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBNTUNSQV9TSVBSLAogCQkucGxhdGZvcm0JCT0gInBvd2VyNSIsCiAJfSwKIAl7CS8qIFBvd2VyNSBHUyAqLwpAQCAtMjYwLDkgKzI0NiwxMCBAQAogCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5udW1fcG1jcwkJPSA2LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X3Bvd2VyNCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNSsiLAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfUE9XRVI0LAorCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IE1NQ1JBX1NJSFYsCisJCS5vcHJvZmlsZV9tbWNyYV9zaXByCT0gTU1DUkFfU0lQUiwKIAkJLnBsYXRmb3JtCQk9ICJwb3dlcjUrIiwKIAl9LAogCXsJLyogUG93ZXI2ICovCkBAIC0yNzMsMTAgKzI2MCwxMyBAQAogCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUl9QT1dFUjYsCiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKLQkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAorCQkubnVtX3BtY3MJCT0gOCwKIAkJLm9wcm9maWxlX2NwdV90eXBlCT0gInBwYzY0L3Bvd2VyNiIsCiAJCS5vcHJvZmlsZV90eXBlCQk9IFBQQ19PUFJPRklMRV9QT1dFUjQsCisgCQkub3Byb2ZpbGVfbW1jcmFfc2lodgk9IFBPV0VSNl9NTUNSQV9TSUhWLAorIAkJLm9wcm9maWxlX21tY3JhX3NpcHIJPSBQT1dFUjZfTU1DUkFfU0lQUiwKKyAJCS5vcHJvZmlsZV9tbWNyYV9jbGVhcgk9IFBPV0VSNl9NTUNSQV9USFJNIHwKKyAJCQlQT1dFUjZfTU1DUkFfT1RIRVIsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI2IiwKIAl9LAogCXsJLyogQ2VsbCBCcm9hZGJhbmQgRW5naW5lICovCkBAIC0yODksNyArMjc5LDYgQEAKIAkJCVBQQ19GRUFUVVJFX1NNVCwKIAkJLmljYWNoZV9ic2l6ZQkJPSAxMjgsCiAJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAotCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1X2JlLAogCQkucGxhdGZvcm0JCT0gInBwYy1jZWxsLWJlIiwKIAl9LAogCXsJLyogZGVmYXVsdCBtYXRjaCAqLwpAQCAtMzAxLDcgKzI5MCw2IEBACiAJCS5pY2FjaGVfYnNpemUJCT0gMTI4LAogCQkuZGNhY2hlX2JzaXplCQk9IDEyOCwKIAkJLm51bV9wbWNzCQk9IDYsCi0JCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfcG93ZXI0LAogCQkucGxhdGZvcm0JCT0gInBvd2VyNCIsCiAJfQogI2VuZGlmCS8qIENPTkZJR19QUEM2NCAqLwpAQCAtMzIzLDcgKzMxMSw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDAzMDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI2MDMiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzYwMywKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkuY3B1X3NldHVwCQk9IF9fc2V0dXBfY3B1XzYwMywKQEAgLTMzNCw3ICszMjIsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwNjAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiNjAzZSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNjAzLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLApAQCAtMzQ1LDcgKzMzMyw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDA3MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI2MDNldiIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNjAzLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5jcHVfc2V0dXAJCT0gX19zZXR1cF9jcHVfNjAzLApAQCAtMzU2LDcgKzM0NCw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDA0MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI2MDQiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzYwNCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gMiwKQEAgLTM2OCw3ICszNTYsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwOTAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiNjA0ZSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNjA0LAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LApAQCAtMzgwLDcgKzM2OCw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDA5MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI2MDRyIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU182MDQsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC0zOTIsNyArMzgwLDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwMGEwMDAwLAogCQkuY3B1X25hbWUJCT0gIjYwNGV2IiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU182MDQsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC00MDQsNyArMzkyLDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwMDg0MjAyLAogCQkuY3B1X25hbWUJCT0gIjc0MC83NTAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0MF9OT1RBVSwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKQEAgLTQxNiw3ICs0MDQsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwODAxMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzUwQ1giLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc1MCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKQEAgLTQyOCw3ICs0MTYsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwODIyMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzUwQ1giLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc1MCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKQEAgLTQ0MCw3ICs0MjgsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwODIyMTAsCiAJCS5jcHVfbmFtZQkJPSAiNzUwQ1hlIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC00NTIsNyArNDQwLDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwMDgzMjE0LAogCQkuY3B1X25hbWUJCT0gIjc1MENYZSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNzUwLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LApAQCAtNDY0LDcgKzQ1Miw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDA4MzAwMCwKIAkJLmNwdV9uYW1lCQk9ICI3NDUvNzU1IiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC00NzYsNyArNDY0LDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDcwMDAwMTAwLAogCQkuY3B1X25hbWUJCT0gIjc1MEZYIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTBGWDEsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC00ODgsNyArNDc2LDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDcwMDAwMjAwLAogCQkuY3B1X25hbWUJCT0gIjc1MEZYIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTBGWDIsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC01MDAsNyArNDg4LDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDcwMDAwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc1MEZYIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NTBGWCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNCwKQEAgLTUxMiw3ICs1MDAsNyBAQAogCQkucHZyX3ZhbHVlCQk9IDB4NzAwMjAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzUwR1giLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc1MEdYLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA0LApAQCAtNTI0LDcgKzUxMiw3IEBACiAJCS5wdnJfdmFsdWUJCT0gMHgwMDA4MDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI3NDAvNzUwIiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC01MzYsNyArNTI0LDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwMGMxMTAxLAogCQkuY3B1X25hbWUJCT0gIjc0MDAgKDEuMSkiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0MDBfTk9UQVUsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC01NDgsNyArNTM3LDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDAwMGMwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc0MDAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0MDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC01NjAsNyArNTUwLDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMGMwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc0MTAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0MDAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDQsCkBAIC01NzIsNyArNTYzLDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDAwMjAwLAogCQkuY3B1X25hbWUJCT0gIjc0NTAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NTBfMjAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCkBAIC01ODYsNyArNTc4LDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDAwMjAxLAogCQkuY3B1X25hbWUJCT0gIjc0NTAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NTBfMjEsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCkBAIC02MDAsNyArNTkzLDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDAwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc0NTAiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NTBfMjMsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCkBAIC02MTQsNyArNjA4LDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDEwMTAwLAogCQkuY3B1X25hbWUJCT0gIjc0NTUiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NTVfMSwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKQEAgLTYyOCw3ICs2MjMsOCBAQAogCQkucHZyX3ZhbHVlCQk9IDB4ODAwMTAyMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzQ1NSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNzQ1NV8yMCwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKQEAgLTY0Miw3ICs2MzgsOCBAQAogCQkucHZyX3ZhbHVlCQk9IDB4ODAwMTAwMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzQ1NSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNzQ1NSwKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8CisJCQlQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QIHwgUFBDX0ZFQVRVUkVfUFBDX0xFLAogCQkuaWNhY2hlX2JzaXplCQk9IDMyLAogCQkuZGNhY2hlX2JzaXplCQk9IDMyLAogCQkubnVtX3BtY3MJCT0gNiwKQEAgLTY1Niw3ICs2NTMsOCBAQAogCQkucHZyX3ZhbHVlCQk9IDB4ODAwMjAxMDAsCiAJCS5jcHVfbmFtZQkJPSAiNzQ0Ny83NDU3IiwKIAkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU183NDQ3XzEwLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LApAQCAtNjcwLDcgKzY2OCw4IEBACiAJCS5wdnJfdmFsdWUJCT0gMHg4MDAyMDEwMSwKIAkJLmNwdV9uYW1lCQk9ICI3NDQ3Lzc0NTciLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NDdfMTAsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCkBAIC02ODQsNyArNjgzLDcgQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDIwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc0NDcvNzQ1NyIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNzQ0NywKLQkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfCBQUENfRkVBVFVSRV9IQVNfQUxUSVZFQ19DT01QLAorCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LApAQCAtNjk4LDcgKzY5Nyw4IEBACiAJCS5wdnJfdmFsdWUJCT0gMHg4MDAzMDAwMCwKIAkJLmNwdV9uYW1lCQk9ICI3NDQ3QSIsCiAJCS5jcHVfZmVhdHVyZXMJCT0gQ1BVX0ZUUlNfNzQ0N0EsCi0JCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVIgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCB8IFBQQ19GRUFUVVJFX1BQQ19MRSwKIAkJLmljYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLmRjYWNoZV9ic2l6ZQkJPSAzMiwKIAkJLm51bV9wbWNzCQk9IDYsCkBAIC03MTIsNyArNzEyLDggQEAKIAkJLnB2cl92YWx1ZQkJPSAweDgwMDQwMDAwLAogCQkuY3B1X25hbWUJCT0gIjc0NDgiLAogCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzc0NDdBLAotCQkuY3B1X3VzZXJfZmVhdHVyZXMJPSBDT01NT05fVVNFUiB8IFBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19BTFRJVkVDX0NPTVAgfCBQUENfRkVBVFVSRV9QUENfTEUsCiAJCS5pY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5kY2FjaGVfYnNpemUJCT0gMzIsCiAJCS5udW1fcG1jcwkJPSA2LApAQCAtNzIxLDYgKzcyMiwxOCBAQAogCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfRzQsCiAJCS5wbGF0Zm9ybQkJPSAicHBjNzQ1MCIsCiAJfSwKKyAgICAgICAgeyAgICAgICAvKiA4NjQxICovCisgICAgICAgICAgICAgICAucHZyX21hc2sgICAgICAgICAgICAgICA9IDB4ZmZmZmZmZmYsCisgICAgICAgICAgICAgICAucHZyX3ZhbHVlICAgICAgICAgICAgICA9IDB4ODAwNDAwMTAsCisgICAgICAgICAgICAgICAuY3B1X25hbWUgICAgICAgICAgICAgICA9ICI4NjQxIiwKKyAgICAgICAgICAgICAgIC5jcHVfZmVhdHVyZXMgICAgICAgICAgID0gQ1BVX0ZUUlNfNzQ0N0EsCisgICAgICAgICAgICAgICAuY3B1X3VzZXJfZmVhdHVyZXMgICAgICA9IENPTU1PTl9VU0VSIHwgUFBDX0ZFQVRVUkVfSEFTX0FMVElWRUNfQ09NUCwKKyAgICAgICAgICAgICAgIC5pY2FjaGVfYnNpemUgICAgICAgICAgID0gMzIsCisgICAgICAgICAgICAgICAuZGNhY2hlX2JzaXplICAgICAgICAgICA9IDMyLAorICAgICAgICAgICAgICAgLm51bV9wbWNzICAgICAgICAgICAgICAgPSA2LAorICAgICAgICAgICAgICAgLmNwdV9zZXR1cCAgICAgICAgICAgICAgPSBfX3NldHVwX2NwdV83NDV4CisgICAgICAgIH0sCisKIAl7CS8qIDgyeHggKDgyNDAsIDgyNDUsIDgyNjAgYXJlIGFsbCA2MDNlIGNvcmVzKSAqLwogCQkucHZyX21hc2sJCT0gMHg3ZmZmMDAwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwODEwMDAwLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCmluZGV4IDc3OGYyMmYuLmRiY2I4NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9lbGYuaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CkBAIC0xNzQsNiArMTc1LDggQEAKIAogdm9pZCBkZWZhdWx0X21hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJdW5zaWduZWQgaW50IGlycTsKKwogCS8qCiAJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhZnRlciB0aGUgc3lzdGVtCiAJICogaGFzIHBhbmljZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCkBAIC0xODYsNiArMTg5LDE2IEBACiAJICovCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAorCWZvcl9lYWNoX2lycShpcnEpIHsKKwkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2NwKGlycSk7CisKKwkJaWYgKGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKQorCQkJZGVzYy0+aGFuZGxlci0+ZW5kKGlycSk7CisKKwkJaWYgKCEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkKKwkJCWRlc2MtPmhhbmRsZXItPmRpc2FibGUoaXJxKTsKKwl9CisKIAlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQogCQlwcGNfbWQua2V4ZWNfY3B1X2Rvd24oMSwgMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMKaW5kZXggNzY0ZDA3My4uMzcxOTczYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaF9kdW1wLmMKQEAgLTI1LDYgKzI1LDExIEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAordm9pZCByZXNlcnZlX2tkdW1wX3RyYW1wb2xpbmUodm9pZCkKK3sKKwlsbWJfcmVzZXJ2ZSgwLCBLRFVNUF9SRVNFUlZFX0xJTUlUKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV90cmFtcG9saW5lKHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAkvKiBUaGUgbWF4aW11bSByYW5nZSBvZiBhIHNpbmdsZSBpbnN0cnVjdGlvbiBicmFuY2gsIGlzIHRoZSBjdXJyZW50CkBAIC0zOSwxMSArNDQsMTEgQEAKIAljcmVhdGVfYnJhbmNoKGFkZHIgKyA0LCBhZGRyICsgUEhZU0lDQUxfU1RBUlQsIDApOwogfQogCi12b2lkIF9faW5pdCBrZHVtcF9zZXR1cCh2b2lkKQordm9pZCBfX2luaXQgc2V0dXBfa2R1bXBfdHJhbXBvbGluZSh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIAotCURCRygiIC0+IGtkdW1wX3NldHVwKClcbiIpOworCURCRygiIC0+IHNldHVwX2tkdW1wX3RyYW1wb2xpbmUoKVxuIik7CiAKIAlmb3IgKGkgPSBLRFVNUF9UUkFNUE9MSU5FX1NUQVJUOyBpIDwgS0RVTVBfVFJBTVBPTElORV9FTkQ7IGkgKz0gOCkgewogCQljcmVhdGVfdHJhbXBvbGluZShpKTsKQEAgLTUyLDcgKzU3LDcgQEAKIAljcmVhdGVfdHJhbXBvbGluZShfX3BhKHN5c3RlbV9yZXNldF9md25taSkgLSBQSFlTSUNBTF9TVEFSVCk7CiAJY3JlYXRlX3RyYW1wb2xpbmUoX19wYShtYWNoaW5lX2NoZWNrX2Z3bm1pKSAtIFBIWVNJQ0FMX1NUQVJUKTsKIAotCURCRygiIDwtIGtkdW1wX3NldHVwKClcbiIpOworCURCRygiIDwtIHNldHVwX2tkdW1wX3RyYW1wb2xpbmUoKVxuIik7CiB9CiAKICNpZmRlZiBDT05GSUdfUFJPQ19WTUNPUkUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwppbmRleCAxOWFkNWM2Li4yMjEwNjJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCkBAIC01Nyw2ICs1Nyw3IEBACiAJYmVxLQkxZgogCWxkCXIxLFBBQ0FLU0FWRShyMTMpCiAxOglzdGQJcjEwLDAocjEpCisJY3JjbHIJc28KIAlzdGQJcjExLF9OSVAocjEpCiAJc3RkCXIxMixfTVNSKHIxKQogCXN0ZAlyMCxHUFIwKHIxKQpAQCAtNzUsNyArNzYsNiBAQAogCXN0ZAlyMTEsR1BSMTEocjEpCiAJc3RkCXIxMSxHUFIxMihyMSkKIAlzdGQJcjksR1BSMTMocjEpCi0JY3JjbHIJc28KIAltZmNyCXI5CiAJbWZscglyMTAKIAlsaQlyMTEsMHhjMDEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2ZwdS5TCmluZGV4IDM0MDczMGYuLjAxZjcxMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZnB1LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9mcHUuUwpAQCAtNzIsNyArNzIsNyBAQAogCXN0ZAlyMTIsX01TUihyMSkKICNlbmRpZgogCWxmZAlmcjAsVEhSRUFEX0ZQU0NSKHI1KQotCW10ZnNmCTB4ZmYsZnIwCisJTVRGU0ZfTChmcjApCiAJUkVTVF8zMkZQUlMoMCwgcjUpCiAjaWZuZGVmIENPTkZJR19TTVAKIAlzdWJpCXI0LHI1LFRIUkVBRApAQCAtMTI3LDcgKzEyNyw3IEBACiAKIF9HTE9CQUwoY3Z0X2ZkKQogCWxmZAkwLFRIUkVBRF9GUFNDUihyNSkJLyogbG9hZCB1cCBmcHNjciB2YWx1ZSAqLwotCW10ZnNmCTB4ZmYsMAorCU1URlNGX0woMCkKIAlsZnMJMCwwKHIzKQogCXN0ZmQJMCwwKHI0KQogCW1mZnMJMApAQCAtMTM2LDcgKzEzNiw3IEBACiAKIF9HTE9CQUwoY3Z0X2RmKQogCWxmZAkwLFRIUkVBRF9GUFNDUihyNSkJLyogbG9hZCB1cCBmcHNjciB2YWx1ZSAqLwotCW10ZnNmCTB4ZmYsMAorCU1URlNGX0woMCkKIAlsZmQJMCwwKHIzKQogCXN0ZnMJMCwwKHI0KQogCW1mZnMJMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwppbmRleCBhMDU3OWU4Li5iMjViMjU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfMzIuUwpAQCAtOTczLDYgKzk3MywxMyBAQAogICAgICAgICBiICAgICAgIF9fc2Vjb25kYXJ5X3N0YXJ0CiAjZW5kaWYgLyogQ09ORklHX0dFTUlOSSAqLwogCisJLmdsb2JsIF9fc2Vjb25kYXJ5X3N0YXJ0X21wYzg2eHgKK19fc2Vjb25kYXJ5X3N0YXJ0X21wYzg2eHg6CisJbWZzcHIJcjMsIFNQUk5fUElSCisJc3R3CXIzLCBfX3NlY29uZGFyeV9ob2xkX2Fja25vd2xlZGdlQGwoMCkKKwltcglyMjQsIHIzCQkJLyogY3B1ICMgKi8KKwliCV9fc2Vjb25kYXJ5X3N0YXJ0CisKIAkuZ2xvYmwJX19zZWNvbmRhcnlfc3RhcnRfcG1hY18wCiBfX3NlY29uZGFyeV9zdGFydF9wbWFjXzA6CiAJLyogTkIgdGhlIGVudHJpZXMgZm9yIGNwdXMgMCwgMSwgMiBtdXN0IGVhY2ggb2NjdXB5IDggYnl0ZXMuICovCkBAIC0xMDg4LDcgKzEwOTUsMTIgQEAKIAlMT0FEX0JBVCgxLHIzLHI0LHI1KQogCUxPQURfQkFUKDIscjMscjQscjUpCiAJTE9BRF9CQVQoMyxyMyxyNCxyNSkKLQorQkVHSU5fRlRSX1NFQ1RJT04KKwlMT0FEX0JBVCg0LHIzLHI0LHI1KQorCUxPQURfQkFUKDUscjMscjQscjUpCisJTE9BRF9CQVQoNixyMyxyNCxyNSkKKwlMT0FEX0JBVCg3LHIzLHI0LHI1KQorRU5EX0ZUUl9TRUNUSU9OX0lGU0VUKENQVV9GVFJfSEFTX0hJR0hfQkFUUykKIAlibHIKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKaW5kZXggYjdkMTQwNC4uODMxYWNiZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzY0LlMKQEAgLTMxNiw2ICszMTYsMjEgQEAKIAltdHNwcglTUFJOX1NQUkcxLHIxMzsJCS8qIHNhdmUgcjEzICovCVwKIAlFWENFUFRJT05fUFJPTE9HX1BTRVJJRVMoUEFDQV9FWEdFTiwgbGFiZWwjI19jb21tb24pCiAKKyNkZWZpbmUgSFNURF9FWENFUFRJT05fUFNFUklFUyhuLCBsYWJlbCkJCVwKKwkuID0gbjsJCQkJCQlcCisJLmdsb2JsIGxhYmVsIyNfcFNlcmllczsJCQkJXAorbGFiZWwjI19wU2VyaWVzOgkJCQkJXAorCUhNVF9NRURJVU07CQkJCQlcCisJbXRzcHIJU1BSTl9TUFJHMSxyMjA7CQkvKiBzYXZlIHIyMCAqLwlcCisJbWZzcHIJcjIwLFNQUk5fSFNSUjA7CQkvKiBjb3B5IEhTUlIwIHRvIFNSUjAgKi8gXAorCW10c3ByCVNQUk5fU1JSMCxyMjA7CQkJCVwKKwltZnNwcglyMjAsU1BSTl9IU1JSMTsJCS8qIGNvcHkgSFNSUjAgdG8gU1JSMCAqLyBcCisJbXRzcHIJU1BSTl9TUlIxLHIyMDsJCQkJXAorCW1mc3ByCXIyMCxTUFJOX1NQUkcxOwkJLyogcmVzdG9yZSByMjAgKi8gXAorCW10c3ByCVNQUk5fU1BSRzEscjEzOwkJLyogc2F2ZSByMTMgKi8JXAorCUVYQ0VQVElPTl9QUk9MT0dfUFNFUklFUyhQQUNBX0VYR0VOLCBsYWJlbCMjX2NvbW1vbikKKworCiAjZGVmaW5lIFNURF9FWENFUFRJT05fSVNFUklFUyhuLCBsYWJlbCwgYXJlYSkJCVwKIAkuZ2xvYmwgbGFiZWwjI19pU2VyaWVzOwkJCQlcCiBsYWJlbCMjX2lTZXJpZXM6CQkJCQlcCkBAIC01NDQsOCArNTU5LDE3IEBACiAKIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHhmMjAsIGFsdGl2ZWNfdW5hdmFpbGFibGUpCiAKKyNpZmRlZiBDT05GSUdfQ0JFX1JBUworCUhTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxMjAwLCBjYmVfc3lzdGVtX2Vycm9yKQorI2VuZGlmIC8qIENPTkZJR19DQkVfUkFTICovCiAJU1REX0VYQ0VQVElPTl9QU0VSSUVTKDB4MTMwMCwgaW5zdHJ1Y3Rpb25fYnJlYWtwb2ludCkKKyNpZmRlZiBDT05GSUdfQ0JFX1JBUworCUhTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxNjAwLCBjYmVfbWFpbnRlbmFuY2UpCisjZW5kaWYgLyogQ09ORklHX0NCRV9SQVMgKi8KIAlTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxNzAwLCBhbHRpdmVjX2Fzc2lzdCkKKyNpZmRlZiBDT05GSUdfQ0JFX1JBUworCUhTVERfRVhDRVBUSU9OX1BTRVJJRVMoMHgxODAwLCBjYmVfdGhlcm1hbCkKKyNlbmRpZiAvKiBDT05GSUdfQ0JFX1JBUyAqLwogCiAJLiA9IDB4MzAwMAogCkBAIC04MjcsNiArODUxLDExIEBACiAjZWxzZQogCVNURF9FWENFUFRJT05fQ09NTU9OKDB4MTcwMCwgYWx0aXZlY19hc3Npc3QsIC51bmtub3duX2V4Y2VwdGlvbikKICNlbmRpZgorI2lmZGVmIENPTkZJR19DQkVfUkFTCisJU1REX0VYQ0VQVElPTl9DT01NT04oMHgxMjAwLCBjYmVfc3lzdGVtX2Vycm9yLCAuY2JlX3N5c3RlbV9lcnJvcl9leGNlcHRpb24pCisJU1REX0VYQ0VQVElPTl9DT01NT04oMHgxNjAwLCBjYmVfbWFpbnRlbmFuY2UsIC5jYmVfbWFpbnRlbmFuY2VfZXhjZXB0aW9uKQorCVNURF9FWENFUFRJT05fQ09NTU9OKDB4MTgwMCwgY2JlX3RoZXJtYWwsIC5jYmVfdGhlcm1hbF9leGNlcHRpb24pCisjZW5kaWYgLyogQ09ORklHX0NCRV9SQVMgKi8KIAogLyoKICAqIEhlcmUgd2UgaGF2ZSBkZXRlY3RlZCB0aGF0IHRoZSBrZXJuZWwgc3RhY2sgcG9pbnRlciBpcyBiYWQuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbWFwLmMKaW5kZXggZmQ4MjE0Yy4uYTEzYTkzZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21hcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tYXAuYwpAQCAtMTA2LDggKzEwNiw2IEBACiAKIHZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaWYgKCFfSU9fSVNfVkFMSUQocG9ydCkpCi0JCXJldHVybiBOVUxMOwogCXJldHVybiAodm9pZCBfX2lvbWVtICopIChwb3J0K3BjaV9pb19iYXNlKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pb21tdS5jCmluZGV4IDRlYmE2MGEuLjdjYjc3YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lvbW11LmMKQEAgLTQxOCwxMCArNDE4LDExIEBACiAgKiBCdWlsZCBhIGlvbW11X3RhYmxlIHN0cnVjdHVyZS4gIFRoaXMgY29udGFpbnMgYSBiaXQgbWFwIHdoaWNoCiAgKiBpcyB1c2VkIHRvIG1hbmFnZSBhbGxvY2F0aW9uIG9mIHRoZSB0Y2Ugc3BhY2UuCiAgKi8KLXN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfaW5pdF90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKK3N0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfaW5pdF90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgaW50IG5pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHN6OwogCXN0YXRpYyBpbnQgd2VsY29tZWQgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJLyogU2V0IGFzaWRlIDEvNCBvZiB0aGUgdGFibGUgZm9yIGxhcmdlIGFsbG9jYXRpb25zLiAqLwogCXRibC0+aXRfaGFsZnBvaW50ID0gdGJsLT5pdF9zaXplICogMyAvIDQ7CkBAIC00MjksMTAgKzQzMCwxMCBAQAogCS8qIG51bWJlciBvZiBieXRlcyBuZWVkZWQgZm9yIHRoZSBiaXRtYXAgKi8KIAlzeiA9ICh0YmwtPml0X3NpemUgKyA3KSA+PiAzOwogCi0JdGJsLT5pdF9tYXAgPSAodW5zaWduZWQgbG9uZyAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgZ2V0X29yZGVyKHN6KSk7Ci0JaWYgKCF0YmwtPml0X21hcCkKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShuaWQsIEdGUF9BVE9NSUMsIGdldF9vcmRlcihzeikpOworCWlmICghcGFnZSkKIAkJcGFuaWMoImlvbW11X2luaXRfdGFibGU6IENhbid0IGFsbG9jYXRlICVsZCBieXRlc1xuIiwgc3opOwotCisJdGJsLT5pdF9tYXAgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJbWVtc2V0KHRibC0+aXRfbWFwLCAwLCBzeik7CiAKIAl0YmwtPml0X2hpbnQgPSAwOwpAQCAtNTM2LDExICs1MzcsMTIgQEAKICAqIHRvIHRoZSBkbWEgYWRkcmVzcyAobWFwcGluZykgb2YgdGhlIGZpcnN0IHBhZ2UuCiAgKi8KIHZvaWQgKmlvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKLQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBnZnBfdCBmbGFnKQorCQlkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCB1bnNpZ25lZCBsb25nIG1hc2ssIGdmcF90IGZsYWcsIGludCBub2RlKQogewogCXZvaWQgKnJldCA9IE5VTEw7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwogCXVuc2lnbmVkIGludCBucGFnZXMsIG9yZGVyOworCXN0cnVjdCBwYWdlICpwYWdlOwogCiAJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CiAJbnBhZ2VzID0gc2l6ZSA+PiBQQUdFX1NISUZUOwpAQCAtNTYwLDkgKzU2MiwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIEFsbG9jIGVub3VnaCBwYWdlcyAoYW5kIHBvc3NpYmx5IG1vcmUpICovCi0JcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWcsIG9yZGVyKTsKLQlpZiAoIXJldCkKKwlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBmbGFnLCBvcmRlcik7CisJaWYgKCFwYWdlKQogCQlyZXR1cm4gTlVMTDsKKwlyZXQgPSBwYWdlX2FkZHJlc3MocGFnZSk7CiAJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CiAKIAkvKiBTZXQgdXAgdGNlcyB0byBjb3ZlciB0aGUgYWxsb2NhdGVkIHJhbmdlICovCkBAIC01NzAsOSArNTczLDkgQEAKIAkJCSAgICAgIG1hc2sgPj4gUEFHRV9TSElGVCwgb3JkZXIpOwogCWlmIChtYXBwaW5nID09IERNQV9FUlJPUl9DT0RFKSB7CiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcmV0LCBvcmRlcik7Ci0JCXJldCA9IE5VTEw7Ci0JfSBlbHNlCi0JCSpkbWFfaGFuZGxlID0gbWFwcGluZzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCSpkbWFfaGFuZGxlID0gbWFwcGluZzsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwppbmRleCA1N2Q1NjBjLi40MGQ0YzE0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CkBAIC0zNzksOCArMzgwLDggQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogI2lmZGVmIENPTkZJR19JUlFTVEFDS1MKLXN0cnVjdCB0aHJlYWRfaW5mbyAqc29mdGlycV9jdHhbTlJfQ1BVU107Ci1zdHJ1Y3QgdGhyZWFkX2luZm8gKmhhcmRpcnFfY3R4W05SX0NQVVNdOworc3RydWN0IHRocmVhZF9pbmZvICpzb2Z0aXJxX2N0eFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5Oworc3RydWN0IHRocmVhZF9pbmZvICpoYXJkaXJxX2N0eFtOUl9DUFVTXSBfX3JlYWRfbW9zdGx5OwogCiB2b2lkIGlycV9jdHhfaW5pdCh2b2lkKQogewpAQCAtNDM2LDYgKzQzNywzMCBAQAogfQogRVhQT1JUX1NZTUJPTChkb19zb2Z0aXJxKTsKIAorI2lmZGVmIENPTkZJR19QQ0lfTVNJCitpbnQgcGNpX2VuYWJsZV9tc2koc3RydWN0IHBjaV9kZXYgKiBwZGV2KQoreworCWlmIChwcGNfbWQuZW5hYmxlX21zaSkKKwkJcmV0dXJuIHBwY19tZC5lbmFibGVfbXNpKHBkZXYpOworCWVsc2UKKwkJcmV0dXJuIC0xOworfQorCit2b2lkIHBjaV9kaXNhYmxlX21zaShzdHJ1Y3QgcGNpX2RldiAqIHBkZXYpCit7CisJaWYgKHBwY19tZC5kaXNhYmxlX21zaSkKKwkJcHBjX21kLmRpc2FibGVfbXNpKHBkZXYpOworfQorCit2b2lkIHBjaV9zY2FuX21zaV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikge30KK2ludCBwY2lfZW5hYmxlX21zaXgoc3RydWN0IHBjaV9kZXYqIGRldiwgc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXMsIGludCBudmVjKSB7cmV0dXJuIC0xO30KK3ZvaWQgcGNpX2Rpc2FibGVfbXNpeChzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7fQordm9pZCBtc2lfcmVtb3ZlX3BjaV9pcnFfdmVjdG9ycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KSB7fQordm9pZCBkaXNhYmxlX21zaV9tb2RlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwb3MsIGludCB0eXBlKSB7fQordm9pZCBwY2lfbm9fbXNpKHZvaWQpIHt9CisKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1BQQzY0CiBzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9ub2lycWRpc3RyaWIoY2hhciAqc3RyKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9scGFyY2ZnLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwppbmRleCAyY2JkZTg2Li5jMDJkZWFhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2xwYXJjZmcuYwpAQCAtNTIxLDEwICs1MjEsMTAgQEAKIAogCWN1cnJlbnRfd2VpZ2h0ID0gKHJlc291cmNlID4+IDUgKiA4KSAmIDB4RkY7CiAKLQlwcl9kZWJ1ZygiJXM6IGN1cnJlbnRfZW50aXRsZWQgPSAlbHUsIGN1cnJlbnRfd2VpZ2h0ID0gJWx1XG4iLAorCXByX2RlYnVnKCIlczogY3VycmVudF9lbnRpdGxlZCA9ICVsdSwgY3VycmVudF93ZWlnaHQgPSAldVxuIiwKIAkJIF9fRlVOQ1RJT05fXywgY3VycmVudF9lbnRpdGxlZCwgY3VycmVudF93ZWlnaHQpOwogCi0JcHJfZGVidWcoIiVzOiBuZXdfZW50aXRsZWQgPSAlbHUsIG5ld193ZWlnaHQgPSAlbHVcbiIsCisJcHJfZGVidWcoIiVzOiBuZXdfZW50aXRsZWQgPSAlbHUsIG5ld193ZWlnaHQgPSAldVxuIiwKIAkJIF9fRlVOQ1RJT05fXywgKm5ld19lbnRpdGxlZF9wdHIsICpuZXdfd2VpZ2h0X3B0cik7CiAKIAlyZXR2YWwgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9TRVRfUFBQLCAqbmV3X2VudGl0bGVkX3B0ciwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvbWFjaGluZV9rZXhlY182NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKaW5kZXggZWUxNjZjNS4uYThmYTA0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjXzY0LmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3BhY2EuaD4KKyNpbmNsdWRlIDxhc20vbG1iLmg+CiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgkvKiBfZW5kICovCiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTMzNSw3ICszMzYsMTA1IEBACiAJb2Zfbm9kZV9wdXQobm9kZSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgY3Jhc2hrX2Jhc2VfcHJvcCA9IHsKKwkubmFtZSA9ICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwKKwkubGVuZ3RoID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCS52YWx1ZSA9ICh1bnNpZ25lZCBjaGFyICopJmNyYXNoa19yZXMuc3RhcnQsCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFzaGtfc2l6ZTsKKworc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSBjcmFzaGtfc2l6ZV9wcm9wID0geworCS5uYW1lID0gImxpbnV4LGNyYXNoa2VybmVsLXNpemUiLAorCS5sZW5ndGggPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJLnZhbHVlID0gKHVuc2lnbmVkIGNoYXIgKikmY3Jhc2hrX3NpemUsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgZXhwb3J0X2NyYXNoa192YWx1ZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvY2hvc2VuIik7CisJaWYgKCFub2RlKQorCQlyZXR1cm47CisKKwkvKiBUaGVyZSBtaWdodCBiZSBleGlzdGluZyBjcmFzaCBrZXJuZWwgcHJvcGVydGllcywgYnV0IHdlIGNhbid0CisJICogYmUgc3VyZSB3aGF0J3MgaW4gdGhlbSwgc28gcmVtb3ZlIHRoZW0uICovCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImxpbnV4LGNyYXNoa2VybmVsLWJhc2UiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcHJvbV9yZW1vdmVfcHJvcGVydHkobm9kZSwgcHJvcCk7CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAibGludXgsY3Jhc2hrZXJuZWwtc2l6ZSIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwcm9tX3JlbW92ZV9wcm9wZXJ0eShub2RlLCBwcm9wKTsKKworCWlmIChjcmFzaGtfcmVzLnN0YXJ0ICE9IDApIHsKKwkJcHJvbV9hZGRfcHJvcGVydHkobm9kZSwgJmNyYXNoa19iYXNlX3Byb3ApOworCQljcmFzaGtfc2l6ZSA9IGNyYXNoa19yZXMuZW5kIC0gY3Jhc2hrX3Jlcy5zdGFydCArIDE7CisJCXByb21fYWRkX3Byb3BlcnR5KG5vZGUsICZjcmFzaGtfc2l6ZV9wcm9wKTsKKwl9CisKKwlvZl9ub2RlX3B1dChub2RlKTsKK30KKwogdm9pZCBfX2luaXQga2V4ZWNfc2V0dXAodm9pZCkKIHsKIAlleHBvcnRfaHRhYl92YWx1ZXMoKTsKKwlleHBvcnRfY3Jhc2hrX3ZhbHVlcygpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9jcmFzaGsoY2hhciAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJc2l6ZSA9IG1lbXBhcnNlKHAsICZwKTsKKworCWlmICgqcCA9PSAnQCcpCisJCWNyYXNoa19yZXMuc3RhcnQgPSBtZW1wYXJzZShwICsgMSwgJnApOworCWVsc2UKKwkJY3Jhc2hrX3Jlcy5zdGFydCA9IEtEVU1QX0tFUk5FTEJBU0U7CisKKwljcmFzaGtfcmVzLmVuZCA9IGNyYXNoa19yZXMuc3RhcnQgKyBzaXplIC0gMTsKKworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oImNyYXNoa2VybmVsIiwgZWFybHlfcGFyc2VfY3Jhc2hrKTsKKwordm9pZCBfX2luaXQgcmVzZXJ2ZV9jcmFzaGtlcm5lbCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmIChjcmFzaGtfcmVzLnN0YXJ0ID09IDApCisJCXJldHVybjsKKworCS8qIFdlIG1pZ2h0IGhhdmUgZ290IHRoZXNlIHZhbHVlcyB2aWEgdGhlIGNvbW1hbmQgbGluZSBvciB0aGUKKwkgKiBkZXZpY2UgdHJlZSwgZWl0aGVyIHdheSBzYW5pdGlzZSB0aGVtIG5vdy4gKi8KKworCXNpemUgPSBjcmFzaGtfcmVzLmVuZCAtIGNyYXNoa19yZXMuc3RhcnQgKyAxOworCisJaWYgKGNyYXNoa19yZXMuc3RhcnQgIT0gS0RVTVBfS0VSTkVMQkFTRSkKKwkJcHJpbnRrKCJDcmFzaCBrZXJuZWwgbG9jYXRpb24gbXVzdCBiZSAweCV4XG4iLAorCQkJCUtEVU1QX0tFUk5FTEJBU0UpOworCisJY3Jhc2hrX3Jlcy5zdGFydCA9IEtEVU1QX0tFUk5FTEJBU0U7CisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJY3Jhc2hrX3Jlcy5lbmQgPSBjcmFzaGtfcmVzLnN0YXJ0ICsgc2l6ZSAtIDE7CisKKwkvKiBDcmFzaCBrZXJuZWwgdHJ1bXBzIG1lbW9yeSBsaW1pdCAqLworCWlmIChtZW1vcnlfbGltaXQgJiYgbWVtb3J5X2xpbWl0IDw9IGNyYXNoa19yZXMuZW5kKSB7CisJCW1lbW9yeV9saW1pdCA9IGNyYXNoa19yZXMuZW5kICsgMTsKKwkJcHJpbnRrKCJBZGp1c3RlZCBtZW1vcnkgbGltaXQgZm9yIGNyYXNoa2VybmVsLCBub3cgMHglbHhcbiIsCisJCQkJbWVtb3J5X2xpbWl0KTsKKwl9CisKKwlsbWJfcmVzZXJ2ZShjcmFzaGtfcmVzLnN0YXJ0LCBzaXplKTsKK30KKworaW50IG92ZXJsYXBzX2NyYXNoa2VybmVsKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlyZXR1cm4gKHN0YXJ0ICsgc2l6ZSkgPiBjcmFzaGtfcmVzLnN0YXJ0ICYmIHN0YXJ0IDw9IGNyYXNoa19yZXMuZW5kOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzMyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwppbmRleCBiZTk4MjAyLi4wMWQzOTE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfMzIuUwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJbHd6CXI0LDAocjQpCiAJYWRkCXI0LHI0LHIzCiAJbHd6CXI1LENQVV9TUEVDX1NFVFVQKHI0KQotCWNtcGkJMCxyNSwwCisJY21wd2kJMCxyNSwwCiAJYWRkCXI1LHI1LHIzCiAJYmVxbHIKIAltdGN0cglyNQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9taXNjXzY0LlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwppbmRleCAyNzc4Y2NlLi5lODg4M2Q0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21pc2NfNjQuUwpAQCAtNDgyLDcgKzQ4Miw5IEBACiAJc3ViCXIwLHIzLHI1CiAJc3RkCXIwLDAocjQpCiAJbGQJcjQsQ1BVX1NQRUNfU0VUVVAocjMpCisJY21wZGkJMCxyNCwwCiAJYWRkCXI0LHI0LHI1CisJYmVxbHIKIAlsZAlyNCwwKHI0KQogCWFkZAlyNCxyNCxyNQogCW10Y3RyCXI0CkBAIC03NjgsOSArNzcwLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCiAKLV9HTE9CQUwoX19zZXR1cF9jcHVfcG93ZXIzKQotCWJscgotCiBfR0xPQkFMKGV4ZWN2ZSkKIAlsaQlyMCxfX05SX2V4ZWN2ZQogCXNjCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL252cmFtXzY0LmMKaW5kZXggYWRhNTBhYS4uNjk2MGYwOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9udnJhbV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvbnZyYW1fNjQuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5keFx0XHRzaWdcdGNoa3NcdGxlblx0bmFtZVxuIik7CiAJbGlzdF9mb3JfZWFjaChwLCAmbnZyYW1fcGFydC0+cGFydGl0aW9uKSB7CiAJCXRtcF9wYXJ0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgbnZyYW1fcGFydGl0aW9uLCBwYXJ0aXRpb24pOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlZCAgICBcdCUwMnhcdCUwMnhcdCVkXHQlc1xuIiwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJTRkICAgIFx0JTAyeFx0JTAyeFx0JWRcdCVzXG4iLAogCQkgICAgICAgdG1wX3BhcnQtPmluZGV4LCB0bXBfcGFydC0+aGVhZGVyLnNpZ25hdHVyZSwKIAkJICAgICAgIHRtcF9wYXJ0LT5oZWFkZXIuY2hlY2tzdW0sIHRtcF9wYXJ0LT5oZWFkZXIubGVuZ3RoLAogCQkgICAgICAgdG1wX3BhcnQtPmhlYWRlci5uYW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV8zMi5jCmluZGV4IGIxMjlkMmUuLmI1NDMxY2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfMzIuYwpAQCAtMTExMyw5ICsxMTEzLDEwIEBACiAJaW50CWk7CiAJaW50CXJjID0gMDsKIAotI2RlZmluZSBwdXNoX2VuZChyZXMsIHNpemUpIGRvIHsgdW5zaWduZWQgbG9uZyBfX3N6ID0gKHNpemUpIDsgXAotCXJlcy0+ZW5kID0gKChyZXMtPmVuZCArIF9fc3opIC8gKF9fc3ogKyAxKSkgKiAoX19zeiArIDEpICsgX19zejsgXAotICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIHB1c2hfZW5kKHJlcywgbWFzaykgZG8gewkJXAorCUJVR19PTigobWFzaysxKSAmIG1hc2spOwkJXAorCXJlcy0+ZW5kID0gKHJlcy0+ZW5kICsgbWFzaykgfCBtYXNrOwlcCit9IHdoaWxlICgwKQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCXUxNiBjbGFzcyA9IGRldi0+Y2xhc3MgPj4gODsKQEAgLTE2NTMsNyArMTY1NCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKIAkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCiAJCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpXzY0LmMKaW5kZXggNGM0NDQ5Yi4uMjQ3OTM3ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV82NC5jCkBAIC00MiwxNCArNDIsNiBAQAogdW5zaWduZWQgbG9uZyBwY2lfcHJvYmVfb25seSA9IDE7CiBpbnQgcGNpX2Fzc2lnbl9hbGxfYnVzZXMgPSAwOwogCi0vKgotICogbGVnYWwgSU8gcGFnZXMgdW5kZXIgTUFYX0lTQV9QT1JULiAgVGhpcyBpcyB0byBlbnN1cmUgd2UgZG9uJ3QgdG91Y2gKLSAqIGRldmljZXMgd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8uCi0gKi8KLXVuc2lnbmVkIGxvbmcgaW9fcGFnZV9tYXNrOwotCi1FWFBPUlRfU1lNQk9MKGlvX3BhZ2VfbWFzayk7Ci0KICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KIHN0YXRpYyB2b2lkIGZpeHVwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIHN0YXRpYyB2b2lkIGRvX2J1c19zZXR1cChzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKQEAgLTIzNSw4ICsyMjcsMTAgQEAKIAlwY2lfc2V0dXBfcGNpX2NvbnRyb2xsZXIocGhiKTsKIAlwaGItPmFyY2hfZGF0YSA9IGRldjsKIAlwaGItPmlzX2R5bmFtaWMgPSBtZW1faW5pdF9kb25lOwotCWlmIChkZXYpCisJaWYgKGRldikgeworCQlQSEJfU0VUX05PREUocGhiLCBvZl9ub2RlX3RvX25pZChkZXYpKTsKIAkJYWRkX2xpbnV4X3BjaV9kb21haW4oZGV2LCBwaGIpOworCX0KIAlyZXR1cm4gcGhiOwogfQogCkBAIC0zOTYsNyArMzkwLDcgQEAKIAogCWRldi0+Y3VycmVudF9zdGF0ZSA9IDQ7CQkvKiB1bmtub3duIHBvd2VyIHN0YXRlICovCiAKLQlpZiAoIXN0cmNtcCh0eXBlLCAicGNpIikpIHsKKwlpZiAoIXN0cmNtcCh0eXBlLCAicGNpIikgfHwgIXN0cmNtcCh0eXBlLCAicGNpZXgiKSkgewogCQkvKiBhIFBDSS1QQ0kgYnJpZGdlICovCiAJCWRldi0+aGRyX3R5cGUgPSBQQ0lfSEVBREVSX1RZUEVfQlJJREdFOwogCQlkZXYtPnJvbV9iYXNlX3JlZyA9IFBDSV9ST01fQUREUkVTUzE7CkBAIC02MDUsNyArNTk5LDcgQEAKIAlpU2VyaWVzX3BjaWJpb3NfaW5pdCgpOyAKICNlbmRpZgogCi0JcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CiAKIAkvKiBTY2FuIGFsbCBvZiB0aGUgcmVjb3JkZWQgUENJIGNvbnRyb2xsZXJzLiAgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaG9zZSwgdG1wLCAmaG9zZV9saXN0LCBsaXN0X25vZGUpIHsKQEAgLTYzMCwxNCArNjI0LDE0IEBACiAJLyogQ2FjaGUgdGhlIGxvY2F0aW9uIG9mIHRoZSBJU0EgYnJpZGdlIChpZiB3ZSBoYXZlIG9uZSkgKi8KIAlwcGM2NF9pc2FicmlkZ2VfZGV2ID0gcGNpX2dldF9jbGFzcyhQQ0lfQ0xBU1NfQlJJREdFX0lTQSA8PCA4LCBOVUxMKTsKIAlpZiAocHBjNjRfaXNhYnJpZGdlX2RldiAhPSBOVUxMKQotCQlwcmludGsoIklTQSBicmlkZ2UgYXQgJXNcbiIsIHBjaV9uYW1lKHBwYzY0X2lzYWJyaWRnZV9kZXYpKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIklTQSBicmlkZ2UgYXQgJXNcbiIsIHBjaV9uYW1lKHBwYzY0X2lzYWJyaWRnZV9kZXYpKTsKIAogI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogCS8qIG1hcCBpbiBQQ0kgSS9PIHNwYWNlICovCiAJcGhic19yZW1hcF9pbygpOwogI2VuZGlmCiAKLQlwcmludGsoIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgZG9uZVxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlBDSTogUHJvYmluZyBQQ0kgaGFyZHdhcmUgZG9uZVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgwNCw3ICs3OTgsNyBAQAogCWVsc2UKIAkJcHJvdCB8PSBfUEFHRV9HVUFSREVEOwogCi0JcHJpbnRrKCJQQ0kgbWFwIGZvciAlczolbHgsIHByb3Q6ICVseFxuIiwgcGNpX25hbWUoZGV2KSwgcnAtPnN0YXJ0LAorCXByaW50ayhLRVJOX0RFQlVHICJQQ0kgbWFwIGZvciAlczolbHgsIHByb3Q6ICVseFxuIiwgcGNpX25hbWUoZGV2KSwgcnAtPnN0YXJ0LAogCSAgICAgICBwcm90KTsKIAogCXJldHVybiBfX3BncHJvdChwcm90KTsKQEAgLTg4Myw3ICs4NzcsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZtYS0+dm1fcGdvZmYgPSBvZmZzZXQgPj4gUEFHRV9TSElGVDsKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1NITSB8IFZNX0xPQ0tFRCB8IFZNX0lPOwogCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wY2lfbW1hcF9zZXRfcGdwcm90KGRldiwgcnAsCiAJCQkJCQkgIHZtYS0+dm1fcGFnZV9wcm90LAogCQkJCQkJICBtbWFwX3N0YXRlLCB3cml0ZV9jb21iaW5lKTsKQEAgLTg5NCw4ICs4ODcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KLXN0YXRpYyBzc2l6ZV90IHBjaV9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIHNzaXplX3QgcGNpX3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKQEAgLTkwNywxMyArOTAwLDEwIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXMiLCBucC0+ZnVsbF9uYW1lKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBwY2lfc2hvd19kZXZzcGVjLCBOVUxMKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0gKi8KIAogdm9pZCBwY2liaW9zX2FkZF9wbGF0Zm9ybV9lbnRyaWVzKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotI2lmZGVmIENPTkZJR19QUENfTVVMVElQTEFURk9STQogCWRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNICovCiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX01VTFRJUExBVEZPUk0KQEAgLTExMDQsOCArMTA5NCw2IEBACiAJCQlwY2lfcHJvY2Vzc19JU0FfT0ZfcmFuZ2VzKGlzYV9kbiwgaG9zZS0+aW9fYmFzZV9waHlzLAogCQkJCQkJaG9zZS0+aW9fYmFzZV92aXJ0KTsKIAkJCW9mX25vZGVfcHV0KGlzYV9kbik7Ci0JCQkvKiBBbGxvdyBhbGwgSU8gKi8KLQkJCWlvX3BhZ2VfbWFzayA9IC0xOwogCQl9CiAJfQogCkBAIC0xMjEyLDcgKzEyMDAsNyBAQAogCQlyZXR1cm4gMTsKIAlpZiAoc3RhcnRfcGh5cyA9PSAwKQogCQlyZXR1cm4gMTsKLQlwcmludGsoIm1hcHBpbmcgSU8gJWx4IC0+ICVseCwgc2l6ZTogJWx4XG4iLCBzdGFydF9waHlzLCBzdGFydF92aXJ0LCBzaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibWFwcGluZyBJTyAlbHggLT4gJWx4LCBzaXplOiAlbHhcbiIsIHN0YXJ0X3BoeXMsIHN0YXJ0X3ZpcnQsIHNpemUpOwogCWlmIChfX2lvcmVtYXBfZXhwbGljaXQoc3RhcnRfcGh5cywgc3RhcnRfdmlydCwgc2l6ZSwKIAkJCSAgICAgICBfUEFHRV9OT19DQUNIRSB8IF9QQUdFX0dVQVJERUQpKQogCQlyZXR1cm4gMTsKQEAgLTEyMzIsMjcgKzEyMjAsMTMgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBmaXh1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgbWFzaywgb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKWhvc2UtPmlvX2Jhc2VfdmlydCAtIHBjaV9pb19iYXNlOwogCi0JCXN0YXJ0ID0gcmVzLT5zdGFydCArPSBvZmZzZXQ7Ci0JCWVuZCA9IHJlcy0+ZW5kICs9IG9mZnNldDsKLQotCQkvKiBOZWVkIHRvIGFsbG93IElPIGFjY2VzcyB0byBwYWdlcyB0aGF0IGFyZSBpbiB0aGUKLQkJICAgSVNBIHJhbmdlICovCi0JCWlmIChzdGFydCA8IE1BWF9JU0FfUE9SVCkgewotCQkJaWYgKGVuZCA+IE1BWF9JU0FfUE9SVCkKLQkJCQllbmQgPSBNQVhfSVNBX1BPUlQ7Ci0KLQkJCXN0YXJ0ID4+PSBQQUdFX1NISUZUOwotCQkJZW5kID4+PSBQQUdFX1NISUZUOwotCi0JCQkvKiBnZXQgdGhlIHJhbmdlIG9mIHBhZ2VzIGZvciB0aGUgbWFwICovCi0JCQltYXNrID0gKCgxIDw8IChlbmQrMSkpIC0gMSkgXiAoKDEgPDwgc3RhcnQpIC0gMSk7Ci0JCQlpb19wYWdlX21hc2sgfD0gbWFzazsKLQkJfQorCQlyZXMtPnN0YXJ0ICs9IG9mZnNldDsKKwkJcmVzLT5lbmQgKz0gb2Zmc2V0OwogCX0gZWxzZSBpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKSB7CiAJCXJlcy0+c3RhcnQgKz0gaG9zZS0+cGNpX21lbV9vZmZzZXQ7CiAJCXJlcy0+ZW5kICs9IGhvc2UtPnBjaV9tZW1fb2Zmc2V0OwpAQCAtMTQ0MiwzICsxNDE2LDEyIEBACiAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CisKKyNpZmRlZiBDT05GSUdfTlVNQQoraW50IHBjaWJ1c190b19ub2RlKHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIgPSBwY2lfYnVzX3RvX2hvc3QoYnVzKTsKKwlyZXR1cm4gcGhiLT5ub2RlOworfQorRVhQT1JUX1NZTUJPTChwY2lidXNfdG9fbm9kZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RpcmVjdF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZGlyZWN0X2lvbW11LmMKaW5kZXggZTFhMzJmOC4uNzJjZTA4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZGlyZWN0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZGlyZWN0X2lvbW11LmMKQEAgLTgyLDEzICs4MiwxNyBAQAogCXJldHVybiBtYXNrIDwgMHgxMDAwMDAwMDB1bGw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIHBjaV9kaXJlY3Rfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IHBjaV9kaXJlY3RfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBwY2lfZGlyZWN0X2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUgPSBwY2lfZGlyZWN0X21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IHBjaV9kaXJlY3RfdW5tYXBfc2luZ2xlLAorCS5tYXBfc2cgPSBwY2lfZGlyZWN0X21hcF9zZywKKwkudW5tYXBfc2cgPSBwY2lfZGlyZWN0X3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkID0gcGNpX2RpcmVjdF9kbWFfc3VwcG9ydGVkLAorfTsKKwogdm9pZCBfX2luaXQgcGNpX2RpcmVjdF9pb21tdV9pbml0KHZvaWQpCiB7Ci0JcGNpX2RtYV9vcHMuYWxsb2NfY29oZXJlbnQgPSBwY2lfZGlyZWN0X2FsbG9jX2NvaGVyZW50OwotCXBjaV9kbWFfb3BzLmZyZWVfY29oZXJlbnQgPSBwY2lfZGlyZWN0X2ZyZWVfY29oZXJlbnQ7Ci0JcGNpX2RtYV9vcHMubWFwX3NpbmdsZSA9IHBjaV9kaXJlY3RfbWFwX3NpbmdsZTsKLQlwY2lfZG1hX29wcy51bm1hcF9zaW5nbGUgPSBwY2lfZGlyZWN0X3VubWFwX3NpbmdsZTsKLQlwY2lfZG1hX29wcy5tYXBfc2cgPSBwY2lfZGlyZWN0X21hcF9zZzsKLQlwY2lfZG1hX29wcy51bm1hcF9zZyA9IHBjaV9kaXJlY3RfdW5tYXBfc2c7Ci0JcGNpX2RtYV9vcHMuZG1hX3N1cHBvcnRlZCA9IHBjaV9kaXJlY3RfZG1hX3N1cHBvcnRlZDsKKwlwY2lfZG1hX29wcyA9IHBjaV9kaXJlY3Rfb3BzOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKaW5kZXggMTJjNGM5ZS4uMWMxODk1MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vcFNlcmllc19yZWNvbmZpZy5oPgogI2luY2x1ZGUgPGFzbS9wcGMtcGNpLmg+CisjaW5jbHVkZSA8YXNtL2Zpcm13YXJlLmg+CiAKIC8qCiAgKiBUcmF2ZXJzZV9mdW5jIHRoYXQgaW5pdHMgdGhlIFBDSSBmaWVsZHMgb2YgdGhlIGRldmljZSBub2RlLgpAQCAtNTksNiArNjAsMTEgQEAKIAkJcGRuLT5idXNubyA9IChyZWdzWzBdID4+IDE2KSAmIDB4ZmY7CiAJCXBkbi0+ZGV2Zm4gPSAocmVnc1swXSA+PiA4KSAmIDB4ZmY7CiAJfQorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7CisJCXUzMiAqYnVzcCA9ICh1MzIgKilnZXRfcHJvcGVydHkoZG4sICJsaW51eCxzdWJidXMiLCBOVUxMKTsKKwkJaWYgKGJ1c3ApCisJCQlwZG4tPmJ1c3N1Ym5vID0gKmJ1c3A7CisJfQogCiAJcGRuLT5wY2lfZXh0X2NvbmZpZ19zcGFjZSA9ICh0eXBlICYmICp0eXBlID09IDEpOwogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfaW9tbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2lvbW11LmMKaW5kZXggYzFkOTVlMS4uMDY4OGIyNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9pb21tdS5jCkBAIC00NCwxNiArNDQsMTYgQEAKICAqLwogI2RlZmluZSBQQ0lfR0VUX0ROKGRldikgKChzdHJ1Y3QgZGV2aWNlX25vZGUgKikoKGRldiktPnN5c2RhdGEpKQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV90YWJsZSAqZGV2bm9kZV90YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpb21tdV90YWJsZSAqZGV2aWNlX3RvX3RhYmxlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCi0JaWYgKCFkZXYpIHsKKwlpZiAoIWh3ZGV2KSB7CiAJCXBkZXYgPSBwcGM2NF9pc2FicmlkZ2VfZGV2OwogCQlpZiAoIXBkZXYpCiAJCQlyZXR1cm4gTlVMTDsKIAl9IGVsc2UKLQkJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwkJcGRldiA9IHRvX3BjaV9kZXYoaHdkZXYpOwogCiAJcmV0dXJuIFBDSV9ETihQQ0lfR0VUX0ROKHBkZXYpKS0+aW9tbXVfdGFibGU7CiB9CkBAIC04NSwxNCArODUsMTUgQEAKIHN0YXRpYyB2b2lkICpwY2lfaW9tbXVfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqaHdkZXYsIHNpemVfdCBzaXplLAogCQkJICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZmxhZykKIHsKLQlyZXR1cm4gaW9tbXVfYWxsb2NfY29oZXJlbnQoZGV2bm9kZV90YWJsZShod2RldiksIHNpemUsIGRtYV9oYW5kbGUsCi0JCQlkZXZpY2VfdG9fbWFzayhod2RldiksIGZsYWcpOworCXJldHVybiBpb21tdV9hbGxvY19jb2hlcmVudChkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCBzaXplLCBkbWFfaGFuZGxlLAorCQkJZGV2aWNlX3RvX21hc2soaHdkZXYpLCBmbGFnLAorCQkJcGNpYnVzX3RvX25vZGUodG9fcGNpX2Rldihod2RldiktPmJ1cykpOwogfQogCiBzdGF0aWMgdm9pZCBwY2lfaW9tbXVfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCiAJCQkgdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSkKIHsKLQlpb21tdV9mcmVlX2NvaGVyZW50KGRldm5vZGVfdGFibGUoaHdkZXYpLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CisJaW9tbXVfZnJlZV9jb2hlcmVudChkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCBzaXplLCB2YWRkciwgZG1hX2hhbmRsZSk7CiB9CiAKIC8qIENyZWF0ZXMgVENFcyBmb3IgYSB1c2VyIHByb3ZpZGVkIGJ1ZmZlci4gIFRoZSB1c2VyIGJ1ZmZlciBtdXN0IGJlIApAQCAtMTA0LDcgKzEwNSw3IEBACiBzdGF0aWMgZG1hX2FkZHJfdCBwY2lfaW9tbXVfbWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgdm9pZCAqdmFkZHIsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JcmV0dXJuIGlvbW11X21hcF9zaW5nbGUoZGV2bm9kZV90YWJsZShod2RldiksIHZhZGRyLCBzaXplLAorCXJldHVybiBpb21tdV9tYXBfc2luZ2xlKGRldmljZV90b190YWJsZShod2RldiksIHZhZGRyLCBzaXplLAogCQkJICAgICAgICBkZXZpY2VfdG9fbWFzayhod2RldiksIGRpcmVjdGlvbik7CiB9CiAKQEAgLTExMiwyNyArMTEzLDI3IEBACiBzdGF0aWMgdm9pZCBwY2lfaW9tbXVfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCiAJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7Ci0JaW9tbXVfdW5tYXBfc2luZ2xlKGRldm5vZGVfdGFibGUoaHdkZXYpLCBkbWFfaGFuZGxlLCBzaXplLCBkaXJlY3Rpb24pOworCWlvbW11X3VubWFwX3NpbmdsZShkZXZpY2VfdG9fdGFibGUoaHdkZXYpLCBkbWFfaGFuZGxlLCBzaXplLCBkaXJlY3Rpb24pOwogfQogCiAKIHN0YXRpYyBpbnQgcGNpX2lvbW11X21hcF9zZyhzdHJ1Y3QgZGV2aWNlICpwZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKIAkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXJldHVybiBpb21tdV9tYXBfc2cocGRldiwgZGV2bm9kZV90YWJsZShwZGV2KSwgc2dsaXN0LAorCXJldHVybiBpb21tdV9tYXBfc2cocGRldiwgZGV2aWNlX3RvX3RhYmxlKHBkZXYpLCBzZ2xpc3QsCiAJCQluZWxlbXMsIGRldmljZV90b19tYXNrKHBkZXYpLCBkaXJlY3Rpb24pOwogfQogCiBzdGF0aWMgdm9pZCBwY2lfaW9tbXVfdW5tYXBfc2coc3RydWN0IGRldmljZSAqcGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCiAJCWludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbikKIHsKLQlpb21tdV91bm1hcF9zZyhkZXZub2RlX3RhYmxlKHBkZXYpLCBzZ2xpc3QsIG5lbGVtcywgZGlyZWN0aW9uKTsKKwlpb21tdV91bm1hcF9zZyhkZXZpY2VfdG9fdGFibGUocGRldiksIHNnbGlzdCwgbmVsZW1zLCBkaXJlY3Rpb24pOwogfQogCiAvKiBXZSBzdXBwb3J0IERNQSB0by9mcm9tIGFueSBtZW1vcnkgcGFnZSB2aWEgdGhlIGlvbW11ICovCiBzdGF0aWMgaW50IHBjaV9pb21tdV9kbWFfc3VwcG9ydGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCiB7Ci0Jc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXZub2RlX3RhYmxlKGRldik7CisJc3RydWN0IGlvbW11X3RhYmxlICp0YmwgPSBkZXZpY2VfdG9fdGFibGUoZGV2KTsKIAogCWlmICghdGJsIHx8IHRibC0+aXRfb2Zmc2V0ID4gbWFzaykgewogCQlwcmludGsoS0VSTl9JTkZPICJXYXJuaW5nOiBJT01NVSB0YWJsZSBvZmZzZXQgdG9vIGJpZyBmb3IgZGV2aWNlIG1hc2tcbiIpOwpAQCAtMTQ3LDEzICsxNDgsMTcgQEAKIAkJcmV0dXJuIDE7CiB9CiAKK3N0cnVjdCBkbWFfbWFwcGluZ19vcHMgcGNpX2lvbW11X29wcyA9IHsKKwkuYWxsb2NfY29oZXJlbnQgPSBwY2lfaW9tbXVfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBwY2lfaW9tbXVfZnJlZV9jb2hlcmVudCwKKwkubWFwX3NpbmdsZSA9IHBjaV9pb21tdV9tYXBfc2luZ2xlLAorCS51bm1hcF9zaW5nbGUgPSBwY2lfaW9tbXVfdW5tYXBfc2luZ2xlLAorCS5tYXBfc2cgPSBwY2lfaW9tbXVfbWFwX3NnLAorCS51bm1hcF9zZyA9IHBjaV9pb21tdV91bm1hcF9zZywKKwkuZG1hX3N1cHBvcnRlZCA9IHBjaV9pb21tdV9kbWFfc3VwcG9ydGVkLAorfTsKKwogdm9pZCBwY2lfaW9tbXVfaW5pdCh2b2lkKQogewotCXBjaV9kbWFfb3BzLmFsbG9jX2NvaGVyZW50ID0gcGNpX2lvbW11X2FsbG9jX2NvaGVyZW50OwotCXBjaV9kbWFfb3BzLmZyZWVfY29oZXJlbnQgPSBwY2lfaW9tbXVfZnJlZV9jb2hlcmVudDsKLQlwY2lfZG1hX29wcy5tYXBfc2luZ2xlID0gcGNpX2lvbW11X21hcF9zaW5nbGU7Ci0JcGNpX2RtYV9vcHMudW5tYXBfc2luZ2xlID0gcGNpX2lvbW11X3VubWFwX3NpbmdsZTsKLQlwY2lfZG1hX29wcy5tYXBfc2cgPSBwY2lfaW9tbXVfbWFwX3NnOwotCXBjaV9kbWFfb3BzLnVubWFwX3NnID0gcGNpX2lvbW11X3VubWFwX3NnOwotCXBjaV9kbWFfb3BzLmRtYV9zdXBwb3J0ZWQgPSBwY2lfaW9tbXVfZG1hX3N1cHBvcnRlZDsKKwlwY2lfZG1hX29wcyA9IHBjaV9pb21tdV9vcHM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2NfcHBjNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCmluZGV4IDNjMmNmNjYuLjJhYjhmMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY19wcGM2NC5jCkBAIC01Miw3ICs1Miw3IEBACiAJaWYgKCFyb290KQogCQlyZXR1cm4gMTsKIAotCWlmICghbWFjaGluZV9pcyhwc2VyaWVzKSAmJiAhbWFjaGluZV9pcyhjZWxsKSkKKwlpZiAoIW9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvcnRhcyIpKQogCQlyZXR1cm4gMDsKIAogCWlmICghcHJvY19ta2RpcigicnRhcyIsIHJvb3QpKQpAQCAtMTE1LDggKzExNSw2IEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkcCA9IFBERShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX1NITSB8IFZNX0xPQ0tFRDsKLQogCWlmICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+IGRwLT5zaXplKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwppbmRleCAyZGQ0N2QyLi5lNDczMjQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzA4LDYgKzcwOCw2MSBAQAogCXJldHVybiBwdXRfdXNlcih2YWwsICh1bnNpZ25lZCBpbnQgX191c2VyICopIGFkcik7CiB9CiAKK2ludCBzZXRfZW5kaWFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKKworCWlmICgodmFsID09IFBSX0VORElBTl9MSVRUTEUgJiYgIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1JFQUxfTEUpKSB8fAorCSAgICAodmFsID09IFBSX0VORElBTl9QUENfTElUVExFICYmICFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QUENfTEUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2YWwgPT0gUFJfRU5ESUFOX0JJRykKKwkJcmVncy0+bXNyICY9IH5NU1JfTEU7CisJZWxzZSBpZiAodmFsID09IFBSX0VORElBTl9MSVRUTEUgfHwgdmFsID09IFBSX0VORElBTl9QUENfTElUVExFKQorCQlyZWdzLT5tc3IgfD0gTVNSX0xFOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGdldF9lbmRpYW4oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRyKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gdHNrLT50aHJlYWQucmVnczsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QUENfTEUpICYmCisJICAgICFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9SRUFMX0xFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmVncyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZWdzLT5tc3IgJiBNU1JfTEUpIHsKKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX1JFQUxfTEUpKQorCQkJdmFsID0gUFJfRU5ESUFOX0xJVFRMRTsKKwkJZWxzZQorCQkJdmFsID0gUFJfRU5ESUFOX1BQQ19MSVRUTEU7CisJfSBlbHNlCisJCXZhbCA9IFBSX0VORElBTl9CSUc7CisKKwlyZXR1cm4gcHV0X3VzZXIodmFsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkcik7Cit9CisKK2ludCBzZXRfdW5hbGlnbl9jdGwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCB2YWwpCit7CisJdHNrLT50aHJlYWQuYWxpZ25fY3RsID0gdmFsOworCXJldHVybiAwOworfQorCitpbnQgZ2V0X3VuYWxpZ25fY3RsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIGFkcikKK3sKKwlyZXR1cm4gcHV0X3VzZXIodHNrLT50aHJlYWQuYWxpZ25fY3RsLCAodW5zaWduZWQgaW50IF9fdXNlciAqKWFkcik7Cit9CisKICNkZWZpbmUgVFJVTkNfUFRSKHgpCSgodHlwZW9mKHgpKSgoKHVuc2lnbmVkIGxvbmcpKHgpKSAmIDB4ZmZmZmZmZmYpKQogCiBpbnQgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgdXNwLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCA5YTA3Zjk3Li40ODM0NTVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtNTAsNiArNTAsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BTZXJpZXNfcmVjb25maWcuaD4KICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgogCiAjaWZkZWYgREVCVUcKICNkZWZpbmUgREJHKGZtdC4uLikgcHJpbnRrKEtFUk5fRVJSIGZtdCkKQEAgLTgzNiw2ICs4MzcsNDIgQEAKIAlyZXR1cm4gbWVtOwogfQogCitzdGF0aWMgaW50IF9faW5pdCBlYXJseV9wYXJzZV9tZW0oY2hhciAqcCkKK3sKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJbWVtb3J5X2xpbWl0ID0gUEFHRV9BTElHTihtZW1wYXJzZShwLCAmcCkpOworCURCRygibWVtb3J5IGxpbWl0ID0gMHglbHhcbiIsIG1lbW9yeV9saW1pdCk7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJtZW0iLCBlYXJseV9wYXJzZV9tZW0pOworCisvKgorICogVGhlIGRldmljZSB0cmVlIG1heSBiZSBhbGxvY2F0ZWQgYmVsb3cgb3VyIG1lbW9yeSBsaW1pdCwgb3IgaW5zaWRlIHRoZQorICogY3Jhc2gga2VybmVsIHJlZ2lvbiBmb3Iga2R1bXAuIElmIHNvLCBtb3ZlIGl0IG91dCBub3cuCisgKi8KK3N0YXRpYyB2b2lkIG1vdmVfZGV2aWNlX3RyZWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBzaXplOworCXZvaWQgKnA7CisKKwlEQkcoIi0+IG1vdmVfZGV2aWNlX3RyZWVcbiIpOworCisJc3RhcnQgPSBfX3BhKGluaXRpYWxfYm9vdF9wYXJhbXMpOworCXNpemUgPSBpbml0aWFsX2Jvb3RfcGFyYW1zLT50b3RhbHNpemU7CisKKwlpZiAoKG1lbW9yeV9saW1pdCAmJiAoc3RhcnQgKyBzaXplKSA+IG1lbW9yeV9saW1pdCkgfHwKKwkJCW92ZXJsYXBzX2NyYXNoa2VybmVsKHN0YXJ0LCBzaXplKSkgeworCQlwID0gX192YShsbWJfYWxsb2NfYmFzZShzaXplLCBQQUdFX1NJWkUsIGxtYi5ybW9fc2l6ZSkpOworCQltZW1jcHkocCwgaW5pdGlhbF9ib290X3BhcmFtcywgc2l6ZSk7CisJCWluaXRpYWxfYm9vdF9wYXJhbXMgPSAoc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyICopcDsKKwkJREJHKCJNb3ZlZCBkZXZpY2UgdHJlZSB0byAweCVwXG4iLCBwKTsKKwl9CisKKwlEQkcoIjwtIG1vdmVfZGV2aWNlX3RyZWVcbiIpOworfQogCiAvKioKICAqIHVuZmxhdHRlbnMgdGhlIGRldmljZS10cmVlIHBhc3NlZCBieSB0aGUgZmlybXdhcmUsIGNyZWF0aW5nIHRoZQpAQCAtOTExLDcgKzk0OCwxMCBAQAogCXtDUFVfRlRSX0NUUkwsIDAsCQkwLCAzLCAwfSwKIAl7Q1BVX0ZUUl9OT0VYRUNVVEUsIDAsCQkwLCA2LCAwfSwKIAl7Q1BVX0ZUUl9OT0RTSVNSQUxJR04sIDAsCTEsIDEsIDF9LAorI2lmIDAKKwkvKiBwdXQgdGhpcyBiYWNrIG9uY2Ugd2Uga25vdyBob3cgdG8gdGVzdCBpZiBmaXJtd2FyZSBkb2VzIDY0ayBJTyAqLwogCXtDUFVfRlRSX0NJX0xBUkdFX1BBR0UsIDAsCTEsIDIsIDB9LAorI2VuZGlmCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfY3B1X3BhX2ZlYXR1cmVzKHVuc2lnbmVkIGxvbmcgbm9kZSkKQEAgLTEwNzAsNiArMTExMCw3IEBACiAJCWlvbW11X2ZvcmNlX29uID0gMTsKICNlbmRpZgogCisJLyogbWVtPXggb24gdGhlIGNvbW1hbmQgbGluZSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSAqLwogIAlscHJvcCA9IG9mX2dldF9mbGF0X2R0X3Byb3Aobm9kZSwgImxpbnV4LG1lbW9yeS1saW1pdCIsIE5VTEwpOwogIAlpZiAobHByb3ApCiAgCQltZW1vcnlfbGltaXQgPSAqbHByb3A7CkBAIC0xMTIzLDE3ICsxMTY0LDYgQEAKIAogCURCRygiQ29tbWFuZCBsaW5lIGlzOiAlc1xuIiwgY21kX2xpbmUpOwogCi0JaWYgKHN0cnN0cihjbWRfbGluZSwgIm1lbT0iKSkgewotCQljaGFyICpwLCAqcTsKLQotCQlmb3IgKHEgPSBjbWRfbGluZTsgKHAgPSBzdHJzdHIocSwgIm1lbT0iKSkgIT0gMDsgKSB7Ci0JCQlxID0gcCArIDQ7Ci0JCQlpZiAocCA+IGNtZF9saW5lICYmIHBbLTFdICE9ICcgJykKLQkJCQljb250aW51ZTsKLQkJCW1lbW9yeV9saW1pdCA9IG1lbXBhcnNlKHEsICZxKTsKLQkJfQotCX0KLQogCS8qIGJyZWFrIG5vdyAqLwogCXJldHVybiAxOwogfQpAQCAtMTIzNyw5ICsxMjY3LDE3IEBACiB7CiAJdTY0IGJhc2UsIHNpemU7CiAJdTY0ICpyZXNlcnZlX21hcDsKKwl1bnNpZ25lZCBsb25nIHNlbGZfYmFzZTsKKwl1bnNpZ25lZCBsb25nIHNlbGZfc2l6ZTsKIAogCXJlc2VydmVfbWFwID0gKHU2NCAqKSgoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcykgKwogCQkJCQlpbml0aWFsX2Jvb3RfcGFyYW1zLT5vZmZfbWVtX3Jzdm1hcCk7CisKKwkvKiBiZWZvcmUgd2UgZG8gYW55dGhpbmcsIGxldHMgcmVzZXJ2ZSB0aGUgZHQgYmxvYiAqLworCXNlbGZfYmFzZSA9IF9fcGEoKHVuc2lnbmVkIGxvbmcpaW5pdGlhbF9ib290X3BhcmFtcyk7CisJc2VsZl9zaXplID0gaW5pdGlhbF9ib290X3BhcmFtcy0+dG90YWxzaXplOworCWxtYl9yZXNlcnZlKHNlbGZfYmFzZSwgc2VsZl9zaXplKTsKKwogI2lmZGVmIENPTkZJR19QUEMzMgogCS8qIAogCSAqIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBtaWdodCBiZSBib290aW5nIGZyb20gYW4gb2xkIGtleGVjCkBAIC0xMjU0LDYgKzEyOTIsOSBAQAogCQkJc2l6ZV8zMiA9ICoocmVzZXJ2ZV9tYXBfMzIrKyk7CiAJCQlpZiAoc2l6ZV8zMiA9PSAwKQogCQkJCWJyZWFrOworCQkJLyogc2tpcCBpZiB0aGUgcmVzZXJ2YXRpb24gaXMgZm9yIHRoZSBibG9iICovCisJCQlpZiAoYmFzZV8zMiA9PSBzZWxmX2Jhc2UgJiYgc2l6ZV8zMiA9PSBzZWxmX3NpemUpCisJCQkJY29udGludWU7CiAJCQlEQkcoInJlc2VydmluZzogJXggLT4gJXhcbiIsIGJhc2VfMzIsIHNpemVfMzIpOwogCQkJbG1iX3Jlc2VydmUoYmFzZV8zMiwgc2l6ZV8zMik7CiAJCX0KQEAgLTEyNjUsNiArMTMwNiw5IEBACiAJCXNpemUgPSAqKHJlc2VydmVfbWFwKyspOwogCQlpZiAoc2l6ZSA9PSAwKQogCQkJYnJlYWs7CisJCS8qIHNraXAgaWYgdGhlIHJlc2VydmF0aW9uIGlzIGZvciB0aGUgYmxvYiAqLworCQlpZiAoYmFzZSA9PSBzZWxmX2Jhc2UgJiYgc2l6ZSA9PSBzZWxmX3NpemUpCisJCQljb250aW51ZTsKIAkJREJHKCJyZXNlcnZpbmc6ICVsbHggLT4gJWxseFxuIiwgYmFzZSwgc2l6ZSk7CiAJCWxtYl9yZXNlcnZlKGJhc2UsIHNpemUpOwogCX0KQEAgLTEyOTIsMTcgKzEzMzYsMjUgQEAKIAlsbWJfaW5pdCgpOwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fcm9vdCwgTlVMTCk7CiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9tZW1vcnksIE5VTEwpOworCisJLyogU2F2ZSBjb21tYW5kIGxpbmUgZm9yIC9wcm9jL2NtZGxpbmUgYW5kIHRoZW4gcGFyc2UgcGFyYW1ldGVycyAqLworCXN0cmxjcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBjbWRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOworCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CisKKwkvKiBSZXNlcnZlIExNQiByZWdpb25zIHVzZWQgYnkga2VybmVsLCBpbml0cmQsIGR0LCBldGMuLi4gKi8KKwlsbWJfcmVzZXJ2ZShQSFlTSUNBTF9TVEFSVCwgX19wYShrbGltaXQpIC0gUEhZU0lDQUxfU1RBUlQpOworCXJlc2VydmVfa2R1bXBfdHJhbXBvbGluZSgpOworCXJlc2VydmVfY3Jhc2hrZXJuZWwoKTsKKwllYXJseV9yZXNlcnZlX21lbSgpOworCiAJbG1iX2VuZm9yY2VfbWVtb3J5X2xpbWl0KG1lbW9yeV9saW1pdCk7CiAJbG1iX2FuYWx5emUoKTsKIAogCURCRygiUGh5cy4gbWVtOiAlbHhcbiIsIGxtYl9waHlzX21lbV9zaXplKCkpOwogCi0JLyogUmVzZXJ2ZSBMTUIgcmVnaW9ucyB1c2VkIGJ5IGtlcm5lbCwgaW5pdHJkLCBkdCwgZXRjLi4uICovCi0JbG1iX3Jlc2VydmUoUEhZU0lDQUxfU1RBUlQsIF9fcGEoa2xpbWl0KSAtIFBIWVNJQ0FMX1NUQVJUKTsKLSNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAotCWxtYl9yZXNlcnZlKDAsIEtEVU1QX1JFU0VSVkVfTElNSVQpOwotI2VuZGlmCi0JZWFybHlfcmVzZXJ2ZV9tZW0oKTsKKwkvKiBXZSBtYXkgbmVlZCB0byByZWxvY2F0ZSB0aGUgZmxhdCB0cmVlLCBkbyBpdCBub3cuCisJICogRklYTUUgLi4gYW5kIHRoZSBpbml0cmQgdG9vPyAqLworCW1vdmVfZGV2aWNlX3RyZWUoKTsKIAogCURCRygiU2Nhbm5pbmcgQ1BVcyAuLi5cbiIpOwogCkBAIC0yMDUzLDI5ICsyMTA1LDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfS0VYRUMKLS8qIFdlIG1heSBoYXZlIGFsbG9jYXRlZCB0aGUgZmxhdCBkZXZpY2UgdHJlZSBpbnNpZGUgdGhlIGNyYXNoIGtlcm5lbCByZWdpb24KLSAqIGluIHByb21faW5pdC4gSWYgc28gd2UgbmVlZCB0byBtb3ZlIGl0IG91dCBpbnRvIHJlZ3VsYXIgbWVtb3J5LiAqLwotdm9pZCBrZHVtcF9tb3ZlX2RldmljZV90cmVlKHZvaWQpCisKKy8qIEZpbmQgdGhlIGRldmljZSBub2RlIGZvciBhIGdpdmVuIGxvZ2ljYWwgY3B1IG51bWJlciwgYWxzbyByZXR1cm5zIHRoZSBjcHUKKyAqIGxvY2FsIHRocmVhZCBudW1iZXIgKGluZGV4IGluIGlibSxpbnRlcnJ1cHQtc2VydmVyI3MpIGlmIHJlbGV2YW50IGFuZAorICogYXNrZWQgZm9yIChub24gTlVMTCkKKyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfY3B1X25vZGUoaW50IGNwdSwgdW5zaWduZWQgaW50ICp0aHJlYWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwotCXN0cnVjdCBib290X3BhcmFtX2hlYWRlciAqbmV3OworCWludCBoYXJkaWQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAotCXN0YXJ0ID0gX19wYSgodW5zaWduZWQgbG9uZylpbml0aWFsX2Jvb3RfcGFyYW1zKTsKLQllbmQgPSBzdGFydCArIGluaXRpYWxfYm9vdF9wYXJhbXMtPnRvdGFsc2l6ZTsKKwloYXJkaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7CiAKLQlpZiAoZW5kIDwgY3Jhc2hrX3Jlcy5zdGFydCB8fCBzdGFydCA+IGNyYXNoa19yZXMuZW5kKQotCQlyZXR1cm47CisJZm9yX2VhY2hfbm9kZV9ieV90eXBlKG5wLCAiY3B1IikgeworCQl1MzIgKmludHNlcnY7CisJCXVuc2lnbmVkIGludCBwbGVuLCB0OwogCi0JbmV3ID0gKHN0cnVjdCBib290X3BhcmFtX2hlYWRlciopCi0JCV9fdmEobG1iX2FsbG9jKGluaXRpYWxfYm9vdF9wYXJhbXMtPnRvdGFsc2l6ZSwgUEFHRV9TSVpFKSk7Ci0KLQltZW1jcHkobmV3LCBpbml0aWFsX2Jvb3RfcGFyYW1zLCBpbml0aWFsX2Jvb3RfcGFyYW1zLT50b3RhbHNpemUpOwotCi0JaW5pdGlhbF9ib290X3BhcmFtcyA9IG5ldzsKLQotCURCRygiRmxhdCBkZXZpY2UgdHJlZSBibG9iIG1vdmVkIHRvICVwXG4iLCBpbml0aWFsX2Jvb3RfcGFyYW1zKTsKLQotCS8qIFhYWCBzaG91bGQgd2UgdW5yZXNlcnZlIHRoZSBvbGQgRFQ/ICovCisJCS8qIENoZWNrIGZvciBpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcy4gSWYgaXQgZG9lc24ndCBleGlzdAorCQkgKiBmYWxsYmFjayB0byAicmVnIiBwcm9wZXJ0eSBhbmQgYXNzdW1lIG5vIHRocmVhZHMKKwkJICovCisJCWludHNlcnYgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MiLAorCQkJCQkgICAgICAmcGxlbik7CisJCWlmIChpbnRzZXJ2ID09IE5VTEwpIHsKKwkJCXUzMiAqcmVnID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOworCQkJaWYgKHJlZyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCpyZWcgPT0gaGFyZGlkKSB7CisJCQkJaWYgKHRocmVhZCkKKwkJCQkJKnRocmVhZCA9IDA7CisJCQkJcmV0dXJuIG5wOworCQkJfQorCQl9IGVsc2UgeworCQkJcGxlbiAvPSBzaXplb2YodTMyKTsKKwkJCWZvciAodCA9IDA7IHQgPCBwbGVuOyB0KyspIHsKKwkJCQlpZiAoaGFyZGlkID09IGludHNlcnZbdF0pIHsKKwkJCQkJaWYgKHRocmVhZCkKKwkJCQkJCSp0aHJlYWQgPSB0OworCQkJCQlyZXR1cm4gbnA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOwogfQotI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKaW5kZXggZjcwYmQwOS4uOGMyOGViMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCkBAIC0xOTQsMTkgKzE5NCwxMiBAQAogCiBzdGF0aWMgY2hhciBfX2luaXRkYXRhIHByb21fY21kX2xpbmVbQ09NTUFORF9MSU5FX1NJWkVdOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHByb21fbWVtb3J5X2xpbWl0OwotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGFsbG9jX3RvcDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgYWxsb2NfdG9wX2hpZ2g7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGFsbG9jX2JvdHRvbTsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcm1vX3RvcDsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmFtX3RvcDsKIAotI2lmZGVmIENPTkZJR19LRVhFQwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwcm9tX2NyYXNoa19iYXNlOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBwcm9tX2NyYXNoa19zaXplOwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgbWVtX21hcF9lbnRyeSBfX2luaXRkYXRhIG1lbV9yZXNlcnZlX21hcFtNRU1fUkVTRVJWRV9NQVBfU0laRV07CiBzdGF0aWMgaW50IF9faW5pdGRhdGEgbWVtX3Jlc2VydmVfY250OwogCkBAIC01NzQsNyArNTY3LDcgQEAKIAlpZiAoKGxvbmcpX3Byb20tPmNob3NlbiA+IDApCiAJCWwgPSBwcm9tX2dldHByb3AoX3Byb20tPmNob3NlbiwgImJvb3RhcmdzIiwgcCwgQ09NTUFORF9MSU5FX1NJWkUtMSk7CiAjaWZkZWYgQ09ORklHX0NNRExJTkUKLQlpZiAobCA9PSAwKSAvKiBkYmwgY2hlY2sgKi8KKwlpZiAobCA8PSAwIHx8IHBbMF0gPT0gJ1wwJykgLyogZGJsIGNoZWNrICovCiAJCXN0cmxjcHkoUkVMT0MocHJvbV9jbWRfbGluZSksCiAJCQlSRUxPQyhDT05GSUdfQ01ETElORSksIHNpemVvZihwcm9tX2NtZF9saW5lKSk7CiAjZW5kaWYgLyogQ09ORklHX0NNRExJTkUgKi8KQEAgLTU5Myw0NSArNTg2LDYgQEAKIAkJCVJFTE9DKGlvbW11X2ZvcmNlX29uKSA9IDE7CiAJfQogI2VuZGlmCi0KLQlvcHQgPSBzdHJzdHIoUkVMT0MocHJvbV9jbWRfbGluZSksIFJFTE9DKCJtZW09IikpOwotCWlmIChvcHQpIHsKLQkJb3B0ICs9IDQ7Ci0JCVJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSA9IHByb21fbWVtcGFyc2Uob3B0LCAoY29uc3QgY2hhciAqKikmb3B0KTsKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQkJLyogQWxpZ24gdG8gMTYgTUIgPT0gc2l6ZSBvZiBwcGM2NCBsYXJnZSBwYWdlICovCi0JCVJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSA9IEFMSUdOKFJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSwgMHgxMDAwMDAwKTsKLSNlbmRpZgotCX0KLQotI2lmZGVmIENPTkZJR19LRVhFQwotCS8qCi0JICogY3Jhc2hrZXJuZWw9c2l6ZUBhZGRyIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gcmVzZXJ2ZSBmb3IKLQkgKiBjcmFzaCBrZXJuZWwuCi0JICovCi0Jb3B0ID0gc3Ryc3RyKFJFTE9DKHByb21fY21kX2xpbmUpLCBSRUxPQygiY3Jhc2hrZXJuZWw9IikpOwotCWlmIChvcHQpIHsKLQkJb3B0ICs9IDEyOwotCQlSRUxPQyhwcm9tX2NyYXNoa19zaXplKSA9IAotCQkJcHJvbV9tZW1wYXJzZShvcHQsIChjb25zdCBjaGFyICoqKSZvcHQpOwotCi0JCWlmIChBTElHTihSRUxPQyhwcm9tX2NyYXNoa19zaXplKSwgMHgxMDAwMDAwKSAhPQotCQkJUkVMT0MocHJvbV9jcmFzaGtfc2l6ZSkpIHsKLQkJCXByb21fcHJpbnRmKCJXYXJuaW5nOiBjcmFzaGtlcm5lbCBzaXplIGlzIG5vdCAiCi0JCQkJCSJhbGlnbmVkIHRvIDE2TUJcbiIpOwotCQl9Ci0KLQkJLyoKLQkJICogQXQgcHJlc2VudCwgdGhlIGNyYXNoIGtlcm5lbCBhbHdheXMgcnVuIGF0IDMyTUIuCi0JCSAqIEp1c3QgaWdub3JlIHdoYXRldmVyIHVzZXIgcGFzc2VkLgotCQkgKi8KLQkJUkVMT0MocHJvbV9jcmFzaGtfYmFzZSkgPSAweDIwMDAwMDA7Ci0JCWlmICgqb3B0ID09ICdAJykgewotCQkJcHJvbV9wcmludGYoIldhcm5pbmc6IFBQQzY0IGtkdW1wIGtlcm5lbCBhbHdheXMgcnVucyAiCi0JCQkJCSJhdCAzMiBNQlxuIik7Ci0JCX0KLQl9Ci0jZW5kaWYKIH0KIAogI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwpAQCAtMTExNiwyOSArMTA3MCw2IEBACiAJfQogCiAJLyoKLQkgKiBJZiBwcm9tX21lbW9yeV9saW1pdCBpcyBzZXQgd2UgcmVkdWNlIHRoZSB1cHBlciBsaW1pdHMgKmV4Y2VwdCogZm9yCi0JICogYWxsb2NfdG9wX2hpZ2guIFRoaXMgbXVzdCBiZSB0aGUgcmVhbCB0b3Agb2YgUkFNIHNvIHdlIGNhbiBwdXQKLQkgKiBUQ0UncyB1cCB0aGVyZS4KLQkgKi8KLQotCVJFTE9DKGFsbG9jX3RvcF9oaWdoKSA9IFJFTE9DKHJhbV90b3ApOwotCi0JaWYgKFJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSkgewotCQlpZiAoUkVMT0MocHJvbV9tZW1vcnlfbGltaXQpIDw9IFJFTE9DKGFsbG9jX2JvdHRvbSkpIHsKLQkJCXByb21fcHJpbnRmKCJJZ25vcmluZyBtZW09JXggPD0gYWxsb2NfYm90dG9tLlxuIiwKLQkJCQlSRUxPQyhwcm9tX21lbW9yeV9saW1pdCkpOwotCQkJUkVMT0MocHJvbV9tZW1vcnlfbGltaXQpID0gMDsKLQkJfSBlbHNlIGlmIChSRUxPQyhwcm9tX21lbW9yeV9saW1pdCkgPj0gUkVMT0MocmFtX3RvcCkpIHsKLQkJCXByb21fcHJpbnRmKCJJZ25vcmluZyBtZW09JXggPj0gcmFtX3RvcC5cbiIsCi0JCQkJUkVMT0MocHJvbV9tZW1vcnlfbGltaXQpKTsKLQkJCVJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlSRUxPQyhyYW1fdG9wKSA9IFJFTE9DKHByb21fbWVtb3J5X2xpbWl0KTsKLQkJCVJFTE9DKHJtb190b3ApID0gbWluKFJFTE9DKHJtb190b3ApLCBSRUxPQyhwcm9tX21lbW9yeV9saW1pdCkpOwotCQl9Ci0JfQotCi0JLyoKIAkgKiBTZXR1cCBvdXIgdG9wIGFsbG9jIHBvaW50LCB0aGF0IGlzIHRvcCBvZiBSTU8gb3IgdG9wIG9mCiAJICogc2VnbWVudCAwIHdoZW4gcnVubmluZyBub24tTFBBUi4KIAkgKiBTb21lIFJTNjQgbWFjaGluZXMgaGF2ZSBidWdneSBmaXJtd2FyZSB3aGVyZSBjbGFpbXMgdXAgYXQKQEAgLTExNTAsMjAgKzEwODEsMTQgQEAKIAkJUkVMT0Mocm1vX3RvcCkgPSBSRUxPQyhyYW1fdG9wKTsKIAlSRUxPQyhybW9fdG9wKSA9IG1pbigweDMwMDAwMDAwdWwsIFJFTE9DKHJtb190b3ApKTsKIAlSRUxPQyhhbGxvY190b3ApID0gUkVMT0Mocm1vX3RvcCk7CisJUkVMT0MoYWxsb2NfdG9wX2hpZ2gpID0gUkVMT0MocmFtX3RvcCk7CiAKIAlwcm9tX3ByaW50ZigibWVtb3J5IGxheW91dCBhdCBpbml0OlxuIik7Ci0JcHJvbV9wcmludGYoIiAgbWVtb3J5X2xpbWl0IDogJXggKDE2IE1CIGFsaWduZWQpXG4iLCBSRUxPQyhwcm9tX21lbW9yeV9saW1pdCkpOwogCXByb21fcHJpbnRmKCIgIGFsbG9jX2JvdHRvbSA6ICV4XG4iLCBSRUxPQyhhbGxvY19ib3R0b20pKTsKIAlwcm9tX3ByaW50ZigiICBhbGxvY190b3AgICAgOiAleFxuIiwgUkVMT0MoYWxsb2NfdG9wKSk7CiAJcHJvbV9wcmludGYoIiAgYWxsb2NfdG9wX2hpIDogJXhcbiIsIFJFTE9DKGFsbG9jX3RvcF9oaWdoKSk7CiAJcHJvbV9wcmludGYoIiAgcm1vX3RvcCAgICAgIDogJXhcbiIsIFJFTE9DKHJtb190b3ApKTsKIAlwcm9tX3ByaW50ZigiICByYW1fdG9wICAgICAgOiAleFxuIiwgUkVMT0MocmFtX3RvcCkpOwotI2lmZGVmIENPTkZJR19LRVhFQwotCWlmIChSRUxPQyhwcm9tX2NyYXNoa19iYXNlKSkgewotCQlwcm9tX3ByaW50ZigiICBjcmFzaGtfYmFzZSAgOiAleFxuIiwgIFJFTE9DKHByb21fY3Jhc2hrX2Jhc2UpKTsKLQkJcHJvbV9wcmludGYoIiAgY3Jhc2hrX3NpemUgIDogJXhcbiIsIFJFTE9DKHByb21fY3Jhc2hrX3NpemUpKTsKLQl9Ci0jZW5kaWYKIH0KIAogCkBAIC0xMzQ5LDE2ICsxMjc0LDEwIEBACiAKIAlyZXNlcnZlX21lbShsb2NhbF9hbGxvY19ib3R0b20sIGxvY2FsX2FsbG9jX3RvcCAtIGxvY2FsX2FsbG9jX2JvdHRvbSk7CiAKLQlpZiAoUkVMT0MocHJvbV9tZW1vcnlfbGltaXQpKSB7Ci0JCS8qCi0JCSAqIFdlIGFsaWduIHRoZSBzdGFydCB0byBhIDE2TUIgYm91bmRhcnkgc28gd2UgY2FuIG1hcAotCQkgKiB0aGUgVENFIGFyZWEgdXNpbmcgbGFyZ2UgcGFnZXMgaWYgcG9zc2libGUuCi0JCSAqIFRoZSBlbmQgc2hvdWxkIGJlIHRoZSB0b3Agb2YgUkFNIHNvIG5vIG5lZWQgdG8gYWxpZ24gaXQuCi0JCSAqLwotCQlSRUxPQyhwcm9tX3RjZV9hbGxvY19zdGFydCkgPSBfQUxJR05fRE9XTihsb2NhbF9hbGxvY19ib3R0b20sCi0JCQkJCQkJICAweDEwMDAwMDApOwotCQlSRUxPQyhwcm9tX3RjZV9hbGxvY19lbmQpID0gbG9jYWxfYWxsb2NfdG9wOwotCX0KKwkvKiBUaGVzZSBhcmUgb25seSByZWFsbHkgbmVlZGVkIGlmIHRoZXJlIGlzIGEgbWVtb3J5IGxpbWl0IGluCisJICogZWZmZWN0LCBidXQgd2UgZG9uJ3Qga25vdyBzbyBleHBvcnQgdGhlbSBhbHdheXMuICovCisJUkVMT0MocHJvbV90Y2VfYWxsb2Nfc3RhcnQpID0gbG9jYWxfYWxsb2NfYm90dG9tOworCVJFTE9DKHByb21fdGNlX2FsbG9jX2VuZCkgPSBsb2NhbF9hbGxvY190b3A7CiAKIAkvKiBGbGFnIHRoZSBmaXJzdCBpbnZhbGlkIGVudHJ5ICovCiAJcHJvbV9kZWJ1ZygiZW5kaW5nIHByb21faW5pdGlhbGl6ZV90Y2VfdGFibGVcbiIpOwpAQCAtMjA0MSwxMSArMTk2MCw3IEBACiAJLyogVmVyc2lvbiAxNiBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZSAqLwogCWhkci0+bGFzdF9jb21wX3ZlcnNpb24gPSAweDEwOwogCi0JLyogUmVzZXJ2ZSB0aGUgd2hvbGUgdGhpbmcgYW5kIGNvcHkgdGhlIHJlc2VydmUgbWFwIGluLCB3ZQotCSAqIGFsc28gYnVtcCBtZW1fcmVzZXJ2ZV9jbnQgdG8gY2F1c2UgZnVydGhlciByZXNlcnZhdGlvbnMgdG8KLQkgKiBmYWlsIHNpbmNlIGl0J3MgdG9vIGxhdGUuCi0JICovCi0JcmVzZXJ2ZV9tZW0oUkVMT0MoZHRfaGVhZGVyX3N0YXJ0KSwgaGRyLT50b3RhbHNpemUpOworCS8qIENvcHkgdGhlIHJlc2VydmUgbWFwIGluICovCiAJbWVtY3B5KHJzdm1hcCwgUkVMT0MobWVtX3Jlc2VydmVfbWFwKSwgc2l6ZW9mKG1lbV9yZXNlcnZlX21hcCkpOwogCiAjaWZkZWYgREVCVUdfUFJPTQpAQCAtMjA1OCw2ICsxOTczLDkgQEAKIAkJCQkgICAgUkVMT0MobWVtX3Jlc2VydmVfbWFwKVtpXS5zaXplKTsKIAl9CiAjZW5kaWYKKwkvKiBCdW1wIG1lbV9yZXNlcnZlX2NudCB0byBjYXVzZSBmdXJ0aGVyIHJlc2VydmF0aW9ucyB0byBmYWlsCisJICogc2luY2UgaXQncyB0b28gbGF0ZS4KKwkgKi8KIAlSRUxPQyhtZW1fcmVzZXJ2ZV9jbnQpID0gTUVNX1JFU0VSVkVfTUFQX1NJWkU7CiAKIAlwcm9tX3ByaW50ZigiRGV2aWNlIHRyZWUgc3RyaW5ncyAweCV4IC0+IDB4JXhcbiIsCkBAIC0yMjgwLDEwICsyMTk4LDYgQEAKIAkgKi8KIAlwcm9tX2luaXRfbWVtKCk7CiAKLSNpZmRlZiBDT05GSUdfS0VYRUMKLQlpZiAoUkVMT0MocHJvbV9jcmFzaGtfYmFzZSkpCi0JCXJlc2VydmVfbWVtKFJFTE9DKHByb21fY3Jhc2hrX2Jhc2UpLCBSRUxPQyhwcm9tX2NyYXNoa19zaXplKSk7Ci0jZW5kaWYKIAkvKgogCSAqIERldGVybWluZSB3aGljaCBjcHUgaXMgYWN0dWFsbHkgcnVubmluZyByaWdodCBfbm93XwogCSAqLwpAQCAtMjMxNywxMCArMjIzMSw2IEBACiAJLyoKIAkgKiBGaWxsIGluIHNvbWUgaW5mb3MgZm9yIHVzZSBieSB0aGUga2VybmVsIGxhdGVyIG9uCiAJICovCi0JaWYgKFJFTE9DKHByb21fbWVtb3J5X2xpbWl0KSkKLQkJcHJvbV9zZXRwcm9wKF9wcm9tLT5jaG9zZW4sICIvY2hvc2VuIiwgImxpbnV4LG1lbW9yeS1saW1pdCIsCi0JCQkgICAgICZSRUxPQyhwcm9tX21lbW9yeV9saW1pdCksCi0JCQkgICAgIHNpemVvZihwcm9tX21lbW9yeV9saW1pdCkpOwogI2lmZGVmIENPTkZJR19QUEM2NAogCWlmIChSRUxPQyhwcGM2NF9pb21tdV9vZmYpKQogCQlwcm9tX3NldHByb3AoX3Byb20tPmNob3NlbiwgIi9jaG9zZW4iLCAibGludXgsaW9tbXUtb2ZmIiwKQEAgLTIzNDAsMTYgKzIyNTAsNiBAQAogCX0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0tFWEVDCi0JaWYgKFJFTE9DKHByb21fY3Jhc2hrX2Jhc2UpKSB7Ci0JCXByb21fc2V0cHJvcChfcHJvbS0+Y2hvc2VuLCAiL2Nob3NlbiIsICJsaW51eCxjcmFzaGtlcm5lbC1iYXNlIiwKLQkJCVBUUlJFTE9DKCZwcm9tX2NyYXNoa19iYXNlKSwKLQkJCXNpemVvZihSRUxPQyhwcm9tX2NyYXNoa19iYXNlKSkpOwotCQlwcm9tX3NldHByb3AoX3Byb20tPmNob3NlbiwgIi9jaG9zZW4iLCAibGludXgsY3Jhc2hrZXJuZWwtc2l6ZSIsCi0JCQlQVFJSRUxPQygmcHJvbV9jcmFzaGtfc2l6ZSksCi0JCQlzaXplb2YoUkVMT0MocHJvbV9jcmFzaGtfc2l6ZSkpKTsKLQl9Ci0jZW5kaWYKIAkvKgogCSAqIEZpeHVwIGFueSBrbm93biBidWdzIGluIHRoZSBkZXZpY2UtdHJlZQogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX3BhcnNlLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwppbmRleCAzOTM0YzIyLi40NWRmNDIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21fcGFyc2UuYwpAQCAtNTQ4LDMgKzU0OCwyOCBAQAogCXJldHVybiBfX29mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LCBhZGRycCwgc2l6ZSwgZmxhZ3MsIHIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob2ZfcGNpX2FkZHJlc3NfdG9fcmVzb3VyY2UpOworCit2b2lkIG9mX3BhcnNlX2RtYV93aW5kb3coc3RydWN0IGRldmljZV9ub2RlICpkbiwgdW5zaWduZWQgY2hhciAqZG1hX3dpbmRvd19wcm9wLAorCQl1bnNpZ25lZCBsb25nICpidXNubywgdW5zaWduZWQgbG9uZyAqcGh5cywgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwl1MzIgKmRtYV93aW5kb3csIGNlbGxzOworCXVuc2lnbmVkIGNoYXIgKnByb3A7CisKKwlkbWFfd2luZG93ID0gKHUzMiAqKWRtYV93aW5kb3dfcHJvcDsKKworCS8qIGJ1c25vIGlzIGFsd2F5cyBvbmUgY2VsbCAqLworCSpidXNubyA9ICooZG1hX3dpbmRvdysrKTsKKworCXByb3AgPSBnZXRfcHJvcGVydHkoZG4sICJpYm0sI2RtYS1hZGRyZXNzLWNlbGxzIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlwcm9wID0gZ2V0X3Byb3BlcnR5KGRuLCAiI2FkZHJlc3MtY2VsbHMiLCBOVUxMKTsKKworCWNlbGxzID0gcHJvcCA/ICoodTMyICopcHJvcCA6IHByb21fbl9hZGRyX2NlbGxzKGRuKTsKKwkqcGh5cyA9IG9mX3JlYWRfYWRkcihkbWFfd2luZG93LCBjZWxscyk7CisKKwlkbWFfd2luZG93ICs9IGNlbGxzOworCisJcHJvcCA9IGdldF9wcm9wZXJ0eShkbiwgImlibSwjZG1hLXNpemUtY2VsbHMiLCBOVUxMKTsKKwljZWxscyA9IHByb3AgPyAqKHUzMiAqKXByb3AgOiBwcm9tX25fc2l6ZV9jZWxscyhkbik7CisJKnNpemUgPSBvZl9yZWFkX2FkZHIoZG1hX3dpbmRvdywgY2VsbHMpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNGE2NzdkMS4uNTU2M2UyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3B0cmFjZS5jCkBAIC00MDQsNyArNDA0LDYgQEAKIAkJcmV0ID0gcHRyYWNlX2RldGFjaChjaGlsZCwgZGF0YSk7CiAJCWJyZWFrOwogCi0jaWZkZWYgQ09ORklHX1BQQzY0CiAJY2FzZSBQUENfUFRSQUNFX0dFVFJFR1M6IHsgLyogR2V0IEdQUnMgMCAtIDMxLiAqLwogCQlpbnQgaTsKIAkJdW5zaWduZWQgbG9uZyAqcmVnID0gJigodW5zaWduZWQgbG9uZyAqKWNoaWxkLT50aHJlYWQucmVncylbMF07CkBAIC00NjgsNyArNDY3LDYgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKICNpZmRlZiBDT05GSUdfQUxUSVZFQwogCWNhc2UgUFRSQUNFX0dFVFZSUkVHUzoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYwppbmRleCAzNGQwNzNmYi4uNzc1NzhjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLXJ0Yy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhcy1ydGMuYwpAQCAtMTQsMTkgKzE0LDIwIEBACiB1bnNpZ25lZCBsb25nIF9faW5pdCBydGFzX2dldF9ib290X3RpbWUodm9pZCkKIHsKIAlpbnQgcmV0WzhdOwotCWludCBlcnJvciwgd2FpdF90aW1lOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgd2FpdF90aW1lOwogCXU2NCBtYXhfd2FpdF90YjsKIAogCW1heF93YWl0X3RiID0gZ2V0X3RiKCkgKyB0Yl90aWNrc19wZXJfdXNlYyAqIDEwMDAgKiBNQVhfUlRDX1dBSVQ7CiAJZG8gewogCQllcnJvciA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJnZXQtdGltZS1vZi1kYXkiKSwgMCwgOCwgcmV0KTsKLQkJaWYgKGVycm9yID09IFJUQVNfQ0xPQ0tfQlVTWSB8fCBydGFzX2lzX2V4dGVuZGVkX2J1c3koZXJyb3IpKSB7Ci0JCQl3YWl0X3RpbWUgPSBydGFzX2V4dGVuZGVkX2J1c3lfZGVsYXlfdGltZShlcnJvcik7CisKKwkJd2FpdF90aW1lID0gcnRhc19idXN5X2RlbGF5X3RpbWUoZXJyb3IpOworCQlpZiAod2FpdF90aW1lKSB7CiAJCQkvKiBUaGlzIGlzIGJvb3QgdGltZSBzbyB3ZSBzcGluLiAqLwogCQkJdWRlbGF5KHdhaXRfdGltZSoxMDAwKTsKLQkJCWVycm9yID0gUlRBU19DTE9DS19CVVNZOwogCQl9Ci0JfSB3aGlsZSAoZXJyb3IgPT0gUlRBU19DTE9DS19CVVNZICYmIChnZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CisJfSB3aGlsZSAod2FpdF90aW1lICYmIChnZXRfdGIoKSA8IG1heF93YWl0X3RiKSk7CiAKIAlpZiAoZXJyb3IgIT0gMCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHJlYWRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLApAQCAtNDQsMjQgKzQ1LDI1IEBACiB2b2lkIHJ0YXNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RtKQogewogICAgICAgICBpbnQgcmV0WzhdOwotCWludCBlcnJvciwgd2FpdF90aW1lOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBpbnQgd2FpdF90aW1lOwogCXU2NCBtYXhfd2FpdF90YjsKIAogCW1heF93YWl0X3RiID0gZ2V0X3RiKCkgKyB0Yl90aWNrc19wZXJfdXNlYyAqIDEwMDAgKiBNQVhfUlRDX1dBSVQ7CiAJZG8gewogCQllcnJvciA9IHJ0YXNfY2FsbChydGFzX3Rva2VuKCJnZXQtdGltZS1vZi1kYXkiKSwgMCwgOCwgcmV0KTsKLQkJaWYgKGVycm9yID09IFJUQVNfQ0xPQ0tfQlVTWSB8fCBydGFzX2lzX2V4dGVuZGVkX2J1c3koZXJyb3IpKSB7CisKKwkJd2FpdF90aW1lID0gcnRhc19idXN5X2RlbGF5X3RpbWUoZXJyb3IpOworCQlpZiAod2FpdF90aW1lKSB7CiAJCQlpZiAoaW5faW50ZXJydXB0KCkgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCQkJbWVtc2V0KHJ0Y190bSwgMCwgc2l6ZW9mKHN0cnVjdCBydGNfdGltZSkpOwogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiByZWFkaW5nIGNsb2NrIgogCQkJCSAgICAgICAiIHdvdWxkIGRlbGF5IGludGVycnVwdFxuIik7CiAJCQkJcmV0dXJuOwkvKiBkZWxheSBub3QgYWxsb3dlZCAqLwogCQkJfQotCQkJd2FpdF90aW1lID0gcnRhc19leHRlbmRlZF9idXN5X2RlbGF5X3RpbWUoZXJyb3IpOwogCQkJbXNsZWVwKHdhaXRfdGltZSk7Ci0JCQllcnJvciA9IFJUQVNfQ0xPQ0tfQlVTWTsKIAkJfQotCX0gd2hpbGUgKGVycm9yID09IFJUQVNfQ0xPQ0tfQlVTWSAmJiAoZ2V0X3RiKCkgPCBtYXhfd2FpdF90YikpOworCX0gd2hpbGUgKHdhaXRfdGltZSAmJiAoZ2V0X3RiKCkgPCBtYXhfd2FpdF90YikpOwogCiAgICAgICAgIGlmIChlcnJvciAhPSAwICYmIHByaW50a19yYXRlbGltaXQoKSkgewogICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImVycm9yOiByZWFkaW5nIHRoZSBjbG9jayBmYWlsZWQgKCVkKVxuIiwKQEAgLTg4LDE0ICs5MCwxNCBAQAogCQkJCSAgdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwKIAkJCQkgIHRtLT50bV9tZGF5LCB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwKIAkJCQkgIHRtLT50bV9zZWMsIDApOwotCQlpZiAoZXJyb3IgPT0gUlRBU19DTE9DS19CVVNZIHx8IHJ0YXNfaXNfZXh0ZW5kZWRfYnVzeShlcnJvcikpIHsKKworCQl3YWl0X3RpbWUgPSBydGFzX2J1c3lfZGVsYXlfdGltZShlcnJvcik7CisJCWlmICh3YWl0X3RpbWUpIHsKIAkJCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJCQlyZXR1cm4gMTsJLyogcHJvYmFibHkgZGVjcmVtZW50ZXIgKi8KLQkJCXdhaXRfdGltZSA9IHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKGVycm9yKTsKIAkJCW1zbGVlcCh3YWl0X3RpbWUpOwotCQkJZXJyb3IgPSBSVEFTX0NMT0NLX0JVU1k7CiAJCX0KLQl9IHdoaWxlIChlcnJvciA9PSBSVEFTX0NMT0NLX0JVU1kgJiYgKGdldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKKwl9IHdoaWxlICh3YWl0X3RpbWUgJiYgKGdldF90YigpIDwgbWF4X3dhaXRfdGIpKTsKIAogICAgICAgICBpZiAoZXJyb3IgIT0gMCAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3I6IHNldHRpbmcgdGhlIGNsb2NrIGZhaWxlZCAoJWQpXG4iLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwppbmRleCAwMTEyMzE4Li4xN2RjNzkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXMuYwpAQCAtMzcwLDI0ICszNzAsMzYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBHaXZlbiBhbiBSVEFTIHN0YXR1cyBjb2RlIG9mIDk5MG4gY29tcHV0ZSB0aGUgaGludGVkIGRlbGF5IG9mIDEwXm4KLSAqIChsYXN0IGRpZ2l0KSBtaWxsaXNlY29uZHMuICBGb3Igbm93IHdlIGJvdW5kIGF0IG49NSAoMTAwIHNlYykuCisvKiBGb3IgUlRBU19CVVNZICgtMiksIGRlbGF5IGZvciAxIG1pbGxpc2Vjb25kLiAgRm9yIGFuIGV4dGVuZGVkIGJ1c3kgc3RhdHVzCisgKiBjb2RlIG9mIDk5MG4sIHBlcmZvcm0gdGhlIGhpbnRlZCBkZWxheSBvZiAxMF5uIChsYXN0IGRpZ2l0KSBtaWxsaXNlY29uZHMuCiAgKi8KLXVuc2lnbmVkIGludCBydGFzX2V4dGVuZGVkX2J1c3lfZGVsYXlfdGltZShpbnQgc3RhdHVzKQordW5zaWduZWQgaW50IHJ0YXNfYnVzeV9kZWxheV90aW1lKGludCBzdGF0dXMpCiB7Ci0JaW50IG9yZGVyID0gc3RhdHVzIC0gOTkwMDsKLQl1bnNpZ25lZCBsb25nIG1zOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBpbnQgbXMgPSAwOwogCi0JaWYgKG9yZGVyIDwgMCkKLQkJb3JkZXIgPSAwOwkvKiBSVEMgZGVwZW5kcyBvbiB0aGlzIGZvciAtMiBjbG9jayBidXN5ICovCi0JZWxzZSBpZiAob3JkZXIgPiA1KQotCQlvcmRlciA9IDU7CS8qIGJvdW5kICovCisJaWYgKHN0YXR1cyA9PSBSVEFTX0JVU1kpIHsKKwkJbXMgPSAxOworCX0gZWxzZSBpZiAoc3RhdHVzID49IDk5MDAgJiYgc3RhdHVzIDw9IDk5MDUpIHsKKwkJb3JkZXIgPSBzdGF0dXMgLSA5OTAwOworCQlmb3IgKG1zID0gMTsgb3JkZXIgPiAwOyBvcmRlci0tKQorCQkJbXMgKj0gMTA7CisJfQogCi0JLyogVXNlIG1pY3Jvc2Vjb25kcyBmb3IgcmVhc29uYWJsZSBhY2N1cmFjeSAqLwotCWZvciAobXMgPSAxOyBvcmRlciA+IDA7IG9yZGVyLS0pCi0JCW1zICo9IDEwOworCXJldHVybiBtczsKK30KIAotCXJldHVybiBtczsgCisvKiBGb3IgYW4gUlRBUyBidXN5IHN0YXR1cyBjb2RlLCBwZXJmb3JtIHRoZSBoaW50ZWQgZGVsYXkuICovCit1bnNpZ25lZCBpbnQgcnRhc19idXN5X2RlbGF5KGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IG1zOworCisJbWlnaHRfc2xlZXAoKTsKKwltcyA9IHJ0YXNfYnVzeV9kZWxheV90aW1lKHN0YXR1cyk7CisJaWYgKG1zKQorCQltc2xlZXAobXMpOworCisJcmV0dXJuIG1zOwogfQogCiBpbnQgcnRhc19lcnJvcl9yYyhpbnQgcnRhc19yYykKQEAgLTQzOCwyMiArNDUwLDE0IEBACiBpbnQgcnRhc19zZXRfcG93ZXJfbGV2ZWwoaW50IHBvd2VyZG9tYWluLCBpbnQgbGV2ZWwsIGludCAqc2V0bGV2ZWwpCiB7CiAJaW50IHRva2VuID0gcnRhc190b2tlbigic2V0LXBvd2VyLWxldmVsIik7Ci0JdW5zaWduZWQgaW50IHdhaXRfdGltZTsKIAlpbnQgcmM7CiAKIAlpZiAodG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCiAJCXJldHVybiAtRU5PRU5UOwogCi0Jd2hpbGUgKDEpIHsKKwlkbyB7CiAJCXJjID0gcnRhc19jYWxsKHRva2VuLCAyLCAyLCBzZXRsZXZlbCwgcG93ZXJkb21haW4sIGxldmVsKTsKLQkJaWYgKHJjID09IFJUQVNfQlVTWSkKLQkJCXVkZWxheSgxKTsKLQkJZWxzZSBpZiAocnRhc19pc19leHRlbmRlZF9idXN5KHJjKSkgewotCQkJd2FpdF90aW1lID0gcnRhc19leHRlbmRlZF9idXN5X2RlbGF5X3RpbWUocmMpOwotCQkJdWRlbGF5KHdhaXRfdGltZSAqIDEwMDApOwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KKwl9IHdoaWxlIChydGFzX2J1c3lfZGVsYXkocmMpKTsKIAogCWlmIChyYyA8IDApCiAJCXJldHVybiBydGFzX2Vycm9yX3JjKHJjKTsKQEAgLTQ2MywyMiArNDY3LDE0IEBACiBpbnQgcnRhc19nZXRfc2Vuc29yKGludCBzZW5zb3IsIGludCBpbmRleCwgaW50ICpzdGF0ZSkKIHsKIAlpbnQgdG9rZW4gPSBydGFzX3Rva2VuKCJnZXQtc2Vuc29yLXN0YXRlIik7Ci0JdW5zaWduZWQgaW50IHdhaXRfdGltZTsKIAlpbnQgcmM7CiAKIAlpZiAodG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCiAJCXJldHVybiAtRU5PRU5UOwogCi0Jd2hpbGUgKDEpIHsKKwlkbyB7CiAJCXJjID0gcnRhc19jYWxsKHRva2VuLCAyLCAyLCBzdGF0ZSwgc2Vuc29yLCBpbmRleCk7Ci0JCWlmIChyYyA9PSBSVEFTX0JVU1kpCi0JCQl1ZGVsYXkoMSk7Ci0JCWVsc2UgaWYgKHJ0YXNfaXNfZXh0ZW5kZWRfYnVzeShyYykpIHsKLQkJCXdhaXRfdGltZSA9IHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKHJjKTsKLQkJCXVkZWxheSh3YWl0X3RpbWUgKiAxMDAwKTsKLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9CisJfSB3aGlsZSAocnRhc19idXN5X2RlbGF5KHJjKSk7CiAKIAlpZiAocmMgPCAwKQogCQlyZXR1cm4gcnRhc19lcnJvcl9yYyhyYyk7CkBAIC00ODgsMjMgKzQ4NCwxNCBAQAogaW50IHJ0YXNfc2V0X2luZGljYXRvcihpbnQgaW5kaWNhdG9yLCBpbnQgaW5kZXgsIGludCBuZXdfdmFsdWUpCiB7CiAJaW50IHRva2VuID0gcnRhc190b2tlbigic2V0LWluZGljYXRvciIpOwotCXVuc2lnbmVkIGludCB3YWl0X3RpbWU7CiAJaW50IHJjOwogCiAJaWYgKHRva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCXdoaWxlICgxKSB7CisJZG8gewogCQlyYyA9IHJ0YXNfY2FsbCh0b2tlbiwgMywgMSwgTlVMTCwgaW5kaWNhdG9yLCBpbmRleCwgbmV3X3ZhbHVlKTsKLQkJaWYgKHJjID09IFJUQVNfQlVTWSkKLQkJCXVkZWxheSgxKTsKLQkJZWxzZSBpZiAocnRhc19pc19leHRlbmRlZF9idXN5KHJjKSkgewotCQkJd2FpdF90aW1lID0gcnRhc19leHRlbmRlZF9idXN5X2RlbGF5X3RpbWUocmMpOwotCQkJdWRlbGF5KHdhaXRfdGltZSAqIDEwMDApOwotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KKwl9IHdoaWxlIChydGFzX2J1c3lfZGVsYXkocmMpKTsKIAogCWlmIChyYyA8IDApCiAJCXJldHVybiBydGFzX2Vycm9yX3JjKHJjKTsKQEAgLTU1NSwxMyArNTQyLDExIEBACiAJZG8gewogCQlzdGF0dXMgPSBydGFzX2NhbGwocnRhc190b2tlbigiaWJtLG9zLXRlcm0iKSwgMSwgMSwgTlVMTCwKIAkJCQkgICBfX3BhKHJ0YXNfb3NfdGVybV9idWYpKTsKKwl9IHdoaWxlIChydGFzX2J1c3lfZGVsYXkoc3RhdHVzKSk7CiAKLQkJaWYgKHN0YXR1cyA9PSBSVEFTX0JVU1kpCi0JCQl1ZGVsYXkoMSk7Ci0JCWVsc2UgaWYgKHN0YXR1cyAhPSAwKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgImlibSxvcy10ZXJtIGNhbGwgZmFpbGVkICVkXG4iLAorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fRU1FUkcgImlibSxvcy10ZXJtIGNhbGwgZmFpbGVkICVkXG4iLAogCQkJICAgICAgIHN0YXR1cyk7Ci0JfSB3aGlsZSAoc3RhdHVzID09IFJUQVNfQlVTWSk7CiB9CiAKIHN0YXRpYyBpbnQgaWJtX3N1c3BlbmRfbWVfdG9rZW4gPSBSVEFTX1VOS05PV05fU0VSVklDRTsKQEAgLTYwOCw5ICs1OTMsMzEgQEAKIHN0YXRpYyBpbnQgcnRhc19pYm1fc3VzcGVuZF9tZShzdHJ1Y3QgcnRhc19hcmdzICphcmdzKQogewogCWludCBpOworCWxvbmcgc3RhdGU7CisJbG9uZyByYzsKKwl1bnNpZ25lZCBsb25nIGR1bW15OwogCiAJc3RydWN0IHJ0YXNfc3VzcGVuZF9tZV9kYXRhIGRhdGE7CiAKKwkvKiBNYWtlIHN1cmUgdGhlIHN0YXRlIGlzIHZhbGlkICovCisJcmMgPSBwbHBhcl9oY2FsbChIX1ZBU0lfU1RBVEUsCisJCQkgKCh1NjQpYXJncy0+YXJnc1swXSA8PCAzMikgfCBhcmdzLT5hcmdzWzFdLAorCQkJIDAsIDAsIDAsCisJCQkgJnN0YXRlLCAmZHVtbXksICZkdW1teSk7CisKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGFzX2libV9zdXNwZW5kX21lOiB2YXNpX3N0YXRlIHJldHVybmVkICVsZFxuIixyYyk7CisJCXJldHVybiByYzsKKwl9IGVsc2UgaWYgKHN0YXRlID09IEhfVkFTSV9FTkFCTEVEKSB7CisJCWFyZ3MtPmFyZ3NbYXJncy0+bmFyZ3NdID0gUlRBU19OT1RfU1VTUEVOREFCTEU7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoc3RhdGUgIT0gSF9WQVNJX1NVU1BFTkRJTkcpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGFzX2libV9zdXNwZW5kX21lOiB2YXNpX3N0YXRlIHJldHVybmVkIHN0YXRlICVsZFxuIiwKKwkJICAgICAgIHN0YXRlKTsKKwkJYXJncy0+YXJnc1thcmdzLT5uYXJnc10gPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJZGF0YS53YWl0aW5nID0gMTsKIAlkYXRhLmFyZ3MgPSBhcmdzOwogCkBAIC03ODksNyArNzk2LDggQEAKIEVYUE9SVF9TWU1CT0wocnRhc19jYWxsKTsKIEVYUE9SVF9TWU1CT0wocnRhc19kYXRhX2J1Zik7CiBFWFBPUlRfU1lNQk9MKHJ0YXNfZGF0YV9idWZfbG9jayk7Ci1FWFBPUlRfU1lNQk9MKHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKTsKK0VYUE9SVF9TWU1CT0wocnRhc19idXN5X2RlbGF5X3RpbWUpOworRVhQT1JUX1NZTUJPTChydGFzX2J1c3lfZGVsYXkpOwogRVhQT1JUX1NZTUJPTChydGFzX2dldF9zZW5zb3IpOwogRVhQT1JUX1NZTUJPTChydGFzX2dldF9wb3dlcl9sZXZlbCk7CiBFWFBPUlRfU1lNQk9MKHJ0YXNfc2V0X3Bvd2VyX2xldmVsKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKaW5kZXggYWFmMzg0Yy4uMTQ0MmI2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX2ZsYXNoLmMKQEAgLTM2NSwyMCArMzY1LDEyIEBACiAKIHN0YXRpYyB2b2lkIG1hbmFnZV9mbGFzaChzdHJ1Y3QgcnRhc19tYW5hZ2VfZmxhc2hfdCAqYXJnc19idWYpCiB7Ci0JdW5zaWduZWQgaW50IHdhaXRfdGltZTsKIAlzMzIgcmM7CiAKLQl3aGlsZSAoMSkgeworCWRvIHsKIAkJcmMgPSBydGFzX2NhbGwocnRhc190b2tlbigiaWJtLG1hbmFnZS1mbGFzaC1pbWFnZSIpLCAxLCAKIAkJCSAgICAgICAxLCBOVUxMLCBhcmdzX2J1Zi0+b3ApOwotCQlpZiAocmMgPT0gUlRBU19SQ19CVVNZKQotCQkJdWRlbGF5KDEpOwotCQllbHNlIGlmIChydGFzX2lzX2V4dGVuZGVkX2J1c3kocmMpKSB7Ci0JCQl3YWl0X3RpbWUgPSBydGFzX2V4dGVuZGVkX2J1c3lfZGVsYXlfdGltZShyYyk7Ci0JCQl1ZGVsYXkod2FpdF90aW1lICogMTAwMCk7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQorCX0gd2hpbGUgKHJ0YXNfYnVzeV9kZWxheShyYykpOwogCiAJYXJnc19idWYtPnN0YXR1cyA9IHJjOwogfQpAQCAtNDUxLDI3ICs0NDMsMTggQEAKIHN0YXRpYyB2b2lkIHZhbGlkYXRlX2ZsYXNoKHN0cnVjdCBydGFzX3ZhbGlkYXRlX2ZsYXNoX3QgKmFyZ3NfYnVmKQogewogCWludCB0b2tlbiA9IHJ0YXNfdG9rZW4oImlibSx2YWxpZGF0ZS1mbGFzaC1pbWFnZSIpOwotCXVuc2lnbmVkIGludCB3YWl0X3RpbWU7CiAJaW50IHVwZGF0ZV9yZXN1bHRzOwogCXMzMiByYzsJCiAKIAlyYyA9IDA7Ci0Jd2hpbGUoMSkgeworCWRvIHsKIAkJc3Bpbl9sb2NrKCZydGFzX2RhdGFfYnVmX2xvY2spOwogCQltZW1jcHkocnRhc19kYXRhX2J1ZiwgYXJnc19idWYtPmJ1ZiwgVkFMSURBVEVfQlVGX1NJWkUpOwogCQlyYyA9IHJ0YXNfY2FsbCh0b2tlbiwgMiwgMiwgJnVwZGF0ZV9yZXN1bHRzLCAKIAkJCSAgICAgICAodTMyKSBfX3BhKHJ0YXNfZGF0YV9idWYpLCBhcmdzX2J1Zi0+YnVmX3NpemUpOwogCQltZW1jcHkoYXJnc19idWYtPmJ1ZiwgcnRhc19kYXRhX2J1ZiwgVkFMSURBVEVfQlVGX1NJWkUpOwogCQlzcGluX3VubG9jaygmcnRhc19kYXRhX2J1Zl9sb2NrKTsKLQkJCQotCQlpZiAocmMgPT0gUlRBU19SQ19CVVNZKQotCQkJdWRlbGF5KDEpOwotCQllbHNlIGlmIChydGFzX2lzX2V4dGVuZGVkX2J1c3kocmMpKSB7Ci0JCQl3YWl0X3RpbWUgPSBydGFzX2V4dGVuZGVkX2J1c3lfZGVsYXlfdGltZShyYyk7Ci0JCQl1ZGVsYXkod2FpdF90aW1lICogMTAwMCk7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQorCX0gd2hpbGUgKHJ0YXNfYnVzeV9kZWxheShyYykpOwogCiAJYXJnc19idWYtPnN0YXR1cyA9IHJjOwogCWFyZ3NfYnVmLT51cGRhdGVfcmVzdWx0cyA9IHVwZGF0ZV9yZXN1bHRzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzX3BjaS5jCmluZGV4IDU3YjUzOWEuLjZlYjdlNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19wY2kuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfcGNpLmMKQEAgLTMxMyw3ICszMTMsOSBAQAogCWZvciAobm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIE5VTEwpOwogCSAgICAgbm9kZSAhPSBOVUxMOwogCSAgICAgbm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIG5vZGUpKSB7Ci0JCWlmIChub2RlLT50eXBlID09IE5VTEwgfHwgc3RyY21wKG5vZGUtPnR5cGUsICJwY2kiKSAhPSAwKQorCisJCWlmIChub2RlLT50eXBlID09IE5VTEwgfHwgKHN0cmNtcChub2RlLT50eXBlLCAicGNpIikgIT0gMCAmJgorCQkJCQkgICBzdHJjbXAobm9kZS0+dHlwZSwgInBjaWV4IikgIT0gMCkpCiAJCQljb250aW51ZTsKIAogCQlwaGIgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIobm9kZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC1jb21tb24uYwppbmRleCA2ODRhYjFkLi5iZDMyODEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAtY29tbW9uLmMKQEAgLTQ0Myw2ICs0NDMsNyBAQAogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAoraW50IF9faW5pdGRhdGEgZG9fZWFybHlfeG1vbjsKICNpZmRlZiBDT05GSUdfWE1PTgogc3RhdGljIGludCBfX2luaXQgZWFybHlfeG1vbihjaGFyICpwKQogewpAQCAtNDU2LDcgKzQ1Nyw3IEBACiAJCQlyZXR1cm4gMDsKIAl9CiAJeG1vbl9pbml0KDEpOwotCWRlYnVnZ2VyKE5VTEwpOworCWRvX2Vhcmx5X3htb24gPSAxOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MjQsMyArNTI1LDIwIEBACiAJcmV0dXJuIHBwY19tZC5jaGVja19sZWdhY3lfaW9wb3J0KGJhc2VfcG9ydCk7CiB9CiBFWFBPUlRfU1lNQk9MKGNoZWNrX2xlZ2FjeV9pb3BvcnQpOworCitzdGF0aWMgaW50IHBwY19wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlwcGNfbWQucGFuaWMocHRyKTsgIC8qIE1heSBub3QgcmV0dXJuICovCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBwY19wYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHBwY19wYW5pY19ldmVudCwKKwkucHJpb3JpdHkgPSBJTlRfTUlOIC8qIG1heSBub3QgcmV0dXJuOyBtdXN0IGJlIGRvbmUgbGFzdCAqLworfTsKKwordm9pZCBfX2luaXQgc2V0dXBfcGFuaWModm9pZCkKK3sKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZwcGNfcGFuaWNfYmxvY2spOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC5oIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cC5oCmluZGV4IDJlYmJhNzUuLjRjNjdhZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXAuaAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwLmgKQEAgLTIsNSArMiw4IEBACiAjZGVmaW5lIF9QT1dFUlBDX0tFUk5FTF9TRVRVUF9ICiAKIHZvaWQgY2hlY2tfZm9yX2luaXRyZCh2b2lkKTsKK3ZvaWQgZG9faW5pdF9ib290bWVtKHZvaWQpOwordm9pZCBzZXR1cF9wYW5pYyh2b2lkKTsKK2V4dGVybiBpbnQgZG9fZWFybHlfeG1vbjsKIAogI2VuZGlmIC8qIF9QT1dFUlBDX0tFUk5FTF9TRVRVUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggNjlhYzI1Ny4uZTVhNDQ4MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfMzIuYwpAQCAtMTMxLDEyICsxMzEsNiBAQAogCS8qIERvIHNvbWUgZWFybHkgaW5pdGlhbGl6YXRpb24gYmFzZWQgb24gdGhlIGZsYXQgZGV2aWNlIHRyZWUgKi8KIAllYXJseV9pbml0X2RldnRyZWUoX192YShkdF9wdHIpKTsKIAotCS8qIENoZWNrIGRlZmF1bHQgY29tbWFuZCBsaW5lICovCi0jaWZkZWYgQ09ORklHX0NNRExJTkUKLQlpZiAoY21kX2xpbmVbMF0gPT0gMCkKLQkJc3RybGNweShjbWRfbGluZSwgQ09ORklHX0NNRExJTkUsIHNpemVvZihjbWRfbGluZSkpOwotI2VuZGlmIC8qIENPTkZJR19DTURMSU5FICovCi0KIAlwcm9iZV9tYWNoaW5lKCk7CiAKICNpZmRlZiBDT05GSUdfNnh4CkBAIC0yMzUsNyArMjI5LDcgQEAKIC8qIFdhcm5pbmcsIElPIGJhc2UgaXMgbm90IHlldCBpbml0ZWQgKi8KIHZvaWQgX19pbml0IHNldHVwX2FyY2goY2hhciAqKmNtZGxpbmVfcCkKIHsKLQlleHRlcm4gdm9pZCBkb19pbml0X2Jvb3RtZW0odm9pZCk7CisJKmNtZGxpbmVfcCA9IGNtZF9saW5lOwogCiAJLyogc28gdWRlbGF5IGRvZXMgc29tZXRoaW5nIHNlbnNpYmxlLCBhc3N1bWUgPD0gMTAwMCBib2dvbWlwcyAqLwogCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwMCAvIEhaOwpAQCAtMjg1LDE2ICsyNzksMTYgQEAKIAkvKiByZWJvb3Qgb24gcGFuaWMgKi8KIAlwYW5pY190aW1lb3V0ID0gMTgwOwogCisJaWYgKHBwY19tZC5wYW5pYykKKwkJc2V0dXBfcGFuaWMoKTsKKwogCWluaXRfbW0uc3RhcnRfY29kZSA9IFBBR0VfT0ZGU0VUOwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgX2V0ZXh0OwogCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZykgX2VkYXRhOwogCWluaXRfbW0uYnJrID0ga2xpbWl0OwogCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCXN0cmxjcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBjbWRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwotCSpjbWRsaW5lX3AgPSBjbWRfbGluZTsKLQotCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CisJaWYgKGRvX2Vhcmx5X3htb24pCisJCWRlYnVnZ2VyKE5VTEwpOwogCiAJLyogc2V0IHVwIHRoZSBib290bWVtIHN0dWZmIHdpdGggYXZhaWxhYmxlIG1lbW9yeSAqLwogCWRvX2luaXRfYm9vdG1lbSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDQ0NjdjNDkuLjc4ZjNhNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTEwMCwxMiArMTAwLDYgQEAKICNlbmRpZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KIAogCi1zdGF0aWMgaW50IHBwYzY0X3BhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBwcGM2NF9wYW5pY19ibG9jayA9IHsKLQkubm90aWZpZXJfY2FsbCA9IHBwYzY0X3BhbmljX2V2ZW50LAotCS5wcmlvcml0eSA9IElOVF9NSU4gLyogbWF5IG5vdCByZXR1cm47IG11c3QgYmUgZG9uZSBsYXN0ICovCi19OwotCiAjaWZkZWYgQ09ORklHX1NNUAogCiBzdGF0aWMgaW50IHNtdF9lbmFibGVkX2NtZGxpbmU7CkBAIC0xOTksOSArMTkzLDcgQEAKIAkvKiBQcm9iZSB0aGUgbWFjaGluZSB0eXBlICovCiAJcHJvYmVfbWFjaGluZSgpOwogCi0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKLQlrZHVtcF9zZXR1cCgpOwotI2VuZGlmCisJc2V0dXBfa2R1bXBfdHJhbXBvbGluZSgpOwogCiAJREJHKCJGb3VuZCwgSW5pdGlhbGl6aW5nIG1lbW9yeSBtYW5hZ2VtZW50Li4uXG4iKTsKIApAQCAtMzUzLDkgKzM0NSw2IEBACiB7CiAJREJHKCIgLT4gc2V0dXBfc3lzdGVtKClcbiIpOwogCi0jaWZkZWYgQ09ORklHX0tFWEVDCi0Ja2R1bXBfbW92ZV9kZXZpY2VfdHJlZSgpOwotI2VuZGlmCiAJLyoKIAkgKiBVbmZsYXR0ZW4gdGhlIGRldmljZS10cmVlIHBhc3NlZCBieSBwcm9tX2luaXQgb3Iga2V4ZWMKIAkgKi8KQEAgLTQyMCwxMCArNDA5LDggQEAKIAkgKi8KIAlyZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUoKTsKIAotCS8qIFNhdmUgdW5wYXJzZWQgY29tbWFuZCBsaW5lIGNvcHkgZm9yIC9wcm9jL2NtZGxpbmUgKi8KLQlzdHJsY3B5KHNhdmVkX2NvbW1hbmRfbGluZSwgY21kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKLQotCXBhcnNlX2Vhcmx5X3BhcmFtKCk7CisJaWYgKGRvX2Vhcmx5X3htb24pCisJCWRlYnVnZ2VyKE5VTEwpOwogCiAJY2hlY2tfc210X2VuYWJsZWQoKTsKIAlzbXBfc2V0dXBfY3B1X21hcHMoKTsKQEAgLTQ1NiwxMyArNDQzLDYgQEAKIAlEQkcoIiA8LSBzZXR1cF9zeXN0ZW0oKVxuIik7CiB9CiAKLXN0YXRpYyBpbnQgcHBjNjRfcGFuaWNfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCi17Ci0JcHBjX21kLnBhbmljKChjaGFyICopcHRyKTsgIC8qIE1heSBub3QgcmV0dXJuICovCi0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCiAjaWZkZWYgQ09ORklHX0lSUVNUQUNLUwogc3RhdGljIHZvaWQgX19pbml0IGlycXN0YWNrX2Vhcmx5X2luaXQodm9pZCkKIHsKQEAgLTUxNyw4ICs0OTcsNiBAQAogICovCiB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCiB7Ci0JZXh0ZXJuIHZvaWQgZG9faW5pdF9ib290bWVtKHZvaWQpOwotCiAJcHBjNjRfYm9vdF9tc2coMHgxMiwgIlNldHVwIEFyY2giKTsKIAogCSpjbWRsaW5lX3AgPSBjbWRfbGluZTsKQEAgLTUzNSw4ICs1MTMsNyBAQAogCXBhbmljX3RpbWVvdXQgPSAxODA7CiAKIAlpZiAocHBjX21kLnBhbmljKQotCQlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCi0JCQkJJnBwYzY0X3BhbmljX2Jsb2NrKTsKKwkJc2V0dXBfcGFuaWMoKTsKIAogCWluaXRfbW0uc3RhcnRfY29kZSA9IFBBR0VfT0ZGU0VUOwogCWluaXRfbW0uZW5kX2NvZGUgPSAodW5zaWduZWQgbG9uZykgX2V0ZXh0OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzMyLmMKaW5kZXggOGZkZWNhMi4uZDczYjI1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfMzIuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF8zMi5jCkBAIC00MTksOSArNDE5LDcgQEAKIHsKIAlsb25nIGVycjsKIAl1bnNpZ25lZCBpbnQgc2F2ZV9yMiA9IDA7Ci0jaWYgZGVmaW5lZChDT05GSUdfQUxUSVZFQykgfHwgZGVmaW5lZChDT05GSUdfU1BFKQogCXVuc2lnbmVkIGxvbmcgbXNyOwotI2VuZGlmCiAKIAkvKgogCSAqIHJlc3RvcmUgZ2VuZXJhbCByZWdpc3RlcnMgYnV0IG5vdCBpbmNsdWRpbmcgTVNSIG9yIFNPRlRFLiBBbHNvCkBAIC00MzAsMTEgKzQyOCwxNiBAQAogCWlmICghc2lnKQogCQlzYXZlX3IyID0gKHVuc2lnbmVkIGludClyZWdzLT5ncHJbMl07CiAJZXJyID0gcmVzdG9yZV9nZW5lcmFsX3JlZ3MocmVncywgc3IpOworCWVyciB8PSBfX2dldF91c2VyKG1zciwgJnNyLT5tY19ncmVnc1tQVF9NU1JdKTsKIAlpZiAoIXNpZykKIAkJcmVncy0+Z3ByWzJdID0gKHVuc2lnbmVkIGxvbmcpIHNhdmVfcjI7CiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKKwkvKiBpZiBkb2luZyBzaWduYWwgcmV0dXJuLCByZXN0b3JlIHRoZSBwcmV2aW91cyBsaXR0bGUtZW5kaWFuIG1vZGUgKi8KKwlpZiAoc2lnKQorCQlyZWdzLT5tc3IgPSAocmVncy0+bXNyICYgfk1TUl9MRSkgfCAobXNyICYgTVNSX0xFKTsKKwogCS8qCiAJICogRG8gdGhpcyBiZWZvcmUgdXBkYXRpbmcgdGhlIHRocmVhZCBzdGF0ZSBpbgogCSAqIGN1cnJlbnQtPnRocmVhZC5mcHIvdnIvZXZyLiAgVGhhdCB3YXksIGlmIHdlIGdldCBwcmVlbXB0ZWQKQEAgLTQ1NSw3ICs0NTgsNyBAQAogCS8qIGZvcmNlIHRoZSBwcm9jZXNzIHRvIHJlbG9hZCB0aGUgYWx0aXZlYyByZWdpc3RlcnMgZnJvbQogCSAgIGN1cnJlbnQtPnRocmVhZCB3aGVuIGl0IG5leHQgZG9lcyBhbHRpdmVjIGluc3RydWN0aW9ucyAqLwogCXJlZ3MtPm1zciAmPSB+TVNSX1ZFQzsKLQlpZiAoIV9fZ2V0X3VzZXIobXNyLCAmc3ItPm1jX2dyZWdzW1BUX01TUl0pICYmIChtc3IgJiBNU1JfVkVDKSAhPSAwKSB7CisJaWYgKG1zciAmIE1TUl9WRUMpIHsKIAkJLyogcmVzdG9yZSBhbHRpdmVjIHJlZ2lzdGVycyBmcm9tIHRoZSBzdGFjayAqLwogCQlpZiAoX19jb3B5X2Zyb21fdXNlcihjdXJyZW50LT50aHJlYWQudnIsICZzci0+bWNfdnJlZ3MsCiAJCQkJICAgICBzaXplb2Yoc3ItPm1jX3ZyZWdzKSkpCkBAIC00NzIsNyArNDc1LDcgQEAKIAkvKiBmb3JjZSB0aGUgcHJvY2VzcyB0byByZWxvYWQgdGhlIHNwZSByZWdpc3RlcnMgZnJvbQogCSAgIGN1cnJlbnQtPnRocmVhZCB3aGVuIGl0IG5leHQgZG9lcyBzcGUgaW5zdHJ1Y3Rpb25zICovCiAJcmVncy0+bXNyICY9IH5NU1JfU1BFOwotCWlmICghX19nZXRfdXNlcihtc3IsICZzci0+bWNfZ3JlZ3NbUFRfTVNSXSkgJiYgKG1zciAmIE1TUl9TUEUpICE9IDApIHsKKwlpZiAobXNyICYgTVNSX1NQRSkgewogCQkvKiByZXN0b3JlIHNwZSByZWdpc3RlcnMgZnJvbSB0aGUgc3RhY2sgKi8KIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoY3VycmVudC0+dGhyZWFkLmV2ciwgJnNyLT5tY192cmVncywKIAkJCQkgICAgIEVMRl9ORVZSUkVHICogc2l6ZW9mKHUzMikpKQpAQCAtNzU3LDEwICs3NjAsMTAgQEAKIAogCS8qIFNhdmUgdXNlciByZWdpc3RlcnMgb24gdGhlIHN0YWNrICovCiAJZnJhbWUgPSAmcnRfc2YtPnVjLnVjX21jb250ZXh0OwotCWlmICh2ZHNvMzJfcnRfc2lndHJhbXAgJiYgY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZSkgeworCWlmICh2ZHNvMzJfcnRfc2lndHJhbXAgJiYgY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19iYXNlKSB7CiAJCWlmIChzYXZlX3VzZXJfcmVncyhyZWdzLCBmcmFtZSwgMCkpCiAJCQlnb3RvIGJhZGZyYW1lOwotCQlyZWdzLT5saW5rID0gY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZSArIHZkc28zMl9ydF9zaWd0cmFtcDsKKwkJcmVncy0+bGluayA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSArIHZkc28zMl9ydF9zaWd0cmFtcDsKIAl9IGVsc2UgewogCQlpZiAoc2F2ZV91c2VyX3JlZ3MocmVncywgZnJhbWUsIF9fTlJfcnRfc2lncmV0dXJuKSkKIAkJCWdvdG8gYmFkZnJhbWU7CkBAIC03NzcsNiArNzgwLDggQEAKIAlyZWdzLT5ncHJbNV0gPSAodW5zaWduZWQgbG9uZykgJnJ0X3NmLT51YzsKIAlyZWdzLT5ncHJbNl0gPSAodW5zaWduZWQgbG9uZykgcnRfc2Y7CiAJcmVncy0+bmlwID0gKHVuc2lnbmVkIGxvbmcpIGthLT5zYS5zYV9oYW5kbGVyOworCS8qIGVudGVyIHRoZSBzaWduYWwgaGFuZGxlciBpbiBiaWctZW5kaWFuIG1vZGUgKi8KKwlyZWdzLT5tc3IgJj0gfk1TUl9MRTsKIAlyZWdzLT50cmFwID0gMDsKIAlyZXR1cm4gMTsKIApAQCAtMTAzOCwxMCArMTA0MywxMCBAQAogCSAgICB8fCBfX3B1dF91c2VyKHNpZywgJnNjLT5zaWduYWwpKQogCQlnb3RvIGJhZGZyYW1lOwogCi0JaWYgKHZkc28zMl9zaWd0cmFtcCAmJiBjdXJyZW50LT50aHJlYWQudmRzb19iYXNlKSB7CisJaWYgKHZkc28zMl9zaWd0cmFtcCAmJiBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UpIHsKIAkJaWYgKHNhdmVfdXNlcl9yZWdzKHJlZ3MsICZmcmFtZS0+bWN0eCwgMCkpCiAJCQlnb3RvIGJhZGZyYW1lOwotCQlyZWdzLT5saW5rID0gY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZSArIHZkc28zMl9zaWd0cmFtcDsKKwkJcmVncy0+bGluayA9IGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSArIHZkc28zMl9zaWd0cmFtcDsKIAl9IGVsc2UgewogCQlpZiAoc2F2ZV91c2VyX3JlZ3MocmVncywgJmZyYW1lLT5tY3R4LCBfX05SX3NpZ3JldHVybikpCiAJCQlnb3RvIGJhZGZyYW1lOwpAQCAtMTA1Niw2ICsxMDYxLDggQEAKIAlyZWdzLT5ncHJbM10gPSBzaWc7CiAJcmVncy0+Z3ByWzRdID0gKHVuc2lnbmVkIGxvbmcpIHNjOwogCXJlZ3MtPm5pcCA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlcjsKKwkvKiBlbnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgaW4gYmlnLWVuZGlhbiBtb2RlICovCisJcmVncy0+bXNyICY9IH5NU1JfTEU7CiAJcmVncy0+dHJhcCA9IDA7CiAKIAlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IGMyZGI2NDIuLjZlNzVkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2lnbmFsXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zaWduYWxfNjQuYwpAQCAtMTQxLDkgKzE0MSw3IEBACiAJdW5zaWduZWQgbG9uZyBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgc2F2ZV9yMTMgPSAwOwogCWVsZl9ncmVnX3QgKmdyZWdzID0gKGVsZl9ncmVnX3QgKilyZWdzOwotI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJdW5zaWduZWQgbG9uZyBtc3I7Ci0jZW5kaWYKIAlpbnQgaTsKIAogCS8qIElmIHRoaXMgaXMgbm90IGEgc2lnbmFsIHJldHVybiwgd2UgcHJlc2VydmUgdGhlIFRMUyBpbiByMTMgKi8KQEAgLTE1NCw3ICsxNTIsMTIgQEAKIAllcnIgfD0gX19jb3B5X2Zyb21fdXNlcihyZWdzLCAmc2MtPmdwX3JlZ3MsCiAJCQkJUFRfTVNSKnNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAKLQkvKiBza2lwIE1TUiBhbmQgU09GVEUgKi8KKwkvKiBnZXQgTVNSIHNlcGFyYXRlbHksIHRyYW5zZmVyIHRoZSBMRSBiaXQgaWYgZG9pbmcgc2lnbmFsIHJldHVybiAqLworCWVyciB8PSBfX2dldF91c2VyKG1zciwgJnNjLT5ncF9yZWdzW1BUX01TUl0pOworCWlmIChzaWcpCisJCXJlZ3MtPm1zciA9IChyZWdzLT5tc3IgJiB+TVNSX0xFKSB8IChtc3IgJiBNU1JfTEUpOworCisJLyogc2tpcCBTT0ZURSAqLwogCWZvciAoaSA9IFBUX01TUisxOyBpIDw9IFBUX1JFU1VMVDsgaSsrKSB7CiAJCWlmIChpID09IFBUX1NPRlRFKQogCQkJY29udGludWU7CkBAIC0xNzksNyArMTgyLDYgQEAKIAogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJZXJyIHw9IF9fZ2V0X3VzZXIodl9yZWdzLCAmc2MtPnZfcmVncyk7Ci0JZXJyIHw9IF9fZ2V0X3VzZXIobXNyLCAmc2MtPmdwX3JlZ3NbUFRfTVNSXSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlpZiAodl9yZWdzICYmICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHZfcmVncywgMzQgKiBzaXplb2YodmVjdG9yMTI4KSkpCkBAIC0zOTYsOCArMzk4LDggQEAKIAljdXJyZW50LT50aHJlYWQuZnBzY3IudmFsID0gMDsKIAogCS8qIFNldCB1cCB0byByZXR1cm4gZnJvbSB1c2Vyc3BhY2UuICovCi0JaWYgKHZkc282NF9ydF9zaWd0cmFtcCAmJiBjdXJyZW50LT50aHJlYWQudmRzb19iYXNlKSB7Ci0JCXJlZ3MtPmxpbmsgPSBjdXJyZW50LT50aHJlYWQudmRzb19iYXNlICsgdmRzbzY0X3J0X3NpZ3RyYW1wOworCWlmICh2ZHNvNjRfcnRfc2lndHJhbXAgJiYgY3VycmVudC0+bW0tPmNvbnRleHQudmRzb19iYXNlKSB7CisJCXJlZ3MtPmxpbmsgPSBjdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgKyB2ZHNvNjRfcnRfc2lndHJhbXA7CiAJfSBlbHNlIHsKIAkJZXJyIHw9IHNldHVwX3RyYW1wb2xpbmUoX19OUl9ydF9zaWdyZXR1cm4sICZmcmFtZS0+dHJhbXBbMF0pOwogCQlpZiAoZXJyKQpAQCAtNDEyLDYgKzQxNCw4IEBACiAKIAkvKiBTZXQgdXAgInJlZ3MiIHNvIHdlICJyZXR1cm4iIHRvIHRoZSBzaWduYWwgaGFuZGxlci4gKi8KIAllcnIgfD0gZ2V0X3VzZXIocmVncy0+bmlwLCAmZnVuY3RfZGVzY19wdHItPmVudHJ5KTsKKwkvKiBlbnRlciB0aGUgc2lnbmFsIGhhbmRsZXIgaW4gYmlnLWVuZGlhbiBtb2RlICovCisJcmVncy0+bXNyICY9IH5NU1JfTEU7CiAJcmVncy0+Z3ByWzFdID0gbmV3c3A7CiAJZXJyIHw9IGdldF91c2VyKHJlZ3MtPmdwclsyXSwgJmZ1bmN0X2Rlc2NfcHRyLT50b2MpOwogCXJlZ3MtPmdwclszXSA9IHNpZ25yOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggNTMwZjdkYi4uYzVkMTc5ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC00OTIsNyArNDkyLDcgQEAKIAkgKiAtLSBDb3J0CiAJICovCiAJaWYgKHN5c3RlbV9zdGF0ZSA8IFNZU1RFTV9SVU5OSU5HKQotCQlmb3IgKGMgPSA1MDAwOyBjICYmICFjcHVfY2FsbGluX21hcFtjcHVdOyBjLS0pCisJCWZvciAoYyA9IDUwMDAwOyBjICYmICFjcHVfY2FsbGluX21hcFtjcHVdOyBjLS0pCiAJCQl1ZGVsYXkoMTAwKTsKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAllbHNlCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c3RibC5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXN0YmwuUwppbmRleCAyNmVkMWY1Li5lZTc1Y2NmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c3RibC5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzdGJsLlMKQEAgLTMyLDYgKzMyLDEwIEBACiAjZGVmaW5lIFNZUzMyT05MWShmdW5jKQkJLmxvbmcJc3lzXyMjZnVuYwogI2RlZmluZSBTWVNYKGYsIGYzMjY0LCBmMzIpCS5sb25nCWYzMgogI2VuZGlmCisjZGVmaW5lIFNZU0NBTExfU1BVKGZ1bmMpCVNZU0NBTEwoZnVuYykKKyNkZWZpbmUgQ09NUEFUX1NZU19TUFUoZnVuYykJQ09NUEFUX1NZUyhmdW5jKQorI2RlZmluZSBQUENfU1lTX1NQVShmdW5jKQlQUENfU1lTKGZ1bmMpCisjZGVmaW5lIFNZU1hfU1BVKGYsIGYzMjY0LCBmMzIpCVNZU1goZiwgZjMyNjQsIGYzMikKIAogI2lmZGVmIENPTkZJR19QUEM2NAogI2RlZmluZSBzeXNfc2lncGVuZGluZwlzeXNfbmlfc3lzY2FsbApAQCAtMzksMzA5ICs0Myw0IEBACiAjZW5kaWYKIAogX0dMT0JBTChzeXNfY2FsbF90YWJsZSkKLVNZU0NBTEwocmVzdGFydF9zeXNjYWxsKQotU1lTQ0FMTChleGl0KQotUFBDX1NZUyhmb3JrKQotU1lTQ0FMTChyZWFkKQotU1lTQ0FMTCh3cml0ZSkKLUNPTVBBVF9TWVMob3BlbikKLVNZU0NBTEwoY2xvc2UpCi1DT01QQVRfU1lTKHdhaXRwaWQpCi1DT01QQVRfU1lTKGNyZWF0KQotU1lTQ0FMTChsaW5rKQotU1lTQ0FMTCh1bmxpbmspCi1DT01QQVRfU1lTKGV4ZWN2ZSkKLVNZU0NBTEwoY2hkaXIpCi1DT01QQVRfU1lTKHRpbWUpCi1TWVNDQUxMKG1rbm9kKQotU1lTQ0FMTChjaG1vZCkKLVNZU0NBTEwobGNob3duKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotT0xEU1lTKHN0YXQpCi1TWVNYKHN5c19sc2VlayxwcGMzMl9sc2VlayxzeXNfbHNlZWspCi1TWVNDQUxMKGdldHBpZCkKLUNPTVBBVF9TWVMobW91bnQpCi1TWVNYKHN5c19uaV9zeXNjYWxsLHN5c19vbGR1bW91bnQsc3lzX29sZHVtb3VudCkKLVNZU0NBTEwoc2V0dWlkKQotU1lTQ0FMTChnZXR1aWQpCi1DT01QQVRfU1lTKHN0aW1lKQotQ09NUEFUX1NZUyhwdHJhY2UpCi1TWVNDQUxMKGFsYXJtKQotT0xEU1lTKGZzdGF0KQotQ09NUEFUX1NZUyhwYXVzZSkKLUNPTVBBVF9TWVModXRpbWUpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1DT01QQVRfU1lTKGFjY2VzcykKLUNPTVBBVF9TWVMobmljZSkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwoc3luYykKLUNPTVBBVF9TWVMoa2lsbCkKLVNZU0NBTEwocmVuYW1lKQotQ09NUEFUX1NZUyhta2RpcikKLVNZU0NBTEwocm1kaXIpCi1TWVNDQUxMKGR1cCkKLVNZU0NBTEwocGlwZSkKLUNPTVBBVF9TWVModGltZXMpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1TWVNDQUxMKGJyaykKLVNZU0NBTEwoc2V0Z2lkKQotU1lTQ0FMTChnZXRnaWQpCi1TWVNDQUxMKHNpZ25hbCkKLVNZU0NBTEwoZ2V0ZXVpZCkKLVNZU0NBTEwoZ2V0ZWdpZCkKLVNZU0NBTEwoYWNjdCkKLVNZU0NBTEwodW1vdW50KQotU1lTQ0FMTChuaV9zeXNjYWxsKQotQ09NUEFUX1NZUyhpb2N0bCkKLUNPTVBBVF9TWVMoZmNudGwpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1DT01QQVRfU1lTKHNldHBnaWQpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1TWVNYKHN5c19uaV9zeXNjYWxsLHN5c19vbGR1bmFtZSwgc3lzX29sZHVuYW1lKQotQ09NUEFUX1NZUyh1bWFzaykKLVNZU0NBTEwoY2hyb290KQotU1lTQ0FMTCh1c3RhdCkKLVNZU0NBTEwoZHVwMikKLVNZU0NBTEwoZ2V0cHBpZCkKLVNZU0NBTEwoZ2V0cGdycCkKLVNZU0NBTEwoc2V0c2lkKQotU1lTMzJPTkxZKHNpZ2FjdGlvbikKLVNZU0NBTEwoc2dldG1hc2spCi1DT01QQVRfU1lTKHNzZXRtYXNrKQotU1lTQ0FMTChzZXRyZXVpZCkKLVNZU0NBTEwoc2V0cmVnaWQpCi1TWVMzMk9OTFkoc2lnc3VzcGVuZCkKLUNPTVBBVF9TWVMoc2lncGVuZGluZykKLUNPTVBBVF9TWVMoc2V0aG9zdG5hbWUpCi1DT01QQVRfU1lTKHNldHJsaW1pdCkKLUNPTVBBVF9TWVMob2xkX2dldHJsaW1pdCkKLUNPTVBBVF9TWVMoZ2V0cnVzYWdlKQotQ09NUEFUX1NZUyhnZXR0aW1lb2ZkYXkpCi1DT01QQVRfU1lTKHNldHRpbWVvZmRheSkKLUNPTVBBVF9TWVMoZ2V0Z3JvdXBzKQotQ09NUEFUX1NZUyhzZXRncm91cHMpCi1TWVNYKHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsLHBwY19zZWxlY3QpCi1TWVNDQUxMKHN5bWxpbmspCi1PTERTWVMobHN0YXQpCi1DT01QQVRfU1lTKHJlYWRsaW5rKQotU1lTQ0FMTCh1c2VsaWIpCi1TWVNDQUxMKHN3YXBvbikKLVNZU0NBTEwocmVib290KQotU1lTWChzeXNfbmlfc3lzY2FsbCxvbGQzMl9yZWFkZGlyLG9sZF9yZWFkZGlyKQotU1lTQ0FMTChtbWFwKQotU1lTQ0FMTChtdW5tYXApCi1TWVNDQUxMKHRydW5jYXRlKQotU1lTQ0FMTChmdHJ1bmNhdGUpCi1TWVNDQUxMKGZjaG1vZCkKLVNZU0NBTEwoZmNob3duKQotQ09NUEFUX1NZUyhnZXRwcmlvcml0eSkKLUNPTVBBVF9TWVMoc2V0cHJpb3JpdHkpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1DT01QQVRfU1lTKHN0YXRmcykKLUNPTVBBVF9TWVMoZnN0YXRmcykKLVNZU0NBTEwobmlfc3lzY2FsbCkKLUNPTVBBVF9TWVMoc29ja2V0Y2FsbCkKLUNPTVBBVF9TWVMoc3lzbG9nKQotQ09NUEFUX1NZUyhzZXRpdGltZXIpCi1DT01QQVRfU1lTKGdldGl0aW1lcikKLUNPTVBBVF9TWVMobmV3c3RhdCkKLUNPTVBBVF9TWVMobmV3bHN0YXQpCi1DT01QQVRfU1lTKG5ld2ZzdGF0KQotU1lTWChzeXNfbmlfc3lzY2FsbCxzeXNfdW5hbWUsc3lzX3VuYW1lKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotU1lTQ0FMTCh2aGFuZ3VwKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotQ09NUEFUX1NZUyh3YWl0NCkKLVNZU0NBTEwoc3dhcG9mZikKLUNPTVBBVF9TWVMoc3lzaW5mbykKLUNPTVBBVF9TWVMoaXBjKQotU1lTQ0FMTChmc3luYykKLVNZUzMyT05MWShzaWdyZXR1cm4pCi1QUENfU1lTKGNsb25lKQotQ09NUEFUX1NZUyhzZXRkb21haW5uYW1lKQotUFBDX1NZUyhuZXd1bmFtZSkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLUNPTVBBVF9TWVMoYWRqdGltZXgpCi1TWVNDQUxMKG1wcm90ZWN0KQotU1lTWChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3NpZ3Byb2NtYXNrLHN5c19zaWdwcm9jbWFzaykKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwoaW5pdF9tb2R1bGUpCi1TWVNDQUxMKGRlbGV0ZV9tb2R1bGUpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1TWVNDQUxMKHF1b3RhY3RsKQotQ09NUEFUX1NZUyhnZXRwZ2lkKQotU1lTQ0FMTChmY2hkaXIpCi1TWVNDQUxMKGJkZmx1c2gpCi1DT01QQVRfU1lTKHN5c2ZzKQotU1lTWChwcGM2NF9wZXJzb25hbGl0eSxwcGM2NF9wZXJzb25hbGl0eSxzeXNfcGVyc29uYWxpdHkpCi1TWVNDQUxMKG5pX3N5c2NhbGwpCi1TWVNDQUxMKHNldGZzdWlkKQotU1lTQ0FMTChzZXRmc2dpZCkKLVNZU0NBTEwobGxzZWVrKQotQ09NUEFUX1NZUyhnZXRkZW50cykKLVNZU1goc3lzX3NlbGVjdCxwcGMzMl9zZWxlY3QscHBjX3NlbGVjdCkKLVNZU0NBTEwoZmxvY2spCi1TWVNDQUxMKG1zeW5jKQotQ09NUEFUX1NZUyhyZWFkdikKLUNPTVBBVF9TWVMod3JpdGV2KQotQ09NUEFUX1NZUyhnZXRzaWQpCi1TWVNDQUxMKGZkYXRhc3luYykKLUNPTVBBVF9TWVMoc3lzY3RsKQotU1lTQ0FMTChtbG9jaykKLVNZU0NBTEwobXVubG9jaykKLVNZU0NBTEwobWxvY2thbGwpCi1TWVNDQUxMKG11bmxvY2thbGwpCi1DT01QQVRfU1lTKHNjaGVkX3NldHBhcmFtKQotQ09NUEFUX1NZUyhzY2hlZF9nZXRwYXJhbSkKLUNPTVBBVF9TWVMoc2NoZWRfc2V0c2NoZWR1bGVyKQotQ09NUEFUX1NZUyhzY2hlZF9nZXRzY2hlZHVsZXIpCi1TWVNDQUxMKHNjaGVkX3lpZWxkKQotQ09NUEFUX1NZUyhzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQotQ09NUEFUX1NZUyhzY2hlZF9nZXRfcHJpb3JpdHlfbWluKQotQ09NUEFUX1NZUyhzY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCi1DT01QQVRfU1lTKG5hbm9zbGVlcCkKLVNZU0NBTEwobXJlbWFwKQotU1lTQ0FMTChzZXRyZXN1aWQpCi1TWVNDQUxMKGdldHJlc3VpZCkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwocG9sbCkKLUNPTVBBVF9TWVMobmZzc2VydmN0bCkKLVNZU0NBTEwoc2V0cmVzZ2lkKQotU1lTQ0FMTChnZXRyZXNnaWQpCi1DT01QQVRfU1lTKHByY3RsKQotQ09NUEFUX1NZUyhydF9zaWdyZXR1cm4pCi1DT01QQVRfU1lTKHJ0X3NpZ2FjdGlvbikKLUNPTVBBVF9TWVMocnRfc2lncHJvY21hc2spCi1DT01QQVRfU1lTKHJ0X3NpZ3BlbmRpbmcpCi1DT01QQVRfU1lTKHJ0X3NpZ3RpbWVkd2FpdCkKLUNPTVBBVF9TWVMocnRfc2lncXVldWVpbmZvKQotQ09NUEFUX1NZUyhydF9zaWdzdXNwZW5kKQotQ09NUEFUX1NZUyhwcmVhZDY0KQotQ09NUEFUX1NZUyhwd3JpdGU2NCkKLVNZU0NBTEwoY2hvd24pCi1TWVNDQUxMKGdldGN3ZCkKLVNZU0NBTEwoY2FwZ2V0KQotU1lTQ0FMTChjYXBzZXQpCi1DT01QQVRfU1lTKHNpZ2FsdHN0YWNrKQotU1lTWChzeXNfc2VuZGZpbGU2NCxjb21wYXRfc3lzX3NlbmRmaWxlLHN5c19zZW5kZmlsZSkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVBQQ19TWVModmZvcmspCi1DT01QQVRfU1lTKGdldHJsaW1pdCkKLUNPTVBBVF9TWVMocmVhZGFoZWFkKQotU1lTMzJPTkxZKG1tYXAyKQotU1lTMzJPTkxZKHRydW5jYXRlNjQpCi1TWVMzMk9OTFkoZnRydW5jYXRlNjQpCi1TWVNYKHN5c19uaV9zeXNjYWxsLHN5c19zdGF0NjQsc3lzX3N0YXQ2NCkKLVNZU1goc3lzX25pX3N5c2NhbGwsc3lzX2xzdGF0NjQsc3lzX2xzdGF0NjQpCi1TWVNYKHN5c19uaV9zeXNjYWxsLHN5c19mc3RhdDY0LHN5c19mc3RhdDY0KQotU1lTQ0FMTChwY2ljb25maWdfcmVhZCkKLVNZU0NBTEwocGNpY29uZmlnX3dyaXRlKQotU1lTQ0FMTChwY2ljb25maWdfaW9iYXNlKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotU1lTQ0FMTChnZXRkZW50czY0KQotU1lTQ0FMTChwaXZvdF9yb290KQotU1lTWChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX2ZjbnRsNjQsc3lzX2ZjbnRsNjQpCi1TWVNDQUxMKG1hZHZpc2UpCi1TWVNDQUxMKG1pbmNvcmUpCi1TWVNDQUxMKGdldHRpZCkKLVNZU0NBTEwodGtpbGwpCi1TWVNDQUxMKHNldHhhdHRyKQotU1lTQ0FMTChsc2V0eGF0dHIpCi1TWVNDQUxMKGZzZXR4YXR0cikKLVNZU0NBTEwoZ2V0eGF0dHIpCi1TWVNDQUxMKGxnZXR4YXR0cikKLVNZU0NBTEwoZmdldHhhdHRyKQotU1lTQ0FMTChsaXN0eGF0dHIpCi1TWVNDQUxMKGxsaXN0eGF0dHIpCi1TWVNDQUxMKGZsaXN0eGF0dHIpCi1TWVNDQUxMKHJlbW92ZXhhdHRyKQotU1lTQ0FMTChscmVtb3ZleGF0dHIpCi1TWVNDQUxMKGZyZW1vdmV4YXR0cikKLUNPTVBBVF9TWVMoZnV0ZXgpCi1DT01QQVRfU1lTKHNjaGVkX3NldGFmZmluaXR5KQotQ09NUEFUX1NZUyhzY2hlZF9nZXRhZmZpbml0eSkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZU0NBTEwobmlfc3lzY2FsbCkKLVNZUzMyT05MWShzZW5kZmlsZTY0KQotQ09NUEFUX1NZUyhpb19zZXR1cCkKLVNZU0NBTEwoaW9fZGVzdHJveSkKLUNPTVBBVF9TWVMoaW9fZ2V0ZXZlbnRzKQotQ09NUEFUX1NZUyhpb19zdWJtaXQpCi1TWVNDQUxMKGlvX2NhbmNlbCkKLVNZU0NBTEwoc2V0X3RpZF9hZGRyZXNzKQotU1lTWChzeXNfZmFkdmlzZTY0LHBwYzMyX2ZhZHZpc2U2NCxzeXNfZmFkdmlzZTY0KQotU1lTQ0FMTChleGl0X2dyb3VwKQotU1lTWChzeXNfbG9va3VwX2Rjb29raWUscHBjMzJfbG9va3VwX2Rjb29raWUsc3lzX2xvb2t1cF9kY29va2llKQotU1lTQ0FMTChlcG9sbF9jcmVhdGUpCi1TWVNDQUxMKGVwb2xsX2N0bCkKLVNZU0NBTEwoZXBvbGxfd2FpdCkKLVNZU0NBTEwocmVtYXBfZmlsZV9wYWdlcykKLVNZU1goc3lzX3RpbWVyX2NyZWF0ZSxjb21wYXRfc3lzX3RpbWVyX2NyZWF0ZSxzeXNfdGltZXJfY3JlYXRlKQotQ09NUEFUX1NZUyh0aW1lcl9zZXR0aW1lKQotQ09NUEFUX1NZUyh0aW1lcl9nZXR0aW1lKQotU1lTQ0FMTCh0aW1lcl9nZXRvdmVycnVuKQotU1lTQ0FMTCh0aW1lcl9kZWxldGUpCi1DT01QQVRfU1lTKGNsb2NrX3NldHRpbWUpCi1DT01QQVRfU1lTKGNsb2NrX2dldHRpbWUpCi1DT01QQVRfU1lTKGNsb2NrX2dldHJlcykKLUNPTVBBVF9TWVMoY2xvY2tfbmFub3NsZWVwKQotU1lTWChwcGM2NF9zd2FwY29udGV4dCxwcGMzMl9zd2FwY29udGV4dCxwcGNfc3dhcGNvbnRleHQpCi1DT01QQVRfU1lTKHRna2lsbCkKLUNPTVBBVF9TWVModXRpbWVzKQotQ09NUEFUX1NZUyhzdGF0ZnM2NCkKLUNPTVBBVF9TWVMoZnN0YXRmczY0KQotU1lTWChzeXNfbmlfc3lzY2FsbCwgcHBjX2ZhZHZpc2U2NF82NCwgcHBjX2ZhZHZpc2U2NF82NCkKLVBQQ19TWVMocnRhcykKLU9MRFNZUyhkZWJ1Z19zZXRjb250ZXh0KQotU1lTQ0FMTChuaV9zeXNjYWxsKQotU1lTQ0FMTChuaV9zeXNjYWxsKQotQ09NUEFUX1NZUyhtYmluZCkKLUNPTVBBVF9TWVMoZ2V0X21lbXBvbGljeSkKLUNPTVBBVF9TWVMoc2V0X21lbXBvbGljeSkKLUNPTVBBVF9TWVMobXFfb3BlbikKLVNZU0NBTEwobXFfdW5saW5rKQotQ09NUEFUX1NZUyhtcV90aW1lZHNlbmQpCi1DT01QQVRfU1lTKG1xX3RpbWVkcmVjZWl2ZSkKLUNPTVBBVF9TWVMobXFfbm90aWZ5KQotQ09NUEFUX1NZUyhtcV9nZXRzZXRhdHRyKQotQ09NUEFUX1NZUyhrZXhlY19sb2FkKQotQ09NUEFUX1NZUyhhZGRfa2V5KQotQ09NUEFUX1NZUyhyZXF1ZXN0X2tleSkKLUNPTVBBVF9TWVMoa2V5Y3RsKQotQ09NUEFUX1NZUyh3YWl0aWQpCi1DT01QQVRfU1lTKGlvcHJpb19zZXQpCi1DT01QQVRfU1lTKGlvcHJpb19nZXQpCi1TWVNDQUxMKGlub3RpZnlfaW5pdCkKLVNZU0NBTEwoaW5vdGlmeV9hZGRfd2F0Y2gpCi1TWVNDQUxMKGlub3RpZnlfcm1fd2F0Y2gpCi1TWVNDQUxMKHNwdV9ydW4pCi1TWVNDQUxMKHNwdV9jcmVhdGUpCi1DT01QQVRfU1lTKHBzZWxlY3Q2KQotQ09NUEFUX1NZUyhwcG9sbCkKLVNZU0NBTEwodW5zaGFyZSkKLVNZU0NBTEwoc3BsaWNlKQotU1lTQ0FMTCh0ZWUpCi1TWVNDQUxMKHZtc3BsaWNlKQotQ09NUEFUX1NZUyhvcGVuYXQpCi1TWVNDQUxMKG1rZGlyYXQpCi1TWVNDQUxMKG1rbm9kYXQpCi1TWVNDQUxMKGZjaG93bmF0KQotQ09NUEFUX1NZUyhmdXRpbWVzYXQpCi1TWVNYKHN5c19uZXdmc3RhdGF0LCBzeXNfZnN0YXRhdDY0LCBzeXNfZnN0YXRhdDY0KQotU1lTQ0FMTCh1bmxpbmthdCkKLVNZU0NBTEwocmVuYW1lYXQpCi1TWVNDQUxMKGxpbmthdCkKLVNZU0NBTEwoc3ltbGlua2F0KQotU1lTQ0FMTChyZWFkbGlua2F0KQotU1lTQ0FMTChmY2htb2RhdCkKLVNZU0NBTEwoZmFjY2Vzc2F0KQotQ09NUEFUX1NZUyhnZXRfcm9idXN0X2xpc3QpCi1DT01QQVRfU1lTKHNldF9yb2J1c3RfbGlzdCkKLQotLyoKLSAqIHBsZWFzZSBhZGQgbmV3IGNhbGxzIHRvIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMKLSAqIGFzIHdlbGwgd2hlbiBhcHByb3ByaWF0ZS4KLSAqLworI2luY2x1ZGUgPGFzbS9zeXN0YmwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggMjRlM2FkNy4uZDIwOTA3NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAogLyoga2VlcCB0cmFjayBvZiB3aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBydGMgKi8KIHRpbWVfdCBsYXN0X3J0Y191cGRhdGU7Ci1leHRlcm4gaW50IHBpcmFuaGFfc2ltdWxhdG9yOwogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogdW5zaWduZWQgbG9uZyBpU2VyaWVzX3JlY2FsX3RpdGFuID0gMDsKIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YiA9IDA7IApAQCAtODU4LDQyICs4NTcsNTAgQEAKIAogRVhQT1JUX1NZTUJPTChkb19zZXR0aW1lb2ZkYXkpOwogCi12b2lkIF9faW5pdCBnZW5lcmljX2NhbGlicmF0ZV9kZWNyKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBnZXRfZnJlcShjaGFyICpuYW1lLCBpbnQgY2VsbHMsIHVuc2lnbmVkIGxvbmcgKnZhbCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdTsKIAl1bnNpZ25lZCBpbnQgKmZwOwotCWludCBub2RlX2ZvdW5kOworCWludCBmb3VuZCA9IDA7CiAKLQkvKgotCSAqIFRoZSBjcHUgbm9kZSBzaG91bGQgaGF2ZSBhIHRpbWViYXNlLWZyZXF1ZW5jeSBwcm9wZXJ0eQotCSAqIHRvIHRlbGwgdXMgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIGRlY3JlbWVudGVyIGNvdW50cy4KLQkgKi8KKwkvKiBUaGUgY3B1IG5vZGUgc2hvdWxkIGhhdmUgdGltZWJhc2UgYW5kIGNsb2NrIGZyZXF1ZW5jeSBwcm9wZXJ0aWVzICovCiAJY3B1ID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOwogCi0JcHBjX3RiX2ZyZXEgPSBERUZBVUxUX1RCX0ZSRVE7CQkvKiBoYXJkY29kZWQgZGVmYXVsdCAqLwotCW5vZGVfZm91bmQgPSAwOwogCWlmIChjcHUpIHsKLQkJZnAgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KGNwdSwgInRpbWViYXNlLWZyZXF1ZW5jeSIsCi0JCQkJCQkgIE5VTEwpOworCQlmcCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoY3B1LCBuYW1lLCBOVUxMKTsKIAkJaWYgKGZwKSB7Ci0JCQlub2RlX2ZvdW5kID0gMTsKLQkJCXBwY190Yl9mcmVxID0gKmZwOworCQkJZm91bmQgPSAxOworCQkJKnZhbCA9IDA7CisJCQl3aGlsZSAoY2VsbHMtLSkKKwkJCQkqdmFsID0gKCp2YWwgPDwgMzIpIHwgKmZwKys7CiAJCX0KKworCQlvZl9ub2RlX3B1dChjcHUpOwogCX0KLQlpZiAoIW5vZGVfZm91bmQpCisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3ZvaWQgX19pbml0IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3Iodm9pZCkKK3sKKwlwcGNfdGJfZnJlcSA9IERFRkFVTFRfVEJfRlJFUTsJCS8qIGhhcmRjb2RlZCBkZWZhdWx0ICovCisKKwlpZiAoIWdldF9mcmVxKCJpYm0sZXh0ZW5kZWQtdGltZWJhc2UtZnJlcXVlbmN5IiwgMiwgJnBwY190Yl9mcmVxKSAmJgorCSAgICAhZ2V0X2ZyZXEoInRpbWViYXNlLWZyZXF1ZW5jeSIsIDEsICZwcGNfdGJfZnJlcSkpIHsKKwogCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkc6IEVzdGltYXRpbmcgZGVjcmVtZW50ZXIgZnJlcXVlbmN5ICIKIAkJCQkiKG5vdCBmb3VuZClcbiIpOwotCi0JcHBjX3Byb2NfZnJlcSA9IERFRkFVTFRfUFJPQ19GUkVROwotCW5vZGVfZm91bmQgPSAwOwotCWlmIChjcHUpIHsKLQkJZnAgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsCi0JCQkJCQkgIE5VTEwpOwotCQlpZiAoZnApIHsKLQkJCW5vZGVfZm91bmQgPSAxOwotCQkJcHBjX3Byb2NfZnJlcSA9ICpmcDsKLQkJfQogCX0KKworCXBwY19wcm9jX2ZyZXEgPSBERUZBVUxUX1BST0NfRlJFUTsJLyogaGFyZGNvZGVkIGRlZmF1bHQgKi8KKworCWlmICghZ2V0X2ZyZXEoImlibSxleHRlbmRlZC1jbG9jay1mcmVxdWVuY3kiLCAyLCAmcHBjX3Byb2NfZnJlcSkgJiYKKwkgICAgIWdldF9mcmVxKCJjbG9jay1mcmVxdWVuY3kiLCAxLCAmcHBjX3Byb2NfZnJlcSkpIHsKKworCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkc6IEVzdGltYXRpbmcgcHJvY2Vzc29yIGZyZXF1ZW5jeSAiCisJCQkJIihub3QgZm91bmQpXG4iKTsKKwl9CisKICNpZmRlZiBDT05GSUdfQk9PS0UKIAkvKiBTZXQgdGhlIHRpbWUgYmFzZSB0byB6ZXJvICovCiAJbXRzcHIoU1BSTl9UQldMLCAwKTsKQEAgLTkwNSwxMSArOTEyLDYgQEAKIAkvKiBFbmFibGUgZGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCiAJbXRzcHIoU1BSTl9UQ1IsIFRDUl9ESUUpOwogI2VuZGlmCi0JaWYgKCFub2RlX2ZvdW5kKQotCQlwcmludGsoS0VSTl9FUlIgIldBUk5JTkc6IEVzdGltYXRpbmcgcHJvY2Vzc29yIGZyZXF1ZW5jeSAiCi0JCQkJIihub3QgZm91bmQpXG4iKTsKLQotCW9mX25vZGVfcHV0KGNwdSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgZ2V0X2Jvb3RfdGltZSh2b2lkKQpAQCAtOTQ1LDkgKzk0Nyw5IEBACiAJfSBlbHNlIHsKIAkJLyogTm9ybWFsIFBvd2VyUEMgd2l0aCB0aW1lYmFzZSByZWdpc3RlciAqLwogCQlwcGNfbWQuY2FsaWJyYXRlX2RlY3IoKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAidGltZV9pbml0OiBkZWNyZW1lbnRlciBmcmVxdWVuY3kgPSAlbHUuJS42bHUgTUh6XG4iLAorCQlwcmludGsoS0VSTl9ERUJVRyAidGltZV9pbml0OiBkZWNyZW1lbnRlciBmcmVxdWVuY3kgPSAlbHUuJS42bHUgTUh6XG4iLAogCQkgICAgICAgcHBjX3RiX2ZyZXEgLyAxMDAwMDAwLCBwcGNfdGJfZnJlcSAlIDEwMDAwMDApOwotCQlwcmludGsoS0VSTl9JTkZPICJ0aW1lX2luaXQ6IHByb2Nlc3NvciBmcmVxdWVuY3kgICA9ICVsdS4lLjZsdSBNSHpcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJ0aW1lX2luaXQ6IHByb2Nlc3NvciBmcmVxdWVuY3kgICA9ICVsdS4lLjZsdSBNSHpcbiIsCiAJCSAgICAgICBwcGNfcHJvY19mcmVxIC8gMTAwMDAwMCwgcHBjX3Byb2NfZnJlcSAlIDEwMDAwMDApOwogCQl0Yl9sYXN0X3N0YW1wID0gdGJfbGFzdF9qaWZmeSA9IGdldF90YigpOwogCX0KQEAgLTEwMTAsMTAgKzEwMTIsNyBAQAogCXRiX3RvX25zX3NjYWxlID0gc2NhbGU7CiAJdGJfdG9fbnNfc2hpZnQgPSBzaGlmdDsKIAotI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwotCWlmICghcGlyYW5oYV9zaW11bGF0b3IpCi0jZW5kaWYKLQkJdG0gPSBnZXRfYm9vdF90aW1lKCk7CisJdG0gPSBnZXRfYm9vdF90aW1lKCk7CiAKIAl3cml0ZV9zZXFsb2NrX2lycXNhdmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCmluZGV4IDA2NGE1MjUuLjUyZjU2NTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgogCiAjaW5jbHVkZSA8YXNtL2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0xMDUsMTAgKzEwNiwxOCBAQAogCXNwaW5fbG9ja19pcnEoJmRpZV9sb2NrKTsKIAlidXN0X3NwaW5sb2NrcygxKTsKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpIHsKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoMSk7Ci0JCXNldF9iYWNrbGlnaHRfbGV2ZWwoQkFDS0xJR0hUX01BWCk7CisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBwbWFjX2JhY2tsaWdodCkgeworCQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgKnByb3BzOworCisJCWRvd24oJnBtYWNfYmFja2xpZ2h0LT5zZW0pOworCQlwcm9wcyA9IHBtYWNfYmFja2xpZ2h0LT5wcm9wczsKKwkJcHJvcHMtPmJyaWdodG5lc3MgPSBwcm9wcy0+bWF4X2JyaWdodG5lc3M7CisJCXByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJCXByb3BzLT51cGRhdGVfc3RhdHVzKHBtYWNfYmFja2xpZ2h0KTsKKwkJdXAoJnBtYWNfYmFja2xpZ2h0LT5zZW0pOwogCX0KKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKICNlbmRpZgogCXByaW50aygiT29wczogJXMsIHNpZzogJWxkIFsjJWRdXG4iLCBzdHIsIGVyciwgKytkaWVfY291bnRlcik7CiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKQEAgLTY1OCw3ICs2NjcsNyBAQAogCXUzMiBpbnN0d29yZDsKIAl1MzIgcmQ7CiAKLQlpZiAoIXVzZXJfbW9kZShyZWdzKSkKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSB8fCAocmVncy0+bXNyICYgTVNSX0xFKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJQ0hFQ0tfRlVMTF9SRUdTKHJlZ3MpOwogCkBAIC04MDUsOSArODE0LDExIEBACiAKIHZvaWQgYWxpZ25tZW50X2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgZml4ZWQ7CisJaW50IGZpeGVkID0gMDsKIAotCWZpeGVkID0gZml4X2FsaWdubWVudChyZWdzKTsKKwkvKiB3ZSBkb24ndCBpbXBsZW1lbnQgbG9nZ2luZyBvZiBhbGlnbm1lbnQgZXhjZXB0aW9ucyAqLworCWlmICghKGN1cnJlbnQtPnRocmVhZC5hbGlnbl9jdGwgJiBQUl9VTkFMSUdOX1NJR0JVUykpCisJCWZpeGVkID0gZml4X2FsaWdubWVudChyZWdzKTsKIAogCWlmIChmaXhlZCA9PSAxKSB7CiAJCXJlZ3MtPm5pcCArPSA0OwkvKiBza2lwIG92ZXIgZW11bGF0ZWQgaW5zdHJ1Y3Rpb24gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdWRiZy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKaW5kZXggMzc3NGU4MC4uNjdkOWZkOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC91ZGJnLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KIApAQCAtMTQxLDEyICsxNDIsMTQgQEAKIAogdm9pZCBfX2luaXQgZGlzYWJsZV9lYXJseV9wcmludGsodm9pZCkKIHsKLSNpZiAxCiAJaWYgKCFlYXJseV9jb25zb2xlX2luaXRpYWxpemVkKQogCQlyZXR1cm47CisJaWYgKHN0cnN0cihzYXZlZF9jb21tYW5kX2xpbmUsICJ1ZGJnLWltbW9ydGFsIikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZWFybHkgY29uc29sZSBpbW1vcnRhbCAhXG4iKTsKKwkJcmV0dXJuOworCX0KIAl1bnJlZ2lzdGVyX2NvbnNvbGUoJnVkYmdfY29uc29sZSk7CiAJZWFybHlfY29uc29sZV9pbml0aWFsaXplZCA9IDA7Ci0jZW5kaWYKIH0KIAogLyogY2FsbGVkIGJ5IHNldHVwX3N5c3RlbSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZHNvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwppbmRleCA1NzNhZmI2Li5iYzNlMTViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zkc28uYwpAQCAtMjIzLDYgKzIyMyw3IEBACiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJdW5zaWduZWQgbG9uZyB2ZHNvX3BhZ2VzOwogCXVuc2lnbmVkIGxvbmcgdmRzb19iYXNlOworCWludCByYzsKIAogI2lmZGVmIENPTkZJR19QUEM2NAogCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMkJJVCkpIHsKQEAgLTIzNywyMCArMjM4LDEzIEBACiAJdmRzb19iYXNlID0gVkRTTzMyX01CQVNFOwogI2VuZGlmCiAKLQljdXJyZW50LT50aHJlYWQudmRzb19iYXNlID0gMDsKKwljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSAwOwogCiAJLyogdkRTTyBoYXMgYSBwcm9ibGVtIGFuZCB3YXMgZGlzYWJsZWQsIGp1c3QgZG9uJ3QgImVuYWJsZSIgaXQgZm9yIHRoZQogCSAqIHByb2Nlc3MKIAkgKi8KIAlpZiAodmRzb19wYWdlcyA9PSAwKQogCQlyZXR1cm4gMDsKLQotCXZtYSA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKLQlpZiAodm1hID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JbWVtc2V0KHZtYSwgMCwgc2l6ZW9mKCp2bWEpKTsKLQogCS8qIEFkZCBhIHBhZ2UgdG8gdGhlIHZkc28gc2l6ZSBmb3IgdGhlIGRhdGEgcGFnZSAqLwogCXZkc29fcGFnZXMgKys7CiAKQEAgLTI1OSwxNyArMjUzLDIzIEBACiAJICogYXQgdmRzb19iYXNlIHdoaWNoIGlzIHRoZSAibmF0dXJhbCIgYmFzZSBmb3IgaXQsIGJ1dCB3ZSBtaWdodCBmYWlsCiAJICogYW5kIGVuZCB1cCBwdXR0aW5nIGl0IGVsc2V3aGVyZS4KIAkgKi8KKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXZkc29fYmFzZSA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIHZkc29fYmFzZSwKIAkJCQkgICAgICB2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQsIDAsIDApOwotCWlmICh2ZHNvX2Jhc2UgJiB+UEFHRV9NQVNLKSB7Ci0JCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKLQkJcmV0dXJuIChpbnQpdmRzb19iYXNlOworCWlmIChJU19FUlJfVkFMVUUodmRzb19iYXNlKSkgeworCQlyYyA9IHZkc29fYmFzZTsKKwkJZ290byBmYWlsX21tYXBzZW07CiAJfQogCi0JY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZSA9IHZkc29fYmFzZTsKIAorCS8qIEFsbG9jYXRlIGEgVk1BIHN0cnVjdHVyZSBhbmQgZmlsbCBpdCB1cCAqLworCXZtYSA9IGttZW1fY2FjaGVfemFsbG9jKHZtX2FyZWFfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKHZtYSA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBmYWlsX21tYXBzZW07CisJfQogCXZtYS0+dm1fbW0gPSBtbTsKLQl2bWEtPnZtX3N0YXJ0ID0gY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZTsKKwl2bWEtPnZtX3N0YXJ0ID0gdmRzb19iYXNlOwogCXZtYS0+dm1fZW5kID0gdm1hLT52bV9zdGFydCArICh2ZHNvX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOwogCiAJLyoKQEAgLTI4MiwyMyArMjgyLDM4IEBACiAJICogSXQncyBmaW5lIHRvIHVzZSB0aGF0IGZvciBzZXR0aW5nIGJyZWFrcG9pbnRzIGluIHRoZSB2RFNPIGNvZGUKIAkgKiBwYWdlcyB0aG91Z2gKIAkgKi8KLQl2bWEtPnZtX2ZsYWdzID0gVk1fUkVBRCB8IFZNX0VYRUMgfCBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlFWEVDOworCXZtYS0+dm1fZmxhZ3MgPSBWTV9SRUFEfFZNX0VYRUN8Vk1fTUFZUkVBRHxWTV9NQVlXUklURXxWTV9NQVlFWEVDOwogCXZtYS0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtYS0+dm1fZmxhZ3MgJiAweDddOwogCXZtYS0+dm1fb3BzID0gJnZkc29fdm1vcHM7CiAKLQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCWlmIChpbnNlcnRfdm1fc3RydWN0KG1tLCB2bWEpKSB7Ci0JCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCQlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIHZtYSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KKwkvKiBJbnNlcnQgbmV3IFZNQSAqLworCXJjID0gaW5zZXJ0X3ZtX3N0cnVjdChtbSwgdm1hKTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbF92bWE7CisKKwkvKiBQdXQgdkRTTyBiYXNlIGludG8gbW0gc3RydWN0IGFuZCBhY2NvdW50IGZvciBtZW1vcnkgdXNhZ2UgKi8KKwljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvX2Jhc2UgPSB2ZHNvX2Jhc2U7CiAJbW0tPnRvdGFsX3ZtICs9ICh2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7Ci0KIAlyZXR1cm4gMDsKKworIGZhaWxfdm1hOgorCWttZW1fY2FjaGVfZnJlZSh2bV9hcmVhX2NhY2hlcCwgdm1hKTsKKyBmYWlsX21tYXBzZW06CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHJjOwogfQogCitjb25zdCBjaGFyICphcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICh2bWEtPnZtX21tICYmIHZtYS0+dm1fc3RhcnQgPT0gdm1hLT52bV9tbS0+Y29udGV4dC52ZHNvX2Jhc2UpCisJCXJldHVybiAiW3Zkc29dIjsKKwlyZXR1cm4gTlVMTDsKK30KKworCisKIHN0YXRpYyB2b2lkICogX19pbml0IGZpbmRfc2VjdGlvbjMyKEVsZjMyX0VoZHIgKmVoZHIsIGNvbnN0IGNoYXIgKnNlY25hbWUsCiAJCQkJICB1bnNpZ25lZCBsb25nICpzaXplKQogewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmVjdG9yLlMKaW5kZXggNjZiM2QwMy4uOTQxNmI0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92ZWN0b3IuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZlY3Rvci5TCkBAIC01MywxMiArNTMsMTIgQEAKIAlzdGZkCWZyMzEsOChyMSkKIAlMRENPTlNUKGZyMSwgZnB6ZXJvKQogCW1mZnMJZnIzMQotCW10ZnNmCTB4ZmYsZnIxCisJTVRGU0ZfTChmcjEpCiAJYmxyCiAKIGZwZGlzYWJsZToKIAltdGxyCXIxMgotCW10ZnNmCTB4ZmYsZnIzMQorCU1URlNGX0woZnIzMSkKIAlsZmQJZnIzMSw4KHIxKQogCWxmZAlmcjEsMTYocjEpCiAJbGZkCWZyMCwyNChyMSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Zpby5jCmluZGV4IDk3MTAyMGMuLmNkZjU4NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC92aW8uYwpAQCAtMTMsMjcgKzEzLDExNiBAQAogICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKwogI2luY2x1ZGUgPGFzbS9pb21tdS5oPgogI2luY2x1ZGUgPGFzbS9kbWEuaD4KICNpbmNsdWRlIDxhc20vdmlvLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxhc20vdGNlLmg+CisjaW5jbHVkZSA8YXNtL2Fic19hZGRyLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CisjaW5jbHVkZSA8YXNtL2lzZXJpZXMvdmlvLmg+CisjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9scF9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9jYWxsX3htLmg+CisjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaW9tbXUuaD4KIAotc3RhdGljIGNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICp2aW9fbWF0Y2hfZGV2aWNlKAotCQljb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqLCBjb25zdCBzdHJ1Y3QgdmlvX2RldiAqKTsKK2V4dGVybiBzdHJ1Y3Qgc3Vic3lzdGVtIGRldmljZXNfc3Vic3lzOyAvKiBuZWVkZWQgZm9yIHZpb19maW5kX25hbWUoKSAqLwogCi1zdHJ1Y3QgdmlvX2RldiB2aW9fYnVzX2RldmljZSAgPSB7IC8qIGZha2UgInBhcmVudCIgZGV2aWNlICovCitzdGF0aWMgc3RydWN0IHZpb19kZXYgdmlvX2J1c19kZXZpY2UgID0geyAvKiBmYWtlICJwYXJlbnQiIGRldmljZSAqLwogCS5uYW1lID0gdmlvX2J1c19kZXZpY2UuZGV2LmJ1c19pZCwKIAkudHlwZSA9ICIiLAogCS5kZXYuYnVzX2lkID0gInZpbyIsCiAJLmRldi5idXMgPSAmdmlvX2J1c190eXBlLAogfTsKIAotc3RhdGljIHN0cnVjdCB2aW9fYnVzX29wcyB2aW9fYnVzX29wczsKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKK3N0cnVjdCBkZXZpY2UgKmlTZXJpZXNfdmlvX2RldiA9ICZ2aW9fYnVzX2RldmljZS5kZXY7CitFWFBPUlRfU1lNQk9MKGlTZXJpZXNfdmlvX2Rldik7CisKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfdGFibGUgdmV0aF9pb21tdV90YWJsZTsKK3N0YXRpYyBzdHJ1Y3QgaW9tbXVfdGFibGUgdmlvX2lvbW11X3RhYmxlOworCitzdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfdmlvX2luaXQodm9pZCkKK3sKKwlpb21tdV90YWJsZV9nZXRwYXJtc19pU2VyaWVzKDI1NSwgMCwgMHhmZiwgJnZldGhfaW9tbXVfdGFibGUpOworCXZldGhfaW9tbXVfdGFibGUuaXRfc2l6ZSAvPSAyOworCXZpb19pb21tdV90YWJsZSA9IHZldGhfaW9tbXVfdGFibGU7CisJdmlvX2lvbW11X3RhYmxlLml0X29mZnNldCArPSB2ZXRoX2lvbW11X3RhYmxlLml0X3NpemU7CisKKwlpZiAoIWlvbW11X2luaXRfdGFibGUoJnZldGhfaW9tbXVfdGFibGUsIC0xKSkKKwkJcHJpbnRrKCJWaXJ0dWFsIEJ1cyBWRVRIIFRDRSB0YWJsZSBmYWlsZWQuXG4iKTsKKwlpZiAoIWlvbW11X2luaXRfdGFibGUoJnZpb19pb21tdV90YWJsZSwgLTEpKQorCQlwcmludGsoIlZpcnR1YWwgQnVzIFZJTyBUQ0UgdGFibGUgZmFpbGVkLlxuIik7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSAqdmlvX2J1aWxkX2lvbW11X3RhYmxlKHN0cnVjdCB2aW9fZGV2ICpkZXYpCit7CisjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCisJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykpIHsKKwkJaWYgKHN0cmNtcChkZXYtPnR5cGUsICJuZXR3b3JrIikgPT0gMCkKKwkJCXJldHVybiAmdmV0aF9pb21tdV90YWJsZTsKKwkJcmV0dXJuICZ2aW9faW9tbXVfdGFibGU7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXVuc2lnbmVkIGNoYXIgKmRtYV93aW5kb3c7CisJCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOworCQl1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZTsKKworCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsCisJCQkJImlibSxteS1kbWEtd2luZG93IiwgTlVMTCk7CisJCWlmICghZG1hX3dpbmRvdykKKwkJCXJldHVybiBOVUxMOworCisJCXRibCA9IGttYWxsb2Moc2l6ZW9mKCp0YmwpLCBHRlBfS0VSTkVMKTsKKworCQlvZl9wYXJzZV9kbWFfd2luZG93KGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIGRtYV93aW5kb3csCisJCQkJJnRibC0+aXRfaW5kZXgsICZvZmZzZXQsICZzaXplKTsKKworCQkvKiBUQ0UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIHRjZSBlbnRyaWVzICovCisJCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gUEFHRV9TSElGVDsKKwkJLyogb2Zmc2V0IGZvciBWSU8gc2hvdWxkIGFsd2F5cyBiZSAwICovCisJCXRibC0+aXRfb2Zmc2V0ID0gb2Zmc2V0ID4+IFBBR0VfU0hJRlQ7CisJCXRibC0+aXRfYnVzbm8gPSAwOworCQl0YmwtPml0X3R5cGUgPSBUQ0VfVkI7CisKKwkJcmV0dXJuIGlvbW11X2luaXRfdGFibGUodGJsLCAtMSk7CisJfQorfQorCisvKioKKyAqIHZpb19tYXRjaF9kZXZpY2U6IC0gVGVsbCBpZiBhIFZJTyBkZXZpY2UgaGFzIGEgbWF0Y2hpbmcKKyAqCQkJVklPIGRldmljZSBpZCBzdHJ1Y3R1cmUuCisgKiBAaWRzOglhcnJheSBvZiBWSU8gZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCisgKiBAZGV2Ogl0aGUgVklPIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhIFZJTyBkZXZpY2UgcHJlc2VudCBpbiB0aGUKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gUmV0dXJucyB0aGUgbWF0Y2hpbmcKKyAqIHZpb19kZXZpY2VfaWQgc3RydWN0dXJlIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKKwkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkcywgY29uc3Qgc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwl3aGlsZSAoaWRzLT50eXBlWzBdICE9ICdcMCcpIHsKKwkJaWYgKChzdHJuY21wKGRldi0+dHlwZSwgaWRzLT50eXBlLCBzdHJsZW4oaWRzLT50eXBlKSkgPT0gMCkgJiYKKwkJICAgIGRldmljZV9pc19jb21wYXRpYmxlKGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIGlkcy0+Y29tcGF0KSkKKwkJCXJldHVybiBpZHM7CisJCWlkcysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KIAogLyoKICAqIENvbnZlcnQgZnJvbSBzdHJ1Y3QgZGV2aWNlIHRvIHN0cnVjdCB2aW9fZGV2IGFuZCBwYXNzIHRvIGRyaXZlci4KQEAgLTEwNiwzNSArMTk1LDExMCBAQAogfQogRVhQT1JUX1NZTUJPTCh2aW9fdW5yZWdpc3Rlcl9kcml2ZXIpOwogCi0vKioKLSAqIHZpb19tYXRjaF9kZXZpY2U6IC0gVGVsbCBpZiBhIFZJTyBkZXZpY2UgaGFzIGEgbWF0Y2hpbmcKLSAqCQkJVklPIGRldmljZSBpZCBzdHJ1Y3R1cmUuCi0gKiBAaWRzOglhcnJheSBvZiBWSU8gZGV2aWNlIGlkIHN0cnVjdHVyZXMgdG8gc2VhcmNoIGluCi0gKiBAZGV2Ogl0aGUgVklPIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAotICoKLSAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhIFZJTyBkZXZpY2UgcHJlc2VudCBpbiB0aGUKLSAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4gUmV0dXJucyB0aGUgbWF0Y2hpbmcKLSAqIHZpb19kZXZpY2VfaWQgc3RydWN0dXJlIG9yIE5VTEwgaWYgdGhlcmUgaXMgbm8gbWF0Y2guCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqdmlvX21hdGNoX2RldmljZSgKLQkJY29uc3Qgc3RydWN0IHZpb19kZXZpY2VfaWQgKmlkcywgY29uc3Qgc3RydWN0IHZpb19kZXYgKmRldikKKy8qIHZpb19kZXYgcmVmY291bnQgaGl0IDAgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewotCXdoaWxlIChpZHMtPnR5cGVbMF0gIT0gJ1wwJykgewotCQlpZiAodmlvX2J1c19vcHMubWF0Y2goaWRzLCBkZXYpKQotCQkJcmV0dXJuIGlkczsKLQkJaWRzKys7CisJaWYgKGRldi0+cGxhdGZvcm1fZGF0YSkgeworCQkvKiBYWFggZnJlZSBUQ0UgdGFibGUgKi8KKwkJb2Zfbm9kZV9wdXQoZGV2LT5wbGF0Zm9ybV9kYXRhKTsKIAl9Ci0JcmV0dXJuIE5VTEw7CisJa2ZyZWUodG9fdmlvX2RldihkZXYpKTsKIH0KIAogLyoqCisgKiB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGU6IC0gUmVnaXN0ZXIgYSBuZXcgdmlvIGRldmljZS4KKyAqIEBvZl9ub2RlOglUaGUgT0Ygbm9kZSBmb3IgdGhpcyBkZXZpY2UuCisgKgorICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSB2aW9fZGV2IHN0cnVjdHVyZSBmcm9tIHRoZSBkYXRhIGluCisgKiBvZl9ub2RlIChkZXYucGxhdGZvcm1fZGF0YSkgYW5kIGFkZHMgaXQgdG8gdGhlIGxpc3Qgb2YgdmlydHVhbCBkZXZpY2VzLgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgdmlvX2RldiBvciBOVUxMIGlmIG5vZGUgaGFzCisgKiBOVUxMIGRldmljZV90eXBlIG9yIGNvbXBhdGlibGUgZmllbGRzLgorICovCitzdHJ1Y3QgdmlvX2RldiAqIF9fZGV2aW5pdCB2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlKQoreworCXN0cnVjdCB2aW9fZGV2ICp2aW9kZXY7CisJdW5zaWduZWQgaW50ICp1bml0X2FkZHJlc3M7CisJdW5zaWduZWQgaW50ICppcnFfcDsKKworCS8qIHdlIG5lZWQgdGhlICdkZXZpY2VfdHlwZScgcHJvcGVydHksIGluIG9yZGVyIHRvIG1hdGNoIHdpdGggZHJpdmVycyAqLworCWlmIChvZl9ub2RlLT50eXBlID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG5vZGUgJXMgbWlzc2luZyAnZGV2aWNlX3R5cGUnXG4iLAorCQkJCV9fRlVOQ1RJT05fXywKKwkJCQlvZl9ub2RlLT5uYW1lID8gb2Zfbm9kZS0+bmFtZSA6ICI8dW5rbm93bj4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdW5pdF9hZGRyZXNzID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShvZl9ub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKHVuaXRfYWRkcmVzcyA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBub2RlICVzIG1pc3NpbmcgJ3JlZydcbiIsCisJCQkJX19GVU5DVElPTl9fLAorCQkJCW9mX25vZGUtPm5hbWUgPyBvZl9ub2RlLT5uYW1lIDogIjx1bmtub3duPiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBhIHZpb19kZXYgZm9yIHRoaXMgbm9kZSAqLworCXZpb2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2aW9fZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHZpb2RldiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXZpb2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBvZl9ub2RlX2dldChvZl9ub2RlKTsKKworCXZpb2Rldi0+aXJxID0gTk9fSVJROworCWlycV9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShvZl9ub2RlLCAiaW50ZXJydXB0cyIsIE5VTEwpOworCWlmIChpcnFfcCkgeworCQlpbnQgdmlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKCppcnFfcCk7CisJCWlmICh2aXJxID09IE5PX0lSUSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICIKKwkJCSAgICAgICAibnVtYmVyIGZvciAlc1xuIiwgb2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJfSBlbHNlCisJCQl2aW9kZXYtPmlycSA9IGlycV9vZmZzZXRfdXAodmlycSk7CisJfQorCisJc25wcmludGYodmlvZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiV4IiwgKnVuaXRfYWRkcmVzcyk7CisJdmlvZGV2LT5uYW1lID0gb2Zfbm9kZS0+bmFtZTsKKwl2aW9kZXYtPnR5cGUgPSBvZl9ub2RlLT50eXBlOworCXZpb2Rldi0+dW5pdF9hZGRyZXNzID0gKnVuaXRfYWRkcmVzczsKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9JU0VSSUVTKSkgeworCQl1bml0X2FkZHJlc3MgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KG9mX25vZGUsCisJCQkJImxpbnV4LHVuaXRfYWRkcmVzcyIsIE5VTEwpOworCQlpZiAodW5pdF9hZGRyZXNzICE9IE5VTEwpCisJCQl2aW9kZXYtPnVuaXRfYWRkcmVzcyA9ICp1bml0X2FkZHJlc3M7CisJfQorCXZpb2Rldi0+aW9tbXVfdGFibGUgPSB2aW9fYnVpbGRfaW9tbXVfdGFibGUodmlvZGV2KTsKKworCS8qIGluaXQgZ2VuZXJpYyAnc3RydWN0IGRldmljZScgZmllbGRzOiAqLworCXZpb2Rldi0+ZGV2LnBhcmVudCA9ICZ2aW9fYnVzX2RldmljZS5kZXY7CisJdmlvZGV2LT5kZXYuYnVzID0gJnZpb19idXNfdHlwZTsKKwl2aW9kZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCisJLyogcmVnaXN0ZXIgd2l0aCBnZW5lcmljIGRldmljZSBmcmFtZXdvcmsgKi8KKwlpZiAoZGV2aWNlX3JlZ2lzdGVyKCZ2aW9kZXYtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIHJlZ2lzdGVyIGRldmljZSAlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIHZpb2Rldi0+ZGV2LmJ1c19pZCk7CisJCS8qIFhYWCBmcmVlIFRDRSB0YWJsZSAqLworCQlrZnJlZSh2aW9kZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gdmlvZGV2OworfQorRVhQT1JUX1NZTUJPTCh2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUpOworCisvKioKICAqIHZpb19idXNfaW5pdDogLSBJbml0aWFsaXplIHRoZSB2aXJ0dWFsIElPIGJ1cwogICovCi1pbnQgX19pbml0IHZpb19idXNfaW5pdChzdHJ1Y3QgdmlvX2J1c19vcHMgKm9wcykKK3N0YXRpYyBpbnQgX19pbml0IHZpb19idXNfaW5pdCh2b2lkKQogewogCWludCBlcnI7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlX3Zyb290OwogCi0JdmlvX2J1c19vcHMgPSAqb3BzOworI2lmZGVmIENPTkZJR19QUENfSVNFUklFUworCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKSB7CisJCWlvbW11X3Zpb19pbml0KCk7CisJCXZpb19idXNfZGV2aWNlLmlvbW11X3RhYmxlID0gJnZpb19pb21tdV90YWJsZTsKKwkJaVNlcmllc192aW9fZGV2ID0gJnZpb19idXNfZGV2aWNlLmRldjsKKwl9CisjZW5kaWYKIAogCWVyciA9IGJ1c19yZWdpc3RlcigmdmlvX2J1c190eXBlKTsKIAlpZiAoZXJyKSB7CkBAIC0xNTMsNDcgKzMxNyw0OCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAorCW5vZGVfdnJvb3QgPSBmaW5kX2RldmljZXMoInZkZXZpY2UiKTsKKwlpZiAobm9kZV92cm9vdCkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisKKwkJLyoKKwkJICogQ3JlYXRlIHN0cnVjdCB2aW9fZGV2aWNlcyBmb3IgZWFjaCB2aXJ0dWFsIGRldmljZSBpbgorCQkgKiB0aGUgZGV2aWNlIHRyZWUuIERyaXZlcnMgd2lsbCBhc3NvY2lhdGUgd2l0aCB0aGVtIGxhdGVyLgorCQkgKi8KKwkJZm9yIChvZl9ub2RlID0gbm9kZV92cm9vdC0+Y2hpbGQ7IG9mX25vZGUgIT0gTlVMTDsKKwkJCQlvZl9ub2RlID0gb2Zfbm9kZS0+c2libGluZykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwcm9jZXNzaW5nICVwXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIG9mX25vZGUpOworCQkJdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKG9mX25vZGUpOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CitfX2luaXRjYWxsKHZpb19idXNfaW5pdCk7CiAKLS8qIHZpb19kZXYgcmVmY291bnQgaGl0IDAgKi8KLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCB2aW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCWlmICh2aW9fYnVzX29wcy5yZWxlYXNlX2RldmljZSkKLQkJdmlvX2J1c19vcHMucmVsZWFzZV9kZXZpY2UoZGV2KTsKLQlrZnJlZSh0b192aW9fZGV2KGRldikpOwotfQotCi1zdGF0aWMgc3NpemVfdCB2aW9kZXZfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBzc2l6ZV90IG5hbWVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHRvX3Zpb19kZXYoZGV2KS0+bmFtZSk7CiB9Ci1ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIHZpb2Rldl9zaG93X25hbWUsIE5VTEwpOwogCi1zdHJ1Y3QgdmlvX2RldiAqIF9fZGV2aW5pdCB2aW9fcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aW9fZGV2ICp2aW9kZXYpCitzdGF0aWMgc3NpemVfdCBkZXZzcGVjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCS8qIGluaXQgZ2VuZXJpYyAnc3RydWN0IGRldmljZScgZmllbGRzOiAqLwotCXZpb2Rldi0+ZGV2LnBhcmVudCA9ICZ2aW9fYnVzX2RldmljZS5kZXY7Ci0JdmlvZGV2LT5kZXYuYnVzID0gJnZpb19idXNfdHlwZTsKLQl2aW9kZXYtPmRldi5yZWxlYXNlID0gdmlvX2Rldl9yZWxlYXNlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAotCS8qIHJlZ2lzdGVyIHdpdGggZ2VuZXJpYyBkZXZpY2UgZnJhbWV3b3JrICovCi0JaWYgKGRldmljZV9yZWdpc3RlcigmdmlvZGV2LT5kZXYpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byByZWdpc3RlciBkZXZpY2UgJXNcbiIsCi0JCQkJX19GVU5DVElPTl9fLCB2aW9kZXYtPmRldi5idXNfaWQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZ2aW9kZXYtPmRldiwgJmRldl9hdHRyX25hbWUpOwotCi0JcmV0dXJuIHZpb2RldjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgb2Zfbm9kZSA/IG9mX25vZGUtPmZ1bGxfbmFtZSA6ICJub25lIik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSB2aW9fZGV2X2F0dHJzW10gPSB7CisJX19BVFRSX1JPKG5hbWUpLAorCV9fQVRUUl9STyhkZXZzcGVjKSwKKwlfX0FUVFJfTlVMTAorfTsKKwogdm9pZCBfX2RldmluaXQgdmlvX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aW9fZGV2ICp2aW9kZXYpCiB7Ci0JaWYgKHZpb19idXNfb3BzLnVucmVnaXN0ZXJfZGV2aWNlKQotCQl2aW9fYnVzX29wcy51bnJlZ2lzdGVyX2RldmljZSh2aW9kZXYpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmdmlvZGV2LT5kZXYsICZkZXZfYXR0cl9uYW1lKTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmdmlvZGV2LT5kZXYpOwogfQogRVhQT1JUX1NZTUJPTCh2aW9fdW5yZWdpc3Rlcl9kZXZpY2UpOwpAQCAtMjI5LDcgKzM5NCw3IEBACiAJCQkgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFnKQogewogCXJldHVybiBpb21tdV9hbGxvY19jb2hlcmVudCh0b192aW9fZGV2KGRldiktPmlvbW11X3RhYmxlLCBzaXplLAotCQkJZG1hX2hhbmRsZSwgfjB1bCwgZmxhZyk7CisJCQlkbWFfaGFuZGxlLCB+MHVsLCBmbGFnLCAtMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZpb19mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCkBAIC0yNjcsMjIgKzQzMiwyMyBAQAogCQkJY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJY29uc3Qgc3RydWN0IHZpb19kZXYgKnZpb19kZXYgPSB0b192aW9fZGV2KGRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpkbiA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAljaGFyICpjcDsKIAlpbnQgbGVuZ3RoOwogCiAJaWYgKCFudW1fZW52cCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpZiAoIXZpb19kZXYtPmRldi5wbGF0Zm9ybV9kYXRhKQorCWlmICghZG4pCiAJCXJldHVybiAtRU5PREVWOwotCWNwID0gKGNoYXIgKilnZXRfcHJvcGVydHkodmlvX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEsICJjb21wYXRpYmxlIiwgJmxlbmd0aCk7CisJY3AgPSAoY2hhciAqKWdldF9wcm9wZXJ0eShkbiwgImNvbXBhdGlibGUiLCAmbGVuZ3RoKTsKIAlpZiAoIWNwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVudnBbMF0gPSBidWZmZXI7CiAJbGVuZ3RoID0gc2NucHJpbnRmKGJ1ZmZlciwgYnVmZmVyX3NpemUsICJNT0RBTElBUz12aW86VCVzUyVzIiwKIAkJCQl2aW9fZGV2LT50eXBlLCBjcCk7Ci0JaWYgKGJ1ZmZlcl9zaXplIC0gbGVuZ3RoIDw9IDApCisJaWYgKChidWZmZXJfc2l6ZSAtIGxlbmd0aCkgPD0gMCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJZW52cFsxXSA9IE5VTEw7CiAJcmV0dXJuIDA7CkBAIC0yOTAsOSArNDU2LDgxIEBACiAKIHN0cnVjdCBidXNfdHlwZSB2aW9fYnVzX3R5cGUgPSB7CiAJLm5hbWUgPSAidmlvIiwKKwkuZGV2X2F0dHJzID0gdmlvX2Rldl9hdHRycywKIAkudWV2ZW50ID0gdmlvX2hvdHBsdWcsCiAJLm1hdGNoID0gdmlvX2J1c19tYXRjaCwKIAkucHJvYmUgPSB2aW9fYnVzX3Byb2JlLAogCS5yZW1vdmUgPSB2aW9fYnVzX3JlbW92ZSwKIAkuc2h1dGRvd24gPSB2aW9fYnVzX3NodXRkb3duLAogfTsKKworLyoqCisgKiB2aW9fZ2V0X2F0dHJpYnV0ZTogLSBnZXQgYXR0cmlidXRlIGZvciB2aXJ0dWFsIGRldmljZQorICogQHZkZXY6CVRoZSB2aW8gZGV2aWNlIHRvIGdldCBwcm9wZXJ0eS4KKyAqIEB3aGljaDoJVGhlIHByb3BlcnR5L2F0dHJpYnV0ZSB0byBiZSBleHRyYWN0ZWQuCisgKiBAbGVuZ3RoOglQb2ludGVyIHRvIGxlbmd0aCBvZiByZXR1cm5lZCBkYXRhIHNpemUgKHVudXNlZCBpZiBOVUxMKS4KKyAqCisgKiBDYWxscyBwcm9tLmMncyBnZXRfcHJvcGVydHkoKSB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQorICogYXR0cmlidXRlIHNwZWNpZmllZCBieSBAd2hpY2gKKyovCitjb25zdCB2b2lkICp2aW9fZ2V0X2F0dHJpYnV0ZShzdHJ1Y3QgdmlvX2RldiAqdmRldiwgY2hhciAqd2hpY2gsIGludCAqbGVuZ3RoKQoreworCXJldHVybiBnZXRfcHJvcGVydHkodmRldi0+ZGV2LnBsYXRmb3JtX2RhdGEsIHdoaWNoLCBsZW5ndGgpOworfQorRVhQT1JUX1NZTUJPTCh2aW9fZ2V0X2F0dHJpYnV0ZSk7CisKKyNpZmRlZiBDT05GSUdfUFBDX1BTRVJJRVMKKy8qIHZpb19maW5kX25hbWUoKSAtIGludGVybmFsIGJlY2F1c2Ugb25seSB2aW8uYyBrbm93cyBob3cgd2UgZm9ybWF0dGVkIHRoZQorICoga29iamVjdCBuYW1lCisgKiBYWFggb25jZSB2aW9fYnVzX3R5cGUuZGV2aWNlcyBpcyBhY3R1YWxseSB1c2VkIGFzIGEga3NldCBpbgorICogZHJpdmVycy9iYXNlL2J1cy5jLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mCisgKiAiZGV2aWNlX2ZpbmQoa29ial9uYW1lLCAmdmlvX2J1c190eXBlKSIKKyAqLworc3RhdGljIHN0cnVjdCB2aW9fZGV2ICp2aW9fZmluZF9uYW1lKGNvbnN0IGNoYXIgKmtvYmpfbmFtZSkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqZm91bmQ7CisKKwlmb3VuZCA9IGtzZXRfZmluZF9vYmooJmRldmljZXNfc3Vic3lzLmtzZXQsIGtvYmpfbmFtZSk7CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gdG9fdmlvX2Rldihjb250YWluZXJfb2YoZm91bmQsIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKK30KKworLyoqCisgKiB2aW9fZmluZF9ub2RlIC0gZmluZCBhbiBhbHJlYWR5LXJlZ2lzdGVyZWQgdmlvX2RldgorICogQHZub2RlOiBkZXZpY2Vfbm9kZSBvZiB0aGUgdmlydHVhbCBkZXZpY2Ugd2UncmUgbG9va2luZyBmb3IKKyAqLworc3RydWN0IHZpb19kZXYgKnZpb19maW5kX25vZGUoc3RydWN0IGRldmljZV9ub2RlICp2bm9kZSkKK3sKKwl1aW50MzJfdCAqdW5pdF9hZGRyZXNzOworCWNoYXIga29ial9uYW1lW0JVU19JRF9TSVpFXTsKKworCS8qIGNvbnN0cnVjdCB0aGUga29iamVjdCBuYW1lIGZyb20gdGhlIGRldmljZSBub2RlICovCisJdW5pdF9hZGRyZXNzID0gKHVpbnQzMl90ICopZ2V0X3Byb3BlcnR5KHZub2RlLCAicmVnIiwgTlVMTCk7CisJaWYgKCF1bml0X2FkZHJlc3MpCisJCXJldHVybiBOVUxMOworCXNucHJpbnRmKGtvYmpfbmFtZSwgQlVTX0lEX1NJWkUsICIleCIsICp1bml0X2FkZHJlc3MpOworCisJcmV0dXJuIHZpb19maW5kX25hbWUoa29ial9uYW1lKTsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2ZpbmRfbm9kZSk7CisKK2ludCB2aW9fZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHZpb19kZXYgKmRldikKK3sKKwlpbnQgcmMgPSBoX3Zpb19zaWduYWwoZGV2LT51bml0X2FkZHJlc3MsIFZJT19JUlFfRU5BQkxFKTsKKwlpZiAocmMgIT0gSF9TVUNDRVNTKQorCQlwcmludGsoS0VSTl9FUlIgInZpbzogRXJyb3IgMHgleCBlbmFibGluZyBpbnRlcnJ1cHRzXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTCh2aW9fZW5hYmxlX2ludGVycnVwdHMpOworCitpbnQgdmlvX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmlvX2RldiAqZGV2KQoreworCWludCByYyA9IGhfdmlvX3NpZ25hbChkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9ESVNBQkxFKTsKKwlpZiAocmMgIT0gSF9TVUNDRVNTKQorCQlwcmludGsoS0VSTl9FUlIgInZpbzogRXJyb3IgMHgleCBkaXNhYmxpbmcgaW50ZXJydXB0c1xuIiwgcmMpOworCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0wodmlvX2Rpc2FibGVfaW50ZXJydXB0cyk7CisjZW5kaWYgLyogQ09ORklHX1BQQ19QU0VSSUVTICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggZmU3OWMyNTguLjhiMjU5NTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKQEAgLTkzLDYgKzkzLDExIEBACiAJCV9fcHRvdl90YWJsZV9iZWdpbiA9IC47CiAJCSooLnB0b3ZfZml4dXApOwogCQlfX3B0b3ZfdGFibGVfZW5kID0gLjsKKyNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKKwkJX19kdF9zdHJpbmdzX3N0YXJ0ID0gLjsKKwkJKiguZHRfc3RyaW5ncyk7CisJCV9fZHRfc3RyaW5nc19lbmQgPSAuOworI2VuZGlmCiAJfQogCiAJLiA9IEFMSUdOKDE2KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCmluZGV4IDM0ZjVjMmUuLmZmNzA5NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQpAQCAtMiwxMiArMiwxNSBAQAogIyBNYWtlZmlsZSBmb3IgcHBjLXNwZWNpZmljIGxpYnJhcnkgZmlsZXMuLgogIwogCitpZmVxICgkKENPTkZJR19QUEM2NCkseSkKK0VYVFJBX0NGTEFHUwkJKz0gLW1uby1taW5pbWFsLXRvYworZW5kaWYKKwogaWZlcSAoJChDT05GSUdfUFBDX01FUkdFKSx5KQogb2JqLXkJCQk6PSBzdHJpbmcubyBzdHJjYXNlLm8KIG9iai0kKENPTkZJR19QUEMzMikJKz0gZGl2NjQubyBjb3B5XzMyLm8gY2hlY2tzdW1fMzIubwogZW5kaWYKIAotb2JqLXkJCQkrPSBiaXRvcHMubwogb2JqLSQoQ09ORklHX1BQQzY0KQkrPSBjaGVja3N1bV82NC5vIGNvcHlwYWdlXzY0Lm8gY29weXVzZXJfNjQubyBcCiAJCQkgICBtZW1jcHlfNjQubyB1c2VyY29weV82NC5vIG1lbV82NC5vIHN0cmluZy5vIFwKIAkJCSAgIHN0cmNhc2UubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9iaXRvcHMuYyBiL2FyY2gvcG93ZXJwYy9saWIvYml0b3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OGFkNzEuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL2xpYi9iaXRvcHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgotCi0vKioKLSAqIGZpbmRfbmV4dF9iaXQgLSBmaW5kIHRoZSBuZXh0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uCi0gKiBAYWRkcjogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCi0gKiBAb2Zmc2V0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAotICogQHNpemU6IFRoZSBtYXhpbXVtIHNpemUgdG8gc2VhcmNoCi0gKi8KLXVuc2lnbmVkIGxvbmcgZmluZF9uZXh0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IGFkZHIgKyBCSVRPUF9XT1JEKG9mZnNldCk7Ci0JdW5zaWduZWQgbG9uZyByZXN1bHQgPSBvZmZzZXQgJiB+KEJJVFNfUEVSX0xPTkctMSk7Ci0JdW5zaWduZWQgbG9uZyB0bXA7Ci0KLQlpZiAob2Zmc2V0ID49IHNpemUpCi0JCXJldHVybiBzaXplOwotCXNpemUgLT0gcmVzdWx0OwotCW9mZnNldCAlPSBCSVRTX1BFUl9MT05HOwotCWlmIChvZmZzZXQpIHsKLQkJdG1wID0gKihwKyspOwotCQl0bXAgJj0gKH4wVUwgPDwgb2Zmc2V0KTsKLQkJaWYgKHNpemUgPCBCSVRTX1BFUl9MT05HKQotCQkJZ290byBmb3VuZF9maXJzdDsKLQkJaWYgKHRtcCkKLQkJCWdvdG8gZm91bmRfbWlkZGxlOwotCQlzaXplIC09IEJJVFNfUEVSX0xPTkc7Ci0JCXJlc3VsdCArPSBCSVRTX1BFUl9MT05HOwotCX0KLQl3aGlsZSAoc2l6ZSAmIH4oQklUU19QRVJfTE9ORy0xKSkgewotCQlpZiAoKHRtcCA9ICoocCsrKSkpCi0JCQlnb3RvIGZvdW5kX21pZGRsZTsKLQkJcmVzdWx0ICs9IEJJVFNfUEVSX0xPTkc7Ci0JCXNpemUgLT0gQklUU19QRVJfTE9ORzsKLQl9Ci0JaWYgKCFzaXplKQotCQlyZXR1cm4gcmVzdWx0OwotCXRtcCA9ICpwOwotCi1mb3VuZF9maXJzdDoKLQl0bXAgJj0gKH4wVUwgPj4gKEJJVFNfUEVSX0xPTkcgLSBzaXplKSk7Ci0JaWYgKHRtcCA9PSAwVUwpCQkvKiBBcmUgYW55IGJpdHMgc2V0PyAqLwotCQlyZXR1cm4gcmVzdWx0ICsgc2l6ZTsJLyogTm9wZS4gKi8KLWZvdW5kX21pZGRsZToKLQlyZXR1cm4gcmVzdWx0ICsgX19mZnModG1wKTsKLX0KLUVYUE9SVF9TWU1CT0woZmluZF9uZXh0X2JpdCk7Ci0KLS8qCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGZpbmRfe2ZpcnN0LG5leHR9X3plcm9fYml0IHdhcyBzdG9sZW4gZnJvbQotICogTGludXMnIGFzbS1hbHBoYS9iaXRvcHMuaC4KLSAqLwotdW5zaWduZWQgbG9uZyBmaW5kX25leHRfemVyb19iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAotCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLQljb25zdCB1bnNpZ25lZCBsb25nICpwID0gYWRkciArIEJJVE9QX1dPUkQob2Zmc2V0KTsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IG9mZnNldCAmIH4oQklUU19QRVJfTE9ORy0xKTsKLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJcmV0dXJuIHNpemU7Ci0Jc2l6ZSAtPSByZXN1bHQ7Ci0Jb2Zmc2V0ICU9IEJJVFNfUEVSX0xPTkc7Ci0JaWYgKG9mZnNldCkgewotCQl0bXAgPSAqKHArKyk7Ci0JCXRtcCB8PSB+MFVMID4+IChCSVRTX1BFUl9MT05HIC0gb2Zmc2V0KTsKLQkJaWYgKHNpemUgPCBCSVRTX1BFUl9MT05HKQotCQkJZ290byBmb3VuZF9maXJzdDsKLQkJaWYgKH50bXApCi0JCQlnb3RvIGZvdW5kX21pZGRsZTsKLQkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOwotCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKLQl9Ci0Jd2hpbGUgKHNpemUgJiB+KEJJVFNfUEVSX0xPTkctMSkpIHsKLQkJaWYgKH4odG1wID0gKihwKyspKSkKLQkJCWdvdG8gZm91bmRfbWlkZGxlOwotCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKLQkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOwotCX0KLQlpZiAoIXNpemUpCi0JCXJldHVybiByZXN1bHQ7Ci0JdG1wID0gKnA7Ci0KLWZvdW5kX2ZpcnN0OgotCXRtcCB8PSB+MFVMIDw8IHNpemU7Ci0JaWYgKHRtcCA9PSB+MFVMKQkvKiBBcmUgYW55IGJpdHMgemVybz8gKi8KLQkJcmV0dXJuIHJlc3VsdCArIHNpemU7CS8qIE5vcGUuICovCi1mb3VuZF9taWRkbGU6Ci0JcmV0dXJuIHJlc3VsdCArIGZmeih0bXApOwotfQotRVhQT1JUX1NZTUJPTChmaW5kX25leHRfemVyb19iaXQpOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBleHQyX2lsb2cyKHVuc2lnbmVkIGludCB4KQotewotCWludCBsejsKLQotCWFzbSgiY250bHp3ICUwLCUxIjogIj1yIihseik6InIiKHgpKTsKLQlyZXR1cm4gMzEgLSBsejsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZXh0Ml9mZnoodW5zaWduZWQgaW50IHgpCi17Ci0JdTMyIHJjOwotCWlmICgoeCA9IH54KSA9PSAwKQotCQlyZXR1cm4gMzI7Ci0JcmMgPSBleHQyX2lsb2cyKHggJiAteCk7Ci0JcmV0dXJuIHJjOwotfQotCi11bnNpZ25lZCBsb25nIGZpbmRfbmV4dF96ZXJvX2xlX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLAotCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotCWNvbnN0IHVuc2lnbmVkIGludCAqcCA9ICgoY29uc3QgdW5zaWduZWQgaW50ICopYWRkcikgKyAob2Zmc2V0ID4+IDUpOwotCXVuc2lnbmVkIGludCByZXN1bHQgPSBvZmZzZXQgJiB+MzE7Ci0JdW5zaWduZWQgaW50IHRtcDsKLQotCWlmIChvZmZzZXQgPj0gc2l6ZSkKLQkJcmV0dXJuIHNpemU7Ci0Jc2l6ZSAtPSByZXN1bHQ7Ci0Jb2Zmc2V0ICY9IDMxOwotCWlmIChvZmZzZXQpIHsKLQkJdG1wID0gY3B1X3RvX2xlMzJwKHArKyk7Ci0JCXRtcCB8PSB+MFUgPj4gKDMyIC0gb2Zmc2V0KTsJLyogYnVnIG9yIGZlYXR1cmUgPyAqLwotCQlpZiAoc2l6ZSA8IDMyKQotCQkJZ290byBmb3VuZF9maXJzdDsKLQkJaWYgKHRtcCAhPSB+MCkKLQkJCWdvdG8gZm91bmRfbWlkZGxlOwotCQlzaXplIC09IDMyOwotCQlyZXN1bHQgKz0gMzI7Ci0JfQotCXdoaWxlIChzaXplID49IDMyKSB7Ci0JCWlmICgodG1wID0gY3B1X3RvX2xlMzJwKHArKykpICE9IH4wKQotCQkJZ290byBmb3VuZF9taWRkbGU7Ci0JCXJlc3VsdCArPSAzMjsKLQkJc2l6ZSAtPSAzMjsKLQl9Ci0JaWYgKCFzaXplKQotCQlyZXR1cm4gcmVzdWx0OwotCXRtcCA9IGNwdV90b19sZTMycChwKTsKLWZvdW5kX2ZpcnN0OgotCXRtcCB8PSB+MCA8PCBzaXplOwotCWlmICh0bXAgPT0gfjApCQkvKiBBcmUgYW55IGJpdHMgemVybz8gKi8KLQkJcmV0dXJuIHJlc3VsdCArIHNpemU7CS8qIE5vcGUuICovCi1mb3VuZF9taWRkbGU6Ci0JcmV0dXJuIHJlc3VsdCArIGV4dDJfZmZ6KHRtcCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF96ZXJvX2xlX2JpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9sb3dfMzIuUyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd18zMi5TCmluZGV4IGVhNDY5ZWUuLjk0MjU1YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd18zMi5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd18zMi5TCkBAIC03NCwxMiArNzQsNiBAQAogICovCiAJLnRleHQKIF9HTE9CQUwoaGFzaF9wYWdlKQotI2lmZGVmIENPTkZJR19QUEM2NEJSSURHRQotCW1mbXNyCXIwCi0JY2xybGRpCXIwLHIwLDEJCS8qIG1ha2Ugc3VyZSBpdCdzIGluIDMyLWJpdCBtb2RlICovCi0JTVRNU1JEKHIwKQotCWlzeW5jCi0jZW5kaWYKIAl0b3BoeXMocjcsMCkJCQkvKiBnZXRzIC1LRVJORUxCQVNFIGludG8gcjcgKi8KICNpZmRlZiBDT05GSUdfU01QCiAJYWRkaXMJcjgscjcsbW11X2hhc2hfbG9ja0BoCkBAIC0yODUsNyArMjc5LDYgQEAKIEhhc2hfYml0cyA9IDEyCQkJCS8qIGUuZy4gMjU2a0IgaGFzaCB0YWJsZSAqLwogSGFzaF9tc2sgPSAoKCgxIDw8IEhhc2hfYml0cykgLSAxKSAqIDY0KQogCi0jaWZuZGVmIENPTkZJR19QUEM2NEJSSURHRQogLyogZGVmaW5lcyBmb3IgdGhlIFBURSBmb3JtYXQgZm9yIDMyLWJpdCBQUENzICovCiAjZGVmaW5lIFBURV9TSVpFCTgKICNkZWZpbmUgUFRFR19TSVpFCTY0CkBAIC0yOTksMjEgKzI5Miw2IEBACiAjZGVmaW5lIFNFVF9WKHIpCW9yaXMgcixyLFBURV9WQGgKICNkZWZpbmUgQ0xSX1Yocix0KQlybHdpbm0gcixyLDAsMSwzMQogCi0jZWxzZQotLyogZGVmaW5lcyBmb3IgdGhlIFBURSBmb3JtYXQgZm9yIDY0LWJpdCBQUENzICovCi0jZGVmaW5lIFBURV9TSVpFCTE2Ci0jZGVmaW5lIFBURUdfU0laRQkxMjgKLSNkZWZpbmUgTEdfUFRFR19TSVpFCTcKLSNkZWZpbmUgTERQVEV1CQlsZHUKLSNkZWZpbmUgU1RQVEUJCXN0ZAotI2RlZmluZSBDTVBQVEUJCWNtcGQKLSNkZWZpbmUgUFRFX0gJCTIKLSNkZWZpbmUgUFRFX1YJCTEKLSNkZWZpbmUgVFNUX1YocikJYW5kaS4gcixyLFBURV9WCi0jZGVmaW5lIFNFVF9WKHIpCW9yaSByLHIsUFRFX1YKLSNkZWZpbmUgQ0xSX1Yocix0KQlsaSB0LFBURV9WOyBhbmRjIHIscix0Ci0jZW5kaWYgLyogQ09ORklHX1BQQzY0QlJJREdFICovCi0KICNkZWZpbmUgSEFTSF9MRUZUCTMxLShMR19QVEVHX1NJWkUrSGFzaF9iaXRzLTEpCiAjZGVmaW5lIEhBU0hfUklHSFQJMzEtTEdfUFRFR19TSVpFCiAKQEAgLTMzMSwxNCArMzA5LDggQEAKIEVORF9GVFJfU0VDVElPTl9JRlNFVChDUFVfRlRSX05FRURfQ09IRVJFTlQpCiAKIAkvKiBDb25zdHJ1Y3QgdGhlIGhpZ2ggd29yZCBvZiB0aGUgUFBDLXN0eWxlIFBURSAocjUpICovCi0jaWZuZGVmIENPTkZJR19QUEM2NEJSSURHRQogCXJsd2lubQlyNSxyMyw3LDEsMjQJCS8qIHB1dCBWU0lEIGluIDB4N2ZmZmZmODAgYml0cyAqLwogCXJsd2ltaQlyNSxyNCwxMCwyNiwzMQkJLyogcHV0IGluIEFQSSAoYWJicmV2IHBhZ2UgaW5kZXgpICovCi0jZWxzZSAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KLQljbHJsd2kJcjMscjMsOAkJCS8qIHJlZHVjZSB2c2lkIHRvIDI0IGJpdHMgKi8KLQlzbGRpCXI1LHIzLDEyCQkvKiBzaGlmdCB2c2lkIGludG8gcG9zaXRpb24gKi8KLQlybHdpbWkJcjUscjQsMTYsMjAsMjQJCS8qIHB1dCBpbiBBUEkgKGFiYnJldiBwYWdlIGluZGV4KSAqLwotI2VuZGlmIC8qIENPTkZJR19QUEM2NEJSSURHRSAqLwogCVNFVF9WKHI1KQkJCS8qIHNldCBWICh2YWxpZCkgYml0ICovCiAKIAkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHByaW1hcnkgUFRFIGdyb3VwIGluIHRoZSBoYXNoIHRhYmxlIChyMykgKi8KQEAgLTUxNiwxNCArNDg4LDggQEAKIAlhZGQJcjMscjMscjAJCS8qIG5vdGUgY29kZSBiZWxvdyB0cmltcyB0byAyNCBiaXRzICovCiAKIAkvKiBDb25zdHJ1Y3QgdGhlIGhpZ2ggd29yZCBvZiB0aGUgUFBDLXN0eWxlIFBURSAocjExKSAqLwotI2lmbmRlZiBDT05GSUdfUFBDNjRCUklER0UKIAlybHdpbm0JcjExLHIzLDcsMSwyNAkJLyogcHV0IFZTSUQgaW4gMHg3ZmZmZmY4MCBiaXRzICovCiAJcmx3aW1pCXIxMSxyNCwxMCwyNiwzMQkJLyogcHV0IGluIEFQSSAoYWJicmV2IHBhZ2UgaW5kZXgpICovCi0jZWxzZSAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KLQljbHJsd2kJcjMscjMsOAkJCS8qIHJlZHVjZSB2c2lkIHRvIDI0IGJpdHMgKi8KLQlzbGRpCXIxMSxyMywxMgkJLyogc2hpZnQgdnNpZCBpbnRvIHBvc2l0aW9uICovCi0Jcmx3aW1pCXIxMSxyNCwxNiwyMCwyNAkJLyogcHV0IGluIEFQSSAoYWJicmV2IHBhZ2UgaW5kZXgpICovCi0jZW5kaWYgLyogQ09ORklHX1BQQzY0QlJJREdFICovCiAJU0VUX1YocjExKQkJCS8qIHNldCBWICh2YWxpZCkgYml0ICovCiAKICNpZmRlZiBDT05GSUdfU01QCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9sb3dfNjQuUyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd182NC5TCmluZGV4IGUwZDAyYzQuLjUyZTkxNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd182NC5TCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX2xvd182NC5TCkBAIC0xMzYsNiArMTM2LDcgQEAKIAlhbmQJcjAscjAscjQJCS8qIF9QQUdFX1JXICYgX1BBR0VfRElSVFkgLT5yMCBiaXQgMzAqLwogCWFuZGMJcjAscjMwLHIwCQkvKiByMCA9IHB0ZSAmIH5yMCAqLwogCXJsd2ltaQlyMyxyMCwzMi0xLDMxLDMxCS8qIEluc2VydCByZXN1bHQgaW50byBQUCBsc2IgKi8KKwlvcmkJcjMscjMsSFBURV9SX0MJCS8qIEFsd2F5cyBhZGQgIkMiIGJpdCBmb3IgcGVyZi4gKi8KIAogCS8qIFdlIGV2ZW50dWFsbHkgZG8gdGhlIGljYWNoZSBzeW5jIGhlcmUgKG1heWJlIGlubGluZSB0aGF0CiAJICogY29kZSByYXRoZXIgdGhhbiBjYWxsIGEgQyBmdW5jdGlvbi4uLikgCkBAIC0zNjgsNiArMzY5LDcgQEAKIAlybHdpbm0JcjMwLHI0LDMyLTkrNywzMS03LDMxLTcJLyogX1BBR0VfUlcgLT4gX1BBR0VfRElSVFkgKi8KIAlvcglyMzAscjMwLHIzMQogCW9yaQlyMzAscjMwLF9QQUdFX0JVU1kgfCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX0hBU0hQVEUKKwlvcmlzCXIzMCxyMzAsX1BBR0VfQ09NQk9AaAogCS8qIFdyaXRlIHRoZSBsaW51eCBQVEUgYXRvbWljYWxseSAoc2V0dGluZyBidXN5KSAqLwogCXN0ZGN4LglyMzAsMCxyNgogCWJuZS0JMWIKQEAgLTQwMCw2ICs0MDIsNyBAQAogCWFuZAlyMCxyMCxyNAkJLyogX1BBR0VfUlcgJiBfUEFHRV9ESVJUWSAtPnIwIGJpdCAzMCovCiAJYW5kYwlyMCxyMzAscjAJCS8qIHIwID0gcHRlICYgfnIwICovCiAJcmx3aW1pCXIzLHIwLDMyLTEsMzEsMzEJLyogSW5zZXJ0IHJlc3VsdCBpbnRvIFBQIGxzYiAqLworCW9yaQlyMyxyMyxIUFRFX1JfQwkJLyogQWx3YXlzIGFkZCAiQyIgYml0IGZvciBwZXJmLiAqLwogCiAJLyogV2UgZXZlbnR1YWxseSBkbyB0aGUgaWNhY2hlIHN5bmMgaGVyZSAobWF5YmUgaW5saW5lIHRoYXQKIAkgKiBjb2RlIHJhdGhlciB0aGFuIGNhbGwgYSBDIGZ1bmN0aW9uLi4uKQpAQCAtNDI2LDYgKzQyOSwxNCBAQAogCWFuZGkuCXIwLHIzMSxfUEFHRV9IQVNIUFRFCiAJbGkJcjI2LDAJCQkvKiBEZWZhdWx0IGhpZHggKi8KIAliZXEJaHRhYl9pbnNlcnRfcHRlCisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBwdGUgd2FzIGFscmVhZHkgaW5zZXJ0ZWQgaW50byB0aGUgaGFzaCB0YWJsZQorCSAqIGFzIGEgNjRrIEhXIHBhZ2UsIGFuZCBpbnZhbGlkYXRlIHRoZSA2NGsgSFBURSBpZiBzby4KKwkgKi8KKwlhbmRpcy4JcjAscjMxLF9QQUdFX0NPTUJPQGgKKwliZXEJaHRhYl9pbnZhbF9vbGRfaHB0ZQorCiAJbGQJcjYsU1RLX1BBUk0ocjYpKHIxKQogCW9yaQlyMjYscjYsMHg4MDAwCQkvKiBMb2FkIHRoZSBoaWR4IG1hc2sgKi8KIAlsZAlyMjYsMChyMjYpCkBAIC00OTYsNiArNTA3LDE5IEBACiAJLyogVHJ5IGFsbCBhZ2FpbiAqLwogCWIJaHRhYl9pbnNlcnRfcHRlCiAKKwkvKgorCSAqIENhbGwgb3V0IHRvIEMgY29kZSB0byBpbnZhbGlkYXRlIGFuIDY0ayBIVyBIUFRFIHRoYXQgaXMKKwkgKiB1c2VsZXNzIG5vdyB0aGF0IHRoZSBzZWdtZW50IGhhcyBiZWVuIHN3aXRjaGVkIHRvIDRrIHBhZ2VzLgorCSAqLworaHRhYl9pbnZhbF9vbGRfaHB0ZToKKwltcglyMyxyMjkJCQkvKiB2aXJ0dWFsIGFkZHIgKi8KKwltcglyNCxyMzEJCQkvKiBQVEUucHRlICovCisJbGkJcjUsMAkJCS8qIFBURS5oaWR4ICovCisJbGkJcjYsTU1VX1BBR0VfNjRLCQkvKiBwc2l6ZSAqLworCWxkCXI3LFNUS19QQVJNKHI4KShyMSkJLyogbG9jYWwgKi8KKwlibAkuZmx1c2hfaGFzaF9wYWdlCisJYglodGFiX2luc2VydF9wdGUKKwkKIGh0YWJfYmFpbF9vazoKIAlsaQlyMywwCiAJYglodGFiX2JhaWwKQEAgLTYzNiw2ICs2NjAsMTIgQEAKIAkgKiBpcyBjaGFuZ2luZyB0aGlzIFBURSBhbnl3YXkgYW5kIG1pZ2h0IGhhc2ggaXQuCiAJICovCiAJYm5lLQlodDY0X2JhaWxfb2sKK0JFR0lOX0ZUUl9TRUNUSU9OCisJLyogQ2hlY2sgaWYgUFRFIGhhcyB0aGUgY2FjaGUtaW5oaWJpdCBiaXQgc2V0ICovCisJYW5kaS4JcjAscjMxLF9QQUdFX05PX0NBQ0hFCisJLyogSWYgc28sIGJhaWwgb3V0IGFuZCByZWZhdWx0IGFzIGEgNGsgcGFnZSAqLworCWJuZS0JaHQ2NF9iYWlsX29rCitFTkRfRlRSX1NFQ1RJT05fSUZDTFIoQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFKQogCS8qIFByZXBhcmUgbmV3IFBURSB2YWx1ZSAodHVybiBhY2Nlc3MgUlcgaW50byBESVJUWSwgdGhlbgogCSAqIGFkZCBCVVNZLEhBU0hQVEUgYW5kIEFDQ0VTU0VEKQogCSAqLwpAQCAtNjcxLDYgKzcwMSw3IEBACiAJYW5kCXIwLHIwLHI0CQkvKiBfUEFHRV9SVyAmIF9QQUdFX0RJUlRZIC0+cjAgYml0IDMwKi8KIAlhbmRjCXIwLHIzMCxyMAkJLyogcjAgPSBwdGUgJiB+cjAgKi8KIAlybHdpbWkJcjMscjAsMzItMSwzMSwzMQkvKiBJbnNlcnQgcmVzdWx0IGludG8gUFAgbHNiICovCisJb3JpCXIzLHIzLEhQVEVfUl9DCQkvKiBBbHdheXMgYWRkICJDIiBiaXQgZm9yIHBlcmYuICovCiAKIAkvKiBXZSBldmVudHVhbGx5IGRvIHRoZSBpY2FjaGUgc3luYyBoZXJlIChtYXliZSBpbmxpbmUgdGhhdAogCSAqIGNvZGUgcmF0aGVyIHRoYW4gY2FsbCBhIEMgZnVuY3Rpb24uLi4pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF9uYXRpdmVfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCmluZGV4IDk5NDg1NmUuLmEwZjNjYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX25hdGl2ZV82NC5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJREJHX0xPVygiIC0+IGhpdFxuIik7CiAJCS8qIFVwZGF0ZSB0aGUgSFBURSAqLwogCQlocHRlcC0+ciA9IChocHRlcC0+ciAmIH4oSFBURV9SX1BQIHwgSFBURV9SX04pKSB8Ci0JCQkobmV3cHAgJiAoSFBURV9SX1BQIHwgSFBURV9SX04pKTsKKwkJCShuZXdwcCAmIChIUFRFX1JfUFAgfCBIUFRFX1JfTiB8IEhQVEVfUl9DKSk7CiAJCW5hdGl2ZV91bmxvY2tfaHB0ZShocHRlcCk7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jIGIvYXJjaC9wb3dlcnBjL21tL2hhc2hfdXRpbHNfNjQuYwppbmRleCBjMDA2ZDkwLi5kMDNmZDJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vaGFzaF91dGlsc182NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9oYXNoX3V0aWxzXzY0LmMKQEAgLTkyLDEwICs5MiwxNSBAQAogdW5zaWduZWQgbG9uZyBodGFiX2hhc2hfbWFzazsKIGludCBtbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfNEs7CiBpbnQgbW11X3ZpcnR1YWxfcHNpemUgPSBNTVVfUEFHRV80SzsKK2ludCBtbXVfdm1hbGxvY19wc2l6ZSA9IE1NVV9QQUdFXzRLOworaW50IG1tdV9pb19wc2l6ZSA9IE1NVV9QQUdFXzRLOwogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIGludCBtbXVfaHVnZV9wc2l6ZSA9IE1NVV9QQUdFXzE2TTsKIHVuc2lnbmVkIGludCBIUEFHRV9TSElGVDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCitpbnQgbW11X2NpX3Jlc3RyaWN0aW9uczsKKyNlbmRpZgogCiAvKiBUaGVyZSBhcmUgZGVmaW5pdGlvbnMgb2YgcGFnZSBzaXplcyBhcnJheXMgdG8gYmUgdXNlZCB3aGVuIG5vbmUKICAqIGlzIHByb3ZpZGVkIGJ5IHRoZSBmaXJtd2FyZS4KQEAgLTMwOCwyMCArMzEzLDMxIEBACiAJZWxzZSBpZiAobW11X3BzaXplX2RlZnNbTU1VX1BBR0VfMU1dLnNoaWZ0KQogCQltbXVfbGluZWFyX3BzaXplID0gTU1VX1BBR0VfMU07CiAKKyNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwogCS8qCiAJICogUGljayBhIHNpemUgZm9yIHRoZSBvcmRpbmFyeSBwYWdlcy4gRGVmYXVsdCBpcyA0Sywgd2Ugc3VwcG9ydAotCSAqIDY0SyBpZiBjYWNoZSBpbmhpYml0ZWQgbGFyZ2UgcGFnZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUKLQkgKiBwcm9jZXNzb3IKKwkgKiA2NEsgZm9yIHVzZXIgbWFwcGluZ3MgYW5kIHZtYWxsb2MgaWYgc3VwcG9ydGVkIGJ5IHRoZSBwcm9jZXNzb3IuCisJICogV2Ugb25seSB1c2UgNjRrIGZvciBpb3JlbWFwIGlmIHRoZSBwcm9jZXNzb3IKKwkgKiAoYW5kIGZpcm13YXJlKSBzdXBwb3J0IGNhY2hlLWluaGliaXRlZCBsYXJnZSBwYWdlcy4KKwkgKiBJZiBub3QsIHdlIHVzZSA0ayBhbmQgc2V0IG1tdV9jaV9yZXN0cmljdGlvbnMgc28gdGhhdAorCSAqIGhhc2hfcGFnZSBrbm93cyB0byBzd2l0Y2ggcHJvY2Vzc2VzIHRoYXQgdXNlIGNhY2hlLWluaGliaXRlZAorCSAqIG1hcHBpbmdzIHRvIDRrIHBhZ2VzLgogCSAqLwotI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCi0JaWYgKG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzY0S10uc2hpZnQgJiYKLQkgICAgY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ0lfTEFSR0VfUEFHRSkpCisJaWYgKG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzY0S10uc2hpZnQpIHsKIAkJbW11X3ZpcnR1YWxfcHNpemUgPSBNTVVfUEFHRV82NEs7CisJCW1tdV92bWFsbG9jX3BzaXplID0gTU1VX1BBR0VfNjRLOworCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQ0lfTEFSR0VfUEFHRSkpCisJCQltbXVfaW9fcHNpemUgPSBNTVVfUEFHRV82NEs7CisJCWVsc2UKKwkJCW1tdV9jaV9yZXN0cmljdGlvbnMgPSAxOworCX0KICNlbmRpZgogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUGFnZSBvcmRlcnM6IGxpbmVhciBtYXBwaW5nID0gJWQsIG90aGVycyA9ICVkXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJQYWdlIG9yZGVyczogbGluZWFyIG1hcHBpbmcgPSAlZCwgIgorCSAgICAgICAidmlydHVhbCA9ICVkLCBpbyA9ICVkXG4iLAogCSAgICAgICBtbXVfcHNpemVfZGVmc1ttbXVfbGluZWFyX3BzaXplXS5zaGlmdCwKLQkgICAgICAgbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNoaWZ0KTsKKwkgICAgICAgbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNoaWZ0LAorCSAgICAgICBtbXVfcHNpemVfZGVmc1ttbXVfaW9fcHNpemVdLnNoaWZ0KTsKIAogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIAkvKiBJbml0IGxhcmdlIHBhZ2Ugc2l6ZS4gQ3VycmVudGx5LCB3ZSBwaWNrIDE2TSBvciAxTSBkZXBlbmRpbmcKQEAgLTU1Niw2ICs1NzIsNyBAQAogCXB0ZV90ICpwdGVwOwogCWNwdW1hc2tfdCB0bXA7CiAJaW50IHJjLCB1c2VyX3JlZ2lvbiA9IDAsIGxvY2FsID0gMDsKKwlpbnQgcHNpemU7CiAKIAlEQkdfTE9XKCJoYXNoX3BhZ2UoZWE9JTAxNmx4LCBhY2Nlc3M9JWx4LCB0cmFwPSVseFxuIiwKIAkJZWEsIGFjY2VzcywgdHJhcCk7CkBAIC01NzUsMTAgKzU5MiwxNSBAQAogCQkJcmV0dXJuIDE7CiAJCX0KIAkJdnNpZCA9IGdldF92c2lkKG1tLT5jb250ZXh0LmlkLCBlYSk7CisJCXBzaXplID0gbW0tPmNvbnRleHQudXNlcl9wc2l6ZTsKIAkJYnJlYWs7CiAJY2FzZSBWTUFMTE9DX1JFR0lPTl9JRDoKIAkJbW0gPSAmaW5pdF9tbTsKIAkJdnNpZCA9IGdldF9rZXJuZWxfdnNpZChlYSk7CisJCWlmIChlYSA8IFZNQUxMT0NfRU5EKQorCQkJcHNpemUgPSBtbXVfdm1hbGxvY19wc2l6ZTsKKwkJZWxzZQorCQkJcHNpemUgPSBtbXVfaW9fcHNpemU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIE5vdCBhIHZhbGlkIHJhbmdlCkBAIC02MjksNyArNjUxLDQwIEBACiAjaWZuZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCiAJcmMgPSBfX2hhc2hfcGFnZV80SyhlYSwgYWNjZXNzLCB2c2lkLCBwdGVwLCB0cmFwLCBsb2NhbCk7CiAjZWxzZQotCWlmIChtbXVfdmlydHVhbF9wc2l6ZSA9PSBNTVVfUEFHRV82NEspCisJaWYgKG1tdV9jaV9yZXN0cmljdGlvbnMpIHsKKwkJLyogSWYgdGhpcyBQVEUgaXMgbm9uLWNhY2hlYWJsZSwgc3dpdGNoIHRvIDRrICovCisJCWlmIChwc2l6ZSA9PSBNTVVfUEFHRV82NEsgJiYKKwkJICAgIChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX05PX0NBQ0hFKSkgeworCQkJaWYgKHVzZXJfcmVnaW9uKSB7CisJCQkJcHNpemUgPSBNTVVfUEFHRV80SzsKKwkJCQltbS0+Y29udGV4dC51c2VyX3BzaXplID0gTU1VX1BBR0VfNEs7CisJCQkJbW0tPmNvbnRleHQuc2xscCA9IFNMQl9WU0lEX1VTRVIgfAorCQkJCQltbXVfcHNpemVfZGVmc1tNTVVfUEFHRV80S10uc2xscDsKKwkJCX0gZWxzZSBpZiAoZWEgPCBWTUFMTE9DX0VORCkgeworCQkJCS8qCisJCQkJICogc29tZSBkcml2ZXIgZGlkIGEgbm9uLWNhY2hlYWJsZSBtYXBwaW5nCisJCQkJICogaW4gdm1hbGxvYyBzcGFjZSwgc28gc3dpdGNoIHZtYWxsb2MKKwkJCQkgKiB0byA0ayBwYWdlcworCQkJCSAqLworCQkJCXByaW50ayhLRVJOX0FMRVJUICJSZWR1Y2luZyB2bWFsbG9jIHNlZ21lbnQgIgorCQkJCSAgICAgICAidG8gNGtCIHBhZ2VzIGJlY2F1c2Ugb2YgIgorCQkJCSAgICAgICAibm9uLWNhY2hlYWJsZSBtYXBwaW5nXG4iKTsKKwkJCQlwc2l6ZSA9IG1tdV92bWFsbG9jX3BzaXplID0gTU1VX1BBR0VfNEs7CisJCQl9CisJCX0KKwkJaWYgKHVzZXJfcmVnaW9uKSB7CisJCQlpZiAocHNpemUgIT0gZ2V0X3BhY2EoKS0+Y29udGV4dC51c2VyX3BzaXplKSB7CisJCQkJZ2V0X3BhY2EoKS0+Y29udGV4dCA9IG1tLT5jb250ZXh0OworCQkJCXNsYl9mbHVzaF9hbmRfcmVib2x0KCk7CisJCQl9CisJCX0gZWxzZSBpZiAoZ2V0X3BhY2EoKS0+dm1hbGxvY19zbGxwICE9CisJCQkgICBtbXVfcHNpemVfZGVmc1ttbXVfdm1hbGxvY19wc2l6ZV0uc2xscCkgeworCQkJZ2V0X3BhY2EoKS0+dm1hbGxvY19zbGxwID0KKwkJCQltbXVfcHNpemVfZGVmc1ttbXVfdm1hbGxvY19wc2l6ZV0uc2xscDsKKwkJCXNsYl9mbHVzaF9hbmRfcmVib2x0KCk7CisJCX0KKwl9CisJaWYgKHBzaXplID09IE1NVV9QQUdFXzY0SykKIAkJcmMgPSBfX2hhc2hfcGFnZV82NEsoZWEsIGFjY2VzcywgdnNpZCwgcHRlcCwgdHJhcCwgbG9jYWwpOwogCWVsc2UKIAkJcmMgPSBfX2hhc2hfcGFnZV80SyhlYSwgYWNjZXNzLCB2c2lkLCBwdGVwLCB0cmFwLCBsb2NhbCk7CkBAIC02ODEsNyArNzM2LDE4IEBACiAjaWZuZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCiAJX19oYXNoX3BhZ2VfNEsoZWEsIGFjY2VzcywgdnNpZCwgcHRlcCwgdHJhcCwgbG9jYWwpOwogI2Vsc2UKLQlpZiAobW11X3ZpcnR1YWxfcHNpemUgPT0gTU1VX1BBR0VfNjRLKQorCWlmIChtbXVfY2lfcmVzdHJpY3Rpb25zKSB7CisJCS8qIElmIHRoaXMgUFRFIGlzIG5vbi1jYWNoZWFibGUsIHN3aXRjaCB0byA0ayAqLworCQlpZiAobW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9PSBNTVVfUEFHRV82NEsgJiYKKwkJICAgIChwdGVfdmFsKCpwdGVwKSAmIF9QQUdFX05PX0NBQ0hFKSkgeworCQkJbW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9IE1NVV9QQUdFXzRLOworCQkJbW0tPmNvbnRleHQuc2xscCA9IFNMQl9WU0lEX1VTRVIgfAorCQkJCW1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFXzRLXS5zbGxwOworCQkJZ2V0X3BhY2EoKS0+Y29udGV4dCA9IG1tLT5jb250ZXh0OworCQkJc2xiX2ZsdXNoX2FuZF9yZWJvbHQoKTsKKwkJfQorCX0KKwlpZiAobW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9PSBNTVVfUEFHRV82NEspCiAJCV9faGFzaF9wYWdlXzY0SyhlYSwgYWNjZXNzLCB2c2lkLCBwdGVwLCB0cmFwLCBsb2NhbCk7CiAJZWxzZQogCQlfX2hhc2hfcGFnZV80SyhlYSwgYWNjZXNzLCB2c2lkLCBwdGVwLCB0cmFwLCBsb2NhbCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbG1iLmMgYi9hcmNoL3Bvd2VycGMvbW0vbG1iLmMKaW5kZXggNDE3ZDU4NS4uOGI2ZjUyMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2xtYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9sbWIuYwpAQCAtODksMTggKzg5LDIzIEBACiAJcmV0dXJuIGxtYl9hZGRyc19hZGphY2VudChiYXNlMSwgc2l6ZTEsIGJhc2UyLCBzaXplMik7CiB9CiAKK3N0YXRpYyB2b2lkIF9faW5pdCBsbWJfcmVtb3ZlX3JlZ2lvbihzdHJ1Y3QgbG1iX3JlZ2lvbiAqcmduLCB1bnNpZ25lZCBsb25nIHIpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gcjsgaSA8IHJnbi0+Y250IC0gMTsgaSsrKSB7CisJCXJnbi0+cmVnaW9uW2ldLmJhc2UgPSByZ24tPnJlZ2lvbltpICsgMV0uYmFzZTsKKwkJcmduLT5yZWdpb25baV0uc2l6ZSA9IHJnbi0+cmVnaW9uW2kgKyAxXS5zaXplOworCX0KKwlyZ24tPmNudC0tOworfQorCiAvKiBBc3N1bXB0aW9uOiBiYXNlIGFkZHIgb2YgcmVnaW9uIDEgPCBiYXNlIGFkZHIgb2YgcmVnaW9uIDIgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBsbWJfY29hbGVzY2VfcmVnaW9ucyhzdHJ1Y3QgbG1iX3JlZ2lvbiAqcmduLAogCQl1bnNpZ25lZCBsb25nIHIxLCB1bnNpZ25lZCBsb25nIHIyKQogewotCXVuc2lnbmVkIGxvbmcgaTsKLQogCXJnbi0+cmVnaW9uW3IxXS5zaXplICs9IHJnbi0+cmVnaW9uW3IyXS5zaXplOwotCWZvciAoaT1yMjsgaSA8IHJnbi0+Y250LTE7IGkrKykgewotCQlyZ24tPnJlZ2lvbltpXS5iYXNlID0gcmduLT5yZWdpb25baSsxXS5iYXNlOwotCQlyZ24tPnJlZ2lvbltpXS5zaXplID0gcmduLT5yZWdpb25baSsxXS5zaXplOwotCX0KLQlyZ24tPmNudC0tOworCWxtYl9yZW1vdmVfcmVnaW9uKHJnbiwgcjIpOwogfQogCiAvKiBUaGlzIHJvdXRpbmUgY2FsbGVkIHdpdGggcmVsb2NhdGlvbiBkaXNhYmxlZC4gKi8KQEAgLTI5NCwxNyArMjk5LDE2IEBACiAJcmV0dXJuIChsbWIubWVtb3J5LnJlZ2lvbltpZHhdLmJhc2UgKyBsbWIubWVtb3J5LnJlZ2lvbltpZHhdLnNpemUpOwogfQogCi0vKgotICogVHJ1bmNhdGUgdGhlIGxtYiBsaXN0IHRvIG1lbW9yeV9saW1pdCBpZiBpdCdzIHNldAotICogWW91IG11c3QgY2FsbCBsbWJfYW5hbHl6ZSgpIGFmdGVyIHRoaXMuCi0gKi8KKy8qIFlvdSBtdXN0IGNhbGwgbG1iX2FuYWx5emUoKSBhZnRlciB0aGlzLiAqLwogdm9pZCBfX2luaXQgbG1iX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHVuc2lnbmVkIGxvbmcgbWVtb3J5X2xpbWl0KQogewogCXVuc2lnbmVkIGxvbmcgaSwgbGltaXQ7CisJc3RydWN0IGxtYl9wcm9wZXJ0eSAqcDsKIAogCWlmICghIG1lbW9yeV9saW1pdCkKIAkJcmV0dXJuOwogCisJLyogVHJ1bmNhdGUgdGhlIGxtYiByZWdpb25zIHRvIHNhdGlzZnkgdGhlIG1lbW9yeSBsaW1pdC4gKi8KIAlsaW1pdCA9IG1lbW9yeV9saW1pdDsKIAlmb3IgKGkgPSAwOyBpIDwgbG1iLm1lbW9yeS5jbnQ7IGkrKykgewogCQlpZiAobGltaXQgPiBsbWIubWVtb3J5LnJlZ2lvbltpXS5zaXplKSB7CkBAIC0zMTYsNCArMzIwLDIxIEBACiAJCWxtYi5tZW1vcnkuY250ID0gaSArIDE7CiAJCWJyZWFrOwogCX0KKworCWxtYi5ybW9fc2l6ZSA9IGxtYi5tZW1vcnkucmVnaW9uWzBdLnNpemU7CisKKwkvKiBBbmQgdHJ1bmNhdGUgYW55IHJlc2VydmVzIGFib3ZlIHRoZSBsaW1pdCBhbHNvLiAqLworCWZvciAoaSA9IDA7IGkgPCBsbWIucmVzZXJ2ZWQuY250OyBpKyspIHsKKwkJcCA9ICZsbWIucmVzZXJ2ZWQucmVnaW9uW2ldOworCisJCWlmIChwLT5iYXNlID4gbWVtb3J5X2xpbWl0KQorCQkJcC0+c2l6ZSA9IDA7CisJCWVsc2UgaWYgKChwLT5iYXNlICsgcC0+c2l6ZSkgPiBtZW1vcnlfbGltaXQpCisJCQlwLT5zaXplID0gbWVtb3J5X2xpbWl0IC0gcC0+YmFzZTsKKworCQlpZiAocC0+c2l6ZSA9PSAwKSB7CisJCQlsbWJfcmVtb3ZlX3JlZ2lvbigmbG1iLnJlc2VydmVkLCBpKTsKKwkJCWktLTsKKwkJfQorCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9tZW0uYyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwppbmRleCA3NDFkZDg4Li42OWYzYjlhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL21lbS5jCkBAIC0yOTksOSArMjk5LDkgQEAKIAlrbWFwX3Byb3QgPSBQQUdFX0tFUk5FTDsKICNlbmRpZiAvKiBDT05GSUdfSElHSE1FTSAqLwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVG9wIG9mIFJBTTogMHglbHgsIFRvdGFsIFJBTTogMHglbHhcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgIlRvcCBvZiBSQU06IDB4JWx4LCBUb3RhbCBSQU06IDB4JWx4XG4iLAogCSAgICAgICB0b3Bfb2ZfcmFtLCB0b3RhbF9yYW0pOwotCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeSBob2xlIHNpemU6ICVsZE1CXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgaG9sZSBzaXplOiAlbGRNQlxuIiwKIAkgICAgICAgKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IDIwKTsKIAkvKgogCSAqIEFsbCBwYWdlcyBhcmUgRE1BLWFibGUgc28gd2UgcHV0IHRoZW0gYWxsIGluIHRoZSBETUEgem9uZS4KQEAgLTM4MCw3ICszODAsNyBAQAogCQkJdG90YWxoaWdoX3BhZ2VzKys7CiAJCX0KIAkJdG90YWxyYW1fcGFnZXMgKz0gdG90YWxoaWdoX3BhZ2VzOwotCQlwcmludGsoS0VSTl9JTkZPICJIaWdoIG1lbW9yeTogJWx1a1xuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkhpZ2ggbWVtb3J5OiAlbHVrXG4iLAogCQkgICAgICAgdG90YWxoaWdoX3BhZ2VzIDw8IChQQUdFX1NISUZULTEwKSk7CiAJfQogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jCmluZGV4IGE4ODE2ZTAuLmUzMjZlNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF8zMi5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKLW1tX2NvbnRleHRfdCBuZXh0X21tdV9jb250ZXh0OwordW5zaWduZWQgbG9uZyBuZXh0X21tdV9jb250ZXh0OwogdW5zaWduZWQgbG9uZyBjb250ZXh0X21hcFtMQVNUX0NPTlRFWFQgLyBCSVRTX1BFUl9MT05HICsgMV07CiAjaWZkZWYgRkVXX0NPTlRFWFRTCiBhdG9taWNfdCBucl9mcmVlX2NvbnRleHRzOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0XzY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfNjQuYwppbmRleCA3MTRhODRkLi42NWQxOGRjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfNjQuYwpAQCAtNDksNiArNDksOSBAQAogCX0KIAogCW1tLT5jb250ZXh0LmlkID0gaW5kZXg7CisJbW0tPmNvbnRleHQudXNlcl9wc2l6ZSA9IG1tdV92aXJ0dWFsX3BzaXplOworCW1tLT5jb250ZXh0LnNsbHAgPSBTTEJfVlNJRF9VU0VSIHwKKwkJbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNsbHA7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IDA5MjM1NWYuLmFhOThjYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtNDg3LDkgKzQ4Nyw5IEBACiAJdW5zaWduZWQgbG9uZyB0b3RhbF9yYW0gPSBsbWJfcGh5c19tZW1fc2l6ZSgpOwogCXVuc2lnbmVkIGludCBpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiVG9wIG9mIFJBTTogMHglbHgsIFRvdGFsIFJBTTogMHglbHhcbiIsCisJcHJpbnRrKEtFUk5fREVCVUcgIlRvcCBvZiBSQU06IDB4JWx4LCBUb3RhbCBSQU06IDB4JWx4XG4iLAogCSAgICAgICB0b3Bfb2ZfcmFtLCB0b3RhbF9yYW0pOwotCXByaW50ayhLRVJOX0lORk8gIk1lbW9yeSBob2xlIHNpemU6ICVsZE1CXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJNZW1vcnkgaG9sZSBzaXplOiAlbGRNQlxuIiwKIAkgICAgICAgKHRvcF9vZl9yYW0gLSB0b3RhbF9yYW0pID4+IDIwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBsbWIubWVtb3J5LmNudDsgKytpKQpAQCAtNTA3LDcgKzUwNyw3IEBACiAJCXJldHVybjsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTm9kZSAlZCBDUFVzOiIsIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiTm9kZSAlZCBDUFVzOiIsIG5vZGUpOwogCiAJCWNvdW50ID0gMDsKIAkJLyoKQEAgLTU0Myw3ICs1NDMsNyBAQAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5vZGUpIHsKIAkJdW5zaWduZWQgbG9uZyBpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIk5vZGUgJWQgTWVtb3J5OiIsIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiTm9kZSAlZCBNZW1vcnk6Iiwgbm9kZSk7CiAKIAkJY291bnQgPSAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jIGIvYXJjaC9wb3dlcnBjL21tL3BwY19tbXVfMzIuYwppbmRleCBlZDdmY2ZlLi4yZWQ0M2E0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vcHBjX21tdV8zMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9wcGNfbW11XzMyLmMKQEAgLTQyLDE4ICs0MiwxNCBAQAogCiB1bmlvbiB1YmF0IHsJCQkvKiBCQVQgcmVnaXN0ZXIgdmFsdWVzIHRvIGJlIGxvYWRlZCAqLwogCUJBVAliYXQ7Ci0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JdTY0CXdvcmRbMl07Ci0jZWxzZQogCXUzMgl3b3JkWzJdOwotI2VuZGlmCi19IEJBVFNbNF1bMl07CQkJLyogNCBwYWlycyBvZiBJQkFULCBEQkFUICovCit9IEJBVFNbOF1bMl07CQkJLyogOCBwYWlycyBvZiBJQkFULCBEQkFUICovCiAKIHN0cnVjdCBiYXRyYW5nZSB7CQkvKiBzdG9yZXMgYWRkcmVzcyByYW5nZXMgbWFwcGVkIGJ5IEJBVHMgKi8KIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJdW5zaWduZWQgbG9uZyBwaHlzOwotfSBiYXRfYWRkcnNbNF07Cit9IGJhdF9hZGRyc1s4XTsKIAogLyoKICAqIFJldHVybiBQQSBmb3IgdGhpcyBWQSBpZiBpdCBpcyBtYXBwZWQgYnkgYSBCQVQsIG9yIDAKQEAgLTE5MCw3ICsxODYsNyBAQAogCQlyZXR1cm47CiAJcG1kID0gcG1kX29mZnNldChwZ2Rfb2Zmc2V0KG1tLCBlYSksIGVhKTsKIAlpZiAoIXBtZF9ub25lKCpwbWQpKQotCQlhZGRfaGFzaF9wYWdlKG1tLT5jb250ZXh0LCBlYSwgcG1kX3ZhbCgqcG1kKSk7CisJCWFkZF9oYXNoX3BhZ2UobW0tPmNvbnRleHQuaWQsIGVhLCBwbWRfdmFsKCpwbWQpKTsKIH0KIAogLyoKQEAgLTIyMCwxNSArMjE2LDkgQEAKIAogCWlmICggcHBjX21kLnByb2dyZXNzICkgcHBjX21kLnByb2dyZXNzKCJoYXNoOmVudGVyIiwgMHgxMDUpOwogCi0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0jZGVmaW5lIExHX0hQVEVHX1NJWkUJNwkJLyogMTI4IGJ5dGVzIHBlciBIUFRFRyAqLwotI2RlZmluZSBTRFIxX0xPV19CSVRTCShsZ19uX2hwdGVnIC0gMTEpCi0jZGVmaW5lIE1JTl9OX0hQVEVHCTIwNDgJCS8qIG1pbiAyNTZrQiBoYXNoIHRhYmxlICovCi0jZWxzZQogI2RlZmluZSBMR19IUFRFR19TSVpFCTYJCS8qIDY0IGJ5dGVzIHBlciBIUFRFRyAqLwogI2RlZmluZSBTRFIxX0xPV19CSVRTCSgobl9ocHRlZyAtIDEpID4+IDEwKQogI2RlZmluZSBNSU5fTl9IUFRFRwkxMDI0CQkvKiBtaW4gNjRrQiBoYXNoIHRhYmxlICovCi0jZW5kaWYKIAogCS8qCiAJICogQWxsb3cgMSBIUFRFICgxLzggSFBURUcpIGZvciBlYWNoIHBhZ2Ugb2YgbWVtb3J5LgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3NsYi5jIGIvYXJjaC9wb3dlcnBjL21tL3NsYi5jCmluZGV4IGZmYzhlZDQuLjZhOGJmNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9zbGIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc2xiLmMKQEAgLTYwLDE5ICs2MCwxOSBAQAogCQkgICAgIDogIm1lbW9yeSIgKTsKIH0KIAotc3RhdGljIHZvaWQgc2xiX2ZsdXNoX2FuZF9yZWJvbHQodm9pZCkKK3ZvaWQgc2xiX2ZsdXNoX2FuZF9yZWJvbHQodm9pZCkKIHsKIAkvKiBJZiB5b3UgY2hhbmdlIHRoaXMgbWFrZSBzdXJlIHlvdSBjaGFuZ2UgU0xCX05VTV9CT0xURUQKIAkgKiBhcHByb3ByaWF0ZWx5IHRvby4gKi8KLQl1bnNpZ25lZCBsb25nIGxpbmVhcl9sbHAsIHZpcnR1YWxfbGxwLCBsZmxhZ3MsIHZmbGFnczsKKwl1bnNpZ25lZCBsb25nIGxpbmVhcl9sbHAsIHZtYWxsb2NfbGxwLCBsZmxhZ3MsIHZmbGFnczsKIAl1bnNpZ25lZCBsb25nIGtzcF9lc2lkX2RhdGE7CiAKIAlXQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpOwogCiAJbGluZWFyX2xscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV9saW5lYXJfcHNpemVdLnNsbHA7Ci0JdmlydHVhbF9sbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfdmlydHVhbF9wc2l6ZV0uc2xscDsKKwl2bWFsbG9jX2xscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV92bWFsbG9jX3BzaXplXS5zbGxwOwogCWxmbGFncyA9IFNMQl9WU0lEX0tFUk5FTCB8IGxpbmVhcl9sbHA7Ci0JdmZsYWdzID0gU0xCX1ZTSURfS0VSTkVMIHwgdmlydHVhbF9sbHA7CisJdmZsYWdzID0gU0xCX1ZTSURfS0VSTkVMIHwgdm1hbGxvY19sbHA7CiAKIAlrc3BfZXNpZF9kYXRhID0gbWtfZXNpZF9kYXRhKGdldF9wYWNhKCktPmtzdGFjaywgMik7CiAJaWYgKChrc3BfZXNpZF9kYXRhICYgRVNJRF9NQVNLKSA9PSBQQUdFX09GRlNFVCkKQEAgLTEyMiw5ICsxMjIsNiBAQAogCiAJZ2V0X3BhY2EoKS0+c2xiX2NhY2hlX3B0ciA9IDA7CiAJZ2V0X3BhY2EoKS0+Y29udGV4dCA9IG1tLT5jb250ZXh0OwotI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCi0JZ2V0X3BhY2EoKS0+cGdkaXIgPSBtbS0+cGdkOwotI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiAKIAkvKgogCSAqIHByZWxvYWQgc29tZSB1c2Vyc3BhY2Ugc2VnbWVudHMgaW50byB0aGUgU0xCLgpAQCAtMTY3LDExICsxNjQsMTAgQEAKIAogdm9pZCBzbGJfaW5pdGlhbGl6ZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgbGluZWFyX2xscCwgdmlydHVhbF9sbHA7CisJdW5zaWduZWQgbG9uZyBsaW5lYXJfbGxwLCB2bWFsbG9jX2xscCwgaW9fbGxwOwogCXN0YXRpYyBpbnQgc2xiX2VuY29kaW5nX2luaXRlZDsKIAlleHRlcm4gdW5zaWduZWQgaW50ICpzbGJfbWlzc19rZXJuZWxfbG9hZF9saW5lYXI7Ci0JZXh0ZXJuIHVuc2lnbmVkIGludCAqc2xiX21pc3Nfa2VybmVsX2xvYWRfdmlydHVhbDsKLQlleHRlcm4gdW5zaWduZWQgaW50ICpzbGJfbWlzc191c2VyX2xvYWRfbm9ybWFsOworCWV4dGVybiB1bnNpZ25lZCBpbnQgKnNsYl9taXNzX2tlcm5lbF9sb2FkX2lvOwogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIAlleHRlcm4gdW5zaWduZWQgaW50ICpzbGJfbWlzc191c2VyX2xvYWRfaHVnZTsKIAl1bnNpZ25lZCBsb25nIGh1Z2VfbGxwOwpAQCAtMTgxLDE4ICsxNzcsMTkgQEAKIAogCS8qIFByZXBhcmUgb3VyIFNMQiBtaXNzIGhhbmRsZXIgYmFzZWQgb24gb3VyIHBhZ2Ugc2l6ZSAqLwogCWxpbmVhcl9sbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfbGluZWFyX3BzaXplXS5zbGxwOwotCXZpcnR1YWxfbGxwID0gbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNsbHA7CisJaW9fbGxwID0gbW11X3BzaXplX2RlZnNbbW11X2lvX3BzaXplXS5zbGxwOworCXZtYWxsb2NfbGxwID0gbW11X3BzaXplX2RlZnNbbW11X3ZtYWxsb2NfcHNpemVdLnNsbHA7CisJZ2V0X3BhY2EoKS0+dm1hbGxvY19zbGxwID0gU0xCX1ZTSURfS0VSTkVMIHwgdm1hbGxvY19sbHA7CisKIAlpZiAoIXNsYl9lbmNvZGluZ19pbml0ZWQpIHsKIAkJc2xiX2VuY29kaW5nX2luaXRlZCA9IDE7CiAJCXBhdGNoX3NsYl9lbmNvZGluZyhzbGJfbWlzc19rZXJuZWxfbG9hZF9saW5lYXIsCiAJCQkJICAgU0xCX1ZTSURfS0VSTkVMIHwgbGluZWFyX2xscCk7Ci0JCXBhdGNoX3NsYl9lbmNvZGluZyhzbGJfbWlzc19rZXJuZWxfbG9hZF92aXJ0dWFsLAotCQkJCSAgIFNMQl9WU0lEX0tFUk5FTCB8IHZpcnR1YWxfbGxwKTsKLQkJcGF0Y2hfc2xiX2VuY29kaW5nKHNsYl9taXNzX3VzZXJfbG9hZF9ub3JtYWwsCi0JCQkJICAgU0xCX1ZTSURfVVNFUiB8IHZpcnR1YWxfbGxwKTsKKwkJcGF0Y2hfc2xiX2VuY29kaW5nKHNsYl9taXNzX2tlcm5lbF9sb2FkX2lvLAorCQkJCSAgIFNMQl9WU0lEX0tFUk5FTCB8IGlvX2xscCk7CiAKIAkJREJHKCJTTEI6IGxpbmVhciAgTExQID0gJTA0eFxuIiwgbGluZWFyX2xscCk7Ci0JCURCRygiU0xCOiB2aXJ0dWFsIExMUCA9ICUwNHhcbiIsIHZpcnR1YWxfbGxwKTsKKwkJREJHKCJTTEI6IGlvICAgICAgTExQID0gJTA0eFxuIiwgaW9fbGxwKTsKICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCiAJCXBhdGNoX3NsYl9lbmNvZGluZyhzbGJfbWlzc191c2VyX2xvYWRfaHVnZSwKIAkJCQkgICBTTEJfVlNJRF9VU0VSIHwgaHVnZV9sbHApOwpAQCAtMjA3LDcgKzIwNCw3IEBACiAJdW5zaWduZWQgbG9uZyBsZmxhZ3MsIHZmbGFnczsKIAogCWxmbGFncyA9IFNMQl9WU0lEX0tFUk5FTCB8IGxpbmVhcl9sbHA7Ci0JdmZsYWdzID0gU0xCX1ZTSURfS0VSTkVMIHwgdmlydHVhbF9sbHA7CisJdmZsYWdzID0gU0xCX1ZTSURfS0VSTkVMIHwgdm1hbGxvY19sbHA7CiAKIAkvKiBJbnZhbGlkYXRlIHRoZSBlbnRpcmUgU0xCIChldmVuIHNsb3QgMCkgJiBhbGwgdGhlIEVSQVRTICovCiAJYXNtIHZvbGF0aWxlKCJpc3luYyI6OjoibWVtb3J5Iik7CkBAIC0yMTUsNyArMjEyLDYgQEAKIAlhc20gdm9sYXRpbGUoImlzeW5jOyBzbGJpYTsgaXN5bmMiOjo6Im1lbW9yeSIpOwogCWNyZWF0ZV9zbGJlKFBBR0VfT0ZGU0VULCBsZmxhZ3MsIDApOwogCi0JLyogVk1BTExPQyBzcGFjZSBoYXMgNEsgcGFnZXMgYWx3YXlzIGZvciBub3cgKi8KIAljcmVhdGVfc2xiZShWTUFMTE9DX1NUQVJULCB2ZmxhZ3MsIDEpOwogCiAJLyogV2UgZG9uJ3QgYm9sdCB0aGUgc3RhY2sgZm9yIHRoZSB0aW1lIGJlaW5nIC0gd2UncmUgaW4gYm9vdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMgYi9hcmNoL3Bvd2VycGMvbW0vc2xiX2xvdy5TCmluZGV4IGFiZmFhYmYuLjg1NDhkY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9zbGJfbG93LlMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3NsYl9sb3cuUwpAQCAtNTksMTAgKzU5LDE5IEBACiAJbGkJcjExLDAKIAliCXNsYl9maW5pc2hfbG9hZAogCi0xOgkvKiB2bWFsbG9jL2lvcmVtYXAgbWFwcGluZyBlbmNvZGluZyBiaXRzLCB0aGUgImxpIiBpbnN0cnVjdGlvbiBiZWxvdworMToJLyogdm1hbGxvYy9pb3JlbWFwIG1hcHBpbmcgZW5jb2RpbmcgYml0cywgdGhlICJsaSIgaW5zdHJ1Y3Rpb25zIGJlbG93CiAJICogd2lsbCBiZSBwYXRjaGVkIGJ5IHRoZSBrZXJuZWwgYXQgYm9vdAogCSAqLwotX0dMT0JBTChzbGJfbWlzc19rZXJuZWxfbG9hZF92aXJ0dWFsKQorQkVHSU5fRlRSX1NFQ1RJT04KKwkvKiBjaGVjayB3aGV0aGVyIHRoaXMgaXMgaW4gdm1hbGxvYyBvciBpb3JlbWFwIHNwYWNlICovCisJY2xybGRpCXIxMSxyMTAsNDgKKwljbXBsZGkJcjExLChWTUFMTE9DX1NJWkUgPj4gMjgpIC0gMQorCWJndAk1ZgorCWxoeglyMTEsUEFDQVZNQUxMT0NTTExQKHIxMykKKwliCXNsYl9maW5pc2hfbG9hZAorNToKK0VORF9GVFJfU0VDVElPTl9JRkNMUihDUFVfRlRSX0NJX0xBUkdFX1BBR0UpCitfR0xPQkFMKHNsYl9taXNzX2tlcm5lbF9sb2FkX2lvKQogCWxpCXIxMSwwCiAJYglzbGJfZmluaXNoX2xvYWQKIApAQCAtOTYsOSArMTA1LDcgQEAKIDE6CiAjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwogCi1fR0xPQkFMKHNsYl9taXNzX3VzZXJfbG9hZF9ub3JtYWwpCi0JbGkJcjExLDAKLQorCWxoeglyMTEsUEFDQUNPTlRFWFRTTExQKHIxMykKIDI6CiAJbGQJcjksUEFDQUNPTlRFWFRJRChyMTMpCiAJcmxkaW1pCXIxMCxyOSxVU0VSX0VTSURfQklUUywwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jIGIvYXJjaC9wb3dlcnBjL21tL3N0YWIuYwppbmRleCA0YTkyOTFkOS4uNjkxMzIwYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3N0YWIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vc3RhYi5jCkBAIC0yMDAsMTAgKzIwMCw2IEBACiAKIAlfX2dldF9jcHVfdmFyKHN0YWJfY2FjaGVfcHRyKSA9IDA7CiAKLSNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwotCWdldF9wYWNhKCktPnBnZGlyID0gbW0tPnBnZDsKLSNlbmRpZiAvKiBDT05GSUdfUFBDXzY0S19QQUdFUyAqLwotCiAJLyogTm93IHByZWxvYWQgc29tZSBlbnRyaWVzIGZvciB0aGUgbmV3IHRhc2sgKi8KIAlpZiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodHNrLCBUSUZfMzJCSVQpKQogCQl1bm1hcHBlZF9iYXNlID0gVEFTS19VTk1BUFBFRF9CQVNFX1VTRVIzMjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfMzIuYwppbmRleCBhZDU4MGYzLi4wMmViMjNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzMyLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl8zMi5jCkBAIC00Miw3ICs0Miw3IEBACiAKIAlpZiAoSGFzaCAhPSAwKSB7CiAJCXB0ZXBoeXMgPSBfX3BhKHB0ZXApICYgUEFHRV9NQVNLOwotCQlmbHVzaF9oYXNoX3BhZ2VzKG1tLT5jb250ZXh0LCBhZGRyLCBwdGVwaHlzLCAxKTsKKwkJZmx1c2hfaGFzaF9wYWdlcyhtbS0+Y29udGV4dC5pZCwgYWRkciwgcHRlcGh5cywgMSk7CiAJfQogfQogCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlwbWRfdCAqcG1kOwogCXVuc2lnbmVkIGxvbmcgcG1kX2VuZDsKIAlpbnQgY291bnQ7Ci0JdW5zaWduZWQgaW50IGN0eCA9IG1tLT5jb250ZXh0OworCXVuc2lnbmVkIGludCBjdHggPSBtbS0+Y29udGV4dC5pZDsKIAogCWlmIChIYXNoID09IDApIHsKIAkJX3RsYmlhKCk7CkBAIC0xNzIsNyArMTcyLDcgQEAKIAltbSA9ICh2bWFkZHIgPCBUQVNLX1NJWkUpPyB2bWEtPnZtX21tOiAmaW5pdF9tbTsKIAlwbWQgPSBwbWRfb2Zmc2V0KHBnZF9vZmZzZXQobW0sIHZtYWRkciksIHZtYWRkcik7CiAJaWYgKCFwbWRfbm9uZSgqcG1kKSkKLQkJZmx1c2hfaGFzaF9wYWdlcyhtbS0+Y29udGV4dCwgdm1hZGRyLCBwbWRfdmFsKCpwbWQpLCAxKTsKKwkJZmx1c2hfaGFzaF9wYWdlcyhtbS0+Y29udGV4dC5pZCwgdm1hZGRyLCBwbWRfdmFsKCpwbWQpLCAxKTsKIAlGSU5JU0hfRkxVU0g7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfNjQuYwppbmRleCBmNzM0YjExLi5lNzQ0OWIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL3RsYl82NC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIHsKIAlzdHJ1Y3QgcHBjNjRfdGxiX2JhdGNoICpiYXRjaCA9ICZfX2dldF9jcHVfdmFyKHBwYzY0X3RsYl9iYXRjaCk7CiAJdW5zaWduZWQgbG9uZyB2c2lkOwotCXVuc2lnbmVkIGludCBwc2l6ZSA9IG1tdV92aXJ0dWFsX3BzaXplOworCXVuc2lnbmVkIGludCBwc2l6ZTsKIAlpbnQgaTsKIAogCWkgPSBiYXRjaC0+aW5kZXg7CkBAIC0xNDgsNyArMTQ4LDggQEAKICNlbHNlCiAJCUJVRygpOwogI2VuZGlmCi0JfQorCX0gZWxzZQorCQlwc2l6ZSA9IHB0ZV9wYWdlc2l6ZV9pbmRleChwdGUpOwogCiAJLyoKIAkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhIFRMQiBiYXRjaCBhbmQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL0tjb25maWcKaW5kZXggZDAzYzBlNS4uZWIyZGVjZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL0tjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL0tjb25maWcKQEAgLTEsNSArMSw0IEBACiBjb25maWcgUFJPRklMSU5HCi0JZGVwZW5kcyBvbiAhUFBDX0lTRVJJRVMKIAlib29sICJQcm9maWxpbmcgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgZXh0ZW5kZWQgcHJvZmlsaW5nIHN1cHBvcnQgbWVjaGFuaXNtcyB1c2VkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvTWFrZWZpbGUKaW5kZXggZjVmOTg1OS4uMzE0NWQ2MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtMSwzICsxLDcgQEAKK2lmZXEgKCQoQ09ORklHX1BQQzY0KSx5KQorRVhUUkFfQ0ZMQUdTCSs9IC1tbm8tbWluaW1hbC10b2MKK2VuZGlmCisKIG9iai0kKENPTkZJR19PUFJPRklMRSkgKz0gb3Byb2ZpbGUubwogCiBEUklWRVJfT0JKUyA6PSAkKGFkZHByZWZpeCAuLi8uLi8uLi9kcml2ZXJzL29wcm9maWxlLywgXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL2NvbW1vbi5jCmluZGV4IDViMWRlN2UuLjI3YWQ1NmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vcG1jLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL29wcm9maWxlX2ltcGwuaD4KKyNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KIAogc3RhdGljIHN0cnVjdCBvcF9wb3dlcnBjX21vZGVsICptb2RlbDsKIApAQCAtMTMwLDYgKzEzMSw5IEBACiAJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX2NwdV90eXBlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0lTRVJJRVMpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXN3aXRjaCAoY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV90eXBlKSB7CiAjaWZkZWYgQ09ORklHX1BQQzY0CiAJCWNhc2UgUFBDX09QUk9GSUxFX1JTNjQ6CkBAIC0xNjIsNyArMTY2LDcgQEAKIAlvcHMtPnN0b3AgPSBvcF9wb3dlcnBjX3N0b3A7CiAJb3BzLT5iYWNrdHJhY2UgPSBvcF9wb3dlcnBjX2JhY2t0cmFjZTsKIAotCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyAlcyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nLlxuIiwKKwlwcmludGsoS0VSTl9ERUJVRyAib3Byb2ZpbGU6IHVzaW5nICVzIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcuXG4iLAogCSAgICAgICBvcHMtPmNwdV90eXBlKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jIGIvYXJjaC9wb3dlcnBjL29wcm9maWxlL29wX21vZGVsX3Bvd2VyNC5jCmluZGV4IDRjMmJlYWIuLjUwNmY2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9vcHJvZmlsZS9vcF9tb2RlbF9wb3dlcjQuYworKysgYi9hcmNoL3Bvd2VycGMvb3Byb2ZpbGUvb3BfbW9kZWxfcG93ZXI0LmMKQEAgLTI0LDEwICsyNCw2IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyByZXNldF92YWx1ZVtPUF9NQVhfQ09VTlRFUl07CiAKIHN0YXRpYyBpbnQgb3Byb2ZpbGVfcnVubmluZzsKLXN0YXRpYyBpbnQgbW1jcmFfaGFzX3NpaHY7Ci0vKiBVbmZvcnR1bmF0ZWx5IHRoZXNlIGJpdHMgdmFyeSBiZXR3ZWVuIENQVXMgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1tY3JhX3NpaHYgPSBNTUNSQV9TSUhWOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1jcmFfc2lwciA9IE1NQ1JBX1NJUFI7CiAKIC8qIG1tY3IgdmFsdWVzIGFyZSBzZXQgaW4gcG93ZXI0X3JlZ19zZXR1cCwgdXNlZCBpbiBwb3dlcjRfY3B1X3NldHVwICovCiBzdGF0aWMgdTMyIG1tY3IwX3ZhbDsKQEAgLTQxLDE2ICszNyw2IEBACiAJaW50IGk7CiAKIAkvKgotCSAqIFNJSFYgLyBTSVBSIGJpdHMgYXJlIG9ubHkgaW1wbGVtZW50ZWQgb24gUE9XRVI0KyAoR1EpIGFuZCBhYm92ZS4KLQkgKiBIb3dldmVyIHdlIGRpc2FibGUgaXQgb24gYWxsIFBPV0VSNCB1bnRpbCB3ZSB2ZXJpZnkgaXQgd29ya3MKLQkgKiAoSSB3YXMgc2VlaW5nIHNvbWUgc3RyYW5nZSBiZWhhdmlvdXIgbGFzdCB0aW1lIEkgdHJpZWQpLgotCSAqCi0JICogSXQgaGFzIGJlZW4gdmVyaWZpZWQgdG8gd29yayBvbiBQT1dFUjUgc28gd2UgZW5hYmxlIGl0IHRoZXJlLgotCSAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9NTUNSQV9TSUhWKSkKLQkJbW1jcmFfaGFzX3NpaHYgPSAxOwotCi0JLyoKIAkgKiBUaGUgcGVyZm9ybWFuY2UgY291bnRlciBldmVudCBzZXR0aW5ncyBhcmUgZ2l2ZW4gaW4gdGhlIG1tY3IwLAogCSAqIG1tY3IxIGFuZCBtbWNyYSB2YWx1ZXMgcGFzc2VkIGZyb20gdGhlIHVzZXIgaW4gdGhlCiAJICogb3Bfc3lzdGVtX2NvbmZpZyBzdHJ1Y3R1cmUgKHN5cyB2YXJpYWJsZSkuCkBAIC0yMDIsMTggKzE4OCwxOSBAQAogCXVuc2lnbmVkIGxvbmcgbW1jcmE7CiAKIAkvKiBDYW50IGRvIG11Y2ggYWJvdXQgaXQgKi8KLQlpZiAoIW1tY3JhX2hhc19zaWh2KQorCWlmICghY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9tbWNyYV9zaWh2KQogCQlyZXR1cm4gcGM7CiAKIAltbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCiAJLyogV2VyZSB3ZSBpbiB0aGUgaHlwZXJ2aXNvcj8gKi8KLQlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSAmJiAobW1jcmEgJiBtbWNyYV9zaWh2KSkKKwlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9MUEFSKSAmJgorCSAgICAobW1jcmEgJiBjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21tY3JhX3NpaHYpKQogCQkvKiBmdW5jdGlvbiBkZXNjcmlwdG9yIG1hZG5lc3MgKi8KIAkJcmV0dXJuICooKHVuc2lnbmVkIGxvbmcgKiloeXBlcnZpc29yX2J1Y2tldCk7CiAKIAkvKiBXZSB3ZXJlIGluIHVzZXJzcGFjZSwgbm90aGluZyB0byBkbyAqLwotCWlmIChtbWNyYSAmIG1tY3JhX3NpcHIpCisJaWYgKG1tY3JhICYgY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9tbWNyYV9zaXByKQogCQlyZXR1cm4gcGM7CiAKICNpZmRlZiBDT05GSUdfUFBDX1JUQVMKQEAgLTIzNSwxNSArMjIyLDE0IEBACiAJcmV0dXJuIHBjOwogfQogCi1zdGF0aWMgaW50IGdldF9rZXJuZWwodW5zaWduZWQgbG9uZyBwYykKK3N0YXRpYyBpbnQgZ2V0X2tlcm5lbCh1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIG1tY3JhKQogewogCWludCBpc19rZXJuZWw7CiAKLQlpZiAoIW1tY3JhX2hhc19zaWh2KSB7CisJaWYgKCFjdXJfY3B1X3NwZWMtPm9wcm9maWxlX21tY3JhX3NpaHYpIHsKIAkJaXNfa2VybmVsID0gaXNfa2VybmVsX2FkZHIocGMpOwogCX0gZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgbW1jcmEgPSBtZnNwcihTUFJOX01NQ1JBKTsKLQkJaXNfa2VybmVsID0gKChtbWNyYSAmIG1tY3JhX3NpcHIpID09IDApOworCQlpc19rZXJuZWwgPSAoKG1tY3JhICYgY3VyX2NwdV9zcGVjLT5vcHJvZmlsZV9tbWNyYV9zaXByKSA9PSAwKTsKIAl9CiAKIAlyZXR1cm4gaXNfa2VybmVsOwpAQCAtMjU3LDkgKzI0MywxMiBAQAogCWludCB2YWw7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IG1tY3IwOworCXVuc2lnbmVkIGxvbmcgbW1jcmE7CisKKwltbWNyYSA9IG1mc3ByKFNQUk5fTU1DUkEpOwogCiAJcGMgPSBnZXRfcGMocmVncyk7Ci0JaXNfa2VybmVsID0gZ2V0X2tlcm5lbChwYyk7CisJaXNfa2VybmVsID0gZ2V0X2tlcm5lbChwYywgbW1jcmEpOwogCiAJLyogc2V0IHRoZSBQTU0gYml0IChzZWUgY29tbWVudCBiZWxvdykgKi8KIAltdG1zcmQobWZtc3IoKSB8IE1TUl9QTU0pOwpAQCAtMjg3LDYgKzI3NiwxMCBAQAogCSAqLwogCW1tY3IwICY9IH5NTUNSMF9QTUFPOwogCisJLyogQ2xlYXIgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gdGhlIE1NQ1JBICovCisJbW1jcmEgJj0gfmN1cl9jcHVfc3BlYy0+b3Byb2ZpbGVfbW1jcmFfY2xlYXI7CisJbXRzcHIoU1BSTl9NTUNSQSwgbW1jcmEpOworCiAJLyoKIAkgKiBub3cgY2xlYXIgdGhlIGZyZWV6ZSBiaXQsIGNvdW50aW5nIHdpbGwgbm90IHN0YXJ0IHVudGlsIHdlCiAJICogcmZpZCBmcm9tIHRoaXMgZXhjZXB0aW9uLCBiZWNhdXNlIG9ubHkgYXQgdGhhdCBwb2ludCB3aWxsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCmluZGV4IDA2ZTM3MTIuLjQ1NGZjNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9LY29uZmlnCkBAIC0xMSwxMyArMTEsMjAgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNUEMgODU0MCBBRFMgYm9hcmQKIAorY29uZmlnIE1QQzg1eHhfQ0RTCisJYm9vbCAiRnJlZXNjYWxlIE1QQzg1eHggQ0RTIgorCXNlbGVjdCBERUZBVUxUX1VJTUFHRQorCXNlbGVjdCBQUENfSTgyNTkgaWYgUENJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTVBDODV4eCBDRFMgYm9hcmQKKwogZW5kY2hvaWNlCiAKIGNvbmZpZyBNUEM4NTQwCiAJYm9vbAogCXNlbGVjdCBQUENfVURCR18xNjU1MAogCXNlbGVjdCBQUENfSU5ESVJFQ1RfUENJCi0JZGVmYXVsdCB5IGlmIE1QQzg1NDBfQURTCisJZGVmYXVsdCB5IGlmIE1QQzg1NDBfQURTIHx8IE1QQzg1eHhfQ0RTCiAKIGNvbmZpZyBQUENfSU5ESVJFQ1RfUENJX0JFCiAJYm9vbApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCmluZGV4IGZmYzQxMzkuLjc2MTVhYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKQEAgLTMsMyArMyw0IEBACiAjCiBvYmotJChDT05GSUdfUFBDXzg1eHgpCSs9IG1pc2MubyBwY2kubwogb2JqLSQoQ09ORklHX01QQzg1NDBfQURTKSArPSBtcGM4NXh4X2Fkcy5vCitvYmotJChDT05GSUdfTVBDODV4eF9DRFMpICs9IG1wYzg1eHhfY2RzLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfY2RzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlNmUxMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogTVBDODV4eCBzZXR1cCBhbmQgZWFybHkgYm9vdCBjb2RlIHBsdXMgb3RoZXIgcmFuZG9tIGJpdHMuCisgKgorICogTWFpbnRhaW5lZCBieSBLdW1hciBHYWxhIChzZWUgTUFJTlRBSU5FUlMgZm9yIGNvbnRhY3QgaW5mb3JtYXRpb24pCisgKgorICogQ29weXJpZ2h0IDIwMDUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL2lwaWMuaD4KKyNpbmNsdWRlIDxhc20vYm9vdGluZm8uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tcGM4NXh4Lmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPG1tL21tdV9kZWNsLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9tcGljLmg+CisjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisKKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorI2luY2x1ZGUgIm1wYzg1eHguaCIKKworI2lmbmRlZiBDT05GSUdfUENJCit1bnNpZ25lZCBsb25nIGlzYV9pb19iYXNlID0gMDsKK3Vuc2lnbmVkIGxvbmcgaXNhX21lbV9iYXNlID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGNkc19wY2lfc2xvdCA9IDI7CitzdGF0aWMgdm9sYXRpbGUgdTggKmNhZG11czsKKworLyoKKyAqIEludGVybmFsIGludGVycnVwdHMgYXJlIGFsbCBMZXZlbCBTZW5zaXRpdmUsIGFuZCBQb3NpdGl2ZSBQb2xhcml0eQorICoKKyAqIE5vdGU6ICBMaWtlbHksIHRoaXMgdGFibGUgYW5kIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gc2hvdWxkIGJlCisgKiAgICAgICAgb2J0YWluZWQgYW5kIGRlcml2ZWQgZnJvbSB0aGUgT0YgRGV2aWNlIFRyZWUuCisgKi8KK3N0YXRpYyB1X2NoYXIgbXBjODV4eF9jZHNfb3BlbnBpY19pbml0c2Vuc2VzW10gX19pbml0ZGF0YSA9IHsKKwlNUEM4NVhYX0lOVEVSTkFMX0lSUV9TRU5TRVMsCisjaWYgZGVmaW5lZChDT05GSUdfUENJKQorCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBFeHQgMDogUENJIHNsb3QgMCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHQgMTogUENJIHNsb3QgMSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHQgMjogUENJIHNsb3QgMiAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHQgMzogUENJIHNsb3QgMyAqLworI2Vsc2UKKwkweDAsCQkJCS8qIEV4dGVybmFsICAwOiAqLworCTB4MCwJCQkJLyogRXh0ZXJuYWwgIDE6ICovCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgMjogKi8KKwkweDAsCQkJCS8qIEV4dGVybmFsICAzOiAqLworI2VuZGlmCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksCS8qIEV4dGVybmFsIDU6IFBIWSAqLworCTB4MCwJCQkJLyogRXh0ZXJuYWwgIDY6ICovCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAgNzogKi8KKwkweDAsCQkJCS8qIEV4dGVybmFsICA4OiAqLworCTB4MCwJCQkJLyogRXh0ZXJuYWwgIDk6ICovCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAxMDogKi8KKyNpZmRlZiBDT05GSUdfUENJCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksICAgIC8qIEV4dCAxMTogUENJMiBzbG90IDAgKi8KKyNlbHNlCisJMHgwLAkJCQkvKiBFeHRlcm5hbCAxMTogKi8KKyNlbmRpZgorfTsKKworCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIGludGVycnVwdCByb3V0aW5nCisgKi8KK2ludAorbXBjODV4eF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGNoYXIgaWRzZWwsIHVuc2lnbmVkIGNoYXIgcGluKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zZShkZXYtPmJ1cy0+bnVtYmVyKTsKKworCWlmICghaG9zZS0+aW5kZXgpCisJeworCQkvKiBIYW5kbGUgUENJMSBpbnRlcnJ1cHRzICovCisJCWNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0KKwkJCS8qCisJCQkgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKKwkJCSAqICAgICAgICBBICAgICAgQiAgICAgIEMgICAgICBECisJCQkgKi8KKworCQkJLyogTm90ZSBJUlEgYXNzaWdubWVudCBmb3Igc2xvdHMgaXMgYmFzZWQgb24gd2hpY2ggc2xvdCB0aGUgZWx5c2l1bSBpcworCQkJICogaW4gLS0gaW4gdGhpcyBzZXR1cCBlbHlzaXVtIGlzIGluIHNsb3QgIzIgKHRoaXMgUElSUUEgYXMgZmlyc3QKKwkJCSAqIGludGVycnVwdCBvbiBzbG90ICovCisJCXsKKwkJCXsgMCwgMSwgMiwgMyB9LCAvKiAxNiAtIFBNQyAqLworCQkJeyAwLCAxLCAyLCAzIH0sIC8qIDE3IFAyUCAoVHNpMzIwKSAqLworCQkJeyAwLCAxLCAyLCAzIH0sIC8qIDE4IC0gU2xvdCAxICovCisJCQl7IDEsIDIsIDMsIDAgfSwgLyogMTkgLSBTbG90IDIgKi8KKwkJCXsgMiwgMywgMCwgMSB9LCAvKiAyMCAtIFNsb3QgMyAqLworCQkJeyAzLCAwLCAxLCAyIH0sIC8qIDIxIC0gU2xvdCA0ICovCisJCX07CisKKwkJY29uc3QgbG9uZyBtaW5faWRzZWwgPSAxNiwgbWF4X2lkc2VsID0gMjEsIGlycXNfcGVyX3Nsb3QgPSA0OworCQlpbnQgaSwgajsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCQlwY2lfaXJxX3RhYmxlW2ldW2pdID0KKwkJCQkJKChwY2lfaXJxX3RhYmxlW2ldW2pdICsgNSAtCisJCQkJCSAgY2RzX3BjaV9zbG90KSAmIDB4MykgKyBQSVJRMEE7CisKKwkJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBQQ0kyIGludGVycnVwdHMgKGlmIHdlIGhhdmUgb25lKSAqLworCQljaGFyIHBjaV9pcnFfdGFibGVbXVs0XSA9CisJCXsKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGhhdmUgb25lIHNsb3QgYW5kIG9uZSBpbnRlcnJ1cHQKKwkJCSAqIGdvaW5nIHRvIFBJUlFBIC0gUElSUUQgKi8KKwkJCXsgUElSUTFBLCBQSVJRMUEsIFBJUlExQSwgUElSUTFBIH0sIC8qIDIxIC0gc2xvdCAwICovCisJCX07CisKKwkJY29uc3QgbG9uZyBtaW5faWRzZWwgPSAyMSwgbWF4X2lkc2VsID0gMjEsIGlycXNfcGVyX3Nsb3QgPSA0OworCisJCXJldHVybiBQQ0lfSVJRX1RBQkxFX0xPT0tVUDsKKwl9Cit9CisKKyNkZWZpbmUgQVJDQURJQV9IT1NUX0JSSURHRV9JRFNFTAkxNworI2RlZmluZSBBUkNBRElBXzJORF9CUklER0VfSURTRUwJMworCitleHRlcm4gaW50IG1wYzg1eHhfcGNpMl9idXNubzsKKworaW50CittcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3sKKwlpZiAoYnVzID09IDAgJiYgUENJX1NMT1QoZGV2Zm4pID09IDApCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKG1wYzg1eHhfcGNpMl9idXNubykKKwkJaWYgKGJ1cyA9PSAobXBjODV4eF9wY2kyX2J1c25vKSAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJLyogV2UgZXhwbGljaXRseSBkbyBub3QgZ28gcGFzdCB0aGUgVHVuZHJhIDMyMCBCcmlkZ2UgKi8KKwlpZiAoKGJ1cyA9PSAxKSAmJiAoUENJX1NMT1QoZGV2Zm4pID09IEFSQ0FESUFfMk5EX0JSSURHRV9JRFNFTCkpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisJaWYgKChidXMgPT0gMCkgJiYgKFBDSV9TTE9UKGRldmZuKSA9PSBBUkNBRElBXzJORF9CUklER0VfSURTRUwpKQorCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCWVsc2UKKwkJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKwordm9pZCBfX2luaXQKK21wYzg1eHhfY2RzX3BjaWJpb3NfZml4dXAodm9pZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCXVfY2hhcgkJYzsKKworCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCisJCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xLCBOVUxMKSkpIHsKKwkJLyoKKwkJICogVS1Cb290IGRvZXMgbm90IHNldCB0aGUgZW5hYmxlIGJpdHMKKwkJICogZm9yIHRoZSBJREUgZGV2aWNlLiBGb3JjZSB0aGVtIG9uIGhlcmUuCisJCSAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4NDAsICZjKTsKKwkJYyB8PSAweDAzOyAvKiBJREU6IENoaXAgRW5hYmxlIEJpdHMgKi8KKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg0MCwgYyk7CisKKwkJLyoKKwkJICogU2luY2Ugb25seSBwcmltYXJ5IGludGVyZmFjZSB3b3JrcywgZm9yY2UgdGhlCisJCSAqIElERSBmdW5jdGlvbiB0byBzdGFuZGFyZCBwcmltYXJ5IElERSBpbnRlcnJ1cHQKKwkJICogdy8gODI1OSBvZmZzZXQKKwkJICovCisJCWRldi0+aXJxID0gMTQ7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgZGV2LT5pcnEpOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KKworCS8qCisJICogRm9yY2UgbGVnYWN5IFVTQiBpbnRlcnJ1cHQgcm91dGluZworCSAqLworCWlmICgoZGV2ID0gcGNpX2dldF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9WSUEsCisJCQkJCVBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8yLCBOVUxMKSkpIHsKKwkJZGV2LT5pcnEgPSAxMDsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCAxMCk7CisJCXBjaV9kZXZfcHV0KGRldik7CisJfQorCisJaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKKwkJCQkJUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzIsIGRldikpKSB7CisJCWRldi0+aXJxID0gMTE7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOworCQlwY2lfZGV2X3B1dChkZXYpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKK3ZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BpY19pbml0KHZvaWQpCit7CisJc3RydWN0IG1waWMgKm1waWMxOworCXBoeXNfYWRkcl90IE9wZW5QSUNfUEFkZHI7CisKKwkvKiBEZXRlcm1pbmUgdGhlIFBoeXNpY2FsIEFkZHJlc3Mgb2YgdGhlIE9wZW5QSUMgcmVncyAqLworCU9wZW5QSUNfUEFkZHIgPSBnZXRfaW1tcmJhc2UoKSArIE1QQzg1eHhfT1BFTlBJQ19PRkZTRVQ7CisKKwltcGljMSA9IG1waWNfYWxsb2MoT3BlblBJQ19QQWRkciwKKwkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCisJCQk0LCBNUEM4NXh4X09QRU5QSUNfSVJRX09GRlNFVCwgMCwgMjUwLAorCQkJbXBjODV4eF9jZHNfb3BlbnBpY19pbml0c2Vuc2VzLAorCQkJc2l6ZW9mKG1wYzg1eHhfY2RzX29wZW5waWNfaW5pdHNlbnNlcyksICIgT3BlblBJQyAgIik7CisJQlVHX09OKG1waWMxID09IE5VTEwpOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMCwgT3BlblBJQ19QQWRkciArIDB4MTAyMDApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMSwgT3BlblBJQ19QQWRkciArIDB4MTAyODApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMiwgT3BlblBJQ19QQWRkciArIDB4MTAzMDApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMywgT3BlblBJQ19QQWRkciArIDB4MTAzODApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgNCwgT3BlblBJQ19QQWRkciArIDB4MTA0MDApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgNSwgT3BlblBJQ19QQWRkciArIDB4MTA0ODApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgNiwgT3BlblBJQ19QQWRkciArIDB4MTA1MDApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgNywgT3BlblBJQ19QQWRkciArIDB4MTA1ODApOworCisJLyogZHVtbXkgbWFwcGluZ3MgdG8gZ2V0IHRvIDQ4ICovCisJbXBpY19hc3NpZ25faXN1KG1waWMxLCA4LCBPcGVuUElDX1BBZGRyICsgMHgxMDYwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMxLCA5LCBPcGVuUElDX1BBZGRyICsgMHgxMDY4MCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAxMCwgT3BlblBJQ19QQWRkciArIDB4MTA3MDApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMTEsIE9wZW5QSUNfUEFkZHIgKyAweDEwNzgwKTsKKworCS8qIEV4dGVybmFsIGludHMgKi8KKwltcGljX2Fzc2lnbl9pc3UobXBpYzEsIDEyLCBPcGVuUElDX1BBZGRyICsgMHgxMDAwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAxMywgT3BlblBJQ19QQWRkciArIDB4MTAwODApOworCW1waWNfYXNzaWduX2lzdShtcGljMSwgMTQsIE9wZW5QSUNfUEFkZHIgKyAweDEwMTAwKTsKKworCW1waWNfaW5pdChtcGljMSk7CisKKyNpZmRlZiBDT05GSUdfUENJCisJbXBpY19zZXR1cF9jYXNjYWRlKFBJUlEwQSwgaTgyNTlfaXJxX2Nhc2NhZGUsIE5VTEwpOworCisJaTgyNTlfaW5pdCgwLDApOworI2VuZGlmCit9CisKKworLyoKKyAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKKyAqLworc3RhdGljIHZvaWQgX19pbml0CittcGM4NXh4X2Nkc19zZXR1cF9hcmNoKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisjaWZkZWYgQ09ORklHX1BDSQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisjZW5kaWYKKworCWlmIChwcGNfbWQucHJvZ3Jlc3MpCisJCXBwY19tZC5wcm9ncmVzcygibXBjODV4eF9jZHNfc2V0dXBfYXJjaCgpIiwgMCk7CisKKwljcHUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiY3B1Iik7CisJaWYgKGNwdSAhPSAwKSB7CisJCXVuc2lnbmVkIGludCAqZnA7CisKKwkJZnAgPSAoaW50ICopZ2V0X3Byb3BlcnR5KGNwdSwgImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCQlpZiAoZnAgIT0gMCkKKwkJCWxvb3BzX3Blcl9qaWZmeSA9ICpmcCAvIEhaOworCQllbHNlCisJCQlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMDAgLyBIWjsKKwkJb2Zfbm9kZV9wdXQoY3B1KTsKKwl9CisKKwljYWRtdXMgPSBpb3JlbWFwKENBRE1VU19CQVNFLCBDQURNVVNfU0laRSk7CisJY2RzX3BjaV9zbG90ID0gKChjYWRtdXNbQ01fQ1NSXSA+PiA2KSAmIDB4MykgKyAxOworCisJaWYgKHBwY19tZC5wcm9ncmVzcykgeworCQljaGFyIGJ1Zls0MF07CisJCXNucHJpbnRmKGJ1ZiwgNDAsICJDRFMgVmVyc2lvbiA9IDB4JXggaW4gc2xvdCAlZFxuIiwKKwkJCQljYWRtdXNbQ01fVkVSXSwgY2RzX3BjaV9zbG90KTsKKwkJcHBjX21kLnByb2dyZXNzKGJ1ZiwgMCk7CisJfQorCisjaWZkZWYgQ09ORklHX1BDSQorCWZvciAobnAgPSBOVUxMOyAobnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgInBjaSIpKSAhPSBOVUxMOykKKwkJYWRkX2JyaWRnZShucCk7CisKKwlwcGNfbWQucGNpYmlvc19maXh1cCA9IG1wYzg1eHhfY2RzX3BjaWJpb3NfZml4dXA7CisJcHBjX21kLnBjaV9zd2l6emxlID0gY29tbW9uX3N3aXp6bGU7CisJcHBjX21kLnBjaV9tYXBfaXJxID0gbXBjODV4eF9tYXBfaXJxOworCXBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UgPSBtcGM4NXh4X2V4Y2x1ZGVfZGV2aWNlOworI2VuZGlmCisKKyNpZmRlZiAgQ09ORklHX1JPT1RfTkZTCisJUk9PVF9ERVYgPSBSb290X05GUzsKKyNlbHNlCisJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKK30KKworCit2b2lkCittcGM4NXh4X2Nkc19zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQoreworCXVpbnQgcHZpZCwgc3ZpZCwgcGhpZDE7CisJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OworCisJcHZpZCA9IG1mc3ByKFNQUk5fUFZSKTsKKwlzdmlkID0gbWZzcHIoU1BSTl9TVlIpOworCisJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOworCXNlcV9wcmludGYobSwgIk1hY2hpbmVcdFx0OiBNUEM4NXh4IENEUyAoMHgleClcbiIsIGNhZG11c1tDTV9WRVJdKTsKKwlzZXFfcHJpbnRmKG0sICJQVlJcdFx0OiAweCV4XG4iLCBwdmlkKTsKKwlzZXFfcHJpbnRmKG0sICJTVlJcdFx0OiAweCV4XG4iLCBzdmlkKTsKKworCS8qIERpc3BsYXkgY3B1IFBsbCBzZXR0aW5nICovCisJcGhpZDEgPSBtZnNwcihTUFJOX0hJRDEpOworCXNlcV9wcmludGYobSwgIlBMTCBzZXR0aW5nXHQ6IDB4JXhcbiIsICgocGhpZDEgPj4gMjQpICYgMHgzZikpOworCisJLyogRGlzcGxheSB0aGUgYW1vdW50IG9mIG1lbW9yeSAqLworCXNlcV9wcmludGYobSwgIk1lbW9yeVx0XHQ6ICVkIE1CXG4iLCBtZW1zaXplIC8gKDEwMjQgKiAxMDI0KSk7Cit9CisKKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4X2Nkc19wcm9iZSh2b2lkKQoreworCS8qIFdlIGFsd2F5cyBtYXRjaCBmb3Igbm93LCBldmVudHVhbGx5IHdlIHNob3VsZCBsb29rIGF0CisJICogdGhlIGZsYXQgZGV2IHRyZWUgdG8gZW5zdXJlIHRoaXMgaXMgdGhlIGJvYXJkIHdlIGFyZQorCSAqIHN1cHBvc2VkIHRvIHJ1biBvbgorCSAqLworCXJldHVybiAxOworfQorCitkZWZpbmVfbWFjaGluZShtcGM4NXh4X2NkcykgeworCS5uYW1lCQk9ICJNUEM4NXh4IENEUyIsCisJLnByb2JlCQk9IG1wYzg1eHhfY2RzX3Byb2JlLAorCS5zZXR1cF9hcmNoCT0gbXBjODV4eF9jZHNfc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJPSBtcGM4NXh4X2Nkc19waWNfaW5pdCwKKwkuc2hvd19jcHVpbmZvCT0gbXBjODV4eF9jZHNfc2hvd19jcHVpbmZvLAorCS5nZXRfaXJxCT0gbXBpY19nZXRfaXJxLAorCS5yZXN0YXJ0CT0gbXBjODV4eF9yZXN0YXJ0LAorCS5jYWxpYnJhdGVfZGVjciA9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCT0gdWRiZ19wcm9ncmVzcywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWY1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmgKKyAqCisgKiBNUEM4NXh4IENEUyBib2FyZCBkZWZpbml0aW9ucworICoKKyAqIE1haW50YWluZXI6IEt1bWFyIEdhbGEgPGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogQ29weXJpZ2h0IDIwMDQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX19NQUNIX01QQzg1WFhfQ0RTX0hfXworI2RlZmluZSBfX01BQ0hfTVBDODVYWF9DRFNfSF9fCisKKy8qIENBRE1VUyBpbmZvICovCisjZGVmaW5lIENBRE1VU19CQVNFICgweGY4MDA0MDAwKQorI2RlZmluZSBDQURNVVNfU0laRSAoMjU2KQorI2RlZmluZSBDTV9WRVIJKDApCisjZGVmaW5lIENNX0NTUgkoMSkKKyNkZWZpbmUgQ01fUlNUCSgyKQorCisvKiBDRFMgTlZSQU0vUlRDICovCisjZGVmaW5lIENEU19SVENfQUREUgkoMHhmODAwMDAwMCkKKyNkZWZpbmUgQ0RTX1JUQ19TSVpFCSg4ICogMTAyNCkKKworLyogUENJIGludGVycnVwdCBjb250cm9sbGVyICovCisjZGVmaW5lIFBJUlEwQQkJCU1QQzg1eHhfSVJRX0VYVDAKKyNkZWZpbmUgUElSUTBCCQkJTVBDODV4eF9JUlFfRVhUMQorI2RlZmluZSBQSVJRMEMJCQlNUEM4NXh4X0lSUV9FWFQyCisjZGVmaW5lIFBJUlEwRAkJCU1QQzg1eHhfSVJRX0VYVDMKKyNkZWZpbmUgUElSUTFBCQkJTVBDODV4eF9JUlFfRVhUMTEKKworI2RlZmluZSBOUl84MjU5X0lOVFMJCTE2CisjZGVmaW5lIENQTV9JUlFfT0ZGU0VUCQlOUl84MjU5X0lOVFMKKworI2RlZmluZSBNUEM4NXh4X09QRU5QSUNfSVJRX09GRlNFVAk4MAorCisjZW5kaWYgLyogX19NQUNIX01QQzg1WFhfQ0RTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTg3ODYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L0tjb25maWcKQEAgLTAsMCArMSwzNiBAQAorbWVudSAiUGxhdGZvcm0gU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ184Nnh4CisKK2Nob2ljZQorCXByb21wdCAiTWFjaGluZSBUeXBlIgorCWRlZmF1bHQgTVBDODY0MV9IUENOCisKK2NvbmZpZyBNUEM4NjQxX0hQQ04KKwlib29sICJGcmVlc2NhbGUgTVBDODY0MSBIUENOIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1QQzg2NDEgSFBDTiBib2FyZC4KKworZW5kY2hvaWNlCisKKworY29uZmlnIE1QQzg2NDEKKwlib29sCisJc2VsZWN0IFBQQ19JTkRJUkVDVF9QQ0kKKwlzZWxlY3QgUFBDX1VEQkdfMTY1NTAKKwlkZWZhdWx0IHkgaWYgTVBDODY0MV9IUENOCisKK2NvbmZpZyBNUElDCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgUFBDX0lORElSRUNUX1BDSV9CRQorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ184Nnh4CisJZGVmYXVsdCB5CisKK2NvbmZpZyBQUENfU1REX01NVQorCWJvb2wKKwlkZXBlbmRzIG9uIFBQQ184Nnh4CisJZGVmYXVsdCB5CisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU3OTZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L01ha2VmaWxlCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBQb3dlclBDIDg2eHggbGludXgga2VybmVsLgorIworCisKK2lmZXEgKCQoQ09ORklHX1BQQ184Nnh4KSx5KQorb2JqLSQoQ09ORklHX1NNUCkJCSs9IG1wYzg2eHhfc21wLm8KK2VuZGlmCitvYmotJChDT05GSUdfTVBDODY0MV9IUENOKQkrPSBtcGM4Nnh4X2hwY24ubworb2JqLSQoQ09ORklHX1BDSSkJCSs9IHBjaS5vIG1wYzg2eHhfcGNpZS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODY0MV9ocGNuLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODY0MV9ocGNuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0MjI1MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4NjQxX2hwY24uaApAQCAtMCwwICsxLDU0IEBACisvKgorICogTVBDODY0MSBIUENOIGJvYXJkIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yOiBYaWFuZ2h1YSBYaWFvIDx4LnhpYW9AZnJlZXNjYWxlLmNvbT4KKyAqLworCisjaWZuZGVmIF9fTVBDODY0MV9IUENOX0hfXworI2RlZmluZSBfX01QQzg2NDFfSFBDTl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworLyogUENJIGludGVycnVwdCBjb250cm9sbGVyICovCisjZGVmaW5lIFBJUlFBCQkzCisjZGVmaW5lIFBJUlFCCQk0CisjZGVmaW5lIFBJUlFDCQk1CisjZGVmaW5lIFBJUlFECQk2CisjZGVmaW5lIFBJUlE3CQk3CisjZGVmaW5lIFBJUlFFCQk5CisjZGVmaW5lIFBJUlFGCQkxMAorI2RlZmluZSBQSVJRRwkJMTEKKyNkZWZpbmUgUElSUUgJCTEyCisKKy8qIFBDSS1FeHByZXNzIG1lbW9yeSBtYXAgKi8KKyNkZWZpbmUgTVBDODZYWF9QQ0lFX0xPV0VSX0lPICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1QQzg2WFhfUENJRV9VUFBFUl9JTyAgICAgICAgMHgwMGZmZmZmZgorCisjZGVmaW5lIE1QQzg2WFhfUENJRV9MT1dFUl9NRU0gICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBNUEM4NlhYX1BDSUVfVVBQRVJfTUVNICAgICAgIDB4OWZmZmZmZmYKKworI2RlZmluZSBNUEM4NlhYX1BDSUVfSU9fQkFTRSAgICAgICAgIDB4ZTIwMDAwMDAKKyNkZWZpbmUgTVBDODZYWF9QQ0lFX01FTV9PRkZTRVQgICAgICAweDAwMDAwMDAwCisKKyNkZWZpbmUgTVBDODZYWF9QQ0lFX0lPX1NJWkUgICAgICAgICAweDAxMDAwMDAwCisKKyNkZWZpbmUgUENJRTFfQ0ZHX0FERFJfT0ZGU0VUICAgICgweDgwMDApCisjZGVmaW5lIFBDSUUxX0NGR19EQVRBX09GRlNFVCAgICAoMHg4MDA0KQorCisjZGVmaW5lIFBDSUUyX0NGR19BRERSX09GRlNFVCAgICAoMHg5MDAwKQorI2RlZmluZSBQQ0lFMl9DRkdfREFUQV9PRkZTRVQgICAgKDB4OTAwNCkKKworI2RlZmluZSBNUEM4Nnh4X1BDSUVfT0ZGU0VUIFBDSUUxX0NGR19BRERSX09GRlNFVAorI2RlZmluZSBNUEM4Nnh4X1BDSUVfU0laRQkoMHgxMDAwKQorCisjZGVmaW5lIE1QQzg2WFhfUlNUQ1JfT0ZGU0VUCSgweGUwMGIwKQkvKiBSZXNldCBDb250cm9sIFJlZ2lzdGVyICovCisKKyNlbmRpZgkvKiBfX01QQzg2NDFfSFBDTl9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzllNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTVBDODZYWF9IX18KKyNkZWZpbmUgX19NUEM4NlhYX0hfXworCisvKgorICogRGVjbGFyYXRpb24gZm9yIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUKKyAqIG1wYzg2eHhfKiBmaWxlcy4gTW9zdGx5IGZvciB1c2UgYnkgbXBjODZ4eF9zZXR1cCgpLgorICovCisKK2V4dGVybiBpbnQgX19pbml0IGFkZF9icmlkZ2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYpOworCitleHRlcm4gdm9pZCBfX2luaXQgc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCisJCQkJICAgICAgIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKTsKK2V4dGVybiB2b2lkIF9faW5pdCBzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwKKwkJCQkJICAgICB2b2lkIF9faW9tZW0gKmNmZ19hZGRyLAorCQkJCQkgICAgIHZvaWQgX19pb21lbSAqY2ZnX2RhdGEpOworCitleHRlcm4gdm9pZCBfX2luaXQgbXBjODZ4eF9zbXBfaW5pdCh2b2lkKTsKKworI2VuZGlmCS8qIF9fTVBDODZYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjMjFkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogTVBDODZ4eCBIUENOIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzCisgKgorICogUmVjb2RlOiBaSEFORyBXRUkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICogSW5pdGlhbCBhdXRob3I6IFhpYW5naHVhIFhpYW8gPHgueGlhb0BmcmVlc2NhbGUuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcm9vdF9kZXYuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxhc20vbXBjODZ4eC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8bW0vbW11X2RlY2wuaD4KKyNpbmNsdWRlIDxhc20vdWRiZy5oPgorI2luY2x1ZGUgPGFzbS9pODI1OS5oPgorCisjaW5jbHVkZSA8YXNtL21waWMuaD4KKworI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CisKKyNpbmNsdWRlICJtcGM4Nnh4LmgiCisKKyNpZm5kZWYgQ09ORklHX1BDSQordW5zaWduZWQgbG9uZyBpc2FfaW9fYmFzZSA9IDA7Cit1bnNpZ25lZCBsb25nIGlzYV9tZW1fYmFzZSA9IDA7Cit1bnNpZ25lZCBsb25nIHBjaV9kcmFtX29mZnNldCA9IDA7CisjZW5kaWYKKworCisvKgorICogSW50ZXJuYWwgaW50ZXJydXB0cyBhcmUgYWxsIExldmVsIFNlbnNpdGl2ZSwgYW5kIFBvc2l0aXZlIFBvbGFyaXR5CisgKi8KKworc3RhdGljIHVfY2hhciBtcGM4Nnh4X2hwY25fb3BlbnBpY19pbml0c2Vuc2VzW10gX19pbml0ZGF0YSA9IHsKKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgIDA6IFJlc2VydmVkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsICAxOiBNQ00gKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgIDI6IEREUiBEUkFNICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsICAzOiBMQklVICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsICA0OiBETUEgMCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAgNTogRE1BIDEgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgIDY6IERNQSAyICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsICA3OiBETUEgMyAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAgODogUENJRTEgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgIDk6IFBDSUUyICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDEwOiBSZXNlcnZlZCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAxMTogUmVzZXJ2ZWQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMTI6IERVQVJUMiAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAxMzogVFNFQyAxIFRyYW5zbWl0ICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDE0OiBUU0VDIDEgUmVjZWl2ZSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAxNTogVFNFQyAzIHRyYW5zbWl0ICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDE2OiBUU0VDIDMgcmVjZWl2ZSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAxNzogVFNFQyAzIGVycm9yICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDE4OiBUU0VDIDEgUmVjZWl2ZS9UcmFuc21pdCBFcnJvciAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAxOTogVFNFQyAyIFRyYW5zbWl0ICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDIwOiBUU0VDIDIgUmVjZWl2ZSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAyMTogVFNFQyA0IHRyYW5zbWl0ICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDIyOiBUU0VDIDQgcmVjZWl2ZSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAyMzogVFNFQyA0IGVycm9yICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDI0OiBUU0VDIDIgUmVjZWl2ZS9UcmFuc21pdCBFcnJvciAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAyNTogVW51c2VkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDI2OiBEVUFSVDEgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMjc6IEkyQyAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAyODogUGVyZm9ybWFuY2UgTW9uaXRvciAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAyOTogVW51c2VkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDMwOiBVbnVzZWQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMzE6IFVudXNlZCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAzMjogU1JJTyBlcnJvci93cml0ZS1wb3J0IHVuaXQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMzM6IFNSSU8gb3V0Ym91bmQgZG9vcmJlbGwgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMzQ6IFNSSU8gaW5ib3VuZCBkb29yYmVsbCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAzNTogVW51c2VkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDM2OiBVbnVzZWQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMzc6IFNSSU8gb3V0Ym91bmQgbWVzc2FnZSB1bml0IDEgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgMzg6IFNSSU8gaW5ib3VuZCBtZXNzYWdlIHVuaXQgMSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCAzOTogU1JJTyBvdXRib3VuZCBtZXNzYWdlIHVuaXQgMiAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCA0MDogU1JJTyBpbmJvdW5kIG1lc3NhZ2UgdW5pdCAyICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDQxOiBVbnVzZWQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgNDI6IFVudXNlZCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCA0MzogVW51c2VkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDQ0OiBVbnVzZWQgKi8KKwkoSVJRX1NFTlNFX0xFVkVMIHwgSVJRX1BPTEFSSVRZX1BPU0lUSVZFKSwJLyogSW50ZXJuYWwgNDU6IFVudXNlZCAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBJbnRlcm5hbCA0NjogVW51c2VkICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9QT1NJVElWRSksCS8qIEludGVybmFsIDQ3OiBVbnVzZWQgKi8KKwkweDAsCQkJCQkJLyogRXh0ZXJuYWwgIDA6ICovCisJMHgwLAkJCQkJCS8qIEV4dGVybmFsICAxOiAqLworCTB4MCwJCQkJCQkvKiBFeHRlcm5hbCAgMjogKi8KKwkweDAsCQkJCQkJLyogRXh0ZXJuYWwgIDM6ICovCisJMHgwLAkJCQkJCS8qIEV4dGVybmFsICA0OiAqLworCTB4MCwJCQkJCQkvKiBFeHRlcm5hbCAgNTogKi8KKwkweDAsCQkJCQkJLyogRXh0ZXJuYWwgIDY6ICovCisJMHgwLAkJCQkJCS8qIEV4dGVybmFsICA3OiAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfTkVHQVRJVkUpLAkvKiBFeHRlcm5hbCAgODogUGl4aXMgRlBHQSAqLworCShJUlFfU0VOU0VfTEVWRUwgfCBJUlFfUE9MQVJJVFlfUE9TSVRJVkUpLAkvKiBFeHRlcm5hbCAgOTogVUxJIDgyNTkgSU5UUiBDYXNjYWRlICovCisJKElSUV9TRU5TRV9MRVZFTCB8IElSUV9QT0xBUklUWV9ORUdBVElWRSksCS8qIEV4dGVybmFsIDEwOiBRdWFkIEVUSCBQSFkgKi8KKwkweDAsCQkJCQkJLyogRXh0ZXJuYWwgMTE6ICovCisJMHgwLAorCTB4MCwKKwkweDAsCisJMHgwLAorfTsKKworCit2b2lkIF9faW5pdAorbXBjODZ4eF9ocGNuX2luaXRfaXJxKHZvaWQpCit7CisJc3RydWN0IG1waWMgKm1waWMxOworCXBoeXNfYWRkcl90IG9wZW5waWNfcGFkZHI7CisKKwkvKiBEZXRlcm1pbmUgdGhlIFBoeXNpY2FsIEFkZHJlc3Mgb2YgdGhlIE9wZW5QSUMgcmVncyAqLworCW9wZW5waWNfcGFkZHIgPSBnZXRfaW1tcmJhc2UoKSArIE1QQzg2eHhfT1BFTlBJQ19PRkZTRVQ7CisKKwkvKiBBbGxvYyBtcGljIHN0cnVjdHVyZSBhbmQgcGVyIGlzdSBoYXMgMTYgSU5UIGVudHJpZXMuICovCisJbXBpYzEgPSBtcGljX2FsbG9jKG9wZW5waWNfcGFkZHIsCisJCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAorCQkJMTYsIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VULCAwLCAyNTAsCisJCQltcGM4Nnh4X2hwY25fb3BlbnBpY19pbml0c2Vuc2VzLAorCQkJc2l6ZW9mKG1wYzg2eHhfaHBjbl9vcGVucGljX2luaXRzZW5zZXMpLAorCQkJIiBNUElDICAgICAiKTsKKwlCVUdfT04obXBpYzEgPT0gTlVMTCk7CisKKwkvKiA0OCBJbnRlcm5hbCBJbnRlcnJ1cHRzICovCisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAwLCBvcGVucGljX3BhZGRyICsgMHgxMDIwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAxLCBvcGVucGljX3BhZGRyICsgMHgxMDQwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAyLCBvcGVucGljX3BhZGRyICsgMHgxMDYwMCk7CisKKwkvKiAxNiBFeHRlcm5hbCBpbnRlcnJ1cHRzICovCisJbXBpY19hc3NpZ25faXN1KG1waWMxLCAzLCBvcGVucGljX3BhZGRyICsgMHgxMDAwMCk7CisKKwltcGljX2luaXQobXBpYzEpOworCisjaWZkZWYgQ09ORklHX1BDSQorCW1waWNfc2V0dXBfY2FzY2FkZShNUEM4Nnh4X0lSUV9FWFQ5LCBpODI1OV9pcnFfY2FzY2FkZSwgTlVMTCk7CisJaTgyNTlfaW5pdCgwLCBJODI1OV9PRkZTRVQpOworI2VuZGlmCit9CisKKworCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIGludGVycnVwdCByb3V0aW5nCisgKi8KKworaW50CittcGM4Nnh4X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdW5zaWduZWQgY2hhciBpZHNlbCwgdW5zaWduZWQgY2hhciBwaW4pCit7CisJc3RhdGljIGNoYXIgcGNpX2lycV90YWJsZVtdWzRdID0geworCQkvKgorCQkgKiAgICAgIFBDSSBJRFNFTC9JTlRQSU4tPklOVExJTkUKKwkJICogICAgICAgQSAgICAgIEIgICAgICBDICAgICAgRAorCQkgKi8KKwkJe1BJUlFBLCBQSVJRQiwgUElSUUMsIFBJUlFEfSwgICAvKiBJRFNFTCAxNyAtLSBQQ0kgU2xvdCAxICovCisJCXtQSVJRQiwgUElSUUMsIFBJUlFELCBQSVJRQX0sCS8qIElEU0VMIDE4IC0tIFBDSSBTbG90IDIgKi8KKwkJezAsIDAsIDAsIDB9LAkJCS8qIElEU0VMIDE5ICovCisJCXswLCAwLCAwLCAwfSwJCQkvKiBJRFNFTCAyMCAqLworCQl7MCwgMCwgMCwgMH0sCQkJLyogSURTRUwgMjEgKi8KKwkJezAsIDAsIDAsIDB9LAkJCS8qIElEU0VMIDIyICovCisJCXswLCAwLCAwLCAwfSwJCQkvKiBJRFNFTCAyMyAqLworCQl7MCwgMCwgMCwgMH0sCQkJLyogSURTRUwgMjQgKi8KKwkJezAsIDAsIDAsIDB9LAkJCS8qIElEU0VMIDI1ICovCisJCXtQSVJRRCwgUElSUUEsIFBJUlFCLCBQSVJRQ30sCS8qIElEU0VMIDI2IC0tIFBDSSBCcmlkZ2UqLworCQl7UElSUUMsIDAsIDAsIDB9LAkJLyogSURTRUwgMjcgLS0gTEFOICovCisJCXtQSVJRRSwgUElSUUYsIFBJUlFILCBQSVJRN30sCS8qIElEU0VMIDI4IC0tIFVTQiAxLjEgKi8KKwkJe1BJUlFFLCBQSVJRRiwgUElSUUcsIDB9LAkvKiBJRFNFTCAyOSAtLSBBdWRpbyAmIE1vZGVtICovCisJCXtQSVJRSCwgMCwgMCwgMH0sCQkvKiBJRFNFTCAzMCAtLSBMUEMgJiBQTVUqLworCQl7UElSUUQsIDAsIDAsIDB9LAkJLyogSURTRUwgMzEgLS0gQVRBICovCisJfTsKKworCWNvbnN0IGxvbmcgbWluX2lkc2VsID0gMTcsIG1heF9pZHNlbCA9IDMxLCBpcnFzX3Blcl9zbG90ID0gNDsKKwlyZXR1cm4gUENJX0lSUV9UQUJMRV9MT09LVVAgKyBJODI1OV9PRkZTRVQ7Cit9CisKKworaW50CittcGM4Nnh4X2V4Y2x1ZGVfZGV2aWNlKHVfY2hhciBidXMsIHVfY2hhciBkZXZmbikKK3sKKyNpZiAhZGVmaW5lZChDT05GSUdfUENJKQorCWlmIChidXMgPT0gMCAmJiBQQ0lfU0xPVChkZXZmbikgPT0gMCkKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKyNlbmRpZgorCisJcmV0dXJuIFBDSUJJT1NfU1VDQ0VTU0ZVTDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJICovCisKKworc3RhdGljIHZvaWQgX19pbml0CittcGM4Nnh4X2hwY25fc2V0dXBfYXJjaCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAocHBjX21kLnByb2dyZXNzKQorCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzg2eHhfaHBjbl9zZXR1cF9hcmNoKCkiLCAwKTsKKworCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImNwdSIpOworCWlmIChucCAhPSAwKSB7CisJCXVuc2lnbmVkIGludCAqZnA7CisKKwkJZnAgPSAoaW50ICopZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CisJCWlmIChmcCAhPSAwKQorCQkJbG9vcHNfcGVyX2ppZmZ5ID0gKmZwIC8gSFo7CisJCWVsc2UKKwkJCWxvb3BzX3Blcl9qaWZmeSA9IDUwMDAwMDAwIC8gSFo7CisJCW9mX25vZGVfcHV0KG5wKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfUENJCisJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAicGNpIikpICE9IE5VTEw7KQorCQlhZGRfYnJpZGdlKG5wKTsKKworCXBwY19tZC5wY2lfc3dpenpsZSA9IGNvbW1vbl9zd2l6emxlOworCXBwY19tZC5wY2lfbWFwX2lycSA9IG1wYzg2eHhfbWFwX2lycTsKKwlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODZ4eF9leGNsdWRlX2RldmljZTsKKyNlbmRpZgorCisJcHJpbnRrKCJNUEM4Nnh4IEhQQ04gYm9hcmQgZnJvbSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvclxuIik7CisKKyNpZmRlZiAgQ09ORklHX1JPT1RfTkZTCisJUk9PVF9ERVYgPSBSb290X05GUzsKKyNlbHNlCisJUk9PVF9ERVYgPSBSb290X0hEQTE7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKKwltcGM4Nnh4X3NtcF9pbml0KCk7CisjZW5kaWYKK30KKworCit2b2lkCittcGM4Nnh4X2hwY25fc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CisJdWludCBtZW1zaXplID0gdG90YWxfbWVtb3J5OworCWNvbnN0IGNoYXIgKm1vZGVsID0gIiI7CisJdWludCBzdmlkID0gbWZzcHIoU1BSTl9TVlIpOworCisJc2VxX3ByaW50ZihtLCAiVmVuZG9yXHRcdDogRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOworCisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJaWYgKHJvb3QpCisJCW1vZGVsID0gZ2V0X3Byb3BlcnR5KHJvb3QsICJtb2RlbCIsIE5VTEwpOworCXNlcV9wcmludGYobSwgIk1hY2hpbmVcdFx0OiAlc1xuIiwgbW9kZWwpOworCW9mX25vZGVfcHV0KHJvb3QpOworCisJc2VxX3ByaW50ZihtLCAiU1ZSXHRcdDogMHgleFxuIiwgc3ZpZCk7CisJc2VxX3ByaW50ZihtLCAiTWVtb3J5XHRcdDogJWQgTUJcbiIsIG1lbXNpemUgLyAoMTAyNCAqIDEwMjQpKTsKK30KKworCisvKgorICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IG1wYzg2eHhfaHBjbl9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmIChvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIm1wYzg2eHgiKSkKKwkJcmV0dXJuIDE7CS8qIExvb2tzIGdvb2QgKi8KKworCXJldHVybiAwOworfQorCisKK3ZvaWQKK21wYzg2eHhfcmVzdGFydChjaGFyICpjbWQpCit7CisJdm9pZCBfX2lvbWVtICpyc3RjcjsKKworCXJzdGNyID0gaW9yZW1hcChnZXRfaW1tcmJhc2UoKSArIE1QQzg2WFhfUlNUQ1JfT0ZGU0VULCAweDEwMCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogQXNzZXJ0IHJlc2V0IHJlcXVlc3QgdG8gUmVzZXQgQ29udHJvbCBSZWdpc3RlciAqLworCW91dF9iZTMyKHJzdGNyLCAweDIpOworCisJLyogbm90IHJlYWNoZWQgKi8KK30KKworCitsb25nIF9faW5pdAorbXBjODZ4eF90aW1lX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKworCS8qIFNldCB0aGUgdGltZSBiYXNlIHRvIHplcm8gKi8KKwltdHNwcihTUFJOX1RCV0wsIDApOworCW10c3ByKFNQUk5fVEJXVSwgMCk7CisKKwl0ZW1wID0gbWZzcHIoU1BSTl9ISUQwKTsKKwl0ZW1wIHw9IEhJRDBfVEJFTjsKKwltdHNwcihTUFJOX0hJRDAsIHRlbXApOworCWFzbSB2b2xhdGlsZSgiaXN5bmMiKTsKKworCXJldHVybiAwOworfQorCisKK2RlZmluZV9tYWNoaW5lKG1wYzg2eHhfaHBjbikgeworCS5uYW1lCQkJPSAiTVBDODZ4eCBIUENOIiwKKwkucHJvYmUJCQk9IG1wYzg2eHhfaHBjbl9wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBtcGM4Nnh4X2hwY25fc2V0dXBfYXJjaCwKKwkuaW5pdF9JUlEJCT0gbXBjODZ4eF9ocGNuX2luaXRfaXJxLAorCS5zaG93X2NwdWluZm8JCT0gbXBjODZ4eF9ocGNuX3Nob3dfY3B1aW5mbywKKwkuZ2V0X2lycQkJPSBtcGljX2dldF9pcnEsCisJLnJlc3RhcnQJCT0gbXBjODZ4eF9yZXN0YXJ0LAorCS50aW1lX2luaXQJCT0gbXBjODZ4eF90aW1lX2luaXQsCisJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCisJLnByb2dyZXNzCQk9IHVkYmdfcHJvZ3Jlc3MsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfcGNpZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfcGNpZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjRmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9wY2llLmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBpbmRpcmVjdCBQQ0kgYnJpZGdlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggR2FicmllbCBQYXViZXJ0LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIlRlbXBvcmFyeSIgTVBDODU0OCBFcnJhdGEgZmlsZSAtCisgKiBUaGUgc3RhbmRhcmQgaW5kaXJlY3RfcGNpIGNvZGUgc2hvdWxkIHdvcmsgd2l0aCBmdXR1cmUgc2lsaWNvbiB2ZXJzaW9ucy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisKKyNpbmNsdWRlICJtcGM4Nnh4LmgiCisKKyNkZWZpbmUgUENJX0NGR19PVVQgb3V0X2JlMzIKKworLyogRVJSQVRBIFBDSS1FeCAxNCBQQ0lFIENvbnRyb2xsZXIgdGltZW91dCAqLworI2RlZmluZSBQQ0lFX0ZJWAkJb3V0X2JlMzIoaG9zZS0+Y2ZnX2FkZHIrMHg0LCAweDA0MDBmZmZmKQorCisKK3N0YXRpYyBpbnQKK2luZGlyZWN0X3JlYWRfY29uZmlnX3BjaWUoc3RydWN0IHBjaV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGRldmZuLCBpbnQgb2Zmc2V0LAorCQkgICAgIGludCBsZW4sIHUzMiAqdmFsKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IGJ1cy0+c3lzZGF0YTsKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmNmZ19kYXRhOworCXUzMiB0ZW1wOworCisJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UpCisJCWlmIChwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlKGJ1cy0+bnVtYmVyLCBkZXZmbikpCisJCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOworCisJLyogUG9zc2libGUgYXJ0aWZhY3Qgb2YgQ0RDcHA1MDkzNyBuZWVkcyBmdXJ0aGVyIGludmVzdGlnYXRpb24gKi8KKwlpZiAoZGV2Zm4gIT0gMHgwICYmIGJ1cy0+bnVtYmVyID09IDB4ZmYpCisJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwlQQ0lFX0ZJWDsKKwlpZiAoYnVzLT5udW1iZXIgPT0gMHhmZikgeworCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJCSAgICAoMHg4MDAwMDAwMCB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8CisJCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKKwkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKKwl9IGVsc2UgeworCQlQQ0lfQ0ZHX09VVChob3NlLT5jZmdfYWRkciwKKwkJCSAgICAoMHg4MDAwMDAwMSB8ICgob2Zmc2V0ICYgMHhmMDApIDw8IDE2KSB8CisJCQkgICAgICgoYnVzLT5udW1iZXIgLSBob3NlLT5idXNfb2Zmc2V0KSA8PCAxNikKKwkJCSAgICAgfCAoZGV2Zm4gPDwgOCkgfCAoKG9mZnNldCAmIDB4ZmMpICkpKTsKKwl9CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKKwlQQ0lFX0ZJWDsKKwl0ZW1wID0gaW5fbGUzMihjZmdfZGF0YSk7CisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCSp2YWwgPSAodGVtcCA+PiAoKChvZmZzZXQgJiAzKSkqOCkpICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsID0gKHRlbXAgPj4gKCgob2Zmc2V0ICYgMykpKjgpKSAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJKnZhbCA9IHRlbXA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50CitpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZShzdHJ1Y3QgcGNpX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIGludCBvZmZzZXQsCisJCSAgICAgIGludCBsZW4sIHUzMiB2YWwpCit7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gYnVzLT5zeXNkYXRhOworCXZvbGF0aWxlIHZvaWQgX19pb21lbSAqY2ZnX2RhdGE7CisJdTMyIHRlbXA7CisKKwlpZiAocHBjX21kLnBjaV9leGNsdWRlX2RldmljZSkKKwkJaWYgKHBwY19tZC5wY2lfZXhjbHVkZV9kZXZpY2UoYnVzLT5udW1iZXIsIGRldmZuKSkKKwkJCXJldHVybiBQQ0lCSU9TX0RFVklDRV9OT1RfRk9VTkQ7CisKKwkvKiBQb3NzaWJsZSBhcnRpZmFjdCBvZiBDRENwcDUwOTM3IG5lZWRzIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiAqLworCWlmIChkZXZmbiAhPSAweDAgJiYgYnVzLT5udW1iZXIgPT0gMHhmZikKKwkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKKworCVBDSUVfRklYOworCWlmIChidXMtPm51bWJlciA9PSAweGZmKSB7CisJCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkJICAgICgweDgwMDAwMDAwIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKKwkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOworCX0gZWxzZSB7CisJCVBDSV9DRkdfT1VUKGhvc2UtPmNmZ19hZGRyLAorCQkJICAgICgweDgwMDAwMDAxIHwgKChvZmZzZXQgJiAweGYwMCkgPDwgMTYpIHwKKwkJCSAgICAgKChidXMtPm51bWJlciAtIGhvc2UtPmJ1c19vZmZzZXQpIDw8IDE2KQorCQkJICAgICB8IChkZXZmbiA8PCA4KSB8ICgob2Zmc2V0ICYgMHhmYykgKSkpOworICAgICAgICB9CisKKwkvKgorCSAqIE5vdGU6IHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IG9mZnNldCBpcworCSAqIHN1aXRhYmx5IGFsaWduZWQgYW5kIHRoYXQgbGVuIGlzIDEsIDIgb3IgNC4KKwkgKi8KKwkvKiBFUlJBVEEgUENJLUV4IDEyIC0gQ29uZmlndXJhdGlvbiBBZGRyZXNzL0RhdGEgQWxpZ25tZW50ICovCisJY2ZnX2RhdGEgPSBob3NlLT5jZmdfZGF0YTsKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJUENJRV9GSVg7CisJCXRlbXAgPSBpbl9sZTMyKGNmZ19kYXRhKTsKKwkJdGVtcCA9ICh0ZW1wICYgfigweGZmIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkpIHwKKwkJCSh2YWwgPDwgKChvZmZzZXQgJiAzKSAqIDgpKTsKKwkJUENJRV9GSVg7CisJCW91dF9sZTMyKGNmZ19kYXRhLCB0ZW1wKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlQQ0lFX0ZJWDsKKwkJdGVtcCA9IGluX2xlMzIoY2ZnX2RhdGEpOworCQl0ZW1wID0gKHRlbXAgJiB+KDB4ZmZmZiA8PCAoKG9mZnNldCAmIDMpICogOCkpKTsKKwkJdGVtcCB8PSAodmFsIDw8ICgob2Zmc2V0ICYgMykgKiA4KSkgOworCQlQQ0lFX0ZJWDsKKwkJb3V0X2xlMzIoY2ZnX2RhdGEsIHRlbXApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQQ0lFX0ZJWDsKKwkJb3V0X2xlMzIoY2ZnX2RhdGEsIHZhbCk7CisJCWJyZWFrOworCX0KKwlQQ0lFX0ZJWDsKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9vcHMgaW5kaXJlY3RfcGNpZV9vcHMgPSB7CisJaW5kaXJlY3RfcmVhZF9jb25maWdfcGNpZSwKKwlpbmRpcmVjdF93cml0ZV9jb25maWdfcGNpZQorfTsKKwordm9pZCBfX2luaXQKK3NldHVwX2luZGlyZWN0X3BjaWVfbm9tYXAoc3RydWN0IHBjaV9jb250cm9sbGVyKiBob3NlLCB2b2lkIF9faW9tZW0gKiBjZmdfYWRkciwKKwl2b2lkIF9faW9tZW0gKiBjZmdfZGF0YSkKK3sKKwlob3NlLT5jZmdfYWRkciA9IGNmZ19hZGRyOworCWhvc2UtPmNmZ19kYXRhID0gY2ZnX2RhdGE7CisJaG9zZS0+b3BzID0gJmluZGlyZWN0X3BjaWVfb3BzOworfQorCit2b2lkIF9faW5pdAorc2V0dXBfaW5kaXJlY3RfcGNpZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIqIGhvc2UsIHUzMiBjZmdfYWRkciwgdTMyIGNmZ19kYXRhKQoreworCXVuc2lnbmVkIGxvbmcgYmFzZSA9IGNmZ19hZGRyICYgUEFHRV9NQVNLOworCXZvaWQgX19pb21lbSAqbWJhc2UsICphZGRyLCAqZGF0YTsKKworCW1iYXNlID0gaW9yZW1hcChiYXNlLCBQQUdFX1NJWkUpOworCWFkZHIgPSBtYmFzZSArIChjZmdfYWRkciAmIH5QQUdFX01BU0spOworCWlmICgoY2ZnX2RhdGEgJiBQQUdFX01BU0spICE9IGJhc2UpCisJCW1iYXNlID0gaW9yZW1hcChjZmdfZGF0YSAmIFBBR0VfTUFTSywgUEFHRV9TSVpFKTsKKwlkYXRhID0gbWJhc2UgKyAoY2ZnX2RhdGEgJiB+UEFHRV9NQVNLKTsKKwlzZXR1cF9pbmRpcmVjdF9wY2llX25vbWFwKGhvc2UsIGFkZHIsIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9zbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDRlYzRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfc21wLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBBdXRob3I6IFhpYW5naHVhIFhpYW8gPHgueGlhb0BmcmVlc2NhbGUuY29tPgorICogICAgICAgICBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA2IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS1wb3dlcnBjL21waWMuaD4KKyNpbmNsdWRlIDxhc20vbXBjODZ4eC5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODZ4eC5oIgorCitleHRlcm4gdm9pZCBfX3NlY29uZGFyeV9zdGFydF9tcGM4Nnh4KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19zZWNvbmRhcnlfaG9sZF9hY2tub3dsZWRnZTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQKK3NtcF84Nnh4X3JlbGVhc2VfY29yZShpbnQgbnIpCit7CisJdm9pZCAqbWNtX3ZhZGRyOworCXVuc2lnbmVkIGxvbmcgdmFkZHIsIHBjcjsKKworCWlmIChuciA8IDAgfHwgbnIgPj0gTlJfQ1BVUykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTdGFydHVwIENvcmUgI25yLgorCSAqLworCW1jbV92YWRkciA9IGlvcmVtYXAoZ2V0X2ltbXJiYXNlKCkgKyBNUEM4Nnh4X01DTV9PRkZTRVQsCisJCQkgICAgTVBDODZ4eF9NQ01fU0laRSk7CisJdmFkZHIgPSAodW5zaWduZWQgbG9uZyltY21fdmFkZHIgKyAgTUNNX1BPUlRfQ09ORklHX09GRlNFVDsKKwlwY3IgPSBpbl9iZTMyKCh2b2xhdGlsZSB1bnNpZ25lZCAqKXZhZGRyKTsKKwlwY3IgfD0gMSA8PCAobnIgKyAyNCk7CisJb3V0X2JlMzIoKHZvbGF0aWxlIHVuc2lnbmVkICopdmFkZHIsIHBjcik7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0CitzbXBfODZ4eF9raWNrX2NwdShpbnQgbnIpCit7CisJdW5zaWduZWQgaW50IHNhdmVfdmVjdG9yOworCXVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBmbGFnczsKKwlpbnQgbiA9IDA7CisJdm9sYXRpbGUgdW5zaWduZWQgaW50ICp2ZWN0b3IKKwkJID0gKHZvbGF0aWxlIHVuc2lnbmVkIGludCAqKShLRVJORUxCQVNFICsgMHgxMDApOworCisJaWYgKG5yIDwgMCB8fCBuciA+PSBOUl9DUFVTKQorCQlyZXR1cm47CisKKwlwcl9kZWJ1Zygic21wXzg2eHhfa2lja19jcHU6IGtpY2sgQ1BVICMlZFxuIiwgbnIpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBTYXZlIHJlc2V0IHZlY3RvciAqLworCXNhdmVfdmVjdG9yID0gKnZlY3RvcjsKKworCS8qIFNldHVwIGZha2UgcmVzZXQgdmVjdG9yIHRvIGNhbGwgX19zZWNvbmRhcnlfc3RhcnRfbXBjODZ4eC4gKi8KKwl0YXJnZXQgPSAodW5zaWduZWQgbG9uZykgX19zZWNvbmRhcnlfc3RhcnRfbXBjODZ4eDsKKwljcmVhdGVfYnJhbmNoKCh1bnNpZ25lZCBsb25nKXZlY3RvciwgdGFyZ2V0LCBCUkFOQ0hfU0VUX0xJTkspOworCisJLyogS2ljayB0aGF0IENQVSAqLworCXNtcF84Nnh4X3JlbGVhc2VfY29yZShucik7CisKKwkvKiBXYWl0IGEgYml0IGZvciB0aGUgQ1BVIHRvIHRha2UgdGhlIGV4Y2VwdGlvbi4gKi8KKwl3aGlsZSAoKF9fc2Vjb25kYXJ5X2hvbGRfYWNrbm93bGVkZ2UgIT0gbnIpICYmIChuKyssIG4gPCAxMDAwKSkKKwkJbWRlbGF5KDEpOworCisJLyogUmVzdG9yZSB0aGUgZXhjZXB0aW9uIHZlY3RvciAqLworCSp2ZWN0b3IgPSBzYXZlX3ZlY3RvcjsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpIHZlY3RvciwgKHVuc2lnbmVkIGxvbmcpIHZlY3RvciArIDQpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcHJfZGVidWcoIndhaXQgQ1BVICMlZCBmb3IgJWQgbXNlY3MuXG4iLCBuciwgbik7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0CitzbXBfODZ4eF9zZXR1cF9jcHUoaW50IGNwdV9ucikKK3sKKwltcGljX3NldHVwX3RoaXNfY3B1KCk7Cit9CisKKworc3RydWN0IHNtcF9vcHNfdCBzbXBfODZ4eF9vcHMgPSB7CisJLm1lc3NhZ2VfcGFzcyA9IHNtcF9tcGljX21lc3NhZ2VfcGFzcywKKwkucHJvYmUgPSBzbXBfbXBpY19wcm9iZSwKKwkua2lja19jcHUgPSBzbXBfODZ4eF9raWNrX2NwdSwKKwkuc2V0dXBfY3B1ID0gc21wXzg2eHhfc2V0dXBfY3B1LAorCS50YWtlX3RpbWViYXNlID0gc21wX2dlbmVyaWNfdGFrZV90aW1lYmFzZSwKKwkuZ2l2ZV90aW1lYmFzZSA9IHNtcF9nZW5lcmljX2dpdmVfdGltZWJhc2UsCit9OworCisKK3ZvaWQgX19pbml0CittcGM4Nnh4X3NtcF9pbml0KHZvaWQpCit7CisJc21wX29wcyA9ICZzbXBfODZ4eF9vcHM7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4MGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9wY2kuYwpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIE1QQzg2WFggcGNpIHNldHVwIGNvZGUKKyAqCisgKiBSZWNvZGU6IFpIQU5HIFdFSSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisgKiBJbml0aWFsIGF1dGhvcjogWGlhbmdodWEgWGlhbyA8eC54aWFvQGZyZWVzY2FsZS5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9pbW1hcF84Nnh4Lmg+CisjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgorCisjaW5jbHVkZSAibXBjODZ4eC5oIgorCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERCRyhmbXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBEQkcoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKK3N0cnVjdCBwY2llX291dGJvdW5kX3dpbmRvd19yZWdzIHsKKwl1aW50ICAgIHBleG90YXI7ICAgICAgICAgICAgICAgLyogMHguMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwl1aW50ICAgIHBleG90ZWFyOyAgICAgICAgICAgICAgLyogMHguNCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwl1aW50ICAgIHBleG93YmFyOyAgICAgICAgICAgICAgLyogMHguOCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczFbNF07CisJdWludCAgICBwZXhvd2FyOyAgICAgICAgICAgICAgIC8qIDB4LjEwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczJbMTJdOworfTsKKworc3RydWN0IHBjaWVfaW5ib3VuZF93aW5kb3dfcmVncyB7CisJdWludCAgICBwZXhpdGFyOyAgICAgICAgICAgICAgIC8qIDB4LjAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczFbNF07CisJdWludCAgICBwZXhpd2JhcjsgICAgICAgICAgICAgIC8qIDB4LjggLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKwl1aW50ICAgIHBleGl3YmVhcjsgICAgICAgICAgICAgLyogMHguYyAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAqLworCXVpbnQgICAgcGV4aXdhcjsgICAgICAgICAgICAgICAvKiAweC4xMCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczJbMTJdOworfTsKKworc3RhdGljIHZvaWQgX19pbml0IHNldHVwX3BjaWVfYXRtdShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsIHN0cnVjdCByZXNvdXJjZSAqcnNyYykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgY2Nzcl9wZXggKnBjaWU7CisJdm9sYXRpbGUgc3RydWN0IHBjaWVfb3V0Ym91bmRfd2luZG93X3JlZ3MgKnBjaWVvdzsKKwl2b2xhdGlsZSBzdHJ1Y3QgcGNpZV9pbmJvdW5kX3dpbmRvd19yZWdzICpwY2llaXc7CisJaW50IGkgPSAwOworCisJREJHKCJQQ0lFIG1lbW9yeSBtYXAgc3RhcnQgMHgleCwgc2l6ZSAweCV4XG4iLCByc3JjLT5zdGFydCwKKwkJCXJzcmMtPmVuZCAtIHJzcmMtPnN0YXJ0ICsgMSk7CisJcGNpZSA9IGlvcmVtYXAocnNyYy0+c3RhcnQsIHJzcmMtPmVuZCAtIHJzcmMtPnN0YXJ0ICsgMSk7CisKKwkvKiBEaXNhYmxlIGFsbCB3aW5kb3dzIChleGNlcHQgcGV4b3dhcjAgc2luY2UgaXRzIGlnbm9yZWQpICovCisJcGNpZS0+cGV4b3dhcjEgPSAwOworCXBjaWUtPnBleG93YXIyID0gMDsKKyAJcGNpZS0+cGV4b3dhcjMgPSAwOworIAlwY2llLT5wZXhvd2FyNCA9IDA7CisgCXBjaWUtPnBleGl3YXIxID0gMDsKKyAJcGNpZS0+cGV4aXdhcjIgPSAwOworIAlwY2llLT5wZXhpd2FyMyA9IDA7CisKKyAJcGNpZW93ID0gKHN0cnVjdCBwY2llX291dGJvdW5kX3dpbmRvd19yZWdzICopJnBjaWUtPnBleG90YXIxOworIAlwY2llaXcgPSAoc3RydWN0IHBjaWVfaW5ib3VuZF93aW5kb3dfcmVncyAqKSZwY2llLT5wZXhpdGFyMTsKKworIAkvKiBTZXR1cCBvdXRib3VuZCBNRU0gd2luZG93ICovCisgCWZvcihpID0gMDsgaSA8IDM7IGkrKykKKyAJCWlmIChob3NlLT5tZW1fcmVzb3VyY2VzW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9NRU0peworIAkJCURCRygiUENJRSBNRU0gcmVzb3VyY2Ugc3RhcnQgMHglMDh4LCBzaXplIDB4JTA4eC5cbiIsCisgCQkJCWhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQsCisgCQkJCWhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uZW5kCisgCQkJCSAgLSBob3NlLT5tZW1fcmVzb3VyY2VzW2ldLnN0YXJ0ICsgMSk7CisgCQkJcGNpZW93LT5wZXhvdGFyID0gKGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQpID4+IDEyCisgCQkJCSYgMHgwMDBmZmZmZjsKKyAJCQlwY2llb3ctPnBleG90ZWFyID0gMDsKKyAJCQlwY2llb3ctPnBleG93YmFyID0gKGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQpID4+IDEyCisgCQkJCSYgMHgwMDBmZmZmZjsKKyAJCQkvKiBFbmFibGUsIE1lbSBSL1cgKi8KKyAJCQlwY2llb3ctPnBleG93YXIgPSAweDgwMDQ0MDAwIHwKKyAJCQkJKF9faWxvZzIoaG9zZS0+bWVtX3Jlc291cmNlc1tpXS5lbmQKKyAJCQkJCSAtIGhvc2UtPm1lbV9yZXNvdXJjZXNbaV0uc3RhcnQgKyAxKQorIAkJCQkgLSAxKTsKKyAJCQlwY2llb3crKzsKKyAJCX0KKworIAkvKiBTZXR1cCBvdXRib3VuZCBJTyB3aW5kb3cgKi8KKyAJaWYgKGhvc2UtPmlvX3Jlc291cmNlLmZsYWdzICYgSU9SRVNPVVJDRV9JTyl7CisgCQlEQkcoIlBDSUUgSU8gcmVzb3VyY2Ugc3RhcnQgMHglMDh4LCBzaXplIDB4JTA4eCwgcGh5IGJhc2UgMHglMDh4LlxuIiwKKyAJCQlob3NlLT5pb19yZXNvdXJjZS5zdGFydCwKKyAJCQlob3NlLT5pb19yZXNvdXJjZS5lbmQgLSBob3NlLT5pb19yZXNvdXJjZS5zdGFydCArIDEsCisgCQkJaG9zZS0+aW9fYmFzZV9waHlzKTsKKyAJCXBjaWVvdy0+cGV4b3RhciA9IChob3NlLT5pb19yZXNvdXJjZS5zdGFydCkgPj4gMTIgJiAweDAwMGZmZmZmOworIAkJcGNpZW93LT5wZXhvdGVhciA9IDA7CisgCQlwY2llb3ctPnBleG93YmFyID0gKGhvc2UtPmlvX2Jhc2VfcGh5cykgPj4gMTIgJiAweDAwMGZmZmZmOworIAkJLyogRW5hYmxlLCBJTyBSL1cgKi8KKyAJCXBjaWVvdy0+cGV4b3dhciA9IDB4ODAwODgwMDAgfCAoX19pbG9nMihob3NlLT5pb19yZXNvdXJjZS5lbmQKKyAJCQkJCS0gaG9zZS0+aW9fcmVzb3VyY2Uuc3RhcnQgKyAxKSAtIDEpOworIAl9CisKKyAJLyogU2V0dXAgMkcgaW5ib3VuZCBNZW1vcnkgV2luZG93IEAgMCAqLworIAlwY2llaXctPnBleGl0YXIgPSAweDAwMDAwMDAwOworIAlwY2llaXctPnBleGl3YmFyID0gMHgwMDAwMDAwMDsKKyAJLyogRW5hYmxlLCBQcmVmZXRjaCwgTG9jYWwgTWVtLCBTbm9vcCBSL1csIDJHICovCisgCXBjaWVpdy0+cGV4aXdhciA9IDB4YTBmNTUwMWU7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorbXBjODZ4eF9zZXR1cF9wY2llKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTMyIHBjaWVfb2Zmc2V0LCB1MzIgcGNpZV9zaXplKQoreworCXZvbGF0aWxlIHN0cnVjdCBjY3NyX3BleCAqcGNpZTsKKwl1MTYgY21kOworCXVuc2lnbmVkIGludCB0ZW1wczsKKworCURCRygiUENJRSBob3N0IGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0IDB4JTA4eCwgc2l6ZSAweCUwOHguXG4iLAorCQkJcGNpZV9vZmZzZXQsIHBjaWVfc2l6ZSk7CisKKwlwY2llID0gaW9yZW1hcChwY2llX29mZnNldCwgcGNpZV9zaXplKTsKKworCWVhcmx5X3JlYWRfY29uZmlnX3dvcmQoaG9zZSwgMCwgMCwgUENJX0NPTU1BTkQsICZjbWQpOworCWNtZCB8PSBQQ0lfQ09NTUFORF9TRVJSIHwgUENJX0NPTU1BTkRfTUFTVEVSIHwgUENJX0NPTU1BTkRfTUVNT1JZCisJICAgIHwgUENJX0NPTU1BTkRfSU87CisJZWFybHlfd3JpdGVfY29uZmlnX3dvcmQoaG9zZSwgMCwgMCwgUENJX0NPTU1BTkQsIGNtZCk7CisKKwllYXJseV93cml0ZV9jb25maWdfYnl0ZShob3NlLCAwLCAwLCBQQ0lfTEFURU5DWV9USU1FUiwgMHg4MCk7CisKKwkvKiBQQ0lFIEJ1cywgRml4IHRoZSBNUEM4NjQxRCBob3N0IGJyaWRnZSdzIGxvY2F0aW9uIHRvIGJ1cyAweEZGLiAqLworCWVhcmx5X3JlYWRfY29uZmlnX2R3b3JkKGhvc2UsIDAsIDAsIFBDSV9QUklNQVJZX0JVUywgJnRlbXBzKTsKKwl0ZW1wcyA9ICh0ZW1wcyAmIDB4ZmYwMDAwMDApIHwgKDB4ZmYpIHwgKDB4MCA8PCA4KSB8ICgweGZlIDw8IDE2KTsKKwllYXJseV93cml0ZV9jb25maWdfZHdvcmQoaG9zZSwgMCwgMCwgUENJX1BSSU1BUllfQlVTLCB0ZW1wcyk7Cit9CisKK2ludCBfX2luaXQgYWRkX2JyaWRnZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcnNyYzsKKwlpbnQgKmJ1c19yYW5nZTsKKwlpbnQgaGFzX2FkZHJlc3MgPSAwOworCWludCBwcmltYXJ5ID0gMDsKKworCURCRygiQWRkaW5nIFBDSUUgaG9zdCBicmlkZ2UgJXNcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCS8qIEZldGNoIGhvc3QgYnJpZGdlIHJlZ2lzdGVycyBhZGRyZXNzICovCisJaGFzX2FkZHJlc3MgPSAob2ZfYWRkcmVzc190b19yZXNvdXJjZShkZXYsIDAsICZyc3JjKSA9PSAwKTsKKworCS8qIEdldCBidXMgcmFuZ2UgaWYgYW55ICovCisJYnVzX3JhbmdlID0gKGludCAqKSBnZXRfcHJvcGVydHkoZGV2LCAiYnVzLXJhbmdlIiwgJmxlbik7CisJaWYgKGJ1c19yYW5nZSA9PSBOVUxMIHx8IGxlbiA8IDIgKiBzaXplb2YoaW50KSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgZ2V0IGJ1cy1yYW5nZSBmb3IgJXMsIGFzc3VtZSIKKwkJICAgICAgICIgYnVzIDBcbiIsIGRldi0+ZnVsbF9uYW1lKTsKKworCWhvc2UgPSBwY2liaW9zX2FsbG9jX2NvbnRyb2xsZXIoKTsKKwlpZiAoIWhvc2UpCisJCXJldHVybiAtRU5PTUVNOworCWhvc2UtPmFyY2hfZGF0YSA9IGRldjsKKwlob3NlLT5zZXRfY2ZnX3R5cGUgPSAxOworCisJLyogbGFzdF9idXNubyA9IDB4ZmUgY2F1c2UgYnkgTVBDODY0MSBQQ0lFIGJ1ZyAqLworCWhvc2UtPmZpcnN0X2J1c25vID0gYnVzX3JhbmdlID8gYnVzX3JhbmdlWzBdIDogMHgwOworCWhvc2UtPmxhc3RfYnVzbm8gPSBidXNfcmFuZ2UgPyBidXNfcmFuZ2VbMV0gOiAweGZlOworCisJc2V0dXBfaW5kaXJlY3RfcGNpZShob3NlLCByc3JjLnN0YXJ0LCByc3JjLnN0YXJ0ICsgMHg0KTsKKworCS8qIFNldHVwIHRoZSBQQ0lFIGhvc3QgY29udHJvbGxlci4gKi8KKwltcGM4Nnh4X3NldHVwX3BjaWUoaG9zZSwgcnNyYy5zdGFydCwgcnNyYy5lbmQgLSByc3JjLnN0YXJ0ICsgMSk7CisKKwlpZiAoKHJzcmMuc3RhcnQgJiAweGZmZmZmKSA9PSAweDgwMDApCisJCXByaW1hcnkgPSAxOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTVBDODZ4eCBQQ0lFIGhvc3QgYnJpZGdlIGF0IDB4JTA4bHguICIKKwkgICAgICAgIkZpcm13YXJlIGJ1cyBudW1iZXI6ICVkLT4lZFxuIiwKKwkJcnNyYy5zdGFydCwgaG9zZS0+Zmlyc3RfYnVzbm8sIGhvc2UtPmxhc3RfYnVzbm8pOworCisJREJHKCIgLT5Ib3NlIGF0IDB4JXAsIGNmZ19hZGRyPTB4JXAsY2ZnX2RhdGE9MHglcFxuIiwKKwkJaG9zZSwgaG9zZS0+Y2ZnX2FkZHIsIGhvc2UtPmNmZ19kYXRhKTsKKworCS8qIEludGVycHJldCB0aGUgInJhbmdlcyIgcHJvcGVydHkgKi8KKwkvKiBUaGlzIGFsc28gbWFwcyB0aGUgSS9PIHJlZ2lvbiBhbmQgc2V0cyBpc2FfaW8vbWVtX2Jhc2UgKi8KKwlwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKGhvc2UsIGRldiwgcHJpbWFyeSk7CisKKwkvKiBTZXR1cCBQRVggd2luZG93IHJlZ2lzdGVycyAqLworCXNldHVwX3BjaWVfYXRtdShob3NlLCAmcnNyYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX2FsaTE1NzUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBzaG9ydCB0ZW1wOworCisJLyoKKwkgKiBBTEkxNTc1IGludGVycnVwdHMgcm91dGUgdGFibGUgc2V0dXA6CisJICoKKwkgKiBJUlEgcGluICAgSVJRIworCSAqIFBJUlFBIC0tLS0gMworCSAqIFBJUlFCIC0tLS0gNAorCSAqIFBJUlFDIC0tLS0gNQorCSAqIFBJUlFEIC0tLS0gNgorCSAqIFBJUlFFIC0tLS0gOQorCSAqIFBJUlFGIC0tLS0gMTAKKwkgKiBQSVJRRyAtLS0tIDExCisJICogUElSUUggLS0tLSAxMgorCSAqCisJICogaW50ZXJydXB0cyBmb3IgUENJIHNsb3QwIC0tIFBJUlFBIC8gUElSUUIgLyBQSVJRQyAvIFBJUlFECisJICogICAgICAgICAgICAgICAgUENJIHNsb3QxIC0tIFBJUlFCIC8gUElSUUMgLyBQSVJRRCAvIFBJUlFBCisJICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIDB4NDgsIDB4YjkzMTc1NDIpOworCisJLyogVVNCIDEuMSBPSENJIGNvbnRyb2xsZXIgMSwgaW50ZXJydXB0OiBQSVJRRSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODYsIDB4MGMpOworCisJLyogVVNCIDEuMSBPSENJIGNvbnRyb2xsZXIgMiwgaW50ZXJydXB0OiBQSVJRRiAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODcsIDB4MGQpOworCisJLyogVVNCIDEuMSBPSENJIGNvbnRyb2xsZXIgMywgaW50ZXJydXB0OiBQSVJRSCAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODgsIDB4MGYpOworCisJLyogVVNCIDIuMCBjb250cm9sbGVyLCBpbnRlcnJ1cHQ6IFBJUlE3ICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg3NCwgMHgwNik7CisKKwkvKiBBdWRpbyBjb250cm9sbGVyLCBpbnRlcnJ1cHQ6IFBJUlFFICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4YSwgMHgwYyk7CisKKwkvKiBNb2RlbSBjb250cm9sbGVyLCBpbnRlcnJ1cHQ6IFBJUlFGICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4YiwgMHgwZCk7CisKKwkvKiBIRCBhdWRpbyBjb250cm9sbGVyLCBpbnRlcnJ1cHQ6IFBJUlFHICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4YywgMHgwZSk7CisKKwkvKiBTZXJpYWwgQVRBIGludGVycnVwdDogUElSUUQgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDhkLCAweDBiKTsKKworCS8qIFNNQiBpbnRlcnJ1cHQ6IFBJUlFIICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4ZSwgMHgwZik7CisKKwkvKiBQTVUgQUNQSSBTQ0kgaW50ZXJydXB0OiBQSVJRSCAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4OGYsIDB4MGYpOworCisJLyogUHJpbWFyeSBQQVRBIElERSBJUlE6IDE0CisJICogU2Vjb25kYXJ5IFBBVEEgSURFIElSUTogMTUKKwkgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDQ0LCAweDNkKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDc1LCAweDBmKTsKKworCS8qIFNldCBJUlExNCBhbmQgSVJRMTUgdG8gbGVnYWN5IElSUXMgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NDYsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4YzAwMDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDQ2LCB0ZW1wKTsKKworCS8qIFNldCBpODI1OSBpbnRlcnJ1cHQgdHJpZ2dlcgorCSAqIElSUSAzOiAgTGV2ZWwKKwkgKiBJUlEgNDogIExldmVsCisJICogSVJRIDU6ICBMZXZlbAorCSAqIElSUSA2OiAgTGV2ZWwKKwkgKiBJUlEgNzogIExldmVsCisJICogSVJRIDk6ICBMZXZlbAorCSAqIElSUSAxMDogTGV2ZWwKKwkgKiBJUlEgMTE6IExldmVsCisJICogSVJRIDEyOiBMZXZlbAorCSAqIElSUSAxNDogRWRnZQorCSAqIElSUSAxNTogRWRnZQorCSAqLworCW91dGIoMHhmYSwgMHg0ZDApOworCW91dGIoMHgxZSwgMHg0ZDEpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdWxpNTI4OChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGNoYXIgYzsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwweDgzLCZjKTsKKwljIHw9IDB4ODA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4MywgYyk7CisKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDA5LCAweDAxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDBhLCAweDA2KTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwweDgzLCZjKTsKKwljICY9IDB4N2Y7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg4MywgYyk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsMHg4NCwmYyk7CisJYyB8PSAweDAxOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIDB4ODQsIGMpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfdWxpNTIyOShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHgwNCwgMHgwNDA1KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIDB4NGEsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4MTAwMDsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCAweDRhLCB0ZW1wKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IGVhcmx5X3VsaTUyNDkoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwl1bnNpZ25lZCBjaGFyIHRlbXA7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgMHgwNCwgMHgwMDA3KTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIDB4N2MsICZ0ZW1wKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDdjLCAweDgwKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDA5LCAweDAxKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweDdjLCB0ZW1wKTsKKwlkZXYtPmNsYXNzIHw9IDB4MTsKK30KKworREVDTEFSRV9QQ0lfRklYVVBfSEVBREVSKFBDSV9WRU5ET1JfSURfQUwsIDB4MTU3NSwgcXVpcmtfYWxpMTU3NSk7CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9BTCwgMHg1Mjg4LCBxdWlya191bGk1Mjg4KTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0hFQURFUihQQ0lfVkVORE9SX0lEX0FMLCAweDUyMjksIHF1aXJrX3VsaTUyMjkpOworREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9BTCwgMHg1MjQ5LCBlYXJseV91bGk1MjQ5KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL01ha2VmaWxlCmluZGV4IGM0ZjZiMGQuLjI5Mjg2MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9NYWtlZmlsZQpAQCAtOSw2ICs5LDcgQEAKIG9iai0kKENPTkZJR180eHgpCQkrPSA0eHgvCiBvYmotJChDT05GSUdfUFBDXzgzeHgpCQkrPSA4M3h4Lwogb2JqLSQoQ09ORklHX1BQQ184NXh4KQkJKz0gODV4eC8KK29iai0kKENPTkZJR19QUENfODZ4eCkJCSs9IDg2eHgvCiBvYmotJChDT05GSUdfUFBDX1BTRVJJRVMpCSs9IHBzZXJpZXMvCiBvYmotJChDT05GSUdfUFBDX0lTRVJJRVMpCSs9IGlzZXJpZXMvCiBvYmotJChDT05GSUdfUFBDX01BUExFKQkJKz0gbWFwbGUvCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCmluZGV4IDZhMDJkNTEuLjM1MmJiYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9LY29uZmlnCkBAIC01LDE1ICs1LDI0IEBACiAJdHJpc3RhdGUgIlNQVSBmaWxlIHN5c3RlbSIKIAlkZWZhdWx0IG0KIAlkZXBlbmRzIG9uIFBQQ19DRUxMCisJc2VsZWN0IFNQVV9CQVNFCiAJaGVscAogCSAgVGhlIFNQVSBmaWxlIHN5c3RlbSBpcyB1c2VkIHRvIGFjY2VzcyBTeW5lcmdpc3RpYyBQcm9jZXNzaW5nCiAJICBVbml0cyBvbiBtYWNoaW5lcyBpbXBsZW1lbnRpbmcgdGhlIEJyb2FkYmFuZCBQcm9jZXNzb3IKIAkgIEFyY2hpdGVjdHVyZS4KIAorY29uZmlnIFNQVV9CQVNFCisJYm9vbAorCWRlZmF1bHQgbgorCiBjb25maWcgU1BVRlNfTU1BUAogCWJvb2wKIAlkZXBlbmRzIG9uIFNQVV9GUyAmJiBTUEFSU0VNRU0KIAlzZWxlY3QgTUVNT1JZX0hPVFBMVUcKIAlkZWZhdWx0IHkKIAorY29uZmlnIENCRV9SQVMKKwlib29sICJSQVMgZmVhdHVyZXMgZm9yIGJhcmUgbWV0YWwgQ2VsbCBCRSIKKwlkZWZhdWx0IHkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL01ha2VmaWxlCmluZGV4IGU1NzBiYWQuLmM4OWNkZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvTWFrZWZpbGUKQEAgLTEsMTYgKzEsMTUgQEAKLW9iai15CQkJKz0gaW50ZXJydXB0Lm8gaW9tbXUubyBzZXR1cC5vIHNwaWRlci1waWMubwotb2JqLXkJCQkrPSBwZXJ2YXNpdmUubworb2JqLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkJCSs9IGludGVycnVwdC5vIGlvbW11Lm8gc2V0dXAubyBcCisJCQkJCSAgIGNiZV9yZWdzLm8gc3BpZGVyLXBpYy5vIHBlcnZhc2l2ZS5vCitvYmotJChDT05GSUdfQ0JFX1JBUykJCQkrPSByYXMubwogCi1vYmotJChDT05GSUdfU01QKQkrPSBzbXAubwotb2JqLSQoQ09ORklHX1NQVV9GUykJKz0gc3B1LWJhc2UubyBzcHVmcy8KLQotc3B1LWJhc2UteQkJKz0gc3B1X2Jhc2UubyBzcHVfcHJpdjEubworaWZlcSAoJChDT05GSUdfU01QKSx5KQorb2JqLSQoQ09ORklHX1BQQ19DRUxMX05BVElWRSkJCSs9IHNtcC5vCitlbmRpZgogCiAjIG5lZWRlZCBvbmx5IHdoZW4gYnVpbGRpbmcgbG9hZGFibGUgc3B1ZnMua28KLXNwdWZzLW1vZHVsYXItJChDT05GSUdfU1BVX0ZTKSArPSBzcHVfc3lzY2FsbHMubwotb2JqLXkJCQkrPSAkKHNwdWZzLW1vZHVsYXItbSkKK3NwdWZzLW1vZHVsYXItJChDT05GSUdfU1BVX0ZTKQkJKz0gc3B1X3N5c2NhbGxzLm8KK3NwdS1wcml2MS0kKENPTkZJR19QUENfQ0VMTF9OQVRJVkUpCSs9IHNwdV9wcml2MV9tbWlvLm8KIAotIyBhbHdheXMgbmVlZGVkIGluIGtlcm5lbAotc3B1ZnMtYnVpbHRpbi0kKENPTkZJR19TUFVfRlMpICs9IHNwdV9jYWxsYmFja3Mubwotb2JqLXkJCQkrPSAkKHNwdWZzLWJ1aWx0aW4teSkgJChzcHVmcy1idWlsdGluLW0pCi0KK29iai0kKENPTkZJR19TUFVfQkFTRSkJCQkrPSBzcHVfY2FsbGJhY2tzLm8gc3B1X2Jhc2UubyBcCisJCQkJCSAgICQoc3B1ZnMtbW9kdWxhci1tKSBcCisJCQkJCSAgICQoc3B1LXByaXYxLXkpIHNwdWZzLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTY5NmMxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2NiZV9yZWdzLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBjYmVfcmVncy5jCisgKgorICogQWNjZXNzb3Igcm91dGluZXMgZm9yIHRoZSB2YXJpb3VzIE1NSU8gcmVnaXN0ZXIgYmxvY2tzIG9mIHRoZSBDQkUKKyAqCisgKiAoYykgMjAwNiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+LCBJQk0gQ29ycC4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworI2luY2x1ZGUgImNiZV9yZWdzLmgiCisKKyNkZWZpbmUgTUFYX0NCRQkJMgorCisvKgorICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiB1c2VzICJjcHUiIG5vZGVzLiBXZSBidWlsZCBvdXIgb3duIG1hcHBpbmcKKyAqIGFycmF5IG9mIGNwdSBudW1iZXJzIHRvIGNwdSBub2RlcyBsb2NhbGx5IGZvciBub3cgdG8gYWxsb3cgaW50ZXJydXB0CisgKiB0aW1lIGNvZGUgdG8gaGF2ZSBhIGZhc3QgcGF0aCByYXRoZXIgdGhhbiBjYWxsIG9mX2dldF9jcHVfbm9kZSgpLiBJZgorICogd2UgaW1wbGVtZW50IGNwdSBob3RwbHVnLCB3ZSdsbCBoYXZlIHRvIGluc3RhbGwgYW4gYXBwcm9wcmlhdGUgbm9yaWZpZXIKKyAqIGluIG9yZGVyIHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgY3B1IGdvaW5nIGF3YXkKKyAqLworc3RhdGljIHN0cnVjdCBjYmVfcmVnc19tYXAKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlOworCXN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqcG1kX3JlZ3M7CisJc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICppaWNfcmVnczsKK30gY2JlX3JlZ3NfbWFwc1tNQVhfQ0JFXTsKK3N0YXRpYyBpbnQgY2JlX3JlZ3NfbWFwX2NvdW50OworCitzdGF0aWMgc3RydWN0IGNiZV90aHJlYWRfbWFwCit7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHVfbm9kZTsKKwlzdHJ1Y3QgY2JlX3JlZ3NfbWFwICpyZWdzOworfSBjYmVfdGhyZWFkX21hcFtOUl9DUFVTXTsKKworc3RhdGljIHN0cnVjdCBjYmVfcmVnc19tYXAgKmNiZV9maW5kX21hcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNiZV9yZWdzX21hcF9jb3VudDsgaSsrKQorCQlpZiAoY2JlX3JlZ3NfbWFwc1tpXS5jcHVfbm9kZSA9PSBucCkKKwkJCXJldHVybiAmY2JlX3JlZ3NfbWFwc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGNiZV9wbWRfcmVncyBfX2lvbWVtICpjYmVfZ2V0X3BtZF9yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX2ZpbmRfbWFwKG5wKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXAtPnBtZF9yZWdzOworfQorCitzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X3BtZF9yZWdzKGludCBjcHUpCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX3RocmVhZF9tYXBbY3B1XS5yZWdzOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1hcC0+cG1kX3JlZ3M7Cit9CisKKworc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2lpY19yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGNiZV9yZWdzX21hcCAqbWFwID0gY2JlX2ZpbmRfbWFwKG5wKTsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXAtPmlpY19yZWdzOworfQorc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2NwdV9paWNfcmVncyhpbnQgY3B1KQoreworCXN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCA9IGNiZV90aHJlYWRfbWFwW2NwdV0ucmVnczsKKwlpZiAobWFwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXAtPmlpY19yZWdzOworfQorCit2b2lkIF9faW5pdCBjYmVfcmVnc19pbml0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGRldmljZV9ub2RlICpjcHU7CisKKwkvKiBCdWlsZCBsb2NhbCBmYXN0IG1hcCBvZiBDUFVzICovCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCWNiZV90aHJlYWRfbWFwW2ldLmNwdV9ub2RlID0gb2ZfZ2V0X2NwdV9ub2RlKGksIE5VTEwpOworCisJLyogRmluZCBtYXBzIGZvciBlYWNoIGRldmljZSB0cmVlIENQVSAqLworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShjcHUsICJjcHUiKSB7CisJCXN0cnVjdCBjYmVfcmVnc19tYXAgKm1hcCA9ICZjYmVfcmVnc19tYXBzW2NiZV9yZWdzX21hcF9jb3VudCsrXTsKKworCQkvKiBUaGF0IGhhY2sgbXVzdCBkaWUgZGllIGRpZSAhICovCisJCXN0cnVjdCBhZGRyZXNzX3Byb3AgeworCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzOworCQkJdW5zaWduZWQgaW50IGxlbjsKKwkJfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSAqcHJvcDsKKworCisJCWlmIChjYmVfcmVnc19tYXBfY291bnQgPiBNQVhfQ0JFKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImNiZV9yZWdzOiBNb3JlIEJFIGNoaXBzIHRoYW4gc3VwcG9ydGVkIgorCQkJICAgICAgICIhXG4iKTsKKwkJCWNiZV9yZWdzX21hcF9jb3VudC0tOworCQkJcmV0dXJuOworCQl9CisJCW1hcC0+Y3B1X25vZGUgPSBjcHU7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJaWYgKGNiZV90aHJlYWRfbWFwW2ldLmNwdV9ub2RlID09IGNwdSkKKwkJCQljYmVfdGhyZWFkX21hcFtpXS5yZWdzID0gbWFwOworCisJCXByb3AgPSAoc3RydWN0IGFkZHJlc3NfcHJvcCAqKWdldF9wcm9wZXJ0eShjcHUsICJwZXJ2YXNpdmUiLAorCQkJCQkJCSAgIE5VTEwpOworCQlpZiAocHJvcCAhPSBOVUxMKQorCQkJbWFwLT5wbWRfcmVncyA9IGlvcmVtYXAocHJvcC0+YWRkcmVzcywgcHJvcC0+bGVuKTsKKworCQlwcm9wID0gKHN0cnVjdCBhZGRyZXNzX3Byb3AgKilnZXRfcHJvcGVydHkoY3B1LCAiaWljIiwKKwkJCQkJCQkgICBOVUxMKTsKKwkJaWYgKHByb3AgIT0gTlVMTCkKKwkJCW1hcC0+aWljX3JlZ3MgPSBpb3JlbWFwKHByb3AtPmFkZHJlc3MsIHByb3AtPmxlbik7CisJfQorfQorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9jYmVfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmU0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvY2JlX3JlZ3MuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIGNiZV9yZWdzLmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gaG9sZCB0aGUgdmFyaW91cyByZWdpc3RlciBkZWZpbml0aW9ucyBmb3IgQ0JFCisgKiBvbi1jaGlwIHN5c3RlbSBkZXZpY2VzIChtZW1vcnkgY29udHJvbGxlciwgSU8gY29udHJvbGxlciwgZXRjLi4uKQorICoKKyAqIChjKSAyMDA2IEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4sIElCTSBDb3JwLgorICovCisKKyNpZm5kZWYgQ0JFX1JFR1NfSAorI2RlZmluZSBDQkVfUkVHU19ICisKKy8qCisgKgorICogU29tZSBISUQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworLyogQ0JFIHNwZWNpZmljIEhJRDAgYml0cyAqLworI2RlZmluZSBISUQwX0NCRV9USEVSTV9XQUtFVVAJMHgwMDAwMDIwMDAwMDAwMDAwdWwKKyNkZWZpbmUgSElEMF9DQkVfU1lTRVJSX1dBS0VVUAkweDAwMDAwMDgwMDAwMDAwMDB1bAorI2RlZmluZSBISUQwX0NCRV9USEVSTV9JTlRfRU4JMHgwMDAwMDAwNDAwMDAwMDAwdWwKKyNkZWZpbmUgSElEMF9DQkVfU1lTRVJSX0lOVF9FTgkweDAwMDAwMDAyMDAwMDAwMDB1bAorCisKKy8qCisgKgorICogUGVydmFzaXZlIHVuaXQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKi8KKworc3RydWN0IGNiZV9wbWRfcmVncyB7CisJdTggcGFkXzB4MDAwMF8weDA4MDBbMHgwODAwIC0gMHgwMDAwXTsJCQkvKiAweDAwMDAgKi8KKworCS8qIFRoZXJtYWwgU2Vuc29yIFJlZ2lzdGVycyAqLworCXU2NCAgdHNfY3RzcjE7CQkJCQkJLyogMHgwODAwICovCisJdTY0ICB0c19jdHNyMjsJCQkJCQkvKiAweDA4MDggKi8KKwl1NjQgIHRzX210c3IxOwkJCQkJCS8qIDB4MDgxMCAqLworCXU2NCAgdHNfbXRzcjI7CQkJCQkJLyogMHgwODE4ICovCisJdTY0ICB0c19pdHIxOwkJCQkJCS8qIDB4MDgyMCAqLworCXU2NCAgdHNfaXRyMjsJCQkJCQkvKiAweDA4MjggKi8KKwl1NjQgIHRzX2dpdHI7CQkJCQkJLyogMHgwODMwICovCisJdTY0ICB0c19pc3I7CQkJCQkJLyogMHgwODM4ICovCisJdTY0ICB0c19pbXI7CQkJCQkJLyogMHgwODQwICovCisJdTY0ICB0bV9jcjE7CQkJCQkJLyogMHgwODQ4ICovCisJdTY0ICB0bV9jcjI7CQkJCQkJLyogMHgwODUwICovCisJdTY0ICB0bV9zaW1yOwkJCQkJCS8qIDB4MDg1OCAqLworCXU2NCAgdG1fdHByOwkJCQkJCS8qIDB4MDg2MCAqLworCXU2NCAgdG1fc3RyMTsJCQkJCQkvKiAweDA4NjggKi8KKwl1NjQgIHRtX3N0cjI7CQkJCQkJLyogMHgwODcwICovCisJdTY0ICB0bV90c3I7CQkJCQkJLyogMHgwODc4ICovCisKKwkvKiBQb3dlciBNYW5hZ2VtZW50ICovCisJdTY0ICBwbV9jb250cm9sOwkJCQkJLyogMHgwODgwICovCisjZGVmaW5lIENCRV9QTURfUEFVU0VfWkVST19DT05UUk9MCQkweDEwMDAwCisJdTY0ICBwbV9zdGF0dXM7CQkJCQkJLyogMHgwODg4ICovCisKKwkvKiBUaW1lIEJhc2UgUmVnaXN0ZXIgKi8KKwl1NjQgIHRicjsJCQkJCQkvKiAweDA4OTAgKi8KKworCXU4ICAgcGFkXzB4MDg5OF8weDBjMDAgWzB4MGMwMCAtIDB4MDg5OF07CQkvKiAweDA4OTggKi8KKworCS8qIEZhdWx0IElzb2xhdGlvbiBSZWdpc3RlcnMgKi8KKwl1NjQgIGNoZWNrc3RvcF9maXI7CQkJCQkvKiAweDBjMDAgKi8KKwl1NjQgIHJlY292ZXJhYmxlX2ZpcjsKKwl1NjQgIHNwZWNfYXR0X21jaGtfZmlyOworCXU2NCAgZmlyX21vZGVfcmVnOworCXU2NCAgZmlyX2VuYWJsZV9tYXNrOworCisJdTggICBwYWRfMHgwYzI4XzB4MTAwMCBbMHgxMDAwIC0gMHgwYzI4XTsJCS8qIDB4MGMyOCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBjYmVfcG1kX3JlZ3MgX19pb21lbSAqY2JlX2dldF9wbWRfcmVncyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKmNiZV9nZXRfY3B1X3BtZF9yZWdzKGludCBjcHUpOworCisvKgorICoKKyAqIElJQyB1bml0IHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICovCisKK3N0cnVjdCBjYmVfaWljX3BlbmRpbmdfYml0cyB7CisJdTMyIGRhdGE7CisJdTggZmxhZ3M7CisJdTggY2xhc3M7CisJdTggc291cmNlOworCXU4IHByaW87Cit9OworCisjZGVmaW5lIENCRV9JSUNfSVJRX1ZBTElECTB4ODAKKyNkZWZpbmUgQ0JFX0lJQ19JUlFfSVBJCQkweDQwCisKK3N0cnVjdCBjYmVfaWljX3RocmVhZF9yZWdzIHsKKwlzdHJ1Y3QgY2JlX2lpY19wZW5kaW5nX2JpdHMgcGVuZGluZzsKKwlzdHJ1Y3QgY2JlX2lpY19wZW5kaW5nX2JpdHMgcGVuZGluZ19kZXN0cjsKKwl1NjQgZ2VuZXJhdGU7CisJdTY0IHByaW87Cit9OworCitzdHJ1Y3QgY2JlX2lpY19yZWdzIHsKKwl1OAlwYWRfMHgwMDAwXzB4MDQwMFsweDA0MDAgLSAweDAwMDBdOwkJLyogMHgwMDAwICovCisKKwkvKiBJSUMgaW50ZXJydXB0IHJlZ2lzdGVycyAqLworCXN0cnVjdAljYmVfaWljX3RocmVhZF9yZWdzIHRocmVhZFsyXTsJCQkvKiAweDA0MDAgKi8KKwl1NjQgICAgIGlpY19pcjsJCQkJCQkvKiAweDA0NDAgKi8KKwl1NjQgICAgIGlpY19pczsJCQkJCQkvKiAweDA0NDggKi8KKworCXU4CXBhZF8weDA0NTBfMHgwNTAwWzB4MDUwMCAtIDB4MDQ1MF07CQkvKiAweDA0NTAgKi8KKworCS8qIElPQyBGSVIgKi8KKwl1NjQJaW9jX2Zpcl9yZXNldDsJCQkJCS8qIDB4MDUwMCAqLworCXU2NAlpb2NfZmlyX3NldDsKKwl1NjQJaW9jX2NoZWNrc3RvcF9lbmFibGU7CisJdTY0CWlvY19maXJfZXJyb3JfbWFzazsKKwl1NjQJaW9jX3N5c2Vycl9lbmFibGU7CisJdTY0CWlvY19maXI7CisKKwl1OAlwYWRfMHgwNTMwXzB4MTAwMFsweDEwMDAgLSAweDA1MzBdOwkJLyogMHgwNTMwICovCit9OworCitleHRlcm4gc3RydWN0IGNiZV9paWNfcmVncyBfX2lvbWVtICpjYmVfZ2V0X2lpY19yZWdzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOworZXh0ZXJuIHN0cnVjdCBjYmVfaWljX3JlZ3MgX19pb21lbSAqY2JlX2dldF9jcHVfaWljX3JlZ3MoaW50IGNwdSk7CisKKworLyogSW5pdCB0aGlzIG1vZHVsZSBlYXJseSAqLworZXh0ZXJuIHZvaWQgY2JlX3JlZ3NfaW5pdCh2b2lkKTsKKworCisjZW5kaWYgLyogQ0JFX1JFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2ludGVycnVwdC5jCmluZGV4IDk3OGJlMWMuLjFiYmY4MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW50ZXJydXB0LmMKQEAgLTMzLDI5ICszMywxMCBAQAogI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KIAogI2luY2x1ZGUgImludGVycnVwdC5oIgotCi1zdHJ1Y3QgaWljX3BlbmRpbmdfYml0cyB7Ci0JdTMyIGRhdGE7Ci0JdTggZmxhZ3M7Ci0JdTggY2xhc3M7Ci0JdTggc291cmNlOwotCXU4IHByaW87Ci19OwotCi1lbnVtIGlpY19wZW5kaW5nX2ZsYWdzIHsKLQlJSUNfVkFMSUQgPSAweDgwLAotCUlJQ19JUEkgICA9IDB4NDAsCi19OwotCi1zdHJ1Y3QgaWljX3JlZ3MgewotCXN0cnVjdCBpaWNfcGVuZGluZ19iaXRzIHBlbmRpbmc7Ci0Jc3RydWN0IGlpY19wZW5kaW5nX2JpdHMgcGVuZGluZ19kZXN0cjsKLQl1NjQgZ2VuZXJhdGU7Ci0JdTY0IHByaW87Ci19OworI2luY2x1ZGUgImNiZV9yZWdzLmgiCiAKIHN0cnVjdCBpaWMgewotCXN0cnVjdCBpaWNfcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBjYmVfaWljX3RocmVhZF9yZWdzIF9faW9tZW0gKnJlZ3M7CiAJdTggdGFyZ2V0X2lkOwogfTsKIApAQCAtMTE1LDcgKzk2LDcgQEAKIAkuZW5kID0gaWljX2VuZCwKIH07CiAKLXN0YXRpYyBpbnQgaWljX2V4dGVybmFsX2dldF9pcnEoc3RydWN0IGlpY19wZW5kaW5nX2JpdHMgcGVuZGluZykKK3N0YXRpYyBpbnQgaWljX2V4dGVybmFsX2dldF9pcnEoc3RydWN0IGNiZV9paWNfcGVuZGluZ19iaXRzIHBlbmRpbmcpCiB7CiAJaW50IGlycTsKIAl1bnNpZ25lZCBjaGFyIG5vZGUsIHVuaXQ7CkBAIC0xMzYsOCArMTE3LDcgQEAKIAkJICogT25lIG9mIHRoZXNlIHVuaXRzIGNhbiBiZSBjb25uZWN0ZWQKIAkJICogdG8gYW4gZXh0ZXJuYWwgaW50ZXJydXB0IGNvbnRyb2xsZXIuCiAJCSAqLwotCQlpZiAocGVuZGluZy5wcmlvID4gMHgzZiB8fAotCQkgICAgcGVuZGluZy5jbGFzcyAhPSAyKQorCQlpZiAocGVuZGluZy5jbGFzcyAhPSAyKQogCQkJYnJlYWs7CiAJCWlycSA9IElJQ19FWFRfT0ZGU0VUCiAJCQkrIHNwaWRlcl9nZXRfaXJxKG5vZGUpCkBAIC0xNjgsMTUgKzE0OCwxNSBAQAogewogCXN0cnVjdCBpaWMgKmlpYzsKIAlpbnQgaXJxOwotCXN0cnVjdCBpaWNfcGVuZGluZ19iaXRzIHBlbmRpbmc7CisJc3RydWN0IGNiZV9paWNfcGVuZGluZ19iaXRzIHBlbmRpbmc7CiAKIAlpaWMgPSAmX19nZXRfY3B1X3ZhcihpaWMpOwogCSoodW5zaWduZWQgbG9uZyAqKSAmcGVuZGluZyA9IAogCQlpbl9iZTY0KCh1bnNpZ25lZCBsb25nIF9faW9tZW0gKikgJmlpYy0+cmVncy0+cGVuZGluZ19kZXN0cik7CiAKIAlpcnEgPSAtMTsKLQlpZiAocGVuZGluZy5mbGFncyAmIElJQ19WQUxJRCkgewotCQlpZiAocGVuZGluZy5mbGFncyAmIElJQ19JUEkpIHsKKwlpZiAocGVuZGluZy5mbGFncyAmIENCRV9JSUNfSVJRX1ZBTElEKSB7CisJCWlmIChwZW5kaW5nLmZsYWdzICYgQ0JFX0lJQ19JUlFfSVBJKSB7CiAJCQlpcnEgPSBJSUNfSVBJX09GRlNFVCArIChwZW5kaW5nLnByaW8gPj4gNCk7CiAvKgogCQkJaWYgKGlycSA+IDB4ODApCkBAIC0yMDAsNyArMTgwLDcgQEAKIAl1bnNpZ25lZCBsb25nIHJlZ3M7CiAJc3RydWN0IGlpYyAqaWljOwogCi0JZm9yX2VhY2hfY3B1KGNwdSkgeworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKIAkJaWljID0gJnBlcl9jcHUoaWljLCBjcHUpOwogCQlub2RlaWQgPSBjcHUvMjsKIApAQCAtMjI2LDcgKzIwNiw3IEBACiAJCQlyZWdzICs9IDB4MjA7CiAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiSUlDIGZvciBDUFUgJWQgYXQgJWx4XG4iLCBjcHUsIHJlZ3MpOwotCQlpaWMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MsIHNpemVvZihzdHJ1Y3QgaWljX3JlZ3MpKTsKKwkJaWljLT5yZWdzID0gaW9yZW1hcChyZWdzLCBzaXplb2Yoc3RydWN0IGNiZV9paWNfdGhyZWFkX3JlZ3MpKTsKIAkJaWljLT50YXJnZXRfaWQgPSAobm9kZWlkIDw8IDQpICsgKChjcHUgJiAxKSA/IDB4ZiA6IDB4ZSk7CiAJfQogCkBAIC0yNjcsMTIgKzI0NywxMiBAQAogCQl9CiAKICAJCWlpYyA9ICZwZXJfY3B1KGlpYywgbnBbMF0pOwotIAkJaWljLT5yZWdzID0gaW9yZW1hcChyZWdzWzBdLCBzaXplb2Yoc3RydWN0IGlpY19yZWdzKSk7CisgCQlpaWMtPnJlZ3MgPSBpb3JlbWFwKHJlZ3NbMF0sIHNpemVvZihzdHJ1Y3QgY2JlX2lpY190aHJlYWRfcmVncykpOwogCQlpaWMtPnRhcmdldF9pZCA9ICgobnBbMF0gJiAyKSA8PCAzKSArICgobnBbMF0gJiAxKSA/IDB4ZiA6IDB4ZSk7CiAgCQlwcmludGsoIklJQyBmb3IgQ1BVICVkIGF0ICVseCBtYXBwZWQgdG8gJXBcbiIsIG5wWzBdLCByZWdzWzBdLCBpaWMtPnJlZ3MpOwogCiAgCQlpaWMgPSAmcGVyX2NwdShpaWMsIG5wWzFdKTsKLSAJCWlpYy0+cmVncyA9IGlvcmVtYXAocmVnc1syXSwgc2l6ZW9mKHN0cnVjdCBpaWNfcmVncykpOworIAkJaWljLT5yZWdzID0gaW9yZW1hcChyZWdzWzJdLCBzaXplb2Yoc3RydWN0IGNiZV9paWNfdGhyZWFkX3JlZ3MpKTsKIAkJaWljLT50YXJnZXRfaWQgPSAoKG5wWzFdICYgMikgPDwgMykgKyAoKG5wWzFdICYgMSkgPyAweGYgOiAweGUpOwogIAkJcHJpbnRrKCJJSUMgZm9yIENQVSAlZCBhdCAlbHggbWFwcGVkIHRvICVwXG4iLCBucFsxXSwgcmVnc1syXSwgaWljLT5yZWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwppbmRleCBhNDljZWI3Li5hMzUwMDRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtNDczLDYgKzQ3MywxNiBAQAogCXJldHVybiBtYXNrIDwgMHgxMDAwMDAwMDB1bGw7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZG1hX21hcHBpbmdfb3BzIGNlbGxfaW9tbXVfb3BzID0geworCS5hbGxvY19jb2hlcmVudCA9IGNlbGxfYWxsb2NfY29oZXJlbnQsCisJLmZyZWVfY29oZXJlbnQgPSBjZWxsX2ZyZWVfY29oZXJlbnQsCisJLm1hcF9zaW5nbGUgPSBjZWxsX21hcF9zaW5nbGUsCisJLnVubWFwX3NpbmdsZSA9IGNlbGxfdW5tYXBfc2luZ2xlLAorCS5tYXBfc2cgPSBjZWxsX21hcF9zZywKKwkudW5tYXBfc2cgPSBjZWxsX3VubWFwX3NnLAorCS5kbWFfc3VwcG9ydGVkID0gY2VsbF9kbWFfc3VwcG9ydGVkLAorfTsKKwogdm9pZCBjZWxsX2luaXRfaW9tbXUodm9pZCkKIHsKIAlpbnQgc2V0dXBfYnVzID0gMDsKQEAgLTQ5OCwxMSArNTA4LDUgQEAKIAkJfQogCX0KIAotCXBjaV9kbWFfb3BzLmFsbG9jX2NvaGVyZW50ID0gY2VsbF9hbGxvY19jb2hlcmVudDsKLQlwY2lfZG1hX29wcy5mcmVlX2NvaGVyZW50ID0gY2VsbF9mcmVlX2NvaGVyZW50OwotCXBjaV9kbWFfb3BzLm1hcF9zaW5nbGUgPSBjZWxsX21hcF9zaW5nbGU7Ci0JcGNpX2RtYV9vcHMudW5tYXBfc2luZ2xlID0gY2VsbF91bm1hcF9zaW5nbGU7Ci0JcGNpX2RtYV9vcHMubWFwX3NnID0gY2VsbF9tYXBfc2c7Ci0JcGNpX2RtYV9vcHMudW5tYXBfc2cgPSBjZWxsX3VubWFwX3NnOwotCXBjaV9kbWFfb3BzLmRtYV9zdXBwb3J0ZWQgPSBjZWxsX2RtYV9zdXBwb3J0ZWQ7CisJcGNpX2RtYV9vcHMgPSBjZWxsX2lvbW11X29wczsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuYwppbmRleCA3ZWVkOGM2Li42OTVhYzRlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5jCkBAIC0zNywzNiArMzcsMjggQEAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAKICNpbmNsdWRlICJwZXJ2YXNpdmUuaCIKKyNpbmNsdWRlICJjYmVfcmVncy5oIgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNiZV9wZXJ2YXNpdmVfbG9jayk7Ci1zdHJ1Y3QgY2JlX3BlcnZhc2l2ZSB7Ci0Jc3RydWN0IHBtZF9yZWdzIF9faW9tZW0gKnJlZ3M7Ci0JdW5zaWduZWQgaW50IHRocmVhZDsKLX07Ci0KLS8qIGNhbid0IHVzZSBwZXJfY3B1IGZyb20gc2V0dXBfYXJjaCAqLwotc3RhdGljIHN0cnVjdCBjYmVfcGVydmFzaXZlIGNiZV9wZXJ2YXNpdmVbTlJfQ1BVU107CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjYmVfZW5hYmxlX3BhdXNlX3plcm8odm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHRocmVhZF9zd2l0Y2hfY29udHJvbDsKIAl1bnNpZ25lZCBsb25nIHRlbXBfcmVnaXN0ZXI7Ci0Jc3RydWN0IGNiZV9wZXJ2YXNpdmUgKnA7Ci0JaW50IHRocmVhZDsKKwlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnByZWdzOwogCiAJc3Bpbl9sb2NrX2lycSgmY2JlX3BlcnZhc2l2ZV9sb2NrKTsKLQlwID0gJmNiZV9wZXJ2YXNpdmVbc21wX3Byb2Nlc3Nvcl9pZCgpXTsKLQotCWlmICghY2JlX3BlcnZhc2l2ZS0+cmVncykKKwlwcmVncyA9IGNiZV9nZXRfY3B1X3BtZF9yZWdzKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaWYgKHByZWdzID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCiAJcHJfZGVidWcoIlBvd2VyIE1hbmFnZW1lbnQ6IENQVSAlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAogCSAvKiBFbmFibGUgUGF1c2UoMCkgY29udHJvbCBiaXQgKi8KLQl0ZW1wX3JlZ2lzdGVyID0gaW5fYmU2NCgmcC0+cmVncy0+cG1fY29udHJvbCk7CisJdGVtcF9yZWdpc3RlciA9IGluX2JlNjQoJnByZWdzLT5wbV9jb250cm9sKTsKIAotCW91dF9iZTY0KCZwLT5yZWdzLT5wbV9jb250cm9sLAotCQkgdGVtcF9yZWdpc3RlcnxQTURfUEFVU0VfWkVST19DT05UUk9MKTsKKwlvdXRfYmU2NCgmcHJlZ3MtPnBtX2NvbnRyb2wsCisJCSB0ZW1wX3JlZ2lzdGVyIHwgQ0JFX1BNRF9QQVVTRV9aRVJPX0NPTlRST0wpOwogCiAJLyogRW5hYmxlIERFQyBhbmQgRUUgaW50ZXJydXB0IHJlcXVlc3QgKi8KIAl0aHJlYWRfc3dpdGNoX2NvbnRyb2wgID0gbWZzcHIoU1BSTl9UU0NfQ0VMTCk7CkBAIC03NSwyNSArNjcsMTYgQEAKIAlzd2l0Y2ggKChtZnNwcihTUFJOX0NUUkxGKSAmIENUUkxfQ1QpKSB7CiAJY2FzZSBDVFJMX0NUMDoKIAkJdGhyZWFkX3N3aXRjaF9jb250cm9sIHw9IFRTQ19DRUxMX0RFQ19FTkFCTEVfMDsKLQkJdGhyZWFkID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBDVFJMX0NUMToKIAkJdGhyZWFkX3N3aXRjaF9jb250cm9sIHw9IFRTQ19DRUxMX0RFQ19FTkFCTEVfMTsKLQkJdGhyZWFkID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHVua25vd24gY29uZmlndXJhdGlvblxuIiwKIAkJCV9fRlVOQ1RJT05fXyk7Ci0JCXRocmVhZCA9IC0xOwogCQlicmVhazsKIAl9CiAKLQlpZiAocC0+dGhyZWFkICE9IHRocmVhZCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRldmljZSB0cmVlIGluY29uc2lzdGFudCwgIgotCQkJCSAgICAgImNwdSAlaTogJWQvJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwKLQkJCQkgICAgIHAtPnRocmVhZCwgdGhyZWFkKTsKLQogCW10c3ByKFNQUk5fVFNDX0NFTEwsIHRocmVhZF9zd2l0Y2hfY29udHJvbCk7CiAKIG91dDoKQEAgLTEwNCw2ICs4NywxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgY3RybDsKIAorCS8qIFdoeSBkbyB3ZSBkbyB0aGF0IG9uIGV2ZXJ5IGlkbGUgPyBDb3VsZG4ndCB0aGF0IGJlIGRvbmUgb25jZSBmb3IKKwkgKiBhbGwgb3IgZG8gd2UgbG9zZSB0aGUgc3RhdGUgc29tZSB3YXkgPyBBbHNvLCB0aGUgcG1fY29udHJvbAorCSAqIHJlZ2lzdGVyIHNldHRpbmcsIHRoYXQgY2FuJ3QgYmUgc2V0IG9uY2UgYXQgYm9vdCA/IFdlIHJlYWxseSB3YW50CisJICogdG8gbW92ZSB0aGF0IGF3YXkgaW4gb3JkZXIgdG8gaW1wbGVtZW50IGEgc2ltcGxlIHBvd2Vyc2F2ZQorCSAqLwogCWNiZV9lbmFibGVfcGF1c2VfemVybygpOwogCiAJd2hpbGUgKDEpIHsKQEAgLTE1Miw4ICsxNDAsMTUgQEAKIAkJdGltZXJfaW50ZXJydXB0KHJlZ3MpOwogCQlicmVhazsKIAljYXNlIFNSUjFfV0FLRU1UOgotCQkvKiBubyBhY3Rpb24gcmVxdWlyZWQgKi8KIAkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0NCRV9SQVMKKwljYXNlIFNSUjFfV0FLRVNZU0VSUjoKKwkJY2JlX3N5c3RlbV9lcnJvcl9leGNlcHRpb24ocmVncyk7CisJCWJyZWFrOworCWNhc2UgU1JSMV9XQUtFVEhFUk06CisJCWNiZV90aGVybWFsX2V4Y2VwdGlvbihyZWdzKTsKKwkJYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX0NCRV9SQVMgKi8KIAlkZWZhdWx0OgogCQkvKiBkbyBzeXN0ZW0gcmVzZXQgKi8KIAkJcmV0dXJuIDA7CkBAIC0xNjIsNjggKzE1NywxMSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBjYmVfZmluZF9wbWRfbW1pbyhpbnQgY3B1LCBzdHJ1Y3QgY2JlX3BlcnZhc2l2ZSAqcCkKK3ZvaWQgX19pbml0IGNiZV9wZXJ2YXNpdmVfaW5pdCh2b2lkKQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKLQl1bnNpZ25lZCBpbnQgKmludF9zZXJ2ZXJzOwotCWNoYXIgKmFkZHI7Ci0JdW5zaWduZWQgbG9uZyByZWFsX2FkZHJlc3M7Ci0JdW5zaWduZWQgaW50IHNpemU7Ci0KLQlzdHJ1Y3QgcG1kX3JlZ3MgX19pb21lbSAqcG1kX21taW9fYXJlYTsKLQlpbnQgaGFyZGlkLCB0aHJlYWQ7Ci0JaW50IHByb3BsZW47Ci0KLQlwbWRfbW1pb19hcmVhID0gTlVMTDsKLQloYXJkaWQgPSBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSk7Ci0JZm9yIChub2RlID0gTlVMTDsgKG5vZGUgPSBvZl9maW5kX25vZGVfYnlfdHlwZShub2RlLCAiY3B1IikpOykgewotCQlpbnRfc2VydmVycyA9ICh2b2lkICopIGdldF9wcm9wZXJ0eShub2RlLAotCQkJCSJpYm0scHBjLWludGVycnVwdC1zZXJ2ZXIjcyIsICZwcm9wbGVuKTsKLQkJaWYgKCFpbnRfc2VydmVycykgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMgbWlzc2VzICIKLQkJCQkiaWJtLHBwYy1pbnRlcnJ1cHQtc2VydmVyI3MgcHJvcGVydHkiLAotCQkJCW5vZGUtPmZ1bGxfbmFtZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmb3IgKHRocmVhZCA9IDA7IHRocmVhZCA8IHByb3BsZW4gLyBzaXplb2YgKGludCk7IHRocmVhZCsrKSB7Ci0JCQlpZiAoaGFyZGlkID09IGludF9zZXJ2ZXJzW3RocmVhZF0pIHsKLQkJCQlhZGRyID0gZ2V0X3Byb3BlcnR5KG5vZGUsICJwZXJ2YXNpdmUiLCBOVUxMKTsKLQkJCQlnb3RvIGZvdW5kOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENQVSAlZCBub3QgZm91bmRcbiIsIF9fRlVOQ1RJT05fXywgY3B1KTsKLQlyZXR1cm4gLUVJTlZBTDsKLQotZm91bmQ6Ci0JcmVhbF9hZGRyZXNzID0gKih1bnNpZ25lZCBsb25nKikgYWRkcjsKLQlhZGRyICs9IHNpemVvZiAodW5zaWduZWQgbG9uZyk7Ci0Jc2l6ZSA9ICoodW5zaWduZWQgaW50KikgYWRkcjsKLQotCXByX2RlYnVnKCJwZXJ2YXNpdmUgYXJlYSBmb3IgQ1BVICVkIGF0ICVseCwgc2l6ZSAleFxuIiwKLQkJCWNwdSwgcmVhbF9hZGRyZXNzLCBzaXplKTsKLQlwLT5yZWdzID0gaW9yZW1hcChyZWFsX2FkZHJlc3MsIHNpemUpOwotCXAtPnRocmVhZCA9IHRocmVhZDsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBfX2luaXQgY2VsbF9wZXJ2YXNpdmVfaW5pdCh2b2lkKQotewotCXN0cnVjdCBjYmVfcGVydmFzaXZlICpwOwotCWludCBjcHU7Ci0JaW50IHJldDsKLQogCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfUEFVU0VfWkVSTykpCiAJCXJldHVybjsKIAotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJcCA9ICZjYmVfcGVydmFzaXZlW2NwdV07Ci0JCXJldCA9IGNiZV9maW5kX3BtZF9tbWlvKGNwdSwgcCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm47Ci0JfQotCiAJcHBjX21kLmlkbGVfbG9vcCA9IGNiZV9pZGxlOwogCXBwY19tZC5zeXN0ZW1fcmVzZXRfZXhjZXB0aW9uID0gY2JlX3N5c3RlbV9yZXNldF9leGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvcGVydmFzaXZlLmgKaW5kZXggZGExZmI4NS4uN2I1MDk0NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3BlcnZhc2l2ZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9wZXJ2YXNpdmUuaApAQCAtMjUsMzggKzI1LDkgQEAKICNpZm5kZWYgUEVSVkFTSVZFX0gKICNkZWZpbmUgUEVSVkFTSVZFX0gKIAotc3RydWN0IHBtZF9yZWdzIHsKLQl1OCBwYWRfMHgwMDAwXzB4MDgwMFsweDA4MDAgLSAweDAwMDBdOwkJCS8qIDB4MDAwMCAqLwotCi0JLyogVGhlcm1hbCBTZW5zb3IgUmVnaXN0ZXJzICovCi0JdTY0ICB0c19jdHNyMTsJCQkJCQkvKiAweDA4MDAgKi8KLQl1NjQgIHRzX2N0c3IyOwkJCQkJCS8qIDB4MDgwOCAqLwotCXU2NCAgdHNfbXRzcjE7CQkJCQkJLyogMHgwODEwICovCi0JdTY0ICB0c19tdHNyMjsJCQkJCQkvKiAweDA4MTggKi8KLQl1NjQgIHRzX2l0cjE7CQkJCQkJLyogMHgwODIwICovCi0JdTY0ICB0c19pdHIyOwkJCQkJCS8qIDB4MDgyOCAqLwotCXU2NCAgdHNfZ2l0cjsJCQkJCQkvKiAweDA4MzAgKi8KLQl1NjQgIHRzX2lzcjsJCQkJCQkvKiAweDA4MzggKi8KLQl1NjQgIHRzX2ltcjsJCQkJCQkvKiAweDA4NDAgKi8KLQl1NjQgIHRtX2NyMTsJCQkJCQkvKiAweDA4NDggKi8KLQl1NjQgIHRtX2NyMjsJCQkJCQkvKiAweDA4NTAgKi8KLQl1NjQgIHRtX3NpbXI7CQkJCQkJLyogMHgwODU4ICovCi0JdTY0ICB0bV90cHI7CQkJCQkJLyogMHgwODYwICovCi0JdTY0ICB0bV9zdHIxOwkJCQkJCS8qIDB4MDg2OCAqLwotCXU2NCAgdG1fc3RyMjsJCQkJCQkvKiAweDA4NzAgKi8KLQl1NjQgIHRtX3RzcjsJCQkJCQkvKiAweDA4NzggKi8KLQotCS8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KLQl1NjQgIHBtX2NvbnRyb2w7CQkJCQkvKiAweDA4ODAgKi8KLSNkZWZpbmUgUE1EX1BBVVNFX1pFUk9fQ09OVFJPTAkJMHgxMDAwMAotCXU2NCAgcG1fc3RhdHVzOwkJCQkJCS8qIDB4MDg4OCAqLwotCi0JLyogVGltZSBCYXNlIFJlZ2lzdGVyICovCi0JdTY0ICB0YnI7CQkJCQkJLyogMHgwODkwICovCi0KLQl1OCAgIHBhZF8weDA4OThfMHgxMDAwIFsweDEwMDAgLSAweDA4OThdOwkJLyogMHgwODk4ICovCi19OwotCi12b2lkIF9faW5pdCBjZWxsX3BlcnZhc2l2ZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2JlX3BlcnZhc2l2ZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2JlX3N5c3RlbV9lcnJvcl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIHZvaWQgY2JlX21haW50ZW5hbmNlX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBjYmVfdGhlcm1hbF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNhZDZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3Jhcy5jCkBAIC0wLDAgKzEsMTEyIEBACisjZGVmaW5lIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KKworI2luY2x1ZGUgInJhcy5oIgorI2luY2x1ZGUgImNiZV9yZWdzLmgiCisKKworc3RhdGljIHZvaWQgZHVtcF9maXIoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY2JlX3BtZF9yZWdzIF9faW9tZW0gKnByZWdzID0gY2JlX2dldF9jcHVfcG1kX3JlZ3MoY3B1KTsKKwlzdHJ1Y3QgY2JlX2lpY19yZWdzIF9faW9tZW0gKmlyZWdzID0gY2JlX2dldF9jcHVfaWljX3JlZ3MoY3B1KTsKKworCWlmIChwcmVncyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBUb2RvOiBkbyBzb21lIG5pY2VyIHBhcnNpbmcgb2YgYml0cyBhbmQgYmFzZWQgb24gdGhlbSBnbyBkb3duCisJICogdG8gb3RoZXIgc3ViLXVuaXRzIEZJUnMgYW5kIG5vdCBvbmx5IElJQworCSAqLworCXByaW50ayhLRVJOX0VSUiAiR2xvYmFsIENoZWNrc3RvcCBGSVIgICAgOiAweCUwMTZseFxuIiwKKwkgICAgICAgaW5fYmU2NCgmcHJlZ3MtPmNoZWNrc3RvcF9maXIpKTsKKwlwcmludGsoS0VSTl9FUlIgIkdsb2JhbCBSZWNvdmVyYWJsZSBGSVIgIDogMHglMDE2bHhcbiIsCisJICAgICAgIGluX2JlNjQoJnByZWdzLT5jaGVja3N0b3BfZmlyKSk7CisJcHJpbnRrKEtFUk5fRVJSICJHbG9iYWwgTWFjaGluZUNoZWNrIEZJUiA6IDB4JTAxNmx4XG4iLAorCSAgICAgICBpbl9iZTY0KCZwcmVncy0+c3BlY19hdHRfbWNoa19maXIpKTsKKworCWlmIChpcmVncyA9PSBOVUxMKQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fRVJSICJJT0MgRklSICAgICAgICAgICAgICAgICA6IDB4JTAxNmx4XG4iLAorCSAgICAgICBpbl9iZTY0KCZpcmVncy0+aW9jX2ZpcikpOworCit9CisKK3ZvaWQgY2JlX3N5c3RlbV9lcnJvcl9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXByaW50ayhLRVJOX0VSUiAiU3lzdGVtIEVycm9yIEludGVycnVwdCBvbiBDUFUgJWQgIVxuIiwgY3B1KTsKKwlkdW1wX2ZpcihjcHUpOworCWR1bXBfc3RhY2soKTsKK30KKwordm9pZCBjYmVfbWFpbnRlbmFuY2VfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwkvKgorCSAqIE5vdGhpbmcgaW1wbGVtZW50ZWQgZm9yIHRoZSBtYWludGVuYW5jZSBpbnRlcnJ1cHQgYXQgdGhpcyBwb2ludAorCSAqLworCisJcHJpbnRrKEtFUk5fRVJSICJVbmhhbmRsZWQgTWFpbnRlbmFuY2UgaW50ZXJydXB0IG9uIENQVSAlZCAhXG4iLCBjcHUpOworCWR1bXBfc3RhY2soKTsKK30KKwordm9pZCBjYmVfdGhlcm1hbF9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCS8qCisJICogTm90aGluZyBpbXBsZW1lbnRlZCBmb3IgdGhlIHRoZXJtYWwgaW50ZXJydXB0IGF0IHRoaXMgcG9pbnQKKwkgKi8KKworCXByaW50ayhLRVJOX0VSUiAiVW5oYW5kbGVkIFRoZXJtYWwgaW50ZXJydXB0IG9uIENQVSAlZCAhXG4iLCBjcHUpOworCWR1bXBfc3RhY2soKTsKK30KKworc3RhdGljIGludCBjYmVfbWFjaGluZV9jaGVja19oYW5kbGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlwcmludGsoS0VSTl9FUlIgIk1hY2hpbmUgQ2hlY2sgSW50ZXJydXB0IG9uIENQVSAlZCAhXG4iLCBjcHUpOworCWR1bXBfZmlyKGNwdSk7CisKKwkvKiBObyByZWNvdmVyeSBmcm9tIHRoaXMgY29kZSBub3csIGxldHMgY29udGludWUgKi8KKwlyZXR1cm4gMDsKK30KKwordm9pZCBfX2luaXQgY2JlX3Jhc19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBoaWQwOworCisJLyoKKwkgKiBFbmFibGUgU3lzdGVtIEVycm9yICYgdGhlcm1hbCBpbnRlcnJ1cHRzIGFuZCB3YWtldXAgY29uZGl0aW9ucworCSAqLworCisJaGlkMCA9IG1mc3ByKFNQUk5fSElEMCk7CisJaGlkMCB8PSBISUQwX0NCRV9USEVSTV9JTlRfRU4gfCBISUQwX0NCRV9USEVSTV9XQUtFVVAgfAorCQlISUQwX0NCRV9TWVNFUlJfSU5UX0VOIHwgSElEMF9DQkVfU1lTRVJSX1dBS0VVUDsKKwltdHNwcihTUFJOX0hJRDAsIGhpZDApOworCW1iKCk7CisKKwkvKgorCSAqIEluc3RhbGwgbWFjaGluZSBjaGVjayBoYW5kbGVyLiBMZWF2ZSBzZXR0aW5nIG9mIHByZWNpc2UgbW9kZSB0bworCSAqIHdoYXQgdGhlIGZpcm13YXJlIGRpZCBmb3Igbm93CisJICovCisJcHBjX21kLm1hY2hpbmVfY2hlY2tfZXhjZXB0aW9uID0gY2JlX21hY2hpbmVfY2hlY2tfaGFuZGxlcjsKKwltYigpOworCisJLyoKKwkgKiBGb3Igbm93LCB3ZSBhc3N1bWUgdGhhdCBJT0NfRklSIGlzIGFscmVhZHkgc2V0IHRvIGZvcndhcmQgc29tZQorCSAqIGVycm9yIGNvbmRpdGlvbnMgdG8gdGhlIFN5c3RlbSBFcnJvciBoYW5kbGVyLiBJZiB0aGF0IGlzIG5vdCB0cnVlCisJICogdGhlbiBpdCB3aWxsIGhhdmUgdG8gYmUgZml4ZWQgdXAgaGVyZS4KKwkgKi8KK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9yYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjdlZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3Jhcy5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBSQVNfSAorI2RlZmluZSBSQVNfSAorCitleHRlcm4gdm9pZCBjYmVfc3lzdGVtX2Vycm9yX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBjYmVfbWFpbnRlbmFuY2VfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIGNiZV90aGVybWFsX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitleHRlcm4gdm9pZCBjYmVfcmFzX2luaXQodm9pZCk7CisKKyNlbmRpZiAvKiBSQVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwppbmRleCBmZDNlNTYwLi4zZDE4MzFkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwpAQCAtNDksMTAgKzQ5LDEzIEBACiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KIAogI2luY2x1ZGUgImludGVycnVwdC5oIgogI2luY2x1ZGUgImlvbW11LmgiCisjaW5jbHVkZSAiY2JlX3JlZ3MuaCIKICNpbmNsdWRlICJwZXJ2YXNpdmUuaCIKKyNpbmNsdWRlICJyYXMuaCIKIAogI2lmZGVmIERFQlVHCiAjZGVmaW5lIERCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKQEAgLTgxLDYgKzg0LDE1IEBACiB7CiAJcHBjX21kLmluaXRfSVJRICAgICAgID0gaWljX2luaXRfSVJROwogCXBwY19tZC5nZXRfaXJxICAgICAgICA9IGlpY19nZXRfaXJxOworI2lmZGVmIENPTkZJR19TUFVfQkFTRQorCXNwdV9wcml2MV9vcHMgICAgICAgICA9ICZzcHVfcHJpdjFfbW1pb19vcHM7CisjZW5kaWYKKworCWNiZV9yZWdzX2luaXQoKTsKKworI2lmZGVmIENPTkZJR19DQkVfUkFTCisJY2JlX3Jhc19pbml0KCk7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfaW5pdF9jZWxsKCk7CkBAIC05OCw3ICsxMTAsNyBAQAogCWluaXRfcGNpX2NvbmZpZ190b2tlbnMoKTsKIAlmaW5kX2FuZF9pbml0X3BoYnMoKTsKIAlzcGlkZXJfaW5pdF9JUlEoKTsKLQljZWxsX3BlcnZhc2l2ZV9pbml0KCk7CisJY2JlX3BlcnZhc2l2ZV9pbml0KCk7CiAjaWZkZWYgQ09ORklHX0RVTU1ZX0NPTlNPTEUKIAljb25zd2l0Y2hwID0gJmR1bW15X2NvbjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9iYXNlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwppbmRleCBhZDE0MWZlLi5kYjgyZjUwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2Jhc2UuYwpAQCAtMzQsMTAgKzM0LDE1IEBACiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KKyNpbmNsdWRlIDxhc20vc3B1X3ByaXYxLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKICNpbmNsdWRlICJpbnRlcnJ1cHQuaCIKIAorY29uc3Qgc3RydWN0IHNwdV9wcml2MV9vcHMgKnNwdV9wcml2MV9vcHM7CisKK0VYUE9SVF9TWU1CT0xfR1BMKHNwdV9wcml2MV9vcHMpOworCiBzdGF0aWMgaW50IF9fc3B1X3RyYXBfaW52YWxpZF9kbWEoc3RydWN0IHNwdSAqc3B1KQogewogCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKQEAgLTcxLDcgKzc2LDcgQEAKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHNwdS0+bW07Ci0JdTY0IGVzaWQsIHZzaWQ7CisJdTY0IGVzaWQsIHZzaWQsIGxscDsKIAogCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKIApAQCAtOTEsOSArOTYsMTQgQEAKIAl9CiAKIAllc2lkID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7Ci0JdnNpZCA9IChnZXRfdnNpZChtbS0+Y29udGV4dC5pZCwgZWEpIDw8IFNMQl9WU0lEX1NISUZUKSB8IFNMQl9WU0lEX1VTRVI7CisjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCWlmIChpbl9odWdlcGFnZV9hcmVhKG1tLT5jb250ZXh0LCBlYSkpCi0JCXZzaWQgfD0gU0xCX1ZTSURfTDsKKwkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X2h1Z2VfcHNpemVdLnNsbHA7CisJZWxzZQorI2VuZGlmCisJCWxscCA9IG1tdV9wc2l6ZV9kZWZzW21tdV92aXJ0dWFsX3BzaXplXS5zbGxwOworCXZzaWQgPSAoZ2V0X3ZzaWQobW0tPmNvbnRleHQuaWQsIGVhKSA8PCBTTEJfVlNJRF9TSElGVCkgfAorCQkJU0xCX1ZTSURfVVNFUiB8IGxscDsKIAogCW91dF9iZTY0KCZwcml2Mi0+c2xiX2luZGV4X1csIHNwdS0+c2xiX3JlcGxhY2UpOwogCW91dF9iZTY0KCZwcml2Mi0+c2xiX3ZzaWRfUlcsIHZzaWQpOwpAQCAtMTMwLDU3ICsxNDAsNyBAQAogCXNwdS0+ZGFyID0gZWE7CiAJc3B1LT5kc2lzciA9IGRzaXNyOwogCW1iKCk7Ci0JaWYgKHNwdS0+c3RvcF9jYWxsYmFjaykKLQkJc3B1LT5zdG9wX2NhbGxiYWNrKHNwdSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19zcHVfdHJhcF9tYWlsYm94KHN0cnVjdCBzcHUgKnNwdSkKLXsKLQlpZiAoc3B1LT5pYm94X2NhbGxiYWNrKQotCQlzcHUtPmlib3hfY2FsbGJhY2soc3B1KTsKLQotCS8qIGF0b21pY2FsbHkgZGlzYWJsZSBTUFUgbWFpbGJveCBpbnRlcnJ1cHRzICovCi0Jc3Bpbl9sb2NrKCZzcHUtPnJlZ2lzdGVyX2xvY2spOwotCXNwdV9pbnRfbWFza19hbmQoc3B1LCAyLCB+MHgxKTsKLQlzcGluX3VubG9jaygmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NwdV90cmFwX3N0b3Aoc3RydWN0IHNwdSAqc3B1KQotewotCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQlzcHUtPnN0b3BfY29kZSA9IGluX2JlMzIoJnNwdS0+cHJvYmxlbS0+c3B1X3N0YXR1c19SKTsKLQlpZiAoc3B1LT5zdG9wX2NhbGxiYWNrKQotCQlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NwdV90cmFwX2hhbHQoc3RydWN0IHNwdSAqc3B1KQotewotCXByX2RlYnVnKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQlzcHUtPnN0b3BfY29kZSA9IGluX2JlMzIoJnNwdS0+cHJvYmxlbS0+c3B1X3N0YXR1c19SKTsKLQlpZiAoc3B1LT5zdG9wX2NhbGxiYWNrKQotCQlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NwdV90cmFwX3RhZ19ncm91cChzdHJ1Y3Qgc3B1ICpzcHUpCi17Ci0JcHJfZGVidWcoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwotCXNwdS0+bWZjX2NhbGxiYWNrKHNwdSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19zcHVfdHJhcF9zcHVib3goc3RydWN0IHNwdSAqc3B1KQotewotCWlmIChzcHUtPndib3hfY2FsbGJhY2spCi0JCXNwdS0+d2JveF9jYWxsYmFjayhzcHUpOwotCi0JLyogYXRvbWljYWxseSBkaXNhYmxlIFNQVSBtYWlsYm94IGludGVycnVwdHMgKi8KLQlzcGluX2xvY2soJnNwdS0+cmVnaXN0ZXJfbG9jayk7Ci0Jc3B1X2ludF9tYXNrX2FuZChzcHUsIDIsIH4weDEwKTsKLQlzcGluX3VubG9jaygmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKKwlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTkxLDggKzE1MSw3IEBACiAKIAlzcHUgPSBkYXRhOwogCXNwdS0+Y2xhc3NfMF9wZW5kaW5nID0gMTsKLQlpZiAoc3B1LT5zdG9wX2NhbGxiYWNrKQotCQlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKKwlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTI3MCwyOSArMjI5LDM4IEBACiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCiAJc3B1ID0gZGF0YTsKKwlzcGluX2xvY2soJnNwdS0+cmVnaXN0ZXJfbG9jayk7CiAJc3RhdCA9IHNwdV9pbnRfc3RhdF9nZXQoc3B1LCAyKTsKIAltYXNrID0gc3B1X2ludF9tYXNrX2dldChzcHUsIDIpOworCS8qIGlnbm9yZSBpbnRlcnJ1cHRzIHdlJ3JlIG5vdCB3YWl0aW5nIGZvciAqLworCXN0YXQgJj0gbWFzazsKKwkvKgorCSAqIG1haWxib3ggaW50ZXJydXB0cyAoMHgxIGFuZCAweDEwKSBhcmUgbGV2ZWwgdHJpZ2dlcmVkLgorCSAqIG1hc2sgdGhlbSBub3cgYmVmb3JlIGFja25vd2xlZGdpbmcuCisJICovCisJaWYgKHN0YXQgJiAweDExKQorCQlzcHVfaW50X21hc2tfYW5kKHNwdSwgMiwgfihzdGF0ICYgMHgxMSkpOworCS8qIGFja25vd2xlZGdlIGFsbCBpbnRlcnJ1cHRzIGJlZm9yZSB0aGUgY2FsbGJhY2tzICovCisJc3B1X2ludF9zdGF0X2NsZWFyKHNwdSwgMiwgc3RhdCk7CisJc3Bpbl91bmxvY2soJnNwdS0+cmVnaXN0ZXJfbG9jayk7CiAKIAlwcl9kZWJ1ZygiY2xhc3MgMiBpbnRlcnJ1cHQgJWQsICVseCwgJWx4XG4iLCBpcnEsIHN0YXQsIG1hc2spOwogCi0Jc3RhdCAmPSBtYXNrOwotCiAJaWYgKHN0YXQgJiAxKSAgLyogUFBDIGNvcmUgbWFpbGJveCAqLwotCQlfX3NwdV90cmFwX21haWxib3goc3B1KTsKKwkJc3B1LT5pYm94X2NhbGxiYWNrKHNwdSk7CiAKIAlpZiAoc3RhdCAmIDIpIC8qIFNQVSBzdG9wLWFuZC1zaWduYWwgKi8KLQkJX19zcHVfdHJhcF9zdG9wKHNwdSk7CisJCXNwdS0+c3RvcF9jYWxsYmFjayhzcHUpOwogCiAJaWYgKHN0YXQgJiA0KSAvKiBTUFUgaGFsdGVkICovCi0JCV9fc3B1X3RyYXBfaGFsdChzcHUpOworCQlzcHUtPnN0b3BfY2FsbGJhY2soc3B1KTsKIAogCWlmIChzdGF0ICYgOCkgLyogRE1BIHRhZyBncm91cCBjb21wbGV0ZSAqLwotCQlfX3NwdV90cmFwX3RhZ19ncm91cChzcHUpOworCQlzcHUtPm1mY19jYWxsYmFjayhzcHUpOwogCiAJaWYgKHN0YXQgJiAweDEwKSAvKiBTUFUgbWFpbGJveCB0aHJlc2hvbGQgKi8KLQkJX19zcHVfdHJhcF9zcHVib3goc3B1KTsKKwkJc3B1LT53Ym94X2NhbGxiYWNrKHNwdSk7CiAKLQlzcHVfaW50X3N0YXRfY2xlYXIoc3B1LCAyLCBzdGF0KTsKIAlyZXR1cm4gc3RhdCA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7CiB9CiAKQEAgLTUxMiwxNCArNDgwLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHNwdV9pcnFfc2V0YWZmaW5pdHkoc3RydWN0IHNwdSAqc3B1LCBpbnQgY3B1KQotewotCXU2NCB0YXJnZXQgPSBpaWNfZ2V0X3RhcmdldF9pZChjcHUpOwotCXU2NCByb3V0ZSA9IHRhcmdldCA8PCA0OCB8IHRhcmdldCA8PCAzMiB8IHRhcmdldCA8PCAxNjsKLQlzcHVfaW50X3JvdXRlX3NldChzcHUsIHJvdXRlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwdV9pcnFfc2V0YWZmaW5pdHkpOwotCiBzdGF0aWMgaW50IF9faW5pdCBmaW5kX3NwdV9ub2RlX2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3BlKQogewogCXVuc2lnbmVkIGludCAqaWQ7CkBAIC02NDksNiArNjA5LDQ2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RydWN0IHN5c2Rldl9jbGFzcyBzcHVfc3lzZGV2X2NsYXNzID0geworCXNldF9rc2V0X25hbWUoInNwdSIpCit9OworCitzdGF0aWMgc3NpemVfdCBzcHVfc2hvd19pc3JjKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNkZXYsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3B1ICpzcHUgPSBjb250YWluZXJfb2Yoc3lzZGV2LCBzdHJ1Y3Qgc3B1LCBzeXNkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBzcHUtPmlzcmMpOworCit9CitzdGF0aWMgU1lTREVWX0FUVFIoaXNyYywgMDQwMCwgc3B1X3Nob3dfaXNyYywgTlVMTCk7CisKK2V4dGVybiBpbnQgYXR0YWNoX3N5c2Rldl90b19ub2RlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIGludCBuaWQpOworCitzdGF0aWMgaW50IHNwdV9jcmVhdGVfc3lzZGV2KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlpbnQgcmV0OworCisJc3B1LT5zeXNkZXYuaWQgPSBzcHUtPm51bWJlcjsKKwlzcHUtPnN5c2Rldi5jbHMgPSAmc3B1X3N5c2Rldl9jbGFzczsKKwlyZXQgPSBzeXNkZXZfcmVnaXN0ZXIoJnNwdS0+c3lzZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgcmVnaXN0ZXIgU1BVICVkIHdpdGggc3lzZnNcbiIsCisJCQkJc3B1LT5udW1iZXIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN5c2Rldl9jcmVhdGVfZmlsZSgmc3B1LT5zeXNkZXYsICZhdHRyX2lzcmMpOworCXN5c2ZzX2FkZF9kZXZpY2VfdG9fbm9kZSgmc3B1LT5zeXNkZXYsIHNwdS0+bmlkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcHVfZGVzdHJveV9zeXNkZXYoc3RydWN0IHNwdSAqc3B1KQoreworCXN5c2Rldl9yZW1vdmVfZmlsZSgmc3B1LT5zeXNkZXYsICZhdHRyX2lzcmMpOworCXN5c2ZzX3JlbW92ZV9kZXZpY2VfZnJvbV9ub2RlKCZzcHUtPnN5c2Rldiwgc3B1LT5uaWQpOworCXN5c2Rldl91bnJlZ2lzdGVyKCZzcHUtPnN5c2Rldik7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGNyZWF0ZV9zcHUoc3RydWN0IGRldmljZV9ub2RlICpzcGUpCiB7CiAJc3RydWN0IHNwdSAqc3B1OwpAQCAtNjU2LDcgKzY1Niw3IEBACiAJc3RhdGljIGludCBudW1iZXI7CiAKIAlyZXQgPSAtRU5PTUVNOwotCXNwdSA9IGttYWxsb2Moc2l6ZW9mICgqc3B1KSwgR0ZQX0tFUk5FTCk7CisJc3B1ID0ga3phbGxvYyhzaXplb2YgKCpzcHUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNwdSkKIAkJZ290byBvdXQ7CiAKQEAgLTY2OCwzMyArNjY4LDIwIEBACiAJc3B1LT5uaWQgPSBvZl9ub2RlX3RvX25pZChzcGUpOwogCWlmIChzcHUtPm5pZCA9PSAtMSkKIAkJc3B1LT5uaWQgPSAwOwotCi0Jc3B1LT5zdG9wX2NvZGUgPSAwOwotCXNwdS0+c2xiX3JlcGxhY2UgPSAwOwotCXNwdS0+bW0gPSBOVUxMOwotCXNwdS0+Y3R4ID0gTlVMTDsKLQlzcHUtPnJxID0gTlVMTDsKLQlzcHUtPnBpZCA9IDA7Ci0Jc3B1LT5jbGFzc18wX3BlbmRpbmcgPSAwOwotCXNwdS0+ZmxhZ3MgPSAwVUw7Ci0Jc3B1LT5kYXIgPSAwVUw7Ci0Jc3B1LT5kc2lzciA9IDBVTDsKIAlzcGluX2xvY2tfaW5pdCgmc3B1LT5yZWdpc3Rlcl9sb2NrKTsKLQogCXNwdV9tZmNfc2RyX3NldChzcHUsIG1mc3ByKFNQUk5fU0RSMSkpOwogCXNwdV9tZmNfc3IxX3NldChzcHUsIDB4MzMpOwotCi0Jc3B1LT5pYm94X2NhbGxiYWNrID0gTlVMTDsKLQlzcHUtPndib3hfY2FsbGJhY2sgPSBOVUxMOwotCXNwdS0+c3RvcF9jYWxsYmFjayA9IE5VTEw7Ci0Jc3B1LT5tZmNfY2FsbGJhY2sgPSBOVUxMOwotCiAJbXV0ZXhfbG9jaygmc3B1X211dGV4KTsKKwogCXNwdS0+bnVtYmVyID0gbnVtYmVyKys7CiAJcmV0ID0gc3B1X3JlcXVlc3RfaXJxcyhzcHUpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X3VubWFwOwogCisJcmV0ID0gc3B1X2NyZWF0ZV9zeXNkZXYoc3B1KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9mcmVlX2lycXM7CisKIAlsaXN0X2FkZCgmc3B1LT5saXN0LCAmc3B1X2xpc3QpOwogCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKIApAQCAtNzAzLDYgKzY5MCw5IEBACiAJCXNwdS0+cHJvYmxlbSwgc3B1LT5wcml2MSwgc3B1LT5wcml2Miwgc3B1LT5udW1iZXIpOwogCWdvdG8gb3V0OwogCitvdXRfZnJlZV9pcnFzOgorCXNwdV9mcmVlX2lycXMoc3B1KTsKKwogb3V0X3VubWFwOgogCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKIAlzcHVfdW5tYXAoc3B1KTsKQEAgLTcxNiw2ICs3MDYsNyBAQAogewogCWxpc3RfZGVsX2luaXQoJnNwdS0+bGlzdCk7CiAKKwlzcHVfZGVzdHJveV9zeXNkZXYoc3B1KTsKIAlzcHVfZnJlZV9pcnFzKHNwdSk7CiAJc3B1X3VubWFwKHNwdSk7CiAJa2ZyZWUoc3B1KTsKQEAgLTcyOCw2ICs3MTksNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcHUsIHRtcCwgJnNwdV9saXN0LCBsaXN0KQogCQlkZXN0cm95X3NwdShzcHUpOwogCW11dGV4X3VubG9jaygmc3B1X211dGV4KTsKKwlzeXNkZXZfY2xhc3NfdW5yZWdpc3Rlcigmc3B1X3N5c2Rldl9jbGFzcyk7CiB9CiBtb2R1bGVfZXhpdChjbGVhbnVwX3NwdV9iYXNlKTsKIApAQCAtNzM2LDYgKzcyOCwxMSBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlpbnQgcmV0OwogCisJLyogY3JlYXRlIHN5c2RldiBjbGFzcyBmb3Igc3B1cyAqLworCXJldCA9IHN5c2Rldl9jbGFzc19yZWdpc3Rlcigmc3B1X3N5c2Rldl9jbGFzcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXJldCA9IC1FTk9ERVY7CiAJZm9yIChub2RlID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInNwZSIpOwogCQkJbm9kZTsgbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5vZGUsICJzcGUiKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfY2FsbGJhY2tzLmMKaW5kZXggYjQ3ZmNjNS4uNDdlYzNiZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9jYWxsYmFja3MuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jCkBAIC0zNCwzMDcgKzM0LDE5IEBACiAgKi8KIAogdm9pZCAqc3B1X3N5c2NhbGxfdGFibGVbXSA9IHsKLQlbX19OUl9yZXN0YXJ0X3N5c2NhbGxdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3Jlc3RhcnRfc3lzY2FsbCAqLwotCVtfX05SX2V4aXRdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19leGl0ICovCi0JW19fTlJfZm9ya10JCQlzeXNfbmlfc3lzY2FsbCwgLyogcHBjX2ZvcmsgKi8KLQlbX19OUl9yZWFkXQkJCXN5c19yZWFkLAotCVtfX05SX3dyaXRlXQkJCXN5c193cml0ZSwKLQlbX19OUl9vcGVuXQkJCXN5c19vcGVuLAotCVtfX05SX2Nsb3NlXQkJCXN5c19jbG9zZSwKLQlbX19OUl93YWl0cGlkXQkJCXN5c193YWl0cGlkLAotCVtfX05SX2NyZWF0XQkJCXN5c19jcmVhdCwKLQlbX19OUl9saW5rXQkJCXN5c19saW5rLAotCVtfX05SX3VubGlua10JCQlzeXNfdW5saW5rLAotCVtfX05SX2V4ZWN2ZV0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2V4ZWN2ZSAqLwotCVtfX05SX2NoZGlyXQkJCXN5c19jaGRpciwKLQlbX19OUl90aW1lXQkJCXN5c190aW1lLAotCVtfX05SX21rbm9kXQkJCXN5c19ta25vZCwKLQlbX19OUl9jaG1vZF0JCQlzeXNfY2htb2QsCi0JW19fTlJfbGNob3duXQkJCXN5c19sY2hvd24sCi0JW19fTlJfYnJlYWtdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfb2xkc3RhdF0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9sc2Vla10JCQlzeXNfbHNlZWssCi0JW19fTlJfZ2V0cGlkXQkJCXN5c19nZXRwaWQsCi0JW19fTlJfbW91bnRdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19tb3VudCAqLwotCVtfX05SX3Vtb3VudF0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9zZXR1aWRdCQkJc3lzX3NldHVpZCwKLQlbX19OUl9nZXR1aWRdCQkJc3lzX2dldHVpZCwKLQlbX19OUl9zdGltZV0JCQlzeXNfc3RpbWUsCi0JW19fTlJfcHRyYWNlXQkJCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcHRyYWNlICovCi0JW19fTlJfYWxhcm1dCQkJc3lzX2FsYXJtLAotCVtfX05SX29sZGZzdGF0XQkJCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3BhdXNlXQkJCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcGF1c2UgKi8KLQlbX19OUl91dGltZV0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3V0aW1lICovCi0JW19fTlJfc3R0eV0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9ndHR5XQkJCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX2FjY2Vzc10JCQlzeXNfYWNjZXNzLAotCVtfX05SX25pY2VdCQkJc3lzX25pY2UsCi0JW19fTlJfZnRpbWVdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfc3luY10JCQlzeXNfc3luYywKLQlbX19OUl9raWxsXQkJCXN5c19raWxsLAotCVtfX05SX3JlbmFtZV0JCQlzeXNfcmVuYW1lLAotCVtfX05SX21rZGlyXQkJCXN5c19ta2RpciwKLQlbX19OUl9ybWRpcl0JCQlzeXNfcm1kaXIsCi0JW19fTlJfZHVwXQkJCXN5c19kdXAsCi0JW19fTlJfcGlwZV0JCQlzeXNfcGlwZSwKLQlbX19OUl90aW1lc10JCQlzeXNfdGltZXMsCi0JW19fTlJfcHJvZl0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9icmtdCQkJc3lzX2JyaywKLQlbX19OUl9zZXRnaWRdCQkJc3lzX3NldGdpZCwKLQlbX19OUl9nZXRnaWRdCQkJc3lzX2dldGdpZCwKLQlbX19OUl9zaWduYWxdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19zaWduYWwgKi8KLQlbX19OUl9nZXRldWlkXQkJCXN5c19nZXRldWlkLAotCVtfX05SX2dldGVnaWRdCQkJc3lzX2dldGVnaWQsCi0JW19fTlJfYWNjdF0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2FjY3QgKi8KLQlbX19OUl91bW91bnQyXQkJCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfdW1vdW50ICovCi0JW19fTlJfbG9ja10JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9pb2N0bF0JCQlzeXNfaW9jdGwsCi0JW19fTlJfZmNudGxdCQkJc3lzX2ZjbnRsLAotCVtfX05SX21weF0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9zZXRwZ2lkXQkJCXN5c19zZXRwZ2lkLAotCVtfX05SX3VsaW1pdF0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9vbGRvbGR1bmFtZV0JCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3VtYXNrXQkJCXN5c191bWFzaywKLQlbX19OUl9jaHJvb3RdCQkJc3lzX2Nocm9vdCwKLQlbX19OUl91c3RhdF0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3VzdGF0ICovCi0JW19fTlJfZHVwMl0JCQlzeXNfZHVwMiwKLQlbX19OUl9nZXRwcGlkXQkJCXN5c19nZXRwcGlkLAotCVtfX05SX2dldHBncnBdCQkJc3lzX2dldHBncnAsCi0JW19fTlJfc2V0c2lkXQkJCXN5c19zZXRzaWQsCi0JW19fTlJfc2lnYWN0aW9uXQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfc2dldG1hc2tdCQkJc3lzX3NnZXRtYXNrLAotCVtfX05SX3NzZXRtYXNrXQkJCXN5c19zc2V0bWFzaywKLQlbX19OUl9zZXRyZXVpZF0JCQlzeXNfc2V0cmV1aWQsCi0JW19fTlJfc2V0cmVnaWRdCQkJc3lzX3NldHJlZ2lkLAotCVtfX05SX3NpZ3N1c3BlbmRdCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9zaWdwZW5kaW5nXQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfc2V0aG9zdG5hbWVdCQlzeXNfc2V0aG9zdG5hbWUsCi0JW19fTlJfc2V0cmxpbWl0XQkJc3lzX3NldHJsaW1pdCwKLQlbX19OUl9nZXRybGltaXRdCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9nZXRydXNhZ2VdCQlzeXNfZ2V0cnVzYWdlLAotCVtfX05SX2dldHRpbWVvZmRheV0JCXN5c19nZXR0aW1lb2ZkYXksCi0JW19fTlJfc2V0dGltZW9mZGF5XQkJc3lzX3NldHRpbWVvZmRheSwKLQlbX19OUl9nZXRncm91cHNdCQlzeXNfZ2V0Z3JvdXBzLAotCVtfX05SX3NldGdyb3Vwc10JCXN5c19zZXRncm91cHMsCi0JW19fTlJfc2VsZWN0XQkJCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3N5bWxpbmtdCQkJc3lzX3N5bWxpbmssCi0JW19fTlJfb2xkbHN0YXRdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfcmVhZGxpbmtdCQkJc3lzX3JlYWRsaW5rLAotCVtfX05SX3VzZWxpYl0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3VzZWxpYiAqLwotCVtfX05SX3N3YXBvbl0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3N3YXBvbiAqLwotCVtfX05SX3JlYm9vdF0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3JlYm9vdCAqLwotCVtfX05SX3JlYWRkaXJdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfbW1hcF0JCQlzeXNfbW1hcCwKLQlbX19OUl9tdW5tYXBdCQkJc3lzX211bm1hcCwKLQlbX19OUl90cnVuY2F0ZV0JCQlzeXNfdHJ1bmNhdGUsCi0JW19fTlJfZnRydW5jYXRlXQkJc3lzX2Z0cnVuY2F0ZSwKLQlbX19OUl9mY2htb2RdCQkJc3lzX2ZjaG1vZCwKLQlbX19OUl9mY2hvd25dCQkJc3lzX2ZjaG93biwKLQlbX19OUl9nZXRwcmlvcml0eV0JCXN5c19nZXRwcmlvcml0eSwKLQlbX19OUl9zZXRwcmlvcml0eV0JCXN5c19zZXRwcmlvcml0eSwKLQlbX19OUl9wcm9maWxdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfc3RhdGZzXQkJCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfc3RhdGZzICovCi0JW19fTlJfZnN0YXRmc10JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2ZzdGF0ZnMgKi8KLQlbX19OUl9pb3Blcm1dCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfc29ja2V0Y2FsbF0JCXN5c19zb2NrZXRjYWxsLAotCVtfX05SX3N5c2xvZ10JCQlzeXNfc3lzbG9nLAotCVtfX05SX3NldGl0aW1lcl0JCXN5c19zZXRpdGltZXIsCi0JW19fTlJfZ2V0aXRpbWVyXQkJc3lzX2dldGl0aW1lciwKLQlbX19OUl9zdGF0XQkJCXN5c19uZXdzdGF0LAotCVtfX05SX2xzdGF0XQkJCXN5c19uZXdsc3RhdCwKLQlbX19OUl9mc3RhdF0JCQlzeXNfbmV3ZnN0YXQsCi0JW19fTlJfb2xkdW5hbWVdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfaW9wbF0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl92aGFuZ3VwXQkJCXN5c192aGFuZ3VwLAotCVtfX05SX2lkbGVdCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfdm04Nl0JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl93YWl0NF0JCQlzeXNfd2FpdDQsCi0JW19fTlJfc3dhcG9mZl0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3N3YXBvZmYgKi8KLQlbX19OUl9zeXNpbmZvXQkJCXN5c19zeXNpbmZvLAotCVtfX05SX2lwY10JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2lwYyAqLwotCVtfX05SX2ZzeW5jXQkJCXN5c19mc3luYywKLQlbX19OUl9zaWdyZXR1cm5dCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9jbG9uZV0JCQlzeXNfbmlfc3lzY2FsbCwgLyogcHBjX2Nsb25lICovCi0JW19fTlJfc2V0ZG9tYWlubmFtZV0JCXN5c19zZXRkb21haW5uYW1lLAotCVtfX05SX3VuYW1lXQkJCXBwY19uZXd1bmFtZSwKLQlbX19OUl9tb2RpZnlfbGR0XQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfYWRqdGltZXhdCQkJc3lzX2FkanRpbWV4LAotCVtfX05SX21wcm90ZWN0XQkJCXN5c19tcHJvdGVjdCwKLQlbX19OUl9zaWdwcm9jbWFza10JCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX2NyZWF0ZV9tb2R1bGVdCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9pbml0X21vZHVsZV0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfaW5pdF9tb2R1bGUgKi8KLQlbX19OUl9kZWxldGVfbW9kdWxlXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19kZWxldGVfbW9kdWxlICovCi0JW19fTlJfZ2V0X2tlcm5lbF9zeW1zXQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfcXVvdGFjdGxdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19xdW90YWN0bCAqLwotCVtfX05SX2dldHBnaWRdCQkJc3lzX2dldHBnaWQsCi0JW19fTlJfZmNoZGlyXQkJCXN5c19mY2hkaXIsCi0JW19fTlJfYmRmbHVzaF0JCQlzeXNfYmRmbHVzaCwKLQlbX19OUl9zeXNmc10JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3N5c2ZzICovCi0JW19fTlJfcGVyc29uYWxpdHldCQlwcGM2NF9wZXJzb25hbGl0eSwKLQlbX19OUl9hZnNfc3lzY2FsbF0JCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3NldGZzdWlkXQkJCXN5c19zZXRmc3VpZCwKLQlbX19OUl9zZXRmc2dpZF0JCQlzeXNfc2V0ZnNnaWQsCi0JW19fTlJfX2xsc2Vla10JCQlzeXNfbGxzZWVrLAotCVtfX05SX2dldGRlbnRzXQkJCXN5c19nZXRkZW50cywKLQlbX19OUl9fbmV3c2VsZWN0XQkJc3lzX3NlbGVjdCwKLQlbX19OUl9mbG9ja10JCQlzeXNfZmxvY2ssCi0JW19fTlJfbXN5bmNdCQkJc3lzX21zeW5jLAotCVtfX05SX3JlYWR2XQkJCXN5c19yZWFkdiwKLQlbX19OUl93cml0ZXZdCQkJc3lzX3dyaXRldiwKLQlbX19OUl9nZXRzaWRdCQkJc3lzX2dldHNpZCwKLQlbX19OUl9mZGF0YXN5bmNdCQlzeXNfZmRhdGFzeW5jLAotCVtfX05SX19zeXNjdGxdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19zeXNjdGwgKi8KLQlbX19OUl9tbG9ja10JCQlzeXNfbWxvY2ssCi0JW19fTlJfbXVubG9ja10JCQlzeXNfbXVubG9jaywKLQlbX19OUl9tbG9ja2FsbF0JCQlzeXNfbWxvY2thbGwsCi0JW19fTlJfbXVubG9ja2FsbF0JCXN5c19tdW5sb2NrYWxsLAotCVtfX05SX3NjaGVkX3NldHBhcmFtXQkJc3lzX3NjaGVkX3NldHBhcmFtLAotCVtfX05SX3NjaGVkX2dldHBhcmFtXQkJc3lzX3NjaGVkX2dldHBhcmFtLAotCVtfX05SX3NjaGVkX3NldHNjaGVkdWxlcl0Jc3lzX3NjaGVkX3NldHNjaGVkdWxlciwKLQlbX19OUl9zY2hlZF9nZXRzY2hlZHVsZXJdCXN5c19zY2hlZF9nZXRzY2hlZHVsZXIsCi0JW19fTlJfc2NoZWRfeWllbGRdCQlzeXNfc2NoZWRfeWllbGQsCi0JW19fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21heF0Jc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsCi0JW19fTlJfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbl0Jc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4sCi0JW19fTlJfc2NoZWRfcnJfZ2V0X2ludGVydmFsXQlzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLAotCVtfX05SX25hbm9zbGVlcF0JCXN5c19uYW5vc2xlZXAsCi0JW19fTlJfbXJlbWFwXQkJCXN5c19tcmVtYXAsCi0JW19fTlJfc2V0cmVzdWlkXQkJc3lzX3NldHJlc3VpZCwKLQlbX19OUl9nZXRyZXN1aWRdCQlzeXNfZ2V0cmVzdWlkLAotCVtfX05SX3F1ZXJ5X21vZHVsZV0JCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3BvbGxdCQkJc3lzX3BvbGwsCi0JW19fTlJfbmZzc2VydmN0bF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfbmZzc2VydmN0bCAqLwotCVtfX05SX3NldHJlc2dpZF0JCXN5c19zZXRyZXNnaWQsCi0JW19fTlJfZ2V0cmVzZ2lkXQkJc3lzX2dldHJlc2dpZCwKLQlbX19OUl9wcmN0bF0JCQlzeXNfcHJjdGwsCi0JW19fTlJfcnRfc2lncmV0dXJuXQkJc3lzX25pX3N5c2NhbGwsIC8qIHBwYzY0X3J0X3NpZ3JldHVybiAqLwotCVtfX05SX3J0X3NpZ2FjdGlvbl0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcnRfc2lnYWN0aW9uICovCi0JW19fTlJfcnRfc2lncHJvY21hc2tdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3J0X3NpZ3Byb2NtYXNrICovCi0JW19fTlJfcnRfc2lncGVuZGluZ10JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcnRfc2lncGVuZGluZyAqLwotCVtfX05SX3J0X3NpZ3RpbWVkd2FpdF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcnRfc2lndGltZWR3YWl0ICovCi0JW19fTlJfcnRfc2lncXVldWVpbmZvXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19ydF9zaWdxdWV1ZWluZm8gKi8KLQlbX19OUl9ydF9zaWdzdXNwZW5kXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19ydF9zaWdzdXNwZW5kICovCi0JW19fTlJfcHJlYWQ2NF0JCQlzeXNfcHJlYWQ2NCwKLQlbX19OUl9wd3JpdGU2NF0JCQlzeXNfcHdyaXRlNjQsCi0JW19fTlJfY2hvd25dCQkJc3lzX2Nob3duLAotCVtfX05SX2dldGN3ZF0JCQlzeXNfZ2V0Y3dkLAotCVtfX05SX2NhcGdldF0JCQlzeXNfY2FwZ2V0LAotCVtfX05SX2NhcHNldF0JCQlzeXNfY2Fwc2V0LAotCVtfX05SX3NpZ2FsdHN0YWNrXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19zaWdhbHRzdGFjayAqLwotCVtfX05SX3NlbmRmaWxlXQkJCXN5c19zZW5kZmlsZTY0LAotCVtfX05SX2dldHBtc2ddCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfcHV0cG1zZ10JCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl92Zm9ya10JCQlzeXNfbmlfc3lzY2FsbCwgLyogcHBjX3Zmb3JrICovCi0JW19fTlJfdWdldHJsaW1pdF0JCXN5c19nZXRybGltaXQsCi0JW19fTlJfcmVhZGFoZWFkXQkJc3lzX3JlYWRhaGVhZCwKLQlbMTkyXQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbMTkzXQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbMTk0XQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbMTk1XQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbMTk2XQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbMTk3XQkJCQlzeXNfbmlfc3lzY2FsbCwKLQlbX19OUl9wY2ljb25maWdfcmVhZF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcGNpY29uZmlnX3JlYWQgKi8KLQlbX19OUl9wY2ljb25maWdfd3JpdGVdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3BjaWNvbmZpZ193cml0ZSAqLwotCVtfX05SX3BjaWNvbmZpZ19pb2Jhc2VdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3BjaWNvbmZpZ19pb2Jhc2UgKi8KLQlbX19OUl9tdWx0aXBsZXhlcl0JCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX2dldGRlbnRzNjRdCQlzeXNfZ2V0ZGVudHM2NCwKLQlbX19OUl9waXZvdF9yb290XQkJc3lzX3Bpdm90X3Jvb3QsCi0JWzIwNF0JCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfbWFkdmlzZV0JCQlzeXNfbWFkdmlzZSwKLQlbX19OUl9taW5jb3JlXQkJCXN5c19taW5jb3JlLAotCVtfX05SX2dldHRpZF0JCQlzeXNfZ2V0dGlkLAotCVtfX05SX3RraWxsXQkJCXN5c190a2lsbCwKLQlbX19OUl9zZXR4YXR0cl0JCQlzeXNfc2V0eGF0dHIsCi0JW19fTlJfbHNldHhhdHRyXQkJc3lzX2xzZXR4YXR0ciwKLQlbX19OUl9mc2V0eGF0dHJdCQlzeXNfZnNldHhhdHRyLAotCVtfX05SX2dldHhhdHRyXQkJCXN5c19nZXR4YXR0ciwKLQlbX19OUl9sZ2V0eGF0dHJdCQlzeXNfbGdldHhhdHRyLAotCVtfX05SX2ZnZXR4YXR0cl0JCXN5c19mZ2V0eGF0dHIsCi0JW19fTlJfbGlzdHhhdHRyXQkJc3lzX2xpc3R4YXR0ciwKLQlbX19OUl9sbGlzdHhhdHRyXQkJc3lzX2xsaXN0eGF0dHIsCi0JW19fTlJfZmxpc3R4YXR0cl0JCXN5c19mbGlzdHhhdHRyLAotCVtfX05SX3JlbW92ZXhhdHRyXQkJc3lzX3JlbW92ZXhhdHRyLAotCVtfX05SX2xyZW1vdmV4YXR0cl0JCXN5c19scmVtb3ZleGF0dHIsCi0JW19fTlJfZnJlbW92ZXhhdHRyXQkJc3lzX2ZyZW1vdmV4YXR0ciwKLQlbX19OUl9mdXRleF0JCQlzeXNfZnV0ZXgsCi0JW19fTlJfc2NoZWRfc2V0YWZmaW5pdHldCXN5c19zY2hlZF9zZXRhZmZpbml0eSwKLQlbX19OUl9zY2hlZF9nZXRhZmZpbml0eV0Jc3lzX3NjaGVkX2dldGFmZmluaXR5LAotCVsyMjRdCQkJCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3R1eGNhbGxdCQkJc3lzX25pX3N5c2NhbGwsCi0JWzIyNl0JCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfaW9fc2V0dXBdCQkJc3lzX2lvX3NldHVwLAotCVtfX05SX2lvX2Rlc3Ryb3ldCQlzeXNfaW9fZGVzdHJveSwKLQlbX19OUl9pb19nZXRldmVudHNdCQlzeXNfaW9fZ2V0ZXZlbnRzLAotCVtfX05SX2lvX3N1Ym1pdF0JCXN5c19pb19zdWJtaXQsCi0JW19fTlJfaW9fY2FuY2VsXQkJc3lzX2lvX2NhbmNlbCwKLQlbX19OUl9zZXRfdGlkX2FkZHJlc3NdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3NldF90aWRfYWRkcmVzcyAqLwotCVtfX05SX2ZhZHZpc2U2NF0JCXN5c19mYWR2aXNlNjQsCi0JW19fTlJfZXhpdF9ncm91cF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfZXhpdF9ncm91cCAqLwotCVtfX05SX2xvb2t1cF9kY29va2llXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19sb29rdXBfZGNvb2tpZSAqLwotCVtfX05SX2Vwb2xsX2NyZWF0ZV0JCXN5c19lcG9sbF9jcmVhdGUsCi0JW19fTlJfZXBvbGxfY3RsXQkJc3lzX2Vwb2xsX2N0bCwKLQlbX19OUl9lcG9sbF93YWl0XQkJc3lzX2Vwb2xsX3dhaXQsCi0JW19fTlJfcmVtYXBfZmlsZV9wYWdlc10JCXN5c19yZW1hcF9maWxlX3BhZ2VzLAotCVtfX05SX3RpbWVyX2NyZWF0ZV0JCXN5c190aW1lcl9jcmVhdGUsCi0JW19fTlJfdGltZXJfc2V0dGltZV0JCXN5c190aW1lcl9zZXR0aW1lLAotCVtfX05SX3RpbWVyX2dldHRpbWVdCQlzeXNfdGltZXJfZ2V0dGltZSwKLQlbX19OUl90aW1lcl9nZXRvdmVycnVuXQkJc3lzX3RpbWVyX2dldG92ZXJydW4sCi0JW19fTlJfdGltZXJfZGVsZXRlXQkJc3lzX3RpbWVyX2RlbGV0ZSwKLQlbX19OUl9jbG9ja19zZXR0aW1lXQkJc3lzX2Nsb2NrX3NldHRpbWUsCi0JW19fTlJfY2xvY2tfZ2V0dGltZV0JCXN5c19jbG9ja19nZXR0aW1lLAotCVtfX05SX2Nsb2NrX2dldHJlc10JCXN5c19jbG9ja19nZXRyZXMsCi0JW19fTlJfY2xvY2tfbmFub3NsZWVwXQkJc3lzX2Nsb2NrX25hbm9zbGVlcCwKLQlbX19OUl9zd2FwY29udGV4dF0JCXN5c19uaV9zeXNjYWxsLCAvKiBwcGM2NF9zd2FwY29udGV4dCAqLwotCVtfX05SX3Rna2lsbF0JCQlzeXNfdGdraWxsLAotCVtfX05SX3V0aW1lc10JCQlzeXNfdXRpbWVzLAotCVtfX05SX3N0YXRmczY0XQkJCXN5c19zdGF0ZnM2NCwKLQlbX19OUl9mc3RhdGZzNjRdCQlzeXNfZnN0YXRmczY0LAotCVsyNTRdCQkJCXN5c19uaV9zeXNjYWxsLAotCVtfX05SX3J0YXNdCQkJcHBjX3J0YXMsCi0JWzI1Nl0JCQkJc3lzX25pX3N5c2NhbGwsCi0JWzI1N10JCQkJc3lzX25pX3N5c2NhbGwsCi0JWzI1OF0JCQkJc3lzX25pX3N5c2NhbGwsCi0JW19fTlJfbWJpbmRdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19tYmluZCAqLwotCVtfX05SX2dldF9tZW1wb2xpY3ldCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2dldF9tZW1wb2xpY3kgKi8KLQlbX19OUl9zZXRfbWVtcG9saWN5XQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19zZXRfbWVtcG9saWN5ICovCi0JW19fTlJfbXFfb3Blbl0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX21xX29wZW4gKi8KLQlbX19OUl9tcV91bmxpbmtdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX21xX3VubGluayAqLwotCVtfX05SX21xX3RpbWVkc2VuZF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfbXFfdGltZWRzZW5kICovCi0JW19fTlJfbXFfdGltZWRyZWNlaXZlXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19tcV90aW1lZHJlY2VpdmUgKi8KLQlbX19OUl9tcV9ub3RpZnldCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX21xX25vdGlmeSAqLwotCVtfX05SX21xX2dldHNldGF0dHJdCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX21xX2dldHNldGF0dHIgKi8KLQlbX19OUl9rZXhlY19sb2FkXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19rZXhlY19sb2FkICovCi0JW19fTlJfYWRkX2tleV0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX2FkZF9rZXkgKi8KLQlbX19OUl9yZXF1ZXN0X2tleV0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfcmVxdWVzdF9rZXkgKi8KLQlbX19OUl9rZXljdGxdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19rZXljdGwgKi8KLQlbX19OUl93YWl0aWRdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c193YWl0aWQgKi8KLQlbX19OUl9pb3ByaW9fc2V0XQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19pb3ByaW9fc2V0ICovCi0JW19fTlJfaW9wcmlvX2dldF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfaW9wcmlvX2dldCAqLwotCVtfX05SX2lub3RpZnlfaW5pdF0JCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfaW5vdGlmeV9pbml0ICovCi0JW19fTlJfaW5vdGlmeV9hZGRfd2F0Y2hdCXN5c19uaV9zeXNjYWxsLCAvKiBzeXNfaW5vdGlmeV9hZGRfd2F0Y2ggKi8KLQlbX19OUl9pbm90aWZ5X3JtX3dhdGNoXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19pbm90aWZ5X3JtX3dhdGNoICovCi0JW19fTlJfc3B1X3J1bl0JCQlzeXNfbmlfc3lzY2FsbCwgLyogc3lzX3NwdV9ydW4gKi8KLQlbX19OUl9zcHVfY3JlYXRlXQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19zcHVfY3JlYXRlICovCi0JW19fTlJfcHNlbGVjdDZdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19wc2VsZWN0ICovCi0JW19fTlJfcHBvbGxdCQkJc3lzX25pX3N5c2NhbGwsIC8qIHN5c19wcG9sbCAqLwotCVtfX05SX3Vuc2hhcmVdCQkJc3lzX3Vuc2hhcmUsCi0JW19fTlJfc3BsaWNlXQkJCXN5c19zcGxpY2UsCi0JW19fTlJfdGVlXQkJCXN5c190ZWUsCi0JW19fTlJfdm1zcGxpY2VdCQkJc3lzX3Ztc3BsaWNlLAotCVtfX05SX29wZW5hdF0JCQlzeXNfb3BlbmF0LAotCVtfX05SX21rZGlyYXRdCQkJc3lzX21rZGlyYXQsCi0JW19fTlJfbWtub2RhdF0JCQlzeXNfbWtub2RhdCwKLQlbX19OUl9mY2hvd25hdF0JCQlzeXNfZmNob3duYXQsCi0JW19fTlJfZnV0aW1lc2F0XQkJc3lzX2Z1dGltZXNhdCwKLQlbX19OUl9uZXdmc3RhdGF0XQkJc3lzX25ld2ZzdGF0YXQsCi0JW19fTlJfdW5saW5rYXRdCQkJc3lzX3VubGlua2F0LAotCVtfX05SX3JlbmFtZWF0XQkJCXN5c19yZW5hbWVhdCwKLQlbX19OUl9saW5rYXRdCQkJc3lzX2xpbmthdCwKLQlbX19OUl9zeW1saW5rYXRdCQlzeXNfc3ltbGlua2F0LAotCVtfX05SX3JlYWRsaW5rYXRdCQlzeXNfcmVhZGxpbmthdCwKLQlbX19OUl9mY2htb2RhdF0JCQlzeXNfZmNobW9kYXQsCi0JW19fTlJfZmFjY2Vzc2F0XQkJc3lzX2ZhY2Nlc3NhdCwKLQlbX19OUl9nZXRfcm9idXN0X2xpc3RdCQlzeXNfZ2V0X3JvYnVzdF9saXN0LAotCVtfX05SX3NldF9yb2J1c3RfbGlzdF0JCXN5c19zZXRfcm9idXN0X2xpc3QsCisjZGVmaW5lIFNZU0NBTEwoZnVuYykJCXN5c19uaV9zeXNjYWxsLAorI2RlZmluZSBDT01QQVRfU1lTKGZ1bmMpCXN5c19uaV9zeXNjYWxsLAorI2RlZmluZSBQUENfU1lTKGZ1bmMpCQlzeXNfbmlfc3lzY2FsbCwKKyNkZWZpbmUgT0xEU1lTKGZ1bmMpCQlzeXNfbmlfc3lzY2FsbCwKKyNkZWZpbmUgU1lTMzJPTkxZKGZ1bmMpCQlzeXNfbmlfc3lzY2FsbCwKKyNkZWZpbmUgU1lTWChmLCBmMzI2NCwgZjMyKQlzeXNfbmlfc3lzY2FsbCwKKworI2RlZmluZSBTWVNDQUxMX1NQVShmdW5jKQlzeXNfIyNmdW5jLAorI2RlZmluZSBDT01QQVRfU1lTX1NQVShmdW5jKQlzeXNfIyNmdW5jLAorI2RlZmluZSBQUENfU1lTX1NQVShmdW5jKQlwcGNfIyNmdW5jLAorI2RlZmluZSBTWVNYX1NQVShmLCBmMzI2NCwgZjMyKQlmLAorCisjaW5jbHVkZSA8YXNtL3N5c3RibC5oPgogfTsKIAogbG9uZyBzcHVfc3lzX2NhbGxiYWNrKHN0cnVjdCBzcHVfc3lzY2FsbF9ibG9jayAqcykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2NTY0Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X3ByaXYxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoKLSAqIGFjY2VzcyB0byBTUFUgcHJpdmlsZWdlZCByZWdpc3RlcnMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3NwdS5oPgotCi12b2lkIHNwdV9pbnRfbWFza19hbmQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQotewotCXU2NCBvbGRfbWFzazsKLQotCW9sZF9tYXNrID0gaW5fYmU2NCgmc3B1LT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdKTsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdLCBvbGRfbWFzayAmIG1hc2spOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9tYXNrX2FuZCk7Ci0KLXZvaWQgc3B1X2ludF9tYXNrX29yKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKLXsKLQl1NjQgb2xkX21hc2s7Ci0KLQlvbGRfbWFzayA9IGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSk7Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgb2xkX21hc2sgfCBtYXNrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwdV9pbnRfbWFza19vcik7Ci0KLXZvaWQgc3B1X2ludF9tYXNrX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgbWFzayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfaW50X21hc2tfc2V0KTsKLQotdTY0IHNwdV9pbnRfbWFza19nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCi17Ci0JcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfaW50X21hc2tfZ2V0KTsKLQotdm9pZCBzcHVfaW50X3N0YXRfY2xlYXIoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBzdGF0KQotewotCW91dF9iZTY0KCZzcHUtPnByaXYxLT5pbnRfc3RhdF9SV1tjbGFzc10sIHN0YXQpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3B1X2ludF9zdGF0X2NsZWFyKTsKLQotdTY0IHNwdV9pbnRfc3RhdF9nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCi17Ci0JcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9zdGF0X1JXW2NsYXNzXSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfaW50X3N0YXRfZ2V0KTsKLQotdm9pZCBzcHVfaW50X3JvdXRlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCByb3V0ZSkKLXsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X3JvdXRlX1JXLCByb3V0ZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfaW50X3JvdXRlX3NldCk7Ci0KLXU2NCBzcHVfbWZjX2Rhcl9nZXQoc3RydWN0IHNwdSAqc3B1KQotewotCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5tZmNfZGFyX1JXKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwdV9tZmNfZGFyX2dldCk7Ci0KLXU2NCBzcHVfbWZjX2RzaXNyX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCi17Ci0JcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY19kc2lzcl9SVyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX2RzaXNyX2dldCk7Ci0KLXZvaWQgc3B1X21mY19kc2lzcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZHNpc3IpCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPm1mY19kc2lzcl9SVywgZHNpc3IpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3B1X21mY19kc2lzcl9zZXQpOwotCi12b2lkIHNwdV9tZmNfc2RyX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBzZHIpCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPm1mY19zZHJfUlcsIHNkcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX3Nkcl9zZXQpOwotCi12b2lkIHNwdV9tZmNfc3IxX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBzcjEpCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPm1mY19zcjFfUlcsIHNyMSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX3NyMV9zZXQpOwotCi11NjQgc3B1X21mY19zcjFfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKLXsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX3NyMV9SVyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX3NyMV9nZXQpOwotCi12b2lkIHNwdV9tZmNfdGNsYXNzX2lkX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCB0Y2xhc3NfaWQpCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPm1mY190Y2xhc3NfaWRfUlcsIHRjbGFzc19pZCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX3RjbGFzc19pZF9zZXQpOwotCi11NjQgc3B1X21mY190Y2xhc3NfaWRfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKLXsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX3RjbGFzc19pZF9SVyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfbWZjX3RjbGFzc19pZF9nZXQpOwotCi12b2lkIHNwdV90bGJfaW52YWxpZGF0ZShzdHJ1Y3Qgc3B1ICpzcHUpCi17Ci0Jb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnRsYl9pbnZhbGlkYXRlX2VudHJ5X1csIDB1bCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfdGxiX2ludmFsaWRhdGUpOwotCi12b2lkIHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGlkKQotewotCW91dF9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfUlcsIGlkKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0KTsKLQotdTY0IHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKLXsKLQlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+cmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX1JXKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KTsKLQotdm9pZCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IGVuYWJsZSkKLXsKLQlvdXRfYmU2NCgmc3B1LT5wcml2MS0+cmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfUlcsIGVuYWJsZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfc2V0KTsKLQotdTY0IHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3RydWN0IHNwdSAqc3B1KQotewotCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdV9wcml2MV9tbWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNjlmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVfcHJpdjFfbW1pby5jCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogc3B1IGh5cGVydmlzb3IgYWJzdHJhY3Rpb24gZm9yIGRpcmVjdCBoYXJkd2FyZSBhY2Nlc3MuCisgKgorICogIChDKSBDb3B5cmlnaHQgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkggMjAwNQorICogIENvcHlyaWdodCAyMDA2IFNvbnkgQ29ycC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgorCisjaW5jbHVkZSAiaW50ZXJydXB0LmgiCisKK3N0YXRpYyB2b2lkIGludF9tYXNrX2FuZChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCit7CisJdTY0IG9sZF9tYXNrOworCisJb2xkX21hc2sgPSBpbl9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10pOworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5pbnRfbWFza19SV1tjbGFzc10sIG9sZF9tYXNrICYgbWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGludF9tYXNrX29yKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKK3sKKwl1NjQgb2xkX21hc2s7CisKKwlvbGRfbWFzayA9IGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSk7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSwgb2xkX21hc2sgfCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgaW50X21hc2tfc2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X21hc2tfUldbY2xhc3NdLCBtYXNrKTsKK30KKworc3RhdGljIHU2NCBpbnRfbWFza19nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9tYXNrX1JXW2NsYXNzXSk7Cit9CisKK3N0YXRpYyB2b2lkIGludF9zdGF0X2NsZWFyKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgc3RhdCkKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X3N0YXRfUldbY2xhc3NdLCBzdGF0KTsKK30KKworc3RhdGljIHU2NCBpbnRfc3RhdF9nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPmludF9zdGF0X1JXW2NsYXNzXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNwdV9hZmZpbml0eV9zZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY3B1KQoreworCXU2NCB0YXJnZXQgPSBpaWNfZ2V0X3RhcmdldF9pZChjcHUpOworCXU2NCByb3V0ZSA9IHRhcmdldCA8PCA0OCB8IHRhcmdldCA8PCAzMiB8IHRhcmdldCA8PCAxNjsKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+aW50X3JvdXRlX1JXLCByb3V0ZSk7Cit9CisKK3N0YXRpYyB1NjQgbWZjX2Rhcl9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5tZmNfZGFyX1JXKTsKK30KKworc3RhdGljIHU2NCBtZmNfZHNpc3JfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX2RzaXNyX1JXKTsKK30KKworc3RhdGljIHZvaWQgbWZjX2RzaXNyX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBkc2lzcikKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX2RzaXNyX1JXLCBkc2lzcik7Cit9CisKK3N0YXRpYyB2b2lkIG1mY19zZHJfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNkcikKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX3Nkcl9SVywgc2RyKTsKK30KKworc3RhdGljIHZvaWQgbWZjX3NyMV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc3IxKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5tZmNfc3IxX1JXLCBzcjEpOworfQorCitzdGF0aWMgdTY0IG1mY19zcjFfZ2V0KHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gaW5fYmU2NCgmc3B1LT5wcml2MS0+bWZjX3NyMV9SVyk7Cit9CisKK3N0YXRpYyB2b2lkIG1mY190Y2xhc3NfaWRfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHRjbGFzc19pZCkKK3sKKwlvdXRfYmU2NCgmc3B1LT5wcml2MS0+bWZjX3RjbGFzc19pZF9SVywgdGNsYXNzX2lkKTsKK30KKworc3RhdGljIHU2NCBtZmNfdGNsYXNzX2lkX2dldChzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJcmV0dXJuIGluX2JlNjQoJnNwdS0+cHJpdjEtPm1mY190Y2xhc3NfaWRfUlcpOworfQorCitzdGF0aWMgdm9pZCB0bGJfaW52YWxpZGF0ZShzdHJ1Y3Qgc3B1ICpzcHUpCit7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnRsYl9pbnZhbGlkYXRlX2VudHJ5X1csIDB1bCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgaWQpCit7CisJb3V0X2JlNjQoJnNwdS0+cHJpdjEtPnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9SVywgaWQpOworfQorCitzdGF0aWMgdTY0IHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfUlcpOworfQorCitzdGF0aWMgdm9pZCByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZW5hYmxlKQoreworCW91dF9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVywgZW5hYmxlKTsKK30KKworc3RhdGljIHU2NCByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBpbl9iZTY0KCZzcHUtPnByaXYxLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9SVyk7Cit9CisKK2NvbnN0IHN0cnVjdCBzcHVfcHJpdjFfb3BzIHNwdV9wcml2MV9tbWlvX29wcyA9Cit7CisJLmludF9tYXNrX2FuZCA9IGludF9tYXNrX2FuZCwKKwkuaW50X21hc2tfb3IgPSBpbnRfbWFza19vciwKKwkuaW50X21hc2tfc2V0ID0gaW50X21hc2tfc2V0LAorCS5pbnRfbWFza19nZXQgPSBpbnRfbWFza19nZXQsCisJLmludF9zdGF0X2NsZWFyID0gaW50X3N0YXRfY2xlYXIsCisJLmludF9zdGF0X2dldCA9IGludF9zdGF0X2dldCwKKwkuY3B1X2FmZmluaXR5X3NldCA9IGNwdV9hZmZpbml0eV9zZXQsCisJLm1mY19kYXJfZ2V0ID0gbWZjX2Rhcl9nZXQsCisJLm1mY19kc2lzcl9nZXQgPSBtZmNfZHNpc3JfZ2V0LAorCS5tZmNfZHNpc3Jfc2V0ID0gbWZjX2RzaXNyX3NldCwKKwkubWZjX3Nkcl9zZXQgPSBtZmNfc2RyX3NldCwKKwkubWZjX3NyMV9zZXQgPSBtZmNfc3IxX3NldCwKKwkubWZjX3NyMV9nZXQgPSBtZmNfc3IxX2dldCwKKwkubWZjX3RjbGFzc19pZF9zZXQgPSBtZmNfdGNsYXNzX2lkX3NldCwKKwkubWZjX3RjbGFzc19pZF9nZXQgPSBtZmNfdGNsYXNzX2lkX2dldCwKKwkudGxiX2ludmFsaWRhdGUgPSB0bGJfaW52YWxpZGF0ZSwKKwkucmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX3NldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQsCisJLnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9nZXQgPSByZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0LAorCS5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQgPSByZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQsCisJLnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCA9IHJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCwKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvTWFrZWZpbGUKaW5kZXggYTdjZGRmNC4uYmI1ZGM2MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKK29iai15ICs9IHN3aXRjaC5vCisKIG9iai0kKENPTkZJR19TUFVfRlMpICs9IHNwdWZzLm8KLXNwdWZzLXkgKz0gaW5vZGUubyBmaWxlLm8gY29udGV4dC5vIHN3aXRjaC5vIHN5c2NhbGxzLm8KK3NwdWZzLXkgKz0gaW5vZGUubyBmaWxlLm8gY29udGV4dC5vIHN5c2NhbGxzLm8KIHNwdWZzLXkgKz0gc2NoZWQubyBiYWNraW5nX29wcy5vIGh3X29wcy5vIHJ1bi5vCiAKICMgUnVsZXMgdG8gYnVpbGQgc3dpdGNoLm8gd2l0aCB0aGUgaGVscCBvZiBTUFUgdG9vbCBjaGFpbgpAQCAtOCwxMSArMTAsMTQgQEAKIFNQVV9BUwkJOj0gJChTUFVfQ1JPU1MpZ2NjCiBTUFVfTEQJCTo9ICQoU1BVX0NST1NTKWxkCiBTUFVfT0JKQ09QWQk6PSAkKFNQVV9DUk9TUylvYmpjb3B5Ci1TUFVfQ0ZMQUdTCTo9IC1PMiAtV2FsbCAtSSQoc3JjdHJlZSkvaW5jbHVkZSAtSSQob2JqdHJlZSkvaW5jbHVkZTIKLVNQVV9BRkxBR1MJOj0gLWMgLURfX0FTU0VNQkxZX18gLUkkKHNyY3RyZWUpL2luY2x1ZGUgLUkkKG9ianRyZWUpL2luY2x1ZGUyCitTUFVfQ0ZMQUdTCTo9IC1PMiAtV2FsbCAtSSQoc3JjdHJlZSkvaW5jbHVkZSBcCisJCSAgIC1JJChvYmp0cmVlKS9pbmNsdWRlMiAtRF9fS0VSTkVMX18KK1NQVV9BRkxBR1MJOj0gLWMgLURfX0FTU0VNQkxZX18gLUkkKHNyY3RyZWUpL2luY2x1ZGUgXAorCQkgICAtSSQob2JqdHJlZSkvaW5jbHVkZTIgLURfX0tFUk5FTF9fCiBTUFVfTERGTEFHUwk6PSAtTiAtVHRleHQ9MHgwCiAKICQob2JqKS9zd2l0Y2gubzogJChvYmopL3NwdV9zYXZlX2R1bXAuaCAkKG9iaikvc3B1X3Jlc3RvcmVfZHVtcC5oCitjbGVhbi1maWxlcyA6PSBzcHVfc2F2ZV9kdW1wLmggc3B1X3Jlc3RvcmVfZHVtcC5oCiAKICMgQ29tcGlsZSBTUFUgZmlsZXMKICAgICAgIGNtZF9zcHVfY2MgPSAkKFNQVV9DQykgJChTUFVfQ0ZMQUdTKSAtYyAtbyAkQCAkPApAQCAtNDUsNyArNTAsOCBAQAogCQllY2hvICIgKiBIZXgtZHVtcCBhdXRvIGdlbmVyYXRlZCBmcm9tICQqLmMuIiA7IFwKIAkJZWNobyAiICogRG8gbm90IGVkaXQhIiA7IFwKIAkJZWNobyAiICovIiA7IFwKLQkJZWNobyAic3RhdGljIHVuc2lnbmVkIGludCAkKl9jb2RlW10gX19wYWdlX2FsaWduZWQgPSB7IiA7IFwKKwkJZWNobyAic3RhdGljIHVuc2lnbmVkIGludCAkKl9jb2RlW10gIiBcCisJCQkiX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMTI4KSkpID0geyIgOyBcCiAJCWhleGR1bXAgLXYgLWUgJyIweCIgNC8xICIlMDJ4IiAiLCIgIlxuIicgJDwgOyBcCiAJCWVjaG8gIn07IiA7IFwKIAkJKSA+ICRACmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2NvbnRleHQuYwppbmRleCA4YmIzM2FiLi4zNjQzOWM1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvY29udGV4dC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9jb250ZXh0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBzcHVfY29udGV4dCAqYWxsb2Nfc3B1X2NvbnRleHQodm9pZCkKIHsKIAlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKLQljdHggPSBrbWFsbG9jKHNpemVvZiAqY3R4LCBHRlBfS0VSTkVMKTsKKwljdHggPSBremFsbG9jKHNpemVvZiAqY3R4LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWN0eCkKIAkJZ290byBvdXQ7CiAJLyogQmluZGluZyB0byBwaHlzaWNhbCBwcm9jZXNzb3IgZGVmZXJyZWQKQEAgLTQ4LDE3ICs0OCw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT53Ym94X3dxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPnN0b3Bfd3EpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+bWZjX3dxKTsKLQljdHgtPmlib3hfZmFzeW5jID0gTlVMTDsKLQljdHgtPndib3hfZmFzeW5jID0gTlVMTDsKLQljdHgtPm1mY19mYXN5bmMgPSBOVUxMOwotCWN0eC0+bWZjID0gTlVMTDsKLQljdHgtPnRhZ3dhaXQgPSAwOwogCWN0eC0+c3RhdGUgPSBTUFVfU1RBVEVfU0FWRUQ7Ci0JY3R4LT5sb2NhbF9zdG9yZSA9IE5VTEw7Ci0JY3R4LT5jbnRsID0gTlVMTDsKLQljdHgtPnNpZ25hbDEgPSBOVUxMOwotCWN0eC0+c2lnbmFsMiA9IE5VTEw7Ci0JY3R4LT5zcHUgPSBOVUxMOwogCWN0eC0+b3BzID0gJnNwdV9iYWNraW5nX29wczsKIAljdHgtPm93bmVyID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CiAJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2ZpbGUuYwppbmRleCAzNjYxODVlLi44MGMwMjY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvZmlsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9maWxlLmMKQEAgLTgyNSw2ICs4MjUsNTUgQEAKIAkJCQkJc3B1ZnNfc2lnbmFsMl90eXBlX3NldCwgIiVsbHUiKTsKIAogI2lmZGVmIENPTkZJR19TUFVGU19NTUFQCitzdGF0aWMgc3RydWN0IHBhZ2UgKnNwdWZzX21zc19tbWFwX25vcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgKnR5cGUpCit7CisJcmV0dXJuIHNwdWZzX3BzX25vcGFnZSh2bWEsIGFkZHJlc3MsIHR5cGUsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3Qgc3B1ZnNfbXNzX21tYXBfdm1vcHMgPSB7CisJLm5vcGFnZSA9IHNwdWZzX21zc19tbWFwX25vcGFnZSwKK307CisKKy8qCisgKiBtbWFwIHN1cHBvcnQgZm9yIHByb2JsZW0gc3RhdGUgTUZDIERNQSBhcmVhIFsweDAwMDAgLSAweDBmZmZdLgorICogTWFwcGluZyB0aGlzIGFyZWEgcmVxdWlyZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gaGF2ZSBDQVBfU1lTX1JBV0lPLAorICogYXMgdGhlc2UgcmVnaXN0ZXJzIHJlcXVpcmUgc3BlY2lhbCBjYXJlIHdoZW4gcmVhZC93cml0aW5nLgorICovCitzdGF0aWMgaW50IHNwdWZzX21zc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SQVdJTykpCisJCXJldHVybiAtRVBFUk07CisKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworCXZtYS0+dm1fcGFnZV9wcm90ID0gX19wZ3Byb3QocGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkKKwkJCQkgICAgIHwgX1BBR0VfTk9fQ0FDSEUpOworCisJdm1hLT52bV9vcHMgPSAmc3B1ZnNfbXNzX21tYXBfdm1vcHM7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzcHVmc19tc3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3B1ZnNfaW5vZGVfaW5mbyAqaSA9IFNQVUZTX0koaW5vZGUpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaS0+aV9jdHg7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcHVmc19tc3NfZm9wcyA9IHsKKwkub3BlbgkgPSBzcHVmc19tc3Nfb3BlbiwKKyNpZmRlZiBDT05GSUdfU1BVRlNfTU1BUAorCS5tbWFwCSA9IHNwdWZzX21zc19tbWFwLAorI2VuZGlmCit9OworCisKKyNpZmRlZiBDT05GSUdfU1BVRlNfTU1BUAogc3RhdGljIHN0cnVjdCBwYWdlICpzcHVmc19tZmNfbW1hcF9ub3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQogewpAQCAtMTI3OSw2ICsxMzI4LDIyIEBACiBERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19zcnIwX29wcywgc3B1ZnNfc3JyMF9nZXQsIHNwdWZzX3NycjBfc2V0LAogCQkJIiVsbHhcbiIpCiAKK3N0YXRpYyB1NjQgc3B1ZnNfaWRfZ2V0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHggPSBkYXRhOworCXU2NCBudW07CisKKwlzcHVfYWNxdWlyZShjdHgpOworCWlmIChjdHgtPnN0YXRlID09IFNQVV9TVEFURV9SVU5OQUJMRSkKKwkJbnVtID0gY3R4LT5zcHUtPm51bWJlcjsKKwllbHNlCisJCW51bSA9ICh1bnNpZ25lZCBpbnQpLTE7CisJc3B1X3JlbGVhc2UoY3R4KTsKKworCXJldHVybiBudW07Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShzcHVmc19pZF9vcHMsIHNwdWZzX2lkX2dldCwgMCwgIjB4JWxseFxuIikKKwogc3RydWN0IHRyZWVfZGVzY3Igc3B1ZnNfZGlyX2NvbnRlbnRzW10gPSB7CiAJeyAibWVtIiwgICZzcHVmc19tZW1fZm9wcywgIDA2NjYsIH0sCiAJeyAicmVncyIsICZzcHVmc19yZWdzX2ZvcHMsICAwNjY2LCB9LApAQCAtMTI5Miw2ICsxMzU3LDcgQEAKIAl7ICJzaWduYWwyIiwgJnNwdWZzX3NpZ25hbDJfZm9wcywgMDY2NiwgfSwKIAl7ICJzaWduYWwxX3R5cGUiLCAmc3B1ZnNfc2lnbmFsMV90eXBlLCAwNjY2LCB9LAogCXsgInNpZ25hbDJfdHlwZSIsICZzcHVmc19zaWduYWwyX3R5cGUsIDA2NjYsIH0sCisJeyAibXNzIiwgJnNwdWZzX21zc19mb3BzLCAwNjY2LCB9LAogCXsgIm1mYyIsICZzcHVmc19tZmNfZm9wcywgMDY2NiwgfSwKIAl7ICJjbnRsIiwgJnNwdWZzX2NudGxfZm9wcywgIDA2NjYsIH0sCiAJeyAibnBjIiwgJnNwdWZzX25wY19vcHMsIDA2NjYsIH0sCkBAIC0xMzAxLDUgKzEzNjcsNiBAQAogCXsgInNwdV90YWdfbWFzayIsICZzcHVmc19zcHVfdGFnX21hc2tfb3BzLCAwNjY2LCB9LAogCXsgImV2ZW50X21hc2siLCAmc3B1ZnNfZXZlbnRfbWFza19vcHMsIDA2NjYsIH0sCiAJeyAic3JyMCIsICZzcHVmc19zcnIwX29wcywgMDY2NiwgfSwKKwl7ICJwaHlzLWlkIiwgJnNwdWZzX2lkX29wcywgMDY2NiwgfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaHdfb3BzLmMKaW5kZXggYTEzYThiNS4uZWRlMmNhYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL2h3X29wcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9od19vcHMuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NwdS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgInNwdWZzLmgiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvaW5vZGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCmluZGV4IGQ5NTU0MTkuLjdiNDU3MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9pbm9kZS5jCkBAIC0xNTcsMjAgKzE1NywxMiBAQAogCW11dGV4X3VubG9jaygmZGlyLT5kX2lub2RlLT5pX211dGV4KTsKIH0KIAorLyogQ2FsbGVyIG11c3QgaG9sZCByb290LT5pX211dGV4ICovCiBzdGF0aWMgaW50IHNwdWZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqcm9vdCwgc3RydWN0IGRlbnRyeSAqZGlyX2RlbnRyeSkKIHsKLQlzdHJ1Y3Qgc3B1X2NvbnRleHQgKmN0eDsKLQogCS8qIHJlbW92ZSBhbGwgZW50cmllcyAqLwotCW11dGV4X2xvY2soJnJvb3QtPmlfbXV0ZXgpOwogCXNwdWZzX3BydW5lX2RpcihkaXJfZGVudHJ5KTsKLQltdXRleF91bmxvY2soJnJvb3QtPmlfbXV0ZXgpOwogCi0JLyogV2UgaGF2ZSB0byBnaXZlIHVwIHRoZSBtbV9zdHJ1Y3QgKi8KLQljdHggPSBTUFVGU19JKGRpcl9kZW50cnktPmRfaW5vZGUpLT5pX2N0eDsKLQlzcHVfZm9yZ2V0KGN0eCk7Ci0KLQkvKiBYWFggRG8gd2UgbmVlZCB0byBob2xkIGlfbXV0ZXggaGVyZSA/ICovCiAJcmV0dXJuIHNpbXBsZV9ybWRpcihyb290LCBkaXJfZGVudHJ5KTsKIH0KIApAQCAtMTk5LDE2ICsxOTEsMjMgQEAKIAogc3RhdGljIGludCBzcHVmc19kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJc3RydWN0IHNwdV9jb250ZXh0ICpjdHg7CiAJc3RydWN0IGlub2RlICpkaXI7CiAJc3RydWN0IGRlbnRyeSAqZGVudHJ5OwogCWludCByZXQ7CiAKIAlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKIAlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWN0eCA9IFNQVUZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9jdHg7CiAKKwltdXRleF9sb2NrKCZkaXItPmlfbXV0ZXgpOwogCXJldCA9IHNwdWZzX3JtZGlyKGRpciwgZGVudHJ5KTsKKwltdXRleF91bmxvY2soJmRpci0+aV9tdXRleCk7CiAJV0FSTl9PTihyZXQpOwogCisJLyogV2UgaGF2ZSB0byBnaXZlIHVwIHRoZSBtbV9zdHJ1Y3QgKi8KKwlzcHVfZm9yZ2V0KGN0eCk7CisKIAlyZXR1cm4gZGNhY2hlX2Rpcl9jbG9zZShpbm9kZSwgZmlsZSk7CiB9CiAKQEAgLTMwNSw2ICszMDQsMTAgQEAKIAkgICAgbmQtPmRlbnRyeSAhPSBuZC0+ZGVudHJ5LT5kX3NiLT5zX3Jvb3QpCiAJCWdvdG8gb3V0OwogCisJLyogYWxsIGZsYWdzIGFyZSByZXNlcnZlZCAqLworCWlmIChmbGFncykKKwkJZ290byBvdXQ7CisKIAlkZW50cnkgPSBsb29rdXBfY3JlYXRlKG5kLCAxKTsKIAlyZXQgPSBQVFJfRVJSKGRlbnRyeSk7CiAJaWYgKElTX0VSUihkZW50cnkpKQpAQCAtMzI0LDggKzMyNywxMyBAQAogCSAqIGluIGVycm9yIHBhdGggb2YgKl9vcGVuKCkuCiAJICovCiAJcmV0ID0gc3B1ZnNfY29udGV4dF9vcGVuKGRnZXQoZGVudHJ5KSwgbW50Z2V0KG5kLT5tbnQpKTsKLQlpZiAocmV0IDwgMCkKLQkJc3B1ZnNfcm1kaXIobmQtPmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwlpZiAocmV0IDwgMCkgeworCQlXQVJOX09OKHNwdWZzX3JtZGlyKG5kLT5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSkpOworCQltdXRleF91bmxvY2soJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCQlzcHVfZm9yZ2V0KFNQVUZTX0koZGVudHJ5LT5kX2lub2RlKS0+aV9jdHgpOworCQlkcHV0KGRlbnRyeSk7CisJCWdvdG8gb3V0OworCX0KIAogb3V0X2RwdXQ6CiAJZHB1dChkZW50cnkpOwpAQCAtNDI4LDExICs0MzYsMTEgQEAKIAlyZXR1cm4gc3B1ZnNfY3JlYXRlX3Jvb3Qoc2IsIGRhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK3N0YXRpYyBpbnQKIHNwdWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnN0eXBlLCBpbnQgZmxhZ3MsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCisJCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzdHlwZSwgZmxhZ3MsIGRhdGEsIHNwdWZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzdHlwZSwgZmxhZ3MsIGRhdGEsIHNwdWZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzcHVmc190eXBlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NjaGVkLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwppbmRleCBiZjY1MmNkLi4zZGNjNWQ4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc2NoZWQuYwpAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9zcHUuaD4KICNpbmNsdWRlIDxhc20vc3B1X2NzYS5oPgorI2luY2x1ZGUgPGFzbS9zcHVfcHJpdjEuaD4KICNpbmNsdWRlICJzcHVmcy5oIgogCiAjZGVmaW5lIFNQVV9NSU5fVElNRVNMSUNFIAkoMTAwICogSFogLyAxMDAwKQpAQCAtMzYzLDcgKzM2NCw3IEBACiAJICogV2UncmUgbGlrZWx5IHRvIHdhaXQgZm9yIGludGVycnVwdHMgb24gdGhlIHNhbWUKIAkgKiBDUFUgdGhhdCB3ZSBhcmUgbm93IG9uLCBzbyBzZW5kIHRoZW0gaGVyZS4KIAkgKi8KLQlzcHVfaXJxX3NldGFmZmluaXR5KHNwdSwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3B1X2NwdV9hZmZpbml0eV9zZXQoc3B1LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlwdXRfYWN0aXZlX3NwdShzcHUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlX2R1bXAuaF9zaGlwcGVkIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9yZXN0b3JlX2R1bXAuaF9zaGlwcGVkCmluZGV4IDFiMjM1NWYuLjE1MTgzZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfcmVzdG9yZV9kdW1wLmhfc2hpcHBlZAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3Jlc3RvcmVfZHVtcC5oX3NoaXBwZWQKQEAgLTMsMjI5ICszLDkwMSBAQAogICogSGV4LWR1bXAgYXV0byBnZW5lcmF0ZWQgZnJvbSBzcHVfcmVzdG9yZS5jLgogICogRG8gbm90IGVkaXQhCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X3Jlc3RvcmVfY29kZVtdIF9fcGFnZV9hbGlnbmVkID0gewotMHg0MDgwMDAwMCwgMHg0MDlmZjgwMSwgMHgyNDAwMDA4MCwgMHgyNGZkODA4MSwKLTB4MWNkODAwODEsIDB4MzMwMDExODAsIDB4NDIwMzAwMDMsIDB4MzM4MDAyODQsCi0weDFjMDEwMjA0LCAweDQwMjAwMDAwLCAweDQwMjAwMDAwLCAweDQwMjAwMDAwLAotMHgzNDAwMDE5MCwgMHgzNDAwNDE5MSwgMHgzNDAwODE5MiwgMHgzNDAwYzE5MywKLTB4MTQxZmMyMDUsIDB4MjNmZmZkODQsIDB4MWMxMDAxODMsIDB4MjE3ZmZhODUsCi0weDMwODBhMDAwLCAweDMwODBhMjAxLCAweDMwODBhNDAyLCAweDMwODBhNjAzLAotMHgzMDgwYTgwNCwgMHgzMDgwYWEwNSwgMHgzMDgwYWMwNiwgMHgzMDgwYWUwNywKLTB4MzA4MGIwMDgsIDB4MzA4MGIyMDksIDB4MzA4MGI0MGEsIDB4MzA4MGI2MGIsCi0weDMwODBiODBjLCAweDMwODBiYTBkLCAweDMwODBiYzBlLCAweDMwODBiZTBmLAotMHgwMDAwM2ZmYywgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDFhMDAxODIsIDB4M2VjMDAwODMsIDB4YjBhMTQxMDMsIDB4MDFhMDAyMDQsCi0weDNlYzEwMDgyLCAweDQyMDI4MDBlLCAweDA0MDAwNzAzLCAweGIwYTE0MjAyLAotMHgyMWEwMDgwMywgMHgzZmJmMDI4ZCwgMHgzZjIwMDY4ZCwgMHgzZmJlMDY4MiwKLTB4M2ZlMzAxMDIsIDB4MjFhMDA4ODIsIDB4M2Y4MjAyOGYsIDB4M2ZlMzA3OGYsCi0weDNmYmYwNzg0LCAweDNmMjAwMjA0LCAweDNmYmUwMjA0LCAweDNmZTMwMjA0LAotMHgwNDAwMDIwMywgMHgyMWEwMDkwMywgMHg0MDg0ODAwMiwgMHgyMWEwMDk4MiwKLTB4NDA4MDAwMDMsIDB4MjFhMDBhMDMsIDB4NDA4MDIwMDIsIDB4MjFhMDBhODIsCi0weDIxYTAwMDgzLCAweDQwODAwMDgyLCAweDIxYTAwYjAyLCAweDEwMDAyODE4LAotMHg0MGE4MDAwMiwgMHgzMjgwMDAwNywgMHg0MjA3MDAwYywgMHgxODAwODIwOCwKLTB4NDBhMDAwMGIsIDB4NDA4MDAyMGEsIDB4NDA4MDA3MDksIDB4MDAyMDAwMDAsCi0weDQyMDcwMDAyLCAweDNhYzMwMzg0LCAweDFjZmZjNDg5LCAweDAwMjAwMDAwLAotMHgxODAwODM4MywgMHgzODgzMDM4MiwgMHg0Y2ZmYzQ4NiwgMHgzYWMyODE4NSwKLTB4YjA0MDg1ODQsIDB4Mjg4MzAzODIsIDB4MWMwMjAzODcsIDB4Mzg4MjgxODIsCi0weGIwNDA4NDA1LCAweDE4MDJjNDA4LCAweDI4ODI4MTgyLCAweDIxN2ZmODg2LAotMHgwNDAwMDU4MywgMHgyMWEwMDgwMywgMHgzZmJlMDY4MiwgMHgzZmUzMDEwMiwKLTB4MDQwMDAxMDYsIDB4MjFhMDA4ODYsIDB4MDQwMDA2MDMsIDB4MjFhMDA5MDMsCi0weDQwODAzYzAyLCAweDIxYTAwOTgyLCAweDQwODAwMDAzLCAweDA0MDAwMTg0LAotMHgyMWEwMGEwNCwgMHg0MDgwMjIwMiwgMHgyMWEwMGE4MiwgMHg0MjAyODAwNSwKLTB4MzQyMDg3MDIsIDB4MjEwMDIyODIsIDB4MjFhMDA4MDQsIDB4MjFhMDA4ODYsCi0weDNmYmYwNzgyLCAweDNmMjAwMTAyLCAweDNmYmUwMTAyLCAweDNmZTMwMTAyLAotMHgyMWEwMDkwMiwgMHg0MDgwNDAwMywgMHgyMWEwMDk4MywgMHgyMWEwMGEwNCwKLTB4NDA4MDVhMDIsIDB4MjFhMDBhODIsIDB4NDA4MDAwODMsIDB4MjFhMDBiODMsCi0weDAxYTAwYzAyLCAweDAxYTAwZDgzLCAweDM0MjBjMjgyLCAweDIxYTAwZTAyLAotMHgzNDIxMDI4MywgMHgyMWEwMGYwMywgMHgzNDIwMDI4NCwgMHg3NzQwMDIwMCwKLTB4MzQyMWMyODIsIDB4MjFhMDA3MDIsIDB4MzQyMTgyODMsIDB4MjFhMDAwODMsCi0weDM0MjE0MjgyLCAweDIxYTAwYjAyLCAweDQyMDA0ODBjLCAweDAwMjAwMDAwLAotMHgxYzAxMDI4NiwgMHgzNDIyMDI4NCwgMHgzNDIyMDMwMiwgMHgwZjYwODIwMywKLTB4NWMwMjQyMDQsIDB4M2I4MTgxMGIsIDB4NDIwMTNjMDIsIDB4MDAyMDAwMDAsCi0weDE4MDA4MTg1LCAweDM4ODA4MTgzLCAweDNiODE0MTgyLCAweDIxMDA0ZTg0LAotMHg0MDIwMDA3ZiwgMHgzNTAwMDEwMCwgMHgwMDAwMDRlMCwgMHgwMDAwMDJhMCwKLTB4MDAwMDAyZTgsIDB4MDAwMDA0MjgsIDB4MDAwMDAzNjAsIDB4MDAwMDAyZTgsCi0weDAwMDAwNGEwLCAweDAwMDAwNDY4LCAweDAwMDAwM2M4LCAweDAwMDAwMzYwLAotMHg0MDlmZmUwMiwgMHgzMDgwMTIwMywgMHg0MDgwMDIwNCwgMHgzZWM0MDA4NSwKLTB4MTAwMDljMDksIDB4M2FjMTA2MDYsIDB4YjA2MGMxMDUsIDB4NDAyMDAwN2YsCi0weDQwMjAwMDdmLCAweDIwODAxMjAzLCAweDM4ODEwNjAyLCAweGIwNDA4NTg2LAotMHgyODgxMDYwMiwgMHgzMjAwNDE4MCwgMHgzNDIwNDcwMiwgMHgyMWEwMDM4MiwKLTB4NDAyMDAwN2YsIDB4MzI3ZmRjODAsIDB4NDA5ZmZlMDIsIDB4MzA4MDEyMDMsCi0weDQwODAwMjA0LCAweDNlYzQwMDg3LCAweDQwODAwNDA1LCAweDAwMjAwMDAwLAotMHg0MDgwMDYwNiwgMHgzYWMxMDYwOCwgMHgzYWMxNDYwOSwgMHgzYWMxODYwYSwKLTB4YjA2MGMxMDcsIDB4MjA4MDEyMDMsIDB4NDEwMDQwMDMsIDB4Mzg4MTA2MDIsCi0weDQwMjAwMDdmLCAweGIwNDA4MTg4LCAweDQwMjAwMDdmLCAweDI4ODEwNjAyLAotMHg0MTIwMTAwMiwgMHgzODgxNDYwMywgMHgxMDAwOWMwOSwgMHhiMDYwYzEwOSwKLTB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsIDB4NDExOTNmODMsIDB4Mzg4MTg2MDIsCi0weDYwZmZjMDAzLCAweGIwNDA4MThhLCAweDI4ODE4NjAyLCAweDMyMDAzMDgwLAotMHg0MDlmZmUwMiwgMHgzMDgwMTIwMywgMHg0MDgwMDIwNCwgMHgzZWM0MDA4NywKLTB4NDEyMDEwMDgsIDB4MTAwMDljMTQsIDB4NDA4MDA0MDUsIDB4M2FjMTA2MDksCi0weDQwODAwNjA2LCAweDNhYzE0NjBhLCAweGIwNjBjMTA3LCAweDNhYzE4NjBiLAotMHgyMDgwMTIwMywgMHgzODgxMDYwMiwgMHhiMDQwODQwOSwgMHgyODgxMDYwMiwKLTB4Mzg4MTQ2MDMsIDB4YjA2MGM0MGEsIDB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsCi0weDQxMTkzZjgzLCAweDM4ODE4NjAyLCAweDYwZmZjMDAzLCAweGIwNDA4MThiLAotMHgyODgxODYwMiwgMHgzMjAwMjM4MCwgMHg0MDlmZmUwMiwgMHgzMDgwMTIwNCwKLTB4NDA4MDAyMDUsIDB4M2VjNDAwODMsIDB4NDA4MDA0MDYsIDB4M2FjMTQ2MDcsCi0weDNhYzE4NjA4LCAweGIwODEwMTAzLCAweDQxMDA0MDAyLCAweDIwODAxMjA0LAotMHg0MDIwMDA3ZiwgMHgzODgxNDYwMywgMHgxMDAwOWMwYiwgMHhiMDYwYzEwNywKLTB4NDAyMDAwN2YsIDB4NDAyMDAwN2YsIDB4Mjg4MTQ2MDMsIDB4Mzg4MTg2MDIsCi0weDQwMjAwMDdmLCAweDQwMjAwMDdmLCAweGIwNDA4NTg4LCAweDI4ODE4NjAyLAotMHg0MDIwMDA3ZiwgMHgzMjAwMTc4MCwgMHg0MDlmZmUwMiwgMHgxMDAwNjQwZSwKLTB4NDA4MDAyMDQsIDB4MzA4MDEyMDMsIDB4NDA4MDA0MDUsIDB4M2VjNDAwODcsCi0weDQwODAwNjA2LCAweDNhYzEwNjA4LCAweDNhYzE0NjA5LCAweDNhYzE4NjBhLAotMHhiMDYwYzEwNywgMHgyMDgwMTIwMywgMHg0MTNkODAwMywgMHgzODgxMDYwMiwKLTB4NDAyMDAwN2YsIDB4MzI3ZmQ3ODAsIDB4NDA5ZmZlMDIsIDB4MTAwMDdmMGMsCi0weDQwODAwMjA1LCAweDMwODAxMjA0LCAweDQwODAwNDA2LCAweDNlYzQwMDgzLAotMHgzYWMxNDYwNywgMHgzYWMxODYwOCwgMHhiMDgxMDEwMywgMHg0MTNkODAwMiwKLTB4MjA4MDEyMDQsIDB4Mzg4MTQ2MDMsIDB4NDAyMDAwN2YsIDB4MzI3ZmViODAsCi0weDQwOWZmZTAyLCAweDMwODAxMjAzLCAweDQwODAwMjA0LCAweDNlYzQwMDg3LAotMHg0MDgwMDQwNSwgMHgxMDAwNjUwYSwgMHg0MDgwMDYwNiwgMHgzYWMxMDYwOCwKLTB4M2FjMTQ2MDksIDB4M2FjMTg2MGEsIDB4YjA2MGMxMDcsIDB4MjA4MDEyMDMsCi0weDM4ODEwNjAyLCAweGIwNDA4NTg4LCAweDQwMjAwMDdmLCAweDMyN2ZjOTgwLAotMHgwMDQwMDAwMCwgMHg0MDgwMDAwMywgMHg0MDIwMDA3ZiwgMHgzNTAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCitzdGF0aWMgdW5zaWduZWQgaW50IHNwdV9yZXN0b3JlX2NvZGVbXSAgX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMTI4KSkpID0geworMHg0MDgwMDAwMCwKKzB4NDA5ZmY4MDEsCisweDI0MDAwMDgwLAorMHgyNGZkODA4MSwKKzB4MWNkODAwODEsCisweDMzMDAxMTgwLAorMHg0MjAzMDAwMywKKzB4MzM4MDAyODQsCisweDFjMDEwMjA0LAorMHg0MDIwMDAwMCwKKzB4NDAyMDAwMDAsCisweDQwMjAwMDAwLAorMHgzNDAwMDE5MCwKKzB4MzQwMDQxOTEsCisweDM0MDA4MTkyLAorMHgzNDAwYzE5MywKKzB4MTQxZmMyMDUsCisweDIzZmZmZDg0LAorMHgxYzEwMDE4MywKKzB4MjE3ZmZhODUsCisweDMwODBhMDAwLAorMHgzMDgwYTIwMSwKKzB4MzA4MGE0MDIsCisweDMwODBhNjAzLAorMHgzMDgwYTgwNCwKKzB4MzA4MGFhMDUsCisweDMwODBhYzA2LAorMHgzMDgwYWUwNywKKzB4MzA4MGIwMDgsCisweDMwODBiMjA5LAorMHgzMDgwYjQwYSwKKzB4MzA4MGI2MGIsCisweDMwODBiODBjLAorMHgzMDgwYmEwZCwKKzB4MzA4MGJjMGUsCisweDMwODBiZTBmLAorMHgwMDAwM2ZmYywKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDFhMDAxODIsCisweDNlYzAwMDgzLAorMHhiMGExNDEwMywKKzB4MDFhMDAyMDQsCisweDNlYzEwMDgyLAorMHg0MjAyODAwZSwKKzB4MDQwMDA3MDMsCisweGIwYTE0MjAyLAorMHgyMWEwMDgwMywKKzB4M2ZiZjAyOGQsCisweDNmMjAwNjhkLAorMHgzZmJlMDY4MiwKKzB4M2ZlMzAxMDIsCisweDIxYTAwODgyLAorMHgzZjgyMDI4ZiwKKzB4M2ZlMzA3OGYsCisweDNmYmYwNzg0LAorMHgzZjIwMDIwNCwKKzB4M2ZiZTAyMDQsCisweDNmZTMwMjA0LAorMHgwNDAwMDIwMywKKzB4MjFhMDA5MDMsCisweDQwODQ4MDAyLAorMHgyMWEwMDk4MiwKKzB4NDA4MDAwMDMsCisweDIxYTAwYTAzLAorMHg0MDgwMjAwMiwKKzB4MjFhMDBhODIsCisweDIxYTAwMDgzLAorMHg0MDgwMDA4MiwKKzB4MjFhMDBiMDIsCisweDEwMDAyODE4LAorMHg0MmEwMDAwMiwKKzB4MzI4MDAwMDcsCisweDQyMDcwMDBjLAorMHgxODAwODIwOCwKKzB4NDBhMDAwMGIsCisweDQwODAwMjBhLAorMHg0MDgwMDcwOSwKKzB4MDAyMDAwMDAsCisweDQyMDcwMDAyLAorMHgzYWMzMDM4NCwKKzB4MWNmZmM0ODksCisweDAwMjAwMDAwLAorMHgxODAwODM4MywKKzB4Mzg4MzAzODIsCisweDRjZmZjNDg2LAorMHgzYWMyODE4NSwKKzB4YjA0MDg1ODQsCisweDI4ODMwMzgyLAorMHgxYzAyMDM4NywKKzB4Mzg4MjgxODIsCisweGIwNDA4NDA1LAorMHgxODAyYzQwOCwKKzB4Mjg4MjgxODIsCisweDIxN2ZmODg2LAorMHgwNDAwMDU4MywKKzB4MjFhMDA4MDMsCisweDNmYmUwNjgyLAorMHgzZmUzMDEwMiwKKzB4MDQwMDAxMDYsCisweDIxYTAwODg2LAorMHgwNDAwMDYwMywKKzB4MjFhMDA5MDMsCisweDQwODAzYzAyLAorMHgyMWEwMDk4MiwKKzB4NDA4MDAwMDMsCisweDA0MDAwMTg0LAorMHgyMWEwMGEwNCwKKzB4NDA4MDIyMDIsCisweDIxYTAwYTgyLAorMHg0MjAyODAwNSwKKzB4MzQyMDg3MDIsCisweDIxMDAyMjgyLAorMHgyMWEwMDgwNCwKKzB4MjFhMDA4ODYsCisweDNmYmYwNzgyLAorMHgzZjIwMDEwMiwKKzB4M2ZiZTAxMDIsCisweDNmZTMwMTAyLAorMHgyMWEwMDkwMiwKKzB4NDA4MDQwMDMsCisweDIxYTAwOTgzLAorMHgyMWEwMGEwNCwKKzB4NDA4MDVhMDIsCisweDIxYTAwYTgyLAorMHg0MDgwMDA4MywKKzB4MjFhMDBiODMsCisweDAxYTAwYzAyLAorMHgwMWEwMGQ4MywKKzB4MzQyMGMyODIsCisweDIxYTAwZTAyLAorMHgzNDIxMDI4MywKKzB4MjFhMDBmMDMsCisweDM0MjAwMjg0LAorMHg3NzQwMDIwMCwKKzB4MzQyMWMyODIsCisweDIxYTAwNzAyLAorMHgzNDIxODI4MywKKzB4MjFhMDAwODMsCisweDM0MjE0MjgyLAorMHgyMWEwMGIwMiwKKzB4NDIwMDQ4MGMsCisweDAwMjAwMDAwLAorMHgxYzAxMDI4NiwKKzB4MzQyMjAyODQsCisweDM0MjIwMzAyLAorMHgwZjYwODIwMywKKzB4NWMwMjQyMDQsCisweDNiODE4MTBiLAorMHg0MjAxM2MwMiwKKzB4MDAyMDAwMDAsCisweDE4MDA4MTg1LAorMHgzODgwODE4MywKKzB4M2I4MTQxODIsCisweDIxMDA0ZTg0LAorMHg0MDIwMDA3ZiwKKzB4MzUwMDAxMDAsCisweDAwMDAwNGUwLAorMHgwMDAwMDJhMCwKKzB4MDAwMDAyZTgsCisweDAwMDAwNDI4LAorMHgwMDAwMDM2MCwKKzB4MDAwMDAyZTgsCisweDAwMDAwNGEwLAorMHgwMDAwMDQ2OCwKKzB4MDAwMDAzYzgsCisweDAwMDAwMzYwLAorMHg0MDlmZmUwMiwKKzB4MzA4MDEyMDMsCisweDQwODAwMjA0LAorMHgzZWM0MDA4NSwKKzB4MTAwMDljMDksCisweDNhYzEwNjA2LAorMHhiMDYwYzEwNSwKKzB4NDAyMDAwN2YsCisweDQwMjAwMDdmLAorMHgyMDgwMTIwMywKKzB4Mzg4MTA2MDIsCisweGIwNDA4NTg2LAorMHgyODgxMDYwMiwKKzB4MzIwMDQxODAsCisweDM0MjA0NzAyLAorMHgyMWEwMDM4MiwKKzB4NDAyMDAwN2YsCisweDMyN2ZkYzgwLAorMHg0MDlmZmUwMiwKKzB4MzA4MDEyMDMsCisweDQwODAwMjA0LAorMHgzZWM0MDA4NywKKzB4NDA4MDA0MDUsCisweDAwMjAwMDAwLAorMHg0MDgwMDYwNiwKKzB4M2FjMTA2MDgsCisweDNhYzE0NjA5LAorMHgzYWMxODYwYSwKKzB4YjA2MGMxMDcsCisweDIwODAxMjAzLAorMHg0MTAwNDAwMywKKzB4Mzg4MTA2MDIsCisweDQwMjAwMDdmLAorMHhiMDQwODE4OCwKKzB4NDAyMDAwN2YsCisweDI4ODEwNjAyLAorMHg0MTIwMTAwMiwKKzB4Mzg4MTQ2MDMsCisweDEwMDA5YzA5LAorMHhiMDYwYzEwOSwKKzB4NDAyMDAwN2YsCisweDI4ODE0NjAzLAorMHg0MTE5M2Y4MywKKzB4Mzg4MTg2MDIsCisweDYwZmZjMDAzLAorMHhiMDQwODE4YSwKKzB4Mjg4MTg2MDIsCisweDMyMDAzMDgwLAorMHg0MDlmZmUwMiwKKzB4MzA4MDEyMDMsCisweDQwODAwMjA0LAorMHgzZWM0MDA4NywKKzB4NDEyMDEwMDgsCisweDEwMDA5YzE0LAorMHg0MDgwMDQwNSwKKzB4M2FjMTA2MDksCisweDQwODAwNjA2LAorMHgzYWMxNDYwYSwKKzB4YjA2MGMxMDcsCisweDNhYzE4NjBiLAorMHgyMDgwMTIwMywKKzB4Mzg4MTA2MDIsCisweGIwNDA4NDA5LAorMHgyODgxMDYwMiwKKzB4Mzg4MTQ2MDMsCisweGIwNjBjNDBhLAorMHg0MDIwMDA3ZiwKKzB4Mjg4MTQ2MDMsCisweDQxMTkzZjgzLAorMHgzODgxODYwMiwKKzB4NjBmZmMwMDMsCisweGIwNDA4MThiLAorMHgyODgxODYwMiwKKzB4MzIwMDIzODAsCisweDQwOWZmZTAyLAorMHgzMDgwMTIwNCwKKzB4NDA4MDAyMDUsCisweDNlYzQwMDgzLAorMHg0MDgwMDQwNiwKKzB4M2FjMTQ2MDcsCisweDNhYzE4NjA4LAorMHhiMDgxMDEwMywKKzB4NDEwMDQwMDIsCisweDIwODAxMjA0LAorMHg0MDIwMDA3ZiwKKzB4Mzg4MTQ2MDMsCisweDEwMDA5YzBiLAorMHhiMDYwYzEwNywKKzB4NDAyMDAwN2YsCisweDQwMjAwMDdmLAorMHgyODgxNDYwMywKKzB4Mzg4MTg2MDIsCisweDQwMjAwMDdmLAorMHg0MDIwMDA3ZiwKKzB4YjA0MDg1ODgsCisweDI4ODE4NjAyLAorMHg0MDIwMDA3ZiwKKzB4MzIwMDE3ODAsCisweDQwOWZmZTAyLAorMHgxMDAwNjQwZSwKKzB4NDA4MDAyMDQsCisweDMwODAxMjAzLAorMHg0MDgwMDQwNSwKKzB4M2VjNDAwODcsCisweDQwODAwNjA2LAorMHgzYWMxMDYwOCwKKzB4M2FjMTQ2MDksCisweDNhYzE4NjBhLAorMHhiMDYwYzEwNywKKzB4MjA4MDEyMDMsCisweDQxM2Q4MDAzLAorMHgzODgxMDYwMiwKKzB4NDAyMDAwN2YsCisweDMyN2ZkNzgwLAorMHg0MDlmZmUwMiwKKzB4MTAwMDdmMGMsCisweDQwODAwMjA1LAorMHgzMDgwMTIwNCwKKzB4NDA4MDA0MDYsCisweDNlYzQwMDgzLAorMHgzYWMxNDYwNywKKzB4M2FjMTg2MDgsCisweGIwODEwMTAzLAorMHg0MTNkODAwMiwKKzB4MjA4MDEyMDQsCisweDM4ODE0NjAzLAorMHg0MDIwMDA3ZiwKKzB4MzI3ZmViODAsCisweDQwOWZmZTAyLAorMHgzMDgwMTIwMywKKzB4NDA4MDAyMDQsCisweDNlYzQwMDg3LAorMHg0MDgwMDQwNSwKKzB4MTAwMDY1MGEsCisweDQwODAwNjA2LAorMHgzYWMxMDYwOCwKKzB4M2FjMTQ2MDksCisweDNhYzE4NjBhLAorMHhiMDYwYzEwNywKKzB4MjA4MDEyMDMsCisweDM4ODEwNjAyLAorMHhiMDQwODU4OCwKKzB4NDAyMDAwN2YsCisweDMyN2ZjOTgwLAorMHgwMDQwMDAwMCwKKzB4NDA4MDAwMDMsCisweDQwMjAwMDdmLAorMHgzNTAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlX2R1bXAuaF9zaGlwcGVkIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3NwdV9zYXZlX2R1bXAuaF9zaGlwcGVkCmluZGV4IDM5ZTU0MDAuLmI5ZjgxYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zcHVfc2F2ZV9kdW1wLmhfc2hpcHBlZAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3B1X3NhdmVfZHVtcC5oX3NoaXBwZWQKQEAgLTMsMTg5ICszLDc0MSBAQAogICogSGV4LWR1bXAgYXV0byBnZW5lcmF0ZWQgZnJvbSBzcHVfc2F2ZS5jLgogICogRG8gbm90IGVkaXQhCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X3NhdmVfY29kZVtdIF9fcGFnZV9hbGlnbmVkID0gewotMHgyMDgwNTAwMCwgMHgyMDgwNTIwMSwgMHgyMDgwNTQwMiwgMHgyMDgwNTYwMywKLTB4MjA4MDU4MDQsIDB4MjA4MDVhMDUsIDB4MjA4MDVjMDYsIDB4MjA4MDVlMDcsCi0weDIwODA2MDA4LCAweDIwODA2MjA5LCAweDIwODA2NDBhLCAweDIwODA2NjBiLAotMHgyMDgwNjgwYywgMHgyMDgwNmEwZCwgMHgyMDgwNmMwZSwgMHgyMDgwNmUwZiwKLTB4NDIwMWMwMDMsIDB4MzM4MDAxODQsIDB4MWMwMTAyMDQsIDB4NDAyMDAwMDAsCi0weDI0MDAwMTkwLCAweDI0MDA0MTkxLCAweDI0MDA4MTkyLCAweDI0MDBjMTkzLAotMHgxNDFmYzIwNSwgMHgyM2ZmZmQ4NCwgMHgxYzEwMDE4MywgMHgyMTdmZmI4NSwKLTB4NDA4MDAwMDAsIDB4NDA5ZmY4MDEsIDB4MjQwMDAwODAsIDB4MjRmZDgwODEsCi0weDFjZDgwMDgxLCAweDMzMDAwMTgwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMWEwMDE4MiwgMHgzZWMwMDA4MywgMHhiMWMzODEwMywgMHgwMWEwMDIwNCwKLTB4M2VjMTAwODIsIDB4NDIwMTQwMGQsIDB4YjFjMzgyMDIsIDB4MDFhMDA1ODMsCi0weDM0MjE4NjgyLCAweDNlZDgwNjg0LCAweGIwNDA4MTg0LCAweDI0MjE4NjgyLAotMHgwMWEwMDYwMywgMHgwMDIwMDAwMCwgMHgzNDIxNDY4MiwgMHgzZWQ0MDY4NCwKLTB4YjA0MDgxODQsIDB4NDA4MDAwMDMsIDB4MjQyMTQ2ODIsIDB4MjFhMDAwODMsCi0weDQwODAwMDgyLCAweDIxYTAwYjAyLCAweDQwMjAwMDdmLCAweDEwMDAyNTFlLAotMHg0MGE4MDAwMiwgMHgzMjgwMDAwOCwgMHg0MjA1YzAwYywgMHgwMDIwMDAwMCwKLTB4NDBhMDAwMGIsIDB4M2Y4MjA3MGYsIDB4NDA4MDAyMGEsIDB4NDA4MDA3MDksCi0weDNmZTMwNzhmLCAweDNmYmYwNzgzLCAweDNmMjAwMTgzLCAweDNmYmUwMTgzLAotMHgzZmUzMDE4NywgMHgxODAwODM4NywgMHg0MjA1YzAwMiwgMHgzYWMzMDQwNCwKLTB4MWNmZmM0ODksIDB4MDAyMDAwMDAsIDB4MTgwMDg0MDMsIDB4Mzg4MzA0MDIsCi0weDRjZmZjNDg2LCAweDNhYzI4MTg1LCAweGIwNDA4NTg0LCAweDI4ODMwNDAyLAotMHgxYzAyMDQwOCwgMHgzODgyODE4MiwgMHhiMDQwODM4NSwgMHgxODAyYzM4NywKLTB4Mjg4MjgxODIsIDB4MjE3ZmY4ODYsIDB4MDQwMDA1ODIsIDB4MzI4MDAwMDcsCi0weDIxYTAwODAyLCAweDNmYmYwNzA1LCAweDNmMjAwMjg1LCAweDNmYmUwMjg1LAotMHgzZmUzMDI4NSwgMHgyMWEwMDg4NSwgMHgwNDAwMDYwMywgMHgyMWEwMDkwMywKLTB4NDA4MDNjMDIsIDB4MjFhMDA5ODIsIDB4MDQwMDAzODYsIDB4MjFhMDBhMDYsCi0weDQwODAxMjAyLCAweDIxYTAwYTgyLCAweDczMDAwMDAzLCAweDI0MjAwNjgzLAotMHgwMWEwMDQwNCwgMHgwMDIwMDAwMCwgMHgzNDIwNDY4MiwgMHgzZWM0MDY4MywKLTB4YjA0MDgyMDMsIDB4MjQyMDQ2ODIsIDB4MDFhMDA3ODMsIDB4MDAyMDAwMDAsCi0weDM0MjFjNjgyLCAweDNlZGMwNjg0LCAweGIwNDA4MTg0LCAweDI0MjFjNjgyLAotMHgyMWEwMDgwNiwgMHgyMWEwMDg4NSwgMHgzZmJmMDc4NCwgMHgzZjIwMDIwNCwKLTB4M2ZiZTAyMDQsIDB4M2ZlMzAyMDQsIDB4MjFhMDA5MDQsIDB4NDA4MDQwMDIsCi0weDIxYTAwOTgyLCAweDIxYTAwYTA2LCAweDQwODA1YTAyLCAweDIxYTAwYTgyLAotMHgwNDAwMDY4MywgMHgyMWEwMDgwMywgMHgyMWEwMDg4NSwgMHgyMWEwMDkwNCwKLTB4NDA4NDgwMDIsIDB4MjFhMDA5ODIsIDB4MjFhMDBhMDYsIDB4NDA4MDEwMDIsCi0weDIxYTAwYTgyLCAweDIxYTAwYTA2LCAweDQwODA2NjAyLCAweDAwMjAwMDAwLAotMHgzNTgwMDAwOSwgMHgyMWEwMGE4MiwgMHg0MDgwMDA4MywgMHgyMWEwMGI4MywKLTB4MDFhMDBjMDIsIDB4MDFhMDBkODMsIDB4MDAwMDNmZmIsIDB4NDA4MDAwMDMsCi0weDQwMjAwMDdmLCAweDM1MDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKLTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCi0weDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAotMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3B1X3NhdmVfY29kZVtdICBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxMjgpKSkgPSB7CisweDIwODA1MDAwLAorMHgyMDgwNTIwMSwKKzB4MjA4MDU0MDIsCisweDIwODA1NjAzLAorMHgyMDgwNTgwNCwKKzB4MjA4MDVhMDUsCisweDIwODA1YzA2LAorMHgyMDgwNWUwNywKKzB4MjA4MDYwMDgsCisweDIwODA2MjA5LAorMHgyMDgwNjQwYSwKKzB4MjA4MDY2MGIsCisweDIwODA2ODBjLAorMHgyMDgwNmEwZCwKKzB4MjA4MDZjMGUsCisweDIwODA2ZTBmLAorMHg0MjAxYzAwMywKKzB4MzM4MDAxODQsCisweDFjMDEwMjA0LAorMHg0MDIwMDAwMCwKKzB4MjQwMDAxOTAsCisweDI0MDA0MTkxLAorMHgyNDAwODE5MiwKKzB4MjQwMGMxOTMsCisweDE0MWZjMjA1LAorMHgyM2ZmZmQ4NCwKKzB4MWMxMDAxODMsCisweDIxN2ZmYjg1LAorMHg0MDgwMDAwMCwKKzB4NDA5ZmY4MDEsCisweDI0MDAwMDgwLAorMHgyNGZkODA4MSwKKzB4MWNkODAwODEsCisweDMzMDAwMTgwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAxYTAwMTgyLAorMHgzZWMwMDA4MywKKzB4YjFjMzgxMDMsCisweDAxYTAwMjA0LAorMHgzZWMxMDA4MiwKKzB4NDIwMTQwMGQsCisweGIxYzM4MjAyLAorMHgwMWEwMDU4MywKKzB4MzQyMTg2ODIsCisweDNlZDgwNjg0LAorMHhiMDQwODE4NCwKKzB4MjQyMTg2ODIsCisweDAxYTAwNjAzLAorMHgwMDIwMDAwMCwKKzB4MzQyMTQ2ODIsCisweDNlZDQwNjg0LAorMHhiMDQwODE4NCwKKzB4NDA4MDAwMDMsCisweDI0MjE0NjgyLAorMHgyMWEwMDA4MywKKzB4NDA4MDAwODIsCisweDIxYTAwYjAyLAorMHg0MDIwMDA3ZiwKKzB4MTAwMDI1MWUsCisweDQyYTAwMDAyLAorMHgzMjgwMDAwOCwKKzB4NDIwNWMwMGMsCisweDAwMjAwMDAwLAorMHg0MGEwMDAwYiwKKzB4M2Y4MjA3MGYsCisweDQwODAwMjBhLAorMHg0MDgwMDcwOSwKKzB4M2ZlMzA3OGYsCisweDNmYmYwNzgzLAorMHgzZjIwMDE4MywKKzB4M2ZiZTAxODMsCisweDNmZTMwMTg3LAorMHgxODAwODM4NywKKzB4NDIwNWMwMDIsCisweDNhYzMwNDA0LAorMHgxY2ZmYzQ4OSwKKzB4MDAyMDAwMDAsCisweDE4MDA4NDAzLAorMHgzODgzMDQwMiwKKzB4NGNmZmM0ODYsCisweDNhYzI4MTg1LAorMHhiMDQwODU4NCwKKzB4Mjg4MzA0MDIsCisweDFjMDIwNDA4LAorMHgzODgyODE4MiwKKzB4YjA0MDgzODUsCisweDE4MDJjMzg3LAorMHgyODgyODE4MiwKKzB4MjE3ZmY4ODYsCisweDA0MDAwNTgyLAorMHgzMjgwMDAwNywKKzB4MjFhMDA4MDIsCisweDNmYmYwNzA1LAorMHgzZjIwMDI4NSwKKzB4M2ZiZTAyODUsCisweDNmZTMwMjg1LAorMHgyMWEwMDg4NSwKKzB4MDQwMDA2MDMsCisweDIxYTAwOTAzLAorMHg0MDgwM2MwMiwKKzB4MjFhMDA5ODIsCisweDA0MDAwMzg2LAorMHgyMWEwMGEwNiwKKzB4NDA4MDEyMDIsCisweDIxYTAwYTgyLAorMHg3MzAwMDAwMywKKzB4MjQyMDA2ODMsCisweDAxYTAwNDA0LAorMHgwMDIwMDAwMCwKKzB4MzQyMDQ2ODIsCisweDNlYzQwNjgzLAorMHhiMDQwODIwMywKKzB4MjQyMDQ2ODIsCisweDAxYTAwNzgzLAorMHgwMDIwMDAwMCwKKzB4MzQyMWM2ODIsCisweDNlZGMwNjg0LAorMHhiMDQwODE4NCwKKzB4MjQyMWM2ODIsCisweDIxYTAwODA2LAorMHgyMWEwMDg4NSwKKzB4M2ZiZjA3ODQsCisweDNmMjAwMjA0LAorMHgzZmJlMDIwNCwKKzB4M2ZlMzAyMDQsCisweDIxYTAwOTA0LAorMHg0MDgwNDAwMiwKKzB4MjFhMDA5ODIsCisweDIxYTAwYTA2LAorMHg0MDgwNWEwMiwKKzB4MjFhMDBhODIsCisweDA0MDAwNjgzLAorMHgyMWEwMDgwMywKKzB4MjFhMDA4ODUsCisweDIxYTAwOTA0LAorMHg0MDg0ODAwMiwKKzB4MjFhMDA5ODIsCisweDIxYTAwYTA2LAorMHg0MDgwMTAwMiwKKzB4MjFhMDBhODIsCisweDIxYTAwYTA2LAorMHg0MDgwNjYwMiwKKzB4MDAyMDAwMDAsCisweDM1ODAwMDA5LAorMHgyMWEwMGE4MiwKKzB4NDA4MDAwODMsCisweDIxYTAwYjgzLAorMHgwMWEwMGMwMiwKKzB4MDFhMDBkODMsCisweDAwMDAzZmZiLAorMHg0MDgwMDAwMywKKzB4NDAyMDAwN2YsCisweDM1MDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsCisweDAwMDAwMDAwLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvY2VsbC9zcHVmcy9zd2l0Y2guYwppbmRleCAxNzI2YmZlLi5iMzBlNTVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1ZnMvc3dpdGNoLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NwdWZzL3N3aXRjaC5jCkBAIC00Niw2ICs0Niw3IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vc3B1Lmg+CisjaW5jbHVkZSA8YXNtL3NwdV9wcml2MS5oPgogI2luY2x1ZGUgPGFzbS9zcHVfY3NhLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKQEAgLTYyMiwxMiArNjIzLDE3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc2F2ZV9jaF9wYXJ0MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EsIHN0cnVjdCBzcHUgKnNwdSkKIHsKIAlzdHJ1Y3Qgc3B1X3ByaXYyIF9faW9tZW0gKnByaXYyID0gc3B1LT5wcml2MjsKLQl1NjQgaWR4LCBjaF9pbmRpY2VzWzddID0geyAwVUwsIDFVTCwgM1VMLCA0VUwsIDI0VUwsIDI1VUwsIDI3VUwgfTsKKwl1NjQgaWR4LCBjaF9pbmRpY2VzWzddID0geyAwVUwsIDNVTCwgNFVMLCAyNFVMLCAyNVVMLCAyN1VMIH07CiAJaW50IGk7CiAKIAkvKiBTYXZlLCBTdGVwIDQyOgotCSAqICAgICBTYXZlIHRoZSBmb2xsb3dpbmcgQ0g6IFswLDEsMyw0LDI0LDI1LDI3XQogCSAqLworCisJLyogU2F2ZSBDSCAxLCB3aXRob3V0IGNoYW5uZWwgY291bnQgKi8KKwlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCAxKTsKKwljc2EtPnNwdV9jaG5sZGF0YV9SV1sxXSA9IGluX2JlNjQoJnByaXYyLT5zcHVfY2hubGRhdGFfUlcpOworCisJLyogU2F2ZSB0aGUgZm9sbG93aW5nIENIOiBbMCwzLDQsMjQsMjUsMjddICovCiAJZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewogCQlpZHggPSBjaF9pbmRpY2VzW2ldOwogCQlvdXRfYmU2NCgmcHJpdjItPnNwdV9jaG5sY250cHRyX1JXLCBpZHgpOwpAQCAtNzE4LDEzICs3MjQsMTUgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGdldF9rZXJuZWxfc2xiKHU2NCBlYSwgdTY0IHNsYlsyXSkKIHsKLQlzbGJbMF0gPSAoZ2V0X2tlcm5lbF92c2lkKGVhKSA8PCBTTEJfVlNJRF9TSElGVCkgfCBTTEJfVlNJRF9LRVJORUw7Ci0Jc2xiWzFdID0gKGVhICYgRVNJRF9NQVNLKSB8IFNMQl9FU0lEX1Y7CisJdTY0IGxscDsKIAotCS8qIExhcmdlIHBhZ2VzIGFyZSB1c2VkIGZvciBrZXJuZWwgdGV4dC9kYXRhLCBidXQgbm90IHZtYWxsb2MuICAqLwotCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl8xNk1fUEFHRSkKLQkgICAgJiYgUkVHSU9OX0lEKGVhKSA9PSBLRVJORUxfUkVHSU9OX0lEKQotCQlzbGJbMF0gfD0gU0xCX1ZTSURfTDsKKwlpZiAoUkVHSU9OX0lEKGVhKSA9PSBLRVJORUxfUkVHSU9OX0lEKQorCQlsbHAgPSBtbXVfcHNpemVfZGVmc1ttbXVfbGluZWFyX3BzaXplXS5zbGxwOworCWVsc2UKKwkJbGxwID0gbW11X3BzaXplX2RlZnNbbW11X3ZpcnR1YWxfcHNpemVdLnNsbHA7CisJc2xiWzBdID0gKGdldF9rZXJuZWxfdnNpZChlYSkgPDwgU0xCX1ZTSURfU0hJRlQpIHwKKwkJU0xCX1ZTSURfS0VSTkVMIHwgbGxwOworCXNsYlsxXSA9IChlYSAmIEVTSURfTUFTSykgfCBTTEJfRVNJRF9WOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9hZF9tZmNfc2xiKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNsYlsyXSwgaW50IHNsYmUpCkBAIC0xMTAzLDEzICsxMTExLDE4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfY2hfcGFydDEoc3RydWN0IHNwdV9zdGF0ZSAqY3NhLCBzdHJ1Y3Qgc3B1ICpzcHUpCiB7CiAJc3RydWN0IHNwdV9wcml2MiBfX2lvbWVtICpwcml2MiA9IHNwdS0+cHJpdjI7Ci0JdTY0IGNoX2luZGljZXNbN10gPSB7IDBVTCwgMVVMLCAzVUwsIDRVTCwgMjRVTCwgMjVVTCwgMjdVTCB9OworCXU2NCBjaF9pbmRpY2VzWzddID0geyAwVUwsIDNVTCwgNFVMLCAyNFVMLCAyNVVMLCAyN1VMIH07CiAJdTY0IGlkeDsKIAlpbnQgaTsKIAogCS8qIFJlc3RvcmUsIFN0ZXAgMjA6Ci0JICogICAgIFJlc2V0IHRoZSBmb2xsb3dpbmcgQ0g6IFswLDEsMyw0LDI0LDI1LDI3XQogCSAqLworCisJLyogUmVzZXQgQ0ggMSAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIDEpOworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxkYXRhX1JXLCAwVUwpOworCisJLyogUmVzZXQgdGhlIGZvbGxvd2luZyBDSDogWzAsMyw0LDI0LDI1LDI3XSAqLwogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKIAkJaWR4ID0gY2hfaW5kaWNlc1tpXTsKIAkJb3V0X2JlNjQoJnByaXYyLT5zcHVfY2hubGNudHB0cl9SVywgaWR4KTsKQEAgLTE1NzAsMTIgKzE1ODMsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2NoX3BhcnQxKHN0cnVjdCBzcHVfc3RhdGUgKmNzYSwgc3RydWN0IHNwdSAqc3B1KQogewogCXN0cnVjdCBzcHVfcHJpdjIgX19pb21lbSAqcHJpdjIgPSBzcHUtPnByaXYyOwotCXU2NCBpZHgsIGNoX2luZGljZXNbN10gPSB7IDBVTCwgMVVMLCAzVUwsIDRVTCwgMjRVTCwgMjVVTCwgMjdVTCB9OworCXU2NCBpZHgsIGNoX2luZGljZXNbN10gPSB7IDBVTCwgM1VMLCA0VUwsIDI0VUwsIDI1VUwsIDI3VUwgfTsKIAlpbnQgaTsKIAogCS8qIFJlc3RvcmUsIFN0ZXAgNTk6Ci0JICogICAgIFJlc3RvcmUgdGhlIGZvbGxvd2luZyBDSDogWzAsMSwzLDQsMjQsMjUsMjddCiAJICovCisKKwkvKiBSZXN0b3JlIENIIDEgd2l0aG91dCBjb3VudCAqLworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIDEpOworCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxkYXRhX1JXLCBjc2EtPnNwdV9jaG5sZGF0YV9SV1sxXSk7CisKKwkvKiBSZXN0b3JlIHRoZSBmb2xsb3dpbmcgQ0g6IFswLDMsNCwyNCwyNSwyN10gKi8KIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCWlkeCA9IGNoX2luZGljZXNbaV07CiAJCW91dF9iZTY0KCZwcml2Mi0+c3B1X2NobmxjbnRwdHJfUlcsIGlkeCk7CkBAIC0yMDc0LDYgKzIwOTIsNyBAQAogCX0KIAlyZXR1cm4gcmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfc2F2ZSk7CiAKIC8qKgogICogc3B1X3Jlc3RvcmUgLSBTUFUgY29udGV4dCByZXN0b3JlLCB3aXRoIGhhcnZlc3QgYW5kIGxvY2tpbmcuCkBAIC0yMDkwLDcgKzIxMDksNiBAQAogCiAJYWNxdWlyZV9zcHVfbG9jayhzcHUpOwogCWhhcnZlc3QoTlVMTCwgc3B1KTsKLQlzcHUtPnN0b3BfY29kZSA9IDA7CiAJc3B1LT5kYXIgPSAwOwogCXNwdS0+ZHNpc3IgPSAwOwogCXNwdS0+c2xiX3JlcGxhY2UgPSAwOwpAQCAtMjEwMyw2ICsyMTIxLDcgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc3B1X3Jlc3RvcmUpOwogCiAvKioKICAqIHNwdV9oYXJ2ZXN0IC0gU1BVIGhhcnZlc3QgKHJlc2V0KSBvcGVyYXRpb24KQEAgLTIxMjUsNiArMjE0NCw3IEBACiAJY3NhLT5zcHVfY2hubGNudF9SV1syOF0gPSAxOwogCWNzYS0+c3B1X2NobmxjbnRfUldbMzBdID0gMTsKIAljc2EtPnByb2Iuc3B1X3J1bmNudGxfUlcgPSBTUFVfUlVOQ05UTF9TVE9QOworCWNzYS0+cHJvYi5tYl9zdGF0X1IgPSAweDAwMDQwMDsKIH0KIAogc3RhdGljIHZvaWQgaW5pdF9wcml2MShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EpCkBAIC0yMTkzLDYgKzIyMTMsNyBAQAogCWluaXRfcHJpdjEoY3NhKTsKIAlpbml0X3ByaXYyKGNzYSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfaW5pdF9jc2EpOwogCiB2b2lkIHNwdV9maW5pX2NzYShzdHJ1Y3Qgc3B1X3N0YXRlICpjc2EpCiB7CkBAIC0yMjAzLDMgKzIyMjQsNCBAQAogCiAJdmZyZWUoY3NhLT5sc2NzYSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzcHVfZmluaV9jc2EpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL01ha2VmaWxlCmluZGV4IGNlOGMwYjkuLmRlZTRlYjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvTWFrZWZpbGUKQEAgLTEsOSArMSwxMSBAQAogRVhUUkFfQ0ZMQUdTCSs9IC1tbm8tbWluaW1hbC10b2MKIAotb2JqLXkgKz0gaHZsb2cubyBodmxwY29uZmlnLm8gbHBhcmRhdGEubyBzZXR1cC5vIG1mLm8gbHBldmVudHMubyBcCitvYmoteSArPSBodmxvZy5vIGh2bHBjb25maWcubyBscGFyZGF0YS5vIHNldHVwLm8gZHRfbW9kLm8gbWYubyBscGV2ZW50cy5vIFwKIAlodmNhbGwubyBwcm9jLm8gaHRhYi5vIGlvbW11Lm8gbWlzYy5vIGlycS5vCiBvYmotJChDT05GSUdfUENJKSArPSBwY2kubyB2cGRpbmZvLm8KLW9iai0kKENPTkZJR19JQk1WSU8pICs9IHZpby5vCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogb2JqLSQoQ09ORklHX1ZJT1BBVEgpICs9IHZpb3BhdGgubwogb2JqLSQoQ09ORklHX01PRFVMRVMpICs9IGtzeW1zLm8KKworJChvYmopL2R0X21vZC5vOgkkKG9iaikvZHQubworCUAkKE9CSkNPUFkpIC0tcmVuYW1lLXNlY3Rpb24gLnJvZGF0YS5zdHIxLjg9LmR0X3N0cmluZ3MgJChvYmopL2R0Lm8gJChvYmopL2R0X21vZC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvY2FsbF9wY2kuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX3BjaS5oCmluZGV4IDU5ZDRlMGEuLmRiZGY2OTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9jYWxsX3BjaS5oCkBAIC0xNDUsNiArMTQ1LDI1IEBACiAJcmV0dXJuIHJldFZhbC5yYzsKIH0KIAorc3RhdGljIGlubGluZSB1NjQgSHZDYWxsUGNpX2NvbmZpZ0xvYWQzMih1MTYgYnVzTnVtYmVyLCB1OCBzdWJCdXNOdW1iZXIsCisJCXU4IGRldmljZUlkLCB1MzIgb2Zmc2V0LCB1MzIgKnZhbHVlKQoreworCXN0cnVjdCBIdkNhbGxQY2lfRHNhQWRkciBkc2E7CisJc3RydWN0IEh2Q2FsbFBjaV9Mb2FkUmV0dXJuIHJldFZhbDsKKworCSooKHU2NCopJmRzYSkgPSAwOworCisJZHNhLmJ1c051bWJlciA9IGJ1c051bWJlcjsKKwlkc2Euc3ViQnVzTnVtYmVyID0gc3ViQnVzTnVtYmVyOworCWRzYS5kZXZpY2VJZCA9IGRldmljZUlkOworCisJSHZDYWxsM1JldDE2KEh2Q2FsbFBjaUNvbmZpZ0xvYWQzMiwgJnJldFZhbCwgKih1NjQgKikmZHNhLCBvZmZzZXQsIDApOworCisJKnZhbHVlID0gcmV0VmFsLnZhbHVlOworCisJcmV0dXJuIHJldFZhbC5yYzsKK30KKwogc3RhdGljIGlubGluZSB1NjQgSHZDYWxsUGNpX2NvbmZpZ1N0b3JlOCh1MTYgYnVzTnVtYmVyLCB1OCBzdWJCdXNOdW1iZXIsCiAJCXU4IGRldmljZUlkLCB1MzIgb2Zmc2V0LCB1OCB2YWx1ZSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9kdC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0NDRhYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9kdC5jCkBAIC0wLDAgKzEsNjE1IEBACisvKgorICogICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMDYgTWljaGFlbCBFbGxlcm1hbiwgSUJNIENvcnBvcmF0aW9uCisgKgorICogICAgRGVzY3JpcHRpb246CisgKiAgICAgIFRoaXMgZmlsZSBjb250YWlucyBhbGwgdGhlIHJvdXRpbmVzIHRvIGJ1aWxkIGEgZmxhdHRlbmVkIGRldmljZQorICogICAgICB0cmVlIGZvciBhIGxlZ2FjeSBpU2VyaWVzIG1hY2hpbmUuCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpX3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CS8qIEVUSF9BTEVOICovCisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL2xwcGFjYS5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9odl90eXBlcy5oPgorI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2xwX2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X2NhbGxfeG0uaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKworI2luY2x1ZGUgInByb2Nlc3Nvcl92cGQuaCIKKyNpbmNsdWRlICJjYWxsX2hwdC5oIgorI2luY2x1ZGUgImNhbGxfcGNpLmgiCisjaW5jbHVkZSAicGNpLmgiCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCisjZWxzZQorI2RlZmluZSBEQkcoZm10Li4uKQorI2VuZGlmCisKKy8qCisgKiBUaGVzZSBhcmUgY3JlYXRlZCBieSB0aGUgbGlua2VyIHNjcmlwdCBhdCB0aGUgc3RhcnQgYW5kIGVuZAorICogb2YgdGhlIHNlY3Rpb24gY29udGFpbmluZyBhbGwgdGhlIHN0cmluZ3MgZnJvbSB0aGlzIGZpbGUuCisgKi8KK2V4dGVybiBjaGFyIF9fZHRfc3RyaW5nc19zdGFydFtdOworZXh0ZXJuIGNoYXIgX19kdF9zdHJpbmdzX2VuZFtdOworCitzdHJ1Y3QgaXNlcmllc19mbGF0X2R0IHsKKwlzdHJ1Y3QgYm9vdF9wYXJhbV9oZWFkZXIgaGVhZGVyOworCXU2NCByZXNlcnZlX21hcFsyXTsKK307CisKK3N0YXRpYyB2b2lkICogX19pbml0ZGF0YSBkdF9kYXRhOworCisvKgorICogUHV0dGluZyB0aGVzZSBzdHJpbmdzIGhlcmUga2VlcHMgdGhlbSBvdXQgb2YgdGhlIHNlY3Rpb24KKyAqIHRoYXQgd2UgcmVuYW1lIHRvIC5kdF9zdHJpbmdzIHVzaW5nIG9iamNvcHkgYW5kIGNhcHR1cmUKKyAqIGZvciB0aGUgc3RyaW5ncyBibG9iIG9mIHRoZSBmbGF0dGVuZWQgZGV2aWNlIHRyZWUuCisgKi8KK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgZGV2aWNlX3R5cGVfY3B1W10gPSAiY3B1IjsKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgZGV2aWNlX3R5cGVfbWVtb3J5W10gPSAibWVtb3J5IjsKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgZGV2aWNlX3R5cGVfc2VyaWFsW10gPSAic2VyaWFsIjsKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgZGV2aWNlX3R5cGVfbmV0d29ya1tdID0gIm5ldHdvcmsiOworc3RhdGljIGNoYXIgX19pbml0ZGF0YSBkZXZpY2VfdHlwZV9ibG9ja1tdID0gImJsb2NrIjsKK3N0YXRpYyBjaGFyIF9faW5pdGRhdGEgZGV2aWNlX3R5cGVfYnl0ZVtdID0gImJ5dGUiOworc3RhdGljIGNoYXIgX19pbml0ZGF0YSBkZXZpY2VfdHlwZV9wY2lbXSA9ICJwY2kiOworc3RhdGljIGNoYXIgX19pbml0ZGF0YSBkZXZpY2VfdHlwZV92ZGV2aWNlW10gPSAidmRldmljZSI7CitzdGF0aWMgY2hhciBfX2luaXRkYXRhIGRldmljZV90eXBlX3ZzY3NpW10gPSAidnNjc2kiOworCitzdGF0aWMgc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqIF9faW5pdCBkdF9pbml0KHZvaWQpCit7CisJc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQ7CisJdW5zaWduZWQgbG9uZyBzdHJfbGVuOworCisJc3RyX2xlbiA9IF9fZHRfc3RyaW5nc19lbmQgLSBfX2R0X3N0cmluZ3Nfc3RhcnQ7CisJZHQgPSAoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqKUFMSUdOKGtsaW1pdCwgOCk7CisJZHQtPmhlYWRlci5vZmZfbWVtX3Jzdm1hcCA9CisJCW9mZnNldG9mKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQsIHJlc2VydmVfbWFwKTsKKwlkdC0+aGVhZGVyLm9mZl9kdF9zdHJpbmdzID0gQUxJR04oc2l6ZW9mKCpkdCksIDgpOworCWR0LT5oZWFkZXIub2ZmX2R0X3N0cnVjdCA9IGR0LT5oZWFkZXIub2ZmX2R0X3N0cmluZ3MKKwkJKyBBTElHTihzdHJfbGVuLCA4KTsKKwlkdF9kYXRhID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZHQgKyBkdC0+aGVhZGVyLm9mZl9kdF9zdHJ1Y3QpOworCWR0LT5oZWFkZXIuZHRfc3RyaW5nc19zaXplID0gc3RyX2xlbjsKKworCS8qIFRoZXJlIGlzIG5vIG5vdGlvbiBvZiBoYXJkd2FyZSBjcHUgaWQgb24gaVNlcmllcyAqLworCWR0LT5oZWFkZXIuYm9vdF9jcHVpZF9waHlzID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJbWVtY3B5KChjaGFyICopZHQgKyBkdC0+aGVhZGVyLm9mZl9kdF9zdHJpbmdzLCBfX2R0X3N0cmluZ3Nfc3RhcnQsCisJCQlzdHJfbGVuKTsKKworCWR0LT5oZWFkZXIubWFnaWMgPSBPRl9EVF9IRUFERVI7CisJZHQtPmhlYWRlci52ZXJzaW9uID0gMHgxMDsKKwlkdC0+aGVhZGVyLmxhc3RfY29tcF92ZXJzaW9uID0gMHgxMDsKKworCWR0LT5yZXNlcnZlX21hcFswXSA9IDA7CisJZHQtPnJlc2VydmVfbWFwWzFdID0gMDsKKworCXJldHVybiBkdDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGR0X3B1c2hfdTMyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCB1MzIgdmFsdWUpCit7CisJKigodTMyICopZHRfZGF0YSkgPSB2YWx1ZTsKKwlkdF9kYXRhICs9IHNpemVvZih1MzIpOworfQorCisjaWZkZWYgbm90eWV0CitzdGF0aWMgdm9pZCBfX2luaXQgZHRfcHVzaF91NjQoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIHU2NCB2YWx1ZSkKK3sKKwkqKCh1NjQgKilkdF9kYXRhKSA9IHZhbHVlOworCWR0X2RhdGEgKz0gc2l6ZW9mKHU2NCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGR0X3B1c2hfYnl0ZXMoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKmRhdGEsCisJCWludCBsZW4pCit7CisJbWVtY3B5KGR0X2RhdGEsIGRhdGEsIGxlbik7CisJZHRfZGF0YSArPSBBTElHTihsZW4sIDQpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZHRfc3RhcnRfbm9kZShzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfQkVHSU5fTk9ERSk7CisJZHRfcHVzaF9ieXRlcyhkdCwgbmFtZSwgc3RybGVuKG5hbWUpICsgMSk7Cit9CisKKyNkZWZpbmUgZHRfZW5kX25vZGUoZHQpIGR0X3B1c2hfdTMyKGR0LCBPRl9EVF9FTkRfTk9ERSkKKworc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3Aoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisKKwlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfUFJPUCk7CisKKwkvKiBMZW5ndGggb2YgdGhlIGRhdGEgKi8KKwlkdF9wdXNoX3UzMihkdCwgbGVuKTsKKworCW9mZnNldCA9IG5hbWUgLSBfX2R0X3N0cmluZ3Nfc3RhcnQ7CisKKwkvKiBUaGUgb2Zmc2V0IG9mIHRoZSBwcm9wZXJ0aWVzIG5hbWUgaW4gdGhlIHN0cmluZyBibG9iLiAqLworCWR0X3B1c2hfdTMyKGR0LCAodTMyKW9mZnNldCk7CisKKwkvKiBUaGUgYWN0dWFsIGRhdGEuICovCisJZHRfcHVzaF9ieXRlcyhkdCwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3Bfc3RyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjb25zdCBjaGFyICpuYW1lLAorCQljb25zdCBjaGFyICpkYXRhKQoreworCWR0X3Byb3AoZHQsIG5hbWUsIGRhdGEsIHN0cmxlbihkYXRhKSArIDEpOyAvKiArIDEgZm9yIE5VTEwgKi8KK30KKworc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTMyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCBjb25zdCBjaGFyICpuYW1lLAorCQl1MzIgZGF0YSkKK3sKKwlkdF9wcm9wKGR0LCBuYW1lLCAmZGF0YSwgc2l6ZW9mKHUzMikpOworfQorCisjaWZkZWYgbm90eWV0CitzdGF0aWMgdm9pZCBfX2luaXQgZHRfcHJvcF91NjQoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCXU2NCBkYXRhKQoreworCWR0X3Byb3AoZHQsIG5hbWUsICZkYXRhLCBzaXplb2YodTY0KSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTY0X2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCisJCWNvbnN0IGNoYXIgKm5hbWUsIHU2NCAqZGF0YSwgaW50IG4pCit7CisJZHRfcHJvcChkdCwgbmFtZSwgZGF0YSwgc2l6ZW9mKHU2NCkgKiBuKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfdTMyX2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCisJCWNvbnN0IGNoYXIgKm5hbWUsIHUzMiAqZGF0YSwgaW50IG4pCit7CisJZHRfcHJvcChkdCwgbmFtZSwgZGF0YSwgc2l6ZW9mKHUzMikgKiBuKTsKK30KKworI2lmZGVmIG5vdHlldAorc3RhdGljIHZvaWQgX19pbml0IGR0X3Byb3BfZW1wdHkoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZHRfcHJvcChkdCwgbmFtZSwgTlVMTCwgMCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGR0X2NwdXMoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQpCit7CisJdW5zaWduZWQgY2hhciBidWZbMzJdOworCXVuc2lnbmVkIGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGksIGluZGV4OworCXN0cnVjdCBJb0hyaVByb2Nlc3NvclZwZCAqZDsKKwl1MzIgcGZ0X3NpemVbMl07CisKKwkvKiB5dWNrICovCisJc25wcmludGYoYnVmLCAzMiwgIlBvd2VyUEMsJXMiLCBjdXJfY3B1X3NwZWMtPmNwdV9uYW1lKTsKKwlwID0gc3RyY2hyKGJ1ZiwgJyAnKTsKKwlpZiAoIXApIHAgPSBidWYgKyBzdHJsZW4oYnVmKTsKKworCWR0X3N0YXJ0X25vZGUoZHQsICJjcHVzIik7CisJZHRfcHJvcF91MzIoZHQsICIjYWRkcmVzcy1jZWxscyIsIDEpOworCWR0X3Byb3BfdTMyKGR0LCAiI3NpemUtY2VsbHMiLCAwKTsKKworCXBmdF9zaXplWzBdID0gMDsgLyogTlVNQSBDRUMgY29va2llLCAwIGZvciBub24gTlVNQSAgKi8KKwlwZnRfc2l6ZVsxXSA9IF9faWxvZzIoSHZDYWxsSHB0X2dldEhwdFBhZ2VzKCkgKiBIV19QQUdFX1NJWkUpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgeworCQlpZiAobHBwYWNhW2ldLmR5bl9wcm9jX3N0YXR1cyA+PSAyKQorCQkJY29udGludWU7CisKKwkJc25wcmludGYocCwgMzIgLSAocCAtIGJ1ZiksICJAJWQiLCBpKTsKKwkJZHRfc3RhcnRfbm9kZShkdCwgYnVmKTsKKworCQlkdF9wcm9wX3N0cihkdCwgImRldmljZV90eXBlIiwgZGV2aWNlX3R5cGVfY3B1KTsKKworCQlpbmRleCA9IGxwcGFjYVtpXS5keW5faHZfcGh5c19wcm9jX2luZGV4OworCQlkID0gJnhJb0hyaVByb2Nlc3NvclZwZFtpbmRleF07CisKKwkJZHRfcHJvcF91MzIoZHQsICJpLWNhY2hlLXNpemUiLCBkLT54SW5zdENhY2hlU2l6ZSAqIDEwMjQpOworCQlkdF9wcm9wX3UzMihkdCwgImktY2FjaGUtbGluZS1zaXplIiwgZC0+eEluc3RDYWNoZU9wZXJhbmRTaXplKTsKKworCQlkdF9wcm9wX3UzMihkdCwgImQtY2FjaGUtc2l6ZSIsIGQtPnhEYXRhTDFDYWNoZVNpemVLQiAqIDEwMjQpOworCQlkdF9wcm9wX3UzMihkdCwgImQtY2FjaGUtbGluZS1zaXplIiwgZC0+eERhdGFDYWNoZU9wZXJhbmRTaXplKTsKKworCQkvKiBtYWdpYyBjb252ZXJzaW9ucyB0byBIeiBjb3BpZWQgZnJvbSBvbGQgY29kZSAqLworCQlkdF9wcm9wX3UzMihkdCwgImNsb2NrLWZyZXF1ZW5jeSIsCisJCQkoKDFVTCA8PCAzNCkgKiAxMDAwMDAwKSAvIGQtPnhQcm9jRnJlcSk7CisJCWR0X3Byb3BfdTMyKGR0LCAidGltZWJhc2UtZnJlcXVlbmN5IiwKKwkJCSgoMVVMIDw8IDMyKSAqIDEwMDAwMDApIC8gZC0+eFRpbWVCYXNlRnJlcSk7CisKKwkJZHRfcHJvcF91MzIoZHQsICJyZWciLCBpKTsKKworCQlkdF9wcm9wX3UzMl9saXN0KGR0LCAiaWJtLHBmdC1zaXplIiwgcGZ0X3NpemUsIDIpOworCisJCWR0X2VuZF9ub2RlKGR0KTsKKwl9CisKKwlkdF9lbmRfbm9kZShkdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkdF9tb2RlbChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCkKK3sKKwljaGFyIGJ1ZlsxNl0gPSAiSUJNLCI7CisKKwkvKiAiSUJNLCIgKyBtZmdJZFsyOjNdICsgc3lzdGVtU2VyaWFsWzE6NV0gKi8KKwlzdHJuZTJhKGJ1ZiArIDQsIHhJdEV4dFZwZFBhbmVsLm1mZ0lEICsgMiwgMik7CisJc3RybmUyYShidWYgKyA2LCB4SXRFeHRWcGRQYW5lbC5zeXN0ZW1TZXJpYWwgKyAxLCA1KTsKKwlidWZbMTFdID0gJ1wwJzsKKwlkdF9wcm9wX3N0cihkdCwgInN5c3RlbS1pZCIsIGJ1Zik7CisKKwkvKiAiSUJNLCIgKyBtYWNoaW5lVHlwZVswOjRdICovCisJc3RybmUyYShidWYgKyA0LCB4SXRFeHRWcGRQYW5lbC5tYWNoaW5lVHlwZSwgNCk7CisJYnVmWzhdID0gJ1wwJzsKKwlkdF9wcm9wX3N0cihkdCwgIm1vZGVsIiwgYnVmKTsKKworCWR0X3Byb3Bfc3RyKGR0LCAiY29tcGF0aWJsZSIsICJJQk0saVNlcmllcyIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgZHRfZG9fdmRldmljZShzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwKKwkJY29uc3QgY2hhciAqbmFtZSwgdTMyIHJlZywgaW50IHVuaXQsCisJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCwgaW50IGVuZCkKK3sKKwljaGFyIGJ1ZlszMl07CisKKwlzbnByaW50ZihidWYsIDMyLCAiJXNAJTA4eCIsIG5hbWUsIHJlZyArICgodW5pdCA+PSAwKSA/IHVuaXQgOiAwKSk7CisJZHRfc3RhcnRfbm9kZShkdCwgYnVmKTsKKwlkdF9wcm9wX3N0cihkdCwgImRldmljZV90eXBlIiwgdHlwZSk7CisJaWYgKGNvbXBhdCkKKwkJZHRfcHJvcF9zdHIoZHQsICJjb21wYXRpYmxlIiwgY29tcGF0KTsKKwlkdF9wcm9wX3UzMihkdCwgInJlZyIsIHJlZyArICgodW5pdCA+PSAwKSA/IHVuaXQgOiAwKSk7CisJaWYgKHVuaXQgPj0gMCkKKwkJZHRfcHJvcF91MzIoZHQsICJsaW51eCx1bml0X2FkZHJlc3MiLCB1bml0KTsKKwlpZiAoZW5kKQorCQlkdF9lbmRfbm9kZShkdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkdF92ZGV2aWNlcyhzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCkKK3sKKwl1MzIgcmVnID0gMDsKKwlIdkxwSW5kZXhNYXAgdmxhbl9tYXA7CisJaW50IGk7CisKKwlkdF9zdGFydF9ub2RlKGR0LCAidmRldmljZSIpOworCWR0X3Byb3Bfc3RyKGR0LCAiZGV2aWNlX3R5cGUiLCBkZXZpY2VfdHlwZV92ZGV2aWNlKTsKKwlkdF9wcm9wX3N0cihkdCwgImNvbXBhdGlibGUiLCAiSUJNLGlTZXJpZXMtdmRldmljZSIpOworCWR0X3Byb3BfdTMyKGR0LCAiI2FkZHJlc3MtY2VsbHMiLCAxKTsKKwlkdF9wcm9wX3UzMihkdCwgIiNzaXplLWNlbGxzIiwgMCk7CisKKwlkdF9kb192ZGV2aWNlKGR0LCAidnR5IiwgcmVnLCAtMSwgZGV2aWNlX3R5cGVfc2VyaWFsLCBOVUxMLCAxKTsKKwlyZWcrKzsKKworCWR0X2RvX3ZkZXZpY2UoZHQsICJ2LXNjc2kiLCByZWcsIC0xLCBkZXZpY2VfdHlwZV92c2NzaSwKKwkJCSJJQk0sdi1zY3NpIiwgMSk7CisJcmVnKys7CisKKwl2bGFuX21hcCA9IEh2THBDb25maWdfZ2V0VmlydHVhbExhbkluZGV4TWFwKCk7CisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURWSVJUVUFMTEFOUzsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOworCisJCWlmICgodmxhbl9tYXAgJiAoMHg4MDAwID4+IGkpKSA9PSAwKQorCQkJY29udGludWU7CisJCWR0X2RvX3ZkZXZpY2UoZHQsICJsLWxhbiIsIHJlZywgaSwgZGV2aWNlX3R5cGVfbmV0d29yaywKKwkJCQkiSUJNLGlTZXJpZXMtbC1sYW4iLCAwKTsKKwkJbWFjX2FkZHJbMF0gPSAweDAyOworCQltYWNfYWRkclsxXSA9IDB4MDE7CisJCW1hY19hZGRyWzJdID0gMHhmZjsKKwkJbWFjX2FkZHJbM10gPSBpOworCQltYWNfYWRkcls0XSA9IDB4ZmY7CisJCW1hY19hZGRyWzVdID0gSHZMcENvbmZpZ19nZXRMcEluZGV4X291dGxpbmUoKTsKKwkJZHRfcHJvcChkdCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgKGNoYXIgKiltYWNfYWRkciwgRVRIX0FMRU4pOworCQlkdF9wcm9wKGR0LCAibWFjLWFkZHJlc3MiLCAoY2hhciAqKW1hY19hZGRyLCBFVEhfQUxFTik7CisJCWR0X3Byb3BfdTMyKGR0LCAibWF4LWZyYW1lLXNpemUiLCA5MDAwKTsKKwkJZHRfcHJvcF91MzIoZHQsICJhZGRyZXNzLWJpdHMiLCA0OCk7CisKKwkJZHRfZW5kX25vZGUoZHQpOworCX0KKwlyZWcgKz0gSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxMQU5TOworCisJZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURWSVJUVUFMRElTS1M7IGkrKykKKwkJZHRfZG9fdmRldmljZShkdCwgInZpb2Rhc2QiLCByZWcsIGksIGRldmljZV90eXBlX2Jsb2NrLAorCQkJCSJJQk0saVNlcmllcy12aW9kYXNkIiwgMSk7CisJcmVnICs9IEhWTUFYQVJDSElURUNURURWSVJUVUFMRElTS1M7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxDRFJPTVM7IGkrKykKKwkJZHRfZG9fdmRldmljZShkdCwgInZpb2NkIiwgcmVnLCBpLCBkZXZpY2VfdHlwZV9ibG9jaywKKwkJCQkiSUJNLGlTZXJpZXMtdmlvY2QiLCAxKTsKKwlyZWcgKz0gSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxDRFJPTVM7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxUQVBFUzsgaSsrKQorCQlkdF9kb192ZGV2aWNlKGR0LCAidmlvdGFwZSIsIHJlZywgaSwgZGV2aWNlX3R5cGVfYnl0ZSwKKwkJCQkiSUJNLGlTZXJpZXMtdmlvdGFwZSIsIDEpOworCisJZHRfZW5kX25vZGUoZHQpOworfQorCitzdHJ1Y3QgcGNpX2NsYXNzX25hbWUgeworCXUxNiBjb2RlOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqdHlwZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NsYXNzX25hbWUgX19pbml0ZGF0YSBwY2lfY2xhc3NfbmFtZVtdID0geworCXsgUENJX0NMQVNTX05FVFdPUktfRVRIRVJORVQsICJldGhlcm5ldCIsIGRldmljZV90eXBlX25ldHdvcmsgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2NsYXNzX25hbWUgKiBfX2luaXQgZHRfZmluZF9wY2lfY2xhc3NfbmFtZSh1MTYgY2xhc3NfY29kZSkKK3sKKwlzdHJ1Y3QgcGNpX2NsYXNzX25hbWUgKmNwOworCisJZm9yIChjcCA9IHBjaV9jbGFzc19uYW1lOworCQkJY3AgPCAmcGNpX2NsYXNzX25hbWVbQVJSQVlfU0laRShwY2lfY2xhc3NfbmFtZSldOyBjcCsrKQorCQlpZiAoY3AtPmNvZGUgPT0gY2xhc3NfY29kZSkKKwkJCXJldHVybiBjcDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBub2RlIHNsb3QgaXMgYWx3YXlzIG9uIHRoZSBwcmltYXJ5IGJ1cyEKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNjYW5fYnJpZGdlX3Nsb3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsCisJCUh2QnVzTnVtYmVyIGJ1cywgc3RydWN0IEh2Q2FsbFBjaV9CcmlkZ2VJbmZvICpicmlkZ2VfaW5mbykKK3sKKwlIdlN1YkJ1c051bWJlciBzdWJfYnVzID0gYnJpZGdlX2luZm8tPnN1YkJ1c051bWJlcjsKKwl1MTYgdmVuZG9yX2lkOworCXUxNiBkZXZpY2VfaWQ7CisJdTMyIGNsYXNzX2lkOworCWludCBlcnI7CisJY2hhciBidWZbMzJdOworCXUzMiByZWdbNV07CisJaW50IGlkX3NlbCA9IElTRVJJRVNfR0VUX0RFVklDRV9GUk9NX1NVQkJVUyhzdWJfYnVzKTsKKwlpbnQgZnVuY3Rpb24gPSBJU0VSSUVTX0dFVF9GVU5DVElPTl9GUk9NX1NVQkJVUyhzdWJfYnVzKTsKKwlIdkFnZW50SWQgZWFkc19pZF9zZWwgPSBJU0VSSUVTX1BDSV9BR0VOVElEKGlkX3NlbCwgZnVuY3Rpb24pOworCXU4IGRldmZuOworCXN0cnVjdCBwY2lfY2xhc3NfbmFtZSAqY3A7CisKKwkvKgorCSAqIENvbm5lY3QgYWxsIGZ1bmN0aW9ucyBvZiBhbnkgZGV2aWNlIGZvdW5kLgorCSAqLworCWZvciAoaWRfc2VsID0gMTsgaWRfc2VsIDw9IGJyaWRnZV9pbmZvLT5tYXhBZ2VudHM7IGlkX3NlbCsrKSB7CisJCWZvciAoZnVuY3Rpb24gPSAwOyBmdW5jdGlvbiA8IDg7IGZ1bmN0aW9uKyspIHsKKwkJCUh2QWdlbnRJZCBhZ2VudF9pZCA9IElTRVJJRVNfUENJX0FHRU5USUQoaWRfc2VsLAorCQkJCQlmdW5jdGlvbik7CisJCQllcnIgPSBIdkNhbGxYbV9jb25uZWN0QnVzVW5pdChidXMsIHN1Yl9idXMsCisJCQkJCWFnZW50X2lkLCAwKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlpZiAoZXJyICE9IDB4MzAyKQorCQkJCQlEQkcoImNvbm5lY3RCdXNVbml0KCV4LCAleCwgJXgpICV4XG4iLAorCQkJCQkJYnVzLCBzdWJfYnVzLCBhZ2VudF9pZCwgZXJyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZXJyID0gSHZDYWxsUGNpX2NvbmZpZ0xvYWQxNihidXMsIHN1Yl9idXMsIGFnZW50X2lkLAorCQkJCQlQQ0lfVkVORE9SX0lELCAmdmVuZG9yX2lkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlEQkcoIlJlYWRWZW5kb3IoJXgsICV4LCAleCkgJXhcbiIsCisJCQkJCWJ1cywgc3ViX2J1cywgYWdlbnRfaWQsIGVycik7CisJCQkJY29udGludWU7CisJCQl9CisJCQllcnIgPSBIdkNhbGxQY2lfY29uZmlnTG9hZDE2KGJ1cywgc3ViX2J1cywgYWdlbnRfaWQsCisJCQkJCVBDSV9ERVZJQ0VfSUQsICZkZXZpY2VfaWQpOworCQkJaWYgKGVycikgeworCQkJCURCRygiUmVhZERldmljZSgleCwgJXgsICV4KSAleFxuIiwKKwkJCQkJYnVzLCBzdWJfYnVzLCBhZ2VudF9pZCwgZXJyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWVyciA9IEh2Q2FsbFBjaV9jb25maWdMb2FkMzIoYnVzLCBzdWJfYnVzLCBhZ2VudF9pZCwKKwkJCQkJUENJX0NMQVNTX1JFVklTSU9OICwgJmNsYXNzX2lkKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlEQkcoIlJlYWRDbGFzcygleCwgJXgsICV4KSAleFxuIiwKKwkJCQkJYnVzLCBzdWJfYnVzLCBhZ2VudF9pZCwgZXJyKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZGV2Zm4gPSBQQ0lfREVWRk4oSVNFUklFU19FTkNPREVfREVWSUNFKGVhZHNfaWRfc2VsKSwKKwkJCQkJZnVuY3Rpb24pOworCQkJY3AgPSBkdF9maW5kX3BjaV9jbGFzc19uYW1lKGNsYXNzX2lkID4+IDE2KTsKKwkJCWlmIChjcCAmJiBjcC0+bmFtZSkKKwkJCQlzdHJuY3B5KGJ1ZiwgY3AtPm5hbWUsIHNpemVvZihidWYpIC0gMSk7CisJCQllbHNlCisJCQkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgInBjaSV4LCV4IiwKKwkJCQkJCXZlbmRvcl9pZCwgZGV2aWNlX2lkKTsKKwkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKKwkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLAorCQkJCQkiQCV4IiwgUENJX1NMT1QoZGV2Zm4pKTsKKwkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKKwkJCWlmIChmdW5jdGlvbiAhPSAwKQorCQkJCXNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLAorCQkJCQlzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLAorCQkJCQkiLCV4IiwgZnVuY3Rpb24pOworCQkJZHRfc3RhcnRfbm9kZShkdCwgYnVmKTsKKwkJCXJlZ1swXSA9IChidXMgPDwgMTYpIHwgKGRldmZuIDw8IDgpOworCQkJcmVnWzFdID0gMDsKKwkJCXJlZ1syXSA9IDA7CisJCQlyZWdbM10gPSAwOworCQkJcmVnWzRdID0gMDsKKwkJCWR0X3Byb3BfdTMyX2xpc3QoZHQsICJyZWciLCByZWcsIDUpOworCQkJaWYgKGNwICYmIChjcC0+dHlwZSB8fCBjcC0+bmFtZSkpCisJCQkJZHRfcHJvcF9zdHIoZHQsICJkZXZpY2VfdHlwZSIsCisJCQkJCWNwLT50eXBlID8gY3AtPnR5cGUgOiBjcC0+bmFtZSk7CisJCQlkdF9wcm9wX3UzMihkdCwgInZlbmRvci1pZCIsIHZlbmRvcl9pZCk7CisJCQlkdF9wcm9wX3UzMihkdCwgImRldmljZS1pZCIsIGRldmljZV9pZCk7CisJCQlkdF9wcm9wX3UzMihkdCwgImNsYXNzLWNvZGUiLCBjbGFzc19pZCA+PiA4KTsKKwkJCWR0X3Byb3BfdTMyKGR0LCAicmV2aXNpb24taWQiLCBjbGFzc19pZCAmIDB4ZmYpOworCQkJZHRfcHJvcF91MzIoZHQsICJsaW51eCxzdWJidXMiLCBzdWJfYnVzKTsKKwkJCWR0X3Byb3BfdTMyKGR0LCAibGludXgsYWdlbnQtaWQiLCBhZ2VudF9pZCk7CisJCQlkdF9wcm9wX3UzMihkdCwgImxpbnV4LGxvZ2ljYWwtc2xvdC1udW1iZXIiLAorCQkJCQlicmlkZ2VfaW5mby0+bG9naWNhbFNsb3ROdW1iZXIpOworCQkJZHRfZW5kX25vZGUoZHQpOworCisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzY2FuX2JyaWRnZShzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgSHZCdXNOdW1iZXIgYnVzLAorCQlIdlN1YkJ1c051bWJlciBzdWJfYnVzLCBpbnQgaWRfc2VsKQoreworCXN0cnVjdCBIdkNhbGxQY2lfQnJpZGdlSW5mbyBicmlkZ2VfaW5mbzsKKwlIdkFnZW50SWQgYWdlbnRfaWQ7CisJaW50IGZ1bmN0aW9uOworCWludCByZXQ7CisKKwkvKiBOb3RlOiBodlN1YkJ1cyBhbmQgaXJxIGlzIGFsd2F5cyBiZSAwIGF0IHRoaXMgbGV2ZWwhICovCisJZm9yIChmdW5jdGlvbiA9IDA7IGZ1bmN0aW9uIDwgODsgKytmdW5jdGlvbikgeworCQlhZ2VudF9pZCA9IElTRVJJRVNfUENJX0FHRU5USUQoaWRfc2VsLCBmdW5jdGlvbik7CisJCXJldCA9IEh2Q2FsbFhtX2Nvbm5lY3RCdXNVbml0KGJ1cywgc3ViX2J1cywgYWdlbnRfaWQsIDApOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWlmIChyZXQgIT0gMHhiKQorCQkJCURCRygiY29ubmVjdEJ1c1VuaXQoJXgsICV4LCAleCkgJXhcbiIsCisJCQkJCQlidXMsIHN1Yl9idXMsIGFnZW50X2lkLCByZXQpOworCQkJY29udGludWU7CisJCX0KKwkJREJHKCJmb3VuZCBkZXZpY2UgYXQgYnVzICVkIGlkc2VsICVkIGZ1bmMgJWQgKEFnZW50SWQgJXgpXG4iLAorCQkJCWJ1cywgaWRfc2VsLCBmdW5jdGlvbiwgYWdlbnRfaWQpOworCQlyZXQgPSBIdkNhbGxQY2lfZ2V0QnVzVW5pdEluZm8oYnVzLCBzdWJfYnVzLCBhZ2VudF9pZCwKKwkJCQlpc2VyaWVzX2h2X2FkZHIoJmJyaWRnZV9pbmZvKSwKKwkJCQlzaXplb2Yoc3RydWN0IEh2Q2FsbFBjaV9CcmlkZ2VJbmZvKSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlEQkcoImJyaWRnZSBpbmZvOiB0eXBlICV4IHN1YmJ1cyAleCAiCisJCQkibWF4QWdlbnRzICV4IG1heHN1YmJ1cyAleCBsb2dzbG90ICV4XG4iLAorCQkJYnJpZGdlX2luZm8uYnVzVW5pdEluZm8uZGV2aWNlVHlwZSwKKwkJCWJyaWRnZV9pbmZvLnN1YkJ1c051bWJlciwKKwkJCWJyaWRnZV9pbmZvLm1heEFnZW50cywKKwkJCWJyaWRnZV9pbmZvLm1heFN1YkJ1c051bWJlciwKKwkJCWJyaWRnZV9pbmZvLmxvZ2ljYWxTbG90TnVtYmVyKTsKKwkJaWYgKGJyaWRnZV9pbmZvLmJ1c1VuaXRJbmZvLmRldmljZVR5cGUgPT0KKwkJCQlIdkNhbGxQY2lfQnJpZGdlRGV2aWNlKQorCQkJc2Nhbl9icmlkZ2Vfc2xvdChkdCwgYnVzLCAmYnJpZGdlX2luZm8pOworCQllbHNlCisJCQlEQkcoIlBDSTogSW52YWxpZCBCcmlkZ2UgQ29uZmlndXJhdGlvbigweCUwMlgpIiwKKwkJCQlicmlkZ2VfaW5mby5idXNVbml0SW5mby5kZXZpY2VUeXBlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzY2FuX3BoYihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgSHZCdXNOdW1iZXIgYnVzKQoreworCXN0cnVjdCBIdkNhbGxQY2lfRGV2aWNlSW5mbyBkZXZfaW5mbzsKKwljb25zdCBIdlN1YkJ1c051bWJlciBzdWJfYnVzID0gMDsJLyogRUFEcyBpcyBhbHdheXMgMC4gKi8KKwlpbnQgZXJyOworCWludCBpZF9zZWw7CisJY29uc3QgaW50IG1heF9hZ2VudHMgPSA4OworCisJLyoKKwkgKiBQcm9iZSBmb3IgRUFEcyBCcmlkZ2VzCisJICovCisJZm9yIChpZF9zZWwgPSAxOyBpZF9zZWwgPCBtYXhfYWdlbnRzOyArK2lkX3NlbCkgeworCQllcnIgPSBIdkNhbGxQY2lfZ2V0RGV2aWNlSW5mbyhidXMsIHN1Yl9idXMsIGlkX3NlbCwKKwkJCQlpc2VyaWVzX2h2X2FkZHIoJmRldl9pbmZvKSwKKwkJCQlzaXplb2Yoc3RydWN0IEh2Q2FsbFBjaV9EZXZpY2VJbmZvKSk7CisJCWlmIChlcnIpIHsKKwkJCWlmIChlcnIgIT0gMHgzMDIpCisJCQkJREJHKCJnZXREZXZpY2VJbmZvKCV4LCAleCwgJXgpICV4XG4iLAorCQkJCQkJYnVzLCBzdWJfYnVzLCBpZF9zZWwsIGVycik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZGV2X2luZm8uZGV2aWNlVHlwZSAhPSBIdkNhbGxQY2lfTm9kZURldmljZSkgeworCQkJREJHKCJQQ0k6IEludmFsaWQgU3lzdGVtIENvbmZpZ3VyYXRpb24iCisJCQkJCSIoMHglMDJYKSBmb3IgYnVzIDB4JTAyeCBpZCAweCUwMnguXG4iLAorCQkJCQlkZXZfaW5mby5kZXZpY2VUeXBlLCBidXMsIGlkX3NlbCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzY2FuX2JyaWRnZShkdCwgYnVzLCBzdWJfYnVzLCBpZF9zZWwpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGR0X3BjaV9kZXZpY2VzKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0KQoreworCUh2QnVzTnVtYmVyIGJ1czsKKwljaGFyIGJ1ZlszMl07CisJdTMyIGJ1c2VzWzJdOworCWludCBwaGJfbnVtID0gMDsKKworCS8qIENoZWNrIGFsbCBwb3NzaWJsZSBidXNlcy4gKi8KKwlmb3IgKGJ1cyA9IDA7IGJ1cyA8IDI1NjsgYnVzKyspIHsKKwkJaW50IGVyciA9IEh2Q2FsbFhtX3Rlc3RCdXMoYnVzKTsKKworCQlpZiAoZXJyKSB7CisJCQkvKgorCQkJICogQ2hlY2sgZm9yIFVuZXhwZWN0ZWQgUmV0dXJuIGNvZGUsIGEgY2x1ZSB0aGF0CisJCQkgKiBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcuCisJCQkgKi8KKwkJCWlmIChlcnIgIT0gMHgwMzAxKQorCQkJCURCRygiVW5leHBlY3RlZCBSZXR1cm4gb24gUHJvYmUoMHglMDJYKSAiCisJCQkJCQkiMHglMDRYXG4iLCBidXMsIGVycik7CisJCQljb250aW51ZTsKKwkJfQorCQlEQkcoImJ1cyAlZCBhcHBlYXJzIHRvIGV4aXN0XG4iLCBidXMpOworCQlzbnByaW50ZihidWYsIDMyLCAicGNpQCVkIiwgcGhiX251bSk7CisJCWR0X3N0YXJ0X25vZGUoZHQsIGJ1Zik7CisJCWR0X3Byb3Bfc3RyKGR0LCAiZGV2aWNlX3R5cGUiLCBkZXZpY2VfdHlwZV9wY2kpOworCQlkdF9wcm9wX3N0cihkdCwgImNvbXBhdGlibGUiLCAiSUJNLGlTZXJpZXMtTG9naWNhbC1QSEIiKTsKKwkJZHRfcHJvcF91MzIoZHQsICIjYWRkcmVzcy1jZWxscyIsIDMpOworCQlkdF9wcm9wX3UzMihkdCwgIiNzaXplLWNlbGxzIiwgMik7CisJCWJ1c2VzWzBdID0gYnVzZXNbMV0gPSBidXM7CisJCWR0X3Byb3BfdTMyX2xpc3QoZHQsICJidXMtcmFuZ2UiLCBidXNlcywgMik7CisJCXNjYW5fcGhiKGR0LCBidXMpOworCQlkdF9lbmRfbm9kZShkdCk7CisJCXBoYl9udW0rKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR0X2ZpbmlzaChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCkKK3sKKwlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfRU5EKTsKKwlkdC0+aGVhZGVyLnRvdGFsc2l6ZSA9ICh1bnNpZ25lZCBsb25nKWR0X2RhdGEgLSAodW5zaWduZWQgbG9uZylkdDsKKwlrbGltaXQgPSBBTElHTigodW5zaWduZWQgbG9uZylkdF9kYXRhLCA4KTsKK30KKwordm9pZCAqIF9faW5pdCBidWlsZF9mbGF0X2R0KHVuc2lnbmVkIGxvbmcgcGh5c19tZW1fc2l6ZSkKK3sKKwlzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICppc2VyaWVzX2R0OworCXU2NCB0bXBbMl07CisKKwlpc2VyaWVzX2R0ID0gZHRfaW5pdCgpOworCisJZHRfc3RhcnRfbm9kZShpc2VyaWVzX2R0LCAiIik7CisKKwlkdF9wcm9wX3UzMihpc2VyaWVzX2R0LCAiI2FkZHJlc3MtY2VsbHMiLCAyKTsKKwlkdF9wcm9wX3UzMihpc2VyaWVzX2R0LCAiI3NpemUtY2VsbHMiLCAyKTsKKwlkdF9tb2RlbChpc2VyaWVzX2R0KTsKKworCS8qIC9tZW1vcnkgKi8KKwlkdF9zdGFydF9ub2RlKGlzZXJpZXNfZHQsICJtZW1vcnlAMCIpOworCWR0X3Byb3Bfc3RyKGlzZXJpZXNfZHQsICJkZXZpY2VfdHlwZSIsIGRldmljZV90eXBlX21lbW9yeSk7CisJdG1wWzBdID0gMDsKKwl0bXBbMV0gPSBwaHlzX21lbV9zaXplOworCWR0X3Byb3BfdTY0X2xpc3QoaXNlcmllc19kdCwgInJlZyIsIHRtcCwgMik7CisJZHRfZW5kX25vZGUoaXNlcmllc19kdCk7CisKKwkvKiAvY2hvc2VuICovCisJZHRfc3RhcnRfbm9kZShpc2VyaWVzX2R0LCAiY2hvc2VuIik7CisJZHRfcHJvcF9zdHIoaXNlcmllc19kdCwgImJvb3RhcmdzIiwgY21kX2xpbmUpOworCWR0X2VuZF9ub2RlKGlzZXJpZXNfZHQpOworCisJZHRfY3B1cyhpc2VyaWVzX2R0KTsKKworCWR0X3ZkZXZpY2VzKGlzZXJpZXNfZHQpOworCWR0X3BjaV9kZXZpY2VzKGlzZXJpZXNfZHQpOworCisJZHRfZW5kX25vZGUoaXNlcmllc19kdCk7CisKKwlkdF9maW5pc2goaXNlcmllc19kdCk7CisKKwlyZXR1cm4gaXNlcmllc19kdDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKaW5kZXggYmVhMGI3MC4uZTNiZDIwMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmMKQEAgLTQsNiArNCw3IEBACiAgKiBSZXdyaXRlLCBjbGVhbnVwOgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+LCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CiAgKgogICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0LCBpU2VyaWVzLXNwZWNpZmljIHBhcnRzLgogICoKQEAgLTMxLDQyICszMiwzNyBAQAogI2luY2x1ZGUgPGFzbS90Y2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9jYWxsX3htLmg+Ci0KLSNpbmNsdWRlICJpb21tdS5oIgotCi1leHRlcm4gc3RydWN0IGxpc3RfaGVhZCBpU2VyaWVzX0dsb2JhbF9EZXZpY2VfTGlzdDsKLQorI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2lvbW11Lmg+CiAKIHN0YXRpYyB2b2lkIHRjZV9idWlsZF9pU2VyaWVzKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcywKIAkJdW5zaWduZWQgbG9uZyB1YWRkciwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCXU2NCByYzsKLQl1bmlvbiB0Y2VfZW50cnkgdGNlOworCXU2NCB0Y2UsIHJwbjsKIAogCWluZGV4IDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAJbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAKIAl3aGlsZSAobnBhZ2VzLS0pIHsKLQkJdGNlLnRlX3dvcmQgPSAwOwotCQl0Y2UudGVfYml0cy50Yl9ycG4gPSB2aXJ0X3RvX2Ficyh1YWRkcikgPj4gVENFX1NISUZUOworCQlycG4gPSB2aXJ0X3RvX2Ficyh1YWRkcikgPj4gVENFX1NISUZUOworCQl0Y2UgPSAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOwogCiAJCWlmICh0YmwtPml0X3R5cGUgPT0gVENFX1ZCKSB7CiAJCQkvKiBWaXJ0dWFsIEJ1cyAqLwotCQkJdGNlLnRlX2JpdHMudGJfdmFsaWQgPSAxOwotCQkJdGNlLnRlX2JpdHMudGJfYWxsaW8gPSAxOworCQkJdGNlIHw9IFRDRV9WQUxJRHxUQ0VfQUxMSU87CiAJCQlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCi0JCQkJdGNlLnRlX2JpdHMudGJfcmR3ciA9IDE7CisJCQkJdGNlIHw9IFRDRV9WQl9XUklURTsKIAkJfSBlbHNlIHsKIAkJCS8qIFBDSSBCdXMgKi8KLQkJCXRjZS50ZV9iaXRzLnRiX3Jkd3IgPSAxOyAvKiBSZWFkIGFsbG93ZWQgKi8KKwkJCXRjZSB8PSBUQ0VfUENJX1JFQUQ7IC8qIFJlYWQgYWxsb3dlZCAqLwogCQkJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQotCQkJCXRjZS50ZV9iaXRzLnRiX3BjaXdyID0gMTsKKwkJCQl0Y2UgfD0gVENFX1BDSV9XUklURTsKIAkJfQogCi0JCXJjID0gSHZDYWxsWG1fc2V0VGNlKCh1NjQpdGJsLT5pdF9pbmRleCwgKHU2NClpbmRleCwKLQkJCQl0Y2UudGVfd29yZCk7CisJCXJjID0gSHZDYWxsWG1fc2V0VGNlKCh1NjQpdGJsLT5pdF9pbmRleCwgKHU2NClpbmRleCwgdGNlKTsKIAkJaWYgKHJjKQogCQkJcGFuaWMoIlBDSV9ETUE6IEh2Q2FsbFhtX3NldFRjZSBmYWlsZWQsIFJjOiAweCVseFxuIiwKIAkJCQkJcmMpOwpAQCAtMTI0LDcgKzEyMCw3IEBACiAKIAkvKiBpdGNfc2l6ZSBpcyBpbiBwYWdlcyB3b3J0aCBvZiB0YWJsZSwgaXRfc2l6ZSBpcyBpbiAjIG9mIGVudHJpZXMgKi8KIAl0YmwtPml0X3NpemUgPSAoKHBhcm1zLT5pdGNfc2l6ZSAqIFRDRV9QQUdFX1NJWkUpIC8KLQkJCXNpemVvZih1bmlvbiB0Y2VfZW50cnkpKSA+PiBUQ0VfUEFHRV9GQUNUT1I7CisJCQlUQ0VfRU5UUllfU0laRSkgPj4gVENFX1BBR0VfRkFDVE9SOwogCXRibC0+aXRfYnVzbm8gPSBwYXJtcy0+aXRjX2J1c25vOwogCXRibC0+aXRfb2Zmc2V0ID0gcGFybXMtPml0Y19vZmZzZXQgPj4gVENFX1BBR0VfRkFDVE9SOwogCXRibC0+aXRfaW5kZXggPSBwYXJtcy0+aXRjX2luZGV4OwpAQCAtMTQyLDEwICsxMzgsMTUgQEAKICAqLwogc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfdGFibGVfZmluZChzdHJ1Y3QgaW9tbXVfdGFibGUgKiB0YmwpCiB7Ci0Jc3RydWN0IHBjaV9kbiAqcGRuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkocGRuLCAmaVNlcmllc19HbG9iYWxfRGV2aWNlX0xpc3QsIERldmljZV9MaXN0KSB7Ci0JCXN0cnVjdCBpb21tdV90YWJsZSAqaXQgPSBwZG4tPmlvbW11X3RhYmxlOworCWZvciAobm9kZSA9IE5VTEw7IChub2RlID0gb2ZfZmluZF9hbGxfbm9kZXMobm9kZSkpOyApIHsKKwkJc3RydWN0IHBjaV9kbiAqcGRuID0gUENJX0ROKG5vZGUpOworCQlzdHJ1Y3QgaW9tbXVfdGFibGUgKml0OworCisJCWlmIChwZG4gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpdCA9IHBkbi0+aW9tbXVfdGFibGU7CiAJCWlmICgoaXQgIT0gTlVMTCkgJiYKIAkJICAgIChpdC0+aXRfdHlwZSA9PSBUQ0VfUENJKSAmJgogCQkgICAgKGl0LT5pdF9vZmZzZXQgPT0gdGJsLT5pdF9vZmZzZXQpICYmCkBAIC0xNjEsMTUgKzE2MiwxOCBAQAogewogCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsOwogCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihkbik7CisJdTMyICpsc24gPSAodTMyICopZ2V0X3Byb3BlcnR5KGRuLCAibGludXgsbG9naWNhbC1zbG90LW51bWJlciIsIE5VTEwpOworCisJQlVHX09OKGxzbiA9PSBOVUxMKTsKIAogCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOwogCi0JaW9tbXVfdGFibGVfZ2V0cGFybXNfaVNlcmllcyhwZG4tPmJ1c25vLCBwZG4tPkxvZ2ljYWxTbG90LCAwLCB0YmwpOworCWlvbW11X3RhYmxlX2dldHBhcm1zX2lTZXJpZXMocGRuLT5idXNubywgKmxzbiwgMCwgdGJsKTsKIAogCS8qIExvb2sgZm9yIGV4aXN0aW5nIHRjZSB0YWJsZSAqLwogCXBkbi0+aW9tbXVfdGFibGUgPSBpb21tdV90YWJsZV9maW5kKHRibCk7CiAJaWYgKHBkbi0+aW9tbXVfdGFibGUgPT0gTlVMTCkKLQkJcGRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJcGRuLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsLCAtMSk7CiAJZWxzZQogCQlrZnJlZSh0YmwpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5jCmluZGV4IGJlM2ZiZmMuLjYyYmJiY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vaXNlcmllcy9pdF9scF9xdWV1ZS5oPgogCiAjaW5jbHVkZSAiaXJxLmgiCisjaW5jbHVkZSAicGNpLmgiCiAjaW5jbHVkZSAiY2FsbF9wY2kuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKQEAgLTMxMiwxMiArMzEzLDEyIEBACiAgKiBOb3RlIHRoYXQgc3ViX2J1cyBpcyBhbHdheXMgMCAoYXQgdGhlIG1vbWVudCBhdCBsZWFzdCkuCiAgKi8KIGludCBfX2luaXQgaVNlcmllc19hbGxvY2F0ZV9JUlEoSHZCdXNOdW1iZXIgYnVzLAotCQlIdlN1YkJ1c051bWJlciBzdWJfYnVzLCBIdkFnZW50SWQgZGV2X2lkKQorCQlIdlN1YkJ1c051bWJlciBzdWJfYnVzLCB1MzIgYnN1YmJ1cykKIHsKIAlpbnQgdmlydGlycTsKIAl1bnNpZ25lZCBpbnQgcmVhbGlycTsKLQl1OCBpZHNlbCA9IChkZXZfaWQgPj4gNCk7Ci0JdTggZnVuY3Rpb24gPSBkZXZfaWQgJiA3OworCXU4IGlkc2VsID0gSVNFUklFU19HRVRfREVWSUNFX0ZST01fU1VCQlVTKGJzdWJidXMpOworCXU4IGZ1bmN0aW9uID0gSVNFUklFU19HRVRfRlVOQ1RJT05fRlJPTV9TVUJCVVMoYnN1YmJ1cyk7CiAKIAlyZWFsaXJxID0gKCgoKChzdWJfYnVzIDw8IDgpICsgKGJ1cyAtIDEpKSA8PCAzKSArIChpZHNlbCAtIDEpKSA8PCAzKQogCQkrIGZ1bmN0aW9uOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lycS5oCmluZGV4IGI5YzgwMWIuLjE4OGFhODAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pcnEuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvaXJxLmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lCV9JU0VSSUVTX0lSUV9ICiAKIGV4dGVybiB2b2lkIGlTZXJpZXNfaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50ICBpU2VyaWVzX2FsbG9jYXRlX0lSUShIdkJ1c051bWJlciwgSHZTdWJCdXNOdW1iZXIsIEh2QWdlbnRJZCk7CitleHRlcm4gaW50ICBpU2VyaWVzX2FsbG9jYXRlX0lSUShIdkJ1c051bWJlciwgSHZTdWJCdXNOdW1iZXIsIHUzMik7CiBleHRlcm4gdm9pZCBpU2VyaWVzX2FjdGl2YXRlX0lSUXModm9pZCk7CiBleHRlcm4gaW50IGlTZXJpZXNfZ2V0X2lycShzdHJ1Y3QgcHRfcmVncyAqKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL21mLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYwppbmRleCBkNzcxYjhlLi4xYTJjMmE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvbWYuYwpAQCAtNDUsNyArNDUsNiBAQAogCiAjaW5jbHVkZSAic2V0dXAuaCIKIAotZXh0ZXJuIGludCBwaXJhbmhhX3NpbXVsYXRvcjsKIHN0YXRpYyBpbnQgbWZfaW5pdGlhbGl6ZWQ7CiAKIC8qCkBAIC02NTgsNyArNjU3LDcgQEAKIAogdm9pZCBfX2luaXQgbWZfZGlzcGxheV9wcm9ncmVzcyh1MTYgdmFsdWUpCiB7Ci0JaWYgKHBpcmFuaGFfc2ltdWxhdG9yIHx8ICFtZl9pbml0aWFsaXplZCkKKwlpZiAoIW1mX2luaXRpYWxpemVkKQogCQlyZXR1cm47CiAKIAlpZiAoMHhGRkZGID09IHZhbHVlKQpAQCAtMTI5NSw5ICsxMjk0LDYgQEAKICAqLwogdm9pZCBpU2VyaWVzX2dldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190bSkKIHsKLQlpZiAocGlyYW5oYV9zaW11bGF0b3IpCi0JCXJldHVybjsKLQogCW1mX2dldF9ydGMocnRjX3RtKTsKIAlydGNfdG0tPnRtX21vbi0tOwogfQpAQCAtMTMxNiw5ICsxMzEyLDYgQEAKIHsKIAlzdHJ1Y3QgcnRjX3RpbWUgdG07CiAKLQlpZiAocGlyYW5oYV9zaW11bGF0b3IpCi0JCXJldHVybiAwOwotCiAJbWZfZ2V0X2Jvb3RfcnRjKCZ0bSk7CiAJcmV0dXJuIG1rdGltZSh0bS50bV95ZWFyICsgMTkwMCwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAogCQkgICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvcGNpLmMKaW5kZXggYTE5ODMzYi4uMzViY2M5OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9wY2kuYwpAQCAtMzcsMzYgKzM3LDE4IEBACiAKICNpbmNsdWRlIDxhc20vaXNlcmllcy9odl9jYWxsX3htLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvbWYuaD4KKyNpbmNsdWRlIDxhc20vaXNlcmllcy9pb21tdS5oPgogCiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KIAogI2luY2x1ZGUgImlycS5oIgogI2luY2x1ZGUgInBjaS5oIgogI2luY2x1ZGUgImNhbGxfcGNpLmgiCi0jaW5jbHVkZSAiaW9tbXUuaCIKLQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW9fcGFnZV9tYXNrOwogCiAvKgogICogRm9yd2FyZCBkZWNsYXJlcyBvZiBwcm90b3R5cGVzLgogICovCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpmaW5kX0RldmljZV9Ob2RlKGludCBidXMsIGludCBkZXZmbik7Ci1zdGF0aWMgdm9pZCBzY2FuX1BIQl9zbG90cyhzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKlBoYik7Ci1zdGF0aWMgdm9pZCBzY2FuX0VBRFNfYnJpZGdlKEh2QnVzTnVtYmVyIEJ1cywgSHZTdWJCdXNOdW1iZXIgU3ViQnVzLCBpbnQgSWRTZWwpOwotc3RhdGljIGludCBzY2FuX2JyaWRnZV9zbG90KEh2QnVzTnVtYmVyIEJ1cywgc3RydWN0IEh2Q2FsbFBjaV9CcmlkZ2VJbmZvICpJbmZvKTsKLQotTElTVF9IRUFEKGlTZXJpZXNfR2xvYmFsX0RldmljZV9MaXN0KTsKLQotc3RhdGljIGludCBEZXZpY2VDb3VudDsKLQotLyogQ291bnRlcnMgYW5kIGNvbnRyb2wgZmxhZ3MuICovCi1zdGF0aWMgbG9uZyBQY2lfSW9fUmVhZF9Db3VudDsKLXN0YXRpYyBsb25nIFBjaV9Jb19Xcml0ZV9Db3VudDsKLSNpZiAwCi1zdGF0aWMgbG9uZyBQY2lfQ2ZnX1JlYWRfQ291bnQ7Ci1zdGF0aWMgbG9uZyBQY2lfQ2ZnX1dyaXRlX0NvdW50OwotI2VuZGlmCi1zdGF0aWMgbG9uZyBQY2lfRXJyb3JfQ291bnQ7CiAKIHN0YXRpYyBpbnQgUGNpX1JldHJ5X01heCA9IDM7CS8qIE9ubHkgcmV0cnkgMyB0aW1lcyAgKi8KIHN0YXRpYyBpbnQgUGNpX0Vycm9yX0ZsYWcgPSAxOwkvKiBTZXQgUmV0cnkgRXJyb3Igb24uICovCkBAIC04MSw0MSArNjMsMTkgQEAKICNkZWZpbmUgSU9NTV9UQUJMRV9FTlRSWV9TSVpFCTB4MDAwMDAwMDAwMDQwMDAwMFVMCiAjZGVmaW5lIEJBU0VfSU9fTUVNT1JZCQkweEUwMDAwMDAwMDAwMDAwMDBVTAogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfaW9fbWVtb3J5ID0gMHhFMDAwMDAwMDAwMDAwMDAwVUw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYXhfaW9fbWVtb3J5ID0gQkFTRV9JT19NRU1PUlk7CiBzdGF0aWMgbG9uZyBjdXJyZW50X2lvbW1fdGFibGVfZW50cnk7CiAKIC8qCiAgKiBMb29rdXAgVGFibGVzLgogICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICoqaW9tbV90YWJsZTsKLXN0YXRpYyB1OCAqaW9iYXJfdGFibGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICppb21tX3RhYmxlW0lPTU1fVEFCTEVfTUFYX0VOVFJJRVNdOworc3RhdGljIHU4IGlvYmFyX3RhYmxlW0lPTU1fVEFCTEVfTUFYX0VOVFJJRVNdOwogCi0vKgotICogU3RhdGljIGFuZCBHbG9iYWwgdmFyaWFibGVzCi0gKi8KLXN0YXRpYyBjaGFyICpwY2lfaW9fdGV4dCA9ICJpU2VyaWVzIFBDSSBJL08iOworc3RhdGljIGNvbnN0IGNoYXIgcGNpX2lvX3RleHRbXSA9ICJpU2VyaWVzIFBDSSBJL08iOwogc3RhdGljIERFRklORV9TUElOTE9DSyhpb21tX3RhYmxlX2xvY2spOwogCiAvKgotICogaW9tbV90YWJsZV9pbml0aWFsaXplCi0gKgotICogQWxsb2NhdGVzIGFuZCBpbml0YWxpemVzIHRoZSBBZGRyZXNzIFRyYW5zbGF0aW9uIFRhYmxlIGFuZCBCYXIKLSAqIFRhYmxlcyB0byBnZXQgdGhlbSByZWFkeSBmb3IgdXNlLiAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueQotICogSS9PIHNwYWNlIGlzIGhhbmRlZCBvdXQgdG8gdGhlIGRldmljZSBCQVJzLgotICovCi1zdGF0aWMgdm9pZCBpb21tX3RhYmxlX2luaXRpYWxpemUodm9pZCkKLXsKLQlzcGluX2xvY2soJmlvbW1fdGFibGVfbG9jayk7Ci0JaW9tbV90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKCppb21tX3RhYmxlKSAqIElPTU1fVEFCTEVfTUFYX0VOVFJJRVMsCi0JCQlHRlBfS0VSTkVMKTsKLQlpb2Jhcl90YWJsZSA9IGttYWxsb2Moc2l6ZW9mKCppb2Jhcl90YWJsZSkgKiBJT01NX1RBQkxFX01BWF9FTlRSSUVTLAotCQkJR0ZQX0tFUk5FTCk7Ci0Jc3Bpbl91bmxvY2soJmlvbW1fdGFibGVfbG9jayk7Ci0JaWYgKChpb21tX3RhYmxlID09IE5VTEwpIHx8IChpb2Jhcl90YWJsZSA9PSBOVUxMKSkKLQkJcGFuaWMoIlBDSTogSS9PIHRhYmxlcyBhbGxvY2F0aW9uIGZhaWxlZC5cbiIpOwotfQotCi0vKgogICogaW9tbV90YWJsZV9hbGxvY2F0ZV9lbnRyeQogICoKICAqIEFkZHMgcGNpX2RldiBlbnRyeSBpbiBhZGRyZXNzIHRyYW5zbGF0aW9uIHRhYmxlCkBAIC0xNDIsOSArMTAyLDggQEAKIAkgKi8KIAlzcGluX2xvY2soJmlvbW1fdGFibGVfbG9jayk7CiAJYmFyX3Jlcy0+bmFtZSA9IHBjaV9pb190ZXh0OwotCWJhcl9yZXMtPnN0YXJ0ID0KKwliYXJfcmVzLT5zdGFydCA9IEJBU0VfSU9fTUVNT1JZICsKIAkJSU9NTV9UQUJMRV9FTlRSWV9TSVpFICogY3VycmVudF9pb21tX3RhYmxlX2VudHJ5OwotCWJhcl9yZXMtPnN0YXJ0ICs9IEJBU0VfSU9fTUVNT1JZOwogCWJhcl9yZXMtPmVuZCA9IGJhcl9yZXMtPnN0YXJ0ICsgYmFyX3NpemUgLSAxOwogCS8qCiAJICogQWxsb2NhdGUgdGhlIG51bWJlciBvZiB0YWJsZSBlbnRyaWVzIG5lZWRlZCBmb3IgQkFSLgpAQCAtMTU2LDcgKzExNSw3IEBACiAJCSsrY3VycmVudF9pb21tX3RhYmxlX2VudHJ5OwogCX0KIAltYXhfaW9fbWVtb3J5ID0gQkFTRV9JT19NRU1PUlkgKwotCQkoSU9NTV9UQUJMRV9FTlRSWV9TSVpFICogY3VycmVudF9pb21tX3RhYmxlX2VudHJ5KTsKKwkJSU9NTV9UQUJMRV9FTlRSWV9TSVpFICogY3VycmVudF9pb21tX3RhYmxlX2VudHJ5OwogCXNwaW5fdW5sb2NrKCZpb21tX3RhYmxlX2xvY2spOwogfQogCkBAIC0xNzMsMTMgKzEzMiwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBhbGxvY2F0ZV9kZXZpY2VfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCXN0cnVjdCByZXNvdXJjZSAqYmFyX3JlczsKIAlpbnQgYmFyX251bTsKIAotCWZvciAoYmFyX251bSA9IDA7IGJhcl9udW0gPD0gUENJX1JPTV9SRVNPVVJDRTsgKytiYXJfbnVtKSB7Ci0JCWJhcl9yZXMgPSAmZGV2LT5yZXNvdXJjZVtiYXJfbnVtXTsKKwlmb3IgKGJhcl9udW0gPSAwOyBiYXJfbnVtIDw9IFBDSV9ST01fUkVTT1VSQ0U7ICsrYmFyX251bSkKIAkJaW9tbV90YWJsZV9hbGxvY2F0ZV9lbnRyeShkZXYsIGJhcl9udW0pOwotCX0KIH0KIAogLyoKQEAgLTE5OSwzNCArMTU1LDcgQEAKIH0KIAogLyoKLSAqIGJ1aWxkX2RldmljZV9ub2RlKHUxNiBCdXMsIGludCBTdWJCdXMsIHU4IERldkZuKQotICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpidWlsZF9kZXZpY2Vfbm9kZShIdkJ1c051bWJlciBCdXMsCi0JCUh2U3ViQnVzTnVtYmVyIFN1YkJ1cywgaW50IEFnZW50SWQsIGludCBGdW5jdGlvbikKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0Jc3RydWN0IHBjaV9kbiAqcGRuOwotCi0Jbm9kZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZpY2Vfbm9kZSksIEdGUF9LRVJORUwpOwotCWlmIChub2RlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldChub2RlLCAwLCBzaXplb2Yoc3RydWN0IGRldmljZV9ub2RlKSk7Ci0JcGRuID0ga3phbGxvYyhzaXplb2YoKnBkbiksIEdGUF9LRVJORUwpOwotCWlmIChwZG4gPT0gTlVMTCkgewotCQlrZnJlZShub2RlKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW5vZGUtPmRhdGEgPSBwZG47Ci0JcGRuLT5ub2RlID0gbm9kZTsKLQlsaXN0X2FkZF90YWlsKCZwZG4tPkRldmljZV9MaXN0LCAmaVNlcmllc19HbG9iYWxfRGV2aWNlX0xpc3QpOwotCXBkbi0+YnVzbm8gPSBCdXM7Ci0JcGRuLT5idXNzdWJubyA9IFN1YkJ1czsKLQlwZG4tPmRldmZuID0gUENJX0RFVkZOKElTRVJJRVNfRU5DT0RFX0RFVklDRShBZ2VudElkKSwgRnVuY3Rpb24pOwotCXJldHVybiBub2RlOwotfQotCi0vKgotICogdW5zaWduZWQgbG9uZyBfX2luaXQgZmluZF9hbmRfaW5pdF9waGJzKHZvaWQpCisgKiBpU2VyaWVzX3BjaWJpb3NfaW5pdAogICoKICAqIERlc2NyaXB0aW9uOgogICogICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBmb3IgYWxsIHBvc3NpYmxlIHN5c3RlbSBQQ0kgaG9zdCBicmlkZ2VzIHRoYXQgY29ubmVjdApAQCAtMjM0LDUwICsxNjMsNDIgQEAKICAqICAgb3duZXJzaGlwIHN0YXR1cy4gIEEgcGNpX2NvbnRyb2xsZXIgaXMgYnVpbHQgZm9yIGFueSBidXMgd2hpY2ggaXMgcGFydGlhbGx5CiAgKiAgIG93bmVkIG9yIGZ1bGx5IG93bmVkIGJ5IHRoaXMgZ3Vlc3QgcGFydGl0aW9uLgogICovCi11bnNpZ25lZCBsb25nIF9faW5pdCBmaW5kX2FuZF9pbml0X3BoYnModm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBoYjsKLQlIdkJ1c051bWJlciBidXM7Ci0KLQkvKiBDaGVjayBhbGwgcG9zc2libGUgYnVzZXMuICovCi0JZm9yIChidXMgPSAwOyBidXMgPCAyNTY7IGJ1cysrKSB7Ci0JCWludCByZXQgPSBIdkNhbGxYbV90ZXN0QnVzKGJ1cyk7Ci0JCWlmIChyZXQgPT0gMCkgewotCQkJcHJpbnRrKCJidXMgJWQgYXBwZWFycyB0byBleGlzdFxuIiwgYnVzKTsKLQotCQkJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKE5VTEwpOwotCQkJaWYgKHBoYiA9PSBOVUxMKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7Ci0JCQlwaGItPmZpcnN0X2J1c25vID0gYnVzOwotCQkJcGhiLT5sYXN0X2J1c25vID0gYnVzOwotCQkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOwotCi0JCQkvKiBGaW5kIGFuZCBjb25uZWN0IHRoZSBkZXZpY2VzLiAqLwotCQkJc2Nhbl9QSEJfc2xvdHMocGhiKTsKLQkJfQotCQkvKgotCQkgKiBDaGVjayBmb3IgVW5leHBlY3RlZCBSZXR1cm4gY29kZSwgYSBjbHVlIHRoYXQgc29tZXRoaW5nCi0JCSAqIGhhcyBnb25lIHdyb25nLgotCQkgKi8KLQkJZWxzZSBpZiAocmV0ICE9IDB4MDMwMSkKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5leHBlY3RlZCBSZXR1cm4gb24gUHJvYmUoMHglMDRYKTogMHglMDRYIiwKLQkJCSAgICAgICBidXMsIHJldCk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgotICogaVNlcmllc19wY2liaW9zX2luaXQKLSAqCi0gKiBDaGFuY2UgdG8gaW5pdGlhbGl6ZSBhbmQgc3RydWN0dXJlcyBvciB2YXJpYWJsZSBiZWZvcmUgUENJIEJ1cyB3YWxrLgotICovCiB2b2lkIGlTZXJpZXNfcGNpYmlvc19pbml0KHZvaWQpCiB7Ci0JaW9tbV90YWJsZV9pbml0aWFsaXplKCk7Ci0JZmluZF9hbmRfaW5pdF9waGJzKCk7Ci0JaW9fcGFnZV9tYXNrID0gLTE7CisJc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGI7CisJc3RydWN0IGRldmljZV9ub2RlICpyb290ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBOVUxMOworCisJaWYgKHJvb3QgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9DUklUICJpU2VyaWVzX3BjaWJpb3NfaW5pdDogY2FuJ3QgZmluZCByb290ICIKKwkJCQkib2YgZGV2aWNlIHRyZWVcbiIpOworCQlyZXR1cm47CisJfQorCXdoaWxlICgobm9kZSA9IG9mX2dldF9uZXh0X2NoaWxkKHJvb3QsIG5vZGUpKSAhPSBOVUxMKSB7CisJCUh2QnVzTnVtYmVyIGJ1czsKKwkJdTMyICpidXNwOworCisJCWlmICgobm9kZS0+dHlwZSA9PSBOVUxMKSB8fCAoc3RyY21wKG5vZGUtPnR5cGUsICJwY2kiKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCisJCWJ1c3AgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKKwkJaWYgKGJ1c3AgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlidXMgPSAqYnVzcDsKKwkJcHJpbnRrKCJidXMgJWQgYXBwZWFycyB0byBleGlzdFxuIiwgYnVzKTsKKwkJcGhiID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5vZGUpOworCQlpZiAocGhiID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlwaGItPnBjaV9tZW1fb2Zmc2V0ID0gcGhiLT5sb2NhbF9udW1iZXIgPSBidXM7CisJCXBoYi0+Zmlyc3RfYnVzbm8gPSBidXM7CisJCXBoYi0+bGFzdF9idXNubyA9IGJ1czsKKwkJcGhiLT5vcHMgPSAmaVNlcmllc19wY2lfb3BzOworCX0KKworCW9mX25vZGVfcHV0KHJvb3QpOworCisJcGNpX2RldnNfcGhiX2luaXQoKTsKIH0KIAogLyoKQEAgLTI5OSw2ICsyMjAsMzQgQEAKIAkJICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBwZGV2LT5kZXZmbiwgbm9kZSk7CiAKIAkJaWYgKG5vZGUgIT0gTlVMTCkgeworCQkJc3RydWN0IHBjaV9kbiAqcGRuID0gUENJX0ROKG5vZGUpOworCQkJdTMyICphZ2VudDsKKworCQkJYWdlbnQgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5vZGUsICJsaW51eCxhZ2VudC1pZCIsCisJCQkJCU5VTEwpOworCQkJaWYgKChwZG4gIT0gTlVMTCkgJiYgKGFnZW50ICE9IE5VTEwpKSB7CisJCQkJdTggaXJxID0gaVNlcmllc19hbGxvY2F0ZV9JUlEocGRuLT5idXNubywgMCwKKwkJCQkJCXBkbi0+YnVzc3Vibm8pOworCQkJCWludCBlcnI7CisKKwkJCQllcnIgPSBIdkNhbGxYbV9jb25uZWN0QnVzVW5pdChwZG4tPmJ1c25vLCBwZG4tPmJ1c3N1Ym5vLAorCQkJCQkJKmFnZW50LCBpcnEpOworCQkJCWlmIChlcnIpCisJCQkJCXBjaV9Mb2dfRXJyb3IoIkNvbm5lY3QgQnVzIFVuaXQiLAorCQkJCQkJcGRuLT5idXNubywgcGRuLT5idXNzdWJubywgKmFnZW50LCBlcnIpOworCQkJCWVsc2UgeworCQkJCQllcnIgPSBIdkNhbGxQY2lfY29uZmlnU3RvcmU4KHBkbi0+YnVzbm8sIHBkbi0+YnVzc3Vibm8sCisJCQkJCQkJKmFnZW50LAorCQkJCQkJCVBDSV9JTlRFUlJVUFRfTElORSwKKwkJCQkJCQlpcnEpOworCQkJCQlpZiAoZXJyKQorCQkJCQkJcGNpX0xvZ19FcnJvcigiUGNpQ2ZnU3RvcmUgSXJxIEZhaWxlZCEiLAorCQkJCQkJCXBkbi0+YnVzbm8sIHBkbi0+YnVzc3Vibm8sICphZ2VudCwgZXJyKTsKKwkJCQl9CisJCQkJaWYgKCFlcnIpCisJCQkJCXBkZXYtPmlycSA9IGlycTsKKwkJCX0KKwogCQkJKytEZXZpY2VDb3VudDsKIAkJCXBkZXYtPnN5c2RhdGEgPSAodm9pZCAqKW5vZGU7CiAJCQlQQ0lfRE4obm9kZSktPnBjaWRldiA9IHBkZXY7CkBAIC0zMDgsNyArMjU3LDYgQEAKIAkJfSBlbHNlCiAJCQlwcmludGsoIlBDSTogRGV2aWNlIFRyZWUgbm90IGZvdW5kIGZvciAweCUwMTZsWFxuIiwKIAkJCQkJKHVuc2lnbmVkIGxvbmcpcGRldik7Ci0JCXBkZXYtPmlycSA9IFBDSV9ETihub2RlKS0+SXJxOwogCX0KIAlpU2VyaWVzX2FjdGl2YXRlX0lSUXMoKTsKIAltZl9kaXNwbGF5X3NyYygweEM5MDAwMjAwKTsKQEAgLTMyMywxNDggKzI3MSw2IEBACiB9CiAKIC8qCi0gKiBMb29wIHRocm91Z2ggZWFjaCBub2RlIGZ1bmN0aW9uIHRvIGZpbmQgdXNhYmxlIEVBRHMgYnJpZGdlcy4KLSAqLwotc3RhdGljIHZvaWQgc2Nhbl9QSEJfc2xvdHMoc3RydWN0IHBjaV9jb250cm9sbGVyICpQaGIpCi17Ci0Jc3RydWN0IEh2Q2FsbFBjaV9EZXZpY2VJbmZvICpEZXZJbmZvOwotCUh2QnVzTnVtYmVyIGJ1cyA9IFBoYi0+bG9jYWxfbnVtYmVyOwkvKiBTeXN0ZW0gQnVzICovCi0JY29uc3QgSHZTdWJCdXNOdW1iZXIgU3ViQnVzID0gMDsJLyogRUFEcyBpcyBhbHdheXMgMC4gKi8KLQlpbnQgSHZSYyA9IDA7Ci0JaW50IElkU2VsOwotCWNvbnN0IGludCBNYXhBZ2VudHMgPSA4OwotCi0JRGV2SW5mbyA9IChzdHJ1Y3QgSHZDYWxsUGNpX0RldmljZUluZm8qKQotCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgSHZDYWxsUGNpX0RldmljZUluZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoRGV2SW5mbyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFByb2JlIGZvciBFQURzIEJyaWRnZXMKLQkgKi8KLQlmb3IgKElkU2VsID0gMTsgSWRTZWwgPCBNYXhBZ2VudHM7ICsrSWRTZWwpIHsKLQkJSHZSYyA9IEh2Q2FsbFBjaV9nZXREZXZpY2VJbmZvKGJ1cywgU3ViQnVzLCBJZFNlbCwKLQkJCQlpc2VyaWVzX2h2X2FkZHIoRGV2SW5mbyksCi0JCQkJc2l6ZW9mKHN0cnVjdCBIdkNhbGxQY2lfRGV2aWNlSW5mbykpOwotCQlpZiAoSHZSYyA9PSAwKSB7Ci0JCQlpZiAoRGV2SW5mby0+ZGV2aWNlVHlwZSA9PSBIdkNhbGxQY2lfTm9kZURldmljZSkKLQkJCQlzY2FuX0VBRFNfYnJpZGdlKGJ1cywgU3ViQnVzLCBJZFNlbCk7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKCJQQ0k6IEludmFsaWQgU3lzdGVtIENvbmZpZ3VyYXRpb24oMHglMDJYKSIKLQkJCQkgICAgICAgIiBmb3IgYnVzIDB4JTAyeCBpZCAweCUwMnguXG4iLAotCQkJCSAgICAgICBEZXZJbmZvLT5kZXZpY2VUeXBlLCBidXMsIElkU2VsKTsKLQkJfQotCQllbHNlCi0JCQlwY2lfTG9nX0Vycm9yKCJnZXREZXZpY2VJbmZvIiwgYnVzLCBTdWJCdXMsIElkU2VsLCBIdlJjKTsKLQl9Ci0Ja2ZyZWUoRGV2SW5mbyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjYW5fRUFEU19icmlkZ2UoSHZCdXNOdW1iZXIgYnVzLCBIdlN1YkJ1c051bWJlciBTdWJCdXMsCi0JCWludCBJZFNlbCkKLXsKLQlzdHJ1Y3QgSHZDYWxsUGNpX0JyaWRnZUluZm8gKkJyaWRnZUluZm87Ci0JSHZBZ2VudElkIEFnZW50SWQ7Ci0JaW50IEZ1bmN0aW9uOwotCWludCBIdlJjOwotCi0JQnJpZGdlSW5mbyA9IChzdHJ1Y3QgSHZDYWxsUGNpX0JyaWRnZUluZm8gKikKLQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IEh2Q2FsbFBjaV9CcmlkZ2VJbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKEJyaWRnZUluZm8gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JLyogTm90ZTogaHZTdWJCdXMgYW5kIGlycSBpcyBhbHdheXMgYmUgMCBhdCB0aGlzIGxldmVsISAqLwotCWZvciAoRnVuY3Rpb24gPSAwOyBGdW5jdGlvbiA8IDg7ICsrRnVuY3Rpb24pIHsKLQkJQWdlbnRJZCA9IElTRVJJRVNfUENJX0FHRU5USUQoSWRTZWwsIEZ1bmN0aW9uKTsKLQkJSHZSYyA9IEh2Q2FsbFhtX2Nvbm5lY3RCdXNVbml0KGJ1cywgU3ViQnVzLCBBZ2VudElkLCAwKTsKLQkJaWYgKEh2UmMgPT0gMCkgewotCQkJcHJpbnRrKCJmb3VuZCBkZXZpY2UgYXQgYnVzICVkIGlkc2VsICVkIGZ1bmMgJWQgKEFnZW50SWQgJXgpXG4iLAotCQkJICAgICAgIGJ1cywgSWRTZWwsIEZ1bmN0aW9uLCBBZ2VudElkKTsKLQkJCS8qICBDb25uZWN0IEVBRHM6IDB4MTguMDAuMTIgPSAweDAwICovCi0JCQlIdlJjID0gSHZDYWxsUGNpX2dldEJ1c1VuaXRJbmZvKGJ1cywgU3ViQnVzLCBBZ2VudElkLAotCQkJCQlpc2VyaWVzX2h2X2FkZHIoQnJpZGdlSW5mbyksCi0JCQkJCXNpemVvZihzdHJ1Y3QgSHZDYWxsUGNpX0JyaWRnZUluZm8pKTsKLQkJCWlmIChIdlJjID09IDApIHsKLQkJCQlwcmludGsoImJyaWRnZSBpbmZvOiB0eXBlICV4IHN1YmJ1cyAleCBtYXhBZ2VudHMgJXggbWF4c3ViYnVzICV4IGxvZ3Nsb3QgJXhcbiIsCi0JCQkJCUJyaWRnZUluZm8tPmJ1c1VuaXRJbmZvLmRldmljZVR5cGUsCi0JCQkJCUJyaWRnZUluZm8tPnN1YkJ1c051bWJlciwKLQkJCQkJQnJpZGdlSW5mby0+bWF4QWdlbnRzLAotCQkJCQlCcmlkZ2VJbmZvLT5tYXhTdWJCdXNOdW1iZXIsCi0JCQkJCUJyaWRnZUluZm8tPmxvZ2ljYWxTbG90TnVtYmVyKTsKLQkJCQlpZiAoQnJpZGdlSW5mby0+YnVzVW5pdEluZm8uZGV2aWNlVHlwZSA9PQotCQkJCQkJSHZDYWxsUGNpX0JyaWRnZURldmljZSkgIHsKLQkJCQkJLyogU2Nhbl9CcmlkZ2VfU2xvdC4uLjogMHgxOC4wMC4xMiAqLwotCQkJCQlzY2FuX2JyaWRnZV9zbG90KGJ1cywgQnJpZGdlSW5mbyk7Ci0JCQkJfSBlbHNlCi0JCQkJCXByaW50aygiUENJOiBJbnZhbGlkIEJyaWRnZSBDb25maWd1cmF0aW9uKDB4JTAyWCkiLAotCQkJCQkJQnJpZGdlSW5mby0+YnVzVW5pdEluZm8uZGV2aWNlVHlwZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoSHZSYyAhPSAweDAwMEIpCi0JCQlwY2lfTG9nX0Vycm9yKCJFQURzIENvbm5lY3QiLAotCQkJCQlidXMsIFN1YkJ1cywgQWdlbnRJZCwgSHZSYyk7Ci0JfQotCWtmcmVlKEJyaWRnZUluZm8pOwotfQotCi0vKgotICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIG5vZGUgc2xvdCBpcyBhbHdheXMgb24gdGhlIHByaW1hcnkgYnVzIQotICovCi1zdGF0aWMgaW50IHNjYW5fYnJpZGdlX3Nsb3QoSHZCdXNOdW1iZXIgQnVzLAotCQlzdHJ1Y3QgSHZDYWxsUGNpX0JyaWRnZUluZm8gKkJyaWRnZUluZm8pCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpub2RlOwotCUh2U3ViQnVzTnVtYmVyIFN1YkJ1cyA9IEJyaWRnZUluZm8tPnN1YkJ1c051bWJlcjsKLQl1MTYgVmVuZG9ySWQgPSAwOwotCWludCBIdlJjID0gMDsKLQl1OCBJcnEgPSAwOwotCWludCBJZFNlbCA9IElTRVJJRVNfR0VUX0RFVklDRV9GUk9NX1NVQkJVUyhTdWJCdXMpOwotCWludCBGdW5jdGlvbiA9IElTRVJJRVNfR0VUX0ZVTkNUSU9OX0ZST01fU1VCQlVTKFN1YkJ1cyk7Ci0JSHZBZ2VudElkIEVBRHNJZFNlbCA9IElTRVJJRVNfUENJX0FHRU5USUQoSWRTZWwsIEZ1bmN0aW9uKTsKLQotCS8qIGlTZXJpZXNfYWxsb2NhdGVfSVJRLjogMHgxOC4wMC4xMigweEEzKSAqLwotCUlycSA9IGlTZXJpZXNfYWxsb2NhdGVfSVJRKEJ1cywgMCwgRUFEc0lkU2VsKTsKLQotCS8qCi0JICogQ29ubmVjdCBhbGwgZnVuY3Rpb25zIG9mIGFueSBkZXZpY2UgZm91bmQuCi0JICovCi0JZm9yIChJZFNlbCA9IDE7IElkU2VsIDw9IEJyaWRnZUluZm8tPm1heEFnZW50czsgKytJZFNlbCkgewotCQlmb3IgKEZ1bmN0aW9uID0gMDsgRnVuY3Rpb24gPCA4OyArK0Z1bmN0aW9uKSB7Ci0JCQlIdkFnZW50SWQgQWdlbnRJZCA9IElTRVJJRVNfUENJX0FHRU5USUQoSWRTZWwsIEZ1bmN0aW9uKTsKLQkJCUh2UmMgPSBIdkNhbGxYbV9jb25uZWN0QnVzVW5pdChCdXMsIFN1YkJ1cywKLQkJCQkJQWdlbnRJZCwgSXJxKTsKLQkJCWlmIChIdlJjICE9IDApIHsKLQkJCQlwY2lfTG9nX0Vycm9yKCJDb25uZWN0IEJ1cyBVbml0IiwKLQkJCQkJICAgICAgQnVzLCBTdWJCdXMsIEFnZW50SWQsIEh2UmMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlIdlJjID0gSHZDYWxsUGNpX2NvbmZpZ0xvYWQxNihCdXMsIFN1YkJ1cywgQWdlbnRJZCwKLQkJCQkJCSAgICAgIFBDSV9WRU5ET1JfSUQsICZWZW5kb3JJZCk7Ci0JCQlpZiAoSHZSYyAhPSAwKSB7Ci0JCQkJcGNpX0xvZ19FcnJvcigiUmVhZCBWZW5kb3IiLAotCQkJCQkgICAgICBCdXMsIFN1YkJ1cywgQWdlbnRJZCwgSHZSYyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlwcmludGsoInJlYWQgdmVuZG9yIElEOiAleFxuIiwgVmVuZG9ySWQpOwotCi0JCQkvKiBGb3VuZERldmljZTogMHgxOC4yOC4xMCA9IDB4MTJBRSAqLwotCQkJSHZSYyA9IEh2Q2FsbFBjaV9jb25maWdTdG9yZTgoQnVzLCBTdWJCdXMsIEFnZW50SWQsCi0JCQkJCQkgICAgICBQQ0lfSU5URVJSVVBUX0xJTkUsIElycSk7Ci0JCQlpZiAoSHZSYyAhPSAwKQotCQkJCXBjaV9Mb2dfRXJyb3IoIlBjaUNmZ1N0b3JlIElycSBGYWlsZWQhIiwKLQkJCQkJICAgICAgQnVzLCBTdWJCdXMsIEFnZW50SWQsIEh2UmMpOwotCi0JCQkrK0RldmljZUNvdW50OwotCQkJbm9kZSA9IGJ1aWxkX2RldmljZV9ub2RlKEJ1cywgU3ViQnVzLCBFQURzSWRTZWwsIEZ1bmN0aW9uKTsKLQkJCVBDSV9ETihub2RlKS0+SXJxID0gSXJxOwotCQkJUENJX0ROKG5vZGUpLT5Mb2dpY2FsU2xvdCA9IEJyaWRnZUluZm8tPmxvZ2ljYWxTbG90TnVtYmVyOwotCi0JCX0gLyogZm9yIChGdW5jdGlvbiA9IDA7IEZ1bmN0aW9uIDwgODsgKytGdW5jdGlvbikgKi8KLQl9IC8qIGZvciAoSWRTZWwgPSAxOyBJZFNlbCA8PSBNYXhBZ2VudHM7ICsrSWRTZWwpICovCi0JcmV0dXJuIEh2UmM7Ci19Ci0KLS8qCiAgKiBJLzAgTWVtb3J5IGNvcHkgTVVTVCB1c2UgbW1pbyBjb21tYW5kcyBvbiBpU2VyaWVzCiAgKiBUbyBkbzsgRm9yIHBlcmZvcm1hbmNlLCBpbmNsdWRlIHRoZSBodiBjYWxsIGRpcmVjdGx5CiAgKi8KQEAgLTUwOSwxMSArMzE1LDEzIEBACiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZpbmRfRGV2aWNlX05vZGUoaW50IGJ1cywgaW50IGRldmZuKQogewotCXN0cnVjdCBwY2lfZG4gKnBkbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBkbiwgJmlTZXJpZXNfR2xvYmFsX0RldmljZV9MaXN0LCBEZXZpY2VfTGlzdCkgewotCQlpZiAoKGJ1cyA9PSBwZG4tPmJ1c25vKSAmJiAoZGV2Zm4gPT0gcGRuLT5kZXZmbikpCi0JCQlyZXR1cm4gcGRuLT5ub2RlOworCWZvciAobm9kZSA9IE5VTEw7IChub2RlID0gb2ZfZmluZF9hbGxfbm9kZXMobm9kZSkpOyApIHsKKwkJc3RydWN0IHBjaV9kbiAqcGRuID0gUENJX0ROKG5vZGUpOworCisJCWlmIChwZG4gJiYgKGJ1cyA9PSBwZG4tPmJ1c25vKSAmJiAoZGV2Zm4gPT0gcGRuLT5kZXZmbikpCisJCQlyZXR1cm4gbm9kZTsKIAl9CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC02MjUsNyArNDMzLDYgQEAKIAlpZiAocmV0ICE9IDApICB7CiAJCXN0cnVjdCBwY2lfZG4gKnBkbiA9IFBDSV9ETihEZXZOb2RlKTsKIAotCQkrK1BjaV9FcnJvcl9Db3VudDsKIAkJKCpyZXRyeSkrKzsKIAkJcHJpbnRrKCJQQ0k6ICVzOiBEZXZpY2UgMHglMDRYOiUwMlggIEkvTyBFcnJvciglMmQpOiAweCUwNFhcbiIsCiAJCQkJVGV4dEhkciwgcGRuLT5idXNubywgcGRuLT5kZXZmbiwKQEAgLTcwNyw3ICs1MTQsNiBAQAogCQlyZXR1cm4gMHhmZjsKIAl9CiAJZG8gewotCQkrK1BjaV9Jb19SZWFkX0NvdW50OwogCQlIdkNhbGwzUmV0MTYoSHZDYWxsUGNpQmFyTG9hZDgsICZyZXQsIGRzYSwgQmFyT2Zmc2V0LCAwKTsKIAl9IHdoaWxlIChDaGVja1JldHVybkNvZGUoIlJEQiIsIERldk5vZGUsICZyZXRyeSwgcmV0LnJjKSAhPSAwKTsKIApAQCAtNzM3LDcgKzU0Myw2IEBACiAJCXJldHVybiAweGZmZmY7CiAJfQogCWRvIHsKLQkJKytQY2lfSW9fUmVhZF9Db3VudDsKIAkJSHZDYWxsM1JldDE2KEh2Q2FsbFBjaUJhckxvYWQxNiwgJnJldCwgZHNhLAogCQkJCUJhck9mZnNldCwgMCk7CiAJfSB3aGlsZSAoQ2hlY2tSZXR1cm5Db2RlKCJSRFciLCBEZXZOb2RlLCAmcmV0cnksIHJldC5yYykgIT0gMCk7CkBAIC03NjgsNyArNTczLDYgQEAKIAkJcmV0dXJuIDB4ZmZmZmZmZmY7CiAJfQogCWRvIHsKLQkJKytQY2lfSW9fUmVhZF9Db3VudDsKIAkJSHZDYWxsM1JldDE2KEh2Q2FsbFBjaUJhckxvYWQzMiwgJnJldCwgZHNhLAogCQkJCUJhck9mZnNldCwgMCk7CiAJfSB3aGlsZSAoQ2hlY2tSZXR1cm5Db2RlKCJSREwiLCBEZXZOb2RlLCAmcmV0cnksIHJldC5yYykgIT0gMCk7CkBAIC04MDYsNyArNjEwLDYgQEAKIAkJcmV0dXJuOwogCX0KIAlkbyB7Ci0JCSsrUGNpX0lvX1dyaXRlX0NvdW50OwogCQlyYyA9IEh2Q2FsbDQoSHZDYWxsUGNpQmFyU3RvcmU4LCBkc2EsIEJhck9mZnNldCwgZGF0YSwgMCk7CiAJfSB3aGlsZSAoQ2hlY2tSZXR1cm5Db2RlKCJXV0IiLCBEZXZOb2RlLCAmcmV0cnksIHJjKSAhPSAwKTsKIH0KQEAgLTgzNCw3ICs2MzcsNiBAQAogCQlyZXR1cm47CiAJfQogCWRvIHsKLQkJKytQY2lfSW9fV3JpdGVfQ291bnQ7CiAJCXJjID0gSHZDYWxsNChIdkNhbGxQY2lCYXJTdG9yZTE2LCBkc2EsIEJhck9mZnNldCwgc3dhYjE2KGRhdGEpLCAwKTsKIAl9IHdoaWxlIChDaGVja1JldHVybkNvZGUoIldXVyIsIERldk5vZGUsICZyZXRyeSwgcmMpICE9IDApOwogfQpAQCAtODYyLDcgKzY2NCw2IEBACiAJCXJldHVybjsKIAl9CiAJZG8gewotCQkrK1BjaV9Jb19Xcml0ZV9Db3VudDsKIAkJcmMgPSBIdkNhbGw0KEh2Q2FsbFBjaUJhclN0b3JlMzIsIGRzYSwgQmFyT2Zmc2V0LCBzd2FiMzIoZGF0YSksIDApOwogCX0gd2hpbGUgKENoZWNrUmV0dXJuQ29kZSgiV1dMIiwgRGV2Tm9kZSwgJnJldHJ5LCByYykgIT0gMCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCmluZGV4IGE2ZmQ5YmUuLjYxN2M3MjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jCkBAIC01MCw3ICs1MCw2IEBACiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfY2FsbF94bS5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2l0X2xwX3F1ZXVlLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvbWYuaD4KLSNpbmNsdWRlIDxhc20vaXNlcmllcy9pdF9leHBfdnBkX3BhbmVsLmg+CiAjaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfbHBfZXZlbnQuaD4KICNpbmNsdWRlIDxhc20vaXNlcmllcy9scGFyX21hcC5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CkBAIC04MSw5ICs4MCw2IEBACiBzdGF0aWMgdm9pZCBpU2VyaWVzX3BjaV9maW5hbF9maXh1cCh2b2lkKSB7IH0KICNlbmRpZgogCi0vKiBHbG9iYWwgVmFyaWFibGVzICovCi1pbnQgcGlyYW5oYV9zaW11bGF0b3I7Ci0KIGV4dGVybiBpbnQgcmRfc2l6ZTsJCS8qIERlZmluZWQgaW4gZHJpdmVycy9ibG9jay9yZC5jICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBlbWJlZGRlZF9zeXNtYXBfc3RhcnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBlbWJlZGRlZF9zeXNtYXBfZW5kOwpAQCAtOTEsOCArODcsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaVNlcmllc19yZWNhbF90YjsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGlTZXJpZXNfcmVjYWxfdGl0YW47CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNtZF9tZW1fbGltaXQ7Ci0KIHN0cnVjdCBNZW1vcnlCbG9jayB7CiAJdW5zaWduZWQgbG9uZyBhYnNTdGFydDsKIAl1bnNpZ25lZCBsb25nIGFic0VuZDsKQEAgLTM0MCw4ICszMzQsNiBAQAogI2lmZGVmIENPTkZJR19TTVAKIAlzbXBfaW5pdF9pU2VyaWVzKCk7CiAjZW5kaWYKLQlpZiAoaXRMcE5hY2EueFBpckVudmlyb25Nb2RlID09IDApCi0JCXBpcmFuaGFfc2ltdWxhdG9yID0gMTsKIAogCS8qIEFzc29jaWF0ZSBMcCBFdmVudCBRdWV1ZSAwIHdpdGggcHJvY2Vzc29yIDAgKi8KIAlIdkNhbGxFdmVudF9zZXRMcEV2ZW50UXVldWVJbnRlcnJ1cHRQcm9jKDAsIDApOwpAQCAtNTM2LDEwICs1MjgsMTAgQEAKIHsKIAlpZiAoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYykgewogCQlwcGNfbWQuaWRsZV9sb29wID0gaXNlcmllc19zaGFyZWRfaWRsZTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOwogCX0gZWxzZSB7CiAJCXBwY19tZC5pZGxlX2xvb3AgPSBpc2VyaWVzX2RlZGljYXRlZF9pZGxlOwotCQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBkZWRpY2F0ZWQgaWRsZSBsb29wXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOwogCX0KIAogCS8qIFNldHVwIHRoZSBMcCBFdmVudCBRdWV1ZSAqLwpAQCAtNzE0LDI0MyArNzA2LDYgQEAKIAkvKiBYWFggSW1wbGVtZW50IGVuYWJsZV9wbWNzIGZvciBpU2VyaWVzICovCiB9OwogCi1zdHJ1Y3QgYmxvYiB7Ci0JdW5zaWduZWQgY2hhciBkYXRhW1BBR0VfU0laRV07Ci0JdW5zaWduZWQgbG9uZyBuZXh0OwotfTsKLQotc3RydWN0IGlzZXJpZXNfZmxhdF9kdCB7Ci0Jc3RydWN0IGJvb3RfcGFyYW1faGVhZGVyIGhlYWRlcjsKLQl1NjQgcmVzZXJ2ZV9tYXBbMl07Ci0Jc3RydWN0IGJsb2IgZHQ7Ci0Jc3RydWN0IGJsb2Igc3RyaW5nczsKLX07Ci0KLXN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgaXNlcmllc19kdDsKLQotdm9pZCBkdF9pbml0KHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0KQotewotCWR0LT5oZWFkZXIub2ZmX21lbV9yc3ZtYXAgPQotCQlvZmZzZXRvZihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0LCByZXNlcnZlX21hcCk7Ci0JZHQtPmhlYWRlci5vZmZfZHRfc3RydWN0ID0gb2Zmc2V0b2Yoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCwgZHQpOwotCWR0LT5oZWFkZXIub2ZmX2R0X3N0cmluZ3MgPSBvZmZzZXRvZihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0LCBzdHJpbmdzKTsKLQlkdC0+aGVhZGVyLnRvdGFsc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0KTsKLQlkdC0+aGVhZGVyLmR0X3N0cmluZ3Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmxvYik7Ci0KLQkvKiBUaGVyZSBpcyBubyBub3Rpb24gb2YgaGFyZHdhcmUgY3B1IGlkIG9uIGlTZXJpZXMgKi8KLQlkdC0+aGVhZGVyLmJvb3RfY3B1aWRfcGh5cyA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWR0LT5kdC5uZXh0ID0gKHVuc2lnbmVkIGxvbmcpJmR0LT5kdC5kYXRhOwotCWR0LT5zdHJpbmdzLm5leHQgPSAodW5zaWduZWQgbG9uZykmZHQtPnN0cmluZ3MuZGF0YTsKLQotCWR0LT5oZWFkZXIubWFnaWMgPSBPRl9EVF9IRUFERVI7Ci0JZHQtPmhlYWRlci52ZXJzaW9uID0gMHgxMDsKLQlkdC0+aGVhZGVyLmxhc3RfY29tcF92ZXJzaW9uID0gMHgxMDsKLQotCWR0LT5yZXNlcnZlX21hcFswXSA9IDA7Ci0JZHQtPnJlc2VydmVfbWFwWzFdID0gMDsKLX0KLQotdm9pZCBkdF9jaGVja19ibG9iKHN0cnVjdCBibG9iICpiKQotewotCWlmIChiLT5uZXh0ID49ICh1bnNpZ25lZCBsb25nKSZiLT5uZXh0KSB7Ci0JCURCRygiUmFuIG91dCBvZiBzcGFjZSBpbiBmbGF0IGRldmljZSB0cmVlIGJsb2IhXG4iKTsKLQkJQlVHKCk7Ci0JfQotfQotCi12b2lkIGR0X3B1c2hfdTMyKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0LCB1MzIgdmFsdWUpCi17Ci0JKigodTMyKilkdC0+ZHQubmV4dCkgPSB2YWx1ZTsKLQlkdC0+ZHQubmV4dCArPSBzaXplb2YodTMyKTsKLQotCWR0X2NoZWNrX2Jsb2IoJmR0LT5kdCk7Ci19Ci0KLXZvaWQgZHRfcHVzaF91NjQoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIHU2NCB2YWx1ZSkKLXsKLQkqKCh1NjQqKWR0LT5kdC5uZXh0KSA9IHZhbHVlOwotCWR0LT5kdC5uZXh0ICs9IHNpemVvZih1NjQpOwotCi0JZHRfY2hlY2tfYmxvYigmZHQtPmR0KTsKLX0KLQotdW5zaWduZWQgbG9uZyBkdF9wdXNoX2J5dGVzKHN0cnVjdCBibG9iICpibG9iLCBjaGFyICpkYXRhLCBpbnQgbGVuKQotewotCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBibG9iLT5uZXh0IC0gKHVuc2lnbmVkIGxvbmcpYmxvYi0+ZGF0YTsKLQotCW1lbWNweSgoY2hhciAqKWJsb2ItPm5leHQsIGRhdGEsIGxlbik7Ci0JYmxvYi0+bmV4dCA9IF9BTElHTihibG9iLT5uZXh0ICsgbGVuLCA0KTsKLQotCWR0X2NoZWNrX2Jsb2IoYmxvYik7Ci0KLQlyZXR1cm4gc3RhcnQ7Ci19Ci0KLXZvaWQgZHRfc3RhcnRfbm9kZShzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY2hhciAqbmFtZSkKLXsKLQlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfQkVHSU5fTk9ERSk7Ci0JZHRfcHVzaF9ieXRlcygmZHQtPmR0LCBuYW1lLCBzdHJsZW4obmFtZSkgKyAxKTsKLX0KLQotI2RlZmluZSBkdF9lbmRfbm9kZShkdCkgZHRfcHVzaF91MzIoZHQsIE9GX0RUX0VORF9OT0RFKQotCi12b2lkIGR0X3Byb3Aoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNoYXIgKm5hbWUsIGNoYXIgKmRhdGEsIGludCBsZW4pCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0KLQlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfUFJPUCk7Ci0KLQkvKiBMZW5ndGggb2YgdGhlIGRhdGEgKi8KLQlkdF9wdXNoX3UzMihkdCwgbGVuKTsKLQotCS8qIFB1dCB0aGUgcHJvcGVydHkgbmFtZSBpbiB0aGUgc3RyaW5nIGJsb2IuICovCi0Jb2Zmc2V0ID0gZHRfcHVzaF9ieXRlcygmZHQtPnN0cmluZ3MsIG5hbWUsIHN0cmxlbihuYW1lKSArIDEpOwotCi0JLyogVGhlIG9mZnNldCBvZiB0aGUgcHJvcGVydGllcyBuYW1lIGluIHRoZSBzdHJpbmcgYmxvYi4gKi8KLQlkdF9wdXNoX3UzMihkdCwgKHUzMilvZmZzZXQpOwotCi0JLyogVGhlIGFjdHVhbCBkYXRhLiAqLwotCWR0X3B1c2hfYnl0ZXMoJmR0LT5kdCwgZGF0YSwgbGVuKTsKLX0KLQotdm9pZCBkdF9wcm9wX3N0cihzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY2hhciAqbmFtZSwgY2hhciAqZGF0YSkKLXsKLQlkdF9wcm9wKGR0LCBuYW1lLCBkYXRhLCBzdHJsZW4oZGF0YSkgKyAxKTsgLyogKyAxIGZvciBOVUxMICovCi19Ci0KLXZvaWQgZHRfcHJvcF91MzIoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNoYXIgKm5hbWUsIHUzMiBkYXRhKQotewotCWR0X3Byb3AoZHQsIG5hbWUsIChjaGFyICopJmRhdGEsIHNpemVvZih1MzIpKTsKLX0KLQotdm9pZCBkdF9wcm9wX3U2NChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgY2hhciAqbmFtZSwgdTY0IGRhdGEpCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgKGNoYXIgKikmZGF0YSwgc2l6ZW9mKHU2NCkpOwotfQotCi12b2lkIGR0X3Byb3BfdTY0X2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNoYXIgKm5hbWUsIHU2NCAqZGF0YSwgaW50IG4pCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgKGNoYXIgKilkYXRhLCBzaXplb2YodTY0KSAqIG4pOwotfQotCi12b2lkIGR0X3Byb3BfdTMyX2xpc3Qoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNoYXIgKm5hbWUsIHUzMiAqZGF0YSwgaW50IG4pCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgKGNoYXIgKilkYXRhLCBzaXplb2YodTMyKSAqIG4pOwotfQotCi12b2lkIGR0X3Byb3BfZW1wdHkoc3RydWN0IGlzZXJpZXNfZmxhdF9kdCAqZHQsIGNoYXIgKm5hbWUpCi17Ci0JZHRfcHJvcChkdCwgbmFtZSwgTlVMTCwgMCk7Ci19Ci0KLXZvaWQgZHRfY3B1cyhzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZlszMl07Ci0JdW5zaWduZWQgY2hhciAqcDsKLQl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7Ci0Jc3RydWN0IElvSHJpUHJvY2Vzc29yVnBkICpkOwotCXUzMiBwZnRfc2l6ZVsyXTsKLQotCS8qIHl1Y2sgKi8KLQlzbnByaW50ZihidWYsIDMyLCAiUG93ZXJQQywlcyIsIGN1cl9jcHVfc3BlYy0+Y3B1X25hbWUpOwotCXAgPSBzdHJjaHIoYnVmLCAnICcpOwotCWlmICghcCkgcCA9IGJ1ZiArIHN0cmxlbihidWYpOwotCi0JZHRfc3RhcnRfbm9kZShkdCwgImNwdXMiKTsKLQlkdF9wcm9wX3UzMihkdCwgIiNhZGRyZXNzLWNlbGxzIiwgMSk7Ci0JZHRfcHJvcF91MzIoZHQsICIjc2l6ZS1jZWxscyIsIDApOwotCi0JcGZ0X3NpemVbMF0gPSAwOyAvKiBOVU1BIENFQyBjb29raWUsIDAgZm9yIG5vbiBOVU1BICAqLwotCXBmdF9zaXplWzFdID0gX19pbG9nMihIdkNhbGxIcHRfZ2V0SHB0UGFnZXMoKSAqIEhXX1BBR0VfU0laRSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfQ1BVUzsgaSsrKSB7Ci0JCWlmIChscHBhY2FbaV0uZHluX3Byb2Nfc3RhdHVzID49IDIpCi0JCQljb250aW51ZTsKLQotCQlzbnByaW50ZihwLCAzMiAtIChwIC0gYnVmKSwgIkAlZCIsIGkpOwotCQlkdF9zdGFydF9ub2RlKGR0LCBidWYpOwotCi0JCWR0X3Byb3Bfc3RyKGR0LCAiZGV2aWNlX3R5cGUiLCAiY3B1Iik7Ci0KLQkJaW5kZXggPSBscHBhY2FbaV0uZHluX2h2X3BoeXNfcHJvY19pbmRleDsKLQkJZCA9ICZ4SW9IcmlQcm9jZXNzb3JWcGRbaW5kZXhdOwotCi0JCWR0X3Byb3BfdTMyKGR0LCAiaS1jYWNoZS1zaXplIiwgZC0+eEluc3RDYWNoZVNpemUgKiAxMDI0KTsKLQkJZHRfcHJvcF91MzIoZHQsICJpLWNhY2hlLWxpbmUtc2l6ZSIsIGQtPnhJbnN0Q2FjaGVPcGVyYW5kU2l6ZSk7Ci0KLQkJZHRfcHJvcF91MzIoZHQsICJkLWNhY2hlLXNpemUiLCBkLT54RGF0YUwxQ2FjaGVTaXplS0IgKiAxMDI0KTsKLQkJZHRfcHJvcF91MzIoZHQsICJkLWNhY2hlLWxpbmUtc2l6ZSIsIGQtPnhEYXRhQ2FjaGVPcGVyYW5kU2l6ZSk7Ci0KLQkJLyogbWFnaWMgY29udmVyc2lvbnMgdG8gSHogY29waWVkIGZyb20gb2xkIGNvZGUgKi8KLQkJZHRfcHJvcF91MzIoZHQsICJjbG9jay1mcmVxdWVuY3kiLAotCQkJKCgxVUwgPDwgMzQpICogMTAwMDAwMCkgLyBkLT54UHJvY0ZyZXEpOwotCQlkdF9wcm9wX3UzMihkdCwgInRpbWViYXNlLWZyZXF1ZW5jeSIsCi0JCQkoKDFVTCA8PCAzMikgKiAxMDAwMDAwKSAvIGQtPnhUaW1lQmFzZUZyZXEpOwotCi0JCWR0X3Byb3BfdTMyKGR0LCAicmVnIiwgaSk7Ci0KLQkJZHRfcHJvcF91MzJfbGlzdChkdCwgImlibSxwZnQtc2l6ZSIsIHBmdF9zaXplLCAyKTsKLQotCQlkdF9lbmRfbm9kZShkdCk7Ci0JfQotCi0JZHRfZW5kX25vZGUoZHQpOwotfQotCi12b2lkIGR0X21vZGVsKHN0cnVjdCBpc2VyaWVzX2ZsYXRfZHQgKmR0KQotewotCWNoYXIgYnVmWzE2XSA9ICJJQk0sIjsKLQotCS8qICJJQk0sIiArIG1mZ0lkWzI6M10gKyBzeXN0ZW1TZXJpYWxbMTo1XSAqLwotCXN0cm5lMmEoYnVmICsgNCwgeEl0RXh0VnBkUGFuZWwubWZnSUQgKyAyLCAyKTsKLQlzdHJuZTJhKGJ1ZiArIDYsIHhJdEV4dFZwZFBhbmVsLnN5c3RlbVNlcmlhbCArIDEsIDUpOwotCWJ1ZlsxMV0gPSAnXDAnOwotCWR0X3Byb3Bfc3RyKGR0LCAic3lzdGVtLWlkIiwgYnVmKTsKLQotCS8qICJJQk0sIiArIG1hY2hpbmVUeXBlWzA6NF0gKi8KLQlzdHJuZTJhKGJ1ZiArIDQsIHhJdEV4dFZwZFBhbmVsLm1hY2hpbmVUeXBlLCA0KTsKLQlidWZbOF0gPSAnXDAnOwotCWR0X3Byb3Bfc3RyKGR0LCAibW9kZWwiLCBidWYpOwotCi0JZHRfcHJvcF9zdHIoZHQsICJjb21wYXRpYmxlIiwgIklCTSxpU2VyaWVzIik7Ci19Ci0KLXZvaWQgYnVpbGRfZmxhdF9kdChzdHJ1Y3QgaXNlcmllc19mbGF0X2R0ICpkdCwgdW5zaWduZWQgbG9uZyBwaHlzX21lbV9zaXplKQotewotCXU2NCB0bXBbMl07Ci0KLQlkdF9pbml0KGR0KTsKLQotCWR0X3N0YXJ0X25vZGUoZHQsICIiKTsKLQotCWR0X3Byb3BfdTMyKGR0LCAiI2FkZHJlc3MtY2VsbHMiLCAyKTsKLQlkdF9wcm9wX3UzMihkdCwgIiNzaXplLWNlbGxzIiwgMik7Ci0JZHRfbW9kZWwoZHQpOwotCi0JLyogL21lbW9yeSAqLwotCWR0X3N0YXJ0X25vZGUoZHQsICJtZW1vcnlAMCIpOwotCWR0X3Byb3Bfc3RyKGR0LCAibmFtZSIsICJtZW1vcnkiKTsKLQlkdF9wcm9wX3N0cihkdCwgImRldmljZV90eXBlIiwgIm1lbW9yeSIpOwotCXRtcFswXSA9IDA7Ci0JdG1wWzFdID0gcGh5c19tZW1fc2l6ZTsKLQlkdF9wcm9wX3U2NF9saXN0KGR0LCAicmVnIiwgdG1wLCAyKTsKLQlkdF9lbmRfbm9kZShkdCk7Ci0KLQkvKiAvY2hvc2VuICovCi0JZHRfc3RhcnRfbm9kZShkdCwgImNob3NlbiIpOwotCWR0X3Byb3Bfc3RyKGR0LCAiYm9vdGFyZ3MiLCBjbWRfbGluZSk7Ci0JaWYgKGNtZF9tZW1fbGltaXQpCi0JCWR0X3Byb3BfdTY0KGR0LCAibGludXgsbWVtb3J5LWxpbWl0IiwgY21kX21lbV9saW1pdCk7Ci0JZHRfZW5kX25vZGUoZHQpOwotCi0JZHRfY3B1cyhkdCk7Ci0KLQlkdF9lbmRfbm9kZShkdCk7Ci0KLQlkdF9wdXNoX3UzMihkdCwgT0ZfRFRfRU5EKTsKLX0KLQogdm9pZCAqIF9faW5pdCBpU2VyaWVzX2Vhcmx5X3NldHVwKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBwaHlzX21lbV9zaXplOwpAQCAtOTY1LDI5ICs3MjAsOSBAQAogCiAJaVNlcmllc19nZXRfY21kbGluZSgpOwogCi0JLyogU2F2ZSB1bnBhcnNlZCBjb21tYW5kIGxpbmUgY29weSBmb3IgL3Byb2MvY21kbGluZSAqLwotCXN0cmxjcHkoc2F2ZWRfY29tbWFuZF9saW5lLCBjbWRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwotCi0JLyogUGFyc2UgZWFybHkgcGFyYW1ldGVycywgaW4gcGFydGljdWxhciBtZW09eCAqLwotCXBhcnNlX2Vhcmx5X3BhcmFtKCk7Ci0KLQlidWlsZF9mbGF0X2R0KCZpc2VyaWVzX2R0LCBwaHlzX21lbV9zaXplKTsKLQotCXJldHVybiAodm9pZCAqKSBfX3BhKCZpc2VyaWVzX2R0KTsKKwlyZXR1cm4gKHZvaWQgKikgX19wYShidWlsZF9mbGF0X2R0KHBoeXNfbWVtX3NpemUpKTsKIH0KIAotLyoKLSAqIE9uIGlTZXJpZXMgd2UganVzdCBwYXJzZSB0aGUgbWVtPVggb3B0aW9uIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAqIE9uIHBTZXJpZXMgaXQncyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkLCBzZWUgcHJvbV9pbml0X21lbSgpCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGVhcmx5X3BhcnNlbWVtKGNoYXIgKnApCi17Ci0JaWYgKHApCi0JCWNtZF9tZW1fbGltaXQgPSBBTElHTihtZW1wYXJzZShwLCAmcCksIFBBR0VfU0laRSk7Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibWVtIiwgZWFybHlfcGFyc2VtZW0pOwotCiBzdGF0aWMgdm9pZCBodnB1dGMoY2hhciBjKQogewogCWlmIChjID09ICdcbicpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvc2V0dXAuaCBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5oCmluZGV4IDUyMTMwNDQuLjBhNDdhYzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5oCkBAIC0yMSw0ICsyMSw2IEBACiBleHRlcm4gaW50IGlTZXJpZXNfc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdG0pOwogZXh0ZXJuIHZvaWQgaVNlcmllc19nZXRfcnRjX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSk7CiAKK2V4dGVybiB2b2lkICpidWlsZF9mbGF0X2R0KHVuc2lnbmVkIGxvbmcgcGh5c19tZW1fc2l6ZSk7CisKICNlbmRpZiAvKiBfX0lTRVJJRVNfU0VUVVBfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2lzZXJpZXMvdmlvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzZhYjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3Zpby5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBJQk0gUG93ZXJQQyBpU2VyaWVzIFZpcnR1YWwgSS9PIEluZnJhc3RydWN0dXJlIFN1cHBvcnQuCi0gKgotICogICAgQ29weXJpZ2h0IChjKSAyMDA1IFN0ZXBoZW4gUm90aHdlbGwsIElCTSBDb3JwLgotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotCi0jaW5jbHVkZSA8YXNtL3Zpby5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS90Y2UuaD4KLSNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9pc2VyaWVzL3Zpby5oPgotI2luY2x1ZGUgPGFzbS9pc2VyaWVzL2h2X3R5cGVzLmg+Ci0jaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfbHBfY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL2lzZXJpZXMvaHZfY2FsbF94bS5oPgotCi0jaW5jbHVkZSAiaW9tbXUuaCIKLQotc3RydWN0IGRldmljZSAqaVNlcmllc192aW9fZGV2ID0gJnZpb19idXNfZGV2aWNlLmRldjsKLUVYUE9SVF9TWU1CT0woaVNlcmllc192aW9fZGV2KTsKLQotc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSB2ZXRoX2lvbW11X3RhYmxlOwotc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSB2aW9faW9tbXVfdGFibGU7Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV92aW9faW5pdCh2b2lkKQotewotCWlvbW11X3RhYmxlX2dldHBhcm1zX2lTZXJpZXMoMjU1LCAwLCAweGZmLCAmdmV0aF9pb21tdV90YWJsZSk7Ci0JdmV0aF9pb21tdV90YWJsZS5pdF9zaXplIC89IDI7Ci0JdmlvX2lvbW11X3RhYmxlID0gdmV0aF9pb21tdV90YWJsZTsKLQl2aW9faW9tbXVfdGFibGUuaXRfb2Zmc2V0ICs9IHZldGhfaW9tbXVfdGFibGUuaXRfc2l6ZTsKLQotCWlmICghaW9tbXVfaW5pdF90YWJsZSgmdmV0aF9pb21tdV90YWJsZSkpCi0JCXByaW50aygiVmlydHVhbCBCdXMgVkVUSCBUQ0UgdGFibGUgZmFpbGVkLlxuIik7Ci0JaWYgKCFpb21tdV9pbml0X3RhYmxlKCZ2aW9faW9tbXVfdGFibGUpKQotCQlwcmludGsoIlZpcnR1YWwgQnVzIFZJTyBUQ0UgdGFibGUgZmFpbGVkLlxuIik7Ci19Ci0KLS8qKgotICogdmlvX3JlZ2lzdGVyX2RldmljZV9pc2VyaWVzOiAtIFJlZ2lzdGVyIGEgbmV3IGlTZXJpZXMgdmlvIGRldmljZS4KLSAqIEB2b2lkZXY6CVRoZSBkZXZpY2UgdG8gcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgdmlvX2RldiAqX19pbml0IHZpb19yZWdpc3Rlcl9kZXZpY2VfaXNlcmllcyhjaGFyICp0eXBlLAotCQl1aW50MzJfdCB1bml0X251bSkKLXsKLQlzdHJ1Y3QgdmlvX2RldiAqdmlvZGV2OwotCi0JLyogYWxsb2NhdGUgYSB2aW9fZGV2IGZvciB0aGlzIGRldmljZSAqLwotCXZpb2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2aW9fZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2aW9kZXYpCi0JCXJldHVybiBOVUxMOwotCW1lbXNldCh2aW9kZXYsIDAsIHNpemVvZihzdHJ1Y3QgdmlvX2RldikpOwotCi0Jc25wcmludGYodmlvZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzJWQiLCB0eXBlLCB1bml0X251bSk7Ci0KLQl2aW9kZXYtPm5hbWUgPSB2aW9kZXYtPmRldi5idXNfaWQ7Ci0JdmlvZGV2LT50eXBlID0gdHlwZTsKLQl2aW9kZXYtPnVuaXRfYWRkcmVzcyA9IHVuaXRfbnVtOwotCXZpb2Rldi0+aW9tbXVfdGFibGUgPSAmdmlvX2lvbW11X3RhYmxlOwotCWlmICh2aW9fcmVnaXN0ZXJfZGV2aWNlKHZpb2RldikgPT0gTlVMTCkgewotCQlrZnJlZSh2aW9kZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIHZpb2RldjsKLX0KLQotdm9pZCBfX2luaXQgcHJvYmVfYnVzX2lzZXJpZXModm9pZCkKLXsKLQlIdkxwSW5kZXhNYXAgdmxhbl9tYXA7Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2RldjsKLQlpbnQgaTsKLQotCS8qIHRoZXJlIGlzIG9ubHkgb25lIG9mIGVhY2ggb2YgdGhlc2UgKi8KLQl2aW9fcmVnaXN0ZXJfZGV2aWNlX2lzZXJpZXMoInZpb2NvbnMiLCAwKTsKLQl2aW9fcmVnaXN0ZXJfZGV2aWNlX2lzZXJpZXMoInZzY3NpIiwgMCk7Ci0KLQl2bGFuX21hcCA9IEh2THBDb25maWdfZ2V0VmlydHVhbExhbkluZGV4TWFwKCk7Ci0JZm9yIChpID0gMDsgaSA8IEhWTUFYQVJDSElURUNURURWSVJUVUFMTEFOUzsgaSsrKSB7Ci0JCWlmICgodmxhbl9tYXAgJiAoMHg4MDAwID4+IGkpKSA9PSAwKQotCQkJY29udGludWU7Ci0JCXZpb2RldiA9IHZpb19yZWdpc3Rlcl9kZXZpY2VfaXNlcmllcygidmxhbiIsIGkpOwotCQkvKiB2ZXRoIGlzIHNwZWNpYWwgYW5kIGhhcyBpdCBvd24gaW9tbXVfdGFibGUgKi8KLQkJdmlvZGV2LT5pb21tdV90YWJsZSA9ICZ2ZXRoX2lvbW11X3RhYmxlOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxESVNLUzsgaSsrKQotCQl2aW9fcmVnaXN0ZXJfZGV2aWNlX2lzZXJpZXMoInZpb2Rhc2QiLCBpKTsKLQlmb3IgKGkgPSAwOyBpIDwgSFZNQVhBUkNISVRFQ1RFRFZJUlRVQUxDRFJPTVM7IGkrKykKLQkJdmlvX3JlZ2lzdGVyX2RldmljZV9pc2VyaWVzKCJ2aW9jZCIsIGkpOwotCWZvciAoaSA9IDA7IGkgPCBIVk1BWEFSQ0hJVEVDVEVEVklSVFVBTFRBUEVTOyBpKyspCi0JCXZpb19yZWdpc3Rlcl9kZXZpY2VfaXNlcmllcygidmlvdGFwZSIsIGkpOwotfQotCi0vKioKLSAqIHZpb19tYXRjaF9kZXZpY2VfaXNlcmllczogLSBUZWxsIGlmIGEgaVNlcmllcyBWSU8gZGV2aWNlIG1hdGNoZXMgYQotICoJdmlvX2RldmljZV9pZAotICovCi1zdGF0aWMgaW50IHZpb19tYXRjaF9kZXZpY2VfaXNlcmllcyhjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQsCi0JCWNvbnN0IHN0cnVjdCB2aW9fZGV2ICpkZXYpCi17Ci0JcmV0dXJuIHN0cm5jbXAoZGV2LT50eXBlLCBpZC0+dHlwZSwgc3RybGVuKGlkLT50eXBlKSkgPT0gMDsKLX0KLQotc3RhdGljIHN0cnVjdCB2aW9fYnVzX29wcyB2aW9fYnVzX29wc19pc2VyaWVzID0gewotCS5tYXRjaCA9IHZpb19tYXRjaF9kZXZpY2VfaXNlcmllcywKLX07Ci0KLS8qKgotICogdmlvX2J1c19pbml0X2lzZXJpZXM6IC0gSW5pdGlhbGl6ZSB0aGUgaVNlcmllcyB2aXJ0dWFsIElPIGJ1cwotICovCi1zdGF0aWMgaW50IF9faW5pdCB2aW9fYnVzX2luaXRfaXNlcmllcyh2b2lkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSB2aW9fYnVzX2luaXQoJnZpb19idXNfb3BzX2lzZXJpZXMpOwotCWlmIChlcnIgPT0gMCkgewotCQlpb21tdV92aW9faW5pdCgpOwotCQl2aW9fYnVzX2RldmljZS5pb21tdV90YWJsZSA9ICZ2aW9faW9tbXVfdGFibGU7Ci0JCWlTZXJpZXNfdmlvX2RldiA9ICZ2aW9fYnVzX2RldmljZS5kZXY7Ci0JCXByb2JlX2J1c19pc2VyaWVzKCk7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLV9faW5pdGNhbGwodmlvX2J1c19pbml0X2lzZXJpZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggODVkNmM5My4uOWE0ZWZjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC00MzcsOSArNDM3LDYgQEAKIAogCS8qIFRlbGwgcGNpLmMgdG8gbm90IGNoYW5nZSBhbnkgcmVzb3VyY2UgYWxsb2NhdGlvbnMuICAqLwogCXBjaV9wcm9iZV9vbmx5ID0gMTsKLQkKLQkvKiBBbGxvdyBhbGwgSU8gKi8KLQlpb19wYWdlX21hc2sgPSAtMTsKIH0KIAogaW50IG1hcGxlX3BjaV9nZXRfbGVnYWN5X2lkZV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBjaGFubmVsKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCmluZGV4IDI0YzBhZWYuLmEwNTA1ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKQEAgLTE4OSw3ICsxODksNyBAQAogCWNvbnN3aXRjaHAgPSAmZHVtbXlfY29uOwogI2VuZGlmCiAKLQlwcmludGsoS0VSTl9JTkZPICJVc2luZyBuYXRpdmUvTkFQIGlkbGUgbG9vcFxuIik7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIG5hdGl2ZS9OQVAgaWRsZSBsb29wXG4iKTsKIH0KIAogLyogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9iYWNrbGlnaHQuYwppbmRleCA4YmUyZjdkLi40OThiMDQyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2JhY2tsaWdodC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKQEAgLTMsMjAwICszLDE0OCBAQAogICogQ29udGFpbnMgc3VwcG9ydCBmb3IgdGhlIGJhY2tsaWdodC4KICAqCiAgKiAgIENvcHlyaWdodCAoQykgMjAwMCBCZW5qYW1pbiBIZXJyZW5zY2htaWR0CisgKiAgIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEhhbnNlbG1hbm4gPGxpbnV4LWtlcm5lbEBoYW5zbWkuY2g+CiAgKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KLSNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9udnJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL252cmFtLmg+CiAjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgogCi0jaW5jbHVkZSA8bGludXgvYWRiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG11Lmg+CisjZGVmaW5lIE9MRF9CQUNLTElHSFRfTUFYIDE1CiAKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgKmJhY2tsaWdodGVyOwotc3RhdGljIHZvaWQqIGJhY2tsaWdodGVyX2RhdGE7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9hdXRvc2F2ZTsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2xldmVsID0gQkFDS0xJR0hUX01BWDsKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2VuYWJsZWQgPSAxOwotc3RhdGljIGludCBiYWNrbGlnaHRfcmVxX2xldmVsID0gLTE7Ci1zdGF0aWMgaW50IGJhY2tsaWdodF9yZXFfZW5hYmxlID0gLTE7CisvKiBQcm90ZWN0IHRoZSBwbWFjX2JhY2tsaWdodCB2YXJpYWJsZSAqLworREVGSU5FX01VVEVYKHBtYWNfYmFja2xpZ2h0X211dGV4KTsKIAotc3RhdGljIHZvaWQgYmFja2xpZ2h0X2NhbGxiYWNrKHZvaWQgKik7Ci1zdGF0aWMgREVDTEFSRV9XT1JLKGJhY2tsaWdodF93b3JrLCBiYWNrbGlnaHRfY2FsbGJhY2ssIE5VTEwpOworLyogTWFpbiBiYWNrbGlnaHQgc3RvcmFnZQorICoKKyAqIEJhY2tsaWdodCBkcml2ZXJzIGluIHRoaXMgdmFyaWFibGUgYXJlIHJlcXVpcmVkIHRvIGhhdmUgdGhlICJwcm9wcyIKKyAqIGF0dHJpYnV0ZSBzZXQgYW5kIHRvIGhhdmUgYW4gdXBkYXRlX3N0YXR1cyBmdW5jdGlvbi4KKyAqCisgKiBXZSBjYW4gb25seSBzdG9yZSBvbmUgYmFja2xpZ2h0IGhlcmUsIGJ1dCBzaW5jZSBBcHBsZSBsYXB0b3BzIGhhdmUgb25seSBvbmUKKyAqIGludGVybmFsIGRpc3BsYXksIGl0IGRvZXNuJ3QgbWF0dGVyLiBPdGhlciBiYWNrbGlnaHQgZHJpdmVycyBjYW4gYmUgdXNlZAorICogaW5kZXBlbmRlbnRseS4KKyAqCisgKiBMb2NrIG9yZGVyaW5nOgorICogcG1hY19iYWNrbGlnaHRfbXV0ZXggKGdsb2JhbCwgbWFpbiBiYWNrbGlnaHQpCisgKiAgIHBtYWNfYmFja2xpZ2h0LT5zZW0gKGJhY2tsaWdodCBjbGFzcykKKyAqLworc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnBtYWNfYmFja2xpZ2h0OwogCi12b2lkIHJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciAqY3RybGVyLAotCQkJCQkgIHZvaWQgKmRhdGEsIGNoYXIgKnR5cGUpCitpbnQgcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoY29uc3QgY2hhciAqdHlwZSkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUqIGJrX25vZGU7Ci0JY2hhciAqcHJvcDsKLQlpbnQgdmFsaWQgPSAwOworCXN0cnVjdCBkZXZpY2Vfbm9kZSogYmtfbm9kZSA9IGZpbmRfZGV2aWNlcygiYmFja2xpZ2h0Iik7CiAKLQkvKiBUaGVyZSdzIGFscmVhZHkgYSBtYXRjaGluZyBjb250cm9sbGVyLCBiYWlsIG91dCAqLwotCWlmIChiYWNrbGlnaHRlciAhPSBOVUxMKQotCQlyZXR1cm47Ci0KLQlia19ub2RlID0gZmluZF9kZXZpY2VzKCJiYWNrbGlnaHQiKTsKLQotI2lmZGVmIENPTkZJR19BREJfUE1VCi0JLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgb2xkIFBvd2VyQm9vayBzaW5jZSBJIGNhbid0IHRlc3Qgb24gaXQgKi8KLQliYWNrbGlnaHRfYXV0b3NhdmUgPSBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzQwMC8yNDAwIikKLQkJfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM1MDAiKTsKLQlpZiAoKGJhY2tsaWdodF9hdXRvc2F2ZQotCSAgICAgfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLFBvd2VyQm9vazE5OTgiKQotCSAgICAgfHwgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2sxLDEiKSkKLQkgICAgJiYgIXN0cmNtcCh0eXBlLCAicG11IikpCi0JCXZhbGlkID0gMTsKLSNlbmRpZgogCWlmIChia19ub2RlKSB7Ci0JCXByb3AgPSBnZXRfcHJvcGVydHkoYmtfbm9kZSwgImJhY2tsaWdodC1jb250cm9sIiwgTlVMTCk7Ci0JCWlmIChwcm9wICYmICFzdHJuY21wKHByb3AsIHR5cGUsIHN0cmxlbih0eXBlKSkpCi0JCQl2YWxpZCA9IDE7Ci0JfQotCWlmICghdmFsaWQpCi0JCXJldHVybjsKLQliYWNrbGlnaHRlciA9IGN0cmxlcjsKLQliYWNrbGlnaHRlcl9kYXRhID0gZGF0YTsKLQotCWlmIChia19ub2RlICYmICFiYWNrbGlnaHRfYXV0b3NhdmUpCi0JCXByb3AgPSBnZXRfcHJvcGVydHkoYmtfbm9kZSwgImJrbHQiLCBOVUxMKTsKLQllbHNlCi0JCXByb3AgPSBOVUxMOwotCWlmIChwcm9wKSB7Ci0JCWJhY2tsaWdodF9sZXZlbCA9ICgoKnByb3ApKzEpID4+IDE7Ci0JCWlmIChiYWNrbGlnaHRfbGV2ZWwgPiBCQUNLTElHSFRfTUFYKQotCQkJYmFja2xpZ2h0X2xldmVsID0gQkFDS0xJR0hUX01BWDsKKwkJY2hhciAqcHJvcCA9IGdldF9wcm9wZXJ0eShia19ub2RlLCAiYmFja2xpZ2h0LWNvbnRyb2wiLCBOVUxMKTsKKwkJaWYgKHByb3AgJiYgc3RybmNtcChwcm9wLCB0eXBlLCBzdHJsZW4odHlwZSkpID09IDApCisJCQlyZXR1cm4gMTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfQURCX1BNVQotCWlmIChiYWNrbGlnaHRfYXV0b3NhdmUpIHsKLQkJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKLQkJcG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgMHhkOSwgMCk7Ci0JCXdoaWxlICghcmVxLmNvbXBsZXRlKQotCQkJcG11X3BvbGwoKTsKLQkJYmFja2xpZ2h0X2xldmVsID0gcmVxLnJlcGx5WzBdID4+IDQ7Ci0JfQotI2VuZGlmCi0JYWNxdWlyZV9jb25zb2xlX3NlbSgpOwotCWlmICghYmFja2xpZ2h0ZXItPnNldF9lbmFibGUoMSwgYmFja2xpZ2h0X2xldmVsLCBkYXRhKSkKLQkJYmFja2xpZ2h0X2VuYWJsZWQgPSAxOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQotCXByaW50ayhLRVJOX0lORk8gIlJlZ2lzdGVyZWQgXCIlc1wiIGJhY2tsaWdodCBjb250cm9sbGVyLCIKLQkgICAgICAgImxldmVsOiAlZC8xNVxuIiwgdHlwZSwgYmFja2xpZ2h0X2xldmVsKTsKLX0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIpOwotCi12b2lkIHVucmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyCi0JCQkJCSAgICAqY3RybGVyLCB2b2lkICpkYXRhKQotewotCS8qIFdlIGtlZXAgdGhlIGN1cnJlbnQgYmFja2xpZ2h0IGxldmVsIChmb3Igbm93KSAqLwotCWlmIChjdHJsZXIgPT0gYmFja2xpZ2h0ZXIgJiYgZGF0YSA9PSBiYWNrbGlnaHRlcl9kYXRhKQotCQliYWNrbGlnaHRlciA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIpOwotCi1zdGF0aWMgaW50IF9fc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IGVuYWJsZSkKLXsKLQlpbnQgcmM7Ci0KLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlhY3F1aXJlX2NvbnNvbGVfc2VtKCk7Ci0JcmMgPSBiYWNrbGlnaHRlci0+c2V0X2VuYWJsZShlbmFibGUsIGJhY2tsaWdodF9sZXZlbCwKLQkJCQkgICAgIGJhY2tsaWdodGVyX2RhdGEpOwotCWlmICghcmMpCi0JCWJhY2tsaWdodF9lbmFibGVkID0gZW5hYmxlOwotCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKLQlyZXR1cm4gcmM7Ci19Ci1pbnQgc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IGVuYWJsZSkKLXsKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQliYWNrbGlnaHRfcmVxX2VuYWJsZSA9IGVuYWJsZTsKLQlzY2hlZHVsZV93b3JrKCZiYWNrbGlnaHRfd29yayk7CiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woc2V0X2JhY2tsaWdodF9lbmFibGUpOwotCi1pbnQgZ2V0X2JhY2tsaWdodF9lbmFibGUodm9pZCkKK2ludCBwbWFjX2JhY2tsaWdodF9jdXJ2ZV9sb29rdXAoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB2YWx1ZSkKIHsKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlyZXR1cm4gYmFja2xpZ2h0X2VuYWJsZWQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGdldF9iYWNrbGlnaHRfZW5hYmxlKTsKKwlpbnQgbGV2ZWwgPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpOwogCi1zdGF0aWMgaW50IF9fc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwpCi17Ci0JaW50IHJjID0gMDsKKwlpZiAoaW5mbyAmJiBpbmZvLT5ibF9kZXYpIHsKKwkJaW50IGksIG1heCA9IDA7CiAKLQlpZiAoIWJhY2tsaWdodGVyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlpZiAobGV2ZWwgPCBCQUNLTElHSFRfTUlOKQotCQlsZXZlbCA9IEJBQ0tMSUdIVF9PRkY7Ci0JaWYgKGxldmVsID4gQkFDS0xJR0hUX01BWCkKLQkJbGV2ZWwgPSBCQUNLTElHSFRfTUFYOwotCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKLQlpZiAoYmFja2xpZ2h0X2VuYWJsZWQpCi0JCXJjID0gYmFja2xpZ2h0ZXItPnNldF9sZXZlbChsZXZlbCwgYmFja2xpZ2h0ZXJfZGF0YSk7Ci0JaWYgKCFyYykKLQkJYmFja2xpZ2h0X2xldmVsID0gbGV2ZWw7Ci0JcmVsZWFzZV9jb25zb2xlX3NlbSgpOwotCWlmICghcmMgJiYgIWJhY2tsaWdodF9hdXRvc2F2ZSkgewotCQlsZXZlbCA8PD0xOwotCQlpZiAobGV2ZWwgJiAweDEwKQotCQkJbGV2ZWwgfD0gMHgwMTsKLQkJLy8gLS0gdG9kbzogc2F2ZSB0byBwcm9wZXJ0eSAiYmtsdCIKKwkJLyogTG9vayBmb3IgYmlnZ2VzdCB2YWx1ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgRkJfQkFDS0xJR0hUX0xFVkVMUzsgaSsrKQorCQkJbWF4ID0gbWF4KChpbnQpaW5mby0+YmxfY3VydmVbaV0sIG1heCk7CisKKwkJLyogTG9vayBmb3IgbmVhcmVzdCB2YWx1ZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgRkJfQkFDS0xJR0hUX0xFVkVMUzsgaSsrKSB7CisJCQlpbnQgZGlmZiA9IGFicyhpbmZvLT5ibF9jdXJ2ZVtpXSAtIHZhbHVlKTsKKwkJCWlmIChkaWZmIDwgbWF4KSB7CisJCQkJbWF4ID0gZGlmZjsKKwkJCQlsZXZlbCA9IGk7CisJCQl9CisJCX0KKwogCX0KLQlyZXR1cm4gcmM7Ci19Ci1pbnQgc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwpCi17Ci0JaWYgKCFiYWNrbGlnaHRlcikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JYmFja2xpZ2h0X3JlcV9sZXZlbCA9IGxldmVsOwotCXNjaGVkdWxlX3dvcmsoJmJhY2tsaWdodF93b3JrKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiBsZXZlbDsKIH0KIAotRVhQT1JUX1NZTUJPTChzZXRfYmFja2xpZ2h0X2xldmVsKTsKLQotaW50IGdldF9iYWNrbGlnaHRfbGV2ZWwodm9pZCkKK3N0YXRpYyB2b2lkIHBtYWNfYmFja2xpZ2h0X2tleShpbnQgZGlyZWN0aW9uKQogewotCWlmICghYmFja2xpZ2h0ZXIpCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiBiYWNrbGlnaHRfbGV2ZWw7CisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmIChwbWFjX2JhY2tsaWdodCkgeworCQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgKnByb3BzOworCQlpbnQgYnJpZ2h0bmVzczsKKworCQlkb3duKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwkJcHJvcHMgPSBwbWFjX2JhY2tsaWdodC0+cHJvcHM7CisKKwkJYnJpZ2h0bmVzcyA9IHByb3BzLT5icmlnaHRuZXNzICsKKwkJCSgoZGlyZWN0aW9uPy0xOjEpICogKHByb3BzLT5tYXhfYnJpZ2h0bmVzcyAvIDE1KSk7CisKKwkJaWYgKGJyaWdodG5lc3MgPCAwKQorCQkJYnJpZ2h0bmVzcyA9IDA7CisJCWVsc2UgaWYgKGJyaWdodG5lc3MgPiBwcm9wcy0+bWF4X2JyaWdodG5lc3MpCisJCQlicmlnaHRuZXNzID0gcHJvcHMtPm1heF9icmlnaHRuZXNzOworCisJCXByb3BzLT5icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKwkJcHJvcHMtPnVwZGF0ZV9zdGF0dXMocG1hY19iYWNrbGlnaHQpOworCisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CiB9Ci1FWFBPUlRfU1lNQk9MKGdldF9iYWNrbGlnaHRfbGV2ZWwpOwogCi1zdGF0aWMgdm9pZCBiYWNrbGlnaHRfY2FsbGJhY2sodm9pZCAqZHVtbXkpCit2b2lkIHBtYWNfYmFja2xpZ2h0X2tleV91cCgpCiB7Ci0JaW50IGxldmVsLCBlbmFibGU7CisJcG1hY19iYWNrbGlnaHRfa2V5KDApOworfQogCi0JZG8gewotCQlsZXZlbCA9IGJhY2tsaWdodF9yZXFfbGV2ZWw7Ci0JCWVuYWJsZSA9IGJhY2tsaWdodF9yZXFfZW5hYmxlOwotCQltYigpOwordm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfZG93bigpCit7CisJcG1hY19iYWNrbGlnaHRfa2V5KDEpOworfQogCi0JCWlmIChsZXZlbCA+PSAwKQotCQkJX19zZXRfYmFja2xpZ2h0X2xldmVsKGxldmVsKTsKLQkJaWYgKGVuYWJsZSA+PSAwKQotCQkJX19zZXRfYmFja2xpZ2h0X2VuYWJsZShlbmFibGUpOwotCX0gd2hpbGUoY21weGNoZygmYmFja2xpZ2h0X3JlcV9sZXZlbCwgbGV2ZWwsIC0xKSAhPSBsZXZlbCB8fAotCQljbXB4Y2hnKCZiYWNrbGlnaHRfcmVxX2VuYWJsZSwgZW5hYmxlLCAtMSkgIT0gZW5hYmxlKTsKK2ludCBwbWFjX2JhY2tsaWdodF9zZXRfbGVnYWN5X2JyaWdodG5lc3MoaW50IGJyaWdodG5lc3MpCit7CisJaW50IGVycm9yID0gLUVOWElPOworCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmIChwbWFjX2JhY2tsaWdodCkgeworCQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgKnByb3BzOworCisJCWRvd24oJnBtYWNfYmFja2xpZ2h0LT5zZW0pOworCQlwcm9wcyA9IHBtYWNfYmFja2xpZ2h0LT5wcm9wczsKKwkJcHJvcHMtPmJyaWdodG5lc3MgPSBicmlnaHRuZXNzICoKKwkJCXByb3BzLT5tYXhfYnJpZ2h0bmVzcyAvIE9MRF9CQUNLTElHSFRfTUFYOworCQlwcm9wcy0+dXBkYXRlX3N0YXR1cyhwbWFjX2JhY2tsaWdodCk7CisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKworCQllcnJvciA9IDA7CisJfQorCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCisJcmV0dXJuIGVycm9yOworfQorCitpbnQgcG1hY19iYWNrbGlnaHRfZ2V0X2xlZ2FjeV9icmlnaHRuZXNzKCkKK3sKKwlpbnQgcmVzdWx0ID0gLUVOWElPOworCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmIChwbWFjX2JhY2tsaWdodCkgeworCQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgKnByb3BzOworCisJCWRvd24oJnBtYWNfYmFja2xpZ2h0LT5zZW0pOworCQlwcm9wcyA9IHBtYWNfYmFja2xpZ2h0LT5wcm9wczsKKwkJcmVzdWx0ID0gcHJvcHMtPmJyaWdodG5lc3MgKgorCQkJT0xEX0JBQ0tMSUdIVF9NQVggLyBwcm9wcy0+bWF4X2JyaWdodG5lc3M7CisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisKKwlyZXR1cm4gcmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9jcHVmcmVxXzMyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2NwdWZyZXFfMzIuYwppbmRleCBjZmQ2NTI3Li5hZjJhOGY5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2NwdWZyZXFfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL2NwdWZyZXFfMzIuYwpAQCAtMzE0LDcgKzMxNCw3IEBACiAgCQlfc2V0X0wzQ1Ioc2F2ZV9sM2NyKTsKIAogCS8qIFJlc3RvcmUgdXNlcmxhbmQgTU1VIGNvbnRleHQgKi8KLQlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKKwlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKIAogI2lmZGVmIERFQlVHX0ZSRVEKIAlwcmludGsoS0VSTl9ERUJVRyAiSElEMSwgYWZ0ZXI6ICV4XG4iLCBtZnNwcihTUFJOX0hJRDEpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvZmVhdHVyZS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKaW5kZXggYTUwNjNjZC4uODVlMDBjYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9mZWF0dXJlLmMKQEAgLTI1MTAsNyArMjUxMCw3IEBACiAJCWlmIChnZXRfcHJvcGVydHkobnAsICJmbHVzaC1vbi1sb2NrIiwgTlVMTCkpCiAJCQlicmVhazsKIAkJcG93ZXJzYXZlX25hcCA9IDE7Ci0JCXByaW50ayhLRVJOX0lORk8gIlByb2Nlc3NvciBOQVAgbW9kZSBvbiBpZGxlIGVuYWJsZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIlByb2Nlc3NvciBOQVAgbW9kZSBvbiBpZGxlIGVuYWJsZWQuXG4iKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wY2kuYwppbmRleCBlYTE3OWFmLi44MDAzNTg1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGNpLmMKQEAgLTEwNjgsOSArMTA2OCw2IEBACiAJLyogVGVsbCBwY2kuYyB0byBub3QgdXNlIHRoZSBjb21tb24gcmVzb3VyY2UgYWxsb2NhdGlvbiBtZWNoYW5pc20gKi8KIAlwY2lfcHJvYmVfb25seSA9IDE7CiAKLQkvKiBBbGxvdyBhbGwgSU8gKi8KLQlpb19wYWdlX21hc2sgPSAtMTsKLQogI2Vsc2UgLyogQ09ORklHX1BQQzY0ICovCiAJaW5pdF9wMnBicmlkZ2UoKTsKIAlmaXh1cF9uZWNfdXNiMigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9wZnVuY19jb3JlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwppbmRleCBmMDgxNzNiLi4wNDdmOTU0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BmdW5jX2NvcmUuYwpAQCAtODcxLDEwICs4NzEsMTcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWZfbG9jaywgZmxhZ3MpOwogCWlmIChmdW5jID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOworCisJLyogZ3VhcmQgYWdhaW5zdCBtYW5pcHVsYXRpb25zIG9mIGxpc3QgKi8KIAltdXRleF9sb2NrKCZwbWZfaXJxX211dGV4KTsKIAlpZiAobGlzdF9lbXB0eSgmZnVuYy0+aXJxX2NsaWVudHMpKQogCQlmdW5jLT5kZXYtPmhhbmRsZXJzLT5pcnFfZW5hYmxlKGZ1bmMpOworCisJLyogZ3VhcmQgYWdhaW5zdCBwbWZfZG9faXJxIHdoaWxlIGNoYW5naW5nIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG1mX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZCgmY2xpZW50LT5saW5rLCAmZnVuYy0+aXJxX2NsaWVudHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZl9sb2NrLCBmbGFncyk7CisKIAljbGllbnQtPmZ1bmMgPSBmdW5jOwogCW11dGV4X3VubG9jaygmcG1mX2lycV9tdXRleCk7CiAKQEAgLTg4NSwxMiArODkyLDE5IEBACiB2b2lkIHBtZl91bnJlZ2lzdGVyX2lycV9jbGllbnQoc3RydWN0IHBtZl9pcnFfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHBtZl9mdW5jdGlvbiAqZnVuYyA9IGNsaWVudC0+ZnVuYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQlVHX09OKGZ1bmMgPT0gTlVMTCk7CiAKKwkvKiBndWFyZCBhZ2FpbnN0IG1hbmlwdWxhdGlvbnMgb2YgbGlzdCAqLwogCW11dGV4X2xvY2soJnBtZl9pcnFfbXV0ZXgpOwogCWNsaWVudC0+ZnVuYyA9IE5VTEw7CisKKwkvKiBndWFyZCBhZ2FpbnN0IHBtZl9kb19pcnEgd2hpbGUgY2hhbmdpbmcgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwbWZfbG9jaywgZmxhZ3MpOwogCWxpc3RfZGVsKCZjbGllbnQtPmxpbmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBtZl9sb2NrLCBmbGFncyk7CisKIAlpZiAobGlzdF9lbXB0eSgmZnVuYy0+aXJxX2NsaWVudHMpKQogCQlmdW5jLT5kZXYtPmhhbmRsZXJzLT5pcnFfZGlzYWJsZShmdW5jKTsKIAltdXRleF91bmxvY2soJnBtZl9pcnFfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCmluZGV4IGI5MjAwZmIuLjljYzdkYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKQEAgLTQ1OCw3ICs0NTgsNyBAQAogCXByaW50ayhLRVJOX0RFQlVHICIlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgc3RhdGUpOwogCiAJLyogUmVzdG9yZSB1c2VybGFuZCBNTVUgY29udGV4dCAqLwotCXNldF9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dCwgY3VycmVudC0+YWN0aXZlX21tLT5wZ2QpOworCXNldF9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5pZCwgY3VycmVudC0+YWN0aXZlX21tLT5wZ2QpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKaW5kZXggOTMwODk4Ni4uZTVlMGZmNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQpAQCAtMSw4ICsxLDExIEBACitpZmVxICgkKENPTkZJR19QUEM2NCkseSkKK0VYVFJBX0NGTEFHUwkJKz0gLW1uby1taW5pbWFsLXRvYworZW5kaWYKKwogb2JqLXkJCQk6PSBwY2kubyBscGFyLm8gaHZDYWxsLm8gbnZyYW0ubyByZWNvbmZpZy5vIFwKIAkJCSAgIHNldHVwLm8gaW9tbXUubyByYXMubyBydGFzZC5vIHBjaV9kbHBhci5vIFwKIAkJCSAgIGZpcm13YXJlLm8KIG9iai0kKENPTkZJR19TTVApCSs9IHNtcC5vCi1vYmotJChDT05GSUdfSUJNVklPKQkrPSB2aW8ubwogb2JqLSQoQ09ORklHX1hJQ1MpCSs9IHhpY3Mubwogb2JqLSQoQ09ORklHX1NDQU5MT0cpCSs9IHNjYW5sb2cubwogb2JqLSQoQ09ORklHX0VFSCkJKz0gZWVoLm8gZWVoX2NhY2hlLm8gZWVoX2RyaXZlci5vIGVlaF9ldmVudC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2NhY2hlLmMKaW5kZXggZDRhNDAyYy4uOThjMjNhZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9jYWNoZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfY2FjaGUuYwpAQCAtMzA0LDYgKzMwNCw4IEBACiAJCXBjaV9hZGRyX2NhY2hlX2luc2VydF9kZXZpY2UoZGV2KTsKIAogCQlkbiA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCQlpZiAoIWRuKQorCQkJY29udGludWU7CiAJCXBjaV9kZXZfZ2V0IChkZXYpOyAgLyogbWF0Y2hpbmcgcHV0IGlzIGluIGVlaF9yZW1vdmVfZGV2aWNlKCkgKi8KIAkJUENJX0ROKGRuKS0+cGNpZGV2ID0gZGV2OwogCX0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2RyaXZlci5jCmluZGV4IDFmYmE2OTUuLjBlYzlhNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZHJpdmVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9kcml2ZXIuYwpAQCAtMjMsOSArMjMsOCBAQAogICoKICAqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxhc20vZWVoLmg+CiAjaW5jbHVkZSA8YXNtL2VlaF9ldmVudC5oPgpAQCAtMjAyLDcgKzIwMSwxMSBAQAogCiBzdGF0aWMgaW50IGVlaF9yZXNldF9kZXZpY2UgKHN0cnVjdCBwY2lfZG4gKnBlX2RuLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewotCWludCByYzsKKwlpbnQgY250LCByYzsKKworCS8qIHBjaWJpb3Mgd2lsbCBjbGVhciB0aGUgY291bnRlcjsgc2F2ZSB0aGUgdmFsdWUgKi8KKwljbnQgPSBwZV9kbi0+ZWVoX2ZyZWV6ZV9jb3VudDsKKwogCWlmIChidXMpCiAJCXBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKGJ1cyk7CiAKQEAgLTI0MSw2ICsyNDQsNyBAQAogCQlzc2xlZXAgKDUpOwogCQlwY2liaW9zX2FkZF9wY2lfZGV2aWNlcyhidXMpOwogCX0KKwlwZV9kbi0+ZWVoX2ZyZWV6ZV9jb3VudCA9IGNudDsKIAogCXJldHVybiAwOwogfQpAQCAtMjUwLDIzICsyNTQsMjkgQEAKICAqLwogI2RlZmluZSBNQVhfV0FJVF9GT1JfUkVDT1ZFUlkgMTUKIAotdm9pZCBoYW5kbGVfZWVoX2V2ZW50cyAoc3RydWN0IGVlaF9ldmVudCAqZXZlbnQpCitzdHJ1Y3QgcGNpX2RuICogaGFuZGxlX2VlaF9ldmVudHMgKHN0cnVjdCBlZWhfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvemVuX2RuOwogCXN0cnVjdCBwY2lfZG4gKmZyb3plbl9wZG47CiAJc3RydWN0IHBjaV9idXMgKmZyb3plbl9idXM7CiAJaW50IHJjID0gMDsKIAllbnVtIHBjaV9lcnNfcmVzdWx0IHJlc3VsdCA9IFBDSV9FUlNfUkVTVUxUX05PTkU7Ci0JY29uc3QgY2hhciAqcGNpX3N0ciwgKmRydl9zdHI7CisJY29uc3QgY2hhciAqbG9jYXRpb24sICpwY2lfc3RyLCAqZHJ2X3N0cjsKIAogCWZyb3plbl9kbiA9IGZpbmRfZGV2aWNlX3BlKGV2ZW50LT5kbik7CiAJZnJvemVuX2J1cyA9IHBjaWJpb3NfZmluZF9wY2lfYnVzKGZyb3plbl9kbik7CiAKIAlpZiAoIWZyb3plbl9kbikgewotCQlwcmludGsoS0VSTl9FUlIgIkVFSDogRXJyb3I6IENhbm5vdCBmaW5kIHBhcnRpdGlvbiBlbmRwb2ludCBmb3IgJXNcbiIsCi0JCSAgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldikpOwotCQlyZXR1cm47CisKKwkJbG9jYXRpb24gPSAoY2hhciAqKSBnZXRfcHJvcGVydHkoZXZlbnQtPmRuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CisJCWxvY2F0aW9uID0gbG9jYXRpb24gPyBsb2NhdGlvbiA6ICJ1bmtub3duIjsKKwkJcHJpbnRrKEtFUk5fRVJSICJFRUg6IEVycm9yOiBDYW5ub3QgZmluZCBwYXJ0aXRpb24gZW5kcG9pbnQgIgorCQkgICAgICAgICAgICAgICAgImZvciBsb2NhdGlvbj0lcyBwY2kgYWRkcj0lc1xuIiwKKwkJICAgICAgICBsb2NhdGlvbiwgcGNpX25hbWUoZXZlbnQtPmRldikpOworCQlyZXR1cm4gTlVMTDsKIAl9CisJbG9jYXRpb24gPSAoY2hhciAqKSBnZXRfcHJvcGVydHkoZnJvemVuX2RuLCAiaWJtLGxvYy1jb2RlIiwgTlVMTCk7CisJbG9jYXRpb24gPSBsb2NhdGlvbiA/IGxvY2F0aW9uIDogInVua25vd24iOwogCiAJLyogVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgc3R5bGVzIGZvciBjb21pbmcgdXAgd2l0aCB0aGUgUEUuCiAJICogSW4gdGhlIG9sZCBzdHlsZSwgaXQgd2FzIHRoZSBoaWdoZXN0IEVFSC1jYXBhYmxlIGRldmljZQpAQCAtMjc4LDkgKzI4OCwxMCBAQAogCQlmcm96ZW5fYnVzID0gcGNpYmlvc19maW5kX3BjaV9idXMgKGZyb3plbl9kbi0+cGFyZW50KTsKIAogCWlmICghZnJvemVuX2J1cykgewotCQlwcmludGsoS0VSTl9FUlIgIkVFSDogQ2Fubm90IGZpbmQgUENJIGJ1cyBmb3IgJXNcbiIsCi0JCSAgICAgICAgZnJvemVuX2RuLT5mdWxsX25hbWUpOwotCQlyZXR1cm47CisJCXByaW50ayhLRVJOX0VSUiAiRUVIOiBDYW5ub3QgZmluZCBQQ0kgYnVzICIKKwkJICAgICAgICAiZm9yIGxvY2F0aW9uPSVzIGRuPSVzXG4iLAorCQkgICAgICAgIGxvY2F0aW9uLCBmcm96ZW5fZG4tPmZ1bGxfbmFtZSk7CisJCXJldHVybiBOVUxMOwogCX0KIAogI2lmIDAKQEAgLTMxNCw4ICszMjUsOSBAQAogCiAJZWVoX3Nsb3RfZXJyb3JfZGV0YWlsKGZyb3plbl9wZG4sIDEgLyogVGVtcG9yYXJ5IEVycm9yICovKTsKIAlwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgIkVFSDogVGhpcyBQQ0kgZGV2aWNlIGhhcyBmYWlsZWQgJWQgdGltZXMgc2luY2UgbGFzdCByZWJvb3Q6ICVzIC0gJXNcbiIsCi0JCWZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQsIGRydl9zdHIsIHBjaV9zdHIpOworCSAgICJFRUg6IFRoaXMgUENJIGRldmljZSBoYXMgZmFpbGVkICVkIHRpbWVzIHNpbmNlIGxhc3QgcmVib290OiAiCisJCSJsb2NhdGlvbj0lcyBkcml2ZXI9JXMgcGNpIGFkZHI9JXNcbiIsCisJCWZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQsIGxvY2F0aW9uLCBkcnZfc3RyLCBwY2lfc3RyKTsKIAogCS8qIFdhbGsgdGhlIHZhcmlvdXMgZGV2aWNlIGRyaXZlcnMgYXR0YWNoZWQgdG8gdGhpcyBzbG90IHRocm91Z2gKIAkgKiBhIHJlc2V0IHNlcXVlbmNlLCBnaXZpbmcgZWFjaCBhbiBvcHBvcnR1bml0eSB0byBkbyB3aGF0IGl0IG5lZWRzCkBAIC0zNTUsNyArMzY3LDcgQEAKIAkvKiBUZWxsIGFsbCBkZXZpY2UgZHJpdmVycyB0aGF0IHRoZXkgY2FuIHJlc3VtZSBvcGVyYXRpb25zICovCiAJcGNpX3dhbGtfYnVzKGZyb3plbl9idXMsIGVlaF9yZXBvcnRfcmVzdW1lLCBOVUxMKTsKIAotCXJldHVybjsKKwlyZXR1cm4gZnJvemVuX3BkbjsKIAkKIGV4Y2Vzc19mYWlsdXJlczoKIAkvKgpAQCAtMzY0LDE3ICszNzYsMTggQEAKIAkgKiBkdWUgdG8gYWN0dWFsLCBmYWlsZWQgY2FyZHMuCiAJICovCiAJcHJpbnRrKEtFUk5fRVJSCi0JICAgIkVFSDogUENJIGRldmljZSAlcyAtICVzIGhhcyBmYWlsZWQgJWQgdGltZXMgXG4iCi0JICAgImFuZCBoYXMgYmVlbiBwZXJtYW5lbnRseSBkaXNhYmxlZC4gIFBsZWFzZSB0cnkgcmVzZWF0aW5nXG4iCi0JICAgInRoaXMgZGV2aWNlIG9yIHJlcGxhY2luZyBpdC5cbiIsCi0JCWRydl9zdHIsIHBjaV9zdHIsIGZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQpOworCSAgICJFRUg6IFBDSSBkZXZpY2UgYXQgbG9jYXRpb249JXMgZHJpdmVyPSVzIHBjaSBhZGRyPSVzIFxuIgorCQkiaGFzIGZhaWxlZCAlZCB0aW1lcyBhbmQgaGFzIGJlZW4gcGVybWFuZW50bHkgZGlzYWJsZWQuIFxuIgorCQkiUGxlYXNlIHRyeSByZXNlYXRpbmcgdGhpcyBkZXZpY2Ugb3IgcmVwbGFjaW5nIGl0LlxuIiwKKwkJbG9jYXRpb24sIGRydl9zdHIsIHBjaV9zdHIsIGZyb3plbl9wZG4tPmVlaF9mcmVlemVfY291bnQpOwogCWdvdG8gcGVybV9lcnJvcjsKIAogaGFyZF9mYWlsOgogCXByaW50ayhLRVJOX0VSUgotCSAgICJFRUg6IFVuYWJsZSB0byByZWNvdmVyIGZyb20gZmFpbHVyZSBvZiBQQ0kgZGV2aWNlICVzIC0gJXNcbiIKKwkgICAiRUVIOiBVbmFibGUgdG8gcmVjb3ZlciBmcm9tIGZhaWx1cmUgb2YgUENJIGRldmljZSAiCisJICAgImF0IGxvY2F0aW9uPSVzIGRyaXZlcj0lcyBwY2kgYWRkcj0lcyBcbiIKIAkgICAiUGxlYXNlIHRyeSByZXNlYXRpbmcgdGhpcyBkZXZpY2Ugb3IgcmVwbGFjaW5nIGl0LlxuIiwKLQkJZHJ2X3N0ciwgcGNpX3N0cik7CisJCWxvY2F0aW9uLCBkcnZfc3RyLCBwY2lfc3RyKTsKIAogcGVybV9lcnJvcjoKIAllZWhfc2xvdF9lcnJvcl9kZXRhaWwoZnJvemVuX3BkbiwgMiAvKiBQZXJtYW5lbnQgRXJyb3IgKi8pOwpAQCAtMzg0LDYgKzM5Nyw4IEBACiAKIAkvKiBTaHV0IGRvd24gdGhlIGRldmljZSBkcml2ZXJzIGZvciBnb29kLiAqLwogCXBjaWJpb3NfcmVtb3ZlX3BjaV9kZXZpY2VzKGZyb3plbl9idXMpOworCisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qIC0tLS0tLS0tLS0gZW5kIG9mIGZpbGUgLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2VlaF9ldmVudC5jCmluZGV4IDQwMDIwYzYuLjhmMmQxMjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9lZWhfZXZlbnQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvZWVoX2V2ZW50LmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwNSBMaW5hcyBWZXBzdGFzIDxsaW5hc0BsaW5hcy5vcmc+CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CkBAIC01NiwzOCArNTcsNDMgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBlZWhfZXZlbnQJKmV2ZW50OworCXN0cnVjdCBwY2lfZG4gKnBkbjsKIAogCWRhZW1vbml6ZSAoImVlaGQiKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0Jd2hpbGUgKDEpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZWVoX2V2ZW50bGlzdF9sb2NrLCBmbGFncyk7CisJZXZlbnQgPSBOVUxMOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZlZWhfZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKLQkJZXZlbnQgPSBOVUxMOworCS8qIFVucXVldWUgdGhlIGV2ZW50LCBnZXQgcmVhZHkgdG8gcHJvY2Vzcy4gKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmVlaF9ldmVudGxpc3QpKSB7CisJCWV2ZW50ID0gbGlzdF9lbnRyeShlZWhfZXZlbnRsaXN0Lm5leHQsIHN0cnVjdCBlZWhfZXZlbnQsIGxpc3QpOworCQlsaXN0X2RlbCgmZXZlbnQtPmxpc3QpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZWhfZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKIAotCQkvKiBVbnF1ZXVlIHRoZSBldmVudCwgZ2V0IHJlYWR5IHRvIHByb2Nlc3MuICovCi0JCWlmICghbGlzdF9lbXB0eSgmZWVoX2V2ZW50bGlzdCkpIHsKLQkJCWV2ZW50ID0gbGlzdF9lbnRyeShlZWhfZXZlbnRsaXN0Lm5leHQsIHN0cnVjdCBlZWhfZXZlbnQsIGxpc3QpOwotCQkJbGlzdF9kZWwoJmV2ZW50LT5saXN0KTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlZWhfZXZlbnRsaXN0X2xvY2ssIGZsYWdzKTsKKwlpZiAoZXZlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKLQkJaWYgKGV2ZW50ID09IE5VTEwpCi0JCQlicmVhazsKKwkvKiBTZXJpYWxpemUgcHJvY2Vzc2luZyBvZiBFRUggZXZlbnRzICovCisJbXV0ZXhfbG9jaygmZWVoX2V2ZW50X211dGV4KTsKKwllZWhfbWFya19zbG90KGV2ZW50LT5kbiwgRUVIX01PREVfUkVDT1ZFUklORyk7CiAKLQkJLyogU2VyaWFsaXplIHByb2Nlc3Npbmcgb2YgRUVIIGV2ZW50cyAqLwotCQltdXRleF9sb2NrKCZlZWhfZXZlbnRfbXV0ZXgpOwotCQllZWhfbWFya19zbG90KGV2ZW50LT5kbiwgRUVIX01PREVfUkVDT1ZFUklORyk7CisJcHJpbnRrKEtFUk5fSU5GTyAiRUVIOiBEZXRlY3RlZCBQQ0kgYnVzIGVycm9yIG9uIGRldmljZSAlc1xuIiwKKwkgICAgICAgcGNpX25hbWUoZXZlbnQtPmRldikpOwogCi0JCXByaW50ayhLRVJOX0lORk8gIkVFSDogRGV0ZWN0ZWQgUENJIGJ1cyBlcnJvciBvbiBkZXZpY2UgJXNcbiIsCi0JCSAgICAgICBwY2lfbmFtZShldmVudC0+ZGV2KSk7CisJcGRuID0gaGFuZGxlX2VlaF9ldmVudHMoZXZlbnQpOwogCi0JCWhhbmRsZV9lZWhfZXZlbnRzKGV2ZW50KTsKKwllZWhfY2xlYXJfc2xvdChldmVudC0+ZG4sIEVFSF9NT0RFX1JFQ09WRVJJTkcpOworCXBjaV9kZXZfcHV0KGV2ZW50LT5kZXYpOworCWtmcmVlKGV2ZW50KTsKKwltdXRleF91bmxvY2soJmVlaF9ldmVudF9tdXRleCk7CiAKLQkJZWVoX2NsZWFyX3Nsb3QoZXZlbnQtPmRuLCBFRUhfTU9ERV9SRUNPVkVSSU5HKTsKLQkJcGNpX2Rldl9wdXQoZXZlbnQtPmRldik7Ci0JCWtmcmVlKGV2ZW50KTsKLQkJbXV0ZXhfdW5sb2NrKCZlZWhfZXZlbnRfbXV0ZXgpOworCS8qIElmIHRoZXJlIGFyZSBubyBuZXcgZXJyb3JzIGFmdGVyIGFuIGhvdXIsIGNsZWFyIHRoZSBjb3VudGVyLiAqLworCWlmIChwZG4gJiYgcGRuLT5lZWhfZnJlZXplX2NvdW50PjApIHsKKwkJbXNsZWVwX2ludGVycnVwdGlibGUgKDM2MDAqMTAwMCk7CisJCWlmIChwZG4tPmVlaF9mcmVlemVfY291bnQ+MCkKKwkJCXBkbi0+ZWVoX2ZyZWV6ZV9jb3VudC0tOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCAyNjQzMDc4Li5kMDNhOGIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtMSwyMyArMSwyNCBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMSBNaWtlIENvcnJpZ2FuICYgRGF2ZSBFbmdlYnJldHNlbiwgSUJNIENvcnBvcmF0aW9uCiAgKgotICogUmV3cml0ZSwgY2xlYW51cDogCisgKiBSZXdyaXRlLCBjbGVhbnVwOgogICoKICAqIENvcHlyaWdodCAoQykgMjAwNCBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+LCBJQk0gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNiBPbG9mIEpvaGFuc3NvbiA8b2xvZkBsaXhvbS5uZXQ+CiAgKgogICogRHluYW1pYyBETUEgbWFwcGluZyBzdXBwb3J0LCBwU2VyaWVzLXNwZWNpZmljIHBhcnRzLCBib3RoIFNNUCBhbmQgTFBBUi4KICAqCi0gKiAKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICogCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqIAorICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCkBAIC00OSw1MiArNTAsNDYgQEAKIAogI2RlZmluZSBEQkcoZm10Li4uKQogCi1zdGF0aWMgdm9pZCB0Y2VfYnVpbGRfcFNlcmllcyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgCi0JCQkgICAgICBsb25nIG5wYWdlcywgdW5zaWduZWQgbG9uZyB1YWRkciwgCitzdGF0aWMgdm9pZCB0Y2VfYnVpbGRfcFNlcmllcyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwKKwkJCSAgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAogCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewotCXVuaW9uIHRjZV9lbnRyeSB0OwotCXVuaW9uIHRjZV9lbnRyeSAqdHA7CisJdTY0IHByb3RvX3RjZTsKKwl1NjQgKnRjZXA7CisJdTY0IHJwbjsKIAogCWluZGV4IDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAJbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAKLQl0LnRlX3dvcmQgPSAwOwotCXQudGVfcmR3ciA9IDE7IC8vIFJlYWQgYWxsb3dlZCAKKwlwcm90b190Y2UgPSBUQ0VfUENJX1JFQUQ7IC8vIFJlYWQgYWxsb3dlZAogCiAJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQotCQl0LnRlX3BjaXdyID0gMTsKKwkJcHJvdG9fdGNlIHw9IFRDRV9QQ0lfV1JJVEU7CiAKLQl0cCA9ICgodW5pb24gdGNlX2VudHJ5ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKIAogCXdoaWxlIChucGFnZXMtLSkgewogCQkvKiBjYW4ndCBtb3ZlIHRoaXMgb3V0IHNpbmNlIHdlIG1pZ2h0IGNyb3NzIExNQiBib3VuZGFyeSAqLwotCQl0LnRlX3JwbiA9ICh2aXJ0X3RvX2Ficyh1YWRkcikpID4+IFRDRV9TSElGVDsKLQkKLQkJdHAtPnRlX3dvcmQgPSB0LnRlX3dvcmQ7CisJCXJwbiA9ICh2aXJ0X3RvX2Ficyh1YWRkcikpID4+IFRDRV9TSElGVDsKKwkJKnRjZXAgPSBwcm90b190Y2UgfCAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOwogCiAJCXVhZGRyICs9IFRDRV9QQUdFX1NJWkU7Ci0JCXRwKys7CisJCXRjZXArKzsKIAl9CiB9CiAKIAogc3RhdGljIHZvaWQgdGNlX2ZyZWVfcFNlcmllcyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwgbG9uZyBucGFnZXMpCiB7Ci0JdW5pb24gdGNlX2VudHJ5IHQ7Ci0JdW5pb24gdGNlX2VudHJ5ICp0cDsKKwl1NjQgKnRjZXA7CiAKIAlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAlpbmRleCA8PD0gVENFX1BBR0VfRkFDVE9SOwogCi0JdC50ZV93b3JkID0gMDsKLQl0cCAgPSAoKHVuaW9uIHRjZV9lbnRyeSAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKLQkJCi0Jd2hpbGUgKG5wYWdlcy0tKSB7Ci0JCXRwLT50ZV93b3JkID0gdC50ZV93b3JkOwotCQkKLQkJdHArKzsKLQl9CisJdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCisJd2hpbGUgKG5wYWdlcy0tKQorCQkqKHRjZXArKykgPSAwOwogfQogCiAKQEAgLTEwMyw0MyArOTgsNDQgQEAKIAkJCQllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24pCiB7CiAJdTY0IHJjOwotCXVuaW9uIHRjZV9lbnRyeSB0Y2U7CisJdTY0IHByb3RvX3RjZSwgdGNlOworCXU2NCBycG47CiAKIAl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAotCXRjZS50ZV93b3JkID0gMDsKLQl0Y2UudGVfcnBuID0gKHZpcnRfdG9fYWJzKHVhZGRyKSkgPj4gVENFX1NISUZUOwotCXRjZS50ZV9yZHdyID0gMTsKKwlycG4gPSAodmlydF90b19hYnModWFkZHIpKSA+PiBUQ0VfU0hJRlQ7CisJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOwogCWlmIChkaXJlY3Rpb24gIT0gRE1BX1RPX0RFVklDRSkKLQkJdGNlLnRlX3BjaXdyID0gMTsKKwkJcHJvdG9fdGNlIHw9IFRDRV9QQ0lfV1JJVEU7CiAKIAl3aGlsZSAobnBhZ2VzLS0pIHsKLQkJcmMgPSBwbHBhcl90Y2VfcHV0KCh1NjQpdGJsLT5pdF9pbmRleCwgCi0JCQkJICAgKHU2NCl0Y2VudW0gPDwgMTIsIAotCQkJCSAgIHRjZS50ZV93b3JkICk7Ci0JCQorCQl0Y2UgPSBwcm90b190Y2UgfCAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOworCQlyYyA9IHBscGFyX3RjZV9wdXQoKHU2NCl0YmwtPml0X2luZGV4LCAodTY0KXRjZW51bSA8PCAxMiwgdGNlKTsKKwogCQlpZiAocmMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCQlwcmludGsoInRjZV9idWlsZF9wU2VyaWVzTFA6IHBscGFyX3RjZV9wdXQgZmFpbGVkLiByYz0lbGRcbiIsIHJjKTsKIAkJCXByaW50aygiXHRpbmRleCAgID0gMHglbHhcbiIsICh1NjQpdGJsLT5pdF9pbmRleCk7CiAJCQlwcmludGsoIlx0dGNlbnVtICA9IDB4JWx4XG4iLCAodTY0KXRjZW51bSk7Ci0JCQlwcmludGsoIlx0dGNlIHZhbCA9IDB4JWx4XG4iLCB0Y2UudGVfd29yZCApOworCQkJcHJpbnRrKCJcdHRjZSB2YWwgPSAweCVseFxuIiwgdGNlICk7CiAJCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJCX0KLQkJCQorCiAJCXRjZW51bSsrOwotCQl0Y2UudGVfcnBuKys7CisJCXJwbisrOwogCX0KIH0KIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHZvaWQgKiwgdGNlX3BhZ2UpID0gTlVMTDsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQgKiwgdGNlX3BhZ2UpID0gTlVMTDsKIAogc3RhdGljIHZvaWQgdGNlX2J1aWxkbXVsdGlfcFNlcmllc0xQKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIHRjZW51bSwKIAkJCQkgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAogCQkJCSAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKQogewogCXU2NCByYzsKLQl1bmlvbiB0Y2VfZW50cnkgdGNlLCAqdGNlcDsKKwl1NjQgcHJvdG9fdGNlOworCXU2NCAqdGNlcDsKKwl1NjQgcnBuOwogCWxvbmcgbCwgbGltaXQ7CiAKIAlpZiAoVENFX1BBR0VfRkFDVE9SID09IDAgJiYgbnBhZ2VzID09IDEpCkBAIC0xNTIsNyArMTQ4LDcgQEAKIAkgKiBmcm9tIGlvbW11X2FsbG9jeyxfc2d9KCkKIAkgKi8KIAlpZiAoIXRjZXApIHsKLQkJdGNlcCA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9BVE9NSUMpOworCQl0Y2VwID0gKHU2NCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKIAkJLyogSWYgYWxsb2NhdGlvbiBmYWlscywgZmFsbCBiYWNrIHRvIHRoZSBsb29wIGltcGxlbWVudGF0aW9uICovCiAJCWlmICghdGNlcCkKIAkJCXJldHVybiB0Y2VfYnVpbGRfcFNlcmllc0xQKHRibCwgdGNlbnVtLCBucGFnZXMsCkBAIC0xNjMsMTEgKzE1OSwxMCBAQAogCXRjZW51bSA8PD0gVENFX1BBR0VfRkFDVE9SOwogCW5wYWdlcyA8PD0gVENFX1BBR0VfRkFDVE9SOwogCi0JdGNlLnRlX3dvcmQgPSAwOwotCXRjZS50ZV9ycG4gPSAodmlydF90b19hYnModWFkZHIpKSA+PiBUQ0VfU0hJRlQ7Ci0JdGNlLnRlX3Jkd3IgPSAxOworCXJwbiA9ICh2aXJ0X3RvX2Ficyh1YWRkcikpID4+IFRDRV9TSElGVDsKKwlwcm90b190Y2UgPSBUQ0VfUENJX1JFQUQ7CiAJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQotCQl0Y2UudGVfcGNpd3IgPSAxOworCQlwcm90b190Y2UgfD0gVENFX1BDSV9XUklURTsKIAogCS8qIFdlIGNhbiBtYXAgbWF4IG9uZSBwYWdlZnVsIG9mIFRDRXMgYXQgYSB0aW1lICovCiAJZG8gewpAQCAtMTc1LDExICsxNzAsMTEgQEAKIAkJICogU2V0IHVwIHRoZSBwYWdlIHdpdGggVENFIGRhdGEsIGxvb3BpbmcgdGhyb3VnaCBhbmQgc2V0dGluZwogCQkgKiB0aGUgdmFsdWVzLgogCQkgKi8KLQkJbGltaXQgPSBtaW5fdChsb25nLCBucGFnZXMsIDQwOTYvc2l6ZW9mKHVuaW9uIHRjZV9lbnRyeSkpOworCQlsaW1pdCA9IG1pbl90KGxvbmcsIG5wYWdlcywgNDA5Ni9UQ0VfRU5UUllfU0laRSk7CiAKIAkJZm9yIChsID0gMDsgbCA8IGxpbWl0OyBsKyspIHsKLQkJCXRjZXBbbF0gPSB0Y2U7Ci0JCQl0Y2UudGVfcnBuKys7CisJCQl0Y2VwW2xdID0gcHJvdG9fdGNlIHwgKHJwbiAmIFRDRV9SUE5fTUFTSykgPDwgVENFX1JQTl9TSElGVDsKKwkJCXJwbisrOwogCQl9CiAKIAkJcmMgPSBwbHBhcl90Y2VfcHV0X2luZGlyZWN0KCh1NjQpdGJsLT5pdF9pbmRleCwKQEAgLTE5NSw3ICsxOTAsNyBAQAogCQlwcmludGsoInRjZV9idWlsZG11bHRpX3BTZXJpZXNMUDogcGxwYXJfdGNlX3B1dCBmYWlsZWQuIHJjPSVsZFxuIiwgcmMpOwogCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwogCQlwcmludGsoIlx0bnBhZ2VzICA9IDB4JWx4XG4iLCAodTY0KW5wYWdlcyk7Ci0JCXByaW50aygiXHR0Y2VbMF0gdmFsID0gMHglbHhcbiIsIHRjZXBbMF0udGVfd29yZCk7CisJCXByaW50aygiXHR0Y2VbMF0gdmFsID0gMHglbHhcbiIsIHRjZXBbMF0pOwogCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJfQogfQpAQCAtMjAzLDIzICsxOTgsMTcgQEAKIHN0YXRpYyB2b2lkIHRjZV9mcmVlX3BTZXJpZXNMUChzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyB0Y2VudW0sIGxvbmcgbnBhZ2VzKQogewogCXU2NCByYzsKLQl1bmlvbiB0Y2VfZW50cnkgdGNlOwogCiAJdGNlbnVtIDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAJbnBhZ2VzIDw8PSBUQ0VfUEFHRV9GQUNUT1I7CiAKLQl0Y2UudGVfd29yZCA9IDA7Ci0KIAl3aGlsZSAobnBhZ2VzLS0pIHsKLQkJcmMgPSBwbHBhcl90Y2VfcHV0KCh1NjQpdGJsLT5pdF9pbmRleCwKLQkJCQkgICAodTY0KXRjZW51bSA8PCAxMiwKLQkJCQkgICB0Y2UudGVfd29yZCk7CisJCXJjID0gcGxwYXJfdGNlX3B1dCgodTY0KXRibC0+aXRfaW5kZXgsICh1NjQpdGNlbnVtIDw8IDEyLCAwKTsKIAogCQlpZiAocmMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCQlwcmludGsoInRjZV9mcmVlX3BTZXJpZXNMUDogcGxwYXJfdGNlX3B1dCBmYWlsZWQuIHJjPSVsZFxuIiwgcmMpOwogCQkJcHJpbnRrKCJcdGluZGV4ICAgPSAweCVseFxuIiwgKHU2NCl0YmwtPml0X2luZGV4KTsKIAkJCXByaW50aygiXHR0Y2VudW0gID0gMHglbHhcbiIsICh1NjQpdGNlbnVtKTsKLQkJCXByaW50aygiXHR0Y2UgdmFsID0gMHglbHhcbiIsIHRjZS50ZV93b3JkICk7CiAJCQlzaG93X3N0YWNrKGN1cnJlbnQsICh1bnNpZ25lZCBsb25nICopX19nZXRfU1AoKSk7CiAJCX0KIApAQCAtMjMxLDMxICsyMjAsMjQgQEAKIHN0YXRpYyB2b2lkIHRjZV9mcmVlbXVsdGlfcFNlcmllc0xQKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIHRjZW51bSwgbG9uZyBucGFnZXMpCiB7CiAJdTY0IHJjOwotCXVuaW9uIHRjZV9lbnRyeSB0Y2U7CiAKIAl0Y2VudW0gPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAlucGFnZXMgPDw9IFRDRV9QQUdFX0ZBQ1RPUjsKIAotCXRjZS50ZV93b3JkID0gMDsKLQotCXJjID0gcGxwYXJfdGNlX3N0dWZmKCh1NjQpdGJsLT5pdF9pbmRleCwKLQkJCSAgICh1NjQpdGNlbnVtIDw8IDEyLAotCQkJICAgdGNlLnRlX3dvcmQsCi0JCQkgICBucGFnZXMpOworCXJjID0gcGxwYXJfdGNlX3N0dWZmKCh1NjQpdGJsLT5pdF9pbmRleCwgKHU2NCl0Y2VudW0gPDwgMTIsIDAsIG5wYWdlcyk7CiAKIAlpZiAocmMgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKSB7CiAJCXByaW50aygidGNlX2ZyZWVtdWx0aV9wU2VyaWVzTFA6IHBscGFyX3RjZV9zdHVmZiBmYWlsZWRcbiIpOwogCQlwcmludGsoIlx0cmMgICAgICA9ICVsZFxuIiwgcmMpOwogCQlwcmludGsoIlx0aW5kZXggICA9IDB4JWx4XG4iLCAodTY0KXRibC0+aXRfaW5kZXgpOwogCQlwcmludGsoIlx0bnBhZ2VzICA9IDB4JWx4XG4iLCAodTY0KW5wYWdlcyk7Ci0JCXByaW50aygiXHR0Y2UgdmFsID0gMHglbHhcbiIsIHRjZS50ZV93b3JkICk7CiAJCXNob3dfc3RhY2soY3VycmVudCwgKHVuc2lnbmVkIGxvbmcgKilfX2dldF9TUCgpKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIGlvbW11X3RhYmxlX3NldHBhcm1zKHN0cnVjdCBwY2lfY29udHJvbGxlciAqcGhiLAogCQkJCSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuLAotCQkJCSBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkgCisJCQkJIHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAl1bnNpZ25lZCBsb25nICpiYXNlcDsKQEAgLTI3NSwxNiArMjU3LDE2IEBACiAJbWVtc2V0KCh2b2lkICopdGJsLT5pdF9iYXNlLCAwLCAqc2l6ZXApOwogCiAJdGJsLT5pdF9idXNubyA9IHBoYi0+YnVzLT5udW1iZXI7Ci0JCisKIAkvKiBVbml0cyBvZiB0Y2UgZW50cmllcyAqLwogCXRibC0+aXRfb2Zmc2V0ID0gcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID4+IFBBR0VfU0hJRlQ7Ci0JCisKIAkvKiBUZXN0IGlmIHdlIGFyZSBnb2luZyBvdmVyIDJHQiBvZiBETUEgc3BhY2UgKi8KIAlpZiAocGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyICsgcGhiLT5kbWFfd2luZG93X3NpemUgPiAweDgwMDAwMDAwdWwpIHsKIAkJdWRiZ19wcmludGYoIlBDSV9ETUE6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIElPQXMgdW5kZXIgdGhpcyBQSEIuXG4iKTsKLQkJcGFuaWMoIlBDSV9ETUE6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIElPQXMgdW5kZXIgdGhpcyBQSEIuXG4iKTsgCisJCXBhbmljKCJQQ0lfRE1BOiBVbmV4cGVjdGVkIG51bWJlciBvZiBJT0FzIHVuZGVyIHRoaXMgUEhCLlxuIik7CiAJfQotCQorCiAJcGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyICs9IHBoYi0+ZG1hX3dpbmRvd19zaXplOwogCiAJLyogU2V0IHRoZSB0Y2UgdGFibGUgc2l6ZSAtIG1lYXN1cmVkIGluIGVudHJpZXMgKi8KQEAgLTI5OSwzMCArMjgxLDIyIEBACiAgKiBpb21tdV90YWJsZV9zZXRwYXJtc19scGFyCiAgKgogICogRnVuY3Rpb246IE9uIHBTZXJpZXMgTFBBUiBzeXN0ZW1zLCByZXR1cm4gVENFIHRhYmxlIGluZm8sIGdpdmVuIGEgcGNpIGJ1cy4KLSAqCi0gKiBUb0RvOiBwcm9wZXJseSBpbnRlcnByZXQgdGhlIGlibSxkbWEtd2luZG93IHByb3BlcnR5LiAgVGhlIGRlZmluaXRpb24gaXM6Ci0gKglsb2dpY2FsLWJ1cy1udW1iZXIJKDEgd29yZCkKLSAqCXBoeXMtYWRkcmVzcwkJKCNhZGRyZXNzLWNlbGxzIHdvcmRzKQotICoJc2l6ZQkJCSgjY2VsbC1zaXplIHdvcmRzKQotICoKLSAqIEN1cnJlbnRseSB3ZSBoYXJkIGNvZGUgdGhlc2Ugc2l6ZXMgKG1vcmUgb3IgbGVzcykuCiAgKi8KIHN0YXRpYyB2b2lkIGlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIoc3RydWN0IHBjaV9jb250cm9sbGVyICpwaGIsCiAJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpkbiwKIAkJCQkgICAgICBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRtYV93aW5kb3cpCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZG1hX3dpbmRvdykKIHsKLQl0YmwtPml0X2J1c25vICA9IFBDSV9ETihkbiktPmJ1c3N1Ym5vOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplOwogCi0JLyogVE9ETzogUGFyc2UgZmllbGQgc2l6ZSBwcm9wZXJ0aWVzIHByb3Blcmx5LiAqLwotCXRibC0+aXRfc2l6ZSAgID0gKCgodW5zaWduZWQgbG9uZylkbWFfd2luZG93WzRdIDw8IDMyKSB8Ci0JCQkgICAodW5zaWduZWQgbG9uZylkbWFfd2luZG93WzVdKSA+PiBQQUdFX1NISUZUOwotCXRibC0+aXRfb2Zmc2V0ID0gKCgodW5zaWduZWQgbG9uZylkbWFfd2luZG93WzJdIDw8IDMyKSB8Ci0JCQkgICAodW5zaWduZWQgbG9uZylkbWFfd2luZG93WzNdKSA+PiBQQUdFX1NISUZUOworCXRibC0+aXRfYnVzbm8gID0gUENJX0ROKGRuKS0+YnVzc3Vibm87CisJb2ZfcGFyc2VfZG1hX3dpbmRvdyhkbiwgZG1hX3dpbmRvdywgJnRibC0+aXRfaW5kZXgsICZvZmZzZXQsICZzaXplKTsKKwogCXRibC0+aXRfYmFzZSAgID0gMDsKLQl0YmwtPml0X2luZGV4ICA9IGRtYV93aW5kb3dbMF07CiAJdGJsLT5pdF9ibG9ja3NpemUgID0gMTY7CiAJdGJsLT5pdF90eXBlID0gVENFX1BDSTsKKwl0YmwtPml0X29mZnNldCA9IG9mZnNldCA+PiBQQUdFX1NISUZUOworCXRibC0+aXRfc2l6ZSA9IHNpemUgPj4gUEFHRV9TSElGVDsKIH0KIAogc3RhdGljIHZvaWQgaW9tbXVfYnVzX3NldHVwX3BTZXJpZXMoc3RydWN0IHBjaV9idXMgKmJ1cykKQEAgLTM1NywxMyArMzMxLDkgQEAKIAlpZiAoaXNhX2RuX29yaWcpCiAJCW9mX25vZGVfcHV0KGlzYV9kbl9vcmlnKTsKIAotCS8qIENvdW50IG51bWJlciBvZiBkaXJlY3QgUENJIGNoaWxkcmVuIG9mIHRoZSBQSEIuCi0JICogQWxsIFBDSSBkZXZpY2Ugbm9kZXMgaGF2ZSBjbGFzcy1jb2RlIHByb3BlcnR5LCBzbyBpdCdzCi0JICogYW4gZWFzeSB3YXkgdG8gZmluZCB0aGVtLgotCSAqLworCS8qIENvdW50IG51bWJlciBvZiBkaXJlY3QgUENJIGNoaWxkcmVuIG9mIHRoZSBQSEIuICovCiAJZm9yIChjaGlsZHJlbiA9IDAsIHRtcCA9IGRuLT5jaGlsZDsgdG1wOyB0bXAgPSB0bXAtPnNpYmxpbmcpCi0JCWlmIChnZXRfcHJvcGVydHkodG1wLCAiY2xhc3MtY29kZSIsIE5VTEwpKQotCQkJY2hpbGRyZW4rKzsKKwkJY2hpbGRyZW4rKzsKIAogCURCRygiQ2hpbGRyZW46ICVkXG4iLCBjaGlsZHJlbik7CiAKQEAgLTM5NCwxMCArMzY0LDExIEBACiAJcGNpLT5waGItPmRtYV93aW5kb3dfc2l6ZSA9IDB4ODAwMDAwMHVsOwogCXBjaS0+cGhiLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMHg4MDAwMDAwdWw7CiAKLQl0YmwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMKTsKKwl0YmwgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwsCisJCQkgICBwY2ktPnBoYi0+bm9kZSk7CiAKIAlpb21tdV90YWJsZV9zZXRwYXJtcyhwY2ktPnBoYiwgZG4sIHRibCk7Ci0JcGNpLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwlwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBjaS0+cGhiLT5ub2RlKTsKIAogCS8qIERpdmlkZSB0aGUgcmVzdCAoMS43NUdCKSBhbW9uZyB0aGUgY2hpbGRyZW4gKi8KIAlwY2ktPnBoYi0+ZG1hX3dpbmRvd19zaXplID0gMHg4MDAwMDAwMHVsOwpAQCAtNDE0LDcgKzM4NSw3IEBACiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbiwgKnBkbjsKIAlzdHJ1Y3QgcGNpX2RuICpwcGNpOwotCXVuc2lnbmVkIGludCAqZG1hX3dpbmRvdyA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqZG1hX3dpbmRvdyA9IE5VTEw7CiAKIAlEQkcoImlvbW11X2J1c19zZXR1cF9wU2VyaWVzTFAsIGJ1cyAlcCwgYnVzLT5zZWxmICVwXG4iLCBidXMsIGJ1cy0+c2VsZik7CiAKQEAgLTQyMiw3ICszOTMsNyBAQAogCiAJLyogRmluZCBuZWFyZXN0IGlibSxkbWEtd2luZG93LCB3YWxraW5nIHVwIHRoZSBkZXZpY2UgdHJlZSAqLwogCWZvciAocGRuID0gZG47IHBkbiAhPSBOVUxMOyBwZG4gPSBwZG4tPnBhcmVudCkgewotCQlkbWFfd2luZG93ID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShwZG4sICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOworCQlkbWFfd2luZG93ID0gZ2V0X3Byb3BlcnR5KHBkbiwgImlibSxkbWEtd2luZG93IiwgTlVMTCk7CiAJCWlmIChkbWFfd2luZG93ICE9IE5VTEwpCiAJCQlicmVhazsKIAl9CkBAIC00NDAsMTIgKzQxMSwxMiBAQAogCiAJCXBwY2ktPmJ1c3N1Ym5vID0gYnVzLT5udW1iZXI7CiAKLQkJdGJsID0gKHN0cnVjdCBpb21tdV90YWJsZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksCi0JCQkJCQkgICAgR0ZQX0tFUk5FTCk7Ci0JCisJCXRibCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwgR0ZQX0tFUk5FTCwKKwkJCQkgICBwcGNpLT5waGItPm5vZGUpOworCiAJCWlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIocHBjaS0+cGhiLCBwZG4sIHRibCwgZG1hX3dpbmRvdyk7CiAKLQkJcHBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CisJCXBwY2ktPmlvbW11X3RhYmxlID0gaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBwY2ktPnBoYi0+bm9kZSk7CiAJfQogCiAJaWYgKHBkbiAhPSBkbikKQEAgLTQ2OCw5ICs0MzksMTEgQEAKIAkgKi8KIAlpZiAoIWRldi0+YnVzLT5zZWxmKSB7CiAJCURCRygiIC0tPiBmaXJzdCBjaGlsZCwgbm8gYnJpZGdlLiBBbGxvY2F0aW5nIGlvbW11IHRhYmxlLlxuIik7Ci0JCXRibCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwpOworCQl0YmwgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksIEdGUF9LRVJORUwsCisJCQkJICAgUENJX0ROKGRuKS0+cGhiLT5ub2RlKTsKIAkJaW9tbXVfdGFibGVfc2V0cGFybXMoUENJX0ROKGRuKS0+cGhiLCBkbiwgdGJsKTsKLQkJUENJX0ROKG15ZG4pLT5pb21tdV90YWJsZSA9IGlvbW11X2luaXRfdGFibGUodGJsKTsKKwkJUENJX0ROKGRuKS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwKKwkJCQkJCVBDSV9ETihkbiktPnBoYi0+bm9kZSk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTUxNiw3ICs0ODksNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGRuLCAqZG47CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7Ci0JaW50ICpkbWFfd2luZG93ID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICpkbWFfd2luZG93ID0gTlVMTDsKIAlzdHJ1Y3QgcGNpX2RuICpwY2k7CiAKIAlEQkcoImlvbW11X2Rldl9zZXR1cF9wU2VyaWVzTFAsIGRldiAlcCAoJXMpXG4iLCBkZXYsIHBjaV9uYW1lKGRldikpOwpAQCAtNTMxLDggKzUwNCw3IEBACiAKIAlmb3IgKHBkbiA9IGRuOyBwZG4gJiYgUENJX0ROKHBkbikgJiYgIVBDSV9ETihwZG4pLT5pb21tdV90YWJsZTsKIAkgICAgIHBkbiA9IHBkbi0+cGFyZW50KSB7Ci0JCWRtYV93aW5kb3cgPSAodW5zaWduZWQgaW50ICopCi0JCQlnZXRfcHJvcGVydHkocGRuLCAiaWJtLGRtYS13aW5kb3ciLCBOVUxMKTsKKwkJZG1hX3dpbmRvdyA9IGdldF9wcm9wZXJ0eShwZG4sICJpYm0sZG1hLXdpbmRvdyIsIE5VTEwpOwogCQlpZiAoZG1hX3dpbmRvdykKIAkJCWJyZWFrOwogCX0KQEAgLTU1MywxMiArNTI1LDEyIEBACiAJCS8qIGlvbW11X3RhYmxlX3NldHBhcm1zX2xwYXIgbmVlZHMgYnVzc3Vibm8uICovCiAJCXBjaS0+YnVzc3Vibm8gPSBwY2ktPnBoYi0+YnVzLT5udW1iZXI7CiAKLQkJdGJsID0gKHN0cnVjdCBpb21tdV90YWJsZSAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpb21tdV90YWJsZSksCi0JCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCXRibCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwgR0ZQX0tFUk5FTCwKKwkJCQkgICBwY2ktPnBoYi0+bm9kZSk7CiAKIAkJaW9tbXVfdGFibGVfc2V0cGFybXNfbHBhcihwY2ktPnBoYiwgcGRuLCB0YmwsIGRtYV93aW5kb3cpOwogCi0JCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCk7CisJCXBjaS0+aW9tbXVfdGFibGUgPSBpb21tdV9pbml0X3RhYmxlKHRibCwgcGNpLT5waGItPm5vZGUpOwogCX0KIAogCWlmIChwZG4gIT0gZG4pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcnRhc2QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCmluZGV4IGUwMDAwY2UuLjJlNGUwNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9ydGFzZC5jCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoZXJyb3IgPT0gLUVJTlZBTCkgewotCQlwcmludGsoS0VSTl9JTkZPICJydGFzZDogc3VydmVpbGxhbmNlIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAicnRhc2Q6IHN1cnZlaWxsYW5jZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00NDAsNyArNDQwLDcgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJSVEFTIGRhZW1vbiBzdGFydGVkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiUlRBUyBkYWVtb24gc3RhcnRlZFxuIik7CiAKIAlERUJVRygid2lsbCBzbGVlcCBmb3IgJWQgbWlsbGlzZWNvbmRzXG4iLCAoMzAwMDAvcnRhc19ldmVudF9zY2FuX3JhdGUpKTsKIApAQCAtNDg3LDcgKzQ4Nyw3IEBACiAKIAkvKiBObyBSVEFTICovCiAJaWYgKHJ0YXNfdG9rZW4oImV2ZW50LXNjYW4iKSA9PSBSVEFTX1VOS05PV05fU0VSVklDRSkgewotCQlwcmludGsoS0VSTl9JTkZPICJydGFzZDogbm8gZXZlbnQtc2NhbiBvbiBzeXN0ZW1cbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAicnRhc2Q6IG5vIGV2ZW50LXNjYW4gb24gc3lzdGVtXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NjYW5sb2cuYwppbmRleCA1MDY0MzQ5Li43N2E1YmIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2NhbmxvZy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zY2FubG9nLmMKQEAgLTEwNyw5ICsxMDcsOSBAQAogCQkJLyogQnJlYWsgdG8gc2xlZXAgZGVmYXVsdCB0aW1lICovCiAJCQlicmVhazsKIAkJICAgIGRlZmF1bHQ6Ci0JCQlpZiAoc3RhdHVzID4gOTkwMCAmJiBzdGF0dXMgPD0gOTkwNSkgewotCQkJCXdhaXRfdGltZSA9IHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKHN0YXR1cyk7Ci0JCQl9IGVsc2UgeworCQkJLyogQXNzdW1lIGV4dGVuZGVkIGJ1c3kgKi8KKwkJCXdhaXRfdGltZSA9IHJ0YXNfYnVzeV9kZWxheV90aW1lKHN0YXR1cyk7CisJCQlpZiAoIXdhaXRfdGltZSkgewogCQkJCXByaW50ayhLRVJOX0VSUiAic2NhbmxvZzogdW5rbm93biBlcnJvciBmcm9tIHJ0YXM6ICVkXG4iLCBzdGF0dXMpOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwppbmRleCAzYmE4NzgzLi4xZTI4NTE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc2V0dXAuYwpAQCAtMjM1LDE0ICsyMzUsMTQgQEAKIAlpZiAoZmlybXdhcmVfaGFzX2ZlYXR1cmUoRldfRkVBVFVSRV9TUExQQVIpKSB7CiAJCXZwYV9pbml0KGJvb3RfY3B1aWQpOwogCQlpZiAoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIHNoYXJlZCBwcm9jZXNzb3IgaWRsZSBsb29wXG4iKTsKIAkJCXBwY19tZC5wb3dlcl9zYXZlID0gcHNlcmllc19zaGFyZWRfaWRsZV9zbGVlcDsKIAkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOwogCQkJcHBjX21kLnBvd2VyX3NhdmUgPSBwc2VyaWVzX2RlZGljYXRlZF9pZGxlX3NsZWVwOwogCQl9CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgZGVmYXVsdCBpZGxlIGxvb3BcbiIpOwogCX0KIAogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Zpby5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3Zpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTUzZTA0Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy92aW8uYworKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKgotICogSUJNIFBvd2VyUEMgcFNlcmllcyBWaXJ0dWFsIEkvTyBJbmZyYXN0cnVjdHVyZSBTdXBwb3J0LgotICoKLSAqICAgIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IElCTSBDb3JwLgotICogICAgIERhdmUgRW5nZWJyZXRzZW4gZW5nZWJyZXRAdXMuaWJtLmNvbQotICogICAgIFNhbnRpYWdvIExlb24gc2FudGlsQHVzLmlibS5jb20KLSAqICAgICBIb2xsaXMgQmxhbmNoYXJkIDxob2xsaXNiQHVzLmlibS5jb20+Ci0gKiAgICAgU3RlcGhlbiBSb3Rod2VsbAotICoKLSAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPGFzbS9pb21tdS5oPgotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLSNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS92aW8uaD4KLSNpbmNsdWRlIDxhc20vaHZjYWxsLmg+Ci0jaW5jbHVkZSA8YXNtL3RjZS5oPgotCi1leHRlcm4gc3RydWN0IHN1YnN5c3RlbSBkZXZpY2VzX3N1YnN5czsgLyogbmVlZGVkIGZvciB2aW9fZmluZF9uYW1lKCkgKi8KLQotc3RhdGljIHZvaWQgcHJvYmVfYnVzX3BzZXJpZXModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGVfdnJvb3QsICpvZl9ub2RlOwotCi0Jbm9kZV92cm9vdCA9IGZpbmRfZGV2aWNlcygidmRldmljZSIpOwotCWlmICgobm9kZV92cm9vdCA9PSBOVUxMKSB8fCAobm9kZV92cm9vdC0+Y2hpbGQgPT0gTlVMTCkpCi0JCS8qIHRoaXMgbWFjaGluZSBkb2Vzbid0IGRvIHZpcnR1YWwgSU8sIGFuZCB0aGF0J3Mgb2sgKi8KLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBDcmVhdGUgc3RydWN0IHZpb19kZXZpY2VzIGZvciBlYWNoIHZpcnR1YWwgZGV2aWNlIGluIHRoZSBkZXZpY2UgdHJlZS4KLQkgKiBEcml2ZXJzIHdpbGwgYXNzb2NpYXRlIHdpdGggdGhlbSBsYXRlci4KLQkgKi8KLQlmb3IgKG9mX25vZGUgPSBub2RlX3Zyb290LT5jaGlsZDsgb2Zfbm9kZSAhPSBOVUxMOwotCQkJb2Zfbm9kZSA9IG9mX25vZGUtPnNpYmxpbmcpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBwcm9jZXNzaW5nICVwXG4iLCBfX0ZVTkNUSU9OX18sIG9mX25vZGUpOwotCQl2aW9fcmVnaXN0ZXJfZGV2aWNlX25vZGUob2Zfbm9kZSk7Ci0JfQotfQotCi0vKioKLSAqIHZpb19tYXRjaF9kZXZpY2VfcHNlcmllczogLSBUZWxsIGlmIGEgcFNlcmllcyBWSU8gZGV2aWNlIG1hdGNoZXMgYQotICoJdmlvX2RldmljZV9pZAotICovCi1zdGF0aWMgaW50IHZpb19tYXRjaF9kZXZpY2VfcHNlcmllcyhjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQsCi0JCWNvbnN0IHN0cnVjdCB2aW9fZGV2ICpkZXYpCi17Ci0JcmV0dXJuIChzdHJuY21wKGRldi0+dHlwZSwgaWQtPnR5cGUsIHN0cmxlbihpZC0+dHlwZSkpID09IDApICYmCi0JCQlkZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCBpZC0+Y29tcGF0KTsKLX0KLQotc3RhdGljIHZvaWQgdmlvX3JlbGVhc2VfZGV2aWNlX3BzZXJpZXMoc3RydWN0IGRldmljZSAqZGV2KQotewotCS8qIFhYWCBmcmVlIFRDRSB0YWJsZSAqLwotCW9mX25vZGVfcHV0KGRldi0+cGxhdGZvcm1fZGF0YSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHZpb2Rldl9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBvZl9ub2RlLT5mdWxsX25hbWUpOwotfQotREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCB2aW9kZXZfc2hvd19kZXZzcGVjLCBOVUxMKTsKLQotc3RhdGljIHZvaWQgdmlvX3VucmVnaXN0ZXJfZGV2aWNlX3BzZXJpZXMoc3RydWN0IHZpb19kZXYgKnZpb2RldikKLXsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnZpb2Rldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdmlvX2J1c19vcHMgdmlvX2J1c19vcHNfcHNlcmllcyA9IHsKLQkubWF0Y2ggPSB2aW9fbWF0Y2hfZGV2aWNlX3BzZXJpZXMsCi0JLnVucmVnaXN0ZXJfZGV2aWNlID0gdmlvX3VucmVnaXN0ZXJfZGV2aWNlX3BzZXJpZXMsCi0JLnJlbGVhc2VfZGV2aWNlID0gdmlvX3JlbGVhc2VfZGV2aWNlX3BzZXJpZXMsCi19OwotCi0vKioKLSAqIHZpb19idXNfaW5pdF9wc2VyaWVzOiAtIEluaXRpYWxpemUgdGhlIHBTZXJpZXMgdmlydHVhbCBJTyBidXMKLSAqLwotc3RhdGljIGludCBfX2luaXQgdmlvX2J1c19pbml0X3BzZXJpZXModm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gdmlvX2J1c19pbml0KCZ2aW9fYnVzX29wc19wc2VyaWVzKTsKLQlpZiAoZXJyID09IDApCi0JCXByb2JlX2J1c19wc2VyaWVzKCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotX19pbml0Y2FsbCh2aW9fYnVzX2luaXRfcHNlcmllcyk7Ci0KLS8qKgotICogdmlvX2J1aWxkX2lvbW11X3RhYmxlOiAtIGdldHMgdGhlIGRtYSBpbmZvcm1hdGlvbiBmcm9tIE9GIGFuZAotICoJYnVpbGRzIHRoZSBUQ0UgdHJlZS4KLSAqIEBkZXY6IHRoZSB2aXJ0dWFsIGRldmljZS4KLSAqCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYnVpbHQgdGNlIHRyZWUsIG9yIE5VTEwgaWYgaXQgY2FuJ3QKLSAqIGZpbmQgcHJvcGVydHkuCi0qLwotc3RhdGljIHN0cnVjdCBpb21tdV90YWJsZSAqdmlvX2J1aWxkX2lvbW11X3RhYmxlKHN0cnVjdCB2aW9fZGV2ICpkZXYpCi17Ci0JdW5zaWduZWQgaW50ICpkbWFfd2luZG93OwotCXN0cnVjdCBpb21tdV90YWJsZSAqbmV3VGNlVGFibGU7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JaW50IGRtYV93aW5kb3dfcHJvcGVydHlfc2l6ZTsKLQotCWRtYV93aW5kb3cgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eShkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCAiaWJtLG15LWRtYS13aW5kb3ciLCAmZG1hX3dpbmRvd19wcm9wZXJ0eV9zaXplKTsKLQlpZighZG1hX3dpbmRvdykgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQluZXdUY2VUYWJsZSA9IChzdHJ1Y3QgaW9tbXVfdGFibGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGlvbW11X3RhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0KLQkvKiAgVGhlcmUgc2hvdWxkIGJlIHNvbWUgY29kZSB0byBleHRyYWN0IHRoZSBwaHlzLWVuY29kZWQgb2Zmc2V0Ci0JCXVzaW5nIHByb21fbl9hZGRyX2NlbGxzKCkuIEhvd2V2ZXIsIGFjY29yZGluZyB0byBhIGNvbW1lbnQKLQkJb24gZWFybGllciB2ZXJzaW9ucywgaXQncyBhbHdheXMgemVybywgc28gd2UgZG9uJ3QgYm90aGVyICovCi0Jb2Zmc2V0ID0gZG1hX3dpbmRvd1sxXSA+PiAgUEFHRV9TSElGVDsKLQotCS8qIFRDRSB0YWJsZSBzaXplIC0gbWVhc3VyZWQgaW4gdGNlIGVudHJpZXMgKi8KLQluZXdUY2VUYWJsZS0+aXRfc2l6ZQkJPSBkbWFfd2luZG93WzRdID4+IFBBR0VfU0hJRlQ7Ci0JLyogb2Zmc2V0IGZvciBWSU8gc2hvdWxkIGFsd2F5cyBiZSAwICovCi0JbmV3VGNlVGFibGUtPml0X29mZnNldAkJPSBvZmZzZXQ7Ci0JbmV3VGNlVGFibGUtPml0X2J1c25vCQk9IDA7Ci0JbmV3VGNlVGFibGUtPml0X2luZGV4CQk9ICh1bnNpZ25lZCBsb25nKWRtYV93aW5kb3dbMF07Ci0JbmV3VGNlVGFibGUtPml0X3R5cGUJCT0gVENFX1ZCOwotCi0JcmV0dXJuIGlvbW11X2luaXRfdGFibGUobmV3VGNlVGFibGUpOwotfQotCi0vKioKLSAqIHZpb19yZWdpc3Rlcl9kZXZpY2Vfbm9kZTogLSBSZWdpc3RlciBhIG5ldyB2aW8gZGV2aWNlLgotICogQG9mX25vZGU6CVRoZSBPRiBub2RlIGZvciB0aGlzIGRldmljZS4KLSAqCi0gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHZpb19kZXYgc3RydWN0dXJlIGZyb20gdGhlIGRhdGEgaW4KLSAqIG9mX25vZGUgKGRldi5wbGF0Zm9ybV9kYXRhKSBhbmQgYWRkcyBpdCB0byB0aGUgbGlzdCBvZiB2aXJ0dWFsIGRldmljZXMuCi0gKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCB2aW9fZGV2IG9yIE5VTEwgaWYgbm9kZSBoYXMKLSAqIE5VTEwgZGV2aWNlX3R5cGUgb3IgY29tcGF0aWJsZSBmaWVsZHMuCi0gKi8KLXN0cnVjdCB2aW9fZGV2ICogX19kZXZpbml0IHZpb19yZWdpc3Rlcl9kZXZpY2Vfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUpCi17Ci0Jc3RydWN0IHZpb19kZXYgKnZpb2RldjsKLQl1bnNpZ25lZCBpbnQgKnVuaXRfYWRkcmVzczsKLQl1bnNpZ25lZCBpbnQgKmlycV9wOwotCi0JLyogd2UgbmVlZCB0aGUgJ2RldmljZV90eXBlJyBwcm9wZXJ0eSwgaW4gb3JkZXIgdG8gbWF0Y2ggd2l0aCBkcml2ZXJzICovCi0JaWYgKChOVUxMID09IG9mX25vZGUtPnR5cGUpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSIlczogbm9kZSAlcyBtaXNzaW5nICdkZXZpY2VfdHlwZSdcbiIsIF9fRlVOQ1RJT05fXywKLQkJCW9mX25vZGUtPm5hbWUgPyBvZl9ub2RlLT5uYW1lIDogIjx1bmtub3duPiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQl1bml0X2FkZHJlc3MgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KG9mX25vZGUsICJyZWciLCBOVUxMKTsKLQlpZiAoIXVuaXRfYWRkcmVzcykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbm9kZSAlcyBtaXNzaW5nICdyZWcnXG4iLCBfX0ZVTkNUSU9OX18sCi0JCQlvZl9ub2RlLT5uYW1lID8gb2Zfbm9kZS0+bmFtZSA6ICI8dW5rbm93bj4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogYWxsb2NhdGUgYSB2aW9fZGV2IGZvciB0aGlzIG5vZGUgKi8KLQl2aW9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdmlvX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghdmlvZGV2KSB7Ci0JCXJldHVybiBOVUxMOwotCX0KLQltZW1zZXQodmlvZGV2LCAwLCBzaXplb2Yoc3RydWN0IHZpb19kZXYpKTsKLQotCXZpb2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBvZl9ub2RlX2dldChvZl9ub2RlKTsKLQotCXZpb2Rldi0+aXJxID0gTk9fSVJROwotCWlycV9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShvZl9ub2RlLCAiaW50ZXJydXB0cyIsIE5VTEwpOwotCWlmIChpcnFfcCkgewotCQlpbnQgdmlycSA9IHZpcnRfaXJxX2NyZWF0ZV9tYXBwaW5nKCppcnFfcCk7Ci0JCWlmICh2aXJxID09IE5PX0lSUSkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gYWxsb2NhdGUgaW50ZXJydXB0ICIKLQkJCSAgICAgICAibnVtYmVyIGZvciAlc1xuIiwgb2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJfSBlbHNlCi0JCQl2aW9kZXYtPmlycSA9IGlycV9vZmZzZXRfdXAodmlycSk7Ci0JfQotCi0Jc25wcmludGYodmlvZGV2LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiV4IiwgKnVuaXRfYWRkcmVzcyk7Ci0JdmlvZGV2LT5uYW1lID0gb2Zfbm9kZS0+bmFtZTsKLQl2aW9kZXYtPnR5cGUgPSBvZl9ub2RlLT50eXBlOwotCXZpb2Rldi0+dW5pdF9hZGRyZXNzID0gKnVuaXRfYWRkcmVzczsKLQl2aW9kZXYtPmlvbW11X3RhYmxlID0gdmlvX2J1aWxkX2lvbW11X3RhYmxlKHZpb2Rldik7Ci0KLQkvKiByZWdpc3RlciB3aXRoIGdlbmVyaWMgZGV2aWNlIGZyYW1ld29yayAqLwotCWlmICh2aW9fcmVnaXN0ZXJfZGV2aWNlKHZpb2RldikgPT0gTlVMTCkgewotCQkvKiBYWFggZnJlZSBUQ0UgdGFibGUgKi8KLQkJa2ZyZWUodmlvZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWRldmljZV9jcmVhdGVfZmlsZSgmdmlvZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKLQotCXJldHVybiB2aW9kZXY7Ci19Ci1FWFBPUlRfU1lNQk9MKHZpb19yZWdpc3Rlcl9kZXZpY2Vfbm9kZSk7Ci0KLS8qKgotICogdmlvX2dldF9hdHRyaWJ1dGU6IC0gZ2V0IGF0dHJpYnV0ZSBmb3IgdmlydHVhbCBkZXZpY2UKLSAqIEB2ZGV2OglUaGUgdmlvIGRldmljZSB0byBnZXQgcHJvcGVydHkuCi0gKiBAd2hpY2g6CVRoZSBwcm9wZXJ0eS9hdHRyaWJ1dGUgdG8gYmUgZXh0cmFjdGVkLgotICogQGxlbmd0aDoJUG9pbnRlciB0byBsZW5ndGggb2YgcmV0dXJuZWQgZGF0YSBzaXplICh1bnVzZWQgaWYgTlVMTCkuCi0gKgotICogQ2FsbHMgcHJvbS5jJ3MgZ2V0X3Byb3BlcnR5KCkgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUKLSAqIGF0dHJpYnV0ZSBzcGVjaWZpZWQgYnkgdGhlIHByZXByb2Nlc3NvciBjb25zdGFudCBAd2hpY2gKLSovCi1jb25zdCB2b2lkICogdmlvX2dldF9hdHRyaWJ1dGUoc3RydWN0IHZpb19kZXYgKnZkZXYsIHZvaWQqIHdoaWNoLCBpbnQqIGxlbmd0aCkKLXsKLQlyZXR1cm4gZ2V0X3Byb3BlcnR5KHZkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCAoY2hhciopd2hpY2gsIGxlbmd0aCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHZpb19nZXRfYXR0cmlidXRlKTsKLQotLyogdmlvX2ZpbmRfbmFtZSgpIC0gaW50ZXJuYWwgYmVjYXVzZSBvbmx5IHZpby5jIGtub3dzIGhvdyB3ZSBmb3JtYXR0ZWQgdGhlCi0gKiBrb2JqZWN0IG5hbWUKLSAqIFhYWCBvbmNlIHZpb19idXNfdHlwZS5kZXZpY2VzIGlzIGFjdHVhbGx5IHVzZWQgYXMgYSBrc2V0IGluCi0gKiBkcml2ZXJzL2Jhc2UvYnVzLmMsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YKLSAqICJkZXZpY2VfZmluZChrb2JqX25hbWUsICZ2aW9fYnVzX3R5cGUpIgotICovCi1zdGF0aWMgc3RydWN0IHZpb19kZXYgKnZpb19maW5kX25hbWUoY29uc3QgY2hhciAqa29ial9uYW1lKQotewotCXN0cnVjdCBrb2JqZWN0ICpmb3VuZDsKLQotCWZvdW5kID0ga3NldF9maW5kX29iaigmZGV2aWNlc19zdWJzeXMua3NldCwga29ial9uYW1lKTsKLQlpZiAoIWZvdW5kKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiB0b192aW9fZGV2KGNvbnRhaW5lcl9vZihmb3VuZCwgc3RydWN0IGRldmljZSwga29iaikpOwotfQotCi0vKioKLSAqIHZpb19maW5kX25vZGUgLSBmaW5kIGFuIGFscmVhZHktcmVnaXN0ZXJlZCB2aW9fZGV2Ci0gKiBAdm5vZGU6IGRldmljZV9ub2RlIG9mIHRoZSB2aXJ0dWFsIGRldmljZSB3ZSdyZSBsb29raW5nIGZvcgotICovCi1zdHJ1Y3QgdmlvX2RldiAqdmlvX2ZpbmRfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKnZub2RlKQotewotCXVpbnQzMl90ICp1bml0X2FkZHJlc3M7Ci0JY2hhciBrb2JqX25hbWVbQlVTX0lEX1NJWkVdOwotCi0JLyogY29uc3RydWN0IHRoZSBrb2JqZWN0IG5hbWUgZnJvbSB0aGUgZGV2aWNlIG5vZGUgKi8KLQl1bml0X2FkZHJlc3MgPSAodWludDMyX3QgKilnZXRfcHJvcGVydHkodm5vZGUsICJyZWciLCBOVUxMKTsKLQlpZiAoIXVuaXRfYWRkcmVzcykKLQkJcmV0dXJuIE5VTEw7Ci0Jc25wcmludGYoa29ial9uYW1lLCBCVVNfSURfU0laRSwgIiV4IiwgKnVuaXRfYWRkcmVzcyk7Ci0KLQlyZXR1cm4gdmlvX2ZpbmRfbmFtZShrb2JqX25hbWUpOwotfQotRVhQT1JUX1NZTUJPTCh2aW9fZmluZF9ub2RlKTsKLQotaW50IHZpb19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgdmlvX2RldiAqZGV2KQotewotCWludCByYyA9IGhfdmlvX3NpZ25hbChkZXYtPnVuaXRfYWRkcmVzcywgVklPX0lSUV9FTkFCTEUpOwotCWlmIChyYyAhPSBIX1NVQ0NFU1MpCi0JCXByaW50ayhLRVJOX0VSUiAidmlvOiBFcnJvciAweCV4IGVuYWJsaW5nIGludGVycnVwdHNcbiIsIHJjKTsKLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MKHZpb19lbmFibGVfaW50ZXJydXB0cyk7Ci0KLWludCB2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB2aW9fZGV2ICpkZXYpCi17Ci0JaW50IHJjID0gaF92aW9fc2lnbmFsKGRldi0+dW5pdF9hZGRyZXNzLCBWSU9fSVJRX0RJU0FCTEUpOwotCWlmIChyYyAhPSBIX1NVQ0NFU1MpCi0JCXByaW50ayhLRVJOX0VSUiAidmlvOiBFcnJvciAweCV4IGRpc2FibGluZyBpbnRlcnJ1cHRzXG4iLCByYyk7Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTCh2aW9fZGlzYWJsZV9pbnRlcnJ1cHRzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCmluZGV4IDJkNjBlYTMuLmIxNGY5YjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwpAQCAtNTIyLDcgKzUyMiw3IEBACiAKIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpbnRlcnJ1cHQtY29udHJvbGxlciIpOwogCWlmICghbnApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAieGljczogbm8gSVNBIGludGVycnVwdCBjb250cm9sbGVyXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInhpY3M6IG5vIElTQSBpbnRlcnJ1cHQgY29udHJvbGxlclxuIik7CiAJCXhpY3NfaXJxXzgyNTlfY2FzY2FkZV9yZWFsID0gLTE7CiAJCXhpY3NfaXJxXzgyNTlfY2FzY2FkZSA9IC0xOwogCX0gZWxzZSB7CkBAIC02NDEsMjMgKzY0MSwyNiBAQAogCW9wcy0+Y3Bwcl9pbmZvKGNwdSwgMHgwMCk7CiAJaW9zeW5jKCk7CiAKKwkvKiBDbGVhciBJUEkgKi8KKwlvcHMtPnFpcnJfaW5mbyhjcHUsIDB4ZmYpOworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIEVPSSB0aGUgSVBJIGlmIHdlIGdvdCBoZXJlIGZyb20ga2V4ZWMgZG93biBJUEkKKwkgKgorCSAqIHByb2JhYmx5IG5lZWQgdG8gY2hlY2sgYWxsIHRoZSBvdGhlciBpbnRlcnJ1cHRzIHRvbworCSAqIHNob3VsZCB3ZSBiZSBmbGFnZ2luZyBpZGxlIGxvb3AgaW5zdGVhZD8KKwkgKiBvciBjcmVhdGluZyBzb21lIHRhc2sgdG8gYmUgc2NoZWR1bGVkPworCSAqLworCW9wcy0+eGlycl9pbmZvX3NldChjcHUsIFhJQ1NfSVBJKTsKKwogCS8qCiAJICogU29tZSBtYWNoaW5lcyBuZWVkIHRvIGhhdmUgYXQgbGVhc3Qgb25lIGNwdSBpbiB0aGUgR0lRLAogCSAqIHNvIGxlYXZlIHRoZSBtYXN0ZXIgY3B1IGluIHRoZSBncm91cC4KIAkgKi8KLQlpZiAoc2Vjb25kYXJ5KSB7Ci0JCS8qCi0JCSAqIHdlIG5lZWQgdG8gRU9JIHRoZSBJUEkgaWYgd2UgZ290IGhlcmUgZnJvbSBrZXhlYyBkb3duIElQSQotCQkgKgotCQkgKiBwcm9iYWJseSBuZWVkIHRvIGNoZWNrIGFsbCB0aGUgb3RoZXIgaW50ZXJydXB0cyB0b28KLQkJICogc2hvdWxkIHdlIGJlIGZsYWdnaW5nIGlkbGUgbG9vcCBpbnN0ZWFkPwotCQkgKiBvciBjcmVhdGluZyBzb21lIHRhc2sgdG8gYmUgc2NoZWR1bGVkPwotCQkgKi8KLQkJb3BzLT54aXJyX2luZm9fc2V0KGNwdSwgWElDU19JUEkpOworCWlmIChzZWNvbmRhcnkpCiAJCXJ0YXNfc2V0X2luZGljYXRvcihHTE9CQUxfSU5URVJSVVBUX1FVRVVFLAogCQkJKDFVTCA8PCBpbnRlcnJ1cHRfc2VydmVyX3NpemUpIC0gMSAtCiAJCQlkZWZhdWx0X2Rpc3RyaWJfc2VydmVyLCAwKTsKLQl9CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCmluZGV4IDRjMmIzNTYuLmNlZjk1YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQpAQCAtMSwzICsxLDcgQEAKK2lmZXEgKCQoQ09ORklHX1BQQzY0KSx5KQorRVhUUkFfQ0ZMQUdTCQkJKz0gLW1uby1taW5pbWFsLXRvYworZW5kaWYKKwogb2JqLSQoQ09ORklHX01QSUMpCQkrPSBtcGljLm8KIG9iai0kKENPTkZJR19QUENfSU5ESVJFQ1RfUENJKQkrPSBpbmRpcmVjdF9wY2kubwogb2JqLSQoQ09ORklHX1BQQ19JODI1OSkJCSs9IGk4MjU5Lm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZGFydF9pb21tdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKaW5kZXggMzgwODdiZC4uNjIzMjA5MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9kYXJ0X2lvbW11LmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCWlvbW11X3RhYmxlX2RhcnQuaXRfYmFzZSA9ICh1bnNpZ25lZCBsb25nKWRhcnRfdmJhc2U7CiAJaW9tbXVfdGFibGVfZGFydC5pdF9pbmRleCA9IDA7CiAJaW9tbXVfdGFibGVfZGFydC5pdF9ibG9ja3NpemUgPSAxOwotCWlvbW11X2luaXRfdGFibGUoJmlvbW11X3RhYmxlX2RhcnQpOworCWlvbW11X2luaXRfdGFibGUoJmlvbW11X3RhYmxlX2RhcnQsIC0xKTsKIAogCS8qIFJlc2VydmUgdGhlIGxhc3QgcGFnZSBvZiB0aGUgREFSVCB0byBhdm9pZCBwb3NzaWJsZSBwcmVmZXRjaAogCSAqIHBhc3QgdGhlIERBUlQgbWFwcGVkIGFyZWEKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKaW5kZXggN2RjZGZjYi4uYmZmZTUwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMKQEAgLTgyOSw3ICs4MjksMjcgQEAKIAltcGljX2NwdV93cml0ZShNUElDX0NQVV9DVVJSRU5UX1RBU0tfUFJJLCAwKTsKIH0KIAordm9pZCBfX2luaXQgbXBpY19zZXRfY2xrX3JhdGlvKHN0cnVjdCBtcGljICptcGljLCB1MzIgY2xvY2tfcmF0aW8pCit7CisJdTMyIHY7CiAKKwl2ID0gbXBpY19yZWFkKG1waWMtPmdyZWdzLCBNUElDX0dSRUdfR0xPQkFMX0NPTkZfMSk7CisJdiAmPSB+TVBJQ19HUkVHX0dMT0JBTF9DT05GXzFfQ0xLX1JBVElPX01BU0s7CisJdiB8PSBNUElDX0dSRUdfR0xPQkFMX0NPTkZfMV9DTEtfUkFUSU8oY2xvY2tfcmF0aW8pOworCW1waWNfd3JpdGUobXBpYy0+Z3JlZ3MsIE1QSUNfR1JFR19HTE9CQUxfQ09ORl8xLCB2KTsKK30KKwordm9pZCBfX2luaXQgbXBpY19zZXRfc2VyaWFsX2ludChzdHJ1Y3QgbXBpYyAqbXBpYywgaW50IGVuYWJsZSkKK3sKKwl1MzIgdjsKKworCXYgPSBtcGljX3JlYWQobXBpYy0+Z3JlZ3MsIE1QSUNfR1JFR19HTE9CQUxfQ09ORl8xKTsKKwlpZiAoZW5hYmxlKQorCQl2IHw9IE1QSUNfR1JFR19HTE9CQUxfQ09ORl8xX1NJRTsKKwllbHNlCisJCXYgJj0gfk1QSUNfR1JFR19HTE9CQUxfQ09ORl8xX1NJRTsKKwltcGljX3dyaXRlKG1waWMtPmdyZWdzLCBNUElDX0dSRUdfR0xPQkFMX0NPTkZfMSwgdik7Cit9CiAKIHZvaWQgbXBpY19pcnFfc2V0X3ByaW9yaXR5KHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBwcmkpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggNDczNWI0MS4uMDc0MWRmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMjYsOSArMjYsNiBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20veG1vbi5oPgotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KLSNlbmRpZgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL0tjb25maWcgYi9hcmNoL3BwYy9LY29uZmlnCmluZGV4IGU5YThmNWQuLmI1NWRlNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL0tjb25maWcKKysrIGIvYXJjaC9wcGMvS2NvbmZpZwpAQCAtNDAsNiArNDAsMTAgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBHRU5FUklDX0ZJTkRfTkVYVF9CSVQKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBTQ0hFRF9OT19OT19PTUlUX0ZSQU1FX1BPSU5URVIKIAlib29sCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3BwYy9ib290L2xpYi9NYWtlZmlsZSBiL2FyY2gvcHBjL2Jvb3QvbGliL01ha2VmaWxlCmluZGV4IDgwYzg0ZDUuLjJmOTk1ZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2Jvb3QvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcHBjL2Jvb3QvbGliL01ha2VmaWxlCkBAIC01LDcgKzUsNyBAQAogQ0ZMQUdTX2tiZC5vCTo9IC1JZHJpdmVycy9jaGFyCiBDRkxBR1NfdnJlc2V0Lm8gOj0gLUlhcmNoL3BwYy9ib290L2luY2x1ZGUKIAotemxpYiAgOj0gaW5mYmxvY2suYyBpbmZjb2Rlcy5jIGluZmZhc3QuYyBpbmZsYXRlLmMgaW5mdHJlZXMuYyBpbmZ1dGlsLmMKK3psaWIgIDo9IGluZmZhc3QuYyBpbmZsYXRlLmMgaW5mdHJlZXMuYwogCSAKIGxpYi15ICs9ICQoemxpYjouYz0ubykgZGl2NjQubwogbGliLSQoQ09ORklHX1ZHQV9DT05TT0xFKSArPSB2cmVzZXQubyBrYmQubwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMva2VybmVsL3BjaS5jIGIvYXJjaC9wcGMva2VybmVsL3BjaS5jCmluZGV4IDgwOTY3M2EuLmQyMGFjY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3BwYy9rZXJuZWwvcGNpLmMKQEAgLTEwMzIsNyArMTAzMiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJdm1hLT52bV9wZ29mZiA9IG9mZnNldCA+PiBQQUdFX1NISUZUOwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCBycCwKIAkJCQkJCSAgdm1hLT52bV9wYWdlX3Byb3QsCiAJCQkJCQkgIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvbW0vaW5pdC5jIGIvYXJjaC9wcGMvbW0vaW5pdC5jCmluZGV4IDM4NmUwMDAuLmM5YmQxODQgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL2luaXQuYworKysgYi9hcmNoL3BwYy9tbS9pbml0LmMKQEAgLTU4Myw3ICs1ODMsNyBAQAogCQltbSA9IChhZGRyZXNzIDwgVEFTS19TSVpFKT8gdm1hLT52bV9tbTogJmluaXRfbW07CiAJCXBtZCA9IHBtZF9vZmZzZXQocGdkX29mZnNldChtbSwgYWRkcmVzcyksIGFkZHJlc3MpOwogCQlpZiAoIXBtZF9ub25lKCpwbWQpKQotCQkJYWRkX2hhc2hfcGFnZShtbS0+Y29udGV4dCwgYWRkcmVzcywgcG1kX3ZhbCgqcG1kKSk7CisJCQlhZGRfaGFzaF9wYWdlKG1tLT5jb250ZXh0LmlkLCBhZGRyZXNzLCBwbWRfdmFsKCpwbWQpKTsKIAl9CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL21tdV9jb250ZXh0LmMgYi9hcmNoL3BwYy9tbS9tbXVfY29udGV4dC5jCmluZGV4IGI0YTRiM2YuLjg3ODRmMzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL21tL21tdV9jb250ZXh0LmMKKysrIGIvYXJjaC9wcGMvbW0vbW11X2NvbnRleHQuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogCi1tbV9jb250ZXh0X3QgbmV4dF9tbXVfY29udGV4dDsKK3Vuc2lnbmVkIGxvbmcgbmV4dF9tbXVfY29udGV4dDsKIHVuc2lnbmVkIGxvbmcgY29udGV4dF9tYXBbTEFTVF9DT05URVhUIC8gQklUU19QRVJfTE9ORyArIDFdOwogI2lmZGVmIEZFV19DT05URVhUUwogYXRvbWljX3QgbnJfZnJlZV9jb250ZXh0czsKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL21tL3RsYi5jIGIvYXJjaC9wcGMvbW0vdGxiLmMKaW5kZXggNmMzZGMzYy4uNjA2YjAyMyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvbW0vdGxiLmMKKysrIGIvYXJjaC9wcGMvbW0vdGxiLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCWlmIChIYXNoICE9IDApIHsKIAkJcHRlcGh5cyA9IF9fcGEocHRlcCkgJiBQQUdFX01BU0s7Ci0JCWZsdXNoX2hhc2hfcGFnZXMobW0tPmNvbnRleHQsIGFkZHIsIHB0ZXBoeXMsIDEpOworCQlmbHVzaF9oYXNoX3BhZ2VzKG1tLT5jb250ZXh0LmlkLCBhZGRyLCBwdGVwaHlzLCAxKTsKIAl9CiB9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogCXBtZF90ICpwbWQ7CiAJdW5zaWduZWQgbG9uZyBwbWRfZW5kOwogCWludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgY3R4ID0gbW0tPmNvbnRleHQ7CisJdW5zaWduZWQgaW50IGN0eCA9IG1tLT5jb250ZXh0LmlkOwogCiAJaWYgKEhhc2ggPT0gMCkgewogCQlfdGxiaWEoKTsKQEAgLTE2Niw3ICsxNjYsNyBAQAogCW1tID0gKHZtYWRkciA8IFRBU0tfU0laRSk/IHZtYS0+dm1fbW06ICZpbml0X21tOwogCXBtZCA9IHBtZF9vZmZzZXQocGdkX29mZnNldChtbSwgdm1hZGRyKSwgdm1hZGRyKTsKIAlpZiAoIXBtZF9ub25lKCpwbWQpKQotCQlmbHVzaF9oYXNoX3BhZ2VzKG1tLT5jb250ZXh0LCB2bWFkZHIsIHBtZF92YWwoKnBtZCksIDEpOworCQlmbHVzaF9oYXNoX3BhZ2VzKG1tLT5jb250ZXh0LmlkLCB2bWFkZHIsIHBtZF92YWwoKnBtZCksIDEpOwogCUZJTklTSF9GTFVTSDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9LY29uZmlnCmluZGV4IDE3NGRkYmMuLjI5M2JkNDggMTAwNjQ0Ci0tLSBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvS2NvbmZpZworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvNHh4L0tjb25maWcKQEAgLTE4Myw3ICsxODMsNyBAQAogCiBjb25maWcgQklPU19GSVhVUAogCWJvb2wKLQlkZXBlbmRzIG9uIEJVQklOR0EgfHwgRVA0MDUgfHwgU1lDQU1PUkUgfHwgV0FMTlVUCisJZGVwZW5kcyBvbiBCVUJJTkdBIHx8IEVQNDA1IHx8IFNZQ0FNT1JFIHx8IFdBTE5VVCB8fCBDUENJNDA1CiAJZGVmYXVsdCB5CiAKICMgT0FLIGRvZXNuJ3QgZXhpc3QgYnV0IHdhbnRlZCB0byBrZWVwIHRoaXMgYXJvdW5kIGZvciBhbnkgZnV0dXJlIDQwM0dDWCBib2FyZHMKZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5jIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKaW5kZXggNjU3MWUzOS4uOTcwYjY5OCAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmMKQEAgLTEsMTAgKzEsMTIgQEAKIC8qCiAgKiBCb2FyZCBzZXR1cCByb3V0aW5lcyBmb3IgdGhlIGVzZCBDUENJLTQwNSBjUENJIEJvYXJkLgogICoKLSAqIEF1dGhvcjogU3RlZmFuIFJvZXNlCi0gKiAgICAgICAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCisgKiBDb3B5cmlnaHQgMjAwMS0yMDA2IGVzZCBlbGVjdHJvbmljIHN5c3RlbSBkZXNpZ24gLSBoYW5ub3ZlciBnZXJtYW55CiAgKgotICogQ29weXJpZ2h0IDIwMDEgZXNkIGVsZWN0cm9uaWMgc3lzdGVtIGRlc2lnbiAtIGhhbm5vdmVyIGdlcm1hbnkKKyAqIEF1dGhvcnM6IE1hdHRoaWFzIEZ1Y2hzCisgKiAgICAgICAgICBtYXR0aGlhcy5mdWNoc0Blc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICBTdGVmYW4gUm9lc2UKKyAqICAgICAgICAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKQEAgLTIwLDkgKzIyLDE3IEBACiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS90b2RjLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KICNpbmNsdWRlIDxhc20vb2NwLmg+CisjaW5jbHVkZSA8YXNtL2libV9vY3BfcGNpLmg+CisjaW5jbHVkZSA8cGxhdGZvcm1zLzR4eC9pYm00MDVncC5oPgogCisjaWZkZWYgQ09ORklHX0dFTl9SVEMKIHZvaWQgKmNwY2k0MDVfbnZyYW07CisjZW5kaWYKKworZXh0ZXJuIGJkX3QgX19yZXM7CiAKIC8qCiAgKiBTb21lIElSUXMgdW5pcXVlIHRvIENQQ0ktNDA1LgpAQCAtMzYsMTggKzQ2LDY5IEBACiAJICogICAgICBBICAgICAgIEIgICAgICAgQyAgICAgICBECiAJICovCiAJewotCQl7MjgsCTI4LAkyOCwJMjh9LAkvKiBJRFNFTCAxNSAtIGNQQ0kgc2xvdCA4ICovCi0JCXsyOSwJMjksCTI5LAkyOX0sCS8qIElEU0VMIDE2IC0gY1BDSSBzbG90IDcgKi8KLQkJezMwLAkzMCwJMzAsCTMwfSwJLyogSURTRUwgMTcgLSBjUENJIHNsb3QgNiAqLwotCQl7MjcsCTI3LAkyNywJMjd9LAkvKiBJRFNFTCAxOCAtIGNQQ0kgc2xvdCA1ICovCi0JCXsyOCwJMjgsCTI4LAkyOH0sCS8qIElEU0VMIDE5IC0gY1BDSSBzbG90IDQgKi8KLQkJezI5LAkyOSwJMjksCTI5fSwJLyogSURTRUwgMjAgLSBjUENJIHNsb3QgMyAqLwotCQl7MzAsCTMwLAkzMCwJMzB9LAkvKiBJRFNFTCAyMSAtIGNQQ0kgc2xvdCAyICovCisJCXsyOCwJMjksCTMwLAkyN30sCS8qIElEU0VMIDE1IC0gY1BDSSBzbG90IDggKi8KKwkJezI5LAkzMCwJMjcsCTI4fSwJLyogSURTRUwgMTYgLSBjUENJIHNsb3QgNyAqLworCQl7MzAsCTI3LAkyOCwJMjl9LAkvKiBJRFNFTCAxNyAtIGNQQ0kgc2xvdCA2ICovCisJCXsyNywJMjgsCTI5LAkzMH0sCS8qIElEU0VMIDE4IC0gY1BDSSBzbG90IDUgKi8KKwkJezI4LAkyOSwJMzAsCTI3fSwJLyogSURTRUwgMTkgLSBjUENJIHNsb3QgNCAqLworCQl7MjksCTMwLAkyNywJMjh9LAkvKiBJRFNFTCAyMCAtIGNQQ0kgc2xvdCAzICovCisJCXszMCwJMjcsCTI4LAkyOX0sCS8qIElEU0VMIDIxIC0gY1BDSSBzbG90IDIgKi8KICAgICAgICAgfTsKIAljb25zdCBsb25nIG1pbl9pZHNlbCA9IDE1LCBtYXhfaWRzZWwgPSAyMSwgaXJxc19wZXJfc2xvdCA9IDQ7CiAJcmV0dXJuIFBDSV9JUlFfVEFCTEVfTE9PS1VQOwogfTsKIAorLyogVGhlIHNlcmlhbCBjbG9jayBmb3IgdGhlIGNoaXAgaXMgYW4gaW50ZXJuYWwgY2xvY2sgZGV0ZXJtaW5lZCBieQorICogZGlmZmVyZW50IGNsb2NrIHNwZWVkcy9kaXZpZGVycy4KKyAqIENhbGN1bGF0ZSB0aGUgcHJvcGVyIGlucHV0IGJhdWQgcmF0ZSBhbmQgc2V0dXAgdGhlIHNlcmlhbCBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorY3BjaTQwNV9lYXJseV9zZXJpYWxfbWFwKHZvaWQpCit7CisJdTMyIHVhcnRfZGl2OworCWludCB1YXJ0X2Nsb2NrOworCXN0cnVjdCB1YXJ0X3BvcnQgcG9ydDsKKworICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBzZXJpYWwgY2xvY2sgaW5wdXQgZnJlcXVlbmN5CisgICAgICAgICAgKgorICAgICAgICAgICogVGhlIHVhcnQgY2xvY2sgaXMgdGhlIGNwdSBmcmVxdWVuY3kgKHByb3ZpZGVkIGluIHRoZSBib2FyZCBpbmZvCisgICAgICAgICAgKiBzdHJ1Y3R1cmUpIGRpdmlkZWQgYnkgdGhlIGV4dGVybmFsIFVBUlQgRGl2aXNvci4KKyAgICAgICAgICAqLworCXVhcnRfZGl2ID0gKChtZmRjcihEQ1JOX0NIQ1JfQkFTRSkgJiBDSFIwX1VESVYpID4+IDEpICsgMTsKKwl1YXJ0X2Nsb2NrID0gX19yZXMuYmlfcHJvY2ZyZXEgLyB1YXJ0X2RpdjsKKworCS8qIFNldHVwIHNlcmlhbCBwb3J0IGFjY2VzcyAqLworCW1lbXNldCgmcG9ydCwgMCwgc2l6ZW9mKHBvcnQpKTsKKyNpZiBkZWZpbmVkKENPTkZJR19VQVJUMF9UVFlTMCkKKwlwb3J0Lm1lbWJhc2UgPSAodm9pZCopVUFSVDBfSU9fQkFTRTsKKwlwb3J0LmlycSA9IFVBUlQwX0lOVDsKKyNlbHNlCisJcG9ydC5tZW1iYXNlID0gKHZvaWQqKVVBUlQxX0lPX0JBU0U7CisJcG9ydC5pcnEgPSBVQVJUMV9JTlQ7CisjZW5kaWYKKwlwb3J0LnVhcnRjbGsgPSB1YXJ0X2Nsb2NrOworCXBvcnQucmVnc2hpZnQgPSAwOworCXBvcnQuaW90eXBlID0gVVBJT19NRU07CisJcG9ydC5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GIHwgVVBGX1NLSVBfVEVTVDsKKwlwb3J0LmxpbmUgPSAwOworCisJaWYgKGVhcmx5X3NlcmlhbF9zZXR1cCgmcG9ydCkgIT0gMCkgeworCQlwcmludGsoIkVhcmx5IHNlcmlhbCBpbml0IG9mIHBvcnQgMCBmYWlsZWRcbiIpOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19VQVJUMF9UVFlTMCkKKwlwb3J0Lm1lbWJhc2UgPSAodm9pZCopVUFSVDFfSU9fQkFTRTsKKwlwb3J0LmlycSA9IFVBUlQxX0lOVDsKKyNlbHNlCisJcG9ydC5tZW1iYXNlID0gKHZvaWQqKVVBUlQwX0lPX0JBU0U7CisJcG9ydC5pcnEgPSBVQVJUMF9JTlQ7CisjZW5kaWYKKwlwb3J0LmxpbmUgPSAxOworCisJaWYgKGVhcmx5X3NlcmlhbF9zZXR1cCgmcG9ydCkgIT0gMCkgeworCQlwcmludGsoIkVhcmx5IHNlcmlhbCBpbml0IG9mIHBvcnQgMSBmYWlsZWRcbiIpOworCX0KK30KKwogdm9pZCBfX2luaXQKIGNwY2k0MDVfc2V0dXBfYXJjaCh2b2lkKQogewpAQCAtNTUsMTQgKzExNiw2OCBAQAogCiAJaWJtX29jcF9zZXRfZW1hYygwLCAwKTsKIAotCVRPRENfSU5JVChUT0RDX1RZUEVfTUs0OFQzNSwgY3BjaTQwNV9udnJhbSwgY3BjaTQwNV9udnJhbSwgY3BjaTQwNV9udnJhbSwgOCk7CisgICAgICAgIGNwY2k0MDVfZWFybHlfc2VyaWFsX21hcCgpOworCisjaWZkZWYgQ09ORklHX0dFTl9SVEMKKwlUT0RDX0lOSVQoVE9EQ19UWVBFX01LNDhUMzUsCisJCSAgY3BjaTQwNV9udnJhbSwgY3BjaTQwNV9udnJhbSwgY3BjaTQwNV9udnJhbSwgOCk7CisjZW5kaWYKK30KKwordm9pZCBfX2luaXQKK2Jpb3NfZml4dXAoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLCBzdHJ1Y3QgcGNpbDBfcmVncyAqcGNpcCkKK3sKKwl1bnNpZ25lZCBpbnQgYmFyX3Jlc3BvbnNlLCBiYXI7CisKKwkvKiBEaXNhYmxlIHJlZ2lvbiBmaXJzdCAqLworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzBdLm1hKSwgMHgwMDAwMDAwMCk7CisJLyogUExCIHN0YXJ0aW5nIGFkZHIsIFBDSTogMHg4MDAwMDAwMCAqLworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzBdLmxhKSwgMHg4MDAwMDAwMCk7CisJLyogUENJIHN0YXJ0IGFkZHIsIDB4ODAwMDAwMDAgKi8KKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5wY2lsYSksIFBQQzQwNV9QQ0lfTUVNX0JBU0UpOworCS8qIDUxMk1CIHJhbmdlIG9mIFBMQiB0byBQQ0kgKi8KKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5wY2loYSksIDB4MDAwMDAwMDApOworCS8qIEVuYWJsZSBubyBwcmUtZmV0Y2gsIGVuYWJsZSByZWdpb24gKi8KKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVswXS5tYSksICgoMHhmZmZmZmZmZiAtCisJCQkJCQkoUFBDNDA1X1BDSV9VUFBFUl9NRU0gLQorCQkJCQkJIFBQQzQwNV9QQ0lfTUVNX0JBU0UpKSB8IDB4MDEpKTsKKworCS8qIERpc2FibGUgcmVnaW9uIG9uZSAqLworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzFdLm1hKSwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMV0ubGEpLCAweDAwMDAwMDAwKTsKKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVsxXS5wY2lsYSksIDB4MDAwMDAwMDApOworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzFdLnBjaWhhKSwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMV0ubWEpLCAweDAwMDAwMDAwKTsKKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnB0bTFtcyksIDB4MDAwMDAwMDEpOworCisJLyogRGlzYWJsZSByZWdpb24gdHdvICovCisJb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMl0ubWEpLCAweDAwMDAwMDAwKTsKKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVsyXS5sYSksIDB4MDAwMDAwMDApOworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cG1tWzJdLnBjaWxhKSwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wbW1bMl0ucGNpaGEpLCAweDAwMDAwMDAwKTsKKwlvdXRfbGUzMigodm9pZCAqKSAmKHBjaXAtPnBtbVsyXS5tYSksIDB4MDAwMDAwMDApOworCW91dF9sZTMyKCh2b2lkICopICYocGNpcC0+cHRtMm1zKSwgMHgwMDAwMDAwMCk7CisJb3V0X2xlMzIoKHZvaWQgKikgJihwY2lwLT5wdG0ybGEpLCAweDAwMDAwMDAwKTsKKworCS8qIFplcm8gY29uZmlnIGJhcnMgKi8KKwlmb3IgKGJhciA9IFBDSV9CQVNFX0FERFJFU1NfMTsgYmFyIDw9IFBDSV9CQVNFX0FERFJFU1NfMjsgYmFyICs9IDQpIHsKKwkJZWFybHlfd3JpdGVfY29uZmlnX2R3b3JkKGhvc2UsIGhvc2UtPmZpcnN0X2J1c25vLAorCQkJCQkgUENJX0ZVTkMoaG9zZS0+Zmlyc3RfYnVzbm8pLCBiYXIsCisJCQkJCSAweDAwMDAwMDAwKTsKKwkJZWFybHlfcmVhZF9jb25maWdfZHdvcmQoaG9zZSwgaG9zZS0+Zmlyc3RfYnVzbm8sCisJCQkJCVBDSV9GVU5DKGhvc2UtPmZpcnN0X2J1c25vKSwgYmFyLAorCQkJCQkmYmFyX3Jlc3BvbnNlKTsKKwl9CiB9CiAKIHZvaWQgX19pbml0CiBjcGNpNDA1X21hcF9pbyh2b2lkKQogewogCXBwYzR4eF9tYXBfaW8oKTsKKworI2lmZGVmIENPTkZJR19HRU5fUlRDCiAJY3BjaTQwNV9udnJhbSA9IGlvcmVtYXAoQ1BDSTQwNV9OVlJBTV9QQUREUiwgQ1BDSTQwNV9OVlJBTV9TSVpFKTsKKyNlbmRpZgogfQogCiB2b2lkIF9faW5pdApAQCAtNzQsOSArMTg5LDExIEBACiAJcHBjX21kLnNldHVwX2FyY2ggPSBjcGNpNDA1X3NldHVwX2FyY2g7CiAJcHBjX21kLnNldHVwX2lvX21hcHBpbmdzID0gY3BjaTQwNV9tYXBfaW87CiAKKyNpZmRlZiBDT05GSUdfR0VOX1JUQwogCXBwY19tZC50aW1lX2luaXQgPSB0b2RjX3RpbWVfaW5pdDsKIAlwcGNfbWQuc2V0X3J0Y190aW1lID0gdG9kY19zZXRfcnRjX3RpbWU7CiAJcHBjX21kLmdldF9ydGNfdGltZSA9IHRvZGNfZ2V0X3J0Y190aW1lOwogCXBwY19tZC5udnJhbV9yZWFkX3ZhbCA9IHRvZGNfZGlyZWN0X3JlYWRfdmFsOwogCXBwY19tZC5udnJhbV93cml0ZV92YWwgPSB0b2RjX2RpcmVjdF93cml0ZV92YWw7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcHBjL3BsYXRmb3Jtcy80eHgvY3BjaTQwNS5oIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmgKaW5kZXggZTI3ZjdjYi4uZjVhNWMwYyAxMDA2NDQKLS0tIGEvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmgKKysrIGIvYXJjaC9wcGMvcGxhdGZvcm1zLzR4eC9jcGNpNDA1LmgKQEAgLTEsMzcgKzEsMjkgQEAKIC8qCiAgKiBDUENJLTQwNSBib2FyZCBzcGVjaWZpYyBkZWZpbml0aW9ucwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBTdGVmYW4gUm9lc2UgKHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tKQorICogQ29weXJpZ2h0IDIwMDEtMjAwNiBlc2QgZWxlY3Ryb25pYyBzeXN0ZW0gZGVzaWduIC0gaGFubm92ZXIgZ2VybWFueQorICoKKyAqIEF1dGhvcnM6IE1hdHRoaWFzIEZ1Y2hzCisgKiAgICAgICAgICBtYXR0aGlhcy5mdWNoc0Blc2QtZWxlY3Ryb25pY3MuY29tCisgKiAgICAgICAgICBTdGVmYW4gUm9lc2UKKyAqICAgICAgICAgIHN0ZWZhbi5yb2VzZUBlc2QtZWxlY3Ryb25pY3MuY29tCiAgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpZm5kZWYgX19BU01fQ1BDSTQwNV9IX18KLSNkZWZpbmUgX19BU01fQ1BDSTQwNV9IX18KKyNpZm5kZWYgX19DUENJNDA1X0hfXworI2RlZmluZSBfX0NQQ0k0MDVfSF9fCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLQotLyogV2UgaGF2ZSBhIDQwNUdQIGNvcmUgKi8KICNpbmNsdWRlIDxwbGF0Zm9ybXMvNHh4L2libTQwNWdwLmg+Ci0KICNpbmNsdWRlIDxhc20vcHBjYm9vdC5oPgogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotLyogU29tZSA0eHggcGFydHMgdXNlIGEgZGlmZmVyZW50IHRpbWViYXNlIGZyZXF1ZW5jeSBmcm9tIHRoZSBpbnRlcm5hbCBjbG9jay4KLSovCi0jZGVmaW5lIGJpX3RiZnJlcSBiaV9pbnRmcmVxCi0KIC8qIE1hcCBmb3IgdGhlIE5WUkFNIHNwYWNlICovCiAjZGVmaW5lIENQQ0k0MDVfTlZSQU1fUEFERFIJKCh1aW50KTB4ZjAyMDAwMDApCiAjZGVmaW5lIENQQ0k0MDVfTlZSQU1fU0laRQkoKHVpbnQpMzIqMTAyNCkKIAotI2lmZGVmIENPTkZJR19QUEM0MDVHUF9JTlRFUk5BTF9DTE9DSwotI2RlZmluZSBCQVNFX0JBVUQJCTIwMTYwMAotI2Vsc2UKLSNkZWZpbmUgQkFTRV9CQVVECQk2OTEyMDAKLSNlbmRpZgorI2RlZmluZSBCQVNFX0JBVUQJCTAKIAotI2RlZmluZSBQUEM0eHhfTUFDSElORV9OQU1FICJlc2QgQ1BDSS00MDUiCisjZGVmaW5lIFBQQzR4eF9NQUNISU5FX05BTUUgICAgICJlc2QgQ1BDSS00MDUiCiAKLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0jZW5kaWYJLyogX19BU01fQ1BDSTQwNV9IX18gKi8KKyNlbmRpZgkvKiBfX0NQQ0k0MDVfSF9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wcGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHNfY29tbW9uLmMgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwppbmRleCBjOWUwYWVlLi40MzY4ZGMzIDEwMDY0NAotLS0gYS9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYworKysgYi9hcmNoL3BwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkc19jb21tb24uYwpAQCAtMzc5LDEzICszNzksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMiwgTlVMTCkpKSB7CiAgICAgICAgICAgICAgICAgZGV2LT5pcnEgPSAxMDsKICAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDEwKTsKLQkJcGNpX2Rldl9wdXQoZGV2KTsKLSAgICAgICAgfQogCi0JaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKKwkJaWYgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1ODZfMiwgZGV2KSkpIHsKLSAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDExOwotICAgICAgICAgICAgICAgIHBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfTElORSwgMTEpOworCSAgICAgICAgICAgICAgICBkZXYtPmlycSA9IDExOworCSAgICAgICAgICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX0xJTkUsIDExKTsKKwkJfQogCQlwY2lfZGV2X3B1dChkZXYpOwogICAgICAgICB9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDAxYzVjMDguLjgyMWExNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC00NDYsNiArNDQ2LDE0IEBACiAJICBUaGUgSFogdGltZXIgaXMgc3dpdGNoZWQgb2ZmIGluIGlkbGUgYnkgZGVmYXVsdC4gVGhhdCBtZWFucyB0aGUKIAkgIEhaIHRpbWVyIGlzIGFscmVhZHkgZGlzYWJsZWQgYXQgYm9vdCB0aW1lLgogCitjb25maWcgUzM5MF9IWVBGU19GUworCWJvb2wgInMzOTAgaHlwZXJ2aXNvciBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCXNlbGVjdCBTWVNfSFlQRVJWSVNPUgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgaXMgYSB2aXJ0dWFsIGZpbGUgc3lzdGVtIGludGVuZGVkIHRvIHByb3ZpZGUgYWNjb3VudGluZworCSAgaW5mb3JtYXRpb24gaW4gYW4gczM5MCBoeXBlcnZpc29yIGVudmlyb25tZW50LgorCiBjb25maWcgS0VYRUMKIAlib29sICJrZXhlYyBzeXN0ZW0gY2FsbCAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IDdiYjE2ZmIuLmIzNzkxZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvTWFrZWZpbGUKQEAgLTc2LDcgKzc2LDcgQEAKIGhlYWQteQkJOj0gYXJjaC8kKEFSQ0gpL2tlcm5lbC9oZWFkLm8gYXJjaC8kKEFSQ0gpL2tlcm5lbC9pbml0X3Rhc2subwogCiBjb3JlLXkJCSs9IGFyY2gvJChBUkNIKS9tbS8gYXJjaC8kKEFSQ0gpL2tlcm5lbC8gYXJjaC8kKEFSQ0gpL2NyeXB0by8gXAotCQkgICBhcmNoLyQoQVJDSCkvYXBwbGRhdGEvCisJCSAgIGFyY2gvJChBUkNIKS9hcHBsZGF0YS8gYXJjaC8kKEFSQ0gpL2h5cGZzLwogbGlicy15CQkrPSBhcmNoLyQoQVJDSCkvbGliLwogZHJpdmVycy15CSs9IGRyaXZlcnMvczM5MC8KIGRyaXZlcnMtJChDT05GSUdfTUFUSEVNVSkgKz0gYXJjaC8kKEFSQ0gpL21hdGgtZW11LwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2h5cGZzL01ha2VmaWxlIGIvYXJjaC9zMzkwL2h5cGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjAwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvaHlwZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggaHlwZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1MzOTBfSFlQRlNfRlMpICs9IHMzOTBfaHlwZnMubworCitzMzkwX2h5cGZzLW9ianMgOj0gaW5vZGUubyBoeXBmc19kaWFnLm8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9oeXBmcy9oeXBmcy5oIGIvYXJjaC9zMzkwL2h5cGZzL2h5cGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9oeXBmcy9oeXBmcy5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiAgZnMvaHlwZnMvaHlwZnMuaAorICogICAgSHlwZXJ2aXNvciBmaWxlc3lzdGVtIGZvciBMaW51eCBvbiBzMzkwLgorICoKKyAqICAgIENvcHlyaWdodCAoQykgSUJNIENvcnAuIDIwMDYKKyAqICAgIEF1dGhvcihzKTogTWljaGFlbCBIb2x6aGV1IDxob2x6aGV1QGRlLmlibS5jb20+CisgKi8KKworI2lmbmRlZiBfSFlQRlNfSF8KKyNkZWZpbmUgX0hZUEZTX0hfCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgUkVHX0ZJTEVfTU9ERSAgICAwNDQwCisjZGVmaW5lIFVQREFURV9GSUxFX01PREUgMDIyMAorI2RlZmluZSBESVJfTU9ERSAgICAgICAgIDA1NTAKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmh5cGZzX21rZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqaHlwZnNfY3JlYXRlX3U2NChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIF9fdTY0IHZhbHVlKTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmh5cGZzX2NyZWF0ZV9zdHIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGlyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgICAgICBjaGFyICpzdHJpbmcpOworCisjZW5kaWYgLyogX0hZUEZTX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZy5jIGIvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX2RpYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmE3NGFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX2RpYWcuYwpAQCAtMCwwICsxLDY5NiBAQAorLyoKKyAqICBmcy9oeXBmcy9oeXBmc19kaWFnLmMKKyAqICAgIEh5cGVydmlzb3IgZmlsZXN5c3RlbSBmb3IgTGludXggb24gczM5MC4gRGlhZyAyMDQgYW5kIDIyNAorICogICAgaW1wbGVtZW50YXRpb24uCisgKgorICogICAgQ29weXJpZ2h0IChDKSBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxhc20vZWJjZGljLmg+CisjaW5jbHVkZSAiaHlwZnMuaCIKKworI2RlZmluZSBMUEFSX05BTUVfTEVOIDgJCS8qIGxwYXIgbmFtZSBsZW4gaW4gZGlhZyAyMDQgZGF0YSAqLworI2RlZmluZSBDUFVfTkFNRV9MRU4gMTYJCS8qIHR5cGUgbmFtZSBsZW4gb2YgY3B1cyBpbiBkaWFnMjI0IG5hbWUgdGFibGUgKi8KKyNkZWZpbmUgVE1QX1NJWkUgNjQJCS8qIHNpemUgb2YgdGVtcG9yYXJ5IGJ1ZmZlcnMgKi8KKworLyogZGlhZyAyMDQgc3ViY29kZXMgKi8KK2VudW0gZGlhZzIwNF9zYyB7CisJU1VCQ19TVElCNCA9IDQsCisJU1VCQ19SU0kgPSA1LAorCVNVQkNfU1RJQjYgPSA2LAorCVNVQkNfU1RJQjcgPSA3Cit9OworCisvKiBUaGUgdHdvIGF2YWlsYWJsZSBkaWFnIDIwNCBkYXRhIGZvcm1hdHMgKi8KK2VudW0gZGlhZzIwNF9mb3JtYXQgeworCUlORk9fU0lNUExFID0gMCwKKwlJTkZPX0VYVCA9IDB4MDAwMTAwMDAKK307CisKKy8qIGJpdCBpcyBzZXQgaW4gZmxhZ3MsIHdoZW4gcGh5c2ljYWwgY3B1IGluZm8gaXMgaW5jbHVkZWQgaW4gZGlhZyAyMDQgZGF0YSAqLworI2RlZmluZSBMUEFSX1BIWVNfRkxHICAweDgwCisKK3N0YXRpYyBjaGFyICpkaWFnMjI0X2NwdV9uYW1lczsJCQkvKiBkaWFnIDIyNCBuYW1lIHRhYmxlICovCitzdGF0aWMgZW51bSBkaWFnMjA0X3NjIGRpYWcyMDRfc3RvcmVfc2M7CS8qIHVzZWQgc3ViY29kZSBmb3Igc3RvcmUgKi8KK3N0YXRpYyBlbnVtIGRpYWcyMDRfZm9ybWF0IGRpYWcyMDRfaW5mb190eXBlOwkvKiB1c2VkIGRpYWcgMjA0IGRhdGEgZm9ybWF0ICovCisKK3N0YXRpYyB2b2lkICpkaWFnMjA0X2J1ZjsJCS8qIDRLIGFsaWduZWQgYnVmZmVyIGZvciBkaWFnMjA0IGRhdGEgKi8KK3N0YXRpYyB2b2lkICpkaWFnMjA0X2J1Zl92bWFsbG9jOwkvKiB2bWFsbG9jIHBvaW50ZXIgZm9yIGRpYWcyMDQgZGF0YSAqLworc3RhdGljIGludCBkaWFnMjA0X2J1Zl9wYWdlczsJCS8qIG51bWJlciBvZiBwYWdlcyBmb3IgZGlhZzIwNCBkYXRhICovCisKKy8qCisgKiBESUFHIDIwNCBkYXRhIHN0cnVjdHVyZXMgYW5kIG1lbWJlciBhY2Nlc3MgZnVuY3Rpb25zLgorICoKKyAqIFNpbmNlIHdlIGhhdmUgdHdvIGRpZmZlcmVudCBkaWFnIDIwNCBkYXRhIGZvcm1hdHMgZm9yIG9sZCBhbmQgbmV3IHMzOTAKKyAqIG1hY2hpbmVzLCB3ZSBkbyBub3QgYWNjZXNzIHRoZSBzdHJ1Y3RzIGRpcmVjdGx5LCBidXQgdXNlIGdldHRlciBmdW5jdGlvbnMgZm9yCisgKiBlYWNoIHN0cnVjdCBtZW1iZXIgaW5zdGVhZC4gVGhpcyBzaG91bGQgbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLgorICovCisKKy8qIFRpbWUgaW5mb3JtYXRpb24gYmxvY2sgKi8KKworc3RydWN0IGluZm9fYmxrX2hkciB7CisJX191OCAgbnBhcjsKKwlfX3U4ICBmbGFnczsKKwlfX3UxNiB0c2xpY2U7CisJX191MTYgcGh5c19jcHVzOworCV9fdTE2IHRoaXNfcGFydDsKKwlfX3U2NCBjdXJ0b2Q7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHhfaW5mb19ibGtfaGRyIHsKKwlfX3U4ICBucGFyOworCV9fdTggIGZsYWdzOworCV9fdTE2IHRzbGljZTsKKwlfX3UxNiBwaHlzX2NwdXM7CisJX191MTYgdGhpc19wYXJ0OworCV9fdTY0IGN1cnRvZDE7CisJX191NjQgY3VydG9kMjsKKwljaGFyIHJlc2VydmVkWzQwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGludCBpbmZvX2Jsa19oZHJfX3NpemUoZW51bSBkaWFnMjA0X2Zvcm1hdCB0eXBlKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbmZvX2Jsa19oZHIpOworCWVsc2UgLyogSU5GT19FWFQgKi8KKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgeF9pbmZvX2Jsa19oZHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTggaW5mb19ibGtfaGRyX19ucGFyKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgaW5mb19ibGtfaGRyICopaGRyKS0+bnBhcjsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiAoKHN0cnVjdCB4X2luZm9fYmxrX2hkciAqKWhkciktPm5wYXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBpbmZvX2Jsa19oZHJfX2ZsYWdzKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgaW5mb19ibGtfaGRyICopaGRyKS0+ZmxhZ3M7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9pbmZvX2Jsa19oZHIgKiloZHIpLT5mbGFnczsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBpbmZvX2Jsa19oZHJfX3BjcHVzKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgaW5mb19ibGtfaGRyICopaGRyKS0+cGh5c19jcHVzOworCWVsc2UgLyogSU5GT19FWFQgKi8KKwkJcmV0dXJuICgoc3RydWN0IHhfaW5mb19ibGtfaGRyICopaGRyKS0+cGh5c19jcHVzOworfQorCisvKiBQYXJ0aXRpb24gaGVhZGVyICovCisKK3N0cnVjdCBwYXJ0X2hkciB7CisJX191OCBwbjsKKwlfX3U4IGNwdXM7CisJY2hhciByZXNlcnZlZFs2XTsKKwljaGFyIHBhcnRfbmFtZVtMUEFSX05BTUVfTEVOXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3QgeF9wYXJ0X2hkciB7CisJX191OCAgcG47CisJX191OCAgY3B1czsKKwlfX3U4ICByY3B1czsKKwlfX3U4ICBwZmxhZzsKKwlfX3UzMiBtbHU7CisJY2hhciAgcGFydF9uYW1lW0xQQVJfTkFNRV9MRU5dOworCWNoYXIgIGxwY19uYW1lWzhdOworCWNoYXIgIG9zX25hbWVbOF07CisJX191NjQgb25saW5lX2NzOworCV9fdTY0IG9ubGluZV9lczsKKwlfX3U4ICB1cGlkOworCWNoYXIgIHJlc2VydmVkMVszXTsKKwlfX3UzMiBncm91cF9tbHU7CisJY2hhciAgZ3JvdXBfbmFtZVs4XTsKKwljaGFyICByZXNlcnZlZDJbMzJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcnRfaGRyX19zaXplKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSkKK3sKKwlpZiAodHlwZSA9PSBJTkZPX1NJTVBMRSkKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgcGFydF9oZHIpOworCWVsc2UgLyogSU5GT19FWFQgKi8KKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgeF9wYXJ0X2hkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBwYXJ0X2hkcl9fcmNwdXMoZW51bSBkaWFnMjA0X2Zvcm1hdCB0eXBlLCB2b2lkICpoZHIpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiAoKHN0cnVjdCBwYXJ0X2hkciAqKWhkciktPmNwdXM7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9wYXJ0X2hkciAqKWhkciktPnJjcHVzOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGFydF9oZHJfX3BhcnRfbmFtZShlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUsIHZvaWQgKmhkciwKKwkJCQkgICAgICAgY2hhciAqbmFtZSkKK3sKKwlpZiAodHlwZSA9PSBJTkZPX1NJTVBMRSkKKwkJbWVtY3B5KG5hbWUsICgoc3RydWN0IHBhcnRfaGRyICopaGRyKS0+cGFydF9uYW1lLAorCQkgICAgICAgTFBBUl9OQU1FX0xFTik7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQltZW1jcHkobmFtZSwgKChzdHJ1Y3QgeF9wYXJ0X2hkciAqKWhkciktPnBhcnRfbmFtZSwKKwkJICAgICAgIExQQVJfTkFNRV9MRU4pOworCUVCQ0FTQyhuYW1lLCBMUEFSX05BTUVfTEVOKTsKKwluYW1lW0xQQVJfTkFNRV9MRU5dID0gMDsKKwlzdHJzdHJpcChuYW1lKTsKK30KKworc3RydWN0IGNwdV9pbmZvIHsKKwlfX3UxNiBjcHVfYWRkcjsKKwljaGFyICByZXNlcnZlZDFbMl07CisJX191OCAgY3RpZHg7CisJX191OCAgY2ZsYWc7CisJX191MTYgd2VpZ2h0OworCV9fdTY0IGFjY190aW1lOworCV9fdTY0IGxwX3RpbWU7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHhfY3B1X2luZm8geworCV9fdTE2IGNwdV9hZGRyOworCWNoYXIgIHJlc2VydmVkMVsyXTsKKwlfX3U4ICBjdGlkeDsKKwlfX3U4ICBjZmxhZzsKKwlfX3UxNiB3ZWlnaHQ7CisJX191NjQgYWNjX3RpbWU7CisJX191NjQgbHBfdGltZTsKKwlfX3UxNiBtaW5fd2VpZ2h0OworCV9fdTE2IGN1cl93ZWlnaHQ7CisJX191MTYgbWF4X3dlaWdodDsKKwljaGFyICByZXNldmVkMlsyXTsKKwlfX3U2NCBvbmxpbmVfdGltZTsKKwlfX3U2NCB3YWl0X3RpbWU7CisJX191MzIgcG1hX3dlaWdodDsKKwlfX3UzMiBwb2xhcl93ZWlnaHQ7CisJY2hhciAgcmVzZXJ2ZWQzWzQwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBDUFUgaW5mbyBibG9jayAqLworCitzdGF0aWMgaW5saW5lIGludCBjcHVfaW5mb19fc2l6ZShlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IGNwdV9pbmZvKTsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHhfY3B1X2luZm8pOworfQorCitzdGF0aWMgaW5saW5lIF9fdTggY3B1X2luZm9fX2N0aWR4KGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgY3B1X2luZm8gKiloZHIpLT5jdGlkeDsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiAoKHN0cnVjdCB4X2NwdV9pbmZvICopaGRyKS0+Y3RpZHg7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgY3B1X2luZm9fX2NwdV9hZGRyKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgY3B1X2luZm8gKiloZHIpLT5jcHVfYWRkcjsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiAoKHN0cnVjdCB4X2NwdV9pbmZvICopaGRyKS0+Y3B1X2FkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgY3B1X2luZm9fX2FjY190aW1lKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gKChzdHJ1Y3QgY3B1X2luZm8gKiloZHIpLT5hY2NfdGltZTsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiAoKHN0cnVjdCB4X2NwdV9pbmZvICopaGRyKS0+YWNjX3RpbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgY3B1X2luZm9fX2xwX3RpbWUoZW51bSBkaWFnMjA0X2Zvcm1hdCB0eXBlLCB2b2lkICpoZHIpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiAoKHN0cnVjdCBjcHVfaW5mbyAqKWhkciktPmxwX3RpbWU7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9jcHVfaW5mbyAqKWhkciktPmxwX3RpbWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191NjQgY3B1X2luZm9fX29ubGluZV90aW1lKGVudW0gZGlhZzIwNF9mb3JtYXQgdHlwZSwgdm9pZCAqaGRyKQoreworCWlmICh0eXBlID09IElORk9fU0lNUExFKQorCQlyZXR1cm4gMDsJLyogb25saW5lX3RpbWUgbm90IGF2YWlsYWJsZSBpbiBzaW1wbGUgaW5mbyAqLworCWVsc2UgLyogSU5GT19FWFQgKi8KKwkJcmV0dXJuICgoc3RydWN0IHhfY3B1X2luZm8gKiloZHIpLT5vbmxpbmVfdGltZTsKK30KKworLyogUGh5c2ljYWwgaGVhZGVyICovCisKK3N0cnVjdCBwaHlzX2hkciB7CisJY2hhciByZXNlcnZlZDFbMV07CisJX191OCBjcHVzOworCWNoYXIgcmVzZXJ2ZWQyWzZdOworCWNoYXIgbWdtX25hbWVbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHhfcGh5c19oZHIgeworCWNoYXIgcmVzZXJ2ZWQxWzFdOworCV9fdTggY3B1czsKKwljaGFyIHJlc2VydmVkMls2XTsKKwljaGFyIG1nbV9uYW1lWzhdOworCWNoYXIgcmVzZXJ2ZWQzWzgwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGludCBwaHlzX2hkcl9fc2l6ZShlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHBoeXNfaGRyKTsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHhfcGh5c19oZHIpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTggcGh5c19oZHJfX2NwdXMoZW51bSBkaWFnMjA0X2Zvcm1hdCB0eXBlLCB2b2lkICpoZHIpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiAoKHN0cnVjdCBwaHlzX2hkciAqKWhkciktPmNwdXM7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9waHlzX2hkciAqKWhkciktPmNwdXM7Cit9CisKKy8qIFBoeXNpY2FsIENQVSBpbmZvIGJsb2NrICovCisKK3N0cnVjdCBwaHlzX2NwdSB7CisJX191MTYgY3B1X2FkZHI7CisJY2hhciAgcmVzZXJ2ZWQxWzJdOworCV9fdTggIGN0aWR4OworCWNoYXIgIHJlc2VydmVkMlszXTsKKwlfX3U2NCBtZ21fdGltZTsKKwljaGFyICByZXNlcnZlZDNbOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHhfcGh5c19jcHUgeworCV9fdTE2IGNwdV9hZGRyOworCWNoYXIgIHJlc2VydmVkMVsyXTsKKwlfX3U4ICBjdGlkeDsKKwljaGFyICByZXNlcnZlZDJbM107CisJX191NjQgbWdtX3RpbWU7CisJY2hhciAgcmVzZXJ2ZWQzWzgwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW5saW5lIGludCBwaHlzX2NwdV9fc2l6ZShlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUpCit7CisJaWYgKHR5cGUgPT0gSU5GT19TSU1QTEUpCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHBoeXNfY3B1KTsKKwllbHNlIC8qIElORk9fRVhUICovCisJCXJldHVybiBzaXplb2Yoc3RydWN0IHhfcGh5c19jcHUpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTE2IHBoeXNfY3B1X19jcHVfYWRkcihlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUsIHZvaWQgKmhkcikKK3sKKwlpZiAodHlwZSA9PSBJTkZPX1NJTVBMRSkKKwkJcmV0dXJuICgoc3RydWN0IHBoeXNfY3B1ICopaGRyKS0+Y3B1X2FkZHI7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9waHlzX2NwdSAqKWhkciktPmNwdV9hZGRyOworfQorCitzdGF0aWMgaW5saW5lIF9fdTY0IHBoeXNfY3B1X19tZ21fdGltZShlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUsIHZvaWQgKmhkcikKK3sKKwlpZiAodHlwZSA9PSBJTkZPX1NJTVBMRSkKKwkJcmV0dXJuICgoc3RydWN0IHBoeXNfY3B1ICopaGRyKS0+bWdtX3RpbWU7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9waHlzX2NwdSAqKWhkciktPm1nbV90aW1lOworfQorCitzdGF0aWMgaW5saW5lIF9fdTY0IHBoeXNfY3B1X19jdGlkeChlbnVtIGRpYWcyMDRfZm9ybWF0IHR5cGUsIHZvaWQgKmhkcikKK3sKKwlpZiAodHlwZSA9PSBJTkZPX1NJTVBMRSkKKwkJcmV0dXJuICgoc3RydWN0IHBoeXNfY3B1ICopaGRyKS0+Y3RpZHg7CisJZWxzZSAvKiBJTkZPX0VYVCAqLworCQlyZXR1cm4gKChzdHJ1Y3QgeF9waHlzX2NwdSAqKWhkciktPmN0aWR4OworfQorCisvKiBEaWFnbm9zZSAyMDQgZnVuY3Rpb25zICovCisKK3N0YXRpYyBpbnQgZGlhZzIwNCh1bnNpZ25lZCBsb25nIHN1YmNvZGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdm9pZCAqYWRkcikKK3sKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9zdWJjb2RlIGFzbSgiMCIpID0gc3ViY29kZTsKKwlyZWdpc3RlciB1bnNpZ25lZCBsb25nIF9zaXplIGFzbSgiMSIpID0gc2l6ZTsKKworCWFzbSB2b2xhdGlsZSAoIiAgIGRpYWcgICAgJTIsJTAsMHgyMDRcbiIKKwkJICAgICAgIjA6IFxuIiAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgorI2lmbmRlZiBfX3MzOTB4X18KKwkJICAgICAgIiAgICAuYWxpZ24gNFxuIgorCQkgICAgICAiICAgIC5sb25nICAwYiwwYlxuIgorI2Vsc2UKKwkJICAgICAgIiAgICAuYWxpZ24gOFxuIgorCQkgICAgICAiICAgIC5xdWFkICAwYiwwYlxuIgorI2VuZGlmCisJCSAgICAgICIucHJldmlvdXMiOiIrZCIgKF9zdWJjb2RlKSwgIitkIihfc2l6ZSkKKwkJICAgICAgOiJkIihhZGRyKQorCQkgICAgICA6Im1lbW9yeSIpOworCWlmIChfc3ViY29kZSkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIF9zaXplOworfQorCisvKgorICogRm9yIHRoZSBvbGQgZGlhZyBzdWJjb2RlIDQgd2l0aCBzaW1wbGUgZGF0YSBmb3JtYXQgd2UgaGF2ZSB0byB1c2UgcmVhbAorICogbWVtb3J5LiBJZiB3ZSB1c2Ugc3ViY29kZSA2IG9yIDcgd2l0aCBleHRlbmRlZCBkYXRhIGZvcm1hdCwgd2UgY2FuIChhbmQKKyAqIHNob3VsZCkgdXNlIHZtYWxsb2MsIHNpbmNlIHdlIG5lZWQgYSBsb3Qgb2YgbWVtb3J5IGluIHRoYXQgY2FzZS4gQ3VycmVudGx5CisgKiB1cCB0byA5MyBwYWdlcyEKKyAqLworCitzdGF0aWMgdm9pZCBkaWFnMjA0X2ZyZWVfYnVmZmVyKHZvaWQpCit7CisJaWYgKCFkaWFnMjA0X2J1ZikKKwkJcmV0dXJuOworCWlmIChkaWFnMjA0X2J1Zl92bWFsbG9jKSB7CisJCXZmcmVlKGRpYWcyMDRfYnVmX3ZtYWxsb2MpOworCQlkaWFnMjA0X2J1Zl92bWFsbG9jID0gTlVMTDsKKwl9IGVsc2UgeworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBkaWFnMjA0X2J1ZiwgMCk7CisJfQorCWRpYWcyMDRfYnVmX3BhZ2VzID0gMDsKKwlkaWFnMjA0X2J1ZiA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICpkaWFnMjA0X2FsbG9jX3ZidWYoaW50IHBhZ2VzKQoreworCS8qIFRoZSBidWZmZXIgaGFzIHRvIGJlIHBhZ2UgYWxpZ25lZCEgKi8KKwlkaWFnMjA0X2J1Zl92bWFsbG9jID0gdm1hbGxvYyhQQUdFX1NJWkUgKiAocGFnZXMgKyAxKSk7CisJaWYgKCFkaWFnMjA0X2J1Zl92bWFsbG9jKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlkaWFnMjA0X2J1ZiA9ICh2b2lkKikoKHVuc2lnbmVkIGxvbmcpZGlhZzIwNF9idWZfdm1hbGxvYworCQkJCSYgfjB4ZmZmVUwpICsgMHgxMDAwOworCWRpYWcyMDRfYnVmX3BhZ2VzID0gcGFnZXM7CisJcmV0dXJuIGRpYWcyMDRfYnVmOworfQorCitzdGF0aWMgdm9pZCAqZGlhZzIwNF9hbGxvY19yYnVmKHZvaWQpCit7CisJZGlhZzIwNF9idWYgPSAodm9pZCopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLDApOworCWlmIChkaWFnMjA0X2J1ZikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZGlhZzIwNF9idWZfcGFnZXMgPSAxOworCXJldHVybiBkaWFnMjA0X2J1ZjsKK30KKworc3RhdGljIHZvaWQgKmRpYWcyMDRfZ2V0X2J1ZmZlcihlbnVtIGRpYWcyMDRfZm9ybWF0IGZtdCwgaW50ICpwYWdlcykKK3sKKwlpZiAoZGlhZzIwNF9idWYpIHsKKwkJKnBhZ2VzID0gZGlhZzIwNF9idWZfcGFnZXM7CisJCXJldHVybiBkaWFnMjA0X2J1ZjsKKwl9CisJaWYgKGZtdCA9PSBJTkZPX1NJTVBMRSkgeworCQkqcGFnZXMgPSAxOworCQlyZXR1cm4gZGlhZzIwNF9hbGxvY19yYnVmKCk7CisJfSBlbHNlIHsvKiBJTkZPX0VYVCAqLworCQkqcGFnZXMgPSBkaWFnMjA0KFNVQkNfUlNJIHwgSU5GT19FWFQsIDAsIDApOworCQlpZiAoKnBhZ2VzIDw9IDApCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwkJZWxzZQorCQkJcmV0dXJuIGRpYWcyMDRfYWxsb2NfdmJ1ZigqcGFnZXMpOworCX0KK30KKworLyoKKyAqIGRpYWcyMDRfcHJvYmUoKSBoYXMgdG8gZmluZCBvdXQsIHdoaWNoIHR5cGUgb2YgZGlhZ25vc2UgMjA0IGltcGxlbWVudGF0aW9uCisgKiB3ZSBoYXZlIG9uIG91ciBtYWNoaW5lLiBDdXJyZW50bHkgdGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIHNjYW5hcmlvczoKKyAqICAgLSBzdWJjb2RlIDQgICArIHNpbXBsZSBkYXRhIGZvcm1hdCAob25seSBvbmUgcGFnZSkKKyAqICAgLSBzdWJjb2RlIDQtNiArIGV4dGVuZGVkIGRhdGEgZm9ybWF0CisgKiAgIC0gc3ViY29kZSA0LTcgKyBleHRlbmRlZCBkYXRhIGZvcm1hdAorICoKKyAqIFN1YmNvZGUgNSBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBzaXplIG9mIHRoZSBkYXRhLCBwcm92aWRlZCBieSBzdWJjb2RlcworICogNiBhbmQgNy4gU3ViY29kZSA3IGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMgc3ViY29kZSA2LiBJbiBhZGRpdGlvbgorICogdG8gc3ViY29kZSA2IGl0IHByb3ZpZGVzIGFsc28gaW5mb3JtYXRpb24gYWJvdXQgc2Vjb25kYXJ5IGNwdXMuCisgKiBJbiBvcmRlciB0byBnZXQgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSwgd2UgZmlyc3QgdHJ5CisgKiBzdWJjb2RlIDcsIHRoZW4gNiBhbmQgaWYgYm90aCBmYWlsLCB3ZSB1c2Ugc3ViY29kZSA0LgorICovCisKK3N0YXRpYyBpbnQgZGlhZzIwNF9wcm9iZSh2b2lkKQoreworCXZvaWQgKmJ1ZjsKKwlpbnQgcGFnZXMsIHJjOworCisJYnVmID0gZGlhZzIwNF9nZXRfYnVmZmVyKElORk9fRVhULCAmcGFnZXMpOworCWlmICghSVNfRVJSKGJ1ZikpIHsKKwkJaWYgKGRpYWcyMDQoU1VCQ19TVElCNyB8IElORk9fRVhULCBwYWdlcywgYnVmKSA+PSAwKSB7CisJCQlkaWFnMjA0X3N0b3JlX3NjID0gU1VCQ19TVElCNzsKKwkJCWRpYWcyMDRfaW5mb190eXBlID0gSU5GT19FWFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoZGlhZzIwNChTVUJDX1NUSUI2IHwgSU5GT19FWFQsIHBhZ2VzLCBidWYpID49IDApIHsKKwkJCWRpYWcyMDRfc3RvcmVfc2MgPSBTVUJDX1NUSUI3OworCQkJZGlhZzIwNF9pbmZvX3R5cGUgPSBJTkZPX0VYVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRpYWcyMDRfZnJlZV9idWZmZXIoKTsKKwl9CisKKwkvKiBzdWJjb2RlcyA2IGFuZCA3IGZhaWxlZCwgbm93IHRyeSBzdWJjb2RlIDQgKi8KKworCWJ1ZiA9IGRpYWcyMDRfZ2V0X2J1ZmZlcihJTkZPX1NJTVBMRSwgJnBhZ2VzKTsKKwlpZiAoSVNfRVJSKGJ1ZikpIHsKKwkJcmMgPSBQVFJfRVJSKGJ1Zik7CisJCWdvdG8gZmFpbF9hbGxvYzsKKwl9CisJaWYgKGRpYWcyMDQoU1VCQ19TVElCNCB8IElORk9fU0lNUExFLCBwYWdlcywgYnVmKSA+PSAwKSB7CisJCWRpYWcyMDRfc3RvcmVfc2MgPSBTVUJDX1NUSUI0OworCQlkaWFnMjA0X2luZm9fdHlwZSA9IElORk9fU0lNUExFOworCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQlyYyA9IC1FTk9TWVM7CisJCWdvdG8gZmFpbF9zdG9yZTsKKwl9CitvdXQ6CisJcmMgPSAwOworZmFpbF9zdG9yZToKKwlkaWFnMjA0X2ZyZWVfYnVmZmVyKCk7CitmYWlsX2FsbG9jOgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgKmRpYWcyMDRfc3RvcmUodm9pZCkKK3sKKwl2b2lkICpidWY7CisJaW50IHBhZ2VzOworCisJYnVmID0gZGlhZzIwNF9nZXRfYnVmZmVyKGRpYWcyMDRfaW5mb190eXBlLCAmcGFnZXMpOworCWlmIChJU19FUlIoYnVmKSkKKwkJZ290byBvdXQ7CisJaWYgKGRpYWcyMDQoZGlhZzIwNF9zdG9yZV9zYyB8IGRpYWcyMDRfaW5mb190eXBlLCBwYWdlcywgYnVmKSA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworb3V0OgorCXJldHVybiBidWY7Cit9CisKKy8qIERpYWdub3NlIDIyNCBmdW5jdGlvbnMgKi8KKworc3RhdGljIHZvaWQgZGlhZzIyNCh2b2lkICpwdHIpCit7CisJYXNtIHZvbGF0aWxlKCIgICBkaWFnICAgICUwLCUxLDB4MjI0XG4iCisJCSAgICAgOiA6ImQiICgwKSwgImQiKHB0cikgOiAibWVtb3J5Iik7Cit9CisKK3N0YXRpYyBpbnQgZGlhZzIyNF9nZXRfbmFtZV90YWJsZSh2b2lkKQoreworCS8qIG1lbW9yeSBtdXN0IGJlIGJlbG93IDJHQiAqLworCWRpYWcyMjRfY3B1X25hbWVzID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwlpZiAoIWRpYWcyMjRfY3B1X25hbWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkaWFnMjI0KGRpYWcyMjRfY3B1X25hbWVzKTsKKwlFQkNBU0MoZGlhZzIyNF9jcHVfbmFtZXMgKyAxNiwgKCpkaWFnMjI0X2NwdV9uYW1lcyArIDEpICogMTYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkaWFnMjI0X2RlbGV0ZV9uYW1lX3RhYmxlKHZvaWQpCit7CisJa2ZyZWUoZGlhZzIyNF9jcHVfbmFtZXMpOworfQorCitzdGF0aWMgaW50IGRpYWcyMjRfaWR4Mm5hbWUoaW50IGluZGV4LCBjaGFyICpuYW1lKQoreworCW1lbWNweShuYW1lLCBkaWFnMjI0X2NwdV9uYW1lcyArICgoaW5kZXggKyAxKSAqIENQVV9OQU1FX0xFTiksCisJCUNQVV9OQU1FX0xFTik7CisJbmFtZVtDUFVfTkFNRV9MRU5dID0gMDsKKwlzdHJzdHJpcChuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworX19pbml0IGludCBoeXBmc19kaWFnX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwlpZiAoZGlhZzIwNF9wcm9iZSgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaHlwZnM6IGRpYWcgMjA0IG5vdCB3b3JraW5nLiIpOworCQlyZXR1cm4gLUVOT0RBVEE7CisJfQorCXJjID0gZGlhZzIyNF9nZXRfbmFtZV90YWJsZSgpOworCWlmIChyYykgeworCQlkaWFnMjI0X2RlbGV0ZV9uYW1lX3RhYmxlKCk7CisJCXByaW50ayhLRVJOX0VSUiAiaHlwZnM6IGNvdWxkIG5vdCBnZXQgbmFtZSB0YWJsZS5cbiIpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK19fZXhpdCB2b2lkIGh5cGZzX2RpYWdfZXhpdCh2b2lkKQoreworCWRpYWcyMjRfZGVsZXRlX25hbWVfdGFibGUoKTsKKwlkaWFnMjA0X2ZyZWVfYnVmZmVyKCk7Cit9CisKKy8qCisgKiBGdW5jdGlvbnMgdG8gY3JlYXRlIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworc3RhdGljIGludCBoeXBmc19jcmVhdGVfY3B1X2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgZGVudHJ5ICpjcHVzX2Rpciwgdm9pZCAqY3B1X2luZm8pCit7CisJc3RydWN0IGRlbnRyeSAqY3B1X2RpcjsKKwljaGFyIGJ1ZmZlcltUTVBfU0laRV07CisJdm9pZCAqcmM7CisKKwlzbnByaW50ZihidWZmZXIsIFRNUF9TSVpFLCAiJWQiLCBjcHVfaW5mb19fY3B1X2FkZHIoZGlhZzIwNF9pbmZvX3R5cGUsCisJCQkJCQkJICAgIGNwdV9pbmZvKSk7CisJY3B1X2RpciA9IGh5cGZzX21rZGlyKHNiLCBjcHVzX2RpciwgYnVmZmVyKTsKKwlyYyA9IGh5cGZzX2NyZWF0ZV91NjQoc2IsIGNwdV9kaXIsICJtZ210aW1lIiwKKwkJCSAgICAgIGNwdV9pbmZvX19hY2NfdGltZShkaWFnMjA0X2luZm9fdHlwZSwgY3B1X2luZm8pIC0KKwkJCSAgICAgIGNwdV9pbmZvX19scF90aW1lKGRpYWcyMDRfaW5mb190eXBlLCBjcHVfaW5mbykpOworCWlmIChJU19FUlIocmMpKQorCQlyZXR1cm4gUFRSX0VSUihyYyk7CisJcmMgPSBoeXBmc19jcmVhdGVfdTY0KHNiLCBjcHVfZGlyLCAiY3B1dGltZSIsCisJCQkgICAgICBjcHVfaW5mb19fbHBfdGltZShkaWFnMjA0X2luZm9fdHlwZSwgY3B1X2luZm8pKTsKKwlpZiAoSVNfRVJSKHJjKSkKKwkJcmV0dXJuIFBUUl9FUlIocmMpOworCWlmIChkaWFnMjA0X2luZm9fdHlwZSA9PSBJTkZPX0VYVCkgeworCQlyYyA9IGh5cGZzX2NyZWF0ZV91NjQoc2IsIGNwdV9kaXIsICJvbmxpbmV0aW1lIiwKKwkJCQkgICAgICBjcHVfaW5mb19fb25saW5lX3RpbWUoZGlhZzIwNF9pbmZvX3R5cGUsCisJCQkJCQkJICAgIGNwdV9pbmZvKSk7CisJCWlmIChJU19FUlIocmMpKQorCQkJcmV0dXJuIFBUUl9FUlIocmMpOworCX0KKwlkaWFnMjI0X2lkeDJuYW1lKGNwdV9pbmZvX19jdGlkeChkaWFnMjA0X2luZm9fdHlwZSwgY3B1X2luZm8pLCBidWZmZXIpOworCXJjID0gaHlwZnNfY3JlYXRlX3N0cihzYiwgY3B1X2RpciwgInR5cGUiLCBidWZmZXIpOworCWlmIChJU19FUlIocmMpKQorCQlyZXR1cm4gUFRSX0VSUihyYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICpoeXBmc19jcmVhdGVfbHBhcl9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGRlbnRyeSAqc3lzdGVtc19kaXIsIHZvaWQgKnBhcnRfaGRyKQoreworCXN0cnVjdCBkZW50cnkgKmNwdXNfZGlyOworCXN0cnVjdCBkZW50cnkgKmxwYXJfZGlyOworCWNoYXIgbHBhcl9uYW1lW0xQQVJfTkFNRV9MRU4gKyAxXTsKKwl2b2lkICpjcHVfaW5mbzsKKwlpbnQgaTsKKworCXBhcnRfaGRyX19wYXJ0X25hbWUoZGlhZzIwNF9pbmZvX3R5cGUsIHBhcnRfaGRyLCBscGFyX25hbWUpOworCWxwYXJfbmFtZVtMUEFSX05BTUVfTEVOXSA9IDA7CisJbHBhcl9kaXIgPSBoeXBmc19ta2RpcihzYiwgc3lzdGVtc19kaXIsIGxwYXJfbmFtZSk7CisJaWYgKElTX0VSUihscGFyX2RpcikpCisJCXJldHVybiBscGFyX2RpcjsKKwljcHVzX2RpciA9IGh5cGZzX21rZGlyKHNiLCBscGFyX2RpciwgImNwdXMiKTsKKwlpZiAoSVNfRVJSKGNwdXNfZGlyKSkKKwkJcmV0dXJuIGNwdXNfZGlyOworCWNwdV9pbmZvID0gcGFydF9oZHIgKyBwYXJ0X2hkcl9fc2l6ZShkaWFnMjA0X2luZm9fdHlwZSk7CisJZm9yIChpID0gMDsgaSA8IHBhcnRfaGRyX19yY3B1cyhkaWFnMjA0X2luZm9fdHlwZSwgcGFydF9oZHIpOyBpKyspIHsKKwkJaW50IHJjOworCQlyYyA9IGh5cGZzX2NyZWF0ZV9jcHVfZmlsZXMoc2IsIGNwdXNfZGlyLCBjcHVfaW5mbyk7CisJCWlmIChyYykKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJY3B1X2luZm8gKz0gY3B1X2luZm9fX3NpemUoZGlhZzIwNF9pbmZvX3R5cGUpOworCX0KKwlyZXR1cm4gY3B1X2luZm87Cit9CisKK3N0YXRpYyBpbnQgaHlwZnNfY3JlYXRlX3BoeXNfY3B1X2ZpbGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmNwdXNfZGlyLCB2b2lkICpjcHVfaW5mbykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpjcHVfZGlyOworCWNoYXIgYnVmZmVyW1RNUF9TSVpFXTsKKwl2b2lkICpyYzsKKworCXNucHJpbnRmKGJ1ZmZlciwgVE1QX1NJWkUsICIlaSIsIHBoeXNfY3B1X19jcHVfYWRkcihkaWFnMjA0X2luZm9fdHlwZSwKKwkJCQkJCQkgICAgY3B1X2luZm8pKTsKKwljcHVfZGlyID0gaHlwZnNfbWtkaXIoc2IsIGNwdXNfZGlyLCBidWZmZXIpOworCWlmIChJU19FUlIoY3B1X2RpcikpCisJCXJldHVybiBQVFJfRVJSKGNwdV9kaXIpOworCXJjID0gaHlwZnNfY3JlYXRlX3U2NChzYiwgY3B1X2RpciwgIm1nbXRpbWUiLAorCQkJICAgICAgcGh5c19jcHVfX21nbV90aW1lKGRpYWcyMDRfaW5mb190eXBlLCBjcHVfaW5mbykpOworCWlmIChJU19FUlIocmMpKQorCQlyZXR1cm4gUFRSX0VSUihyYyk7CisJZGlhZzIyNF9pZHgybmFtZShwaHlzX2NwdV9fY3RpZHgoZGlhZzIwNF9pbmZvX3R5cGUsIGNwdV9pbmZvKSwgYnVmZmVyKTsKKwlyYyA9IGh5cGZzX2NyZWF0ZV9zdHIoc2IsIGNwdV9kaXIsICJ0eXBlIiwgYnVmZmVyKTsKKwlpZiAoSVNfRVJSKHJjKSkKKwkJcmV0dXJuIFBUUl9FUlIocmMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqaHlwZnNfY3JlYXRlX3BoeXNfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgIHN0cnVjdCBkZW50cnkgKnBhcmVudF9kaXIsIHZvaWQgKnBoeXNfaGRyKQoreworCWludCBpOworCXZvaWQgKmNwdV9pbmZvOworCXN0cnVjdCBkZW50cnkgKmNwdXNfZGlyOworCisJY3B1c19kaXIgPSBoeXBmc19ta2RpcihzYiwgcGFyZW50X2RpciwgImNwdXMiKTsKKwlpZiAoSVNfRVJSKGNwdXNfZGlyKSkKKwkJcmV0dXJuIGNwdXNfZGlyOworCWNwdV9pbmZvID0gcGh5c19oZHIgKyBwaHlzX2hkcl9fc2l6ZShkaWFnMjA0X2luZm9fdHlwZSk7CisJZm9yIChpID0gMDsgaSA8IHBoeXNfaGRyX19jcHVzKGRpYWcyMDRfaW5mb190eXBlLCBwaHlzX2hkcik7IGkrKykgeworCQlpbnQgcmM7CisJCXJjID0gaHlwZnNfY3JlYXRlX3BoeXNfY3B1X2ZpbGVzKHNiLCBjcHVzX2RpciwgY3B1X2luZm8pOworCQlpZiAocmMpCisJCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCWNwdV9pbmZvICs9IHBoeXNfY3B1X19zaXplKGRpYWcyMDRfaW5mb190eXBlKTsKKwl9CisJcmV0dXJuIGNwdV9pbmZvOworfQorCitpbnQgaHlwZnNfZGlhZ19jcmVhdGVfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqcm9vdCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpzeXN0ZW1zX2RpciwgKmh5cF9kaXI7CisJdm9pZCAqdGltZV9oZHIsICpwYXJ0X2hkcjsKKwlpbnQgaSwgcmM7CisJdm9pZCAqYnVmZmVyLCAqcHRyOworCisJYnVmZmVyID0gZGlhZzIwNF9zdG9yZSgpOworCWlmIChJU19FUlIoYnVmZmVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoYnVmZmVyKTsKKworCXN5c3RlbXNfZGlyID0gaHlwZnNfbWtkaXIoc2IsIHJvb3QsICJzeXN0ZW1zIik7CisJaWYgKElTX0VSUihzeXN0ZW1zX2RpcikpIHsKKwkJcmMgPSBQVFJfRVJSKHN5c3RlbXNfZGlyKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwl0aW1lX2hkciA9IChzdHJ1Y3QgeF9pbmZvX2Jsa19oZHIgKilidWZmZXI7CisJcGFydF9oZHIgPSB0aW1lX2hkciArIGluZm9fYmxrX2hkcl9fc2l6ZShkaWFnMjA0X2luZm9fdHlwZSk7CisJZm9yIChpID0gMDsgaSA8IGluZm9fYmxrX2hkcl9fbnBhcihkaWFnMjA0X2luZm9fdHlwZSwgdGltZV9oZHIpOyBpKyspIHsKKwkJcGFydF9oZHIgPSBoeXBmc19jcmVhdGVfbHBhcl9maWxlcyhzYiwgc3lzdGVtc19kaXIsIHBhcnRfaGRyKTsKKwkJaWYgKElTX0VSUihwYXJ0X2hkcikpIHsKKwkJCXJjID0gUFRSX0VSUihwYXJ0X2hkcik7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwl9CisJaWYgKGluZm9fYmxrX2hkcl9fZmxhZ3MoZGlhZzIwNF9pbmZvX3R5cGUsIHRpbWVfaGRyKSAmIExQQVJfUEhZU19GTEcpIHsKKwkJcHRyID0gaHlwZnNfY3JlYXRlX3BoeXNfZmlsZXMoc2IsIHJvb3QsIHBhcnRfaGRyKTsKKwkJaWYgKElTX0VSUihwdHIpKSB7CisJCQlyYyA9IFBUUl9FUlIocHRyKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCX0KKwloeXBfZGlyID0gaHlwZnNfbWtkaXIoc2IsIHJvb3QsICJoeXAiKTsKKwlpZiAoSVNfRVJSKGh5cF9kaXIpKSB7CisJCXJjID0gUFRSX0VSUihoeXBfZGlyKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlwdHIgPSBoeXBmc19jcmVhdGVfc3RyKHNiLCBoeXBfZGlyLCAidHlwZSIsICJMUEFSIEh5cGVydmlzb3IiKTsKKwlpZiAoSVNfRVJSKHB0cikpIHsKKwkJcmMgPSBQVFJfRVJSKHB0cik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcmMgPSAwOworCitlcnJfb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9oeXBmcy9oeXBmc19kaWFnLmggYi9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5M2RlYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZy5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiAgZnMvaHlwZnMvaHlwZnNfZGlhZy5oCisgKiAgICBIeXBlcnZpc29yIGZpbGVzeXN0ZW0gZm9yIExpbnV4IG9uIHMzOTAuCisgKgorICogICAgQ29weXJpZ2h0IChDKSBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAZGUuaWJtLmNvbT4KKyAqLworCisjaWZuZGVmIF9IWVBGU19ESUFHX0hfCisjZGVmaW5lIF9IWVBGU19ESUFHX0hfCisKK2V4dGVybiBpbnQgaHlwZnNfZGlhZ19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaHlwZnNfZGlhZ19leGl0KHZvaWQpOworZXh0ZXJuIGludCBoeXBmc19kaWFnX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KTsKKworI2VuZGlmIC8qIF9IWVBGU19ESUFHX0hfICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYyBiL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YzA5MTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3MzOTAvaHlwZnMvaW5vZGUuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqICBmcy9oeXBmcy9pbm9kZS5jCisgKiAgICBIeXBlcnZpc29yIGZpbGVzeXN0ZW0gZm9yIExpbnV4IG9uIHMzOTAuCisgKgorICogICAgQ29weXJpZ2h0IChDKSBJQk0gQ29ycC4gMjAwNgorICogICAgQXV0aG9yKHMpOiBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAZGUuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgorI2luY2x1ZGUgImh5cGZzLmgiCisjaW5jbHVkZSAiaHlwZnNfZGlhZy5oIgorCisjZGVmaW5lIEhZUEZTX01BR0lDIDB4Njg3OTcwCS8qIEFTQ0lJICdoeXAnICovCisjZGVmaW5lIFRNUF9TSVpFIDY0CQkvKiBzaXplIG9mIHRlbXBvcmFyeSBidWZmZXJzICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoeXBmc19jcmVhdGVfdXBkYXRlX2ZpbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRpcik7CisKK3N0cnVjdCBoeXBmc19zYl9pbmZvIHsKKwl1aWRfdCB1aWQ7CQkJLyogdWlkIHVzZWQgZm9yIGZpbGVzIGFuZCBkaXJzICovCisJZ2lkX3QgZ2lkOwkJCS8qIGdpZCB1c2VkIGZvciBmaWxlcyBhbmQgZGlycyAqLworCXN0cnVjdCBkZW50cnkgKnVwZGF0ZV9maWxlOwkvKiBmaWxlIHRvIHRyaWdnZXIgdXBkYXRlICovCisJdGltZV90IGxhc3RfdXBkYXRlOwkJLyogbGFzdCB1cGRhdGUgdGltZSBpbiBzZWNzIHNpbmNlIDE5NzAgKi8KKwlzdHJ1Y3QgbXV0ZXggbG9jazsJCS8qIGxvY2sgdG8gcHJvdGVjdCB1cGRhdGUgcHJvY2VzcyAqLworfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHlwZnNfZmlsZV9vcHM7CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaHlwZnNfdHlwZTsKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBoeXBmc19zX29wczsKKworLyogc3RhcnQgb2YgbGlzdCBvZiBhbGwgZGVudHJpZXMsIHdoaWNoIGhhdmUgdG8gYmUgZGVsZXRlZCBvbiB1cGRhdGUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoeXBmc19sYXN0X2RlbnRyeTsKKworc3RhdGljIHZvaWQgaHlwZnNfdXBkYXRlX3VwZGF0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBoeXBmc19zYl9pbmZvICpzYl9pbmZvID0gc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfaW5mby0+dXBkYXRlX2ZpbGUtPmRfaW5vZGU7CisKKwlzYl9pbmZvLT5sYXN0X3VwZGF0ZSA9IGdldF9zZWNvbmRzKCk7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworfQorCisvKiBkaXJlY3RvcnkgdHJlZSByZW1vdmFsIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgdm9pZCBoeXBmc19hZGRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlkZW50cnktPmRfZnNkYXRhID0gaHlwZnNfbGFzdF9kZW50cnk7CisJaHlwZnNfbGFzdF9kZW50cnkgPSBkZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIGh5cGZzX3JlbW92ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCXNpbXBsZV9ybWRpcihwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJZWxzZQorCQlzaW1wbGVfdW5saW5rKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwlkX2RlbGV0ZShkZW50cnkpOworCWRwdXQoZGVudHJ5KTsKK30KKworc3RhdGljIHZvaWQgaHlwZnNfZGVsZXRlX3RyZWUoc3RydWN0IGRlbnRyeSAqcm9vdCkKK3sKKwl3aGlsZSAoaHlwZnNfbGFzdF9kZW50cnkpIHsKKwkJc3RydWN0IGRlbnRyeSAqbmV4dF9kZW50cnk7CisJCW5leHRfZGVudHJ5ID0gaHlwZnNfbGFzdF9kZW50cnktPmRfZnNkYXRhOworCQloeXBmc19yZW1vdmUoaHlwZnNfbGFzdF9kZW50cnkpOworCQloeXBmc19sYXN0X2RlbnRyeSA9IG5leHRfZGVudHJ5OworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaHlwZnNfbWFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJldCA9IG5ld19pbm9kZShzYik7CisKKwlpZiAocmV0KSB7CisJCXN0cnVjdCBoeXBmc19zYl9pbmZvICpoeXBmc19pbmZvID0gc2ItPnNfZnNfaW5mbzsKKwkJcmV0LT5pX21vZGUgPSBtb2RlOworCQlyZXQtPmlfdWlkID0gaHlwZnNfaW5mby0+dWlkOworCQlyZXQtPmlfZ2lkID0gaHlwZnNfaW5mby0+Z2lkOworCQlyZXQtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJcmV0LT5pX2Jsb2NrcyA9IDA7CisJCXJldC0+aV9hdGltZSA9IHJldC0+aV9tdGltZSA9IHJldC0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJaWYgKG1vZGUgJiBTX0lGRElSKQorCQkJcmV0LT5pX25saW5rID0gMjsKKwkJZWxzZQorCQkJcmV0LT5pX25saW5rID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaHlwZnNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWtmcmVlKGlub2RlLT51LmdlbmVyaWNfaXApOworCWdlbmVyaWNfZGVsZXRlX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIGludCBoeXBmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWNoYXIgKmRhdGEgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCXN0cnVjdCBoeXBmc19zYl9pbmZvICpmc19pbmZvOworCisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghKGlub2RlLT5pX21vZGUgJiBTX0lXVUdPKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCX0KKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JUlVHTykpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlmc19pbmZvID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlpZihkYXRhKSB7CisJCW11dGV4X2xvY2soJmZzX2luZm8tPmxvY2spOworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBrc3RyZHVwKGRhdGEsIEdGUF9LRVJORUwpOworCQlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkgeworCQkJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5sb2NrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW11dGV4X3VubG9jaygmZnNfaW5mby0+bG9jayk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBoeXBmc19haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIF9fdXNlciBjaGFyICpidWYsCisJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBvZmZzZXQpCit7CisJY2hhciAqZGF0YTsKKwlzaXplX3QgbGVuOworCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKKworCWRhdGEgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJbGVuID0gc3RybGVuKGRhdGEpOworCWlmIChvZmZzZXQgPiBsZW4pIHsKKwkJY291bnQgPSAwOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvdW50ID4gbGVuIC0gb2Zmc2V0KQorCQljb3VudCA9IGxlbiAtIG9mZnNldDsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgZGF0YSArIG9mZnNldCwgY291bnQpKSB7CisJCWNvdW50ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCWlvY2ItPmtpX3BvcyArPSBjb3VudDsKKwlmaWxlX2FjY2Vzc2VkKGZpbHApOworb3V0OgorCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBzc2l6ZV90IGh5cGZzX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBoeXBmc19zYl9pbmZvICpmc19pbmZvOworCisJc2IgPSBpb2NiLT5raV9maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlmc19pbmZvID0gc2ItPnNfZnNfaW5mbzsKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSBvbmx5IGFsbG93IG9uZSB1cGRhdGUgcGVyIHNlY29uZCBmb3IgdHdvIHJlYXNvbnM6CisJICogMS4gZGlhZyAyMDQgaXMgVkVSWSBleHBlbnNpdmUKKwkgKiAyLiBJZiBzZXZlcmFsIHByb2Nlc3NlcyBkbyB1cGRhdGVzIGluIHBhcmFsbGVsIGFuZCB0aGVuIHJlYWQgdGhlCisJICogICAgaHlwZnMgZGF0YSwgdGhlIGxpa2VsaWhvb2Qgb2YgY29sbGlzaW9ucyBpcyByZWR1Y2VkLCBpZiB3ZSByZXN0cmljdAorCSAqICAgIHRoZSBtaW5pbXVtIHVwZGF0ZSBpbnRlcnZhbC4gQSBjb2xsaXNpb24gb2NjdXJzLCBpZiBkdXJpbmcgdGhlCisJICogICAgZGF0YSBnYXRoZXJpbmcgb2Ygb25lIHByb2Nlc3MgYW5vdGhlciBwcm9jZXNzIHRyaWdnZXJzIGFuIHVwZGF0ZQorCSAqICAgIElmIHRoZSBmaXJzdCBwcm9jZXNzIHdhbnRzIHRvIGVuc3VyZSBjb25zaXN0ZW50IGRhdGEsIGl0IGhhcworCSAqICAgIHRvIHJlc3RhcnQgZGF0YSBjb2xsZWN0aW9uIGluIHRoaXMgY2FzZS4KKwkgKi8KKwltdXRleF9sb2NrKCZmc19pbmZvLT5sb2NrKTsKKwlpZiAoZnNfaW5mby0+bGFzdF91cGRhdGUgPT0gZ2V0X3NlY29uZHMoKSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCWh5cGZzX2RlbGV0ZV90cmVlKHNiLT5zX3Jvb3QpOworCXJjID0gaHlwZnNfZGlhZ19jcmVhdGVfZmlsZXMoc2IsIHNiLT5zX3Jvb3QpOworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgImh5cGZzOiBVcGRhdGUgZmFpbGVkXG4iKTsKKwkJaHlwZnNfZGVsZXRlX3RyZWUoc2ItPnNfcm9vdCk7CisJCWdvdG8gb3V0OworCX0KKwloeXBmc191cGRhdGVfdXBkYXRlKHNiKTsKKwlyYyA9IGNvdW50Oworb3V0OgorCW11dGV4X3VubG9jaygmZnNfaW5mby0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGh5cGZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJa2ZyZWUoZmlscC0+cHJpdmF0ZV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworZW51bSB7IG9wdF91aWQsIG9wdF9naWQsIG9wdF9lcnIgfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgaHlwZnNfdG9rZW5zID0geworCXtvcHRfdWlkLCAidWlkPSV1In0sCisJe29wdF9naWQsICJnaWQ9JXUifSwKKwl7b3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgaHlwZnNfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWNoYXIgKnN0cjsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAwOworCXdoaWxlICgoc3RyID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWludCB0b2tlbiwgb3B0aW9uOworCQlzdHJ1Y3QgaHlwZnNfc2JfaW5mbyAqaHlwZnNfaW5mbyA9IHNiLT5zX2ZzX2luZm87CisKKwkJaWYgKCEqc3RyKQorCQkJY29udGludWU7CisJCXRva2VuID0gbWF0Y2hfdG9rZW4oc3RyLCBoeXBmc190b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2Ugb3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaHlwZnNfaW5mby0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaHlwZnNfaW5mby0+Z2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2VycjoKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiaHlwZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gIgorCQkJICAgICAgICJcIiVzXCIgb3IgbWlzc2luZyB2YWx1ZVxuIiwgc3RyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh5cGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcm9vdF9kZW50cnk7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaHlwZnNfc2JfaW5mbyAqc2JpOworCisJc2JpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGh5cGZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJbXV0ZXhfaW5pdCgmc2JpLT5sb2NrKTsKKwlzYmktPnVpZCA9IGN1cnJlbnQtPnVpZDsKKwlzYmktPmdpZCA9IGN1cnJlbnQtPmdpZDsKKwlzYi0+c19mc19pbmZvID0gc2JpOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfbWFnaWMgPSBIWVBGU19NQUdJQzsKKwlzYi0+c19vcCA9ICZoeXBmc19zX29wczsKKwlpZiAoaHlwZnNfcGFyc2Vfb3B0aW9ucyhkYXRhLCBzYikpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJcm9vdF9pbm9kZSA9IGh5cGZzX21ha2VfaW5vZGUoc2IsIFNfSUZESVIgfCAwNzU1KTsKKwlpZiAoIXJvb3RfaW5vZGUpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJcm9vdF9pbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJcm9vdF9pbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCXJvb3RfZGVudHJ5ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcm9vdF9kZW50cnkpIHsKKwkJaXB1dChyb290X2lub2RlKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisJcmMgPSBoeXBmc19kaWFnX2NyZWF0ZV9maWxlcyhzYiwgcm9vdF9kZW50cnkpOworCWlmIChyYykKKwkJZ290byBlcnJfdHJlZTsKKwlzYmktPnVwZGF0ZV9maWxlID0gaHlwZnNfY3JlYXRlX3VwZGF0ZV9maWxlKHNiLCByb290X2RlbnRyeSk7CisJaWYgKElTX0VSUihzYmktPnVwZGF0ZV9maWxlKSkgeworCQlyYyA9IFBUUl9FUlIoc2JpLT51cGRhdGVfZmlsZSk7CisJCWdvdG8gZXJyX3RyZWU7CisJfQorCWh5cGZzX3VwZGF0ZV91cGRhdGUoc2IpOworCXNiLT5zX3Jvb3QgPSByb290X2RlbnRyeTsKKwlyZXR1cm4gMDsKKworZXJyX3RyZWU6CisJaHlwZnNfZGVsZXRlX3RyZWUocm9vdF9kZW50cnkpOworCWRfZ2Vub2NpZGUocm9vdF9kZW50cnkpOworCWRwdXQocm9vdF9kZW50cnkpOworZXJyX2FsbG9jOgorCWtmcmVlKHNiaSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGh5cGZzX2dldF9zdXBlcihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnN0LCBpbnQgZmxhZ3MsCisJCQljb25zdCBjaGFyICpkZXZuYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc3QsIGZsYWdzLCBkYXRhLCBoeXBmc19maWxsX3N1cGVyLCBtbnQpOworfQorCitzdGF0aWMgdm9pZCBoeXBmc19raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGh5cGZzX3NiX2luZm8gKnNiX2luZm8gPSBzYi0+c19mc19pbmZvOworCisJaHlwZnNfZGVsZXRlX3RyZWUoc2ItPnNfcm9vdCk7CisJaHlwZnNfcmVtb3ZlKHNiX2luZm8tPnVwZGF0ZV9maWxlKTsKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlraWxsX2xpdHRlcl9zdXBlcihzYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoeXBmc19jcmVhdGVfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCWNoYXIgKmRhdGEsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBxc3RyIHFuYW1lOworCisJcW5hbWUubmFtZSA9IG5hbWU7CisJcW5hbWUubGVuID0gc3RybGVuKG5hbWUpOworCXFuYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChuYW1lLCBxbmFtZS5sZW4pOworCWRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKG5hbWUsIHBhcmVudCwgc3RybGVuKG5hbWUpKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlub2RlID0gaHlwZnNfbWFrZV9pbm9kZShzYiwgbW9kZSk7CisJaWYgKCFpbm9kZSkgeworCQlkcHV0KGRlbnRyeSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlpZiAobW9kZSAmIFNfSUZSRUcpIHsKKwkJaW5vZGUtPmlfZm9wID0gJmh5cGZzX2ZpbGVfb3BzOworCQlpZiAoZGF0YSkKKwkJCWlub2RlLT5pX3NpemUgPSBzdHJsZW4oZGF0YSk7CisJCWVsc2UKKwkJCWlub2RlLT5pX3NpemUgPSAwOworCX0gZWxzZSBpZiAobW9kZSAmIFNfSUZESVIpIHsKKwkJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCQlwYXJlbnQtPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwl9IGVsc2UKKwkJQlVHKCk7CisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlkZ2V0KGRlbnRyeSk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGRlbnRyeSAqaHlwZnNfbWtkaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlkZW50cnkgPSBoeXBmc19jcmVhdGVfZmlsZShzYiwgcGFyZW50LCBuYW1lLCBOVUxMLCBTX0lGRElSIHwgRElSX01PREUpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJcmV0dXJuIGRlbnRyeTsKKwloeXBmc19hZGRfZGVudHJ5KGRlbnRyeSk7CisJcGFyZW50LT5kX2lub2RlLT5pX25saW5rKys7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmh5cGZzX2NyZWF0ZV91cGRhdGVfZmlsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgICAgICAgc3RydWN0IGRlbnRyeSAqZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWRlbnRyeSA9IGh5cGZzX2NyZWF0ZV9maWxlKHNiLCBkaXIsICJ1cGRhdGUiLCBOVUxMLAorCQkJCSAgIFNfSUZSRUcgfCBVUERBVEVfRklMRV9NT0RFKTsKKwkvKgorCSAqIFdlIGRvIG5vdCBwdXQgdGhlIHVwZGF0ZSBmaWxlIG9uIHRoZSAnZGVsZXRlJyBsaXN0IHdpdGgKKwkgKiBoeXBmc19hZGRfZGVudHJ5KCksIHNpbmNlIGl0IHNob3VsZCBub3QgYmUgcmVtb3ZlZCB3aGVuIHRoZSB0cmVlCisJICogaXMgdXBkYXRlZC4KKwkgKi8KKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpoeXBmc19jcmVhdGVfdTY0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJCQljb25zdCBjaGFyICpuYW1lLCBfX3U2NCB2YWx1ZSkKK3sKKwljaGFyICpidWZmZXI7CisJY2hhciB0bXBbVE1QX1NJWkVdOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCXNucHJpbnRmKHRtcCwgVE1QX1NJWkUsICIlbGxkXG4iLCAodW5zaWduZWQgbG9uZyBsb25nIGludCl2YWx1ZSk7CisJYnVmZmVyID0ga3N0cmR1cCh0bXAsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlkZW50cnkgPQorCSAgICBoeXBmc19jcmVhdGVfZmlsZShzYiwgZGlyLCBuYW1lLCBidWZmZXIsIFNfSUZSRUcgfCBSRUdfRklMRV9NT0RFKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJa2ZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCWh5cGZzX2FkZF9kZW50cnkoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpoeXBmc19jcmVhdGVfc3RyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJCQljb25zdCBjaGFyICpuYW1lLCBjaGFyICpzdHJpbmcpCit7CisJY2hhciAqYnVmZmVyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWJ1ZmZlciA9IGttYWxsb2Moc3RybGVuKHN0cmluZykgKyAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc3ByaW50ZihidWZmZXIsICIlc1xuIiwgc3RyaW5nKTsKKwlkZW50cnkgPQorCSAgICBoeXBmc19jcmVhdGVfZmlsZShzYiwgZGlyLCBuYW1lLCBidWZmZXIsIFNfSUZSRUcgfCBSRUdfRklMRV9NT0RFKTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpIHsKKwkJa2ZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCWh5cGZzX2FkZF9kZW50cnkoZGVudHJ5KTsKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoeXBmc19maWxlX29wcyA9IHsKKwkub3BlbgkJPSBoeXBmc19vcGVuLAorCS5yZWxlYXNlCT0gaHlwZnNfcmVsZWFzZSwKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLmFpb19yZWFkCT0gaHlwZnNfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGh5cGZzX2Fpb193cml0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBoeXBmc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiczM5MF9oeXBmcyIsCisJLmdldF9zYgkJPSBoeXBmc19nZXRfc3VwZXIsCisJLmtpbGxfc2IJPSBoeXBmc19raWxsX3N1cGVyCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaHlwZnNfc19vcHMgPSB7CisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5kcm9wX2lub2RlCT0gaHlwZnNfZHJvcF9pbm9kZSwKK307CisKK3N0YXRpYyBkZWNsX3N1YnN5cyhzMzkwLCBOVUxMLCBOVUxMKTsKKworc3RhdGljIGludCBfX2luaXQgaHlwZnNfaW5pdCh2b2lkKQoreworCWludCByYzsKKworCWlmIChNQUNISU5FX0lTX1ZNKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKGh5cGZzX2RpYWdfaW5pdCgpKSB7CisJCXJjID0gLUVOT0RBVEE7CisJCWdvdG8gZmFpbF9kaWFnOworCX0KKwlrc2V0X3NldF9rc2V0X3MoJnMzOTBfc3Vic3lzLCBoeXBlcnZpc29yX3N1YnN5cyk7CisJcmMgPSBzdWJzeXN0ZW1fcmVnaXN0ZXIoJnMzOTBfc3Vic3lzKTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbF9zeXNmczsKKwlyYyA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmh5cGZzX3R5cGUpOworCWlmIChyYykKKwkJZ290byBmYWlsX2ZpbGVzeXN0ZW07CisJcmV0dXJuIDA7CisKK2ZhaWxfZmlsZXN5c3RlbToKKwlzdWJzeXN0ZW1fdW5yZWdpc3RlcigmczM5MF9zdWJzeXMpOworZmFpbF9zeXNmczoKKwloeXBmc19kaWFnX2V4aXQoKTsKK2ZhaWxfZGlhZzoKKwlwcmludGsoS0VSTl9FUlIgImh5cGZzOiBJbml0aWFsaXphdGlvbiBmYWlsZWQgd2l0aCByYyA9ICVpLlxuIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGh5cGZzX2V4aXQodm9pZCkKK3sKKwloeXBmc19kaWFnX2V4aXQoKTsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmh5cGZzX3R5cGUpOworCXN1YnN5c3RlbV91bnJlZ2lzdGVyKCZzMzkwX3N1YnN5cyk7Cit9CisKK21vZHVsZV9pbml0KGh5cGZzX2luaXQpCittb2R1bGVfZXhpdChoeXBmc19leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAZGUuaWJtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiczM5MCBIeXBlcnZpc29yIEZpbGVzeXN0ZW0iKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwppbmRleCAwYTA0ZTRhLi5iMjgyMDM0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAvKgogICogTWFjaGluZSBzZXR1cC4uCkBAIC02NiwxMSArNjcsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBtZW1vcnlfZW5kOwogCiAvKgotICogU2V0dXAgb3B0aW9ucwotICovCi1leHRlcm4gaW50IF90ZXh0LF9ldGV4dCwgX2VkYXRhLCBfZW5kOwotCi0vKgogICogVGhpcyBpcyBzZXQgdXAgYnkgdGhlIHNldHVwLXJvdXRpbmUgYXQgYm9vdC10aW1lCiAgKiBmb3IgUzM5MCBuZWVkIHRvIGZpbmQgb3V0LCB3aGF0IHdlIGhhdmUgdG8gc2V0dXAKICAqIHVzaW5nIGFkZHJlc3MgMHgxMDQwMCAuLi4KQEAgLTgwLDE1ICs3NiwxMSBAQAogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNvZGVfcmVzb3VyY2UgPSB7CiAJLm5hbWUgID0gIktlcm5lbCBjb2RlIiwKLQkuc3RhcnQgPSAodW5zaWduZWQgbG9uZykgJl90ZXh0LAotCS5lbmQgPSAodW5zaWduZWQgbG9uZykgJl9ldGV4dCAtIDEsCiAJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGRhdGFfcmVzb3VyY2UgPSB7CiAJLm5hbWUgPSAiS2VybmVsIGRhdGEiLAotCS5zdGFydCA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0LAotCS5lbmQgPSAodW5zaWduZWQgbG9uZykgJl9lZGF0YSAtIDEsCiAJLmZsYWdzID0gSU9SRVNPVVJDRV9CVVNZIHwgSU9SRVNPVVJDRV9NRU0sCiB9OwogCkBAIC00MjIsNiArNDE0LDExIEBACiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IGk7CiAKKwljb2RlX3Jlc291cmNlLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpICZfdGV4dDsKKwljb2RlX3Jlc291cmNlLmVuZCA9ICh1bnNpZ25lZCBsb25nKSAmX2V0ZXh0IC0gMTsKKwlkYXRhX3Jlc291cmNlLnN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpICZfZXRleHQ7CisJZGF0YV9yZXNvdXJjZS5lbmQgPSAodW5zaWduZWQgbG9uZykgJl9lZGF0YSAtIDE7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUVNT1JZX0NIVU5LUyAmJiBtZW1vcnlfY2h1bmtbaV0uc2l6ZSA+IDA7IGkrKykgewogCQlyZXMgPSBhbGxvY19ib290bWVtX2xvdyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSk7CiAJCXJlcy0+ZmxhZ3MgPSBJT1JFU09VUkNFX0JVU1kgfCBJT1JFU09VUkNFX01FTTsKZGlmZiAtLWdpdCBhL2FyY2gvc2g2NC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3NoNjQva2VybmVsL3NpZ25hbC5jCmluZGV4IDNlYTg5MjllLi45ZTJmZmM0IDEwMDY0NAotLS0gYS9hcmNoL3NoNjQva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvc2g2NC9rZXJuZWwvc2lnbmFsLmMKQEAgLTQwNyw3ICs0MDcsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIF9fdXNlciAqCiBnZXRfc2lnZnJhbWUoc3RydWN0IGtfc2lnYWN0aW9uICprYSwgdW5zaWduZWQgbG9uZyBzcCwgc2l6ZV90IGZyYW1lX3NpemUpCiB7Ci0JaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAhPSAwICYmICEgb25fc2lnX3N0YWNrKHNwKSkKKwlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICE9IDAgJiYgISBzYXNfc3NfZmxhZ3Moc3ApKQogCQlzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgoc3AgLSBmcmFtZV9zaXplKSAmIC04dWwpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQppbmRleCAxYjgzZTIxLi42NjE2ZWUwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogCSAgICBzeXNfc3BhcmMubyBzdW5vc19hc20ubyBzeXN0YmxzLm8gXAogCSAgICB0aW1lLm8gd2luZG93cy5vIGNwdS5vIGRldmljZXMubyBzY2xvdy5vIFwKIAkgICAgdGFkcG9sZS5vIHRpY2sxNC5vIHB0cmFjZS5vIHN5c19zb2xhcmlzLm8gXAotCSAgICB1bmFsaWduZWQubyBtdWxkaXYubyBzZW1hcGhvcmUubworCSAgICB1bmFsaWduZWQubyBtdWxkaXYubyBzZW1hcGhvcmUubyBwcm9tLm8gb2ZfZGV2aWNlLm8KIAogb2JqLSQoQ09ORklHX1BDSSkgKz0gcGNpYy5vCiBvYmotJChDT05GSUdfU1VONCkgKz0gc3VuNHNldHVwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYyBiL2FyY2gvc3BhcmMva2VybmVsL2VidXMuYwppbmRleCA1YzM1MjljLi5hN2E0ODkyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9lYnVzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZWJ1cy5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9icHAuaD4KIAogc3RydWN0IGxpbnV4X2VidXMgKmVidXNfY2hhaW4gPSBOVUxMOwpAQCAtODMsNzkgKzg0LDgxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19pbml0IGZpbGxfZWJ1c19jaGlsZChpbnQgbm9kZSwgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpwcmVnLAotCQkJCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICpkZXYpCit2b2lkIF9faW5pdCBmaWxsX2VidXNfY2hpbGQoc3RydWN0IGRldmljZV9ub2RlICpkcCwKKwkJCSAgICBzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqZGV2KQogewotCWludCByZWdzW1BST01SRUdfTUFYXTsKLQlpbnQgaXJxc1tQUk9NUkVHX01BWF07Ci0JY2hhciBsYnVmWzEyOF07CisJaW50ICpyZWdzOworCWludCAqaXJxczsKIAlpbnQgaSwgbGVuOwogCi0JZGV2LT5wcm9tX25vZGUgPSBub2RlOwotCXByb21fZ2V0c3RyaW5nKG5vZGUsICJuYW1lIiwgbGJ1Ziwgc2l6ZW9mKGxidWYpKTsKLQlzdHJjcHkoZGV2LT5wcm9tX25hbWUsIGxidWYpOwotCi0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwgKHZvaWQgKilyZWdzLCBzaXplb2YocmVncykpOwotCWlmIChsZW4gPT0gLTEpIGxlbiA9IDA7CisJZGV2LT5wcm9tX25vZGUgPSBkcDsKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7CisJaWYgKCFyZWdzKQorCQlsZW4gPSAwOwogCWRldi0+bnVtX2FkZHJzID0gbGVuIC8gc2l6ZW9mKHJlZ3NbMF0pOwogCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX2FkZHJzOyBpKyspIHsKIAkJaWYgKHJlZ3NbaV0gPj0gZGV2LT5wYXJlbnQtPm51bV9hZGRycykgewogCQkJcHJvbV9wcmludGYoIlVHSDogcHJvcGVydHkgZm9yICVzIHdhcyAlZCwgbmVlZCA8ICVkXG4iLAotCQkJCSAgICBkZXYtPnByb21fbmFtZSwgbGVuLCBkZXYtPnBhcmVudC0+bnVtX2FkZHJzKTsKKwkJCQkgICAgZGV2LT5wcm9tX25vZGUtPm5hbWUsIGxlbiwKKwkJCQkgICAgZGV2LT5wYXJlbnQtPm51bV9hZGRycyk7CiAJCQlwYW5pYyhfX0ZVTkNUSU9OX18pOwogCQl9Ci0JCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSBkZXYtPnBhcmVudC0+cmVzb3VyY2VbcmVnc1tpXV0uc3RhcnQ7IC8qIFhYWCByZXNvdXJjZSAqLworCisJCS8qIFhYWCByZXNvdXJjZSAqLworCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0KKwkJCWRldi0+cGFyZW50LT5yZXNvdXJjZVtyZWdzW2ldXS5zdGFydDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgUFJPTUlOVFJfTUFYOyBpKyspCiAJCWRldi0+aXJxc1tpXSA9IFBDSV9JUlFfTk9ORTsKIAotCWlmICgoZGV2LT5pcnFzWzBdID0gZWJ1c19ibGFja2xpc3RfaXJxKGRldi0+cHJvbV9uYW1lKSkgIT0gMCkgeworCWlmICgoZGV2LT5pcnFzWzBdID0gZWJ1c19ibGFja2xpc3RfaXJxKGRldi0+cHJvbV9ub2RlLT5uYW1lKSkgIT0gMCkgewogCQlkZXYtPm51bV9pcnFzID0gMTsKLQl9IGVsc2UgaWYgKChsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJpbnRlcnJ1cHRzIiwKLQkgICAgKGNoYXIgKikmaXJxcywgc2l6ZW9mKGlycXMpKSkgPT0gLTEgfHwgbGVuID09IDApIHsKLQkJZGV2LT5udW1faXJxcyA9IDA7Ci0JCWRldi0+aXJxc1swXSA9IDA7Ci0JCWlmIChkZXYtPnBhcmVudC0+bnVtX2lycXMgIT0gMCkgewotCQkJZGV2LT5udW1faXJxcyA9IDE7Ci0JCQlkZXYtPmlycXNbMF0gPSBkZXYtPnBhcmVudC0+aXJxc1swXTsKLS8qIFAzICovIC8qIHByaW50aygiRUJVUzogZGV2ICVzIGlycSAlZCBmcm9tIHBhcmVudFxuIiwgZGV2LT5wcm9tX25hbWUsIGRldi0+aXJxc1swXSk7ICovCi0JCX0KIAl9IGVsc2UgewotCQlkZXYtPm51bV9pcnFzID0gbGVuIC8gc2l6ZW9mKGlycXNbMF0pOwotCQlpZiAoaXJxc1swXSA9PSAwIHx8IGlycXNbMF0gPj0gOCkgewotCQkJLyoKLQkJCSAqIFhYWCBaZXJvIGlzIGEgdmFsaWQgcGluIG51bWJlci4uLgotCQkJICogVGhpcyB3b3JrcyBhcyBsb25nIGFzIEVidXMgaXMgbm90IHdpcmVkIHRvIElOVEEjLgotCQkJICovCi0JCQlwcmludGsoIkVCVVM6ICVzIGdvdCBiYWQgaXJxICVkIGZyb20gUFJPTVxuIiwKLQkJCSAgICBkZXYtPnByb21fbmFtZSwgaXJxc1swXSk7CisJCWlycXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7CisJCWlmICghaXJxcykgewogCQkJZGV2LT5udW1faXJxcyA9IDA7CiAJCQlkZXYtPmlycXNbMF0gPSAwOworCQkJaWYgKGRldi0+cGFyZW50LT5udW1faXJxcyAhPSAwKSB7CisJCQkJZGV2LT5udW1faXJxcyA9IDE7CisJCQkJZGV2LT5pcnFzWzBdID0gZGV2LT5wYXJlbnQtPmlycXNbMF07CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlkZXYtPmlycXNbMF0gPSBwY2ljX3Bpbl90b19pcnEoaXJxc1swXSwgZGV2LT5wcm9tX25hbWUpOworCQkJZGV2LT5udW1faXJxcyA9IGxlbiAvIHNpemVvZihpcnFzWzBdKTsKKwkJCWlmIChpcnFzWzBdID09IDAgfHwgaXJxc1swXSA+PSA4KSB7CisJCQkJLyoKKwkJCQkgKiBYWFggWmVybyBpcyBhIHZhbGlkIHBpbiBudW1iZXIuLi4KKwkJCQkgKiBUaGlzIHdvcmtzIGFzIGxvbmcgYXMgRWJ1cyBpcyBub3Qgd2lyZWQKKwkJCQkgKiB0byBJTlRBIy4KKwkJCQkgKi8KKwkJCQlwcmludGsoIkVCVVM6ICVzIGdvdCBiYWQgaXJxICVkIGZyb20gUFJPTVxuIiwKKwkJCQkgICAgICAgZGV2LT5wcm9tX25vZGUtPm5hbWUsIGlycXNbMF0pOworCQkJCWRldi0+bnVtX2lycXMgPSAwOworCQkJCWRldi0+aXJxc1swXSA9IDA7CisJCQl9IGVsc2UgeworCQkJCWRldi0+aXJxc1swXSA9CisJCQkJCXBjaWNfcGluX3RvX2lycShpcnFzWzBdLAorCQkJCQkJCWRldi0+cHJvbV9ub2RlLT5uYW1lKTsKKwkJCX0KIAkJfQogCX0KIH0KIAotdm9pZCBfX2luaXQgZmlsbF9lYnVzX2RldmljZShpbnQgbm9kZSwgc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICpkZXYpCit2b2lkIF9faW5pdCBmaWxsX2VidXNfZGV2aWNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyByZWdzW1BST01SRUdfTUFYXTsKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CiAJc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKmNoaWxkOwotCWludCBpcnFzW1BST01JTlRSX01BWF07Ci0JY2hhciBsYnVmWzEyOF07CisJaW50ICppcnFzOwogCWludCBpLCBuLCBsZW47CiAJdW5zaWduZWQgbG9uZyBiYXNlYWRkcjsKIAotCWRldi0+cHJvbV9ub2RlID0gbm9kZTsKLQlwcm9tX2dldHN0cmluZyhub2RlLCAibmFtZSIsIGxidWYsIHNpemVvZihsYnVmKSk7Ci0Jc3RyY3B5KGRldi0+cHJvbV9uYW1lLCBsYnVmKTsKKwlkZXYtPnByb21fbm9kZSA9IGRwOwogCi0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwgKHZvaWQgKilyZWdzLCBzaXplb2YocmVncykpOworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCAmbGVuKTsKIAlpZiAobGVuICUgc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykpIHsKIAkJcHJvbV9wcmludGYoIlVHSDogcHJvcGxlbiBmb3IgJXMgd2FzICVkLCBuZWVkIG11bHRpcGxlIG9mICVkXG4iLAotCQkJICAgIGRldi0+cHJvbV9uYW1lLCBsZW4sCisJCQkgICAgZGV2LT5wcm9tX25vZGUtPm5hbWUsIGxlbiwKIAkJCSAgICAoaW50KXNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpKTsKIAkJcGFuaWMoX19GVU5DVElPTl9fKTsKIAl9CkBAIC0xOTcsNyArMjAwLDcgQEAKIAkJCWlmICgoYmFzZWFkZHIgPSAodW5zaWduZWQgbG9uZykgaW9yZW1hcChiYXNlYWRkciwKIAkJCSAgICByZWdzW2ldLnJlZ19zaXplKSkgPT0gMCkgewogCQkJCXBhbmljKCJlYnVzOiB1bmFibGUgdG8gcmVtYXAgZGV2ICVzIiwKLQkJCQkgICAgZGV2LT5wcm9tX25hbWUpOworCQkJCSAgICAgIGRldi0+cHJvbV9ub2RlLT5uYW1lKTsKIAkJCX0KIAkJfQogCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gYmFzZWFkZHI7CS8qIFhYWCBVbmFsaWduZWQgKi8KQEAgLTIwNiwyOSArMjA5LDQzIEBACiAJZm9yIChpID0gMDsgaSA8IFBST01JTlRSX01BWDsgaSsrKQogCQlkZXYtPmlycXNbaV0gPSBQQ0lfSVJRX05PTkU7CiAKLQlpZiAoKGRldi0+aXJxc1swXSA9IGVidXNfYmxhY2tsaXN0X2lycShkZXYtPnByb21fbmFtZSkpICE9IDApIHsKKwlpZiAoKGRldi0+aXJxc1swXSA9IGVidXNfYmxhY2tsaXN0X2lycShkZXYtPnByb21fbm9kZS0+bmFtZSkpICE9IDApIHsKIAkJZGV2LT5udW1faXJxcyA9IDE7Ci0JfSBlbHNlIGlmICgobGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0cyIsCi0JICAgIChjaGFyICopJmlycXMsIHNpemVvZihpcnFzKSkpID09IC0xIHx8IGxlbiA9PSAwKSB7Ci0JCWRldi0+bnVtX2lycXMgPSAwOwotCQlpZiAoKGRldi0+aXJxc1swXSA9IGRldi0+YnVzLT5zZWxmLT5pcnEpICE9IDApIHsKLQkJCSBkZXYtPm51bV9pcnFzID0gMTsKLS8qIFAzICovIC8qIHByaW50aygiRUJVUzogY2hpbGQgJXMgaXJxICVkIGZyb20gcGFyZW50XG4iLCBkZXYtPnByb21fbmFtZSwgZGV2LT5pcnFzWzBdKTsgKi8KLQkJfQogCX0gZWxzZSB7Ci0JCWRldi0+bnVtX2lycXMgPSAxOyAgLyogZGV2LT5udW1faXJxcyA9IGxlbiAvIHNpemVvZihpcnFzWzBdKTsgKi8KLQkJaWYgKGlycXNbMF0gPT0gMCB8fCBpcnFzWzBdID49IDgpIHsKLQkJCS8qIFNlZSBhYm92ZSBmb3IgdGhlIHBhcmVudC4gWFhYICovCi0JCQlwcmludGsoIkVCVVM6ICVzIGdvdCBiYWQgaXJxICVkIGZyb20gUFJPTVxuIiwKLQkJCSAgICBkZXYtPnByb21fbmFtZSwgaXJxc1swXSk7CisJCWlycXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7CisJCWlmICghaXJxcykgewogCQkJZGV2LT5udW1faXJxcyA9IDA7Ci0JCQlkZXYtPmlycXNbMF0gPSAwOworCQkJaWYgKChkZXYtPmlycXNbMF0gPSBkZXYtPmJ1cy0+c2VsZi0+aXJxKSAhPSAwKSB7CisJCQkJZGV2LT5udW1faXJxcyA9IDE7CisvKiBQMyAqLyAvKiBwcmludGsoIkVCVVM6IGNoaWxkICVzIGlycSAlZCBmcm9tIHBhcmVudFxuIiwgZGV2LT5wcm9tX25hbWUsIGRldi0+aXJxc1swXSk7ICovCisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlkZXYtPmlycXNbMF0gPSBwY2ljX3Bpbl90b19pcnEoaXJxc1swXSwgZGV2LT5wcm9tX25hbWUpOworCQkJZGV2LT5udW1faXJxcyA9IDE7ICAvKiBkZXYtPm51bV9pcnFzID0gbGVuIC8gc2l6ZW9mKGlycXNbMF0pOyAqLworCQkJaWYgKGlycXNbMF0gPT0gMCB8fCBpcnFzWzBdID49IDgpIHsKKwkJCQkvKiBTZWUgYWJvdmUgZm9yIHRoZSBwYXJlbnQuIFhYWCAqLworCQkJCXByaW50aygiRUJVUzogJXMgZ290IGJhZCBpcnEgJWQgZnJvbSBQUk9NXG4iLAorCQkJCSAgICAgICBkZXYtPnByb21fbm9kZS0+bmFtZSwgaXJxc1swXSk7CisJCQkJZGV2LT5udW1faXJxcyA9IDA7CisJCQkJZGV2LT5pcnFzWzBdID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJZGV2LT5pcnFzWzBdID0KKwkJCQkJcGNpY19waW5fdG9faXJxKGlycXNbMF0sCisJCQkJCQkJZGV2LT5wcm9tX25vZGUtPm5hbWUpOworCQkJfQogCQl9CiAJfQogCi0JaWYgKChub2RlID0gcHJvbV9nZXRjaGlsZChub2RlKSkpIHsKKwlkZXYtPm9mZGV2Lm5vZGUgPSBkcDsKKwlkZXYtPm9mZGV2LmRldi5wYXJlbnQgPSAmZGV2LT5idXMtPm9mZGV2LmRldjsKKwlkZXYtPm9mZGV2LmRldi5idXMgPSAmZWJ1c19idXNfdHlwZTsKKwlzdHJjcHkoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisKKwkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KKwlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAorCQkgICAgICAgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKworCWlmICgoZHAgPSBkcC0+Y2hpbGQpICE9IE5VTEwpIHsKIAkJZGV2LT5jaGlsZHJlbiA9IChzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqKQogCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKIApAQCAtMjM2LDkgKzI1Myw5IEBACiAJCWNoaWxkLT5uZXh0ID0gTlVMTDsKIAkJY2hpbGQtPnBhcmVudCA9IGRldjsKIAkJY2hpbGQtPmJ1cyA9IGRldi0+YnVzOwotCQlmaWxsX2VidXNfY2hpbGQobm9kZSwgJnJlZ3NbMF0sIGNoaWxkKTsKKwkJZmlsbF9lYnVzX2NoaWxkKGRwLCBjaGlsZCk7CiAKLQkJd2hpbGUgKChub2RlID0gcHJvbV9nZXRzaWJsaW5nKG5vZGUpKSAhPSAwKSB7CisJCXdoaWxlICgoZHAgPSBkcC0+c2libGluZykgIT0gTlVMTCkgewogCQkJY2hpbGQtPm5leHQgPSAoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgKikKIAkJCQllYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCkpOwogCkBAIC0yNDYsNTEgKzI2Myw0OSBAQAogCQkJY2hpbGQtPm5leHQgPSBOVUxMOwogCQkJY2hpbGQtPnBhcmVudCA9IGRldjsKIAkJCWNoaWxkLT5idXMgPSBkZXYtPmJ1czsKLQkJCWZpbGxfZWJ1c19jaGlsZChub2RlLCAmcmVnc1swXSwgY2hpbGQpOworCQkJZmlsbF9lYnVzX2NoaWxkKGRwLCBjaGlsZCk7CiAJCX0KIAl9CiB9CiAKIHZvaWQgX19pbml0IGVidXNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgcmVnc1tQUk9NUkVHX01BWF07CisJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKIAlzdHJ1Y3QgbGludXhfcGJtX2luZm8gKnBibTsKIAlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKIAlzdHJ1Y3QgZWJ1c19zeXN0ZW1fZW50cnkgKnNwOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWU7Ci0JY2hhciBsYnVmWzEyOF07CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAl1bnNpZ25lZCBsb25nIGFkZHIsICpiYXNlOwogCXVuc2lnbmVkIHNob3J0IHBjaV9jb21tYW5kOwotCWludCBuZCwgbGVuLCBlYnVzbmQ7Ci0JaW50IHJlZywgbnJlZzsKKwlpbnQgbGVuLCByZWcsIG5yZWc7CiAJaW50IG51bV9lYnVzID0gMDsKIAotCXByb21fZ2V0c3RyaW5nKHByb21fcm9vdF9ub2RlLCAibmFtZSIsIGxidWYsIHNpemVvZihsYnVmKSk7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWZvciAoc3AgPSBlYnVzX2JsYWNrbGlzdDsgc3AtPmVzbmFtZSAhPSBOVUxMOyBzcCsrKSB7Ci0JCWlmIChzdHJjbXAobGJ1Ziwgc3AtPmVzbmFtZSkgPT0gMCkgeworCQlpZiAoc3RyY21wKGRwLT5uYW1lLCBzcC0+ZXNuYW1lKSA9PSAwKSB7CiAJCQllYnVzX2JsYWNrcCA9IHNwLT5pcHQ7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1NVTiwgUENJX0RFVklDRV9JRF9TVU5fRUJVUywgTlVMTCk7Ci0JaWYgKCFwZGV2KSB7CisJaWYgKCFwZGV2KQogCQlyZXR1cm47Ci0JfQorCiAJY29va2llID0gcGRldi0+c3lzZGF0YTsKLQllYnVzbmQgPSBjb29raWUtPnByb21fbm9kZTsKKwlkcCA9IGNvb2tpZS0+cHJvbV9ub2RlOwogCiAJZWJ1c19jaGFpbiA9IGVidXMgPSAoc3RydWN0IGxpbnV4X2VidXMgKikKIAkJCWVidXNfYWxsb2Moc2l6ZW9mKHN0cnVjdCBsaW51eF9lYnVzKSk7CiAJZWJ1cy0+bmV4dCA9IE5VTEw7CiAKLQl3aGlsZSAoZWJ1c25kKSB7CisJd2hpbGUgKGRwKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbmQ7CiAKLQkJcHJvbV9nZXRzdHJpbmcoZWJ1c25kLCAibmFtZSIsIGxidWYsIHNpemVvZihsYnVmKSk7Ci0JCWVidXMtPnByb21fbm9kZSA9IGVidXNuZDsKLQkJc3RyY3B5KGVidXMtPnByb21fbmFtZSwgbGJ1Zik7CisJCWVidXMtPnByb21fbm9kZSA9IGRwOwogCQllYnVzLT5zZWxmID0gcGRldjsKIAkJZWJ1cy0+cGFyZW50ID0gcGJtID0gY29va2llLT5wYm07CiAKQEAgLTI5OSw5ICszMTQsOCBAQAogCQlwY2lfY29tbWFuZCB8PSBQQ0lfQ09NTUFORF9NQVNURVI7CiAJCXBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgcGNpX2NvbW1hbmQpOwogCi0JCWxlbiA9IHByb21fZ2V0cHJvcGVydHkoZWJ1c25kLCAicmVnIiwgKHZvaWQgKilyZWdzLAotCQkJCSAgICAgICBzaXplb2YocmVncykpOwotCQlpZiAobGVuID09IDAgfHwgbGVuID09IC0xKSB7CisJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCAmbGVuKTsKKwkJaWYgKCFyZWdzKSB7CiAJCQlwcm9tX3ByaW50ZigiJXM6IGNhbid0IGZpbmQgcmVnIHByb3BlcnR5XG4iLAogCQkJCSAgICBfX0ZVTkNUSU9OX18pOwogCQkJcHJvbV9oYWx0KCk7CkBAIC0zMTcsNyArMzMxLDE4IEBACiAJCQkqYmFzZSsrID0gYWRkcjsKIAkJfQogCi0JCW5kID0gcHJvbV9nZXRjaGlsZChlYnVzbmQpOworCQllYnVzLT5vZmRldi5ub2RlID0gZHA7CisJCWVidXMtPm9mZGV2LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCQllYnVzLT5vZmRldi5kZXYuYnVzID0gJmVidXNfYnVzX3R5cGU7CisJCXN0cmNweShlYnVzLT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisKKwkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCisJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmVidXMtPm9mZGV2KSAhPSAwKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImVidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKKwkJCSAgICAgICBlYnVzLT5vZmRldi5kZXYuYnVzX2lkKTsKKworCisJCW5kID0gZHAtPmNoaWxkOwogCQlpZiAoIW5kKQogCQkJZ290byBuZXh0X2VidXM7CiAKQEAgLTMzMCw3ICszNTUsNyBAQAogCQlkZXYtPmJ1cyA9IGVidXM7CiAJCWZpbGxfZWJ1c19kZXZpY2UobmQsIGRldik7CiAKLQkJd2hpbGUgKChuZCA9IHByb21fZ2V0c2libGluZyhuZCkpICE9IDApIHsKKwkJd2hpbGUgKChuZCA9IG5kLT5zaWJsaW5nKSAhPSBOVUxMKSB7CiAJCQlkZXYtPm5leHQgPSAoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICopCiAJCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlKSk7CiAKQEAgLTM0OCw3ICszNzMsNyBAQAogCQkJYnJlYWs7CiAKIAkJY29va2llID0gcGRldi0+c3lzZGF0YTsKLQkJZWJ1c25kID0gY29va2llLT5wcm9tX25vZGU7CisJCWRwID0gY29va2llLT5wcm9tX25vZGU7CiAKIAkJZWJ1cy0+bmV4dCA9IChzdHJ1Y3QgbGludXhfZWJ1cyAqKQogCQkJZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXMpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKaW5kZXggZjlmZjI5Ny4uYWU0YzY2NyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKQEAgLTM5LDYgKzM5LDggQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdmFkZHJzLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CkBAIC0yMjQsMTAgKzIyNiw1NCBAQAogCiAjaWZkZWYgQ09ORklHX1NCVVMKIAotdm9pZCBzYnVzX3NldF9zYnVzNjQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBpbnQgeCkgewordm9pZCBzYnVzX3NldF9zYnVzNjQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBpbnQgeCkKK3sKIAlwcmludGsoInNidXNfc2V0X3NidXM2NDogdW5zdXBwb3J0ZWRcbiIpOwogfQogCitleHRlcm4gdW5zaWduZWQgaW50IHN1bjRkX2J1aWxkX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBpcnEpOwordm9pZCBfX2luaXQgc2J1c19maWxsX2RldmljZV9pcnEoc3RydWN0IHNidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBsaW51eF9wcm9tX2lycXMgaXJxc1tQUk9NSU5UUl9NQVhdOworCWludCBsZW47CisKKwlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImludHIiLAorCQkJICAgICAgIChjaGFyICopaXJxcywgc2l6ZW9mKGlycXMpKTsKKwlpZiAobGVuICE9IC0xKSB7CisJCXNkZXYtPm51bV9pcnFzID0gbGVuIC8gODsKKwkJaWYgKHNkZXYtPm51bV9pcnFzID09IDApIHsKKwkJCXNkZXYtPmlycXNbMF0gPSAwOworCQl9IGVsc2UgaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgeworCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzZGV2LT5udW1faXJxczsgbGVuKyspCisJCQkJc2Rldi0+aXJxc1tsZW5dID0KKwkJCQkJc3VuNGRfYnVpbGRfaXJxKHNkZXYsIGlycXNbbGVuXS5wcmkpOworCQl9IGVsc2UgeworCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzZGV2LT5udW1faXJxczsgbGVuKyspCisJCQkJc2Rldi0+aXJxc1tsZW5dID0gaXJxc1tsZW5dLnByaTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBpbnRlcnJ1cHRzW1BST01JTlRSX01BWF07CisKKwkJLyogTm8gImludHIiIG5vZGUgZm91bmQtLSBjaGVjayBmb3IgImludGVycnVwdHMiIG5vZGUuCisJCSAqIFRoaXMgbm9kZSBjb250YWlucyBTQnVzIGludGVycnVwdCBsZXZlbHMsIG5vdCBJUExzCisJCSAqIGFzIGluICJpbnRyIiwgYW5kIG5vIHZlY3RvciB2YWx1ZXMuICBXZSBjb252ZXJ0CisJCSAqIFNCdXMgaW50ZXJydXB0IGxldmVscyB0byBQSUxzIChwbGF0Zm9ybSBzcGVjaWZpYykuCisJCSAqLworCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImludGVycnVwdHMiLAorCQkJCSAgICAgICAoY2hhciAqKWludGVycnVwdHMsIHNpemVvZihpbnRlcnJ1cHRzKSk7CisJCWlmIChsZW4gPT0gLTEpIHsKKwkJCXNkZXYtPmlycXNbMF0gPSAwOworCQkJc2Rldi0+bnVtX2lycXMgPSAwOworCQl9IGVsc2UgeworCQkJc2Rldi0+bnVtX2lycXMgPSBsZW4gLyBzaXplb2YoaW50KTsKKwkJCWZvciAobGVuID0gMDsgbGVuIDwgc2Rldi0+bnVtX2lycXM7IGxlbisrKSB7CisJCQkJc2Rldi0+aXJxc1tsZW5dID0KKwkJCQkJc2JpbnRfdG9faXJxKHNkZXYsIGludGVycnVwdHNbbGVuXSk7CisJCQl9CisJCX0KKwl9IAorfQorCiAvKgogICogQWxsb2NhdGUgYSBjaHVuayBvZiBtZW1vcnkgc3VpdGFibGUgZm9yIERNQS4KICAqIFR5cGljYWxseSBkZXZpY2VzIHVzZSB0aGVtIGZvciBjb250cm9sIGJsb2Nrcy4KQEAgLTQxNCw2ICs0NjAsODkgQEAKIHsKIAlwcmludGsoInNidXNfZG1hX3N5bmNfc2dfZm9yX2RldmljZTogbm90IGltcGxlbWVudGVkIHlldFxuIik7CiB9CisKKy8qIFN1cHBvcnQgY29kZSBmb3Igc2J1c19pbml0KCkuICAqLworLyoKKyAqIFhYWCBUaGlzIGZ1bmN0aW9ucyBhcHBlYXJzIHRvIGJlIGEgZGlzdG9ydGVkIHZlcnNpb24gb2YKKyAqIHByb21fc2J1c19yYW5nZXNfaW5pdCgpLCB3aXRoIGFsbCBzdW40ZCBzdHVmZiBjdXQgYXdheS4KKyAqIEFzayBEYXZlTSB3aGF0IGlzIGdvaW5nIG9uIGhlcmUsIGhvdyBpcyBzdW40ZCBzdXBwb3NlZCB0byB3b3JrLi4uIFhYWAorICovCisvKiBhZGRlZCBiYWNrIHN1bjRkIHBhdGNoIGZyb20gVGhvbWFzIEJvZ2VuZG9lcmZlciAtIHNob3VsZCBiZSBPSyAoY3JuKSAqLwordm9pZCBfX2luaXQgc2J1c19hcmNoX2J1c19yYW5nZXNfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKnBuLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCit7CisJaW50IHBhcmVudF9ub2RlID0gcG4tPm5vZGU7CisKKwlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcyBpb3VuaXRfcmFuZ2VzW1BST01SRUdfTUFYXTsKKwkJaW50IG51bV9pb3VuaXRfcmFuZ2VzLCBsZW47CisKKwkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShwYXJlbnRfbm9kZSwgInJhbmdlcyIsCisJCQkJICAgICAgIChjaGFyICopIGlvdW5pdF9yYW5nZXMsCisJCQkJICAgICAgIHNpemVvZiAoaW91bml0X3JhbmdlcykpOworCQlpZiAobGVuICE9IC0xKSB7CisJCQludW1faW91bml0X3JhbmdlcyA9CisJCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwkJCXByb21fYWRqdXN0X3JhbmdlcyhzYnVzLT5zYnVzX3JhbmdlcywKKwkJCQkJICAgc2J1cy0+bnVtX3NidXNfcmFuZ2VzLAorCQkJCQkgICBpb3VuaXRfcmFuZ2VzLCBudW1faW91bml0X3Jhbmdlcyk7CisJCX0KKwl9Cit9CisKK3ZvaWQgX19pbml0IHNidXNfc2V0dXBfaW9tbXUoc3RydWN0IHNidXNfYnVzICpzYnVzLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50ID0gZHAtPnBhcmVudDsKKworCWlmIChzcGFyY19jcHVfbW9kZWwgIT0gc3VuNGQgJiYKKwkgICAgcGFyZW50ICE9IE5VTEwgJiYKKwkgICAgIXN0cmNtcChwYXJlbnQtPm5hbWUsICJpb21tdSIpKSB7CisJCWV4dGVybiB2b2lkIGlvbW11X2luaXQoaW50IGlvbW11X25vZGUsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cyk7CisKKwkJaW9tbXVfaW5pdChwYXJlbnQtPm5vZGUsIHNidXMpOworCX0KKworCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKKwkJZXh0ZXJuIHZvaWQgaW91bml0X2luaXQoaW50IHNiaV9ub2RlLCBpbnQgaW91bml0X25vZGUsCisJCQkJCXN0cnVjdCBzYnVzX2J1cyAqc2J1cyk7CisKKwkJaW91bml0X2luaXQoZHAtPm5vZGUsIHBhcmVudC0+bm9kZSwgc2J1cyk7CisJfQorfQorCit2b2lkIF9faW5pdCBzYnVzX3NldHVwX2FyY2hfcHJvcHMoc3RydWN0IHNidXNfYnVzICpzYnVzLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OworCisJCXNidXMtPmRldmlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHBhcmVudCwgImRldmljZS1pZCIsIDApOworCQlzYnVzLT5ib2FyZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChwYXJlbnQsICJib2FyZCMiLCAwKTsKKwl9Cit9CisKK2ludCBfX2luaXQgc2J1c19hcmNoX3ByZWluaXQodm9pZCkKK3sKKwlleHRlcm4gdm9pZCByZWdpc3Rlcl9wcm9jX3NwYXJjX2lvcG9ydCh2b2lkKTsKKworCXJlZ2lzdGVyX3Byb2Nfc3BhcmNfaW9wb3J0KCk7CisKKyNpZmRlZiBDT05GSUdfU1VONAorCXsKKwkJZXh0ZXJuIHZvaWQgc3VuNF9kdm1hX2luaXQodm9pZCk7CisJCXN1bjRfZHZtYV9pbml0KCk7CisJfQorCXJldHVybiAxOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lkIF9faW5pdCBzYnVzX2FyY2hfcG9zdGluaXQodm9pZCkKK3sKKwlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKSB7CisJCWV4dGVybiB2b2lkIHN1bjRkX2luaXRfc2JpX2lycSh2b2lkKTsKKwkJc3VuNGRfaW5pdF9zYmlfaXJxKCk7CisJfQorfQogI2VuZGlmIC8qIENPTkZJR19TQlVTICovCiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmMva2VybmVsL29mX2RldmljZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWI4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9vZl9kZXZpY2UuYwpAQCAtMCwwICsxLDI2OCBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CisKKy8qKgorICogb2ZfbWF0Y2hfZGV2aWNlIC0gVGVsbCBpZiBhbiBvZl9kZXZpY2Ugc3RydWN0dXJlIGhhcyBhIG1hdGNoaW5nCisgKiBvZl9tYXRjaCBzdHJ1Y3R1cmUKKyAqIEBpZHM6IGFycmF5IG9mIG9mIGRldmljZSBtYXRjaCBzdHJ1Y3R1cmVzIHRvIHNlYXJjaCBpbgorICogQGRldjogdGhlIG9mIGRldmljZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggYWdhaW5zdAorICoKKyAqIFVzZWQgYnkgYSBkcml2ZXIgdG8gY2hlY2sgd2hldGhlciBhbiBvZl9kZXZpY2UgcHJlc2VudCBpbiB0aGUKKyAqIHN5c3RlbSBpcyBpbiBpdHMgbGlzdCBvZiBzdXBwb3J0ZWQgZGV2aWNlcy4KKyAqLworY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfbWF0Y2hfZGV2aWNlKGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMsCisJCQkJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlpZiAoIWRldi0+bm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUgKG1hdGNoZXMtPm5hbWVbMF0gfHwgbWF0Y2hlcy0+dHlwZVswXSB8fCBtYXRjaGVzLT5jb21wYXRpYmxlWzBdKSB7CisJCWludCBtYXRjaCA9IDE7CisJCWlmIChtYXRjaGVzLT5uYW1lWzBdKQorCQkJbWF0Y2ggJj0gZGV2LT5ub2RlLT5uYW1lCisJCQkJJiYgIXN0cmNtcChtYXRjaGVzLT5uYW1lLCBkZXYtPm5vZGUtPm5hbWUpOworCQlpZiAobWF0Y2hlcy0+dHlwZVswXSkKKwkJCW1hdGNoICY9IGRldi0+bm9kZS0+dHlwZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+dHlwZSwgZGV2LT5ub2RlLT50eXBlKTsKKwkJaWYgKG1hdGNoZXMtPmNvbXBhdGlibGVbMF0pCisJCQltYXRjaCAmPSBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm5vZGUsCisJCQkJCQkJIG1hdGNoZXMtPmNvbXBhdGlibGUpOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbWF0Y2hlczsKKwkJbWF0Y2hlcysrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBvZl9wbGF0Zm9ybV9idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogb2ZfZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRydik7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqIG1hdGNoZXMgPSBvZl9kcnYtPm1hdGNoX3RhYmxlOworCisJaWYgKCFtYXRjaGVzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBvZl9tYXRjaF9kZXZpY2UobWF0Y2hlcywgb2ZfZGV2KSAhPSBOVUxMOworfQorCitzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9kZXZfZ2V0KHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICp0bXA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisJdG1wID0gZ2V0X2RldmljZSgmZGV2LT5kZXYpOworCWlmICh0bXApCisJCXJldHVybiB0b19vZl9kZXZpY2UodG1wKTsKKwllbHNlCisJCXJldHVybiBOVUxMOworfQorCit2b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KQoreworCWlmIChkZXYpCisJCXB1dF9kZXZpY2UoJmRldi0+ZGV2KTsKK30KKworCitzdGF0aWMgaW50IG9mX2RldmljZV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVycm9yID0gLUVOT0RFVjsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICpkcnY7CisJc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKworCWlmICghZHJ2LT5wcm9iZSkKKwkJcmV0dXJuIGVycm9yOworCisJb2ZfZGV2X2dldChvZl9kZXYpOworCisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2UoZHJ2LT5tYXRjaF90YWJsZSwgb2ZfZGV2KTsKKwlpZiAobWF0Y2gpCisJCWVycm9yID0gZHJ2LT5wcm9iZShvZl9kZXYsIG1hdGNoKTsKKwlpZiAoZXJyb3IpCisJCW9mX2Rldl9wdXQob2ZfZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBvZl9kZXZpY2VfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5yZW1vdmUpCisJCWRydi0+cmVtb3ZlKG9mX2Rldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zdXNwZW5kKQorCQllcnJvciA9IGRydi0+c3VzcGVuZChvZl9kZXYsIHN0YXRlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQorCQllcnJvciA9IGRydi0+cmVzdW1lKG9mX2Rldik7CisJcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RydWN0IGJ1c190eXBlIGVidXNfYnVzX3R5cGUgPSB7CisgICAgICAgLm5hbWUJPSAiZWJ1cyIsCisgICAgICAgLm1hdGNoCT0gb2ZfcGxhdGZvcm1fYnVzX21hdGNoLAorICAgICAgIC5wcm9iZQk9IG9mX2RldmljZV9wcm9iZSwKKyAgICAgICAucmVtb3ZlCT0gb2ZfZGV2aWNlX3JlbW92ZSwKKyAgICAgICAuc3VzcGVuZAk9IG9mX2RldmljZV9zdXNwZW5kLAorICAgICAgIC5yZXN1bWUJPSBvZl9kZXZpY2VfcmVzdW1lLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0cnVjdCBidXNfdHlwZSBzYnVzX2J1c190eXBlID0geworICAgICAgIC5uYW1lCT0gInNidXMiLAorICAgICAgIC5tYXRjaAk9IG9mX3BsYXRmb3JtX2J1c19tYXRjaCwKKyAgICAgICAucHJvYmUJPSBvZl9kZXZpY2VfcHJvYmUsCisgICAgICAgLnJlbW92ZQk9IG9mX2RldmljZV9yZW1vdmUsCisgICAgICAgLnN1c3BlbmQJPSBvZl9kZXZpY2Vfc3VzcGVuZCwKKyAgICAgICAucmVzdW1lCT0gb2ZfZGV2aWNlX3Jlc3VtZSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgb2ZfYnVzX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKyNpZmRlZiBDT05GSUdfUENJCisJaWYgKCFlcnIpCisJCWVyciA9IGJ1c19yZWdpc3RlcigmZWJ1c19idXNfdHlwZSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0JVUworCWlmICghZXJyKQorCQllcnIgPSBidXNfcmVnaXN0ZXIoJnNidXNfYnVzX3R5cGUpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3Bvc3Rjb3JlX2luaXRjYWxsKG9mX2J1c19kcml2ZXJfaW5pdCk7CisKK2ludCBvZl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgYnVzX3R5cGUgKmJ1cykKK3sKKwkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCisJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKKwlkcnYtPmRyaXZlci5idXMgPSBidXM7CisKKwkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CisKK3ZvaWQgb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CisKKworc3RhdGljIHNzaXplX3QgZGV2X3Nob3dfZGV2c3BlYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG9mX2RldmljZSAqb2ZkZXY7CisKKwlvZmRldiA9IHRvX29mX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzIiwgb2ZkZXYtPm5vZGUtPmZ1bGxfbmFtZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkZXZzcGVjLCBTX0lSVUdPLCBkZXZfc2hvd19kZXZzcGVjLCBOVUxMKTsKKworLyoqCisgKiBvZl9yZWxlYXNlX2RldiAtIGZyZWUgYW4gb2YgZGV2aWNlIHN0cnVjdHVyZSB3aGVuIGFsbCB1c2VycyBvZiBpdCBhcmUgZmluaXNoZWQuCisgKiBAZGV2OiBkZXZpY2UgdGhhdCdzIGJlZW4gZGlzY29ubmVjdGVkCisgKgorICogV2lsbCBiZSBjYWxsZWQgb25seSBieSB0aGUgZGV2aWNlIGNvcmUgd2hlbiBhbGwgdXNlcnMgb2YgdGhpcyBvZiBkZXZpY2UgYXJlCisgKiBkb25lLgorICovCit2b2lkIG9mX3JlbGVhc2VfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldjsKKworICAgICAgICBvZmRldiA9IHRvX29mX2RldmljZShkZXYpOworCisJa2ZyZWUob2ZkZXYpOworfQorCitpbnQgb2ZfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQoreworCWludCByYzsKKworCUJVR19PTihvZmRldi0+bm9kZSA9PSBOVUxMKTsKKworCXJjID0gZGV2aWNlX3JlZ2lzdGVyKCZvZmRldi0+ZGV2KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWRldmljZV9jcmVhdGVfZmlsZSgmb2ZkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb2ZfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IG9mX2RldmljZSAqb2ZkZXYpCit7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZvZmRldi0+ZGV2LCAmZGV2X2F0dHJfZGV2c3BlYyk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJm9mZGV2LT5kZXYpOworfQorCitzdHJ1Y3Qgb2ZfZGV2aWNlKiBvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCSAgICBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCSAgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCSAgICBzdHJ1Y3QgYnVzX3R5cGUgKmJ1cykKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXY7CisKKwlkZXYgPSBrbWFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCW1lbXNldChkZXYsIDAsIHNpemVvZigqZGV2KSk7CisKKwlkZXYtPmRldi5wYXJlbnQgPSBwYXJlbnQ7CisJZGV2LT5kZXYuYnVzID0gYnVzOworCWRldi0+ZGV2LnJlbGVhc2UgPSBvZl9yZWxlYXNlX2RldjsKKworCXN0cmxjcHkoZGV2LT5kZXYuYnVzX2lkLCBidXNfaWQsIEJVU19JRF9TSVpFKTsKKworCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoZGV2KSAhPSAwKSB7CisJCWtmcmVlKGRldik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBkZXY7Cit9CisKK0VYUE9SVF9TWU1CT0wob2ZfbWF0Y2hfZGV2aWNlKTsKK0VYUE9SVF9TWU1CT0wob2ZfcmVnaXN0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wob2ZfdW5yZWdpc3Rlcl9kcml2ZXIpOworRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChvZl9kZXZpY2VfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MKG9mX2Rldl9nZXQpOworRVhQT1JUX1NZTUJPTChvZl9kZXZfcHV0KTsKK0VYUE9SVF9TWU1CT0wob2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKG9mX3JlbGVhc2VfZGV2KTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYwppbmRleCBiY2RmNWFkLi5iY2ZkZGRkIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCkBAIC0zMSw2ICszMSw3IEBACiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vcGNpYy5oPgogI2luY2x1ZGUgPGFzbS90aW1lci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC02NjUsNyArNjY2LDcgQEAKIAkJLyogY29va2llcyAqLwogCQlwY3AgPSBwY2lfZGV2Y29va2llX2FsbG9jKCk7CiAJCXBjcC0+cGJtID0gJnBjaWMtPnBibTsKLQkJcGNwLT5wcm9tX25vZGUgPSBub2RlOworCQlwY3AtPnByb21fbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKG5vZGUpOwogCQlkZXYtPnN5c2RhdGEgPSBwY3A7CiAKIAkJLyogZml4aW5nIEkvTyB0byBsb29rIGxpa2UgbWVtb3J5ICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiMmI5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb20uYwpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIFByb2NlZHVyZXMgZm9yIGNyZWF0aW5nLCBhY2Nlc3NpbmcgYW5kIGludGVycHJldGluZyB0aGUgZGV2aWNlIHRyZWUuCisgKgorICogUGF1bCBNYWNrZXJyYXMJQXVndXN0IDE5OTYuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNSBQYXVsIE1hY2tlcnJhcy4KKyAqIAorICogIEFkYXB0ZWQgZm9yIDY0Yml0IFBvd2VyUEMgYnkgRGF2ZSBFbmdlYnJldHNlbiBhbmQgUGV0ZXIgQmVyZ25lci4KKyAqICAgIHtlbmdlYnJldHxiZXJnbmVyfUB1cy5pYm0uY29tIAorICoKKyAqICBBZGFwdGVkIGZvciBzcGFyYzMyIGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CisKK2ludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqY29tcGF0KQoreworCWNvbnN0IGNoYXIqIGNwOworCWludCBjcGxlbiwgbDsKKworCWNwID0gKGNoYXIgKikgb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoY3BsZW4gPiAwKSB7CisJCWlmIChzdHJuY21wKGNwLCBjb21wYXQsIHN0cmxlbihjb21wYXQpKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJCWwgPSBzdHJsZW4oY3ApICsgMTsKKwkJY3AgKz0gbDsKKwkJY3BsZW4gLT0gbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCisJbnAgPSBub2RlLT5wYXJlbnQ7CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9wYXJlbnQpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpuZXh0OworCisJbmV4dCA9IHByZXYgPyBwcmV2LT5zaWJsaW5nIDogbm9kZS0+Y2hpbGQ7CisJZm9yICg7IG5leHQgIT0gMDsgbmV4dCA9IG5leHQtPnNpYmxpbmcpIHsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5leHQ7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9uZXh0X2NoaWxkKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhbGxub2RlczsKKworCWZvciAoOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KSB7CisJCWlmIChucC0+ZnVsbF9uYW1lICE9IDAgJiYgc3RyY21wKG5wLT5mdWxsX25hbWUsIHBhdGgpID09IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9wYXRoKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yIChucCA9IGFsbG5vZGVzOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KQorCQlpZiAobnAtPm5vZGUgPT0gaGFuZGxlKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCisJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBmcm9tID8gZnJvbS0+YWxsbmV4dCA6IGFsbG5vZGVzOworCWZvciAoOyBucCAhPSBOVUxMOyBucCA9IG5wLT5hbGxuZXh0KQorCQlpZiAobnAtPm5hbWUgIT0gTlVMTCAmJiBzdHJjbXAobnAtPm5hbWUsIG5hbWUpID09IDApCisJCQlicmVhazsKKworCXJldHVybiBucDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZmluZF9ub2RlX2J5X25hbWUpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV90eXBlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKKwljb25zdCBjaGFyICp0eXBlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IGZyb20gPyBmcm9tLT5hbGxuZXh0IDogYWxsbm9kZXM7CisJZm9yICg7IG5wICE9IDA7IG5wID0gbnAtPmFsbG5leHQpCisJCWlmIChucC0+dHlwZSAhPSAwICYmIHN0cmNtcChucC0+dHlwZSwgdHlwZSkgPT0gMCkKKwkJCWJyZWFrOworCisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfdHlwZSk7CisKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAorCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gZnJvbSA/IGZyb20tPmFsbG5leHQgOiBhbGxub2RlczsKKwlmb3IgKDsgbnAgIT0gMDsgbnAgPSBucC0+YWxsbmV4dCkgeworCQlpZiAodHlwZSAhPSBOVUxMCisJCSAgICAmJiAhKG5wLT50eXBlICE9IDAgJiYgc3RyY21wKG5wLT50eXBlLCB0eXBlKSA9PSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIGNvbXBhdGlibGUpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX2NvbXBhdGlibGVfbm9kZSk7CisKK3N0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgaW50ICpsZW5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisKKwlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChwcC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKGxlbnAgIT0gMCkKKwkJCQkqbGVucCA9IHBwLT5sZW5ndGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcHA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfcHJvcGVydHkpOworCisvKgorICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKKyAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgorICovCit2b2lkICpvZl9nZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLG5hbWUsbGVucCk7CisJcmV0dXJuIHBwID8gcHAtPnZhbHVlIDogTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0X3Byb3BlcnR5KTsKKworaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgbGVuOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIG5hbWUsICZsZW4pOworCWlmICghcHJvcCB8fCBsZW4gIT0gNCkKKwkJcmV0dXJuIGRlZjsKKworCXJldHVybiAqKGludCAqKSBwcm9wLT52YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0aW50cHJvcF9kZWZhdWx0KTsKKworc3RhdGljIHVuc2lnbmVkIGludCBwcm9tX2Vhcmx5X2FsbG9jYXRlZDsKKworc3RhdGljIHZvaWQgKiBfX2luaXQgcHJvbV9lYXJseV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX19hbGxvY19ib290bWVtKHNpemUsIFNNUF9DQUNIRV9CWVRFUywgMFVMKTsKKwlpZiAocmV0ICE9IE5VTEwpCisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCisJcHJvbV9lYXJseV9hbGxvY2F0ZWQgKz0gc2l6ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfcm9vdF9ub2RlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJaWYgKCFkcCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRwLT5wYXJlbnQgPT0gTlVMTCk7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZGVhbCB3aXRoIHRoZSBibGFjayBtYWdpYyBvZiBmdWxseSBuYW1pbmcgYQorICogbm9kZS4KKyAqCisgKiBDZXJ0YWluIHdlbGwga25vd24gbmFtZWQgbm9kZXMgYXJlIGp1c3QgdGhlIHNpbXBsZSBuYW1lIHN0cmluZy4KKyAqCisgKiBBY3R1YWwgZGV2aWNlcyBoYXZlIGFuIGFkZHJlc3Mgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUKKyAqIHN0cmluZywgbGlrZSB0aGlzICJmb29AYWRkciIuICBUaGUgImFkZHIiIGNhbiBiZSBpbiBhbnkgbnVtYmVyIG9mCisgKiBmb3JtYXRzLCBhbmQgdGhlIHBsYXRmb3JtIHBsdXMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgZGV0ZXJtaW5lIHRoZQorICogZm9ybWF0IGFuZCBob3cgaXQgaXMgY29uc3RydWN0ZWQuCisgKgorICogRm9yIGNoaWxkcmVuIG9mIHRoZSBST09UIG5vZGUsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpcyBmaXhlZCBhbmQKKyAqIGRldGVybWluZWQgYnkgd2hldGhlciB0aGlzIGlzIGEgc3VuNHUgb3Igc3VuNHYgc3lzdGVtLgorICoKKyAqIEZvciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgaXQgaXMgYnVzIHR5cGUgc3BlY2lmaWMuICBTbworICogd2Ugd2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBkaXNjb3ZlciBhICJkZXZpY2VfdHlwZSIgcHJvcGVydHkKKyAqIHdlIHJlY29nbml6ZSBhbmQgd2UgZ28gZnJvbSB0aGVyZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHNwYXJjMzJfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpycHJvcDsKKworCXJwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcnByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBycHJvcC0+dmFsdWU7CisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sIHJlZ3MtPnBoeXNfYWRkcik7Cit9CisKKy8qICJuYW1lQHNsb3Qsb2Zmc2V0IiAgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBzYnVzX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sCisJCXJlZ3MtPnBoeXNfYWRkcik7Cit9CisKKy8qICJuYW1lQGRldm51bVssZnVuY10iICovCitzdGF0aWMgdm9pZCBfX2luaXQgcGNpX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdW5zaWduZWQgaW50IGRldmZuOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwlkZXZmbiA9IChyZWdzLT5waHlzX2hpID4+IDgpICYgMHhmZjsKKwlpZiAoZGV2Zm4gJiAweDA3KSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJCWRwLT5uYW1lLAorCQkJZGV2Zm4gPj4gMywKKwkJCWRldmZuICYgMHgwNyk7CisJfSBlbHNlIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgiLAorCQkJZHAtPm5hbWUsCisJCQlkZXZmbiA+PiAzKTsKKwl9Cit9CisKKy8qICJuYW1lQGFkZHJoaSxhZGRybG8iICovCitzdGF0aWMgdm9pZCBfX2luaXQgZWJ1c19wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJcmVncy0+d2hpY2hfaW8sIHJlZ3MtPnBoeXNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2J1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OworCisJaWYgKHBhcmVudCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaWV4IikpCisJCQlyZXR1cm4gcGNpX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAic2J1cyIpKQorCQkJcmV0dXJuIHNidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJlYnVzIikpCisJCQlyZXR1cm4gZWJ1c19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisKKwkJLyogImlzYSIgaXMgaGFuZGxlZCB3aXRoIHBsYXRmb3JtIG5hbWluZyAqLworCX0KKworCS8qIFVzZSBwbGF0Zm9ybSBuYW1pbmcgY29udmVudGlvbi4gICovCisJcmV0dXJuIHNwYXJjMzJfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworfQorCitzdGF0aWMgY2hhciAqIF9faW5pdCBidWlsZF9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWNoYXIgdG1wX2J1Zls2NF0sICpuOworCisJdG1wX2J1ZlswXSA9ICdcMCc7CisJX19idWlsZF9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJaWYgKHRtcF9idWZbMF0gPT0gJ1wwJykKKwkJc3RyY3B5KHRtcF9idWYsIGRwLT5uYW1lKTsKKworCW4gPSBwcm9tX2Vhcmx5X2FsbG9jKHN0cmxlbih0bXBfYnVmKSArIDEpOworCXN0cmNweShuLCB0bXBfYnVmKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgY2hhciAqIF9faW5pdCBidWlsZF9mdWxsX25hbWUoc3RydWN0IGRldmljZV9ub2RlICpkcCkKK3sKKwlpbnQgbGVuLCBvdXJsZW4sIHBsZW47CisJY2hhciAqbjsKKworCXBsZW4gPSBzdHJsZW4oZHAtPnBhcmVudC0+ZnVsbF9uYW1lKTsKKwlvdXJsZW4gPSBzdHJsZW4oZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOworCWxlbiA9IG91cmxlbiArIHBsZW4gKyAyOworCisJbiA9IHByb21fZWFybHlfYWxsb2MobGVuKTsKKwlzdHJjcHkobiwgZHAtPnBhcmVudC0+ZnVsbF9uYW1lKTsKKwlpZiAoIWlzX3Jvb3Rfbm9kZShkcC0+cGFyZW50KSkgeworCQlzdHJjcHkobiArIHBsZW4sICIvIik7CisJCXBsZW4rKzsKKwl9CisJc3RyY3B5KG4gKyBwbGVuLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqIF9faW5pdCBidWlsZF9vbmVfcHJvcChwaGFuZGxlIG5vZGUsIGNoYXIgKnByZXYpCit7CisJc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqdG1wID0gTlVMTDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnA7CisJaW50IGxlbjsKKworCWlmICh0bXApIHsKKwkJcCA9IHRtcDsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkgKyAzMik7CisJCXRtcCA9IE5VTEw7CisJfSBlbHNlCisJCXAgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3QgcHJvcGVydHkpICsgMzIpOworCisJcC0+bmFtZSA9IChjaGFyICopIChwICsgMSk7CisJaWYgKHByZXYgPT0gTlVMTCkgeworCQlwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKKwl9IGVsc2UgeworCQlwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIHAtPm5hbWUpOworCX0KKwlpZiAoc3RybGVuKHAtPm5hbWUpID09IDApIHsKKwkJdG1wID0gcDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXAtPmxlbmd0aCA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBwLT5uYW1lKTsKKwlpZiAocC0+bGVuZ3RoIDw9IDApIHsKKwkJcC0+bGVuZ3RoID0gMDsKKwl9IGVsc2UgeworCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2MocC0+bGVuZ3RoKTsKKwkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+bGVuZ3RoKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfcHJvcF9saXN0KHBoYW5kbGUgbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKmhlYWQsICp0YWlsOworCisJaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMKTsKKwl3aGlsZSh0YWlsKSB7CisJCXRhaWwtPm5leHQgPSBidWlsZF9vbmVfcHJvcChub2RlLCB0YWlsLT5uYW1lKTsKKwkJdGFpbCA9IHRhaWwtPm5leHQ7CisJfQorCisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyBjaGFyICogX19pbml0IGdldF9vbmVfcHJvcGVydHkocGhhbmRsZSBub2RlLCBjaGFyICpuYW1lKQoreworCWNoYXIgKmJ1ZiA9ICI8TlVMTD4iOworCWludCBsZW47CisKKwlsZW4gPSBwcm9tX2dldHByb3BsZW4obm9kZSwgbmFtZSk7CisJaWYgKGxlbiA+IDApIHsKKwkJYnVmID0gcHJvbV9lYXJseV9hbGxvYyhsZW4pOworCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsIG5hbWUsIGJ1ZiwgbGVuKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogX19pbml0IGNyZWF0ZV9ub2RlKHBoYW5kbGUgbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWRwID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2YoKmRwKSk7CisKKwlrcmVmX2luaXQoJmRwLT5rcmVmKTsKKworCWRwLT5uYW1lID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAibmFtZSIpOworCWRwLT50eXBlID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiKTsKKwlkcC0+bm9kZSA9IG5vZGU7CisKKwkvKiBCdWlsZCBpbnRlcnJ1cHRzIGxhdGVyLi4uICovCisKKwlkcC0+cHJvcGVydGllcyA9IGJ1aWxkX3Byb3BfbGlzdChub2RlKTsKKworCXJldHVybiBkcDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdCBidWlsZF90cmVlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBwaGFuZGxlIG5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKipuZXh0cCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJZHAgPSBjcmVhdGVfbm9kZShub2RlKTsKKwlpZiAoZHApIHsKKwkJKigqbmV4dHApID0gZHA7CisJCSpuZXh0cCA9ICZkcC0+YWxsbmV4dDsKKworCQlkcC0+cGFyZW50ID0gcGFyZW50OworCQlkcC0+cGF0aF9jb21wb25lbnRfbmFtZSA9IGJ1aWxkX3BhdGhfY29tcG9uZW50KGRwKTsKKwkJZHAtPmZ1bGxfbmFtZSA9IGJ1aWxkX2Z1bGxfbmFtZShkcCk7CisKKwkJZHAtPmNoaWxkID0gYnVpbGRfdHJlZShkcCwgcHJvbV9nZXRjaGlsZChub2RlKSwgbmV4dHApOworCisJCWRwLT5zaWJsaW5nID0gYnVpbGRfdHJlZShwYXJlbnQsIHByb21fZ2V0c2libGluZyhub2RlKSwgbmV4dHApOworCX0KKworCXJldHVybiBkcDsKK30KKwordm9pZCBfX2luaXQgcHJvbV9idWlsZF9kZXZpY2V0cmVlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICoqbmV4dHA7CisKKwlhbGxub2RlcyA9IGNyZWF0ZV9ub2RlKHByb21fcm9vdF9ub2RlKTsKKwlhbGxub2Rlcy0+cGF0aF9jb21wb25lbnRfbmFtZSA9ICIiOworCWFsbG5vZGVzLT5mdWxsX25hbWUgPSAiLyI7CisKKwluZXh0cCA9ICZhbGxub2Rlcy0+YWxsbmV4dDsKKwlhbGxub2Rlcy0+Y2hpbGQgPSBidWlsZF90cmVlKGFsbG5vZGVzLAorCQkJCSAgICAgcHJvbV9nZXRjaGlsZChhbGxub2Rlcy0+bm9kZSksCisJCQkJICAgICAmbmV4dHApOworCXByaW50aygiUFJPTTogQnVpbHQgZGV2aWNlIHRyZWUgd2l0aCAldSBieXRlcyBvZiBtZW1vcnkuXG4iLAorCSAgICAgICBwcm9tX2Vhcmx5X2FsbG9jYXRlZCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXAuYwppbmRleCAyY2JmMjgyLi5hODkzYTljIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCWlmICghcm9vdF9mbGFncykKIAkJcm9vdF9tb3VudGZsYWdzICY9IH5NU19SRE9OTFk7CiAJUk9PVF9ERVYgPSBvbGRfZGVjb2RlX2Rldihyb290X2Rldik7Ci0jaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisjaWZkZWYgQ09ORklHX0JMS19ERVZfUkFNCiAJcmRfaW1hZ2Vfc3RhcnQgPSByYW1fZmxhZ3MgJiBSQU1ESVNLX0lNQUdFX1NUQVJUX01BU0s7CiAJcmRfcHJvbXB0ID0gKChyYW1fZmxhZ3MgJiBSQU1ESVNLX1BST01QVF9GTEFHKSAhPSAwKTsKIAlyZF9kb2xvYWQgPSAoKHJhbV9mbGFncyAmIFJBTURJU0tfTE9BRF9GTEFHKSAhPSAwKTsJCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdC5jCmluZGV4IDg5ODY2OTcuLmNmYTdkMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdC5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL3ZhZGRycy5oPgogI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CS8qIGJ1ZyBpbiBhc20tZ2VuZXJpYy90bGIuaDogY2hlY2tfcGd0X2NhY2hlICovCiAjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7CiAKQEAgLTM0OSw2ICszNTAsNyBAQAogCXByb3RlY3Rpb25fbWFwWzE0XSA9IFBBR0VfU0hBUkVEOwogCXByb3RlY3Rpb25fbWFwWzE1XSA9IFBBR0VfU0hBUkVEOwogCWJ0Zml4dXAoKTsKKwlwcm9tX2J1aWxkX2RldmljZXRyZWUoKTsKIAlkZXZpY2Vfc2NhbigpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnIGIvYXJjaC9zcGFyYzY0L2RlZmNvbmZpZwppbmRleCA5ZGE3NWY4Li5iMmY0MTE0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCisrKyBiL2FyY2gvc3BhcmM2NC9kZWZjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CiAjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMTcKLSMgVHVlIEp1biAyMCAwMToyNjo0MyAyMDA2CisjIEZyaSBKdW4gMjMgMjM6MTc6MDkgMjAwNgogIwogQ09ORklHX1NQQVJDPXkKIENPTkZJR19TUEFSQzY0PXkKQEAgLTI4Niw2ICsyODYsNyBAQAogIyBDT05GSUdfUFJFVkVOVF9GSVJNV0FSRV9CVUlMRCBpcyBub3Qgc2V0CiBDT05GSUdfRldfTE9BREVSPXkKICMgQ09ORklHX0RFQlVHX0RSSVZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19TWVNfSFlQRVJWSVNPUiBpcyBub3Qgc2V0CiAKICMKICMgQ29ubmVjdG9yIC0gdW5pZmllZCB1c2Vyc3BhY2UgPC0+IGtlcm5lbHNwYWNlIGxpbmtlcgpAQCAtNDM0LDYgKzQzNSw3IEBACiAjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfU0FUQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0hQVElPUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RNWDMxOTFEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDU0lfRlVUVVJFX0RPTUFJTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0lQUyBpcyBub3Qgc2V0CkBAIC03MzMsNiArNzM1LDcgQEAKICMgQ09ORklHX0kyQ19JODEwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QSUlYNCBpcyBub3Qgc2V0CiAjIENPTkZJR19JMkNfTkZPUkNFMiBpcyBub3Qgc2V0CisjIENPTkZJR19JMkNfT0NPUkVTIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QQVJQT1JUX0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19QUk9TQVZBR0UgaXMgbm90IHNldAogIyBDT05GSUdfSTJDX1NBVkFHRTQgaXMgbm90IHNldApAQCAtNzc2LDYgKzc3OSw3IEBACiAjCiBDT05GSUdfSFdNT049eQogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQURNMTAyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0FETTEwMjUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BRE0xMDI2IGlzIG5vdCBzZXQKQEAgLTgwNCwxMCArODA4LDEyIEBACiAjIENPTkZJR19TRU5TT1JTX1BDODczNjAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TSVM1NTk1IGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3TTEgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU01TQzQ3QjM5NyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1ZJQTY4NkEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDgyMzEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM3ODFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfVzgzNzkxRCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1c4Mzc5MkQgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODNMNzg1VFMgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19XODM2MjdIRiBpcyBub3Qgc2V0CkBAIC0xMDE4LDYgKzEwMjQsNyBAQAogQ09ORklHX1VTQl9FSENJX0hDRD1tCiAjIENPTkZJR19VU0JfRUhDSV9TUExJVF9JU08gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0VIQ0lfUk9PVF9IVUJfVFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lTUDExNlhfSENEIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogIyBDT05GSUdfVVNCX09IQ0lfQklHX0VORElBTiBpcyBub3Qgc2V0CkBAIC0xMDk3LDEwICsxMTA0LDEyIEBACiAjIENPTkZJR19VU0JfTEVHT1RPV0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MQ0QgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfQ1k3QzYzIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVRIRVJNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUS0lUIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9QSElER0VUU0VSVk8gaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX0FQUExFRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfU0lTVVNCVkdBIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9MRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfVEVTVCBpcyBub3Qgc2V0CkBAIC0xMTk4LDYgKzEyMDcsNyBAQAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogQ09ORklHX0lOT1RJRlk9eQorQ09ORklHX0lOT1RJRllfVVNFUj15CiAjIENPTkZJR19RVU9UQSBpcyBub3Qgc2V0CiBDT05GSUdfRE5PVElGWT15CiAjIENPTkZJR19BVVRPRlNfRlMgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvTWFrZWZpbGUKaW5kZXggNmY2ODE2NC4uODZjOWZlMyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL01ha2VmaWxlCkBAIC0xMiw3ICsxMiw3IEBACiAJCSAgIGlycS5vIHB0cmFjZS5vIHRpbWUubyBzeXNfc3BhcmMubyBzaWduYWwubyBcCiAJCSAgIHVuYWxpZ25lZC5vIGNlbnRyYWwubyBwY2kubyBzdGFyZmlyZS5vIHNlbWFwaG9yZS5vIFwKIAkJICAgcG93ZXIubyBzYnVzLm8gaW9tbXVfY29tbW9uLm8gc3BhcmM2NF9rc3ltcy5vIGNobWMubyBcCi0JCSAgIHZpc2VtdWwubworCQkgICB2aXNlbXVsLm8gcHJvbS5vIG9mX2RldmljZS5vCiAKIG9iai0kKENPTkZJR19QQ0kpCSArPSBlYnVzLm8gaXNhLm8gcGNpX2NvbW1vbi5vIHBjaV9pb21tdS5vIFwKIAkJCSAgICBwY2lfcHN5Y2hvLm8gcGNpX3NhYnJlLm8gcGNpX3NjaGl6by5vIFwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvYXV4aW8uYwppbmRleCA4ODUyYzIwLi4yYzQyODk0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2F1eGlvLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9hdXhpby5jCkBAIC0xMTAsNDMgKzExMCw4MiBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgYXV4aW9fcHJvYmUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdXhpb19yZXBvcnRfZGV2KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0gICAgICAgIHN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLSAgICAgICAgc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKLQotICAgICAgICBmb3JfZWFjaF9zYnVzKHNidXMpIHsKLSAgICAgICAgICAgICAgICBmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiYXV4aW8iKSkKLQkJCQlnb3RvIGZvdW5kX3NkZXY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLWZvdW5kX3NkZXY6Ci0JaWYgKHNkZXYpIHsKLQkJYXV4aW9fZGV2dHlwZSAgPSBBVVhJT19UWVBFX1NCVVM7Ci0JCWF1eGlvX3JlZ2lzdGVyID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKLQkJCQkJICAgICAgc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplLAotCQkJCQkgICAgICAiYXV4aWxpYXJ5SU8iKTsKLQl9Ci0jaWZkZWYgQ09ORklHX1BDSQotCWVsc2UgewotCQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQkJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKLQotCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImF1eGlvIikpCi0JCQkJCWdvdG8gZWJ1c19kb25lOwotCQkJfQotCQl9Ci0JZWJ1c19kb25lOgotCQlpZiAoZWRldikgewotCQkJYXV4aW9fZGV2dHlwZSAgPSBBVVhJT19UWVBFX0VCVVM7Ci0JCQlhdXhpb19yZWdpc3RlciA9Ci0JCQkJaW9yZW1hcChlZGV2LT5yZXNvdXJjZVswXS5zdGFydCwgc2l6ZW9mKHUzMikpOwotCQl9Ci0JfQotCWF1eGlvX3NldF9sZWQoQVVYSU9fTEVEX09OKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gIkFVWElPOiBGb3VuZCBkZXZpY2UgYXQgJXNcbiIsCisJICAgICAgIGRwLT5mdWxsX25hbWUpOwogfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhdXhpb19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiYXV4aW8iLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhdXhpb19tYXRjaCk7CisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RhdGljIGludCBfX2RldmluaXQgYXV4aW9fc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7CisKKwlhdXhpb19kZXZ0eXBlICA9IEFVWElPX1RZUEVfU0JVUzsKKwlhdXhpb19yZWdpc3RlciA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICAgICAgc2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplLAorCQkJCSAgICAgICJhdXhpbGlhcnlJTyIpOworCWlmICghYXV4aW9fcmVnaXN0ZXIpCisJCXJldHVybiAtRU5PREVWOworCisJYXV4aW9fcmVwb3J0X2RldihkZXYtPm5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBhdXhpb19zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYXV4aW8iLAorCS5tYXRjaF90YWJsZQk9IGF1eGlvX21hdGNoLAorCS5wcm9iZQkJPSBhdXhpb19zYnVzX3Byb2JlLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIGludCBfX2RldmluaXQgYXV4aW9fZWJ1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IHRvX2VidXNfZGV2aWNlKCZkZXYtPmRldik7CisKKwlhdXhpb19kZXZ0eXBlICA9IEFVWElPX1RZUEVfRUJVUzsKKwlhdXhpb19yZWdpc3RlciA9IGlvcmVtYXAoZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIHNpemVvZih1MzIpKTsKKwlpZiAoIWF1eGlvX3JlZ2lzdGVyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWF1eGlvX3JlcG9ydF9kZXYoZGV2LT5ub2RlKTsKKworCWF1eGlvX3NldF9sZWQoQVVYSU9fTEVEX09OKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBhdXhpb19lYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYXV4aW8iLAorCS5tYXRjaF90YWJsZQk9IGF1eGlvX21hdGNoLAorCS5wcm9iZQkJPSBhdXhpb19lYnVzX3Byb2JlLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBhdXhpb19wcm9iZSh2b2lkKQoreworI2lmZGVmIENPTkZJR19TQlVTCisJb2ZfcmVnaXN0ZXJfZHJpdmVyKCZhdXhpb19zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BDSQorCW9mX3JlZ2lzdGVyX2RyaXZlcigmYXV4aW9fZWJ1c19kcml2ZXIsICZlYnVzX2J1c190eXBlKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKKy8qIE11c3QgYmUgYWZ0ZXIgc3Vic3lzX2luaXRjYWxsKCkgc28gdGhhdCBidXNzZXMgYXJlIHByb2JlZC4gIE11c3QKKyAqIGJlIGJlZm9yZSBkZXZpY2VfaW5pdGNhbGwoKSBiZWNhdXNlIHRoaW5ncyBsaWtlIHRoZSBmbG9wcHkgZHJpdmVyCisgKiBuZWVkIHRvIHVzZSB0aGUgQVVYSU8gcmVnaXN0ZXIuCisgKi8KK2ZzX2luaXRjYWxsKGF1eGlvX3Byb2JlKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2VudHJhbC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKaW5kZXggM2QxODRhNy4uYjY2MzM2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jZW50cmFsLmMKQEAgLTI5LDI4ICsyOSwzNCBAQAogCXByb21faGFsdCgpOwogfQogCi1zdGF0aWMgdm9pZCBjZW50cmFsX3Jhbmdlc19pbml0KGludCBjbm9kZSwgc3RydWN0IGxpbnV4X2NlbnRyYWwgKmNlbnRyYWwpCitzdGF0aWMgdm9pZCBjZW50cmFsX3Jhbmdlc19pbml0KHN0cnVjdCBsaW51eF9jZW50cmFsICpjZW50cmFsKQogewotCWludCBzdWNjZXNzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBjZW50cmFsLT5wcm9tX25vZGU7CisJdm9pZCAqcHZhbDsKKwlpbnQgbGVuOwogCQogCWNlbnRyYWwtPm51bV9jZW50cmFsX3JhbmdlcyA9IDA7Ci0Jc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkoY2VudHJhbC0+cHJvbV9ub2RlLCAicmFuZ2VzIiwKLQkJCQkgICAoY2hhciAqKSBjZW50cmFsLT5jZW50cmFsX3JhbmdlcywKLQkJCQkgICBzaXplb2YgKGNlbnRyYWwtPmNlbnRyYWxfcmFuZ2VzKSk7Ci0JaWYgKHN1Y2Nlc3MgIT0gLTEpCi0JCWNlbnRyYWwtPm51bV9jZW50cmFsX3JhbmdlcyA9IChzdWNjZXNzL3NpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CisJaWYgKHB2YWwpIHsKKwkJbWVtY3B5KGNlbnRyYWwtPmNlbnRyYWxfcmFuZ2VzLCBwdmFsLCBsZW4pOworCQljZW50cmFsLT5udW1fY2VudHJhbF9yYW5nZXMgPQorCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGZoY19yYW5nZXNfaW5pdChpbnQgZm5vZGUsIHN0cnVjdCBsaW51eF9maGMgKmZoYykKK3N0YXRpYyB2b2lkIGZoY19yYW5nZXNfaW5pdChzdHJ1Y3QgbGludXhfZmhjICpmaGMpCiB7Ci0JaW50IHN1Y2Nlc3M7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IGZoYy0+cHJvbV9ub2RlOworCXZvaWQgKnB2YWw7CisJaW50IGxlbjsKIAkKIAlmaGMtPm51bV9maGNfcmFuZ2VzID0gMDsKLQlzdWNjZXNzID0gcHJvbV9nZXRwcm9wZXJ0eShmaGMtPnByb21fbm9kZSwgInJhbmdlcyIsCi0JCQkJICAgKGNoYXIgKikgZmhjLT5maGNfcmFuZ2VzLAotCQkJCSAgIHNpemVvZiAoZmhjLT5maGNfcmFuZ2VzKSk7Ci0JaWYgKHN1Y2Nlc3MgIT0gLTEpCi0JCWZoYy0+bnVtX2ZoY19yYW5nZXMgPSAoc3VjY2Vzcy9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKSk7CisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJhbmdlcyIsICZsZW4pOworCWlmIChwdmFsKSB7CisJCW1lbWNweShmaGMtPmZoY19yYW5nZXMsIHB2YWwsIGxlbik7CisJCWZoYy0+bnVtX2ZoY19yYW5nZXMgPQorCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKKwl9CiB9CiAKIC8qIFJhbmdlIGFwcGxpY2F0aW9uIHJvdXRpbmVzIGFyZSBleHBvcnRlZCB0byB2YXJpb3VzIGRyaXZlcnMsCkBAIC0xMTIsMTUgKzExOCwxMCBAQAogCiBzdGF0aWMgdm9pZCBwcm9iZV9vdGhlcl9maGNzKHZvaWQpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgZnByZWdzWzZdOwotCWNoYXIgbmFtZWJ1ZlsxMjhdOwotCWludCBub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKmZwcmVnczsKIAotCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAiZmhjIik7Ci0JaWYgKG5vZGUgPT0gMCkKLQkJY2VudHJhbF9wcm9iZV9mYWlsdXJlKF9fTElORV9fKTsKLQl3aGlsZSAobm9kZSkgeworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgImZoYyIpIHsKIAkJc3RydWN0IGxpbnV4X2ZoYyAqZmhjOwogCQlpbnQgYm9hcmQ7CiAJCXUzMiB0bXA7CkBAIC0xMzcsMTQgKzEzOCwxMiBAQAogCQkvKiBUb3BsZXZlbCBGSENzIGhhdmUgbm8gcGFyZW50LiAqLwogCQlmaGMtPnBhcmVudCA9IE5VTEw7CiAJCQotCQlmaGMtPnByb21fbm9kZSA9IG5vZGU7Ci0JCXByb21fZ2V0c3RyaW5nKG5vZGUsICJuYW1lIiwgbmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpKTsKLQkJc3RyY3B5KGZoYy0+cHJvbV9uYW1lLCBuYW1lYnVmKTsKLQkJZmhjX3Jhbmdlc19pbml0KG5vZGUsIGZoYyk7CisJCWZoYy0+cHJvbV9ub2RlID0gZHA7CisJCWZoY19yYW5nZXNfaW5pdChmaGMpOwogCiAJCS8qIE5vbi1jZW50cmFsIEZIQydzIGhhdmUgNjQtYml0IE9CUCBmb3JtYXQgcmVnaXN0ZXJzLiAqLwotCQlpZiAocHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwKLQkJCQkgICAgKGNoYXIgKikmZnByZWdzWzBdLCBzaXplb2YoZnByZWdzKSkgPT0gLTEpCisJCWZwcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCQlpZiAoIWZwcmVncykKIAkJCWNlbnRyYWxfcHJvYmVfZmFpbHVyZShfX0xJTkVfXyk7CiAKIAkJLyogT25seSBjZW50cmFsIEZIQyBuZWVkcyBzcGVjaWFsIHJhbmdlcyBhcHBsaWVkLiAqLwpAQCAtMTU1LDcgKzE1NCw3IEBACiAJCWZoYy0+ZmhjX3JlZ3MudXJlZ3MgPSBmcHJlZ3NbNF0ucGh5c19hZGRyOwogCQlmaGMtPmZoY19yZWdzLnRyZWdzID0gZnByZWdzWzVdLnBoeXNfYWRkcjsKIAotCQlib2FyZCA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiYm9hcmQjIiwgLTEpOworCQlib2FyZCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImJvYXJkIyIsIC0xKTsKIAkJZmhjLT5ib2FyZCA9IGJvYXJkOwogCiAJCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0pDVFJMKTsKQEAgLTE3OSwzMyArMTc4LDMzIEBACiAJCXRtcCA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwogCQl0bXAgfD0gRkhDX0NPTlRST0xfSVhJU1Q7CiAJCXVwYV93cml0ZWwodG1wLCBmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0NUUkwpOwotCi0JCS8qIExvb2sgZm9yIHRoZSBuZXh0IEZIQy4gKi8KLQkJbm9kZSA9IHByb21fZ2V0c2libGluZyhub2RlKTsKLQkJaWYgKG5vZGUgPT0gMCkKLQkJCWJyZWFrOwotCQlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAiZmhjIik7Ci0JCWlmIChub2RlID09IDApCi0JCQlicmVhazsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHByb2JlX2Nsb2NrX2JvYXJkKHN0cnVjdCBsaW51eF9jZW50cmFsICpjZW50cmFsLAogCQkJICAgICAgc3RydWN0IGxpbnV4X2ZoYyAqZmhjLAotCQkJICAgICAgaW50IGNub2RlLCBpbnQgZm5vZGUpCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmZwKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBjcmVnc1szXTsKLQlpbnQgY2xrbm9kZSwgbnNsb3RzLCB0bXAsIG5yZWdzOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGNyZWdzWzNdLCAqcHI7CisJaW50IG5zbG90cywgdG1wLCBucmVnczsKIAotCWNsa25vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKHByb21fZ2V0Y2hpbGQoZm5vZGUpLCAiY2xvY2stYm9hcmQiKTsKLQlpZiAoY2xrbm9kZSA9PSAwIHx8IGNsa25vZGUgPT0gLTEpCisJZHAgPSBmcC0+Y2hpbGQ7CisJd2hpbGUgKGRwKSB7CisJCWlmICghc3RyY21wKGRwLT5uYW1lLCAiY2xvY2stYm9hcmQiKSkKKwkJCWJyZWFrOworCQlkcCA9IGRwLT5zaWJsaW5nOworCX0KKwlpZiAoIWRwKQogCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwogCi0JbnJlZ3MgPSBwcm9tX2dldHByb3BlcnR5KGNsa25vZGUsICJyZWciLCAoY2hhciAqKSZjcmVnc1swXSwgc2l6ZW9mKGNyZWdzKSk7Ci0JaWYgKG5yZWdzID09IC0xKQorCXByID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJm5yZWdzKTsKKwlpZiAoIXByKQogCQljZW50cmFsX3Byb2JlX2ZhaWx1cmUoX19MSU5FX18pOwogCisJbWVtY3B5KGNyZWdzLCBwciwgbnJlZ3MpOwogCW5yZWdzIC89IHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpOworCiAJYXBwbHlfZmhjX3JhbmdlcyhmaGMsICZjcmVnc1swXSwgbnJlZ3MpOwogCWFwcGx5X2NlbnRyYWxfcmFuZ2VzKGNlbnRyYWwsICZjcmVnc1swXSwgbnJlZ3MpOwogCWNlbnRyYWwtPmNmcmVnID0gcHJvbV9yZWdfdG9fcGFkZHIoJmNyZWdzWzBdKTsKQEAgLTI5NiwxMyArMjk1LDEzIEBACiAKIHZvaWQgY2VudHJhbF9wcm9iZSh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBmcHJlZ3NbNl07CisJc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIGZwcmVnc1s2XSwgKnByOwogCXN0cnVjdCBsaW51eF9maGMgKmZoYzsKLQljaGFyIG5hbWVidWZbMTI4XTsKLQlpbnQgY25vZGUsIGZub2RlLCBlcnI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCwgKmZwOworCWludCBlcnI7CiAKLQljbm9kZSA9IHByb21fZmluZGRldmljZSgiL2NlbnRyYWwiKTsKLQlpZiAoY25vZGUgPT0gMCB8fCBjbm9kZSA9PSAtMSkgeworCWRwID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImNlbnRyYWwiKTsKKwlpZiAoIWRwKSB7CiAJCWlmICh0aGlzX2lzX3N0YXJmaXJlKQogCQkJc3RhcmZpcmVfY3B1X3NldHVwKCk7CiAJCXJldHVybjsKQEAgLTMyMSwzMSArMzIwLDMxIEBACiAKIAkvKiBGaXJzdCBpbml0IGNlbnRyYWwuICovCiAJY2VudHJhbF9idXMtPmNoaWxkID0gZmhjOwotCWNlbnRyYWxfYnVzLT5wcm9tX25vZGUgPSBjbm9kZTsKLQotCXByb21fZ2V0c3RyaW5nKGNub2RlLCAibmFtZSIsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSk7Ci0Jc3RyY3B5KGNlbnRyYWxfYnVzLT5wcm9tX25hbWUsIG5hbWVidWYpOwotCi0JY2VudHJhbF9yYW5nZXNfaW5pdChjbm9kZSwgY2VudHJhbF9idXMpOworCWNlbnRyYWxfYnVzLT5wcm9tX25vZGUgPSBkcDsKKwljZW50cmFsX3Jhbmdlc19pbml0KGNlbnRyYWxfYnVzKTsKIAogCS8qIEFuZCB0aGVuIGNlbnRyYWwncyBGSEMuICovCiAJZmhjLT5uZXh0ID0gZmhjX2xpc3Q7CiAJZmhjX2xpc3QgPSBmaGM7CiAKIAlmaGMtPnBhcmVudCA9IGNlbnRyYWxfYnVzOwotCWZub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhwcm9tX2dldGNoaWxkKGNub2RlKSwgImZoYyIpOwotCWlmIChmbm9kZSA9PSAwIHx8IGZub2RlID09IC0xKQorCWZwID0gZHAtPmNoaWxkOworCXdoaWxlIChmcCkgeworCQlpZiAoIXN0cmNtcChmcC0+bmFtZSwgImZoYyIpKQorCQkJYnJlYWs7CisJCWZwID0gZnAtPnNpYmxpbmc7CisJfQorCWlmICghZnApCiAJCWNlbnRyYWxfcHJvYmVfZmFpbHVyZShfX0xJTkVfXyk7CiAKLQlmaGMtPnByb21fbm9kZSA9IGZub2RlOwotCXByb21fZ2V0c3RyaW5nKGZub2RlLCAibmFtZSIsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSk7Ci0Jc3RyY3B5KGZoYy0+cHJvbV9uYW1lLCBuYW1lYnVmKTsKLQotCWZoY19yYW5nZXNfaW5pdChmbm9kZSwgZmhjKTsKKwlmaGMtPnByb21fbm9kZSA9IGZwOworCWZoY19yYW5nZXNfaW5pdChmaGMpOwogCiAJLyogTm93LCBtYXAgaW4gRkhDIHJlZ2lzdGVyIHNldC4gKi8KLQlpZiAocHJvbV9nZXRwcm9wZXJ0eShmbm9kZSwgInJlZyIsIChjaGFyICopJmZwcmVnc1swXSwgc2l6ZW9mKGZwcmVncykpID09IC0xKQorCXByID0gb2ZfZ2V0X3Byb3BlcnR5KGZwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcikKIAkJY2VudHJhbF9wcm9iZV9mYWlsdXJlKF9fTElORV9fKTsKKwltZW1jcHkoZnByZWdzLCBwciwgc2l6ZW9mKGZwcmVncykpOwogCiAJYXBwbHlfY2VudHJhbF9yYW5nZXMoY2VudHJhbF9idXMsICZmcHJlZ3NbMF0sIDYpOwogCQpAQCAtMzY2LDcgKzM2NSw3IEBACiAJZmhjLT5qdGFnX21hc3RlciA9IDA7CiAKIAkvKiBBdHRhY2ggdGhlIGNsb2NrIGJvYXJkIHJlZ2lzdGVycyBmb3IgQ0VOVFJBTC4gKi8KLQlwcm9iZV9jbG9ja19ib2FyZChjZW50cmFsX2J1cywgZmhjLCBjbm9kZSwgZm5vZGUpOworCXByb2JlX2Nsb2NrX2JvYXJkKGNlbnRyYWxfYnVzLCBmaGMsIGZwKTsKIAogCWVyciA9IHVwYV9yZWFkbChmaGMtPmZoY19yZWdzLnByZWdzICsgRkhDX1BSRUdTX0lEKTsKIAlwcmludGsoIkZIQyhib2FyZCAlZCk6IFZlcnNpb25bJXhdIFBhcnRJRFsleF0gTWFudWZbJXhdIChDRU5UUkFMKVxuIiwKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvY2htYy5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKaW5kZXggOTdjZjkxMi4uMjU5ZjM3ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9jaG1jLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxhc20vc3BpdGZpcmUuaD4KICNpbmNsdWRlIDxhc20vY2htY3RybC5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgQ0hNQ1RSTF9OREdSUFMJMgpAQCAtNjcsNyArNjgsNiBAQAogc3RydWN0IG1jdHJsX2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIAlpbnQJCQlwb3J0aWQ7Ci0JaW50CQkJaW5kZXg7CiAKIAlzdHJ1Y3Qgb2JwX21lbV9sYXlvdXQJbGF5b3V0X3Byb3A7CiAJaW50CQkJbGF5b3V0X3NpemU7CkBAIC0zMzksMTIgKzMzOSwxMyBAQAogCQkJCSByZWFkX21jcmVnKG1wLCBDSE1DVFJMX0RFQ09ERTQpKTsKIH0KIAotc3RhdGljIGludCBpbml0X29uZV9tY3RybChpbnQgbm9kZSwgaW50IGluZGV4KQorc3RhdGljIGludCBpbml0X29uZV9tY3RybChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCXN0cnVjdCBtY3RybF9pbmZvICptcCA9IGttYWxsb2Moc2l6ZW9mKCptcCksIEdGUF9LRVJORUwpOwotCWludCBwb3J0aWQgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgInBvcnRpZCIsIC0xKTsKLQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyBwX3JlZ19wcm9wOwotCWludCB0OworCWludCBwb3J0aWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJwb3J0aWQiLCAtMSk7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJdm9pZCAqcHZhbDsKKwlpbnQgbGVuOwogCiAJaWYgKCFtcCkKIAkJcmV0dXJuIC0xOwpAQCAtMzUzLDI0ICszNTQsMjEgQEAKIAkJZ290byBmYWlsOwogCiAJbXAtPnBvcnRpZCA9IHBvcnRpZDsKLQltcC0+bGF5b3V0X3NpemUgPSBwcm9tX2dldHByb3BsZW4obm9kZSwgIm1lbW9yeS1sYXlvdXQiKTsKLQlpZiAobXAtPmxheW91dF9zaXplIDwgMCkKKwlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibWVtb3J5LWxheW91dCIsICZsZW4pOworCW1wLT5sYXlvdXRfc2l6ZSA9IGxlbjsKKwlpZiAoIXB2YWwpCiAJCW1wLT5sYXlvdXRfc2l6ZSA9IDA7Ci0JaWYgKG1wLT5sYXlvdXRfc2l6ZSA+IHNpemVvZihtcC0+bGF5b3V0X3Byb3ApKQorCWVsc2UgeworCQlpZiAobXAtPmxheW91dF9zaXplID4gc2l6ZW9mKG1wLT5sYXlvdXRfcHJvcCkpCisJCQlnb3RvIGZhaWw7CisJCW1lbWNweSgmbXAtPmxheW91dF9wcm9wLCBwdmFsLCBsZW4pOworCX0KKworCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZ3MgfHwgcmVncy0+cmVnX3NpemUgIT0gMHg0OCkKIAkJZ290byBmYWlsOwogCi0JaWYgKG1wLT5sYXlvdXRfc2l6ZSA+IDApCi0JCXByb21fZ2V0cHJvcGVydHkobm9kZSwgIm1lbW9yeS1sYXlvdXQiLAotCQkJCSAoY2hhciAqKSAmbXAtPmxheW91dF9wcm9wLAotCQkJCSBtcC0+bGF5b3V0X3NpemUpOwotCi0JdCA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsCi0JCQkgICAgIChjaGFyICopICZwX3JlZ19wcm9wLAotCQkJICAgICBzaXplb2YocF9yZWdfcHJvcCkpOwotCWlmICh0IDwgMCB8fCBwX3JlZ19wcm9wLnJlZ19zaXplICE9IDB4NDgpCi0JCWdvdG8gZmFpbDsKLQotCW1wLT5yZWdzID0gaW9yZW1hcChwX3JlZ19wcm9wLnBoeXNfYWRkciwgcF9yZWdfcHJvcC5yZWdfc2l6ZSk7CisJbXAtPnJlZ3MgPSBpb3JlbWFwKHJlZ3MtPnBoeXNfYWRkciwgcmVncy0+cmVnX3NpemUpOwogCWlmIChtcC0+cmVncyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAKQEAgLTM4NCwxMyArMzgyLDExIEBACiAKIAlmZXRjaF9kZWNvZGVfcmVncyhtcCk7CiAKLQltcC0+aW5kZXggPSBpbmRleDsKLQogCWxpc3RfYWRkKCZtcC0+bGlzdCwgJm1jdHJsX2xpc3QpOwogCiAJLyogUmVwb3J0IHRoZSBkZXZpY2UuICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2htYyVkOiBVUzMgbWVtb3J5IGNvbnRyb2xsZXIgYXQgJXAgWyVzXVxuIiwKLQkgICAgICAgbXAtPmluZGV4LAorCXByaW50ayhLRVJOX0lORk8gIiVzOiBVUzMgbWVtb3J5IGNvbnRyb2xsZXIgYXQgJXAgWyVzXVxuIiwKKwkgICAgICAgZHAtPmZ1bGxfbmFtZSwKIAkgICAgICAgbXAtPnJlZ3MsIChtcC0+bGF5b3V0X3NpemUgPyAiQUNUSVZFIiA6ICJJTkFDVElWRSIpKTsKIAogCXJldHVybiAwOwpAQCAtNDA0LDM0ICs0MDAsMTkgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHByb2JlX2Zvcl9zdHJpbmcoY2hhciAqbmFtZSwgaW50IGluZGV4KQotewotCWludCBub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7Ci0KLQl3aGlsZSAoKG5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsIG5hbWUpKSAhPSAwKSB7Ci0JCWludCByZXQgPSBpbml0X29uZV9tY3RybChub2RlLCBpbmRleCk7Ci0KLQkJaWYgKCFyZXQpCi0JCQlpbmRleCsrOwotCi0JCW5vZGUgPSBwcm9tX2dldHNpYmxpbmcobm9kZSk7Ci0JCWlmICghbm9kZSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBpbmRleDsKLX0KLQogc3RhdGljIGludCBfX2luaXQgY2htY19pbml0KHZvaWQpCiB7Ci0JaW50IGluZGV4OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAKIAkvKiBUaGlzIGRyaXZlciBpcyBvbmx5IGZvciBjaGVldGFoIHBsYXRmb3Jtcy4gKi8KIAlpZiAodGxiX3R5cGUgIT0gY2hlZXRhaCAmJiB0bGJfdHlwZSAhPSBjaGVldGFoX3BsdXMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaW5kZXggPSBwcm9iZV9mb3Jfc3RyaW5nKCJtZW1vcnktY29udHJvbGxlciIsIDApOwotCWluZGV4ID0gcHJvYmVfZm9yX3N0cmluZygibWMtdXMzIiwgaW5kZXgpOworCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgIm1lbW9yeS1jb250cm9sbGVyIikKKwkJaW5pdF9vbmVfbWN0cmwoZHApOworCisJZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRwLCAibWMtdXMzIikKKwkJaW5pdF9vbmVfbWN0cmwoZHApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL2RldmljZXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCmluZGV4IDBkZDk1YWUuLjM4OTMwMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvZGV2aWNlcy5jCkBAIC0zMyw3ICszMyw3IEBACiBleHRlcm4gdm9pZCBjZW50cmFsX3Byb2JlKHZvaWQpOwogCiB1MzIgc3VuNHZfdmRldl9kZXZoYW5kbGU7Ci1pbnQgc3VuNHZfdmRldl9yb290Oworc3RydWN0IGRldmljZV9ub2RlICpzdW40dl92ZGV2X3Jvb3Q7CiAKIHN0cnVjdCB2ZGV2X2ludG1hcCB7CiAJdW5zaWduZWQgaW50IHBoeXM7CkBAIC01MCwxMDIgKzUwLDY4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdmRldl9pbnRtYXAgKnZkZXZfaW50bWFwOwogc3RhdGljIGludCB2ZGV2X251bV9pbnRtYXA7Ci1zdGF0aWMgc3RydWN0IHZkZXZfaW50bWFzayB2ZGV2X2ludG1hc2s7CitzdGF0aWMgc3RydWN0IHZkZXZfaW50bWFzayAqdmRldl9pbnRtYXNrOwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc3VuNHZfdmlydHVhbF9kZXZpY2VfcHJvYmUodm9pZCkKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyByZWdzOwotCXN0cnVjdCB2ZGV2X2ludG1hcCAqaXA7Ci0JaW50IG5vZGUsIHN6LCBlcnI7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaW50IHN6OwogCiAJaWYgKHRsYl90eXBlICE9IGh5cGVydmlzb3IpCiAJCXJldHVybjsKIAotCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAidmlydHVhbC1kZXZpY2VzIik7Ci0JaWYgKCFub2RlKSB7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmlydHVhbC1kZXZpY2VzIik7CisJaWYgKCFkcCkgewogCQlwcm9tX3ByaW50ZigiU1VONFY6IEZhdGFsIGVycm9yLCBubyB2aXJ0dWFsLWRldmljZXMgbm9kZS5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAKLQlzdW40dl92ZGV2X3Jvb3QgPSBub2RlOworCXN1bjR2X3ZkZXZfcm9vdCA9IGRwOwogCi0JcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwgKGNoYXIgKikmcmVncywgc2l6ZW9mKHJlZ3MpKTsKLQlzdW40dl92ZGV2X2RldmhhbmRsZSA9IChyZWdzLnBoeXNfYWRkciA+PiAzMlVMKSAmIDB4MGZmZmZmZmY7CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisJc3VuNHZfdmRldl9kZXZoYW5kbGUgPSAocmVnc1swXS5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmOwogCi0Jc3ogPSBwcm9tX2dldHByb3BsZW4obm9kZSwgImludGVycnVwdC1tYXAiKTsKLQlpZiAoc3ogPD0gMCkgewotCQlwcm9tX3ByaW50ZigiU1VONFY6IEVycm9yLCBubyB2ZGV2IGludGVycnVwdC1tYXAuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZzeik7CisJdmRldl9pbnRtYXAgPSBwcm9wLT52YWx1ZTsKKwl2ZGV2X251bV9pbnRtYXAgPSBzeiAvIHNpemVvZihzdHJ1Y3QgdmRldl9pbnRtYXApOwogCi0JaWYgKChzeiAlIHNpemVvZigqaXApKSAhPSAwKSB7Ci0JCXByb21fcHJpbnRmKCJTVU40VjogQm9ndXMgaW50ZXJydXB0LW1hcCBwcm9wZXJ0eSBzaXplICVkXG4iLAotCQkJICAgIHN6KTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwgTlVMTCk7CisJdmRldl9pbnRtYXNrID0gcHJvcC0+dmFsdWU7CiAKLQl2ZGV2X2ludG1hcCA9IGlwID0gYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMoc3opOwotCWlmICghdmRldl9pbnRtYXApIHsKLQkJcHJvbV9wcmludGYoIlNVTjRWOiBFcnJvciwgY2Fubm90IGFsbG9jYXRlIHZkZXZfaW50bWFwLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KLQotCWVyciA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgImludGVycnVwdC1tYXAiLCAoY2hhciAqKSBpcCwgc3opOwotCWlmIChlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIlNVTjRWOiBGYXRhbCBlcnJvciwgbm8gdmRldiBpbnRlcnJ1cHQtbWFwLlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KLQlpZiAoZXJyICE9IHN6KSB7Ci0JCXByb21fcHJpbnRmKCJTVU40VjogSW5jb25zaXN0ZW50IGludGVycnVwdC1tYXAgc2l6ZSwgIgotCQkJICAgICJwcm9wbGVuKCVkKSB2cyBnZXRwcm9wKCVkKS5cbiIsIHN6LGVycik7Ci0JCXByb21faGFsdCgpOwotCX0KLQotCXZkZXZfbnVtX2ludG1hcCA9IGVyciAvIHNpemVvZigqaXApOwotCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwKLQkJCSAgICAgICAoY2hhciAqKSAmdmRldl9pbnRtYXNrLAotCQkJICAgICAgIHNpemVvZih2ZGV2X2ludG1hc2spKTsKLQlpZiAoZXJyIDw9IDApIHsKLQkJcHJvbV9wcmludGYoIlNVTjRWOiBGYXRhbCBlcnJvciwgbm8gdmRldiAiCi0JCQkgICAgImludGVycnVwdC1tYXAtbWFzay5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0JaWYgKGVyciAlIHNpemVvZih2ZGV2X2ludG1hc2spKSB7Ci0JCXByb21fcHJpbnRmKCJTVU40VjogQm9ndXMgaW50ZXJydXB0LW1hcC1tYXNrICIKLQkJCSAgICAicHJvcGVydHkgc2l6ZSAlZFxuIiwgZXJyKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCi0JcHJpbnRrKCJTVU40VjogdmlydHVhbC1kZXZpY2VzIGRldmhhbmRsZVsleF1cbiIsCi0JICAgICAgIHN1bjR2X3ZkZXZfZGV2aGFuZGxlKTsKKwlwcmludGsoIiVzOiBWaXJ0dWFsIERldmljZSBCdXMgZGV2aGFuZGxlWyV4XVxuIiwKKwkgICAgICAgZHAtPmZ1bGxfbmFtZSwgc3VuNHZfdmRldl9kZXZoYW5kbGUpOwogfQogCi11bnNpZ25lZCBpbnQgc3VuNHZfdmRldl9kZXZpY2VfaW50ZXJydXB0KHVuc2lnbmVkIGludCBkZXZfbm9kZSkKK3Vuc2lnbmVkIGludCBzdW40dl92ZGV2X2RldmljZV9pbnRlcnJ1cHQoc3RydWN0IGRldmljZV9ub2RlICpkZXZfbm9kZSkKIHsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdW5zaWduZWQgaW50IGlycSwgcmVnOwotCWludCBlcnIsIGk7CisJaW50IGk7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KGRldl9ub2RlLCAiaW50ZXJydXB0cyIsCi0JCQkgICAgICAgKGNoYXIgKikgJmlycSwgc2l6ZW9mKGlycSkpOwotCWlmIChlcnIgPD0gMCkgeworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRldl9ub2RlLCAiaW50ZXJydXB0cyIsIE5VTEwpOworCWlmICghcHJvcCkgewogCQlwcmludGsoIlZERVY6IENhbm5vdCBnZXQgXCJpbnRlcnJ1cHRzXCIgIgotCQkgICAgICAgInByb3BlcnR5IGZvciBPQlAgbm9kZSAleFxuIiwgZGV2X25vZGUpOworCQkgICAgICAgInByb3BlcnR5IGZvciBPQlAgbm9kZSAlc1xuIiwKKwkJICAgICAgIGRldl9ub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9CisJaXJxID0gKih1bnNpZ25lZCBpbnQgKikgcHJvcC0+dmFsdWU7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KGRldl9ub2RlLCAicmVnIiwKLQkJCSAgICAgICAoY2hhciAqKSAmcmVnLCBzaXplb2YocmVnKSk7Ci0JaWYgKGVyciA8PSAwKSB7CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZGV2X25vZGUsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApIHsKIAkJcHJpbnRrKCJWREVWOiBDYW5ub3QgZ2V0IFwicmVnXCIgIgotCQkgICAgICAgInByb3BlcnR5IGZvciBPQlAgbm9kZSAleFxuIiwgZGV2X25vZGUpOworCQkgICAgICAgInByb3BlcnR5IGZvciBPQlAgbm9kZSAlc1xuIiwKKwkJICAgICAgIGRldl9ub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9CisJcmVnID0gKih1bnNpZ25lZCBpbnQgKikgcHJvcC0+dmFsdWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgdmRldl9udW1faW50bWFwOyBpKyspIHsKLQkJaWYgKHZkZXZfaW50bWFwW2ldLnBoeXMgPT0gKHJlZyAmIHZkZXZfaW50bWFzay5waHlzKSAmJgotCQkgICAgdmRldl9pbnRtYXBbaV0uaXJxID09IChpcnEgJiB2ZGV2X2ludG1hc2suaW50ZXJydXB0KSkgeworCQlpZiAodmRldl9pbnRtYXBbaV0ucGh5cyA9PSAocmVnICYgdmRldl9pbnRtYXNrLT5waHlzKSAmJgorCQkgICAgdmRldl9pbnRtYXBbaV0uaXJxID09IChpcnEgJiB2ZGV2X2ludG1hc2stPmludGVycnVwdCkpIHsKIAkJCWlycSA9IHZkZXZfaW50bWFwW2ldLmNpbnRlcnJ1cHQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMTUzLDcgKzExOSw3IEBACiAKIAlpZiAoaSA9PSB2ZGV2X251bV9pbnRtYXApIHsKIAkJcHJpbnRrKCJWREVWOiBObyBtYXRjaGluZyBpbnRlcnJ1cHQgbWFwIGVudHJ5ICIKLQkJICAgICAgICJmb3IgT0JQIG5vZGUgJXhcbiIsIGRldl9ub2RlKTsKKwkJICAgICAgICJmb3IgT0JQIG5vZGUgJXNcbiIsIGRldl9ub2RlLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2NywzOCArMTMzLDQ0IEBACiAJcmV0dXJuICJwb3J0aWQiOwogfQogCi1zdGF0aWMgaW50IGdldF9jcHVfbWlkKGludCBwcm9tX25vZGUpCitzdGF0aWMgaW50IGdldF9jcHVfbWlkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCiAJaWYgKHRsYl90eXBlID09IGh5cGVydmlzb3IpIHsKLQkJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcmVnOworCQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcmVnOworCQlpbnQgbGVuOwogCi0JCWlmIChwcm9tX2dldHByb3BsZW4ocHJvbV9ub2RlLCAiY3B1aWQiKSA9PSA0KQotCQkJcmV0dXJuIHByb21fZ2V0aW50ZGVmYXVsdChwcm9tX25vZGUsICJjcHVpZCIsIDApOworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImNwdWlkIiwgJmxlbik7CisJCWlmIChwcm9wICYmIGxlbiA9PSA0KQorCQkJcmV0dXJuICooaW50ICopIHByb3AtPnZhbHVlOwogCi0JCXByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAicmVnIiwgKGNoYXIgKikgJnJlZywgc2l6ZW9mKHJlZykpOwotCQlyZXR1cm4gKHJlZy5waHlzX2FkZHIgPj4gMzIpICYgMHgwZmZmZmZmZlVMOworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCQlyZWcgPSBwcm9wLT52YWx1ZTsKKwkJcmV0dXJuIChyZWdbMF0ucGh5c19hZGRyID4+IDMyKSAmIDB4MGZmZmZmZmZVTDsKIAl9IGVsc2UgewogCQljb25zdCBjaGFyICpwcm9wX25hbWUgPSBjcHVfbWlkX3Byb3AoKTsKIAotCQlyZXR1cm4gcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fbm9kZSwgcHJvcF9uYW1lLCAwKTsKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsIHByb3BfbmFtZSwgTlVMTCk7CisJCWlmIChwcm9wKQorCQkJcmV0dXJuICooaW50ICopIHByb3AtPnZhbHVlOworCQlyZXR1cm4gMDsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2hlY2tfY3B1X25vZGUoaW50IG5kLCBpbnQgKmN1cl9pbnN0LAotCQkJICBpbnQgKCpjb21wYXJlKShpbnQsIGludCwgdm9pZCAqKSwgdm9pZCAqY29tcGFyZV9hcmcsCi0JCQkgIGludCAqcHJvbV9ub2RlLCBpbnQgKm1pZCkKK3N0YXRpYyBpbnQgY2hlY2tfY3B1X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpkcCwgaW50ICpjdXJfaW5zdCwKKwkJCSAgaW50ICgqY29tcGFyZSkoc3RydWN0IGRldmljZV9ub2RlICosIGludCwgdm9pZCAqKSwKKwkJCSAgdm9pZCAqY29tcGFyZV9hcmcsCisJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmRldl9ub2RlLCBpbnQgKm1pZCkKIHsKLQljaGFyIG5vZGVfc3RyWzEyOF07Ci0KLQlwcm9tX2dldHN0cmluZyhuZCwgImRldmljZV90eXBlIiwgbm9kZV9zdHIsIHNpemVvZihub2RlX3N0cikpOwotCWlmIChzdHJjbXAobm9kZV9zdHIsICJjcHUiKSkKKwlpZiAoc3RyY21wKGRwLT50eXBlLCAiY3B1IikpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFjb21wYXJlKG5kLCAqY3VyX2luc3QsIGNvbXBhcmVfYXJnKSkgewotCQlpZiAocHJvbV9ub2RlKQotCQkJKnByb21fbm9kZSA9IG5kOworCWlmICghY29tcGFyZShkcCwgKmN1cl9pbnN0LCBjb21wYXJlX2FyZykpIHsKKwkJaWYgKGRldl9ub2RlKQorCQkJKmRldl9ub2RlID0gZHA7CiAJCWlmIChtaWQpCi0JCQkqbWlkID0gZ2V0X2NwdV9taWQobmQpOworCQkJKm1pZCA9IGdldF9jcHVfbWlkKGRwKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMDcsMjUgKzE3OSwxOCBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW50IF9fY3B1X2ZpbmRfYnkoaW50ICgqY29tcGFyZSkoaW50LCBpbnQsIHZvaWQgKiksIHZvaWQgKmNvbXBhcmVfYXJnLAotCQkJIGludCAqcHJvbV9ub2RlLCBpbnQgKm1pZCkKK3N0YXRpYyBpbnQgX19jcHVfZmluZF9ieShpbnQgKCpjb21wYXJlKShzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgaW50LCB2b2lkICopLAorCQkJIHZvaWQgKmNvbXBhcmVfYXJnLAorCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmRldl9ub2RlLCBpbnQgKm1pZCkKIHsKLQlpbnQgbmQsIGN1cl9pbnN0LCBlcnI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlpbnQgY3VyX2luc3Q7CiAKLQluZCA9IHByb21fcm9vdF9ub2RlOwogCWN1cl9pbnN0ID0gMDsKLQotCWVyciA9IGNoZWNrX2NwdV9ub2RlKG5kLCAmY3VyX2luc3QsCi0JCQkgICAgIGNvbXBhcmUsIGNvbXBhcmVfYXJnLAotCQkJICAgICBwcm9tX25vZGUsIG1pZCk7Ci0JaWYgKGVyciA9PSAwKQotCQlyZXR1cm4gMDsKLQotCW5kID0gcHJvbV9nZXRjaGlsZChuZCk7Ci0Jd2hpbGUgKChuZCA9IHByb21fZ2V0c2libGluZyhuZCkpICE9IDApIHsKLQkJZXJyID0gY2hlY2tfY3B1X25vZGUobmQsICZjdXJfaW5zdCwKLQkJCQkgICAgIGNvbXBhcmUsIGNvbXBhcmVfYXJnLAotCQkJCSAgICAgcHJvbV9ub2RlLCBtaWQpOworCWZvcl9lYWNoX25vZGVfYnlfdHlwZShkcCwgImNwdSIpIHsKKwkJaW50IGVyciA9IGNoZWNrX2NwdV9ub2RlKGRwLCAmY3VyX2luc3QsCisJCQkJCSBjb21wYXJlLCBjb21wYXJlX2FyZywKKwkJCQkJIGRldl9ub2RlLCBtaWQpOwogCQlpZiAoZXJyID09IDApCiAJCQlyZXR1cm4gMDsKIAl9CkBAIC0yMzMsNyArMTk4LDcgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIGludCBjcHVfaW5zdGFuY2VfY29tcGFyZShpbnQgbmQsIGludCBpbnN0YW5jZSwgdm9pZCAqX2FyZykKK3N0YXRpYyBpbnQgY3B1X2luc3RhbmNlX2NvbXBhcmUoc3RydWN0IGRldmljZV9ub2RlICpkcCwgaW50IGluc3RhbmNlLCB2b2lkICpfYXJnKQogewogCWludCBkZXNpcmVkX2luc3RhbmNlID0gKGludCkgKGxvbmcpIF9hcmc7CiAKQEAgLTI0MiwyNyArMjA3LDI3IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLWludCBjcHVfZmluZF9ieV9pbnN0YW5jZShpbnQgaW5zdGFuY2UsIGludCAqcHJvbV9ub2RlLCBpbnQgKm1pZCkKK2ludCBjcHVfZmluZF9ieV9pbnN0YW5jZShpbnQgaW5zdGFuY2UsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmRldl9ub2RlLCBpbnQgKm1pZCkKIHsKIAlyZXR1cm4gX19jcHVfZmluZF9ieShjcHVfaW5zdGFuY2VfY29tcGFyZSwgKHZvaWQgKikobG9uZylpbnN0YW5jZSwKLQkJCSAgICAgcHJvbV9ub2RlLCBtaWQpOworCQkJICAgICBkZXZfbm9kZSwgbWlkKTsKIH0KIAotc3RhdGljIGludCBjcHVfbWlkX2NvbXBhcmUoaW50IG5kLCBpbnQgaW5zdGFuY2UsIHZvaWQgKl9hcmcpCitzdGF0aWMgaW50IGNwdV9taWRfY29tcGFyZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBpbnQgaW5zdGFuY2UsIHZvaWQgKl9hcmcpCiB7CiAJaW50IGRlc2lyZWRfbWlkID0gKGludCkgKGxvbmcpIF9hcmc7CiAJaW50IHRoaXNfbWlkOwogCi0JdGhpc19taWQgPSBnZXRfY3B1X21pZChuZCk7CisJdGhpc19taWQgPSBnZXRfY3B1X21pZChkcCk7CiAJaWYgKHRoaXNfbWlkID09IGRlc2lyZWRfbWlkKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotaW50IGNwdV9maW5kX2J5X21pZChpbnQgbWlkLCBpbnQgKnByb21fbm9kZSkKK2ludCBjcHVfZmluZF9ieV9taWQoaW50IG1pZCwgc3RydWN0IGRldmljZV9ub2RlICoqZGV2X25vZGUpCiB7CiAJcmV0dXJuIF9fY3B1X2ZpbmRfYnkoY3B1X21pZF9jb21wYXJlLCAodm9pZCAqKShsb25nKW1pZCwKLQkJCSAgICAgcHJvbV9ub2RlLCBOVUxMKTsKKwkJCSAgICAgZGV2X25vZGUsIE5VTEwpOwogfQogCiB2b2lkIF9faW5pdCBkZXZpY2Vfc2Nhbih2b2lkKQpAQCAtMjc0LDUwICsyMzksNDcgQEAKIAogI2lmbmRlZiBDT05GSUdfU01QCiAJewotCQlpbnQgZXJyLCBjcHVfbm9kZSwgZGVmOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCQlpbnQgZXJyLCBkZWY7CiAKLQkJZXJyID0gY3B1X2ZpbmRfYnlfaW5zdGFuY2UoMCwgJmNwdV9ub2RlLCBOVUxMKTsKKwkJZXJyID0gY3B1X2ZpbmRfYnlfaW5zdGFuY2UoMCwgJmRwLCBOVUxMKTsKIAkJaWYgKGVycikgewogCQkJcHJvbV9wcmludGYoIk5vIGNwdSBub2RlcywgY2Fubm90IGNvbnRpbnVlXG4iKTsKIAkJCXByb21faGFsdCgpOwogCQl9Ci0JCWNwdV9kYXRhKDApLmNsb2NrX3RpY2sgPSBwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsCi0JCQkJCQkJICAgICJjbG9jay1mcmVxdWVuY3kiLAotCQkJCQkJCSAgICAwKTsKKwkJY3B1X2RhdGEoMCkuY2xvY2tfdGljayA9CisJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLCAwKTsKIAogCQlkZWYgPSAoKHRsYl90eXBlID09IGh5cGVydmlzb3IpID8KIAkJICAgICAgICg4ICogMTAyNCkgOgogCQkgICAgICAgKDE2ICogMTAyNCkpOwotCQljcHVfZGF0YSgwKS5kY2FjaGVfc2l6ZSA9IHByb21fZ2V0aW50ZGVmYXVsdChjcHVfbm9kZSwKLQkJCQkJCQkgICAgICJkY2FjaGUtc2l6ZSIsCi0JCQkJCQkJICAgICBkZWYpOworCQljcHVfZGF0YSgwKS5kY2FjaGVfc2l6ZSA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwKKwkJCQkJCQkJImRjYWNoZS1zaXplIiwKKwkJCQkJCQkJZGVmKTsKIAogCQlkZWYgPSAzMjsKIAkJY3B1X2RhdGEoMCkuZGNhY2hlX2xpbmVfc2l6ZSA9Ci0JCQlwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsICJkY2FjaGUtbGluZS1zaXplIiwKLQkJCQkJICAgZGVmKTsKKwkJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImRjYWNoZS1saW5lLXNpemUiLCBkZWYpOwogCiAJCWRlZiA9IDE2ICogMTAyNDsKLQkJY3B1X2RhdGEoMCkuaWNhY2hlX3NpemUgPSBwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsCi0JCQkJCQkJICAgICAiaWNhY2hlLXNpemUiLAotCQkJCQkJCSAgICAgZGVmKTsKKwkJY3B1X2RhdGEoMCkuaWNhY2hlX3NpemUgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsCisJCQkJCQkJCSJpY2FjaGUtc2l6ZSIsCisJCQkJCQkJCWRlZik7CiAKIAkJZGVmID0gMzI7CiAJCWNwdV9kYXRhKDApLmljYWNoZV9saW5lX3NpemUgPQotCQkJcHJvbV9nZXRpbnRkZWZhdWx0KGNwdV9ub2RlLCAiaWNhY2hlLWxpbmUtc2l6ZSIsCi0JCQkJCSAgIGRlZik7CisJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJpY2FjaGUtbGluZS1zaXplIiwgZGVmKTsKIAogCQlkZWYgPSAoKHRsYl90eXBlID09IGh5cGVydmlzb3IpID8KIAkJICAgICAgICgzICogMTAyNCAqIDEwMjQpIDoKIAkJICAgICAgICg0ICogMTAyNCAqIDEwMjQpKTsKLQkJY3B1X2RhdGEoMCkuZWNhY2hlX3NpemUgPSBwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsCi0JCQkJCQkJICAgICAiZWNhY2hlLXNpemUiLAotCQkJCQkJCSAgICAgZGVmKTsKKwkJY3B1X2RhdGEoMCkuZWNhY2hlX3NpemUgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsCisJCQkJCQkJCSJlY2FjaGUtc2l6ZSIsCisJCQkJCQkJCWRlZik7CiAKIAkJZGVmID0gNjQ7CiAJCWNwdV9kYXRhKDApLmVjYWNoZV9saW5lX3NpemUgPQotCQkJcHJvbV9nZXRpbnRkZWZhdWx0KGNwdV9ub2RlLCAiZWNhY2hlLWxpbmUtc2l6ZSIsCi0JCQkJCSAgIGRlZik7CisJCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJlY2FjaGUtbGluZS1zaXplIiwgZGVmKTsKIAkJcHJpbnRrKCJDUFVbMF06IENhY2hlcyAiCiAJCSAgICAgICAiRFtzeiglZCk6bGluZV9zeiglZCldICIKIAkJICAgICAgICJJW3N6KCVkKTpsaW5lX3N6KCVkKV0gIgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lYnVzLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwppbmRleCBjNjk1MDRhLi45OGUwYThjIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2VidXMuYwpAQCAtMjY5LDEwICsyNjksNiBAQAogCiBzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1c19jaGFpbiA9IE5VTEw7CiAKLSNpZmRlZiBDT05GSUdfU1VOX0FVWElPCi1leHRlcm4gdm9pZCBhdXhpb19wcm9iZSh2b2lkKTsKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgKmVidXNfYWxsb2Moc2l6ZV90IHNpemUpCiB7CiAJdm9pZCAqbWVtOwpAQCAtMjgzLDc3ICsyNzksNTUgQEAKIAlyZXR1cm4gbWVtOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWJ1c19yYW5nZXNfaW5pdChzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1cykKLXsKLQlpbnQgc3VjY2VzczsKLQotCWVidXMtPm51bV9lYnVzX3JhbmdlcyA9IDA7Ci0Jc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkoZWJ1cy0+cHJvbV9ub2RlLCAicmFuZ2VzIiwKLQkJCQkgICAoY2hhciAqKWVidXMtPmVidXNfcmFuZ2VzLAotCQkJCSAgIHNpemVvZihlYnVzLT5lYnVzX3JhbmdlcykpOwotCWlmIChzdWNjZXNzICE9IC0xKQotCQllYnVzLT5udW1fZWJ1c19yYW5nZXMgPSAoc3VjY2Vzcy9zaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fZWJ1c19yYW5nZXMpKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGVidXNfaW50bWFwX2luaXQoc3RydWN0IGxpbnV4X2VidXMgKmVidXMpCi17Ci0JaW50IHN1Y2Nlc3M7Ci0KLQllYnVzLT5udW1fZWJ1c19pbnRtYXAgPSAwOwotCXN1Y2Nlc3MgPSBwcm9tX2dldHByb3BlcnR5KGVidXMtPnByb21fbm9kZSwgImludGVycnVwdC1tYXAiLAotCQkJCSAgIChjaGFyICopZWJ1cy0+ZWJ1c19pbnRtYXAsCi0JCQkJICAgc2l6ZW9mKGVidXMtPmVidXNfaW50bWFwKSk7Ci0JaWYgKHN1Y2Nlc3MgPT0gLTEpCi0JCXJldHVybjsKLQotCWVidXMtPm51bV9lYnVzX2ludG1hcCA9IChzdWNjZXNzL3NpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX2ludG1hcCkpOwotCi0Jc3VjY2VzcyA9IHByb21fZ2V0cHJvcGVydHkoZWJ1cy0+cHJvbV9ub2RlLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwKLQkJCQkgICAoY2hhciAqKSZlYnVzLT5lYnVzX2ludG1hc2ssCi0JCQkJICAgc2l6ZW9mKGVidXMtPmVidXNfaW50bWFzaykpOwotCWlmIChzdWNjZXNzID09IC0xKSB7Ci0JCXByb21fcHJpbnRmKCIlczogY2FuJ3QgZ2V0IGludGVycnVwdC1tYXAtbWFza1xuIiwgX19GVU5DVElPTl9fKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotfQotCiBpbnQgX19pbml0IGVidXNfaW50bWFwX21hdGNoKHN0cnVjdCBsaW51eF9lYnVzICplYnVzLAogCQkJICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZywKIAkJCSAgICAgaW50ICppbnRlcnJ1cHQpCiB7CisJc3RydWN0IGxpbnV4X3Byb21fZWJ1c19pbnRtYXAgKmltYXA7CisJc3RydWN0IGxpbnV4X3Byb21fZWJ1c19pbnRtYXNrICppbWFzazsKIAl1bnNpZ25lZCBpbnQgaGksIGxvLCBpcnE7Ci0JaW50IGk7CisJaW50IGksIGxlbiwgbl9pbWFwOwogCi0JaWYgKCFlYnVzLT5udW1fZWJ1c19pbnRtYXApCisJaW1hcCA9IG9mX2dldF9wcm9wZXJ0eShlYnVzLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwgJmxlbik7CisJaWYgKCFpbWFwKQorCQlyZXR1cm4gMDsKKwluX2ltYXAgPSBsZW4gLyBzaXplb2YoaW1hcFswXSk7CisKKwlpbWFzayA9IG9mX2dldF9wcm9wZXJ0eShlYnVzLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKKwlpZiAoIWltYXNrKQogCQlyZXR1cm4gMDsKIAotCWhpID0gcmVnLT53aGljaF9pbyAmIGVidXMtPmVidXNfaW50bWFzay5waHlzX2hpOwotCWxvID0gcmVnLT5waHlzX2FkZHIgJiBlYnVzLT5lYnVzX2ludG1hc2sucGh5c19sbzsKLQlpcnEgPSAqaW50ZXJydXB0ICYgZWJ1cy0+ZWJ1c19pbnRtYXNrLmludGVycnVwdDsKLQlmb3IgKGkgPSAwOyBpIDwgZWJ1cy0+bnVtX2VidXNfaW50bWFwOyBpKyspIHsKLQkJaWYgKChlYnVzLT5lYnVzX2ludG1hcFtpXS5waHlzX2hpID09IGhpKSAmJgotCQkgICAgKGVidXMtPmVidXNfaW50bWFwW2ldLnBoeXNfbG8gPT0gbG8pICYmCi0JCSAgICAoZWJ1cy0+ZWJ1c19pbnRtYXBbaV0uaW50ZXJydXB0ID09IGlycSkpIHsKLQkJCSppbnRlcnJ1cHQgPSBlYnVzLT5lYnVzX2ludG1hcFtpXS5jaW50ZXJydXB0OworCWhpID0gcmVnLT53aGljaF9pbyAmIGltYXNrLT5waHlzX2hpOworCWxvID0gcmVnLT5waHlzX2FkZHIgJiBpbWFzay0+cGh5c19sbzsKKwlpcnEgPSAqaW50ZXJydXB0ICYgaW1hc2stPmludGVycnVwdDsKKwlmb3IgKGkgPSAwOyBpIDwgbl9pbWFwOyBpKyspIHsKKwkJaWYgKChpbWFwW2ldLnBoeXNfaGkgPT0gaGkpICYmCisJCSAgICAoaW1hcFtpXS5waHlzX2xvID09IGxvKSAmJgorCQkgICAgKGltYXBbaV0uaW50ZXJydXB0ID09IGlycSkpIHsKKwkJCSppbnRlcnJ1cHQgPSBpbWFwW2ldLmNpbnRlcnJ1cHQ7CiAJCQlyZXR1cm4gMDsKIAkJfQogCX0KIAlyZXR1cm4gLTE7CiB9CiAKLXZvaWQgX19pbml0IGZpbGxfZWJ1c19jaGlsZChpbnQgbm9kZSwgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpwcmVnLAotCQkJICAgIHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICpkZXYsIGludCBub25fc3RhbmRhcmRfcmVncykKK3ZvaWQgX19pbml0IGZpbGxfZWJ1c19jaGlsZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLAorCQkJICAgIHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHJlZywKKwkJCSAgICBzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqZGV2LAorCQkJICAgIGludCBub25fc3RhbmRhcmRfcmVncykKIHsKLQlpbnQgcmVnc1tQUk9NUkVHX01BWF07Ci0JaW50IGlycXNbUFJPTVJFR19NQVhdOworCWludCAqcmVnczsKKwlpbnQgKmlycXM7CiAJaW50IGksIGxlbjsKIAotCWRldi0+cHJvbV9ub2RlID0gbm9kZTsKLQlwcm9tX2dldHN0cmluZyhub2RlLCAibmFtZSIsIGRldi0+cHJvbV9uYW1lLCBzaXplb2YoZGV2LT5wcm9tX25hbWUpKTsKLQlwcmludGsoIiAoJXMpIiwgZGV2LT5wcm9tX25hbWUpOworCWRldi0+cHJvbV9ub2RlID0gZHA7CisJcHJpbnRrKCIgKCVzKSIsIGRwLT5uYW1lKTsKIAotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsICh2b2lkICopcmVncywgc2l6ZW9mKHJlZ3MpKTsKLQlkZXYtPm51bV9hZGRycyA9IGxlbiAvIHNpemVvZihyZWdzWzBdKTsKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7CisJaWYgKCFyZWdzKQorCQlkZXYtPm51bV9hZGRycyA9IDA7CisJZWxzZQorCQlkZXYtPm51bV9hZGRycyA9IGxlbiAvIHNpemVvZihyZWdzWzBdKTsKIAogCWlmIChub25fc3RhbmRhcmRfcmVncykgewogCQkvKiBUaGlzIGlzIHRvIGhhbmRsZSByZWcgcHJvcGVydGllcyB3aGljaCBhcmUgbm90CkBAIC0zNzAsMjEgKzM0NCwyMSBAQAogCQkJaW50IHJudW0gPSByZWdzW2ldOwogCQkJaWYgKHJudW0gPj0gZGV2LT5wYXJlbnQtPm51bV9hZGRycykgewogCQkJCXByb21fcHJpbnRmKCJVR0g6IHByb3BlcnR5IGZvciAlcyB3YXMgJWQsIG5lZWQgPCAlZFxuIiwKLQkJCQkJICAgIGRldi0+cHJvbV9uYW1lLCBsZW4sIGRldi0+cGFyZW50LT5udW1fYWRkcnMpOwotCQkJCXBhbmljKF9fRlVOQ1RJT05fXyk7CisJCQkJCSAgICBkcC0+bmFtZSwgbGVuLCBkZXYtPnBhcmVudC0+bnVtX2FkZHJzKTsKKwkJCQlwcm9tX2hhbHQoKTsKIAkJCX0KIAkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPSBkZXYtPnBhcmVudC0+cmVzb3VyY2VbaV0uc3RhcnQ7CiAJCQlkZXYtPnJlc291cmNlW2ldLmVuZCA9IGRldi0+cGFyZW50LT5yZXNvdXJjZVtpXS5lbmQ7CiAJCQlkZXYtPnJlc291cmNlW2ldLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0JCQlkZXYtPnJlc291cmNlW2ldLm5hbWUgPSBkZXYtPnByb21fbmFtZTsKKwkJCWRldi0+cmVzb3VyY2VbaV0ubmFtZSA9IGRwLT5uYW1lOwogCQl9CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IFBST01JTlRSX01BWDsgaSsrKQogCQlkZXYtPmlycXNbaV0gPSBQQ0lfSVJRX05PTkU7CiAKLQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJpbnRlcnJ1cHRzIiwgKGNoYXIgKikmaXJxcywgc2l6ZW9mKGlycXMpKTsKLQlpZiAoKGxlbiA9PSAtMSkgfHwgKGxlbiA9PSAwKSkgeworCWlycXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgJmxlbik7CisJaWYgKCFpcnFzKSB7CiAJCWRldi0+bnVtX2lycXMgPSAwOwogCQkvKgogCQkgKiBPaCwgd2VsbCwgc29tZSBQUk9NcyBkb24ndCBleHBvcnQgaW50ZXJydXB0cwpAQCAtMzkyLDggKzM2Niw4IEBACiAJCSAqCiAJCSAqIEJlIHNtYXJ0IGFib3V0IFBTLzIga2V5Ym9hcmQgYW5kIG1vdXNlLgogCQkgKi8KLQkJaWYgKCFzdHJjbXAoZGV2LT5wYXJlbnQtPnByb21fbmFtZSwgIjgwNDIiKSkgewotCQkJaWYgKCFzdHJjbXAoZGV2LT5wcm9tX25hbWUsICJrYl9wczIiKSkgeworCQlpZiAoIXN0cmNtcChkZXYtPnBhcmVudC0+cHJvbV9ub2RlLT5uYW1lLCAiODA0MiIpKSB7CisJCQlpZiAoIXN0cmNtcChkZXYtPnByb21fbm9kZS0+bmFtZSwgImtiX3BzMiIpKSB7CiAJCQkJZGV2LT5udW1faXJxcyA9IDE7CiAJCQkJZGV2LT5pcnFzWzBdID0gZGV2LT5wYXJlbnQtPmlycXNbMF07CiAJCQl9IGVsc2UgewpAQCAtNDIzLDMyICszOTcsMzIgQEAKIAogc3RhdGljIGludCBfX2luaXQgY2hpbGRfcmVnc19ub25zdGFuZGFyZChzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldikKIHsKLQlpZiAoIXN0cmNtcChkZXYtPnByb21fbmFtZSwgImkyYyIpIHx8Ci0JICAgICFzdHJjbXAoZGV2LT5wcm9tX25hbWUsICJTVU5XLGxvbWJ1cyIpKQorCWlmICghc3RyY21wKGRldi0+cHJvbV9ub2RlLT5uYW1lLCAiaTJjIikgfHwKKwkgICAgIXN0cmNtcChkZXYtPnByb21fbm9kZS0+bmFtZSwgIlNVTlcsbG9tYnVzIikpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCi12b2lkIF9faW5pdCBmaWxsX2VidXNfZGV2aWNlKGludCBub2RlLCBzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmRldikKK3ZvaWQgX19pbml0IGZpbGxfZWJ1c19kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzIHJlZ3NbUFJPTVJFR19NQVhdOworCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAlzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZCAqY2hpbGQ7Ci0JaW50IGlycXNbUFJPTUlOVFJfTUFYXTsKKwlpbnQgKmlycXM7CiAJaW50IGksIG4sIGxlbjsKIAotCWRldi0+cHJvbV9ub2RlID0gbm9kZTsKLQlwcm9tX2dldHN0cmluZyhub2RlLCAibmFtZSIsIGRldi0+cHJvbV9uYW1lLCBzaXplb2YoZGV2LT5wcm9tX25hbWUpKTsKLQlwcmludGsoIiBbJXMiLCBkZXYtPnByb21fbmFtZSk7CisJZGV2LT5wcm9tX25vZGUgPSBkcDsKIAotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsICh2b2lkICopcmVncywgc2l6ZW9mKHJlZ3MpKTsKLQlpZiAobGVuID09IC0xKSB7CisJcHJpbnRrKCIgWyVzIiwgZHAtPm5hbWUpOworCisJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOworCWlmICghcmVncykgewogCQlkZXYtPm51bV9hZGRycyA9IDA7CiAJCWdvdG8gcHJvYmVfaW50ZXJydXB0czsKIAl9CiAKIAlpZiAobGVuICUgc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykpIHsKIAkJcHJvbV9wcmludGYoIlVHSDogcHJvcGxlbiBmb3IgJXMgd2FzICVkLCBuZWVkIG11bHRpcGxlIG9mICVkXG4iLAotCQkJICAgIGRldi0+cHJvbV9uYW1lLCBsZW4sCisJCQkgICAgZGV2LT5wcm9tX25vZGUtPm5hbWUsIGxlbiwKIAkJCSAgICAoaW50KXNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpKTsKIAkJcHJvbV9oYWx0KCk7CiAJfQpAQCAtNDY2LDcgKzQ0MCw3IEBACiAJCWRldi0+cmVzb3VyY2VbaV0uZW5kICAgID0KIAkJCShkZXYtPnJlc291cmNlW2ldLnN0YXJ0ICsgKHVuc2lnbmVkIGxvbmcpcmVnc1tpXS5yZWdfc2l6ZSAtIDFVTCk7CiAJCWRldi0+cmVzb3VyY2VbaV0uZmxhZ3MgID0gSU9SRVNPVVJDRV9NRU07Ci0JCWRldi0+cmVzb3VyY2VbaV0ubmFtZSAgID0gZGV2LT5wcm9tX25hbWU7CisJCWRldi0+cmVzb3VyY2VbaV0ubmFtZSAgID0gZGV2LT5wcm9tX25vZGUtPm5hbWU7CiAJCXJlcXVlc3RfcmVzb3VyY2UoJmRldi0+YnVzLT5zZWxmLT5yZXNvdXJjZVtuXSwKIAkJCQkgJmRldi0+cmVzb3VyY2VbaV0pOwogCX0KQEAgLTQ3NSw4ICs0NDksOCBAQAogCWZvciAoaSA9IDA7IGkgPCBQUk9NSU5UUl9NQVg7IGkrKykKIAkJZGV2LT5pcnFzW2ldID0gUENJX0lSUV9OT05FOwogCi0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0cyIsIChjaGFyICopJmlycXMsIHNpemVvZihpcnFzKSk7Ci0JaWYgKChsZW4gPT0gLTEpIHx8IChsZW4gPT0gMCkpIHsKKwlpcnFzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0cyIsICZsZW4pOworCWlmICghaXJxcykgewogCQlkZXYtPm51bV9pcnFzID0gMDsKIAl9IGVsc2UgewogCQlkZXYtPm51bV9pcnFzID0gbGVuIC8gc2l6ZW9mKGlycXNbMF0pOwpAQCAtNDk3LDcgKzQ3MSwxOCBAQAogCQl9CiAJfQogCi0JaWYgKChub2RlID0gcHJvbV9nZXRjaGlsZChub2RlKSkpIHsKKwlkZXYtPm9mZGV2Lm5vZGUgPSBkcDsKKwlkZXYtPm9mZGV2LmRldi5wYXJlbnQgPSAmZGV2LT5idXMtPm9mZGV2LmRldjsKKwlkZXYtPm9mZGV2LmRldi5idXMgPSAmZWJ1c19idXNfdHlwZTsKKwlzdHJjcHkoZGV2LT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisKKwkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KKwlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KSAhPSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAorCQkgICAgICAgZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKworCWRwID0gZHAtPmNoaWxkOworCWlmIChkcCkgewogCQlwcmludGsoIiAtPiIpOwogCQlkZXYtPmNoaWxkcmVuID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKIApAQCAtNTA1LDE4ICs0OTAsMTggQEAKIAkJY2hpbGQtPm5leHQgPSBOVUxMOwogCQljaGlsZC0+cGFyZW50ID0gZGV2OwogCQljaGlsZC0+YnVzID0gZGV2LT5idXM7Ci0JCWZpbGxfZWJ1c19jaGlsZChub2RlLCAmcmVnc1swXSwKLQkJCQljaGlsZCwgY2hpbGRfcmVnc19ub25zdGFuZGFyZChkZXYpKTsKKwkJZmlsbF9lYnVzX2NoaWxkKGRwLCByZWdzLCBjaGlsZCwKKwkJCQljaGlsZF9yZWdzX25vbnN0YW5kYXJkKGRldikpOwogCi0JCXdoaWxlICgobm9kZSA9IHByb21fZ2V0c2libGluZyhub2RlKSkgIT0gMCkgeworCQl3aGlsZSAoKGRwID0gZHAtPnNpYmxpbmcpICE9IE5VTEwpIHsKIAkJCWNoaWxkLT5uZXh0ID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfY2hpbGQpKTsKIAogCQkJY2hpbGQgPSBjaGlsZC0+bmV4dDsKIAkJCWNoaWxkLT5uZXh0ID0gTlVMTDsKIAkJCWNoaWxkLT5wYXJlbnQgPSBkZXY7CiAJCQljaGlsZC0+YnVzID0gZGV2LT5idXM7Ci0JCQlmaWxsX2VidXNfY2hpbGQobm9kZSwgJnJlZ3NbMF0sCi0JCQkJCWNoaWxkLCBjaGlsZF9yZWdzX25vbnN0YW5kYXJkKGRldikpOworCQkJZmlsbF9lYnVzX2NoaWxkKGRwLCByZWdzLCBjaGlsZCwKKwkJCQkJY2hpbGRfcmVnc19ub25zdGFuZGFyZChkZXYpKTsKIAkJfQogCX0KIAlwcmludGsoIl0iKTsKQEAgLTU0Myw3ICs1MjgsOCBAQAogCXN0cnVjdCBsaW51eF9lYnVzICplYnVzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBwY2lkZXZfY29va2llICpjb29raWU7Ci0JaW50IG5kLCBlYnVzbmQsIGlzX3JpbzsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCWludCBpc19yaW87CiAJaW50IG51bV9lYnVzID0gMDsKIAogCXBkZXYgPSBmaW5kX25leHRfZWJ1cyhOVUxMLCAmaXNfcmlvKTsKQEAgLTU1MywyMCArNTM5LDIyIEBACiAJfQogCiAJY29va2llID0gcGRldi0+c3lzZGF0YTsKLQllYnVzbmQgPSBjb29raWUtPnByb21fbm9kZTsKKwlkcCA9IGNvb2tpZS0+cHJvbV9ub2RlOwogCiAJZWJ1c19jaGFpbiA9IGVidXMgPSBlYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1cykpOwogCWVidXMtPm5leHQgPSBOVUxMOwogCWVidXMtPmlzX3JpbyA9IGlzX3JpbzsKIAotCXdoaWxlIChlYnVzbmQpIHsKKwl3aGlsZSAoZHApIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKKwogCQkvKiBTVU5XLHBjaS1xZmUgdXNlcyBmb3VyIGVtcHR5IGVidXNlcyBvbiBpdC4KIAkJICAgSSB0aGluayB3ZSBzaG91bGQgbm90IGNvbnNpZGVyIHRoZW0gaGVyZSwKIAkJICAgYXMgdGhleSBoYXZlIGhhbGYgb2YgdGhlIHByb3BlcnRpZXMgdGhpcwogCQkgICBjb2RlIGV4cGVjdHMgYW5kIG9uY2Ugd2UgZG8gUENJIGhvdC1wbHVnLAogCQkgICB3ZSdkIGhhdmUgdG8gdHdlYWsgd2l0aCB0aGUgZWJ1c19jaGFpbgogCQkgICBpbiB0aGUgcnVudGltZSBhZnRlciBpbml0aWFsaXphdGlvbi4gLWpqICovCi0JCWlmICghcHJvbV9nZXRjaGlsZCAoZWJ1c25kKSkgeworCQlpZiAoIWRwLT5jaGlsZCkgewogCQkJcGRldiA9IGZpbmRfbmV4dF9lYnVzKHBkZXYsICZpc19yaW8pOwogCQkJaWYgKCFwZGV2KSB7CiAJCQkJaWYgKGVidXMgPT0gZWJ1c19jaGFpbikgewpAQCAtNTc4LDIyICs1NjYsMjkgQEAKIAkJCX0KIAkJCWVidXMtPmlzX3JpbyA9IGlzX3JpbzsKIAkJCWNvb2tpZSA9IHBkZXYtPnN5c2RhdGE7Ci0JCQllYnVzbmQgPSBjb29raWUtPnByb21fbm9kZTsKKwkJCWRwID0gY29va2llLT5wcm9tX25vZGU7CiAJCQljb250aW51ZTsKIAkJfQogCQlwcmludGsoImVidXMlZDoiLCBudW1fZWJ1cyk7CiAKLQkJcHJvbV9nZXRzdHJpbmcoZWJ1c25kLCAibmFtZSIsIGVidXMtPnByb21fbmFtZSwgc2l6ZW9mKGVidXMtPnByb21fbmFtZSkpOwogCQllYnVzLT5pbmRleCA9IG51bV9lYnVzOwotCQllYnVzLT5wcm9tX25vZGUgPSBlYnVzbmQ7CisJCWVidXMtPnByb21fbm9kZSA9IGRwOwogCQllYnVzLT5zZWxmID0gcGRldjsKIAkJZWJ1cy0+cGFyZW50ID0gcGJtID0gY29va2llLT5wYm07CiAKLQkJZWJ1c19yYW5nZXNfaW5pdChlYnVzKTsKLQkJZWJ1c19pbnRtYXBfaW5pdChlYnVzKTsKKwkJZWJ1cy0+b2ZkZXYubm9kZSA9IGRwOworCQllYnVzLT5vZmRldi5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwkJZWJ1cy0+b2ZkZXYuZGV2LmJ1cyA9ICZlYnVzX2J1c190eXBlOworCQlzdHJjcHkoZWJ1cy0+b2ZkZXYuZGV2LmJ1c19pZCwgZHAtPnBhdGhfY29tcG9uZW50X25hbWUpOwogCi0JCW5kID0gcHJvbV9nZXRjaGlsZChlYnVzbmQpOwotCQlpZiAoIW5kKQorCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KKwkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmZWJ1cy0+b2ZkZXYpICE9IDApCisJCQlwcmludGsoS0VSTl9ERUJVRyAiZWJ1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAorCQkJICAgICAgIGVidXMtPm9mZGV2LmRldi5idXNfaWQpOworCisKKwkJY2hpbGQgPSBkcC0+Y2hpbGQ7CisJCWlmICghY2hpbGQpCiAJCQlnb3RvIG5leHRfZWJ1czsKIAogCQllYnVzLT5kZXZpY2VzID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlKSk7CkBAIC02MDIsMTYgKzU5NywxNiBAQAogCQlkZXYtPm5leHQgPSBOVUxMOwogCQlkZXYtPmNoaWxkcmVuID0gTlVMTDsKIAkJZGV2LT5idXMgPSBlYnVzOwotCQlmaWxsX2VidXNfZGV2aWNlKG5kLCBkZXYpOworCQlmaWxsX2VidXNfZGV2aWNlKGNoaWxkLCBkZXYpOwogCi0JCXdoaWxlICgobmQgPSBwcm9tX2dldHNpYmxpbmcobmQpKSAhPSAwKSB7CisJCXdoaWxlICgoY2hpbGQgPSBjaGlsZC0+c2libGluZykgIT0gTlVMTCkgewogCQkJZGV2LT5uZXh0ID0gZWJ1c19hbGxvYyhzaXplb2Yoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlKSk7CiAKIAkJCWRldiA9IGRldi0+bmV4dDsKIAkJCWRldi0+bmV4dCA9IE5VTEw7CiAJCQlkZXYtPmNoaWxkcmVuID0gTlVMTDsKIAkJCWRldi0+YnVzID0gZWJ1czsKLQkJCWZpbGxfZWJ1c19kZXZpY2UobmQsIGRldik7CisJCQlmaWxsX2VidXNfZGV2aWNlKGNoaWxkLCBkZXYpOwogCQl9CiAKIAluZXh0X2VidXM6CkBAIC02MjIsNyArNjE3LDcgQEAKIAkJCWJyZWFrOwogCiAJCWNvb2tpZSA9IHBkZXYtPnN5c2RhdGE7Ci0JCWVidXNuZCA9IGNvb2tpZS0+cHJvbV9ub2RlOworCQlkcCA9IGNvb2tpZS0+cHJvbV9ub2RlOwogCiAJCWVidXMtPm5leHQgPSBlYnVzX2FsbG9jKHNpemVvZihzdHJ1Y3QgbGludXhfZWJ1cykpOwogCQllYnVzID0gZWJ1cy0+bmV4dDsKQEAgLTYzMSw4ICs2MjYsNCBAQAogCQkrK251bV9lYnVzOwogCX0KIAlwY2lfZGV2X3B1dChwZGV2KTsgLyogWFhYIGZvciB0aGUgY2FzZSwgd2hlbiBlYnVzbmQgaXMgMCwgaXMgaXQgT0s/ICovCi0KLSNpZmRlZiBDT05GSUdfU1VOX0FVWElPCi0JYXV4aW9fcHJvYmUoKTsKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXJxLmMKaW5kZXggYThjOWRjOC4uMzFlMGZiYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lycS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3VwYS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9zdGFyZmlyZS5oPgpAQCAtNjM1LDIzICs2MzYsMjkgQEAKIAogc3RhdGljIHZvaWQgbWFwX3Byb21fdGltZXJzKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IGFkZHJbM107Ci0JaW50IHRub2RlLCBlcnI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwl1bnNpZ25lZCBpbnQgKmFkZHI7CiAKIAkvKiBQUk9NIHRpbWVyIG5vZGUgaGFuZ3Mgb3V0IGluIHRoZSB0b3AgbGV2ZWwgb2YgZGV2aWNlIHNpYmxpbmdzLi4uICovCi0JdG5vZGUgPSBwcm9tX2ZpbmRkZXZpY2UoIi9jb3VudGVyLXRpbWVyIik7CisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWRwID0gZHAtPmNoaWxkOworCXdoaWxlIChkcCkgeworCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImNvdW50ZXItdGltZXIiKSkKKwkJCWJyZWFrOworCQlkcCA9IGRwLT5zaWJsaW5nOworCX0KIAogCS8qIEFzc3VtZSBpZiBub2RlIGlzIG5vdCBwcmVzZW50LCBQUk9NIHVzZXMgZGlmZmVyZW50IHRpY2sgbWVjaGFuaXNtCiAJICogd2hpY2ggd2Ugc2hvdWxkIG5vdCBjYXJlIGFib3V0LgogCSAqLwotCWlmICh0bm9kZSA9PSAwIHx8IHRub2RlID09IC0xKSB7CisJaWYgKCFkcCkgewogCQlwcm9tX3RpbWVycyA9IChzdHJ1Y3Qgc3VuNV90aW1lciAqKSAwOwogCQlyZXR1cm47CiAJfQogCiAJLyogSWYgUFJPTSBpcyByZWFsbHkgdXNpbmcgdGhpcywgaXQgbXVzdCBiZSBtYXBwZWQgYnkgaGltLiAqLwotCWVyciA9IHByb21fZ2V0cHJvcGVydHkodG5vZGUsICJhZGRyZXNzIiwgKGNoYXIgKilhZGRyLCBzaXplb2YoYWRkcikpOwotCWlmIChlcnIgPT0gLTEpIHsKKwlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAiYWRkcmVzcyIsIE5VTEwpOworCWlmICghYWRkcikgewogCQlwcm9tX3ByaW50ZigiUFJPTSBkb2VzIG5vdCBoYXZlIHRpbWVyIG1hcHBlZCwgdHJ5aW5nIHRvIGNvbnRpbnVlLlxuIik7CiAJCXByb21fdGltZXJzID0gKHN0cnVjdCBzdW41X3RpbWVyICopIDA7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL2lzYS5jCmluZGV4IDMwODYyYWIuLjZmMTZkZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvaXNhLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9pc2EuYwpAQCAtMTUsMjMgKzE1LDE5IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgcmVwb3J0X2RldihzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZSAqaXNhX2RldiwgaW50IGNoaWxkKQogewogCWlmIChjaGlsZCkKLQkJcHJpbnRrKCIgKCVzKSIsIGlzYV9kZXYtPnByb21fbmFtZSk7CisJCXByaW50aygiICglcykiLCBpc2FfZGV2LT5wcm9tX25vZGUtPm5hbWUpOwogCWVsc2UKLQkJcHJpbnRrKCIgWyVzIiwgaXNhX2Rldi0+cHJvbV9uYW1lKTsKKwkJcHJpbnRrKCIgWyVzIiwgaXNhX2Rldi0+cHJvbV9ub2RlLT5uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGlzYV9kZXZfZ2V0X3Jlc291cmNlKHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2LAotCQkJCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnByZWdzLAotCQkJCQlpbnQgcHJlZ3Nfc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKiBfX2luaXQKK2lzYV9kZXZfZ2V0X3Jlc291cmNlKHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2KQogeworCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcHJlZ3M7CiAJdW5zaWduZWQgbG9uZyBiYXNlLCBsZW47CiAJaW50IHByb3BfbGVuOwogCi0JcHJvcF9sZW4gPSBwcm9tX2dldHByb3BlcnR5KGlzYV9kZXYtPnByb21fbm9kZSwgInJlZyIsCi0JCQkJICAgIChjaGFyICopIHByZWdzLCBwcmVnc19zaXplKTsKLQotCWlmIChwcm9wX2xlbiA8PSAwKQotCQlyZXR1cm47CisJcHJlZ3MgPSBvZl9nZXRfcHJvcGVydHkoaXNhX2Rldi0+cHJvbV9ub2RlLCAicmVnIiwgJnByb3BfbGVuKTsKIAogCS8qIE9ubHkgdGhlIGZpcnN0IG9uZSBpcyBpbnRlcmVzdGluZy4gKi8KIAlsZW4gPSBwcmVnc1swXS5yZWdfc2l6ZTsKQEAgLTQyLDEwICszOCwxMiBAQAogCWlzYV9kZXYtPnJlc291cmNlLnN0YXJ0ID0gYmFzZTsKIAlpc2FfZGV2LT5yZXNvdXJjZS5lbmQgICA9IChiYXNlICsgbGVuIC0gMVVMKTsKIAlpc2FfZGV2LT5yZXNvdXJjZS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0JaXNhX2Rldi0+cmVzb3VyY2UubmFtZSAgPSBpc2FfZGV2LT5wcm9tX25hbWU7CisJaXNhX2Rldi0+cmVzb3VyY2UubmFtZSAgPSBpc2FfZGV2LT5wcm9tX25vZGUtPm5hbWU7CiAKIAlyZXF1ZXN0X3Jlc291cmNlKCZpc2FfZGV2LT5idXMtPnBhcmVudC0+aW9fc3BhY2UsCiAJCQkgJmlzYV9kZXYtPnJlc291cmNlKTsKKworCXJldHVybiBwcmVnczsKIH0KIAogLyogSSBjYW4ndCBiZWxpZXZlIHRoZXkgZGlkbid0IHB1dCBhIHJlYWwgSU5PIGluIHRoZSBpc2EgZGV2aWNlCkBAIC03NCwxOSArNzIsMzAgQEAKIHN0YXRpYyBpbnQgX19pbml0IGlzYV9kZXZfZ2V0X2lycV91c2luZ19pbWFwKHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2LAogCQkJCQkgICAgIHN0cnVjdCBzcGFyY19pc2FfYnJpZGdlICppc2FfYnIsCiAJCQkJCSAgICAgaW50ICppbnRlcnJ1cHQsCi0JCQkJCSAgICAgc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpwcmVncykKKwkJCQkJICAgICBzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZykKIHsKKwlzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX2ludG1hcCAqaW1hcDsKKwlzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX2ludG1hcCAqaW1hc2s7CiAJdW5zaWduZWQgaW50IGhpLCBsbywgaXJxOwotCWludCBpOworCWludCBpLCBsZW4sIG5faW1hcDsKIAotCWhpID0gcHJlZ3MtPndoaWNoX2lvICYgaXNhX2JyLT5pc2FfaW50bWFzay5waHlzX2hpOwotCWxvID0gcHJlZ3MtPnBoeXNfYWRkciAmIGlzYV9ici0+aXNhX2ludG1hc2sucGh5c19sbzsKLQlpcnEgPSAqaW50ZXJydXB0ICYgaXNhX2JyLT5pc2FfaW50bWFzay5pbnRlcnJ1cHQ7Ci0JZm9yIChpID0gMDsgaSA8IGlzYV9ici0+bnVtX2lzYV9pbnRtYXA7IGkrKykgewotCQlpZiAoKGlzYV9ici0+aXNhX2ludG1hcFtpXS5waHlzX2hpID09IGhpKSAmJgotCQkgICAgKGlzYV9ici0+aXNhX2ludG1hcFtpXS5waHlzX2xvID09IGxvKSAmJgotCQkgICAgKGlzYV9ici0+aXNhX2ludG1hcFtpXS5pbnRlcnJ1cHQgPT0gaXJxKSkgewotCQkJKmludGVycnVwdCA9IGlzYV9ici0+aXNhX2ludG1hcFtpXS5jaW50ZXJydXB0OworCWltYXAgPSBvZl9nZXRfcHJvcGVydHkoaXNhX2JyLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwgJmxlbik7CisJaWYgKCFpbWFwKQorCQlyZXR1cm4gMDsKKwluX2ltYXAgPSBsZW4gLyBzaXplb2YoaW1hcFswXSk7CisKKwlpbWFzayA9IG9mX2dldF9wcm9wZXJ0eShpc2FfYnItPnByb21fbm9kZSwgImludGVycnVwdC1tYXAtbWFzayIsIE5VTEwpOworCWlmICghaW1hc2spCisJCXJldHVybiAwOworCisJaGkgPSByZWctPndoaWNoX2lvICYgaW1hc2stPnBoeXNfaGk7CisJbG8gPSByZWctPnBoeXNfYWRkciAmIGltYXNrLT5waHlzX2xvOworCWlycSA9ICppbnRlcnJ1cHQgJiBpbWFzay0+aW50ZXJydXB0OworCWZvciAoaSA9IDA7IGkgPCBuX2ltYXA7IGkrKykgeworCQlpZiAoKGltYXBbaV0ucGh5c19oaSA9PSBoaSkgJiYKKwkJICAgIChpbWFwW2ldLnBoeXNfbG8gPT0gbG8pICYmCisJCSAgICAoaW1hcFtpXS5pbnRlcnJ1cHQgPT0gaXJxKSkgeworCQkJKmludGVycnVwdCA9IGltYXBbaV0uY2ludGVycnVwdDsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtOTgsOCArMTA3LDggQEAKIHsKIAlpbnQgaXJxX3Byb3A7CiAKLQlpcnFfcHJvcCA9IHByb21fZ2V0aW50ZGVmYXVsdChpc2FfZGV2LT5wcm9tX25vZGUsCi0JCQkJICAgICAgImludGVycnVwdHMiLCAtMSk7CisJaXJxX3Byb3AgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoaXNhX2Rldi0+cHJvbV9ub2RlLAorCQkJCQkgImludGVycnVwdHMiLCAtMSk7CiAJaWYgKGlycV9wcm9wIDw9IDApIHsKIAkJZ290byBub19pcnE7CiAJfSBlbHNlIHsKQEAgLTEwNyw3ICsxMTYsOCBAQAogCQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAJCWludCBpOwogCi0JCWlmIChpc2FfZGV2LT5idXMtPm51bV9pc2FfaW50bWFwKSB7CisJCWlmIChvZl9maW5kX3Byb3BlcnR5KGlzYV9kZXYtPmJ1cy0+cHJvbV9ub2RlLAorCQkJCSAgICAgImludGVycnVwdC1tYXAiLCBOVUxMKSkgewogCQkJaWYgKCFpc2FfZGV2X2dldF9pcnFfdXNpbmdfaW1hcChpc2FfZGV2LAogCQkJCQkJCWlzYV9kZXYtPmJ1cywKIAkJCQkJCQkmaXJxX3Byb3AsCkBAIC0xNDEsMTYgKzE1MSwxNSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgaXNhX2ZpbGxfY2hpbGRyZW4oc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKnBhcmVudF9pc2FfZGV2KQogewotCWludCBub2RlID0gcHJvbV9nZXRjaGlsZChwYXJlbnRfaXNhX2Rldi0+cHJvbV9ub2RlKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gcGFyZW50X2lzYV9kZXYtPnByb21fbm9kZS0+Y2hpbGQ7CiAKLQlpZiAobm9kZSA9PSAwKQorCWlmICghZHApCiAJCXJldHVybjsKIAogCXByaW50aygiIC0+Iik7Ci0Jd2hpbGUgKG5vZGUgIT0gMCkgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnc1tQUk9NUkVHX01BWF07CisJd2hpbGUgKGRwKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAkJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7Ci0JCWludCBwcm9wX2xlbjsKIAogCQlpc2FfZGV2ID0ga21hbGxvYyhzaXplb2YoKmlzYV9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpc2FfZGV2KSB7CkBAIC0xNjUsNDkgKzE3NCw0NiBAQAogCQlwYXJlbnRfaXNhX2Rldi0+Y2hpbGQgPSBpc2FfZGV2OwogCiAJCWlzYV9kZXYtPmJ1cyA9IHBhcmVudF9pc2FfZGV2LT5idXM7Ci0JCWlzYV9kZXYtPnByb21fbm9kZSA9IG5vZGU7Ci0JCXByb3BfbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibmFtZSIsCi0JCQkJCSAgICAoY2hhciAqKSBpc2FfZGV2LT5wcm9tX25hbWUsCi0JCQkJCSAgICBzaXplb2YoaXNhX2Rldi0+cHJvbV9uYW1lKSk7Ci0JCWlmIChwcm9wX2xlbiA8PSAwKSB7Ci0JCQlmYXRhbF9lcnIoImNhbm5vdCBnZXQgY2hpbGQgaXNhX2RldiBPQlAgbm9kZSBuYW1lIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQorCQlpc2FfZGV2LT5wcm9tX25vZGUgPSBkcDsKIAotCQlwcm9wX2xlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgImNvbXBhdGlibGUiLAotCQkJCQkgICAgKGNoYXIgKikgaXNhX2Rldi0+Y29tcGF0aWJsZSwKLQkJCQkJICAgIHNpemVvZihpc2FfZGV2LT5jb21wYXRpYmxlKSk7Ci0KLQkJLyogTm90IGhhdmluZyB0aGlzIGlzIE9LLiAqLwotCQlpZiAocHJvcF9sZW4gPD0gMCkKLQkJCWlzYV9kZXYtPmNvbXBhdGlibGVbMF0gPSAnXDAnOwotCi0JCWlzYV9kZXZfZ2V0X3Jlc291cmNlKGlzYV9kZXYsIHJlZ3MsIHNpemVvZihyZWdzKSk7CisJCXJlZ3MgPSBpc2FfZGV2X2dldF9yZXNvdXJjZShpc2FfZGV2KTsKIAkJaXNhX2Rldl9nZXRfaXJxKGlzYV9kZXYsIHJlZ3MpOwogCiAJCXJlcG9ydF9kZXYoaXNhX2RldiwgMSk7CiAKLQkJbm9kZSA9IHByb21fZ2V0c2libGluZyhub2RlKTsKKwkJZHAgPSBkcC0+c2libGluZzsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpc2FfZmlsbF9kZXZpY2VzKHN0cnVjdCBzcGFyY19pc2FfYnJpZGdlICppc2FfYnIpCiB7Ci0JaW50IG5vZGUgPSBwcm9tX2dldGNoaWxkKGlzYV9ici0+cHJvbV9ub2RlKTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gaXNhX2JyLT5wcm9tX25vZGUtPmNoaWxkOwogCi0Jd2hpbGUgKG5vZGUgIT0gMCkgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnc1tQUk9NUkVHX01BWF07CisJd2hpbGUgKGRwKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyAqcmVnczsKIAkJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7Ci0JCWludCBwcm9wX2xlbjsKIAogCQlpc2FfZGV2ID0ga21hbGxvYyhzaXplb2YoKmlzYV9kZXYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFpc2FfZGV2KSB7Ci0JCQlmYXRhbF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBpc2FfZGV2Iik7Ci0JCQlwcm9tX2hhbHQoKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJJU0E6IGNhbm5vdCBhbGxvY2F0ZSBpc2FfZGV2Iik7CisJCQlyZXR1cm47CiAJCX0KIAogCQltZW1zZXQoaXNhX2RldiwgMCwgc2l6ZW9mKCppc2FfZGV2KSk7CiAKKwkJaXNhX2Rldi0+b2ZkZXYubm9kZSA9IGRwOworCQlpc2FfZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJmlzYV9ici0+b2ZkZXYuZGV2OworCQlpc2FfZGV2LT5vZmRldi5kZXYuYnVzID0gJmlzYV9idXNfdHlwZTsKKwkJc3RyY3B5KGlzYV9kZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKworCQkvKiBSZWdpc3RlciB3aXRoIGNvcmUgKi8KKwkJaWYgKG9mX2RldmljZV9yZWdpc3RlcigmaXNhX2Rldi0+b2ZkZXYpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpc2E6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKKwkJCSAgICAgICBpc2FfZGV2LT5vZmRldi5kZXYuYnVzX2lkKTsKKwkJCWtmcmVlKGlzYV9kZXYpOworCQkJZ290byBuZXh0X3NpYmxpbmc7CisJCX0KKwogCQkvKiBMaW5rIGl0IGluLiAqLwogCQlpc2FfZGV2LT5uZXh0ID0gTlVMTDsKIAkJaWYgKGlzYV9ici0+ZGV2aWNlcyA9PSBOVUxMKSB7CkBAIC0yMjIsMjQgKzIyOCw5IEBACiAJCX0KIAogCQlpc2FfZGV2LT5idXMgPSBpc2FfYnI7Ci0JCWlzYV9kZXYtPnByb21fbm9kZSA9IG5vZGU7Ci0JCXByb3BfbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibmFtZSIsCi0JCQkJCSAgICAoY2hhciAqKSBpc2FfZGV2LT5wcm9tX25hbWUsCi0JCQkJCSAgICBzaXplb2YoaXNhX2Rldi0+cHJvbV9uYW1lKSk7Ci0JCWlmIChwcm9wX2xlbiA8PSAwKSB7Ci0JCQlmYXRhbF9lcnIoImNhbm5vdCBnZXQgaXNhX2RldiBPQlAgbm9kZSBuYW1lIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQorCQlpc2FfZGV2LT5wcm9tX25vZGUgPSBkcDsKIAotCQlwcm9wX2xlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgImNvbXBhdGlibGUiLAotCQkJCQkgICAgKGNoYXIgKikgaXNhX2Rldi0+Y29tcGF0aWJsZSwKLQkJCQkJICAgIHNpemVvZihpc2FfZGV2LT5jb21wYXRpYmxlKSk7Ci0KLQkJLyogTm90IGhhdmluZyB0aGlzIGlzIE9LLiAqLwotCQlpZiAocHJvcF9sZW4gPD0gMCkKLQkJCWlzYV9kZXYtPmNvbXBhdGlibGVbMF0gPSAnXDAnOwotCi0JCWlzYV9kZXZfZ2V0X3Jlc291cmNlKGlzYV9kZXYsIHJlZ3MsIHNpemVvZihyZWdzKSk7CisJCXJlZ3MgPSBpc2FfZGV2X2dldF9yZXNvdXJjZShpc2FfZGV2KTsKIAkJaXNhX2Rldl9nZXRfaXJxKGlzYV9kZXYsIHJlZ3MpOwogCiAJCXJlcG9ydF9kZXYoaXNhX2RldiwgMCk7CkBAIC0yNDgsNyArMjM5LDggQEAKIAogCQlwcmludGsoIl0iKTsKIAotCQlub2RlID0gcHJvbV9nZXRzaWJsaW5nKG5vZGUpOworCW5leHRfc2libGluZzoKKwkJZHAgPSBkcC0+c2libGluZzsKIAl9CiB9CiAKQEAgLTI2Niw3ICsyNTgsNyBAQAogCQlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGRldl9jb29raWU7CiAJCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibTsKIAkJc3RydWN0IHNwYXJjX2lzYV9icmlkZ2UgKmlzYV9icjsKLQkJaW50IHByb3BfbGVuOworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCiAJCXBkZXZfY29va2llID0gcGRldi0+c3lzZGF0YTsKIAkJaWYgKCFwZGV2X2Nvb2tpZSkgewpAQCAtMjc1LDE1ICsyNjcsMjkgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAJCXBibSA9IHBkZXZfY29va2llLT5wYm07CisJCWRwID0gcGRldl9jb29raWUtPnByb21fbm9kZTsKIAogCQlpc2FfYnIgPSBrbWFsbG9jKHNpemVvZigqaXNhX2JyKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghaXNhX2JyKSB7Ci0JCQlmYXRhbF9lcnIoImNhbm5vdCBhbGxvY2F0ZSBzcGFyY19pc2FfYnJpZGdlIik7Ci0JCQlwcm9tX2hhbHQoKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpc2E6IGNhbm5vdCBhbGxvY2F0ZSBzcGFyY19pc2FfYnJpZGdlIik7CisJCQlyZXR1cm47CiAJCX0KIAogCQltZW1zZXQoaXNhX2JyLCAwLCBzaXplb2YoKmlzYV9icikpOwogCisJCWlzYV9ici0+b2ZkZXYubm9kZSA9IGRwOworCQlpc2FfYnItPm9mZGV2LmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCQlpc2FfYnItPm9mZGV2LmRldi5idXMgPSAmaXNhX2J1c190eXBlOworCQlzdHJjcHkoaXNhX2JyLT5vZmRldi5kZXYuYnVzX2lkLCBkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisKKwkJLyogUmVnaXN0ZXIgd2l0aCBjb3JlICovCisJCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJmlzYV9ici0+b2ZkZXYpICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJpc2E6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKKwkJCSAgICAgICBpc2FfYnItPm9mZGV2LmRldi5idXNfaWQpOworCQkJa2ZyZWUoaXNhX2JyKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCS8qIExpbmsgaXQgaW4uICovCiAJCWlzYV9ici0+bmV4dCA9IGlzYV9jaGFpbjsKIAkJaXNhX2NoYWluID0gaXNhX2JyOwpAQCAtMjkyLDMzICsyOTgsNiBAQAogCQlpc2FfYnItPnNlbGYgPSBwZGV2OwogCQlpc2FfYnItPmluZGV4ID0gaW5kZXgrKzsKIAkJaXNhX2JyLT5wcm9tX25vZGUgPSBwZGV2X2Nvb2tpZS0+cHJvbV9ub2RlOwotCQlzdHJuY3B5KGlzYV9ici0+cHJvbV9uYW1lLCBwZGV2X2Nvb2tpZS0+cHJvbV9uYW1lLAotCQkJc2l6ZW9mKGlzYV9ici0+cHJvbV9uYW1lKSk7Ci0KLQkJcHJvcF9sZW4gPSBwcm9tX2dldHByb3BlcnR5KGlzYV9ici0+cHJvbV9ub2RlLAotCQkJCQkgICAgInJhbmdlcyIsCi0JCQkJCSAgICAoY2hhciAqKSBpc2FfYnItPmlzYV9yYW5nZXMsCi0JCQkJCSAgICBzaXplb2YoaXNhX2JyLT5pc2FfcmFuZ2VzKSk7Ci0JCWlmIChwcm9wX2xlbiA8PSAwKQotCQkJaXNhX2JyLT5udW1faXNhX3JhbmdlcyA9IDA7Ci0JCWVsc2UKLQkJCWlzYV9ici0+bnVtX2lzYV9yYW5nZXMgPQotCQkJCShwcm9wX2xlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9pc2FfcmFuZ2VzKSk7Ci0KLQkJcHJvcF9sZW4gPSBwcm9tX2dldHByb3BlcnR5KGlzYV9ici0+cHJvbV9ub2RlLAotCQkJCQkgICAgImludGVycnVwdC1tYXAiLAotCQkJCQkgICAgKGNoYXIgKikgaXNhX2JyLT5pc2FfaW50bWFwLAotCQkJCQkgICAgc2l6ZW9mKGlzYV9ici0+aXNhX2ludG1hcCkpOwotCQlpZiAocHJvcF9sZW4gPD0gMCkKLQkJCWlzYV9ici0+bnVtX2lzYV9pbnRtYXAgPSAwOwotCQllbHNlCi0JCQlpc2FfYnItPm51bV9pc2FfaW50bWFwID0KLQkJCQkocHJvcF9sZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21faXNhX2ludG1hcCkpOwotCi0JCXByb3BfbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShpc2FfYnItPnByb21fbm9kZSwKLQkJCQkJICAgICJpbnRlcnJ1cHQtbWFwLW1hc2siLAotCQkJCQkgICAgKGNoYXIgKikgJihpc2FfYnItPmlzYV9pbnRtYXNrKSwKLQkJCQkJICAgIHNpemVvZihpc2FfYnItPmlzYV9pbnRtYXNrKSk7CiAKIAkJcHJpbnRrKCJpc2ElZDoiLCBpc2FfYnItPmluZGV4KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9vZl9kZXZpY2UuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2YWEzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvb2ZfZGV2aWNlLmMKQEAgLTAsMCArMSwyNzkgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgorCisvKioKKyAqIG9mX21hdGNoX2RldmljZSAtIFRlbGwgaWYgYW4gb2ZfZGV2aWNlIHN0cnVjdHVyZSBoYXMgYSBtYXRjaGluZworICogb2ZfbWF0Y2ggc3RydWN0dXJlCisgKiBAaWRzOiBhcnJheSBvZiBvZiBkZXZpY2UgbWF0Y2ggc3RydWN0dXJlcyB0byBzZWFyY2ggaW4KKyAqIEBkZXY6IHRoZSBvZiBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKKyAqCisgKiBVc2VkIGJ5IGEgZHJpdmVyIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZfZGV2aWNlIHByZXNlbnQgaW4gdGhlCisgKiBzeXN0ZW0gaXMgaW4gaXRzIGxpc3Qgb2Ygc3VwcG9ydGVkIGRldmljZXMuCisgKi8KK2NvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX2RldmljZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLAorCQkJCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJaWYgKCFkZXYtPm5vZGUpCisJCXJldHVybiBOVUxMOworCXdoaWxlIChtYXRjaGVzLT5uYW1lWzBdIHx8IG1hdGNoZXMtPnR5cGVbMF0gfHwgbWF0Y2hlcy0+Y29tcGF0aWJsZVswXSkgeworCQlpbnQgbWF0Y2ggPSAxOworCQlpZiAobWF0Y2hlcy0+bmFtZVswXSkKKwkJCW1hdGNoICY9IGRldi0+bm9kZS0+bmFtZQorCQkJCSYmICFzdHJjbXAobWF0Y2hlcy0+bmFtZSwgZGV2LT5ub2RlLT5uYW1lKTsKKwkJaWYgKG1hdGNoZXMtPnR5cGVbMF0pCisJCQltYXRjaCAmPSBkZXYtPm5vZGUtPnR5cGUKKwkJCQkmJiAhc3RyY21wKG1hdGNoZXMtPnR5cGUsIGRldi0+bm9kZS0+dHlwZSk7CisJCWlmIChtYXRjaGVzLT5jb21wYXRpYmxlWzBdKQorCQkJbWF0Y2ggJj0gb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LT5ub2RlLAorCQkJCQkJCSBtYXRjaGVzLT5jb21wYXRpYmxlKTsKKwkJaWYgKG1hdGNoKQorCQkJcmV0dXJuIG1hdGNoZXM7CisJCW1hdGNoZXMrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgb2ZfcGxhdGZvcm1fYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIG9mX2RydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkcnYpOworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKiBtYXRjaGVzID0gb2ZfZHJ2LT5tYXRjaF90YWJsZTsKKworCWlmICghbWF0Y2hlcykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gb2ZfbWF0Y2hfZGV2aWNlKG1hdGNoZXMsIG9mX2RldikgIT0gTlVMTDsKK30KKworc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2X2dldChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRldmljZSAqdG1wOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCXRtcCA9IGdldF9kZXZpY2UoJmRldi0+ZGV2KTsKKwlpZiAodG1wKQorCQlyZXR1cm4gdG9fb2ZfZGV2aWNlKHRtcCk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBvZl9kZXZfcHV0KHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2KQorCQlwdXRfZGV2aWNlKCZkZXYtPmRldik7Cit9CisKKworc3RhdGljIGludCBvZl9kZXZpY2VfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCBlcnJvciA9IC1FTk9ERVY7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2OworCXN0cnVjdCBvZl9kZXZpY2UgKm9mX2RldjsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKworCWRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisJb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisKKwlpZiAoIWRydi0+cHJvYmUpCisJCXJldHVybiBlcnJvcjsKKworCW9mX2Rldl9nZXQob2ZfZGV2KTsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKGRydi0+bWF0Y2hfdGFibGUsIG9mX2Rldik7CisJaWYgKG1hdGNoKQorCQllcnJvciA9IGRydi0+cHJvYmUob2ZfZGV2LCBtYXRjaCk7CisJaWYgKGVycm9yKQorCQlvZl9kZXZfcHV0KG9mX2Rldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgb2ZfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9mX2RldmljZSAqIG9mX2RldiA9IHRvX29mX2RldmljZShkZXYpOworCXN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKiBkcnYgPSB0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShvZl9kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9mX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZl9kZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyICogZHJ2ID0gdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJZXJyb3IgPSBkcnYtPnN1c3BlbmQob2ZfZGV2LCBzdGF0ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG9mX2RldmljZV9yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKK3sKKwlzdHJ1Y3Qgb2ZfZGV2aWNlICogb2ZfZGV2ID0gdG9fb2ZfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqIGRydiA9IHRvX29mX3BsYXRmb3JtX2RyaXZlcihkZXYtPmRyaXZlcik7CisJaW50IGVycm9yID0gMDsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlc3VtZSkKKwkJZXJyb3IgPSBkcnYtPnJlc3VtZShvZl9kZXYpOworCXJldHVybiBlcnJvcjsKK30KKworI2lmZGVmIENPTkZJR19QQ0kKK3N0cnVjdCBidXNfdHlwZSBpc2FfYnVzX3R5cGUgPSB7CisgICAgICAgLm5hbWUJPSAiaXNhIiwKKyAgICAgICAubWF0Y2gJPSBvZl9wbGF0Zm9ybV9idXNfbWF0Y2gsCisgICAgICAgLnByb2JlCT0gb2ZfZGV2aWNlX3Byb2JlLAorICAgICAgIC5yZW1vdmUJPSBvZl9kZXZpY2VfcmVtb3ZlLAorICAgICAgIC5zdXNwZW5kCT0gb2ZfZGV2aWNlX3N1c3BlbmQsCisgICAgICAgLnJlc3VtZQk9IG9mX2RldmljZV9yZXN1bWUsCit9OworCitzdHJ1Y3QgYnVzX3R5cGUgZWJ1c19idXNfdHlwZSA9IHsKKyAgICAgICAubmFtZQk9ICJlYnVzIiwKKyAgICAgICAubWF0Y2gJPSBvZl9wbGF0Zm9ybV9idXNfbWF0Y2gsCisgICAgICAgLnByb2JlCT0gb2ZfZGV2aWNlX3Byb2JlLAorICAgICAgIC5yZW1vdmUJPSBvZl9kZXZpY2VfcmVtb3ZlLAorICAgICAgIC5zdXNwZW5kCT0gb2ZfZGV2aWNlX3N1c3BlbmQsCisgICAgICAgLnJlc3VtZQk9IG9mX2RldmljZV9yZXN1bWUsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU0JVUworc3RydWN0IGJ1c190eXBlIHNidXNfYnVzX3R5cGUgPSB7CisgICAgICAgLm5hbWUJPSAic2J1cyIsCisgICAgICAgLm1hdGNoCT0gb2ZfcGxhdGZvcm1fYnVzX21hdGNoLAorICAgICAgIC5wcm9iZQk9IG9mX2RldmljZV9wcm9iZSwKKyAgICAgICAucmVtb3ZlCT0gb2ZfZGV2aWNlX3JlbW92ZSwKKyAgICAgICAuc3VzcGVuZAk9IG9mX2RldmljZV9zdXNwZW5kLAorICAgICAgIC5yZXN1bWUJPSBvZl9kZXZpY2VfcmVzdW1lLAorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBvZl9idXNfZHJpdmVyX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoIWVycikKKwkJZXJyID0gYnVzX3JlZ2lzdGVyKCZpc2FfYnVzX3R5cGUpOworCWlmICghZXJyKQorCQllcnIgPSBidXNfcmVnaXN0ZXIoJmVidXNfYnVzX3R5cGUpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NCVVMKKwlpZiAoIWVycikKKwkJZXJyID0gYnVzX3JlZ2lzdGVyKCZzYnVzX2J1c190eXBlKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCitwb3N0Y29yZV9pbml0Y2FsbChvZl9idXNfZHJpdmVyX2luaXQpOworCitpbnQgb2ZfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydiwgc3RydWN0IGJ1c190eXBlICpidXMpCit7CisJLyogaW5pdGlhbGl6ZSBjb21tb24gZHJpdmVyIGZpZWxkcyAqLworCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CisJZHJ2LT5kcml2ZXIuYnVzID0gYnVzOworCisJLyogcmVnaXN0ZXIgd2l0aCBjb3JlICovCisJcmV0dXJuIGRyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorCit2b2lkIG9mX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGRldl9zaG93X2RldnNwZWMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2OworCisJb2ZkZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlcyIsIG9mZGV2LT5ub2RlLT5mdWxsX25hbWUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZGV2c3BlYywgU19JUlVHTywgZGV2X3Nob3dfZGV2c3BlYywgTlVMTCk7CisKKy8qKgorICogb2ZfcmVsZWFzZV9kZXYgLSBmcmVlIGFuIG9mIGRldmljZSBzdHJ1Y3R1cmUgd2hlbiBhbGwgdXNlcnMgb2YgaXQgYXJlIGZpbmlzaGVkLgorICogQGRldjogZGV2aWNlIHRoYXQncyBiZWVuIGRpc2Nvbm5lY3RlZAorICoKKyAqIFdpbGwgYmUgY2FsbGVkIG9ubHkgYnkgdGhlIGRldmljZSBjb3JlIHdoZW4gYWxsIHVzZXJzIG9mIHRoaXMgb2YgZGV2aWNlIGFyZQorICogZG9uZS4KKyAqLwordm9pZCBvZl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG9mX2RldmljZSAqb2ZkZXY7CisKKyAgICAgICAgb2ZkZXYgPSB0b19vZl9kZXZpY2UoZGV2KTsKKworCWtmcmVlKG9mZGV2KTsKK30KKworaW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldikKK3sKKwlpbnQgcmM7CisKKwlCVUdfT04ob2ZkZXYtPm5vZGUgPT0gTlVMTCk7CisKKwlyYyA9IGRldmljZV9yZWdpc3Rlcigmb2ZkZXYtPmRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJm9mZGV2LT5kZXYsICZkZXZfYXR0cl9kZXZzcGVjKTsKKworCXJldHVybiAwOworfQorCit2b2lkIG9mX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KQoreworCWRldmljZV9yZW1vdmVfZmlsZSgmb2ZkZXYtPmRldiwgJmRldl9hdHRyX2RldnNwZWMpOworCWRldmljZV91bnJlZ2lzdGVyKCZvZmRldi0+ZGV2KTsKK30KKworc3RydWN0IG9mX2RldmljZSogb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgICAgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCQkgICAgc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgICAgc3RydWN0IGJ1c190eXBlICpidXMpCit7CisJc3RydWN0IG9mX2RldmljZSAqZGV2OworCisJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoZGV2LCAwLCBzaXplb2YoKmRldikpOworCisJZGV2LT5kZXYucGFyZW50ID0gcGFyZW50OworCWRldi0+ZGV2LmJ1cyA9IGJ1czsKKwlkZXYtPmRldi5yZWxlYXNlID0gb2ZfcmVsZWFzZV9kZXY7CisKKwlzdHJsY3B5KGRldi0+ZGV2LmJ1c19pZCwgYnVzX2lkLCBCVVNfSURfU0laRSk7CisKKwlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKGRldikgIT0gMCkgeworCQlrZnJlZShkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitFWFBPUlRfU1lNQk9MKG9mX21hdGNoX2RldmljZSk7CitFWFBPUlRfU1lNQk9MKG9mX3JlZ2lzdGVyX2RyaXZlcik7CitFWFBPUlRfU1lNQk9MKG9mX3VucmVnaXN0ZXJfZHJpdmVyKTsKK0VYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChvZl9kZXZfZ2V0KTsKK0VYUE9SVF9TWU1CT0wob2ZfZGV2X3B1dCk7CitFWFBPUlRfU1lNQk9MKG9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChvZl9yZWxlYXNlX2Rldik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2kuYwppbmRleCA5NDcyNTgwLi42YzllM2U5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KICNpbmNsdWRlIDxhc20vaXNhLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogdW5zaWduZWQgbG9uZyBwY2lfbWVtc3BhY2VfbWFzayA9IDB4ZmZmZmZmZmZVTDsKIApAQCAtMTc3LDE2ICsxNzgsMTYgQEAKIH0KIAogLyogUHJvYmUgZm9yIGFsbCBQQ0kgY29udHJvbGxlcnMgaW4gdGhlIHN5c3RlbS4gKi8KLWV4dGVybiB2b2lkIHNhYnJlX2luaXQoaW50LCBjaGFyICopOwotZXh0ZXJuIHZvaWQgcHN5Y2hvX2luaXQoaW50LCBjaGFyICopOwotZXh0ZXJuIHZvaWQgc2NoaXpvX2luaXQoaW50LCBjaGFyICopOwotZXh0ZXJuIHZvaWQgc2NoaXpvX3BsdXNfaW5pdChpbnQsIGNoYXIgKik7Ci1leHRlcm4gdm9pZCB0b21hdGlsbG9faW5pdChpbnQsIGNoYXIgKik7Ci1leHRlcm4gdm9pZCBzdW40dl9wY2lfaW5pdChpbnQsIGNoYXIgKik7CitleHRlcm4gdm9pZCBzYWJyZV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgcHN5Y2hvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCBzY2hpem9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIHNjaGl6b19wbHVzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gdm9pZCB0b21hdGlsbG9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiB2b2lkIHN1bjR2X3BjaV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBjb25zdCBjaGFyICopOwogCiBzdGF0aWMgc3RydWN0IHsKIAljaGFyICptb2RlbF9uYW1lOwotCXZvaWQgKCppbml0KShpbnQsIGNoYXIgKik7CisJdm9pZCAoKmluaXQpKHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBjb25zdCBjaGFyICopOwogfSBwY2lfY29udHJvbGxlcl90YWJsZVtdIF9faW5pdGRhdGEgPSB7CiAJeyAiU1VOVyxzYWJyZSIsIHNhYnJlX2luaXQgfSwKIAl7ICJwY2kxMDhlLGEwMDAiLCBzYWJyZV9pbml0IH0sCkBAIC0yMDQsNyArMjA1LDcgQEAKICNkZWZpbmUgUENJX05VTV9DT05UUk9MTEVSX1RZUEVTIChzaXplb2YocGNpX2NvbnRyb2xsZXJfdGFibGUpIC8gXAogCQkJCSAgc2l6ZW9mKHBjaV9jb250cm9sbGVyX3RhYmxlWzBdKSkKIAotc3RhdGljIGludCBfX2luaXQgcGNpX2NvbnRyb2xsZXJfaW5pdChjaGFyICptb2RlbF9uYW1lLCBpbnQgbmFtZWxlbiwgaW50IG5vZGUpCitzdGF0aWMgaW50IF9faW5pdCBwY2lfY29udHJvbGxlcl9pbml0KGNvbnN0IGNoYXIgKm1vZGVsX25hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCWludCBpOwogCkBAIC0yMTIsMTggKzIxMywxNSBAQAogCQlpZiAoIXN0cm5jbXAobW9kZWxfbmFtZSwKIAkJCSAgICAgcGNpX2NvbnRyb2xsZXJfdGFibGVbaV0ubW9kZWxfbmFtZSwKIAkJCSAgICAgbmFtZWxlbikpIHsKLQkJCXBjaV9jb250cm9sbGVyX3RhYmxlW2ldLmluaXQobm9kZSwgbW9kZWxfbmFtZSk7CisJCQlwY2lfY29udHJvbGxlcl90YWJsZVtpXS5pbml0KGRwLCBtb2RlbF9uYW1lKTsKIAkJCXJldHVybiAxOwogCQl9CiAJfQotCXByaW50aygiUENJOiBXYXJuaW5nIHVua25vd24gY29udHJvbGxlciwgbW9kZWwgbmFtZSBbJXNdXG4iLAotCSAgICAgICBtb2RlbF9uYW1lKTsKLQlwcmludGsoIlBDSTogSWdub3JpbmcgY29udHJvbGxlci4uLlxuIik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGNpX2lzX2NvbnRyb2xsZXIoY2hhciAqbW9kZWxfbmFtZSwgaW50IG5hbWVsZW4sIGludCBub2RlKQorc3RhdGljIGludCBfX2luaXQgcGNpX2lzX2NvbnRyb2xsZXIoY29uc3QgY2hhciAqbW9kZWxfbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7CiAJaW50IGk7CiAKQEAgLTIzNywzNiArMjM1LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9jb250cm9sbGVyX3NjYW4oaW50ICgqaGFuZGxlcikoY2hhciAqLCBpbnQsIGludCkpCitzdGF0aWMgaW50IF9faW5pdCBwY2lfY29udHJvbGxlcl9zY2FuKGludCAoKmhhbmRsZXIpKGNvbnN0IGNoYXIgKiwgaW50LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKikpCiB7Ci0JY2hhciBuYW1lYnVmWzY0XTsKLQlpbnQgbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOwogCWludCBjb3VudCA9IDA7CiAKLQlub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7Ci0Jd2hpbGUgKChub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAicGNpIikpICE9IDApIHsKKwlmb3JfZWFjaF9ub2RlX2J5X25hbWUoZHAsICJwY2kiKSB7CisJCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAkJaW50IGxlbjsKIAotCQlpZiAoKGxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgIm1vZGVsIiwgbmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpKSkgPiAwIHx8Ci0JCSAgICAobGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAiY29tcGF0aWJsZSIsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSkpID4gMCkgeworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgJmxlbik7CisJCWlmICghcHJvcCkKKwkJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiY29tcGF0aWJsZSIsICZsZW4pOworCisJCWlmIChwcm9wKSB7CisJCQljb25zdCBjaGFyICptb2RlbCA9IHByb3AtPnZhbHVlOwogCQkJaW50IGl0ZW1fbGVuID0gMDsKIAogCQkJLyogT3VyIHZhbHVlIG1heSBiZSBhIG11bHRpLXZhbHVlZCBzdHJpbmcgaW4gdGhlCiAJCQkgKiBjYXNlIG9mIHNvbWUgY29tcGF0aWJsZSBwcm9wZXJ0aWVzLiBGb3Igc2FuaXR5LAotCQkJICogb25seSB0cnkgdGhlIGZpcnN0IG9uZS4gKi8KLQotCQkJd2hpbGUgKG5hbWVidWZbaXRlbV9sZW5dICYmIGxlbikgeworCQkJICogb25seSB0cnkgdGhlIGZpcnN0IG9uZS4KKwkJCSAqLworCQkJd2hpbGUgKG1vZGVsW2l0ZW1fbGVuXSAmJiBsZW4pIHsKIAkJCQlsZW4tLTsKIAkJCQlpdGVtX2xlbisrOwogCQkJfQogCi0JCQlpZiAoaGFuZGxlcihuYW1lYnVmLCBpdGVtX2xlbiwgbm9kZSkpCisJCQlpZiAoaGFuZGxlcihtb2RlbCwgaXRlbV9sZW4sIGRwKSkKIAkJCQljb3VudCsrOwogCQl9Ci0KLQkJbm9kZSA9IHByb21fZ2V0c2libGluZyhub2RlKTsKLQkJaWYgKCFub2RlKQotCQkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGNvdW50OwpAQCAtNDA5LDggKzQwNiwxNCBAQAogfQogRVhQT1JUX1NZTUJPTChwY2liaW9zX2J1c190b19yZXNvdXJjZSk7CiAKK2V4dGVybiBpbnQgcGNpX2lycV92ZXJib3NlOworCiBjaGFyICogX19pbml0IHBjaWJpb3Nfc2V0dXAoY2hhciAqc3RyKQogeworCWlmICghc3RyY21wKHN0ciwgImlycV92ZXJib3NlIikpIHsKKwkJcGNpX2lycV92ZXJib3NlID0gMTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCXJldHVybiBzdHI7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2NvbW1vbi5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfY29tbW9uLmMKaW5kZXggMzNkZWRiMS4uYjA2YTI5NSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfY29tbW9uLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfY29tbW9uLmMKQEAgLTksNiArOSwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KIAogI2luY2x1ZGUgPGFzbS9wYm0uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisjaW5jbHVkZSAicGNpX2ltcGwuaCIKKworLyogUGFzcyAicGNpPWlycV92ZXJib3NlIiBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSB0byBlbmFibGUgdGhpcy4gICovCitpbnQgcGNpX2lycV92ZXJib3NlOwogCiAvKiBGaXggc2VsZiBkZXZpY2Ugb2YgQlVTIGFuZCBob29rIGl0IGludG8gQlVTLT5zZWxmLgogICogVGhlIHBjaV9zY2FuX2J1cyBkb2VzIG5vdCBkbyB0aGlzIGZvciB0aGUgaG9zdCBicmlkZ2UuCkBAIC0yOCwxNiArMzQsMTQgQEAKIAlwcm9tX2hhbHQoKTsKIH0KIAotLyogRmluZCB0aGUgT0JQIFBST00gZGV2aWNlIHRyZWUgbm9kZSBmb3IgYSBQQ0kgZGV2aWNlLgotICogUmV0dXJuIHplcm8gaWYgbm90IGZvdW5kLgotICovCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX2RldmljZV9wcm9tX25vZGUoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAotCQkJCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJaW50IGJ1c19wcm9tX25vZGUsCi0JCQkJCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnByZWdzLAotCQkJCQlpbnQgKm5yZWdzKQorLyogRmluZCB0aGUgT0JQIFBST00gZGV2aWNlIHRyZWUgbm9kZSBmb3IgYSBQQ0kgZGV2aWNlLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKiBfX2luaXQKK2ZpbmRfZGV2aWNlX3Byb21fbm9kZShzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c19ub2RlLAorCQkgICAgICBzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICoqcHJlZ3MsCisJCSAgICAgIGludCAqbnJlZ3MpCiB7Ci0JaW50IG5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAogCSpucmVncyA9IDA7CiAKQEAgLTU0LDI0ICs1OCwzMCBAQAogCSAgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1RPTUFUSUxMTyB8fAogCSAgICAgcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfU1VOX1NBQlJFIHx8CiAJICAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fSFVNTUlOR0JJUkQpKQotCQlyZXR1cm4gYnVzX3Byb21fbm9kZTsKKwkJcmV0dXJuIGJ1c19ub2RlOwogCi0Jbm9kZSA9IHByb21fZ2V0Y2hpbGQoYnVzX3Byb21fbm9kZSk7Ci0Jd2hpbGUgKG5vZGUgIT0gMCkgewotCQlpbnQgZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwKLQkJCQkJICAgKGNoYXIgKilwcmVncywKLQkJCQkJICAgc2l6ZW9mKCpwcmVncykgKiBQUk9NUkVHX01BWCk7Ci0JCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpCisJZHAgPSBidXNfbm9kZS0+Y2hpbGQ7CisJd2hpbGUgKGRwKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnJlZ3M7CisJCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwkJaW50IGxlbjsKKworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOworCQlpZiAoIXByb3ApCiAJCQlnb3RvIGRvX25leHRfc2libGluZzsKLQkJaWYgKCgocHJlZ3NbMF0ucGh5c19oaSA+PiA4KSAmIDB4ZmYpID09IHBkZXYtPmRldmZuKSB7Ci0JCQkqbnJlZ3MgPSBlcnIgLyBzaXplb2YoKnByZWdzKTsKLQkJCXJldHVybiBub2RlOworCisJCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwkJaWYgKCgocmVnc1swXS5waHlzX2hpID4+IDgpICYgMHhmZikgPT0gcGRldi0+ZGV2Zm4pIHsKKwkJCSpwcmVncyA9IHJlZ3M7CisJCQkqbnJlZ3MgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyk7CisJCQlyZXR1cm4gZHA7CiAJCX0KIAogCWRvX25leHRfc2libGluZzoKLQkJbm9kZSA9IHByb21fZ2V0c2libGluZyhub2RlKTsKKwkJZHAgPSBkcC0+c2libGluZzsKIAl9Ci0JcmV0dXJuIDA7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyogT2xkZXIgdmVyc2lvbnMgb2YgT0JQIG9uIFBDSSBzeXN0ZW1zIGVuY29kZSA2NC1iaXQgTUVNCkBAIC0xMjgsMTUgKzEzOCwxNyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgcGRldl9jb29raWVfZmlsbGluKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKIAkJCQkgICAgICBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgICAgICBpbnQgYnVzX3Byb21fbm9kZSkKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmJ1c19ub2RlKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgcHJlZ3NbUFJPTVJFR19NQVhdOworCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yZWdpc3RlcnMgKnByZWdzID0gTlVMTDsKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCWludCBkZXZpY2VfcHJvbV9ub2RlLCBucmVncywgZXJyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWludCBucmVncywgbGVuOwogCi0JZGV2aWNlX3Byb21fbm9kZSA9IGZpbmRfZGV2aWNlX3Byb21fbm9kZShwYm0sIHBkZXYsIGJ1c19wcm9tX25vZGUsCi0JCQkJCQkgcHJlZ3MsICZucmVncyk7Ci0JaWYgKGRldmljZV9wcm9tX25vZGUgPT0gMCkgeworCWRwID0gZmluZF9kZXZpY2VfcHJvbV9ub2RlKHBibSwgcGRldiwgYnVzX25vZGUsCisJCQkJICAgJnByZWdzLCAmbnJlZ3MpOworCWlmICghZHApIHsKIAkJLyogSWYgaXQgaXMgbm90IGluIHRoZSBPQlAgZGV2aWNlIHRyZWUgdGhlbgogCQkgKiB0aGVyZSBtdXN0IGJlIGEgZGFtbiBnb29kIHJlYXNvbiBmb3IgaXQuCiAJCSAqCkBAIC0xNTAsNDUgKzE2Miw0MyBAQAogCQlyZXR1cm47CiAJfQogCi0JcGNwID0ga21hbGxvYyhzaXplb2YoKnBjcCksIEdGUF9BVE9NSUMpOworCXBjcCA9IGt6YWxsb2Moc2l6ZW9mKCpwY3ApLCBHRlBfQVRPTUlDKTsKIAlpZiAocGNwID09IE5VTEwpIHsKIAkJcHJvbV9wcmludGYoIlBDSV9DT09LSUU6IEZhdGFsIG1hbGxvYyBlcnJvciwgYWJvcnRpbmcuLi5cbiIpOwogCQlwcm9tX2hhbHQoKTsKIAl9CiAJcGNwLT5wYm0gPSBwYm07Ci0JcGNwLT5wcm9tX25vZGUgPSBkZXZpY2VfcHJvbV9ub2RlOwotCW1lbWNweShwY3AtPnByb21fcmVncywgcHJlZ3MsIHNpemVvZihwY3AtPnByb21fcmVncykpOworCXBjcC0+cHJvbV9ub2RlID0gZHA7CisJbWVtY3B5KHBjcC0+cHJvbV9yZWdzLCBwcmVncywKKwkgICAgICAgbnJlZ3MgKiBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycykpOwogCXBjcC0+bnVtX3Byb21fcmVncyA9IG5yZWdzOwotCWVyciA9IHByb21fZ2V0cHJvcGVydHkoZGV2aWNlX3Byb21fbm9kZSwgIm5hbWUiLAotCQkJICAgICAgIHBjcC0+cHJvbV9uYW1lLCBzaXplb2YocGNwLT5wcm9tX25hbWUpKTsKLQlpZiAoZXJyID4gMCkKLQkJcGNwLT5wcm9tX25hbWVbZXJyXSA9IDA7Ci0JZWxzZQotCQlwY3AtPnByb21fbmFtZVswXSA9IDA7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KGRldmljZV9wcm9tX25vZGUsCi0JCQkgICAgICAgImFzc2lnbmVkLWFkZHJlc3NlcyIsCi0JCQkgICAgICAgKGNoYXIgKilwY3AtPnByb21fYXNzaWdubWVudHMsCi0JCQkgICAgICAgc2l6ZW9mKHBjcC0+cHJvbV9hc3NpZ25tZW50cykpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpCisJLyogV2UgY2FuJ3QgaGF2ZSB0aGUgcGNpZGV2X2Nvb2tpZSBhc3NpZ25tZW50cyBiZSBqdXN0CisJICogZGlyZWN0IHBvaW50ZXJzIGludG8gdGhlIHByb3BlcnR5IHZhbHVlLCBzaW5jZSB0aGV5CisJICogYXJlIHBvdGVudGlhbGx5IG1vZGlmaWVkIGJ5IHRoZSBwcm9iaW5nIHByb2Nlc3MuCisJICovCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJhc3NpZ25lZC1hZGRyZXNzZXMiLCAmbGVuKTsKKwlpZiAoIXByb3ApIHsKIAkJcGNwLT5udW1fcHJvbV9hc3NpZ25tZW50cyA9IDA7Ci0JZWxzZQorCX0gZWxzZSB7CisJCW1lbWNweShwY3AtPnByb21fYXNzaWdubWVudHMsIHByb3AtPnZhbHVlLCBsZW4pOwogCQlwY3AtPm51bV9wcm9tX2Fzc2lnbm1lbnRzID0KLQkJCShlcnIgLyBzaXplb2YocGNwLT5wcm9tX2Fzc2lnbm1lbnRzWzBdKSk7CisJCQkobGVuIC8gc2l6ZW9mKHBjcC0+cHJvbV9hc3NpZ25tZW50c1swXSkpOworCX0KIAotCWlmIChzdHJjbXAocGNwLT5wcm9tX25hbWUsICJlYnVzIikgPT0gMCkgewotCQlzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX3JhbmdlcyBlcm5nW1BST01fUENJUk5HX01BWF07CisJaWYgKHN0cmNtcChkcC0+bmFtZSwgImVidXMiKSA9PSAwKSB7CisJCXN0cnVjdCBsaW51eF9wcm9tX2VidXNfcmFuZ2VzICplcm5nOwogCQlpbnQgaXRlcjsKIAogCQkvKiBFQlVTIGlzIHNwZWNpYWwuLi4gKi8KLQkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShkZXZpY2VfcHJvbV9ub2RlLCAicmFuZ2VzIiwKLQkJCQkgICAgICAgKGNoYXIgKikmZXJuZ1swXSwgc2l6ZW9mKGVybmcpKTsKLQkJaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgeworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJhbmdlcyIsICZsZW4pOworCQlpZiAoIXByb3ApIHsKIAkJCXByb21fcHJpbnRmKCJFQlVTOiBGYXRhbCBlcnJvciwgbm8gcmFuZ2UgcHJvcGVydHlcbiIpOwogCQkJcHJvbV9oYWx0KCk7CiAJCX0KLQkJZXJyID0gKGVyciAvIHNpemVvZihlcm5nWzBdKSk7Ci0JCWZvcihpdGVyID0gMDsgaXRlciA8IGVycjsgaXRlcisrKSB7CisJCWVybmcgPSBwcm9wLT52YWx1ZTsKKwkJbGVuID0gKGxlbiAvIHNpemVvZihlcm5nWzBdKSk7CisJCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBsZW47IGl0ZXIrKykgewogCQkJc3RydWN0IGxpbnV4X3Byb21fZWJ1c19yYW5nZXMgKmVwID0gJmVybmdbaXRlcl07CiAJCQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICphcDsKIApAQCAtMjAwLDcgKzIxMCw3IEBACiAJCQlhcC0+c2l6ZV9oaSA9IDA7CiAJCQlhcC0+c2l6ZV9sbyA9IGVwLT5zaXplOwogCQl9Ci0JCXBjcC0+bnVtX3Byb21fYXNzaWdubWVudHMgPSBlcnI7CisJCXBjcC0+bnVtX3Byb21fYXNzaWdubWVudHMgPSBsZW47CiAJfQogCiAJZml4dXBfb2JwX2Fzc2lnbm1lbnRzKHBkZXYsIHBjcCk7CkBAIC0yMTAsNyArMjIwLDcgQEAKIAogdm9pZCBfX2luaXQgcGNpX2ZpbGxfaW5fcGJtX2Nvb2tpZXMoc3RydWN0IHBjaV9idXMgKnBidXMsCiAJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICAgaW50IHByb21fbm9kZSkKKwkJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiwgKnBkZXZfbmV4dDsKIAlzdHJ1Y3QgcGNpX2J1cyAqdGhpc19wYnVzLCAqcGJ1c19uZXh0OwpAQCAtMjE4LDcgKzIyOCw3IEBACiAJLyogVGhpcyBtdXN0IGJlIF9zYWZlIGJlY2F1c2UgdGhlIGNvb2tpZSBmaWxsaW4KIAkgICByb3V0aW5lIGNhbiBkZWxldGUgZGV2aWNlcyBmcm9tIHRoZSB0cmVlLiAgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGRldiwgcGRldl9uZXh0LCAmcGJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpCi0JCXBkZXZfY29va2llX2ZpbGxpbihwYm0sIHBkZXYsIHByb21fbm9kZSk7CisJCXBkZXZfY29va2llX2ZpbGxpbihwYm0sIHBkZXYsIGRwKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0aGlzX3BidXMsIHBidXNfbmV4dCwgJnBidXMtPmNoaWxkcmVuLCBub2RlKSB7CiAJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSB0aGlzX3BidXMtPnNlbGYtPnN5c2RhdGE7CkBAIC0yNDEsNyArMjUxLDYgQEAKIAlpZiAocmVzKQogCQlwcm9tX3ByaW50ZigiUENJOiBSRVNbJTAxNmx4LS0+JTAxNmx4OiglbHgpXVxuIiwKIAkJCSAgICByZXMtPnN0YXJ0LCByZXMtPmVuZCwgcmVzLT5mbGFncyk7Ci0JcHJvbV9wcmludGYoIlBsZWFzZSBlbWFpbCB0aGlzIGluZm9ybWF0aW9uIHRvIGRhdmVtQHJlZGhhdC5jb21cbiIpOwogCWlmIChkb19wcm9tX2hhbHQpCiAJCXByb21faGFsdCgpOwogfQpAQCAtMjczLDggKzI4Miw3IEBACiAJCXJldHVybiAmcGJtLT5tZW1fc3BhY2U7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoIlBDSTogV2hhdCBpcyByZXNvdXJjZSBzcGFjZSAleD8gIgotCQkgICAgICAgIlRlbGwgZGF2ZW1AcmVkaGF0LmNvbSBhYm91dCBpdCFcbiIsIHNwYWNlKTsKKwkJcHJpbnRrKCJQQ0k6IFdoYXQgaXMgcmVzb3VyY2Ugc3BhY2UgJXg/XG4iLCBzcGFjZSk7CiAJCXJldHVybiBOVUxMOwogCX07CiB9CkBAIC01NTYsOSArNTY0LDEwIEBACiAKIAlyZXQgPSAoKGludGVycnVwdCAtIDEgKyAoUENJX1NMT1QocGRldi0+ZGV2Zm4pICYgMykpICYgMykgKyAxOwogCi0JcHJpbnRrKCIlczogJXMgSVJRIFN3aXZlbCAlcyBbJXg6JXhdIC0+IFsleF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwgcGNpX25hbWUodG9wbGV2ZWxfcGRldiksIHBjaV9uYW1lKHBkZXYpLAotCSAgICAgICBpbnRlcnJ1cHQsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwgcmV0KTsKKwlpZiAocGNpX2lycV92ZXJib3NlKQorCQlwcmludGsoIiVzOiAlcyBJUlEgU3dpdmVsICVzIFsleDoleF0gLT4gWyV4XVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwgcGNpX25hbWUodG9wbGV2ZWxfcGRldiksIHBjaV9uYW1lKHBkZXYpLAorCQkgICAgICAgaW50ZXJydXB0LCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTY4LDU4ICs1NzcsNjAgQEAKIAkJCQkJICAgIHN0cnVjdCBwY2lfZGV2ICpwYnVzLAogCQkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCSAgICB1bnNpZ25lZCBpbnQgaW50ZXJydXB0LAotCQkJCQkgICAgdW5zaWduZWQgaW50ICpjbm9kZSkKKwkJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmNub2RlKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXAgaW1hcFtQUk9NX1BDSUlNQVBfTUFYXTsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFzayBpbWFzazsKKwlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwICppbWFwOworCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXNrICppbWFzazsKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGJ1c19wY3AgPSBwYnVzLT5zeXNkYXRhOwogCXN0cnVjdCBwY2lkZXZfY29va2llICpwZGV2X3BjcCA9IHBkZXYtPnN5c2RhdGE7CiAJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcHJlZ3MgPSBwZGV2X3BjcC0+cHJvbV9yZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlpbnQgcGxlbiwgbnVtX2ltYXAsIGk7CiAJdW5zaWduZWQgaW50IGhpLCBtaWQsIGxvLCBpcnEsIG9yaWdfaW50ZXJydXB0OwogCiAJKmNub2RlID0gcGJ1c19wY3AtPnByb21fbm9kZTsKIAotCXBsZW4gPSBwcm9tX2dldHByb3BlcnR5KHBidXNfcGNwLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwKLQkJCQkoY2hhciAqKSAmaW1hcFswXSwgc2l6ZW9mKGltYXApKTsKLQlpZiAocGxlbiA8PSAwIHx8CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkocGJ1c19wY3AtPnByb21fbm9kZSwgImludGVycnVwdC1tYXAiLCAmcGxlbik7CisJaWYgKCFwcm9wIHx8CiAJICAgIChwbGVuICUgc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKSAhPSAwKSB7CiAJCXByaW50aygiJXM6IERldmljZSAlcyBpbnRlcnJ1cHQtbWFwIGhhcyBiYWQgbGVuICVkXG4iLAogCQkgICAgICAgcGJtLT5uYW1lLCBwY2lfbmFtZShwYnVzKSwgcGxlbik7CiAJCWdvdG8gbm9faW50bWFwOwogCX0KKwlpbWFwID0gcHJvcC0+dmFsdWU7CiAJbnVtX2ltYXAgPSBwbGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApOwogCi0JcGxlbiA9IHByb21fZ2V0cHJvcGVydHkocGJ1c19wY3AtPnByb21fbm9kZSwgImludGVycnVwdC1tYXAtbWFzayIsCi0JCQkJKGNoYXIgKikgJmltYXNrLCBzaXplb2YoaW1hc2spKTsKLQlpZiAocGxlbiA8PSAwIHx8CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkocGJ1c19wY3AtPnByb21fbm9kZSwgImludGVycnVwdC1tYXAtbWFzayIsICZwbGVuKTsKKwlpZiAoIXByb3AgfHwKIAkgICAgKHBsZW4gJSBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hc2spKSAhPSAwKSB7CiAJCXByaW50aygiJXM6IERldmljZSAlcyBpbnRlcnJ1cHQtbWFwLW1hc2sgaGFzIGJhZCBsZW4gJWRcbiIsCiAJCSAgICAgICBwYm0tPm5hbWUsIHBjaV9uYW1lKHBidXMpLCBwbGVuKTsKIAkJZ290byBub19pbnRtYXA7CiAJfQorCWltYXNrID0gcHJvcC0+dmFsdWU7CiAKIAlvcmlnX2ludGVycnVwdCA9IGludGVycnVwdDsKIAotCWhpICAgPSBwcmVncy0+cGh5c19oaSAmIGltYXNrLnBoeXNfaGk7Ci0JbWlkICA9IHByZWdzLT5waHlzX21pZCAmIGltYXNrLnBoeXNfbWlkOwotCWxvICAgPSBwcmVncy0+cGh5c19sbyAmIGltYXNrLnBoeXNfbG87Ci0JaXJxICA9IGludGVycnVwdCAmIGltYXNrLmludGVycnVwdDsKKwloaSAgID0gcHJlZ3MtPnBoeXNfaGkgJiBpbWFzay0+cGh5c19oaTsKKwltaWQgID0gcHJlZ3MtPnBoeXNfbWlkICYgaW1hc2stPnBoeXNfbWlkOworCWxvICAgPSBwcmVncy0+cGh5c19sbyAmIGltYXNrLT5waHlzX2xvOworCWlycSAgPSBpbnRlcnJ1cHQgJiBpbWFzay0+aW50ZXJydXB0OwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9pbWFwOyBpKyspIHsKIAkJaWYgKGltYXBbaV0ucGh5c19oaSAgPT0gaGkgICAmJgogCQkgICAgaW1hcFtpXS5waHlzX21pZCA9PSBtaWQgICYmCiAJCSAgICBpbWFwW2ldLnBoeXNfbG8gID09IGxvICAgJiYKIAkJICAgIGltYXBbaV0uaW50ZXJydXB0ID09IGlycSkgewotCQkJKmNub2RlID0gaW1hcFtpXS5jbm9kZTsKKwkJCSpjbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGltYXBbaV0uY25vZGUpOwogCQkJaW50ZXJydXB0ID0gaW1hcFtpXS5jaW50ZXJydXB0OwogCQl9CiAJfQogCi0JcHJpbnRrKCIlczogJXMgTUFQIEJVUyAlcyBERVYgJXMgWyV4XSAtPiBbJXhdXG4iLAotCSAgICAgICBwYm0tPm5hbWUsIHBjaV9uYW1lKHRvcGxldmVsX3BkZXYpLAotCSAgICAgICBwY2lfbmFtZShwYnVzKSwgcGNpX25hbWUocGRldiksCi0JICAgICAgIG9yaWdfaW50ZXJydXB0LCBpbnRlcnJ1cHQpOworCWlmIChwY2lfaXJxX3ZlcmJvc2UpCisJCXByaW50aygiJXM6ICVzIE1BUCBCVVMgJXMgREVWICVzIFsleF0gLT4gWyV4XVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwgcGNpX25hbWUodG9wbGV2ZWxfcGRldiksCisJCSAgICAgICBwY2lfbmFtZShwYnVzKSwgcGNpX25hbWUocGRldiksCisJCSAgICAgICBvcmlnX2ludGVycnVwdCwgaW50ZXJydXB0KTsKIAogbm9faW50bWFwOgogCXJldHVybiBpbnRlcnJ1cHQ7CkBAIC02MzMsMjEgKzY0NCwyMiBAQAogICogYWxsIGludGVycnVwdCB0cmFuc2xhdGlvbnMgYXJlIGNvbXBsZXRlLCBlbHNlIHdlIHNob3VsZCB1c2UgdGhhdCBub2RlJ3MKICAqICJyZWciIHByb3BlcnR5IHRvIGFwcGx5IHRoZSBQQk0ncyAiaW50ZXJydXB0LXttYXAsbWFza30iIHRvIHRoZSBpbnRlcnJ1cHQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IHBjaV9pbnRtYXBfbWF0Y2hfdG9fcm9vdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCi0JCQkJCQkgICAgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCQkgICAgdW5zaWduZWQgaW50ICppbnRlcnJ1cHQpCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogX19pbml0CitwY2lfaW50bWFwX21hdGNoX3RvX3Jvb3Qoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAorCQkJIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJIHVuc2lnbmVkIGludCAqaW50ZXJydXB0KQogewogCXN0cnVjdCBwY2lfZGV2ICp0b3BsZXZlbF9wZGV2ID0gcGRldjsKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqdG9wbGV2ZWxfcGNwID0gdG9wbGV2ZWxfcGRldi0+c3lzZGF0YTsKLQl1bnNpZ25lZCBpbnQgY25vZGUgPSB0b3BsZXZlbF9wY3AtPnByb21fbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNub2RlID0gdG9wbGV2ZWxfcGNwLT5wcm9tX25vZGU7CiAKIAl3aGlsZSAocGRldi0+YnVzLT5udW1iZXIgIT0gcGJtLT5wY2lfZmlyc3RfYnVzbm8pIHsKIAkJc3RydWN0IHBjaV9kZXYgKnBidXMgPSBwZGV2LT5idXMtPnNlbGY7CiAJCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3AgPSBwYnVzLT5zeXNkYXRhOwotCQlpbnQgcGxlbjsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCi0JCXBsZW4gPSBwcm9tX2dldHByb3BsZW4ocGNwLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIik7Ci0JCWlmIChwbGVuIDw9IDApIHsKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkocGNwLT5wcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwgTlVMTCk7CisJCWlmICghcHJvcCkgewogCQkJKmludGVycnVwdCA9IHBjaV9zbG90X3N3aXZlbChwYm0sIHRvcGxldmVsX3BkZXYsCiAJCQkJCQkgICAgIHBkZXYsICppbnRlcnJ1cHQpOwogCQkJY25vZGUgPSBwY3AtPnByb21fbm9kZTsKQEAgLTY3NSwyNiArNjg3LDI5IEBACiB7CiAJc3RydWN0IHBjaWRldl9jb29raWUgKmRldl9wY3AgPSBwZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSA9IGRldl9wY3AtPnBibTsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzIHJlZ1tQUk9NUkVHX01BWF07CisJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY25vZGU7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCXVuc2lnbmVkIGludCBoaSwgbWlkLCBsbywgaXJxOwotCWludCBpLCBjbm9kZSwgcGxlbjsKKwlpbnQgaSwgcGxlbjsKIAogCWNub2RlID0gcGNpX2ludG1hcF9tYXRjaF90b19yb290KHBibSwgcGRldiwgaW50ZXJydXB0KTsKIAlpZiAoY25vZGUgPT0gcGJtLT5wcm9tX25vZGUpCiAJCWdvdG8gc3VjY2VzczsKIAotCXBsZW4gPSBwcm9tX2dldHByb3BlcnR5KGNub2RlLCAicmVnIiwgKGNoYXIgKikgcmVnLCBzaXplb2YocmVnKSk7Ci0JaWYgKHBsZW4gPD0gMCB8fAorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGNub2RlLCAicmVnIiwgJnBsZW4pOworCWlmICghcHJvcCB8fAogCSAgICAocGxlbiAlIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzKSkgIT0gMCkgewotCQlwcmludGsoIiVzOiBPQlAgbm9kZSAleCByZWcgcHJvcGVydHkgaGFzIGJhZCBsZW4gJWRcbiIsCi0JCSAgICAgICBwYm0tPm5hbWUsIGNub2RlLCBwbGVuKTsKKwkJcHJpbnRrKCIlczogT0JQIG5vZGUgJXMgcmVnIHByb3BlcnR5IGhhcyBiYWQgbGVuICVkXG4iLAorCQkgICAgICAgcGJtLT5uYW1lLCBjbm9kZS0+ZnVsbF9uYW1lLCBwbGVuKTsKIAkJZ290byBmYWlsOwogCX0KKwlyZWcgPSBwcm9wLT52YWx1ZTsKIAotCWhpICAgPSByZWdbMF0ucGh5c19oaSAmIHBibS0+cGJtX2ludG1hc2sucGh5c19oaTsKLQltaWQgID0gcmVnWzBdLnBoeXNfbWlkICYgcGJtLT5wYm1faW50bWFzay5waHlzX21pZDsKLQlsbyAgID0gcmVnWzBdLnBoeXNfbG8gJiBwYm0tPnBibV9pbnRtYXNrLnBoeXNfbG87Ci0JaXJxICA9ICppbnRlcnJ1cHQgJiBwYm0tPnBibV9pbnRtYXNrLmludGVycnVwdDsKKwloaSAgID0gcmVnWzBdLnBoeXNfaGkgJiBwYm0tPnBibV9pbnRtYXNrLT5waHlzX2hpOworCW1pZCAgPSByZWdbMF0ucGh5c19taWQgJiBwYm0tPnBibV9pbnRtYXNrLT5waHlzX21pZDsKKwlsbyAgID0gcmVnWzBdLnBoeXNfbG8gJiBwYm0tPnBibV9pbnRtYXNrLT5waHlzX2xvOworCWlycSAgPSAqaW50ZXJydXB0ICYgcGJtLT5wYm1faW50bWFzay0+aW50ZXJydXB0OwogCiAJZm9yIChpID0gMDsgaSA8IHBibS0+bnVtX3BibV9pbnRtYXA7IGkrKykgewogCQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwICppbnRtYXA7CkBAIC03MTQsOSArNzI5LDExIEBACiAJcmV0dXJuIDA7CiAKIHN1Y2Nlc3M6Ci0JcHJpbnRrKCJQQ0ktSVJROiBSb3V0aW5nIGJ1c1slMnhdIHNsb3RbJTJ4XSB0byBJTk9bJTAyeF1cbiIsCi0JICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JICAgICAgICppbnRlcnJ1cHQpOworCWlmIChwY2lfaXJxX3ZlcmJvc2UpCisJCXByaW50aygiJXM6IFJvdXRpbmcgYnVzWyUyeF0gc2xvdFslMnhdIHRvIElOT1slMDJ4XVxuIiwKKwkJICAgICAgIHBibS0+bmFtZSwKKwkJICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCisJCSAgICAgICAqaW50ZXJydXB0KTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNzI3LDggKzc0NCw4IEBACiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAgPSBwYm0tPnBhcmVudDsKIAl1bnNpZ25lZCBpbnQgcG9ydGlkID0gcGJtLT5wb3J0aWQ7CiAJdW5zaWduZWQgaW50IHByb21faXJxOwotCWludCBwcm9tX25vZGUgPSBwY3AtPnByb21fbm9kZTsKLQlpbnQgZXJyOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBwY3AtPnByb21fbm9kZTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAKIAkvKiBJZiB0aGlzIGlzIGFuIGVtcHR5IEVCVVMgZGV2aWNlLCBzb21ldGltZXMgT0JQIGZhaWxzIHRvCiAJICogZ2l2ZSBpdCBhIHZhbGlkIGZ1bGx5IHNwZWNpZmllZCBpbnRlcnJ1cHRzIHByb3BlcnR5LgpAQCAtNzM5LDE3ICs3NTYsMTcgQEAKIAkgKi8KIAlpZiAocGRldi0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfU1VOICYmCiAJICAgIHBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1NVTl9FQlVTICYmCi0JICAgICFwcm9tX2dldGNoaWxkKHByb21fbm9kZSkpIHsKKwkgICAgIWRwLT5jaGlsZCkgewogCQlwZGV2LT5pcnEgPSAwOwogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJpbnRlcnJ1cHRzIiwKLQkJCSAgICAgICAoY2hhciAqKSZwcm9tX2lycSwgc2l6ZW9mKHByb21faXJxKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgeworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0cyIsIE5VTEwpOworCWlmICghcHJvcCkgewogCQlwZGV2LT5pcnEgPSAwOwogCQlyZXR1cm47CiAJfQorCXByb21faXJxID0gKih1bnNpZ25lZCBpbnQgKikgcHJvcC0+dmFsdWU7CiAKIAlpZiAodGxiX3R5cGUgIT0gaHlwZXJ2aXNvcikgewogCQkvKiBGdWxseSBzcGVjaWZpZWQgYWxyZWFkeT8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaCBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX2ltcGwuaAppbmRleCA2YzMyMDU5Li45NzFlMmJlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9pbXBsLmgKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfaW1wbC5oCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIGV4dGVybiBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcGNpX2NvbnRyb2xsZXJfcm9vdDsKIApAQCAtMTksNyArMjAsNyBAQAogZXh0ZXJuIHZvaWQgcGNpX2ZpeHVwX2hvc3RfYnJpZGdlX3NlbGYoc3RydWN0IHBjaV9idXMgKnBidXMpOwogZXh0ZXJuIHZvaWQgcGNpX2ZpbGxfaW5fcGJtX2Nvb2tpZXMoc3RydWN0IHBjaV9idXMgKnBidXMsCiAJCQkJICAgIHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSwKLQkJCQkgICAgaW50IHByb21fbm9kZSk7CisJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcHJvbV9ub2RlKTsKIGV4dGVybiB2b2lkIHBjaV9yZWNvcmRfYXNzaWdubWVudHMoc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtLAogCQkJCSAgIHN0cnVjdCBwY2lfYnVzICpwYnVzKTsKIGV4dGVybiB2b2lkIHBjaV9hc3NpZ25fdW5hc3NpZ25lZChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0sCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9wc3ljaG8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCmluZGV4IDI0ZGIyMmEuLjViMjI2MWUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3BzeWNoby5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zdGFyZmlyZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKICNpbmNsdWRlICJwY2lfaW1wbC5oIgogI2luY2x1ZGUgImlvbW11X2NvbW1vbi5oIgpAQCAtMTI5MSwxMSArMTI5MiwxMiBAQAogI2RlZmluZSBQU1lDSE9fTUVNU1BBQ0VfU0laRQkweDA3ZmZmZmZmZlVMCiAKIHN0YXRpYyB2b2lkIHBzeWNob19wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwKLQkJCSAgICBpbnQgcHJvbV9ub2RlLCBpbnQgaXNfcGJtX2EpCisJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpkcCwgaW50IGlzX3BibV9hKQogewotCXVuc2lnbmVkIGludCBidXNyYW5nZVsyXTsKKwl1bnNpZ25lZCBpbnQgKmJ1c3JhbmdlOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0JaW50IGVycjsKKwlpbnQgbGVuOwogCiAJaWYgKGlzX3BibV9hKSB7CiAJCXBibSA9ICZwLT5wYm1fQTsKQEAgLTEzMTAsMTAgKzEzMTIsMTQgQEAKIAl9CiAKIAlwYm0tPmNoaXBfdHlwZSA9IFBCTV9DSElQX1RZUEVfUFNZQ0hPOwotCXBibS0+Y2hpcF92ZXJzaW9uID0KLQkJcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fbm9kZSwgInZlcnNpb24jIiwgMCk7Ci0JcGJtLT5jaGlwX3JldmlzaW9uID0KLQkJcHJvbV9nZXRpbnRkZWZhdWx0KHByb21fbm9kZSwgIm1vZHVsZS1yZXZpc2lvbiMiLCAwKTsKKwlwYm0tPmNoaXBfdmVyc2lvbiA9IDA7CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ2ZXJzaW9uIyIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwYm0tPmNoaXBfdmVyc2lvbiA9ICooaW50ICopIHByb3AtPnZhbHVlOworCXBibS0+Y2hpcF9yZXZpc2lvbiA9IDA7CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJtb2R1bGUtcmV2aXNpb24jIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCXBibS0+Y2hpcF9yZXZpc2lvbiA9ICooaW50ICopIHByb3AtPnZhbHVlOwogCiAJcGJtLT5pb19zcGFjZS5lbmQgPSBwYm0tPmlvX3NwYWNlLnN0YXJ0ICsgUFNZQ0hPX0lPU1BBQ0VfU0laRTsKIAlwYm0tPmlvX3NwYWNlLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKQEAgLTEzMjIsNDUgKzEzMjgsMzYgQEAKIAlwYm1fcmVnaXN0ZXJfdG9wbGV2ZWxfcmVzb3VyY2VzKHAsIHBibSk7CiAKIAlwYm0tPnBhcmVudCA9IHA7Ci0JcGJtLT5wcm9tX25vZGUgPSBwcm9tX25vZGU7Ci0JcHJvbV9nZXRzdHJpbmcocHJvbV9ub2RlLCAibmFtZSIsCi0JCSAgICAgICBwYm0tPnByb21fbmFtZSwKLQkJICAgICAgIHNpemVvZihwYm0tPnByb21fbmFtZSkpOworCXBibS0+cHJvbV9ub2RlID0gZHA7CisJcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKIAotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAicmFuZ2VzIiwKLQkJCSAgICAgICAoY2hhciAqKXBibS0+cGJtX3JhbmdlcywKLQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1fcmFuZ2VzKSk7Ci0JaWYgKGVyciAhPSAtMSkKKwlwcmludGsoIiVzOiBQU1lDSE8gUENJIEJ1cyBNb2R1bGUgdmVyWyV4OiV4XVxuIiwKKwkgICAgICAgcGJtLT5uYW1lLAorCSAgICAgICBwYm0tPmNoaXBfdmVyc2lvbiwgcGJtLT5jaGlwX3JldmlzaW9uKTsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CisJaWYgKHByb3ApIHsKKwkJcGJtLT5wYm1fcmFuZ2VzID0gcHJvcC0+dmFsdWU7CiAJCXBibS0+bnVtX3BibV9yYW5nZXMgPQotCQkJKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7Ci0JZWxzZQorCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7CisJfSBlbHNlIHsKIAkJcGJtLT5udW1fcGJtX3JhbmdlcyA9IDA7CisJfQogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwKLQkJCSAgICAgICAoY2hhciAqKXBibS0+cGJtX2ludG1hcCwKLQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1faW50bWFwKSk7Ci0JaWYgKGVyciAhPSAtMSkgewotCQlwYm0tPm51bV9wYm1faW50bWFwID0gKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7Ci0JCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwKLQkJCQkgICAgICAgKGNoYXIgKikmcGJtLT5wYm1faW50bWFzaywKLQkJCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX2ludG1hc2spKTsKLQkJaWYgKGVyciA9PSAtMSkgewotCQkJcHJvbV9wcmludGYoIlBTWUNITy1QQk06IEZhdGFsIGVycm9yLCBubyAiCi0JCQkJICAgICJpbnRlcnJ1cHQtbWFwLW1hc2suXG4iKTsKLQkJCXByb21faGFsdCgpOwotCQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwIiwgJmxlbik7CisJaWYgKHByb3ApIHsKKwkJcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7CisJCXBibS0+bnVtX3BibV9pbnRtYXAgPQorCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7CisKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKKwkJcGJtLT5wYm1faW50bWFzayA9IHByb3AtPnZhbHVlOwogCX0gZWxzZSB7CiAJCXBibS0+bnVtX3BibV9pbnRtYXAgPSAwOwotCQltZW1zZXQoJnBibS0+cGJtX2ludG1hc2ssIDAsIHNpemVvZihwYm0tPnBibV9pbnRtYXNrKSk7CiAJfQogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJidXMtcmFuZ2UiLAotCQkJICAgICAgIChjaGFyICopJmJ1c3JhbmdlWzBdLAotCQkJICAgICAgIHNpemVvZihidXNyYW5nZSkpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIlBTWUNITy1QQk06IEZhdGFsIGVycm9yLCBubyBidXMtcmFuZ2UuXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiYnVzLXJhbmdlIiwgTlVMTCk7CisJYnVzcmFuZ2UgPSBwcm9wLT52YWx1ZTsKIAlwYm0tPnBjaV9maXJzdF9idXNubyA9IGJ1c3JhbmdlWzBdOwogCXBibS0+cGNpX2xhc3RfYnVzbm8gPSBidXNyYW5nZVsxXTsKIApAQCAtMTM2OSwyMCArMTM2NiwyNCBAQAogCiAjZGVmaW5lIFBTWUNIT19DT05GSUdTUEFDRQkweDAwMTAwMDAwMFVMCiAKLXZvaWQgcHN5Y2hvX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCit2b2lkIHBzeWNob19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcHJfcmVnc1szXTsKKwlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcHJfcmVnczsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcDsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTMyIHVwYV9wb3J0aWQ7Ci0JaW50IGlzX3BibV9hLCBlcnI7CisJaW50IGlzX3BibV9hOwogCi0JdXBhX3BvcnRpZCA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAidXBhLXBvcnRpZCIsIDB4ZmYpOworCXVwYV9wb3J0aWQgPSAweGZmOworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidXBhLXBvcnRpZCIsIE5VTEwpOworCWlmIChwcm9wKQorCQl1cGFfcG9ydGlkID0gKih1MzIgKikgcHJvcC0+dmFsdWU7CiAKIAlmb3IocCA9IHBjaV9jb250cm9sbGVyX3Jvb3Q7IHA7IHAgPSBwLT5uZXh0KSB7CiAJCWlmIChwLT5wYm1fQS5wb3J0aWQgPT0gdXBhX3BvcnRpZCkgewotCQkJaXNfcGJtX2EgPSAocC0+cGJtX0EucHJvbV9ub2RlID09IDApOwotCQkJcHN5Y2hvX3BibV9pbml0KHAsIG5vZGUsIGlzX3BibV9hKTsKKwkJCWlzX3BibV9hID0gKHAtPnBibV9BLnByb21fbm9kZSA9PSBOVUxMKTsKKwkJCXBzeWNob19wYm1faW5pdChwLCBkcCwgaXNfcGJtX2EpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMTQxMiwyMyArMTQxMywxNCBAQAogCXAtPnJlc291cmNlX2FkanVzdCA9IHBzeWNob19yZXNvdXJjZV9hZGp1c3Q7CiAJcC0+cGNpX29wcyA9ICZwc3ljaG9fb3BzOwogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAicmVnIiwKLQkJCSAgICAgICAoY2hhciAqKSZwcl9yZWdzWzBdLAotCQkJICAgICAgIHNpemVvZihwcl9yZWdzKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiUFNZQ0hPOiBGYXRhbCBlcnJvciwgbm8gcmVnIHByb3BlcnR5LlxuIik7Ci0JCXByb21faGFsdCgpOwotCX0KKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCXByX3JlZ3MgPSBwcm9wLT52YWx1ZTsKIAogCXAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMl0ucGh5c19hZGRyOwogCXAtPnBibV9CLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMl0ucGh5c19hZGRyOwotCXByaW50aygiUENJOiBGb3VuZCBQU1lDSE8sIGNvbnRyb2wgcmVncyBhdCAlMDE2bHhcbiIsCi0JICAgICAgIHAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyk7CiAKIAlwLT5wYm1fQS5jb25maWdfc3BhY2UgPSBwLT5wYm1fQi5jb25maWdfc3BhY2UgPQogCQkocHJfcmVnc1syXS5waHlzX2FkZHIgKyBQU1lDSE9fQ09ORklHU1BBQ0UpOwotCXByaW50aygiUFNZQ0hPOiBTaGFyZWQgUENJIGNvbmZpZyBzcGFjZSBhdCAlMDE2bHhcbiIsCi0JICAgICAgIHAtPnBibV9BLmNvbmZpZ19zcGFjZSk7CiAKIAkvKgogCSAqIFBzeWNobydzIFBDSSBNRU0gc3BhY2UgaXMgbWFwcGVkIHRvIGEgMkdCIGFsaWduZWQgYXJlYSwgc28KQEAgLTE0NDEsNSArMTQzMyw1IEBACiAJcHN5Y2hvX2lvbW11X2luaXQocCk7CiAKIAlpc19wYm1fYSA9ICgocHJfcmVnc1swXS5waHlzX2FkZHIgJiAweDYwMDApID09IDB4MjAwMCk7Ci0JcHN5Y2hvX3BibV9pbml0KHAsIG5vZGUsIGlzX3BibV9hKTsKKwlwc3ljaG9fcGJtX2luaXQocCwgZHAsIGlzX3BibV9hKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zYWJyZS5jCmluZGV4IGI3ZDk5N2IuLjI2ZjE5NGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NhYnJlLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc2FicmUuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogI2luY2x1ZGUgInBjaV9pbXBsLmgiCiAjaW5jbHVkZSAiaW9tbXVfY29tbW9uLmgiCkBAIC0xMzA2LDM0ICsxMzA3LDM2IEBACiAJCQkJCSAgICAmcGJtLT5tZW1fc3BhY2UpOwogfQogCi1zdGF0aWMgdm9pZCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgaW50IHNhYnJlX25vZGUsIHUzMiBkbWFfYmVnaW4pCitzdGF0aWMgdm9pZCBzYWJyZV9wYm1faW5pdChzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcCwgc3RydWN0IGRldmljZV9ub2RlICpkcCwgdTMyIGRtYV9iZWdpbikKIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07Ci0JY2hhciBuYW1lYnVmWzEyOF07Ci0JdTMyIGJ1c3JhbmdlWzJdOwotCWludCBub2RlLCBzaW1iYXNfZm91bmQ7CisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl1MzIgKmJ1c3JhbmdlOworCWludCBsZW4sIHNpbWJhc19mb3VuZDsKIAogCXNpbWJhc19mb3VuZCA9IDA7Ci0Jbm9kZSA9IHByb21fZ2V0Y2hpbGQoc2FicmVfbm9kZSk7Ci0Jd2hpbGUgKChub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAicGNpIikpICE9IDApIHsKLQkJaW50IGVycjsKLQotCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJtb2RlbCIsIG5hbWVidWYsIHNpemVvZihuYW1lYnVmKSk7Ci0JCWlmICgoZXJyIDw9IDApIHx8IHN0cm5jbXAobmFtZWJ1ZiwgIlNVTlcsc2ltYmEiLCBlcnIpKQorCW5vZGUgPSBkcC0+Y2hpbGQ7CisJd2hpbGUgKG5vZGUgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG5vZGUtPm5hbWUsICJwY2kiKSkKIAkJCWdvdG8gbmV4dF9wY2k7CiAKLQkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAiYnVzLXJhbmdlIiwKLQkJCQkgICAgICAgKGNoYXIgKikmYnVzcmFuZ2VbMF0sIHNpemVvZihidXNyYW5nZSkpOwotCQlpZiAoZXJyID09IDAgfHwgZXJyID09IC0xKSB7Ci0JCQlwcm9tX3ByaW50ZigiQVBCOiBFcnJvciwgY2Fubm90IGdldCBQQ0kgYnVzLXJhbmdlLlxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLQkJfQorCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAibW9kZWwiLCBOVUxMKTsKKwkJaWYgKCFwcm9wIHx8IHN0cm5jbXAocHJvcC0+dmFsdWUsICJTVU5XLHNpbWJhIiwgcHJvcC0+bGVuZ3RoKSkKKwkJCWdvdG8gbmV4dF9wY2k7CiAKIAkJc2ltYmFzX2ZvdW5kKys7CisKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImJ1cy1yYW5nZSIsIE5VTEwpOworCQlidXNyYW5nZSA9IHByb3AtPnZhbHVlOwogCQlpZiAoYnVzcmFuZ2VbMF0gPT0gMSkKIAkJCXBibSA9ICZwLT5wYm1fQjsKIAkJZWxzZQogCQkJcGJtID0gJnAtPnBibV9BOworCisJCXBibS0+bmFtZSA9IG5vZGUtPmZ1bGxfbmFtZTsKKwkJcHJpbnRrKCIlczogU0FCUkUgUENJIEJ1cyBNb2R1bGVcbiIsIHBibS0+bmFtZSk7CisKIAkJcGJtLT5jaGlwX3R5cGUgPSBQQk1fQ0hJUF9UWVBFX1NBQlJFOwogCQlwYm0tPnBhcmVudCA9IHA7CiAJCXBibS0+cHJvbV9ub2RlID0gbm9kZTsKQEAgLTEzNDEsODMgKzEzNDQsNjggQEAKIAkJcGJtLT5wY2lfZmlyc3RfYnVzbm8gPSBidXNyYW5nZVswXTsKIAkJcGJtLT5wY2lfbGFzdF9idXNubyA9IGJ1c3JhbmdlWzFdOwogCi0JCXByb21fZ2V0c3RyaW5nKG5vZGUsICJuYW1lIiwgcGJtLT5wcm9tX25hbWUsIHNpemVvZihwYm0tPnByb21fbmFtZSkpOwotCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJyYW5nZXMiLAotCQkJCSAgICAgICAoY2hhciAqKXBibS0+cGJtX3JhbmdlcywKLQkJCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX3JhbmdlcykpOwotCQlpZiAoZXJyICE9IC0xKQorCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAicmFuZ2VzIiwgJmxlbik7CisJCWlmIChwcm9wKSB7CisJCQlwYm0tPnBibV9yYW5nZXMgPSBwcm9wLT52YWx1ZTsKIAkJCXBibS0+bnVtX3BibV9yYW5nZXMgPQotCQkJCShlcnIgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOwotCQllbHNlCisJCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7CisJCX0gZWxzZSB7CiAJCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0gMDsKKwkJfQogCi0JCWVyciA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgImludGVycnVwdC1tYXAiLAotCQkJCSAgICAgICAoY2hhciAqKXBibS0+cGJtX2ludG1hcCwKLQkJCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX2ludG1hcCkpOwotCQlpZiAoZXJyICE9IC0xKSB7Ci0JCQlwYm0tPm51bV9wYm1faW50bWFwID0gKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7Ci0JCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJpbnRlcnJ1cHQtbWFwLW1hc2siLAotCQkJCQkgICAgICAgKGNoYXIgKikmcGJtLT5wYm1faW50bWFzaywKLQkJCQkJICAgICAgIHNpemVvZihwYm0tPnBibV9pbnRtYXNrKSk7Ci0JCQlpZiAoZXJyID09IC0xKSB7Ci0JCQkJcHJvbV9wcmludGYoIkFQQjogRmF0YWwgZXJyb3IsIG5vIGludGVycnVwdC1tYXAtbWFzay5cbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQorCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOworCQlpZiAocHJvcCkgeworCQkJcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7CisJCQlwYm0tPm51bV9wYm1faW50bWFwID0KKwkJCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKTsKKworCQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobm9kZSwgImludGVycnVwdC1tYXAtbWFzayIsCisJCQkJCQlOVUxMKTsKKwkJCXBibS0+cGJtX2ludG1hc2sgPSBwcm9wLT52YWx1ZTsKIAkJfSBlbHNlIHsKIAkJCXBibS0+bnVtX3BibV9pbnRtYXAgPSAwOwotCQkJbWVtc2V0KCZwYm0tPnBibV9pbnRtYXNrLCAwLCBzaXplb2YocGJtLT5wYm1faW50bWFzaykpOwogCQl9CiAKIAkJcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhwLCBwYm0pOwogCiAJbmV4dF9wY2k6Ci0JCW5vZGUgPSBwcm9tX2dldHNpYmxpbmcobm9kZSk7Ci0JCWlmICghbm9kZSkKLQkJCWJyZWFrOworCQlub2RlID0gbm9kZS0+c2libGluZzsKIAl9CiAJaWYgKHNpbWJhc19mb3VuZCA9PSAwKSB7Ci0JCWludCBlcnI7Ci0KIAkJLyogTm8gQVBCcyB1bmRlcm5lYXRoLCBwcm9iYWJseSB0aGlzIGlzIGEgaHVtbWluZ2JpcmQKIAkJICogc3lzdGVtLgogCQkgKi8KIAkJcGJtID0gJnAtPnBibV9BOwogCQlwYm0tPnBhcmVudCA9IHA7Ci0JCXBibS0+cHJvbV9ub2RlID0gc2FicmVfbm9kZTsKKwkJcGJtLT5wcm9tX25vZGUgPSBkcDsKIAkJcGJtLT5wY2lfZmlyc3RfYnVzbm8gPSBwLT5wY2lfZmlyc3RfYnVzbm87CiAJCXBibS0+cGNpX2xhc3RfYnVzbm8gPSBwLT5wY2lfbGFzdF9idXNubzsKIAotCQlwcm9tX2dldHN0cmluZyhzYWJyZV9ub2RlLCAibmFtZSIsIHBibS0+cHJvbV9uYW1lLCBzaXplb2YocGJtLT5wcm9tX25hbWUpKTsKLQkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShzYWJyZV9ub2RlLCAicmFuZ2VzIiwKLQkJCQkgICAgICAgKGNoYXIgKikgcGJtLT5wYm1fcmFuZ2VzLAotCQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1fcmFuZ2VzKSk7Ci0JCWlmIChlcnIgIT0gLTEpCisJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CisJCWlmIChwcm9wKSB7CisJCQlwYm0tPnBibV9yYW5nZXMgPSBwcm9wLT52YWx1ZTsKIAkJCXBibS0+bnVtX3BibV9yYW5nZXMgPQotCQkJCShlcnIgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOwotCQllbHNlCi0JCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0gMDsKLQotCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHNhYnJlX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwKLQkJCQkgICAgICAgKGNoYXIgKikgcGJtLT5wYm1faW50bWFwLAotCQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1faW50bWFwKSk7Ci0KLQkJaWYgKGVyciAhPSAtMSkgewotCQkJcGJtLT5udW1fcGJtX2ludG1hcCA9IChlcnIgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX2ludG1hcCkpOwotCQkJZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShzYWJyZV9ub2RlLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwKLQkJCQkJICAgICAgIChjaGFyICopJnBibS0+cGJtX2ludG1hc2ssCi0JCQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1faW50bWFzaykpOwotCQkJaWYgKGVyciA9PSAtMSkgewotCQkJCXByb21fcHJpbnRmKCJIdW1taW5nYmlyZDogRmF0YWwgZXJyb3IsIG5vIGludGVycnVwdC1tYXAtbWFzay5cbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQorCQkJCShsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOwogCQl9IGVsc2UgewotCQkJcGJtLT5udW1fcGJtX2ludG1hcCA9IDA7Ci0JCQltZW1zZXQoJnBibS0+cGJtX2ludG1hc2ssIDAsIHNpemVvZihwYm0tPnBibV9pbnRtYXNrKSk7CisJCQlwYm0tPm51bV9wYm1fcmFuZ2VzID0gMDsKIAkJfQogCisJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOworCQlpZiAocHJvcCkgeworCQkJcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7CisJCQlwYm0tPm51bV9wYm1faW50bWFwID0KKwkJCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKTsKIAotCQlzcHJpbnRmKHBibS0+bmFtZSwgIlNBQlJFJWQgUEJNJWMiLCBwLT5pbmRleCwKLQkJCShwYm0gPT0gJnAtPnBibV9BID8gJ0EnIDogJ0InKSk7CisJCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImludGVycnVwdC1tYXAtbWFzayIsCisJCQkJCQlOVUxMKTsKKwkJCXBibS0+cGJtX2ludG1hc2sgPSBwcm9wLT52YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCXBibS0+bnVtX3BibV9pbnRtYXAgPSAwOworCQl9CisKKwkJcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKKwkJcHJpbnRrKCIlczogU0FCUkUgUENJIEJ1cyBNb2R1bGVcbiIsIHBibS0+bmFtZSk7CisKIAkJcGJtLT5pb19zcGFjZS5uYW1lID0gcGJtLT5tZW1fc3BhY2UubmFtZSA9IHBibS0+bmFtZTsKIAogCQkvKiBIYWNrIHVwIHRvcC1sZXZlbCByZXNvdXJjZXMuICovCkBAIC0xNDQzLDE0ICsxNDMxLDE1IEBACiAJfQogfQogCi12b2lkIHNhYnJlX2luaXQoaW50IHBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzYWJyZV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcHJfcmVnc1syXTsKKwlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcHJfcmVnczsKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXJfaW5mbyAqcDsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdTsKLQlpbnQgdHNic2l6ZSwgZXJyOwotCXUzMiBidXNyYW5nZVsyXTsKLQl1MzIgdmRtYVsyXTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IHRzYnNpemU7CisJdTMyICpidXNyYW5nZTsKKwl1MzIgKnZkbWE7CiAJdTMyIHVwYV9wb3J0aWQsIGRtYV9tYXNrOwogCXU2NCBjbGVhcl9pcnE7CiAKQEAgLTE0NTgsMjIgKzE0NDcsMjEgQEAKIAlpZiAoIXN0cmNtcChtb2RlbF9uYW1lLCAicGNpMTA4ZSxhMDAxIikpCiAJCWh1bW1pbmdiaXJkX3AgPSAxOwogCWVsc2UgaWYgKCFzdHJjbXAobW9kZWxfbmFtZSwgIlNVTlcsc2FicmUiKSkgewotCQljaGFyIGNvbXBhdFs2NF07CisJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiY29tcGF0aWJsZSIsIE5VTEwpOworCQlpZiAocHJvcCkgeworCQkJY29uc3QgY2hhciAqY29tcGF0ID0gcHJvcC0+dmFsdWU7CiAKLQkJaWYgKHByb21fZ2V0cHJvcGVydHkocG5vZGUsICJjb21wYXRpYmxlIiwKLQkJCQkgICAgIGNvbXBhdCwgc2l6ZW9mKGNvbXBhdCkpID4gMCAmJgotCQkgICAgIXN0cmNtcChjb21wYXQsICJwY2kxMDhlLGEwMDEiKSkgewotCQkJaHVtbWluZ2JpcmRfcCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgY3B1X25vZGU7CisJCQlpZiAoIXN0cmNtcChjb21wYXQsICJwY2kxMDhlLGEwMDEiKSkKKwkJCQlodW1taW5nYmlyZF9wID0gMTsKKwkJfQorCQlpZiAoIWh1bW1pbmdiaXJkX3ApIHsKKwkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CiAKIAkJCS8qIE9mIGNvdXJzZSwgU3VuIGhhcyB0byBlbmNvZGUgdGhpbmdzIGEgdGhvdXNhbmQKIAkJCSAqIGRpZmZlcmVudCB3YXlzLCBpbmNvbnNpc3RlbnRseS4KIAkJCSAqLwotCQkJY3B1X2ZpbmRfYnlfaW5zdGFuY2UoMCwgJmNwdV9ub2RlLCBOVUxMKTsKLQkJCWlmIChwcm9tX2dldHByb3BlcnR5KGNwdV9ub2RlLCAibmFtZSIsCi0JCQkJCSAgICAgY29tcGF0LCBzaXplb2YoY29tcGF0KSkgPiAwICYmCi0JCQkgICAgIXN0cmNtcChjb21wYXQsICJTVU5XLFVsdHJhU1BBUkMtSUllIikpCisJCQljcHVfZmluZF9ieV9pbnN0YW5jZSgwLCAmZHAsIE5VTEwpOworCQkJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJTVU5XLFVsdHJhU1BBUkMtSUllIikpCiAJCQkJaHVtbWluZ2JpcmRfcCA9IDE7CiAJCX0KIAl9CkBAIC0xNDkxLDcgKzE0NzksMTAgQEAKIAl9CiAJcC0+cGJtX0EuaW9tbXUgPSBwLT5wYm1fQi5pb21tdSA9IGlvbW11OwogCi0JdXBhX3BvcnRpZCA9IHByb21fZ2V0aW50ZGVmYXVsdChwbm9kZSwgInVwYS1wb3J0aWQiLCAweGZmKTsKKwl1cGFfcG9ydGlkID0gMHhmZjsKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInVwYS1wb3J0aWQiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJdXBhX3BvcnRpZCA9ICoodTMyICopIHByb3AtPnZhbHVlOwogCiAJcC0+bmV4dCA9IHBjaV9jb250cm9sbGVyX3Jvb3Q7CiAJcGNpX2NvbnRyb2xsZXJfcm9vdCA9IHA7CkBAIC0xNTA5LDEzICsxNTAwLDkgQEAKIAkvKgogCSAqIE1hcCBpbiBTQUJSRSByZWdpc3RlciBzZXQgYW5kIHJlcG9ydCB0aGUgcHJlc2VuY2Ugb2YgdGhpcyBTQUJSRS4KIAkgKi8KLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHBub2RlLCAicmVnIiwKLQkJCSAgICAgICAoY2hhciAqKSZwcl9yZWdzWzBdLCBzaXplb2YocHJfcmVncykpOwotCWlmKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiU0FCUkU6IEVycm9yLCBjYW5ub3QgZ2V0IFUyUCByZWdpc3RlcnMgIgotCQkJICAgICJmcm9tIFBST00uXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJcHJfcmVncyA9IHByb3AtPnZhbHVlOwogCiAJLyoKIAkgKiBGaXJzdCBSRUcgaW4gcHJvcGVydHkgaXMgYmFzZSBvZiBlbnRpcmUgU0FCUkUgcmVnaXN0ZXIgc3BhY2UuCkBAIC0xNTIzLDkgKzE1MTAsNiBAQAogCXAtPnBibV9BLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMF0ucGh5c19hZGRyOwogCXAtPnBibV9CLmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMF0ucGh5c19hZGRyOwogCi0JcHJpbnRrKCJQQ0k6IEZvdW5kIFNBQlJFLCBtYWluIHJlZ3MgYXQgJTAxNmx4XG4iLAotCSAgICAgICBwLT5wYm1fQS5jb250cm9sbGVyX3JlZ3MpOwotCiAJLyogQ2xlYXIgaW50ZXJydXB0cyAqLwogCiAJLyogUENJIGZpcnN0ICovCkBAIC0xNTQ0LDE2ICsxNTI4LDkgQEAKIAkvKiBOb3cgbWFwIGluIFBDSSBjb25maWcgc3BhY2UgZm9yIGVudGlyZSBTQUJSRS4gKi8KIAlwLT5wYm1fQS5jb25maWdfc3BhY2UgPSBwLT5wYm1fQi5jb25maWdfc3BhY2UgPQogCQkocC0+cGJtX0EuY29udHJvbGxlcl9yZWdzICsgU0FCUkVfQ09ORklHU1BBQ0UpOwotCXByaW50aygiU0FCUkU6IFNoYXJlZCBQQ0kgY29uZmlnIHNwYWNlIGF0ICUwMTZseFxuIiwKLQkgICAgICAgcC0+cGJtX0EuY29uZmlnX3NwYWNlKTsKIAotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocG5vZGUsICJ2aXJ0dWFsLWRtYSIsCi0JCQkgICAgICAgKGNoYXIgKikmdmRtYVswXSwgc2l6ZW9mKHZkbWEpKTsKLQlpZihlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIlNBQlJFOiBFcnJvciwgY2Fubm90IGdldCB2aXJ0dWFsLWRtYSBwcm9wZXJ0eSAiCi0JCQkgICAgImZyb20gUFJPTS5cbiIpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ2aXJ0dWFsLWRtYSIsIE5VTEwpOworCXZkbWEgPSBwcm9wLT52YWx1ZTsKIAogCWRtYV9tYXNrID0gdmRtYVswXTsKIAlzd2l0Y2godmRtYVsxXSkgewpAQCAtMTU3NywyMSArMTU1NCwxMyBAQAogCiAJc2FicmVfaW9tbXVfaW5pdChwLCB0c2JzaXplLCB2ZG1hWzBdLCBkbWFfbWFzayk7CiAKLQlwcmludGsoIlNBQlJFOiBEVk1BIGF0ICUwOHggWyUwOHhdXG4iLCB2ZG1hWzBdLCB2ZG1hWzFdKTsKLQotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocG5vZGUsICJidXMtcmFuZ2UiLAotCQkJCSAgICAgICAoY2hhciAqKSZidXNyYW5nZVswXSwgc2l6ZW9mKGJ1c3JhbmdlKSk7Ci0JaWYoZXJyID09IDAgfHwgZXJyID09IC0xKSB7Ci0JCXByb21fcHJpbnRmKCJTQUJSRTogRXJyb3IsIGNhbm5vdCBnZXQgUENJIGJ1cy1yYW5nZSAiCi0JCQkgICAgIiBmcm9tIFBST00uXG4iKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJidXMtcmFuZ2UiLCBOVUxMKTsKKwlidXNyYW5nZSA9IHByb3AtPnZhbHVlOwogCXAtPnBjaV9maXJzdF9idXNubyA9IGJ1c3JhbmdlWzBdOwogCXAtPnBjaV9sYXN0X2J1c25vID0gYnVzcmFuZ2VbMV07CiAKIAkvKgogCSAqIExvb2sgZm9yIEFQQiB1bmRlcm5lYXRoLgogCSAqLwotCXNhYnJlX3BibV9pbml0KHAsIHBub2RlLCB2ZG1hWzBdKTsKKwlzYWJyZV9wYm1faW5pdChwLCBkcCwgdmRtYVswXSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zY2hpem8uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCmluZGV4IGNjNjYyZTkuLmYxNjQ0OWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3NjaGl6by5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS91cGEuaD4KICNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogI2luY2x1ZGUgInBjaV9pbXBsLmgiCiAjaW5jbHVkZSAiaW9tbXVfY29tbW9uLmgiCkBAIC0xNDU2LDEwICsxNDU3LDEyIEBACiAKIAlwYm1fY29uZmlnX2J1c21hc3RlcmluZygmcC0+cGJtX0IpOwogCXAtPnBibV9CLmlzXzY2bWh6X2NhcGFibGUgPQotCQlwcm9tX2dldGJvb2wocC0+cGJtX0IucHJvbV9ub2RlLCAiNjZtaHotY2FwYWJsZSIpOworCQkob2ZfZmluZF9wcm9wZXJ0eShwLT5wYm1fQi5wcm9tX25vZGUsICI2Nm1oei1jYXBhYmxlIiwgTlVMTCkKKwkJICE9IE5VTEwpOwogCXBibV9jb25maWdfYnVzbWFzdGVyaW5nKCZwLT5wYm1fQSk7CiAJcC0+cGJtX0EuaXNfNjZtaHpfY2FwYWJsZSA9Ci0JCXByb21fZ2V0Ym9vbChwLT5wYm1fQS5wcm9tX25vZGUsICI2Nm1oei1jYXBhYmxlIik7CisJCShvZl9maW5kX3Byb3BlcnR5KHAtPnBibV9BLnByb21fbm9kZSwgIjY2bWh6LWNhcGFibGUiLCBOVUxMKQorCQkgIT0gTlVMTCk7CiAJcGJtX3NjYW5fYnVzKHAsICZwLT5wYm1fQik7CiAJcGJtX3NjYW5fYnVzKHAsICZwLT5wYm1fQSk7CiAKQEAgLTE2NjEsMTMgKzE2NjQsMTggQEAKIHsKIAlzdHJ1Y3QgcGNpX2lvbW11ICppb21tdSA9IHBibS0+aW9tbXU7CiAJdW5zaWduZWQgbG9uZyBpLCB0YWdiYXNlLCBkYXRhYmFzZTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTMyIHZkbWFbMl0sIGRtYV9tYXNrOwogCXU2NCBjb250cm9sOwotCWludCBlcnIsIHRzYnNpemU7CisJaW50IHRzYnNpemU7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLAotCQkJICAgICAgIChjaGFyICopJnZkbWFbMF0sIHNpemVvZih2ZG1hKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgeworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKKwlpZiAocHJvcCkgeworCQl1MzIgKnZhbCA9IHByb3AtPnZhbHVlOworCisJCXZkbWFbMF0gPSB2YWxbMF07CisJCXZkbWFbMV0gPSB2YWxbMV07CisJfSBlbHNlIHsKIAkJLyogTm8gcHJvcGVydHksIHVzZSBkZWZhdWx0IHZhbHVlcy4gKi8KIAkJdmRtYVswXSA9IDB4YzAwMDAwMDA7CiAJCXZkbWFbMV0gPSAweDQwMDAwMDAwOwpAQCAtMTc3OCw2ICsxNzg2LDcgQEAKIAogc3RhdGljIHZvaWQgc2NoaXpvX3BibV9od19pbml0KHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdTY0IHRtcDsKIAogCXNjaGl6b193cml0ZShwYm0tPnBibV9yZWdzICsgU0NISVpPX1BDSV9JUlFfUkVUUlksIDUpOwpAQCAtMTc5MSw3ICsxODAwLDggQEAKIAkgICAgcGJtLT5jaGlwX3ZlcnNpb24gPj0gMHgyKQogCQl0bXAgfD0gMHgzVUwgPDwgU0NISVpPX1BDSUNUUkxfUFRPX1NISUZUOwogCi0JaWYgKCFwcm9tX2dldGJvb2wocGJtLT5wcm9tX25vZGUsICJuby1idXMtcGFya2luZyIpKQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAibm8tYnVzLXBhcmtpbmciLCBOVUxMKTsKKwlpZiAoIXByb3ApCiAJCXRtcCB8PSBTQ0hJWk9fUENJQ1RSTF9QQVJLOwogCWVsc2UKIAkJdG1wICY9IH5TQ0hJWk9fUENJQ1RSTF9QQVJLOwpAQCAtMTgzMSwxNiArMTg0MSwxNyBAQAogfQogCiBzdGF0aWMgdm9pZCBzY2hpem9fcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsCi0JCQkgICAgaW50IHByb21fbm9kZSwgdTMyIHBvcnRpZCwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCB1MzIgcG9ydGlkLAogCQkJICAgIGludCBjaGlwX3R5cGUpCiB7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcHJfcmVnc1s0XTsKLQl1bnNpZ25lZCBpbnQgYnVzcmFuZ2VbMl07CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXVuc2lnbmVkIGludCAqYnVzcmFuZ2U7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwogCWNvbnN0IGNoYXIgKmNoaXBzZXRfbmFtZTsKLQl1MzIgaW5vX2JpdG1hcFsyXTsKKwl1MzIgKmlub19iaXRtYXA7CiAJaW50IGlzX3BibV9hOwotCWludCBlcnI7CisJaW50IGxlbjsKIAogCXN3aXRjaCAoY2hpcF90eXBlKSB7CiAJY2FzZSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTzoKQEAgLTE4NjgsMTYgKzE4NzksMTAgQEAKIAkgKiAzKSBQQk0gUENJIGNvbmZpZyBzcGFjZQogCSAqIDQpIEljaGlwIHJlZ3MKIAkgKi8KLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgInJlZyIsCi0JCQkgICAgICAgKGNoYXIgKikmcHJfcmVnc1swXSwKLQkJCSAgICAgICBzaXplb2YocHJfcmVncykpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gcmVnIHByb3BlcnR5LlxuIiwKLQkJCSAgICBjaGlwc2V0X25hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlyZWdzID0gcHJvcC0+dmFsdWU7CiAKLQlpc19wYm1fYSA9ICgocHJfcmVnc1swXS5waHlzX2FkZHIgJiAweDAwNzAwMDAwKSA9PSAweDAwNjAwMDAwKTsKKwlpc19wYm1fYSA9ICgocmVnc1swXS5waHlzX2FkZHIgJiAweDAwNzAwMDAwKSA9PSAweDAwNjAwMDAwKTsKIAogCWlmIChpc19wYm1fYSkKIAkJcGJtID0gJnAtPnBibV9BOwpAQCAtMTg4Niw5MiArMTg5MSw2MiBAQAogCiAJcGJtLT5wb3J0aWQgPSBwb3J0aWQ7CiAJcGJtLT5wYXJlbnQgPSBwOwotCXBibS0+cHJvbV9ub2RlID0gcHJvbV9ub2RlOworCXBibS0+cHJvbV9ub2RlID0gZHA7CiAJcGJtLT5wY2lfZmlyc3Rfc2xvdCA9IDE7CiAKIAlwYm0tPmNoaXBfdHlwZSA9IGNoaXBfdHlwZTsKLQlwYm0tPmNoaXBfdmVyc2lvbiA9Ci0JCXByb21fZ2V0aW50ZGVmYXVsdChwcm9tX25vZGUsICJ2ZXJzaW9uIyIsIDApOwotCXBibS0+Y2hpcF9yZXZpc2lvbiA9Ci0JCXByb21fZ2V0aW50ZGVmYXVsdChwcm9tX25vZGUsICJtb2R1bGUtcmV2aXNpb24jIiwgMCk7CisJcGJtLT5jaGlwX3ZlcnNpb24gPSAwOworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidmVyc2lvbiMiLCBOVUxMKTsKKwlpZiAocHJvcCkKKwkJcGJtLT5jaGlwX3ZlcnNpb24gPSAqKGludCAqKSBwcm9wLT52YWx1ZTsKKwlwYm0tPmNoaXBfcmV2aXNpb24gPSAwOworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAibW9kdWxlLXJldmlzaW9uIyIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwYm0tPmNoaXBfcmV2aXNpb24gPSAqKGludCAqKSBwcm9wLT52YWx1ZTsKIAotCXBibS0+cGJtX3JlZ3MgPSBwcl9yZWdzWzBdLnBoeXNfYWRkcjsKLQlwYm0tPmNvbnRyb2xsZXJfcmVncyA9IHByX3JlZ3NbMV0ucGh5c19hZGRyIC0gMHgxMDAwMFVMOworCXBibS0+cGJtX3JlZ3MgPSByZWdzWzBdLnBoeXNfYWRkcjsKKwlwYm0tPmNvbnRyb2xsZXJfcmVncyA9IHJlZ3NbMV0ucGh5c19hZGRyIC0gMHgxMDAwMFVMOwogCiAJaWYgKGNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTykKLQkJcGJtLT5zeW5jX3JlZyA9IHByX3JlZ3NbM10ucGh5c19hZGRyICsgMHgxYTE4VUw7CisJCXBibS0+c3luY19yZWcgPSByZWdzWzNdLnBoeXNfYWRkciArIDB4MWExOFVMOwogCi0Jc3ByaW50ZihwYm0tPm5hbWUsCi0JCShjaGlwX3R5cGUgPT0gUEJNX0NISVBfVFlQRV9UT01BVElMTE8gPwotCQkgIlRPTUFUSUxMTyVkIFBCTSVjIiA6Ci0JCSAiU0NISVpPJWQgUEJNJWMiKSwKLQkJcC0+aW5kZXgsCi0JCShwYm0gPT0gJnAtPnBibV9BID8gJ0EnIDogJ0InKSk7CisJcGJtLT5uYW1lID0gZHAtPmZ1bGxfbmFtZTsKIAotCXByaW50aygiJXM6IHZlclsleDoleF0sIHBvcnRpZCAleCwgIgotCSAgICAgICAiY3JlZ3NbJWx4XSBwcmVnc1slbHhdXG4iLAorCXByaW50aygiJXM6ICVzIFBDSSBCdXMgTW9kdWxlIHZlclsleDoleF1cbiIsCiAJICAgICAgIHBibS0+bmFtZSwKLQkgICAgICAgcGJtLT5jaGlwX3ZlcnNpb24sIHBibS0+Y2hpcF9yZXZpc2lvbiwKLQkgICAgICAgcGJtLT5wb3J0aWQsCi0JICAgICAgIHBibS0+Y29udHJvbGxlcl9yZWdzLAotCSAgICAgICBwYm0tPnBibV9yZWdzKTsKKwkgICAgICAgKGNoaXBfdHlwZSA9PSBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyA/CisJCSJUT01BVElMTE8iIDogIlNDSElaTyIpLAorCSAgICAgICBwYm0tPmNoaXBfdmVyc2lvbiwgcGJtLT5jaGlwX3JldmlzaW9uKTsKIAogCXNjaGl6b19wYm1faHdfaW5pdChwYm0pOwogCi0JcHJvbV9nZXRzdHJpbmcocHJvbV9ub2RlLCAibmFtZSIsCi0JCSAgICAgICBwYm0tPnByb21fbmFtZSwKLQkJICAgICAgIHNpemVvZihwYm0tPnByb21fbmFtZSkpOwotCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJyYW5nZXMiLAotCQkJICAgICAgIChjaGFyICopIHBibS0+cGJtX3JhbmdlcywKLQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1fcmFuZ2VzKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiJXM6IEZhdGFsIGVycm9yLCBubyByYW5nZXMgcHJvcGVydHkuXG4iLAotCQkJICAgIHBibS0+bmFtZSk7Ci0JCXByb21faGFsdCgpOwotCX0KLQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CisJcGJtLT5wYm1fcmFuZ2VzID0gcHJvcC0+dmFsdWU7CiAJcGJtLT5udW1fcGJtX3JhbmdlcyA9Ci0JCShlcnIgLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcykpOworCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMpKTsKIAogCXNjaGl6b19kZXRlcm1pbmVfbWVtX2lvX3NwYWNlKHBibSk7CiAJcGJtX3JlZ2lzdGVyX3RvcGxldmVsX3Jlc291cmNlcyhwLCBwYm0pOwogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJpbnRlcnJ1cHQtbWFwIiwKLQkJCSAgICAgICAoY2hhciAqKXBibS0+cGJtX2ludG1hcCwKLQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1faW50bWFwKSk7Ci0JaWYgKGVyciAhPSAtMSkgewotCQlwYm0tPm51bV9wYm1faW50bWFwID0gKGVyciAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7Ci0JCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ZXJydXB0LW1hcC1tYXNrIiwKLQkJCQkgICAgICAgKGNoYXIgKikmcGJtLT5wYm1faW50bWFzaywKLQkJCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX2ludG1hc2spKTsKLQkJaWYgKGVyciA9PSAtMSkgewotCQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gIgotCQkJCSAgICAiaW50ZXJydXB0LW1hcC1tYXNrLlxuIiwgcGJtLT5uYW1lKTsKLQkJCXByb21faGFsdCgpOwotCQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwIiwgJmxlbik7CisJaWYgKHByb3ApIHsKKwkJcGJtLT5wYm1faW50bWFwID0gcHJvcC0+dmFsdWU7CisJCXBibS0+bnVtX3BibV9pbnRtYXAgPQorCQkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwKSk7CisKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKKwkJcGJtLT5wYm1faW50bWFzayA9IHByb3AtPnZhbHVlOwogCX0gZWxzZSB7CiAJCXBibS0+bnVtX3BibV9pbnRtYXAgPSAwOwotCQltZW1zZXQoJnBibS0+cGJtX2ludG1hc2ssIDAsIHNpemVvZihwYm0tPnBibV9pbnRtYXNrKSk7CiAJfQogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJpbm8tYml0bWFwIiwKLQkJCSAgICAgICAoY2hhciAqKSAmaW5vX2JpdG1hcFswXSwKLQkJCSAgICAgICBzaXplb2YoaW5vX2JpdG1hcCkpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gaW5vLWJpdG1hcC5cbiIsIHBibS0+bmFtZSk7Ci0JCXByb21faGFsdCgpOwotCX0KKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgImluby1iaXRtYXAiLCBOVUxMKTsKKwlpbm9fYml0bWFwID0gcHJvcC0+dmFsdWU7CiAJcGJtLT5pbm9fYml0bWFwID0gKCgodTY0KWlub19iaXRtYXBbMV0gPDwgMzJVTCkgfAogCQkJICAgKCh1NjQpaW5vX2JpdG1hcFswXSA8PCAgMFVMKSk7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgImJ1cy1yYW5nZSIsCi0JCQkgICAgICAgKGNoYXIgKikmYnVzcmFuZ2VbMF0sCi0JCQkgICAgICAgc2l6ZW9mKGJ1c3JhbmdlKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiJXM6IEZhdGFsIGVycm9yLCBubyBidXMtcmFuZ2UuXG4iLCBwYm0tPm5hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJidXMtcmFuZ2UiLCBOVUxMKTsKKwlidXNyYW5nZSA9IHByb3AtPnZhbHVlOwogCXBibS0+cGNpX2ZpcnN0X2J1c25vID0gYnVzcmFuZ2VbMF07CiAJcGJtLT5wY2lfbGFzdF9idXNubyA9IGJ1c3JhbmdlWzFdOwogCkBAIC0xOTg5LDE2ICsxOTY0LDIwIEBACiAJcmV0dXJuICh4ID09IHkpOwogfQogCi1zdGF0aWMgdm9pZCBfX3NjaGl6b19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lLCBpbnQgY2hpcF90eXBlKQorc3RhdGljIHZvaWQgX19zY2hpem9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICptb2RlbF9uYW1lLCBpbnQgY2hpcF90eXBlKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwOwogCXN0cnVjdCBwY2lfaW9tbXUgKmlvbW11OworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAlpbnQgaXNfcGJtX2E7CiAJdTMyIHBvcnRpZDsKIAotCXBvcnRpZCA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAicG9ydGlkIiwgMHhmZik7CisJcG9ydGlkID0gMHhmZjsKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInBvcnRpZCIsIE5VTEwpOworCWlmIChwcm9wKQorCQlwb3J0aWQgPSAqKHUzMiAqKSBwcm9wLT52YWx1ZTsKIAotCWZvcihwID0gcGNpX2NvbnRyb2xsZXJfcm9vdDsgcDsgcCA9IHAtPm5leHQpIHsKKwlmb3IgKHAgPSBwY2lfY29udHJvbGxlcl9yb290OyBwOyBwID0gcC0+bmV4dCkgewogCQlzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm07CiAKIAkJaWYgKHAtPnBibV9BLnByb21fbm9kZSAmJiBwLT5wYm1fQi5wcm9tX25vZGUpCkBAIC0yMDA5LDggKzE5ODgsOCBAQAogCQkgICAgICAgJnAtPnBibV9CKTsKIAogCQlpZiAocG9ydGlkX2NvbXBhcmUocGJtLT5wb3J0aWQsIHBvcnRpZCwgY2hpcF90eXBlKSkgewotCQkJaXNfcGJtX2EgPSAocC0+cGJtX0EucHJvbV9ub2RlID09IDApOwotCQkJc2NoaXpvX3BibV9pbml0KHAsIG5vZGUsIHBvcnRpZCwgY2hpcF90eXBlKTsKKwkJCWlzX3BibV9hID0gKHAtPnBibV9BLnByb21fbm9kZSA9PSBOVUxMKTsKKwkJCXNjaGl6b19wYm1faW5pdChwLCBkcCwgcG9ydGlkLCBjaGlwX3R5cGUpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMjA1MSwyMCArMjAzMCwyMCBAQAogCS8qIExpa2UgUFNZQ0hPIHdlIGhhdmUgYSAyR0IgYWxpZ25lZCBhcmVhIGZvciBtZW1vcnkgc3BhY2UuICovCiAJcGNpX21lbXNwYWNlX21hc2sgPSAweDdmZmZmZmZmVUw7CiAKLQlzY2hpem9fcGJtX2luaXQocCwgbm9kZSwgcG9ydGlkLCBjaGlwX3R5cGUpOworCXNjaGl6b19wYm1faW5pdChwLCBkcCwgcG9ydGlkLCBjaGlwX3R5cGUpOwogfQogCi12b2lkIHNjaGl6b19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzY2hpem9faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICptb2RlbF9uYW1lKQogewotCV9fc2NoaXpvX2luaXQobm9kZSwgbW9kZWxfbmFtZSwgUEJNX0NISVBfVFlQRV9TQ0hJWk8pOworCV9fc2NoaXpvX2luaXQoZHAsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfU0NISVpPKTsKIH0KIAotdm9pZCBzY2hpem9fcGx1c19pbml0KGludCBub2RlLCBjaGFyICptb2RlbF9uYW1lKQordm9pZCBzY2hpem9fcGx1c19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCiB7Ci0JX19zY2hpem9faW5pdChub2RlLCBtb2RlbF9uYW1lLCBQQk1fQ0hJUF9UWVBFX1NDSElaT19QTFVTKTsKKwlfX3NjaGl6b19pbml0KGRwLCBtb2RlbF9uYW1lLCBQQk1fQ0hJUF9UWVBFX1NDSElaT19QTFVTKTsKIH0KIAotdm9pZCB0b21hdGlsbG9faW5pdChpbnQgbm9kZSwgY2hhciAqbW9kZWxfbmFtZSkKK3ZvaWQgdG9tYXRpbGxvX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqbW9kZWxfbmFtZSkKIHsKLQlfX3NjaGl6b19pbml0KG5vZGUsIG1vZGVsX25hbWUsIFBCTV9DSElQX1RZUEVfVE9NQVRJTExPKTsKKwlfX3NjaGl6b19pbml0KGRwLCBtb2RlbF9uYW1lLCBQQk1fQ0hJUF9UWVBFX1RPTUFUSUxMTyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wY2lfc3VuNHYuYwppbmRleCA1NDE5NDgwLi5iNjllMjI3IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3BjaV9zdW40di5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxhc20vcHN0YXRlLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiAjaW5jbHVkZSAicGNpX2ltcGwuaCIKICNpbmNsdWRlICJpb21tdV9jb21tb24uaCIKQEAgLTY0NiwzNSArNjQ3LDM3IEBACiAvKiBSZWN1cnNpdmVseSBkZXNjZW5kIGludG8gdGhlIE9CUCBkZXZpY2UgdHJlZSwgcm9vdGVkIGF0IHRvcGxldmVsX25vZGUsCiAgKiBsb29raW5nIGZvciBhIFBDSSBkZXZpY2UgbWF0Y2hpbmcgYnVzIGFuZCBkZXZmbi4KICAqLwotc3RhdGljIGludCBvYnBfZmluZChzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpwcmVncywgaW50IHRvcGxldmVsX25vZGUsIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbikKK3N0YXRpYyBpbnQgb2JwX2ZpbmQoc3RydWN0IGRldmljZV9ub2RlICp0b3BsZXZlbF9ub2RlLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4pCiB7Ci0JdG9wbGV2ZWxfbm9kZSA9IHByb21fZ2V0Y2hpbGQodG9wbGV2ZWxfbm9kZSk7CisJdG9wbGV2ZWxfbm9kZSA9IHRvcGxldmVsX25vZGUtPmNoaWxkOwogCi0Jd2hpbGUgKHRvcGxldmVsX25vZGUgIT0gMCkgewotCQlpbnQgcmV0ID0gb2JwX2ZpbmQocHJlZ3MsIHRvcGxldmVsX25vZGUsIGJ1cywgZGV2Zm4pOworCXdoaWxlICh0b3BsZXZlbF9ub2RlICE9IE5VTEwpIHsKKwkJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyAqcmVnczsKKwkJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCQlpbnQgcmV0OwogCisJCXJldCA9IG9icF9maW5kKHRvcGxldmVsX25vZGUsIGJ1cywgZGV2Zm4pOwogCQlpZiAocmV0ICE9IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHByb21fZ2V0cHJvcGVydHkodG9wbGV2ZWxfbm9kZSwgInJlZyIsIChjaGFyICopIHByZWdzLAotCQkJCSAgICAgICBzaXplb2YoKnByZWdzKSAqIFBST01SRUdfTUFYKTsKLQkJaWYgKHJldCA9PSAwIHx8IHJldCA9PSAtMSkKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkodG9wbGV2ZWxfbm9kZSwgInJlZyIsIE5VTEwpOworCQlpZiAoIXByb3ApCiAJCQlnb3RvIG5leHRfc2libGluZzsKIAotCQlpZiAoKChwcmVnc1swXS5waHlzX2hpID4+IDE2KSAmIDB4ZmYpID09IGJ1cyAmJgotCQkgICAgKChwcmVnc1swXS5waHlzX2hpID4+IDgpICYgMHhmZikgPT0gZGV2Zm4pCisJCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwkJaWYgKCgocmVncy0+cGh5c19oaSA+PiAxNikgJiAweGZmKSA9PSBidXMgJiYKKwkJICAgICgocmVncy0+cGh5c19oaSA+PiA4KSAmIDB4ZmYpID09IGRldmZuKQogCQkJYnJlYWs7CiAKIAluZXh0X3NpYmxpbmc6Ci0JCXRvcGxldmVsX25vZGUgPSBwcm9tX2dldHNpYmxpbmcodG9wbGV2ZWxfbm9kZSk7CisJCXRvcGxldmVsX25vZGUgPSB0b3BsZXZlbF9ub2RlLT5zaWJsaW5nOwogCX0KIAotCXJldHVybiB0b3BsZXZlbF9ub2RlOworCXJldHVybiB0b3BsZXZlbF9ub2RlICE9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgcGRldl9odGFiX3BvcHVsYXRlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzIHByW1BST01SRUdfTUFYXTsKIAl1MzIgZGV2aGFuZGxlID0gcGJtLT5kZXZoYW5kbGU7CiAJdW5zaWduZWQgaW50IGJ1czsKIApAQCAtNjg1LDcgKzY4OCw3IEBACiAJCQl1bnNpZ25lZCBpbnQgZGV2aWNlID0gUENJX1NMT1QoZGV2Zm4pOwogCQkJdW5zaWduZWQgaW50IGZ1bmMgPSBQQ0lfRlVOQyhkZXZmbik7CiAKLQkJCWlmIChvYnBfZmluZChwciwgcGJtLT5wcm9tX25vZGUsIGJ1cywgZGV2Zm4pKSB7CisJCQlpZiAob2JwX2ZpbmQocGJtLT5wcm9tX25vZGUsIGJ1cywgZGV2Zm4pKSB7CiAJCQkJaW50IGVyciA9IHBkZXZfaHRhYl9hZGQoZGV2aGFuZGxlLCBidXMsCiAJCQkJCQkJZGV2aWNlLCBmdW5jKTsKIAkJCQlpZiAoZXJyKQpAQCAtODExLDggKzgxNCw3IEBACiAJcGNpX2ZpeHVwX2hvc3RfYnJpZGdlX3NlbGYocGJtLT5wY2lfYnVzKTsKIAlwYm0tPnBjaV9idXMtPnNlbGYtPnN5c2RhdGEgPSBjb29raWU7CiAjZW5kaWYKLQlwY2lfZmlsbF9pbl9wYm1fY29va2llcyhwYm0tPnBjaV9idXMsIHBibSwKLQkJCQlwYm0tPnByb21fbm9kZSk7CisJcGNpX2ZpbGxfaW5fcGJtX2Nvb2tpZXMocGJtLT5wY2lfYnVzLCBwYm0sIHBibS0+cHJvbV9ub2RlKTsKIAlwY2lfcmVjb3JkX2Fzc2lnbm1lbnRzKHBibSwgcGJtLT5wY2lfYnVzKTsKIAlwY2lfYXNzaWduX3VuYXNzaWduZWQocGJtLCBwYm0tPnBjaV9idXMpOwogCXBjaV9maXh1cF9pcnEocGJtLCBwYm0tPnBjaV9idXMpOwpAQCAtODIyLDE1ICs4MjQsMTggQEAKIAogc3RhdGljIHZvaWQgcGNpX3N1bjR2X3NjYW5fYnVzKHN0cnVjdCBwY2lfY29udHJvbGxlcl9pbmZvICpwKQogewotCWlmIChwLT5wYm1fQS5wcm9tX25vZGUpIHsKLQkJcC0+cGJtX0EuaXNfNjZtaHpfY2FwYWJsZSA9Ci0JCQlwcm9tX2dldGJvb2wocC0+cGJtX0EucHJvbV9ub2RlLCAiNjZtaHotY2FwYWJsZSIpOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJaWYgKChkcCA9IHAtPnBibV9BLnByb21fbm9kZSkgIT0gTlVMTCkgeworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgIjY2bWh6LWNhcGFibGUiLCBOVUxMKTsKKwkJcC0+cGJtX0EuaXNfNjZtaHpfY2FwYWJsZSA9IChwcm9wICE9IE5VTEwpOwogCiAJCXBibV9zY2FuX2J1cyhwLCAmcC0+cGJtX0EpOwogCX0KLQlpZiAocC0+cGJtX0IucHJvbV9ub2RlKSB7Ci0JCXAtPnBibV9CLmlzXzY2bWh6X2NhcGFibGUgPQotCQkJcHJvbV9nZXRib29sKHAtPnBibV9CLnByb21fbm9kZSwgIjY2bWh6LWNhcGFibGUiKTsKKwlpZiAoKGRwID0gcC0+cGJtX0IucHJvbV9ub2RlKSAhPSBOVUxMKSB7CisJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiNjZtaHotY2FwYWJsZSIsIE5VTEwpOworCQlwLT5wYm1fQi5pc182Nm1oel9jYXBhYmxlID0gKHByb3AgIT0gTlVMTCk7CiAKIAkJcGJtX3NjYW5fYnVzKHAsICZwLT5wYm1fQik7CiAJfQpAQCAtOTgyLDggKzk4NywxMyBAQAogCQkJCQkgICAgIEhWX1BDSV9UU0JJRCgwLCBpKSwKIAkJCQkJICAgICAmaW9fYXR0cnMsICZyYSk7CiAJCWlmIChyZXQgPT0gSFZfRU9LKSB7Ci0JCQljbnQrKzsKLQkJCV9fc2V0X2JpdChpLCBhcmVuYS0+bWFwKTsKKwkJCWlmIChwYWdlX2luX3BoeXNfYXZhaWwocmEpKSB7CisJCQkJcGNpX3N1bjR2X2lvbW11X2RlbWFwKGRldmhhbmRsZSwKKwkJCQkJCSAgICAgIEhWX1BDSV9UU0JJRCgwLCBpKSwgMSk7CisJCQl9IGVsc2UgeworCQkJCWNudCsrOworCQkJCV9fc2V0X2JpdChpLCBhcmVuYS0+bWFwKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtOTkzLDEzICsxMDAzLDE4IEBACiBzdGF0aWMgdm9pZCBwY2lfc3VuNHZfaW9tbXVfaW5pdChzdHJ1Y3QgcGNpX3BibV9pbmZvICpwYm0pCiB7CiAJc3RydWN0IHBjaV9pb21tdSAqaW9tbXUgPSBwYm0tPmlvbW11OworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAl1bnNpZ25lZCBsb25nIG51bV90c2JfZW50cmllcywgc3o7CiAJdTMyIHZkbWFbMl0sIGRtYV9tYXNrLCBkbWFfb2Zmc2V0OwotCWludCBlcnIsIHRzYnNpemU7CisJaW50IHRzYnNpemU7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLAotCQkJICAgICAgIChjaGFyICopJnZkbWFbMF0sIHNpemVvZih2ZG1hKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgeworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KHBibS0+cHJvbV9ub2RlLCAidmlydHVhbC1kbWEiLCBOVUxMKTsKKwlpZiAocHJvcCkgeworCQl1MzIgKnZhbCA9IHByb3AtPnZhbHVlOworCisJCXZkbWFbMF0gPSB2YWxbMF07CisJCXZkbWFbMV0gPSB2YWxbMV07CisJfSBlbHNlIHsKIAkJLyogTm8gcHJvcGVydHksIHVzZSBkZWZhdWx0IHZhbHVlcy4gKi8KIAkJdmRtYVswXSA9IDB4ODAwMDAwMDA7CiAJCXZkbWFbMV0gPSAweDgwMDAwMDAwOwpAQCAtMTA1MSwzNCArMTA2NiwzMCBAQAogCWlvbW11LT5hcmVuYS5saW1pdCA9IG51bV90c2JfZW50cmllczsKIAogCXN6ID0gcHJvYmVfZXhpc3RpbmdfZW50cmllcyhwYm0sIGlvbW11KTsKLQotCXByaW50aygiJXM6IFRTQiBlbnRyaWVzIFslbHVdLCBleGlzdGluZyBtYXBpbmdzIFslbHVdXG4iLAotCSAgICAgICBwYm0tPm5hbWUsIG51bV90c2JfZW50cmllcywgc3opOworCWlmIChzeikKKwkJcHJpbnRrKCIlczogSW1wb3J0ZWQgJWx1IFRTQiBlbnRyaWVzIGZyb20gT0JQXG4iLAorCQkgICAgICAgcGJtLT5uYW1lLCBzeik7CiB9CiAKIHN0YXRpYyB2b2lkIHBjaV9zdW40dl9nZXRfYnVzX3JhbmdlKHN0cnVjdCBwY2lfcGJtX2luZm8gKnBibSkKIHsKLQl1bnNpZ25lZCBpbnQgYnVzcmFuZ2VbMl07Ci0JaW50IHByb21fbm9kZSA9IHBibS0+cHJvbV9ub2RlOwotCWludCBlcnI7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXVuc2lnbmVkIGludCAqYnVzcmFuZ2U7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgImJ1cy1yYW5nZSIsCi0JCQkgICAgICAgKGNoYXIgKikmYnVzcmFuZ2VbMF0sCi0JCQkgICAgICAgc2l6ZW9mKGJ1c3JhbmdlKSk7Ci0JaWYgKGVyciA9PSAwIHx8IGVyciA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiJXM6IEZhdGFsIGVycm9yLCBubyBidXMtcmFuZ2UuXG4iLCBwYm0tPm5hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkocGJtLT5wcm9tX25vZGUsICJidXMtcmFuZ2UiLCBOVUxMKTsKKworCWJ1c3JhbmdlID0gcHJvcC0+dmFsdWU7CiAKIAlwYm0tPnBjaV9maXJzdF9idXNubyA9IGJ1c3JhbmdlWzBdOwogCXBibS0+cGNpX2xhc3RfYnVzbm8gPSBidXNyYW5nZVsxXTsKIAogfQogCi1zdGF0aWMgdm9pZCBwY2lfc3VuNHZfcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsIGludCBwcm9tX25vZGUsIHUzMiBkZXZoYW5kbGUpCitzdGF0aWMgdm9pZCBwY2lfc3VuNHZfcGJtX2luaXQoc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnAsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHUzMiBkZXZoYW5kbGUpCiB7CiAJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwotCWludCBlcnIsIGk7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWludCBsZW4sIGk7CiAKIAlpZiAoZGV2aGFuZGxlICYgMHg0MCkKIAkJcGJtID0gJnAtPnBibV9COwpAQCAtMTA4NiwzMiArMTA5NywxOSBAQAogCQlwYm0gPSAmcC0+cGJtX0E7CiAKIAlwYm0tPnBhcmVudCA9IHA7Ci0JcGJtLT5wcm9tX25vZGUgPSBwcm9tX25vZGU7CisJcGJtLT5wcm9tX25vZGUgPSBkcDsKIAlwYm0tPnBjaV9maXJzdF9zbG90ID0gMTsKIAogCXBibS0+ZGV2aGFuZGxlID0gZGV2aGFuZGxlOwogCi0Jc3ByaW50ZihwYm0tPm5hbWUsICJTVU40Vi1QQ0klZCBQQk0lYyIsCi0JCXAtPmluZGV4LCAocGJtID09ICZwLT5wYm1fQSA/ICdBJyA6ICdCJykpOworCXBibS0+bmFtZSA9IGRwLT5mdWxsX25hbWU7CiAKLQlwcmludGsoIiVzOiBkZXZoYW5kbGVbJXhdIHByb21fbm9kZVsleDoleF1cbiIsCi0JICAgICAgIHBibS0+bmFtZSwgcGJtLT5kZXZoYW5kbGUsCi0JICAgICAgIHBibS0+cHJvbV9ub2RlLCBwcm9tX2dldGNoaWxkKHBibS0+cHJvbV9ub2RlKSk7CisJcHJpbnRrKCIlczogU1VONFYgUENJIEJ1cyBNb2R1bGVcbiIsIHBibS0+bmFtZSk7CiAKLQlwcm9tX2dldHN0cmluZyhwcm9tX25vZGUsICJuYW1lIiwKLQkJICAgICAgIHBibS0+cHJvbV9uYW1lLCBzaXplb2YocGJtLT5wcm9tX25hbWUpKTsKLQotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAicmFuZ2VzIiwKLQkJCSAgICAgICAoY2hhciAqKSBwYm0tPnBibV9yYW5nZXMsCi0JCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX3JhbmdlcykpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gcmFuZ2VzIHByb3BlcnR5LlxuIiwKLQkJCSAgICBwYm0tPm5hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0KKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJhbmdlcyIsICZsZW4pOworCXBibS0+cGJtX3JhbmdlcyA9IHByb3AtPnZhbHVlOwogCXBibS0+bnVtX3BibV9yYW5nZXMgPQotCQkoZXJyIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMpKTsKKwkJKGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmFuZ2VzKSk7CiAKIAkvKiBNYXNrIG91dCB0aGUgdG9wIDggYml0cyBvZiB0aGUgcmFuZ2VzLCBsZWF2aW5nIHRoZSByZWFsCiAJICogcGh5c2ljYWwgYWRkcmVzcy4KQEAgLTExMjIsMjQgKzExMjAsMTMgQEAKIAlwY2lfc3VuNHZfZGV0ZXJtaW5lX21lbV9pb19zcGFjZShwYm0pOwogCXBibV9yZWdpc3Rlcl90b3BsZXZlbF9yZXNvdXJjZXMocCwgcGJtKTsKIAotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ZXJydXB0LW1hcCIsCi0JCQkgICAgICAgKGNoYXIgKilwYm0tPnBibV9pbnRtYXAsCi0JCQkgICAgICAgc2l6ZW9mKHBibS0+cGJtX2ludG1hcCkpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gaW50ZXJydXB0LW1hcCBwcm9wZXJ0eS5cbiIsCi0JCQkgICAgcGJtLT5uYW1lKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQorCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiaW50ZXJydXB0LW1hcCIsICZsZW4pOworCXBibS0+cGJtX2ludG1hcCA9IHByb3AtPnZhbHVlOworCXBibS0+bnVtX3BibV9pbnRtYXAgPQorCQkobGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKTsKIAotCXBibS0+bnVtX3BibV9pbnRtYXAgPSAoZXJyIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXApKTsKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgImludGVycnVwdC1tYXAtbWFzayIsCi0JCQkgICAgICAgKGNoYXIgKikmcGJtLT5wYm1faW50bWFzaywKLQkJCSAgICAgICBzaXplb2YocGJtLT5wYm1faW50bWFzaykpOwotCWlmIChlcnIgPT0gMCB8fCBlcnIgPT0gLTEpIHsKLQkJcHJvbV9wcmludGYoIiVzOiBGYXRhbCBlcnJvciwgbm8gaW50ZXJydXB0LW1hcC1tYXNrLlxuIiwKLQkJCSAgICBwYm0tPm5hbWUpOwotCQlwcm9tX2hhbHQoKTsKLQl9CisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHQtbWFwLW1hc2siLCBOVUxMKTsKKwlwYm0tPnBibV9pbnRtYXNrID0gcHJvcC0+dmFsdWU7CiAKIAlwY2lfc3VuNHZfZ2V0X2J1c19yYW5nZShwYm0pOwogCXBjaV9zdW40dl9pb21tdV9pbml0KHBibSk7CkBAIC0xMTQ3LDE2ICsxMTM0LDE5IEBACiAJcGRldl9odGFiX3BvcHVsYXRlKHBibSk7CiB9CiAKLXZvaWQgc3VuNHZfcGNpX2luaXQoaW50IG5vZGUsIGNoYXIgKm1vZGVsX25hbWUpCit2b2lkIHN1bjR2X3BjaV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKm1vZGVsX25hbWUpCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyX2luZm8gKnA7CiAJc3RydWN0IHBjaV9pb21tdSAqaW9tbXU7Ci0Jc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgcmVnczsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CiAJdTMyIGRldmhhbmRsZTsKIAlpbnQgaTsKIAotCXByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsIChjaGFyICopJnJlZ3MsIHNpemVvZihyZWdzKSk7Ci0JZGV2aGFuZGxlID0gKHJlZ3MucGh5c19hZGRyID4+IDMyVUwpICYgMHgwZmZmZmZmZjsKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCWRldmhhbmRsZSA9IChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmOwogCiAJZm9yIChwID0gcGNpX2NvbnRyb2xsZXJfcm9vdDsgcDsgcCA9IHAtPm5leHQpIHsKIAkJc3RydWN0IHBjaV9wYm1faW5mbyAqcGJtOwpAQCAtMTE2OSw3ICsxMTU5LDcgQEAKIAkJICAgICAgICZwLT5wYm1fQik7CiAKIAkJaWYgKHBibS0+ZGV2aGFuZGxlID09IChkZXZoYW5kbGUgXiAweDQwKSkgewotCQkJcGNpX3N1bjR2X3BibV9pbml0KHAsIG5vZGUsIGRldmhhbmRsZSk7CisJCQlwY2lfc3VuNHZfcGJtX2luaXQocCwgZHAsIGRldmhhbmRsZSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0xMjIwLDcgKzEyMTAsNyBAQAogCSAqLwogCXBjaV9tZW1zcGFjZV9tYXNrID0gMHg3ZmZmZmZmZlVMOwogCi0JcGNpX3N1bjR2X3BibV9pbml0KHAsIG5vZGUsIGRldmhhbmRsZSk7CisJcGNpX3N1bjR2X3BibV9pbml0KHAsIGRwLCBkZXZoYW5kbGUpOwogCXJldHVybjsKIAogZmF0YWxfbWVtb3J5X2Vycm9yOgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9wb3dlci5jCmluZGV4IDMwYmNhZjUuLjk0OTZjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvcG93ZXIuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Bvd2VyLmMKQEAgLTEwNSw3NiArMTA1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGhhc19idXR0b25faW50ZXJydXB0KHVuc2lnbmVkIGludCBpcnEsIGludCBwcm9tX25vZGUpCitzdGF0aWMgaW50IF9faW5pdCBoYXNfYnV0dG9uX2ludGVycnVwdCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewogCWlmIChpcnEgPT0gUENJX0lSUV9OT05FKQogCQlyZXR1cm4gMDsKLQlpZiAoIXByb21fbm9kZV9oYXNfcHJvcGVydHkocHJvbV9ub2RlLCAiYnV0dG9uIikpCisJaWYgKCFvZl9maW5kX3Byb3BlcnR5KGRwLCAiYnV0dG9uIiwgTlVMTCkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHBvd2VyX3Byb2JlX2VidXMoc3RydWN0IHJlc291cmNlICoqcmVzcCwgdW5zaWduZWQgaW50ICppcnFfcCwgaW50ICpwcm9tX25vZGVfcCkKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwb3dlcl9wcm9iZV9jb21tb24oc3RydWN0IG9mX2RldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXY7Ci0KLQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKLQkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJwb3dlciIpKSB7Ci0JCQkJKnJlc3AgPSAmZWRldi0+cmVzb3VyY2VbMF07Ci0JCQkJKmlycV9wID0gZWRldi0+aXJxc1swXTsKLQkJCQkqcHJvbV9ub2RlX3AgPSBlZGV2LT5wcm9tX25vZGU7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBvd2VyX3Byb2JlX2lzYShzdHJ1Y3QgcmVzb3VyY2UgKipyZXNwLCB1bnNpZ25lZCBpbnQgKmlycV9wLCBpbnQgKnByb21fbm9kZV9wKQotewotCXN0cnVjdCBzcGFyY19pc2FfYnJpZGdlICppc2FfYnVzOwotCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2OwotCi0JZm9yX2VhY2hfaXNhKGlzYV9idXMpIHsKLQkJZm9yX2VhY2hfaXNhZGV2KGlzYV9kZXYsIGlzYV9idXMpIHsKLQkJCWlmICghc3RyY21wKGlzYV9kZXYtPnByb21fbmFtZSwgInBvd2VyIikpIHsKLQkJCQkqcmVzcCA9ICZpc2FfZGV2LT5yZXNvdXJjZTsKLQkJCQkqaXJxX3AgPSBpc2FfZGV2LT5pcnE7Ci0JCQkJKnByb21fbm9kZV9wID0gaXNhX2Rldi0+cHJvbV9ub2RlOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAtRU5PREVWOwotfQotCi12b2lkIF9faW5pdCBwb3dlcl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOwotCXVuc2lnbmVkIGludCBpcnE7Ci0JaW50IHByb21fbm9kZTsKLQlzdGF0aWMgaW50IGludm9rZWQ7Ci0KLQlpZiAoaW52b2tlZCkKLQkJcmV0dXJuOwotCWludm9rZWQgPSAxOwotCi0JaWYgKCFwb3dlcl9wcm9iZV9lYnVzKCZyZXMsICZpcnEsICZwcm9tX25vZGUpKQotCQlnb3RvIGZvdW5kOwotCi0JaWYgKCFwb3dlcl9wcm9iZV9pc2EoJnJlcywgJmlycSwgJnByb21fbm9kZSkpCi0JCWdvdG8gZm91bmQ7Ci0KLQlyZXR1cm47Ci0KLWZvdW5kOgogCXBvd2VyX3JlZyA9IGlvcmVtYXAocmVzLT5zdGFydCwgMHg0KTsKKwogCXByaW50aygicG93ZXI6IENvbnRyb2wgcmVnIGF0ICVwIC4uLiAiLCBwb3dlcl9yZWcpOworCiAJcG93ZXJvZmZfbWV0aG9kID0gbWFjaGluZV9oYWx0OyAgLyogYWJsZSB0byB1c2UgdGhlIHN0YW5kYXJkIGhhbHQgKi8KLQlpZiAoaGFzX2J1dHRvbl9pbnRlcnJ1cHQoaXJxLCBwcm9tX25vZGUpKSB7CisKKwlpZiAoaGFzX2J1dHRvbl9pbnRlcnJ1cHQoaXJxLCBkZXYtPm5vZGUpKSB7CiAJCWlmIChrZXJuZWxfdGhyZWFkKHBvd2VyZCwgTlVMTCwgQ0xPTkVfRlMpIDwgMCkgewogCQkJcHJpbnRrKCJGYWlsZWQgdG8gc3RhcnQgcG93ZXIgZGFlbW9uLlxuIik7CiAJCQlyZXR1cm47CkBAIC0xODgsNCArMTM3LDUyIEBACiAJCXByaW50aygibm90IHVzaW5nIHBvd2VyZC5cbiIpOwogCX0KIH0KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcG93ZXJfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gInBvd2VyIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgZWJ1c19wb3dlcl9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldiA9IHRvX2VidXNfZGV2aWNlKCZkZXYtPmRldik7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSAmZWRldi0+cmVzb3VyY2VbMF07CisJdW5zaWduZWQgaW50IGlycSA9IGVkZXYtPmlycXNbMF07CisKKwlwb3dlcl9wcm9iZV9jb21tb24oZGV2LCByZXMsaXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBlYnVzX3Bvd2VyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicG93ZXIiLAorCS5tYXRjaF90YWJsZQk9IHBvd2VyX21hdGNoLAorCS5wcm9iZQkJPSBlYnVzX3Bvd2VyX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgaXNhX3Bvd2VyX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlkZXYgPSB0b19pc2FfZGV2aWNlKCZkZXYtPmRldik7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSAmaWRldi0+cmVzb3VyY2U7CisJdW5zaWduZWQgaW50IGlycSA9IGlkZXYtPmlycTsKKworCXBvd2VyX3Byb2JlX2NvbW1vbihkZXYsIHJlcyxpcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGlzYV9wb3dlcl9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInBvd2VyIiwKKwkubWF0Y2hfdGFibGUJPSBwb3dlcl9tYXRjaCwKKwkucHJvYmUJCT0gaXNhX3Bvd2VyX3Byb2JlLAorfTsKKwordm9pZCBfX2luaXQgcG93ZXJfaW5pdCh2b2lkKQoreworCW9mX3JlZ2lzdGVyX2RyaXZlcigmZWJ1c19wb3dlcl9kcml2ZXIsICZlYnVzX2J1c190eXBlKTsKKwlvZl9yZWdpc3Rlcl9kcml2ZXIoJmlzYV9wb3dlcl9kcml2ZXIsICZpc2FfYnVzX3R5cGUpOworCXJldHVybjsKK30KICNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvcHJvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDcwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3Byb20uYwpAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIFByb2NlZHVyZXMgZm9yIGNyZWF0aW5nLCBhY2Nlc3NpbmcgYW5kIGludGVycHJldGluZyB0aGUgZGV2aWNlIHRyZWUuCisgKgorICogUGF1bCBNYWNrZXJyYXMJQXVndXN0IDE5OTYuCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNSBQYXVsIE1hY2tlcnJhcy4KKyAqIAorICogIEFkYXB0ZWQgZm9yIDY0Yml0IFBvd2VyUEMgYnkgRGF2ZSBFbmdlYnJldHNlbiBhbmQgUGV0ZXIgQmVyZ25lci4KKyAqICAgIHtlbmdlYnJldHxiZXJnbmVyfUB1cy5pYm0uY29tIAorICoKKyAqICBBZGFwdGVkIGZvciBzcGFyYzY0IGJ5IERhdmlkIFMuIE1pbGxlciBkYXZlbUBkYXZlbWxvZnQubmV0CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogICAgICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqYWxsbm9kZXM7CisKK2ludCBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSwgY29uc3QgY2hhciAqY29tcGF0KQoreworCWNvbnN0IGNoYXIqIGNwOworCWludCBjcGxlbiwgbDsKKworCWNwID0gKGNoYXIgKikgb2ZfZ2V0X3Byb3BlcnR5KGRldmljZSwgImNvbXBhdGlibGUiLCAmY3BsZW4pOworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoY3BsZW4gPiAwKSB7CisJCWlmIChzdHJuY21wKGNwLCBjb21wYXQsIHN0cmxlbihjb21wYXQpKSA9PSAwKQorCQkJcmV0dXJuIDE7CisJCWwgPSBzdHJsZW4oY3ApICsgMTsKKwkJY3AgKz0gbDsKKwkJY3BsZW4gLT0gbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCisJbnAgPSBub2RlLT5wYXJlbnQ7CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9wYXJlbnQpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpuZXh0OworCisJbmV4dCA9IHByZXYgPyBwcmV2LT5zaWJsaW5nIDogbm9kZS0+Y2hpbGQ7CisJZm9yICg7IG5leHQgIT0gMDsgbmV4dCA9IG5leHQtPnNpYmxpbmcpIHsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5leHQ7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2dldF9uZXh0X2NoaWxkKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBhbGxub2RlczsKKworCWZvciAoOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KSB7CisJCWlmIChucC0+ZnVsbF9uYW1lICE9IDAgJiYgc3RyY21wKG5wLT5mdWxsX25hbWUsIHBhdGgpID09IDApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9wYXRoKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yIChucCA9IGFsbG5vZGVzOyBucCAhPSAwOyBucCA9IG5wLT5hbGxuZXh0KQorCQlpZiAobnAtPm5vZGUgPT0gaGFuZGxlKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gbnA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKTsKKworc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfbmFtZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCisJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBmcm9tID8gZnJvbS0+YWxsbmV4dCA6IGFsbG5vZGVzOworCWZvciAoOyBucCAhPSBOVUxMOyBucCA9IG5wLT5hbGxuZXh0KQorCQlpZiAobnAtPm5hbWUgIT0gTlVMTCAmJiBzdHJjbXAobnAtPm5hbWUsIG5hbWUpID09IDApCisJCQlicmVhazsKKworCXJldHVybiBucDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZmluZF9ub2RlX2J5X25hbWUpOworCitzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV90eXBlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKKwljb25zdCBjaGFyICp0eXBlKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IGZyb20gPyBmcm9tLT5hbGxuZXh0IDogYWxsbm9kZXM7CisJZm9yICg7IG5wICE9IDA7IG5wID0gbnAtPmFsbG5leHQpCisJCWlmIChucC0+dHlwZSAhPSAwICYmIHN0cmNtcChucC0+dHlwZSwgdHlwZSkgPT0gMCkKKwkJCWJyZWFrOworCisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX25vZGVfYnlfdHlwZSk7CisKK3N0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAorCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdGlibGUpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gZnJvbSA/IGZyb20tPmFsbG5leHQgOiBhbGxub2RlczsKKwlmb3IgKDsgbnAgIT0gMDsgbnAgPSBucC0+YWxsbmV4dCkgeworCQlpZiAodHlwZSAhPSBOVUxMCisJCSAgICAmJiAhKG5wLT50eXBlICE9IDAgJiYgc3RyY21wKG5wLT50eXBlLCB0eXBlKSA9PSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIGNvbXBhdGlibGUpKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5wOworfQorRVhQT1JUX1NZTUJPTChvZl9maW5kX2NvbXBhdGlibGVfbm9kZSk7CisKK3N0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgaW50ICpsZW5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisKKwlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChwcC0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaWYgKGxlbnAgIT0gMCkKKwkJCQkqbGVucCA9IHBwLT5sZW5ndGg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcHA7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfcHJvcGVydHkpOworCisvKgorICogRmluZCBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGZvciBhIGdpdmVuIG5vZGUKKyAqIGFuZCByZXR1cm4gdGhlIHZhbHVlLgorICovCit2b2lkICpvZl9nZXRfcHJvcGVydHkoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqbmFtZSwgaW50ICpsZW5wKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHAgPSBvZl9maW5kX3Byb3BlcnR5KG5wLG5hbWUsbGVucCk7CisJcmV0dXJuIHBwID8gcHAtPnZhbHVlIDogTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0X3Byb3BlcnR5KTsKKworaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgbGVuOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsIG5hbWUsICZsZW4pOworCWlmICghcHJvcCB8fCBsZW4gIT0gNCkKKwkJcmV0dXJuIGRlZjsKKworCXJldHVybiAqKGludCAqKSBwcm9wLT52YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0wob2ZfZ2V0aW50cHJvcF9kZWZhdWx0KTsKKworc3RhdGljIHVuc2lnbmVkIGludCBwcm9tX2Vhcmx5X2FsbG9jYXRlZDsKKworc3RhdGljIHZvaWQgKiBfX2luaXQgcHJvbV9lYXJseV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX19hbGxvY19ib290bWVtKHNpemUsIFNNUF9DQUNIRV9CWVRFUywgMFVMKTsKKwlpZiAocmV0ICE9IE5VTEwpCisJCW1lbXNldChyZXQsIDAsIHNpemUpOworCisJcHJvbV9lYXJseV9hbGxvY2F0ZWQgKz0gc2l6ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXNfcm9vdF9ub2RlKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJaWYgKCFkcCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGRwLT5wYXJlbnQgPT0gTlVMTCk7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgZGVhbCB3aXRoIHRoZSBibGFjayBtYWdpYyBvZiBmdWxseSBuYW1pbmcgYQorICogbm9kZS4KKyAqCisgKiBDZXJ0YWluIHdlbGwga25vd24gbmFtZWQgbm9kZXMgYXJlIGp1c3QgdGhlIHNpbXBsZSBuYW1lIHN0cmluZy4KKyAqCisgKiBBY3R1YWwgZGV2aWNlcyBoYXZlIGFuIGFkZHJlc3Mgc3BlY2lmaWVyIGFwcGVuZGVkIHRvIHRoZSBiYXNlIG5hbWUKKyAqIHN0cmluZywgbGlrZSB0aGlzICJmb29AYWRkciIuICBUaGUgImFkZHIiIGNhbiBiZSBpbiBhbnkgbnVtYmVyIG9mCisgKiBmb3JtYXRzLCBhbmQgdGhlIHBsYXRmb3JtIHBsdXMgdGhlIHR5cGUgb2YgdGhlIG5vZGUgZGV0ZXJtaW5lIHRoZQorICogZm9ybWF0IGFuZCBob3cgaXQgaXMgY29uc3RydWN0ZWQuCisgKgorICogRm9yIGNoaWxkcmVuIG9mIHRoZSBST09UIG5vZGUsIHRoZSBuYW1pbmcgY29udmVudGlvbiBpcyBmaXhlZCBhbmQKKyAqIGRldGVybWluZWQgYnkgd2hldGhlciB0aGlzIGlzIGEgc3VuNHUgb3Igc3VuNHYgc3lzdGVtLgorICoKKyAqIEZvciBjaGlsZHJlbiBvZiBvdGhlciBub2RlcywgaXQgaXMgYnVzIHR5cGUgc3BlY2lmaWMuICBTbworICogd2Ugd2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBkaXNjb3ZlciBhICJkZXZpY2VfdHlwZSIgcHJvcGVydHkKKyAqIHdlIHJlY29nbml6ZSBhbmQgd2UgZ28gZnJvbSB0aGVyZS4KKyAqCisgKiBBcyBhbiBleGFtcGxlLCB0aGUgYm9vdCBkZXZpY2Ugb24gbXkgd29ya3N0YXRpb24gaGFzIGEgZnVsbCBwYXRoOgorICoKKyAqCS9wY2lAMWUsNjAwMDAwL2lkZUBkL2Rpc2tAMCwwOmMKKyAqLworc3RhdGljIHZvaWQgX19pbml0IHN1bjR2X3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpycHJvcDsKKwl1MzIgaGlnaF9iaXRzLCBsb3dfYml0cywgdHlwZTsKKworCXJwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcnByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBycHJvcC0+dmFsdWU7CisJaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAorCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOworCQlyZXR1cm47CisJfQorCisJdHlwZSA9IHJlZ3MtPnBoeXNfYWRkciA+PiA2MFVMOworCWhpZ2hfYml0cyA9IChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCkgJiAweDBmZmZmZmZmVUw7CisJbG93X2JpdHMgPSAocmVncy0+cGh5c19hZGRyICYgMHhmZmZmZmZmZlVMKTsKKworCWlmICh0eXBlID09IDAgfHwgdHlwZSA9PSA4KSB7CisJCWNvbnN0IGNoYXIgKnByZWZpeCA9ICh0eXBlID09IDApID8gIm0iIDogImkiOworCisJCWlmIChsb3dfYml0cykKKwkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgsJXgiLAorCQkJCWRwLT5uYW1lLCBwcmVmaXgsCisJCQkJaGlnaF9iaXRzLCBsb3dfYml0cyk7CisJCWVsc2UKKwkJCXNwcmludGYodG1wX2J1ZiwgIiVzQCVzJXgiLAorCQkJCWRwLT5uYW1lLAorCQkJCXByZWZpeCwKKwkJCQloaWdoX2JpdHMpOworCX0gZWxzZSBpZiAodHlwZSA9PSAxMikgeworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCisJCQlkcC0+bmFtZSwgaGlnaF9iaXRzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBzdW40dV9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBsaW51eF9wcm9tNjRfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisJaWYgKCFpc19yb290X25vZGUoZHAtPnBhcmVudCkpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyID4+IDMyVUwpLAorCQkJKHVuc2lnbmVkIGludCkgKHJlZ3MtPnBoeXNfYWRkciAmIDB4ZmZmZmZmZmZVTCkpOworCQlyZXR1cm47CisJfQorCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJ1cGEtcG9ydGlkIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInBvcnRpZCIsIE5VTEwpOworCWlmIChwcm9wKSB7CisJCXVuc2lnbmVkIGxvbmcgbWFzayA9IDB4ZmZmZmZmZmZVTDsKKworCQlpZiAodGxiX3R5cGUgPj0gY2hlZXRhaCkKKwkJCW1hc2sgPSAweDdmZmZmZjsKKworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCisJCQlkcC0+bmFtZSwKKwkJCSoodTMyICopcHJvcC0+dmFsdWUsCisJCQkodW5zaWduZWQgaW50KSAocmVncy0+cGh5c19hZGRyICYgbWFzaykpOworCX0KK30KKworLyogIm5hbWVAc2xvdCxvZmZzZXQiICAqLworc3RhdGljIHZvaWQgX19pbml0IHNidXNfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKwlzcHJpbnRmKHRtcF9idWYsICIlc0AleCwleCIsCisJCWRwLT5uYW1lLAorCQlyZWdzLT53aGljaF9pbywKKwkJcmVncy0+cGh5c19hZGRyKTsKK30KKworLyogIm5hbWVAZGV2bnVtWyxmdW5jXSIgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwY2lfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzICpyZWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCWRldmZuID0gKHJlZ3MtPnBoeXNfaGkgPj4gOCkgJiAweGZmOworCWlmIChkZXZmbiAmIDB4MDcpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQkJZHAtPm5hbWUsCisJCQlkZXZmbiA+PiAzLAorCQkJZGV2Zm4gJiAweDA3KTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKHRtcF9idWYsICIlc0AleCIsCisJCQlkcC0+bmFtZSwKKwkJCWRldmZuID4+IDMpOworCX0KK30KKworLyogIm5hbWVAVVBBX1BPUlRJRCxvZmZzZXQiICovCitzdGF0aWMgdm9pZCBfX2luaXQgdXBhX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAidXBhLXBvcnRpZCIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwKKwkJKih1MzIgKikgcHJvcC0+dmFsdWUsCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKK30KKworLyogIm5hbWVAcmVnIiAqLworc3RhdGljIHZvaWQgX19pbml0IHZkZXZfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdTMyICpyZWdzOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4IiwgZHAtPm5hbWUsICpyZWdzKTsKK30KKworLyogIm5hbWVAYWRkcmhpLGFkZHJsbyIgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBlYnVzX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJZHAtPm5hbWUsCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgPj4gMzJVTCksCisJCSh1bnNpZ25lZCBpbnQpIChyZWdzLT5waHlzX2FkZHIgJiAweGZmZmZmZmZmVUwpKTsKK30KKworLyogIm5hbWVAYnVzLGFkZHIiICovCitzdGF0aWMgdm9pZCBfX2luaXQgaTJjX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXUzMiAqcmVnczsKKworCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcm9wKQorCQlyZXR1cm47CisKKwlyZWdzID0gcHJvcC0+dmFsdWU7CisKKwkvKiBUaGlzIGFjdHVhbGx5IGlzbid0IHJpZ2h0Li4uIHNob3VsZCBsb29rIGF0IHRoZSAjYWRkcmVzcy1jZWxscworCSAqIHByb3BlcnR5IG9mIHRoZSBpMmMgYnVzIG5vZGUgZXRjLiBldGMuCisJICovCisJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgsJXgiLAorCQlkcC0+bmFtZSwgcmVnc1swXSwgcmVnc1sxXSk7Cit9CisKKy8qICJuYW1lQHJlZzBbLHJlZzFdIiAqLworc3RhdGljIHZvaWQgX19pbml0IHVzYl9wYXRoX2NvbXBvbmVudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwLCBjaGFyICp0bXBfYnVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl1MzIgKnJlZ3M7CisKKwlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInJlZyIsIE5VTEwpOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcmVncyA9IHByb3AtPnZhbHVlOworCisJaWYgKHByb3AtPmxlbmd0aCA9PSBzaXplb2YodTMyKSB8fCByZWdzWzFdID09IDEpIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJXgiLAorCQkJZHAtPm5hbWUsIHJlZ3NbMF0pOworCX0gZWxzZSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCV4LCV4IiwKKwkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKKwl9Cit9CisKKy8qICJuYW1lQHJlZzByZWcxWyxyZWcycmVnM10iICovCitzdGF0aWMgdm9pZCBfX2luaXQgaWVlZTEzOTRfcGF0aF9jb21wb25lbnQoc3RydWN0IGRldmljZV9ub2RlICpkcCwgY2hhciAqdG1wX2J1ZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdTMyICpyZWdzOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXByb3ApCisJCXJldHVybjsKKworCXJlZ3MgPSBwcm9wLT52YWx1ZTsKKworCWlmIChyZWdzWzJdIHx8IHJlZ3NbM10pIHsKKwkJc3ByaW50Zih0bXBfYnVmLCAiJXNAJTA4eCUwOHgsJTA0eCUwOHgiLAorCQkJZHAtPm5hbWUsIHJlZ3NbMF0sIHJlZ3NbMV0sIHJlZ3NbMl0sIHJlZ3NbM10pOworCX0gZWxzZSB7CisJCXNwcmludGYodG1wX2J1ZiwgIiVzQCUwOHglMDh4IiwKKwkJCWRwLT5uYW1lLCByZWdzWzBdLCByZWdzWzFdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX2J1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGNoYXIgKnRtcF9idWYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBkcC0+cGFyZW50OworCisJaWYgKHBhcmVudCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaSIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+dHlwZSwgInBjaWV4IikpCisJCQlyZXR1cm4gcGNpX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwkJaWYgKCFzdHJjbXAocGFyZW50LT50eXBlLCAic2J1cyIpKQorCQkJcmV0dXJuIHNidXNfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ1cGEiKSkKKwkJCXJldHVybiB1cGFfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJlYnVzIikpCisJCQlyZXR1cm4gZWJ1c19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCWlmICghc3RyY21wKHBhcmVudC0+bmFtZSwgInVzYiIpIHx8CisJCSAgICAhc3RyY21wKHBhcmVudC0+bmFtZSwgImh1YiIpKQorCQkJcmV0dXJuIHVzYl9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImkyYyIpKQorCQkJcmV0dXJuIGkyY19wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7CisJCWlmICghc3RyY21wKHBhcmVudC0+dHlwZSwgImZpcmV3aXJlIikpCisJCQlyZXR1cm4gaWVlZTEzOTRfcGF0aF9jb21wb25lbnQoZHAsIHRtcF9idWYpOworCQlpZiAoIXN0cmNtcChwYXJlbnQtPnR5cGUsICJ2aXJ0dWFsLWRldmljZXMiKSkKKwkJCXJldHVybiB2ZGV2X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKworCQkvKiAiaXNhIiBpcyBoYW5kbGVkIHdpdGggcGxhdGZvcm0gbmFtaW5nICovCisJfQorCisJLyogVXNlIHBsYXRmb3JtIG5hbWluZyBjb252ZW50aW9uLiAgKi8KKwlpZiAodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikKKwkJcmV0dXJuIHN1bjR2X3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwllbHNlCisJCXJldHVybiBzdW40dV9wYXRoX2NvbXBvbmVudChkcCwgdG1wX2J1Zik7Cit9CisKK3N0YXRpYyBjaGFyICogX19pbml0IGJ1aWxkX3BhdGhfY29tcG9uZW50KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCit7CisJY2hhciB0bXBfYnVmWzY0XSwgKm47CisKKwl0bXBfYnVmWzBdID0gJ1wwJzsKKwlfX2J1aWxkX3BhdGhfY29tcG9uZW50KGRwLCB0bXBfYnVmKTsKKwlpZiAodG1wX2J1ZlswXSA9PSAnXDAnKQorCQlzdHJjcHkodG1wX2J1ZiwgZHAtPm5hbWUpOworCisJbiA9IHByb21fZWFybHlfYWxsb2Moc3RybGVuKHRtcF9idWYpICsgMSk7CisJc3RyY3B5KG4sIHRtcF9idWYpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBjaGFyICogX19pbml0IGJ1aWxkX2Z1bGxfbmFtZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworCWludCBsZW4sIG91cmxlbiwgcGxlbjsKKwljaGFyICpuOworCisJcGxlbiA9IHN0cmxlbihkcC0+cGFyZW50LT5mdWxsX25hbWUpOworCW91cmxlbiA9IHN0cmxlbihkcC0+cGF0aF9jb21wb25lbnRfbmFtZSk7CisJbGVuID0gb3VybGVuICsgcGxlbiArIDI7CisKKwluID0gcHJvbV9lYXJseV9hbGxvYyhsZW4pOworCXN0cmNweShuLCBkcC0+cGFyZW50LT5mdWxsX25hbWUpOworCWlmICghaXNfcm9vdF9ub2RlKGRwLT5wYXJlbnQpKSB7CisJCXN0cmNweShuICsgcGxlbiwgIi8iKTsKKwkJcGxlbisrOworCX0KKwlzdHJjcHkobiArIHBsZW4sIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IHByb3BlcnR5ICogX19pbml0IGJ1aWxkX29uZV9wcm9wKHBoYW5kbGUgbm9kZSwgY2hhciAqcHJldikKK3sKKwlzdGF0aWMgc3RydWN0IHByb3BlcnR5ICp0bXAgPSBOVUxMOworCXN0cnVjdCBwcm9wZXJ0eSAqcDsKKworCWlmICh0bXApIHsKKwkJcCA9IHRtcDsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkgKyAzMik7CisJCXRtcCA9IE5VTEw7CisJfSBlbHNlCisJCXAgPSBwcm9tX2Vhcmx5X2FsbG9jKHNpemVvZihzdHJ1Y3QgcHJvcGVydHkpICsgMzIpOworCisJcC0+bmFtZSA9IChjaGFyICopIChwICsgMSk7CisJaWYgKHByZXYgPT0gTlVMTCkgeworCQlwcm9tX2ZpcnN0cHJvcChub2RlLCBwLT5uYW1lKTsKKwl9IGVsc2UgeworCQlwcm9tX25leHRwcm9wKG5vZGUsIHByZXYsIHAtPm5hbWUpOworCX0KKwlpZiAoc3RybGVuKHAtPm5hbWUpID09IDApIHsKKwkJdG1wID0gcDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXAtPmxlbmd0aCA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBwLT5uYW1lKTsKKwlpZiAocC0+bGVuZ3RoIDw9IDApIHsKKwkJcC0+bGVuZ3RoID0gMDsKKwl9IGVsc2UgeworCQlwLT52YWx1ZSA9IHByb21fZWFybHlfYWxsb2MocC0+bGVuZ3RoKTsKKwkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCBwLT5uYW1lLCBwLT52YWx1ZSwgcC0+bGVuZ3RoKTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHkgKiBfX2luaXQgYnVpbGRfcHJvcF9saXN0KHBoYW5kbGUgbm9kZSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKmhlYWQsICp0YWlsOworCisJaGVhZCA9IHRhaWwgPSBidWlsZF9vbmVfcHJvcChub2RlLCBOVUxMKTsKKwl3aGlsZSh0YWlsKSB7CisJCXRhaWwtPm5leHQgPSBidWlsZF9vbmVfcHJvcChub2RlLCB0YWlsLT5uYW1lKTsKKwkJdGFpbCA9IHRhaWwtPm5leHQ7CisJfQorCisJcmV0dXJuIGhlYWQ7Cit9CisKK3N0YXRpYyBjaGFyICogX19pbml0IGdldF9vbmVfcHJvcGVydHkocGhhbmRsZSBub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKmJ1ZiA9ICI8TlVMTD4iOworCWludCBsZW47CisKKwlsZW4gPSBwcm9tX2dldHByb3BsZW4obm9kZSwgbmFtZSk7CisJaWYgKGxlbiA+IDApIHsKKwkJYnVmID0gcHJvbV9lYXJseV9hbGxvYyhsZW4pOworCQlwcm9tX2dldHByb3BlcnR5KG5vZGUsIG5hbWUsIGJ1ZiwgbGVuKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICogX19pbml0IGNyZWF0ZV9ub2RlKHBoYW5kbGUgbm9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWRwID0gcHJvbV9lYXJseV9hbGxvYyhzaXplb2YoKmRwKSk7CisKKwlrcmVmX2luaXQoJmRwLT5rcmVmKTsKKworCWRwLT5uYW1lID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAibmFtZSIpOworCWRwLT50eXBlID0gZ2V0X29uZV9wcm9wZXJ0eShub2RlLCAiZGV2aWNlX3R5cGUiKTsKKwlkcC0+bm9kZSA9IG5vZGU7CisKKwkvKiBCdWlsZCBpbnRlcnJ1cHRzIGxhdGVyLi4uICovCisKKwlkcC0+cHJvcGVydGllcyA9IGJ1aWxkX3Byb3BfbGlzdChub2RlKTsKKworCXJldHVybiBkcDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqIF9faW5pdCBidWlsZF90cmVlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50LCBwaGFuZGxlIG5vZGUsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKipuZXh0cCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCisJZHAgPSBjcmVhdGVfbm9kZShub2RlKTsKKwlpZiAoZHApIHsKKwkJKigqbmV4dHApID0gZHA7CisJCSpuZXh0cCA9ICZkcC0+YWxsbmV4dDsKKworCQlkcC0+cGFyZW50ID0gcGFyZW50OworCQlkcC0+cGF0aF9jb21wb25lbnRfbmFtZSA9IGJ1aWxkX3BhdGhfY29tcG9uZW50KGRwKTsKKwkJZHAtPmZ1bGxfbmFtZSA9IGJ1aWxkX2Z1bGxfbmFtZShkcCk7CisKKwkJZHAtPmNoaWxkID0gYnVpbGRfdHJlZShkcCwgcHJvbV9nZXRjaGlsZChub2RlKSwgbmV4dHApOworCisJCWRwLT5zaWJsaW5nID0gYnVpbGRfdHJlZShwYXJlbnQsIHByb21fZ2V0c2libGluZyhub2RlKSwgbmV4dHApOworCX0KKworCXJldHVybiBkcDsKK30KKwordm9pZCBfX2luaXQgcHJvbV9idWlsZF9kZXZpY2V0cmVlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICoqbmV4dHA7CisKKwlhbGxub2RlcyA9IGNyZWF0ZV9ub2RlKHByb21fcm9vdF9ub2RlKTsKKwlhbGxub2Rlcy0+cGF0aF9jb21wb25lbnRfbmFtZSA9ICIiOworCWFsbG5vZGVzLT5mdWxsX25hbWUgPSAiLyI7CisKKwluZXh0cCA9ICZhbGxub2Rlcy0+YWxsbmV4dDsKKwlhbGxub2Rlcy0+Y2hpbGQgPSBidWlsZF90cmVlKGFsbG5vZGVzLAorCQkJCSAgICAgcHJvbV9nZXRjaGlsZChhbGxub2Rlcy0+bm9kZSksCisJCQkJICAgICAmbmV4dHApOworCXByaW50aygiUFJPTTogQnVpbHQgZGV2aWNlIHRyZWUgd2l0aCAldSBieXRlcyBvZiBtZW1vcnkuXG4iLAorCSAgICAgICBwcm9tX2Vhcmx5X2FsbG9jYXRlZCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQva2VybmVsL3NidXMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCmluZGV4IDg4MTI0MTcuLmFjMDVlMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCisrKyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2J1cy5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlLmg+CiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zdGFyZmlyZS5oPgogCiAjaW5jbHVkZSAiaW9tbXVfY29tbW9uLmgiCkBAIC0xMDk4LDI0ICsxMDk5LDI1IEBACiB9CiAKIC8qIEJvb3QgdGltZSBpbml0aWFsaXphdGlvbi4gKi8KLXZvaWQgX19pbml0IHNidXNfaW9tbXVfaW5pdChpbnQgcHJvbV9ub2RlLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCitzdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pb21tdV9pbml0KGludCBfX25vZGUsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKIHsKLQlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyBycHJvcDsKKwlzdHJ1Y3QgbGludXhfcHJvbTY0X3JlZ2lzdGVycyAqcHI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAlzdHJ1Y3Qgc2J1c19pb21tdSAqaW9tbXU7CiAJdW5zaWduZWQgbG9uZyByZWdzLCB0c2JfYmFzZTsKIAl1NjQgY29udHJvbDsKLQlpbnQgZXJyLCBpOworCWludCBpOwogCi0Jc2J1cy0+cG9ydGlkID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNidXMtPnByb21fbm9kZSwKLQkJCQkJICAidXBhLXBvcnRpZCIsIC0xKTsKKwlkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKF9fbm9kZSk7CiAKLQllcnIgPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgInJlZyIsCi0JCQkgICAgICAgKGNoYXIgKikmcnByb3AsIHNpemVvZihycHJvcCkpOwotCWlmIChlcnIgPCAwKSB7CisJc2J1cy0+cG9ydGlkID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAidXBhLXBvcnRpZCIsIC0xKTsKKworCXByID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJaWYgKCFwcikgewogCQlwcm9tX3ByaW50Zigic2J1c19pb21tdV9pbml0OiBDYW5ub3QgbWFwIFNZU0lPIGNvbnRyb2wgcmVnaXN0ZXJzLlxuIik7CiAJCXByb21faGFsdCgpOwogCX0KLQlyZWdzID0gcnByb3AucGh5c19hZGRyOworCXJlZ3MgPSBwci0+cGh5c19hZGRyOwogCiAJaW9tbXUgPSBrbWFsbG9jKHNpemVvZigqaW9tbXUpICsgU01QX0NBQ0hFX0JZVEVTLCBHRlBfQVRPTUlDKTsKIAlpZiAoaW9tbXUgPT0gTlVMTCkgewpAQCAtMTIyNSwzICsxMjI3LDUwIEBACiAKIAlzeXNpb19yZWdpc3Rlcl9lcnJvcl9oYW5kbGVycyhzYnVzKTsKIH0KKwordm9pZCBzYnVzX2ZpbGxfZGV2aWNlX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHNkZXYtPnByb21fbm9kZSk7CisJc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxczsKKworCWlycXMgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJpbnRlcnJ1cHRzIiwgTlVMTCk7CisJaWYgKCFpcnFzKSB7CisJCXNkZXYtPmlycXNbMF0gPSAwOworCQlzZGV2LT5udW1faXJxcyA9IDA7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHByaSA9IGlycXNbMF0ucHJpOworCisJCXNkZXYtPm51bV9pcnFzID0gMTsKKwkJaWYgKHByaSA8IDB4MjApCisJCQlwcmkgKz0gc2Rldi0+c2xvdCAqIDg7CisKKwkJc2Rldi0+aXJxc1swXSA9CXNidXNfYnVpbGRfaXJxKHNkZXYtPmJ1cywgcHJpKTsKKwl9Cit9CisKK3ZvaWQgX19pbml0IHNidXNfYXJjaF9idXNfcmFuZ2VzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpwbiwgc3RydWN0IHNidXNfYnVzICpzYnVzKQoreworfQorCit2b2lkIF9faW5pdCBzYnVzX3NldHVwX2lvbW11KHN0cnVjdCBzYnVzX2J1cyAqc2J1cywgc3RydWN0IGRldmljZV9ub2RlICpkcCkKK3sKKwlzYnVzX2lvbW11X2luaXQoZHAtPm5vZGUsIHNidXMpOworfQorCit2b2lkIF9faW5pdCBzYnVzX3NldHVwX2FyY2hfcHJvcHMoc3RydWN0IHNidXNfYnVzICpzYnVzLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQoreworfQorCitpbnQgX19pbml0IHNidXNfYXJjaF9wcmVpbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHNidXNfYXJjaF9wb3N0aW5pdCh2b2lkKQoreworCWV4dGVybiB2b2lkIGZpcmV0cnVja19pbml0KHZvaWQpOworCWV4dGVybiB2b2lkIGNsb2NrX3Byb2JlKHZvaWQpOworCisJZmlyZXRydWNrX2luaXQoKTsKKwljbG9ja19wcm9iZSgpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDljZjFjODguLmE2YTdkODEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NldHVwLmMKQEAgLTM3NiwxMiArMzc2LDEyIEBACiAJfQogI2VuZGlmCiAKLQlzbXBfc2V0dXBfY3B1X3Bvc3NpYmxlX21hcCgpOwotCiAJLyogR2V0IGJvb3QgcHJvY2Vzc29yIHRyYXBfYmxvY2tbXSBzZXR1cC4gICovCiAJaW5pdF9jdXJfY3B1X3RyYXAoY3VycmVudF90aHJlYWRfaW5mbygpKTsKIAogCXBhZ2luZ19pbml0KCk7CisKKwlzbXBfc2V0dXBfY3B1X3Bvc3NpYmxlX21hcCgpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzZXRfcHJlZmVycmVkX2NvbnNvbGUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3NtcC5jCmluZGV4IGYwM2Q1MmQuLmY2MmJmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvc21wLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC9zbXAuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGFzbS9zdGFyZmlyZS5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CiAKQEAgLTc2LDQxICs3Nyw0MiBAQAogCiB2b2lkIF9faW5pdCBzbXBfc3RvcmVfY3B1X2luZm8oaW50IGlkKQogewotCWludCBjcHVfbm9kZSwgZGVmOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHA7CisJaW50IGRlZjsKIAogCS8qIG11bHRpcGxpZXIgYW5kIGNvdW50ZXIgc2V0IGJ5CiAJICAgc21wX3NldHVwX3BlcmNwdV90aW1lcigpICAqLwogCWNwdV9kYXRhKGlkKS51ZGVsYXlfdmFsCQkJPSBsb29wc19wZXJfamlmZnk7CiAKLQljcHVfZmluZF9ieV9taWQoaWQsICZjcHVfbm9kZSk7Ci0JY3B1X2RhdGEoaWQpLmNsb2NrX3RpY2sgPSBwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsCi0JCQkJCQkgICAgICJjbG9jay1mcmVxdWVuY3kiLCAwKTsKKwljcHVfZmluZF9ieV9taWQoaWQsICZkcCk7CisJY3B1X2RhdGEoaWQpLmNsb2NrX3RpY2sgPQorCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLCAwKTsKIAogCWRlZiA9ICgodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgPyAoOCAqIDEwMjQpIDogKDE2ICogMTAyNCkpOwotCWNwdV9kYXRhKGlkKS5kY2FjaGVfc2l6ZSA9IHByb21fZ2V0aW50ZGVmYXVsdChjcHVfbm9kZSwgImRjYWNoZS1zaXplIiwKLQkJCQkJCSAgICAgIGRlZik7CisJY3B1X2RhdGEoaWQpLmRjYWNoZV9zaXplID0KKwkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZGNhY2hlLXNpemUiLCBkZWYpOwogCiAJZGVmID0gMzI7CiAJY3B1X2RhdGEoaWQpLmRjYWNoZV9saW5lX3NpemUgPQotCQlwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsICJkY2FjaGUtbGluZS1zaXplIiwgZGVmKTsKKwkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZGNhY2hlLWxpbmUtc2l6ZSIsIGRlZik7CiAKIAlkZWYgPSAxNiAqIDEwMjQ7Ci0JY3B1X2RhdGEoaWQpLmljYWNoZV9zaXplID0gcHJvbV9nZXRpbnRkZWZhdWx0KGNwdV9ub2RlLCAiaWNhY2hlLXNpemUiLAotCQkJCQkJICAgICAgZGVmKTsKKwljcHVfZGF0YShpZCkuaWNhY2hlX3NpemUgPQorCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJpY2FjaGUtc2l6ZSIsIGRlZik7CiAKIAlkZWYgPSAzMjsKIAljcHVfZGF0YShpZCkuaWNhY2hlX2xpbmVfc2l6ZSA9Ci0JCXByb21fZ2V0aW50ZGVmYXVsdChjcHVfbm9kZSwgImljYWNoZS1saW5lLXNpemUiLCBkZWYpOworCQlvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJpY2FjaGUtbGluZS1zaXplIiwgZGVmKTsKIAogCWRlZiA9ICgodGxiX3R5cGUgPT0gaHlwZXJ2aXNvcikgPwogCSAgICAgICAoMyAqIDEwMjQgKiAxMDI0KSA6CiAJICAgICAgICg0ICogMTAyNCAqIDEwMjQpKTsKLQljcHVfZGF0YShpZCkuZWNhY2hlX3NpemUgPSBwcm9tX2dldGludGRlZmF1bHQoY3B1X25vZGUsICJlY2FjaGUtc2l6ZSIsCi0JCQkJCQkgICAgICBkZWYpOworCWNwdV9kYXRhKGlkKS5lY2FjaGVfc2l6ZSA9CisJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImVjYWNoZS1zaXplIiwgZGVmKTsKIAogCWRlZiA9IDY0OwogCWNwdV9kYXRhKGlkKS5lY2FjaGVfbGluZV9zaXplID0KLQkJcHJvbV9nZXRpbnRkZWZhdWx0KGNwdV9ub2RlLCAiZWNhY2hlLWxpbmUtc2l6ZSIsIGRlZik7CisJCW9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImVjYWNoZS1saW5lLXNpemUiLCBkZWYpOwogCiAJcHJpbnRrKCJDUFVbJWRdOiBDYWNoZXMgIgogCSAgICAgICAiRFtzeiglZCk6bGluZV9zeiglZCldICIKQEAgLTM0MiwxMCArMzQ0LDEwIEBACiAKIAkJcHJvbV9zdGFydGNwdV9jcHVpZChjcHUsIGVudHJ5LCBjb29raWUpOwogCX0gZWxzZSB7Ci0JCWludCBjcHVfbm9kZTsKKwkJc3RydWN0IGRldmljZV9ub2RlICpkcDsKIAotCQljcHVfZmluZF9ieV9taWQoY3B1LCAmY3B1X25vZGUpOwotCQlwcm9tX3N0YXJ0Y3B1KGNwdV9ub2RlLCBlbnRyeSwgY29va2llKTsKKwkJY3B1X2ZpbmRfYnlfbWlkKGNwdSwgJmRwKTsKKwkJcHJvbV9zdGFydGNwdShkcC0+bm9kZSwgZW50cnksIGNvb2tpZSk7CiAJfQogCiAJZm9yICh0aW1lb3V0ID0gMDsgdGltZW91dCA8IDUwMDAwMDA7IHRpbWVvdXQrKykgewpAQCAtMTI4OSw3ICsxMjkxLDggQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNtcF90dW5lX3NjaGVkdWxpbmcodm9pZCkKIHsKLQlpbnQgaW5zdGFuY2UsIG5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlpbnQgaW5zdGFuY2U7CiAJdW5zaWduZWQgaW50IGRlZiwgc21hbGxlc3QgPSB+MFU7CiAKIAlkZWYgPSAoKHRsYl90eXBlID09IGh5cGVydmlzb3IpID8KQEAgLTEyOTcsMTAgKzEzMDAsMTAgQEAKIAkgICAgICAgKDQgKiAxMDI0ICogMTAyNCkpOwogCiAJaW5zdGFuY2UgPSAwOwotCXdoaWxlICghY3B1X2ZpbmRfYnlfaW5zdGFuY2UoaW5zdGFuY2UsICZub2RlLCBOVUxMKSkgeworCXdoaWxlICghY3B1X2ZpbmRfYnlfaW5zdGFuY2UoaW5zdGFuY2UsICZkcCwgTlVMTCkpIHsKIAkJdW5zaWduZWQgaW50IHZhbDsKIAotCQl2YWwgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImVjYWNoZS1zaXplIiwgZGVmKTsKKwkJdmFsID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZWNhY2hlLXNpemUiLCBkZWYpOwogCQlpZiAodmFsIDwgc21hbGxlc3QpCiAJCQlzbWFsbGVzdCA9IHZhbDsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwppbmRleCAwZjAwYTk5Li4zNDhiODIwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3NwYXJjNjQva2VybmVsL3RpbWUuYwpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9jcHVkYXRhLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBERUZJTkVfU1BJTkxPQ0sobW9zdGVrX2xvY2spOwogREVGSU5FX1NQSU5MT0NLKHJ0Y19sb2NrKTsKQEAgLTc1NSwyNCArNzU2LDIwMCBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAorc3RhdGljIGludCBfX2luaXQgY2xvY2tfbW9kZWxfbWF0Y2hlcyhjaGFyICptb2RlbCkKK3sKKwlpZiAoc3RyY21wKG1vZGVsLCAibWs0OHQwMiIpICYmCisJICAgIHN0cmNtcChtb2RlbCwgIm1rNDh0MDgiKSAmJgorCSAgICBzdHJjbXAobW9kZWwsICJtazQ4dDU5IikgJiYKKwkgICAgc3RyY21wKG1vZGVsLCAibTU4MTkiKSAmJgorCSAgICBzdHJjbXAobW9kZWwsICJtNTgxOXAiKSAmJgorCSAgICBzdHJjbXAobW9kZWwsICJtNTgyMyIpICYmCisJICAgIHN0cmNtcChtb2RlbCwgImRzMTI4NyIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgX19jbG9ja19hc3NpZ25fY29tbW9uKHZvaWQgX19pb21lbSAqYWRkciwgY2hhciAqbW9kZWwpCit7CisJaWYgKG1vZGVsWzVdID09ICcwJyAmJiBtb2RlbFs2XSA9PSAnMicpIHsKKwkJbXN0azQ4dDAyX3JlZ3MgPSBhZGRyOworCX0gZWxzZSBpZihtb2RlbFs1XSA9PSAnMCcgJiYgbW9kZWxbNl0gPT0gJzgnKSB7CisJCW1zdGs0OHQwOF9yZWdzID0gYWRkcjsKKwkJbXN0azQ4dDAyX3JlZ3MgPSBtc3RrNDh0MDhfcmVncyArIE1PU1RFS180OFQwOF80OFQwMjsKKwl9IGVsc2UgeworCQltc3RrNDh0NTlfcmVncyA9IGFkZHI7CisJCW1zdGs0OHQwMl9yZWdzID0gbXN0azQ4dDU5X3JlZ3MgKyBNT1NURUtfNDhUNTlfNDhUMDI7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgY2xvY2tfYXNzaWduX2Nsa19yZWcoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzICpjbGtfcmVnLAorCQkJCQljaGFyICptb2RlbCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlhZGRyID0gKCh1bnNpZ25lZCBsb25nKSBjbGtfcmVnWzBdLnBoeXNfYWRkciB8CisJCSgoKHVuc2lnbmVkIGxvbmcpIGNsa19yZWdbMF0ud2hpY2hfaW8pIDw8IDMyVUwpKTsKKworCV9fY2xvY2tfYXNzaWduX2NvbW1vbigodm9pZCBfX2lvbWVtICopIGFkZHIsIG1vZGVsKTsKK30KKworc3RhdGljIGludCBfX2luaXQgY2xvY2tfcHJvYmVfY2VudHJhbCh2b2lkKQoreworCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBjbGtfcmVnWzJdLCAqcHI7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwljaGFyICptb2RlbDsKKworCWlmICghY2VudHJhbF9idXMpCisJCXJldHVybiAwOworCisJLyogR2V0IENlbnRyYWwgRkhDJ3MgcHJvbSBub2RlLiAgKi8KKwlkcCA9IGNlbnRyYWxfYnVzLT5jaGlsZC0+cHJvbV9ub2RlOworCisJLyogVGhlbiBnZXQgdGhlIGZpcnN0IGNoaWxkIGRldmljZSBiZWxvdyBpdC4gICovCisJZHAgPSBkcC0+Y2hpbGQ7CisKKwl3aGlsZSAoZHApIHsKKwkJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOworCQlpZiAoIW1vZGVsIHx8ICFjbG9ja19tb2RlbF9tYXRjaGVzKG1vZGVsKSkKKwkJCWdvdG8gbmV4dF9zaWJsaW5nOworCisJCXByID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgTlVMTCk7CisJCW1lbWNweShjbGtfcmVnLCBwciwgc2l6ZW9mKGNsa19yZWcpKTsKKworCQlhcHBseV9maGNfcmFuZ2VzKGNlbnRyYWxfYnVzLT5jaGlsZCwgY2xrX3JlZywgMSk7CisJCWFwcGx5X2NlbnRyYWxfcmFuZ2VzKGNlbnRyYWxfYnVzLCBjbGtfcmVnLCAxKTsKKworCQljbG9ja19hc3NpZ25fY2xrX3JlZyhjbGtfcmVnLCBtb2RlbCk7CisJCXJldHVybiAxOworCisJbmV4dF9zaWJsaW5nOgorCQlkcCA9IGRwLT5zaWJsaW5nOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BDSQorc3RhdGljIHZvaWQgX19pbml0IGNsb2NrX2lzYV9lYnVzX2Fzc2lnbl9yZWdzKHN0cnVjdCByZXNvdXJjZSAqcmVzLCBjaGFyICptb2RlbCkKK3sKKwlpZiAoIXN0cmNtcChtb2RlbCwgImRzMTI4NyIpIHx8CisJICAgICFzdHJjbXAobW9kZWwsICJtNTgxOSIpIHx8CisJICAgICFzdHJjbXAobW9kZWwsICJtNTgxOXAiKSB8fAorCSAgICAhc3RyY21wKG1vZGVsLCAibTU4MjMiKSkgeworCQlkczEyODdfcmVncyA9IHJlcy0+c3RhcnQ7CisJfSBlbHNlIHsKKwkJbXN0azQ4dDU5X3JlZ3MgPSAodm9pZCBfX2lvbWVtICopIHJlcy0+c3RhcnQ7CisJCW1zdGs0OHQwMl9yZWdzID0gbXN0azQ4dDU5X3JlZ3MgKyBNT1NURUtfNDhUNTlfNDhUMDI7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19wcm9iZV9vbmVfZWJ1c19kZXYoc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBlZGV2LT5wcm9tX25vZGU7CisJY2hhciAqbW9kZWw7CisKKwltb2RlbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgIm1vZGVsIiwgTlVMTCk7CisJaWYgKCFjbG9ja19tb2RlbF9tYXRjaGVzKG1vZGVsKSkKKwkJcmV0dXJuIDA7CisKKwljbG9ja19pc2FfZWJ1c19hc3NpZ25fcmVncygmZWRldi0+cmVzb3VyY2VbMF0sIG1vZGVsKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19wcm9iZV9lYnVzKHZvaWQpCit7CisJc3RydWN0IGxpbnV4X2VidXMgKmVidXM7CisKKwlmb3JfZWFjaF9lYnVzKGVidXMpIHsKKwkJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OworCisJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgeworCQkJaWYgKGNsb2NrX3Byb2JlX29uZV9lYnVzX2RldihlZGV2KSkKKwkJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19wcm9iZV9vbmVfaXNhX2RldihzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZSAqaWRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gaWRldi0+cHJvbV9ub2RlOworCWNoYXIgKm1vZGVsOworCisJbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJtb2RlbCIsIE5VTEwpOworCWlmICghY2xvY2tfbW9kZWxfbWF0Y2hlcyhtb2RlbCkpCisJCXJldHVybiAwOworCisJY2xvY2tfaXNhX2VidXNfYXNzaWduX3JlZ3MoJmlkZXYtPnJlc291cmNlLCBtb2RlbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgY2xvY2tfcHJvYmVfaXNhKHZvaWQpCit7CisJc3RydWN0IHNwYXJjX2lzYV9icmlkZ2UgKmlzYV9icjsKKworCWZvcl9lYWNoX2lzYShpc2FfYnIpIHsKKwkJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmlzYV9kZXY7CisKKwkJZm9yX2VhY2hfaXNhZGV2KGlzYV9kZXYsIGlzYV9icikgeworCQkJaWYgKGNsb2NrX3Byb2JlX29uZV9pc2FfZGV2KGlzYV9kZXYpKQorCQkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BDSSAqLworCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBpbnQgX19pbml0IGNsb2NrX3Byb2JlX29uZV9zYnVzX2RldihzdHJ1Y3Qgc2J1c19idXMgKnNidXMsIHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwljaGFyIG1vZGVsWzY0XTsKKwl2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlwcm9tX2dldHN0cmluZyhzZGV2LT5wcm9tX25vZGUsICJtb2RlbCIsIG1vZGVsLCBzaXplb2YobW9kZWwpKTsKKwlpZiAoIWNsb2NrX21vZGVsX21hdGNoZXMobW9kZWwpKQorCQlyZXR1cm4gMDsKKworCXJlcyA9ICZzZGV2LT5yZXNvdXJjZVswXTsKKwlhZGRyID0gc2J1c19pb3JlbWFwKHJlcywgMCwgMHg4MDBVTCwgImVlcHJvbSIpOworCisJX19jbG9ja19hc3NpZ25fY29tbW9uKGFkZHIsIG1vZGVsKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjbG9ja19wcm9iZV9zYnVzKHZvaWQpCit7CisJc3RydWN0IHNidXNfYnVzICpzYnVzOworCisJZm9yX2VhY2hfc2J1cyhzYnVzKSB7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKworCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKKwkJCWlmIChjbG9ja19wcm9iZV9vbmVfc2J1c19kZXYoc2J1cywgc2RldikpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCiB2b2lkIF9faW5pdCBjbG9ja19wcm9iZSh2b2lkKQogewotCXN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycyBjbGtfcmVnWzJdOwotCWNoYXIgbW9kZWxbMTI4XTsKLQlpbnQgbm9kZSwgYnVzbmQgPSAtMSwgZXJyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpbnV4X2NlbnRyYWwgKmNidXM7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXN0cnVjdCBsaW51eF9lYnVzICplYnVzID0gTlVMTDsKLQlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSAqaXNhX2JyID0gTlVMTDsKLSNlbmRpZgogCXN0YXRpYyBpbnQgaW52b2tlZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGludm9rZWQpCiAJCXJldHVybjsKIAlpbnZva2VkID0gMTsKIAotCiAJaWYgKHRoaXNfaXNfc3RhcmZpcmUpIHsKIAkJeHRpbWUudHZfc2VjID0gc3RhcmZpcmVfZ2V0X3RpbWUoKTsKIAkJeHRpbWUudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOwpAQCAtNzg4LDE4MiArOTY1LDI2IEBACiAJCXJldHVybjsKIAl9CiAKLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljYnVzID0gY2VudHJhbF9idXM7Ci0JaWYgKGNidXMgIT0gTlVMTCkKLQkJYnVzbmQgPSBjZW50cmFsX2J1cy0+Y2hpbGQtPnByb21fbm9kZTsKLQogCS8qIENoZWNrIEZIQyBDZW50cmFsIHRoZW4gRUJVU3MgdGhlbiBJU0EgYnJpZGdlcyB0aGVuIFNCVVNzLgogCSAqIFRoYXQgd2F5IHdlIGhhbmRsZSB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgcHJvcGVybHkuCiAJICoKIAkgKiBBcyBhIHNwZWNpYWwgY2FzZSwgbWFjaGluZXMgd2l0aCBDZW50cmFsIG11c3QgcHJvdmlkZSB0aGUKIAkgKiB0aW1lciBjaGlwIHRoZXJlLgogCSAqLworCWlmICghY2xvY2tfcHJvYmVfY2VudHJhbCgpICYmCiAjaWZkZWYgQ09ORklHX1BDSQotCWlmIChlYnVzX2NoYWluICE9IE5VTEwpIHsKLQkJZWJ1cyA9IGVidXNfY2hhaW47Ci0JCWlmIChidXNuZCA9PSAtMSkKLQkJCWJ1c25kID0gZWJ1cy0+cHJvbV9ub2RlOwotCX0KLQlpZiAoaXNhX2NoYWluICE9IE5VTEwpIHsKLQkJaXNhX2JyID0gaXNhX2NoYWluOwotCQlpZiAoYnVzbmQgPT0gLTEpCi0JCQlidXNuZCA9IGlzYV9ici0+cHJvbV9ub2RlOwotCX0KKwkgICAgIWNsb2NrX3Byb2JlX2VidXMoKSAmJgorCSAgICAhY2xvY2tfcHJvYmVfaXNhKCkgJiYKICNlbmRpZgotCWlmIChzYnVzX3Jvb3QgIT0gTlVMTCAmJiBidXNuZCA9PSAtMSkKLQkJYnVzbmQgPSBzYnVzX3Jvb3QtPnByb21fbm9kZTsKLQotCWlmIChidXNuZCA9PSAtMSkgewotCQlwcm9tX3ByaW50ZigiY2xvY2tfcHJvYmU6IHByb2JsZW0sIGNhbm5vdCBmaW5kIGJ1cyB0byBzZWFyY2guXG4iKTsKLQkJcHJvbV9oYWx0KCk7CisjaWZkZWYgQ09ORklHX1NCVVMKKwkgICAgIWNsb2NrX3Byb2JlX3NidXMoKQorI2VuZGlmCisJCSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBjbG9jayBjaGlwIGZvdW5kLlxuIik7CisJCXJldHVybjsKIAl9CiAKLQlub2RlID0gcHJvbV9nZXRjaGlsZChidXNuZCk7Ci0KLQl3aGlsZSAoMSkgewotCQlpZiAoIW5vZGUpCi0JCQltb2RlbFswXSA9IDA7Ci0JCWVsc2UKLQkJCXByb21fZ2V0c3RyaW5nKG5vZGUsICJtb2RlbCIsIG1vZGVsLCBzaXplb2YobW9kZWwpKTsKLQkJaWYgKHN0cmNtcChtb2RlbCwgIm1rNDh0MDIiKSAmJgotCQkgICAgc3RyY21wKG1vZGVsLCAibWs0OHQwOCIpICYmCi0JCSAgICBzdHJjbXAobW9kZWwsICJtazQ4dDU5IikgJiYKLQkJICAgIHN0cmNtcChtb2RlbCwgIm01ODE5IikgJiYKLQkJICAgIHN0cmNtcChtb2RlbCwgIm01ODE5cCIpICYmCi0JCSAgICBzdHJjbXAobW9kZWwsICJtNTgyMyIpICYmCi0JCSAgICBzdHJjbXAobW9kZWwsICJkczEyODciKSkgewotCQkJaWYgKGNidXMgIT0gTlVMTCkgewotCQkJCXByb21fcHJpbnRmKCJjbG9ja19wcm9iZTogQ2VudHJhbCBidXMgbGFja3MgdGltZXIgY2hpcC5cbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCi0JCSAgIAlpZiAobm9kZSAhPSAwKQotCQkJCW5vZGUgPSBwcm9tX2dldHNpYmxpbmcobm9kZSk7Ci0jaWZkZWYgQ09ORklHX1BDSQotCQkJd2hpbGUgKChub2RlID09IDApICYmIGVidXMgIT0gTlVMTCkgewotCQkJCWVidXMgPSBlYnVzLT5uZXh0OwotCQkJCWlmIChlYnVzICE9IE5VTEwpIHsKLQkJCQkJYnVzbmQgPSBlYnVzLT5wcm9tX25vZGU7Ci0JCQkJCW5vZGUgPSBwcm9tX2dldGNoaWxkKGJ1c25kKTsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAoKG5vZGUgPT0gMCkgJiYgaXNhX2JyICE9IE5VTEwpIHsKLQkJCQlpc2FfYnIgPSBpc2FfYnItPm5leHQ7Ci0JCQkJaWYgKGlzYV9iciAhPSBOVUxMKSB7Ci0JCQkJCWJ1c25kID0gaXNhX2JyLT5wcm9tX25vZGU7Ci0JCQkJCW5vZGUgPSBwcm9tX2dldGNoaWxkKGJ1c25kKTsKLQkJCQl9Ci0JCQl9Ci0jZW5kaWYKLQkJCWlmIChub2RlID09IDApIHsKLQkJCQlwcm9tX3ByaW50ZigiY2xvY2tfcHJvYmU6IENhbm5vdCBmaW5kIHRpbWVyIGNoaXBcbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQllcnIgPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJyZWciLCAoY2hhciAqKWNsa19yZWcsCi0JCQkJICAgICAgIHNpemVvZihjbGtfcmVnKSk7Ci0JCWlmKGVyciA9PSAtMSkgewotCQkJcHJvbV9wcmludGYoImNsb2NrX3Byb2JlOiBDYW5ub3QgZ2V0IE1vc3RlayByZWcgcHJvcGVydHlcbiIpOwotCQkJcHJvbV9oYWx0KCk7Ci0JCX0KLQotCQlpZiAoY2J1cyAhPSBOVUxMKSB7Ci0JCQlhcHBseV9maGNfcmFuZ2VzKGNlbnRyYWxfYnVzLT5jaGlsZCwgY2xrX3JlZywgMSk7Ci0JCQlhcHBseV9jZW50cmFsX3JhbmdlcyhjZW50cmFsX2J1cywgY2xrX3JlZywgMSk7Ci0JCX0KLSNpZmRlZiBDT05GSUdfUENJCi0JCWVsc2UgaWYgKGVidXMgIT0gTlVMTCkgewotCQkJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OwotCi0JCQlmb3JfZWFjaF9lYnVzZGV2KGVkZXYsIGVidXMpCi0JCQkJaWYgKGVkZXYtPnByb21fbm9kZSA9PSBub2RlKQotCQkJCQlicmVhazsKLQkJCWlmIChlZGV2ID09IE5VTEwpIHsKLQkJCQlpZiAoaXNhX2NoYWluICE9IE5VTEwpCi0JCQkJCWdvdG8gdHJ5X2lzYV9jbG9jazsKLQkJCQlwcm9tX3ByaW50ZigiJXM6IE1vc3RlayBub3QgcHJvYmVkIGJ5IEVCVVNcbiIsCi0JCQkJCSAgICBfX0ZVTkNUSU9OX18pOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCi0JCQlpZiAoIXN0cmNtcChtb2RlbCwgImRzMTI4NyIpIHx8Ci0JCQkgICAgIXN0cmNtcChtb2RlbCwgIm01ODE5IikgfHwKLQkJCSAgICAhc3RyY21wKG1vZGVsLCAibTU4MTlwIikgfHwKLQkJCSAgICAhc3RyY21wKG1vZGVsLCAibTU4MjMiKSkgewotCQkJCWRzMTI4N19yZWdzID0gZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JCQl9IGVsc2UgewotCQkJCW1zdGs0OHQ1OV9yZWdzID0gKHZvaWQgX19pb21lbSAqKQotCQkJCQllZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKLQkJCQltc3RrNDh0MDJfcmVncyA9IG1zdGs0OHQ1OV9yZWdzICsgTU9TVEVLXzQ4VDU5XzQ4VDAyOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJZWxzZSBpZiAoaXNhX2JyICE9IE5VTEwpIHsKLQkJCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FkZXY7Ci0KLXRyeV9pc2FfY2xvY2s6Ci0JCQlmb3JfZWFjaF9pc2FkZXYoaXNhZGV2LCBpc2FfYnIpCi0JCQkJaWYgKGlzYWRldi0+cHJvbV9ub2RlID09IG5vZGUpCi0JCQkJCWJyZWFrOwotCQkJaWYgKGlzYWRldiA9PSBOVUxMKSB7Ci0JCQkJcHJvbV9wcmludGYoIiVzOiBNb3N0ZWsgbm90IHByb2JlZCBieSBJU0FcbiIpOwotCQkJCXByb21faGFsdCgpOwotCQkJfQotCQkJaWYgKCFzdHJjbXAobW9kZWwsICJkczEyODciKSB8fAotCQkJICAgICFzdHJjbXAobW9kZWwsICJtNTgxOSIpIHx8Ci0JCQkgICAgIXN0cmNtcChtb2RlbCwgIm01ODE5cCIpIHx8Ci0JCQkgICAgIXN0cmNtcChtb2RlbCwgIm01ODIzIikpIHsKLQkJCQlkczEyODdfcmVncyA9IGlzYWRldi0+cmVzb3VyY2Uuc3RhcnQ7Ci0JCQl9IGVsc2UgewotCQkJCW1zdGs0OHQ1OV9yZWdzID0gKHZvaWQgX19pb21lbSAqKQotCQkJCQlpc2FkZXYtPnJlc291cmNlLnN0YXJ0OwotCQkJCW1zdGs0OHQwMl9yZWdzID0gbXN0azQ4dDU5X3JlZ3MgKyBNT1NURUtfNDhUNTlfNDhUMDI7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmCi0JCWVsc2UgewotCQkJaWYgKHNidXNfcm9vdC0+bnVtX3NidXNfcmFuZ2VzKSB7Ci0JCQkJaW50IG5yYW5nZXMgPSBzYnVzX3Jvb3QtPm51bV9zYnVzX3JhbmdlczsKLQkJCQlpbnQgcm5nYzsKLQotCQkJCWZvciAocm5nYyA9IDA7IHJuZ2MgPCBucmFuZ2VzOyBybmdjKyspCi0JCQkJCWlmIChjbGtfcmVnWzBdLndoaWNoX2lvID09Ci0JCQkJCSAgICBzYnVzX3Jvb3QtPnNidXNfcmFuZ2VzW3JuZ2NdLm90X2NoaWxkX3NwYWNlKQotCQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHJuZ2MgPT0gbnJhbmdlcykgewotCQkJCQlwcm9tX3ByaW50ZigiY2xvY2tfcHJvYmU6IENhbm5vdCBmaW5kIHJhbmdlcyBmb3IgIgotCQkJCQkJICAgICJjbG9jayByZWdzLlxuIik7Ci0JCQkJCXByb21faGFsdCgpOwotCQkJCX0KLQkJCQljbGtfcmVnWzBdLndoaWNoX2lvID0KLQkJCQkJc2J1c19yb290LT5zYnVzX3Jhbmdlc1tybmdjXS5vdF9wYXJlbnRfc3BhY2U7Ci0JCQkJY2xrX3JlZ1swXS5waHlzX2FkZHIgKz0KLQkJCQkJc2J1c19yb290LT5zYnVzX3Jhbmdlc1tybmdjXS5vdF9wYXJlbnRfYmFzZTsKLQkJCX0KLQkJfQotCi0JCWlmKG1vZGVsWzVdID09ICcwJyAmJiBtb2RlbFs2XSA9PSAnMicpIHsKLQkJCW1zdGs0OHQwMl9yZWdzID0gKHZvaWQgX19pb21lbSAqKQotCQkJCSgoKHU2NCljbGtfcmVnWzBdLnBoeXNfYWRkcikgfAotCQkJCSAoKCh1NjQpY2xrX3JlZ1swXS53aGljaF9pbyk8PDMyVUwpKTsKLQkJfSBlbHNlIGlmKG1vZGVsWzVdID09ICcwJyAmJiBtb2RlbFs2XSA9PSAnOCcpIHsKLQkJCW1zdGs0OHQwOF9yZWdzID0gKHZvaWQgX19pb21lbSAqKQotCQkJCSgoKHU2NCljbGtfcmVnWzBdLnBoeXNfYWRkcikgfAotCQkJCSAoKCh1NjQpY2xrX3JlZ1swXS53aGljaF9pbyk8PDMyVUwpKTsKLQkJCW1zdGs0OHQwMl9yZWdzID0gbXN0azQ4dDA4X3JlZ3MgKyBNT1NURUtfNDhUMDhfNDhUMDI7Ci0JCX0gZWxzZSB7Ci0JCQltc3RrNDh0NTlfcmVncyA9ICh2b2lkIF9faW9tZW0gKikKLQkJCQkoKCh1NjQpY2xrX3JlZ1swXS5waHlzX2FkZHIpIHwKLQkJCQkgKCgodTY0KWNsa19yZWdbMF0ud2hpY2hfaW8pPDwzMlVMKSk7Ci0JCQltc3RrNDh0MDJfcmVncyA9IG1zdGs0OHQ1OV9yZWdzICsgTU9TVEVLXzQ4VDU5XzQ4VDAyOwotCQl9Ci0JCWJyZWFrOwotCX0KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKIAlpZiAobXN0azQ4dDAyX3JlZ3MgIT0gTlVMTCkgewogCQkvKiBSZXBvcnQgYSBsb3cgYmF0dGVyeSB2b2x0YWdlIGNvbmRpdGlvbi4gKi8KQEAgLTk4MywxMiArMTAwNCwxNCBAQAogLyogVGhpcyBpcyBnZXRzIHRoZSBtYXN0ZXIgVElDS19JTlQgdGltZXIgZ29pbmcuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzcGFyYzY0X2luaXRfdGltZXJzKHZvaWQpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CiAJdW5zaWduZWQgbG9uZyBjbG9jazsKLQlpbnQgbm9kZTsKICNpZmRlZiBDT05GSUdfU01QCiAJZXh0ZXJuIHZvaWQgc21wX3RpY2tfaW5pdCh2b2lkKTsKICNlbmRpZgogCisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOwogCWlmICh0bGJfdHlwZSA9PSBzcGl0ZmlyZSkgewogCQl1bnNpZ25lZCBsb25nIHZlciwgbWFudWYsIGltcGw7CiAKQEAgLTk5OSwxOCArMTAyMiwxNyBAQAogCQlpZiAobWFudWYgPT0gMHgxNyAmJiBpbXBsID09IDB4MTMpIHsKIAkJCS8qIEh1bW1pbmdiaXJkLCBha2EgVWx0cmEtSUllICovCiAJCQl0aWNrX29wcyA9ICZoYnRpY2tfb3BlcmF0aW9uczsKLQkJCW5vZGUgPSBwcm9tX3Jvb3Rfbm9kZTsKLQkJCWNsb2NrID0gcHJvbV9nZXRpbnQobm9kZSwgInN0aWNrLWZyZXF1ZW5jeSIpOworCQkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZHAsICJzdGljay1mcmVxdWVuY3kiLCBOVUxMKTsKIAkJfSBlbHNlIHsKIAkJCXRpY2tfb3BzID0gJnRpY2tfb3BlcmF0aW9uczsKLQkJCWNwdV9maW5kX2J5X2luc3RhbmNlKDAsICZub2RlLCBOVUxMKTsKLQkJCWNsb2NrID0gcHJvbV9nZXRpbnQobm9kZSwgImNsb2NrLWZyZXF1ZW5jeSIpOworCQkJY3B1X2ZpbmRfYnlfaW5zdGFuY2UoMCwgJmRwLCBOVUxMKTsKKwkJCXByb3AgPSBvZl9maW5kX3Byb3BlcnR5KGRwLCAiY2xvY2stZnJlcXVlbmN5IiwgTlVMTCk7CiAJCX0KIAl9IGVsc2UgewogCQl0aWNrX29wcyA9ICZzdGlja19vcGVyYXRpb25zOwotCQlub2RlID0gcHJvbV9yb290X25vZGU7Ci0JCWNsb2NrID0gcHJvbV9nZXRpbnQobm9kZSwgInN0aWNrLWZyZXF1ZW5jeSIpOworCQlwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShkcCwgInN0aWNrLWZyZXF1ZW5jeSIsIE5VTEwpOwogCX0KKwljbG9jayA9ICoodW5zaWduZWQgaW50ICopIHByb3AtPnZhbHVlOwogCXRpbWVyX3RpY2tfb2Zmc2V0ID0gY2xvY2sgLyBIWjsKIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvc3BhcmM2NC9rZXJuZWwvdHJhcHMuYwppbmRleCA1MDU5Y2JkLi4xZmYzNGIwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC90cmFwcy5jCkBAIC00Miw2ICs0Miw3IEBACiAjaWZkZWYgQ09ORklHX0tNT0QKICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBBVE9NSUNfTk9USUZJRVJfSEVBRChzcGFyYzY0ZGllX2NoYWluKTsKIApAQCAtODA3LDcgKzgwOCw4IEBACiB2b2lkIF9faW5pdCBjaGVldGFoX2VjYWNoZV9mbHVzaF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBsYXJnZXN0X3NpemUsIHNtYWxsZXN0X2xpbmVzaXplLCBvcmRlciwgdmVyOwotCWludCBub2RlLCBpLCBpbnN0YW5jZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwOworCWludCBpLCBpbnN0YW5jZSwgc3o7CiAKIAkvKiBTY2FuIGFsbCBjcHUgZGV2aWNlIHRyZWUgbm9kZXMsIG5vdGUgdHdvIHZhbHVlczoKIAkgKiAxKSBsYXJnZXN0IEUtY2FjaGUgc2l6ZQpAQCAtODE3LDE0ICs4MTksMTQgQEAKIAlzbWFsbGVzdF9saW5lc2l6ZSA9IH4wVUw7CiAKIAlpbnN0YW5jZSA9IDA7Ci0Jd2hpbGUgKCFjcHVfZmluZF9ieV9pbnN0YW5jZShpbnN0YW5jZSwgJm5vZGUsIE5VTEwpKSB7CisJd2hpbGUgKCFjcHVfZmluZF9ieV9pbnN0YW5jZShpbnN0YW5jZSwgJmRwLCBOVUxMKSkgewogCQl1bnNpZ25lZCBsb25nIHZhbDsKIAotCQl2YWwgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImVjYWNoZS1zaXplIiwKLQkJCQkJICgyICogMTAyNCAqIDEwMjQpKTsKKwkJdmFsID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiZWNhY2hlLXNpemUiLAorCQkJCQkgICAgKDIgKiAxMDI0ICogMTAyNCkpOwogCQlpZiAodmFsID4gbGFyZ2VzdF9zaXplKQogCQkJbGFyZ2VzdF9zaXplID0gdmFsOwotCQl2YWwgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImVjYWNoZS1saW5lLXNpemUiLCA2NCk7CisJCXZhbCA9IG9mX2dldGludHByb3BfZGVmYXVsdChkcCwgImVjYWNoZS1saW5lLXNpemUiLCA2NCk7CiAJCWlmICh2YWwgPCBzbWFsbGVzdF9saW5lc2l6ZSkKIAkJCXNtYWxsZXN0X2xpbmVzaXplID0gdmFsOwogCQlpbnN0YW5jZSsrOwpAQCAtODQ5LDE2ICs4NTEsMTYgQEAKIAl9CiAKIAkvKiBOb3cgYWxsb2NhdGUgZXJyb3IgdHJhcCByZXBvcnRpbmcgc2NvcmVib2FyZC4gKi8KLQlub2RlID0gTlJfQ1BVUyAqICgyICogc2l6ZW9mKHN0cnVjdCBjaGVldGFoX2Vycl9pbmZvKSk7CisJc3ogPSBOUl9DUFVTICogKDIgKiBzaXplb2Yoc3RydWN0IGNoZWV0YWhfZXJyX2luZm8pKTsKIAlmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCBNQVhfT1JERVI7IG9yZGVyKyspIHsKLQkJaWYgKChQQUdFX1NJWkUgPDwgb3JkZXIpID49IG5vZGUpCisJCWlmICgoUEFHRV9TSVpFIDw8IG9yZGVyKSA+PSBzeikKIAkJCWJyZWFrOwogCX0KIAljaGVldGFoX2Vycm9yX2xvZyA9IChzdHJ1Y3QgY2hlZXRhaF9lcnJfaW5mbyAqKQogCQlfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKIAlpZiAoIWNoZWV0YWhfZXJyb3JfbG9nKSB7CiAJCXByb21fcHJpbnRmKCJjaGVldGFoX2VjYWNoZV9mbHVzaF9pbml0OiBGYWlsZWQgdG8gYWxsb2NhdGUgIgotCQkJICAgICJlcnJvciBsb2dnaW5nIHNjb3JlYm9hcmQgKCVkIGJ5dGVzKS5cbiIsIG5vZGUpOworCQkJICAgICJlcnJvciBsb2dnaW5nIHNjb3JlYm9hcmQgKCVkIGJ5dGVzKS5cbiIsIHN6KTsKIAkJcHJvbV9oYWx0KCk7CiAJfQogCW1lbXNldChjaGVldGFoX2Vycm9yX2xvZywgMCwgUEFHRV9TSVpFIDw8IG9yZGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdW5hbGlnbmVkLmMgYi9hcmNoL3NwYXJjNjQva2VybmVsL3VuYWxpZ25lZC5jCmluZGV4IDAwMWU4NTEuLmJiMmQ2ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmM2NC9rZXJuZWwvdW5hbGlnbmVkLmMKKysrIGIvYXJjaC9zcGFyYzY0L2tlcm5lbC91bmFsaWduZWQuYwpAQCAtMjc5LDEyICsyNzksMjEgQEAKIAogYXNtbGlua2FnZSB2b2lkIGtlcm5lbF91bmFsaWduZWRfdHJhcChzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IGluc24pCiB7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnQsIGxhc3RfdGltZTsKIAllbnVtIGRpcmVjdGlvbiBkaXIgPSBkZWNvZGVfZGlyZWN0aW9uKGluc24pOwogCWludCBzaXplID0gZGVjb2RlX2FjY2Vzc19zaXplKGluc24pOwogCiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5rZXJuX3VuYV9yZWdzID0gcmVnczsKIAljdXJyZW50X3RocmVhZF9pbmZvKCktPmtlcm5fdW5hX2luc24gPSBpbnNuOwogCisJaWYgKGppZmZpZXMgLSBsYXN0X3RpbWUgPiA1ICogSFopCisJCWNvdW50ID0gMDsKKwlpZiAoY291bnQgPCA1KSB7CisJCWxhc3RfdGltZSA9IGppZmZpZXM7CisJCWNvdW50Kys7CisJCXByaW50aygiS2VybmVsIHVuYWxpZ25lZCBhY2Nlc3MgYXQgVFBDWyVseF1cbiIsIHJlZ3MtPnRwYyk7CisJfQorCiAJaWYgKCFva19mb3Jfa2VybmVsKGluc24pIHx8IGRpciA9PSBib3RoKSB7CiAJCXByaW50aygiVW5zdXBwb3J0ZWQgdW5hbGlnbmVkIGxvYWQvc3RvcmUgdHJhcCBmb3Iga2VybmVsICIKIAkJICAgICAgICJhdCA8JTAxNmx4Pi5cbiIsIHJlZ3MtPnRwYyk7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jIGIvYXJjaC9zcGFyYzY0L21tL2luaXQuYwppbmRleCAxNTM5YTgzLi41MTM5OTM0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvc3BhcmM2NC9tbS9pbml0LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KICNpbmNsdWRlIDxhc20vdHNiLmg+CiAjaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiBleHRlcm4gdm9pZCBkZXZpY2Vfc2Nhbih2b2lkKTsKIApAQCAtMTAxLDggKzEwMiw2IEBACiAJCXByb21faGFsdCgpOwogCX0KIAotCSpudW1fZW50cyA9IGVudHM7Ci0KIAkvKiBTYW5pdGl6ZSB3aGF0IHdlIGdvdCBmcm9tIHRoZSBmaXJtd2FyZSwgYnkgcGFnZSBhbGlnbmluZwogCSAqIGV2ZXJ5dGhpbmcuCiAJICovCkBAIC0xMjQsNiArMTIzLDI1IEBACiAJCXJlZ3NbaV0ucGh5c19hZGRyID0gYmFzZTsKIAkJcmVnc1tpXS5yZWdfc2l6ZSA9IHNpemU7CiAJfQorCisJZm9yIChpID0gMDsgaSA8IGVudHM7IGkrKykgeworCQlpZiAocmVnc1tpXS5yZWdfc2l6ZSA9PSAwVUwpIHsKKwkJCWludCBqOworCisJCQlmb3IgKGogPSBpOyBqIDwgZW50cyAtIDE7IGorKykgeworCQkJCXJlZ3Nbal0ucGh5c19hZGRyID0KKwkJCQkJcmVnc1tqKzFdLnBoeXNfYWRkcjsKKwkJCQlyZWdzW2pdLnJlZ19zaXplID0KKwkJCQkJcmVnc1tqKzFdLnJlZ19zaXplOworCQkJfQorCisJCQllbnRzLS07CisJCQlpLS07CisJCX0KKwl9CisKKwkqbnVtX2VudHMgPSBlbnRzOworCiAJc29ydChyZWdzLCBlbnRzLCBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb202NF9yZWdpc3RlcnMpLAogCSAgICAgY21wX3A2NCwgTlVMTCk7CiB9CkBAIC0xMzM5LDYgKzEzNTcsOCBAQAogCiAJa2VybmVsX3BoeXNpY2FsX21hcHBpbmdfaW5pdCgpOwogCisJcHJvbV9idWlsZF9kZXZpY2V0cmVlKCk7CisKIAl7CiAJCXVuc2lnbmVkIGxvbmcgem9uZXNfc2l6ZVtNQVhfTlJfWk9ORVNdOwogCQl1bnNpZ25lZCBsb25nIHpob2xlc19zaXplW01BWF9OUl9aT05FU107CkBAIC0xMzc2LDcgKzEzOTYsNyBAQAogCQl3aGlsZSAob2xkX3N0YXJ0IDwgb2xkX2VuZCkgewogCQkJaW50IG47CiAKLQkJCWZvciAobiA9IDA7IHBhdmFpbF9yZXNjYW5fZW50czsgbisrKSB7CisJCQlmb3IgKG4gPSAwOyBuIDwgcGF2YWlsX3Jlc2Nhbl9lbnRzOyBuKyspIHsKIAkJCQl1bnNpZ25lZCBsb25nIG5ld19zdGFydCwgbmV3X2VuZDsKIAogCQkJCW5ld19zdGFydCA9IHBhdmFpbF9yZXNjYW5bbl0ucGh5c19hZGRyOwpAQCAtMTM5OCw2ICsxNDE4LDMyIEBACiAJfQogfQogCitpbnQgX19pbml0IHBhZ2VfaW5fcGh5c19hdmFpbCh1bnNpZ25lZCBsb25nIHBhZGRyKQoreworCWludCBpOworCisJcGFkZHIgJj0gUEFHRV9NQVNLOworCisJZm9yIChpID0gMDsgaSA8IHBhdmFpbF9yZXNjYW5fZW50czsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKKworCQlzdGFydCA9IHBhdmFpbF9yZXNjYW5baV0ucGh5c19hZGRyOworCQllbmQgPSBzdGFydCArIHBhdmFpbF9yZXNjYW5baV0ucmVnX3NpemU7CisKKwkJaWYgKHBhZGRyID49IHN0YXJ0ICYmIHBhZGRyIDwgZW5kKQorCQkJcmV0dXJuIDE7CisJfQorCWlmIChwYWRkciA+PSBrZXJuX2Jhc2UgJiYgcGFkZHIgPCAoa2Vybl9iYXNlICsga2Vybl9zaXplKSkKKwkJcmV0dXJuIDE7CisjaWZkZWYgQ09ORklHX0JMS19ERVZfSU5JVFJECisJaWYgKHBhZGRyID49IF9fcGEoaW5pdHJkX3N0YXJ0KSAmJgorCSAgICBwYWRkciA8IF9fcGEoUEFHRV9BTElHTihpbml0cmRfZW5kKSkpCisJCXJldHVybiAxOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvZGVwYWdlcywgZGF0YXBhZ2VzLCBpbml0cGFnZXM7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9mcy5jIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvZnMuYwppbmRleCA0ODg1Y2E2Li4wZjBlYjZhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9mcy5jCisrKyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL2ZzLmMKQEAgLTM1Niw3ICszNTYsNyBAQAogCWludCBlcnJvcjsKIAlzdHJ1Y3Qgc29sX3N0YXR2ZnMgX191c2VyICpzcyA9IEEoYnVmKTsKIAotCWVycm9yID0gdmZzX3N0YXRmcyhtbnQtPm1udF9zYiwgJnMpOworCWVycm9yID0gdmZzX3N0YXRmcyhtbnQtPm1udF9yb290LCAmcyk7CiAJaWYgKCFlcnJvcikgewogCQljb25zdCBjaGFyICpwID0gbW50LT5tbnRfc2ItPnNfdHlwZS0+bmFtZTsKIAkJaW50IGkgPSAwOwpAQCAtMzkyLDcgKzM5Miw3IEBACiAJaW50IGVycm9yOwogCXN0cnVjdCBzb2xfc3RhdHZmczY0IF9fdXNlciAqc3MgPSBBKGJ1Zik7CiAJCQkKLQllcnJvciA9IHZmc19zdGF0ZnMobW50LT5tbnRfc2IsICZzKTsKKwllcnJvciA9IHZmc19zdGF0ZnMobW50LT5tbnRfcm9vdCwgJnMpOwogCWlmICghZXJyb3IpIHsKIAkJY29uc3QgY2hhciAqcCA9IG1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWU7CiAJCWludCBpID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYyBiL2FyY2gvc3BhcmM2NC9zb2xhcmlzL21pc2MuYwppbmRleCA1Mjg0OTk2Li43MTljOTA5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjNjQvc29sYXJpcy9taXNjLmMKKysrIGIvYXJjaC9zcGFyYzY0L3NvbGFyaXMvbWlzYy5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CiAjaW5jbHVkZSA8YXNtL2lkcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogCiAjaW5jbHVkZSAiY29udi5oIgogCkBAIC0xOTQsMTQgKzE5NSwxNyBAQAogCX0KIH0KIAotc3RhdGljIGNoYXIgKnBsYXRmb3JtKGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBjaGFyICpwbGF0Zm9ybShjaGFyICpidWZmZXIsIGludCBzeikKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgoIi8iKTsKIAlpbnQgbGVuOwogCiAJKmJ1ZmZlciA9IDA7Ci0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX3Jvb3Rfbm9kZSwgIm5hbWUiLCBidWZmZXIsIDI1Nik7Ci0JaWYobGVuID4gMCkKLQkJYnVmZmVyW2xlbl0gPSAwOworCWxlbiA9IHN0cmxlbihkcC0+bmFtZSk7CisJaWYgKGxlbiA+IHN6KQorCQlsZW4gPSBzejsKKwltZW1jcHkoYnVmZmVyLCBkcC0+bmFtZSwgbGVuKTsKKwlidWZmZXJbbGVuXSA9IDA7CiAJaWYgKCpidWZmZXIpIHsKIAkJY2hhciAqcDsKIApAQCAtMjEzLDE2ICsyMTcsMjIgQEAKIAlyZXR1cm4gInN1bjR1IjsKIH0KIAotc3RhdGljIGNoYXIgKnNlcmlhbChjaGFyICpidWZmZXIpCitzdGF0aWMgY2hhciAqc2VyaWFsKGNoYXIgKmJ1ZmZlciwgaW50IHN6KQogewotCWludCBub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvb3B0aW9ucyIpOwogCWludCBsZW47CiAKLQlub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAib3B0aW9ucyIpOwogCSpidWZmZXIgPSAwOwotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInN5c3RlbS1ib2FyZC1zZXJpYWwjIiwgYnVmZmVyLCAyNTYpOwotCWlmKGxlbiA+IDApCi0JCWJ1ZmZlcltsZW5dID0gMDsKKwlpZiAoZHApIHsKKwkJY2hhciAqdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAic3lzdGVtLWJvYXJkLXNlcmlhbCMiLCAmbGVuKTsKKworCQlpZiAodmFsICYmIGxlbiA+IDApIHsKKwkJCWlmIChsZW4gPiBzeikKKwkJCQlsZW4gPSBzejsKKwkJCW1lbWNweShidWZmZXIsIHZhbCwgbGVuKTsKKwkJCWJ1ZmZlcltsZW5dID0gMDsKKwkJfQorCX0KIAlpZiAoISpidWZmZXIpCiAJCXJldHVybiAiNDUxMjM0ODcxNzIzNCI7CiAJZWxzZQpAQCAtMzA1LDggKzMxNSw4IEBACiAJY2FzZSBTSV9NQUNISU5FOiByID0gbWFjaGluZSgpOyBicmVhazsKIAljYXNlIFNJX0FSQ0hJVEVDVFVSRTogciA9ICJzcGFyYyI7IGJyZWFrOwogCWNhc2UgU0lfSFdfUFJPVklERVI6IHIgPSAiU3VuX01pY3Jvc3lzdGVtcyI7IGJyZWFrOwotCWNhc2UgU0lfSFdfU0VSSUFMOiByID0gc2VyaWFsKGJ1ZmZlcik7IGJyZWFrOwotCWNhc2UgU0lfUExBVEZPUk06IHIgPSBwbGF0Zm9ybShidWZmZXIpOyBicmVhazsKKwljYXNlIFNJX0hXX1NFUklBTDogciA9IHNlcmlhbChidWZmZXIsIHNpemVvZihidWZmZXIpKTsgYnJlYWs7CisJY2FzZSBTSV9QTEFURk9STTogciA9IHBsYXRmb3JtKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOyBicmVhazsKIAljYXNlIFNJX1NSUENfRE9NQUlOOiByID0gIiI7IGJyZWFrOwogCWNhc2UgU0lfVkVSU0lPTjogciA9ICJHZW5lcmljIjsgYnJlYWs7CiAJZGVmYXVsdDogcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9hcmNoL3VtL0tjb25maWcuZGVidWcgYi9hcmNoL3VtL0tjb25maWcuZGVidWcKaW5kZXggNTY4MWE4Yi4uYmFiNTFkNiAxMDA2NDQKLS0tIGEvYXJjaC91bS9LY29uZmlnLmRlYnVnCisrKyBiL2FyY2gvdW0vS2NvbmZpZy5kZWJ1ZwpAQCAtNDksNyArNDksNiBAQAogCiBjb25maWcgU1lTQ0FMTF9ERUJVRwogCWJvb2wgIkVuYWJsZSBzeXN0ZW0gY2FsbCBkZWJ1Z2dpbmciCi0JZGVmYXVsdCBOCiAJZGVwZW5kcyBvbiBERUJVR19JTkZPCiAJaGVscAogCVRoaXMgYWRkcyBzb21lIHN5c3RlbSBkZWJ1Z2dpbmcgdG8gVU1MLCBpbmNsdWRpbmcga2VlcGluZyBhIHJpbmcgYnVmZmVyCmRpZmYgLS1naXQgYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jIGIvYXJjaC91bS9kcml2ZXJzL21jb25zb2xlX2tlcm4uYwppbmRleCA2ZDcxNzNmLi43OTE0OTMxIDEwMDY0NAotLS0gYS9hcmNoL3VtL2RyaXZlcnMvbWNvbnNvbGVfa2Vybi5jCisrKyBiL2FyY2gvdW0vZHJpdmVycy9tY29uc29sZV9rZXJuLmMKQEAgLTMwMCw4ICszMDAsNiBAQAogCW1hY2hpbmVfcmVzdGFydChOVUxMKTsKIH0KIAotZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwotCiB2b2lkIG1jb25zb2xlX2NhZChzdHJ1Y3QgbWNfcmVxdWVzdCAqcmVxKQogewogCW1jb25zb2xlX3JlcGx5KHJlcSwgIiIsIDAsIDApOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaCBiL2FyY2gvdW0vaW5jbHVkZS9zeXNkZXAteDg2XzY0L3N5c2NhbGxzLmgKaW5kZXggZTA2ZjgzZS4uNWU4NmFhMCAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL3N5c2RlcC14ODZfNjQvc3lzY2FsbHMuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvc3lzZGVwLXg4Nl82NC9zeXNjYWxscy5oCkBAIC0xMiw4ICsxMiw2IEBACiAKIHR5cGVkZWYgbG9uZyBzeXNjYWxsX2hhbmRsZXJfdCh2b2lkKTsKIAotZXh0ZXJuIHN5c2NhbGxfaGFuZGxlcl90ICppYTMyX3N5c19jYWxsX3RhYmxlW107Ci0KIGV4dGVybiBzeXNjYWxsX2hhbmRsZXJfdCAqc3lzX2NhbGxfdGFibGVbXTsKIAogI2RlZmluZSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykgXApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdGltZV9rZXJuLmMgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwppbmRleCA4NmY1MWQwLi44N2NkYmM1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYworKysgYi9hcmNoL3VtL2tlcm5lbC90aW1lX2tlcm4uYwpAQCAtODcsNyArODcsNyBAQAogCiB2b2lkIHRpbWVfaW5pdF9rZXJuKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIG5zZWNzOworCWxvbmcgbG9uZyBuc2VjczsKIAogCW5zZWNzID0gb3NfbnNlY3MoKTsKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsIC1uc2VjcyAvIEJJTExJT04sCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvbWlzYy5TIGIvYXJjaC91bS9zeXMtcHBjL21pc2MuUwppbmRleCAxMWI3YmQ3Li5mMGM5NzFkYiAxMDA2NDQKLS0tIGEvYXJjaC91bS9zeXMtcHBjL21pc2MuUworKysgYi9hcmNoL3VtL3N5cy1wcGMvbWlzYy5TCkBAIC0yMywxNCArMjMsMTAgQEAKICNkZWZpbmUgQ0FDSEVfTElORV9TSVpFCQkxNgogI2RlZmluZSBMR19DQUNIRV9MSU5FX1NJWkUJNAogI2RlZmluZSBNQVhfQ09QWV9QUkVGRVRDSAkxCi0jZWxpZiAhZGVmaW5lZChDT05GSUdfUFBDNjRCUklER0UpCisjZWxzZQogI2RlZmluZSBDQUNIRV9MSU5FX1NJWkUJCTMyCiAjZGVmaW5lIExHX0NBQ0hFX0xJTkVfU0laRQk1CiAjZGVmaW5lIE1BWF9DT1BZX1BSRUZFVENICTQKLSNlbHNlCi0jZGVmaW5lIENBQ0hFX0xJTkVfU0laRQkJMTI4Ci0jZGVmaW5lIExHX0NBQ0hFX0xJTkVfU0laRQk3Ci0jZGVmaW5lIE1BWF9DT1BZX1BSRUZFVENICTEKICNlbmRpZiAvKiBDT05GSUdfNHh4IHx8IENPTkZJR184eHggKi8KIAogCS50ZXh0CmRpZmYgLS1naXQgYS9hcmNoL3Y4NTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC92ODUwL2tlcm5lbC9zaWduYWwuYwppbmRleCA2MzNlNGUxLi4xN2MyZDQzIDEwMDY0NAotLS0gYS9hcmNoL3Y4NTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvdjg1MC9rZXJuZWwvc2lnbmFsLmMKQEAgLTI3NCw3ICsyNzQsNyBAQAogCS8qIERlZmF1bHQgdG8gdXNpbmcgbm9ybWFsIHN0YWNrICovCiAJdW5zaWduZWQgbG9uZyBzcCA9IHJlZ3MtPmdwcltHUFJfU1BdOwogCi0JaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAhPSAwICYmICEgb25fc2lnX3N0YWNrKHNwKSkKKwlpZiAoKGthLT5zYS5zYV9mbGFncyAmIFNBX09OU1RBQ0spICE9IDAgJiYgISBzYXNfc3NfZmxhZ3Moc3ApKQogCQlzcCA9IGN1cnJlbnQtPnNhc19zc19zcCArIGN1cnJlbnQtPnNhc19zc19zaXplOwogCiAJcmV0dXJuICh2b2lkICopKChzcCAtIGZyYW1lX3NpemUpICYgLThVTCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCA0MDhkNDRhLi5hZjQ0MTMwIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTI5OSw2ICsyOTksNyBAQAogICAgICAgIGJvb2wgIkFDUEkgTlVNQSBkZXRlY3Rpb24iCiAgICAgICAgZGVwZW5kcyBvbiBOVU1BCiAgICAgICAgc2VsZWN0IEFDUEkgCisJc2VsZWN0IFBDSQogICAgICAgIHNlbGVjdCBBQ1BJX05VTUEKICAgICAgICBkZWZhdWx0IHkKICAgICAgICBoZWxwCkBAIC0zODksNiArMzkwLDcgQEAKIAlib29sICJLOCBHQVJUIElPTU1VIHN1cHBvcnQiCiAJZGVmYXVsdCB5CiAJc2VsZWN0IFNXSU9UTEIKKwlzZWxlY3QgQUdQCiAJZGVwZW5kcyBvbiBQQ0kKIAloZWxwCiAJICBTdXBwb3J0IGZvciBoYXJkd2FyZSBJT01NVSBpbiBBTUQncyBPcHRlcm9uL0F0aGxvbjY0IFByb2Nlc3NvcnMKQEAgLTQwMSwxMSArNDAzLDkgQEAKICAgCSAgbm9ydGhicmlkZ2UgYW5kIGEgc29mdHdhcmUgZW11bGF0aW9uIHVzZWQgb24gb3RoZXIgc3lzdGVtcyB3aXRob3V0CiAJICBoYXJkd2FyZSBJT01NVS4gIElmIHVuc3VyZSwgc2F5IFkuCiAKLSMgbmVlZCB0aGlzIGFsd2F5cyBlbmFibGVkIHdpdGggR0FSVF9JT01NVSBmb3IgdGhlIFZJQSB3b3JrYXJvdW5kCisjIG5lZWQgdGhpcyBhbHdheXMgc2VsZWN0ZWQgYnkgR0FSVF9JT01NVSBmb3IgdGhlIFZJQSB3b3JrYXJvdW5kCiBjb25maWcgU1dJT1RMQgogCWJvb2wKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIEdBUlRfSU9NTVUKIAogY29uZmlnIFg4Nl9NQ0UKIAlib29sICJNYWNoaW5lIGNoZWNrIHN1cHBvcnQiIGlmIEVNQkVEREVECmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODZfNjQvaWEzMi9pYTMyZW50cnkuUwppbmRleCA1YTkyZmVkLi40ZWM1OTRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2XzY0L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTY5Niw0ICs2OTYsNSBAQAogCS5xdWFkIHN5c19zeW5jX2ZpbGVfcmFuZ2UKIAkucXVhZCBzeXNfdGVlCiAJLnF1YWQgY29tcGF0X3N5c192bXNwbGljZQorCS5xdWFkIGNvbXBhdF9zeXNfbW92ZV9wYWdlcwogaWEzMl9zeXNjYWxsX2VuZDoJCQpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvTWFrZWZpbGUgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQppbmRleCA0ZmU5NzA3Li4wODBiOTk2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9NYWtlZmlsZQpAQCAtNCw1ICs0LDYgQEAKIAogaWZuZXEgKCQoQ09ORklHX0FDUElfUFJPQ0VTU09SKSwpCiBvYmoteQkJCSs9IHByb2Nlc3Nvci5vCitwcm9jZXNzb3IteQkJOj0gLi4vLi4vLi4vaTM4Ni9rZXJuZWwvYWNwaS9wcm9jZXNzb3IubyAuLi8uLi8uLi9pMzg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5vCiBlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9wcm9jZXNzb3IuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmRjMmJhLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIGFyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3Byb2Nlc3Nvci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA1IEludGVsIENvcnBvcmF0aW9uCi0gKiAJVmVua2F0ZXNoIFBhbGxpcGFkaSA8dmVua2F0ZXNoLnBhbGxpcGFkaUBpbnRlbC5jb20+Ci0gKiAJLSBBZGRlZCBfUERDIGZvciBwbGF0Zm9ybXMgd2l0aCBJbnRlbCBDUFVzCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0KLSNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgotI2luY2x1ZGUgPGFzbS9hY3BpLmg+Ci0KLXN0YXRpYyB2b2lkIGluaXRfaW50ZWxfcGRjKHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIsIHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCAqb2JqX2xpc3Q7Ci0JdW5pb24gYWNwaV9vYmplY3QgKm9iajsKLQl1MzIgKmJ1ZjsKLQotCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHBkYy4gSXQgd2lsbCBiZSB1c2VkIGxhdGVyLiAqLwotCW9ial9saXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9ial9saXN0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTWVtb3J5IGFsbG9jYXRpb24gZXJyb3JcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jb2JqID0ga21hbGxvYyhzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW9iaikgewotCQlwcmludGsoS0VSTl9FUlIgIk1lbW9yeSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKLQkJa2ZyZWUob2JqX2xpc3QpOwotCQlyZXR1cm47Ci0JfQotCi0JYnVmID0ga21hbGxvYygxMiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJNZW1vcnkgYWxsb2NhdGlvbiBlcnJvclxuIik7Ci0JCWtmcmVlKG9iaik7Ci0JCWtmcmVlKG9ial9saXN0KTsKLQkJcmV0dXJuOwotCX0KLQotCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwotCWJ1ZlsxXSA9IDE7Ci0JYnVmWzJdID0gQUNQSV9QRENfRVNUX0NBUEFCSUxJVFlfU01QOwotCi0Jb2JqLT50eXBlID0gQUNQSV9UWVBFX0JVRkZFUjsKLQlvYmotPmJ1ZmZlci5sZW5ndGggPSAxMjsKLQlvYmotPmJ1ZmZlci5wb2ludGVyID0gKHU4ICopIGJ1ZjsKLQlvYmpfbGlzdC0+Y291bnQgPSAxOwotCW9ial9saXN0LT5wb2ludGVyID0gb2JqOwotCXByLT5wZGMgPSBvYmpfbGlzdDsKLQotCXJldHVybjsKLX0KLQotLyogSW5pdGlhbGl6ZSBfUERDIGRhdGEgYmFzZWQgb24gdGhlIENQVSB2ZW5kb3IgKi8KLXZvaWQgYXJjaF9hY3BpX3Byb2Nlc3Nvcl9pbml0X3BkYyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQotewotCXVuc2lnbmVkIGludCBjcHUgPSBwci0+aWQ7Ci0Jc3RydWN0IGNwdWluZm9feDg2ICpjID0gY3B1X2RhdGEgKyBjcHU7Ci0KLQlwci0+cGRjID0gTlVMTDsKLQlpZiAoYy0+eDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMICYmIGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKLQkJaW5pdF9pbnRlbF9wZGMocHIsIGMpOwotCi0JcmV0dXJuOwotfQotCi1FWFBPUlRfU1lNQk9MKGFyY2hfYWNwaV9wcm9jZXNzb3JfaW5pdF9wZGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hY3BpL3NsZWVwLmMKaW5kZXggODY3YTBlYi4uMDkxYmM3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FjcGkvc2xlZXAuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYWNwaS9zbGVlcC5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisKICNpbmNsdWRlIDxhc20vbXBzcGVjLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KQEAgLTY2LDcgKzY4LDggQEAKIAlwZ2RfdCAqc2xvdDAgPSBwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCAwVUwpOwogCWxvd19wdHIgPSAqc2xvdDA7CiAJc2V0X3BnZChzbG90MCwgKnBnZF9vZmZzZXQoY3VycmVudC0+bW0sIFBBR0VfT0ZGU0VUKSk7Ci0JZmx1c2hfdGxiX2FsbCgpOworCVdBUk5fT04obnVtX29ubGluZV9jcHVzKCkgIT0gMSk7CisJbG9jYWxfZmx1c2hfdGxiKCk7CiB9CiAKIC8qKgpAQCAtOTIsNyArOTUsNyBAQAogdm9pZCBhY3BpX3Jlc3RvcmVfc3RhdGVfbWVtKHZvaWQpCiB7CiAJc2V0X3BnZChwZ2Rfb2Zmc2V0KGN1cnJlbnQtPm1tLCAwVUwpLCBsb3dfcHRyKTsKLQlmbHVzaF90bGJfYWxsKCk7CisJbG9jYWxfZmx1c2hfdGxiKCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKaW5kZXggMTAwYTMwYy4uMjllZjk5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCkBAIC01MSw3ICs1MSw3IEBACiBzdGF0aWMgY3B1bWFza190IHRpbWVyX2ludGVycnVwdF9icm9hZGNhc3RfaXBpX21hc2s7CiAKIC8qIFVzaW5nIEFQSUMgdG8gZ2VuZXJhdGUgc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdD8gKi8KLWludCB1c2luZ19hcGljX3RpbWVyID0gMDsKK2ludCB1c2luZ19hcGljX3RpbWVyIF9fcmVhZF9tb3N0bHkgPSAwOwogCiBzdGF0aWMgdm9pZCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODZfNjQva2VybmVsL2kzODcuYwppbmRleCBhNWQ3ZTE2Li40NGRkYjFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pMzg3LmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAotdW5zaWduZWQgaW50IG14Y3NyX2ZlYXR1cmVfbWFzayA9IDB4ZmZmZmZmZmY7Cit1bnNpZ25lZCBpbnQgbXhjc3JfZmVhdHVyZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSAweGZmZmZmZmZmOwogCiB2b2lkIG14Y3NyX2ZlYXR1cmVfbWFza19pbml0KHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCmluZGV4IDY1NWI5MTkuLmZkYjgyNjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9zZXR1cC5jCkBAIC00Nyw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIAogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTU5NSw2ICs1OTYsMTAwIEBACiAJCWViZGFfc2l6ZSA9IDY0KjEwMjQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORAorc3RhdGljIHZvaWQgX19pbml0IG1hcmtfbm9zYXZlX3BhZ2VfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJd2hpbGUgKHN0YXJ0IDw9IGVuZCkgeworCQlwYWdlID0gcGZuX3RvX3BhZ2Uoc3RhcnQpOworCQlTZXRQYWdlTm9zYXZlKHBhZ2UpOworCQlzdGFydCsrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGU4MjBfbm9zYXZlX3Jlc2VydmVkX3BhZ2VzKHZvaWQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyByX3N0YXJ0ID0gMCwgcl9lbmQgPSAwOworCisJLyogQXNzdW1lIGU4MjAgbWFwIGlzIHNvcnRlZCAqLworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwkJc3RhcnQgPSByb3VuZF9kb3duKGVpLT5hZGRyLCBQQUdFX1NJWkUpOworCQllbmQgPSByb3VuZF91cChlaS0+YWRkciArIGVpLT5zaXplLCBQQUdFX1NJWkUpOworCQlpZiAoc3RhcnQgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmIChlaS0+dHlwZSA9PSBFODIwX1JFU0VSVkVEKQorCQkJY29udGludWU7CisJCXJfZW5kID0gc3RhcnQ+PlBBR0VfU0hJRlQ7CisJCS8qIHN3c3VzcCBpZ25vcmVzIGludmFsaWQgcGZuLCBpZ25vcmUgdGhlc2UgcGFnZXMgaGVyZSAqLworCQlpZiAocl9lbmQgPiBlbmRfcGZuKQorCQkJcl9lbmQgPSBlbmRfcGZuOworCQlpZiAocl9lbmQgPiByX3N0YXJ0KQorCQkJbWFya19ub3NhdmVfcGFnZV9yYW5nZShyX3N0YXJ0LCByX2VuZC0xKTsKKwkJaWYgKHJfZW5kID49IGVuZF9wZm4pCisJCQlicmVhazsKKwkJcl9zdGFydCA9IGVuZD4+UEFHRV9TSElGVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBlODIwX3NhdmVfYWNwaV9wYWdlcyh2b2lkKQoreworCWludCBpOworCisJLyogQXNzdW1lIGU4MjAgbWFwIGlzIHNvcnRlZCAqLworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVpID0gJmU4MjAubWFwW2ldOworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwkJc3RhcnQgPSBlaS0+YWRkciwgUEFHRV9TSVpFOworCQllbmQgPSBlaS0+YWRkciArIGVpLT5zaXplOworCQlpZiAoc3RhcnQgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmIChlaS0+dHlwZSAhPSBFODIwX0FDUEkgJiYgZWktPnR5cGUgIT0gRTgyMF9OVlMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgdGhlIHJlZ2lvbiBpcyBiZWxvdyBlbmRfcGZuLCBpdCB3aWxsIGJlCisJCSAqIHNhdmVkL3Jlc3RvcmVkIGJ5IHN3c3VzcCBmb2xsb3cgJ1JBTScgdHlwZS4KKwkJICovCisJCWlmIChzdGFydCA8IChlbmRfcGZuIDw8IFBBR0VfU0hJRlQpKQorCQkJc3RhcnQgPSBlbmRfcGZuIDw8IFBBR0VfU0hJRlQ7CisJCWlmIChlbmQgPiBzdGFydCkKKwkJCXN3c3VzcF9hZGRfYXJjaF9wYWdlcyhzdGFydCwgZW5kKTsKKwl9Cit9CisKK2V4dGVybiBjaGFyIF9fc3RhcnRfcm9kYXRhLCBfX2VuZF9yb2RhdGE7CisvKgorICogQklPUyByZXNlcnZlZCByZWdpb24vaG9sZSAtIG5vIHNhdmUvcmVzdG9yZQorICogQUNQSSBOVlMgLSBzYXZlL3Jlc3RvcmUKKyAqIEFDUEkgRGF0YSAtIHRoaXMgaXMgYSBsaXR0bGUgdHJpY2t5LCB0aGUgbWVtIGNvdWxkIGJlIHVzZWQgYnkgT1MgYWZ0ZXIgT1MKKyAqIHJlYWRzIHRhYmxlcyBmcm9tIHRoZSByZWdpb24sIGJ1dCBhbnl3YXkgc2F2ZS9yZXN0b3JlIHRoZSBtZW1vcnkgaGFzbid0IGFueQorICogc2lkZSBlZmZlY3QgYW5kIExpbnV4IHJ1bnRpbWUgbW9kdWxlIGxvYWQvdW5sb2FkIG1pZ2h0IHVzZSBpdC4KKyAqIGtlcm5lbCByb2RhdGEgLSBubyBzYXZlL3Jlc3RvcmUgKGtlcm5lbCByb2RhdGEgaXNuJ3QgY2hhbmdlZCkKKyAqLworc3RhdGljIGludCBfX2luaXQgbWFya19ub3NhdmVfcGFnZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHBmbl9zdGFydCwgcGZuX2VuZDsKKworCS8qIEJJT1MgcmVzZXJ2ZWQgcmVnaW9ucyAmIGhvbGVzICovCisJZTgyMF9ub3NhdmVfcmVzZXJ2ZWRfcGFnZXMoKTsKKworCS8qIGtlcm5lbCByb2RhdGEgKi8KKwlwZm5fc3RhcnQgPSByb3VuZF91cChfX3BhX3N5bWJvbCgmX19zdGFydF9yb2RhdGEpLCBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CisJcGZuX2VuZCA9IHJvdW5kX2Rvd24oX19wYV9zeW1ib2woJl9fZW5kX3JvZGF0YSksIFBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKKwltYXJrX25vc2F2ZV9wYWdlX3JhbmdlKHBmbl9zdGFydCwgcGZuX2VuZC0xKTsKKworCS8qIHJlY29yZCBBQ1BJIERhdGEvTlZTIGFzIHNhdmVhYmxlICovCisJZTgyMF9zYXZlX2FjcGlfcGFnZXMoKTsKKworCXJldHVybiAwOworfQorY29yZV9pbml0Y2FsbChtYXJrX25vc2F2ZV9wYWdlcyk7CisjZW5kaWYKKwogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogewogCXVuc2lnbmVkIGxvbmcga2VybmVsX2VuZDsKQEAgLTcyOCw3ICs4MjMsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0tFWEVDCiAJaWYgKGNyYXNoa19yZXMuc3RhcnQgIT0gY3Jhc2hrX3Jlcy5lbmQpIHsKLQkJcmVzZXJ2ZV9ib290bWVtKGNyYXNoa19yZXMuc3RhcnQsCisJCXJlc2VydmVfYm9vdG1lbV9nZW5lcmljKGNyYXNoa19yZXMuc3RhcnQsCiAJCQljcmFzaGtfcmVzLmVuZCAtIGNyYXNoa19yZXMuc3RhcnQgKyAxKTsKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L21tL3NyYXQuYyBiL2FyY2gveDg2XzY0L21tL3NyYXQuYwppbmRleCA0NzRkZjIyLi41MDJmY2U2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9tbS9zcmF0LmMKKysrIGIvYXJjaC94ODZfNjQvbW0vc3JhdC5jCkBAIC0zMCw3ICszMCw2IEBACiBzdGF0aWMgc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqYWNwaV9zbGl0OwogCiBzdGF0aWMgbm9kZW1hc2tfdCBub2Rlc19wYXJzZWQgX19pbml0ZGF0YTsKLXN0YXRpYyBub2RlbWFza190IG5vZGVzX2ZvdW5kIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJvb3Rub2RlIG5vZGVzW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKIHN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgbm9kZXNfYWRkW01BWF9OVU1OT0RFU10gX19pbml0ZGF0YTsKIHN0YXRpYyBpbnQgZm91bmRfYWRkX2FyZWEgX19pbml0ZGF0YTsKQEAgLTM4LDMzICszNywxNCBAQAogI2lmbmRlZiBSRVNFUlZFX0hPVEFERAogI2RlZmluZSBob3RhZGRfcGVyY2VudCAwCS8qIElnbm9yZSBhbGwgc2V0dGluZ3MgKi8KICNlbmRpZgotc3RhdGljIHU4IHB4bTJub2RlWzI1Nl0gPSB7IFswIC4uLiAyNTVdID0gMHhmZiB9OwogCiAvKiBUb28gc21hbGwgbm9kZXMgY29uZnVzZSB0aGUgVk0gYmFkbHkuIFVzdWFsbHkgdGhleSByZXN1bHQKICAgIGZyb20gQklPUyBidWdzLiAqLwogI2RlZmluZSBOT0RFX01JTl9TSVpFICg0KjEwMjQqMTAyNCkKIAotc3RhdGljIGludCBub2RlX3RvX3B4bShpbnQgbik7Ci0KLWludCBweG1fdG9fbm9kZShpbnQgcHhtKQotewotCWlmICgodW5zaWduZWQpcHhtID49IDI1NikKLQkJcmV0dXJuIC0xOwotCS8qIEV4dGVuZCAweGZmIHRvIChpbnQpLTEgKi8KLQlyZXR1cm4gKHNpZ25lZCBjaGFyKXB4bTJub2RlW3B4bV07Ci19Ci0KIHN0YXRpYyBfX2luaXQgaW50IHNldHVwX25vZGUoaW50IHB4bSkKIHsKLQl1bnNpZ25lZCBub2RlID0gcHhtMm5vZGVbcHhtXTsKLQlpZiAobm9kZSA9PSAweGZmKSB7Ci0JCWlmIChub2Rlc193ZWlnaHQobm9kZXNfZm91bmQpID49IE1BWF9OVU1OT0RFUykKLQkJCXJldHVybiAtMTsKLQkJbm9kZSA9IGZpcnN0X3Vuc2V0X25vZGUobm9kZXNfZm91bmQpOyAKLQkJbm9kZV9zZXQobm9kZSwgbm9kZXNfZm91bmQpOwotCQlweG0ybm9kZVtweG1dID0gbm9kZTsKLQl9Ci0JcmV0dXJuIHB4bTJub2RlW3B4bV07CisJcmV0dXJuIGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bSk7CiB9CiAKIHN0YXRpYyBfX2luaXQgaW50IGNvbmZsaWN0aW5nX25vZGVzKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQpAQCAtNDQwLDE3ICs0MjAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG5vZGVfdG9fcHhtKGludCBuKQotewotICAgICAgIGludCBpOwotICAgICAgIGlmIChweG0ybm9kZVtuXSA9PSBuKQotICAgICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgICAgICAgICAgICAgaWYgKHB4bTJub2RlW2ldID09IG4pCi0gICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgIHJldHVybiAwOwotfQotCiB2b2lkIF9faW5pdCBzcmF0X3Jlc2VydmVfYWRkX2FyZWEoaW50IG5vZGVpZCkKIHsKIAlpZiAoZm91bmRfYWRkX2FyZWEgJiYgbm9kZXNfYWRkW25vZGVpZF0uZW5kKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9wY2kvbW1jb25maWcuYyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCmluZGV4IGEyMDYwZTQuLjNjNTVjNzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCisrKyBiL2FyY2gveDg2XzY0L3BjaS9tbWNvbmZpZy5jCkBAIC0xMyw3ICsxMywxMCBAQAogCiAjaW5jbHVkZSAicGNpLmgiCiAKLSNkZWZpbmUgTU1DT05GSUdfQVBFUl9TSVpFICgyNTYqMTAyNCoxMDI0KQorLyogYXBlcnR1cmUgaXMgdXAgdG8gMjU2TUIgYnV0IEJJT1MgbWF5IHJlc2VydmUgbGVzcyAqLworI2RlZmluZSBNTUNPTkZJR19BUEVSX01JTgkoMiAqIDEwMjQqMTAyNCkKKyNkZWZpbmUgTU1DT05GSUdfQVBFUl9NQVgJKDI1NiAqIDEwMjQqMTAyNCkKKwogLyogVmVyaWZ5IHRoZSBmaXJzdCAxNiBidXNzZXMuIFdlIGFzc3VtZSB0aGF0IHN5c3RlbXMgd2l0aCBtb3JlIGJ1c3NlcwogICAgZ2V0IE1DRkcgcmlnaHQuICovCiAjZGVmaW5lIE1BWF9DSEVDS19CVVMgMTYKQEAgLTE3NSw5ICsxNzgsMTAgQEAKIAkJcmV0dXJuOwogCiAJaWYgKCFlODIwX2FsbF9tYXBwZWQocGNpX21tY2ZnX2NvbmZpZ1swXS5iYXNlX2FkZHJlc3MsCi0JCQlwY2lfbW1jZmdfY29uZmlnWzBdLmJhc2VfYWRkcmVzcyArIE1NQ09ORklHX0FQRVJfU0laRSwKKwkJCXBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzICsgTU1DT05GSUdfQVBFUl9NSU4sCiAJCQlFODIwX1JFU0VSVkVEKSkgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSTogQklPUyBCdWc6IE1DRkcgYXJlYSBpcyBub3QgRTgyMC1yZXNlcnZlZFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiBCSU9TIEJ1ZzogTUNGRyBhcmVhIGF0ICV4IGlzIG5vdCBFODIwLXJlc2VydmVkXG4iLAorCQkJCXBjaV9tbWNmZ19jb25maWdbMF0uYmFzZV9hZGRyZXNzKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IE5vdCB1c2luZyBNTUNPTkZJRy5cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTkwLDcgKzE5NCw4IEBACiAJfQogCWZvciAoaSA9IDA7IGkgPCBwY2lfbW1jZmdfY29uZmlnX251bTsgKytpKSB7CiAJCXBjaV9tbWNmZ192aXJ0W2ldLmNmZyA9ICZwY2lfbW1jZmdfY29uZmlnW2ldOwotCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzLCBNTUNPTkZJR19BUEVSX1NJWkUpOworCQlwY2lfbW1jZmdfdmlydFtpXS52aXJ0ID0gaW9yZW1hcF9ub2NhY2hlKHBjaV9tbWNmZ19jb25maWdbaV0uYmFzZV9hZGRyZXNzLAorCQkJCQkJCSBNTUNPTkZJR19BUEVSX01BWCk7CiAJCWlmICghcGNpX21tY2ZnX3ZpcnRbaV0udmlydCkgewogCQkJcHJpbnRrKCJQQ0k6IENhbm5vdCBtYXAgbW1jb25maWcgYXBlcnR1cmUgZm9yIHNlZ21lbnQgJWRcbiIsCiAJCQkgICAgICAgcGNpX21tY2ZnX2NvbmZpZ1tpXS5wY2lfc2VnbWVudF9ncm91cF9udW1iZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2EvS2NvbmZpZyBiL2FyY2gveHRlbnNhL0tjb25maWcKaW5kZXggZGJlYjM1MC4uODQ4ZjE3MyAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvS2NvbmZpZworKysgYi9hcmNoL3h0ZW5zYS9LY29uZmlnCkBAIC0zNCwxMCArMzQsNiBAQAogCWJvb2wKIAlkZWZhdWx0IHkKIAotY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKLSAgICAgICBib29sCi0gICAgICAgZGVmYXVsdCB5Ci0KIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBtZW51ICJQcm9jZXNzb3IgdHlwZSBhbmQgZmVhdHVyZXMiCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9ib290L2xpYi9NYWtlZmlsZSBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL01ha2VmaWxlCmluZGV4IDllNzNiYjguLmQzZDJhYTIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2Jvb3QvbGliL01ha2VmaWxlCisrKyBiL2FyY2gveHRlbnNhL2Jvb3QvbGliL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3Igc29tZSBsaWJzIG5lZWRlZCBieSB6SW1hZ2UuCiAjCiAKLXpsaWIJOj0gaW5mYmxvY2suYyBpbmZjb2Rlcy5jIGluZmZhc3QuYyBpbmZsYXRlLmMgaW5mdHJlZXMuYyBpbmZ1dGlsLmMKK3psaWIJOj0gaW5mZmFzdC5jIGluZmxhdGUuYyBpbmZ0cmVlcy5jCiAKIGxpYi15CSs9ICQoemxpYjouYz0ubykgem1lbS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKaW5kZXggNWMwMThjNS4uODllNDA5ZSAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL2VudHJ5LlMKQEAgLTExMDIsNyArMTEwMiw3IEBACiAJczMyaQlhNywgYTIsIFBUX0FSRUc3CiAKIAltb3ZpCWE3LCA0CQkJIyBzaXplb2YodW5zaWduZWQgaW50KQotCXZlcmlmeV9hcmVhIGEzLCBhNywgYTAsIGEyLCAuTGVhYworCWFjY2Vzc19vayBhMCwgYTMsIGE3LCBhMiwgLkxlYWMKIAogCV9iZXFpCWE2LCBTWVNYVEVOU0FfQVRPTUlDX1NFVCwgLkxzZXQKIAlfYmVxaQlhNiwgU1lTWFRFTlNBX0FUT01JQ19FWEdfQURELCAuTGV4ZwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jCmluZGV4IGRlMTk1MDEuLmM2ZjQ3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMKQEAgLTM1MCwxNyArMzUwLDYgQEAKIH0KIAogLyoKLSAqIFNldCB2bV9mbGFncyBvZiBWTUEsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIGFyY2hpdGVjdHVyZSwgZm9yIGEgcGNpIGRldmljZQotICogbWFwcGluZy4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdm9pZAotX19wY2lfbW1hcF9zZXRfZmxhZ3Moc3RydWN0IHBjaV9kZXYgKmRldiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCi0JCSAgICAgZW51bSBwY2lfbW1hcF9zdGF0ZSBtbWFwX3N0YXRlKQotewotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU87Ci19Ci0KLS8qCiAgKiBTZXQgdm1fcGFnZV9wcm90IG9mIFZNQSwgYXMgYXBwcm9wcmlhdGUgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlLCBmb3IgYSBwY2kKICAqIGRldmljZSBtYXBwaW5nLgogICovCkBAIC0zOTksNyArMzg4LDYgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCV9fcGNpX21tYXBfc2V0X2ZsYWdzKGRldiwgdm1hLCBtbWFwX3N0YXRlKTsKIAlfX3BjaV9tbWFwX3NldF9wZ3Byb3QoZGV2LCB2bWEsIG1tYXBfc3RhdGUsIHdyaXRlX2NvbWJpbmUpOwogCiAJcmV0ID0gaW9fcmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9wZ29mZiwKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYwppbmRleCBlMjUyYjYxLi5jNDk0ZjA4IDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3NpZ25hbC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogCWlmIChhY3QpIHsKIAkJb2xkX3NpZ3NldF90IG1hc2s7Ci0JCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgYWN0LCBzaXplb2YoKmFjdCkpIHx8CisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBhY3QsIHNpemVvZigqYWN0KSkgfHwKIAkJICAgIF9fZ2V0X3VzZXIobmV3X2thLnNhLnNhX2hhbmRsZXIsICZhY3QtPnNhX2hhbmRsZXIpIHx8CiAJCSAgICBfX2dldF91c2VyKG5ld19rYS5zYS5zYV9yZXN0b3JlciwgJmFjdC0+c2FfcmVzdG9yZXIpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xMTYsNyArMTE2LDcgQEAKIAlyZXQgPSBkb19zaWdhY3Rpb24oc2lnLCBhY3QgPyAmbmV3X2thIDogTlVMTCwgb2FjdCA/ICZvbGRfa2EgOiBOVUxMKTsKIAogCWlmICghcmV0ICYmIG9hY3QpIHsKLQkJaWYgKHZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwgb2FjdCwgc2l6ZW9mKCpvYWN0KSkgfHwKKwkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBvYWN0LCBzaXplb2YoKm9hY3QpKSB8fAogCQkgICAgX19wdXRfdXNlcihvbGRfa2Euc2Euc2FfaGFuZGxlciwgJm9hY3QtPnNhX2hhbmRsZXIpIHx8CiAJCSAgICBfX3B1dF91c2VyKG9sZF9rYS5zYS5zYV9yZXN0b3JlciwgJm9hY3QtPnNhX3Jlc3RvcmVyKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIgKHJlZ3MtPmFyZWcsIHNjLT5zY19hcmVnLCBYQ0hBTF9OVU1fQVJFR1MqNCk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIoYnVmLCAmc2MtPnNjX2Nwc3RhdGUpOwogCWlmIChidWYpIHsKLQkJaWYgKHZlcmlmeV9hcmVhKFZFUklGWV9SRUFELCBidWYsIHNpemVvZigqYnVmKSkpCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWYsIHNpemVvZigqYnVmKSkpCiAJCQlnb3RvIGJhZGZyYW1lOwogCQllcnIgfD0gcmVzdG9yZV9jcGV4dHJhKGJ1Zik7CiAJfQpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJaWYgKHJlZ3MtPmRlcGMgPiA2NCkKIAkJcGFuaWMgKCJEb3VibGUgZXhjZXB0aW9uIHN5c19zaWdyZXR1cm5cbiIpOwogCi0JaWYgKHZlcmlmeV9hcmVhKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGJhZGZyYW1lOwogCiAJaWYgKF9fZ2V0X3VzZXIoc2V0LnNpZ1swXSwgJmZyYW1lLT5zYy5vbGRtYXNrKQpAQCAtMzk0LDcgKzM5NCw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmICh2ZXJpZnlfYXJlYShWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJZ290byBiYWRmcmFtZTsKIAogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQsICZmcmFtZS0+dWMudWNfc2lnbWFzaywgc2l6ZW9mKHNldCkpKQpAQCAtNDMzLDcgKzQzMyw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgKgogZ2V0X3NpZ2ZyYW1lKHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsIHVuc2lnbmVkIGxvbmcgc3AsIHNpemVfdCBmcmFtZV9zaXplKQogewotCWlmICgoa2EtPnNhLnNhX2ZsYWdzICYgU0FfT05TVEFDSykgIT0gMCAmJiAhIG9uX3NpZ19zdGFjayhzcCkpCisJaWYgKChrYS0+c2Euc2FfZmxhZ3MgJiBTQV9PTlNUQUNLKSAhPSAwICYmICEgc2FzX3NzX2ZsYWdzKHNwKSkKIAkJc3AgPSBjdXJyZW50LT5zYXNfc3Nfc3AgKyBjdXJyZW50LT5zYXNfc3Nfc2l6ZTsKIAogCXJldHVybiAodm9pZCAqKSgoc3AgLSBmcmFtZV9zaXplKSAmIC0xNnVsKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL0tjb25maWcuaW9zY2hlZCBiL2Jsb2NrL0tjb25maWcuaW9zY2hlZAppbmRleCBmM2I3NzUzLi40OGQwOTBlIDEwMDY0NAotLS0gYS9ibG9jay9LY29uZmlnLmlvc2NoZWQKKysrIGIvYmxvY2svS2NvbmZpZy5pb3NjaGVkCkBAIC00MCw3ICs0MCw3IEBACiAKIGNob2ljZQogCXByb21wdCAiRGVmYXVsdCBJL08gc2NoZWR1bGVyIgotCWRlZmF1bHQgREVGQVVMVF9BUworCWRlZmF1bHQgREVGQVVMVF9DRlEKIAloZWxwCiAJICBTZWxlY3QgdGhlIEkvTyBzY2hlZHVsZXIgd2hpY2ggd2lsbCBiZSB1c2VkIGJ5IGRlZmF1bHQgZm9yIGFsbAogCSAgYmxvY2sgZGV2aWNlcy4KZGlmZiAtLWdpdCBhL2Jsb2NrL2FzLWlvc2NoZWQuYyBiL2Jsb2NrL2FzLWlvc2NoZWQuYwppbmRleCAwYzc1MDM5Li4xZWM1ZGY0IDEwMDY0NAotLS0gYS9ibG9jay9hcy1pb3NjaGVkLmMKKysrIGIvYmxvY2svYXMtaW9zY2hlZC5jCkBAIC05Niw3ICs5Niw3IEBACiAKIAlzdHJ1Y3QgYXNfcnEgKm5leHRfYXJxWzJdOwkvKiBuZXh0IGluIHNvcnQgb3JkZXIgKi8KIAlzZWN0b3JfdCBsYXN0X3NlY3RvclsyXTsJLyogbGFzdCBSRVFfU1lOQyAmIFJFUV9BU1lOQyBzZWN0b3JzICovCi0Jc3RydWN0IGxpc3RfaGVhZCAqaGFzaDsJCS8qIHJlcXVlc3QgaGFzaCAqLworCXN0cnVjdCBobGlzdF9oZWFkICpoYXNoOwkvKiByZXF1ZXN0IGhhc2ggKi8KIAogCXVuc2lnbmVkIGxvbmcgZXhpdF9wcm9iOwkvKiBwcm9iYWJpbGl0eSBhIHRhc2sgd2lsbCBleGl0IHdoaWxlCiAJCQkJCSAgIGJlaW5nIHdhaXRlZCBvbiAqLwpAQCAtMTY1LDggKzE2NSw3IEBACiAJLyoKIAkgKiByZXF1ZXN0IGhhc2gsIGtleSBpcyB0aGUgZW5kaW5nIG9mZnNldCAoZm9yIGJhY2sgbWVyZ2UgbG9va3VwKQogCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgaGFzaDsKLQl1bnNpZ25lZCBpbnQgb25faGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoOwogCiAJLyoKIAkgKiBleHBpcmUgZmlmbwpAQCAtMjgyLDE3ICsyODEsMTUgQEAKICNkZWZpbmUgQVNfSEFTSF9GTihzZWMpCQkoaGFzaF9sb25nKEFTX0hBU0hfQkxPQ0soKHNlYykpLCBhc19oYXNoX3NoaWZ0KSkKICNkZWZpbmUgQVNfSEFTSF9FTlRSSUVTCQkoMSA8PCBhc19oYXNoX3NoaWZ0KQogI2RlZmluZSBycV9oYXNoX2tleShycSkJCSgocnEpLT5zZWN0b3IgKyAocnEpLT5ucl9zZWN0b3JzKQotI2RlZmluZSBsaXN0X2VudHJ5X2hhc2gocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgYXNfcnEsIGhhc2gpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2FzX2RlbF9hcnFfaGFzaChzdHJ1Y3QgYXNfcnEgKmFycSkKIHsKLQlhcnEtPm9uX2hhc2ggPSAwOwotCWxpc3RfZGVsX2luaXQoJmFycS0+aGFzaCk7CisJaGxpc3RfZGVsX2luaXQoJmFycS0+aGFzaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc19kZWxfYXJxX2hhc2goc3RydWN0IGFzX3JxICphcnEpCiB7Ci0JaWYgKGFycS0+b25faGFzaCkKKwlpZiAoIWhsaXN0X3VuaGFzaGVkKCZhcnEtPmhhc2gpKQogCQlfX2FzX2RlbF9hcnFfaGFzaChhcnEpOwogfQogCkBAIC0zMDAsMTAgKzI5Nyw5IEBACiB7CiAJc3RydWN0IHJlcXVlc3QgKnJxID0gYXJxLT5yZXF1ZXN0OwogCi0JQlVHX09OKGFycS0+b25faGFzaCk7CisJQlVHX09OKCFobGlzdF91bmhhc2hlZCgmYXJxLT5oYXNoKSk7CiAKLQlhcnEtPm9uX2hhc2ggPSAxOwotCWxpc3RfYWRkKCZhcnEtPmhhc2gsICZhZC0+aGFzaFtBU19IQVNIX0ZOKHJxX2hhc2hfa2V5KHJxKSldKTsKKwlobGlzdF9hZGRfaGVhZCgmYXJxLT5oYXNoLCAmYWQtPmhhc2hbQVNfSEFTSF9GTihycV9oYXNoX2tleShycSkpXSk7CiB9CiAKIC8qCkBAIC0zMTIsMzEgKzMwOCwyOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFzX2hvdF9hcnFfaGFzaChzdHJ1Y3QgYXNfZGF0YSAqYWQsIHN0cnVjdCBhc19ycSAqYXJxKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IGFycS0+cmVxdWVzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmFkLT5oYXNoW0FTX0hBU0hfRk4ocnFfaGFzaF9rZXkocnEpKV07CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmYWQtPmhhc2hbQVNfSEFTSF9GTihycV9oYXNoX2tleShycSkpXTsKIAotCWlmICghYXJxLT5vbl9oYXNoKSB7CisJaWYgKGhsaXN0X3VuaGFzaGVkKCZhcnEtPmhhc2gpKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXJxLT5oYXNoLnByZXYgIT0gaGVhZCkgewotCQlsaXN0X2RlbCgmYXJxLT5oYXNoKTsKLQkJbGlzdF9hZGQoJmFycS0+aGFzaCwgaGVhZCk7CisJaWYgKCZhcnEtPmhhc2ggIT0gaGVhZC0+Zmlyc3QpIHsKKwkJaGxpc3RfZGVsKCZhcnEtPmhhc2gpOworCQlobGlzdF9hZGRfaGVhZCgmYXJxLT5oYXNoLCBoZWFkKTsKIAl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqYXNfZmluZF9hcnFfaGFzaChzdHJ1Y3QgYXNfZGF0YSAqYWQsIHNlY3Rvcl90IG9mZnNldCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3QgPSAmYWQtPmhhc2hbQVNfSEFTSF9GTihvZmZzZXQpXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKm5leHQgPSBoYXNoX2xpc3QtPm5leHQ7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhhc2hfbGlzdCA9ICZhZC0+aGFzaFtBU19IQVNIX0ZOKG9mZnNldCldOworCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGFzX3JxICphcnE7CiAKLQl3aGlsZSAoKGVudHJ5ID0gbmV4dCkgIT0gaGFzaF9saXN0KSB7Ci0JCXN0cnVjdCBhc19ycSAqYXJxID0gbGlzdF9lbnRyeV9oYXNoKGVudHJ5KTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGFycSwgZW50cnksIG5leHQsIGhhc2hfbGlzdCwgaGFzaCkgewogCQlzdHJ1Y3QgcmVxdWVzdCAqX19ycSA9IGFycS0+cmVxdWVzdDsKIAotCQluZXh0ID0gZW50cnktPm5leHQ7Ci0KLQkJQlVHX09OKCFhcnEtPm9uX2hhc2gpOworCQlCVUdfT04oaGxpc3RfdW5oYXNoZWQoJmFycS0+aGFzaCkpOwogCiAJCWlmICghcnFfbWVyZ2VhYmxlKF9fcnEpKSB7CiAJCQlhc19kZWxfYXJxX2hhc2goYXJxKTsKQEAgLTM1Myw5ICszNDcsNiBAQAogLyoKICAqIHJiIHRyZWUgc3VwcG9ydCBmdW5jdGlvbnMKICAqLwotI2RlZmluZSBSQl9FTVBUWShyb290KQkoKHJvb3QpLT5yYl9ub2RlID09IE5VTEwpCi0jZGVmaW5lIE9OX1JCKG5vZGUpCShyYl9wYXJlbnQobm9kZSkgIT0gbm9kZSkKLSNkZWZpbmUgUkJfQ0xFQVIobm9kZSkJKHJiX3NldF9wYXJlbnQobm9kZSwgbm9kZSkpCiAjZGVmaW5lIHJiX2VudHJ5X2FycShub2RlKQlyYl9lbnRyeSgobm9kZSksIHN0cnVjdCBhc19ycSwgcmJfbm9kZSkKICNkZWZpbmUgQVJRX1JCX1JPT1QoYWQsIGFycSkJKCYoYWQpLT5zb3J0X2xpc3RbKGFycSktPmlzX3N5bmNdKQogI2RlZmluZSBycV9yYl9rZXkocnEpCQkocnEpLT5zZWN0b3IKQEAgLTQyNCwxMyArNDE1LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhc19kZWxfYXJxX3JiKHN0cnVjdCBhc19kYXRhICphZCwgc3RydWN0IGFzX3JxICphcnEpCiB7Ci0JaWYgKCFPTl9SQigmYXJxLT5yYl9ub2RlKSkgeworCWlmICghUkJfRU1QVFlfTk9ERSgmYXJxLT5yYl9ub2RlKSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm47CiAJfQogCiAJcmJfZXJhc2UoJmFycS0+cmJfbm9kZSwgQVJRX1JCX1JPT1QoYWQsIGFycSkpOwotCVJCX0NMRUFSKCZhcnEtPnJiX25vZGUpOworCVJCX0NMRUFSX05PREUoJmFycS0+cmJfbm9kZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcmVxdWVzdCAqCkBAIC01NTEsNyArNTQyLDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcmJwcmV2ID0gcmJfcHJldigmbGFzdC0+cmJfbm9kZSk7CiAJc3RydWN0IGFzX3JxICphcnFfbmV4dCwgKmFycV9wcmV2OwogCi0JQlVHX09OKCFPTl9SQigmbGFzdC0+cmJfbm9kZSkpOworCUJVR19PTighUkJfRU1QVFlfTk9ERSgmbGFzdC0+cmJfbm9kZSkpOwogCiAJaWYgKHJicHJldikKIAkJYXJxX3ByZXYgPSByYl9lbnRyeV9hcnEocmJwcmV2KTsKQEAgLTExMjgsNyArMTExOSw3IEBACiAJc3RydWN0IHJlcXVlc3QgKnJxID0gYXJxLT5yZXF1ZXN0OwogCWNvbnN0IGludCBkYXRhX2RpciA9IGFycS0+aXNfc3luYzsKIAotCUJVR19PTighT05fUkIoJmFycS0+cmJfbm9kZSkpOworCUJVR19PTighUkJfRU1QVFlfTk9ERSgmYXJxLT5yYl9ub2RlKSk7CiAKIAlhc19hbnRpY19zdG9wKGFkKTsKIAlhZC0+YW50aWNfc3RhdHVzID0gQU5USUNfT0ZGOwpAQCAtMTI1Myw3ICsxMjQ0LDcgQEAKIAkgKi8KIAogCWlmIChyZWFkcykgewotCQlCVUdfT04oUkJfRU1QVFkoJmFkLT5zb3J0X2xpc3RbUkVRX1NZTkNdKSk7CisJCUJVR19PTihSQl9FTVBUWV9ST09UKCZhZC0+c29ydF9saXN0W1JFUV9TWU5DXSkpOwogCiAJCWlmICh3cml0ZXMgJiYgYWQtPmJhdGNoX2RhdGFfZGlyID09IFJFUV9TWU5DKQogCQkJLyoKQEAgLTEyNzcsNyArMTI2OCw3IEBACiAKIAlpZiAod3JpdGVzKSB7CiBkaXNwYXRjaF93cml0ZXM6Ci0JCUJVR19PTihSQl9FTVBUWSgmYWQtPnNvcnRfbGlzdFtSRVFfQVNZTkNdKSk7CisJCUJVR19PTihSQl9FTVBUWV9ST09UKCZhZC0+c29ydF9saXN0W1JFUV9BU1lOQ10pKTsKIAogCQlpZiAoYWQtPmJhdGNoX2RhdGFfZGlyID09IFJFUV9TWU5DKSB7CiAJCQlhZC0+Y2hhbmdlZF9iYXRjaCA9IDE7CkBAIC0xMzQ1LDcgKzEzMzYsNyBAQAogCWFycS0+c3RhdGUgPSBBU19SUV9ORVc7CiAKIAlpZiAocnFfZGF0YV9kaXIoYXJxLT5yZXF1ZXN0KSA9PSBSRUFECi0JCQl8fCBjdXJyZW50LT5mbGFncyZQRl9TWU5DV1JJVEUpCisJCQl8fCAoYXJxLT5yZXF1ZXN0LT5mbGFncyAmIFJFUV9SV19TWU5DKSkKIAkJYXJxLT5pc19zeW5jID0gMTsKIAllbHNlCiAJCWFycS0+aXNfc3luYyA9IDA7CkBAIC0xNTk3LDEyICsxNTg4LDExIEBACiAKIAlpZiAoYXJxKSB7CiAJCW1lbXNldChhcnEsIDAsIHNpemVvZigqYXJxKSk7Ci0JCVJCX0NMRUFSKCZhcnEtPnJiX25vZGUpOworCQlSQl9DTEVBUl9OT0RFKCZhcnEtPnJiX25vZGUpOwogCQlhcnEtPnJlcXVlc3QgPSBycTsKIAkJYXJxLT5zdGF0ZSA9IEFTX1JRX1BSRVNDSEVEOwogCQlhcnEtPmlvX2NvbnRleHQgPSBOVUxMOwotCQlJTklUX0xJU1RfSEVBRCgmYXJxLT5oYXNoKTsKLQkJYXJxLT5vbl9oYXNoID0gMDsKKwkJSU5JVF9ITElTVF9OT0RFKCZhcnEtPmhhc2gpOwogCQlJTklUX0xJU1RfSEVBRCgmYXJxLT5maWZvKTsKIAkJcnEtPmVsZXZhdG9yX3ByaXZhdGUgPSBhcnE7CiAJCXJldHVybiAwOwpAQCAtMTY2Miw3ICsxNjUyLDcgQEAKIAogCWFkLT5xID0gcTsgLyogSWRlbnRpZnkgd2hhdCBxdWV1ZSB0aGUgZGF0YSBiZWxvbmdzIHRvICovCiAKLQlhZC0+aGFzaCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkqQVNfSEFTSF9FTlRSSUVTLAorCWFkLT5oYXNoID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkqQVNfSEFTSF9FTlRSSUVTLAogCQkJCUdGUF9LRVJORUwsIHEtPm5vZGUpOwogCWlmICghYWQtPmhhc2gpIHsKIAkJa2ZyZWUoYWQpOwpAQCAtMTY4NCw3ICsxNjc0LDcgQEAKIAlJTklUX1dPUksoJmFkLT5hbnRpY193b3JrLCBhc193b3JrX2hhbmRsZXIsIHEpOwogCiAJZm9yIChpID0gMDsgaSA8IEFTX0hBU0hfRU5UUklFUzsgaSsrKQotCQlJTklUX0xJU1RfSEVBRCgmYWQtPmhhc2hbaV0pOworCQlJTklUX0hMSVNUX0hFQUQoJmFkLT5oYXNoW2ldKTsKIAogCUlOSVRfTElTVF9IRUFEKCZhZC0+Zmlmb19saXN0W1JFUV9TWU5DXSk7CiAJSU5JVF9MSVNUX0hFQUQoJmFkLT5maWZvX2xpc3RbUkVRX0FTWU5DXSk7CmRpZmYgLS1naXQgYS9ibG9jay9jZnEtaW9zY2hlZC5jIGIvYmxvY2svY2ZxLWlvc2NoZWQuYwppbmRleCBlMmU2YWQwLi5lMjUyMjNlIDEwMDY0NAotLS0gYS9ibG9jay9jZnEtaW9zY2hlZC5jCisrKyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKQEAgLTI2LDcgKzI2LDcgQEAKIHN0YXRpYyBjb25zdCBpbnQgY2ZxX3NsaWNlX3N5bmMgPSBIWiAvIDEwOwogc3RhdGljIGludCBjZnFfc2xpY2VfYXN5bmMgPSBIWiAvIDI1Owogc3RhdGljIGNvbnN0IGludCBjZnFfc2xpY2VfYXN5bmNfcnEgPSAyOwotc3RhdGljIGludCBjZnFfc2xpY2VfaWRsZSA9IEhaIC8gNzA7CitzdGF0aWMgaW50IGNmcV9zbGljZV9pZGxlID0gSFogLyAxMjU7CiAKICNkZWZpbmUgQ0ZRX0lETEVfR1JBQ0UJCShIWiAvIDEwKQogI2RlZmluZSBDRlFfU0xJQ0VfU0NBTEUJCSg1KQpAQCAtNjAsMTEgKzYwLDYgQEAKIC8qCiAgKiByYi10cmVlIGRlZmluZXMKICAqLwotI2RlZmluZSBSQl9FTVBUWShub2RlKQkJKChub2RlKS0+cmJfbm9kZSA9PSBOVUxMKQotI2RlZmluZSBSQl9DTEVBUihub2RlKQkJZG8gewlcCi0JCW1lbXNldChub2RlLCAwLCBzaXplb2YoKm5vZGUpKTsgXAotfSB3aGlsZSAoMCkKLSNkZWZpbmUgUkJfQ0xFQVJfUk9PVChyb290KQkoKHJvb3QpLT5yYl9ub2RlID0gTlVMTCkKICNkZWZpbmUgcmJfZW50cnlfY3JxKG5vZGUpCXJiX2VudHJ5KChub2RlKSwgc3RydWN0IGNmcV9ycSwgcmJfbm9kZSkKICNkZWZpbmUgcnFfcmJfa2V5KHJxKQkJKHJxKS0+c2VjdG9yCiAKQEAgLTEyMyw4ICsxMTgsNiBAQAogCSAqLwogCXN0cnVjdCBobGlzdF9oZWFkICpjcnFfaGFzaDsKIAotCXVuc2lnbmVkIGludCBtYXhfcXVldWVkOwotCiAJbWVtcG9vbF90ICpjcnFfcG9vbDsKIAogCWludCBycV9pbl9kcml2ZXI7CkBAIC0yNzksOCArMjcyLDYgQEAKIHN0YXRpYyB2b2lkIGNmcV9kaXNwYXRjaF9pbnNlcnQocmVxdWVzdF9xdWV1ZV90ICosIHN0cnVjdCBjZnFfcnEgKik7CiBzdGF0aWMgc3RydWN0IGNmcV9xdWV1ZSAqY2ZxX2dldF9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHVuc2lnbmVkIGludCBrZXksIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBnZnBfdCBnZnBfbWFzayk7CiAKLSNkZWZpbmUgcHJvY2Vzc19zeW5jKHRzaykJKCh0c2spLT5mbGFncyAmIFBGX1NZTkNXUklURSkKLQogLyoKICAqIGxvdHMgb2YgZGVhZGxpbmUgaW9zY2hlZCBkdXBlcywgY2FuIGJlIGFic3RyYWN0ZWQgbGF0ZXIuLi4KICAqLwpAQCAtMzM2LDcgKzMyNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgcGlkX3QgY2ZxX3F1ZXVlX3BpZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBydykKIHsKLQlpZiAocncgPT0gUkVBRCB8fCBwcm9jZXNzX3N5bmModGFzaykpCisJaWYgKHJ3ID09IFJFQUQgfHwgcncgPT0gV1JJVEVfU1lOQykKIAkJcmV0dXJuIHRhc2stPnBpZDsKIAogCXJldHVybiBDRlFfS0VZX0FTWU5DOwpAQCAtNTYzLDcgKzU1NCw3IEBACiAKIAlyYl9lcmFzZSgmY3JxLT5yYl9ub2RlLCAmY2ZxcS0+c29ydF9saXN0KTsKIAotCWlmIChjZnFfY2ZxcV9vbl9ycihjZnFxKSAmJiBSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSkKKwlpZiAoY2ZxX2NmcXFfb25fcnIoY2ZxcSkgJiYgUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSkKIAkJY2ZxX2RlbF9jZnFxX3JyKGNmcWQsIGNmcXEpOwogfQogCkBAIC05MTAsMTMgKzkwMSwxNSBAQAogCXJldHVybiBjZnFxOwogfQogCisjZGVmaW5lIENJQ19TRUVLWShjaWMpICgoY2ljKS0+c2Vla19tZWFuID4gKDEyOCAqIDEwMjQpKQorCiBzdGF0aWMgaW50IGNmcV9hcm1fc2xpY2VfdGltZXIoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxKQogCiB7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CiAJdW5zaWduZWQgbG9uZyBzbDsKIAotCVdBUk5fT04oIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKTsKKwlXQVJOX09OKCFSQl9FTVBUWV9ST09UKCZjZnFxLT5zb3J0X2xpc3QpKTsKIAlXQVJOX09OKGNmcXEgIT0gY2ZxZC0+YWN0aXZlX3F1ZXVlKTsKIAogCS8qCkBAIC05NDMsNyArOTM2LDcgQEAKIAkgKiBmYWlyIGRpc3RyaWJ1dGlvbiBvZiBzbGljZSB0aW1lIGZvciBhIHByb2Nlc3MgZG9pbmcgYmFjay10by1iYWNrCiAJICogc2Vla3MuIHNvIGFsbG93IGEgbGl0dGxlIGJpdCBvZiB0aW1lIGZvciBoaW0gdG8gc3VibWl0IGEgbmV3IHJxCiAJICovCi0JaWYgKHNhbXBsZV92YWxpZChjaWMtPnNlZWtfc2FtcGxlcykgJiYgY2ljLT5zZWVrX21lYW4gPiAxMzEwNzIpCisJaWYgKHNhbXBsZV92YWxpZChjaWMtPnNlZWtfc2FtcGxlcykgJiYgQ0lDX1NFRUtZKGNpYykpCiAJCXNsID0gMjsKIAogCW1vZF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lciwgamlmZmllcyArIHNsKTsKQEAgLTk1NCwxMSArOTQ3LDE1IEBACiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IGNycS0+Y2ZxX3F1ZXVlOworCXN0cnVjdCByZXF1ZXN0ICpycTsKIAogCWNmcXEtPm5leHRfY3JxID0gY2ZxX2ZpbmRfbmV4dF9jcnEoY2ZxZCwgY2ZxcSwgY3JxKTsKIAljZnFfcmVtb3ZlX3JlcXVlc3QoY3JxLT5yZXF1ZXN0KTsKIAljZnFxLT5vbl9kaXNwYXRjaFtjZnFfY3JxX2lzX3N5bmMoY3JxKV0rKzsKIAllbHZfZGlzcGF0Y2hfc29ydChxLCBjcnEtPnJlcXVlc3QpOworCisJcnEgPSBsaXN0X2VudHJ5KHEtPnF1ZXVlX2hlYWQucHJldiwgc3RydWN0IHJlcXVlc3QsIHF1ZXVlbGlzdCk7CisJY2ZxZC0+bGFzdF9zZWN0b3IgPSBycS0+c2VjdG9yICsgcnEtPm5yX3NlY3RvcnM7CiB9CiAKIC8qCkBAIC0xMDQwLDEwICsxMDM3LDEyIEBACiAJICogaWYgcXVldWUgaGFzIHJlcXVlc3RzLCBkaXNwYXRjaCBvbmUuIGlmIG5vdCwgY2hlY2sgaWYKIAkgKiBlbm91Z2ggc2xpY2UgaXMgbGVmdCB0byB3YWl0IGZvciBvbmUKIAkgKi8KLQlpZiAoIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKQorCWlmICghUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSkKIAkJZ290byBrZWVwX3F1ZXVlOwotCWVsc2UgaWYgKGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkgJiYKLQkJIHRpbWVfYmVmb3JlKG5vdywgY2ZxcS0+c2xpY2VfZW5kKSkgeworCWVsc2UgaWYgKGNmcV9jZnFxX2Rpc3BhdGNoZWQoY2ZxcSkpIHsKKwkJY2ZxcSA9IE5VTEw7CisJCWdvdG8ga2VlcF9xdWV1ZTsKKwl9IGVsc2UgaWYgKGNmcV9jZnFxX2NsYXNzX3N5bmMoY2ZxcSkpIHsKIAkJaWYgKGNmcV9hcm1fc2xpY2VfdGltZXIoY2ZxZCwgY2ZxcSkpCiAJCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xMDYyLDcgKzEwNjEsNyBAQAogewogCWludCBkaXNwYXRjaGVkID0gMDsKIAotCUJVR19PTihSQl9FTVBUWSgmY2ZxcS0+c29ydF9saXN0KSk7CisJQlVHX09OKFJCX0VNUFRZX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCkpOwogCiAJZG8gewogCQlzdHJ1Y3QgY2ZxX3JxICpjcnE7CkBAIC0xMDg2LDE0ICsxMDg1LDEzIEBACiAJCQljZnFkLT5hY3RpdmVfY2ljID0gY3JxLT5pb19jb250ZXh0OwogCQl9CiAKLQkJaWYgKFJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKQorCQlpZiAoUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSkKIAkJCWJyZWFrOwogCiAJfSB3aGlsZSAoZGlzcGF0Y2hlZCA8IG1heF9kaXNwYXRjaCk7CiAKIAkvKgotCSAqIGlmIHNsaWNlIGVuZCBpc24ndCBzZXQgeWV0LCBzZXQgaXQuIGlmIGF0IGxlYXN0IG9uZSByZXF1ZXN0IHdhcwotCSAqIHN5bmMsIHVzZSB0aGUgc3luYyB0aW1lIHNsaWNlIHZhbHVlCisJICogaWYgc2xpY2UgZW5kIGlzbid0IHNldCB5ZXQsIHNldCBpdC4KIAkgKi8KIAlpZiAoIWNmcXEtPnNsaWNlX2VuZCkKIAkJY2ZxX3NldF9wcmlvX3NsaWNlKGNmcWQsIGNmcXEpOwpAQCAtMTEwNCw3ICsxMTAyLDggQEAKIAkgKi8KIAlpZiAoKCFjZnFfY2ZxcV9zeW5jKGNmcXEpICYmCiAJICAgIGNmcWQtPmRpc3BhdGNoX3NsaWNlID49IGNmcV9wcmlvX3RvX21heHJxKGNmcWQsIGNmcXEpKSB8fAotCSAgICBjZnFfY2xhc3NfaWRsZShjZnFxKSkKKwkgICAgY2ZxX2NsYXNzX2lkbGUoY2ZxcSkgfHwKKwkgICAgIWNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpKQogCQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwKTsKIAogCXJldHVybiBkaXNwYXRjaGVkOwpAQCAtMTExMywxMCArMTExMiwxMSBAQAogc3RhdGljIGludAogY2ZxX2ZvcmNlZF9kaXNwYXRjaF9jZnFxcyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewotCWludCBkaXNwYXRjaGVkID0gMDsKIAlzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLCAqbmV4dDsKIAlzdHJ1Y3QgY2ZxX3JxICpjcnE7CisJaW50IGRpc3BhdGNoZWQ7CiAKKwlkaXNwYXRjaGVkID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2ZxcSwgbmV4dCwgbGlzdCwgY2ZxX2xpc3QpIHsKIAkJd2hpbGUgKChjcnEgPSBjZnFxLT5uZXh0X2NycSkpIHsKIAkJCWNmcV9kaXNwYXRjaF9pbnNlcnQoY2ZxcS0+Y2ZxZC0+cXVldWUsIGNycSk7CkBAIC0xMTI0LDYgKzExMjQsNyBAQAogCQl9CiAJCUJVR19PTighbGlzdF9lbXB0eSgmY2ZxcS0+ZmlmbykpOwogCX0KKwogCXJldHVybiBkaXNwYXRjaGVkOwogfQogCkBAIC0xMTUwLDcgKzExNTEsOCBAQAogY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOwotCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7CisJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSwgKnByZXZfY2ZxcTsKKwlpbnQgZGlzcGF0Y2hlZDsKIAogCWlmICghY2ZxZC0+YnVzeV9xdWV1ZXMpCiAJCXJldHVybiAwOwpAQCAtMTE1OCwxMCArMTE2MCwxNyBAQAogCWlmICh1bmxpa2VseShmb3JjZSkpCiAJCXJldHVybiBjZnFfZm9yY2VkX2Rpc3BhdGNoKGNmcWQpOwogCi0JY2ZxcSA9IGNmcV9zZWxlY3RfcXVldWUoY2ZxZCk7Ci0JaWYgKGNmcXEpIHsKKwlkaXNwYXRjaGVkID0gMDsKKwlwcmV2X2NmcXEgPSBOVUxMOworCXdoaWxlICgoY2ZxcSA9IGNmcV9zZWxlY3RfcXVldWUoY2ZxZCkpICE9IE5VTEwpIHsKIAkJaW50IG1heF9kaXNwYXRjaDsKIAorCQkvKgorCQkgKiBEb24ndCByZXBlYXQgZGlzcGF0Y2ggZnJvbSB0aGUgcHJldmlvdXMgcXVldWUuCisJCSAqLworCQlpZiAocHJldl9jZnFxID09IGNmcXEpCisJCQlicmVhazsKKwogCQljZnFfY2xlYXJfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOwogCQljZnFfY2xlYXJfY2ZxcV93YWl0X3JlcXVlc3QoY2ZxcSk7CiAJCWRlbF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CkBAIC0xMTcwLDEwICsxMTc5LDE5IEBACiAJCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKIAkJCW1heF9kaXNwYXRjaCA9IDE7CiAKLQkJcmV0dXJuIF9fY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKGNmcWQsIGNmcXEsIG1heF9kaXNwYXRjaCk7CisJCWRpc3BhdGNoZWQgKz0gX19jZnFfZGlzcGF0Y2hfcmVxdWVzdHMoY2ZxZCwgY2ZxcSwgbWF4X2Rpc3BhdGNoKTsKKworCQkvKgorCQkgKiBJZiB0aGUgZGlzcGF0Y2ggY2ZxcSBoYXMgaWRsaW5nIGVuYWJsZWQgYW5kIGlzIHN0aWxsCisJCSAqIHRoZSBhY3RpdmUgcXVldWUsIGJyZWFrIG91dC4KKwkJICovCisJCWlmIChjZnFfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKSAmJiBjZnFkLT5hY3RpdmVfcXVldWUpCisJCQlicmVhazsKKworCQlwcmV2X2NmcXEgPSBjZnFxOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiBkaXNwYXRjaGVkOwogfQogCiAvKgpAQCAtMTM3OSwyNSArMTM5NywyOCBAQAogewogCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IGNpYy0+a2V5OwogCXN0cnVjdCBjZnFfcXVldWUgKmNmcXE7Ci0JaWYgKGNmcWQpIHsKLQkJc3Bpbl9sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKLQkJY2ZxcSA9IGNpYy0+Y2ZxcVtBU1lOQ107Ci0JCWlmIChjZnFxKSB7Ci0JCQlzdHJ1Y3QgY2ZxX3F1ZXVlICpuZXdfY2ZxcTsKLQkJCW5ld19jZnFxID0gY2ZxX2dldF9xdWV1ZShjZnFkLCBDRlFfS0VZX0FTWU5DLAotCQkJCQkJY2ljLT5pb2MtPnRhc2ssIEdGUF9BVE9NSUMpOwotCQkJaWYgKG5ld19jZnFxKSB7Ci0JCQkJY2ljLT5jZnFxW0FTWU5DXSA9IG5ld19jZnFxOwotCQkJCWNmcV9wdXRfcXVldWUoY2ZxcSk7Ci0JCQl9CisKKwlpZiAodW5saWtlbHkoIWNmcWQpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soY2ZxZC0+cXVldWUtPnF1ZXVlX2xvY2spOworCisJY2ZxcSA9IGNpYy0+Y2ZxcVtBU1lOQ107CisJaWYgKGNmcXEpIHsKKwkJc3RydWN0IGNmcV9xdWV1ZSAqbmV3X2NmcXE7CisJCW5ld19jZnFxID0gY2ZxX2dldF9xdWV1ZShjZnFkLCBDRlFfS0VZX0FTWU5DLCBjaWMtPmlvYy0+dGFzaywKKwkJCQkJIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X2NmcXEpIHsKKwkJCWNpYy0+Y2ZxcVtBU1lOQ10gPSBuZXdfY2ZxcTsKKwkJCWNmcV9wdXRfcXVldWUoY2ZxcSk7CiAJCX0KLQkJY2ZxcSA9IGNpYy0+Y2ZxcVtTWU5DXTsKLQkJaWYgKGNmcXEpIHsKLQkJCWNmcV9tYXJrX2NmcXFfcHJpb19jaGFuZ2VkKGNmcXEpOwotCQkJY2ZxX2luaXRfcHJpb19kYXRhKGNmcXEpOwotCQl9Ci0JCXNwaW5fdW5sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKIAl9CisKKwljZnFxID0gY2ljLT5jZnFxW1NZTkNdOworCWlmIChjZnFxKQorCQljZnFfbWFya19jZnFxX3ByaW9fY2hhbmdlZChjZnFxKTsKKworCXNwaW5fdW5sb2NrKGNmcWQtPnF1ZXVlLT5xdWV1ZV9sb2NrKTsKIH0KIAogLyoKQEAgLTE0NTQsNyArMTQ3NSw2IEBACiAKIAkJSU5JVF9ITElTVF9OT0RFKCZjZnFxLT5jZnFfaGFzaCk7CiAJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5jZnFfbGlzdCk7Ci0JCVJCX0NMRUFSX1JPT1QoJmNmcXEtPnNvcnRfbGlzdCk7CiAJCUlOSVRfTElTVF9IRUFEKCZjZnFxLT5maWZvKTsKIAogCQljZnFxLT5rZXkgPSBrZXk7CkBAIC0xNDY2LDggKzE0ODYsNyBAQAogCQkgKiBzZXQgLT5zbGljZV9sZWZ0IHRvIGFsbG93IHByZWVtcHRpb24gZm9yIGEgbmV3IHByb2Nlc3MKIAkJICovCiAJCWNmcXEtPnNsaWNlX2xlZnQgPSAyICogY2ZxZC0+Y2ZxX3NsaWNlX2lkbGU7Ci0JCWlmICghY2ZxZC0+aHdfdGFnKQotCQkJY2ZxX21hcmtfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKKwkJY2ZxX21hcmtfY2ZxcV9pZGxlX3dpbmRvdyhjZnFxKTsKIAkJY2ZxX21hcmtfY2ZxcV9wcmlvX2NoYW5nZWQoY2ZxcSk7CiAJCWNmcV9pbml0X3ByaW9fZGF0YShjZnFxKTsKIAl9CkBAIC0xNjU4LDcgKzE2NzcsOCBAQAogewogCWludCBlbmFibGVfaWRsZSA9IGNmcV9jZnFxX2lkbGVfd2luZG93KGNmcXEpOwogCi0JaWYgKCFjaWMtPmlvYy0+dGFzayB8fCAhY2ZxZC0+Y2ZxX3NsaWNlX2lkbGUgfHwgY2ZxZC0+aHdfdGFnKQorCWlmICghY2ljLT5pb2MtPnRhc2sgfHwgIWNmcWQtPmNmcV9zbGljZV9pZGxlIHx8CisJICAgIChjZnFkLT5od190YWcgJiYgQ0lDX1NFRUtZKGNpYykpKQogCQllbmFibGVfaWRsZSA9IDA7CiAJZWxzZSBpZiAoc2FtcGxlX3ZhbGlkKGNpYy0+dHRpbWVfc2FtcGxlcykpIHsKIAkJaWYgKGNpYy0+dHRpbWVfbWVhbiA+IGNmcWQtPmNmcV9zbGljZV9pZGxlKQpAQCAtMTY4OCw3ICsxNzA4LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWNmcXEpCi0JCXJldHVybiAxOworCQlyZXR1cm4gMDsKIAogCWlmIChjZnFfY2xhc3NfaWRsZShjZnFxKSkKIAkJcmV0dXJuIDE7CkBAIC0xNzIwLDcgKzE3NDAsNyBAQAogCQljZnFxLT5zbGljZV9sZWZ0ID0gY2ZxX3ByaW9fdG9fc2xpY2UoY2ZxZCwgY2ZxcSkgLyAyOwogCiAJY2ZxcS0+c2xpY2VfZW5kID0gY2ZxcS0+c2xpY2VfbGVmdCArIGppZmZpZXM7Ci0JX19jZnFfc2xpY2VfZXhwaXJlZChjZnFkLCBjZnFxLCAxKTsKKwljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAxKTsKIAlfX2NmcV9zZXRfYWN0aXZlX3F1ZXVlKGNmcWQsIGNmcXEpOwogfQogCkBAIC0xNzQ1LDExICsxNzY1LDcgQEAKIGNmcV9jcnFfZW5xdWV1ZWQoc3RydWN0IGNmcV9kYXRhICpjZnFkLCBzdHJ1Y3QgY2ZxX3F1ZXVlICpjZnFxLAogCQkgc3RydWN0IGNmcV9ycSAqY3JxKQogewotCXN0cnVjdCBjZnFfaW9fY29udGV4dCAqY2ljOwotCi0JY2ZxcS0+bmV4dF9jcnEgPSBjZnFfY2hvb3NlX3JlcShjZnFkLCBjZnFxLT5uZXh0X2NycSwgY3JxKTsKLQotCWNpYyA9IGNycS0+aW9fY29udGV4dDsKKwlzdHJ1Y3QgY2ZxX2lvX2NvbnRleHQgKmNpYyA9IGNycS0+aW9fY29udGV4dDsKIAogCS8qCiAJICogd2UgbmV2ZXIgd2FpdCBmb3IgYW4gYXN5bmMgcmVxdWVzdCBhbmQgd2UgZG9uJ3QgYWxsb3cgcHJlZW1wdGlvbgpAQCAtMTgzOSwxMSArMTg1NSwyMyBAQAogCQkJY2ZxcS0+c2VydmljZV9sYXN0ID0gbm93OwogCQkJY2ZxX3Jlc29ydF9ycl9saXN0KGNmcXEsIDApOwogCQl9Ci0JCWNmcV9zY2hlZHVsZV9kaXNwYXRjaChjZnFkKTsKIAl9CiAKLQlpZiAoY2ZxX2NycV9pc19zeW5jKGNycSkpCisJaWYgKHN5bmMpCiAJCWNycS0+aW9fY29udGV4dC0+bGFzdF9lbmRfcmVxdWVzdCA9IG5vdzsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgYWN0aXZlIHF1ZXVlLCBjaGVjayBpZiBpdCBuZWVkcyB0byBiZSBleHBpcmVkLAorCSAqIG9yIGlmIHdlIHdhbnQgdG8gaWRsZSBpbiBjYXNlIGl0IGhhcyBubyBwZW5kaW5nIHJlcXVlc3RzLgorCSAqLworCWlmIChjZnFkLT5hY3RpdmVfcXVldWUgPT0gY2ZxcSkgeworCQlpZiAodGltZV9hZnRlcihub3csIGNmcXEtPnNsaWNlX2VuZCkpCisJCQljZnFfc2xpY2VfZXhwaXJlZChjZnFkLCAwKTsKKwkJZWxzZSBpZiAoc3luYyAmJiBSQl9FTVBUWV9ST09UKCZjZnFxLT5zb3J0X2xpc3QpKSB7CisJCQlpZiAoIWNmcV9hcm1fc2xpY2VfdGltZXIoY2ZxZCwgY2ZxcSkpCisJCQkJY2ZxX3NjaGVkdWxlX2Rpc3BhdGNoKGNmcWQpOworCQl9CisJfQogfQogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKgpAQCAtMTkxMCw3ICsxOTM4LDYgQEAKIF9fY2ZxX21heV9xdWV1ZShzdHJ1Y3QgY2ZxX2RhdGEgKmNmcWQsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEsCiAJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHJ3KQogewotI2lmIDEKIAlpZiAoKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSB8fCBjZnFfY2ZxcV9tdXN0X2FsbG9jKGNmcXEpKSAmJgogCSAgICAhY2ZxX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKSkgewogCQljZnFfbWFya19jZnFxX211c3RfYWxsb2Nfc2xpY2UoY2ZxcSk7CkBAIC0xOTE4LDM5ICsxOTQ1LDYgQEAKIAl9CiAKIAlyZXR1cm4gRUxWX01RVUVVRV9NQVk7Ci0jZWxzZQotCWlmICghY2ZxcSB8fCB0YXNrLT5mbGFncyAmIFBGX01FTUFMTE9DKQotCQlyZXR1cm4gRUxWX01RVUVVRV9NQVk7Ci0JaWYgKCFjZnFxLT5hbGxvY2F0ZWRbcnddIHx8IGNmcV9jZnFxX211c3RfYWxsb2MoY2ZxcSkpIHsKLQkJaWYgKGNmcV9jZnFxX3dhaXRfcmVxdWVzdChjZnFxKSkKLQkJCXJldHVybiBFTFZfTVFVRVVFX01VU1Q7Ci0KLQkJLyoKLQkJICogb25seSBhbGxvdyAxIEVMVl9NUVVFVUVfTVVTVCBwZXIgc2xpY2UsIG90aGVyd2lzZSB3ZQotCQkgKiBjYW4gcXVpY2tseSBmbG9vZCB0aGUgcXVldWUgd2l0aCB3cml0ZXMgZnJvbSBhIHNpbmdsZSB0YXNrCi0JCSAqLwotCQlpZiAocncgPT0gUkVBRCB8fCAhY2ZxX2NmcXFfbXVzdF9hbGxvY19zbGljZShjZnFxKSkgewotCQkJY2ZxX21hcmtfY2ZxcV9tdXN0X2FsbG9jX3NsaWNlKGNmcXEpOwotCQkJcmV0dXJuIEVMVl9NUVVFVUVfTVVTVDsKLQkJfQotCi0JCXJldHVybiBFTFZfTVFVRVVFX01BWTsKLQl9Ci0JaWYgKGNmcV9jbGFzc19pZGxlKGNmcXEpKQotCQlyZXR1cm4gRUxWX01RVUVVRV9OTzsKLQlpZiAoY2ZxcS0+YWxsb2NhdGVkW3J3XSA+PSBjZnFkLT5tYXhfcXVldWVkKSB7Ci0JCXN0cnVjdCBpb19jb250ZXh0ICppb2MgPSBnZXRfaW9fY29udGV4dChHRlBfQVRPTUlDKTsKLQkJaW50IHJldCA9IEVMVl9NUVVFVUVfTk87Ci0KLQkJaWYgKGlvYyAmJiBpb2MtPm5yX2JhdGNoX3JlcXVlc3RzKQotCQkJcmV0ID0gRUxWX01RVUVVRV9NQVk7Ci0KLQkJcHV0X2lvX2NvbnRleHQoaW9jKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gRUxWX01RVUVVRV9NQVk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBjZnFfbWF5X3F1ZXVlKHJlcXVlc3RfcXVldWVfdCAqcSwgaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8pCkBAIC0xOTc5LDE2ICsxOTczLDEzIEBACiBzdGF0aWMgdm9pZCBjZnFfY2hlY2tfd2FpdGVycyhyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBjZnFfcXVldWUgKmNmcXEpCiB7CiAJc3RydWN0IGNmcV9kYXRhICpjZnFkID0gcS0+ZWxldmF0b3ItPmVsZXZhdG9yX2RhdGE7Ci0Jc3RydWN0IHJlcXVlc3RfbGlzdCAqcmwgPSAmcS0+cnE7CiAKLQlpZiAoY2ZxcS0+YWxsb2NhdGVkW1JFQURdIDw9IGNmcWQtPm1heF9xdWV1ZWQgfHwgY2ZxZC0+cnFfc3RhcnZlZCkgeworCWlmICh1bmxpa2VseShjZnFkLT5ycV9zdGFydmVkKSkgeworCQlzdHJ1Y3QgcmVxdWVzdF9saXN0ICpybCA9ICZxLT5ycTsKKwogCQlzbXBfbWIoKTsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJnJsLT53YWl0W1JFQURdKSkKIAkJCXdha2VfdXAoJnJsLT53YWl0W1JFQURdKTsKLQl9Ci0KLQlpZiAoY2ZxcS0+YWxsb2NhdGVkW1dSSVRFXSA8PSBjZnFkLT5tYXhfcXVldWVkIHx8IGNmcWQtPnJxX3N0YXJ2ZWQpIHsKLQkJc21wX21iKCk7CiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZybC0+d2FpdFtXUklURV0pKQogCQkJd2FrZV91cCgmcmwtPndhaXRbV1JJVEVdKTsKIAl9CkBAIC0yMDYyLDcgKzIwNTMsNyBAQAogCiAJY3JxID0gbWVtcG9vbF9hbGxvYyhjZnFkLT5jcnFfcG9vbCwgZ2ZwX21hc2spOwogCWlmIChjcnEpIHsKLQkJUkJfQ0xFQVIoJmNycS0+cmJfbm9kZSk7CisJCVJCX0NMRUFSX05PREUoJmNycS0+cmJfbm9kZSk7CiAJCWNycS0+cmJfa2V5ID0gMDsKIAkJY3JxLT5yZXF1ZXN0ID0gcnE7CiAJCUlOSVRfSExJU1RfTk9ERSgmY3JxLT5oYXNoKTsKQEAgLTIxNDgsMTYgKzIxMzksMTMgQEAKIAkJICogb25seSBleHBpcmUgYW5kIHJlaW52b2tlIHJlcXVlc3QgaGFuZGxlciwgaWYgdGhlcmUgYXJlCiAJCSAqIG90aGVyIHF1ZXVlcyB3aXRoIHBlbmRpbmcgcmVxdWVzdHMKIAkJICovCi0JCWlmICghY2ZxZC0+YnVzeV9xdWV1ZXMpIHsKLQkJCWNmcWQtPmlkbGVfc2xpY2VfdGltZXIuZXhwaXJlcyA9IG1pbihub3cgKyBjZnFkLT5jZnFfc2xpY2VfaWRsZSwgY2ZxcS0+c2xpY2VfZW5kKTsKLQkJCWFkZF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CisJCWlmICghY2ZxZC0+YnVzeV9xdWV1ZXMpCiAJCQlnb3RvIG91dF9jb250OwotCQl9CiAKIAkJLyoKIAkJICogbm90IGV4cGlyZWQgYW5kIGl0IGhhcyBhIHJlcXVlc3QgcGVuZGluZywgbGV0IGl0IGRpc3BhdGNoCiAJCSAqLwotCQlpZiAoIVJCX0VNUFRZKCZjZnFxLT5zb3J0X2xpc3QpKSB7CisJCWlmICghUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSkgewogCQkJY2ZxX21hcmtfY2ZxcV9tdXN0X2Rpc3BhdGNoKGNmcXEpOwogCQkJZ290byBvdXRfa2ljazsKIAkJfQpAQCAtMjI3OCw5ICsyMjY2LDYgQEAKIAogCWNmcWQtPnF1ZXVlID0gcTsKIAotCWNmcWQtPm1heF9xdWV1ZWQgPSBxLT5ucl9yZXF1ZXN0cyAvIDQ7Ci0JcS0+bnJfYmF0Y2hpbmcgPSBjZnFfcXVldWVkOwotCiAJaW5pdF90aW1lcigmY2ZxZC0+aWRsZV9zbGljZV90aW1lcik7CiAJY2ZxZC0+aWRsZV9zbGljZV90aW1lci5mdW5jdGlvbiA9IGNmcV9pZGxlX3NsaWNlX3RpbWVyOwogCWNmcWQtPmlkbGVfc2xpY2VfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjZnFkOwpkaWZmIC0tZ2l0IGEvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jIGIvYmxvY2svZGVhZGxpbmUtaW9zY2hlZC5jCmluZGV4IGM5NGRlOGUuLjQ0NjlkZDggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2RlYWRsaW5lLWlvc2NoZWQuYworKysgYi9ibG9jay9kZWFkbGluZS1pb3NjaGVkLmMKQEAgLTMwLDggKzMwLDcgQEAKICNkZWZpbmUgRExfSEFTSF9GTihzZWMpCQkoaGFzaF9sb25nKERMX0hBU0hfQkxPQ0soKHNlYykpLCBkZWFkbGluZV9oYXNoX3NoaWZ0KSkKICNkZWZpbmUgRExfSEFTSF9FTlRSSUVTCQkoMSA8PCBkZWFkbGluZV9oYXNoX3NoaWZ0KQogI2RlZmluZSBycV9oYXNoX2tleShycSkJCSgocnEpLT5zZWN0b3IgKyAocnEpLT5ucl9zZWN0b3JzKQotI2RlZmluZSBsaXN0X2VudHJ5X2hhc2gocHRyKQlsaXN0X2VudHJ5KChwdHIpLCBzdHJ1Y3QgZGVhZGxpbmVfcnEsIGhhc2gpCi0jZGVmaW5lIE9OX0hBU0goZHJxKQkJKGRycSktPm9uX2hhc2gKKyNkZWZpbmUgT05fSEFTSChkcnEpCQkoIWhsaXN0X3VuaGFzaGVkKCYoZHJxKS0+aGFzaCkpCiAKIHN0cnVjdCBkZWFkbGluZV9kYXRhIHsKIAkvKgpAQCAtNDgsNyArNDcsNyBAQAogCSAqIG5leHQgaW4gc29ydCBvcmRlci4gcmVhZCwgd3JpdGUgb3IgYm90aCBhcmUgTlVMTAogCSAqLwogCXN0cnVjdCBkZWFkbGluZV9ycSAqbmV4dF9kcnFbMl07Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaGFzaDsJCS8qIHJlcXVlc3QgaGFzaCAqLworCXN0cnVjdCBobGlzdF9oZWFkICpoYXNoOwkvKiByZXF1ZXN0IGhhc2ggKi8KIAl1bnNpZ25lZCBpbnQgYmF0Y2hpbmc7CQkvKiBudW1iZXIgb2Ygc2VxdWVudGlhbCByZXF1ZXN0cyBtYWRlICovCiAJc2VjdG9yX3QgbGFzdF9zZWN0b3I7CQkvKiBoZWFkIHBvc2l0aW9uICovCiAJdW5zaWduZWQgaW50IHN0YXJ2ZWQ7CQkvKiB0aW1lcyByZWFkcyBoYXZlIHN0YXJ2ZWQgd3JpdGVzICovCkBAIC03OSw4ICs3OCw3IEBACiAJLyoKIAkgKiByZXF1ZXN0IGhhc2gsIGtleSBpcyB0aGUgZW5kaW5nIG9mZnNldCAoZm9yIGJhY2sgbWVyZ2UgbG9va3VwKQogCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgaGFzaDsKLQljaGFyIG9uX2hhc2g7CisJc3RydWN0IGhsaXN0X25vZGUgaGFzaDsKIAogCS8qCiAJICogZXhwaXJlIGZpZm8KQEAgLTEwMCw4ICs5OCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2RlYWRsaW5lX2RlbF9kcnFfaGFzaChzdHJ1Y3QgZGVhZGxpbmVfcnEgKmRycSkKIHsKLQlkcnEtPm9uX2hhc2ggPSAwOwotCWxpc3RfZGVsX2luaXQoJmRycS0+aGFzaCk7CisJaGxpc3RfZGVsX2luaXQoJmRycS0+aGFzaCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWFkbGluZV9kZWxfZHJxX2hhc2goc3RydWN0IGRlYWRsaW5lX3JxICpkcnEpCkBAIC0xMTcsOCArMTE0LDcgQEAKIAogCUJVR19PTihPTl9IQVNIKGRycSkpOwogCi0JZHJxLT5vbl9oYXNoID0gMTsKLQlsaXN0X2FkZCgmZHJxLT5oYXNoLCAmZGQtPmhhc2hbRExfSEFTSF9GTihycV9oYXNoX2tleShycSkpXSk7CisJaGxpc3RfYWRkX2hlYWQoJmRycS0+aGFzaCwgJmRkLT5oYXNoW0RMX0hBU0hfRk4ocnFfaGFzaF9rZXkocnEpKV0pOwogfQogCiAvKgpAQCAtMTI4LDI2ICsxMjQsMjQgQEAKIGRlYWRsaW5lX2hvdF9kcnFfaGFzaChzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQsIHN0cnVjdCBkZWFkbGluZV9ycSAqZHJxKQogewogCXN0cnVjdCByZXF1ZXN0ICpycSA9IGRycS0+cmVxdWVzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmRkLT5oYXNoW0RMX0hBU0hfRk4ocnFfaGFzaF9rZXkocnEpKV07CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmZGQtPmhhc2hbRExfSEFTSF9GTihycV9oYXNoX2tleShycSkpXTsKIAotCWlmIChPTl9IQVNIKGRycSkgJiYgZHJxLT5oYXNoLnByZXYgIT0gaGVhZCkgewotCQlsaXN0X2RlbCgmZHJxLT5oYXNoKTsKLQkJbGlzdF9hZGQoJmRycS0+aGFzaCwgaGVhZCk7CisJaWYgKE9OX0hBU0goZHJxKSAmJiAmZHJxLT5oYXNoICE9IGhlYWQtPmZpcnN0KSB7CisJCWhsaXN0X2RlbCgmZHJxLT5oYXNoKTsKKwkJaGxpc3RfYWRkX2hlYWQoJmRycS0+aGFzaCwgaGVhZCk7CiAJfQogfQogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKgogZGVhZGxpbmVfZmluZF9kcnFfaGFzaChzdHJ1Y3QgZGVhZGxpbmVfZGF0YSAqZGQsIHNlY3Rvcl90IG9mZnNldCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3QgPSAmZGQtPmhhc2hbRExfSEFTSF9GTihvZmZzZXQpXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSwgKm5leHQgPSBoYXNoX2xpc3QtPm5leHQ7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhhc2hfbGlzdCA9ICZkZC0+aGFzaFtETF9IQVNIX0ZOKG9mZnNldCldOworCXN0cnVjdCBobGlzdF9ub2RlICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGRlYWRsaW5lX3JxICpkcnE7CiAKLQl3aGlsZSAoKGVudHJ5ID0gbmV4dCkgIT0gaGFzaF9saXN0KSB7Ci0JCXN0cnVjdCBkZWFkbGluZV9ycSAqZHJxID0gbGlzdF9lbnRyeV9oYXNoKGVudHJ5KTsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRycSwgZW50cnksIG5leHQsIGhhc2hfbGlzdCwgaGFzaCkgewogCQlzdHJ1Y3QgcmVxdWVzdCAqX19ycSA9IGRycS0+cmVxdWVzdDsKIAotCQluZXh0ID0gZW50cnktPm5leHQ7Ci0JCQogCQlCVUdfT04oIU9OX0hBU0goZHJxKSk7CiAKIAkJaWYgKCFycV9tZXJnZWFibGUoX19ycSkpIHsKQEAgLTE2NSw5ICsxNTksNiBAQAogLyoKICAqIHJiIHRyZWUgc3VwcG9ydCBmdW5jdGlvbnMKICAqLwotI2RlZmluZSBSQl9FTVBUWShyb290KQkoKHJvb3QpLT5yYl9ub2RlID09IE5VTEwpCi0jZGVmaW5lIE9OX1JCKG5vZGUpCShyYl9wYXJlbnQobm9kZSkgIT0gbm9kZSkKLSNkZWZpbmUgUkJfQ0xFQVIobm9kZSkJKHJiX3NldF9wYXJlbnQobm9kZSwgbm9kZSkpCiAjZGVmaW5lIHJiX2VudHJ5X2RycShub2RlKQlyYl9lbnRyeSgobm9kZSksIHN0cnVjdCBkZWFkbGluZV9ycSwgcmJfbm9kZSkKICNkZWZpbmUgRFJRX1JCX1JPT1QoZGQsIGRycSkJKCYoZGQpLT5zb3J0X2xpc3RbcnFfZGF0YV9kaXIoKGRycSktPnJlcXVlc3QpXSkKICNkZWZpbmUgcnFfcmJfa2V5KHJxKQkJKHJxKS0+c2VjdG9yCkBAIC0yMjYsOSArMjE3LDkgQEAKIAkJCWRkLT5uZXh0X2RycVtkYXRhX2Rpcl0gPSByYl9lbnRyeV9kcnEocmJuZXh0KTsKIAl9CiAKLQlCVUdfT04oIU9OX1JCKCZkcnEtPnJiX25vZGUpKTsKKwlCVUdfT04oIVJCX0VNUFRZX05PREUoJmRycS0+cmJfbm9kZSkpOwogCXJiX2VyYXNlKCZkcnEtPnJiX25vZGUsIERSUV9SQl9ST09UKGRkLCBkcnEpKTsKLQlSQl9DTEVBUigmZHJxLT5yYl9ub2RlKTsKKwlSQl9DTEVBUl9OT0RFKCZkcnEtPnJiX25vZGUpOwogfQogCiBzdGF0aWMgc3RydWN0IHJlcXVlc3QgKgpAQCAtNTAyLDcgKzQ5Myw3IEBACiAJICovCiAKIAlpZiAocmVhZHMpIHsKLQkJQlVHX09OKFJCX0VNUFRZKCZkZC0+c29ydF9saXN0W1JFQURdKSk7CisJCUJVR19PTihSQl9FTVBUWV9ST09UKCZkZC0+c29ydF9saXN0W1JFQURdKSk7CiAKIAkJaWYgKHdyaXRlcyAmJiAoZGQtPnN0YXJ2ZWQrKyA+PSBkZC0+d3JpdGVzX3N0YXJ2ZWQpKQogCQkJZ290byBkaXNwYXRjaF93cml0ZXM7CkBAIC01MTgsNyArNTA5LDcgQEAKIAogCWlmICh3cml0ZXMpIHsKIGRpc3BhdGNoX3dyaXRlczoKLQkJQlVHX09OKFJCX0VNUFRZKCZkZC0+c29ydF9saXN0W1dSSVRFXSkpOworCQlCVUdfT04oUkJfRU1QVFlfUk9PVCgmZGQtPnNvcnRfbGlzdFtXUklURV0pKTsKIAogCQlkZC0+c3RhcnZlZCA9IDA7CiAKQEAgLTYyNSw3ICs2MTYsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAltZW1zZXQoZGQsIDAsIHNpemVvZigqZGQpKTsKIAotCWRkLT5oYXNoID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSpETF9IQVNIX0VOVFJJRVMsCisJZGQtPmhhc2ggPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSpETF9IQVNIX0VOVFJJRVMsCiAJCQkJR0ZQX0tFUk5FTCwgcS0+bm9kZSk7CiAJaWYgKCFkZC0+aGFzaCkgewogCQlrZnJlZShkZCk7CkBAIC02NDEsNyArNjMyLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgRExfSEFTSF9FTlRSSUVTOyBpKyspCi0JCUlOSVRfTElTVF9IRUFEKCZkZC0+aGFzaFtpXSk7CisJCUlOSVRfSExJU1RfSEVBRCgmZGQtPmhhc2hbaV0pOwogCiAJSU5JVF9MSVNUX0hFQUQoJmRkLT5maWZvX2xpc3RbUkVBRF0pOwogCUlOSVRfTElTVF9IRUFEKCZkZC0+Zmlmb19saXN0W1dSSVRFXSk7CkBAIC02NzQsMTEgKzY2NSwxMCBAQAogCWRycSA9IG1lbXBvb2xfYWxsb2MoZGQtPmRycV9wb29sLCBnZnBfbWFzayk7CiAJaWYgKGRycSkgewogCQltZW1zZXQoZHJxLCAwLCBzaXplb2YoKmRycSkpOwotCQlSQl9DTEVBUigmZHJxLT5yYl9ub2RlKTsKKwkJUkJfQ0xFQVJfTk9ERSgmZHJxLT5yYl9ub2RlKTsKIAkJZHJxLT5yZXF1ZXN0ID0gcnE7CiAKLQkJSU5JVF9MSVNUX0hFQUQoJmRycS0+aGFzaCk7Ci0JCWRycS0+b25faGFzaCA9IDA7CisJCUlOSVRfSExJU1RfTk9ERSgmZHJxLT5oYXNoKTsKIAogCQlJTklUX0xJU1RfSEVBRCgmZHJxLT5maWZvKTsKIApkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggYTBhZmRkMy4uZDAwYjI4MyAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC04NTAsMTIgKzg1MCw5IEBACiAJICogb25lIGFnYWluIChhbG9uZyB3aXRoIHJlLWFkZGluZyB0aGUgc3lzZnMgZGlyKQogCSAqLwogCWVsZXZhdG9yX2V4aXQoZSk7Ci0JZSA9IE5VTEw7CiAJcS0+ZWxldmF0b3IgPSBvbGRfZWxldmF0b3I7CiAJZWx2X3JlZ2lzdGVyX3F1ZXVlKHEpOwogCWNsZWFyX2JpdChRVUVVRV9GTEFHX0VMVlNXSVRDSCwgJnEtPnF1ZXVlX2ZsYWdzKTsKLQlpZiAoZSkKLQkJa29iamVjdF9wdXQoJmUtPmtvYmopOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9ibG9jay9sbF9yd19ibGsuYyBiL2Jsb2NrL2xsX3J3X2Jsay5jCmluZGV4IDdlYjM2YzUuLjA2MDNhYjIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2xsX3J3X2Jsay5jCisrKyBiL2Jsb2NrL2xsX3J3X2Jsay5jCkBAIC02MzgsNyArNjM4LDcgQEAKIAkvKiBBc3N1bWUgYW55dGhpbmcgPD0gNEdCIGNhbiBiZSBoYW5kbGVkIGJ5IElPTU1VLgogCSAgIEFjdHVhbGx5IHNvbWUgSU9NTVVzIGNhbiBoYW5kbGUgZXZlcnl0aGluZywgYnV0IEkgZG9uJ3QKIAkgICBrbm93IG9mIGEgd2F5IHRvIHRlc3QgdGhpcyBoZXJlLiAqLwotCWlmIChib3VuY2VfcGZuIDwgKDB4ZmZmZmZmZmY+PlBBR0VfU0hJRlQpKQorCWlmIChib3VuY2VfcGZuIDwgKG1pbl90KHU2NCwweGZmZmZmZmZmLEJMS19CT1VOQ0VfSElHSCkgPj4gUEFHRV9TSElGVCkpCiAJCWRtYSA9IDE7CiAJcS0+Ym91bmNlX3BmbiA9IG1heF9sb3dfcGZuOwogI2Vsc2UKQEAgLTE2NjMsNiArMTY2Myw4IEBACiAgKiovCiB2b2lkIGJsa19zdGFydF9xdWV1ZShyZXF1ZXN0X3F1ZXVlX3QgKnEpCiB7CisJV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKKwogCWNsZWFyX2JpdChRVUVVRV9GTEFHX1NUT1BQRUQsICZxLT5xdWV1ZV9mbGFncyk7CiAKIAkvKgpAQCAtMTg3OCw3ICsxODgwLDggQEAKICAqICAgIGdldCBkZWFsdCB3aXRoIGV2ZW50dWFsbHkuCiAgKgogICogICAgVGhlIHF1ZXVlIHNwaW4gbG9jayBtdXN0IGJlIGhlbGQgd2hpbGUgbWFuaXB1bGF0aW5nIHRoZSByZXF1ZXN0cyBvbiB0aGUKLSAqICAgIHJlcXVlc3QgcXVldWUuCisgKiAgICByZXF1ZXN0IHF1ZXVlOyB0aGlzIGxvY2sgd2lsbCBiZSB0YWtlbiBhbHNvIGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHNvIGlycQorICogICAgZGlzYWJsaW5nIGlzIG5lZWRlZCBmb3IgaXQuCiAgKgogICogICAgRnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGluaXRpYWxpemVkIHJlcXVlc3QgcXVldWUsIG9yIE5VTEwgaWYKICAqICAgIGl0IGRpZG4ndCBzdWNjZWVkLgpAQCAtMjgyNCw2ICsyODI3LDkgQEAKIAlpZiAodW5saWtlbHkoYmlvX2JhcnJpZXIoYmlvKSkpCiAJCXJlcS0+ZmxhZ3MgfD0gKFJFUV9IQVJEQkFSUklFUiB8IFJFUV9OT01FUkdFKTsKIAorCWlmIChiaW9fc3luYyhiaW8pKQorCQlyZXEtPmZsYWdzIHw9IFJFUV9SV19TWU5DOworCiAJcmVxLT5lcnJvcnMgPSAwOwogCXJlcS0+aGFyZF9zZWN0b3IgPSByZXEtPnNlY3RvciA9IGJpby0+Ymlfc2VjdG9yOwogCXJlcS0+aGFyZF9ucl9zZWN0b3JzID0gcmVxLT5ucl9zZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKQEAgLTMzNTksMTIgKzMzNjUsMTEgQEAKICAqLwogc3RhdGljIHZvaWQgYmxrX2RvbmVfc29mdGlycShzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqY3B1X2xpc3Q7Ci0JTElTVF9IRUFEKGxvY2FsX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmNwdV9saXN0LCBsb2NhbF9saXN0OwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAljcHVfbGlzdCA9ICZfX2dldF9jcHVfdmFyKGJsa19jcHVfZG9uZSk7Ci0JbGlzdF9zcGxpY2VfaW5pdChjcHVfbGlzdCwgJmxvY2FsX2xpc3QpOworCWxpc3RfcmVwbGFjZV9pbml0KGNwdV9saXN0LCAmbG9jYWxfbGlzdCk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZsb2NhbF9saXN0KSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL0tjb25maWcgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwppbmRleCBjMjQ2NTJkLi45NGI4ZDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvS2NvbmZpZwpAQCAtMTAsOSArMTAsOCBAQAogY29uZmlnIEFDUEkKIAlib29sICJBQ1BJIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJQTY0IHx8IFg4NgorCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IFBNCi0Jc2VsZWN0IFBDSQotCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgQWR2YW5jZWQgQ29uZmlndXJhdGlvbiBhbmQgUG93ZXIgSW50ZXJmYWNlIChBQ1BJKSBzdXBwb3J0IGZvciAKQEAgLTE2Miw3ICsxNjEsNyBAQAogY29uZmlnIEFDUElfTlVNQQogCWJvb2wgIk5VTUEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE5VTUEKLQlkZXBlbmRzIG9uIChJQTY0IHx8IFg4Nl82NCkKKwlkZXBlbmRzIG9uIChYODYgfHwgSUE2NCkKIAlkZWZhdWx0IHkgaWYgSUE2NF9HRU5FUklDIHx8IElBNjRfU0dJX1NOMgogCiBjb25maWcgQUNQSV9BU1VTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKaW5kZXggZDg4MmJmOC4uZTBhOTViYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwpAQCAtNzQsNyArNzQsNyBAQAogCXVuc2lnbmVkIHNob3J0IGNhY2hpbmc7CS8qIG1lbW9yeSBjYWNoZSBhdHRyaWJ1dGUgKi8KIAl1bnNpZ25lZCBzaG9ydCB3cml0ZV9wcm90ZWN0OwkvKiBtZW1vcnkgcmVhZC93cml0ZSBhdHRyaWJ1dGUgKi8KIAl1NjQgc3RhcnRfYWRkcjsJCS8qIE1lbW9yeSBSYW5nZSBzdGFydCBwaHlzaWNhbCBhZGRyICovCi0JdTY0IGVuZF9hZGRyOwkJLyogTWVtb3J5IFJhbmdlIGVuZCBwaHlzaWNhbCBhZGRyICovCisJdTY0IGxlbmd0aDsJCS8qIE1lbW9yeSBSYW5nZSBsZW5ndGggKi8KIH07CiAKIHN0YXRpYyBpbnQKQEAgLTk3LDEyICs5NywxMSBAQAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQlpZiAoYWRkcmVzczY0LnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpIHsKIAkJCS8qIFBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmUgKi8KLQkJCW1lbV9kZXZpY2UtPmNhY2hpbmcgPQotCQkJICAgIGFkZHJlc3M2NC5pbmZvLm1lbS5jYWNoaW5nOworCQkJbWVtX2RldmljZS0+Y2FjaGluZyA9IGFkZHJlc3M2NC5pbmZvLm1lbS5jYWNoaW5nOwogCQkJbWVtX2RldmljZS0+d3JpdGVfcHJvdGVjdCA9CiAJCQkgICAgYWRkcmVzczY0LmluZm8ubWVtLndyaXRlX3Byb3RlY3Q7CiAJCQltZW1fZGV2aWNlLT5zdGFydF9hZGRyID0gYWRkcmVzczY0Lm1pbmltdW07Ci0JCQltZW1fZGV2aWNlLT5lbmRfYWRkciA9IGFkZHJlc3M2NC5tYXhpbXVtOworCQkJbWVtX2RldmljZS0+bGVuZ3RoID0gYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoOwogCQl9CiAJfQogCkBAIC0xOTksOCArMTk4LDcgQEAKIAkgKiBUZWxsIHRoZSBWTSB0aGVyZSBpcyBtb3JlIG1lbW9yeSBoZXJlLi4uCiAJICogTm90ZTogQXNzdW1lIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gb24gc3VjY2VzcwogCSAqLwotCXJlc3VsdCA9IGFkZF9tZW1vcnkobWVtX2RldmljZS0+c3RhcnRfYWRkciwKLQkJCSAgICAobWVtX2RldmljZS0+ZW5kX2FkZHIgLSBtZW1fZGV2aWNlLT5zdGFydF9hZGRyKSArIDEpOworCXJlc3VsdCA9IGFkZF9tZW1vcnkobWVtX2RldmljZS0+c3RhcnRfYWRkciwgbWVtX2RldmljZS0+bGVuZ3RoKTsKIAlpZiAocmVzdWx0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJcbmFkZF9tZW1vcnkgZmFpbGVkXG4iKSk7CiAJCW1lbV9kZXZpY2UtPnN0YXRlID0gTUVNT1JZX0lOVkFMSURfU1RBVEU7CkBAIC0yNDksNyArMjQ3LDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCXU2NCBzdGFydCA9IG1lbV9kZXZpY2UtPnN0YXJ0X2FkZHI7Ci0JdTY0IGxlbiA9IG1lbV9kZXZpY2UtPmVuZF9hZGRyIC0gc3RhcnQgKyAxOworCXU2NCBsZW4gPSBtZW1fZGV2aWNlLT5sZW5ndGg7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX21lbW9yeV9kaXNhYmxlX2RldmljZSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKaW5kZXggZjRjODc3NS4uODM5ZjQyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYwpAQCAtODE3LDcgKzgxNyw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKTsKIAogc3RhdGljIGludAotX19pbml0IGFzdXNfcHJvY19hZGQoY2hhciAqbmFtZSwgcHJvY193cml0ZWZ1bmMgKiB3cml0ZWZ1bmMsCithc3VzX3Byb2NfYWRkKGNoYXIgKm5hbWUsIHByb2Nfd3JpdGVmdW5jICogd3JpdGVmdW5jLAogCQkgICAgIHByb2NfcmVhZGZ1bmMgKiByZWFkZnVuYywgbW9kZV90IG1vZGUsCiAJCSAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CkBAIC04MzYsNyArODM2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYXN1c19ob3RrX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgYXN1c19ob3RrX2FkZF9mcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CiAJbW9kZV90IG1vZGU7CkBAIC05NTQsNyArOTU0LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBob3RrIHdpdGggcmlnaHQgdmFsdWVzLiBJbiB0aGlzCiAgKiBtZXRob2QsIHdlIGNhbiBtYWtlIGFsbCB0aGUgZGV0ZWN0aW9uIHdlIHdhbnQsIGFuZCBtb2RpZnkgdGhlIGhvdGsgc3RydWN0CiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IGFzdXNfaG90a19nZXRfaW5mbyh2b2lkKQorc3RhdGljIGludCBhc3VzX2hvdGtfZ2V0X2luZm8odm9pZCkKIHsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwogCXN0cnVjdCBhY3BpX2J1ZmZlciBkc2R0ID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTCB9OwpAQCAtOTcwLDcgKzk3MCw3IEBACiAJICogSElEKSwgdGhpcyBiaXQgd2lsbCBiZSBtb3ZlZC4gQSBnbG9iYWwgdmFyaWFibGUgYXN1c19pbmZvIGNvbnRhaW5zCiAJICogdGhlIERTRFQgaGVhZGVyLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfRFNEVCwgMSwgJmRzZHQpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfSURfRFNEVCwgMSwgJmRzZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiICBDb3VsZG4ndCBnZXQgdGhlIERTRFQgdGFibGUgaGVhZGVyXG4iKTsKIAllbHNlCkBAIC0xMTAxLDcgKzExMDEsNyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYXN1c19ob3RrX2NoZWNrKHZvaWQpCitzdGF0aWMgaW50IGFzdXNfaG90a19jaGVjayh2b2lkKQogewogCWludCByZXN1bHQgPSAwOwogCkBAIC0xMTE5LDcgKzExMTksOSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFzdXNfaG90a19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgaW50IGFzdXNfaG90a19mb3VuZDsKKworc3RhdGljIGludCBhc3VzX2hvdGtfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCWludCByZXN1bHQ7CkBAIC0xMTgwLDYgKzExODIsOCBAQAogCQl9CiAJfQogCisJYXN1c19ob3RrX2ZvdW5kID0gMTsKKwogICAgICAgZW5kOgogCWlmIChyZXN1bHQpIHsKIAkJa2ZyZWUoaG90ayk7CkBAIC0xMjI2LDEyICsxMjMwLDI0IEBACiAJYXN1c19wcm9jX2Rpci0+b3duZXIgPSBUSElTX01PRFVMRTsKIAogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA8IDEpIHsKLQkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFzdXNfaG90a19kcml2ZXIpOworCWlmIChyZXN1bHQgPCAwKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCS8qCisJICogVGhpcyBpcyBhIGJpdCBvZiBhIGtsdWRnZS4gIFdlIG9ubHkgd2FudCB0aGlzIG1vZHVsZSBsb2FkZWQKKwkgKiBmb3IgQVNVUyBzeXN0ZW1zLCBidXQgdGhlcmUncyBjdXJyZW50bHkgbm8gd2F5IHRvIHByb2JlIHRoZQorCSAqIEFDUEkgbmFtZXNwYWNlIGZvciBBU1VTIEhJRHMuICBTbyB3ZSBqdXN0IHJldHVybiBmYWlsdXJlIGlmCisJICogd2UgZGlkbid0IGZpbmQgb25lLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBtb2R1bGUgdG8gYmUKKwkgKiB1bmxvYWRlZC4KKwkgKi8KKwlpZiAoIWFzdXNfaG90a19mb3VuZCkgeworCQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KFBST0NfQVNVUywgYWNwaV9yb290X2Rpcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXMuYyBiL2RyaXZlcnMvYWNwaS9idXMuYwppbmRleCA2MDZmODczLi5kZDM5ODNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnVzLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1cy5jCkBAIC00Myw3ICs0Myw3IEBACiBleHRlcm4gdm9pZCBfX2luaXQgYWNwaV9waWNfc2NpX3NldF90cmlnZ2VyKHVuc2lnbmVkIGludCBpcnEsIHUxNiB0cmlnZ2VyKTsKICNlbmRpZgogCi1GQURUX0RFU0NSSVBUT1IgYWNwaV9mYWR0Oworc3RydWN0IGZhZHRfZGVzY3JpcHRvciBhY3BpX2ZhZHQ7CiBFWFBPUlRfU1lNQk9MKGFjcGlfZmFkdCk7CiAKIHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9yb290OwpAQCAtMjA1LDEyICsyMDUsMTQgQEAKIAkgKiBHZXQgZGV2aWNlJ3MgY3VycmVudCBwb3dlciBzdGF0ZSBpZiBpdCdzIHVua25vd24KIAkgKiBUaGlzIG1lYW5zIGRldmljZSBwb3dlciBzdGF0ZSBpc24ndCBpbml0aWFsaXplZCBvciBwcmV2aW91cyBzZXR0aW5nIGZhaWxlZAogCSAqLwotCWlmIChkZXZpY2UtPnBvd2VyLnN0YXRlID09IEFDUElfU1RBVEVfVU5LTk9XTikKLQkJYWNwaV9idXNfZ2V0X3Bvd2VyKGRldmljZS0+aGFuZGxlLCAmZGV2aWNlLT5wb3dlci5zdGF0ZSk7Ci0JaWYgKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIGlzIGFscmVhZHkgYXQgRCVkXG4iLAotCQkJCSAgc3RhdGUpKTsKLQkJcmV0dXJuX1ZBTFVFKDApOworCWlmICghZGV2aWNlLT5mbGFncy5mb3JjZV9wb3dlcl9zdGF0ZSkgeworCQlpZiAoZGV2aWNlLT5wb3dlci5zdGF0ZSA9PSBBQ1BJX1NUQVRFX1VOS05PV04pCisJCQlhY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsICZkZXZpY2UtPnBvd2VyLnN0YXRlKTsKKwkJaWYgKHN0YXRlID09IGRldmljZS0+cG93ZXIuc3RhdGUpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBpcyBhbHJlYWR5IGF0IEQlZFxuIiwKKwkJCQkJICBzdGF0ZSkpOworCQkJcmV0dXJuX1ZBTFVFKDApOworCQl9CiAJfQogCWlmICghZGV2aWNlLT5wb3dlci5zdGF0ZXNbc3RhdGVdLmZsYWdzLnZhbGlkKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfV0FSTiwgIkRldmljZSBkb2VzIG5vdCBzdXBwb3J0IEQlZFxuIiwKQEAgLTU5Niw2ICs1OTgsOCBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm5fVk9JRDsKIAorCXByaW50ayhLRVJOX0lORk8gUFJFRklYICJDb3JlIHJldmlzaW9uICUwOHhcbiIsIEFDUElfQ0FfVkVSU0lPTik7CisKIAkvKiBlbmFibGUgd29ya2Fyb3VuZHMsIHVubGVzcyBzdHJpY3QgQUNQSSBzcGVjLiBjb21wbGlhbmNlICovCiAJaWYgKCFhY3BpX3N0cmljdCkKIAkJYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrID0gVFJVRTsKQEAgLTYxNyw3ICs2MjEsNyBAQAogCS8qCiAJICogR2V0IGEgc2VwYXJhdGUgY29weSBvZiB0aGUgRkFEVCBmb3IgdXNlIGJ5IG90aGVyIGRyaXZlcnMuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9nZXRfdGFibGUoQUNQSV9UQUJMRV9GQURULCAxLCAmYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1RBQkxFX0lEX0ZBRFQsIDEsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJVbmFibGUgdG8gZ2V0IHRoZSBGQURUXG4iKTsKIAkJZ290byBlcnJvcjA7CkBAIC03NDMsOCArNzQ3LDYgQEAKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5pdCIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIlN1YnN5c3RlbSByZXZpc2lvbiAlMDh4XG4iLCBBQ1BJX0NBX1ZFUlNJT04pOwotCiAJaWYgKGFjcGlfZGlzYWJsZWQpIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkludGVycHJldGVyIGRpc2FibGVkLlxuIik7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzZmllbGQuYwppbmRleCA3NmJjMDQ2Li5hNmQ3N2VmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc2ZpZWxkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNmaWVsZC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX2Rlc2MgPSBOVUxMOwogCXUzMiBmbGFnczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2NyZWF0ZV9idWZmZXJfZmllbGQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV9idWZmZXJfZmllbGQpOwogCiAJLyogR2V0IHRoZSBuYW1lX3N0cmluZyBhcmd1bWVudCAqLwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9pbnRlZ2VyIHBvc2l0aW9uOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9maWVsZF9uYW1lcyIsIGluZm8pOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9maWVsZF9uYW1lcywgaW5mbyk7CiAKIAkvKiBGaXJzdCBmaWVsZCBzdGFydHMgYXQgYml0IHplcm8gKi8KIApAQCAtMzQyLDcgKzM0Miw3IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKIAlzdHJ1Y3QgYWNwaV9jcmVhdGVfZmllbGRfaW5mbyBpbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9maWVsZCIsIG9wKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfZmllbGQsIG9wKTsKIAogCS8qIEZpcnN0IGFyZyBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9wX3JlZ2lvbiAobXVzdCBhbHJlYWR5IGV4aXN0KSAqLwogCkBAIC0zOTksNyArMzk5LDcgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAl1OCB0eXBlID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19pbml0X2ZpZWxkX29iamVjdHMiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfaW5pdF9maWVsZF9vYmplY3RzLCBvcCk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewogCWNhc2UgQU1MX0ZJRUxEX09QOgpAQCAtNDI1LDYgKzQyNSw3IEBACiAJICogV2FsayB0aGUgbGlzdCBvZiBlbnRyaWVzIGluIHRoZSBmaWVsZF9saXN0CiAJICovCiAJd2hpbGUgKGFyZykgeworCiAJCS8qIElnbm9yZSBPRkZTRVQgYW5kIEFDQ0VTU0FTIHRlcm1zIGhlcmUgKi8KIAogCQlpZiAoYXJnLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVERklFTERfT1ApIHsKQEAgLTQ4MSw3ICs0ODIsNyBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CiAJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfYmFua19maWVsZCIsIG9wKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfYmFua19maWVsZCwgb3ApOwogCiAJLyogRmlyc3QgYXJnIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb3BfcmVnaW9uIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKQEAgLTU1NCw3ICs1NTUsNyBAQAogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICphcmc7CiAJc3RydWN0IGFjcGlfY3JlYXRlX2ZpZWxkX2luZm8gaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfaW5kZXhfZmllbGQiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY3JlYXRlX2luZGV4X2ZpZWxkLCBvcCk7CiAKIAkvKiBGaXJzdCBhcmcgaXMgdGhlIG5hbWUgb2YgdGhlIEluZGV4IHJlZ2lzdGVyIChtdXN0IGFscmVhZHkgZXhpc3QpICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzaW5pdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKaW5kZXggZTY1YTA3YS4uYmJkZjk5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNpbml0LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogV2FsayB0aGUgbmFtZXNwYWNlIHN0YXJ0aW5nIGF0ICJzdGFydF9ub2RlIiBhbmQgcGVyZm9ybSBhbnkKKyAqIERFU0NSSVBUSU9OOiBXYWxrIHRoZSBuYW1lc3BhY2Ugc3RhcnRpbmcgYXQgIlN0YXJ0Tm9kZSIgYW5kIHBlcmZvcm0gYW55CiAgKiAgICAgICAgICAgICAgbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIG9uIHRoZSBvYmplY3RzIGZvdW5kIHRoZXJlaW4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX2luaXRfd2Fsa19pbmZvIGluZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19pbml0aWFsaXplX29iamVjdHMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRpYWxpemVfb2JqZWN0cyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAogCQkJICAiKioqKiBTdGFydGluZyBpbml0aWFsaXphdGlvbiBvZiBuYW1lc3BhY2Ugb2JqZWN0cyAqKioqXG4iKSk7CkBAIC0yMTMsNyArMjEzLDcgQEAKIAlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9BTlksIHN0YXJ0X25vZGUsIEFDUElfVUlOVDMyX01BWCwKIAkJCQkgICAgIGFjcGlfZHNfaW5pdF9vbmVfb2JqZWN0LCAmaW5mbywgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgd2Fsa19uYW1lc3BhY2UiKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgV2Fsa05hbWVzcGFjZSIpKTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKaW5kZXggYzQ3NTU0Ni4uYmM5YWNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCkBAIC04MSw2ICs4MSw3IEBACiAJLyogSW52b2tlIHRoZSBnbG9iYWwgZXhjZXB0aW9uIGhhbmRsZXIgKi8KIAogCWlmIChhY3BpX2dibF9leGNlcHRpb25faGFuZGxlcikgeworCiAJCS8qIEV4aXQgdGhlIGludGVycHJldGVyLCBhbGxvdyBoYW5kbGVyIHRvIGV4ZWN1dGUgbWV0aG9kcyAqLwogCiAJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwpAQCAtMTAwLDYgKzEwMSw3IEBACiAJfQogI2lmZGVmIEFDUElfRElTQVNTRU1CTEVSCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJLyogRGlzcGxheSBtZXRob2QgbG9jYWxzL2FyZ3MgaWYgZGlzYXNzZW1ibGVyIGlzIHByZXNlbnQgKi8KIAogCQlhY3BpX2RtX2R1bXBfbWV0aG9kX2luZm8oc3RhdHVzLCB3YWxrX3N0YXRlLCB3YWxrX3N0YXRlLT5vcCk7CkBAIC0xMzIsNyArMTM0LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19iZWdpbl9tZXRob2RfZXhlY3V0aW9uIiwgbWV0aG9kX25vZGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2JlZ2luX21ldGhvZF9leGVjdXRpb24sIG1ldGhvZF9ub2RlKTsKIAogCWlmICghbWV0aG9kX25vZGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwpAQCAtMTY4LDExICsxNzAsMTQgQEAKIAogCQkvKgogCQkgKiBHZXQgYSB1bml0IGZyb20gdGhlIG1ldGhvZCBzZW1hcGhvcmUuIFRoaXMgcmVsZWFzZXMgdGhlCi0JCSAqIGludGVycHJldGVyIGlmIHdlIGJsb2NrCisJCSAqIGludGVycHJldGVyIGlmIHdlIGJsb2NrICh0aGVuIHJlYWNxdWlyZXMgaXQpCiAJCSAqLwogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9leF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUob2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUsCiAJCQkJCQkgIEFDUElfV0FJVF9GT1JFVkVSKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQogCX0KIAogCS8qCkBAIC0xODMsNyArMTg4LDcgQEAKIAlpZiAoIW9ial9kZXNjLT5tZXRob2Qub3duZXJfaWQpIHsKIAkJc3RhdHVzID0gYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZCgmb2JqX2Rlc2MtPm1ldGhvZC5vd25lcl9pZCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAl9CiAKQEAgLTE5Myw2ICsxOTgsMTQgQEAKIAkgKi8KIAlvYmpfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudCsrOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisgICAgICBjbGVhbnVwOgorCS8qIE9uIGVycm9yLCBtdXN0IHNpZ25hbCB0aGUgbWV0aG9kIHNlbWFwaG9yZSBpZiBwcmVzZW50ICovCisKKwlpZiAob2JqX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpIHsKKwkJKHZvaWQpYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKG9ial9kZXNjLT5tZXRob2Quc2VtYXBob3JlLCAxKTsKKwl9CisJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTgsMTAgKzIzMSwxMCBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpuZXh0X3dhbGtfc3RhdGUgPSBOVUxMOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKIAl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jYWxsX2NvbnRyb2xfbWV0aG9kIiwgdGhpc193YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jYWxsX2NvbnRyb2xfbWV0aG9kLCB0aGlzX3dhbGtfc3RhdGUpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKIAkJCSAgIkV4ZWN1dGUgbWV0aG9kICVwLCBjdXJyZW50c3RhdGU9JXBcbiIsCkBAIC0yNDAsMjUgKzI1MywzMSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTlVMTF9PQkpFQ1QpOwogCX0KIAotCS8qIEluaXQgZm9yIG5ldyBtZXRob2QsIHdhaXQgb24gY29uY3VycmVuY3kgc2VtYXBob3JlICovCisJLyogSW5pdCBmb3IgbmV3IG1ldGhvZCwgcG9zc2libHkgd2FpdCBvbiBjb25jdXJyZW5jeSBzZW1hcGhvcmUgKi8KIAogCXN0YXR1cyA9IGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihtZXRob2Rfbm9kZSwgb2JqX2Rlc2MsCiAJCQkJCQl0aGlzX3dhbGtfc3RhdGUtPm1ldGhvZF9ub2RlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKKwkvKgorCSAqIDEpIFBhcnNlIHRoZSBtZXRob2QuIEFsbCAibm9ybWFsIiBtZXRob2RzIGFyZSBwYXJzZWQgZm9yIGVhY2ggZXhlY3V0aW9uLgorCSAqIEludGVybmFsIG1ldGhvZHMgKF9PU0ksIGV0Yy4pIGRvIG5vdCByZXF1aXJlIHBhcnNpbmcuCisJICovCiAJaWYgKCEob2JqX2Rlc2MtPm1ldGhvZC5tZXRob2RfZmxhZ3MgJiBBTUxfTUVUSE9EX0lOVEVSTkFMX09OTFkpKSB7Ci0JCS8qIDEpIFBhcnNlOiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSBmb3IgdGhlIHByZWVtcHRpbmcgd2FsayAqLworCisJCS8qIENyZWF0ZSBhIG5ldyB3YWxrIHN0YXRlIGZvciB0aGUgcGFyc2UgKi8KIAogCQluZXh0X3dhbGtfc3RhdGUgPQogCQkgICAgYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLCBvcCwKIAkJCQkJICAgICAgb2JqX2Rlc2MsIE5VTEwpOwogCQlpZiAoIW5leHRfd2Fsa19zdGF0ZSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KKwkJLyogQ3JlYXRlIGFuZCBpbml0IGEgcGFyc2UgdHJlZSByb290ICovCiAKIAkJb3AgPSBhY3BpX3BzX2NyZWF0ZV9zY29wZV9vcCgpOwogCQlpZiAoIW9wKSB7CkBAIC0yNzEsMTcgKzI5MCwyMCBAQAogCQkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLAogCQkJCQkgICAgICAgTlVMTCwgMSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJYWNwaV9kc19kZWxldGVfd2Fsa19zdGF0ZShuZXh0X3dhbGtfc3RhdGUpOworCQkJYWNwaV9wc19kZWxldGVfcGFyc2VfdHJlZShvcCk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAotCQkvKiBCZWdpbiBBTUwgcGFyc2UgKi8KKwkJLyogQmVnaW4gQU1MIHBhcnNlIChkZWxldGVzIG5leHRfd2Fsa19zdGF0ZSkgKi8KIAogCQlzdGF0dXMgPSBhY3BpX3BzX3BhcnNlX2FtbChuZXh0X3dhbGtfc3RhdGUpOwogCQlhY3BpX3BzX2RlbGV0ZV9wYXJzZV90cmVlKG9wKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlnb3RvIGNsZWFudXA7CisJCX0KIAl9CiAKLQkvKiAyKSBFeGVjdXRlOiBDcmVhdGUgYSBuZXcgc3RhdGUgZm9yIHRoZSBwcmVlbXB0aW5nIHdhbGsgKi8KKwkvKiAyKSBCZWdpbiBtZXRob2QgZXhlY3V0aW9uLiBDcmVhdGUgYSBuZXcgd2FsayBzdGF0ZSAqLwogCiAJbmV4dF93YWxrX3N0YXRlID0gYWNwaV9kc19jcmVhdGVfd2Fsa19zdGF0ZShvYmpfZGVzYy0+bWV0aG9kLm93bmVyX2lkLAogCQkJCQkJICAgIE5VTEwsIG9ial9kZXNjLCB0aHJlYWQpOwpAQCAtMjg5LDYgKzMxMSw3IEBACiAJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJZ290byBjbGVhbnVwOwogCX0KKwogCS8qCiAJICogVGhlIHJlc29sdmVkIGFyZ3VtZW50cyB3ZXJlIHB1dCBvbiB0aGUgcHJldmlvdXMgd2FsayBzdGF0ZSdzIG9wZXJhbmQKIAkgKiBzdGFjay4gT3BlcmFuZHMgb24gdGhlIHByZXZpb3VzIHdhbGsgc3RhdGUgc3RhY2sgYWx3YXlzCkBAIC0yOTYsMTIgKzMxOSwyNCBAQAogCSAqLwogCXRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbdGhpc193YWxrX3N0YXRlLT5udW1fb3BlcmFuZHNdID0gTlVMTDsKIAotCWluZm8ucGFyYW1ldGVycyA9ICZ0aGlzX3dhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwotCWluZm8ucGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jaworCSAqIFRCRDogdGhpcyBpcyBzb21ld2hhdCBpbmVmZmljaWVudCwgc2hvdWxkIGNoYW5nZSBpbnRlcmZhY2UgdG8KKwkgKiBkc19pbml0X2FtbF93YWxrLiBGb3Igbm93LCBrZWVwcyB0aGlzIHN0cnVjdCBvZmYgdGhlIENQVSBzdGFjaworCSAqLworCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOworCWlmICghaW5mbykgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwl9CisKKwlpbmZvLT5wYXJhbWV0ZXJzID0gJnRoaXNfd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CisJaW5mby0+cGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CiAKIAlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsobmV4dF93YWxrX3N0YXRlLCBOVUxMLCBtZXRob2Rfbm9kZSwKIAkJCQkgICAgICAgb2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQsCi0JCQkJICAgICAgIG9ial9kZXNjLT5tZXRob2QuYW1sX2xlbmd0aCwgJmluZm8sIDMpOworCQkJCSAgICAgICBvYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGgsIGluZm8sIDMpOworCisJQUNQSV9GUkVFKGluZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMzIzLDYgKzM1OCw4IEBACiAJCQkgICJTdGFydGluZyBuZXN0ZWQgZXhlY3V0aW9uLCBuZXdzdGF0ZT0lcFxuIiwKIAkJCSAgbmV4dF93YWxrX3N0YXRlKSk7CiAKKwkvKiBJbnZva2UgYW4gaW50ZXJuYWwgbWV0aG9kIGlmIG5lY2Vzc2FyeSAqLworCiAJaWYgKG9ial9kZXNjLT5tZXRob2QubWV0aG9kX2ZsYWdzICYgQU1MX01FVEhPRF9JTlRFUk5BTF9PTkxZKSB7CiAJCXN0YXR1cyA9IG9ial9kZXNjLT5tZXRob2QuaW1wbGVtZW50YXRpb24obmV4dF93YWxrX3N0YXRlKTsKIAl9CkBAIC0zMzAsMTYgKzM2NywxNCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCiAgICAgICBjbGVhbnVwOgotCS8qIERlY3JlbWVudCB0aGUgdGhyZWFkIGNvdW50IG9uIHRoZSBtZXRob2QgcGFyc2UgdHJlZSAqLwogCi0JaWYgKG5leHRfd2Fsa19zdGF0ZSAmJiAobmV4dF93YWxrX3N0YXRlLT5tZXRob2RfZGVzYykpIHsKLQkJbmV4dF93YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLnRocmVhZF9jb3VudC0tOworCS8qIE9uIGVycm9yLCB3ZSBtdXN0IHRlcm1pbmF0ZSB0aGUgbWV0aG9kIHByb3Blcmx5ICovCisKKwlhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChvYmpfZGVzYywgbmV4dF93YWxrX3N0YXRlKTsKKwlpZiAobmV4dF93YWxrX3N0YXRlKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUobmV4dF93YWxrX3N0YXRlKTsKIAl9CiAKLQkvKiBPbiBlcnJvciwgd2UgbXVzdCBkZWxldGUgdGhlIG5ldyB3YWxrIHN0YXRlICovCi0KLQlhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChuZXh0X3dhbGtfc3RhdGUpOwotCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUobmV4dF93YWxrX3N0YXRlKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtMzYyLDI1ICszOTcsMzMgQEAKIAkJCSAgICAgICB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJaW50IHNhbWVfYXNfaW1wbGljaXRfcmV0dXJuOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX3Jlc3RhcnRfY29udHJvbF9tZXRob2QiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19yZXN0YXJ0X2NvbnRyb2xfbWV0aG9kLCB3YWxrX3N0YXRlKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkgICIqKioqUmVzdGFydCBbJTQuNHNdIE9wICVwIHJldHVybl92YWx1ZV9mcm9tX2NhbGxlZSAlcFxuIiwKKwkJCSAgIioqKipSZXN0YXJ0IFslNC40c10gT3AgJXAgUmV0dXJuVmFsdWVGcm9tQ2FsbGVlICVwXG4iLAogCQkJICAoY2hhciAqKSZ3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZS0+bmFtZSwKIAkJCSAgd2Fsa19zdGF0ZS0+bWV0aG9kX2NhbGxfb3AsIHJldHVybl9kZXNjKSk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILAotCQkJICAiICAgIHJldHVybl9mcm9tX3RoaXNfbWV0aG9kX3VzZWQ/PSVYIHJlc19zdGFjayAlcCBXYWxrICVwXG4iLAorCQkJICAiICAgIFJldHVybkZyb21UaGlzTWV0aG9kVXNlZD89JVggUmVzU3RhY2sgJXAgV2FsayAlcFxuIiwKIAkJCSAgd2Fsa19zdGF0ZS0+cmV0dXJuX3VzZWQsCiAJCQkgIHdhbGtfc3RhdGUtPnJlc3VsdHMsIHdhbGtfc3RhdGUpKTsKIAogCS8qIERpZCB0aGUgY2FsbGVkIG1ldGhvZCByZXR1cm4gYSB2YWx1ZT8gKi8KIAogCWlmIChyZXR1cm5fZGVzYykgeworCisJCS8qIElzIHRoZSBpbXBsaWNpdCByZXR1cm4gb2JqZWN0IHRoZSBzYW1lIGFzIHRoZSByZXR1cm4gZGVzYz8gKi8KKworCQlzYW1lX2FzX2ltcGxpY2l0X3JldHVybiA9CisJCSAgICAod2Fsa19zdGF0ZS0+aW1wbGljaXRfcmV0dXJuX29iaiA9PSByZXR1cm5fZGVzYyk7CisKIAkJLyogQXJlIHdlIGFjdHVhbGx5IGdvaW5nIHRvIHVzZSB0aGUgcmV0dXJuIHZhbHVlPyAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5yZXR1cm5fdXNlZCkgeworCiAJCQkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgcHJldmlvdXMgbWV0aG9kICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfcmVzdWx0X3B1c2gocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUpOwpAQCAtMzk3LDE4ICs0NDAsMjMgQEAKIAkJfQogCiAJCS8qCi0JCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB0aGUKLQkJICogb3B0aW9uYWwgc3VwcG9ydCBmb3IgYSBzby1jYWxsZWQgImltcGxpY2l0IHJldHVybiIuIFNvbWUgQU1MIGNvZGUKLQkJICogYXNzdW1lcyB0aGF0IHRoZSBsYXN0IHZhbHVlIG9mIHRoZSBtZXRob2QgaXMgImltcGxpY2l0bHkiIHJldHVybmVkCi0JCSAqIHRvIHRoZSBjYWxsZXIuIEp1c3Qgc2F2ZSB0aGUgbGFzdCByZXN1bHQgYXMgdGhlIHJldHVybiB2YWx1ZS4KKwkJICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIHRoZSBvcHRpb25hbCBzdXBwb3J0IGZvciB0aGUgc28tY2FsbGVkCisJCSAqICJpbXBsaWNpdCByZXR1cm4iLiBTb21lIEFNTCBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgbGFzdCB2YWx1ZSBvZiB0aGUKKwkJICogbWV0aG9kIGlzICJpbXBsaWNpdGx5IiByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBpbiB0aGUgYWJzZW5jZSBvZiBhbgorCQkgKiBleHBsaWNpdCByZXR1cm4gdmFsdWUuCisJCSAqCisJCSAqIEp1c3Qgc2F2ZSB0aGUgbGFzdCByZXN1bHQgb2YgdGhlIG1ldGhvZCBhcyB0aGUgcmV0dXJuIHZhbHVlLgorCQkgKgogCQkgKiBOT1RFOiB0aGlzIGlzIG9wdGlvbmFsIGJlY2F1c2UgdGhlIEFTTCBsYW5ndWFnZSBkb2VzIG5vdCBhY3R1YWxseQogCQkgKiBzdXBwb3J0IHRoaXMgYmVoYXZpb3IuCiAJCSAqLwogCQllbHNlIGlmICghYWNwaV9kc19kb19pbXBsaWNpdF9yZXR1cm4KLQkJCSAocmV0dXJuX2Rlc2MsIHdhbGtfc3RhdGUsIEZBTFNFKSkgeworCQkJIChyZXR1cm5fZGVzYywgd2Fsa19zdGF0ZSwgRkFMU0UpCisJCQkgfHwgc2FtZV9hc19pbXBsaWNpdF9yZXR1cm4pIHsKIAkJCS8qCiAJCQkgKiBEZWxldGUgdGhlIHJldHVybiB2YWx1ZSBpZiBpdCB3aWxsIG5vdCBiZSB1c2VkIGJ5IHRoZQotCQkJICogY2FsbGluZyBtZXRob2QKKwkJCSAqIGNhbGxpbmcgbWV0aG9kIG9yIHJlbW92ZSBvbmUgcmVmZXJlbmNlIGlmIHRoZSBleHBsaWNpdCByZXR1cm4KKwkJCSAqIGlzIHRoZSBzYW1lIGFzIHRoZSBpbXBsaWNpdCByZXR1cm4gdmFsdWUuCiAJCQkgKi8KIAkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShyZXR1cm5fZGVzYyk7CiAJCX0KQEAgLTQyMSw3ICs0NjksOCBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZAogICoKLSAqIFBBUkFNRVRFUlM6ICB3YWxrX3N0YXRlICAgICAgICAgIC0gU3RhdGUgb2YgdGhlIG1ldGhvZAorICogUEFSQU1FVEVSUzogIG1ldGhvZF9kZXNjICAgICAgICAgLSBNZXRob2Qgb2JqZWN0CisgKiAgICAgICAgICAgICAgd2Fsa19zdGF0ZSAgICAgICAgICAtIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0aG9kCiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKICAqCkBAIC00MzEsOTUgKzQ4MCwxMDAgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCit2b2lkCithY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYywKKwkJCQkgc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCIsIHdhbGtfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZCwgd2Fsa19zdGF0ZSk7CiAKLQlpZiAoIXdhbGtfc3RhdGUpIHsKKwkvKiBtZXRob2RfZGVzYyBpcyByZXF1aXJlZCwgd2Fsa19zdGF0ZSBpcyBvcHRpb25hbCAqLworCisJaWYgKCFtZXRob2RfZGVzYykgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKLQkvKiBUaGUgY3VycmVudCBtZXRob2Qgb2JqZWN0IHdhcyBzYXZlZCBpbiB0aGUgd2FsayBzdGF0ZSAqLworCWlmICh3YWxrX3N0YXRlKSB7CiAKLQlvYmpfZGVzYyA9IHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjOwotCWlmICghb2JqX2Rlc2MpIHsKLQkJcmV0dXJuX1ZPSUQ7CisJCS8qIERlbGV0ZSBhbGwgYXJndW1lbnRzIGFuZCBsb2NhbHMgKi8KKworCQlhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV9hbGwod2Fsa19zdGF0ZSk7CiAJfQogCi0JLyogRGVsZXRlIGFsbCBhcmd1bWVudHMgYW5kIGxvY2FscyAqLwotCi0JYWNwaV9kc19tZXRob2RfZGF0YV9kZWxldGVfYWxsKHdhbGtfc3RhdGUpOwotCiAJLyoKIAkgKiBMb2NrIHRoZSBwYXJzZXIgd2hpbGUgd2UgdGVybWluYXRlIHRoaXMgbWV0aG9kLgogCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgdGhyZWFkIGV4ZWN1dGluZyB0aGUgbWV0aG9kLAogCSAqIHdlIGhhdmUgYWRkaXRpb25hbCBjbGVhbnVwIHRvIHBlcmZvcm0KIAkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfUEFSU0VSKTsKKwlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfQ09OVFJPTF9NRVRIT0QpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fVk9JRDsKIAl9CiAKIAkvKiBTaWduYWwgY29tcGxldGlvbiBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgbWV0aG9kIGlmIG5lY2Vzc2FyeSAqLwogCi0JaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSB7CisJaWYgKG1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSB7CiAJCXN0YXR1cyA9Ci0JCSAgICBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KLQkJCQkJICAgICBzZW1hcGhvcmUsIDEpOworCQkgICAgYWNwaV9vc19zaWduYWxfc2VtYXBob3JlKG1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlLCAxKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQ291bGQgbm90IHNpZ25hbCBtZXRob2Qgc2VtYXBob3JlIikpOwogCi0JCQkvKiBJZ25vcmUgZXJyb3IgYW5kIGNvbnRpbnVlIGNsZWFudXAgKi8KKwkJCS8qIElnbm9yZSBlcnJvciBhbmQgY29udGludWUgKi8KKworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkNvdWxkIG5vdCBzaWduYWwgbWV0aG9kIHNlbWFwaG9yZSIpKTsKIAkJfQogCX0KIAotCS8qCi0JICogVGhlcmUgYXJlIG5vIG1vcmUgdGhyZWFkcyBleGVjdXRpbmcgdGhpcyBtZXRob2QuICBQZXJmb3JtCi0JICogYWRkaXRpb25hbCBjbGVhbnVwLgotCSAqCi0JICogVGhlIG1ldGhvZCBOb2RlIGlzIHN0b3JlZCBpbiB0aGUgd2FsayBzdGF0ZQotCSAqLwotCW1ldGhvZF9ub2RlID0gd2Fsa19zdGF0ZS0+bWV0aG9kX25vZGU7CisJaWYgKHdhbGtfc3RhdGUpIHsKKwkJLyoKKwkJICogRGVsZXRlIGFueSBvYmplY3RzIGNyZWF0ZWQgYnkgdGhpcyBtZXRob2QgZHVyaW5nIGV4ZWN1dGlvbi4KKwkJICogVGhlIG1ldGhvZCBOb2RlIGlzIHN0b3JlZCBpbiB0aGUgd2FsayBzdGF0ZQorCQkgKi8KKwkJbWV0aG9kX25vZGUgPSB3YWxrX3N0YXRlLT5tZXRob2Rfbm9kZTsKIAotCS8qIExvY2sgbmFtZXNwYWNlIGZvciBwb3NzaWJsZSB1cGRhdGUgKi8KKwkJLyogTG9jayBuYW1lc3BhY2UgZm9yIHBvc3NpYmxlIHVwZGF0ZSAqLwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWdvdG8gZXhpdDsKKwkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJZ290byBleGl0OworCQl9CisKKwkJLyoKKwkJICogRGVsZXRlIGFueSBuYW1lc3BhY2UgZW50cmllcyBjcmVhdGVkIGltbWVkaWF0ZWx5IHVuZGVybmVhdGgKKwkJICogdGhlIG1ldGhvZAorCQkgKi8KKwkJaWYgKG1ldGhvZF9ub2RlICYmIG1ldGhvZF9ub2RlLT5jaGlsZCkgeworCQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUobWV0aG9kX25vZGUpOworCQl9CisKKwkJLyoKKwkJICogRGVsZXRlIGFueSBuYW1lc3BhY2UgZW50cmllcyBjcmVhdGVkIGFueXdoZXJlIGVsc2Ugd2l0aGluCisJCSAqIHRoZSBuYW1lc3BhY2UgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZAorCQkgKi8KKwkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyKG1ldGhvZF9kZXNjLT5tZXRob2Qub3duZXJfaWQpOworCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAl9CiAKLQkvKgotCSAqIERlbGV0ZSBhbnkgbmFtZXNwYWNlIGVudHJpZXMgY3JlYXRlZCBpbW1lZGlhdGVseSB1bmRlcm5lYXRoCi0JICogdGhlIG1ldGhvZAotCSAqLwotCWlmIChtZXRob2Rfbm9kZS0+Y2hpbGQpIHsKLQkJYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUobWV0aG9kX25vZGUpOwotCX0KKwkvKiBEZWNyZW1lbnQgdGhlIHRocmVhZCBjb3VudCBvbiB0aGUgbWV0aG9kICovCiAKLQkvKgotCSAqIERlbGV0ZSBhbnkgbmFtZXNwYWNlIGVudHJpZXMgY3JlYXRlZCBhbnl3aGVyZSBlbHNlIHdpdGhpbgotCSAqIHRoZSBuYW1lc3BhY2UgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIG1ldGhvZAotCSAqLwotCWFjcGlfbnNfZGVsZXRlX25hbWVzcGFjZV9ieV9vd25lcih3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLgotCQkJCQkgIG93bmVyX2lkKTsKLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKKwlpZiAobWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKKwkJbWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQtLTsKKwl9IGVsc2UgeworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCB6ZXJvIHRocmVhZCBjb3VudCBpbiBtZXRob2QiKSk7CisJfQogCiAJLyogQXJlIHRoZXJlIGFueSBvdGhlciB0aHJlYWRzIGN1cnJlbnRseSBleGVjdXRpbmcgdGhpcyBtZXRob2Q/ICovCiAKLQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKKwlpZiAobWV0aG9kX2Rlc2MtPm1ldGhvZC50aHJlYWRfY291bnQpIHsKIAkJLyoKIAkJICogQWRkaXRpb25hbCB0aHJlYWRzLiBEbyBub3QgcmVsZWFzZSB0aGUgb3duZXJfaWQgaW4gdGhpcyBjYXNlLAogCQkgKiB3ZSBpbW1lZGlhdGVseSByZXVzZSBpdCBmb3IgdGhlIG5leHQgdGhyZWFkIGV4ZWN1dGluZyB0aGlzIG1ldGhvZAogCQkgKi8KIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKIAkJCQkgICIqKiogQ29tcGxldGVkIGV4ZWN1dGlvbiBvZiBvbmUgdGhyZWFkLCAlZCB0aHJlYWRzIHJlbWFpbmluZ1xuIiwKLQkJCQkgIHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuCi0JCQkJICB0aHJlYWRfY291bnQpKTsKKwkJCQkgIG1ldGhvZF9kZXNjLT5tZXRob2QudGhyZWFkX2NvdW50KSk7CiAJfSBlbHNlIHsKIAkJLyogVGhpcyBpcyB0aGUgb25seSBleGVjdXRpbmcgdGhyZWFkIGZvciB0aGlzIG1ldGhvZCAqLwogCkBAIC01MzMsMjIgKzU4NywyMCBAQAogCQkgKiBUaGlzIGNvZGUgaXMgaGVyZSBiZWNhdXNlIHdlIG11c3Qgd2FpdCB1bnRpbCB0aGUgbGFzdCB0aHJlYWQgZXhpdHMKIAkJICogYmVmb3JlIGNyZWF0aW5nIHRoZSBzeW5jaHJvbml6YXRpb24gc2VtYXBob3JlLgogCQkgKi8KLQkJaWYgKCh3YWxrX3N0YXRlLT5tZXRob2RfZGVzYy0+bWV0aG9kLmNvbmN1cnJlbmN5ID09IDEpICYmCi0JCSAgICAoIXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2Quc2VtYXBob3JlKSkgeworCQlpZiAoKG1ldGhvZF9kZXNjLT5tZXRob2QuY29uY3VycmVuY3kgPT0gMSkgJiYKKwkJICAgICghbWV0aG9kX2Rlc2MtPm1ldGhvZC5zZW1hcGhvcmUpKSB7CiAJCQlzdGF0dXMgPSBhY3BpX29zX2NyZWF0ZV9zZW1hcGhvcmUoMSwgMSwKLQkJCQkJCQkgICZ3YWxrX3N0YXRlLT4KLQkJCQkJCQkgIG1ldGhvZF9kZXNjLT5tZXRob2QuCisJCQkJCQkJICAmbWV0aG9kX2Rlc2MtPm1ldGhvZC4KIAkJCQkJCQkgIHNlbWFwaG9yZSk7CiAJCX0KIAogCQkvKiBObyBtb3JlIHRocmVhZHMsIHdlIGNhbiBmcmVlIHRoZSBvd25lcl9pZCAqLwogCi0JCWFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZCgmd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KLQkJCQkJIG93bmVyX2lkKTsKKwkJYWNwaV91dF9yZWxlYXNlX293bmVyX2lkKCZtZXRob2RfZGVzYy0+bWV0aG9kLm93bmVyX2lkKTsKIAl9CiAKICAgICAgIGV4aXQ6Ci0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX1BBUlNFUik7CisJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NPTlRST0xfTUVUSE9EKTsKIAlyZXR1cm5fVk9JRDsKIH0KIApAQCAtNTgxLDcgKzYzMyw3IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfcGFyc2VfbWV0aG9kIiwgbm9kZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfcGFyc2VfbWV0aG9kLCBub2RlKTsKIAogCS8qIFBhcmFtZXRlciBWYWxpZGF0aW9uICovCiAKQEAgLTU5MCw3ICs2NDIsNyBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCi0JCQkgICIqKioqIFBhcnNpbmcgWyU0LjRzXSAqKioqIG5hbWVkX29iaj0lcFxuIiwKKwkJCSAgIioqKiogUGFyc2luZyBbJTQuNHNdICoqKiogTmFtZWRPYmo9JXBcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSkpOwogCiAJLyogRXh0cmFjdCB0aGUgbWV0aG9kIG9iamVjdCBmcm9tIHRoZSBtZXRob2QgTm9kZSAqLwpAQCAtNjY5LDcgKzcyMSw3IEBACiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCSAgIioqKiogWyU0LjRzXSBQYXJzZWQgKioqKiBuYW1lZF9vYmo9JXAgT3A9JXBcbiIsCisJCQkgICIqKioqIFslNC40c10gUGFyc2VkICoqKiogTmFtZWRPYmo9JXAgT3A9JXBcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSwgb3ApKTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtdGhkYXQuYwppbmRleCBjMDI1Njc0Li40NTkxNjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc210aGRhdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbXRoZGF0LmMKQEAgLTgxLDcgKzgxLDcgQEAKICAqICAgICAgICAgICAgICBzcGVjaWFsIGRhdGEgdHlwZXMuCiAgKgogICogTk9URVM6ICAgICAgIHdhbGtfc3RhdGUgZmllbGRzIGFyZSBpbml0aWFsaXplZCB0byB6ZXJvIGJ5IHRoZQotICogICAgICAgICAgICAgIEFDUElfTUVNX0NBTExPQ0FURSgpLgorICogICAgICAgICAgICAgIEFDUElfQUxMT0NBVEVfWkVST0VEKCkuCiAgKgogICogICAgICAgICAgICAgIEEgcHNldWRvLU5hbWVzcGFjZSBOb2RlIGlzIGFzc2lnbmVkIHRvIGVhY2ggYXJndW1lbnQgYW5kIGxvY2FsCiAgKiAgICAgICAgICAgICAgc28gdGhhdCByZWZfb2YoKSBjYW4gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgTm9kZS4KQEAgLTkyLDcgKzkyLDcgQEAKIHsKIAl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2luaXQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2luaXQpOwogCiAJLyogSW5pdCB0aGUgbWV0aG9kIGFyZ3VtZW50cyAqLwogCkBAIC0xMDAsMTAgKzEwMCwxMCBAQAogCQlBQ1BJX01PVkVfMzJfVE9fMzIoJndhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5uYW1lLAogCQkJCSAgIE5BTUVPRl9BUkdfTlRFKTsKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLm5hbWUuaW50ZWdlciB8PSAoaSA8PCAyNCk7Ci0JCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDsKIAkJd2Fsa19zdGF0ZS0+YXJndW1lbnRzW2ldLnR5cGUgPSBBQ1BJX1RZUEVfQU5ZOwotCQl3YWxrX3N0YXRlLT5hcmd1bWVudHNbaV0uZmxhZ3MgPSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwKLQkJICAgIEFOT0JKX01FVEhPRF9BUkc7CisJCXdhbGtfc3RhdGUtPmFyZ3VtZW50c1tpXS5mbGFncyA9CisJCSAgICBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0FSRzsKIAl9CiAKIAkvKiBJbml0IHRoZSBtZXRob2QgbG9jYWxzICovCkBAIC0xMTMsMTEgKzExMywxMSBAQAogCQkJCSAgIE5BTUVPRl9MT0NBTF9OVEUpOwogCiAJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5uYW1lLmludGVnZXIgfD0gKGkgPDwgMjQpOwotCQl3YWxrX3N0YXRlLT5sb2NhbF92YXJpYWJsZXNbaV0uZGVzY3JpcHRvciA9CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5kZXNjcmlwdG9yX3R5cGUgPQogCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CiAJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS50eXBlID0gQUNQSV9UWVBFX0FOWTsKLQkJd2Fsa19zdGF0ZS0+bG9jYWxfdmFyaWFibGVzW2ldLmZsYWdzID0gQU5PQkpfRU5EX09GX1BFRVJfTElTVCB8Ci0JCSAgICBBTk9CSl9NRVRIT0RfTE9DQUw7CisJCXdhbGtfc3RhdGUtPmxvY2FsX3ZhcmlhYmxlc1tpXS5mbGFncyA9CisJCSAgICBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHwgQU5PQkpfTUVUSE9EX0xPQ0FMOwogCX0KIAogCXJldHVybl9WT0lEOwpAQCAtMTQwLDcgKzE0MCw3IEBACiB7CiAJdTMyIGluZGV4OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZGVsZXRlX2FsbCk7CiAKIAkvKiBEZXRhY2ggdGhlIGxvY2FscyAqLwogCkBAIC0xOTksNyArMTk5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIGluZGV4ID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19tZXRob2RfZGF0YV9pbml0X2FyZ3MiLCBwYXJhbXMpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX21ldGhvZF9kYXRhX2luaXRfYXJncywgcGFyYW1zKTsKIAogCWlmICghcGFyYW1zKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKQEAgLTI1MSw3ICsyNTEsNyBAQAogCQkJICAgICBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAogCQkJICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZ2V0X25vZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2dldF9ub2RlKTsKIAogCS8qCiAJICogTWV0aG9kIExvY2FscyBhbmQgQXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQKQEAgLTMxOCwxMCArMzE4LDEwIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfc2V0X3ZhbHVlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19tZXRob2RfZGF0YV9zZXRfdmFsdWUpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAibmV3X29iaiAlcCBPcGNvZGUgJVgsIFJlZnM9JWQgWyVzXVxuIiwgb2JqZWN0LAorCQkJICAiTmV3T2JqICVwIE9wY29kZSAlWCwgUmVmcz0lZCBbJXNdXG4iLCBvYmplY3QsCiAJCQkgIG9wY29kZSwgb2JqZWN0LT5jb21tb24ucmVmZXJlbmNlX2NvdW50LAogCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUob2JqZWN0LT5jb21tb24udHlwZSkpKTsKIApAQCAtMzM2LDcgKzMzNiw3IEBACiAJICogSW5jcmVtZW50IHJlZiBjb3VudCBzbyBvYmplY3QgY2FuJ3QgYmUgZGVsZXRlZCB3aGlsZSBpbnN0YWxsZWQuCiAJICogTk9URTogV2UgZG8gbm90IGNvcHkgdGhlIG9iamVjdCBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgY2FsbCBieQogCSAqIHJlZmVyZW5jZSBzZW1hbnRpY3Mgb2YgQUNQSSBDb250cm9sIE1ldGhvZCBpbnZvY2F0aW9uLgotCSAqIChTZWUgQUNQSSBzcGVjaWZpY2F0aW9uIDIuMF9jKQorCSAqIChTZWUgQUNQSSBTcGVjaWZpY2F0aW9uIDIuMF9jKQogCSAqLwogCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmplY3QpOwogCkBAIC0zNTEsNyArMzUxLDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2dldF92YWx1ZQogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBnZXQKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGdldAogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CiAgKiAgICAgICAgICAgICAgZGVzdF9kZXNjICAgICAgICAgICAtIFdoZXJlIEFyZyBvciBMb2NhbCB2YWx1ZSBpcyByZXR1cm5lZAogICoKQEAgLTM3Miw3ICszNzIsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2dldF92YWx1ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZ2V0X3ZhbHVlKTsKIAogCS8qIFZhbGlkYXRlIHRoZSBvYmplY3QgZGVzY3JpcHRvciAqLwogCkBAIC00NTksNyArNDU5LDcgQEAKICAqIEZVTkNUSU9OOiAgICBhY3BpX2RzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZQogICoKICAqIFBBUkFNRVRFUlM6ICBPcGNvZGUgICAgICAgICAgICAgIC0gRWl0aGVyIEFNTF9MT0NBTF9PUCBvciBBTUxfQVJHX09QCi0gKiAgICAgICAgICAgICAgSW5kZXggICAgICAgICAgICAgICAtIHdoaWNoIGxvY2FsX3ZhciBvciBhcmd1bWVudCB0byBkZWxldGUKKyAqICAgICAgICAgICAgICBJbmRleCAgICAgICAgICAgICAgIC0gV2hpY2ggbG9jYWxfdmFyIG9yIGFyZ3VtZW50IHRvIGRlbGV0ZQogICogICAgICAgICAgICAgIHdhbGtfc3RhdGUgICAgICAgICAgLSBDdXJyZW50IHdhbGsgc3RhdGUgb2JqZWN0CiAgKgogICogUkVUVVJOOiAgICAgIE5vbmUKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX21ldGhvZF9kYXRhX2RlbGV0ZV92YWx1ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbWV0aG9kX2RhdGFfZGVsZXRlX3ZhbHVlKTsKIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIApAQCAtNTM4LDcgKzUzOCw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqY3VycmVudF9vYmpfZGVzYzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXdfb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zdG9yZV9vYmplY3RfdG9fbG9jYWwiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX3N0b3JlX29iamVjdF90b19sb2NhbCk7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiT3Bjb2RlPSVYIEluZGV4PSVkIE9iaj0lcFxuIiwKIAkJCSAgb3Bjb2RlLCBpbmRleCwgb2JqX2Rlc2MpKTsKIApAQCAtNjE0LDcgKzYxNCw3IEBACiAJCQkgICAgJiYgKGN1cnJlbnRfb2JqX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0KIAkJCQlBTUxfUkVGX09GX09QKSkgewogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkJCSAgIkFyZyAoJXApIGlzIGFuIG9ial9yZWYoTm9kZSksIHN0b3JpbmcgaW4gbm9kZSAlcFxuIiwKKwkJCQkJCSAgIkFyZyAoJXApIGlzIGFuIE9ialJlZihOb2RlKSwgc3RvcmluZyBpbiBub2RlICVwXG4iLAogCQkJCQkJICBuZXdfb2JqX2Rlc2MsCiAJCQkJCQkgIGN1cnJlbnRfb2JqX2Rlc2MpKTsKIApAQCAtNjg4LDcgKzY4OCw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfbWV0aG9kX2RhdGFfZ2V0X3R5cGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX21ldGhvZF9kYXRhX2dldF90eXBlKTsKIAogCS8qIEdldCB0aGUgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSBhcmcvbG9jYWwgKi8KIApAQCAtNzAxLDYgKzcwMSw3IEBACiAKIAlvYmplY3QgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKCFvYmplY3QpIHsKKwogCQkvKiBVbmluaXRpYWxpemVkIGxvY2FsL2FyZywgcmV0dXJuIFRZUEVfQU5ZICovCiAKIAkJcmV0dXJuX1ZBTFVFKEFDUElfVFlQRV9BTlkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb2JqZWN0LmMKaW5kZXggOGIyMWYwZi4uNzIxOTBhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29iamVjdC5jCkBAIC04MSw3ICs4MSw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfYnVpbGRfaW50ZXJuYWxfb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19idWlsZF9pbnRlcm5hbF9vYmplY3QpOwogCiAJKm9ial9kZXNjX3B0ciA9IE5VTEw7CiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CkBAIC0xMDMsNiArMTAzLDcgQEAKIAkJCQkJCQkJCSBjb21tb24uCiAJCQkJCQkJCQkgbm9kZSkpKTsKIAkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCiAJCQkJLyogQ2hlY2sgaWYgd2UgYXJlIHJlc29sdmluZyBhIG5hbWVkIHJlZmVyZW5jZSB3aXRoaW4gYSBwYWNrYWdlICovCiAKIAkJCQlpZiAoKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpCkBAIC0xODYsNyArMTg3LDcgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqYnl0ZV9saXN0OwogCXUzMiBieXRlX2xpc3RfbGVuZ3RoID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmoiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2J1aWxkX2ludGVybmFsX2J1ZmZlcl9vYmopOwogCiAJLyoKIAkgKiBJZiB3ZSBhcmUgZXZhbHVhdGluZyBhIE5hbWVkIGJ1ZmZlciBvYmplY3QgIk5hbWUgKHh4eHgsIEJ1ZmZlcikiLgpAQCAtMTk1LDYgKzE5Niw3IEBACiAJICovCiAJb2JqX2Rlc2MgPSAqb2JqX2Rlc2NfcHRyOwogCWlmICghb2JqX2Rlc2MpIHsKKwogCQkvKiBDcmVhdGUgYSBuZXcgYnVmZmVyIG9iamVjdCAqLwogCiAJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9CVUZGRVIpOwpAQCAtMjQzLDcgKzI0NSw3IEBACiAJCQkJICAiQnVmZmVyIGRlZmluZWQgd2l0aCB6ZXJvIGxlbmd0aCBpbiBBTUwsIGNyZWF0aW5nXG4iKSk7CiAJfSBlbHNlIHsKIAkJb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyID0KLQkJICAgIEFDUElfTUVNX0NBTExPQ0FURShvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CisJCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChvYmpfZGVzYy0+YnVmZmVyLmxlbmd0aCk7CiAJCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyKSB7CiAJCQlhY3BpX3V0X2RlbGV0ZV9vYmplY3RfZGVzYyhvYmpfZGVzYyk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKQEAgLTI5MSw3ICsyOTMsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2J1aWxkX2ludGVybmFsX3BhY2thZ2Vfb2JqIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19idWlsZF9pbnRlcm5hbF9wYWNrYWdlX29iaik7CiAKIAkvKiBGaW5kIHRoZSBwYXJlbnQgb2YgYSBwb3NzaWJseSBuZXN0ZWQgcGFja2FnZSAqLwogCkBAIC0zMzksOSArMzQxLDEwIEBACiAJICogaW5kaXZpZHVhbCBvYmplY3RzKS4gQWRkIGFuIGV4dHJhIHBvaW50ZXIgc2xvdCBzbwogCSAqIHRoYXQgdGhlIGxpc3QgaXMgYWx3YXlzIG51bGwgdGVybWluYXRlZC4KIAkgKi8KLQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkgb2JqX2Rlc2MtPgotCQkJCQkJCSBwYWNrYWdlLmNvdW50ICsKLQkJCQkJCQkgMSkgKiBzaXplb2Yodm9pZCAqKSk7CisJb2JqX2Rlc2MtPnBhY2thZ2UuZWxlbWVudHMgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoKGFjcGlfc2l6ZSkKKwkJCQkJCQkgICBvYmpfZGVzYy0+cGFja2FnZS4KKwkJCQkJCQkgICBjb3VudCArCisJCQkJCQkJICAgMSkgKiBzaXplb2Yodm9pZCAqKSk7CiAKIAlpZiAoIW9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKSB7CiAJCWFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKG9ial9kZXNjKTsKQEAgLTM1NSw2ICszNTgsNyBAQAogCWFyZyA9IGFyZy0+Y29tbW9uLm5leHQ7CiAJZm9yIChpID0gMDsgYXJnOyBpKyspIHsKIAkJaWYgKGFyZy0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX0lOVF9SRVRVUk5fVkFMVUVfT1ApIHsKKwogCQkJLyogT2JqZWN0IChwYWNrYWdlIG9yIGJ1ZmZlcikgaXMgYWxyZWFkeSBidWlsdCAqLwogCiAJCQlvYmpfZGVzYy0+cGFja2FnZS5lbGVtZW50c1tpXSA9CkBAIC0zOTYsNyArNDAwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfY3JlYXRlX25vZGUiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfY3JlYXRlX25vZGUsIG9wKTsKIAogCS8qCiAJICogQmVjYXVzZSBvZiB0aGUgZXhlY3V0aW9uIHBhc3MgdGhyb3VnaCB0aGUgbm9uLWNvbnRyb2wtbWV0aG9kCkBAIC00MDgsNiArNDEyLDcgQEAKIAl9CiAKIAlpZiAoIW9wLT5jb21tb24udmFsdWUuYXJnKSB7CisKIAkJLyogTm8gYXJndW1lbnRzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovCiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTQ2NCwxMSArNDY5LDEyIEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19pbml0X29iamVjdF9mcm9tX29wIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19pbml0X29iamVjdF9mcm9tX29wKTsKIAogCW9ial9kZXNjID0gKnJldF9vYmpfZGVzYzsKIAlvcF9pbmZvID0gYWNwaV9wc19nZXRfb3Bjb2RlX2luZm8ob3Bjb2RlKTsKIAlpZiAob3BfaW5mby0+Y2xhc3MgPT0gQU1MX0NMQVNTX1VOS05PV04pIHsKKwogCQkvKiBVbmtub3duIG9wY29kZSAqLwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9UWVBFKTsKQEAgLTYyNiw2ICs2MzIsNyBAQAogCQlkZWZhdWx0OgkvKiBPdGhlciBsaXRlcmFscywgZXRjLi4gKi8KIAogCQkJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX05BTUVQQVRIX09QKSB7CisKIAkJCQkvKiBOb2RlIHdhcyBzYXZlZCBpbiBPcCAqLwogCiAJCQkJb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlID0gb3AtPmNvbW1vbi5ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzb3Bjb2RlLmMKaW5kZXggNjIyOWMxMC4uNWI5NzRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc29wY29kZS5jCkBAIC05MSw3ICs5MSw3IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19leGVjdXRlX2FyZ3VtZW50cyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfZXhlY3V0ZV9hcmd1bWVudHMpOwogCiAJLyoKIAkgKiBBbGxvY2F0ZSBhIG5ldyBwYXJzZXIgb3AgdG8gYmUgdGhlIHJvb3Qgb2YgdGhlIHBhcnNlZCB0cmVlCkBAIC0xOTMsNyArMTkzLDcgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMiLCBvYmpfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X2J1ZmZlcl9maWVsZF9hcmd1bWVudHMsIG9ial9kZXNjKTsKIAogCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAJQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lCiAJCQkoQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCwgbm9kZSwgTlVMTCkpOwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlslNC40c10gYnVmZmVyX2ZpZWxkIEFyZyBJbml0XG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlslNC40c10gQnVmZmVyRmllbGQgQXJnIEluaXRcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSkpOwogCiAJLyogRXhlY3V0ZSB0aGUgQU1MIGNvZGUgZm9yIHRoZSB0ZXJtX2FyZyBhcmd1bWVudHMgKi8KQEAgLTIzNSw3ICsyMzUsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfYnVmZmVyX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19nZXRfYnVmZmVyX2FyZ3VtZW50cywgb2JqX2Rlc2MpOwogCiAJaWYgKG9ial9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfREFUQV9WQUxJRCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpAQCAtMjc5LDcgKzI3OSw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9wYWNrYWdlX2FyZ3VtZW50cyIsIG9ial9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19nZXRfcGFja2FnZV9hcmd1bWVudHMsIG9ial9kZXNjKTsKIAogCWlmIChvYmpfZGVzYy0+Y29tbW9uLmZsYWdzICYgQU9QT0JKX0RBVEFfVkFMSUQpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTMyNCw3ICszMjQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpleHRyYV9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2dldF9yZWdpb25fYXJndW1lbnRzIiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2dldF9yZWdpb25fYXJndW1lbnRzLCBvYmpfZGVzYyk7CiAKIAlpZiAob2JqX2Rlc2MtPnJlZ2lvbi5mbGFncyAmIEFPUE9CSl9EQVRBX1ZBTElEKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC0zNDIsOCArMzQyLDcgQEAKIAlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKIAkJCShBQ1BJX1RZUEVfUkVHSU9OLCBub2RlLCBOVUxMKSk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkgICJbJTQuNHNdIG9wX3JlZ2lvbiBBcmcgSW5pdCBhdCBBTUwgJXBcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiWyU0LjRzXSBPcFJlZ2lvbiBBcmcgSW5pdCBhdCBBTUwgJXBcbiIsCiAJCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwKIAkJCSAgZXh0cmFfZGVzYy0+ZXh0cmEuYW1sX3N0YXJ0KSk7CiAKQEAgLTM1Miw2ICszNTEsMjggQEAKIAlzdGF0dXMgPSBhY3BpX2RzX2V4ZWN1dGVfYXJndW1lbnRzKG5vZGUsIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpLAogCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfbGVuZ3RoLAogCQkJCQkgICBleHRyYV9kZXNjLT5leHRyYS5hbWxfc3RhcnQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBWYWxpZGF0ZSB0aGUgcmVnaW9uIGFkZHJlc3MvbGVuZ3RoIHZpYSB0aGUgaG9zdCBPUyAqLworCisJc3RhdHVzID0gYWNwaV9vc192YWxpZGF0ZV9hZGRyZXNzKG9ial9kZXNjLT5yZWdpb24uc3BhY2VfaWQsCisJCQkJCSAgb2JqX2Rlc2MtPnJlZ2lvbi5hZGRyZXNzLAorCQkJCQkgIChhY3BpX3NpemUpIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJLyoKKwkJICogSW52YWxpZCBhZGRyZXNzL2xlbmd0aC4gV2Ugd2lsbCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgYW5kIG1hcmsKKwkJICogdGhlIHJlZ2lvbiBhcyBpbnZhbGlkLCBzbyB0aGF0IGl0IHdpbGwgY2F1c2UgYW4gYWRkaXRpb25hbCBlcnJvciBpZgorCQkgKiBpdCBpcyBldmVyIHVzZWQuIFRoZW4gcmV0dXJuIEFFX09LLgorCQkgKi8KKwkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkiRHVyaW5nIGFkZHJlc3MgdmFsaWRhdGlvbiBvZiBPcFJlZ2lvbiBbJTQuNHNdIiwKKwkJCQlub2RlLT5uYW1lLmFzY2lpKSk7CisJCW9ial9kZXNjLT5jb21tb24uZmxhZ3MgfD0gQU9QT0JKX0lOVkFMSUQ7CisJCXN0YXR1cyA9IEFFX09LOworCX0KKwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC00MTEsNyArNDMyLDcgQEAKIAl1OCBmaWVsZF9mbGFnczsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfaW5pdF9idWZmZXJfZmllbGQiLCBvYmpfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfaW5pdF9idWZmZXJfZmllbGQsIG9ial9kZXNjKTsKIAogCS8qIEhvc3Qgb2JqZWN0IG11c3QgYmUgYSBCdWZmZXIgKi8KIApAQCAtNDU3LDcgKzQ3OCw3IEBACiAKIAkJaWYgKGJpdF9jb3VudCA9PSAwKSB7CiAJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiQXR0ZW1wdCB0byBjcmVhdGVfZmllbGQgb2YgbGVuZ3RoIHplcm8iKSk7CisJCQkJICAgICJBdHRlbXB0IHRvIENyZWF0ZUZpZWxkIG9mIGxlbmd0aCB6ZXJvIikpOwogCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVkFMVUU7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KQEAgLTU5NSw3ICs2MTYsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzIiwgb3ApOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWxfYnVmZmVyX2ZpZWxkX29wZXJhbmRzLCBvcCk7CiAKIAkvKgogCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlCkBAIC02MjcsNyArNjQ4LDcgQEAKIAlBQ1BJX0RVTVBfT1BFUkFORFMoQUNQSV9XQUxLX09QRVJBTkRTLCBBQ1BJX0lNT0RFX0VYRUNVVEUsCiAJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZShvcC0+Y29tbW9uLmFtbF9vcGNvZGUpLAogCQkJICAgd2Fsa19zdGF0ZS0+bnVtX29wZXJhbmRzLAotCQkJICAgImFmdGVyIGFjcGlfZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOworCQkJICAgImFmdGVyIEFjcGlFeFJlc29sdmVPcGVyYW5kcyIpOwogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICIoJXMpIGJhZCBvcGVyYW5kKHMpICglWCkiLApAQCAtNjQwLDYgKzY2MSw3IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgQnVmZmVyIEZpZWxkICovCiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9DUkVBVEVfRklFTERfT1ApIHsKKwogCQkvKiBOT1RFOiBTbGlnaHRseSBkaWZmZXJlbnQgb3BlcmFuZHMgZm9yIHRoaXMgb3Bjb2RlICovCiAKIAkJc3RhdHVzID0KQEAgLTY4NSw3ICs3MDcsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V2YWxfcmVnaW9uX29wZXJhbmRzIiwgb3ApOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2V2YWxfcmVnaW9uX29wZXJhbmRzLCBvcCk7CiAKIAkvKgogCSAqIFRoaXMgaXMgd2hlcmUgd2UgZXZhbHVhdGUgdGhlIGFkZHJlc3MgYW5kIGxlbmd0aCBmaWVsZHMgb2YgdGhlCkBAIC03MTgsNyArNzQwLDcgQEAKIAogCUFDUElfRFVNUF9PUEVSQU5EUyhBQ1BJX1dBTEtfT1BFUkFORFMsIEFDUElfSU1PREVfRVhFQ1VURSwKIAkJCSAgIGFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKG9wLT5jb21tb24uYW1sX29wY29kZSksCi0JCQkgICAxLCAiYWZ0ZXIgYWNwaV9leF9yZXNvbHZlX29wZXJhbmRzIik7CisJCQkgICAxLCAiYWZ0ZXIgQWNwaUV4UmVzb2x2ZU9wZXJhbmRzIik7CiAKIAlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CkBAIC03NDQsNyArNzY2LDcgQEAKIAkgICAgb3BlcmFuZF9kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShvcGVyYW5kX2Rlc2MpOwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAicmduX29iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIlJnbk9iaiAlcCBBZGRyICU4LjhYJTguOFggTGVuICVYXG4iLAogCQkJICBvYmpfZGVzYywKIAkJCSAgQUNQSV9GT1JNQVRfVUlOVDY0KG9ial9kZXNjLT5yZWdpb24uYWRkcmVzcyksCiAJCQkgIG9ial9kZXNjLT5yZWdpb24ubGVuZ3RoKSk7CkBAIC03ODAsNyArODAyLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphcmdfZGVzYzsKIAl1MzIgbGVuZ3RoOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfZXZhbF9kYXRhX29iamVjdF9vcGVyYW5kcyk7CiAKIAkvKiBUaGUgZmlyc3Qgb3BlcmFuZCAoZm9yIGFsbCBvZiB0aGVzZSBkYXRhIG9iamVjdHMpIGlzIHRoZSBsZW5ndGggKi8KIApAQCAtODc0LDcgKzg5Niw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpjb250cm9sX3N0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19leGVjX2JlZ2luX2NvbnRyb2xfb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZXhlY19iZWdpbl9jb250cm9sX29wKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBPcGNvZGU9JTIuMlggU3RhdGU9JXBcbiIsIG9wLAogCQkJICBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsIHdhbGtfc3RhdGUpKTsKQEAgLTk1Miw3ICs5NzQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqY29udHJvbF9zdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfZXhlY19lbmRfY29udHJvbF9vcCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19leGVjX2VuZF9jb250cm9sX29wKTsKIAogCXN3aXRjaCAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSB7CiAJY2FzZSBBTUxfSUZfT1A6CkBAIC05ODQsNiArMTAwNiw3IEBACiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJbV0hJTEVfT1BdIE9wPSVwXG4iLCBvcCkpOwogCiAJCWlmICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24udmFsdWUpIHsKKwogCQkJLyogUHJlZGljYXRlIHdhcyB0cnVlLCBnbyBiYWNrIGFuZCBldmFsdWF0ZSBpdCBhZ2FpbiEgKi8KIAogCQkJc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwpAQCAtMTAxNCw2ICsxMDM3LDcgQEAKIAkJICogaGFzIGJlZW4gYnViYmxlZCB1cCB0aGUgdHJlZQogCQkgKi8KIAkJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7CisKIAkJCS8qIFNpbmNlIHdlIGhhdmUgYSByZWFsIFJldHVybigpLCBkZWxldGUgYW55IGltcGxpY2l0IHJldHVybiAqLwogCiAJCQlhY3BpX2RzX2NsZWFyX2ltcGxpY2l0X3JldHVybih3YWxrX3N0YXRlKTsKQEAgLTEwNDcsNiArMTA3MSw3IEBACiAJCQl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHdhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCQl9IGVsc2UgaWYgKCh3YWxrX3N0YXRlLT5yZXN1bHRzKSAmJgogCQkJICAgKHdhbGtfc3RhdGUtPnJlc3VsdHMtPnJlc3VsdHMubnVtX3Jlc3VsdHMgPiAwKSkgeworCiAJCQkvKiBTaW5jZSB3ZSBoYXZlIGEgcmVhbCBSZXR1cm4oKSwgZGVsZXRlIGFueSBpbXBsaWNpdCByZXR1cm4gKi8KIAogCQkJYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4od2Fsa19zdGF0ZSk7CkBAIC0xMDk1LDcgKzExMjAsNyBAQAogCQl9CiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCQkgICJDb21wbGV0ZWQgUkVUVVJOX09QIFN0YXRlPSVwLCByZXRfdmFsPSVwXG4iLAorCQkJCSAgIkNvbXBsZXRlZCBSRVRVUk5fT1AgU3RhdGU9JXAsIFJldFZhbD0lcFxuIiwKIAkJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnJldHVybl9kZXNjKSk7CiAKIAkJLyogRW5kIHRoZSBjb250cm9sIG1ldGhvZCBleGVjdXRpb24gcmlnaHQgbm93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3V0aWxzLmMKaW5kZXggNTMzNTZhNS4uMDUyMzBiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzdXRpbHMuYwpAQCAtNjgsNyArNjgsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgYWNwaV9kc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4oc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX2NsZWFyX2ltcGxpY2l0X3JldHVybiIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19jbGVhcl9pbXBsaWNpdF9yZXR1cm4pOwogCiAJLyoKIAkgKiBTbGFjayBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoaXMgZmVhdHVyZQpAQCAtMTE1LDcgKzExNSw3IEBACiBhY3BpX2RzX2RvX2ltcGxpY2l0X3JldHVybih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYywKIAkJCSAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsIHU4IGFkZF9yZWZlcmVuY2UpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19kb19pbXBsaWNpdF9yZXR1cm4iKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfZG9faW1wbGljaXRfcmV0dXJuKTsKIAogCS8qCiAJICogU2xhY2sgbXVzdCBiZSBlbmFibGVkIGZvciB0aGlzIGZlYXR1cmUsIGFuZCB3ZSBtdXN0CkBAIC0xNzEsNyArMTcxLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfaXNfcmVzdWx0X3VzZWQiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfaXNfcmVzdWx0X3VzZWQsIG9wKTsKIAogCS8qIE11c3QgaGF2ZSBib3RoIGFuIE9wIGFuZCBhIFJlc3VsdCBPYmplY3QgKi8KIApAQCAtMjAyLDYgKzIwMiw3IEBACiAJICovCiAJaWYgKCghb3AtPmNvbW1vbi5wYXJlbnQpIHx8CiAJICAgIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUgPT0gQU1MX1NDT1BFX09QKSkgeworCiAJCS8qIE5vIHBhcmVudCwgdGhlIHJldHVybiB2YWx1ZSBjYW5ub3QgcG9zc2libHkgYmUgdXNlZCAqLwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCkBAIC0zNDAsNyArMzQxLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZHNfZGVsZXRlX3Jlc3VsdF9pZl9ub3RfdXNlZCIsIHJlc3VsdF9vYmopOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2RlbGV0ZV9yZXN1bHRfaWZfbm90X3VzZWQsIHJlc3VsdF9vYmopOwogCiAJaWYgKCFvcCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBPcCIpKTsKQEAgLTM1Miw2ICszNTMsNyBAQAogCX0KIAogCWlmICghYWNwaV9kc19pc19yZXN1bHRfdXNlZChvcCwgd2Fsa19zdGF0ZSkpIHsKKwogCQkvKiBNdXN0IHBvcCB0aGUgcmVzdWx0IHN0YWNrIChvYmpfZGVzYyBzaG91bGQgYmUgZXF1YWwgdG8gcmVzdWx0X29iaikgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2RzX3Jlc3VsdF9wb3AoJm9ial9kZXNjLCB3YWxrX3N0YXRlKTsKQEAgLTM4Miw3ICszODQsNyBAQAogCXUzMiBpOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX3Jlc29sdmVfb3BlcmFuZHMiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19yZXNvbHZlX29wZXJhbmRzLCB3YWxrX3N0YXRlKTsKIAogCS8qCiAJICogQXR0ZW1wdCB0byByZXNvbHZlIGVhY2ggb2YgdGhlIHZhbGlkIG9wZXJhbmRzCkBAIC00MTcsNyArNDE5LDcgQEAKIHsKIAl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jbGVhcl9vcGVyYW5kcyIsIHdhbGtfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NsZWFyX29wZXJhbmRzLCB3YWxrX3N0YXRlKTsKIAogCS8qIFJlbW92ZSBhIHJlZmVyZW5jZSBvbiBlYWNoIG9wZXJhbmQgb24gdGhlIHN0YWNrICovCiAKQEAgLTQ2NSw3ICs0NjcsNyBAQAogCWFjcGlfaW50ZXJwcmV0ZXJfbW9kZSBpbnRlcnByZXRlcl9tb2RlOwogCWNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICpvcF9pbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2NyZWF0ZV9vcGVyYW5kIiwgYXJnKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19jcmVhdGVfb3BlcmFuZCwgYXJnKTsKIAogCS8qIEEgdmFsaWQgbmFtZSBtdXN0IGJlIGxvb2tlZCB1cCBpbiB0aGUgbmFtZXNwYWNlICovCiAKQEAgLTQ5OCw3ICs1MDAsOSBAQAogCQkgKi8KIAkJaWYgKCh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSAmJgogCQkgICAgKHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUtPnR5cGUgPT0gQUNQSV9UWVBFX0JVRkZFUl9GSUVMRCkKLQkJICAgICYmIChhcmdfaW5kZXggIT0gMCkpIHsKKwkJICAgICYmIChhcmdfaW5kZXggPT0KKwkJCSh1MzIpICgod2Fsa19zdGF0ZS0+b3Bjb2RlID09CisJCQkJQU1MX0NSRUFURV9GSUVMRF9PUCkgPyAzIDogMikpKSB7CiAJCQlvYmpfZGVzYyA9CiAJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LAogCQkJCQkgIHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGUpOwpAQCAtNTIxLDYgKzUyNSw3IEBACiAJCQkgICAgJiYgKHBhcmVudF9vcC0+Y29tbW9uLmFtbF9vcGNvZGUgIT0gQU1MX1JFR0lPTl9PUCkKIAkJCSAgICAmJiAocGFyZW50X29wLT5jb21tb24uYW1sX29wY29kZSAhPQogCQkJCUFNTF9JTlRfTkFNRVBBVEhfT1ApKSB7CisKIAkJCQkvKiBFbnRlciBuYW1lIGludG8gbmFtZXNwYWNlIGlmIG5vdCBmb3VuZCAqLwogCiAJCQkJaW50ZXJwcmV0ZXJfbW9kZSA9IEFDUElfSU1PREVfTE9BRF9QQVNTMjsKQEAgLTU3Miw3ICs1NzcsNyBAQAogCiAJCS8qIEZyZWUgdGhlIG5hbWVzdHJpbmcgY3JlYXRlZCBhYm92ZSAqLwogCi0JCUFDUElfTUVNX0ZSRUUobmFtZV9zdHJpbmcpOworCQlBQ1BJX0ZSRUUobmFtZV9zdHJpbmcpOwogCiAJCS8qIENoZWNrIHN0YXR1cyBmcm9tIHRoZSBsb29rdXAgKi8KIApAQCAtNjk2LDcgKzcwMSw3IEBACiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFyZzsKIAl1MzIgYXJnX2NvdW50ID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19jcmVhdGVfb3BlcmFuZHMiLCBmaXJzdF9hcmcpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGRzX2NyZWF0ZV9vcGVyYW5kcywgZmlyc3RfYXJnKTsKIAogCS8qIEZvciBhbGwgYXJndW1lbnRzIGluIHRoZSBsaXN0Li4uICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2V4ZWMuYwppbmRleCBmMWFmNjU1Li4zYWNiZDkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dleGVjLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3ZXhlYy5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZGVidWcuaD4KLSNpbmNsdWRlIDxhY3BpL2FjZGlzYXNtLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0RJU1BBVENIRVIKIEFDUElfTU9EVUxFX05BTUUoImRzd2V4ZWMiKQpAQCAtOTMsNyArOTIsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmxvY2FsX29ial9kZXNjID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJkc19nZXRfcHJlZGljYXRlX3ZhbHVlIiwgd2Fsa19zdGF0ZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZ2V0X3ByZWRpY2F0ZV92YWx1ZSwgd2Fsa19zdGF0ZSk7CiAKIAl3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPSAwOwogCkBAIC0xMjMsNyArMTIyLDcgQEAKIAogCWlmICghb2JqX2Rlc2MpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTm8gcHJlZGljYXRlIG9ial9kZXNjPSVwIFN0YXRlPSVwIiwKKwkJCSAgICAiTm8gcHJlZGljYXRlIE9iakRlc2M9JXAgU3RhdGU9JXAiLAogCQkJICAgIG9ial9kZXNjLCB3YWxrX3N0YXRlKSk7CiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19PUEVSQU5EKTsKQEAgLTE0MCw3ICsxMzksNyBAQAogCiAJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKGxvY2FsX29ial9kZXNjKSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJCYWQgcHJlZGljYXRlIChub3QgYW4gaW50ZWdlcikgb2JqX2Rlc2M9JXAgU3RhdGU9JXAgVHlwZT0lWCIsCisJCQkgICAgIkJhZCBwcmVkaWNhdGUgKG5vdCBhbiBpbnRlZ2VyKSBPYmpEZXNjPSVwIFN0YXRlPSVwIFR5cGU9JVgiLAogCQkJICAgIG9ial9kZXNjLCB3YWxrX3N0YXRlLAogCQkJICAgIEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkpOwogCkBAIC0yMTQsNyArMjEzLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1MzIgb3Bjb2RlX2NsYXNzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V4ZWNfYmVnaW5fb3AiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19leGVjX2JlZ2luX29wLCB3YWxrX3N0YXRlKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7CiAJaWYgKCFvcCkgewpAQCAtMjk2LDcgKzI5NSw3IEBACiAKIAljYXNlIEFNTF9DTEFTU19OQU1FRF9PQkpFQ1Q6CiAKLQkJaWYgKHdhbGtfc3RhdGUtPndhbGtfdHlwZSA9PSBBQ1BJX1dBTEtfTUVUSE9EKSB7CisJCWlmICh3YWxrX3N0YXRlLT53YWxrX3R5cGUgJiBBQ1BJX1dBTEtfTUVUSE9EKSB7CiAJCQkvKgogCQkJICogRm91bmQgYSBuYW1lZCBvYmplY3QgZGVjbGFyYXRpb24gZHVyaW5nIG1ldGhvZCBleGVjdXRpb247CiAJCQkgKiB3ZSBtdXN0IGVudGVyIHRoaXMgb2JqZWN0IGludG8gdGhlIG5hbWVzcGFjZS4gIFRoZSBjcmVhdGVkCkBAIC0zNTQsNyArMzUzLDcgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dF9vcDsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqZmlyc3RfYXJnOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2V4ZWNfZW5kX29wIiwgd2Fsa19zdGF0ZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZXhlY19lbmRfb3AsIHdhbGtfc3RhdGUpOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKIAlvcF90eXBlID0gd2Fsa19zdGF0ZS0+b3BfaW5mby0+dHlwZTsKQEAgLTQwOSw2ICs0MDgsNyBAQAogCQkgKiBiZWluZyB0aGUgb2JqZWN0X3R5cGUgYW5kIHNpemVfb2Ygb3BlcmF0b3JzLgogCQkgKi8KIAkJaWYgKCEod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTk9fT1BFUkFORF9SRVNPTFZFKSkgeworCiAJCQkvKiBSZXNvbHZlIGFsbCBvcGVyYW5kcyAqLwogCiAJCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfb3BlcmFuZHMod2Fsa19zdGF0ZS0+b3Bjb2RlLApAQCAtNDIzLDcgKzQyMyw3IEBACiAJCQkJCQkgICBhY3BpX3BzX2dldF9vcGNvZGVfbmFtZQogCQkJCQkJICAgKHdhbGtfc3RhdGUtPm9wY29kZSksCiAJCQkJCQkgICB3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMsCi0JCQkJCQkgICAiYWZ0ZXIgZXhfcmVzb2x2ZV9vcGVyYW5kcyIpOworCQkJCQkJICAgImFmdGVyIEV4UmVzb2x2ZU9wZXJhbmRzIik7CiAJCQl9CiAJCX0KIApAQCAtNDM3LDcgKzQzNyw3IEBACiAJCQkgICAgYWNwaV9nYmxfb3BfdHlwZV9kaXNwYXRjaFtvcF90eXBlXSAod2Fsa19zdGF0ZSk7CiAJCX0gZWxzZSB7CiAJCQkvKgotCQkJICogVHJlYXQgY29uc3RydWN0cyBvZiB0aGUgZm9ybSAiU3RvcmUobG9jYWxfeCxsb2NhbF94KSIgYXMgbm9vcHMgd2hlbiB0aGUKKwkJCSAqIFRyZWF0IGNvbnN0cnVjdHMgb2YgdGhlIGZvcm0gIlN0b3JlKExvY2FsWCxMb2NhbFgpIiBhcyBub29wcyB3aGVuIHRoZQogCQkJICogTG9jYWwgaXMgdW5pbml0aWFsaXplZC4KIAkJCSAqLwogCQkJaWYgKChzdGF0dXMgPT0gQUVfQU1MX1VOSU5JVElBTElaRURfTE9DQUwpICYmCkBAIC01NDgsNiArNTQ4LDcgQEAKIAkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9kc19yZXNvbHZlX29wZXJhbmRzKHdhbGtfc3RhdGUpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJCQkvKiBPbiBlcnJvciwgY2xlYXIgYWxsIHJlc29sdmVkIG9wZXJhbmRzICovCiAKIAkJCQlhY3BpX2RzX2NsZWFyX29wZXJhbmRzKHdhbGtfc3RhdGUpOwpAQCAtNTY5LDcgKzU3MCw3IEBACiAJCWNhc2UgQU1MX1RZUEVfQ1JFQVRFX0ZJRUxEOgogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCSAgIkV4ZWN1dGluZyBjcmVhdGVfZmllbGQgQnVmZmVyL0luZGV4IE9wPSVwXG4iLAorCQkJCQkgICJFeGVjdXRpbmcgQ3JlYXRlRmllbGQgQnVmZmVyL0luZGV4IE9wPSVwXG4iLAogCQkJCQkgIG9wKSk7CiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfbG9hZDJfZW5kX29wKHdhbGtfc3RhdGUpOwpAQCAtNTg0LDcgKzU4NSw3IEBACiAJCWNhc2UgQU1MX1RZUEVfQ1JFQVRFX09CSkVDVDoKIAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCQkgICJFeGVjdXRpbmcgY3JlYXRlX29iamVjdCAoQnVmZmVyL1BhY2thZ2UpIE9wPSVwXG4iLAorCQkJCQkgICJFeGVjdXRpbmcgQ3JlYXRlT2JqZWN0IChCdWZmZXIvUGFja2FnZSkgT3A9JXBcbiIsCiAJCQkJCSAgb3ApKTsKIAogCQkJc3dpdGNoIChvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLmFtbF9vcGNvZGUpIHsKQEAgLTY1Nyw3ICs2NTgsNyBAQAogCiAJCQlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9SRUdJT05fT1ApIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCQkgICJFeGVjdXRpbmcgb3BfcmVnaW9uIEFkZHJlc3MvTGVuZ3RoIE9wPSVwXG4iLAorCQkJCQkJICAiRXhlY3V0aW5nIE9wUmVnaW9uIEFkZHJlc3MvTGVuZ3RoIE9wPSVwXG4iLAogCQkJCQkJICBvcCkpOwogCiAJCQkJc3RhdHVzID0KQEAgLTcyMiw2ICs3MjMsNyBAQAogICAgICAgY2xlYW51cDoKIAogCWlmICh3YWxrX3N0YXRlLT5yZXN1bHRfb2JqKSB7CisKIAkJLyogQnJlYWsgdG8gZGVidWdnZXIgdG8gZGlzcGxheSByZXN1bHQgKi8KIAogCQlBQ1BJX0RFQlVHR0VSX0VYRUMoYWNwaV9kYl9kaXNwbGF5X3Jlc3VsdF9vYmplY3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd2xvYWQuYwppbmRleCBkM2QyNGRhLi4zNTA3NDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3bG9hZC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAljaGFyICpwYXRoOwogCXUzMiBmbGFnczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2xvYWQxX2JlZ2luX29wIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19sb2FkMV9iZWdpbl9vcCk7CiAKIAlvcCA9IHdhbGtfc3RhdGUtPm9wOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcD0lcCBTdGF0ZT0lcFxuIiwgb3AsCkBAIC0xNzgsMTIgKzE3OCwxMiBAQAogCQkJICogVGFyZ2V0IG9mIFNjb3BlKCkgbm90IGZvdW5kLiAgR2VuZXJhdGUgYW4gRXh0ZXJuYWwgZm9yIGl0LCBhbmQKIAkJCSAqIGluc2VydCB0aGUgbmFtZSBpbnRvIHRoZSBuYW1lc3BhY2UuCiAJCQkgKi8KLQkJCWFjcGlfZG1fYWRkX3RvX2V4dGVybmFsX2xpc3QocGF0aCk7CisJCQlhY3BpX2RtX2FkZF90b19leHRlcm5hbF9saXN0KHBhdGgsIEFDUElfVFlQRV9ERVZJQ0UsIDApOwogCQkJc3RhdHVzID0KIAkJCSAgICBhY3BpX25zX2xvb2t1cCh3YWxrX3N0YXRlLT5zY29wZV9pbmZvLCBwYXRoLAogCQkJCQkgICBvYmplY3RfdHlwZSwgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLAogCQkJCQkgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQsIHdhbGtfc3RhdGUsCi0JCQkJCSAgICYobm9kZSkpOworCQkJCQkgICAmbm9kZSk7CiAJCX0KICNlbmRpZgogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTI2MSw2ICsyNjEsNyBAQAogCQkgKi8KIAogCQlpZiAod2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZSkgeworCiAJCQkvKiBUaGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgbmFtZXNwYWNlLCBnZXQgdGhlIG5vZGUgKi8KIAogCQkJbm9kZSA9IHdhbGtfc3RhdGUtPmRlZmVycmVkX25vZGU7CkBAIC0zMDAsMTAgKzMwMSw0MSBAQAogCQlzdGF0dXMgPQogCQkgICAgYWNwaV9uc19sb29rdXAod2Fsa19zdGF0ZS0+c2NvcGVfaW5mbywgcGF0aCwgb2JqZWN0X3R5cGUsCiAJCQkJICAgQUNQSV9JTU9ERV9MT0FEX1BBU1MxLCBmbGFncywgd2Fsa19zdGF0ZSwKLQkJCQkgICAmKG5vZGUpKTsKKwkJCQkgICAmbm9kZSk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgeworCisJCQkJLyogVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhpcyBzY29wZSAqLworCisJCQkJaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfSVNfRVhURVJOQUwpIHsKKwkJCQkJLyoKKwkJCQkJICogQWxsb3cgb25lIGNyZWF0ZSBvbiBhbiBvYmplY3Qgb3Igc2VnbWVudCB0aGF0IHdhcworCQkJCQkgKiBwcmV2aW91c2x5IGRlY2xhcmVkIEV4dGVybmFsCisJCQkJCSAqLworCQkJCQlub2RlLT5mbGFncyAmPSB+QU5PQkpfSVNfRVhURVJOQUw7CisJCQkJCW5vZGUtPnR5cGUgPSAodTgpIG9iamVjdF90eXBlOworCisJCQkJCS8qIEp1c3QgcmV0eXBlZCBhIG5vZGUsIHByb2JhYmx5IHdpbGwgbmVlZCB0byBvcGVuIGEgc2NvcGUgKi8KKworCQkJCQlpZiAoYWNwaV9uc19vcGVuc19zY29wZShvYmplY3RfdHlwZSkpIHsKKwkJCQkJCXN0YXR1cyA9CisJCQkJCQkgICAgYWNwaV9kc19zY29wZV9zdGFja19wdXNoCisJCQkJCQkgICAgKG5vZGUsIG9iamVjdF90eXBlLAorCQkJCQkJICAgICB3YWxrX3N0YXRlKTsKKwkJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCQkJCXJldHVybl9BQ1BJX1NUQVRVUworCQkJCQkJCSAgICAoc3RhdHVzKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCisJCQkJQUNQSV9FUlJPUl9OQU1FU1BBQ0UocGF0aCwgc3RhdHVzKTsKKwkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJCX0KIAkJfQogCQlicmVhazsKIAl9CkBAIC0zMTEsNiArMzQzLDcgQEAKIAkvKiBDb21tb24gZXhpdCAqLwogCiAJaWYgKCFvcCkgeworCiAJCS8qIENyZWF0ZSBhIG5ldyBvcCAqLwogCiAJCW9wID0gYWNwaV9wc19hbGxvY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUpOwpAQCAtMzU5LDcgKzM5Miw3IEBACiAJYWNwaV9vYmplY3RfdHlwZSBvYmplY3RfdHlwZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2xvYWQxX2VuZF9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDFfZW5kX29wKTsKIAogCW9wID0gd2Fsa19zdGF0ZS0+b3A7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwgIk9wPSVwIFN0YXRlPSVwXG4iLCBvcCwKQEAgLTQxMyw2ICs0NDYsNyBAQAogI2VuZGlmCiAKIAlpZiAob3AtPmNvbW1vbi5hbWxfb3Bjb2RlID09IEFNTF9OQU1FX09QKSB7CisKIAkJLyogRm9yIE5hbWUgb3Bjb2RlLCBnZXQgdGhlIG9iamVjdCB0eXBlIGZyb20gdGhlIGFyZ3VtZW50ICovCiAKIAkJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7CkBAIC00NDUsNyArNDc5LDcgQEAKIAkJCSAqIGFyZ3VtZW50cy4pCiAJCQkgKi8KIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKIAkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKIAogCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7CkBAIC01MTEsNyArNTQ1LDcgQEAKIAlhY3BpX29iamVjdF90eXBlIG9iamVjdF90eXBlOwogCWNoYXIgKmJ1ZmZlcl9wdHI7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19sb2FkMl9iZWdpbl9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfbG9hZDJfYmVnaW5fb3ApOwogCiAJb3AgPSB3YWxrX3N0YXRlLT5vcDsKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0RJU1BBVENILCAiT3A9JXAgU3RhdGU9JXBcbiIsIG9wLApAQCAtNTIxLDYgKzU1NSw3IEBACiAJCWlmICgod2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkgJiYKIAkJICAgICh3YWxrX3N0YXRlLT5jb250cm9sX3N0YXRlLT5jb21tb24uc3RhdGUgPT0KIAkJICAgICBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HKSkgeworCiAJCQkvKiBXZSBhcmUgZXhlY3V0aW5nIGEgd2hpbGUgbG9vcCBvdXRzaWRlIG9mIGEgbWV0aG9kICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfZXhlY19iZWdpbl9vcCh3YWxrX3N0YXRlLCBvdXRfb3ApOwpAQCAtNTU0LDEwICs1ODksMTIgQEAKIAkJLyogR2V0IHRoZSBuYW1lIHdlIGFyZSBnb2luZyB0byBlbnRlciBvciBsb29rdXAgaW4gdGhlIG5hbWVzcGFjZSAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5vcGNvZGUgPT0gQU1MX0lOVF9OQU1FUEFUSF9PUCkgeworCiAJCQkvKiBGb3IgTmFtZXBhdGggb3AsIGdldCB0aGUgcGF0aCBzdHJpbmcgKi8KIAogCQkJYnVmZmVyX3B0ciA9IG9wLT5jb21tb24udmFsdWUuc3RyaW5nOwogCQkJaWYgKCFidWZmZXJfcHRyKSB7CisKIAkJCQkvKiBObyBuYW1lLCBqdXN0IGV4aXQgKi8KIAogCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC02ODAsNiArNzE3LDcgQEAKIAkJLyogQWxsIG90aGVyIG9wY29kZXMgKi8KIAogCQlpZiAob3AgJiYgb3AtPmNvbW1vbi5ub2RlKSB7CisKIAkJCS8qIFRoaXMgb3Avbm9kZSB3YXMgcHJldmlvdXNseSBlbnRlcmVkIGludG8gdGhlIG5hbWVzcGFjZSAqLwogCiAJCQlub2RlID0gb3AtPmNvbW1vbi5ub2RlOwpAQCAtNzA1LDYgKzc0Myw3IEBACiAJCSAqIE5vdGU6IE5hbWUgbWF5IGFscmVhZHkgZXhpc3QgaWYgd2UgYXJlIGV4ZWN1dGluZyBhIGRlZmVycmVkIG9wY29kZS4KIAkJICovCiAJCWlmICh3YWxrX3N0YXRlLT5kZWZlcnJlZF9ub2RlKSB7CisKIAkJCS8qIFRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UsIGdldCB0aGUgbm9kZSAqLwogCiAJCQlub2RlID0gd2Fsa19zdGF0ZS0+ZGVmZXJyZWRfbm9kZTsKQEAgLTcyNyw2ICs3NjYsNyBAQAogCX0KIAogCWlmICghb3ApIHsKKwogCQkvKiBDcmVhdGUgYSBuZXcgb3AgKi8KIAogCQlvcCA9IGFjcGlfcHNfYWxsb2Nfb3Aod2Fsa19zdGF0ZS0+b3Bjb2RlKTsKQEAgLTc3Niw3ICs4MTYsNyBAQAogCXUzMiBpOwogI2VuZGlmCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19sb2FkMl9lbmRfb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2xvYWQyX2VuZF9vcCk7CiAKIAlvcCA9IHdhbGtfc3RhdGUtPm9wOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsICJPcGNvZGUgWyVzXSBPcCAlcCBTdGF0ZSAlcFxuIiwKQEAgLTg3MCw3ICs5MTAsNyBAQAogCSAqLwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9ESVNQQVRDSCwKLQkJCSAgIkNyZWF0ZS1Mb2FkIFslc10gU3RhdGU9JXAgT3A9JXAgbmFtZWRfb2JqPSVwXG4iLAorCQkJICAiQ3JlYXRlLUxvYWQgWyVzXSBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKIAkJCSAgYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUob3AtPmNvbW1vbi5hbWxfb3Bjb2RlKSwKIAkJCSAgd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKIApAQCAtMTA0NSw3ICsxMDg1LDcgQEAKIAkJCSAqIGFyZ3VtZW50cy4pCiAJCQkgKi8KIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkJCSAgIkxPQURJTkctTWV0aG9kOiBTdGF0ZT0lcCBPcD0lcCBOYW1lZE9iaj0lcFxuIiwKIAkJCQkJICB3YWxrX3N0YXRlLCBvcCwgb3AtPm5hbWVkLm5vZGUpKTsKIAogCQkJaWYgKCFhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qob3AtPm5hbWVkLm5vZGUpKSB7CkBAIC0xMDkwLDcgKzExMzAsNyBAQAogCWNhc2UgQU1MX0NMQVNTX01FVEhPRF9DQUxMOgogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCi0JCQkJICAiUkVTT0xWSU5HLW1ldGhvZF9jYWxsOiBTdGF0ZT0lcCBPcD0lcCBuYW1lZF9vYmo9JXBcbiIsCisJCQkJICAiUkVTT0xWSU5HLU1ldGhvZENhbGw6IFN0YXRlPSVwIE9wPSVwIE5hbWVkT2JqPSVwXG4iLAogCQkJCSAgd2Fsa19zdGF0ZSwgb3AsIG5vZGUpKTsKIAogCQkvKgpAQCAtMTEwNCw3ICsxMTQ0LDYgQEAKIAkJCQkgICBBQ1BJX05TX0RPTlRfT1BFTl9TQ09QRSwgd2Fsa19zdGF0ZSwKIAkJCQkgICAmKG5ld19ub2RlKSk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCiAJCQkvKgogCQkJICogTWFrZSBzdXJlIHRoYXQgd2hhdCB3ZSBmb3VuZCBpcyBpbmRlZWQgYSBtZXRob2QKIAkJCSAqIFdlIGRpZG4ndCBzZWFyY2ggZm9yIGEgbWV0aG9kIG9uIHB1cnBvc2UsIHRvIHNlZSBpZiB0aGUgbmFtZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3Njb3BlLmMKaW5kZXggYWRhMjFlZi4uYzkyMjg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzY29wZS5jCkBAIC02Myw5ICs2MywxMCBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfc2NvcGVfc3RhY2tfY2xlYXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfc2NvcGVfc3RhY2tfY2xlYXIpOwogCiAJd2hpbGUgKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8pIHsKKwogCQkvKiBQb3AgYSBzY29wZSBvZmYgdGhlIHN0YWNrICovCiAKIAkJc2NvcGVfaW5mbyA9IHdhbGtfc3RhdGUtPnNjb3BlX2luZm87CkBAIC0xMDIsOSArMTAzLDEwIEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqb2xkX3Njb3BlX2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zY29wZV9zdGFja19wdXNoIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShkc19zY29wZV9zdGFja19wdXNoKTsKIAogCWlmICghbm9kZSkgeworCiAJCS8qIEludmFsaWQgc2NvcGUgICAqLwogCiAJCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIHNjb3BlIHBhcmFtZXRlciIpKTsKQEAgLTEyNiw3ICsxMjgsNyBAQAogCiAJLyogSW5pdCBuZXcgc2NvcGUgb2JqZWN0ICovCiAKLQlzY29wZV9pbmZvLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfV1NDT1BFOworCXNjb3BlX2luZm8tPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9XU0NPUEU7CiAJc2NvcGVfaW5mby0+c2NvcGUubm9kZSA9IG5vZGU7CiAJc2NvcGVfaW5mby0+Y29tbW9uLnZhbHVlID0gKHUxNikgdHlwZTsKIApAQCAtMTc2LDcgKzE3OCw3IEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzY29wZV9pbmZvOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqbmV3X3Njb3BlX2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19zY29wZV9zdGFja19wb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX3Njb3BlX3N0YWNrX3BvcCk7CiAKIAkvKgogCSAqIFBvcCBzY29wZSBpbmZvIG9iamVjdCBvZmYgdGhlIHN0YWNrLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2Rzd3N0YXRlLmMKaW5kZXggZmE3OGNiNy4uNzgxN2U1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHN3c3RhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc3dzdGF0ZS5jCkBAIC02Niw3ICs2Niw2IEBACiAjZW5kaWYKIAogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZHNfcmVzdWx0X3JlbW92ZQpAQCAtODgsNyArODcsNyBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9yZW1vdmUiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfcmVzdWx0X3JlbW92ZSk7CiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewpAQCAtMTI4LDcgKzEyNyw2IEBACiAKIAlyZXR1cm4gKEFFX09LKTsKIH0KLQogI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE1Miw3ICsxNTAsNyBAQAogCWFjcGlfbmF0aXZlX3VpbnQgaW5kZXg7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3BvcCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfcG9wKTsKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7CkBAIC0xNzAsNiArMTY4LDcgQEAKIAlzdGF0ZS0+cmVzdWx0cy5udW1fcmVzdWx0cy0tOwogCiAJZm9yIChpbmRleCA9IEFDUElfT0JKX05VTV9PUEVSQU5EUzsgaW5kZXg7IGluZGV4LS0pIHsKKwogCQkvKiBDaGVjayBmb3IgYSB2YWxpZCByZXN1bHQgb2JqZWN0ICovCiAKIAkJaWYgKHN0YXRlLT5yZXN1bHRzLm9ial9kZXNjW2luZGV4IC0gMV0pIHsKQEAgLTIxMyw3ICsyMTIsNyBAQAogCWFjcGlfbmF0aXZlX3VpbnQgaW5kZXg7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfcmVzdWx0X3BvcF9mcm9tX2JvdHRvbSIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfcG9wX2Zyb21fYm90dG9tKTsKIAogCXN0YXRlID0gd2Fsa19zdGF0ZS0+cmVzdWx0czsKIAlpZiAoIXN0YXRlKSB7CkBAIC0yNzgsNyArMjc3LDcgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfcHVzaCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfcHVzaCk7CiAKIAlzdGF0ZSA9IHdhbGtfc3RhdGUtPnJlc3VsdHM7CiAJaWYgKCFzdGF0ZSkgewpAQCAtMzMxLDE0ICszMzAsMTQgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfc3RhY2tfcHVzaCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19yZXN1bHRfc3RhY2tfcHVzaCk7CiAKIAlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKIAlpZiAoIXN0YXRlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1JFU1VMVDsKKwlzdGF0ZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1JFU1VMVDsKIAlhY3BpX3V0X3B1c2hfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cywgc3RhdGUpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiUmVzdWx0cz0lcCBTdGF0ZT0lcFxuIiwKQEAgLTM2Myw3ICszNjIsNyBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX3Jlc3VsdF9zdGFja19wb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfcmVzdWx0X3N0YWNrX3BvcCk7CiAKIAkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKQEAgLTM3Niw3ICszNzUsNyBAQAogCXN0YXRlID0gYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZSgmd2Fsa19zdGF0ZS0+cmVzdWx0cyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkgICJSZXN1bHQ9JXAgcmVtYWluaW5nX3Jlc3VsdHM9JVggU3RhdGU9JXBcbiIsCisJCQkgICJSZXN1bHQ9JXAgUmVtYWluaW5nUmVzdWx0cz0lWCBTdGF0ZT0lcFxuIiwKIAkJCSAgc3RhdGUsIHN0YXRlLT5yZXN1bHRzLm51bV9yZXN1bHRzLCB3YWxrX3N0YXRlKSk7CiAKIAlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHN0YXRlKTsKQEAgLTQwMCw3ICszOTksNyBAQAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfb2JqX3N0YWNrX3B1c2godm9pZCAqb2JqZWN0LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICogd2Fsa19zdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wdXNoIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX29ial9zdGFja19wdXNoKTsKIAogCS8qIENoZWNrIGZvciBzdGFjayBvdmVyZmxvdyAqLwogCkBAIC00NDUsOSArNDQ0LDEwIEBACiB7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZHNfb2JqX3N0YWNrX3BvcCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcG9wX2NvdW50OyBpKyspIHsKKwogCQkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKIAkJaWYgKHdhbGtfc3RhdGUtPm51bV9vcGVyYW5kcyA9PSAwKSB7CkBAIC00OTEsOSArNDkxLDEwIEBACiAJdTMyIGk7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImRzX29ial9zdGFja19wb3BfYW5kX2RlbGV0ZSIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19vYmpfc3RhY2tfcG9wX2FuZF9kZWxldGUpOwogCiAJZm9yIChpID0gMDsgaSA8IHBvcF9jb3VudDsgaSsrKSB7CisKIAkJLyogQ2hlY2sgZm9yIHN0YWNrIHVuZGVyZmxvdyAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5udW1fb3BlcmFuZHMgPT0gMCkgewpAQCAtNTM4LDEzICs1MzksMTMgQEAKIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKmFjcGlfZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZShzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUKIAkJCQkJCSAgICAgICAqdGhyZWFkKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSgiZHNfZ2V0X2N1cnJlbnRfd2Fsa19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19nZXRfY3VycmVudF93YWxrX3N0YXRlKTsKIAogCWlmICghdGhyZWFkKSB7CiAJCXJldHVybiAoTlVMTCk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwgIkN1cnJlbnQgd2Fsa19zdGF0ZSAlcFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLCAiQ3VycmVudCBXYWxrU3RhdGUgJXBcbiIsCiAJCQkgIHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0KSk7CiAKIAlyZXR1cm4gKHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0KTsKQEAgLTU2Nyw3ICs1NjgsNyBAQAogYWNwaV9kc19wdXNoX3dhbGtfc3RhdGUoc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZSwKIAkJCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX3B1c2hfd2Fsa19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfcHVzaF93YWxrX3N0YXRlKTsKIAogCXdhbGtfc3RhdGUtPm5leHQgPSB0aHJlYWQtPndhbGtfc3RhdGVfbGlzdDsKIAl0aHJlYWQtPndhbGtfc3RhdGVfbGlzdCA9IHdhbGtfc3RhdGU7CkBAIC01OTMsMTEgKzU5NCwxMiBAQAogewogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJkc19wb3Bfd2Fsa19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZHNfcG9wX3dhbGtfc3RhdGUpOwogCiAJd2Fsa19zdGF0ZSA9IHRocmVhZC0+d2Fsa19zdGF0ZV9saXN0OwogCiAJaWYgKHdhbGtfc3RhdGUpIHsKKwogCQkvKiBOZXh0IHdhbGsgc3RhdGUgYmVjb21lcyB0aGUgY3VycmVudCB3YWxrIHN0YXRlICovCiAKIAkJdGhyZWFkLT53YWxrX3N0YXRlX2xpc3QgPSB3YWxrX3N0YXRlLT5uZXh0OwpAQCAtNjE4LDcgKzYyMCw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIG93bmVyX2lkICAgICAgICAtIElEIGZvciBvYmplY3QgY3JlYXRpb24KICAqICAgICAgICAgICAgICBPcmlnaW4gICAgICAgICAgLSBTdGFydGluZyBwb2ludCBmb3IgdGhpcyB3YWxrCi0gKiAgICAgICAgICAgICAgbXRoX2Rlc2MgICAgICAgIC0gTWV0aG9kIG9iamVjdAorICogICAgICAgICAgICAgIG1ldGhvZF9kZXNjICAgICAtIE1ldGhvZCBvYmplY3QKICAqICAgICAgICAgICAgICBUaHJlYWQgICAgICAgICAgLSBDdXJyZW50IHRocmVhZCBzdGF0ZQogICoKICAqIFJFVFVSTjogICAgICBQb2ludGVyIHRvIHRoZSBuZXcgd2FsayBzdGF0ZS4KQEAgLTYzMiwyNCArNjM0LDI0IEBACiAJCQkJCQkgIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0CiAJCQkJCQkgICpvcmlnaW4sCiAJCQkJCQkgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKLQkJCQkJCSAgKm10aF9kZXNjLAorCQkJCQkJICAqbWV0aG9kX2Rlc2MsCiAJCQkJCQkgIHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZQogCQkJCQkJICAqdGhyZWFkKQogewogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZHNfY3JlYXRlX3dhbGtfc3RhdGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2NyZWF0ZV93YWxrX3N0YXRlKTsKIAotCXdhbGtfc3RhdGUgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUpKTsKKwl3YWxrX3N0YXRlID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUpKTsKIAlpZiAoIXdhbGtfc3RhdGUpIHsKIAkJcmV0dXJuX1BUUihOVUxMKTsKIAl9CiAKLQl3YWxrX3N0YXRlLT5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9XQUxLOworCXdhbGtfc3RhdGUtPmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1dBTEs7CisJd2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MgPSBtZXRob2RfZGVzYzsKIAl3YWxrX3N0YXRlLT5vd25lcl9pZCA9IG93bmVyX2lkOwogCXdhbGtfc3RhdGUtPm9yaWdpbiA9IG9yaWdpbjsKLQl3YWxrX3N0YXRlLT5tZXRob2RfZGVzYyA9IG10aF9kZXNjOwogCXdhbGtfc3RhdGUtPnRocmVhZCA9IHRocmVhZDsKIAogCXdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5zdGFydF9vcCA9IG9yaWdpbjsKQEAgLTY2NCw3ICs2NjYsNyBAQAogCiAJc3RhdHVzID0gYWNwaV9kc19yZXN1bHRfc3RhY2tfcHVzaCh3YWxrX3N0YXRlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9NRU1fRlJFRSh3YWxrX3N0YXRlKTsKKwkJQUNQSV9GUkVFKHdhbGtfc3RhdGUpOwogCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KIApAQCAtNzAxLDEzICs3MDMsMTMgQEAKIAkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlLAogCQkgICAgICB1OCAqIGFtbF9zdGFydCwKIAkJICAgICAgdTMyIGFtbF9sZW5ndGgsCi0JCSAgICAgIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1OCBwYXNzX251bWJlcikKKwkJICAgICAgc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTggcGFzc19udW1iZXIpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGUgPSAmd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpleHRyYV9vcDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImRzX2luaXRfYW1sX3dhbGsiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGRzX2luaXRfYW1sX3dhbGspOwogCiAJd2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLmFtbCA9CiAJICAgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc3RhcnQgPSBhbWxfc3RhcnQ7CkBAIC03NzgsNiArNzgwLDcgQEAKIAkJfQogCiAJCWlmIChwYXJzZXJfc3RhdGUtPnN0YXJ0X25vZGUpIHsKKwogCQkJLyogUHVzaCBzdGFydCBzY29wZSBvbiBzY29wZSBzdGFjayBhbmQgbWFrZSBpdCBjdXJyZW50ICAqLwogCiAJCQlzdGF0dXMgPQpAQCAtODEwLDIxICs4MTMsMjQgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX2RlbGV0ZV93YWxrX3N0YXRlIiwgd2Fsa19zdGF0ZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfZGVsZXRlX3dhbGtfc3RhdGUsIHdhbGtfc3RhdGUpOwogCiAJaWYgKCF3YWxrX3N0YXRlKSB7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAod2Fsa19zdGF0ZS0+ZGF0YV90eXBlICE9IEFDUElfREVTQ19UWVBFX1dBTEspIHsKKwlpZiAod2Fsa19zdGF0ZS0+ZGVzY3JpcHRvcl90eXBlICE9IEFDUElfREVTQ19UWVBFX1dBTEspIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywgIiVwIGlzIG5vdCBhIHZhbGlkIHdhbGsgc3RhdGUiLAogCQkJICAgIHdhbGtfc3RhdGUpKTsKIAkJcmV0dXJuOwogCX0KIAorCS8qIFRoZXJlIHNob3VsZCBub3QgYmUgYW55IG9wZW4gc2NvcGVzICovCisKIAlpZiAod2Fsa19zdGF0ZS0+cGFyc2VyX3N0YXRlLnNjb3BlKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICIlcCB3YWxrIHN0aWxsIGhhcyBhIHNjb3BlIGxpc3QiLAogCQkJICAgIHdhbGtfc3RhdGUpKTsKKwkJYWNwaV9wc19jbGVhbnVwX3Njb3BlKCZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGUpOwogCX0KIAogCS8qIEFsd2F5cyBtdXN0IGZyZWUgYW55IGxpbmtlZCBjb250cm9sIHN0YXRlcyAqLwpAQCAtODU0LDcgKzg2MCw3IEBACiAJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUoc3RhdGUpOwogCX0KIAotCUFDUElfTUVNX0ZSRUUod2Fsa19zdGF0ZSk7CisJQUNQSV9GUkVFKHdhbGtfc3RhdGUpOwogCXJldHVybl9WT0lEOwogfQogCkBAIC04NzksNyArODg1LDcgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnN0YXRlOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19yZXN1bHRfaW5zZXJ0Iik7CisJQUNQSV9GVU5DVElPTl9OQU1FKGRzX3Jlc3VsdF9pbnNlcnQpOwogCiAJc3RhdGUgPSB3YWxrX3N0YXRlLT5yZXN1bHRzOwogCWlmICghc3RhdGUpIHsKQEAgLTkzNyw3ICs5NDMsNyBAQAogewogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX29ial9zdGFja19kZWxldGVfYWxsIiwgd2Fsa19zdGF0ZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZHNfb2JqX3N0YWNrX2RlbGV0ZV9hbGwsIHdhbGtfc3RhdGUpOwogCiAJLyogVGhlIHN0YWNrIHNpemUgaXMgY29uZmlndXJhYmxlLCBidXQgZml4ZWQgKi8KIApAQCAtOTY5LDcgKzk3NSw3IEBACiBhY3BpX2RzX29ial9zdGFja19wb3Bfb2JqZWN0KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvYmplY3QsCiAJCQkgICAgIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FKCJkc19vYmpfc3RhY2tfcG9wX29iamVjdCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShkc19vYmpfc3RhY2tfcG9wX29iamVjdCk7CiAKIAkvKiBDaGVjayBmb3Igc3RhY2sgdW5kZXJmbG93ICovCiAKQEAgLTEwMjUsNyArMTAzMSw3IEBACiB2b2lkICphY3BpX2RzX29ial9zdGFja19nZXRfdmFsdWUodTMyIGluZGV4LCBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImRzX29ial9zdGFja19nZXRfdmFsdWUiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihkc19vYmpfc3RhY2tfZ2V0X3ZhbHVlLCB3YWxrX3N0YXRlKTsKIAogCS8qIENhbid0IGRvIGl0IGlmIHRoZSBzdGFjayBpcyBlbXB0eSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZWMuYyBiL2RyaXZlcnMvYWNwaS9lYy5jCmluZGV4IGVlZTA4NjQuLjE4YjNlYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9lYy5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGNvbW1hbmRfYWRkcjsKIAkJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGRhdGFfYWRkcjsKIAkJdW5zaWduZWQgbG9uZyBnbG9iYWxfbG9jazsKLQkJc3BpbmxvY2tfdCBsb2NrOworCQlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIAl9IHBvbGw7CiB9OwogCkBAIC0zMjMsNyArMzIzLDYgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlpbnQgcmVzdWx0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAl1MzIgZ2xrID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcmVhZCIpOwpAQCAtMzM5LDggKzMzOCwxMSBAQAogCQkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+cG9sbC5sb2NrLCBmbGFncyk7Ci0KKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZlYy0+cG9sbC5zZW0pKSB7CisJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwkJZ290byBlbmRfbm9zZW07CisJfQorCQogCWFjcGlfaHdfbG93X2xldmVsX3dyaXRlKDgsIEFDUElfRUNfQ09NTUFORF9SRUFELAogCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CkBAIC0zNTgsOCArMzYwLDggQEAKIAkJCSAgKmRhdGEsIGFkZHJlc3MpKTsKIAogICAgICAgZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5wb2xsLmxvY2ssIGZsYWdzKTsKLQorCXVwKCZlYy0+cG9sbC5zZW0pOworZW5kX25vc2VtOgogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIApAQCAtMzcwLDcgKzM3Miw2IEBACiB7CiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CiAJdTMyIGdsayA9IDA7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX3dyaXRlIik7CkBAIC0zODQsOCArMzg1LDExIEBACiAJCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5wb2xsLmxvY2ssIGZsYWdzKTsKLQorCWlmIChkb3duX2ludGVycnVwdGlibGUoJmVjLT5wb2xsLnNlbSkpIHsKKwkJcmVzdWx0ID0gLUVSRVNUQVJUU1lTOworCQlnb3RvIGVuZF9ub3NlbTsKKwl9CisJCiAJYWNwaV9od19sb3dfbGV2ZWxfd3JpdGUoOCwgQUNQSV9FQ19DT01NQU5EX1dSSVRFLAogCQkJCSZlYy0+Y29tbW9uLmNvbW1hbmRfYWRkcik7CiAJcmVzdWx0ID0gYWNwaV9lY193YWl0KGVjLCBBQ1BJX0VDX0VWRU5UX0lCRSk7CkBAIC00MDYsOCArNDEwLDggQEAKIAkJCSAgZGF0YSwgYWRkcmVzcykpOwogCiAgICAgICBlbmQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOwotCisJdXAoJmVjLT5wb2xsLnNlbSk7CitlbmRfbm9zZW06CiAJaWYgKGVjLT5jb21tb24uZ2xvYmFsX2xvY2spCiAJCWFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayhnbGspOwogCkBAIC01NjgsNyArNTcyLDYgQEAKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAl1MzIgZ2xrID0gMDsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZWNfcXVlcnkiKTsKQEAgLTU4OSw4ICs1OTIsMTEgQEAKIAkgKiBOb3RlIHRoYXQgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIHRoZSBxdWVyeSBjYXVzZXMgdGhlIEFDUElfRUNfU0NJCiAJICogYml0IHRvIGJlIGNsZWFyZWQgKGFuZCB0aHVzIGNsZWFyaW5nIHRoZSBpbnRlcnJ1cHQgc291cmNlKS4KIAkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOwotCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZWMtPnBvbGwuc2VtKSkgeworCQlyZXN1bHQgPSAtRVJFU1RBUlRTWVM7CisJCWdvdG8gZW5kX25vc2VtOworCX0KKwkKIAlhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCBBQ1BJX0VDX0NPTU1BTkRfUVVFUlksCiAJCQkJJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKIAlyZXN1bHQgPSBhY3BpX2VjX3dhaXQoZWMsIEFDUElfRUNfRVZFTlRfT0JGKTsKQEAgLTYwMiw4ICs2MDgsOCBAQAogCQlyZXN1bHQgPSAtRU5PREFUQTsKIAogICAgICAgZW5kOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5wb2xsLmxvY2ssIGZsYWdzKTsKLQorCXVwKCZlYy0+cG9sbC5zZW0pOworZW5kX25vc2VtOgogCWlmIChlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKQogCQlhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2soZ2xrKTsKIApAQCAtNjgwLDcgKzY4Niw2IEBACiB7CiAJdW5pb24gYWNwaV9lYyAqZWMgPSAodW5pb24gYWNwaV9lYyAqKWVjX2N4dDsKIAl1MzIgdmFsdWUgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCXN0YXRpYyBjaGFyIG9iamVjdF9uYW1lWzVdID0geyAnXycsICdRJywgJzAnLCAnMCcsICdcMCcgfTsKIAljb25zdCBjaGFyIGhleFtdID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKIAkJJzgnLCAnOScsICdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicKQEAgLTY5MSw5ICs2OTYsMTEgQEAKIAlpZiAoIWVjX2N4dCkKIAkJZ290byBlbmQ7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPnBvbGwubG9jaywgZmxhZ3MpOworCWlmIChkb3duX2ludGVycnVwdGlibGUgKCZlYy0+cG9sbC5zZW0pKSB7CisJCXJldHVybl9WT0lEOworCX0KIAlhY3BpX2h3X2xvd19sZXZlbF9yZWFkKDgsICZ2YWx1ZSwgJmVjLT5jb21tb24uY29tbWFuZF9hZGRyKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+cG9sbC5sb2NrLCBmbGFncyk7CisJdXAoJmVjLT5wb2xsLnNlbSk7CiAKIAkvKiBUQkQ6IEltcGxlbWVudCBhc3luY2ggZXZlbnRzIQogCSAqIE5PVEU6IEFsbCB3ZSBjYXJlIGFib3V0IGFyZSBFQy1TQ0kncy4gIE90aGVyIEVDIGV2ZW50cyBhcmUKQEAgLTc2Myw4ICs3NzAsNyBAQAogCiAJYWNwaV9kaXNhYmxlX2dwZShOVUxMLCBlYy0+Y29tbW9uLmdwZV9iaXQsIEFDUElfSVNSKTsKIAotCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAotCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CisJc3RhdHVzID0gYWNwaV9vc19leGVjdXRlKE9TTF9FQ19QT0xMX0hBTkRMRVIsIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CiAKIAlpZiAoc3RhdHVzID09IEFFX09LKQogCQlyZXR1cm4gQUNQSV9JTlRFUlJVUFRfSEFORExFRDsKQEAgLTc5OSw3ICs4MDUsNyBAQAogCiAJaWYgKHZhbHVlICYgQUNQSV9FQ19GTEFHX1NDSSkgewogCQlhdG9taWNfYWRkKDEsICZlYy0+aW50ci5wZW5kaW5nX2dwZSk7Ci0JCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAorCQlzdGF0dXMgPSBhY3BpX29zX2V4ZWN1dGUoT1NMX0VDX0JVUlNUX0hBTkRMRVIsCiAJCQkJCQkgICAgIGFjcGlfZWNfZ3BlX3F1ZXJ5LCBlYyk7CiAJCXJldHVybiBzdGF0dXMgPT0gQUVfT0sgPwogCQkgICAgQUNQSV9JTlRFUlJVUFRfSEFORExFRCA6IEFDUElfSU5URVJSVVBUX05PVF9IQU5ETEVEOwpAQCAtOTkxLDcgKzk5Nyw2IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9lYyAqZWMgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgdWlkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lY19hZGQiKTsKIApAQCAtMTAwNSw3ICsxMDEwLDcgQEAKIAogCWVjLT5jb21tb24uaGFuZGxlID0gZGV2aWNlLT5oYW5kbGU7CiAJZWMtPmNvbW1vbi51aWQgPSAtMTsKLQlzcGluX2xvY2tfaW5pdCgmZWMtPnBvbGwubG9jayk7CisJaW5pdF9NVVRFWCgmZWMtPnBvbGwuc2VtKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX0VDX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9FQ19DTEFTUyk7CiAJYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpID0gZWM7CkBAIC0xMDE0LDEwICsxMDE5LDkgQEAKIAlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR0xLIiwgTlVMTCwKIAkJCSAgICAgICZlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKTsKIAotCS8qIElmIG91ciBVSUQgbWF0Y2hlcyB0aGUgVUlEIGZvciB0aGUgRUNEVC1lbnVtZXJhdGVkIEVDLAotCSAgIHdlIG5vdyBoYXZlIHRoZSAqcmVhbCogRUMgaW5mbywgc28ga2lsbCB0aGUgbWFrZXNoaWZ0IG9uZS4gKi8KLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfVUlEIiwgTlVMTCwgJnVpZCk7Ci0JaWYgKGVjX2VjZHQgJiYgZWNfZWNkdC0+Y29tbW9uLnVpZCA9PSB1aWQpIHsKKwkvKiBYWFggd2UgZG9uJ3QgdGVzdCB1aWRzLCBiZWNhdXNlIG9uIHNvbWUgYm94ZXMgZWNkdCB1aWQgPSAwLCBzZWU6CisJICAgaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTEgKi8KKwlpZiAoZWNfZWNkdCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCiAJCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwpAQCAtMTA2Miw3ICsxMDY2LDYgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1bmlvbiBhY3BpX2VjICplYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyB1aWQ7CiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VjX2FkZCIpOwogCkBAIC0xMDg4LDEwICsxMDkxLDkgQEAKIAlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfR0xLIiwgTlVMTCwKIAkJCSAgICAgICZlYy0+Y29tbW9uLmdsb2JhbF9sb2NrKTsKIAotCS8qIElmIG91ciBVSUQgbWF0Y2hlcyB0aGUgVUlEIGZvciB0aGUgRUNEVC1lbnVtZXJhdGVkIEVDLAotCSAgIHdlIG5vdyBoYXZlIHRoZSAqcmVhbCogRUMgaW5mbywgc28ga2lsbCB0aGUgbWFrZXNoaWZ0IG9uZS4gKi8KLQlhY3BpX2V2YWx1YXRlX2ludGVnZXIoZWMtPmNvbW1vbi5oYW5kbGUsICJfVUlEIiwgTlVMTCwgJnVpZCk7Ci0JaWYgKGVjX2VjZHQgJiYgZWNfZWNkdC0+Y29tbW9uLnVpZCA9PSB1aWQpIHsKKwkvKiBYWFggd2UgZG9uJ3QgdGVzdCB1aWRzLCBiZWNhdXNlIG9uIHNvbWUgYm94ZXMgZWNkdCB1aWQgPSAwLCBzZWU6CisJICAgaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19idWcuY2dpP2lkPTYxMTEgKi8KKwlpZiAoZWNfZWNkdCkgewogCQlhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIoQUNQSV9ST09UX09CSkVDVCwKIAkJCQkJCSAgQUNQSV9BRFJfU1BBQ0VfRUMsCiAJCQkJCQkgICZhY3BpX2VjX3NwYWNlX2hhbmRsZXIpOwpAQCAtMTMwMCw3ICsxMzAyLDcgQEAKIAkJCQkgICZlY19lY2R0LT5jb21tb24uZ3BlX2JpdCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQogCQlyZXR1cm4gc3RhdHVzOwotCXNwaW5fbG9ja19pbml0KCZlY19lY2R0LT5wb2xsLmxvY2spOworCWluaXRfTVVURVgoJmVjX2VjZHQtPnBvbGwuc2VtKTsKIAllY19lY2R0LT5jb21tb24uZ2xvYmFsX2xvY2sgPSBUUlVFOwogCWVjX2VjZHQtPmNvbW1vbi5oYW5kbGUgPSBoYW5kbGU7CiAKQEAgLTE0MTYsNyArMTQxOCw3IEBACiAJZWNfZWNkdC0+Y29tbW9uLnN0YXR1c19hZGRyID0gZWNkdF9wdHItPmVjX2NvbnRyb2w7CiAJZWNfZWNkdC0+Y29tbW9uLmRhdGFfYWRkciA9IGVjZHRfcHRyLT5lY19kYXRhOwogCWVjX2VjZHQtPmNvbW1vbi5ncGVfYml0ID0gZWNkdF9wdHItPmdwZV9iaXQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmVjX2VjZHQtPnBvbGwubG9jayk7CisJaW5pdF9NVVRFWCgmZWNfZWNkdC0+cG9sbC5zZW0pOwogCS8qIHVzZSB0aGUgR0wganVzdCB0byBiZSBzYWZlICovCiAJZWNfZWNkdC0+Y29tbW9uLmdsb2JhbF9sb2NrID0gVFJVRTsKIAllY19lY2R0LT5jb21tb24udWlkID0gZWNkdF9wdHItPnVpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZldmVudC5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKaW5kZXggYzlhYzA1Yy4uOTE5MDM3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmV2ZW50LmMKQEAgLTY4LDcgKzY4LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbml0aWFsaXplX2V2ZW50cyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5pdGlhbGl6ZV9ldmVudHMpOwogCiAJLyogTWFrZSBzdXJlIHdlIGhhdmUgQUNQSSB0YWJsZXMgKi8KIApAQCAtMTE4LDcgKzExOCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9mYWR0X2dwZXMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfZmFkdF9ncGVzKTsKIAogCS8qIE5hbWVzcGFjZSBtdXN0IGJlIGxvY2tlZCAqLwogCkBAIC0xNTcsNyArMTU3LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX3hydXB0X2hhbmRsZXJzKTsKIAogCS8qIEluc3RhbGwgdGhlIFNDSSBoYW5kbGVyICovCiAKQEAgLTI0MSw3ICsyNDEsNyBAQAogCXUzMiBmaXhlZF9lbmFibGU7CiAJYWNwaV9uYXRpdmVfdWludCBpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJldl9maXhlZF9ldmVudF9kZXRlY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZml4ZWRfZXZlbnRfZGV0ZWN0KTsKIAogCS8qCiAJICogUmVhZCB0aGUgZml4ZWQgZmVhdHVyZSBzdGF0dXMgYW5kIGVuYWJsZSByZWdpc3RlcnMsIGFzIGFsbCB0aGUgY2FzZXMKQEAgLTI2MCwxMiArMjYwLDE0IEBACiAJICogQ2hlY2sgZm9yIGFsbCBwb3NzaWJsZSBGaXhlZCBFdmVudHMgYW5kIGRpc3BhdGNoIHRob3NlIHRoYXQgYXJlIGFjdGl2ZQogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9GSVhFRF9FVkVOVFM7IGkrKykgeworCiAJCS8qIEJvdGggdGhlIHN0YXR1cyBhbmQgZW5hYmxlIGJpdHMgbXVzdCBiZSBvbiBmb3IgdGhpcyBldmVudCAqLwogCiAJCWlmICgoZml4ZWRfc3RhdHVzICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KIAkJICAgICBzdGF0dXNfYml0X21hc2spCiAJCSAgICAmJiAoZml4ZWRfZW5hYmxlICYgYWNwaV9nYmxfZml4ZWRfZXZlbnRfaW5mb1tpXS4KIAkJCWVuYWJsZV9iaXRfbWFzaykpIHsKKwogCQkJLyogRm91bmQgYW4gYWN0aXZlIChzaWduYWxsZWQpIGV2ZW50ICovCiAKIAkJCWludF9zdGF0dXMgfD0gYWNwaV9ldl9maXhlZF9ldmVudF9kaXNwYXRjaCgodTMyKSBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYwppbmRleCBmNjRmOTc3Li5mMDFkMzM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCkBAIC02OSw3ICs2OSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfc2V0X2dwZV90eXBlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9zZXRfZ3BlX3R5cGUpOwogCiAJLyogVmFsaWRhdGUgdHlwZSBhbmQgdXBkYXRlIHJlZ2lzdGVyIGVuYWJsZSBtYXNrcyAqLwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIAlzdHJ1Y3QgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbyAqZ3BlX3JlZ2lzdGVyX2luZm87CiAJdTggcmVnaXN0ZXJfYml0OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfdXBkYXRlX2dwZV9lbmFibGVfbWFza3MiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3VwZGF0ZV9ncGVfZW5hYmxlX21hc2tzKTsKIAogCWdwZV9yZWdpc3Rlcl9pbmZvID0gZ3BlX2V2ZW50X2luZm8tPnJlZ2lzdGVyX2luZm87CiAJaWYgKCFncGVfcmVnaXN0ZXJfaW5mbykgewpAQCAtMTc4LDcgKzE3OCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZW5hYmxlX2dwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZW5hYmxlX2dwZSk7CiAKIAkvKiBNYWtlIHN1cmUgSFcgZW5hYmxlIG1hc2tzIGFyZSB1cGRhdGVkICovCiAKQEAgLTIwNyw2ICsyMDcsNyBAQAogCQlBQ1BJX1NFVF9CSVQoZ3BlX2V2ZW50X2luZm8tPmZsYWdzLCBBQ1BJX0dQRV9SVU5fRU5BQkxFRCk7CiAKIAkJaWYgKHdyaXRlX3RvX2hhcmR3YXJlKSB7CisKIAkJCS8qIENsZWFyIHRoZSBHUEUgKG9mIHN0YWxlIGV2ZW50cyksIHRoZW4gZW5hYmxlIGl0ICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfaHdfY2xlYXJfZ3BlKGdwZV9ldmVudF9pbmZvKTsKQEAgLTI0Myw3ICsyNDQsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2Rpc2FibGVfZ3BlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9kaXNhYmxlX2dwZSk7CiAKIAlpZiAoIShncGVfZXZlbnRfaW5mby0+ZmxhZ3MgJiBBQ1BJX0dQRV9FTkFCTEVfTUFTSykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTMxMyw2ICszMTQsNyBAQAogCS8qIEEgTlVMTCBncGVfYmxvY2sgbWVhbnMgdXNlIHRoZSBGQURULWRlZmluZWQgR1BFIGJsb2NrKHMpICovCiAKIAlpZiAoIWdwZV9kZXZpY2UpIHsKKwogCQkvKiBFeGFtaW5lIEdQRSBCbG9jayAwIGFuZCAxIChUaGVzZSBibG9ja3MgYXJlIHBlcm1hbmVudCkgKi8KIAogCQlmb3IgKGkgPSAwOyBpIDwgQUNQSV9NQVhfR1BFX0JMT0NLUzsgaSsrKSB7CkBAIC0zODAsMTAgKzM4MiwxMSBAQAogCXUzMiBzdGF0dXNfcmVnOwogCXUzMiBlbmFibGVfcmVnOwogCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOworCWFjcGlfY3B1X2ZsYWdzIGh3X2ZsYWdzOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAlhY3BpX25hdGl2ZV91aW50IGo7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImV2X2dwZV9kZXRlY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfZ3BlX2RldGVjdCk7CiAKIAkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlcmUgYXJlIG5vIEdQRXMgKi8KIApAQCAtMzkxLDkgKzM5NCwxMiBAQAogCQlyZXR1cm4gKGludF9zdGF0dXMpOwogCX0KIAotCS8qIEV4YW1pbmUgYWxsIEdQRSBibG9ja3MgYXR0YWNoZWQgdG8gdGhpcyBpbnRlcnJ1cHQgbGV2ZWwgKi8KKwkvKiBXZSBuZWVkIHRvIGhvbGQgdGhlIEdQRSBsb2NrIG5vdywgaGFyZHdhcmUgbG9jayBpbiB0aGUgbG9vcCAqLwogCiAJZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9ncGVfbG9jayk7CisKKwkvKiBFeGFtaW5lIGFsbCBHUEUgYmxvY2tzIGF0dGFjaGVkIHRvIHRoaXMgaW50ZXJydXB0IGxldmVsICovCisKIAlncGVfYmxvY2sgPSBncGVfeHJ1cHRfbGlzdC0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAl3aGlsZSAoZ3BlX2Jsb2NrKSB7CiAJCS8qCkBAIC00MDIsMTAgKzQwOCwxMyBAQAogCQkgKiBGaW5kIGFsbCBjdXJyZW50bHkgYWN0aXZlIEdQIGV2ZW50cy4KIAkJICovCiAJCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKwogCQkJLyogR2V0IHRoZSBuZXh0IHN0YXR1cy9lbmFibGUgcGFpciAqLwogCiAJCQlncGVfcmVnaXN0ZXJfaW5mbyA9ICZncGVfYmxvY2stPnJlZ2lzdGVyX2luZm9baV07CiAKKwkJCWh3X2ZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CisKIAkJCS8qIFJlYWQgdGhlIFN0YXR1cyBSZWdpc3RlciAqLwogCiAJCQlzdGF0dXMgPQpAQCAtNDE0LDYgKzQyMyw4IEBACiAJCQkJCQkgICAmZ3BlX3JlZ2lzdGVyX2luZm8tPgogCQkJCQkJICAgc3RhdHVzX2FkZHJlc3MpOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQkJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jaywKKwkJCQkJCSAgICAgaHdfZmxhZ3MpOwogCQkJCWdvdG8gdW5sb2NrX2FuZF9leGl0OwogCQkJfQogCkBAIC00MjQsNiArNDM1LDggQEAKIAkJCQkJCSAgICZlbmFibGVfcmVnLAogCQkJCQkJICAgJmdwZV9yZWdpc3Rlcl9pbmZvLT4KIAkJCQkJCSAgIGVuYWJsZV9hZGRyZXNzKTsKKwkJCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGh3X2ZsYWdzKTsKKwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byB1bmxvY2tfYW5kX2V4aXQ7CiAJCQl9CkBAIC00MzcsNiArNDUwLDcgQEAKIAogCQkJZW5hYmxlZF9zdGF0dXNfYnl0ZSA9ICh1OCkgKHN0YXR1c19yZWcgJiBlbmFibGVfcmVnKTsKIAkJCWlmICghZW5hYmxlZF9zdGF0dXNfYnl0ZSkgeworCiAJCQkJLyogTm8gYWN0aXZlIEdQRXMgaW4gdGhpcyByZWdpc3RlciwgbW92ZSBvbiAqLwogCiAJCQkJY29udGludWU7CkBAIC00NDUsNiArNDU5LDcgQEAKIAkJCS8qIE5vdyBsb29rIGF0IHRoZSBpbmRpdmlkdWFsIEdQRXMgaW4gdGhpcyBieXRlIHJlZ2lzdGVyICovCiAKIAkJCWZvciAoaiA9IDA7IGogPCBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSDsgaisrKSB7CisKIAkJCQkvKiBFeGFtaW5lIG9uZSBHUEUgYml0ICovCiAKIAkJCQlpZiAoZW5hYmxlZF9zdGF0dXNfYnl0ZSAmCkBAIC00ODMsOSArNDk4LDkgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgTm9uZQogICoKLSAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIGEgR1BFIGNvbnRyb2wgbWV0aG9kLiAgVGhpcwotICogICAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGFuIGludm9jYXRpb24gb2YgYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uCi0gKiAgICAgICAgICAgICAgKGFuZCB0aGVyZWZvcmUgZG9lcyBOT1QgZXhlY3V0ZSBhdCBpbnRlcnJ1cHQgbGV2ZWwpIHNvIHRoYXQKKyAqIERFU0NSSVBUSU9OOiBQZXJmb3JtIHRoZSBhY3R1YWwgZXhlY3V0aW9uIG9mIGEgR1BFIGNvbnRyb2wgbWV0aG9kLiBUaGlzCisgKiAgICAgICAgICAgICAgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYW4gaW52b2NhdGlvbiBvZiBhY3BpX29zX2V4ZWN1dGUgYW5kCisgKiAgICAgICAgICAgICAgdGhlcmVmb3JlIGRvZXMgTk9UIGV4ZWN1dGUgYXQgaW50ZXJydXB0IGxldmVsIC0gc28gdGhhdAogICogICAgICAgICAgICAgIHRoZSBjb250cm9sIG1ldGhvZCBpdHNlbGYgaXMgbm90IGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mCiAgKiAgICAgICAgICAgICAgYW4gaW50ZXJydXB0IGhhbmRsZXIuCiAgKgpAQCAtNDk0LDEyICs1MDksMTEgQEAKIHN0YXRpYyB2b2lkIEFDUElfU1lTVEVNX1hGQUNFIGFjcGlfZXZfYXN5bmNoX2V4ZWN1dGVfZ3BlX21ldGhvZCh2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbyA9ICh2b2lkICopY29udGV4dDsKLQl1MzIgZ3BlX251bWJlciA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvIGxvY2FsX2dwZV9ldmVudF9pbmZvOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QpOwogCiAJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC01MzUsMjIgKzU0OSwzNSBAQAogCSAqLwogCWlmICgobG9jYWxfZ3BlX2V2ZW50X2luZm8uZmxhZ3MgJiBBQ1BJX0dQRV9ESVNQQVRDSF9NQVNLKSA9PQogCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9NRVRIT0QpIHsKLQkJLyoKLQkJICogSW52b2tlIHRoZSBHUEUgTWV0aG9kIChfTHh4LCBfRXh4KSBpLmUuLCBldmFsdWF0ZSB0aGUgX0x4eC9fRXh4Ci0JCSAqIGNvbnRyb2wgbWV0aG9kIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBHUEUKLQkJICovCi0JCWluZm8ubm9kZSA9IGxvY2FsX2dwZV9ldmVudF9pbmZvLmRpc3BhdGNoLm1ldGhvZF9ub2RlOwotCQlpbmZvLnBhcmFtZXRlcnMgPQotCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICosIGdwZV9ldmVudF9pbmZvKTsKLQkJaW5mby5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fR1BFOwogCi0JCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKCZpbmZvKTsKKwkJLyogQWxsb2NhdGUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KKworCQlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwkJaWYgKCFpbmZvKSB7CisJCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSW52b2tlIHRoZSBHUEUgTWV0aG9kIChfTHh4LCBfRXh4KSBpLmUuLCBldmFsdWF0ZSB0aGUgX0x4eC9fRXh4CisJCQkgKiBjb250cm9sIG1ldGhvZCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgR1BFCisJCQkgKi8KKwkJCWluZm8tPnByZWZpeF9ub2RlID0KKwkJCSAgICBsb2NhbF9ncGVfZXZlbnRfaW5mby5kaXNwYXRjaC5tZXRob2Rfbm9kZTsKKwkJCWluZm8tPnBhcmFtZXRlcnMgPQorCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLAorCQkJCQkgIGdwZV9ldmVudF9pbmZvKTsKKwkJCWluZm8tPnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9HUEU7CisJCQlpbmZvLT5mbGFncyA9IEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRTsKKworCQkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKKwkJCUFDUElfRlJFRShpbmZvKTsKKwkJfQorCiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJIldoaWxlIGV2YWx1YXRpbmcgbWV0aG9kIFslNC40c10gZm9yIEdQRVslMlhdIiwKKwkJCQkJIldoaWxlIGV2YWx1YXRpbmcgR1BFIG1ldGhvZCBbJTQuNHNdIiwKIAkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lCiAJCQkJCShsb2NhbF9ncGVfZXZlbnRfaW5mby5kaXNwYXRjaC4KLQkJCQkJIG1ldGhvZF9ub2RlKSwgZ3BlX251bWJlcikpOworCQkJCQkgbWV0aG9kX25vZGUpKSk7CiAJCX0KIAl9CiAKQEAgLTU5Myw3ICs2MjAsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2dwZV9kaXNwYXRjaCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZ3BlX2Rpc3BhdGNoKTsKIAogCS8qCiAJICogSWYgZWRnZS10cmlnZ2VyZWQsIGNsZWFyIHRoZSBHUEUgc3RhdHVzIGJpdCBub3cuICBOb3RlIHRoYXQKQEAgLTY2OSw5ICs2OTYsOSBAQAogCQkgKiBFeGVjdXRlIHRoZSBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoZSBHUEUKIAkJICogTk9URTogTGV2ZWwtdHJpZ2dlcmVkIEdQRXMgYXJlIGNsZWFyZWQgYWZ0ZXIgdGhlIG1ldGhvZCBjb21wbGV0ZXMuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0dQRSwKLQkJCQkJCSAgICAgYWNwaV9ldl9hc3luY2hfZXhlY3V0ZV9ncGVfbWV0aG9kLAotCQkJCQkJICAgICBncGVfZXZlbnRfaW5mbyk7CisJCXN0YXR1cyA9IGFjcGlfb3NfZXhlY3V0ZShPU0xfR1BFX0hBTkRMRVIsCisJCQkJCSBhY3BpX2V2X2FzeW5jaF9leGVjdXRlX2dwZV9tZXRob2QsCisJCQkJCSBncGVfZXZlbnRfaW5mbyk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKIAkJCQkJIlVuYWJsZSB0byBxdWV1ZSBoYW5kbGVyIGZvciBHUEVbJTJYXSAtIGV2ZW50IGRpc2FibGVkIiwKQEAgLTcxNiw3ICs3NDMsNyBAQAogICoKICAqIERFU0NSSVBUSU9OOiBEZXRlcm1pbmUgaWYgYSBhIEdQRSBpcyAid2FrZS1vbmx5Ii4KICAqCi0gKiAgICAgICAgICAgICAgQ2FsbGVkIGZyb20gTm90aWZ5KCkgY29kZSBpbiBpbnRlcnByZXRlciB3aGVuIGEgImRldmljZV93YWtlIgorICogICAgICAgICAgICAgIENhbGxlZCBmcm9tIE5vdGlmeSgpIGNvZGUgaW4gaW50ZXJwcmV0ZXIgd2hlbiBhICJEZXZpY2VXYWtlIgogICogICAgICAgICAgICAgIE5vdGlmeSBjb21lcyBpbi4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNzI2LDcgKzc1Myw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY2hlY2tfZm9yX3dha2Vfb25seV9ncGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlKTsKIAogCWlmICgoZ3BlX2V2ZW50X2luZm8pICYmCS8qIE9ubHkgPjAgZm9yIF9MeHgvX0V4eCAqLwogCSAgICAoKGdwZV9ldmVudF9pbmZvLT5mbGFncyAmIEFDUElfR1BFX1NZU1RFTV9NQVNLKSA9PSBBQ1BJX0dQRV9TWVNURU1fUlVOTklORykpIHsJLyogU3lzdGVtIHN0YXRlIGF0IEdQRSB0aW1lICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlYmxrLmMKaW5kZXggMGZkMDBiNS4uOTVkZGViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZWJsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGVibGsuYwpAQCAtMTMxLDE0ICsxMzEsMTQgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1hY3BpX3N0YXR1cyBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoQUNQSV9HUEVfQ0FMTEJBQ0sgZ3BlX3dhbGtfY2FsbGJhY2spCithY3BpX3N0YXR1cyBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9ncGVfY2FsbGJhY2sgZ3BlX3dhbGtfY2FsbGJhY2spCiB7CiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKIAlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm87CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl93YWxrX2dwZV9saXN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl93YWxrX2dwZV9saXN0KTsKIAogCWZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOwogCkBAIC0xNDYsMTAgKzE0NiwxMiBAQAogCiAJZ3BlX3hydXB0X2luZm8gPSBhY3BpX2dibF9ncGVfeHJ1cHRfbGlzdF9oZWFkOwogCXdoaWxlIChncGVfeHJ1cHRfaW5mbykgeworCiAJCS8qIFdhbGsgYWxsIEdwZSBCbG9ja3MgYXR0YWNoZWQgdG8gdGhpcyBpbnRlcnJ1cHQgbGV2ZWwgKi8KIAogCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfaW5mby0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAkJd2hpbGUgKGdwZV9ibG9jaykgeworCiAJCQkvKiBPbmUgY2FsbGJhY2sgcGVyIEdQRSBibG9jayAqLwogCiAJCQlzdGF0dXMgPSBncGVfd2Fsa19jYWxsYmFjayhncGVfeHJ1cHRfaW5mbywgZ3BlX2Jsb2NrKTsKQEAgLTE5MCwxMSArMTkyLDEyIEBACiAJYWNwaV9uYXRpdmVfdWludCBpOwogCWFjcGlfbmF0aXZlX3VpbnQgajsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RlbGV0ZV9ncGVfaGFuZGxlcnMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2RlbGV0ZV9ncGVfaGFuZGxlcnMpOwogCiAJLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CisKIAkJLyogTm93IGxvb2sgYXQgdGhlIGluZGl2aWR1YWwgR1BFcyBpbiB0aGlzIGJ5dGUgcmVnaXN0ZXIgKi8KIAogCQlmb3IgKGogPSAwOyBqIDwgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEg7IGorKykgewpAQCAtMjA0LDcgKzIwNyw3IEBACiAKIAkJCWlmICgoZ3BlX2V2ZW50X2luZm8tPmZsYWdzICYgQUNQSV9HUEVfRElTUEFUQ0hfTUFTSykgPT0KIAkJCSAgICBBQ1BJX0dQRV9ESVNQQVRDSF9IQU5ETEVSKSB7Ci0JCQkJQUNQSV9NRU1fRlJFRShncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlcik7CisJCQkJQUNQSV9GUkVFKGdwZV9ldmVudF9pbmZvLT5kaXNwYXRjaC5oYW5kbGVyKTsKIAkJCQlncGVfZXZlbnRfaW5mby0+ZGlzcGF0Y2guaGFuZGxlciA9IE5VTEw7CiAJCQkJZ3BlX2V2ZW50X2luZm8tPmZsYWdzICY9CiAJCQkJICAgIH5BQ1BJX0dQRV9ESVNQQVRDSF9NQVNLOwpAQCAtMjQ4LDcgKzI1MSw3IEBACiAJdTggdHlwZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9zYXZlX21ldGhvZF9pbmZvIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9zYXZlX21ldGhvZF9pbmZvKTsKIAogCS8qCiAJICogX0x4eCBhbmQgX0V4eCBHUEUgbWV0aG9kIHN1cHBvcnQKQEAgLTI3OSw5ICsyODIsOSBAQAogCWRlZmF1bHQ6CiAJCS8qIFVua25vd24gbWV0aG9kIHR5cGUsIGp1c3QgaWdub3JlIGl0ISAqLwogCi0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlVua25vd24gR1BFIG1ldGhvZCB0eXBlOiAlcyAobmFtZSBub3Qgb2YgZm9ybSBfTHh4IG9yIF9FeHgpIiwKLQkJCSAgICBuYW1lKSk7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKKwkJCQkgICJJZ25vcmluZyB1bmtub3duIEdQRSBtZXRob2QgdHlwZTogJXMgKG5hbWUgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KSIsCisJCQkJICBuYW1lKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCkBAIC0yODksMTEgKzI5MiwxMiBAQAogCiAJZ3BlX251bWJlciA9IEFDUElfU1RSVE9VTCgmbmFtZVsyXSwgTlVMTCwgMTYpOwogCWlmIChncGVfbnVtYmVyID09IEFDUElfVUlOVDMyX01BWCkgeworCiAJCS8qIENvbnZlcnNpb24gZmFpbGVkOyBpbnZhbGlkIG1ldGhvZCwganVzdCBpZ25vcmUgaXQgKi8KIAotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDb3VsZCBub3QgZXh0cmFjdCBHUEUgbnVtYmVyIGZyb20gbmFtZTogJXMgKG5hbWUgaXMgbm90IG9mIGZvcm0gX0x4eCBvciBfRXh4KSIsCi0JCQkgICAgbmFtZSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCisJCQkJICAiQ291bGQgbm90IGV4dHJhY3QgR1BFIG51bWJlciBmcm9tIG5hbWU6ICVzIChuYW1lIGlzIG5vdCBvZiBmb3JtIF9MeHggb3IgX0V4eCkiLAorCQkJCSAgbmFtZSkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIApAQCAtMzY0LDEzICszNjgsMTQgQEAKIAl1MzIgZ3BlX251bWJlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9tYXRjaF9wcndfYW5kX2dwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfbWF0Y2hfcHJ3X2FuZF9ncGUpOwogCiAJLyogQ2hlY2sgZm9yIGEgX1BSVyBtZXRob2QgdW5kZXIgdGhpcyBkZXZpY2UgKi8KIAogCXN0YXR1cyA9IGFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KG9ial9oYW5kbGUsIE1FVEhPRF9OQU1FX19QUlcsCiAJCQkJCSBBQ1BJX0JUWVBFX1BBQ0tBR0UsICZwa2dfZGVzYyk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJLyogSWdub3JlIGFsbCBlcnJvcnMgZnJvbSBfUFJXLCB3ZSBkb24ndCB3YW50IHRvIGFib3J0IHRoZSBzdWJzeXN0ZW0gKi8KIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpAQCAtMzk0LDYgKzM5OSw3IEBACiAJb2JqX2Rlc2MgPSBwa2dfZGVzYy0+cGFja2FnZS5lbGVtZW50c1swXTsKIAogCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwogCQkvKiBVc2UgRkFEVC1kZWZpbmVkIEdQRSBkZXZpY2UgKGZyb20gZGVmaW5pdGlvbiBvZiBfUFJXKSAqLwogCiAJCXRhcmdldF9ncGVfZGV2aWNlID0gYWNwaV9nYmxfZmFkdF9ncGVfZGV2aWNlOwpAQCAtNDAyLDYgKzQwOCw3IEBACiAKIAkJZ3BlX251bWJlciA9ICh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlOwogCX0gZWxzZSBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisKIAkJLyogUGFja2FnZSBjb250YWlucyBhIEdQRSByZWZlcmVuY2UgYW5kIEdQRSBudW1iZXIgd2l0aGluIGEgR1BFIGJsb2NrICovCiAKIAkJaWYgKChvYmpfZGVzYy0+cGFja2FnZS5jb3VudCA8IDIpIHx8CkBAIC00ODIsNyArNDg5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9nZXRfZ3BlX3hydXB0X2Jsb2NrIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9nZXRfZ3BlX3hydXB0X2Jsb2NrKTsKIAogCS8qIE5vIG5lZWQgZm9yIGxvY2sgc2luY2Ugd2UgYXJlIG5vdCBjaGFuZ2luZyBhbnkgbGlzdCBlbGVtZW50cyBoZXJlICovCiAKQEAgLTQ5Nyw3ICs1MDQsNyBAQAogCiAJLyogTm90IGZvdW5kLCBtdXN0IGFsbG9jYXRlIGEgbmV3IHhydXB0IGRlc2NyaXB0b3IgKi8KIAotCWdwZV94cnVwdCA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8pKTsKKwlncGVfeHJ1cHQgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8pKTsKIAlpZiAoIWdwZV94cnVwdCkgewogCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KQEAgLTU1Niw3ICs1NjMsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2NwdV9mbGFncyBmbGFnczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2RlbGV0ZV9ncGVfeHJ1cHQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2RlbGV0ZV9ncGVfeHJ1cHQpOwogCiAJLyogV2UgbmV2ZXIgd2FudCB0byByZW1vdmUgdGhlIFNDSSBpbnRlcnJ1cHQgaGFuZGxlciAqLwogCkBAIC01ODgsNyArNTk1LDcgQEAKIAogCS8qIEZyZWUgdGhlIGJsb2NrICovCiAKLQlBQ1BJX01FTV9GUkVFKGdwZV94cnVwdCk7CisJQUNQSV9GUkVFKGdwZV94cnVwdCk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIApAQCAtNjE0LDcgKzYyMSw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9ncGVfYmxvY2siKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfZ3BlX2Jsb2NrKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNjY3LDcgKzY3NCw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9ncGVfYmxvY2siKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfZ3BlX2Jsb2NrKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtNjc5LDYgKzY4Niw3IEBACiAJc3RhdHVzID0gYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayhncGVfYmxvY2stPnhydXB0X2Jsb2NrLCBncGVfYmxvY2spOwogCiAJaWYgKCFncGVfYmxvY2stPnByZXZpb3VzICYmICFncGVfYmxvY2stPm5leHQpIHsKKwogCQkvKiBUaGlzIGlzIHRoZSBsYXN0IGdwZV9ibG9jayBvbiB0aGlzIGludGVycnVwdCAqLwogCiAJCXN0YXR1cyA9IGFjcGlfZXZfZGVsZXRlX2dwZV94cnVwdChncGVfYmxvY2stPnhydXB0X2Jsb2NrKTsKQEAgLTcwNCw5ICs3MTIsOSBAQAogCiAJLyogRnJlZSB0aGUgZ3BlX2Jsb2NrICovCiAKLQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7Ci0JQUNQSV9NRU1fRlJFRShncGVfYmxvY2stPmV2ZW50X2luZm8pOwotCUFDUElfTUVNX0ZSRUUoZ3BlX2Jsb2NrKTsKKwlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9pbmZvKTsKKwlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrLT5ldmVudF9pbmZvKTsKKwlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrKTsKIAogICAgICAgdW5sb2NrX2FuZF9leGl0OgogCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9FVkVOVFMpOwpAQCAtNzM2LDE3ICs3NDQsMTcgQEAKIAlhY3BpX25hdGl2ZV91aW50IGo7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2Nrcyk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgR1BFIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGJsb2NrICovCiAKLQlncGVfcmVnaXN0ZXJfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBncGVfYmxvY2stPgotCQkJCQkgICAgICAgcmVnaXN0ZXJfY291bnQgKgotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdAotCQkJCQkJICAgICAgYWNwaV9ncGVfcmVnaXN0ZXJfaW5mbykpOworCWdwZV9yZWdpc3Rlcl9pbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT4KKwkJCQkJCSByZWdpc3Rlcl9jb3VudCAqCisJCQkJCQkgc2l6ZW9mKHN0cnVjdAorCQkJCQkJCWFjcGlfZ3BlX3JlZ2lzdGVyX2luZm8pKTsKIAlpZiAoIWdwZV9yZWdpc3Rlcl9pbmZvKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX3JlZ2lzdGVyX2luZm8gdGFibGUiKSk7CisJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgR3BlUmVnaXN0ZXJJbmZvIHRhYmxlIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKQEAgLTc1NCwxMyArNzYyLDE0IEBACiAJICogQWxsb2NhdGUgdGhlIEdQRSBldmVudF9pbmZvIGJsb2NrLiBUaGVyZSBhcmUgZWlnaHQgZGlzdGluY3QgR1BFcwogCSAqIHBlciByZWdpc3Rlci4gSW5pdGlhbGl6YXRpb24gdG8gemVyb3MgaXMgc3VmZmljaWVudC4KIAkgKi8KLQlncGVfZXZlbnRfaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkgZ3BlX2Jsb2NrLT4KLQkJCQkJICAgICByZWdpc3Rlcl9jb3VudCAqCi0JCQkJCSAgICAgQUNQSV9HUEVfUkVHSVNURVJfV0lEVEgpICoKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbykpOworCWdwZV9ldmVudF9pbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKChhY3BpX3NpemUpIGdwZV9ibG9jay0+CisJCQkJCSAgICAgICByZWdpc3Rlcl9jb3VudCAqCisJCQkJCSAgICAgICBBQ1BJX0dQRV9SRUdJU1RFUl9XSURUSCkgKgorCQkJCQkgICAgICBzaXplb2Yoc3RydWN0CisJCQkJCQkgICAgIGFjcGlfZ3BlX2V2ZW50X2luZm8pKTsKIAlpZiAoIWdwZV9ldmVudF9pbmZvKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgZ3BlX2V2ZW50X2luZm8gdGFibGUiKSk7CisJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0aGUgR3BlRXZlbnRJbmZvIHRhYmxlIikpOwogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7CiAJCWdvdG8gZXJyb3JfZXhpdDsKIAl9CkBAIC03ODAsNiArNzg5LDcgQEAKIAl0aGlzX2V2ZW50ID0gZ3BlX2V2ZW50X2luZm87CiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CisKIAkJLyogSW5pdCB0aGUgcmVnaXN0ZXJfaW5mbyBmb3IgdGhpcyBHUEUgcmVnaXN0ZXIgKDggR1BFcykgKi8KIAogCQl0aGlzX3JlZ2lzdGVyLT5iYXNlX2dwZV9udW1iZXIgPQpAQCAtODM5LDEwICs4NDksMTAgQEAKIAogICAgICAgZXJyb3JfZXhpdDoKIAlpZiAoZ3BlX3JlZ2lzdGVyX2luZm8pIHsKLQkJQUNQSV9NRU1fRlJFRShncGVfcmVnaXN0ZXJfaW5mbyk7CisJCUFDUElfRlJFRShncGVfcmVnaXN0ZXJfaW5mbyk7CiAJfQogCWlmIChncGVfZXZlbnRfaW5mbykgewotCQlBQ1BJX01FTV9GUkVFKGdwZV9ldmVudF9pbmZvKTsKKwkJQUNQSV9GUkVFKGdwZV9ldmVudF9pbmZvKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTg3OCw3ICs4ODgsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbyAqZ3BlX2Jsb2NrOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY3JlYXRlX2dwZV9ibG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfY3JlYXRlX2dwZV9ibG9jayk7CiAKIAlpZiAoIXJlZ2lzdGVyX2NvdW50KSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC04ODYsNyArODk2LDcgQEAKIAogCS8qIEFsbG9jYXRlIGEgbmV3IEdQRSBibG9jayAqLwogCi0JZ3BlX2Jsb2NrID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOworCWdwZV9ibG9jayA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbykpOwogCWlmICghZ3BlX2Jsb2NrKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KQEAgLTkwNiw3ICs5MTYsNyBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfZXZfY3JlYXRlX2dwZV9pbmZvX2Jsb2NrcyhncGVfYmxvY2spOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CisJCUFDUElfRlJFRShncGVfYmxvY2spOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKQEAgLTkxNCw3ICs5MjQsNyBAQAogCiAJc3RhdHVzID0gYWNwaV9ldl9pbnN0YWxsX2dwZV9ibG9jayhncGVfYmxvY2ssIGludGVycnVwdF9udW1iZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CisJCUFDUElfRlJFRShncGVfYmxvY2spOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKQEAgLTk3MSw3ICs5ODEsNyBAQAogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAlhY3BpX25hdGl2ZV91aW50IGo7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbml0aWFsaXplX2dwZV9ibG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5pdGlhbGl6ZV9ncGVfYmxvY2spOwogCiAJLyogSWdub3JlIGEgbnVsbCBHUEUgYmxvY2sgKGUuZy4sIGlmIG5vIEdQRSBibG9jayAxIGV4aXN0cykgKi8KIApAQCAtMTAxMyw2ICsxMDIzLDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKIAkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCiAJCQkvKiBHZXQgdGhlIGluZm8gYmxvY2sgZm9yIHRoaXMgcGFydGljdWxhciBHUEUgKi8KIAogCQkJZ3BlX2V2ZW50X2luZm8gPQpAQCAtMTA0MCw3ICsxMDUxLDcgQEAKIAogCXN0YXR1cyA9IGFjcGlfaHdfZW5hYmxlX3J1bnRpbWVfZ3BlX2Jsb2NrKE5VTEwsIGdwZV9ibG9jayk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgZW5hYmxlIEdQRXMgaW4gZ3BlX2Jsb2NrICVwIiwKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBlbmFibGUgR1BFcyBpbiBHcGVCbG9jayAlcCIsCiAJCQkgICAgZ3BlX2Jsb2NrKSk7CiAJfQogCkBAIC0xMDY2LDcgKzEwNzcsNyBAQAogCXUzMiBncGVfbnVtYmVyX21heCA9IDA7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZ3BlX2luaXRpYWxpemUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2dwZV9pbml0aWFsaXplKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTA5OSw2ICsxMTEwLDcgQEAKIAkgKiBwYXJ0aWN1bGFyIGJsb2NrIGlzIG5vdCBzdXBwb3J0ZWQuCiAJICovCiAJaWYgKGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmJiBhY3BpX2dibF9GQURULT54Z3BlMF9ibGsuYWRkcmVzcykgeworCiAJCS8qIEdQRSBibG9jayAwIGV4aXN0cyAoaGFzIGJvdGggbGVuZ3RoIGFuZCBhZGRyZXNzID4gMCkgKi8KIAogCQlyZWdpc3Rlcl9jb3VudDAgPSAodTE2KSAoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuIC8gMik7CkBAIC0xMTIxLDYgKzExMzMsNyBAQAogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4gJiYgYWNwaV9nYmxfRkFEVC0+eGdwZTFfYmxrLmFkZHJlc3MpIHsKKwogCQkvKiBHUEUgYmxvY2sgMSBleGlzdHMgKGhhcyBib3RoIGxlbmd0aCBhbmQgYWRkcmVzcyA+IDApICovCiAKIAkJcmVnaXN0ZXJfY291bnQxID0gKHUxNikgKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAvIDIpOwpAQCAtMTE2OCw2ICsxMTgxLDcgQEAKIAkvKiBFeGl0IGlmIHRoZXJlIGFyZSBubyBHUEUgcmVnaXN0ZXJzICovCiAKIAlpZiAoKHJlZ2lzdGVyX2NvdW50MCArIHJlZ2lzdGVyX2NvdW50MSkgPT0gMCkgeworCiAJCS8qIEdQRXMgYXJlIG5vdCByZXF1aXJlZCBieSBBQ1BJLCB0aGlzIGlzIE9LICovCiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTklULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKaW5kZXggMDkwOWJhNi4uNmVlZjRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldm1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCkBAIC00OSwxMiArNDksMTMgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0VWRU5UUwogQUNQSV9NT0RVTEVfTkFNRSgiZXZtaXNjIikKIAorLyogTmFtZXMgZm9yIE5vdGlmeSgpIHZhbHVlcywgdXNlZCBmb3IgZGVidWcgb3V0cHV0ICovCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKIHN0YXRpYyBjb25zdCBjaGFyICphY3BpX25vdGlmeV92YWx1ZV9uYW1lc1tdID0gewogCSJCdXMgQ2hlY2siLAogCSJEZXZpY2UgQ2hlY2siLAogCSJEZXZpY2UgV2FrZSIsCi0JIkVqZWN0IHJlcXVlc3QiLAorCSJFamVjdCBSZXF1ZXN0IiwKIAkiRGV2aWNlIENoZWNrIExpZ2h0IiwKIAkiRnJlcXVlbmN5IE1pc21hdGNoIiwKIAkiQnVzIE1vZGUgTWlzbWF0Y2giLApAQCAtMTI0LDcgKzEyNSw3IEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpub3RpZnlfaW5mbzsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoZXZfcXVldWVfbm90aWZ5X3JlcXVlc3QpOwogCiAJLyoKIAkgKiBGb3IgdmFsdWUgMyAoRWplY3Rpb24gUmVxdWVzdCksIHNvbWUgZGV2aWNlIG1ldGhvZCBtYXkgbmVlZCB0byBiZSBydW4uCkBAIC0xNTAsNiArMTUxLDcgQEAKIAogCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCWlmIChvYmpfZGVzYykgeworCiAJCS8qIFdlIGhhdmUgdGhlIG5vdGlmeSBvYmplY3QsIEdldCB0aGUgcmlnaHQgaGFuZGxlciAqLwogCiAJCXN3aXRjaCAobm9kZS0+dHlwZSkgewpAQCAtMTg0LDE0ICsxODYsMTUgQEAKIAkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJfQogCi0JCW5vdGlmeV9pbmZvLT5jb21tb24uZGF0YV90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfTk9USUZZOworCQlub3RpZnlfaW5mby0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9CisJCSAgICBBQ1BJX0RFU0NfVFlQRV9TVEFURV9OT1RJRlk7CiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkubm9kZSA9IG5vZGU7CiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgPSAodTE2KSBub3RpZnlfdmFsdWU7CiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iajsKIAotCQlzdGF0dXMgPSBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24oT1NEX1BSSU9SSVRZX0hJR0gsCi0JCQkJCQkgICAgIGFjcGlfZXZfbm90aWZ5X2Rpc3BhdGNoLAotCQkJCQkJICAgICBub3RpZnlfaW5mbyk7CisJCXN0YXR1cyA9CisJCSAgICBhY3BpX29zX2V4ZWN1dGUoT1NMX05PVElGWV9IQU5ETEVSLCBhY3BpX2V2X25vdGlmeV9kaXNwYXRjaCwKKwkJCQkgICAgbm90aWZ5X2luZm8pOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUobm90aWZ5X2luZm8pOwogCQl9CkBAIC0yNDAsNiArMjQzLDcgQEAKIAkgKiB0byB0aGUgZGV2aWNlLgogCSAqLwogCWlmIChub3RpZnlfaW5mby0+bm90aWZ5LnZhbHVlIDw9IEFDUElfTUFYX1NZU19OT1RJRlkpIHsKKwogCQkvKiBHbG9iYWwgc3lzdGVtIG5vdGlmaWNhdGlvbiBoYW5kbGVyICovCiAKIAkJaWYgKGFjcGlfZ2JsX3N5c3RlbV9ub3RpZnkuaGFuZGxlcikgewpAQCAtMjk3LDYgKzMwMSw3IEBACiAJLyogU2lnbmFsIHRocmVhZHMgdGhhdCBhcmUgd2FpdGluZyBmb3IgdGhlIGxvY2sgKi8KIAogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpIHsKKwogCQkvKiBTZW5kIHN1ZmZpY2llbnQgdW5pdHMgdG8gdGhlIHNlbWFwaG9yZSAqLwogCiAJCXN0YXR1cyA9CkBAIC0zMzUsMTUgKzM0MCwxNiBAQAogCSAqLwogCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhhY3BpX2dibF9jb21tb25fZkFDUy5nbG9iYWxfbG9jaywgYWNxdWlyZWQpOwogCWlmIChhY3F1aXJlZCkgeworCiAJCS8qIEdvdCB0aGUgbG9jaywgbm93IHdha2UgYWxsIHRocmVhZHMgd2FpdGluZyBmb3IgaXQgKi8KIAogCQlhY3BpX2dibF9nbG9iYWxfbG9ja19hY3F1aXJlZCA9IFRSVUU7CiAKIAkJLyogUnVuIHRoZSBHbG9iYWwgTG9jayB0aHJlYWQgd2hpY2ggd2lsbCBzaWduYWwgYWxsIHdhaXRpbmcgdGhyZWFkcyAqLwogCi0JCXN0YXR1cyA9IGFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfSElHSCwKLQkJCQkJCSAgICAgYWNwaV9ldl9nbG9iYWxfbG9ja190aHJlYWQsCi0JCQkJCQkgICAgIGNvbnRleHQpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9vc19leGVjdXRlKE9TTF9HTE9CQUxfTE9DS19IQU5ETEVSLAorCQkJCSAgICBhY3BpX2V2X2dsb2JhbF9sb2NrX3RocmVhZCwgY29udGV4dCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKIAkJCQkJIkNvdWxkIG5vdCBxdWV1ZSBHbG9iYWwgTG9jayB0aHJlYWQiKSk7CkBAIC0zNzEsNyArMzc3LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9pbml0X2dsb2JhbF9sb2NrX2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luaXRfZ2xvYmFsX2xvY2tfaGFuZGxlcik7CiAKIAlhY3BpX2dibF9nbG9iYWxfbG9ja19wcmVzZW50ID0gVFJVRTsKIAlzdGF0dXMgPSBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcihBQ1BJX0VWRU5UX0dMT0JBTCwKQEAgLTQxMyw3ICs0MTksNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXU4IGFjcXVpcmVkID0gRkFMU0U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9hY3F1aXJlX2dsb2JhbF9sb2NrIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKIAogI2lmbmRlZiBBQ1BJX0FQUExJQ0FUSU9OCiAJLyogTWFrZSBzdXJlIHRoYXQgd2UgYWN0dWFsbHkgaGF2ZSBhIGdsb2JhbCBsb2NrICovCkBAIC00MzksNiArNDQ1LDcgQEAKIAogCUFDUElfQUNRVUlSRV9HTE9CQUxfTE9DSyhhY3BpX2dibF9jb21tb25fZkFDUy5nbG9iYWxfbG9jaywgYWNxdWlyZWQpOwogCWlmIChhY3F1aXJlZCkgeworCiAJCS8qIFdlIGdvdCB0aGUgbG9jayAqLwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKQEAgLTQ1OCw4ICs0NjUsOSBAQAogCSAqIEFjcXVpcmUgdGhlIGdsb2JhbCBsb2NrIHNlbWFwaG9yZSBmaXJzdC4KIAkgKiBTaW5jZSB0aGlzIHdhaXQgd2lsbCBibG9jaywgd2UgbXVzdCByZWxlYXNlIHRoZSBpbnRlcnByZXRlcgogCSAqLwotCXN0YXR1cyA9IGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKLQkJCQkJICAgICAgIHRpbWVvdXQpOworCXN0YXR1cyA9CisJICAgIGFjcGlfZXhfc3lzdGVtX3dhaXRfc2VtYXBob3JlKGFjcGlfZ2JsX2dsb2JhbF9sb2NrX3NlbWFwaG9yZSwKKwkJCQkJICB0aW1lb3V0KTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIApAQCAtNDgwLDcgKzQ4OCw3IEBACiAJdTggcGVuZGluZyA9IEZBTFNFOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfcmVsZWFzZV9nbG9iYWxfbG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcmVsZWFzZV9nbG9iYWxfbG9jayk7CiAKIAlpZiAoIWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudCkgewogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCkBAIC00OTIsNiArNTAwLDcgQEAKIAogCWFjcGlfZ2JsX2dsb2JhbF9sb2NrX3RocmVhZF9jb3VudC0tOwogCWlmIChhY3BpX2dibF9nbG9iYWxfbG9ja190aHJlYWRfY291bnQpIHsKKwogCQkvKiBUaGVyZSBhcmUgc3RpbGwgc29tZSB0aHJlYWRzIGhvbGRpbmcgdGhlIGxvY2ssIGNhbm5vdCByZWxlYXNlICovCiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTUzMyw3ICs1NDIsNyBAQAogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl90ZXJtaW5hdGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3Rlcm1pbmF0ZSk7CiAKIAlpZiAoYWNwaV9nYmxfZXZlbnRzX2luaXRpYWxpemVkKSB7CiAJCS8qCkBAIC01NzMsNyArNTgyLDcgQEAKIAlpZiAoYWNwaV9nYmxfb3JpZ2luYWxfbW9kZSA9PSBBQ1BJX1NZU19NT0RFX0xFR0FDWSkgewogCQlzdGF0dXMgPSBhY3BpX2Rpc2FibGUoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJhY3BpX2Rpc2FibGUgZmFpbGVkIikpOworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiQWNwaURpc2FibGUgZmFpbGVkIikpOwogCQl9CiAJfQogCXJldHVybl9WT0lEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJlZ2lvbi5jCmluZGV4IDZkYTU4ZTcuLjA5NGExN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZWdpb24uYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmVnaW9uLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9uYXRpdmVfdWludCBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9yZWdpb25faGFuZGxlcnMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2luc3RhbGxfcmVnaW9uX2hhbmRsZXJzKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTUzLDcgKzE1Myw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2luaXRpYWxpemVfb3BfcmVnaW9ucyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5pdGlhbGl6ZV9vcF9yZWdpb25zKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTY0LDYgKzE2NCw3IEBACiAJICogUnVuIHRoZSBfUkVHIG1ldGhvZHMgZm9yIG9wX3JlZ2lvbnMgaW4gZWFjaCBkZWZhdWx0IGFkZHJlc3Mgc3BhY2UKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQUNQSV9OVU1fREVGQVVMVF9TUEFDRVM7IGkrKykgeworCiAJCS8qIFRCRDogTWFrZSBzdXJlIGhhbmRsZXIgaXMgdGhlIERFRkFVTFQgaGFuZGxlciwgb3RoZXJ3aXNlCiAJCSAqIF9SRUcgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBydW4uCiAJCSAqLwpAQCAtMTkyLDEyICsxOTMsMTIgQEAKIGFjcGlfc3RhdHVzCiBhY3BpX2V2X2V4ZWN1dGVfcmVnX21ldGhvZCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLCB1MzIgZnVuY3Rpb24pCiB7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gaW5mbzsKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYXJhbXNbM107CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbzsKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICphcmdzWzNdOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2V4ZWN1dGVfcmVnX21ldGhvZCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZXhlY3V0ZV9yZWdfbWV0aG9kKTsKIAogCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKIAlpZiAoIXJlZ2lvbl9vYmoyKSB7CkBAIC0yMDgsNDggKzIwOSw2MCBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCS8qCi0JICogVGhlIF9SRUcgbWV0aG9kIGhhcyB0d28gYXJndW1lbnRzOgotCSAqCi0JICogQXJnMCwgSW50ZWdlcjogT3BlcmF0aW9uIHJlZ2lvbiBzcGFjZSBJRAotCSAqICAgICAgICAgIFNhbWUgdmFsdWUgYXMgcmVnaW9uX29iai0+UmVnaW9uLnNwYWNlX2lkCi0JICogQXJnMSwgSW50ZWdlcjogY29ubmVjdGlvbiBzdGF0dXMKLQkgKiAgICAgICAgICAxIGZvciBjb25uZWN0aW5nIHRoZSBoYW5kbGVyLAotCSAqICAgICAgICAgIDAgZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGhhbmRsZXIKLQkgKiAgICAgICAgICBQYXNzZWQgYXMgYSBwYXJhbWV0ZXIKLQkgKi8KLQlwYXJhbXNbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCWlmICghcGFyYW1zWzBdKSB7CisJLyogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KKworCWluZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOworCWlmICghaW5mbykgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlwYXJhbXNbMV0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwotCWlmICghcGFyYW1zWzFdKSB7CisJaW5mby0+cHJlZml4X25vZGUgPSByZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRzsKKwlpbmZvLT5wYXRobmFtZSA9IE5VTEw7CisJaW5mby0+cGFyYW1ldGVycyA9IGFyZ3M7CisJaW5mby0+cGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CisJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CisKKwkvKgorCSAqIFRoZSBfUkVHIG1ldGhvZCBoYXMgdHdvIGFyZ3VtZW50czoKKwkgKgorCSAqIEFyZzAgLSBJbnRlZ2VyOgorCSAqICBPcGVyYXRpb24gcmVnaW9uIHNwYWNlIElEIFNhbWUgdmFsdWUgYXMgcmVnaW9uX29iai0+UmVnaW9uLnNwYWNlX2lkCisJICoKKwkgKiBBcmcxIC0gSW50ZWdlcjoKKwkgKiAgY29ubmVjdGlvbiBzdGF0dXMgMSBmb3IgY29ubmVjdGluZyB0aGUgaGFuZGxlciwgMCBmb3IgZGlzY29ubmVjdGluZworCSAqICB0aGUgaGFuZGxlciAoUGFzc2VkIGFzIGEgcGFyYW1ldGVyKQorCSAqLworCWFyZ3NbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOworCWlmICghYXJnc1swXSkgewogCQlzdGF0dXMgPSBBRV9OT19NRU1PUlk7Ci0JCWdvdG8gY2xlYW51cDsKKwkJZ290byBjbGVhbnVwMTsKKwl9CisKKwlhcmdzWzFdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKKwlpZiAoIWFyZ3NbMV0pIHsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXAyOwogCX0KIAogCS8qIFNldHVwIHRoZSBwYXJhbWV0ZXIgb2JqZWN0cyAqLwogCi0JcGFyYW1zWzBdLT5pbnRlZ2VyLnZhbHVlID0gcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkOwotCXBhcmFtc1sxXS0+aW50ZWdlci52YWx1ZSA9IGZ1bmN0aW9uOwotCXBhcmFtc1syXSA9IE5VTEw7Ci0KLQlpbmZvLm5vZGUgPSByZWdpb25fb2JqMi0+ZXh0cmEubWV0aG9kX1JFRzsKLQlpbmZvLnBhcmFtZXRlcnMgPSBwYXJhbXM7Ci0JaW5mby5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fQVJHUzsKKwlhcmdzWzBdLT5pbnRlZ2VyLnZhbHVlID0gcmVnaW9uX29iai0+cmVnaW9uLnNwYWNlX2lkOworCWFyZ3NbMV0tPmludGVnZXIudmFsdWUgPSBmdW5jdGlvbjsKKwlhcmdzWzJdID0gTlVMTDsKIAogCS8qIEV4ZWN1dGUgdGhlIG1ldGhvZCwgbm8gcmV0dXJuIHZhbHVlICovCiAKIAlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKLQkJCShBQ1BJX1RZUEVfTUVUSE9ELCBpbmZvLm5vZGUsIE5VTEwpKTsKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZSgmaW5mbyk7CisJCQkoQUNQSV9UWVBFX01FVEhPRCwgaW5mby0+cHJlZml4X25vZGUsIE5VTEwpKTsKIAotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYXJhbXNbMV0pOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMV0pOwogCi0gICAgICBjbGVhbnVwOgotCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwYXJhbXNbMF0pOworICAgICAgY2xlYW51cDI6CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMF0pOwogCisgICAgICBjbGVhbnVwMToKKwlBQ1BJX0ZSRUUoaW5mbyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTI2MSw3ICsyNzQsOCBAQAogICogICAgICAgICAgICAgIEZ1bmN0aW9uICAgICAgICAgICAgLSBSZWFkIG9yIFdyaXRlIG9wZXJhdGlvbgogICogICAgICAgICAgICAgIEFkZHJlc3MgICAgICAgICAgICAgLSBXaGVyZSBpbiB0aGUgc3BhY2UgdG8gcmVhZCBvciB3cml0ZQogICogICAgICAgICAgICAgIGJpdF93aWR0aCAgICAgICAgICAgLSBGaWVsZCB3aWR0aCBpbiBiaXRzICg4LCAxNiwgMzIsIG9yIDY0KQotICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZQorICogICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGluIG9yIG91dCB2YWx1ZSwgbXVzdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsIDY0LWJpdCBhY3BpX2ludGVnZXIKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtMjc0LDcgKzI4OCw3IEBACiBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2godW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iaiwKIAkJCSAgICAgICB1MzIgZnVuY3Rpb24sCiAJCQkgICAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsCi0JCQkgICAgICAgdTMyIGJpdF93aWR0aCwgdm9pZCAqdmFsdWUpCisJCQkgICAgICAgdTMyIGJpdF93aWR0aCwgYWNwaV9pbnRlZ2VyICogdmFsdWUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfc3RhdHVzIHN0YXR1czI7CkBAIC0yODQsNyArMjk4LDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKIAl2b2lkICpyZWdpb25fY29udGV4dCA9IE5VTEw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9hZGRyZXNzX3NwYWNlX2Rpc3BhdGNoKTsKIAogCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKIAlpZiAoIXJlZ2lvbl9vYmoyKSB7CkBAIC0zMTUsNiArMzI5LDcgQEAKIAkJICovCiAJCXJlZ2lvbl9zZXR1cCA9IGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5zZXR1cDsKIAkJaWYgKCFyZWdpb25fc2V0dXApIHsKKwogCQkJLyogTm8gaW5pdGlhbGl6YXRpb24gcm91dGluZSwgZXhpdCB3aXRoIGVycm9yICovCiAKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sCkBAIC0zNjEsOSArMzc2LDEwIEBACiAJCQlyZWdpb25fb2JqLT5yZWdpb24uZmxhZ3MgfD0gQU9QT0JKX1NFVFVQX0NPTVBMRVRFOwogCiAJCQlpZiAocmVnaW9uX29iajItPmV4dHJhLnJlZ2lvbl9jb250ZXh0KSB7CisKIAkJCQkvKiBUaGUgaGFuZGxlciBmb3IgdGhpcyByZWdpb24gd2FzIGFscmVhZHkgaW5zdGFsbGVkICovCiAKLQkJCQlBQ1BJX01FTV9GUkVFKHJlZ2lvbl9jb250ZXh0KTsKKwkJCQlBQ1BJX0ZSRUUocmVnaW9uX2NvbnRleHQpOwogCQkJfSBlbHNlIHsKIAkJCQkvKgogCQkJCSAqIFNhdmUgdGhlIHJldHVybmVkIGNvbnRleHQgZm9yIHVzZSBpbiBhbGwgYWNjZXNzZXMgdG8KQEAgLTM4Niw5ICs0MDIsOCBAQAogCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZWdpb25fb2JqLT5yZWdpb24uCiAJCQkJCQkgIHNwYWNlX2lkKSkpOwogCi0JaWYgKCEKLQkgICAgKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS4KLQkgICAgIGhmbGFncyAmIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSkgeworCWlmICghKGhhbmRsZXJfZGVzYy0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzICYKKwkgICAgICBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkpIHsKIAkJLyoKIAkJICogRm9yIGhhbmRsZXJzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgKHN1cHBsaWVkKSBoYW5kbGVycywgd2UgbXVzdAogCQkgKiBleGl0IHRoZSBpbnRlcnByZXRlciBiZWNhdXNlIHRoZSBoYW5kbGVyICptaWdodCogYmxvY2sgLS0gd2UgZG9uJ3QKQEAgLTQwOSw5ICs0MjQsOCBAQAogCQkJCQkJCXNwYWNlX2lkKSkpOwogCX0KIAotCWlmICghCi0JICAgIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuCi0JICAgICBoZmxhZ3MgJiBBQ1BJX0FERFJfSEFORExFUl9ERUZBVUxUX0lOU1RBTExFRCkpIHsKKwlpZiAoIShoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcl9mbGFncyAmCisJICAgICAgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQpKSB7CiAJCS8qCiAJCSAqIFdlIGp1c3QgcmV0dXJuZWQgZnJvbSBhIG5vbi1kZWZhdWx0IGhhbmRsZXIsIHdlIG11c3QgcmUtZW50ZXIgdGhlCiAJCSAqIGludGVycHJldGVyCkBAIC00NTEsNyArNDY1LDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqMjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kZXRhY2hfcmVnaW9uIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9kZXRhY2hfcmVnaW9uKTsKIAogCXJlZ2lvbl9vYmoyID0gYWNwaV9uc19nZXRfc2Vjb25kYXJ5X29iamVjdChyZWdpb25fb2JqKTsKIAlpZiAoIXJlZ2lvbl9vYmoyKSB7CkBAIC00NjMsNiArNDc3LDcgQEAKIAogCWhhbmRsZXJfb2JqID0gcmVnaW9uX29iai0+cmVnaW9uLmhhbmRsZXI7CiAJaWYgKCFoYW5kbGVyX29iaikgeworCiAJCS8qIFRoaXMgcmVnaW9uIGhhcyBubyBoYW5kbGVyLCBhbGwgZG9uZSAqLwogCiAJCXJldHVybl9WT0lEOwpAQCAtNDc0LDYgKzQ4OSw3IEBACiAJbGFzdF9vYmpfcHRyID0gJmhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnJlZ2lvbl9saXN0OwogCiAJd2hpbGUgKG9ial9kZXNjKSB7CisKIAkJLyogSXMgdGhpcyB0aGUgY29ycmVjdCBSZWdpb24/ICovCiAKIAkJaWYgKG9ial9kZXNjID09IHJlZ2lvbl9vYmopIHsKQEAgLTU4Myw3ICs1OTksNyBAQAogCQkgICAgICB1OCBhY3BpX25zX2lzX2xvY2tlZCkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2F0dGFjaF9yZWdpb24iKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2F0dGFjaF9yZWdpb24pOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKIAkJCSAgIkFkZGluZyBSZWdpb24gWyU0LjRzXSAlcCB0byBhZGRyZXNzIGhhbmRsZXIgJXAgWyVzXVxuIiwKQEAgLTYzNiw3ICs2NTIsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZXZfaW5zdGFsbF9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKGV2X2luc3RhbGxfaGFuZGxlcik7CiAKIAloYW5kbGVyX29iaiA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopY29udGV4dDsKIApAQCAtNjY2LDYgKzY4Miw3IEBACiAKIAlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CisKIAkJLyogTm8gb2JqZWN0LCBqdXN0IGV4aXQgKi8KIAogCQlyZXR1cm4gKEFFX09LKTsKQEAgLTY3NCwxMCArNjkxLDEyIEBACiAJLyogRGV2aWNlcyBhcmUgaGFuZGxlZCBkaWZmZXJlbnQgdGhhbiByZWdpb25zICovCiAKIAlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9ERVZJQ0UpIHsKKwogCQkvKiBDaGVjayBpZiB0aGlzIERldmljZSBhbHJlYWR5IGhhcyBhIGhhbmRsZXIgZm9yIHRoaXMgYWRkcmVzcyBzcGFjZSAqLwogCiAJCW5leHRfaGFuZGxlcl9vYmogPSBvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7CiAJCXdoaWxlIChuZXh0X2hhbmRsZXJfb2JqKSB7CisKIAkJCS8qIEZvdW5kIGEgaGFuZGxlciwgaXMgaXQgZm9yIHRoZSBzYW1lIGFkZHJlc3Mgc3BhY2U/ICovCiAKIAkJCWlmIChuZXh0X2hhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID09CkBAIC03NjQsOSArNzgzLDkgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpoYW5kbGVyX29iajsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9vYmplY3RfdHlwZSB0eXBlOwotCXUxNiBmbGFncyA9IDA7CisJdTggZmxhZ3MgPSAwOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9zcGFjZV9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9pbnN0YWxsX3NwYWNlX2hhbmRsZXIpOwogCiAJLyoKIAkgKiBUaGlzIHJlZ2lzdHJhdGlvbiBpcyB2YWxpZCBmb3Igb25seSB0aGUgdHlwZXMgYmVsb3cKQEAgLTgzOSw2ICs4NTgsNyBAQAogCQkvKiBXYWxrIHRoZSBoYW5kbGVyIGxpc3QgZm9yIHRoaXMgZGV2aWNlICovCiAKIAkJd2hpbGUgKGhhbmRsZXJfb2JqKSB7CisKIAkJCS8qIFNhbWUgc3BhY2VfaWQgaW5kaWNhdGVzIGEgaGFuZGxlciBhbHJlYWR5IGluc3RhbGxlZCAqLwogCiAJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0gc3BhY2VfaWQpIHsKQEAgLTkyMSw3ICs5NDEsNyBAQAogCS8qIEluaXQgaGFuZGxlciBvYmogKi8KIAogCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLnNwYWNlX2lkID0gKHU4KSBzcGFjZV9pZDsKLQloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oZmxhZ3MgPSBmbGFnczsKKwloYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5oYW5kbGVyX2ZsYWdzID0gZmxhZ3M7CiAJaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2UucmVnaW9uX2xpc3QgPSBOVUxMOwogCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgPSBub2RlOwogCWhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLmhhbmRsZXIgPSBoYW5kbGVyOwpAQCAtOTc5LDcgKzk5OSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZXhlY3V0ZV9yZWdfbWV0aG9kcyk7CiAKIAkvKgogCSAqIFJ1biBhbGwgX1JFRyBtZXRob2RzIGZvciBhbGwgT3BlcmF0aW9uIFJlZ2lvbnMgZm9yIHRoaXMKQEAgLTEwMDEsNyArMTAyMSw3IEBACiAgKgogICogUEFSQU1FVEVSUzogIHdhbGtfbmFtZXNwYWNlIGNhbGxiYWNrCiAgKgotICogREVTQ1JJUFRJT046IFJ1biBfUkVnIG1ldGhvZCBmb3IgcmVnaW9uIG9iamVjdHMgb2YgdGhlIHJlcXVlc3RlZCBzcGFjZV9pRAorICogREVTQ1JJUFRJT046IFJ1biBfUkVHIG1ldGhvZCBmb3IgcmVnaW9uIG9iamVjdHMgb2YgdGhlIHJlcXVlc3RlZCBzcGFjZV9pRAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTEwMzUsNiArMTA1NSw3IEBACiAKIAlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAlpZiAoIW9ial9kZXNjKSB7CisKIAkJLyogTm8gb2JqZWN0LCBqdXN0IGV4aXQgKi8KIAogCQlyZXR1cm4gKEFFX09LKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZyZ25pbmkuYwppbmRleCBiYWVkOGMxLi41YjNjN2E4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2cmduaW5pLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnJnbmluaS5jCkBAIC03MSwxMSArNzEsMjIgQEAKIAkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7CiAJc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKmxvY2FsX3JlZ2lvbl9jb250ZXh0OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfc3lzdGVtX21lbW9yeV9yZWdpb25fc2V0dXAiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3N5c3RlbV9tZW1vcnlfcmVnaW9uX3NldHVwKTsKIAogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCWlmICgqcmVnaW9uX2NvbnRleHQpIHsKLQkJCUFDUElfTUVNX0ZSRUUoKnJlZ2lvbl9jb250ZXh0KTsKKwkJCWxvY2FsX3JlZ2lvbl9jb250ZXh0ID0KKwkJCSAgICAoc3RydWN0IGFjcGlfbWVtX3NwYWNlX2NvbnRleHQgKikqcmVnaW9uX2NvbnRleHQ7CisKKwkJCS8qIERlbGV0ZSBhIGNhY2hlZCBtYXBwaW5nIGlmIHByZXNlbnQgKi8KKworCQkJaWYgKGxvY2FsX3JlZ2lvbl9jb250ZXh0LT5tYXBwZWRfbGVuZ3RoKSB7CisJCQkJYWNwaV9vc191bm1hcF9tZW1vcnkobG9jYWxfcmVnaW9uX2NvbnRleHQtPgorCQkJCQkJICAgICBtYXBwZWRfbG9naWNhbF9hZGRyZXNzLAorCQkJCQkJICAgICBsb2NhbF9yZWdpb25fY29udGV4dC0+CisJCQkJCQkgICAgIG1hcHBlZF9sZW5ndGgpOworCQkJfQorCQkJQUNQSV9GUkVFKGxvY2FsX3JlZ2lvbl9jb250ZXh0KTsKIAkJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CiAJCX0KIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTg0LDcgKzk1LDcgQEAKIAkvKiBDcmVhdGUgYSBuZXcgY29udGV4dCAqLwogCiAJbG9jYWxfcmVnaW9uX2NvbnRleHQgPQotCSAgICBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX21lbV9zcGFjZV9jb250ZXh0KSk7CisJICAgIEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1fc3BhY2VfY29udGV4dCkpOwogCWlmICghKGxvY2FsX3JlZ2lvbl9jb250ZXh0KSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CkBAIC0xMTgsNyArMTI5LDcgQEAKIAkJCSAgICAgIHUzMiBmdW5jdGlvbiwKIAkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2lvX3NwYWNlX3JlZ2lvbl9zZXR1cCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW9fc3BhY2VfcmVnaW9uX3NldHVwKTsKIAogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCSpyZWdpb25fY29udGV4dCA9IE5VTEw7CkBAIC0xNjEsNyArMTcyLDcgQEAKIAkgICAgKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKiloYW5kbGU7CiAJc3RydWN0IGFjcGlfZGV2aWNlX2lkIG9iamVjdF9oSUQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9wY2lfY29uZmlnX3JlZ2lvbl9zZXR1cCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfcGNpX2NvbmZpZ19yZWdpb25fc2V0dXApOwogCiAJaGFuZGxlcl9vYmogPSByZWdpb25fb2JqLT5yZWdpb24uaGFuZGxlcjsKIAlpZiAoIWhhbmRsZXJfb2JqKSB7CkBAIC0xNzgsNyArMTg5LDcgQEAKIAkqcmVnaW9uX2NvbnRleHQgPSBOVUxMOwogCWlmIChmdW5jdGlvbiA9PSBBQ1BJX1JFR0lPTl9ERUFDVElWQVRFKSB7CiAJCWlmIChwY2lfaWQpIHsKLQkJCUFDUElfTUVNX0ZSRUUocGNpX2lkKTsKKwkJCUFDUElfRlJFRShwY2lfaWQpOwogCQl9CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KQEAgLTE5OSw2ICsyMTAsNyBAQAogCSAqIGhhbmRsZXJzIHdpdGggdGhhdCBkZXZpY2UuCiAJICovCiAJaWYgKGhhbmRsZXJfb2JqLT5hZGRyZXNzX3NwYWNlLm5vZGUgPT0gYWNwaV9nYmxfcm9vdF9ub2RlKSB7CisKIAkJLyogU3RhcnQgc2VhcmNoIGZyb20gdGhlIHBhcmVudCBvYmplY3QgKi8KIAogCQlwY2lfcm9vdF9ub2RlID0gcGFyZW50X25vZGU7CkBAIC0yMjAsNiArMjMyLDcgQEAKIAkJCQkJUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HLAogCQkJCQlzaXplb2YoUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HKSkpKSkKIAkJCQl7CisKIAkJCQkJLyogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIHRoaXMgUENJIHJvb3QgYnJpZGdlICovCiAKIAkJCQkJc3RhdHVzID0KQEAgLTIzNSw3ICsyNDgsNyBAQAogCQkJCQkJfSBlbHNlIHsKIAkJCQkJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywKIAkJCQkJCQkJCXN0YXR1cywKLQkJCQkJCQkJCSJDb3VsZCBub3QgaW5zdGFsbCBwY2lfY29uZmlnIGhhbmRsZXIgZm9yIFJvb3QgQnJpZGdlICU0LjRzIiwKKwkJCQkJCQkJCSJDb3VsZCBub3QgaW5zdGFsbCBQY2lDb25maWcgaGFuZGxlciBmb3IgUm9vdCBCcmlkZ2UgJTQuNHMiLAogCQkJCQkJCQkJYWNwaV91dF9nZXRfbm9kZV9uYW1lCiAJCQkJCQkJCQkocGNpX3Jvb3Rfbm9kZSkpKTsKIAkJCQkJCX0KQEAgLTI2Miw3ICsyNzUsNyBAQAogCiAJLyogUmVnaW9uIGlzIHN0aWxsIG5vdCBpbml0aWFsaXplZC4gQ3JlYXRlIGEgbmV3IGNvbnRleHQgKi8KIAotCXBjaV9pZCA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfcGNpX2lkKSk7CisJcGNpX2lkID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX3BjaV9pZCkpOwogCWlmICghcGNpX2lkKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KQEAgLTMzNyw3ICszNTAsNyBAQAogCQkJICAgICB1MzIgZnVuY3Rpb24sCiAJCQkgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwgdm9pZCAqKnJlZ2lvbl9jb250ZXh0KQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3BjaV9iYXJfcmVnaW9uX3NldHVwIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9wY2lfYmFyX3JlZ2lvbl9zZXR1cCk7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQpAQCAtMzY0LDcgKzM3Nyw3IEBACiAJCQkgIHUzMiBmdW5jdGlvbiwKIAkJCSAgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICoqcmVnaW9uX2NvbnRleHQpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfY21vc19yZWdpb25fc2V0dXAiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X2Ntb3NfcmVnaW9uX3NldHVwKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CkBAIC0zODksNyArNDAyLDcgQEAKIAkJCSAgICAgdTMyIGZ1bmN0aW9uLAogCQkJICAgICB2b2lkICpoYW5kbGVyX2NvbnRleHQsIHZvaWQgKipyZWdpb25fY29udGV4dCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9kZWZhdWx0X3JlZ2lvbl9zZXR1cCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfZGVmYXVsdF9yZWdpb25fc2V0dXApOwogCiAJaWYgKGZ1bmN0aW9uID09IEFDUElfUkVHSU9OX0RFQUNUSVZBVEUpIHsKIAkJKnJlZ2lvbl9jb250ZXh0ID0gTlVMTDsKQEAgLTQzNSw3ICs0NDgsNyBAQAogCWFjcGlfbmFtZSAqcmVnX25hbWVfcHRyID0gKGFjcGlfbmFtZSAqKSBNRVRIT0RfTkFNRV9fUkVHOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV2X2luaXRpYWxpemVfcmVnaW9uIiwgYWNwaV9uc19sb2NrZWQpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGV2X2luaXRpYWxpemVfcmVnaW9uLCBhY3BpX25zX2xvY2tlZCk7CiAKIAlpZiAoIXJlZ2lvbl9vYmopIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtNDYyLDggKzQ3NSw5IEBACiAKIAkvKiBGaW5kIGFueSAiX1JFRyIgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlZ2lvbiBkZWZpbml0aW9uICovCiAKLQlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlKCpyZWdfbmFtZV9wdHIsIG5vZGUsCi0JCQkJICAgICBBQ1BJX1RZUEVfTUVUSE9ELCAmbWV0aG9kX25vZGUpOworCXN0YXR1cyA9CisJICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSgqcmVnX25hbWVfcHRyLCBub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELAorCQkJCSAgICAgJm1ldGhvZF9ub2RlKTsKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJLyoKIAkJICogVGhlIF9SRUcgbWV0aG9kIGlzIG9wdGlvbmFsIGFuZCB0aGVyZSBjYW4gYmUgb25seSBvbmUgcGVyIHJlZ2lvbgpAQCAtNDc4LDExICs0OTIsMTMgQEAKIAkgKiBpZTogYWNwaV9nYmxfcm9vdF9ub2RlLT5wYXJlbnRfZW50cnkgYmVpbmcgc2V0IHRvIE5VTEwKIAkgKi8KIAl3aGlsZSAobm9kZSkgeworCiAJCS8qIENoZWNrIHRvIHNlZSBpZiBhIGhhbmRsZXIgZXhpc3RzICovCiAKIAkJaGFuZGxlcl9vYmogPSBOVUxMOwogCQlvYmpfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKIAkJaWYgKG9ial9kZXNjKSB7CisKIAkJCS8qIENhbiBvbmx5IGJlIGEgaGFuZGxlciBpZiB0aGUgb2JqZWN0IGV4aXN0cyAqLwogCiAJCQlzd2l0Y2ggKG5vZGUtPnR5cGUpIHsKQEAgLTUwNywxMCArNTIzLDEyIEBACiAJCQl9CiAKIAkJCXdoaWxlIChoYW5kbGVyX29iaikgeworCiAJCQkJLyogSXMgdGhpcyBoYW5kbGVyIG9mIHRoZSBjb3JyZWN0IHR5cGU/ICovCiAKIAkJCQlpZiAoaGFuZGxlcl9vYmotPmFkZHJlc3Nfc3BhY2Uuc3BhY2VfaWQgPT0KIAkJCQkgICAgc3BhY2VfaWQpIHsKKwogCQkJCQkvKiBGb3VuZCBjb3JyZWN0IGhhbmRsZXIgKi8KIAogCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLApAQCAtNTcxLDcgKzU4OSw3IEBACiAJLyogSWYgd2UgZ2V0IGhlcmUsIHRoZXJlIGlzIG5vIGhhbmRsZXIgZm9yIHRoaXMgcmVnaW9uICovCiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX09QUkVHSU9OLAotCQkJICAiTm8gaGFuZGxlciBmb3IgcmVnaW9uX3R5cGUgJXMoJVgpIChyZWdpb25fb2JqICVwKVxuIiwKKwkJCSAgIk5vIGhhbmRsZXIgZm9yIFJlZ2lvblR5cGUgJXMoJVgpIChSZWdpb25PYmogJXApXG4iLAogCQkJICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShzcGFjZV9pZCksIHNwYWNlX2lkLAogCQkJICByZWdpb25fb2JqKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZzY2kuYwppbmRleCA5YTYyMjE2Li44MTA2MjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2c2NpLmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnNjaS5jCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKIAl1MzIgaW50ZXJydXB0X2hhbmRsZWQgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X3NjaV94cnVwdF9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9zY2lfeHJ1cHRfaGFuZGxlcik7CiAKIAkvKgogCSAqIFdlIGFyZSBndWFyYW50ZWVkIGJ5IHRoZSBBQ1BJIENBIGluaXRpYWxpemF0aW9uL3NodXRkb3duIGNvZGUgdGhhdApAQCAtMTA4LDcgKzEwOCw3IEBACiAJc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmdwZV94cnVwdF9saXN0ID0gY29udGV4dDsKIAl1MzIgaW50ZXJydXB0X2hhbmRsZWQgPSBBQ1BJX0lOVEVSUlVQVF9OT1RfSEFORExFRDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV2X2dwZV94cnVwdF9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShldl9ncGVfeHJ1cHRfaGFuZGxlcik7CiAKIAkvKgogCSAqIFdlIGFyZSBndWFyYW50ZWVkIGJ5IHRoZSBBQ1BJIENBIGluaXRpYWxpemF0aW9uL3NodXRkb3duIGNvZGUgdGhhdApAQCAtMTQwLDcgKzE0MCw3IEBACiB7CiAJdTMyIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXZfaW5zdGFsbF9zY2lfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXZfaW5zdGFsbF9zY2lfaGFuZGxlcik7CiAKIAlzdGF0dXMgPSBhY3BpX29zX2luc3RhbGxfaW50ZXJydXB0X2hhbmRsZXIoKHUzMikgYWNwaV9nYmxfRkFEVC0+c2NpX2ludCwKIAkJCQkJCSAgIGFjcGlfZXZfc2NpX3hydXB0X2hhbmRsZXIsCkBAIC0xNzEsNyArMTcxLDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJldl9yZW1vdmVfc2NpX2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV2X3JlbW92ZV9zY2lfaGFuZGxlcik7CiAKIAkvKiBKdXN0IGxldCB0aGUgT1MgcmVtb3ZlIHRoZSBoYW5kbGVyIGFuZCBkaXNhYmxlIHRoZSBsZXZlbCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCmluZGV4IGIzOGIzOWQuLjc2YzM0YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmFjZS5jCkBAIC00MSw4ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNldmVudHMuaD4KQEAgLTY4LDcgKzY2LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfZXhjZXB0aW9uX2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcik7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTkwLDYgKzg4LDggQEAKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfRVZFTlRTKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9leGNlcHRpb25faGFuZGxlcikKICNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDcsMTQgKzEwNywxMyBAQAogICogICAgICAgICAgICAgIGV2ZW50LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcih1MzIgZXZlbnQsCiAJCQkJIGFjcGlfZXZlbnRfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpjb250ZXh0KQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9maXhlZF9ldmVudF9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0xNjEsNyArMTYwLDcgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfZml4ZWRfZXZlbnRfaGFuZGxlcik7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2ZpeGVkX2V2ZW50X2hhbmRsZXIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTc1LDEzICsxNzQsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBEaXNhYmxlcyB0aGUgZXZlbnQgYW5kIHVucmVnaXN0ZXJzIHRoZSBldmVudCBoYW5kbGVyLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKHUzMiBldmVudCwgYWNwaV9ldmVudF9oYW5kbGVyIGhhbmRsZXIpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9maXhlZF9ldmVudF9oYW5kbGVyKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTIxNiw3ICsyMTQsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2ZpeGVkX2V2ZW50X2hhbmRsZXIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjM1LDcgKzIzMyw2IEBACiAgKiBERVNDUklQVElPTjogSW5zdGFsbCBhIGhhbmRsZXIgZm9yIG5vdGlmaWVzIG9uIGFuIEFDUEkgZGV2aWNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCiAJCQkgICAgdTMyIGhhbmRsZXJfdHlwZSwKQEAgLTI0Niw3ICsyNDMsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTI3NSw2ICsyNzIsNyBAQAogCSAqIG9ubHkgb25lIDxleHRlcm5hbD4gZ2xvYmFsIGhhbmRsZXIgY2FuIGJlIHJlZ3NpdGVyZWQgKHBlciBub3RpZnkgdHlwZSkuCiAJICovCiAJaWYgKGRldmljZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSB7CisKIAkJLyogTWFrZSBzdXJlIHRoZSBoYW5kbGVyIGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZCAqLwogCiAJCWlmICgoKGhhbmRsZXJfdHlwZSAmIEFDUElfU1lTVEVNX05PVElGWSkgJiYKQEAgLTMxNyw2ICszMTUsNyBAQAogCiAJCW9ial9kZXNjID0gYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KG5vZGUpOwogCQlpZiAob2JqX2Rlc2MpIHsKKwogCQkJLyogT2JqZWN0IGV4aXN0cyAtIG1ha2Ugc3VyZSB0aGVyZSdzIG5vIGhhbmRsZXIgKi8KIAogCQkJaWYgKCgoaGFuZGxlcl90eXBlICYgQUNQSV9TWVNURU1fTk9USUZZKSAmJgpAQCAtMzcwLDYgKzM2OSw3IEBACiAJCX0KIAogCQlpZiAoaGFuZGxlcl90eXBlID09IEFDUElfQUxMX05PVElGWSkgeworCiAJCQkvKiBFeHRyYSByZWYgaWYgaW5zdGFsbGVkIGluIGJvdGggKi8KIAogCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKG5vdGlmeV9vYmopOwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzk5LDcgKzM5OSw2IEBACiAgKiBERVNDUklQVElPTjogUmVtb3ZlIGEgaGFuZGxlciBmb3Igbm90aWZpZXMgb24gYW4gQUNQSSBkZXZpY2UKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoYWNwaV9oYW5kbGUgZGV2aWNlLAogCQkJICAgdTMyIGhhbmRsZXJfdHlwZSwgYWNwaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyKQpAQCAtNDA5LDcgKzQwOCw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTUzNSw3ICs1MzQsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ub3RpZnlfaGFuZGxlcikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC01NTQsNyArNTUzLDYgQEAKICAqIERFU0NSSVBUSU9OOiBJbnN0YWxsIGEgaGFuZGxlciBmb3IgYSBHZW5lcmFsIFB1cnBvc2UgRXZlbnQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcihhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkJIHUzMiBncGVfbnVtYmVyLApAQCAtNTY1LDcgKzU2Myw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfY3B1X2ZsYWdzIGZsYWdzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZ3BlX2hhbmRsZXIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtNTk2LDcgKzU5NCw3IEBACiAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdCBoYW5kbGVyIG9iamVjdCAqLwogCi0JaGFuZGxlciA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfaGFuZGxlcl9pbmZvKSk7CisJaGFuZGxlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9oYW5kbGVyX2luZm8pKTsKIAlpZiAoIWhhbmRsZXIpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIHVubG9ja19hbmRfZXhpdDsKQEAgLTYzMCw3ICs2MjgsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9ncGVfaGFuZGxlcik7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9oYW5kbGVyKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTY0Niw3ICs2NDQsNiBAQAogICogREVTQ1JJUFRJT046IFJlbW92ZSBhIGhhbmRsZXIgZm9yIGEgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsCiAJCQl1MzIgZ3BlX251bWJlciwgYWNwaV9ldmVudF9oYW5kbGVyIGFkZHJlc3MpCkBAIC02NTYsNyArNjUzLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9jcHVfZmxhZ3MgZmxhZ3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9ncGVfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtNzI0LDE0ICs3MjEsMTQgQEAKIAogCS8qIE5vdyB3ZSBjYW4gZnJlZSB0aGUgaGFuZGxlciBvYmplY3QgKi8KIAotCUFDUElfTUVNX0ZSRUUoaGFuZGxlcik7CisJQUNQSV9GUkVFKGhhbmRsZXIpOwogCiAgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VWRU5UUyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2hhbmRsZXIpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2dwZV9oYW5kbGVyKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTc0Niw3ICs3NDMsNiBAQAogICogREVTQ1JJUFRJT046IEFjcXVpcmUgdGhlIEFDUEkgR2xvYmFsIExvY2sKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2sodTE2IHRpbWVvdXQsIHUzMiAqIGhhbmRsZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CkBAIC03NzEsNyArNzY3LDcgQEAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9hY3F1aXJlX2dsb2JhbF9sb2NrKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2spCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNzg0LDcgKzc4MCw2IEBACiAgKiBERVNDUklQVElPTjogUmVsZWFzZSB0aGUgQUNQSSBHbG9iYWwgTG9jay4gVGhlIGhhbmRsZSBtdXN0IGJlIHZhbGlkLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jayh1MzIgaGFuZGxlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTc5Nyw0ICs3OTIsNCBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX3JlbGVhc2VfZ2xvYmFsX2xvY2spOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfcmVsZWFzZV9nbG9iYWxfbG9jaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZmV2bnQuYwppbmRleCBlYzljZTg0Li43ZWJjMmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZldm50LmMKKysrIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmZXZudC5jCkBAIC00MSw4ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY2V2ZW50cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KQEAgLTY1LDcgKzYzLDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VuYWJsZSk7CiAKIAkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0aGUgRkFEVCAqLwogCkBAIC05NCw2ICs5Miw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZSkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9kaXNhYmxlCkBAIC0xMDUsMTIgKzEwNSwxMSBAQAogICogREVTQ1JJUFRJT046IFRyYW5zZmVycyB0aGUgc3lzdGVtIGludG8gTEVHQUNZIChub24tQUNQSSkgbW9kZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGUodm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZGlzYWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9kaXNhYmxlKTsKIAogCWlmICghYWNwaV9nYmxfRkFEVCkgewogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJObyBGQURUIGluZm9ybWF0aW9uIHByZXNlbnQhIikpOwpAQCAtMTM3LDYgKzEzNiw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGUpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZW5hYmxlX2V2ZW50CkBAIC0xNDksMTMgKzE1MCwxMiBAQAogICogREVTQ1JJUFRJT046IEVuYWJsZSBhbiBBQ1BJIGV2ZW50IChmaXhlZCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9ldmVudCh1MzIgZXZlbnQsIHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1MzIgdmFsdWU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZV9ldmVudCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfZXZlbnQpOwogCiAJLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwogCkBAIC0xOTMsNyArMTkzLDcgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ldmVudCk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZXZlbnQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjA4LDEzICsyMDgsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBTZXQgdGhlIHR5cGUgb2YgYW4gaW5kaXZpZHVhbCBHUEUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX3NldF9ncGVfdHlwZShhY3BpX2hhbmRsZSBncGVfZGV2aWNlLCB1MzIgZ3BlX251bWJlciwgdTggdHlwZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3NldF9ncGVfdHlwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZ3BlX3R5cGUpOwogCiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIEdQRSBudW1iZXIgKi8KIApAQCAtMjM2LDcgKzIzNSw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9zZXRfZ3BlX3R5cGUpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2dwZV90eXBlKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI1MiwxMyArMjUxLDEyIEBACiAgKiBERVNDUklQVElPTjogRW5hYmxlIGFuIEFDUEkgZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2VuYWJsZV9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VuYWJsZV9ncGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW5hYmxlX2dwZSk7CiAKIAkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIApAQCAtMjg4LDcgKzI4Niw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9lbmFibGVfZ3BlKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9ncGUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzA0LDEzICszMDIsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBEaXNhYmxlIGFuIEFDUEkgZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZ3BlKGFjcGlfaGFuZGxlIGdwZV9kZXZpY2UsIHUzMiBncGVfbnVtYmVyLCB1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJc3RydWN0IGFjcGlfZ3BlX2V2ZW50X2luZm8gKmdwZV9ldmVudF9pbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kaXNhYmxlX2dwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9kaXNhYmxlX2dwZSk7CiAKIAkvKiBVc2Ugc2VtYXBob3JlIGxvY2sgaWYgbm90IGV4ZWN1dGluZyBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KIApAQCAtMzM4LDYgKzMzNSw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVfZ3BlKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2Rpc2FibGVfZXZlbnQKQEAgLTM1MCwxMyArMzQ5LDEyIEBACiAgKiBERVNDUklQVElPTjogRGlzYWJsZSBhbiBBQ1BJIGV2ZW50IChmaXhlZCkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2Rpc2FibGVfZXZlbnQodTMyIGV2ZW50LCB1MzIgZmxhZ3MpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdTMyIHZhbHVlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kaXNhYmxlX2V2ZW50Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2Rpc2FibGVfZXZlbnQpOwogCiAJLyogRGVjb2RlIHRoZSBGaXhlZCBFdmVudCAqLwogCkBAIC0zOTIsNyArMzkwLDcgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2Rpc2FibGVfZXZlbnQpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGlzYWJsZV9ldmVudCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00MDUsMTIgKzQwMywxMSBAQAogICogREVTQ1JJUFRJT046IENsZWFyIGFuIEFDUEkgZXZlbnQgKGZpeGVkKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfY2xlYXJfZXZlbnQodTMyIGV2ZW50KQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9jbGVhcl9ldmVudCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ldmVudCk7CiAKIAkvKiBEZWNvZGUgdGhlIEZpeGVkIEV2ZW50ICovCiAKQEAgLTQyOSw3ICs0MjYsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfY2xlYXJfZXZlbnQpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfY2xlYXJfZXZlbnQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDQ0LDEzICs0NDEsMTIgQEAKICAqIERFU0NSSVBUSU9OOiBDbGVhciBhbiBBQ1BJIGV2ZW50IChnZW5lcmFsIHB1cnBvc2UpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9jbGVhcl9ncGUoYWNwaV9oYW5kbGUgZ3BlX2RldmljZSwgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2NsZWFyX2dwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9jbGVhcl9ncGUpOwogCiAJLyogVXNlIHNlbWFwaG9yZSBsb2NrIGlmIG5vdCBleGVjdXRpbmcgYXQgaW50ZXJydXB0IGxldmVsICovCiAKQEAgLTQ3OCw2ICs0NzQsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9jbGVhcl9ncGUpCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00OTIsMTIgKzQ5MCwxMSBAQAogICogREVTQ1JJUFRJT046IE9idGFpbnMgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBldmVudAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfZ2V0X2V2ZW50X3N0YXR1cyh1MzIgZXZlbnQsIGFjcGlfZXZlbnRfc3RhdHVzICogZXZlbnRfc3RhdHVzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfZXZlbnRfc3RhdHVzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9ldmVudF9zdGF0dXMpOwogCiAJaWYgKCFldmVudF9zdGF0dXMpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtNTE4LDYgKzUxNSw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ldmVudF9zdGF0dXMpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2dwZV9zdGF0dXMKQEAgLTUzMyw3ICs1MzIsNiBAQAogICogREVTQ1JJUFRJT046IEdldCBzdGF0dXMgb2YgYW4gZXZlbnQgKGdlbmVyYWwgcHVycG9zZSkKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfZ3BlX3N0YXR1cyhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkgICAgdTMyIGdwZV9udW1iZXIsIHUzMiBmbGFncywgYWNwaV9ldmVudF9zdGF0dXMgKiBldmVudF9zdGF0dXMpCkBAIC01NDEsNyArNTM5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9ncGVfc3RhdHVzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9ncGVfc3RhdHVzKTsKIAogCS8qIFVzZSBzZW1hcGhvcmUgbG9jayBpZiBub3QgZXhlY3V0aW5nIGF0IGludGVycnVwdCBsZXZlbCAqLwogCkBAIC01NzAsNiArNTY4LDggQEAKIAl9CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9ncGVfc3RhdHVzKQogI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTU4Niw3ICs1ODYsNiBAQAogICogREVTQ1JJUFRJT046IENyZWF0ZSBhbmQgSW5zdGFsbCBhIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9pbnN0YWxsX2dwZV9ibG9jayhhY3BpX2hhbmRsZSBncGVfZGV2aWNlLAogCQkgICAgICAgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICpncGVfYmxvY2tfYWRkcmVzcywKQEAgLTU5Nyw3ICs1OTYsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICpncGVfYmxvY2s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luc3RhbGxfZ3BlX2Jsb2NrKTsKIAogCWlmICgoIWdwZV9kZXZpY2UpIHx8ICghZ3BlX2Jsb2NrX2FkZHJlc3MpIHx8ICghcmVnaXN0ZXJfY291bnQpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTYzNiw2ICs2MzUsNyBAQAogCiAJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJaWYgKCFvYmpfZGVzYykgeworCiAJCS8qIE5vIG9iamVjdCwgY3JlYXRlIGEgbmV3IG9uZSAqLwogCiAJCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9ERVZJQ0UpOwpAQCAtNjY1LDcgKzY2NSw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9ibG9jayk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbnN0YWxsX2dwZV9ibG9jaykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NzgsMTQgKzY3OCwxMyBAQAogICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGJsb2NrIG9mIEdQRSByZWdpc3RlcnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX3JlbW92ZV9ncGVfYmxvY2soYWNwaV9oYW5kbGUgZ3BlX2RldmljZSkKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3JlbW92ZV9ncGVfYmxvY2siKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcmVtb3ZlX2dwZV9ibG9jayk7CiAKIAlpZiAoIWdwZV9kZXZpY2UpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtNzIxLDQgKzcyMCw0IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfZ3BlX2Jsb2NrKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JlbW92ZV9ncGVfYmxvY2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2eGZyZWduLmMKaW5kZXggYWJmNWNhYy4uZThiODZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldnhmcmVnbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZ4ZnJlZ24uYwpAQCAtNDIsOCArNDIsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CkBAIC03NSw3ICs3Myw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9pbnN0YWxsX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0xMTQsNyArMTEyLDcgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2luc3RhbGxfYWRkcmVzc19zcGFjZV9oYW5kbGVyKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEyOSw3ICsxMjcsNiBAQAogICogREVTQ1JJUFRJT046IFJlbW92ZSBhIHByZXZpb3VzbHkgaW5zdGFsbGVkIGhhbmRsZXIuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcihhY3BpX2hhbmRsZSBkZXZpY2UsCiAJCQkJICBhY3BpX2Fkcl9zcGFjZV90eXBlIHNwYWNlX2lkLApAQCAtMTQyLDcgKzEzOSw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3JlbW92ZV9hZGRyZXNzX3NwYWNlX2hhbmRsZXIpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtMTc2LDkgKzE3MywxMSBAQAogCWhhbmRsZXJfb2JqID0gb2JqX2Rlc2MtPmRldmljZS5oYW5kbGVyOwogCWxhc3Rfb2JqX3B0ciA9ICZvYmpfZGVzYy0+ZGV2aWNlLmhhbmRsZXI7CiAJd2hpbGUgKGhhbmRsZXJfb2JqKSB7CisKIAkJLyogV2UgaGF2ZSBhIGhhbmRsZXIsIHNlZSBpZiB1c2VyIHJlcXVlc3RlZCB0aGlzIG9uZSAqLwogCiAJCWlmIChoYW5kbGVyX29iai0+YWRkcmVzc19zcGFjZS5zcGFjZV9pZCA9PSBzcGFjZV9pZCkgeworCiAJCQkvKiBNYXRjaGVkIHNwYWNlX2lkLCBmaXJzdCBkZXJlZmVyZW5jZSB0aGlzIGluIHRoZSBSZWdpb25zICovCiAKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfT1BSRUdJT04sCkBAIC0yMjksNyArMjI4LDcgQEAKIAkvKiBUaGUgaGFuZGxlciBkb2VzIG5vdCBleGlzdCAqLwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9PUFJFR0lPTiwKLQkJCSAgIlVuYWJsZSB0byByZW1vdmUgYWRkcmVzcyBoYW5kbGVyICVwIGZvciAlcyglWCksIGRldl9ub2RlICVwLCBvYmogJXBcbiIsCisJCQkgICJVbmFibGUgdG8gcmVtb3ZlIGFkZHJlc3MgaGFuZGxlciAlcCBmb3IgJXMoJVgpLCBEZXZOb2RlICVwLCBvYmogJXBcbiIsCiAJCQkgIGhhbmRsZXIsIGFjcGlfdXRfZ2V0X3JlZ2lvbl9uYW1lKHNwYWNlX2lkKSwgc3BhY2VfaWQsCiAJCQkgIG5vZGUsIG9ial9kZXNjKSk7CiAKQEAgLTI0MCw0ICsyMzksNCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfcmVtb3ZlX2FkZHJlc3Nfc3BhY2VfaGFuZGxlcik7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9yZW1vdmVfYWRkcmVzc19zcGFjZV9oYW5kbGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29uZmlnLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYwppbmRleCBhMjk3ODJmLi44MjMzNTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjb25maWcuYwpAQCAtODIsNyArODIsNyBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgdGFibGVfaW5mbzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2FkZF90YWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWRkX3RhYmxlKTsKIAogCS8qIENyZWF0ZSBhbiBvYmplY3QgdG8gYmUgdGhlIHRhYmxlIGhhbmRsZSAqLwogCkBAIC0xMDAsNyArMTAwLDcgQEAKIAogCUFDUElfTUVNU0VUKCZ0YWJsZV9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCi0JdGFibGVfaW5mby50eXBlID0gQUNQSV9UQUJMRV9TU0RUOworCXRhYmxlX2luZm8udHlwZSA9IEFDUElfVEFCTEVfSURfU1NEVDsKIAl0YWJsZV9pbmZvLnBvaW50ZXIgPSB0YWJsZTsKIAl0YWJsZV9pbmZvLmxlbmd0aCA9IChhY3BpX3NpemUpIHRhYmxlLT5sZW5ndGg7CiAJdGFibGVfaW5mby5hbGxvY2F0aW9uID0gQUNQSV9NRU1fQUxMT0NBVEVEOwpAQCAtMTEwLDYgKzExMCw3IEBACiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgeworCiAJCQkvKiBUYWJsZSBhbHJlYWR5IGV4aXN0cywganVzdCByZXR1cm4gdGhlIGhhbmRsZSAqLwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpAQCAtMTIxLDYgKzEyMiw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGUodGFibGVfaW5mby5pbnN0YWxsZWRfZGVzYywgcGFyZW50X25vZGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCiAJCS8qIFVuaW5zdGFsbCB0YWJsZSBvbiBlcnJvciAqLwogCiAJCSh2b2lkKWFjcGlfdGJfdW5pbnN0YWxsX3RhYmxlKHRhYmxlX2luZm8uaW5zdGFsbGVkX2Rlc2MpOwpAQCAtMTYwLDcgKzE2Miw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmFtZXRlcl9ub2RlID0gTlVMTDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZGJfaGFuZGxlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfbG9hZF90YWJsZV9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfbG9hZF90YWJsZV9vcCk7CiAKICNpZiAwCiAJLyoKQEAgLTE2OSw2ICsxNzEsNyBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfdGJfbWF0Y2hfc2lnbmF0dXJlKG9wZXJhbmRbMF0tPnN0cmluZy5wb2ludGVyLCBOVUxMKTsKIAlpZiAoc3RhdHVzID09IEFFX09LKSB7CisKIAkJLyogU2lnbmF0dXJlIG1hdGNoZWQgLS0gZG9uJ3QgYWxsb3cgb3ZlcnJpZGUgKi8KIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwpAQCAtMjExLDkgKzIxNCw4IEBACiAJCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgbmFtZXNwYWNlIHdoZXJlIHRoZSB0YWJsZSB3aWxsIGJlIGxvYWRlZC4KIAkJICovCiAJCXN0YXR1cyA9Ci0JCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgob3BlcmFuZFszXS0+c3RyaW5nLnBvaW50ZXIsCi0JCQkJCSAgICAgc3RhcnRfbm9kZSwgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAotCQkJCQkgICAgICZwYXJlbnRfbm9kZSk7CisJCSAgICBhY3BpX25zX2dldF9ub2RlKHN0YXJ0X25vZGUsIG9wZXJhbmRbM10tPnN0cmluZy5wb2ludGVyLAorCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULCAmcGFyZW50X25vZGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CkBAIC0yMzQsOSArMjM2LDggQEAKIAkJLyogRmluZCB0aGUgbm9kZSByZWZlcmVuY2VkIGJ5IHRoZSBwYXJhbWV0ZXJfcGF0aF9zdHJpbmcgKi8KIAogCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKG9wZXJhbmRbNF0tPnN0cmluZy5wb2ludGVyLAotCQkJCQkgICAgIHN0YXJ0X25vZGUsIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKLQkJCQkJICAgICAmcGFyYW1ldGVyX25vZGUpOworCQkgICAgYWNwaV9uc19nZXRfbm9kZShzdGFydF9ub2RlLCBvcGVyYW5kWzRdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkgICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwgJnBhcmFtZXRlcl9ub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJfQpAQCAtMjUyLDYgKzI1Myw3IEBACiAJLyogUGFyYW1ldGVyIERhdGEgKG9wdGlvbmFsKSAqLwogCiAJaWYgKHBhcmFtZXRlcl9ub2RlKSB7CisKIAkJLyogU3RvcmUgdGhlIHBhcmFtZXRlciBkYXRhIGludG8gdGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvYmplY3QgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKG9wZXJhbmRbNV0sCkBAIC0yOTQsOSArMjk2LDEwIEBACiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZV9wdHIgPSBOVUxMOwogCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciB0YWJsZV9oZWFkZXI7CisJYWNwaV9pbnRlZ2VyIHRlbXA7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9sb2FkX29wIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9sb2FkX29wKTsKIAogCS8qIE9iamVjdCBjYW4gYmUgZWl0aGVyIGFuIG9wX3JlZ2lvbiBvciBhIEZpZWxkICovCiAKQEAgLTMyMiw3ICszMjUsNyBAQAogCiAJCWFkZHJlc3MgPSBvYmpfZGVzYy0+cmVnaW9uLmFkZHJlc3M7CiAKLQkJLyogR2V0IHRoZSB0YWJsZSBsZW5ndGggZnJvbSB0aGUgdGFibGUgaGVhZGVyICovCisJCS8qIEdldCBwYXJ0IG9mIHRoZSB0YWJsZSBoZWFkZXIgdG8gZ2V0IHRoZSB0YWJsZSBsZW5ndGggKi8KIAogCQl0YWJsZV9oZWFkZXIubGVuZ3RoID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewpAQCAtMzMwLDExICszMzMsMTQgQEAKIAkJCSAgICBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2gob2JqX2Rlc2MsIEFDUElfUkVBRCwKIAkJCQkJCQkgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQogCQkJCQkJCSAgIChpICsgYWRkcmVzcyksIDgsCi0JCQkJCQkJICAgKCh1OCAqKSAmCi0JCQkJCQkJICAgIHRhYmxlX2hlYWRlcikgKyBpKTsKKwkJCQkJCQkgICAmdGVtcCk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAkJCX0KKworCQkJLyogR2V0IHRoZSBvbmUgdmFsaWQgYnl0ZSBvZiB0aGUgcmV0dXJuZWQgNjQtYml0IHZhbHVlICovCisKKwkJCUFDUElfQ0FTVF9QVFIodTgsICZ0YWJsZV9oZWFkZXIpW2ldID0gKHU4KSB0ZW1wOwogCQl9CiAKIAkJLyogU2FuaXR5IGNoZWNrIHRoZSB0YWJsZSBsZW5ndGggKi8KQEAgLTM0NSw3ICszNTEsNyBAQAogCiAJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgZW50aXJlIHRhYmxlICovCiAKLQkJdGFibGVfcHRyID0gQUNQSV9NRU1fQUxMT0NBVEUodGFibGVfaGVhZGVyLmxlbmd0aCk7CisJCXRhYmxlX3B0ciA9IEFDUElfQUxMT0NBVEUodGFibGVfaGVhZGVyLmxlbmd0aCk7CiAJCWlmICghdGFibGVfcHRyKSB7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAkJfQpAQCAtMzU3LDExICszNjMsMTQgQEAKIAkJCSAgICBhY3BpX2V2X2FkZHJlc3Nfc3BhY2VfZGlzcGF0Y2gob2JqX2Rlc2MsIEFDUElfUkVBRCwKIAkJCQkJCQkgICAoYWNwaV9waHlzaWNhbF9hZGRyZXNzKQogCQkJCQkJCSAgIChpICsgYWRkcmVzcyksIDgsCi0JCQkJCQkJICAgKCh1OCAqKSB0YWJsZV9wdHIgKwotCQkJCQkJCSAgICBpKSk7CisJCQkJCQkJICAgJnRlbXApOwogCQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQkJZ290byBjbGVhbnVwOwogCQkJfQorCisJCQkvKiBHZXQgdGhlIG9uZSB2YWxpZCBieXRlIG9mIHRoZSByZXR1cm5lZCA2NC1iaXQgdmFsdWUgKi8KKworCQkJQUNQSV9DQVNUX1BUUih1OCwgdGFibGVfcHRyKVtpXSA9ICh1OCkgdGVtcDsKIAkJfQogCQlicmVhazsKIApAQCAtNDA3LDEyICs0MTYsOCBAQAogCiAJLyogVGhlIHRhYmxlIG11c3QgYmUgZWl0aGVyIGFuIFNTRFQgb3IgYSBQU0RUICovCiAKLQlpZiAoKCFBQ1BJX1NUUk5DTVAodGFibGVfcHRyLT5zaWduYXR1cmUsCi0JCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfUFNEVF0uc2lnbmF0dXJlLAotCQkJICAgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX1BTRFRdLnNpZ19sZW5ndGgpKSAmJgotCSAgICAoIUFDUElfU1RSTkNNUCh0YWJsZV9wdHItPnNpZ25hdHVyZSwKLQkJCSAgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9TU0RUXS5zaWduYXR1cmUsCi0JCQkgICBhY3BpX2dibF90YWJsZV9kYXRhW0FDUElfVEFCTEVfU1NEVF0uc2lnX2xlbmd0aCkpKSB7CisJaWYgKCghQUNQSV9DT01QQVJFX05BTUUodGFibGVfcHRyLT5zaWduYXR1cmUsIFBTRFRfU0lHKSkgJiYKKwkgICAgKCFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9wdHItPnNpZ25hdHVyZSwgU1NEVF9TSUcpKSkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAogCQkJICAgICJUYWJsZSBoYXMgaW52YWxpZCBzaWduYXR1cmUgWyU0LjRzXSwgbXVzdCBiZSBTU0RUIG9yIFBTRFQiLAogCQkJICAgIHRhYmxlX3B0ci0+c2lnbmF0dXJlKSk7CkBAIC00MjQsNiArNDI5LDcgQEAKIAogCXN0YXR1cyA9IGFjcGlfZXhfYWRkX3RhYmxlKHRhYmxlX3B0ciwgYWNwaV9nYmxfcm9vdF9ub2RlLCAmZGRiX2hhbmRsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJLyogT24gZXJyb3IsIHRhYmxlX3B0ciB3YXMgZGVhbGxvY2F0ZWQgYWJvdmUgKi8KIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTQ0Miw3ICs0NDgsNyBAQAogCiAgICAgICBjbGVhbnVwOgogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFKHRhYmxlX3B0cik7CisJCUFDUElfRlJFRSh0YWJsZV9wdHIpOwogCX0KIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KQEAgLTQ2NSw3ICs0NzEsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRhYmxlX2Rlc2MgPSBkZGJfaGFuZGxlOwogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF91bmxvYWRfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3VubG9hZF90YWJsZSk7CiAKIAkvKgogCSAqIFZhbGlkYXRlIHRoZSBoYW5kbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNvbnZydC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKaW5kZXggZTZkNTJlMS4uYjczMmUzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4Y29udnJ0LmMKQEAgLTc5LDcgKzc5LDcgQEAKIAl1MzIgY291bnQ7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NvbnZlcnRfdG9faW50ZWdlciIsIG9ial9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jb252ZXJ0X3RvX2ludGVnZXIsIG9ial9kZXNjKTsKIAogCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpKSB7CiAJY2FzZSBBQ1BJX1RZUEVfSU5URUdFUjoKQEAgLTE5OSw3ICsxOTksNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwogCXU4ICpuZXdfYnVmOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NvbnZlcnRfdG9fYnVmZmVyIiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NvbnZlcnRfdG9fYnVmZmVyLCBvYmpfZGVzYyk7CiAKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKQEAgLTMxOSw2ICszMTksNyBAQAogCQlyZW1haW5kZXIgPSAwOwogCiAJCWZvciAoaSA9IGRlY2ltYWxfbGVuZ3RoOyBpID4gMDsgaS0tKSB7CisKIAkJCS8qIERpdmlkZSBieSBudGggZmFjdG9yIG9mIDEwICovCiAKIAkJCWRpZ2l0ID0gaW50ZWdlcjsKQEAgLTM0Niw2ICszNDcsNyBAQAogCiAJCWhleF9sZW5ndGggPSAoYWNwaV9uYXRpdmVfdWludCkgQUNQSV9NVUxfMihkYXRhX3dpZHRoKTsKIAkJZm9yIChpID0gMCwgaiA9IChoZXhfbGVuZ3RoIC0gMSk7IGkgPCBoZXhfbGVuZ3RoOyBpKyssIGotLSkgeworCiAJCQkvKiBHZXQgb25lIGhleCBkaWdpdCwgbW9zdCBzaWduaWZpY2FudCBkaWdpdHMgZmlyc3QgKi8KIAogCQkJc3RyaW5nW2tdID0KQEAgLTQwMCw3ICs0MDIsNyBAQAogCXUxNiBiYXNlID0gMTY7CiAJdTggc2VwYXJhdG9yID0gJywnOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NvbnZlcnRfdG9fc3RyaW5nIiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NvbnZlcnRfdG9fc3RyaW5nLCBvYmpfZGVzYyk7CiAKIAlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSkgewogCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKQEAgLTU2Nyw3ICs1NjksNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY29udmVydF90b190YXJnZXRfdHlwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY29udmVydF90b190YXJnZXRfdHlwZSk7CiAKIAkvKiBEZWZhdWx0IGJlaGF2aW9yICovCiAKQEAgLTY1Nyw3ICs2NTksNyBAQAogCiAJZGVmYXVsdDoKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIGFtbF9vcGNvZGUgJVggZGVzdF90eXBlICVzIiwKKwkJCSAgICAiVW5rbm93biBUYXJnZXQgdHlwZSBJRCAweCVYIEFtbE9wY29kZSAlWCBEZXN0VHlwZSAlcyIsCiAJCQkgICAgR0VUX0NVUlJFTlRfQVJHX1RZUEUod2Fsa19zdGF0ZS0+b3BfaW5mby0+CiAJCQkJCQkgcnVudGltZV9hcmdzKSwKIAkJCSAgICB3YWxrX3N0YXRlLT5vcGNvZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhjcmVhdGUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCmluZGV4IDY4MDU3NTQuLjEwNmRjNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGNyZWF0ZS5jCkBAIC02OSw3ICs2OSw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmFsaWFzX25vZGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jcmVhdGVfYWxpYXMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2NyZWF0ZV9hbGlhcyk7CiAKIAkvKiBHZXQgdGhlIHNvdXJjZS9hbGlhcyBvcGVyYW5kcyAoYm90aCBuYW1lc3BhY2Ugbm9kZXMpICovCiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NyZWF0ZV9ldmVudCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX2V2ZW50KTsKIAogCW9ial9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9FVkVOVCk7CiAJaWYgKCFvYmpfZGVzYykgewpAQCAtMjE2LDcgKzIxNiw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfY3JlYXRlX211dGV4IiwgQUNQSV9XQUxLX09QRVJBTkRTKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jcmVhdGVfbXV0ZXgsIEFDUElfV0FMS19PUEVSQU5EUyk7CiAKIAkvKiBDcmVhdGUgdGhlIG5ldyBtdXRleCBvYmplY3QgKi8KIApAQCAtMjQzLDggKzI0Myw5IEBACiAJb2JqX2Rlc2MtPm11dGV4Lm5vZGUgPQogCSAgICAoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKil3YWxrX3N0YXRlLT5vcGVyYW5kc1swXTsKIAotCXN0YXR1cyA9IGFjcGlfbnNfYXR0YWNoX29iamVjdChvYmpfZGVzYy0+bXV0ZXgubm9kZSwKLQkJCQkgICAgICAgb2JqX2Rlc2MsIEFDUElfVFlQRV9NVVRFWCk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9uc19hdHRhY2hfb2JqZWN0KG9ial9kZXNjLT5tdXRleC5ub2RlLCBvYmpfZGVzYywKKwkJCQkgIEFDUElfVFlQRV9NVVRFWCk7CiAKICAgICAgIGNsZWFudXA6CiAJLyoKQEAgLTI4MCw3ICsyODEsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY3JlYXRlX3JlZ2lvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX3JlZ2lvbik7CiAKIAkvKiBHZXQgdGhlIE5hbWVzcGFjZSBOb2RlICovCiAKQEAgLTMwMCw3ICszMDEsNyBAQAogCSAqLwogCWlmICgocmVnaW9uX3NwYWNlID49IEFDUElfTlVNX1BSRURFRklORURfUkVHSU9OUykgJiYKIAkgICAgKHJlZ2lvbl9zcGFjZSA8IEFDUElfVVNFUl9SRUdJT05fQkVHSU4pKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIGFkZHJlc3Nfc3BhY2UgdHlwZSAlWCIsCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIEFkZHJlc3NTcGFjZSB0eXBlICVYIiwKIAkJCSAgICByZWdpb25fc3BhY2UpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlZBTElEX1NQQUNFX0lEKTsKIAl9CkBAIC0zNjQsNyArMzY1LDcgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZ2lvbl9vYmoyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY3JlYXRlX3RhYmxlX3JlZ2lvbik7CiAKIAkvKiBHZXQgdGhlIE5vZGUgZnJvbSB0aGUgb2JqZWN0IHN0YWNrICAqLwogCkBAIC00NTIsNyArNDUzLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfY3JlYXRlX3Byb2Nlc3NvciIsIHdhbGtfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NyZWF0ZV9wcm9jZXNzb3IsIHdhbGtfc3RhdGUpOwogCiAJLyogQ3JlYXRlIHRoZSBwcm9jZXNzb3Igb2JqZWN0ICovCiAKQEAgLTQ2NCw5ICs0NjUsOSBAQAogCS8qIEluaXRpYWxpemUgdGhlIHByb2Nlc3NvciBvYmplY3QgZnJvbSB0aGUgb3BlcmFuZHMgKi8KIAogCW9ial9kZXNjLT5wcm9jZXNzb3IucHJvY19pZCA9ICh1OCkgb3BlcmFuZFsxXS0+aW50ZWdlci52YWx1ZTsKKwlvYmpfZGVzYy0+cHJvY2Vzc29yLmxlbmd0aCA9ICh1OCkgb3BlcmFuZFszXS0+aW50ZWdlci52YWx1ZTsKIAlvYmpfZGVzYy0+cHJvY2Vzc29yLmFkZHJlc3MgPQogCSAgICAoYWNwaV9pb19hZGRyZXNzKSBvcGVyYW5kWzJdLT5pbnRlZ2VyLnZhbHVlOwotCW9ial9kZXNjLT5wcm9jZXNzb3IubGVuZ3RoID0gKHU4KSBvcGVyYW5kWzNdLT5pbnRlZ2VyLnZhbHVlOwogCiAJLyogSW5zdGFsbCB0aGUgcHJvY2Vzc29yIG9iamVjdCBpbiB0aGUgcGFyZW50IE5vZGUgKi8KIApAQCAtNDk5LDcgKzUwMCw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSIsIHdhbGtfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2NyZWF0ZV9wb3dlcl9yZXNvdXJjZSwgd2Fsa19zdGF0ZSk7CiAKIAkvKiBDcmVhdGUgdGhlIHBvd2VyIHJlc291cmNlIG9iamVjdCAqLwogCkBAIC01NDksNyArNTUwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTggbWV0aG9kX2ZsYWdzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2NyZWF0ZV9tZXRob2QiLCB3YWxrX3N0YXRlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9jcmVhdGVfbWV0aG9kLCB3YWxrX3N0YXRlKTsKIAogCS8qIENyZWF0ZSBhIG5ldyBtZXRob2Qgb2JqZWN0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYwppbmRleCBhN2NjYThkLi43Yjk3MThlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCkBAIC02MSw2ICs2MSwxMCBAQAogCiBzdGF0aWMgdm9pZCBhY3BpX2V4X291dF9hZGRyZXNzKGNoYXIgKnRpdGxlLCBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgdmFsdWUpOwogCitzdGF0aWMgdm9pZAorYWNwaV9leF9kdW1wX29iamVjdCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJICAgIHN0cnVjdCBhY3BpX2V4ZHVtcF9pbmZvICppbmZvKTsKKwogc3RhdGljIHZvaWQgYWNwaV9leF9kdW1wX3JlZmVyZW5jZV9vYmoodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwogCiBzdGF0aWMgdm9pZApAQCAtMTE5LDcgKzEyMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9leGR1bXBfaW5mbyBhY3BpX2V4X2R1bXBfbWV0aG9kWzhdID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9tZXRob2QpLCBOVUxMfSwKLQl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtZXRob2QucGFyYW1fY291bnQpLCAicGFyYW1fY291bnQifSwKKwl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtZXRob2QucGFyYW1fY291bnQpLCAiUGFyYW1Db3VudCJ9LAogCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG1ldGhvZC5jb25jdXJyZW5jeSksICJDb25jdXJyZW5jeSJ9LAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobWV0aG9kLnNlbWFwaG9yZSksICJTZW1hcGhvcmUifSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX09GRlNFVChtZXRob2Qub3duZXJfaWQpLCAiT3duZXIgSWQifSwKQEAgLTI2MywxMiArMjY3LDEwIEBACiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChjb21tb25fZmllbGQubm9kZSksICJQYXJlbnQgTm9kZSJ9CiB9OwogCi1zdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX25vZGVbNl0gPSB7CitzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX25vZGVbNV0gPSB7CiAJe0FDUElfRVhEX0lOSVQsIEFDUElfRVhEX1RBQkxFX1NJWkUoYWNwaV9leF9kdW1wX25vZGUpLCBOVUxMfSwKIAl7QUNQSV9FWERfVUlOVDgsIEFDUElfRVhEX05TT0ZGU0VUKGZsYWdzKSwgIkZsYWdzIn0sCiAJe0FDUElfRVhEX1VJTlQ4LCBBQ1BJX0VYRF9OU09GRlNFVChvd25lcl9pZCksICJPd25lciBJZCJ9LAotCXtBQ1BJX0VYRF9VSU5UMTYsIEFDUElfRVhEX05TT0ZGU0VUKHJlZmVyZW5jZV9jb3VudCksCi0JICJSZWZlcmVuY2UgQ291bnQifSwKIAl7QUNQSV9FWERfUE9JTlRFUiwgQUNQSV9FWERfTlNPRkZTRVQoY2hpbGQpLCAiQ2hpbGQgTGlzdCJ9LAogCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9OU09GRlNFVChwZWVyKSwgIk5leHQgUGVlciJ9CiB9OwpAQCAtMzMwLDcgKzMzMiw3IEBACiAKIAlpZiAoIWluZm8pIHsKIAkJYWNwaV9vc19wcmludGYKLQkJICAgICgiZXhfZHVtcF9vYmplY3Q6IERpc3BsYXkgbm90IGltcGxlbWVudGVkIGZvciBvYmplY3QgdHlwZSAlc1xuIiwKKwkJICAgICgiRXhEdW1wT2JqZWN0OiBEaXNwbGF5IG5vdCBpbXBsZW1lbnRlZCBmb3Igb2JqZWN0IHR5cGUgJXNcbiIsCiAJCSAgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShvYmpfZGVzYykpOwogCQlyZXR1cm47CiAJfQpAQCAtNDU0LDcgKzQ1Niw3IEBACiAJdTMyIGxlbmd0aDsKIAl1MzIgaW5kZXg7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImV4X2R1bXBfb3BlcmFuZCIpCisJQUNQSV9GVU5DVElPTl9OQU1FKGV4X2R1bXBfb3BlcmFuZCkKIAogCSAgICBpZiAoIQogCQkoKEFDUElfTFZfRVhFQyAmIGFjcGlfZGJnX2xldmVsKQpAQCAtNDYzLDYgKzQ2NSw3IEBACiAJfQogCiAJaWYgKCFvYmpfZGVzYykgeworCiAJCS8qIFRoaXMgY291bGQgYmUgYSBudWxsIGVsZW1lbnQgb2YgYSBwYWNrYWdlICovCiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTnVsbCBPYmplY3QgRGVzY3JpcHRvclxuIikpOwpAQCAtNTIyLDcgKzUyNSw3IEBACiAKIAkJY2FzZSBBTUxfUkVGX09GX09QOgogCi0JCQlhY3BpX29zX3ByaW50ZigiUmVmZXJlbmNlOiAocmVmX29mKSAlcFxuIiwKKwkJCWFjcGlfb3NfcHJpbnRmKCJSZWZlcmVuY2U6IChSZWZPZikgJXBcbiIsCiAJCQkJICAgICAgIG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KTsKIAkJCWJyZWFrOwogCkBAIC01MzIsNiArNTM1LDcgQEAKIAkJCQkgICAgICAgb2JqX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQpOwogCiAJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisKIAkJCQkvKiBWYWx1ZSBpcyBhbiBJbnRlZ2VyICovCiAKIAkJCQlhY3BpX29zX3ByaW50ZigiIHZhbHVlIGlzIFslOC44WCU4Ljh4XSIsCkBAIC02MTAsNyArNjE0LDcgQEAKIAogCWNhc2UgQUNQSV9UWVBFX1BBQ0tBR0U6CiAKLQkJYWNwaV9vc19wcmludGYoIlBhY2thZ2UgW0xlbiAlWF0gZWxlbWVudF9hcnJheSAlcFxuIiwKKwkJYWNwaV9vc19wcmludGYoIlBhY2thZ2UgW0xlbiAlWF0gRWxlbWVudEFycmF5ICVwXG4iLAogCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmNvdW50LAogCQkJICAgICAgIG9ial9kZXNjLT5wYWNrYWdlLmVsZW1lbnRzKTsKIApAQCAtNjYyLDEzICs2NjYsMTMgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0JBTktfRklFTEQ6CiAKLQkJYWNwaV9vc19wcmludGYoImJhbmtfZmllbGRcbiIpOworCQlhY3BpX29zX3ByaW50ZigiQmFua0ZpZWxkXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQ6CiAKIAkJYWNwaV9vc19wcmludGYKLQkJICAgICgicmVnaW9uX2ZpZWxkOiBCaXRzPSVYIGFjY193aWR0aD0lWCBMb2NrPSVYIFVwZGF0ZT0lWCBhdCBieXRlPSVYIGJpdD0lWCBvZiBiZWxvdzpcbiIsCisJCSAgICAoIlJlZ2lvbkZpZWxkOiBCaXRzPSVYIEFjY1dpZHRoPSVYIExvY2s9JVggVXBkYXRlPSVYIGF0IGJ5dGU9JVggYml0PSVYIG9mIGJlbG93OlxuIiwKIAkJICAgICBvYmpfZGVzYy0+ZmllbGQuYml0X2xlbmd0aCwKIAkJICAgICBvYmpfZGVzYy0+ZmllbGQuYWNjZXNzX2J5dGVfd2lkdGgsCiAJCSAgICAgb2JqX2Rlc2MtPmZpZWxkLmZpZWxkX2ZsYWdzICYgQU1MX0ZJRUxEX0xPQ0tfUlVMRV9NQVNLLApAQCAtNjgxLDEyICs2ODUsMTIgQEAKIAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCi0JCWFjcGlfb3NfcHJpbnRmKCJpbmRleF9maWVsZFxuIik7CisJCWFjcGlfb3NfcHJpbnRmKCJJbmRleEZpZWxkXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfVFlQRV9CVUZGRVJfRklFTEQ6CiAKLQkJYWNwaV9vc19wcmludGYoImJ1ZmZlcl9maWVsZDogJVggYml0cyBhdCBieXRlICVYIGJpdCAlWCBvZlxuIiwKKwkJYWNwaV9vc19wcmludGYoIkJ1ZmZlckZpZWxkOiAlWCBiaXRzIGF0IGJ5dGUgJVggYml0ICVYIG9mXG4iLAogCQkJICAgICAgIG9ial9kZXNjLT5idWZmZXJfZmllbGQuYml0X2xlbmd0aCwKIAkJCSAgICAgICBvYmpfZGVzYy0+YnVmZmVyX2ZpZWxkLmJhc2VfYnl0ZV9vZmZzZXQsCiAJCQkgICAgICAgb2JqX2Rlc2MtPmJ1ZmZlcl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKQEAgLTc3Nyw3ICs3ODEsNyBAQAogewogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiZXhfZHVtcF9vcGVyYW5kcyIpOworCUFDUElfRlVOQ1RJT05fTkFNRShleF9kdW1wX29wZXJhbmRzKTsKIAogCWlmICghaWRlbnQpIHsKIAkJaWRlbnQgPSAiPyI7CkBAIC05MDEsNyArOTA1LDcgQEAKIAkJCWFjcGlfb3NfcHJpbnRmKCJDb3VsZCBub3QgY29udmVydCBuYW1lIHRvIHBhdGhuYW1lXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWFjcGlfb3NfcHJpbnRmKCIlc1xuIiwgKGNoYXIgKilyZXRfYnVmLnBvaW50ZXIpOwotCQkJQUNQSV9NRU1fRlJFRShyZXRfYnVmLnBvaW50ZXIpOworCQkJQUNQSV9GUkVFKHJldF9idWYucG9pbnRlcik7CiAJCX0KIAl9IGVsc2UgaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0KSB7CiAJCWFjcGlfb3NfcHJpbnRmKCJcblJlZmVyZW5jZWQgT2JqZWN0OiAlcFxuIiwKQEAgLTEwMTcsNyArMTAyMSw3IEBACiB2b2lkCiBhY3BpX2V4X2R1bXBfb2JqZWN0X2Rlc2NyaXB0b3IodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MsIHUzMiBmbGFncykKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yKTsKIAogCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuX1ZPSUQ7CkBAIC0xMDQ2LDcgKzEwNTAsNyBAQAogCiAJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmpfZGVzYykgIT0gQUNQSV9ERVNDX1RZUEVfT1BFUkFORCkgewogCQlhY3BpX29zX3ByaW50ZgotCQkgICAgKCJleF9kdW1wX29iamVjdF9kZXNjcmlwdG9yOiAlcCBpcyBub3QgYW4gQUNQSSBvcGVyYW5kIG9iamVjdDogWyVzXVxuIiwKKwkJICAgICgiRXhEdW1wT2JqZWN0RGVzY3JpcHRvcjogJXAgaXMgbm90IGFuIEFDUEkgb3BlcmFuZCBvYmplY3Q6IFslc11cbiIsCiAJCSAgICAgb2JqX2Rlc2MsIGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbmFtZShvYmpfZGVzYykpOwogCQlyZXR1cm5fVk9JRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmllbGQuYwppbmRleCBlMjU5MjAxLi45ZWE5YzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmaWVsZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZpZWxkLmMKQEAgLTczLDcgKzczLDcgQEAKIAl2b2lkICpidWZmZXI7CiAJdTggbG9ja2VkOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkIiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3JlYWRfZGF0YV9mcm9tX2ZpZWxkLCBvYmpfZGVzYyk7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCkBAIC0xNDIsNiArMTQyLDcgQEAKIAlsZW5ndGggPQogCSAgICAoYWNwaV9zaXplKSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmZpZWxkLmJpdF9sZW5ndGgpOwogCWlmIChsZW5ndGggPiBhY3BpX2dibF9pbnRlZ2VyX2J5dGVfd2lkdGgpIHsKKwogCQkvKiBGaWVsZCBpcyB0b28gbGFyZ2UgZm9yIGFuIEludGVnZXIsIGNyZWF0ZSBhIEJ1ZmZlciBpbnN0ZWFkICovCiAKIAkJYnVmZmVyX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9idWZmZXJfb2JqZWN0KGxlbmd0aCk7CkBAIC0xNjMsMTEgKzE2NCwxMSBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiZmllbGRfcmVhZCBbVE9dOiAgT2JqICVwLCBUeXBlICVYLCBCdWYgJXAsIGJ5dGVfbGVuICVYXG4iLAorCQkJICAiRmllbGRSZWFkIFtUT106ICAgT2JqICVwLCBUeXBlICVYLCBCdWYgJXAsIEJ5dGVMZW4gJVhcbiIsCiAJCQkgIG9ial9kZXNjLCBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyksIGJ1ZmZlciwKIAkJCSAgKHUzMikgbGVuZ3RoKSk7CiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkgICJmaWVsZF9yZWFkIFtGUk9NXTogYml0X2xlbiAlWCwgYml0X29mZiAlWCwgYnl0ZV9vZmYgJVhcbiIsCisJCQkgICJGaWVsZFJlYWQgW0ZST01dOiBCaXRMZW4gJVgsIEJpdE9mZiAlWCwgQnl0ZU9mZiAlWFxuIiwKIAkJCSAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAogCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCiAJCQkgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCkpOwpAQCAtMjE5LDcgKzIyMCw3IEBACiAJdTggbG9ja2VkOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3dyaXRlX2RhdGFfdG9fZmllbGQiLCBvYmpfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfd3JpdGVfZGF0YV90b19maWVsZCwgb2JqX2Rlc2MpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtMzI5LDkgKzMzMCwxMCBAQAogCSAgICBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoKTsKIAogCWlmIChsZW5ndGggPCByZXF1aXJlZF9sZW5ndGgpIHsKKwogCQkvKiBXZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBidWZmZXIgKi8KIAotCQluZXdfYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7CisJCW5ld19idWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChyZXF1aXJlZF9sZW5ndGgpOwogCQlpZiAoIW5ld19idWZmZXIpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CkBAIC0zNDcsMTQgKzM0OSwxNCBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiZmllbGRfd3JpdGUgW0ZST01dOiBPYmogJXAgKCVzOiVYKSwgQnVmICVwLCBieXRlX2xlbiAlWFxuIiwKKwkJCSAgIkZpZWxkV3JpdGUgW0ZST01dOiBPYmogJXAgKCVzOiVYKSwgQnVmICVwLCBCeXRlTGVuICVYXG4iLAogCQkJICBzb3VyY2VfZGVzYywKIAkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKEFDUElfR0VUX09CSkVDVF9UWVBFCiAJCQkJCQkoc291cmNlX2Rlc2MpKSwKIAkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpLCBidWZmZXIsIGxlbmd0aCkpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkgICJmaWVsZF93cml0ZSBbVE9dOiAgT2JqICVwICglczolWCksIGJpdF9sZW4gJVgsIGJpdF9vZmYgJVgsIGJ5dGVfb2ZmICVYXG4iLAorCQkJICAiRmllbGRXcml0ZSBbVE9dOiAgIE9iaiAlcCAoJXM6JVgpLCBCaXRMZW4gJVgsIEJpdE9mZiAlWCwgQnl0ZU9mZiAlWFxuIiwKIAkJCSAgb2JqX2Rlc2MsCiAJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykpLAogCQkJICBBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYyksCkBAIC0zNzUsNyArMzc3LDcgQEAKIAkvKiBGcmVlIHRlbXBvcmFyeSBidWZmZXIgaWYgd2UgdXNlZCBvbmUgKi8KIAogCWlmIChuZXdfYnVmZmVyKSB7Ci0JCUFDUElfTUVNX0ZSRUUobmV3X2J1ZmZlcik7CisJCUFDUElfRlJFRShuZXdfYnVmZmVyKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhmbGRpby5jCmluZGV4IGJkMWFmMzUuLjA1MTA1M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGZsZGlvLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZmxkaW8uYwpAQCAtODcsNyArODcsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV4X3NldHVwX3JlZ2lvbiIsIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihleF9zZXR1cF9yZWdpb24sIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKIAogCXJnbl9kZXNjID0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5yZWdpb25fb2JqOwogCkBAIC0xMTIsNyArMTEyLDE4IEBACiAJCX0KIAl9CiAKKwkvKiBFeGl0IGlmIEFkZHJlc3MvTGVuZ3RoIGhhdmUgYmVlbiBkaXNhbGxvd2VkIGJ5IHRoZSBob3N0IE9TICovCisKKwlpZiAocmduX2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9JTlZBTElEKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfSUxMRUdBTF9BRERSRVNTKTsKKwl9CisKKwkvKgorCSAqIEV4aXQgbm93IGZvciBTTUJ1cyBhZGRyZXNzIHNwYWNlLCBpdCBoYXMgYSBub24tbGluZWFyIGFkZHJlc3Mgc3BhY2UKKwkgKiBhbmQgdGhlIHJlcXVlc3QgY2Fubm90IGJlIGRpcmVjdGx5IHZhbGlkYXRlZAorCSAqLwogCWlmIChyZ25fZGVzYy0+cmVnaW9uLnNwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NNQlVTKSB7CisKIAkJLyogU01CdXMgaGFzIGEgbm9uLWxpbmVhciBhZGRyZXNzIHNwYWNlICovCiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKQEAgLTEzNCwxMCArMTQ1LDEwIEBACiAJICogbGVuZ3RoIG9mIG9uZSBmaWVsZCBkYXR1bSAoYWNjZXNzIHdpZHRoKSBtdXN0IGZpdCB3aXRoaW4gdGhlIHJlZ2lvbi4KIAkgKiAoUmVnaW9uIGxlbmd0aCBpcyBzcGVjaWZpZWQgaW4gYnl0ZXMpCiAJICovCi0JaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCi0JCQkJICAgICAgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0ICsKLQkJCQkgICAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KLQkJCQkgICAgICAgYWNjZXNzX2J5dGVfd2lkdGgpKSB7CisJaWYgKHJnbl9kZXNjLT5yZWdpb24ubGVuZ3RoIDwKKwkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuYmFzZV9ieXRlX29mZnNldCArCisJICAgICBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCArCisJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSkgewogCQlpZiAoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrKSB7CiAJCQkvKgogCQkJICogU2xhY2sgbW9kZSBvbmx5OiAgV2Ugd2lsbCBnbyBhaGVhZCBhbmQgYWxsb3cgYWNjZXNzIHRvIHRoaXMKQEAgLTIxNyw3ICsyMjgsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJnbl9kZXNjOwogCWFjcGlfcGh5c2ljYWxfYWRkcmVzcyBhZGRyZXNzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWNjZXNzX3JlZ2lvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfYWNjZXNzX3JlZ2lvbik7CiAKIAkvKgogCSAqIEVuc3VyZSB0aGF0IHRoZSByZWdpb24gb3BlcmFuZHMgYXJlIGZ1bGx5IGV2YWx1YXRlZCBhbmQgdmVyaWZ5CkBAIC0yNDYsNyArMjU3LDcgQEAKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9CRklFTEQsCi0JCQkgICAgICAiIFJlZ2lvbiBbJXM6JVhdLCBXaWR0aCAlWCwgYnl0ZV9iYXNlICVYLCBPZmZzZXQgJVggYXQgJTguOFglOC44WFxuIiwKKwkJCSAgICAgICIgUmVnaW9uIFslczolWF0sIFdpZHRoICVYLCBCeXRlQmFzZSAlWCwgT2Zmc2V0ICVYIGF0ICU4LjhYJTguOFhcbiIsCiAJCQkgICAgICBhY3BpX3V0X2dldF9yZWdpb25fbmFtZShyZ25fZGVzYy0+cmVnaW9uLgogCQkJCQkJICAgICAgc3BhY2VfaWQpLAogCQkJICAgICAgcmduX2Rlc2MtPnJlZ2lvbi5zcGFjZV9pZCwKQEAgLTM1Miw3ICszNjMsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2ludGVnZXIgbG9jYWxfdmFsdWU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXhfZmllbGRfZGF0dW1faW8iLCBmaWVsZF9kYXR1bV9ieXRlX29mZnNldCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXhfZmllbGRfZGF0dW1faW8sIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0KTsKIAogCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgewogCQlpZiAoIXZhbHVlKSB7CkBAIC00ODcsMTAgKzQ5OCwxMSBAQAogCQl9CiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkJICAiSS9PIHRvIERhdGEgUmVnaXN0ZXI6IHZhbHVlX3B0ciAlcFxuIiwKKwkJCQkgICJJL08gdG8gRGF0YSBSZWdpc3RlcjogVmFsdWVQdHIgJXBcbiIsCiAJCQkJICB2YWx1ZSkpOwogCiAJCWlmIChyZWFkX3dyaXRlID09IEFDUElfUkVBRCkgeworCiAJCQkvKiBSZWFkIHRoZSBkYXR1bSBmcm9tIHRoZSBkYXRhX3JlZ2lzdGVyICovCiAKIAkJCXN0YXR1cyA9CkBAIC01NTksNyArNTcxLDcgQEAKIAlhY3BpX2ludGVnZXIgbWVyZ2VkX3ZhbHVlOwogCWFjcGlfaW50ZWdlciBjdXJyZW50X3ZhbHVlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoImV4X3dyaXRlX3dpdGhfdXBkYXRlX3J1bGUiLCBtYXNrKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMihleF93cml0ZV93aXRoX3VwZGF0ZV9ydWxlLCBtYXNrKTsKIAogCS8qIFN0YXJ0IHdpdGggdGhlIG5ldyBiaXRzICAqLwogCkBAIC01NjgsNiArNTgwLDcgQEAKIAkvKiBJZiB0aGUgbWFzayBpcyBhbGwgb25lcywgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgdXBkYXRlIHJ1bGUgKi8KIAogCWlmIChtYXNrICE9IEFDUElfSU5URUdFUl9NQVgpIHsKKwogCQkvKiBEZWNvZGUgdGhlIHVwZGF0ZSBydWxlICovCiAKIAkJc3dpdGNoIChvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgpAQCAtNjE0LDcgKzYyNyw3IEBACiAJCWRlZmF1bHQ6CiAKIAkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJICAgICJVbmtub3duIHVwZGF0ZV9ydWxlIHZhbHVlOiAlWCIsCisJCQkJICAgICJVbmtub3duIFVwZGF0ZVJ1bGUgdmFsdWU6ICVYIiwKIAkJCQkgICAgKG9ial9kZXNjLT5jb21tb25fZmllbGQuCiAJCQkJICAgICBmaWVsZF9mbGFncyAmCiAJCQkJICAgICBBTUxfRklFTERfVVBEQVRFX1JVTEVfTUFTSykpKTsKQEAgLTYyMyw3ICs2MzYsNyBAQAogCX0KIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiTWFzayAlOC44WCU4LjhYLCBkYXR1bV9vZmZzZXQgJVgsIFdpZHRoICVYLCBWYWx1ZSAlOC44WCU4LjhYLCBtZXJnZWRfdmFsdWUgJTguOFglOC44WFxuIiwKKwkJCSAgIk1hc2sgJTguOFglOC44WCwgRGF0dW1PZmZzZXQgJVgsIFdpZHRoICVYLCBWYWx1ZSAlOC44WCU4LjhYLCBNZXJnZWRWYWx1ZSAlOC44WCU4LjhYXG4iLAogCQkJICBBQ1BJX0ZPUk1BVF9VSU5UNjQobWFzayksCiAJCQkgIGZpZWxkX2RhdHVtX2J5dGVfb2Zmc2V0LAogCQkJICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLApAQCAtNjY2LDcgKzY3OSw3IEBACiAJdTMyIGZpZWxkX2RhdHVtX2NvdW50OwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZXh0cmFjdF9mcm9tX2ZpZWxkIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9leHRyYWN0X2Zyb21fZmllbGQpOwogCiAJLyogVmFsaWRhdGUgdGFyZ2V0IGJ1ZmZlciBhbmQgY2xlYXIgaXQgKi8KIApAQCAtNzA0LDYgKzcxNyw3IEBACiAJLyogUmVhZCB0aGUgcmVzdCBvZiB0aGUgZmllbGQgKi8KIAogCWZvciAoaSA9IDE7IGkgPCBmaWVsZF9kYXR1bV9jb3VudDsgaSsrKSB7CisKIAkJLyogR2V0IG5leHQgaW5wdXQgZGF0dW0gZnJvbSB0aGUgZmllbGQgKi8KIAogCQlmaWVsZF9vZmZzZXQgKz0gb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aDsKQEAgLTc3MSw2ICs3ODUsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2ludGVnZXIgbWFzazsKKwlhY3BpX2ludGVnZXIgd2lkdGhfbWFzazsKIAlhY3BpX2ludGVnZXIgbWVyZ2VkX2RhdHVtOwogCWFjcGlfaW50ZWdlciByYXdfZGF0dW0gPSAwOwogCXUzMiBmaWVsZF9vZmZzZXQgPSAwOwpAQCAtNzgwLDcgKzc5NSw3IEBACiAJdTMyIGZpZWxkX2RhdHVtX2NvdW50OwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfaW5zZXJ0X2ludG9fZmllbGQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2luc2VydF9pbnRvX2ZpZWxkKTsKIAogCS8qIFZhbGlkYXRlIGlucHV0IGJ1ZmZlciAqLwogCkBAIC03OTUsMTUgKzgxMCwyMCBAQAogCiAJLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGRhdHVtcyAoYWNjZXNzIHdpZHRoIGRhdGEgaXRlbXMpICovCiAKKwl3aWR0aF9tYXNrID0KKwkgICAgQUNQSV9NQVNLX0JJVFNfQUJPVkUob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoKTsKIAltYXNrID0KLQkgICAgQUNQSV9NQVNLX0JJVFNfQkVMT1cob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKLQlkYXR1bV9jb3VudCA9Ci0JICAgIEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoLAotCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmFjY2Vzc19iaXRfd2lkdGgpOwotCWZpZWxkX2RhdHVtX2NvdW50ID0KLQkgICAgQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGggKwotCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCi0JCQkgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7CisJICAgIHdpZHRoX21hc2sgJiBBQ1BJX01BU0tfQklUU19CRUxPVyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0KTsKKworCWRhdHVtX2NvdW50ID0gQUNQSV9ST1VORF9VUF9UTyhvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLmJpdF9sZW5ndGgsCisJCQkJICAgICAgIG9ial9kZXNjLT5jb21tb25fZmllbGQuYWNjZXNzX2JpdF93aWR0aCk7CisKKwlmaWVsZF9kYXR1bV9jb3VudCA9IEFDUElfUk9VTkRfVVBfVE8ob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5iaXRfbGVuZ3RoICsKKwkJCQkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLgorCQkJCQkgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCisJCQkJCSAgICAgb2JqX2Rlc2MtPmNvbW1vbl9maWVsZC4KKwkJCQkJICAgICBhY2Nlc3NfYml0X3dpZHRoKTsKIAogCS8qIEdldCBpbml0aWFsIERhdHVtIGZyb20gdGhlIGlucHV0IGJ1ZmZlciAqLwogCkBAIC04MTcsNiArODM3LDcgQEAKIAkvKiBXcml0ZSB0aGUgZW50aXJlIGZpZWxkICovCiAKIAlmb3IgKGkgPSAxOyBpIDwgZmllbGRfZGF0dW1fY291bnQ7IGkrKykgeworCiAJCS8qIFdyaXRlIG1lcmdlZCBkYXR1bSB0byB0aGUgdGFyZ2V0IGZpZWxkICovCiAKIAkJbWVyZ2VkX2RhdHVtICY9IG1hc2s7CkBAIC04MzMsNyArODU0LDcgQEAKIAkJbWVyZ2VkX2RhdHVtID0gcmF3X2RhdHVtID4+CiAJCSAgICAob2JqX2Rlc2MtPmNvbW1vbl9maWVsZC5hY2Nlc3NfYml0X3dpZHRoIC0KIAkJICAgICBvYmpfZGVzYy0+Y29tbW9uX2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQpOwotCQltYXNrID0gQUNQSV9JTlRFR0VSX01BWDsKKwkJbWFzayA9IHdpZHRoX21hc2s7CiAKIAkJaWYgKGkgPT0gZGF0dW1fY291bnQpIHsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bWlzYy5jCmluZGV4IDQ4YzE4ZDIuLmJkOThhYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG1pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtaXNjLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZlcmVuY2Vfb2JqOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJlZmVyZW5jZWRfb2JqOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2dldF9vYmplY3RfcmVmZXJlbmNlIiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2dldF9vYmplY3RfcmVmZXJlbmNlLCBvYmpfZGVzYyk7CiAKIAkqcmV0dXJuX2Rlc2MgPSBOVUxMOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlhY3BpX3NpemUgbGVuZ3RoMTsKIAlhY3BpX3NpemUgbmV3X2xlbmd0aDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2NvbmNhdF90ZW1wbGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfY29uY2F0X3RlbXBsYXRlKTsKIAogCS8qCiAJICogRmluZCB0aGUgZW5kX3RhZyBkZXNjcmlwdG9yIGluIGVhY2ggcmVzb3VyY2UgdGVtcGxhdGUuCkBAIC0yNTAsNyArMjUwLDcgQEAKIAljaGFyICpuZXdfYnVmOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2RvX2NvbmNhdGVuYXRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kb19jb25jYXRlbmF0ZSk7CiAKIAkvKgogCSAqIENvbnZlcnQgdGhlIHNlY29uZCBvcGVyYW5kIGlmIG5lY2Vzc2FyeS4gIFRoZSBmaXJzdCBvcGVyYW5kCkBAIC00NDUsMTAgKzQ0NSwyNCBAQAogCiAJY2FzZSBBTUxfU0hJRlRfTEVGVF9PUDoJLyogc2hpZnRfbGVmdCAoT3BlcmFuZCwgc2hpZnRfY291bnQsIFJlc3VsdCkgKi8KIAorCQkvKgorCQkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBzaGlmdGNvdW50IGlzIGxhcmdlciB0aGFuIHRoZSBpbnRlZ2VyIGJpdAorCQkgKiB3aWR0aCBzaW5jZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBpcyBub3Qgd2VsbC1kZWZpbmVkIGluIHRoZSBDIGxhbmd1YWdlLgorCQkgKi8KKwkJaWYgKGludGVnZXIxID49IGFjcGlfZ2JsX2ludGVnZXJfYml0X3dpZHRoKSB7CisJCQlyZXR1cm4gKDApOworCQl9CiAJCXJldHVybiAoaW50ZWdlcjAgPDwgaW50ZWdlcjEpOwogCiAJY2FzZSBBTUxfU0hJRlRfUklHSFRfT1A6CS8qIHNoaWZ0X3JpZ2h0IChPcGVyYW5kLCBzaGlmdF9jb3VudCwgUmVzdWx0KSAqLwogCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHNoaWZ0Y291bnQgaXMgbGFyZ2VyIHRoYW4gdGhlIGludGVnZXIgYml0CisJCSAqIHdpZHRoIHNpbmNlIHRoZSBiZWhhdmlvciBvZiB0aGlzIGlzIG5vdCB3ZWxsLWRlZmluZWQgaW4gdGhlIEMgbGFuZ3VhZ2UuCisJCSAqLworCQlpZiAoaW50ZWdlcjEgPj0gYWNwaV9nYmxfaW50ZWdlcl9iaXRfd2lkdGgpIHsKKwkJCXJldHVybiAoMCk7CisJCX0KIAkJcmV0dXJuIChpbnRlZ2VyMCA+PiBpbnRlZ2VyMSk7CiAKIAljYXNlIEFNTF9TVUJUUkFDVF9PUDoJLyogU3VidHJhY3QgKEludGVnZXIwLCBJbnRlZ2VyMSwgUmVzdWx0KSAqLwpAQCAtNDg5LDcgKzUwMyw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdTggbG9jYWxfcmVzdWx0ID0gRkFMU0U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kb19sb2dpY2FsX251bWVyaWNfb3AiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCk7CiAKIAlzd2l0Y2ggKG9wY29kZSkgewogCWNhc2UgQU1MX0xBTkRfT1A6CS8qIExBbmQgKEludGVnZXIwLCBJbnRlZ2VyMSkgKi8KQEAgLTU1Nyw3ICs1NzEsNyBAQAogCXU4IGxvY2FsX3Jlc3VsdCA9IEZBTFNFOwogCWludCBjb21wYXJlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZG9fbG9naWNhbF9vcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZG9fbG9naWNhbF9vcCk7CiAKIAkvKgogCSAqIENvbnZlcnQgdGhlIHNlY29uZCBvcGVyYW5kIGlmIG5lY2Vzc2FyeS4gIFRoZSBmaXJzdCBvcGVyYW5kCkBAIC02NDksNiArNjYzLDcgQEAKIAkJCS8qIExlbmd0aCBhbmQgYWxsIGJ5dGVzIG11c3QgYmUgZXF1YWwgKi8KIAogCQkJaWYgKChsZW5ndGgwID09IGxlbmd0aDEpICYmIChjb21wYXJlID09IDApKSB7CisKIAkJCQkvKiBMZW5ndGggYW5kIGFsbCBieXRlcyBtYXRjaCA9PT4gVFJVRSAqLwogCiAJCQkJbG9jYWxfcmVzdWx0ID0gVFJVRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmluZGV4IGY4NDNiMjIuLjkzMDk4ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwpAQCAtNjEsNyArNjEsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFJlbW92ZSBhIG11dGV4IGZyb20gdGhlICJhY3F1aXJlZF9tdXRleCIgbGlzdAorICogREVTQ1JJUFRJT046IFJlbW92ZSBhIG11dGV4IGZyb20gdGhlICJBY3F1aXJlZE11dGV4IiBsaXN0CiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtOTUsNyArOTUsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IEFkZCBhIG11dGV4IHRvIHRoZSAiYWNxdWlyZWRfbXV0ZXgiIGxpc3QgZm9yIHRoaXMgd2FsaworICogREVTQ1JJUFRJT046IEFkZCBhIG11dGV4IHRvIHRoZSAiQWNxdWlyZWRNdXRleCIgbGlzdCBmb3IgdGhpcyB3YWxrCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTQ0LDcgKzE0NCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X2FjcXVpcmVfbXV0ZXgiLCBvYmpfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfYWNxdWlyZV9tdXRleCwgb2JqX2Rlc2MpOwogCiAJaWYgKCFvYmpfZGVzYykgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAkgKi8KIAlpZiAod2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwgPiBvYmpfZGVzYy0+bXV0ZXguc3luY19sZXZlbCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJDYW5ub3QgYWNxdWlyZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3Qgc3luY19sZXZlbCIsCisJCQkgICAgIkNhbm5vdCBhY3F1aXJlIE11dGV4IFslNC40c10sIGluY29ycmVjdCBTeW5jTGV2ZWwiLAogCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9NVVRFWF9PUkRFUik7CiAJfQpAQCAtMTczLDYgKzE3Myw3IEBACiAJLyogU3VwcG9ydCBmb3IgbXVsdGlwbGUgYWNxdWlyZXMgYnkgdGhlIG93bmluZyB0aHJlYWQgKi8KIAogCWlmIChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkKSB7CisKIAkJLyogU3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jaywgYWxsb3cgYWxsIHRocmVhZHMgKi8KIAogCQlpZiAoKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCA9PQpAQCAtMTkyLDYgKzE5Myw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX2V4X3N5c3RlbV9hY3F1aXJlX211dGV4KHRpbWVfZGVzYywgb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCiAJCS8qIEluY2x1ZGVzIGZhaWx1cmUgZnJvbSBhIHRpbWVvdXQgb24gdGltZV9kZXNjICovCiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0yMzIsNyArMjM0LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZWxlYXNlX211dGV4Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9yZWxlYXNlX211dGV4KTsKIAogCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMjc3LDcgKzI3OSw3IEBACiAJICovCiAJaWYgKG9ial9kZXNjLT5tdXRleC5zeW5jX2xldmVsID4gd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWwpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiQ2Fubm90IHJlbGVhc2UgTXV0ZXggWyU0LjRzXSwgaW5jb3JyZWN0IHN5bmNfbGV2ZWwiLAorCQkJICAgICJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBpbmNvcnJlY3QgU3luY0xldmVsIiwKIAkJCSAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUob2JqX2Rlc2MtPm11dGV4Lm5vZGUpKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTVVURVhfT1JERVIpOwogCX0KQEAgLTI4Niw2ICsyODgsNyBAQAogCiAJb2JqX2Rlc2MtPm11dGV4LmFjcXVpc2l0aW9uX2RlcHRoLS07CiAJaWYgKG9ial9kZXNjLT5tdXRleC5hY3F1aXNpdGlvbl9kZXB0aCAhPSAwKSB7CisKIAkJLyogSnVzdCBkZWNyZW1lbnQgdGhlIGRlcHRoIGFuZCByZXR1cm4gKi8KIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG5hbWVzLmMKaW5kZXggMDU0ZmU1ZS4uZDNkNzAzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bmFtZXMuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhuYW1lcy5jCkBAIC03Nyw3ICs3Nyw3IEBACiAJY2hhciAqbmFtZV9zdHJpbmc7CiAJdTMyIHNpemVfbmVlZGVkOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfYWxsb2NhdGVfbmFtZV9zdHJpbmciKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2FsbG9jYXRlX25hbWVfc3RyaW5nKTsKIAogCS8qCiAJICogQWxsb3cgcm9vbSBmb3IgYWxsIFwgYW5kIF4gcHJlZml4ZXMsIGFsbCBzZWdtZW50cyBhbmQgYSBtdWx0aV9uYW1lX3ByZWZpeC4KQEAgLTg1LDYgKzg1LDcgQEAKIAkgKiBUaGlzIG1heSBhY3R1YWxseSBiZSBzb21ld2hhdCBsb25nZXIgdGhhbiBuZWVkZWQuCiAJICovCiAJaWYgKHByZWZpeF9jb3VudCA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKKwogCQkvKiBTcGVjaWFsIGNhc2UgZm9yIHJvb3QgKi8KIAogCQlzaXplX25lZWRlZCA9IDEgKyAoQUNQSV9OQU1FX1NJWkUgKiBudW1fbmFtZV9zZWdzKSArIDIgKyAxOwpAQCAtOTcsNyArOTgsNyBAQAogCSAqIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgbmFtZS4KIAkgKiBUaGlzIGJ1ZmZlciBtdXN0IGJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlciEKIAkgKi8KLQluYW1lX3N0cmluZyA9IEFDUElfTUVNX0FMTE9DQVRFKHNpemVfbmVlZGVkKTsKKwluYW1lX3N0cmluZyA9IEFDUElfQUxMT0NBVEUoc2l6ZV9uZWVkZWQpOwogCWlmICghbmFtZV9zdHJpbmcpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJWQiLCBzaXplX25lZWRlZCkpOwpAQCAtMTE5LDExICsxMjAsMTMgQEAKIAkvKiBTZXQgdXAgRHVhbCBvciBNdWx0aSBwcmVmaXhlcyBpZiBuZWVkZWQgKi8KIAogCWlmIChudW1fbmFtZV9zZWdzID4gMikgeworCiAJCS8qIFNldCB1cCBtdWx0aSBwcmVmaXhlcyAgICovCiAKIAkJKnRlbXBfcHRyKysgPSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A7CiAJCSp0ZW1wX3B0cisrID0gKGNoYXIpbnVtX25hbWVfc2VnczsKIAl9IGVsc2UgaWYgKDIgPT0gbnVtX25hbWVfc2VncykgeworCiAJCS8qIFNldCB1cCBkdWFsIHByZWZpeGVzICovCiAKIAkJKnRlbXBfcHRyKysgPSBBTUxfRFVBTF9OQU1FX1BSRUZJWDsKQEAgLTE1OSw3ICsxNjIsNyBAQAogCXUzMiBpbmRleDsKIAljaGFyIGNoYXJfYnVmWzVdOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfbmFtZV9zZWdtZW50Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9uYW1lX3NlZ21lbnQpOwogCiAJLyoKIAkgKiBJZiBmaXJzdCBjaGFyYWN0ZXIgaXMgYSBkaWdpdCwgdGhlbiB3ZSBrbm93IHRoYXQgd2UgYXJlbid0IGxvb2tpbmcgYXQgYQpAQCAtMTc2LDcgKzE3OSw3IEBACiAKIAlmb3IgKGluZGV4ID0gMDsKIAkgICAgIChpbmRleCA8IEFDUElfTkFNRV9TSVpFKQotCSAgICAgJiYgKGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyYWN0ZXIoKmFtbF9hZGRyZXNzKSk7IGluZGV4KyspIHsKKwkgICAgICYmIChhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcigqYW1sX2FkZHJlc3MsIDApKTsgaW5kZXgrKykgewogCQljaGFyX2J1ZltpbmRleF0gPSAqYW1sX2FkZHJlc3MrKzsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELCAiJWNcbiIsIGNoYXJfYnVmW2luZGV4XSkpOwogCX0KQEAgLTE4NCw2ICsxODcsNyBAQAogCS8qIFZhbGlkIG5hbWUgc2VnbWVudCAgKi8KIAogCWlmIChpbmRleCA9PSA0KSB7CisKIAkJLyogRm91bmQgNCB2YWxpZCBjaGFyYWN0ZXJzICovCiAKIAkJY2hhcl9idWZbNF0gPSAnXDAnOwpAQCAtMjQ5LDExICsyNTMsMTIgQEAKIAl1MzIgcHJlZml4X2NvdW50ID0gMDsKIAl1OCBoYXNfcHJlZml4ID0gRkFMU0U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfZ2V0X25hbWVfc3RyaW5nIiwgYW1sX2FkZHJlc3MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2dldF9uYW1lX3N0cmluZywgYW1sX2FkZHJlc3MpOwogCiAJaWYgKEFDUElfVFlQRV9MT0NBTF9SRUdJT05fRklFTEQgPT0gZGF0YV90eXBlIHx8CiAJICAgIEFDUElfVFlQRV9MT0NBTF9CQU5LX0ZJRUxEID09IGRhdGFfdHlwZSB8fAogCSAgICBBQ1BJX1RZUEVfTE9DQUxfSU5ERVhfRklFTEQgPT0gZGF0YV90eXBlKSB7CisKIAkJLyogRGlzYWxsb3cgcHJlZml4ZXMgZm9yIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBmaWVsZF91bml0IG5hbWVzICovCiAKIAkJbmFtZV9zdHJpbmcgPSBhY3BpX2V4X2FsbG9jYXRlX25hbWVfc3RyaW5nKDAsIDEpOwpAQCAtMjcyLDcgKzI3Nyw3IEBACiAJCWNhc2UgQU1MX1JPT1RfUFJFRklYOgogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCi0JCQkJCSAgInJvb3RfcHJlZml4KFxcKSBhdCAlcFxuIiwKKwkJCQkJICAiUm9vdFByZWZpeChcXCkgYXQgJXBcbiIsCiAJCQkJCSAgYW1sX2FkZHJlc3MpKTsKIAogCQkJLyoKQEAgLTI5MCw3ICsyOTUsNyBAQAogCiAJCQlkbyB7CiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9MT0FELAotCQkJCQkJICAicGFyZW50X3ByZWZpeCAoXikgYXQgJXBcbiIsCisJCQkJCQkgICJQYXJlbnRQcmVmaXggKF4pIGF0ICVwXG4iLAogCQkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQkJYW1sX2FkZHJlc3MrKzsKQEAgLTMxNCw3ICszMTksNyBAQAogCQljYXNlIEFNTF9EVUFMX05BTUVfUFJFRklYOgogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0xPQUQsCi0JCQkJCSAgImR1YWxfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJCSAgIkR1YWxOYW1lUHJlZml4IGF0ICVwXG4iLAogCQkJCQkgIGFtbF9hZGRyZXNzKSk7CiAKIAkJCWFtbF9hZGRyZXNzKys7CkBAIC0zNDEsNyArMzQ2LDcgQEAKIAkJY2FzZSBBTUxfTVVMVElfTkFNRV9QUkVGSVhfT1A6CiAKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTE9BRCwKLQkJCQkJICAibXVsdGlfbmFtZV9wcmVmaXggYXQgJXBcbiIsCisJCQkJCSAgIk11bHRpTmFtZVByZWZpeCBhdCAlcFxuIiwKIAkJCQkJICBhbWxfYWRkcmVzcykpOwogCiAJCQkvKiBGZXRjaCBjb3VudCBvZiBzZWdtZW50cyByZW1haW5pbmcgaW4gbmFtZSBwYXRoICovCkBAIC0zNzcsNyArMzgyLDcgQEAKIAogCQkJaWYgKHByZWZpeF9jb3VudCA9PSBBQ1BJX1VJTlQzMl9NQVgpIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCQkgICJuYW1lX3NlZyBpcyBcIlxcXCIgZm9sbG93ZWQgYnkgTlVMTFxuIikpOworCQkJCQkJICAiTmFtZVNlZyBpcyBcIlxcXCIgZm9sbG93ZWQgYnkgTlVMTFxuIikpOwogCQkJfQogCiAJCQkvKiBDb25zdW1lIHRoZSBOVUxMIGJ5dGUgKi8KQEAgLTQxMCw2ICs0MTUsNyBAQAogCX0KIAogCWlmIChBRV9DVFJMX1BFTkRJTkcgPT0gc3RhdHVzICYmIGhhc19wcmVmaXgpIHsKKwogCQkvKiBSYW4gb3V0IG9mIHNlZ21lbnRzIGFmdGVyIHByb2Nlc3NpbmcgYSBwcmVmaXggKi8KIAogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTWFsZm9ybWVkIE5hbWUgYXQgJXAiLCBuYW1lX3N0cmluZykpOwpAQCAtNDE4LDcgKzQyNCw3IEBACiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKG5hbWVfc3RyaW5nKSB7Ci0JCQlBQ1BJX01FTV9GUkVFKG5hbWVfc3RyaW5nKTsKKwkJCUFDUElfRlJFRShuYW1lX3N0cmluZyk7CiAJCX0KIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcxLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwppbmRleCAyM2QwODIzLi42Mzc0ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhvcGFyZzEuYwpAQCAtODksNyArODksNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMEFfMFRfMVIiLAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8wQV8wVF8xUiwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTE1MCw3ICsxNTAsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipvcGVyYW5kID0gJndhbGtfc3RhdGUtPm9wZXJhbmRzWzBdOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoImV4X29wY29kZV8xQV8wVF8wUiIsCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoZXhfb3Bjb2RlXzFBXzBUXzBSLAogCQkJCWFjcGlfcHNfZ2V0X29wY29kZV9uYW1lKHdhbGtfc3RhdGUtPm9wY29kZSkpOwogCiAJLyogRXhhbWluZSB0aGUgQU1MIG9wY29kZSAqLwpAQCAtMjE2LDcgKzIxNiw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKm9wZXJhbmQgPSAmd2Fsa19zdGF0ZS0+b3BlcmFuZHNbMF07CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzFUXzBSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMVRfMFIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC0yNjQsNyArMjY0LDcgQEAKIAlhY3BpX2ludGVnZXIgcG93ZXJfb2ZfdGVuOwogCWFjcGlfaW50ZWdlciBkaWdpdDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMUFfMVRfMVIiLAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8xQV8xVF8xUiwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4YW1pbmUgdGhlIEFNTCBvcGNvZGUgKi8KQEAgLTMyMiw4ICszMjIsOSBAQAogCiAJCQkvKiBTaW5jZSB0aGUgYml0IHBvc2l0aW9uIGlzIG9uZS1iYXNlZCwgc3VidHJhY3QgZnJvbSAzMyAoNjUpICovCiAKLQkJCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gdGVtcDMyID09IDAgPyAwIDoKLQkJCSAgICAoQUNQSV9JTlRFR0VSX0JJVF9TSVpFICsgMSkgLSB0ZW1wMzI7CisJCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9CisJCQkgICAgdGVtcDMyID09CisJCQkgICAgMCA/IDAgOiAoQUNQSV9JTlRFR0VSX0JJVF9TSVpFICsgMSkgLSB0ZW1wMzI7CiAJCQlicmVhazsKIAogCQljYXNlIEFNTF9GUk9NX0JDRF9PUDoJLyogZnJvbV9iY2QgKEJDRFZhbHVlLCBSZXN1bHQpICovCkBAIC0zNDIsNiArMzQzLDcgQEAKIAkJCWZvciAoaSA9IDA7CiAJCQkgICAgIChpIDwgYWNwaV9nYmxfaW50ZWdlcl9ueWJibGVfd2lkdGgpICYmIChkaWdpdCA+IDApOwogCQkJICAgICBpKyspIHsKKwogCQkJCS8qIEdldCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNC1iaXQgQkNEIGRpZ2l0ICovCiAKIAkJCQl0ZW1wMzIgPSAoKHUzMikgZGlnaXQpICYgMHhGOwpAQCAtNDg3LDYgKzQ4OSw3IEBACiAJCXN0YXR1cyA9IGFjcGlfZXhfY29udmVydF90b19zdHJpbmcob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAogCQkJCQkJICAgQUNQSV9FWFBMSUNJVF9DT05WRVJUX0RFQ0lNQUwpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgeworCiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCiAJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CkBAIC00OTcsNiArNTAwLDcgQEAKIAkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX3N0cmluZyhvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MsCiAJCQkJCQkgICBBQ1BJX0VYUExJQ0lUX0NPTlZFUlRfSEVYKTsKIAkJaWYgKHJldHVybl9kZXNjID09IG9wZXJhbmRbMF0pIHsKKwogCQkJLyogTm8gY29udmVyc2lvbiBwZXJmb3JtZWQsIGFkZCByZWYgdG8gaGFuZGxlIHJldHVybiB2YWx1ZSAqLwogCQkJYWNwaV91dF9hZGRfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAkJfQpAQCAtNTA2LDYgKzUxMCw3IEBACiAKIAkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2J1ZmZlcihvcGVyYW5kWzBdLCAmcmV0dXJuX2Rlc2MpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgeworCiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCiAJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CkBAIC01MTYsNiArNTIxLDcgQEAKIAkJc3RhdHVzID0gYWNwaV9leF9jb252ZXJ0X3RvX2ludGVnZXIob3BlcmFuZFswXSwgJnJldHVybl9kZXNjLAogCQkJCQkJICAgIEFDUElfQU5ZX0JBU0UpOwogCQlpZiAocmV0dXJuX2Rlc2MgPT0gb3BlcmFuZFswXSkgeworCiAJCQkvKiBObyBjb252ZXJzaW9uIHBlcmZvcm1lZCwgYWRkIHJlZiB0byBoYW5kbGUgcmV0dXJuIHZhbHVlICovCiAJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCQl9CkBAIC01NDEsNiArNTQ3LDcgQEAKIAl9CiAKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwogCQkvKiBTdG9yZSB0aGUgcmV0dXJuIHZhbHVlIGNvbXB1dGVkIGFib3ZlIGludG8gdGhlIHRhcmdldCBvYmplY3QgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzFdLCB3YWxrX3N0YXRlKTsKQEAgLTU0OCwxNiArNTU1LDE4IEBACiAKICAgICAgIGNsZWFudXA6CiAKLQlpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKLQkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOwotCX0KLQogCS8qIERlbGV0ZSByZXR1cm4gb2JqZWN0IG9uIGVycm9yICovCiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjKTsKIAl9CiAKKwkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLworCisJZWxzZSBpZiAoIXdhbGtfc3RhdGUtPnJlc3VsdF9vYmopIHsKKwkJd2Fsa19zdGF0ZS0+cmVzdWx0X29iaiA9IHJldHVybl9kZXNjOworCX0KKwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC01ODIsNyArNTkxLDcgQEAKIAl1MzIgdHlwZTsKIAlhY3BpX2ludGVnZXIgdmFsdWU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzFBXzBUXzFSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMUFfMFRfMVIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBFeGFtaW5lIHRoZSBBTUwgb3Bjb2RlICovCkBAIC02MjUsNiArNjM0LDcgQEAKIAkJdGVtcF9kZXNjID0gb3BlcmFuZFswXTsKIAkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRSh0ZW1wX2Rlc2MpID09CiAJCSAgICBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EKSB7CisKIAkJCS8qIEludGVybmFsIHJlZmVyZW5jZSBvYmplY3QgLSBwcmV2ZW50IGRlbGV0aW9uICovCiAKIAkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSh0ZW1wX2Rlc2MpOwpAQCAtNjg5LDYgKzY5OSw3IEBACiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJZ290byBjbGVhbnVwOwogCQl9CisKIAkJLyogQWxsb2NhdGUgYSBkZXNjcmlwdG9yIHRvIGhvbGQgdGhlIHR5cGUuICovCiAKIAkJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwpAQCAtNzc3LDggKzc4OCwyNSBAQAogCiAJCS8qIENoZWNrIGZvciBhIG1ldGhvZCBsb2NhbCBvciBhcmd1bWVudCwgb3Igc3RhbmRhbG9uZSBTdHJpbmcgKi8KIAotCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG9wZXJhbmRbMF0pICE9CisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob3BlcmFuZFswXSkgPT0KIAkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQl0ZW1wX2Rlc2MgPQorCQkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdCgoc3RydWN0CisJCQkJCQkJIGFjcGlfbmFtZXNwYWNlX25vZGUgKikKKwkJCQkJCQlvcGVyYW5kWzBdKTsKKwkJCWlmICh0ZW1wX2Rlc2MKKwkJCSAgICAmJgorCQkJICAgICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUodGVtcF9kZXNjKSA9PQorCQkJICAgICAgQUNQSV9UWVBFX1NUUklORykKKwkJCSAgICAgfHwgKEFDUElfR0VUX09CSkVDVF9UWVBFKHRlbXBfZGVzYykgPT0KKwkJCQkgQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkpKSB7CisJCQkJb3BlcmFuZFswXSA9IHRlbXBfZGVzYzsKKwkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UodGVtcF9kZXNjKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCX0gZWxzZSB7CiAJCQlzd2l0Y2ggKEFDUElfR0VUX09CSkVDVF9UWVBFKG9wZXJhbmRbMF0pKSB7CiAJCQljYXNlIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0U6CiAJCQkJLyoKQEAgLTgyNywyNiArODU1LDM1IEBACiAJCQkJYnJlYWs7CiAKIAkJCWNhc2UgQUNQSV9UWVBFX1NUUklORzoKKwkJCQlicmVhazsKIAorCQkJZGVmYXVsdDoKKwkJCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfQorCisJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUob3BlcmFuZFswXSkgIT0KKwkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisJCQlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkgPT0KKwkJCSAgICBBQ1BJX1RZUEVfU1RSSU5HKSB7CiAJCQkJLyoKIAkJCQkgKiBUaGlzIGlzIGEgZGVyZWZfb2YgKFN0cmluZykuIFRoZSBzdHJpbmcgaXMgYSByZWZlcmVuY2UKIAkJCQkgKiB0byBhIG5hbWVkIEFDUEkgb2JqZWN0LgogCQkJCSAqCiAJCQkJICogMSkgRmluZCB0aGUgb3duaW5nIE5vZGUKLQkJCQkgKiAyKSBEZXJlZmVyZW5jZSB0aGUgbm9kZSB0byBhbiBhY3R1YWwgb2JqZWN0LiAgQ291bGQgYmUgYQorCQkJCSAqIDIpIERlcmVmZXJlbmNlIHRoZSBub2RlIHRvIGFuIGFjdHVhbCBvYmplY3QuIENvdWxkIGJlIGEKIAkJCQkgKiAgICBGaWVsZCwgc28gd2UgbmVlZCB0byByZXNvbHZlIHRoZSBub2RlIHRvIGEgdmFsdWUuCiAJCQkJICovCiAJCQkJc3RhdHVzID0KLQkJCQkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKG9wZXJhbmRbMF0tPnN0cmluZy4KLQkJCQkJCQkgICAgIHBvaW50ZXIsCi0JCQkJCQkJICAgICB3YWxrX3N0YXRlLT4KLQkJCQkJCQkgICAgIHNjb3BlX2luZm8tPnNjb3BlLgotCQkJCQkJCSAgICAgbm9kZSwKLQkJCQkJCQkgICAgIEFDUElfTlNfU0VBUkNIX1BBUkVOVCwKLQkJCQkJCQkgICAgIEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIKLQkJCQkJCQkgICAgIChzdHJ1Y3QKLQkJCQkJCQkgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlLAotCQkJCQkJCSAgICAgICZyZXR1cm5fZGVzYykpOworCQkJCSAgICBhY3BpX25zX2dldF9ub2RlKHdhbGtfc3RhdGUtPnNjb3BlX2luZm8tPgorCQkJCQkJICAgICBzY29wZS5ub2RlLAorCQkJCQkJICAgICBvcGVyYW5kWzBdLT5zdHJpbmcucG9pbnRlciwKKwkJCQkJCSAgICAgQUNQSV9OU19TRUFSQ0hfUEFSRU5ULAorCQkJCQkJICAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSCisJCQkJCQkgICAgIChzdHJ1Y3QKKwkJCQkJCSAgICAgIGFjcGlfbmFtZXNwYWNlX25vZGUsCisJCQkJCQkgICAgICAmcmV0dXJuX2Rlc2MpKTsKIAkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCQkJZ290byBjbGVhbnVwOwogCQkJCX0KQEAgLTg1NywxMSArODk0LDYgQEAKIAkJCQkgICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwgJnJldHVybl9kZXNjKSwKIAkJCQkgICAgIHdhbGtfc3RhdGUpOwogCQkJCWdvdG8gY2xlYW51cDsKLQotCQkJZGVmYXVsdDoKLQotCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7Ci0JCQkJZ290byBjbGVhbnVwOwogCQkJfQogCQl9CiAKQEAgLTkzNywxMyArOTY5LDEyIEBACiAJCQkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UKIAkJCQkJCSAgICAocmV0dXJuX2Rlc2MpOwogCQkJCQl9Ci0KIAkJCQkJYnJlYWs7CiAKIAkJCQlkZWZhdWx0OgogCiAJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCQkgICAgIlVua25vd24gSW5kZXggdGFyZ2V0X3R5cGUgJVggaW4gb2JqICVwIiwKKwkJCQkJCSAgICAiVW5rbm93biBJbmRleCBUYXJnZXRUeXBlICVYIGluIG9iaiAlcCIsCiAJCQkJCQkgICAgb3BlcmFuZFswXS0+cmVmZXJlbmNlLgogCQkJCQkJICAgIHRhcmdldF90eXBlLCBvcGVyYW5kWzBdKSk7CiAJCQkJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CkBAIC05NTcsNyArOTg4LDYgQEAKIAogCQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUocmV0dXJuX2Rlc2MpID09CiAJCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7Ci0KIAkJCQkJcmV0dXJuX2Rlc2MgPQogCQkJCQkgICAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KChzdHJ1Y3QKIAkJCQkJCQkJCSBhY3BpX25hbWVzcGFjZV9ub2RlCkBAIC05NzIsNyArMTAwMiw3IEBACiAKIAkJCWRlZmF1bHQ6CiAJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJVbmtub3duIG9wY29kZSBpbiByZWYoJXApIC0gJVgiLAorCQkJCQkgICAgIlVua25vd24gb3Bjb2RlIGluIHJlZmVyZW5jZSglcCkgLSAlWCIsCiAJCQkJCSAgICBvcGVyYW5kWzBdLAogCQkJCQkgICAgb3BlcmFuZFswXS0+cmVmZXJlbmNlLm9wY29kZSkpOwogCkBAIC05OTgsNiArMTAyOCwxMSBAQAogCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MpOwogCX0KIAotCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwkvKiBTYXZlIHJldHVybiBvYmplY3Qgb24gc3VjY2VzcyAqLworCisJZWxzZSB7CisJCXdhbGtfc3RhdGUtPnJlc3VsdF9vYmogPSByZXR1cm5fZGVzYzsKKwl9CisKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKaW5kZXggZTI2M2E1ZC4uN2QyY2JjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmcyLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAl1MzIgdmFsdWU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzJBXzBUXzBSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMkFfMFRfMFIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBFeGFtaW5lIHRoZSBvcGNvZGUgKi8KQEAgLTEyMSw3ICsxMjEsNyBAQAogI2lmZGVmIEFDUElfR1BFX05PVElGWV9DSEVDSwogCQkvKgogCQkgKiBHUEUgbWV0aG9kIHdha2Uvbm90aWZ5IGNoZWNrLiAgSGVyZSwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB3ZQotCQkgKiBkb24ndCByZWNlaXZlIGFueSAiZGV2aWNlX3dha2UiIE5vdGlmaWVzIGZyb20gYSBHUEUgX0x4eCBvciBfRXh4CisJCSAqIGRvbid0IHJlY2VpdmUgYW55ICJEZXZpY2VXYWtlIiBOb3RpZmllcyBmcm9tIGEgR1BFIF9MeHggb3IgX0V4eAogCQkgKiBHUEUgbWV0aG9kIGR1cmluZyBzeXN0ZW0gcnVudGltZS4gIElmIHdlIGRvLCB0aGUgR1BFIGlzIG1hcmtlZAogCQkgKiBhcyAid2FrZS1vbmx5IiBhbmQgZGlzYWJsZWQuCiAJCSAqCkBAIC0xMzgsNiArMTM4LDcgQEAKIAkJCSAgICBhY3BpX2V2X2NoZWNrX2Zvcl93YWtlX29ubHlfZ3BlKHdhbGtfc3RhdGUtPgogCQkJCQkJCSAgICBncGVfZXZlbnRfaW5mbyk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwogCQkJCS8qIEFFX1dBS0VfT05MWV9HUEUgb25seSBlcnJvciwgbWVhbnMgaWdub3JlIHRoaXMgbm90aWZ5ICovCiAKIAkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spCkBAIC0xODUsNyArMTg2LDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXR1cm5fZGVzYzIgPSBOVUxMOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMlRfMVIiLAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8yQV8yVF8xUiwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwpAQCAtMjUyLDYgKzI1Myw3IEBACiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHJldHVybl9kZXNjMik7CiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwogCQkvKiBEZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAogCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocmV0dXJuX2Rlc2MxKTsKQEAgLTI4MSwxMiArMjgzLDEzIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJYWNwaV9zaXplIGxlbmd0aDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfMkFfMVRfMVIiLAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8yQV8xVF8xUiwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCS8qIEV4ZWN1dGUgdGhlIG9wY29kZSAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX01BVEgpIHsKKwogCQkvKiBBbGwgc2ltcGxlIG1hdGggb3Bjb2RlcyAoYWRkLCBldGMuKSAqLwogCiAJCXJldHVybl9kZXNjID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9JTlRFR0VSKTsKQEAgLTM4Myw1NCArMzg2LDcwIEBACiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAorCQkvKiBJbml0aWFsaXplIHRoZSBJbmRleCByZWZlcmVuY2Ugb2JqZWN0ICovCisKIAkJaW5kZXggPSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOworCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9mZnNldCA9ICh1MzIpIGluZGV4OworCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9IEFNTF9JTkRFWF9PUDsKIAotCQkvKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBQYWNrYWdlLCBCdWZmZXIsIG9yIFN0cmluZyAqLworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50LCB0aGUgU291cmNlIG9wZXJhbmQgaXMgYSBTdHJpbmcsIEJ1ZmZlciwgb3IgUGFja2FnZS4KKwkJICogVmVyaWZ5IHRoYXQgdGhlIGluZGV4IGlzIHdpdGhpbiByYW5nZS4KKwkJICovCisJCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob3BlcmFuZFswXSkpIHsKKwkJY2FzZSBBQ1BJX1RZUEVfU1RSSU5HOgogCi0JCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvcGVyYW5kWzBdKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQkJLyogT2JqZWN0IHRvIGJlIGluZGV4ZWQgaXMgYSBQYWNrYWdlICovCi0KLQkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5wYWNrYWdlLmNvdW50KSB7Ci0JCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkJICAgICJJbmRleCB2YWx1ZSAoJVglOC44WCkgYmV5b25kIHBhY2thZ2UgZW5kICglWCkiLAotCQkJCQkgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZGV4KSwKLQkJCQkJICAgIG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpKTsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKLQkJCQlnb3RvIGNsZWFudXA7Ci0JCQl9Ci0KLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUgPSBBQ1BJX1RZUEVfUEFDS0FHRTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gb3BlcmFuZFswXTsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uud2hlcmUgPQotCQkJICAgICZvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKLQkJfSBlbHNlIHsKLQkJCS8qIE9iamVjdCB0byBiZSBpbmRleGVkIGlzIGEgQnVmZmVyL1N0cmluZyAqLwotCi0JCQlpZiAoaW5kZXggPj0gb3BlcmFuZFswXS0+YnVmZmVyLmxlbmd0aCkgewotCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiSW5kZXggdmFsdWUgKCVYJTguOFgpIGJleW9uZCBlbmQgb2YgYnVmZmVyICglWCkiLAotCQkJCQkgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZGV4KSwKLQkJCQkJICAgIG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpKTsKLQkJCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOwotCQkJCWdvdG8gY2xlYW51cDsKKwkJCWlmIChpbmRleCA+PSBvcGVyYW5kWzBdLT5zdHJpbmcubGVuZ3RoKSB7CisJCQkJc3RhdHVzID0gQUVfQU1MX1NUUklOR19MSU1JVDsKIAkJCX0KIAogCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9CiAJCQkgICAgQUNQSV9UWVBFX0JVRkZFUl9GSUVMRDsKLQkJCXJldHVybl9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0ID0gb3BlcmFuZFswXTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKKworCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPmJ1ZmZlci5sZW5ndGgpIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfQlVGRkVSX0xJTUlUOworCQkJfQorCisJCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLnRhcmdldF90eXBlID0KKwkJCSAgICBBQ1BJX1RZUEVfQlVGRkVSX0ZJRUxEOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ1BJX1RZUEVfUEFDS0FHRToKKworCQkJaWYgKGluZGV4ID49IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQpIHsKKwkJCQlzdGF0dXMgPSBBRV9BTUxfUEFDS0FHRV9MSU1JVDsKKwkJCX0KKworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS50YXJnZXRfdHlwZSA9IEFDUElfVFlQRV9QQUNLQUdFOworCQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSA9CisJCQkgICAgJm9wZXJhbmRbMF0tPnBhY2thZ2UuZWxlbWVudHNbaW5kZXhdOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKworCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOworCQkJZ290byBjbGVhbnVwOworCQl9CisKKwkJLyogRmFpbHVyZSBtZWFucyB0aGF0IHRoZSBJbmRleCB3YXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG9iamVjdCAqLworCisJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKKwkJCQkJIkluZGV4ICglWCU4LjhYKSBpcyBiZXlvbmQgZW5kIG9mIG9iamVjdCIsCisJCQkJCUFDUElfRk9STUFUX1VJTlQ2NChpbmRleCkpKTsKKwkJCWdvdG8gY2xlYW51cDsKIAkJfQogCiAJCS8qCi0JCSAqIEFkZCBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IHBhY2thZ2UvYnVmZmVyL3N0cmluZyBmb3IgdGhlIGxpZmUKLQkJICogb2YgdGhlIGluZGV4LgorCQkgKiBTYXZlIHRoZSB0YXJnZXQgb2JqZWN0IGFuZCBhZGQgYSByZWZlcmVuY2UgdG8gaXQgZm9yIHRoZSBsaWZlCisJCSAqIG9mIHRoZSBpbmRleAogCQkgKi8KKwkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3QgPSBvcGVyYW5kWzBdOwogCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob3BlcmFuZFswXSk7CiAKLQkJLyogQ29tcGxldGUgdGhlIEluZGV4IHJlZmVyZW5jZSBvYmplY3QgKi8KLQotCQlyZXR1cm5fZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9IEFNTF9JTkRFWF9PUDsKLQkJcmV0dXJuX2Rlc2MtPnJlZmVyZW5jZS5vZmZzZXQgPSAodTMyKSBpbmRleDsKLQogCQkvKiBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBUYXJnZXQgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X3N0b3JlKHJldHVybl9kZXNjLCBvcGVyYW5kWzJdLCB3YWxrX3N0YXRlKTsKQEAgLTQ5NSw3ICs1MTQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXU4IGxvZ2ljYWxfcmVzdWx0ID0gRkFMU0U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzJBXzBUXzFSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfMkFfMFRfMVIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAkvKiBDcmVhdGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QgKi8KQEAgLTUwOSw2ICs1MjgsNyBAQAogCS8qIEV4ZWN1dGUgdGhlIE9wY29kZSAqLwogCiAJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUxfTlVNRVJJQykgeworCiAJCS8qIGxvZ2ljYWxfb3AgKE9wZXJhbmQwLCBPcGVyYW5kMSkgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2V4X2RvX2xvZ2ljYWxfbnVtZXJpY19vcCh3YWxrX3N0YXRlLT5vcGNvZGUsCkBAIC01MTgsNiArNTM4LDcgQEAKIAkJCQkJCSAgICAgICB2YWx1ZSwgJmxvZ2ljYWxfcmVzdWx0KTsKIAkJZ290byBzdG9yZV9sb2dpY2FsX3Jlc3VsdDsKIAl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8tPmZsYWdzICYgQU1MX0xPR0lDQUwpIHsKKwogCQkvKiBsb2dpY2FsX29wIChPcGVyYW5kMCwgT3BlcmFuZDEpICovCiAKIAkJc3RhdHVzID0gYWNwaV9leF9kb19sb2dpY2FsX29wKHdhbGtfc3RhdGUtPm9wY29kZSwgb3BlcmFuZFswXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnMy5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKaW5kZXggNmEzYTg4My4uZTJkOTQ1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3BhcmczLmMKQEAgLTg4LDIwICs4OCwxOSBAQAogCXN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvICpmYXRhbDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJleF9vcGNvZGVfM0FfMFRfMFIiLAorCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKGV4X29wY29kZV8zQV8wVF8wUiwKIAkJCQlhY3BpX3BzX2dldF9vcGNvZGVfbmFtZSh3YWxrX3N0YXRlLT5vcGNvZGUpKTsKIAogCXN3aXRjaCAod2Fsa19zdGF0ZS0+b3Bjb2RlKSB7CiAJY2FzZSBBTUxfRkFUQUxfT1A6CS8qIEZhdGFsIChmYXRhbF90eXBlIGZhdGFsX2NvZGUgZmF0YWxfYXJnKSAqLwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKLQkJCQkgICJmYXRhbF9vcDogVHlwZSAlWCBDb2RlICVYIEFyZyAlWCA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8XG4iLAorCQkJCSAgIkZhdGFsT3A6IFR5cGUgJVggQ29kZSAlWCBBcmcgJVggPDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PFxuIiwKIAkJCQkgICh1MzIpIG9wZXJhbmRbMF0tPmludGVnZXIudmFsdWUsCiAJCQkJICAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlLAogCQkJCSAgKHUzMikgb3BlcmFuZFsyXS0+aW50ZWdlci52YWx1ZSkpOwogCi0JCWZhdGFsID0KLQkJICAgIEFDUElfTUVNX0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9zaWduYWxfZmF0YWxfaW5mbykpOworCQlmYXRhbCA9IEFDUElfQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3NpZ25hbF9mYXRhbF9pbmZvKSk7CiAJCWlmIChmYXRhbCkgewogCQkJZmF0YWwtPnR5cGUgPSAodTMyKSBvcGVyYW5kWzBdLT5pbnRlZ2VyLnZhbHVlOwogCQkJZmF0YWwtPmNvZGUgPSAodTMyKSBvcGVyYW5kWzFdLT5pbnRlZ2VyLnZhbHVlOwpAQCAtMTE0LDcgKzExMyw3IEBACiAKIAkJLyogTWlnaHQgcmV0dXJuIHdoaWxlIE9TIGlzIHNodXR0aW5nIGRvd24sIGp1c3QgY29udGludWUgKi8KIAotCQlBQ1BJX01FTV9GUkVFKGZhdGFsKTsKKwkJQUNQSV9GUkVFKGZhdGFsKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMTUxLDcgKzE1MCw3IEBACiAJYWNwaV9pbnRlZ2VyIGluZGV4OwogCWFjcGlfc2l6ZSBsZW5ndGg7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzNBXzFUXzFSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfM0FfMVRfMVIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewpAQCAtMTk2LDcgKzE5NSw3IEBACiAKIAkJCS8qIEFsd2F5cyBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgZm9yIHRoZSBTdHJpbmcgKi8KIAotCQkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKChhY3BpX3NpemUpIGxlbmd0aCArIDEpOworCQkJYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgbGVuZ3RoICsgMSk7CiAJCQlpZiAoIWJ1ZmZlcikgewogCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQlnb3RvIGNsZWFudXA7CkBAIC0yMDgsOSArMjA3LDEwIEBACiAJCQkvKiBJZiB0aGUgcmVxdWVzdGVkIGxlbmd0aCBpcyB6ZXJvLCBkb24ndCBhbGxvY2F0ZSBhIGJ1ZmZlciAqLwogCiAJCQlpZiAobGVuZ3RoID4gMCkgeworCiAJCQkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgQnVmZmVyICovCiAKLQkJCQlidWZmZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUobGVuZ3RoKTsKKwkJCQlidWZmZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChsZW5ndGgpOwogCQkJCWlmICghYnVmZmVyKSB7CiAJCQkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKIAkJCQkJZ290byBjbGVhbnVwOwpAQCAtMjI1LDYgKzIyNSw3IEBACiAJCX0KIAogCQlpZiAoYnVmZmVyKSB7CisKIAkJCS8qIFdlIGhhdmUgYSBidWZmZXIsIGNvcHkgdGhlIHBvcnRpb24gcmVxdWVzdGVkICovCiAKIAkJCUFDUElfTUVNQ1BZKGJ1ZmZlciwgb3BlcmFuZFswXS0+c3RyaW5nLnBvaW50ZXIgKyBpbmRleCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG9wYXJnNi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMKaW5kZXggZTA0M2Q5Mi4uZjBjMGJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4b3Bhcmc2LmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCWFjcGlfaW50ZWdlciBpbmRleDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICp0aGlzX2VsZW1lbnQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUigiZXhfb3Bjb2RlXzZBXzBUXzFSIiwKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihleF9vcGNvZGVfNkFfMFRfMVIsCiAJCQkJYWNwaV9wc19nZXRfb3Bjb2RlX25hbWUod2Fsa19zdGF0ZS0+b3Bjb2RlKSk7CiAKIAlzd2l0Y2ggKHdhbGtfc3RhdGUtPm9wY29kZSkgewpAQCAtMjc2LDYgKzI3Niw3IEBACiAJCSAqIG1hdGNoIHdhcyBmb3VuZC4KIAkJICovCiAJCWZvciAoOyBpbmRleCA8IG9wZXJhbmRbMF0tPnBhY2thZ2UuY291bnQ7IGluZGV4KyspIHsKKwogCQkJLyogR2V0IHRoZSBjdXJyZW50IHBhY2thZ2UgZWxlbWVudCAqLwogCiAJCQl0aGlzX2VsZW1lbnQgPSBvcGVyYW5kWzBdLT5wYWNrYWdlLmVsZW1lbnRzW2luZGV4XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHByZXAuYwppbmRleCA3NzE5YWU1Li40NGQwNjRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhwcmVwLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cHJlcC5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJdTMyIG1pbmltdW1fYWNjZXNzZXMgPSAweEZGRkZGRkZGOwogCXUzMiBhY2Nlc3NlczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2dlbmVyYXRlX2FjY2VzcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZ2VuZXJhdGVfYWNjZXNzKTsKIAogCS8qIFJvdW5kIEZpZWxkIHN0YXJ0IG9mZnNldCBhbmQgbGVuZ3RoIHRvICJtaW5pbWFsIiBieXRlIGJvdW5kYXJpZXMgKi8KIApAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCQlhY2Nlc3NlcyA9IGZpZWxkX2VuZF9vZmZzZXQgLSBmaWVsZF9zdGFydF9vZmZzZXQ7CiAKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCQkgICJhY2Nlc3Nfd2lkdGggJWQgZW5kIGlzIHdpdGhpbiByZWdpb25cbiIsCisJCQkJCSAgIkFjY2Vzc1dpZHRoICVkIGVuZCBpcyB3aXRoaW4gcmVnaW9uXG4iLAogCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CiAKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELApAQCAtMTczLDcgKzE3Myw3IEBACiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0JGSUVMRCwKLQkJCQkJICAiYWNjZXNzX3dpZHRoICVkIGVuZCBpcyBOT1Qgd2l0aGluIHJlZ2lvblxuIiwKKwkJCQkJICAiQWNjZXNzV2lkdGggJWQgZW5kIGlzIE5PVCB3aXRoaW4gcmVnaW9uXG4iLAogCQkJCQkgIGFjY2Vzc19ieXRlX3dpZHRoKSk7CiAJCQlpZiAoYWNjZXNzX2J5dGVfd2lkdGggPT0gMSkgewogCQkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELApAQCAtMjI4LDcgKzIyOCw3IEBACiAJdTMyIGJ5dGVfYWxpZ25tZW50OwogCXUzMiBiaXRfbGVuZ3RoOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZGVjb2RlX2ZpZWxkX2FjY2VzcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfZGVjb2RlX2ZpZWxkX2FjY2Vzcyk7CiAKIAlhY2Nlc3MgPSAoZmllbGRfZmxhZ3MgJiBBTUxfRklFTERfQUNDRVNTX1RZUEVfTUFTSyk7CiAKQEAgLTMyMiw3ICszMjIsNyBAQAogCXUzMiBieXRlX2FsaWdubWVudDsKIAl1MzIgbmVhcmVzdF9ieXRlX2FkZHJlc3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9wcmVwX2NvbW1vbl9maWVsZF9vYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3ByZXBfY29tbW9uX2ZpZWxkX29iamVjdCk7CiAKIAkvKgogCSAqIE5vdGU6IHRoZSBzdHJ1Y3R1cmUgYmVpbmcgaW5pdGlhbGl6ZWQgaXMgdGhlCkBAIC00MTUsMTMgKzQxNSwxMyBAQAogCXUzMiB0eXBlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3ByZXBfZmllbGRfdmFsdWUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3ByZXBfZmllbGRfdmFsdWUpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIAogCWlmIChpbmZvLT5maWVsZF90eXBlICE9IEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRCkgewogCQlpZiAoIWluZm8tPnJlZ2lvbl9ub2RlKSB7Ci0JCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCByZWdpb25fbm9kZSIpKTsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sICJOdWxsIFJlZ2lvbk5vZGUiKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX09QRVJBTkQpOwogCQl9CiAKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2Uob2JqX2Rlc2MtPmZpZWxkLnJlZ2lvbl9vYmopOwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCSAgInJlZ2lvbl9maWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXBcbiIsCisJCQkJICAiUmVnaW9uRmllbGQ6IEJpdE9mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXBcbiIsCiAJCQkJICBvYmpfZGVzYy0+ZmllbGQuc3RhcnRfZmllbGRfYml0X29mZnNldCwKIAkJCQkgIG9ial9kZXNjLT5maWVsZC5iYXNlX2J5dGVfb2Zmc2V0LAogCQkJCSAgb2JqX2Rlc2MtPmZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoLApAQCAtNDg4LDcgKzQ4OCw3IEBACiAJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+YmFua19maWVsZC5iYW5rX29iaik7CiAKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9CRklFTEQsCi0JCQkJICAiQmFuayBGaWVsZDogYml0X29mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXAsIGJhbmtfcmVnICVwXG4iLAorCQkJCSAgIkJhbmsgRmllbGQ6IEJpdE9mZiAlWCwgT2ZmICVYLCBHcmFuICVYLCBSZWdpb24gJXAsIEJhbmtSZWcgJXBcbiIsCiAJCQkJICBvYmpfZGVzYy0+YmFua19maWVsZC5zdGFydF9maWVsZF9iaXRfb2Zmc2V0LAogCQkJCSAgb2JqX2Rlc2MtPmJhbmtfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKIAkJCQkgIG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCwKQEAgLTUxOSwxNiArNTE5LDI5IEBACiAJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYy0+aW5kZXhfZmllbGQuaW5kZXhfb2JqKTsKIAogCQkvKgorCQkgKiBBcHJpbCAyMDA2OiBDaGFuZ2VkIHRvIG1hdGNoIE1TIGJlaGF2aW9yCisJCSAqCiAJCSAqIFRoZSB2YWx1ZSB3cml0dGVuIHRvIHRoZSBJbmRleCByZWdpc3RlciBpcyB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlCi0JCSAqIHRhcmdldCBmaWVsZAotCQkgKiBOb3RlOiBtYXkgY2hhbmdlIGNvZGUgdG86IEFDUElfRElWXzggKEluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbikKKwkJICogdGFyZ2V0IGZpZWxkIGluIHVuaXRzIG9mIHRoZSBncmFudWxhcml0eSBvZiB0aGUgaW5kZXhfZmllbGQKKwkJICoKKwkJICogUHJldmlvdXNseSwgdGhlIHZhbHVlIHdhcyBjYWxjdWxhdGVkIGFzIGFuIGluZGV4IGluIHRlcm1zIG9mIHRoZQorCQkgKiB3aWR0aCBvZiB0aGUgRGF0YSByZWdpc3RlciwgYXMgYmVsb3c6CisJCSAqCisJCSAqICAgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLlZhbHVlID0gKHUzMikKKwkJICogICAgICAgICAgKEluZm8tPmZpZWxkX2JpdF9wb3NpdGlvbiAvIEFDUElfTVVMXzggKAorCQkgKiAgICAgICAgICAgICAgb2JqX2Rlc2MtPkZpZWxkLmFjY2Vzc19ieXRlX3dpZHRoKSk7CisJCSAqCisJCSAqIEZlYnJ1YXJ5IDIwMDY6IFRyaWVkIHZhbHVlIGFzIGEgYnl0ZSBvZmZzZXQ6CisJCSAqICAgICAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLlZhbHVlID0gKHUzMikKKwkJICogICAgICAgICAgQUNQSV9ESVZfOCAoSW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uKTsKIAkJICovCi0JCW9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSA9ICh1MzIpCi0JCSAgICAoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uIC8KLQkJICAgICBBQ1BJX01VTF84KG9ial9kZXNjLT5maWVsZC5hY2Nlc3NfYnl0ZV93aWR0aCkpOworCQlvYmpfZGVzYy0+aW5kZXhfZmllbGQudmFsdWUgPQorCQkgICAgKHUzMikgQUNQSV9ST1VORF9ET1dOKEFDUElfRElWXzgoaW5mby0+ZmllbGRfYml0X3Bvc2l0aW9uKSwKKwkJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuCisJCQkJCSAgYWNjZXNzX2J5dGVfd2lkdGgpOwogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJCSAgImluZGV4X2ZpZWxkOiBiaXRfb2ZmICVYLCBPZmYgJVgsIFZhbHVlICVYLCBHcmFuICVYLCBJbmRleCAlcCwgRGF0YSAlcFxuIiwKKwkJCQkgICJJbmRleEZpZWxkOiBCaXRPZmYgJVgsIE9mZiAlWCwgVmFsdWUgJVgsIEdyYW4gJVgsIEluZGV4ICVwLCBEYXRhICVwXG4iLAogCQkJCSAgb2JqX2Rlc2MtPmluZGV4X2ZpZWxkLnN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQsCiAJCQkJICBvYmpfZGVzYy0+aW5kZXhfZmllbGQuYmFzZV9ieXRlX29mZnNldCwKIAkJCQkgIG9ial9kZXNjLT5pbmRleF9maWVsZC52YWx1ZSwKQEAgLTU1MCw3ICs1NjMsNyBAQAogCQkJCSAgICAgICBhY3BpX25zX2dldF90eXBlKGluZm8tPmZpZWxkX25vZGUpKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQkZJRUxELAotCQkJICAiU2V0IG5hbWVkX29iaiAlcCBbJTQuNHNdLCBvYmpfZGVzYyAlcFxuIiwKKwkJCSAgIlNldCBOYW1lZE9iaiAlcCBbJTQuNHNdLCBPYmpEZXNjICVwXG4iLAogCQkJICBpbmZvLT5maWVsZF9ub2RlLAogCQkJICBhY3BpX3V0X2dldF9ub2RlX25hbWUoaW5mby0+ZmllbGRfbm9kZSksIG9ial9kZXNjKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlZ2lvbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKaW5kZXggNmE0Y2ZkZi4uM2NjOTdiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVnaW9uLmMKQEAgLTgxLDcgKzgxLDcgQEAKIAl1MzIgcmVtYWluZGVyOwogI2VuZGlmCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fbWVtb3J5X3NwYWNlX2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV9tZW1vcnlfc3BhY2VfaGFuZGxlcik7CiAKIAkvKiBWYWxpZGF0ZSBhbmQgdHJhbnNsYXRlIHRoZSBiaXQgd2lkdGggKi8KIApAQCAtMTAzLDcgKzEwMyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgc3lzdGVtX21lbW9yeSB3aWR0aCAlZCIsCisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIFN5c3RlbU1lbW9yeSB3aWR0aCAlZCIsCiAJCQkgICAgYml0X3dpZHRoKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfT1BFUkFORF9WQUxVRSk7CiAJfQpAQCAtMTM1LDYgKzEzNSw3IEBACiAJCSAqIERlbGV0ZSB0aGUgZXhpc3RpbmcgbWFwcGluZyBhbmQgY3JlYXRlIGEgbmV3IG9uZS4KIAkJICovCiAJCWlmIChtZW1faW5mby0+bWFwcGVkX2xlbmd0aCkgeworCiAJCQkvKiBWYWxpZCBtYXBwaW5nLCBkZWxldGUgaXQgKi8KIAogCQkJYWNwaV9vc191bm1hcF9tZW1vcnkobWVtX2luZm8tPm1hcHBlZF9sb2dpY2FsX2FkZHJlc3MsCkBAIC0xODEsOCArMTgyLDggQEAKIAkgICAgIChhY3BpX2ludGVnZXIpIG1lbV9pbmZvLT5tYXBwZWRfcGh5c2ljYWxfYWRkcmVzcyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJzeXN0ZW1fbWVtb3J5ICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAotCQkJICBmdW5jdGlvbiwgYml0X3dpZHRoLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKKwkJCSAgIlN5c3RlbS1NZW1vcnkgKHdpZHRoICVkKSBSL1cgJWQgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAorCQkJICBiaXRfd2lkdGgsIGZ1bmN0aW9uLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKIAogCS8qCiAJICogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUKQEAgLTI4MywxMSArMjg0LDExIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAJdTMyIHZhbHVlMzI7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1faW9fc3BhY2VfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfc3lzdGVtX2lvX3NwYWNlX2hhbmRsZXIpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJICAic3lzdGVtX2lPICVkICglZCB3aWR0aCkgQWRkcmVzcz0lOC44WCU4LjhYXG4iLAotCQkJICBmdW5jdGlvbiwgYml0X3dpZHRoLCBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcykpKTsKKwkJCSAgIlN5c3RlbS1JTyAod2lkdGggJWQpIFIvVyAlZCBBZGRyZXNzPSU4LjhYJTguOFhcbiIsCisJCQkgIGJpdF93aWR0aCwgZnVuY3Rpb24sIEFDUElfRk9STUFUX1VJTlQ2NChhZGRyZXNzKSkpOwogCiAJLyogRGVjb2RlIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgKi8KIApAQCAtMzQyLDcgKzM0Myw3IEBACiAJc3RydWN0IGFjcGlfcGNpX2lkICpwY2lfaWQ7CiAJdTE2IHBjaV9yZWdpc3RlcjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3BjaV9jb25maWdfc3BhY2VfaGFuZGxlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcGNpX2NvbmZpZ19zcGFjZV9oYW5kbGVyKTsKIAogCS8qCiAJICogIFRoZSBhcmd1bWVudHMgdG8gYWNwaV9vcyhSZWFkfFdyaXRlKXBjaV9jb25maWd1cmF0aW9uIGFyZToKQEAgLTM2MCw3ICszNjEsNyBAQAogCXBjaV9yZWdpc3RlciA9ICh1MTYpICh1MzIpIGFkZHJlc3M7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCi0JCQkgICJwY2lfY29uZmlnICVkICglZCkgU2VnKCUwNHgpIEJ1cyglMDR4KSBEZXYoJTA0eCkgRnVuYyglMDR4KSBSZWcoJTA0eClcbiIsCisJCQkgICJQY2ktQ29uZmlnICVkICglZCkgU2VnKCUwNHgpIEJ1cyglMDR4KSBEZXYoJTA0eCkgRnVuYyglMDR4KSBSZWcoJTA0eClcbiIsCiAJCQkgIGZ1bmN0aW9uLCBiaXRfd2lkdGgsIHBjaV9pZC0+c2VnbWVudCwgcGNpX2lkLT5idXMsCiAJCQkgIHBjaV9pZC0+ZGV2aWNlLCBwY2lfaWQtPmZ1bmN0aW9uLCBwY2lfcmVnaXN0ZXIpKTsKIApAQCAtNDE0LDcgKzQxNSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9jbW9zX3NwYWNlX2hhbmRsZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2Ntb3Nfc3BhY2VfaGFuZGxlcik7CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KQEAgLTQ0Niw3ICs0NDcsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcGNpX2Jhcl9zcGFjZV9oYW5kbGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9wY2lfYmFyX3NwYWNlX2hhbmRsZXIpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CkBAIC00NzYsMjMgKzQ3NywxNiBAQAogCQkJCSBhY3BpX2ludGVnZXIgKiB2YWx1ZSwKIAkJCQkgdm9pZCAqaGFuZGxlcl9jb250ZXh0LCB2b2lkICpyZWdpb25fY29udGV4dCkKIHsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQl1MzIgYnl0ZV93aWR0aCA9IEFDUElfRElWXzgoYml0X3dpZHRoKTsKLQl1MzIgaTsKLQljaGFyICpsb2dpY2FsX2FkZHJfcHRyOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfZGF0YV90YWJsZV9zcGFjZV9oYW5kbGVyIik7Ci0KLQlsb2dpY2FsX2FkZHJfcHRyID0gQUNQSV9QSFlTQUREUl9UT19QVFIoYWRkcmVzcyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kYXRhX3RhYmxlX3NwYWNlX2hhbmRsZXIpOwogCiAJLyogUGVyZm9ybSB0aGUgbWVtb3J5IHJlYWQgb3Igd3JpdGUgKi8KIAogCXN3aXRjaCAoZnVuY3Rpb24pIHsKIAljYXNlIEFDUElfUkVBRDoKIAotCQlmb3IgKGkgPSAwOyBpIDwgYnl0ZV93aWR0aDsgaSsrKSB7Ci0JCQkoKGNoYXIgKil2YWx1ZSlbaV0gPSBsb2dpY2FsX2FkZHJfcHRyW2ldOwotCQl9CisJCUFDUElfTUVNQ1BZKEFDUElfQ0FTVF9QVFIoY2hhciwgdmFsdWUpLAorCQkJICAgIEFDUElfUEhZU0FERFJfVE9fUFRSKGFkZHJlc3MpLAorCQkJICAgIEFDUElfRElWXzgoYml0X3dpZHRoKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1dSSVRFOgpAQCAtNTAxLDUgKzQ5NSw1IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9TVVBQT1JUKTsKIAl9CiAKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzbnRlLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYwppbmRleCAwMWIyNmM4Li4zMDg5YjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNudGUuYwpAQCAtODcsNyArODcsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCWFjcGlfb2JqZWN0X3R5cGUgZW50cnlfdHlwZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3Jlc29sdmVfbm9kZV90b192YWx1ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKTsKIAogCS8qCiAJICogVGhlIHN0YWNrIHBvaW50ZXIgcG9pbnRzIHRvIGEgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKE5vZGUpLiAgR2V0IHRoZQpAQCAtOTcsMTIgKzk3LDEzIEBACiAJc291cmNlX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJZW50cnlfdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUoKGFjcGlfaGFuZGxlKSBub2RlKTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywgIkVudHJ5PSVwIHNvdXJjZV9kZXNjPSVwIFslc11cbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiRW50cnk9JXAgU291cmNlRGVzYz0lcCBbJXNdXG4iLAogCQkJICBub2RlLCBzb3VyY2VfZGVzYywKIAkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKGVudHJ5X3R5cGUpKSk7CiAKIAlpZiAoKGVudHJ5X3R5cGUgPT0gQUNQSV9UWVBFX0xPQ0FMX0FMSUFTKSB8fAogCSAgICAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSkgeworCiAJCS8qIFRoZXJlIGlzIGFsd2F5cyBleGFjdGx5IG9uZSBsZXZlbCBvZiBpbmRpcmVjdGlvbiAqLwogCiAJCW5vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBub2RlLT5vYmplY3QpOwpAQCAtMTEzLDEwICsxMTQsMTEgQEAKIAogCS8qCiAJICogU2V2ZXJhbCBvYmplY3QgdHlwZXMgcmVxdWlyZSBubyBmdXJ0aGVyIHByb2Nlc3Npbmc6Ci0JICogMSkgRGV2aWNlcyByYXJlbHkgaGF2ZSBhbiBhdHRhY2hlZCBvYmplY3QsIHJldHVybiB0aGUgTm9kZQorCSAqIDEpIERldmljZS9UaGVybWFsIG9iamVjdHMgZG9uJ3QgaGF2ZSBhICJyZWFsIiBzdWJvYmplY3QsIHJldHVybiB0aGUgTm9kZQogCSAqIDIpIE1ldGhvZCBsb2NhbHMgYW5kIGFyZ3VtZW50cyBoYXZlIGEgcHNldWRvLU5vZGUKIAkgKi8KLQlpZiAoZW50cnlfdHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFIHx8CisJaWYgKChlbnRyeV90eXBlID09IEFDUElfVFlQRV9ERVZJQ0UpIHx8CisJICAgIChlbnRyeV90eXBlID09IEFDUElfVFlQRV9USEVSTUFMKSB8fAogCSAgICAobm9kZS0+ZmxhZ3MgJiAoQU5PQkpfTUVUSE9EX0FSRyB8IEFOT0JKX01FVEhPRF9MT0NBTCkpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQpAQCAtMTQxLDYgKzE0Myw3IEBACiAKIAkJc3RhdHVzID0gYWNwaV9kc19nZXRfcGFja2FnZV9hcmd1bWVudHMoc291cmNlX2Rlc2MpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwogCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKQEAgLTE1OCw2ICsxNjEsNyBAQAogCiAJCXN0YXR1cyA9IGFjcGlfZHNfZ2V0X2J1ZmZlcl9hcmd1bWVudHMoc291cmNlX2Rlc2MpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwogCQkJLyogUmV0dXJuIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgKi8KIAogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKQEAgLTE5OSw3ICsyMDMsNyBAQAogCWNhc2UgQUNQSV9UWVBFX0xPQ0FMX0lOREVYX0ZJRUxEOgogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJmaWVsZF9yZWFkIE5vZGU9JXAgc291cmNlX2Rlc2M9JXAgVHlwZT0lWFxuIiwKKwkJCQkgICJGaWVsZFJlYWQgTm9kZT0lcCBTb3VyY2VEZXNjPSVwIFR5cGU9JVhcbiIsCiAJCQkJICBub2RlLCBzb3VyY2VfZGVzYywgZW50cnlfdHlwZSkpOwogCiAJCXN0YXR1cyA9CkBAIC0yMTMsNyArMjE3LDYgQEAKIAljYXNlIEFDUElfVFlQRV9NRVRIT0Q6CiAJY2FzZSBBQ1BJX1RZUEVfUE9XRVI6CiAJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgotCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CiAJY2FzZSBBQ1BJX1RZUEVfRVZFTlQ6CiAJY2FzZSBBQ1BJX1RZUEVfUkVHSU9OOgogCkBAIC0yNDAsNiArMjQzLDggQEAKIAkJCS8qIFRoaXMgaXMgYSBkZGJfaGFuZGxlICovCiAJCQkvKiBSZXR1cm4gYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCAqLwogCisJCWNhc2UgQU1MX1JFRl9PRl9PUDoKKwogCQkJb2JqX2Rlc2MgPSBzb3VyY2VfZGVzYzsKIAkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZShvYmpfZGVzYyk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29sdi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKaW5kZXggMWRlZWQ0OS4uNjQ5OWRlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb2x2LmMKQEAgLTc4LDcgKzc4LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfcmVzb2x2ZV90b192YWx1ZSIsIHN0YWNrX3B0cik7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfcmVzb2x2ZV90b192YWx1ZSwgc3RhY2tfcHRyKTsKIAogCWlmICghc3RhY2tfcHRyIHx8ICEqc3RhY2tfcHRyKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnRlcm5hbCAtIG51bGwgcG9pbnRlciIpKTsKQEAgLTE0NCw3ICsxNDQsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCXUxNiBvcGNvZGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZXNvbHZlX29iamVjdF90b192YWx1ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVzb2x2ZV9vYmplY3RfdG9fdmFsdWUpOwogCiAJc3RhY2tfZGVzYyA9ICpzdGFja19wdHI7CiAKQEAgLTE5MCw3ICsxOTAsNyBAQAogCQkJfQogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJCSAgIltBcmcvTG9jYWwgJVhdIHZhbHVlX29iaiBpcyAlcFxuIiwKKwkJCQkJICAiW0FyZy9Mb2NhbCAlWF0gVmFsdWVPYmogaXMgJXBcbiIsCiAJCQkJCSAgc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm9mZnNldCwKIAkJCQkJICBvYmpfZGVzYykpOwogCkBAIC0yMzksNyArMjM5LDcgQEAKIAkJCQkvKiBJbnZhbGlkIHJlZmVyZW5jZSBvYmplY3QgKi8KIAogCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkJCSAgICAiVW5rbm93biB0YXJnZXRfdHlwZSAlWCBpbiBJbmRleC9SZWZlcmVuY2Ugb2JqICVwIiwKKwkJCQkJICAgICJVbmtub3duIFRhcmdldFR5cGUgJVggaW4gSW5kZXgvUmVmZXJlbmNlIG9iaiAlcCIsCiAJCQkJCSAgICBzdGFja19kZXNjLT5yZWZlcmVuY2UudGFyZ2V0X3R5cGUsCiAJCQkJCSAgICBzdGFja19kZXNjKSk7CiAJCQkJc3RhdHVzID0gQUVfQU1MX0lOVEVSTkFMOwpAQCAtMjU3LDEwICsyNTcsMjQgQEAKIAogCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6CS8qIFJlZmVyZW5jZSB0byBhIG5hbWVkIG9iamVjdCAqLwogCi0JCQkvKiBHZXQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBuYW1lc3BhY2Ugbm9kZSAqLworCQkJLyogRGVyZWZlcmVuY2UgdGhlIG5hbWUgKi8KIAotCQkJKnN0YWNrX3B0ciA9IChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZSktPm9iamVjdDsKLQkJCWFjcGlfdXRfYWRkX3JlZmVyZW5jZSgqc3RhY2tfcHRyKTsKKwkJCWlmICgoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUtPnR5cGUgPT0KKwkJCSAgICAgQUNQSV9UWVBFX0RFVklDRSkKKwkJCSAgICB8fCAoc3RhY2tfZGVzYy0+cmVmZXJlbmNlLm5vZGUtPnR5cGUgPT0KKwkJCQlBQ1BJX1RZUEVfVEhFUk1BTCkpIHsKKworCQkJCS8qIFRoZXNlIG5vZGUgdHlwZXMgZG8gbm90IGhhdmUgJ3JlYWwnIHN1Ym9iamVjdHMgKi8KKworCQkJCSpzdGFja19wdHIgPSAodm9pZCAqKXN0YWNrX2Rlc2MtPnJlZmVyZW5jZS5ub2RlOworCQkJfSBlbHNlIHsKKwkJCQkvKiBHZXQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBuYW1lc3BhY2Ugbm9kZSAqLworCisJCQkJKnN0YWNrX3B0ciA9CisJCQkJICAgIChzdGFja19kZXNjLT5yZWZlcmVuY2Uubm9kZSktPm9iamVjdDsKKwkJCQlhY3BpX3V0X2FkZF9yZWZlcmVuY2UoKnN0YWNrX3B0cik7CisJCQl9CisKIAkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShzdGFja19kZXNjKTsKIAkJCWJyZWFrOwogCkBAIC0yOTMsNyArMzA3LDcgQEAKIAljYXNlIEFDUElfVFlQRV9MT0NBTF9JTkRFWF9GSUVMRDoKIAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiZmllbGRfcmVhZCBzb3VyY2VfZGVzYz0lcCBUeXBlPSVYXG4iLAorCQkJCSAgIkZpZWxkUmVhZCBTb3VyY2VEZXNjPSVwIFR5cGU9JVhcbiIsCiAJCQkJICBzdGFja19kZXNjLAogCQkJCSAgQUNQSV9HRVRfT0JKRUNUX1RZUEUoc3RhY2tfZGVzYykpKTsKIApAQCAtMzM3LDcgKzM1MSw3IEBACiAJYWNwaV9vYmplY3RfdHlwZSB0eXBlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZXhfcmVzb2x2ZV9tdWx0aXBsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9leF9yZXNvbHZlX211bHRpcGxlKTsKIAogCS8qIE9wZXJhbmQgY2FuIGJlIGVpdGhlciBhIG5hbWVzcGFjZSBub2RlIG9yIGFuIG9wZXJhbmQgZGVzY3JpcHRvciAqLwogCkBAIC0zODIsMTAgKzM5NiwxNiBAQAogCXdoaWxlIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0xPQ0FMX1JFRkVSRU5DRSkgewogCQlzd2l0Y2ggKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlKSB7CiAJCWNhc2UgQU1MX1JFRl9PRl9PUDoKKwkJY2FzZSBBTUxfSU5UX05BTUVQQVRIX09QOgogCiAJCQkvKiBEZXJlZmVyZW5jZSB0aGUgcmVmZXJlbmNlIHBvaW50ZXIgKi8KIAotCQkJbm9kZSA9IG9ial9kZXNjLT5yZWZlcmVuY2Uub2JqZWN0OworCQkJaWYgKG9ial9kZXNjLT5yZWZlcmVuY2Uub3Bjb2RlID09IEFNTF9SRUZfT0ZfT1ApIHsKKwkJCQlub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CisJCQl9IGVsc2UgewkvKiBBTUxfSU5UX05BTUVQQVRIX09QICovCisKKwkJCQlub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlOworCQkJfQogCiAJCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwogCkBAIC00MDEsNiArNDIxLDcgQEAKIAogCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7CisKIAkJCQkvKiBObyBvYmplY3QsIHVzZSB0aGUgTlMgbm9kZSB0eXBlICovCiAKIAkJCQl0eXBlID0gYWNwaV9uc19nZXRfdHlwZShub2RlKTsKQEAgLTQzMiw2ICs0NTMsNyBAQAogCQkJICovCiAJCQlvYmpfZGVzYyA9ICoob2JqX2Rlc2MtPnJlZmVyZW5jZS53aGVyZSk7CiAJCQlpZiAoIW9ial9kZXNjKSB7CisKIAkJCQkvKiBOVUxMIHBhY2thZ2UgZWxlbWVudHMgYXJlIGFsbG93ZWQgKi8KIAogCQkJCXR5cGUgPSAwOwkvKiBVbmluaXRpYWxpemVkICovCkBAIC00MzksMzkgKzQ2MSw2IEBACiAJCQl9CiAJCQlicmVhazsKIAotCQljYXNlIEFNTF9JTlRfTkFNRVBBVEhfT1A6Ci0KLQkJCS8qIERlcmVmZXJlbmNlIHRoZSByZWZlcmVuY2UgcG9pbnRlciAqLwotCi0JCQlub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5ub2RlOwotCi0JCQkvKiBBbGwgIlJlZmVyZW5jZXMiIHBvaW50IHRvIGEgTlMgbm9kZSAqLwotCi0JCQlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9Ci0JCQkgICAgQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKLQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm90IGEgTlMgbm9kZSAlcCBbJXNdIiwKLQkJCQkJICAgIG5vZGUsCi0JCQkJCSAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUobm9kZSkpKTsKLQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX0lOVEVSTkFMKTsKLQkJCX0KLQotCQkJLyogR2V0IHRoZSBhdHRhY2hlZCBvYmplY3QgKi8KLQotCQkJb2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3Qobm9kZSk7Ci0JCQlpZiAoIW9ial9kZXNjKSB7Ci0JCQkJLyogTm8gb2JqZWN0LCB1c2UgdGhlIE5TIG5vZGUgdHlwZSAqLwotCi0JCQkJdHlwZSA9IGFjcGlfbnNfZ2V0X3R5cGUobm9kZSk7Ci0JCQkJZ290byBleGl0OwotCQkJfQotCi0JCQkvKiBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyAqLwotCi0JCQlpZiAob2JqX2Rlc2MgPT0gb3BlcmFuZCkgewotCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfQ0lSQ1VMQVJfUkVGRVJFTkNFKTsKLQkJCX0KLQkJCWJyZWFrOwotCiAJCWNhc2UgQU1MX0xPQ0FMX09QOgogCQljYXNlIEFNTF9BUkdfT1A6CiAKQEAgLTUxMyw3ICs1MDIsNyBAQAogCiAJCWNhc2UgQU1MX0RFQlVHX09QOgogCi0JCQkvKiBUaGUgRGVidWcgT2JqZWN0IGlzIG9mIHR5cGUgImRlYnVnX29iamVjdCIgKi8KKwkJCS8qIFRoZSBEZWJ1ZyBPYmplY3QgaXMgb2YgdHlwZSAiRGVidWdPYmplY3QiICovCiAKIAkJCXR5cGUgPSBBQ1BJX1RZUEVfREVCVUdfT0JKRUNUOwogCQkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHJlc29wLmMKaW5kZXggYTFjMDAwZi4uNGM5M2QwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4cmVzb3AuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhyZXNvcC5jCkBAIC03Nyw2ICs3Nyw3IEBACiAJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJaWYgKHR5cGVfbmVlZGVkID09IEFDUElfVFlQRV9BTlkpIHsKKwogCQkvKiBBbGwgdHlwZXMgT0ssIHNvIHdlIGRvbid0IHBlcmZvcm0gYW55IHR5cGVjaGVja3MgKi8KIAogCQlyZXR1cm4gKEFFX09LKTsKQEAgLTE0Myw3ICsxNDQsNyBAQAogCWFjcGlfb2JqZWN0X3R5cGUgdHlwZV9uZWVkZWQ7CiAJdTE2IHRhcmdldF9vcCA9IDA7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiZXhfcmVzb2x2ZV9vcGVyYW5kcyIsIG9wY29kZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoZXhfcmVzb2x2ZV9vcGVyYW5kcywgb3Bjb2RlKTsKIAogCW9wX2luZm8gPSBhY3BpX3BzX2dldF9vcGNvZGVfaW5mbyhvcGNvZGUpOwogCWlmIChvcF9pbmZvLT5jbGFzcyA9PSBBTUxfQ0xBU1NfVU5LTk9XTikgewpAQCAtMTU4LDcgKzE1OSw3IEBACiAJfQogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJICAiT3Bjb2RlICVYIFslc10gcmVxdWlyZWRfb3BlcmFuZF90eXBlcz0lOC44WFxuIiwKKwkJCSAgIk9wY29kZSAlWCBbJXNdIFJlcXVpcmVkT3BlcmFuZFR5cGVzPSU4LjhYXG4iLAogCQkJICBvcGNvZGUsIG9wX2luZm8tPm5hbWUsIGFyZ190eXBlcykpOwogCiAJLyoKQEAgLTIyNCw2ICsyMjUsNyBAQAogCQkJfQogCiAJCQlpZiAob2JqZWN0X3R5cGUgPT0gKHU4KSBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKSB7CisKIAkJCQkvKiBEZWNvZGUgdGhlIFJlZmVyZW5jZSAqLwogCiAJCQkJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wY29kZSk7CkBAIC0yNDcsNyArMjQ5LDcgQEAKIAogCQkJCQlBQ1BJX0RFQlVHX09OTFlfTUVNQkVSUyhBQ1BJX0RFQlVHX1BSSU5UCiAJCQkJCQkJCSgoQUNQSV9EQl9FWEVDLAotCQkJCQkJCQkgICJPcGVyYW5kIGlzIGEgUmVmZXJlbmNlLCByZWZfb3Bjb2RlIFslc11cbiIsCisJCQkJCQkJCSAgIk9wZXJhbmQgaXMgYSBSZWZlcmVuY2UsIFJlZk9wY29kZSBbJXNdXG4iLAogCQkJCQkJCQkgIChhY3BpX3BzX2dldF9vcGNvZGVfaW5mbwogCQkJCQkJCQkgICAob2JqX2Rlc2MtPgogCQkJCQkJCQkgICAgcmVmZXJlbmNlLgpAQCAtMzMyLDYgKzMzNCw3IEBACiAJCQl9CiAKIAkJCWlmIChvYmpfZGVzYy0+cmVmZXJlbmNlLm9wY29kZSA9PSBBTUxfTkFNRV9PUCkgeworCiAJCQkJLyogQ29udmVydCBhIG5hbWVkIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIG5hbWVkIG9iamVjdCAqLwogCiAJCQkJdGVtcF9ub2RlID0gb2JqX2Rlc2MtPnJlZmVyZW5jZS5vYmplY3Q7CkBAIC02MjMsNyArNjI2LDcgQEAKIAogCQkJZGVmYXVsdDoKIAkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkgICAgIk5lZWRlZCBbUmVnaW9uL3JlZ2lvbl9maWVsZF0sIGZvdW5kIFslc10gJXAiLAorCQkJCQkgICAgIk5lZWRlZCBbUmVnaW9uL1JlZ2lvbkZpZWxkXSwgZm91bmQgWyVzXSAlcCIsCiAJCQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lCiAJCQkJCSAgICAob2JqX2Rlc2MpLCBvYmpfZGVzYykpOwogCkBAIC02NjIsNiArNjY1LDcgQEAKIAkJCQl9CiAKIAkJCQlpZiAodGFyZ2V0X29wID09IEFNTF9ERUJVR19PUCkgeworCiAJCQkJCS8qIEFsbG93IHN0b3JlIG9mIGFueSBvYmplY3QgdG8gdGhlIERlYnVnIG9iamVjdCAqLwogCiAJCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3JlLmMKaW5kZXggM2YwMjBjMC4uMDQ1NjQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yZS5jCkBAIC04Miw3ICs4Miw3IEBACiB7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigiZXhfZG9fZGVidWdfb2JqZWN0Iiwgc291cmNlX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X2RvX2RlYnVnX29iamVjdCwgc291cmNlX2Rlc2MpOwogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfREVCVUdfT0JKRUNULCAiW0FDUEkgRGVidWddICUqcyIsCiAJCQkgICAgICBsZXZlbCwgIiAiKSk7CkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWZfZGVzYyA9IGRlc3RfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZSIsIGRlc3RfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfc3RvcmUsIGRlc3RfZGVzYyk7CiAKIAkvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzICovCiAKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCiAJCUFDUElfRFVNUF9TVEFDS19FTlRSWShzb3VyY2VfZGVzYyk7CiAJCUFDUElfRFVNUF9TVEFDS19FTlRSWShkZXN0X2Rlc2MpOwotCQlBQ1BJX0RVTVBfT1BFUkFORFMoJmRlc3RfZGVzYywgQUNQSV9JTU9ERV9FWEVDVVRFLCAiZXhfc3RvcmUiLAorCQlBQ1BJX0RVTVBfT1BFUkFORFMoJmRlc3RfZGVzYywgQUNQSV9JTU9ERV9FWEVDVVRFLCAiRXhTdG9yZSIsCiAJCQkJICAgMiwKIAkJCQkgICAiVGFyZ2V0IGlzIG5vdCBhIFJlZmVyZW5jZSBvciBDb25zdGFudCBvYmplY3QiKTsKIApAQCAtMzk2LDcgKzM5Niw3IEBACiAJdTggdmFsdWUgPSAwOwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3RvcmVfb2JqZWN0X3RvX2luZGV4Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9zdG9yZV9vYmplY3RfdG9faW5kZXgpOwogCiAJLyoKIAkgKiBEZXN0aW5hdGlvbiBtdXN0IGJlIGEgcmVmZXJlbmNlIHBvaW50ZXIsIGFuZApAQCAtNDIzLDYgKzQyMyw3IEBACiAJCX0KIAogCQlpZiAob2JqX2Rlc2MpIHsKKwogCQkJLyogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBieSB0aGUgcmVmIGNvdW50IG9mIHRoZSBwYXJlbnQgcGFja2FnZSAqLwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgKCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopCkBAIC01MDIsOCArNTAzLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJUYXJnZXQgaXMgbm90IGEgUGFja2FnZSBvciBidWZmZXJfZmllbGQiKSk7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJUYXJnZXQgaXMgbm90IGEgUGFja2FnZSBvciBCdWZmZXJGaWVsZCIpKTsKIAkJc3RhdHVzID0gQUVfQU1MX09QRVJBTkRfVFlQRTsKIAkJYnJlYWs7CiAJfQpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV3X2Rlc2M7CiAJYWNwaV9vYmplY3RfdHlwZSB0YXJnZXRfdHlwZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9vYmplY3RfdG9fbm9kZSIsIHNvdXJjZV9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihleF9zdG9yZV9vYmplY3RfdG9fbm9kZSwgc291cmNlX2Rlc2MpOwogCiAJLyogR2V0IGN1cnJlbnQgdHlwZSBvZiB0aGUgbm9kZSwgYW5kIG9iamVjdCBhdHRhY2hlZCB0byBOb2RlICovCiAKQEAgLTU3Miw2ICs1NzIsNyBAQAogCS8qIElmIG5vIGltcGxpY2l0IGNvbnZlcnNpb24sIGRyb3AgaW50byB0aGUgZGVmYXVsdCBjYXNlIGJlbG93ICovCiAKIAlpZiAoKCFpbXBsaWNpdF9jb252ZXJzaW9uKSB8fCAod2Fsa19zdGF0ZS0+b3Bjb2RlID09IEFNTF9DT1BZX09QKSkgeworCiAJCS8qIEZvcmNlIGV4ZWN1dGlvbiBvZiBkZWZhdWx0IChubyBpbXBsaWNpdCBjb252ZXJzaW9uKSAqLwogCiAJCXRhcmdldF90eXBlID0gQUNQSV9UWVBFX0FOWTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN0b3Jlbi5jIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKaW5kZXggNDI5NjdiYS4uNTkxYWFmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3RvcmVuLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpzb3VyY2VfZGVzYyA9ICpzb3VyY2VfZGVzY19wdHI7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9yZXNvbHZlX29iamVjdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVzb2x2ZV9vYmplY3QpOwogCiAJLyogRW5zdXJlIHdlIGhhdmUgYSBUYXJnZXQgdGhhdCBjYW4gYmUgc3RvcmVkIHRvICovCiAKQEAgLTk3LDYgKzk3LDcgQEAKIAkJICovCiAJCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShzb3VyY2VfZGVzYykgPT0KIAkJICAgIEFDUElfVFlQRV9MT0NBTF9SRUZFUkVOQ0UpIHsKKwogCQkJLyogUmVzb2x2ZSBhIHJlZmVyZW5jZSBvYmplY3QgZmlyc3QgKi8KIAogCQkJc3RhdHVzID0KQEAgLTEyMSw2ICsxMjIsNyBAQAogCQkgICAgISgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoc291cmNlX2Rlc2MpID09CiAJCSAgICAgICBBQ1BJX1RZUEVfTE9DQUxfUkVGRVJFTkNFKQogCQkgICAgICAmJiAoc291cmNlX2Rlc2MtPnJlZmVyZW5jZS5vcGNvZGUgPT0gQU1MX0xPQURfT1ApKSkgeworCiAJCQkvKiBDb252ZXJzaW9uIHN1Y2Nlc3NmdWwgYnV0IHN0aWxsIG5vdCBhIHZhbGlkIHR5cGUgKi8KIAogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKQEAgLTE5OSw3ICsyMDEsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmFjdHVhbF9zcmNfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9vYmplY3RfdG9fb2JqZWN0Iiwgc291cmNlX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N0b3JlX29iamVjdF90b19vYmplY3QsIHNvdXJjZV9kZXNjKTsKIAogCWFjdHVhbF9zcmNfZGVzYyA9IHNvdXJjZV9kZXNjOwogCWlmICghZGVzdF9kZXNjKSB7CkBAIC0yODksNiArMjkxLDcgQEAKIAl9CiAKIAlpZiAoYWN0dWFsX3NyY19kZXNjICE9IHNvdXJjZV9kZXNjKSB7CisKIAkJLyogRGVsZXRlIHRoZSBpbnRlcm1lZGlhdGUgKHRlbXBvcmFyeSkgc291cmNlIG9iamVjdCAqLwogCiAJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShhY3R1YWxfc3JjX2Rlc2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4c3Rvcm9iLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYwppbmRleCA2YWI3MDcwLi45OWViZTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYworKysgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzdG9yb2IuYwpAQCAtNjcsNyArNjcsNyBAQAogCXUzMiBsZW5ndGg7CiAJdTggKmJ1ZmZlcjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJleF9zdG9yZV9idWZmZXJfdG9fYnVmZmVyIiwgc291cmNlX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N0b3JlX2J1ZmZlcl90b19idWZmZXIsIHNvdXJjZV9kZXNjKTsKIAogCS8qIFdlIGtub3cgdGhhdCBzb3VyY2VfZGVzYyBpcyBhIGJ1ZmZlciBieSBub3cgKi8KIApAQCAtODAsNyArODAsNyBAQAogCSAqLwogCWlmICgodGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGggPT0gMCkgfHwKIAkgICAgKHRhcmdldF9kZXNjLT5jb21tb24uZmxhZ3MgJiBBT1BPQkpfU1RBVElDX1BPSU5URVIpKSB7Ci0JCXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciA9IEFDUElfTUVNX0FMTE9DQVRFKGxlbmd0aCk7CisJCXRhcmdldF9kZXNjLT5idWZmZXIucG9pbnRlciA9IEFDUElfQUxMT0NBVEUobGVuZ3RoKTsKIAkJaWYgKCF0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CkBAIC05MSw2ICs5MSw3IEBACiAJLyogQ29weSBzb3VyY2UgYnVmZmVyIHRvIHRhcmdldCBidWZmZXIgKi8KIAogCWlmIChsZW5ndGggPD0gdGFyZ2V0X2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKKwogCQkvKiBDbGVhciBleGlzdGluZyBidWZmZXIgYW5kIGNvcHkgaW4gdGhlIG5ldyBvbmUgKi8KIAogCQlBQ1BJX01FTVNFVCh0YXJnZXRfZGVzYy0+YnVmZmVyLnBvaW50ZXIsIDAsCkBAIC0xMDIsNyArMTAzLDcgQEAKIAkJICogTk9URTogQUNQSSB2ZXJzaW9ucyB1cCB0byAzLjAgc3BlY2lmaWVkIHRoYXQgdGhlIGJ1ZmZlciBtdXN0IGJlCiAJCSAqIHRydW5jYXRlZCBpZiB0aGUgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGUgYnVmZmVyLiAgSG93ZXZlciwgIm90aGVyIgogCQkgKiBpbXBsZW1lbnRhdGlvbnMgb2YgQUNQSSBuZXZlciBkaWQgdGhpcyBhbmQgdGh1cyBiZWNhbWUgdGhlIGRlZmFjdG8KLQkJICogc3RhbmRhcmQuIEFDUGkgMy4wX2EgY2hhbmdlcyB0aGlzIGJlaGF2aW9yIHN1Y2ggdGhhdCB0aGUgYnVmZmVyCisJCSAqIHN0YW5kYXJkLiBBQ1BJIDMuMF9hIGNoYW5nZXMgdGhpcyBiZWhhdmlvciBzdWNoIHRoYXQgdGhlIGJ1ZmZlcgogCQkgKiBpcyBubyBsb25nZXIgdHJ1bmNhdGVkLgogCQkgKi8KIApAQCAtMTEzLDYgKzExNCw3IEBACiAJCSAqIGNvcHkgbXVzdCBub3QgdHJ1bmNhdGUgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KIAkJICovCiAJCWlmIChvcmlnaW5hbF9zcmNfdHlwZSA9PSBBQ1BJX1RZUEVfU1RSSU5HKSB7CisKIAkJCS8qIFNldCB0aGUgbmV3IGxlbmd0aCBvZiB0aGUgdGFyZ2V0ICovCiAKIAkJCXRhcmdldF9kZXNjLT5idWZmZXIubGVuZ3RoID0gbGVuZ3RoOwpAQCAtMTU2LDcgKzE1OCw3IEBACiAJdTMyIGxlbmd0aDsKIAl1OCAqYnVmZmVyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3N0b3JlX3N0cmluZ190b19zdHJpbmciLCBzb3VyY2VfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoZXhfc3RvcmVfc3RyaW5nX3RvX3N0cmluZywgc291cmNlX2Rlc2MpOwogCiAJLyogV2Uga25vdyB0aGF0IHNvdXJjZV9kZXNjIGlzIGEgc3RyaW5nIGJ5IG5vdyAqLwogCkBAIC0xODMsMTMgKzE4NSwxNCBAQAogCQkgKi8KIAkJaWYgKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlciAmJgogCQkgICAgKCEodGFyZ2V0X2Rlc2MtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpKSB7CisKIAkJCS8qIE9ubHkgZnJlZSBpZiBub3QgYSBwb2ludGVyIGludG8gdGhlIERTRFQgKi8KIAotCQkJQUNQSV9NRU1fRlJFRSh0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCQkJQUNQSV9GUkVFKHRhcmdldF9kZXNjLT5zdHJpbmcucG9pbnRlcik7CiAJCX0KIAotCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX01FTV9DQUxMT0NBVEUoKGFjcGlfc2l6ZSkKLQkJCQkJCQkJIGxlbmd0aCArIDEpOworCQl0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRCgoYWNwaV9zaXplKQorCQkJCQkJCQkgICBsZW5ndGggKyAxKTsKIAkJaWYgKCF0YXJnZXRfZGVzYy0+c3RyaW5nLnBvaW50ZXIpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhzeXN0ZW0uYyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCmluZGV4IGVhOTE0NGYuLjUyYmVlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHN5c3RlbS5jCkBAIC02OCw3ICs2OCw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfc3RhdHVzIHN0YXR1czI7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fd2FpdF9zZW1hcGhvcmUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV93YWl0X3NlbWFwaG9yZSk7CiAKIAlzdGF0dXMgPSBhY3BpX29zX3dhaXRfc2VtYXBob3JlKHNlbWFwaG9yZSwgMSwgMCk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CkBAIC03Niw2ICs3Niw3IEBACiAJfQogCiAJaWYgKHN0YXR1cyA9PSBBRV9USU1FKSB7CisKIAkJLyogV2UgbXVzdCB3YWl0LCBzbyB1bmxvY2sgdGhlIGludGVycHJldGVyICovCiAKIAkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CkBAIC05MCw2ICs5MSw3IEBACiAKIAkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMyKSkgeworCiAJCQkvKiBSZXBvcnQgZmF0YWwgZXJyb3IsIGNvdWxkIG5vdCBhY3F1aXJlIGludGVycHJldGVyICovCiAKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMyKTsKQEAgLTE5MSw3ICsxOTMsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoImV4X3N5c3RlbV9hY3F1aXJlX211dGV4Iiwgb2JqX2Rlc2MpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKGV4X3N5c3RlbV9hY3F1aXJlX211dGV4LCBvYmpfZGVzYyk7CiAKIAlpZiAoIW9ial9kZXNjKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTIyOSw3ICsyMzEsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfc3lzdGVtX3JlbGVhc2VfbXV0ZXgiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X3N5c3RlbV9yZWxlYXNlX211dGV4KTsKIAogCWlmICghb2JqX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMjYzLDcgKzI2NSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9zeXN0ZW1fc2lnbmFsX2V2ZW50Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9zeXN0ZW1fc2lnbmFsX2V2ZW50KTsKIAogCWlmIChvYmpfZGVzYykgewogCQlzdGF0dXMgPSBhY3BpX29zX3NpZ25hbF9zZW1hcGhvcmUob2JqX2Rlc2MtPmV2ZW50LnNlbWFwaG9yZSwgMSk7CkBAIC0yOTMsNyArMjk1LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X3N5c3RlbV93YWl0X2V2ZW50Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9zeXN0ZW1fd2FpdF9ldmVudCk7CiAKIAlpZiAob2JqX2Rlc2MpIHsKIAkJc3RhdHVzID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXh1dGlscy5jCmluZGV4IGY3M2E2MWEuLjk4MmM4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leHV0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4dXRpbHMuYwpAQCAtODcsOSArODcsOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2VudGVyX2ludGVycHJldGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9lbnRlcl9pbnRlcnByZXRlcik7CiAKLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfRVhFQ1VURSk7CisJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0lOVEVSUFJFVEVSKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBhY3F1aXJlIGludGVycHJldGVyIG11dGV4IikpOwogCX0KQEAgLTEyMyw5ICsxMjMsOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2V4aXRfaW50ZXJwcmV0ZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2V4aXRfaW50ZXJwcmV0ZXIpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0VYRUNVVEUpOworCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9JTlRFUlBSRVRFUik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgcmVsZWFzZSBpbnRlcnByZXRlciBtdXRleCIpKTsKIAl9CkBAIC0xODksMTEgKzE4OSwxMiBAQAogCXU4IGxvY2tlZCA9IEZBTFNFOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImV4X2FjcXVpcmVfZ2xvYmFsX2xvY2siKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGV4X2FjcXVpcmVfZ2xvYmFsX2xvY2spOwogCiAJLyogT25seSBhdHRlbXB0IGxvY2sgaWYgdGhlIGFsd2F5c19sb2NrIGJpdCBpcyBzZXQgKi8KIAogCWlmIChmaWVsZF9mbGFncyAmIEFNTF9GSUVMRF9MT0NLX1JVTEVfTUFTSykgeworCiAJCS8qIFdlIHNob3VsZCBhdHRlbXB0IHRvIGdldCB0aGUgbG9jaywgd2FpdCBmb3JldmVyICovCiAKIAkJc3RhdHVzID0gYWNwaV9ldl9hY3F1aXJlX2dsb2JhbF9sb2NrKEFDUElfV0FJVF9GT1JFVkVSKTsKQEAgLTIyNSwxNSArMjI2LDE3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiZXhfcmVsZWFzZV9nbG9iYWxfbG9jayIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoZXhfcmVsZWFzZV9nbG9iYWxfbG9jayk7CiAKIAkvKiBPbmx5IGF0dGVtcHQgdW5sb2NrIGlmIHRoZSBjYWxsZXIgbG9ja2VkIGl0ICovCiAKIAlpZiAobG9ja2VkX2J5X21lKSB7CisKIAkJLyogT0ssIG5vdyByZWxlYXNlIHRoZSBsb2NrICovCiAKIAkJc3RhdHVzID0gYWNwaV9ldl9yZWxlYXNlX2dsb2JhbF9sb2NrKCk7CiAJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCiAJCQkvKiBSZXBvcnQgdGhlIGVycm9yLCBidXQgdGhlcmUgaXNuJ3QgbXVjaCBlbHNlIHdlIGNhbiBkbyAqLwogCiAJCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLApAQCAtMjYzLDcgKzI2Niw3IEBACiAJdTMyIG51bV9kaWdpdHM7CiAJYWNwaV9pbnRlZ2VyIGN1cnJlbnRfdmFsdWU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJleF9kaWdpdHNfbmVlZGVkIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShleF9kaWdpdHNfbmVlZGVkKTsKIAogCS8qIGFjcGlfaW50ZWdlciBpcyB1bnNpZ25lZCwgc28gd2UgZG9uJ3Qgd29ycnkgYWJvdXQgYSAnLScgcHJlZml4ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9mYW4uYyBiL2RyaXZlcnMvYWNwaS9mYW4uYwppbmRleCBlODE2NWM0Li4xY2QyNTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZmFuLmMKKysrIGIvZHJpdmVycy9hY3BpL2Zhbi5jCkBAIC00OCw2ICs0OCw4IEBACiAKIHN0YXRpYyBpbnQgYWNwaV9mYW5fYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9mYW5fcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfZmFuX3N1c3BlbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSk7CitzdGF0aWMgaW50IGFjcGlfZmFuX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Zhbl9kcml2ZXIgPSB7CiAJLm5hbWUgPSBBQ1BJX0ZBTl9EUklWRVJfTkFNRSwKQEAgLTU2LDYgKzU4LDggQEAKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9mYW5fYWRkLAogCQkucmVtb3ZlID0gYWNwaV9mYW5fcmVtb3ZlLAorCQkuc3VzcGVuZCA9IGFjcGlfZmFuX3N1c3BlbmQsCisJCS5yZXN1bWUgPSBhY3BpX2Zhbl9yZXN1bWUsCiAJCX0sCiB9OwogCkBAIC0yMDYsNiArMjEwLDEwIEBACiAJCWdvdG8gZW5kOwogCX0KIAorCWRldmljZS0+ZmxhZ3MuZm9yY2VfcG93ZXJfc3RhdGUgPSAxOworCWFjcGlfYnVzX3NldF9wb3dlcihkZXZpY2UtPmhhbmRsZSwgc3RhdGUpOworCWRldmljZS0+ZmxhZ3MuZm9yY2VfcG93ZXJfc3RhdGUgPSAwOworCiAJcmVzdWx0ID0gYWNwaV9mYW5fYWRkX2ZzKGRldmljZSk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CkBAIC0yMzksNiArMjQ3LDM4IEBACiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCitzdGF0aWMgaW50IGFjcGlfZmFuX3N1c3BlbmQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCBzdGF0ZSkKK3sKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3BpX2J1c19zZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsIEFDUElfU1RBVEVfRDApOworCisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgaW50IGFjcGlfZmFuX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHN0YXRlKQoreworCWludCByZXN1bHQgPSAwOworCWludCBwb3dlcl9zdGF0ZSA9IDA7CisKKwlpZiAoIWRldmljZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXN1bHQgPSBhY3BpX2J1c19nZXRfcG93ZXIoZGV2aWNlLT5oYW5kbGUsICZwb3dlcl9zdGF0ZSk7CisJaWYgKHJlc3VsdCkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAorCQkJCSAgIkVycm9yIHJlYWRpbmcgZmFuIHBvd2VyIHN0YXRlXG4iKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZGV2aWNlLT5mbGFncy5mb3JjZV9wb3dlcl9zdGF0ZSA9IDE7CisJYWNwaV9idXNfc2V0X3Bvd2VyKGRldmljZS0+aGFuZGxlLCBwb3dlcl9zdGF0ZSk7CisJZGV2aWNlLT5mbGFncy5mb3JjZV9wb3dlcl9zdGF0ZSA9IDA7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX2Zhbl9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdhY3BpLmMKaW5kZXggZWEyZjEzMi4uZGU1MGZhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3YWNwaS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2FjcGkuYwpAQCAtNjMsNyArNjMsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2luaXRpYWxpemUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X2luaXRpYWxpemUpOwogCiAJLyogV2UgbXVzdCBoYXZlIHRoZSBBQ1BJIHRhYmxlcyBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZSAqLwogCkBAIC0xMDAsNyArMTAwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIHJldHJ5OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfc2V0X21vZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X3NldF9tb2RlKTsKIAogCS8qCiAJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCkBAIC0xOTgsNyArMTk4LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIHZhbHVlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZ2V0X21vZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X2dldF9tb2RlKTsKIAogCS8qCiAJICogQUNQSSAyLjAgY2xhcmlmaWVkIHRoYXQgaWYgU01JX0NNRCBpbiBGQURUIGlzIHplcm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdncGUuYyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCmluZGV4IGQ4NDk0MmQuLjYwOGEzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od2dwZS5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAkvKiBFeGFtaW5lIGVhY2ggR1BFIFJlZ2lzdGVyIHdpdGhpbiB0aGUgYmxvY2sgKi8KIAogCWZvciAoaSA9IDA7IGkgPCBncGVfYmxvY2stPnJlZ2lzdGVyX2NvdW50OyBpKyspIHsKKwogCQkvKiBEaXNhYmxlIGFsbCBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCAweDAwLApAQCAtMjUwLDYgKzI1MSw3IEBACiAJLyogRXhhbWluZSBlYWNoIEdQRSBSZWdpc3RlciB3aXRoaW4gdGhlIGJsb2NrICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgZ3BlX2Jsb2NrLT5yZWdpc3Rlcl9jb3VudDsgaSsrKSB7CisKIAkJLyogQ2xlYXIgc3RhdHVzIG9uIGFsbCBHUEVzIGluIHRoaXMgcmVnaXN0ZXIgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2h3X2xvd19sZXZlbF93cml0ZSg4LCAweEZGLApAQCAtMzY4LDcgKzM3MCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZGlzYWJsZV9hbGxfZ3BlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZGlzYWJsZV9hbGxfZ3Blcyk7CiAKIAlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19kaXNhYmxlX2dwZV9ibG9jayk7CiAJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKTsKQEAgLTM5MSw3ICszOTMsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2VuYWJsZV9hbGxfcnVudGltZV9ncGVzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShod19lbmFibGVfYWxsX3J1bnRpbWVfZ3Blcyk7CiAKIAlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19lbmFibGVfcnVudGltZV9ncGVfYmxvY2spOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpAQCAtNDEzLDcgKzQxNSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiaHdfZW5hYmxlX2FsbF93YWtldXBfZ3BlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfZW5hYmxlX2FsbF93YWtldXBfZ3Blcyk7CiAKIAlzdGF0dXMgPSBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoYWNwaV9od19lbmFibGVfd2FrZXVwX2dwZV9ibG9jayk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMgYi9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdyZWdzLmMKaW5kZXggZTFmZTc1NC4uYWUxNDJkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3cmVncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3JlZ3MuYwpAQCAtNDMsOCArNDMsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNuYW1lc3AuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CkBAIC02MywyMyArNjEsMjEgQEAKICAqIERFU0NSSVBUSU9OOiBDbGVhcnMgYWxsIGZpeGVkIGFuZCBnZW5lcmFsIHB1cnBvc2Ugc3RhdHVzIGJpdHMKICAqICAgICAgICAgICAgICBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggSU5URVJSVVBUUyBESVNBQkxFRAogICoKKyAqIE5PVEU6IFRCRDogRmxhZ3MgcGFyYW1ldGVyIGlzIG9ic29sZXRlLCB0byBiZSByZW1vdmVkCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGFjcGlfc3RhdHVzIGFjcGlfaHdfY2xlYXJfYWNwaV9zdGF0dXModTMyIGZsYWdzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBsb2NrX2ZsYWdzID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X2NsZWFyX2FjcGlfc3RhdHVzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShod19jbGVhcl9hY3BpX3N0YXR1cyk7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lPLCAiQWJvdXQgdG8gd3JpdGUgJTA0WCB0byAlMDRYXG4iLAogCQkJICBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUywKIAkJCSAgKHUxNikgYWNwaV9nYmxfRkFEVC0+eHBtMWFfZXZ0X2Jsay5hZGRyZXNzKSk7CiAKLQlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQl9CisJbG9ja19mbGFncyA9IGFjcGlfb3NfYWNxdWlyZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2spOwogCiAJc3RhdHVzID0gYWNwaV9od19yZWdpc3Rlcl93cml0ZShBQ1BJX01UWF9ET19OT1RfTE9DSywKIAkJCQkJQUNQSV9SRUdJU1RFUl9QTTFfU1RBVFVTLApAQCAtMTA0LDkgKzEwMCw3IEBACiAJc3RhdHVzID0gYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfaHdfY2xlYXJfZ3BlX2Jsb2NrKTsKIAogICAgICAgdW5sb2NrX2FuZF9leGl0OgotCWlmIChmbGFncyAmIEFDUElfTVRYX0xPQ0spIHsKLQkJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKLQl9CisJYWNwaV9vc19yZWxlYXNlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jaywgbG9ja19mbGFncyk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTEyOSwxMCArMTIzLDkgQEAKIGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSh1OCBzbGVlcF9zdGF0ZSwgdTggKiBzbGVlcF90eXBlX2EsIHU4ICogc2xlZXBfdHlwZV9iKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87Ci0JY2hhciAqc2xlZXBfc3RhdGVfbmFtZTsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfc2xlZXBfdHlwZV9kYXRhIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEpOwogCiAJLyogVmFsaWRhdGUgcGFyYW1ldGVycyAqLwogCkBAIC0xNDAsMzQgKzEzMywzOSBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JLyogRXZhbHVhdGUgdGhlIG5hbWVzcGFjZSBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIGZvciB0aGlzIHN0YXRlICovCisJLyogQWxsb2NhdGUgdGhlIGV2YWx1YXRpb24gaW5mb3JtYXRpb24gYmxvY2sgKi8KIAotCWluZm8ucGFyYW1ldGVycyA9IE5VTEw7Ci0JaW5mby5yZXR1cm5fb2JqZWN0ID0gTlVMTDsKLQlzbGVlcF9zdGF0ZV9uYW1lID0KKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cGF0aG5hbWUgPQogCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsIGFjcGlfZ2JsX3NsZWVwX3N0YXRlX25hbWVzW3NsZWVwX3N0YXRlXSk7CiAKLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUoc2xlZXBfc3RhdGVfbmFtZSwgJmluZm8pOworCS8qIEV2YWx1YXRlIHRoZSBuYW1lc3BhY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBmb3IgdGhpcyBzdGF0ZSAqLworCisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLAotCQkJCSAgIiVzIHdoaWxlIGV2YWx1YXRpbmcgc2xlZXBfc3RhdGUgWyVzXVxuIiwKKwkJCQkgICIlcyB3aGlsZSBldmFsdWF0aW5nIFNsZWVwU3RhdGUgWyVzXVxuIiwKIAkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpLAotCQkJCSAgc2xlZXBfc3RhdGVfbmFtZSkpOworCQkJCSAgaW5mby0+cGF0aG5hbWUpKTsKIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIE11c3QgaGF2ZSBhIHJldHVybiBvYmplY3QgKi8KIAotCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7CisJaWYgKCFpbmZvLT5yZXR1cm5fb2JqZWN0KSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICJObyBTbGVlcCBTdGF0ZSBvYmplY3QgcmV0dXJuZWQgZnJvbSBbJXNdIiwKLQkJCSAgICBzbGVlcF9zdGF0ZV9uYW1lKSk7CisJCQkgICAgaW5mby0+cGF0aG5hbWUpKTsKIAkJc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCX0KIAogCS8qIEl0IG11c3QgYmUgb2YgdHlwZSBQYWNrYWdlICovCiAKLQllbHNlIGlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLnJldHVybl9vYmplY3QpICE9IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJZWxzZSBpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdCkgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiU2xlZXAgU3RhdGUgcmV0dXJuIG9iamVjdCBpcyBub3QgYSBQYWNrYWdlIikpOwogCQlzdGF0dXMgPSBBRV9BTUxfT1BFUkFORF9UWVBFOwpAQCAtMTgwLDcgKzE3OCw3IEBACiAJICogYnkgQklPUyB2ZW5kb3JzIHNlZW1zIHRvIGJlIHRvIGhhdmUgMiBvciBtb3JlIGVsZW1lbnRzLCBhdCBsZWFzdAogCSAqIG9uZSBwZXIgc2xlZXAgdHlwZSAoQS9CKS4KIAkgKi8KLQllbHNlIGlmIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuY291bnQgPCAyKSB7CisJZWxzZSBpZiAoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5jb3VudCA8IDIpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMiKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9OT19PUEVSQU5EOwpAQCAtMTg4LDM5ICsxODYsNDIgQEAKIAogCS8qIFRoZSBmaXJzdCB0d28gZWxlbWVudHMgbXVzdCBib3RoIGJlIG9mIHR5cGUgSW50ZWdlciAqLwogCi0JZWxzZSBpZiAoKEFDUElfR0VUX09CSkVDVF9UWVBFKGluZm8ucmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKKwllbHNlIGlmICgoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1swXSkKIAkJICAhPSBBQ1BJX1RZUEVfSU5URUdFUikgfHwKLQkJIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pCisJCSAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdC0+cGFja2FnZS5lbGVtZW50c1sxXSkKIAkJICAhPSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiU2xlZXAgU3RhdGUgcmV0dXJuIHBhY2thZ2UgZWxlbWVudHMgYXJlIG5vdCBib3RoIEludGVnZXJzICglcywgJXMpIiwKLQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8ucmV0dXJuX29iamVjdC0+CisJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT5yZXR1cm5fb2JqZWN0LT4KIAkJCQkJCQkgcGFja2FnZS5lbGVtZW50c1swXSksCi0JCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLnJldHVybl9vYmplY3QtPgorCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby0+cmV0dXJuX29iamVjdC0+CiAJCQkJCQkJIHBhY2thZ2UuZWxlbWVudHNbMV0pKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJfSBlbHNlIHsKIAkJLyogVmFsaWQgX1N4XyBwYWNrYWdlIHNpemUsIHR5cGUsIGFuZCB2YWx1ZSAqLwogCiAJCSpzbGVlcF90eXBlX2EgPSAodTgpCi0JCSAgICAoaW5mby5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKKwkJICAgIChpbmZvLT5yZXR1cm5fb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzWzBdKS0+aW50ZWdlci52YWx1ZTsKIAkJKnNsZWVwX3R5cGVfYiA9ICh1OCkKLQkJICAgIChpbmZvLnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pLT5pbnRlZ2VyLnZhbHVlOworCQkgICAgKGluZm8tPnJldHVybl9vYmplY3QtPnBhY2thZ2UuZWxlbWVudHNbMV0pLT5pbnRlZ2VyLnZhbHVlOwogCX0KIAogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLAotCQkJCSJXaGlsZSBldmFsdWF0aW5nIHNsZWVwX3N0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlcyIsCi0JCQkJc2xlZXBfc3RhdGVfbmFtZSwgaW5mby5yZXR1cm5fb2JqZWN0LAotCQkJCWFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUoaW5mby4KKwkJCQkiV2hpbGUgZXZhbHVhdGluZyBTbGVlcFN0YXRlIFslc10sIGJhZCBTbGVlcCBvYmplY3QgJXAgdHlwZSAlcyIsCisJCQkJaW5mby0+cGF0aG5hbWUsIGluZm8tPnJldHVybl9vYmplY3QsCisJCQkJYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT4KIAkJCQkJCQkgICAgIHJldHVybl9vYmplY3QpKSk7CiAJfQogCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8ucmV0dXJuX29iamVjdCk7CisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCisgICAgICBjbGVhbnVwOgorCUFDUElfRlJFRShpbmZvKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9zbGVlcF90eXBlX2RhdGEpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3NsZWVwX3R5cGVfZGF0YSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMzMsMTMgKzIzNCwxMiBAQAogICogREVTQ1JJUFRJT046IE1hcCByZWdpc3Rlcl9pZCBpbnRvIGEgcmVnaXN0ZXIgYml0bWFzay4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdHJ1Y3QgYWNwaV9iaXRfcmVnaXN0ZXJfaW5mbyAqYWNwaV9od19nZXRfYml0X3JlZ2lzdGVyX2luZm8odTMyIHJlZ2lzdGVyX2lkKQogewogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWlmIChyZWdpc3Rlcl9pZCA+IEFDUElfQklUUkVHX01BWCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBiaXRfcmVnaXN0ZXIgSUQ6ICVYIiwKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgQml0UmVnaXN0ZXIgSUQ6ICVYIiwKIAkJCSAgICByZWdpc3Rlcl9pZCkpOwogCQlyZXR1cm4gKE5VTEwpOwogCX0KQEAgLTI2MCw2ICsyNjAsOCBAQAogICoKICAqIERFU0NSSVBUSU9OOiBBQ1BJIGJpdF9yZWdpc3RlciByZWFkIGZ1bmN0aW9uLgogICoKKyAqIE5PVEU6IFRCRDogRmxhZ3MgcGFyYW1ldGVyIGlzIG9ic29sZXRlLCB0byBiZSByZW1vdmVkCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMgYWNwaV9nZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgKiByZXR1cm5fdmFsdWUsIHUzMiBmbGFncykKQEAgLTI2OCw3ICsyNzAsNyBAQAogCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpiaXRfcmVnX2luZm87CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfcmVnaXN0ZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3JlZ2lzdGVyKTsKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIEFDUEkgUmVnaXN0ZXIgKi8KIApAQCAtMjc3LDI0ICsyNzksMTQgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWlmIChmbGFncyAmIEFDUElfTVRYX0xPQ0spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQotCX0KLQogCS8qIFJlYWQgZnJvbSB0aGUgcmVnaXN0ZXIgKi8KIAotCXN0YXR1cyA9IGFjcGlfaHdfcmVnaXN0ZXJfcmVhZChBQ1BJX01UWF9ET19OT1RfTE9DSywKKwlzdGF0dXMgPSBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQoQUNQSV9NVFhfTE9DSywKIAkJCQkgICAgICAgYml0X3JlZ19pbmZvLT5wYXJlbnRfcmVnaXN0ZXIsCiAJCQkJICAgICAgICZyZWdpc3Rlcl92YWx1ZSk7CiAKLQlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JfQotCiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKIAkJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCiAKIAkJcmVnaXN0ZXJfdmFsdWUgPQpAQCAtMzExLDcgKzMwMyw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfcmVnaXN0ZXIpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3JlZ2lzdGVyKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTMyNiwzMSArMzE4LDI4IEBACiAgKgogICogREVTQ1JJUFRJT046IEFDUEkgQml0IFJlZ2lzdGVyIHdyaXRlIGZ1bmN0aW9uLgogICoKKyAqIE5PVEU6IFRCRDogRmxhZ3MgcGFyYW1ldGVyIGlzIG9ic29sZXRlLCB0byBiZSByZW1vdmVkCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9zZXRfcmVnaXN0ZXIodTMyIHJlZ2lzdGVyX2lkLCB1MzIgdmFsdWUsIHUzMiBmbGFncykKIHsKIAl1MzIgcmVnaXN0ZXJfdmFsdWUgPSAwOwogCXN0cnVjdCBhY3BpX2JpdF9yZWdpc3Rlcl9pbmZvICpiaXRfcmVnX2luZm87CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCWFjcGlfY3B1X2ZsYWdzIGxvY2tfZmxhZ3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigiYWNwaV9zZXRfcmVnaXN0ZXIiLCByZWdpc3Rlcl9pZCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoYWNwaV9zZXRfcmVnaXN0ZXIsIHJlZ2lzdGVyX2lkKTsKIAogCS8qIEdldCB0aGUgaW5mbyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIEFDUEkgUmVnaXN0ZXIgKi8KIAogCWJpdF9yZWdfaW5mbyA9IGFjcGlfaHdfZ2V0X2JpdF9yZWdpc3Rlcl9pbmZvKHJlZ2lzdGVyX2lkKTsKIAlpZiAoIWJpdF9yZWdfaW5mbykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQmFkIEFDUEkgSFcgcmVnaXN0ZXJfaWQ6ICVYIiwKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkJhZCBBQ1BJIEhXIFJlZ2lzdGVySWQ6ICVYIiwKIAkJCSAgICByZWdpc3Rlcl9pZCkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0JaWYgKGZsYWdzICYgQUNQSV9NVFhfTE9DSykgewotCQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfSEFSRFdBUkUpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0JfQorCWxvY2tfZmxhZ3MgPSBhY3BpX29zX2FjcXVpcmVfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrKTsKIAogCS8qIEFsd2F5cyBkbyBhIHJlZ2lzdGVyIHJlYWQgZmlyc3Qgc28gd2UgY2FuIGluc2VydCB0aGUgbmV3IGJpdHMgICovCiAKQEAgLTQ1OCw5ICs0NDcsNyBAQAogCiAgICAgICB1bmxvY2tfYW5kX2V4aXQ6CiAKLQlpZiAoZmxhZ3MgJiBBQ1BJX01UWF9MT0NLKSB7Ci0JCSh2b2lkKWFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9IQVJEV0FSRSk7Ci0JfQorCWFjcGlfb3NfcmVsZWFzZV9sb2NrKGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2ssIGxvY2tfZmxhZ3MpOwogCiAJLyogTm9ybWFsaXplIHRoZSB2YWx1ZSB0aGF0IHdhcyByZWFkICovCiAKQEAgLTQ3NCw3ICs0NjEsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X3JlZ2lzdGVyKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3NldF9yZWdpc3RlcikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTQ5MCwyMSArNDc3LDE4IEBACiAgKiAgICAgICAgICAgICAgZ2l2ZW4gb2Zmc2V0LgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2h3X3JlZ2lzdGVyX3JlYWQodTggdXNlX2xvY2ssIHUzMiByZWdpc3Rlcl9pZCwgdTMyICogcmV0dXJuX3ZhbHVlKQogewogCXUzMiB2YWx1ZTEgPSAwOwogCXUzMiB2YWx1ZTIgPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlhY3BpX2NwdV9mbGFncyBsb2NrX2ZsYWdzID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImh3X3JlZ2lzdGVyX3JlYWQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGh3X3JlZ2lzdGVyX3JlYWQpOwogCiAJaWYgKEFDUElfTVRYX0xPQ0sgPT0gdXNlX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQorCQlsb2NrX2ZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CiAJfQogCiAJc3dpdGNoIChyZWdpc3Rlcl9pZCkgewpAQCAtNTgyLDcgKzU2Niw3IEBACiAKICAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoQUNQSV9NVFhfTE9DSyA9PSB1c2VfbG9jaykgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSEFSRFdBUkUpOworCQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrLCBsb2NrX2ZsYWdzKTsKIAl9CiAKIAlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKQEAgLTYxMCwxNCArNTk0LDEyIEBACiBhY3BpX3N0YXR1cyBhY3BpX2h3X3JlZ2lzdGVyX3dyaXRlKHU4IHVzZV9sb2NrLCB1MzIgcmVnaXN0ZXJfaWQsIHUzMiB2YWx1ZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJYWNwaV9jcHVfZmxhZ3MgbG9ja19mbGFncyA9IDA7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJod19yZWdpc3Rlcl93cml0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoaHdfcmVnaXN0ZXJfd3JpdGUpOwogCiAJaWYgKEFDUElfTVRYX0xPQ0sgPT0gdXNlX2xvY2spIHsKLQkJc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX0hBUkRXQVJFKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQkJfQorCQlsb2NrX2ZsYWdzID0gYWNwaV9vc19hY3F1aXJlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CiAJfQogCiAJc3dpdGNoIChyZWdpc3Rlcl9pZCkgewpAQCAtNzA3LDcgKzY4OSw3IEBACiAKICAgICAgIHVubG9ja19hbmRfZXhpdDoKIAlpZiAoQUNQSV9NVFhfTE9DSyA9PSB1c2VfbG9jaykgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfSEFSRFdBUkUpOworCQlhY3BpX29zX3JlbGVhc2VfbG9jayhhY3BpX2dibF9oYXJkd2FyZV9sb2NrLCBsb2NrX2ZsYWdzKTsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTczMyw3ICs3MTUsNyBAQAogCXU2NCBhZGRyZXNzOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fTkFNRSgiaHdfbG93X2xldmVsX3JlYWQiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUoaHdfbG93X2xldmVsX3JlYWQpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgR0FTIHN0cnVjdHVyZSwgYW5kCkBAIC04MDUsNyArNzg3LDcgQEAKIAl1NjQgYWRkcmVzczsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoImh3X2xvd19sZXZlbF93cml0ZSIpOworCUFDUElfRlVOQ1RJT05fTkFNRShod19sb3dfbGV2ZWxfd3JpdGUpOwogCiAJLyoKIAkgKiBNdXN0IGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIGEgR0FTIHN0cnVjdHVyZSwgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3c2xlZXAuYwppbmRleCA4OTI2OTI3Li44YmI0M2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHdzbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3NsZWVwLmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCkBAIC02NCw3ICs2Myw3IEBACiBhY3BpX3NldF9maXJtd2FyZV93YWtpbmdfdmVjdG9yKGFjcGlfcGh5c2ljYWxfYWRkcmVzcyBwaHlzaWNhbF9hZGRyZXNzKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3RvciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9zZXRfZmlybXdhcmVfd2FraW5nX3ZlY3Rvcik7CiAKIAkvKiBTZXQgdGhlIHZlY3RvciAqLwogCkBAIC03OSw2ICs3OCw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IKQEAgLTkyLDEzICs5MywxMiBAQAogICogREVTQ1JJUFRJT046IEFjY2VzcyBmdW5jdGlvbiBmb3IgdGhlIGZpcm13YXJlX3dha2luZ192ZWN0b3IgZmllbGQgaW4gRkFDUwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IoYWNwaV9waHlzaWNhbF9hZGRyZXNzICogcGh5c2ljYWxfYWRkcmVzcykKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IpOwogCiAJaWYgKCFwaHlzaWNhbF9hZGRyZXNzKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTExOCw2ICsxMTgsOCBAQAogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2Zpcm13YXJlX3dha2luZ192ZWN0b3IpCiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzNCwxNCArMTM2LDEzIEBACiAgKiAgICAgICAgICAgICAgdmFyaW91cyBPUy1zcGVjaWZpYyB0YXNrcyBiZXR3ZWVuIHRoZSB0d28gc3RlcHMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKHU4IHNsZWVwX3N0YXRlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBhcmdfbGlzdDsKIAl1bmlvbiBhY3BpX29iamVjdCBhcmc7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3ByZXAiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfcHJlcCk7CiAKIAkvKgogCSAqIF9QU1cgbWV0aG9kcyBjb3VsZCBiZSBydW4gaGVyZSB0byBlbmFibGUgd2FrZS1vbiBrZXlib2FyZCwgTEFOLCBldGMuCkBAIC0yMDYsNiArMjA3LDggQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9wcmVwKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX2VudGVyX3NsZWVwX3N0YXRlCkBAIC0yMTgsNyArMjIxLDYgQEAKICAqICAgICAgICAgICAgICBUSElTIEZVTkNUSU9OIE1VU1QgQkUgQ0FMTEVEIFdJVEggSU5URVJSVVBUUyBESVNBQkxFRAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFzbWxpbmthZ2UgYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSh1OCBzbGVlcF9zdGF0ZSkKIHsKIAl1MzIgUE0xQWNvbnRyb2w7CkBAIC0yMjgsNyArMjMwLDcgQEAKIAl1MzIgaW5fdmFsdWU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZSk7CiAKIAlpZiAoKGFjcGlfZ2JsX3NsZWVwX3R5cGVfYSA+IEFDUElfU0xFRVBfVFlQRV9NQVgpIHx8CiAJICAgIChhY3BpX2dibF9zbGVlcF90eXBlX2IgPiBBQ1BJX1NMRUVQX1RZUEVfTUFYKSkgewpAQCAtMzc4LDcgKzM4MCw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTM5MiwxMyArMzk0LDEyIEBACiAgKiAgICAgICAgICAgICAgVEhJUyBGVU5DVElPTiBNVVNUIEJFIENBTExFRCBXSVRIIElOVEVSUlVQVFMgRElTQUJMRUQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhc21saW5rYWdlIGFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zKHZvaWQpCiB7CiAJdTMyIGluX3ZhbHVlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW50ZXJfc2xlZXBfc3RhdGVfczRiaW9zIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7CiAKIAlzdGF0dXMgPQogCSAgICBhY3BpX3NldF9yZWdpc3RlcihBQ1BJX0JJVFJFR19XQUtFX1NUQVRVUywgMSwgQUNQSV9NVFhfRE9fTk9UX0xPQ0spOwpAQCAtNDQzLDcgKzQ0NCw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2VudGVyX3NsZWVwX3N0YXRlX3M0Ymlvcyk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9lbnRlcl9zbGVlcF9zdGF0ZV9zNGJpb3MpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDU3LDcgKzQ1OCw2IEBACiAgKiAgICAgICAgICAgICAgQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBFTkFCTEVELgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUodTggc2xlZXBfc3RhdGUpCiB7CiAJc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgYXJnX2xpc3Q7CkBAIC00NjgsNyArNDY4LDcgQEAKIAl1MzIgUE0xQWNvbnRyb2w7CiAJdTMyIFBNMUJjb250cm9sOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9sZWF2ZV9zbGVlcF9zdGF0ZSk7CiAKIAkvKgogCSAqIFNldCBTTFBfVFlQRSBhbmQgU0xQX0VOIHRvIHN0YXRlIFMwLgpAQCAtNDkwLDYgKzQ5MCw3IEBACiAJCQkJCSAgICAgICBBQ1BJX1JFR0lTVEVSX1BNMV9DT05UUk9MLAogCQkJCQkgICAgICAgJlBNMUFjb250cm9sKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKIAkJCS8qIENsZWFyIFNMUF9FTiBhbmQgU0xQX1RZUCBmaWVsZHMgKi8KIAogCQkJUE0xQWNvbnRyb2wgJj0gfihzbGVlcF90eXBlX3JlZ19pbmZvLT5hY2Nlc3NfYml0X21hc2sgfApAQCAtNTgzLDMgKzU4NCw1IEBACiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfbGVhdmVfc2xlZXBfc3RhdGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jIGIvZHJpdmVycy9hY3BpL2hhcmR3YXJlL2h3dGltZXIuYwppbmRleCBmYzEwYjdjLi5jNGVjNDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaGFyZHdhcmUvaHd0aW1lci5jCisrKyBiL2RyaXZlcnMvYWNwaS9oYXJkd2FyZS9od3RpbWVyLmMKQEAgLTQyLDcgKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX0hBUkRXQVJFCkBAIC02MSwxMyArNjAsMTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBhY3BpX3N0YXR1cyBhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKHUzMiAqIHJlc29sdXRpb24pCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfdGltZXJfcmVzb2x1dGlvbik7CiAKIAlpZiAoIXJlc29sdXRpb24pIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWlmICgwID09IGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0KSB7CisJaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKIAkJKnJlc29sdXRpb24gPSAyNDsKIAl9IGVsc2UgewogCQkqcmVzb2x1dGlvbiA9IDMyOwpAQCAtNzYsNiArNzUsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9yZXNvbHV0aW9uKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RpbWVyCkBAIC04NywxMiArODgsMTEgQEAKICAqIERFU0NSSVBUSU9OOiBPYnRhaW5zIGN1cnJlbnQgdmFsdWUgb2YgQUNQSSBQTSBUaW1lciAoaW4gdGlja3MpLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfZ2V0X3RpbWVyKHUzMiAqIHRpY2tzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3RpbWVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90aW1lcik7CiAKIAlpZiAoIXRpY2tzKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTEwMyw3ICsxMDMsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcikKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzMyw3ICsxMzMsNiBAQAogICogICAgICAgICAgICAgIDIqKjMyIFRpY2tzIC8gMyw2MDAsMDAwIFRpY2tzL1NlYyA9IDExOTMgc2VjIG9yIDE5Ljg4IG1pbnV0ZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfdGltZXJfZHVyYXRpb24odTMyIHN0YXJ0X3RpY2tzLCB1MzIgZW5kX3RpY2tzLCB1MzIgKiB0aW1lX2VsYXBzZWQpCiB7CkBAIC0xNDEsNyArMTQwLDcgQEAKIAl1MzIgZGVsdGFfdGlja3M7CiAJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGltZXJfZHVyYXRpb24iKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKIAogCWlmICghdGltZV9lbGFwc2VkKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTE1NCw3ICsxNTMsOCBAQAogCWlmIChzdGFydF90aWNrcyA8IGVuZF90aWNrcykgewogCQlkZWx0YV90aWNrcyA9IGVuZF90aWNrcyAtIHN0YXJ0X3RpY2tzOwogCX0gZWxzZSBpZiAoc3RhcnRfdGlja3MgPiBlbmRfdGlja3MpIHsKLQkJaWYgKDAgPT0gYWNwaV9nYmxfRkFEVC0+dG1yX3ZhbF9leHQpIHsKKwkJaWYgKGFjcGlfZ2JsX0ZBRFQtPnRtcl92YWxfZXh0ID09IDApIHsKKwogCQkJLyogMjQtYml0IFRpbWVyICovCiAKIAkJCWRlbHRhX3RpY2tzID0KQEAgLTE4Myw0ICsxODMsNCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RpbWVyX2R1cmF0aW9uKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90aW1lcl9kdXJhdGlvbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwppbmRleCAyZTJlNDA1MS4uYzI1YjJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2hvdGtleS5jCisrKyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwpAQCAtNzIzLDYgKzcyMyw4IEBACiAJCWdvdG8gZG9fZmFpbDsKIAljb3VudCA9IHRtcDEgLSB0bXA7CiAJKmFjdGlvbl9oYW5kbGUgPSAoY2hhciAqKWttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoISphY3Rpb25faGFuZGxlKQorCQlnb3RvIGRvX2ZhaWw7CiAJc3RybmNweSgqYWN0aW9uX2hhbmRsZSwgdG1wLCBjb3VudCk7CiAJKigqYWN0aW9uX2hhbmRsZSArIGNvdW50KSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9pYm1fYWNwaS5jIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKaW5kZXggMjYyYjFmNC4uMTVmYzEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKKysrIGIvZHJpdmVycy9hY3BpL2libV9hY3BpLmMKQEAgLTU2Nyw2ICs1NjcsNjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB3YW5fc3VwcG9ydGVkOworCitzdGF0aWMgaW50IHdhbl9pbml0KHZvaWQpCit7CisJd2FuX3N1cHBvcnRlZCA9IGhrZXlfaGFuZGxlICYmCisJICAgIGFjcGlfZXZhbGYoaGtleV9oYW5kbGUsIE5VTEwsICJHV0FOIiwgInF2Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YW5fc3RhdHVzKHZvaWQpCit7CisJaW50IHN0YXR1czsKKworCWlmICghd2FuX3N1cHBvcnRlZCB8fAorCSAgICAhYWNwaV9ldmFsZihoa2V5X2hhbmRsZSwgJnN0YXR1cywgIkdXQU4iLCAiZCIpKQorCQlzdGF0dXMgPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB3YW5fcmVhZChjaGFyICpwKQoreworCWludCBsZW4gPSAwOworCWludCBzdGF0dXMgPSB3YW5fc3RhdHVzKCk7CisKKwlpZiAoIXdhbl9zdXBwb3J0ZWQpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBzdXBwb3J0ZWRcbiIpOworCWVsc2UgaWYgKCEoc3RhdHVzICYgMSkpCisJCWxlbiArPSBzcHJpbnRmKHAgKyBsZW4sICJzdGF0dXM6XHRcdG5vdCBpbnN0YWxsZWRcbiIpOworCWVsc2UgeworCQlsZW4gKz0gc3ByaW50ZihwICsgbGVuLCAic3RhdHVzOlx0XHQlc1xuIiwgZW5hYmxlZChzdGF0dXMsIDEpKTsKKwkJbGVuICs9IHNwcmludGYocCArIGxlbiwgImNvbW1hbmRzOlx0ZW5hYmxlLCBkaXNhYmxlXG4iKTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHdhbl93cml0ZShjaGFyICpidWYpCit7CisJaW50IHN0YXR1cyA9IHdhbl9zdGF0dXMoKTsKKwljaGFyICpjbWQ7CisJaW50IGRvX2NtZCA9IDA7CisKKwlpZiAoIXdhbl9zdXBwb3J0ZWQpCisJCXJldHVybiAtRU5PREVWOworCisJd2hpbGUgKChjbWQgPSBuZXh0X2NtZCgmYnVmKSkpIHsKKwkJaWYgKHN0cmxlbmNtcChjbWQsICJlbmFibGUiKSA9PSAwKSB7CisJCQlzdGF0dXMgfD0gMjsKKwkJfSBlbHNlIGlmIChzdHJsZW5jbXAoY21kLCAiZGlzYWJsZSIpID09IDApIHsKKwkJCXN0YXR1cyAmPSB+MjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG9fY21kID0gMTsKKwl9CisKKwlpZiAoZG9fY21kICYmICFhY3BpX2V2YWxmKGhrZXlfaGFuZGxlLCBOVUxMLCAiU1dBTiIsICJ2ZCIsIHN0YXR1cykpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdmlkZW9fc3VwcG9ydGVkOwogc3RhdGljIGludCB2aWRlb19vcmlnX2F1dG9zdzsKIApAQCAtMTU2Myw2ICsxNjI2LDEzIEBACiAJIC53cml0ZSA9IGJsdWV0b290aF93cml0ZSwKIAkgfSwKIAl7CisJIC5uYW1lID0gIndhbiIsCisJIC5pbml0ID0gd2FuX2luaXQsCisJIC5yZWFkID0gd2FuX3JlYWQsCisJIC53cml0ZSA9IHdhbl93cml0ZSwKKwkgLmV4cGVyaW1lbnRhbCA9IDEsCisJIH0sCisJewogCSAubmFtZSA9ICJ2aWRlbyIsCiAJIC5pbml0ID0gdmlkZW9faW5pdCwKIAkgLnJlYWQgPSB2aWRlb19yZWFkLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL21vdGhlcmJvYXJkLmMgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwppbmRleCA0NjgyNDQxLi5kNTFkNjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYworKysgYi9kcml2ZXJzL2FjcGkvbW90aGVyYm9hcmQuYwpAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBBQ1BJX01CX0hJRDIJCQkiUE5QMEMwMiIKIC8qKgogICogRG9lc24ndCBjYXJlIGFib3V0IGxlZ2FjeSBJTyBwb3J0cywgb25seSBJTyBwb3J0cyBiZXlvbmQgMHgxMDAwIGFyZSByZXNlcnZlZAotICogRG9lc24ndCBjYXJlIGFib3V0IHRoZSBmYWlsdXJlIG9mICdyZXF1ZXN0X3JlZ2lvbicsIHNpbmNlIG90aGVyIG1heSByZXNlcnZlIAorICogRG9lc24ndCBjYXJlIGFib3V0IHRoZSBmYWlsdXJlIG9mICdyZXF1ZXN0X3JlZ2lvbicsIHNpbmNlIG90aGVyIG1heSByZXNlcnZlCiAgKiB0aGUgaW8gcG9ydHMgYXMgd2VsbAogICovCiAjZGVmaW5lIElTX1JFU0VSVkVEX0FERFIoYmFzZSwgbGVuKSBcCkBAIC00Niw3ICs0Niw3IEBACiAvKgogICogQ2xlYXJpbmcgdGhlIGZsYWcgKElPUkVTT1VSQ0VfQlVTWSkgYWxsb3dzIGRyaXZlcnMgdG8gdXNlCiAgKiB0aGUgaW8gcG9ydHMgaWYgdGhleSByZWFsbHkga25vdyB0aGV5IGNhbiB1c2UgaXQsIHdoaWxlCi0gKiBzdGlsbCBwcmV2ZW50aW5nIGhvdHBsdWcgUENJIGRldmljZXMgZnJvbSB1c2luZyBpdC4gCisgKiBzdGlsbCBwcmV2ZW50aW5nIGhvdHBsdWcgUENJIGRldmljZXMgZnJvbSB1c2luZyBpdC4KICAqLwogc3RhdGljIGFjcGlfc3RhdHVzIGFjcGlfcmVzZXJ2ZV9pb19yYW5nZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqZGF0YSkKIHsKQEAgLTEyMyw0OSArMTIzLDU0IEBACiAJCX0sCiB9OwogCitzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9yZXF1ZXN0X3JlZ2lvbiAoc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzICphZGRyLAorCXVuc2lnbmVkIGludCBsZW5ndGgsIGNoYXIgKmRlc2MpCit7CisJaWYgKCFhZGRyLT5hZGRyZXNzIHx8ICFsZW5ndGgpCisJCXJldHVybjsKKworCWlmIChhZGRyLT5hZGRyZXNzX3NwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKKwkJcmVxdWVzdF9yZWdpb24oYWRkci0+YWRkcmVzcywgbGVuZ3RoLCBkZXNjKTsKKwllbHNlIGlmIChhZGRyLT5hZGRyZXNzX3NwYWNlX2lkID09IEFDUElfQURSX1NQQUNFX1NZU1RFTV9NRU1PUlkpCisJCXJlcXVlc3RfbWVtX3JlZ2lvbihhZGRyLT5hZGRyZXNzLCBsZW5ndGgsIGRlc2MpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9yZXNlcnZlX3Jlc291cmNlcyh2b2lkKQogewotCWlmIChhY3BpX2dibF9GQURULT54cG0xYV9ldnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4pCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGsuYWRkcmVzcywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIlBNMWFfRVZUX0JMSyIpOworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbTFhX2V2dF9ibGssCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2V2dF9sZW4sICJBQ1BJIFBNMWFfRVZUX0JMSyIpOwogCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2V2dF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbikKLQkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2Jsay5hZGRyZXNzLAotCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPnBtMV9ldnRfbGVuLCAiUE0xYl9FVlRfQkxLIik7CisJYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC0+eHBtMWJfZXZ0X2JsaywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfZXZ0X2xlbiwgIkFDUEkgUE0xYl9FVlRfQkxLIik7CiAKLQlpZiAoYWNwaV9nYmxfRkFEVC0+eHBtMWFfY250X2Jsay5hZGRyZXNzICYmIGFjcGlfZ2JsX0ZBRFQtPnBtMV9jbnRfbGVuKQotCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrLmFkZHJlc3MsCi0JCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4sICJQTTFhX0NOVF9CTEsiKTsKKwlhY3BpX3JlcXVlc3RfcmVnaW9uKCZhY3BpX2dibF9GQURULT54cG0xYV9jbnRfYmxrLAorCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPnBtMV9jbnRfbGVuLCAiQUNQSSBQTTFhX0NOVF9CTEsiKTsKIAotCWlmIChhY3BpX2dibF9GQURULT54cG0xYl9jbnRfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4pCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGsuYWRkcmVzcywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTFfY250X2xlbiwgIlBNMWJfQ05UX0JMSyIpOworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbTFiX2NudF9ibGssCisJCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0xX2NudF9sZW4sICJBQ1BJIFBNMWJfQ05UX0JMSyIpOwogCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MgJiYgYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuID09IDQpCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLmFkZHJlc3MsIDQsICJQTV9UTVIiKTsKKwlpZiAoYWNwaV9nYmxfRkFEVC0+cG1fdG1fbGVuID09IDQpCisJCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbV90bXJfYmxrLCA0LCAiQUNQSSBQTV9UTVIiKTsKIAotCWlmIChhY3BpX2dibF9GQURULT54cG0yX2NudF9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5wbTJfY250X2xlbikKLQkJcmVxdWVzdF9yZWdpb24oYWNwaV9nYmxfRkFEVC0+eHBtMl9jbnRfYmxrLmFkZHJlc3MsCi0JCQkgICAgICAgYWNwaV9nYmxfRkFEVC0+cG0yX2NudF9sZW4sICJQTTJfQ05UX0JMSyIpOworCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhwbTJfY250X2JsaywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5wbTJfY250X2xlbiwgIkFDUEkgUE0yX0NOVF9CTEsiKTsKIAogCS8qIExlbmd0aCBvZiBHUEUgYmxvY2tzIG11c3QgYmUgYSBub24tbmVnYXRpdmUgbXVsdGlwbGUgb2YgMiAqLwogCi0JaWYgKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzICYmIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmJgotCSAgICAhKGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiAmIDB4MSkpCi0JCXJlcXVlc3RfcmVnaW9uKGFjcGlfZ2JsX0ZBRFQtPnhncGUwX2Jsay5hZGRyZXNzLAotCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiwgIkdQRTBfQkxLIik7CisJaWYgKCEoYWNwaV9nYmxfRkFEVC0+Z3BlMF9ibGtfbGVuICYgMHgxKSkKKwkJYWNwaV9yZXF1ZXN0X3JlZ2lvbigmYWNwaV9nYmxfRkFEVC0+eGdwZTBfYmxrLAorCQkJICAgICAgIGFjcGlfZ2JsX0ZBRFQtPmdwZTBfYmxrX2xlbiwgIkFDUEkgR1BFMF9CTEsiKTsKIAotCWlmIChhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcyAmJiBhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4gJiYKLQkgICAgIShhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4gJiAweDEpKQotCQlyZXF1ZXN0X3JlZ2lvbihhY3BpX2dibF9GQURULT54Z3BlMV9ibGsuYWRkcmVzcywKLQkJCSAgICAgICBhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4sICJHUEUxX0JMSyIpOworCWlmICghKGFjcGlfZ2JsX0ZBRFQtPmdwZTFfYmxrX2xlbiAmIDB4MSkpCisJCWFjcGlfcmVxdWVzdF9yZWdpb24oJmFjcGlfZ2JsX0ZBRFQtPnhncGUxX2JsaywKKwkJCSAgICAgICBhY3BpX2dibF9GQURULT5ncGUxX2Jsa19sZW4sICJBQ1BJIEdQRTFfQkxLIik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfbW90aGVyYm9hcmRfaW5pdCh2b2lkKQogewogCWFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9tb3RoZXJib2FyZF9kcml2ZXIxKTsKIAlhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJmFjcGlfbW90aGVyYm9hcmRfZHJpdmVyMik7Ci0JLyogCisJLyoKIAkgKiBHdWFyYW50ZWUgbW90aGVyYm9hcmQgSU8gcmVzZXJ2YXRpb24gZmlyc3QKIAkgKiBUaGlzIG1vZHVsZSBtdXN0IHJ1biBhZnRlciBzY2FuLmMKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNhY2Nlc3MuYwppbmRleCAxMTQ5YmMxLi40OGZhZGFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWNjZXNzLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FjY2Vzcy5jCkBAIC03MCw3ICs3MCw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJYWNwaV9zdHJpbmcgdmFsID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX3Jvb3RfaW5pdGlhbGl6ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfcm9vdF9pbml0aWFsaXplKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtOTgsNiArOTgsNyBAQAogCQkJICAiRW50ZXJpbmcgcHJlZGVmaW5lZCBlbnRyaWVzIGludG8gbmFtZXNwYWNlXG4iKSk7CiAKIAlmb3IgKGluaXRfdmFsID0gYWNwaV9nYmxfcHJlX2RlZmluZWRfbmFtZXM7IGluaXRfdmFsLT5uYW1lOyBpbml0X3ZhbCsrKSB7CisKIAkJLyogX09TSSBpcyBvcHRpb25hbCBmb3Igbm93LCB3aWxsIGJlIHBlcm1hbmVudCBsYXRlciAqLwogCiAJCWlmICghQUNQSV9TVFJDTVAoaW5pdF92YWwtPm5hbWUsICJfT1NJIikKQEAgLTE1Niw3ICsxNTcsNyBAQAogCiAjaWYgZGVmaW5lZCAoQUNQSV9BU0xfQ09NUElMRVIpCiAKLQkJCQkvKiBzYXZlIHRoZSBwYXJhbWV0ZXIgY291bnQgZm9yIHRoZSBpX2FTTCBjb21waWxlciAqLworCQkJCS8qIFNhdmUgdGhlIHBhcmFtZXRlciBjb3VudCBmb3IgdGhlIGlfYVNMIGNvbXBpbGVyICovCiAKIAkJCQluZXdfbm9kZS0+dmFsdWUgPSBvYmpfZGVzYy0+bWV0aG9kLnBhcmFtX2NvdW50OwogI2Vsc2UKQEAgLTI1OCwxMCArMjU5LDggQEAKIAkvKiBTYXZlIGEgaGFuZGxlIHRvICJfR1BFIiwgaXQgaXMgYWx3YXlzIHByZXNlbnQgKi8KIAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9uc19nZXRfbm9kZV9ieV9wYXRoKCJcXF9HUEUiLCBOVUxMLAotCQkJCQkgICAgIEFDUElfTlNfTk9fVVBTRUFSQ0gsCi0JCQkJCSAgICAgJmFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSk7CisJCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGUoTlVMTCwgIlxcX0dQRSIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsCisJCQkJCSAgJmFjcGlfZ2JsX2ZhZHRfZ3BlX2RldmljZSk7CiAJfQogCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC0zMTAsMTcgKzMwOSwxNyBAQAogCWFjcGlfb2JqZWN0X3R5cGUgdHlwZV90b19jaGVja19mb3I7CiAJYWNwaV9vYmplY3RfdHlwZSB0aGlzX3NlYXJjaF90eXBlOwogCXUzMiBzZWFyY2hfcGFyZW50X2ZsYWcgPSBBQ1BJX05TX1NFQVJDSF9QQVJFTlQ7Ci0JdTMyIGxvY2FsX2ZsYWdzID0gZmxhZ3MgJiB+KEFDUElfTlNfRVJST1JfSUZfRk9VTkQgfAotCQkJCSAgICBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpOworCXUzMiBsb2NhbF9mbGFnczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2xvb2t1cCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9va3VwKTsKIAogCWlmICghcmV0dXJuX25vZGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCsrOworCWxvY2FsX2ZsYWdzID0gZmxhZ3MgJiB+KEFDUElfTlNfRVJST1JfSUZfRk9VTkQgfCBBQ1BJX05TX1NFQVJDSF9QQVJFTlQpOwogCSpyZXR1cm5fbm9kZSA9IEFDUElfRU5UUllfTk9UX0ZPVU5EOworCWFjcGlfZ2JsX25zX2xvb2t1cF9jb3VudCsrOwogCiAJaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX05BTUVTUEFDRSk7CkBAIC0zNDYsMTQgKzM0NSwxNyBAQAogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9JTlRFUk5BTCk7CiAJCX0KIAotCQkvKgotCQkgKiBUaGlzIG5vZGUgbWlnaHQgbm90IGJlIGEgYWN0dWFsICJzY29wZSIgbm9kZSAoc3VjaCBhcyBhCi0JCSAqIERldmljZS9NZXRob2QsIGV0Yy4pICBJdCBjb3VsZCBiZSBhIFBhY2thZ2Ugb3Igb3RoZXIgb2JqZWN0IG5vZGUuCi0JCSAqIEJhY2t1cCB1cCB0aGUgdHJlZSB0byBmaW5kIHRoZSBjb250YWluaW5nIHNjb3BlIG5vZGUuCi0JCSAqLwotCQl3aGlsZSAoIWFjcGlfbnNfb3BlbnNfc2NvcGUocHJlZml4X25vZGUtPnR5cGUpICYmCi0JCSAgICAgICBwcmVmaXhfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSB7Ci0JCQlwcmVmaXhfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHByZWZpeF9ub2RlKTsKKwkJaWYgKCEoZmxhZ3MgJiBBQ1BJX05TX1BSRUZJWF9JU19TQ09QRSkpIHsKKwkJCS8qCisJCQkgKiBUaGlzIG5vZGUgbWlnaHQgbm90IGJlIGEgYWN0dWFsICJzY29wZSIgbm9kZSAoc3VjaCBhcyBhCisJCQkgKiBEZXZpY2UvTWV0aG9kLCBldGMuKSAgSXQgY291bGQgYmUgYSBQYWNrYWdlIG9yIG90aGVyIG9iamVjdCBub2RlLgorCQkJICogQmFja3VwIHVwIHRoZSB0cmVlIHRvIGZpbmQgdGhlIGNvbnRhaW5pbmcgc2NvcGUgbm9kZS4KKwkJCSAqLworCQkJd2hpbGUgKCFhY3BpX25zX29wZW5zX3Njb3BlKHByZWZpeF9ub2RlLT50eXBlKSAmJgorCQkJICAgICAgIHByZWZpeF9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9BTlkpIHsKKwkJCQlwcmVmaXhfbm9kZSA9CisJCQkJICAgIGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKHByZWZpeF9ub2RlKTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzY1LDYgKzM2Nyw3IEBACiAJICogQmVnaW4gZXhhbWluYXRpb24gb2YgdGhlIGFjdHVhbCBwYXRobmFtZQogCSAqLwogCWlmICghcGF0aG5hbWUpIHsKKwogCQkvKiBBIE51bGwgbmFtZV9wYXRoIGlzIGFsbG93ZWQgYW5kIHJlZmVycyB0byB0aGUgcm9vdCAqLwogCiAJCW51bV9zZWdtZW50cyA9IDA7CkBAIC0zODksNiArMzkyLDcgQEAKIAkJICogdG8gdGhlIGN1cnJlbnQgc2NvcGUpLgogCQkgKi8KIAkJaWYgKCpwYXRoID09ICh1OCkgQU1MX1JPT1RfUFJFRklYKSB7CisKIAkJCS8qIFBhdGhuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCwgc3RhcnQgZnJvbSB0aGUgcm9vdCAqLwogCiAJCQl0aGlzX25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CkBAIC00MTYsNiArNDIwLDcgQEAKIAkJCXRoaXNfbm9kZSA9IHByZWZpeF9ub2RlOwogCQkJbnVtX2NhcmF0cyA9IDA7CiAJCQl3aGlsZSAoKnBhdGggPT0gKHU4KSBBTUxfUEFSRU5UX1BSRUZJWCkgeworCiAJCQkJLyogTmFtZSBpcyBmdWxseSBxdWFsaWZpZWQsIG5vIHNlYXJjaCBydWxlcyBhcHBseSAqLwogCiAJCQkJc2VhcmNoX3BhcmVudF9mbGFnID0gQUNQSV9OU19OT19VUFNFQVJDSDsKQEAgLTQzMCw2ICs0MzUsNyBAQAogCQkJCW51bV9jYXJhdHMrKzsKIAkJCQl0aGlzX25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZSh0aGlzX25vZGUpOwogCQkJCWlmICghdGhpc19ub2RlKSB7CisKIAkJCQkJLyogQ3VycmVudCBzY29wZSBoYXMgbm8gcGFyZW50IHNjb3BlICovCiAKIAkJCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKQEAgLTU2OSw2ICs1NzUsNyBAQAogCQkJCQkgICAgICZ0aGlzX25vZGUpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCWlmIChzdGF0dXMgPT0gQUVfTk9UX0ZPVU5EKSB7CisKIAkJCQkvKiBOYW1lIG5vdCBmb3VuZCBpbiBBQ1BJIG5hbWVzcGFjZSAqLwogCiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKQEAgLTYwMiwxMCArNjA5LDExIEBACiAJCSAgICAodHlwZV90b19jaGVja19mb3IgIT0gQUNQSV9UWVBFX0xPQ0FMX1NDT1BFKSAmJgogCQkgICAgKHRoaXNfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfQU5ZKSAmJgogCQkgICAgKHRoaXNfbm9kZS0+dHlwZSAhPSB0eXBlX3RvX2NoZWNrX2ZvcikpIHsKKwogCQkJLyogQ29tcGxhaW4gYWJvdXQgYSB0eXBlIG1pc21hdGNoICovCiAKIAkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAibnNfbG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKSIsCisJCQkJICAgICAgIk5zTG9va3VwOiBUeXBlIG1pc21hdGNoIG9uICU0LjRzICglcyksIHNlYXJjaGluZyBmb3IgKCVzKSIsCiAJCQkJICAgICAgQUNQSV9DQVNUX1BUUihjaGFyLCAmc2ltcGxlX25hbWUpLAogCQkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0aGlzX25vZGUtPnR5cGUpLAogCQkJCSAgICAgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2FsbG9jLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYwppbmRleCA5Yjg3MWYzLi5kYzNmMDczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zYWxsb2MuYwpAQCAtNDcsOSArNDcsNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiBBQ1BJX01PRFVMRV9OQU1FKCJuc2FsbG9jIikKIAotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19jcmVhdGVfbm9kZQpAQCAtNjEsMTQgKzU4LDEzIEBACiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbmFtZXNwYWNlIG5vZGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqYWNwaV9uc19jcmVhdGVfbm9kZSh1MzIgbmFtZSkKIHsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2NyZWF0ZV9ub2RlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19jcmVhdGVfbm9kZSk7CiAKLQlub2RlID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSkpOworCW5vZGUgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7CiAJaWYgKCFub2RlKSB7CiAJCXJldHVybl9QVFIoTlVMTCk7CiAJfQpAQCAtNzYsOSArNzIsNyBAQAogCUFDUElfTUVNX1RSQUNLSU5HKGFjcGlfZ2JsX25zX25vZGVfbGlzdC0+dG90YWxfYWxsb2NhdGVkKyspOwogCiAJbm9kZS0+bmFtZS5pbnRlZ2VyID0gbmFtZTsKLQlub2RlLT5yZWZlcmVuY2VfY291bnQgPSAxOwogCUFDUElfU0VUX0RFU0NSSVBUT1JfVFlQRShub2RlLCBBQ1BJX0RFU0NfVFlQRV9OQU1FRCk7Ci0KIAlyZXR1cm5fUFRSKG5vZGUpOwogfQogCkBAIC0xMDAsNyArOTQsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmV2X25vZGU7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5leHRfbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19kZWxldGVfbm9kZSIsIG5vZGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2RlbGV0ZV9ub2RlLCBub2RlKTsKIAogCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUobm9kZSk7CiAKQEAgLTExNSw2ICsxMDksNyBAQAogCX0KIAogCWlmIChwcmV2X25vZGUpIHsKKwogCQkvKiBOb2RlIGlzIG5vdCBmaXJzdCBjaGlsZCwgdW5saW5rIGl0ICovCiAKIAkJcHJldl9ub2RlLT5wZWVyID0gbmV4dF9ub2RlLT5wZWVyOwpAQCAtMTI1LDYgKzEyMCw3IEBACiAJCS8qIE5vZGUgaXMgZmlyc3QgY2hpbGQgKGhhcyBubyBwcmV2aW91cyBwZWVyKSAqLwogCiAJCWlmIChuZXh0X25vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgeworCiAJCQkvKiBObyBwZWVycyBhdCBhbGwgKi8KIAogCQkJcGFyZW50X25vZGUtPmNoaWxkID0gTlVMTDsKQEAgLTEzNywxMCArMTMzLDEwIEBACiAJQUNQSV9NRU1fVFJBQ0tJTkcoYWNwaV9nYmxfbnNfbm9kZV9saXN0LT50b3RhbF9mcmVlZCsrKTsKIAogCS8qCi0JICogRGV0YWNoIGFuIG9iamVjdCBpZiB0aGVyZSBpcyBvbmUgdGhlbiBkZWxldGUgdGhlIG5vZGUKKwkgKiBEZXRhY2ggYW4gb2JqZWN0IGlmIHRoZXJlIGlzIG9uZSwgdGhlbiBkZWxldGUgdGhlIG5vZGUKIAkgKi8KIAlhY3BpX25zX2RldGFjaF9vYmplY3Qobm9kZSk7Ci0JQUNQSV9NRU1fRlJFRShub2RlKTsKKwkodm9pZClhY3BpX29zX3JlbGVhc2Vfb2JqZWN0KGFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSwgbm9kZSk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKQEAgLTE3MSw3ICsxNjcsNyBAQAogCWFjcGlfb3duZXJfaWQgb3duZXJfaWQgPSAwOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfaW5zdGFsbF9ub2RlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19pbnN0YWxsX25vZGUpOwogCiAJLyoKIAkgKiBHZXQgdGhlIG93bmVyIElEIGZyb20gdGhlIFdhbGsgc3RhdGUKQEAgLTIxNiwxNCArMjEyLDYgQEAKIAkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHBhcmVudF9ub2RlLT50eXBlKSwKIAkJCSAgcGFyZW50X25vZGUpKTsKIAotCS8qCi0JICogSW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQocykgb2YgYWxsIHBhcmVudHMgdXAgdG8KLQkgKiB0aGUgcm9vdCEKLQkgKi8KLQl3aGlsZSAoKG5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSkgIT0gTlVMTCkgewotCQlub2RlLT5yZWZlcmVuY2VfY291bnQrKzsKLQl9Ci0KIAlyZXR1cm5fVk9JRDsKIH0KIApAQCAtMjQ0LDEwICsyMzIsOSBAQAogewogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpjaGlsZF9ub2RlOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpuZXh0X25vZGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJdTggZmxhZ3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZGVsZXRlX2NoaWxkcmVuIiwgcGFyZW50X25vZGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKG5zX2RlbGV0ZV9jaGlsZHJlbiwgcGFyZW50X25vZGUpOwogCiAJaWYgKCFwYXJlbnRfbm9kZSkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTI2NCw2ICsyNTEsNyBAQAogCSAqIERlYWxsb2NhdGUgYWxsIGNoaWxkcmVuIGF0IHRoaXMgbGV2ZWwKIAkgKi8KIAlkbyB7CisKIAkJLyogR2V0IHRoZSB0aGluZ3Mgd2UgbmVlZCAqLwogCiAJCW5leHRfbm9kZSA9IGNoaWxkX25vZGUtPnBlZXI7CkBAIC0yODksMjYgKzI3NywxMCBAQAogCQkgKi8KIAkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwogCi0JCS8qCi0JCSAqIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50KHMpIG9mIGFsbCBwYXJlbnRzIHVwIHRvCi0JCSAqIHRoZSByb290ISAoY291bnRzIHdlcmUgaW5jcmVtZW50ZWQgd2hlbiB0aGUgbm9kZSB3YXMgY3JlYXRlZCkKLQkJICovCi0JCW5vZGUgPSBjaGlsZF9ub2RlOwotCQl3aGlsZSAoKG5vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKSkgIT0gTlVMTCkgewotCQkJbm9kZS0+cmVmZXJlbmNlX2NvdW50LS07Ci0JCX0KLQotCQkvKiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgcmVmZXJlbmNlIHJlbWFpbmluZyBvbiB0aGlzIG5vZGUgKi8KLQotCQlpZiAoY2hpbGRfbm9kZS0+cmVmZXJlbmNlX2NvdW50ICE9IDEpIHsKLQkJCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCQkgICAgICAiRXhpc3RpbmcgcmVmZXJlbmNlcyAoJWQpIG9uIG5vZGUgYmVpbmcgZGVsZXRlZCAoJXApIiwKLQkJCQkgICAgICBjaGlsZF9ub2RlLT5yZWZlcmVuY2VfY291bnQsIGNoaWxkX25vZGUpKTsKLQkJfQotCiAJCS8qIE5vdyB3ZSBjYW4gZGVsZXRlIHRoZSBub2RlICovCiAKLQkJQUNQSV9NRU1fRlJFRShjaGlsZF9ub2RlKTsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9uYW1lc3BhY2VfY2FjaGUsCisJCQkJCSAgICAgY2hpbGRfbm9kZSk7CiAKIAkJLyogQW5kIG1vdmUgb24gdG8gdGhlIG5leHQgY2hpbGQgaW4gdGhlIGxpc3QgKi8KIApAQCAtMzQxLDcgKzMxMyw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmNoaWxkX25vZGUgPSBOVUxMOwogCXUzMiBsZXZlbCA9IDE7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZWxldGVfbmFtZXNwYWNlX3N1YnRyZWUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2RlbGV0ZV9uYW1lc3BhY2Vfc3VidHJlZSk7CiAKIAlpZiAoIXBhcmVudF9ub2RlKSB7CiAJCXJldHVybl9WT0lEOwpAQCAtMzUyLDExICszMjQsMTQgQEAKIAkgKiB0byB3aGVyZSB3ZSBzdGFydGVkLgogCSAqLwogCXdoaWxlIChsZXZlbCA+IDApIHsKKwogCQkvKiBHZXQgdGhlIG5leHQgbm9kZSBpbiB0aGlzIHNjb3BlIChOVUxMIGlmIG5vbmUpICovCiAKLQkJY2hpbGRfbm9kZSA9IGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKLQkJCQkJCSAgIGNoaWxkX25vZGUpOworCQljaGlsZF9ub2RlID0KKwkJICAgIGFjcGlfbnNfZ2V0X25leHRfbm9kZShBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfbm9kZSwKKwkJCQkJICBjaGlsZF9ub2RlKTsKIAkJaWYgKGNoaWxkX25vZGUpIHsKKwogCQkJLyogRm91bmQgYSBjaGlsZCBub2RlIC0gZGV0YWNoIGFueSBhdHRhY2hlZCBvYmplY3QgKi8KIAogCQkJYWNwaV9uc19kZXRhY2hfb2JqZWN0KGNoaWxkX25vZGUpOwpAQCAtNDAxLDU1ICszNzYsNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UKLSAqCi0gKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgLSBOYW1lZCBub2RlIHdob3NlIHJlZmVyZW5jZSBjb3VudCBpcyB0byBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVtZW50ZWQKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogUmVtb3ZlIGEgTm9kZSByZWZlcmVuY2UuICBEZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQKLSAqICAgICAgICAgICAgICBvZiBhbGwgcGFyZW50IE5vZGVzIHVwIHRvIHRoZSByb290LiAgQW55IG5vZGUgYWxvbmcKLSAqICAgICAgICAgICAgICB0aGUgd2F5IHRoYXQgcmVhY2hlcyB6ZXJvIHJlZmVyZW5jZXMgaXMgZnJlZWQuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgYWNwaV9uc19yZW1vdmVfcmVmZXJlbmNlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKQotewotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqdGhpc19ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOwotCi0JLyoKLQkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudChzKSBvZiB0aGlzIG5vZGUgYW5kIGFsbAotCSAqIG5vZGVzIHVwIHRvIHRoZSByb290LCAgRGVsZXRlIGFueXRoaW5nIHdpdGggemVybyByZW1haW5pbmcgcmVmZXJlbmNlcy4KLQkgKi8KLQl0aGlzX25vZGUgPSBub2RlOwotCXdoaWxlICh0aGlzX25vZGUpIHsKLQkJLyogUHJlcGFyZSB0byBtb3ZlIHVwIHRvIHBhcmVudCAqLwotCi0JCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUodGhpc19ub2RlKTsKLQotCQkvKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvbiB0aGlzIG5vZGUgKi8KLQotCQl0aGlzX25vZGUtPnJlZmVyZW5jZV9jb3VudC0tOwotCi0JCS8qIERlbGV0ZSB0aGUgbm9kZSBpZiBubyBtb3JlIHJlZmVyZW5jZXMgKi8KLQotCQlpZiAoIXRoaXNfbm9kZS0+cmVmZXJlbmNlX2NvdW50KSB7Ci0JCQkvKiBEZWxldGUgYWxsIGNoaWxkcmVuIGFuZCBkZWxldGUgdGhlIG5vZGUgKi8KLQotCQkJYWNwaV9uc19kZWxldGVfY2hpbGRyZW4odGhpc19ub2RlKTsKLQkJCWFjcGlfbnNfZGVsZXRlX25vZGUodGhpc19ub2RlKTsKLQkJfQotCi0JCXRoaXNfbm9kZSA9IHBhcmVudF9ub2RlOwotCX0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyCiAgKgogICogUEFSQU1FVEVSUzogIG93bmVyX2lkICAgIC0gQWxsIG5vZGVzIHdpdGggdGhpcyBvd25lciB3aWxsIGJlIGRlbGV0ZWQKQEAgLTQ2OSwxNSArMzk1LDE1IEBACiAJdTMyIGxldmVsOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJuc19kZWxldGVfbmFtZXNwYWNlX2J5X293bmVyIiwgb3duZXJfaWQpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKG5zX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIsIG93bmVyX2lkKTsKIAogCWlmIChvd25lcl9pZCA9PSAwKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIAorCWRlbGV0aW9uX25vZGUgPSBOVUxMOwogCXBhcmVudF9ub2RlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwogCWNoaWxkX25vZGUgPSBOVUxMOwotCWRlbGV0aW9uX25vZGUgPSBOVUxMOwogCWxldmVsID0gMTsKIAogCS8qCkBAIC00OTQsMTIgKzQyMCwxNCBAQAogCQkJCQkgIGNoaWxkX25vZGUpOwogCiAJCWlmIChkZWxldGlvbl9ub2RlKSB7Ci0JCQlhY3BpX25zX3JlbW92ZV9yZWZlcmVuY2UoZGVsZXRpb25fbm9kZSk7CisJCQlhY3BpX25zX2RlbGV0ZV9jaGlsZHJlbihkZWxldGlvbl9ub2RlKTsKKwkJCWFjcGlfbnNfZGVsZXRlX25vZGUoZGVsZXRpb25fbm9kZSk7CiAJCQlkZWxldGlvbl9ub2RlID0gTlVMTDsKIAkJfQogCiAJCWlmIChjaGlsZF9ub2RlKSB7CiAJCQlpZiAoY2hpbGRfbm9kZS0+b3duZXJfaWQgPT0gb3duZXJfaWQpIHsKKwogCQkJCS8qIEZvdW5kIGEgbWF0Y2hpbmcgY2hpbGQgbm9kZSAtIGRldGFjaCBhbnkgYXR0YWNoZWQgb2JqZWN0ICovCiAKIAkJCQlhY3BpX25zX2RldGFjaF9vYmplY3QoY2hpbGRfbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAuYwppbmRleCBhMjgwNzMxLi5kNzJkZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wLmMKQEAgLTc1LDcgKzc1LDcgQEAKIHsKIAlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX3ByaW50X3BhdGhuYW1lIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX3ByaW50X3BhdGhuYW1lKTsKIAogCWlmICghKGFjcGlfZGJnX2xldmVsICYgQUNQSV9MVl9OQU1FUykKIAkgICAgfHwgIShhY3BpX2RiZ19sYXllciAmIEFDUElfTkFNRVNQQUNFKSkgewpAQCAtMTIzLDcgKzEyMyw3IEBACiBhY3BpX25zX2R1bXBfcGF0aG5hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICptc2csIHUzMiBsZXZlbCwgdTMyIGNvbXBvbmVudCkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2R1bXBfcGF0aG5hbWUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX2R1bXBfcGF0aG5hbWUpOwogCiAJLyogRG8gdGhpcyBvbmx5IGlmIHRoZSByZXF1ZXN0ZWQgZGVidWcgbGV2ZWwgYW5kIGNvbXBvbmVudCBhcmUgZW5hYmxlZCAqLwogCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl1MzIgZGJnX2xldmVsOwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJuc19kdW1wX29uZV9vYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUobnNfZHVtcF9vbmVfb2JqZWN0KTsKIAogCS8qIElzIG91dHB1dCBlbmFibGVkPyAqLwogCkBAIC0xOTEsNiArMTkxLDcgQEAKIAl9CiAKIAlpZiAoIShpbmZvLT5kaXNwbGF5X3R5cGUgJiBBQ1BJX0RJU1BMQVlfU0hPUlQpKSB7CisKIAkJLyogSW5kZW50IHRoZSBvYmplY3QgYWNjb3JkaW5nIHRvIHRoZSBsZXZlbCAqLwogCiAJCWFjcGlfb3NfcHJpbnRmKCIlMmQlKnMiLCAodTMyKSBsZXZlbCAtIDEsIChpbnQpbGV2ZWwgKiAyLCAiICIpOwpAQCAtMjAzLDYgKzIwNCw5IEBACiAJCX0KIAogCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHRoaXNfbm9kZS0+bmFtZS5pbnRlZ2VyKSkgeworCQkJdGhpc19ub2RlLT5uYW1lLmludGVnZXIgPQorCQkJICAgIGFjcGlfdXRfcmVwYWlyX25hbWUodGhpc19ub2RlLT5uYW1lLmludGVnZXIpOworCiAJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJJbnZhbGlkIEFDUEkgTmFtZSAlMDhYIiwKIAkJCQkgICAgICB0aGlzX25vZGUtPm5hbWUuaW50ZWdlcikpOwogCQl9CkBAIC0yMjYsNiArMjMwLDcgQEAKIAljYXNlIEFDUElfRElTUExBWV9TVU1NQVJZOgogCiAJCWlmICghb2JqX2Rlc2MpIHsKKwogCQkJLyogTm8gYXR0YWNoZWQgb2JqZWN0LCB3ZSBhcmUgZG9uZSAqLwogCiAJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKQEAgLTQxOSw2ICs0MjQsNyBAQAogCiAJCWFjcGlfb3NfcHJpbnRmKCJPOiVwIiwgb2JqX2Rlc2MpOwogCQlpZiAoIW9ial9kZXNjKSB7CisKIAkJCS8qIE5vIGF0dGFjaGVkIG9iamVjdCwgd2UgYXJlIGRvbmUgKi8KIAogCQkJYWNwaV9vc19wcmludGYoIlxuIik7CkBAIC02NjksNyArNjc1LDcgQEAKIHsKIAlhY3BpX2hhbmRsZSBzZWFyY2hfaGFuZGxlID0gc2VhcmNoX2Jhc2U7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kdW1wX3RhYmxlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZHVtcF90YWJsZXMpOwogCiAJaWYgKCFhY3BpX2dibF9yb290X25vZGUpIHsKIAkJLyoKQEAgLTY4Miw2ICs2ODgsNyBAQAogCX0KIAogCWlmIChBQ1BJX05TX0FMTCA9PSBzZWFyY2hfYmFzZSkgeworCiAJCS8qIEVudGlyZSBuYW1lc3BhY2UgKi8KIAogCQlzZWFyY2hfaGFuZGxlID0gYWNwaV9nYmxfcm9vdF9ub2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXBkdi5jCmluZGV4IGFmZjg5OWEuLmM2YmY1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZHVtcGR2LmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2R1bXBfb25lX2RldmljZSIpOworCUFDUElfRlVOQ1RJT05fTkFNRShuc19kdW1wX29uZV9kZXZpY2UpOwogCiAJc3RhdHVzID0KIAkgICAgYWNwaV9uc19kdW1wX29uZV9vYmplY3Qob2JqX2hhbmRsZSwgbGV2ZWwsIGNvbnRleHQsIHJldHVybl92YWx1ZSk7CkBAIC05Miw3ICs5Miw3IEBACiAJCQkJICAgICAgaW5mby0+aGFyZHdhcmVfaWQudmFsdWUsCiAJCQkJICAgICAgQUNQSV9GT1JNQVRfVUlOVDY0KGluZm8tPmFkZHJlc3MpLAogCQkJCSAgICAgIGluZm8tPmN1cnJlbnRfc3RhdHVzKSk7Ci0JCUFDUElfTUVNX0ZSRUUoaW5mbyk7CisJCUFDUElfRlJFRShpbmZvKTsKIAl9CiAKIAlyZXR1cm4gKHN0YXR1cyk7CkBAIC0xMTUsNyArMTE1LDcgQEAKIAlhY3BpX2hhbmRsZSBzeXNfYnVzX2hhbmRsZTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2R1bXBfcm9vdF9kZXZpY2VzIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKG5zX2R1bXBfcm9vdF9kZXZpY2VzKTsKIAogCS8qIE9ubHkgZHVtcCB0aGUgdGFibGUgaWYgdHJhY2luZyBpcyBlbmFibGVkICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zZXZhbC5jCmluZGV4IDE5ZDdiOTQuLjRiMGE0YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2V2YWwuYwpAQCAtMSw3ICsxLDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTW9kdWxlIE5hbWU6IG5zZXZhbCAtIE9iamVjdCBldmFsdWF0aW9uIGludGVyZmFjZXMgLS0gaW5jbHVkZXMgY29udHJvbAotICogICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBsb29rdXAgYW5kIGV4ZWN1dGlvbi4KKyAqIE1vZHVsZSBOYW1lOiBuc2V2YWwgLSBPYmplY3QgZXZhbHVhdGlvbiwgaW5jbHVkZXMgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNTAsMTk2ICs0OSwxNCBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiBBQ1BJX01PRFVMRV9OQU1FKCJuc2V2YWwiKQogCi0vKiBMb2NhbCBwcm90b3R5cGVzICovCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZQogICoKLSAqIFBBUkFNRVRFUlM6ICBQYXRobmFtZSAgICAgICAgLSBOYW1lIG9mIG1ldGhvZCB0byBleGVjdXRlLCBJZiBOVUxMLCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgaXMgdGhlIG9iamVjdCB0byBleGVjdXRlCi0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgIC0gTWV0aG9kIGluZm8gYmxvY2ssIGNvbnRhaW5zOgotICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiAgSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCi0gKiAgICAgICAgICAgICAgICAgIFBhcmFtcyAgICAgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gIFBhcmFtcyBpdHNlbGYgbWF5IGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgaWYgbm8gcGFyYW1ldGVycyBhcmUgYmVpbmcgcGFzc2VkLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXZhbHVhdGUgdGhlIG9iamVjdCBvciBmaW5kIGFuZCBleGVjdXRlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kCi0gKgotICogTVVURVg6ICAgICAgIExvY2tzIE5hbWVzcGFjZQotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX3JlbGF0aXZlKGNoYXIgKnBhdGhuYW1lLCBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUgPSBOVUxMOwotCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc2NvcGVfaW5mbzsKLQljaGFyICppbnRlcm5hbF9wYXRoID0gTlVMTDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2V2YWx1YXRlX3JlbGF0aXZlIik7Ci0KLQkvKgotCSAqIE11c3QgaGF2ZSBhIHZhbGlkIG9iamVjdCBoYW5kbGUKLQkgKi8KLQlpZiAoIWluZm8gfHwgIWluZm8tPm5vZGUpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEJ1aWxkIGFuIGludGVybmFsIG5hbWUgc3RyaW5nIGZvciB0aGUgbWV0aG9kICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc2NvcGVfaW5mbyA9IGFjcGlfdXRfY3JlYXRlX2dlbmVyaWNfc3RhdGUoKTsKLQlpZiAoIXNjb3BlX2luZm8pIHsKLQkJZ290byBjbGVhbnVwMTsKLQl9Ci0KLQkvKiBHZXQgdGhlIHByZWZpeCBoYW5kbGUgYW5kIE5vZGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JaW5mby0+bm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGluZm8tPm5vZGUpOwotCWlmICghaW5mby0+bm9kZSkgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlICovCi0KLQlzY29wZV9pbmZvLT5zY29wZS5ub2RlID0gaW5mby0+bm9kZTsKLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cChzY29wZV9pbmZvLCBpbnRlcm5hbF9wYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJCUFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwKLQkJCQkmbm9kZSk7Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiT2JqZWN0IFslc10gbm90IGZvdW5kIFslc11cbiIsCi0JCQkJICBwYXRobmFtZSwgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpKTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qCi0JICogTm93IHRoYXQgd2UgaGF2ZSBhIGhhbmRsZSB0byB0aGUgb2JqZWN0LCB3ZSBjYW4gYXR0ZW1wdCB0byBldmFsdWF0ZSBpdC4KLQkgKi8KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLCAiJXMgWyVwXSBWYWx1ZSAlcFxuIiwKLQkJCSAgcGF0aG5hbWUsIG5vZGUsIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKSkpOwotCi0JaW5mby0+bm9kZSA9IG5vZGU7Ci0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9ieV9oYW5kbGUoaW5mbyk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJICAiKioqIENvbXBsZXRlZCBldmFsIG9mIG9iamVjdCAlcyAqKipcbiIsIHBhdGhuYW1lKSk7Ci0KLSAgICAgIGNsZWFudXA6Ci0JYWNwaV91dF9kZWxldGVfZ2VuZXJpY19zdGF0ZShzY29wZV9pbmZvKTsKLQotICAgICAgY2xlYW51cDE6Ci0JQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9wYXRoKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19ldmFsdWF0ZV9ieV9uYW1lCi0gKgotICogUEFSQU1FVEVSUzogIFBhdGhuYW1lICAgICAgICAtIEZ1bGx5IHF1YWxpZmllZCBwYXRobmFtZSB0byB0aGUgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgSW5mbyAgICAgICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgotICogICAgICAgICAgICAgICAgICBQYXJhbXMgICAgICAgICAgLSBMaXN0IG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgbWV0aG9kLAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBQYXJhbXMgaXRzZWxmIG1heSBiZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIGlmIG5vIHBhcmFtZXRlcnMgYXJlIGJlaW5nIHBhc3NlZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IEV2YWx1YXRlIHRoZSBvYmplY3Qgb3IgcmluZCBhbmQgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZAotICogICAgICAgICAgICAgIHBhc3NpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMKLSAqCi0gKiBNVVRFWDogICAgICAgTG9ja3MgTmFtZXNwYWNlCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXZhbHVhdGVfYnlfbmFtZShjaGFyICpwYXRobmFtZSwgc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCWNoYXIgKmludGVybmFsX3BhdGggPSBOVUxMOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXZhbHVhdGVfYnlfbmFtZSIpOwotCi0JLyogQnVpbGQgYW4gaW50ZXJuYWwgbmFtZSBzdHJpbmcgZm9yIHRoZSBtZXRob2QgKi8KLQotCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCS8qIExvb2t1cCB0aGUgbmFtZSBpbiB0aGUgbmFtZXNwYWNlICovCi0KLQlzdGF0dXMgPSBhY3BpX25zX2xvb2t1cChOVUxMLCBpbnRlcm5hbF9wYXRoLCBBQ1BJX1RZUEVfQU5ZLAotCQkJCUFDUElfSU1PREVfRVhFQ1VURSwgQUNQSV9OU19OT19VUFNFQVJDSCwgTlVMTCwKLQkJCQkmaW5mby0+bm9kZSk7Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAotCQkJCSAgIk9iamVjdCBhdCBbJXNdIHdhcyBub3QgZm91bmQsIHN0YXR1cz0lLjRYXG4iLAotCQkJCSAgcGF0aG5hbWUsIHN0YXR1cykpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyoKLQkgKiBOb3cgdGhhdCB3ZSBoYXZlIGEgaGFuZGxlIHRvIHRoZSBvYmplY3QsIHdlIGNhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0LgotCSAqLwotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLAotCQkJICBwYXRobmFtZSwgaW5mby0+bm9kZSwKLQkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPm5vZGUpKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZShpbmZvKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCi0JCQkgICIqKiogQ29tcGxldGVkIGV2YWwgb2Ygb2JqZWN0ICVzICoqKlxuIiwgcGF0aG5hbWUpKTsKLQotICAgICAgY2xlYW51cDoKLQotCS8qIENsZWFudXAgKi8KLQotCWlmIChpbnRlcm5hbF9wYXRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUoaW50ZXJuYWxfcGF0aCk7Ci0JfQotCi0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kL09iamVjdCBOb2RlIHRvIGV4ZWN1dGUKKyAqIFBBUkFNRVRFUlM6ICBJbmZvICAgICAgICAgICAgLSBFdmFsdWF0aW9uIGluZm8gYmxvY2ssIGNvbnRhaW5zOgorICogICAgICAgICAgICAgICAgICBwcmVmaXhfbm9kZSAgICAgLSBQcmVmaXggb3IgTWV0aG9kL09iamVjdCBOb2RlIHRvIGV4ZWN1dGUKKyAqICAgICAgICAgICAgICAgICAgUGF0aG5hbWUgICAgICAgIC0gTmFtZSBvZiBtZXRob2QgdG8gZXhlY3V0ZSwgSWYgTlVMTCwgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgaXMgdGhlIG9iamVjdCB0byBleGVjdXRlCiAgKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCkBAIC0yNDgsMjkgKzY1LDIxIEBACiAgKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcl90eXBlICAtIFR5cGUgb2YgUGFyYW1ldGVyIGxpc3QKICAqICAgICAgICAgICAgICAgICAgcmV0dXJuX29iamVjdCAgIC0gV2hlcmUgdG8gcHV0IG1ldGhvZCdzIHJldHVybiB2YWx1ZSAoaWYKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW55KS4gSWYgTlVMTCwgbm8gdmFsdWUgaXMgcmV0dXJuZWQuCisgKiAgICAgICAgICAgICAgICAgIEZsYWdzICAgICAgICAgICAtIEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRSB0byBkZWxldGUgcmV0dXJuCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBFdmFsdWF0ZSBvYmplY3Qgb3IgZXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZQotICogICAgICAgICAgICAgIGdpdmVuIHBhcmFtZXRlcnMKKyAqIERFU0NSSVBUSU9OOiBFeGVjdXRlIGEgY29udHJvbCBtZXRob2Qgb3IgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuCisgKiAgICAgICAgICAgICAgQUNQSSBuYW1lc3BhY2Ugb2JqZWN0LgogICoKLSAqIE1VVEVYOiAgICAgICBMb2NrcyBOYW1lc3BhY2UKKyAqIE1VVEVYOiAgICAgICBMb2NrcyBpbnRlcnByZXRlcgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWFjcGlfc3RhdHVzIGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQorYWNwaV9zdGF0dXMgYWNwaV9uc19ldmFsdWF0ZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2V2YWx1YXRlX2J5X2hhbmRsZSIpOwotCi0JLyogQ2hlY2sgaWYgbmFtZXNwYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkICovCi0KLQlpZiAoIWFjcGlfZ2JsX3Jvb3Rfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTkFNRVNQQUNFKTsKLQl9Ci0KLQkvKiBQYXJhbWV0ZXIgVmFsaWRhdGlvbiAqLworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZXZhbHVhdGUpOwogCiAJaWYgKCFpbmZvKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKQEAgLTI4MCwyMDIgKzg5LDEyMCBAQAogCiAJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CiAKLQkvKiBHZXQgdGhlIHByZWZpeCBoYW5kbGUgYW5kIE5vZGUgKi8KLQotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9OQU1FU1BBQ0UpOworCS8qCisJICogR2V0IHRoZSBhY3R1YWwgbmFtZXNwYWNlIG5vZGUgZm9yIHRoZSB0YXJnZXQgb2JqZWN0LiBIYW5kbGVzIHRoZXNlIGNhc2VzOgorCSAqCisJICogMSkgTnVsbCBub2RlLCBQYXRobmFtZSAoYWJzb2x1dGUgcGF0aCkKKwkgKiAyKSBOb2RlLCBQYXRobmFtZSAocGF0aCByZWxhdGl2ZSB0byBOb2RlKQorCSAqIDMpIE5vZGUsIE51bGwgUGF0aG5hbWUKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX25zX2dldF9ub2RlKGluZm8tPnByZWZpeF9ub2RlLCBpbmZvLT5wYXRobmFtZSwKKwkJCQkgIEFDUElfTlNfTk9fVVBTRUFSQ0gsICZpbmZvLT5yZXNvbHZlZF9ub2RlKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JaW5mby0+bm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGluZm8tPm5vZGUpOwotCWlmICghaW5mby0+bm9kZSkgewotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQogCS8qCiAJICogRm9yIGEgbWV0aG9kIGFsaWFzLCB3ZSBtdXN0IGdyYWIgdGhlIGFjdHVhbCBtZXRob2Qgbm9kZSBzbyB0aGF0IHByb3BlcgogCSAqIHNjb3BpbmcgY29udGV4dCB3aWxsIGJlIGVzdGFibGlzaGVkIGJlZm9yZSBleGVjdXRpb24uCiAJICovCi0JaWYgKGFjcGlfbnNfZ2V0X3R5cGUoaW5mby0+bm9kZSkgPT0gQUNQSV9UWVBFX0xPQ0FMX01FVEhPRF9BTElBUykgewotCQlpbmZvLT5ub2RlID0KKwlpZiAoYWNwaV9uc19nZXRfdHlwZShpbmZvLT5yZXNvbHZlZF9ub2RlKSA9PQorCSAgICBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7CisJCWluZm8tPnJlc29sdmVkX25vZGUgPQogCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkgIGluZm8tPm5vZGUtPm9iamVjdCk7CisJCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlLT5vYmplY3QpOwogCX0KIAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsICIlcyBbJXBdIFZhbHVlICVwXG4iLCBpbmZvLT5wYXRobmFtZSwKKwkJCSAgaW5mby0+cmVzb2x2ZWRfbm9kZSwKKwkJCSAgYWNwaV9uc19nZXRfYXR0YWNoZWRfb2JqZWN0KGluZm8tPnJlc29sdmVkX25vZGUpKSk7CisKIAkvKgogCSAqIFR3byBtYWpvciBjYXNlcyBoZXJlOgotCSAqIDEpIFRoZSBvYmplY3QgaXMgYW4gYWN0dWFsIGNvbnRyb2wgbWV0aG9kIC0tIGV4ZWN1dGUgaXQuCi0JICogMikgVGhlIG9iamVjdCBpcyBub3QgYSBtZXRob2QgLS0ganVzdCByZXR1cm4gaXQncyBjdXJyZW50IHZhbHVlCiAJICoKLQkgKiBJbiBib3RoIGNhc2VzLCB0aGUgbmFtZXNwYWNlIGlzIHVubG9ja2VkIGJ5IHRoZSBhY3BpX25zKiBwcm9jZWR1cmUKKwkgKiAxKSBUaGUgb2JqZWN0IGlzIGEgY29udHJvbCBtZXRob2QgLS0gZXhlY3V0ZSBpdAorCSAqIDIpIFRoZSBvYmplY3QgaXMgbm90IGEgbWV0aG9kIC0tIGp1c3QgcmV0dXJuIGl0J3MgY3VycmVudCB2YWx1ZQogCSAqLwotCWlmIChhY3BpX25zX2dldF90eXBlKGluZm8tPm5vZGUpID09IEFDUElfVFlQRV9NRVRIT0QpIHsKKwlpZiAoYWNwaV9uc19nZXRfdHlwZShpbmZvLT5yZXNvbHZlZF9ub2RlKSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSB7CiAJCS8qCi0JCSAqIENhc2UgMSkgV2UgaGF2ZSBhbiBhY3R1YWwgY29udHJvbCBtZXRob2QgdG8gZXhlY3V0ZQorCQkgKiAxKSBPYmplY3QgaXMgYSBjb250cm9sIG1ldGhvZCAtIGV4ZWN1dGUgaXQKIAkJICovCi0JCXN0YXR1cyA9IGFjcGlfbnNfZXhlY3V0ZV9jb250cm9sX21ldGhvZChpbmZvKTsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhIG1ldGhvZCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbm9kZSAqLworCisJCWluZm8tPm9ial9kZXNjID0KKwkJICAgIGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChpbmZvLT5yZXNvbHZlZF9ub2RlKTsKKwkJaWYgKCFpbmZvLT5vYmpfZGVzYykgeworCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKKwkJCQkgICAgIkNvbnRyb2wgbWV0aG9kIGhhcyBubyBhdHRhY2hlZCBzdWItb2JqZWN0IikpOworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKKwkJfQorCisJCUFDUElfRFVNUF9QQVRITkFNRShpbmZvLT5yZXNvbHZlZF9ub2RlLCAiRXhlY3V0ZSBNZXRob2Q6IiwKKwkJCQkgICBBQ1BJX0xWX0lORk8sIF9DT01QT05FTlQpOworCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKKwkJCQkgICJNZXRob2QgYXQgQU1MIGFkZHJlc3MgJXAgTGVuZ3RoICVYXG4iLAorCQkJCSAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgKyAxLAorCQkJCSAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoIC0gMSkpOworCisJCS8qCisJCSAqIEFueSBuYW1lc3BhY2UgZGVsZXRpb24gbXVzdCBhY3F1aXJlIGJvdGggdGhlIG5hbWVzcGFjZSBhbmQKKwkJICogaW50ZXJwcmV0ZXIgbG9ja3MgdG8gZW5zdXJlIHRoYXQgbm8gdGhyZWFkIGlzIHVzaW5nIHRoZSBwb3J0aW9uIG9mCisJCSAqIHRoZSBuYW1lc3BhY2UgdGhhdCBpcyBiZWluZyBkZWxldGVkLgorCQkgKgorCQkgKiBFeGVjdXRlIHRoZSBtZXRob2QgdmlhIHRoZSBpbnRlcnByZXRlci4gVGhlIGludGVycHJldGVyIGlzIGxvY2tlZAorCQkgKiBoZXJlIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIEFNTCBwYXJzZXIKKwkJICovCisJCXN0YXR1cyA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QoaW5mbyk7CisJCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwogCX0gZWxzZSB7CiAJCS8qCi0JCSAqIENhc2UgMikgT2JqZWN0IGlzIE5PVCBhIG1ldGhvZCwganVzdCByZXR1cm4gaXRzIGN1cnJlbnQgdmFsdWUKKwkJICogMikgT2JqZWN0IGlzIG5vdCBhIG1ldGhvZCwgcmV0dXJuIGl0cyBjdXJyZW50IHZhbHVlCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUoaW5mbyk7Ci0JfQogCi0JLyoKLQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIHJldHVybiB2YWx1ZSBvbiB0aGUgc3RhY2sgdGhhdCBtdXN0IGJlIGRlYWx0IHdpdGgKLQkgKi8KLQlpZiAoc3RhdHVzID09IEFFX0NUUkxfUkVUVVJOX1ZBTFVFKSB7Ci0JCS8qIE1hcCBBRV9DVFJMX1JFVFVSTl9WQUxVRSB0byBBRV9PSywgd2UgYXJlIGRvbmUgd2l0aCBpdCAqLworCQkvKgorCQkgKiBPYmplY3RzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvbHV0aW9uIHN0ZXBzIChlLmcuLCB0aGUgTm9kZSBtYXkgYmUKKwkJICogYSBmaWVsZCB0aGF0IG11c3QgYmUgcmVhZCwgZXRjLikgLS0gd2UgY2FuJ3QganVzdCBncmFiIHRoZSBvYmplY3QKKwkJICogb3V0IG9mIHRoZSBub2RlLgorCQkgKgorCQkgKiBVc2UgcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCkgdG8gZ2V0IHRoZSBhc3NvY2lhdGVkIHZhbHVlLgorCQkgKgorCQkgKiBOT1RFOiB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBwYXNzaW5nIGluIE5VTEwgZm9yIGEgd2FsayBzdGF0ZSBiZWNhdXNlCisJCSAqIHJlc29sdmVkX25vZGUgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgYSByZWZlcmVuY2UgdG8gZWl0aGVyIGEgbWV0aG9kCisJCSAqIGxvY2FsIG9yIGEgbWV0aG9kIGFyZ3VtZW50IChiZWNhdXNlIHRoaXMgaW50ZXJmYWNlIGlzIG5ldmVyIGNhbGxlZAorCQkgKiBmcm9tIGEgcnVubmluZyBtZXRob2QuKQorCQkgKgorCQkgKiBFdmVuIHRob3VnaCB3ZSBkbyBub3QgZGlyZWN0bHkgaW52b2tlIHRoZSBpbnRlcnByZXRlciBmb3Igb2JqZWN0CisJCSAqIHJlc29sdXRpb24sIHdlIG11c3QgbG9jayBpdCBiZWNhdXNlIHdlIGNvdWxkIGFjY2VzcyBhbiBvcHJlZ2lvbi4KKwkJICogVGhlIG9wcmVnaW9uIGFjY2VzcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgbG9ja2VkLgorCQkgKi8KKwkJc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOworCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQl9CiAKLQkJc3RhdHVzID0gQUVfT0s7Ci0JfQorCQkvKiBGdW5jdGlvbiBoYXMgYSBzdHJhbmdlIGludGVyZmFjZSAqLwogCi0JLyoKLQkgKiBOYW1lc3BhY2Ugd2FzIHVubG9ja2VkIGJ5IHRoZSBoYW5kbGluZyBhY3BpX25zKiBmdW5jdGlvbiwgc28gd2UKLQkgKiBqdXN0IHJldHVybgotCSAqLwotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotfQorCQlzdGF0dXMgPQorCQkgICAgYWNwaV9leF9yZXNvbHZlX25vZGVfdG9fdmFsdWUoJmluZm8tPnJlc29sdmVkX25vZGUsIE5VTEwpOworCQlhY3BpX2V4X2V4aXRfaW50ZXJwcmV0ZXIoKTsKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gTWV0aG9kIE5vZGUgdG8gZXhlY3V0ZQotICogICAgICAgICAgICAgICAgICBvYmpfZGVzYyAgICAgICAgLSBNZXRob2Qgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnMgICAgICAtIExpc3Qgb2YgcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtZXRob2QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0ZWQgYnkgTlVMTC4gUGFyYW1zIGl0c2VsZiBtYXkgYmUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBubyBwYXJhbWV0ZXJzIGFyZSBiZWluZyBwYXNzZWQuCi0gKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgotICogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJfdHlwZSAgLSBUeXBlIG9mIFBhcmFtZXRlciBsaXN0Ci0gKiAgICAgICAgICAgICAgICAgIHJldHVybl9vYmplY3QgICAtIFdoZXJlIHRvIHB1dCBtZXRob2QncyByZXR1cm4gdmFsdWUgKGlmCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueSkuIElmIE5VTEwsIG5vIHZhbHVlIGlzIHJldHVybmVkLgotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogRXhlY3V0ZSB0aGUgcmVxdWVzdGVkIG1ldGhvZCBwYXNzaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCi0gKgotICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIGxvY2tlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cwotYWNwaV9uc19leGVjdXRlX2NvbnRyb2xfbWV0aG9kKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQotewotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2V4ZWN1dGVfY29udHJvbF9tZXRob2QiKTsKLQotCS8qIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgbWV0aG9kIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdCAqLwotCi0JaW5mby0+b2JqX2Rlc2MgPSBhY3BpX25zX2dldF9hdHRhY2hlZF9vYmplY3QoaW5mby0+bm9kZSk7Ci0JaWYgKCFpbmZvLT5vYmpfZGVzYykgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTm8gYXR0YWNoZWQgbWV0aG9kIG9iamVjdCIpKTsKLQotCQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfT0JKRUNUKTsKLQl9Ci0KLQlBQ1BJX0RVTVBfUEFUSE5BTUUoaW5mby0+bm9kZSwgIkV4ZWN1dGUgTWV0aG9kOiIsCi0JCQkgICBBQ1BJX0xWX0lORk8sIF9DT01QT05FTlQpOwotCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FWEVDLCAiTWV0aG9kIGF0IEFNTCBhZGRyZXNzICVwIExlbmd0aCAlWFxuIiwKLQkJCSAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfc3RhcnQgKyAxLAotCQkJICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9sZW5ndGggLSAxKSk7Ci0KLQkvKgotCSAqIFVubG9jayB0aGUgbmFtZXNwYWNlIGJlZm9yZSBleGVjdXRpb24uICBUaGlzIGFsbG93cyBuYW1lc3BhY2UgYWNjZXNzCi0JICogdmlhIHRoZSBleHRlcm5hbCBBY3BpKiBpbnRlcmZhY2VzIHdoaWxlIGEgbWV0aG9kIGlzIGJlaW5nIGV4ZWN1dGVkLgotCSAqIEhvd2V2ZXIsIGFueSBuYW1lc3BhY2UgZGVsZXRpb24gbXVzdCBhY3F1aXJlIGJvdGggdGhlIG5hbWVzcGFjZSBhbmQKLQkgKiBpbnRlcnByZXRlciBsb2NrcyB0byBlbnN1cmUgdGhhdCBubyB0aHJlYWQgaXMgdXNpbmcgdGhlIHBvcnRpb24gb2YgdGhlCi0JICogbmFtZXNwYWNlIHRoYXQgaXMgYmVpbmcgZGVsZXRlZC4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBFeGVjdXRlIHRoZSBtZXRob2QgdmlhIHRoZSBpbnRlcnByZXRlci4gIFRoZSBpbnRlcnByZXRlciBpcyBsb2NrZWQKLQkgKiBoZXJlIGJlZm9yZSBjYWxsaW5nIGludG8gdGhlIEFNTCBwYXJzZXIKLQkgKi8KLQlzdGF0dXMgPSBhY3BpX2V4X2VudGVyX2ludGVycHJldGVyKCk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9tZXRob2QoaW5mbyk7Ci0JYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7Ci0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV9uc19nZXRfb2JqZWN0X3ZhbHVlCi0gKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIE1ldGhvZCBpbmZvIGJsb2NrLCBjb250YWluczoKLSAqICAgICAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gT2JqZWN0J3MgTlMgbm9kZQotICogICAgICAgICAgICAgICAgICByZXR1cm5fb2JqZWN0ICAgLSBXaGVyZSB0byBwdXQgb2JqZWN0IHZhbHVlIChpZgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkpLiBJZiBOVUxMLCBubyB2YWx1ZSBpcyByZXR1cm5lZC4KLSAqCi0gKiBSRVRVUk46ICAgICAgU3RhdHVzCi0gKgotICogREVTQ1JJUFRJT046IFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgb2JqZWN0Ci0gKgotICogTVVURVg6ICAgICAgIEFzc3VtZXMgbmFtZXNwYWNlIGlzIGxvY2tlZCwgbGVhdmVzIG5hbWVzcGFjZSB1bmxvY2tlZAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX25zX2dldF9vYmplY3RfdmFsdWUoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCi17Ci0JYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlc29sdmVkX25vZGUgPSBpbmZvLT5ub2RlOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZ2V0X29iamVjdF92YWx1ZSIpOwotCi0JLyoKLQkgKiBPYmplY3RzIHJlcXVpcmUgYWRkaXRpb25hbCByZXNvbHV0aW9uIHN0ZXBzIChlLmcuLCB0aGUgTm9kZSBtYXkgYmUgYQotCSAqIGZpZWxkIHRoYXQgbXVzdCBiZSByZWFkLCBldGMuKSAtLSB3ZSBjYW4ndCBqdXN0IGdyYWIgdGhlIG9iamVjdCBvdXQgb2YKLQkgKiB0aGUgbm9kZS4KLQkgKi8KLQotCS8qCi0JICogVXNlIHJlc29sdmVfbm9kZV90b192YWx1ZSgpIHRvIGdldCB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4gVGhpcyBjYWxsIGFsd2F5cwotCSAqIGRlbGV0ZXMgb2JqX2Rlc2MgKGFsbG9jYXRlZCBhYm92ZSkuCi0JICoKLQkgKiBOT1RFOiB3ZSBjYW4gZ2V0IGF3YXkgd2l0aCBwYXNzaW5nIGluIE5VTEwgZm9yIGEgd2FsayBzdGF0ZSBiZWNhdXNlCi0JICogb2JqX2Rlc2MgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgYSByZWZlcmVuY2UgdG8gZWl0aGVyIGEgbWV0aG9kIGxvY2FsIG9yCi0JICogYSBtZXRob2QgYXJndW1lbnQgKGJlY2F1c2UgdGhpcyBpbnRlcmZhY2UgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlCi0JICogYWNwaV9ldmFsdWF0ZSBleHRlcm5hbCBpbnRlcmZhY2UsIG5ldmVyIGNhbGxlZCBmcm9tIGEgcnVubmluZyBtZXRob2QuKQotCSAqCi0JICogRXZlbiB0aG91Z2ggd2UgZG8gbm90IGRpcmVjdGx5IGludm9rZSB0aGUgaW50ZXJwcmV0ZXIgZm9yIHRoaXMsIHdlIG11c3QKLQkgKiBlbnRlciBpdCBiZWNhdXNlIHdlIGNvdWxkIGFjY2VzcyBhbiBvcHJlZ2lvbi4gVGhlIG9wcmVnaW9uIGFjY2VzcyBjb2RlCi0JICogYXNzdW1lcyB0aGF0IHRoZSBpbnRlcnByZXRlciBpcyBsb2NrZWQuCi0JICoKLQkgKiBXZSBtdXN0IHJlbGVhc2UgdGhlIG5hbWVzcGFjZSBsb2NrIGJlZm9yZSBlbnRlcmluZyB0aGUgaW50ZXByZXRlci4KLQkgKi8KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV9leF9lbnRlcl9pbnRlcnByZXRlcigpOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQlzdGF0dXMgPSBhY3BpX2V4X3Jlc29sdmVfbm9kZV90b192YWx1ZSgmcmVzb2x2ZWRfbm9kZSwgTlVMTCk7CiAJCS8qCiAJCSAqIElmIGFjcGlfZXhfcmVzb2x2ZV9ub2RlX3RvX3ZhbHVlKCkgc3VjY2VlZGVkLCB0aGUgcmV0dXJuIHZhbHVlIHdhcyBwbGFjZWQKIAkJICogaW4gcmVzb2x2ZWRfbm9kZS4KIAkJICovCi0JCWFjcGlfZXhfZXhpdF9pbnRlcnByZXRlcigpOwotCiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogCQkJc3RhdHVzID0gQUVfQ1RSTF9SRVRVUk5fVkFMVUU7Ci0JCQlpbmZvLT5yZXR1cm5fb2JqZWN0ID0gQUNQSV9DQVNUX1BUUgotCQkJICAgICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0LCByZXNvbHZlZF9ub2RlKTsKKwkJCWluZm8tPnJldHVybl9vYmplY3QgPQorCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCwKKwkJCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlKTsKKwogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKIAkJCQkJICAiUmV0dXJuaW5nIG9iamVjdCAlcCBbJXNdXG4iLAogCQkJCQkgIGluZm8tPnJldHVybl9vYmplY3QsCkBAIC00ODQsNyArMjExLDMwIEBACiAJCX0KIAl9CiAKLQkvKiBOYW1lc3BhY2UgaXMgdW5sb2NrZWQgKi8KKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGEgcmV0dXJuIHZhbHVlIHRoYXQgbXVzdCBiZSBkZWFsdCB3aXRoCisJICovCisJaWYgKHN0YXR1cyA9PSBBRV9DVFJMX1JFVFVSTl9WQUxVRSkgewogCisJCS8qIElmIGNhbGxlciBkb2VzIG5vdCB3YW50IHRoZSByZXR1cm4gdmFsdWUsIGRlbGV0ZSBpdCAqLworCisJCWlmIChpbmZvLT5mbGFncyAmIEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRSkgeworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CisJCX0KKworCQkvKiBNYXAgQUVfQ1RSTF9SRVRVUk5fVkFMVUUgdG8gQUVfT0ssIHdlIGFyZSBkb25lIHdpdGggaXQgKi8KKworCQlzdGF0dXMgPSBBRV9PSzsKKwl9CisKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAorCQkJICAiKioqIENvbXBsZXRlZCBldmFsdWF0aW9uIG9mIG9iamVjdCAlcyAqKipcbiIsCisJCQkgIGluZm8tPnBhdGhuYW1lKSk7CisKKwkvKgorCSAqIE5hbWVzcGFjZSB3YXMgdW5sb2NrZWQgYnkgdGhlIGhhbmRsaW5nIGFjcGlfbnMqIGZ1bmN0aW9uLCBzbyB3ZQorCSAqIGp1c3QgcmV0dXJuCisJICovCiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2luaXQuYwppbmRleCA5ZjkyOWU0Li5hZWM4NDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zaW5pdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNpbml0LmMKQEAgLTU4LDYgKzU4LDEwIEBACiBhY3BpX25zX2luaXRfb25lX2RldmljZShhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAogCQkJdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpOwogCitzdGF0aWMgYWNwaV9zdGF0dXMKK2FjcGlfbnNfZmluZF9pbmlfbWV0aG9kcyhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAorCQkJIHUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKTsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9uc19pbml0aWFsaXplX29iamVjdHMKQEAgLTc2LDcgKzgwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfaW5pdF93YWxrX2luZm8gaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRpYWxpemVfb2JqZWN0cyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5pdGlhbGl6ZV9vYmplY3RzKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRElTUEFUQ0gsCiAJCQkgICIqKioqIFN0YXJ0aW5nIGluaXRpYWxpemF0aW9uIG9mIG5hbWVzcGFjZSBvYmplY3RzICoqKipcbiIpKTsKQEAgLTkzLDcgKzk3LDcgQEAKIAkJCQkgICAgIEFDUElfVUlOVDMyX01BWCwgYWNwaV9uc19pbml0X29uZV9vYmplY3QsCiAJCQkJICAgICAmaW5mbywgTlVMTCk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgd2Fsa19uYW1lc3BhY2UiKSk7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgV2Fsa05hbWVzcGFjZSIpKTsKIAl9CiAKIAlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULApAQCAtMTMzLDcgKzEzNyw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRpYWxpemVfZGV2aWNlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5pdGlhbGl6ZV9kZXZpY2VzKTsKIAogCS8qIEluaXQgY291bnRlcnMgKi8KIApAQCAtMTQyLDMwICsxNDYsNDYgQEAKIAlpbmZvLm51bV9JTkkgPSAwOwogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKLQkJCSAgICAgICJFeGVjdXRpbmcgYWxsIERldmljZSBfU1RBIGFuZF9JTkkgbWV0aG9kczoiKSk7CisJCQkgICAgICAiSW5pdGlhbGl6aW5nIERldmljZS9Qcm9jZXNzb3IvVGhlcm1hbCBvYmplY3RzIGJ5IGV4ZWN1dGluZyBfSU5JIG1ldGhvZHM6IikpOwogCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFdhbGsgbmFtZXNwYWNlIGZvciBhbGwgb2JqZWN0cyAqLworCS8qIFRyZWUgYW5hbHlzaXM6IGZpbmQgYWxsIHN1YnRyZWVzIHRoYXQgY29udGFpbiBfSU5JIG1ldGhvZHMgKi8KIAogCXN0YXR1cyA9IGFjcGlfbnNfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX0FOWSwgQUNQSV9ST09UX09CSkVDVCwKLQkJCQkJQUNQSV9VSU5UMzJfTUFYLCBUUlVFLAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEZBTFNFLAorCQkJCQlhY3BpX25zX2ZpbmRfaW5pX21ldGhvZHMsICZpbmZvLCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvLmV2YWx1YXRlX2luZm8gPQorCSAgICBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbykpOworCWlmICghaW5mby5ldmFsdWF0ZV9pbmZvKSB7CisJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJZ290byBlcnJvcl9leGl0OworCX0KKworCS8qIFdhbGsgbmFtZXNwYWNlIHRvIGV4ZWN1dGUgYWxsIF9JTklzIG9uIHByZXNlbnQgZGV2aWNlcyAqLworCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfQU5ZLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEZBTFNFLAogCQkJCQlhY3BpX25zX2luaXRfb25lX2RldmljZSwgJmluZm8sIE5VTEwpOwogCi0JKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7Ci0KKwlBQ1BJX0ZSRUUoaW5mby5ldmFsdWF0ZV9pbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywgIkR1cmluZyB3YWxrX25hbWVzcGFjZSIpKTsKKwkJZ290byBlcnJvcl9leGl0OwogCX0KIAogCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsCi0JCQkgICAgICAiXG4laGQgRGV2aWNlcyBmb3VuZCAtIGV4ZWN1dGVkICVoZCBfU1RBLCAlaGQgX0lOSSBtZXRob2RzXG4iLAotCQkJICAgICAgaW5mby5kZXZpY2VfY291bnQsIGluZm8ubnVtX1NUQSwgaW5mby5udW1fSU5JKSk7CisJCQkgICAgICAiXG5FeGVjdXRlZCAlaGQgX0lOSSBtZXRob2RzIHJlcXVpcmluZyAlaGQgX1NUQSBleGVjdXRpb25zIChleGFtaW5lZCAlaGQgb2JqZWN0cylcbiIsCisJCQkgICAgICBpbmZvLm51bV9JTkksIGluZm8ubnVtX1NUQSwgaW5mby5kZXZpY2VfY291bnQpKTsKIAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCisgICAgICBlcnJvcl9leGl0OgorCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJEdXJpbmcgZGV2aWNlIGluaXRpYWxpemF0aW9uIikpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjAwLDcgKzIyMCw3IEBACiAJICAgIChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKW9ial9oYW5kbGU7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoIm5zX2luaXRfb25lX29iamVjdCIpOworCUFDUElfRlVOQ1RJT05fTkFNRShuc19pbml0X29uZV9vYmplY3QpOwogCiAJaW5mby0+b2JqZWN0X2NvdW50Kys7CiAKQEAgLTMxMSw2ICszMzEsNzIgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19maW5kX2luaV9tZXRob2RzCisgKgorICogUEFSQU1FVEVSUzogIGFjcGlfd2Fsa19jYWxsYmFjaworICoKKyAqIFJFVFVSTjogICAgICBhY3BpX3N0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBDYWxsZWQgZHVyaW5nIG5hbWVzcGFjZSB3YWxrLiBGaW5kcyBvYmplY3RzIG5hbWVkIF9JTkkgdW5kZXIKKyAqICAgICAgICAgICAgICBkZXZpY2UvcHJvY2Vzc29yL3RoZXJtYWwgb2JqZWN0cywgYW5kIG1hcmtzIHRoZSBlbnRpcmUgc3VidHJlZQorICogICAgICAgICAgICAgIHdpdGggYSBTVUJUUkVFX0hBU19JTkkgZmxhZy4gVGhpcyBmbGFnIGlzIHVzZWQgZHVyaW5nIHRoZQorICogICAgICAgICAgICAgIHN1YnNlcXVlbnQgZGV2aWNlIGluaXRpYWxpemF0aW9uIHdhbGsgdG8gYXZvaWQgZW50aXJlIHN1YnRyZWVzCisgKiAgICAgICAgICAgICAgdGhhdCBkbyBub3QgY29udGFpbiBhbiBfSU5JLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9uc19maW5kX2luaV9tZXRob2RzKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsCisJCQkgdTMyIG5lc3RpbmdfbGV2ZWwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXR1cm5fdmFsdWUpCit7CisJc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAqaW5mbyA9CisJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbywgY29udGV4dCk7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOworCisJLyogS2VlcCBjb3VudCBvZiBkZXZpY2UvcHJvY2Vzc29yL3RoZXJtYWwgb2JqZWN0cyAqLworCisJbm9kZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUsIG9ial9oYW5kbGUpOworCWlmICgobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfREVWSUNFKSB8fAorCSAgICAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSB8fAorCSAgICAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfVEhFUk1BTCkpIHsKKwkJaW5mby0+ZGV2aWNlX2NvdW50Kys7CisJCXJldHVybiAoQUVfT0spOworCX0KKworCS8qIFdlIGFyZSBvbmx5IGxvb2tpbmcgZm9yIG1ldGhvZHMgbmFtZWQgX0lOSSAqLworCisJaWYgKCFBQ1BJX0NPTVBBUkVfTkFNRShub2RlLT5uYW1lLmFzY2lpLCBNRVRIT0RfTkFNRV9fSU5JKSkgeworCQlyZXR1cm4gKEFFX09LKTsKKwl9CisKKwkvKgorCSAqIFRoZSBvbmx5IF9JTkkgbWV0aG9kcyB0aGF0IHdlIGNhcmUgYWJvdXQgYXJlIHRob3NlIHRoYXQgYXJlCisJICogcHJlc2VudCB1bmRlciBEZXZpY2UsIFByb2Nlc3NvciwgYW5kIFRoZXJtYWwgb2JqZWN0cy4KKwkgKi8KKwlwYXJlbnRfbm9kZSA9IGFjcGlfbnNfZ2V0X3BhcmVudF9ub2RlKG5vZGUpOworCXN3aXRjaCAocGFyZW50X25vZGUtPnR5cGUpIHsKKwljYXNlIEFDUElfVFlQRV9ERVZJQ0U6CisJY2FzZSBBQ1BJX1RZUEVfUFJPQ0VTU09SOgorCWNhc2UgQUNQSV9UWVBFX1RIRVJNQUw6CisKKwkJLyogTWFyayBwYXJlbnQgYW5kIGJ1YmJsZSB1cCB0aGUgSU5JIHByZXNlbnQgZmxhZyB0byB0aGUgcm9vdCAqLworCisJCXdoaWxlIChwYXJlbnRfbm9kZSkgeworCQkJcGFyZW50X25vZGUtPmZsYWdzIHw9IEFOT0JKX1NVQlRSRUVfSEFTX0lOSTsKKwkJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChBRV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfbnNfaW5pdF9vbmVfZGV2aWNlCiAgKgogICogUEFSQU1FVEVSUzogIGFjcGlfd2Fsa19jYWxsYmFjawpAQCAtMzI3LDExOSArNDEzLDE2NSBAQAogYWNwaV9uc19pbml0X29uZV9kZXZpY2UoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKIAkJCXUzMiBuZXN0aW5nX2xldmVsLCB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQogewotCXN0cnVjdCBhY3BpX2RldmljZV93YWxrX2luZm8gKmluZm8gPQotCSAgICAoc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAqKWNvbnRleHQ7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gcGluZm87CisJc3RydWN0IGFjcGlfZGV2aWNlX3dhbGtfaW5mbyAqd2Fsa19pbmZvID0KKwkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvLCBjb250ZXh0KTsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvID0gd2Fsa19pbmZvLT5ldmFsdWF0ZV9pbmZvOwogCXUzMiBmbGFnczsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmluaV9ub2RlOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpkZXZpY2Vfbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2luaXRfb25lX2RldmljZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfaW5pdF9vbmVfZGV2aWNlKTsKIAotCWRldmljZV9ub2RlID0gYWNwaV9uc19tYXBfaGFuZGxlX3RvX25vZGUob2JqX2hhbmRsZSk7Ci0JaWYgKCFkZXZpY2Vfbm9kZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQorCS8qIFdlIGFyZSBpbnRlcmVzdGVkIGluIERldmljZXMsIFByb2Nlc3NvcnMgYW5kIHRoZXJtYWxfem9uZXMgb25seSAqLwogCi0JLyoKLQkgKiBXZSB3aWxsIHJ1biBfU1RBL19JTkkgb24gRGV2aWNlcywgUHJvY2Vzc29ycyBhbmQgdGhlcm1hbF96b25lcyBvbmx5Ci0JICovCisJZGV2aWNlX25vZGUgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBvYmpfaGFuZGxlKTsKIAlpZiAoKGRldmljZV9ub2RlLT50eXBlICE9IEFDUElfVFlQRV9ERVZJQ0UpICYmCiAJICAgIChkZXZpY2Vfbm9kZS0+dHlwZSAhPSBBQ1BJX1RZUEVfUFJPQ0VTU09SKSAmJgogCSAgICAoZGV2aWNlX25vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX1RIRVJNQUwpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAJfQogCi0JaWYgKChhY3BpX2RiZ19sZXZlbCA8PSBBQ1BJX0xWX0FMTF9FWENFUFRJT05TKSAmJgotCSAgICAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5GTykpKSB7Ci0JCUFDUElfREVCVUdfUFJJTlRfUkFXKChBQ1BJX0RCX0lOSVQsICIuIikpOwotCX0KLQotCWluZm8tPmRldmljZV9jb3VudCsrOwotCiAJLyoKLQkgKiBDaGVjayBpZiB0aGUgX0lOSSBtZXRob2QgZXhpc3RzIGZvciB0aGlzIGRldmljZSAtCi0JICogaWYgX0lOSSBkb2VzIG5vdCBleGlzdCwgdGhlcmUgaXMgbm8gbmVlZCB0byBydW4gX1NUQQotCSAqIE5vIF9JTkkgbWVhbnMgZGV2aWNlIHJlcXVpcmVzIG5vIGluaXRpYWxpemF0aW9uCisJICogQmVjYXVzZSBvZiBhbiBlYXJsaWVyIG5hbWVzcGFjZSBhbmFseXNpcywgYWxsIHN1YnRyZWVzIHRoYXQgY29udGFpbiBhbgorCSAqIF9JTkkgbWV0aG9kIGFyZSB0YWdnZWQuCisJICoKKwkgKiBJZiB0aGlzIGRldmljZSBzdWJ0cmVlIGRvZXMgbm90IGNvbnRhaW4gYW55IF9JTkkgbWV0aG9kcywgd2UKKwkgKiBjYW4gZXhpdCBub3cgYW5kIHN0b3AgdHJhdmVyc2luZyB0aGlzIGVudGlyZSBzdWJ0cmVlLgogCSAqLwotCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX25vZGUoKkFDUElfQ0FTVF9QVFIodTMyLCBNRVRIT0RfTkFNRV9fSU5JKSwKLQkJCQkgICAgIGRldmljZV9ub2RlLCBBQ1BJX1RZUEVfTUVUSE9ELCAmaW5pX25vZGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkvKiBObyBfSU5JIG1ldGhvZCBmb3VuZCAtIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCS8qCi0JICogUnVuIF9TVEEgdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBydW4gX0lOSSBvbiB0aGUgZGV2aWNlIC0KLQkgKiB0aGUgZGV2aWNlIG11c3QgYmUgcHJlc2VudCBiZWZvcmUgX0lOSSBjYW4gYmUgcnVuLgotCSAqIEhvd2V2ZXIsIF9TVEEgaXMgbm90IHJlcXVpcmVkIC0gYXNzdW1lIGRldmljZSBwcmVzZW50IGlmIG5vIF9TVEEKLQkgKi8KLQlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUoQUNQSV9UWVBFX01FVEhPRCwKLQkJCQkJCSAgICAgIGRldmljZV9ub2RlLAotCQkJCQkJICAgICAgTUVUSE9EX05BTUVfX1NUQSkpOwotCi0JcGluZm8ubm9kZSA9IGRldmljZV9ub2RlOwotCXBpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOwotCXBpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOwotCi0Jc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShwaW5mby5ub2RlLCAmZmxhZ3MpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KLQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCX0KLQotCWlmIChmbGFncyAhPSBBQ1BJX1VJTlQzMl9NQVgpIHsKLQkJaW5mby0+bnVtX1NUQSsrOwotCX0KLQotCWlmICghKGZsYWdzICYgQUNQSV9TVEFfREVWSUNFX1BSRVNFTlQpKSB7Ci0JCS8qIERvbid0IGxvb2sgYXQgY2hpbGRyZW4gb2YgYSBub3QgcHJlc2VudCBkZXZpY2UgKi8KLQorCWlmICghKGRldmljZV9ub2RlLT5mbGFncyAmIEFOT0JKX1NVQlRSRUVfSEFTX0lOSSkpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfREVQVEgpOwogCX0KIAogCS8qCi0JICogVGhlIGRldmljZSBpcyBwcmVzZW50IGFuZCBfSU5JIGV4aXN0cy4gUnVuIHRoZSBfSU5JIG1ldGhvZC4KLQkgKiAoV2UgYWxyZWFkeSBoYXZlIHRoZSBfSU5JIG5vZGUgZnJvbSBhYm92ZSkKKwkgKiBSdW4gX1NUQSB0byBkZXRlcm1pbmUgaWYgdGhpcyBkZXZpY2UgaXMgcHJlc2VudCBhbmQgZnVuY3Rpb25pbmcuIFdlCisJICogbXVzdCBrbm93IHRoaXMgaW5mb3JtYXRpb24gZm9yIHR3byBpbXBvcnRhbnQgcmVhc29ucyAoZnJvbSBBQ1BJIHNwZWMpOgorCSAqCisJICogMSkgV2UgY2FuIG9ubHkgcnVuIF9JTkkgaWYgdGhlIGRldmljZSBpcyBwcmVzZW50LgorCSAqIDIpIFdlIG11c3QgYWJvcnQgdGhlIGRldmljZSB0cmVlIHdhbGsgb24gdGhpcyBzdWJ0cmVlIGlmIHRoZSBkZXZpY2UgaXMKKwkgKiAgICBub3QgcHJlc2VudCBhbmQgaXMgbm90IGZ1bmN0aW9uYWwgKHdlIHdpbGwgbm90IGV4YW1pbmUgdGhlIGNoaWxkcmVuKQorCSAqCisJICogVGhlIF9TVEEgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB0byBiZSBwcmVzZW50IHVuZGVyIHRoZSBkZXZpY2UsIHdlCisJICogYXNzdW1lIHRoZSBkZXZpY2UgaXMgcHJlc2VudCBpZiBfU1RBIGRvZXMgbm90IGV4aXN0LgogCSAqLwotCUFDUElfREVCVUdfRVhFQyhhY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZShBQ1BJX1RZUEVfTUVUSE9ELAotCQkJCQkJICAgICAgcGluZm8ubm9kZSwKLQkJCQkJCSAgICAgIE1FVEhPRF9OQU1FX19JTkkpKTsKKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfTUVUSE9ELCBkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1NUQSkpOwogCi0JcGluZm8ubm9kZSA9IGluaV9ub2RlOwotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKCZwaW5mbyk7CisJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX1NUQShkZXZpY2Vfbm9kZSwgJmZsYWdzKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwogCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KIAotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi0JCWNoYXIgKnNjb3BlX25hbWUgPSBhY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShpbmlfbm9kZSk7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJfQogCi0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIiVzLl9JTkkgZmFpbGVkOiAlcyIsCi0JCQkgICAgICBzY29wZV9uYW1lLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCS8qCisJICogRmxhZ3MgPT0gLTEgbWVhbnMgdGhhdCBfU1RBIHdhcyBub3QgZm91bmQuIEluIHRoaXMgY2FzZSwgd2UgYXNzdW1lIHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIGJvdGggcHJlc2VudCBhbmQgZnVuY3Rpb25hbC4KKwkgKgorCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX1NUQToKKwkgKgorCSAqICJJZiBhIGRldmljZSBvYmplY3QgKGluY2x1ZGluZyB0aGUgcHJvY2Vzc29yIG9iamVjdCkgZG9lcyBub3QgaGF2ZSBhbgorCSAqIF9TVEEgb2JqZWN0LCB0aGVuIE9TUE0gYXNzdW1lcyB0aGF0IGFsbCBvZiB0aGUgYWJvdmUgYml0cyBhcmUgc2V0IChpbgorCSAqIG90aGVyIHdvcmRzLCB0aGUgZGV2aWNlIGlzIHByZXNlbnQsIC4uLiwgYW5kIGZ1bmN0aW9uaW5nKSIKKwkgKi8KKwlpZiAoZmxhZ3MgIT0gQUNQSV9VSU5UMzJfTUFYKSB7CisJCXdhbGtfaW5mby0+bnVtX1NUQSsrOworCX0KIAotCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJLyogRGVsZXRlIGFueSByZXR1cm4gb2JqZWN0IChlc3BlY2lhbGx5IGlmIGltcGxpY2l0X3JldHVybiBpcyBlbmFibGVkKSAqLworCS8qCisJICogRXhhbWluZSB0aGUgUFJFU0VOVCBhbmQgRlVOQ1RJT05JTkcgc3RhdHVzIGJpdHMKKwkgKgorCSAqIE5vdGU6IEFDUEkgc3BlYyBkb2VzIG5vdCBzZWVtIHRvIHNwZWNpZnkgYmVoYXZpb3IgZm9yIHRoZSBwcmVzZW50IGJ1dAorCSAqIG5vdCBmdW5jdGlvbmluZyBjYXNlLCBzbyB3ZSBhc3N1bWUgZnVuY3Rpb25pbmcgaWYgcHJlc2VudC4KKwkgKi8KKwlpZiAoIShmbGFncyAmIEFDUElfU1RBX0RFVklDRV9QUkVTRU5UKSkgewogCi0JCWlmIChwaW5mby5yZXR1cm5fb2JqZWN0KSB7Ci0JCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocGluZm8ucmV0dXJuX29iamVjdCk7CisJCS8qIERldmljZSBpcyBub3QgcHJlc2VudCwgd2UgbXVzdCBleGFtaW5lIHRoZSBGdW5jdGlvbmluZyBiaXQgKi8KKworCQlpZiAoZmxhZ3MgJiBBQ1BJX1NUQV9ERVZJQ0VfRlVOQ1RJT05JTkcpIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgaXMgbm90IHByZXNlbnQgYnV0IGlzICJmdW5jdGlvbmluZyIuIEluIHRoaXMgY2FzZSwKKwkJCSAqIHdlIHdpbGwgbm90IHJ1biBfSU5JLCBidXQgd2UgY29udGludWUgdG8gZXhhbWluZSB0aGUgY2hpbGRyZW4KKwkJCSAqIG9mIHRoaXMgZGV2aWNlLgorCQkJICoKKwkJCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX1NUQTogKE5vdGUgLSBubyBtZW50aW9uCisJCQkgKiBvZiB3aGV0aGVyIHRvIHJ1biBfSU5JIG9yIG5vdCBvbiB0aGUgZGV2aWNlIGluIHF1ZXN0aW9uKQorCQkJICoKKwkJCSAqICJfU1RBIG1heSByZXR1cm4gYml0IDAgY2xlYXIgKG5vdCBwcmVzZW50KSB3aXRoIGJpdCAzIHNldAorCQkJICogKGRldmljZSBpcyBmdW5jdGlvbmFsKS4gVGhpcyBjYXNlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSB2YWxpZAorCQkJICogZGV2aWNlIGZvciB3aGljaCBubyBkZXZpY2UgZHJpdmVyIHNob3VsZCBiZSBsb2FkZWQgKGZvciBleGFtcGxlLAorCQkJICogYSBicmlkZ2UgZGV2aWNlLikgQ2hpbGRyZW4gb2YgdGhpcyBkZXZpY2UgbWF5IGJlIHByZXNlbnQgYW5kCisJCQkgKiB2YWxpZC4gT1NQTSBzaG91bGQgY29udGludWUgZW51bWVyYXRpb24gYmVsb3cgYSBkZXZpY2Ugd2hvc2UKKwkJCSAqIF9TVEEgcmV0dXJucyB0aGlzIGJpdCBjb21iaW5hdGlvbiIKKwkJCSAqLworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBEZXZpY2UgaXMgbm90IHByZXNlbnQgYW5kIGlzIG5vdCBmdW5jdGlvbmluZy4gV2UgbXVzdCBhYm9ydCB0aGUKKwkJCSAqIHdhbGsgb2YgdGhpcyBzdWJ0cmVlIGltbWVkaWF0ZWx5IC0tIGRvbid0IGxvb2sgYXQgdGhlIGNoaWxkcmVuCisJCQkgKiBvZiBzdWNoIGEgZGV2aWNlLgorCQkJICoKKwkJCSAqIEZyb20gdGhlIEFDUEkgc3BlYywgZGVzY3JpcHRpb24gb2YgX0lOSToKKwkJCSAqCisJCQkgKiAiSWYgdGhlIF9TVEEgbWV0aG9kIGluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgaXMgbm90IHByZXNlbnQsCisJCQkgKiBPU1BNIHdpbGwgbm90IHJ1biB0aGUgX0lOSSBhbmQgd2lsbCBub3QgZXhhbWluZSB0aGUgY2hpbGRyZW4KKwkJCSAqIG9mIHRoZSBkZXZpY2UgZm9yIF9JTkkgbWV0aG9kcyIKKwkJCSAqLworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfREVQVEgpOwogCQl9Ci0KLQkJLyogQ291bnQgb2Ygc3VjY2Vzc2Z1bCBJTklzICovCi0KLQkJaW5mby0+bnVtX0lOSSsrOwogCX0KIAorCS8qCisJICogVGhlIGRldmljZSBpcyBwcmVzZW50IG9yIGlzIGFzc3VtZWQgcHJlc2VudCBpZiBubyBfU1RBIGV4aXN0cy4KKwkgKiBSdW4gdGhlIF9JTkkgaWYgaXQgZXhpc3RzIChub3QgcmVxdWlyZWQgdG8gZXhpc3QpCisJICoKKwkgKiBOb3RlOiBXZSBrbm93IHRoZXJlIGlzIGFuIF9JTkkgd2l0aGluIHRoaXMgc3VidHJlZSwgYnV0IGl0IG1heSBub3QgYmUKKwkgKiB1bmRlciB0aGlzIHBhcnRpY3VsYXIgZGV2aWNlLCBpdCBtYXkgYmUgbG93ZXIgaW4gdGhlIGJyYW5jaC4KKwkgKi8KKwlBQ1BJX0RFQlVHX0VYRUMoYWNwaV91dF9kaXNwbGF5X2luaXRfcGF0aG5hbWUKKwkJCShBQ1BJX1RZUEVfTUVUSE9ELCBkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX0lOSSkpOworCisJaW5mby0+cHJlZml4X25vZGUgPSBkZXZpY2Vfbm9kZTsKKwlpbmZvLT5wYXRobmFtZSA9IE1FVEhPRF9OQU1FX19JTkk7CisJaW5mby0+cGFyYW1ldGVycyA9IE5VTEw7CisJaW5mby0+cGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CisJaW5mby0+ZmxhZ3MgPSBBQ1BJX0lHTk9SRV9SRVRVUk5fVkFMVUU7CisKKwlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlKGluZm8pOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQl3YWxrX2luZm8tPm51bV9JTkkrKzsKKworCQlpZiAoKGFjcGlfZGJnX2xldmVsIDw9IEFDUElfTFZfQUxMX0VYQ0VQVElPTlMpICYmCisJCSAgICAoIShhY3BpX2RiZ19sZXZlbCAmIEFDUElfTFZfSU5GTykpKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UX1JBVygoQUNQSV9EQl9JTklULCAiLiIpKTsKKwkJfQorCX0KKyNpZmRlZiBBQ1BJX0RFQlVHX09VVFBVVAorCWVsc2UgaWYgKHN0YXR1cyAhPSBBRV9OT1RfRk9VTkQpIHsKKworCQkvKiBJZ25vcmUgZXJyb3IgYW5kIG1vdmUgb24gdG8gbmV4dCBkZXZpY2UgKi8KKworCQljaGFyICpzY29wZV9uYW1lID0KKwkJICAgIGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKGluZm8tPnJlc29sdmVkX25vZGUpOworCisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJkdXJpbmcgJXMuX0lOSSBleGVjdXRpb24iLAorCQkJCXNjb3BlX25hbWUpKTsKKwkJQUNQSV9GUkVFKHNjb3BlX25hbWUpOworCX0KKyNlbmRpZgorCisJLyogSWdub3JlIGVycm9ycyBmcm9tIGFib3ZlICovCisKKwlzdGF0dXMgPSBBRV9PSzsKKworCS8qCisJICogVGhlIF9JTkkgbWV0aG9kIGhhcyBiZWVuIHJ1biBpZiBwcmVzZW50OyBjYWxsIHRoZSBHbG9iYWwgSW5pdGlhbGl6YXRpb24KKwkgKiBIYW5kbGVyIGZvciB0aGlzIGRldmljZS4KKwkgKi8KIAlpZiAoYWNwaV9nYmxfaW5pdF9oYW5kbGVyKSB7Ci0JCS8qIEV4dGVybmFsIGluaXRpYWxpemF0aW9uIGhhbmRsZXIgaXMgcHJlc2VudCwgY2FsbCBpdCAqLwotCiAJCXN0YXR1cyA9Ci0JCSAgICBhY3BpX2dibF9pbml0X2hhbmRsZXIocGluZm8ubm9kZSwgQUNQSV9JTklUX0RFVklDRV9JTkkpOworCQkgICAgYWNwaV9nYmxfaW5pdF9oYW5kbGVyKGRldmljZV9ub2RlLCBBQ1BJX0lOSVRfREVWSUNFX0lOSSk7CiAJfQogCi0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbG9hZC5jCmluZGV4IDRlMGIwNTIuLmZlNzVkODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNsb2FkLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2xvYWQuYwpAQCAtNzcsMTMgKzc3LDE0IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfbG9hZF90YWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9hZF90YWJsZSk7CiAKIAkvKiBDaGVjayBpZiB0YWJsZSBjb250YWlucyB2YWxpZCBBTUwgKG11c3QgYmUgRFNEVCwgUFNEVCwgU1NEVCwgZXRjLikgKi8KIAogCWlmICghCiAJICAgIChhY3BpX2dibF90YWJsZV9kYXRhW3RhYmxlX2Rlc2MtPnR5cGVdLgogCSAgICAgZmxhZ3MgJiBBQ1BJX1RBQkxFX0VYRUNVVEFCTEUpKSB7CisKIAkJLyogSnVzdCBpZ25vcmUgdGhpcyB0YWJsZSAqLwogCiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CkBAIC0xNjgsNyArMTY5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX2xvYWRfdGFibGVfYnlfdHlwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9hZF90YWJsZV9ieV90eXBlKTsKIAogCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9UQUJMRVMpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewpAQCAtMTgwLDExICsxODEsMTEgQEAKIAkgKiBEU0RUIChvbmUpLCBTU0RUL1BTRFQgKG11bHRpcGxlKQogCSAqLwogCXN3aXRjaCAodGFibGVfdHlwZSkgewotCWNhc2UgQUNQSV9UQUJMRV9EU0RUOgorCWNhc2UgQUNQSV9UQUJMRV9JRF9EU0RUOgogCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk5hbWVzcGFjZSBsb2FkOiBEU0RUXG4iKSk7CiAKLQkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfRFNEVF0ubmV4dDsKKwkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW0FDUElfVEFCTEVfSURfRFNEVF0ubmV4dDsKIAogCQkvKiBJZiB0YWJsZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG5hbWVzcGFjZSwganVzdCByZXR1cm4gKi8KIApAQCAtMjAwLDggKzIwMSw4IEBACiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfVEFCTEVfU1NEVDoKLQljYXNlIEFDUElfVEFCTEVfUFNEVDoKKwljYXNlIEFDUElfVEFCTEVfSURfU1NEVDoKKwljYXNlIEFDUElfVEFCTEVfSURfUFNEVDoKIAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJICAiTmFtZXNwYWNlIGxvYWQ6ICVkIFNTRFQgb3IgUFNEVHNcbiIsCkBAIC0yNTgsNyArMjU5LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2xvYWRfbmFtZV9zcGFjZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9sb2FkX25hbWVfc3BhY2UpOwogCiAJLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBhIERTRFQgaW5zdGFsbGVkICovCiAKQEAgLTI3MSwxNSArMjcyLDE1IEBACiAJICogTG9hZCB0aGUgbmFtZXNwYWNlLiAgVGhlIERTRFQgaXMgcmVxdWlyZWQsCiAJICogYnV0IHRoZSBTU0RUIGFuZCBQU0RUIHRhYmxlcyBhcmUgb3B0aW9uYWwuCiAJICovCi0Jc3RhdHVzID0gYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoQUNQSV9UQUJMRV9EU0RUKTsKKwlzdGF0dXMgPSBhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX0RTRFQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBJZ25vcmUgZXhjZXB0aW9ucyBmcm9tIHRoZXNlICovCiAKLQkodm9pZClhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX1NTRFQpOwotCSh2b2lkKWFjcGlfbnNfbG9hZF90YWJsZV9ieV90eXBlKEFDUElfVEFCTEVfUFNEVCk7CisJKHZvaWQpYWNwaV9uc19sb2FkX3RhYmxlX2J5X3R5cGUoQUNQSV9UQUJMRV9JRF9TU0RUKTsKKwkodm9pZClhY3BpX25zX2xvYWRfdGFibGVfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX1BTRFQpOwogCiAJQUNQSV9ERUJVR19QUklOVF9SQVcoKEFDUElfREJfSU5JVCwKIAkJCSAgICAgICJBQ1BJIE5hbWVzcGFjZSBzdWNjZXNzZnVsbHkgbG9hZGVkIGF0IHJvb3QgJXBcbiIsCkBAIC0zMTQsNyArMzE1LDcgQEAKIAlhY3BpX2hhbmRsZSBkdW1teTsKIAl1MzIgbGV2ZWw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZWxldGVfc3VidHJlZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZGVsZXRlX3N1YnRyZWUpOwogCiAJcGFyZW50X2hhbmRsZSA9IHN0YXJ0X2hhbmRsZTsKIAljaGlsZF9oYW5kbGUgPSBOVUxMOwpAQCAtMzI1LDYgKzMyNiw3IEBACiAJICogdG8gd2hlcmUgd2Ugc3RhcnRlZC4KIAkgKi8KIAl3aGlsZSAobGV2ZWwgPiAwKSB7CisKIAkJLyogQXR0ZW1wdCB0byBnZXQgdGhlIG5leHQgb2JqZWN0IGluIHRoaXMgc2NvcGUgKi8KIAogCQlzdGF0dXMgPSBhY3BpX2dldF9uZXh0X29iamVjdChBQ1BJX1RZUEVfQU5ZLCBwYXJlbnRfaGFuZGxlLApAQCAtMzM1LDYgKzMzNyw3IEBACiAJCS8qIERpZCB3ZSBnZXQgYSBuZXcgb2JqZWN0PyAqLwogCiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCiAJCQkvKiBDaGVjayBpZiB0aGlzIG9iamVjdCBoYXMgYW55IGNoaWxkcmVuICovCiAKIAkJCWlmIChBQ1BJX1NVQ0NFU1MKQEAgLTM5Miw3ICszOTUsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX3VubG9hZF9uYW1lX3NwYWNlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc191bmxvYWRfbmFtZV9zcGFjZSk7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zbmFtZXMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCmluZGV4IDYzOWY2NTMuLjk3YjgzMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNuYW1lcy5jCkBAIC00OCwxMSArNDgsNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfTkFNRVNQQUNFCiBBQ1BJX01PRFVMRV9OQU1FKCJuc25hbWVzIikKIAotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQKLWFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpOwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX25zX2J1aWxkX2V4dGVybmFsX3BhdGgKQEAgLTY3LDggKzYyLDcgQEAKICAqIERFU0NSSVBUSU9OOiBHZW5lcmF0ZSBhIGZ1bGwgcGF0aGFuYW1lCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQKK3ZvaWQKIGFjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKIAkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpCiB7CkBAIC0xMzgsNyArMTMyLDcgQEAKIAljaGFyICpuYW1lX2J1ZmZlcjsKIAlhY3BpX3NpemUgc2l6ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJuc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUiLCBub2RlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUsIG5vZGUpOwogCiAJLyogQ2FsY3VsYXRlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGJhc2VkIG9uIGRlcHRoIGJlbG93IHJvb3QgKi8KIApAQCAtMTQ2LDcgKzE0MCw3IEBACiAKIAkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBiZSByZXR1cm5lZCB0byBjYWxsZXIgKi8KIAotCW5hbWVfYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHNpemUpOworCW5hbWVfYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZSk7CiAJaWYgKCFuYW1lX2J1ZmZlcikgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiQWxsb2NhdGlvbiBmYWlsdXJlIikpOwogCQlyZXR1cm5fUFRSKE5VTEwpOwpAQCAtMjE5LDcgKzIxMyw3IEBACiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJYWNwaV9zaXplIHJlcXVpcmVkX3NpemU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfaGFuZGxlX3RvX3BhdGhuYW1lIiwgdGFyZ2V0X2hhbmRsZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfaGFuZGxlX3RvX3BhdGhuYW1lLCB0YXJnZXRfaGFuZGxlKTsKIAogCW5vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZSh0YXJnZXRfaGFuZGxlKTsKIAlpZiAoIW5vZGUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNvYmplY3QuYwppbmRleCAxMGFlNjI5Li5hYWJlODc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zb2JqZWN0LmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc29iamVjdC5jCkBAIC03NiwxOSArNzYsMjEgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpsYXN0X29ial9kZXNjOwogCWFjcGlfb2JqZWN0X3R5cGUgb2JqZWN0X3R5cGUgPSBBQ1BJX1RZUEVfQU5ZOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfYXR0YWNoX29iamVjdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfYXR0YWNoX29iamVjdCk7CiAKIAkvKgogCSAqIFBhcmFtZXRlciB2YWxpZGF0aW9uCiAJICovCiAJaWYgKCFub2RlKSB7CisKIAkJLyogSW52YWxpZCBoYW5kbGUgKi8KIAotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBuYW1lZF9vYmogaGFuZGxlIikpOworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiTnVsbCBOYW1lZE9iaiBoYW5kbGUiKSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAlpZiAoIW9iamVjdCAmJiAoQUNQSV9UWVBFX0FOWSAhPSB0eXBlKSkgeworCiAJCS8qIE51bGwgb2JqZWN0ICovCiAKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKQEAgLTk3LDYgKzk5LDcgQEAKIAl9CiAKIAlpZiAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKG5vZGUpICE9IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisKIAkJLyogTm90IGEgbmFtZSBoYW5kbGUgKi8KIAogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBoYW5kbGUgJXAgWyVzXSIsCkBAIC0xMDgsNyArMTExLDcgQEAKIAogCWlmIChub2RlLT5vYmplY3QgPT0gb2JqZWN0KSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkgICJPYmogJXAgYWxyZWFkeSBpbnN0YWxsZWQgaW4gbmFtZV9vYmogJXBcbiIsCisJCQkJICAiT2JqICVwIGFscmVhZHkgaW5zdGFsbGVkIGluIE5hbWVPYmogJXBcbiIsCiAJCQkJICBvYmplY3QsIG5vZGUpKTsKIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpAQCAtMjAxLDcgKzIwNCw3IEBACiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19kZXRhY2hfb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19kZXRhY2hfb2JqZWN0KTsKIAogCW9ial9kZXNjID0gbm9kZS0+b2JqZWN0OwogCkBAIC0yNTIsNyArMjU1LDcgQEAKIAkJCQkJCSAgICAgICBhY3BpX25hbWVzcGFjZV9ub2RlCiAJCQkJCQkgICAgICAgKm5vZGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2dldF9hdHRhY2hlZF9vYmplY3QiLCBub2RlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihuc19nZXRfYXR0YWNoZWRfb2JqZWN0LCBub2RlKTsKIAogCWlmICghbm9kZSkgewogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJOdWxsIE5vZGUgcHRyIikpOwpAQCAtMjg3LDcgKzI5MCw3IEBACiAJCQkJCQkJYWNwaV9vcGVyYW5kX29iamVjdAogCQkJCQkJCSpvYmpfZGVzYykKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigibnNfZ2V0X3NlY29uZGFyeV9vYmplY3QiLCBvYmpfZGVzYyk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X3NlY29uZGFyeV9vYmplY3QsIG9ial9kZXNjKTsKIAogCWlmICgoIW9ial9kZXNjKSB8fAogCSAgICAoQUNQSV9HRVRfT0JKRUNUX1RZUEUob2JqX2Rlc2MpID09IEFDUElfVFlQRV9MT0NBTF9EQVRBKSB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYwppbmRleCAyMzJiZTQzLi4xNTU1MDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zcGFyc2UuYwpAQCAtNjIsMTMgKzYyLDEzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGFjcGlfc3RhdHVzCi1hY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSh1OCBwYXNzX251bWJlciwgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqIHRhYmxlX2Rlc2MpCithY3BpX25zX29uZV9jb21wbGV0ZV9wYXJzZSh1OCBwYXNzX251bWJlciwgc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYykKIHsKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcGFyc2Vfcm9vdDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoIm5zX29uZV9jb21wbGV0ZV9wYXJzZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfb25lX2NvbXBsZXRlX3BhcnNlKTsKIAogCS8qIENyZWF0ZSBhbmQgaW5pdCBhIFJvb3QgTm9kZSAqLwogCkBAIC0xMjQsNyArMTI0LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19wYXJzZV90YWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfcGFyc2VfdGFibGUpOwogCiAJLyoKIAkgKiBBTUwgUGFyc2UsIHBhc3MgMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3NlYXJjaC5jCmluZGV4IGQ2NGI3ODkuLjUwMGUyYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNzZWFyY2guYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zc2VhcmNoLmMKQEAgLTU2LDE2ICs1NiwxNiBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX25zX3NlYXJjaF9ub2RlCisgKiBGVU5DVElPTjogICAgYWNwaV9uc19zZWFyY2hfb25lX3Njb3BlCiAgKgogICogUEFSQU1FVEVSUzogIHRhcmdldF9uYW1lICAgICAtIEFzY2lpIEFDUEkgbmFtZSB0byBzZWFyY2ggZm9yCi0gKiAgICAgICAgICAgICAgTm9kZSAgICAgICAgICAgIC0gU3RhcnRpbmcgbm9kZSB3aGVyZSBzZWFyY2ggd2lsbCBiZWdpbgorICogICAgICAgICAgICAgIHBhcmVudF9ub2RlICAgICAtIFN0YXJ0aW5nIG5vZGUgd2hlcmUgc2VhcmNoIHdpbGwgYmVnaW4KICAqICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgLSBPYmplY3QgdHlwZSB0byBtYXRjaAogICogICAgICAgICAgICAgIHJldHVybl9ub2RlICAgICAtIFdoZXJlIHRoZSBtYXRjaGVkIE5hbWVkIG9iaiBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCi0gKiBERVNDUklQVElPTjogU2VhcmNoIGEgc2luZ2xlIGxldmVsIG9mIHRoZSBuYW1lc3BhY2UuICBQZXJmb3JtcyBhCisgKiBERVNDUklQVElPTjogU2VhcmNoIGEgc2luZ2xlIGxldmVsIG9mIHRoZSBuYW1lc3BhY2UuIFBlcmZvcm1zIGEKICAqICAgICAgICAgICAgICBzaW1wbGUgc2VhcmNoIG9mIHRoZSBzcGVjaWZpZWQgbGV2ZWwsIGFuZCBkb2VzIG5vdCBhZGQKICAqICAgICAgICAgICAgICBlbnRyaWVzIG9yIHNlYXJjaCBwYXJlbnRzLgogICoKQEAgLTc1LDM1ICs3NSw0MCBAQAogICoKICAqICAgICAgQWxsIG5hbWVzcGFjZSBzZWFyY2hpbmcgaXMgbGluZWFyIGluIHRoaXMgaW1wbGVtZW50YXRpb24sIGJ1dAogICogICAgICBjb3VsZCBiZSBlYXNpbHkgbW9kaWZpZWQgdG8gc3VwcG9ydCBhbnkgaW1wcm92ZWQgc2VhcmNoCi0gKiAgICAgIGFsZ29yaXRobS4gIEhvd2V2ZXIsIHRoZSBsaW5lYXIgc2VhcmNoIHdhcyBjaG9zZW4gZm9yIHNpbXBsaWNpdHkKKyAqICAgICAgYWxnb3JpdGhtLiBIb3dldmVyLCB0aGUgbGluZWFyIHNlYXJjaCB3YXMgY2hvc2VuIGZvciBzaW1wbGljaXR5CiAgKiAgICAgIGFuZCBiZWNhdXNlIHRoZSB0cmVlcyBhcmUgc21hbGwgYW5kIHRoZSBvdGhlciBpbnRlcnByZXRlcgogICogICAgICBleGVjdXRpb24gb3ZlcmhlYWQgaXMgcmVsYXRpdmVseSBoaWdoLgogICoKKyAqICAgICAgTm90ZTogQ1BVIGV4ZWN1dGlvbiBhbmFseXNpcyBoYXMgc2hvd24gdGhhdCB0aGUgQU1MIGludGVycHJldGVyIHNwZW5kcworICogICAgICBhIHZlcnkgc21hbGwgcGVyY2VudGFnZSBvZiBpdHMgdGltZSBzZWFyY2hpbmcgdGhlIG5hbWVzcGFjZS4gVGhlcmVmb3JlLAorICogICAgICB0aGUgbGluZWFyIHNlYXJjaCBzZWVtcyB0byBiZSBzdWZmaWNpZW50LCBhcyB0aGVyZSB3b3VsZCBzZWVtIHRvIGJlCisgKiAgICAgIGxpdHRsZSB2YWx1ZSBpbiBpbXByb3ZpbmcgdGhlIHNlYXJjaC4KKyAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19zZWFyY2hfbm9kZSh1MzIgdGFyZ2V0X25hbWUsCi0JCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKLQkJICAgIGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKLQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCithY3BpX25zX3NlYXJjaF9vbmVfc2NvcGUodTMyIHRhcmdldF9uYW1lLAorCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwYXJlbnRfbm9kZSwKKwkJCSBhY3BpX29iamVjdF90eXBlIHR5cGUsCisJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSkKIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbmV4dF9ub2RlOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX25vZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKG5zX3NlYXJjaF9vbmVfc2NvcGUpOwogCiAjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKIAlpZiAoQUNQSV9MVl9OQU1FUyAmIGFjcGlfZGJnX2xldmVsKSB7CiAJCWNoYXIgKnNjb3BlX25hbWU7CiAKLQkJc2NvcGVfbmFtZSA9IGFjcGlfbnNfZ2V0X2V4dGVybmFsX3BhdGhuYW1lKG5vZGUpOworCQlzY29wZV9uYW1lID0gYWNwaV9uc19nZXRfZXh0ZXJuYWxfcGF0aG5hbWUocGFyZW50X25vZGUpOwogCQlpZiAoc2NvcGVfbmFtZSkgewogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9OQU1FUywKIAkJCQkJICAiU2VhcmNoaW5nICVzICglcCkgRm9yIFslNC40c10gKCVzKVxuIiwKLQkJCQkJICBzY29wZV9uYW1lLCBub2RlLCBBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkJCQkJCQkgICZ0YXJnZXRfbmFtZSksCisJCQkJCSAgc2NvcGVfbmFtZSwgcGFyZW50X25vZGUsCisJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAogCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZSh0eXBlKSkpOwogCi0JCQlBQ1BJX01FTV9GUkVFKHNjb3BlX25hbWUpOworCQkJQUNQSV9GUkVFKHNjb3BlX25hbWUpOwogCQl9CiAJfQogI2VuZGlmCkBAIC0xMTIsMzIgKzExNywzMyBAQAogCSAqIFNlYXJjaCBmb3IgbmFtZSBhdCB0aGlzIG5hbWVzcGFjZSBsZXZlbCwgd2hpY2ggaXMgdG8gc2F5IHRoYXQgd2UKIAkgKiBtdXN0IHNlYXJjaCBmb3IgdGhlIG5hbWUgYW1vbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgb2JqZWN0CiAJICovCi0JbmV4dF9ub2RlID0gbm9kZS0+Y2hpbGQ7Ci0Jd2hpbGUgKG5leHRfbm9kZSkgeworCW5vZGUgPSBwYXJlbnRfbm9kZS0+Y2hpbGQ7CisJd2hpbGUgKG5vZGUpIHsKKwogCQkvKiBDaGVjayBmb3IgbWF0Y2ggYWdhaW5zdCB0aGUgbmFtZSAqLwogCi0JCWlmIChuZXh0X25vZGUtPm5hbWUuaW50ZWdlciA9PSB0YXJnZXRfbmFtZSkgeworCQlpZiAobm9kZS0+bmFtZS5pbnRlZ2VyID09IHRhcmdldF9uYW1lKSB7CisKIAkJCS8qIFJlc29sdmUgYSBjb250cm9sIG1ldGhvZCBhbGlhcyBpZiBhbnkgKi8KIAotCQkJaWYgKGFjcGlfbnNfZ2V0X3R5cGUobmV4dF9ub2RlKSA9PQorCQkJaWYgKGFjcGlfbnNfZ2V0X3R5cGUobm9kZSkgPT0KIAkJCSAgICBBQ1BJX1RZUEVfTE9DQUxfTUVUSE9EX0FMSUFTKSB7Ci0JCQkJbmV4dF9ub2RlID0KKwkJCQlub2RlID0KIAkJCQkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSwKLQkJCQkJCSAgbmV4dF9ub2RlLT5vYmplY3QpOworCQkJCQkJICBub2RlLT5vYmplY3QpOwogCQkJfQogCi0JCQkvKgotCQkJICogRm91bmQgbWF0Y2hpbmcgZW50cnkuCi0JCQkgKi8KKwkJCS8qIEZvdW5kIG1hdGNoaW5nIGVudHJ5ICovCisKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTkFNRVMsCiAJCQkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpICVwIGZvdW5kIGluIHNjb3BlIFslNC40c10gJXBcbiIsCiAJCQkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAotCQkJCQkgIGFjcGlfdXRfZ2V0X3R5cGVfbmFtZShuZXh0X25vZGUtPgotCQkJCQkJCQl0eXBlKSwKLQkJCQkJICBuZXh0X25vZGUsCi0JCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKG5vZGUpLCBub2RlKSk7CisJCQkJCSAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKG5vZGUtPnR5cGUpLAorCQkJCQkgIG5vZGUsCisJCQkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSwKKwkJCQkJICBwYXJlbnRfbm9kZSkpOwogCi0JCQkqcmV0dXJuX25vZGUgPSBuZXh0X25vZGU7CisJCQkqcmV0dXJuX25vZGUgPSBub2RlOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAkJfQogCkBAIC0xNDUsNyArMTUxLDggQEAKIAkJICogVGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgcG9pbnRzIGJhY2sgdG8gdGhlIHBhcmVudCwKIAkJICogc28gYSBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGVuZC1vZi1saXN0CiAJCSAqLwotCQlpZiAobmV4dF9ub2RlLT5mbGFncyAmIEFOT0JKX0VORF9PRl9QRUVSX0xJU1QpIHsKKwkJaWYgKG5vZGUtPmZsYWdzICYgQU5PQkpfRU5EX09GX1BFRVJfTElTVCkgeworCiAJCQkvKiBTZWFyY2hlZCBlbnRpcmUgbGlzdCwgd2UgYXJlIGRvbmUgKi8KIAogCQkJYnJlYWs7CkBAIC0xNTMsNyArMTYwLDcgQEAKIAogCQkvKiBEaWRuJ3QgbWF0Y2ggbmFtZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBwZWVyIG9iamVjdCAqLwogCi0JCW5leHRfbm9kZSA9IG5leHRfbm9kZS0+cGVlcjsKKwkJbm9kZSA9IG5vZGUtPnBlZXI7CiAJfQogCiAJLyogU2VhcmNoZWQgZW50aXJlIG5hbWVzcGFjZSBsZXZlbCwgbm90IGZvdW5kICovCkBAIC0xNjIsNyArMTY5LDggQEAKIAkJCSAgIk5hbWUgWyU0LjRzXSAoJXMpIG5vdCBmb3VuZCBpbiBzZWFyY2ggaW4gc2NvcGUgWyU0LjRzXSAlcCBmaXJzdCBjaGlsZCAlcFxuIiwKIAkJCSAgQUNQSV9DQVNUX1BUUihjaGFyLCAmdGFyZ2V0X25hbWUpLAogCQkJICBhY3BpX3V0X2dldF90eXBlX25hbWUodHlwZSksCi0JCQkgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShub2RlKSwgbm9kZSwgbm9kZS0+Y2hpbGQpKTsKKwkJCSAgYWNwaV91dF9nZXRfbm9kZV9uYW1lKHBhcmVudF9ub2RlKSwgcGFyZW50X25vZGUsCisJCQkgIHBhcmVudF9ub2RlLT5jaGlsZCkpOwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PVF9GT1VORCk7CiB9CkBAIC0xNzksMTQgKzE4NywxNCBAQAogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBDYWxsZWQgd2hlbiBhIG5hbWUgaGFzIG5vdCBiZWVuIGZvdW5kIGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZQotICogICAgICAgICAgICAgIGxldmVsLiAgQmVmb3JlIGFkZGluZyBpdCBvciBnaXZpbmcgdXAsIEFDUEkgc2NvcGUgcnVsZXMgcmVxdWlyZQorICogICAgICAgICAgICAgIGxldmVsLiBCZWZvcmUgYWRkaW5nIGl0IG9yIGdpdmluZyB1cCwgQUNQSSBzY29wZSBydWxlcyByZXF1aXJlCiAgKiAgICAgICAgICAgICAgc2VhcmNoaW5nIGVuY2xvc2luZyBzY29wZXMgaW4gY2FzZXMgaWRlbnRpZmllZCBieSBhY3BpX25zX2xvY2FsKCkuCiAgKgogICogICAgICAgICAgICAgICJBIG5hbWUgaXMgbG9jYXRlZCBieSBmaW5kaW5nIHRoZSBtYXRjaGluZyBuYW1lIGluIHRoZSBjdXJyZW50CiAgKiAgICAgICAgICAgICAgbmFtZSBzcGFjZSwgYW5kIHRoZW4gaW4gdGhlIHBhcmVudCBuYW1lIHNwYWNlLiBJZiB0aGUgcGFyZW50CiAgKiAgICAgICAgICAgICAgbmFtZSBzcGFjZSBkb2VzIG5vdCBjb250YWluIHRoZSBuYW1lLCB0aGUgc2VhcmNoIGNvbnRpbnVlcwogICogICAgICAgICAgICAgIHJlY3Vyc2l2ZWx5IHVudGlsIGVpdGhlciB0aGUgbmFtZSBpcyBmb3VuZCBvciB0aGUgbmFtZSBzcGFjZQotICogICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgKHRoZSByb290IG9mIHRoZSBuYW1lIHNwYWNlKS4gIFRoaXMKKyAqICAgICAgICAgICAgICBkb2VzIG5vdCBoYXZlIGEgcGFyZW50ICh0aGUgcm9vdCBvZiB0aGUgbmFtZSBzcGFjZSkuIFRoaXMKICAqICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZSBpcyBub3QgZm91bmQiIChGcm9tIEFDUEkgU3BlY2lmaWNhdGlvbiwKICAqICAgICAgICAgICAgICBzZWN0aW9uIDUuMykKICAqCkBAIC0yMDEsNyArMjA5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX3BhcmVudF90cmVlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19zZWFyY2hfcGFyZW50X3RyZWUpOwogCiAJcGFyZW50X25vZGUgPSBhY3BpX25zX2dldF9wYXJlbnRfbm9kZShub2RlKTsKIApAQCAtMjM1LDIwICsyNDMsMTkgQEAKIAkgKi8KIAl3aGlsZSAocGFyZW50X25vZGUpIHsKIAkJLyoKLQkJICogU2VhcmNoIHBhcmVudCBzY29wZS4gIFVzZSBUWVBFX0FOWSBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCisJCSAqIFNlYXJjaCBwYXJlbnQgc2NvcGUuIFVzZSBUWVBFX0FOWSBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlCiAJCSAqIG9iamVjdCB0eXBlIGF0IHRoaXMgcG9pbnQsIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIG9mCi0JCSAqIHRoZSBhY3R1YWwgbmFtZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gIFR5cGVjaGVja2luZyBjb21lcyBsYXRlci4KKwkJICogdGhlIGFjdHVhbCBuYW1lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBUeXBlY2hlY2tpbmcgY29tZXMgbGF0ZXIuCiAJCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX3NlYXJjaF9ub2RlKHRhcmdldF9uYW1lLCBwYXJlbnRfbm9kZSwKKwkJc3RhdHVzID0KKwkJICAgIGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh0YXJnZXRfbmFtZSwgcGFyZW50X25vZGUsCiAJCQkJCSAgICAgQUNQSV9UWVBFX0FOWSwgcmV0dXJuX25vZGUpOwogCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKLQkJLyoKLQkJICogTm90IGZvdW5kIGhlcmUsIGdvIHVwIGFub3RoZXIgbGV2ZWwKLQkJICogKHVudGlsIHdlIHJlYWNoIHRoZSByb290KQotCQkgKi8KKwkJLyogTm90IGZvdW5kIGhlcmUsIGdvIHVwIGFub3RoZXIgbGV2ZWwgKHVudGlsIHdlIHJlYWNoIHRoZSByb290KSAqLworCiAJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUocGFyZW50X25vZGUpOwogCX0KIApAQCAtMjczLDcgKzI4MCw3IEBACiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFNlYXJjaCBmb3IgYSBuYW1lIHNlZ21lbnQgaW4gYSBzaW5nbGUgbmFtZXNwYWNlIGxldmVsLAotICogICAgICAgICAgICAgIG9wdGlvbmFsbHkgYWRkaW5nIGl0IGlmIGl0IGlzIG5vdCBmb3VuZC4gIElmIHRoZSBwYXNzZWQKKyAqICAgICAgICAgICAgICBvcHRpb25hbGx5IGFkZGluZyBpdCBpZiBpdCBpcyBub3QgZm91bmQuIElmIHRoZSBwYXNzZWQKICAqICAgICAgICAgICAgICBUeXBlIGlzIG5vdCBBbnkgYW5kIHRoZSB0eXBlIHByZXZpb3VzbHkgc3RvcmVkIGluIHRoZQogICogICAgICAgICAgICAgIGVudHJ5IHdhcyBBbnkgKGkuZS4gdW5rbm93biksIHVwZGF0ZSB0aGUgc3RvcmVkIHR5cGUuCiAgKgpAQCAtMjkzLDI5ICszMDAsNDYgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5ld19ub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfc2VhcmNoX2FuZF9lbnRlciIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfc2VhcmNoX2FuZF9lbnRlcik7CiAKIAkvKiBQYXJhbWV0ZXIgdmFsaWRhdGlvbiAqLwogCiAJaWYgKCFub2RlIHx8ICF0YXJnZXRfbmFtZSB8fCAhcmV0dXJuX25vZGUpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCSAgICAiTnVsbCBwYXJhbTogTm9kZSAlcCBOYW1lICVYIHJldHVybl9ub2RlICVwIiwKKwkJCSAgICAiTnVsbCBwYXJhbWV0ZXI6IE5vZGUgJXAgTmFtZSAlWCBSZXR1cm5Ob2RlICVwIiwKIAkJCSAgICBub2RlLCB0YXJnZXRfbmFtZSwgcmV0dXJuX25vZGUpKTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qIE5hbWUgbXVzdCBjb25zaXN0IG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzICovCi0KKwkvKgorCSAqIE5hbWUgbXVzdCBjb25zaXN0IG9mIHZhbGlkIEFDUEkgY2hhcmFjdGVycy4gV2Ugd2lsbCByZXBhaXIgdGhlIG5hbWUgaWYKKwkgKiBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGFib3J0IGJlY2F1c2Ugb2YgdGhpcywgYnV0IHdlIHdhbnQKKwkgKiBhbGwgbmFtZXNwYWNlIG5hbWVzIHRvIGJlIHByaW50YWJsZS4gQSB3YXJuaW5nIG1lc3NhZ2UgaXMgYXBwcm9wcmlhdGUuCisJICoKKwkgKiBUaGlzIGlzc3VlIGNhbWUgdXAgYmVjYXVzZSB0aGVyZSBhcmUgaW4gZmFjdCBtYWNoaW5lcyB0aGF0IGV4aGliaXQKKwkgKiB0aGlzIHByb2JsZW0sIGFuZCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gZW5hYmxlIEFDUEkgc3VwcG9ydCBmb3IgdGhlbSwKKwkgKiBldmVuIHRob3VnaCB0aGVyZSBhcmUgYSBmZXcgYmFkIG5hbWVzLgorCSAqLwogCWlmICghYWNwaV91dF92YWxpZF9hY3BpX25hbWUodGFyZ2V0X25hbWUpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJCYWQgY2hhcmFjdGVyIGluIEFDUEkgTmFtZTogJVgiLAotCQkJICAgIHRhcmdldF9uYW1lKSk7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfQ0hBUkFDVEVSKTsKKwkJdGFyZ2V0X25hbWUgPSBhY3BpX3V0X3JlcGFpcl9uYW1lKHRhcmdldF9uYW1lKTsKKworCQkvKiBSZXBvcnQgd2FybmluZyBvbmx5IGlmIGluIHN0cmljdCBtb2RlIG9yIGRlYnVnIG1vZGUgKi8KKworCQlpZiAoIWFjcGlfZ2JsX2VuYWJsZV9pbnRlcnByZXRlcl9zbGFjaykgeworCQkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkJCSAgICAgICJGb3VuZCBiYWQgY2hhcmFjdGVyKHMpIGluIG5hbWUsIHJlcGFpcmVkOiBbJTQuNHNdXG4iLAorCQkJCSAgICAgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOworCQl9IGVsc2UgeworCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9XQVJOLAorCQkJCQkgICJGb3VuZCBiYWQgY2hhcmFjdGVyKHMpIGluIG5hbWUsIHJlcGFpcmVkOiBbJTQuNHNdXG4iLAorCQkJCQkgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnRhcmdldF9uYW1lKSkpOworCQl9CiAJfQogCiAJLyogVHJ5IHRvIGZpbmQgdGhlIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSBsZXZlbCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciAqLwogCiAJKnJldHVybl9ub2RlID0gQUNQSV9FTlRSWV9OT1RfRk9VTkQ7Ci0Jc3RhdHVzID0gYWNwaV9uc19zZWFyY2hfbm9kZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwgcmV0dXJuX25vZGUpOworCXN0YXR1cyA9IGFjcGlfbnNfc2VhcmNoX29uZV9zY29wZSh0YXJnZXRfbmFtZSwgbm9kZSwgdHlwZSwgcmV0dXJuX25vZGUpOwogCWlmIChzdGF0dXMgIT0gQUVfTk9UX0ZPVU5EKSB7CiAJCS8qCiAJCSAqIElmIHdlIGZvdW5kIGl0IEFORCB0aGUgcmVxdWVzdCBzcGVjaWZpZXMgdGhhdCBhIGZpbmQgaXMgYW4gZXJyb3IsCkBAIC0zMjUsMTggKzM0OSwxNiBAQAogCQkJc3RhdHVzID0gQUVfQUxSRUFEWV9FWElTVFM7CiAJCX0KIAotCQkvKgotCQkgKiBFaXRoZXIgZm91bmQgaXQgb3IgdGhlcmUgd2FzIGFuIGVycm9yCi0JCSAqIC0tIGZpbmlzaGVkIGVpdGhlciB3YXkKLQkJICovCisJCS8qIEVpdGhlciBmb3VuZCBpdCBvciB0aGVyZSB3YXMgYW4gZXJyb3I6IGZpbmlzaGVkIGVpdGhlciB3YXkgKi8KKwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKgotCSAqIFRoZSBuYW1lIHdhcyBub3QgZm91bmQuICBJZiB3ZSBhcmUgTk9UIHBlcmZvcm1pbmcgdGhlIGZpcnN0IHBhc3MKKwkgKiBUaGUgbmFtZSB3YXMgbm90IGZvdW5kLiBJZiB3ZSBhcmUgTk9UIHBlcmZvcm1pbmcgdGhlIGZpcnN0IHBhc3MKIAkgKiAobmFtZSBlbnRyeSkgb2YgbG9hZGluZyB0aGUgbmFtZXNwYWNlLCBzZWFyY2ggdGhlIHBhcmVudCB0cmVlIChhbGwgdGhlCiAJICogd2F5IHRvIHRoZSByb290IGlmIG5lY2Vzc2FyeS4pIFdlIGRvbid0IHdhbnQgdG8gcGVyZm9ybSB0aGUgcGFyZW50Ci0JICogc2VhcmNoIHdoZW4gdGhlIG5hbWVzcGFjZSBpcyBhY3R1YWxseSBiZWluZyBsb2FkZWQuICBXZSB3YW50IHRvIHBlcmZvcm0KKwkgKiBzZWFyY2ggd2hlbiB0aGUgbmFtZXNwYWNlIGlzIGFjdHVhbGx5IGJlaW5nIGxvYWRlZC4gV2Ugd2FudCB0byBwZXJmb3JtCiAJICogdGhlIHNlYXJjaCB3aGVuIG5hbWVzcGFjZSByZWZlcmVuY2VzIGFyZSBiZWluZyByZXNvbHZlZCAobG9hZCBwYXNzIDIpCiAJICogYW5kIGR1cmluZyB0aGUgZXhlY3V0aW9uIHBoYXNlLgogCSAqLwpAQCAtMzU0LDkgKzM3Niw4IEBACiAJCX0KIAl9CiAKLQkvKgotCSAqIEluIGV4ZWN1dGUgbW9kZSwganVzdCBzZWFyY2gsIG5ldmVyIGFkZCBuYW1lcy4gIEV4aXQgbm93LgotCSAqLworCS8qIEluIGV4ZWN1dGUgbW9kZSwganVzdCBzZWFyY2gsIG5ldmVyIGFkZCBuYW1lcy4gRXhpdCBub3cgKi8KKwogCWlmIChpbnRlcnByZXRlcl9tb2RlID09IEFDUElfSU1PREVfRVhFQ1VURSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX05BTUVTLAogCQkJCSAgIiU0LjRzIE5vdCBmb3VuZCBpbiAlcCBbTm90IGFkZGluZ11cbiIsCkBAIC0zNzEsMTEgKzM5MiwxOCBAQAogCWlmICghbmV3X25vZGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQorI2lmZGVmIEFDUElfQVNMX0NPTVBJTEVSCisJLyoKKwkgKiBOb2RlIGlzIGFuIG9iamVjdCBkZWZpbmVkIGJ5IGFuIEV4dGVybmFsKCkgc3RhdGVtZW50CisJICovCisJaWYgKGZsYWdzICYgQUNQSV9OU19FWFRFUk5BTCkgeworCQluZXdfbm9kZS0+ZmxhZ3MgfD0gQU5PQkpfSVNfRVhURVJOQUw7CisJfQorI2VuZGlmCiAKIAkvKiBJbnN0YWxsIHRoZSBuZXcgb2JqZWN0IGludG8gdGhlIHBhcmVudCdzIGxpc3Qgb2YgY2hpbGRyZW4gKi8KIAogCWFjcGlfbnNfaW5zdGFsbF9ub2RlKHdhbGtfc3RhdGUsIG5vZGUsIG5ld19ub2RlLCB0eXBlKTsKIAkqcmV0dXJuX25vZGUgPSBuZXdfbm9kZTsKLQogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCmluZGV4IDNlN2NhZDUuLmFhNGU3OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN1dGlscy5jCkBAIC03OCwxNSArNzgsMTcgQEAKIAkJICAgICBjaGFyICppbnRlcm5hbF9uYW1lLCBhY3BpX3N0YXR1cyBsb29rdXBfc3RhdHVzKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1MzIgYmFkX25hbWU7CiAJY2hhciAqbmFtZSA9IE5VTEw7CiAKLQlhY3BpX3V0X3JlcG9ydF9lcnJvcihtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCJBQ1BJIEVycm9yICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChsb29rdXBfc3RhdHVzID09IEFFX0JBRF9DSEFSQUNURVIpIHsKKwogCQkvKiBUaGVyZSBpcyBhIG5vbi1hc2NpaSBjaGFyYWN0ZXIgaW4gdGhlIG5hbWUgKi8KIAotCQlhY3BpX29zX3ByaW50ZigiWzB4JTQuNFhdIChOT04tQVNDSUkpIiwKLQkJCSAgICAgICAqKEFDUElfQ0FTVF9QVFIodTMyLCBpbnRlcm5hbF9uYW1lKSkpOworCQlBQ1BJX01PVkVfMzJfVE9fMzIoJmJhZF9uYW1lLCBpbnRlcm5hbF9uYW1lKTsKKwkJYWNwaV9vc19wcmludGYoIlsweCU0LjRYXSAoTk9OLUFTQ0lJKSIsIGJhZF9uYW1lKTsKIAl9IGVsc2UgewogCQkvKiBDb252ZXJ0IHBhdGggdG8gZXh0ZXJuYWwgZm9ybWF0ICovCiAKQEAgLTEwMiw3ICsxMDQsNyBAQAogCQl9CiAKIAkJaWYgKG5hbWUpIHsKLQkJCUFDUElfTUVNX0ZSRUUobmFtZSk7CisJCQlBQ1BJX0ZSRUUobmFtZSk7CiAJCX0KIAl9CiAKQEAgLTEzNywxMSArMTM5LDEyIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlID0gcHJlZml4X25vZGU7CiAKLQlhY3BpX3V0X3JlcG9ydF9lcnJvcihtb2R1bGVfbmFtZSwgbGluZV9udW1iZXIpOworCWFjcGlfb3NfcHJpbnRmKCJBQ1BJIEVycm9yICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKIAogCWlmIChwYXRoKSB7Ci0JCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChwYXRoLCBwcmVmaXhfbm9kZSwKLQkJCQkJCSAgQUNQSV9OU19OT19VUFNFQVJDSCwgJm5vZGUpOworCQlzdGF0dXMgPQorCQkgICAgYWNwaV9uc19nZXRfbm9kZShwcmVmaXhfbm9kZSwgcGF0aCwgQUNQSV9OU19OT19VUFNFQVJDSCwKKwkJCQkgICAgICZub2RlKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlhY3BpX29zX3ByaW50ZigiW0NvdWxkIG5vdCBnZXQgbm9kZSBieSBwYXRobmFtZV0iKTsKIAkJfQpAQCAtMTg1LDcgKzE4OCw3IEBACiAJCX0KIAogCQlhY3BpX29zX3ByaW50ZigiWyVzXSAoTm9kZSAlcCkiLCAoY2hhciAqKWJ1ZmZlci5wb2ludGVyLCBub2RlKTsKLQkJQUNQSV9NRU1fRlJFRShidWZmZXIucG9pbnRlcik7CisJCUFDUElfRlJFRShidWZmZXIucG9pbnRlcik7CiAJfQogfQogCkBAIC0yMzksNyArMjQyLDcgQEAKIAogYWNwaV9vYmplY3RfdHlwZSBhY3BpX25zX2dldF90eXBlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19nZXRfdHlwZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZ2V0X3R5cGUpOwogCiAJaWYgKCFub2RlKSB7CiAJCUFDUElfV0FSTklORygoQUVfSU5GTywgIk51bGwgTm9kZSBwYXJhbWV0ZXIiKSk7CkBAIC0yNjQsOSArMjY3LDEwIEBACiAKIHUzMiBhY3BpX25zX2xvY2FsKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19sb2NhbCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfbG9jYWwpOwogCiAJaWYgKCFhY3BpX3V0X3ZhbGlkX29iamVjdF90eXBlKHR5cGUpKSB7CisKIAkJLyogVHlwZSBjb2RlIG91dCBvZiByYW5nZSAgKi8KIAogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJJbnZhbGlkIE9iamVjdCBUeXBlICVYIiwgdHlwZSkpOwpAQCAtMzYzLDcgKzM2Nyw3IEBACiAJY2hhciAqcmVzdWx0ID0gTlVMTDsKIAlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19idWlsZF9pbnRlcm5hbF9uYW1lIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19idWlsZF9pbnRlcm5hbF9uYW1lKTsKIAogCS8qIFNldHVwIHRoZSBjb3JyZWN0IHByZWZpeGVzLCBjb3VudHMsIGFuZCBwb2ludGVycyAqLwogCkBAIC00MTEsNiArNDE1LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IEFDUElfTkFNRV9TSVpFOyBpKyspIHsKIAkJCWlmIChhY3BpX25zX3ZhbGlkX3BhdGhfc2VwYXJhdG9yKCpleHRlcm5hbF9uYW1lKSB8fAogCQkJICAgICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSkgeworCiAJCQkJLyogUGFkIHRoZSBzZWdtZW50IHdpdGggdW5kZXJzY29yZShzKSBpZiBzZWdtZW50IGlzIHNob3J0ICovCiAKIAkJCQlyZXN1bHRbaV0gPSAnXyc7CkBAIC00NzMsNyArNDc4LDcgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3RyaW5nX2luZm8gaW5mbzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc19pbnRlcm5hbGl6ZV9uYW1lIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc19pbnRlcm5hbGl6ZV9uYW1lKTsKIAogCWlmICgoIWV4dGVybmFsX25hbWUpIHx8ICgqZXh0ZXJuYWxfbmFtZSA9PSAwKSB8fCAoIWNvbnZlcnRlZF9uYW1lKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC00ODYsNyArNDkxLDcgQEAKIAogCS8qIFdlIG5lZWQgYSBzZWdtZW50IHRvIHN0b3JlIHRoZSBpbnRlcm5hbCAgbmFtZSAqLwogCi0JaW50ZXJuYWxfbmFtZSA9IEFDUElfTUVNX0NBTExPQ0FURShpbmZvLmxlbmd0aCk7CisJaW50ZXJuYWxfbmFtZSA9IEFDUElfQUxMT0NBVEVfWkVST0VEKGluZm8ubGVuZ3RoKTsKIAlpZiAoIWludGVybmFsX25hbWUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQpAQCAtNDk2LDcgKzUwMSw3IEBACiAJaW5mby5pbnRlcm5hbF9uYW1lID0gaW50ZXJuYWxfbmFtZTsKIAlzdGF0dXMgPSBhY3BpX25zX2J1aWxkX2ludGVybmFsX25hbWUoJmluZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlBQ1BJX01FTV9GUkVFKGludGVybmFsX25hbWUpOworCQlBQ1BJX0ZSRUUoaW50ZXJuYWxfbmFtZSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIApAQCAtNTMzLDcgKzUzOCw3IEBACiAJYWNwaV9uYXRpdmVfdWludCBpID0gMDsKIAlhY3BpX25hdGl2ZV91aW50IGogPSAwOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZXh0ZXJuYWxpemVfbmFtZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZXh0ZXJuYWxpemVfbmFtZSk7CiAKIAlpZiAoIWludGVybmFsX25hbWVfbGVuZ3RoIHx8ICFpbnRlcm5hbF9uYW1lIHx8ICFjb252ZXJ0ZWRfbmFtZSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC02MjgsNyArNjMzLDcgQEAKIAkvKgogCSAqIEJ1aWxkIGNvbnZlcnRlZF9uYW1lCiAJICovCi0JKmNvbnZlcnRlZF9uYW1lID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7CisJKmNvbnZlcnRlZF9uYW1lID0gQUNQSV9BTExPQ0FURV9aRVJPRUQocmVxdWlyZWRfbGVuZ3RoKTsKIAlpZiAoISgqY29udmVydGVkX25hbWUpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KQEAgLTY4MSwxMyArNjg2LDkgQEAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAkvKgotCSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4KKwkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24KIAkgKi8KLQlpZiAoIWhhbmRsZSkgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCWlmIChoYW5kbGUgPT0gQUNQSV9ST09UX09CSkVDVCkgeworCWlmICgoIWhhbmRsZSkgfHwgKGhhbmRsZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKSkgewogCQlyZXR1cm4gKGFjcGlfZ2JsX3Jvb3Rfbm9kZSk7CiAJfQogCkBAIC02OTcsNyArNjk4LDcgQEAKIAkJcmV0dXJuIChOVUxMKTsKIAl9CiAKLQlyZXR1cm4gKChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKWhhbmRsZSk7CisJcmV0dXJuIChBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlLCBoYW5kbGUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTc1Miw3ICs3NTMsNyBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfdGVybWluYXRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShuc190ZXJtaW5hdGUpOwogCiAJLyoKIAkgKiAxKSBGcmVlIHRoZSBlbnRpcmUgbmFtZXNwYWNlIC0tIGFsbCBub2RlcyBhbmQgb2JqZWN0cwpAQCAtNzkyLDkgKzc5MywxMCBAQAogCiB1MzIgYWNwaV9uc19vcGVuc19zY29wZShhY3BpX29iamVjdF90eXBlIHR5cGUpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoIm5zX29wZW5zX3Njb3BlIiwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUihuc19vcGVuc19zY29wZSwgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKIAogCWlmICghYWNwaV91dF92YWxpZF9vYmplY3RfdHlwZSh0eXBlKSkgeworCiAJCS8qIHR5cGUgY29kZSBvdXQgb2YgcmFuZ2UgICovCiAKIAkJQUNQSV9XQVJOSU5HKChBRV9JTkZPLCAiSW52YWxpZCBPYmplY3QgVHlwZSAlWCIsIHR5cGUpKTsKQEAgLTgwNiwxMiArODA4LDEyIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aAorICogRlVOQ1RJT046ICAgIGFjcGlfbnNfZ2V0X25vZGUKICAqCiAgKiBQQVJBTUVURVJTOiAgKlBhdGhuYW1lICAgLSBOYW1lIHRvIGJlIGZvdW5kLCBpbiBleHRlcm5hbCAoQVNMKSBmb3JtYXQuIFRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgXCAoYmFja3NsYXNoKSBhbmQgXiAoY2FyYXQpIHByZWZpeGVzLCBhbmQgdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuIChwZXJpb2QpIHRvIHNlcGFyYXRlIHNlZ21lbnRzIGFyZSBzdXBwb3J0ZWQuCi0gKiAgICAgICAgICAgICAgc3RhcnRfbm9kZSAgLSBSb290IG9mIHN1YnRyZWUgdG8gYmUgc2VhcmNoZWQsIG9yIE5TX0FMTCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgcHJlZml4X25vZGUgIC0gUm9vdCBvZiBzdWJ0cmVlIHRvIGJlIHNlYXJjaGVkLCBvciBOU19BTEwgZm9yIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCBvZiB0aGUgbmFtZSBzcGFjZS4gIElmIE5hbWUgaXMgZnVsbHkKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZCAoZmlyc3QgczggaXMgJ1wnKSwgdGhlIHBhc3NlZCB2YWx1ZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgU2NvcGUgd2lsbCBub3QgYmUgYWNjZXNzZWQuCkBAIC04MjcsMjMgKzgyOSwyOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChjaGFyICpwYXRobmFtZSwKLQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZSwKLQkJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0dXJuX25vZGUpCithY3BpX25zX2dldF9ub2RlKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpwcmVmaXhfbm9kZSwKKwkJIGNoYXIgKnBhdGhuYW1lLAorCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSBzY29wZV9pbmZvOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQljaGFyICppbnRlcm5hbF9wYXRoID0gTlVMTDsKKwljaGFyICppbnRlcm5hbF9wYXRoOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoIm5zX2dldF9ub2RlX2J5X3BhdGgiLCBwYXRobmFtZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIobnNfZ2V0X25vZGUsIHBhdGhuYW1lKTsKIAotCWlmIChwYXRobmFtZSkgewotCQkvKiBDb252ZXJ0IHBhdGggdG8gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KLQotCQlzdGF0dXMgPSBhY3BpX25zX2ludGVybmFsaXplX25hbWUocGF0aG5hbWUsICZpbnRlcm5hbF9wYXRoKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwlpZiAoIXBhdGhuYW1lKSB7CisJCSpyZXR1cm5fbm9kZSA9IHByZWZpeF9ub2RlOworCQlpZiAoIXByZWZpeF9ub2RlKSB7CisJCQkqcmV0dXJuX25vZGUgPSBhY3BpX2dibF9yb290X25vZGU7CiAJCX0KKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwl9CisKKwkvKiBDb252ZXJ0IHBhdGggdG8gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KKworCXN0YXR1cyA9IGFjcGlfbnNfaW50ZXJuYWxpemVfbmFtZShwYXRobmFtZSwgJmludGVybmFsX3BhdGgpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKIAkvKiBNdXN0IGxvY2sgbmFtZXNwYWNlIGR1cmluZyBsb29rdXAgKi8KQEAgLTg1NSwyNiArODYzLDIzIEBACiAKIAkvKiBTZXR1cCBsb29rdXAgc2NvcGUgKHNlYXJjaCBzdGFydGluZyBwb2ludCkgKi8KIAotCXNjb3BlX2luZm8uc2NvcGUubm9kZSA9IHN0YXJ0X25vZGU7CisJc2NvcGVfaW5mby5zY29wZS5ub2RlID0gcHJlZml4X25vZGU7CiAKIAkvKiBMb29rdXAgdGhlIG5hbWUgaW4gdGhlIG5hbWVzcGFjZSAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19sb29rdXAoJnNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsCi0JCQkJQUNQSV9UWVBFX0FOWSwgQUNQSV9JTU9ERV9FWEVDVVRFLAotCQkJCShmbGFncyB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSwKLQkJCQlOVUxMLCByZXR1cm5fbm9kZSk7CisJc3RhdHVzID0gYWNwaV9uc19sb29rdXAoJnNjb3BlX2luZm8sIGludGVybmFsX3BhdGgsIEFDUElfVFlQRV9BTlksCisJCQkJQUNQSV9JTU9ERV9FWEVDVVRFLAorCQkJCShmbGFncyB8IEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFKSwgTlVMTCwKKwkJCQlyZXR1cm5fbm9kZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIiVzLCAlc1xuIiwKLQkJCQkgIGludGVybmFsX3BhdGgsCi0JCQkJICBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSkpOworCQkJCSAgcGF0aG5hbWUsIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJfQogCiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX05BTUVTUEFDRSk7CiAKICAgICAgIGNsZWFudXA6Ci0JaWYgKGludGVybmFsX3BhdGgpIHsKLQkJQUNQSV9NRU1fRlJFRShpbnRlcm5hbF9wYXRoKTsKLQl9CisJQUNQSV9GUkVFKGludGVybmFsX3BhdGgpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC05NjAsOSArOTY1LDEwIEBACiB7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBhcmVudF9ub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgibnNfZmluZF9wYXJlbnRfbmFtZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfZmluZF9wYXJlbnRfbmFtZSk7CiAKIAlpZiAoY2hpbGRfbm9kZSkgeworCiAJCS8qIFZhbGlkIGVudHJ5LiAgR2V0IHRoZSBwYXJlbnQgTm9kZSAqLwogCiAJCXBhcmVudF9ub2RlID0gYWNwaV9uc19nZXRfcGFyZW50X25vZGUoY2hpbGRfbm9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3dhbGsuYwppbmRleCBmY2FiMWU3Li5jOGY2YmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zd2Fsay5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN3YWxrLmMKQEAgLTc2LDYgKzc2LDcgQEAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKIAlpZiAoIWNoaWxkX25vZGUpIHsKKwogCQkvKiBJdCdzIHJlYWxseSB0aGUgcGFyZW50J3MgX3Njb3BlXyB0aGF0IHdlIHdhbnQgKi8KIAogCQlpZiAocGFyZW50X25vZGUtPmNoaWxkKSB7CkBAIC05Miw2ICs5Myw3IEBACiAJLyogSWYgYW55IHR5cGUgaXMgT0ssIHdlIGFyZSBkb25lICovCiAKIAlpZiAodHlwZSA9PSBBQ1BJX1RZUEVfQU5ZKSB7CisKIAkJLyogbmV4dF9ub2RlIGlzIE5VTEwgaWYgd2UgYXJlIGF0IHRoZSBlbmQtb2YtbGlzdCAqLwogCiAJCXJldHVybiAobmV4dF9ub2RlKTsKQEAgLTEwMCw2ICsxMDIsNyBAQAogCS8qIE11c3Qgc2VhcmNoIGZvciB0aGUgbm9kZSAtLSBidXQgd2l0aGluIHRoaXMgc2NvcGUgb25seSAqLwogCiAJd2hpbGUgKG5leHRfbm9kZSkgeworCiAJCS8qIElmIHR5cGUgbWF0Y2hlcywgd2UgYXJlIGRvbmUgKi8KIAogCQlpZiAobmV4dF9ub2RlLT50eXBlID09IHR5cGUpIHsKQEAgLTE2MSw3ICsxNjQsNyBAQAogCWFjcGlfb2JqZWN0X3R5cGUgY2hpbGRfdHlwZTsKIAl1MzIgbGV2ZWw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJuc193YWxrX25hbWVzcGFjZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UobnNfd2Fsa19uYW1lc3BhY2UpOwogCiAJLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgbmFtZXNwYWNlIFJvb3QgTm9kZSAqLwogCkBAIC0xODIsNiArMTg1LDcgQEAKIAkgKiBidWJibGVkIHVwIHRvIChhbmQgcGFzc2VkKSB0aGUgb3JpZ2luYWwgcGFyZW50IGhhbmRsZSAoc3RhcnRfZW50cnkpCiAJICovCiAJd2hpbGUgKGxldmVsID4gMCkgeworCiAJCS8qIEdldCB0aGUgbmV4dCBub2RlIGluIHRoaXMgc2NvcGUuICBOdWxsIGlmIG5vdCBmb3VuZCAqLwogCiAJCXN0YXR1cyA9IEFFX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCmluZGV4IGE5NWY2MzYuLjZkOWJkNDVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZldmFsLmMKKysrIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmZXZhbC5jCkBAIC00Miw4ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogI2luY2x1ZGUgPGFjcGkvYWNpbnRlcnAuaD4KQEAgLTUxLDYgKzQ5LDcgQEAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX05BTUVTUEFDRQogQUNQSV9NT0RVTEVfTkFNRSgibnN4ZmV2YWwiKQogCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkCkBAIC03MSwxOCArNzAsMTcgQEAKICAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogYWNwaV9zdGF0dXMKIGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCSAgIGFjcGlfc3RyaW5nIHBhdGhuYW1lLAotCQkJICAgc3RydWN0IGFjcGlfb2JqZWN0X2xpc3QgKmV4dGVybmFsX3BhcmFtcywKLQkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0dXJuX2J1ZmZlciwKKwkJCSAgIHN0cnVjdCBhY3BpX29iamVjdF9saXN0ICogZXh0ZXJuYWxfcGFyYW1zLAorCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICogcmV0dXJuX2J1ZmZlciwKIAkJCSAgIGFjcGlfb2JqZWN0X3R5cGUgcmV0dXJuX3R5cGUpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXU4IG11c3RfZnJlZSA9IEZBTFNFOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmFsdWF0ZV9vYmplY3RfdHlwZWQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZXZhbHVhdGVfb2JqZWN0X3R5cGVkKTsKIAogCS8qIFJldHVybiBidWZmZXIgbXVzdCBiZSB2YWxpZCAqLwogCkBAIC0xMTAsNiArMTA4LDcgQEAKIAl9CiAKIAlpZiAocmV0dXJuX2J1ZmZlci0+bGVuZ3RoID09IDApIHsKKwogCQkvKiBFcnJvciBiZWNhdXNlIGNhbGxlciBzcGVjaWZpY2FsbHkgYXNrZWQgZm9yIGEgcmV0dXJuIHZhbHVlICovCiAKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywgIk5vIHJldHVybiB2YWx1ZSIpKTsKQEAgLTEzMSw2ICsxMzAsNyBAQAogCQkgICAgYWNwaV91dF9nZXRfdHlwZV9uYW1lKHJldHVybl90eXBlKSkpOwogCiAJaWYgKG11c3RfZnJlZSkgeworCiAJCS8qIENhbGxlciB1c2VkIEFDUElfQUxMT0NBVEVfQlVGRkVSLCBmcmVlIHRoZSByZXR1cm4gYnVmZmVyICovCiAKIAkJYWNwaV9vc19mcmVlKHJldHVybl9idWZmZXItPnBvaW50ZXIpOwpAQCAtMTQwLDYgKzE0MCw4IEBACiAJcmV0dXJuX2J1ZmZlci0+bGVuZ3RoID0gMDsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiB9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX29iamVjdF90eXBlZCkKICNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNjEsNyArMTYzLDYgQEAKICAqICAgICAgICAgICAgICBiZSB2YWxpZCAobm9uLW51bGwpCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZXZhbHVhdGVfb2JqZWN0KGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJICAgICBhY3BpX3N0cmluZyBwYXRobmFtZSwKQEAgLTE3MCw1MSArMTcxLDYxIEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfc3RhdHVzIHN0YXR1czI7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOwogCWFjcGlfc2l6ZSBidWZmZXJfc3BhY2VfbmVlZGVkOwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9ldmFsdWF0ZV9vYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZXZhbHVhdGVfb2JqZWN0KTsKIAotCWluZm8ubm9kZSA9IGhhbmRsZTsKLQlpbmZvLnBhcmFtZXRlcnMgPSBOVUxMOwotCWluZm8ucmV0dXJuX29iamVjdCA9IE5VTEw7Ci0JaW5mby5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fQVJHUzsKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZXZhbHVhdGlvbiBpbmZvcm1hdGlvbiBibG9jayAqLworCisJaW5mbyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvKSk7CisJaWYgKCFpbmZvKSB7CisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCX0KKworCWluZm8tPnBhdGhuYW1lID0gcGF0aG5hbWU7CisJaW5mby0+cGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CisKKwkvKiBDb252ZXJ0IGFuZCB2YWxpZGF0ZSB0aGUgZGV2aWNlIGhhbmRsZSAqLworCisJaW5mby0+cHJlZml4X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShoYW5kbGUpOworCWlmICghaW5mby0+cHJlZml4X25vZGUpIHsKKwkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKKwkJZ290byBjbGVhbnVwOworCX0KIAogCS8qCi0JICogSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIHRoZSBvYmplY3QKLQkgKiAod2hpY2ggbXVzdCBiZSBhIGNvbnRyb2wgbWV0aG9kKSwgdGhlIGV4dGVybmFsIG9iamVjdHMKLQkgKiBtdXN0IGJlIGNvbnZlcnRlZCB0byBpbnRlcm5hbCBvYmplY3RzCisJICogSWYgdGhlcmUgYXJlIHBhcmFtZXRlcnMgdG8gYmUgcGFzc2VkIHRvIGEgY29udHJvbCBtZXRob2QsIHRoZSBleHRlcm5hbAorCSAqIG9iamVjdHMgbXVzdCBhbGwgYmUgY29udmVydGVkIHRvIGludGVybmFsIG9iamVjdHMKIAkgKi8KIAlpZiAoZXh0ZXJuYWxfcGFyYW1zICYmIGV4dGVybmFsX3BhcmFtcy0+Y291bnQpIHsKIAkJLyoKIAkJICogQWxsb2NhdGUgYSBuZXcgcGFyYW1ldGVyIGJsb2NrIGZvciB0aGUgaW50ZXJuYWwgb2JqZWN0cwogCQkgKiBBZGQgMSB0byBjb3VudCB0byBhbGxvdyBmb3IgbnVsbCB0ZXJtaW5hdGVkIGludGVybmFsIGxpc3QKIAkJICovCi0JCWluZm8ucGFyYW1ldGVycyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkKLQkJCQkJCSAgICAgIGV4dGVybmFsX3BhcmFtcy0+Y291bnQgKwotCQkJCQkJICAgICAgMSkgKiBzaXplb2Yodm9pZCAqKSk7Ci0JCWlmICghaW5mby5wYXJhbWV0ZXJzKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKKwkJaW5mby0+cGFyYW1ldGVycyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKQorCQkJCQkJCSBleHRlcm5hbF9wYXJhbXMtPgorCQkJCQkJCSBjb3VudCArCisJCQkJCQkJIDEpICogc2l6ZW9mKHZvaWQgKikpOworCQlpZiAoIWluZm8tPnBhcmFtZXRlcnMpIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWdvdG8gY2xlYW51cDsKIAkJfQogCi0JCS8qCi0JCSAqIENvbnZlcnQgZWFjaCBleHRlcm5hbCBvYmplY3QgaW4gdGhlIGxpc3QgdG8gYW4KLQkJICogaW50ZXJuYWwgb2JqZWN0Ci0JCSAqLworCQkvKiBDb252ZXJ0IGVhY2ggZXh0ZXJuYWwgb2JqZWN0IGluIHRoZSBsaXN0IHRvIGFuIGludGVybmFsIG9iamVjdCAqLworCiAJCWZvciAoaSA9IDA7IGkgPCBleHRlcm5hbF9wYXJhbXMtPmNvdW50OyBpKyspIHsKIAkJCXN0YXR1cyA9CiAJCQkgICAgYWNwaV91dF9jb3B5X2VvYmplY3RfdG9faW9iamVjdCgmZXh0ZXJuYWxfcGFyYW1zLT4KIAkJCQkJCQkgICAgcG9pbnRlcltpXSwKLQkJCQkJCQkgICAgJmluZm8uCisJCQkJCQkJICAgICZpbmZvLT4KIAkJCQkJCQkgICAgcGFyYW1ldGVyc1tpXSk7CiAJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdChpbmZvLgotCQkJCQkJCQkgICAgcGFyYW1ldGVycyk7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJCQkJZ290byBjbGVhbnVwOwogCQkJfQogCQl9Ci0JCWluZm8ucGFyYW1ldGVyc1tleHRlcm5hbF9wYXJhbXMtPmNvdW50XSA9IE5VTEw7CisJCWluZm8tPnBhcmFtZXRlcnNbZXh0ZXJuYWxfcGFyYW1zLT5jb3VudF0gPSBOVUxMOwogCX0KIAogCS8qCkBAIC0yMjQsNDMgKzIzNSwzMSBAQAogCSAqIDMpIFZhbGlkIGhhbmRsZQogCSAqLwogCWlmICgocGF0aG5hbWUpICYmIChhY3BpX25zX3ZhbGlkX3Jvb3RfcHJlZml4KHBhdGhuYW1lWzBdKSkpIHsKLQkJLyoKLQkJICogIFRoZSBwYXRoIGlzIGZ1bGx5IHF1YWxpZmllZCwganVzdCBldmFsdWF0ZSBieSBuYW1lCi0JCSAqLwotCQlzdGF0dXMgPSBhY3BpX25zX2V2YWx1YXRlX2J5X25hbWUocGF0aG5hbWUsICZpbmZvKTsKKworCQkvKiBUaGUgcGF0aCBpcyBmdWxseSBxdWFsaWZpZWQsIGp1c3QgZXZhbHVhdGUgYnkgbmFtZSAqLworCisJCWluZm8tPnByZWZpeF9ub2RlID0gTlVMTDsKKwkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKIAl9IGVsc2UgaWYgKCFoYW5kbGUpIHsKIAkJLyoKLQkJICogQSBoYW5kbGUgaXMgb3B0aW9uYWwgaWZmIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lCi0JCSAqIGlzIHNwZWNpZmllZC4gIFNpbmNlIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCBmdWxseQotCQkgKiBxdWFsaWZpZWQgbmFtZXMgYWJvdmUsIHRoaXMgaXMgYW4gZXJyb3IKKwkJICogQSBoYW5kbGUgaXMgb3B0aW9uYWwgaWZmIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lIGlzIHNwZWNpZmllZC4KKwkJICogU2luY2Ugd2UndmUgYWxyZWFkeSBoYW5kbGVkIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBhYm92ZSwgdGhpcyBpcworCQkgKiBhbiBlcnJvcgogCQkgKi8KIAkJaWYgKCFwYXRobmFtZSkgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkJvdGggSGFuZGxlIGFuZCBQYXRobmFtZSBhcmUgTlVMTCIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiQm90aCBIYW5kbGUgYW5kIFBhdGhuYW1lIGFyZSBOVUxMIikpOwogCQl9IGVsc2UgewotCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJCQkgICAgIkhhbmRsZSBpcyBOVUxMIGFuZCBQYXRobmFtZSBpcyByZWxhdGl2ZSIpKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywKKwkJCQkJICAiTnVsbCBIYW5kbGUgd2l0aCByZWxhdGl2ZSBwYXRobmFtZSBbJXNdIiwKKwkJCQkJICBwYXRobmFtZSkpOwogCQl9CiAKIAkJc3RhdHVzID0gQUVfQkFEX1BBUkFNRVRFUjsKIAl9IGVsc2UgewotCQkvKgotCQkgKiBXZSBnZXQgaGVyZSBpZiB3ZSBoYXZlIGEgaGFuZGxlIC0tIGFuZCBpZiB3ZSBoYXZlIGEKLQkJICogcGF0aG5hbWUgaXQgaXMgcmVsYXRpdmUuICBUaGUgaGFuZGxlIHdpbGwgYmUgdmFsaWRhdGVkCi0JCSAqIGluIHRoZSBsb3dlciBwcm9jZWR1cmVzCi0JCSAqLwotCQlpZiAoIXBhdGhuYW1lKSB7Ci0JCQkvKgotCQkJICogVGhlIG51bGwgcGF0aG5hbWUgY2FzZSBtZWFucyB0aGUgaGFuZGxlIGlzIGZvcgotCQkJICogdGhlIGFjdHVhbCBvYmplY3QgdG8gYmUgZXZhbHVhdGVkCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfYnlfaGFuZGxlKCZpbmZvKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBCb3RoIGEgSGFuZGxlIGFuZCBhIHJlbGF0aXZlIFBhdGhuYW1lCi0JCQkgKi8KLQkJCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUocGF0aG5hbWUsICZpbmZvKTsKLQkJfQorCQkvKiBXZSBoYXZlIGEgbmFtZXNwYWNlIGEgbm9kZSBhbmQgYSBwb3NzaWJsZSByZWxhdGl2ZSBwYXRoICovCisKKwkJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKIAl9CiAKIAkvKgpAQCAtMjY4LDEwICsyNjcsMTAgQEAKIAkgKiBjb3B5IHRoZSByZXR1cm4gdmFsdWUgdG8gYW4gZXh0ZXJuYWwgb2JqZWN0LgogCSAqLwogCWlmIChyZXR1cm5fYnVmZmVyKSB7Ci0JCWlmICghaW5mby5yZXR1cm5fb2JqZWN0KSB7CisJCWlmICghaW5mby0+cmV0dXJuX29iamVjdCkgewogCQkJcmV0dXJuX2J1ZmZlci0+bGVuZ3RoID0gMDsKIAkJfSBlbHNlIHsKLQkJCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0KSA9PQorCQkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbmZvLT5yZXR1cm5fb2JqZWN0KSA9PQogCQkJICAgIEFDUElfREVTQ19UWVBFX05BTUVEKSB7CiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSByZWNlaXZlZCBhIE5TIE5vZGUgYXMgYSByZXR1cm4gb2JqZWN0LCB0aGlzIG1lYW5zIHRoYXQKQEAgLTI4MiwxOSArMjgxLDE5IEBACiAJCQkJICogc3VwcG9ydCBmb3IgdmFyaW91cyB0eXBlcyBhdCBhIGxhdGVyIGRhdGUgaWYgbmVjZXNzYXJ5LgogCQkJCSAqLwogCQkJCXN0YXR1cyA9IEFFX1RZUEU7Ci0JCQkJaW5mby5yZXR1cm5fb2JqZWN0ID0gTlVMTDsJLyogTm8gbmVlZCB0byBkZWxldGUgYSBOUyBOb2RlICovCisJCQkJaW5mby0+cmV0dXJuX29iamVjdCA9IE5VTEw7CS8qIE5vIG5lZWQgdG8gZGVsZXRlIGEgTlMgTm9kZSAqLwogCQkJCXJldHVybl9idWZmZXItPmxlbmd0aCA9IDA7CiAJCQl9CiAKIAkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkJCS8qCi0JCQkJICogRmluZCBvdXQgaG93IGxhcmdlIGEgYnVmZmVyIGlzIG5lZWRlZAotCQkJCSAqIHRvIGNvbnRhaW4gdGhlIHJldHVybmVkIG9iamVjdAotCQkJCSAqLworCisJCQkJLyogR2V0IHRoZSBzaXplIG9mIHRoZSByZXR1cm5lZCBvYmplY3QgKi8KKwogCQkJCXN0YXR1cyA9Ci0JCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF9zaXplKGluZm8ucmV0dXJuX29iamVjdCwKKwkJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3NpemUoaW5mby0+cmV0dXJuX29iamVjdCwKIAkJCQkJCQkgICAgJmJ1ZmZlcl9zcGFjZV9uZWVkZWQpOwogCQkJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCiAJCQkJCS8qIFZhbGlkYXRlL0FsbG9jYXRlL0NsZWFyIGNhbGxlciBidWZmZXIgKi8KIAogCQkJCQlzdGF0dXMgPQpAQCAtMzAzLDcgKzMwMiw4IEBACiAJCQkJCSAgICAgYnVmZmVyX3NwYWNlX25lZWRlZCk7CiAJCQkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQkJCQkJLyoKLQkJCQkJCSAqIENhbGxlcidzIGJ1ZmZlciBpcyB0b28gc21hbGwgb3IgYSBuZXcgb25lIGNhbid0IGJlIGFsbG9jYXRlZAorCQkJCQkJICogQ2FsbGVyJ3MgYnVmZmVyIGlzIHRvbyBzbWFsbCBvciBhIG5ldyBvbmUgY2FuJ3QKKwkJCQkJCSAqIGJlIGFsbG9jYXRlZAogCQkJCQkJICovCiAJCQkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkJCQkJCSAgIk5lZWRlZCBidWZmZXIgc2l6ZSAlWCwgJXNcbiIsCkBAIC0zMTIsMTIgKzMxMiwxMSBAQAogCQkJCQkJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbgogCQkJCQkJCQkgIChzdGF0dXMpKSk7CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKgotCQkJCQkJICogIFdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgb2JqZWN0LCBidWlsZCBpdAotCQkJCQkJICovCisJCQkJCQkvKiBXZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIG9iamVjdCwgYnVpbGQgaXQgKi8KKwogCQkJCQkJc3RhdHVzID0KIAkJCQkJCSAgICBhY3BpX3V0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Ci0JCQkJCQkgICAgKGluZm8ucmV0dXJuX29iamVjdCwKKwkJCQkJCSAgICAoaW5mby0+cmV0dXJuX29iamVjdCwKIAkJCQkJCSAgICAgcmV0dXJuX2J1ZmZlcik7CiAJCQkJCX0KIAkJCQl9CkBAIC0zMjUsMzUgKzMyNCwzNyBAQAogCQl9CiAJfQogCi0JaWYgKGluZm8ucmV0dXJuX29iamVjdCkgeworCWlmIChpbmZvLT5yZXR1cm5fb2JqZWN0KSB7CiAJCS8qCi0JCSAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdC4gIE5PVEU6IEludGVycHJldGVyCi0JCSAqIG11c3QgYmUgbG9ja2VkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLgorCQkgKiBEZWxldGUgdGhlIGludGVybmFsIHJldHVybiBvYmplY3QuIE5PVEU6IEludGVycHJldGVyIG11c3QgYmUKKwkJICogbG9ja2VkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uLgogCQkgKi8KIAkJc3RhdHVzMiA9IGFjcGlfZXhfZW50ZXJfaW50ZXJwcmV0ZXIoKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMyKSkgewotCQkJLyoKLQkJCSAqIERlbGV0ZSB0aGUgaW50ZXJuYWwgcmV0dXJuIG9iamVjdC4gKE9yIGF0IGxlYXN0Ci0JCQkgKiBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBieSBvbmUpCi0JCQkgKi8KLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOworCisJCQkvKiBSZW1vdmUgb25lIHJlZmVyZW5jZSBvbiB0aGUgcmV0dXJuIG9iamVjdCAoc2hvdWxkIGRlbGV0ZSBpdCkgKi8KKworCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOwogCQkJYWNwaV9leF9leGl0X2ludGVycHJldGVyKCk7CiAJCX0KIAl9CiAKLQkvKgotCSAqIEZyZWUgdGhlIGlucHV0IHBhcmFtZXRlciBsaXN0IChpZiB3ZSBjcmVhdGVkIG9uZSksCi0JICovCi0JaWYgKGluZm8ucGFyYW1ldGVycykgeworICAgICAgY2xlYW51cDoKKworCS8qIEZyZWUgdGhlIGlucHV0IHBhcmFtZXRlciBsaXN0IChpZiB3ZSBjcmVhdGVkIG9uZSkgKi8KKworCWlmIChpbmZvLT5wYXJhbWV0ZXJzKSB7CisKIAkJLyogRnJlZSB0aGUgYWxsb2NhdGVkIHBhcmFtZXRlciBibG9jayAqLwogCi0JCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KGluZm8ucGFyYW1ldGVycyk7CisJCWFjcGlfdXRfZGVsZXRlX2ludGVybmFsX29iamVjdF9saXN0KGluZm8tPnBhcmFtZXRlcnMpOwogCX0KIAorCUFDUElfRlJFRShpbmZvKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2V2YWx1YXRlX29iamVjdCk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9ldmFsdWF0ZV9vYmplY3QpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMzg0LDcgKzM4NSw2IEBACiAgKiAgICAgICAgICAgICAgZnVuY3Rpb24sIGV0Yy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV93YWxrX25hbWVzcGFjZShhY3BpX29iamVjdF90eXBlIHR5cGUsCiAJCSAgICBhY3BpX2hhbmRsZSBzdGFydF9vYmplY3QsCkBAIC0zOTQsNyArMzk0LDcgQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3dhbGtfbmFtZXNwYWNlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3dhbGtfbmFtZXNwYWNlKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTQyMSw3ICs0MjEsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19uYW1lc3BhY2UpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfd2Fsa19uYW1lc3BhY2UpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDM2LDcgKzQzNiw2IEBACiAgKiAgICAgICAgICAgICAgb24gdGhhdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjayhhY3BpX2hhbmRsZSBvYmpfaGFuZGxlLAogCQkJICAgIHUzMiBuZXN0aW5nX2xldmVsLApAQCAtNDczLDYgKzQ3Miw3IEBACiAJfQogCiAJaWYgKCEoZmxhZ3MgJiBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCkpIHsKKwogCQkvKiBEb24ndCBleGFtaW5lIGNoaWxkcmVuIG9mIHRoZSBkZXZpY2UgaWYgbm90IHByZXNlbnQgKi8KIAogCQlyZXR1cm4gKEFFX0NUUkxfREVQVEgpOwpAQCAtNDg5LDYgKzQ4OSw3IEBACiAJCX0KIAogCQlpZiAoQUNQSV9TVFJOQ01QKGhpZC52YWx1ZSwgaW5mby0+aGlkLCBzaXplb2YoaGlkLnZhbHVlKSkgIT0gMCkgeworCiAJCQkvKiBHZXQgdGhlIGxpc3Qgb2YgQ29tcGF0aWJsZSBJRHMgKi8KIAogCQkJc3RhdHVzID0gYWNwaV91dF9leGVjdXRlX0NJRChub2RlLCAmY2lkKTsKQEAgLTUwNSwxMSArNTA2LDExIEBACiAJCQkJCQkgc2l6ZW9mKHN0cnVjdAogCQkJCQkJCWFjcGlfY29tcGF0aWJsZV9pZCkpICE9CiAJCQkJICAgIDApIHsKLQkJCQkJQUNQSV9NRU1fRlJFRShjaWQpOworCQkJCQlBQ1BJX0ZSRUUoY2lkKTsKIAkJCQkJcmV0dXJuIChBRV9PSyk7CiAJCQkJfQogCQkJfQotCQkJQUNQSV9NRU1fRlJFRShjaWQpOworCQkJQUNQSV9GUkVFKGNpZCk7CiAJCX0KIAl9CiAKQEAgLTU1MSw3ICs1NTIsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9nZXRfZGV2aWNlc19pbmZvIGluZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9kZXZpY2VzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF9kZXZpY2VzKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKQEAgLTU2Myw5ICs1NjQsOSBAQAogCSAqIFdlJ3JlIGdvaW5nIHRvIGNhbGwgdGhlaXIgY2FsbGJhY2sgZnJvbSBPVVIgY2FsbGJhY2ssIHNvIHdlIG5lZWQKIAkgKiB0byBrbm93IHdoYXQgaXQgaXMsIGFuZCB0aGVpciBjb250ZXh0IHBhcmFtZXRlci4KIAkgKi8KKwlpbmZvLmhpZCA9IEhJRDsKIAlpbmZvLmNvbnRleHQgPSBjb250ZXh0OwogCWluZm8udXNlcl9mdW5jdGlvbiA9IHVzZXJfZnVuY3Rpb247Ci0JaW5mby5oaWQgPSBISUQ7CiAKIAkvKgogCSAqIExvY2sgdGhlIG5hbWVzcGFjZSBhcm91bmQgdGhlIHdhbGsuCkBAIC01NzgsOSArNTc5LDggQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLAotCQkJCQlBQ1BJX1JPT1RfT0JKRUNULCBBQ1BJX1VJTlQzMl9NQVgsCi0JCQkJCUFDUElfTlNfV0FMS19VTkxPQ0ssCisJc3RhdHVzID0gYWNwaV9uc193YWxrX25hbWVzcGFjZShBQ1BJX1RZUEVfREVWSUNFLCBBQ1BJX1JPT1RfT0JKRUNULAorCQkJCQlBQ1BJX1VJTlQzMl9NQVgsIEFDUElfTlNfV0FMS19VTkxPQ0ssCiAJCQkJCWFjcGlfbnNfZ2V0X2RldmljZV9jYWxsYmFjaywgJmluZm8sCiAJCQkJCXJldHVybl92YWx1ZSk7CiAKQEAgLTU4OCw3ICs1ODgsNyBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RldmljZXMpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2RldmljZXMpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNjAzLDcgKzYwMyw2IEBACiAgKiBERVNDUklQVElPTjogQXR0YWNoIGFyYml0cmFyeSBkYXRhIGFuZCBoYW5kbGVyIHRvIGEgbmFtZXNwYWNlIG5vZGUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfYXR0YWNoX2RhdGEoYWNwaV9oYW5kbGUgb2JqX2hhbmRsZSwKIAkJIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqZGF0YSkKQEAgLTYzNyw2ICs2MzYsOCBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfYXR0YWNoX2RhdGEpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZGV0YWNoX2RhdGEKQEAgLTY0OSw3ICs2NTAsNiBAQAogICogREVTQ1JJUFRJT046IFJlbW92ZSBkYXRhIHRoYXQgd2FzIHByZXZpb3VzbHkgYXR0YWNoZWQgdG8gYSBub2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2RldGFjaF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlcikKIHsKQEAgLTY4Miw2ICs2ODIsOCBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGV0YWNoX2RhdGEpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2RhdGEKQEAgLTY5NSw3ICs2OTcsNiBAQAogICogREVTQ1JJUFRJT046IFJldHJpZXZlIGRhdGEgdGhhdCB3YXMgcHJldmlvdXNseSBhdHRhY2hlZCB0byBhIG5hbWVzcGFjZSBub2RlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9kYXRhKGFjcGlfaGFuZGxlIG9ial9oYW5kbGUsIGFjcGlfb2JqZWN0X2hhbmRsZXIgaGFuZGxlciwgdm9pZCAqKmRhdGEpCiB7CkBAIC03MjcsMyArNzI4LDUgQEAKIAkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTkFNRVNQQUNFKTsKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9kYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jIGIvZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc3hmbmFtZS5jCmluZGV4IDhjZDg2NzUuLjk3ODIxM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm5hbWUuYworKysgYi9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZuYW1lLmMKQEAgLTQyLDggKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKQEAgLTExNCw5ICsxMTIsOCBAQAogCS8qCiAJICogIEZpbmQgdGhlIE5vZGUgYW5kIGNvbnZlcnQgdG8gYSBoYW5kbGUKIAkgKi8KLQlzdGF0dXMgPQotCSAgICBhY3BpX25zX2dldF9ub2RlX2J5X3BhdGgocGF0aG5hbWUsIHByZWZpeF9ub2RlLCBBQ1BJX05TX05PX1VQU0VBUkNILAotCQkJCSAgICAgJm5vZGUpOworCXN0YXR1cyA9IGFjcGlfbnNfZ2V0X25vZGUocHJlZml4X25vZGUsIHBhdGhuYW1lLCBBQ1BJX05TX05PX1VQU0VBUkNILAorCQkJCSAgJm5vZGUpOwogCiAJKnJldF9oYW5kbGUgPSBOVUxMOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewpAQCAtMTI2LDcgKzEyMyw3IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2hhbmRsZSk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfaGFuZGxlKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTQzLDcgKzE0MCw2IEBACiAgKiAgICAgICAgICAgICAgY29tcGxlbWVudGFyeSBmdW5jdGlvbnMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X25hbWUoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbmFtZV90eXBlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKiBidWZmZXIpCiB7CkBAIC0xNjIsNiArMTU4LDcgQEAKIAl9CiAKIAlpZiAobmFtZV90eXBlID09IEFDUElfRlVMTF9QQVRITkFNRSkgeworCiAJCS8qIEdldCB0aGUgZnVsbCBwYXRobmFtZSAoRnJvbSB0aGUgbmFtZXNwYWNlIHJvb3QpICovCiAKIAkJc3RhdHVzID0gYWNwaV9uc19oYW5kbGVfdG9fcGF0aG5hbWUoaGFuZGxlLCBidWZmZXIpOwpAQCAtMjAzLDcgKzIwMCw3IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25hbWUpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMTksNyArMjE2LDYgQEAKICAqICAgICAgICAgICAgICBjb250cm9sIG1ldGhvZHMgKFN1Y2ggYXMgaW4gdGhlIGNhc2Ugb2YgYSBkZXZpY2UuKQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2dldF9vYmplY3RfaW5mbyhhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqIGJ1ZmZlcikKIHsKQEAgLTI0MSw3ICsyMzcsNyBAQAogCQlyZXR1cm4gKHN0YXR1cyk7CiAJfQogCi0JaW5mbyA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfZGV2aWNlX2luZm8pKTsKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2RldmljZV9pbmZvKSk7CiAJaWYgKCFpbmZvKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CkBAIC0zNDUsMTEgKzM0MSwxMSBAQAogCX0KIAogICAgICAgY2xlYW51cDoKLQlBQ1BJX01FTV9GUkVFKGluZm8pOworCUFDUElfRlJFRShpbmZvKTsKIAlpZiAoY2lkX2xpc3QpIHsKLQkJQUNQSV9NRU1fRlJFRShjaWRfbGlzdCk7CisJCUFDUElfRlJFRShjaWRfbGlzdCk7CiAJfQogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2dldF9vYmplY3RfaW5mbyk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfb2JqZWN0X2luZm8pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbmFtZXNwYWNlL25zeGZvYmouYyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCmluZGV4IGEwMzMyNTkuLmExNjNlMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCisrKyBiL2RyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnN4Zm9iai5jCkBAIC00Miw4ICs0Miw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCkBAIC0xMDEsNyArOTksNyBAQAogCXJldHVybiAoc3RhdHVzKTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX2dldF90eXBlKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90eXBlKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTExNiw3ICsxMTQsNiBAQAogICogICAgICAgICAgICAgIEhhbmRsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2dldF9wYXJlbnQoYWNwaV9oYW5kbGUgaGFuZGxlLCBhY3BpX2hhbmRsZSAqIHJldF9oYW5kbGUpCiB7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CkBAIC0xNjIsNyArMTU5LDcgQEAKIAlyZXR1cm4gKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfcGFyZW50KTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9wYXJlbnQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTgxLDcgKzE3OCw2IEBACiAgKiAgICAgICAgICAgICAgU2NvcGUgaXMgcmV0dXJuZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfZ2V0X25leHRfb2JqZWN0KGFjcGlfb2JqZWN0X3R5cGUgdHlwZSwKIAkJICAgICBhY3BpX2hhbmRsZSBwYXJlbnQsCkBAIC0yMDYsNiArMjAyLDcgQEAKIAkvKiBJZiBudWxsIGhhbmRsZSwgdXNlIHRoZSBwYXJlbnQgKi8KIAogCWlmICghY2hpbGQpIHsKKwogCQkvKiBTdGFydCBzZWFyY2ggYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3BlY2lmaWVkIHNjb3BlICovCiAKIAkJcGFyZW50X25vZGUgPSBhY3BpX25zX21hcF9oYW5kbGVfdG9fbm9kZShwYXJlbnQpOwpAQCAtMjQyLDQgKzIzOSw0IEBACiAJcmV0dXJuIChzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X25leHRfb2JqZWN0KTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9uZXh0X29iamVjdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9udW1hLmMgYi9kcml2ZXJzL2FjcGkvbnVtYS5jCmluZGV4IDY0Yjk4ZTguLmUyYzFhMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9udW1hLmMKKysrIGIvZHJpdmVycy9hY3BpL251bWEuYwpAQCAtMzYsMTIgKzM2LDYwIEBACiAjZGVmaW5lIF9DT01QT05FTlQJQUNQSV9OVU1BCiBBQ1BJX01PRFVMRV9OQU1FKCJudW1hIikKIAorc3RhdGljIG5vZGVtYXNrX3Qgbm9kZXNfZm91bmRfbWFwID0gTk9ERV9NQVNLX05PTkU7CisjZGVmaW5lIFBYTV9JTlZBTAktMQorI2RlZmluZSBOSURfSU5WQUwJLTEKKworLyogbWFwcyB0byBjb252ZXJ0IGJldHdlZW4gcHJveGltaXR5IGRvbWFpbiBhbmQgbG9naWNhbCBub2RlIElEICovCitpbnQgX19jcHVpbml0ZGF0YSBweG1fdG9fbm9kZV9tYXBbTUFYX1BYTV9ET01BSU5TXQorCQkJCT0geyBbMCAuLi4gTUFYX1BYTV9ET01BSU5TIC0gMV0gPSBOSURfSU5WQUwgfTsKK2ludCBfX2NwdWluaXRkYXRhIG5vZGVfdG9fcHhtX21hcFtNQVhfTlVNTk9ERVNdCisJCQkJPSB7IFswIC4uLiBNQVhfTlVNTk9ERVMgLSAxXSA9IFBYTV9JTlZBTCB9OworCiBleHRlcm4gaW50IF9faW5pdCBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KGVudW0gYWNwaV90YWJsZV9pZCBpZCwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFkdF9zaXplLAogCQkJCQkgICAgICAgaW50IGVudHJ5X2lkLAogCQkJCQkgICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKIAkJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7CiAKK2ludCBfX2NwdWluaXQgcHhtX3RvX25vZGUoaW50IHB4bSkKK3sKKwlpZiAocHhtIDwgMCkKKwkJcmV0dXJuIE5JRF9JTlZBTDsKKwlyZXR1cm4gcHhtX3RvX25vZGVfbWFwW3B4bV07Cit9CisKK2ludCBfX2NwdWluaXQgbm9kZV90b19weG0oaW50IG5vZGUpCit7CisJaWYgKG5vZGUgPCAwKQorCQlyZXR1cm4gUFhNX0lOVkFMOworCXJldHVybiBub2RlX3RvX3B4bV9tYXBbbm9kZV07Cit9CisKK2ludCBfX2NwdWluaXQgYWNwaV9tYXBfcHhtX3RvX25vZGUoaW50IHB4bSkKK3sKKwlpbnQgbm9kZSA9IHB4bV90b19ub2RlX21hcFtweG1dOworCisJaWYgKG5vZGUgPCAwKXsKKwkJaWYgKG5vZGVzX3dlaWdodChub2Rlc19mb3VuZF9tYXApID49IE1BWF9OVU1OT0RFUykKKwkJCXJldHVybiBOSURfSU5WQUw7CisJCW5vZGUgPSBmaXJzdF91bnNldF9ub2RlKG5vZGVzX2ZvdW5kX21hcCk7CisJCXB4bV90b19ub2RlX21hcFtweG1dID0gbm9kZTsKKwkJbm9kZV90b19weG1fbWFwW25vZGVdID0gcHhtOworCQlub2RlX3NldChub2RlLCBub2Rlc19mb3VuZF9tYXApOworCX0KKworCXJldHVybiBub2RlOworfQorCit2b2lkIF9fY3B1aW5pdCBhY3BpX3VubWFwX3B4bV90b19ub2RlKGludCBub2RlKQoreworCWludCBweG0gPSBub2RlX3RvX3B4bV9tYXBbbm9kZV07CisJcHhtX3RvX25vZGVfbWFwW3B4bV0gPSBOSURfSU5WQUw7CisJbm9kZV90b19weG1fbWFwW25vZGVdID0gUFhNX0lOVkFMOworCW5vZGVfY2xlYXIobm9kZSwgbm9kZXNfZm91bmRfbWFwKTsKK30KKwogdm9pZCBfX2luaXQgYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5KGFjcGlfdGFibGVfZW50cnlfaGVhZGVyICogaGVhZGVyKQogewogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggMTNiNWZkNS4uMWJiNTU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbm1pLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KQEAgLTYwMCwyMyArNjAxLDQxIEBACiAJcmV0dXJuX1ZPSUQ7CiB9CiAKLWFjcGlfc3RhdHVzCi1hY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24odTMyIHByaW9yaXR5LAorc3RhdGljIGludCBhY3BpX29zX2V4ZWN1dGVfdGhyZWFkKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGFjcGlfb3NfZHBjICpkcGMgPSAoc3RydWN0IGFjcGlfb3NfZHBjICopY29udGV4dDsKKwlpZiAoZHBjKSB7CisJCWRwYy0+ZnVuY3Rpb24oZHBjLT5jb250ZXh0KTsKKwkJa2ZyZWUoZHBjKTsKKwl9CisJZG9fZXhpdCgwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc19leGVjdXRlCisgKgorICogUEFSQU1FVEVSUzogIFR5cGUgICAgICAgICAgICAgICAtIFR5cGUgb2YgdGhlIGNhbGxiYWNrCisgKiAgICAgICAgICAgICAgRnVuY3Rpb24gICAgICAgICAgIC0gRnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQKKyAqICAgICAgICAgICAgICBDb250ZXh0ICAgICAgICAgICAgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBEZXBlbmRpbmcgb24gdHlwZSwgZWl0aGVyIHF1ZXVlcyBmdW5jdGlvbiBmb3IgZGVmZXJyZWQgZXhlY3V0aW9uIG9yCisgKiAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgZXhlY3V0ZXMgZnVuY3Rpb24gb24gYSBzZXBhcmF0ZSB0aHJlYWQuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMgYWNwaV9vc19leGVjdXRlKGFjcGlfZXhlY3V0ZV90eXBlIHR5cGUsCiAJCQkgICAgYWNwaV9vc2RfZXhlY19jYWxsYmFjayBmdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAlzdHJ1Y3QgYWNwaV9vc19kcGMgKmRwYzsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnRhc2s7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJvc19xdWV1ZV9mb3JfZXhlY3V0aW9uIik7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkgICJTY2hlZHVsaW5nIGZ1bmN0aW9uIFslcCglcCldIGZvciBkZWZlcnJlZCBleGVjdXRpb24uXG4iLAotCQkJICBmdW5jdGlvbiwgY29udGV4dCkpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAogCWlmICghZnVuY3Rpb24pCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQorCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKIAkvKgogCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgRFBDIHN0cnVjdHVyZS4gIE5vdGUgdGhhdCB0aGlzIG1lbW9yeSB3aWxsIGJlCiAJICogZnJlZWQgYnkgdGhlIGNhbGxlZS4gIFRoZSBrZXJuZWwgaGFuZGxlcyB0aGUgdHFfc3RydWN0IGxpc3QgIGluIGEKQEAgLTYyNywzMCArNjQ2LDM3IEBACiAJICogV2UgY2FuIHNhdmUgdGltZSBhbmQgY29kZSBieSBhbGxvY2F0aW5nIHRoZSBEUEMgYW5kIHRxX3N0cnVjdHMKIAkgKiBmcm9tIHRoZSBzYW1lIG1lbW9yeS4KIAkgKi8KLQotCWRwYyA9Ci0JICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhY3BpX29zX2RwYykgKyBzaXplb2Yoc3RydWN0IHdvcmtfc3RydWN0KSwKLQkJICAgIEdGUF9BVE9NSUMpOworCWlmICh0eXBlID09IE9TTF9OT1RJRllfSEFORExFUikgeworCQlkcGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vc19kcGMpLCBHRlBfS0VSTkVMKTsKKwl9IGVsc2UgeworCQlkcGMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9vc19kcGMpICsKKwkJCQlzaXplb2Yoc3RydWN0IHdvcmtfc3RydWN0KSwgR0ZQX0FUT01JQyk7CisJfQogCWlmICghZHBjKQotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKLQorCQlyZXR1cm4gQUVfTk9fTUVNT1JZOwogCWRwYy0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKIAlkcGMtPmNvbnRleHQgPSBjb250ZXh0OwogCi0JdGFzayA9ICh2b2lkICopKGRwYyArIDEpOwotCUlOSVRfV09SSyh0YXNrLCBhY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQsICh2b2lkICopZHBjKTsKLQotCWlmICghcXVldWVfd29yayhrYWNwaWRfd3EsIHRhc2spKSB7Ci0JCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCi0JCQkJICAiQ2FsbCB0byBxdWV1ZV93b3JrKCkgZmFpbGVkLlxuIikpOwotCQlrZnJlZShkcGMpOwotCQlzdGF0dXMgPSBBRV9FUlJPUjsKKwlpZiAodHlwZSA9PSBPU0xfTk9USUZZX0hBTkRMRVIpIHsKKwkJcCA9IGt0aHJlYWRfY3JlYXRlKGFjcGlfb3NfZXhlY3V0ZV90aHJlYWQsIGRwYywgImthY3BpZF9ub3RpZnkiKTsKKwkJaWYgKCFJU19FUlIocCkpIHsKKwkJCXdha2VfdXBfcHJvY2VzcyhwKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXR1cyA9IEFFX05PX01FTU9SWTsKKwkJCWtmcmVlKGRwYyk7CisJCX0KKwl9IGVsc2UgeworCQl0YXNrID0gKHZvaWQgKikoZHBjICsgMSk7CisJCUlOSVRfV09SSyh0YXNrLCBhY3BpX29zX2V4ZWN1dGVfZGVmZXJyZWQsICh2b2lkICopZHBjKTsKKwkJaWYgKCFxdWV1ZV93b3JrKGthY3BpZF93cSwgdGFzaykpIHsKKwkJCXN0YXR1cyA9IEFFX0VSUk9SOworCQkJa2ZyZWUoZHBjKTsKKwkJfQogCX0KLQotCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCXJldHVybiBzdGF0dXM7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9vc19xdWV1ZV9mb3JfZXhlY3V0aW9uKTsKK0VYUE9SVF9TWU1CT0woYWNwaV9vc19leGVjdXRlKTsKIAogdm9pZCBhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKHZvaWQgKmNvbnRleHQpCiB7CkBAIC03NjksOSArNzk1LDYgQEAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX01VVEVYLCAiV2FpdGluZyBmb3Igc2VtYXBob3JlWyVwfCVkfCVkXVxuIiwKIAkJCSAgaGFuZGxlLCB1bml0cywgdGltZW91dCkpOwogCi0JaWYgKGluX2F0b21pYygpKQotCQl0aW1lb3V0ID0gMDsKLQogCXN3aXRjaCAodGltZW91dCkgewogCQkvKgogCQkgKiBObyBXYWl0OgpAQCAtODk2LDE0ICs5MTksNiBAQAogfQogI2VuZGlmCiAKLXUzMiBhY3BpX29zX2dldF90aHJlYWRfaWQodm9pZCkKLXsKLQlpZiAoIWluX2F0b21pYygpKQotCQlyZXR1cm4gY3VycmVudC0+cGlkOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGFjcGlfc3RhdHVzIGFjcGlfb3Nfc2lnbmFsKHUzMiBmdW5jdGlvbiwgdm9pZCAqaW5mbykKIHsKIAlzd2l0Y2ggKGZ1bmN0aW9uKSB7CkBAIC0xMDUwLDEyICsxMDY1LDEyIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlCiAgKgotICogUEFSQU1FVEVSUzogIENhY2hlTmFtZSAgICAgICAtIEFzY2lpIG5hbWUgZm9yIHRoZSBjYWNoZQotICogICAgICAgICAgICAgIE9iamVjdFNpemUgICAgICAtIFNpemUgb2YgZWFjaCBjYWNoZWQgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgTWF4RGVwdGggICAgICAgIC0gTWF4aW11bSBkZXB0aCBvZiB0aGUgY2FjaGUgKGluIG9iamVjdHMpCi0gKiAgICAgICAgICAgICAgUmV0dXJuQ2FjaGUgICAgIC0gV2hlcmUgdGhlIG5ldyBjYWNoZSBvYmplY3QgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBuYW1lICAgICAgLSBBc2NpaSBuYW1lIGZvciB0aGUgY2FjaGUKKyAqICAgICAgICAgICAgICBzaXplICAgICAgLSBTaXplIG9mIGVhY2ggY2FjaGVkIG9iamVjdAorICogICAgICAgICAgICAgIGRlcHRoICAgICAtIE1heGltdW0gZGVwdGggb2YgdGhlIGNhY2hlIChpbiBvYmplY3RzKSA8aWdub3JlZD4KKyAqICAgICAgICAgICAgICBjYWNoZSAgICAgLSBXaGVyZSB0aGUgbmV3IGNhY2hlIG9iamVjdCBpcyByZXR1cm5lZAogICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqIFJFVFVSTjogICAgICBzdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGEgY2FjaGUgb2JqZWN0CiAgKgpAQCAtMTA2NSw3ICsxMDgwLDEwIEBACiBhY3BpX29zX2NyZWF0ZV9jYWNoZShjaGFyICpuYW1lLCB1MTYgc2l6ZSwgdTE2IGRlcHRoLCBhY3BpX2NhY2hlX3QgKiogY2FjaGUpCiB7CiAJKmNhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUobmFtZSwgc2l6ZSwgMCwgMCwgTlVMTCwgTlVMTCk7Ci0JcmV0dXJuIEFFX09LOworCWlmIChjYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gQUVfRVJST1I7CisJZWxzZQorCQlyZXR1cm4gQUVfT0s7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMTM0LDE2ICsxMTUyLDYzIEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBHZXQgYW4gb2JqZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjYWNoZS4gIElmIGNhY2hlIGlzIGVtcHR5LAotICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaXMgYWxsb2NhdGVkLgorICogREVTQ1JJUFRJT046IFJldHVybiBhIHplcm8tZmlsbGVkIG9iamVjdC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkICphY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfY2FjaGVfdCAqIGNhY2hlKQogewotCXZvaWQgKm9iamVjdCA9IGttZW1fY2FjaGVfYWxsb2MoY2FjaGUsIEdGUF9LRVJORUwpOworCXZvaWQgKm9iamVjdCA9IGttZW1fY2FjaGVfemFsbG9jKGNhY2hlLCBHRlBfS0VSTkVMKTsKIAlXQVJOX09OKCFvYmplY3QpOwogCXJldHVybiBvYmplY3Q7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV9vc192YWxpZGF0ZV9pbnRlcmZhY2UKKyAqCisgKiBQQVJBTUVURVJTOiAgaW50ZXJmYWNlICAgICAgICAgICAtIFJlcXVlc3RlZCBpbnRlcmZhY2UgdG8gYmUgdmFsaWRhdGVkCisgKgorICogUkVUVVJOOiAgICAgIEFFX09LIGlmIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIEFFX1NVUFBPUlQgb3RoZXJ3aXNlCisgKgorICogREVTQ1JJUFRJT046IE1hdGNoIGFuIGludGVyZmFjZSBzdHJpbmcgdG8gdGhlIGludGVyZmFjZXMgc3VwcG9ydGVkIGJ5IHRoZQorICogICAgICAgICAgICAgIGhvc3QuIFN0cmluZ3Mgb3JpZ2luYXRlIGZyb20gYW4gQU1MIGNhbGwgdG8gdGhlIF9PU0kgbWV0aG9kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfb3NfdmFsaWRhdGVfaW50ZXJmYWNlIChjaGFyICppbnRlcmZhY2UpCit7CisKKyAgICByZXR1cm4gQUVfU1VQUE9SVDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfb3NfdmFsaWRhdGVfYWRkcmVzcworICoKKyAqIFBBUkFNRVRFUlM6ICBzcGFjZV9pZCAgICAgICAgICAgICAtIEFDUEkgc3BhY2UgSUQKKyAqICAgICAgICAgICAgICBhZGRyZXNzICAgICAgICAgICAgIC0gUGh5c2ljYWwgYWRkcmVzcworICogICAgICAgICAgICAgIGxlbmd0aCAgICAgICAgICAgICAgLSBBZGRyZXNzIGxlbmd0aAorICoKKyAqIFJFVFVSTjogICAgICBBRV9PSyBpZiBhZGRyZXNzL2xlbmd0aCBpcyB2YWxpZCBmb3IgdGhlIHNwYWNlX2lkLiBPdGhlcndpc2UsCisgKiAgICAgICAgICAgICAgc2hvdWxkIHJldHVybiBBRV9BTUxfSUxMRUdBTF9BRERSRVNTLgorICoKKyAqIERFU0NSSVBUSU9OOiBWYWxpZGF0ZSBhIHN5c3RlbSBhZGRyZXNzIHZpYSB0aGUgaG9zdCBPUy4gVXNlZCB0byB2YWxpZGF0ZQorICogICAgICAgICAgICAgIHRoZSBhZGRyZXNzZXMgYWNjZXNzZWQgYnkgQU1MIG9wZXJhdGlvbiByZWdpb25zLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfb3NfdmFsaWRhdGVfYWRkcmVzcyAoCisgICAgdTggICAgICAgICAgICAgICAgICAgc3BhY2VfaWQsCisgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzICAgYWRkcmVzcywKKyAgICBhY3BpX3NpemUgICAgICAgICAgICAgICBsZW5ndGgpCit7CisKKyAgICByZXR1cm4gQUVfT0s7Cit9CisKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2FyZ3MuYwppbmRleCBkZTU3M2JlLi5iZjg4ZTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzYXJncy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNhcmdzLmMKQEAgLTc5LDcgKzc5LDcgQEAKIAlhY3BpX25hdGl2ZV91aW50IGJ5dGVfY291bnQ7CiAJdTggYnl0ZV96ZXJvX21hc2sgPSAweDNGOwkvKiBEZWZhdWx0IFswOjVdICovCiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19nZXRfbmV4dF9wYWNrYWdlX2xlbmd0aCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfcGFja2FnZV9sZW5ndGgpOwogCiAJLyoKIAkgKiBCeXRlIDAgYml0cyBbNjo3XSBjb250YWluIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBieXRlcwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJdTMyIHBhY2thZ2VfbGVuZ3RoOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfcGFja2FnZV9lbmQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2dldF9uZXh0X3BhY2thZ2VfZW5kKTsKIAogCS8qIEZ1bmN0aW9uIGJlbG93IHVwZGF0ZXMgcGFyc2VyX3N0YXRlLT5BbWwgKi8KIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJdTggKnN0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJdTggKmVuZCA9IHBhcnNlcl9zdGF0ZS0+YW1sOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfbmFtZXN0cmluZyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZ2V0X25leHRfbmFtZXN0cmluZyk7CiAKIAkvKiBQb2ludCBwYXN0IGFueSBuYW1lc3RyaW5nIHByZWZpeCBjaGFyYWN0ZXJzIChiYWNrc2xhc2ggb3IgY2FyYXQpICovCiAKQEAgLTIzNyw3ICsyMzcsNyBAQAogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSBzY29wZV9pbmZvOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfbmFtZXBhdGgiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2dldF9uZXh0X25hbWVwYXRoKTsKIAogCXBhdGggPSBhY3BpX3BzX2dldF9uZXh0X25hbWVzdHJpbmcocGFyc2VyX3N0YXRlKTsKIAlhY3BpX3BzX2luaXRfb3AoYXJnLCBBTUxfSU5UX05BTUVQQVRIX09QKTsKQEAgLTI3NSw2ICsyNzUsNyBAQAogCSAqLwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJgogCSAgICBwb3NzaWJsZV9tZXRob2RfY2FsbCAmJiAobm9kZS0+dHlwZSA9PSBBQ1BJX1RZUEVfTUVUSE9EKSkgeworCiAJCS8qIFRoaXMgbmFtZSBpcyBhY3R1YWxseSBhIGNvbnRyb2wgbWV0aG9kIGludm9jYXRpb24gKi8KIAogCQltZXRob2RfZGVzYyA9IGFjcGlfbnNfZ2V0X2F0dGFjaGVkX29iamVjdChub2RlKTsKQEAgLTMxOSw2ICszMjAsNyBAQAogCSAqIHNvbWUgbm90X2ZvdW5kIGNhc2VzIGFyZSBhbGxvd2VkCiAJICovCiAJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKKwogCQkvKiAxKSBub3RfZm91bmQgaXMgb2sgZHVyaW5nIGxvYWQgcGFzcyAxLzIgKGFsbG93IGZvcndhcmQgcmVmZXJlbmNlcykgKi8KIAogCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spICE9CkBAIC0zNTQsNiArMzU2LDcgQEAKIAogCQlpZiAoKHdhbGtfc3RhdGUtPnBhcnNlX2ZsYWdzICYgQUNQSV9QQVJTRV9NT0RFX01BU0spID09CiAJCSAgICBBQ1BJX1BBUlNFX0VYRUNVVEUpIHsKKwogCQkJLyogUmVwb3J0IGEgY29udHJvbCBtZXRob2QgZXhlY3V0aW9uIGVycm9yICovCiAKIAkJCXN0YXR1cyA9IGFjcGlfZHNfbWV0aG9kX2Vycm9yKHN0YXR1cywgd2Fsa19zdGF0ZSk7CkBAIC0zODgsNyArMzkxLDcgQEAKIAl1MTYgb3Bjb2RlOwogCXU4ICphbWwgPSBwYXJzZXJfc3RhdGUtPmFtbDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJwc19nZXRfbmV4dF9zaW1wbGVfYXJnIiwgYXJnX3R5cGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHBzX2dldF9uZXh0X3NpbXBsZV9hcmcsIGFyZ190eXBlKTsKIAogCXN3aXRjaCAoYXJnX3R5cGUpIHsKIAljYXNlIEFSR1BfQllURURBVEE6CkBAIC00NTMsNyArNDU2LDcgQEAKIAogCWRlZmF1bHQ6CiAKLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgYXJnX3R5cGUgJVgiLCBhcmdfdHlwZSkpOworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBBcmdUeXBlICVYIiwgYXJnX3R5cGUpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC00ODQsNyArNDg3LDcgQEAKIAl1MTYgb3Bjb2RlOwogCXUzMiBuYW1lOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicHNfZ2V0X25leHRfZmllbGQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2dldF9uZXh0X2ZpZWxkKTsKIAogCS8qIERldGVybWluZSBmaWVsZCB0eXBlICovCiAKQEAgLTU5MCw3ICs1OTMsNyBAQAogCXUzMiBzdWJvcDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19nZXRfbmV4dF9hcmciLCBwYXJzZXJfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2dldF9uZXh0X2FyZywgcGFyc2VyX3N0YXRlKTsKIAogCXN3aXRjaCAoYXJnX3R5cGUpIHsKIAljYXNlIEFSR1BfQllURURBVEE6CkBAIC02MjAsNiArNjIzLDcgQEAKIAljYXNlIEFSR1BfRklFTERMSVNUOgogCiAJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgeworCiAJCQkvKiBOb24tZW1wdHkgbGlzdCAqLwogCiAJCQl3aGlsZSAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKQEAgLTY0NSw2ICs2NDksNyBAQAogCWNhc2UgQVJHUF9CWVRFTElTVDoKIAogCQlpZiAocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPnBrZ19lbmQpIHsKKwogCQkJLyogTm9uLWVtcHR5IGxpc3QgKi8KIAogCQkJYXJnID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX0JZVEVMSVNUX09QKTsKQEAgLTY3Myw2ICs2NzgsNyBAQAogCQlpZiAoc3Vib3AgPT0gMCB8fAogCQkgICAgYWNwaV9wc19pc19sZWFkaW5nX2NoYXIoc3Vib3ApIHx8CiAJCSAgICBhY3BpX3BzX2lzX3ByZWZpeF9jaGFyKHN1Ym9wKSkgeworCiAJCQkvKiBudWxsX25hbWUgb3IgbmFtZV9zdHJpbmcgKi8KIAogCQkJYXJnID0gYWNwaV9wc19hbGxvY19vcChBTUxfSU5UX05BTUVQQVRIX09QKTsKQEAgLTcwMyw2ICs3MDksNyBAQAogCWNhc2UgQVJHUF9PQkpMSVNUOgogCiAJCWlmIChwYXJzZXJfc3RhdGUtPmFtbCA8IHBhcnNlcl9zdGF0ZS0+cGtnX2VuZCkgeworCiAJCQkvKiBOb24tZW1wdHkgbGlzdCBvZiB2YXJpYWJsZSBhcmd1bWVudHMsIG5vdGhpbmcgcmV0dXJuZWQgKi8KIAogCQkJd2Fsa19zdGF0ZS0+YXJnX2NvdW50ID0gQUNQSV9WQVJfQVJHUzsKQEAgLTcxMSw3ICs3MTgsNyBAQAogCiAJZGVmYXVsdDoKIAotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBhcmdfdHlwZTogJVgiLCBhcmdfdHlwZSkpOworCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBBcmdUeXBlOiAlWCIsIGFyZ190eXBlKSk7CiAJCXN0YXR1cyA9IEFFX0FNTF9PUEVSQU5EX1RZUEU7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzbG9vcC5jCmluZGV4IDAwYjA3MmUuLmUxNTQxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNsb29wLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc2xvb3AuYwpAQCAtODMsNyArODMsNyBAQAogCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlICpwYXJzZXJfc3RhdGU7CiAJdTggKmFtbF9vcF9zdGFydCA9IE5VTEw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfcGFyc2VfbG9vcCIsIHdhbGtfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX3BhcnNlX2xvb3AsIHdhbGtfc3RhdGUpOwogCiAJaWYgKHdhbGtfc3RhdGUtPmRlc2NlbmRpbmdfY2FsbGJhY2sgPT0gTlVMTCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CkBAIC05NSw2ICs5NSw3IEBACiAjaWYgKCFkZWZpbmVkIChBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04pICYmICFkZWZpbmVkIChBQ1BJX0NPTlNUQU5UX0VWQUxfT05MWSkpCiAKIAlpZiAod2Fsa19zdGF0ZS0+d2Fsa190eXBlICYgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUKSB7CisKIAkJLyogV2UgYXJlIHJlc3RhcnRpbmcgYSBwcmVlbXB0ZWQgY29udHJvbCBtZXRob2QgKi8KIAogCQlpZiAoYWNwaV9wc19oYXNfY29tcGxldGVkX3Njb3BlKHBhcnNlcl9zdGF0ZSkpIHsKQEAgLTEyOCw3ICsxMjksNyBAQAogCiAJCQkJCX0KIAkJCQkJQUNQSV9FWENFUFRJT04oKEFFX0lORk8sIHN0YXR1cywKLQkJCQkJCQkiZ2V0X3ByZWRpY2F0ZSBGYWlsZWQiKSk7CisJCQkJCQkJIkdldFByZWRpY2F0ZSBGYWlsZWQiKSk7CiAJCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQkJCX0KIApAQCAtMTQzLDYgKzE0NCw3IEBACiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAogCQkJCQkgICJQb3BwZWQgc2NvcGUsIE9wPSVwXG4iLCBvcCkpOwogCQl9IGVsc2UgaWYgKHdhbGtfc3RhdGUtPnByZXZfb3ApIHsKKwogCQkJLyogV2Ugd2VyZSBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wICovCiAKIAkJCW9wID0gd2Fsa19zdGF0ZS0+cHJldl9vcDsKQEAgLTE1Niw2ICsxNTgsNyBAQAogCXdoaWxlICgocGFyc2VyX3N0YXRlLT5hbWwgPCBwYXJzZXJfc3RhdGUtPmFtbF9lbmQpIHx8IChvcCkpIHsKIAkJYW1sX29wX3N0YXJ0ID0gcGFyc2VyX3N0YXRlLT5hbWw7CiAJCWlmICghb3ApIHsKKwogCQkJLyogR2V0IHRoZSBuZXh0IG9wY29kZSBmcm9tIHRoZSBBTUwgc3RyZWFtICovCiAKIAkJCXdhbGtfc3RhdGUtPmFtbF9vZmZzZXQgPQpAQCAtMjEzLDYgKzIxNiw3IEBACiAJCQkvKiBDcmVhdGUgT3Agc3RydWN0dXJlIGFuZCBhcHBlbmQgdG8gcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLwogCiAJCQlpZiAod2Fsa19zdGF0ZS0+b3BfaW5mby0+ZmxhZ3MgJiBBTUxfTkFNRUQpIHsKKwogCQkJCS8qIEFsbG9jYXRlIGEgbmV3IHByZV9vcCBpZiBuZWNlc3NhcnkgKi8KIAogCQkJCWlmICghcHJlX29wKSB7CkBAIC0zNzEsNyArMzc1LDcgQEAKIAogCQkJaWYgKHdhbGtfc3RhdGUtPm9wX2luZm8pIHsKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJCQkJICAiT3Bjb2RlICU0LjRYIFslc10gT3AgJXAgQW1sICVwIGFtbF9vZmZzZXQgJTUuNVhcbiIsCisJCQkJCQkgICJPcGNvZGUgJTQuNFggWyVzXSBPcCAlcCBBbWwgJXAgQW1sT2Zmc2V0ICU1LjVYXG4iLAogCQkJCQkJICAodTMyKSBvcC0+Y29tbW9uLmFtbF9vcGNvZGUsCiAJCQkJCQkgIHdhbGtfc3RhdGUtPm9wX2luZm8tPm5hbWUsIG9wLAogCQkJCQkJICBwYXJzZXJfc3RhdGUtPmFtbCwKQEAgLTM4OCw2ICszOTIsNyBAQAogCQkvKiBBcmUgdGhlcmUgYW55IGFyZ3VtZW50cyB0aGF0IG11c3QgYmUgcHJvY2Vzc2VkPyAqLwogCiAJCWlmICh3YWxrX3N0YXRlLT5hcmdfdHlwZXMpIHsKKwogCQkJLyogR2V0IGFyZ3VtZW50cyAqLwogCiAJCQlzd2l0Y2ggKG9wLT5jb21tb24uYW1sX29wY29kZSkgewpAQCAtNzQyLDcgKzc0NywxOSBAQAogCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CiAJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CiAJCQkJCX0KKworCQkJCQlzdGF0dXMyID0KKwkJCQkJICAgIGFjcGlfZHNfcmVzdWx0X3N0YWNrX3BvcAorCQkJCQkgICAgKHdhbGtfc3RhdGUpOworCQkJCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1czIpKSB7CisJCQkJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzMik7CisJCQkJCX0KKworCQkJCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlCisJCQkJCSAgICAoYWNwaV91dF9wb3BfZ2VuZXJpY19zdGF0ZQorCQkJCQkgICAgICgmd2Fsa19zdGF0ZS0+Y29udHJvbF9zdGF0ZSkpOwogCQkJCX0KKwogCQkJCWFjcGlfcHNfcG9wX3Njb3BlKHBhcnNlcl9zdGF0ZSwgJm9wLAogCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX3R5cGVzLAogCQkJCQkJICAmd2Fsa19zdGF0ZS0+YXJnX2NvdW50KTsKQEAgLTc2Miw2ICs3NzksNyBAQAogCQkJCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1czIpOwogCQkJCQl9CiAJCQkJfQorCiAJCQkJYWNwaV9wc19wb3Bfc2NvcGUocGFyc2VyX3N0YXRlLCAmb3AsCiAJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfdHlwZXMsCiAJCQkJCQkgICZ3YWxrX3N0YXRlLT5hcmdfY291bnQpOwpAQCAtODUzLDYgKzg3MSw3IEBACiAJCQkJfQogCiAJCQkJZWxzZSBpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwogCQkJCQkvKiBGaXJzdCBlcnJvciBpcyBtb3N0IGltcG9ydGFudCAqLwogCiAJCQkJCSh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc29wY29kZS5jCmluZGV4IDExZDYzNTEuLjRiZDI1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNvcGNvZGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzb3Bjb2RlLmMKQEAgLTcyNSwxMiArNzI1LDEzIEBACiAKIGNvbnN0IHN0cnVjdCBhY3BpX29wY29kZV9pbmZvICphY3BpX3BzX2dldF9vcGNvZGVfaW5mbyh1MTYgb3Bjb2RlKQogewotCUFDUElfRlVOQ1RJT05fTkFNRSgicHNfZ2V0X29wY29kZV9pbmZvIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKHBzX2dldF9vcGNvZGVfaW5mbyk7CiAKIAkvKgogCSAqIERldGVjdCBub3JtYWwgOC1iaXQgb3Bjb2RlIG9yIGV4dGVuZGVkIDE2LWJpdCBvcGNvZGUKIAkgKi8KIAlpZiAoIShvcGNvZGUgJiAweEZGMDApKSB7CisKIAkJLyogU2ltcGxlICg4LWJpdCkgb3Bjb2RlOiAwLTI1NSwgY2FuJ3QgaW5kZXggYmV5b25kIHRhYmxlICAqLwogCiAJCXJldHVybiAoJmFjcGlfZ2JsX2FtbF9vcF9pbmZvCkBAIC03MzksNiArNzQwLDcgQEAKIAogCWlmICgoKG9wY29kZSAmIDB4RkYwMCkgPT0gQU1MX0VYVEVOREVEX09QQ09ERSkgJiYKIAkgICAgKCgodTgpIG9wY29kZSkgPD0gTUFYX0VYVEVOREVEX09QQ09ERSkpIHsKKwogCQkvKiBWYWxpZCBleHRlbmRlZCAoMTYtYml0KSBvcGNvZGUgKi8KIAogCQlyZXR1cm4gKCZhY3BpX2dibF9hbWxfb3BfaW5mbwpAQCAtNzc5LDcgKzc4MSw3IEBACiAJcmV0dXJuIChvcC0+bmFtZSk7CiAKICNlbHNlCi0JcmV0dXJuICgiQUVfTk9UX0NPTkZJR1VSRUQiKTsKKwlyZXR1cm4gKCJPcGNvZGVOYW1lIHVuYXZhaWxhYmxlIik7CiAKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3BhcnNlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwppbmRleCBhOWYzMjI5Li43ZWUyZjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzcGFyc2UuYwpAQCAtMTA2LDYgKzEwNiw3IEBACiAJb3Bjb2RlID0gKHUxNikgQUNQSV9HRVQ4KGFtbCk7CiAKIAlpZiAob3Bjb2RlID09IEFNTF9FWFRFTkRFRF9PUF9QUkVGSVgpIHsKKwogCQkvKiBFeHRlbmRlZCBvcGNvZGUsIGdldCB0aGUgc2Vjb25kIG9wY29kZSBieXRlICovCiAKIAkJYW1sKys7CkBAIC0xMzcsNyArMTM4LDcgQEAKIAljb25zdCBzdHJ1Y3QgYWNwaV9vcGNvZGVfaW5mbyAqcGFyZW50X2luZm87CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnJlcGxhY2VtZW50X29wID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJwc19jb21wbGV0ZV90aGlzX29wIiwgb3ApOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NvbXBsZXRlX3RoaXNfb3AsIG9wKTsKIAogCS8qIENoZWNrIGZvciBudWxsIE9wLCBjYW4gaGFwcGVuIGlmIEFNTCBjb2RlIGlzIGNvcnJ1cHQgKi8KIApAQCAtMTU4LDYgKzE1OSw3IEBACiAJaWYgKG9wLT5jb21tb24ucGFyZW50KSB7CiAJCXByZXYgPSBvcC0+Y29tbW9uLnBhcmVudC0+Y29tbW9uLnZhbHVlLmFyZzsKIAkJaWYgKCFwcmV2KSB7CisKIAkJCS8qIE5vdGhpbmcgbW9yZSB0byBkbyAqLwogCiAJCQlnb3RvIGNsZWFudXA7CkBAIC0yNDUsNiArMjQ3LDcgQEAKIAkJLyogV2UgbXVzdCB1bmxpbmsgdGhpcyBvcCBmcm9tIHRoZSBwYXJlbnQgdHJlZSAqLwogCiAJCWlmIChwcmV2ID09IG9wKSB7CisKIAkJCS8qIFRoaXMgb3AgaXMgdGhlIGZpcnN0IGluIHRoZSBsaXN0ICovCiAKIAkJCWlmIChyZXBsYWNlbWVudF9vcCkgewpAQCAtMjY1LDYgKzI2OCw3IEBACiAKIAkJZWxzZQogCQkJd2hpbGUgKHByZXYpIHsKKwogCQkJCS8qIFRyYXZlcnNlIGFsbCBzaWJsaW5ncyBpbiB0aGUgcGFyZW50J3MgYXJndW1lbnQgbGlzdCAqLwogCiAJCQkJbmV4dCA9IHByZXYtPmNvbW1vbi5uZXh0OwpAQCAtMzI5LDcgKzMzMyw3IEBACiAJc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgKnBhcnNlcl9zdGF0ZSA9ICZ3YWxrX3N0YXRlLT5wYXJzZXJfc3RhdGU7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfQ1RSTF9QRU5ESU5HOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX25leHRfcGFyc2Vfc3RhdGUiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfbmV4dF9wYXJzZV9zdGF0ZSwgb3ApOwogCiAJc3dpdGNoIChjYWxsYmFja19zdGF0dXMpIHsKIAljYXNlIEFFX0NUUkxfVEVSTUlOQVRFOgpAQCAtNDQ5LDEwICs0NTMsMTAgQEAKIAlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnByZXZfd2Fsa19saXN0ID0gYWNwaV9nYmxfY3VycmVudF93YWxrX2xpc3Q7CiAJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqcHJldmlvdXNfd2Fsa19zdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX3BhcnNlX2FtbCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfcGFyc2VfYW1sKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsCi0JCQkgICJFbnRlcmVkIHdpdGggd2Fsa19zdGF0ZT0lcCBBbWw9JXAgc2l6ZT0lWFxuIiwKKwkJCSAgIkVudGVyZWQgd2l0aCBXYWxrU3RhdGU9JXAgQW1sPSVwIHNpemU9JVhcbiIsCiAJCQkgIHdhbGtfc3RhdGUsIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWwsCiAJCQkgIHdhbGtfc3RhdGUtPnBhcnNlcl9zdGF0ZS5hbWxfc2l6ZSkpOwogCkBAIC00NjAsNiArNDY0LDcgQEAKIAogCXRocmVhZCA9IGFjcGlfdXRfY3JlYXRlX3RocmVhZF9zdGF0ZSgpOwogCWlmICghdGhyZWFkKSB7CisJCWFjcGlfZHNfZGVsZXRlX3dhbGtfc3RhdGUod2Fsa19zdGF0ZSk7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIApAQCAtNTEwLDYgKzUxNSw3IEBACiAJCX0gZWxzZSBpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7CiAJCQlzdGF0dXMgPSBBRV9PSzsKIAkJfSBlbHNlIGlmICgoc3RhdHVzICE9IEFFX09LKSAmJiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MpKSB7CisKIAkJCS8qIEVpdGhlciB0aGUgbWV0aG9kIHBhcnNlIG9yIGFjdHVhbCBleGVjdXRpb24gZmFpbGVkICovCiAKIAkJCUFDUElfRVJST1JfTUVUSE9EKCJNZXRob2QgcGFyc2UvZXhlY3V0aW9uIGZhaWxlZCIsCkBAIC01NTAsMjAgKzU1Niw5IEBACiAJCSAqLwogCQlpZiAoKCh3YWxrX3N0YXRlLT5wYXJzZV9mbGFncyAmIEFDUElfUEFSU0VfTU9ERV9NQVNLKSA9PQogCQkgICAgIEFDUElfUEFSU0VfRVhFQ1VURSkgfHwgKEFDUElfRkFJTFVSRShzdGF0dXMpKSkgewotCQkJaWYgKHdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjKSB7Ci0JCQkJLyogRGVjcmVtZW50IHRoZSB0aHJlYWQgY291bnQgb24gdGhlIG1ldGhvZCBwYXJzZSB0cmVlICovCi0KLQkJCQlpZiAod2Fsa19zdGF0ZS0+bWV0aG9kX2Rlc2MtPm1ldGhvZC4KLQkJCQkgICAgdGhyZWFkX2NvdW50KSB7Ci0JCQkJCXdhbGtfc3RhdGUtPm1ldGhvZF9kZXNjLT5tZXRob2QuCi0JCQkJCSAgICB0aHJlYWRfY291bnQtLTsKLQkJCQl9IGVsc2UgewotCQkJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCQkJICAgICJJbnZhbGlkIHplcm8gdGhyZWFkIGNvdW50IGluIG1ldGhvZCIpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKHdhbGtfc3RhdGUpOworCQkJYWNwaV9kc190ZXJtaW5hdGVfY29udHJvbF9tZXRob2Qod2Fsa19zdGF0ZS0+CisJCQkJCQkJIG1ldGhvZF9kZXNjLAorCQkJCQkJCSB3YWxrX3N0YXRlKTsKIAkJfQogCiAJCS8qIERlbGV0ZSB0aGlzIHdhbGsgc3RhdGUgYW5kIGFsbCBsaW5rZWQgY29udHJvbCBzdGF0ZXMgKi8KQEAgLTU3Miw3ICs1NjcsNyBAQAogCQlwcmV2aW91c193YWxrX3N0YXRlID0gd2Fsa19zdGF0ZTsKIAogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAotCQkJCSAgInJldHVybl92YWx1ZT0lcCwgaW1wbGljaXRfdmFsdWU9JXAgU3RhdGU9JXBcbiIsCisJCQkJICAiUmV0dXJuVmFsdWU9JXAsIEltcGxpY2l0VmFsdWU9JXAgU3RhdGU9JXBcbiIsCiAJCQkJICB3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYywKIAkJCQkgIHdhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmosIHdhbGtfc3RhdGUpKTsKIApAQCAtNjMzLDEyICs2MjgsMTQgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChwcmV2aW91c193YWxrX3N0YXRlLT5yZXR1cm5fZGVzYykgeworCiAJCQkJLyogQ2FsbGVyIGRvZXNuJ3Qgd2FudCBpdCwgbXVzdCBkZWxldGUgaXQgKi8KIAogCQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShwcmV2aW91c193YWxrX3N0YXRlLT4KIAkJCQkJCQkgcmV0dXJuX2Rlc2MpOwogCQkJfQogCQkJaWYgKHByZXZpb3VzX3dhbGtfc3RhdGUtPmltcGxpY2l0X3JldHVybl9vYmopIHsKKwogCQkJCS8qIENhbGxlciBkb2Vzbid0IHdhbnQgaXQsIG11c3QgZGVsZXRlIGl0ICovCiAKIAkJCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UocHJldmlvdXNfd2Fsa19zdGF0ZS0+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHNzY29wZS5jCmluZGV4IGJjNjA0N2MuLmEzZTAzMTRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzc2NvcGUuYwpAQCAtMTA2LDE0ICsxMDYsMTQgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2luaXRfc2NvcGUiLCByb290X29wKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihwc19pbml0X3Njb3BlLCByb290X29wKTsKIAogCXNjb3BlID0gYWNwaV91dF9jcmVhdGVfZ2VuZXJpY19zdGF0ZSgpOwogCWlmICghc2NvcGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0Jc2NvcGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9SUFNDT1BFOworCXNjb3BlLT5jb21tb24uZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfU1RBVEVfUlBTQ09QRTsKIAlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSByb290X29wOwogCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfY291bnQgPSBBQ1BJX1ZBUl9BUkdTOwogCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5hbWxfZW5kOwpAQCAtMTQ3LDE0ICsxNDcsMTQgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX3B1c2hfc2NvcGUiLCBvcCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIocHNfcHVzaF9zY29wZSwgb3ApOwogCiAJc2NvcGUgPSBhY3BpX3V0X2NyZWF0ZV9nZW5lcmljX3N0YXRlKCk7CiAJaWYgKCFzY29wZSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKIAl9CiAKLQlzY29wZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKKwlzY29wZS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BTQ09QRTsKIAlzY29wZS0+cGFyc2Vfc2NvcGUub3AgPSBvcDsKIAlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3QgPSByZW1haW5pbmdfYXJnczsKIAlzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2NvdW50ID0gYXJnX2NvdW50OwpAQCAtMTY1LDYgKzE2NSw3IEBACiAJYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUsIHNjb3BlKTsKIAogCWlmIChhcmdfY291bnQgPT0gQUNQSV9WQVJfQVJHUykgeworCiAJCS8qIE11bHRpcGxlIGFyZ3VtZW50cyAqLwogCiAJCXNjb3BlLT5wYXJzZV9zY29wZS5hcmdfZW5kID0gcGFyc2VyX3N0YXRlLT5wa2dfZW5kOwpAQCAtMTk5LDE0ICsyMDAsMTQgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlID0gcGFyc2VyX3N0YXRlLT5zY29wZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInBzX3BvcF9zY29wZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfcG9wX3Njb3BlKTsKIAogCS8qIE9ubHkgcG9wIHRoZSBzY29wZSBpZiB0aGVyZSBpcyBpbiBmYWN0IGEgbmV4dCBzY29wZSAqLwogCiAJaWYgKHNjb3BlLT5jb21tb24ubmV4dCkgewogCQlzY29wZSA9IGFjcGlfdXRfcG9wX2dlbmVyaWNfc3RhdGUoJnBhcnNlcl9zdGF0ZS0+c2NvcGUpOwogCi0JCS8qIHJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCisJCS8qIFJldHVybiB0byBwYXJzaW5nIHByZXZpb3VzIG9wICovCiAKIAkJKm9wID0gc2NvcGUtPnBhcnNlX3Njb3BlLm9wOwogCQkqYXJnX2xpc3QgPSBzY29wZS0+cGFyc2Vfc2NvcGUuYXJnX2xpc3Q7CkBAIC0yMTcsNyArMjE4LDcgQEAKIAogCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKHNjb3BlKTsKIAl9IGVsc2UgewotCQkvKiBlbXB0eSBwYXJzZSBzdGFjaywgcHJlcGFyZSB0byBmZXRjaCBuZXh0IG9wY29kZSAqLworCQkvKiBFbXB0eSBwYXJzZSBzdGFjaywgcHJlcGFyZSB0byBmZXRjaCBuZXh0IG9wY29kZSAqLwogCiAJCSpvcCA9IE5VTEw7CiAJCSphcmdfbGlzdCA9IDA7CkBAIC0yNDYsNyArMjQ3LDcgQEAKIHsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInBzX2NsZWFudXBfc2NvcGUiLCBwYXJzZXJfc3RhdGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2NsZWFudXBfc2NvcGUsIHBhcnNlcl9zdGF0ZSk7CiAKIAlpZiAoIXBhcnNlcl9zdGF0ZSkgewogCQlyZXR1cm5fVk9JRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdHJlZS5jCmluZGV4IGRkNmYxNjcuLjAwMTU3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN0cmVlLmMKKysrIGIvZHJpdmVycy9hY3BpL3BhcnNlci9wc3RyZWUuYwpAQCAtNzcsNiArNzcsNyBAQAogCiAJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CisKIAkJLyogSW52YWxpZCBvcGNvZGUgb3IgQVNDSUkgY2hhcmFjdGVyICovCiAKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTg1LDYgKzg2LDcgQEAKIAkvKiBDaGVjayBpZiB0aGlzIG9wY29kZSByZXF1aXJlcyBhcmd1bWVudCBzdWItb2JqZWN0cyAqLwogCiAJaWYgKCEob3BfaW5mby0+ZmxhZ3MgJiBBTUxfSEFTX0FSR1MpKSB7CisKIAkJLyogSGFzIG5vIGxpbmtlZCBhcmd1bWVudCBvYmplY3RzICovCiAKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTEzMCw2ICsxMzIsNyBAQAogCiAJb3BfaW5mbyA9IGFjcGlfcHNfZ2V0X29wY29kZV9pbmZvKG9wLT5jb21tb24uYW1sX29wY29kZSk7CiAJaWYgKG9wX2luZm8tPmNsYXNzID09IEFNTF9DTEFTU19VTktOT1dOKSB7CisKIAkJLyogSW52YWxpZCBvcGNvZGUgKi8KIAogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLCAiSW52YWxpZCBBTUwgT3Bjb2RlOiAweCUyLjJYIiwKQEAgLTE0MCw2ICsxNDMsNyBAQAogCS8qIENoZWNrIGlmIHRoaXMgb3Bjb2RlIHJlcXVpcmVzIGFyZ3VtZW50IHN1Yi1vYmplY3RzICovCiAKIAlpZiAoIShvcF9pbmZvLT5mbGFncyAmIEFNTF9IQVNfQVJHUykpIHsKKwogCQkvKiBIYXMgbm8gbGlua2VkIGFyZ3VtZW50IG9iamVjdHMgKi8KIAogCQlyZXR1cm47CkBAIC0xNDgsNiArMTUyLDcgQEAKIAkvKiBBcHBlbmQgdGhlIGFyZ3VtZW50IHRvIHRoZSBsaW5rZWQgYXJndW1lbnQgbGlzdCAqLwogCiAJaWYgKG9wLT5jb21tb24udmFsdWUuYXJnKSB7CisKIAkJLyogQXBwZW5kIHRvIGV4aXN0aW5nIGFyZ3VtZW50IGxpc3QgKi8KIAogCQlwcmV2X2FyZyA9IG9wLT5jb21tb24udmFsdWUuYXJnOwpAQCAtMjIyLDEyICsyMjcsMTQgQEAKIAkJfQogCiAJCWlmIChhcmcgPT0gb3JpZ2luKSB7CisKIAkJCS8qIFJlYWNoZWQgcGFyZW50IG9mIG9yaWdpbiwgZW5kIHNlYXJjaCAqLwogCiAJCQlyZXR1cm4gKE5VTEwpOwogCQl9CiAKIAkJaWYgKHBhcmVudC0+Y29tbW9uLm5leHQpIHsKKwogCQkJLyogRm91bmQgc2libGluZyBvZiBwYXJlbnQgKi8KIAogCQkJcmV0dXJuIChwYXJlbnQtPmNvbW1vbi5uZXh0KTsKQEAgLTI5OSw1ICszMDYsNCBAQAogCXJldHVybiAoY2hpbGQpOwogfQogI2VuZGlmCi0KICNlbmRpZgkJCQkvKiAgQUNQSV9GVVRVUkVfVVNBR0UgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzdXRpbHMuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCmluZGV4IDNlMDdjYjkuLjE4MjQ3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN1dGlscy5jCkBAIC04OSw3ICs4OSw3IEBACiB7CiAJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCi0Jb3AtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI7CisJb3AtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI7CiAJb3AtPmNvbW1vbi5hbWxfb3Bjb2RlID0gb3Bjb2RlOwogCiAJQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTKEFDUElfU1RSTkNQWShvcC0+Y29tbW9uLmFtbF9vcF9uYW1lLApAQCAtMTM1LDYgKzEzNSw3IEBACiAJLyogQWxsb2NhdGUgdGhlIG1pbmltdW0gcmVxdWlyZWQgc2l6ZSBvYmplY3QgKi8KIAogCWlmIChmbGFncyA9PSBBQ1BJX1BBUlNFT1BfR0VORVJJQykgeworCiAJCS8qIFRoZSBnZW5lcmljIG9wIChkZWZhdWx0KSBpcyBieSBmYXIgdGhlIG1vc3QgY29tbW9uICgxNiB0byAxKSAqLwogCiAJCW9wID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9wc19ub2RlX2NhY2hlKTsKQEAgLTE3MSw3ICsxNzIsNyBAQAogCiB2b2lkIGFjcGlfcHNfZnJlZV9vcCh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3ApCiB7Ci0JQUNQSV9GVU5DVElPTl9OQU1FKCJwc19mcmVlX29wIik7CisJQUNQSV9GVU5DVElPTl9OQU1FKHBzX2ZyZWVfb3ApOwogCiAJaWYgKG9wLT5jb21tb24uYW1sX29wY29kZSA9PSBBTUxfSU5UX1JFVFVSTl9WQUxVRV9PUCkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiRnJlZSByZXR2YWwgb3A6ICVwXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN3YWxrLmMKaW5kZXggMDZmMDViZi4uYTg0YTU0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BhcnNlci9wc3dhbGsuYworKysgYi9kcml2ZXJzL2FjcGkvcGFyc2VyL3Bzd2Fsay5jCkBAIC02NCwxOCArNjQsMjEgQEAKIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbmV4dCA9IE5VTEw7CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnBhcmVudCA9IE5VTEw7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigicHNfZGVsZXRlX3BhcnNlX3RyZWUiLCBzdWJ0cmVlX3Jvb3QpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHBzX2RlbGV0ZV9wYXJzZV90cmVlLCBzdWJ0cmVlX3Jvb3QpOwogCiAJLyogVmlzaXQgYWxsIG5vZGVzIGluIHRoZSBzdWJ0cmVlICovCiAKIAl3aGlsZSAob3ApIHsKKwogCQkvKiBDaGVjayBpZiB3ZSBhcmUgbm90IGFzY2VuZGluZyAqLwogCiAJCWlmIChvcCAhPSBwYXJlbnQpIHsKKwogCQkJLyogTG9vayBmb3IgYW4gYXJndW1lbnQgb3IgY2hpbGQgb2YgdGhlIGN1cnJlbnQgb3AgKi8KIAogCQkJbmV4dCA9IGFjcGlfcHNfZ2V0X2FyZyhvcCwgMCk7CiAJCQlpZiAobmV4dCkgeworCiAJCQkJLyogU3RpbGwgZ29pbmcgZG93bndhcmQgaW4gdHJlZSAoT3AgaXMgbm90IGNvbXBsZXRlZCB5ZXQpICovCiAKIAkJCQlvcCA9IG5leHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGFyc2VyL3BzeGZhY2UuYyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCmluZGV4IDJkZDQ4Y2IuLjVkOTk2YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wYXJzZXIvcHN4ZmFjZS5jCkBAIC01MCwxNCArNTAsMTQgQEAKIEFDUElfTU9EVUxFX05BTUUoInBzeGZhY2UiKQogCiAvKiBMb2NhbCBQcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBhY3BpX3BzX3N0YXJ0X3RyYWNlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKK3N0YXRpYyB2b2lkIGFjcGlfcHNfc3RhcnRfdHJhY2Uoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CitzdGF0aWMgdm9pZCBhY3BpX3BzX3N0b3BfdHJhY2Uoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX3BzX2V4ZWN1dGVfcGFzcyhzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7CitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3Bhc3Moc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CiAKIHN0YXRpYyB2b2lkCi1hY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbywgdTE2IGFjdGlvbik7CithY3BpX3BzX3VwZGF0ZV9wYXJhbWV0ZXJfbGlzdChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvLCB1MTYgYWN0aW9uKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMTMsNyArMTEzLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgdm9pZCBhY3BpX3BzX3N0YXJ0X3RyYWNlKHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKQorc3RhdGljIHZvaWQgYWNwaV9wc19zdGFydF90cmFjZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApAQCAtMTI1LDcgKzEyNSw3IEBACiAJfQogCiAJaWYgKCghYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUpIHx8Ci0JICAgIChhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSAhPSBpbmZvLT5ub2RlLT5uYW1lLmludGVnZXIpKSB7CisJICAgIChhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSAhPSBpbmZvLT5yZXNvbHZlZF9ub2RlLT5uYW1lLmludGVnZXIpKSB7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIGFjcGlfcHNfc3RvcF90cmFjZShzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAJfQogCiAJaWYgKCghYWNwaV9nYmxfdHJhY2VfbWV0aG9kX25hbWUpIHx8Ci0JICAgIChhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSAhPSBpbmZvLT5ub2RlLT5uYW1lLmludGVnZXIpKSB7CisJICAgIChhY3BpX2dibF90cmFjZV9tZXRob2RfbmFtZSAhPSBpbmZvLT5yZXNvbHZlZF9ub2RlLT5uYW1lLmludGVnZXIpKSB7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTIxMiwyMiArMjEyLDIzIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbykKK2FjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19leGVjdXRlX21ldGhvZCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocHNfZXhlY3V0ZV9tZXRob2QpOwogCiAJLyogVmFsaWRhdGUgdGhlIEluZm8gYW5kIG1ldGhvZCBOb2RlICovCiAKLQlpZiAoIWluZm8gfHwgIWluZm8tPm5vZGUpIHsKKwlpZiAoIWluZm8gfHwgIWluZm8tPnJlc29sdmVkX25vZGUpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05VTExfRU5UUlkpOwogCX0KIAogCS8qIEluaXQgZm9yIG5ldyBtZXRob2QsIHdhaXQgb24gY29uY3VycmVuY3kgc2VtYXBob3JlICovCiAKIAlzdGF0dXMgPQotCSAgICBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24oaW5mby0+bm9kZSwgaW5mby0+b2JqX2Rlc2MsIE5VTEwpOworCSAgICBhY3BpX2RzX2JlZ2luX21ldGhvZF9leGVjdXRpb24oaW5mby0+cmVzb2x2ZWRfbm9kZSwgaW5mby0+b2JqX2Rlc2MsCisJCQkJCSAgIE5VTEwpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CkBAIC0yNDgsNyArMjQ5LDcgQEAKIAkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAogCQkJICAiKioqKiBCZWdpbiBNZXRob2QgUGFyc2UgKioqKiBFbnRyeT0lcCBvYmo9JXBcbiIsCi0JCQkgIGluZm8tPm5vZGUsIGluZm8tPm9ial9kZXNjKSk7CisJCQkgIGluZm8tPnJlc29sdmVkX25vZGUsIGluZm8tPm9ial9kZXNjKSk7CiAKIAlpbmZvLT5wYXNzX251bWJlciA9IDE7CiAJc3RhdHVzID0gYWNwaV9wc19leGVjdXRlX3Bhc3MoaW5mbyk7CkBAIC0yNjEsNyArMjYyLDcgQEAKIAkgKi8KIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1BBUlNFLAogCQkJICAiKioqKiBCZWdpbiBNZXRob2QgRXhlY3V0aW9uICoqKiogRW50cnk9JXAgb2JqPSVwXG4iLAotCQkJICBpbmZvLT5ub2RlLCBpbmZvLT5vYmpfZGVzYykpOworCQkJICBpbmZvLT5yZXNvbHZlZF9ub2RlLCBpbmZvLT5vYmpfZGVzYykpOwogCiAJaW5mby0+cGFzc19udW1iZXIgPSAzOwogCXN0YXR1cyA9IGFjcGlfcHNfZXhlY3V0ZV9wYXNzKGluZm8pOwpAQCAtMjg2LDggKzI4Nyw3IEBACiAJICogYSBjb250cm9sIGV4Y2VwdGlvbiBjb2RlCiAJICovCiAJaWYgKGluZm8tPnJldHVybl9vYmplY3QpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9QQVJTRSwKLQkJCQkgICJNZXRob2QgcmV0dXJuZWQgb2JqX2Rlc2M9JXBcbiIsCisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfUEFSU0UsICJNZXRob2QgcmV0dXJuZWQgT2JqRGVzYz0lcFxuIiwKIAkJCQkgIGluZm8tPnJldHVybl9vYmplY3QpKTsKIAkJQUNQSV9EVU1QX1NUQUNLX0VOVFJZKGluZm8tPnJldHVybl9vYmplY3QpOwogCkBAIC0zMDEsNyArMzAxLDcgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3QKICAqCi0gKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gU2VlIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvCisgKiBQQVJBTUVURVJTOiAgSW5mbyAgICAgICAgICAgIC0gU2VlIHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVXNlZDogcGFyYW1ldGVyX3R5cGUgYW5kIFBhcmFtZXRlcnMpCiAgKiAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgIC0gQWRkIG9yIFJlbW92ZSByZWZlcmVuY2UKICAqCkBAIC0zMTIsMTQgKzMxMiwxNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogc3RhdGljIHZvaWQKLWFjcGlfcHNfdXBkYXRlX3BhcmFtZXRlcl9saXN0KHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1MTYgYWN0aW9uKQorYWNwaV9wc191cGRhdGVfcGFyYW1ldGVyX2xpc3Qoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbywgdTE2IGFjdGlvbikKIHsKIAlhY3BpX25hdGl2ZV91aW50IGk7CiAKIAlpZiAoKGluZm8tPnBhcmFtZXRlcl90eXBlID09IEFDUElfUEFSQU1fQVJHUykgJiYgKGluZm8tPnBhcmFtZXRlcnMpKSB7CisKIAkJLyogVXBkYXRlIHJlZmVyZW5jZSBjb3VudCBmb3IgZWFjaCBwYXJhbWV0ZXIgKi8KIAogCQlmb3IgKGkgPSAwOyBpbmZvLT5wYXJhbWV0ZXJzW2ldOyBpKyspIHsKKwogCQkJLyogSWdub3JlIGVycm9ycywganVzdCBkbyB0aGVtIGFsbCAqLwogCiAJCQkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKGluZm8tPgpAQCAtMzMzLDcgKzMzNSw3IEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcHNfZXhlY3V0ZV9wYXNzCiAgKgotICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbworICogUEFSQU1FVEVSUzogIEluZm8gICAgICAgICAgICAtIFNlZSBzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVzZWQ6IHBhc3NfbnVtYmVyLCBOb2RlLCBhbmQgb2JqX2Rlc2MpCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwpAQCAtMzQyLDEzICszNDQsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3Bhc3Moc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pCitzdGF0aWMgYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX3Bhc3Moc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwogCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJwc19leGVjdXRlX3Bhc3MiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHBzX2V4ZWN1dGVfcGFzcyk7CiAKIAkvKiBDcmVhdGUgYW5kIGluaXQgYSBSb290IE5vZGUgKi8KIApAQCAtMzY3LDcgKzM2OSw3IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX2RzX2luaXRfYW1sX3dhbGsod2Fsa19zdGF0ZSwgb3AsIGluZm8tPm5vZGUsCisJc3RhdHVzID0gYWNwaV9kc19pbml0X2FtbF93YWxrKHdhbGtfc3RhdGUsIG9wLCBpbmZvLT5yZXNvbHZlZF9ub2RlLAogCQkJCSAgICAgICBpbmZvLT5vYmpfZGVzYy0+bWV0aG9kLmFtbF9zdGFydCwKIAkJCQkgICAgICAgaW5mby0+b2JqX2Rlc2MtPm1ldGhvZC5hbWxfbGVuZ3RoLAogCQkJCSAgICAgICBpbmZvLT5wYXNzX251bWJlciA9PSAxID8gTlVMTCA6IGluZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDg5MjBlOGMuLjIyOGJkYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KQEAgLTkxLDcgKzkyLDcgQEAKIAlpbnQgY291bnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBlbnRyaWVzOwogfSBhY3BpX2xpbms7Ci1ERUNMQVJFX01VVEVYKGFjcGlfbGlua19sb2NrKTsKK0RFRklORV9NVVRFWChhY3BpX2xpbmtfbG9jayk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJIExpbmsgRGV2aWNlIE1hbmFnZW1lbnQKQEAgLTY0MSwxOSArNjQyLDE5IEBACiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQogCi0JZG93bigmYWNwaV9saW5rX2xvY2spOworCW11dGV4X2xvY2soJmFjcGlfbGlua19sb2NrKTsKIAlpZiAoYWNwaV9wY2lfbGlua19hbGxvY2F0ZShsaW5rKSkgewotCQl1cCgmYWNwaV9saW5rX2xvY2spOworCQltdXRleF91bmxvY2soJmFjcGlfbGlua19sb2NrKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9CiAKIAlpZiAoIWxpbmstPmlycS5hY3RpdmUpIHsKLQkJdXAoJmFjcGlfbGlua19sb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZhY3BpX2xpbmtfbG9jayk7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJMaW5rIGFjdGl2ZSBJUlEgaXMgMCFcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9CiAJbGluay0+cmVmY250Kys7Ci0JdXAoJmFjcGlfbGlua19sb2NrKTsKKwltdXRleF91bmxvY2soJmFjcGlfbGlua19sb2NrKTsKIAogCWlmICh0cmlnZ2VyaW5nKQogCQkqdHJpZ2dlcmluZyA9IGxpbmstPmlycS50cmlnZ2VyaW5nOwpAQCAtNjkxLDkgKzY5Miw5IEBACiAJCXJldHVybl9WQUxVRSgtMSk7CiAJfQogCi0JZG93bigmYWNwaV9saW5rX2xvY2spOworCW11dGV4X2xvY2soJmFjcGlfbGlua19sb2NrKTsKIAlpZiAoIWxpbmstPmlycS5pbml0aWFsaXplZCkgewotCQl1cCgmYWNwaV9saW5rX2xvY2spOworCQltdXRleF91bmxvY2soJmFjcGlfbGlua19sb2NrKTsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkxpbmsgaXNuJ3QgaW5pdGlhbGl6ZWRcbiIpKTsKIAkJcmV0dXJuX1ZBTFVFKC0xKTsKIAl9CkBAIC03MTYsNyArNzE3LDcgQEAKIAlpZiAobGluay0+cmVmY250ID09IDApIHsKIAkJYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QobGluay0+aGFuZGxlLCAiX0RJUyIsIDAsIE5VTEwpOwogCX0KLQl1cCgmYWNwaV9saW5rX2xvY2spOworCW11dGV4X3VubG9jaygmYWNwaV9saW5rX2xvY2spOwogCXJldHVybl9WQUxVRShsaW5rLT5pcnEuYWN0aXZlKTsKIH0KIApAQCAtNzQ3LDcgKzc0OCw3IEBACiAJc3RyY3B5KGFjcGlfZGV2aWNlX2NsYXNzKGRldmljZSksIEFDUElfUENJX0xJTktfQ0xBU1MpOwogCWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSA9IGxpbms7CiAKLQlkb3duKCZhY3BpX2xpbmtfbG9jayk7CisJbXV0ZXhfbG9jaygmYWNwaV9saW5rX2xvY2spOwogCXJlc3VsdCA9IGFjcGlfcGNpX2xpbmtfZ2V0X3Bvc3NpYmxlKGxpbmspOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gZW5kOwpAQCAtNzgyLDcgKzc4Myw3IEBACiAgICAgICBlbmQ6CiAJLyogZGlzYWJsZSBhbGwgbGlua3MgLS0gdG8gYmUgYWN0aXZhdGVkIG9uIHVzZSAqLwogCWFjcGlfdXRfZXZhbHVhdGVfb2JqZWN0KGxpbmstPmhhbmRsZSwgIl9ESVMiLCAwLCBOVUxMKTsKLQl1cCgmYWNwaV9saW5rX2xvY2spOworCW11dGV4X3VubG9jaygmYWNwaV9saW5rX2xvY2spOwogCiAJaWYgKHJlc3VsdCkKIAkJa2ZyZWUobGluayk7CkBAIC04NDAsOSArODQxLDkgQEAKIAogCWxpbmsgPSAoc3RydWN0IGFjcGlfcGNpX2xpbmsgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKLQlkb3duKCZhY3BpX2xpbmtfbG9jayk7CisJbXV0ZXhfbG9jaygmYWNwaV9saW5rX2xvY2spOwogCWxpc3RfZGVsKCZsaW5rLT5ub2RlKTsKLQl1cCgmYWNwaV9saW5rX2xvY2spOworCW11dGV4X3VubG9jaygmYWNwaV9saW5rX2xvY2spOwogCiAJa2ZyZWUobGluayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfY29yZS5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKaW5kZXggNzEzYjc2My4uZGVjYWViYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogfTsKIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcm9jZXNzb3JzW05SX0NQVVNdOwotc3RydWN0IGFjcGlfcHJvY2Vzc29yX2VycmF0YSBlcnJhdGE7CitzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfZXJyYXRhIGVycmF0YSBfX3JlYWRfbW9zdGx5OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJhdGEgSGFuZGxpbmcKQEAgLTM4OCw3ICszODgsNyBAQAogCiAvKiBVc2UgdGhlIGFjcGlpZCBpbiBNQURUIHRvIG1hcCBjcHVzIGluIGNhc2Ugb2YgU01QICovCiAjaWZuZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgY29udmVydF9hY3BpaWRfdG9fY3B1KGFjcGlfaWQpICgweGZmKQorI2RlZmluZSBjb252ZXJ0X2FjcGlpZF90b19jcHUoYWNwaV9pZCkgKC0xKQogI2Vsc2UKIAogI2lmZGVmIENPTkZJR19JQTY0CkBAIC00MDEsNyArNDAxLDcgQEAKICNkZWZpbmUgQVJDSF9CQURfQVBJQ0lECQkoMHhmZikKICNlbmRpZgogCi1zdGF0aWMgdTggY29udmVydF9hY3BpaWRfdG9fY3B1KHU4IGFjcGlfaWQpCitzdGF0aWMgaW50IGNvbnZlcnRfYWNwaWlkX3RvX2NwdSh1OCBhY3BpX2lkKQogewogCXUxNiBhcGljX2lkOwogCWludCBpOwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKIAl1bmlvbiBhY3BpX29iamVjdCBvYmplY3QgPSB7IDAgfTsKIAlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyID0geyBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpLCAmb2JqZWN0IH07Ci0JdTggY3B1X2luZGV4OworCWludCBjcHVfaW5kZXg7CiAJc3RhdGljIGludCBjcHUwX2luaXRpYWxpemVkOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8iKTsKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCWNwdV9pbmRleCA9IGNvbnZlcnRfYWNwaWlkX3RvX2NwdShwci0+YWNwaV9pZCk7CiAKIAkvKiBIYW5kbGUgVVAgc3lzdGVtIHJ1bm5pbmcgU01QIGtlcm5lbCwgd2l0aCBubyBMQVBJQyBpbiBNQURUICovCi0JaWYgKCFjcHUwX2luaXRpYWxpemVkICYmIChjcHVfaW5kZXggPT0gMHhmZikgJiYKKwlpZiAoIWNwdTBfaW5pdGlhbGl6ZWQgJiYgKGNwdV9pbmRleCA9PSAtMSkgJiYKIAkgICAgKG51bV9vbmxpbmVfY3B1cygpID09IDEpKSB7CiAJCWNwdV9pbmRleCA9IDA7CiAJfQpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAJICogIGxlc3MgdGhhbiB0aGUgbWF4ICMgb2YgQ1BVcy4gVGhleSBzaG91bGQgYmUgaWdub3JlZCBfaWZmCiAJICogIHRoZXkgYXJlIHBoeXNpY2FsbHkgbm90IHByZXNlbnQuCiAJICovCi0JaWYgKGNwdV9pbmRleCA+PSBOUl9DUFVTKSB7CisJaWYgKGNwdV9pbmRleCA9PSAtMSkgewogCQlpZiAoQUNQSV9GQUlMVVJFCiAJCSAgICAoYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQocHItPmhhbmRsZSwgJnByLT5pZCkpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLApAQCAtNTU4LDggKzU1OCw4IEBACiAJICovCiAJaWYgKHByb2Nlc3Nvcl9kZXZpY2VfYXJyYXlbcHItPmlkXSAhPSBOVUxMICYmCiAJICAgIHByb2Nlc3Nvcl9kZXZpY2VfYXJyYXlbcHItPmlkXSAhPSAodm9pZCAqKWRldmljZSkgewotCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiQklPUyByZXBvcnRpbmcgd3JvbmcgQUNQSSBpZCIKLQkJCSJmb3IgdGhlIHByb2Nlc3NvclxuIikpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJCSU9TIHJlcG9ydGVkIHdyb25nIEFDUEkgaWQiCisJCQkiZm9yIHRoZSBwcm9jZXNzb3JcbiIpOwogCQlyZXR1cm5fVkFMVUUoLUVOT0RFVik7CiAJfQogCXByb2Nlc3Nvcl9kZXZpY2VfYXJyYXlbcHItPmlkXSA9ICh2b2lkICopZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCA4MGZhNDM0Li4zYjk3YTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtNTQsMTAgKzU0LDEwIEBACiAjZGVmaW5lIFVTX1RPX1BNX1RJTUVSX1RJQ0tTKHQpCQkoKHQgKiAoUE1fVElNRVJfRlJFUVVFTkNZLzEwMDApKSAvIDEwMDApCiAjZGVmaW5lIEMyX09WRVJIRUFECQkJNAkvKiAxdXMgKDMuNTc5IHRpY2tzIHBlciB1cykgKi8KICNkZWZpbmUgQzNfT1ZFUkhFQUQJCQk0CS8qIDF1cyAoMy41NzkgdGlja3MgcGVyIHVzKSAqLwotc3RhdGljIHZvaWQgKCpwbV9pZGxlX3NhdmUpICh2b2lkKTsKK3N0YXRpYyB2b2lkICgqcG1faWRsZV9zYXZlKSAodm9pZCkgX19yZWFkX21vc3RseTsKIG1vZHVsZV9wYXJhbShtYXhfY3N0YXRlLCB1aW50LCAwNjQ0KTsKIAotc3RhdGljIHVuc2lnbmVkIGludCBub2NzdCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IG5vY3N0IF9fcmVhZF9tb3N0bHk7CiBtb2R1bGVfcGFyYW0obm9jc3QsIHVpbnQsIDAwMDApOwogCiAvKgpAQCAtNjcsNyArNjcsNyBAQAogICogMTAwIEhaOiAweDAwMDAwMDBGOiA0IGppZmZpZXMgPSA0MG1zCiAgKiByZWR1Y2UgaGlzdG9yeSBmb3IgbW9yZSBhZ2dyZXNzaXZlIGVudHJ5IGludG8gQzMKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBibV9oaXN0b3J5ID0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm1faGlzdG9yeSBfX3JlYWRfbW9zdGx5ID0KICAgICAoSFogPj0gODAwID8gMHhGRkZGRkZGRiA6ICgoMVUgPDwgKEhaIC8gMjUpKSAtIDEpKTsKIG1vZHVsZV9wYXJhbShibV9oaXN0b3J5LCB1aW50LCAwNjQ0KTsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMDgxLDcgKzEwODEsNyBAQAogCQkJICAgICAgc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gMDsKLQlzdGF0aWMgaW50IGZpcnN0X3J1biA9IDA7CisJc3RhdGljIGludCBmaXJzdF9ydW47CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeSA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKaW5kZXggZjM2ZGIyMi4uNDFhYWFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9wZXJmbGliLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNlbmRpZgpAQCAtNDgsNyArNDksNyBAQAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKIEFDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKIAotc3RhdGljIERFQ0xBUkVfTVVURVgocGVyZm9ybWFuY2Vfc2VtKTsKK3N0YXRpYyBERUZJTkVfTVVURVgocGVyZm9ybWFuY2VfbXV0ZXgpOwogCiAvKgogICogX1BQQyBzdXBwb3J0IGlzIGltcGxlbWVudGVkIGFzIGEgQ1BVZnJlcSBwb2xpY3kgbm90aWZpZXI6CkBAIC03Miw3ICs3Myw3IEBACiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKIAl1bnNpZ25lZCBpbnQgcHBjID0gMDsKIAotCWRvd24oJnBlcmZvcm1hbmNlX3NlbSk7CisJbXV0ZXhfbG9jaygmcGVyZm9ybWFuY2VfbXV0ZXgpOwogCiAJaWYgKGV2ZW50ICE9IENQVUZSRVFfSU5DT01QQVRJQkxFKQogCQlnb3RvIG91dDsKQEAgLTkzLDcgKzk0LDcgQEAKIAkJCQkgICAgIGNvcmVfZnJlcXVlbmN5ICogMTAwMCk7CiAKICAgICAgIG91dDoKLQl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJnBlcmZvcm1hbmNlX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTUzLDYgKzU1NCwyMzAgQEAKIH0KICNlbmRpZgkJCQkvKiBDT05GSUdfWDg2X0FDUElfQ1BVRlJFUV9QUk9DX0lOVEYgKi8KIAorc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfcHNkKHN0cnVjdCBhY3BpX3Byb2Nlc3NvcgkqcHIpCit7CisJaW50IHJlc3VsdCA9IDA7CisJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHtBQ1BJX0FMTE9DQVRFX0JVRkZFUiwgTlVMTH07CisJc3RydWN0IGFjcGlfYnVmZmVyIGZvcm1hdCA9IHtzaXplb2YoIk5OTk5OIiksICJOTk5OTiJ9OworCXN0cnVjdCBhY3BpX2J1ZmZlciBzdGF0ZSA9IHswLCBOVUxMfTsKKwl1bmlvbiBhY3BpX29iamVjdCAgKnBzZCA9IE5VTEw7CisJc3RydWN0IGFjcGlfcHNkX3BhY2thZ2UgKnBkb21haW47CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChwci0+aGFuZGxlLCAiX1BTRCIsIE5VTEwsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwc2QgPSAodW5pb24gYWNwaV9vYmplY3QgKikgYnVmZmVyLnBvaW50ZXI7CisJaWYgKCFwc2QgfHwgKHBzZC0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkludmFsaWQgX1BTRCBkYXRhXG4iKSk7CisJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChwc2QtPnBhY2thZ2UuY291bnQgIT0gMSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfUFNEIGRhdGFcbiIpKTsKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJZ290byBlbmQ7CisJfQorCisJcGRvbWFpbiA9ICYocHItPnBlcmZvcm1hbmNlLT5kb21haW5faW5mbyk7CisKKwlzdGF0ZS5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcHNkX3BhY2thZ2UpOworCXN0YXRlLnBvaW50ZXIgPSBwZG9tYWluOworCisJc3RhdHVzID0gYWNwaV9leHRyYWN0X3BhY2thZ2UoJihwc2QtPnBhY2thZ2UuZWxlbWVudHNbMF0pLAorCQkmZm9ybWF0LCAmc3RhdGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiSW52YWxpZCBfUFNEIGRhdGFcbiIpKTsKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHBkb21haW4tPm51bV9lbnRyaWVzICE9IEFDUElfUFNEX1JFVjBfRU5UUklFUykgeworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiVW5rbm93biBfUFNEOm51bV9lbnRyaWVzXG4iKSk7CisJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChwZG9tYWluLT5yZXZpc2lvbiAhPSBBQ1BJX1BTRF9SRVYwX1JFVklTSU9OKSB7CisJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJVbmtub3duIF9QU0Q6cmV2aXNpb25cbiIpKTsKKwkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJZ290byBlbmQ7CisJfQorCitlbmQ6CisJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgYWNwaV9wcm9jZXNzb3JfcHJlcmVnaXN0ZXJfcGVyZm9ybWFuY2UoCisJCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZSAqKnBlcmZvcm1hbmNlKQoreworCWludCBjb3VudCwgY291bnRfdGFyZ2V0OworCWludCByZXR2YWwgPSAwOworCXVuc2lnbmVkIGludCBpLCBqOworCWNwdW1hc2tfdCBjb3ZlcmVkX2NwdXM7CisJc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcjsKKwlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSAqcGRvbWFpbjsKKwlzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKm1hdGNoX3ByOworCXN0cnVjdCBhY3BpX3BzZF9wYWNrYWdlICptYXRjaF9wZG9tYWluOworCisJbXV0ZXhfbG9jaygmcGVyZm9ybWFuY2VfbXV0ZXgpOworCisJcmV0dmFsID0gMDsKKworCS8qIENhbGwgX1BTRCBmb3IgYWxsIENQVXMgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlwciA9IHByb2Nlc3NvcnNbaV07CisJCWlmICghcHIpIHsKKwkJCS8qIExvb2sgb25seSBhdCBwcm9jZXNzb3JzIGluIEFDUEkgbmFtZXNwYWNlICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwci0+cGVyZm9ybWFuY2UpIHsKKwkJCXJldHZhbCA9IC1FQlVTWTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFwZXJmb3JtYW5jZSB8fCAhcGVyZm9ybWFuY2VbaV0pIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByLT5wZXJmb3JtYW5jZSA9IHBlcmZvcm1hbmNlW2ldOworCQljcHVfc2V0KGksIHByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX2NwdV9tYXApOworCQlpZiAoYWNwaV9wcm9jZXNzb3JfZ2V0X3BzZChwcikpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycl9yZXQ7CisKKwkvKgorCSAqIE5vdyB0aGF0IHdlIGhhdmUgX1BTRCBkYXRhIGZyb20gYWxsIENQVXMsIGxldHMgc2V0dXAgUC1zdGF0ZSAKKwkgKiBkb21haW4gaW5mby4KKwkgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlwciA9IHByb2Nlc3NvcnNbaV07CisJCWlmICghcHIpCisJCQljb250aW51ZTsKKworCQkvKiBCYXNpYyB2YWxpZGl0eSBjaGVjayBmb3IgZG9tYWluIGluZm8gKi8KKwkJcGRvbWFpbiA9ICYocHItPnBlcmZvcm1hbmNlLT5kb21haW5faW5mbyk7CisJCWlmICgocGRvbWFpbi0+cmV2aXNpb24gIT0gQUNQSV9QU0RfUkVWMF9SRVZJU0lPTikgfHwKKwkJICAgIChwZG9tYWluLT5udW1fZW50cmllcyAhPSBBQ1BJX1BTRF9SRVYwX0VOVFJJRVMpKSB7CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcmV0OworCQl9CisJCWlmIChwZG9tYWluLT5jb29yZF90eXBlICE9IERPTUFJTl9DT09SRF9UWVBFX1NXX0FMTCAmJgorCQkgICAgcGRvbWFpbi0+Y29vcmRfdHlwZSAhPSBET01BSU5fQ09PUkRfVFlQRV9TV19BTlkgJiYKKwkJICAgIHBkb21haW4tPmNvb3JkX3R5cGUgIT0gRE9NQUlOX0NPT1JEX1RZUEVfSFdfQUxMKSB7CisJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJZ290byBlcnJfcmV0OworCQl9CisJfQorCisJY3B1c19jbGVhcihjb3ZlcmVkX2NwdXMpOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXByID0gcHJvY2Vzc29yc1tpXTsKKwkJaWYgKCFwcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChjcHVfaXNzZXQoaSwgY292ZXJlZF9jcHVzKSkKKwkJCWNvbnRpbnVlOworCisJCXBkb21haW4gPSAmKHByLT5wZXJmb3JtYW5jZS0+ZG9tYWluX2luZm8pOworCQljcHVfc2V0KGksIHByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX2NwdV9tYXApOworCQljcHVfc2V0KGksIGNvdmVyZWRfY3B1cyk7CisJCWlmIChwZG9tYWluLT5udW1fcHJvY2Vzc29ycyA8PSAxKQorCQkJY29udGludWU7CisKKwkJLyogVmFsaWRhdGUgdGhlIERvbWFpbiBpbmZvICovCisJCWNvdW50X3RhcmdldCA9IHBkb21haW4tPm51bV9wcm9jZXNzb3JzOworCQljb3VudCA9IDE7CisJCWlmIChwZG9tYWluLT5jb29yZF90eXBlID09IERPTUFJTl9DT09SRF9UWVBFX1NXX0FMTCB8fAorCQkgICAgcGRvbWFpbi0+Y29vcmRfdHlwZSA9PSBET01BSU5fQ09PUkRfVFlQRV9IV19BTEwpIHsKKwkJCXByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX3R5cGUgPSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FMTDsKKwkJfSBlbHNlIGlmIChwZG9tYWluLT5jb29yZF90eXBlID09IERPTUFJTl9DT09SRF9UWVBFX1NXX0FOWSkgeworCQkJcHItPnBlcmZvcm1hbmNlLT5zaGFyZWRfdHlwZSA9IENQVUZSRVFfU0hBUkVEX1RZUEVfQU5ZOworCQl9CisKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJCWlmIChpID09IGopCisJCQkJY29udGludWU7CisKKwkJCW1hdGNoX3ByID0gcHJvY2Vzc29yc1tqXTsKKwkJCWlmICghbWF0Y2hfcHIpCisJCQkJY29udGludWU7CisKKwkJCW1hdGNoX3Bkb21haW4gPSAmKG1hdGNoX3ByLT5wZXJmb3JtYW5jZS0+ZG9tYWluX2luZm8pOworCQkJaWYgKG1hdGNoX3Bkb21haW4tPmRvbWFpbiAhPSBwZG9tYWluLT5kb21haW4pCisJCQkJY29udGludWU7CisKKwkJCS8qIEhlcmUgaSBhbmQgaiBhcmUgaW4gdGhlIHNhbWUgZG9tYWluICovCisKKwkJCWlmIChtYXRjaF9wZG9tYWluLT5udW1fcHJvY2Vzc29ycyAhPSBjb3VudF90YXJnZXQpIHsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX3JldDsKKwkJCX0KKworCQkJaWYgKHBkb21haW4tPmNvb3JkX3R5cGUgIT0gbWF0Y2hfcGRvbWFpbi0+Y29vcmRfdHlwZSkgeworCQkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQkJZ290byBlcnJfcmV0OworCQkJfQorCisJCQljcHVfc2V0KGosIGNvdmVyZWRfY3B1cyk7CisJCQljcHVfc2V0KGosIHByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX2NwdV9tYXApOworCQkJY291bnQrKzsKKwkJfQorCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCQlpZiAoaSA9PSBqKQorCQkJCWNvbnRpbnVlOworCisJCQltYXRjaF9wciA9IHByb2Nlc3NvcnNbal07CisJCQlpZiAoIW1hdGNoX3ByKQorCQkJCWNvbnRpbnVlOworCisJCQltYXRjaF9wZG9tYWluID0gJihtYXRjaF9wci0+cGVyZm9ybWFuY2UtPmRvbWFpbl9pbmZvKTsKKwkJCWlmIChtYXRjaF9wZG9tYWluLT5kb21haW4gIT0gcGRvbWFpbi0+ZG9tYWluKQorCQkJCWNvbnRpbnVlOworCisJCQltYXRjaF9wci0+cGVyZm9ybWFuY2UtPnNoYXJlZF90eXBlID0gCisJCQkJCXByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX3R5cGU7CisJCQltYXRjaF9wci0+cGVyZm9ybWFuY2UtPnNoYXJlZF9jcHVfbWFwID0KKwkJCQlwci0+cGVyZm9ybWFuY2UtPnNoYXJlZF9jcHVfbWFwOworCQl9CisJfQorCitlcnJfcmV0OgorCWlmIChyZXR2YWwpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9FUlJPUiwgIkVycm9yIHdoaWxlIHBhcnNpbmcgX1BTRCBkb21haW4gaW5mb3JtYXRpb24uIEFzc3VtaW5nIG5vIGNvb3JkaW5hdGlvblxuIikpOworCX0KKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXByID0gcHJvY2Vzc29yc1tpXTsKKwkJaWYgKCFwciB8fCAhcHItPnBlcmZvcm1hbmNlKQorCQkJY29udGludWU7CisKKwkJLyogQXNzdW1lIG5vIGNvb3JkaW5hdGlvbiBvbiBhbnkgZXJyb3IgcGFyc2luZyBkb21haW4gaW5mbyAqLworCQlpZiAocmV0dmFsKSB7CisJCQljcHVzX2NsZWFyKHByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX2NwdV9tYXApOworCQkJY3B1X3NldChpLCBwci0+cGVyZm9ybWFuY2UtPnNoYXJlZF9jcHVfbWFwKTsKKwkJCXByLT5wZXJmb3JtYW5jZS0+c2hhcmVkX3R5cGUgPSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FMTDsKKwkJfQorCQlwci0+cGVyZm9ybWFuY2UgPSBOVUxMOyAvKiBXaWxsIGJlIHNldCBmb3IgcmVhbCBpbiByZWdpc3RlciAqLworCX0KKworCW11dGV4X3VubG9jaygmcGVyZm9ybWFuY2VfbXV0ZXgpOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGFjcGlfcHJvY2Vzc29yX3ByZXJlZ2lzdGVyX3BlcmZvcm1hbmNlKTsKKworCiBpbnQKIGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQogCQkJCSAgICAqcGVyZm9ybWFuY2UsIHVuc2lnbmVkIGludCBjcHUpCkBAIC01NjQsMTYgKzc4OSwxNiBAQAogCWlmICghKGFjcGlfcHJvY2Vzc29yX3BwY19zdGF0dXMgJiBQUENfUkVHSVNURVJFRCkpCiAJCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKIAotCWRvd24oJnBlcmZvcm1hbmNlX3NlbSk7CisJbXV0ZXhfbG9jaygmcGVyZm9ybWFuY2VfbXV0ZXgpOwogCiAJcHIgPSBwcm9jZXNzb3JzW2NwdV07CiAJaWYgKCFwcikgewotCQl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwZXJmb3JtYW5jZV9tdXRleCk7CiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIAl9CiAKIAlpZiAocHItPnBlcmZvcm1hbmNlKSB7Ci0JCXVwKCZwZXJmb3JtYW5jZV9zZW0pOworCQltdXRleF91bmxvY2soJnBlcmZvcm1hbmNlX211dGV4KTsKIAkJcmV0dXJuX1ZBTFVFKC1FQlVTWSk7CiAJfQogCkBAIC01ODMsMTMgKzgwOCwxMyBAQAogCiAJaWYgKGFjcGlfcHJvY2Vzc29yX2dldF9wZXJmb3JtYW5jZV9pbmZvKHByKSkgewogCQlwci0+cGVyZm9ybWFuY2UgPSBOVUxMOwotCQl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKKwkJbXV0ZXhfdW5sb2NrKCZwZXJmb3JtYW5jZV9tdXRleCk7CiAJCXJldHVybl9WQUxVRSgtRUlPKTsKIAl9CiAKIAlhY3BpX2NwdWZyZXFfYWRkX2ZpbGUocHIpOwogCi0JdXAoJnBlcmZvcm1hbmNlX3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZwZXJmb3JtYW5jZV9tdXRleCk7CiAJcmV0dXJuX1ZBTFVFKDApOwogfQogCkBAIC02MDMsMTEgKzgyOCwxMSBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9wcm9jZXNzb3JfdW5yZWdpc3Rlcl9wZXJmb3JtYW5jZSIpOwogCi0JZG93bigmcGVyZm9ybWFuY2Vfc2VtKTsKKwltdXRleF9sb2NrKCZwZXJmb3JtYW5jZV9tdXRleCk7CiAKIAlwciA9IHByb2Nlc3NvcnNbY3B1XTsKIAlpZiAoIXByKSB7Ci0JCXVwKCZwZXJmb3JtYW5jZV9zZW0pOworCQltdXRleF91bmxvY2soJnBlcmZvcm1hbmNlX211dGV4KTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC02MTcsNyArODQyLDcgQEAKIAogCWFjcGlfY3B1ZnJlcV9yZW1vdmVfZmlsZShwcik7CiAKLQl1cCgmcGVyZm9ybWFuY2Vfc2VtKTsKKwltdXRleF91bmxvY2soJnBlcmZvcm1hbmNlX211dGV4KTsKIAogCXJldHVybl9WT0lEOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjYWxjLmMKaW5kZXggNDAzOGRiZi4uY2Y4N2IwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NhbGMuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY2FsYy5jCkBAIC03OCw2ICs3OCw3IEBACiAJQUNQSV9GVU5DVElPTl9FTlRSWSgpOwogCiAJZm9yIChiaXRzX3NldCA9IDA7IGJpdF9maWVsZDsgYml0c19zZXQrKykgeworCiAJCS8qIFplcm8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0aGF0IGlzIHNldCAqLwogCiAJCWJpdF9maWVsZCAmPSAoYml0X2ZpZWxkIC0gMSk7CkBAIC0xNTQsMTUgKzE1NSwxOCBAQAogCSAqIGxlbmd0aCwgbWludXMgb25lIGJ5dGUgZm9yIHRoZSByZXNvdXJjZV9zb3VyY2VfaW5kZXggaXRzZWxmLgogCSAqLwogCWlmIChyZXNvdXJjZV9sZW5ndGggPiBtaW5pbXVtX2FtbF9yZXNvdXJjZV9sZW5ndGgpIHsKKwogCQkvKiBDb21wdXRlIHRoZSBsZW5ndGggb2YgdGhlIG9wdGlvbmFsIHN0cmluZyAqLwogCiAJCXN0cmluZ19sZW5ndGggPQogCQkgICAgcmVzb3VyY2VfbGVuZ3RoIC0gbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoIC0gMTsKIAl9CiAKLQkvKiBSb3VuZCB1cCBsZW5ndGggdG8gMzIgYml0cyBmb3IgaW50ZXJuYWwgc3RydWN0dXJlIGFsaWdubWVudCAqLwotCi0JcmV0dXJuIChBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMoc3RyaW5nX2xlbmd0aCkpOworCS8qCisJICogUm91bmQgdGhlIGxlbmd0aCB1cCB0byBhIG11bHRpcGxlIG9mIHRoZSBuYXRpdmUgd29yZCBpbiBvcmRlciB0bworCSAqIGd1YXJhbnRlZSB0aGF0IHRoZSBlbnRpcmUgcmVzb3VyY2UgZGVzY3JpcHRvciBpcyBuYXRpdmUgd29yZCBhbGlnbmVkCisJICovCisJcmV0dXJuICgodTMyKSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHN0cmluZ19sZW5ndGgpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4NiwxMSArMTkwLDEyIEBACiAJYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7CiAJYWNwaV9yc19sZW5ndGggdG90YWxfc2l6ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9hbWxfbGVuZ3RoIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfYW1sX2xlbmd0aCk7CiAKIAkvKiBUcmF2ZXJzZSBlbnRpcmUgbGlzdCBvZiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLwogCiAJd2hpbGUgKHJlc291cmNlKSB7CisKIAkJLyogVmFsaWRhdGUgdGhlIGRlc2NyaXB0b3IgdHlwZSAqLwogCiAJCWlmIChyZXNvdXJjZS0+dHlwZSA+IEFDUElfUkVTT1VSQ0VfVFlQRV9NQVgpIHsKQEAgLTIxNCw2ICsyMTksNyBAQAogCQkJICogaXMgYSBMYXJnZSBSZXNvdXJjZSBkYXRhIHR5cGUuCiAJCQkgKi8KIAkJCWlmIChyZXNvdXJjZS0+ZGF0YS52ZW5kb3IuYnl0ZV9sZW5ndGggPiA3KSB7CisKIAkJCQkvKiBCYXNlIHNpemUgb2YgYSBMYXJnZSByZXNvdXJjZSBkZXNjcmlwdG9yICovCiAKIAkJCQl0b3RhbF9zaXplID0KQEAgLTMzMiwyMCArMzM4LDIyIEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXU4ICplbmRfYW1sOwogCXU4ICpidWZmZXI7Ci0JdTMyIGJ1ZmZlcl9zaXplID0gMDsKKwl1MzIgYnVmZmVyX3NpemU7CiAJdTE2IHRlbXAxNjsKIAl1MTYgcmVzb3VyY2VfbGVuZ3RoOwogCXUzMiBleHRyYV9zdHJ1Y3RfYnl0ZXM7CiAJdTggcmVzb3VyY2VfaW5kZXg7CiAJdTggbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X2xpc3RfbGVuZ3RoIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfbGlzdF9sZW5ndGgpOwogCisJKnNpemVfbmVlZGVkID0gMDsKIAllbmRfYW1sID0gYW1sX2J1ZmZlciArIGFtbF9idWZmZXJfbGVuZ3RoOwogCiAJLyogV2FsayB0aGUgbGlzdCBvZiBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcnMgKi8KIAogCXdoaWxlIChhbWxfYnVmZmVyIDwgZW5kX2FtbCkgeworCiAJCS8qIFZhbGlkYXRlIHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBSZXNvdXJjZSBMZW5ndGggKi8KIAogCQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKGFtbF9idWZmZXIsICZyZXNvdXJjZV9pbmRleCk7CkBAIC0zODYsMzUgKzM5NCwyOCBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfVkVORE9SX1NNQUxMOgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0U6CiAJCQkvKgogCQkJICogVmVuZG9yIFJlc291cmNlOgotCQkJICogRW5zdXJlIGEgMzItYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCisJCQkgKiBHZXQgdGhlIG51bWJlciBvZiB2ZW5kb3IgZGF0YSBieXRlcwogCQkJICovCi0JCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPQotCQkJICAgIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyhyZXNvdXJjZV9sZW5ndGgpOworCQkJZXh0cmFfc3RydWN0X2J5dGVzID0gcmVzb3VyY2VfbGVuZ3RoOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRzoKIAkJCS8qCi0JCQkgKiBFbmQgVGFnOiBUaGlzIGlzIHRoZSBub3JtYWwgZXhpdCwgYWRkIHNpemUgb2YgZW5kX3RhZworCQkJICogRW5kIFRhZzoKKwkJCSAqIFRoaXMgaXMgdGhlIG5vcm1hbCBleGl0LCBhZGQgc2l6ZSBvZiBlbmRfdGFnCiAJCQkgKi8KLQkJCSpzaXplX25lZWRlZCA9IGJ1ZmZlcl9zaXplICsgQUNQSV9SU19TSVpFX01JTjsKKwkJCSpzaXplX25lZWRlZCArPSBBQ1BJX1JTX1NJWkVfTUlOOwogCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAotCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9WRU5ET1JfTEFSR0U6Ci0JCQkvKgotCQkJICogVmVuZG9yIFJlc291cmNlOgotCQkJICogQWRkIHZlbmRvciBkYXRhIGFuZCBlbnN1cmUgYSAzMi1iaXQgYm91bmRhcnkgZm9yIHRoZSBzdHJ1Y3R1cmUKLQkJCSAqLwotCQkJZXh0cmFfc3RydWN0X2J5dGVzID0KLQkJCSAgICBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMocmVzb3VyY2VfbGVuZ3RoKTsKLQkJCWJyZWFrOwotCiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1MzMjoKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfQUREUkVTUzE2OgorCQljYXNlIEFDUElfUkVTT1VSQ0VfTkFNRV9BRERSRVNTNjQ6CiAJCQkvKgotCQkJICogMzItQml0IG9yIDE2LWJpdCBBZGRyZXNzIFJlc291cmNlOgotCQkJICogQWRkIHRoZSBzaXplIG9mIGFueSBvcHRpb25hbCBkYXRhIChyZXNvdXJjZV9zb3VyY2UpCisJCQkgKiBBZGRyZXNzIFJlc291cmNlOgorCQkJICogQWRkIHRoZSBzaXplIG9mIHRoZSBvcHRpb25hbCByZXNvdXJjZV9zb3VyY2UKIAkJCSAqLwogCQkJZXh0cmFfc3RydWN0X2J5dGVzID0KIAkJCSAgICBhY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHJlc291cmNlX2xlbmd0aCwKQEAgLTQyMyw1MCArNDI0LDQ2IEBACiAKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX05BTUVfRVhURU5ERURfSVJROgogCQkJLyoKLQkJCSAqIEV4dGVuZGVkIElSUToKLQkJCSAqIFBvaW50IHBhc3QgdGhlIGludGVycnVwdF92ZWN0b3JfZmxhZ3MgdG8gZ2V0IHRoZQotCQkJICogaW50ZXJydXB0X3RhYmxlX2xlbmd0aC4KKwkJCSAqIEV4dGVuZGVkIElSUSBSZXNvdXJjZToKKwkJCSAqIFVzaW5nIHRoZSBpbnRlcnJ1cHRfdGFibGVfbGVuZ3RoLCBhZGQgNCBieXRlcyBmb3IgZWFjaCBhZGRpdGlvbmFsCisJCQkgKiBpbnRlcnJ1cHQuIE5vdGU6IGF0IGxlYXN0IG9uZSBpbnRlcnJ1cHQgaXMgcmVxdWlyZWQgYW5kIGlzCisJCQkgKiBpbmNsdWRlZCBpbiB0aGUgbWluaW11bSBkZXNjcmlwdG9yIHNpemUgKHJlYXNvbiBmb3IgdGhlIC0xKQogCQkJICovCi0JCQlidWZmZXIrKzsKKwkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9IChidWZmZXJbMV0gLSAxKSAqIHNpemVvZih1MzIpOwogCi0JCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgPQotCQkJICAgIC8qCi0JCQkgICAgICogQWRkIDQgYnl0ZXMgZm9yIGVhY2ggYWRkaXRpb25hbCBpbnRlcnJ1cHQuIE5vdGU6IGF0Ci0JCQkgICAgICogbGVhc3Qgb25lIGludGVycnVwdCBpcyByZXF1aXJlZCBhbmQgaXMgaW5jbHVkZWQgaW4KLQkJCSAgICAgKiB0aGUgbWluaW11bSBkZXNjcmlwdG9yIHNpemUKLQkJCSAgICAgKi8KLQkJCSAgICAoKCpidWZmZXIgLSAxKSAqIHNpemVvZih1MzIpKSArCi0JCQkgICAgLyogQWRkIHRoZSBzaXplIG9mIGFueSBvcHRpb25hbCBkYXRhIChyZXNvdXJjZV9zb3VyY2UpICovCisJCQkvKiBBZGQgdGhlIHNpemUgb2YgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSAqLworCisJCQlleHRyYV9zdHJ1Y3RfYnl0ZXMgKz0KIAkJCSAgICBhY3BpX3JzX3N0cmVhbV9vcHRpb25fbGVuZ3RoKHJlc291cmNlX2xlbmd0aCAtCiAJCQkJCQkJIGV4dHJhX3N0cnVjdF9ieXRlcywKIAkJCQkJCQkgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKTsKIAkJCWJyZWFrOwogCi0JCWNhc2UgQUNQSV9SRVNPVVJDRV9OQU1FX0FERFJFU1M2NDoKLQkJCS8qCi0JCQkgKiA2NC1CaXQgQWRkcmVzcyBSZXNvdXJjZToKLQkJCSAqIEFkZCB0aGUgc2l6ZSBvZiBhbnkgb3B0aW9uYWwgZGF0YSAocmVzb3VyY2Vfc291cmNlKQotCQkJICogRW5zdXJlIGEgNjQtYml0IGJvdW5kYXJ5IGZvciB0aGUgc3RydWN0dXJlCi0JCQkgKi8KLQkJCWV4dHJhX3N0cnVjdF9ieXRlcyA9Ci0JCQkgICAgQUNQSV9ST1VORF9VUF90b182NF9iSVRTCi0JCQkgICAgKGFjcGlfcnNfc3RyZWFtX29wdGlvbl9sZW5ndGgKLQkJCSAgICAgKHJlc291cmNlX2xlbmd0aCwgbWluaW11bV9hbWxfcmVzb3VyY2VfbGVuZ3RoKSk7Ci0JCQlicmVhazsKLQogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KIAotCQkvKiBVcGRhdGUgdGhlIHJlcXVpcmVkIGJ1ZmZlciBzaXplIGZvciB0aGUgaW50ZXJuYWwgZGVzY3JpcHRvciBzdHJ1Y3RzICovCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgcmVxdWlyZWQgYnVmZmVyIHNpemUgZm9yIHRoZSBpbnRlcm5hbCBkZXNjcmlwdG9yIHN0cnVjdHMKKwkJICoKKwkJICogSW1wb3J0YW50OiBSb3VuZCB0aGUgc2l6ZSB1cCBmb3IgdGhlIGFwcHJvcHJpYXRlIGFsaWdubWVudC4gVGhpcworCQkgKiBpcyBhIHJlcXVpcmVtZW50IG9uIElBNjQuCisJCSAqLworCQlidWZmZXJfc2l6ZSA9IGFjcGlfZ2JsX3Jlc291cmNlX3N0cnVjdF9zaXplc1tyZXNvdXJjZV9pbmRleF0gKworCQkgICAgZXh0cmFfc3RydWN0X2J5dGVzOworCQlidWZmZXJfc2l6ZSA9ICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQoYnVmZmVyX3NpemUpOwogCi0JCXRlbXAxNiA9ICh1MTYpIChhY3BpX2dibF9yZXNvdXJjZV9zdHJ1Y3Rfc2l6ZXNbcmVzb3VyY2VfaW5kZXhdICsKLQkJCQlleHRyYV9zdHJ1Y3RfYnl0ZXMpOwotCQlidWZmZXJfc2l6ZSArPSAodTMyKSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKHRlbXAxNik7CisJCSpzaXplX25lZWRlZCArPSBidWZmZXJfc2l6ZTsKKworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1JFU09VUkNFUywKKwkJCQkgICJUeXBlICUuMlgsIEFtbExlbmd0aCAlLjJYIEludGVybmFsTGVuZ3RoICUuMlhcbiIsCisJCQkJICBhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbF9idWZmZXIpLAorCQkJCSAgYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9sZW5ndGgoYW1sX2J1ZmZlciksCisJCQkJICBidWZmZXJfc2l6ZSkpOwogCiAJCS8qCi0JCSAqIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIHdpdGhpbiB0aGUgc3RyZWFtCi0JCSAqIHVzaW5nIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgcGx1cyB0aGUgbGVuZ3RoIGNvbnRhaW5lZCBpbiB0aGUgaGVhZGVyCisJCSAqIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIHdpdGhpbiB0aGUgQU1MIHN0cmVhbSB1c2luZyB0aGUgbGVuZ3RoCisJCSAqIGNvbnRhaW5lZCBpbiB0aGUgcmVzb3VyY2UgZGVzY3JpcHRvciBoZWFkZXIKIAkJICovCiAJCWFtbF9idWZmZXIgKz0gYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9sZW5ndGgoYW1sX2J1ZmZlcik7CiAJfQpAQCAtNTA2LDcgKzUwMyw3IEBACiAJdTggbmFtZV9mb3VuZDsKIAl1MzIgdGFibGVfaW5kZXg7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfcGNpX3JvdXRpbmdfdGFibGVfbGVuZ3RoKTsKIAogCW51bWJlcl9vZl9lbGVtZW50cyA9IHBhY2thZ2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50OwogCkBAIC01MjMsNiArNTIwLDcgQEAKIAl0b3Bfb2JqZWN0X2xpc3QgPSBwYWNrYWdlX29iamVjdC0+cGFja2FnZS5lbGVtZW50czsKIAogCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG51bWJlcl9vZl9lbGVtZW50czsgaW5kZXgrKykgeworCiAJCS8qIERlcmVmZXJlbmNlIHRoZSBzdWItcGFja2FnZSAqLwogCiAJCXBhY2thZ2VfZWxlbWVudCA9ICp0b3Bfb2JqZWN0X2xpc3Q7CkBAIC01ODEsNyArNTc5LDcgQEAKIAogCQkvKiBSb3VuZCB1cCB0aGUgc2l6ZSBzaW5jZSBlYWNoIGVsZW1lbnQgbXVzdCBiZSBhbGlnbmVkICovCiAKLQkJdGVtcF9zaXplX25lZWRlZCA9IEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyh0ZW1wX3NpemVfbmVlZGVkKTsKKwkJdGVtcF9zaXplX25lZWRlZCA9IEFDUElfUk9VTkRfVVBfVE9fNjRCSVQodGVtcF9zaXplX25lZWRlZCk7CiAKIAkJLyogUG9pbnQgdG8gdGhlIG5leHQgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqLwogCkBAIC01ODksNyArNTg3LDcgQEAKIAl9CiAKIAkvKgotCSAqIEFkZGluZyBhbiBleHRyYSBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGVzc2VudGlhbGx5IGEKKwkgKiBBZGQgYW4gZXh0cmEgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlc3NlbnRpYWxseSBhCiAJICogTlVMTCB0ZXJtaW5hdG9yCiAJICovCiAJKmJ1ZmZlcl9zaXplX25lZWRlZCA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzY3JlYXRlLmMKaW5kZXggOGMxMjhkZS4uMDA4MDU4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2NyZWF0ZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNjcmVhdGUuYwpAQCAtNzUsMTAgKzc1LDExIEBACiAJdTggKmFtbF9zdGFydDsKIAlhY3BpX3NpemUgbGlzdF9zaXplX25lZWRlZCA9IDA7CiAJdTMyIGFtbF9idWZmZXJfbGVuZ3RoOworCXZvaWQgKnJlc291cmNlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX3Jlc291cmNlX2xpc3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NyZWF0ZV9yZXNvdXJjZV9saXN0KTsKIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgImFtbF9idWZmZXIgPSAlcFxuIiwgYW1sX2J1ZmZlcikpOworCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFtbEJ1ZmZlciA9ICVwXG4iLCBhbWxfYnVmZmVyKSk7CiAKIAkvKiBQYXJhbXMgYWxyZWFkeSB2YWxpZGF0ZWQsIHNvIHdlIGRvbid0IHJlLXZhbGlkYXRlIGhlcmUgKi8KIApAQCAtOTIsNyArOTMsNyBAQAogCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2xpc3RfbGVuZ3RoKGFtbF9zdGFydCwgYW1sX2J1ZmZlcl9sZW5ndGgsCiAJCQkJCSAmbGlzdF9zaXplX25lZWRlZCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJTdGF0dXM9JVggbGlzdF9zaXplX25lZWRlZD0lWFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJTdGF0dXM9JVggTGlzdFNpemVOZWVkZWQ9JVhcbiIsCiAJCQkgIHN0YXR1cywgKHUzMikgbGlzdF9zaXplX25lZWRlZCkpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTEwNywxMyArMTA4LDE1IEBACiAKIAkvKiBEbyB0aGUgY29udmVyc2lvbiAqLwogCi0Jc3RhdHVzID0gYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMoYW1sX3N0YXJ0LCBhbWxfYnVmZmVyX2xlbmd0aCwKLQkJCQkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlcik7CisJcmVzb3VyY2UgPSBvdXRwdXRfYnVmZmVyLT5wb2ludGVyOworCXN0YXR1cyA9IGFjcGlfdXRfd2Fsa19hbWxfcmVzb3VyY2VzKGFtbF9zdGFydCwgYW1sX2J1ZmZlcl9sZW5ndGgsCisJCQkJCSAgICBhY3BpX3JzX2NvbnZlcnRfYW1sX3RvX3Jlc291cmNlcywKKwkJCQkJICAgICZyZXNvdXJjZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk91dHB1dEJ1ZmZlciAlcCBMZW5ndGggJVhcbiIsCiAJCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CkBAIC0xNTUsNyArMTU4LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfYnVmZmVyIHBhdGhfYnVmZmVyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY3JlYXRlX3BjaV9yb3V0aW5nX3RhYmxlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19jcmVhdGVfcGNpX3JvdXRpbmdfdGFibGUpOwogCiAJLyogUGFyYW1zIGFscmVhZHkgdmFsaWRhdGVkLCBzbyB3ZSBkb24ndCByZS12YWxpZGF0ZSBoZXJlICovCiAKQEAgLTE2Nyw3ICsxNzAsNyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJidWZmZXJfc2l6ZV9uZWVkZWQgPSAlWFxuIiwKKwlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJCdWZmZXJTaXplTmVlZGVkID0gJVhcbiIsCiAJCQkgICh1MzIpIGJ1ZmZlcl9zaXplX25lZWRlZCkpOwogCiAJLyogVmFsaWRhdGUvQWxsb2NhdGUvQ2xlYXIgY2FsbGVyIGJ1ZmZlciAqLwpAQCAtMzMyLDcgKzMzNSw3IEBACiAJCS8qIE5vdyBhbGlnbiB0aGUgY3VycmVudCBsZW5ndGggKi8KIAogCQl1c2VyX3BydC0+bGVuZ3RoID0KLQkJICAgICh1MzIpIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyh1c2VyX3BydC0+bGVuZ3RoKTsKKwkJICAgICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fNjRCSVQodXNlcl9wcnQtPmxlbmd0aCk7CiAKIAkJLyogNCkgRm91cnRoIHN1Ym9iamVjdDogRGVyZWZlcmVuY2UgdGhlIFBSVC5zb3VyY2VfaW5kZXggKi8KIApAQCAtMzQxLDcgKzM0NCw3IEBACiAJCQl1c2VyX3BydC0+c291cmNlX2luZGV4ID0gKHUzMikgb2JqX2Rlc2MtPmludGVnZXIudmFsdWU7CiAJCX0gZWxzZSB7CiAJCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJCSAgICAiKFBSVFslWF0uc291cmNlX2luZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKKwkJCQkgICAgIihQUlRbJVhdLlNvdXJjZUluZGV4KSBOZWVkIEludGVnZXIsIGZvdW5kICVzIiwKIAkJCQkgICAgaW5kZXgsCiAJCQkJICAgIGFjcGlfdXRfZ2V0X29iamVjdF90eXBlX25hbWUob2JqX2Rlc2MpKSk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0RBVEEpOwpAQCAtMzUyLDcgKzM1NSw3IEBACiAJCXRvcF9vYmplY3RfbGlzdCsrOwogCX0KIAotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIm91dHB1dF9idWZmZXIgJXAgTGVuZ3RoICVYXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIk91dHB1dEJ1ZmZlciAlcCBMZW5ndGggJVhcbiIsCiAJCQkgIG91dHB1dF9idWZmZXItPnBvaW50ZXIsICh1MzIpIG91dHB1dF9idWZmZXItPmxlbmd0aCkpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CkBAIC0zODIsOSArMzg1LDkgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJYWNwaV9zaXplIGFtbF9zaXplX25lZWRlZCA9IDA7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jcmVhdGVfYW1sX3Jlc291cmNlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY3JlYXRlX2FtbF9yZXNvdXJjZXMpOwogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAibGlua2VkX2xpc3RfYnVmZmVyID0gJXBcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiTGlua2VkTGlzdEJ1ZmZlciA9ICVwXG4iLAogCQkJICBsaW5rZWRfbGlzdF9idWZmZXIpKTsKIAogCS8qCkBAIC0zOTUsNyArMzk4LDcgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX3JzX2dldF9hbWxfbGVuZ3RoKGxpbmtlZF9saXN0X2J1ZmZlciwgJmFtbF9zaXplX25lZWRlZCk7CiAKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJhbWxfc2l6ZV9uZWVkZWQ9JVgsICVzXG4iLAorCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkFtbFNpemVOZWVkZWQ9JVgsICVzXG4iLAogCQkJICAodTMyKSBhbWxfc2l6ZV9uZWVkZWQsCiAJCQkgIGFjcGlfZm9ybWF0X2V4Y2VwdGlvbihzdGF0dXMpKSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC00MTksNyArNDIyLDcgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCi0JQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAib3V0cHV0X2J1ZmZlciAlcCBMZW5ndGggJVhcbiIsCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiT3V0cHV0QnVmZmVyICVwIExlbmd0aCAlWFxuIiwKIAkJCSAgb3V0cHV0X2J1ZmZlci0+cG9pbnRlciwgKHUzMikgb3V0cHV0X2J1ZmZlci0+bGVuZ3RoKSk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzZHVtcC5jCmluZGV4IGU3ZGUwNjEuLjljOTlhNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2R1bXAuYwpAQCAtOTEsMTEgKzkxLDExIEBACiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaXJxWzZdID0gewogCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfaXJxKSwgIklSUSIsIE5VTEx9LAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGlycS50cmlnZ2VyaW5nKSwgIlRyaWdnZXJpbmciLAotCSBhY3BpX2dibF9IRWRlY29kZX0sCisJIGFjcGlfZ2JsX2hlX2RlY29kZX0sCiAJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoaXJxLnBvbGFyaXR5KSwgIlBvbGFyaXR5IiwKLQkgYWNwaV9nYmxfTExkZWNvZGV9LAorCSBhY3BpX2dibF9sbF9kZWNvZGV9LAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGlycS5zaGFyYWJsZSksICJTaGFyaW5nIiwKLQkgYWNwaV9nYmxfU0hSZGVjb2RlfSwKKwkgYWNwaV9nYmxfc2hyX2RlY29kZX0sCiAJe0FDUElfUlNEX1VJTlQ4LCBBQ1BJX1JTRF9PRkZTRVQoaXJxLmludGVycnVwdF9jb3VudCksCiAJICJJbnRlcnJ1cHQgQ291bnQiLCBOVUxMfSwKIAl7QUNQSV9SU0RfU0hPUlRMSVNULCBBQ1BJX1JTRF9PRkZTRVQoaXJxLmludGVycnVwdHNbMF0pLApAQCAtMTA1LDExICsxMDUsMTEgQEAKIHN0cnVjdCBhY3BpX3JzZHVtcF9pbmZvIGFjcGlfcnNfZHVtcF9kbWFbNl0gPSB7CiAJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9kbWEpLCAiRE1BIiwgTlVMTH0sCiAJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZG1hLnR5cGUpLCAiU3BlZWQiLAotCSBhY3BpX2dibF9UWVBkZWNvZGV9LAorCSBhY3BpX2dibF90eXBfZGVjb2RlfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChkbWEuYnVzX21hc3RlciksICJNYXN0ZXJpbmciLAotCSBhY3BpX2dibF9CTWRlY29kZX0sCisJIGFjcGlfZ2JsX2JtX2RlY29kZX0sCiAJe0FDUElfUlNEXzJCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZG1hLnRyYW5zZmVyKSwgIlRyYW5zZmVyIFR5cGUiLAotCSBhY3BpX2dibF9TSVpkZWNvZGV9LAorCSBhY3BpX2dibF9zaXpfZGVjb2RlfSwKIAl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChkbWEuY2hhbm5lbF9jb3VudCksICJDaGFubmVsIENvdW50IiwKIAkgTlVMTH0sCiAJe0FDUElfUlNEX1NIT1JUTElTVCwgQUNQSV9SU0RfT0ZGU0VUKGRtYS5jaGFubmVsc1swXSksICJDaGFubmVsIExpc3QiLApAQCAtMTU4LDcgKzE1OCw3IEBACiB9OwogCiBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfZW5kX3RhZ1sxXSA9IHsKLQl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2VuZF90YWcpLCAiZW5kX3RhZyIsCisJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9lbmRfdGFnKSwgIkVuZFRhZyIsCiAJIE5VTEx9CiB9OwogCkBAIC0xNjYsNyArMTY2LDcgQEAKIAl7QUNQSV9SU0RfVElUTEUsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX21lbW9yeTI0KSwKIAkgIjI0LUJpdCBNZW1vcnkgUmFuZ2UiLCBOVUxMfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChtZW1vcnkyNC53cml0ZV9wcm90ZWN0KSwKLQkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9SV2RlY29kZX0sCisJICJXcml0ZSBQcm90ZWN0IiwgYWNwaV9nYmxfcndfZGVjb2RlfSwKIAl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MjQubWluaW11bSksICJBZGRyZXNzIE1pbmltdW0iLAogCSBOVUxMfSwKIAl7QUNQSV9SU0RfVUlOVDE2LCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MjQubWF4aW11bSksICJBZGRyZXNzIE1heGltdW0iLApAQCAtMTgxLDcgKzE4MSw3IEBACiAJe0FDUElfUlNEX1RJVExFLCBBQ1BJX1JTRF9UQUJMRV9TSVpFKGFjcGlfcnNfZHVtcF9tZW1vcnkzMiksCiAJICIzMi1CaXQgTWVtb3J5IFJhbmdlIiwgTlVMTH0sCiAJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQobWVtb3J5MzIud3JpdGVfcHJvdGVjdCksCi0JICJXcml0ZSBQcm90ZWN0IiwgYWNwaV9nYmxfUldkZWNvZGV9LAorCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX3J3X2RlY29kZX0sCiAJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1pbmltdW0pLCAiQWRkcmVzcyBNaW5pbXVtIiwKIAkgTlVMTH0sCiAJe0FDUElfUlNEX1VJTlQzMiwgQUNQSV9SU0RfT0ZGU0VUKG1lbW9yeTMyLm1heGltdW0pLCAiQWRkcmVzcyBNYXhpbXVtIiwKQEAgLTE5Niw3ICsxOTYsNyBAQAogCXtBQ1BJX1JTRF9USVRMRSwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfZml4ZWRfbWVtb3J5MzIpLAogCSAiMzItQml0IEZpeGVkIE1lbW9yeSBSYW5nZSIsIE5VTEx9LAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGZpeGVkX21lbW9yeTMyLndyaXRlX3Byb3RlY3QpLAotCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX1JXZGVjb2RlfSwKKwkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAogCXtBQ1BJX1JTRF9VSU5UMzIsIEFDUElfUlNEX09GRlNFVChmaXhlZF9tZW1vcnkzMi5hZGRyZXNzKSwgIkFkZHJlc3MiLAogCSBOVUxMfSwKIAl7QUNQSV9SU0RfVUlOVDMyLCBBQ1BJX1JTRF9PRkZTRVQoZml4ZWRfbWVtb3J5MzIuYWRkcmVzc19sZW5ndGgpLApAQCAtMjc4LDExICsyNzgsMTEgQEAKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEucHJvZHVjZXJfY29uc3VtZXIpLAogCSAiVHlwZSIsIGFjcGlfZ2JsX2NvbnN1bWVfZGVjb2RlfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEudHJpZ2dlcmluZyksCi0JICJUcmlnZ2VyaW5nIiwgYWNwaV9nYmxfSEVkZWNvZGV9LAorCSAiVHJpZ2dlcmluZyIsIGFjcGlfZ2JsX2hlX2RlY29kZX0sCiAJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoZXh0ZW5kZWRfaXJxLnBvbGFyaXR5KSwgIlBvbGFyaXR5IiwKLQkgYWNwaV9nYmxfTExkZWNvZGV9LAorCSBhY3BpX2dibF9sbF9kZWNvZGV9LAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5zaGFyYWJsZSksICJTaGFyaW5nIiwKLQkgYWNwaV9nYmxfU0hSZGVjb2RlfSwKKwkgYWNwaV9nYmxfc2hyX2RlY29kZX0sCiAJe0FDUElfUlNEX1NPVVJDRSwgQUNQSV9SU0RfT0ZGU0VUKGV4dGVuZGVkX2lycS5yZXNvdXJjZV9zb3VyY2UpLCBOVUxMLAogCSBOVUxMfSwKIAl7QUNQSV9SU0RfVUlOVDgsIEFDUElfUlNEX09GRlNFVChleHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50KSwKQEAgLTMxNCw3ICszMTQsNyBAQAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MucHJvZHVjZXJfY29uc3VtZXIpLAogCSAiQ29uc3VtZXIvUHJvZHVjZXIiLCBhY3BpX2dibF9jb25zdW1lX2RlY29kZX0sCiAJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5kZWNvZGUpLCAiQWRkcmVzcyBEZWNvZGUiLAotCSBhY3BpX2dibF9ERUNkZWNvZGV9LAorCSBhY3BpX2dibF9kZWNfZGVjb2RlfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLm1pbl9hZGRyZXNzX2ZpeGVkKSwKIAkgIk1pbiBSZWxvY2F0YWJpbGl0eSIsIGFjcGlfZ2JsX21pbl9kZWNvZGV9LAogCXtBQ1BJX1JTRF8xQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MubWF4X2FkZHJlc3NfZml4ZWQpLApAQCAtMzI1LDI0ICszMjUsMjQgQEAKIAl7QUNQSV9SU0RfTElURVJBTCwgQUNQSV9SU0RfVEFCTEVfU0laRShhY3BpX3JzX2R1bXBfbWVtb3J5X2ZsYWdzKSwKIAkgIlJlc291cmNlIFR5cGUiLCAodm9pZCAqKSJNZW1vcnkgUmFuZ2UifSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8ubWVtLndyaXRlX3Byb3RlY3QpLAotCSAiV3JpdGUgUHJvdGVjdCIsIGFjcGlfZ2JsX1JXZGVjb2RlfSwKKwkgIldyaXRlIFByb3RlY3QiLCBhY3BpX2dibF9yd19kZWNvZGV9LAogCXtBQ1BJX1JTRF8yQklURkxBRywgQUNQSV9SU0RfT0ZGU0VUKGFkZHJlc3MuaW5mby5tZW0uY2FjaGluZyksCi0JICJDYWNoaW5nIiwgYWNwaV9nYmxfTUVNZGVjb2RlfSwKKwkgIkNhY2hpbmciLCBhY3BpX2dibF9tZW1fZGVjb2RlfSwKIAl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8ubWVtLnJhbmdlX3R5cGUpLAotCSAiUmFuZ2UgVHlwZSIsIGFjcGlfZ2JsX01UUGRlY29kZX0sCisJICJSYW5nZSBUeXBlIiwgYWNwaV9nYmxfbXRwX2RlY29kZX0sCiAJe0FDUElfUlNEXzFCSVRGTEFHLCBBQ1BJX1JTRF9PRkZTRVQoYWRkcmVzcy5pbmZvLm1lbS50cmFuc2xhdGlvbiksCi0JICJUcmFuc2xhdGlvbiIsIGFjcGlfZ2JsX1RUUGRlY29kZX0KKwkgIlRyYW5zbGF0aW9uIiwgYWNwaV9nYmxfdHRwX2RlY29kZX0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9yc2R1bXBfaW5mbyBhY3BpX3JzX2R1bXBfaW9fZmxhZ3NbNF0gPSB7CiAJe0FDUElfUlNEX0xJVEVSQUwsIEFDUElfUlNEX1RBQkxFX1NJWkUoYWNwaV9yc19kdW1wX2lvX2ZsYWdzKSwKIAkgIlJlc291cmNlIFR5cGUiLCAodm9pZCAqKSJJL08gUmFuZ2UifSwKIAl7QUNQSV9SU0RfMkJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8ucmFuZ2VfdHlwZSksCi0JICJSYW5nZSBUeXBlIiwgYWNwaV9nYmxfUk5HZGVjb2RlfSwKKwkgIlJhbmdlIFR5cGUiLCBhY3BpX2dibF9ybmdfZGVjb2RlfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8udHJhbnNsYXRpb24pLAotCSAiVHJhbnNsYXRpb24iLCBhY3BpX2dibF9UVFBkZWNvZGV9LAorCSAiVHJhbnNsYXRpb24iLCBhY3BpX2dibF90dHBfZGVjb2RlfSwKIAl7QUNQSV9SU0RfMUJJVEZMQUcsIEFDUElfUlNEX09GRlNFVChhZGRyZXNzLmluZm8uaW8udHJhbnNsYXRpb25fdHlwZSksCi0JICJUcmFuc2xhdGlvbiBUeXBlIiwgYWNwaV9nYmxfVFJTZGVjb2RlfQorCSAiVHJhbnNsYXRpb24gVHlwZSIsIGFjcGlfZ2JsX3Ryc19kZWNvZGV9CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNpbmZvLmMKaW5kZXggZDlhZTY0Yi4uOWU3YWUyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2luZm8uYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzaW5mby5jCkBAIC0xNDEsNiArMTQxLDcgQEAKIAlhY3BpX3JzX2R1bXBfZ2VuZXJpY19yZWcsCS8qIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSICovCiB9OwogI2VuZGlmCisKICNlbmRpZgkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogLyoKICAqIEJhc2Ugc2l6ZXMgZm9yIGV4dGVybmFsIEFNTCByZXNvdXJjZSBkZXNjcmlwdG9ycywgaW5kZXhlZCBieSBpbnRlcm5hbCB0eXBlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNsaXN0LmMKaW5kZXggMTQzNGU3OC4uMjk0MjNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbGlzdC5jCkBAIC01MSw3NiArNTEsNjIgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgQW1sICAgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJlc291cmNlIGJ5dGUgc3RyZWFtCi0gKiAgICAgICAgICAgICAgYW1sX2xlbmd0aCAgICAgICAgICAtIExlbmd0aCBvZiBBbWwKLSAqICAgICAgICAgICAgICBvdXRwdXRfYnVmZmVyICAgICAgIC0gUG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgd2lsbAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluIHRoZSBvdXRwdXQgc3RydWN0dXJlcworICogUEFSQU1FVEVSUzogIGFjcGlfd2Fsa19hbWxfY2FsbGJhY2sKKyAqICAgICAgICAgICAgICByZXNvdXJjZV9wdHIgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0aGF0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW4gdGhlIG91dHB1dCBzdHJ1Y3R1cmVzCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBUYWtlcyB0aGUgcmVzb3VyY2UgYnl0ZSBzdHJlYW0gYW5kIHBhcnNlcyBpdCwgY3JlYXRpbmcgYQotICogICAgICAgICAgICAgIGxpbmtlZCBsaXN0IG9mIHJlc291cmNlcyBpbiB0aGUgY2FsbGVyJ3Mgb3V0cHV0IGJ1ZmZlcgorICogREVTQ1JJUFRJT046IENvbnZlcnQgYW4gQU1MIHJlc291cmNlIHRvIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICogICAgICAgICAgICAgIHJlc291cmNlIHRoYXQgaXMgYWxpZ25lZCBhbmQgZWFzaWVyIHRvIGFjY2Vzcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKHU4ICogYW1sLCB1MzIgYW1sX2xlbmd0aCwgdTggKiBvdXRwdXRfYnVmZmVyKQorYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXModTggKiBhbWwsCisJCQkJIHUzMiBsZW5ndGgsCisJCQkJIHUzMiBvZmZzZXQsIHU4IHJlc291cmNlX2luZGV4LCB2b2lkICoqY29udGV4dCkKIHsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UgPSAodm9pZCAqKW91dHB1dF9idWZmZXI7CisJc3RydWN0IGFjcGlfcmVzb3VyY2UgKipyZXNvdXJjZV9wdHIgPQorCSAgICBBQ1BJX0NBU1RfSU5ESVJFQ1RfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBjb250ZXh0KTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwotCXU4IHJlc291cmNlX2luZGV4OwotCXU4ICplbmRfYW1sOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXMpOwogCi0JZW5kX2FtbCA9IGFtbCArIGFtbF9sZW5ndGg7Ci0KLQkvKiBMb29wIHVudGlsIGVuZC1vZi1idWZmZXIgb3IgYW4gZW5kX3RhZyBpcyBmb3VuZCAqLwotCi0Jd2hpbGUgKGFtbCA8IGVuZF9hbWwpIHsKLQkJLyogVmFsaWRhdGUgdGhlIFJlc291cmNlIFR5cGUgYW5kIFJlc291cmNlIExlbmd0aCAqLwotCi0JCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2UoYW1sLCAmcmVzb3VyY2VfaW5kZXgpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCQl9Ci0KLQkJLyogQ29udmVydCB0aGUgQU1MIGJ5dGUgc3RyZWFtIHJlc291cmNlIHRvIGEgbG9jYWwgcmVzb3VyY2Ugc3RydWN0ICovCi0KLQkJc3RhdHVzID0KLQkJICAgIGFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UocmVzb3VyY2UsCi0JCQkJCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbgotCQkJCQkJCQkgIGFtbF9yZXNvdXJjZSwKLQkJCQkJCQkJICBhbWwpLAotCQkJCQkJICAgIGFjcGlfZ2JsX2dldF9yZXNvdXJjZV9kaXNwYXRjaAotCQkJCQkJICAgIFtyZXNvdXJjZV9pbmRleF0pOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCi0JCQkJCSJDb3VsZCBub3QgY29udmVydCBBTUwgcmVzb3VyY2UgKFR5cGUgJVgpIiwKLQkJCQkJKmFtbCkpOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBOb3JtYWwgZXhpdCBvbiBjb21wbGV0aW9uIG9mIGFuIGVuZF90YWcgcmVzb3VyY2UgZGVzY3JpcHRvciAqLwotCi0JCWlmIChhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbCkgPT0KLQkJICAgIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHKSB7Ci0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwotCQl9Ci0KLQkJLyogUG9pbnQgdG8gdGhlIG5leHQgaW5wdXQgQU1MIHJlc291cmNlICovCi0KLQkJYW1sICs9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbCk7Ci0KLQkJLyogUG9pbnQgdG8gdGhlIG5leHQgc3RydWN0dXJlIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0KLQkJcmVzb3VyY2UgPQotCQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCByZXNvdXJjZSwKLQkJCQkgcmVzb3VyY2UtPmxlbmd0aCk7CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBpbnB1dCBidWZmZXIgYW5kIGFsbCBzdWJzZXF1ZW50IHBvaW50ZXJzIGludG8gaXQKKwkgKiBhcmUgYWxpZ25lZCBvbiBhIG5hdGl2ZSB3b3JkIGJvdW5kYXJ5LiBNb3N0IGltcG9ydGFudCBvbiBJQTY0CisJICovCisJcmVzb3VyY2UgPSAqcmVzb3VyY2VfcHRyOworCWlmIChBQ1BJX0lTX01JU0FMSUdORUQocmVzb3VyY2UpKSB7CisJCUFDUElfV0FSTklORygoQUVfSU5GTywKKwkJCSAgICAgICJNaXNhbGlnbmVkIHJlc291cmNlIHBvaW50ZXIgJXAiLCByZXNvdXJjZSkpOwogCX0KIAotCS8qIERpZCBub3QgZmluZCBhbiBlbmRfdGFnIHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKwkvKiBDb252ZXJ0IHRoZSBBTUwgYnl0ZSBzdHJlYW0gcmVzb3VyY2UgdG8gYSBsb2NhbCByZXNvdXJjZSBzdHJ1Y3QgKi8KIAotCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CisJc3RhdHVzID0KKwkgICAgYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZShyZXNvdXJjZSwKKwkJCQkJICAgIEFDUElfQ0FTVF9QVFIodW5pb24gYW1sX3Jlc291cmNlLAorCQkJCQkJCSAgYW1sKSwKKwkJCQkJICAgIGFjcGlfZ2JsX2dldF9yZXNvdXJjZV9kaXNwYXRjaAorCQkJCQkgICAgW3Jlc291cmNlX2luZGV4XSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCisJCQkJIkNvdWxkIG5vdCBjb252ZXJ0IEFNTCByZXNvdXJjZSAoVHlwZSAlWCkiLAorCQkJCSphbWwpKTsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9SRVNPVVJDRVMsCisJCQkgICJUeXBlICUuMlgsIEFtbExlbmd0aCAlLjJYIEludGVybmFsTGVuZ3RoICUuMlhcbiIsCisJCQkgIGFjcGlfdXRfZ2V0X3Jlc291cmNlX3R5cGUoYW1sKSwgbGVuZ3RoLAorCQkJICByZXNvdXJjZS0+bGVuZ3RoKSk7CisKKwkvKiBQb2ludCB0byB0aGUgbmV4dCBzdHJ1Y3R1cmUgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKworCSpyZXNvdXJjZV9wdHIgPSBBQ1BJX0FERF9QVFIodm9pZCwgcmVzb3VyY2UsIHJlc291cmNlLT5sZW5ndGgpOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTAsMTEgKzEzNiwxMiBAQAogCXU4ICplbmRfYW1sID0gb3V0cHV0X2J1ZmZlciArIGFtbF9zaXplX25lZWRlZDsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jb252ZXJ0X3Jlc291cmNlc190b19hbWwiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbCk7CiAKIAkvKiBXYWxrIHRoZSByZXNvdXJjZSBkZXNjcmlwdG9yIGxpc3QsIGNvbnZlcnQgZWFjaCBkZXNjcmlwdG9yICovCiAKIAl3aGlsZSAoYW1sIDwgZW5kX2FtbCkgeworCiAJCS8qIFZhbGlkYXRlIHRoZSAoaW50ZXJuYWwpIFJlc291cmNlIFR5cGUgKi8KIAogCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7CkBAIC0xOTEsNiArMTc4LDcgQEAKIAkJLyogQ2hlY2sgZm9yIGVuZC1vZi1saXN0LCBub3JtYWwgZXhpdCAqLwogCiAJCWlmIChyZXNvdXJjZS0+dHlwZSA9PSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRykgeworCiAJCQkvKiBBbiBFbmQgVGFnIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSBpbnB1dCBSZXNvdXJjZSBUZW1wbGF0ZSAqLwogCiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYyBiL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNtaXNjLmMKaW5kZXggZWQ4NjZjZi4uZmFmNmUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc21pc2MuYworKysgYi9kcml2ZXJzL2FjcGkvcmVzb3VyY2VzL3JzbWlzYy5jCkBAIC04MSw5ICs4MSwxMCBAQAogCXUxNiBpdGVtX2NvdW50ID0gMDsKIAl1MTYgdGVtcDE2ID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9yZXNvdXJjZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2UpOwogCiAJaWYgKCgoYWNwaV9uYXRpdmVfdWludCkgcmVzb3VyY2UpICYgMHgzKSB7CisKIAkJLyogRWFjaCBpbnRlcm5hbCByZXNvdXJjZSBzdHJ1Y3QgaXMgZXhwZWN0ZWQgdG8gYmUgMzItYml0IGFsaWduZWQgKi8KIAogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCkBAIC0yOTUsOSArMjk2LDExIEBACiAKICAgICAgIGV4aXQ6CiAJaWYgKCFmbGFnc19tb2RlKSB7Ci0JCS8qIFJvdW5kIHRoZSByZXNvdXJjZSBzdHJ1Y3QgbGVuZ3RoIHVwIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeSAqLwogCi0JCXJlc291cmNlLT5sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMocmVzb3VyY2UtPmxlbmd0aCk7CisJCS8qIFJvdW5kIHRoZSByZXNvdXJjZSBzdHJ1Y3QgbGVuZ3RoIHVwIHRvIHRoZSBuZXh0IGJvdW5kYXJ5ICgzMiBvciA2NCkgKi8KKworCQlyZXNvdXJjZS0+bGVuZ3RoID0KKwkJICAgICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQocmVzb3VyY2UtPmxlbmd0aCk7CiAJfQogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CkBAIC0zMjksNyArMzMyLDcgQEAKIAl1MTYgdGVtcDE2ID0gMDsKIAl1MTYgaXRlbV9jb3VudCA9IDA7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJyc19jb252ZXJ0X3Jlc291cmNlX3RvX2FtbCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfY29udmVydF9yZXNvdXJjZV90b19hbWwpOwogCiAJLyoKIAkgKiBGaXJzdCB0YWJsZSBlbnRyeSBtdXN0IGJlIEFDUElfUlNDX0lOSVR4eHggYW5kIG11c3QgY29udGFpbiB0aGUKQEAgLTUzNSw2ICs1MzgsNyBAQAogCiByZXNvdXJjZS0+ZGF0YS5leHRlbmRlZF9pcnEuaW50ZXJydXB0X2NvdW50ID0gdGVtcDg7CiBpZiAodGVtcDggPCAxKSB7CisKIAkvKiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIElSUSAqLwogCiAJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN1dGlscy5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKaW5kZXggMjViNWFlZC4uYTljYmVlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3V0aWxzLmMKQEAgLTIwNSw2ICsyMDUsNyBAQAogCS8qIExlbmd0aCBpcyBzdG9yZWQgZGlmZmVyZW50bHkgZm9yIGxhcmdlIGFuZCBzbWFsbCBkZXNjcmlwdG9ycyAqLwogCiAJaWYgKGFtbC0+c21hbGxfaGVhZGVyLmRlc2NyaXB0b3JfdHlwZSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCiAJCS8qIExhcmdlIGRlc2NyaXB0b3IgLS0gYnl0ZXMgMS0yIGNvbnRhaW4gdGhlIDE2LWJpdCBsZW5ndGggKi8KIAogCQlBQ1BJX01PVkVfMTZfVE9fMTYoJmFtbC0+bGFyZ2VfaGVhZGVyLnJlc291cmNlX2xlbmd0aCwKQEAgLTI5OCw3ICsyOTksOCBAQAogICogICAgICAgICAgICAgIHN0cmluZ19wdHIgICAgICAgICAgLSAob3B0aW9uYWwpIHdoZXJlIHRvIHN0b3JlIHRoZSBhY3R1YWwKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Vfc291cmNlIHN0cmluZwogICoKLSAqIFJFVFVSTjogICAgICBMZW5ndGggb2YgdGhlIHN0cmluZyBwbHVzIE5VTEwgdGVybWluYXRvciwgcm91bmRlZCB1cCB0byAzMiBiaXQKKyAqIFJFVFVSTjogICAgICBMZW5ndGggb2YgdGhlIHN0cmluZyBwbHVzIE5VTEwgdGVybWluYXRvciwgcm91bmRlZCB1cCB0byBuYXRpdmUKKyAqICAgICAgICAgICAgICB3b3JkIGJvdW5kYXJ5CiAgKgogICogREVTQ1JJUFRJT046IENvcHkgdGhlIG9wdGlvbmFsIHJlc291cmNlX3NvdXJjZSBkYXRhIGZyb20gYSByYXcgQU1MIGRlc2NyaXB0b3IKICAqICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCByZXNvdXJjZSBkZXNjcmlwdG9yCkBAIC0zMjgsNiArMzMwLDcgQEAKIAkgKiB3ZSBhZGQgMSB0byB0aGUgbWluaW11bSBsZW5ndGguCiAJICovCiAJaWYgKHRvdGFsX2xlbmd0aCA+IChhY3BpX3JzZGVzY19zaXplKSAobWluaW11bV9sZW5ndGggKyAxKSkgeworCiAJCS8qIEdldCB0aGUgcmVzb3VyY2Vfc291cmNlX2luZGV4ICovCiAKIAkJcmVzb3VyY2Vfc291cmNlLT5pbmRleCA9IGFtbF9yZXNvdXJjZV9zb3VyY2VbMF07CkBAIC0zNDQsMjMgKzM0NywyNiBAQAogCQl9CiAKIAkJLyoKLQkJICogSW4gb3JkZXIgZm9yIHRoZSBzdHJ1Y3Rfc2l6ZSB0byBmYWxsIG9uIGEgMzItYml0IGJvdW5kYXJ5LCBjYWxjdWxhdGUKLQkJICogdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nICgrMSBmb3IgdGhlIE5VTEwgdGVybWluYXRvcikgYW5kIGV4cGFuZCB0aGUKLQkJICogc3RydWN0X3NpemUgdG8gdGhlIG5leHQgMzItYml0IGJvdW5kYXJ5LgorCQkgKiBJbiBvcmRlciBmb3IgdGhlIFJlc291cmNlIGxlbmd0aCB0byBiZSBhIG11bHRpcGxlIG9mIHRoZSBuYXRpdmUKKwkJICogd29yZCwgY2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoKzEgZm9yIE5VTEwgdGVybWluYXRvcikKKwkJICogYW5kIGV4cGFuZCB0byB0aGUgbmV4dCB3b3JkIG11bHRpcGxlLgogCQkgKgogCQkgKiBaZXJvIHRoZSBlbnRpcmUgYXJlYSBvZiB0aGUgYnVmZmVyLgogCQkgKi8KIAkJdG90YWxfbGVuZ3RoID0KLQkJICAgIEFDUElfUk9VTkRfVVBfdG9fMzJfYklUUyhBQ1BJX1NUUkxFTgotCQkJCQkgICAgICgoY2hhciAqKSZhbWxfcmVzb3VyY2Vfc291cmNlWzFdKSArCi0JCQkJCSAgICAgMSk7CisJCSAgICAodTMyKQorCQkgICAgQUNQSV9TVFJMRU4oQUNQSV9DQVNUX1BUUihjaGFyLCAmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSkpICsKKwkJICAgIDE7CisJCXRvdGFsX2xlbmd0aCA9ICh1MzIpIEFDUElfUk9VTkRfVVBfVE9fTkFUSVZFX1dPUkQodG90YWxfbGVuZ3RoKTsKKwogCQlBQ1BJX01FTVNFVChyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIsIDAsIHRvdGFsX2xlbmd0aCk7CiAKIAkJLyogQ29weSB0aGUgcmVzb3VyY2Vfc291cmNlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gKi8KIAogCQlyZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19sZW5ndGggPQogCQkgICAgYWNwaV9yc19zdHJjcHkocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfcHRyLAotCQkJCSAgIChjaGFyICopJmFtbF9yZXNvdXJjZV9zb3VyY2VbMV0pOworCQkJCSAgIEFDUElfQ0FTVF9QVFIoY2hhciwKKwkJCQkJCSAmYW1sX3Jlc291cmNlX3NvdXJjZVsxXSkpOwogCiAJCXJldHVybiAoKGFjcGlfcnNfbGVuZ3RoKSB0b3RhbF9sZW5ndGgpOwogCX0KQEAgLTQwNSw2ICs0MTEsNyBAQAogCS8qIE5vbi16ZXJvIHN0cmluZyBsZW5ndGggaW5kaWNhdGVzIHByZXNlbmNlIG9mIGEgcmVzb3VyY2Vfc291cmNlICovCiAKIAlpZiAocmVzb3VyY2Vfc291cmNlLT5zdHJpbmdfbGVuZ3RoKSB7CisKIAkJLyogUG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgQU1MIGRlc2NyaXB0b3IgKi8KIAogCQlhbWxfcmVzb3VyY2Vfc291cmNlID0gQUNQSV9BRERfUFRSKHU4LCBhbWwsIG1pbmltdW1fbGVuZ3RoKTsKQEAgLTQxNSw3ICs0MjIsNyBAQAogCiAJCS8qIENvcHkgdGhlIHJlc291cmNlX3NvdXJjZSBzdHJpbmcgKi8KIAotCQlBQ1BJX1NUUkNQWSgoY2hhciAqKSZhbWxfcmVzb3VyY2Vfc291cmNlWzFdLAorCQlBQ1BJX1NUUkNQWShBQ1BJX0NBU1RfUFRSKGNoYXIsICZhbWxfcmVzb3VyY2Vfc291cmNlWzFdKSwKIAkJCSAgICByZXNvdXJjZV9zb3VyY2UtPnN0cmluZ19wdHIpOwogCiAJCS8qCkBAIC00MzUsOSArNDQyLDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIG9iamVjdAotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cworICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIERldmljZSBub2RlCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDUwLDE4ICs0NTcsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKiByZXRfYnVmZmVyKQorYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICogbm9kZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKiByZXRfYnVmZmVyKQogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9wcnRfbWV0aG9kX2RhdGEiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9wcnRfbWV0aG9kX2RhdGEpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlQsCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX1BSVCwKIAkJCQkJIEFDUElfQlRZUEVfUEFDS0FHRSwgJm9ial9kZXNjKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CkBAIC00ODMsOSArNDkxLDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIG9iamVjdAotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cworICogUEFSQU1FVEVSUzogIE5vZGUgICAgICAgICAgICAtIERldmljZSBub2RlCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNDk4LDE4ICs1MDYsMTkgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCithY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9jcnNfbWV0aG9kX2RhdGEiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9jcnNfbWV0aG9kX2RhdGEpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX0NSUywKIAkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTUyMiw3ICs1MzEsNyBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwogCi0JLyogb24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLwogCiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTUzMiw5ICs1NDEsOSBAQAogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEKICAqCi0gKiBQQVJBTUVURVJTOiAgSGFuZGxlICAgICAgICAgIC0gYSBoYW5kbGUgdG8gdGhlIGNvbnRhaW5pbmcgb2JqZWN0Ci0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCisgKiBQQVJBTUVURVJTOiAgTm9kZSAgICAgICAgICAgIC0gRGV2aWNlIG5vZGUKKyAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cwogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC01NDgsMTggKzU1NywxOSBAQAogCiAjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpCithY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX2dldF9wcnNfbWV0aG9kX2RhdGEiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX2dldF9wcnNfbWV0aG9kX2RhdGEpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCiAJLyogRXhlY3V0ZSB0aGUgbWV0aG9kLCBubyBwYXJhbWV0ZXJzICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChoYW5kbGUsIE1FVEhPRF9OQU1FX19QUlMsCisJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3Qobm9kZSwgTUVUSE9EX05BTUVfX1BSUywKIAkJCQkJIEFDUElfQlRZUEVfQlVGRkVSLCAmb2JqX2Rlc2MpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTU3Miw3ICs1ODIsNyBAQAogCSAqLwogCXN0YXR1cyA9IGFjcGlfcnNfY3JlYXRlX3Jlc291cmNlX2xpc3Qob2JqX2Rlc2MsIHJldF9idWZmZXIpOwogCi0JLyogb24gZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIG9iamVjdCByZXR1cm5lZCBieSBldmFsdWF0ZV9vYmplY3QgKi8KKwkvKiBPbiBleGl0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGV2YWx1YXRlX29iamVjdCAqLwogCiAJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKG9ial9kZXNjKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTU4MywxMCArNTkzLDEwIEBACiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIG9iamVjdAorICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIEhhbmRsZSB0byB0aGUgY29udGFpbmluZyBvYmplY3QKICAqICAgICAgICAgICAgICBQYXRoICAgICAgICAgICAgLSBQYXRoIHRvIG1ldGhvZCwgcmVsYXRpdmUgdG8gSGFuZGxlCi0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHN0cnVjdHVyZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgpAQCAtNjA1LDcgKzYxNSw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgicnNfZ2V0X21ldGhvZF9kYXRhIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShyc19nZXRfbWV0aG9kX2RhdGEpOwogCiAJLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLwogCkBAIC02MzQsOSArNjQ0LDkgQEAKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhCiAgKgotICogUEFSQU1FVEVSUzogIEhhbmRsZSAgICAgICAgICAtIGEgaGFuZGxlIHRvIHRoZSBjb250YWluaW5nIG9iamVjdAotICogICAgICAgICAgICAgIGluX2J1ZmZlciAgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBzdHJ1Y3R1cmUgb2YgdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIKKyAqIFBBUkFNRVRFUlM6ICBOb2RlICAgICAgICAgICAgLSBEZXZpY2Ugbm9kZQorICogICAgICAgICAgICAgIGluX2J1ZmZlciAgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgc3RydWN0dXJlIG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCkBAIC02NDYsMjMgKzY1NiwzNyBAQAogICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAogICogICAgICAgICAgICAgIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIGNhbGxlcnMgYnVmZmVyIGlzIHVuZGVmaW5lZC4KICAqCisgKiBOb3RlOiBQYXJhbWV0ZXJzIGd1YXJhbnRlZWQgdmFsaWQgYnkgY2FsbGVyCisgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfc2V0X3Nyc19tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqaW5fYnVmZmVyKQorYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqaW5fYnVmZmVyKQogewotCXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIGluZm87Ci0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcGFyYW1zWzJdOworCXN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm87CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYXJnc1syXTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInJzX3NldF9zcnNfbWV0aG9kX2RhdGEiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHJzX3NldF9zcnNfbWV0aG9kX2RhdGEpOwogCi0JLyogUGFyYW1ldGVycyBndWFyYW50ZWVkIHZhbGlkIGJ5IGNhbGxlciAqLworCS8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cHJlZml4X25vZGUgPSBub2RlOworCWluZm8tPnBhdGhuYW1lID0gTUVUSE9EX05BTUVfX1NSUzsKKwlpbmZvLT5wYXJhbWV0ZXJzID0gYXJnczsKKwlpbmZvLT5wYXJhbWV0ZXJfdHlwZSA9IEFDUElfUEFSQU1fQVJHUzsKKwlpbmZvLT5mbGFncyA9IEFDUElfSUdOT1JFX1JFVFVSTl9WQUxVRTsKIAogCS8qCiAJICogVGhlIGluX2J1ZmZlciBwYXJhbWV0ZXIgd2lsbCBwb2ludCB0byBhIGxpbmtlZCBsaXN0IG9mCi0JICogcmVzb3VyY2UgcGFyYW1ldGVycy4gIEl0IG5lZWRzIHRvIGJlIGZvcm1hdHRlZCBpbnRvIGEKKwkgKiByZXNvdXJjZSBwYXJhbWV0ZXJzLiBJdCBuZWVkcyB0byBiZSBmb3JtYXR0ZWQgaW50byBhCiAJICogYnl0ZSBzdHJlYW0gdG8gYmUgc2VudCBpbiBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIgdG8gX1NSUwogCSAqCiAJICogQ29udmVydCB0aGUgbGlua2VkIGxpc3QgaW50byBhIGJ5dGUgc3RyZWFtCkBAIC02NzAsNDEgKzY5NCwzNiBAQAogCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKIAlzdGF0dXMgPSBhY3BpX3JzX2NyZWF0ZV9hbWxfcmVzb3VyY2VzKGluX2J1ZmZlci0+cG9pbnRlciwgJmJ1ZmZlcik7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JLyogSW5pdCB0aGUgcGFyYW0gb2JqZWN0ICovCisJLyogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSBtZXRob2QgcGFyYW1ldGVyIG9iamVjdCAqLwogCi0JcGFyYW1zWzBdID0gYWNwaV91dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0KEFDUElfVFlQRV9CVUZGRVIpOwotCWlmICghcGFyYW1zWzBdKSB7Ci0JCWFjcGlfb3NfZnJlZShidWZmZXIucG9pbnRlcik7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOworCWFyZ3NbMF0gPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0JVRkZFUik7CisJaWYgKCFhcmdzWzBdKSB7CisJCS8qCisJCSAqIE11c3QgZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBhYm92ZSAob3RoZXJ3aXNlIGl0IGlzIGZyZWVkCisJCSAqIGxhdGVyKQorCQkgKi8KKwkJQUNQSV9GUkVFKGJ1ZmZlci5wb2ludGVyKTsKKwkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOworCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JLyogU2V0IHVwIHRoZSBwYXJhbWV0ZXIgb2JqZWN0ICovCisJYXJnc1swXS0+YnVmZmVyLmxlbmd0aCA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7CisJYXJnc1swXS0+YnVmZmVyLnBvaW50ZXIgPSBidWZmZXIucG9pbnRlcjsKKwlhcmdzWzBdLT5jb21tb24uZmxhZ3MgPSBBT1BPQkpfREFUQV9WQUxJRDsKKwlhcmdzWzFdID0gTlVMTDsKIAotCXBhcmFtc1swXS0+YnVmZmVyLmxlbmd0aCA9ICh1MzIpIGJ1ZmZlci5sZW5ndGg7Ci0JcGFyYW1zWzBdLT5idWZmZXIucG9pbnRlciA9IGJ1ZmZlci5wb2ludGVyOwotCXBhcmFtc1swXS0+Y29tbW9uLmZsYWdzID0gQU9QT0JKX0RBVEFfVkFMSUQ7Ci0JcGFyYW1zWzFdID0gTlVMTDsKKwkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSBpcyBleHBlY3RlZCAqLwogCi0JaW5mby5ub2RlID0gaGFuZGxlOwotCWluZm8ucGFyYW1ldGVycyA9IHBhcmFtczsKLQlpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOworCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGUoaW5mbyk7CiAKLQkvKiBFeGVjdXRlIHRoZSBtZXRob2QsIG5vIHJldHVybiB2YWx1ZSAqLworCS8qIENsZWFuIHVwIGFuZCByZXR1cm4gdGhlIHN0YXR1cyBmcm9tIGFjcGlfbnNfZXZhbHVhdGUgKi8KIAotCXN0YXR1cyA9IGFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUoTUVUSE9EX05BTUVfX1NSUywgJmluZm8pOwotCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQkvKiBEZWxldGUgYW55IHJldHVybiBvYmplY3QgKGVzcGVjaWFsbHkgaWYgaW1wbGljaXRfcmV0dXJuIGlzIGVuYWJsZWQpICovCisJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGFyZ3NbMF0pOwogCi0JCWlmIChpbmZvLnJldHVybl9vYmplY3QpIHsKLQkJCWFjcGlfdXRfcmVtb3ZlX3JlZmVyZW5jZShpbmZvLnJldHVybl9vYmplY3QpOwotCQl9Ci0JfQotCi0JLyogQ2xlYW4gdXAgYW5kIHJldHVybiB0aGUgc3RhdHVzIGZyb20gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZSAqLwotCi0JYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHBhcmFtc1swXSk7CisgICAgICBjbGVhbnVwOgorCUFDUElfRlJFRShpbmZvKTsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnN4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKaW5kZXggODhiNjcwNy4uMTk5OWUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3Jlc291cmNlcy9yc3hmYWNlLmMKQEAgLTQxLDEwICs0MSw5IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3Jlc3JjLmg+CisjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgQUNQSV9SRVNPVVJDRVMKIEFDUElfTU9EVUxFX05BTUUoInJzeGZhY2UiKQpAQCAtNjgsMTkgKzY3LDgwIEBACiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCk7CiAKK3N0YXRpYyBhY3BpX3N0YXR1cworYWNwaV9yc192YWxpZGF0ZV9wYXJhbWV0ZXJzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCisJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpidWZmZXIsCisJCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXR1cm5fbm9kZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycworICoKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gYSBkZXZpY2UKKyAqICAgICAgICAgICAgICBCdWZmZXIgICAgICAgICAgLSBQb2ludGVyIHRvIGEgZGF0YSBidWZmZXIKKyAqICAgICAgICAgICAgICByZXR1cm5fbm9kZSAgICAgLSBQb2ludGVyIHRvIHdoZXJlIHRoZSBkZXZpY2Ugbm9kZSBpcyByZXR1cm5lZAorICoKKyAqIFJFVFVSTjogICAgICBTdGF0dXMKKyAqCisgKiBERVNDUklQVElPTjogQ29tbW9uIHBhcmFtZXRlciB2YWxpZGF0aW9uIGZvciByZXNvdXJjZSBpbnRlcmZhY2VzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGFjcGlfc3RhdHVzCithY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9idWZmZXIgKmJ1ZmZlciwKKwkJCSAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKnJldHVybl9ub2RlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UocnNfdmFsaWRhdGVfcGFyYW1ldGVycyk7CisKKwkvKgorCSAqIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSB0byBhbiBBQ1BJIGRldmljZQorCSAqLworCWlmICghZGV2aWNlX2hhbmRsZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJbm9kZSA9IGFjcGlfbnNfbWFwX2hhbmRsZV90b19ub2RlKGRldmljZV9oYW5kbGUpOworCWlmICghbm9kZSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJaWYgKG5vZGUtPnR5cGUgIT0gQUNQSV9UWVBFX0RFVklDRSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CisJfQorCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgdXNlciBidWZmZXIgb2JqZWN0CisJICoKKwkgKiBpZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ1ZmZlciBsZW5ndGggd2UgYWxzbyBuZWVkIGEgdmFsaWQgcG9pbnRlciBpbgorCSAqIHRoZSBidWZmZXIuIElmIGl0J3MgYSB6ZXJvIGJ1ZmZlciBsZW5ndGgsIHdlJ2xsIGJlIHJldHVybmluZyB0aGUKKwkgKiBuZWVkZWQgYnVmZmVyIHNpemUgKGxhdGVyKSwgc28ga2VlcCBnb2luZy4KKwkgKi8KKwlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkqcmV0dXJuX25vZGUgPSBub2RlOworCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Cit9CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlCiAgKgotICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIGEgaGFuZGxlIHRvIHRoZSBCdXMgZGV2aWNlIHdlIGFyZSBxdWVyeWluZwotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZQorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgQnVzIGRldmljZSB3ZSBhcmUgcXVlcnlpbmcKKyAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBQb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCByZXNvdXJjZXMgZm9yIHRoZSBkZXZpY2UKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGdldCB0aGUgSVJRIHJvdXRpbmcgdGFibGUgZm9yIGEKLSAqICAgICAgICAgICAgICBzcGVjaWZpYyBidXMuICBUaGUgY2FsbGVyIG11c3QgZmlyc3QgYWNxdWlyZSBhIGhhbmRsZSBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgZGVzaXJlZCBidXMuICBUaGUgcm91dGluZSB0YWJsZSBpcyBwbGFjZWQgaW4gdGhlIGJ1ZmZlciBwb2ludGVkCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgYnVzLiBUaGUgY2FsbGVyIG11c3QgZmlyc3QgYWNxdWlyZSBhIGhhbmRsZSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgZGVzaXJlZCBidXMuIFRoZSByb3V0aW5lIHRhYmxlIGlzIHBsYWNlZCBpbiB0aGUgYnVmZmVyIHBvaW50ZWQKICAqICAgICAgICAgICAgICB0byBieSB0aGUgcmV0X2J1ZmZlciB2YXJpYWJsZSBwYXJhbWV0ZXIuCiAgKgogICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZApAQCAtOTYsNDIgKzE1NiwzNyBAQAogCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X2lycV9yb3V0aW5nX3RhYmxlICIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfaXJxX3JvdXRpbmdfdGFibGUpOwogCi0JLyoKLQkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciwgU28gd2UgaGF2ZSB0byBoYXZlIGEgaGFuZGxlCi0JICogYW5kIGEgcmV0dXJuIGJ1ZmZlciBzdHJ1Y3R1cmUsIGFuZCBpZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ1ZmZlciBsZW5ndGgKLQkgKiB3ZSBhbHNvIG5lZWQgYSB2YWxpZCBwb2ludGVyIGluIHRoZSBidWZmZXIuIElmIGl0J3MgYSB6ZXJvIGJ1ZmZlciBsZW5ndGgsCi0JICogd2UnbGwgYmUgcmV0dXJuaW5nIHRoZSBuZWVkZWQgYnVmZmVyIHNpemUsIHNvIGtlZXAgZ29pbmcuCi0JICovCi0JaWYgKCFkZXZpY2VfaGFuZGxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9CisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyB0aGVuIGRpc3BhdGNoIHRvIGludGVybmFsIHJvdXRpbmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCXN0YXR1cyA9IGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyLCAmbm9kZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X3BydF9tZXRob2RfZGF0YShkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEobm9kZSwgcmV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9pcnFfcm91dGluZ190YWJsZSkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gYSBoYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBxdWVyeWluZwotICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZQorICogICAgICAgICAgICAgIHJldF9idWZmZXIgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcmVjZWl2ZSB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHJlc291cmNlcyBmb3IgdGhlIGRldmljZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHJlc291cmNlcyBmb3IgYQotICogICAgICAgICAgICAgIHNwZWNpZmljIGRldmljZS4gIFRoZSBjYWxsZXIgbXVzdCBmaXJzdCBhY3F1aXJlIGEgaGFuZGxlIGZvcgotICogICAgICAgICAgICAgIHRoZSBkZXNpcmVkIGRldmljZS4gIFRoZSByZXNvdXJjZSBkYXRhIGlzIHBsYWNlZCBpbiB0aGUgYnVmZmVyCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlLiBUaGUgY2FsbGVyIG11c3QgZmlyc3QgYWNxdWlyZSBhIGhhbmRsZSBmb3IKKyAqICAgICAgICAgICAgICB0aGUgZGVzaXJlZCBkZXZpY2UuIFRoZSByZXNvdXJjZSBkYXRhIGlzIHBsYWNlZCBpbiB0aGUgYnVmZmVyCiAgKiAgICAgICAgICAgICAgcG9pbnRlZCB0byBieSB0aGUgcmV0X2J1ZmZlciB2YXJpYWJsZSBwYXJhbWV0ZXIuCiAgKgogICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZApAQCAtMTQxLDIzOSArMTk2LDEzMyBAQAogICogICAgICAgICAgICAgIHRoZSBvYmplY3QgaW5kaWNhdGVkIGJ5IHRoZSBwYXNzZWQgZGV2aWNlX2hhbmRsZS4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKIAkJCSAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcikKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9jdXJyZW50X3Jlc291cmNlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMpOwogCi0JLyoKLQkgKiBNdXN0IGhhdmUgYSB2YWxpZCBoYW5kbGUgYW5kIGJ1ZmZlciwgU28gd2UgaGF2ZSB0byBoYXZlIGEgaGFuZGxlCi0JICogYW5kIGEgcmV0dXJuIGJ1ZmZlciBzdHJ1Y3R1cmUsIGFuZCBpZiB0aGVyZSBpcyBhIG5vbi16ZXJvIGJ1ZmZlciBsZW5ndGgKLQkgKiB3ZSBhbHNvIG5lZWQgYSB2YWxpZCBwb2ludGVyIGluIHRoZSBidWZmZXIuIElmIGl0J3MgYSB6ZXJvIGJ1ZmZlciBsZW5ndGgsCi0JICogd2UnbGwgYmUgcmV0dXJuaW5nIHRoZSBuZWVkZWQgYnVmZmVyIHNpemUsIHNvIGtlZXAgZ29pbmcuCi0JICovCi0JaWYgKCFkZXZpY2VfaGFuZGxlKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKLQl9CisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyB0aGVuIGRpc3BhdGNoIHRvIGludGVybmFsIHJvdXRpbmUgKi8KIAotCXN0YXR1cyA9IGFjcGlfdXRfdmFsaWRhdGVfYnVmZmVyKHJldF9idWZmZXIpOworCXN0YXR1cyA9IGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyLCAmbm9kZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCX0KIAotCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X2Nyc19tZXRob2RfZGF0YShkZXZpY2VfaGFuZGxlLCByZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX2dldF9jcnNfbWV0aG9kX2RhdGEobm9kZSwgcmV0X2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfY3VycmVudF9yZXNvdXJjZXMpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2N1cnJlbnRfcmVzb3VyY2VzKQogCisjaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcwogICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBhIGhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCisgKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gSGFuZGxlIHRvIHRoZSBkZXZpY2Ugb2JqZWN0IGZvciB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugd2UgYXJlIHF1ZXJ5aW5nCi0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHRvIHJlY2VpdmUgdGhlCisgKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgIC0gUG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZQogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBmb3IgdGhlIGRldmljZQogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKICAqCiAgKiBERVNDUklQVElPTjogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZ2V0IGEgbGlzdCBvZiB0aGUgcG9zc2libGUgcmVzb3VyY2VzCi0gKiAgICAgICAgICAgICAgZm9yIGEgc3BlY2lmaWMgZGV2aWNlLiAgVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUKLSAqICAgICAgICAgICAgICBmb3IgdGhlIGRlc2lyZWQgZGV2aWNlLiAgVGhlIHJlc291cmNlIGRhdGEgaXMgcGxhY2VkIGluIHRoZQorICogICAgICAgICAgICAgIGZvciBhIHNwZWNpZmljIGRldmljZS4gVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUKKyAqICAgICAgICAgICAgICBmb3IgdGhlIGRlc2lyZWQgZGV2aWNlLiBUaGUgcmVzb3VyY2UgZGF0YSBpcyBwbGFjZWQgaW4gdGhlCiAgKiAgICAgICAgICAgICAgYnVmZmVyIHBvaW50ZWQgdG8gYnkgdGhlIHJldF9idWZmZXIgdmFyaWFibGUuCiAgKgogICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBmYWlscyBhbiBhcHByb3ByaWF0ZSBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZAogICogICAgICAgICAgICAgIGFuZCB0aGUgdmFsdWUgb2YgcmV0X2J1ZmZlciBpcyB1bmRlZmluZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCiAJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKTsKIAotCS8qCi0JICogTXVzdCBoYXZlIGEgdmFsaWQgaGFuZGxlIGFuZCBidWZmZXIsIFNvIHdlIGhhdmUgdG8gaGF2ZSBhIGhhbmRsZQotCSAqIGFuZCBhIHJldHVybiBidWZmZXIgc3RydWN0dXJlLCBhbmQgaWYgdGhlcmUgaXMgYSBub24temVybyBidWZmZXIgbGVuZ3RoCi0JICogd2UgYWxzbyBuZWVkIGEgdmFsaWQgcG9pbnRlciBpbiB0aGUgYnVmZmVyLiBJZiBpdCdzIGEgemVybyBidWZmZXIgbGVuZ3RoLAotCSAqIHdlJ2xsIGJlIHJldHVybmluZyB0aGUgbmVlZGVkIGJ1ZmZlciBzaXplLCBzbyBrZWVwIGdvaW5nLgotCSAqLwotCWlmICghZGV2aWNlX2hhbmRsZSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7Ci0JfQorCS8qIFZhbGlkYXRlIHBhcmFtZXRlcnMgdGhlbiBkaXNwYXRjaCB0byBpbnRlcm5hbCByb3V0aW5lICovCiAKLQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX2J1ZmZlcihyZXRfYnVmZmVyKTsKKwlzdGF0dXMgPSBhY3BpX3JzX3ZhbGlkYXRlX3BhcmFtZXRlcnMoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlciwgJm5vZGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoZGV2aWNlX2hhbmRsZSwgcmV0X2J1ZmZlcik7CisJc3RhdHVzID0gYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhKG5vZGUsIHJldF9idWZmZXIpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3Bvc3NpYmxlX3Jlc291cmNlcyk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9nZXRfcG9zc2libGVfcmVzb3VyY2VzKQogI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV93YWxrX3Jlc291cmNlcwotICoKLSAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3ZSBhcmUgcXVlcnlpbmcKLSAqICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgLSBNZXRob2QgbmFtZSBvZiB0aGUgcmVzb3VyY2VzIHdlIHdhbnQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUVUSE9EX05BTUVfX0NSUyBvciBNRVRIT0RfTkFNRV9fUFJTKQotICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAtIENhbGxlZCBmb3IgZWFjaCByZXNvdXJjZQotICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBhc3NlZCB0byB1c2VyX2Z1bmN0aW9uCi0gKgotICogUkVUVVJOOiAgICAgIFN0YXR1cwotICoKLSAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgb3IgcG9zc2libGUgcmVzb3VyY2UgbGlzdCBmb3IgdGhlCi0gKiAgICAgICAgICAgICAgc3BlY2lmaWVkIGRldmljZS4gIFRoZSB1c2VyX2Z1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvcgotICogICAgICAgICAgICAgIGVhY2ggcmVzb3VyY2UgaW4gdGhlIGxpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYWNwaV9zdGF0dXMKLWFjcGlfd2Fsa19yZXNvdXJjZXMoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKLQkJICAgIGNoYXIgKm5hbWUsCi0JCSAgICBBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0sgdXNlcl9mdW5jdGlvbiwgdm9pZCAqY29udGV4dCkKLXsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlcjsKLQlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2U7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlX2VuZDsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfd2Fsa19yZXNvdXJjZXMiKTsKLQotCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCi0KLQlpZiAoIWRldmljZV9oYW5kbGUgfHwgIXVzZXJfZnVuY3Rpb24gfHwgIW5hbWUgfHwKLQkgICAgKEFDUElfU1RSTkNNUChuYW1lLCBNRVRIT0RfTkFNRV9fQ1JTLCBzaXplb2YoTUVUSE9EX05BTUVfX0NSUykpICYmCi0JICAgICBBQ1BJX1NUUk5DTVAobmFtZSwgTUVUSE9EX05BTUVfX1BSUywgc2l6ZW9mKE1FVEhPRF9OQU1FX19QUlMpKSkpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwotCX0KLQotCS8qIEdldCB0aGUgX0NSUyBvciBfUFJTIHJlc291cmNlIGxpc3QgKi8KLQotCWJ1ZmZlci5sZW5ndGggPSBBQ1BJX0FMTE9DQVRFX0xPQ0FMX0JVRkZFUjsKLQlzdGF0dXMgPSBhY3BpX3JzX2dldF9tZXRob2RfZGF0YShkZXZpY2VfaGFuZGxlLCBuYW1lLCAmYnVmZmVyKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JfQotCi0JLyogQnVmZmVyIG5vdyBjb250YWlucyB0aGUgcmVzb3VyY2UgbGlzdCAqLwotCi0JcmVzb3VyY2UgPSBBQ1BJX0NBU1RfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBidWZmZXIucG9pbnRlcik7Ci0JcmVzb3VyY2VfZW5kID0KLQkgICAgQUNQSV9BRERfUFRSKHN0cnVjdCBhY3BpX3Jlc291cmNlLCBidWZmZXIucG9pbnRlciwgYnVmZmVyLmxlbmd0aCk7Ci0KLQkvKiBXYWxrIHRoZSByZXNvdXJjZSBsaXN0IHVudGlsIHRoZSBlbmRfdGFnIGlzIGZvdW5kIChvciBidWZmZXIgZW5kKSAqLwotCi0Jd2hpbGUgKHJlc291cmNlIDwgcmVzb3VyY2VfZW5kKSB7Ci0JCS8qIFNhbml0eSBjaGVjayB0aGUgcmVzb3VyY2UgKi8KLQotCQlpZiAocmVzb3VyY2UtPnR5cGUgPiBBQ1BJX1JFU09VUkNFX1RZUEVfTUFYKSB7Ci0JCQlzdGF0dXMgPSBBRV9BTUxfSU5WQUxJRF9SRVNPVVJDRV9UWVBFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBJbnZva2UgdGhlIHVzZXIgZnVuY3Rpb24sIGFib3J0IG9uIGFueSBlcnJvciByZXR1cm5lZCAqLwotCi0JCXN0YXR1cyA9IHVzZXJfZnVuY3Rpb24ocmVzb3VyY2UsIGNvbnRleHQpOwotCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJCWlmIChzdGF0dXMgPT0gQUVfQ1RSTF9URVJNSU5BVEUpIHsKLQkJCQkvKiBUaGlzIGlzIGFuIE9LIHRlcm1pbmF0aW9uIGJ5IHRoZSB1c2VyIGZ1bmN0aW9uICovCi0KLQkJCQlzdGF0dXMgPSBBRV9PSzsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogZW5kX3RhZyBpbmRpY2F0ZXMgZW5kLW9mLWxpc3QgKi8KLQotCQlpZiAocmVzb3VyY2UtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpIHsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogR2V0IHRoZSBuZXh0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KLQotCQlyZXNvdXJjZSA9Ci0JCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAotCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKLQl9Ci0KLQlBQ1BJX01FTV9GUkVFKGJ1ZmZlci5wb2ludGVyKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotRVhQT1JUX1NZTUJPTChhY3BpX3dhbGtfcmVzb3VyY2VzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMKICAqCi0gKiBQQVJBTUVURVJTOiAgZGV2aWNlX2hhbmRsZSAgIC0gYSBoYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3ZSBhcmUgY2hhbmdpbmcgdGhlIHJlc291cmNlcyBvZgotICogICAgICAgICAgICAgIGluX2J1ZmZlciAgICAgICAtIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAtIEhhbmRsZSB0byB0aGUgZGV2aWNlIG9iamVjdCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIHdlIGFyZSBzZXR0aW5nIHJlc291cmNlcworICogICAgICAgICAgICAgIGluX2J1ZmZlciAgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgdG8gYmUgc2V0IGZvciB0aGUgZGV2aWNlCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byBzZXQgdGhlIGN1cnJlbnQgcmVzb3VyY2VzIGZvciBhCi0gKiAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlLiAgVGhlIGNhbGxlciBtdXN0IGZpcnN0IGFjcXVpcmUgYSBoYW5kbGUgZm9yCi0gKiAgICAgICAgICAgICAgdGhlIGRlc2lyZWQgZGV2aWNlLiAgVGhlIHJlc291cmNlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSByb3V0aW5lCisgKiAgICAgICAgICAgICAgc3BlY2lmaWMgZGV2aWNlLiBUaGUgY2FsbGVyIG11c3QgZmlyc3QgYWNxdWlyZSBhIGhhbmRsZSBmb3IKKyAqICAgICAgICAgICAgICB0aGUgZGVzaXJlZCBkZXZpY2UuIFRoZSByZXNvdXJjZSBkYXRhIGlzIHBhc3NlZCB0byB0aGUgcm91dGluZQogICogICAgICAgICAgICAgIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGUgaW5fYnVmZmVyIHZhcmlhYmxlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX3NldF9jdXJyZW50X3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAogCQkJICAgc3RydWN0IGFjcGlfYnVmZmVyICppbl9idWZmZXIpCiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKTsKIAotCS8qIE11c3QgaGF2ZSBhIHZhbGlkIGhhbmRsZSBhbmQgYnVmZmVyICovCisJLyogVmFsaWRhdGUgdGhlIGJ1ZmZlciwgZG9uJ3QgYWxsb3cgemVybyBsZW5ndGggKi8KIAotCWlmICgoIWRldmljZV9oYW5kbGUpIHx8Ci0JICAgICghaW5fYnVmZmVyKSB8fCAoIWluX2J1ZmZlci0+cG9pbnRlcikgfHwgKCFpbl9idWZmZXItPmxlbmd0aCkpIHsKKwlpZiAoKCFpbl9idWZmZXIpIHx8ICghaW5fYnVmZmVyLT5wb2ludGVyKSB8fCAoIWluX2J1ZmZlci0+bGVuZ3RoKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCi0Jc3RhdHVzID0gYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIGluX2J1ZmZlcik7CisJLyogVmFsaWRhdGUgcGFyYW1ldGVycyB0aGVuIGRpc3BhdGNoIHRvIGludGVybmFsIHJvdXRpbmUgKi8KKworCXN0YXR1cyA9IGFjcGlfcnNfdmFsaWRhdGVfcGFyYW1ldGVycyhkZXZpY2VfaGFuZGxlLCBpbl9idWZmZXIsICZub2RlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKG5vZGUsIGluX2J1ZmZlcik7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9zZXRfY3VycmVudF9yZXNvdXJjZXMpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0CiAgKgotICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIHJlc291cmNlCi0gKiAgICAgICAgICAgICAgT3V0ICAgICAgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSB1c2VycydzIHJldHVybgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIChhIHN0cnVjdAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0KQorICogUEFSQU1FVEVSUzogIFJlc291cmNlICAgICAgICAtIFBvaW50ZXIgdG8gYSByZXNvdXJjZQorICogICAgICAgICAgICAgIE91dCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHVzZXJzJ3MgcmV0dXJuIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhIHN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCkKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzCiAgKgogICogREVTQ1JJUFRJT046IElmIHRoZSByZXNvdXJjZSBpcyBhbiBhZGRyZXNzMTYsIGFkZHJlc3MzMiwgb3IgYWRkcmVzczY0LAotICogICAgICAgICAgICAgIGNvcHkgaXQgdG8gdGhlIGFkZHJlc3M2NCByZXR1cm4gYnVmZmVyLiAgVGhpcyBzYXZlcyB0aGUKKyAqICAgICAgICAgICAgICBjb3B5IGl0IHRvIHRoZSBhZGRyZXNzNjQgcmV0dXJuIGJ1ZmZlci4gVGhpcyBzYXZlcyB0aGUKICAqICAgICAgICAgICAgICBjYWxsZXIgZnJvbSBoYXZpbmcgdG8gZHVwbGljYXRlIGNvZGUgZm9yIGRpZmZlcmVudC1zaXplZAogICogICAgICAgICAgICAgIGFkZHJlc3Nlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCQkJICAgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczY0ICpvdXQpCkBAIC00MTUsMTggKzM2NCwxOCBAQAogCXJldHVybiAoQUVfT0spOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfdmVuZG9yX3Jlc291cmNlCiAgKgotICogUEFSQU1FVEVSUzogIGRldmljZV9oYW5kbGUgICAgICAgLSBIYW5kbGUgZm9yIHRoZSBwYXJlbnQgZGV2aWNlIG9iamVjdAotICogICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgLSBNZXRob2QgbmFtZSBmb3IgdGhlIHBhcmVudCByZXNvdXJjZQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUVUSE9EX05BTUVfX0NSUyBvciBNRVRIT0RfTkFNRV9fUFJTKQotICogICAgICAgICAgICAgIFV1aWQgICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBVVUlEIHRvIGJlIG1hdGNoZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIGJvdGggc3VidHlwZSBhbmQgMTYtYnl0ZSBVVUlECi0gKiAgICAgICAgICAgICAgcmV0X2J1ZmZlciAgICAgICAgICAtIFdoZXJlIHRoZSB2ZW5kb3IgcmVzb3VyY2UgaXMgcmV0dXJuZWQKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgZm9yIHRoZSBwYXJlbnQgZGV2aWNlIG9iamVjdAorICogICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAtIE1ldGhvZCBuYW1lIGZvciB0aGUgcGFyZW50IHJlc291cmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FVEhPRF9OQU1FX19DUlMgb3IgTUVUSE9EX05BTUVfX1BSUykKKyAqICAgICAgICAgICAgICBVdWlkICAgICAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBVVUlEIHRvIGJlIG1hdGNoZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYm90aCBzdWJ0eXBlIGFuZCAxNi1ieXRlIFVVSUQKKyAqICAgICAgICAgICAgICByZXRfYnVmZmVyICAgICAgLSBXaGVyZSB0aGUgdmVuZG9yIHJlc291cmNlIGlzIHJldHVybmVkCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKQEAgLTQzNSw3ICszODQsNiBAQAogICogICAgICAgICAgICAgIFVVSUQgc3VidHlwZS4gUmV0dXJucyBhIHN0cnVjdCBhY3BpX3Jlc291cmNlIG9mIHR5cGUgVmVuZG9yLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2dldF92ZW5kb3JfcmVzb3VyY2UoYWNwaV9oYW5kbGUgZGV2aWNlX2hhbmRsZSwKIAkJCSBjaGFyICpuYW1lLApAQCAtNDY3LDE4ICs0MTUsMTkgQEAKIAlyZXR1cm4gKGluZm8uc3RhdHVzKTsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3ZlbmRvcl9yZXNvdXJjZSkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9yc19tYXRjaF92ZW5kb3JfcmVzb3VyY2UKICAqCi0gKiBQQVJBTUVURVJTOiAgQUNQSV9XQUxLX1JFU09VUkNFX0NBTExCQUNLCisgKiBQQVJBTUVURVJTOiAgYWNwaV93YWxrX3Jlc291cmNlX2NhbGxiYWNrCiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKICAqIERFU0NSSVBUSU9OOiBNYXRjaCBhIHZlbmRvciByZXNvdXJjZSB2aWEgdGhlIEFDUEkgMy4wIFVVSUQKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBzdGF0aWMgYWNwaV9zdGF0dXMKIGFjcGlfcnNfbWF0Y2hfdmVuZG9yX3Jlc291cmNlKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwgdm9pZCAqY29udGV4dCkKIHsKQEAgLTUyNiwzICs0NzUsMTAxIEBACiAJaW5mby0+c3RhdHVzID0gQUVfT0s7CiAJcmV0dXJuIChBRV9DVFJMX1RFUk1JTkFURSk7CiB9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3JzX21hdGNoX3ZlbmRvcl9yZXNvdXJjZSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGVU5DVElPTjogICAgYWNwaV93YWxrX3Jlc291cmNlcworICoKKyAqIFBBUkFNRVRFUlM6ICBkZXZpY2VfaGFuZGxlICAgLSBIYW5kbGUgdG8gdGhlIGRldmljZSBvYmplY3QgZm9yIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSB3ZSBhcmUgcXVlcnlpbmcKKyAqICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgLSBNZXRob2QgbmFtZSBvZiB0aGUgcmVzb3VyY2VzIHdlIHdhbnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTUVUSE9EX05BTUVfX0NSUyBvciBNRVRIT0RfTkFNRV9fUFJTKQorICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAtIENhbGxlZCBmb3IgZWFjaCByZXNvdXJjZQorICogICAgICAgICAgICAgIENvbnRleHQgICAgICAgICAtIFBhc3NlZCB0byB1c2VyX2Z1bmN0aW9uCisgKgorICogUkVUVVJOOiAgICAgIFN0YXR1cworICoKKyAqIERFU0NSSVBUSU9OOiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgb3IgcG9zc2libGUgcmVzb3VyY2UgbGlzdCBmb3IgdGhlCisgKiAgICAgICAgICAgICAgc3BlY2lmaWVkIGRldmljZS4gVGhlIHVzZXJfZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yCisgKiAgICAgICAgICAgICAgZWFjaCByZXNvdXJjZSBpbiB0aGUgbGlzdC4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCithY3BpX3N0YXR1cworYWNwaV93YWxrX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAorCQkgICAgY2hhciAqbmFtZSwKKwkJICAgIGFjcGlfd2Fsa19yZXNvdXJjZV9jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLCB2b2lkICpjb250ZXh0KQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmZmVyOworCXN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2VfZW5kOworCisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3dhbGtfcmVzb3VyY2VzKTsKKworCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCisKKwlpZiAoIWRldmljZV9oYW5kbGUgfHwgIXVzZXJfZnVuY3Rpb24gfHwgIW5hbWUgfHwKKwkgICAgKCFBQ1BJX0NPTVBBUkVfTkFNRShuYW1lLCBNRVRIT0RfTkFNRV9fQ1JTKSAmJgorCSAgICAgIUFDUElfQ09NUEFSRV9OQU1FKG5hbWUsIE1FVEhPRF9OQU1FX19QUlMpKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CisJfQorCisJLyogR2V0IHRoZSBfQ1JTIG9yIF9QUlMgcmVzb3VyY2UgbGlzdCAqLworCisJYnVmZmVyLmxlbmd0aCA9IEFDUElfQUxMT0NBVEVfTE9DQUxfQlVGRkVSOworCXN0YXR1cyA9IGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGRldmljZV9oYW5kbGUsIG5hbWUsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwl9CisKKwkvKiBCdWZmZXIgbm93IGNvbnRhaW5zIHRoZSByZXNvdXJjZSBsaXN0ICovCisKKwlyZXNvdXJjZSA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyKTsKKwlyZXNvdXJjZV9lbmQgPQorCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIGJ1ZmZlci5wb2ludGVyLCBidWZmZXIubGVuZ3RoKTsKKworCS8qIFdhbGsgdGhlIHJlc291cmNlIGxpc3QgdW50aWwgdGhlIGVuZF90YWcgaXMgZm91bmQgKG9yIGJ1ZmZlciBlbmQpICovCisKKwl3aGlsZSAocmVzb3VyY2UgPCByZXNvdXJjZV9lbmQpIHsKKworCQkvKiBTYW5pdHkgY2hlY2sgdGhlIHJlc291cmNlICovCisKKwkJaWYgKHJlc291cmNlLT50eXBlID4gQUNQSV9SRVNPVVJDRV9UWVBFX01BWCkgeworCQkJc3RhdHVzID0gQUVfQU1MX0lOVkFMSURfUkVTT1VSQ0VfVFlQRTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSW52b2tlIHRoZSB1c2VyIGZ1bmN0aW9uLCBhYm9ydCBvbiBhbnkgZXJyb3IgcmV0dXJuZWQgKi8KKworCQlzdGF0dXMgPSB1c2VyX2Z1bmN0aW9uKHJlc291cmNlLCBjb250ZXh0KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlpZiAoc3RhdHVzID09IEFFX0NUUkxfVEVSTUlOQVRFKSB7CisKKwkJCQkvKiBUaGlzIGlzIGFuIE9LIHRlcm1pbmF0aW9uIGJ5IHRoZSB1c2VyIGZ1bmN0aW9uICovCisKKwkJCQlzdGF0dXMgPSBBRV9PSzsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogZW5kX3RhZyBpbmRpY2F0ZXMgZW5kLW9mLWxpc3QgKi8KKworCQlpZiAocmVzb3VyY2UtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUcpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogR2V0IHRoZSBuZXh0IHJlc291cmNlIGRlc2NyaXB0b3IgKi8KKworCQlyZXNvdXJjZSA9CisJCSAgICBBQ1BJX0FERF9QVFIoc3RydWN0IGFjcGlfcmVzb3VyY2UsIHJlc291cmNlLAorCQkJCSByZXNvdXJjZS0+bGVuZ3RoKTsKKwl9CisKKwlBQ1BJX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOworfQorCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV93YWxrX3Jlc291cmNlcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IGEwYWI4MjguLmY4MzE2YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMTQyLDcgKzE0Miw3IEBACiAJY3JlYXRlX3N5c2ZzX2RldmljZV9maWxlcyhkZXZpY2UpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQorc3RhdGljIHZvaWQgYWNwaV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCiB7CiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlpZiAoZGV2aWNlLT5wYXJlbnQpIHsKQEAgLTE1OCw3ICsxNTgsNiBAQAogCWFjcGlfZGV0YWNoX2RhdGEoZGV2aWNlLT5oYW5kbGUsIGFjcGlfYnVzX2RhdGFfaGFuZGxlcik7CiAJcmVtb3ZlX3N5c2ZzX2RldmljZV9maWxlcyhkZXZpY2UpOwogCWtvYmplY3RfdW5yZWdpc3RlcigmZGV2aWNlLT5rb2JqKTsKLQlyZXR1cm4gMDsKIH0KIAogdm9pZCBhY3BpX2J1c19kYXRhX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpCkBAIC0yMzQsMTIgKzIzMyw5IEBACiAKIGludCBhY3BpX21hdGNoX2lkcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgY2hhciAqaWRzKQogewotCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZmZlciA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEwgfTsKLQogCWlmIChkZXZpY2UtPmZsYWdzLmhhcmR3YXJlX2lkKQogCQlpZiAoc3Ryc3RyKGlkcywgZGV2aWNlLT5wbnAuaGFyZHdhcmVfaWQpKQotCQkJZ290byBEb25lOworCQkJcmV0dXJuIDA7CiAKIAlpZiAoZGV2aWNlLT5mbGFncy5jb21wYXRpYmxlX2lkcykgewogCQlzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkX2xpc3QgKmNpZF9saXN0ID0gZGV2aWNlLT5wbnAuY2lkX2xpc3Q7CkBAIC0yNDgsMTUgKzI0NCwxMCBAQAogCQkvKiBjb21wYXJlIG11bHRpcGxlIF9DSUQgZW50cmllcyBhZ2FpbnN0IGRyaXZlciBpZHMgKi8KIAkJZm9yIChpID0gMDsgaSA8IGNpZF9saXN0LT5jb3VudDsgaSsrKSB7CiAJCQlpZiAoc3Ryc3RyKGlkcywgY2lkX2xpc3QtPmlkW2ldLnZhbHVlKSkKLQkJCQlnb3RvIERvbmU7CisJCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JZXJyb3IgPSAtRU5PRU5UOwotCi0gICAgICBEb25lOgotCWlmIChidWZmZXIucG9pbnRlcikKLQkJYWNwaV9vc19mcmVlKGJ1ZmZlci5wb2ludGVyKTsKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cwpAQCAtNDQxLDEwICs0MzIsNyBAQAogCWlzbG9ja2FibGUgPSBkZXZpY2UtPmZsYWdzLmxvY2thYmxlOwogCWhhbmRsZSA9IGRldmljZS0+aGFuZGxlOwogCi0JaWYgKHR5cGUgPT0gQUNQSV9UWVBFX1BST0NFU1NPUikKLQkJcmVzdWx0ID0gYWNwaV9idXNfdHJpbShkZXZpY2UsIDApOwotCWVsc2UKLQkJcmVzdWx0ID0gYWNwaV9idXNfdHJpbShkZXZpY2UsIDEpOworCXJlc3VsdCA9IGFjcGlfYnVzX3RyaW0oZGV2aWNlLCAxKTsKIAogCWlmICghcmVzdWx0KQogCQlyZXN1bHQgPSBhY3BpX2VqZWN0X29wZXJhdGlvbihoYW5kbGUsIGlzbG9ja2FibGUpOwpAQCAtNDcxLDcgKzQ1OSw2IEBACiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiBzdGF0aWMgTElTVF9IRUFEKGFjcGlfYnVzX2RyaXZlcnMpOwotc3RhdGljIERFQ0xBUkVfTVVURVgoYWNwaV9idXNfZHJpdmVyc19sb2NrKTsKIAogLyoqCiAgKiBhY3BpX2J1c19tYXRjaCAtIG1hdGNoIGRldmljZSBJRHMgdG8gZHJpdmVyJ3Mgc3VwcG9ydGVkIElEcwpAQCAtNTQ4LDEwICs1MzUsOSBAQAogCXJldHVybl9WQUxVRShyZXN1bHQpOwogfQogCi1zdGF0aWMgaW50IGFjcGlfZHJpdmVyX2F0dGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRydikKK3N0YXRpYyB2b2lkIGFjcGlfZHJpdmVyX2F0dGFjaChzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRydikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKLQlpbnQgY291bnQgPSAwOwogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9kcml2ZXJfYXR0YWNoIik7CiAKQEAgLTU2OCw3ICs1NTQsNiBAQAogCQkJaWYgKCFhY3BpX2J1c19kcml2ZXJfaW5pdChkZXYsIGRydikpIHsKIAkJCQlhY3BpX3N0YXJ0X3NpbmdsZV9vYmplY3QoZGV2KTsKIAkJCQlhdG9taWNfaW5jKCZkcnYtPnJlZmVyZW5jZXMpOwotCQkJCWNvdW50Kys7CiAJCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAogCQkJCQkJICAiRm91bmQgZHJpdmVyIFslc10gZm9yIGRldmljZSBbJXNdXG4iLAogCQkJCQkJICBkcnYtPm5hbWUsIGRldi0+cG5wLmJ1c19pZCkpOwpAQCAtNTc3LDEwICs1NjIsOSBAQAogCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwogCX0KIAlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7Ci0JcmV0dXJuX1ZBTFVFKGNvdW50KTsKIH0KIAotc3RhdGljIGludCBhY3BpX2RyaXZlcl9kZXRhY2goc3RydWN0IGFjcGlfZHJpdmVyICpkcnYpCitzdGF0aWMgdm9pZCBhY3BpX2RyaXZlcl9kZXRhY2goc3RydWN0IGFjcGlfZHJpdmVyICpkcnYpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKQEAgLTYwMiw3ICs1ODYsNiBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQlyZXR1cm5fVkFMVUUoMCk7CiB9CiAKIC8qKgpAQCAtNjEwLDI4ICs1OTMsMjIgQEAKICAqIEBkcml2ZXI6IGRyaXZlciBiZWluZyByZWdpc3RlcmVkCiAgKgogICogUmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggdGhlIEFDUEkgYnVzLiAgU2VhcmNoZXMgdGhlIG5hbWVzcGFjZSBmb3IgYWxsCi0gKiBkZXZpY2VzIHRoYXQgbWF0Y2ggdGhlIGRyaXZlcidzIGNyaXRlcmlhIGFuZCBiaW5kcy4gIFJldHVybnMgdGhlCi0gKiBudW1iZXIgb2YgZGV2aWNlcyB0aGF0IHdlcmUgY2xhaW1lZCBieSB0aGUgZHJpdmVyLCBvciBhIG5lZ2F0aXZlCi0gKiBlcnJvciBzdGF0dXMgZm9yIGZhaWx1cmUuCisgKiBkZXZpY2VzIHRoYXQgbWF0Y2ggdGhlIGRyaXZlcidzIGNyaXRlcmlhIGFuZCBiaW5kcy4gIFJldHVybnMgemVybyBmb3IKKyAqIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBzdGF0dXMgZm9yIGZhaWx1cmUuCiAgKi8KIGludCBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCiB7Ci0JaW50IGNvdW50OwotCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyIik7CiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCi0JaWYgKCFkcml2ZXIpCi0JCXJldHVybl9WQUxVRSgtRUlOVkFMKTsKLQogCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmZHJpdmVyLT5ub2RlLCAmYWNwaV9idXNfZHJpdmVycyk7CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCWNvdW50ID0gYWNwaV9kcml2ZXJfYXR0YWNoKGRyaXZlcik7CisJYWNwaV9kcml2ZXJfYXR0YWNoKGRyaXZlcik7CiAKLQlyZXR1cm5fVkFMVUUoY291bnQpOworCXJldHVybl9WQUxVRSgwKTsKIH0KIAogRVhQT1JUX1NZTUJPTChhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIpOwpAQCAtNjQzLDIzICs2MjAsMTYgQEAKICAqIFVucmVnaXN0ZXJzIGEgZHJpdmVyIHdpdGggdGhlIEFDUEkgYnVzLiAgU2VhcmNoZXMgdGhlIG5hbWVzcGFjZSBmb3IgYWxsCiAgKiBkZXZpY2VzIHRoYXQgbWF0Y2ggdGhlIGRyaXZlcidzIGNyaXRlcmlhIGFuZCB1bmJpbmRzLgogICovCi1pbnQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpCit2b2lkIGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhY3BpX2RyaXZlciAqZHJpdmVyKQogewotCWludCBlcnJvciA9IDA7CisJYWNwaV9kcml2ZXJfZGV0YWNoKGRyaXZlcik7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlciIpOwotCi0JaWYgKGRyaXZlcikgewotCQlhY3BpX2RyaXZlcl9kZXRhY2goZHJpdmVyKTsKLQotCQlpZiAoIWF0b21pY19yZWFkKCZkcml2ZXItPnJlZmVyZW5jZXMpKSB7Ci0JCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCQkJbGlzdF9kZWxfaW5pdCgmZHJpdmVyLT5ub2RlKTsKLQkJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKLQkJfQotCX0gZWxzZQotCQllcnJvciA9IC1FSU5WQUw7Ci0JcmV0dXJuX1ZBTFVFKGVycm9yKTsKKwlpZiAoIWF0b21pY19yZWFkKCZkcml2ZXItPnJlZmVyZW5jZXMpKSB7CisJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmRyaXZlci0+bm9kZSk7CisJCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwl9CisJcmV0dXJuOwogfQogCiBFWFBPUlRfU1lNQk9MKGFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKTsKQEAgLTEzNzEsNiArMTM0MSwxMDAgQEAKIAlyZXR1cm5fVkFMVUUocmVzdWx0KTsKIH0KIAorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhY3BpX2RldmljZSAqIHRvX2FjcGlfZGV2KHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBhY3BpX2RldmljZSwgZGV2KTsKK30KKworCitzdGF0aWMgaW50IHJvb3Rfc3VzcGVuZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBhY3BpX2RldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldiwgKiBuZXh0OworCWludCByZXN1bHQ7CisKKwlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKGRldiwgbmV4dCwgJmFjcGlfZGV2aWNlX2xpc3QsIGdfbGlzdCkgeworCQlpZiAoZGV2LT5kcml2ZXIgJiYgZGV2LT5kcml2ZXItPm9wcy5zdXNwZW5kKSB7CisJCQlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJCQlyZXN1bHQgPSBkZXYtPmRyaXZlci0+b3BzLnN1c3BlbmQoZGV2LCAwKTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJbJXMgLSAlc10gU3VzcGVuZCBmYWlsZWQ6ICVkXG4iLAorCQkJCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldiksCisJCQkJICAgICAgIGFjcGlfZGV2aWNlX2JpZChkZXYpLCByZXN1bHQpOworCQkJfQorCQkJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhY3BpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBhY3BpX2RldiA9IHRvX2FjcGlfZGV2KGRldik7CisKKwkvKgorCSAqIEZvciBub3csIHdlIHNob3VsZCBvbmx5IHJlZ2lzdGVyIDEgZ2VuZXJpYyBkZXZpY2UgLQorCSAqIHRoZSBBQ1BJIHJvb3QgZGV2aWNlIC0gYW5kIGZyb20gdGhlcmUsIHdlIHdhbGsgdGhlCisJICogdHJlZSBvZiBBQ1BJIGRldmljZXMgdG8gc3VzcGVuZCBlYWNoIG9uZSB1c2luZyB0aGUKKwkgKiBBQ1BJIGRyaXZlciBtZXRob2RzLgorCSAqLworCWlmIChhY3BpX2Rldi0+aGFuZGxlID09IEFDUElfUk9PVF9PQkpFQ1QpCisJCXJvb3Rfc3VzcGVuZChhY3BpX2Rldiwgc3RhdGUpOworCXJldHVybiAwOworfQorCisKKworc3RhdGljIGludCByb290X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBhY3BpX2RldikKK3sKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKiBkZXYsICogbmV4dDsKKwlpbnQgcmVzdWx0OworCisJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCBuZXh0LCAmYWNwaV9kZXZpY2VfbGlzdCwgZ19saXN0KSB7CisJCWlmIChkZXYtPmRyaXZlciAmJiBkZXYtPmRyaXZlci0+b3BzLnJlc3VtZSkgeworCQkJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCQkJcmVzdWx0ID0gZGV2LT5kcml2ZXItPm9wcy5yZXN1bWUoZGV2LCAwKTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJbJXMgLSAlc10gcmVzdW1lIGZhaWxlZDogJWRcbiIsCisJCQkJICAgICAgIGFjcGlfZGV2aWNlX25hbWUoZGV2KSwKKwkJCQkgICAgICAgYWNwaV9kZXZpY2VfYmlkKGRldiksIHJlc3VsdCk7CisJCQl9CisJCQlzcGluX2xvY2soJmFjcGlfZGV2aWNlX2xvY2spOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFjcGlfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICogZGV2KQoreworCXN0cnVjdCBhY3BpX2RldmljZSAqIGFjcGlfZGV2ID0gdG9fYWNwaV9kZXYoZGV2KTsKKworCS8qCisJICogRm9yIG5vdywgd2Ugc2hvdWxkIG9ubHkgcmVnaXN0ZXIgMSBnZW5lcmljIGRldmljZSAtCisJICogdGhlIEFDUEkgcm9vdCBkZXZpY2UgLSBhbmQgZnJvbSB0aGVyZSwgd2Ugd2FsayB0aGUKKwkgKiB0cmVlIG9mIEFDUEkgZGV2aWNlcyB0byByZXN1bWUgZWFjaCBvbmUgdXNpbmcgdGhlCisJICogQUNQSSBkcml2ZXIgbWV0aG9kcy4KKwkgKi8KKwlpZiAoYWNwaV9kZXYtPmhhbmRsZSA9PSBBQ1BJX1JPT1RfT0JKRUNUKQorCQlyb290X3Jlc3VtZShhY3BpX2Rldik7CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGJ1c190eXBlIGFjcGlfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImFjcGkiLAorCS5zdXNwZW5kCT0gYWNwaV9kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFjcGlfZGV2aWNlX3Jlc3VtZSwKK307CisKKworCiBzdGF0aWMgaW50IF9faW5pdCBhY3BpX3NjYW5faW5pdCh2b2lkKQogewogCWludCByZXN1bHQ7CkBAIC0xMzgzLDYgKzE0NDcsMTIgQEAKIAogCWtzZXRfcmVnaXN0ZXIoJmFjcGlfbmFtZXNwYWNlX2tzZXQpOwogCisJcmVzdWx0ID0gYnVzX3JlZ2lzdGVyKCZhY3BpX2J1c190eXBlKTsKKwlpZiAocmVzdWx0KSB7CisJCS8qIFdlIGRvbid0IHdhbnQgdG8gcXVpdCBldmVuIGlmIHdlIGZhaWxlZCB0byBhZGQgc3VzcGVuZC9yZXN1bWUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHJlZ2lzdGVyIGJ1cyB0eXBlXG4iKTsKKwl9CisKIAkvKgogCSAqIENyZWF0ZSB0aGUgcm9vdCBkZXZpY2UgaW4gdGhlIGJ1cydzIGRldmljZSB0cmVlCiAJICovCkBAIC0xMzkyLDYgKzE0NjIsMTYgQEAKIAkJZ290byBEb25lOwogCiAJcmVzdWx0ID0gYWNwaV9zdGFydF9zaW5nbGVfb2JqZWN0KGFjcGlfcm9vdCk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBEb25lOworCisJYWNwaV9yb290LT5kZXYuYnVzID0gJmFjcGlfYnVzX3R5cGU7CisJc25wcmludGYoYWNwaV9yb290LT5kZXYuYnVzX2lkLCBCVVNfSURfU0laRSwgIiVzIiwgYWNwaV9idXNfdHlwZS5uYW1lKTsKKwlyZXN1bHQgPSBkZXZpY2VfcmVnaXN0ZXIoJmFjcGlfcm9vdC0+ZGV2KTsKKwlpZiAocmVzdWx0KSB7CisJCS8qIFdlIGRvbid0IHdhbnQgdG8gcXVpdCBldmVuIGlmIHdlIGZhaWxlZCB0byBhZGQgc3VzcGVuZC9yZXN1bWUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ291bGQgbm90IHJlZ2lzdGVyIGRldmljZVxuIik7CisJfQogCiAJLyoKIAkgKiBFbnVtZXJhdGUgZGV2aWNlcyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jIGIvZHJpdmVycy9hY3BpL3NsZWVwL21haW4uYwppbmRleCA5MzA0MjdmLi42MmNlODdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAvbWFpbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC9tYWluLmMKQEAgLTEwNSw2ICsxMDUsMTQgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisKKwkvKiBBQ1BJIDMuMCBzcGVjcyAoUDYyKSBzYXlzIHRoYXQgaXQncyB0aGUgcmVzcG9uc2FiaWx0eQorCSAqIG9mIHRoZSBPU1BNIHRvIGNsZWFyIHRoZSBzdGF0dXMgYml0IFsgaW1wbHlpbmcgdGhhdCB0aGUKKwkgKiBQT1dFUl9CVVRUT04gZXZlbnQgc2hvdWxkIG5vdCByZWFjaCB1c2Vyc3BhY2UgXQorCSAqLworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSAmJiAoYWNwaV9zdGF0ZSA9PSBBQ1BJX1NUQVRFX1MzKSkKKwkJYWNwaV9jbGVhcl9ldmVudChBQ1BJX0VWRU5UX1BPV0VSX0JVVFRPTik7CisKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIkJhY2sgdG8gQyFcbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMgYi9kcml2ZXJzL2FjcGkvc2xlZXAvd2FrZXVwLmMKaW5kZXggODVkZjBjZS4uYWYxZGJhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3NsZWVwL3dha2V1cC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC93YWtldXAuYwpAQCAtMTU1LDcgKzE1NSw2IEBACiAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIDA7Ci0JcHJpbnRrKCJBQ1BJIHdha2V1cCBkZXZpY2VzOiBcbiIpOwogCiAJc3Bpbl9sb2NrKCZhY3BpX2RldmljZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJmFjcGlfd2FrZXVwX2RldmljZV9saXN0KSB7CkBAIC0xNzQsMTAgKzE3Myw4IEBACiAJCQlkZXYtPndha2V1cC5zdGF0ZS5lbmFibGVkID0gMTsKIAkJCXNwaW5fbG9jaygmYWNwaV9kZXZpY2VfbG9jayk7CiAJCX0KLQkJcHJpbnRrKCIlNHMgIiwgZGV2LT5wbnAuYnVzX2lkKTsKIAl9CiAJc3Bpbl91bmxvY2soJmFjcGlfZGV2aWNlX2xvY2spOwotCXByaW50aygiXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jIGIvZHJpdmVycy9hY3BpL3N5c3RlbS5jCmluZGV4IGU0MzA4YzcuLmE5MzRhYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKQEAgLTM5LDcgKzM5LDcgQEAKICNkZWZpbmUgQUNQSV9TWVNURU1fRklMRV9FVkVOVAkJImV2ZW50IgogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0RTRFQJCSJkc2R0IgogI2RlZmluZSBBQ1BJX1NZU1RFTV9GSUxFX0ZBRFQJCSJmYWR0IgotZXh0ZXJuIEZBRFRfREVTQ1JJUFRPUiBhY3BpX2ZhZHQ7CitleHRlcm4gc3RydWN0IGZhZHRfZGVzY3JpcHRvciBhY3BpX2ZhZHQ7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUyBJbnRlcmZhY2UgKC9wcm9jKQpAQCAtODIsNyArODIsNyBAQAogCiAJQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9zeXN0ZW1fcmVhZF9kc2R0Iik7CiAKLQlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1RBQkxFX0RTRFQsIDEsICZkc2R0KTsKKwlzdGF0dXMgPSBhY3BpX2dldF90YWJsZShBQ1BJX1RBQkxFX0lEX0RTRFQsIDEsICZkc2R0KTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCiAJCXJldHVybl9WQUxVRSgtRU5PREVWKTsKIApAQCAtMTEwLDcgKzExMCw3IEBACiAKIAlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX3N5c3RlbV9yZWFkX2ZhZHQiKTsKIAotCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfRkFEVCwgMSwgJmZhZHQpOworCXN0YXR1cyA9IGFjcGlfZ2V0X3RhYmxlKEFDUElfVEFCTEVfSURfRkFEVCwgMSwgJmZhZHQpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKIAkJcmV0dXJuX1ZBTFVFKC1FTk9ERVYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzLmMKaW5kZXggN2YzN2M3Yy4uZWQ1ZTg4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwpAQCAtMjgyLDggKzI4Miw4IEBACiAKIAkvKiBNYXAgdGhlIERTRFQgaGVhZGVyIHZpYSB0aGUgcG9pbnRlciBpbiB0aGUgRkFEVCAqLwogCWlmIChpZCA9PSBBQ1BJX0RTRFQpIHsKLQkJc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpmYWR0ID0KLQkJICAgIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKikqaGVhZGVyOworCQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpmYWR0ID0KKwkJICAgIChzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICopKmhlYWRlcjsKIAogCQlpZiAoZmFkdC0+cmV2aXNpb24gPT0gMyAmJiBmYWR0LT5YZHNkdCkgewogCQkJKmhlYWRlciA9ICh2b2lkICopX19hY3BpX21hcF90YWJsZShmYWR0LT5YZHNkdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJjb252cnQuYwppbmRleCAwM2IzN2QyLi5kNjk3ZmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiY29udnJ0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmNvbnZydC5jCkBAIC00MSw4ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCkBAIC01NiwxNSArNTQsMTUgQEAKIAkJCSAgICAgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MpOwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKK2FjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAogCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgKm9yaWdpbmFsX2ZhZHQpOwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKLQkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpvcmlnaW5hbF9mYWR0KTsKK2FjcGlfdGJfY29udmVydF9mYWR0MihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAorCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpvcmlnaW5hbF9mYWR0KTsKIAogdTggYWNwaV9mYWR0X2lzX3YxOwotRVhQT1JUX1NZTUJPTChhY3BpX2ZhZHRfaXNfdjEpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZmFkdF9pc192MSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0xMjIsNyArMTIwLDcgQEAKIHsKIAlhY3BpX3NpemUgdGFibGVfc2l6ZTsKIAl1MzIgaTsKLQlYU0RUX0RFU0NSSVBUT1IgKm5ld190YWJsZTsKKwlzdHJ1Y3QgeHNkdF9kZXNjcmlwdG9yICpuZXdfdGFibGU7CiAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKQEAgLTEzMyw3ICsxMzEsNyBAQAogCiAJLyogQWxsb2NhdGUgYW4gWFNEVCAqLwogCi0JbmV3X3RhYmxlID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHRhYmxlX3NpemUpOworCW5ld190YWJsZSA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHRhYmxlX3NpemUpOwogCWlmICghbmV3X3RhYmxlKSB7CiAJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAl9CkBAIC0xNDcsMTcgKzE0NSwxOCBAQAogCS8qIENvcHkgdGhlIHRhYmxlIHBvaW50ZXJzICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsgaSsrKSB7CisKIAkJLyogUlNEVCBwb2ludGVycyBhcmUgMzIgYml0cywgWFNEVCBwb2ludGVycyBhcmUgNjQgYml0cyAqLwogCiAJCWlmIChhY3BpX2dibF9yb290X3RhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9UWVBFX1JTRFQpIHsKIAkJCUFDUElfU1RPUkVfQUREUkVTUyhuZXdfdGFibGUtPnRhYmxlX29mZnNldF9lbnRyeVtpXSwKIAkJCQkJICAgKEFDUElfQ0FTVF9QVFIKLQkJCQkJICAgIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEsCisJCQkJCSAgICAoc3RydWN0IHJzZHRfZGVzY3JpcHRvciwKIAkJCQkJICAgICB0YWJsZV9pbmZvLT5wb2ludGVyKSktPgogCQkJCQkgICB0YWJsZV9vZmZzZXRfZW50cnlbaV0pOwogCQl9IGVsc2UgewogCQkJbmV3X3RhYmxlLT50YWJsZV9vZmZzZXRfZW50cnlbaV0gPQotCQkJICAgIChBQ1BJX0NBU1RfUFRSKFhTRFRfREVTQ1JJUFRPUiwKKwkJCSAgICAoQUNQSV9DQVNUX1BUUihzdHJ1Y3QgeHNkdF9kZXNjcmlwdG9yLAogCQkJCQkgICB0YWJsZV9pbmZvLT5wb2ludGVyKSktPgogCQkJICAgIHRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAkJfQpAQCAtMjE5LDcgKzIxOCw3IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQxKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKK2FjcGlfdGJfY29udmVydF9mYWR0MShzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yICpsb2NhbF9mYWR0LAogCQkgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgKm9yaWdpbmFsX2ZhZHQpCiB7CiAKQEAgLTM2NSwxNCArMzY0LDEzIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgdm9pZAotYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MiAqbG9jYWxfZmFkdCwKLQkJICAgICAgc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyICpvcmlnaW5hbF9mYWR0KQorYWNwaV90Yl9jb252ZXJ0X2ZhZHQyKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKmxvY2FsX2ZhZHQsCisJCSAgICAgIHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IgKm9yaWdpbmFsX2ZhZHQpCiB7CiAKIAkvKiBXZSBoYXZlIGFuIEFDUEkgMi4wIEZBRFQgYnV0IHdlIG11c3QgY29weSBpdCB0byBvdXIgbG9jYWwgYnVmZmVyICovCiAKLQlBQ1BJX01FTUNQWShsb2NhbF9mYWR0LCBvcmlnaW5hbF9mYWR0LAotCQkgICAgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpOworCUFDUElfTUVNQ1BZKGxvY2FsX2ZhZHQsIG9yaWdpbmFsX2ZhZHQsIHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yKSk7CiAKIAkvKgogCSAqICJYIiBmaWVsZHMgYXJlIG9wdGlvbmFsIGV4dGVuc2lvbnMgdG8gdGhlIG9yaWdpbmFsIFYxLjAgZmllbGRzLCBzbwpAQCAtNDkxLDEwICs0ODksMTAgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV90Yl9jb252ZXJ0X3RhYmxlX2ZhZHQodm9pZCkKIHsKLQlzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIgKmxvY2FsX2ZhZHQ7CisJc3RydWN0IGZhZHRfZGVzY3JpcHRvciAqbG9jYWxfZmFkdDsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfY29udmVydF90YWJsZV9mYWR0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9jb252ZXJ0X3RhYmxlX2ZhZHQpOwogCiAJLyoKIAkgKiBhY3BpX2dibF9GQURUIGlzIHZhbGlkLiBWYWxpZGF0ZSB0aGUgRkFEVCBsZW5ndGguIFRoZSB0YWJsZSBtdXN0IGJlCkBAIC01MDgsMTMgKzUwNiwxNCBAQAogCiAJLyogQWxsb2NhdGUgYnVmZmVyIGZvciB0aGUgQUNQSSAyLjAoKykgRkFEVCAqLwogCi0JbG9jYWxfZmFkdCA9IEFDUElfTUVNX0NBTExPQ0FURShzaXplb2Yoc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyKSk7CisJbG9jYWxfZmFkdCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yKSk7CiAJaWYgKCFsb2NhbF9mYWR0KSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KIAogCWlmIChhY3BpX2dibF9GQURULT5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgewotCQlpZiAoYWNwaV9nYmxfRkFEVC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2MikpIHsKKwkJaWYgKGFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yKSkgeworCiAJCQkvKiBMZW5ndGggaXMgdG9vIHNob3J0IHRvIGJlIGEgVjIuMCB0YWJsZSAqLwogCiAJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCkBAIC01MzgsMTEgKzUzNywxMSBAQAogCS8qIEdsb2JhbCBGQURUIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGUgbmV3IGNvbW1vbiBWMi4wIEZBRFQgKi8KIAogCWFjcGlfZ2JsX0ZBRFQgPSBsb2NhbF9mYWR0OwotCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA9IHNpemVvZihGQURUX0RFU0NSSVBUT1IpOworCWFjcGlfZ2JsX0ZBRFQtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yKTsKIAogCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHRhYmxlICovCiAKLQl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9GQURUXS5uZXh0OworCXRhYmxlX2Rlc2MgPSBhY3BpX2dibF90YWJsZV9saXN0c1tBQ1BJX1RBQkxFX0lEX0ZBRFRdLm5leHQ7CiAJYWNwaV90Yl9kZWxldGVfc2luZ2xlX3RhYmxlKHRhYmxlX2Rlc2MpOwogCiAJLyogSW5zdGFsbCB0aGUgbmV3IHRhYmxlICovCkBAIC01NTAsNyArNTQ5LDcgQEAKIAl0YWJsZV9kZXNjLT5wb2ludGVyID0KIAkgICAgQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIGFjcGlfZ2JsX0ZBRFQpOwogCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gPSBBQ1BJX01FTV9BTExPQ0FURUQ7Ci0JdGFibGVfZGVzYy0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Mik7CisJdGFibGVfZGVzYy0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBmYWR0X2Rlc2NyaXB0b3IpOwogCiAJLyogRHVtcCB0aGUgZW50aXJlIEZBRFQgKi8KIApAQCAtNTgwLDcgKzU3OSw3IEBACiBhY3BpX3N0YXR1cyBhY3BpX3RiX2J1aWxkX2NvbW1vbl9mYWNzKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2luZm8pCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9idWlsZF9jb21tb25fZmFjcyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfYnVpbGRfY29tbW9uX2ZhY3MpOwogCiAJLyogQWJzb2x1dGUgbWluaW11bSBsZW5ndGggaXMgMjQsIGJ1dCB0aGUgQUNQSSBzcGVjIHNheXMgNjQgKi8KIApAQCAtNjAzLDYgKzYwMiw3IEBACiAJaWYgKChhY3BpX2dibF9SU0RQLT5yZXZpc2lvbiA8IDIpIHx8CiAJICAgIChhY3BpX2dibF9GQUNTLT5sZW5ndGggPCAzMikgfHwKIAkgICAgKCEoYWNwaV9nYmxfRkFDUy0+eGZpcm13YXJlX3dha2luZ192ZWN0b3IpKSkgeworCiAJCS8qIEFDUEkgMS4wIEZBQ1Mgb3Igc2hvcnQgdGFibGUgb3Igb3B0aW9uYWwgWF8gZmllbGQgaXMgemVybyAqLwogCiAJCWFjcGlfZ2JsX2NvbW1vbl9mQUNTLmZpcm13YXJlX3dha2luZ192ZWN0b3IgPSBBQ1BJX0NBU1RfUFRSKHU2NCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXQuYwppbmRleCAwOWI0ZWU2Li45OWVhY2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldC5jCkBAIC03OCw3ICs3OCw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciBoZWFkZXI7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9nZXRfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF90YWJsZSk7CiAKIAkvKiBHZXQgdGhlIGhlYWRlciBpbiBvcmRlciB0byBnZXQgc2lnbmF0dXJlIGFuZCB0YWJsZSBzaXplICovCiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyID0gTlVMTDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9oZWFkZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF90YWJsZV9oZWFkZXIpOwogCiAJLyoKIAkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbApAQCAtMTQ4LDYgKzE0OCwxMCBAQAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciksCiAJCQkJCSAgICAodm9pZCAqKSZoZWFkZXIpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkJICAgICJDb3VsZCBub3QgbWFwIG1lbW9yeSBhdCAlOC44WCU4LjhYIGZvciB0YWJsZSBoZWFkZXIiLAorCQkJCSAgICBBQ1BJX0ZPUk1BVF9VSU5UNjQoYWRkcmVzcy0+cG9pbnRlci4KKwkJCQkJCSAgICAgICBwaHlzaWNhbCkpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAKQEAgLTE5OCw3ICsyMDIsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9ib2R5Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl9nZXRfdGFibGVfYm9keSk7CiAKIAlpZiAoIXRhYmxlX2luZm8gfHwgIWFkZHJlc3MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMjA4LDYgKzIxMiw3IEBACiAKIAlzdGF0dXMgPSBhY3BpX3RiX3RhYmxlX292ZXJyaWRlKGhlYWRlciwgdGFibGVfaW5mbyk7CiAJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKIAkJLyogVGFibGUgd2FzIG92ZXJyaWRkZW4gYnkgdGhlIGhvc3QgT1MgKi8KIAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKQEAgLTI0MSw3ICsyNDYsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl90YWJsZV9vdmVycmlkZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfdGFibGVfb3ZlcnJpZGUpOwogCiAJLyoKIAkgKiBUaGUgT1NMIHdpbGwgZXhhbWluZSB0aGUgaGVhZGVyIGFuZCBkZWNpZGUgd2hldGhlciB0byBvdmVycmlkZSB0aGlzCkBAIC0yNTAsNiArMjU1LDcgQEAKIAkgKi8KIAlzdGF0dXMgPSBhY3BpX29zX3RhYmxlX292ZXJyaWRlKGhlYWRlciwgJm5ld190YWJsZSk7CiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJLyogU29tZSBzZXZlcmUgZXJyb3IgZnJvbSB0aGUgT1NMLCBidXQgd2UgYmFzaWNhbGx5IGlnbm9yZSBpdCAqLwogCiAJCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsCkBAIC0yNTgsNiArMjY0LDcgQEAKIAl9CiAKIAlpZiAoIW5ld190YWJsZSkgeworCiAJCS8qIE5vIHRhYmxlIG92ZXJyaWRlICovCiAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX0FDUElfVEFCTEVTKTsKQEAgLTMxMSw3ICszMTgsNyBAQAogCXU4IGFsbG9jYXRpb247CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9nZXRfdGhpc190YWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZ2V0X3RoaXNfdGFibGUpOwogCiAJLyoKIAkgKiBGbGFncyBjb250YWlucyB0aGUgY3VycmVudCBwcm9jZXNzb3IgbW9kZSAoVmlydHVhbCBvciBQaHlzaWNhbApAQCAtMzIzLDcgKzMzMCw3IEBACiAKIAkJLyogUG9pbnRlciBtYXRjaGVzIHByb2Nlc3NvciBtb2RlLCBjb3B5IHRoZSB0YWJsZSB0byBhIG5ldyBidWZmZXIgKi8KIAotCQlmdWxsX3RhYmxlID0gQUNQSV9NRU1fQUxMT0NBVEUoaGVhZGVyLT5sZW5ndGgpOworCQlmdWxsX3RhYmxlID0gQUNQSV9BTExPQ0FURShoZWFkZXItPmxlbmd0aCk7CiAJCWlmICghZnVsbF90YWJsZSkgewogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSB0YWJsZSBtZW1vcnkgZm9yIFslNC40c10gbGVuZ3RoICVYIiwKQEAgLTM3NiwxMSArMzgzLDEyIEBACiAJICogVmFsaWRhdGUgY2hlY2tzdW0gZm9yIF9tb3N0XyB0YWJsZXMsCiAJICogZXZlbiB0aGUgb25lcyB3aG9zZSBzaWduYXR1cmUgd2UgZG9uJ3QgcmVjb2duaXplCiAJICovCi0JaWYgKHRhYmxlX2luZm8tPnR5cGUgIT0gQUNQSV9UQUJMRV9GQUNTKSB7CisJaWYgKHRhYmxlX2luZm8tPnR5cGUgIT0gQUNQSV9UQUJMRV9JRF9GQUNTKSB7CiAJCXN0YXR1cyA9IGFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKGZ1bGxfdGFibGUpOwogCiAjaWYgKCFBQ1BJX0NIRUNLU1VNX0FCT1JUKQogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwogCQkJLyogSWdub3JlIHRoZSBlcnJvciBpZiBjb25maWd1cmF0aW9uIHNheXMgc28gKi8KIAogCQkJc3RhdHVzID0gQUVfT0s7CkBAIC00MDksNyArNDE3LDcgQEAKICAqCiAgKiBQQVJBTUVURVJTOiAgdGFibGVfdHlwZSAgICAgIC0gb25lIG9mIHRoZSBkZWZpbmVkIHRhYmxlIHR5cGVzCiAgKiAgICAgICAgICAgICAgSW5zdGFuY2UgICAgICAgIC0gV2hpY2ggdGFibGUgb2YgdGhpcyB0eXBlCi0gKiAgICAgICAgICAgICAgdGFibGVfcHRyX2xvYyAgIC0gcG9pbnRlciB0byBsb2NhdGlvbiB0byBwbGFjZSB0aGUgcG9pbnRlciBmb3IKKyAqICAgICAgICAgICAgICByZXR1cm5fdGFibGUgICAgLSBwb2ludGVyIHRvIGxvY2F0aW9uIHRvIHBsYWNlIHRoZSBwb2ludGVyIGZvcgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMKQEAgLTQyMCw1NyArNDI4LDM0IEBACiAKIGFjcGlfc3RhdHVzCiBhY3BpX3RiX2dldF90YWJsZV9wdHIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCi0JCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqdGFibGVfcHRyX2xvYykKKwkJICAgICAgdTMyIGluc3RhbmNlLCBzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKipyZXR1cm5fdGFibGUpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIAl1MzIgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF90YWJsZV9wdHIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF90YWJsZV9wdHIpOwogCi0JaWYgKCFhY3BpX2dibF9EU0RUKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19BQ1BJX1RBQkxFUyk7Ci0JfQotCi0JaWYgKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX01BWCkgeworCWlmICh0YWJsZV90eXBlID4gQUNQSV9UQUJMRV9JRF9NQVgpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAotCS8qCi0JICogRm9yIGFsbCB0YWJsZSB0eXBlcyAoU2luZ2xlL011bHRpcGxlKSwgdGhlIGZpcnN0Ci0JICogaW5zdGFuY2UgaXMgYWx3YXlzIGluIHRoZSBsaXN0IGhlYWQuCi0JICovCi0JaWYgKGluc3RhbmNlID09IDEpIHsKLQkJLyogR2V0IHRoZSBmaXJzdCAqLwotCi0JCSp0YWJsZV9wdHJfbG9jID0gTlVMTDsKLQkJaWYgKGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLm5leHQpIHsKLQkJCSp0YWJsZV9wdHJfbG9jID0KLQkJCSAgICBhY3BpX2dibF90YWJsZV9saXN0c1t0YWJsZV90eXBlXS5uZXh0LT5wb2ludGVyOwotCQl9Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0JLyogQ2hlY2sgZm9yIGluc3RhbmNlIG91dCBvZiByYW5nZSAqLworCS8qIENoZWNrIGZvciBpbnN0YW5jZSBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGN1cnJlbnQgdGFibGUgY291bnQgKi8KIAogCWlmIChpbnN0YW5jZSA+IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW3RhYmxlX3R5cGVdLmNvdW50KSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT1RfRVhJU1QpOwogCX0KIAotCS8qIFdhbGsgdGhlIGxpc3QgdG8gZ2V0IHRoZSBkZXNpcmVkIHRhYmxlCi0JICogU2luY2UgdGhlIGlmIChJbnN0YW5jZSA9PSAxKSBjaGVjayBhYm92ZSBjaGVja2VkIGZvciB0aGUKLQkgKiBmaXJzdCB0YWJsZSwgc2V0dGluZyB0YWJsZV9kZXNjIGVxdWFsIHRvIHRoZSAuTmV4dCBtZW1iZXIKLQkgKiBpcyBhY3R1YWxseSBwb2ludGluZyB0byB0aGUgc2Vjb25kIHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQotCSAqIG5lZWQgdG8gd2FsayBmcm9tIHRoZSAybmQgdGFibGUgdW50aWwgd2UgcmVhY2ggdGhlIEluc3RhbmNlCi0JICogdGhhdCB0aGUgdXNlciBpcyBsb29raW5nIGZvciBhbmQgcmV0dXJuIGl0cyB0YWJsZSBwb2ludGVyLgorCS8qCisJICogV2FsayB0aGUgbGlzdCB0byBnZXQgdGhlIGRlc2lyZWQgdGFibGUKKwkgKiBOb3RlOiBJbnN0YW5jZSBpcyBvbmUtYmFzZWQKIAkgKi8KIAl0YWJsZV9kZXNjID0gYWNwaV9nYmxfdGFibGVfbGlzdHNbdGFibGVfdHlwZV0ubmV4dDsKLQlmb3IgKGkgPSAyOyBpIDwgaW5zdGFuY2U7IGkrKykgeworCWZvciAoaSA9IDE7IGkgPCBpbnN0YW5jZTsgaSsrKSB7CiAJCXRhYmxlX2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OwogCX0KIAogCS8qIFdlIGFyZSBub3cgcG9pbnRpbmcgdG8gdGhlIHJlcXVlc3RlZCB0YWJsZSdzIGRlc2NyaXB0b3IgKi8KIAotCSp0YWJsZV9wdHJfbG9jID0gdGFibGVfZGVzYy0+cG9pbnRlcjsKLQorCSpyZXR1cm5fdGFibGUgPSB0YWJsZV9kZXNjLT5wb2ludGVyOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiZ2V0YWxsLmMKaW5kZXggMTM0ZTVkYy4uYWQ5ODIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YmdldGFsbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJnZXRhbGwuYwpAQCAtNzcsNyArNzcsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgaGVhZGVyOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidGJfZ2V0X3ByaW1hcnlfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF9wcmltYXJ5X3RhYmxlKTsKIAogCS8qIElnbm9yZSBhIE5VTEwgYWRkcmVzcyBpbiB0aGUgUlNEVCAqLwogCkBAIC0xNDAsNyArMTQwLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyIGhlYWRlcjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJ0Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlIiwgc2lnbmF0dXJlKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1NUUih0Yl9nZXRfc2Vjb25kYXJ5X3RhYmxlLCBzaWduYXR1cmUpOwogCiAJLyogR2V0IHRoZSBoZWFkZXIgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHNpZ25hdHVyZSAqLwogCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogCS8qIFNpZ25hdHVyZSBtdXN0IG1hdGNoIHJlcXVlc3QgKi8KIAotCWlmIChBQ1BJX1NUUk5DTVAoaGVhZGVyLnNpZ25hdHVyZSwgc2lnbmF0dXJlLCBBQ1BJX05BTUVfU0laRSkpIHsKKwlpZiAoIUFDUElfQ09NUEFSRV9OQU1FKGhlYWRlci5zaWduYXR1cmUsIHNpZ25hdHVyZSkpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiSW5jb3JyZWN0IHRhYmxlIHNpZ25hdHVyZSAtIHdhbnRlZCBbJXNdIGZvdW5kIFslNC40c10iLAogCQkJICAgIHNpZ25hdHVyZSwgaGVhZGVyLnNpZ25hdHVyZSkpOwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOwogCXN0cnVjdCBhY3BpX3BvaW50ZXIgYWRkcmVzczsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2dldF9yZXF1aXJlZF90YWJsZXMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2dldF9yZXF1aXJlZF90YWJsZXMpOwogCiAJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiJWQgQUNQSSB0YWJsZXMgaW4gUlNEVFxuIiwKIAkJCSAgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudCkpOwpAQCAtMjIzLDYgKzIyMyw3IEBACiAJICogYW55IFNTRFRzLgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yc2R0X3RhYmxlX2NvdW50OyBpKyspIHsKKwogCQkvKiBHZXQgdGhlIHRhYmxlIGFkZHJlc3MgZnJvbSB0aGUgY29tbW9uIGludGVybmFsIFhTRFQgKi8KIAogCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPSBhY3BpX2dibF9YU0RULT50YWJsZV9vZmZzZXRfZW50cnlbaV07CkBAIC0zMDUsNiArMzA2LDYgQEAKIAogCS8qIEFsd2F5cyBkZWxldGUgdGhlIFJTRFAgbWFwcGluZywgd2UgYXJlIGRvbmUgd2l0aCBpdCAqLwogCi0JYWNwaV90Yl9kZWxldGVfdGFibGVzX2J5X3R5cGUoQUNQSV9UQUJMRV9SU0RQKTsKKwlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZShBQ1BJX1RBQkxFX0lEX1JTRFApOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ymluc3RhbC5jCmluZGV4IDdmZmQwZmQuLjdjYTJkZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJpbnN0YWwuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RiaW5zdGFsLmMKQEAgLTczLDE3ICs3MywxOCBAQAogewogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX21hdGNoX3NpZ25hdHVyZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfbWF0Y2hfc2lnbmF0dXJlKTsKIAogCS8qIFNlYXJjaCBmb3IgYSBzaWduYXR1cmUgbWF0Y2ggYW1vbmcgdGhlIGtub3duIHRhYmxlIHR5cGVzICovCiAKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0FDUElfVEFCTEVfVFlQRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAoQUNQSV9UQUJMRV9JRF9NQVggKyAxKTsgaSsrKSB7CiAJCWlmICghKGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uZmxhZ3MgJiBzZWFyY2hfdHlwZSkpIHsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKCFBQ1BJX1NUUk5DTVAoc2lnbmF0dXJlLCBhY3BpX2dibF90YWJsZV9kYXRhW2ldLnNpZ25hdHVyZSwKIAkJCQkgIGFjcGlfZ2JsX3RhYmxlX2RhdGFbaV0uc2lnX2xlbmd0aCkpIHsKKwogCQkJLyogRm91bmQgYSBzaWduYXR1cmUgbWF0Y2gsIHJldHVybiBpbmRleCBpZiByZXF1ZXN0ZWQgKi8KIAogCQkJaWYgKHRhYmxlX2luZm8pIHsKQEAgLTEyMiw3ICsxMjMsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2luc3RhbGxfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2luc3RhbGxfdGFibGUpOwogCiAJLyogTG9jayB0YWJsZXMgd2hpbGUgaW5zdGFsbGluZyAqLwogCkBAIC0xODcsNyArMTg4LDcgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlX2hlYWRlcjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9yZWNvZ25pemVfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX3JlY29nbml6ZV90YWJsZSk7CiAKIAkvKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgdGFibGUgcG9pbnRlciAqLwogCkBAIC0yMTgsNyArMjE5LDYgQEAKIAkvKiBSZXR1cm4gdGhlIHRhYmxlIHR5cGUgYW5kIGxlbmd0aCB2aWEgdGhlIGluZm8gc3RydWN0ICovCiAKIAl0YWJsZV9pbmZvLT5sZW5ndGggPSAoYWNwaV9zaXplKSB0YWJsZV9oZWFkZXItPmxlbmd0aDsKLQogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCkBAIC0yNDMsMTEgKzI0MywxMSBAQAogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoInRiX2luaXRfdGFibGVfZGVzY3JpcHRvciIsIHRhYmxlX3R5cGUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHRiX2luaXRfdGFibGVfZGVzY3JpcHRvciwgdGFibGVfdHlwZSk7CiAKIAkvKiBBbGxvY2F0ZSBhIGRlc2NyaXB0b3IgZm9yIHRoaXMgdGFibGUgKi8KIAotCXRhYmxlX2Rlc2MgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwl0YWJsZV9kZXNjID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKIAlpZiAoIXRhYmxlX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQpAQCAtMjc0LDcgKzI3NCw3IEBACiAJCSAqIGF0IHRoaXMgbG9jYXRpb24sIHNvIHJldHVybiBhbiBlcnJvci4KIAkJICovCiAJCWlmIChsaXN0X2hlYWQtPm5leHQpIHsKLQkJCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYyk7CisJCQlBQ1BJX0ZSRUUodGFibGVfZGVzYyk7CiAJCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQUxSRUFEWV9FWElTVFMpOwogCQl9CiAKQEAgLTMxMiwxNSArMzEyLDE0IEBACiAKIAkvKiBGaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlIGRlc2NyaXB0b3IgKi8KIAorCXRhYmxlX2Rlc2MtPmxvYWRlZF9pbnRvX25hbWVzcGFjZSA9IEZBTFNFOwogCXRhYmxlX2Rlc2MtPnR5cGUgPSAodTgpIHRhYmxlX3R5cGU7CiAJdGFibGVfZGVzYy0+cG9pbnRlciA9IHRhYmxlX2luZm8tPnBvaW50ZXI7CiAJdGFibGVfZGVzYy0+bGVuZ3RoID0gdGFibGVfaW5mby0+bGVuZ3RoOwogCXRhYmxlX2Rlc2MtPmFsbG9jYXRpb24gPSB0YWJsZV9pbmZvLT5hbGxvY2F0aW9uOwogCXRhYmxlX2Rlc2MtPmFtbF9zdGFydCA9ICh1OCAqKSAodGFibGVfZGVzYy0+cG9pbnRlciArIDEpLAotCSAgICB0YWJsZV9kZXNjLT5hbWxfbGVuZ3RoID0gKHUzMikgKHRhYmxlX2Rlc2MtPmxlbmd0aCAtCi0JCQkJCSAgICAodTMyKSBzaXplb2Yoc3RydWN0Ci0JCQkJCQkJIGFjcGlfdGFibGVfaGVhZGVyKSk7Ci0JdGFibGVfZGVzYy0+bG9hZGVkX2ludG9fbmFtZXNwYWNlID0gRkFMU0U7CisJICAgIHRhYmxlX2Rlc2MtPmFtbF9sZW5ndGggPSAodTMyKQorCSAgICAodGFibGVfZGVzYy0+bGVuZ3RoIC0gKHUzMikgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlcikpOwogCiAJLyoKIAkgKiBTZXQgdGhlIGFwcHJvcHJpYXRlIGdsb2JhbCBwb2ludGVyIChpZiB0aGVyZSBpcyBvbmUpIHRvIHBvaW50IHRvIHRoZQpAQCAtMzM1LDcgKzMzNCw2IEBACiAKIAl0YWJsZV9pbmZvLT5vd25lcl9pZCA9IHRhYmxlX2Rlc2MtPm93bmVyX2lkOwogCXRhYmxlX2luZm8tPmluc3RhbGxlZF9kZXNjID0gdGFibGVfZGVzYzsKLQogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKQEAgLTM1OSw3ICszNTcsNyBAQAogCSAqIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgQUNQSSB0YWJsZXMKIAkgKiBNZW1vcnkgY2FuIGVpdGhlciBiZSBtYXBwZWQgb3IgYWxsb2NhdGVkCiAJICovCi0JZm9yICh0eXBlID0gMDsgdHlwZSA8IE5VTV9BQ1BJX1RBQkxFX1RZUEVTOyB0eXBlKyspIHsKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgKEFDUElfVEFCTEVfSURfTUFYICsgMSk7IHR5cGUrKykgewogCQlhY3BpX3RiX2RlbGV0ZV90YWJsZXNfYnlfdHlwZSh0eXBlKTsKIAl9CiB9CkBAIC0zODMsOSArMzgxLDkgQEAKIAl1MzIgY291bnQ7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidGJfZGVsZXRlX3RhYmxlc19ieV90eXBlIiwgdHlwZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodGJfZGVsZXRlX3RhYmxlc19ieV90eXBlLCB0eXBlKTsKIAotCWlmICh0eXBlID4gQUNQSV9UQUJMRV9NQVgpIHsKKwlpZiAodHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKSB7CiAJCXJldHVybl9WT0lEOwogCX0KIApAQCAtMzk2LDI4ICszOTQsMjggQEAKIAkvKiBDbGVhciB0aGUgYXBwcm9wcmlhdGUgInR5cGVkIiBnbG9iYWwgdGFibGUgcG9pbnRlciAqLwogCiAJc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ1BJX1RBQkxFX1JTRFA6CisJY2FzZSBBQ1BJX1RBQkxFX0lEX1JTRFA6CiAJCWFjcGlfZ2JsX1JTRFAgPSBOVUxMOwogCQlicmVhazsKIAotCWNhc2UgQUNQSV9UQUJMRV9EU0RUOgorCWNhc2UgQUNQSV9UQUJMRV9JRF9EU0RUOgogCQlhY3BpX2dibF9EU0RUID0gTlVMTDsKIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfVEFCTEVfRkFEVDoKKwljYXNlIEFDUElfVEFCTEVfSURfRkFEVDoKIAkJYWNwaV9nYmxfRkFEVCA9IE5VTEw7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1RBQkxFX0ZBQ1M6CisJY2FzZSBBQ1BJX1RBQkxFX0lEX0ZBQ1M6CiAJCWFjcGlfZ2JsX0ZBQ1MgPSBOVUxMOwogCQlicmVhazsKIAotCWNhc2UgQUNQSV9UQUJMRV9YU0RUOgorCWNhc2UgQUNQSV9UQUJMRV9JRF9YU0RUOgogCQlhY3BpX2dibF9YU0RUID0gTlVMTDsKIAkJYnJlYWs7CiAKLQljYXNlIEFDUElfVEFCTEVfU1NEVDoKLQljYXNlIEFDUElfVEFCTEVfUFNEVDoKKwljYXNlIEFDUElfVEFCTEVfSURfU1NEVDoKKwljYXNlIEFDUElfVEFCTEVfSURfUFNEVDoKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC00NzEsNyArNDY5LDcgQEAKIAogCWNhc2UgQUNQSV9NRU1fQUxMT0NBVEVEOgogCi0JCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYy0+cG9pbnRlcik7CisJCUFDUElfRlJFRSh0YWJsZV9kZXNjLT5wb2ludGVyKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfTUVNX01BUFBFRDoKQEAgLTUwMyw3ICs1MDEsNyBAQAogewogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKm5leHRfZGVzYzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ0Yl91bmluc3RhbGxfdGFibGUiLCB0YWJsZV9kZXNjKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih0Yl91bmluc3RhbGxfdGFibGUsIHRhYmxlX2Rlc2MpOwogCiAJaWYgKCF0YWJsZV9kZXNjKSB7CiAJCXJldHVybl9QVFIoTlVMTCk7CkBAIC01MzAsNyArNTI4LDcgQEAKIAkvKiBGcmVlIHRoZSB0YWJsZSBkZXNjcmlwdG9yICovCiAKIAluZXh0X2Rlc2MgPSB0YWJsZV9kZXNjLT5uZXh0OwotCUFDUElfTUVNX0ZSRUUodGFibGVfZGVzYyk7CisJQUNQSV9GUkVFKHRhYmxlX2Rlc2MpOwogCiAJLyogUmV0dXJuIHBvaW50ZXIgdG8gdGhlIG5leHQgZGVzY3JpcHRvciAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnJzZHQuYwppbmRleCA0ZDMwODIyLi5hYmNiMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RicnNkdC5jCisrKyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJyc2R0LmMKQEAgLTY0LDcgKzY0LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IHJzZHBfZGVzY3JpcHRvciAqcnNkcDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX3ZlcmlmeV9yc2RwIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl92ZXJpZnlfcnNkcCk7CiAKIAlzd2l0Y2ggKGFkZHJlc3MtPnBvaW50ZXJfdHlwZSkgewogCWNhc2UgQUNQSV9MT0dJQ0FMX1BPSU5URVI6CkBAIC03OCw3ICs3OCw3IEBACiAJCSAqLwogCQlzdGF0dXMgPSBhY3BpX29zX21hcF9tZW1vcnkoYWRkcmVzcy0+cG9pbnRlci5waHlzaWNhbCwKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yKSwKLQkJCQkJICAgICh2b2lkICopJnJzZHApOworCQkJCQkgICAgQUNQSV9DQVNUX1BUUih2b2lkLCAmcnNkcCkpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CkBAIC05NSwxNSArOTUsMjAgQEAKIAkJZ290byBjbGVhbnVwOwogCX0KIAotCS8qIFRoZSBSU0RQIHN1cHBsaWVkIGlzIE9LICovCisJLyogUlNEUCBpcyBvay4gSW5pdCB0aGUgdGFibGUgaW5mbyAqLwogCiAJdGFibGVfaW5mby5wb2ludGVyID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsIHJzZHApOwogCXRhYmxlX2luZm8ubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IpOwotCXRhYmxlX2luZm8uYWxsb2NhdGlvbiA9IEFDUElfTUVNX01BUFBFRDsKKworCWlmIChhZGRyZXNzLT5wb2ludGVyX3R5cGUgPT0gQUNQSV9QSFlTSUNBTF9QT0lOVEVSKSB7CisJCXRhYmxlX2luZm8uYWxsb2NhdGlvbiA9IEFDUElfTUVNX01BUFBFRDsKKwl9IGVsc2UgeworCQl0YWJsZV9pbmZvLmFsbG9jYXRpb24gPSBBQ1BJX01FTV9OT1RfQUxMT0NBVEVEOworCX0KIAogCS8qIFNhdmUgdGhlIHRhYmxlIHBvaW50ZXJzIGFuZCBhbGxvY2F0aW9uIGluZm8gKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKEFDUElfVEFCTEVfUlNEUCwgJnRhYmxlX2luZm8pOworCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKEFDUElfVEFCTEVfSURfUlNEUCwgJnRhYmxlX2luZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTc0LDIyICsxNzksMjAgQEAKIAogYWNwaV9zdGF0dXMgYWNwaV90Yl92YWxpZGF0ZV9yc2R0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQogewotCWludCBub19tYXRjaDsKKwljaGFyICpzaWduYXR1cmU7CiAKIAlBQ1BJX0ZVTkNUSU9OX0VOVFJZKCk7CiAKLQkvKgotCSAqIFNlYXJjaCBmb3IgYXBwcm9wcmlhdGUgc2lnbmF0dXJlLCBSU0RUIG9yIFhTRFQKLQkgKi8KKwkvKiBTZWFyY2ggZm9yIGFwcHJvcHJpYXRlIHNpZ25hdHVyZSwgUlNEVCBvciBYU0RUICovCisKIAlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7Ci0JCW5vX21hdGNoID0gQUNQSV9TVFJOQ01QKChjaGFyICopdGFibGVfcHRyLCBSU0RUX1NJRywKLQkJCQkJc2l6ZW9mKFJTRFRfU0lHKSAtIDEpOworCQlzaWduYXR1cmUgPSBSU0RUX1NJRzsKIAl9IGVsc2UgewotCQlub19tYXRjaCA9IEFDUElfU1RSTkNNUCgoY2hhciAqKXRhYmxlX3B0ciwgWFNEVF9TSUcsCi0JCQkJCXNpemVvZihYU0RUX1NJRykgLSAxKTsKKwkJc2lnbmF0dXJlID0gWFNEVF9TSUc7CiAJfQogCi0JaWYgKG5vX21hdGNoKSB7CisJaWYgKCFBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZV9wdHItPnNpZ25hdHVyZSwgc2lnbmF0dXJlKSkgeworCiAJCS8qIEludmFsaWQgUlNEVCBvciBYU0RUIHNpZ25hdHVyZSAqLwogCiAJCUFDUElfRVJST1IoKEFFX0lORk8sCkBAIC0xOTgsMTAgKzIwMSw4IEBACiAJCUFDUElfRFVNUF9CVUZGRVIoYWNwaV9nYmxfUlNEUCwgMjApOwogCiAJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlJTRFQvWFNEVCBzaWduYXR1cmUgYXQgJVggKCVwKSBpcyBpbnZhbGlkIiwKLQkJCSAgICBhY3BpX2dibF9SU0RQLT5yc2R0X3BoeXNpY2FsX2FkZHJlc3MsCi0JCQkgICAgKHZvaWQgKikoYWNwaV9uYXRpdmVfdWludCkgYWNwaV9nYmxfUlNEUC0+Ci0JCQkgICAgcnNkdF9waHlzaWNhbF9hZGRyZXNzKSk7CisJCQkgICAgIlJTRFQvWFNEVCBzaWduYXR1cmUgYXQgJVggaXMgaW52YWxpZCIsCisJCQkgICAgYWNwaV9nYmxfUlNEUC0+cnNkdF9waHlzaWNhbF9hZGRyZXNzKSk7CiAKIAkJaWYgKGFjcGlfZ2JsX3Jvb3RfdGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1RZUEVfUlNEVCkgewogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkxvb2tpbmcgZm9yIFJTRFQiKSk7CkBAIC0yMzQsMTMgKzIzNSwxMyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV9wb2ludGVyIGFkZHJlc3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9nZXRfdGFibGVfcnNkdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZ2V0X3RhYmxlX3JzZHQpOwogCiAJLyogR2V0IHRoZSBSU0RUL1hTRFQgdmlhIHRoZSBSU0RQICovCiAKIAlhY3BpX3RiX2dldF9yc2R0X2FkZHJlc3MoJmFkZHJlc3MpOwogCi0JdGFibGVfaW5mby50eXBlID0gQUNQSV9UQUJMRV9YU0RUOworCXRhYmxlX2luZm8udHlwZSA9IEFDUElfVEFCTEVfSURfWFNEVDsKIAlzdGF0dXMgPSBhY3BpX3RiX2dldF90YWJsZSgmYWRkcmVzcywgJnRhYmxlX2luZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlBQ1BJX0VYQ0VQVElPTigoQUVfSU5GTywgc3RhdHVzLApAQCAtMjc0LDEyICsyNzUsMTMgQEAKIAogCS8qIFNhdmUgdGhlIHRhYmxlIHBvaW50ZXJzIGFuZCBhbGxvY2F0aW9uIGluZm8gKi8KIAotCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKEFDUElfVEFCTEVfWFNEVCwgJnRhYmxlX2luZm8pOworCXN0YXR1cyA9IGFjcGlfdGJfaW5pdF90YWJsZV9kZXNjcmlwdG9yKEFDUElfVEFCTEVfSURfWFNEVCwgJnRhYmxlX2luZm8pOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIAl9CiAKLQlhY3BpX2dibF9YU0RUID0gQUNQSV9DQVNUX1BUUihYU0RUX0RFU0NSSVBUT1IsIHRhYmxlX2luZm8ucG9pbnRlcik7CisJYWNwaV9nYmxfWFNEVCA9CisJICAgIEFDUElfQ0FTVF9QVFIoc3RydWN0IHhzZHRfZGVzY3JpcHRvciwgdGFibGVfaW5mby5wb2ludGVyKTsKIAogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlhTRFQgbG9jYXRlZCBhdCAlcFxuIiwgYWNwaV9nYmxfWFNEVCkpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnV0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwppbmRleCBiYzU3MTU5Li4yMDlhNDAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RidXRpbHMuYwpAQCAtNzEsNyArNzEsNyBAQAogewogCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9pc190YWJsZV9pbnN0YWxsZWQiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2lzX3RhYmxlX2luc3RhbGxlZCk7CiAKIAkvKiBHZXQgdGhlIGxpc3QgZGVzY3JpcHRvciBhbmQgZmlyc3QgdGFibGUgZGVzY3JpcHRvciAqLwogCkBAIC05NiwxMCArOTYsMTEgQEAKIAkJICAgICghQUNQSV9NRU1DTVAKIAkJICAgICAodGFibGVfZGVzYy0+cG9pbnRlciwgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXIsCiAJCSAgICAgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT5sZW5ndGgpKSkgeworCiAJCQkvKiBNYXRjaDogdGhpcyB0YWJsZSBpcyBhbHJlYWR5IGluc3RhbGxlZCAqLwogCiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1RBQkxFUywKLQkJCQkJICAiVGFibGUgWyU0LjRzXSBhbHJlYWR5IGluc3RhbGxlZDogUmV2ICVYIG9lbV90YWJsZV9pZCBbJTguOHNdXG4iLAorCQkJCQkgICJUYWJsZSBbJTQuNHNdIGFscmVhZHkgaW5zdGFsbGVkOiBSZXYgJVggT2VtVGFibGVJZCBbJTguOHNdXG4iLAogCQkJCQkgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT5zaWduYXR1cmUsCiAJCQkJCSAgbmV3X3RhYmxlX2Rlc2MtPnBvaW50ZXItPnJldmlzaW9uLAogCQkJCQkgIG5ld190YWJsZV9kZXNjLT5wb2ludGVyLT4KQEAgLTE1OSwxMiArMTYwLDggQEAKIAogCUFDUElfTU9WRV8zMl9UT18zMigmc2lnbmF0dXJlLCB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSk7CiAJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZShzaWduYXR1cmUpKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlRhYmxlIHNpZ25hdHVyZSBhdCAlcCBbJXBdIGhhcyBpbnZhbGlkIGNoYXJhY3RlcnMiLAotCQkJICAgIHRhYmxlX2hlYWRlciwgJnNpZ25hdHVyZSkpOwotCi0JCUFDUElfV0FSTklORygoQUVfSU5GTywgIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIGZvdW5kOiBbJTQuNHNdIiwKLQkJCSAgICAgIEFDUElfQ0FTVF9QVFIoY2hhciwgJnNpZ25hdHVyZSkpKTsKKwkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkludmFsaWQgdGFibGUgc2lnbmF0dXJlIDB4JTguOFgiLAorCQkJICAgIHNpZ25hdHVyZSkpOwogCiAJCUFDUElfRFVNUF9CVUZGRVIodGFibGVfaGVhZGVyLAogCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CkBAIC0xNzUsMTIgKzE3Miw5IEBACiAKIAlpZiAodGFibGVfaGVhZGVyLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJJbnZhbGlkIGxlbmd0aCBpbiB0YWJsZSBoZWFkZXIgJXAgbmFtZSAlNC40cyIsCi0JCQkgICAgdGFibGVfaGVhZGVyLCAoY2hhciAqKSZzaWduYXR1cmUpKTsKLQotCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiSW52YWxpZCB0YWJsZSBoZWFkZXIgbGVuZ3RoICgweCVYKSBmb3VuZCIsCi0JCQkgICAgICAodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCkpOworCQkJICAgICJJbnZhbGlkIGxlbmd0aCAweCVYIGluIHRhYmxlIHdpdGggc2lnbmF0dXJlICU0LjRzIiwKKwkJCSAgICAodTMyKSB0YWJsZV9oZWFkZXItPmxlbmd0aCwKKwkJCSAgICBBQ1BJX0NBU1RfUFRSKGNoYXIsICZzaWduYXR1cmUpKSk7CiAKIAkJQUNQSV9EVU1QX0JVRkZFUih0YWJsZV9oZWFkZXIsCiAJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIpKTsKQEAgLTE5Miw3MiArMTg2LDExOSBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bQorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc3VtX3RhYmxlCiAgKgotICogUEFSQU1FVEVSUzogICp0YWJsZV9oZWFkZXIgICAgICAgICAgIC0gQUNQSSB0YWJsZSB0byB2ZXJpZnkKKyAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgICAgIC0gQnVmZmVyIHRvIHN1bQorICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBidWZmZXIKICAqCi0gKiBSRVRVUk46ICAgICAgOCBiaXQgY2hlY2tzdW0gb2YgdGFibGUKKyAqIFJFVFVSTjogICAgICA4IGJpdCBzdW0gb2YgYnVmZmVyCiAgKgotICogREVTQ1JJUFRJT046IERvZXMgYW4gOCBiaXQgY2hlY2tzdW0gb2YgdGFibGUgYW5kIHJldHVybnMgc3RhdHVzLiAgQSBjb3JyZWN0Ci0gKiAgICAgICAgICAgICAgdGFibGUgc2hvdWxkIGhhdmUgYSBjaGVja3N1bSBvZiAwLgorICogREVTQ1JJUFRJT046IENvbXB1dGVzIGFuIDggYml0IHN1bSBvZiB0aGUgYnVmZmVyKGxlbmd0aCkgYW5kIHJldHVybnMgaXQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotYWNwaV9zdGF0dXMKLWFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqIHRhYmxlX2hlYWRlcikKK3U4IGFjcGlfdGJfc3VtX3RhYmxlKHZvaWQgKmJ1ZmZlciwgdTMyIGxlbmd0aCkKIHsKLQl1OCBjaGVja3N1bTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKKwlhY3BpX25hdGl2ZV91aW50IGk7CisJdTggc3VtID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX3ZlcmlmeV90YWJsZV9jaGVja3N1bSIpOwotCi0JLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gb24gdGhlIHRhYmxlICovCi0KLQljaGVja3N1bSA9Ci0JICAgIGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odGFibGVfaGVhZGVyLCB0YWJsZV9oZWFkZXItPmxlbmd0aCk7Ci0KLQkvKiBSZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiAqLwotCi0JaWYgKGNoZWNrc3VtKSB7Ci0JCUFDUElfV0FSTklORygoQUVfSU5GTywKLQkJCSAgICAgICJJbnZhbGlkIGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gKCUwMlgsIHN1bSAlMDJYIGlzIG5vdCB6ZXJvKSIsCi0JCQkgICAgICB0YWJsZV9oZWFkZXItPnNpZ25hdHVyZSwKLQkJCSAgICAgICh1MzIpIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sICh1MzIpIGNoZWNrc3VtKSk7Ci0KLQkJc3RhdHVzID0gQUVfQkFEX0NIRUNLU1VNOworCWlmICghYnVmZmVyIHx8ICFsZW5ndGgpIHsKKwkJcmV0dXJuICgwKTsKIAl9Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJc3VtID0gKHU4KSAoc3VtICsgKCh1OCAqKSBidWZmZXIpW2ldKTsKKwl9CisJcmV0dXJuIChzdW0pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtCiAgKgotICogUEFSQU1FVEVSUzogIEJ1ZmZlciAgICAgICAgICAgICAgLSBCdWZmZXIgdG8gY2hlY2tzdW0KLSAqICAgICAgICAgICAgICBMZW5ndGggICAgICAgICAgICAgIC0gU2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBQQVJBTUVURVJTOiAgVGFibGUgICAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSB2YWxpZCBBQ1BJIHRhYmxlICh3aXRoIGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgQUNQSSBoZWFkZXIpCiAgKgogICogUkVUVVJOOiAgICAgIDggYml0IGNoZWNrc3VtIG9mIGJ1ZmZlcgogICoKLSAqIERFU0NSSVBUSU9OOiBDb21wdXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0aGUgYnVmZmVyKGxlbmd0aCkgYW5kIHJldHVybnMgaXQuCisgKiBERVNDUklQVElPTjogQ29tcHV0ZXMgYW4gOCBiaXQgY2hlY2tzdW0gb2YgdGhlIHRhYmxlLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXU4IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odm9pZCAqYnVmZmVyLCB1MzIgbGVuZ3RoKQordTggYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKiB0YWJsZSkKIHsKLQl1OCAqZW5kX2J1ZmZlcjsKLQl1OCAqcm92ZXI7Ci0JdTggc3VtID0gMDsKKwl1OCBjaGVja3N1bTsKIAotCWlmIChidWZmZXIgJiYgbGVuZ3RoKSB7Ci0JCS8qICBCdWZmZXIgYW5kIExlbmd0aCBhcmUgdmFsaWQgICAqLworCS8qIFN1bSB0aGUgZW50aXJlIHRhYmxlIGFzLWlzICovCiAKLQkJZW5kX2J1ZmZlciA9IEFDUElfQUREX1BUUih1OCwgYnVmZmVyLCBsZW5ndGgpOworCWNoZWNrc3VtID0gYWNwaV90Yl9zdW1fdGFibGUodGFibGUsIHRhYmxlLT5sZW5ndGgpOwogCi0JCWZvciAocm92ZXIgPSBidWZmZXI7IHJvdmVyIDwgZW5kX2J1ZmZlcjsgcm92ZXIrKykgewotCQkJc3VtID0gKHU4KSAoc3VtICsgKnJvdmVyKTsKLQkJfQorCS8qIFN1YnRyYWN0IG9mZiB0aGUgZXhpc3RpbmcgY2hlY2tzdW0gdmFsdWUgaW4gdGhlIHRhYmxlICovCisKKwljaGVja3N1bSA9ICh1OCkgKGNoZWNrc3VtIC0gdGFibGUtPmNoZWNrc3VtKTsKKworCS8qIENvbXB1dGUgdGhlIGZpbmFsIGNoZWNrc3VtICovCisKKwljaGVja3N1bSA9ICh1OCkgKDAgLSBjaGVja3N1bSk7CisJcmV0dXJuIChjaGVja3N1bSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdGJfc2V0X2NoZWNrc3VtCisgKgorICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgdmFsaWQgQUNQSSB0YWJsZSAod2l0aCBhCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkIEFDUEkgaGVhZGVyKQorICoKKyAqIFJFVFVSTjogICAgICBOb25lLiBTZXRzIHRoZSB0YWJsZSBjaGVja3N1bSBmaWVsZAorICoKKyAqIERFU0NSSVBUSU9OOiBDb21wdXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0aGUgdGFibGUgYW5kIGluc2VydHMgdGhlCisgKiAgICAgICAgICAgICAgY2hlY2tzdW0gaW50byB0aGUgdGFibGUgaGVhZGVyLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYWNwaV90Yl9zZXRfY2hlY2tzdW0oc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKworCXRhYmxlLT5jaGVja3N1bSA9IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odGFibGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3ZlcmlmeV90YWJsZV9jaGVja3N1bQorICoKKyAqIFBBUkFNRVRFUlM6ICAqdGFibGVfaGVhZGVyICAgICAgICAgICAtIEFDUEkgdGFibGUgdG8gdmVyaWZ5CisgKgorICogUkVUVVJOOiAgICAgIDggYml0IGNoZWNrc3VtIG9mIHRhYmxlCisgKgorICogREVTQ1JJUFRJT046IEdlbmVyYXRlcyBhbiA4IGJpdCBjaGVja3N1bSBvZiB0YWJsZSBhbmQgcmV0dXJucyBhbmQgY29tcGFyZXMKKyAqICAgICAgICAgICAgICBpdCB0byB0aGUgZXhpc3RpbmcgY2hlY2tzdW0gdmFsdWUuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworYWNwaV9zdGF0dXMKK2FjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKQoreworCXU4IGNoZWNrc3VtOworCisJQUNQSV9GVU5DVElPTl9UUkFDRSh0Yl92ZXJpZnlfdGFibGVfY2hlY2tzdW0pOworCisJLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gb24gdGhlIHRhYmxlICovCisKKwljaGVja3N1bSA9IGFjcGlfdGJfZ2VuZXJhdGVfY2hlY2tzdW0odGFibGVfaGVhZGVyKTsKKworCS8qIENoZWNrc3VtIG9rPyAqLworCisJaWYgKGNoZWNrc3VtID09IHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9Ci0JcmV0dXJuIChzdW0pOworCisJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAorCQkgICAgICAiSW5jb3JyZWN0IGNoZWNrc3VtIGluIHRhYmxlIFslNC40c10gLSBpcyAlMi4yWCwgc2hvdWxkIGJlICUyLjJYIiwKKwkJICAgICAgdGFibGVfaGVhZGVyLT5zaWduYXR1cmUsIHRhYmxlX2hlYWRlci0+Y2hlY2tzdW0sCisJCSAgICAgIGNoZWNrc3VtKSk7CisKKwlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX0NIRUNLU1VNKTsKIH0KIAogI2lmZGVmIEFDUElfT0JTT0xFVEVfRlVOQ1RJT05TCkBAIC0yNzYsMTIgKzMxNywxMiBAQAogCiBhY3BpX3N0YXR1cwogYWNwaV90Yl9oYW5kbGVfdG9fb2JqZWN0KHUxNiB0YWJsZV9pZCwKLQkJCSBzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICoqIHJldHVybl90YWJsZV9kZXNjKQorCQkJIHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKipyZXR1cm5fdGFibGVfZGVzYykKIHsKIAl1MzIgaTsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJ0Yl9oYW5kbGVfdG9fb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9OQU1FKHRiX2hhbmRsZV90b19vYmplY3QpOwogCiAJZm9yIChpID0gMDsgaSA8IEFDUElfVEFCTEVfTUFYOyBpKyspIHsKIAkJdGFibGVfZGVzYyA9IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW2ldLm5leHQ7CkBAIC0yOTUsNyArMzM2LDcgQEAKIAkJfQogCX0KIAotCUFDUElfRVJST1IoKEFFX0lORk8sICJ0YWJsZV9pZD0lWCBkb2VzIG5vdCBleGlzdCIsIHRhYmxlX2lkKSk7CisJQUNQSV9FUlJPUigoQUVfSU5GTywgIlRhYmxlSWQ9JVggZG9lcyBub3QgZXhpc3QiLCB0YWJsZV9pZCkpOwogCXJldHVybiAoQUVfQkFEX1BBUkFNRVRFUik7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKaW5kZXggOWZlNTNjOS4uNGU5MWYyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMKQEAgLTQyLDggKzQyLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgpAQCAtNjgsNyArNjYsNyBAQAogCXN0cnVjdCBhY3BpX3BvaW50ZXIgcnNkcF9hZGRyZXNzOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfbG9hZF90YWJsZXMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfbG9hZF90YWJsZXMpOwogCiAJLyogR2V0IHRoZSBSU0RQICovCiAKQEAgLTEyMyw2ICsxMjEsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9sb2FkX3RhYmxlcykKKwogI2lmZGVmIEFDUElfRlVUVVJFX1VTQUdFCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTEzOSwxNCArMTM5LDEzIEBACiAgKiAgICAgICAgICAgICAgaXMgZGV0ZXJtaW5lZCB0aGF0IHRoZSB0YWJsZSBpcyBpbnZhbGlkLCB0aGUgY2FsbCB3aWxsIGZhaWwuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9sb2FkX3RhYmxlKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfcHRyKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjIHRhYmxlX2luZm87CiAJc3RydWN0IGFjcGlfcG9pbnRlciBhZGRyZXNzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9sb2FkX3RhYmxlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2xvYWRfdGFibGUpOwogCiAJaWYgKCF0YWJsZV9wdHIpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMTc0LDYgKzE3Myw3IEBACiAJc3RhdHVzID0gYWNwaV90Yl9pbnN0YWxsX3RhYmxlKCZ0YWJsZV9pbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9BTFJFQURZX0VYSVNUUykgeworCiAJCQkvKiBUYWJsZSBhbHJlYWR5IGV4aXN0cywgbm8gZXJyb3IgKi8KIAogCQkJc3RhdHVzID0gQUVfT0s7CkBAIC0xODgsMTIgKzE4OCwxMiBAQAogCS8qIENvbnZlcnQgdGhlIHRhYmxlIHRvIGNvbW1vbiBmb3JtYXQgaWYgbmVjZXNzYXJ5ICovCiAKIAlzd2l0Y2ggKHRhYmxlX2luZm8udHlwZSkgewotCWNhc2UgQUNQSV9UQUJMRV9GQURUOgorCWNhc2UgQUNQSV9UQUJMRV9JRF9GQURUOgogCiAJCXN0YXR1cyA9IGFjcGlfdGJfY29udmVydF90YWJsZV9mYWR0KCk7CiAJCWJyZWFrOwogCi0JY2FzZSBBQ1BJX1RBQkxFX0ZBQ1M6CisJY2FzZSBBQ1BJX1RBQkxFX0lEX0ZBQ1M6CiAKIAkJc3RhdHVzID0gYWNwaV90Yl9idWlsZF9jb21tb25fZmFjcygmdGFibGVfaW5mbyk7CiAJCWJyZWFrOwpAQCAtMjA4LDYgKzIwOCw3IEBACiAJfQogCiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisKIAkJLyogVW5pbnN0YWxsIHRhYmxlIGFuZCBmcmVlIHRoZSBidWZmZXIgKi8KIAogCQkodm9pZClhY3BpX3RiX3VuaW5zdGFsbF90YWJsZSh0YWJsZV9pbmZvLmluc3RhbGxlZF9kZXNjKTsKQEAgLTIxNiw2ICsyMTcsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9sb2FkX3RhYmxlKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3VubG9hZF90YWJsZQpAQCAtMjI3LDE2ICsyMzAsMTUgQEAKICAqIERFU0NSSVBUSU9OOiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBmb3JjZSB0aGUgdW5sb2FkIG9mIGEgdGFibGUKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX3VubG9hZF90YWJsZShhY3BpX3RhYmxlX3R5cGUgdGFibGVfdHlwZSkKIHsKIAlzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjICp0YWJsZV9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV91bmxvYWRfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfdW5sb2FkX3RhYmxlKTsKIAogCS8qIFBhcmFtZXRlciB2YWxpZGF0aW9uICovCiAKLQlpZiAodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSB7CisJaWYgKHRhYmxlX3R5cGUgPiBBQ1BJX1RBQkxFX0lEX01BWCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC0yNjEsNiArMjYzLDggQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91bmxvYWRfdGFibGUpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZ2V0X3RhYmxlX2hlYWRlcgpAQCAtMjgxLDcgKzI4NSw2IEBACiAgKiAgICAgICAgICAgICAgaGF2ZSBhIHN0YW5kYXJkIGhlYWRlciBhbmQgaXMgZml4ZWQgbGVuZ3RoLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzCiBhY3BpX2dldF90YWJsZV9oZWFkZXIoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCiAJCSAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICpvdXRfdGFibGVfaGVhZGVyKQpAQCAtMjg5LDE2ICsyOTIsMTYgQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRibF9wdHI7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfdGFibGVfaGVhZGVyIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2dldF90YWJsZV9oZWFkZXIpOwogCiAJaWYgKChpbnN0YW5jZSA9PSAwKSB8fAotCSAgICAodGFibGVfdHlwZSA9PSBBQ1BJX1RBQkxFX1JTRFApIHx8ICghb3V0X3RhYmxlX2hlYWRlcikpIHsKKwkgICAgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9JRF9SU0RQKSB8fCAoIW91dF90YWJsZV9oZWFkZXIpKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKIAkvKiBDaGVjayB0aGUgdGFibGUgdHlwZSBhbmQgaW5zdGFuY2UgKi8KIAotCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSB8fAorCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKSB8fAogCSAgICAoQUNQSV9JU19TSU5HTEVfVEFCTEUoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKIAkgICAgIGluc3RhbmNlID4gMSkpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMzI1LDYgKzMyOCw3IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZV9oZWFkZXIpCiAjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzQ5LDcgKzM1Myw2IEBACiAgKiAgICAgICAgICAgICAgYSBjb21wbGV0ZSB0YWJsZSBpbmNsdWRpbmcgdGhlIGhlYWRlci4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cwogYWNwaV9nZXRfdGFibGUoYWNwaV90YWJsZV90eXBlIHRhYmxlX3R5cGUsCiAJICAgICAgIHUzMiBpbnN0YW5jZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKQpAQCAtMzU4LDcgKzM2MSw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCWFjcGlfc2l6ZSB0YWJsZV9sZW5ndGg7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF90YWJsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfdGFibGUpOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtMzczLDcgKzM3Niw3IEBACiAKIAkvKiBDaGVjayB0aGUgdGFibGUgdHlwZSBhbmQgaW5zdGFuY2UgKi8KIAotCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfTUFYKSB8fAorCWlmICgodGFibGVfdHlwZSA+IEFDUElfVEFCTEVfSURfTUFYKSB8fAogCSAgICAoQUNQSV9JU19TSU5HTEVfVEFCTEUoYWNwaV9nYmxfdGFibGVfZGF0YVt0YWJsZV90eXBlXS5mbGFncykgJiYKIAkgICAgIGluc3RhbmNlID4gMSkpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwpAQCAtMzk2LDcgKzM5OSw4IEBACiAKIAkvKiBHZXQgdGhlIHRhYmxlIGxlbmd0aCAqLwogCi0JaWYgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9SU0RQKSB7CisJaWYgKHRhYmxlX3R5cGUgPT0gQUNQSV9UQUJMRV9JRF9SU0RQKSB7CisKIAkJLyogUlNEIFBUUiBpcyB0aGUgb25seSAidGFibGUiIHdpdGhvdXQgYSBoZWFkZXIgKi8KIAogCQl0YWJsZV9sZW5ndGggPSBzaXplb2Yoc3RydWN0IHJzZHBfZGVzY3JpcHRvcik7CkBAIC00MTcsNCArNDIxLDQgQEAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3RhYmxlKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF90YWJsZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMvdGJ4ZnJvb3QuYwppbmRleCBhNjJkYjZhLi5kYTI2NDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZyb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy90Ynhmcm9vdC5jCkBAIC00MSw4ICs0MSw2IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCiAjaW5jbHVkZSA8YWNwaS9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3RhYmxlcy5oPgogCkBAIC03NSw2ICs3Myw3IEBACiAJICogIFRoZSBzaWduYXR1cmUgYW5kIGNoZWNrc3VtIG11c3QgYm90aCBiZSBjb3JyZWN0CiAJICovCiAJaWYgKEFDUElfU1RSTkNNUCgoY2hhciAqKXJzZHAsIFJTRFBfU0lHLCBzaXplb2YoUlNEUF9TSUcpIC0gMSkgIT0gMCkgeworCiAJCS8qIE5vcGUsIEJBRCBTaWduYXR1cmUgKi8KIAogCQlyZXR1cm4gKEFFX0JBRF9TSUdOQVRVUkUpOwpAQCAtODIsMTUgKzgxLDE0IEBACiAKIAkvKiBDaGVjayB0aGUgc3RhbmRhcmQgY2hlY2tzdW0gKi8KIAotCWlmIChhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHJzZHAsIEFDUElfUlNEUF9DSEVDS1NVTV9MRU5HVEgpICE9IDApIHsKKwlpZiAoYWNwaV90Yl9zdW1fdGFibGUocnNkcCwgQUNQSV9SU0RQX0NIRUNLU1VNX0xFTkdUSCkgIT0gMCkgewogCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CiAJfQogCiAJLyogQ2hlY2sgZXh0ZW5kZWQgY2hlY2tzdW0gaWYgdGFibGUgdmVyc2lvbiA+PSAyICovCiAKIAlpZiAoKHJzZHAtPnJldmlzaW9uID49IDIpICYmCi0JICAgIChhY3BpX3RiX2dlbmVyYXRlX2NoZWNrc3VtKHJzZHAsIEFDUElfUlNEUF9YQ0hFQ0tTVU1fTEVOR1RIKSAhPQotCSAgICAgMCkpIHsKKwkgICAgKGFjcGlfdGJfc3VtX3RhYmxlKHJzZHAsIEFDUElfUlNEUF9YQ0hFQ0tTVU1fTEVOR1RIKSAhPSAwKSkgewogCQlyZXR1cm4gKEFFX0JBRF9DSEVDS1NVTSk7CiAJfQogCkBAIC0xMjEsNyArMTE5LDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2ZpbmRfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHRiX2ZpbmRfdGFibGUpOwogCiAJLyogVmFsaWRhdGUgc3RyaW5nIGxlbmd0aHMgKi8KIApAQCAtMTMxLDcgKzEyOSw3IEBACiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfU1RSSU5HX0xJTUlUKTsKIAl9CiAKLQlpZiAoIUFDUElfU1RSTkNNUChzaWduYXR1cmUsIERTRFRfU0lHLCBBQ1BJX05BTUVfU0laRSkpIHsKKwlpZiAoQUNQSV9DT01QQVJFX05BTUUoc2lnbmF0dXJlLCBEU0RUX1NJRykpIHsKIAkJLyoKIAkJICogVGhlIERTRFQgcG9pbnRlciBpcyBjb250YWluZWQgaW4gdGhlIEZBRFQsIG5vdCB0aGUgUlNEVC4KIAkJICogVGhpcyBjb2RlIHNob3VsZCBzdWZmaWNlLCBiZWNhdXNlIHRoZSBvbmx5IGNvZGUgdGhhdCB3b3VsZCBwZXJmb3JtCkBAIC0xNTYsMTAgKzE1NCwxMiBAQAogCiAJLyogQ2hlY2sgb2VtX2lkIGFuZCBvZW1fdGFibGVfaWQgKi8KIAotCWlmICgob2VtX2lkWzBdICYmIEFDUElfU1RSTkNNUChvZW1faWQsIHRhYmxlLT5vZW1faWQsCi0JCQkJICAgICAgIHNpemVvZih0YWJsZS0+b2VtX2lkKSkpIHx8Ci0JICAgIChvZW1fdGFibGVfaWRbMF0gJiYgQUNQSV9TVFJOQ01QKG9lbV90YWJsZV9pZCwgdGFibGUtPm9lbV90YWJsZV9pZCwKLQkJCQkJICAgICBzaXplb2YodGFibGUtPm9lbV90YWJsZV9pZCkpKSkgeworCWlmICgob2VtX2lkWzBdICYmCisJICAgICBBQ1BJX1NUUk5DTVAob2VtX2lkLCB0YWJsZS0+b2VtX2lkLAorCQkJICBzaXplb2YodGFibGUtPm9lbV9pZCkpKSB8fAorCSAgICAob2VtX3RhYmxlX2lkWzBdICYmCisJICAgICBBQ1BJX1NUUk5DTVAob2VtX3RhYmxlX2lkLCB0YWJsZS0+b2VtX3RhYmxlX2lkLAorCQkJICBzaXplb2YodGFibGUtPm9lbV90YWJsZV9pZCkpKSkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05BTUVfTk9UX0ZPVU5EKTsKIAl9CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCXUzMiBpOwogCXUzMiBqOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgiYWNwaV9nZXRfZmlybXdhcmVfdGFibGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKTsKIAogCS8qCiAJICogRW5zdXJlIHRoYXQgYXQgbGVhc3QgdGhlIHRhYmxlIG1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuICBXZSBkb24ndApAQCAtMjE3LDYgKzIxNyw3IEBACiAJLyogRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIFJTRFAgKi8KIAogCWlmICghYWNwaV9nYmxfUlNEUCkgeworCiAJCS8qIEdldCB0aGUgUlNEUCAqLwogCiAJCXN0YXR1cyA9IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcihmbGFncywgJmFkZHJlc3MpOwpAQCAtMjYxLDcgKzI2Miw3IEBACiAKIAkvKiBHZXQgYW5kIHZhbGlkYXRlIHRoZSBSU0RUICovCiAKLQlyc2R0X2luZm8gPSBBQ1BJX01FTV9DQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKKwlyc2R0X2luZm8gPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfZGVzYykpOwogCWlmICghcnNkdF9pbmZvKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9OT19NRU1PUlkpOwogCX0KQEAgLTI3OCwxMyArMjc5LDEzIEBACiAKIAkvKiBBbGxvY2F0ZSBhIHNjcmF0Y2ggdGFibGUgaGVhZGVyIGFuZCB0YWJsZSBkZXNjcmlwdG9yICovCiAKLQloZWFkZXIgPSBBQ1BJX01FTV9BTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CisJaGVhZGVyID0gQUNQSV9BTExPQ0FURShzaXplb2Yoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyKSk7CiAJaWYgKCFoZWFkZXIpIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JdGFibGVfaW5mbyA9IEFDUElfTUVNX0FMTE9DQVRFKHNpemVvZihzdHJ1Y3QgYWNwaV90YWJsZV9kZXNjKSk7CisJdGFibGVfaW5mbyA9IEFDUElfQUxMT0NBVEUoc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MpKTsKIAlpZiAoIXRhYmxlX2luZm8pIHsKIAkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQlnb3RvIGNsZWFudXA7CkBAIC0zMDgsMTIgKzMwOSwxMiBAQAogCQlpZiAoYWNwaV9nYmxfcm9vdF90YWJsZV90eXBlID09IEFDUElfVEFCTEVfVFlQRV9SU0RUKSB7CiAJCQlhZGRyZXNzLnBvaW50ZXIudmFsdWUgPQogCQkJICAgIChBQ1BJX0NBU1RfUFRSCi0JCQkgICAgIChSU0RUX0RFU0NSSVBUT1IsCisJCQkgICAgIChzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yLAogCQkJICAgICAgcnNkdF9pbmZvLT5wb2ludGVyKSktPnRhYmxlX29mZnNldF9lbnRyeVtpXTsKIAkJfSBlbHNlIHsKIAkJCWFkZHJlc3MucG9pbnRlci52YWx1ZSA9CiAJCQkgICAgKEFDUElfQ0FTVF9QVFIKLQkJCSAgICAgKFhTRFRfREVTQ1JJUFRPUiwKKwkJCSAgICAgKHN0cnVjdCB4c2R0X2Rlc2NyaXB0b3IsCiAJCQkgICAgICByc2R0X2luZm8tPnBvaW50ZXIpKS0+dGFibGVfb2Zmc2V0X2VudHJ5W2ldOwogCQl9CiAKQEAgLTMyNiwxMSArMzI3LDEzIEBACiAKIAkJLyogQ29tcGFyZSB0YWJsZSBzaWduYXR1cmVzIGFuZCB0YWJsZSBpbnN0YW5jZSAqLwogCi0JCWlmICghQUNQSV9TVFJOQ01QKGhlYWRlci0+c2lnbmF0dXJlLCBzaWduYXR1cmUsIEFDUElfTkFNRV9TSVpFKSkgeworCQlpZiAoQUNQSV9DT01QQVJFX05BTUUoaGVhZGVyLT5zaWduYXR1cmUsIHNpZ25hdHVyZSkpIHsKKwogCQkJLyogQW4gaW5zdGFuY2Ugb2YgdGhlIHRhYmxlIHdhcyBmb3VuZCAqLwogCiAJCQlqKys7CiAJCQlpZiAoaiA+PSBpbnN0YW5jZSkgeworCiAJCQkJLyogRm91bmQgdGhlIGNvcnJlY3QgaW5zdGFuY2UsIGdldCB0aGUgZW50aXJlIHRhYmxlICovCiAKIAkJCQlzdGF0dXMgPQpAQCAtMzU1LDIzICszNTgsMjEgQEAKIAkJYWNwaV9vc191bm1hcF9tZW1vcnkocnNkdF9pbmZvLT5wb2ludGVyLAogCQkJCSAgICAgKGFjcGlfc2l6ZSkgcnNkdF9pbmZvLT5wb2ludGVyLT5sZW5ndGgpOwogCX0KLQlBQ1BJX01FTV9GUkVFKHJzZHRfaW5mbyk7CisJQUNQSV9GUkVFKHJzZHRfaW5mbyk7CiAKIAlpZiAoaGVhZGVyKSB7Ci0JCUFDUElfTUVNX0ZSRUUoaGVhZGVyKTsKKwkJQUNQSV9GUkVFKGhlYWRlcik7CiAJfQogCWlmICh0YWJsZV9pbmZvKSB7Ci0JCUFDUElfTUVNX0ZSRUUodGFibGVfaW5mbyk7CisJCUFDUElfRlJFRSh0YWJsZV9pbmZvKTsKIAl9CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV9nZXRfZmlybXdhcmVfdGFibGUpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X2Zpcm13YXJlX3RhYmxlKQogCiAvKiBUQkQ6IE1vdmUgdG8gYSBuZXcgZmlsZSAqLwotCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIICE9IDE2Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfZmluZF9yb290X3BvaW50ZXIKQEAgLTM4NCwxMyArMzg1LDEyIEBACiAgKiBERVNDUklQVElPTjogRmluZCB0aGUgUlNEUAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfZmluZF9yb290X3BvaW50ZXIodTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9wb2ludGVyICpyc2RwX2FkZHJlc3MpCiB7CiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyB0YWJsZV9pbmZvOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZmluZF9yb290X3BvaW50ZXIiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfZmluZF9yb290X3BvaW50ZXIpOwogCiAJLyogR2V0IHRoZSBSU0RQICovCiAKQEAgLTQwNyw2ICs0MDcsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2ZpbmRfcm9vdF9wb2ludGVyKQorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwCkBAIC00MTksMTQgKzQyMSwxMyBAQAogICogREVTQ1JJUFRJT046IFNlYXJjaCBhIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlIFJTRFAgc2lnbmF0dXJlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogc3RhdGljIHU4ICphY3BpX3RiX3NjYW5fbWVtb3J5X2Zvcl9yc2RwKHU4ICogc3RhcnRfYWRkcmVzcywgdTMyIGxlbmd0aCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTggKm1lbV9yb3ZlcjsKIAl1OCAqZW5kX2FkZHJlc3M7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ0Yl9zY2FuX21lbW9yeV9mb3JfcnNkcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfc2Nhbl9tZW1vcnlfZm9yX3JzZHApOwogCiAJZW5kX2FkZHJlc3MgPSBzdGFydF9hZGRyZXNzICsgbGVuZ3RoOwogCkBAIC00MzQsMTIgKzQzNSwxNCBAQAogCiAJZm9yIChtZW1fcm92ZXIgPSBzdGFydF9hZGRyZXNzOyBtZW1fcm92ZXIgPCBlbmRfYWRkcmVzczsKIAkgICAgIG1lbV9yb3ZlciArPSBBQ1BJX1JTRFBfU0NBTl9TVEVQKSB7CisKIAkJLyogVGhlIFJTRFAgc2lnbmF0dXJlIGFuZCBjaGVja3N1bSBtdXN0IGJvdGggYmUgY29ycmVjdCAqLwogCiAJCXN0YXR1cyA9CiAJCSAgICBhY3BpX3RiX3ZhbGlkYXRlX3JzZHAoQUNQSV9DQVNUX1BUUgogCQkJCQkgIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLCBtZW1fcm92ZXIpKTsKIAkJaWYgKEFDUElfU1VDQ0VTUyhzdGF0dXMpKSB7CisKIAkJCS8qIFNpZyBhbmQgY2hlY2tzdW0gdmFsaWQsIHdlIGhhdmUgZm91bmQgYSByZWFsIFJTRFAgKi8KIAogCQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLApAQCAtNDY5LDEwICs0NzIsMTAgQEAKICAqCiAgKiBSRVRVUk46ICAgICAgU3RhdHVzLCBSU0RQIHBoeXNpY2FsIGFkZHJlc3MKICAqCi0gKiBERVNDUklQVElPTjogc2VhcmNoIGxvd2VyIDFfbWJ5dGUgb2YgbWVtb3J5IGZvciB0aGUgcm9vdCBzeXN0ZW0gZGVzY3JpcHRvcgorICogREVTQ1JJUFRJT046IFNlYXJjaCBsb3dlciAxX21ieXRlIG9mIG1lbW9yeSBmb3IgdGhlIHJvb3Qgc3lzdGVtIGRlc2NyaXB0b3IKICAqICAgICAgICAgICAgICBwb2ludGVyIHN0cnVjdHVyZS4gIElmIGl0IGlzIGZvdW5kLCBzZXQgKlJTRFAgdG8gcG9pbnQgdG8gaXQuCiAgKgotICogICAgICAgICAgICAgIE5PVEUxOiBUaGUgUlNEcCBtdXN0IGJlIGVpdGhlciBpbiB0aGUgZmlyc3QgMV9rIG9mIHRoZSBFeHRlbmRlZAorICogICAgICAgICAgICAgIE5PVEUxOiBUaGUgUlNEUCBtdXN0IGJlIGVpdGhlciBpbiB0aGUgZmlyc3QgMV9rIG9mIHRoZSBFeHRlbmRlZAogICogICAgICAgICAgICAgIEJJT1MgRGF0YSBBcmVhIG9yIGJldHdlZW4gRTAwMDAgYW5kIEZGRkZGIChGcm9tIEFDUEkgU3BlYy4pCiAgKiAgICAgICAgICAgICAgT25seSBhIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIGlzIG5lY2Vzc2FyeS4KICAqCkBAIC00ODksMTIgKzQ5MiwxMyBAQAogCXUzMiBwaHlzaWNhbF9hZGRyZXNzOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInRiX2ZpbmRfcnNkcCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodGJfZmluZF9yc2RwKTsKIAogCS8qCiAJICogU2NhbiBzdXBwb3J0cyBlaXRoZXIgbG9naWNhbCBhZGRyZXNzaW5nIG9yIHBoeXNpY2FsIGFkZHJlc3NpbmcKIAkgKi8KIAlpZiAoKGZsYWdzICYgQUNQSV9NRU1PUllfTU9ERSkgPT0gQUNQSV9MT0dJQ0FMX0FERFJFU1NJTkcpIHsKKwogCQkvKiAxYSkgR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgRXh0ZW5kZWQgQklPUyBEYXRhIEFyZWEgKEVCREEpICovCiAKIAkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCkBAIC01MjEsNyArNTI1LDcgQEAKIAogCQlpZiAocGh5c2ljYWxfYWRkcmVzcyA+IDB4NDAwKSB7CiAJCQkvKgotCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYQorCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCREEgaXMgcmVxdWlyZWQgdG8gYmUgYQogCQkJICogICAgIG1pbmltdW0gb2YgMV9rIGxlbmd0aCkKIAkJCSAqLwogCQkJc3RhdHVzID0gYWNwaV9vc19tYXBfbWVtb3J5KChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpCkBAIC01NDIsMTAgKzU0NiwxMSBAQAogCQkJYWNwaV9vc191bm1hcF9tZW1vcnkodGFibGVfcHRyLCBBQ1BJX0VCREFfV0lORE9XX1NJWkUpOwogCiAJCQlpZiAobWVtX3JvdmVyKSB7CisKIAkJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAogCQkJCXBoeXNpY2FsX2FkZHJlc3MgKz0KLQkJCQkgICAgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsIHRhYmxlX3B0cik7CisJCQkJICAgICh1MzIpIEFDUElfUFRSX0RJRkYobWVtX3JvdmVyLCB0YWJsZV9wdHIpOwogCiAJCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CiAJCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CkBAIC01NzYsMTEgKzU4MSwxMiBAQAogCQlhY3BpX29zX3VubWFwX21lbW9yeSh0YWJsZV9wdHIsIEFDUElfSElfUlNEUF9XSU5ET1dfU0laRSk7CiAKIAkJaWYgKG1lbV9yb3ZlcikgeworCiAJCQkvKiBSZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAotCQkJcGh5c2ljYWxfYWRkcmVzcyA9Ci0JCQkgICAgQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFICsgQUNQSV9QVFJfRElGRihtZW1fcm92ZXIsCi0JCQkJCQkJCSAgICAgdGFibGVfcHRyKTsKKwkJCXBoeXNpY2FsX2FkZHJlc3MgPSAodTMyKQorCQkJICAgIChBQ1BJX0hJX1JTRFBfV0lORE9XX0JBU0UgKworCQkJICAgICBBQ1BJX1BUUl9ESUZGKG1lbV9yb3ZlciwgdGFibGVfcHRyKSk7CiAKIAkJCXRhYmxlX2luZm8tPnBoeXNpY2FsX2FkZHJlc3MgPQogCQkJICAgIChhY3BpX3BoeXNpY2FsX2FkZHJlc3MpIHBoeXNpY2FsX2FkZHJlc3M7CkBAIC02MDEsNyArNjA3LDcgQEAKIAogCQlpZiAocGh5c2ljYWxfYWRkcmVzcyA+IDB4NDAwKSB7CiAJCQkvKgotCQkJICogMWIpIFNlYXJjaCBFQkRBIHBhcmFncmFwaHMgKEVCRGEgaXMgcmVxdWlyZWQgdG8gYmUgYSBtaW5pbXVtIG9mCisJCQkgKiAxYikgU2VhcmNoIEVCREEgcGFyYWdyYXBocyAoRUJEQSBpcyByZXF1aXJlZCB0byBiZSBhIG1pbmltdW0gb2YKIAkJCSAqICAgICAxX2sgbGVuZ3RoKQogCQkJICovCiAJCQltZW1fcm92ZXIgPQpAQCAtNjA5LDYgKzYxNSw3IEBACiAJCQkJCQkJIChwaHlzaWNhbF9hZGRyZXNzKSwKIAkJCQkJCQkgQUNQSV9FQkRBX1dJTkRPV19TSVpFKTsKIAkJCWlmIChtZW1fcm92ZXIpIHsKKwogCQkJCS8qIFJldHVybiB0aGUgcGh5c2ljYWwgYWRkcmVzcyAqLwogCiAJCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CkBAIC02MjQsNiArNjMxLDcgQEAKIAkJCQkJCSAoQUNQSV9ISV9SU0RQX1dJTkRPV19CQVNFKSwKIAkJCQkJCSBBQ1BJX0hJX1JTRFBfV0lORE9XX1NJWkUpOwogCQlpZiAobWVtX3JvdmVyKSB7CisKIAkJCS8qIEZvdW5kIGl0LCByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3MgKi8KIAogCQkJdGFibGVfaW5mby0+cGh5c2ljYWxfYWRkcmVzcyA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCAxOWYzZWE0Li5lN2ZlM2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTgyLDYgKzgyLDcgQEAKIAogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV90aGVybWFsX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfc3RhdGVfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGFjcGlfdGhlcm1hbF90ZW1wX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBhY3BpX3RoZXJtYWxfdHJpcF9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKQEAgLTEwMyw2ICsxMDQsNyBAQAogCS5vcHMgPSB7CiAJCS5hZGQgPSBhY3BpX3RoZXJtYWxfYWRkLAogCQkucmVtb3ZlID0gYWNwaV90aGVybWFsX3JlbW92ZSwKKwkJLnJlc3VtZSA9IGFjcGlfdGhlcm1hbF9yZXN1bWUsCiAJCX0sCiB9OwogCkBAIC02ODQsOCArNjg2LDcgQEAKIHsKIAlzdHJ1Y3QgYWNwaV90aGVybWFsICp0eiA9IChzdHJ1Y3QgYWNwaV90aGVybWFsICopZGF0YTsKIAlpZiAoIXR6LT56b21iaWUpCi0JCWFjcGlfb3NfcXVldWVfZm9yX2V4ZWN1dGlvbihPU0RfUFJJT1JJVFlfR1BFLAotCQkJCQkgICAgYWNwaV90aGVybWFsX2NoZWNrLCAodm9pZCAqKWRhdGEpOworCQlhY3BpX29zX2V4ZWN1dGUoT1NMX0dQRV9IQU5ETEVSLCBhY3BpX3RoZXJtYWxfY2hlY2ssICh2b2lkICopZGF0YSk7CiB9CiAKIHN0YXRpYyB2b2lkIGFjcGlfdGhlcm1hbF9jaGVjayh2b2lkICpkYXRhKQpAQCAtOTQyLDggKzk0MywxMCBAQAogCW1lbXNldChsaW1pdF9zdHJpbmcsIDAsIEFDUElfVEhFUk1BTF9NQVhfTElNSVRfU1RSX0xFTik7CiAKIAlhY3RpdmUgPSBrbWFsbG9jKEFDUElfVEhFUk1BTF9NQVhfQUNUSVZFICogc2l6ZW9mKGludCksIEdGUF9LRVJORUwpOwotCWlmICghYWN0aXZlKQorCWlmICghYWN0aXZlKSB7CisJCWtmcmVlKGxpbWl0X3N0cmluZyk7CiAJCXJldHVybl9WQUxVRSgtRU5PTUVNKTsKKwl9CiAKIAlpZiAoIXR6IHx8IChjb3VudCA+IEFDUElfVEhFUk1BTF9NQVhfTElNSVRfU1RSX0xFTiAtIDEpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50XG4iKSk7CkBAIC0xMzQyLDcgKzEzNDUsNyBAQAogCiAJcmVzdWx0ID0gYWNwaV90aGVybWFsX2FkZF9mcyhkZXZpY2UpOwogCWlmIChyZXN1bHQpCi0JCXJldHVybl9WQUxVRShyZXN1bHQpOworCQlnb3RvIGVuZDsKIAogCWluaXRfdGltZXIoJnR6LT50aW1lcik7CiAKQEAgLTE0MTYsNiArMTQxOSwyMCBAQAogCXJldHVybl9WQUxVRSgwKTsKIH0KIAorc3RhdGljIGludCBhY3BpX3RoZXJtYWxfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgc3RhdGUpCit7CisJc3RydWN0IGFjcGlfdGhlcm1hbCAqdHogPSBOVUxMOworCisJaWYgKCFkZXZpY2UgfHwgIWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKSkKKwkJcmV0dXJuX1ZBTFVFKC1FSU5WQUwpOworCisJdHogPSAoc3RydWN0IGFjcGlfdGhlcm1hbCAqKWFjcGlfZHJpdmVyX2RhdGEoZGV2aWNlKTsKKworCWFjcGlfdGhlcm1hbF9jaGVjayh0eik7CisKKwlyZXR1cm4gQUVfT0s7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfdGhlcm1hbF9pbml0KHZvaWQpCiB7CiAJaW50IHJlc3VsdCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0YWxsb2MuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCmluZGV4IDAzYjAwNDQuLjc5NDBmYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRhbGxvYy5jCkBAIC00NiwyNCArNDYsNiBAQAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCiBBQ1BJX01PRFVMRV9OQU1FKCJ1dGFsbG9jIikKIAotLyogTG9jYWwgcHJvdG90eXBlcyAqLwotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi1zdGF0aWMgc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbih2b2lkICphbGxvY2F0aW9uKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphZGRyZXNzLAotCQkJIGFjcGlfc2l6ZSBzaXplLAotCQkJIHU4IGFsbG9jX3R5cGUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphZGRyZXNzLAotCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9saXN0KGNoYXIgKmxpc3RfbmFtZSwKLQkJICAgIHUxNiBvYmplY3Rfc2l6ZSwgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKipyZXR1cm5fY2FjaGUpOwotI2VuZGlmCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2NhY2hlcwpAQCAtNzUsMTEgKzU3LDU2IEBACiAgKiBERVNDUklQVElPTjogQ3JlYXRlIGFsbCBsb2NhbCBjYWNoZXMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX3V0X2NyZWF0ZV9jYWNoZXModm9pZCkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKKwkvKiBPYmplY3QgQ2FjaGVzLCBmb3IgZnJlcXVlbnRseSB1c2VkIG9iamVjdHMgKi8KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLU5hbWVzcGFjZSIsCisJCQkJIHNpemVvZihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSksCisJCQkJIEFDUElfTUFYX05BTUVTUEFDRV9DQUNIRV9ERVBUSCwKKwkJCQkgJmFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiQWNwaS1TdGF0ZSIsIHNpemVvZih1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUpLAorCQkJCSBBQ1BJX01BWF9TVEFURV9DQUNIRV9ERVBUSCwKKwkJCQkgJmFjcGlfZ2JsX3N0YXRlX2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKworCXN0YXR1cyA9CisJICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJBY3BpLVBhcnNlIiwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhY3BpX3BhcnNlX29ial9jb21tb24pLAorCQkJCSBBQ1BJX01BWF9QQVJTRV9DQUNIRV9ERVBUSCwKKwkJCQkgJmFjcGlfZ2JsX3BzX25vZGVfY2FjaGUpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlyZXR1cm4gKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0KKwkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoIkFjcGktUGFyc2VFeHQiLAorCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKSwKKwkJCQkgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7CisJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCXJldHVybiAoc3RhdHVzKTsKKwl9CisKKwlzdGF0dXMgPQorCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiQWNwaS1PcGVyYW5kIiwKKwkJCQkgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpLAorCQkJCSBBQ1BJX01BWF9PQkpFQ1RfQ0FDSEVfREVQVEgsCisJCQkJICZhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuIChzdGF0dXMpOworCX0KKwogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiAKIAkvKiBNZW1vcnkgYWxsb2NhdGlvbiBsaXN0cyAqLwpAQCAtOTgsNDMgKzEyNSw2IEBACiAJfQogI2VuZGlmCiAKLQkvKiBPYmplY3QgQ2FjaGVzLCBmb3IgZnJlcXVlbnRseSB1c2VkIG9iamVjdHMgKi8KLQotCXN0YXR1cyA9Ci0JICAgIGFjcGlfb3NfY3JlYXRlX2NhY2hlKCJhY3BpX3N0YXRlIiwgc2l6ZW9mKHVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSksCi0JCQkJIEFDUElfTUFYX1NUQVRFX0NBQ0hFX0RFUFRILAotCQkJCSAmYWNwaV9nYmxfc3RhdGVfY2FjaGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm4gKHN0YXR1cyk7Ci0JfQotCi0Jc3RhdHVzID0KLQkgICAgYWNwaV9vc19jcmVhdGVfY2FjaGUoImFjcGlfcGFyc2UiLAotCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX2NvbW1vbiksCi0JCQkJIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRILAotCQkJCSAmYWNwaV9nYmxfcHNfbm9kZV9jYWNoZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9wYXJzZV9leHQiLAotCQkJCSBzaXplb2Yoc3RydWN0IGFjcGlfcGFyc2Vfb2JqX25hbWVkKSwKLQkJCQkgQUNQSV9NQVhfRVhUUEFSU0VfQ0FDSEVfREVQVEgsCi0JCQkJICZhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybiAoc3RhdHVzKTsKLQl9Ci0KLQlzdGF0dXMgPQotCSAgICBhY3BpX29zX2NyZWF0ZV9jYWNoZSgiYWNwaV9vcGVyYW5kIiwKLQkJCQkgc2l6ZW9mKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QpLAotCQkJCSBBQ1BJX01BWF9PQkpFQ1RfQ0FDSEVfREVQVEgsCi0JCQkJICZhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJcmV0dXJuIChzdGF0dXMpOwotCX0KLQogCXJldHVybiAoQUVfT0spOwogfQogCkBAIC0xNTMsNiArMTQzLDkgQEAKIGFjcGlfc3RhdHVzIGFjcGlfdXRfZGVsZXRlX2NhY2hlcyh2b2lkKQogewogCisJKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfbmFtZXNwYWNlX2NhY2hlKTsKKwlhY3BpX2dibF9uYW1lc3BhY2VfY2FjaGUgPSBOVUxMOworCiAJKHZvaWQpYWNwaV9vc19kZWxldGVfY2FjaGUoYWNwaV9nYmxfc3RhdGVfY2FjaGUpOwogCWFjcGlfZ2JsX3N0YXRlX2NhY2hlID0gTlVMTDsKIApAQCAtMTY1LDYgKzE1OCwyMSBAQAogCSh2b2lkKWFjcGlfb3NfZGVsZXRlX2NhY2hlKGFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlKTsKIAlhY3BpX2dibF9wc19ub2RlX2V4dF9jYWNoZSA9IE5VTEw7CiAKKyNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworCisJLyogRGVidWcgb25seSAtIGRpc3BsYXkgbGVmdG92ZXIgbWVtb3J5IGFsbG9jYXRpb24sIGlmIGFueSAqLworCisJYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zKEFDUElfVUlOVDMyX01BWCwgTlVMTCk7CisKKwkvKiBGcmVlIG1lbW9yeSBsaXN0cyAqLworCisJYWNwaV9vc19mcmVlKGFjcGlfZ2JsX2dsb2JhbF9saXN0KTsKKwlhY3BpX2dibF9nbG9iYWxfbGlzdCA9IE5VTEw7CisKKwlhY3BpX29zX2ZyZWUoYWNwaV9nYmxfbnNfbm9kZV9saXN0KTsKKwlhY3BpX2dibF9uc19ub2RlX2xpc3QgPSBOVUxMOworI2VuZGlmCisKIAlyZXR1cm4gKEFFX09LKTsKIH0KIApAQCAtMjUyLDcgKzI2MCw3IEBACiAKIAkJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIHdpdGggbG9jYWwgaW50ZXJmYWNlIHRvIGFsbG93IHRyYWNraW5nICovCiAKLQkJYnVmZmVyLT5wb2ludGVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKHJlcXVpcmVkX2xlbmd0aCk7CisJCWJ1ZmZlci0+cG9pbnRlciA9IEFDUElfQUxMT0NBVEVfWkVST0VEKHJlcXVpcmVkX2xlbmd0aCk7CiAJCWlmICghYnVmZmVyLT5wb2ludGVyKSB7CiAJCQlyZXR1cm4gKEFFX05PX01FTU9SWSk7CiAJCX0KQEAgLTI4OCw3ICsyOTYsNyBAQAogICoKICAqIFJFVFVSTjogICAgICBBZGRyZXNzIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KICAqCi0gKiBERVNDUklQVElPTjogVGhlIHN1YnN5c3RlbSdzIGVxdWl2YWxlbnQgb2YgbWFsbG9jLgorICogREVTQ1JJUFRJT046IFN1YnN5c3RlbSBlcXVpdmFsZW50IG9mIG1hbGxvYy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yOTYsMjMgKzMwNCwyMyBAQAogewogCXZvaWQgKmFsbG9jYXRpb247CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfYWxsb2NhdGUiLCBzaXplKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9hbGxvY2F0ZSwgc2l6ZSk7CiAKIAkvKiBDaGVjayBmb3IgYW4gaW5hZHZlcnRlbnQgc2l6ZSBvZiB6ZXJvIGJ5dGVzICovCiAKIAlpZiAoIXNpemUpIHsKLQkJQUNQSV9FUlJPUigobW9kdWxlLCBsaW5lLAotCQkJICAgICJ1dF9hbGxvY2F0ZTogQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzLCBhbGxvY2F0aW5nIDEgYnl0ZSIpKTsKKwkJQUNQSV9XQVJOSU5HKChtb2R1bGUsIGxpbmUsCisJCQkgICAgICAiQXR0ZW1wdCB0byBhbGxvY2F0ZSB6ZXJvIGJ5dGVzLCBhbGxvY2F0aW5nIDEgYnl0ZSIpKTsKIAkJc2l6ZSA9IDE7CiAJfQogCiAJYWxsb2NhdGlvbiA9IGFjcGlfb3NfYWxsb2NhdGUoc2l6ZSk7CiAJaWYgKCFhbGxvY2F0aW9uKSB7CisKIAkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KIAotCQlBQ1BJX0VSUk9SKChtb2R1bGUsIGxpbmUsCi0JCQkgICAgInV0X2FsbG9jYXRlOiBDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWCIsCi0JCQkgICAgKHUzMikgc2l6ZSkpOworCQlBQ1BJX1dBUk5JTkcoKG1vZHVsZSwgbGluZSwKKwkJCSAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWCIsICh1MzIpIHNpemUpKTsKIAogCQlyZXR1cm5fUFRSKE5VTEwpOwogCX0KQEAgLTMyMiw3ICszMzAsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2NhbGxvY2F0ZQorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfemVyb2VkCiAgKgogICogUEFSQU1FVEVSUzogIFNpemUgICAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBhbGxvY2F0aW9uCiAgKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgpAQCAtMzMxLDU0MiArMzM5LDI0IEBACiAgKgogICogUkVUVVJOOiAgICAgIEFkZHJlc3Mgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLgogICoKLSAqIERFU0NSSVBUSU9OOiBTdWJzeXN0ZW0gZXF1aXZhbGVudCBvZiBjYWxsb2MuCisgKiBERVNDUklQVElPTjogU3Vic3lzdGVtIGVxdWl2YWxlbnQgb2YgY2FsbG9jLiBBbGxvY2F0ZSBhbmQgemVybyBtZW1vcnkuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdm9pZCAqYWNwaV91dF9jYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCit2b2lkICphY3BpX3V0X2FsbG9jYXRlX3plcm9lZChhY3BpX3NpemUgc2l6ZSwKKwkJCSAgICAgIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCiB7CiAJdm9pZCAqYWxsb2NhdGlvbjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jYWxsb2NhdGUiLCBzaXplKTsKLQotCS8qIENoZWNrIGZvciBhbiBpbmFkdmVydGVudCBzaXplIG9mIHplcm8gYnl0ZXMgKi8KLQotCWlmICghc2l6ZSkgewotCQlBQ1BJX0VSUk9SKChtb2R1bGUsIGxpbmUsCi0JCQkgICAgIkF0dGVtcHQgdG8gYWxsb2NhdGUgemVybyBieXRlcywgYWxsb2NhdGluZyAxIGJ5dGUiKSk7Ci0JCXNpemUgPSAxOwotCX0KLQotCWFsbG9jYXRpb24gPSBhY3BpX29zX2FsbG9jYXRlKHNpemUpOwotCWlmICghYWxsb2NhdGlvbikgewotCQkvKiBSZXBvcnQgYWxsb2NhdGlvbiBlcnJvciAqLwotCi0JCUFDUElfRVJST1IoKG1vZHVsZSwgbGluZSwKLQkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIHNpemUgJVgiLCAodTMyKSBzaXplKSk7Ci0JCXJldHVybl9QVFIoTlVMTCk7Ci0JfQotCi0JLyogQ2xlYXIgdGhlIG1lbW9yeSBibG9jayAqLwotCi0JQUNQSV9NRU1TRVQoYWxsb2NhdGlvbiwgMCwgc2l6ZSk7Ci0JcmV0dXJuX1BUUihhbGxvY2F0aW9uKTsKLX0KLQotI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCi0vKgotICogVGhlc2UgcHJvY2VkdXJlcyBhcmUgdXNlZCBmb3IgdHJhY2tpbmcgbWVtb3J5IGxlYWtzIGluIHRoZSBzdWJzeXN0ZW0sIGFuZAotICogdGhleSBnZXQgY29tcGlsZWQgb3V0IHdoZW4gdGhlIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TIGlzIG5vdCBzZXQuCi0gKgotICogRWFjaCBtZW1vcnkgYWxsb2NhdGlvbiBpcyB0cmFja2VkIHZpYSBhIGRvdWJseSBsaW5rZWQgbGlzdC4gIEVhY2gKLSAqIGVsZW1lbnQgY29udGFpbnMgdGhlIGNhbGxlcidzIGNvbXBvbmVudCwgbW9kdWxlIG5hbWUsIGZ1bmN0aW9uIG5hbWUsIGFuZAotICogbGluZSBudW1iZXIuICBhY3BpX3V0X2FsbG9jYXRlIGFuZCBhY3BpX3V0X2NhbGxvY2F0ZSBjYWxsCi0gKiBhY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24gdG8gYWRkIGFuIGVsZW1lbnQgdG8gdGhlIGxpc3Q7IGRlbGV0aW9uCi0gKiBvY2N1cnMgaW4gdGhlIGJvZHkgb2YgYWNwaV91dF9mcmVlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfY3JlYXRlX2xpc3QKLSAqCi0gKiBQQVJBTUVURVJTOiAgY2FjaGVfbmFtZSAgICAgIC0gQXNjaWkgbmFtZSBmb3IgdGhlIGNhY2hlCi0gKiAgICAgICAgICAgICAgb2JqZWN0X3NpemUgICAgIC0gU2l6ZSBvZiBlYWNoIGNhY2hlZCBvYmplY3QKLSAqICAgICAgICAgICAgICByZXR1cm5fY2FjaGUgICAgLSBXaGVyZSB0aGUgbmV3IGNhY2hlIG9iamVjdCBpcyByZXR1cm5lZAotICoKLSAqIFJFVFVSTjogICAgICBTdGF0dXMKLSAqCi0gKiBERVNDUklQVElPTjogQ3JlYXRlIGEgbG9jYWwgbWVtb3J5IGxpc3QgZm9yIHRyYWNraW5nIHB1cnBvc2VkCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X2NyZWF0ZV9saXN0KGNoYXIgKmxpc3RfbmFtZSwKLQkJICAgIHUxNiBvYmplY3Rfc2l6ZSwgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKipyZXR1cm5fY2FjaGUpCi17Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKmNhY2hlOwotCi0JY2FjaGUgPSBhY3BpX29zX2FsbG9jYXRlKHNpemVvZihzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCkpOwotCWlmICghY2FjaGUpIHsKLQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwotCX0KLQotCUFDUElfTUVNU0VUKGNhY2hlLCAwLCBzaXplb2Yoc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QpKTsKLQotCWNhY2hlLT5saXN0X25hbWUgPSBsaXN0X25hbWU7Ci0JY2FjaGUtPm9iamVjdF9zaXplID0gb2JqZWN0X3NpemU7Ci0KLQkqcmV0dXJuX2NhY2hlID0gY2FjaGU7Ci0JcmV0dXJuIChBRV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfYW5kX3RyYWNrCi0gKgotICogUEFSQU1FVEVSUzogIFNpemUgICAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBhbGxvY2F0aW9uCi0gKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIE1vZHVsZSAgICAgICAgICAgICAgLSBTb3VyY2UgZmlsZSBuYW1lIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIExpbmUgICAgICAgICAgICAgICAgLSBMaW5lIG51bWJlciBvZiBjYWxsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgQWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICogREVTQ1JJUFRJT046IFRoZSBzdWJzeXN0ZW0ncyBlcXVpdmFsZW50IG9mIG1hbGxvYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICphY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKLQkJCQkgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmFsbG9jYXRpb247Ci0JYWNwaV9zdGF0dXMgc3RhdHVzOwotCi0JYWxsb2NhdGlvbiA9Ci0JICAgIGFjcGlfdXRfYWxsb2NhdGUoc2l6ZSArIHNpemVvZihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwKLQkJCSAgICAgY29tcG9uZW50LCBtb2R1bGUsIGxpbmUpOwotCWlmICghYWxsb2NhdGlvbikgewotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihhbGxvY2F0aW9uLCBzaXplLAotCQkJCQkgIEFDUElfTUVNX01BTExPQywgY29tcG9uZW50LCBtb2R1bGUsCi0JCQkJCSAgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfb3NfZnJlZShhbGxvY2F0aW9uKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfYWxsb2NhdGVkKys7Ci0JYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmN1cnJlbnRfdG90YWxfc2l6ZSArPSAodTMyKSBzaXplOwotCi0JcmV0dXJuICgodm9pZCAqKSZhbGxvY2F0aW9uLT51c2VyX3NwYWNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9jYWxsb2NhdGVfYW5kX3RyYWNrCi0gKgotICogUEFSQU1FVEVSUzogIFNpemUgICAgICAgICAgICAgICAgLSBTaXplIG9mIHRoZSBhbGxvY2F0aW9uCi0gKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIE1vZHVsZSAgICAgICAgICAgICAgLSBTb3VyY2UgZmlsZSBuYW1lIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIExpbmUgICAgICAgICAgICAgICAgLSBMaW5lIG51bWJlciBvZiBjYWxsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgQWRkcmVzcyBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0gKgotICogREVTQ1JJUFRJT046IFN1YnN5c3RlbSBlcXVpdmFsZW50IG9mIGNhbGxvYy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICphY3BpX3V0X2NhbGxvY2F0ZV9hbmRfdHJhY2soYWNwaV9zaXplIHNpemUsCi0JCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQotewotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqYWxsb2NhdGlvbjsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlhbGxvY2F0aW9uID0KLQkgICAgYWNwaV91dF9jYWxsb2NhdGUoc2l6ZSArIHNpemVvZihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1faGVhZGVyKSwKLQkJCSAgICAgIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKLQlpZiAoIWFsbG9jYXRpb24pIHsKLQkJLyogUmVwb3J0IGFsbG9jYXRpb24gZXJyb3IgKi8KLQotCQlBQ1BJX0VSUk9SKChtb2R1bGUsIGxpbmUsCi0JCQkgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwgKHUzMikgc2l6ZSkpOwotCQlyZXR1cm4gKE5VTEwpOwotCX0KLQotCXN0YXR1cyA9IGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbihhbGxvY2F0aW9uLCBzaXplLAotCQkJCQkgIEFDUElfTUVNX0NBTExPQywgY29tcG9uZW50LCBtb2R1bGUsCi0JCQkJCSAgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCWFjcGlfb3NfZnJlZShhbGxvY2F0aW9uKTsKLQkJcmV0dXJuIChOVUxMKTsKLQl9Ci0KLQlhY3BpX2dibF9nbG9iYWxfbGlzdC0+dG90YWxfYWxsb2NhdGVkKys7Ci0JYWNwaV9nYmxfZ2xvYmFsX2xpc3QtPmN1cnJlbnRfdG90YWxfc2l6ZSArPSAodTMyKSBzaXplOwotCi0JcmV0dXJuICgodm9pZCAqKSZhbGxvY2F0aW9uLT51c2VyX3NwYWNlKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9mcmVlX2FuZF90cmFjawotICoKLSAqIFBBUkFNRVRFUlM6ICBBbGxvY2F0aW9uICAgICAgICAgIC0gQWRkcmVzcyBvZiB0aGUgbWVtb3J5IHRvIGRlYWxsb2NhdGUKLSAqICAgICAgICAgICAgICBDb21wb25lbnQgICAgICAgICAgIC0gQ29tcG9uZW50IHR5cGUgb2YgY2FsbGVyCi0gKiAgICAgICAgICAgICAgTW9kdWxlICAgICAgICAgICAgICAtIFNvdXJjZSBmaWxlIG5hbWUgb2YgY2FsbGVyCi0gKiAgICAgICAgICAgICAgTGluZSAgICAgICAgICAgICAgICAtIExpbmUgbnVtYmVyIG9mIGNhbGxlcgotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IEZyZWVzIHRoZSBtZW1vcnkgYXQgQWxsb2NhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQKLWFjcGlfdXRfZnJlZV9hbmRfdHJhY2sodm9pZCAqYWxsb2NhdGlvbiwgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmRlYnVnX2Jsb2NrOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9mcmVlIiwgYWxsb2NhdGlvbik7Ci0KLQlpZiAoTlVMTCA9PSBhbGxvY2F0aW9uKSB7Ci0JCUFDUElfRVJST1IoKG1vZHVsZSwgbGluZSwgIkF0dGVtcHQgdG8gZGVsZXRlIGEgTlVMTCBhZGRyZXNzIikpOwotCi0JCXJldHVybl9WT0lEOwotCX0KLQotCWRlYnVnX2Jsb2NrID0gQUNQSV9DQVNUX1BUUihzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2ssCi0JCQkJICAgICgoKGNoYXIgKilhbGxvY2F0aW9uKSAtCi0JCQkJICAgICBzaXplb2Yoc3RydWN0IGFjcGlfZGVidWdfbWVtX2hlYWRlcikpKTsKLQotCWFjcGlfZ2JsX2dsb2JhbF9saXN0LT50b3RhbF9mcmVlZCsrOwotCWFjcGlfZ2JsX2dsb2JhbF9saXN0LT5jdXJyZW50X3RvdGFsX3NpemUgLT0gZGVidWdfYmxvY2stPnNpemU7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbW92ZV9hbGxvY2F0aW9uKGRlYnVnX2Jsb2NrLAotCQkJCQkgICBjb21wb25lbnQsIG1vZHVsZSwgbGluZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCUFDUElfRVhDRVBUSU9OKChBRV9JTkZPLCBzdGF0dXMsICJDb3VsZCBub3QgZnJlZSBtZW1vcnkiKSk7Ci0JfQotCi0JYWNwaV9vc19mcmVlKGRlYnVnX2Jsb2NrKTsKLQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0FMTE9DQVRJT05TLCAiJXAgZnJlZWRcbiIsIGFsbG9jYXRpb24pKTsKLQlyZXR1cm5fVk9JRDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9maW5kX2FsbG9jYXRpb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgQWxsb2NhdGlvbiAgICAgICAgICAgICAgLSBBZGRyZXNzIG9mIGFsbG9jYXRlZCBtZW1vcnkKLSAqCi0gKiBSRVRVUk46ICAgICAgQSBsaXN0IGVsZW1lbnQgaWYgZm91bmQ7IE5VTEwgb3RoZXJ3aXNlLgotICoKLSAqIERFU0NSSVBUSU9OOiBTZWFyY2hlcyBmb3IgYW4gZWxlbWVudCBpbiB0aGUgZ2xvYmFsIGFsbG9jYXRpb24gdHJhY2tpbmcgbGlzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbih2b2lkICphbGxvY2F0aW9uKQotewotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKLQogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAotCWVsZW1lbnQgPSBhY3BpX2dibF9nbG9iYWxfbGlzdC0+bGlzdF9oZWFkOworCWFsbG9jYXRpb24gPSBhY3BpX3V0X2FsbG9jYXRlKHNpemUsIGNvbXBvbmVudCwgbW9kdWxlLCBsaW5lKTsKKwlpZiAoYWxsb2NhdGlvbikgewogCi0JLyogU2VhcmNoIGZvciB0aGUgYWRkcmVzcy4gKi8KKwkJLyogQ2xlYXIgdGhlIG1lbW9yeSBibG9jayAqLwogCi0Jd2hpbGUgKGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gYWxsb2NhdGlvbikgewotCQkJcmV0dXJuIChlbGVtZW50KTsKLQkJfQotCi0JCWVsZW1lbnQgPSBlbGVtZW50LT5uZXh0OworCQlBQ1BJX01FTVNFVChhbGxvY2F0aW9uLCAwLCBzaXplKTsKIAl9CiAKLQlyZXR1cm4gKE5VTEwpOworCXJldHVybiAoYWxsb2NhdGlvbik7CiB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfdHJhY2tfYWxsb2NhdGlvbgotICoKLSAqIFBBUkFNRVRFUlM6ICBBbGxvY2F0aW9uICAgICAgICAgIC0gQWRkcmVzcyBvZiBhbGxvY2F0ZWQgbWVtb3J5Ci0gKiAgICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgICAgICAtIFNpemUgb2YgdGhlIGFsbG9jYXRpb24KLSAqICAgICAgICAgICAgICBhbGxvY190eXBlICAgICAgICAgIC0gTUVNX01BTExPQyBvciBNRU1fQ0FMTE9DCi0gKiAgICAgICAgICAgICAgQ29tcG9uZW50ICAgICAgICAgICAtIENvbXBvbmVudCB0eXBlIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIE1vZHVsZSAgICAgICAgICAgICAgLSBTb3VyY2UgZmlsZSBuYW1lIG9mIGNhbGxlcgotICogICAgICAgICAgICAgIExpbmUgICAgICAgICAgICAgICAgLSBMaW5lIG51bWJlciBvZiBjYWxsZXIKLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZS4KLSAqCi0gKiBERVNDUklQVElPTjogSW5zZXJ0cyBhbiBlbGVtZW50IGludG8gdGhlIGdsb2JhbCBhbGxvY2F0aW9uIHRyYWNraW5nIGxpc3QuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGFjcGlfc3RhdHVzCi1hY3BpX3V0X3RyYWNrX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAotCQkJIGFjcGlfc2l6ZSBzaXplLAotCQkJIHU4IGFsbG9jX3R5cGUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpCi17Ci0Jc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QgKm1lbV9saXN0OwotCXN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqZWxlbWVudDsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF90cmFja19hbGxvY2F0aW9uIiwgYWxsb2NhdGlvbik7Ci0KLQltZW1fbGlzdCA9IGFjcGlfZ2JsX2dsb2JhbF9saXN0OwotCXN0YXR1cyA9IGFjcGlfdXRfYWNxdWlyZV9tdXRleChBQ1BJX01UWF9NRU1PUlkpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIFNlYXJjaCBsaXN0IGZvciB0aGlzIGFkZHJlc3MgdG8gbWFrZSBzdXJlIGl0IGlzIG5vdCBhbHJlYWR5IG9uIHRoZSBsaXN0LgotCSAqIFRoaXMgd2lsbCBjYXRjaCBzZXZlcmFsIGtpbmRzIG9mIHByb2JsZW1zLgotCSAqLwotCWVsZW1lbnQgPSBhY3BpX3V0X2ZpbmRfYWxsb2NhdGlvbihhbGxvY2F0aW9uKTsKLQlpZiAoZWxlbWVudCkgewotCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAotCQkJICAgICJ1dF90cmFja19hbGxvY2F0aW9uOiBBbGxvY2F0aW9uIGFscmVhZHkgcHJlc2VudCBpbiBsaXN0ISAoJXApIiwKLQkJCSAgICBhbGxvY2F0aW9uKSk7Ci0KLQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkVsZW1lbnQgJXAgQWRkcmVzcyAlcCIsCi0JCQkgICAgZWxlbWVudCwgYWxsb2NhdGlvbikpOwotCi0JCWdvdG8gdW5sb2NrX2FuZF9leGl0OwotCX0KLQotCS8qIEZpbGwgaW4gdGhlIGluc3RhbmNlIGRhdGEuICovCi0KLQlhbGxvY2F0aW9uLT5zaXplID0gKHUzMikgc2l6ZTsKLQlhbGxvY2F0aW9uLT5hbGxvY190eXBlID0gYWxsb2NfdHlwZTsKLQlhbGxvY2F0aW9uLT5jb21wb25lbnQgPSBjb21wb25lbnQ7Ci0JYWxsb2NhdGlvbi0+bGluZSA9IGxpbmU7Ci0KLQlBQ1BJX1NUUk5DUFkoYWxsb2NhdGlvbi0+bW9kdWxlLCBtb2R1bGUsIEFDUElfTUFYX01PRFVMRV9OQU1FKTsKLQlhbGxvY2F0aW9uLT5tb2R1bGVbQUNQSV9NQVhfTU9EVUxFX05BTUUgLSAxXSA9IDA7Ci0KLQkvKiBJbnNlcnQgYXQgbGlzdCBoZWFkICovCi0KLQlpZiAobWVtX2xpc3QtPmxpc3RfaGVhZCkgewotCQkoKHN0cnVjdCBhY3BpX2RlYnVnX21lbV9ibG9jayAqKShtZW1fbGlzdC0+bGlzdF9oZWFkKSktPgotCQkgICAgcHJldmlvdXMgPSBhbGxvY2F0aW9uOwotCX0KLQotCWFsbG9jYXRpb24tPm5leHQgPSBtZW1fbGlzdC0+bGlzdF9oZWFkOwotCWFsbG9jYXRpb24tPnByZXZpb3VzID0gTlVMTDsKLQotCW1lbV9saXN0LT5saXN0X2hlYWQgPSBhbGxvY2F0aW9uOwotCi0gICAgICB1bmxvY2tfYW5kX2V4aXQ6Ci0Jc3RhdHVzID0gYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX01FTU9SWSk7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogRlVOQ1RJT046ICAgIGFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24KLSAqCi0gKiBQQVJBTUVURVJTOiAgQWxsb2NhdGlvbiAgICAgICAgICAtIEFkZHJlc3Mgb2YgYWxsb2NhdGVkIG1lbW9yeQotICogICAgICAgICAgICAgIENvbXBvbmVudCAgICAgICAgICAgLSBDb21wb25lbnQgdHlwZSBvZiBjYWxsZXIKLSAqICAgICAgICAgICAgICBNb2R1bGUgICAgICAgICAgICAgIC0gU291cmNlIGZpbGUgbmFtZSBvZiBjYWxsZXIKLSAqICAgICAgICAgICAgICBMaW5lICAgICAgICAgICAgICAgIC0gTGluZSBudW1iZXIgb2YgY2FsbGVyCi0gKgotICogUkVUVVJOOgotICoKLSAqIERFU0NSSVBUSU9OOiBEZWxldGVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgZ2xvYmFsIGFsbG9jYXRpb24gdHJhY2tpbmcgbGlzdC4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYWNwaV9zdGF0dXMKLWFjcGlfdXRfcmVtb3ZlX2FsbG9jYXRpb24oc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICphbGxvY2F0aW9uLAotCQkJICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKQotewotCXN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICptZW1fbGlzdDsKLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9yZW1vdmVfYWxsb2NhdGlvbiIpOwotCi0JbWVtX2xpc3QgPSBhY3BpX2dibF9nbG9iYWxfbGlzdDsKLQlpZiAoTlVMTCA9PSBtZW1fbGlzdC0+bGlzdF9oZWFkKSB7Ci0JCS8qIE5vIGFsbG9jYXRpb25zISAqLwotCi0JCUFDUElfRVJST1IoKG1vZHVsZSwgbGluZSwKLQkJCSAgICAiRW1wdHkgYWxsb2NhdGlvbiBsaXN0LCBub3RoaW5nIHRvIGZyZWUhIikpOwotCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JfQotCi0Jc3RhdHVzID0gYWNwaV91dF9hY3F1aXJlX211dGV4KEFDUElfTVRYX01FTU9SWSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwotCX0KLQotCS8qIFVubGluayAqLwotCi0JaWYgKGFsbG9jYXRpb24tPnByZXZpb3VzKSB7Ci0JCShhbGxvY2F0aW9uLT5wcmV2aW91cyktPm5leHQgPSBhbGxvY2F0aW9uLT5uZXh0OwotCX0gZWxzZSB7Ci0JCW1lbV9saXN0LT5saXN0X2hlYWQgPSBhbGxvY2F0aW9uLT5uZXh0OwotCX0KLQotCWlmIChhbGxvY2F0aW9uLT5uZXh0KSB7Ci0JCShhbGxvY2F0aW9uLT5uZXh0KS0+cHJldmlvdXMgPSBhbGxvY2F0aW9uLT5wcmV2aW91czsKLQl9Ci0KLQkvKiBNYXJrIHRoZSBzZWdtZW50IGFzIGRlbGV0ZWQgKi8KLQotCUFDUElfTUVNU0VUKCZhbGxvY2F0aW9uLT51c2VyX3NwYWNlLCAweEVBLCBhbGxvY2F0aW9uLT5zaXplKTsKLQotCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfQUxMT0NBVElPTlMsICJGcmVlaW5nIHNpemUgMCVYXG4iLAotCQkJICBhbGxvY2F0aW9uLT5zaXplKSk7Ci0KLQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKLQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25faW5mbwotICoKLSAqIFBBUkFNRVRFUlM6Ci0gKgotICogUkVUVVJOOiAgICAgIE5vbmUKLSAqCi0gKiBERVNDUklQVElPTjogUHJpbnQgc29tZSBpbmZvIGFib3V0IHRoZSBvdXRzdGFuZGluZyBhbGxvY2F0aW9ucy4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXZvaWQgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25faW5mbyh2b2lkKQotewotLyoKLQlzdHJ1Y3QgYWNwaV9tZW1vcnlfbGlzdCAgICAgICAgICptZW1fbGlzdDsKLSovCi0KLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kdW1wX2FsbG9jYXRpb25faW5mbyIpOwotCi0vKgotCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAotCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIkN1cnJlbnQgYWxsb2NhdGlvbnMiLAotCQkJICBtZW1fbGlzdC0+Y3VycmVudF9jb3VudCwKLQkJCSAgUk9VTkRfVVBfVE9fMUsgKG1lbV9saXN0LT5jdXJyZW50X3NpemUpKSk7Ci0KLQlBQ1BJX0RFQlVHX1BSSU5UIChUUkFDRV9BTExPQ0FUSU9OUyB8IFRSQUNFX1RBQkxFUywKLQkJCSAgKCIlMzBzOiAlNGQgKCUzZCBLYilcbiIsICJNYXggY29uY3VycmVudCBhbGxvY2F0aW9ucyIsCi0JCQkgIG1lbV9saXN0LT5tYXhfY29uY3VycmVudF9jb3VudCwKLQkJCSAgUk9VTkRfVVBfVE9fMUsgKG1lbV9saXN0LT5tYXhfY29uY3VycmVudF9zaXplKSkpOwotCi0JQUNQSV9ERUJVR19QUklOVCAoVFJBQ0VfQUxMT0NBVElPTlMgfCBUUkFDRV9UQUJMRVMsCi0JCQkgICgiJTMwczogJTRkICglM2QgS2IpXG4iLCAiVG90YWwgKGFsbCkgaW50ZXJuYWwgb2JqZWN0cyIsCi0JCQkgIHJ1bm5pbmdfb2JqZWN0X2NvdW50LAotCQkJICBST1VORF9VUF9UT18xSyAocnVubmluZ19vYmplY3Rfc2l6ZSkpKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAotCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIlRvdGFsIChhbGwpIGFsbG9jYXRpb25zIiwKLQkJCSAgcnVubmluZ19hbGxvY19jb3VudCwKLQkJCSAgUk9VTkRfVVBfVE9fMUsgKHJ1bm5pbmdfYWxsb2Nfc2l6ZSkpKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAotCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIkN1cnJlbnQgTm9kZXMiLAotCQkJICBhY3BpX2dibF9jdXJyZW50X25vZGVfY291bnQsCi0JCQkgIFJPVU5EX1VQX1RPXzFLIChhY3BpX2dibF9jdXJyZW50X25vZGVfc2l6ZSkpKTsKLQotCUFDUElfREVCVUdfUFJJTlQgKFRSQUNFX0FMTE9DQVRJT05TIHwgVFJBQ0VfVEFCTEVTLAotCQkJICAoIiUzMHM6ICU0ZCAoJTNkIEtiKVxuIiwgIk1heCBOb2RlcyIsCi0JCQkgIGFjcGlfZ2JsX21heF9jb25jdXJyZW50X25vZGVfY291bnQsCi0JCQkgIFJPVU5EX1VQX1RPXzFLICgoYWNwaV9nYmxfbWF4X2NvbmN1cnJlbnRfbm9kZV9jb3VudCAqCi0JCQkJCSBzaXplb2YgKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlKSkpKSk7Ci0qLwotCXJldHVybl9WT0lEOwotfQotI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zCi0gKgotICogUEFSQU1FVEVSUzogIENvbXBvbmVudCAgICAgICAgICAgLSBDb21wb25lbnQocykgdG8gZHVtcCBpbmZvIGZvci4KLSAqICAgICAgICAgICAgICBNb2R1bGUgICAgICAgICAgICAgIC0gTW9kdWxlIHRvIGR1bXAgaW5mbyBmb3IuICBOVUxMIG1lYW5zIGFsbC4KLSAqCi0gKiBSRVRVUk46ICAgICAgTm9uZQotICoKLSAqIERFU0NSSVBUSU9OOiBQcmludCBhIGxpc3Qgb2YgYWxsIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9kdW1wX2FsbG9jYXRpb25zKHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgKmVsZW1lbnQ7Ci0JdW5pb24gYWNwaV9kZXNjcmlwdG9yICpkZXNjcmlwdG9yOwotCXUzMiBudW1fb3V0c3RhbmRpbmcgPSAwOwotCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZHVtcF9hbGxvY2F0aW9ucyIpOwotCi0JLyoKLQkgKiBXYWxrIHRoZSBhbGxvY2F0aW9uIGxpc3QuCi0JICovCi0JaWYgKEFDUElfRkFJTFVSRShhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKSkpIHsKLQkJcmV0dXJuOwotCX0KLQotCWVsZW1lbnQgPSBhY3BpX2dibF9nbG9iYWxfbGlzdC0+bGlzdF9oZWFkOwotCXdoaWxlIChlbGVtZW50KSB7Ci0JCWlmICgoZWxlbWVudC0+Y29tcG9uZW50ICYgY29tcG9uZW50KSAmJgotCQkgICAgKChtb2R1bGUgPT0gTlVMTCkKLQkJICAgICB8fCAoMCA9PSBBQ1BJX1NUUkNNUChtb2R1bGUsIGVsZW1lbnQtPm1vZHVsZSkpKSkgewotCQkJLyogSWdub3JlIGFsbG9jYXRlZCBvYmplY3RzIHRoYXQgYXJlIGluIGEgY2FjaGUgKi8KLQotCQkJZGVzY3JpcHRvciA9Ci0JCQkgICAgQUNQSV9DQVNUX1BUUih1bmlvbiBhY3BpX2Rlc2NyaXB0b3IsCi0JCQkJCSAgJmVsZW1lbnQtPnVzZXJfc3BhY2UpOwotCQkJaWYgKGRlc2NyaXB0b3ItPmRlc2NyaXB0b3JfaWQgIT0gQUNQSV9ERVNDX1RZUEVfQ0FDSEVEKSB7Ci0JCQkJYWNwaV9vc19wcmludGYoIiVwIExlbiAlMDRYICU5LjlzLSVkIFslc10gIiwKLQkJCQkJICAgICAgIGRlc2NyaXB0b3IsIGVsZW1lbnQtPnNpemUsCi0JCQkJCSAgICAgICBlbGVtZW50LT5tb2R1bGUsIGVsZW1lbnQtPmxpbmUsCi0JCQkJCSAgICAgICBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUKLQkJCQkJICAgICAgIChkZXNjcmlwdG9yKSk7Ci0KLQkJCQkvKiBNb3N0IG9mIHRoZSBlbGVtZW50cyB3aWxsIGJlIE9wZXJhbmQgb2JqZWN0cy4gKi8KLQotCQkJCXN3aXRjaCAoQUNQSV9HRVRfREVTQ1JJUFRPUl9UWVBFKGRlc2NyaXB0b3IpKSB7Ci0JCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9PUEVSQU5EOgotCQkJCQlhY3BpX29zX3ByaW50ZigiJTEyLjEycyBSJWhkIiwKLQkJCQkJCSAgICAgICBhY3BpX3V0X2dldF90eXBlX25hbWUKLQkJCQkJCSAgICAgICAoZGVzY3JpcHRvci0+b2JqZWN0LgotCQkJCQkJCWNvbW1vbi50eXBlKSwKLQkJCQkJCSAgICAgICBkZXNjcmlwdG9yLT5vYmplY3QuCi0JCQkJCQkgICAgICAgY29tbW9uLnJlZmVyZW5jZV9jb3VudCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9QQVJTRVI6Ci0JCQkJCWFjcGlfb3NfcHJpbnRmKCJhbWxfb3Bjb2RlICUwNGhYIiwKLQkJCQkJCSAgICAgICBkZXNjcmlwdG9yLT5vcC5hc2wuCi0JCQkJCQkgICAgICAgYW1sX29wY29kZSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBQ1BJX0RFU0NfVFlQRV9OQU1FRDoKLQkJCQkJYWNwaV9vc19wcmludGYoIiU0LjRzIiwKLQkJCQkJCSAgICAgICBhY3BpX3V0X2dldF9ub2RlX25hbWUKLQkJCQkJCSAgICAgICAoJmRlc2NyaXB0b3ItPm5vZGUpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlhY3BpX29zX3ByaW50ZigiXG4iKTsKLQkJCQludW1fb3V0c3RhbmRpbmcrKzsKLQkJCX0KLQkJfQotCQllbGVtZW50ID0gZWxlbWVudC0+bmV4dDsKLQl9Ci0KLQkodm9pZClhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfTUVNT1JZKTsKLQotCS8qIFByaW50IHN1bW1hcnkgKi8KLQotCWlmICghbnVtX291dHN0YW5kaW5nKSB7Ci0JCUFDUElfSU5GTygoQUVfSU5GTywgIk5vIG91dHN0YW5kaW5nIGFsbG9jYXRpb25zIikpOwotCX0gZWxzZSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIiVkKCVYKSBPdXRzdGFuZGluZyBhbGxvY2F0aW9ucyIsCi0JCQkgICAgbnVtX291dHN0YW5kaW5nLCBudW1fb3V0c3RhbmRpbmcpKTsKLQl9Ci0KLQlyZXR1cm5fVk9JRDsKLX0KLQotI2VuZGlmCQkJCS8qICNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNhY2hlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y2FjaGUuYwppbmRleCAyMTc3Y2IxLi41NjI3MGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y2FjaGUuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y2FjaGUuYwpAQCAtMTE4LDEzICsxMTgsMTQgQEAKIAkvKiBXYWxrIHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhpcyBjYWNoZSAqLwogCiAJd2hpbGUgKGNhY2hlLT5saXN0X2hlYWQpIHsKKwogCQkvKiBEZWxldGUgYW5kIHVubGluayBvbmUgY2FjaGVkIHN0YXRlIG9iamVjdCAqLwogCiAJCW5leHQgPSAqKEFDUElfQ0FTVF9JTkRJUkVDVF9QVFIoY2hhciwKIAkJCQkJCSYoKChjaGFyICopY2FjaGUtPgogCQkJCQkJICAgbGlzdF9oZWFkKVtjYWNoZS0+CiAJCQkJCQkJICAgICAgbGlua19vZmZzZXRdKSkpOwotCQlBQ1BJX01FTV9GUkVFKGNhY2hlLT5saXN0X2hlYWQpOworCQlBQ1BJX0ZSRUUoY2FjaGUtPmxpc3RfaGVhZCk7CiAKIAkJY2FjaGUtPmxpc3RfaGVhZCA9IG5leHQ7CiAJCWNhY2hlLT5jdXJyZW50X2RlcHRoLS07CkBAIC0xOTMsNyArMTk0LDcgQEAKIAkvKiBJZiBjYWNoZSBpcyBmdWxsLCBqdXN0IGZyZWUgdGhpcyBvYmplY3QgKi8KIAogCWlmIChjYWNoZS0+Y3VycmVudF9kZXB0aCA+PSBjYWNoZS0+bWF4X2RlcHRoKSB7Ci0JCUFDUElfTUVNX0ZSRUUob2JqZWN0KTsKKwkJQUNQSV9GUkVFKG9iamVjdCk7CiAJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT50b3RhbF9mcmVlZCsrKTsKIAl9CiAKQEAgLTI0Myw3ICsyNDQsNyBAQAogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAl2b2lkICpvYmplY3Q7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoIm9zX2FjcXVpcmVfb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9OQU1FKG9zX2FjcXVpcmVfb2JqZWN0KTsKIAogCWlmICghY2FjaGUpIHsKIAkJcmV0dXJuIChOVUxMKTsKQEAgLTI1OSw2ICsyNjAsNyBAQAogCS8qIENoZWNrIHRoZSBjYWNoZSBmaXJzdCAqLwogCiAJaWYgKGNhY2hlLT5saXN0X2hlYWQpIHsKKwogCQkvKiBUaGVyZSBpcyBhbiBvYmplY3QgYXZhaWxhYmxlLCB1c2UgaXQgKi8KIAogCQlvYmplY3QgPSBjYWNoZS0+bGlzdF9oZWFkOwpAQCAtMjcwLDkgKzI3Miw5IEBACiAJCWNhY2hlLT5jdXJyZW50X2RlcHRoLS07CiAKIAkJQUNQSV9NRU1fVFJBQ0tJTkcoY2FjaGUtPmhpdHMrKyk7Ci0JCUFDUElfTUVNX1RSQUNLSU5HKEFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKLQkJCQkJCSAgICAiT2JqZWN0ICVwIGZyb20gJXMgY2FjaGVcbiIsCi0JCQkJCQkgICAgb2JqZWN0LCBjYWNoZS0+bGlzdF9uYW1lKSkpOworCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCisJCQkJICAiT2JqZWN0ICVwIGZyb20gJXMgY2FjaGVcbiIsIG9iamVjdCwKKwkJCQkgIGNhY2hlLT5saXN0X25hbWUpKTsKIAogCQlzdGF0dXMgPSBhY3BpX3V0X3JlbGVhc2VfbXV0ZXgoQUNQSV9NVFhfQ0FDSEVTKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CkBAIC0yODcsMTQgKzI4OSwxNCBAQAogCiAJCUFDUElfTUVNX1RSQUNLSU5HKGNhY2hlLT50b3RhbF9hbGxvY2F0ZWQrKyk7CiAKLQkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX01FTV9DQUxMT0NBVEUgKi8KKwkJLyogQXZvaWQgZGVhZGxvY2sgd2l0aCBBQ1BJX0FMTE9DQVRFX1pFUk9FRCAqLwogCiAJCXN0YXR1cyA9IGFjcGlfdXRfcmVsZWFzZV9tdXRleChBQ1BJX01UWF9DQUNIRVMpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybiAoTlVMTCk7CiAJCX0KIAotCQlvYmplY3QgPSBBQ1BJX01FTV9DQUxMT0NBVEUoY2FjaGUtPm9iamVjdF9zaXplKTsKKwkJb2JqZWN0ID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoY2FjaGUtPm9iamVjdF9zaXplKTsKIAkJaWYgKCFvYmplY3QpIHsKIAkJCXJldHVybiAoTlVMTCk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Y29weS5jCmluZGV4IGRmMmQzMjAuLjVlMWE4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRjb3B5LmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGNvcHkuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lzaW1wbGVfdG9fZXNpbXBsZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pc2ltcGxlX3RvX2VzaW1wbGUpOwogCiAJKmJ1ZmZlcl9zcGFjZV91c2VkID0gMDsKIApAQCAtMzI1LDcgKzMyNSw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3BrZ19pbmZvIGluZm87CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lwYWNrYWdlX3RvX2VwYWNrYWdlKTsKIAogCS8qCiAJICogRmlyc3QgcGFja2FnZSBhdCBoZWFkIG9mIHRoZSBidWZmZXIKQEAgLTM4Myw3ICszODMsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfaW9iamVjdF90b19lb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lvYmplY3RfdG9fZW9iamVjdCk7CiAKIAlpZiAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW50ZXJuYWxfb2JqZWN0KSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewogCQkvKgpAQCAtNDQyLDcgKzQ0Miw3IEBACiB7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW50ZXJuYWxfb2JqZWN0OwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lc2ltcGxlX3RvX2lzaW1wbGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfZXNpbXBsZV90b19pc2ltcGxlKTsKIAogCS8qCiAJICogU2ltcGxlIHR5cGVzIHN1cHBvcnRlZCBhcmU6IFN0cmluZywgQnVmZmVyLCBJbnRlZ2VyCkBAIC00NzIsOCArNDcyLDggQEAKIAljYXNlIEFDUElfVFlQRV9TVFJJTkc6CiAKIAkJaW50ZXJuYWxfb2JqZWN0LT5zdHJpbmcucG9pbnRlciA9Ci0JCSAgICBBQ1BJX01FTV9DQUxMT0NBVEUoKGFjcGlfc2l6ZSkgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcuCi0JCQkJICAgICAgIGxlbmd0aCArIDEpOworCQkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoKGFjcGlfc2l6ZSkgZXh0ZXJuYWxfb2JqZWN0LT5zdHJpbmcuCisJCQkJCSBsZW5ndGggKyAxKTsKIAkJaWYgKCFpbnRlcm5hbF9vYmplY3QtPnN0cmluZy5wb2ludGVyKSB7CiAJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCX0KQEAgLTQ4OCw3ICs0ODgsNyBAQAogCWNhc2UgQUNQSV9UWVBFX0JVRkZFUjoKIAogCQlpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyID0KLQkJICAgIEFDUElfTUVNX0NBTExPQ0FURShleHRlcm5hbF9vYmplY3QtPmJ1ZmZlci5sZW5ndGgpOworCQkgICAgQUNQSV9BTExPQ0FURV9aRVJPRUQoZXh0ZXJuYWxfb2JqZWN0LT5idWZmZXIubGVuZ3RoKTsKIAkJaWYgKCFpbnRlcm5hbF9vYmplY3QtPmJ1ZmZlci5wb2ludGVyKSB7CiAJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCX0KQEAgLTU1Miw3ICs1NTIsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRoaXNfaW50ZXJuYWxfb2JqOwogCXVuaW9uIGFjcGlfb2JqZWN0ICp0aGlzX2V4dGVybmFsX29iajsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfZXBhY2thZ2VfdG9faXBhY2thZ2UpOwogCiAJLyoKIAkgKiBGaXJzdCBwYWNrYWdlIGF0IGhlYWQgb2YgdGhlIGJ1ZmZlcgpAQCAtNjAwLDcgKzYwMCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfY29weV9lb2JqZWN0X3RvX2lvYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2NvcHlfZW9iamVjdF90b19pb2JqZWN0KTsKIAogCWlmIChleHRlcm5hbF9vYmplY3QtPnR5cGUgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKIAkJLyoKQEAgLTY3Niw3ICs2NzYsNyBAQAogCQlpZiAoKHNvdXJjZV9kZXNjLT5idWZmZXIucG9pbnRlcikgJiYKIAkJICAgIChzb3VyY2VfZGVzYy0+YnVmZmVyLmxlbmd0aCkpIHsKIAkJCWRlc3RfZGVzYy0+YnVmZmVyLnBvaW50ZXIgPQotCQkJICAgIEFDUElfTUVNX0FMTE9DQVRFKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKTsKKwkJCSAgICBBQ1BJX0FMTE9DQVRFKHNvdXJjZV9kZXNjLT5idWZmZXIubGVuZ3RoKTsKIAkJCWlmICghZGVzdF9kZXNjLT5idWZmZXIucG9pbnRlcikgewogCQkJCXJldHVybiAoQUVfTk9fTUVNT1JZKTsKIAkJCX0KQEAgLTY5Nyw4ICs2OTcsOCBAQAogCQkgKi8KIAkJaWYgKHNvdXJjZV9kZXNjLT5zdHJpbmcucG9pbnRlcikgewogCQkJZGVzdF9kZXNjLT5zdHJpbmcucG9pbnRlciA9Ci0JCQkgICAgQUNQSV9NRU1fQUxMT0NBVEUoKGFjcGlfc2l6ZSkgc291cmNlX2Rlc2MtPnN0cmluZy4KLQkJCQkJICAgICAgbGVuZ3RoICsgMSk7CisJCQkgICAgQUNQSV9BTExPQ0FURSgoYWNwaV9zaXplKSBzb3VyY2VfZGVzYy0+c3RyaW5nLgorCQkJCQkgIGxlbmd0aCArIDEpOwogCQkJaWYgKCFkZXN0X2Rlc2MtPnN0cmluZy5wb2ludGVyKSB7CiAJCQkJcmV0dXJuIChBRV9OT19NRU1PUlkpOwogCQkJfQpAQCAtODA1LDkgKzgwNSw3IEBACiAJCS8qCiAJCSAqIENyZWF0ZSB0aGUgb2JqZWN0IGFycmF5CiAJCSAqLwotCQl0YXJnZXRfb2JqZWN0LT5wYWNrYWdlLmVsZW1lbnRzID0KLQkJICAgIEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkgc291cmNlX29iamVjdC0+cGFja2FnZS4KLQkJCQkJY291bnQgKyAxKSAqIHNpemVvZih2b2lkICopKTsKKwkJdGFyZ2V0X29iamVjdC0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKSBzb3VyY2Vfb2JqZWN0LT5wYWNrYWdlLmNvdW50ICsgMSkgKiBzaXplb2Yodm9pZCAqKSk7CiAJCWlmICghdGFyZ2V0X29iamVjdC0+cGFja2FnZS5lbGVtZW50cykgewogCQkJc3RhdHVzID0gQUVfTk9fTUVNT1JZOwogCQkJZ290byBlcnJvcl9leGl0OwpAQCAtODU2LDcgKzg1NCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jb3B5X2lwYWNrYWdlX3RvX2lwYWNrYWdlKTsKIAogCWRlc3Rfb2JqLT5jb21tb24udHlwZSA9IEFDUElfR0VUX09CSkVDVF9UWVBFKHNvdXJjZV9vYmopOwogCWRlc3Rfb2JqLT5jb21tb24uZmxhZ3MgPSBzb3VyY2Vfb2JqLT5jb21tb24uZmxhZ3M7CkBAIC04NjUsMTAgKzg2MywxMCBAQAogCS8qCiAJICogQ3JlYXRlIHRoZSBvYmplY3QgYXJyYXkgYW5kIHdhbGsgdGhlIHNvdXJjZSBwYWNrYWdlIHRyZWUKIAkgKi8KLQlkZXN0X29iai0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfTUVNX0NBTExPQ0FURSgoKGFjcGlfc2l6ZSkKLQkJCQkJCQkgc291cmNlX29iai0+cGFja2FnZS4KLQkJCQkJCQkgY291bnQgKwotCQkJCQkJCSAxKSAqIHNpemVvZih2b2lkICopKTsKKwlkZXN0X29iai0+cGFja2FnZS5lbGVtZW50cyA9IEFDUElfQUxMT0NBVEVfWkVST0VEKCgoYWNwaV9zaXplKQorCQkJCQkJCSAgIHNvdXJjZV9vYmotPnBhY2thZ2UuCisJCQkJCQkJICAgY291bnQgKworCQkJCQkJCSAgIDEpICogc2l6ZW9mKHZvaWQgKikpOwogCWlmICghZGVzdF9vYmotPnBhY2thZ2UuZWxlbWVudHMpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywgIlBhY2thZ2UgYWxsb2NhdGlvbiBmYWlsdXJlIikpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9fTUVNT1JZKTsKQEAgLTg4Miw2ICs4ODAsNyBAQAogCQkJCQkgICBhY3BpX3V0X2NvcHlfaWVsZW1lbnRfdG9faWVsZW1lbnQsCiAJCQkJCSAgIHdhbGtfc3RhdGUpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCiAJCS8qIE9uIGZhaWx1cmUsIGRlbGV0ZSB0aGUgZGVzdGluYXRpb24gcGFja2FnZSBvYmplY3QgKi8KIAogCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoZGVzdF9vYmopOwpAQCAtOTExLDcgKzkxMCw3IEBACiB7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jb3B5X2lvYmplY3RfdG9faW9iamVjdCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfY29weV9pb2JqZWN0X3RvX2lvYmplY3QpOwogCiAJLyogQ3JlYXRlIHRoZSB0b3AgbGV2ZWwgb2JqZWN0ICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWJ1Zy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKaW5kZXggMzVmM2Q1OC4uNWVjMWNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlYnVnLmMKQEAgLTQxLDggKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgIEFDUElfVVRJTElUSUVTCkBAIC0xMjMsMTIgKzEyMSwxNCBAQAogCS8qIEFsbCBGdW5jdGlvbiBuYW1lcyBhcmUgbG9uZ2VyIHRoYW4gNCBjaGFycywgY2hlY2sgaXMgc2FmZSAqLwogCiAJaWYgKCooQUNQSV9DQVNUX1BUUih1MzIsIGZ1bmN0aW9uX25hbWUpKSA9PSBBQ1BJX1BSRUZJWF9NSVhFRCkgeworCiAJCS8qIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgdGhlIG9yaWdpbmFsIHNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgKi8KIAogCQlyZXR1cm4gKGZ1bmN0aW9uX25hbWUgKyA0KTsKIAl9CiAKIAlpZiAoKihBQ1BJX0NBU1RfUFRSKHUzMiwgZnVuY3Rpb25fbmFtZSkpID09IEFDUElfUFJFRklYX0xPV0VSKSB7CisKIAkJLyogVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgc291cmNlIGhhcyBiZWVuICdsaW51eGl6ZWQnICovCiAKIAkJcmV0dXJuIChmdW5jdGlvbl9uYW1lICsgNSk7CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCiAJCSAgICBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCwgY2hhciAqZm9ybWF0LCAuLi4pCiB7Ci0JdTMyIHRocmVhZF9pZDsKKwlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7CiAJdmFfbGlzdCBhcmdzOwogCiAJLyoKQEAgLTE3Nyw3ICsxNzcsNiBAQAogCSAqIFRocmVhZCB0cmFja2luZyBhbmQgY29udGV4dCBzd2l0Y2ggbm90aWZpY2F0aW9uCiAJICovCiAJdGhyZWFkX2lkID0gYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7Ci0KIAlpZiAodGhyZWFkX2lkICE9IGFjcGlfZ2JsX3ByZXZfdGhyZWFkX2lkKSB7CiAJCWlmIChBQ1BJX0xWX1RIUkVBRFMgJiBhY3BpX2RiZ19sZXZlbCkgewogCQkJYWNwaV9vc19wcmludGYKQEAgLTIwNiw3ICsyMDUsNyBAQAogCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjI2LDcgKzIyNSw2IEBACiAgKiAgICAgICAgICAgICAgZGVidWdfcHJpbnQgc28gdGhhdCB0aGUgc2FtZSBtYWNyb3MgY2FuIGJlIHVzZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogdm9pZCBBQ1BJX0lOVEVSTkFMX1ZBUl9YRkFDRQogYWNwaV91dF9kZWJ1Z19wcmludF9yYXcodTMyIHJlcXVlc3RlZF9kZWJ1Z19sZXZlbCwKIAkJCXUzMiBsaW5lX251bWJlciwKQEAgLTI0NCw3ICsyNDIsNyBAQAogCWFjcGlfb3NfdnByaW50Zihmb3JtYXQsIGFyZ3MpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfZGVidWdfcHJpbnRfcmF3KTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3V0X2RlYnVnX3ByaW50X3JhdykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yNjEsNyArMjU5LDYgQEAKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiB2b2lkCiBhY3BpX3V0X3RyYWNlKHUzMiBsaW5lX251bWJlciwKIAkgICAgICBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLCBjaGFyICptb2R1bGVfbmFtZSwgdTMyIGNvbXBvbmVudF9pZCkKQEAgLTI3NSw3ICsyNzIsNyBAQAogCQkJICAgIGNvbXBvbmVudF9pZCwgIiVzXG4iLCBhY3BpX2dibF9mbl9lbnRyeV9zdHIpOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdHJhY2UpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMjkzLDcgKzI5MCw2IEBACiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogdm9pZAogYWNwaV91dF90cmFjZV9wdHIodTMyIGxpbmVfbnVtYmVyLAogCQkgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCkBAIC00MDAsNyArMzk2LDcgQEAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV91dF9leGl0KTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3V0X2V4aXQpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDE4LDcgKzQxNCw2IEBACiAgKiAgICAgICAgICAgICAgc2V0IGluIGRlYnVnX2xldmVsLiBQcmludHMgZXhpdCBzdGF0dXMgYWxzby4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiB2b2lkCiBhY3BpX3V0X3N0YXR1c19leGl0KHUzMiBsaW5lX251bWJlciwKIAkJICAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uX25hbWUsCkBAIC00NDIsNyArNDM3LDcgQEAKIAlhY3BpX2dibF9uZXN0aW5nX2xldmVsLS07CiB9CiAKLUVYUE9SVF9TWU1CT0woYWNwaV91dF9zdGF0dXNfZXhpdCk7CitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV91dF9zdGF0dXNfZXhpdCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00NjAsNyArNDU1LDYgQEAKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHZhbHVlIGFsc28uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogdm9pZAogYWNwaV91dF92YWx1ZV9leGl0KHUzMiBsaW5lX251bWJlciwKIAkJICAgY29uc3QgY2hhciAqZnVuY3Rpb25fbmFtZSwKQEAgLTQ3NSw3ICs0NjksNyBAQAogCWFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwtLTsKIH0KIAotRVhQT1JUX1NZTUJPTChhY3BpX3V0X3ZhbHVlX2V4aXQpOworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfdXRfdmFsdWVfZXhpdCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC00OTMsNyArNDg3LDYgQEAKICAqICAgICAgICAgICAgICBzZXQgaW4gZGVidWdfbGV2ZWwuIFByaW50cyBleGl0IHZhbHVlIGFsc28uCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogdm9pZAogYWNwaV91dF9wdHJfZXhpdCh1MzIgbGluZV9udW1iZXIsCiAJCSBjb25zdCBjaGFyICpmdW5jdGlvbl9uYW1lLApAQCAtNTI0LDIwICs1MTcsMTMgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIodTggKiBidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBjb21wb25lbnRfaWQpCit2b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5KQogewogCWFjcGlfbmF0aXZlX3VpbnQgaSA9IDA7CiAJYWNwaV9uYXRpdmVfdWludCBqOwogCXUzMiB0ZW1wMzI7CiAJdTggYnVmX2NoYXI7CiAKLQkvKiBPbmx5IGR1bXAgdGhlIGJ1ZmZlciBpZiB0cmFjaW5nIGlzIGVuYWJsZWQgKi8KLQotCWlmICghKChBQ1BJX0xWX1RBQkxFUyAmIGFjcGlfZGJnX2xldmVsKSAmJgotCSAgICAgIChjb21wb25lbnRfaWQgJiBhY3BpX2RiZ19sYXllcikpKSB7Ci0JCXJldHVybjsKLQl9Ci0KIAlpZiAoKGNvdW50IDwgNCkgfHwgKGNvdW50ICYgMHgwMSkpIHsKIAkJZGlzcGxheSA9IERCX0JZVEVfRElTUExBWTsKIAl9CkBAIC01NDUsNiArNTMxLDcgQEAKIAkvKiBOYXN0eSBsaXR0bGUgZHVtcCBidWZmZXIgcm91dGluZSEgKi8KIAogCXdoaWxlIChpIDwgY291bnQpIHsKKwogCQkvKiBQcmludCBjdXJyZW50IG9mZnNldCAqLwogCiAJCWFjcGlfb3NfcHJpbnRmKCIlNi40WDogIiwgKHUzMikgaSk7CkBAIC01NTMsNiArNTQwLDcgQEAKIAogCQlmb3IgKGogPSAwOyBqIDwgMTY7KSB7CiAJCQlpZiAoaSArIGogPj0gY291bnQpIHsKKwogCQkJCS8qIER1bXAgZmlsbCBzcGFjZXMgKi8KIAogCQkJCWFjcGlfb3NfcHJpbnRmKCIlKnMiLCAoKGRpc3BsYXkgKiAyKSArIDEpLCAiICIpOwpAQCAtNTYxLDYgKzU0OSw3IEBACiAJCQl9CiAKIAkJCXN3aXRjaCAoZGlzcGxheSkgeworCQkJY2FzZSBEQl9CWVRFX0RJU1BMQVk6CiAJCQlkZWZhdWx0OgkvKiBEZWZhdWx0IGlzIEJZVEUgZGlzcGxheSAqLwogCiAJCQkJYWNwaV9vc19wcmludGYoIiUwMlggIiwgYnVmZmVyW2kgKyBqXSk7CkBAIC02MTgsMyArNjA3LDMxIEBACiAKIAlyZXR1cm47CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfZHVtcF9idWZmZXIKKyAqCisgKiBQQVJBTUVURVJTOiAgQnVmZmVyICAgICAgICAgICAgICAtIEJ1ZmZlciB0byBkdW1wCisgKiAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAtIEFtb3VudCB0byBkdW1wLCBpbiBieXRlcworICogICAgICAgICAgICAgIERpc3BsYXkgICAgICAgICAgICAgLSBCWVRFLCBXT1JELCBEV09SRCwgb3IgUVdPUkQgZGlzcGxheQorICogICAgICAgICAgICAgIGNvbXBvbmVudF9pRCAgICAgICAgLSBDYWxsZXIncyBjb21wb25lbnQgSUQKKyAqCisgKiBSRVRVUk46ICAgICAgTm9uZQorICoKKyAqIERFU0NSSVBUSU9OOiBHZW5lcmljIGR1bXAgYnVmZmVyIGluIGJvdGggaGV4IGFuZCBhc2NpaS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIGFjcGlfdXRfZHVtcF9idWZmZXIodTggKiBidWZmZXIsIHUzMiBjb3VudCwgdTMyIGRpc3BsYXksIHUzMiBjb21wb25lbnRfaWQpCit7CisKKwkvKiBPbmx5IGR1bXAgdGhlIGJ1ZmZlciBpZiB0cmFjaW5nIGlzIGVuYWJsZWQgKi8KKworCWlmICghKChBQ1BJX0xWX1RBQkxFUyAmIGFjcGlfZGJnX2xldmVsKSAmJgorCSAgICAgIChjb21wb25lbnRfaWQgJiBhY3BpX2RiZ19sYXllcikpKSB7CisJCXJldHVybjsKKwl9CisKKwlhY3BpX3V0X2R1bXBfYnVmZmVyMihidWZmZXIsIGNvdW50LCBkaXNwbGF5KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwppbmRleCAxZGI5Njk1Li42N2I5ZjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCkBAIC03Niw3ICs3Niw3IEBACiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX2Rlc2M7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqbmV4dF9kZXNjOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIoInV0X2RlbGV0ZV9pbnRlcm5hbF9vYmoiLCBvYmplY3QpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X2RlbGV0ZV9pbnRlcm5hbF9vYmosIG9iamVjdCk7CiAKIAlpZiAoIW9iamVjdCkgewogCQlyZXR1cm5fVk9JRDsKQEAgLTk2LDYgKzk2LDcgQEAKIAkJLyogRnJlZSB0aGUgYWN0dWFsIHN0cmluZyBidWZmZXIgKi8KIAogCQlpZiAoIShvYmplY3QtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpIHsKKwogCQkJLyogQnV0IG9ubHkgaWYgaXQgaXMgTk9UIGEgcG9pbnRlciBpbnRvIGFuIEFDUEkgdGFibGUgKi8KIAogCQkJb2JqX3BvaW50ZXIgPSBvYmplY3QtPnN0cmluZy5wb2ludGVyOwpAQCAtMTExLDYgKzExMiw3IEBACiAJCS8qIEZyZWUgdGhlIGFjdHVhbCBidWZmZXIgKi8KIAogCQlpZiAoIShvYmplY3QtPmNvbW1vbi5mbGFncyAmIEFPUE9CSl9TVEFUSUNfUE9JTlRFUikpIHsKKwogCQkJLyogQnV0IG9ubHkgaWYgaXQgaXMgTk9UIGEgcG9pbnRlciBpbnRvIGFuIEFDUEkgdGFibGUgKi8KIAogCQkJb2JqX3BvaW50ZXIgPSBvYmplY3QtPmJ1ZmZlci5wb2ludGVyOwpAQCAtMTk4LDExICsyMDAsMjIgQEAKIAkJCSAqLwogCQkJaGFuZGxlcl9kZXNjID0gb2JqZWN0LT5yZWdpb24uaGFuZGxlcjsKIAkJCWlmIChoYW5kbGVyX2Rlc2MpIHsKLQkJCQlpZiAoaGFuZGxlcl9kZXNjLT5hZGRyZXNzX3NwYWNlLgotCQkJCSAgICBoZmxhZ3MgJgorCQkJCWlmIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2UuaGFuZGxlcl9mbGFncyAmCiAJCQkJICAgIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEKSB7Ci0JCQkJCW9ial9wb2ludGVyID0KLQkJCQkJICAgIHNlY29uZF9kZXNjLT5leHRyYS5yZWdpb25fY29udGV4dDsKKworCQkJCQkvKiBEZWFjdGl2YXRlIHJlZ2lvbiBhbmQgZnJlZSByZWdpb24gY29udGV4dCAqLworCisJCQkJCWlmIChoYW5kbGVyX2Rlc2MtPmFkZHJlc3Nfc3BhY2Uuc2V0dXApIHsKKwkJCQkJCSh2b2lkKWhhbmRsZXJfZGVzYy0+CisJCQkJCQkgICAgYWRkcmVzc19zcGFjZS5zZXR1cChvYmplY3QsCisJCQkJCQkJCQlBQ1BJX1JFR0lPTl9ERUFDVElWQVRFLAorCQkJCQkJCQkJaGFuZGxlcl9kZXNjLT4KKwkJCQkJCQkJCWFkZHJlc3Nfc3BhY2UuCisJCQkJCQkJCQljb250ZXh0LAorCQkJCQkJCQkJJnNlY29uZF9kZXNjLT4KKwkJCQkJCQkJCWV4dHJhLgorCQkJCQkJCQkJcmVnaW9uX2NvbnRleHQpOworCQkJCQl9CiAJCQkJfQogCiAJCQkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGhhbmRsZXJfZGVzYyk7CkBAIC0yMzQsNyArMjQ3LDcgQEAKIAlpZiAob2JqX3BvaW50ZXIpIHsKIAkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9BTExPQ0FUSU9OUywKIAkJCQkgICJEZWxldGluZyBPYmplY3QgU3VicHRyICVwXG4iLCBvYmpfcG9pbnRlcikpOwotCQlBQ1BJX01FTV9GUkVFKG9ial9wb2ludGVyKTsKKwkJQUNQSV9GUkVFKG9ial9wb2ludGVyKTsKIAl9CiAKIAkvKiBOb3cgdGhlIG9iamVjdCBjYW4gYmUgc2FmZWx5IGRlbGV0ZWQgKi8KQEAgLTI2Myw3ICsyNzYsNyBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKippbnRlcm5hbF9vYmo7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfaW50ZXJuYWxfb2JqZWN0X2xpc3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2RlbGV0ZV9pbnRlcm5hbF9vYmplY3RfbGlzdCk7CiAKIAkvKiBXYWxrIHRoZSBudWxsLXRlcm1pbmF0ZWQgaW50ZXJuYWwgbGlzdCAqLwogCkBAIC0yNzMsNyArMjg2LDcgQEAKIAogCS8qIEZyZWUgdGhlIGNvbWJpbmVkIHBhcmFtZXRlciBwb2ludGVyIGxpc3QgYW5kIG9iamVjdCBhcnJheSAqLwogCi0JQUNQSV9NRU1fRlJFRShvYmpfbGlzdCk7CisJQUNQSV9GUkVFKG9ial9saXN0KTsKIAlyZXR1cm5fVk9JRDsKIH0KIApAQCAtMjk2LDcgKzMwOSw3IEBACiAJdTE2IGNvdW50OwogCXUxNiBuZXdfY291bnQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3VwZGF0ZV9yZWZfY291bnQiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfdXBkYXRlX3JlZl9jb3VudCk7CiAKIAlpZiAoIW9iamVjdCkgewogCQlyZXR1cm47CkBAIC0zMDYsMTEgKzMxOSw5IEBACiAJbmV3X2NvdW50ID0gY291bnQ7CiAKIAkvKgotCSAqIFBlcmZvcm0gdGhlIHJlZmVyZW5jZSBjb3VudCBhY3Rpb24KLQkgKiAoaW5jcmVtZW50LCBkZWNyZW1lbnQsIG9yIGZvcmNlIGRlbGV0ZSkKKwkgKiBQZXJmb3JtIHRoZSByZWZlcmVuY2UgY291bnQgYWN0aW9uIChpbmNyZW1lbnQsIGRlY3JlbWVudCwgZm9yY2UgZGVsZXRlKQogCSAqLwogCXN3aXRjaCAoYWN0aW9uKSB7Ci0KIAljYXNlIFJFRl9JTkNSRU1FTlQ6CiAKIAkJbmV3X2NvdW50Kys7CkBAIC0zNDcsNyArMzU4LDYgQEAKIAkJaWYgKG5ld19jb3VudCA9PSAwKSB7CiAJCQlhY3BpX3V0X2RlbGV0ZV9pbnRlcm5hbF9vYmoob2JqZWN0KTsKIAkJfQotCiAJCWJyZWFrOwogCiAJY2FzZSBSRUZfRk9SQ0VfREVMRVRFOgpAQCAtMzcyLDEzICszODIsMTAgQEAKIAkgKiAoQSBkZWxldGVkIG9iamVjdCB3aWxsIGhhdmUgYSBodWdlIHJlZmVyZW5jZSBjb3VudCkKIAkgKi8KIAlpZiAoY291bnQgPiBBQ1BJX01BWF9SRUZFUkVOQ0VfQ09VTlQpIHsKLQogCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sCi0JCQkgICAgICAiTGFyZ2UgUmVmZXJlbmNlIENvdW50ICglWCkgaW4gb2JqZWN0ICVwIiwKLQkJCSAgICAgIGNvdW50LCBvYmplY3QpKTsKKwkJCSAgICAgICJMYXJnZSBSZWZlcmVuY2UgQ291bnQgKCVYKSBpbiBvYmplY3QgJXAiLCBjb3VudCwKKwkJCSAgICAgIG9iamVjdCkpOwogCX0KLQotCXJldHVybjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQwNCw3ICs0MTEsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogYWNwaV9zdGF0dXMKLWFjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqIG9iamVjdCwgdTE2IGFjdGlvbikKK2FjcGlfdXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0LCB1MTYgYWN0aW9uKQogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGVfbGlzdCA9IE5VTEw7CkBAIC00MTIsOSArNDE5LDEwIEBACiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfdXBkYXRlX29iamVjdF9yZWZlcmVuY2UiLCBvYmplY3QpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKHV0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlLCBvYmplY3QpOwogCiAJd2hpbGUgKG9iamVjdCkgeworCiAJCS8qIE1ha2Ugc3VyZSB0aGF0IHRoaXMgaXNuJ3QgYSBuYW1lc3BhY2UgaGFuZGxlICovCiAKIAkJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShvYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CkBAIC01MDcsMTEgKzUxNSwxMSBAQAogCiAJCWNhc2UgQUNQSV9UWVBFX1JFR0lPTjoKIAkJZGVmYXVsdDoKLQkJCWJyZWFrOwkvKiBObyBzdWJvYmplY3RzICovCisJCQlicmVhazsJLyogTm8gc3Vib2JqZWN0cyBmb3IgYWxsIG90aGVyIHR5cGVzICovCiAJCX0KIAogCQkvKgotCQkgKiBOb3cgd2UgY2FuIHVwZGF0ZSB0aGUgY291bnQgaW4gdGhlIG1haW4gb2JqZWN0LiAgVGhpcyBjYW4gb25seQorCQkgKiBOb3cgd2UgY2FuIHVwZGF0ZSB0aGUgY291bnQgaW4gdGhlIG1haW4gb2JqZWN0LiBUaGlzIGNhbiBvbmx5CiAJCSAqIGhhcHBlbiBhZnRlciB3ZSB1cGRhdGUgdGhlIHN1Yi1vYmplY3RzIGluIGNhc2UgdGhpcyBjYXVzZXMgdGhlCiAJCSAqIG1haW4gb2JqZWN0IHRvIGJlIGRlbGV0ZWQuCiAJCSAqLwpAQCAtNTU2LDcgKzU2NCw3IEBACiB2b2lkIGFjcGlfdXRfYWRkX3JlZmVyZW5jZSh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3QpCiB7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfYWRkX3JlZmVyZW5jZSIsIG9iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfYWRkX3JlZmVyZW5jZSwgb2JqZWN0KTsKIAogCS8qIEVuc3VyZSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBvYmplY3QgKi8KIApAQCAtNTg5LDExICs1OTcsMTEgQEAKIHZvaWQgYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9yZW1vdmVfcmVmZXJlbmNlIiwgb2JqZWN0KTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9yZW1vdmVfcmVmZXJlbmNlLCBvYmplY3QpOwogCiAJLyoKLQkgKiBBbGxvdyBhIE5VTEwgcG9pbnRlciB0byBiZSBwYXNzZWQgaW4sIGp1c3QgaWdub3JlIGl0LiAgVGhpcyBzYXZlcwotCSAqIGVhY2ggY2FsbGVyIGZyb20gaGF2aW5nIHRvIGNoZWNrLiAgQWxzbywgaWdub3JlIE5TIG5vZGVzLgorCSAqIEFsbG93IGEgTlVMTCBwb2ludGVyIHRvIGJlIHBhc3NlZCBpbiwganVzdCBpZ25vcmUgaXQuIFRoaXMgc2F2ZXMKKwkgKiBlYWNoIGNhbGxlciBmcm9tIGhhdmluZyB0byBjaGVjay4gQWxzbywgaWdub3JlIE5TIG5vZGVzLgogCSAqCiAJICovCiAJaWYgKCFvYmplY3QgfHwKQEAgLTYxMyw3ICs2MjEsNyBAQAogCiAJLyoKIAkgKiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCwgYW5kIG9ubHkgYWN0dWFsbHkgZGVsZXRlIHRoZSBvYmplY3QKLQkgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgMC4gIChNdXN0IGFsc28gZGVjcmVtZW50IHRoZSByZWYgY291bnQKKwkgKiBpZiB0aGUgcmVmZXJlbmNlIGNvdW50IGJlY29tZXMgMC4gKE11c3QgYWxzbyBkZWNyZW1lbnQgdGhlIHJlZiBjb3VudAogCSAqIG9mIGFsbCBzdWJvYmplY3RzISkKIAkgKi8KIAkodm9pZClhY3BpX3V0X3VwZGF0ZV9vYmplY3RfcmVmZXJlbmNlKG9iamVjdCwgUkVGX0RFQ1JFTUVOVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGV2YWwuYwppbmRleCAxMDZjYzk3Li5kNmQ3MTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZXZhbC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRldmFsLmMKQEAgLTU2LDYgKzU2LDM0IEBACiBhY3BpX3V0X3RyYW5zbGF0ZV9vbmVfY2lkKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjLAogCQkJICBzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkICpvbmVfY2lkKTsKIAorLyoKKyAqIFN0cmluZ3Mgc3VwcG9ydGVkIGJ5IHRoZSBfT1NJIHByZWRlZmluZWQgKGludGVybmFsKSBtZXRob2QuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICphY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkW10gPSB7CisJLyogT3BlcmF0aW5nIFN5c3RlbSBWZW5kb3IgU3RyaW5ncyAqLworCisJIkxpbnV4IiwKKwkiV2luZG93cyAyMDAwIiwKKwkiV2luZG93cyAyMDAxIiwKKwkiV2luZG93cyAyMDAxIFNQMCIsCisJIldpbmRvd3MgMjAwMSBTUDEiLAorCSJXaW5kb3dzIDIwMDEgU1AyIiwKKwkiV2luZG93cyAyMDAxIFNQMyIsCisJIldpbmRvd3MgMjAwMSBTUDQiLAorCSJXaW5kb3dzIDIwMDEuMSIsCisJIldpbmRvd3MgMjAwMS4xIFNQMSIsCS8qIEFkZGVkIDAzLzIwMDYgKi8KKwkiV2luZG93cyAyMDA2IiwJCS8qIEFkZGVkIDAzLzIwMDYgKi8KKworCS8qIEZlYXR1cmUgR3JvdXAgU3RyaW5ncyAqLworCisJIkV4dGVuZGVkIEFkZHJlc3MgU3BhY2UgRGVzY3JpcHRvciIKKwkgICAgLyoKKwkgICAgICogQWxsICJvcHRpb25hbCIgZmVhdHVyZSBncm91cCBzdHJpbmdzIChmZWF0dXJlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZAorCSAgICAgKiBieSB0aGUgaG9zdCkgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSBob3N0IHZlcnNpb24gb2YKKwkgICAgICogYWNwaV9vc192YWxpZGF0ZV9pbnRlcmZhY2UgYW5kIHNob3VsZCBub3QgYmUgYWRkZWQgaGVyZS4KKwkgICAgICovCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X29zaV9pbXBsZW1lbnRhdGlvbgpAQCAtNjQsMTggKzkyLDE4IEBACiAgKgogICogUkVUVVJOOiAgICAgIFN0YXR1cwogICoKLSAqIERFU0NSSVBUSU9OOiBJbXBsZW1lbnRhdGlvbiBvZiBfT1NJIHByZWRlZmluZWQgY29udHJvbCBtZXRob2QKLSAqICAgICAgICAgICAgICBTdXBwb3J0ZWQgPSBfT1NJIChTdHJpbmcpCisgKiBERVNDUklQVElPTjogSW1wbGVtZW50YXRpb24gb2YgdGhlIF9PU0kgcHJlZGVmaW5lZCBjb250cm9sIG1ldGhvZAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIGFjcGlfc3RhdHVzIGFjcGlfdXRfb3NpX2ltcGxlbWVudGF0aW9uKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpCiB7CisJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0cmluZ19kZXNjOwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X29zaV9pbXBsZW1lbnRhdGlvbiIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfb3NpX2ltcGxlbWVudGF0aW9uKTsKIAogCS8qIFZhbGlkYXRlIHRoZSBzdHJpbmcgaW5wdXQgYXJndW1lbnQgKi8KIApAQCAtODQsMjggKzExMiw0NyBAQAogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfVFlQRSk7CiAJfQogCi0JLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCAoRGVmYXVsdCB2YWx1ZSA9IDApICovCisJLyogQ3JlYXRlIGEgcmV0dXJuIG9iamVjdCAqLwogCiAJcmV0dXJuX2Rlc2MgPSBhY3BpX3V0X2NyZWF0ZV9pbnRlcm5hbF9vYmplY3QoQUNQSV9UWVBFX0lOVEVHRVIpOwogCWlmICghcmV0dXJuX2Rlc2MpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQogCi0JLyogQ29tcGFyZSBpbnB1dCBzdHJpbmcgdG8gdGFibGUgb2Ygc3VwcG9ydGVkIHN0cmluZ3MgKi8KKwkvKiBEZWZhdWx0IHJldHVybiB2YWx1ZSBpcyBTVVBQT1JURUQgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9PU0lfU1RSSU5HUzsgaSsrKSB7Ci0JCWlmICghQUNQSV9TVFJDTVAoc3RyaW5nX2Rlc2MtPnN0cmluZy5wb2ludGVyLAotCQkJCSBBQ1BJX0NBU1RfUFRSKGNoYXIsCi0JCQkJCSAgICAgICBhY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tpXSkpKQotCQl7Ci0JCQkvKiBUaGlzIHN0cmluZyBpcyBzdXBwb3J0ZWQgKi8KKwlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IEFDUElfVUlOVDMyX01BWDsKKwl3YWxrX3N0YXRlLT5yZXR1cm5fZGVzYyA9IHJldHVybl9kZXNjOwogCi0JCQlyZXR1cm5fZGVzYy0+aW50ZWdlci52YWx1ZSA9IDB4RkZGRkZGRkY7Ci0JCQlicmVhazsKKwkvKiBDb21wYXJlIGlucHV0IHN0cmluZyB0byBzdGF0aWMgdGFibGUgb2Ygc3VwcG9ydGVkIGludGVyZmFjZXMgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX0FSUkFZX0xFTkdUSChhY3BpX2ludGVyZmFjZXNfc3VwcG9ydGVkKTsgaSsrKSB7CisJCWlmICghQUNQSV9TVFJDTVAKKwkJICAgIChzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIsCisJCSAgICAgYWNwaV9pbnRlcmZhY2VzX3N1cHBvcnRlZFtpXSkpIHsKKworCQkJLyogVGhlIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQgKi8KKworCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKIAkJfQogCX0KIAotCXdhbGtfc3RhdGUtPnJldHVybl9kZXNjID0gcmV0dXJuX2Rlc2M7CisJLyoKKwkgKiBEaWQgbm90IG1hdGNoIHRoZSBzdHJpbmcgaW4gdGhlIHN0YXRpYyB0YWJsZSwgY2FsbCB0aGUgaG9zdCBPU0wgdG8KKwkgKiBjaGVjayBmb3IgYSBtYXRjaCB3aXRoIG9uZSBvZiB0aGUgb3B0aW9uYWwgc3RyaW5ncyAoc3VjaCBhcworCSAqICJNb2R1bGUgRGV2aWNlIiwgIjMuMCBUaGVybWFsIE1vZGVsIiwgZXRjLikKKwkgKi8KKwlzdGF0dXMgPSBhY3BpX29zX3ZhbGlkYXRlX2ludGVyZmFjZShzdHJpbmdfZGVzYy0+c3RyaW5nLnBvaW50ZXIpOworCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCisJCS8qIFRoZSBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkICovCisKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0NUUkxfVEVSTUlOQVRFKTsKKwl9CisKKwkvKiBUaGUgaW50ZXJmYWNlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKworCXJldHVybl9kZXNjLT5pbnRlZ2VyLnZhbHVlID0gMDsKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQ1RSTF9URVJNSU5BVEUpOwogfQogCkBAIC0xMzQsMTkgKzE4MSwyNiBAQAogCQkJdTMyIGV4cGVjdGVkX3JldHVybl9idHlwZXMsCiAJCQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcmV0dXJuX2Rlc2MpCiB7Ci0Jc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gaW5mbzsKKwlzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAl1MzIgcmV0dXJuX2J0eXBlOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZXZhbHVhdGVfb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9ldmFsdWF0ZV9vYmplY3QpOwogCi0JaW5mby5ub2RlID0gcHJlZml4X25vZGU7Ci0JaW5mby5wYXJhbWV0ZXJzID0gTlVMTDsKLQlpbmZvLnBhcmFtZXRlcl90eXBlID0gQUNQSV9QQVJBTV9BUkdTOworCS8qIEFsbG9jYXRlIHRoZSBldmFsdWF0aW9uIGluZm9ybWF0aW9uIGJsb2NrICovCisKKwlpbmZvID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoc2l6ZW9mKHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8pKTsKKwlpZiAoIWluZm8pIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CisJfQorCisJaW5mby0+cHJlZml4X25vZGUgPSBwcmVmaXhfbm9kZTsKKwlpbmZvLT5wYXRobmFtZSA9IHBhdGg7CisJaW5mby0+cGFyYW1ldGVyX3R5cGUgPSBBQ1BJX1BBUkFNX0FSR1M7CiAKIAkvKiBFdmFsdWF0ZSB0aGUgb2JqZWN0L21ldGhvZCAqLwogCi0Jc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZV9yZWxhdGl2ZShwYXRoLCAmaW5mbyk7CisJc3RhdHVzID0gYWNwaV9uc19ldmFsdWF0ZShpbmZvKTsKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJaWYgKHN0YXR1cyA9PSBBRV9OT1RfRk9VTkQpIHsKIAkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVhFQywKQEAgLTE1OCwyNSArMjEyLDI1IEBACiAJCQkJCSAgcHJlZml4X25vZGUsIHBhdGgsIHN0YXR1cyk7CiAJCX0KIAotCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIERpZCB3ZSBnZXQgYSByZXR1cm4gb2JqZWN0PyAqLwogCi0JaWYgKCFpbmZvLnJldHVybl9vYmplY3QpIHsKKwlpZiAoIWluZm8tPnJldHVybl9vYmplY3QpIHsKIAkJaWYgKGV4cGVjdGVkX3JldHVybl9idHlwZXMpIHsKIAkJCUFDUElfRVJST1JfTUVUSE9EKCJObyBvYmplY3Qgd2FzIHJldHVybmVkIGZyb20iLAogCQkJCQkgIHByZWZpeF9ub2RlLCBwYXRoLCBBRV9OT1RfRVhJU1QpOwogCi0JCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfTk9UX0VYSVNUKTsKKwkJCXN0YXR1cyA9IEFFX05PVF9FWElTVDsKIAkJfQogCi0JCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBNYXAgdGhlIHJldHVybiBvYmplY3QgdHlwZSB0byB0aGUgYml0bWFwcGVkIHR5cGUgKi8KIAotCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby5yZXR1cm5fb2JqZWN0KSkgeworCXN3aXRjaCAoQUNQSV9HRVRfT0JKRUNUX1RZUEUoaW5mby0+cmV0dXJuX29iamVjdCkpIHsKIAljYXNlIEFDUElfVFlQRV9JTlRFR0VSOgogCQlyZXR1cm5fYnR5cGUgPSBBQ1BJX0JUWVBFX0lOVEVHRVI7CiAJCWJyZWFrOwpAQCAtMjA0LDggKzI1OCw4IEBACiAJCSAqIGhhcHBlbiBmcmVxdWVudGx5IGlmIHRoZSAiaW1wbGljaXQgcmV0dXJuIiBmZWF0dXJlIGlzIGVuYWJsZWQuCiAJCSAqIEp1c3QgZGVsZXRlIHRoZSByZXR1cm4gb2JqZWN0IGFuZCByZXR1cm4gQUVfT0suCiAJCSAqLwotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkJYWNwaV91dF9yZW1vdmVfcmVmZXJlbmNlKGluZm8tPnJldHVybl9vYmplY3QpOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogSXMgdGhlIHJldHVybiBvYmplY3Qgb25lIG9mIHRoZSBleHBlY3RlZCB0eXBlcz8gKi8KQEAgLTIxNywxOSArMjcxLDIzIEBACiAJCUFDUElfRVJST1IoKEFFX0lORk8sCiAJCQkgICAgIlR5cGUgcmV0dXJuZWQgZnJvbSAlcyB3YXMgaW5jb3JyZWN0OiAlcywgZXhwZWN0ZWQgQnR5cGVzOiAlWCIsCiAJCQkgICAgcGF0aCwKLQkJCSAgICBhY3BpX3V0X2dldF9vYmplY3RfdHlwZV9uYW1lKGluZm8ucmV0dXJuX29iamVjdCksCisJCQkgICAgYWNwaV91dF9nZXRfb2JqZWN0X3R5cGVfbmFtZShpbmZvLT5yZXR1cm5fb2JqZWN0KSwKIAkJCSAgICBleHBlY3RlZF9yZXR1cm5fYnR5cGVzKSk7CiAKIAkJLyogT24gZXJyb3IgZXhpdCwgd2UgbXVzdCBkZWxldGUgdGhlIHJldHVybiBvYmplY3QgKi8KIAotCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby5yZXR1cm5fb2JqZWN0KTsKLQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX1RZUEUpOworCQlhY3BpX3V0X3JlbW92ZV9yZWZlcmVuY2UoaW5mby0+cmV0dXJuX29iamVjdCk7CisJCXN0YXR1cyA9IEFFX1RZUEU7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBPYmplY3QgdHlwZSBpcyBPSywgcmV0dXJuIGl0ICovCiAKLQkqcmV0dXJuX2Rlc2MgPSBpbmZvLnJldHVybl9vYmplY3Q7Ci0JcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKKwkqcmV0dXJuX2Rlc2MgPSBpbmZvLT5yZXR1cm5fb2JqZWN0OworCisgICAgICBjbGVhbnVwOgorCUFDUElfRlJFRShpbmZvKTsKKwlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI1Nyw3ICszMTUsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2V2YWx1YXRlX251bWVyaWNfb2JqZWN0Iik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9ldmFsdWF0ZV9udW1lcmljX29iamVjdCk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgb2JqZWN0X25hbWUsCiAJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7CkBAIC0zMzMsNyArMzkxLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0hJRCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXhlY3V0ZV9ISUQpOwogCiAJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19ISUQsCiAJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIgfCBBQ1BJX0JUWVBFX1NUUklORywKQEAgLTM0Myw2ICs0MDEsNyBAQAogCX0KIAogCWlmIChBQ1BJX0dFVF9PQkpFQ1RfVFlQRShvYmpfZGVzYykgPT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKKwogCQkvKiBDb252ZXJ0IHRoZSBOdW1lcmljIEhJRCB0byBzdHJpbmcgKi8KIAogCQlhY3BpX2V4X2Vpc2FfaWRfdG9fc3RyaW5nKCh1MzIpIG9ial9kZXNjLT5pbnRlZ2VyLnZhbHVlLApAQCAtNDM2LDcgKzQ5NSw3IEBACiAJc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0ICpjaWRfbGlzdDsKIAlhY3BpX25hdGl2ZV91aW50IGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX0NJRCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXhlY3V0ZV9DSUQpOwogCiAJLyogRXZhbHVhdGUgdGhlIF9DSUQgbWV0aG9kIGZvciB0aGlzIGRldmljZSAqLwogCkBAIC00NTksNyArNTE4LDcgQEAKIAlzaXplID0gKCgoY291bnQgLSAxKSAqIHNpemVvZihzdHJ1Y3QgYWNwaV9jb21wYXRpYmxlX2lkKSkgKwogCQlzaXplb2Yoc3RydWN0IGFjcGlfY29tcGF0aWJsZV9pZF9saXN0KSk7CiAKLQljaWRfbGlzdCA9IEFDUElfTUVNX0NBTExPQ0FURSgoYWNwaV9zaXplKSBzaXplKTsKKwljaWRfbGlzdCA9IEFDUElfQUxMT0NBVEVfWkVST0VEKChhY3BpX3NpemUpIHNpemUpOwogCWlmICghY2lkX2xpc3QpIHsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX05PX01FTU9SWSk7CiAJfQpAQCAtNDc5LDYgKzUzOCw3IEBACiAJLyogVGhlIF9DSUQgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgQ0lEIG9yIGEgcGFja2FnZSAobGlzdCkgb2YgQ0lEcyAqLwogCiAJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgeworCiAJCS8qIFRyYW5zbGF0ZSBlYWNoIHBhY2thZ2UgZWxlbWVudCAqLwogCiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC00OTksNyArNTU5LDcgQEAKIAkvKiBDbGVhbnVwIG9uIGVycm9yICovCiAKIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKLQkJQUNQSV9NRU1fRlJFRShjaWRfbGlzdCk7CisJCUFDUElfRlJFRShjaWRfbGlzdCk7CiAJfSBlbHNlIHsKIAkJKnJldHVybl9jaWRfbGlzdCA9IGNpZF9saXN0OwogCX0KQEAgLTUzMyw3ICs1OTMsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2V4ZWN1dGVfVUlEIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9leGVjdXRlX1VJRCk7CiAKIAlzdGF0dXMgPSBhY3BpX3V0X2V2YWx1YXRlX29iamVjdChkZXZpY2Vfbm9kZSwgTUVUSE9EX05BTUVfX1VJRCwKIAkJCQkJIEFDUElfQlRZUEVfSU5URUdFUiB8IEFDUElfQlRZUEVfU1RSSU5HLApAQCAtNTQzLDYgKzYwMyw3IEBACiAJfQogCiAJaWYgKEFDUElfR0VUX09CSkVDVF9UWVBFKG9ial9kZXNjKSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCiAJCS8qIENvbnZlcnQgdGhlIE51bWVyaWMgVUlEIHRvIHN0cmluZyAqLwogCiAJCWFjcGlfZXhfdW5zaWduZWRfaW50ZWdlcl90b19zdHJpbmcob2JqX2Rlc2MtPmludGVnZXIudmFsdWUsCkBAIC01ODIsNyArNjQzLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYzsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX1NUQSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZXhlY3V0ZV9TVEEpOwogCiAJc3RhdHVzID0gYWNwaV91dF9ldmFsdWF0ZV9vYmplY3QoZGV2aWNlX25vZGUsIE1FVEhPRF9OQU1FX19TVEEsCiAJCQkJCSBBQ1BJX0JUWVBFX0lOVEVHRVIsICZvYmpfZGVzYyk7CkBAIC02MzIsNyArNjkzLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9leGVjdXRlX1N4ZHMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2V4ZWN1dGVfc3hkcyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCWhpZ2hlc3RbaV0gPSAweEZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGdsb2JhbC5jCmluZGV4IGZmZDEzMzguLmU1OTk5YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRnbG9iYWwuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0Z2xvYmFsLmMKQEAgLTQzLDcgKzQzLDYgQEAKIAogI2RlZmluZSBERUZJTkVfQUNQSV9HTE9CQUxTCiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjbmFtZXNwLmg+CiAKQEAgLTExOSw2ICsxMTgsNyBAQAogCX0KIAogCWlmICghZXhjZXB0aW9uKSB7CisKIAkJLyogRXhjZXB0aW9uIGNvZGUgd2FzIG5vdCByZWNvZ25pemVkICovCiAKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKQEAgLTE0MywxMiArMTQzLDEwIEBACiAKIC8qIERlYnVnIHN3aXRjaCAtIGxldmVsIGFuZCB0cmFjZSBtYXNrICovCiB1MzIgYWNwaV9kYmdfbGV2ZWwgPSBBQ1BJX0RFQlVHX0RFRkFVTFQ7Ci1FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xldmVsKTsKIAogLyogRGVidWcgc3dpdGNoIC0gbGF5ZXIgKGNvbXBvbmVudCkgbWFzayAqLwogCiB1MzIgYWNwaV9kYmdfbGF5ZXIgPSBBQ1BJX0NPTVBPTkVOVF9ERUZBVUxUIHwgQUNQSV9BTExfRFJJVkVSUzsKLUVYUE9SVF9TWU1CT0woYWNwaV9kYmdfbGF5ZXIpOwogdTMyIGFjcGlfZ2JsX25lc3RpbmdfbGV2ZWwgPSAwOwogCiAvKiBEZWJ1Z2dlciBnbG9iYWxzICovCkBAIC0xODMsMjggKzE4MSw2IEBACiAJIl9TNEQiCiB9OwogCi0vKgotICogU3RyaW5ncyBzdXBwb3J0ZWQgYnkgdGhlIF9PU0kgcHJlZGVmaW5lZCAoaW50ZXJuYWwpIG1ldGhvZC4KLSAqIFdoZW4gYWRkaW5nIHN0cmluZ3MsIGJlIHN1cmUgdG8gdXBkYXRlIEFDUElfTlVNX09TSV9TVFJJTkdTLgotICovCi1jb25zdCBjaGFyICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU10gPSB7Ci0JLyogT3BlcmF0aW5nIFN5c3RlbSBWZW5kb3IgU3RyaW5ncyAqLwotCi0JIkxpbnV4IiwKLQkiV2luZG93cyAyMDAwIiwKLQkiV2luZG93cyAyMDAxIiwKLQkiV2luZG93cyAyMDAxLjEiLAotCSJXaW5kb3dzIDIwMDEgU1AwIiwKLQkiV2luZG93cyAyMDAxIFNQMSIsCi0JIldpbmRvd3MgMjAwMSBTUDIiLAotCSJXaW5kb3dzIDIwMDEgU1AzIiwKLQkiV2luZG93cyAyMDAxIFNQNCIsCi0KLQkvKiBGZWF0dXJlIEdyb3VwIFN0cmluZ3MgKi8KLQotCSJFeHRlbmRlZCBBZGRyZXNzIFNwYWNlIERlc2NyaXB0b3IiCi19OwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5hbWVzcGFjZSBnbG9iYWxzCkBAIC0zMTcsOSArMjkzLDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9saXN0IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKK3N0cnVjdCBhY3BpX3RhYmxlX2xpc3QgYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9JRF9NQVggKyAxXTsKIAotc3RydWN0IGFjcGlfdGFibGVfc3VwcG9ydCBhY3BpX2dibF90YWJsZV9kYXRhW05VTV9BQ1BJX1RBQkxFX1RZUEVTXSA9IHsKK3N0cnVjdCBhY3BpX3RhYmxlX3N1cHBvcnQgYWNwaV9nYmxfdGFibGVfZGF0YVtBQ1BJX1RBQkxFX0lEX01BWCArIDFdID0gewogCS8qKioqKioqKioqKiAgICBOYW1lLCAgIFNpZ25hdHVyZSwgR2xvYmFsIHR5cGVkIHBvaW50ZXIgICAgIFNpZ25hdHVyZSBzaXplLCAgICAgIFR5cGUgICAgICAgICAgICAgICAgICBIb3cgbWFueSBhbGxvd2VkPywgICAgQ29udGFpbnMgdmFsaWQgQU1MPyAqLwogCiAJLyogUlNEUCAwICovIHtSU0RQX05BTUUsIFJTRFBfU0lHLCBOVUxMLCBzaXplb2YoUlNEUF9TSUcpIC0gMSwKQEAgLTQ2Nyw3ICs0NDMsNiBAQAogLyogUmVnaW9uIHR5cGUgZGVjb2RpbmcgKi8KIAogY29uc3QgY2hhciAqYWNwaV9nYmxfcmVnaW9uX3R5cGVzW0FDUElfTlVNX1BSRURFRklORURfUkVHSU9OU10gPSB7Ci0vKiEgW0JlZ2luXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAoa2VlcCB0aGVzZSBBU0wgS2V5d29yZHMgYXMtaXMpICovCiAJIlN5c3RlbU1lbW9yeSIsCiAJIlN5c3RlbUlPIiwKIAkiUENJX0NvbmZpZyIsCkBAIC00NzYsMTYgKzQ1MSwxNSBAQAogCSJDTU9TIiwKIAkiUENJQkFSVGFyZ2V0IiwKIAkiRGF0YVRhYmxlIgotLyohIFtFbmRdIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uICEqLwogfTsKIAogY2hhciAqYWNwaV91dF9nZXRfcmVnaW9uX25hbWUodTggc3BhY2VfaWQpCiB7CiAKIAlpZiAoc3BhY2VfaWQgPj0gQUNQSV9VU0VSX1JFR0lPTl9CRUdJTikgewotCQlyZXR1cm4gKCJ1c2VyX2RlZmluZWRfcmVnaW9uIik7CisJCXJldHVybiAoIlVzZXJEZWZpbmVkUmVnaW9uIik7CiAJfSBlbHNlIGlmIChzcGFjZV9pZCA+PSBBQ1BJX05VTV9QUkVERUZJTkVEX1JFR0lPTlMpIHsKLQkJcmV0dXJuICgiaW52YWxpZF9zcGFjZV9pZCIpOworCQlyZXR1cm4gKCJJbnZhbGlkU3BhY2VJZCIpOwogCX0KIAogCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9yZWdpb25fdHlwZXNbc3BhY2VfaWRdKSk7CkBAIC01MDYsMjAgKzQ4MCwxOCBAQAogLyogRXZlbnQgdHlwZSBkZWNvZGluZyAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfZXZlbnRfdHlwZXNbQUNQSV9OVU1fRklYRURfRVZFTlRTXSA9IHsKLS8qISBbQmVnaW5dIG5vIHNvdXJjZSBjb2RlIHRyYW5zbGF0aW9uIChrZWVwIHRoZXNlIHN0cmluZ3MgYXMtaXMpICovCiAJIlBNX1RpbWVyIiwKIAkiR2xvYmFsTG9jayIsCiAJIlBvd2VyQnV0dG9uIiwKIAkiU2xlZXBCdXR0b24iLAogCSJSZWFsVGltZUNsb2NrIiwKLS8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIH07CiAKIGNoYXIgKmFjcGlfdXRfZ2V0X2V2ZW50X25hbWUodTMyIGV2ZW50X2lkKQogewogCiAJaWYgKGV2ZW50X2lkID4gQUNQSV9FVkVOVF9NQVgpIHsKLQkJcmV0dXJuICgiaW52YWxpZF9ldmVudF9pRCIpOworCQlyZXR1cm4gKCJJbnZhbGlkRXZlbnRJRCIpOwogCX0KIAogCXJldHVybiAoQUNQSV9DQVNUX1BUUihjaGFyLCBhY3BpX2dibF9ldmVudF90eXBlc1tldmVudF9pZF0pKTsKQEAgLTU1MCw3ICs1MjIsNiBAQAogLyogUHJpbnRhYmxlIG5hbWVzIG9mIHRoZSBBQ1BJIG9iamVjdCB0eXBlcyAqLwogCiBzdGF0aWMgY29uc3QgY2hhciAqYWNwaV9nYmxfbnNfdHlwZV9uYW1lc1tdID0gewotLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlc2Ugc3RyaW5ncyBhcy1pcykgKi8KIAkvKiAwMCAqLyAiVW50eXBlZCIsCiAJLyogMDEgKi8gIkludGVnZXIiLAogCS8qIDAyICovICJTdHJpbmciLApAQCAtNTgyLDcgKzU1Myw2IEBACiAJLyogMjggKi8gIkV4dHJhIiwKIAkvKiAyOSAqLyAiRGF0YSIsCiAJLyogMzAgKi8gIkludmFsaWQiCi0vKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiB9OwogCiBjaGFyICphY3BpX3V0X2dldF90eXBlX25hbWUoYWNwaV9vYmplY3RfdHlwZSB0eXBlKQpAQCAtNjM1LDE0ICs2MDUsMTQgQEAKIAogCS8qIERlc2NyaXB0b3IgbXVzdCBiZSBhIG5hbWVzcGFjZSBub2RlICovCiAKLQlpZiAobm9kZS0+ZGVzY3JpcHRvciAhPSBBQ1BJX0RFU0NfVFlQRV9OQU1FRCkgeworCWlmIChBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUobm9kZSkgIT0gQUNQSV9ERVNDX1RZUEVfTkFNRUQpIHsKIAkJcmV0dXJuICgiIyMjIyIpOwogCX0KIAogCS8qIE5hbWUgbXVzdCBiZSBhIHZhbGlkIEFDUEkgbmFtZSAqLwogCiAJaWYgKCFhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZShub2RlLT5uYW1lLmludGVnZXIpKSB7Ci0JCXJldHVybiAoIj8/Pz8iKTsKKwkJbm9kZS0+bmFtZS5pbnRlZ2VyID0gYWNwaV91dF9yZXBhaXJfbmFtZShub2RlLT5uYW1lLmludGVnZXIpOwogCX0KIAogCS8qIFJldHVybiB0aGUgbmFtZSAqLwpAQCAtNjY1LDcgKzYzNSw2IEBACiAvKiBQcmludGFibGUgbmFtZXMgb2Ygb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KIAogc3RhdGljIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2Rlc2NfdHlwZV9uYW1lc1tdID0gewotLyohIFtCZWdpbl0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gKGtlZXAgdGhlc2UgQVNMIEtleXdvcmRzIGFzLWlzKSAqLwogCS8qIDAwICovICJJbnZhbGlkIiwKIAkvKiAwMSAqLyAiQ2FjaGVkIiwKIAkvKiAwMiAqLyAiU3RhdGUtR2VuZXJpYyIsCkBAIC02ODIsNyArNjUxLDYgQEAKIAkvKiAxMyAqLyAiUGFyc2VyIiwKIAkvKiAxNCAqLyAiT3BlcmFuZCIsCiAJLyogMTUgKi8gIk5vZGUiCi0vKiEgW0VuZF0gbm8gc291cmNlIGNvZGUgdHJhbnNsYXRpb24gISovCiB9OwogCiBjaGFyICphY3BpX3V0X2dldF9kZXNjcmlwdG9yX25hbWUodm9pZCAqb2JqZWN0KQpAQCAtNzIzLDcgKzY5MSw3IEBACiBjaGFyICphY3BpX3V0X2dldF9tdXRleF9uYW1lKHUzMiBtdXRleF9pZCkKIHsKIAotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgeworCWlmIChtdXRleF9pZCA+IEFDUElfTUFYX01VVEVYKSB7CiAJCXJldHVybiAoIkludmFsaWQgTXV0ZXggSUQiKTsKIAl9CiAKQEAgLTc0Nyw2ICs3MTUsNyBAQAogewogCiAJaWYgKHR5cGUgPiBBQ1BJX1RZUEVfTE9DQUxfTUFYKSB7CisKIAkJLyogTm90ZTogQXNzdW1lcyBhbGwgVFlQRXMgYXJlIGNvbnRpZ3VvdXMgKGV4dGVybmFsL2xvY2FsKSAqLwogCiAJCXJldHVybiAoRkFMU0UpOwpAQCAtNzczLDcgKzc0Miw3IEBACiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCXUzMiBpOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfaW5pdF9nbG9iYWxzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9pbml0X2dsb2JhbHMpOwogCiAJLyogQ3JlYXRlIGFsbCBtZW1vcnkgY2FjaGVzICovCiAKQEAgLTc4NCwxNCArNzUzLDE0IEBACiAKIAkvKiBBQ1BJIHRhYmxlIHN0cnVjdHVyZSAqLwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9BQ1BJX1RBQkxFX1RZUEVTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgKEFDUElfVEFCTEVfSURfTUFYICsgMSk7IGkrKykgewogCQlhY3BpX2dibF90YWJsZV9saXN0c1tpXS5uZXh0ID0gTlVMTDsKIAkJYWNwaV9nYmxfdGFibGVfbGlzdHNbaV0uY291bnQgPSAwOwogCX0KIAogCS8qIE11dGV4IGxvY2tlZCBmbGFncyAqLwogCi0JZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX01VVEVYOyBpKyspIHsKIAkJYWNwaV9nYmxfbXV0ZXhfaW5mb1tpXS5tdXRleCA9IE5VTEw7CiAJCWFjcGlfZ2JsX211dGV4X2luZm9baV0udGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CiAJCWFjcGlfZ2JsX211dGV4X2luZm9baV0udXNlX2NvdW50ID0gMDsKQEAgLTg1Niw3ICs4MjUsNyBAQAogCiAJYWNwaV9nYmxfcm9vdF9ub2RlID0gTlVMTDsKIAlhY3BpX2dibF9yb290X25vZGVfc3RydWN0Lm5hbWUuaW50ZWdlciA9IEFDUElfUk9PVF9OQU1FOwotCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvciA9IEFDUElfREVTQ19UWVBFX05BTUVEOworCWFjcGlfZ2JsX3Jvb3Rfbm9kZV9zdHJ1Y3QuZGVzY3JpcHRvcl90eXBlID0gQUNQSV9ERVNDX1RZUEVfTkFNRUQ7CiAJYWNwaV9nYmxfcm9vdF9ub2RlX3N0cnVjdC50eXBlID0gQUNQSV9UWVBFX0RFVklDRTsKIAlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LmNoaWxkID0gTlVMTDsKIAlhY3BpX2dibF9yb290X25vZGVfc3RydWN0LnBlZXIgPSBOVUxMOwpAQCAtODY5LDMgKzgzOCw2IEBACiAKIAlyZXR1cm5fVk9JRDsKIH0KKworQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xldmVsKQorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfZGJnX2xheWVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRpbml0LmMKaW5kZXggYmE3NzFiNC4uZmY3NjA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGluaXQuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0aW5pdC5jCkBAIC01MCw3ICs1MCw3IEBACiAKIC8qIExvY2FsIHByb3RvdHlwZXMgKi8KIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoY2hhciAqcmVnaXN0ZXJfbmFtZSwgdTMyIHZhbHVlLCBhY3BpX3NpemUgb2Zmc2V0KTsKK2FjcGlfdXRfZmFkdF9yZWdpc3Rlcl9lcnJvcihjaGFyICpyZWdpc3Rlcl9uYW1lLCB1MzIgdmFsdWUsIHU4IG9mZnNldCk7CiAKIHN0YXRpYyB2b2lkIGFjcGlfdXRfdGVybWluYXRlKHZvaWQpOwogCkBAIC02OSwxMiArNjksMTIgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyB2b2lkCi1hY3BpX3V0X2ZhZHRfcmVnaXN0ZXJfZXJyb3IoY2hhciAqcmVnaXN0ZXJfbmFtZSwgdTMyIHZhbHVlLCBhY3BpX3NpemUgb2Zmc2V0KQorYWNwaV91dF9mYWR0X3JlZ2lzdGVyX2Vycm9yKGNoYXIgKnJlZ2lzdGVyX25hbWUsIHUzMiB2YWx1ZSwgdTggb2Zmc2V0KQogewogCiAJQUNQSV9XQVJOSU5HKChBRV9JTkZPLAogCQkgICAgICAiSW52YWxpZCBGQURUIHZhbHVlICVzPSVYIGF0IG9mZnNldCAlWCBGQURUPSVwIiwKLQkJICAgICAgcmVnaXN0ZXJfbmFtZSwgdmFsdWUsICh1MzIpIG9mZnNldCwgYWNwaV9nYmxfRkFEVCkpOworCQkgICAgICByZWdpc3Rlcl9uYW1lLCB2YWx1ZSwgb2Zmc2V0LCBhY3BpX2dibF9GQURUKSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3Niw3ICsxNzYsNyBAQAogCXN0cnVjdCBhY3BpX2dwZV94cnVwdF9pbmZvICpncGVfeHJ1cHRfaW5mbzsKIAlzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqbmV4dF9ncGVfeHJ1cHRfaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Rlcm1pbmF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfdGVybWluYXRlKTsKIAogCS8qIEZyZWUgZ2xvYmFsIHRhYmxlcywgZXRjLiAqLwogCS8qIEZyZWUgZ2xvYmFsIEdQRSBibG9ja3MgYW5kIHJlbGF0ZWQgaW5mbyBzdHJ1Y3R1cmVzICovCkBAIC0xODYsMTQgKzE4NiwxNCBAQAogCQlncGVfYmxvY2sgPSBncGVfeHJ1cHRfaW5mby0+Z3BlX2Jsb2NrX2xpc3RfaGVhZDsKIAkJd2hpbGUgKGdwZV9ibG9jaykgewogCQkJbmV4dF9ncGVfYmxvY2sgPSBncGVfYmxvY2stPm5leHQ7Ci0JCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+ZXZlbnRfaW5mbyk7Ci0JCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jay0+cmVnaXN0ZXJfaW5mbyk7Ci0JCQlBQ1BJX01FTV9GUkVFKGdwZV9ibG9jayk7CisJCQlBQ1BJX0ZSRUUoZ3BlX2Jsb2NrLT5ldmVudF9pbmZvKTsKKwkJCUFDUElfRlJFRShncGVfYmxvY2stPnJlZ2lzdGVyX2luZm8pOworCQkJQUNQSV9GUkVFKGdwZV9ibG9jayk7CiAKIAkJCWdwZV9ibG9jayA9IG5leHRfZ3BlX2Jsb2NrOwogCQl9CiAJCW5leHRfZ3BlX3hydXB0X2luZm8gPSBncGVfeHJ1cHRfaW5mby0+bmV4dDsKLQkJQUNQSV9NRU1fRlJFRShncGVfeHJ1cHRfaW5mbyk7CisJCUFDUElfRlJFRShncGVfeHJ1cHRfaW5mbyk7CiAJCWdwZV94cnVwdF9pbmZvID0gbmV4dF9ncGVfeHJ1cHRfaW5mbzsKIAl9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQAogdm9pZCBhY3BpX3V0X3N1YnN5c3RlbV9zaHV0ZG93bih2b2lkKQogewogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfc3Vic3lzdGVtX3NodXRkb3duIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9zdWJzeXN0ZW1fc2h1dGRvd24pOwogCiAJLyogSnVzdCBleGl0IGlmIHN1YnN5c3RlbSBpcyBhbHJlYWR5IHNodXRkb3duICovCiAKQEAgLTIyOCw2ICsyMjgsNyBAQAogCS8qIFN1YnN5c3RlbSBhcHBlYXJzIGFjdGl2ZSwgZ28gYWhlYWQgYW5kIHNodXQgaXQgZG93biAqLwogCiAJYWNwaV9nYmxfc2h1dGRvd24gPSBUUlVFOworCWFjcGlfZ2JsX3N0YXJ0dXBfZmxhZ3MgPSAwOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlNodXR0aW5nIGRvd24gQUNQSSBTdWJzeXN0ZW1cbiIpKTsKIAogCS8qIENsb3NlIHRoZSBhY3BpX2V2ZW50IEhhbmRsaW5nICovCkBAIC0yNDUsMTIgKzI0Niw1IEBACiAJLyogUHVyZ2UgdGhlIGxvY2FsIGNhY2hlcyAqLwogCiAJKHZvaWQpYWNwaV91dF9kZWxldGVfY2FjaGVzKCk7Ci0KLQkvKiBEZWJ1ZyBvbmx5IC0gZGlzcGxheSBsZWZ0b3ZlciBtZW1vcnkgYWxsb2NhdGlvbiwgaWYgYW55ICovCi0KLSNpZmRlZiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUwotCWFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyhBQ1BJX1VJTlQzMl9NQVgsIE5VTEwpOwotI2VuZGlmCi0KIAlyZXR1cm5fVk9JRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWF0aC5jCmluZGV4IDRhMzM2MDQuLjE5ZDc0YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtYXRoLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1hdGguYwpAQCAtNzcsNyArNzcsNyBAQAogCXVuaW9uIHVpbnQ2NF9vdmVybGF5IHF1b3RpZW50OwogCXUzMiByZW1haW5kZXIzMjsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfc2hvcnRfZGl2aWRlKTsKIAogCS8qIEFsd2F5cyBjaGVjayBmb3IgYSB6ZXJvIGRpdmlzb3IgKi8KIApAQCAtMTM5LDcgKzEzOSw3IEBACiAJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDI7CiAJdW5pb24gdWludDY0X292ZXJsYXkgcGFydGlhbDM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kaXZpZGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2RpdmlkZSk7CiAKIAkvKiBBbHdheXMgY2hlY2sgZm9yIGEgemVybyBkaXZpc29yICovCiAKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQkgICAgIGFjcGlfaW50ZWdlciAqIG91dF9xdW90aWVudCwgdTMyICogb3V0X3JlbWFpbmRlcikKIHsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3Nob3J0X2RpdmlkZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfc2hvcnRfZGl2aWRlKTsKIAogCS8qIEFsd2F5cyBjaGVjayBmb3IgYSB6ZXJvIGRpdmlzb3IgKi8KIApAQCAtMjg3LDcgKzI4Nyw3IEBACiAJICAgICAgIGFjcGlfaW50ZWdlciBpbl9kaXZpc29yLAogCSAgICAgICBhY3BpX2ludGVnZXIgKiBvdXRfcXVvdGllbnQsIGFjcGlfaW50ZWdlciAqIG91dF9yZW1haW5kZXIpCiB7Ci0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZGl2aWRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9kaXZpZGUpOwogCiAJLyogQWx3YXlzIGNoZWNrIGZvciBhIHplcm8gZGl2aXNvciAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG1pc2MuYwppbmRleCA3MzY0ZjVmLi41Yzc1ZDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtaXNjLmMKQEAgLTQ5LDYgKzQ5LDMzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfaXNfYW1sX3RhYmxlCisgKgorICogUEFSQU1FVEVSUzogIFRhYmxlICAgICAgICAgICAgICAgLSBBbiBBQ1BJIHRhYmxlCisgKgorICogUkVUVVJOOiAgICAgIFRSVUUgaWYgdGFibGUgY29udGFpbnMgZXhlY3V0YWJsZSBBTUw7IEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBBQ1BJIFNpZ25hdHVyZSBmb3IgYSB0YWJsZSB0aGF0IGNvbnRhaW5zIEFNTCBjb2RlLgorICogICAgICAgICAgICAgIEN1cnJlbnRseSwgdGhlc2UgYXJlIERTRFQsU1NEVCxQU0RULiBBbGwgb3RoZXIgdGFibGUgdHlwZXMgYXJlCisgKiAgICAgICAgICAgICAgZGF0YSB0YWJsZXMgdGhhdCBkbyBub3QgY29udGFpbiBBTUwgY29kZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordTggYWNwaV91dF9pc19hbWxfdGFibGUoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKworCS8qIElnbm9yZSB0YWJsZXMgdGhhdCBjb250YWluIEFNTCAqLworCisJaWYgKEFDUElfQ09NUEFSRV9OQU1FKHRhYmxlLT5zaWduYXR1cmUsIERTRFRfU0lHKSB8fAorCSAgICBBQ1BJX0NPTVBBUkVfTkFNRSh0YWJsZS0+c2lnbmF0dXJlLCBQU0RUX1NJRykgfHwKKwkgICAgQUNQSV9DT01QQVJFX05BTUUodGFibGUtPnNpZ25hdHVyZSwgU1NEVF9TSUcpKSB7CisJCXJldHVybiAoVFJVRSk7CisJfQorCisJcmV0dXJuIChGQUxTRSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfYWxsb2NhdGVfb3duZXJfaWQKICAqCiAgKiBQQVJBTUVURVJTOiAgb3duZXJfaWQgICAgICAgIC0gV2hlcmUgdGhlIG5ldyBvd25lciBJRCBpcyByZXR1cm5lZApAQCAtNjAsNiArODcsNyBAQAogICogICAgICAgICAgICAgIHdoZW4gdGhlIG1ldGhvZCBleGl0cyBvciB0aGUgdGFibGUgaXMgdW5sb2FkZWQuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpCiB7CiAJYWNwaV9uYXRpdmVfdWludCBpOwpAQCAtNjcsNyArOTUsNyBAQAogCWFjcGlfbmF0aXZlX3VpbnQgazsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9hbGxvY2F0ZV9vd25lcl9pZCIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfYWxsb2NhdGVfb3duZXJfaWQpOwogCiAJLyogR3VhcmQgYWdhaW5zdCBtdWx0aXBsZSBhbGxvY2F0aW9ucyBvZiBJRCB0byB0aGUgc2FtZSBsb2NhdGlvbiAqLwogCkBAIC05Nyw2ICsxMjUsNyBAQAogCiAJCWZvciAoayA9IGFjcGlfZ2JsX25leHRfb3duZXJfaWRfb2Zmc2V0OyBrIDwgMzI7IGsrKykgewogCQkJaWYgKGFjcGlfZ2JsX293bmVyX2lkX21hc2tbal0gPT0gQUNQSV9VSU5UMzJfTUFYKSB7CisKIAkJCQkvKiBUaGVyZSBhcmUgbm8gZnJlZSBJRHMgaW4gdGhpcyBtYXNrICovCiAKIAkJCQlicmVhazsKQEAgLTEyMyw3ICsxNTIsNyBAQAogCQkJCSAgICAoYWNwaV9vd25lcl9pZCkgKChrICsgMSkgKyBBQ1BJX01VTF8zMihqKSk7CiAKIAkJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX1ZBTFVFUywKLQkJCQkJCSAgIkFsbG9jYXRlZCBvd25lcl9pZDogJTIuMlhcbiIsCisJCQkJCQkgICJBbGxvY2F0ZWQgT3duZXJJZDogJTIuMlhcbiIsCiAJCQkJCQkgICh1bnNpZ25lZCBpbnQpKm93bmVyX2lkKSk7CiAJCQkJZ290byBleGl0OwogCQkJfQpAQCAtMTQ0LDcgKzE3Myw3IEBACiAJICovCiAJc3RhdHVzID0gQUVfT1dORVJfSURfTElNSVQ7CiAJQUNQSV9FUlJPUigoQUVfSU5GTywKLQkJICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbmV3IG93bmVyX2lkICgyNTUgbWF4KSwgQUVfT1dORVJfSURfTElNSVQiKSk7CisJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIG5ldyBPd25lcklkICgyNTUgbWF4KSwgQUVfT1dORVJfSURfTElNSVQiKSk7CiAKICAgICAgIGV4aXQ6CiAJKHZvaWQpYWNwaV91dF9yZWxlYXNlX211dGV4KEFDUElfTVRYX0NBQ0hFUyk7CkBAIC0xNzIsNyArMjAxLDcgQEAKIAlhY3BpX25hdGl2ZV91aW50IGluZGV4OwogCXUzMiBiaXQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMigidXRfcmVsZWFzZV9vd25lcl9pZCIsIG93bmVyX2lkKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9yZWxlYXNlX293bmVyX2lkLCBvd25lcl9pZCk7CiAKIAkvKiBBbHdheXMgY2xlYXIgdGhlIGlucHV0IG93bmVyX2lkICh6ZXJvIGlzIGFuIGludmFsaWQgSUQpICovCiAKQEAgLTE4MSw3ICsyMTAsNyBAQAogCS8qIFplcm8gaXMgbm90IGEgdmFsaWQgb3duZXJfaUQgKi8KIAogCWlmIChvd25lcl9pZCA9PSAwKSB7Ci0JCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIG93bmVyX2lkOiAlMi4yWCIsIG93bmVyX2lkKSk7CisJCUFDUElfRVJST1IoKEFFX0lORk8sICJJbnZhbGlkIE93bmVySWQ6ICUyLjJYIiwgb3duZXJfaWQpKTsKIAkJcmV0dXJuX1ZPSUQ7CiAJfQogCkBAIC0yMDcsNyArMjM2LDcgQEAKIAkJYWNwaV9nYmxfb3duZXJfaWRfbWFza1tpbmRleF0gXj0gYml0OwogCX0gZWxzZSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sCi0JCQkgICAgIlJlbGVhc2Ugb2Ygbm9uLWFsbG9jYXRlZCBvd25lcl9pZDogJTIuMlgiLAorCQkJICAgICJSZWxlYXNlIG9mIG5vbi1hbGxvY2F0ZWQgT3duZXJJZDogJTIuMlgiLAogCQkJICAgIG93bmVyX2lkICsgMSkpOwogCX0KIApAQCAtMjczLDYgKzMwMiw3IEBACiAKIAlhY3BpX29zX3ByaW50ZigiXCIiKTsKIAlmb3IgKGkgPSAwOyBzdHJpbmdbaV0gJiYgKGkgPCBtYXhfbGVuZ3RoKTsgaSsrKSB7CisKIAkJLyogRXNjYXBlIHNlcXVlbmNlcyAqLwogCiAJCXN3aXRjaCAoc3RyaW5nW2ldKSB7CkBAIC00NjEsMTIgKzQ5MSw0NyBAQAogCX0KIAlhY3BpX29zX3ByaW50ZigiXG4iKTsKIAotCUFDUElfTUVNX0ZSRUUoYnVmZmVyLnBvaW50ZXIpOworCUFDUElfRlJFRShidWZmZXIucG9pbnRlcik7CiB9CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKiBGVU5DVElPTjogICAgYWNwaV91dF92YWxpZF9hY3BpX2NoYXIKKyAqCisgKiBQQVJBTUVURVJTOiAgQ2hhciAgICAgICAgICAgIC0gVGhlIGNoYXJhY3RlciB0byBiZSBleGFtaW5lZAorICoKKyAqIFJFVFVSTjogICAgICBUUlVFIGlmIHRoZSBjaGFyYWN0ZXIgaXMgdmFsaWQsIEZBTFNFIG90aGVyd2lzZQorICoKKyAqIERFU0NSSVBUSU9OOiBDaGVjayBmb3IgYSB2YWxpZCBBQ1BJIGNoYXJhY3Rlci4gTXVzdCBiZSBvbmUgb2Y6CisgKiAgICAgICAgICAgICAgMSkgVXBwZXIgY2FzZSBhbHBoYQorICogICAgICAgICAgICAgIDIpIG51bWVyaWMKKyAqICAgICAgICAgICAgICAzKSB1bmRlcnNjb3JlCisgKgorICogICAgICAgICAgICAgIFdlIGFsbG93IGEgJyEnIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBiZWNhdXNlIG9mIHRoZSBBU0YhIHRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXIoY2hhciBjaGFyYWN0ZXIsIGFjcGlfbmF0aXZlX3VpbnQgcG9zaXRpb24pCit7CisKKwlpZiAoISgoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAorCSAgICAgIChjaGFyYWN0ZXIgPj0gJzAnICYmIGNoYXJhY3RlciA8PSAnOScpIHx8IChjaGFyYWN0ZXIgPT0gJ18nKSkpIHsKKworCQkvKiBBbGxvdyBhICchJyBpbiB0aGUgbGFzdCBwb3NpdGlvbiAqLworCisJCWlmIChjaGFyYWN0ZXIgPT0gJyEnICYmIHBvc2l0aW9uID09IDMpIHsKKwkJCXJldHVybiAoVFJVRSk7CisJCX0KKworCQlyZXR1cm4gKEZBTFNFKTsKKwl9CisKKwlyZXR1cm4gKFRSVUUpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2FjcGlfbmFtZQogICoKICAqIFBBUkFNRVRFUlM6ICBOYW1lICAgICAgICAgICAgLSBUaGUgbmFtZSB0byBiZSBleGFtaW5lZApAQCAtNDgyLDE5ICs1NDcsMTMgQEAKIAogdTggYWNwaV91dF92YWxpZF9hY3BpX25hbWUodTMyIG5hbWUpCiB7Ci0JY2hhciAqbmFtZV9wdHIgPSAoY2hhciAqKSZuYW1lOwotCWNoYXIgY2hhcmFjdGVyOwogCWFjcGlfbmF0aXZlX3VpbnQgaTsKIAogCUFDUElfRlVOQ1RJT05fRU5UUlkoKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05BTUVfU0laRTsgaSsrKSB7Ci0JCWNoYXJhY3RlciA9ICpuYW1lX3B0cjsKLQkJbmFtZV9wdHIrKzsKLQotCQlpZiAoISgoY2hhcmFjdGVyID09ICdfJykgfHwKLQkJICAgICAgKGNoYXJhY3RlciA+PSAnQScgJiYgY2hhcmFjdGVyIDw9ICdaJykgfHwKLQkJICAgICAgKGNoYXJhY3RlciA+PSAnMCcgJiYgY2hhcmFjdGVyIDw9ICc5JykpKSB7CisJCWlmICghYWNwaV91dF92YWxpZF9hY3BpX2NoYXIKKwkJICAgICgoQUNQSV9DQVNUX1BUUihjaGFyLCAmbmFtZSkpW2ldLCBpKSkgewogCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAl9CkBAIC01MDQsMjQgKzU2MywzNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkX2FjcGlfY2hhcmFjdGVyCisgKiBGVU5DVElPTjogICAgYWNwaV91dF9yZXBhaXJfbmFtZQogICoKLSAqIFBBUkFNRVRFUlM6ICBDaGFyYWN0ZXIgICAgICAgICAgIC0gVGhlIGNoYXJhY3RlciB0byBiZSBleGFtaW5lZAorICogUEFSQU1FVEVSUzogIE5hbWUgICAgICAgICAgICAtIFRoZSBBQ1BJIG5hbWUgdG8gYmUgcmVwYWlyZWQKICAqCi0gKiBSRVRVUk46ICAgICAgMSBpZiBDaGFyYWN0ZXIgbWF5IGFwcGVhciBpbiBhIG5hbWUsIGVsc2UgMAorICogUkVUVVJOOiAgICAgIFJlcGFpcmVkIHZlcnNpb24gb2YgdGhlIG5hbWUKICAqCi0gKiBERVNDUklQVElPTjogQ2hlY2sgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3RlcgorICogREVTQ1JJUFRJT046IFJlcGFpciBhbiBBQ1BJIG5hbWU6IENoYW5nZSBpbnZhbGlkIGNoYXJhY3RlcnMgdG8gJyonIGFuZAorICogICAgICAgICAgICAgIHJldHVybiB0aGUgbmV3IG5hbWUuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcihjaGFyIGNoYXJhY3RlcikKK2FjcGlfbmFtZSBhY3BpX3V0X3JlcGFpcl9uYW1lKGFjcGlfbmFtZSBuYW1lKQogeworCWNoYXIgKm5hbWVfcHRyID0gQUNQSV9DQVNUX1BUUihjaGFyLCAmbmFtZSk7CisJY2hhciBuZXdfbmFtZVtBQ1BJX05BTUVfU0laRV07CisJYWNwaV9uYXRpdmVfdWludCBpOwogCi0JQUNQSV9GVU5DVElPTl9FTlRSWSgpOworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05BTUVfU0laRTsgaSsrKSB7CisJCW5ld19uYW1lW2ldID0gbmFtZV9wdHJbaV07CiAKLQlyZXR1cm4gKCh1OCkgKChjaGFyYWN0ZXIgPT0gJ18nKSB8fAotCQkgICAgICAoY2hhcmFjdGVyID49ICdBJyAmJiBjaGFyYWN0ZXIgPD0gJ1onKSB8fAotCQkgICAgICAoY2hhcmFjdGVyID49ICcwJyAmJiBjaGFyYWN0ZXIgPD0gJzknKSkpOworCQkvKgorCQkgKiBSZXBsYWNlIGEgYmFkIGNoYXJhY3RlciB3aXRoIHNvbWV0aGluZyBwcmludGFibGUsIHlldCB0ZWNobmljYWxseQorCQkgKiBzdGlsbCBpbnZhbGlkLiBUaGlzIHByZXZlbnRzIGFueSBjb2xsaXNpb25zIHdpdGggZXhpc3RpbmcgImdvb2QiCisJCSAqIG5hbWVzIGluIHRoZSBuYW1lc3BhY2UuCisJCSAqLworCQlpZiAoIWFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyKG5hbWVfcHRyW2ldLCBpKSkgeworCQkJbmV3X25hbWVbaV0gPSAnKic7CisJCX0KKwl9CisKKwlyZXR1cm4gKCpBQ1BJX0NBU1RfUFRSKHUzMiwgbmV3X25hbWUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUyOSw3ICs2MDEsOCBAQAogICogRlVOQ1RJT046ICAgIGFjcGlfdXRfc3RydG91bDY0CiAgKgogICogUEFSQU1FVEVSUzogIFN0cmluZyAgICAgICAgICAtIE51bGwgdGVybWluYXRlZCBzdHJpbmcKLSAqICAgICAgICAgICAgICBCYXNlICAgICAgICAgICAgLSBSYWRpeCBvZiB0aGUgc3RyaW5nOiAxMCwgMTYsIG9yIEFDUElfQU5ZX0JBU0UKKyAqICAgICAgICAgICAgICBCYXNlICAgICAgICAgICAgLSBSYWRpeCBvZiB0aGUgc3RyaW5nOiAxNiBvciBBQ1BJX0FOWV9CQVNFOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDUElfQU5ZX0JBU0UgbWVhbnMgJ2luIGJlaGFsZiBvZiB0b19pbnRlZ2VyJwogICogICAgICAgICAgICAgIHJldF9pbnRlZ2VyICAgICAtIFdoZXJlIHRoZSBjb252ZXJ0ZWQgaW50ZWdlciBpcyByZXR1cm5lZAogICoKICAqIFJFVFVSTjogICAgICBTdGF0dXMgYW5kIENvbnZlcnRlZCB2YWx1ZQpAQCAtNTQ1LDE2ICs2MTgsMTcgQEAKIAl1MzIgdGhpc19kaWdpdCA9IDA7CiAJYWNwaV9pbnRlZ2VyIHJldHVybl92YWx1ZSA9IDA7CiAJYWNwaV9pbnRlZ2VyIHF1b3RpZW50OworCWFjcGlfaW50ZWdlciBkaXZpZGVuZDsKKwl1MzIgdG9faW50ZWdlcl9vcCA9IChiYXNlID09IEFDUElfQU5ZX0JBU0UpOworCXUzMiBtb2RlMzIgPSAoYWNwaV9nYmxfaW50ZWdlcl9ieXRlX3dpZHRoID09IDQpOworCXU4IHZhbGlkX2RpZ2l0cyA9IDA7CisJdTggc2lnbl9vZjB4ID0gMDsKKwl1OCB0ZXJtID0gMDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3N0cm91bDY0Iik7Ci0KLQlpZiAoKCFzdHJpbmcpIHx8ICEoKnN0cmluZykpIHsKLQkJZ290byBlcnJvcl9leGl0OwotCX0KKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3N0cm91bDY0KTsKIAogCXN3aXRjaCAoYmFzZSkgewogCWNhc2UgQUNQSV9BTllfQkFTRToKLQljYXNlIDEwOgogCWNhc2UgMTY6CiAJCWJyZWFrOwogCkBAIC01NjMsNzYgKzYzNywxMTAgQEAKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIAorCWlmICghc3RyaW5nKSB7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwl9CisKIAkvKiBTa2lwIG92ZXIgYW55IHdoaXRlIHNwYWNlIGluIHRoZSBidWZmZXIgKi8KIAotCXdoaWxlIChBQ1BJX0lTX1NQQUNFKCpzdHJpbmcpIHx8ICpzdHJpbmcgPT0gJ1x0JykgeworCXdoaWxlICgoKnN0cmluZykgJiYgKEFDUElfSVNfU1BBQ0UoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSkgewogCQlzdHJpbmcrKzsKIAl9CiAKLQkvKgotCSAqIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXIgQmFzZSBpcyB6ZXJvLCB0aGVuIHdlIG5lZWQgdG8KLQkgKiBkZXRlcm1pbmUgaWYgaXQgaXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbDoKLQkgKi8KLQlpZiAoYmFzZSA9PSAwKSB7CisJaWYgKHRvX2ludGVnZXJfb3ApIHsKKwkJLyoKKwkJICogQmFzZSBlcXVhbCB0byBBQ1BJX0FOWV9CQVNFIG1lYW5zICd0b19pbnRlZ2VyIG9wZXJhdGlvbiBjYXNlJy4KKwkJICogV2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgaXQgaXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbC4KKwkJICovCiAJCWlmICgoKnN0cmluZyA9PSAnMCcpICYmIChBQ1BJX1RPTE9XRVIoKihzdHJpbmcgKyAxKSkgPT0gJ3gnKSkgeworCQkJc2lnbl9vZjB4ID0gMTsKIAkJCWJhc2UgPSAxNjsKKworCQkJLyogU2tpcCBvdmVyIHRoZSBsZWFkaW5nICcweCcgKi8KIAkJCXN0cmluZyArPSAyOwogCQl9IGVsc2UgewogCQkJYmFzZSA9IDEwOwogCQl9CiAJfQogCi0JLyoKLQkgKiBGb3IgaGV4YWRlY2ltYWwgYmFzZSwgc2tpcCBvdmVyIHRoZSBsZWFkaW5nCi0JICogMCBvciAweCwgaWYgdGhleSBhcmUgcHJlc2VudC4KLQkgKi8KLQlpZiAoKGJhc2UgPT0gMTYpICYmCi0JICAgICgqc3RyaW5nID09ICcwJykgJiYgKEFDUElfVE9MT1dFUigqKHN0cmluZyArIDEpKSA9PSAneCcpKSB7Ci0JCXN0cmluZyArPSAyOworCS8qIEFueSBzdHJpbmcgbGVmdD8gQ2hlY2sgdGhhdCAnMHgnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZSBzcGFjZS4gKi8KKworCWlmICghKCpzdHJpbmcpIHx8IEFDUElfSVNfU1BBQ0UoKnN0cmluZykgfHwgKnN0cmluZyA9PSAnXHQnKSB7CisJCWlmICh0b19pbnRlZ2VyX29wKSB7CisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0gZWxzZSB7CisJCQlnb3RvIGFsbF9kb25lOworCQl9CiAJfQogCi0JLyogQW55IHN0cmluZyBsZWZ0PyAqLworCWRpdmlkZW5kID0gKG1vZGUzMikgPyBBQ1BJX1VJTlQzMl9NQVggOiBBQ1BJX1VJTlQ2NF9NQVg7CiAKLQlpZiAoISgqc3RyaW5nKSkgewotCQlnb3RvIGVycm9yX2V4aXQ7Ci0JfQorCS8qIEF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyBoZXJlICovCiAKIAkvKiBNYWluIGxvb3A6IGNvbnZlcnQgdGhlIHN0cmluZyB0byBhIDY0LWJpdCBpbnRlZ2VyICovCiAKIAl3aGlsZSAoKnN0cmluZykgewogCQlpZiAoQUNQSV9JU19ESUdJVCgqc3RyaW5nKSkgeworCiAJCQkvKiBDb252ZXJ0IEFTQ0lJIDAtOSB0byBEZWNpbWFsIHZhbHVlICovCiAKIAkJCXRoaXNfZGlnaXQgPSAoKHU4KSAqIHN0cmluZykgLSAnMCc7CisJCX0gZWxzZSBpZiAoYmFzZSA9PSAxMCkgeworCisJCQkvKiBEaWdpdCBpcyBvdXQgb2YgcmFuZ2U7IHBvc3NpYmxlIGluIHRvX2ludGVnZXIgY2FzZSBvbmx5ICovCisKKwkJCXRlcm0gPSAxOwogCQl9IGVsc2UgewotCQkJaWYgKGJhc2UgPT0gMTApIHsKLQkJCQkvKiBEaWdpdCBpcyBvdXQgb2YgcmFuZ2UgKi8KLQotCQkJCWdvdG8gZXJyb3JfZXhpdDsKLQkJCX0KLQogCQkJdGhpc19kaWdpdCA9ICh1OCkgQUNQSV9UT1VQUEVSKCpzdHJpbmcpOwogCQkJaWYgKEFDUElfSVNfWERJR0lUKChjaGFyKXRoaXNfZGlnaXQpKSB7CisKIAkJCQkvKiBDb252ZXJ0IEFTQ0lJIEhleCBjaGFyIHRvIHZhbHVlICovCiAKIAkJCQl0aGlzX2RpZ2l0ID0gdGhpc19kaWdpdCAtICdBJyArIDEwOwogCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIFdlIGFsbG93IG5vbi1oZXggY2hhcnMsIGp1c3Qgc3RvcCBub3csIHNhbWUgYXMgZW5kLW9mLXN0cmluZy4KLQkJCQkgKiBTZWUgQUNQSSBzcGVjLCBzdHJpbmctdG8taW50ZWdlciBjb252ZXJzaW9uLgotCQkJCSAqLworCQkJCXRlcm0gPSAxOworCQkJfQorCQl9CisKKwkJaWYgKHRlcm0pIHsKKwkJCWlmICh0b19pbnRlZ2VyX29wKSB7CisJCQkJZ290byBlcnJvcl9leGl0OworCQkJfSBlbHNlIHsKIAkJCQlicmVhazsKIAkJCX0KKwkJfSBlbHNlIGlmICgodmFsaWRfZGlnaXRzID09IDApICYmICh0aGlzX2RpZ2l0ID09IDApCisJCQkgICAmJiAhc2lnbl9vZjB4KSB7CisKKwkJCS8qIFNraXAgemVyb3MgKi8KKwkJCXN0cmluZysrOworCQkJY29udGludWU7CisJCX0KKworCQl2YWxpZF9kaWdpdHMrKzsKKworCQlpZiAoc2lnbl9vZjB4CisJCSAgICAmJiAoKHZhbGlkX2RpZ2l0cyA+IDE2KQorCQkJfHwgKCh2YWxpZF9kaWdpdHMgPiA4KSAmJiBtb2RlMzIpKSkgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdG9faW50ZWdlciBvcGVyYXRpb24gY2FzZS4KKwkJCSAqIE5vIGFueSByZXN0cmljdGlvbnMgZm9yIHN0cmluZy10by1pbnRlZ2VyIGNvbnZlcnNpb24sCisJCQkgKiBzZWUgQUNQSSBzcGVjLgorCQkJICovCisJCQlnb3RvIGVycm9yX2V4aXQ7CiAJCX0KIAogCQkvKiBEaXZpZGUgdGhlIGRpZ2l0IGludG8gdGhlIGNvcnJlY3QgcG9zaXRpb24gKi8KIAogCQkodm9pZCkKLQkJICAgIGFjcGlfdXRfc2hvcnRfZGl2aWRlKChBQ1BJX0lOVEVHRVJfTUFYIC0KLQkJCQkJICAoYWNwaV9pbnRlZ2VyKSB0aGlzX2RpZ2l0KSwgYmFzZSwKLQkJCQkJICZxdW90aWVudCwgTlVMTCk7CisJCSAgICBhY3BpX3V0X3Nob3J0X2RpdmlkZSgoZGl2aWRlbmQgLSAoYWNwaV9pbnRlZ2VyKSB0aGlzX2RpZ2l0KSwKKwkJCQkJIGJhc2UsICZxdW90aWVudCwgTlVMTCk7CisKIAkJaWYgKHJldHVybl92YWx1ZSA+IHF1b3RpZW50KSB7Ci0JCQlnb3RvIGVycm9yX2V4aXQ7CisJCQlpZiAodG9faW50ZWdlcl9vcCkgeworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KIAogCQlyZXR1cm5fdmFsdWUgKj0gYmFzZTsKQEAgLTY0Miw2ICs3NTAsOCBAQAogCiAJLyogQWxsIGRvbmUsIG5vcm1hbCBleGl0ICovCiAKKyAgICAgIGFsbF9kb25lOgorCiAJKnJldF9pbnRlZ2VyID0gcmV0dXJuX3ZhbHVlOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiAKQEAgLTcxOSw3ICs4MjksNyBAQAogCXUzMiB0aGlzX2luZGV4OwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnRoaXNfc291cmNlX29iajsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X3dhbGtfcGFja2FnZV90cmVlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF93YWxrX3BhY2thZ2VfdHJlZSk7CiAKIAlzdGF0ZSA9IGFjcGlfdXRfY3JlYXRlX3BrZ19zdGF0ZShzb3VyY2Vfb2JqZWN0LCB0YXJnZXRfb2JqZWN0LCAwKTsKIAlpZiAoIXN0YXRlKSB7CkBAIC03MjcsNiArODM3LDcgQEAKIAl9CiAKIAl3aGlsZSAoc3RhdGUpIHsKKwogCQkvKiBHZXQgb25lIGVsZW1lbnQgb2YgdGhlIHBhY2thZ2UgKi8KIAogCQl0aGlzX2luZGV4ID0gc3RhdGUtPnBrZy5pbmRleDsKQEAgLTgxNCwzMSArOTI1LDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKiBGVU5DVElPTjogICAgYWNwaV91dF9nZW5lcmF0ZV9jaGVja3N1bQotICoKLSAqIFBBUkFNRVRFUlM6ICBCdWZmZXIgICAgICAgICAgLSBCdWZmZXIgdG8gYmUgc2Nhbm5lZAotICogICAgICAgICAgICAgIExlbmd0aCAgICAgICAgICAtIG51bWJlciBvZiBieXRlcyB0byBleGFtaW5lCi0gKgotICogUkVUVVJOOiAgICAgIFRoZSBnZW5lcmF0ZWQgY2hlY2tzdW0KLSAqCi0gKiBERVNDUklQVElPTjogR2VuZXJhdGUgYSBjaGVja3N1bSBvbiBhIHJhdyBidWZmZXIKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11OCBhY3BpX3V0X2dlbmVyYXRlX2NoZWNrc3VtKHU4ICogYnVmZmVyLCB1MzIgbGVuZ3RoKQotewotCXUzMiBpOwotCXNpZ25lZCBjaGFyIHN1bSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJc3VtID0gKHNpZ25lZCBjaGFyKShzdW0gKyBidWZmZXJbaV0pOwotCX0KLQotCXJldHVybiAoKHU4KSAoMCAtIHN1bSkpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X2Vycm9yLCBhY3BpX3V0X3dhcm5pbmcsIGFjcGlfdXRfaW5mbwogICoKICAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCkBAIC05MDAsMzYgKzk4NiwzIEBACiAJYWNwaV9vc192cHJpbnRmKGZvcm1hdCwgYXJncyk7CiAJYWNwaV9vc19wcmludGYoIiBbJVhdXG4iLCBBQ1BJX0NBX1ZFUlNJT04pOwogfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3JlcG9ydF9lcnJvciwgV2FybmluZywgSW5mbwotICoKLSAqIFBBUkFNRVRFUlM6ICBtb2R1bGVfbmFtZSAgICAgICAgIC0gQ2FsbGVyJ3MgbW9kdWxlIG5hbWUgKGZvciBlcnJvciBvdXRwdXQpCi0gKiAgICAgICAgICAgICAgbGluZV9udW1iZXIgICAgICAgICAtIENhbGxlcidzIGxpbmUgbnVtYmVyIChmb3IgZXJyb3Igb3V0cHV0KQotICoKLSAqIFJFVFVSTjogICAgICBOb25lCi0gKgotICogREVTQ1JJUFRJT046IFByaW50IGVycm9yIG1lc3NhZ2UKLSAqCi0gKiBOb3RlOiBMZWdhY3kgb25seSwgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBubyBsb25nZXIgdXNlZCBieSBkcml2ZXJzLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcikKLXsKLQotCWFjcGlfb3NfcHJpbnRmKCJBQ1BJIEVycm9yICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKLX0KLQotdm9pZCBhY3BpX3V0X3JlcG9ydF93YXJuaW5nKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIpCi17Ci0KLQlhY3BpX29zX3ByaW50ZigiQUNQSSBXYXJuaW5nICglcy0lMDRkKTogIiwgbW9kdWxlX25hbWUsIGxpbmVfbnVtYmVyKTsKLX0KLQotdm9pZCBhY3BpX3V0X3JlcG9ydF9pbmZvKGNoYXIgKm1vZHVsZV9uYW1lLCB1MzIgbGluZV9udW1iZXIpCi17Ci0KLQlhY3BpX29zX3ByaW50ZigiQUNQSSAoJXMtJTA0ZCk6ICIsIG1vZHVsZV9uYW1lLCBsaW5lX251bWJlcik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0bXV0ZXguYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCmluZGV4IDQ1YTcyNDQuLjI1ZWIzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCisrKyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRtdXRleC5jCkBAIC02OCwxOSArNjgsMjYgQEAKIAl1MzIgaTsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9tdXRleF9pbml0aWFsaXplIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9tdXRleF9pbml0aWFsaXplKTsKIAogCS8qCiAJICogQ3JlYXRlIGVhY2ggb2YgdGhlIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0cwogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBOVU1fTVVURVg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBQ1BJX05VTV9NVVRFWDsgaSsrKSB7CiAJCXN0YXR1cyA9IGFjcGlfdXRfY3JlYXRlX211dGV4KGkpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQogCisJLyogQ3JlYXRlIHRoZSBzcGlubG9ja3MgZm9yIHVzZSBhdCBpbnRlcnJ1cHQgbGV2ZWwgKi8KKwogCXN0YXR1cyA9IGFjcGlfb3NfY3JlYXRlX2xvY2soJmFjcGlfZ2JsX2dwZV9sb2NrKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CisJfQorCisJc3RhdHVzID0gYWNwaV9vc19jcmVhdGVfbG9jaygmYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKQEAgLTEwMCwxNiArMTA3LDE5IEBACiB7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9tdXRleF90ZXJtaW5hdGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X211dGV4X3Rlcm1pbmF0ZSk7CiAKIAkvKgogCSAqIERlbGV0ZSBlYWNoIHByZWRlZmluZWQgbXV0ZXggb2JqZWN0CiAJICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9NVVRFWDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEFDUElfTlVNX01VVEVYOyBpKyspIHsKIAkJKHZvaWQpYWNwaV91dF9kZWxldGVfbXV0ZXgoaSk7CiAJfQogCisJLyogRGVsZXRlIHRoZSBzcGlubG9ja3MgKi8KKwogCWFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9nYmxfZ3BlX2xvY2spOworCWFjcGlfb3NfZGVsZXRlX2xvY2soYWNwaV9nYmxfaGFyZHdhcmVfbG9jayk7CiAJcmV0dXJuX1ZPSUQ7CiB9CiAKQEAgLTEyOSw5ICsxMzksOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoInV0X2NyZWF0ZV9tdXRleCIsIG11dGV4X2lkKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9jcmVhdGVfbXV0ZXgsIG11dGV4X2lkKTsKIAotCWlmIChtdXRleF9pZCA+IE1BWF9NVVRFWCkgeworCWlmIChtdXRleF9pZCA+IEFDUElfTUFYX01VVEVYKSB7CiAJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTE2Myw5ICsxNzMsOSBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9kZWxldGVfbXV0ZXgiLCBtdXRleF9pZCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIodXRfZGVsZXRlX211dGV4LCBtdXRleF9pZCk7CiAKLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQkFEX1BBUkFNRVRFUik7CiAJfQogCkBAIC0xOTIsMTEgKzIwMiwxMSBAQAogYWNwaV9zdGF0dXMgYWNwaV91dF9hY3F1aXJlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgdGhpc190aHJlYWRfaWQ7CisJYWNwaV90aHJlYWRfaWQgdGhpc190aHJlYWRfaWQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X2FjcXVpcmVfbXV0ZXgiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfYWNxdWlyZV9tdXRleCk7CiAKLQlpZiAobXV0ZXhfaWQgPiBNQVhfTVVURVgpIHsKKwlpZiAobXV0ZXhfaWQgPiBBQ1BJX01BWF9NVVRFWCkgewogCQlyZXR1cm4gKEFFX0JBRF9QQVJBTUVURVIpOwogCX0KIApAQCAtMjEzLDcgKzIyMyw3IEBACiAJCSAqIHRoZSBtdXRleCBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCiAJCSAqIHRoZSBBQ1BJIHN1YnN5c3RlbSBjb2RlLgogCQkgKi8KLQkJZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBNQVhfTVVURVg7IGkrKykgeworCQlmb3IgKGkgPSBtdXRleF9pZDsgaSA8IEFDUElfTUFYX01VVEVYOyBpKyspIHsKIAkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLnRocmVhZF9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewogCQkJCWlmIChpID09IG11dGV4X2lkKSB7CiAJCQkJCUFDUElfRVJST1IoKEFFX0lORk8sCkBAIC0yNzUsMTYgKzI4NSwxNiBAQAogYWNwaV9zdGF0dXMgYWNwaV91dF9yZWxlYXNlX211dGV4KGFjcGlfbXV0ZXhfaGFuZGxlIG11dGV4X2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1MzIgdGhpc190aHJlYWRfaWQ7CisJYWNwaV90aHJlYWRfaWQgdGhpc190aHJlYWRfaWQ7CiAKLQlBQ1BJX0ZVTkNUSU9OX05BTUUoInV0X3JlbGVhc2VfbXV0ZXgiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfcmVsZWFzZV9tdXRleCk7CiAKIAl0aGlzX3RocmVhZF9pZCA9IGFjcGlfb3NfZ2V0X3RocmVhZF9pZCgpOwogCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfTVVURVgsCiAJCQkgICJUaHJlYWQgJVggcmVsZWFzaW5nIE11dGV4IFslc11cbiIsIHRoaXNfdGhyZWFkX2lkLAogCQkJICBhY3BpX3V0X2dldF9tdXRleF9uYW1lKG11dGV4X2lkKSkpOwogCi0JaWYgKG11dGV4X2lkID4gTUFYX01VVEVYKSB7CisJaWYgKG11dGV4X2lkID4gQUNQSV9NQVhfTVVURVgpIHsKIAkJcmV0dXJuIChBRV9CQURfUEFSQU1FVEVSKTsKIAl9CiAKQEAgLTMwOSw3ICszMTksNyBAQAogCQkgKiBvcmRlcmluZyBydWxlLiAgVGhpcyBpbmRpY2F0ZXMgYSBjb2RpbmcgZXJyb3Igc29tZXdoZXJlIGluCiAJCSAqIHRoZSBBQ1BJIHN1YnN5c3RlbSBjb2RlLgogCQkgKi8KLQkJZm9yIChpID0gbXV0ZXhfaWQ7IGkgPCBNQVhfTVVURVg7IGkrKykgeworCQlmb3IgKGkgPSBtdXRleF9pZDsgaSA8IEFDUElfTUFYX01VVEVYOyBpKyspIHsKIAkJCWlmIChhY3BpX2dibF9tdXRleF9pbmZvW2ldLnRocmVhZF9pZCA9PSB0aGlzX3RocmVhZF9pZCkgewogCQkJCWlmIChpID09IG11dGV4X2lkKSB7CiAJCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dG9iamVjdC5jCmluZGV4IDdlZTJkMWQuLmJhN2Q4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRvYmplY3QuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0b2JqZWN0LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc2Vjb25kX29iamVjdDsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfU1RSKCJ1dF9jcmVhdGVfaW50ZXJuYWxfb2JqZWN0X2RiZyIsCisJQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIodXRfY3JlYXRlX2ludGVybmFsX29iamVjdF9kYmcsCiAJCQkJYWNwaV91dF9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKIAogCS8qIEFsbG9jYXRlIHRoZSByYXcgb2JqZWN0IGRlc2NyaXB0b3IgKi8KQEAgLTE2MSw3ICsxNjEsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmJ1ZmZlcl9kZXNjOwogCXU4ICpidWZmZXIgPSBOVUxMOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRV9VMzIoInV0X2NyZWF0ZV9idWZmZXJfb2JqZWN0IiwgYnVmZmVyX3NpemUpOworCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKHV0X2NyZWF0ZV9idWZmZXJfb2JqZWN0LCBidWZmZXJfc2l6ZSk7CiAKIAkvKiBDcmVhdGUgYSBuZXcgQnVmZmVyIG9iamVjdCAqLwogCkBAIC0xNzMsOSArMTczLDEwIEBACiAJLyogQ3JlYXRlIGFuIGFjdHVhbCBidWZmZXIgb25seSBpZiBzaXplID4gMCAqLwogCiAJaWYgKGJ1ZmZlcl9zaXplID4gMCkgeworCiAJCS8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyICovCiAKLQkJYnVmZmVyID0gQUNQSV9NRU1fQ0FMTE9DQVRFKGJ1ZmZlcl9zaXplKTsKKwkJYnVmZmVyID0gQUNQSV9BTExPQ0FURV9aRVJPRUQoYnVmZmVyX3NpemUpOwogCQlpZiAoIWJ1ZmZlcikgewogCQkJQUNQSV9FUlJPUigoQUVfSU5GTywgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzaXplICVYIiwKIAkJCQkgICAgKHUzMikgYnVmZmVyX3NpemUpKTsKQEAgLTIxNCw3ICsyMTUsNyBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnN0cmluZ19kZXNjOwogCWNoYXIgKnN0cmluZzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKCJ1dF9jcmVhdGVfc3RyaW5nX29iamVjdCIsIHN0cmluZ19zaXplKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1UzMih1dF9jcmVhdGVfc3RyaW5nX29iamVjdCwgc3RyaW5nX3NpemUpOwogCiAJLyogQ3JlYXRlIGEgbmV3IFN0cmluZyBvYmplY3QgKi8KIApAQCAtMjI3LDcgKzIyOCw3IEBACiAJICogQWxsb2NhdGUgdGhlIGFjdHVhbCBzdHJpbmcgYnVmZmVyIC0tIChTaXplICsgMSkgZm9yIE5VTEwgdGVybWluYXRvci4KIAkgKiBOT1RFOiBaZXJvLWxlbmd0aCBzdHJpbmdzIGFyZSBOVUxMIHRlcm1pbmF0ZWQKIAkgKi8KLQlzdHJpbmcgPSBBQ1BJX01FTV9DQUxMT0NBVEUoc3RyaW5nX3NpemUgKyAxKTsKKwlzdHJpbmcgPSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChzdHJpbmdfc2l6ZSArIDEpOwogCWlmICghc3RyaW5nKSB7CiAJCUFDUElfRVJST1IoKEFFX0lORk8sICJDb3VsZCBub3QgYWxsb2NhdGUgc2l6ZSAlWCIsCiAJCQkgICAgKHUzMikgc3RyaW5nX3NpemUpKTsKQEAgLTI2MCw3ICsyNjEsNyBAQAogdTggYWNwaV91dF92YWxpZF9pbnRlcm5hbF9vYmplY3Qodm9pZCAqb2JqZWN0KQogewogCi0JQUNQSV9GVU5DVElPTl9OQU1FKCJ1dF92YWxpZF9pbnRlcm5hbF9vYmplY3QiKTsKKwlBQ1BJX0ZVTkNUSU9OX05BTUUodXRfdmFsaWRfaW50ZXJuYWxfb2JqZWN0KTsKIAogCS8qIENoZWNrIGZvciBhIG51bGwgcG9pbnRlciAqLwogCkBAIC0zMDgsNyArMzA5LDcgQEAKIHsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmplY3Q7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9hbGxvY2F0ZV9vYmplY3RfZGVzY19kYmciKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X2FsbG9jYXRlX29iamVjdF9kZXNjX2RiZyk7CiAKIAlvYmplY3QgPSBhY3BpX29zX2FjcXVpcmVfb2JqZWN0KGFjcGlfZ2JsX29wZXJhbmRfY2FjaGUpOwogCWlmICghb2JqZWN0KSB7CkBAIC0zMTksNiArMzIwLDcgQEAKIAl9CiAKIAkvKiBNYXJrIHRoZSBkZXNjcmlwdG9yIHR5cGUgKi8KKwogCW1lbXNldChvYmplY3QsIDAsIHNpemVvZih1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0KSk7CiAJQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKG9iamVjdCwgQUNQSV9ERVNDX1RZUEVfT1BFUkFORCk7CiAKQEAgLTM0Miw3ICszNDQsNyBAQAogCiB2b2lkIGFjcGlfdXRfZGVsZXRlX29iamVjdF9kZXNjKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9iamVjdCkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfZGVsZXRlX29iamVjdF9kZXNjIiwgb2JqZWN0KTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9kZWxldGVfb2JqZWN0X2Rlc2MsIG9iamVjdCk7CiAKIAkvKiBPYmplY3QgbXVzdCBiZSBhbiB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICovCiAKQEAgLTM4MSw3ICszODMsNyBAQAogCWFjcGlfc2l6ZSBsZW5ndGg7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfT0s7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfZ2V0X3NpbXBsZV9vYmplY3Rfc2l6ZSwgaW50ZXJuYWxfb2JqZWN0KTsKIAogCS8qCiAJICogSGFuZGxlIGEgbnVsbCBvYmplY3QgKENvdWxkIGJlIGEgdW5pbml0aWFsaXplZCBwYWNrYWdlCkBAIC0zOTcsNiArMzk5LDcgQEAKIAlsZW5ndGggPSBzaXplb2YodW5pb24gYWNwaV9vYmplY3QpOwogCiAJaWYgKEFDUElfR0VUX0RFU0NSSVBUT1JfVFlQRShpbnRlcm5hbF9vYmplY3QpID09IEFDUElfREVTQ19UWVBFX05BTUVEKSB7CisKIAkJLyogT2JqZWN0IGlzIGEgbmFtZWQgb2JqZWN0IChyZWZlcmVuY2UpLCBqdXN0IHJldHVybiB0aGUgbGVuZ3RoICovCiAKIAkJKm9ial9sZW5ndGggPSBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCk7CkBAIC01NTksNyArNTYyLDcgQEAKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJc3RydWN0IGFjcGlfcGtnX2luZm8gaW5mbzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9nZXRfcGFja2FnZV9vYmplY3Rfc2l6ZSIsIGludGVybmFsX29iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfZ2V0X3BhY2thZ2Vfb2JqZWN0X3NpemUsIGludGVybmFsX29iamVjdCk7CiAKIAlpbmZvLmxlbmd0aCA9IDA7CiAJaW5mby5vYmplY3Rfc3BhY2UgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHJlc3JjLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0cmVzcmMuYwppbmRleCAxNjQ2MTMxLi41YTJkZTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0cmVzcmMuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0cmVzcmMuYwpAQCAtNDUsMTEzICs0NSwxMTMgQEAKICNpbmNsdWRlIDxhY3BpL2FtbHJlc3JjLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICBBQ1BJX1VUSUxJVElFUwotQUNQSV9NT0RVTEVfTkFNRSgidXRtaXNjIikKK0FDUElfTU9EVUxFX05BTUUoInV0cmVzcmMiKQogCiAjaWYgZGVmaW5lZChBQ1BJX0RJU0FTU0VNQkxFUikgfHwgZGVmaW5lZCAoQUNQSV9ERUJVR0dFUikKIC8qCiAgKiBTdHJpbmdzIHVzZWQgdG8gZGVjb2RlIHJlc291cmNlIGRlc2NyaXB0b3JzLgogICogVXNlZCBieSBib3RoIHRoZSBkaXNhc3NzZW1ibGVyIGFuZCB0aGUgZGVidWdnZXIgcmVzb3VyY2UgZHVtcCByb3V0aW5lcwogICovCi1jb25zdCBjaGFyICphY3BpX2dibF9CTWRlY29kZVsyXSA9IHsKLQkibm90X2J1c19tYXN0ZXIiLAotCSJidXNfbWFzdGVyIgorY29uc3QgY2hhciAqYWNwaV9nYmxfYm1fZGVjb2RlW10gPSB7CisJIk5vdEJ1c01hc3RlciIsCisJIkJ1c01hc3RlciIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2NvbmZpZ19kZWNvZGVbNF0gPSB7Citjb25zdCBjaGFyICphY3BpX2dibF9jb25maWdfZGVjb2RlW10gPSB7CiAJIjAgLSBHb29kIENvbmZpZ3VyYXRpb24iLAogCSIxIC0gQWNjZXB0YWJsZSBDb25maWd1cmF0aW9uIiwKIAkiMiAtIFN1Ym9wdGltYWwgQ29uZmlndXJhdGlvbiIsCiAJIjMgLSAqKipJbnZhbGlkIENvbmZpZ3VyYXRpb24qKioiLAogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfY29uc3VtZV9kZWNvZGVbMl0gPSB7Ci0JInJlc291cmNlX3Byb2R1Y2VyIiwKLQkicmVzb3VyY2VfY29uc3VtZXIiCitjb25zdCBjaGFyICphY3BpX2dibF9jb25zdW1lX2RlY29kZVtdID0geworCSJSZXNvdXJjZVByb2R1Y2VyIiwKKwkiUmVzb3VyY2VDb25zdW1lciIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX0RFQ2RlY29kZVsyXSA9IHsKLQkicG9zX2RlY29kZSIsCi0JInN1Yl9kZWNvZGUiCitjb25zdCBjaGFyICphY3BpX2dibF9kZWNfZGVjb2RlW10gPSB7CisJIlBvc0RlY29kZSIsCisJIlN1YkRlY29kZSIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX0hFZGVjb2RlWzJdID0geworY29uc3QgY2hhciAqYWNwaV9nYmxfaGVfZGVjb2RlW10gPSB7CiAJIkxldmVsIiwKIAkiRWRnZSIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX2lvX2RlY29kZVsyXSA9IHsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2lvX2RlY29kZVtdID0gewogCSJEZWNvZGUxMCIsCiAJIkRlY29kZTE2IgogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfTExkZWNvZGVbMl0gPSB7Ci0JImFjdGl2ZV9oaWdoIiwKLQkiYWN0aXZlX2xvdyIKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX2xsX2RlY29kZVtdID0geworCSJBY3RpdmVIaWdoIiwKKwkiQWN0aXZlTG93IgogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfbWF4X2RlY29kZVsyXSA9IHsKLQkibWF4X25vdF9maXhlZCIsCi0JIm1heF9maXhlZCIKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX21heF9kZWNvZGVbXSA9IHsKKwkiTWF4Tm90Rml4ZWQiLAorCSJNYXhGaXhlZCIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX01FTWRlY29kZVs0XSA9IHsKLQkibm9uX2NhY2hlYWJsZSIsCitjb25zdCBjaGFyICphY3BpX2dibF9tZW1fZGVjb2RlW10gPSB7CisJIk5vbkNhY2hlYWJsZSIsCiAJIkNhY2hlYWJsZSIsCi0JIndyaXRlX2NvbWJpbmluZyIsCisJIldyaXRlQ29tYmluaW5nIiwKIAkiUHJlZmV0Y2hhYmxlIgogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfbWluX2RlY29kZVsyXSA9IHsKLQkibWluX25vdF9maXhlZCIsCi0JIm1pbl9maXhlZCIKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbXSA9IHsKKwkiTWluTm90Rml4ZWQiLAorCSJNaW5GaXhlZCIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX01UUGRlY29kZVs0XSA9IHsKLQkiYWRkcmVzc19yYW5nZV9tZW1vcnkiLAotCSJhZGRyZXNzX3JhbmdlX3Jlc2VydmVkIiwKLQkiYWRkcmVzc19yYW5nZV9hQ1BJIiwKLQkiYWRkcmVzc19yYW5nZV9uVlMiCitjb25zdCBjaGFyICphY3BpX2dibF9tdHBfZGVjb2RlW10gPSB7CisJIkFkZHJlc3NSYW5nZU1lbW9yeSIsCisJIkFkZHJlc3NSYW5nZVJlc2VydmVkIiwKKwkiQWRkcmVzc1JhbmdlQUNQSSIsCisJIkFkZHJlc3NSYW5nZU5WUyIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX1JOR2RlY29kZVs0XSA9IHsKLQkiaW52YWxpZF9yYW5nZXMiLAotCSJub25faVNBb25seV9yYW5nZXMiLAotCSJJU0Fvbmx5X3JhbmdlcyIsCi0JImVudGlyZV9yYW5nZSIKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3JuZ19kZWNvZGVbXSA9IHsKKwkiSW52YWxpZFJhbmdlcyIsCisJIk5vbklTQU9ubHlSYW5nZXMiLAorCSJJU0FPbmx5UmFuZ2VzIiwKKwkiRW50aXJlUmFuZ2UiCiB9OwogCi1jb25zdCBjaGFyICphY3BpX2dibF9SV2RlY29kZVsyXSA9IHsKLQkicmVhZF9vbmx5IiwKLQkicmVhZF93cml0ZSIKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3J3X2RlY29kZVtdID0geworCSJSZWFkT25seSIsCisJIlJlYWRXcml0ZSIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX1NIUmRlY29kZVsyXSA9IHsKK2NvbnN0IGNoYXIgKmFjcGlfZ2JsX3Nocl9kZWNvZGVbXSA9IHsKIAkiRXhjbHVzaXZlIiwKIAkiU2hhcmVkIgogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfU0laZGVjb2RlWzRdID0geworY29uc3QgY2hhciAqYWNwaV9nYmxfc2l6X2RlY29kZVtdID0gewogCSJUcmFuc2ZlcjgiLAogCSJUcmFuc2ZlcjhfMTYiLAogCSJUcmFuc2ZlcjE2IiwKLQkiaW52YWxpZF9zaXplIgorCSJJbnZhbGlkU2l6ZSIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RSU2RlY29kZVsyXSA9IHsKLQkiZGVuc2VfdHJhbnNsYXRpb24iLAotCSJzcGFyc2VfdHJhbnNsYXRpb24iCitjb25zdCBjaGFyICphY3BpX2dibF90cnNfZGVjb2RlW10gPSB7CisJIkRlbnNlVHJhbnNsYXRpb24iLAorCSJTcGFyc2VUcmFuc2xhdGlvbiIKIH07CiAKLWNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RUUGRlY29kZVsyXSA9IHsKLQkidHlwZV9zdGF0aWMiLAotCSJ0eXBlX3RyYW5zbGF0aW9uIgorY29uc3QgY2hhciAqYWNwaV9nYmxfdHRwX2RlY29kZVtdID0geworCSJUeXBlU3RhdGljIiwKKwkiVHlwZVRyYW5zbGF0aW9uIgogfTsKIAotY29uc3QgY2hhciAqYWNwaV9nYmxfVFlQZGVjb2RlWzRdID0geworY29uc3QgY2hhciAqYWNwaV9nYmxfdHlwX2RlY29kZVtdID0gewogCSJDb21wYXRpYmlsaXR5IiwKLQkidHlwZV9hIiwKLQkidHlwZV9iIiwKLQkidHlwZV9mIgorCSJUeXBlQSIsCisJIlR5cGVCIiwKKwkiVHlwZUYiCiB9OwogCiAjZW5kaWYKQEAgLTI0MCw2ICsyNDAsMTA0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgorICogRlVOQ1RJT046ICAgIGFjcGlfdXRfd2Fsa19hbWxfcmVzb3VyY2VzCisgKgorICogUEFSQU1FVEVSUzogIEFtbCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgcmVzb3VyY2UgdGVtcGxhdGUKKyAqICAgICAgICAgICAgICBhbWxfbGVuZ3RoICAgICAgLSBMZW5ndGggb2YgdGhlIGVudGlyZSB0ZW1wbGF0ZQorICogICAgICAgICAgICAgIHVzZXJfZnVuY3Rpb24gICAtIENhbGxlZCBvbmNlIGZvciBlYWNoIGRlc2NyaXB0b3IgZm91bmQuIElmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgYSBwb2ludGVyIHRvIHRoZSBlbmRfdGFnIGlzIHJldHVybmVkCisgKiAgICAgICAgICAgICAgQ29udGV4dCAgICAgICAgIC0gUGFzc2VkIHRvIHVzZXJfZnVuY3Rpb24KKyAqCisgKiBSRVRVUk46ICAgICAgU3RhdHVzCisgKgorICogREVTQ1JJUFRJT046IFdhbGsgYSByYXcgQU1MIHJlc291cmNlIGxpc3QoYnVmZmVyKS4gVXNlciBmdW5jdGlvbiBjYWxsZWQKKyAqICAgICAgICAgICAgICBvbmNlIGZvciBlYWNoIHJlc291cmNlIGZvdW5kLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2FjcGlfc3RhdHVzCithY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcyh1OCAqIGFtbCwKKwkJCSAgIGFjcGlfc2l6ZSBhbWxfbGVuZ3RoLAorCQkJICAgYWNwaV93YWxrX2FtbF9jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLCB2b2lkICoqY29udGV4dCkKK3sKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTggKmVuZF9hbWw7CisJdTggcmVzb3VyY2VfaW5kZXg7CisJdTMyIGxlbmd0aDsKKwl1MzIgb2Zmc2V0ID0gMDsKKworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfd2Fsa19hbWxfcmVzb3VyY2VzKTsKKworCS8qIFRoZSBhYnNvbHV0ZSBtaW5pbXVtIHJlc291cmNlIHRlbXBsYXRlIGlzIG9uZSBlbmRfdGFnIGRlc2NyaXB0b3IgKi8KKworCWlmIChhbWxfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBhbWxfcmVzb3VyY2VfZW5kX3RhZykpIHsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKKwl9CisKKwkvKiBQb2ludCB0byB0aGUgZW5kIG9mIHRoZSByZXNvdXJjZSB0ZW1wbGF0ZSBidWZmZXIgKi8KKworCWVuZF9hbWwgPSBhbWwgKyBhbWxfbGVuZ3RoOworCisJLyogV2FsayB0aGUgYnl0ZSBsaXN0LCBhYm9ydCBvbiBhbnkgaW52YWxpZCBkZXNjcmlwdG9yIHR5cGUgb3IgbGVuZ3RoICovCisKKwl3aGlsZSAoYW1sIDwgZW5kX2FtbCkgeworCisJCS8qIFZhbGlkYXRlIHRoZSBSZXNvdXJjZSBUeXBlIGFuZCBSZXNvdXJjZSBMZW5ndGggKi8KKworCQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKGFtbCwgJnJlc291cmNlX2luZGV4KTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKKwkJfQorCisJCS8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoaXMgZGVzY3JpcHRvciAqLworCisJCWxlbmd0aCA9IGFjcGlfdXRfZ2V0X2Rlc2NyaXB0b3JfbGVuZ3RoKGFtbCk7CisKKwkJLyogSW52b2tlIHRoZSB1c2VyIGZ1bmN0aW9uICovCisKKwkJaWYgKHVzZXJfZnVuY3Rpb24pIHsKKwkJCXN0YXR1cyA9CisJCQkgICAgdXNlcl9mdW5jdGlvbihhbWwsIGxlbmd0aCwgb2Zmc2V0LCByZXNvdXJjZV9pbmRleCwKKwkJCQkJICBjb250ZXh0KTsKKwkJCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJCXJldHVybiAoc3RhdHVzKTsKKwkJCX0KKwkJfQorCisJCS8qIEFuIGVuZF90YWcgZGVzY3JpcHRvciB0ZXJtaW5hdGVzIHRoaXMgcmVzb3VyY2UgdGVtcGxhdGUgKi8KKworCQlpZiAoYWNwaV91dF9nZXRfcmVzb3VyY2VfdHlwZShhbWwpID09CisJCSAgICBBQ1BJX1JFU09VUkNFX05BTUVfRU5EX1RBRykgeworCQkJLyoKKwkJCSAqIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIG1vcmUgYnl0ZSBpbiB0aGUgYnVmZmVyIGZvcgorCQkJICogdGhlIDJuZCBieXRlIG9mIHRoZSBlbmRfdGFnCisJCQkgKi8KKwkJCWlmICgoYW1sICsgMSkgPj0gZW5kX2FtbCkgeworCQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9BTUxfTk9fUkVTT1VSQ0VfRU5EX1RBRyk7CisJCQl9CisKKwkJCS8qIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgZW5kX3RhZyBpZiByZXF1ZXN0ZWQgKi8KKworCQkJaWYgKCF1c2VyX2Z1bmN0aW9uKSB7CisJCQkJKmNvbnRleHQgPSBhbWw7CisJCQl9CisKKwkJCS8qIE5vcm1hbCBleGl0ICovCisKKwkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CisJCX0KKworCQlhbWwgKz0gbGVuZ3RoOworCQlvZmZzZXQgKz0gbGVuZ3RoOworCX0KKworCS8qIERpZCBub3QgZmluZCBhbiBlbmRfdGFnIGRlc2NyaXB0b3IgKi8KKworCXJldHVybiAoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqIEZVTkNUSU9OOiAgICBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlCiAgKgogICogUEFSQU1FVEVSUzogIEFtbCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIHJhdyBBTUwgcmVzb3VyY2UgZGVzY3JpcHRvcgpAQCAtMjczLDYgKzM3MSw3IEBACiAJICogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIKIAkgKi8KIAlpZiAocmVzb3VyY2VfdHlwZSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCiAJCS8qIFZlcmlmeSB0aGUgbGFyZ2UgcmVzb3VyY2UgdHlwZSAobmFtZSkgYWdhaW5zdCB0aGUgbWF4ICovCiAKIAkJaWYgKHJlc291cmNlX3R5cGUgPiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0VfTUFYKSB7CkBAIC0zNzYsNiArNDc1LDcgQEAKIAkgKiBFeGFtaW5lIHRoZSBsYXJnZS9zbWFsbCBiaXQgaW4gdGhlIHJlc291cmNlIGhlYWRlcgogCSAqLwogCWlmIChBQ1BJX0dFVDgoYW1sKSAmIEFDUElfUkVTT1VSQ0VfTkFNRV9MQVJHRSkgeworCiAJCS8qIExhcmdlIFJlc291cmNlIFR5cGUgLS0gYml0cyA2OjAgY29udGFpbiB0aGUgbmFtZSAqLwogCiAJCXJldHVybiAoQUNQSV9HRVQ4KGFtbCkpOwpAQCAtNDExLDYgKzUxMSw3IEBACiAJICogRXhhbWluZSB0aGUgbGFyZ2Uvc21hbGwgYml0IGluIHRoZSByZXNvdXJjZSBoZWFkZXIKIAkgKi8KIAlpZiAoQUNQSV9HRVQ4KGFtbCkgJiBBQ1BJX1JFU09VUkNFX05BTUVfTEFSR0UpIHsKKwogCQkvKiBMYXJnZSBSZXNvdXJjZSB0eXBlIC0tIGJ5dGVzIDEtMiBjb250YWluIHRoZSAxNi1iaXQgbGVuZ3RoICovCiAKIAkJQUNQSV9NT1ZFXzE2X1RPXzE2KCZyZXNvdXJjZV9sZW5ndGgsIEFDUElfQUREX1BUUih1OCwgYW1sLCAxKSk7CkBAIC00OTUsNjAgKzU5NiwyMSBAQAogCQkJICAgICB1OCAqKiBlbmRfdGFnKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQl1OCAqYW1sOwotCXU4ICplbmRfYW1sOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRSgidXRfZ2V0X3Jlc291cmNlX2VuZF90YWciKTsKLQotCS8qIEdldCBzdGFydCBhbmQgZW5kIHBvaW50ZXJzICovCi0KLQlhbWwgPSBvYmpfZGVzYy0+YnVmZmVyLnBvaW50ZXI7Ci0JZW5kX2FtbCA9IGFtbCArIG9ial9kZXNjLT5idWZmZXIubGVuZ3RoOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZ2V0X3Jlc291cmNlX2VuZF90YWcpOwogCiAJLyogQWxsb3cgYSBidWZmZXIgbGVuZ3RoIG9mIHplcm8gKi8KIAogCWlmICghb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgpIHsKLQkJKmVuZF90YWcgPSBhbWw7CisJCSplbmRfdGFnID0gb2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogCX0KIAotCS8qIFdhbGsgdGhlIHJlc291cmNlIHRlbXBsYXRlLCBvbmUgZGVzY3JpcHRvciBwZXIgaXRlcmF0aW9uICovCisJLyogVmFsaWRhdGUgdGhlIHRlbXBsYXRlIGFuZCBnZXQgYSBwb2ludGVyIHRvIHRoZSBlbmRfdGFnICovCiAKLQl3aGlsZSAoYW1sIDwgZW5kX2FtbCkgewotCQkvKiBWYWxpZGF0ZSB0aGUgUmVzb3VyY2UgVHlwZSBhbmQgUmVzb3VyY2UgTGVuZ3RoICovCisJc3RhdHVzID0gYWNwaV91dF93YWxrX2FtbF9yZXNvdXJjZXMob2JqX2Rlc2MtPmJ1ZmZlci5wb2ludGVyLAorCQkJCQkgICAgb2JqX2Rlc2MtPmJ1ZmZlci5sZW5ndGgsIE5VTEwsCisJCQkJCSAgICAodm9pZCAqKillbmRfdGFnKTsKIAotCQlzdGF0dXMgPSBhY3BpX3V0X3ZhbGlkYXRlX3Jlc291cmNlKGFtbCwgTlVMTCk7Ci0JCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewotCQkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7Ci0JCX0KLQotCQkvKiBlbmRfdGFnIHJlc291cmNlIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSByZXNvdXJjZSB0ZW1wbGF0ZSAqLwotCi0JCWlmIChhY3BpX3V0X2dldF9yZXNvdXJjZV90eXBlKGFtbCkgPT0KLQkJICAgIEFDUElfUkVTT1VSQ0VfTkFNRV9FTkRfVEFHKSB7Ci0JCQkvKgotCQkJICogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgbW9yZSBieXRlIGluIHRoZSBidWZmZXIgZm9yCi0JCQkgKiB0aGUgMm5kIGJ5dGUgb2YgdGhlIGVuZF90YWcKLQkJCSAqLwotCQkJaWYgKChhbWwgKyAxKSA+PSBlbmRfYW1sKSB7Ci0JCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0FNTF9OT19SRVNPVVJDRV9FTkRfVEFHKTsKLQkJCX0KLQotCQkJLyogUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBlbmRfdGFnICovCi0KLQkJCSplbmRfdGFnID0gYW1sOwotCQkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKLQkJfQotCi0JCS8qCi0JCSAqIFBvaW50IHRvIHRoZSBuZXh0IHJlc291cmNlIGRlc2NyaXB0b3IgaW4gdGhlIEFNTCBidWZmZXIuIFRoZQotCQkgKiBkZXNjcmlwdG9yIGxlbmd0aCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvIGJ5IHJlc291cmNlCi0JCSAqIHZhbGlkYXRpb24gYWJvdmUuCi0JCSAqLwotCQlhbWwgKz0gYWNwaV91dF9nZXRfZGVzY3JpcHRvcl9sZW5ndGgoYW1sKTsKLQl9Ci0KLQkvKiBEaWQgbm90IGZpbmQgYW4gZW5kX3RhZyByZXNvdXJjZSBkZXNjcmlwdG9yICovCi0KLQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUcpOworCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHN0YXRlLmMgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0c3RhdGUuYwppbmRleCA0YjEzNGE3Li4wZjVjNWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0c3RhdGUuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0c3RhdGUuYwpAQCAtOTYsNyArOTYsNyBAQAogYWNwaV91dF9wdXNoX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICoqbGlzdF9oZWFkLAogCQkJICAgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9wdXNoX2dlbmVyaWNfc3RhdGUiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKHV0X3B1c2hfZ2VuZXJpY19zdGF0ZSk7CiAKIAkvKiBQdXNoIHRoZSBzdGF0ZSBvYmplY3Qgb250byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLwogCkBAIC0xMjMsMTIgKzEyMywxMyBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9wb3BfZ2VuZXJpY19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfcG9wX2dlbmVyaWNfc3RhdGUpOwogCiAJLyogUmVtb3ZlIHRoZSBzdGF0ZSBvYmplY3QgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgKHN0YWNrKSAqLwogCiAJc3RhdGUgPSAqbGlzdF9oZWFkOwogCWlmIChzdGF0ZSkgeworCiAJCS8qIFVwZGF0ZSB0aGUgbGlzdCBoZWFkICovCiAKIAkJKmxpc3RfaGVhZCA9IHN0YXRlLT5jb21tb24ubmV4dDsKQEAgLTE1OCw5ICsxNTksMTAgQEAKIAogCXN0YXRlID0gYWNwaV9vc19hY3F1aXJlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CiAJaWYgKHN0YXRlKSB7CisKIAkJLyogSW5pdGlhbGl6ZSAqLwogCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZih1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUpKTsKLQkJc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURTsKKwkJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURTsKIAl9CiAKIAlyZXR1cm4gKHN0YXRlKTsKQEAgLTE4Myw3ICsxODUsNyBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9jcmVhdGVfdGhyZWFkX3N0YXRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jcmVhdGVfdGhyZWFkX3N0YXRlKTsKIAogCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KIApAQCAtMTk0LDcgKzE5Niw3IEBACiAKIAkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwogCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9USFJFQUQ7CisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9USFJFQUQ7CiAJc3RhdGUtPnRocmVhZC50aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKIAogCXJldHVybl9QVFIoKHN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqKXN0YXRlKTsKQEAgLTIyMCw3ICsyMjIsNyBAQAogewogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqc3RhdGU7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUigidXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSIsIG9iamVjdCk7CisJQUNQSV9GVU5DVElPTl9UUkFDRV9QVFIodXRfY3JlYXRlX3VwZGF0ZV9zdGF0ZSwgb2JqZWN0KTsKIAogCS8qIENyZWF0ZSB0aGUgZ2VuZXJpYyBzdGF0ZSBvYmplY3QgKi8KIApAQCAtMjMxLDcgKzIzMyw3IEBACiAKIAkvKiBJbml0IGZpZWxkcyBzcGVjaWZpYyB0byB0aGUgdXBkYXRlIHN0cnVjdCAqLwogCi0Jc3RhdGUtPmNvbW1vbi5kYXRhX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9VUERBVEU7CisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9VUERBVEU7CiAJc3RhdGUtPnVwZGF0ZS5vYmplY3QgPSBvYmplY3Q7CiAJc3RhdGUtPnVwZGF0ZS52YWx1ZSA9IGFjdGlvbjsKIApAQCAtMjU3LDcgKzI1OSw3IEBACiB7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0VfUFRSKCJ1dF9jcmVhdGVfcGtnX3N0YXRlIiwgaW50ZXJuYWxfb2JqZWN0KTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUih1dF9jcmVhdGVfcGtnX3N0YXRlLCBpbnRlcm5hbF9vYmplY3QpOwogCiAJLyogQ3JlYXRlIHRoZSBnZW5lcmljIHN0YXRlIG9iamVjdCAqLwogCkBAIC0yNjgsNyArMjcwLDcgQEAKIAogCS8qIEluaXQgZmllbGRzIHNwZWNpZmljIHRvIHRoZSB1cGRhdGUgc3RydWN0ICovCiAKLQlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX1BBQ0tBR0U7CisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9QQUNLQUdFOwogCXN0YXRlLT5wa2cuc291cmNlX29iamVjdCA9ICh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICopaW50ZXJuYWxfb2JqZWN0OwogCXN0YXRlLT5wa2cuZGVzdF9vYmplY3QgPSBleHRlcm5hbF9vYmplY3Q7CiAJc3RhdGUtPnBrZy5pbmRleCA9IGluZGV4OwpAQCAtMjk0LDcgKzI5Niw3IEBACiB7CiAJdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZTsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoInV0X2NyZWF0ZV9jb250cm9sX3N0YXRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRSh1dF9jcmVhdGVfY29udHJvbF9zdGF0ZSk7CiAKIAkvKiBDcmVhdGUgdGhlIGdlbmVyaWMgc3RhdGUgb2JqZWN0ICovCiAKQEAgLTMwNSw3ICszMDcsNyBAQAogCiAJLyogSW5pdCBmaWVsZHMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyb2wgc3RydWN0ICovCiAKLQlzdGF0ZS0+Y29tbW9uLmRhdGFfdHlwZSA9IEFDUElfREVTQ19UWVBFX1NUQVRFX0NPTlRST0w7CisJc3RhdGUtPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSBBQ1BJX0RFU0NfVFlQRV9TVEFURV9DT05UUk9MOwogCXN0YXRlLT5jb21tb24uc3RhdGUgPSBBQ1BJX0NPTlRST0xfQ09ORElUSU9OQUxfRVhFQ1VUSU5HOwogCiAJcmV0dXJuX1BUUihzdGF0ZSk7CkBAIC0zMTksMTUgKzMyMSwxOSBAQAogICoKICAqIFJFVFVSTjogICAgICBOb25lCiAgKgotICogREVTQ1JJUFRJT046IFB1dCBhIHN0YXRlIG9iamVjdCBiYWNrIGludG8gdGhlIGdsb2JhbCBzdGF0ZSBjYWNoZS4gIFRoZSBvYmplY3QKLSAqICAgICAgICAgICAgICBpcyBub3QgYWN0dWFsbHkgZnJlZWQgYXQgdGhpcyB0aW1lLgorICogREVTQ1JJUFRJT046IFJlbGVhc2UgYSBzdGF0ZSBvYmplY3QgdG8gdGhlIHN0YXRlIGNhY2hlLiBOVUxMIHN0YXRlIG9iamVjdHMKKyAqICAgICAgICAgICAgICBhcmUgaWdub3JlZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB2b2lkIGFjcGlfdXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUodW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICpzdGF0ZSkKIHsKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJ1dF9kZWxldGVfZ2VuZXJpY19zdGF0ZSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UodXRfZGVsZXRlX2dlbmVyaWNfc3RhdGUpOwogCi0JKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCS8qIElnbm9yZSBudWxsIHN0YXRlICovCisKKwlpZiAoc3RhdGUpIHsKKwkJKHZvaWQpYWNwaV9vc19yZWxlYXNlX29iamVjdChhY3BpX2dibF9zdGF0ZV9jYWNoZSwgc3RhdGUpOworCX0KIAlyZXR1cm5fVk9JRDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXR4ZmFjZS5jIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKaW5kZXggMzA4YTk2MC4uMzUzOGY2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dHhmYWNlLmMKQEAgLTQxLDggKzQxLDYgQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjZXZlbnRzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY25hbWVzcC5oPgpAQCAtNjcsNyArNjUsNyBAQAogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0iKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfaW5pdGlhbGl6ZV9zdWJzeXN0ZW0pOwogCiAJQUNQSV9ERUJVR19FWEVDKGFjcGlfdXRfaW5pdF9zdGFja19wdHJfdHJhY2UoKSk7CiAKQEAgLTEwOSw2ICsxMDcsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbml0aWFsaXplX3N1YnN5c3RlbSkKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9lbmFibGVfc3Vic3lzdGVtCkBAIC0xMjEsMTIgKzEyMSwxMSBAQAogICogICAgICAgICAgICAgIFB1dHMgc3lzdGVtIGludG8gQUNQSSBtb2RlIGlmIGl0IGlzbid0IGFscmVhZHkuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9lbmFibGVfc3Vic3lzdGVtKHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfZW5hYmxlX3N1YnN5c3RlbSIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9lbmFibGVfc3Vic3lzdGVtKTsKIAogCS8qCiAJICogV2UgbXVzdCBpbml0aWFsaXplIHRoZSBoYXJkd2FyZSBiZWZvcmUgd2UgY2FuIGVuYWJsZSBBQ1BJLgpAQCAtMTUyLDcgKzE1MSw3IEBACiAKIAkJc3RhdHVzID0gYWNwaV9lbmFibGUoKTsKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJhY3BpX2VuYWJsZSBmYWlsZWQiKSk7CisJCQlBQ1BJX1dBUk5JTkcoKEFFX0lORk8sICJBY3BpRW5hYmxlIGZhaWxlZCIpKTsKIAkJCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogCQl9CiAJfQpAQCAtMjI5LDYgKzIyOCw4IEBACiAJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiB9CiAKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2VuYWJsZV9zdWJzeXN0ZW0pCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzCkBAIC0yNDEsMTIgKzI0MiwxMSBAQAogICogICAgICAgICAgICAgIG9iamVjdHMgYW5kIGV4ZWN1dGluZyBBTUwgY29kZSBmb3IgUmVnaW9ucywgYnVmZmVycywgZXRjLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIGFjcGlfc3RhdHVzIGFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzKHUzMiBmbGFncykKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfaW5pdGlhbGl6ZV9vYmplY3RzIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX2luaXRpYWxpemVfb2JqZWN0cyk7CiAKIAkvKgogCSAqIFJ1biBhbGwgX1JFRyBtZXRob2RzCkBAIC0yNTcsNyArMjU3LDcgQEAKIAkgKi8KIAlpZiAoIShmbGFncyAmIEFDUElfTk9fQUREUkVTU19TUEFDRV9JTklUKSkgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VYRUMsCi0JCQkJICAiW0luaXRdIEV4ZWN1dGluZyBfUkVHIG9wX3JlZ2lvbiBtZXRob2RzXG4iKSk7CisJCQkJICAiW0luaXRdIEV4ZWN1dGluZyBfUkVHIE9wUmVnaW9uIG1ldGhvZHNcbiIpKTsKIAogCQlzdGF0dXMgPSBhY3BpX2V2X2luaXRpYWxpemVfb3BfcmVnaW9ucygpOwogCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKQEAgLTMwNSw2ICszMDUsOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV9pbml0aWFsaXplX29iamVjdHMpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRlVOQ1RJT046ICAgIGFjcGlfdGVybWluYXRlCkBAIC0zMTYsMTIgKzMxOCwxMSBAQAogICogREVTQ1JJUFRJT046IFNodXRkb3duIHRoZSBBQ1BJIHN1YnN5c3RlbS4gIFJlbGVhc2UgYWxsIHJlc291cmNlcy4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX3Rlcm1pbmF0ZSh2b2lkKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdGVybWluYXRlIik7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3Rlcm1pbmF0ZSk7CiAKIAkvKiBUZXJtaW5hdGUgdGhlIEFNTCBEZWJ1Z2dlciBpZiBwcmVzZW50ICovCiAKQEAgLTM0OCw2ICszNDksOCBAQAogCXJldHVybl9BQ1BJX1NUQVRVUyhzdGF0dXMpOwogfQogCitBQ1BJX0VYUE9SVF9TWU1CT0woYWNwaV90ZXJtaW5hdGUpCisKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0zNjIsNyArMzY1LDYgQEAKICAqICAgICAgICAgICAgICBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9zdWJzeXN0ZW1fc3RhdHVzKHZvaWQpCiB7CiAKQEAgLTM3Myw2ICszNzUsOCBAQAogCX0KIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfc3Vic3lzdGVtX3N0YXR1cykKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBGVU5DVElPTjogICAgYWNwaV9nZXRfc3lzdGVtX2luZm8KQEAgLTM5MCwxNCArMzk0LDEzIEBACiAgKiAgICAgICAgICAgICAgYW5kIHRoZSB2YWx1ZSBvZiBvdXRfYnVmZmVyIGlzIHVuZGVmaW5lZC4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCiBhY3BpX3N0YXR1cyBhY3BpX2dldF9zeXN0ZW1faW5mbyhzdHJ1Y3QgYWNwaV9idWZmZXIgKiBvdXRfYnVmZmVyKQogewogCXN0cnVjdCBhY3BpX3N5c3RlbV9pbmZvICppbmZvX3B0cjsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdTMyIGk7CiAKLQlBQ1BJX0ZVTkNUSU9OX1RSQUNFKCJhY3BpX2dldF9zeXN0ZW1faW5mbyIpOworCUFDUElfRlVOQ1RJT05fVFJBQ0UoYWNwaV9nZXRfc3lzdGVtX2luZm8pOwogCiAJLyogUGFyYW1ldGVyIHZhbGlkYXRpb24gKi8KIApAQCAtNDQ4LDE1ICs0NTEsMTUgQEAKIAogCS8qIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBBQ1BJIHRhYmxlcywgcGVyIHRhYmxlIHR5cGUgKi8KIAotCWluZm9fcHRyLT5udW1fdGFibGVfdHlwZXMgPSBOVU1fQUNQSV9UQUJMRV9UWVBFUzsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0FDUElfVEFCTEVfVFlQRVM7IGkrKykgeworCWluZm9fcHRyLT5udW1fdGFibGVfdHlwZXMgPSBBQ1BJX1RBQkxFX0lEX01BWCArIDE7CisJZm9yIChpID0gMDsgaSA8IChBQ1BJX1RBQkxFX0lEX01BWCArIDEpOyBpKyspIHsKIAkJaW5mb19wdHItPnRhYmxlX2luZm9baV0uY291bnQgPSBhY3BpX2dibF90YWJsZV9saXN0c1tpXS5jb3VudDsKIAl9CiAKIAlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfT0spOwogfQogCi1FWFBPUlRfU1lNQk9MKGFjcGlfZ2V0X3N5c3RlbV9pbmZvKTsKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX2dldF9zeXN0ZW1faW5mbykKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtNDcyLDcgKzQ3NSw2IEBACiAgKiBUQkQ6IFdoZW4gYSBzZWNvbmQgZnVuY3Rpb24gaXMgYWRkZWQsIG11c3Qgc2F2ZSB0aGUgRnVuY3Rpb24gYWxzby4KICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMKIGFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKGFjcGlfaW5pdF9oYW5kbGVyIGhhbmRsZXIsIHUzMiBmdW5jdGlvbikKIHsKQEAgLTQ4OSw2ICs0OTEsNyBAQAogCXJldHVybiBBRV9PSzsKIH0KIAorQUNQSV9FWFBPUlRfU1lNQk9MKGFjcGlfaW5zdGFsbF9pbml0aWFsaXphdGlvbl9oYW5kbGVyKQogI2VuZGlmCQkJCS8qICBBQ1BJX0ZVVFVSRV9VU0FHRSAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MDIsMTAgKzUwNSw5IEBACiAgKiBERVNDUklQVElPTjogRW1wdHkgYWxsIGNhY2hlcyAoZGVsZXRlIHRoZSBjYWNoZWQgb2JqZWN0cykKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogYWNwaV9zdGF0dXMgYWNwaV9wdXJnZV9jYWNoZWRfb2JqZWN0cyh2b2lkKQogewotCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMiKTsKKwlBQ1BJX0ZVTkNUSU9OX1RSQUNFKGFjcGlfcHVyZ2VfY2FjaGVkX29iamVjdHMpOwogCiAJKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9zdGF0ZV9jYWNoZSk7CiAJKHZvaWQpYWNwaV9vc19wdXJnZV9jYWNoZShhY3BpX2dibF9vcGVyYW5kX2NhY2hlKTsKQEAgLTUxMywzICs1MTUsNSBAQAogCSh2b2lkKWFjcGlfb3NfcHVyZ2VfY2FjaGUoYWNwaV9nYmxfcHNfbm9kZV9leHRfY2FjaGUpOwogCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7CiB9CisKK0FDUElfRVhQT1JUX1NZTUJPTChhY3BpX3B1cmdlX2NhY2hlZF9vYmplY3RzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwppbmRleCA2NDU4YzQ3Li42YjUxNjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwpAQCAtMjczLDExICsyNzMsMTMgQEAKIAlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIHBhdGhuYW1lLCBhcmd1bWVudHMsICZidWZmZXIpOwogCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgewogCQlhY3BpX3V0aWxfZXZhbF9lcnJvcihoYW5kbGUsIHBhdGhuYW1lLCBzdGF0dXMpOworCQlrZnJlZShlbGVtZW50KTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKHN0YXR1cyk7CiAJfQogCiAJaWYgKGVsZW1lbnQtPnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIpIHsKIAkJYWNwaV91dGlsX2V2YWxfZXJyb3IoaGFuZGxlLCBwYXRobmFtZSwgQUVfQkFEX0RBVEEpOworCQlrZnJlZShlbGVtZW50KTsKIAkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX0JBRF9EQVRBKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS92aWRlby5jIGIvZHJpdmVycy9hY3BpL3ZpZGVvLmMKaW5kZXggYmQ0ODg3NS4uZTdlOWE2OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC0zMjMsNyArMzIzLDcgQEAKIAlpZiAoIUFDUElfU1VDQ0VTUyhzdGF0dXMpKQogCQlyZXR1cm5fVkFMVUUoc3RhdHVzKTsKIAlvYmogPSAodW5pb24gYWNwaV9vYmplY3QgKilidWZmZXIucG9pbnRlcjsKLQlpZiAoIW9iaiAmJiAob2JqLT50eXBlICE9IEFDUElfVFlQRV9QQUNLQUdFKSkgeworCWlmICghb2JqIHx8IChvYmotPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsICJJbnZhbGlkIF9CQ0wgZGF0YVxuIikpOwogCQlzdGF0dXMgPSAtRUZBVUxUOwogCQlnb3RvIGVycjsKQEAgLTEyOTQsNyArMTI5NCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgYWNwaV92aWRlb19idXMgKnZpZGVvKQogewogCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2lkOwotCWludCBzdGF0dXMsIHJlc3VsdDsKKwlpbnQgc3RhdHVzOwogCXN0cnVjdCBhY3BpX3ZpZGVvX2RldmljZSAqZGF0YTsKIAogCUFDUElfRlVOQ1RJT05fVFJBQ0UoImFjcGlfdmlkZW9fYnVzX2dldF9vbmVfZGV2aWNlIik7CkBAIC0xMzQ2LDggKzEzNDYsMTEgQEAKIAkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLAogCQkJCQkgICJFcnJvciBpbnN0YWxsaW5nIG5vdGlmeSBoYW5kbGVyXG4iKSk7Ci0JCQlyZXN1bHQgPSAtRU5PREVWOwotCQkJZ290byBlbmQ7CisJCQlpZihkYXRhLT5icmlnaHRuZXNzKQorCQkJCWtmcmVlKGRhdGEtPmJyaWdodG5lc3MtPmxldmVscyk7CisJCQlrZnJlZShkYXRhLT5icmlnaHRuZXNzKTsKKwkJCWtmcmVlKGRhdGEpOworCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAogCQlkb3duKCZ2aWRlby0+c2VtKTsKQEAgLTEzNTksNyArMTM2Miw2IEBACiAJCXJldHVybl9WQUxVRSgwKTsKIAl9CiAKLSAgICAgIGVuZDoKIAlyZXR1cm5fVkFMVUUoLUVOT0VOVCk7CiB9CiAKQEAgLTE2NDMsOCArMTY0NSw5IEBACiAJCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWAogCQkJICAgICAgICJoaHV1aGh1dSBidWcgaW4gYWNwaSB2aWRlbyBkcml2ZXIuXG4iKTsKIAorCQlpZiAoZGF0YS0+YnJpZ2h0bmVzcykKKwkJCWtmcmVlKGRhdGEtPmJyaWdodG5lc3MtPmxldmVscyk7CiAJCWtmcmVlKGRhdGEtPmJyaWdodG5lc3MpOwotCiAJCWtmcmVlKGRhdGEpOwogCX0KIApAQCAtMTc4NSw2ICsxNzg4LDEwIEBACiAJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfRVJST1IsCiAJCQkJICAiRXJyb3IgaW5zdGFsbGluZyBub3RpZnkgaGFuZGxlclxuIikpOworCQlhY3BpX3ZpZGVvX2J1c19zdG9wX2RldmljZXModmlkZW8pOworCQlhY3BpX3ZpZGVvX2J1c19wdXRfZGV2aWNlcyh2aWRlbyk7CisJCWtmcmVlKHZpZGVvLT5hdHRhY2hlZF9hcnJheSk7CisJCWFjcGlfdmlkZW9fYnVzX3JlbW92ZV9mcyhkZXZpY2UpOwogCQlyZXN1bHQgPSAtRU5PREVWOwogCQlnb3RvIGVuZDsKIAl9CkBAIC0xNzk2LDEwICsxODAzLDggQEAKIAkgICAgICAgdmlkZW8tPmZsYWdzLnBvc3QgPyAieWVzIiA6ICJubyIpOwogCiAgICAgICBlbmQ6Ci0JaWYgKHJlc3VsdCkgewotCQlhY3BpX3ZpZGVvX2J1c19yZW1vdmVfZnMoZGV2aWNlKTsKKwlpZiAocmVzdWx0KQogCQlrZnJlZSh2aWRlbyk7Ci0JfQogCiAJcmV0dXJuX1ZBTFVFKHJlc3VsdCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCBkMGY4NGZmLi4yN2MyMTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTM1Niw2ICszNTYsMTMgQEAKIAlpZiAocGFyZW50KQogCQlrbGlzdF9hZGRfdGFpbCgmZGV2LT5rbm9kZV9wYXJlbnQsICZwYXJlbnQtPmtsaXN0X2NoaWxkcmVuKTsKIAorCWlmIChkZXYtPmNsYXNzKSB7CisJCS8qIHRpZSB0aGUgY2xhc3MgdG8gdGhlIGRldmljZSAqLworCQlkb3duKCZkZXYtPmNsYXNzLT5zZW0pOworCQlsaXN0X2FkZF90YWlsKCZkZXYtPm5vZGUsICZkZXYtPmNsYXNzLT5kZXZpY2VzKTsKKwkJdXAoJmRldi0+Y2xhc3MtPnNlbSk7CisJfQorCiAJLyogbm90aWZ5IHBsYXRmb3JtIG9mIGRldmljZSBlbnRyeSAqLwogCWlmIChwbGF0Zm9ybV9ub3RpZnkpCiAJCXBsYXRmb3JtX25vdGlmeShkZXYpOwpAQCAtNDU1LDYgKzQ2Miw5IEBACiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJkZXZpY2UiKTsKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJmRldi0+cGFyZW50LT5rb2JqLCBjbGFzc19uYW1lKTsKIAkJa2ZyZWUoY2xhc3NfbmFtZSk7CisJCWRvd24oJmRldi0+Y2xhc3MtPnNlbSk7CisJCWxpc3RfZGVsX2luaXQoJmRldi0+bm9kZSk7CisJCXVwKCZkZXYtPmNsYXNzLT5zZW0pOwogCX0KIAlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmZGV2LT51ZXZlbnRfYXR0cik7CiAKQEAgLTYwMSwxMSArNjExLDYgQEAKIAlpZiAocmV0dmFsKQogCQlnb3RvIGVycm9yOwogCi0JLyogdGllIHRoZSBjbGFzcyB0byB0aGUgZGV2aWNlICovCi0JZG93bigmY2xhc3MtPnNlbSk7Ci0JbGlzdF9hZGRfdGFpbCgmZGV2LT5ub2RlLCAmY2xhc3MtPmRldmljZXMpOwotCXVwKCZjbGFzcy0+c2VtKTsKLQogCXJldHVybiBkZXY7CiAKIGVycm9yOgpAQCAtNjM2LDkgKzY0MSw3IEBACiAJfQogCXVwKCZjbGFzcy0+c2VtKTsKIAotCWlmIChkZXYpIHsKLQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5ub2RlKTsKKwlpZiAoZGV2KQogCQlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwotCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9wb3dlci9NYWtlZmlsZQppbmRleCBjZWVlYmEyLi45MWYyMzA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL01ha2VmaWxlCkBAIC0xLDUgKzEsNiBAQAogb2JqLXkJCQk6PSBzaHV0ZG93bi5vCiBvYmotJChDT05GSUdfUE0pCSs9IG1haW4ubyBzdXNwZW5kLm8gcmVzdW1lLm8gcnVudGltZS5vIHN5c2ZzLm8KK29iai0kKENPTkZJR19QTV9UUkFDRSkJKz0gdHJhY2UubwogCiBpZmVxICgkKENPTkZJR19ERUJVR19EUklWRVIpLHkpCiBFWFRSQV9DRkxBR1MgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3Jlc3VtZS5jCmluZGV4IDMxN2VkYmYuLjUyMDY3OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9yZXN1bWUuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvcmVzdW1lLmMKQEAgLTksNiArOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgogI2luY2x1ZGUgIi4uL2Jhc2UuaCIKICNpbmNsdWRlICJwb3dlci5oIgogCkBAIC0yMyw2ICsyNCw4IEBACiB7CiAJaW50IGVycm9yID0gMDsKIAorCVRSQUNFX0RFVklDRShkZXYpOworCVRSQUNFX1JFU1VNRSgwKTsKIAlkb3duKCZkZXYtPnNlbSk7CiAJaWYgKGRldi0+cG93ZXIucG1fcGFyZW50CiAJCQkmJiBkZXYtPnBvd2VyLnBtX3BhcmVudC0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpIHsKQEAgLTM2LDYgKzM5LDcgQEAKIAkJZXJyb3IgPSBkZXYtPmJ1cy0+cmVzdW1lKGRldik7CiAJfQogCXVwKCZkZXYtPnNlbSk7CisJVFJBQ0VfUkVTVU1FKGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlhYjMwZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogZHJpdmVycy9iYXNlL3Bvd2VyL3RyYWNlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTGludXMgVG9ydmFsZHMKKyAqCisgKiBUcmFjZSBmYWNpbGl0eSBmb3Igc3VzcGVuZC9yZXN1bWUgcHJvYmxlbXMsIHdoZW4gbm9uZSBvZiB0aGUKKyAqIGRldmljZXMgbWF5IGJlIHdvcmtpbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorCisjaW5jbHVkZSA8YXNtL3J0Yy5oPgorCisjaW5jbHVkZSAicG93ZXIuaCIKKworLyoKKyAqIEhvcnJpZCwgaG9ycmlkLCBob3JyaWQuCisgKgorICogSXQgdHVybnMgb3V0IHRoYXQgdGhlIF9vbmx5XyBwaWVjZSBvZiBoYXJkd2FyZSB0aGF0IGFjdHVhbGx5CisgKiBrZWVwcyBpdHMgdmFsdWUgYWNyb3NzIGEgaGFyZCBib290IChhbmQsIG1vcmUgaW1wb3J0YW50bHksIHRoZQorICogUE9TVCBpbml0IHNlcXVlbmNlKSBpcyBsaXRlcmFsbHkgdGhlIHJlYWx0aW1lIGNsb2NrLgorICoKKyAqIE5ldmVyIG1pbmQgdGhhdCBhbiBSVEMgY2hpcCBoYXMgMTE0IGJ5dGVzIChhbmQgb2Z0ZW4gYSB3aG9sZQorICogb3RoZXIgYmFuayBvZiBhbiBhZGRpdGlvbmFsIDEyOCBieXRlcykgb2YgbmljZSBTUkFNIHRoYXQgaXMKKyAqIF9kZXNpZ25lZF8gdG8ga2VlcCBkYXRhIC0gdGhlIFBPU1Qgd2lsbCBjbGVhciBpdC4gU28gd2UgbGl0ZXJhbGx5CisgKiBjYW4ganVzdCB1c2UgdGhlIGZldyBieXRlcyBvZiBhY3R1YWwgdGltZSBkYXRhLCB3aGljaCBtZWFucyB0aGF0CisgKiB3ZSdyZSByZWFsbHkgbGltaXRlZC4KKyAqCisgKiBJdCBtZWFucywgZm9yIGV4YW1wbGUsIHRoYXQgd2UgY2FuJ3QgdXNlIHRoZSBzZWNvbmRzIGF0IGFsbAorICogKHNpbmNlIHRoZSB0aW1lIGJldHdlZW4gdGhlIGhhbmcgYW5kIHRoZSBib290IG1pZ2h0IGJlIG1vcmUKKyAqIHRoYW4gYSBtaW51dGUpLCBhbmQgd2UnZCBiZXR0ZXIgbm90IGRlcGVuZCBvbiB0aGUgbG93IGJpdHMgb2YKKyAqIHRoZSBtaW51dGVzIGVpdGhlci4KKyAqCisgKiBUaGVyZSBhcmUgdGhlIHdkYXkgZmllbGRzIGV0YywgYnV0IEkgd291bGRuJ3QgZ3VhcmFudGVlIHRob3NlCisgKiBhcmUgZGVwZW5kYWJsZSBlaXRoZXIuIEFuZCBpZiB0aGUgZGF0ZSBpc24ndCB2YWxpZCwgZWl0aGVyIHRoZQorICogaHcgb3IgUE9TVCB3aWxsIGRvIHN0cmFuZ2UgdGhpbmdzLgorICoKKyAqIFNvIHdlJ3JlIGxlZnQgd2l0aDoKKyAqICAtIHllYXI6IDAtOTkKKyAqICAtIG1vbnRoOiAwLTExCisgKiAgLSBkYXktb2YtbW9udGg6IDEtMjgKKyAqICAtIGhvdXI6IDAtMjMKKyAqICAtIG1pbjogKDAtMzApKjIKKyAqCisgKiBHaXZpbmcgdXMgYSB0b3RhbCByYW5nZSBvZiAwLTE2MTI4MDAwICgweGY2MTgwMCksIGllIGxlc3MKKyAqIHRoYW4gMjQgYml0cyBvZiBhY3R1YWwgZGF0YSB3ZSBjYW4gc2F2ZSBhY3Jvc3MgcmVib290cy4KKyAqCisgKiBBbmQgaWYgeW91ciBib3ggY2FuJ3QgYm9vdCBpbiBsZXNzIHRoYW4gdGhyZWUgbWludXRlcywKKyAqIHlvdSdyZSBzY3Jld2VkLgorICoKKyAqIE5vdywgYWxtb3N0IDI0IGJpdHMgb2YgZGF0YSBpcyBwaXRpZnVsbHkgc21hbGwsIHNvIHdlIG5lZWQKKyAqIHRvIGJlIHByZXR0eSBkZW5zZSBpZiB3ZSB3YW50IHRvIHVzZSBpdCBmb3IgYW55dGhpbmcgbmljZS4KKyAqIFdoYXQgd2UgZG8gaXMgdGhhdCBpbnN0ZWFkIG9mIHNhdmluZyBvZmYgbmljZSByZWFkYWJsZSBpbmZvLAorICogd2Ugc2F2ZSBvZmYgX2hhc2hlc18gb2YgaW5mb3JtYXRpb24gdGhhdCB3ZSBjYW4gaG9wZWZ1bGx5CisgKiByZWdlbmVyYXRlIGFmdGVyIHRoZSByZWJvb3QuCisgKgorICogSW4gcGFydGljdWxhciwgdGhpcyBtZWFucyB0aGF0IHdlIG1pZ2h0IGJlIHVubHVja3ksIGFuZCBoaXQKKyAqIGEgY2FzZSB3aGVyZSB3ZSBoYXZlIGEgaGFzaCBjb2xsaXNpb24sIGFuZCB3ZSBlbmQgdXAgbm90CisgKiBiZWluZyBhYmxlIHRvIHRlbGwgZm9yIGNlcnRhaW4gZXhhY3RseSB3aGljaCBjYXNlIGhhcHBlbmVkLgorICogQnV0IHRoYXQncyBob3BlZnVsbHkgdW5saWtlbHkuCisgKgorICogV2hhdCB3ZSBkbyBpcyB0byB0YWtlIHRoZSBiaXRzIHdlIGNhbiBmaXQsIGFuZCBzcGxpdCB0aGVtCisgKiBpbnRvIHRocmVlIHBhcnRzICgxNio5OTcqMTAwOSA9IDE2MDk1NTY4KSwgYW5kIHVzZSB0aGUgdmFsdWVzCisgKiBmb3I6CisgKiAgLSAwLTE1OiB1c2VyLXNldHRhYmxlCisgKiAgLSAwLTk5NjogZmlsZSArIGxpbmUgbnVtYmVyCisgKiAgLSAwLTEwMDg6IGRldmljZQorICovCisjZGVmaW5lIFVTRVJIQVNIICgxNikKKyNkZWZpbmUgRklMRUhBU0ggKDk5NykKKyNkZWZpbmUgREVWSEFTSCAoMTAwOSkKKworI2RlZmluZSBERVZTRUVEICg3OTE5KQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRldl9oYXNoX3ZhbHVlOworCitzdGF0aWMgaW50IHNldF9tYWdpY190aW1lKHVuc2lnbmVkIGludCB1c2VyLCB1bnNpZ25lZCBpbnQgZmlsZSwgdW5zaWduZWQgaW50IGRldmljZSkKK3sKKwl1bnNpZ25lZCBpbnQgbiA9IHVzZXIgKyBVU0VSSEFTSCooZmlsZSArIEZJTEVIQVNIKmRldmljZSk7CisKKwkvLyBKdW5lIDd0aCwgMjAwNgorCXN0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgdGltZSA9IHsKKwkJLnRtX3NlYyA9IDAsCisJCS50bV9taW4gPSAwLAorCQkudG1faG91ciA9IDAsCisJCS50bV9tZGF5ID0gNywKKwkJLnRtX21vbiA9IDUsCS8vIEp1bmUgLSBjb3VudGluZyBmcm9tIHplcm8KKwkJLnRtX3llYXIgPSAxMDYsCisJCS50bV93ZGF5ID0gMywKKwkJLnRtX3lkYXkgPSAxNjAsCisJCS50bV9pc2RzdCA9IDEKKwl9OworCisJdGltZS50bV95ZWFyID0gKG4gJSAxMDApOworCW4gLz0gMTAwOworCXRpbWUudG1fbW9uID0gKG4gJSAxMik7CisJbiAvPSAxMjsKKwl0aW1lLnRtX21kYXkgPSAobiAlIDI4KSArIDE7CisJbiAvPSAyODsKKwl0aW1lLnRtX2hvdXIgPSAobiAlIDI0KTsKKwluIC89IDI0OworCXRpbWUudG1fbWluID0gKG4gJSAyMCkgKiAzOworCW4gLz0gMjA7CisJc2V0X3J0Y190aW1lKCZ0aW1lKTsKKwlyZXR1cm4gbiA/IC0xIDogMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByZWFkX21hZ2ljX3RpbWUodm9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdGltZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJZ2V0X3J0Y190aW1lKCZ0aW1lKTsKKwlwcmludGsoIlRpbWU6ICUyZDolMDJkOiUwMmQgIERhdGU6ICUwMmQvJTAyZC8lMDJkXG4iLAorCQl0aW1lLnRtX2hvdXIsIHRpbWUudG1fbWluLCB0aW1lLnRtX3NlYywKKwkJdGltZS50bV9tb24sIHRpbWUudG1fbWRheSwgdGltZS50bV95ZWFyKTsKKwl2YWwgPSB0aW1lLnRtX3llYXI7CQkJCS8qIDEwMCB5ZWFycyAqLworCWlmICh2YWwgPiAxMDApCisJCXZhbCAtPSAxMDA7CisJdmFsICs9IHRpbWUudG1fbW9uICogMTAwOwkJCS8qIDEyIG1vbnRocyAqLworCXZhbCArPSAodGltZS50bV9tZGF5LTEpICogMTAwICogMTI7CQkvKiAyOCBtb250aC1kYXlzICovCisJdmFsICs9IHRpbWUudG1faG91ciAqIDEwMCAqIDEyICogMjg7CQkvKiAyNCBob3VycyAqLworCXZhbCArPSAodGltZS50bV9taW4gLyAzKSAqIDEwMCAqIDEyICogMjggKiAyNDsJLyogMjAgMy1taW51dGUgaW50ZXJ2YWxzICovCisJcmV0dXJuIHZhbDsKK30KKworLyoKKyAqIFRoaXMgaXMganVzdCB0aGUgc2RibSBoYXNoIGZ1bmN0aW9uIHdpdGggYSB1c2VyLXN1cHBsaWVkCisgKiBzZWVkIGFuZCBmaW5hbCBzaXplIHBhcmFtZXRlci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX3N0cmluZyh1bnNpZ25lZCBpbnQgc2VlZCwgY29uc3QgY2hhciAqZGF0YSwgdW5zaWduZWQgaW50IG1vZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGM7CisJd2hpbGUgKChjID0gKmRhdGErKykgIT0gMCkgeworCQlzZWVkID0gKHNlZWQgPDwgMTYpICsgKHNlZWQgPDwgNikgLSBzZWVkICsgYzsKKwl9CisJcmV0dXJuIHNlZWQgJSBtb2Q7Cit9CisKK3ZvaWQgc2V0X3RyYWNlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGV2X2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhERVZTRUVELCBkZXYtPmJ1c19pZCwgREVWSEFTSCk7Cit9CisKKy8qCisgKiBXZSBjb3VsZCBqdXN0IHRha2UgdGhlICJ0cmFjZWRhdGEiIGluZGV4IGludG8gdGhlIC50cmFjZWRhdGEKKyAqIHNlY3Rpb24gaW5zdGVhZC4gR2VuZXJhdGluZyBhIGhhc2ggb2YgdGhlIGRhdGEgZ2l2ZXMgdXMgYQorICogY2hhbmNlIHRvIHdvcmsgYWNyb3NzIGtlcm5lbCB2ZXJzaW9ucywgYW5kIHBlcmhhcHMgbW9yZQorICogaW1wb3J0YW50bHkgaXQgYWxzbyBnaXZlcyB1cyB2YWxpZC9pbnZhbGlkIGNoZWNrIChpZSB3ZSB3aWxsCisgKiBsaWtlbHkgbm90IGdpdmUgdG90YWxseSBib2d1cyByZXBvcnRzIC0gaWYgdGhlIGhhc2ggbWF0Y2hlcywKKyAqIGl0J3Mgbm90IGFueSBndWFyYW50ZWUsIGJ1dCBpdCdzIGEgaGlnaCBfbGlrZWxpaG9vZF8gdGhhdAorICogdGhlIG1hdGNoIGlzIHZhbGlkKS4KKyAqLwordm9pZCBnZW5lcmF0ZV9yZXN1bWVfdHJhY2Uodm9pZCAqdHJhY2VkYXRhLCB1bnNpZ25lZCBpbnQgdXNlcikKK3sKKwl1bnNpZ25lZCBzaG9ydCBsaW5lbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopdHJhY2VkYXRhOworCWNvbnN0IGNoYXIgKmZpbGUgPSAqKGNvbnN0IGNoYXIgKiopKHRyYWNlZGF0YSArIDIpOworCXVuc2lnbmVkIGludCB1c2VyX2hhc2hfdmFsdWUsIGZpbGVfaGFzaF92YWx1ZTsKKworCXVzZXJfaGFzaF92YWx1ZSA9IHVzZXIgJSBVU0VSSEFTSDsKKwlmaWxlX2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhsaW5lbm8sIGZpbGUsIEZJTEVIQVNIKTsKKwlzZXRfbWFnaWNfdGltZSh1c2VyX2hhc2hfdmFsdWUsIGZpbGVfaGFzaF92YWx1ZSwgZGV2X2hhc2hfdmFsdWUpOworfQorCitleHRlcm4gY2hhciBfX3RyYWNlZGF0YV9zdGFydCwgX190cmFjZWRhdGFfZW5kOworc3RhdGljIGludCBzaG93X2ZpbGVfaGFzaCh1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJaW50IG1hdGNoOworCWNoYXIgKnRyYWNlZGF0YTsKKworCW1hdGNoID0gMDsKKwlmb3IgKHRyYWNlZGF0YSA9ICZfX3RyYWNlZGF0YV9zdGFydCA7IHRyYWNlZGF0YSA8ICZfX3RyYWNlZGF0YV9lbmQgOyB0cmFjZWRhdGEgKz0gNikgeworCQl1bnNpZ25lZCBzaG9ydCBsaW5lbm8gPSAqKHVuc2lnbmVkIHNob3J0ICopdHJhY2VkYXRhOworCQljb25zdCBjaGFyICpmaWxlID0gKihjb25zdCBjaGFyICoqKSh0cmFjZWRhdGEgKyAyKTsKKwkJdW5zaWduZWQgaW50IGhhc2ggPSBoYXNoX3N0cmluZyhsaW5lbm8sIGZpbGUsIEZJTEVIQVNIKTsKKwkJaWYgKGhhc2ggIT0gdmFsdWUpCisJCQljb250aW51ZTsKKwkJcHJpbnRrKCIgIGhhc2ggbWF0Y2hlcyAlczoldVxuIiwgZmlsZSwgbGluZW5vKTsKKwkJbWF0Y2grKzsKKwl9CisJcmV0dXJuIG1hdGNoOworfQorCitzdGF0aWMgaW50IHNob3dfZGV2X2hhc2godW5zaWduZWQgaW50IHZhbHVlKQoreworCWludCBtYXRjaCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqIGVudHJ5ID0gZHBtX2FjdGl2ZS5wcmV2OworCisJd2hpbGUgKGVudHJ5ICE9ICZkcG1fYWN0aXZlKSB7CisJCXN0cnVjdCBkZXZpY2UgKiBkZXYgPSB0b19kZXZpY2UoZW50cnkpOworCQl1bnNpZ25lZCBpbnQgaGFzaCA9IGhhc2hfc3RyaW5nKERFVlNFRUQsIGRldi0+YnVzX2lkLCBERVZIQVNIKTsKKwkJaWYgKGhhc2ggPT0gdmFsdWUpIHsKKwkJCXByaW50aygiICBoYXNoIG1hdGNoZXMgZGV2aWNlICVzXG4iLCBkZXYtPmJ1c19pZCk7CisJCQltYXRjaCsrOworCQl9CisJCWVudHJ5ID0gZW50cnktPnByZXY7CisJfQorCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoYXNoX3ZhbHVlX2Vhcmx5X3JlYWQ7CisKK3N0YXRpYyBpbnQgZWFybHlfcmVzdW1lX2luaXQodm9pZCkKK3sKKwloYXNoX3ZhbHVlX2Vhcmx5X3JlYWQgPSByZWFkX21hZ2ljX3RpbWUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsYXRlX3Jlc3VtZV9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHZhbCA9IGhhc2hfdmFsdWVfZWFybHlfcmVhZDsKKwl1bnNpZ25lZCBpbnQgdXNlciwgZmlsZSwgZGV2OworCisJdXNlciA9IHZhbCAlIFVTRVJIQVNIOworCXZhbCA9IHZhbCAvIFVTRVJIQVNIOworCWZpbGUgPSB2YWwgJSBGSUxFSEFTSDsKKwl2YWwgPSB2YWwgLyBGSUxFSEFTSDsKKwlkZXYgPSB2YWwgLyogJSBERVZIQVNIICovOworCisJcHJpbnRrKCIgIE1hZ2ljIG51bWJlcjogJWQ6JWQ6JWRcbiIsIHVzZXIsIGZpbGUsIGRldik7CisJc2hvd19maWxlX2hhc2goZmlsZSk7CisJc2hvd19kZXZfaGFzaChkZXYpOworCXJldHVybiAwOworfQorCitjb3JlX2luaXRjYWxsKGVhcmx5X3Jlc3VtZV9pbml0KTsKK2xhdGVfaW5pdGNhbGwobGF0ZV9yZXN1bWVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL0tjb25maWcgYi9kcml2ZXJzL2Jsb2NrL0tjb25maWcKaW5kZXggYWUwOTQ5Yi4uOTNkOTQ3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9LY29uZmlnCisrKyBiL2RyaXZlcnMvYmxvY2svS2NvbmZpZwpAQCAtNDAyLDYgKzQwMiw3IEBACiAKIGNvbmZpZyBCTEtfREVWX0lOSVRSRAogCWJvb2wgIkluaXRpYWwgUkFNIGZpbGVzeXN0ZW0gYW5kIFJBTSBkaXNrIChpbml0cmFtZnMvaW5pdHJkKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlJPS0VOIHx8ICFGUlYKIAloZWxwCiAJICBUaGUgaW5pdGlhbCBSQU0gZmlsZXN5c3RlbSBpcyBhIHJhbWZzIHdoaWNoIGlzIGxvYWRlZCBieSB0aGUKIAkgIGJvb3QgbG9hZGVyIChsb2FkbGluIG9yIGxpbG8pIGFuZCB0aGF0IGlzIG1vdW50ZWQgYXMgcm9vdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9hbWlmbG9wLmMgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwppbmRleCAyYThhZjY4Li4yNjQxNTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2FtaWZsb3AuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZWxldmF0b3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggMjVjM2M0YS4uMzliMGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa3BnLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgpAQCAtNjQsMTQzICs2NCwxMjkgQEAKIAogLyogZGVmaW5lIHRoZSBQQ0kgaW5mbyBmb3IgdGhlIGNhcmRzIHdlIGNhbiBjb250cm9sICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2Npc3NfcGNpX2RldmljZV9pZFtdID0gewotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1MsCi0JCQkweDBFMTEsIDB4NDA3MCwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MCwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MiwgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsCi0gICAgICAgICAgICAgICAgICAgICAgICAweDBFMTEsIDB4NDA4MywgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsCi0JCTB4MEUxMSwgMHg0MDlBLCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywKLQkJMHgwRTExLCAweDQwOUIsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLAotCQkweDBFMTEsIDB4NDA5QywgMCwgMCwgMH0sCi0JeyBQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsCi0JCTB4MEUxMSwgMHg0MDlELCAwLCAwLCAwfSwKLQl7IFBDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywKLQkJMHgwRTExLCAweDQwOTEsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQSwKLQkJMHgxMDNDLCAweDMyMjUsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMjMsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMzQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTQywKLQkJMHgxMDNjLCAweDMyMzUsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTEsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTIsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTMsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTQsIDAsIDAsIDB9LAotCXsgUENJX1ZFTkRPUl9JRF9IUCwgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwKLQkJMHgxMDNjLCAweDMyMTUsIDAsIDAsIDB9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTUywgIDB4MEUxMSwgMHg0MDcwfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NCLCAweDBFMTEsIDB4NDA4MH0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQiwgMHgwRTExLCAweDQwODJ9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0IsIDB4MEUxMSwgMHg0MDgzfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLCAweDBFMTEsIDB4NDA5MX0sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywgMHgwRTExLCAweDQwOUF9LAorCXtQQ0lfVkVORE9SX0lEX0NPTVBBUSwgUENJX0RFVklDRV9JRF9DT01QQVFfQ0lTU0MsIDB4MEUxMSwgMHg0MDlCfSwKKwl7UENJX1ZFTkRPUl9JRF9DT01QQVEsIFBDSV9ERVZJQ0VfSURfQ09NUEFRX0NJU1NDLCAweDBFMTEsIDB4NDA5Q30sCisJe1BDSV9WRU5ET1JfSURfQ09NUEFRLCBQQ0lfREVWSUNFX0lEX0NPTVBBUV9DSVNTQywgMHgwRTExLCAweDQwOUR9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTQSwgICAgIDB4MTAzQywgMHgzMjI1fSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0MsICAgICAweDEwM0MsIDB4MzIyM30sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NDLCAgICAgMHgxMDNDLCAweDMyMzR9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTQywgICAgIDB4MTAzQywgMHgzMjM1fSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0QsICAgICAweDEwM0MsIDB4MzIxMX0sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NELCAgICAgMHgxMDNDLCAweDMyMTJ9LAorCXtQQ0lfVkVORE9SX0lEX0hQLCAgICAgUENJX0RFVklDRV9JRF9IUF9DSVNTRCwgICAgIDB4MTAzQywgMHgzMjEzfSwKKwl7UENJX1ZFTkRPUl9JRF9IUCwgICAgIFBDSV9ERVZJQ0VfSURfSFBfQ0lTU0QsICAgICAweDEwM0MsIDB4MzIxNH0sCisJe1BDSV9WRU5ET1JfSURfSFAsICAgICBQQ0lfREVWSUNFX0lEX0hQX0NJU1NELCAgICAgMHgxMDNDLCAweDMyMTV9LAogCXswLH0KIH07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2Npc3NfcGNpX2RldmljZV9pZCk7CiAKLSNkZWZpbmUgTlJfUFJPRFVDVFMgQVJSQVlfU0laRShwcm9kdWN0cykKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjY2lzc19wY2lfZGV2aWNlX2lkKTsKIAogLyogIGJvYXJkX2lkID0gU3Vic3lzdGVtIERldmljZSBJRCAmIFZlbmRvciBJRAogICogIHByb2R1Y3QgPSBNYXJrZXRpbmcgTmFtZSBmb3IgdGhlIGJvYXJkCi0gKiAgYWNjZXNzID0gQWRkcmVzcyBvZiB0aGUgc3RydWN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIAorICogIGFjY2VzcyA9IEFkZHJlc3Mgb2YgdGhlIHN0cnVjdCBvZiBmdW5jdGlvbiBwb2ludGVycwogICovCiBzdGF0aWMgc3RydWN0IGJvYXJkX3R5cGUgcHJvZHVjdHNbXSA9IHsKLQl7IDB4NDA3MDBFMTEsICJTbWFydCBBcnJheSA1MzAwIiwgJlNBNV9hY2Nlc3MgfSwKLQl7IDB4NDA4MDBFMTEsICJTbWFydCBBcnJheSA1aSIsICZTQTVCX2FjY2Vzc30sCi0JeyAweDQwODIwRTExLCAiU21hcnQgQXJyYXkgNTMyIiwgJlNBNUJfYWNjZXNzfSwKLQl7IDB4NDA4MzBFMTEsICJTbWFydCBBcnJheSA1MzEyIiwgJlNBNUJfYWNjZXNzfSwKLQl7IDB4NDA5QTBFMTEsICJTbWFydCBBcnJheSA2NDEiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDQwOUIwRTExLCAiU21hcnQgQXJyYXkgNjQyIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHg0MDlDMEUxMSwgIlNtYXJ0IEFycmF5IDY0MDAiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDQwOUQwRTExLCAiU21hcnQgQXJyYXkgNjQwMCBFTSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4NDA5MTBFMTEsICJTbWFydCBBcnJheSA2aSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIyNTEwM0MsICJTbWFydCBBcnJheSBQNjAwIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjIzMTAzQywgIlNtYXJ0IEFycmF5IFA4MDAiLCAmU0E1X2FjY2Vzc30sCi0JeyAweDMyMzQxMDNDLCAiU21hcnQgQXJyYXkgUDQwMCIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIzNTEwM0MsICJTbWFydCBBcnJheSBQNDAwaSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIxMTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKLQl7IDB4MzIxMjEwM0MsICJTbWFydCBBcnJheSBFMjAwIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjEzMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjE0MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAotCXsgMHgzMjE1MTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDQwNzAwRTExLCAiU21hcnQgQXJyYXkgNTMwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDgwMEUxMSwgIlNtYXJ0IEFycmF5IDVpIiwgJlNBNUJfYWNjZXNzfSwKKwl7MHg0MDgyMEUxMSwgIlNtYXJ0IEFycmF5IDUzMiIsICZTQTVCX2FjY2Vzc30sCisJezB4NDA4MzBFMTEsICJTbWFydCBBcnJheSA1MzEyIiwgJlNBNUJfYWNjZXNzfSwKKwl7MHg0MDlBMEUxMSwgIlNtYXJ0IEFycmF5IDY0MSIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDlCMEUxMSwgIlNtYXJ0IEFycmF5IDY0MiIsICZTQTVfYWNjZXNzfSwKKwl7MHg0MDlDMEUxMSwgIlNtYXJ0IEFycmF5IDY0MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4NDA5RDBFMTEsICJTbWFydCBBcnJheSA2NDAwIEVNIiwgJlNBNV9hY2Nlc3N9LAorCXsweDQwOTEwRTExLCAiU21hcnQgQXJyYXkgNmkiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIyNTEwM0MsICJTbWFydCBBcnJheSBQNjAwIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMjMxMDNDLCAiU21hcnQgQXJyYXkgUDgwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjM0MTAzQywgIlNtYXJ0IEFycmF5IFA0MDAiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIzNTEwM0MsICJTbWFydCBBcnJheSBQNDAwaSIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjExMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMTIxMDNDLCAiU21hcnQgQXJyYXkgRTIwMCIsICZTQTVfYWNjZXNzfSwKKwl7MHgzMjEzMTAzQywgIlNtYXJ0IEFycmF5IEUyMDBpIiwgJlNBNV9hY2Nlc3N9LAorCXsweDMyMTQxMDNDLCAiU21hcnQgQXJyYXkgRTIwMGkiLCAmU0E1X2FjY2Vzc30sCisJezB4MzIxNTEwM0MsICJTbWFydCBBcnJheSBFMjAwaSIsICZTQTVfYWNjZXNzfSwKIH07CiAKLS8qIEhvdyBsb25nIHRvIHdhaXQgKGluIG1pbGxlc2NvbmRzKSBmb3IgYm9hcmQgdG8gZ28gaW50byBzaW1wbGUgbW9kZSAqLwotI2RlZmluZSBNQVhfQ09ORklHX1dBSVQgMzAwMDAgCisvKiBIb3cgbG9uZyB0byB3YWl0IChpbiBtaWxsaXNlY29uZHMpIGZvciBib2FyZCB0byBnbyBpbnRvIHNpbXBsZSBtb2RlICovCisjZGVmaW5lIE1BWF9DT05GSUdfV0FJVCAzMDAwMAogI2RlZmluZSBNQVhfSU9DVExfQ09ORklHX1dBSVQgMTAwMAogCiAvKmRlZmluZSBob3cgbWFueSB0aW1lcyB3ZSB3aWxsIHRyeSBhIGNvbW1hbmQgYmVjYXVzZSBvZiBidXMgcmVzZXRzICovCiAjZGVmaW5lIE1BWF9DTURfUkVUUklFUyAzCiAKICNkZWZpbmUgUkVBRF9BSEVBRCAJIDEwMjQKLSNkZWZpbmUgTlJfQ01EUwkJIDM4NCAvKiAjY29tbWFuZHMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgKi8KKyNkZWZpbmUgTlJfQ01EUwkJIDM4NAkvKiAjY29tbWFuZHMgdGhhdCBjYW4gYmUgb3V0c3RhbmRpbmcgKi8KICNkZWZpbmUgTUFYX0NUTFIJMzIKIAogLyogT3JpZ2luYWxseSBjY2lzcyBkcml2ZXIgb25seSBzdXBwb3J0cyA4IG1ham9yIG51bWJlcnMgKi8KICNkZWZpbmUgTUFYX0NUTFJfT1JJRyAJOAogCi0KIHN0YXRpYyBjdGxyX2luZm9fdCAqaGJhW01BWF9DVExSXTsKIAogc3RhdGljIHZvaWQgZG9fY2Npc3NfcmVxdWVzdChyZXF1ZXN0X3F1ZXVlX3QgKnEpOwogc3RhdGljIGlycXJldHVybl90IGRvX2NjaXNzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgaW50IGNjaXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKTsKIHN0YXRpYyBpbnQgY2Npc3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApOwotc3RhdGljIGludCBjY2lzc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsIAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGNjaXNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIHN0YXRpYyBpbnQgY2Npc3NfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKTsKIAogc3RhdGljIGludCByZXZhbGlkYXRlX2FsbHZvbChjdGxyX2luZm9fdCAqaG9zdCk7CiBzdGF0aWMgaW50IGNjaXNzX3JldmFsaWRhdGUoc3RydWN0IGdlbmRpc2sgKmRpc2spOwogc3RhdGljIGludCByZWJ1aWxkX2x1bl90YWJsZShjdGxyX2luZm9fdCAqaCwgc3RydWN0IGdlbmRpc2sgKmRlbF9kaXNrKTsKLXN0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LCBpbnQgY2xlYXJfYWxsKTsKK3N0YXRpYyBpbnQgZGVyZWdpc3Rlcl9kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2LAorCQkJICAgaW50IGNsZWFyX2FsbCk7CiAKIHN0YXRpYyB2b2lkIGNjaXNzX3JlYWRfY2FwYWNpdHkoaW50IGN0bHIsIGludCBsb2d2b2wsIFJlYWRDYXBkYXRhX3N0cnVjdCAqYnVmLAotCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsIHVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSk7Ci1zdGF0aWMgdm9pZCBjY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGludCBjdGxyLCBpbnQgbG9ndm9sLAotCQkJaW50IHdpdGhpcnEsIHVuc2lnbmVkIGludCB0b3RhbF9zaXplLAotCQkJdW5zaWduZWQgaW50IGJsb2NrX3NpemUsIElucXVpcnlEYXRhX3N0cnVjdCAqaW5xX2J1ZmYsCi0JCQlkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2KTsKKwkJCQlpbnQgd2l0aGlycSwgdW5zaWduZWQgaW50ICp0b3RhbF9zaXplLAorCQkJCXVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSk7CitzdGF0aWMgdm9pZCBjY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGludCBjdGxyLCBpbnQgbG9ndm9sLCBpbnQgd2l0aGlycSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgYmxvY2tfc2l6ZSwKKwkJCQkgICBJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmLAorCQkJCSAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnYpOwogc3RhdGljIHZvaWQgY2Npc3NfZ2V0Z2VvbWV0cnkoaW50IGNudGxfbnVtKTsKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBjY2lzc19pbnRlcnJ1cHRfbW9kZShjdGxyX2luZm9fdCAqLCBzdHJ1Y3QgcGNpX2RldiAqLCBfX3UzMik7Ci1zdGF0aWMgdm9pZCBzdGFydF9pbyggY3Rscl9pbmZvX3QgKmgpOwotc3RhdGljIGludCBzZW5kY21kKCBfX3U4IGNtZCwgaW50IGN0bHIsIHZvaWQgKmJ1ZmYsIHNpemVfdCBzaXplLAotCXVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIHVuc2lnbmVkIGludCBsb2dfdW5pdCwgX191OCBwYWdlX2NvZGUsCi0JdW5zaWduZWQgY2hhciAqc2NzaTNhZGRyLCBpbnQgY21kX3R5cGUpOwotc3RhdGljIGludCBzZW5kY21kX3dpdGhpcnEoX191OAljbWQsIGludCBjdGxyLCB2b2lkICpidWZmLCBzaXplX3Qgc2l6ZSwKLQl1bnNpZ25lZCBpbnQgdXNlX3VuaXRfbnVtLCB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsIF9fdTgJcGFnZV9jb2RlLAotCWludCBjbWRfdHlwZSk7CitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2Npc3NfaW50ZXJydXB0X21vZGUoY3Rscl9pbmZvX3QgKiwgc3RydWN0IHBjaV9kZXYgKiwKKwkJCQkJICAgX191MzIpOworc3RhdGljIHZvaWQgc3RhcnRfaW8oY3Rscl9pbmZvX3QgKmgpOworc3RhdGljIGludCBzZW5kY21kKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCisJCSAgIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIHVuc2lnbmVkIGludCBsb2dfdW5pdCwKKwkJICAgX191OCBwYWdlX2NvZGUsIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKTsKK3N0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsCisJCQkgICB1bnNpZ25lZCBpbnQgdXNlX3VuaXRfbnVtLCB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCisJCQkgICBfX3U4IHBhZ2VfY29kZSwgaW50IGNtZF90eXBlKTsKIAogc3RhdGljIHZvaWQgZmFpbF9hbGxfY21kcyh1bnNpZ25lZCBsb25nIGN0bHIpOwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLXN0YXRpYyBpbnQgY2Npc3NfcHJvY19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCAKLQkJaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBjY2lzc19wcm9jX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsCisJCQkgICAgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogc3RhdGljIHZvaWQgY2Npc3NfcHJvY2luaXQoaW50IGkpOwogI2Vsc2UKLXN0YXRpYyB2b2lkIGNjaXNzX3Byb2Npbml0KGludCBpKSB7fQotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCitzdGF0aWMgdm9pZCBjY2lzc19wcm9jaW5pdChpbnQgaSkKK3sKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfUFJPQ19GUyAqLwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogc3RhdGljIGxvbmcgY2Npc3NfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIGNjaXNzX2ZvcHMgID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkub3BlbgkJPSBjY2lzc19vcGVuLCAKLQkucmVsZWFzZSAgICAgICAJPSBjY2lzc19yZWxlYXNlLAotICAgICAgICAuaW9jdGwJCT0gY2Npc3NfaW9jdGwsCi0gICAgICAgIC5nZXRnZW8JCT0gY2Npc3NfZ2V0Z2VvLAorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBjY2lzc19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gY2Npc3Nfb3BlbiwKKwkucmVsZWFzZSA9IGNjaXNzX3JlbGVhc2UsCisJLmlvY3RsID0gY2Npc3NfaW9jdGwsCisJLmdldGdlbyA9IGNjaXNzX2dldGdlbywKICNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bCAgID0gY2Npc3NfY29tcGF0X2lvY3RsLAorCS5jb21wYXRfaW9jdGwgPSBjY2lzc19jb21wYXRfaW9jdGwsCiAjZW5kaWYKLQkucmV2YWxpZGF0ZV9kaXNrPSBjY2lzc19yZXZhbGlkYXRlLAorCS5yZXZhbGlkYXRlX2Rpc2sgPSBjY2lzc19yZXZhbGlkYXRlLAogfTsKIAogLyoKQEAgLTIwOCwyOCArMTk0LDI5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRRKENvbW1hbmRMaXN0X3N0cnVjdCAqKlFwdHIsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKIHsKLSAgICAgICAgaWYgKCpRcHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAqUXB0ciA9IGM7Ci0gICAgICAgICAgICAgICAgYy0+bmV4dCA9IGMtPnByZXYgPSBjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMtPnByZXYgPSAoKlFwdHIpLT5wcmV2OwotICAgICAgICAgICAgICAgIGMtPm5leHQgPSAoKlFwdHIpOwotICAgICAgICAgICAgICAgICgqUXB0ciktPnByZXYtPm5leHQgPSBjOwotICAgICAgICAgICAgICAgICgqUXB0ciktPnByZXYgPSBjOwotICAgICAgICB9CisJaWYgKCpRcHRyID09IE5VTEwpIHsKKwkJKlFwdHIgPSBjOworCQljLT5uZXh0ID0gYy0+cHJldiA9IGM7CisJfSBlbHNlIHsKKwkJYy0+cHJldiA9ICgqUXB0ciktPnByZXY7CisJCWMtPm5leHQgPSAoKlFwdHIpOworCQkoKlFwdHIpLT5wcmV2LT5uZXh0ID0gYzsKKwkJKCpRcHRyKS0+cHJldiA9IGM7CisJfQogfQogCi1zdGF0aWMgaW5saW5lIENvbW1hbmRMaXN0X3N0cnVjdCAqcmVtb3ZlUShDb21tYW5kTGlzdF9zdHJ1Y3QgKipRcHRyLCAKLQkJCQkJCUNvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgQ29tbWFuZExpc3Rfc3RydWN0ICpyZW1vdmVRKENvbW1hbmRMaXN0X3N0cnVjdCAqKlFwdHIsCisJCQkJCSAgQ29tbWFuZExpc3Rfc3RydWN0ICpjKQogewotICAgICAgICBpZiAoYyAmJiBjLT5uZXh0ICE9IGMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKlFwdHIgPT0gYykgKlFwdHIgPSBjLT5uZXh0OwotICAgICAgICAgICAgICAgIGMtPnByZXYtPm5leHQgPSBjLT5uZXh0OwotICAgICAgICAgICAgICAgIGMtPm5leHQtPnByZXYgPSBjLT5wcmV2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpRcHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYzsKKwlpZiAoYyAmJiBjLT5uZXh0ICE9IGMpIHsKKwkJaWYgKCpRcHRyID09IGMpCisJCQkqUXB0ciA9IGMtPm5leHQ7CisJCWMtPnByZXYtPm5leHQgPSBjLT5uZXh0OworCQljLT5uZXh0LT5wcmV2ID0gYy0+cHJldjsKKwl9IGVsc2UgeworCQkqUXB0ciA9IE5VTEw7CisJfQorCXJldHVybiBjOwogfQogCiAjaW5jbHVkZSAiY2Npc3Nfc2NzaS5jIgkJLyogRm9yIFNDU0kgdGFwZSBzdXBwb3J0ICovCkBAIC0yNDIsMjMgKzIyOSwyNCBAQAogI2RlZmluZSBFTkdfR0lHIDEwMDAwMDAwMDAKICNkZWZpbmUgRU5HX0dJR19GQUNUT1IgKEVOR19HSUcvNTEyKQogI2RlZmluZSBSQUlEX1VOS05PV04gNgotc3RhdGljIGNvbnN0IGNoYXIgKnJhaWRfbGFiZWxbXSA9IHsiMCIsIjQiLCIxKDErMCkiLCI1IiwiNSsxIiwiQURHIiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVTktOT1dOIn07CitzdGF0aWMgY29uc3QgY2hhciAqcmFpZF9sYWJlbFtdID0geyAiMCIsICI0IiwgIjEoMSswKSIsICI1IiwgIjUrMSIsICJBREciLAorCSJVTktOT1dOIgorfTsKIAogc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19jY2lzczsKIAotc3RhdGljIGludCBjY2lzc19wcm9jX2dldF9pbmZvKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIAotCQlpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgY2Npc3NfcHJvY19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgICAgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewotICAgICAgICBvZmZfdCBwb3MgPSAwOwotICAgICAgICBvZmZfdCBsZW4gPSAwOwotICAgICAgICBpbnQgc2l6ZSwgaSwgY3RscjsKLSAgICAgICAgY3Rscl9pbmZvX3QgKmggPSAoY3Rscl9pbmZvX3QqKWRhdGE7Ci0gICAgICAgIGRyaXZlX2luZm9fc3RydWN0ICpkcnY7CisJb2ZmX3QgcG9zID0gMDsKKwlvZmZfdCBsZW4gPSAwOworCWludCBzaXplLCBpLCBjdGxyOworCWN0bHJfaW5mb190ICpoID0gKGN0bHJfaW5mb190ICopIGRhdGE7CisJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotICAgICAgICBzZWN0b3JfdCB2b2xfc3osIHZvbF9zel9mcmFjOworCXNlY3Rvcl90IHZvbF9zeiwgdm9sX3N6X2ZyYWM7CiAKLSAgICAgICAgY3RsciA9IGgtPmN0bHI7CisJY3RsciA9IGgtPmN0bHI7CiAKIAkvKiBwcmV2ZW50IGRpc3BsYXlpbmcgYm9ndXMgaW5mbyBkdXJpbmcgY29uZmlndXJhdGlvbgogCSAqIG9yIGRlY29uZmlndXJhdGlvbiBvZiBhIGxvZ2ljYWwgdm9sdW1lCkBAIC0yNjYsMzUgKzI1NCwzNSBAQAogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAlpZiAoaC0+YnVzeV9jb25maWd1cmluZykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAloLT5idXN5X2NvbmZpZ3VyaW5nID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAotICAgICAgICBzaXplID0gc3ByaW50ZihidWZmZXIsICIlczogSFAgJXMgQ29udHJvbGxlclxuIgotCQkiQm9hcmQgSUQ6IDB4JTA4bHhcbiIKLQkJIkZpcm13YXJlIFZlcnNpb246ICVjJWMlYyVjXG4iCi0JCSJJUlE6ICVkXG4iCi0JCSJMb2dpY2FsIGRyaXZlczogJWRcbiIKLQkJIkN1cnJlbnQgUSBkZXB0aDogJWRcbiIKLQkJIkN1cnJlbnQgIyBjb21tYW5kcyBvbiBjb250cm9sbGVyOiAlZFxuIgotCQkiTWF4IFEgZGVwdGggc2luY2UgaW5pdDogJWRcbiIKLQkJIk1heCAjIGNvbW1hbmRzIG9uIGNvbnRyb2xsZXIgc2luY2UgaW5pdDogJWRcbiIKLQkJIk1heCBTRyBlbnRyaWVzIHNpbmNlIGluaXQ6ICVkXG5cbiIsCi0gICAgICAgICAgICAgICAgaC0+ZGV2bmFtZSwKLSAgICAgICAgICAgICAgICBoLT5wcm9kdWN0X25hbWUsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaC0+Ym9hcmRfaWQsCi0JCWgtPmZpcm1fdmVyWzBdLCBoLT5maXJtX3ZlclsxXSwgaC0+ZmlybV92ZXJbMl0sIGgtPmZpcm1fdmVyWzNdLAotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBpbnQpaC0+aW50cltTSU1QTEVfTU9ERV9JTlRdLAotICAgICAgICAgICAgICAgIGgtPm51bV9sdW5zLCAKLQkJaC0+UWRlcHRoLCBoLT5jb21tYW5kc19vdXRzdGFuZGluZywKLQkJaC0+bWF4UXNpbmNlaW5pdCwgaC0+bWF4X291dHN0YW5kaW5nLCBoLT5tYXhTRyk7CisJc2l6ZSA9IHNwcmludGYoYnVmZmVyLCAiJXM6IEhQICVzIENvbnRyb2xsZXJcbiIKKwkJICAgICAgICJCb2FyZCBJRDogMHglMDhseFxuIgorCQkgICAgICAgIkZpcm13YXJlIFZlcnNpb246ICVjJWMlYyVjXG4iCisJCSAgICAgICAiSVJROiAlZFxuIgorCQkgICAgICAgIkxvZ2ljYWwgZHJpdmVzOiAlZFxuIgorCQkgICAgICAgIkN1cnJlbnQgUSBkZXB0aDogJWRcbiIKKwkJICAgICAgICJDdXJyZW50ICMgY29tbWFuZHMgb24gY29udHJvbGxlcjogJWRcbiIKKwkJICAgICAgICJNYXggUSBkZXB0aCBzaW5jZSBpbml0OiAlZFxuIgorCQkgICAgICAgIk1heCAjIGNvbW1hbmRzIG9uIGNvbnRyb2xsZXIgc2luY2UgaW5pdDogJWRcbiIKKwkJICAgICAgICJNYXggU0cgZW50cmllcyBzaW5jZSBpbml0OiAlZFxuXG4iLAorCQkgICAgICAgaC0+ZGV2bmFtZSwKKwkJICAgICAgIGgtPnByb2R1Y3RfbmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKWgtPmJvYXJkX2lkLAorCQkgICAgICAgaC0+ZmlybV92ZXJbMF0sIGgtPmZpcm1fdmVyWzFdLCBoLT5maXJtX3ZlclsyXSwKKwkJICAgICAgIGgtPmZpcm1fdmVyWzNdLCAodW5zaWduZWQgaW50KWgtPmludHJbU0lNUExFX01PREVfSU5UXSwKKwkJICAgICAgIGgtPm51bV9sdW5zLCBoLT5RZGVwdGgsIGgtPmNvbW1hbmRzX291dHN0YW5kaW5nLAorCQkgICAgICAgaC0+bWF4UXNpbmNlaW5pdCwgaC0+bWF4X291dHN0YW5kaW5nLCBoLT5tYXhTRyk7CiAKLSAgICAgICAgcG9zICs9IHNpemU7IGxlbiArPSBzaXplOworCXBvcyArPSBzaXplOworCWxlbiArPSBzaXplOwogCWNjaXNzX3Byb2NfdGFwZV9yZXBvcnQoY3RsciwgYnVmZmVyLCAmcG9zLCAmbGVuKTsKLQlmb3IoaT0wOyBpPD1oLT5oaWdoZXN0X2x1bjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8PSBoLT5oaWdoZXN0X2x1bjsgaSsrKSB7CiAKLSAgICAgICAgICAgICAgICBkcnYgPSAmaC0+ZHJ2W2ldOworCQlkcnYgPSAmaC0+ZHJ2W2ldOwogCQlpZiAoZHJ2LT5oZWFkcyA9PSAwKQogCQkJY29udGludWU7CiAKQEAgLTMwNSwyNSArMjkzLDI2IEBACiAKIAkJaWYgKGRydi0+cmFpZF9sZXZlbCA+IDUpCiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBSQUlEX1VOS05PV047Ci0JCXNpemUgPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJjY2lzcy9jJWRkJWQ6IgotCQkJCSJcdCU0dS4lMDJ1R0JcdFJBSUQgJXNcbiIsCi0JCQkJY3RsciwgaSwgKGludCl2b2xfc3osIChpbnQpdm9sX3N6X2ZyYWMsCi0JCQkJcmFpZF9sYWJlbFtkcnYtPnJhaWRfbGV2ZWxdKTsKLSAgICAgICAgICAgICAgICBwb3MgKz0gc2l6ZTsgbGVuICs9IHNpemU7Ci0gICAgICAgIH0KKwkJc2l6ZSA9IHNwcmludGYoYnVmZmVyICsgbGVuLCAiY2Npc3MvYyVkZCVkOiIKKwkJCSAgICAgICAiXHQlNHUuJTAydUdCXHRSQUlEICVzXG4iLAorCQkJICAgICAgIGN0bHIsIGksIChpbnQpdm9sX3N6LCAoaW50KXZvbF9zel9mcmFjLAorCQkJICAgICAgIHJhaWRfbGFiZWxbZHJ2LT5yYWlkX2xldmVsXSk7CisJCXBvcyArPSBzaXplOworCQlsZW4gKz0gc2l6ZTsKKwl9CiAKLSAgICAgICAgKmVvZiA9IDE7Ci0gICAgICAgICpzdGFydCA9IGJ1ZmZlcitvZmZzZXQ7Ci0gICAgICAgIGxlbiAtPSBvZmZzZXQ7Ci0gICAgICAgIGlmIChsZW4+bGVuZ3RoKQotICAgICAgICAgICAgICAgIGxlbiA9IGxlbmd0aDsKKwkqZW9mID0gMTsKKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJbGVuIC09IG9mZnNldDsKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CiAJaC0+YnVzeV9jb25maWd1cmluZyA9IDA7Ci0gICAgICAgIHJldHVybiBsZW47CisJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCAKLWNjaXNzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIAotCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQKK2NjaXNzX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCSB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQogewogCXVuc2lnbmVkIGNoYXIgY21kWzgwXTsKIAlpbnQgbGVuOwpAQCAtMzMyLDIwICszMjEsMjMgQEAKIAlpbnQgcmM7CiAjZW5kaWYKIAotCWlmIChjb3VudCA+IHNpemVvZihjbWQpLTEpIHJldHVybiAtRUlOVkFMOwotCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZmZlciwgY291bnQpKSByZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPiBzaXplb2YoY21kKSAtIDEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjb3B5X2Zyb21fdXNlcihjbWQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAljbWRbY291bnRdID0gJ1wwJzsKIAlsZW4gPSBzdHJsZW4oY21kKTsJLy8gYWJvdmUgMyBsaW5lcyBlbnN1cmUgc2FmZXR5Ci0JaWYgKGxlbiAmJiBjbWRbbGVuLTFdID09ICdcbicpCisJaWYgKGxlbiAmJiBjbWRbbGVuIC0gMV0gPT0gJ1xuJykKIAkJY21kWy0tbGVuXSA9ICdcMCc7CiAjCWlmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCQlpZiAoc3RyY21wKCJlbmdhZ2Ugc2NzaSIsIGNtZCk9PTApIHsKLQkJCXJjID0gY2Npc3NfZW5nYWdlX3Njc2koaC0+Y3Rscik7Ci0JCQlpZiAocmMgIT0gMCkgcmV0dXJuIC1yYzsKLQkJCXJldHVybiBjb3VudDsKLQkJfQotCQkvKiBtaWdodCBiZSBuaWNlIHRvIGhhdmUgImRpc2VuZ2FnZSIgdG9vLCBidXQgaXQncyBub3QgCi0JCSAgIHNhZmVseSBwb3NzaWJsZS4gKG9ubHkgMSBtb2R1bGUgdXNlIGNvdW50LCBsb2NrIGlzc3Vlcy4pICovCisJaWYgKHN0cmNtcCgiZW5nYWdlIHNjc2kiLCBjbWQpID09IDApIHsKKwkJcmMgPSBjY2lzc19lbmdhZ2Vfc2NzaShoLT5jdGxyKTsKKwkJaWYgKHJjICE9IDApCisJCQlyZXR1cm4gLXJjOworCQlyZXR1cm4gY291bnQ7CisJfQorCS8qIG1pZ2h0IGJlIG5pY2UgdG8gaGF2ZSAiZGlzZW5nYWdlIiB0b28sIGJ1dCBpdCdzIG5vdAorCSAgIHNhZmVseSBwb3NzaWJsZS4gKG9ubHkgMSBtb2R1bGUgdXNlIGNvdW50LCBsb2NrIGlzc3Vlcy4pICovCiAjCWVuZGlmCiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0zNTgsMTE2ICszNTAsMTEzIEBACiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CiAKLSAgICAgICAgaWYgKHByb2NfY2Npc3MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByb2NfY2Npc3MgPSBwcm9jX21rZGlyKCJjY2lzcyIsIHByb2Nfcm9vdF9kcml2ZXIpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY19jY2lzcykgCisJaWYgKHByb2NfY2Npc3MgPT0gTlVMTCkgeworCQlwcm9jX2NjaXNzID0gcHJvY19ta2RpcigiY2Npc3MiLCBwcm9jX3Jvb3RfZHJpdmVyKTsKKwkJaWYgKCFwcm9jX2NjaXNzKQogCQkJcmV0dXJuOwotICAgICAgICB9CisJfQogCi0JcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShoYmFbaV0tPmRldm5hbWUsIAotCQlTX0lXVVNSIHwgU19JUlVTUiB8IFNfSVJHUlAgfCBTX0lST1RILCAKLQkJcHJvY19jY2lzcywgY2Npc3NfcHJvY19nZXRfaW5mbywgaGJhW2ldKTsKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwKKwkJCQkgICAgIFNfSVdVU1IgfCBTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsCisJCQkJICAgICBwcm9jX2NjaXNzLCBjY2lzc19wcm9jX2dldF9pbmZvLCBoYmFbaV0pOwogCXBkZS0+d3JpdGVfcHJvYyA9IGNjaXNzX3Byb2Nfd3JpdGU7CiB9Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfUFJPQ19GUyAqLwogCi0vKiAKLSAqIEZvciBvcGVyYXRpb25zIHRoYXQgY2Fubm90IHNsZWVwLCBhIGNvbW1hbmQgYmxvY2sgaXMgYWxsb2NhdGVkIGF0IGluaXQsIAorLyoKKyAqIEZvciBvcGVyYXRpb25zIHRoYXQgY2Fubm90IHNsZWVwLCBhIGNvbW1hbmQgYmxvY2sgaXMgYWxsb2NhdGVkIGF0IGluaXQsCiAgKiBhbmQgbWFuYWdlZCBieSBjbWRfYWxsb2MoKSBhbmQgY21kX2ZyZWUoKSB1c2luZyBhIHNpbXBsZSBiaXRtYXAgdG8gdHJhY2sKLSAqIHdoaWNoIG9uZXMgYXJlIGZyZWUgb3IgaW4gdXNlLiAgRm9yIG9wZXJhdGlvbnMgdGhhdCBjYW4gd2FpdCBmb3Iga21hbGxvYyAKLSAqIHRvIHBvc3NpYmxlIHNsZWVwLCB0aGlzIHJvdXRpbmUgY2FuIGJlIGNhbGxlZCB3aXRoIGdldF9mcm9tX3Bvb2wgc2V0IHRvIDAuIAotICogY21kX2ZyZWUoKSBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgZ290X2Zyb21fcG9vbCBzZXQgdG8gMCBpZiBjbWRfYWxsb2Mgd2FzLiAKLSAqLyAKLXN0YXRpYyBDb21tYW5kTGlzdF9zdHJ1Y3QgKiBjbWRfYWxsb2MoY3Rscl9pbmZvX3QgKmgsIGludCBnZXRfZnJvbV9wb29sKQorICogd2hpY2ggb25lcyBhcmUgZnJlZSBvciBpbiB1c2UuICBGb3Igb3BlcmF0aW9ucyB0aGF0IGNhbiB3YWl0IGZvciBrbWFsbG9jCisgKiB0byBwb3NzaWJsZSBzbGVlcCwgdGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgd2l0aCBnZXRfZnJvbV9wb29sIHNldCB0byAwLgorICogY21kX2ZyZWUoKSBNVVNUIGJlIGNhbGxlZCB3aXRoIGEgZ290X2Zyb21fcG9vbCBzZXQgdG8gMCBpZiBjbWRfYWxsb2Mgd2FzLgorICovCitzdGF0aWMgQ29tbWFuZExpc3Rfc3RydWN0ICpjbWRfYWxsb2MoY3Rscl9pbmZvX3QgKmgsIGludCBnZXRfZnJvbV9wb29sKQogewogCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKLQlpbnQgaTsgCisJaW50IGk7CiAJdTY0Yml0IHRlbXA2NDsKIAlkbWFfYWRkcl90IGNtZF9kbWFfaGFuZGxlLCBlcnJfZG1hX2hhbmRsZTsKIAotCWlmICghZ2V0X2Zyb21fcG9vbCkKLQl7Ci0JCWMgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAotCQkJaC0+cGRldiwgc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksICZjbWRfZG1hX2hhbmRsZSk7IAotICAgICAgICAJaWYoYz09TlVMTCkKLSAgICAgICAgICAgICAgICAgCXJldHVybiBOVUxMOworCWlmICghZ2V0X2Zyb21fcG9vbCkgeworCQljID0gKENvbW1hbmRMaXN0X3N0cnVjdCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChoLT5wZGV2LAorCQkJc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksICZjbWRfZG1hX2hhbmRsZSk7CisJCWlmIChjID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKIAkJbWVtc2V0KGMsIDAsIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpKTsKIAogCQljLT5jbWRpbmRleCA9IC0xOwogCi0JCWMtPmVycl9pbmZvID0gKEVycm9ySW5mb19zdHJ1Y3QgKilwY2lfYWxsb2NfY29uc2lzdGVudCgKLQkJCQkJaC0+cGRldiwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpLCAKLQkJCQkJJmVycl9kbWFfaGFuZGxlKTsKLQkKLQkJaWYgKGMtPmVycl9pbmZvID09IE5VTEwpCi0JCXsKLQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaC0+cGRldiwgCisJCWMtPmVycl9pbmZvID0gKEVycm9ySW5mb19zdHJ1Y3QgKikKKwkJICAgIHBjaV9hbGxvY19jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJCSAgICAmZXJyX2RtYV9oYW5kbGUpOworCisJCWlmIChjLT5lcnJfaW5mbyA9PSBOVUxMKSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsCiAJCQkJc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksIGMsIGNtZF9kbWFfaGFuZGxlKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKLQl9IGVsc2UgLyogZ2V0IGl0IG91dCBvZiB0aGUgY29udHJvbGxlcnMgcG9vbCAqLyAKLQl7Ci0JICAgICAJZG8gewotICAgICAgICAgICAgICAgIAlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IE5SX0NNRFMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgIH0gd2hpbGUodGVzdF9hbmRfc2V0X2JpdChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwgaC0+Y21kX3Bvb2xfYml0cysoaS9CSVRTX1BFUl9MT05HKSkgIT0gMCk7CisJfSBlbHNlIHsJCS8qIGdldCBpdCBvdXQgb2YgdGhlIGNvbnRyb2xsZXJzIHBvb2wgKi8KKworCQlkbyB7CisJCQlpID0gZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKTsKKwkJCWlmIChpID09IE5SX0NNRFMpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0gd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQKKwkJCSAoaSAmIChCSVRTX1BFUl9MT05HIC0gMSksCisJCQkgIGgtPmNtZF9wb29sX2JpdHMgKyAoaSAvIEJJVFNfUEVSX0xPTkcpKSAhPSAwKTsKICNpZmRlZiBDQ0lTU19ERUJVRwogCQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IHVzaW5nIGNvbW1hbmQgYnVmZmVyICVkXG4iLCBpKTsKICNlbmRpZgotICAgICAgICAgICAgICAgIGMgPSBoLT5jbWRfcG9vbCArIGk7CisJCWMgPSBoLT5jbWRfcG9vbCArIGk7CiAJCW1lbXNldChjLCAwLCBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSk7Ci0JCWNtZF9kbWFfaGFuZGxlID0gaC0+Y21kX3Bvb2xfZGhhbmRsZSAKLQkJCQkJKyBpKnNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpOworCQljbWRfZG1hX2hhbmRsZSA9IGgtPmNtZF9wb29sX2RoYW5kbGUKKwkJICAgICsgaSAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpOwogCQljLT5lcnJfaW5mbyA9IGgtPmVycmluZm9fcG9vbCArIGk7CiAJCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKLQkJZXJyX2RtYV9oYW5kbGUgPSBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSAKLQkJCQkJKyBpKnNpemVvZihFcnJvckluZm9fc3RydWN0KTsKLSAgICAgICAgICAgICAgICBoLT5ucl9hbGxvY3MrKzsKKwkJZXJyX2RtYV9oYW5kbGUgPSBoLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZQorCQkgICAgKyBpICogc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpOworCQloLT5ucl9hbGxvY3MrKzsKIAogCQljLT5jbWRpbmRleCA9IGk7Ci0gICAgICAgIH0KKwl9CiAKIAljLT5idXNhZGRyID0gKF9fdTMyKSBjbWRfZG1hX2hhbmRsZTsKLQl0ZW1wNjQudmFsID0gKF9fdTY0KSBlcnJfZG1hX2hhbmRsZTsJCisJdGVtcDY0LnZhbCA9IChfX3U2NCkgZXJyX2RtYV9oYW5kbGU7CiAJYy0+RXJyRGVzYy5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwogCWMtPkVyckRlc2MuQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKIAljLT5FcnJEZXNjLkxlbiA9IHNpemVvZihFcnJvckluZm9fc3RydWN0KTsKLQkKKwogCWMtPmN0bHIgPSBoLT5jdGxyOwotICAgICAgICByZXR1cm4gYzsKLQotCisJcmV0dXJuIGM7CiB9CiAKLS8qIAotICogRnJlZXMgYSBjb21tYW5kIGJsb2NrIHRoYXQgd2FzIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggY21kX2FsbG9jKCkuIAorLyoKKyAqIEZyZWVzIGEgY29tbWFuZCBibG9jayB0aGF0IHdhcyBwcmV2aW91c2x5IGFsbG9jYXRlZCB3aXRoIGNtZF9hbGxvYygpLgogICovCiBzdGF0aWMgdm9pZCBjbWRfZnJlZShjdGxyX2luZm9fdCAqaCwgQ29tbWFuZExpc3Rfc3RydWN0ICpjLCBpbnQgZ290X2Zyb21fcG9vbCkKIHsKIAlpbnQgaTsKIAl1NjRiaXQgdGVtcDY0OwogCi0JaWYoICFnb3RfZnJvbV9wb29sKQotCXsgCisJaWYgKCFnb3RfZnJvbV9wb29sKSB7CiAJCXRlbXA2NC52YWwzMi5sb3dlciA9IGMtPkVyckRlc2MuQWRkci5sb3dlcjsKIAkJdGVtcDY0LnZhbDMyLnVwcGVyID0gYy0+RXJyRGVzYy5BZGRyLnVwcGVyOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwgCi0JCQljLT5lcnJfaW5mbywgKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwpOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLCAKLQkJCWMsIChkbWFfYWRkcl90KSBjLT5idXNhZGRyKTsKLQl9IGVsc2UgCi0JeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGgtPnBkZXYsIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJCQkgICAgYy0+ZXJyX2luZm8sIChkbWFfYWRkcl90KSB0ZW1wNjQudmFsKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChoLT5wZGV2LCBzaXplb2YoQ29tbWFuZExpc3Rfc3RydWN0KSwKKwkJCQkgICAgYywgKGRtYV9hZGRyX3QpIGMtPmJ1c2FkZHIpOworCX0gZWxzZSB7CiAJCWkgPSBjIC0gaC0+Y21kX3Bvb2w7Ci0JCWNsZWFyX2JpdChpJihCSVRTX1BFUl9MT05HLTEpLCBoLT5jbWRfcG9vbF9iaXRzKyhpL0JJVFNfUEVSX0xPTkcpKTsKLSAgICAgICAgICAgICAgICBoLT5ucl9mcmVlcysrOwotICAgICAgICB9CisJCWNsZWFyX2JpdChpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSwKKwkJCSAgaC0+Y21kX3Bvb2xfYml0cyArIChpIC8gQklUU19QRVJfTE9ORykpOworCQloLT5ucl9mcmVlcysrOworCX0KIH0KIAogc3RhdGljIGlubGluZSBjdGxyX2luZm9fdCAqZ2V0X2hvc3Qoc3RydWN0IGdlbmRpc2sgKmRpc2spCiB7Ci0JcmV0dXJuIGRpc2stPnF1ZXVlLT5xdWV1ZWRhdGE7IAorCXJldHVybiBkaXNrLT5xdWV1ZS0+cXVldWVkYXRhOwogfQogCiBzdGF0aWMgaW5saW5lIGRyaXZlX2luZm9fc3RydWN0ICpnZXRfZHJ2KHN0cnVjdCBnZW5kaXNrICpkaXNrKQpAQCAtNDg1LDcgKzQ3NCw3IEBACiAKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19vcGVuICVzXG4iLCBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWUpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAorI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAlpZiAoaG9zdC0+YnVzeV9pbml0aWFsaXppbmcgfHwgZHJ2LT5idXN5X2NvbmZpZ3VyaW5nKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtNDk4LDEwICs0ODcsMTAgQEAKIAkgKiBmb3IgInJhdyBjb250cm9sbGVyIi4KIAkgKi8KIAlpZiAoZHJ2LT5ucl9ibG9ja3MgPT0gMCkgewotCQlpZiAoaW1pbm9yKGlub2RlKSAhPSAwKQl7IAkvKiBub3Qgbm9kZSAwPyAqLworCQlpZiAoaW1pbm9yKGlub2RlKSAhPSAwKSB7CS8qIG5vdCBub2RlIDA/ICovCiAJCQkvKiBpZiBub3Qgbm9kZSAwIG1ha2Ugc3VyZSBpdCBpcyBhIHBhcnRpdGlvbiA9IDAgKi8KIAkJCWlmIChpbWlub3IoaW5vZGUpICYgMHgwZikgewotCQkJcmV0dXJuIC1FTlhJTzsKKwkJCQlyZXR1cm4gLUVOWElPOwogCQkJCS8qIGlmIGl0IGlzLCBtYWtlIHN1cmUgd2UgaGF2ZSBhIExVTiBJRCAqLwogCQkJfSBlbHNlIGlmIChkcnYtPkx1bklEID09IDApIHsKIAkJCQlyZXR1cm4gLUVOWElPOwpAQCAtNTE0LDYgKzUwMyw3IEBACiAJaG9zdC0+dXNhZ2VfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KKwogLyoKICAqIENsb3NlLiAgU3luYyBmaXJzdC4KICAqLwpAQCAtNTIzLDggKzUxMyw5IEBACiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IGdldF9kcnYoaW5vZGUtPmlfYmRldi0+YmRfZGlzayk7CiAKICNpZmRlZiBDQ0lTU19ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19yZWxlYXNlICVzXG4iLCBpbm9kZS0+aV9iZGV2LT5iZF9kaXNrLT5kaXNrX25hbWUpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCisJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzX3JlbGVhc2UgJXNcbiIsCisJICAgICAgIGlub2RlLT5pX2JkZXYtPmJkX2Rpc2stPmRpc2tfbmFtZSk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAogCWRydi0+dXNhZ2VfY291bnQtLTsKIAlob3N0LT51c2FnZV9jb3VudC0tOwpAQCAtNTQyLDggKzUzMywxMCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgaW50IGNjaXNzX2lvY3RsMzJfYmlnX3Bhc3N0aHJ1KHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCBjY2lzc19pb2N0bDMyX2JpZ19wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKTsKIAogc3RhdGljIGxvbmcgY2Npc3NfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNTc1LDE5ICs1NjgsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9wYXNzdGhydShzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJSU9DVEwzMl9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKmFyZzMyID0KLQkJKElPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKKwkgICAgKElPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKIAlJT0NUTF9Db21tYW5kX3N0cnVjdCBhcmc2NDsKIAlJT0NUTF9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoYXJnNjQpKTsKIAlpbnQgZXJyOwogCXUzMiBjcDsKIAogCWVyciA9IDA7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywgc2l6ZW9mKGFyZzY0LkxVTl9pbmZvKSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5SZXF1ZXN0LCAmYXJnMzItPlJlcXVlc3QsIHNpemVvZihhcmc2NC5SZXF1ZXN0KSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5lcnJvcl9pbmZvLCAmYXJnMzItPmVycm9yX2luZm8sIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5MVU5faW5mbykpOworCWVyciB8PQorCSAgICBjb3B5X2Zyb21fdXNlcigmYXJnNjQuUmVxdWVzdCwgJmFyZzMyLT5SZXF1ZXN0LAorCQkJICAgc2l6ZW9mKGFyZzY0LlJlcXVlc3QpKTsKKwllcnIgfD0KKwkgICAgY29weV9mcm9tX3VzZXIoJmFyZzY0LmVycm9yX2luZm8sICZhcmczMi0+ZXJyb3JfaW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CiAJZXJyIHw9IGdldF91c2VyKGFyZzY0LmJ1Zl9zaXplLCAmYXJnMzItPmJ1Zl9zaXplKTsKIAllcnIgfD0gZ2V0X3VzZXIoY3AsICZhcmczMi0+YnVmKTsKIAlhcmc2NC5idWYgPSBjb21wYXRfcHRyKGNwKTsKQEAgLTU5NiwyOCArNTk2LDM4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQllcnIgPSBkb19pb2N0bChmLCBDQ0lTU19QQVNTVEhSVSwgKHVuc2lnbmVkIGxvbmcpIHApOworCWVyciA9IGRvX2lvY3RsKGYsIENDSVNTX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZylwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciB8PSBjb3B5X2luX3VzZXIoJmFyZzMyLT5lcnJvcl9pbmZvLCAmcC0+ZXJyb3JfaW5mbywgc2l6ZW9mKGFyZzMyLT5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfaW5fdXNlcigmYXJnMzItPmVycm9yX2luZm8sICZwLT5lcnJvcl9pbmZvLAorCQkJIHNpemVvZihhcmczMi0+ZXJyb3JfaW5mbykpOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgY2Npc3NfaW9jdGwzMl9iaWdfcGFzc3RocnUoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgaW50IGNjaXNzX2lvY3RsMzJfYmlnX3Bhc3N0aHJ1KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBjbWQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJQklHX0lPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICphcmczMiA9Ci0JCShCSUdfSU9DVEwzMl9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKikgYXJnOworCSAgICAoQklHX0lPQ1RMMzJfQ29tbWFuZF9zdHJ1Y3QgX191c2VyICopIGFyZzsKIAlCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgYXJnNjQ7Ci0JQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0IF9fdXNlciAqcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihhcmc2NCkpOworCUJJR19JT0NUTF9Db21tYW5kX3N0cnVjdCBfX3VzZXIgKnAgPQorCSAgICBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoYXJnNjQpKTsKIAlpbnQgZXJyOwogCXUzMiBjcDsKIAogCWVyciA9IDA7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywgc2l6ZW9mKGFyZzY0LkxVTl9pbmZvKSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5SZXF1ZXN0LCAmYXJnMzItPlJlcXVlc3QsIHNpemVvZihhcmc2NC5SZXF1ZXN0KSk7Ci0JZXJyIHw9IGNvcHlfZnJvbV91c2VyKCZhcmc2NC5lcnJvcl9pbmZvLCAmYXJnMzItPmVycm9yX2luZm8sIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfZnJvbV91c2VyKCZhcmc2NC5MVU5faW5mbywgJmFyZzMyLT5MVU5faW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5MVU5faW5mbykpOworCWVyciB8PQorCSAgICBjb3B5X2Zyb21fdXNlcigmYXJnNjQuUmVxdWVzdCwgJmFyZzMyLT5SZXF1ZXN0LAorCQkJICAgc2l6ZW9mKGFyZzY0LlJlcXVlc3QpKTsKKwllcnIgfD0KKwkgICAgY29weV9mcm9tX3VzZXIoJmFyZzY0LmVycm9yX2luZm8sICZhcmczMi0+ZXJyb3JfaW5mbywKKwkJCSAgIHNpemVvZihhcmc2NC5lcnJvcl9pbmZvKSk7CiAJZXJyIHw9IGdldF91c2VyKGFyZzY0LmJ1Zl9zaXplLCAmYXJnMzItPmJ1Zl9zaXplKTsKIAllcnIgfD0gZ2V0X3VzZXIoYXJnNjQubWFsbG9jX3NpemUsICZhcmczMi0+bWFsbG9jX3NpemUpOwogCWVyciB8PSBnZXRfdXNlcihjcCwgJmFyZzMyLT5idWYpOwpAQCAtNjI1LDEyICs2MzUsMTQgQEAKIAllcnIgfD0gY29weV90b191c2VyKHAsICZhcmc2NCwgc2l6ZW9mKGFyZzY0KSk7CiAKIAlpZiAoZXJyKQotCQkgcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAtRUZBVUxUOwogCi0JZXJyID0gZG9faW9jdGwoZmlsZSwgQ0NJU1NfQklHX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZykgcCk7CisJZXJyID0gZG9faW9jdGwoZmlsZSwgQ0NJU1NfQklHX1BBU1NUSFJVLCAodW5zaWduZWQgbG9uZylwKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWVyciB8PSBjb3B5X2luX3VzZXIoJmFyZzMyLT5lcnJvcl9pbmZvLCAmcC0+ZXJyb3JfaW5mbywgc2l6ZW9mKGFyZzMyLT5lcnJvcl9pbmZvKSk7CisJZXJyIHw9CisJICAgIGNvcHlfaW5fdXNlcigmYXJnMzItPmVycm9yX2luZm8sICZwLT5lcnJvcl9pbmZvLAorCQkJIHNpemVvZihhcmczMi0+ZXJyb3JfaW5mbykpOwogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCXJldHVybiBlcnI7CkBAIC02NTEsMTAgKzY2MywxMCBAQAogfQogCiAvKgotICogaW9jdGwgCisgKiBpb2N0bAogICovCi1zdGF0aWMgaW50IGNjaXNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlcCwgCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBjY2lzc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXAsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gaW5vZGUtPmlfYmRldjsKIAlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGJkZXYtPmJkX2Rpc2s7CkBAIC02NjUsMTcxICs2NzcsMTkzIEBACiAKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJjY2lzc19pb2N0bDogQ2FsbGVkIHdpdGggY21kPSV4ICVseFxuIiwgY21kLCBhcmcpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAotCQotCXN3aXRjaChjbWQpIHsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCisJc3dpdGNoIChjbWQpIHsKIAljYXNlIENDSVNTX0dFVFBDSUlORk86Ci0JewotCQljY2lzc19wY2lfaW5mb19zdHJ1Y3QgcGNpaW5mbzsKLQotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7Ci0JCXBjaWluZm8uZG9tYWluID0gcGNpX2RvbWFpbl9ucihob3N0LT5wZGV2LT5idXMpOwotCQlwY2lpbmZvLmJ1cyA9IGhvc3QtPnBkZXYtPmJ1cy0+bnVtYmVyOwotCQlwY2lpbmZvLmRldl9mbiA9IGhvc3QtPnBkZXYtPmRldmZuOwotCQlwY2lpbmZvLmJvYXJkX2lkID0gaG9zdC0+Ym9hcmRfaWQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnBjaWluZm8sICBzaXplb2YoIGNjaXNzX3BjaV9pbmZvX3N0cnVjdCApKSkKLQkJCXJldHVybiAgLUVGQVVMVDsKLQkJcmV0dXJuKDApOwotCX0JCi0JY2FzZSBDQ0lTU19HRVRJTlRJTkZPOgotCXsKLQkJY2Npc3NfY29hbGludF9zdHJ1Y3QgaW50aW5mbzsKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQlpbnRpbmZvLmRlbGF5ID0gcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludERlbGF5KTsKLQkJaW50aW5mby5jb3VudCA9IHJlYWRsKCZob3N0LT5jZmd0YWJsZS0+SG9zdFdyaXRlLkNvYWxJbnRDb3VudCk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmludGluZm8sIHNpemVvZiggY2Npc3NfY29hbGludF9zdHJ1Y3QgKSkpCi0JCQlyZXR1cm4gLUVGQVVMVDsKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KLQljYXNlIENDSVNTX1NFVElOVElORk86Ci0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBjY2lzc19jb2FsaW50X3N0cnVjdCBpbnRpbmZvOwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlpbnQgaTsKLQotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CQotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRVBFUk07Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW50aW5mbywgYXJncCwgc2l6ZW9mKCBjY2lzc19jb2FsaW50X3N0cnVjdCkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmICggKGludGluZm8uZGVsYXkgPT0gMCApICYmIChpbnRpbmZvLmNvdW50ID09IDApKQotCiAJCXsKLS8vCQkJcHJpbnRrKCJjY2lzc19pb2N0bDogZGVsYXkgYW5kIGNvdW50IGNhbm5vdCBiZSAwXG4iKTsKLQkJCXJldHVybiggLUVJTlZBTCk7CisJCQljY2lzc19wY2lfaW5mb19zdHJ1Y3QgcGNpaW5mbzsKKworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlwY2lpbmZvLmRvbWFpbiA9IHBjaV9kb21haW5fbnIoaG9zdC0+cGRldi0+YnVzKTsKKwkJCXBjaWluZm8uYnVzID0gaG9zdC0+cGRldi0+YnVzLT5udW1iZXI7CisJCQlwY2lpbmZvLmRldl9mbiA9IGhvc3QtPnBkZXYtPmRldmZuOworCQkJcGNpaW5mby5ib2FyZF9pZCA9IGhvc3QtPmJvYXJkX2lkOworCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJICAgIChhcmdwLCAmcGNpaW5mbywgc2l6ZW9mKGNjaXNzX3BjaV9pbmZvX3N0cnVjdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CiAJCX0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQkvKiBVcGRhdGUgdGhlIGZpZWxkLCBhbmQgdGhlbiByaW5nIHRoZSBkb29yYmVsbCAqLyAKLQkJd3JpdGVsKCBpbnRpbmZvLmRlbGF5LCAKLQkJCSYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKTsKLQkJd3JpdGVsKCBpbnRpbmZvLmNvdW50LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50Q291bnQpKTsKLQkJd3JpdGVsKCBDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJY2FzZSBDQ0lTU19HRVRJTlRJTkZPOgorCQl7CisJCQljY2lzc19jb2FsaW50X3N0cnVjdCBpbnRpbmZvOworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpbnRpbmZvLmRlbGF5ID0KKwkJCSAgICByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpOworCQkJaW50aW5mby5jb3VudCA9CisJCQkgICAgcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgJmludGluZm8sIHNpemVvZihjY2lzc19jb2FsaW50X3N0cnVjdCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwljYXNlIENDSVNTX1NFVElOVElORk86CisJCXsKKwkJCWNjaXNzX2NvYWxpbnRfc3RydWN0IGludGluZm87CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaW50IGk7CiAKLQkJZm9yKGk9MDtpPE1BWF9JT0NUTF9DT05GSUdfV0FJVDtpKyspIHsKLQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKSAKLQkJCQkJJiBDRkdUQkxfQ2hhbmdlUmVxKSkKLQkJCQlicmVhazsKLQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KLQkJCXVkZWxheSgxMDAwKTsKLQkJfQkKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKLQkJCXJldHVybiAtRUFHQUlOOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgmaW50aW5mbywgYXJncCwgc2l6ZW9mKGNjaXNzX2NvYWxpbnRfc3RydWN0KSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoKGludGluZm8uZGVsYXkgPT0gMCkgJiYgKGludGluZm8uY291bnQgPT0gMCkpCisJCQl7CisvLyAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImNjaXNzX2lvY3RsOiBkZWxheSBhbmQgY291bnQgY2Fubm90IGJlIDBcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOworCQkJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8KKwkJCXdyaXRlbChpbnRpbmZvLmRlbGF5LAorCQkJICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKTsKKwkJCXdyaXRlbChpbnRpbmZvLmNvdW50LAorCQkJICAgICAgICYoaG9zdC0+Y2ZndGFibGUtPkhvc3RXcml0ZS5Db2FsSW50Q291bnQpKTsKKwkJCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9DVExfQ09ORklHX1dBSVQ7IGkrKykgeworCQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKQorCQkJCSAgICAgICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCisJCQkJCWJyZWFrOworCQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19HRVROT0RFTkFNRToKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE5vZGVOYW1lX3R5cGUgTm9kZU5hbWU7Ci0JCWludCBpOyAKKwkJeworCQkJTm9kZU5hbWVfdHlwZSBOb2RlTmFtZTsKKwkJCWludCBpOwogCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLQkJZm9yKGk9MDtpPDE2O2krKykKLQkJCU5vZGVOYW1lW2ldID0gcmVhZGIoJmhvc3QtPmNmZ3RhYmxlLT5TZXJ2ZXJOYW1lW2ldKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsIE5vZGVOYW1lLCBzaXplb2YoIE5vZGVOYW1lX3R5cGUpKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuICAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQlOb2RlTmFtZVtpXSA9CisJCQkJICAgIHJlYWRiKCZob3N0LT5jZmd0YWJsZS0+U2VydmVyTmFtZVtpXSk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIE5vZGVOYW1lLCBzaXplb2YoTm9kZU5hbWVfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAljYXNlIENDSVNTX1NFVE5PREVOQU1FOgotCXsKLQkJTm9kZU5hbWVfdHlwZSBOb2RlTmFtZTsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJaW50IGk7CisJCXsKKwkJCU5vZGVOYW1lX3R5cGUgTm9kZU5hbWU7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJaW50IGk7CiAKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHJldHVybiAtRVBFUk07Ci0JCQotCQlpZiAoY29weV9mcm9tX3VzZXIoTm9kZU5hbWUsIGFyZ3AsIHNpemVvZiggTm9kZU5hbWVfdHlwZSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCQlyZXR1cm4gLUVQRVJNOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgIChOb2RlTmFtZSwgYXJncCwgc2l6ZW9mKE5vZGVOYW1lX3R5cGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8gCi0JCWZvcihpPTA7aTwxNjtpKyspCi0JCQl3cml0ZWIoIE5vZGVOYW1lW2ldLCAmaG9zdC0+Y2ZndGFibGUtPlNlcnZlck5hbWVbaV0pOwotCQkJCi0JCXdyaXRlbCggQ0ZHVEJMX0NoYW5nZVJlcSwgaG9zdC0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwogCi0JCWZvcihpPTA7aTxNQVhfSU9DVExfQ09ORklHX1dBSVQ7aSsrKSB7Ci0JCQlpZiAoIShyZWFkbChob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCkgCi0JCQkJCSYgQ0ZHVEJMX0NoYW5nZVJlcSkpCi0JCQkJYnJlYWs7Ci0JCQkvKiBkZWxheSBhbmQgdHJ5IGFnYWluICovCi0JCQl1ZGVsYXkoMTAwMCk7Ci0JCX0JCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQlpZiAoaSA+PSBNQVhfSU9DVExfQ09ORklHX1dBSVQpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLSAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0gICAgICAgIH0KKwkJCS8qIFVwZGF0ZSB0aGUgZmllbGQsIGFuZCB0aGVuIHJpbmcgdGhlIGRvb3JiZWxsICovCisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQl3cml0ZWIoTm9kZU5hbWVbaV0sCisJCQkJICAgICAgICZob3N0LT5jZmd0YWJsZS0+U2VydmVyTmFtZVtpXSk7CisKKwkJCXdyaXRlbChDRkdUQkxfQ2hhbmdlUmVxLCBob3N0LT52YWRkciArIFNBNV9ET09SQkVMTCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9DVExfQ09ORklHX1dBSVQ7IGkrKykgeworCQkJCWlmICghKHJlYWRsKGhvc3QtPnZhZGRyICsgU0E1X0RPT1JCRUxMKQorCQkJCSAgICAgICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCisJCQkJCWJyZWFrOworCQkJCS8qIGRlbGF5IGFuZCB0cnkgYWdhaW4gKi8KKwkJCQl1ZGVsYXkoMTAwMCk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCWlmIChpID49IE1BWF9JT0NUTF9DT05GSUdfV0FJVCkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCXJldHVybiAwOworCQl9CiAKIAljYXNlIENDSVNTX0dFVEhFQVJUQkVBVDoKLSAgICAgICAgewotICAgICAgICAgICAgICAgIEhlYXJ0YmVhdF90eXBlIGhlYXJ0YmVhdDsKKwkJeworCQkJSGVhcnRiZWF0X3R5cGUgaGVhcnRiZWF0OwogCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBoZWFydGJlYXQgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhlYXJ0QmVhdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaGVhcnRiZWF0LCBzaXplb2YoIEhlYXJ0YmVhdF90eXBlKSkpCi0gICAgICAgICAgICAgICAgCXJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgfQorCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQloZWFydGJlYXQgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkhlYXJ0QmVhdCk7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZoZWFydGJlYXQsIHNpemVvZihIZWFydGJlYXRfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAljYXNlIENDSVNTX0dFVEJVU1RZUEVTOgotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnVzVHlwZXNfdHlwZSBCdXNUeXBlczsKKwkJeworCQkJQnVzVHlwZXNfdHlwZSBCdXNUeXBlczsKIAotCQlpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgICAgICAgICAgQnVzVHlwZXMgPSByZWFkbCgmaG9zdC0+Y2ZndGFibGUtPkJ1c1R5cGVzKTsKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZCdXNUeXBlcywgc2l6ZW9mKCBCdXNUeXBlc190eXBlKSApKQotICAgICAgICAgICAgICAgIAlyZXR1cm4gIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCUJ1c1R5cGVzID0gcmVhZGwoJmhvc3QtPmNmZ3RhYmxlLT5CdXNUeXBlcyk7CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZCdXNUeXBlcywgc2l6ZW9mKEJ1c1R5cGVzX3R5cGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19HRVRGSVJNVkVSOgotICAgICAgICB7Ci0JCUZpcm13YXJlVmVyX3R5cGUgZmlybXdhcmU7CisJCXsKKwkJCUZpcm13YXJlVmVyX3R5cGUgZmlybXdhcmU7CiAKLQkJaWYgKCFhcmcpIHJldHVybiAtRUlOVkFMOwotCQltZW1jcHkoZmlybXdhcmUsIGhvc3QtPmZpcm1fdmVyLCA0KTsKKwkJCWlmICghYXJnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJbWVtY3B5KGZpcm13YXJlLCBob3N0LT5maXJtX3ZlciwgNCk7CiAKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsIGZpcm13YXJlLCBzaXplb2YoIEZpcm13YXJlVmVyX3R5cGUpKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ0NJU1NfR0VURFJJVlZFUjoKLSAgICAgICAgewotCQlEcml2ZXJWZXJfdHlwZSBEcml2ZXJWZXIgPSBEUklWRVJfVkVSU0lPTjsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgZmlybXdhcmUsIHNpemVvZihGaXJtd2FyZVZlcl90eXBlKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgQ0NJU1NfR0VURFJJVlZFUjoKKwkJeworCQkJRHJpdmVyVmVyX3R5cGUgRHJpdmVyVmVyID0gRFJJVkVSX1ZFUlNJT047CiAKLSAgICAgICAgICAgICAgICBpZiAoIWFyZykgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIWFyZykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkRyaXZlclZlciwgc2l6ZW9mKCBEcml2ZXJWZXJfdHlwZSkgKSkKLSAgICAgICAgICAgICAgICAJcmV0dXJuIC1FRkFVTFQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKDApOwotICAgICAgICB9CisJCQlpZiAoY29weV90b191c2VyCisJCQkgICAgKGFyZ3AsICZEcml2ZXJWZXIsIHNpemVvZihEcml2ZXJWZXJfdHlwZSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KIAogCWNhc2UgQ0NJU1NfUkVWQUxJRFZPTFM6CiAJCWlmIChiZGV2ICE9IGJkZXYtPmJkX2NvbnRhaW5zIHx8IGRydiAhPSBob3N0LT5kcnYpCiAJCQlyZXR1cm4gLUVOWElPOwotICAgICAgICAgICAgICAgIHJldHVybiByZXZhbGlkYXRlX2FsbHZvbChob3N0KTsKKwkJcmV0dXJuIHJldmFsaWRhdGVfYWxsdm9sKGhvc3QpOwogCi0gCWNhc2UgQ0NJU1NfR0VUTFVOSU5GTzogewotIAkJTG9ndm9sSW5mb19zdHJ1Y3QgbHVuaW5mbzsKLSAJCQotIAkJbHVuaW5mby5MdW5JRCA9IGRydi0+THVuSUQ7Ci0gCQlsdW5pbmZvLm51bV9vcGVucyA9IGRydi0+dXNhZ2VfY291bnQ7Ci0gCQlsdW5pbmZvLm51bV9wYXJ0cyA9IDA7Ci0gCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZsdW5pbmZvLAotIAkJCQlzaXplb2YoTG9ndm9sSW5mb19zdHJ1Y3QpKSkKLSAJCQlyZXR1cm4gLUVGQVVMVDsKLSAJCXJldHVybigwKTsKLSAJfQorCWNhc2UgQ0NJU1NfR0VUTFVOSU5GTzp7CisJCQlMb2d2b2xJbmZvX3N0cnVjdCBsdW5pbmZvOworCisJCQlsdW5pbmZvLkx1bklEID0gZHJ2LT5MdW5JRDsKKwkJCWx1bmluZm8ubnVtX29wZW5zID0gZHJ2LT51c2FnZV9jb3VudDsKKwkJCWx1bmluZm8ubnVtX3BhcnRzID0gMDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmx1bmluZm8sCisJCQkJCSBzaXplb2YoTG9ndm9sSW5mb19zdHJ1Y3QpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CiAJY2FzZSBDQ0lTU19ERVJFR0RJU0s6CiAJCXJldHVybiByZWJ1aWxkX2x1bl90YWJsZShob3N0LCBkaXNrKTsKIApAQCAtODM3LDI3OCArODcxLDI4NCBAQAogCQlyZXR1cm4gcmVidWlsZF9sdW5fdGFibGUoaG9zdCwgTlVMTCk7CiAKIAljYXNlIENDSVNTX1BBU1NUSFJVOgotCXsKLQkJSU9DVExfQ29tbWFuZF9zdHJ1Y3QgaW9jb21tYW5kOwotCQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCWNoYXIgCSpidWZmID0gTlVMTDsKLQkJdTY0Yml0CXRlbXA2NDsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOwotCi0JCWlmICghYXJnKSByZXR1cm4gLUVJTlZBTDsKLQkKLQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKSByZXR1cm4gLUVQRVJNOwotCi0JCWlmIChjb3B5X2Zyb21fdXNlcigmaW9jb21tYW5kLCBhcmdwLCBzaXplb2YoIElPQ1RMX0NvbW1hbmRfc3RydWN0KSApKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCWlmKChpb2NvbW1hbmQuYnVmX3NpemUgPCAxKSAmJiAKLQkJCQkoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gIT0gWEZFUl9OT05FKSkKLQkJewkKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9IAotI2lmIDAgLyogJ2J1Zl9zaXplJyBtZW1iZXIgaXMgMTYtYml0cywgYW5kIGFsd2F5cyBzbWFsbGVyIHRoYW4ga21hbGxvYyBsaW1pdCAqLwotCQkvKiBDaGVjayBrbWFsbG9jIGxpbWl0cyAqLwotCQlpZihpb2NvbW1hbmQuYnVmX3NpemUgPiAxMjgwMDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgotCQlpZihpb2NvbW1hbmQuYnVmX3NpemUgPiAwKQogCQl7Ci0JCQlidWZmID0gIGttYWxsb2MoaW9jb21tYW5kLmJ1Zl9zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmKCBidWZmID09IE5VTEwpIAorCQkJSU9DVExfQ29tbWFuZF9zdHJ1Y3QgaW9jb21tYW5kOworCQkJQ29tbWFuZExpc3Rfc3RydWN0ICpjOworCQkJY2hhciAqYnVmZiA9IE5VTEw7CisJCQl1NjRiaXQgdGVtcDY0OworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKKworCQkJaWYgKCFhcmcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIKKwkJCSAgICAoJmlvY29tbWFuZCwgYXJncCwgc2l6ZW9mKElPQ1RMX0NvbW1hbmRfc3RydWN0KSkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJaWYgKGlvY29tbWFuZC5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpCi0JCXsKLQkJCS8qIENvcHkgdGhlIGRhdGEgaW50byB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8gCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZiwgaW9jb21tYW5kLmJ1ZiwgaW9jb21tYW5kLmJ1Zl9zaXplKSkKLQkJCXsKLQkJCQlrZnJlZShidWZmKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICgoaW9jb21tYW5kLmJ1Zl9zaXplIDwgMSkgJiYKKwkJCSAgICAoaW9jb21tYW5kLlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gIT0gWEZFUl9OT05FKSkgeworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQl9IGVsc2UgewotCQkJbWVtc2V0KGJ1ZmYsIDAsIGlvY29tbWFuZC5idWZfc2l6ZSk7Ci0JCX0KLQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QgLCAwKSkgPT0gTlVMTCkKLQkJewotCQkJa2ZyZWUoYnVmZik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQkJLy8gRmlsbCBpbiB0aGUgY29tbWFuZCB0eXBlIAotCQljLT5jbWRfdHlwZSA9IENNRF9JT0NUTF9QRU5EOwotCQkJLy8gRmlsbCBpbiBDb21tYW5kIEhlYWRlciAKLQkJYy0+SGVhZGVyLlJlcGx5UXVldWUgPSAwOyAgLy8gdW51c2VkIGluIHNpbXBsZSBtb2RlCi0JCWlmKCBpb2NvbW1hbmQuYnVmX3NpemUgPiAwKSAJLy8gYnVmZmVyIHRvIGZpbGwgCi0JCXsKLQkJCWMtPkhlYWRlci5TR0xpc3QgPSAxOwotCQkJYy0+SGVhZGVyLlNHVG90YWw9IDE7Ci0JCX0gZWxzZQkvLyBubyBidWZmZXJzIHRvIGZpbGwgIAotCQl7Ci0JCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKLSAgICAgICAgICAgICAgICAJYy0+SGVhZGVyLlNHVG90YWw9IDA7Ci0JCX0KLQkJYy0+SGVhZGVyLkxVTiA9IGlvY29tbWFuZC5MVU5faW5mbzsKLQkJYy0+SGVhZGVyLlRhZy5sb3dlciA9IGMtPmJ1c2FkZHI7ICAvLyB1c2UgdGhlIGtlcm5lbCBhZGRyZXNzIHRoZSBjbWQgYmxvY2sgZm9yIHRhZwotCQkKLQkJLy8gRmlsbCBpbiBSZXF1ZXN0IGJsb2NrIAotCQljLT5SZXF1ZXN0ID0gaW9jb21tYW5kLlJlcXVlc3Q7IAotCQotCQkvLyBGaWxsIGluIHRoZSBzY2F0dGVyIGdhdGhlciBpbmZvcm1hdGlvbgotCQlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCApIAotCQl7Ci0JCQl0ZW1wNjQudmFsID0gcGNpX21hcF9zaW5nbGUoIGhvc3QtPnBkZXYsIGJ1ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9jb21tYW5kLmJ1Zl9zaXplLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsJCi0JCQljLT5TR1swXS5BZGRyLmxvd2VyID0gdGVtcDY0LnZhbDMyLmxvd2VyOwotCQkJYy0+U0dbMF0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKLQkJCWMtPlNHWzBdLkxlbiA9IGlvY29tbWFuZC5idWZfc2l6ZTsKLQkJCWMtPlNHWzBdLkV4dCA9IDA7ICAvLyB3ZSBhcmUgbm90IGNoYWluaW5nCi0JCX0KLQkJYy0+d2FpdGluZyA9ICZ3YWl0OwotCi0JCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWFkZFEoJmhvc3QtPnJlcVEsIGMpOwotCQlob3N0LT5RZGVwdGgrKzsKLQkJc3RhcnRfaW8oaG9zdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCi0JCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwotCi0JCS8qIHVubG9jayB0aGUgYnVmZmVycyBmcm9tIERNQSAqLwotCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjLT5TR1swXS5BZGRyLmxvd2VyOwotICAgICAgICAgICAgICAgIHRlbXA2NC52YWwzMi51cHBlciA9IGMtPlNHWzBdLkFkZHIudXBwZXI7Ci0gICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZSggaG9zdC0+cGRldiwgKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwsCi0gICAgICAgICAgICAgICAgCWlvY29tbWFuZC5idWZfc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQotCQkvKiBDb3B5IHRoZSBlcnJvciBpbmZvcm1hdGlvbiBvdXQgKi8gCi0JCWlvY29tbWFuZC5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7Ci0JCWlmICggY29weV90b191c2VyKGFyZ3AsICZpb2NvbW1hbmQsIHNpemVvZiggSU9DVExfQ29tbWFuZF9zdHJ1Y3QpICkgKQotCQl7Ci0JCQlrZnJlZShidWZmKTsKLQkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotCQkJcmV0dXJuKCAtRUZBVUxUKTsJCi0JCX0gCQotCi0JCWlmIChpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9PSBYRkVSX1JFQUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29weSB0aGUgZGF0YSBvdXQgb2YgdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGlvY29tbWFuZC5idWYsIGJ1ZmYsIGlvY29tbWFuZC5idWZfc2l6ZSkpCisjaWYgMAkJCQkvKiAnYnVmX3NpemUnIG1lbWJlciBpcyAxNi1iaXRzLCBhbmQgYWx3YXlzIHNtYWxsZXIgdGhhbiBrbWFsbG9jIGxpbWl0ICovCisJCQkvKiBDaGVjayBrbWFsbG9jIGxpbWl0cyAqLworCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDEyODAwMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApIHsKKwkJCQlidWZmID0ga21hbGxvYyhpb2NvbW1hbmQuYnVmX3NpemUsIEdGUF9LRVJORUwpOworCQkJCWlmIChidWZmID09IE5VTEwpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJaWYgKGlvY29tbWFuZC5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKKwkJCQkvKiBDb3B5IHRoZSBkYXRhIGludG8gdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCisJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJICAgIChidWZmLCBpb2NvbW1hbmQuYnVmLCBpb2NvbW1hbmQuYnVmX3NpemUpKSB7CisJCQkJCWtmcmVlKGJ1ZmYpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1lbXNldChidWZmLCAwLCBpb2NvbW1hbmQuYnVmX3NpemUpOworCQkJfQorCQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QsIDApKSA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoYnVmZik7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQkvLyBGaWxsIGluIHRoZSBjb21tYW5kIHR5cGUKKwkJCWMtPmNtZF90eXBlID0gQ01EX0lPQ1RMX1BFTkQ7CisJCQkvLyBGaWxsIGluIENvbW1hbmQgSGVhZGVyCisJCQljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7CS8vIHVudXNlZCBpbiBzaW1wbGUgbW9kZQorCQkJaWYgKGlvY29tbWFuZC5idWZfc2l6ZSA+IDApCS8vIGJ1ZmZlciB0byBmaWxsCiAJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAJa2ZyZWUoYnVmZik7CisJCQkJYy0+SGVhZGVyLlNHTGlzdCA9IDE7CisJCQkJYy0+SGVhZGVyLlNHVG90YWwgPSAxOworCQkJfSBlbHNlCS8vIG5vIGJ1ZmZlcnMgdG8gZmlsbAorCQkJeworCQkJCWMtPkhlYWRlci5TR0xpc3QgPSAwOworCQkJCWMtPkhlYWRlci5TR1RvdGFsID0gMDsKKwkJCX0KKwkJCWMtPkhlYWRlci5MVU4gPSBpb2NvbW1hbmQuTFVOX2luZm87CisJCQljLT5IZWFkZXIuVGFnLmxvd2VyID0gYy0+YnVzYWRkcjsJLy8gdXNlIHRoZSBrZXJuZWwgYWRkcmVzcyB0aGUgY21kIGJsb2NrIGZvciB0YWcKKworCQkJLy8gRmlsbCBpbiBSZXF1ZXN0IGJsb2NrCisJCQljLT5SZXF1ZXN0ID0gaW9jb21tYW5kLlJlcXVlc3Q7CisKKwkJCS8vIEZpbGwgaW4gdGhlIHNjYXR0ZXIgZ2F0aGVyIGluZm9ybWF0aW9uCisJCQlpZiAoaW9jb21tYW5kLmJ1Zl9zaXplID4gMCkgeworCQkJCXRlbXA2NC52YWwgPSBwY2lfbWFwX3NpbmdsZShob3N0LT5wZGV2LCBidWZmLAorCQkJCQlpb2NvbW1hbmQuYnVmX3NpemUsCisJCQkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJYy0+U0dbMF0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKKwkJCQljLT5TR1swXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOworCQkJCWMtPlNHWzBdLkxlbiA9IGlvY29tbWFuZC5idWZfc2l6ZTsKKwkJCQljLT5TR1swXS5FeHQgPSAwOwkvLyB3ZSBhcmUgbm90IGNoYWluaW5nCisJCQl9CisJCQljLT53YWl0aW5nID0gJndhaXQ7CisKKwkJCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOworCQkJYWRkUSgmaG9zdC0+cmVxUSwgYyk7CisJCQlob3N0LT5RZGVwdGgrKzsKKwkJCXN0YXJ0X2lvKGhvc3QpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCisJCQkvKiB1bmxvY2sgdGhlIGJ1ZmZlcnMgZnJvbSBETUEgKi8KKwkJCXRlbXA2NC52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CisJCQl0ZW1wNjQudmFsMzIudXBwZXIgPSBjLT5TR1swXS5BZGRyLnVwcGVyOworCQkJcGNpX3VubWFwX3NpbmdsZShob3N0LT5wZGV2LCAoZG1hX2FkZHJfdCkgdGVtcDY0LnZhbCwKKwkJCQkJIGlvY29tbWFuZC5idWZfc2l6ZSwKKwkJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkJCS8qIENvcHkgdGhlIGVycm9yIGluZm9ybWF0aW9uIG91dCAqLworCQkJaW9jb21tYW5kLmVycm9yX2luZm8gPSAqKGMtPmVycl9pbmZvKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIKKwkJCSAgICAoYXJncCwgJmlvY29tbWFuZCwgc2l6ZW9mKElPQ1RMX0NvbW1hbmRfc3RydWN0KSkpIHsKKwkJCQlrZnJlZShidWZmKTsKIAkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCX0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAga2ZyZWUoYnVmZik7Ci0JCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybigwKTsKLQl9IAotCWNhc2UgQ0NJU1NfQklHX1BBU1NUSFJVOiB7Ci0JCUJJR19JT0NUTF9Db21tYW5kX3N0cnVjdCAqaW9jOwotCQlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCXVuc2lnbmVkIGNoYXIgKipidWZmID0gTlVMTDsKLQkJaW50CSpidWZmX3NpemUgPSBOVUxMOwotCQl1NjRiaXQJdGVtcDY0OwotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlCWVRFIHNnX3VzZWQgPSAwOwotCQlpbnQgc3RhdHVzID0gMDsKLQkJaW50IGk7Ci0JCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKLQkJX191MzIgICBsZWZ0OwotCQlfX3UzMglzejsKLQkJQllURSAgICBfX3VzZXIgKmRhdGFfcHRyOwogCi0JCWlmICghYXJnKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX1JBV0lPKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCWlvYyA9IChCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgKikgCi0JCQlrbWFsbG9jKHNpemVvZigqaW9jKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghaW9jKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsKKwkJCWlmIChpb2NvbW1hbmQuUmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9PSBYRkVSX1JFQUQpIHsKKwkJCQkvKiBDb3B5IHRoZSBkYXRhIG91dCBvZiB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8KKwkJCQlpZiAoY29weV90b191c2VyCisJCQkJICAgIChpb2NvbW1hbmQuYnVmLCBidWZmLCBpb2NvbW1hbmQuYnVmX3NpemUpKSB7CisJCQkJCWtmcmVlKGJ1ZmYpOworCQkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJfQorCQkJfQorCQkJa2ZyZWUoYnVmZik7CisJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKKwkJCXJldHVybiAwOwogCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcihpb2MsIGFyZ3AsIHNpemVvZigqaW9jKSkpIHsKLQkJCXN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWlmICgoaW9jLT5idWZfc2l6ZSA8IDEpICYmCi0JCQkoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uICE9IFhGRVJfTk9ORSkpIHsKLQkJCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJCWdvdG8gY2xlYW51cDE7Ci0JCX0KLQkJLyogQ2hlY2sga21hbGxvYyBsaW1pdHMgIHVzaW5nIGFsbCBTR3MgKi8KLQkJaWYgKGlvYy0+bWFsbG9jX3NpemUgPiBNQVhfS01BTExPQ19TSVpFKSB7Ci0JCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJZ290byBjbGVhbnVwMTsKLQkJfQotCQlpZiAoaW9jLT5idWZfc2l6ZSA+IGlvYy0+bWFsbG9jX3NpemUgKiBNQVhTR0VOVFJJRVMpIHsKLQkJCXN0YXR1cyA9IC1FSU5WQUw7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWJ1ZmYgPSBremFsbG9jKE1BWFNHRU5UUklFUyAqIHNpemVvZihjaGFyICopLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWZmKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsKLQkJfQotCQlidWZmX3NpemUgPSAoaW50ICopIGttYWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGludCksIAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWZmX3NpemUpIHsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWxlZnQgPSBpb2MtPmJ1Zl9zaXplOwotCQlkYXRhX3B0ciA9IGlvYy0+YnVmOwotCQl3aGlsZSAobGVmdCkgewotCQkJc3ogPSAobGVmdCA+IGlvYy0+bWFsbG9jX3NpemUpID8gaW9jLT5tYWxsb2Nfc2l6ZSA6IGxlZnQ7Ci0JCQlidWZmX3NpemVbc2dfdXNlZF0gPSBzejsKLQkJCWJ1ZmZbc2dfdXNlZF0gPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKLQkJCWlmIChidWZmW3NnX3VzZWRdID09IE5VTEwpIHsKKwljYXNlIENDSVNTX0JJR19QQVNTVEhSVTp7CisJCQlCSUdfSU9DVExfQ29tbWFuZF9zdHJ1Y3QgKmlvYzsKKwkJCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKKwkJCXVuc2lnbmVkIGNoYXIgKipidWZmID0gTlVMTDsKKwkJCWludCAqYnVmZl9zaXplID0gTlVMTDsKKwkJCXU2NGJpdCB0ZW1wNjQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJQllURSBzZ191c2VkID0gMDsKKwkJCWludCBzdGF0dXMgPSAwOworCQkJaW50IGk7CisJCQlERUNMQVJFX0NPTVBMRVRJT04od2FpdCk7CisJCQlfX3UzMiBsZWZ0OworCQkJX191MzIgc3o7CisJCQlCWVRFIF9fdXNlciAqZGF0YV9wdHI7CisKKwkJCWlmICghYXJnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpb2MgPSAoQklHX0lPQ1RMX0NvbW1hbmRfc3RydWN0ICopCisJCQkgICAga21hbGxvYyhzaXplb2YoKmlvYyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFpb2MpIHsKIAkJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJCWdvdG8gY2xlYW51cDE7CiAJCQl9Ci0JCQlpZiAoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZltzZ191c2VkXSwgZGF0YV9wdHIsIHN6KSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGlvYywgYXJncCwgc2l6ZW9mKCppb2MpKSkgeworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmICgoaW9jLT5idWZfc2l6ZSA8IDEpICYmCisJCQkgICAgKGlvYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiAhPSBYRkVSX05PTkUpKSB7CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJLyogQ2hlY2sga21hbGxvYyBsaW1pdHMgIHVzaW5nIGFsbCBTR3MgKi8KKwkJCWlmIChpb2MtPm1hbGxvY19zaXplID4gTUFYX0tNQUxMT0NfU0laRSkgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmIChpb2MtPmJ1Zl9zaXplID4gaW9jLT5tYWxsb2Nfc2l6ZSAqIE1BWFNHRU5UUklFUykgeworCQkJCXN0YXR1cyA9IC1FSU5WQUw7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWJ1ZmYgPQorCQkJICAgIGt6YWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCQkJaWYgKCFidWZmKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJYnVmZl9zaXplID0gKGludCAqKWttYWxsb2MoTUFYU0dFTlRSSUVTICogc2l6ZW9mKGludCksCisJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghYnVmZl9zaXplKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJbGVmdCA9IGlvYy0+YnVmX3NpemU7CisJCQlkYXRhX3B0ciA9IGlvYy0+YnVmOworCQkJd2hpbGUgKGxlZnQpIHsKKwkJCQlzeiA9IChsZWZ0ID4KKwkJCQkgICAgICBpb2MtPm1hbGxvY19zaXplKSA/IGlvYy0+CisJCQkJICAgIG1hbGxvY19zaXplIDogbGVmdDsKKwkJCQlidWZmX3NpemVbc2dfdXNlZF0gPSBzejsKKwkJCQlidWZmW3NnX3VzZWRdID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKGJ1ZmZbc2dfdXNlZF0gPT0gTlVMTCkgewogCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwogCQkJCQlnb3RvIGNsZWFudXAxOwogCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWVtc2V0KGJ1ZmZbc2dfdXNlZF0sIDAsIHN6KTsKLQkJCX0KLQkJCWxlZnQgLT0gc3o7Ci0JCQlkYXRhX3B0ciArPSBzejsKLQkJCXNnX3VzZWQrKzsKLQkJfQotCQlpZiAoKGMgPSBjbWRfYWxsb2MoaG9zdCAsIDApKSA9PSBOVUxMKSB7Ci0JCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJZ290byBjbGVhbnVwMTsJCi0JCX0KLQkJYy0+Y21kX3R5cGUgPSBDTURfSU9DVExfUEVORDsKLQkJYy0+SGVhZGVyLlJlcGx5UXVldWUgPSAwOwotCQkKLQkJaWYoIGlvYy0+YnVmX3NpemUgPiAwKSB7Ci0JCQljLT5IZWFkZXIuU0dMaXN0ID0gc2dfdXNlZDsKLQkJCWMtPkhlYWRlci5TR1RvdGFsPSBzZ191c2VkOwotCQl9IGVsc2UgeyAKLQkJCWMtPkhlYWRlci5TR0xpc3QgPSAwOwotCQkJYy0+SGVhZGVyLlNHVG90YWw9IDA7Ci0JCX0KLQkJYy0+SGVhZGVyLkxVTiA9IGlvYy0+TFVOX2luZm87Ci0JCWMtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5idXNhZGRyOwotCQkKLQkJYy0+UmVxdWVzdCA9IGlvYy0+UmVxdWVzdDsKLQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwICkgewotCQkJaW50IGk7Ci0JCQlmb3IoaT0wOyBpPHNnX3VzZWQ7IGkrKykgewotCQkJCXRlbXA2NC52YWwgPSBwY2lfbWFwX3NpbmdsZSggaG9zdC0+cGRldiwgYnVmZltpXSwKLQkJCQkJYnVmZl9zaXplW2ldLAotCQkJCQlQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCQkJCWMtPlNHW2ldLkFkZHIubG93ZXIgPSB0ZW1wNjQudmFsMzIubG93ZXI7Ci0JCQkJYy0+U0dbaV0uQWRkci51cHBlciA9IHRlbXA2NC52YWwzMi51cHBlcjsKLQkJCQljLT5TR1tpXS5MZW4gPSBidWZmX3NpemVbaV07Ci0JCQkJYy0+U0dbaV0uRXh0ID0gMDsgIC8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KLQkJCX0KLQkJfQotCQljLT53YWl0aW5nID0gJndhaXQ7Ci0JCS8qIFB1dCB0aGUgcmVxdWVzdCBvbiB0aGUgdGFpbCBvZiB0aGUgcmVxdWVzdCBxdWV1ZSAqLwotCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7Ci0JCWFkZFEoJmhvc3QtPnJlcVEsIGMpOwotCQlob3N0LT5RZGVwdGgrKzsKLQkJc3RhcnRfaW8oaG9zdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZ3YWl0KTsKLQkJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCi0JCWZvcihpPTA7IGk8c2dfdXNlZDsgaSsrKSB7Ci0JCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjLT5TR1tpXS5BZGRyLmxvd2VyOwotCQkJdGVtcDY0LnZhbDMyLnVwcGVyID0gYy0+U0dbaV0uQWRkci51cHBlcjsKLQkJCXBjaV91bm1hcF9zaW5nbGUoIGhvc3QtPnBkZXYsIChkbWFfYWRkcl90KSB0ZW1wNjQudmFsLAotCQkJCWJ1ZmZfc2l6ZVtpXSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJfQotCQkvKiBDb3B5IHRoZSBlcnJvciBpbmZvcm1hdGlvbiBvdXQgKi8KLQkJaW9jLT5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgaW9jLCBzaXplb2YoKmlvYykpKSB7Ci0JCQljbWRfZnJlZShob3N0LCBjLCAwKTsKLQkJCXN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQlnb3RvIGNsZWFudXAxOwotCQl9Ci0JCWlmIChpb2MtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKSB7Ci0JCQkvKiBDb3B5IHRoZSBkYXRhIG91dCBvZiB0aGUgYnVmZmVyIHdlIGNyZWF0ZWQgKi8KLQkJCUJZVEUgX191c2VyICpwdHIgPSBpb2MtPmJ1ZjsKLQkgICAgICAgIAlmb3IoaT0wOyBpPCBzZ191c2VkOyBpKyspIHsKLQkJCQlpZiAoY29weV90b191c2VyKHB0ciwgYnVmZltpXSwgYnVmZl9zaXplW2ldKSkgewotCQkJCQljbWRfZnJlZShob3N0LCBjLCAwKTsKLQkJCQkJc3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJZ290byBjbGVhbnVwMTsKKwkJCQlpZiAoaW9jLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID09IFhGRVJfV1JJVEUpIHsKKwkJCQkJaWYgKGNvcHlfZnJvbV91c2VyCisJCQkJCSAgICAoYnVmZltzZ191c2VkXSwgZGF0YV9wdHIsIHN6KSkgeworCQkJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gY2xlYW51cDE7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQltZW1zZXQoYnVmZltzZ191c2VkXSwgMCwgc3opOwogCQkJCX0KLQkJCQlwdHIgKz0gYnVmZl9zaXplW2ldOworCQkJCWxlZnQgLT0gc3o7CisJCQkJZGF0YV9wdHIgKz0gc3o7CisJCQkJc2dfdXNlZCsrOwogCQkJfQorCQkJaWYgKChjID0gY21kX2FsbG9jKGhvc3QsIDApKSA9PSBOVUxMKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIGNsZWFudXAxOworCQkJfQorCQkJYy0+Y21kX3R5cGUgPSBDTURfSU9DVExfUEVORDsKKwkJCWMtPkhlYWRlci5SZXBseVF1ZXVlID0gMDsKKworCQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwKSB7CisJCQkJYy0+SGVhZGVyLlNHTGlzdCA9IHNnX3VzZWQ7CisJCQkJYy0+SGVhZGVyLlNHVG90YWwgPSBzZ191c2VkOworCQkJfSBlbHNlIHsKKwkJCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKKwkJCQljLT5IZWFkZXIuU0dUb3RhbCA9IDA7CisJCQl9CisJCQljLT5IZWFkZXIuTFVOID0gaW9jLT5MVU5faW5mbzsKKwkJCWMtPkhlYWRlci5UYWcubG93ZXIgPSBjLT5idXNhZGRyOworCisJCQljLT5SZXF1ZXN0ID0gaW9jLT5SZXF1ZXN0OworCQkJaWYgKGlvYy0+YnVmX3NpemUgPiAwKSB7CisJCQkJaW50IGk7CisJCQkJZm9yIChpID0gMDsgaSA8IHNnX3VzZWQ7IGkrKykgeworCQkJCQl0ZW1wNjQudmFsID0KKwkJCQkJICAgIHBjaV9tYXBfc2luZ2xlKGhvc3QtPnBkZXYsIGJ1ZmZbaV0sCisJCQkJCQkgICAgYnVmZl9zaXplW2ldLAorCQkJCQkJICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisJCQkJCWMtPlNHW2ldLkFkZHIubG93ZXIgPQorCQkJCQkgICAgdGVtcDY0LnZhbDMyLmxvd2VyOworCQkJCQljLT5TR1tpXS5BZGRyLnVwcGVyID0KKwkJCQkJICAgIHRlbXA2NC52YWwzMi51cHBlcjsKKwkJCQkJYy0+U0dbaV0uTGVuID0gYnVmZl9zaXplW2ldOworCQkJCQljLT5TR1tpXS5FeHQgPSAwOwkvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCisJCQkJfQorCQkJfQorCQkJYy0+d2FpdGluZyA9ICZ3YWl0OworCQkJLyogUHV0IHRoZSByZXF1ZXN0IG9uIHRoZSB0YWlsIG9mIHRoZSByZXF1ZXN0IHF1ZXVlICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisJCQlhZGRRKCZob3N0LT5yZXFRLCBjKTsKKwkJCWhvc3QtPlFkZXB0aCsrOworCQkJc3RhcnRfaW8oaG9zdCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCQkJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCisJCQlmb3IgKGkgPSAwOyBpIDwgc2dfdXNlZDsgaSsrKSB7CisJCQkJdGVtcDY0LnZhbDMyLmxvd2VyID0gYy0+U0dbaV0uQWRkci5sb3dlcjsKKwkJCQl0ZW1wNjQudmFsMzIudXBwZXIgPSBjLT5TR1tpXS5BZGRyLnVwcGVyOworCQkJCXBjaV91bm1hcF9zaW5nbGUoaG9zdC0+cGRldiwKKwkJCQkJKGRtYV9hZGRyX3QpIHRlbXA2NC52YWwsIGJ1ZmZfc2l6ZVtpXSwKKwkJCQkJUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwkJCX0KKwkJCS8qIENvcHkgdGhlIGVycm9yIGluZm9ybWF0aW9uIG91dCAqLworCQkJaW9jLT5lcnJvcl9pbmZvID0gKihjLT5lcnJfaW5mbyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGlvYywgc2l6ZW9mKCppb2MpKSkgeworCQkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOworCQkJCXN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJZ290byBjbGVhbnVwMTsKKwkJCX0KKwkJCWlmIChpb2MtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKSB7CisJCQkJLyogQ29weSB0aGUgZGF0YSBvdXQgb2YgdGhlIGJ1ZmZlciB3ZSBjcmVhdGVkICovCisJCQkJQllURSBfX3VzZXIgKnB0ciA9IGlvYy0+YnVmOworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ191c2VkOyBpKyspIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcgorCQkJCQkgICAgKHB0ciwgYnVmZltpXSwgYnVmZl9zaXplW2ldKSkgeworCQkJCQkJY21kX2ZyZWUoaG9zdCwgYywgMCk7CisJCQkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJCQkJZ290byBjbGVhbnVwMTsKKwkJCQkJfQorCQkJCQlwdHIgKz0gYnVmZl9zaXplW2ldOworCQkJCX0KKwkJCX0KKwkJCWNtZF9mcmVlKGhvc3QsIGMsIDApOworCQkJc3RhdHVzID0gMDsKKwkJICAgICAgY2xlYW51cDE6CisJCQlpZiAoYnVmZikgeworCQkJCWZvciAoaSA9IDA7IGkgPCBzZ191c2VkOyBpKyspCisJCQkJCWtmcmVlKGJ1ZmZbaV0pOworCQkJCWtmcmVlKGJ1ZmYpOworCQkJfQorCQkJa2ZyZWUoYnVmZl9zaXplKTsKKwkJCWtmcmVlKGlvYyk7CisJCQlyZXR1cm4gc3RhdHVzOwogCQl9Ci0JCWNtZF9mcmVlKGhvc3QsIGMsIDApOwotCQlzdGF0dXMgPSAwOwotY2xlYW51cDE6Ci0JCWlmIChidWZmKSB7Ci0JCQlmb3IoaT0wOyBpPHNnX3VzZWQ7IGkrKykKLQkJCQlrZnJlZShidWZmW2ldKTsKLQkJCWtmcmVlKGJ1ZmYpOwotCQl9Ci0JCWtmcmVlKGJ1ZmZfc2l6ZSk7Ci0JCWtmcmVlKGlvYyk7Ci0JCXJldHVybihzdGF0dXMpOwotCX0KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1RUWTsKIAl9Ci0JCiB9CiAKIC8qCkBAIC0xMTE5LDcgKzExNTksNyBAQAogICoKICAqIFJpZ2h0IG5vdyBJJ20gdXNpbmcgdGhlIGdldGdlb21ldHJ5KCkgZnVuY3Rpb24gdG8gZG8gdGhpcywgYnV0IHRoaXMKICAqIGZ1bmN0aW9uIHNob3VsZCBwcm9iYWJseSBiZSBmaW5lciBncmFpbmVkIGFuZCBhbGxvdyB5b3UgdG8gcmV2YWxpZGF0ZSBvbmUKLSAqIHBhcnRpY3VhbGFyIGxvZ2ljYWwgdm9sdW1lIChpbnN0ZWFkIG9mIGFsbCBvZiB0aGVtIG9uIGEgcGFydGljdWxhcgorICogcGFydGljdWxhciBsb2dpY2FsIHZvbHVtZSAoaW5zdGVhZCBvZiBhbGwgb2YgdGhlbSBvbiBhIHBhcnRpY3VsYXIKICAqIGNvbnRyb2xsZXIpLgogICovCiBzdGF0aWMgaW50IHJldmFsaWRhdGVfYWxsdm9sKGN0bHJfaW5mb190ICpob3N0KQpAQCAtMTEyNywxNyArMTE2NywxNyBAQAogCWludCBjdGxyID0gaG9zdC0+Y3RsciwgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0gICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLSAgICAgICAgaWYgKGhvc3QtPnVzYWdlX2NvdW50ID4gMSkgewotICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhjdGxyKSwgZmxhZ3MpOwotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBEZXZpY2UgYnVzeSBmb3Igdm9sdW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIiByZXZhbGlkYXRpb24gKHVzYWdlPSVkKVxuIiwgaG9zdC0+dXNhZ2VfY291bnQpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgIH0KLSAgICAgICAgaG9zdC0+dXNhZ2VfY291bnQrKzsKKwlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CisJaWYgKGhvc3QtPnVzYWdlX2NvdW50ID4gMSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IERldmljZSBidXN5IGZvciB2b2x1bWUiCisJCSAgICAgICAiIHJldmFsaWRhdGlvbiAodXNhZ2U9JWQpXG4iLCBob3N0LT51c2FnZV9jb3VudCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWhvc3QtPnVzYWdlX2NvdW50Kys7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CiAKLQlmb3IoaT0wOyBpPCBOV0Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBOV0Q7IGkrKykgewogCQlzdHJ1Y3QgZ2VuZGlzayAqZGlzayA9IGhvc3QtPmdlbmRpc2tbaV07CiAJCWlmIChkaXNrKSB7CiAJCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNrLT5xdWV1ZTsKQEAgLTExNDksMjIgKzExODksMjIgQEAKIAkJfQogCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIHBhcnRpdGlvbiBhbmQgYmxvY2sgc2l6ZSBzdHJ1Y3R1cmVzIGZvciBhbGwgdm9sdW1lcwotICAgICAgICAgKiBvbiB0aGlzIGNvbnRyb2xsZXIgdG8gemVyby4gIFdlIHdpbGwgcmVyZWFkIGFsbCBvZiB0aGlzIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIG1lbXNldChob3N0LT5kcnYsICAgICAgICAwLCBzaXplb2YoZHJpdmVfaW5mb19zdHJ1Y3QpCi0JCQkJCQkqIENJU1NfTUFYX0xVTik7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFRlbGwgdGhlIGFycmF5IGNvbnRyb2xsZXIgbm90IHRvIGdpdmUgdXMgYW55IGludGVycnVwdHMgd2hpbGUKLSAgICAgICAgICogd2UgY2hlY2sgdGhlIG5ldyBnZW9tZXRyeS4gIFRoZW4gdHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gd2hlbgotICAgICAgICAgKiB3ZSdyZSBkb25lLgotICAgICAgICAgKi8KLSAgICAgICAgaG9zdC0+YWNjZXNzLnNldF9pbnRyX21hc2soaG9zdCwgQ0NJU1NfSU5UUl9PRkYpOwotICAgICAgICBjY2lzc19nZXRnZW9tZXRyeShjdGxyKTsKLSAgICAgICAgaG9zdC0+YWNjZXNzLnNldF9pbnRyX21hc2soaG9zdCwgQ0NJU1NfSU5UUl9PTik7CisJLyoKKwkgKiBTZXQgdGhlIHBhcnRpdGlvbiBhbmQgYmxvY2sgc2l6ZSBzdHJ1Y3R1cmVzIGZvciBhbGwgdm9sdW1lcworCSAqIG9uIHRoaXMgY29udHJvbGxlciB0byB6ZXJvLiAgV2Ugd2lsbCByZXJlYWQgYWxsIG9mIHRoaXMgZGF0YQorCSAqLworCW1lbXNldChob3N0LT5kcnYsIDAsIHNpemVvZihkcml2ZV9pbmZvX3N0cnVjdCkKKwkgICAgICAgKiBDSVNTX01BWF9MVU4pOworCS8qCisJICogVGVsbCB0aGUgYXJyYXkgY29udHJvbGxlciBub3QgdG8gZ2l2ZSB1cyBhbnkgaW50ZXJydXB0cyB3aGlsZQorCSAqIHdlIGNoZWNrIHRoZSBuZXcgZ2VvbWV0cnkuICBUaGVuIHR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIHdoZW4KKwkgKiB3ZSdyZSBkb25lLgorCSAqLworCWhvc3QtPmFjY2Vzcy5zZXRfaW50cl9tYXNrKGhvc3QsIENDSVNTX0lOVFJfT0ZGKTsKKwljY2lzc19nZXRnZW9tZXRyeShjdGxyKTsKKwlob3N0LT5hY2Nlc3Muc2V0X2ludHJfbWFzayhob3N0LCBDQ0lTU19JTlRSX09OKTsKIAotCS8qIExvb3AgdGhyb3VnaCBlYWNoIHJlYWwgZGV2aWNlICovIAorCS8qIExvb3AgdGhyb3VnaCBlYWNoIHJlYWwgZGV2aWNlICovCiAJZm9yIChpID0gMDsgaSA8IE5XRDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaG9zdC0+Z2VuZGlza1tpXTsKIAkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9ICYoaG9zdC0+ZHJ2W2ldKTsKQEAgLTExNzYsOCArMTIxNiw4IEBACiAJCXNldF9jYXBhY2l0eShkaXNrLCBkcnYtPm5yX2Jsb2Nrcyk7CiAJCWFkZF9kaXNrKGRpc2spOwogCX0KLSAgICAgICAgaG9zdC0+dXNhZ2VfY291bnQtLTsKLSAgICAgICAgcmV0dXJuIDA7CisJaG9zdC0+dXNhZ2VfY291bnQtLTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX2J1ZmZlcnMoc3RydWN0IGJpbyAqYmlvLCBpbnQgc3RhdHVzKQpAQCAtMTE5MSw3ICsxMjMxLDYgQEAKIAkJYmlvX2VuZGlvKGJpbywgbnJfc2VjdG9ycyA8PCA5LCBzdGF0dXMgPyAwIDogLUVJTyk7CiAJCWJpbyA9IHhiaDsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgY2Npc3Nfc29mdGlycV9kb25lKHN0cnVjdCByZXF1ZXN0ICpycSkKQEAgLTEyMDksNyArMTI0OCw3IEBACiAKIAkvKiBjb21tYW5kIGRpZCBub3QgbmVlZCB0byBiZSByZXRyaWVkICovCiAJLyogdW5tYXAgdGhlIERNQSBtYXBwaW5nIGZvciBhbGwgdGhlIHNjYXR0ZXIgZ2F0aGVyIGVsZW1lbnRzICovCi0JZm9yKGk9MDsgaTxjbWQtPkhlYWRlci5TR0xpc3Q7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBjbWQtPkhlYWRlci5TR0xpc3Q7IGkrKykgewogCQl0ZW1wNjQudmFsMzIubG93ZXIgPSBjbWQtPlNHW2ldLkFkZHIubG93ZXI7CiAJCXRlbXA2NC52YWwzMi51cHBlciA9IGNtZC0+U0dbaV0uQWRkci51cHBlcjsKIAkJcGNpX3VubWFwX3BhZ2UoaC0+cGRldiwgdGVtcDY0LnZhbCwgY21kLT5TR1tpXS5MZW4sIGRkaXIpOwpAQCAtMTIxOSwxMSArMTI1OCwxMiBAQAogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgcnEpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAorCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoLT5sb2NrLCBmbGFncyk7CiAJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxLCBycS0+ZXJyb3JzKTsKLQljbWRfZnJlZShoLCBjbWQsMSk7CisJY21kX2ZyZWUoaCwgY21kLCAxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTEyMzQsOSArMTI3NCw5IEBACiAgKiB3aWxsIGFsd2F5cyBiZSBsZWZ0IHJlZ2lzdGVyZWQgd2l0aCB0aGUga2VybmVsIHNpbmNlIGl0IGlzIGFsc28gdGhlCiAgKiBjb250cm9sbGVyIG5vZGUuICBBbnkgY2hhbmdlcyB0byBkaXNrIDAgd2lsbCBzaG93IHVwIG9uIHRoZSBuZXh0CiAgKiByZWJvb3QuCi0qLworICovCiBzdGF0aWMgdm9pZCBjY2lzc191cGRhdGVfZHJpdmVfaW5mbyhpbnQgY3RsciwgaW50IGRydl9pbmRleCkKLSAgeworewogCWN0bHJfaW5mb190ICpoID0gaGJhW2N0bHJdOwogCXN0cnVjdCBnZW5kaXNrICpkaXNrOwogCVJlYWRDYXBkYXRhX3N0cnVjdCAqc2l6ZV9idWZmID0gTlVMTDsKQEAgLTEyNDYsMTMgKzEyODYsMTMgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKIAlpbnQgcmV0ID0gMDsKIAotCS8qIGlmIHRoZSBkaXNrIGFscmVhZHkgZXhpc3RzIHRoZW4gZGVyZWdpc3RlciBpdCBiZWZvcmUgcHJvY2VlZGluZyovCi0JaWYgKGgtPmRydltkcnZfaW5kZXhdLnJhaWRfbGV2ZWwgIT0gLTEpeworCS8qIGlmIHRoZSBkaXNrIGFscmVhZHkgZXhpc3RzIHRoZW4gZGVyZWdpc3RlciBpdCBiZWZvcmUgcHJvY2VlZGluZyAqLworCWlmIChoLT5kcnZbZHJ2X2luZGV4XS5yYWlkX2xldmVsICE9IC0xKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAkJaC0+ZHJ2W2Rydl9pbmRleF0uYnVzeV9jb25maWd1cmluZyA9IDE7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCQlyZXQgPSBkZXJlZ2lzdGVyX2Rpc2soaC0+Z2VuZGlza1tkcnZfaW5kZXhdLAotCQkJJmgtPmRydltkcnZfaW5kZXhdLCAwKTsKKwkJCQkgICAgICAmaC0+ZHJ2W2Rydl9pbmRleF0sIDApOwogCQloLT5kcnZbZHJ2X2luZGV4XS5idXN5X2NvbmZpZ3VyaW5nID0gMDsKIAl9CiAKQEAgLTEyNjAsMjcgKzEzMDAsMjUgQEAKIAlpZiAocmV0KQogCQlyZXR1cm47CiAKLQotCS8qIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzayBhbmQgbW9kaWZ5IHRoZSBkcml2ZXIgc3R1cmN0dXJlICovCi0Jc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoIFJlYWRDYXBkYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoc2l6ZV9idWZmID09IE5VTEwpCisJLyogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNrIGFuZCBtb2RpZnkgdGhlIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKwlzaXplX2J1ZmYgPSBrbWFsbG9jKHNpemVvZihSZWFkQ2FwZGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2l6ZV9idWZmID09IE5VTEwpCiAJCWdvdG8gbWVtX21zZzsKLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwogCWlmIChpbnFfYnVmZiA9PSBOVUxMKQogCQlnb3RvIG1lbV9tc2c7CiAKIAljY2lzc19yZWFkX2NhcGFjaXR5KGN0bHIsIGRydl9pbmRleCwgc2l6ZV9idWZmLCAxLAotCQkmdG90YWxfc2l6ZSwgJmJsb2NrX3NpemUpOworCQkJICAgICZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7CiAJY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShjdGxyLCBkcnZfaW5kZXgsIDEsIHRvdGFsX3NpemUsIGJsb2NrX3NpemUsCi0JCWlucV9idWZmLCAmaC0+ZHJ2W2Rydl9pbmRleF0pOworCQkJICAgICAgIGlucV9idWZmLCAmaC0+ZHJ2W2Rydl9pbmRleF0pOwogCiAJKytoLT5udW1fbHVuczsKIAlkaXNrID0gaC0+Z2VuZGlza1tkcnZfaW5kZXhdOwogCXNldF9jYXBhY2l0eShkaXNrLCBoLT5kcnZbZHJ2X2luZGV4XS5ucl9ibG9ja3MpOwogCi0KIAkvKiBpZiBpdCdzIHRoZSBjb250cm9sbGVyIGl0J3MgYWxyZWFkeSBhZGRlZCAqLwotCWlmIChkcnZfaW5kZXgpeworCWlmIChkcnZfaW5kZXgpIHsKIAkJZGlzay0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19jY2lzc19yZXF1ZXN0LCAmaC0+bG9jayk7CiAKIAkJLyogU2V0IHVwIHF1ZXVlIGluZm9ybWF0aW9uICovCkBAIC0xMzAwLDE3ICsxMzM4LDE3IEBACiAJCWRpc2stPnF1ZXVlLT5xdWV1ZWRhdGEgPSBoYmFbY3Rscl07CiAKIAkJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZGlzay0+cXVldWUsCi0JCQloYmFbY3Rscl0tPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUpOworCQkJCQloYmFbY3Rscl0tPmRydltkcnZfaW5kZXhdLmJsb2NrX3NpemUpOwogCiAJCWgtPmRydltkcnZfaW5kZXhdLnF1ZXVlID0gZGlzay0+cXVldWU7CiAJCWFkZF9kaXNrKGRpc2spOwogCX0KIAotZnJlZXJldDoKKyAgICAgIGZyZWVyZXQ6CiAJa2ZyZWUoc2l6ZV9idWZmKTsKIAlrZnJlZShpbnFfYnVmZik7CiAJcmV0dXJuOwotbWVtX21zZzoKKyAgICAgIG1lbV9tc2c6CiAJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CiAJZ290byBmcmVlcmV0OwogfQpAQCAtMTMyMCwxMyArMTM1OCwxMyBAQAogICogd2hlcmUgbmV3IGRyaXZlcyB3aWxsIGJlIGFkZGVkLiAgSWYgdGhlIGluZGV4IHRvIGJlIHJldHVybmVkIGlzIGdyZWF0ZXIKICAqIHRoYW4gdGhlIGhpZ2hlc3RfbHVuIGluZGV4IGZvciB0aGUgY29udHJvbGxlciB0aGVuIGhpZ2hlc3RfbHVuIGlzIHNldAogICogdG8gdGhpcyBuZXcgaW5kZXguICBJZiB0aGVyZSBhcmUgbm8gYXZhaWxhYmxlIGluZGV4ZXMgdGhlbiAtMSBpcyByZXR1cm5lZC4KLSovCisgKi8KIHN0YXRpYyBpbnQgY2Npc3NfZmluZF9mcmVlX2RyaXZlX2luZGV4KGludCBjdGxyKQogewogCWludCBpOwogCi0JZm9yIChpPTA7IGkgPCBDSVNTX01BWF9MVU47IGkrKyl7Ci0JCWlmIChoYmFbY3Rscl0tPmRydltpXS5yYWlkX2xldmVsID09IC0xKXsKKwlmb3IgKGkgPSAwOyBpIDwgQ0lTU19NQVhfTFVOOyBpKyspIHsKKwkJaWYgKGhiYVtjdGxyXS0+ZHJ2W2ldLnJhaWRfbGV2ZWwgPT0gLTEpIHsKIAkJCWlmIChpID4gaGJhW2N0bHJdLT5oaWdoZXN0X2x1bikKIAkJCQloYmFbY3Rscl0tPmhpZ2hlc3RfbHVuID0gaTsKIAkJCXJldHVybiBpOwpAQCAtMTMzNiw3ICsxMzc0LDcgQEAKIH0KIAogLyogVGhpcyBmdW5jdGlvbiB3aWxsIGFkZCBhbmQgcmVtb3ZlIGxvZ2ljYWwgZHJpdmVzIGZyb20gdGhlIExvZ2ljYWwKLSAqIGRyaXZlIGFycmF5IG9mIHRoZSBjb250cm9sbGVyIGFuZCBtYWludGFpbiBwZXJzaXN0YW5jeSBvZiBvcmRlcmluZworICogZHJpdmUgYXJyYXkgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIG1haW50YWluIHBlcnNpc3RlbmN5IG9mIG9yZGVyaW5nCiAgKiBzbyB0aGF0IG1vdW50IHBvaW50cyBhcmUgcHJlc2VydmVkIHVudGlsIHRoZSBuZXh0IHJlYm9vdC4gIFRoaXMgYWxsb3dzCiAgKiBmb3IgdGhlIHJlbW92YWwgb2YgbG9naWNhbCBkcml2ZXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZHJpdmUgYXJyYXkKICAqIHdpdGhvdXQgYSByZS1vcmRlcmluZyBvZiB0aG9zZSBkcml2ZXMuCkBAIC0xMzQ0LDcgKzEzODIsNyBAQAogICogaAkJPSBUaGUgY29udHJvbGxlciB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb25zIG9uCiAgKiBkZWxfZGlzawk9IFRoZSBkaXNrIHRvIHJlbW92ZSBpZiBzcGVjaWZpZWQuICBJZiB0aGUgdmFsdWUgZ2l2ZW4KICAqCQkgIGlzIE5VTEwgdGhlbiBubyBkaXNrIGlzIHJlbW92ZWQuCi0qLworICovCiBzdGF0aWMgaW50IHJlYnVpbGRfbHVuX3RhYmxlKGN0bHJfaW5mb190ICpoLCBzdHJ1Y3QgZ2VuZGlzayAqZGVsX2Rpc2spCiB7CiAJaW50IGN0bHIgPSBoLT5jdGxyOwpAQCAtMTM2MSwxMiArMTM5OSwxMiBAQAogCiAJLyogU2V0IGJ1c3lfY29uZmlndXJpbmcgZmxhZyBmb3IgdGhpcyBvcGVyYXRpb24gKi8KIAlzcGluX2xvY2tfaXJxc2F2ZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7Ci0JaWYgKGgtPm51bV9sdW5zID49IENJU1NfTUFYX0xVTil7CisJaWYgKGgtPm51bV9sdW5zID49IENJU1NfTUFYX0xVTikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGgtPmJ1c3lfY29uZmlndXJpbmcpeworCWlmIChoLT5idXN5X2NvbmZpZ3VyaW5nKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoQ0NJU1NfTE9DSyhoLT5jdGxyKSwgZmxhZ3MpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KQEAgLTEzNzYsNyArMTQxNCw3IEBACiAJICogYW5kIHVwZGF0ZSB0aGUgbG9naWNhbCBkcml2ZSB0YWJsZS4gIElmIGl0IGlzIG5vdCBOVUxMIHRoZW4KIAkgKiB3ZSB3aWxsIGNoZWNrIGlmIHRoZSBkaXNrIGlzIGluIHVzZSBvciBub3QuCiAJICovCi0JaWYgKGRlbF9kaXNrICE9IE5VTEwpeworCWlmIChkZWxfZGlzayAhPSBOVUxMKSB7CiAJCWRydiA9IGdldF9kcnYoZGVsX2Rpc2spOwogCQlkcnYtPmJ1c3lfY29uZmlndXJpbmcgPSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKQEAgLTEzOTQsNjEgKzE0MzIsNjcgQEAKIAkJCWdvdG8gbWVtX21zZzsKIAogCQlyZXR1cm5fY29kZSA9IHNlbmRjbWRfd2l0aGlycShDSVNTX1JFUE9SVF9MT0csIGN0bHIsIGxkX2J1ZmYsCi0JCQkJc2l6ZW9mKFJlcG9ydEx1bkRhdGFfc3RydWN0KSwgMCwgMCwgMCwKLQkJCQlUWVBFX0NNRCk7CisJCQkJCSAgICAgIHNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksIDAsCisJCQkJCSAgICAgIDAsIDAsIFRZUEVfQ01EKTsKIAotCQlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spewotCQkJbGlzdGxlbmd0aCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMF0pKSA8PCAyNDsKLQkJCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkgPDwgMTY7Ci0JCQlsaXN0bGVuZ3RoIHw9ICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFsyXSkpIDw8IDg7Ci0JCQlsaXN0bGVuZ3RoIHw9IDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzNdKTsKLQkJfSBlbHNleyAvKiByZWFkaW5nIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgZmFpbGVkICovCisJCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgeworCQkJbGlzdGxlbmd0aCB8PQorCQkJICAgICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSkpCisJCQkgICAgPDwgMjQ7CisJCQlsaXN0bGVuZ3RoIHw9CisJCQkgICAgKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkKKwkJCSAgICA8PCAxNjsKKwkJCWxpc3RsZW5ndGggfD0KKwkJCSAgICAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMl0pKQorCQkJICAgIDw8IDg7CisJCQlsaXN0bGVuZ3RoIHw9CisJCQkgICAgMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbM10pOworCQl9IGVsc2UgewkvKiByZWFkaW5nIG51bWJlciBvZiBsb2dpY2FsIHZvbHVtZXMgZmFpbGVkICovCiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogcmVwb3J0IGxvZ2ljYWwgdm9sdW1lIgotCQkJCSIgY29tbWFuZCBmYWlsZWRcbiIpOworCQkJICAgICAgICIgY29tbWFuZCBmYWlsZWRcbiIpOwogCQkJbGlzdGxlbmd0aCA9IDA7CiAJCQlnb3RvIGZyZWVyZXQ7CiAJCX0KIAogCQludW1fbHVucyA9IGxpc3RsZW5ndGggLyA4OwkvKiA4IGJ5dGVzIHBlciBlbnRyeSAqLwotCQlpZiAobnVtX2x1bnMgPiBDSVNTX01BWF9MVU4peworCQlpZiAobnVtX2x1bnMgPiBDSVNTX01BWF9MVU4pIHsKIAkJCW51bV9sdW5zID0gQ0lTU19NQVhfTFVOOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG1vcmUgbHVucyBjb25maWd1cmVkIgotCQkJCSIgb24gY29udHJvbGxlciB0aGFuIGNhbiBiZSBoYW5kbGVkIGJ5IgotCQkJCSIgdGhpcyBkcml2ZXIuXG4iKTsKKwkJCSAgICAgICAiIG9uIGNvbnRyb2xsZXIgdGhhbiBjYW4gYmUgaGFuZGxlZCBieSIKKwkJCSAgICAgICAiIHRoaXMgZHJpdmVyLlxuIik7CiAJCX0KIAogCQkvKiBDb21wYXJlIGNvbnRyb2xsZXIgZHJpdmUgYXJyYXkgdG8gZHJpdmVycyBkcml2ZSBhcnJheS4KLQkgCSogQ2hlY2sgZm9yIHVwZGF0ZXMgaW4gdGhlIGRyaXZlIGluZm9ybWF0aW9uIGFuZCBhbnkgbmV3IGRyaXZlcwotCSAJKiBvbiB0aGUgY29udHJvbGxlci4KLQkgCSovCi0JCWZvciAoaT0wOyBpIDwgbnVtX2x1bnM7IGkrKyl7CisJCSAqIENoZWNrIGZvciB1cGRhdGVzIGluIHRoZSBkcml2ZSBpbmZvcm1hdGlvbiBhbmQgYW55IG5ldyBkcml2ZXMKKwkJICogb24gdGhlIGNvbnRyb2xsZXIuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2x1bnM7IGkrKykgewogCQkJaW50IGo7CiAKIAkJCWRydl9mb3VuZCA9IDA7CiAKLQkgIAkJbHVuaWQgPSAoMHhmZiAmCi0JCQkJKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkgPDwgMjQ7Ci0gICAgICAgIAkJbHVuaWQgfD0gKDB4ZmYgJgotCQkJCSh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsyXSkpIDw8IDE2OwotICAgICAgICAJCWx1bmlkIHw9ICgweGZmICYKLQkJCQkodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMV0pKSA8PCA4OwotICAgICAgICAJCWx1bmlkIHw9IDB4ZmYgJgotCQkJCSh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVswXSk7CisJCQlsdW5pZCA9ICgweGZmICYKKwkJCQkgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkgPDwgMjQ7CisJCQlsdW5pZCB8PSAoMHhmZiAmCisJCQkJICAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMl0pKSA8PCAxNjsKKwkJCWx1bmlkIHw9ICgweGZmICYKKwkJCQkgICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpIDw8IDg7CisJCQlsdW5pZCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzBdKTsKIAogCQkJLyogRmluZCBpZiB0aGUgTFVOIGlzIGFscmVhZHkgaW4gdGhlIGRyaXZlIGFycmF5CiAJCQkgKiBvZiB0aGUgY29udHJvbGxlci4gIElmIHNvIHRoZW4gdXBkYXRlIGl0cyBpbmZvCiAJCQkgKiBpZiBub3QgaXMgdXNlLiAgSWYgaXQgZG9lcyBub3QgZXhpc3QgdGhlbiBmaW5kCiAJCQkgKiB0aGUgZmlyc3QgZnJlZSBpbmRleCBhbmQgYWRkIGl0LgotCQkJKi8KLQkJCWZvciAoaj0wOyBqIDw9IGgtPmhpZ2hlc3RfbHVuOyBqKyspewotCQkJCWlmIChoLT5kcnZbal0uTHVuSUQgPT0gbHVuaWQpeworCQkJICovCisJCQlmb3IgKGogPSAwOyBqIDw9IGgtPmhpZ2hlc3RfbHVuOyBqKyspIHsKKwkJCQlpZiAoaC0+ZHJ2W2pdLkx1bklEID09IGx1bmlkKSB7CiAJCQkJCWRydl9pbmRleCA9IGo7CiAJCQkJCWRydl9mb3VuZCA9IDE7CiAJCQkJfQogCQkJfQogCiAJCQkvKiBjaGVjayBpZiB0aGUgZHJpdmUgd2FzIGZvdW5kIGFscmVhZHkgaW4gdGhlIGFycmF5ICovCi0JCQlpZiAoIWRydl9mb3VuZCl7CisJCQlpZiAoIWRydl9mb3VuZCkgewogCQkJCWRydl9pbmRleCA9IGNjaXNzX2ZpbmRfZnJlZV9kcml2ZV9pbmRleChjdGxyKTsKIAkJCQlpZiAoZHJ2X2luZGV4ID09IC0xKQogCQkJCQlnb3RvIGZyZWVyZXQ7CkBAIC0xNDU2LDE4ICsxNTAwLDE4IEBACiAJCQl9CiAJCQloLT5kcnZbZHJ2X2luZGV4XS5MdW5JRCA9IGx1bmlkOwogCQkJY2Npc3NfdXBkYXRlX2RyaXZlX2luZm8oY3RsciwgZHJ2X2luZGV4KTsKLQkJfSAvKiBlbmQgZm9yICovCi0JfSAvKiBlbmQgZWxzZSAqLworCQl9CQkvKiBlbmQgZm9yICovCisJfQkJCS8qIGVuZCBlbHNlICovCiAKLWZyZWVyZXQ6CisgICAgICBmcmVlcmV0OgogCWtmcmVlKGxkX2J1ZmYpOwogCWgtPmJ1c3lfY29uZmlndXJpbmcgPSAwOwogCS8qIFdlIHJldHVybiAtMSBoZXJlIHRvIHRlbGwgdGhlIEFDVSB0aGF0IHdlIGhhdmUgcmVnaXN0ZXJlZC91cGRhdGVkCiAJICogYWxsIG9mIHRoZSBkcml2ZXMgdGhhdCB3ZSBjYW4gYW5kIHRvIGtlZXAgaXQgZnJvbSBjYWxsaW5nIHVzCiAJICogYWRkaXRpb25hbCB0aW1lcy4KLQkqLworCSAqLwogCXJldHVybiAtMTsKLW1lbV9tc2c6CisgICAgICBtZW1fbXNnOgogCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCWdvdG8gZnJlZXJldDsKIH0KQEAgLTE0ODMsNyArMTUyNyw3IEBACiAgKiBjbGVhcl9hbGwgPSBUaGlzIGZsYWcgZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZGlzayBpbmZvcm1hdGlvbgogICogICAgICAgICAgICAgaXMgZ29pbmcgdG8gYmUgY29tcGxldGVseSBjbGVhcmVkIG91dCBhbmQgdGhlIGhpZ2hlc3RfbHVuCiAgKiAgICAgICAgICAgICByZXNldC4gIFNvbWV0aW1lcyB3ZSB3YW50IHRvIGNsZWFyIG91dCBpbmZvcm1hdGlvbiBhYm91dAotICogICAgICAgICAgICAgdGhlIGRpc2sgaW4gcHJlcGVyYXRpb24gZm9yIHJlLWFkZGluZyBpdC4gIEluIHRoaXMgY2FzZQorICogICAgICAgICAgICAgdGhlIGRpc2sgaW4gcHJlcGFyYXRpb24gZm9yIHJlLWFkZGluZyBpdC4gIEluIHRoaXMgY2FzZQogICogICAgICAgICAgICAgdGhlIGhpZ2hlc3RfbHVuIHNob3VsZCBiZSBsZWZ0IHVuY2hhbmdlZCBhbmQgdGhlIEx1bklECiAgKiAgICAgICAgICAgICBzaG91bGQgbm90IGJlIGNsZWFyZWQuCiAqLwpAQCAtMTQ5NiwxOSArMTU0MCwxNyBAQAogCQlyZXR1cm4gLUVQRVJNOwogCiAJLyogbWFrZSBzdXJlIGxvZ2ljYWwgdm9sdW1lIGlzIE5PVCBpcyB1c2UgKi8KLQlpZihjbGVhcl9hbGwgfHwgKGgtPmdlbmRpc2tbMF0gPT0gZGlzaykpIHsKLQlpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLQl9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgCWlmKCBkcnYtPnVzYWdlX2NvdW50ID4gMCApCi0gICAgICAgICAgICAgICAgCXJldHVybiAtRUJVU1k7CisJaWYgKGNsZWFyX2FsbCB8fCAoaC0+Z2VuZGlza1swXSA9PSBkaXNrKSkgeworCQlpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDEpCisJCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSBpZiAoZHJ2LT51c2FnZV9jb3VudCA+IDApCisJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBpbnZhbGlkYXRlIHRoZSBkZXZpY2VzIGFuZCBkZXJlZ2lzdGVyIHRoZSBkaXNrLiAgSWYgaXQgaXMgZGlzawogCSAqIHplcm8gZG8gbm90IGRlcmVnaXN0ZXIgaXQgYnV0IGp1c3QgemVybyBvdXQgaXQncyB2YWx1ZXMuICBUaGlzCiAJICogYWxsb3dzIHVzIHRvIGRlbGV0ZSBkaXNrIHplcm8gYnV0IGtlZXAgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJlZC4KLQkqLwotCWlmIChoLT5nZW5kaXNrWzBdICE9IGRpc2speworCSAqLworCWlmIChoLT5nZW5kaXNrWzBdICE9IGRpc2spIHsKIAkJaWYgKGRpc2spIHsKIAkJCXJlcXVlc3RfcXVldWVfdCAqcSA9IGRpc2stPnF1ZXVlOwogCQkJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfVVApCkBAIC0xNTMwLDkxICsxNTcyLDkwIEBACiAJZHJ2LT5yYWlkX2xldmVsID0gLTE7CS8qIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBmbGFnIHZhcmlhYmxlIHRvCiAJCQkJICogaW5kaWNhdGUgdGhhdCB0aGlzIGVsZW1lbnQgb2YgdGhlIGRyaXZlCiAJCQkJICogYXJyYXkgaXMgZnJlZS4KLQkJCQkqLworCQkJCSAqLwogCi0JaWYgKGNsZWFyX2FsbCl7Ci0JLyogY2hlY2sgdG8gc2VlIGlmIGl0IHdhcyB0aGUgbGFzdCBkaXNrICovCi0JaWYgKGRydiA9PSBoLT5kcnYgKyBoLT5oaWdoZXN0X2x1bikgewotCQkvKiBpZiBzbywgZmluZCB0aGUgbmV3IGhpZ2h0ZXN0IGx1biAqLwotCQlpbnQgaSwgbmV3aGlnaGVzdCA9LTE7Ci0JCWZvcihpPTA7IGk8aC0+aGlnaGVzdF9sdW47IGkrKykgewotCQkJLyogaWYgdGhlIGRpc2sgaGFzIHNpemUgPiAwLCBpdCBpcyBhdmFpbGFibGUgKi8KKwlpZiAoY2xlYXJfYWxsKSB7CisJCS8qIGNoZWNrIHRvIHNlZSBpZiBpdCB3YXMgdGhlIGxhc3QgZGlzayAqLworCQlpZiAoZHJ2ID09IGgtPmRydiArIGgtPmhpZ2hlc3RfbHVuKSB7CisJCQkvKiBpZiBzbywgZmluZCB0aGUgbmV3IGhpZ2h0ZXN0IGx1biAqLworCQkJaW50IGksIG5ld2hpZ2hlc3QgPSAtMTsKKwkJCWZvciAoaSA9IDA7IGkgPCBoLT5oaWdoZXN0X2x1bjsgaSsrKSB7CisJCQkJLyogaWYgdGhlIGRpc2sgaGFzIHNpemUgPiAwLCBpdCBpcyBhdmFpbGFibGUgKi8KIAkJCQlpZiAoaC0+ZHJ2W2ldLmhlYWRzKQotCQkJCW5ld2hpZ2hlc3QgPSBpOworCQkJCQluZXdoaWdoZXN0ID0gaTsKKwkJCX0KKwkJCWgtPmhpZ2hlc3RfbHVuID0gbmV3aGlnaGVzdDsKIAkJfQotCQloLT5oaWdoZXN0X2x1biA9IG5ld2hpZ2hlc3Q7Ci0JfQogCi0JZHJ2LT5MdW5JRCA9IDA7CisJCWRydi0+THVuSUQgPSAwOwogCX0KLQlyZXR1cm4oMCk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmlsbF9jbWQoQ29tbWFuZExpc3Rfc3RydWN0ICpjLCBfX3U4IGNtZCwgaW50IGN0bHIsIHZvaWQgKmJ1ZmYsCi0Jc2l6ZV90IHNpemUsCi0JdW5zaWduZWQgaW50IHVzZV91bml0X251bSwgLyogMDogYWRkcmVzcyB0aGUgY29udHJvbGxlciwKLQkJCQkgICAgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAotCQkJCSAgICAgIDI6IHBlcmlwaCBkZXZpY2UgYWRkcmVzcyBpcyBzY3NpM2FkZHIgKi8KLQl1bnNpZ25lZCBpbnQgbG9nX3VuaXQsIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JaW50IGNtZF90eXBlKQorc3RhdGljIGludCBmaWxsX2NtZChDb21tYW5kTGlzdF9zdHJ1Y3QgKmMsIF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCS8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCisJCQkJCQkJCQkJCQkJCQkgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAorCQkJCQkJCQkJCQkJCQkJICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLworCQkgICAgdW5zaWduZWQgaW50IGxvZ191bml0LCBfX3U4IHBhZ2VfY29kZSwKKwkJICAgIHVuc2lnbmVkIGNoYXIgKnNjc2kzYWRkciwgaW50IGNtZF90eXBlKQogewotCWN0bHJfaW5mb190ICpoPSBoYmFbY3Rscl07CisJY3Rscl9pbmZvX3QgKmggPSBoYmFbY3Rscl07CiAJdTY0Yml0IGJ1ZmZfZG1hX2hhbmRsZTsKIAlpbnQgc3RhdHVzID0gSU9fT0s7CiAKIAljLT5jbWRfdHlwZSA9IENNRF9JT0NUTF9QRU5EOwogCWMtPkhlYWRlci5SZXBseVF1ZXVlID0gMDsKLQlpZiggYnVmZiAhPSBOVUxMKSB7CisJaWYgKGJ1ZmYgIT0gTlVMTCkgewogCQljLT5IZWFkZXIuU0dMaXN0ID0gMTsKLQkJYy0+SGVhZGVyLlNHVG90YWw9IDE7CisJCWMtPkhlYWRlci5TR1RvdGFsID0gMTsKIAl9IGVsc2UgewogCQljLT5IZWFkZXIuU0dMaXN0ID0gMDsKLSAgICAgICAgICAgICAgICBjLT5IZWFkZXIuU0dUb3RhbD0gMDsKKwkJYy0+SGVhZGVyLlNHVG90YWwgPSAwOwogCX0KIAljLT5IZWFkZXIuVGFnLmxvd2VyID0gYy0+YnVzYWRkcjsKIAogCWMtPlJlcXVlc3QuVHlwZS5UeXBlID0gY21kX3R5cGU7CiAJaWYgKGNtZF90eXBlID09IFRZUEVfQ01EKSB7Ci0JCXN3aXRjaChjbWQpIHsKLQkJY2FzZSAgQ0lTU19JTlFVSVJZOgorCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENJU1NfSU5RVUlSWToKIAkJCS8qIElmIHRoZSBsb2dpY2FsIHVuaXQgbnVtYmVyIGlzIDAgdGhlbiwgdGhpcyBpcyBnb2luZwotCQkJdG8gY29udHJvbGxlciBzbyBJdCdzIGEgcGh5c2ljYWwgY29tbWFuZAotCQkJbW9kZSA9IDAgdGFyZ2V0ID0gMC4gIFNvIHdlIGhhdmUgbm90aGluZyB0byB3cml0ZS4KLQkJCW90aGVyd2lzZSwgaWYgdXNlX3VuaXRfbnVtID09IDEsCi0JCQltb2RlID0gMSh2b2x1bWUgc2V0IGFkZHJlc3NpbmcpIHRhcmdldCA9IExVTklECi0JCQlvdGhlcndpc2UsIGlmIHVzZV91bml0X251bSA9PSAyLAotCQkJbW9kZSA9IDAocGVyaXBoIGRldiBhZGRyKSB0YXJnZXQgPSBzY3NpM2FkZHIgKi8KKwkJCSAgIHRvIGNvbnRyb2xsZXIgc28gSXQncyBhIHBoeXNpY2FsIGNvbW1hbmQKKwkJCSAgIG1vZGUgPSAwIHRhcmdldCA9IDAuICBTbyB3ZSBoYXZlIG5vdGhpbmcgdG8gd3JpdGUuCisJCQkgICBvdGhlcndpc2UsIGlmIHVzZV91bml0X251bSA9PSAxLAorCQkJICAgbW9kZSA9IDEodm9sdW1lIHNldCBhZGRyZXNzaW5nKSB0YXJnZXQgPSBMVU5JRAorCQkJICAgb3RoZXJ3aXNlLCBpZiB1c2VfdW5pdF9udW0gPT0gMiwKKwkJCSAgIG1vZGUgPSAwKHBlcmlwaCBkZXYgYWRkcikgdGFyZ2V0ID0gc2NzaTNhZGRyICovCiAJCQlpZiAodXNlX3VuaXRfbnVtID09IDEpIHsKLQkJCQljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZD0KLQkJCQkJaC0+ZHJ2W2xvZ191bml0XS5MdW5JRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIAljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Nb2RlID0gMTsKKwkJCQljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZCA9CisJCQkJICAgIGgtPmRydltsb2dfdW5pdF0uTHVuSUQ7CisJCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDE7CiAJCQl9IGVsc2UgaWYgKHVzZV91bml0X251bSA9PSAyKSB7Ci0JCQkJbWVtY3B5KGMtPkhlYWRlci5MVU4uTHVuQWRkckJ5dGVzLHNjc2kzYWRkciw4KTsKKwkJCQltZW1jcHkoYy0+SGVhZGVyLkxVTi5MdW5BZGRyQnl0ZXMsIHNjc2kzYWRkciwKKwkJCQkgICAgICAgOCk7CiAJCQkJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDA7CiAJCQl9CiAJCQkvKiBhcmUgd2UgdHJ5aW5nIHRvIHJlYWQgYSB2aXRhbCBwcm9kdWN0IHBhZ2UgKi8KLQkJCWlmKHBhZ2VfY29kZSAhPSAwKSB7CisJCQlpZiAocGFnZV9jb2RlICE9IDApIHsKIAkJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDE7CiAJCQkJYy0+UmVxdWVzdC5DREJbMl0gPSBwYWdlX2NvZGU7CiAJCQl9CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7Ci0JCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7ICAKKwkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1JFQUQ7CiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwotCQkJYy0+UmVxdWVzdC5DREJbMF0gPSAgQ0lTU19JTlFVSVJZOwotCQkJYy0+UmVxdWVzdC5DREJbNF0gPSBzaXplICAmIDB4RkY7ICAKLQkJYnJlYWs7CisJCQljLT5SZXF1ZXN0LkNEQlswXSA9IENJU1NfSU5RVUlSWTsKKwkJCWMtPlJlcXVlc3QuQ0RCWzRdID0gc2l6ZSAmIDB4RkY7CisJCQlicmVhazsKIAkJY2FzZSBDSVNTX1JFUE9SVF9MT0c6CiAJCWNhc2UgQ0lTU19SRVBPUlRfUEhZUzoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRhbGtpbmcgdG8gY29udHJvbGxlciBzbyBJdCdzIGEgcGh5c2ljYWwgY29tbWFuZAorCQkJLyogVGFsa2luZyB0byBjb250cm9sbGVyIHNvIEl0J3MgYSBwaHlzaWNhbCBjb21tYW5kCiAJCQkgICBtb2RlID0gMDAgdGFyZ2V0ID0gMC4gIE5vdGhpbmcgdG8gd3JpdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLworCQkJICovCiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDEyOwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwogCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsKLQkJCWMtPlJlcXVlc3QuQ0RCWzZdID0gKHNpemUgPj4gMjQpICYgMHhGRjsgIC8vTVNCCisJCQljLT5SZXF1ZXN0LkNEQls2XSA9IChzaXplID4+IDI0KSAmIDB4RkY7CS8vTVNCCiAJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDE2KSAmIDB4RkY7CiAJCQljLT5SZXF1ZXN0LkNEQls4XSA9IChzaXplID4+IDgpICYgMHhGRjsKIAkJCWMtPlJlcXVlc3QuQ0RCWzldID0gc2l6ZSAmIDB4RkY7CkBAIC0xNjI4LDcgKzE2NjksNyBAQAogCQkJYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IFhGRVJfUkVBRDsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsKLQkJYnJlYWs7CisJCQlicmVhazsKIAkJY2FzZSBDQ0lTU19DQUNIRV9GTFVTSDoKIAkJCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTI7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CkBAIC0xNjM2LDMyICsxNjc3LDMyIEBACiAJCQljLT5SZXF1ZXN0LlRpbWVvdXQgPSAwOwogCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBCTUlDX1dSSVRFOwogCQkJYy0+UmVxdWVzdC5DREJbNl0gPSBCTUlDX0NBQ0hFX0ZMVVNIOwotCQlicmVhazsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJjY2lzcyVkOiAgVW5rbm93biBDb21tYW5kIDB4JWNcbiIsIGN0bHIsIGNtZCk7Ci0JCQlyZXR1cm4oSU9fRVJST1IpOworCQkJICAgICAgICJjY2lzcyVkOiAgVW5rbm93biBDb21tYW5kIDB4JWNcbiIsIGN0bHIsIGNtZCk7CisJCQlyZXR1cm4gSU9fRVJST1I7CiAJCX0KIAl9IGVsc2UgaWYgKGNtZF90eXBlID09IFRZUEVfTVNHKSB7CiAJCXN3aXRjaCAoY21kKSB7Ci0JCWNhc2UgMDogLyogQUJPUlQgbWVzc2FnZSAqLworCQljYXNlIDA6CS8qIEFCT1JUIG1lc3NhZ2UgKi8KIAkJCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTI7CiAJCQljLT5SZXF1ZXN0LlR5cGUuQXR0cmlidXRlID0gQVRUUl9TSU1QTEU7CiAJCQljLT5SZXF1ZXN0LlR5cGUuRGlyZWN0aW9uID0gWEZFUl9XUklURTsKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7Ci0JCQljLT5SZXF1ZXN0LkNEQlswXSA9IGNtZDsgLyogYWJvcnQgKi8KLQkJCWMtPlJlcXVlc3QuQ0RCWzFdID0gMDsgICAvKiBhYm9ydCBhIGNvbW1hbmQgKi8KKwkJCWMtPlJlcXVlc3QuQ0RCWzBdID0gY21kOwkvKiBhYm9ydCAqLworCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAwOwkvKiBhYm9ydCBhIGNvbW1hbmQgKi8KIAkJCS8qIGJ1ZmYgY29udGFpbnMgdGhlIHRhZyBvZiB0aGUgY29tbWFuZCB0byBhYm9ydCAqLwogCQkJbWVtY3B5KCZjLT5SZXF1ZXN0LkNEQls0XSwgYnVmZiwgOCk7CiAJCQlicmVhazsKLQkJY2FzZSAxOiAvKiBSRVNFVCBtZXNzYWdlICovCisJCWNhc2UgMToJLyogUkVTRVQgbWVzc2FnZSAqLwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxMjsKIAkJCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsKIAkJCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPSBYRkVSX1dSSVRFOwogCQkJYy0+UmVxdWVzdC5UaW1lb3V0ID0gMDsKIAkJCW1lbXNldCgmYy0+UmVxdWVzdC5DREJbMF0sIDAsIHNpemVvZihjLT5SZXF1ZXN0LkNEQikpOwotCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBjbWQ7ICAvKiByZXNldCAqLwotCQkJYy0+UmVxdWVzdC5DREJbMV0gPSAweDA0OyAvKiByZXNldCBhIExVTiAqLworCQkJYy0+UmVxdWVzdC5DREJbMF0gPSBjbWQ7CS8qIHJlc2V0ICovCisJCQljLT5SZXF1ZXN0LkNEQlsxXSA9IDB4MDQ7CS8qIHJlc2V0IGEgTFVOICovCiAJCWNhc2UgMzoJLyogTm8tT3AgbWVzc2FnZSAqLwogCQkJYy0+UmVxdWVzdC5DREJMZW4gPSAxOwogCQkJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOwpAQCAtMTY3MSwxNjggKzE3MTIsMTY0IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkiY2Npc3MlZDogdW5rbm93biBtZXNzYWdlIHR5cGUgJWRcbiIsCi0JCQkJY3RsciwgY21kKTsKKwkJCSAgICAgICAiY2Npc3MlZDogdW5rbm93biBtZXNzYWdlIHR5cGUgJWRcbiIsIGN0bHIsIGNtZCk7CiAJCQlyZXR1cm4gSU9fRVJST1I7CiAJCX0KIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkiY2Npc3MlZDogdW5rbm93biBjb21tYW5kIHR5cGUgJWRcbiIsIGN0bHIsIGNtZF90eXBlKTsKKwkJICAgICAgICJjY2lzcyVkOiB1bmtub3duIGNvbW1hbmQgdHlwZSAlZFxuIiwgY3RsciwgY21kX3R5cGUpOwogCQlyZXR1cm4gSU9fRVJST1I7CiAJfQogCS8qIEZpbGwgaW4gdGhlIHNjYXR0ZXIgZ2F0aGVyIGluZm9ybWF0aW9uICovCiAJaWYgKHNpemUgPiAwKSB7CiAJCWJ1ZmZfZG1hX2hhbmRsZS52YWwgPSAoX191NjQpIHBjaV9tYXBfc2luZ2xlKGgtPnBkZXYsCi0JCQlidWZmLCBzaXplLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJCQkJCSAgICAgYnVmZiwgc2l6ZSwKKwkJCQkJCQkgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CiAJCWMtPlNHWzBdLkFkZHIubG93ZXIgPSBidWZmX2RtYV9oYW5kbGUudmFsMzIubG93ZXI7CiAJCWMtPlNHWzBdLkFkZHIudXBwZXIgPSBidWZmX2RtYV9oYW5kbGUudmFsMzIudXBwZXI7CiAJCWMtPlNHWzBdLkxlbiA9IHNpemU7Ci0JCWMtPlNHWzBdLkV4dCA9IDA7ICAvKiB3ZSBhcmUgbm90IGNoYWluaW5nICovCisJCWMtPlNHWzBdLkV4dCA9IDA7CS8qIHdlIGFyZSBub3QgY2hhaW5pbmcgKi8KIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KLXN0YXRpYyBpbnQgc2VuZGNtZF93aXRoaXJxKF9fdTgJY21kLAotCWludAljdGxyLAotCXZvaWQJKmJ1ZmYsCi0Jc2l6ZV90CXNpemUsCi0JdW5zaWduZWQgaW50IHVzZV91bml0X251bSwKLQl1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCi0JX191OAlwYWdlX2NvZGUsCi0JaW50IGNtZF90eXBlKQorCitzdGF0aWMgaW50IHNlbmRjbWRfd2l0aGlycShfX3U4IGNtZCwKKwkJCSAgIGludCBjdGxyLAorCQkJICAgdm9pZCAqYnVmZiwKKwkJCSAgIHNpemVfdCBzaXplLAorCQkJICAgdW5zaWduZWQgaW50IHVzZV91bml0X251bSwKKwkJCSAgIHVuc2lnbmVkIGludCBsb2dfdW5pdCwgX191OCBwYWdlX2NvZGUsIGludCBjbWRfdHlwZSkKIHsKIAljdGxyX2luZm9fdCAqaCA9IGhiYVtjdGxyXTsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JdTY0Yml0CWJ1ZmZfZG1hX2hhbmRsZTsKKwl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHVybl9zdGF0dXM7CiAJREVDTEFSRV9DT01QTEVUSU9OKHdhaXQpOwotCQotCWlmICgoYyA9IGNtZF9hbGxvYyhoICwgMCkpID09IE5VTEwpCisKKwlpZiAoKGMgPSBjbWRfYWxsb2MoaCwgMCkpID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldHVybl9zdGF0dXMgPSBmaWxsX2NtZChjLCBjbWQsIGN0bHIsIGJ1ZmYsIHNpemUsIHVzZV91bml0X251bSwKLQkJbG9nX3VuaXQsIHBhZ2VfY29kZSwgTlVMTCwgY21kX3R5cGUpOworCQkJCSBsb2dfdW5pdCwgcGFnZV9jb2RlLCBOVUxMLCBjbWRfdHlwZSk7CiAJaWYgKHJldHVybl9zdGF0dXMgIT0gSU9fT0spIHsKIAkJY21kX2ZyZWUoaCwgYywgMCk7CiAJCXJldHVybiByZXR1cm5fc3RhdHVzOwogCX0KLXJlc2VuZF9jbWQyOgorICAgICAgcmVzZW5kX2NtZDI6CiAJYy0+d2FpdGluZyA9ICZ3YWl0OwotCQorCiAJLyogUHV0IHRoZSByZXF1ZXN0IG9uIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBhbmQgc2VuZCBpdCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAlhZGRRKCZoLT5yZXFRLCBjKTsKIAloLT5RZGVwdGgrKzsKIAlzdGFydF9pbyhoKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKLQkKKwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOwogCi0JaWYoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgIT0gMCkgCi0JeyAvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8gCi0JCXN3aXRjaChjLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cykKLQkJewotCQkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyAiCi0JCQkJCSIgY29tcGxldGVkIHdpdGggZXJyb3JzXG4iLCBjKTsKLQkJCQlpZiggYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpCi0gICAgICAgICAgICAgICAgCQl7Ci0gICAgICAgICAgICAgICAgICAgIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgotCQkJCQkiaGFzIFNDU0kgU3RhdHVzID0gJXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAJCQljLCAgCi0JCQkJCQljLT5lcnJfaW5mby0+U2NzaVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgCQl9CisJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzICE9IDApIHsJLyogYW4gZXJyb3IgaGFzIG9jY3VycmVkICovCisJCXN3aXRjaCAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpIHsKKwkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKKwkJCSAgICAgICAiIGNvbXBsZXRlZCB3aXRoIGVycm9yc1xuIiwgYyk7CisJCQlpZiAoYy0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwICIKKwkJCQkgICAgICAgImhhcyBTQ1NJIFN0YXR1cyA9ICV4XG4iLAorCQkJCSAgICAgICBjLCBjLT5lcnJfaW5mby0+U2NzaVN0YXR1cyk7CisJCQl9CiAKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKLQkJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKKwkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKKwkJY2FzZSBDTURfREFUQV9PVkVSUlVOOgogCQkJLyogZXhwZWN0ZWQgZm9yIGlucXVpcmUgYW5kIHJlcG9ydCBsdW4gY29tbWFuZHMgKi8KIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfSU5WQUxJRDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogQ21kICVwIGlzICIKLQkJCQkJInJlcG9ydGVkIGludmFsaWRcbiIsIGMpOwotCQkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJY2FzZSBDTURfSU5WQUxJRDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBDbWQgJXAgaXMgIgorCQkJICAgICAgICJyZXBvcnRlZCBpbnZhbGlkXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfUFJPVE9DT0xfRVJSOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyAiCi0JCQkJCSJwcm90b2NvbCBlcnJvciBcbiIsIGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQljYXNlIENNRF9DT05ORUNUSU9OX0xPU1Q6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIgotCQkJCQkiY29ubmVjdGlvbiBsb3N0XG4iLCBjKTsKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzICIKKwkJCSAgICAgICAicHJvdG9jb2wgZXJyb3IgXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRFRDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHdhcyAiCi0JCQkJCSJhYm9ydGVkXG4iLCBjKTsKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjKTsKKwkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRfRkFJTEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCi0JCQkJCSJhYm9ydCBmYWlsZWRcbiIsIGMpOwotCQkJCXJldHVybl9zdGF0dXMgPSBJT19FUlJPUjsKKwkJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYWQgIgorCQkJICAgICAgICJjb25uZWN0aW9uIGxvc3RcbiIsIGMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQkJYnJlYWs7Ci0JCQljYXNlIENNRF9VTlNPTElDSVRFRF9BQk9SVDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkiY2Npc3MlZDogdW5zb2xpY2l0ZWQgYWJvcnQgJXBcbiIsCi0JCQkJCWN0bHIsIGMpOwotCQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HIAotCQkJCQkJImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLCAKLQkJCQkJCWN0bHIsIGMpOwotCQkJCQljLT5yZXRyeV9jb3VudCsrOwotCQkJCQkvKiBlcmFzZSB0aGUgb2xkIGVycm9yIGluZm9ybWF0aW9uICovCi0JCQkJCW1lbXNldChjLT5lcnJfaW5mbywgMCwKLQkJCQkJCXNpemVvZihFcnJvckluZm9fc3RydWN0KSk7Ci0JCQkJCXJldHVybl9zdGF0dXMgPSBJT19PSzsKLQkJCQkJSU5JVF9DT01QTEVUSU9OKHdhaXQpOwotCQkJCQlnb3RvIHJlc2VuZF9jbWQyOwotCQkJCX0KLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0FCT1JURUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHdhcyAiCisJCQkgICAgICAgImFib3J0ZWRcbiIsIGMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgotCQkJCQkidW5rbm93biBzdGF0dXMgJXhcbiIsIGMsIAotCQkJCQkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOyAKLQkJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCWNhc2UgQ01EX0FCT1JUX0ZBSUxFRDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCisJCQkgICAgICAgImFib3J0IGZhaWxlZFxuIiwgYyk7CisJCQlyZXR1cm5fc3RhdHVzID0gSU9fRVJST1I7CisJCQlicmVhazsKKwkJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImNjaXNzJWQ6IHVuc29saWNpdGVkIGFib3J0ICVwXG4iLCBjdGxyLCBjKTsKKwkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLCBjdGxyLCBjKTsKKwkJCQljLT5yZXRyeV9jb3VudCsrOworCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgaW5mb3JtYXRpb24gKi8KKwkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsCisJCQkJICAgICAgIHNpemVvZihFcnJvckluZm9fc3RydWN0KSk7CisJCQkJcmV0dXJuX3N0YXR1cyA9IElPX09LOworCQkJCUlOSVRfQ09NUExFVElPTih3YWl0KTsKKwkJCQlnb3RvIHJlc2VuZF9jbWQyOworCQkJfQorCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHJldHVybmVkICIKKwkJCSAgICAgICAidW5rbm93biBzdGF0dXMgJXhcbiIsIGMsCisJCQkgICAgICAgYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOworCQkJcmV0dXJuX3N0YXR1cyA9IElPX0VSUk9SOwogCQl9Ci0JfQkKKwl9CiAJLyogdW5sb2NrIHRoZSBidWZmZXJzIGZyb20gRE1BICovCiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLmxvd2VyID0gYy0+U0dbMF0uQWRkci5sb3dlcjsKIAlidWZmX2RtYV9oYW5kbGUudmFsMzIudXBwZXIgPSBjLT5TR1swXS5BZGRyLnVwcGVyOwotCXBjaV91bm1hcF9zaW5nbGUoIGgtPnBkZXYsIChkbWFfYWRkcl90KSBidWZmX2RtYV9oYW5kbGUudmFsLAotCQkJYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCXBjaV91bm1hcF9zaW5nbGUoaC0+cGRldiwgKGRtYV9hZGRyX3QpIGJ1ZmZfZG1hX2hhbmRsZS52YWwsCisJCQkgYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCWNtZF9mcmVlKGgsIGMsIDApOwotICAgICAgICByZXR1cm4ocmV0dXJuX3N0YXR1cyk7Ci0KKwlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KKwogc3RhdGljIHZvaWQgY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShpbnQgY3RsciwgaW50IGxvZ3ZvbCwKLQkJCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZSwKLQkJCXVuc2lnbmVkIGludCBibG9ja19zaXplLCBJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmLAotCQkJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydikKKwkJCQkgICBpbnQgd2l0aGlycSwgdW5zaWduZWQgaW50IHRvdGFsX3NpemUsCisJCQkJICAgdW5zaWduZWQgaW50IGJsb2NrX3NpemUsCisJCQkJICAgSW5xdWlyeURhdGFfc3RydWN0ICppbnFfYnVmZiwKKwkJCQkgICBkcml2ZV9pbmZvX3N0cnVjdCAqZHJ2KQogewogCWludCByZXR1cm5fY29kZTsKIAltZW1zZXQoaW5xX2J1ZmYsIDAsIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpKTsKIAlpZiAod2l0aGlycSkKIAkJcmV0dXJuX2NvZGUgPSBzZW5kY21kX3dpdGhpcnEoQ0lTU19JTlFVSVJZLCBjdGxyLAotCQkJaW5xX2J1ZmYsIHNpemVvZigqaW5xX2J1ZmYpLCAxLCBsb2d2b2wgLDB4QzEsIFRZUEVfQ01EKTsKKwkJCQkJICAgICAgaW5xX2J1ZmYsIHNpemVvZigqaW5xX2J1ZmYpLCAxLAorCQkJCQkgICAgICBsb2d2b2wsIDB4QzEsIFRZUEVfQ01EKTsKIAllbHNlCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGN0bHIsIGlucV9idWZmLAotCQkJc2l6ZW9mKCppbnFfYnVmZiksIDEsIGxvZ3ZvbCAsMHhDMSwgTlVMTCwgVFlQRV9DTUQpOworCQkJCSAgICAgIHNpemVvZigqaW5xX2J1ZmYpLCAxLCBsb2d2b2wsIDB4QzEsIE5VTEwsCisJCQkJICAgICAgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewotCQlpZihpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdID09IDB4RkYpIHsKKwkJaWYgKGlucV9idWZmLT5kYXRhX2J5dGVbOF0gPT0gMHhGRikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCSJjY2lzczogcmVhZGluZyBnZW9tZXRyeSBmYWlsZWQsIHZvbHVtZSAiCi0JCQkJImRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyBnZW9tZXRyeVxuIik7CisJCQkgICAgICAgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZCwgdm9sdW1lICIKKwkJCSAgICAgICAiZG9lcyBub3Qgc3VwcG9ydCByZWFkaW5nIGdlb21ldHJ5XG4iKTsKIAkJCWRydi0+YmxvY2tfc2l6ZSA9IGJsb2NrX3NpemU7CiAJCQlkcnYtPm5yX2Jsb2NrcyA9IHRvdGFsX3NpemU7CiAJCQlkcnYtPmhlYWRzID0gMjU1OwotCQkJZHJ2LT5zZWN0b3JzID0gMzI7IC8vIFNlY3RvcnMgcGVyIHRyYWNrCisJCQlkcnYtPnNlY3RvcnMgPSAzMjsJLy8gU2VjdG9ycyBwZXIgdHJhY2sKIAkJCWRydi0+Y3lsaW5kZXJzID0gdG90YWxfc2l6ZSAvIDI1NSAvIDMyOwogCQl9IGVsc2UgewogCQkJdW5zaWduZWQgaW50IHQ7CkBAIC0xODQ2LDM3ICsxODgzLDQyIEBACiAJCQlkcnYtPnJhaWRfbGV2ZWwgPSBpbnFfYnVmZi0+ZGF0YV9ieXRlWzhdOwogCQkJdCA9IGRydi0+aGVhZHMgKiBkcnYtPnNlY3RvcnM7CiAJCQlpZiAodCA+IDEpIHsKLQkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemUvdDsKKwkJCQlkcnYtPmN5bGluZGVycyA9IHRvdGFsX3NpemUgLyB0OwogCQkJfQogCQl9Ci0JfSBlbHNlIHsgLyogR2V0IGdlb21ldHJ5IGZhaWxlZCAqLworCX0gZWxzZSB7CQkvKiBHZXQgZ2VvbWV0cnkgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkaW5nIGdlb21ldHJ5IGZhaWxlZFxuIik7CiAJfQogCXByaW50ayhLRVJOX0lORk8gIiAgICAgIGhlYWRzPSAlZCwgc2VjdG9ycz0gJWQsIGN5bGluZGVycz0gJWRcblxuIiwKLQkJZHJ2LT5oZWFkcywgZHJ2LT5zZWN0b3JzLCBkcnYtPmN5bGluZGVycyk7CisJICAgICAgIGRydi0+aGVhZHMsIGRydi0+c2VjdG9ycywgZHJ2LT5jeWxpbmRlcnMpOwogfQorCiBzdGF0aWMgdm9pZAogY2Npc3NfcmVhZF9jYXBhY2l0eShpbnQgY3RsciwgaW50IGxvZ3ZvbCwgUmVhZENhcGRhdGFfc3RydWN0ICpidWYsCi0JCWludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsIHVuc2lnbmVkIGludCAqYmxvY2tfc2l6ZSkKKwkJICAgIGludCB3aXRoaXJxLCB1bnNpZ25lZCBpbnQgKnRvdGFsX3NpemUsCisJCSAgICB1bnNpZ25lZCBpbnQgKmJsb2NrX3NpemUpCiB7CiAJaW50IHJldHVybl9jb2RlOwogCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CiAJaWYgKHdpdGhpcnEpCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZF93aXRoaXJxKENDSVNTX1JFQURfQ0FQQUNJVFksCi0JCQljdGxyLCBidWYsIHNpemVvZigqYnVmKSwgMSwgbG9ndm9sLCAwLCBUWVBFX0NNRCk7CisJCQkJCSAgICAgIGN0bHIsIGJ1Ziwgc2l6ZW9mKCpidWYpLCAxLAorCQkJCQkgICAgICBsb2d2b2wsIDAsIFRZUEVfQ01EKTsKIAllbHNlCiAJCXJldHVybl9jb2RlID0gc2VuZGNtZChDQ0lTU19SRUFEX0NBUEFDSVRZLAotCQkJY3RsciwgYnVmLCBzaXplb2YoKmJ1ZiksIDEsIGxvZ3ZvbCwgMCwgTlVMTCwgVFlQRV9DTUQpOworCQkJCSAgICAgIGN0bHIsIGJ1Ziwgc2l6ZW9mKCpidWYpLCAxLCBsb2d2b2wsIDAsCisJCQkJICAgICAgTlVMTCwgVFlQRV9DTUQpOwogCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewotCQkqdG90YWxfc2l6ZSA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAmYnVmLT50b3RhbF9zaXplWzBdKSkrMTsKLQkJKmJsb2NrX3NpemUgPSBiZTMyX3RvX2NwdSgqKChfX2JlMzIgKikgJmJ1Zi0+YmxvY2tfc2l6ZVswXSkpOwotCX0gZWxzZSB7IC8qIHJlYWQgY2FwYWNpdHkgY29tbWFuZCBmYWlsZWQgKi8KKwkJKnRvdGFsX3NpemUgPQorCQkgICAgYmUzMl90b19jcHUoKigoX19iZTMyICopICYgYnVmLT50b3RhbF9zaXplWzBdKSkgKyAxOworCQkqYmxvY2tfc2l6ZSA9IGJlMzJfdG9fY3B1KCooKF9fYmUzMiAqKSAmIGJ1Zi0+YmxvY2tfc2l6ZVswXSkpOworCX0gZWxzZSB7CQkvKiByZWFkIGNhcGFjaXR5IGNvbW1hbmQgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiByZWFkIGNhcGFjaXR5IGZhaWxlZFxuIik7CiAJCSp0b3RhbF9zaXplID0gMDsKIAkJKmJsb2NrX3NpemUgPSBCTE9DS19TSVpFOwogCX0KIAlwcmludGsoS0VSTl9JTkZPICIgICAgICBibG9ja3M9ICV1IGJsb2NrX3NpemU9ICVkXG4iLAotCQkqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOworCSAgICAgICAqdG90YWxfc2l6ZSwgKmJsb2NrX3NpemUpOwogCXJldHVybjsKIH0KIApAQCAtMTg4NSwzOCArMTkyNywzOCBAQAogCWN0bHJfaW5mb190ICpoID0gZ2V0X2hvc3QoZGlzayk7CiAJZHJpdmVfaW5mb19zdHJ1Y3QgKmRydiA9IGdldF9kcnYoZGlzayk7CiAJaW50IGxvZ3ZvbDsKLQlpbnQgRk9VTkQ9MDsKKwlpbnQgRk9VTkQgPSAwOwogCXVuc2lnbmVkIGludCBibG9ja19zaXplOwogCXVuc2lnbmVkIGludCB0b3RhbF9zaXplOwogCVJlYWRDYXBkYXRhX3N0cnVjdCAqc2l6ZV9idWZmID0gTlVMTDsKIAlJbnF1aXJ5RGF0YV9zdHJ1Y3QgKmlucV9idWZmID0gTlVMTDsKIAotCWZvcihsb2d2b2w9MDsgbG9ndm9sIDwgQ0lTU19NQVhfTFVOOyBsb2d2b2wrKykKLQl7Ci0JCWlmKGgtPmRydltsb2d2b2xdLkx1bklEID09IGRydi0+THVuSUQpIHsKLQkJCUZPVU5EPTE7CisJZm9yIChsb2d2b2wgPSAwOyBsb2d2b2wgPCBDSVNTX01BWF9MVU47IGxvZ3ZvbCsrKSB7CisJCWlmIChoLT5kcnZbbG9ndm9sXS5MdW5JRCA9PSBkcnYtPkx1bklEKSB7CisJCQlGT1VORCA9IDE7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghRk9VTkQpIHJldHVybiAxOworCWlmICghRk9VTkQpCisJCXJldHVybiAxOwogCi0Jc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoIFJlYWRDYXBkYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOwotICAgICAgICBpZiAoc2l6ZV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGlucV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CisJc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemVfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCWlucV9idWZmID0ga21hbGxvYyhzaXplb2YoSW5xdWlyeURhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlucV9idWZmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlrZnJlZShzaXplX2J1ZmYpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisJCXJldHVybiAxOworCX0KIAotCWNjaXNzX3JlYWRfY2FwYWNpdHkoaC0+Y3RsciwgbG9ndm9sLCBzaXplX2J1ZmYsIDEsICZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7Ci0JY2Npc3NfZ2VvbWV0cnlfaW5xdWlyeShoLT5jdGxyLCBsb2d2b2wsIDEsIHRvdGFsX3NpemUsIGJsb2NrX3NpemUsIGlucV9idWZmLCBkcnYpOworCWNjaXNzX3JlYWRfY2FwYWNpdHkoaC0+Y3RsciwgbG9ndm9sLCBzaXplX2J1ZmYsIDEsICZ0b3RhbF9zaXplLAorCQkJICAgICZibG9ja19zaXplKTsKKwljY2lzc19nZW9tZXRyeV9pbnF1aXJ5KGgtPmN0bHIsIGxvZ3ZvbCwgMSwgdG90YWxfc2l6ZSwgYmxvY2tfc2l6ZSwKKwkJCSAgICAgICBpbnFfYnVmZiwgZHJ2KTsKIAogCWJsa19xdWV1ZV9oYXJkc2VjdF9zaXplKGRydi0+cXVldWUsIGRydi0+YmxvY2tfc2l6ZSk7CiAJc2V0X2NhcGFjaXR5KGRpc2ssIGRydi0+bnJfYmxvY2tzKTsKQEAgLTE5NDMsNyArMTk4NSw3IEBACiAJCWlmIChkb25lID09IEZJRk9fRU1QVFkpCiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSgxKTsKIAkJZWxzZQotCQkJcmV0dXJuIChkb25lKTsKKwkJCXJldHVybiBkb25lOwogCX0KIAkvKiBJbnZhbGlkIGFkZHJlc3MgdG8gdGVsbCBjYWxsZXIgd2UgcmFuIG91dCBvZiB0aW1lICovCiAJcmV0dXJuIDE7CkBAIC0xOTUyLDI4ICsxOTk0LDI4IEBACiBzdGF0aWMgaW50IGFkZF9zZW5kY21kX3JlamVjdChfX3U4IGNtZCwgaW50IGN0bHIsIHVuc2lnbmVkIGxvbmcgY29tcGxldGUpCiB7CiAJLyogV2UgZ2V0IGluIGhlcmUgaWYgc2VuZGNtZCgpIGlzIHBvbGxpbmcgZm9yIGNvbXBsZXRpb25zCi0JICAgYW5kIGdldHMgc29tZSBjb21tYW5kIGJhY2sgdGhhdCBpdCB3YXNuJ3QgZXhwZWN0aW5nIC0tIAotCSAgIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoYXQgd2hpY2ggaXQganVzdCBzZW50IGRvd24uICAKLQkgICBPcmRpbmFyaWx5LCB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpdCBjYW4gaGFwcGVuIHdoZW4gCisJICAgYW5kIGdldHMgc29tZSBjb21tYW5kIGJhY2sgdGhhdCBpdCB3YXNuJ3QgZXhwZWN0aW5nIC0tCisJICAgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhhdCB3aGljaCBpdCBqdXN0IHNlbnQgZG93bi4KKwkgICBPcmRpbmFyaWx5LCB0aGF0IHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBpdCBjYW4gaGFwcGVuIHdoZW4KIAkgICB0aGUgc2NzaSB0YXBlIHN0dWZmIGdldHMgaW50byBlcnJvciBoYW5kbGluZyBtb2RlLCBhbmQKLQkgICBzdGFydHMgdXNpbmcgc2VuZGNtZCgpIHRvIHRyeSB0byBhYm9ydCBjb21tYW5kcyBhbmQgCisJICAgc3RhcnRzIHVzaW5nIHNlbmRjbWQoKSB0byB0cnkgdG8gYWJvcnQgY29tbWFuZHMgYW5kCiAJICAgcmVzZXQgdGFwZSBkcml2ZXMuICBJbiB0aGF0IGNhc2UsIHNlbmRjbWQgbWF5IHBpY2sgdXAKIAkgICBjb21wbGV0aW9ucyBvZiBjb21tYW5kcyB0aGF0IHdlcmUgc2VudCB0byBsb2dpY2FsIGRyaXZlcwotCSAgIHRocm91Z2ggdGhlIGJsb2NrIGkvbyBzeXN0ZW0sIG9yIGNjaXNzIGlvY3RscyBjb21wbGV0aW5nLCBldGMuIAorCSAgIHRocm91Z2ggdGhlIGJsb2NrIGkvbyBzeXN0ZW0sIG9yIGNjaXNzIGlvY3RscyBjb21wbGV0aW5nLCBldGMuCiAJICAgSW4gdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHNhdmUgdGhvc2UgY29tcGxldGlvbnMgZm9yIGxhdGVyCiAJICAgcHJvY2Vzc2luZyBieSB0aGUgaW50ZXJydXB0IGhhbmRsZXIuCi0JKi8KKwkgKi8KIAogI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQotCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0ICpzcmwgPSAmaGJhW2N0bHJdLT5zY3NpX3JlamVjdHM7CQorCXN0cnVjdCBzZW5kY21kX3JlamVjdF9saXN0ICpzcmwgPSAmaGJhW2N0bHJdLT5zY3NpX3JlamVjdHM7CiAKIAkvKiBJZiBpdCdzIG5vdCB0aGUgc2NzaSB0YXBlIHN0dWZmIGRvaW5nIGVycm9yIGhhbmRsaW5nLCAoYWJvcnQgKi8KIAkvKiBvciByZXNldCkgdGhlbiB3ZSBkb24ndCBleHBlY3QgYW55dGhpbmcgd2VpcmQuICovCiAJaWYgKGNtZCAhPSBDQ0lTU19SRVNFVF9NU0cgJiYgY21kICE9IENDSVNTX0FCT1JUX01TRykgewogI2VuZGlmCi0JCXByaW50ayggS0VSTl9XQVJOSU5HICJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kICIKLQkJICAgICAgIkludmFsaWQgY29tbWFuZCBsaXN0IGFkZHJlc3MgcmV0dXJuZWQhICglbHgpXG4iLAotCQkJY3RsciwgY29tcGxldGUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kICIKKwkJICAgICAgICJJbnZhbGlkIGNvbW1hbmQgbGlzdCBhZGRyZXNzIHJldHVybmVkISAoJWx4KVxuIiwKKwkJICAgICAgIGN0bHIsIGNvbXBsZXRlKTsKIAkJLyogbm90IG11Y2ggd2UgY2FuIGRvLiAqLwogI2lmZGVmIENPTkZJR19DSVNTX1NDU0lfVEFQRQogCQlyZXR1cm4gMTsKQEAgLTE5ODQsNyArMjAyNiw3IEBACiAJaWYgKHNybC0+bmNvbXBsZXRpb25zID49IChOUl9DTURTICsgMikpIHsKIAkJLyogVWggb2guICBObyByb29tIHRvIHNhdmUgaXQgZm9yIGxhdGVyLi4uICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IFNlbmRjbWQ6IEludmFsaWQgY29tbWFuZCBhZGRyLCAiCi0JCQkicmVqZWN0IGxpc3Qgb3ZlcmZsb3csIGNvbW1hbmQgbG9zdCFcbiIsIGN0bHIpOworCQkgICAgICAgInJlamVjdCBsaXN0IG92ZXJmbG93LCBjb21tYW5kIGxvc3QhXG4iLCBjdGxyKTsKIAkJcmV0dXJuIDE7CiAJfQogCS8qIFNhdmUgaXQgZm9yIGxhdGVyICovCkBAIC0xOTk1LDM0MCArMjAzNywzMjcgQEAKIH0KIAogLyoKLSAqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLCBhbmQgd2FpdCBmb3IgaXQgdG8gY29tcGxldGUuICAKLSAqIE9ubHkgdXNlZCBhdCBpbml0IHRpbWUuIAorICogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIsIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZS4KKyAqIE9ubHkgdXNlZCBhdCBpbml0IHRpbWUuCiAgKi8KLXN0YXRpYyBpbnQgc2VuZGNtZCgKLQlfX3U4CWNtZCwKLQlpbnQJY3RsciwKLQl2b2lkCSpidWZmLAotCXNpemVfdAlzaXplLAotCXVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sIC8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCi0JCQkJICAgICAgMTogYWRkcmVzcyBsb2dpY2FsIHZvbHVtZSBsb2dfdW5pdCwgCi0JCQkJICAgICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLwotCXVuc2lnbmVkIGludCBsb2dfdW5pdCwKLQlfX3U4CXBhZ2VfY29kZSwKLQl1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsCi0JaW50IGNtZF90eXBlKQorc3RhdGljIGludCBzZW5kY21kKF9fdTggY21kLCBpbnQgY3Rsciwgdm9pZCAqYnVmZiwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB1c2VfdW5pdF9udW0sCS8qIDA6IGFkZHJlc3MgdGhlIGNvbnRyb2xsZXIsCisJCQkJCQkJCQkJCQkgICAxOiBhZGRyZXNzIGxvZ2ljYWwgdm9sdW1lIGxvZ191bml0LAorCQkJCQkJCQkJCQkJICAgMjogcGVyaXBoIGRldmljZSBhZGRyZXNzIGlzIHNjc2kzYWRkciAqLworCQkgICB1bnNpZ25lZCBpbnQgbG9nX3VuaXQsCisJCSAgIF9fdTggcGFnZV9jb2RlLCB1bnNpZ25lZCBjaGFyICpzY3NpM2FkZHIsIGludCBjbWRfdHlwZSkKIHsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBjb21wbGV0ZTsKLQljdGxyX2luZm9fdCAqaW5mb19wPSBoYmFbY3Rscl07CisJY3Rscl9pbmZvX3QgKmluZm9fcCA9IGhiYVtjdGxyXTsKIAl1NjRiaXQgYnVmZl9kbWFfaGFuZGxlOwogCWludCBzdGF0dXMsIGRvbmUgPSAwOwogCiAJaWYgKChjID0gY21kX2FsbG9jKGluZm9fcCwgMSkpID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHVuYWJsZSB0byBnZXQgbWVtb3J5Iik7Ci0JCXJldHVybihJT19FUlJPUik7CisJCXJldHVybiBJT19FUlJPUjsKIAl9CiAJc3RhdHVzID0gZmlsbF9jbWQoYywgY21kLCBjdGxyLCBidWZmLCBzaXplLCB1c2VfdW5pdF9udW0sCi0JCWxvZ191bml0LCBwYWdlX2NvZGUsIHNjc2kzYWRkciwgY21kX3R5cGUpOworCQkJICBsb2dfdW5pdCwgcGFnZV9jb2RlLCBzY3NpM2FkZHIsIGNtZF90eXBlKTsKIAlpZiAoc3RhdHVzICE9IElPX09LKSB7CiAJCWNtZF9mcmVlKGluZm9fcCwgYywgMSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotcmVzZW5kX2NtZDE6CisgICAgICByZXNlbmRfY21kMToKIAkvKgotICAgICAgICAgKiBEaXNhYmxlIGludGVycnVwdAotICAgICAgICAgKi8KKwkgKiBEaXNhYmxlIGludGVycnVwdAorCSAqLwogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzOiB0dXJuaW5nIGludHIgb2ZmXG4iKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKLSAgICAgICAgaW5mb19wLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhpbmZvX3AsIENDSVNTX0lOVFJfT0ZGKTsKLQkKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCWluZm9fcC0+YWNjZXNzLnNldF9pbnRyX21hc2soaW5mb19wLCBDQ0lTU19JTlRSX09GRik7CisKIAkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgcm9vbSBpbiB0aGUgY29tbWFuZCBGSUZPICovCi0gICAgICAgIC8qIEFjdHVhbGx5IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGVtcHR5IGF0IHRoaXMgdGltZSAqLworCS8qIEFjdHVhbGx5IGl0IHNob3VsZCBiZSBjb21wbGV0ZWx5IGVtcHR5IGF0IHRoaXMgdGltZSAqLwogCS8qIHVubGVzcyB3ZSBhcmUgaW4gaGVyZSBkb2luZyBlcnJvciBoYW5kbGluZyBmb3IgdGhlIHNjc2kgKi8KIAkvKiB0YXBlIHNpZGUgb2YgdGhlIGRyaXZlci4gKi8KLSAgICAgICAgZm9yIChpID0gMjAwMDAwOyBpID4gMDsgaS0tKSAKLQl7CisJZm9yIChpID0gMjAwMDAwOyBpID4gMDsgaS0tKSB7CiAJCS8qIGlmIGZpZm8gaXNuJ3QgZnVsbCBnbyAqLwotICAgICAgICAgICAgICAgIGlmICghKGluZm9fcC0+YWNjZXNzLmZpZm9fZnVsbChpbmZvX3ApKSkgCi0JCXsKLQkJCQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBGSUZPIGZ1bGwsIgotICAgICAgICAgICAgICAgICAgICAgICAgIiB3YWl0aW5nIVxuIiwgY3Rscik7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2VuZCB0aGUgY21kCi0gICAgICAgICAqLwotICAgICAgICBpbmZvX3AtPmFjY2Vzcy5zdWJtaXRfY29tbWFuZChpbmZvX3AsIGMpOworCQlpZiAoIShpbmZvX3AtPmFjY2Vzcy5maWZvX2Z1bGwoaW5mb19wKSkpIHsKKworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBGSUZPIGZ1bGwsIgorCQkgICAgICAgIiB3YWl0aW5nIVxuIiwgY3Rscik7CisJfQorCS8qCisJICogU2VuZCB0aGUgY21kCisJICovCisJaW5mb19wLT5hY2Nlc3Muc3VibWl0X2NvbW1hbmQoaW5mb19wLCBjKTsKIAlkb25lID0gMDsKIAlkbyB7CiAJCWNvbXBsZXRlID0gcG9sbGNvbXBsZXRlKGN0bHIpOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAkJcHJpbnRrKEtFUk5fREVCVUcgImNjaXNzOiBjb21tYW5kIGNvbXBsZXRlZFxuIik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAJCWlmIChjb21wbGV0ZSA9PSAxKSB7Ci0JCQlwcmludGsoIEtFUk5fV0FSTklORwotCQkJCSJjY2lzcyBjY2lzcyVkOiBTZW5kQ21kIFRpbWVvdXQgb3V0LCAiCi0JCQkJIk5vIGNvbW1hbmQgbGlzdCBhZGRyZXNzIHJldHVybmVkIVxuIiwKLQkJCQljdGxyKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiY2Npc3MgY2Npc3MlZDogU2VuZENtZCBUaW1lb3V0IG91dCwgIgorCQkJICAgICAgICJObyBjb21tYW5kIGxpc3QgYWRkcmVzcyByZXR1cm5lZCFcbiIsIGN0bHIpOwogCQkJc3RhdHVzID0gSU9fRVJST1I7CiAJCQlkb25lID0gMTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLyogVGhpcyB3aWxsIG5lZWQgdG8gY2hhbmdlIGZvciBkaXJlY3QgbG9va3VwIGNvbXBsZXRpb25zICovCi0JCWlmICggKGNvbXBsZXRlICYgQ0lTU19FUlJPUl9CSVQpCi0JCSAgICAgJiYgKGNvbXBsZXRlICYgfkNJU1NfRVJST1JfQklUKSA9PSBjLT5idXNhZGRyKQotCQkgICAgIHsKLQkJCS8qIGlmIGRhdGEgb3ZlcnJ1biBvciB1bmRlcnVuIG9uIFJlcG9ydCBjb21tYW5kIAotCQkJCWlnbm9yZSBpdCAKLQkJCSovCisJCWlmICgoY29tcGxldGUgJiBDSVNTX0VSUk9SX0JJVCkKKwkJICAgICYmIChjb21wbGV0ZSAmIH5DSVNTX0VSUk9SX0JJVCkgPT0gYy0+YnVzYWRkcikgeworCQkJLyogaWYgZGF0YSBvdmVycnVuIG9yIHVuZGVydW4gb24gUmVwb3J0IGNvbW1hbmQKKwkJCSAgIGlnbm9yZSBpdAorCQkJICovCiAJCQlpZiAoKChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX1JFUE9SVF9MT0cpIHx8CiAJCQkgICAgIChjLT5SZXF1ZXN0LkNEQlswXSA9PSBDSVNTX1JFUE9SVF9QSFlTKSB8fAogCQkJICAgICAoYy0+UmVxdWVzdC5DREJbMF0gPT0gQ0lTU19JTlFVSVJZKSkgJiYKLQkJCQkoKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IAotCQkJCQlDTURfREFUQV9PVkVSUlVOKSB8fCAKLQkJCQkgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09IAotCQkJCQlDTURfREFUQV9VTkRFUlJVTikKLQkJCSAJKSkKLQkJCXsKKwkJCSAgICAoKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09CisJCQkgICAgICBDTURfREFUQV9PVkVSUlVOKSB8fAorCQkJICAgICAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX0RBVEFfVU5ERVJSVU4pCisJCQkgICAgKSkgewogCQkJCWNvbXBsZXRlID0gYy0+YnVzYWRkcjsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09Ci0JCQkJCQlDTURfVU5TT0xJQ0lURURfQUJPUlQpIHsKKwkJCQkgICAgQ01EX1VOU09MSUNJVEVEX0FCT1JUKSB7CiAJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6ICIKLQkJCQkJCSJ1bnNvbGljaXRlZCBhYm9ydCAlcFxuIiwKLQkJCQkJCWN0bHIsIGMpOworCQkJCQkgICAgICAgInVuc29saWNpdGVkIGFib3J0ICVwXG4iLAorCQkJCQkgICAgICAgY3RsciwgYyk7CiAJCQkJCWlmIChjLT5yZXRyeV9jb3VudCA8IE1BWF9DTURfUkVUUklFUykgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLAotCQkJCQkJICAgY3RsciwgYyk7CisJCQkJCQkgICAgICAgImNjaXNzJWQ6IHJldHJ5aW5nICVwXG4iLAorCQkJCQkJICAgICAgIGN0bHIsIGMpOwogCQkJCQkJYy0+cmV0cnlfY291bnQrKzsKIAkJCQkJCS8qIGVyYXNlIHRoZSBvbGQgZXJyb3IgKi8KIAkJCQkJCS8qIGluZm9ybWF0aW9uICovCiAJCQkJCQltZW1zZXQoYy0+ZXJyX2luZm8sIDAsCi0JCQkJCQkgICBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCkpOworCQkJCQkJICAgICAgIHNpemVvZgorCQkJCQkJICAgICAgIChFcnJvckluZm9fc3RydWN0KSk7CiAJCQkJCQlnb3RvIHJlc2VuZF9jbWQxOwogCQkJCQl9IGVsc2UgewogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJICAgImNjaXNzJWQ6IHJldHJpZWQgJXAgdG9vICIKLQkJCQkJCSAgICJtYW55IHRpbWVzXG4iLCBjdGxyLCBjKTsKKwkJCQkJCSAgICAgICAiY2Npc3MlZDogcmV0cmllZCAlcCB0b28gIgorCQkJCQkJICAgICAgICJtYW55IHRpbWVzXG4iLCBjdGxyLCBjKTsKIAkJCQkJCXN0YXR1cyA9IElPX0VSUk9SOwogCQkJCQkJZ290byBjbGVhbnVwMTsKIAkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgPT0gQ01EX1VOQUJPUlRBQkxFKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzJWQ6IGNvbW1hbmQgY291bGQgbm90IGJlIGFib3J0ZWQuXG4iLCBjdGxyKTsKKwkJCQl9IGVsc2UgaWYgKGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzID09CisJCQkJCSAgIENNRF9VTkFCT1JUQUJMRSkgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSAgICAgICAiY2Npc3MlZDogY29tbWFuZCBjb3VsZCBub3QgYmUgYWJvcnRlZC5cbiIsCisJCQkJCSAgICAgICBjdGxyKTsKIAkJCQkJc3RhdHVzID0gSU9fRVJST1I7CiAJCQkJCWdvdG8gY2xlYW51cDE7CiAJCQkJfQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNpc3MgY2lzcyVkOiBzZW5kY21kIgotCQkJCSIgRXJyb3IgJXggXG4iLCBjdGxyLCAKLQkJCQkJYy0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOyAKKwkJCQkgICAgICAgIiBFcnJvciAleCBcbiIsIGN0bHIsCisJCQkJICAgICAgIGMtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaXNzIGNpc3MlZDogc2VuZGNtZCIKLQkJCQkiIG9mZmVuc2l2ZSBpbmZvXG4iCi0JCQkJIiAgc2l6ZSAleFxuICAgbnVtICV4ICAgdmFsdWUgJXhcbiIsIGN0bHIsCi0JCQkJICBjLT5lcnJfaW5mby0+TW9yZUVyckluZm8uSW52YWxpZF9DbWQub2ZmZW5zZV9zaXplLAotCQkJCSAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLm9mZmVuc2VfbnVtLAotCQkJCSAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLm9mZmVuc2VfdmFsdWUpOworCQkJCSAgICAgICAiIG9mZmVuc2l2ZSBpbmZvXG4iCisJCQkJICAgICAgICIgIHNpemUgJXhcbiAgIG51bSAleCAgIHZhbHVlICV4XG4iLAorCQkJCSAgICAgICBjdGxyLAorCQkJCSAgICAgICBjLT5lcnJfaW5mby0+TW9yZUVyckluZm8uSW52YWxpZF9DbWQuCisJCQkJICAgICAgIG9mZmVuc2Vfc2l6ZSwKKwkJCQkgICAgICAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLgorCQkJCSAgICAgICBvZmZlbnNlX251bSwKKwkJCQkgICAgICAgYy0+ZXJyX2luZm8tPk1vcmVFcnJJbmZvLkludmFsaWRfQ21kLgorCQkJCSAgICAgICBvZmZlbnNlX3ZhbHVlKTsKIAkJCQlzdGF0dXMgPSBJT19FUlJPUjsKIAkJCQlnb3RvIGNsZWFudXAxOwogCQkJfQogCQl9CiAJCS8qIFRoaXMgd2lsbCBuZWVkIGNoYW5naW5nIGZvciBkaXJlY3QgbG9va3VwIGNvbXBsZXRpb25zICovCi0gICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRlICE9IGMtPmJ1c2FkZHIpIHsKKwkJaWYgKGNvbXBsZXRlICE9IGMtPmJ1c2FkZHIpIHsKIAkJCWlmIChhZGRfc2VuZGNtZF9yZWplY3QoY21kLCBjdGxyLCBjb21wbGV0ZSkgIT0gMCkgewotCQkJCUJVRygpOyAvKiB3ZSBhcmUgcHJldHR5IG11Y2ggaG9zZWQgaWYgd2UgZ2V0IGhlcmUuICovCisJCQkJQlVHKCk7CS8qIHdlIGFyZSBwcmV0dHkgbXVjaCBob3NlZCBpZiB3ZSBnZXQgaGVyZS4gKi8KIAkJCX0KIAkJCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZQorCQl9IGVsc2UKIAkJCWRvbmUgPSAxOwotICAgICAgICB9IHdoaWxlICghZG9uZSk7Ci0JCQotY2xlYW51cDE6CQorCX0gd2hpbGUgKCFkb25lKTsKKworICAgICAgY2xlYW51cDE6CiAJLyogdW5sb2NrIHRoZSBkYXRhIGJ1ZmZlciBmcm9tIERNQSAqLwogCWJ1ZmZfZG1hX2hhbmRsZS52YWwzMi5sb3dlciA9IGMtPlNHWzBdLkFkZHIubG93ZXI7CiAJYnVmZl9kbWFfaGFuZGxlLnZhbDMyLnVwcGVyID0gYy0+U0dbMF0uQWRkci51cHBlcjsKIAlwY2lfdW5tYXBfc2luZ2xlKGluZm9fcC0+cGRldiwgKGRtYV9hZGRyX3QpIGJ1ZmZfZG1hX2hhbmRsZS52YWwsCi0JCQkJYy0+U0dbMF0uTGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJIGMtPlNHWzBdLkxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKIAkvKiBpZiB3ZSBzYXZlZCBzb21lIGNvbW1hbmRzIGZvciBsYXRlciwgcHJvY2VzcyB0aGVtIG5vdy4gKi8KIAlpZiAoaW5mb19wLT5zY3NpX3JlamVjdHMubmNvbXBsZXRpb25zID4gMCkKIAkJZG9fY2Npc3NfaW50cigwLCBpbmZvX3AsIE5VTEwpOwogI2VuZGlmCiAJY21kX2ZyZWUoaW5mb19wLCBjLCAxKTsKLQlyZXR1cm4gKHN0YXR1cyk7Ci19IAorCXJldHVybiBzdGF0dXM7Cit9CisKIC8qCiAgKiBNYXAgKHBoeXNpY2FsKSBQQ0kgbWVtIGludG8gKHZpcnR1YWwpIGtlcm5lbCBzcGFjZQogICovCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpyZW1hcF9wY2lfbWVtKHVsb25nIGJhc2UsIHVsb25nIHNpemUpCiB7Ci0gICAgICAgIHVsb25nIHBhZ2VfYmFzZSAgICAgICAgPSAoKHVsb25nKSBiYXNlKSAmIFBBR0VfTUFTSzsKLSAgICAgICAgdWxvbmcgcGFnZV9vZmZzICAgICAgICA9ICgodWxvbmcpIGJhc2UpIC0gcGFnZV9iYXNlOwotICAgICAgICB2b2lkIF9faW9tZW0gKnBhZ2VfcmVtYXBwZWQgPSBpb3JlbWFwKHBhZ2VfYmFzZSwgcGFnZV9vZmZzK3NpemUpOworCXVsb25nIHBhZ2VfYmFzZSA9ICgodWxvbmcpIGJhc2UpICYgUEFHRV9NQVNLOworCXVsb25nIHBhZ2Vfb2ZmcyA9ICgodWxvbmcpIGJhc2UpIC0gcGFnZV9iYXNlOworCXZvaWQgX19pb21lbSAqcGFnZV9yZW1hcHBlZCA9IGlvcmVtYXAocGFnZV9iYXNlLCBwYWdlX29mZnMgKyBzaXplKTsKIAotICAgICAgICByZXR1cm4gcGFnZV9yZW1hcHBlZCA/IChwYWdlX3JlbWFwcGVkICsgcGFnZV9vZmZzKSA6IE5VTEw7CisJcmV0dXJuIHBhZ2VfcmVtYXBwZWQgPyAocGFnZV9yZW1hcHBlZCArIHBhZ2Vfb2ZmcykgOiBOVUxMOwogfQogCi0vKiAKLSAqIFRha2VzIGpvYnMgb2YgdGhlIFEgYW5kIHNlbmRzIHRoZW0gdG8gdGhlIGhhcmR3YXJlLCB0aGVuIHB1dHMgaXQgb24gCi0gKiB0aGUgUSB0byB3YWl0IGZvciBjb21wbGV0aW9uLiAKLSAqLyAKLXN0YXRpYyB2b2lkIHN0YXJ0X2lvKCBjdGxyX2luZm9fdCAqaCkKKy8qCisgKiBUYWtlcyBqb2JzIG9mIHRoZSBRIGFuZCBzZW5kcyB0aGVtIHRvIHRoZSBoYXJkd2FyZSwgdGhlbiBwdXRzIGl0IG9uCisgKiB0aGUgUSB0byB3YWl0IGZvciBjb21wbGV0aW9uLgorICovCitzdGF0aWMgdm9pZCBzdGFydF9pbyhjdGxyX2luZm9fdCAqaCkKIHsKIAlDb21tYW5kTGlzdF9zdHJ1Y3QgKmM7Ci0JCi0Jd2hpbGUoKCBjID0gaC0+cmVxUSkgIT0gTlVMTCApCi0JeworCisJd2hpbGUgKChjID0gaC0+cmVxUSkgIT0gTlVMTCkgewogCQkvKiBjYW4ndCBkbyBhbnl0aGluZyBpZiBmaWZvIGlzIGZ1bGwgKi8KIAkJaWYgKChoLT5hY2Nlc3MuZmlmb19mdWxsKGgpKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGZpZm8gZnVsbFxuIik7CiAJCQlicmVhazsKIAkJfQogCi0JCS8qIEdldCB0aGUgZmlyc3QgZW50cnkgZnJvbSB0aGUgUmVxdWVzdCBRICovIAorCQkvKiBHZXQgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIFJlcXVlc3QgUSAqLwogCQlyZW1vdmVRKCYoaC0+cmVxUSksIGMpOwogCQloLT5RZGVwdGgtLTsKLQkKLQkJLyogVGVsbCB0aGUgY29udHJvbGxlciBleGVjdXRlIGNvbW1hbmQgKi8gCisKKwkJLyogVGVsbCB0aGUgY29udHJvbGxlciBleGVjdXRlIGNvbW1hbmQgKi8KIAkJaC0+YWNjZXNzLnN1Ym1pdF9jb21tYW5kKGgsIGMpOwotCQkKLQkJLyogUHV0IGpvYiBvbnRvIHRoZSBjb21wbGV0ZWQgUSAqLyAKLQkJYWRkUSAoJihoLT5jbXBRKSwgYyk7IAorCisJCS8qIFB1dCBqb2Igb250byB0aGUgY29tcGxldGVkIFEgKi8KKwkJYWRkUSgmKGgtPmNtcFEpLCBjKTsKIAl9CiB9CisKIC8qIEFzc3VtZXMgdGhhdCBDQ0lTU19MT0NLKGgtPmN0bHIpIGlzIGhlbGQuICovCiAvKiBaZXJvcyBvdXQgdGhlIGVycm9yIHJlY29yZCBhbmQgdGhlbiByZXNlbmRzIHRoZSBjb21tYW5kIGJhY2sgKi8KIC8qIHRvIHRoZSBjb250cm9sbGVyICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVzZW5kX2NjaXNzX2NtZCggY3Rscl9pbmZvX3QgKmgsIENvbW1hbmRMaXN0X3N0cnVjdCAqYykKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNlbmRfY2Npc3NfY21kKGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmMpCiB7CiAJLyogZXJhc2UgdGhlIG9sZCBlcnJvciBpbmZvcm1hdGlvbiAqLwogCW1lbXNldChjLT5lcnJfaW5mbywgMCwgc2l6ZW9mKEVycm9ySW5mb19zdHJ1Y3QpKTsKIAogCS8qIGFkZCBpdCB0byBzb2Z0d2FyZSBxdWV1ZSBhbmQgdGhlbiBzZW5kIGl0IHRvIHRoZSBjb250cm9sbGVyICovCi0JYWRkUSgmKGgtPnJlcVEpLGMpOworCWFkZFEoJihoLT5yZXFRKSwgYyk7CiAJaC0+UWRlcHRoKys7Ci0JaWYoaC0+UWRlcHRoID4gaC0+bWF4UXNpbmNlaW5pdCkKKwlpZiAoaC0+UWRlcHRoID4gaC0+bWF4UXNpbmNlaW5pdCkKIAkJaC0+bWF4UXNpbmNlaW5pdCA9IGgtPlFkZXB0aDsKIAogCXN0YXJ0X2lvKGgpOwogfQogCi0vKiBjaGVja3MgdGhlIHN0YXR1cyBvZiB0aGUgam9iIGFuZCBjYWxscyBjb21wbGV0ZSBidWZmZXJzIHRvIG1hcmsgYWxsIAorLyogY2hlY2tzIHRoZSBzdGF0dXMgb2YgdGhlIGpvYiBhbmQgY2FsbHMgY29tcGxldGUgYnVmZmVycyB0byBtYXJrIGFsbAogICogYnVmZmVycyBmb3IgdGhlIGNvbXBsZXRlZCBqb2IuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQKICAqIHRvIGhvbGQgdGhlIGhiYS9xdWV1ZSBsb2NrLgotICovIAotc3RhdGljIGlubGluZSB2b2lkIGNvbXBsZXRlX2NvbW1hbmQoIGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZCwKLQkJaW50IHRpbWVvdXQpCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wbGV0ZV9jb21tYW5kKGN0bHJfaW5mb190ICpoLCBDb21tYW5kTGlzdF9zdHJ1Y3QgKmNtZCwKKwkJCQkgICAgaW50IHRpbWVvdXQpCiB7CiAJaW50IHN0YXR1cyA9IDE7CiAJaW50IHJldHJ5X2NtZCA9IDA7Ci0JCQotCWlmICh0aW1lb3V0KQotCQlzdGF0dXMgPSAwOyAKIAotCWlmKGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMgIT0gMCkgCi0JeyAvKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQgKi8gCi0JCXN3aXRjaChjbWQtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKQotCQl7CisJaWYgKHRpbWVvdXQpCisJCXN0YXR1cyA9IDA7CisKKwlpZiAoY21kLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyAhPSAwKSB7CS8qIGFuIGVycm9yIGhhcyBvY2N1cnJlZCAqLworCQlzd2l0Y2ggKGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpIHsKIAkJCXVuc2lnbmVkIGNoYXIgc2Vuc2Vfa2V5OwotCQkJY2FzZSBDTURfVEFSR0VUX1NUQVRVUzoKLQkJCQlzdGF0dXMgPSAwOwotCQkJCi0JCQkJaWYoIGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMgPT0gMHgwMikKLQkJCQl7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkiaGFzIENIRUNLIENPTkRJVElPTiAiCi0JCQkJCQkiIGJ5dGUgMiA9IDB4JXhcbiIsIGNtZCwKLQkJCQkJCWNtZC0+ZXJyX2luZm8tPlNlbnNlSW5mb1syXQotCQkJCQkpOwotCQkJCQkvKiBjaGVjayB0aGUgc2Vuc2Uga2V5ICovCi0JCQkJCXNlbnNlX2tleSA9IDB4ZiAmIAotCQkJCQkJY21kLT5lcnJfaW5mby0+U2Vuc2VJbmZvWzJdOwotCQkJCQkvKiBubyBzdGF0dXMgb3IgcmVjb3ZlcmVkIGVycm9yICovCi0JCQkJCWlmKChzZW5zZV9rZXkgPT0gMHgwKSB8fAotCQkJCQkgICAgKHNlbnNlX2tleSA9PSAweDEpKQotCQkJCQl7Ci0JCQkJCQkJc3RhdHVzID0gMTsKLQkJCQkJfQotCQkJCX0gZWxzZQotCQkJCXsKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFzIFNDU0kgU3RhdHVzIDB4JXhcbiIsCi0JCQkJCQljbWQsIGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMpOworCQljYXNlIENNRF9UQVJHRVRfU1RBVFVTOgorCQkJc3RhdHVzID0gMDsKKworCQkJaWYgKGNtZC0+ZXJyX2luZm8tPlNjc2lTdGF0dXMgPT0gMHgwMikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgIgorCQkJCSAgICAgICAiaGFzIENIRUNLIENPTkRJVElPTiAiCisJCQkJICAgICAgICIgYnl0ZSAyID0gMHgleFxuIiwgY21kLAorCQkJCSAgICAgICBjbWQtPmVycl9pbmZvLT5TZW5zZUluZm9bMl0KKwkJCQkgICAgKTsKKwkJCQkvKiBjaGVjayB0aGUgc2Vuc2Uga2V5ICovCisJCQkJc2Vuc2Vfa2V5ID0gMHhmICYgY21kLT5lcnJfaW5mby0+U2Vuc2VJbmZvWzJdOworCQkJCS8qIG5vIHN0YXR1cyBvciByZWNvdmVyZWQgZXJyb3IgKi8KKwkJCQlpZiAoKHNlbnNlX2tleSA9PSAweDApIHx8IChzZW5zZV9rZXkgPT0gMHgxKSkgeworCQkJCQlzdGF0dXMgPSAxOwogCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCAiCisJCQkJICAgICAgICJoYXMgU0NTSSBTdGF0dXMgMHgleFxuIiwKKwkJCQkgICAgICAgY21kLCBjbWQtPmVycl9pbmZvLT5TY3NpU3RhdHVzKTsKKwkJCX0KIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfREFUQV9VTkRFUlJVTjoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyIKLQkJCQkJIiBjb21wbGV0ZWQgd2l0aCBkYXRhIHVuZGVycnVuICIKLQkJCQkJInJlcG9ydGVkXG4iLCBjbWQpOworCQljYXNlIENNRF9EQVRBX1VOREVSUlVOOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMiCisJCQkgICAgICAgIiBjb21wbGV0ZWQgd2l0aCBkYXRhIHVuZGVycnVuICIKKwkJCSAgICAgICAicmVwb3J0ZWRcbiIsIGNtZCk7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGhhcyIKLQkJCQkJIiBjb21wbGV0ZWQgd2l0aCBkYXRhIG92ZXJydW4gIgotCQkJCQkicmVwb3J0ZWRcbiIsIGNtZCk7CisJCWNhc2UgQ01EX0RBVEFfT1ZFUlJVTjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFzIgorCQkJICAgICAgICIgY29tcGxldGVkIHdpdGggZGF0YSBvdmVycnVuICIKKwkJCSAgICAgICAicmVwb3J0ZWRcbiIsIGNtZCk7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX0lOVkFMSUQ6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBpcyAiCi0JCQkJCSJyZXBvcnRlZCBpbnZhbGlkXG4iLCBjbWQpOwotCQkJCXN0YXR1cyA9IDA7CisJCWNhc2UgQ01EX0lOVkFMSUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIGlzICIKKwkJCSAgICAgICAicmVwb3J0ZWQgaW52YWxpZFxuIiwgY21kKTsKKwkJCXN0YXR1cyA9IDA7CiAJCQlicmVhazsKLQkJCWNhc2UgQ01EX1BST1RPQ09MX0VSUjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMgIgotCQkJCQkicHJvdG9jb2wgZXJyb3IgXG4iLCBjbWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQljYXNlIENNRF9IQVJEV0FSRV9FUlI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoYXJkd2FyZSBlcnJvclxuIiwgY21kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCQkJY2FzZSBDTURfQ09OTkVDVElPTl9MT1NUOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKLQkJCQkJImNvbm5lY3Rpb24gbG9zdFxuIiwgY21kKTsKLQkJCQlzdGF0dXM9MDsKKwkJY2FzZSBDTURfUFJPVE9DT0xfRVJSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCBoYXMgIgorCQkJICAgICAgICJwcm90b2NvbCBlcnJvciBcbiIsIGNtZCk7CisJCQlzdGF0dXMgPSAwOwogCQkJYnJlYWs7Ci0JCQljYXNlIENNRF9BQk9SVEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgd2FzICIKLQkJCQkJImFib3J0ZWRcbiIsIGNtZCk7Ci0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX0hBUkRXQVJFX0VSUjoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiIGhhcmR3YXJlIGVycm9yXG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfQUJPUlRfRkFJTEVEOgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmVwb3J0cyAiCi0JCQkJCSJhYm9ydCBmYWlsZWRcbiIsIGNtZCk7Ci0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX0NPTk5FQ1RJT05fTE9TVDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgaGFkICIKKwkJCSAgICAgICAiY29ubmVjdGlvbiBsb3N0XG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogdW5zb2xpY2l0ZWQgIgotCQkJCQkiYWJvcnQgJXBcbiIsIGgtPmN0bHIsIGNtZCk7Ci0JCQkJaWYgKGNtZC0+cmV0cnlfY291bnQgPCBNQVhfQ01EX1JFVFJJRVMpIHsKLQkJCQkJcmV0cnlfY21kPTE7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJCSJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwKLQkJCQkJCWgtPmN0bHIsIGNtZCk7Ci0JCQkJCWNtZC0+cmV0cnlfY291bnQrKzsKLQkJCQl9IGVsc2UKLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkJImNjaXNzJWQ6ICVwIHJldHJpZWQgdG9vICIKLQkJCQkJCSJtYW55IHRpbWVzXG4iLCBoLT5jdGxyLCBjbWQpOwotCQkJCXN0YXR1cz0wOworCQljYXNlIENNRF9BQk9SVEVEOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCB3YXMgIgorCQkJICAgICAgICJhYm9ydGVkXG4iLCBjbWQpOworCQkJc3RhdHVzID0gMDsKIAkJCWJyZWFrOwotCQkJY2FzZSBDTURfVElNRU9VVDoKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHRpbWVkb3V0XG4iLAotCQkJCQljbWQpOwotCQkJCXN0YXR1cz0wOworCQljYXNlIENNRF9BQk9SVF9GQUlMRUQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY21kICVwIHJlcG9ydHMgIgorCQkJICAgICAgICJhYm9ydCBmYWlsZWRcbiIsIGNtZCk7CisJCQlzdGF0dXMgPSAwOwogCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgotCQkJCQkidW5rbm93biBzdGF0dXMgJXhcbiIsIGNtZCwgCi0JCQkJCQljbWQtPmVycl9pbmZvLT5Db21tYW5kU3RhdHVzKTsgCi0JCQkJc3RhdHVzPTA7CisJCWNhc2UgQ01EX1VOU09MSUNJVEVEX0FCT1JUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MlZDogdW5zb2xpY2l0ZWQgIgorCQkJICAgICAgICJhYm9ydCAlcFxuIiwgaC0+Y3RsciwgY21kKTsKKwkJCWlmIChjbWQtPnJldHJ5X2NvdW50IDwgTUFYX0NNRF9SRVRSSUVTKSB7CisJCQkJcmV0cnlfY21kID0gMTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJjY2lzcyVkOiByZXRyeWluZyAlcFxuIiwgaC0+Y3RsciwgY21kKTsKKwkJCQljbWQtPnJldHJ5X2NvdW50Kys7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJjY2lzcyVkOiAlcCByZXRyaWVkIHRvbyAiCisJCQkJICAgICAgICJtYW55IHRpbWVzXG4iLCBoLT5jdGxyLCBjbWQpOworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQljYXNlIENNRF9USU1FT1VUOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IGNtZCAlcCB0aW1lZG91dFxuIiwgY21kKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjbWQgJXAgcmV0dXJuZWQgIgorCQkJICAgICAgICJ1bmtub3duIHN0YXR1cyAleFxuIiwgY21kLAorCQkJICAgICAgIGNtZC0+ZXJyX2luZm8tPkNvbW1hbmRTdGF0dXMpOworCQkJc3RhdHVzID0gMDsKIAkJfQogCX0KIAkvKiBXZSBuZWVkIHRvIHJldHVybiB0aGlzIGNvbW1hbmQgKi8KLQlpZihyZXRyeV9jbWQpIHsKLQkJcmVzZW5kX2NjaXNzX2NtZChoLGNtZCk7CisJaWYgKHJldHJ5X2NtZCkgeworCQlyZXNlbmRfY2Npc3NfY21kKGgsIGNtZCk7CiAJCXJldHVybjsKLQl9CQorCX0KIAogCWNtZC0+cnEtPmNvbXBsZXRpb25fZGF0YSA9IGNtZDsKIAljbWQtPnJxLT5lcnJvcnMgPSBzdGF0dXM7CkBAIC0yMzM2LDEyICsyMzY1LDEyIEBACiAJYmxrX2NvbXBsZXRlX3JlcXVlc3QoY21kLT5ycSk7CiB9CiAKLS8qIAotICogR2V0IGEgcmVxdWVzdCBhbmQgc3VibWl0IGl0IHRvIHRoZSBjb250cm9sbGVyLiAKKy8qCisgKiBHZXQgYSByZXF1ZXN0IGFuZCBzdWJtaXQgaXQgdG8gdGhlIGNvbnRyb2xsZXIuCiAgKi8KIHN0YXRpYyB2b2lkIGRvX2NjaXNzX3JlcXVlc3QocmVxdWVzdF9xdWV1ZV90ICpxKQogewotCWN0bHJfaW5mb190ICpoPSBxLT5xdWV1ZWRhdGE7IAorCWN0bHJfaW5mb190ICpoID0gcS0+cXVldWVkYXRhOwogCUNvbW1hbmRMaXN0X3N0cnVjdCAqYzsKIAlpbnQgc3RhcnRfYmxrLCBzZWc7CiAJc3RydWN0IHJlcXVlc3QgKmNyZXE7CkBAIC0yMzUyLDE4ICsyMzgxLDE4IEBACiAKIAkvKiBXZSBjYWxsIHN0YXJ0X2lvIGhlcmUgaW4gY2FzZSB0aGVyZSBpcyBhIGNvbW1hbmQgd2FpdGluZyBvbiB0aGUKIAkgKiBxdWV1ZSB0aGF0IGhhcyBub3QgYmVlbiBzZW50LgotCSovCisJICovCiAJaWYgKGJsa19xdWV1ZV9wbHVnZ2VkKHEpKQogCQlnb3RvIHN0YXJ0aW87CiAKLXF1ZXVlOgorICAgICAgcXVldWU6CiAJY3JlcSA9IGVsdl9uZXh0X3JlcXVlc3QocSk7CiAJaWYgKCFjcmVxKQogCQlnb3RvIHN0YXJ0aW87CiAKIAlCVUdfT04oY3JlcS0+bnJfcGh5c19zZWdtZW50cyA+IE1BWFNHRU5UUklFUyk7CiAKLQlpZiAoKCBjID0gY21kX2FsbG9jKGgsIDEpKSA9PSBOVUxMKQorCWlmICgoYyA9IGNtZF9hbGxvYyhoLCAxKSkgPT0gTlVMTCkKIAkJZ290byBmdWxsOwogCiAJYmxrZGV2X2RlcXVldWVfcmVxdWVzdChjcmVxKTsKQEAgLTIzNzIsODEgKzI0MDEsODIgQEAKIAogCWMtPmNtZF90eXBlID0gQ01EX1JXUkVROwogCWMtPnJxID0gY3JlcTsKLQkKLQkvKiBmaWxsIGluIHRoZSByZXF1ZXN0ICovIAorCisJLyogZmlsbCBpbiB0aGUgcmVxdWVzdCAqLwogCWRydiA9IGNyZXEtPnJxX2Rpc2stPnByaXZhdGVfZGF0YTsKLQljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7ICAvLyB1bnVzZWQgaW4gc2ltcGxlIG1vZGUKKwljLT5IZWFkZXIuUmVwbHlRdWV1ZSA9IDA7CS8vIHVudXNlZCBpbiBzaW1wbGUgbW9kZQogCS8qIGdvdCBjb21tYW5kIGZyb20gcG9vbCwgc28gdXNlIHRoZSBjb21tYW5kIGJsb2NrIGluZGV4IGluc3RlYWQgKi8KIAkvKiBmb3IgZGlyZWN0IGxvb2t1cHMuICovCiAJLyogVGhlIGZpcnN0IDIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGNvbnRyb2xsZXIgZXJyb3IgcmVwb3J0aW5nLiAqLwogCWMtPkhlYWRlci5UYWcubG93ZXIgPSAoYy0+Y21kaW5kZXggPDwgMyk7Ci0JYy0+SGVhZGVyLlRhZy5sb3dlciB8PSAweDA0OyAvKiBmbGFnIGZvciBkaXJlY3QgbG9va3VwLiAqLwotCWMtPkhlYWRlci5MVU4uTG9nRGV2LlZvbElkPSBkcnYtPkx1bklEOworCWMtPkhlYWRlci5UYWcubG93ZXIgfD0gMHgwNDsJLyogZmxhZyBmb3IgZGlyZWN0IGxvb2t1cC4gKi8KKwljLT5IZWFkZXIuTFVOLkxvZ0Rldi5Wb2xJZCA9IGRydi0+THVuSUQ7CiAJYy0+SGVhZGVyLkxVTi5Mb2dEZXYuTW9kZSA9IDE7Ci0JYy0+UmVxdWVzdC5DREJMZW4gPSAxMDsgLy8gMTIgYnl0ZSBjb21tYW5kcyBub3QgaW4gRlcgeWV0OwotCWMtPlJlcXVlc3QuVHlwZS5UeXBlID0gIFRZUEVfQ01EOyAvLyBJdCBpcyBhIGNvbW1hbmQuIAotCWMtPlJlcXVlc3QuVHlwZS5BdHRyaWJ1dGUgPSBBVFRSX1NJTVBMRTsgCi0JYy0+UmVxdWVzdC5UeXBlLkRpcmVjdGlvbiA9IAotCQkocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBYRkVSX1JFQUQ6IFhGRVJfV1JJVEU7IAotCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7IC8vIERvbid0IHRpbWUgb3V0CQotCWMtPlJlcXVlc3QuQ0RCWzBdID0gKHJxX2RhdGFfZGlyKGNyZXEpID09IFJFQUQpID8gQ0NJU1NfUkVBRCA6IENDSVNTX1dSSVRFOworCWMtPlJlcXVlc3QuQ0RCTGVuID0gMTA7CS8vIDEyIGJ5dGUgY29tbWFuZHMgbm90IGluIEZXIHlldDsKKwljLT5SZXF1ZXN0LlR5cGUuVHlwZSA9IFRZUEVfQ01EOwkvLyBJdCBpcyBhIGNvbW1hbmQuCisJYy0+UmVxdWVzdC5UeXBlLkF0dHJpYnV0ZSA9IEFUVFJfU0lNUExFOworCWMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPQorCSAgICAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBYRkVSX1JFQUQgOiBYRkVSX1dSSVRFOworCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CS8vIERvbid0IHRpbWUgb3V0CisJYy0+UmVxdWVzdC5DREJbMF0gPQorCSAgICAocnFfZGF0YV9kaXIoY3JlcSkgPT0gUkVBRCkgPyBDQ0lTU19SRUFEIDogQ0NJU1NfV1JJVEU7CiAJc3RhcnRfYmxrID0gY3JlcS0+c2VjdG9yOwogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgImNpc3M6IHNlY3RvciA9JWQgbnJfc2VjdG9ycz0lZFxuIiwoaW50KSBjcmVxLT5zZWN0b3IsCi0JCShpbnQpIGNyZXEtPm5yX3NlY3RvcnMpOwkKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJjaXNzOiBzZWN0b3IgPSVkIG5yX3NlY3RvcnM9JWRcbiIsIChpbnQpY3JlcS0+c2VjdG9yLAorCSAgICAgICAoaW50KWNyZXEtPm5yX3NlY3RvcnMpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAlzZWcgPSBibGtfcnFfbWFwX3NnKHEsIGNyZXEsIHRtcF9zZyk7CiAKLQkvKiBnZXQgdGhlIERNQSByZWNvcmRzIGZvciB0aGUgc2V0dXAgKi8gCisJLyogZ2V0IHRoZSBETUEgcmVjb3JkcyBmb3IgdGhlIHNldHVwICovCiAJaWYgKGMtPlJlcXVlc3QuVHlwZS5EaXJlY3Rpb24gPT0gWEZFUl9SRUFEKQogCQlkaXIgPSBQQ0lfRE1BX0ZST01ERVZJQ0U7CiAJZWxzZQogCQlkaXIgPSBQQ0lfRE1BX1RPREVWSUNFOwogCi0JZm9yIChpPTA7IGk8c2VnOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBzZWc7IGkrKykgewogCQljLT5TR1tpXS5MZW4gPSB0bXBfc2dbaV0ubGVuZ3RoOwogCQl0ZW1wNjQudmFsID0gKF9fdTY0KSBwY2lfbWFwX3BhZ2UoaC0+cGRldiwgdG1wX3NnW2ldLnBhZ2UsCi0JCQkgCQkgIHRtcF9zZ1tpXS5vZmZzZXQsIHRtcF9zZ1tpXS5sZW5ndGgsCi0JCQkJCSAgZGlyKTsKKwkJCQkJCSAgdG1wX3NnW2ldLm9mZnNldCwKKwkJCQkJCSAgdG1wX3NnW2ldLmxlbmd0aCwgZGlyKTsKIAkJYy0+U0dbaV0uQWRkci5sb3dlciA9IHRlbXA2NC52YWwzMi5sb3dlcjsKLSAgICAgICAgICAgICAgICBjLT5TR1tpXS5BZGRyLnVwcGVyID0gdGVtcDY0LnZhbDMyLnVwcGVyOwotICAgICAgICAgICAgICAgIGMtPlNHW2ldLkV4dCA9IDA7ICAvLyB3ZSBhcmUgbm90IGNoYWluaW5nCisJCWMtPlNHW2ldLkFkZHIudXBwZXIgPSB0ZW1wNjQudmFsMzIudXBwZXI7CisJCWMtPlNHW2ldLkV4dCA9IDA7CS8vIHdlIGFyZSBub3QgY2hhaW5pbmcKIAl9Ci0JLyogdHJhY2sgaG93IG1hbnkgU0cgZW50cmllcyB3ZSBhcmUgdXNpbmcgKi8gCi0JaWYoIHNlZyA+IGgtPm1heFNHKQotCQloLT5tYXhTRyA9IHNlZzsgCisJLyogdHJhY2sgaG93IG1hbnkgU0cgZW50cmllcyB3ZSBhcmUgdXNpbmcgKi8KKwlpZiAoc2VnID4gaC0+bWF4U0cpCisJCWgtPm1heFNHID0gc2VnOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiY2Npc3M6IFN1Ym1pdHRpbmcgJWQgc2VjdG9ycyBpbiAlZCBzZWdtZW50c1xuIiwgY3JlcS0+bnJfc2VjdG9ycywgc2VnKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJjY2lzczogU3VibWl0dGluZyAlZCBzZWN0b3JzIGluICVkIHNlZ21lbnRzXG4iLAorCSAgICAgICBjcmVxLT5ucl9zZWN0b3JzLCBzZWcpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKIAljLT5IZWFkZXIuU0dMaXN0ID0gYy0+SGVhZGVyLlNHVG90YWwgPSBzZWc7Ci0JYy0+UmVxdWVzdC5DREJbMV09IDA7Ci0JYy0+UmVxdWVzdC5DREJbMl09IChzdGFydF9ibGsgPj4gMjQpICYgMHhmZjsJLy9NU0IKLQljLT5SZXF1ZXN0LkNEQlszXT0gKHN0YXJ0X2JsayA+PiAxNikgJiAweGZmOwotCWMtPlJlcXVlc3QuQ0RCWzRdPSAoc3RhcnRfYmxrID4+ICA4KSAmIDB4ZmY7Ci0JYy0+UmVxdWVzdC5DREJbNV09IHN0YXJ0X2JsayAmIDB4ZmY7Ci0JYy0+UmVxdWVzdC5DREJbNl09IDA7IC8vIChzZWN0ID4+IDI0KSAmIDB4ZmY7IE1TQgotCWMtPlJlcXVlc3QuQ0RCWzddPSAoY3JlcS0+bnJfc2VjdG9ycyA+PiAgOCkgJiAweGZmOyAKLQljLT5SZXF1ZXN0LkNEQls4XT0gY3JlcS0+bnJfc2VjdG9ycyAmIDB4ZmY7IAorCWMtPlJlcXVlc3QuQ0RCWzFdID0gMDsKKwljLT5SZXF1ZXN0LkNEQlsyXSA9IChzdGFydF9ibGsgPj4gMjQpICYgMHhmZjsJLy9NU0IKKwljLT5SZXF1ZXN0LkNEQlszXSA9IChzdGFydF9ibGsgPj4gMTYpICYgMHhmZjsKKwljLT5SZXF1ZXN0LkNEQls0XSA9IChzdGFydF9ibGsgPj4gOCkgJiAweGZmOworCWMtPlJlcXVlc3QuQ0RCWzVdID0gc3RhcnRfYmxrICYgMHhmZjsKKwljLT5SZXF1ZXN0LkNEQls2XSA9IDA7CS8vIChzZWN0ID4+IDI0KSAmIDB4ZmY7IE1TQgorCWMtPlJlcXVlc3QuQ0RCWzddID0gKGNyZXEtPm5yX3NlY3RvcnMgPj4gOCkgJiAweGZmOworCWMtPlJlcXVlc3QuQ0RCWzhdID0gY3JlcS0+bnJfc2VjdG9ycyAmIDB4ZmY7CiAJYy0+UmVxdWVzdC5DREJbOV0gPSBjLT5SZXF1ZXN0LkNEQlsxMV0gPSBjLT5SZXF1ZXN0LkNEQlsxMl0gPSAwOwogCiAJc3Bpbl9sb2NrX2lycShxLT5xdWV1ZV9sb2NrKTsKIAotCWFkZFEoJihoLT5yZXFRKSxjKTsKKwlhZGRRKCYoaC0+cmVxUSksIGMpOwogCWgtPlFkZXB0aCsrOwotCWlmKGgtPlFkZXB0aCA+IGgtPm1heFFzaW5jZWluaXQpCi0JCWgtPm1heFFzaW5jZWluaXQgPSBoLT5RZGVwdGg7IAorCWlmIChoLT5RZGVwdGggPiBoLT5tYXhRc2luY2Vpbml0KQorCQloLT5tYXhRc2luY2Vpbml0ID0gaC0+UWRlcHRoOwogCiAJZ290byBxdWV1ZTsKLWZ1bGw6CisgICAgICBmdWxsOgogCWJsa19zdG9wX3F1ZXVlKHEpOwotc3RhcnRpbzoKKyAgICAgIHN0YXJ0aW86CiAJLyogV2Ugd2lsbCBhbHJlYWR5IGhhdmUgdGhlIGRyaXZlciBsb2NrIGhlcmUgc28gbm90IG5lZWQKIAkgKiB0byBsb2NrIGl0LgotCSovCisJICovCiAJc3RhcnRfaW8oaCk7CiB9CiAKQEAgLTI0NzMsNyArMjUwMyw3IEBACiBzdGF0aWMgaW5saW5lIGludCBpbnRlcnJ1cHRfcGVuZGluZyhjdGxyX2luZm9fdCAqaCkKIHsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQlyZXR1cm4gKCBoLT5hY2Nlc3MuaW50cl9wZW5kaW5nKGgpIAorCXJldHVybiAoaC0+YWNjZXNzLmludHJfcGVuZGluZyhoKQogCQl8fCAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA+IDApKTsKICNlbHNlCiAJcmV0dXJuIGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCk7CkBAIC0yNDgzLDExICsyNTEzLDExIEBACiBzdGF0aWMgaW5saW5lIGxvbmcgaW50ZXJydXB0X25vdF9mb3JfdXMoY3Rscl9pbmZvX3QgKmgpCiB7CiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCi0JcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwgCi0JCSAoaC0+aW50ZXJydXB0c19lbmFibGVkID09IDApKSAKLQkgICAgICAmJiAoaC0+c2NzaV9yZWplY3RzLm5jb21wbGV0aW9ucyA9PSAwKSk7CisJcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwKKwkJIChoLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPT0gMCkpCisJCSYmIChoLT5zY3NpX3JlamVjdHMubmNvbXBsZXRpb25zID09IDApKTsKICNlbHNlCi0JcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwgCisJcmV0dXJuICgoKGgtPmFjY2Vzcy5pbnRyX3BlbmRpbmcoaCkgPT0gMCkgfHwKIAkJIChoLT5pbnRlcnJ1cHRzX2VuYWJsZWQgPT0gMCkpKTsKICNlbmRpZgogfQpAQCAtMjUwOSwxMiArMjUzOSwxNCBAQAogCSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soaC0+Y3RsciksIGZsYWdzKTsKIAl3aGlsZSAoaW50ZXJydXB0X3BlbmRpbmcoaCkpIHsKLQkJd2hpbGUoKGEgPSBnZXRfbmV4dF9jb21wbGV0aW9uKGgpKSAhPSBGSUZPX0VNUFRZKSB7CisJCXdoaWxlICgoYSA9IGdldF9uZXh0X2NvbXBsZXRpb24oaCkpICE9IEZJRk9fRU1QVFkpIHsKIAkJCWExID0gYTsKIAkJCWlmICgoYSAmIDB4MDQpKSB7CiAJCQkJYTIgPSAoYSA+PiAzKTsKIAkJCQlpZiAoYTIgPj0gTlJfQ01EUykgewotCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogY29udHJvbGxlciBjY2lzcyVkIGZhaWxlZCwgc3RvcHBpbmcuXG4iLCBoLT5jdGxyKTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgImNjaXNzOiBjb250cm9sbGVyIGNjaXNzJWQgZmFpbGVkLCBzdG9wcGluZy5cbiIsCisJCQkJCSAgICAgICBoLT5jdGxyKTsKIAkJCQkJZmFpbF9hbGxfY21kcyhoLT5jdGxyKTsKIAkJCQkJcmV0dXJuIElSUV9IQU5ETEVEOwogCQkJCX0KQEAgLTI1MjMsMjIgKzI1NTUsMjQgQEAKIAkJCQlhID0gYy0+YnVzYWRkcjsKIAogCQkJfSBlbHNlIHsKLQkJCWEgJj0gfjM7CisJCQkJYSAmPSB+MzsKIAkJCQlpZiAoKGMgPSBoLT5jbXBRKSA9PSBOVUxMKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBDb21wbGV0aW9uIG9mICUwOHggaWdub3JlZFxuIiwgYTEpOwotCQkJCWNvbnRpbnVlOwkKLQkJCX0gCi0JCQl3aGlsZShjLT5idXNhZGRyICE9IGEpIHsKLQkJCQljID0gYy0+bmV4dDsKLQkJCQlpZiAoYyA9PSBoLT5jbXBRKSAKLQkJCQkJYnJlYWs7Ci0JCQl9CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJICAgICAgICJjY2lzczogQ29tcGxldGlvbiBvZiAlMDh4IGlnbm9yZWRcbiIsCisJCQkJCSAgICAgICBhMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQl3aGlsZSAoYy0+YnVzYWRkciAhPSBhKSB7CisJCQkJCWMgPSBjLT5uZXh0OworCQkJCQlpZiAoYyA9PSBoLT5jbXBRKQorCQkJCQkJYnJlYWs7CisJCQkJfQogCQkJfQogCQkJLyoKIAkJCSAqIElmIHdlJ3ZlIGZvdW5kIHRoZSBjb21tYW5kLCB0YWtlIGl0IG9mZiB0aGUKIAkJCSAqIGNvbXBsZXRpb24gUSBhbmQgZnJlZSBpdAogCQkJICovCi0JCQkgaWYgKGMtPmJ1c2FkZHIgPT0gYSkgeworCQkJaWYgKGMtPmJ1c2FkZHIgPT0gYSkgewogCQkJCXJlbW92ZVEoJmgtPmNtcFEsIGMpOwogCQkJCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfUldSRVEpIHsKIAkJCQkJY29tcGxldGVfY29tbWFuZChoLCBjLCAwKTsKQEAgLTI1NTQsMTMwICsyNTg4LDExOCBAQAogCQl9CiAJfQogCi0gCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzIHRoYXQgY2FuCi0gCSAqIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuICBJZiBzbyB0aGVuIGV4aXQuICBXZSBkbyB0aGlzIGNoZWNrIGhlcmUKLSAJICogaW4gY2FzZSB0aGUgaW50ZXJydXB0IHdlIHNlcnZpY2VkIHdhcyBmcm9tIGFuIGlvY3RsIGFuZCBkaWQgbm90Ci0gCSAqIGZyZWUgYW55IG5ldyBjb21tYW5kcy4KKwkvKiBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBtYXhlZCBvdXQgdGhlIG51bWJlciBvZiBjb21tYW5kcyB0aGF0IGNhbgorCSAqIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuICBJZiBzbyB0aGVuIGV4aXQuICBXZSBkbyB0aGlzIGNoZWNrIGhlcmUKKwkgKiBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2Ugc2VydmljZWQgd2FzIGZyb20gYW4gaW9jdGwgYW5kIGRpZCBub3QKKwkgKiBmcmVlIGFueSBuZXcgY29tbWFuZHMuCiAJICovCi0gCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKSkgPT0gTlJfQ01EUykKLSAJCWdvdG8gY2xlYW51cDsKKwlpZiAoKGZpbmRfZmlyc3RfemVyb19iaXQoaC0+Y21kX3Bvb2xfYml0cywgTlJfQ01EUykpID09IE5SX0NNRFMpCisJCWdvdG8gY2xlYW51cDsKIAotIAkvKiBXZSBoYXZlIHJvb20gb24gdGhlIHF1ZXVlIGZvciBtb3JlIGNvbW1hbmRzLiAgTm93IHdlIG5lZWQgdG8gcXVldWUKLSAJICogdGhlbSB1cC4gIFdlIHdpbGwgYWxzbyBrZWVwIHRyYWNrIG9mIHRoZSBuZXh0IHF1ZXVlIHRvIHJ1biBzbwotIAkgKiB0aGF0IGV2ZXJ5IHF1ZXVlIGdldHMgYSBjaGFuY2UgdG8gYmUgc3RhcnRlZCBmaXJzdC4KLSAJKi8KLQlmb3IgKGo9MDsgaiA8IGgtPmhpZ2hlc3RfbHVuICsgMTsgaisrKXsKKwkvKiBXZSBoYXZlIHJvb20gb24gdGhlIHF1ZXVlIGZvciBtb3JlIGNvbW1hbmRzLiAgTm93IHdlIG5lZWQgdG8gcXVldWUKKwkgKiB0aGVtIHVwLiAgV2Ugd2lsbCBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIG5leHQgcXVldWUgdG8gcnVuIHNvCisJICogdGhhdCBldmVyeSBxdWV1ZSBnZXRzIGEgY2hhbmNlIHRvIGJlIHN0YXJ0ZWQgZmlyc3QuCisJICovCisJZm9yIChqID0gMDsgaiA8IGgtPmhpZ2hlc3RfbHVuICsgMTsgaisrKSB7CiAJCWludCBjdXJyX3F1ZXVlID0gKHN0YXJ0X3F1ZXVlICsgaikgJSAoaC0+aGlnaGVzdF9sdW4gKyAxKTsKLSAJCS8qIG1ha2Ugc3VyZSB0aGUgZGlzayBoYXMgYmVlbiBhZGRlZCBhbmQgdGhlIGRyaXZlIGlzIHJlYWwKLSAJCSAqIGJlY2F1c2UgdGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIG1pZGRsZSBvZiBpbml0X29uZS4KLSAJCSovCi0JCWlmKCEoaC0+ZHJ2W2N1cnJfcXVldWVdLnF1ZXVlKSB8fAotCQkgCQkgICAhKGgtPmRydltjdXJyX3F1ZXVlXS5oZWFkcykpCi0gCQkJY29udGludWU7Ci0gCQlibGtfc3RhcnRfcXVldWUoaC0+Z2VuZGlza1tjdXJyX3F1ZXVlXS0+cXVldWUpOworCQkvKiBtYWtlIHN1cmUgdGhlIGRpc2sgaGFzIGJlZW4gYWRkZWQgYW5kIHRoZSBkcml2ZSBpcyByZWFsCisJCSAqIGJlY2F1c2UgdGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIG1pZGRsZSBvZiBpbml0X29uZS4KKwkJICovCisJCWlmICghKGgtPmRydltjdXJyX3F1ZXVlXS5xdWV1ZSkgfHwgIShoLT5kcnZbY3Vycl9xdWV1ZV0uaGVhZHMpKQorCQkJY29udGludWU7CisJCWJsa19zdGFydF9xdWV1ZShoLT5nZW5kaXNrW2N1cnJfcXVldWVdLT5xdWV1ZSk7CiAKLSAJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzCi0gCQkgKiB0aGF0IGNhbiBiZSBwbGFjZWQgb24gdGhlIHF1ZXVlLgotIAkJKi8KLSAJCWlmICgoZmluZF9maXJzdF96ZXJvX2JpdChoLT5jbWRfcG9vbF9iaXRzLCBOUl9DTURTKSkgPT0gTlJfQ01EUykKLSAJCXsKLSAJCQlpZiAoY3Vycl9xdWV1ZSA9PSBzdGFydF9xdWV1ZSl7Ci0JCQkJaC0+bmV4dF90b19ydW4gPSAoc3RhcnRfcXVldWUgKyAxKSAlIChoLT5oaWdoZXN0X2x1biArIDEpOwotIAkJCQlnb3RvIGNsZWFudXA7Ci0gCQkJfSBlbHNlIHsKLSAJCQkJaC0+bmV4dF90b19ydW4gPSBjdXJyX3F1ZXVlOwotIAkJCQlnb3RvIGNsZWFudXA7Ci0gCX0KLSAJCX0gZWxzZSB7CisJCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIG1heGVkIG91dCB0aGUgbnVtYmVyIG9mIGNvbW1hbmRzCisJCSAqIHRoYXQgY2FuIGJlIHBsYWNlZCBvbiB0aGUgcXVldWUuCisJCSAqLworCQlpZiAoKGZpbmRfZmlyc3RfemVyb19iaXQoaC0+Y21kX3Bvb2xfYml0cywgTlJfQ01EUykpID09IE5SX0NNRFMpIHsKKwkJCWlmIChjdXJyX3F1ZXVlID09IHN0YXJ0X3F1ZXVlKSB7CisJCQkJaC0+bmV4dF90b19ydW4gPQorCQkJCSAgICAoc3RhcnRfcXVldWUgKyAxKSAlIChoLT5oaWdoZXN0X2x1biArIDEpOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0gZWxzZSB7CisJCQkJaC0+bmV4dF90b19ydW4gPSBjdXJyX3F1ZXVlOworCQkJCWdvdG8gY2xlYW51cDsKKwkJCX0KKwkJfSBlbHNlIHsKIAkJCWN1cnJfcXVldWUgPSAoY3Vycl9xdWV1ZSArIDEpICUgKGgtPmhpZ2hlc3RfbHVuICsgMSk7Ci0gCQl9Ci0gCX0KKwkJfQorCX0KIAotY2xlYW51cDoKKyAgICAgIGNsZWFudXA6CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGgtPmN0bHIpLCBmbGFncyk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQotLyogCi0gKiAgV2UgY2Fubm90IHJlYWQgdGhlIHN0cnVjdHVyZSBkaXJlY3RseSwgZm9yIHBvcnRhYmxpdHkgd2UgbXVzdCB1c2UgCisKKy8qCisgKiAgV2UgY2Fubm90IHJlYWQgdGhlIHN0cnVjdHVyZSBkaXJlY3RseSwgZm9yIHBvcnRhYmlsaXR5IHdlIG11c3QgdXNlCiAgKiAgIHRoZSBpbyBmdW5jdGlvbnMuCi0gKiAgIFRoaXMgaXMgZm9yIGRlYnVnIG9ubHkuIAorICogICBUaGlzIGlzIGZvciBkZWJ1ZyBvbmx5LgogICovCiAjaWZkZWYgQ0NJU1NfREVCVUcKLXN0YXRpYyB2b2lkIHByaW50X2NmZ190YWJsZSggQ2ZnVGFibGVfc3RydWN0ICp0YikKK3N0YXRpYyB2b2lkIHByaW50X2NmZ190YWJsZShDZmdUYWJsZV9zdHJ1Y3QgKnRiKQogewogCWludCBpOwogCWNoYXIgdGVtcF9uYW1lWzE3XTsKIAogCXByaW50aygiQ29udHJvbGxlciBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uXG4iKTsKIAlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JZm9yKGk9MDtpPDQ7aSsrKQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAJCXRlbXBfbmFtZVtpXSA9IHJlYWRiKCYodGItPlNpZ25hdHVyZVtpXSkpOwotCXRlbXBfbmFtZVs0XT0nXDAnOwotCXByaW50aygiICAgU2lnbmF0dXJlID0gJXNcbiIsIHRlbXBfbmFtZSk7IAorCXRlbXBfbmFtZVs0XSA9ICdcMCc7CisJcHJpbnRrKCIgICBTaWduYXR1cmUgPSAlc1xuIiwgdGVtcF9uYW1lKTsKIAlwcmludGsoIiAgIFNwZWMgTnVtYmVyID0gJWRcbiIsIHJlYWRsKCYodGItPlNwZWNWYWxlbmNlKSkpOwotCXByaW50aygiICAgVHJhbnNwb3J0IG1ldGhvZHMgc3VwcG9ydGVkID0gMHgleFxuIiwgCi0JCQkJcmVhZGwoJih0Yi0+IFRyYW5zcG9ydFN1cHBvcnQpKSk7Ci0JcHJpbnRrKCIgICBUcmFuc3BvcnQgbWV0aG9kcyBhY3RpdmUgPSAweCV4XG4iLCAKLQkJCQlyZWFkbCgmKHRiLT5UcmFuc3BvcnRBY3RpdmUpKSk7Ci0JcHJpbnRrKCIgICBSZXF1ZXN0ZWQgdHJhbnNwb3J0IE1ldGhvZCA9IDB4JXhcbiIsIAotCQkJcmVhZGwoJih0Yi0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKSk7Ci0JcHJpbnRrKCIgICBDb2FsZXNlIEludGVycnVwdCBEZWxheSA9IDB4JXhcbiIsIAotCQkJcmVhZGwoJih0Yi0+SG9zdFdyaXRlLkNvYWxJbnREZWxheSkpKTsKLQlwcmludGsoIiAgIENvYWxlc2UgSW50ZXJydXB0IENvdW50ID0gMHgleFxuIiwgCi0JCQlyZWFkbCgmKHRiLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KSkpOwotCXByaW50aygiICAgTWF4IG91dHN0YW5kaW5nIGNvbW1hbmRzID0gMHglZFxuIiwgCi0JCQlyZWFkbCgmKHRiLT5DbWRzT3V0TWF4KSkpOwotCXByaW50aygiICAgQnVzIFR5cGVzID0gMHgleFxuIiwgcmVhZGwoJih0Yi0+IEJ1c1R5cGVzKSkpOwotCWZvcihpPTA7aTwxNjtpKyspCisJcHJpbnRrKCIgICBUcmFuc3BvcnQgbWV0aG9kcyBzdXBwb3J0ZWQgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5UcmFuc3BvcnRTdXBwb3J0KSkpOworCXByaW50aygiICAgVHJhbnNwb3J0IG1ldGhvZHMgYWN0aXZlID0gMHgleFxuIiwKKwkgICAgICAgcmVhZGwoJih0Yi0+VHJhbnNwb3J0QWN0aXZlKSkpOworCXByaW50aygiICAgUmVxdWVzdGVkIHRyYW5zcG9ydCBNZXRob2QgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5Ib3N0V3JpdGUuVHJhbnNwb3J0UmVxdWVzdCkpKTsKKwlwcmludGsoIiAgIENvYWxlc2NlIEludGVycnVwdCBEZWxheSA9IDB4JXhcbiIsCisJICAgICAgIHJlYWRsKCYodGItPkhvc3RXcml0ZS5Db2FsSW50RGVsYXkpKSk7CisJcHJpbnRrKCIgICBDb2FsZXNjZSBJbnRlcnJ1cHQgQ291bnQgPSAweCV4XG4iLAorCSAgICAgICByZWFkbCgmKHRiLT5Ib3N0V3JpdGUuQ29hbEludENvdW50KSkpOworCXByaW50aygiICAgTWF4IG91dHN0YW5kaW5nIGNvbW1hbmRzID0gMHglZFxuIiwKKwkgICAgICAgcmVhZGwoJih0Yi0+Q21kc091dE1heCkpKTsKKwlwcmludGsoIiAgIEJ1cyBUeXBlcyA9IDB4JXhcbiIsIHJlYWRsKCYodGItPkJ1c1R5cGVzKSkpOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogCQl0ZW1wX25hbWVbaV0gPSByZWFkYigmKHRiLT5TZXJ2ZXJOYW1lW2ldKSk7CiAJdGVtcF9uYW1lWzE2XSA9ICdcMCc7CiAJcHJpbnRrKCIgICBTZXJ2ZXIgTmFtZSA9ICVzXG4iLCB0ZW1wX25hbWUpOwotCXByaW50aygiICAgSGVhcnRiZWF0IENvdW50ZXIgPSAweCV4XG5cblxuIiwgCi0JCQlyZWFkbCgmKHRiLT5IZWFydEJlYXQpKSk7CisJcHJpbnRrKCIgICBIZWFydGJlYXQgQ291bnRlciA9IDB4JXhcblxuXG4iLCByZWFkbCgmKHRiLT5IZWFydEJlYXQpKSk7CiB9Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAotc3RhdGljIHZvaWQgcmVsZWFzZV9pb19tZW0oY3Rscl9pbmZvX3QgKmMpCi17Ci0JLyogaWYgSU8gbWVtIHdhcyBub3QgcHJvdGVjdGVkIGRvIG5vdGhpbmcgKi8KLQlpZiggYy0+aW9fbWVtX2FkZHIgPT0gMCkKLQkJcmV0dXJuOwotCXJlbGVhc2VfcmVnaW9uKGMtPmlvX21lbV9hZGRyLCBjLT5pb19tZW1fbGVuZ3RoKTsKLQljLT5pb19tZW1fYWRkciA9IDA7Ci0JYy0+aW9fbWVtX2xlbmd0aCA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmluZF9QQ0lfQkFSX2luZGV4KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQkJCXVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9hZGRyKQorc3RhdGljIGludCBmaW5kX1BDSV9CQVJfaW5kZXgoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVuc2lnbmVkIGxvbmcgcGNpX2Jhcl9hZGRyKQogewogCWludCBpLCBvZmZzZXQsIG1lbV90eXBlLCBiYXJfdHlwZTsKLQlpZiAocGNpX2Jhcl9hZGRyID09IFBDSV9CQVNFX0FERFJFU1NfMCkgLyogbG9va2luZyBmb3IgQkFSIHplcm8/ICovCisJaWYgKHBjaV9iYXJfYWRkciA9PSBQQ0lfQkFTRV9BRERSRVNTXzApCS8qIGxvb2tpbmcgZm9yIEJBUiB6ZXJvPyAqLwogCQlyZXR1cm4gMDsKIAlvZmZzZXQgPSAwOwotCWZvciAoaT0wOyBpPERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCWJhcl90eXBlID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYKLQkJCVBDSV9CQVNFX0FERFJFU1NfU1BBQ0U7CisJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CisJCWJhcl90eXBlID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYgUENJX0JBU0VfQUREUkVTU19TUEFDRTsKIAkJaWYgKGJhcl90eXBlID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCiAJCQlvZmZzZXQgKz0gNDsKIAkJZWxzZSB7CiAJCQltZW1fdHlwZSA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKSAmCi0JCQkJUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV9NQVNLOworCQkJICAgIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfTUFTSzsKIAkJCXN3aXRjaCAobWVtX3R5cGUpIHsKLQkJCQljYXNlIFBDSV9CQVNFX0FERFJFU1NfTUVNX1RZUEVfMzI6Ci0JCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOgotCQkJCQlvZmZzZXQgKz0gNDsgLyogMzIgYml0ICovCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDoKLQkJCQkJb2Zmc2V0ICs9IDg7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8qIHJlc2VydmVkIGluIFBDSSAyLjIgKi8KLQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFzZSBhZGRyZXNzIGlzIGludmFsaWRcbiIpOwotCQkJICAgICAgIAkJcmV0dXJuIC0xOworCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzMyOgorCQkJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOgorCQkJCW9mZnNldCArPSA0OwkvKiAzMiBiaXQgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDoKKwkJCQlvZmZzZXQgKz0gODsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CS8qIHJlc2VydmVkIGluIFBDSSAyLjIgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJCYXNlIGFkZHJlc3MgaXMgaW52YWxpZFxuIik7CisJCQkJcmV0dXJuIC0xOwogCQkJCWJyZWFrOwogCQkJfQogCQl9Ci0gCQlpZiAob2Zmc2V0ID09IHBjaV9iYXJfYWRkciAtIFBDSV9CQVNFX0FERFJFU1NfMCkKLQkJCXJldHVybiBpKzE7CisJCWlmIChvZmZzZXQgPT0gcGNpX2Jhcl9hZGRyIC0gUENJX0JBU0VfQUREUkVTU18wKQorCQkJcmV0dXJuIGkgKyAxOwogCX0KIAlyZXR1cm4gLTE7CiB9CkBAIC0yNjg2LDUzICsyNzA4LDU0IEBACiAgKiBjb250cm9sbGVycyB0aGF0IGFyZSBjYXBhYmxlLiBJZiBub3QsIHdlIHVzZSBJTy1BUElDIG1vZGUuCiAgKi8KIAotc3RhdGljIHZvaWQgX19kZXZpbml0IGNjaXNzX2ludGVycnVwdF9tb2RlKGN0bHJfaW5mb190ICpjLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgX191MzIgYm9hcmRfaWQpCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY2Npc3NfaW50ZXJydXB0X21vZGUoY3Rscl9pbmZvX3QgKmMsCisJCQkJCSAgIHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBfX3UzMiBib2FyZF9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJX01TSQotICAgICAgICBpbnQgZXJyOwotICAgICAgICBzdHJ1Y3QgbXNpeF9lbnRyeSBjY2lzc19tc2l4X2VudHJpZXNbNF0gPSB7ezAsMH0sIHswLDF9LAotCQkJCQkJICAgezAsMn0sIHswLDN9fTsKKwlpbnQgZXJyOworCXN0cnVjdCBtc2l4X2VudHJ5IGNjaXNzX21zaXhfZW50cmllc1s0XSA9IHsgezAsIDB9LCB7MCwgMX0sCisJezAsIDJ9LCB7MCwgM30KKwl9OwogCiAJLyogU29tZSBib2FyZHMgYWR2ZXJ0aXNlIE1TSSBidXQgZG9uJ3QgcmVhbGx5IHN1cHBvcnQgaXQgKi8KIAlpZiAoKGJvYXJkX2lkID09IDB4NDA3MDBFMTEpIHx8Ci0JCShib2FyZF9pZCA9PSAweDQwODAwRTExKSB8fAotCQkoYm9hcmRfaWQgPT0gMHg0MDgyMEUxMSkgfHwKLQkJKGJvYXJkX2lkID09IDB4NDA4MzBFMTEpKQorCSAgICAoYm9hcmRfaWQgPT0gMHg0MDgwMEUxMSkgfHwKKwkgICAgKGJvYXJkX2lkID09IDB4NDA4MjBFMTEpIHx8IChib2FyZF9pZCA9PSAweDQwODMwRTExKSkKIAkJZ290byBkZWZhdWx0X2ludF9tb2RlOwogCi0gICAgICAgIGlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBwY2lfZW5hYmxlX21zaXgocGRldiwgY2Npc3NfbXNpeF9lbnRyaWVzLCA0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWVycikgewotICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50clswXSA9IGNjaXNzX21zaXhfZW50cmllc1swXS52ZWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5pbnRyWzFdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzFdLnZlY3RvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmludHJbMl0gPSBjY2lzc19tc2l4X2VudHJpZXNbMl0udmVjdG9yOwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW50clszXSA9IGNjaXNzX21zaXhfZW50cmllc1szXS52ZWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5tc2l4X3ZlY3RvciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnIgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogb25seSAlZCBNU0ktWCB2ZWN0b3JzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXZhaWxhYmxlXG4iLCBlcnIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogTVNJLVggaW5pdCBmYWlsZWQgJWRcbiIsCi0JCQkJCQllcnIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX01TSSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBjaV9lbmFibGVfbXNpKHBkZXYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5tc2lfdmVjdG9yID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IE1TSSBpbml0IGZhaWxlZFxuIik7Ci0gICAgICAgIAkJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotZGVmYXVsdF9pbnRfbW9kZToKLSNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJWCkpIHsKKwkJZXJyID0gcGNpX2VuYWJsZV9tc2l4KHBkZXYsIGNjaXNzX21zaXhfZW50cmllcywgNCk7CisJCWlmICghZXJyKSB7CisJCQljLT5pbnRyWzBdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzBdLnZlY3RvcjsKKwkJCWMtPmludHJbMV0gPSBjY2lzc19tc2l4X2VudHJpZXNbMV0udmVjdG9yOworCQkJYy0+aW50clsyXSA9IGNjaXNzX21zaXhfZW50cmllc1syXS52ZWN0b3I7CisJCQljLT5pbnRyWzNdID0gY2Npc3NfbXNpeF9lbnRyaWVzWzNdLnZlY3RvcjsKKwkJCWMtPm1zaXhfdmVjdG9yID0gMTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoZXJyID4gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IG9ubHkgJWQgTVNJLVggdmVjdG9ycyAiCisJCQkgICAgICAgImF2YWlsYWJsZVxuIiwgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBNU0ktWCBpbml0IGZhaWxlZCAlZFxuIiwKKwkJCSAgICAgICBlcnIpOworCQl9CisJfQorCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KHBkZXYsIFBDSV9DQVBfSURfTVNJKSkgeworCQlpZiAoIXBjaV9lbmFibGVfbXNpKHBkZXYpKSB7CisJCQljLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7CisJCQljLT5tc2lfdmVjdG9yID0gMTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBNU0kgaW5pdCBmYWlsZWRcbiIpOworCQkJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOworCQkJcmV0dXJuOworCQl9CisJfQorICAgICAgZGVmYXVsdF9pbnRfbW9kZToKKyNlbmRpZgkJCQkvKiBDT05GSUdfUENJX01TSSAqLwogCS8qIGlmIHdlIGdldCBoZXJlIHdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbW9kZSAqLwotICAgICAgICBjLT5pbnRyW1NJTVBMRV9NT0RFX0lOVF0gPSBwZGV2LT5pcnE7CisJYy0+aW50cltTSU1QTEVfTU9ERV9JTlRdID0gcGRldi0+aXJxOwogCXJldHVybjsKIH0KIApAQCAtMjc0Myw1OCArMjc2Niw0MCBAQAogCV9fdTY0IGNmZ19vZmZzZXQ7CiAJX191MzIgY2ZnX2Jhc2VfYWRkcjsKIAlfX3U2NCBjZmdfYmFzZV9hZGRyX2luZGV4OwotCWludCBpOworCWludCBpLCBlcnI7CiAKIAkvKiBjaGVjayB0byBzZWUgaWYgY29udHJvbGxlciBoYXMgYmVlbiBkaXNhYmxlZCAqLwogCS8qIEJFRk9SRSB0cnlpbmcgdG8gZW5hYmxlIGl0ICovCi0JKHZvaWQpIHBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCZjb21tYW5kKTsKLQlpZighKGNvbW1hbmQgJiAweDAyKSkKLQl7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBjb250cm9sbGVyIGFwcGVhcnMgdG8gYmUgZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4oLTEpOworCSh2b2lkKXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCAmY29tbWFuZCk7CisJaWYgKCEoY29tbWFuZCAmIDB4MDIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjY2lzczogY29udHJvbGxlciBhcHBlYXJzIHRvIGJlIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKQotCXsKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byBFbmFibGUgUENJIGRldmljZVxuIik7Ci0JCXJldHVybiggLTEpOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImNjaXNzIik7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBDYW5ub3Qgb2J0YWluIFBDSSByZXNvdXJjZXMsICIKKwkJICAgICAgICJhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyX291dF9kaXNhYmxlX3BkZXY7CiAJfQogCiAJc3Vic3lzdGVtX3ZlbmRvcl9pZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CiAJc3Vic3lzdGVtX2RldmljZV9pZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CiAJYm9hcmRfaWQgPSAoKChfX3UzMikgKHN1YnN5c3RlbV9kZXZpY2VfaWQgPDwgMTYpICYgMHhmZmZmMDAwMCkgfAotCQkJCQlzdWJzeXN0ZW1fdmVuZG9yX2lkKTsKLQotCS8qIHNlYXJjaCBmb3Igb3VyIElPIHJhbmdlIHNvIHdlIGNhbiBwcm90ZWN0IGl0ICovCi0JZm9yKGk9MDsgaTxERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykKLQl7Ci0JCS8qIGlzIHRoaXMgYW4gSU8gcmFuZ2UgKi8gCi0JCWlmKCBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgaSkgJiAweDAxICkgewotCQkJYy0+aW9fbWVtX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgaSk7Ci0JCQljLT5pb19tZW1fbGVuZ3RoID0gcGNpX3Jlc291cmNlX2VuZChwZGV2LCBpKSAtCi0JCQkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpICsxOwotI2lmZGVmIENDSVNTX0RFQlVHCi0JCQlwcmludGsoIklPIHZhbHVlIGZvdW5kIGJhc2VfYWRkclslZF0gJWx4ICVseFxuIiwgaSwKLQkJCQljLT5pb19tZW1fYWRkciwgYy0+aW9fbWVtX2xlbmd0aCk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQkJCS8qIHJlZ2lzdGVyIHRoZSBJTyByYW5nZSAqLyAKLQkJCWlmKCFyZXF1ZXN0X3JlZ2lvbiggYy0+aW9fbWVtX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+aW9fbWVtX2xlbmd0aCwgImNjaXNzIikpCi0JCQl7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3MgSS9PIG1lbW9yeSByYW5nZSBhbHJlYWR5IGluIHVzZSBhZGRyPSVseCBsZW5ndGg9JWxkXG4iLAotCQkJCWMtPmlvX21lbV9hZGRyLCBjLT5pb19tZW1fbGVuZ3RoKTsKLQkJCQljLT5pb19tZW1fYWRkcj0gMDsKLQkJCQljLT5pb19tZW1fbGVuZ3RoID0gMDsKLQkJCX0gCi0JCQlicmVhazsKLQkJfQotCX0KKwkJICAgIHN1YnN5c3RlbV92ZW5kb3JfaWQpOwogCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNvbW1hbmQgPSAleFxuIiwgY29tbWFuZCk7CiAJcHJpbnRrKCJpcnEgPSAleFxuIiwgcGRldi0+aXJxKTsKIAlwcmludGsoImJvYXJkX2lkID0gJXhcbiIsIGJvYXJkX2lkKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAvKiBJZiB0aGUga2VybmVsIHN1cHBvcnRzIE1TSS9NU0ktWCB3ZSB3aWxsIHRyeSB0byBlbmFibGUgdGhhdCBmdW5jdGlvbmFsaXR5LAogICogZWxzZSB3ZSB1c2UgdGhlIElPLUFQSUMgaW50ZXJydXB0IGFzc2lnbmVkIHRvIHVzIGJ5IHN5c3RlbSBST00uCkBAIC0yODAzLDI3ICsyODA4LDI4IEBACiAKIAkvKgogCSAqIE1lbW9yeSBiYXNlIGFkZHIgaXMgZmlyc3QgYWRkciAsIHRoZSBzZWNvbmQgcG9pbnRzIHRvIHRoZSBjb25maWcKLSAgICAgICAgICogICB0YWJsZQorCSAqICAgdGFibGUKIAkgKi8KIAotCWMtPnBhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOyAvKiBhZGRyZXNzaW5nIG1vZGUgYml0cyBhbHJlYWR5IHJlbW92ZWQgKi8KKwljLT5wYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsJLyogYWRkcmVzc2luZyBtb2RlIGJpdHMgYWxyZWFkeSByZW1vdmVkICovCiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImFkZHJlc3MgMCA9ICV4XG4iLCBjLT5wYWRkcik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAljLT52YWRkciA9IHJlbWFwX3BjaV9tZW0oYy0+cGFkZHIsIDIwMCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgYm9hcmQgdG8gYmVjb21lIHJlYWR5LiAgKFBDSSBob3RwbHVnIG5lZWRzIHRoaXMuKQogCSAqIFdlIHBvbGwgZm9yIHVwIHRvIDEyMCBzZWNzLCBvbmNlIHBlciAxMDBtcy4gKi8KLQlmb3IgKGk9MDsgaSA8IDEyMDA7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCAxMjAwOyBpKyspIHsKIAkJc2NyYXRjaHBhZCA9IHJlYWRsKGMtPnZhZGRyICsgU0E1X1NDUkFUQ0hQQURfT0ZGU0VUKTsKIAkJaWYgKHNjcmF0Y2hwYWQgPT0gQ0NJU1NfRklSTVdBUkVfUkVBRFkpCiAJCQlicmVhazsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsgLyogd2FpdCAxMDBtcyAqLworCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMTApOwkvKiB3YWl0IDEwMG1zICovCiAJfQogCWlmIChzY3JhdGNocGFkICE9IENDSVNTX0ZJUk1XQVJFX1JFQURZKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBCb2FyZCBub3QgcmVhZHkuICBUaW1lZCBvdXQuXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQogCiAJLyogZ2V0IHRoZSBhZGRyZXNzIGluZGV4IG51bWJlciAqLwpAQCAtMjgzMSwxMDMgKzI4MzcsMTA4IEBACiAJY2ZnX2Jhc2VfYWRkciAmPSAoX191MzIpIDB4MDAwMGZmZmY7CiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNmZyBiYXNlIGFkZHJlc3MgPSAleFxuIiwgY2ZnX2Jhc2VfYWRkcik7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQljZmdfYmFzZV9hZGRyX2luZGV4ID0KLQkJZmluZF9QQ0lfQkFSX2luZGV4KHBkZXYsIGNmZ19iYXNlX2FkZHIpOworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCisJY2ZnX2Jhc2VfYWRkcl9pbmRleCA9IGZpbmRfUENJX0JBUl9pbmRleChwZGV2LCBjZmdfYmFzZV9hZGRyKTsKICNpZmRlZiBDQ0lTU19ERUJVRwogCXByaW50aygiY2ZnIGJhc2UgYWRkcmVzcyBpbmRleCA9ICV4XG4iLCBjZmdfYmFzZV9hZGRyX2luZGV4KTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAJaWYgKGNmZ19iYXNlX2FkZHJfaW5kZXggPT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IENhbm5vdCBmaW5kIGNmZ19iYXNlX2FkZHJfaW5kZXhcbiIpOwotCQlyZWxlYXNlX2lvX21lbShjKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQogCiAJY2ZnX29mZnNldCA9IHJlYWRsKGMtPnZhZGRyICsgU0E1X0NUTUVNX09GRlNFVCk7CiAjaWZkZWYgQ0NJU1NfREVCVUcKIAlwcmludGsoImNmZyBvZmZzZXQgPSAleFxuIiwgY2ZnX29mZnNldCk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KLQljLT5jZmd0YWJsZSA9ICByZW1hcF9wY2lfbWVtKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LAotCQkJCWNmZ19iYXNlX2FkZHJfaW5kZXgpICsgY2ZnX29mZnNldCwKLQkJCQlzaXplb2YoQ2ZnVGFibGVfc3RydWN0KSk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KKwljLT5jZmd0YWJsZSA9IHJlbWFwX3BjaV9tZW0ocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsCisJCQkJCQkgICAgICAgY2ZnX2Jhc2VfYWRkcl9pbmRleCkgKworCQkJCSAgICBjZmdfb2Zmc2V0LCBzaXplb2YoQ2ZnVGFibGVfc3RydWN0KSk7CiAJYy0+Ym9hcmRfaWQgPSBib2FyZF9pZDsKIAogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAKLQlmb3IoaT0wOyBpPE5SX1BST0RVQ1RTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcm9kdWN0cyk7IGkrKykgewogCQlpZiAoYm9hcmRfaWQgPT0gcHJvZHVjdHNbaV0uYm9hcmRfaWQpIHsKIAkJCWMtPnByb2R1Y3RfbmFtZSA9IHByb2R1Y3RzW2ldLnByb2R1Y3RfbmFtZTsKIAkJCWMtPmFjY2VzcyA9ICoocHJvZHVjdHNbaV0uYWNjZXNzKTsKIAkJCWJyZWFrOwogCQl9CiAJfQotCWlmIChpID09IE5SX1BST0RVQ1RTKSB7CisJaWYgKGkgPT0gQVJSQVlfU0laRShwcm9kdWN0cykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IFNvcnJ5LCBJIGRvbid0IGtub3cgaG93IgotCQkJIiB0byBhY2Nlc3MgdGhlIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXIgJTA4bHhcbiIsIAotCQkJCSh1bnNpZ25lZCBsb25nKWJvYXJkX2lkKTsKLQkJcmV0dXJuIC0xOworCQkgICAgICAgIiB0byBhY2Nlc3MgdGhlIFNtYXJ0IEFycmF5IGNvbnRyb2xsZXIgJTA4bHhcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZylib2FyZF9pZCk7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9Ci0JaWYgKCAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzBdKSAhPSAnQycpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzFdKSAhPSAnSScpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzJdKSAhPSAnUycpIHx8Ci0JICAgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzNdKSAhPSAnUycpICkKLQl7CisJaWYgKChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVswXSkgIT0gJ0MnKSB8fAorCSAgICAocmVhZGIoJmMtPmNmZ3RhYmxlLT5TaWduYXR1cmVbMV0pICE9ICdJJykgfHwKKwkgICAgKHJlYWRiKCZjLT5jZmd0YWJsZS0+U2lnbmF0dXJlWzJdKSAhPSAnUycpIHx8CisJICAgIChyZWFkYigmYy0+Y2ZndGFibGUtPlNpZ25hdHVyZVszXSkgIT0gJ1MnKSkgewogCQlwcmludGsoIkRvZXMgbm90IGFwcGVhciB0byBiZSBhIHZhbGlkIENJU1MgY29uZmlnIHRhYmxlXG4iKTsKLQkJcmV0dXJuIC0xOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZXM7CiAJfQotCiAjaWZkZWYgQ09ORklHX1g4NgotewotCS8qIE5lZWQgdG8gZW5hYmxlIHByZWZldGNoIGluIHRoZSBTQ1NJIGNvcmUgZm9yIDY0MDAgaW4geDg2ICovCi0JX191MzIgcHJlZmV0Y2g7Ci0JcHJlZmV0Y2ggPSByZWFkbCgmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7Ci0JcHJlZmV0Y2ggfD0gMHgxMDA7Ci0Jd3JpdGVsKHByZWZldGNoLCAmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7Ci19CisJeworCQkvKiBOZWVkIHRvIGVuYWJsZSBwcmVmZXRjaCBpbiB0aGUgU0NTSSBjb3JlIGZvciA2NDAwIGluIHg4NiAqLworCQlfX3UzMiBwcmVmZXRjaDsKKwkJcHJlZmV0Y2ggPSByZWFkbCgmKGMtPmNmZ3RhYmxlLT5TQ1NJX1ByZWZldGNoKSk7CisJCXByZWZldGNoIHw9IDB4MTAwOworCQl3cml0ZWwocHJlZmV0Y2gsICYoYy0+Y2ZndGFibGUtPlNDU0lfUHJlZmV0Y2gpKTsKKwl9CiAjZW5kaWYKIAogI2lmZGVmIENDSVNTX0RFQlVHCiAJcHJpbnRrKCJUcnlpbmcgdG8gcHV0IGJvYXJkIGludG8gU2ltcGxlIG1vZGVcbiIpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovIAorI2VuZGlmCQkJCS8qIENDSVNTX0RFQlVHICovCiAJYy0+bWF4X2NvbW1hbmRzID0gcmVhZGwoJihjLT5jZmd0YWJsZS0+Q21kc091dE1heCkpOwotCS8qIFVwZGF0ZSB0aGUgZmllbGQsIGFuZCB0aGVuIHJpbmcgdGhlIGRvb3JiZWxsICovIAotCXdyaXRlbCggQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgCi0JCSYoYy0+Y2ZndGFibGUtPkhvc3RXcml0ZS5UcmFuc3BvcnRSZXF1ZXN0KSk7Ci0Jd3JpdGVsKCBDRkdUQkxfQ2hhbmdlUmVxLCBjLT52YWRkciArIFNBNV9ET09SQkVMTCk7CisJLyogVXBkYXRlIHRoZSBmaWVsZCwgYW5kIHRoZW4gcmluZyB0aGUgZG9vcmJlbGwgKi8KKwl3cml0ZWwoQ0ZHVEJMX1RyYW5zX1NpbXBsZSwgJihjLT5jZmd0YWJsZS0+SG9zdFdyaXRlLlRyYW5zcG9ydFJlcXVlc3QpKTsKKwl3cml0ZWwoQ0ZHVEJMX0NoYW5nZVJlcSwgYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpOwogCiAJLyogdW5kZXIgY2VydGFpbiB2ZXJ5IHJhcmUgY29uZGl0aW9ucywgdGhpcyBjYW4gdGFrZSBhd2hpbGUuCiAJICogKGUuZy46IGhvdCByZXBsYWNlIGEgZmFpbGVkIDE0NEdCIGRyaXZlIGluIGEgUkFJRCA1IHNldCByaWdodAogCSAqIGFzIHdlIGVudGVyIHRoaXMgY29kZS4pICovCi0JZm9yKGk9MDtpPE1BWF9DT05GSUdfV0FJVDtpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPTkZJR19XQUlUOyBpKyspIHsKIAkJaWYgKCEocmVhZGwoYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpICYgQ0ZHVEJMX0NoYW5nZVJlcSkpCiAJCQlicmVhazsKIAkJLyogZGVsYXkgYW5kIHRyeSBhZ2FpbiAqLwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KDEwKTsKLQl9CQorCX0KIAogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIkkgY291bnRlciBnb3QgdG8gJWQgJXhcbiIsIGksIHJlYWRsKGMtPnZhZGRyICsgU0E1X0RPT1JCRUxMKSk7Ci0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAiSSBjb3VudGVyIGdvdCB0byAlZCAleFxuIiwgaSwKKwkgICAgICAgcmVhZGwoYy0+dmFkZHIgKyBTQTVfRE9PUkJFTEwpKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogI2lmZGVmIENDSVNTX0RFQlVHCi0JcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsJCi0jZW5kaWYgLyogQ0NJU1NfREVCVUcgKi8gCisJcHJpbnRfY2ZnX3RhYmxlKGMtPmNmZ3RhYmxlKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCi0JaWYgKCEocmVhZGwoJihjLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkKLQl7CisJaWYgKCEocmVhZGwoJihjLT5jZmd0YWJsZS0+VHJhbnNwb3J0QWN0aXZlKSkgJiBDRkdUQkxfVHJhbnNfU2ltcGxlKSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogdW5hYmxlIHRvIGdldCBib2FyZCBpbnRvIgotCQkJCQkiIHNpbXBsZSBtb2RlXG4iKTsKLQkJcmV0dXJuIC0xOworCQkgICAgICAgIiBzaW1wbGUgbW9kZVxuIik7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9mcmVlX3JlczsKIAl9CiAJcmV0dXJuIDA7CiAKKyAgICAgIGVycl9vdXRfZnJlZV9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKworICAgICAgZXJyX291dF9kaXNhYmxlX3BkZXY6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBlcnI7CiB9CiAKLS8qIAotICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgdm9sdW1lcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4gCi0gKi8gCisvKgorICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYWwgdm9sdW1lcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlci4KKyAqLwogc3RhdGljIHZvaWQgY2Npc3NfZ2V0Z2VvbWV0cnkoaW50IGNudGxfbnVtKQogewogCVJlcG9ydEx1bkRhdGFfc3RydWN0ICpsZF9idWZmOwpAQCAtMjkzOCwxMDIgKzI5NDksMTAyIEBACiAJaW50IGxpc3RsZW5ndGggPSAwOwogCV9fdTMyIGx1bmlkID0gMDsKIAlpbnQgYmxvY2tfc2l6ZTsKLQlpbnQgdG90YWxfc2l6ZTsgCisJaW50IHRvdGFsX3NpemU7CiAKIAlsZF9idWZmID0ga3phbGxvYyhzaXplb2YoUmVwb3J0THVuRGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAobGRfYnVmZiA9PSBOVUxMKQotCXsKKwlpZiAobGRfYnVmZiA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlyZXR1cm47CiAJfQotCXNpemVfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBSZWFkQ2FwZGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKHNpemVfYnVmZiA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeVxuIik7CisJc2l6ZV9idWZmID0ga21hbGxvYyhzaXplb2YoUmVhZENhcGRhdGFfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNpemVfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlrZnJlZShsZF9idWZmKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKCBJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKLSAgICAgICAgaWYgKGlucV9idWZmID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNjaXNzOiBvdXQgb2YgbWVtb3J5XG4iKTsKLSAgICAgICAgICAgICAgICBrZnJlZShsZF9idWZmKTsKKwkJcmV0dXJuOworCX0KKwlpbnFfYnVmZiA9IGttYWxsb2Moc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIEdGUF9LRVJORUwpOworCWlmIChpbnFfYnVmZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnlcbiIpOworCQlrZnJlZShsZF9idWZmKTsKIAkJa2ZyZWUoc2l6ZV9idWZmKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQkvKiBHZXQgdGhlIGZpcm13YXJlIHZlcnNpb24gKi8gCi0JcmV0dXJuX2NvZGUgPSBzZW5kY21kKENJU1NfSU5RVUlSWSwgY250bF9udW0sIGlucV9idWZmLCAKLQkJc2l6ZW9mKElucXVpcnlEYXRhX3N0cnVjdCksIDAsIDAgLDAsIE5VTEwsIFRZUEVfQ01EKTsKLQlpZiAocmV0dXJuX2NvZGUgPT0gSU9fT0spCi0JeworCQlyZXR1cm47CisJfQorCS8qIEdldCB0aGUgZmlybXdhcmUgdmVyc2lvbiAqLworCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX0lOUVVJUlksIGNudGxfbnVtLCBpbnFfYnVmZiwKKwkJCSAgICAgIHNpemVvZihJbnF1aXJ5RGF0YV9zdHJ1Y3QpLCAwLCAwLCAwLCBOVUxMLAorCQkJICAgICAgVFlQRV9DTUQpOworCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclswXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzJdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclsxXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzNdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclsyXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzRdOwogCQloYmFbY250bF9udW1dLT5maXJtX3ZlclszXSA9IGlucV9idWZmLT5kYXRhX2J5dGVbMzVdOwotCX0gZWxzZSAvKiBzZW5kIGNvbW1hbmQgZmFpbGVkICovCi0JewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogdW5hYmxlIHRvIGRldGVybWluZSBmaXJtd2FyZSIKLQkJCSIgdmVyc2lvbiBvZiBjb250cm9sbGVyXG4iKTsKLQl9Ci0JLyogR2V0IHRoZSBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzICovIAotCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX1JFUE9SVF9MT0csIGNudGxfbnVtLCBsZF9idWZmLCAKLQkJCXNpemVvZihSZXBvcnRMdW5EYXRhX3N0cnVjdCksIDAsIDAsIDAsIE5VTEwsIFRZUEVfQ01EKTsKKwl9IGVsc2UgewkJLyogc2VuZCBjb21tYW5kIGZhaWxlZCAqLwogCi0JaWYoIHJldHVybl9jb2RlID09IElPX09LKQotCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY2Npc3M6IHVuYWJsZSB0byBkZXRlcm1pbmUgZmlybXdhcmUiCisJCSAgICAgICAiIHZlcnNpb24gb2YgY29udHJvbGxlclxuIik7CisJfQorCS8qIEdldCB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyAqLworCXJldHVybl9jb2RlID0gc2VuZGNtZChDSVNTX1JFUE9SVF9MT0csIGNudGxfbnVtLCBsZF9idWZmLAorCQkJICAgICAgc2l6ZW9mKFJlcG9ydEx1bkRhdGFfc3RydWN0KSwgMCwgMCwgMCwgTlVMTCwKKwkJCSAgICAgIFRZUEVfQ01EKTsKKworCWlmIChyZXR1cm5fY29kZSA9PSBJT19PSykgewogI2lmZGVmIENDSVNTX0RFQlVHCiAJCXByaW50aygiTFVOIERhdGFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLyAKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCi0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzBdKSkgPDwgMjQ7Ci0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdKSkgPDwgMTY7Ci0JCWxpc3RsZW5ndGggfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdKSkgPDwgODsJCisJCWxpc3RsZW5ndGggfD0KKwkJICAgICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSkpIDw8IDI0OworCQlsaXN0bGVuZ3RoIHw9CisJCSAgICAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTkxpc3RMZW5ndGhbMV0pKSA8PCAxNjsKKwkJbGlzdGxlbmd0aCB8PQorCQkgICAgKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdKSkgPDwgODsKIAkJbGlzdGxlbmd0aCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOTGlzdExlbmd0aFszXSk7Ci0JfSBlbHNlIC8qIHJlYWRpbmcgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBmYWlsZWQgKi8KLQl7CisJfSBlbHNlIHsJCS8qIHJlYWRpbmcgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBmYWlsZWQgKi8KKwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogcmVwb3J0IGxvZ2ljYWwgdm9sdW1lIgotCQkJIiBjb21tYW5kIGZhaWxlZFxuIik7CisJCSAgICAgICAiIGNvbW1hbmQgZmFpbGVkXG4iKTsKIAkJbGlzdGxlbmd0aCA9IDA7CiAJfQotCWhiYVtjbnRsX251bV0tPm51bV9sdW5zID0gbGlzdGxlbmd0aCAvIDg7IC8vIDggYnl0ZXMgcHJlIGVudHJ5Ci0JaWYgKGhiYVtjbnRsX251bV0tPm51bV9sdW5zID4gQ0lTU19NQVhfTFVOKQotCXsKLQkJcHJpbnRrKEtFUk5fRVJSICJjaXNzOiAgb25seSAlZCBudW1iZXIgb2YgbG9naWNhbCB2b2x1bWVzIHN1cHBvcnRlZFxuIiwKLQkJCUNJU1NfTUFYX0xVTik7CisJaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgPSBsaXN0bGVuZ3RoIC8gODsJLy8gOCBieXRlcyBwcmUgZW50cnkKKwlpZiAoaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgPiBDSVNTX01BWF9MVU4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiY2lzczogIG9ubHkgJWQgbnVtYmVyIG9mIGxvZ2ljYWwgdm9sdW1lcyBzdXBwb3J0ZWRcbiIsCisJCSAgICAgICBDSVNTX01BWF9MVU4pOwogCQloYmFbY250bF9udW1dLT5udW1fbHVucyA9IENJU1NfTUFYX0xVTjsKIAl9CiAjaWZkZWYgQ0NJU1NfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiTGVuZ3RoID0gJXggJXggJXggJXggPSAlZFxuIiwgbGRfYnVmZi0+TFVOTGlzdExlbmd0aFswXSwKLQkJbGRfYnVmZi0+TFVOTGlzdExlbmd0aFsxXSwgbGRfYnVmZi0+TFVOTGlzdExlbmd0aFsyXSwKLQkJbGRfYnVmZi0+TFVOTGlzdExlbmd0aFszXSwgIGhiYVtjbnRsX251bV0tPm51bV9sdW5zKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworCXByaW50ayhLRVJOX0RFQlVHICJMZW5ndGggPSAleCAleCAleCAleCA9ICVkXG4iLAorCSAgICAgICBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzBdLCBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzFdLAorCSAgICAgICBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzJdLCBsZF9idWZmLT5MVU5MaXN0TGVuZ3RoWzNdLAorCSAgICAgICBoYmFbY250bF9udW1dLT5udW1fbHVucyk7CisjZW5kaWYJCQkJLyogQ0NJU1NfREVCVUcgKi8KIAotCWhiYVtjbnRsX251bV0tPmhpZ2hlc3RfbHVuID0gaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMtMTsKLS8vCWZvcihpPTA7IGk8ICBoYmFbY250bF9udW1dLT5udW1fbHVuczsgaSsrKQotCWZvcihpPTA7IGkgPCBDSVNTX01BWF9MVU47IGkrKykKLQl7Ci0JCWlmIChpIDwgaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMpewotCQkgIAlsdW5pZCA9ICgweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzNdKSkKLQkJCQkgPDwgMjQ7Ci0gICAgICAgIAkJbHVuaWQgfD0gKDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMl0pKQotCQkJCSA8PCAxNjsKLSAgICAgICAgCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpCi0JCQkJIDw8IDg7Ci0gICAgICAgIAlsdW5pZCB8PSAweGZmICYgKHVuc2lnbmVkIGludCkobGRfYnVmZi0+TFVOW2ldWzBdKTsKLQkJCi0JCWhiYVtjbnRsX251bV0tPmRydltpXS5MdW5JRCA9IGx1bmlkOworCWhiYVtjbnRsX251bV0tPmhpZ2hlc3RfbHVuID0gaGJhW2NudGxfbnVtXS0+bnVtX2x1bnMgLSAxOworLy8gICAgICBmb3IoaT0wOyBpPCAgaGJhW2NudGxfbnVtXS0+bnVtX2x1bnM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQ0lTU19NQVhfTFVOOyBpKyspIHsKKwkJaWYgKGkgPCBoYmFbY250bF9udW1dLT5udW1fbHVucykgeworCQkJbHVuaWQgPSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVszXSkpCisJCQkgICAgPDwgMjQ7CisJCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsyXSkpCisJCQkgICAgPDwgMTY7CisJCQlsdW5pZCB8PSAoMHhmZiAmICh1bnNpZ25lZCBpbnQpKGxkX2J1ZmYtPkxVTltpXVsxXSkpCisJCQkgICAgPDwgODsKKwkJCWx1bmlkIHw9IDB4ZmYgJiAodW5zaWduZWQgaW50KShsZF9idWZmLT5MVU5baV1bMF0pOwogCisJCQloYmFbY250bF9udW1dLT5kcnZbaV0uTHVuSUQgPSBsdW5pZDsKIAogI2lmZGVmIENDSVNTX0RFQlVHCi0JICAJcHJpbnRrKEtFUk5fREVCVUcgIkxVTlslZF06ICAleCAleCAleCAleCA9ICV4XG4iLCBpLCAKLQkJCWxkX2J1ZmYtPkxVTltpXVswXSwgbGRfYnVmZi0+TFVOW2ldWzFdLAotCQkJbGRfYnVmZi0+TFVOW2ldWzJdLCBsZF9idWZmLT5MVU5baV1bM10sCi0JCQloYmFbY250bF9udW1dLT5kcnZbaV0uTHVuSUQpOwotI2VuZGlmIC8qIENDSVNTX0RFQlVHICovCi0JCWNjaXNzX3JlYWRfY2FwYWNpdHkoY250bF9udW0sIGksIHNpemVfYnVmZiwgMCwKLQkJCSZ0b3RhbF9zaXplLCAmYmxvY2tfc2l6ZSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiTFVOWyVkXTogICV4ICV4ICV4ICV4ID0gJXhcbiIsIGksCisJCQkgICAgICAgbGRfYnVmZi0+TFVOW2ldWzBdLCBsZF9idWZmLT5MVU5baV1bMV0sCisJCQkgICAgICAgbGRfYnVmZi0+TFVOW2ldWzJdLCBsZF9idWZmLT5MVU5baV1bM10sCisJCQkgICAgICAgaGJhW2NudGxfbnVtXS0+ZHJ2W2ldLkx1bklEKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLworCQkJY2Npc3NfcmVhZF9jYXBhY2l0eShjbnRsX251bSwgaSwgc2l6ZV9idWZmLCAwLAorCQkJCQkgICAgJnRvdGFsX3NpemUsICZibG9ja19zaXplKTsKIAkJCWNjaXNzX2dlb21ldHJ5X2lucXVpcnkoY250bF9udW0sIGksIDAsIHRvdGFsX3NpemUsCi0JCQkJYmxvY2tfc2l6ZSwgaW5xX2J1ZmYsICZoYmFbY250bF9udW1dLT5kcnZbaV0pOworCQkJCQkgICAgICAgYmxvY2tfc2l6ZSwgaW5xX2J1ZmYsCisJCQkJCSAgICAgICAmaGJhW2NudGxfbnVtXS0+ZHJ2W2ldKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGluaXRpYWxpemUgcmFpZF9sZXZlbCB0byBpbmRpY2F0ZSBhIGZyZWUgc3BhY2UgKi8KIAkJCWhiYVtjbnRsX251bV0tPmRydltpXS5yYWlkX2xldmVsID0gLTE7CkBAIC0zMDQyLDcgKzMwNTMsNyBAQAogCWtmcmVlKGxkX2J1ZmYpOwogCWtmcmVlKHNpemVfYnVmZik7CiAJa2ZyZWUoaW5xX2J1ZmYpOwotfQkKK30KIAogLyogRnVuY3Rpb24gdG8gZmluZCB0aGUgZmlyc3QgZnJlZSBwb2ludGVyIGludG8gb3VyIGhiYVtdIGFycmF5ICovCiAvKiBSZXR1cm5zIC0xIGlmIG5vIGZyZWUgZW50cmllcyBhcmUgbGVmdC4gICovCkBAIC0zMDU2LDcgKzMwNjcsNyBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JZm9yKGk9MDsgaTwgTUFYX0NUTFI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1RMUjsgaSsrKSB7CiAJCWlmICghaGJhW2ldKSB7CiAJCQljdGxyX2luZm9fdCAqcDsKIAkJCXAgPSBremFsbG9jKHNpemVvZihjdGxyX2luZm9fdCksIEdGUF9LRVJORUwpOwpAQCAtMzA2OSwxMSArMzA4MCwxMSBAQAogCQl9CiAJfQogCXByaW50ayhLRVJOX1dBUk5JTkcgImNjaXNzOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBhIG1heGltdW0iCi0JCSIgb2YgJWQgY29udHJvbGxlcnMuXG4iLCBNQVhfQ1RMUik7CisJICAgICAgICIgb2YgJWQgY29udHJvbGxlcnMuXG4iLCBNQVhfQ1RMUik7CiAJZ290byBvdXQ7Ci1Fbm9tZW06CisgICAgICBFbm9tZW06CiAJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeS5cbiIpOwotb3V0OgorICAgICAgb3V0OgogCXdoaWxlIChuLS0pCiAJCXB1dF9kaXNrKGRpc2tbbl0pOwogCXJldHVybiAtMTsKQEAgLTMwOTYsMjAgKzMxMDcsMTcgQEAKICAqICByZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2sgZGV2aWNlcyByZWdpc3RlcmVkLgogICovCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjY2lzc19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXJlcXVlc3RfcXVldWVfdCAqcTsKIAlpbnQgaTsKIAlpbnQgajsKIAlpbnQgcmM7CisJaW50IGRhYzsKIAotCXByaW50ayhLRVJOX0RFQlVHICJjY2lzczogRGV2aWNlIDB4JXggaGFzIGJlZW4gZm91bmQgYXQiCi0JCQkiIGJ1cyAlZCBkZXYgJWQgZnVuYyAlZFxuIiwKLQkJcGRldi0+ZGV2aWNlLCBwZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QocGRldi0+ZGV2Zm4pLAotCQkJUENJX0ZVTkMocGRldi0+ZGV2Zm4pKTsKIAlpID0gYWxsb2NfY2Npc3NfaGJhKCk7Ci0JaWYoaSA8IDApCi0JCXJldHVybiAoLTEpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIC0xOwogCiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDE7CiAKQEAgLTMxMjIsMTEgKzMxMzAsMTEgQEAKIAogCS8qIGNvbmZpZ3VyZSBQQ0kgRE1BIHN0dWZmICovCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKSkKLQkJcHJpbnRrKCJjY2lzczogdXNpbmcgREFDIGN5Y2xlc1xuIik7CisJCWRhYyA9IDE7CiAJZWxzZSBpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spKQotCQlwcmludGsoImNjaXNzOiBub3QgdXNpbmcgREFDIGN5Y2xlc1xuIik7CisJCWRhYyA9IDA7CiAJZWxzZSB7Ci0JCXByaW50aygiY2Npc3M6IG5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBubyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlXG4iKTsKIAkJZ290byBjbGVhbjE7CiAJfQogCkBAIC0zMTM4LDYwICszMTQ2LDY5IEBACiAJaWYgKGkgPCBNQVhfQ1RMUl9PUklHKQogCQloYmFbaV0tPm1ham9yID0gQ09NUEFRX0NJU1NfTUFKT1IgKyBpOwogCXJjID0gcmVnaXN0ZXJfYmxrZGV2KGhiYVtpXS0+bWFqb3IsIGhiYVtpXS0+ZGV2bmFtZSk7Ci0JaWYocmMgPT0gLUVCVVNZIHx8IHJjID09IC1FSU5WQUwpIHsKKwlpZiAocmMgPT0gLUVCVVNZIHx8IHJjID09IC1FSU5WQUwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCi0JCQkiY2Npc3M6ICBVbmFibGUgdG8gZ2V0IG1ham9yIG51bWJlciAlZCBmb3IgJXMgIgotCQkJIm9uIGhiYSAlZFxuIiwgaGJhW2ldLT5tYWpvciwgaGJhW2ldLT5kZXZuYW1lLCBpKTsKKwkJICAgICAgICJjY2lzczogIFVuYWJsZSB0byBnZXQgbWFqb3IgbnVtYmVyICVkIGZvciAlcyAiCisJCSAgICAgICAib24gaGJhICVkXG4iLCBoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUsIGkpOwogCQlnb3RvIGNsZWFuMTsKLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJaWYgKGkgPj0gTUFYX0NUTFJfT1JJRykKIAkJCWhiYVtpXS0+bWFqb3IgPSByYzsKIAl9CiAKIAkvKiBtYWtlIHN1cmUgdGhlIGJvYXJkIGludGVycnVwdHMgYXJlIG9mZiAqLwogCWhiYVtpXS0+YWNjZXNzLnNldF9pbnRyX21hc2soaGJhW2ldLCBDQ0lTU19JTlRSX09GRik7Ci0JaWYoIHJlcXVlc3RfaXJxKGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkb19jY2lzc19pbnRyLAotCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSB8IFNBX1NBTVBMRV9SQU5ET00sIAotCQkJaGJhW2ldLT5kZXZuYW1lLCBoYmFbaV0pKSB7CisJaWYgKHJlcXVlc3RfaXJxKGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkb19jY2lzc19pbnRyLAorCQkJU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsIGhiYVtpXS0+ZGV2bmFtZSwgaGJhW2ldKSkgewogCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCi0JCQloYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldLT5kZXZuYW1lKTsKKwkJICAgICAgIGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBoYmFbaV0tPmRldm5hbWUpOwogCQlnb3RvIGNsZWFuMjsKIAl9Ci0JaGJhW2ldLT5jbWRfcG9vbF9iaXRzID0ga21hbGxvYygoKE5SX0NNRFMrQklUU19QRVJfTE9ORy0xKS9CSVRTX1BFUl9MT05HKSpzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOwotCWhiYVtpXS0+Y21kX3Bvb2wgPSAoQ29tbWFuZExpc3Rfc3RydWN0ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCWhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLCAKLQkJJihoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpKTsKLQloYmFbaV0tPmVycmluZm9fcG9vbCA9IChFcnJvckluZm9fc3RydWN0ICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCi0JCWhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZiggRXJyb3JJbmZvX3N0cnVjdCksIAotCQkmKGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpKTsKLQlpZigoaGJhW2ldLT5jbWRfcG9vbF9iaXRzID09IE5VTEwpIAotCQl8fCAoaGJhW2ldLT5jbWRfcG9vbCA9PSBOVUxMKQotCQl8fCAoaGJhW2ldLT5lcnJpbmZvX3Bvb2wgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBwcmludGsoIEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeSIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IDwweCV4PiBhdCBQQ0kgJXMgSVJRICVkJXMgdXNpbmcgREFDXG4iLAorCSAgICAgICBoYmFbaV0tPmRldm5hbWUsIHBkZXYtPmRldmljZSwgcGNpX25hbWUocGRldiksCisJICAgICAgIGhiYVtpXS0+aW50cltTSU1QTEVfTU9ERV9JTlRdLCBkYWMgPyAiIiA6ICIgbm90Iik7CisKKwloYmFbaV0tPmNtZF9wb29sX2JpdHMgPQorCSAgICBrbWFsbG9jKCgoTlJfQ01EUyArIEJJVFNfUEVSX0xPTkcgLQorCQkgICAgICAxKSAvIEJJVFNfUEVSX0xPTkcpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwloYmFbaV0tPmNtZF9wb29sID0gKENvbW1hbmRMaXN0X3N0cnVjdCAqKQorCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCisJCSAgICBOUl9DTURTICogc2l6ZW9mKENvbW1hbmRMaXN0X3N0cnVjdCksCisJCSAgICAmKGhiYVtpXS0+Y21kX3Bvb2xfZGhhbmRsZSkpOworCWhiYVtpXS0+ZXJyaW5mb19wb29sID0gKEVycm9ySW5mb19zdHJ1Y3QgKikKKwkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAorCQkgICAgTlJfQ01EUyAqIHNpemVvZihFcnJvckluZm9fc3RydWN0KSwKKwkJICAgICYoaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSkpOworCWlmICgoaGJhW2ldLT5jbWRfcG9vbF9iaXRzID09IE5VTEwpCisJICAgIHx8IChoYmFbaV0tPmNtZF9wb29sID09IE5VTEwpCisJICAgIHx8IChoYmFbaV0tPmVycmluZm9fcG9vbCA9PSBOVUxMKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNjaXNzOiBvdXQgb2YgbWVtb3J5Iik7CiAJCWdvdG8gY2xlYW40OwogCX0KICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQloYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSA9IAotCQlrbWFsbG9jKHNpemVvZihoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZVswXSkgKiAKLQkJCShOUl9DTURTICsgNSksIEdGUF9LRVJORUwpOworCWhiYVtpXS0+c2NzaV9yZWplY3RzLmNvbXBsZXRlID0KKwkgICAga21hbGxvYyhzaXplb2YoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGVbMF0pICoKKwkJICAgIChOUl9DTURTICsgNSksIEdGUF9LRVJORUwpOwogCWlmIChoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCBLRVJOX0VSUiAiY2Npc3M6IG91dCBvZiBtZW1vcnkiKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogb3V0IG9mIG1lbW9yeSIpOwogCQlnb3RvIGNsZWFuNDsKIAl9CiAjZW5kaWYKIAlzcGluX2xvY2tfaW5pdCgmaGJhW2ldLT5sb2NrKTsKIAotCS8qIEluaXRpYWxpemUgdGhlIHBkZXYgZHJpdmVyIHByaXZhdGUgZGF0YS4gCi0JCWhhdmUgaXQgcG9pbnQgdG8gaGJhW2ldLiAgKi8KKwkvKiBJbml0aWFsaXplIHRoZSBwZGV2IGRyaXZlciBwcml2YXRlIGRhdGEuCisJICAgaGF2ZSBpdCBwb2ludCB0byBoYmFbaV0uICAqLwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBoYmFbaV0pOwotCS8qIGNvbW1hbmQgYW5kIGVycm9yIGluZm8gcmVjcyB6ZXJvZWQgb3V0IGJlZm9yZSAKLQkJCXRoZXkgYXJlIHVzZWQgKi8KLSAgICAgICAgbWVtc2V0KGhiYVtpXS0+Y21kX3Bvb2xfYml0cywgMCwgKChOUl9DTURTK0JJVFNfUEVSX0xPTkctMSkvQklUU19QRVJfTE9ORykqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkvKiBjb21tYW5kIGFuZCBlcnJvciBpbmZvIHJlY3MgemVyb2VkIG91dCBiZWZvcmUKKwkgICB0aGV5IGFyZSB1c2VkICovCisJbWVtc2V0KGhiYVtpXS0+Y21kX3Bvb2xfYml0cywgMCwKKwkgICAgICAgKChOUl9DTURTICsgQklUU19QRVJfTE9ORyAtCisJCSAxKSAvIEJJVFNfUEVSX0xPTkcpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKIAotI2lmZGVmIENDSVNTX0RFQlVHCQotCXByaW50ayhLRVJOX0RFQlVHICJTY2FubmluZyBmb3IgZHJpdmVzIG9uIGNvbnRyb2xsZXIgY2Npc3MlZFxuIixpKTsKLSNlbmRpZiAvKiBDQ0lTU19ERUJVRyAqLworI2lmZGVmIENDSVNTX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIlNjYW5uaW5nIGZvciBkcml2ZXMgb24gY29udHJvbGxlciBjY2lzcyVkXG4iLCBpKTsKKyNlbmRpZgkJCQkvKiBDQ0lTU19ERUJVRyAqLwogCiAJY2Npc3NfZ2V0Z2VvbWV0cnkoaSk7CiAKQEAgLTMyMDMsMTUgKzMyMjAsMTUgQEAKIAljY2lzc19wcm9jaW5pdChpKTsKIAloYmFbaV0tPmJ1c3lfaW5pdGlhbGl6aW5nID0gMDsKIAotCWZvcihqPTA7IGogPCBOV0Q7IGorKykgeyAvKiBtZm0gKi8KKwlmb3IgKGogPSAwOyBqIDwgTldEOyBqKyspIHsJLyogbWZtICovCiAJCWRyaXZlX2luZm9fc3RydWN0ICpkcnYgPSAmKGhiYVtpXS0+ZHJ2W2pdKTsKIAkJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBoYmFbaV0tPmdlbmRpc2tbal07CiAKIAkJcSA9IGJsa19pbml0X3F1ZXVlKGRvX2NjaXNzX3JlcXVlc3QsICZoYmFbaV0tPmxvY2spOwogCQlpZiAoIXEpIHsKIAkJCXByaW50ayhLRVJOX0VSUgotCQkJICAgImNjaXNzOiAgdW5hYmxlIHRvIGFsbG9jYXRlIHF1ZXVlIGZvciBkaXNrICVkXG4iLAotCQkJICAgaik7CisJCQkgICAgICAgImNjaXNzOiAgdW5hYmxlIHRvIGFsbG9jYXRlIHF1ZXVlIGZvciBkaXNrICVkXG4iLAorCQkJICAgICAgIGopOwogCQkJYnJlYWs7CiAJCX0KIAkJZHJ2LT5xdWV1ZSA9IHE7CkBAIC0zMjQwLDkyICszMjU3LDg3IEBACiAJCWRpc2stPmRyaXZlcmZzX2RldiA9ICZwZGV2LT5kZXY7CiAJCS8qIHdlIG11c3QgcmVnaXN0ZXIgdGhlIGNvbnRyb2xsZXIgZXZlbiBpZiBubyBkaXNrcyBleGlzdCAqLwogCQkvKiB0aGlzIGlzIGZvciB0aGUgb25saW5lIGFycmF5IHV0aWxpdGllcyAqLwotCQlpZighZHJ2LT5oZWFkcyAmJiBqKQorCQlpZiAoIWRydi0+aGVhZHMgJiYgaikKIAkJCWNvbnRpbnVlOwogCQlibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxLCBkcnYtPmJsb2NrX3NpemUpOwogCQlzZXRfY2FwYWNpdHkoZGlzaywgZHJ2LT5ucl9ibG9ja3MpOwogCQlhZGRfZGlzayhkaXNrKTsKIAl9CiAKLQlyZXR1cm4oMSk7CisJcmV0dXJuIDE7CiAKLWNsZWFuNDoKKyAgICAgIGNsZWFuNDoKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKIAlrZnJlZShoYmFbaV0tPnNjc2lfcmVqZWN0cy5jb21wbGV0ZSk7CiAjZW5kaWYKIAlrZnJlZShoYmFbaV0tPmNtZF9wb29sX2JpdHMpOwotCWlmKGhiYVtpXS0+Y21kX3Bvb2wpCisJaWYgKGhiYVtpXS0+Y21kX3Bvb2wpCiAJCXBjaV9mcmVlX2NvbnNpc3RlbnQoaGJhW2ldLT5wZGV2LAotCQkJTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAotCQkJaGJhW2ldLT5jbWRfcG9vbCwgaGJhW2ldLT5jbWRfcG9vbF9kaGFuZGxlKTsKLQlpZihoYmFbaV0tPmVycmluZm9fcG9vbCkKKwkJCQkgICAgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAorCQkJCSAgICBoYmFbaV0tPmNtZF9wb29sLCBoYmFbaV0tPmNtZF9wb29sX2RoYW5kbGUpOworCWlmIChoYmFbaV0tPmVycmluZm9fcG9vbCkKIAkJcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsCi0JCQlOUl9DTURTICogc2l6ZW9mKCBFcnJvckluZm9fc3RydWN0KSwKLQkJCWhiYVtpXS0+ZXJyaW5mb19wb29sLAotCQkJaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJCQkJICAgIE5SX0NNRFMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCisJCQkJICAgIGhiYVtpXS0+ZXJyaW5mb19wb29sLAorCQkJCSAgICBoYmFbaV0tPmVycmluZm9fcG9vbF9kaGFuZGxlKTsKIAlmcmVlX2lycShoYmFbaV0tPmludHJbU0lNUExFX01PREVfSU5UXSwgaGJhW2ldKTsKLWNsZWFuMjoKKyAgICAgIGNsZWFuMjoKIAl1bnJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwotY2xlYW4xOgotCXJlbGVhc2VfaW9fbWVtKGhiYVtpXSk7CisgICAgICBjbGVhbjE6CiAJaGJhW2ldLT5idXN5X2luaXRpYWxpemluZyA9IDA7CiAJZnJlZV9oYmEoaSk7Ci0JcmV0dXJuKC0xKTsKKwlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjY2lzc19yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBjY2lzc19yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWN0bHJfaW5mb190ICp0bXBfcHRyOwogCWludCBpLCBqOwogCWNoYXIgZmx1c2hfYnVmWzRdOwotCWludCByZXR1cm5fY29kZTsgCisJaW50IHJldHVybl9jb2RlOwogCi0JaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA9PSBOVUxMKQotCXsKLQkJcHJpbnRrKCBLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byByZW1vdmUgZGV2aWNlIFxuIik7CisJaWYgKHBjaV9nZXRfZHJ2ZGF0YShwZGV2KSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2Npc3M6IFVuYWJsZSB0byByZW1vdmUgZGV2aWNlIFxuIik7CiAJCXJldHVybjsKIAl9CiAJdG1wX3B0ciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpID0gdG1wX3B0ci0+Y3RscjsKLQlpZiAoaGJhW2ldID09IE5VTEwpIAotCXsKKwlpZiAoaGJhW2ldID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjY2lzczogZGV2aWNlIGFwcGVhcnMgdG8gIgotCQkJImFscmVhZHkgYmUgcmVtb3ZlZCBcbiIpOworCQkgICAgICAgImFscmVhZHkgYmUgcmVtb3ZlZCBcbiIpOwogCQlyZXR1cm47CiAJfQogCS8qIFR1cm4gYm9hcmQgaW50ZXJydXB0cyBvZmYgIGFuZCBzZW5kIHRoZSBmbHVzaCBjYWNoZSBjb21tYW5kICovCiAJLyogc2VuZGNtZCB3aWxsIHR1cm4gb2ZmIGludGVycnVwdCwgYW5kIHNlbmQgdGhlIGZsdXNoLi4uCi0JKiBUbyB3cml0ZSBhbGwgZGF0YSBpbiB0aGUgYmF0dGVyeSBiYWNrZWQgY2FjaGUgdG8gZGlza3MgKi8KKwkgKiBUbyB3cml0ZSBhbGwgZGF0YSBpbiB0aGUgYmF0dGVyeSBiYWNrZWQgY2FjaGUgdG8gZGlza3MgKi8KIAltZW1zZXQoZmx1c2hfYnVmLCAwLCA0KTsKIAlyZXR1cm5fY29kZSA9IHNlbmRjbWQoQ0NJU1NfQ0FDSEVfRkxVU0gsIGksIGZsdXNoX2J1ZiwgNCwgMCwgMCwgMCwgTlVMTCwKLQkJCQlUWVBFX0NNRCk7Ci0JaWYocmV0dXJuX2NvZGUgIT0gSU9fT0spCi0JewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciBGbHVzaGluZyBjYWNoZSBvbiBjb250cm9sbGVyICVkXG4iLCAKLQkJCWkpOworCQkJICAgICAgVFlQRV9DTUQpOworCWlmIChyZXR1cm5fY29kZSAhPSBJT19PSykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciBGbHVzaGluZyBjYWNoZSBvbiBjb250cm9sbGVyICVkXG4iLAorCQkgICAgICAgaSk7CiAJfQogCWZyZWVfaXJxKGhiYVtpXS0+aW50clsyXSwgaGJhW2ldKTsKIAogI2lmZGVmIENPTkZJR19QQ0lfTVNJCi0gICAgICAgIGlmIChoYmFbaV0tPm1zaXhfdmVjdG9yKQotICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaXgoaGJhW2ldLT5wZGV2KTsKLSAgICAgICAgZWxzZSBpZiAoaGJhW2ldLT5tc2lfdmVjdG9yKQotICAgICAgICAgICAgICAgIHBjaV9kaXNhYmxlX21zaShoYmFbaV0tPnBkZXYpOwotI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCisJaWYgKGhiYVtpXS0+bXNpeF92ZWN0b3IpCisJCXBjaV9kaXNhYmxlX21zaXgoaGJhW2ldLT5wZGV2KTsKKwllbHNlIGlmIChoYmFbaV0tPm1zaV92ZWN0b3IpCisJCXBjaV9kaXNhYmxlX21zaShoYmFbaV0tPnBkZXYpOworI2VuZGlmCQkJCS8qIENPTkZJR19QQ0lfTVNJICovCiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChoYmFbaV0tPnZhZGRyKTsKLQljY2lzc191bnJlZ2lzdGVyX3Njc2koaSk7ICAvKiB1bmhvb2sgZnJvbSBTQ1NJIHN1YnN5c3RlbSAqLworCWNjaXNzX3VucmVnaXN0ZXJfc2NzaShpKTsJLyogdW5ob29rIGZyb20gU0NTSSBzdWJzeXN0ZW0gKi8KIAl1bnJlZ2lzdGVyX2Jsa2RldihoYmFbaV0tPm1ham9yLCBoYmFbaV0tPmRldm5hbWUpOwotCXJlbW92ZV9wcm9jX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwgcHJvY19jY2lzcyk7CQotCQorCXJlbW92ZV9wcm9jX2VudHJ5KGhiYVtpXS0+ZGV2bmFtZSwgcHJvY19jY2lzcyk7CisKIAkvKiByZW1vdmUgaXQgZnJvbSB0aGUgZGlzayBsaXN0ICovCiAJZm9yIChqID0gMDsgaiA8IE5XRDsgaisrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaGJhW2ldLT5nZW5kaXNrW2pdOwogCQlpZiAoZGlzaykgewogCQkJcmVxdWVzdF9xdWV1ZV90ICpxID0gZGlzay0+cXVldWU7CiAKLQkJCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKSAKKwkJCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKQogCQkJCWRlbF9nZW5kaXNrKGRpc2spOwogCQkJaWYgKHEpCiAJCQkJYmxrX2NsZWFudXBfcXVldWUocSk7CkBAIC0zMzM0LDI2ICszMzQ2LDI4IEBACiAKIAlwY2lfZnJlZV9jb25zaXN0ZW50KGhiYVtpXS0+cGRldiwgTlJfQ01EUyAqIHNpemVvZihDb21tYW5kTGlzdF9zdHJ1Y3QpLAogCQkJICAgIGhiYVtpXS0+Y21kX3Bvb2wsIGhiYVtpXS0+Y21kX3Bvb2xfZGhhbmRsZSk7Ci0JcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsIE5SX0NNRFMgKiBzaXplb2YoIEVycm9ySW5mb19zdHJ1Y3QpLAotCQloYmFbaV0tPmVycmluZm9fcG9vbCwgaGJhW2ldLT5lcnJpbmZvX3Bvb2xfZGhhbmRsZSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChoYmFbaV0tPnBkZXYsIE5SX0NNRFMgKiBzaXplb2YoRXJyb3JJbmZvX3N0cnVjdCksCisJCQkgICAgaGJhW2ldLT5lcnJpbmZvX3Bvb2wsIGhiYVtpXS0+ZXJyaW5mb19wb29sX2RoYW5kbGUpOwogCWtmcmVlKGhiYVtpXS0+Y21kX3Bvb2xfYml0cyk7CiAjaWZkZWYgQ09ORklHX0NJU1NfU0NTSV9UQVBFCiAJa2ZyZWUoaGJhW2ldLT5zY3NpX3JlamVjdHMuY29tcGxldGUpOwogI2VuZGlmCi0gCXJlbGVhc2VfaW9fbWVtKGhiYVtpXSk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWZyZWVfaGJhKGkpOwotfQkKK30KIAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNjaXNzX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPQkJImNjaXNzIiwKLQkucHJvYmUgPQljY2lzc19pbml0X29uZSwKLQkucmVtb3ZlID0JX19kZXZleGl0X3AoY2Npc3NfcmVtb3ZlX29uZSksCi0JLmlkX3RhYmxlID0JY2Npc3NfcGNpX2RldmljZV9pZCwgLyogaWRfdGFibGUgKi8KKwkubmFtZSA9ICJjY2lzcyIsCisJLnByb2JlID0gY2Npc3NfaW5pdF9vbmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNjaXNzX3JlbW92ZV9vbmUpLAorCS5pZF90YWJsZSA9IGNjaXNzX3BjaV9kZXZpY2VfaWQsCS8qIGlkX3RhYmxlICovCiB9OwogCiAvKgogICogIFRoaXMgaXMgaXQuICBSZWdpc3RlciB0aGUgUENJIGRyaXZlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGNhcmRzIHdlIGNvbnRyb2wKLSAqICB0aGUgT1Mgd2lsbCBjYWxsIG91ciByZWdpc3RlcmVkIHJvdXRpbmVzIHdoZW4gaXQgZmluZHMgb25lIG9mIG91ciBjYXJkcy4gCisgKiAgdGhlIE9TIHdpbGwgY2FsbCBvdXIgcmVnaXN0ZXJlZCByb3V0aW5lcyB3aGVuIGl0IGZpbmRzIG9uZSBvZiBvdXIgY2FyZHMuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGNjaXNzX2luaXQodm9pZCkKIHsKQEAgLTMzNjksMTIgKzMzODMsMTAgQEAKIAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY2Npc3NfcGNpX2RyaXZlcik7CiAJLyogZG91YmxlIGNoZWNrIHRoYXQgYWxsIGNvbnRyb2xsZXIgZW50cnlzIGhhdmUgYmVlbiByZW1vdmVkICovCi0JZm9yIChpPTA7IGk8IE1BWF9DVExSOyBpKyspIAotCXsKLQkJaWYgKGhiYVtpXSAhPSBOVUxMKQotCQl7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DVExSOyBpKyspIHsKKwkJaWYgKGhiYVtpXSAhPSBOVUxMKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzczogaGFkIHRvIHJlbW92ZSIKLQkJCQkJIiBjb250cm9sbGVyICVkXG4iLCBpKTsKKwkJCSAgICAgICAiIGNvbnRyb2xsZXIgJWRcbiIsIGkpOwogCQkJY2Npc3NfcmVtb3ZlX29uZShoYmFbaV0tPnBkZXYpOwogCQl9CiAJfQpAQCAtMzM4OSwyMSArMzQwMSwyMSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwcmludGsoS0VSTl9XQVJOSU5HICJjY2lzcyVkOiBjb250cm9sbGVyIG5vdCByZXNwb25kaW5nLlxuIiwgaC0+Y3Rscik7Ci0JaC0+YWxpdmUgPSAwOwkvKiB0aGUgY29udHJvbGxlciBhcHBhcmVudGx5IGRpZWQuLi4gKi8KKwloLT5hbGl2ZSA9IDA7CQkvKiB0aGUgY29udHJvbGxlciBhcHBhcmVudGx5IGRpZWQuLi4gKi8KIAogCXNwaW5fbG9ja19pcnFzYXZlKENDSVNTX0xPQ0soY3RsciksIGZsYWdzKTsKIAotCXBjaV9kaXNhYmxlX2RldmljZShoLT5wZGV2KTsgLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBkZWFkLiAqLworCXBjaV9kaXNhYmxlX2RldmljZShoLT5wZGV2KTsJLyogTWFrZSBzdXJlIGl0IGlzIHJlYWxseSBkZWFkLiAqLwogCiAJLyogbW92ZSBldmVyeXRoaW5nIG9mZiB0aGUgcmVxdWVzdCBxdWV1ZSBvbnRvIHRoZSBjb21wbGV0ZWQgcXVldWUgKi8KLQl3aGlsZSggKGMgPSBoLT5yZXFRKSAhPSBOVUxMICkgeworCXdoaWxlICgoYyA9IGgtPnJlcVEpICE9IE5VTEwpIHsKIAkJcmVtb3ZlUSgmKGgtPnJlcVEpLCBjKTsKIAkJaC0+UWRlcHRoLS07Ci0JCWFkZFEgKCYoaC0+Y21wUSksIGMpOworCQlhZGRRKCYoaC0+Y21wUSksIGMpOwogCX0KIAogCS8qIE5vdywgZmFpbCBldmVyeXRoaW5nIG9uIHRoZSBjb21wbGV0ZWQgcXVldWUgd2l0aCBhIEhXIGVycm9yICovCi0Jd2hpbGUoIChjID0gaC0+Y21wUSkgIT0gTlVMTCApIHsKKwl3aGlsZSAoKGMgPSBoLT5jbXBRKSAhPSBOVUxMKSB7CiAJCXJlbW92ZVEoJmgtPmNtcFEsIGMpOwogCQljLT5lcnJfaW5mby0+Q29tbWFuZFN0YXR1cyA9IENNRF9IQVJEV0FSRV9FUlI7CiAJCWlmIChjLT5jbWRfdHlwZSA9PSBDTURfUldSRVEpIHsKQEAgLTM0MTEsOCArMzQyMyw4IEBACiAJCX0gZWxzZSBpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX0lPQ1RMX1BFTkQpCiAJCQljb21wbGV0ZShjLT53YWl0aW5nKTsKICNpZmRlZiBDT05GSUdfQ0lTU19TQ1NJX1RBUEUKLQkJCWVsc2UgaWYgKGMtPmNtZF90eXBlID09IENNRF9TQ1NJKQotCQkJCWNvbXBsZXRlX3Njc2lfY29tbWFuZChjLCAwLCAwKTsKKwkJZWxzZSBpZiAoYy0+Y21kX3R5cGUgPT0gQ01EX1NDU0kpCisJCQljb21wbGV0ZV9zY3NpX2NvbW1hbmQoYywgMCwgMCk7CiAjZW5kaWYKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShDQ0lTU19MT0NLKGN0bHIpLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmggYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmgKaW5kZXggYjI0ZmMwNS4uODY4ZTBkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5oCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuaApAQCAtNjAsOCArNjAsNiBAQAogCV9fdTMyCWJvYXJkX2lkOwogCXZvaWQgX19pb21lbSAqdmFkZHI7CiAJdW5zaWduZWQgbG9uZyBwYWRkcjsKLQl1bnNpZ25lZCBsb25nIGlvX21lbV9hZGRyOwotCXVuc2lnbmVkIGxvbmcgaW9fbWVtX2xlbmd0aDsKIAlDZmdUYWJsZV9zdHJ1Y3QgX19pb21lbSAqY2ZndGFibGU7CiAJaW50CWludGVycnVwdHNfZW5hYmxlZDsKIAlpbnQJbWFqb3I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKaW5kZXggYjZlYTJmMC4uNWViNmZiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwpAQCAtMzkyLDcgKzM5Miw3IEBACiB9CiAKIC8qIHBkZXYgaXMgTlVMTCBmb3IgZWlzYSAqLwotc3RhdGljIGludCBjcHFhcnJheV9yZWdpc3Rlcl9jdGxyKCBpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCitzdGF0aWMgaW50IF9faW5pdCBjcHFhcnJheV9yZWdpc3Rlcl9jdGxyKCBpbnQgaSwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJcmVxdWVzdF9xdWV1ZV90ICpxOwogCWludCBqOwpAQCAtNDEwLDggKzQxMCw3IEBACiAJfQogCWhiYVtpXS0+YWNjZXNzLnNldF9pbnRyX21hc2soaGJhW2ldLCAwKTsKIAlpZiAocmVxdWVzdF9pcnEoaGJhW2ldLT5pbnRyLCBkb19pZGFfaW50ciwKLQkJU0FfSU5URVJSVVBUfFNBX1NISVJRfFNBX1NBTVBMRV9SQU5ET00sCi0JCWhiYVtpXS0+ZGV2bmFtZSwgaGJhW2ldKSkKKwkJU0FfSU5URVJSVVBUfFNBX1NISVJRLCBoYmFbaV0tPmRldm5hbWUsIGhiYVtpXSkpCiAJewogCQlwcmludGsoS0VSTl9FUlIgImNwcWFycmF5OiBVbmFibGUgdG8gZ2V0IGlycSAlZCBmb3IgJXNcbiIsCiAJCQkJaGJhW2ldLT5pbnRyLCBoYmFbaV0tPmRldm5hbWUpOwpAQCAtNzQ1LDcgKzc0NCw3IEBACiAvKgogICogRmluZCBhbiBFSVNBIGNvbnRyb2xsZXIncyBzaWduYXR1cmUuICBTZXQgdXAgYW4gaGJhIGlmIHdlIGZpbmQgaXQuCiAgKi8KLXN0YXRpYyBpbnQgY3BxYXJyYXlfZWlzYV9kZXRlY3Qodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGNwcWFycmF5X2Vpc2FfZGV0ZWN0KHZvaWQpCiB7CiAJaW50IGk9MCwgajsKIAlfX3UzMiBib2FyZF9pZDsKQEAgLTEwMzYsNiArMTAzNSw4IEBACiAKIAljb21wbGV0ZV9idWZmZXJzKGNtZC0+cnEtPmJpbywgb2spOwogCisJYWRkX2Rpc2tfcmFuZG9tbmVzcyhjbWQtPnJxLT5ycV9kaXNrKTsKKwogICAgICAgICBEQkdQWChwcmludGsoIkRvbmUgd2l0aCAlcFxuIiwgY21kLT5ycSk7KTsKIAllbmRfdGhhdF9yZXF1ZXN0X2xhc3QoY21kLT5ycSwgb2sgPyAxIDogLUVJTyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCmluZGV4IDljM2I5NGUuLjlkYzI5NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbG9vcC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbG9vcC5jCkBAIC03NCw2ICs3NCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01NzgsOCArNTc5LDYgQEAKIAlzdHJ1Y3QgbG9vcF9kZXZpY2UgKmxvID0gZGF0YTsKIAlzdHJ1Y3QgYmlvICpiaW87CiAKLQlkYWVtb25pemUoImxvb3AlZCIsIGxvLT5sb19udW1iZXIpOwotCiAJLyoKIAkgKiBsb29wIGNhbiBiZSB1c2VkIGluIGFuIGVuY3J5cHRlZCBkZXZpY2UsCiAJICogaGVuY2UsIGl0IG11c3RuJ3QgYmUgc3RvcHBlZCBhdCBhbGwKQEAgLTU5MiwxMSArNTkxLDYgQEAKIAlsby0+bG9fc3RhdGUgPSBMb19ib3VuZDsKIAlsby0+bG9fcGVuZGluZyA9IDE7CiAKLQkvKgotCSAqIGNvbXBsZXRlIGl0LCB3ZSBhcmUgcnVubmluZwotCSAqLwotCWNvbXBsZXRlKCZsby0+bG9fZG9uZSk7Ci0KIAlmb3IgKDs7KSB7CiAJCWludCBwZW5kaW5nOwogCkBAIC02MjksNyArNjIzLDYgQEAKIAkJCWJyZWFrOwogCX0KIAotCWNvbXBsZXRlKCZsby0+bG9fZG9uZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc0Niw2ICs3MzksNyBAQAogCXVuc2lnbmVkIGxvX2Jsb2Nrc2l6ZTsKIAlpbnQJCWxvX2ZsYWdzID0gMDsKIAlpbnQJCWVycm9yOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCWxvZmZfdAkJc2l6ZTsKIAogCS8qIFRoaXMgaXMgc2FmZSwgc2luY2Ugd2UgaGF2ZSBhIHJlZmVyZW5jZSBmcm9tIG9wZW4oKS4gKi8KQEAgLTgxOCw3ICs4MTIsNyBAQAogCWxvLT5sb19kZXZpY2UgPSBiZGV2OwogCWxvLT5sb19mbGFncyA9IGxvX2ZsYWdzOwogCWxvLT5sb19iYWNraW5nX2ZpbGUgPSBmaWxlOwotCWxvLT50cmFuc2ZlciA9IE5VTEw7CisJbG8tPnRyYW5zZmVyID0gdHJhbnNmZXJfbm9uZTsKIAlsby0+aW9jdGwgPSBOVUxMOwogCWxvLT5sb19zaXplbGltaXQgPSAwOwogCWxvLT5vbGRfZ2ZwX21hc2sgPSBtYXBwaW5nX2dmcF9tYXNrKG1hcHBpbmcpOwpAQCAtODM5LDEwICs4MzMsMTEgQEAKIAogCXNldF9ibG9ja3NpemUoYmRldiwgbG9fYmxvY2tzaXplKTsKIAotCWVycm9yID0ga2VybmVsX3RocmVhZChsb29wX3RocmVhZCwgbG8sIENMT05FX0tFUk5FTCk7Ci0JaWYgKGVycm9yIDwgMCkKKwl0c2sgPSBrdGhyZWFkX3J1bihsb29wX3RocmVhZCwgbG8sICJsb29wJWQiLCBsby0+bG9fbnVtYmVyKTsKKwlpZiAoSVNfRVJSKHRzaykpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHRzayk7CiAJCWdvdG8gb3V0X3B1dGY7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbG8tPmxvX2RvbmUpOworCX0KIAlyZXR1cm4gMDsKIAogIG91dF9wdXRmOgpAQCAtODk4LDYgKzg5Myw5IEBACiAJaWYgKGxvLT5sb19zdGF0ZSAhPSBMb19ib3VuZCkKIAkJcmV0dXJuIC1FTlhJTzsKIAorCWlmICghbG8tPmxvX3RocmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAobG8tPmxvX3JlZmNudCA+IDEpCS8qIHdlIG5lZWRlZCBvbmUgZmQgZm9yIHRoZSBpb2N0bCAqLwogCQlyZXR1cm4gLUVCVVNZOwogCkBAIC05MTEsNyArOTA5LDcgQEAKIAkJY29tcGxldGUoJmxvLT5sb19iaF9kb25lKTsKIAlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKIAotCXdhaXRfZm9yX2NvbXBsZXRpb24oJmxvLT5sb19kb25lKTsKKwlrdGhyZWFkX3N0b3AobG8tPmxvX3RocmVhZCk7CiAKIAlsby0+bG9fYmFja2luZ19maWxlID0gTlVMTDsKIApAQCAtOTI0LDYgKzkyMiw3IEBACiAJbG8tPmxvX3NpemVsaW1pdCA9IDA7CiAJbG8tPmxvX2VuY3J5cHRfa2V5X3NpemUgPSAwOwogCWxvLT5sb19mbGFncyA9IDA7CisJbG8tPmxvX3RocmVhZCA9IE5VTEw7CiAJbWVtc2V0KGxvLT5sb19lbmNyeXB0X2tleSwgMCwgTE9fS0VZX1NJWkUpOwogCW1lbXNldChsby0+bG9fY3J5cHRfbmFtZSwgMCwgTE9fTkFNRV9TSVpFKTsKIAltZW1zZXQobG8tPmxvX2ZpbGVfbmFtZSwgMCwgTE9fTkFNRV9TSVpFKTsKQEAgLTEyODgsNyArMTI4Nyw2IEBACiAJCWlmICghbG8tPmxvX3F1ZXVlKQogCQkJZ290byBvdXRfbWVtNDsKIAkJbXV0ZXhfaW5pdCgmbG8tPmxvX2N0bF9tdXRleCk7Ci0JCWluaXRfY29tcGxldGlvbigmbG8tPmxvX2RvbmUpOwogCQlpbml0X2NvbXBsZXRpb24oJmxvLT5sb19iaF9kb25lKTsKIAkJbG8tPmxvX251bWJlciA9IGk7CiAJCXNwaW5fbG9ja19pbml0KCZsby0+bG9fbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL25iZC5jIGIvZHJpdmVycy9ibG9jay9uYmQuYwppbmRleCA4YmNhNDkwLi43ZjU1NGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL25iZC5jCisrKyBiL2RyaXZlcnMvYmxvY2svbmJkLmMKQEAgLTcsMzkgKzcsOSBAQAogICogQ29weXJpZ2h0IDE5OTctMjAwMCBQYXZlbCBNYWNoZWsgPHBhdmVsQHVjdy5jej4KICAqIFBhcnRzIGNvcHlyaWdodCAyMDAxIFN0ZXZlbiBXaGl0ZWhvdXNlIDxzdGV2ZUBjaHlnd3luLmNvbT4KICAqCi0gKiAocGFydCBvZiBjb2RlIHN0b2xlbiBmcm9tIGxvb3AuYykKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciBHUEx2MiBvciBsYXRlci4KICAqCi0gKiA5Ny0zLTI1IGNvbXBpbGVkIDAtdGggdmVyc2lvbiwgbm90IHlldCB0ZXN0ZWQgaXQgCi0gKiAgIChpdCBkaWQgbm90IHdvcmssIEJUVykgKGxhdGVyIHRoYXQgZGF5KSBIRVkhIGl0IHdvcmtzIQotICogICAoYml0IGxhdGVyKSBobW0sIG5vdCB0aGF0IG11Y2guLi4gMjowMGFtIG5leHQgZGF5OgotICogICB5ZXMsIGl0IHdvcmtzLCBidXQgaXQgZ2l2ZXMgc29tZXRoaW5nIGxpa2UgNTBrQi9zZWMKLSAqIDk3LTQtMDEgY29tcGxldGUgcmV3cml0ZSB0byBtYWtlIGl0IHBvc3NpYmxlIGZvciBtYW55IHJlcXVlc3RzIGF0IAotICogICBvbmNlIHRvIGJlIHByb2Nlc3NlZAotICogOTctNC0xMSBNYWtpbmcgcHJvdG9jb2wgaW5kZXBlbmRlbnQgb2YgZW5kaWFuaXR5IGV0Yy4KLSAqIDk3LTktMTMgQ29zbWV0aWMgY2hhbmdlcwotICogOTgtNS0xMyBBdHRlbXB0IHRvIG1ha2UgNjQtYml0LWNsZWFuIG9uIDY0LWJpdCBtYWNoaW5lcwotICogOTktMS0xMSBBdHRlbXB0IHRvIG1ha2UgNjQtYml0LWNsZWFuIG9uIDMyLWJpdCBtYWNoaW5lcyA8YW5rcnlAbWlmLnBnLmdkYS5wbD4KLSAqIDAxLTItMjcgRml4IHRvIHN0b3JlIHByb3BlciBibG9ja2NvdW50IGZvciBrZXJuZWwgKGNhbGN1bGF0ZWQgdXNpbmcKLSAqICAgQkxPQ0tfU0laRV9CSVRTLCBub3QgZGV2aWNlIGJsb2Nrc2l6ZSkgPGFnYUBwZXJtb25saW5lLnJ1PgotICogMDEtMy0xMSBNYWtlIG5iZCB3b3JrIHdpdGggbmV3IExpbnV4IGJsb2NrIGxheWVyIGNvZGUuIEl0IG5vdyBzdXBwb3J0cwotICogICBwbHVnZ2luZyBsaWtlIGFsbCB0aGUgb3RoZXIgYmxvY2sgZGV2aWNlcy4gQWxzbyBhZGRlZCBpbiBNU0dfTU9SRSB0bwotICogICByZWR1Y2UgbnVtYmVyIG9mIHBhcnRpYWwgVENQIHNlZ21lbnRzIHNlbnQuIDxzdGV2ZUBjaHlnd3luLmNvbT4KLSAqIDAxLTEyLTYgRml4IGRlYWRsb2NrIGNvbmRpdGlvbiBieSBtYWtpbmcgcXVldWUgbG9ja3MgaW5kZXBlbmRlbnQgb2YKLSAqICAgdGhlIHRyYW5zbWl0IGxvY2suIDxzdGV2ZUBjaHlnd3luLmNvbT4KLSAqIDAyLTEwLTExIEFsbG93IGh1bmcgeG1pdCB0byBiZSBhYm9ydGVkIHZpYSBTSUdLSUxMICYgdmFyaW91cyBmaXhlcy4KLSAqICAgPFBhdWwuQ2xlbWVudHNAU3RlZWxFeWUuY29tPiA8SmFtZXMuQm90dG9tbGV5QFN0ZWVsRXllLmNvbT4KLSAqIDAzLTA2LTIyIE1ha2UgbmJkIHdvcmsgd2l0aCBuZXcgbGludXggMi41IGJsb2NrIGxheWVyIGRlc2lnbi4gVGhpcyBmaXhlcwotICogICBtZW1vcnkgY29ycnVwdGlvbiBmcm9tIG1vZHVsZSByZW1vdmFsIGFuZCBwb3NzaWJsZSBtZW1vcnkgY29ycnVwdGlvbgotICogICBmcm9tIHNlbmRpbmcvcmVjZWl2aW5nIGRpc2sgZGF0YS4gPGxkbEBhcm9zLm5ldD4KLSAqIDAzLTA2LTIzIENvc21ldGljIGNoYW5nZXMuIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yMyBFbmhhbmNlIGRpYWdub3N0aWNzIHN1cHBvcnQuIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yNCBSZW1vdmUgdW5uZWVkZWQgYmxrc2l6ZV9iaXRzIGZpZWxkIGZyb20gbmJkX2RldmljZSBzdHJ1Y3QuCi0gKiAgIDxsZGxAYXJvcy5uZXQ+Ci0gKiAwMy0wNi0yNCBDbGVhbnVwIFBBUkFOT0lBIHVzYWdlICYgY29kZS4gPGxkbEBhcm9zLm5ldD4KLSAqIDA0LTAyLTE5IFJlbW92ZSBQQVJBTk9JQSwgcGx1cyB2YXJpb3VzIGNsZWFudXBzIChQYXVsIENsZW1lbnRzKQotICogcG9zc2libGUgRklYTUU6IG1ha2Ugc2V0X3NvY2sgLyBzZXRfYmxrc2l6ZSAvIHNldF9zaXplIC8gZG9faXQgb25lIHN5c2NhbGwKLSAqIHdoeSBub3Q6IHdvdWxkIG5lZWQgYWNjZXNzX29rIGFuZCBmcmllbmRzLCB3b3VsZCBzaGFyZSB5ZXQgYW5vdGhlcgotICogICAgICAgICAgc3RydWN0dXJlIHdpdGggdXNlcmxhbmQKKyAqIChwYXJ0IG9mIGNvZGUgc3RvbGVuIGZyb20gbG9vcC5jKQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay92aW9kYXNkLmMgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwppbmRleCBmNjNlMDdiLi5iMGRmNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYworKysgYi9kcml2ZXJzL2Jsb2NrL3Zpb2Rhc2QuYwpAQCAtNzQ3LDcgKzc0Nyw3IEBACiAgKiBzdXBwb3J0LgogICovCiBzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmlvZGFzZF9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewotCXsgInZpb2Rhc2QiLCAiIiB9LAorCXsgImJsb2NrIiwgIklCTSxpU2VyaWVzLXZpb2Rhc2QiIH0sCiAJeyAiIiwgIiIgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2aW9kYXNkX2RldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nkcm9tL21jZHguYyBiL2RyaXZlcnMvY2Ryb20vbWNkeC5jCmluZGV4IGEwYjU4MGMuLjBmNmU3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2Ryb20vbWNkeC5jCisrKyBiL2RyaXZlcnMvY2Ryb20vbWNkeC5jCkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogCiAvKiBNT0RVTEUgU1RVRkYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBfX21jZHhfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgX19tY2R4X2luaXQodm9pZCkKIHsKIAlpbnQgaTsKIAlpbnQgZHJpdmVzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2Ryb20vdmlvY2QuYyBiL2RyaXZlcnMvY2Ryb20vdmlvY2QuYwppbmRleCBjMGY4MTdiLi5hZjZiM2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nkcm9tL3Zpb2NkLmMKKysrIGIvZHJpdmVycy9jZHJvbS92aW9jZC5jCkBAIC03MzEsNyArNzMxLDcgQEAKICAqIHN1cHBvcnQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgdmlvX2RldmljZV9pZCB2aW9jZF9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewotCXsgInZpb2NkIiwgIiIgfSwKKwl7ICJibG9jayIsICJJQk0saVNlcmllcy12aW9jZCIgfSwKIAl7ICIiLCAiIiB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh2aW8sIHZpb2NkX2RldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCmluZGV4IDc4ZDkyOGYuLjYzZjI4ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9LY29uZmlnCisrKyBiL2RyaXZlcnMvY2hhci9LY29uZmlnCkBAIC04NjUsNiArODY1LDcgQEAKIGNvbmZpZyBUQU5CQUNfVEIwMjE5CiAJdHJpc3RhdGUgIlRBTkJBQyBUQjAyMTkgYmFzZSBib2FyZCBzdXBwb3J0IgogCWRlcGVuZHMgVEFOQkFDX1RCMDIyWAorCXNlbGVjdCBHUElPX1ZSNDFYWAogCiBtZW51ICJGdGFwZSwgdGhlIGZsb3BweSB0YXBlIGRldmljZSBkcml2ZXIiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZyBiL2RyaXZlcnMvY2hhci9hZ3AvS2NvbmZpZwppbmRleCA3Yzg4YzA2Li40NjY4NWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL2FncC9LY29uZmlnCkBAIC0xLDcgKzEsNiBAQAogY29uZmlnIEFHUAotCXRyaXN0YXRlICIvZGV2L2FncGdhcnQgKEFHUCBTdXBwb3J0KSIgaWYgIUdBUlRfSU9NTVUKKwl0cmlzdGF0ZSAiL2Rldi9hZ3BnYXJ0IChBR1AgU3VwcG9ydCkiCiAJZGVwZW5kcyBvbiBBTFBIQSB8fCBJQTY0IHx8IFBQQyB8fCBYODYKLQlkZWZhdWx0IHkgaWYgR0FSVF9JT01NVQogCS0tLWhlbHAtLS0KIAkgIEFHUCAoQWNjZWxlcmF0ZWQgR3JhcGhpY3MgUG9ydCkgaXMgYSBidXMgc3lzdGVtIG1haW5seSB1c2VkIHRvCiAJICBjb25uZWN0IGdyYXBoaWNzIGNhcmRzIHRvIHRoZSByZXN0IG9mIHRoZSBzeXN0ZW0uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYwppbmRleCA4YzRjNmVmLi45MDdmYjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogCQkJaW5mbyA9IGJ1ZmZlci5wb2ludGVyOwogCQkJaW5mby0+aGFyZHdhcmVfaWQudmFsdWVbc2l6ZW9mKGluZm8tPmhhcmR3YXJlX2lkKS0xXSA9ICdcMCc7CiAJCQltYXRjaCA9IChzdHJjbXAoaW5mby0+aGFyZHdhcmVfaWQudmFsdWUsICJIV1AwMDAxIikgPT0gMCk7Ci0JCQlBQ1BJX01FTV9GUkVFKGluZm8pOworCQkJa2ZyZWUoaW5mbyk7CiAJCQlpZiAobWF0Y2gpIHsKIAkJCQlzdGF0dXMgPSBocF9hY3BpX2Nzcl9zcGFjZShoYW5kbGUsICZzYmFfaHBhLCAmbGVuZ3RoKTsKIAkJCQlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYXBwbGljb20uYyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCmluZGV4IGEzNzBlN2EuLjkyNzVkNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9hcHBsaWNvbS5jCkBAIC0xNjYsMTEgKzE2Niw3IEBACiAJcmV0dXJuIGJvYXJkbm8gKyAxOwogfQogCi0jaWZkZWYgTU9EVUxFCi0KLSNkZWZpbmUgYXBwbGljb21faW5pdCBpbml0X21vZHVsZQotCi12b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGljb21fZXhpdCh2b2lkKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC0xODgsOSArMTg0LDcgQEAKIAl9CiB9CiAKLSNlbmRpZgkJCQkvKiBNT0RVTEUgKi8KLQotaW50IF9faW5pdCBhcHBsaWNvbV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhcHBsaWNvbV9pbml0KHZvaWQpCiB7CiAJaW50IGksIG51bWlzYSA9IDA7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CkBAIC0zNTUsMTAgKzM0OSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorbW9kdWxlX2luaXQoYXBwbGljb21faW5pdCk7Cittb2R1bGVfZXhpdChhcHBsaWNvbV9leGl0KTsKIAotI2lmbmRlZiBNT0RVTEUKLV9faW5pdGNhbGwoYXBwbGljb21faW5pdCk7Ci0jZW5kaWYKIAogc3RhdGljIHNzaXplX3QgYWNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKIHsKQEAgLTg1MSwyOCArODQ0LDMgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmbmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0IGFwcGxpY29tX3NldHVwKGNoYXIgKnN0cikKLXsKLQlpbnQgaW50c1s0XTsKLQotCSh2b2lkKSBnZXRfb3B0aW9ucyhzdHIsIDQsIGludHMpOwotCi0JaWYgKGludHNbMF0gPiAyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIlRvbyBtYW55IGFyZ3VtZW50cyB0byAnYXBwbGljb209JywgZXhwZWN0ZWQgbWVtLGlycSBvbmx5LlxuIik7Ci0JfQotCi0JaWYgKGludHNbMF0gPCAyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8iYXBwbGljb20gbnVtYXJnczogJWRcbiIsIGludHNbMF0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQltZW0gPSBpbnRzWzFdOwotCWlycSA9IGludHNbMl07Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFwcGxpY29tPSIsIGFwcGxpY29tX3NldHVwKTsKLQotI2VuZGlmCQkJCS8qIE1PRFVMRSAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvY3ljbGFkZXMuYyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCmluZGV4IGNjN2FjZjguLjEyMmU3YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCisrKyBiL2RyaXZlcnMvY2hhci9jeWNsYWRlcy5jCkBAIC0yODMzLDkgKzI4MzMsOCBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgICAgIAotICAgIGlmICghdHR5IHx8ICFpbmZvLT54bWl0X2J1ZiB8fCAhdG1wX2J1Zil7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBpZiAoIWluZm8tPnhtaXRfYnVmIHx8ICF0bXBfYnVmKQorCXJldHVybiAwOwogCiAgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CiAgICAgd2hpbGUgKDEpIHsKQEAgLTI4ODQsNyArMjg4Myw3IEBACiAgICAgaWYgKHNlcmlhbF9wYXJhbm9pYV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJjeV9wdXRfY2hhciIpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisgICAgaWYgKCFpbmZvLT54bWl0X2J1ZikKICAgICAgICAgcmV0dXJuOwogCiAgICAgQ1lfTE9DSyhpbmZvLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZG1hLmMKaW5kZXggOWY0YjhjZS4uYTk0MjMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kbWEuYwpAQCAtNzU4LDcgKzc1OCw5IEBACiAJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9GUkVFKV0gPSB7aTkxNV9tZW1fZnJlZSwgRFJNX0FVVEh9LAogCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfSU5JVF9IRUFQKV0gPSB7aTkxNV9tZW1faW5pdF9oZWFwLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFl9LAogCVtEUk1fSU9DVExfTlIoRFJNX0k5MTVfQ01EQlVGRkVSKV0gPSB7aTkxNV9jbWRidWZmZXIsIERSTV9BVVRIfSwKLQlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X0RFU1RST1lfSEVBUCldID0geyBpOTE1X21lbV9kZXN0cm95X2hlYXAsIERSTV9BVVRIfERSTV9NQVNURVJ8RFJNX1JPT1RfT05MWSB9CisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9ERVNUUk9ZX0hFQVApXSA9IHsgaTkxNV9tZW1fZGVzdHJveV9oZWFwLCBEUk1fQVVUSHxEUk1fTUFTVEVSfERSTV9ST09UX09OTFkgfSwKKwlbRFJNX0lPQ1RMX05SKERSTV9JOTE1X1NFVF9WQkxBTktfUElQRSldID0geyBpOTE1X3ZibGFua19waXBlX3NldCwgRFJNX0FVVEh8RFJNX01BU1RFUnxEUk1fUk9PVF9PTkxZIH0sCisJW0RSTV9JT0NUTF9OUihEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUpXSA9IHsgaTkxNV92YmxhbmtfcGlwZV9nZXQsIERSTV9BVVRIIH0sCiB9OwogCiBpbnQgaTkxNV9tYXhfaW9jdGwgPSBEUk1fQVJSQVlfU0laRShpOTE1X2lvY3Rscyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmggYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJtLmgKaW5kZXggNGNiM2RhNS4uNWFhM2UwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2RybS5oCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcm0uaApAQCAtMTI0LDYgKzEyNCw4IEBACiAjZGVmaW5lIERSTV9JOTE1X0lOSVRfSEVBUAkweDBhCiAjZGVmaW5lIERSTV9JOTE1X0NNREJVRkZFUgkweDBiCiAjZGVmaW5lIERSTV9JOTE1X0RFU1RST1lfSEVBUAkweDBjCisjZGVmaW5lIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRQkweDBkCisjZGVmaW5lIERSTV9JOTE1X0dFVF9WQkxBTktfUElQRQkweDBlCiAKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfSU5JVAkJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0lOSVQsIGRybV9pOTE1X2luaXRfdCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfRkxVU0gJCURSTV9JTyAoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9GTFVTSCkKQEAgLTEzOCw2ICsxNDAsOCBAQAogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9JTklUX0hFQVAgICAgICAgIERSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9JTklUX0hFQVAsIGRybV9pOTE1X21lbV9pbml0X2hlYXBfdCkKICNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfQ01EQlVGRkVSCURSTV9JT1coIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9DTURCVUZGRVIsIGRybV9pOTE1X2NtZGJ1ZmZlcl90KQogI2RlZmluZSBEUk1fSU9DVExfSTkxNV9ERVNUUk9ZX0hFQVAJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X0RFU1RST1lfSEVBUCwgZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90KQorI2RlZmluZSBEUk1fSU9DVExfSTkxNV9TRVRfVkJMQU5LX1BJUEUJRFJNX0lPVyggRFJNX0NPTU1BTkRfQkFTRSArIERSTV9JOTE1X1NFVF9WQkxBTktfUElQRSwgZHJtX2k5MTVfdmJsYW5rX3BpcGVfdCkKKyNkZWZpbmUgRFJNX0lPQ1RMX0k5MTVfR0VUX1ZCTEFOS19QSVBFCURSTV9JT1IoIERSTV9DT01NQU5EX0JBU0UgKyBEUk1fSTkxNV9HRVRfVkJMQU5LX1BJUEUsIGRybV9pOTE1X3ZibGFua19waXBlX3QpCiAKIC8qIEFsbG93IGRyaXZlcnMgdG8gc3VibWl0IGJhdGNoYnVmZmVycyBkaXJlY3RseSB0byBoYXJkd2FyZSwgcmVseWluZwogICogb24gdGhlIHNlY3VyaXR5IG1lY2hhbmlzbXMgcHJvdmlkZWQgYnkgaGFyZHdhcmUuCkBAIC0yMjQsNCArMjI4LDEzIEBACiAJaW50IHJlZ2lvbjsKIH0gZHJtX2k5MTVfbWVtX2Rlc3Ryb3lfaGVhcF90OwogCisvKiBBbGxvdyBYIHNlcnZlciB0byBjb25maWd1cmUgd2hpY2ggcGlwZXMgdG8gbW9uaXRvciBmb3IgdmJsYW5rIHNpZ25hbHMKKyAqLworI2RlZmluZQlEUk1fSTkxNV9WQkxBTktfUElQRV9BCTEKKyNkZWZpbmUJRFJNX0k5MTVfVkJMQU5LX1BJUEVfQgkyCisKK3R5cGVkZWYgc3RydWN0IGRybV9pOTE1X3ZibGFua19waXBlIHsKKwlpbnQgcGlwZTsKK30gZHJtX2k5MTVfdmJsYW5rX3BpcGVfdDsKKwogI2VuZGlmCQkJCS8qIF9JOTE1X0RSTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2Rydi5oCmluZGV4IDdhNjU2NjYuLjJkNTY1MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfZHJ2LmgKQEAgLTQ1LDkgKzQ1LDEwIEBACiAgKiAxLjI6IEFkZCBQb3dlciBNYW5hZ2VtZW50CiAgKiAxLjM6IEFkZCB2Ymxhbmsgc3VwcG9ydAogICogMS40OiBGaXggY21kYnVmZmVyIHBhdGgsIGFkZCBoZWFwIGRlc3Ryb3kKKyAqIDEuNTogQWRkIHZibGFuayBwaXBlIGNvbmZpZ3VyYXRpb24KICAqLwogI2RlZmluZSBEUklWRVJfTUFKT1IJCTEKLSNkZWZpbmUgRFJJVkVSX01JTk9SCQk0CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJNQogI2RlZmluZSBEUklWRVJfUEFUQ0hMRVZFTAkwCiAKIHR5cGVkZWYgc3RydWN0IF9kcm1faTkxNV9yaW5nX2J1ZmZlciB7CkBAIC05Niw2ICs5Nyw3IEBACiAJaW50IGFsbG93X2JhdGNoYnVmZmVyOwogCXN0cnVjdCBtZW1fYmxvY2sgKmFncF9oZWFwOwogCXVuc2lnbmVkIGludCBzcjAxLCBhZHBhLCBwcGNyLCBkdm9iLCBkdm9jLCBsdmRzOworCWludCB2YmxhbmtfcGlwZTsKIH0gZHJtX2k5MTVfcHJpdmF0ZV90OwogCiBleHRlcm4gZHJtX2lvY3RsX2Rlc2NfdCBpOTE1X2lvY3Rsc1tdOwpAQCAtMTE5LDYgKzEyMSw4IEBACiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfcHJlaW5zdGFsbChkcm1fZGV2aWNlX3QgKiBkZXYpOwogZXh0ZXJuIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3Bvc3RpbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CiBleHRlcm4gdm9pZCBpOTE1X2RyaXZlcl9pcnFfdW5pbnN0YWxsKGRybV9kZXZpY2VfdCAqIGRldik7CitleHRlcm4gaW50IGk5MTVfdmJsYW5rX3BpcGVfc2V0KERSTV9JT0NUTF9BUkdTKTsKK2V4dGVybiBpbnQgaTkxNV92YmxhbmtfcGlwZV9nZXQoRFJNX0lPQ1RMX0FSR1MpOwogCiAvKiBpOTE1X21lbS5jICovCiBleHRlcm4gaW50IGk5MTVfbWVtX2FsbG9jKERSTV9JT0NUTF9BUkdTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYyBiL2RyaXZlcnMvY2hhci9kcm0vaTkxNV9pcnEuYwppbmRleCBhNzUyYWZkLi5jZDk2Y2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL2k5MTVfaXJxLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9pOTE1X2lycS5jCkBAIC00NCw3ICs0NCw4IEBACiAJdTE2IHRlbXA7CiAKIAl0ZW1wID0gSTkxNV9SRUFEMTYoSTkxNVJFR19JTlRfSURFTlRJVFlfUik7Ci0JdGVtcCAmPSAoVVNFUl9JTlRfRkxBRyB8IFZTWU5DX1BJUEVBX0ZMQUcpOworCisJdGVtcCAmPSAoVVNFUl9JTlRfRkxBRyB8IFZTWU5DX1BJUEVBX0ZMQUcgfCBWU1lOQ19QSVBFQl9GTEFHKTsKIAogCURSTV9ERUJVRygiJXMgZmxhZz0lMDh4XG4iLCBfX0ZVTkNUSU9OX18sIHRlbXApOwogCkBAIC01OCw3ICs1OSw3IEBACiAJaWYgKHRlbXAgJiBVU0VSX0lOVF9GTEFHKQogCQlEUk1fV0FLRVVQKCZkZXZfcHJpdi0+aXJxX3F1ZXVlKTsKIAotCWlmICh0ZW1wICYgVlNZTkNfUElQRUFfRkxBRykgeworCWlmICh0ZW1wICYgKFZTWU5DX1BJUEVBX0ZMQUcgfCBWU1lOQ19QSVBFQl9GTEFHKSkgewogCQlhdG9taWNfaW5jKCZkZXYtPnZibF9yZWNlaXZlZCk7CiAJCURSTV9XQUtFVVAoJmRldi0+dmJsX3F1ZXVlKTsKIAkJZHJtX3ZibF9zZW5kX3NpZ25hbHMoZGV2KTsKQEAgLTE4Miw2ICsxODMsNjggQEAKIAlyZXR1cm4gaTkxNV93YWl0X2lycShkZXYsIGlycXdhaXQuaXJxX3NlcSk7CiB9CiAKK3N0YXRpYyBpbnQgaTkxNV9lbmFibGVfaW50ZXJydXB0IChkcm1fZGV2aWNlX3QgKmRldikKK3sKKwlkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gKGRybV9pOTE1X3ByaXZhdGVfdCAqKSBkZXYtPmRldl9wcml2YXRlOworCXUxNiBmbGFnOworCisJZmxhZyA9IDA7CisJaWYgKGRldl9wcml2LT52YmxhbmtfcGlwZSAmIERSTV9JOTE1X1ZCTEFOS19QSVBFX0EpCisJCWZsYWcgfD0gVlNZTkNfUElQRUFfRkxBRzsKKwlpZiAoZGV2X3ByaXYtPnZibGFua19waXBlICYgRFJNX0k5MTVfVkJMQU5LX1BJUEVfQikKKwkJZmxhZyB8PSBWU1lOQ19QSVBFQl9GTEFHOworCWlmIChkZXZfcHJpdi0+dmJsYW5rX3BpcGUgJiB+KERSTV9JOTE1X1ZCTEFOS19QSVBFX0F8RFJNX0k5MTVfVkJMQU5LX1BJUEVfQikpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHBpcGUgMHgleFxuIiwKKwkJCSAgX19GVU5DVElPTl9fLCBkZXZfcHJpdi0+dmJsYW5rX3BpcGUpOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKwlJOTE1X1dSSVRFMTYoSTkxNVJFR19JTlRfRU5BQkxFX1IsIFVTRVJfSU5UX0ZMQUcgfCBmbGFnKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHRoZSB2YmxhbmsgbW9uaXRvciBwaXBlCisgKi8KK2ludCBpOTE1X3ZibGFua19waXBlX3NldChEUk1fSU9DVExfQVJHUykKK3sKKwlEUk1fREVWSUNFOworCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCWRybV9pOTE1X3ZibGFua19waXBlX3QgcGlwZTsKKworCWlmICghZGV2X3ByaXYpIHsKKwkJRFJNX0VSUk9SKCIlcyBjYWxsZWQgd2l0aCBubyBpbml0aWFsaXphdGlvblxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKwl9CisKKwlEUk1fQ09QWV9GUk9NX1VTRVJfSU9DVEwocGlwZSwgKGRybV9pOTE1X3ZibGFua19waXBlX3QgX191c2VyICopIGRhdGEsCisJCQkJIHNpemVvZihwaXBlKSk7CisKKwlkZXZfcHJpdi0+dmJsYW5rX3BpcGUgPSBwaXBlLnBpcGU7CisJcmV0dXJuIGk5MTVfZW5hYmxlX2ludGVycnVwdCAoZGV2KTsKK30KKworaW50IGk5MTVfdmJsYW5rX3BpcGVfZ2V0KERSTV9JT0NUTF9BUkdTKQoreworCURSTV9ERVZJQ0U7CisJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJZHJtX2k5MTVfdmJsYW5rX3BpcGVfdCBwaXBlOworCXUxNiBmbGFnOworCisJaWYgKCFkZXZfcHJpdikgeworCQlEUk1fRVJST1IoIiVzIGNhbGxlZCB3aXRoIG5vIGluaXRpYWxpemF0aW9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRFJNX0VSUihFSU5WQUwpOworCX0KKworCWZsYWcgPSBJOTE1X1JFQUQoSTkxNVJFR19JTlRfRU5BQkxFX1IpOworCXBpcGUucGlwZSA9IDA7CisJaWYgKGZsYWcgJiBWU1lOQ19QSVBFQV9GTEFHKQorCQlwaXBlLnBpcGUgfD0gRFJNX0k5MTVfVkJMQU5LX1BJUEVfQTsKKwlpZiAoZmxhZyAmIFZTWU5DX1BJUEVCX0ZMQUcpCisJCXBpcGUucGlwZSB8PSBEUk1fSTkxNV9WQkxBTktfUElQRV9COworCURSTV9DT1BZX1RPX1VTRVJfSU9DVEwoKGRybV9pOTE1X3ZibGFua19waXBlX3QgX191c2VyICopIGRhdGEsIHBpcGUsCisJCQkJIHNpemVvZihwaXBlKSk7CisJcmV0dXJuIDA7Cit9CisKIC8qIGRybV9kbWEuaCBob29rcwogKi8KIHZvaWQgaTkxNV9kcml2ZXJfaXJxX3ByZWluc3RhbGwoZHJtX2RldmljZV90ICogZGV2KQpAQCAtMTk3LDcgKzI2MCw3IEBACiB7CiAJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IChkcm1faTkxNV9wcml2YXRlX3QgKikgZGV2LT5kZXZfcHJpdmF0ZTsKIAotCUk5MTVfV1JJVEUxNihJOTE1UkVHX0lOVF9FTkFCTEVfUiwgVVNFUl9JTlRfRkxBRyB8IFZTWU5DX1BJUEVBX0ZMQUcpOworCWk5MTVfZW5hYmxlX2ludGVycnVwdChkZXYpOwogCURSTV9JTklUX1dBSVRRVUVVRSgmZGV2X3ByaXYtPmlycV9xdWV1ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9jcC5jCmluZGV4IDdmOTQ5YzkuLjVhZDQzYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2NwLmMKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fY3AuYwpAQCAtMzksNyArMzksNyBAQAogc3RhdGljIGludCByYWRlb25fZG9fY2xlYW51cF9jcChkcm1fZGV2aWNlX3QgKiBkZXYpOwogCiAvKiBDUCBtaWNyb2NvZGUgKGZyb20gQVRJKSAqLwotc3RhdGljIHUzMiBSMjAwX2NwX21pY3JvY29kZVtdWzJdID0geworc3RhdGljIGNvbnN0IHUzMiBSMjAwX2NwX21pY3JvY29kZVtdWzJdID0gewogCXsweDIxMDA3MDAwLCAwMDAwMDAwMDAwfSwKIAl7MHgyMDAwNzAwMCwgMDAwMDAwMDAwMH0sCiAJezB4MDAwMDAwYWIsIDB4MDAwMDAwMDR9LApAQCAtMjk4LDcgKzI5OCw3IEBACiAJezAwMDAwMDAwMDAsIDAwMDAwMDAwMDB9LAogfTsKIAotc3RhdGljIHUzMiByYWRlb25fY3BfbWljcm9jb2RlW11bMl0gPSB7CitzdGF0aWMgY29uc3QgdTMyIHJhZGVvbl9jcF9taWNyb2NvZGVbXVsyXSA9IHsKIAl7MHgyMTAwNzAwMCwgMDAwMDAwMDAwMH0sCiAJezB4MjAwMDcwMDAsIDAwMDAwMDAwMDB9LAogCXsweDAwMDAwMGI0LCAweDAwMDAwMDA0fSwKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCXswMDAwMDAwMDAwLCAwMDAwMDAwMDAwfSwKIH07CiAKLXN0YXRpYyB1MzIgUjMwMF9jcF9taWNyb2NvZGVbXVsyXSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgUjMwMF9jcF9taWNyb2NvZGVbXVsyXSA9IHsKIAl7MHg0MjAwZTAwMCwgMDAwMDAwMDAwMH0sCiAJezB4NDAwMGUwMDAsIDAwMDAwMDAwMDB9LAogCXsweDAwMDAwMGFmLCAweDAwMDAwMDA4fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX2RybS5oIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKaW5kZXggYzhlMjc5ZS4uOGQ2MzUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKKysrIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJtLmgKQEAgLTE2MSw3ICsxNjEsOCBAQAogI2RlZmluZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfMyAgICAgICAgICAgICAgICAgICAgIDkxCiAjZGVmaW5lIFIyMDBfRU1JVF9QUF9UWENUTEFMTF80ICAgICAgICAgICAgICAgICAgICAgOTIKICNkZWZpbmUgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzUgICAgICAgICAgICAgICAgICAgICA5MwotI2RlZmluZSBSQURFT05fTUFYX1NUQVRFX1BBQ0tFVFMgICAgICAgICAgICAgICAgICAgIDk0CisjZGVmaW5lIFIyMDBfRU1JVF9WQVBfUFZTX0NOVEwgICAgICAgICAgICAgICAgICAgICAgOTQKKyNkZWZpbmUgUkFERU9OX01BWF9TVEFURV9QQUNLRVRTICAgICAgICAgICAgICAgICAgICA5NQogCiAvKiBDb21tYW5kcyB1bmRlcnN0b29kIGJ5IGNtZF9idWZmZXIgaW9jdGwuICBNb3JlIGNhbiBiZSBhZGRlZCBidXQKICAqIG9idmlvdXNseSB0aGVzZSBjYW4ndCBiZSByZW1vdmVkIG9yIGNoYW5nZWQ6CkBAIC0xNzYsNiArMTc3LDcgQEAKICNkZWZpbmUgUkFERU9OX0NNRF9XQUlUICAgICAgICAgOAkvKiBlbWl0IGh3IHdhaXQgY29tbWFuZHMgLS0gbm90ZToKIAkJCQkJICogIGRvZXNuJ3QgbWFrZSB0aGUgY3B1IHdhaXQsIGp1c3QKIAkJCQkJICogIHRoZSBncmFwaGljcyBoYXJkd2FyZSAqLworI2RlZmluZSBSQURFT05fQ01EX1ZFQ0xJTkVBUgk5ICAgICAgIC8qIGFub3RoZXIgcjIwMCBzdG9wZ2FwICovCiAKIHR5cGVkZWYgdW5pb24gewogCWludCBpOwpAQCAtMTkyLDYgKzE5NCw5IEBACiAJCXVuc2lnbmVkIGNoYXIgY21kX3R5cGUsIG9mZnNldCwgc3RyaWRlLCBjb3VudDsKIAl9IHZlY3RvcnM7CiAJc3RydWN0IHsKKwkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgYWRkcl9sbywgYWRkcl9oaSwgY291bnQ7CisJfSB2ZWNsaW5lYXI7CisJc3RydWN0IHsKIAkJdW5zaWduZWQgY2hhciBjbWRfdHlwZSwgYnVmX2lkeCwgcGFkMCwgcGFkMTsKIAl9IGRtYTsKIAlzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fZHJ2LmggYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAppbmRleCA3ODM0NWNlLi5lNWEyNTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaAorKysgYi9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9kcnYuaApAQCAtMzgsNyArMzgsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkicmFkZW9uIgogI2RlZmluZSBEUklWRVJfREVTQwkJIkFUSSBSYWRlb24iCi0jZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNjAyMjUiCisjZGVmaW5lIERSSVZFUl9EQVRFCQkiMjAwNjA1MjQiCiAKIC8qIEludGVyZmFjZSBoaXN0b3J5OgogICoKQEAgLTkzLDkgKzkzLDExIEBACiAgKiAxLjIyLSBBZGQgc3VwcG9ydCBmb3IgdGV4dHVyZSBjYWNoZSBmbHVzaGVzIChSMzAwX1RYX0NOVEwpCiAgKiAxLjIzLSBBZGQgbmV3IHJhZGVvbiBtZW1vcnkgbWFwIHdvcmsgZnJvbSBiZW5oCiAgKiAxLjI0LSBBZGQgZ2VuZXJhbC1wdXJwb3NlIHBhY2tldCBmb3IgbWFuaXB1bGF0aW5nIHNjcmF0Y2ggcmVnaXN0ZXJzIChyMzAwKQorICogMS4yNS0gQWRkIHN1cHBvcnQgZm9yIHIyMDAgdmVydGV4IHByb2dyYW1zIChSMjAwX0VNSVRfVkFQX1BWU19DTlRMLAorICogICAgICAgbmV3IHBhY2tldCB0eXBlKQogICovCiAjZGVmaW5lIERSSVZFUl9NQUpPUgkJMQotI2RlZmluZSBEUklWRVJfTUlOT1IJCTI0CisjZGVmaW5lIERSSVZFUl9NSU5PUgkJMjUKICNkZWZpbmUgRFJJVkVSX1BBVENITEVWRUwJMAogCiAvKgpAQCAtODg0LDYgKzg4Niw4IEBACiAjZGVmaW5lIFJBREVPTl9QUF9DVUJJQ19PRkZTRVRfVDFfMCAgICAgICAgIDB4MWUwMAogI2RlZmluZSBSQURFT05fUFBfQ1VCSUNfT0ZGU0VUX1QyXzAgICAgICAgICAweDFlMTQKIAorI2RlZmluZSBSQURFT05fU0VfVENMX1NUQVRFX0ZMVVNIICAgICAgICAgICAweDIyODQKKwogI2RlZmluZSBTRV9WQVBfQ05UTF9fVENMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIFNFX1ZBUF9DTlRMX19GT1JDRV9XX1RPX09ORV9NQVNLICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKICNkZWZpbmUgU0VfVkFQX0NOVExfX1ZGX01BWF9WVFhfTlVNX19TSElGVCAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMgpAQCAtOTA1LDYgKzkwOSw4IEBACiAjZGVmaW5lIFIyMDBfUFBfQUZTXzAgICAgICAgICAgICAgICAgICAgICAweDJmODAKICNkZWZpbmUgUjIwMF9QUF9BRlNfMSAgICAgICAgICAgICAgICAgICAgIDB4MmYwMAkvKiBzYW1lIGFzIHR4Y2JsZW5kXzAgKi8KIAorI2RlZmluZSBSMjAwX1ZBUF9QVlNfQ05UTF8xICAgICAgICAgICAgICAgMHgyMkQwCisKIC8qIENvbnN0YW50cyAqLwogI2RlZmluZSBSQURFT05fTUFYX1VTRUNfVElNRU9VVAkJMTAwMDAwCS8qIDEwMCBtcyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jIGIvZHJpdmVycy9jaGFyL2RybS9yYWRlb25fc3RhdGUuYwppbmRleCBjNWI4Zjc3Li41YmIyMjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZHJtL3JhZGVvbl9zdGF0ZS5jCisrKyBiL2RyaXZlcnMvY2hhci9kcm0vcmFkZW9uX3N0YXRlLmMKQEAgLTI0OSw2ICsyNDksNyBAQAogCWNhc2UgUjIwMF9FTUlUX1BQX1RYQ1RMQUxMXzM6CiAJY2FzZSBSMjAwX0VNSVRfUFBfVFhDVExBTExfNDoKIAljYXNlIFIyMDBfRU1JVF9QUF9UWENUTEFMTF81OgorCWNhc2UgUjIwMF9FTUlUX1ZBUF9QVlNfQ05UTDoKIAkJLyogVGhlc2UgcGFja2V0cyBkb24ndCBjb250YWluIG1lbW9yeSBvZmZzZXRzICovCiAJCWJyZWFrOwogCkBAIC02MjYsNiArNjI3LDcgQEAKIAl7UjIwMF9QUF9UWEZJTFRFUl8zLCA4LCAiUjIwMF9QUF9UWENUTEFMTF8zIn0sCiAJe1IyMDBfUFBfVFhGSUxURVJfNCwgOCwgIlIyMDBfUFBfVFhDVExBTExfNCJ9LAogCXtSMjAwX1BQX1RYRklMVEVSXzUsIDgsICJSMjAwX1BQX1RYQ1RMQUxMXzUifSwKKwl7UjIwMF9WQVBfUFZTX0NOVExfMSwgMiwgIlIyMDBfVkFQX1BWU19DTlRMIn0sCiB9OwogCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yNTk1LDcgKzI1OTcsOCBAQAogCWludCBzdHJpZGUgPSBoZWFkZXIudmVjdG9ycy5zdHJpZGU7CiAJUklOR19MT0NBTFM7CiAKLQlCRUdJTl9SSU5HKDMgKyBzeik7CisJQkVHSU5fUklORyg1ICsgc3opOworCU9VVF9SSU5HX1JFRyhSQURFT05fU0VfVENMX1NUQVRFX0ZMVVNILCAwKTsKIAlPVVRfUklORyhDUF9QQUNLRVQwKFJBREVPTl9TRV9UQ0xfVkVDVE9SX0lORFhfUkVHLCAwKSk7CiAJT1VUX1JJTkcoc3RhcnQgfCAoc3RyaWRlIDw8IFJBREVPTl9WRUNfSU5EWF9PQ1RXT1JEX1NUUklERV9TSElGVCkpOwogCU9VVF9SSU5HKENQX1BBQ0tFVDBfVEFCTEUoUkFERU9OX1NFX1RDTF9WRUNUT1JfREFUQV9SRUcsIChzeiAtIDEpKSk7CkBAIC0yNjA3LDYgKzI2MTAsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIF9faW5saW5lX18gaW50IHJhZGVvbl9lbWl0X3ZlY2xpbmVhcihkcm1fcmFkZW9uX3ByaXZhdGVfdCAqZGV2X3ByaXYsCisJCQkJCSAgZHJtX3JhZGVvbl9jbWRfaGVhZGVyX3QgaGVhZGVyLAorCQkJCQkgIGRybV9yYWRlb25fa2NtZF9idWZmZXJfdCAqY21kYnVmKQoreworCWludCBzeiA9IGhlYWRlci52ZWNsaW5lYXIuY291bnQgKiA0OworCWludCBzdGFydCA9IGhlYWRlci52ZWNsaW5lYXIuYWRkcl9sbyB8IChoZWFkZXIudmVjbGluZWFyLmFkZHJfaGkgPDwgOCk7CisJUklOR19MT0NBTFM7CisKKyAgICAgICAgaWYgKCFzeikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHN6ICogNCA+IGNtZGJ1Zi0+YnVmc3opCisgICAgICAgICAgICAgICAgcmV0dXJuIERSTV9FUlIoRUlOVkFMKTsKKworCUJFR0lOX1JJTkcoNSArIHN6KTsKKwlPVVRfUklOR19SRUcoUkFERU9OX1NFX1RDTF9TVEFURV9GTFVTSCwgMCk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMChSQURFT05fU0VfVENMX1ZFQ1RPUl9JTkRYX1JFRywgMCkpOworCU9VVF9SSU5HKHN0YXJ0IHwgKDEgPDwgUkFERU9OX1ZFQ19JTkRYX09DVFdPUkRfU1RSSURFX1NISUZUKSk7CisJT1VUX1JJTkcoQ1BfUEFDS0VUMF9UQUJMRShSQURFT05fU0VfVENMX1ZFQ1RPUl9EQVRBX1JFRywgKHN6IC0gMSkpKTsKKwlPVVRfUklOR19UQUJMRShjbWRidWYtPmJ1Ziwgc3opOworCUFEVkFOQ0VfUklORygpOworCisJY21kYnVmLT5idWYgKz0gc3ogKiBzaXplb2YoaW50KTsKKwljbWRidWYtPmJ1ZnN6IC09IHN6ICogc2l6ZW9mKGludCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcmFkZW9uX2VtaXRfcGFja2V0Myhkcm1fZGV2aWNlX3QgKiBkZXYsCiAJCQkgICAgICAgZHJtX2ZpbGVfdCAqIGZpbHBfcHJpdiwKIAkJCSAgICAgICBkcm1fcmFkZW9uX2tjbWRfYnVmZmVyX3QgKmNtZGJ1ZikKQEAgLTI4NjUsNiArMjg5NCwxNCBAQAogCQkJCWdvdG8gZXJyOwogCQkJfQogCQkJYnJlYWs7CisJCWNhc2UgUkFERU9OX0NNRF9WRUNMSU5FQVI6CisJCQlEUk1fREVCVUcoIlJBREVPTl9DTURfVkVDTElORUFSXG4iKTsKKwkJCWlmIChyYWRlb25fZW1pdF92ZWNsaW5lYXIoZGV2X3ByaXYsIGhlYWRlciwgJmNtZGJ1ZikpIHsKKwkJCQlEUk1fRVJST1IoInJhZGVvbl9lbWl0X3ZlY2xpbmVhciBmYWlsZWRcbiIpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCURSTV9FUlJPUigiYmFkIGNtZF90eXBlICVkIGF0ICVwXG4iLAogCQkJCSAgaGVhZGVyLmhlYWRlci5jbWRfdHlwZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9lc3AuYyBiL2RyaXZlcnMvY2hhci9lc3AuYwppbmRleCAwOWRjNGIwLi45MjIxNzRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvZXNwLmMKKysrIGIvZHJpdmVycy9jaGFyL2VzcC5jCkBAIC0xMjEyLDcgKzEyMTIsNyBAQAogCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfcHV0X2NoYXIiKSkKIAkJcmV0dXJuOwogCi0JaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCWlmICghaW5mby0+eG1pdF9idWYpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5sb2NrLCBmbGFncyk7CkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogCWlmIChzZXJpYWxfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAicnNfd3JpdGUiKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+eG1pdF9idWYpCisJaWYgKCFpbmZvLT54bWl0X2J1ZikKIAkJcmV0dXJuIDA7CiAJICAgIAogCXdoaWxlICgxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHBldC5jIGIvZHJpdmVycy9jaGFyL2hwZXQuYwppbmRleCBlZjE0MGViLi4wNzQ3M2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHBldC5jCisrKyBiL2RyaXZlcnMvY2hhci9ocGV0LmMKQEAgLTkyNSwxMSArOTI1LDggQEAKIAlzdGF0dXMgPSBhY3BpX3Jlc291cmNlX3RvX2FkZHJlc3M2NChyZXMsICZhZGRyKTsKIAogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewotCQl1bnNpZ25lZCBsb25nIHNpemU7Ci0KLQkJc2l6ZSA9IGFkZHIubWF4aW11bSAtIGFkZHIubWluaW11bSArIDE7CiAJCWhkcC0+aGRfcGh5c19hZGRyZXNzID0gYWRkci5taW5pbXVtOwotCQloZHAtPmhkX2FkZHJlc3MgPSBpb3JlbWFwKGFkZHIubWluaW11bSwgc2l6ZSk7CisJCWhkcC0+aGRfYWRkcmVzcyA9IGlvcmVtYXAoYWRkci5taW5pbXVtLCBhZGRyLmFkZHJlc3NfbGVuZ3RoKTsKIAogCQlpZiAoaHBldF9pc19rbm93bihoZHApKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDB4JWx4IGlzIGJ1c3lcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHZjX2NvbnNvbGUuYyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCmluZGV4IDJiNmE1NmIuLmE1YzZhOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfY29uc29sZS5jCkBAIC01NTMsNyArNTUzLDYgQEAKIAogI2RlZmluZSBIVkNfUE9MTF9SRUFECTB4MDAwMDAwMDEKICNkZWZpbmUgSFZDX1BPTExfV1JJVEUJMHgwMDAwMDAwMgotI2RlZmluZSBIVkNfUE9MTF9RVUlDSwkweDAwMDAwMDA0CiAKIHN0YXRpYyBpbnQgaHZjX3BvbGwoc3RydWN0IGh2Y19zdHJ1Y3QgKmhwKQogewpAQCAtNTY4LDYgKzU2Nyw3IEBACiAJLyogUHVzaCBwZW5kaW5nIHdyaXRlcyAqLwogCWlmIChocC0+bl9vdXRidWYgPiAwKQogCQlodmNfcHVzaChocCk7CisKIAkvKiBSZXNjaGVkdWxlIHVzIGlmIHN0aWxsIHNvbWUgd3JpdGUgcGVuZGluZyAqLwogCWlmIChocC0+bl9vdXRidWYgPiAwKQogCQlwb2xsX21hc2sgfD0gSFZDX1BPTExfV1JJVEU7CkBAIC02ODAsNyArNjgwLDcgQEAKIAkJCXBvbGxfbWFzayB8PSBIVkNfUE9MTF9SRUFEOwogCQlpZiAoaHZjX2tpY2tlZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAocG9sbF9tYXNrICYgSFZDX1BPTExfUVVJQ0spIHsKKwkJaWYgKHBvbGxfbWFzayAmIEhWQ19QT0xMX1dSSVRFKSB7CiAJCQl5aWVsZCgpOwogCQkJY29udGludWU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9odmNfcnRhcy5jIGIvZHJpdmVycy9jaGFyL2h2Y19ydGFzLmMKaW5kZXggODMzNjRlYS4uNTcxMDZlMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9odmNfcnRhcy5jCisrKyBiL2RyaXZlcnMvY2hhci9odmNfcnRhcy5jCkBAIC00MSwzNyArNDEsMjggQEAKICNkZWZpbmUgaHZjX3J0YXNfY29va2llIDB4Njc3ODFlMTUKIHN0cnVjdCBodmNfc3RydWN0ICpodmNfcnRhc19kZXY7CiAKLSNkZWZpbmUgUlRBU0NPTlNfUFVUX0FUVEVNUFRTICAxNgotCiBzdGF0aWMgaW50IHJ0YXNjb25zX3B1dF9jaGFyX3Rva2VuID0gUlRBU19VTktOT1dOX1NFUlZJQ0U7CiBzdGF0aWMgaW50IHJ0YXNjb25zX2dldF9jaGFyX3Rva2VuID0gUlRBU19VTktOT1dOX1NFUlZJQ0U7Ci1zdGF0aWMgaW50IHJ0YXNjb25zX3B1dF9kZWxheSA9IDEwMDsKLW1vZHVsZV9wYXJhbV9uYW1lZChwdXRfZGVsYXksIHJ0YXNjb25zX3B1dF9kZWxheSwgaW50LCAwNjQ0KTsKIAotc3RhdGljIGlubGluZSBpbnQgaHZjX3J0YXNfd3JpdGVfY29uc29sZSh1aW50MzJfdCB2dGVybW5vLCBjb25zdCBjaGFyICpidWYsIGludCBjb3VudCkKLXsKLQlpbnQgZG9uZTsKLQotCS8qIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIHRvIGJlIGRpc3BsYXllZCwgd2FpdCBhIGJpdCAqLwotCWZvciAoZG9uZSA9IDA7IGRvbmUgPCBjb3VudDsgZG9uZSsrKSB7Ci0JCWludCByZXN1bHQ7Ci0JCXJlc3VsdCA9IHJ0YXNfY2FsbChydGFzY29uc19wdXRfY2hhcl90b2tlbiwgMSwgMSwgTlVMTCwgYnVmW2RvbmVdKTsKLQkJaWYgKHJlc3VsdCkKLQkJCWJyZWFrOwotCX0KLQkvKiB0aGUgY2FsbGluZyByb3V0aW5lIGV4cGVjdHMgdG8gcmVjZWl2ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQgKi8KLQlyZXR1cm4gZG9uZTsKLX0KLQotc3RhdGljIGludCBodmNfcnRhc19yZWFkX2NvbnNvbGUodWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpCitzdGF0aWMgaW5saW5lIGludCBodmNfcnRhc193cml0ZV9jb25zb2xlKHVpbnQzMl90IHZ0ZXJtbm8sIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJaW50IGNvdW50KQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJaW50IGMsIGVycjsKKwkJaWYgKHJ0YXNfY2FsbChydGFzY29uc19wdXRfY2hhcl90b2tlbiwgMSwgMSwgTlVMTCwgYnVmW2ldKSkKKwkJCWJyZWFrOworCX0KIAotCQllcnIgPSBydGFzX2NhbGwocnRhc2NvbnNfZ2V0X2NoYXJfdG9rZW4sIDAsIDIsICZjKTsKLQkJaWYgKGVycikKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBodmNfcnRhc19yZWFkX2NvbnNvbGUodWludDMyX3QgdnRlcm1ubywgY2hhciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGksIGM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAocnRhc19jYWxsKHJ0YXNjb25zX2dldF9jaGFyX3Rva2VuLCAwLCAyLCAmYykpCiAJCQlicmVhazsKIAogCQlidWZbaV0gPSBjOwpAQCAtMTA2LDcgKzk3LDkgQEAKIAlocCA9IGh2Y19hbGxvYyhodmNfcnRhc19jb29raWUsIE5PX0lSUSwgJmh2Y19ydGFzX2dldF9wdXRfb3BzKTsKIAlpZiAoSVNfRVJSKGhwKSkKIAkJcmV0dXJuIFBUUl9FUlIoaHApOworCiAJaHZjX3J0YXNfZGV2ID0gaHA7CisKIAlyZXR1cm4gMDsKIH0KIG1vZHVsZV9pbml0KGh2Y19ydGFzX2luaXQpOwpAQCAtMTE0LDggKzEwNyw4IEBACiAvKiBUaGlzIHdpbGwgdGVhciBkb3duIHRoZSB0dHkgcG9ydGlvbiBvZiB0aGUgZHJpdmVyICovCiBzdGF0aWMgdm9pZCBfX2V4aXQgaHZjX3J0YXNfZXhpdCh2b2lkKQogewotCS8qIFJlYWxseSB0aGUgZnVuIGlzbid0IG92ZXIgdW50aWwgdGhlIHdvcmtlciB0aHJlYWQgYnJlYWtzIGRvd24gYW5kIHRoZQotCSAqIHR0eSBjbGVhbnMgdXAgKi8KKwkvKiBSZWFsbHkgdGhlIGZ1biBpc24ndCBvdmVyIHVudGlsIHRoZSB3b3JrZXIgdGhyZWFkIGJyZWFrcyBkb3duIGFuZAorCSAqIHRoZSB0dHkgY2xlYW5zIHVwICovCiAJaWYgKGh2Y19ydGFzX2RldikKIAkJaHZjX3JlbW92ZShodmNfcnRhc19kZXYpOwogfQpAQCAtMTI3LDEyICsxMjAsMTQgQEAKIAlydGFzY29uc19wdXRfY2hhcl90b2tlbiA9IHJ0YXNfdG9rZW4oInB1dC10ZXJtLWNoYXIiKTsKIAlpZiAocnRhc2NvbnNfcHV0X2NoYXJfdG9rZW4gPT0gUlRBU19VTktOT1dOX1NFUlZJQ0UpCiAJCXJldHVybiAtRUlPOworCiAJcnRhc2NvbnNfZ2V0X2NoYXJfdG9rZW4gPSBydGFzX3Rva2VuKCJnZXQtdGVybS1jaGFyIik7CiAJaWYgKHJ0YXNjb25zX2dldF9jaGFyX3Rva2VuID09IFJUQVNfVU5LTk9XTl9TRVJWSUNFKQogCQlyZXR1cm4gLUVJTzsKIAotCWh2Y19pbnN0YW50aWF0ZShodmNfcnRhc19jb29raWUsIDAsICZodmNfcnRhc19nZXRfcHV0X29wcyApOworCWh2Y19pbnN0YW50aWF0ZShodmNfcnRhc19jb29raWUsIDAsICZodmNfcnRhc19nZXRfcHV0X29wcyk7CiAJYWRkX3ByZWZlcnJlZF9jb25zb2xlKCJodmMiLCAwLCBOVUxMKTsKKwogCXJldHVybiAwOwogfQogY29uc29sZV9pbml0Y2FsbChodmNfcnRhc19jb25zb2xlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h2c2kuYyBiL2RyaXZlcnMvY2hhci9odnNpLmMKaW5kZXggYTk1MjIxOC4uYTAzNzBlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h2c2kuYworKysgYi9kcml2ZXJzL2NoYXIvaHZzaS5jCkBAIC0xMTc5LDcgKzExNzksNyBAQAogCWlmICh0dHlfcmVnaXN0ZXJfZHJpdmVyKGh2c2lfZHJpdmVyKSkKIAkJcGFuaWMoIkNvdWxkbid0IHJlZ2lzdGVyIGh2c2kgY29uc29sZSBkcml2ZXJcbiIpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiSFZTSTogcmVnaXN0ZXJlZCAlaSBkZXZpY2VzXG4iLCBodnNpX2NvdW50KTsKKwlwcmludGsoS0VSTl9ERUJVRyAiSFZTSTogcmVnaXN0ZXJlZCAlaSBkZXZpY2VzXG4iLCBodnNpX2NvdW50KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwMi9pcDJtYWluLmMgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwppbmRleCAwM2RiMWNiLi45YWIzM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYworKysgYi9kcml2ZXJzL2NoYXIvaXAyL2lwMm1haW4uYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIC8vIFNvbWUgZnVuY3Rpb25zIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCBpcnEncyB3ZSBoYXZlCiAKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBpc192YWxpZF9pcnEoaW50IGlycSkKIHsKIAlpbnQgKmkgPSBWYWxpZF9JcnFzOwpAQCAtMzE2LDE0ICszMTYsMTQgQEAKIAlyZXR1cm4gKCppKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0CitzdGF0aWMgdm9pZAogbWFya19yZXF1ZXN0ZWRfaXJxKCBjaGFyIGlycSApCiB7CiAJcmlycXNbaWluZHgrK10gPSBpcnE7CiB9CiAKICNpZmRlZiBNT0RVTEUKLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50CiBjbGVhcl9yZXF1ZXN0ZWRfaXJxKCBjaGFyIGlycSApCiB7CiAJaW50IGk7CkBAIC0zMzcsNyArMzM3LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludAogaGF2ZV9yZXF1ZXN0ZWRfaXJxKCBjaGFyIGlycSApCiB7CiAJLy8gYXJyYXkgaW5pdCB0byB6ZXJvcyBzbyAwIGlycSB3aWxsIG5vdCBiZSByZXF1ZXN0ZWQgYXMgYSBzaWRlIGVmZmVjdApAQCAtODE4LDcgKzgxOCw3IEBACiAvKiB0aGUgYm9hcmQsIHRoZSBjaGFubmVsIHN0cnVjdHVyZXMgYXJlIGluaXRpYWxpemVkLCBhbmQgdGhlIGJvYXJkIGRldGFpbHMgICAqLwogLyogYXJlIHJlcG9ydGVkIG9uIHRoZSBjb25zb2xlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBfX2luaXQKK3N0YXRpYyB2b2lkCiBpcDJfaW5pdF9ib2FyZCggaW50IGJvYXJkbnVtICkKIHsKIAlpbnQgaTsKQEAgLTk2MSw3ICs5NjEsNyBAQAogLyogRUlTQSBtb3RoZXJib2FyZCwgb3Igbm8gdmFsaWQgYm9hcmQgSUQgaXMgc2VsZWN0ZWQgaXQgcmV0dXJucyAwLiBPdGhlcndpc2UgKi8KIC8qIGl0IHJldHVybnMgdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IF9faW5pdAorc3RhdGljIHVuc2lnbmVkIHNob3J0CiBmaW5kX2Vpc2FfYm9hcmQoIGludCBzdGFydF9zbG90ICkKIHsKIAlpbnQgaSwgajsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfd2F0Y2hkb2cuYwppbmRleCAyZDExZGRkLi44Zjg4NjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCkBAIC0yMTIsMjQgKzIxMiwxNiBAQAogewogCWFjdGlvbl9mbiAgZm4gPSAoYWN0aW9uX2ZuKSBrcC0+YXJnOwogCWludCAgICAgICAgcnYgPSAwOwotCWNvbnN0IGNoYXIgKmVuZDsKLQljaGFyICAgICAgIHZhbGNwWzE2XTsKLQlpbnQgICAgICAgIGxlbjsKKwljaGFyICAgICAgICpkdXAsICpzOwogCi0JLyogVHJ1bmNhdGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2VzLiAqLwotCXdoaWxlIChpc3NwYWNlKCp2YWwpKQotCQl2YWwrKzsKLQllbmQgPSB2YWwgKyBzdHJsZW4odmFsKSAtIDE7Ci0Jd2hpbGUgKChlbmQgPj0gdmFsKSAmJiBpc3NwYWNlKCplbmQpKQotCQllbmQtLTsKLQlsZW4gPSBlbmQgLSB2YWwgKyAxOwotCWlmIChsZW4gPiBzaXplb2YodmFsY3ApIC0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtY3B5KHZhbGNwLCB2YWwsIGxlbik7Ci0JdmFsY3BbbGVuXSA9ICdcMCc7CisJZHVwID0ga3N0cmR1cCh2YWwsIEdGUF9LRVJORUwpOworCWlmICghZHVwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXMgPSBzdHJzdHJpcChkdXApOwogCiAJZG93bl9yZWFkKCZyZWdpc3Rlcl9zZW0pOwotCXJ2ID0gZm4odmFsY3AsIE5VTEwpOworCXJ2ID0gZm4ocywgTlVMTCk7CiAJaWYgKHJ2KQogCQlnb3RvIG91dF91bmxvY2s7CiAKQEAgLTIzOSw2ICsyMzEsNyBAQAogCiAgb3V0X3VubG9jazoKIAl1cF9yZWFkKCZyZWdpc3Rlcl9zZW0pOworCWtmcmVlKGR1cCk7CiAJcmV0dXJuIHJ2OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXNpY29tLmMgYi9kcml2ZXJzL2NoYXIvaXNpY29tLmMKaW5kZXggZTllYmFiYS4uZWZhYWExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lzaWNvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9pc2ljb20uYwpAQCAtMTE0NSw3ICsxMTQ1LDcgQEAKIAlpZiAoaXNpY29tX3BhcmFub2lhX2NoZWNrKHBvcnQsIHR0eS0+bmFtZSwgImlzaWNvbV93cml0ZSIpKQogCQlyZXR1cm4gMDsKIAotCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZikKKwlpZiAoIXBvcnQtPnhtaXRfYnVmKQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKQEAgLTExODAsNyArMTE4MCw3IEBACiAJaWYgKGlzaWNvbV9wYXJhbm9pYV9jaGVjayhwb3J0LCB0dHktPm5hbWUsICJpc2ljb21fcHV0X2NoYXIiKSkKIAkJcmV0dXJuOwogCi0JaWYgKCF0dHkgfHwgIXBvcnQtPnhtaXRfYnVmKQorCWlmICghcG9ydC0+eG1pdF9idWYpCiAJCXJldHVybjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5jYXJkX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9rZXlib2FyZC5jIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKaW5kZXggNTc1NWI3ZS4uZWRkOTk2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKKysrIGIvZHJpdmVycy9jaGFyL2tleWJvYXJkLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogCiBzdGF0aWMgdm9pZCBrYmRfZGlzY29ubmVjdChzdHJ1Y3QgaW5wdXRfaGFuZGxlICpoYW5kbGUpOwogZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21tdGltZXIuYyBiL2RyaXZlcnMvY2hhci9tbXRpbWVyLmMKaW5kZXggMWIwNWZhNi4uZDY1YjMxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21tdGltZXIuYworKysgYi9kcml2ZXJzL2NoYXIvbW10aW1lci5jCkBAIC0zMjksNyArMzI5LDYgQEAKIAlpZiAoUEFHRV9TSVpFID4gKDEgPDwgMTYpKQogCQlyZXR1cm4gLUVOT1NZUzsKIAotCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fU0hNIHwgVk1fTE9DS0VEICk7CiAJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKIAogCW1tdGltZXJfYWRkciA9IF9fcGEoUlRDX0NPVU5URVJfQUREUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbXhzZXIuYyBiL2RyaXZlcnMvY2hhci9teHNlci5jCmluZGV4IDBmYjJmYjkuLjY0NWQ5ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9teHNlci5jCisrKyBiL2RyaXZlcnMvY2hhci9teHNlci5jCkBAIC05LDcgKzksNyBAQAogICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgogICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKQEAgLTcxLDggKzcxLDggQEAKICNkZWZpbmUJTVhTRVJNQUpPUgkgMTc0CiAjZGVmaW5lCU1YU0VSQ1VNQUpPUgkgMTc1CiAKLSNkZWZpbmUJTVhTRVJfRVZFTlRfVFhMT1cJIDEKLSNkZWZpbmUJTVhTRVJfRVZFTlRfSEFOR1VQCSAyCisjZGVmaW5lCU1YU0VSX0VWRU5UX1RYTE9XCTEKKyNkZWZpbmUJTVhTRVJfRVZFTlRfSEFOR1VQCTIKIAogI2RlZmluZSBNWFNFUl9CT0FSRFMJCTQJLyogTWF4LiBib2FyZHMgKi8KICNkZWZpbmUgTVhTRVJfUE9SVFMJCTMyCS8qIE1heC4gcG9ydHMgKi8KQEAgLTkyLDcgKzkyLDggQEAKICNkZWZpbmUgVUFSVF9NQ1JfQUZFCQkweDIwCiAjZGVmaW5lIFVBUlRfTFNSX1NQRUNJQUwJMHgxRQogCi0jZGVmaW5lIFJFTEVWQU5UX0lGTEFHKGlmbGFnKQkoaWZsYWcgJiAoSUdOQlJLfEJSS0lOVHxJR05QQVJ8UEFSTVJLfElOUENLfElYT058SVhPRkYpKQorI2RlZmluZSBSRUxFVkFOVF9JRkxBRyhpZmxhZykJKGlmbGFnICYgKElHTkJSS3xCUktJTlR8SUdOUEFSfFBBUk1SS3xJTlBDS3xcCisJCQkJCSAgSVhPTnxJWE9GRikpCiAKICNkZWZpbmUgSVJRX1QoaW5mbykgKChpbmZvLT5mbGFncyAmIEFTWU5DX1NIQVJFX0lSUSkgPyBTQV9TSElSUSA6IFNBX0lOVEVSUlVQVCkKIApAQCAtMTUyLDI3ICsxNTMsMjcgQEAKIH07CiAKIHN0YXRpYyBpbnQgbXhzZXJfbnVtcG9ydHNbXSA9IHsKLQk4LAkJCS8vIEMxNjgtSVNBCi0JNCwJCQkvLyBDMTA0LUlTQQotCTQsCQkJLy8gQ0kxMDRKCi0JOCwJCQkvLyBDMTY4LVBDSQotCTQsCQkJLy8gQzEwNC1QQ0kKLQkyLAkJCS8vIEMxMDItSVNBCi0JMiwJCQkvLyBDSTEzMgotCTQsCQkJLy8gQ0kxMzQKLQkyLAkJCS8vIENQMTMyCi0JNCwJCQkvLyBDUDExNAotCTQsCQkJLy8gQ1QxMTQKLQkyLAkJCS8vIENQMTAyCi0JNCwJCQkvLyBDUDEwNFUKLQk4LAkJCS8vIENQMTY4VQotCTIsCQkJLy8gQ1AxMzJVCi0JNCwJCQkvLyBDUDEzNFUKLQk0LAkJCS8vIENQMTA0SlUKLQk4LAkJCS8vIFJDNzAwMAotCTgsCQkJLy8gQ1AxMThVIAotCTIsCQkJLy8gQ1AxMDJVTCAKLQkyLAkJCS8vIENQMTAyVQorCTgsCQkJLyogQzE2OC1JU0EgKi8KKwk0LAkJCS8qIEMxMDQtSVNBICovCisJNCwJCQkvKiBDSTEwNEogKi8KKwk4LAkJCS8qIEMxNjgtUENJICovCisJNCwJCQkvKiBDMTA0LVBDSSAqLworCTIsCQkJLyogQzEwMi1JU0EgKi8KKwkyLAkJCS8qIENJMTMyICovCisJNCwJCQkvKiBDSTEzNCAqLworCTIsCQkJLyogQ1AxMzIgKi8KKwk0LAkJCS8qIENQMTE0ICovCisJNCwJCQkvKiBDVDExNCAqLworCTIsCQkJLyogQ1AxMDIgKi8KKwk0LAkJCS8qIENQMTA0VSAqLworCTgsCQkJLyogQ1AxNjhVICovCisJMiwJCQkvKiBDUDEzMlUgKi8KKwk0LAkJCS8qIENQMTM0VSAqLworCTQsCQkJLyogQ1AxMDRKVSAqLworCTgsCQkJLyogUkM3MDAwICovCisJOCwJCQkvKiBDUDExOFUgKi8KKwkyLAkJCS8qIENQMTAyVUwgKi8KKwkyLAkJCS8qIENQMTAyVSAqLwogfTsKIAogI2RlZmluZSBVQVJUX1RZUEVfTlVNCTIKQEAgLTE4Miw3ICsxODMsNyBAQAogCU1PWEFfTVVTVF9NVTg2MF9IV0lECiB9OwogCi0vLyBUaGlzIGlzIG9ubHkgZm9yIFBDSQorLyogVGhpcyBpcyBvbmx5IGZvciBQQ0kgKi8KICNkZWZpbmUgVUFSVF9JTkZPX05VTQkzCiBzdHJ1Y3QgbXhwY2l1YXJ0X2luZm8gewogCWludCB0eXBlOwpAQCAtMjMxLDcgKzIzMiw3IEBACiB0eXBlZGVmIHN0cnVjdCBfbW94YV9wY2lfaW5mbyB7CiAJdW5zaWduZWQgc2hvcnQgYnVzTnVtOwogCXVuc2lnbmVkIHNob3J0IGRldk51bTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDYtMjMtMjAwMworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwNi0yMy0yMDAzICovCiB9IG1veGFfcGNpX2luZm87CiAKIHN0YXRpYyBpbnQgaW9hZGRyW01YU0VSX0JPQVJEU10gPSB7IDAsIDAsIDAsIDAgfTsKQEAgLTI4MCw2ICsyODEsNyBAQAogCWludCBmaWZvWzMyXTsKIAlpbnQgaWZ0eXBlWzMyXTsKIH07CisKIHN0cnVjdCBteHNlcl9od2NvbmYgewogCWludCBib2FyZF90eXBlOwogCWludCBwb3J0czsKQEAgLTI5MCw5ICsyOTIsOSBAQAogCWludCBpb2FkZHJbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsKIAlpbnQgYmF1ZF9iYXNlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CiAJbW94YV9wY2lfaW5mbyBwY2lJbmZvOwotCWludCBJc01veGFNdXN0Q2hpcEZsYWc7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKLQlpbnQgTWF4Q2FuU2V0QmF1ZFJhdGVbTVhTRVJfUE9SVFNfUEVSX0JPQVJEXTsJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDQtMjAwMgotCWludCBvcG1vZGVfaW9hZGRyW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCisJaW50IE1heENhblNldEJhdWRSYXRlW01YU0VSX1BPUlRTX1BFUl9CT0FSRF07CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIgKi8KKwlpbnQgb3Btb2RlX2lvYWRkcltNWFNFUl9QT1JUU19QRVJfQk9BUkRdOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0ICovCiB9OwogCiBzdHJ1Y3QgbXhzZXJfc3RydWN0IHsKQEAgLTMzNCw5ICszMzYsOSBAQAogCXdhaXRfcXVldWVfaGVhZF90IGRlbHRhX21zcl93YWl0OwogCXN0cnVjdCBhc3luY19pY291bnQgaWNvdW50OwkvKiBrZXJuZWwgY291bnRlcnMgZm9yIHRoZSA0IGlucHV0IGludGVycnVwdHMgKi8KIAlpbnQgdGltZW91dDsKLQlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyCi0JaW50IE1heENhblNldEJhdWRSYXRlOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCi0JaW50IG9wbW9kZV9pb2FkZHI7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwlpbnQgSXNNb3hhTXVzdENoaXBGbGFnOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCisJaW50IE1heENhblNldEJhdWRSYXRlOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCisJaW50IG9wbW9kZV9pb2FkZHI7CS8qIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQgKi8KIAl1bnNpZ25lZCBjaGFyIHN0b3Bfcng7CiAJdW5zaWduZWQgY2hhciBsZGlzY19zdG9wX3J4OwogCWxvbmcgcmVhbGJhdWQ7CkBAIC0zNDUsNyArMzQ3LDYgQEAKIAlzcGlubG9ja190IHNsb2NrOwogfTsKIAotCiBzdHJ1Y3QgbXhzZXJfbXN0YXR1cyB7CiAJdGNmbGFnX3QgY2ZsYWc7CiAJaW50IGN0czsKQEAgLTM1OCw3ICszNTksNyBAQAogCiBzdGF0aWMgaW50IG14c2VyQm9hcmRDQVBbTVhTRVJfQk9BUkRTXSA9IHsKIAkwLCAwLCAwLCAwCi0JICAgIC8qICAweDE4MCwgMHgyODAsIDB4MjAwLCAweDMyMCAgICovCisJLyogIDB4MTgwLCAweDI4MCwgMHgyMDAsIDB4MzIwICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKm14dmFyX3Nkcml2ZXI7CkBAIC0zODYsNyArMzg3LDcgQEAKIHN0YXRpYyB2b2lkIG14c2VyX2dldGNmZyhpbnQgYm9hcmQsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZik7CiBzdGF0aWMgaW50IG14c2VyX2luaXQodm9pZCk7CiAKLS8vc3RhdGljIHZvaWQgICBteHNlcl9wb2xsKHVuc2lnbmVkIGxvbmcpOworLyogc3RhdGljIHZvaWQgICBteHNlcl9wb2xsKHVuc2lnbmVkIGxvbmcpOyAqLwogc3RhdGljIGludCBteHNlcl9nZXRfSVNBX2NvbmYoaW50LCBzdHJ1Y3QgbXhzZXJfaHdjb25mICopOwogc3RhdGljIGludCBteHNlcl9nZXRfUENJX2NvbmYoaW50LCBpbnQsIGludCwgc3RydWN0IG14c2VyX2h3Y29uZiAqKTsKIHN0YXRpYyB2b2lkIG14c2VyX2RvX3NvZnRpbnQodm9pZCAqKTsKQEAgLTQ0MCwxOCArNDQxLDE4IEBACiAJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGlvLCAweDExKTsKIAlpZiAoKGh3aWQgPSBpbmIoaW8gKyBVQVJUX01DUikpICE9IDApIHsKIAkJb3V0YihvbGRtY3IsIGlvICsgVUFSVF9NQ1IpOwotCQlyZXR1cm4gKE1PWEFfT1RIRVJfVUFSVCk7CisJCXJldHVybiBNT1hBX09USEVSX1VBUlQ7CiAJfQogCiAJR0VUX01PWEFfTVVTVF9IQVJEV0FSRV9JRChpbywgJmh3aWQpOwogCWZvciAoaSA9IDA7IGkgPCBVQVJUX1RZUEVfTlVNOyBpKyspIHsKIAkJaWYgKGh3aWQgPT0gR21veGFfdWFydF9pZFtpXSkKLQkJCXJldHVybiAoaW50KSBod2lkOworCQkJcmV0dXJuIChpbnQpaHdpZDsKIAl9CiAJcmV0dXJuIE1PWEFfT1RIRVJfVUFSVDsKIH0KIAotLy8gYWJvdmUgaXMgbW9kaWZpZWQgYnkgVmljdG9yIFl1LiAwOC0xNS0yMDAyCisvKiBhYm92ZSBpcyBtb2RpZmllZCBieSBWaWN0b3IgWXUuIDA4LTE1LTIwMDIgKi8KIAogc3RhdGljIHN0cnVjdCB0dHlfb3BlcmF0aW9ucyBteHNlcl9vcHMgPSB7CiAJLm9wZW4gPSBteHNlcl9vcGVuLApAQCAtNTA0LDcgKzUwNSw2IEBACiAJZWxzZQogCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IHVucmVnaXN0ZXIgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBzZXJpYWwgZHJpdmVyXG4iKTsKIAotCiAJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CiAJCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCkBAIC01MTMsNyArNTEzLDcgQEAKIAkJZWxzZSB7CiAJCQlwZGV2ID0gbXhzZXJjZmdbaV0ucGNpSW5mby5wZGV2OwogCQkJZnJlZV9pcnEobXhzZXJjZmdbaV0uaXJxLCAmbXh2YXJfdGFibGVbaSAqIE1YU0VSX1BPUlRTX1BFUl9CT0FSRF0pOwotCQkJaWYgKHBkZXYgIT0gTlVMTCkgewkvL1BDSQorCQkJaWYgKHBkZXYgIT0gTlVMTCkgewkvKiBQQ0kgKi8KIAkJCQlyZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMiksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMikpOwogCQkJCXJlbGVhc2VfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSk7CiAJCQl9IGVsc2UgewpAQCAtNTI0LDcgKzUyNCw2IEBACiAJfQogCWlmICh2ZXJib3NlKQogCQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZS5cbiIpOwotCiB9CiAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfdHhyeF9maWZvKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8pCkBAIC01NTgsOCArNTU3LDEwIEBACiAJbiA9IGJvYXJkICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEOwogCWluZm8gPSAmbXh2YXJfdGFibGVbbl07CiAJLyppZiAodmVyYm9zZSkgKi8gIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgICAgICAgdHR5TSVkIC0gdHR5TSVkICIsIG4sIG4gKyBod2NvbmYtPnBvcnRzIC0gMSk7Ci0JCXByaW50aygiIG1heC4gYmF1ZCByYXRlID0gJWQgYnBzLlxuIiwgaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVswXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIgICAgICAgIHR0eU0lZCAtIHR0eU0lZCAiLAorCQkJbiwgbiArIGh3Y29uZi0+cG9ydHMgLSAxKTsKKwkJcHJpbnRrKCIgbWF4LiBiYXVkIHJhdGUgPSAlZCBicHMuXG4iLAorCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVswXSk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGh3Y29uZi0+cG9ydHM7IGkrKywgbisrLCBpbmZvKyspIHsKQEAgLTU2OCwxMiArNTY5LDEyIEBACiAJCWluZm8tPmlycSA9IGh3Y29uZi0+aXJxOwogCQlpbmZvLT52ZWN0b3IgPSBod2NvbmYtPnZlY3RvcjsKIAkJaW5mby0+dmVjdG9ybWFzayA9IGh3Y29uZi0+dmVjdG9yX21hc2s7Ci0JCWluZm8tPm9wbW9kZV9pb2FkZHIgPSBod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV07CS8vIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwkJaW5mby0+b3Btb2RlX2lvYWRkciA9IGh3Y29uZi0+b3Btb2RlX2lvYWRkcltpXTsJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNCAqLwogCQlpbmZvLT5zdG9wX3J4ID0gMDsKIAkJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDA7CiAKIAkJaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID0gaHdjb25mLT5Jc01veGFNdXN0Q2hpcEZsYWc7Ci0JCS8vRW5oYW5jZSBtb2RlIGVuYWJsZWQgaGVyZQorCQkvKiBFbmhhbmNlIG1vZGUgZW5hYmxlZCBoZXJlICovCiAJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7CiAJCQlFTkFCTEVfTU9YQV9NVVNUX0VOQ0hBTkNFX01PREUoaW5mby0+YmFzZSk7CiAJCX0KQEAgLTYwNiwyMiArNjA3LDI1IEBACiAKIAkvKiBiZWZvcmUgc2V0IElOVCBJU1IsIGRpc2FibGUgYWxsIGludCAqLwogCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKLQkJb3V0YihpbmIoaHdjb25mLT5pb2FkZHJbaV0gKyBVQVJUX0lFUikgJiAweGYwLCBod2NvbmYtPmlvYWRkcltpXSArIFVBUlRfSUVSKTsKKwkJb3V0YihpbmIoaHdjb25mLT5pb2FkZHJbaV0gKyBVQVJUX0lFUikgJiAweGYwLAorCQkJaHdjb25mLT5pb2FkZHJbaV0gKyBVQVJUX0lFUik7CiAJfQogCiAJbiA9IGJvYXJkICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEOwogCWluZm8gPSAmbXh2YXJfdGFibGVbbl07CiAKLQlyZXR2YWwgPSByZXF1ZXN0X2lycShod2NvbmYtPmlycSwgbXhzZXJfaW50ZXJydXB0LCBJUlFfVChpbmZvKSwgIm14c2VyIiwgaW5mbyk7CisJcmV0dmFsID0gcmVxdWVzdF9pcnEoaHdjb25mLT5pcnEsIG14c2VyX2ludGVycnVwdCwgSVJRX1QoaW5mbyksCisJCQkJIm14c2VyIiwgaW5mbyk7CiAJaWYgKHJldHZhbCkgewotCQlwcmludGsoS0VSTl9FUlIgIkJvYXJkICVkOiAlcyIsIGJvYXJkLCBteHNlcl9icmRuYW1lW2h3Y29uZi0+Ym9hcmRfdHlwZSAtIDFdKTsKLQkJcHJpbnRrKCIgIFJlcXVlc3QgaXJxIGZhaWwsSVJRICglZCkgbWF5IGJlIGNvbmZsaXQgd2l0aCBhbm90aGVyIGRldmljZS5cbiIsIGluZm8tPmlycSk7CisJCXByaW50ayhLRVJOX0VSUiAiQm9hcmQgJWQ6ICVzIiwKKwkJCWJvYXJkLCBteHNlcl9icmRuYW1lW2h3Y29uZi0+Ym9hcmRfdHlwZSAtIDFdKTsKKwkJcHJpbnRrKCIgIFJlcXVlc3QgaXJxIGZhaWxlZCwgSVJRICglZCkgbWF5IGNvbmZsaWN0IHdpdGgiCisJCQkiIGFub3RoZXIgZGV2aWNlLlxuIiwgaW5mby0+aXJxKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgbXhzZXJfZ2V0Y2ZnKGludCBib2FyZCwgc3RydWN0IG14c2VyX2h3Y29uZiAqaHdjb25mKQogewogCW14c2VyY2ZnW2JvYXJkXSA9ICpod2NvbmY7CkBAIC02MzEsMjYgKzYzNSwyNyBAQAogc3RhdGljIGludCBteHNlcl9nZXRfUENJX2NvbmYoaW50IGJ1c251bSwgaW50IGRldm51bSwgaW50IGJvYXJkX3R5cGUsIHN0cnVjdCBteHNlcl9od2NvbmYgKmh3Y29uZikKIHsKIAlpbnQgaSwgajsKLS8vICAgICAgdW5zaWduZWQgaW50ICAgIHZhbDsKKwkvKiB1bnNpZ25lZCBpbnQgdmFsOyAqLwogCXVuc2lnbmVkIGludCBpb2FkZHJlc3M7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBod2NvbmYtPnBjaUluZm8ucGRldjsKIAotCS8vaW8gYWRkcmVzcworCS8qIGlvIGFkZHJlc3MgKi8KIAlod2NvbmYtPmJvYXJkX3R5cGUgPSBib2FyZF90eXBlOwogCWh3Y29uZi0+cG9ydHMgPSBteHNlcl9udW1wb3J0c1tib2FyZF90eXBlIC0gMV07CiAJaW9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpOwotCXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSwgIm14c2VyKElPKSIpOworCXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAyKSwKKwkJCSJteHNlcihJTykiKTsKIAotCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgaHdjb25mLT5wb3J0czsgaSsrKQogCQlod2NvbmYtPmlvYWRkcltpXSA9IGlvYWRkcmVzcyArIDggKiBpOwotCX0KIAotCS8vdmVjdG9yCisJLyogdmVjdG9yICovCiAJaW9hZGRyZXNzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDMpOwotCXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAzKSwgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAzKSwgIm14c2VyKHZlY3RvcikiKTsKKwlyZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMyksIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMyksCisJCQkibXhzZXIodmVjdG9yKSIpOwogCWh3Y29uZi0+dmVjdG9yID0gaW9hZGRyZXNzOwogCi0JLy9pcnEKKwkvKiBpcnEgKi8KIAlod2NvbmYtPmlycSA9IGh3Y29uZi0+cGNpSW5mby5wZGV2LT5pcnE7CiAKIAlod2NvbmYtPklzTW94YU11c3RDaGlwRmxhZyA9IENoZWNrSXNNb3hhTXVzdChod2NvbmYtPmlvYWRkclswXSk7CkBAIC02NjMsNyArNjY4LDcgQEAKIAkJCWlmIChHcGNpX3VhcnRfaW5mb1tqXS50eXBlID09IGh3Y29uZi0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CiAJCQkJaHdjb25mLT5NYXhDYW5TZXRCYXVkUmF0ZVtpXSA9IEdwY2lfdWFydF9pbmZvW2pdLm1heF9iYXVkOwogCi0JCQkJLy9leGNlcHRpb24uLi4uQ1AtMTAyCisJCQkJLyogZXhjZXB0aW9uLi4uLkNQLTEwMiAqLwogCQkJCWlmIChib2FyZF90eXBlID09IE1YU0VSX0JPQVJEX0NQMTAyKQogCQkJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwogCQkJCWJyZWFrOwpAQCAtNjc4LDE1ICs2ODMsMTUgQEAKIAkJCWVsc2UKIAkJCQlod2NvbmYtPm9wbW9kZV9pb2FkZHJbaV0gPSBpb2FkZHJlc3MgKyAweDBjOwogCQl9Ci0JCW91dGIoMCwgaW9hZGRyZXNzICsgNCk7CS8vIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUKLQkJb3V0YigwLCBpb2FkZHJlc3MgKyAweDBjKTsJLy9kZWZhdWx0IHNldCB0byBSUzIzMiBtb2RlCisJCW91dGIoMCwgaW9hZGRyZXNzICsgNCk7CS8qIGRlZmF1bHQgc2V0IHRvIFJTMjMyIG1vZGUgKi8KKwkJb3V0YigwLCBpb2FkZHJlc3MgKyAweDBjKTsJLyogZGVmYXVsdCBzZXQgdG8gUlMyMzIgbW9kZSAqLwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBod2NvbmYtPnBvcnRzOyBpKyspIHsKIAkJaHdjb25mLT52ZWN0b3JfbWFzayB8PSAoMSA8PCBpKTsKIAkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7CiAJfQotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtNzA3LDcgKzcxMiw4IEBACiAJCW14c2VyY2ZnW2ldLmJvYXJkX3R5cGUgPSAtMTsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLCBNWFNFUl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJNT1hBIFNtYXJ0aW8vSW5kdXN0aW8gZmFtaWx5IGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCQlNWFNFUl9WRVJTSU9OKTsKIAogCS8qIEluaXRpYWxpemUgdGhlIHR0eV9kcml2ZXIgc3RydWN0dXJlICovCiAJbWVtc2V0KG14dmFyX3Nkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgdHR5X2RyaXZlcikpOwpAQCAtNzE5LDcgKzcyNSw3IEBACiAJbXh2YXJfc2RyaXZlci0+dHlwZSA9IFRUWV9EUklWRVJfVFlQRV9TRVJJQUw7CiAJbXh2YXJfc2RyaXZlci0+c3VidHlwZSA9IFNFUklBTF9UWVBFX05PUk1BTDsKIAlteHZhcl9zZHJpdmVyLT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7Ci0JbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8IENSRUFEIHwgSFVQQ0wgfCBDTE9DQUw7CisJbXh2YXJfc2RyaXZlci0+aW5pdF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMHxDUzh8Q1JFQUR8SFVQQ0x8Q0xPQ0FMOwogCW14dmFyX3Nkcml2ZXItPmZsYWdzID0gVFRZX0RSSVZFUl9SRUFMX1JBVzsKIAl0dHlfc2V0X29wZXJhdGlvbnMobXh2YXJfc2RyaXZlciwgJm14c2VyX29wcyk7CiAJbXh2YXJfc2RyaXZlci0+dHR5cyA9IG14dmFyX3R0eTsKQEAgLTczOSwyMyArNzQ1LDI5IEBACiAJLyogU3RhcnQgZmluZGluZyBJU0EgYm9hcmRzIGhlcmUgKi8KIAlmb3IgKGIgPSAwOyBiIDwgTVhTRVJfQk9BUkRTICYmIG0gPCBNWFNFUl9CT0FSRFM7IGIrKykgewogCQlpbnQgY2FwOworCiAJCWlmICghKGNhcCA9IG14c2VyQm9hcmRDQVBbYl0pKQogCQkJY29udGludWU7CiAKIAkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CiAKIAkJaWYgKHJldHZhbCAhPSAwKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsCisJCQkJbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOwogCiAJCWlmIChyZXR2YWwgPD0gMCkgewogCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlciwgIgorCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgdmVjdG9yLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgorCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAogCQkJY29udGludWU7CiAJCX0KQEAgLTc2NSwzNSArNzc3LDQzIEBACiAJCWh3Y29uZi5wY2lJbmZvLnBkZXYgPSBOVUxMOwogCiAJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKLQkJLy9pbml0IG14c2VyY2ZnIGZpcnN0LCBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KLQkJLy9teHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuCisJCS8qCisJCSAqIGluaXQgbXhzZXJjZmcgZmlyc3QsCisJCSAqIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgorCQkgKi8KKwkJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLwogCQlpZiAobXhzZXJfaW5pdGJyZChtLCAmaHdjb25mKSA8IDApCiAJCQljb250aW51ZTsKIAotCiAJCW0rKzsKIAl9CiAKIAkvKiBTdGFydCBmaW5kaW5nIElTQSBib2FyZHMgZnJvbSBtb2R1bGUgYXJnICovCiAJZm9yIChiID0gMDsgYiA8IE1YU0VSX0JPQVJEUyAmJiBtIDwgTVhTRVJfQk9BUkRTOyBiKyspIHsKIAkJaW50IGNhcDsKKwogCQlpZiAoIShjYXAgPSBpb2FkZHJbYl0pKQogCQkJY29udGludWU7CiAKIAkJcmV0dmFsID0gbXhzZXJfZ2V0X0lTQV9jb25mKGNhcCwgJmh3Y29uZik7CiAKIAkJaWYgKHJldHZhbCAhPSAwKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZCAoQ0FQPTB4JXgpXG4iLCBteHNlcl9icmRuYW1lW2h3Y29uZi5ib2FyZF90eXBlIC0gMV0sIGlvYWRkcltiXSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJGb3VuZCBNT1hBICVzIGJvYXJkIChDQVA9MHgleClcbiIsCisJCQkJbXhzZXJfYnJkbmFtZVtod2NvbmYuYm9hcmRfdHlwZSAtIDFdLCBpb2FkZHJbYl0pOwogCiAJCWlmIChyZXR2YWwgPD0gMCkgewogCQkJaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlciwgIgorCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlFfQ09ORkxJVCkKLQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IG51bWJlcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIGludGVycnVwdCBudW1iZXIsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQotCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgdmVjdG9yLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgorCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJZWxzZSBpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JT0FERFIpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgSS9PIGFkZHJlc3MsICIKKwkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAogCQkJY29udGludWU7CiAJCX0KQEAgLTgwMyw4ICs4MjMsMTEgQEAKIAkJaHdjb25mLnBjaUluZm8ucGRldiA9IE5VTEw7CiAKIAkJbXhzZXJfZ2V0Y2ZnKG0sICZod2NvbmYpOwotCQkvL2luaXQgbXhzZXJjZmcgZmlyc3QsIG9yIG14c2VyY2ZnIGRhdGEgaXMgbm90IGNvcnJlY3Qgb24gSVNSLgotCQkvL214c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4KKwkJLyoKKwkJICogaW5pdCBteHNlcmNmZyBmaXJzdCwKKwkJICogb3IgbXhzZXJjZmcgZGF0YSBpcyBub3QgY29ycmVjdCBvbiBJU1IuCisJCSAqLworCQkvKiBteHNlcl9pbml0YnJkIHdpbGwgaG9vayBJU1IuICovCiAJCWlmIChteHNlcl9pbml0YnJkKG0sICZod2NvbmYpIDwgMCkKIAkJCWNvbnRpbnVlOwogCkBAIC04MTcsNyArODQwLDggQEAKIAlpbmRleCA9IDA7CiAJYiA9IDA7CiAJd2hpbGUgKGIgPCBuKSB7Ci0JCXBkZXYgPSBwY2lfZmluZF9kZXZpY2UobXhzZXJfcGNpYnJkc1tiXS52ZW5kb3IsIG14c2VyX3BjaWJyZHNbYl0uZGV2aWNlLCBwZGV2KTsKKwkJcGRldiA9IHBjaV9maW5kX2RldmljZShteHNlcl9wY2licmRzW2JdLnZlbmRvciwKKwkJCQlteHNlcl9wY2licmRzW2JdLmRldmljZSwgcGRldik7CiAJCQlpZiAocGRldiA9PSBOVUxMKSB7CiAJCQliKys7CiAJCQljb250aW51ZTsKQEAgLTgyNSwzMCArODQ5LDQ4IEBACiAJCWh3Y29uZi5wY2lJbmZvLmJ1c051bSA9IGJ1c251bSA9IHBkZXYtPmJ1cy0+bnVtYmVyOwogCQlod2NvbmYucGNpSW5mby5kZXZOdW0gPSBkZXZudW0gPSBQQ0lfU0xPVChwZGV2LT5kZXZmbikgPDwgMzsKIAkJaHdjb25mLnBjaUluZm8ucGRldiA9IHBkZXY7Ci0JCXByaW50ayhLRVJOX0lORk8gIkZvdW5kIE1PWEEgJXMgYm9hcmQoQnVzTm89JWQsRGV2Tm89JWQpXG4iLCBteHNlcl9icmRuYW1lWyhpbnQpIChteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhKSAtIDFdLCBidXNudW0sIGRldm51bSA+PiAzKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgTU9YQSAlcyBib2FyZChCdXNObz0lZCxEZXZObz0lZClcbiIsCisJCQlteHNlcl9icmRuYW1lWyhpbnQpIChteHNlcl9wY2licmRzW2JdLmRyaXZlcl9kYXRhKSAtIDFdLAorCQkJYnVzbnVtLCBkZXZudW0gPj4gMyk7CiAJCWluZGV4Kys7Ci0JCWlmIChtID49IE1YU0VSX0JPQVJEUykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJUb28gbWFueSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBib2FyZHMgZmluZCAobWF4aW11bSAlZCksYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIsIE1YU0VSX0JPQVJEUyk7Ci0JCX0gZWxzZSB7CisJCWlmIChtID49IE1YU0VSX0JPQVJEUykKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJUb28gbWFueSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSBib2FyZHMgZmluZCAiCisJCQkJIihtYXhpbXVtICVkKSwgYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIsCisJCQkJTVhTRVJfQk9BUkRTKTsKKwkJZWxzZSB7CiAJCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJCQlwcmludGsoS0VSTl9FUlIgIk1veGEgU21hcnRJL08gUENJIGVuYWJsZSBmYWlsICFcbiIpOworCQkJCXByaW50ayhLRVJOX0VSUiAiTW94YSBTbWFydEkvTyBQQ0kgZW5hYmxlICIKKwkJCQkJImZhaWwgIVxuIik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlyZXR2YWwgPSBteHNlcl9nZXRfUENJX2NvbmYoYnVzbnVtLCBkZXZudW0sIChpbnQpIG14c2VyX3BjaWJyZHNbYl0uZHJpdmVyX2RhdGEsICZod2NvbmYpOworCQkJcmV0dmFsID0gbXhzZXJfZ2V0X1BDSV9jb25mKGJ1c251bSwgZGV2bnVtLAorCQkJCQkoaW50KW14c2VyX3BjaWJyZHNbYl0uZHJpdmVyX2RhdGEsCisJCQkJCSZod2NvbmYpOwogCQkJaWYgKHJldHZhbCA8IDApIHsKIAkJCQlpZiAocmV0dmFsID09IE1YU0VSX0VSUl9JUlEpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCisJCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfSVJRX0NPTkZMSVQpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiSW52YWxpZCBpbnRlcnJ1cHQgbnVtYmVyLCAiCisJCQkJCQkiYm9hcmQgbm90IGNvbmZpZ3VyZWRcbiIpOwogCQkJCWVsc2UgaWYgKHJldHZhbCA9PSBNWFNFUl9FUlJfVkVDVE9SKQotCQkJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgaW50ZXJydXB0IHZlY3Rvcixib2FyZCBub3QgY29uZmlndXJlZFxuIik7CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkJIkludmFsaWQgaW50ZXJydXB0IHZlY3RvciwgIgorCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQllbHNlIGlmIChyZXR2YWwgPT0gTVhTRVJfRVJSX0lPQUREUikKLQkJCQkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIEkvTyBhZGRyZXNzLGJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCQkiSW52YWxpZCBJL08gYWRkcmVzcywgIgorCQkJCQkJImJvYXJkIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJCW14c2VyX2dldGNmZyhtLCAmaHdjb25mKTsKLQkJCS8vaW5pdCBteHNlcmNmZyBmaXJzdCwgb3IgbXhzZXJjZmcgZGF0YSBpcyBub3QgY29ycmVjdCBvbiBJU1IuCi0JCQkvL214c2VyX2luaXRicmQgd2lsbCBob29rIElTUi4KKwkJCS8qIGluaXQgbXhzZXJjZmcgZmlyc3QsCisJCQkgKiBvciBteHNlcmNmZyBkYXRhIGlzIG5vdCBjb3JyZWN0IG9uIElTUi4KKwkJCSAqLworCQkJLyogbXhzZXJfaW5pdGJyZCB3aWxsIGhvb2sgSVNSLiAqLwogCQkJaWYgKG14c2VyX2luaXRicmQobSwgJmh3Y29uZikgPCAwKQogCQkJCWNvbnRpbnVlOwogCQkJbSsrOwpAQCAtODU4LDcgKzkwMCw4IEBACiAKIAlyZXR2YWwgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKG14dmFyX3Nkcml2ZXIpOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZG4ndCBpbnN0YWxsIE1PWEEgU21hcnRpby9JbmR1c3RpbyBmYW1pbHkgZHJpdmVyICFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkbid0IGluc3RhbGwgTU9YQSBTbWFydGlvL0luZHVzdGlvIGZhbWlseSIKKwkJCQkiIGRyaXZlciAhXG4iKTsKIAkJcHV0X3R0eV9kcml2ZXIobXh2YXJfc2RyaXZlcik7CiAKIAkJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CkBAIC04NjYsNyArOTA5LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWVsc2UgewogCQkJCWZyZWVfaXJxKG14c2VyY2ZnW2ldLmlycSwgJm14dmFyX3RhYmxlW2kgKiBNWFNFUl9QT1JUU19QRVJfQk9BUkRdKTsKLQkJCQkvL3RvZG86IHJlbGVhc2UgaW8sIHZlY3RvcgorCQkJCS8qIHRvZG86IHJlbGVhc2UgaW8sIHZlY3RvciAqLwogCQkJfQogCQl9CiAJCXJldHVybiByZXR2YWw7CkBAIC04NzcsNyArOTIwLDcgQEAKIAogc3RhdGljIHZvaWQgbXhzZXJfZG9fc29mdGludCh2b2lkICpwcml2YXRlXykKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgcHJpdmF0ZV87CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHByaXZhdGVfOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHk7CiAKIAl0dHkgPSBpbmZvLT50dHk7CkBAIC05MjYsNyArOTY5LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJaW5mbyA9IG14dmFyX3RhYmxlICsgbGluZTsKIAlpZiAoIWluZm8tPmJhc2UpCi0JCXJldHVybiAoLUVOT0RFVik7CisJCXJldHVybiAtRU5PREVWOwogCiAJdHR5LT5kcml2ZXJfZGF0YSA9IGluZm87CiAJaW5mby0+dHR5ID0gdHR5OwpAQCAtOTM1LDExICs5NzgsMTEgQEAKIAkgKi8KIAlyZXR2YWwgPSBteHNlcl9zdGFydHVwKGluZm8pOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiAocmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKIAogCXJldHZhbCA9IG14c2VyX2Jsb2NrX3RpbF9yZWFkeSh0dHksIGZpbHAsIGluZm8pOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiAocmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKIAogCWluZm8tPmNvdW50Kys7CiAKQEAgLTk1NSwxMSArOTk4LDEyIEBACiAJaW5mby0+cGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CiAJY2xlYXJfYml0KFRUWV9ET05UX0ZMSVAsICZ0dHktPmZsYWdzKTsKIAotCS8vc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKLQkvL214c2VyX2NoZWNrX21vZGVtX3N0YXR1cyhpbmZvLCBzdGF0dXMpOworCS8qCisJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsKKwlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKKwkqLwogCi0vKiB1bm1hcmsgaGVyZSBmb3IgdmVyeSBoaWdoIGJhdWQgcmF0ZSAoZXguIDkyMTYwMCBicHMpIHVzZWQKLSovCisvKiB1bm1hcmsgaGVyZSBmb3IgdmVyeSBoaWdoIGJhdWQgcmF0ZSAoZXguIDkyMTYwMCBicHMpIHVzZWQgKi8KIAl0dHktPmxvd19sYXRlbmN5ID0gMTsKIAlyZXR1cm4gMDsKIH0KQEAgLTk3Miw3ICsxMDE2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgbXhzZXJfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTk5NywxMSArMTA0MSwxMyBAQAogCQkgKiBvbmUsIHdlJ3ZlIGdvdCByZWFsIHByb2JsZW1zLCBzaW5jZSBpdCBtZWFucyB0aGUKIAkJICogc2VyaWFsIHBvcnQgd29uJ3QgYmUgc2h1dGRvd24uCiAJCSAqLwotCQlwcmludGsoS0VSTl9FUlIgIm14c2VyX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQ7IHR0eS0+Y291bnQgaXMgMSwgIiAiaW5mby0+Y291bnQgaXMgJWRcbiIsIGluZm8tPmNvdW50KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50OyAiCisJCQkidHR5LT5jb3VudCBpcyAxLCBpbmZvLT5jb3VudCBpcyAlZFxuIiwgaW5mby0+Y291bnQpOwogCQlpbmZvLT5jb3VudCA9IDE7CiAJfQogCWlmICgtLWluZm8tPmNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIm14c2VyX2Nsb3NlOiBiYWQgc2VyaWFsIHBvcnQgY291bnQgZm9yIHR0eXMlZDogJWRcbiIsIGluZm8tPnBvcnQsIGluZm8tPmNvdW50KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJteHNlcl9jbG9zZTogYmFkIHNlcmlhbCBwb3J0IGNvdW50IGZvciAiCisJCQkidHR5cyVkOiAlZFxuIiwgaW5mby0+cG9ydCwgaW5mby0+Y291bnQpOwogCQlpbmZvLT5jb3VudCA9IDA7CiAJfQogCWlmIChpbmZvLT5jb3VudCkgewpAQCAtMTA1Niw3ICsxMTAyLDcgQEAKIAkJCiAJbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CiAJaWYgKGxkKSB7Ci0JCWlmKGxkLT5mbHVzaF9idWZmZXIpCisJCWlmIChsZC0+Zmx1c2hfYnVmZmVyKQogCQkJbGQtPmZsdXNoX2J1ZmZlcih0dHkpOwogCQl0dHlfbGRpc2NfZGVyZWYobGQpOwogCX0KQEAgLTEwNzgsMzEgKzExMjQsMzQgQEAKIHN0YXRpYyBpbnQgbXhzZXJfd3JpdGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpCiB7CiAJaW50IGMsIHRvdGFsID0gMDsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQotCQlyZXR1cm4gKDApOworCWlmICghaW5mby0+eG1pdF9idWYpCisJCXJldHVybiAwOwogCiAJd2hpbGUgKDEpIHsKLQkJYyA9IG1pbl90KGludCwgY291bnQsIG1pbihTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9jbnQgLSAxLCBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CisJCWMgPSBtaW5fdChpbnQsIGNvdW50LCBtaW4oU0VSSUFMX1hNSVRfU0laRSAtIGluZm8tPnhtaXRfY250IC0gMSwKKwkJCQkJICBTRVJJQUxfWE1JVF9TSVpFIC0gaW5mby0+eG1pdF9oZWFkKSk7CiAJCWlmIChjIDw9IDApCiAJCQlicmVhazsKIAogCQltZW1jcHkoaW5mby0+eG1pdF9idWYgKyBpbmZvLT54bWl0X2hlYWQsIGJ1ZiwgYyk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJiAoU0VSSUFMX1hNSVRfU0laRSAtIDEpOworCQlpbmZvLT54bWl0X2hlYWQgPSAoaW5mby0+eG1pdF9oZWFkICsgYykgJgorCQkJCSAgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKIAkJaW5mby0+eG1pdF9jbnQgKz0gYzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCQlidWYgKz0gYzsKIAkJY291bnQgLT0gYzsKIAkJdG90YWwgKz0gYzsKLQogCX0KIAogCWlmIChpbmZvLT54bWl0X2NudCAmJiAhdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CisJCWlmICghdHR5LT5od19zdG9wcGVkIHx8CisJCQkJKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8CisJCQkJKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CiAJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKQEAgLTExMTQsMTAgKzExNjMsMTAgQEAKIAogc3RhdGljIHZvaWQgbXhzZXJfcHV0X2NoYXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgY2hhciBjaCkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCF0dHkgfHwgIWluZm8tPnhtaXRfYnVmKQorCWlmICghaW5mby0+eG1pdF9idWYpCiAJCXJldHVybjsKIAogCWlmIChpbmZvLT54bWl0X2NudCA+PSBTRVJJQUxfWE1JVF9TSVpFIC0gMSkKQEAgLTExMjksNyArMTE3OCw5IEBACiAJaW5mby0+eG1pdF9jbnQrKzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCWlmICghdHR5LT5zdG9wcGVkICYmICEoaW5mby0+SUVSICYgVUFSVF9JRVJfVEhSSSkpIHsKLQkJaWYgKCF0dHktPmh3X3N0b3BwZWQgfHwgKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgeworCQlpZiAoIXR0eS0+aHdfc3RvcHBlZCB8fAorCQkJCShpbmZvLT50eXBlID09IFBPUlRfMTY1NTBBKSB8fAorCQkJCWluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKIAkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwpAQCAtMTE0MSwxMCArMTE5MiwxNiBAQAogCiBzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9jaGFycyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoaW5mby0+eG1pdF9jbnQgPD0gMCB8fCB0dHktPnN0b3BwZWQgfHwgIWluZm8tPnhtaXRfYnVmIHx8ICh0dHktPmh3X3N0b3BwZWQgJiYgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkpCisJaWYgKGluZm8tPnhtaXRfY250IDw9IDAgfHwKKwkJCXR0eS0+c3RvcHBlZCB8fAorCQkJIWluZm8tPnhtaXRfYnVmIHx8CisJCQkodHR5LT5od19zdG9wcGVkICYmCisJCQkgKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkgKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCisJCQkpKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKQEAgLTExNTcsMjQgKzEyMTQsMjQgQEAKIAogc3RhdGljIGludCBteHNlcl93cml0ZV9yb29tKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldDsKIAogCXJldCA9IFNFUklBTF9YTUlUX1NJWkUgLSBpbmZvLT54bWl0X2NudCAtIDE7CiAJaWYgKHJldCA8IDApCiAJCXJldCA9IDA7Ci0JcmV0dXJuIChyZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbXhzZXJfY2hhcnNfaW5fYnVmZmVyKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJcmV0dXJuIGluZm8tPnhtaXRfY250OwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl9mbHVzaF9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAljaGFyIGZjcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC0xMTg0LDcgKzEyNDEsOCBAQAogCiAJLyogYmVsb3cgYWRkZWQgYnkgc2hpbmhheSAqLwogCWZjciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwotCW91dGIoKGZjciB8IFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwlvdXRiKChmY3IgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksCisJCWluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CiAJb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwpAQCAtMTE5Nyw3ICsxMjU1LDcgQEAKIAogc3RhdGljIGludCBteHNlcl9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJaW50IHJldHZhbDsKIAlzdHJ1Y3QgYXN5bmNfaWNvdW50IGNwcmV2LCBjbm93OwkvKiBrZXJuZWwgY291bnRlciB0ZW1wcyAqLwogCXN0cnVjdCBzZXJpYWxfaWNvdW50ZXJfc3RydWN0IF9fdXNlciAqcF9jdXNlcjsKQEAgLTEyMDYsOSArMTI2NCw5IEBACiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAKIAlpZiAodHR5LT5pbmRleCA9PSBNWFNFUl9QT1JUUykKLQkJcmV0dXJuIChteHNlcl9pb2N0bF9zcGVjaWFsKGNtZCwgYXJncCkpOworCQlyZXR1cm4gbXhzZXJfaW9jdGxfc3BlY2lhbChjbWQsIGFyZ3ApOwogCi0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDEtMDUtMjAwNCAqLwogCWlmIChjbWQgPT0gTU9YQV9TRVRfT1BfTU9ERSB8fCBjbWQgPT0gTU9YQV9HRVRfT1BfTU9ERSkgewogCQlpbnQgb3Btb2RlLCBwOwogCQlzdGF0aWMgdW5zaWduZWQgY2hhciBNb2RlTWFza1tdID0geyAweGZjLCAweGYzLCAweGNmLCAweDNmIH07CkBAIC0xMjE5LDcgKzEyNzcsMTAgQEAKIAkJaWYgKGNtZCA9PSBNT1hBX1NFVF9PUF9NT0RFKSB7CiAJCQlpZiAoZ2V0X3VzZXIob3Btb2RlLCAoaW50IF9fdXNlciAqKSBhcmdwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmIChvcG1vZGUgIT0gUlMyMzJfTU9ERSAmJiBvcG1vZGUgIT0gUlM0ODVfMldJUkVfTU9ERSAmJiBvcG1vZGUgIT0gUlM0MjJfTU9ERSAmJiBvcG1vZGUgIT0gUlM0ODVfNFdJUkVfTU9ERSkKKwkJCWlmIChvcG1vZGUgIT0gUlMyMzJfTU9ERSAmJgorCQkJCQlvcG1vZGUgIT0gUlM0ODVfMldJUkVfTU9ERSAmJgorCQkJCQlvcG1vZGUgIT0gUlM0MjJfTU9ERSAmJgorCQkJCQlvcG1vZGUgIT0gUlM0ODVfNFdJUkVfTU9ERSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAkJCW1hc2sgPSBNb2RlTWFza1twXTsKIAkJCXNoaWZ0Yml0ID0gcCAqIDI7CkBAIC0xMjM2LDM2ICsxMjk3LDM2IEBACiAJCX0KIAkJcmV0dXJuIDA7CiAJfQotCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDAxLTA1LTIwMDQKKwkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMS0wNS0yMDA0ICovCiAKIAlpZiAoKGNtZCAhPSBUSU9DR1NFUklBTCkgJiYgKGNtZCAhPSBUSU9DTUlXQUlUKSAmJiAoY21kICE9IFRJT0NHSUNPVU5UKSkgewogCQlpZiAodHR5LT5mbGFncyAmICgxIDw8IFRUWV9JT19FUlJPUikpCi0JCQlyZXR1cm4gKC1FSU8pOworCQkJcmV0dXJuIC1FSU87CiAJfQogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUQ1NCUks6CQkvKiBTVklEIHZlcnNpb246IG5vbi16ZXJvIGFyZyAtLT4gbm8gYnJlYWsgKi8KIAkJcmV0dmFsID0gdHR5X2NoZWNrX2NoYW5nZSh0dHkpOwogCQlpZiAocmV0dmFsKQotCQkJcmV0dXJuIChyZXR2YWwpOworCQkJcmV0dXJuIHJldHZhbDsKIAkJdHR5X3dhaXRfdW50aWxfc2VudCh0dHksIDApOwogCQlpZiAoIWFyZykKIAkJCW14c2VyX3NlbmRfYnJlYWsoaW5mbywgSFogLyA0KTsJLyogMS80IHNlY29uZCAqLwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFRDU0JSS1A6CQkvKiBzdXBwb3J0IGZvciBQT1NJWCB0Y3NlbmRicmVhaygpICovCiAJCXJldHZhbCA9IHR0eV9jaGVja19jaGFuZ2UodHR5KTsKIAkJaWYgKHJldHZhbCkKLQkJCXJldHVybiAocmV0dmFsKTsKKwkJCXJldHVybiByZXR2YWw7CiAJCXR0eV93YWl0X3VudGlsX3NlbnQodHR5LCAwKTsKIAkJbXhzZXJfc2VuZF9icmVhayhpbmZvLCBhcmcgPyBhcmcgKiAoSFogLyAxMCkgOiBIWiAvIDQpOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFRJT0NHU09GVENBUjoKLQkJcmV0dXJuIHB1dF91c2VyKENfQ0xPQ0FMKHR0eSkgPyAxIDogMCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCQlyZXR1cm4gcHV0X3VzZXIoQ19DTE9DQUwodHR5KSA/IDEgOiAwLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKIAljYXNlIFRJT0NTU09GVENBUjoKIAkJaWYgKGdldF91c2VyKHRlbXBsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJYXJnID0gdGVtcGw7CiAJCXR0eS0+dGVybWlvcy0+Y19jZmxhZyA9ICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgfkNMT0NBTCkgfCAoYXJnID8gQ0xPQ0FMIDogMCkpOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIFRJT0NHU0VSSUFMOgogCQlyZXR1cm4gbXhzZXJfZ2V0X3NlcmlhbF9pbmZvKGluZm8sIGFyZ3ApOwogCWNhc2UgVElPQ1NTRVJJQUw6CkBAIC0xMjc4LDcgKzEzMzksNyBAQAogCQkgKiAgICh1c2UgfCdlZCBUSU9DTV9STkcvRFNSL0NEL0NUUyBmb3IgbWFza2luZykKIAkJICogQ2FsbGVyIHNob3VsZCB1c2UgVElPQ0dJQ09VTlQgdG8gc2VlIHdoaWNoIG9uZSBpdCB3YXMKIAkJICovCi0JY2FzZSBUSU9DTUlXQUlUOnsKKwljYXNlIFRJT0NNSVdBSVQ6IHsKIAkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCQkJaW50IHJldDsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwpAQCAtMTI5Miw3ICsxMzUzLDE0IEBACiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQkJaWYgKCgoYXJnICYgVElPQ01fUk5HKSAmJiAoY25vdy5ybmcgIT0gY3ByZXYucm5nKSkgfHwgKChhcmcgJiBUSU9DTV9EU1IpICYmIChjbm93LmRzciAhPSBjcHJldi5kc3IpKSB8fCAoKGFyZyAmIFRJT0NNX0NEKSAmJiAoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwgKChhcmcgJiBUSU9DTV9DVFMpICYmIChjbm93LmN0cyAhPSBjcHJldi5jdHMpKSkgeworCQkJCWlmICgoKGFyZyAmIFRJT0NNX1JORykgJiYKKwkJCQkJCShjbm93LnJuZyAhPSBjcHJldi5ybmcpKSB8fAorCQkJCQkJKChhcmcgJiBUSU9DTV9EU1IpICYmCisJCQkJCQkoY25vdy5kc3IgIT0gY3ByZXYuZHNyKSkgfHwKKwkJCQkJCSgoYXJnICYgVElPQ01fQ0QpICYmCisJCQkJCQkoY25vdy5kY2QgIT0gY3ByZXYuZGNkKSkgfHwKKwkJCQkJCSgoYXJnICYgVElPQ01fQ1RTKSAmJgorCQkJCQkJKGNub3cuY3RzICE9IGNwcmV2LmN0cykpKSB7CiAJCQkJCXJldCA9IDA7CiAJCQkJCWJyZWFrOwogCQkJCX0KQEAgLTEzMzgsMjEgKzE0MDYsMTggQEAKIAkJcHV0X3VzZXIoY25vdy5kc3IsICZwX2N1c2VyLT5kc3IpOwogCQlwdXRfdXNlcihjbm93LnJuZywgJnBfY3VzZXItPnJuZyk7CiAJCXB1dF91c2VyKGNub3cuZGNkLCAmcF9jdXNlci0+ZGNkKTsKLQotLyogKi8KIAkJcmV0dXJuIDA7CiAJY2FzZSBNT1hBX0hpZ2hTcGVlZE9uOgotCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKSBhcmdwKTsKLQotCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6eworCQlyZXR1cm4gcHV0X3VzZXIoaW5mby0+YmF1ZF9iYXNlICE9IDExNTIwMCA/IDEgOiAwLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCWNhc2UgTU9YQV9TRFNfUlNUSUNPVU5URVI6IHsKIAkJCWluZm8tPm1vbl9kYXRhLnJ4Y250ID0gMDsKIAkJCWluZm8tPm1vbl9kYXRhLnR4Y250ID0gMDsKIAkJCXJldHVybiAwOwogCQl9Ci0vLyAoYWJvdmUpIGFkZGVkIGJ5IEphbWVzLgorLyogKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4gKi8KIAljYXNlIE1PWEFfQVNQUF9TRVRCQVVEOnsKIAkJCWxvbmcgYmF1ZDsKLQkJCWlmIChnZXRfdXNlcihiYXVkLCAobG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQlpZiAoZ2V0X3VzZXIoYmF1ZCwgKGxvbmcgX191c2VyICopYXJncCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlteHNlcl9zZXRfYmF1ZChpbmZvLCBiYXVkKTsKIAkJCXJldHVybiAwOwpAQCAtMTM3Nyw5ICsxNDQyLDEwIEBACiAKIAkJCXJldHVybiAwOwogCQl9Ci0JY2FzZSBNT1hBX0FTUFBfTU9OOnsKKwljYXNlIE1PWEFfQVNQUF9NT046IHsKIAkJCWludCBtY3IsIHN0YXR1czsKLS8vICAgICAgaW5mby0+bW9uX2RhdGEuc2VyX3BhcmFtID0gdHR5LT50ZXJtaW9zLT5jX2NmbGFnOworCisJCQkvKiBpbmZvLT5tb25fZGF0YS5zZXJfcGFyYW0gPSB0dHktPnRlcm1pb3MtPmNfY2ZsYWc7ICovCiAKIAkJCXN0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMSwgaW5mby0+cG9ydCwgaW5mbyk7CiAJCQlteHNlcl9jaGVja19tb2RlbV9zdGF0dXMoaW5mbywgc3RhdHVzKTsKQEAgLTE0MDAsMjUgKzE0NjYsMjUgQEAKIAkJCWVsc2UKIAkJCQlpbmZvLT5tb25fZGF0YS5ob2xkX3JlYXNvbiAmPSB+TlBQSV9OT1RJRllfQ1RTSE9MRDsKIAotCi0JCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLT5tb25fZGF0YSwgc2l6ZW9mKHN0cnVjdCBteHNlcl9tb24pKSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPm1vbl9kYXRhLAorCQkJCQlzaXplb2Yoc3RydWN0IG14c2VyX21vbikpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCiAJCQlyZXR1cm4gMDsKLQogCQl9CiAKLQljYXNlIE1PWEFfQVNQUF9MU1RBVFVTOnsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8tPmVycl9zaGFkb3csIHNpemVvZih1bnNpZ25lZCBjaGFyKSkpCisJY2FzZSBNT1hBX0FTUFBfTFNUQVRVUzogeworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mby0+ZXJyX3NoYWRvdywKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkJaW5mby0+ZXJyX3NoYWRvdyA9IDA7CiAJCQlyZXR1cm4gMDsKLQogCQl9Ci0JY2FzZSBNT1hBX1NFVF9CQVVEX01FVEhPRDp7CisJY2FzZSBNT1hBX1NFVF9CQVVEX01FVEhPRDogewogCQkJaW50IG1ldGhvZDsKLQkJCWlmIChnZXRfdXNlcihtZXRob2QsIChpbnQgX191c2VyICopIGFyZ3ApKQorCisJCQlpZiAoZ2V0X3VzZXIobWV0aG9kLCAoaW50IF9fdXNlciAqKWFyZ3ApKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJbXhzZXJfc2V0X2JhdWRfbWV0aG9kW2luZm8tPnBvcnRdID0gbWV0aG9kOwogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmbWV0aG9kLCBzaXplb2YoaW50KSkpCkBAIC0xNDQyLDcgKzE1MDgsOCBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIE1PWEFfR0VUX0NPTkY6Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgbXhzZXJjZmcsIHNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSAqIDQpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsIG14c2VyY2ZnLAorCQkJCXNpemVvZihzdHJ1Y3QgbXhzZXJfaHdjb25mKSAqIDQpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwogCWNhc2UgTU9YQV9HRVRfTUFKT1I6CkBAIC0xNDYxLDExICsxNTI4LDExIEBACiAJCQlpZiAobXh2YXJfdGFibGVbaV0uYmFzZSkKIAkJCQlyZXN1bHQgfD0gKDEgPDwgaSk7CiAJCX0KLQkJcmV0dXJuIHB1dF91c2VyKHJlc3VsdCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApOworCQlyZXR1cm4gcHV0X3VzZXIocmVzdWx0LCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKTsKIAljYXNlIE1PWEFfR0VUREFUQUNPVU5UOgogCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZteHZhcl9sb2csIHNpemVvZihteHZhcl9sb2cpKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAljYXNlIE1PWEFfR0VUTVNUQVRVUzoKIAkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKIAkJCUdNU3RhdHVzW2ldLnJpID0gMDsKQEAgLTE0OTgsMjIgKzE1NjUsMjYgQEAKIAkJCWVsc2UKIAkJCQlHTVN0YXR1c1tpXS5jdHMgPSAwOwogCQl9Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgR01TdGF0dXMsIHNpemVvZihzdHJ1Y3QgbXhzZXJfbXN0YXR1cykgKiBNWFNFUl9QT1JUUykpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgR01TdGF0dXMsCisJCQkJc2l6ZW9mKHN0cnVjdCBteHNlcl9tc3RhdHVzKSAqIE1YU0VSX1BPUlRTKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlyZXR1cm4gMDsKLQljYXNlIE1PWEFfQVNQUF9NT05fRVhUOnsKKwljYXNlIE1PWEFfQVNQUF9NT05fRVhUOiB7CiAJCQlpbnQgc3RhdHVzOwogCQkJaW50IG9wbW9kZSwgcDsKIAkJCWludCBzaGlmdGJpdDsKIAkJCXVuc2lnbmVkIGNmbGFnLCBpZmxhZzsKIAogCQkJZm9yIChpID0gMDsgaSA8IE1YU0VSX1BPUlRTOyBpKyspIHsKLQogCQkJCWlmICghbXh2YXJfdGFibGVbaV0uYmFzZSkKIAkJCQkJY29udGludWU7CiAKLQkJCQlzdGF0dXMgPSBteHNlcl9nZXRfbXNyKG14dmFyX3RhYmxlW2ldLmJhc2UsIDAsIGksICYobXh2YXJfdGFibGVbaV0pKTsKLS8vICAgICAgICAgICAgICAgICAgICAgIG14c2VyX2NoZWNrX21vZGVtX3N0YXR1cygmbXh2YXJfdGFibGVbaV0sIHN0YXR1cyk7CisJCQkJc3RhdHVzID0gbXhzZXJfZ2V0X21zcihteHZhcl90YWJsZVtpXS5iYXNlLCAwLAorCQkJCQkJCWksICYobXh2YXJfdGFibGVbaV0pKTsKKwkJCQkvKgorCQkJCW14c2VyX2NoZWNrX21vZGVtX3N0YXR1cygmbXh2YXJfdGFibGVbaV0sCisJCQkJCQkJCXN0YXR1cyk7CisJCQkJKi8KIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfVEVSSSkKIAkJCQkJbXh2YXJfdGFibGVbaV0uaWNvdW50LnJuZysrOwogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9ERFNSKQpAQCAtMTU3OCw3NSArMTY0OSw3NiBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIG14c2VyX3N0b3ByeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKLQorCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOworCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCiAKIAlpbmZvLT5sZGlzY19zdG9wX3J4ID0gMTsKIAlpZiAoSV9JWE9GRih0dHkpKSB7Ci0KLQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7Ci0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewogCQkJaW5mby0+SUVSICY9IH5NT1hBX01VU1RfUkVDVl9JU1I7CiAJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJfSBlbHNlIHsKLQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKLQorCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQkJaW5mby0+eF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7Ci0JCQkvLyAgICAgIG91dGIoaW5mby0+SUVSLCAwKTsgLy8gbWFzayBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCisJCQkvKiBvdXRiKGluZm8tPklFUiwgMCk7ICovCiAJCQlvdXRiKDAsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CiAJCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfVEhSSTsKLQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvKiBmb3JjZSBUeCBpbnRlcnJ1cHQgKi8KLQkJfQkJLy8gYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgotCQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCQkJLyogZm9yY2UgVHggaW50ZXJydXB0ICovCisJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKKwkJfQkJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLworCQkvKiBNWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAl9CiAKIAlpZiAoaW5mby0+dHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgewotCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJLyogTVhfTE9DSygmaW5mby0+c2xvY2spOyAqLwogCQlpbmZvLT5NQ1IgJj0gflVBUlRfTUNSX1JUUzsKIAkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0JCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogCX0KIH0KIAogc3RhdGljIHZvaWQgbXhzZXJfc3RhcnRyeChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKKwkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLwogCiAJaW5mby0+bGRpc2Nfc3RvcF9yeCA9IDA7CiAJaWYgKElfSVhPRkYodHR5KSkgewogCQlpZiAoaW5mby0+eF9jaGFyKQogCQkJaW5mby0+eF9jaGFyID0gMDsKIAkJZWxzZSB7Ci0JCQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAotCQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CiAJCQkJaW5mby0+SUVSIHw9IE1PWEFfTVVTVF9SRUNWX0lTUjsKIAkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCX0gZWxzZSB7Ci0JCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAogCQkJCWluZm8tPnhfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKLQkJCQkvLyAgICAgICAgICBvdXRiKGluZm8tPklFUiwgMCk7IC8vIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0JCQkJb3V0YigwLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCi0JCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CS8qIGZvcmNlIFR4IGludGVycnVwdCAqLworCQkJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCisJCQkJLyogb3V0YihpbmZvLT5JRVIsIDApOyAqLworCQkJCS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KKwkJCQlvdXRiKDAsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CisJCQkJLyogZm9yY2UgVHggaW50ZXJydXB0ICovCisJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CiAJCQkJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7Ci0JCQl9CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKLQkJCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCQl9CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KKwkJCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogCQl9CiAJfQogCiAJaWYgKGluZm8tPnR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpIHsKLQkJLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAkJaW5mby0+TUNSIHw9IFVBUlRfTUNSX1JUUzsKIAkJb3V0YihpbmZvLT5NQ1IsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7Ci0JCS8vTVhfVU5MT0NLKCZpbmZvLT5zbG9jayk7CisJCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogCX0KIH0KIApAQCAtMTY1Niw0OCArMTcyOCw1MyBAQAogICovCiBzdGF0aWMgdm9pZCBteHNlcl90aHJvdHRsZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCS8vc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopdHR5LT5kcml2ZXJfZGF0YTsKLQkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JLy9NWF9MT0NLKCZpbmZvLT5zbG9jayk7CisJLyogc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7ICovCisJLyogdW5zaWduZWQgbG9uZyBmbGFnczsgKi8KKworCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAlteHNlcl9zdG9wcngodHR5KTsKLQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0JLy9zdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKil0dHktPmRyaXZlcl9kYXRhOwotCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvL01YX0xPQ0soJmluZm8tPnNsb2NrKTsKKwkvKiBzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsgKi8KKwkvKiB1bnNpZ25lZCBsb25nIGZsYWdzOyAqLworCisJLyogTVhfTE9DSygmaW5mby0+c2xvY2spOyAqLwogCW14c2VyX3N0YXJ0cngodHR5KTsKLQkvL01YX1VOTE9DSygmaW5mby0+c2xvY2spOworCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqb2xkX3Rlcm1pb3MpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgodHR5LT50ZXJtaW9zLT5jX2NmbGFnICE9IG9sZF90ZXJtaW9zLT5jX2NmbGFnKSB8fCAoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7CisJaWYgKCh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgIT0gb2xkX3Rlcm1pb3MtPmNfY2ZsYWcpIHx8CisJCQkoUkVMRVZBTlRfSUZMQUcodHR5LT50ZXJtaW9zLT5jX2lmbGFnKSAhPSBSRUxFVkFOVF9JRkxBRyhvbGRfdGVybWlvcy0+Y19pZmxhZykpKSB7CiAKIAkJbXhzZXJfY2hhbmdlX3NwZWVkKGluZm8sIG9sZF90ZXJtaW9zKTsKIAotCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYgISh0dHktPnRlcm1pb3MtPmNfY2ZsYWcgJiBDUlRTQ1RTKSkgeworCQlpZiAoKG9sZF90ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykgJiYKKwkJCQkhKHR0eS0+dGVybWlvcy0+Y19jZmxhZyAmIENSVFNDVFMpKSB7CiAJCQl0dHktPmh3X3N0b3BwZWQgPSAwOwogCQkJbXhzZXJfc3RhcnQodHR5KTsKIAkJfQogCX0KIAogLyogSGFuZGxlIHN3IHN0b3BwZWQgKi8KLQlpZiAoKG9sZF90ZXJtaW9zLT5jX2lmbGFnICYgSVhPTikgJiYgISh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSkgeworCWlmICgob2xkX3Rlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSAmJgorCQkJISh0dHktPnRlcm1pb3MtPmNfaWZsYWcgJiBJWE9OKSkgewogCQl0dHktPnN0b3BwZWQgPSAwOwogCi0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogCQkJRElTQUJMRV9NT1hBX01VU1RfUlhfU09GVFdBUkVfRkxPV19DT05UUk9MKGluZm8tPmJhc2UpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJfQotCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAogCQlteHNlcl9zdGFydCh0dHkpOwogCX0KQEAgLTE3MTEsNyArMTc4OCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX3N0b3Aoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CkBAIC0xNzI0LDcgKzE4MDEsNyBAQAogCiBzdGF0aWMgdm9pZCBteHNlcl9zdGFydChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKQEAgLTE3NDAsNyArMTgxNyw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX3dhaXRfdW50aWxfc2VudChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBpbnQgdGltZW91dCkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllcywgY2hhcl90aW1lOwogCWludCBsc3I7CiAKQEAgLTE3NzcsNyArMTg1NCw4IEBACiAJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQgPiAyICogaW5mby0+dGltZW91dCkKIAkJdGltZW91dCA9IDIgKiBpbmZvLT50aW1lb3V0OwogI2lmZGVmIFNFUklBTF9ERUJVR19SU19XQUlUX1VOVElMX1NFTlQKLQlwcmludGsoS0VSTl9ERUJVRyAiSW4gcnNfd2FpdF91bnRpbF9zZW50KCVkKSBjaGVjaz0lbHUuLi4iLCB0aW1lb3V0LCBjaGFyX3RpbWUpOworCXByaW50ayhLRVJOX0RFQlVHICJJbiByc193YWl0X3VudGlsX3NlbnQoJWQpIGNoZWNrPSVsdS4uLiIsCisJCXRpbWVvdXQsIGNoYXJfdGltZSk7CiAJcHJpbnRrKCJqaWZmPSVsdS4uLiIsIGppZmZpZXMpOwogI2VuZGlmCiAJd2hpbGUgKCEoKGxzciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpKSAmIFVBUlRfTFNSX1RFTVQpKSB7CkBAIC0xODAzLDcgKzE4ODEsNyBAQAogICovCiB2b2lkIG14c2VyX2hhbmd1cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCiAJbXhzZXJfZmx1c2hfYnVmZmVyKHR0eSk7CiAJbXhzZXJfc2h1dGRvd24oaW5mbyk7CkBAIC0xODE1LDI0ICsxODkzLDI2IEBACiB9CiAKIAotLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKy8qIGFkZGVkIGJ5IEphbWVzIDAzLTEyLTIwMDQuICovCiAvKgogICogbXhzZXJfcnNfYnJlYWsoKSAtLS0gcm91dGluZSB3aGljaCB0dXJucyB0aGUgYnJlYWsgaGFuZGxpbmcgb24gb3Igb2ZmCiAgKi8KIHN0YXRpYyB2b2lkIG14c2VyX3JzX2JyZWFrKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKIHsKLQlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gKHN0cnVjdCBteHNlcl9zdHJ1Y3QgKikgdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvID0gdHR5LT5kcml2ZXJfZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJaWYgKGJyZWFrX3N0YXRlID09IC0xKQotCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLAorCQkJaW5mby0+YmFzZSArIFVBUlRfTENSKTsKIAllbHNlCi0JCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgJiB+VUFSVF9MQ1JfU0JDLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywKKwkJCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIH0KIAotLy8gKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4KKy8qIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuICovCiAKIAogLyoKQEAgLTE4NDgsNyArMTkyOCw3IEBACiAJaW50IGhhbmRsZWQgPSBJUlFfTk9ORTsKIAogCXBvcnQgPSBOVUxMOwotCS8vc3Bpbl9sb2NrKCZnbV9sb2NrKTsKKwkvKiBzcGluX2xvY2soJmdtX2xvY2spOyAqLwogCiAJZm9yIChpID0gMDsgaSA8IE1YU0VSX0JPQVJEUzsgaSsrKSB7CiAJCWlmIChkZXZfaWQgPT0gJihteHZhcl90YWJsZVtpICogTVhTRVJfUE9SVFNfUEVSX0JPQVJEXSkpIHsKQEAgLTE4NTcsMjkgKzE5MzcsMjUgQEAKIAkJfQogCX0KIAotCWlmIChpID09IE1YU0VSX0JPQVJEUykgeworCWlmIChpID09IE1YU0VSX0JPQVJEUykKIAkJZ290byBpcnFfc3RvcDsKLQl9Ci0JaWYgKHBvcnQgPT0gMCkgeworCWlmIChwb3J0ID09IDApCiAJCWdvdG8gaXJxX3N0b3A7Ci0JfQogCW1heCA9IG14c2VyX251bXBvcnRzW214c2VyY2ZnW2ldLmJvYXJkX3R5cGUgLSAxXTsKIAl3aGlsZSAoMSkgewogCQlpcnFiaXRzID0gaW5iKHBvcnQtPnZlY3RvcikgJiBwb3J0LT52ZWN0b3JtYXNrOwotCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKSB7CisJCWlmIChpcnFiaXRzID09IHBvcnQtPnZlY3Rvcm1hc2spCiAJCQlicmVhazsKLQkJfQogCiAJCWhhbmRsZWQgPSBJUlFfSEFORExFRDsKIAkJZm9yIChpID0gMCwgYml0cyA9IDE7IGkgPCBtYXg7IGkrKywgaXJxYml0cyB8PSBiaXRzLCBiaXRzIDw8PSAxKSB7Ci0JCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKSB7CisJCQlpZiAoaXJxYml0cyA9PSBwb3J0LT52ZWN0b3JtYXNrKQogCQkJCWJyZWFrOwotCQkJfQogCQkJaWYgKGJpdHMgJiBpcnFiaXRzKQogCQkJCWNvbnRpbnVlOwogCQkJaW5mbyA9IHBvcnQgKyBpOwogCi0JCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIgKi8KIAkJCWlpciA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9JSVIpOwogCQkJaWYgKGlpciAmIFVBUlRfSUlSX05PX0lOVCkKIAkJCQljb250aW51ZTsKQEAgLTE4OTAsOSArMTk2Niw5IEBACiAJCQkJaW5iKGluZm8tPmJhc2UgKyBVQVJUX01TUik7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyICovCiAJCQkvKgotCQkJICAgaWYgKCBpbmZvLT50dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFLzQgKXsKKwkJCSAgIGlmIChpbmZvLT50dHktPmZsaXAuY291bnQgPCBUVFlfRkxJUEJVRl9TSVpFIC8gNCkgewogCQkJICAgaW5mby0+SUVSIHw9IE1PWEFfTVVTVF9SRUNWX0lTUjsKIAkJCSAgIG91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwogCQkJICAgfQpAQCAtMTkwOCwxOCArMTk4NCwxNSBAQAogCQkJICAgc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwogCQkJICovCiAKLQkJCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQkJc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUik7CiAKLQkJCWlmIChzdGF0dXMgJiBVQVJUX0xTUl9QRSkgeworCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1BFKQogCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfUEFSSVRZOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0ZFKSB7CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRkUpCiAJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9GUkFNSU5HOwotCQkJfQotCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX09FKSB7CisJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfT0UpCiAJCQkJaW5mby0+ZXJyX3NoYWRvdyB8PSBOUFBJX05PVElGWV9IV19PVkVSUlVOOwotCQkJfQogCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX0JJKQogCQkJCWluZm8tPmVycl9zaGFkb3cgfD0gTlBQSV9OT1RJRllfQlJFQUs7CiAKQEAgLTE5MzAsMTEgKzIwMDMsMTQgQEAKIAkJCQkgICBjb250aW51ZTsKIAkJCQkgICB9CiAJCQkJICovCi0JCQkJaWYgKGlpciA9PSBNT1hBX01VU1RfSUlSX0dEQSB8fCBpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwgaWlyID09IE1PWEFfTVVTVF9JSVJfUlRPIHx8IGlpciA9PSBNT1hBX01VU1RfSUlSX0xTUikKKwkJCQlpZiAoaWlyID09IE1PWEFfTVVTVF9JSVJfR0RBIHx8CisJCQkJCQlpaXIgPT0gTU9YQV9NVVNUX0lJUl9SREEgfHwKKwkJCQkJCWlpciA9PSBNT1hBX01VU1RfSUlSX1JUTyB8fAorCQkJCQkJaWlyID09IE1PWEFfTVVTVF9JSVJfTFNSKQogCQkJCQlteHNlcl9yZWNlaXZlX2NoYXJzKGluZm8sICZzdGF0dXMpOwogCiAJCQl9IGVsc2UgewotCQkJCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAKIAkJCQlzdGF0dXMgJj0gaW5mby0+cmVhZF9zdGF0dXNfbWFzazsKIAkJCQlpZiAoc3RhdHVzICYgVUFSVF9MU1JfRFIpCkBAIC0xOTQ0LDEzICsyMDIwLDEzIEBACiAJCQlpZiAobXNyICYgVUFSVF9NU1JfQU5ZX0RFTFRBKSB7CiAJCQkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIG1zcik7CiAJCQl9Ci0JCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMgorCQkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTEzLTIwMDIgKi8KIAkJCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpIHsKIAkJCQlpZiAoKGlpciA9PSAweDAyKSAmJiAoc3RhdHVzICYgVUFSVF9MU1JfVEhSRSkpIHsKIAkJCQkJbXhzZXJfdHJhbnNtaXRfY2hhcnMoaW5mbyk7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0xMy0yMDAyCisJCQkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMTMtMjAwMiAqLwogCiAJCQkJaWYgKHN0YXR1cyAmIFVBUlRfTFNSX1RIUkUpIHsKIC8qIDgtMi05OSBieSBXaWxsaWFtCkBAIC0xOTY2LDcgKzIwNDIsNyBAQAogCX0KIAogICAgICAgaXJxX3N0b3A6Ci0JLy9zcGluX3VubG9jaygmZ21fbG9jayk7CisJLyogc3Bpbl91bmxvY2soJmdtX2xvY2spOyAqLwogCXJldHVybiBoYW5kbGVkOwogfQogCkBAIC0xOTg0LDU2ICsyMDYwLDU4IEBACiAKIAlyZWN2X3Jvb20gPSB0dHktPnJlY2VpdmVfcm9vbTsKIAlpZiAoKHJlY3Zfcm9vbSA9PSAwKSAmJiAoIWluZm8tPmxkaXNjX3N0b3BfcngpKSB7Ci0JCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KIAkJbXhzZXJfc3RvcHJ4KHR0eSk7Ci0JCS8vcmV0dXJuOworCQkvKiByZXR1cm47ICovCiAJfQogCi0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgIT0gTU9YQV9PVEhFUl9VQVJUKSB7CiAKIAkJaWYgKCpzdGF0dXMgJiBVQVJUX0xTUl9TUEVDSUFMKSB7CiAJCQlnb3RvIGludHJfb2xkOwogCQl9Ci0JCS8vIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwMi0xMS0yMDA0Ci0JCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VODYwX0hXSUQgJiYgKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpKQorCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNCAqLworCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTg2MF9IV0lEICYmCisJCQkJKCpzdGF0dXMgJiBNT1hBX01VU1RfTFNSX1JFUlIpKQogCQkJZ290byBpbnRyX29sZDsKLQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDItMTQtMjAwNAorCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwMi0xNC0yMDA0ICovCiAJCWlmICgqc3RhdHVzICYgTU9YQV9NVVNUX0xTUl9SRVJSKQogCQkJZ290byBpbnRyX29sZDsKIAogCQlnZGwgPSBpbmIoaW5mby0+YmFzZSArIE1PWEFfTVVTVF9HRExfUkVHSVNURVIpOwogCi0JCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcgPT0gTU9YQV9NVVNUX01VMTUwX0hXSUQpCS8vIGFkZCBieSBWaWN0b3IgWXUuIDAyLTExLTIwMDQKKwkJLyogYWRkIGJ5IFZpY3RvciBZdS4gMDItMTEtMjAwNCAqLworCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnID09IE1PWEFfTVVTVF9NVTE1MF9IV0lEKQogCQkJZ2RsICY9IE1PWEFfTVVTVF9HRExfTUFTSzsKIAkJaWYgKGdkbCA+PSByZWN2X3Jvb20pIHsKIAkJCWlmICghaW5mby0+bGRpc2Nfc3RvcF9yeCkgewotCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQkvKiBteHNlcl90aHJvdHRsZSh0dHkpOyAqLwogCQkJCW14c2VyX3N0b3ByeCh0dHkpOwogCQkJfQotCQkJLy9yZXR1cm47CisJCQkvKiByZXR1cm47ICovCiAJCX0KIAkJd2hpbGUgKGdkbC0tKSB7CiAJCQljaCA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9SWCk7CiAJCQl0dHlfaW5zZXJ0X2ZsaXBfY2hhcih0dHksIGNoLCAwKTsKIAkJCWNudCsrOwogCQkJLyoKLQkJCSAgIGlmKChjbnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkJICAgaWYgKChjbnQgPj0gSElfV0FURVIpICYmIChpbmZvLT5zdG9wX3J4ID09IDApKSB7CiAJCQkgICBteHNlcl9zdG9wcngodHR5KTsKLQkJCSAgIGluZm8tPnN0b3Bfcng9MTsKKwkJCSAgIGluZm8tPnN0b3BfcnggPSAxOwogCQkJICAgYnJlYWs7CiAJCQkgICB9ICovCiAJCX0KIAkJZ290byBlbmRfaW50cjsKIAl9Ci1pbnRyX29sZDoKLQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisgaW50cl9vbGQ6CisJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCiAJZG8gewogCQlpZiAobWF4LS0gPCAwKQogCQkJYnJlYWs7CiAJCS8qCi0JCSAgIGlmKChjbnQ+PUhJX1dBVEVSKSAmJiAoaW5mby0+c3RvcF9yeD09MCkpeworCQkgICBpZiAoKGNudCA+PSBISV9XQVRFUikgJiYgKGluZm8tPnN0b3BfcnggPT0gMCkpIHsKIAkJICAgbXhzZXJfc3RvcHJ4KHR0eSk7CiAJCSAgIGluZm8tPnN0b3Bfcng9MTsKIAkJICAgYnJlYWs7CkBAIC0yMDQxLDExICsyMTE5LDExIEBACiAJCSAqLwogCiAJCWNoID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX1JYKTsKLQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZyAmJiAoKnN0YXR1cyAmIFVBUlRfTFNSX09FKSAvKiYmICEoKnN0YXR1cyZVQVJUX0xTUl9EUikgKi8gKQogCQkJb3V0YigweDIzLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwogCQkqc3RhdHVzICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7Ci0JCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQlpZiAoKnN0YXR1cyAmIGluZm8tPmlnbm9yZV9zdGF0dXNfbWFzaykgewogCQkJaWYgKCsraWdub3JlZCA+IDEwMCkKIAkJCQlicmVhazsKQEAgLTIwODAsNyArMjE1OCw3IEBACiAJCQljbnQrKzsKIAkJCWlmIChjbnQgPj0gcmVjdl9yb29tKSB7CiAJCQkJaWYgKCFpbmZvLT5sZGlzY19zdG9wX3J4KSB7Ci0JCQkJCS8vbXhzZXJfdGhyb3R0bGUodHR5KTsKKwkJCQkJLyogbXhzZXJfdGhyb3R0bGUodHR5KTsgKi8KIAkJCQkJbXhzZXJfc3RvcHJ4KHR0eSk7CiAJCQkJfQogCQkJCWJyZWFrOwpAQCAtMjA4OCwyMSArMjE2NiwyMCBAQAogCiAJCX0KIAotCQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCQkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQogCQkJYnJlYWs7Ci0JCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLyogYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMiAqLwogCiAJCS8qIG1hc2sgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCiAJCSAqc3RhdHVzID0gaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xTUikgJiBpbmZvLT5yZWFkX3N0YXR1c19tYXNrOwogCQkgKi8KLQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAkJKnN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9MU1IpOwotCQkvLyBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyCisJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAl9IHdoaWxlICgqc3RhdHVzICYgVUFSVF9MU1JfRFIpOwogCi1lbmRfaW50cjoJCS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIKLQorZW5kX2ludHI6CQkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJbXh2YXJfbG9nLnJ4Y250W2luZm8tPnBvcnRdICs9IGNudDsKIAlpbmZvLT5tb25fZGF0YS5yeGNudCArPSBjbnQ7CiAJaW5mby0+bW9uX2RhdGEudXBfcnhjbnQgKz0gY250OwpAQCAtMjEzNyw3ICsyMjE0LDEwIEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoKGluZm8tPnhtaXRfY250IDw9IDApIHx8IGluZm8tPnR0eS0+c3RvcHBlZCB8fCAoaW5mby0+dHR5LT5od19zdG9wcGVkICYmIChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpKSB7CisJaWYgKChpbmZvLT54bWl0X2NudCA8PSAwKSB8fCBpbmZvLT50dHktPnN0b3BwZWQgfHwKKwkJCShpbmZvLT50dHktPmh3X3N0b3BwZWQgJiYKKwkJCShpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSkgewogCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CiAJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwpAQCAtMjE0NywxNyArMjIyNywxOCBAQAogCWNudCA9IGluZm8tPnhtaXRfY250OwogCWNvdW50ID0gaW5mby0+eG1pdF9maWZvX3NpemU7CiAJZG8gewotCQlvdXRiKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbCsrXSwgaW5mby0+YmFzZSArIFVBUlRfVFgpOworCQlvdXRiKGluZm8tPnhtaXRfYnVmW2luZm8tPnhtaXRfdGFpbCsrXSwKKwkJCWluZm8tPmJhc2UgKyBVQVJUX1RYKTsKIAkJaW5mby0+eG1pdF90YWlsID0gaW5mby0+eG1pdF90YWlsICYgKFNFUklBTF9YTUlUX1NJWkUgLSAxKTsKIAkJaWYgKC0taW5mby0+eG1pdF9jbnQgPD0gMCkKIAkJCWJyZWFrOwogCX0gd2hpbGUgKC0tY291bnQgPiAwKTsKIAlteHZhcl9sb2cudHhjbnRbaW5mby0+cG9ydF0gKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKIAotLy8gYWRkZWQgYnkgSmFtZXMgMDMtMTItMjAwNC4KKy8qIGFkZGVkIGJ5IEphbWVzIDAzLTEyLTIwMDQuICovCiAJaW5mby0+bW9uX2RhdGEudHhjbnQgKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKIAlpbmZvLT5tb25fZGF0YS51cF90eGNudCArPSAoY250IC0gaW5mby0+eG1pdF9jbnQpOwotLy8gKGFib3ZlKSBhZGRlZCBieSBKYW1lcy4KKy8qIChhYm92ZSkgYWRkZWQgYnkgSmFtZXMuICovCiAKIC8qIGFkZGVkIGJ5IGNhc3BlciAxLzExLzIwMDAgKi8KIAlpbmZvLT5pY291bnQudHggKz0gKGNudCAtIGluZm8tPnhtaXRfY250KTsKQEAgLTIxODgsNyArMjI2OSw2IEBACiAJaW5mby0+bW9uX2RhdGEubW9kZW1fc3RhdHVzID0gc3RhdHVzOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaW5mby0+ZGVsdGFfbXNyX3dhaXQpOwogCi0KIAlpZiAoKGluZm8tPmZsYWdzICYgQVNZTkNfQ0hFQ0tfQ0QpICYmIChzdGF0dXMgJiBVQVJUX01TUl9ERENEKSkgewogCQlpZiAoc3RhdHVzICYgVUFSVF9NU1JfRENEKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpbmZvLT5vcGVuX3dhaXQpOwpAQCAtMjIwMCw3ICsyMjgwLDggQEAKIAkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKIAkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAwOwogCi0JCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkJCQkoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKIAkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CiAJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwogCQkJCX0KQEAgLTIyMDksNyArMjI5MCw4IEBACiAJCX0gZWxzZSB7CiAJCQlpZiAoIShzdGF0dXMgJiBVQVJUX01TUl9DVFMpKSB7CiAJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMTsKLQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCWlmICgoaW5mby0+dHlwZSAhPSBQT1JUXzE2NTUwQSkgJiYKKwkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewogCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CiAJCQkJCW91dGIoaW5mby0+SUVSLCBpbmZvLT5iYXNlICsgVUFSVF9JRVIpOwogCQkJCX0KQEAgLTIyMzEsNyArMjMxMyw3IEBACiAJICovCiAJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgfHwgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKSkgewogCQlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAodHR5LT50ZXJtaW9zLT5jX2NmbGFnICYgQ0xPQ0FMKQpAQCAtMjI1NCw3ICsyMzM2LDggQEAKIAlpbmZvLT5ibG9ja2VkX29wZW4rKzsKIAl3aGlsZSAoMSkgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTUNSKSB8IFVBUlRfTUNSX0RUUiB8IFVBUlRfTUNSX1JUUywgaW5mby0+YmFzZSArIFVBUlRfTUNSKTsKKwkJb3V0YihpbmIoaW5mby0+YmFzZSArIFVBUlRfTUNSKSB8CisJCQlVQVJUX01DUl9EVFIgfCBVQVJUX01DUl9SVFMsIGluZm8tPmJhc2UgKyBVQVJUX01DUik7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmICh0dHlfaHVuZ191cF9wKGZpbHApIHx8ICEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkpIHsKQEAgLTIyNjQsNyArMjM0Nyw5IEBACiAJCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKCEoaW5mby0+ZmxhZ3MgJiBBU1lOQ19DTE9TSU5HKSAmJiAoZG9fY2xvY2FsIHx8IChpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0RDRCkpKQorCQlpZiAoIShpbmZvLT5mbGFncyAmIEFTWU5DX0NMT1NJTkcpICYmCisJCQkJKGRvX2Nsb2NhbCB8fAorCQkJCShpbmIoaW5mby0+YmFzZSArIFVBUlRfTVNSKSAmIFVBUlRfTVNSX0RDRCkpKQogCQkJYnJlYWs7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewogCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOwpAQCAtMjI3OCwyNyArMjM2MywyNiBAQAogCQlpbmZvLT5jb3VudCsrOwogCWluZm8tPmJsb2NrZWRfb3Blbi0tOwogCWlmIChyZXR2YWwpCi0JCXJldHVybiAocmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKIAlpbmZvLT5mbGFncyB8PSBBU1lOQ19OT1JNQUxfQUNUSVZFOwotCXJldHVybiAoMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXhzZXJfc3RhcnR1cChzdHJ1Y3QgbXhzZXJfc3RydWN0ICppbmZvKQogewotCiAJdW5zaWduZWQgbG9uZyBwYWdlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOwogCWlmICghcGFnZSkKLQkJcmV0dXJuICgtRU5PTUVNKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAogCWlmIChpbmZvLT5mbGFncyAmIEFTWU5DX0lOSVRJQUxJWkVEKSB7CiAJCWZyZWVfcGFnZShwYWdlKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKCFpbmZvLT5iYXNlIHx8ICFpbmZvLT50eXBlKSB7CkBAIC0yMzA2LDcgKzIzOTAsNyBAQAogCQkJc2V0X2JpdChUVFlfSU9fRVJST1IsICZpbmZvLT50dHktPmZsYWdzKTsKIAkJZnJlZV9wYWdlKHBhZ2UpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gKDApOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKGluZm8tPnhtaXRfYnVmKQogCQlmcmVlX3BhZ2UocGFnZSk7CkBAIC0yMzE4LDkgKzI0MDIsMTIgQEAKIAkgKiAodGhleSB3aWxsIGJlIHJlZW5hYmxlZCBpbiBteHNlcl9jaGFuZ2Vfc3BlZWQoKSkKIAkgKi8KIAlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQotCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCB8IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8CisJCQlVQVJUX0ZDUl9DTEVBUl9YTUlUIHwKKwkJCU1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKIAllbHNlCi0JCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUKSwgaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAorCQkJaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKIAogCS8qCiAJICogQXQgdGhpcyBwb2ludCB0aGVyZSdzIG5vIHdheSB0aGUgTFNSIGNvdWxkIHN0aWxsIGJlIDB4RkY7CkBAIC0yMzMyLDkgKzI0MTksOSBAQAogCQlpZiAoY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgewogCQkJaWYgKGluZm8tPnR0eSkKIAkJCQlzZXRfYml0KFRUWV9JT19FUlJPUiwgJmluZm8tPnR0eS0+ZmxhZ3MpOwotCQkJcmV0dXJuICgwKTsKKwkJCXJldHVybiAwOwogCQl9IGVsc2UKLQkJCXJldHVybiAoLUVOT0RFVik7CisJCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAkvKgpAQCAtMjM1NiwxMiArMjQ0MywxMiBAQAogCSAqIEZpbmFsbHksIGVuYWJsZSBpbnRlcnJ1cHRzCiAJICovCiAJaW5mby0+SUVSID0gVUFSVF9JRVJfTVNJIHwgVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKLS8vICAgICAgaW5mby0+SUVSID0gVUFSVF9JRVJfUkxTSSB8IFVBUlRfSUVSX1JESTsKKwkvKiBpbmZvLT5JRVIgPSBVQVJUX0lFUl9STFNJIHwgVUFSVF9JRVJfUkRJOyAqLwogCi0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLwogCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCiAJCWluZm8tPklFUiB8PSBNT1hBX01VU1RfSUVSX0VHREFJOwotCS8vIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCiAJb3V0YihpbmZvLT5JRVIsIGluZm8tPmJhc2UgKyBVQVJUX0lFUik7CS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAKIAkvKgpAQCAtMjM4Myw3ICsyNDcwLDcgQEAKIAlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CiAKIAlpbmZvLT5mbGFncyB8PSBBU1lOQ19JTklUSUFMSVpFRDsKLQlyZXR1cm4gKDApOworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjQyMSwxMiArMjUwOCwxNSBAQAogCW91dGIoaW5mby0+TUNSLCBpbmZvLT5iYXNlICsgVUFSVF9NQ1IpOwogCiAJLyogY2xlYXIgUngvVHggRklGTydzICovCi0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkvKiBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMiAqLwogCWlmIChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpCi0JCW91dGIoKFVBUlRfRkNSX0NMRUFSX1JDVlIgfCBVQVJUX0ZDUl9DTEVBUl9YTUlUIHwgTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOworCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKKwkJCVVBUlRfRkNSX0NMRUFSX1hNSVQgfAorCQkJTU9YQV9NVVNUX0ZDUl9HREFfTU9ERV9FTkFCTEUpLCBpbmZvLT5iYXNlICsgVUFSVF9GQ1IpOwogCWVsc2UKLQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgotCQlvdXRiKChVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwgVUFSVF9GQ1JfQ0xFQVJfWE1JVCksIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CisJCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KKwkJb3V0YigoVUFSVF9GQ1JfQ0xFQVJfUkNWUiB8IFVBUlRfRkNSX0NMRUFSX1hNSVQpLAorCQkJaW5mby0+YmFzZSArIFVBUlRfRkNSKTsKIAogCS8qIHJlYWQgZGF0YSBwb3J0IHRvIHJlc2V0IHRoaW5ncyAqLwogCSh2b2lkKSBpbmIoaW5mby0+YmFzZSArIFVBUlRfUlgpOwpAQCAtMjQzNiwxMSArMjUyNiwxMCBAQAogCiAJaW5mby0+ZmxhZ3MgJj0gfkFTWU5DX0lOSVRJQUxJWkVEOwogCi0JLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIKLQlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSB7CisJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIgKi8KKwlpZiAoaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKQogCQlTRVRfTU9YQV9NVVNUX05PX1NPRlRXQVJFX0ZMT1dfQ09OVFJPTChpbmZvLT5iYXNlKTsKLQl9Ci0JLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMjMtMjAwMgorCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTIzLTIwMDIgKi8KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPnNsb2NrLCBmbGFncyk7CiB9CkBAIC0yNDU3LDE0ICsyNTQ2LDEyIEBACiAJbG9uZyBiYXVkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQogCWlmICghaW5mby0+dHR5IHx8ICFpbmZvLT50dHktPnRlcm1pb3MpCiAJCXJldHVybiByZXQ7CiAJY2ZsYWcgPSBpbmZvLT50dHktPnRlcm1pb3MtPmNfY2ZsYWc7CiAJaWYgKCEoaW5mby0+YmFzZSkpCiAJCXJldHVybiByZXQ7CiAKLQogI2lmbmRlZiBCOTIxNjAwCiAjZGVmaW5lIEI5MjE2MDAgKEI0NjA4MDAgKzEpCiAjZW5kaWYKQEAgLTI1NTksOSArMjY0Niw4IEBACiAJCWN2YWwgfD0gMHgwNDsKIAlpZiAoY2ZsYWcgJiBQQVJFTkIpCiAJCWN2YWwgfD0gVUFSVF9MQ1JfUEFSSVRZOwotCWlmICghKGNmbGFnICYgUEFST0REKSkgeworCWlmICghKGNmbGFnICYgUEFST0REKSkKIAkJY3ZhbCB8PSBVQVJUX0xDUl9FUEFSOwotCX0KIAlpZiAoY2ZsYWcgJiBDTVNQQVIpCiAJCWN2YWwgfD0gVUFSVF9MQ1JfU1BBUjsKIApAQCAtMjU3NCwxMyArMjY2MCwxMiBAQAogCQkJZmNyID0gMDsKIAl9IGVsc2UgewogCQlmY3IgPSBVQVJUX0ZDUl9FTkFCTEVfRklGTzsKLQkJLy8gZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIKKwkJLyogZm9sbG93aW5nIGFkZCBieSBWaWN0b3IgWXUuIDA4LTMwLTIwMDIgKi8KIAkJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewogCQkJZmNyIHw9IE1PWEFfTVVTVF9GQ1JfR0RBX01PREVfRU5BQkxFOwogCQkJU0VUX01PWEFfTVVTVF9GSUZPX1ZBTFVFKGluZm8pOwogCQl9IGVsc2UgewotCQkJLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDgtMzAtMjAwMgotCisJCQkvKiBhYm92ZSBhZGQgYnkgVmljdG9yIFl1LiAwOC0zMC0yMDAyICovCiAJCQlzd2l0Y2ggKGluZm8tPnJ4X3RyaWdnZXIpIHsKIAkJCWNhc2UgMToKIAkJCQlmY3IgfD0gVUFSVF9GQ1JfVFJJR0dFUl8xOwpAQCAtMjYwNiwyMiArMjY5MSwyNCBAQAogCQlpbmZvLT5JRVIgfD0gVUFSVF9JRVJfTVNJOwogCQlpZiAoKGluZm8tPnR5cGUgPT0gUE9SVF8xNjU1MEEpIHx8IChpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CiAJCQlpbmZvLT5NQ1IgfD0gVUFSVF9NQ1JfQUZFOwotCQkJLy9zdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOwotLyoJc2F2ZV9mbGFncyhmbGFncyk7CisJCQkvKiBzdGF0dXMgPSBteHNlcl9nZXRfbXNyKGluZm8tPmJhc2UsIDAsIGluZm8tPnBvcnQpOyAqLworLyoKKwlzYXZlX2ZsYWdzKGZsYWdzKTsKIAljbGkoKTsKIAlzdGF0dXMgPSBpbmIoYmFzZWFkZHIgKyBVQVJUX01TUik7Ci0JcmVzdG9yZV9mbGFncyhmbGFncyk7Ki8KLQkJCS8vbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CisJcmVzdG9yZV9mbGFncyhmbGFncyk7CisqLworCQkJLyogbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7ICovCiAJCX0gZWxzZSB7Ci0JCQkvL3N0YXR1cyA9IG14c2VyX2dldF9tc3IoaW5mby0+YmFzZSwgMCwgaW5mby0+cG9ydCk7Ci0KLQkJCS8vTVhfTE9DSygmaW5mby0+c2xvY2spOworCQkJLyogc3RhdHVzID0gbXhzZXJfZ2V0X21zcihpbmZvLT5iYXNlLCAwLCBpbmZvLT5wb3J0KTsgKi8KKwkJCS8qIE1YX0xPQ0soJmluZm8tPnNsb2NrKTsgKi8KIAkJCXN0YXR1cyA9IGluYihpbmZvLT5iYXNlICsgVUFSVF9NU1IpOwotCQkJLy9NWF9VTkxPQ0soJmluZm8tPnNsb2NrKTsKKwkJCS8qIE1YX1VOTE9DSygmaW5mby0+c2xvY2spOyAqLwogCQkJaWYgKGluZm8tPnR0eS0+aHdfc3RvcHBlZCkgewogCQkJCWlmIChzdGF0dXMgJiBVQVJUX01TUl9DVFMpIHsKIAkJCQkJaW5mby0+dHR5LT5od19zdG9wcGVkID0gMDsKLQkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJiAoIWluZm8tPklzTW94YU11c3RDaGlwRmxhZykpIHsKKwkJCQkJaWYgKChpbmZvLT50eXBlICE9IFBPUlRfMTY1NTBBKSAmJgorCQkJCQkJCSghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgewogCQkJCQkJaW5mby0+SUVSIHw9IFVBUlRfSUVSX1RIUkk7CiAJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCQkJfQpAQCAtMjYzMCw3ICsyNzE3LDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKCEoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSkgewogCQkJCQlpbmZvLT50dHktPmh3X3N0b3BwZWQgPSAxOwotCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmICghaW5mby0+SXNNb3hhTXVzdENoaXBGbGFnKSkgeworCQkJCQlpZiAoKGluZm8tPnR5cGUgIT0gUE9SVF8xNjU1MEEpICYmCisJCQkJCQkJKCFpbmZvLT5Jc01veGFNdXN0Q2hpcEZsYWcpKSB7CiAJCQkJCQlpbmZvLT5JRVIgJj0gflVBUlRfSUVSX1RIUkk7CiAJCQkJCQlvdXRiKGluZm8tPklFUiwgaW5mby0+YmFzZSArIFVBUlRfSUVSKTsKIAkJCQkJfQpAQCAtMjY2OCwxMSArMjc1NiwxNyBAQAogCQkgKiBvdmVycnVucyB0b28uICAoRm9yIHJlYWwgcmF3IHN1cHBvcnQpLgogCQkgKi8KIAkJaWYgKElfSUdOUEFSKGluZm8tPnR0eSkpIHsKLQkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBVQVJUX0xTUl9PRSB8IFVBUlRfTFNSX1BFIHwgVUFSVF9MU1JfRkU7Ci0JCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9IFVBUlRfTFNSX09FIHwgVUFSVF9MU1JfUEUgfCBVQVJUX0xTUl9GRTsKKwkJCWluZm8tPmlnbm9yZV9zdGF0dXNfbWFzayB8PQorCQkJCQkJVUFSVF9MU1JfT0UgfAorCQkJCQkJVUFSVF9MU1JfUEUgfAorCQkJCQkJVUFSVF9MU1JfRkU7CisJCQlpbmZvLT5yZWFkX3N0YXR1c19tYXNrIHw9CisJCQkJCQlVQVJUX0xTUl9PRSB8CisJCQkJCQlVQVJUX0xTUl9QRSB8CisJCQkJCQlVQVJUX0xTUl9GRTsKIAkJfQogCX0KLQkvLyBmb2xsb3dpbmcgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCS8qIGZvbGxvd2luZyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wMi0yMDAyICovCiAJaWYgKGluZm8tPklzTW94YU11c3RDaGlwRmxhZykgewogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAkJU0VUX01PWEFfTVVTVF9YT04xX1ZBTFVFKGluZm8tPmJhc2UsIFNUQVJUX0NIQVIoaW5mby0+dHR5KSk7CkBAIC0yNjk4LDcgKzI3OTIsNyBAQAogCQkgKi8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAl9Ci0JLy8gYWJvdmUgYWRkIGJ5IFZpY3RvciBZdS4gMDktMDItMjAwMgorCS8qIGFib3ZlIGFkZCBieSBWaWN0b3IgWXUuIDA5LTAyLTIwMDIgKi8KIAogCiAJb3V0YihmY3IsIGluZm8tPmJhc2UgKyBVQVJUX0ZDUik7CS8qIHNldCBmY3IgKi8KQEAgLTI3MjksMTAgKzI4MjMsOCBAQAogCQlxdW90ID0gKDIgKiBpbmZvLT5iYXVkX2Jhc2UgLyAyNjkpOwogCX0gZWxzZSBpZiAobmV3c3BkKSB7CiAJCXF1b3QgPSBpbmZvLT5iYXVkX2Jhc2UgLyBuZXdzcGQ7Ci0KIAkJaWYgKHF1b3QgPT0gMCkKIAkJCXF1b3QgPSAxOwotCiAJfSBlbHNlIHsKIAkJcXVvdCA9IDA7CiAJfQpAQCAtMjc2NSw4ICsyODU3LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0KLQogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogZnJpZW5kcyBvZiBteHNlcl9pb2N0bCgpCkBAIC0yNzc3LDcgKzI4NjcsNyBAQAogCXN0cnVjdCBzZXJpYWxfc3RydWN0IHRtcDsKIAogCWlmICghcmV0aW5mbykKLQkJcmV0dXJuICgtRUZBVUxUKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKIAl0bXAudHlwZSA9IGluZm8tPnR5cGU7CiAJdG1wLmxpbmUgPSBpbmZvLT5wb3J0OwpAQCAtMjc5MSw3ICsyODgxLDcgQEAKIAl0bXAuaHViNiA9IDA7CiAJaWYgKGNvcHlfdG9fdXNlcihyZXRpbmZvLCAmdG1wLCBzaXplb2YoKnJldGluZm8pKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBteHNlcl9zZXRfc2VyaWFsX2luZm8oc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbywgc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdfaW5mbykKQEAgLTI4MDEsMjkgKzI4OTEsMzcgQEAKIAlpbnQgcmV0dmFsID0gMDsKIAogCWlmICghbmV3X2luZm8gfHwgIWluZm8tPmJhc2UpCi0JCXJldHVybiAoLUVGQVVMVCk7CisJCXJldHVybiAtRUZBVUxUOwogCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3X3NlcmlhbCwgbmV3X2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKChuZXdfc2VyaWFsLmlycSAhPSBpbmZvLT5pcnEpIHx8IChuZXdfc2VyaWFsLnBvcnQgIT0gaW5mby0+YmFzZSkgfHwgKG5ld19zZXJpYWwuY3VzdG9tX2Rpdmlzb3IgIT0gaW5mby0+Y3VzdG9tX2Rpdmlzb3IpIHx8IChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpKQotCQlyZXR1cm4gKC1FUEVSTSk7CisJaWYgKChuZXdfc2VyaWFsLmlycSAhPSBpbmZvLT5pcnEpIHx8CisJCQkobmV3X3NlcmlhbC5wb3J0ICE9IGluZm8tPmJhc2UpIHx8CisJCQkobmV3X3NlcmlhbC5jdXN0b21fZGl2aXNvciAhPSBpbmZvLT5jdXN0b21fZGl2aXNvcikgfHwKKwkJCShuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpKQorCQlyZXR1cm4gLUVQRVJNOwogCiAJZmxhZ3MgPSBpbmZvLT5mbGFncyAmIEFTWU5DX1NQRF9NQVNLOwogCiAJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7Ci0JCWlmICgobmV3X3NlcmlhbC5iYXVkX2Jhc2UgIT0gaW5mby0+YmF1ZF9iYXNlKSB8fCAobmV3X3NlcmlhbC5jbG9zZV9kZWxheSAhPSBpbmZvLT5jbG9zZV9kZWxheSkgfHwgKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKLQkJCXJldHVybiAoLUVQRVJNKTsKLQkJaW5mby0+ZmxhZ3MgPSAoKGluZm8tPmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSB8IChuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKKwkJaWYgKChuZXdfc2VyaWFsLmJhdWRfYmFzZSAhPSBpbmZvLT5iYXVkX2Jhc2UpIHx8CisJCQkJKG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgIT0gaW5mby0+Y2xvc2VfZGVsYXkpIHx8CisJCQkJKChuZXdfc2VyaWFsLmZsYWdzICYgfkFTWU5DX1VTUl9NQVNLKSAhPSAoaW5mby0+ZmxhZ3MgJiB+QVNZTkNfVVNSX01BU0spKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19VU1JfTUFTSykgfAorCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfVVNSX01BU0spKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBPSywgcGFzdCB0aGlzIHBvaW50LCBhbGwgdGhlIGVycm9yIGNoZWNraW5nIGhhcyBiZWVuIGRvbmUuCiAJCSAqIEF0IHRoaXMgcG9pbnQsIHdlIHN0YXJ0IG1ha2luZyBjaGFuZ2VzLi4uLi4KIAkJICovCi0JCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfCAobmV3X3NlcmlhbC5mbGFncyAmIEFTWU5DX0ZMQUdTKSk7CisJCWluZm8tPmZsYWdzID0gKChpbmZvLT5mbGFncyAmIH5BU1lOQ19GTEFHUykgfAorCQkJCShuZXdfc2VyaWFsLmZsYWdzICYgQVNZTkNfRkxBR1MpKTsKIAkJaW5mby0+Y2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogSFogLyAxMDA7CiAJCWluZm8tPmNsb3Npbmdfd2FpdCA9IG5ld19zZXJpYWwuY2xvc2luZ193YWl0ICogSFogLyAxMDA7Ci0JCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPSAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19MT1dfTEFURU5DWSkgPyAxIDogMDsKLQkJaW5mby0+dHR5LT5sb3dfbGF0ZW5jeSA9IDA7CS8vKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7CisJCWluZm8tPnR0eS0+bG93X2xhdGVuY3kgPQorCQkJCShpbmZvLT5mbGFncyAmIEFTWU5DX0xPV19MQVRFTkNZKSA/IDEgOiAwOworCQlpbmZvLT50dHktPmxvd19sYXRlbmN5ID0gMDsJLyogKGluZm8tPmZsYWdzICYgQVNZTkNfTE9XX0xBVEVOQ1kpID8gMSA6IDA7ICovCiAJfQogCiAJLyogYWRkZWQgYnkgY2FzcGVyLCAzLzE3LzIwMDAsIGZvciBtb3VzZSAqLwpAQCAtMjgzMSw3ICsyOTI5LDYgQEAKIAogCXByb2Nlc3NfdHhyeF9maWZvKGluZm8pOwogCi0JLyogKi8KIAlpZiAoaW5mby0+ZmxhZ3MgJiBBU1lOQ19JTklUSUFMSVpFRCkgewogCQlpZiAoZmxhZ3MgIT0gKGluZm8tPmZsYWdzICYgQVNZTkNfU1BEX01BU0spKSB7CiAJCQlteHNlcl9jaGFuZ2Vfc3BlZWQoaW5mbywgTlVMTCk7CkBAIC0yODM5LDcgKzI5MzYsNyBAQAogCX0gZWxzZSB7CiAJCXJldHZhbCA9IG14c2VyX3N0YXJ0dXAoaW5mbyk7CiAJfQotCXJldHVybiAocmV0dmFsKTsKKwlyZXR1cm4gcmV0dmFsOwogfQogCiAvKgpAQCAtMjg3NiwyNSArMjk3MywyNyBAQAogCQlyZXR1cm47CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpIHwgVUFSVF9MQ1JfU0JDLCBpbmZvLT5iYXNlICsgVUFSVF9MQ1IpOworCW91dGIoaW5iKGluZm8tPmJhc2UgKyBVQVJUX0xDUikgfCBVQVJUX0xDUl9TQkMsCisJCWluZm8tPmJhc2UgKyBVQVJUX0xDUik7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlzY2hlZHVsZV90aW1lb3V0KGR1cmF0aW9uKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKLQlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywgaW5mby0+YmFzZSArIFVBUlRfTENSKTsKKwlvdXRiKGluYihpbmZvLT5iYXNlICsgVUFSVF9MQ1IpICYgflVBUlRfTENSX1NCQywKKwkJaW5mby0+YmFzZSArIFVBUlRfTENSKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5zbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IG14c2VyX3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSAoc3RydWN0IG14c2VyX3N0cnVjdCAqKSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBteHNlcl9zdHJ1Y3QgKmluZm8gPSB0dHktPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGNoYXIgY29udHJvbCwgc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAogCWlmICh0dHktPmluZGV4ID09IE1YU0VSX1BPUlRTKQotCQlyZXR1cm4gKC1FTk9JT0NUTENNRCk7CisJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJaWYgKHR0eS0+ZmxhZ3MgJiAoMSA8PCBUVFlfSU9fRVJST1IpKQotCQlyZXR1cm4gKC1FSU8pOworCQlyZXR1cm4gLUVJTzsKIAogCWNvbnRyb2wgPSBpbmZvLT5NQ1I7CiAKQEAgLTI5MDQsMTIgKzMwMDMsMTYgQEAKIAkJbXhzZXJfY2hlY2tfbW9kZW1fc3RhdHVzKGluZm8sIHN0YXR1cyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+c2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gKChjb250cm9sICYgVUFSVF9NQ1JfUlRTKSA/IFRJT0NNX1JUUyA6IDApIHwKLQkgICAgKChjb250cm9sICYgVUFSVF9NQ1JfRFRSKSA/IFRJT0NNX0RUUiA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9EQ0QpID8gVElPQ01fQ0FSIDogMCkgfCAoKHN0YXR1cyAmIFVBUlRfTVNSX1JJKSA/IFRJT0NNX1JORyA6IDApIHwgKChzdGF0dXMgJiBVQVJUX01TUl9EU1IpID8gVElPQ01fRFNSIDogMCkgfCAoKHN0YXR1cyAmIFVBUlRfTVNSX0NUUykgPyBUSU9DTV9DVFMgOiAwKTsKKwkJICAgICgoY29udHJvbCAmIFVBUlRfTUNSX0RUUikgPyBUSU9DTV9EVFIgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX0RDRCkgPyBUSU9DTV9DQVIgOiAwKSB8CisJCSAgICAoKHN0YXR1cyAmIFVBUlRfTVNSX1JJKSA/IFRJT0NNX1JORyA6IDApIHwKKwkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfRFNSKSA/IFRJT0NNX0RTUiA6IDApIHwKKwkJICAgICgoc3RhdHVzICYgVUFSVF9NU1JfQ1RTKSA/IFRJT0NNX0NUUyA6IDApOwogfQogCiBzdGF0aWMgaW50IG14c2VyX3Rpb2Ntc2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCiB7Ci0Jc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IChzdHJ1Y3QgbXhzZXJfc3RydWN0ICopIHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IG14c2VyX3N0cnVjdCAqaW5mbyA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCkBAIC0yOTY4LDM4ICszMDcxLDM2IEBACiAJCWh3Y29uZi0+Ym9hcmRfdHlwZSA9IE1YU0VSX0JPQVJEX0NJMTA0SjsKIAkJaHdjb25mLT5wb3J0cyA9IDQ7CiAJfSBlbHNlCi0JCXJldHVybiAoMCk7CisJCXJldHVybiAwOwogCiAJaXJxID0gMDsKIAlpZiAoaHdjb25mLT5wb3J0cyA9PSAyKSB7CiAJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CiAJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CiAJCWlmIChpcnEgIT0gKHJlZ3NbOV0gJiAweEZGMDApKQotCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCQkJcmV0dXJuIE1YU0VSX0VSUl9JUlFfQ09ORkxJVDsKIAl9IGVsc2UgaWYgKGh3Y29uZi0+cG9ydHMgPT0gNCkgewogCQlpcnEgPSByZWdzWzldICYgMHhGMDAwOwogCQlpcnEgPSBpcnEgfCAoaXJxID4+IDQpOwogCQlpcnEgPSBpcnEgfCAoaXJxID4+IDgpOwogCQlpZiAoaXJxICE9IHJlZ3NbOV0pCi0JCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlFfQ09ORkxJVCk7CisJCQlyZXR1cm4gTVhTRVJfRVJSX0lSUV9DT05GTElUOwogCX0gZWxzZSBpZiAoaHdjb25mLT5wb3J0cyA9PSA4KSB7CiAJCWlycSA9IHJlZ3NbOV0gJiAweEYwMDA7CiAJCWlycSA9IGlycSB8IChpcnEgPj4gNCk7CiAJCWlycSA9IGlycSB8IChpcnEgPj4gOCk7CiAJCWlmICgoaXJxICE9IHJlZ3NbOV0pIHx8IChpcnEgIT0gcmVnc1sxMF0pKQotCQkJcmV0dXJuIChNWFNFUl9FUlJfSVJRX0NPTkZMSVQpOworCQkJcmV0dXJuIE1YU0VSX0VSUl9JUlFfQ09ORkxJVDsKIAl9CiAKLQlpZiAoIWlycSkgewotCQlyZXR1cm4gKE1YU0VSX0VSUl9JUlEpOwotCX0KLQlod2NvbmYtPmlycSA9ICgoaW50KSAoaXJxICYgMHhGMDAwKSA+PiAxMik7CisJaWYgKCFpcnEpCisJCXJldHVybiBNWFNFUl9FUlJfSVJROworCWh3Y29uZi0+aXJxID0gKChpbnQpKGlycSAmIDB4RjAwMCkgPj4gMTIpOwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAJCWh3Y29uZi0+aW9hZGRyW2ldID0gKGludCkgcmVnc1tpICsgMV0gJiAweEZGRjg7Ci0JaWYgKChyZWdzWzEyXSAmIDB4ODApID09IDApIHsKLQkJcmV0dXJuIChNWFNFUl9FUlJfVkVDVE9SKTsKLQl9Ci0JaHdjb25mLT52ZWN0b3IgPSAoaW50KSByZWdzWzExXTsJLyogaW50ZXJydXB0IHZlY3RvciAqLworCWlmICgocmVnc1sxMl0gJiAweDgwKSA9PSAwKQorCQlyZXR1cm4gTVhTRVJfRVJSX1ZFQ1RPUjsKKwlod2NvbmYtPnZlY3RvciA9IChpbnQpcmVnc1sxMV07CS8qIGludGVycnVwdCB2ZWN0b3IgKi8KIAlpZiAoaWQgPT0gMSkKIAkJaHdjb25mLT52ZWN0b3JfbWFzayA9IDB4MDBGRjsKIAllbHNlCkBAIC0zMDA3LDEwICszMTA4LDEwIEBACiAJZm9yIChpID0gNywgYml0cyA9IDB4MDEwMDsgaSA+PSAwOyBpLS0sIGJpdHMgPDw9IDEpIHsKIAkJaWYgKHJlZ3NbMTJdICYgYml0cykgewogCQkJaHdjb25mLT5iYXVkX2Jhc2VbaV0gPSA5MjE2MDA7Ci0JCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwkvLyBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyCisJCQlod2NvbmYtPk1heENhblNldEJhdWRSYXRlW2ldID0gOTIxNjAwOwkvKiBhZGQgYnkgVmljdG9yIFl1LiAwOS0wNC0yMDAyICovCiAJCX0gZWxzZSB7CiAJCQlod2NvbmYtPmJhdWRfYmFzZVtpXSA9IDExNTIwMDsKLQkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSAxMTUyMDA7CS8vIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIKKwkJCWh3Y29uZi0+TWF4Q2FuU2V0QmF1ZFJhdGVbaV0gPSAxMTUyMDA7CS8qIGFkZCBieSBWaWN0b3IgWXUuIDA5LTA0LTIwMDIgKi8KIAkJfQogCX0KIAlzY3JhdGNoMiA9IGluYihjYXAgKyBVQVJUX0xDUikgJiAoflVBUlRfTENSX0RMQUIpOwpAQCAtMzAzMCw3ICszMTMxLDcgQEAKIAkJaHdjb25mLT5wb3J0cyA9IDQ7CiAJcmVxdWVzdF9yZWdpb24oaHdjb25mLT5pb2FkZHJbMF0sIDggKiBod2NvbmYtPnBvcnRzLCAibXhzZXIoSU8pIik7CiAJcmVxdWVzdF9yZWdpb24oaHdjb25mLT52ZWN0b3IsIDEsICJteHNlcih2ZWN0b3IpIik7Ci0JcmV0dXJuIChod2NvbmYtPnBvcnRzKTsKKwlyZXR1cm4gaHdjb25mLT5wb3J0czsKIH0KIAogI2RlZmluZSBDSElQX1NLIAkweDAxCS8qIFNlcmlhbCBEYXRhIENsb2NrICBpbiBFcHJvbSAqLwpAQCAtMzA1Myw3ICszMTU0LDcgQEAKIAogCWlkID0gbXhzZXJfcHJvZ3JhbV9tb2RlKHBvcnQpOwogCWlmIChpZCA8IDApCi0JCXJldHVybiAoaWQpOworCQlyZXR1cm4gaWQ7CiAJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKIAkJayA9IChpICYgMHgzRikgfCAweDE4MDsKIAkJZm9yIChqID0gMHgxMDA7IGogPiAwOyBqID4+PSAxKSB7CkBAIC0zMDY2LDcgKzMxNjcsNyBAQAogCQkJCW91dGIoQ0hJUF9DUyB8IENISVBfU0ssIHBvcnQpOwkvKiBBPyBiaXQgb2YgcmVhZCAqLwogCQkJfQogCQl9Ci0JCSh2b2lkKSBpbmIocG9ydCk7CisJCSh2b2lkKWluYihwb3J0KTsKIAkJdmFsdWUgPSAwOwogCQlmb3IgKGsgPSAwLCBqID0gMHg4MDAwOyBrIDwgMTY7IGsrKywgaiA+Pj0gMSkgewogCQkJb3V0YihDSElQX0NTLCBwb3J0KTsKQEAgLTMwNzgsMjggKzMxNzksMzMgQEAKIAkJb3V0YigwLCBwb3J0KTsKIAl9CiAJbXhzZXJfbm9ybWFsX21vZGUocG9ydCk7Ci0JcmV0dXJuIChpZCk7CisJcmV0dXJuIGlkOwogfQogCiBzdGF0aWMgaW50IG14c2VyX3Byb2dyYW1fbW9kZShpbnQgcG9ydCkKIHsKIAlpbnQgaWQsIGksIGosIG47Ci0JLy91bnNpZ25lZCBsb25nIGZsYWdzOworCS8qIHVuc2lnbmVkIGxvbmcgZmxhZ3M7ICovCiAKIAlzcGluX2xvY2soJmdtX2xvY2spOwogCW91dGIoMCwgcG9ydCk7CiAJb3V0YigwLCBwb3J0KTsKIAlvdXRiKDAsIHBvcnQpOwotCSh2b2lkKSBpbmIocG9ydCk7Ci0JKHZvaWQpIGluYihwb3J0KTsKKwkodm9pZClpbmIocG9ydCk7CisJKHZvaWQpaW5iKHBvcnQpOwogCW91dGIoMCwgcG9ydCk7Ci0JKHZvaWQpIGluYihwb3J0KTsKLQkvL3Jlc3RvcmVfZmxhZ3MoZmxhZ3MpOworCSh2b2lkKWluYihwb3J0KTsKKwkvKiByZXN0b3JlX2ZsYWdzKGZsYWdzKTsgKi8KIAlzcGluX3VubG9jaygmZ21fbG9jayk7CiAKIAlpZCA9IGluYihwb3J0ICsgMSkgJiAweDFGOwotCWlmICgoaWQgIT0gQzE2OF9BU0lDX0lEKSAmJiAoaWQgIT0gQzEwNF9BU0lDX0lEKSAmJiAoaWQgIT0gQzEwMl9BU0lDX0lEKSAmJiAoaWQgIT0gQ0kxMzJfQVNJQ19JRCkgJiYgKGlkICE9IENJMTM0X0FTSUNfSUQpICYmIChpZCAhPSBDSTEwNEpfQVNJQ19JRCkpCi0JCXJldHVybiAoLTEpOworCWlmICgoaWQgIT0gQzE2OF9BU0lDX0lEKSAmJgorCQkJKGlkICE9IEMxMDRfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDMTAyX0FTSUNfSUQpICYmCisJCQkoaWQgIT0gQ0kxMzJfQVNJQ19JRCkgJiYKKwkJCShpZCAhPSBDSTEzNF9BU0lDX0lEKSAmJgorCQkJKGlkICE9IENJMTA0Sl9BU0lDX0lEKSkKKwkJcmV0dXJuIC0xOwogCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgNDsgaSsrKSB7CiAJCW4gPSBpbmIocG9ydCArIDIpOwogCQlpZiAobiA9PSAnTScpIHsKQEAgLTMxMTIsNyArMzIxOCw3IEBACiAJfQogCWlmIChqICE9IDIpCiAJCWlkID0gLTI7Ci0JcmV0dXJuIChpZCk7CisJcmV0dXJuIGlkOwogfQogCiBzdGF0aWMgdm9pZCBteHNlcl9ub3JtYWxfbW9kZShpbnQgcG9ydCkKQEAgLTMxMzAsNyArMzIzNiw3IEBACiAJCWlmICgobiAmIDB4NjEpID09IDB4NjApCiAJCQlicmVhazsKIAkJaWYgKChuICYgMSkgPT0gMSkKLQkJCSh2b2lkKSBpbmIocG9ydCk7CisJCQkodm9pZClpbmIocG9ydCk7CiAJfQogCW91dGIoMHgwMCwgcG9ydCArIDQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYyBiL2RyaXZlcnMvY2hhci9uX3IzOTY0LmMKaW5kZXggYzQ4ZGUwOS4uMjAzZGMyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL25fcjM5NjQuYworKysgYi9kcml2ZXJzL2NoYXIvbl9yMzk2NC5jCkBAIC05NTEsNyArOTUxLDggQEAKICAgIHsKIHF1ZXVlX3RoZV9tZXNzYWdlOgogCi0gICAgICBwTXNnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHIzOTY0X21lc3NhZ2UpLCBHRlBfS0VSTkVMKTsKKyAgICAgIHBNc2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcjM5NjRfbWVzc2FnZSksCisJCSAgICAgZXJyb3JfY29kZT9HRlBfQVRPTUlDOkdGUF9LRVJORUwpOwogICAgICAgVFJBQ0VfTSgiYWRkX21zZyAtIGttYWxsb2MgJXAiLHBNc2cpOwogICAgICAgaWYocE1zZz09TlVMTCkgewogICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jIGIvZHJpdmVycy9jaGFyL3BjbWNpYS9zeW5jbGlua19jcy5jCmluZGV4IDA3MjEzNDUuLjE3YmM4YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9wY21jaWEvc3luY2xpbmtfY3MuYworKysgYi9kcml2ZXJzL2NoYXIvcGNtY2lhL3N5bmNsaW5rX2NzLmMKQEAgLTg0NCw3ICs4NDQsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZCBiaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpCitzdGF0aWMgdm9pZCBiaF9oYW5kbGVyKHZvaWQqIENvbnRleHQpCiB7CiAJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8qKUNvbnRleHQ7CiAJaW50IGFjdGlvbjsKQEAgLTg4OCw3ICs4ODgsNyBAQAogCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUpOwogfQogCi12b2lkIGJoX3RyYW5zbWl0KE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgYmhfdHJhbnNtaXQoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IGluZm8tPnR0eTsKIAlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfQkgpCkBAIC05MDAsNyArOTAwLDcgQEAKIAl9CiB9CiAKLXZvaWQgYmhfc3RhdHVzKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgYmhfc3RhdHVzKE1HU0xQQ19JTkZPICppbmZvKQogewogCWluZm8tPnJpX2Noa2NvdW50ID0gMDsKIAlpbmZvLT5kc3JfY2hrY291bnQgPSAwOwpAQCAtMTU4Miw3ICsxNTgyLDcgQEAKIAlpZiAobWdzbHBjX3BhcmFub2lhX2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgIm1nc2xwY19wdXRfY2hhciIpKQogCQlyZXR1cm47CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CkBAIC0xNjQ5LDcgKzE2NDksNyBAQAogCQkJX19GSUxFX18sX19MSU5FX18saW5mby0+ZGV2aWNlX25hbWUsY291bnQpOwogCQogCWlmIChtZ3NscGNfcGFyYW5vaWFfY2hlY2soaW5mbywgdHR5LT5uYW1lLCAibWdzbHBjX3dyaXRlIikgfHwKLQkgICAgIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCQkhaW5mby0+dHhfYnVmKQogCQlnb3RvIGNsZWFudXA7CiAKIAlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKQEAgLTIzMDUsNyArMjMwNSw3IEBACiAJcmV0dXJuIGlvY3RsX2NvbW1vbihpbmZvLCBjbWQsIGFyZyk7CiB9CiAKLWludCBpb2N0bF9jb21tb24oTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCBpb2N0bF9jb21tb24oTUdTTFBDX0lORk8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3QgbWdzbF9pY291bnQgY25vdzsJLyoga2VybmVsIGNvdW50ZXIgdGVtcHMgKi8KQEAgLTI4NzcsNyArMjg3Nyw3IEBACiAJcmV0dXJuICgoY291bnQgPCBiZWdpbitsZW4tb2ZmKSA/IGNvdW50IDogYmVnaW4rbGVuLW9mZik7CiB9CiAKLWludCByeF9hbGxvY19idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIGludCByeF9hbGxvY19idWZmZXJzKE1HU0xQQ19JTkZPICppbmZvKQogewogCS8qIGVhY2ggYnVmZmVyIGhhcyBoZWFkZXIgYW5kIGRhdGEgKi8KIAlpbmZvLT5yeF9idWZfc2l6ZSA9IHNpemVvZihSWEJVRikgKyBpbmZvLT5tYXhfZnJhbWVfc2l6ZTsKQEAgLTI5MDAsMTMgKzI5MDAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByeF9mcmVlX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCitzdGF0aWMgdm9pZCByeF9mcmVlX2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJa2ZyZWUoaW5mby0+cnhfYnVmKTsKIAlpbmZvLT5yeF9idWYgPSBOVUxMOwogfQogCi1pbnQgY2xhaW1fcmVzb3VyY2VzKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIGludCBjbGFpbV9yZXNvdXJjZXMoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJaWYgKHJ4X2FsbG9jX2J1ZmZlcnMoaW5mbykgPCAwICkgewogCQlwcmludGsoICJDYW50IGFsbG9jYXRlIHJ4IGJ1ZmZlciAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOwpAQCAtMjkxNiw3ICsyOTE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWxlYXNlX3Jlc291cmNlcyhNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcmVzb3VyY2VzKE1HU0xQQ19JTkZPICppbmZvKQogewogCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JTkZPKQogCQlwcmludGsoInJlbGVhc2VfcmVzb3VyY2VzKCVzKVxuIiwgaW5mby0+ZGV2aWNlX25hbWUpOwpAQCAtMjkyOCw3ICsyOTI4LDcgQEAKICAqIAkKICAqIEFyZ3VtZW50czoJCWluZm8JcG9pbnRlciB0byBkZXZpY2UgaW5zdGFuY2UgZGF0YQogICovCi12b2lkIG1nc2xwY19hZGRfZGV2aWNlKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgbWdzbHBjX2FkZF9kZXZpY2UoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJaW5mby0+bmV4dF9kZXZpY2UgPSBOVUxMOwogCWluZm8tPmxpbmUgPSBtZ3NscGNfZGV2aWNlX2NvdW50OwpAQCAtMjk2NCw3ICsyOTY0LDcgQEAKICNlbmRpZgogfQogCi12b2lkIG1nc2xwY19yZW1vdmVfZGV2aWNlKE1HU0xQQ19JTkZPICpyZW1vdmVfaW5mbykKK3N0YXRpYyB2b2lkIG1nc2xwY19yZW1vdmVfZGV2aWNlKE1HU0xQQ19JTkZPICpyZW1vdmVfaW5mbykKIHsKIAlNR1NMUENfSU5GTyAqaW5mbyA9IG1nc2xwY19kZXZpY2VfbGlzdDsKIAlNR1NMUENfSU5GTyAqbGFzdCA9IE5VTEw7CkBAIC0zMjU3LDcgKzMyNTcsNyBAQAogCXdyaXRlX3JlZyhpbmZvLCBDSEEgKyBNT0RFLCB2YWwpOwogfQogCi12b2lkIGhkbGNfbW9kZShNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIGhkbGNfbW9kZShNR1NMUENfSU5GTyAqaW5mbykKIHsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIAl1bnNpZ25lZCBjaGFyIGNsa21vZGUsIGNsa3N1Ym1vZGU7CkBAIC0zNDk3LDcgKzM0OTcsNyBAQAogCXJ4X3N0b3AoaW5mbyk7CiB9CiAKLXZvaWQgcnhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIHJ4X3N0b3AoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJaWYgKGRlYnVnX2xldmVsID49IERFQlVHX0xFVkVMX0lTUikKIAkJcHJpbnRrKCIlcyglZCk6cnhfc3RvcCglcylcbiIsCkBAIC0zNTEwLDcgKzM1MTAsNyBAQAogCWluZm8tPnJ4X292ZXJmbG93ID0gMDsKIH0KIAotdm9pZCByeF9zdGFydChNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIHJ4X3N0YXJ0KE1HU0xQQ19JTkZPICppbmZvKQogewogCWlmIChkZWJ1Z19sZXZlbCA+PSBERUJVR19MRVZFTF9JU1IpCiAJCXByaW50aygiJXMoJWQpOnJ4X3N0YXJ0KCVzKVxuIiwKQEAgLTM1MjYsNyArMzUyNiw3IEBACiAJaW5mby0+cnhfZW5hYmxlZCA9IDE7CiB9CiAKLXZvaWQgdHhfc3RhcnQoTUdTTFBDX0lORk8gKmluZm8pCitzdGF0aWMgdm9pZCB0eF9zdGFydChNR1NMUENfSU5GTyAqaW5mbykKIHsKIAlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQogCQlwcmludGsoIiVzKCVkKTp0eF9zdGFydCglcylcbiIsCkBAIC0zNTY0LDcgKzM1NjQsNyBAQAogCQlpbmZvLT50eF9lbmFibGVkID0gMTsKIH0KIAotdm9pZCB0eF9zdG9wKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgdHhfc3RvcChNR1NMUENfSU5GTyAqaW5mbykKIHsKIAlpZiAoZGVidWdfbGV2ZWwgPj0gREVCVUdfTEVWRUxfSVNSKQogCQlwcmludGsoIiVzKCVkKTp0eF9zdG9wKCVzKVxuIiwKQEAgLTM1NzgsNyArMzU3OCw3IEBACiAKIC8qIFJlc2V0IHRoZSBhZGFwdGVyIHRvIGEga25vd24gc3RhdGUgYW5kIHByZXBhcmUgaXQgZm9yIGZ1cnRoZXIgdXNlLgogICovCi12b2lkIHJlc2V0X2RldmljZShNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIHJlc2V0X2RldmljZShNR1NMUENfSU5GTyAqaW5mbykKIHsKIAkvKiBwb3dlciB1cCBib3RoIGNoYW5uZWxzIChzZXQgQklUNykgKi8gCiAJd3JpdGVfcmVnKGluZm8sIENIQSArIENDUjAsIDB4ODApOwpAQCAtMzYyOCw3ICszNjI4LDcgQEAKIAl3cml0ZV9yZWcoaW5mbywgSVBDLCAweDA1KTsKIH0KIAotdm9pZCBhc3luY19tb2RlKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgYXN5bmNfbW9kZShNR1NMUENfSU5GTyAqaW5mbykKIHsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIApAQCAtMzc5OSw3ICszNzk5LDcgQEAKIAogLyogU2V0IHRoZSBIRExDIGlkbGUgbW9kZSBmb3IgdGhlIHRyYW5zbWl0dGVyLgogICovCi12b2lkIHR4X3NldF9pZGxlKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIHZvaWQgdHhfc2V0X2lkbGUoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJLyogTm90ZTogRVNDQzIgb25seSBzdXBwb3J0cyBmbGFncyBhbmQgb25lIGlkbGUgbW9kZXMgKi8gCiAJaWYgKGluZm8tPmlkbGVfbW9kZSA9PSBIRExDX1RYSURMRV9GTEFHUykKQEAgLTM4MTAsNyArMzgxMCw3IEBACiAKIC8qIGdldCBzdGF0ZSBvZiB0aGUgVjI0IHN0YXR1cyAoaW5wdXQpIHNpZ25hbHMuCiAgKi8KLXZvaWQgZ2V0X3NpZ25hbHMoTUdTTFBDX0lORk8gKmluZm8pCitzdGF0aWMgdm9pZCBnZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbykKIHsKIAl1bnNpZ25lZCBjaGFyIHN0YXR1cyA9IDA7CiAJCkBAIC0zODMyLDcgKzM4MzIsNyBAQAogLyogU2V0IHRoZSBzdGF0ZSBvZiBEVFIgYW5kIFJUUyBiYXNlZCBvbiBjb250ZW50cyBvZgogICogc2VyaWFsX3NpZ25hbHMgbWVtYmVyIG9mIGRldmljZSBleHRlbnNpb24uCiAgKi8KLXZvaWQgc2V0X3NpZ25hbHMoTUdTTFBDX0lORk8gKmluZm8pCitzdGF0aWMgdm9pZCBzZXRfc2lnbmFscyhNR1NMUENfSU5GTyAqaW5mbykKIHsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIApAQCAtMzg1Niw3ICszODU2LDcgQEAKIAkJc2V0X3JlZ19iaXRzKGluZm8sIENIQSArIFBWUiwgUFZSX0RUUik7CiB9CiAKLXZvaWQgcnhfcmVzZXRfYnVmZmVycyhNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyB2b2lkIHJ4X3Jlc2V0X2J1ZmZlcnMoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJUlhCVUYgKmJ1ZjsKIAlpbnQgaTsKQEAgLTM4NzUsNyArMzg3NSw3IEBACiAgKgogICogUmV0dXJucyAxIGlmIGZyYW1lIHJldHVybmVkLCBvdGhlcndpc2UgMAogICovCi1pbnQgcnhfZ2V0X2ZyYW1lKE1HU0xQQ19JTkZPICppbmZvKQorc3RhdGljIGludCByeF9nZXRfZnJhbWUoTUdTTFBDX0lORk8gKmluZm8pCiB7CiAJdW5zaWduZWQgc2hvcnQgc3RhdHVzOwogCVJYQlVGICpidWY7CkBAIC0zOTYxLDcgKzM5NjEsNyBAQAogCXJldHVybiAxOwogfQogCi1CT09MRUFOIHJlZ2lzdGVyX3Rlc3QoTUdTTFBDX0lORk8gKmluZm8pCitzdGF0aWMgQk9PTEVBTiByZWdpc3Rlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQogewogCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhdHRlcm5zW10gPSAKIAkgICAgeyAweDAwLCAweGZmLCAweGFhLCAweDU1LCAweDY5LCAweDk2LCAweDBmIH07CkBAIC0zOTg3LDcgKzM5ODcsNyBAQAogCXJldHVybiByYzsKIH0KIAotQk9PTEVBTiBpcnFfdGVzdChNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyBCT09MRUFOIGlycV90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQogewogCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQwMjIsNyArNDAyMiw3IEBACiAJcmV0dXJuIGluZm8tPmlycV9vY2N1cnJlZCA/IFRSVUUgOiBGQUxTRTsKIH0KIAotaW50IGFkYXB0ZXJfdGVzdChNR1NMUENfSU5GTyAqaW5mbykKK3N0YXRpYyBpbnQgYWRhcHRlcl90ZXN0KE1HU0xQQ19JTkZPICppbmZvKQogewogCWlmICghcmVnaXN0ZXJfdGVzdChpbmZvKSkgewogCQlpbmZvLT5pbml0X2Vycm9yID0gRGlhZ1N0YXR1c19BZGRyZXNzRmFpbHVyZTsKQEAgLTQwNDQsNyArNDA0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdHJhY2VfYmxvY2soTUdTTFBDX0lORk8gKmluZm8sY29uc3QgY2hhciogZGF0YSwgaW50IGNvdW50LCBpbnQgeG1pdCkKK3N0YXRpYyB2b2lkIHRyYWNlX2Jsb2NrKE1HU0xQQ19JTkZPICppbmZvLGNvbnN0IGNoYXIqIGRhdGEsIGludCBjb3VudCwgaW50IHhtaXQpCiB7CiAJaW50IGk7CiAJaW50IGxpbmVjb3VudDsKQEAgLTQwNzksNyArNDA3OSw3IEBACiAvKiBIRExDIGZyYW1lIHRpbWUgb3V0CiAgKiB1cGRhdGUgc3RhdHMgYW5kIGRvIHR4IGNvbXBsZXRpb24gcHJvY2Vzc2luZwogICovCi12b2lkIHR4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBjb250ZXh0KQorc3RhdGljIHZvaWQgdHhfdGltZW91dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJTUdTTFBDX0lORk8gKmluZm8gPSAoTUdTTFBDX0lORk8qKWNvbnRleHQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9yb2NrZXQuYyBiL2RyaXZlcnMvY2hhci9yb2NrZXQuYwppbmRleCA3ZWRjNmE0Li4wNzA4YzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcm9ja2V0LmMKKysrIGIvZHJpdmVycy9jaGFyL3JvY2tldC5jCkBAIC0zMjQsMzUgKzMyNCwxNSBAQAogCQkJICBDSEFOTkVMX3QgKiBjcCwgdW5zaWduZWQgaW50IENoYW5TdGF0dXMpCiB7CiAJdW5zaWduZWQgaW50IENoYXJOU3RhdDsKLQlpbnQgVG9SZWN2LCB3UmVjdiwgc3BhY2UgPSAwLCBjb3VudDsKLQl1bnNpZ25lZCBjaGFyICpjYnVmLCAqY2hlYWQ7Ci0JY2hhciAqZmJ1ZiwgKmZoZWFkOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOwotCi0JbGQgPSB0dHlfbGRpc2NfcmVmKHR0eSk7CisJaW50IFRvUmVjdiwgd1JlY3YsIHNwYWNlOworCXVuc2lnbmVkIGNoYXIgKmNidWY7CiAKIAlUb1JlY3YgPSBzR2V0UnhDbnQoY3ApOwotCXNwYWNlID0gdHR5LT5yZWNlaXZlX3Jvb207Ci0JaWYgKHNwYWNlID4gMiAqIFRUWV9GTElQQlVGX1NJWkUpCi0JCXNwYWNlID0gMiAqIFRUWV9GTElQQlVGX1NJWkU7Ci0JY291bnQgPSAwOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19JTlRSCi0JcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCwgJWQpLi4uIiwgVG9SZWN2LCBzcGFjZSk7CisJcHJpbnRrKEtFUk5fSU5GTyAicnBfZG9fcmVjZWl2ZSglZCkuLi4iLCBUb1JlY3YpOwogI2VuZGlmCi0KLQkvKgotCSAqIGRldGVybWluZSBob3cgbWFueSB3ZSBjYW4gYWN0dWFsbHkgcmVhZCBpbi4gIElmIHdlIGNhbid0Ci0JICogcmVhZCBhbnkgaW4gdGhlbiB3ZSBoYXZlIGEgc29mdHdhcmUgb3ZlcnJ1biBjb25kaXRpb24uCi0JICovCi0JaWYgKFRvUmVjdiA+IHNwYWNlKQotCQlUb1JlY3YgPSBzcGFjZTsKLQotCVRvUmVjdiA9IHR0eV9wcmVwYXJlX2ZsaXBfc3RyaW5nX2ZsYWdzKHR0eSwgJmNoZWFkLCAmZmhlYWQsIFRvUmVjdik7Ci0JaWYgKFRvUmVjdiA8PSAwKQotCQlnb3RvIGRvbmU7Ci0KLQljYnVmID0gY2hlYWQ7Ci0JZmJ1ZiA9IGZoZWFkOworCWlmIChUb1JlY3YgPT0gMCkKKwkJcmV0dXJuOwogCiAJLyoKIAkgKiBpZiBzdGF0dXMgaW5kaWNhdGVzIHRoZXJlIGFyZSBlcnJvcmVkIGNoYXJhY3RlcnMgaW4gdGhlCkBAIC0zODAsNiArMzYwLDggQEAKIAkJICAgICAgIGluZm8tPnJlYWRfc3RhdHVzX21hc2spOwogI2VuZGlmCiAJCXdoaWxlIChUb1JlY3YpIHsKKwkJCWNoYXIgZmxhZzsKKwogCQkJQ2hhck5TdGF0ID0gc0luVyhzR2V0VHhSeERhdGFJTyhjcCkpOwogI2lmZGVmIFJPQ0tFVF9ERUJVR19SRUNFSVZFCiAJCQlwcmludGsoS0VSTl9JTkZPICIleC4uLiIsIENoYXJOU3RhdCk7CkBAIC0zOTIsMTcgKzM3NCwxNiBAQAogCQkJfQogCQkJQ2hhck5TdGF0ICY9IGluZm8tPnJlYWRfc3RhdHVzX21hc2s7CiAJCQlpZiAoQ2hhck5TdGF0ICYgU1RNQlJFQUtIKQotCQkJCSpmYnVmKysgPSBUVFlfQlJFQUs7CisJCQkJZmxhZyA9IFRUWV9CUkVBSzsKIAkJCWVsc2UgaWYgKENoYXJOU3RhdCAmIFNUTVBBUklUWUgpCi0JCQkJKmZidWYrKyA9IFRUWV9QQVJJVFk7CisJCQkJZmxhZyA9IFRUWV9QQVJJVFk7CiAJCQllbHNlIGlmIChDaGFyTlN0YXQgJiBTVE1GUkFNRUgpCi0JCQkJKmZidWYrKyA9IFRUWV9GUkFNRTsKKwkJCQlmbGFnID0gVFRZX0ZSQU1FOwogCQkJZWxzZSBpZiAoQ2hhck5TdGF0ICYgU1RNUkNWUk9WUkgpCi0JCQkJKmZidWYrKyA9IFRUWV9PVkVSUlVOOworCQkJCWZsYWcgPSBUVFlfT1ZFUlJVTjsKIAkJCWVsc2UKLQkJCQkqZmJ1ZisrID0gVFRZX05PUk1BTDsKLQkJCSpjYnVmKysgPSBDaGFyTlN0YXQgJiAweGZmOwotCQkJY291bnQrKzsKKwkJCQlmbGFnID0gVFRZX05PUk1BTDsKKwkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgQ2hhck5TdGF0ICYgMHhmZiwgZmxhZyk7CiAJCQlUb1JlY3YtLTsKIAkJfQogCkBAIC00MjIsMjAgKzQwMywyMyBAQAogCQkgKiBjaGFyYWN0ZXJzIGF0IHRpbWUgYnkgZG9pbmcgcmVwZWF0ZWQgd29yZCBJTwogCQkgKiB0cmFuc2Zlci4KIAkJICovCisJCXNwYWNlID0gdHR5X3ByZXBhcmVfZmxpcF9zdHJpbmcodHR5LCAmY2J1ZiwgVG9SZWN2KTsKKwkJaWYgKHNwYWNlIDwgVG9SZWN2KSB7CisjaWZkZWYgUk9DS0VUX0RFQlVHX1JFQ0VJVkUKKwkJCXByaW50ayhLRVJOX0lORk8gInJwX2RvX3JlY2VpdmU6aW5zdWZmaWNpZW50IHNwYWNlIFRvUmVjdj0lZCBzcGFjZT0lZFxuIiwgVG9SZWN2LCBzcGFjZSk7CisjZW5kaWYKKwkJCWlmIChzcGFjZSA8PSAwKQorCQkJCXJldHVybjsKKwkJCVRvUmVjdiA9IHNwYWNlOworCQl9CiAJCXdSZWN2ID0gVG9SZWN2ID4+IDE7CiAJCWlmICh3UmVjdikKIAkJCXNJblN0clcoc0dldFR4UnhEYXRhSU8oY3ApLCAodW5zaWduZWQgc2hvcnQgKikgY2J1Ziwgd1JlY3YpOwogCQlpZiAoVG9SZWN2ICYgMSkKIAkJCWNidWZbVG9SZWN2IC0gMV0gPSBzSW5CKHNHZXRUeFJ4RGF0YUlPKGNwKSk7Ci0JCW1lbXNldChmYnVmLCBUVFlfTk9STUFMLCBUb1JlY3YpOwotCQljYnVmICs9IFRvUmVjdjsKLQkJZmJ1ZiArPSBUb1JlY3Y7Ci0JCWNvdW50ICs9IFRvUmVjdjsKIAl9CiAJLyogIFB1c2ggdGhlIGRhdGEgdXAgdG8gdGhlIHR0eSBsYXllciAqLwotCWxkLT5yZWNlaXZlX2J1Zih0dHksIGNoZWFkLCBmaGVhZCwgY291bnQpOwotZG9uZToKLQl0dHlfbGRpc2NfZGVyZWYobGQpOworCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcnRjLmMgYi9kcml2ZXJzL2NoYXIvcnRjLmMKaW5kZXggZjY2ODZmYy4uMDg5N2IwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3J0Yy5jCisrKyBiL2RyaXZlcnMvY2hhci9ydGMuYwpAQCAtOTI4LDcgKzkyOCw3IEBACiAjaWZkZWYgX19zcGFyY19fCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYoc3RyY21wKGVkZXYtPnByb21fbmFtZSwgInJ0YyIpID09IDApIHsKKwkJCWlmKHN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJydGMiKSA9PSAwKSB7CiAJCQkJcnRjX3BvcnQgPSBlZGV2LT5yZXNvdXJjZVswXS5zdGFydDsKIAkJCQlydGNfaXJxID0gZWRldi0+aXJxc1swXTsKIAkJCQlnb3RvIGZvdW5kOwpAQCAtOTM4LDcgKzkzOCw3IEBACiAjaWZkZWYgX19zcGFyY192OV9fCiAJZm9yX2VhY2hfaXNhKGlzYV9icikgewogCQlmb3JfZWFjaF9pc2FkZXYoaXNhX2RldiwgaXNhX2JyKSB7Ci0JCQlpZiAoc3RyY21wKGlzYV9kZXYtPnByb21fbmFtZSwgInJ0YyIpID09IDApIHsKKwkJCWlmIChzdHJjbXAoaXNhX2Rldi0+cHJvbV9ub2RlLT5uYW1lLCAicnRjIikgPT0gMCkgewogCQkJCXJ0Y19wb3J0ID0gaXNhX2Rldi0+cmVzb3VyY2Uuc3RhcnQ7CiAJCQkJcnRjX2lycSA9IGlzYV9kZXYtPmlycTsKIAkJCQlnb3RvIGZvdW5kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3NvbnlwaS5jIGIvZHJpdmVycy9jaGFyL3NvbnlwaS5jCmluZGV4IGE5MGY1ZDkuLjQzZGZkODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zb255cGkuYworKysgYi9kcml2ZXJzL2NoYXIvc29ueXBpLmMKQEAgLTUxMiw3ICs1MTIsNyBAQAogCiAjaWZkZWYgQ09ORklHX0FDUEkKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNvbnlwaV9hY3BpX2RldmljZTsKLXN0YXRpYyBpbnQgYWNwaV9lbmFibGVkOworc3RhdGljIGludCBhY3BpX2RyaXZlcl9yZWdpc3RlcmVkOwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgc29ueXBpX2VjX3dyaXRlKHU4IGFkZHIsIHU4IHZhbHVlKQpAQCAtODY5LDcgKzg2OSw3IEBACiAJCXNvbnlwaV9yZXBvcnRfaW5wdXRfZXZlbnQoZXZlbnQpOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKLQlpZiAoYWNwaV9lbmFibGVkKQorCWlmIChzb255cGlfYWNwaV9kZXZpY2UpCiAJCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KHNvbnlwaV9hY3BpX2RldmljZSwgMSwgZXZlbnQpOwogI2VuZGlmCiAKQEAgLTE1NTEsOCArMTU1MSw4IEBACiAJCWdvdG8gZXJyX2ZyZWVfZGV2aWNlOwogCiAjaWZkZWYgQ09ORklHX0FDUEkKLQlpZiAoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255cGlfYWNwaV9kcml2ZXIpID4gMCkKLQkJYWNwaV9lbmFibGVkID0gMTsKKwlpZiAoYWNwaV9idXNfcmVnaXN0ZXJfZHJpdmVyKCZzb255cGlfYWNwaV9kcml2ZXIpID49IDApCisJCWFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQgPSAxOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKQEAgLTE1NjcsNyArMTU2Nyw3IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgc29ueXBpX2V4aXQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfQUNQSQotCWlmIChhY3BpX2VuYWJsZWQpCisJaWYgKGFjcGlfZHJpdmVyX3JlZ2lzdGVyZWQpCiAJCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZzb255cGlfYWNwaV9kcml2ZXIpOwogI2VuZGlmCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc29ueXBpX3BsYXRmb3JtX2RldmljZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMgYi9kcml2ZXJzL2NoYXIvc3BlY2lhbGl4LmMKaW5kZXggNTM0M2U5Zi4uMWI1MzMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3NwZWNpYWxpeC5jCisrKyBiL2RyaXZlcnMvY2hhci9zcGVjaWFsaXguYwpAQCAtMTY4Myw3ICsxNjgzLDcgQEAKIAogCWJwID0gcG9ydF9Cb2FyZChwb3J0KTsKIAotCWlmICghdHR5IHx8ICFwb3J0LT54bWl0X2J1ZiB8fCAhdG1wX2J1ZikgeworCWlmICghcG9ydC0+eG1pdF9idWYgfHwgIXRtcF9idWYpIHsKIAkJZnVuY19leGl0KCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTE3MzMsNyArMTczMyw3IEBACiAJCXJldHVybjsKIAl9CiAJZHByaW50ayAoU1hfREVCVUdfVFgsICJjaGVjayB0dHk6ICVwICVwXG4iLCB0dHksIHBvcnQtPnhtaXRfYnVmKTsKLQlpZiAoIXR0eSB8fCAhcG9ydC0+eG1pdF9idWYpIHsKKwlpZiAoIXBvcnQtPnhtaXRfYnVmKSB7CiAJCWZ1bmNfZXhpdCgpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5bmNsaW5rX2d0LmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwppbmRleCBiNGQxZjRlLi40ZTM1ZDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYworKysgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmtfZ3QuYwpAQCAtMTAxLDYgKzEwMSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfdGFibGVbXSA9IHsKIAl7UENJX1ZFTkRPUl9JRF9NSUNST0dBVEUsIFNZTkNMSU5LX0dUX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAorCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfR1QyX0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfR1Q0X0RFVklDRV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCx9LAogCXtQQ0lfVkVORE9SX0lEX01JQ1JPR0FURSwgU1lOQ0xJTktfQUNfREVWSUNFX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELH0sCiAJezAsfSwgLyogdGVybWluYXRlIGxpc3QgKi8KQEAgLTg3MCw3ICs4NzEsNyBAQAogCQlnb3RvIGNsZWFudXA7CiAJREJHSU5GTygoIiVzIHdyaXRlIGNvdW50PSVkXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY291bnQpKTsKIAotCWlmICghdHR5IHx8ICFpbmZvLT50eF9idWYpCisJaWYgKCFpbmZvLT50eF9idWYpCiAJCWdvdG8gY2xlYW51cDsKIAogCWlmIChjb3VudCA+IGluZm8tPm1heF9mcmFtZV9zaXplKSB7CkBAIC05MjQsNyArOTI1LDcgQEAKIAlpZiAoc2FuaXR5X2NoZWNrKGluZm8sIHR0eS0+bmFtZSwgInB1dF9jaGFyIikpCiAJCXJldHVybjsKIAlEQkdJTkZPKCgiJXMgcHV0X2NoYXIoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgY2gpKTsKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogCWlmICghaW5mby0+dHhfYWN0aXZlICYmIChpbmZvLT50eF9jb3VudCA8IGluZm8tPm1heF9mcmFtZV9zaXplKSkKQEAgLTI1MTUsNyArMjUxNiw4IEBACiAJREJHSU5GTygoIiVzIHNldF90eGlkbGUoJWQpXG4iLCBpbmZvLT5kZXZpY2VfbmFtZSwgaWRsZV9tb2RlKSk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssZmxhZ3MpOwogCWluZm8tPmlkbGVfbW9kZSA9IGlkbGVfbW9kZTsKLQl0eF9zZXRfaWRsZShpbmZvKTsKKwlpZiAoaW5mby0+cGFyYW1zLm1vZGUgIT0gTUdTTF9NT0RFX0FTWU5DKQorCQl0eF9zZXRfaWRsZShpbmZvKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5sb2NrLGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMwNzYsNyArMzA3OCw3IEBACiAKIHN0YXRpYyBpbnQgYWxsb2NfdG1wX3JidWYoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKIHsKLQlpbmZvLT50bXBfcmJ1ZiA9IGttYWxsb2MoaW5mby0+bWF4X2ZyYW1lX3NpemUsIEdGUF9LRVJORUwpOworCWluZm8tPnRtcF9yYnVmID0ga21hbGxvYyhpbmZvLT5tYXhfZnJhbWVfc2l6ZSArIDUsIEdGUF9LRVJORUwpOwogCWlmIChpbmZvLT50bXBfcmJ1ZiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlyZXR1cm4gMDsKQEAgLTMyNzYsNiArMzI3OCw5IEBACiAJY2FzZSBTWU5DTElOS19HVF9ERVZJQ0VfSUQ6CiAJCWRldnN0ciA9ICJHVCI7CiAJCWJyZWFrOworCWNhc2UgU1lOQ0xJTktfR1QyX0RFVklDRV9JRDoKKwkJZGV2c3RyID0gIkdUMiI7CisJCWJyZWFrOwogCWNhc2UgU1lOQ0xJTktfR1Q0X0RFVklDRV9JRDoKIAkJZGV2c3RyID0gIkdUNCI7CiAJCWJyZWFrOwpAQCAtMzM1Myw3ICszMzU4LDkgQEAKIAlpbnQgaTsKIAlpbnQgcG9ydF9jb3VudCA9IDE7CiAKLQlpZiAocGRldi0+ZGV2aWNlID09IFNZTkNMSU5LX0dUNF9ERVZJQ0VfSUQpCisJaWYgKHBkZXYtPmRldmljZSA9PSBTWU5DTElOS19HVDJfREVWSUNFX0lEKQorCQlwb3J0X2NvdW50ID0gMjsKKwllbHNlIGlmIChwZGV2LT5kZXZpY2UgPT0gU1lOQ0xJTktfR1Q0X0RFVklDRV9JRCkKIAkJcG9ydF9jb3VudCA9IDQ7CiAKIAkvKiBhbGxvY2F0ZSBkZXZpY2UgaW5zdGFuY2VzIGZvciBhbGwgcG9ydHMgKi8KQEAgLTM5NDAsOCArMzk0Nyw2IEBACiAKIAltc2Nfc2V0X3ZjcihpbmZvKTsKIAotCXR4X3NldF9pZGxlKGluZm8pOwotCiAJLyogU0NSIChzZXJpYWwgY29udHJvbCkKIAkgKgogCSAqIDE1ICAxPXR4IHJlcSBvbiBGSUZPIGhhbGYgZW1wdHkKQEAgLTQwMTIsNyArNDAxNyw3IEBACiAJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogdmFsIHw9IEJJVDEyICsgQklUMTEgKyBCSVQxMDsgYnJlYWs7CiAJfQogCi0Jc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUpCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKQogCXsKIAljYXNlIEhETENfQ1JDXzE2X0NDSVRUOiB2YWwgfD0gQklUOTsgYnJlYWs7CiAJY2FzZSBIRExDX0NSQ18zMl9DQ0lUVDogdmFsIHw9IEJJVDkgKyBCSVQ4OyBicmVhazsKQEAgLTQwNzMsNyArNDA3OCw3IEBACiAJY2FzZSBIRExDX0VOQ09ESU5HX0RJRkZfQklQSEFTRV9MRVZFTDogdmFsIHw9IEJJVDEyICsgQklUMTEgKyBCSVQxMDsgYnJlYWs7CiAJfQogCi0Jc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUpCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKQogCXsKIAljYXNlIEhETENfQ1JDXzE2X0NDSVRUOiB2YWwgfD0gQklUOTsgYnJlYWs7CiAJY2FzZSBIRExDX0NSQ18zMl9DQ0lUVDogdmFsIHw9IEJJVDkgKyBCSVQ4OyBicmVhazsKQEAgLTQxNzUsMTcgKzQxODAsMzggQEAKICAqLwogc3RhdGljIHZvaWQgdHhfc2V0X2lkbGUoc3RydWN0IHNsZ3RfaW5mbyAqaW5mbykKIHsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDB4ZmY7CisJdW5zaWduZWQgY2hhciB2YWw7CisJdW5zaWduZWQgc2hvcnQgdGNyOwogCi0Jc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkKLQl7Ci0JY2FzZSBIRExDX1RYSURMRV9GTEFHUzogICAgICAgICAgdmFsID0gMHg3ZTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzogdmFsID0gMHhhYTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9aRVJPUzogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9PTkVTOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRTogdmFsID0gMHhhYTsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9TUEFDRTogICAgICAgICAgdmFsID0gMHgwMDsgYnJlYWs7Ci0JY2FzZSBIRExDX1RYSURMRV9NQVJLOiAgICAgICAgICAgdmFsID0gMHhmZjsgYnJlYWs7CisJLyogaWYgcHJlYW1ibGUgZW5hYmxlZCAodGNyWzZdID09IDEpIHRoZW4gdHggaWRsZSBzaXplID0gOCBiaXRzCisJICogZWxzZSB0Y3JbNTo0XSA9IHR4IGlkbGUgc2l6ZTogMDAgPSA4IGJpdHMsIDAxID0gMTYgYml0cworCSAqLworCXRjciA9IHJkX3JlZzE2KGluZm8sIFRDUik7CisJaWYgKGluZm8tPmlkbGVfbW9kZSAmIEhETENfVFhJRExFX0NVU1RPTV8xNikgeworCQkvKiBkaXNhYmxlIHByZWFtYmxlLCBzZXQgaWRsZSBzaXplIHRvIDE2IGJpdHMgKi8KKwkJdGNyID0gKHRjciAmIH4oQklUNiArIEJJVDUpKSB8IEJJVDQ7CisJCS8qIE1TQiBvZiAxNiBiaXQgaWRsZSBzcGVjaWZpZWQgaW4gdHggcHJlYW1ibGUgcmVnaXN0ZXIgKFRQUikgKi8KKwkJd3JfcmVnOChpbmZvLCBUUFIsICh1bnNpZ25lZCBjaGFyKSgoaW5mby0+aWRsZV9tb2RlID4+IDgpICYgMHhmZikpOworCX0gZWxzZSBpZiAoISh0Y3IgJiBCSVQ2KSkgeworCQkvKiBwcmVhbWJsZSBpcyBkaXNhYmxlZCwgc2V0IGlkbGUgc2l6ZSB0byA4IGJpdHMgKi8KKwkJdGNyICY9IH4oQklUNSArIEJJVDQpOworCX0KKwl3cl9yZWcxNihpbmZvLCBUQ1IsIHRjcik7CisKKwlpZiAoaW5mby0+aWRsZV9tb2RlICYgKEhETENfVFhJRExFX0NVU1RPTV84IHwgSERMQ19UWElETEVfQ1VTVE9NXzE2KSkgeworCQkvKiBMU0Igb2YgY3VzdG9tIHR4IGlkbGUgc3BlY2lmaWVkIGluIHR4IGlkbGUgcmVnaXN0ZXIgKi8KKwkJdmFsID0gKHVuc2lnbmVkIGNoYXIpKGluZm8tPmlkbGVfbW9kZSAmIDB4ZmYpOworCX0gZWxzZSB7CisJCS8qIHN0YW5kYXJkIDggYml0IGlkbGUgcGF0dGVybnMgKi8KKwkJc3dpdGNoKGluZm8tPmlkbGVfbW9kZSkKKwkJeworCQljYXNlIEhETENfVFhJRExFX0ZMQUdTOiAgICAgICAgICB2YWwgPSAweDdlOyBicmVhazsKKwkJY2FzZSBIRExDX1RYSURMRV9BTFRfWkVST1NfT05FUzoKKwkJY2FzZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRTogdmFsID0gMHhhYTsgYnJlYWs7CisJCWNhc2UgSERMQ19UWElETEVfWkVST1M6CisJCWNhc2UgSERMQ19UWElETEVfU1BBQ0U6ICAgICAgICAgIHZhbCA9IDB4MDA7IGJyZWFrOworCQlkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSAweGZmOworCQl9CiAJfQogCiAJd3JfcmVnOChpbmZvLCBUSVIsIHZhbCk7CkBAIC00MzEzLDYgKzQzMzksMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBpbmZvLT50dHk7CiAJdW5zaWduZWQgY2hhciBhZGRyX2ZpZWxkID0gMHhmZjsKKwl1bnNpZ25lZCBpbnQgY3JjX3NpemUgPSAwOworCisJc3dpdGNoIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19NQVNLKSB7CisJY2FzZSBIRExDX0NSQ18xNl9DQ0lUVDogY3JjX3NpemUgPSAyOyBicmVhazsKKwljYXNlIEhETENfQ1JDXzMyX0NDSVRUOiBjcmNfc2l6ZSA9IDQ7IGJyZWFrOworCX0KIAogY2hlY2tfYWdhaW46CiAKQEAgLTQzNTcsNyArNDM4OSw3IEBACiAJc3RhdHVzID0gZGVzY19zdGF0dXMoaW5mby0+cmJ1ZnNbZW5kXSk7CiAKIAkvKiBpZ25vcmUgQ1JDIGJpdCBpZiBub3QgdXNpbmcgQ1JDIChiaXQgaXMgdW5kZWZpbmVkKSAqLwotCWlmIChpbmZvLT5wYXJhbXMuY3JjX3R5cGUgPT0gSERMQ19DUkNfTk9ORSkKKwlpZiAoKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX01BU0spID09IEhETENfQ1JDX05PTkUpCiAJCXN0YXR1cyAmPSB+QklUMTsKIAogCWlmIChmcmFtZXNpemUgPT0gMCB8fApAQCAtNDM2NiwzNCArNDM5OCwzNCBAQAogCQlnb3RvIGNoZWNrX2FnYWluOwogCX0KIAotCWlmIChmcmFtZXNpemUgPCAyIHx8IHN0YXR1cyAmIChCSVQxK0JJVDApKSB7Ci0JCWlmIChmcmFtZXNpemUgPCAyIHx8IChzdGF0dXMgJiBCSVQwKSkKLQkJCWluZm8tPmljb3VudC5yeHNob3J0Kys7Ci0JCWVsc2UKLQkJCWluZm8tPmljb3VudC5yeGNyYysrOworCWlmIChmcmFtZXNpemUgPCAoMiArIGNyY19zaXplKSB8fCBzdGF0dXMgJiBCSVQwKSB7CisJCWluZm8tPmljb3VudC5yeHNob3J0Kys7CiAJCWZyYW1lc2l6ZSA9IDA7CisJfSBlbHNlIGlmIChzdGF0dXMgJiBCSVQxKSB7CisJCWluZm8tPmljb3VudC5yeGNyYysrOworCQlpZiAoIShpbmZvLT5wYXJhbXMuY3JjX3R5cGUgJiBIRExDX0NSQ19SRVRVUk5fRVgpKQorCQkJZnJhbWVzaXplID0gMDsKKwl9CiAKICNpZmRlZiBDT05GSUdfSERMQwotCQl7Ci0JCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7Ci0JCQlzdGF0cy0+cnhfZXJyb3JzKys7Ci0JCQlzdGF0cy0+cnhfZnJhbWVfZXJyb3JzKys7Ci0JCX0KLSNlbmRpZgotCX0gZWxzZSB7Ci0JCS8qIGFkanVzdCBmcmFtZSBzaXplIGZvciBDUkMsIGlmIGFueSAqLwotCQlpZiAoaW5mby0+cGFyYW1zLmNyY190eXBlID09IEhETENfQ1JDXzE2X0NDSVRUKQotCQkJZnJhbWVzaXplIC09IDI7Ci0JCWVsc2UgaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSA9PSBIRExDX0NSQ18zMl9DQ0lUVCkKLQkJCWZyYW1lc2l6ZSAtPSA0OworCWlmIChmcmFtZXNpemUgPT0gMCkgeworCQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSBoZGxjX3N0YXRzKGluZm8tPm5ldGRldik7CisJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycysrOwogCX0KKyNlbmRpZgogCiAJREJHQkgoKCIlcyByeCBmcmFtZSBzdGF0dXM9JTA0WCBzaXplPSVkXG4iLAogCQlpbmZvLT5kZXZpY2VfbmFtZSwgc3RhdHVzLCBmcmFtZXNpemUpKTsKIAlEQkdEQVRBKGluZm8sIGluZm8tPnJidWZzW3N0YXJ0XS5idWYsIG1pbl90KGludCwgZnJhbWVzaXplLCBETUFCVUZTSVpFKSwgInJ4Iik7CiAKIAlpZiAoZnJhbWVzaXplKSB7Ci0JCWlmIChmcmFtZXNpemUgPiBpbmZvLT5tYXhfZnJhbWVfc2l6ZSkKKwkJaWYgKCEoaW5mby0+cGFyYW1zLmNyY190eXBlICYgSERMQ19DUkNfUkVUVVJOX0VYKSkgeworCQkJZnJhbWVzaXplIC09IGNyY19zaXplOworCQkJY3JjX3NpemUgPSAwOworCQl9CisKKwkJaWYgKGZyYW1lc2l6ZSA+IGluZm8tPm1heF9mcmFtZV9zaXplICsgY3JjX3NpemUpCiAJCQlpbmZvLT5pY291bnQucnhsb25nKys7CiAJCWVsc2UgewogCQkJLyogY29weSBkbWEgYnVmZmVyKHMpIHRvIGNvbnRpZ3VvdXMgdGVtcCBidWZmZXIgKi8KQEAgLTQ0MTMsNiArNDQ0NSwxMSBAQAogCQkJCQlpID0gMDsKIAkJCX0KIAorCQkJaWYgKGluZm8tPnBhcmFtcy5jcmNfdHlwZSAmIEhETENfQ1JDX1JFVFVSTl9FWCkgeworCQkJCSpwID0gKHN0YXR1cyAmIEJJVDEpID8gUlhfQ1JDX0VSUk9SIDogUlhfT0s7CisJCQkJZnJhbWVzaXplKys7CisJCQl9CisKICNpZmRlZiBDT05GSUdfSERMQwogCQkJaWYgKGluZm8tPm5ldGNvdW50KQogCQkJCWhkbGNkZXZfcngoaW5mbyxpbmZvLT50bXBfcmJ1ZiwgZnJhbWVzaXplKTsKQEAgLTQ2NzEsMTMgKzQ3MDgsMTMgQEAKIHN0YXRpYyBpbnQgYWRhcHRlcl90ZXN0KHN0cnVjdCBzbGd0X2luZm8gKmluZm8pCiB7CiAJREJHSU5GTygoInRlc3RpbmcgJXNcbiIsIGluZm8tPmRldmljZV9uYW1lKSk7Ci0JaWYgKChpbmZvLT5pbml0X2Vycm9yID0gcmVnaXN0ZXJfdGVzdChpbmZvKSkgPCAwKSB7CisJaWYgKHJlZ2lzdGVyX3Rlc3QoaW5mbykgPCAwKSB7CiAJCXByaW50aygicmVnaXN0ZXIgdGVzdCBmYWlsdXJlICVzIGFkZHI9JTA4WFxuIiwKIAkJCWluZm8tPmRldmljZV9uYW1lLCBpbmZvLT5waHlzX3JlZ19hZGRyKTsKLQl9IGVsc2UgaWYgKChpbmZvLT5pbml0X2Vycm9yID0gaXJxX3Rlc3QoaW5mbykpIDwgMCkgeworCX0gZWxzZSBpZiAoaXJxX3Rlc3QoaW5mbykgPCAwKSB7CiAJCXByaW50aygiSVJRIHRlc3QgZmFpbHVyZSAlcyBJUlE9JWRcbiIsCiAJCQlpbmZvLT5kZXZpY2VfbmFtZSwgaW5mby0+aXJxX2xldmVsKTsKLQl9IGVsc2UgaWYgKChpbmZvLT5pbml0X2Vycm9yID0gbG9vcGJhY2tfdGVzdChpbmZvKSkgPCAwKSB7CisJfSBlbHNlIGlmIChsb29wYmFja190ZXN0KGluZm8pIDwgMCkgewogCQlwcmludGsoImxvb3BiYWNrIHRlc3QgZmFpbHVyZSAlc1xuIiwgaW5mby0+ZGV2aWNlX25hbWUpOwogCX0KIAlyZXR1cm4gaW5mby0+aW5pdF9lcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMgYi9kcml2ZXJzL2NoYXIvc3luY2xpbmttcC5jCmluZGV4IDg1ODc0MDEuLjIxYmYxNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeW5jbGlua21wLmMKKysrIGIvZHJpdmVycy9jaGFyL3N5bmNsaW5rbXAuYwpAQCAtOTg4LDcgKzk4OCw3IEBACiAJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJ3cml0ZSIpKQogCQlnb3RvIGNsZWFudXA7CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlnb3RvIGNsZWFudXA7CiAKIAlpZiAoaW5mby0+cGFyYW1zLm1vZGUgPT0gTUdTTF9NT0RFX0hETEMpIHsKQEAgLTEwNjcsNyArMTA2Nyw3IEBACiAJaWYgKHNhbml0eV9jaGVjayhpbmZvLCB0dHktPm5hbWUsICJwdXRfY2hhciIpKQogCQlyZXR1cm47CiAKLQlpZiAoIXR0eSB8fCAhaW5mby0+dHhfYnVmKQorCWlmICghaW5mby0+dHhfYnVmKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jayxmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jIGIvZHJpdmVycy9jaGFyL3Zpb3RhcGUuYwppbmRleCA2MGFhYmRiLi4xMWM3ZTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlvdGFwZS5jCisrKyBiL2RyaXZlcnMvY2hhci92aW90YXBlLmMKQEAgLTk4OSw3ICs5ODksNyBAQAogICogc3VwcG9ydC4KICAqLwogc3RhdGljIHN0cnVjdCB2aW9fZGV2aWNlX2lkIHZpb3RhcGVfZGV2aWNlX3RhYmxlW10gX19kZXZpbml0ZGF0YSA9IHsKLQl7ICJ2aW90YXBlIiwgIiIgfSwKKwl7ICJieXRlIiwgIklCTSxpU2VyaWVzLXZpb3RhcGUiIH0sCiAJeyAiIiwgIiIgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2aW90YXBlX2RldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMgYi9kcml2ZXJzL2Nvbm5lY3Rvci9jbl9wcm9jLmMKaW5kZXggNGI0ZDdkYi4uNDk4YWEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY25fcHJvYy5jCisrKyBiL2RyaXZlcnMvY29ubmVjdG9yL2NuX3Byb2MuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2NuX3Byb2MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY29ubmVjdG9yL2Nvbm5lY3Rvci5jIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKaW5kZXggNzlkNTgxYy4uYjQ5YmFjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKKysrIGIvZHJpdmVycy9jb25uZWN0b3IvY29ubmVjdG9yLmMKQEAgLTEyMSw2ICsxMjEsNyBAQAogCWtmcmVlX3NrYihza2IpOwogCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoY25fbmV0bGlua19zZW5kKTsKIAogLyoKICAqIENhbGxiYWNrIGhlbHBlciAtIHF1ZXVlcyB3b3JrIGFuZCBzZXR1cCBkZXN0cnVjdG9yIGZvciBnaXZlbiBkYXRhLgpAQCAtMzE5LDYgKzMyMCw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNuX2FkZF9jYWxsYmFjayk7CiAKIC8qCiAgKiBDYWxsYmFjayByZW1vdmUgcm91dGluZyAtIHJlbW92ZXMgY2FsbGJhY2sKQEAgLTMzNSw2ICszMzcsNyBAQAogCWNuX3F1ZXVlX2RlbF9jYWxsYmFjayhkZXYtPmNiZGV2LCBpZCk7CiAJY25fbm90aWZ5KGlkLCAxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNuX2RlbF9jYWxsYmFjayk7CiAKIC8qCiAgKiBDaGVja3MgdHdvIGNvbm5lY3RvcidzIGNvbnRyb2wgbWVzc2FnZXMgdG8gYmUgdGhlIHNhbWUuCkBAIC00ODgsNyArNDkxLDMgQEAKIAogc3Vic3lzX2luaXRjYWxsKGNuX2luaXQpOwogbW9kdWxlX2V4aXQoY25fZmluaSk7Ci0KLUVYUE9SVF9TWU1CT0xfR1BMKGNuX2FkZF9jYWxsYmFjayk7Ci1FWFBPUlRfU1lNQk9MX0dQTChjbl9kZWxfY2FsbGJhY2spOwotRVhQT1JUX1NZTUJPTF9HUEwoY25fbmV0bGlua19zZW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKaW5kZXggZTA3YTM1NC4uYjNlYmM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KQEAgLTcyLDYgKzczLDE0IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGJzX2VuYWJsZTsJLyogbnVtYmVyIG9mIENQVXMgdXNpbmcgdGhpcyBwb2xpY3kgKi8KIAorLyoKKyAqIERFQURMT0NLIEFMRVJUISBUaGVyZSBpcyBhIG9yZGVyaW5nIHJlcXVpcmVtZW50IGJldHdlZW4gY3B1X2hvdHBsdWcKKyAqIGxvY2sgYW5kIGRic19tdXRleC4gY3B1X2hvdHBsdWcgbG9jayBzaG91bGQgYWx3YXlzIGJlIGhlbGQgYmVmb3JlCisgKiBkYnNfbXV0ZXguIElmIGFueSBmdW5jdGlvbiB0aGF0IGNhbiBwb3RlbnRpYWxseSB0YWtlIGNwdV9ob3RwbHVnIGxvY2sKKyAqIChsaWtlIF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KCkpIGlzIGJlaW5nIGNhbGxlZCB3aXRoIGRic19tdXRleCB0YWtlbiwgdGhlbgorICogY3B1X2hvdHBsdWcgbG9jayBzaG91bGQgYmUgdGFrZW4gYmVmb3JlIHRoYXQuIE5vdGUgdGhhdCBjcHVfaG90cGx1ZyBsb2NrCisgKiBpcyByZWN1cnNpdmUgZm9yIHRoZSBzYW1lIHByb2Nlc3MuIC1WZW5raQorICovCiBzdGF0aWMgREVGSU5FX01VVEVYIAkoZGJzX211dGV4KTsKIHN0YXRpYyBERUNMQVJFX1dPUksJKGRic193b3JrLCBkb19kYnNfdGltZXIsIE5VTEwpOwogCkBAIC00MTQsMTIgKzQyMywxNCBAQAogc3RhdGljIHZvaWQgZG9fZGJzX3RpbWVyKHZvaWQgKmRhdGEpCiB7IAogCWludCBpOworCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAkJZGJzX2NoZWNrX2NwdShpKTsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRic193b3JrLCAKIAkJCXVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSkpOwogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKKwl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0gCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdCh2b2lkKQpAQCAtNTE0LDYgKzUyNSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBDUFVGUkVRX0dPVl9MSU1JVFM6CisJCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKIAkJaWYgKHBvbGljeS0+bWF4IDwgdGhpc19kYnNfaW5mby0+Y3VyX3BvbGljeS0+Y3VyKQogCQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQoCkBAIC01MjQsNiArNTM2LDcgQEAKIAkJCQkJdGhpc19kYnNfaW5mby0+Y3VyX3BvbGljeSwKIAkJCQkgICAgICAgCXBvbGljeS0+bWluLCBDUFVGUkVRX1JFTEFUSU9OX0wpOwogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CisJCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYwppbmRleCAzZTZmZmNhLi42OTNlNTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KQEAgLTcxLDYgKzcyLDE0IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGJzX2VuYWJsZTsJLyogbnVtYmVyIG9mIENQVXMgdXNpbmcgdGhpcyBwb2xpY3kgKi8KIAorLyoKKyAqIERFQURMT0NLIEFMRVJUISBUaGVyZSBpcyBhIG9yZGVyaW5nIHJlcXVpcmVtZW50IGJldHdlZW4gY3B1X2hvdHBsdWcKKyAqIGxvY2sgYW5kIGRic19tdXRleC4gY3B1X2hvdHBsdWcgbG9jayBzaG91bGQgYWx3YXlzIGJlIGhlbGQgYmVmb3JlCisgKiBkYnNfbXV0ZXguIElmIGFueSBmdW5jdGlvbiB0aGF0IGNhbiBwb3RlbnRpYWxseSB0YWtlIGNwdV9ob3RwbHVnIGxvY2sKKyAqIChsaWtlIF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KCkpIGlzIGJlaW5nIGNhbGxlZCB3aXRoIGRic19tdXRleCB0YWtlbiwgdGhlbgorICogY3B1X2hvdHBsdWcgbG9jayBzaG91bGQgYmUgdGFrZW4gYmVmb3JlIHRoYXQuIE5vdGUgdGhhdCBjcHVfaG90cGx1ZyBsb2NrCisgKiBpcyByZWN1cnNpdmUgZm9yIHRoZSBzYW1lIHByb2Nlc3MuIC1WZW5raQorICovCiBzdGF0aWMgREVGSU5FX01VVEVYIChkYnNfbXV0ZXgpOwogc3RhdGljIERFQ0xBUkVfV09SSwkoZGJzX3dvcmssIGRvX2Ric190aW1lciwgTlVMTCk7CiAKQEAgLTM2MywxMiArMzcyLDE0IEBACiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIodm9pZCAqZGF0YSkKIHsKIAlpbnQgaTsKKwlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCiAJCWRic19jaGVja19jcHUoaSk7CiAJcXVldWVfZGVsYXllZF93b3JrKGRic193b3JrcSwgJmRic193b3JrLAogCQkJICAgdXNlY3NfdG9famlmZmllcyhkYnNfdHVuZXJzX2lucy5zYW1wbGluZ19yYXRlKSk7CiAJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOworCXVubG9ja19jcHVfaG90cGx1ZygpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQodm9pZCkKQEAgLTQ2OSw2ICs0ODAsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQ1BVRlJFUV9HT1ZfTElNSVRTOgorCQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJCW11dGV4X2xvY2soJmRic19tdXRleCk7CiAJCWlmIChwb2xpY3ktPm1heCA8IHRoaXNfZGJzX2luZm8tPmN1cl9wb2xpY3ktPmN1cikKIAkJCV9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KApAQCAtNDc5LDYgKzQ5MSw3IEBACiAJCQkJCXRoaXNfZGJzX2luZm8tPmN1cl9wb2xpY3ksCiAJCQkJCXBvbGljeS0+bWluLCBDUFVGUkVRX1JFTEFUSU9OX0wpOwogCQltdXRleF91bmxvY2soJmRic19tdXRleCk7CisJCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcgYi9kcml2ZXJzL2Zpcm13YXJlL0tjb25maWcKaW5kZXggMWUzNzFhNS4uNzMxYzNkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvS2NvbmZpZwpAQCAtNiw4ICs2LDcgQEAKIG1lbnUgIkZpcm13YXJlIERyaXZlcnMiCiAKIGNvbmZpZyBFREQKLQl0cmlzdGF0ZSAiQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIGNhbGxzIGRldGVybWluZSBib290IGRpc2sgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwl0cmlzdGF0ZSAiQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlIGNhbGxzIGRldGVybWluZSBib290IGRpc2siCiAJZGVwZW5kcyBvbiAhSUE2NAogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgQklPUyBFbmhhbmNlZCBEaXNrIERyaXZlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKaW5kZXggOTQ4YmQ3ZS4uYjllMzg4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwpAQCAtMjU1LDEwICsyNTUsMTUgQEAKIC8qKgogICoJZG1pX2NoZWNrX3N5c3RlbSAtIGNoZWNrIHN5c3RlbSBETUkgZGF0YQogICoJQGxpc3Q6IGFycmF5IG9mIGRtaV9zeXN0ZW1faWQgc3RydWN0dXJlcyB0byBtYXRjaCBhZ2FpbnN0CisgKgkJQWxsIG5vbi1udWxsIGVsZW1lbnRzIG9mIHRoZSBsaXN0IG11c3QgbWF0Y2gKKyAqCQl0aGVpciBzbG90J3MgKGZpZWxkIGluZGV4J3MpIGRhdGEgKGkuZS4sIGVhY2gKKyAqCQlsaXN0IHN0cmluZyBtdXN0IGJlIGEgc3Vic3RyaW5nIG9mIHRoZSBzcGVjaWZpZWQKKyAqCQlETUkgc2xvdCdzIHN0cmluZyBkYXRhKSB0byBiZSBjb25zaWRlcmVkIGEKKyAqCQlzdWNjZXNzZnVsIG1hdGNoLgogICoKICAqCVdhbGsgdGhlIGJsYWNrbGlzdCB0YWJsZSBydW5uaW5nIG1hdGNoaW5nIGZ1bmN0aW9ucyB1bnRpbCBzb21lb25lCiAgKglyZXR1cm5zIG5vbiB6ZXJvIG9yIHdlIGhpdCB0aGUgZW5kLiBDYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yCi0gKgllYWNoIHN1Y2Nlc3NmdWxsIG1hdGNoLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWF0Y2hlcy4KKyAqCWVhY2ggc3VjY2Vzc2Z1bCBtYXRjaC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMuCiAgKi8KIGludCBkbWlfY2hlY2tfc3lzdGVtKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpsaXN0KQogewpAQCAtMjg3LDcgKzI5Miw3IEBACiAKIC8qKgogICoJZG1pX2dldF9zeXN0ZW1faW5mbyAtIHJldHVybiBETUkgZGF0YSB2YWx1ZQotICoJQGZpZWxkOiBkYXRhIGluZGV4IChzZWUgZW51bSBkbWlfZmlsZWQpCisgKglAZmllbGQ6IGRhdGEgaW5kZXggKHNlZSBlbnVtIGRtaV9maWVsZCkKICAqCiAgKglSZXR1cm5zIG9uZSBETUkgZGF0YSB2YWx1ZSwgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybQogICoJY29tcGxleCBETUkgZGF0YSBjaGVja3MuCkBAIC0zMDEsMTMgKzMwNiwxMyBAQAogLyoqCiAgKglkbWlfZmluZF9kZXZpY2UgLSBmaW5kIG9uYm9hcmQgZGV2aWNlIGJ5IHR5cGUvbmFtZQogICoJQHR5cGU6IGRldmljZSB0eXBlIG9yICVETUlfREVWX1RZUEVfQU5ZIHRvIG1hdGNoIGFsbCBkZXZpY2UgdHlwZXMKLSAqCUBkZXNjOiBkZXZpY2UgbmFtZSBzdHJpbmcgb3IgJU5VTEwgdG8gbWF0Y2ggYWxsCisgKglAbmFtZTogZGV2aWNlIG5hbWUgc3RyaW5nIG9yICVOVUxMIHRvIG1hdGNoIGFsbAogICoJQGZyb206IHByZXZpb3VzIGRldmljZSBmb3VuZCBpbiBzZWFyY2gsIG9yICVOVUxMIGZvciBuZXcgc2VhcmNoLgogICoKICAqCUl0ZXJhdGVzIHRocm91Z2ggdGhlIGxpc3Qgb2Yga25vd24gb25ib2FyZCBkZXZpY2VzLiBJZiBhIGRldmljZSBpcwogICoJZm91bmQgd2l0aCBhIG1hdGNoaW5nIEB2ZW5kb3IgYW5kIEBkZXZpY2UsIGEgcG9pbnRlciB0byBpdHMgZGV2aWNlCiAgKglzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICBPdGhlcndpc2UsICVOVUxMIGlzIHJldHVybmVkLgotICoJQSBuZXcgc2VhcmNoIGlzIGluaXRpYXRlZCBieSBwYXNzaW5nICVOVUxMIHRvIHRoZSBAZnJvbSBhcmd1bWVudC4KKyAqCUEgbmV3IHNlYXJjaCBpcyBpbml0aWF0ZWQgYnkgcGFzc2luZyAlTlVMTCBhcyB0aGUgQGZyb20gYXJndW1lbnQuCiAgKglJZiBAZnJvbSBpcyBub3QgJU5VTEwsIHNlYXJjaGVzIGNvbnRpbnVlIGZyb20gbmV4dCBkZXZpY2UuCiAgKi8KIHN0cnVjdCBkbWlfZGV2aWNlICogZG1pX2ZpbmRfZGV2aWNlKGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDk5Y2RjNjEuLjBlMzFhMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTEsNSArMSw1IEBACiAjCi0jIEkyQyBTZW5zb3IgY2hpcCBkcml2ZXJzIGNvbmZpZ3VyYXRpb24KKyMgSGFyZHdhcmUgbW9uaXRvcmluZyBjaGlwIGRyaXZlcnMgY29uZmlndXJhdGlvbgogIwogCiBtZW51ICJIYXJkd2FyZSBNb25pdG9yaW5nIHN1cHBvcnQiCkBAIC0xNiw2ICsxNiwxMCBAQAogCSAgc2hvdWxkIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gdGhlIHNwZWNpZmljIGRyaXZlcihzKSBmb3IgeW91cgogCSAgc2Vuc29ycyBjaGlwKHMpIGJlbG93LgogCisJICBUbyBmaW5kIG91dCB3aGljaCBzcGVjaWZpYyBkcml2ZXIocykgeW91IG5lZWQsIHVzZSB0aGUKKwkgIHNlbnNvcnMtZGV0ZWN0IHNjcmlwdCBmcm9tIHRoZSBsbV9zZW5zb3JzIHBhY2thZ2UuICBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2h3bW9uL3VzZXJzcGFjZS10b29scz4gZm9yIGRldGFpbHMuCisKIAkgIFRoaXMgc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBod21vbi4KIApAQCAtMjMsNiArMjcsMTggQEAKIAl0cmlzdGF0ZQogCWRlZmF1bHQgbgogCitjb25maWcgU0VOU09SU19BQklUVUdVUlUKKwl0cmlzdGF0ZSAiQWJpdCB1R3VydSIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgQWJpdCB1R3VydSBjaGlwcworCSAgc2Vuc29yIHBhcnQuIFRoZSB2b2x0YWdlIGFuZCBmcmVxdWVuY3kgY29udHJvbCBwYXJ0cyBvZiB0aGUgQWJpdAorCSAgdUd1cnUgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZSBBYml0IHVHdXJ1IGNoaXAgY2FuIGJlIGZvdW5kIG9uIEFiaXQKKwkgIHVHdXJ1IGZlYXR1cmluZyBtb3RoZXJib2FyZHMgKG1vc3QgbW9kZXJuIEFiaXQgbW90aGVyYm9hcmRzKS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgYWJpdHVndXJ1LgorCiBjb25maWcgU0VOU09SU19BRE0xMDIxCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFETTEwMjEgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCkBAIC0xODgsNiArMjA0LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBsbTYzLgogCitjb25maWcgU0VOU09SU19MTTcwCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIFNQSV9NQVNURVIgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBOYXRpb25hbCBTZW1pY29uZHVjdG9yCisJICBMTTcwIGRpZ2l0YWwgdGVtcGVyYXR1cmUgc2Vuc29yIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGxtNzAuCisKIGNvbmZpZyBTRU5TT1JTX0xNNzUKIAl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTc1IGFuZCBjb21wYXRpYmxlcyIKIAlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQwpAQCAtMjM2LDExICsyNjIsMTEgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGxtODAuCiAKIGNvbmZpZyBTRU5TT1JTX0xNODMKLQl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTgzIgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNODMgYW5kIGNvbXBhdGlibGVzIgogCWRlcGVuZHMgb24gSFdNT04gJiYgSTJDCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIE5hdGlvbmFsIFNlbWljb25kdWN0b3IKLQkgIExNODMgc2Vuc29yIGNoaXBzLgorCSAgTE04MiBhbmQgTE04MyBzZW5zb3IgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtODMuCkBAIC0zMzMsMTEgKzM1OSwzMiBAQAogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgaW50ZWdyYXRlZCBmYW4KIAkgIG1vbml0b3JpbmcgYW5kIGNvbnRyb2wgY2FwYWJpbGl0aWVzIG9mIHRoZSBTTVNDIExQQzQ3QjI3eCwKLQkgIExQQzQ3TTEweCwgTFBDNDdNMTN4LCBMUEM0N00xNHgsIExQQzQ3TTE1eCBhbmQgTFBDNDdNMTkyIGNoaXBzLgorCSAgTFBDNDdNMTB4LCBMUEM0N00xM3gsIExQQzQ3TTE0eCwgTFBDNDdNMTV4LCBMUEM0N00xOTIgYW5kCisJICBMUEM0N005OTcgY2hpcHMuCisKKwkgIFRoZSB0ZW1wZXJhdHVyZSBhbmQgdm9sdGFnZSBzZW5zb3IgZmVhdHVyZXMgb2YgdGhlIExQQzQ3TTE5MgorCSAgYW5kIExQQzQ3TTk5NyBhcmUgc3VwcG9ydGVkIGJ5IGFub3RoZXIgZHJpdmVyLCBzZWxlY3QgYWxzbworCSAgIlNNU0MgTFBDNDdNMTkyIGFuZCBjb21wYXRpYmxlcyIgYmVsb3cgZm9yIHRob3NlLgogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBzbXNjNDdtMS4KIAorY29uZmlnIFNFTlNPUlNfU01TQzQ3TTE5MgorCXRyaXN0YXRlICJTTVNDIExQQzQ3TTE5MiBhbmQgY29tcGF0aWJsZXMiCisJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IEhXTU9OX1ZJRAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgdGVtcGVyYXR1cmUgYW5kCisJICB2b2x0YWdlIHNlbnNvcnMgb2YgdGhlIFNNU0MgTFBDNDdNMTkyIGFuZCBMUEM0N005OTcgY2hpcHMuCisKKwkgIFRoZSBmYW4gbW9uaXRvcmluZyBhbmQgY29udHJvbCBjYXBhYmlsaXRpZXMgb2YgdGhlc2UgY2hpcHMKKwkgIGFyZSBzdXBwb3J0ZWQgYnkgYW5vdGhlciBkcml2ZXIsIHNlbGVjdAorCSAgIlNNU0MgTFBDNDdNMTB4IGFuZCBjb21wYXRpYmxlcyIgYWJvdmUuIFlvdSBuZWVkIGJvdGggZHJpdmVycworCSAgaWYgeW91IHdhbnQgZmFuIGNvbnRyb2wgYW5kIHZvbHRhZ2UvdGVtcGVyYXR1cmUgc2Vuc29yIHN1cHBvcnQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHNtc2M0N20xOTIuCisKIGNvbmZpZyBTRU5TT1JTX1NNU0M0N0IzOTcKIAl0cmlzdGF0ZSAiU01TQyBMUEM0N0IzOTctTkMiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCkBAIC0zODUsNiArNDMyLDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3ODM3ODFkLgogCitjb25maWcgU0VOU09SU19XODM3OTFECisJdHJpc3RhdGUgIldpbmJvbmQgVzgzNzkxRCIKKwlkZXBlbmRzIG9uIEhXTU9OICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgSFdNT05fVklECisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBXaW5ib25kIFc4Mzc5MUQgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdzgzNzkxZC4KKwogY29uZmlnIFNFTlNPUlNfVzgzNzkyRAogCXRyaXN0YXRlICJXaW5ib25kIFc4Mzc5MkQiCiAJZGVwZW5kcyBvbiBIV01PTiAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlIGIvZHJpdmVycy9od21vbi9NYWtlZmlsZQppbmRleCBmYmRiOGQ5Li4zMTQxNTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDkgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX1c4MzYyN0hGKQkrPSB3ODM2MjdoZi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XODM3OTJEKQkrPSB3ODM3OTJkLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1c4Mzc4MUQpCSs9IHc4Mzc4MWQubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNzkxRCkJKz0gdzgzNzkxZC5vCiAKK29iai0kKENPTkZJR19TRU5TT1JTX0FCSVRVR1VSVSkJKz0gYWJpdHVndXJ1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0FETTEwMjEpCSs9IGFkbTEwMjEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTAyNSkJKz0gYWRtMTAyNS5vCiBvYmotJChDT05GSUdfU0VOU09SU19BRE0xMDI2KQkrPSBhZG0xMDI2Lm8KQEAgLTI2LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX0hEQVBTKQkrPSBoZGFwcy5vCiBvYmotJChDT05GSUdfU0VOU09SU19JVDg3KQkrPSBpdDg3Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNNjMpCSs9IGxtNjMubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03MCkJKz0gbG03MC5vCiBvYmotJChDT05GSUdfU0VOU09SU19MTTc1KQkrPSBsbTc1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNNzcpCSs9IGxtNzcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE03OCkJKz0gbG03OC5vCkBAIC00MCw2ICs0Myw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19TSVM1NTk1KQkrPSBzaXM1NTk1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1NNU0M0N0IzOTcpKz0gc21zYzQ3YjM5Ny5vCiBvYmotJChDT05GSUdfU0VOU09SU19TTVNDNDdNMSkJKz0gc21zYzQ3bTEubworb2JqLSQoQ09ORklHX1NFTlNPUlNfU01TQzQ3TTE5MikrPSBzbXNjNDdtMTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1ZJQTY4NkEpCSs9IHZpYTY4NmEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVlQ4MjMxKQkrPSB2dDgyMzEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfVzgzNjI3RUhGKQkrPSB3ODM2MjdlaGYubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9hYml0dWd1cnUuYyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMjJjYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vYWJpdHVndXJ1LmMKQEAgLTAsMCArMSwxNDE1IEBACisvKgorICAgIGFiaXR1Z3VydS5jIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IEhhbnMgZGUgR29lZGUgPGoudy5yLmRlZ29lZGVAaGhzLm5sPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworLyoKKyAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgc2Vuc29yIHBhcnQgb2YgdGhlIGN1c3RvbSBBYml0IHVHdXJ1IGNoaXAgZm91bmQKKyAgICBvbiBBYml0IHVHdXJ1IG1vdGhlcmJvYXJkcy4gTm90ZTogYmVjYXVzZSBvZiBsYWNrIG9mIHNwZWNzIHRoZSBDUFUgLyBSQU0gLworICAgIGV0YyB2b2x0YWdlICYgZnJlcXVlbmN5IGNvbnRyb2wgaXMgbm90IHN1cHBvcnRlZCEKKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKy8qIEJhbmtzICovCisjZGVmaW5lIEFCSVRfVUdVUlVfQUxBUk1fQkFOSwkJCTB4MjAgLyogMXggMyBieXRlcyAqLworI2RlZmluZSBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMQkJCTB4MjEgLyogMTZ4IHZvbHQgYW5kIHRlbXAgKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9GQU5fUFdNCQkJMHgyNCAvKiAzeCA1IGJ5dGVzICovCisjZGVmaW5lIEFCSVRfVUdVUlVfU0VOU09SX0JBTksyCQkJMHgyNiAvKiBmYW5zICovCisvKiBtYXggbnIgb2Ygc2Vuc29ycyBpbiBiYW5rMSwgYSBiYW5rMSBzZW5zb3IgY2FuIGJlIGluLCB0ZW1wIG9yIG5jICovCisjZGVmaW5lIEFCSVRfVUdVUlVfTUFYX0JBTksxX1NFTlNPUlMJCTE2CisvKiBXYXJuaW5nIGlmIHlvdSBpbmNyZWFzZSBvbmUgb2YgdGhlIDIgTUFYIGRlZmluZXMgYmVsb3cgdG8gMTAgb3IgaGlnaGVyIHlvdQorICAgc2hvdWxkIGFkanVzdCB0aGUgYmVsb25naW5nIF9OQU1FU19MRU5HVEggbWFjcm8gZm9yIHRoZSAyIGRpZ2l0IG51bWJlciEgKi8KKy8qIG1heCBuciBvZiBzZW5zb3JzIGluIGJhbmsyLCBjdXJyZW50bHkgbWIncyB3aXRoIG1heCA2IGZhbnMgYXJlIGtub3duICovCisjZGVmaW5lIEFCSVRfVUdVUlVfTUFYX0JBTksyX1NFTlNPUlMJCTYKKy8qIG1heCBuciBvZiBwd20gb3V0cHV0cywgY3VycmVudGx5IG1iJ3Mgd2l0aCBtYXggNSBwd20gb3V0cHV0cyBhcmUga25vd24gKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9NQVhfUFdNUwkJCTUKKy8qIHVHdXJ1IHNlbnNvciBiYW5rIDEgZmxhZ3MgKi8JCQkgICAgIC8qIEFsYXJtIGlmOiAqLworI2RlZmluZSBBQklUX1VHVVJVX1RFTVBfSElHSF9BTEFSTV9FTkFCTEUJMHgwMSAvKiAgdGVtcCBvdmVyIHdhcm4gKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9WT0xUX0hJR0hfQUxBUk1fRU5BQkxFCTB4MDIgLyogIHZvbHQgb3ZlciBtYXggKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9WT0xUX0xPV19BTEFSTV9FTkFCTEUJMHgwNCAvKiAgdm9sdCB1bmRlciBtaW4gKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9URU1QX0hJR0hfQUxBUk1fRkxBRwkJMHgxMCAvKiB0ZW1wIGlzIG92ZXIgd2FybiAqLworI2RlZmluZSBBQklUX1VHVVJVX1ZPTFRfSElHSF9BTEFSTV9GTEFHCQkweDIwIC8qIHZvbHQgaXMgb3ZlciBtYXggKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9WT0xUX0xPV19BTEFSTV9GTEFHCQkweDQwIC8qIHZvbHQgaXMgdW5kZXIgbWluICovCisvKiB1R3VydSBzZW5zb3IgYmFuayAyIGZsYWdzICovCQkJICAgICAvKiBBbGFybSBpZjogKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9GQU5fTE9XX0FMQVJNX0VOQUJMRQkJMHgwMSAvKiAgIGZhbiB1bmRlciBtaW4gKi8KKy8qIHVHdXJ1IHNlbnNvciBiYW5rIGNvbW1vbiBmbGFncyAqLworI2RlZmluZSBBQklUX1VHVVJVX0JFRVBfRU5BQkxFCQkJMHgwOCAvKiBiZWVwIGlmIGFsYXJtICovCisjZGVmaW5lIEFCSVRfVUdVUlVfU0hVVERPV05fRU5BQkxFCQkweDgwIC8qIHNodXRkb3duIGlmIGFsYXJtICovCisvKiB1R3VydSBmYW4gUFdNIChzcGVlZCBjb250cm9sKSBmbGFncyAqLworI2RlZmluZSBBQklUX1VHVVJVX0ZBTl9QV01fRU5BQkxFCQkweDgwIC8qIGVuYWJsZSBzcGVlZCBjb250cm9sICovCisvKiBWYWx1ZXMgdXNlZCBmb3IgY29udmVyc2lvbiAqLworI2RlZmluZSBBQklUX1VHVVJVX0ZBTl9NQVgJCQkxNTMwMCAvKiBSUE0gKi8KKy8qIEJhbmsxIHNlbnNvciB0eXBlcyAqLworI2RlZmluZSBBQklUX1VHVVJVX0lOX1NFTlNPUgkJCTAKKyNkZWZpbmUgQUJJVF9VR1VSVV9URU1QX1NFTlNPUgkJCTEKKyNkZWZpbmUgQUJJVF9VR1VSVV9OQwkJCQkyCisvKiBUaW1lb3V0cyAvIFJldHJpZXMsIGlmIHRoZXNlIHR1cm4gb3V0IHRvIG5lZWQgYSBsb3Qgb2YgZmlkZGxpbmcgd2UgY291bGQKKyAgIGNvbnZlcnQgdGhlbSB0byBwYXJhbXMuICovCisvKiAyNTAgd2FzIGRldGVybWluZWQgYnkgdHJpYWwgYW5kIGVycm9yLCAyMDAgd29ya3MgbW9zdCBvZiB0aGUgdGltZSwgYnV0IG5vdAorICAgYWx3YXlzLiBJIGFzc3VtZSB0aGlzIGlzIGNwdS1zcGVlZCBpbmRlcGVuZGVudCwgc2luY2UgdGhlIElTQS1idXMgYW5kIG5vdAorICAgdGhlIENQVSBzaG91bGQgYmUgdGhlIGJvdHRsZW5lY2suIE5vdGUgdGhhdCAyNTAgc29tZXRpbWVzIGlzIHN0aWxsIG5vdAorICAgZW5vdWdoIChvbmx5IHJlcG9ydGVkIG9uIEFONyBtYikgdGhpcyBpcyBoYW5kbGVkIGJ5IGEgaGlnaGVyIGxheWVyLiAqLworI2RlZmluZSBBQklUX1VHVVJVX1dBSVRfVElNRU9VVAkJCTI1MAorLyogTm9ybWFsbHkgYWxsIGV4cGVjdGVkIHN0YXR1cyBpbiBhYml0dWd1cnVfcmVhZHksIGFyZSByZXBvcnRlZCBhZnRlciB0aGUKKyAgIGZpcnN0IHJlYWQsIGJ1dCBzb21ldGltZXMgbm90IGFuZCB3ZSBuZWVkIHRvIHBvbGwsIDUgcG9sbHMgd2FzIG5vdCBlbm91Z2gKKyAgIDUwIHNvZmFyIGlzLiAqLworI2RlZmluZSBBQklUX1VHVVJVX1JFQURZX1RJTUVPVVQJCTUwCisvKiBNYXhpbXVtIDMgcmV0cmllcyBvbiB0aW1lZG91dCByZWFkcy93cml0ZXMsIGRlbGF5IDIwMCBtcyBiZWZvcmUgcmV0cnlpbmcgKi8KKyNkZWZpbmUgQUJJVF9VR1VSVV9NQVhfUkVUUklFUwkJCTMKKyNkZWZpbmUgQUJJVF9VR1VSVV9SRVRSWV9ERUxBWQkJCShIWi81KQorLyogTWF4aW11bSAyIHRpbWVvdXRzIGluIGFiaXR1Z3VydV91cGRhdGVfZGV2aWNlLCBpb3cgMyBpbiBhIHJvdyBpcyBhbiBlcnJvciAqLworI2RlZmluZSBBQklUX1VHVVJVX01BWF9USU1FT1VUUwkJCTIKKy8qIHV0aWxpdHkgbWFjcm9zICovCisjZGVmaW5lIEFCSVRfVUdVUlVfTkFNRQkJCQkiYWJpdHVndXJ1IgorI2RlZmluZSBBQklUX1VHVVJVX0RFQlVHKGxldmVsLCBmb3JtYXQsIGFyZy4uLikJCQkJXAorCWlmIChsZXZlbCA8PSB2ZXJib3NlKQkJCQkJCVwKKwkJcHJpbnRrKEtFUk5fREVCVUcgQUJJVF9VR1VSVV9OQU1FICI6ICIJZm9ybWF0ICwgIyMgYXJnKQorLyogTWFjcm9zIHRvIGhlbHAgY2FsY3VsYXRlIHRoZSBzeXNmc19uYW1lcyBhcnJheSBsZW5ndGggKi8KKy8qIHN1bSBvZiBzdHJsZW4gb2Y6IGluPz9faW5wdXRcMCwgaW4/P197bWluLG1heH1cMCwgaW4/P197bWluLG1heH1fYWxhcm1cMCwKKyAgIGluPz9fe21pbixtYXh9X2FsYXJtX2VuYWJsZVwwLCBpbj8/X2JlZXBcMCwgaW4/P19zaHV0ZG93blwwICovCisjZGVmaW5lIEFCSVRVR1VSVV9JTl9OQU1FU19MRU5HVEgJKDExICsgMiAqIDkgKyAyICogMTUgKyAyICogMjIgKyAxMCArIDE0KQorLyogc3VtIG9mIHN0cmxlbiBvZjogdGVtcD8/X2lucHV0XDAsIHRlbXA/P19tYXhcMCwgdGVtcD8/X2NyaXRcMCwKKyAgIHRlbXA/P19hbGFybVwwLCB0ZW1wPz9fYWxhcm1fZW5hYmxlXDAsIHRlbXA/P19iZWVwXDAsIHRlbXA/P19zaHV0ZG93blwwICovCisjZGVmaW5lIEFCSVRVR1VSVV9URU1QX05BTUVTX0xFTkdUSAkoMTMgKyAxMSArIDEyICsgMTMgKyAyMCArIDEyICsgMTYpCisvKiBzdW0gb2Ygc3RybGVuIG9mOiBmYW4/X2lucHV0XDAsIGZhbj9fbWluXDAsIGZhbj9fYWxhcm1cMCwKKyAgIGZhbj9fYWxhcm1fZW5hYmxlXDAsIGZhbj9fYmVlcFwwLCBmYW4/X3NodXRkb3duXDAgKi8KKyNkZWZpbmUgQUJJVFVHVVJVX0ZBTl9OQU1FU19MRU5HVEgJKDExICsgOSArIDExICsgMTggKyAxMCArIDE0KQorLyogc3VtIG9mIHN0cmxlbiBvZjogcHdtP19lbmFibGVcMCwgcHdtP19hdXRvX2NoYW5uZWxzX3RlbXBcMCwKKyAgIHB3bT9fYXV0b19wb2ludHsxLDJ9X3B3bVwwLCBwd20/X2F1dG9fcG9pbnR7MSwyfV90ZW1wXDAgKi8KKyNkZWZpbmUgQUJJVFVHVVJVX1BXTV9OQU1FU19MRU5HVEgJKDEyICsgMjQgKyAyICogMjEgKyAyICogMjIpCisvKiBJTl9OQU1FU19MRU5HVEggPiBURU1QX05BTUVTX0xFTkdUSCBzbyBhc3N1bWUgYWxsIGJhbmsxIHNlbnNvcnMgYXJlIGluICovCisjZGVmaW5lIEFCSVRVR1VSVV9TWVNGU19OQU1FU19MRU5HVEgJKCBcCisJQUJJVF9VR1VSVV9NQVhfQkFOSzFfU0VOU09SUyAqIEFCSVRVR1VSVV9JTl9OQU1FU19MRU5HVEggKyBcCisJQUJJVF9VR1VSVV9NQVhfQkFOSzJfU0VOU09SUyAqIEFCSVRVR1VSVV9GQU5fTkFNRVNfTEVOR1RIICsgXAorCUFCSVRfVUdVUlVfTUFYX1BXTVMgKiBBQklUVUdVUlVfUFdNX05BTUVTX0xFTkdUSCkKKworLyogQWxsIHRoZSBtYWNyb3MgYmVsb3cgYXJlIG5hbWVkIGlkZW50aWNhbCB0byB0aGUgb2d1cnUgYW5kIG9ndXJ1MiBwcm9ncmFtcworICAgcmV2ZXJzZSBlbmdpbmVlcmVkIGJ5IE9sbGUgU2FuZGJlcmcsIGhlbmNlIHRoZSBuYW1lcyBtaWdodCBub3QgYmUgMTAwJQorICAgbG9naWNhbC4gSSBjb3VsZCBjb21lIHVwIHdpdGggYmV0dGVyIG5hbWVzLCBidXQgSSBwcmVmZXIga2VlcGluZyB0aGUgbmFtZXMKKyAgIGlkZW50aWNhbCBzbyB0aGF0IHRoaXMgZHJpdmVyIGNhbiBiZSBjb21wYXJlZCB3aXRoIGhpcyB3b3JrIG1vcmUgZWFzaWx5LiAqLworLyogVHdvIGkvby1wb3J0cyBhcmUgdXNlZCBieSB1R3VydSAqLworI2RlZmluZSBBQklUX1VHVVJVX0JBU0UJCQkJMHgwMEUwCisvKiBVc2VkIHRvIHRlbGwgdUd1cnUgd2hhdCB0byByZWFkIGFuZCB0byByZWFkIHRoZSBhY3R1YWwgZGF0YSAqLworI2RlZmluZSBBQklUX1VHVVJVX0NNRAkJCQkweDAwCisvKiBNb3N0bHkgdXNlZCB0byBjaGVjayBpZiB1R3VydSBpcyBidXN5ICovCisjZGVmaW5lIEFCSVRfVUdVUlVfREFUQQkJCQkweDA0CisjZGVmaW5lIEFCSVRfVUdVUlVfUkVHSU9OX0xFTkdUSAkJNQorLyogdUd1cnUgc3RhdHVzJyAqLworI2RlZmluZSBBQklUX1VHVVJVX1NUQVRVU19XUklURQkJCTB4MDAgLyogUmVhZHkgdG8gYmUgd3JpdHRlbiAqLworI2RlZmluZSBBQklUX1VHVVJVX1NUQVRVU19SRUFECQkJMHgwMSAvKiBSZWFkeSB0byBiZSByZWFkICovCisjZGVmaW5lIEFCSVRfVUdVUlVfU1RBVFVTX0lOUFVUCQkJMHgwOCAvKiBNb3JlIGlucHV0ICovCisjZGVmaW5lIEFCSVRfVUdVUlVfU1RBVFVTX1JFQURZCQkJMHgwOSAvKiBSZWFkeSB0byBiZSB3cml0dGVuICovCisKKy8qIENvbnN0YW50cyAqLworLyogaW4gKFZvbHQpIHNlbnNvcnMgZ28gdXAgdG8gMzQ5NCBtViwgdGVtcCB0byAyNTUwMDAgbWlsbGlkZWdyZWVzIENlbHNpdXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgYWJpdHVndXJ1X2JhbmsxX21heF92YWx1ZVsyXSA9IHsgMzQ5NCwgMjU1MDAwIH07CisvKiBNaW4gLyBNYXggYWxsb3dlZCB2YWx1ZXMgZm9yIHNlbnNvcjIgKGZhbikgYWxhcm0gdGhyZXNob2xkLCB0aGVzZSB2YWx1ZXMKKyAgIGNvcnJlc3BvbmQgdG8gMzAwLTMwMDAgUlBNICovCitzdGF0aWMgY29uc3QgdTggYWJpdHVndXJ1X2JhbmsyX21pbl90aHJlc2hvbGQgPSA1Oworc3RhdGljIGNvbnN0IHU4IGFiaXR1Z3VydV9iYW5rMl9tYXhfdGhyZXNob2xkID0gNTA7CisvKiBSZWdpc3RlciAwIGlzIGEgYml0ZmllbGQsIDEgYW5kIDIgYXJlIHB3bSBzZXR0aW5ncyAoMjU1ID0gMTAwJSksIDMgYW5kIDQKKyAgIGFyZSB0ZW1wZXJhdHVyZSB0cmlwIHBvaW50cy4gKi8KK3N0YXRpYyBjb25zdCBpbnQgYWJpdHVndXJ1X3B3bV9zZXR0aW5nc19tdWx0aXBsaWVyWzVdID0geyAwLCAxLCAxLCAxMDAwLCAxMDAwIH07CisvKiBNaW4gLyBNYXggYWxsb3dlZCB2YWx1ZXMgZm9yIHB3bV9zZXR0aW5ncy4gTm90ZTogcHdtMSAoQ1BVIGZhbikgaXMgYQorICAgc3BlY2lhbCBjYXNlIHRoZSBtaW5pdW0gYWxsb3dlZCBwd20lIHNldHRpbmcgZm9yIHRoaXMgaXMgMzAlICg3Nykgb24KKyAgIHNvbWUgTUIncyB0aGlzIHNwZWNpYWwgY2FzZSBpcyBoYW5kbGVkIGluIHRoZSBjb2RlISAqLworc3RhdGljIGNvbnN0IHU4IGFiaXR1Z3VydV9wd21fbWluWzVdID0geyAwLCAxNzAsIDE3MCwgMjUsIDI1IH07CitzdGF0aWMgY29uc3QgdTggYWJpdHVndXJ1X3B3bV9tYXhbNV0gPSB7IDAsIDI1NSwgMjU1LCA3NSwgNzUgfTsKKworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZvcmNlLCAiU2V0IHRvIG9uZSB0byBmb3JjZSBkZXRlY3Rpb24uIik7CitzdGF0aWMgaW50IGZhbl9zZW5zb3JzOworbW9kdWxlX3BhcmFtKGZhbl9zZW5zb3JzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhmYW5fc2Vuc29ycywgIk51bWJlciBvZiBmYW4gc2Vuc29ycyBvbiB0aGUgdUd1cnUgIgorCSIoMCA9IGF1dG9kZXRlY3QpIik7CitzdGF0aWMgaW50IHB3bXM7Cittb2R1bGVfcGFyYW0ocHdtcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHdtcywgIk51bWJlciBvZiBQV01zIG9uIHRoZSB1R3VydSAiCisJIigwID0gYXV0b2RldGVjdCkiKTsKKworLyogRGVmYXVsdCB2ZXJib3NlIGlzIDIsIHNpbmNlIHRoaXMgZHJpdmVyIGlzIHN0aWxsIGluIHRoZSB0ZXN0aW5nIHBoYXNlICovCitzdGF0aWMgaW50IHZlcmJvc2UgPSAyOworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZlcmJvc2UsICJIb3cgdmVyYm9zZSBzaG91bGQgdGhlIGRyaXZlciBiZT8gKDAtMyk6XG4iCisJIiAgIDAgbm9ybWFsIG91dHB1dFxuIgorCSIgICAxICsgdmVyYm9zZSBlcnJvciByZXBvcnRpbmdcbiIKKwkiICAgMiArIHNlbnNvcnMgdHlwZSBwcm9iaW5nIGluZm9cbiIKKwkiICAgMyArIHJldHJ5YWJsZSBlcnJvciByZXBvcnRpbmciKTsKKworCisvKiBGb3IgdGhlIEFiaXQgdUd1cnUsIHdlIG5lZWQgdG8ga2VlcCBzb21lIGRhdGEgaW4gbWVtb3J5LgorICAgVGhlIHN0cnVjdHVyZSBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQsIGF0IHRoZSBzYW1lIHRpbWUgd2hlbiBhIG5ldworICAgYWJpdHVndXJ1IGRldmljZSBpcyBhbGxvY2F0ZWQuICovCitzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgeworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldjsgLyogaHdtb24gcmVnaXN0ZXJlZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CS8qIHByb3RlY3QgYWNjZXNzIHRvIGRhdGEgYW5kIHVHdXJ1ICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VwZGF0ZWQ7CS8qIEluIGppZmZpZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBhZGRyOwkJLyogdWd1cnUgYmFzZSBhZGRyZXNzICovCisJY2hhciB1Z3VydV9yZWFkeTsJCS8qIGlzIHRoZSB1Z3VydSBpbiByZWFkeSBzdGF0ZT8gKi8KKwl1bnNpZ25lZCBjaGFyIHVwZGF0ZV90aW1lb3V0czsJLyogbnVtYmVyIG9mIHVwZGF0ZSB0aW1lb3V0cyBzaW5jZSBsYXN0CisJCQkJCSAgIHN1Y2Nlc3NmdWwgdXBkYXRlICovCisKKwkvKiBUaGUgc3lzZnMgYXR0ciBhbmQgdGhlaXIgbmFtZXMgYXJlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCBmb3IgYmFuazEKKwkgICB3ZSBjYW5ub3QgdXNlIGEgcHJlZGVmaW5lZCBhcnJheSBiZWNhdXNlIHdlIGRvbid0IGtub3cgYmVmb3JlaGFuZAorCSAgIG9mIGEgc2Vuc29yIGlzIGEgdm9sdCBvciBhIHRlbXAgc2Vuc29yLCBmb3IgYmFuazIgYW5kIHRoZSBwd21zIGl0cworCSAgIGVhc2llciB0b2RvIHRoaW5ncyB0aGUgc2FtZSB3YXkuICBGb3IgaW4gc2Vuc29ycyB3ZSBoYXZlIDkgKHRlbXAgNykKKwkgICBzeXNmcyBlbnRyaWVzIHBlciBzZW5zb3IsIGZvciBiYW5rMiBhbmQgcHdtcyA2LiAqLworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHN5c2ZzX2F0dHJbCisJCUFCSVRfVUdVUlVfTUFYX0JBTksxX1NFTlNPUlMgKiA5ICsKKwkJQUJJVF9VR1VSVV9NQVhfQkFOSzJfU0VOU09SUyAqIDYgKyBBQklUX1VHVVJVX01BWF9QV01TICogNl07CisJLyogQnVmZmVyIHRvIHN0b3JlIHRoZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgc3lzZnMgbmFtZXMgKi8KKwljaGFyIHN5c2ZzX25hbWVzW0FCSVRVR1VSVV9TWVNGU19OQU1FU19MRU5HVEhdOworCisJLyogQmFuayAxIGRhdGEgKi8KKwkvKiBudW1iZXIgb2YgYW5kIGFkZHJlc3NlcyBvZiBbMF0gaW4sIFsxXSB0ZW1wIHNlbnNvcnMgKi8KKwl1OCBiYW5rMV9zZW5zb3JzWzJdOworCXU4IGJhbmsxX2FkZHJlc3NbMl1bQUJJVF9VR1VSVV9NQVhfQkFOSzFfU0VOU09SU107CisJdTggYmFuazFfdmFsdWVbQUJJVF9VR1VSVV9NQVhfQkFOSzFfU0VOU09SU107CisJLyogVGhpcyBhcnJheSBob2xkcyAzIGVudHJpZXMgcGVyIHNlbnNvciBmb3IgdGhlIGJhbmsgMSBzZW5zb3Igc2V0dGluZ3MKKwkgICAoZmxhZ3MsIG1pbiwgbWF4IGZvciB2b2x0YWdlIC8gZmxhZ3MsIHdhcm4sIHNodXRkb3duIGZvciB0ZW1wKS4gKi8KKwl1OCBiYW5rMV9zZXR0aW5nc1tBQklUX1VHVVJVX01BWF9CQU5LMV9TRU5TT1JTXVszXTsKKwkvKiBNYXhpbXVtIHZhbHVlIGZvciBlYWNoIHNlbnNvciB1c2VkIGZvciBzY2FsaW5nIGluIG1WL21pbGxpZGVncmVlcworCSAgIENlbHNpdXMuICovCisJaW50IGJhbmsxX21heF92YWx1ZVtBQklUX1VHVVJVX01BWF9CQU5LMV9TRU5TT1JTXTsKKworCS8qIEJhbmsgMiBkYXRhLCBBQklUX1VHVVJVX01BWF9CQU5LMl9TRU5TT1JTIGVudHJpZXMgZm9yIGJhbmsyICovCisJdTggYmFuazJfc2Vuc29yczsgLyogYWN0dWFsIG51bWJlciBvZiBiYW5rMiBzZW5zb3JzIGZvdW5kICovCisJdTggYmFuazJfdmFsdWVbQUJJVF9VR1VSVV9NQVhfQkFOSzJfU0VOU09SU107CisJdTggYmFuazJfc2V0dGluZ3NbQUJJVF9VR1VSVV9NQVhfQkFOSzJfU0VOU09SU11bMl07IC8qIGZsYWdzLCBtaW4gKi8KKworCS8qIEFsYXJtcyAyIGJ5dGVzIGZvciBiYW5rMSwgMSBieXRlIGZvciBiYW5rMiAqLworCXU4IGFsYXJtc1szXTsKKworCS8qIEZhbiBQV00gKHNwZWVkIGNvbnRyb2wpIDUgYnl0ZXMgcGVyIFBXTSAqLworCXU4IHB3bXM7IC8qIGFjdHVhbCBudW1iZXIgb2YgcHdtcyBmb3VuZCAqLworCXU4IHB3bV9zZXR0aW5nc1tBQklUX1VHVVJVX01BWF9QV01TXVs1XTsKK307CisKKy8qIHdhaXQgdGlsbCB0aGUgdWd1cnUgaXMgaW4gdGhlIHNwZWNpZmllZCBzdGF0ZSAqLworc3RhdGljIGludCBhYml0dWd1cnVfd2FpdChzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEsIHU4IHN0YXRlKQoreworCWludCB0aW1lb3V0ID0gQUJJVF9VR1VSVV9XQUlUX1RJTUVPVVQ7CisKKwl3aGlsZSAoaW5iX3AoZGF0YS0+YWRkciArIEFCSVRfVUdVUlVfREFUQSkgIT0gc3RhdGUpIHsKKwkJdGltZW91dC0tOworCQlpZiAodGltZW91dCA9PSAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFB1dCB0aGUgdWd1cnUgaW4gcmVhZHkgZm9yIGlucHV0IHN0YXRlICovCitzdGF0aWMgaW50IGFiaXR1Z3VydV9yZWFkeShzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEpCit7CisJaW50IHRpbWVvdXQgPSBBQklUX1VHVVJVX1JFQURZX1RJTUVPVVQ7CisKKwlpZiAoZGF0YS0+dWd1cnVfcmVhZHkpCisJCXJldHVybiAwOworCisJLyogUmVzZXQ/IC8gUHJlcGFyZSBmb3IgbmV4dCByZWFkL3dyaXRlIGN5Y2xlICovCisJb3V0YigweDAwLCBkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9EQVRBKTsKKworCS8qIFdhaXQgdGlsbCB0aGUgdWd1cnUgaXMgcmVhZHkgKi8KKwlpZiAoYWJpdHVndXJ1X3dhaXQoZGF0YSwgQUJJVF9VR1VSVV9TVEFUVVNfUkVBRFkpKSB7CisJCUFCSVRfVUdVUlVfREVCVUcoMSwKKwkJCSJ0aW1lb3V0IGV4Y2VlZGVkIHdhaXRpbmcgZm9yIHJlYWR5IHN0YXRlXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ21kIHBvcnQgTVVTVCBiZSByZWFkIG5vdyBhbmQgc2hvdWxkIGNvbnRhaW4gMHhBQyAqLworCXdoaWxlIChpbmJfcChkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9DTUQpICE9IDB4QUMpIHsKKwkJdGltZW91dC0tOworCQlpZiAodGltZW91dCA9PSAwKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDEsCisJCQkgICAiQ01EIHJlZyBkb2VzIG5vdCBob2xkIDB4QUMgYWZ0ZXIgcmVhZHkgY29tbWFuZFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qIEFmdGVyIHRoaXMgdGhlIEFCSVRfVUdVUlVfREFUQSBwb3J0IHNob3VsZCBjb250YWluCisJICAgQUJJVF9VR1VSVV9TVEFUVVNfSU5QVVQgKi8KKwl0aW1lb3V0ID0gQUJJVF9VR1VSVV9SRUFEWV9USU1FT1VUOworCXdoaWxlIChpbmJfcChkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9EQVRBKSAhPSBBQklUX1VHVVJVX1NUQVRVU19JTlBVVCkgeworCQl0aW1lb3V0LS07CisJCWlmICh0aW1lb3V0ID09IDApIHsKKwkJCUFCSVRfVUdVUlVfREVCVUcoMSwKKwkJCQkic3RhdGUgIT0gbW9yZSBpbnB1dCBhZnRlciByZWFkeSBjb21tYW5kXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCisJZGF0YS0+dWd1cnVfcmVhZHkgPSAxOworCXJldHVybiAwOworfQorCisvKiBTZW5kIHRoZSBiYW5rIGFuZCB0aGVuIHNlbnNvciBhZGRyZXNzIHRvIHRoZSB1R3VydSBmb3IgdGhlIG5leHQgcmVhZC93cml0ZQorICAgY3ljbGUuIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYXMgdGhlIGZpcnN0IHBhcnQgb2YgYSByZWFkL3dyaXRlIGJ5CisgICBhYml0dWd1cnVfcmVhZCBhbmQgYWJpdHVndXJ1X3dyaXRlLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBuZXZlciBiZQorICAgY2FsbGVkIGJ5IGFueSBvdGhlciBmdW5jdGlvbi4gKi8KK3N0YXRpYyBpbnQgYWJpdHVndXJ1X3NlbmRfYWRkcmVzcyhzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEsCisJdTggYmFua19hZGRyLCB1OCBzZW5zb3JfYWRkciwgaW50IHJldHJpZXMpCit7CisJLyogYXNzdW1lIHRoZSBjYWxsZXIgZG9lcyBlcnJvciBoYW5kbGluZyBpdHNlbGYgaWYgaXQgaGFzIG5vdCByZXF1ZXN0ZWQKKwkgICBhbnkgcmV0cmllcywgYW5kIHRodXMgYmUgcXVpZXQuICovCisJaW50IHJlcG9ydF9lcnJvcnMgPSByZXRyaWVzOworCisJZm9yICg7OykgeworCQkvKiBNYWtlIHN1cmUgdGhlIHVndXJ1IGlzIHJlYWR5IGFuZCB0aGVuIHNlbmQgdGhlIGJhbmsgYWRkcmVzcywKKwkJICAgYWZ0ZXIgdGhpcyB0aGUgdWd1cnUgaXMgbm8gbG9uZ2VyICJyZWFkeSIuICovCisJCWlmIChhYml0dWd1cnVfcmVhZHkoZGF0YSkgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlvdXRiKGJhbmtfYWRkciwgZGF0YS0+YWRkciArIEFCSVRfVUdVUlVfREFUQSk7CisJCWRhdGEtPnVndXJ1X3JlYWR5ID0gMDsKKworCQkvKiBXYWl0IHRpbGwgdGhlIHVndXJ1IGlzIEFCSVRfVUdVUlVfU1RBVFVTX0lOUFVUIHN0YXRlIGFnYWluCisJCSAgIGFuZCBzZW5kIHRoZSBzZW5zb3IgYWRkciAqLworCQlpZiAoYWJpdHVndXJ1X3dhaXQoZGF0YSwgQUJJVF9VR1VSVV9TVEFUVVNfSU5QVVQpKSB7CisJCQlpZiAocmV0cmllcykgeworCQkJCUFCSVRfVUdVUlVfREVCVUcoMywgInRpbWVvdXQgZXhjZWVkZWQgIgorCQkJCQkid2FpdGluZyBmb3IgbW9yZSBpbnB1dCBzdGF0ZSwgJWQgIgorCQkJCQkidHJpZXMgcmVtYWluaW5nXG4iLCByZXRyaWVzKTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGVfdGltZW91dChBQklUX1VHVVJVX1JFVFJZX0RFTEFZKTsKKwkJCQlyZXRyaWVzLS07CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocmVwb3J0X2Vycm9ycykKKwkJCQlBQklUX1VHVVJVX0RFQlVHKDEsICJ0aW1lb3V0IGV4Y2VlZGVkICIKKwkJCQkJIndhaXRpbmcgZm9yIG1vcmUgaW5wdXQgc3RhdGUgIgorCQkJCQkiKGJhbms6ICVkKVxuIiwgKGludCliYW5rX2FkZHIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlvdXRiKHNlbnNvcl9hZGRyLCBkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9DTUQpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIFJlYWQgY291bnQgYnl0ZXMgZnJvbSBzZW5zb3Igc2Vuc29yX2FkZHIgaW4gYmFuayBiYW5rX2FkZHIgYW5kIHN0b3JlIHRoZQorICAgcmVzdWx0IGluIGJ1ZiwgcmV0cnkgdGhlIHNlbmQgYWRkcmVzcyBwYXJ0IG9mIHRoZSByZWFkIHJldHJpZXMgdGltZXMuICovCitzdGF0aWMgaW50IGFiaXR1Z3VydV9yZWFkKHN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSwKKwl1OCBiYW5rX2FkZHIsIHU4IHNlbnNvcl9hZGRyLCB1OCAqYnVmLCBpbnQgY291bnQsIGludCByZXRyaWVzKQoreworCWludCBpOworCisJLyogU2VuZCB0aGUgYWRkcmVzcyAqLworCWkgPSBhYml0dWd1cnVfc2VuZF9hZGRyZXNzKGRhdGEsIGJhbmtfYWRkciwgc2Vuc29yX2FkZHIsIHJldHJpZXMpOworCWlmIChpKQorCQlyZXR1cm4gaTsKKworCS8qIEFuZCByZWFkIHRoZSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKGFiaXR1Z3VydV93YWl0KGRhdGEsIEFCSVRfVUdVUlVfU1RBVFVTX1JFQUQpKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDEsICJ0aW1lb3V0IGV4Y2VlZGVkIHdhaXRpbmcgZm9yICIKKwkJCQkicmVhZCBzdGF0ZSAoYmFuazogJWQsIHNlbnNvcjogJWQpXG4iLAorCQkJCShpbnQpYmFua19hZGRyLCAoaW50KXNlbnNvcl9hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJCWJ1ZltpXSA9IGluYihkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9DTUQpOworCX0KKworCS8qIExhc3QgcHV0IHRoZSBjaGlwIGJhY2sgaW4gcmVhZHkgc3RhdGUgKi8KKwlhYml0dWd1cnVfcmVhZHkoZGF0YSk7CisKKwlyZXR1cm4gaTsKK30KKworLyogV3JpdGUgY291bnQgYnl0ZXMgZnJvbSBidWYgdG8gc2Vuc29yIHNlbnNvcl9hZGRyIGluIGJhbmsgYmFua19hZGRyLCB0aGUgc2VuZAorICAgYWRkcmVzcyBwYXJ0IG9mIHRoZSB3cml0ZSBpcyBhbHdheXMgcmV0cmllZCBBQklUX1VHVVJVX01BWF9SRVRSSUVTIHRpbWVzLiAqLworc3RhdGljIGludCBhYml0dWd1cnVfd3JpdGUoc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhLAorCXU4IGJhbmtfYWRkciwgdTggc2Vuc29yX2FkZHIsIHU4ICpidWYsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKworCS8qIFNlbmQgdGhlIGFkZHJlc3MgKi8KKwlpID0gYWJpdHVndXJ1X3NlbmRfYWRkcmVzcyhkYXRhLCBiYW5rX2FkZHIsIHNlbnNvcl9hZGRyLAorCQlBQklUX1VHVVJVX01BWF9SRVRSSUVTKTsKKwlpZiAoaSkKKwkJcmV0dXJuIGk7CisKKwkvKiBBbmQgd3JpdGUgdGhlIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlpZiAoYWJpdHVndXJ1X3dhaXQoZGF0YSwgQUJJVF9VR1VSVV9TVEFUVVNfV1JJVEUpKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDEsICJ0aW1lb3V0IGV4Y2VlZGVkIHdhaXRpbmcgZm9yICIKKwkJCQkid3JpdGUgc3RhdGUgKGJhbms6ICVkLCBzZW5zb3I6ICVkKVxuIiwKKwkJCQkoaW50KWJhbmtfYWRkciwgKGludClzZW5zb3JfYWRkcik7CisJCQlicmVhazsKKwkJfQorCQlvdXRiKGJ1ZltpXSwgZGF0YS0+YWRkciArIEFCSVRfVUdVUlVfQ01EKTsKKwl9CisKKwkvKiBOb3cgd2UgbmVlZCB0byB3YWl0IHRpbGwgdGhlIGNoaXAgaXMgcmVhZHkgdG8gYmUgcmVhZCBhZ2FpbiwKKwkgICBkb24ndCBhc2sgd2h5ICovCisJaWYgKGFiaXR1Z3VydV93YWl0KGRhdGEsIEFCSVRfVUdVUlVfU1RBVFVTX1JFQUQpKSB7CisJCUFCSVRfVUdVUlVfREVCVUcoMSwgInRpbWVvdXQgZXhjZWVkZWQgd2FpdGluZyBmb3IgcmVhZCBzdGF0ZSAiCisJCQkiYWZ0ZXIgd3JpdGUgKGJhbms6ICVkLCBzZW5zb3I6ICVkKVxuIiwgKGludCliYW5rX2FkZHIsCisJCQkoaW50KXNlbnNvcl9hZGRyKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ21kIHBvcnQgTVVTVCBiZSByZWFkIG5vdyBhbmQgc2hvdWxkIGNvbnRhaW4gMHhBQyAqLworCWlmIChpbmJfcChkYXRhLT5hZGRyICsgQUJJVF9VR1VSVV9DTUQpICE9IDB4QUMpIHsKKwkJQUJJVF9VR1VSVV9ERUJVRygxLCAiQ01EIHJlZyBkb2VzIG5vdCBob2xkIDB4QUMgYWZ0ZXIgd3JpdGUgIgorCQkJIihiYW5rOiAlZCwgc2Vuc29yOiAlZClcbiIsIChpbnQpYmFua19hZGRyLAorCQkJKGludClzZW5zb3JfYWRkcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIExhc3QgcHV0IHRoZSBjaGlwIGJhY2sgaW4gcmVhZHkgc3RhdGUgKi8KKwlhYml0dWd1cnVfcmVhZHkoZGF0YSk7CisKKwlyZXR1cm4gaTsKK30KKworLyogRGV0ZWN0IHNlbnNvciB0eXBlLiBUZW1wIGFuZCBWb2x0IHNlbnNvcnMgYXJlIGVuYWJsZWQgd2l0aAorICAgZGlmZmVyZW50IG1hc2tzIGFuZCB3aWxsIGlnbm9yZSBlbmFibGUgbWFza3Mgbm90IG1lYW50IGZvciB0aGVtLgorICAgVGhpcyBlbmFibGVzIHVzIHRvIHRlc3Qgd2hhdCBraW5kIG9mIHNlbnNvciB3ZSdyZSBkZWFsaW5nIHdpdGguCisgICBCeSBzZXR0aW5nIHRoZSBhbGFybSB0aHJlc2hvbGRzIHNvIHRoYXQgd2Ugd2lsbCBhbHdheXMgZ2V0IGFuCisgICBhbGFybSBmb3Igc2Vuc29yIHR5cGUgWCBhbmQgdGhlbiBlbmFibGluZyB0aGUgc2Vuc29yIGFzIHNlbnNvciB0eXBlCisgICBYLCBpZiB3ZSB0aGVuIGdldCBhbiBhbGFybSBpdCBpcyBhIHNlbnNvciBvZiB0eXBlIFguICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAorYWJpdHVndXJ1X2RldGVjdF9iYW5rMV9zZW5zb3JfdHlwZShzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEsCisJCQkJICAgdTggc2Vuc29yX2FkZHIpCit7CisJdTggdmFsLCBidWZbM107CisJaW50IHJldCA9IEFCSVRfVUdVUlVfTkM7CisKKwkvKiBGaXJzdCByZWFkIHRoZSBzZW5zb3IgYW5kIHRoZSBjdXJyZW50IHNldHRpbmdzICovCisJaWYgKGFiaXR1Z3VydV9yZWFkKGRhdGEsIEFCSVRfVUdVUlVfU0VOU09SX0JBTksxLCBzZW5zb3JfYWRkciwgJnZhbCwKKwkJCTEsIEFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJLyogVGVzdCB2YWwgaXMgc2FuZSAvIHVzYWJsZSBmb3Igc2Vuc29yIHR5cGUgZGV0ZWN0aW9uLiAqLworCWlmICgodmFsIDwgMTB1KSB8fCAodmFsID4gMjQwdSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBBQklUX1VHVVJVX05BTUUKKwkJCSI6IGJhbmsxLXNlbnNvcjogJWQgcmVhZGluZyAoJWQpIHRvbyBjbG9zZSB0byBsaW1pdHMsICIKKwkJCSJ1bmFibGUgdG8gZGV0ZXJtaW5lIHNlbnNvciB0eXBlLCBza2lwcGluZyBzZW5zb3JcbiIsCisJCQkoaW50KXNlbnNvcl9hZGRyLCAoaW50KXZhbCk7CisJCS8qIGFzc3VtZSBubyBzZW5zb3IgaXMgdGhlcmUgZm9yIHNlbnNvcnMgZm9yIHdoaWNoIHdlIGNhbid0CisJCSAgIGRldGVybWluZSB0aGUgc2Vuc29yIHR5cGUgYmVjYXVzZSB0aGVpciByZWFkaW5nIGlzIHRvbyBjbG9zZQorCQkgICB0byB0aGVpciBsaW1pdHMsIHRoaXMgdXN1YWxseSBtZWFucyBubyBzZW5zb3IgaXMgdGhlcmUuICovCisJCXJldHVybiBBQklUX1VHVVJVX05DOworCX0KKworCUFCSVRfVUdVUlVfREVCVUcoMiwgInRlc3RpbmcgYmFuazEgc2Vuc29yICVkXG4iLCAoaW50KXNlbnNvcl9hZGRyKTsKKwkvKiBWb2x0IHNlbnNvciB0ZXN0LCBlbmFibGUgdm9sdCBsb3cgYWxhcm0sIHNldCBtaW4gdmFsdWUgcmlkaWNvdXNseQorCSAgIGhpZ2guIElmIGl0cyBhIHZvbHQgc2Vuc29yIHRoaXMgc2hvdWxkIGFsd2F5cyBnaXZlIHVzIGFuIGFsYXJtLiAqLworCWJ1ZlswXSA9IEFCSVRfVUdVUlVfVk9MVF9MT1dfQUxBUk1fRU5BQkxFOworCWJ1ZlsxXSA9IDI0NTsKKwlidWZbMl0gPSAyNTA7CisJaWYgKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMSArIDIsIHNlbnNvcl9hZGRyLAorCQkJYnVmLCAzKSAhPSAzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBOb3cgd2UgbmVlZCAyMCBtcyB0byBnaXZlIHRoZSB1Z3VydSB0aW1lIHRvIHJlYWQgdGhlIHNlbnNvcnMKKwkgICBhbmQgcmFpc2UgYSB2b2x0YWdlIGFsYXJtICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovNTApOworCS8qIENoZWNrIGZvciBhbGFybSBhbmQgY2hlY2sgdGhlIGFsYXJtIGlzIGEgdm9sdCBsb3cgYWxhcm0uICovCisJaWYgKGFiaXR1Z3VydV9yZWFkKGRhdGEsIEFCSVRfVUdVUlVfQUxBUk1fQkFOSywgMCwgYnVmLCAzLAorCQkJQUJJVF9VR1VSVV9NQVhfUkVUUklFUykgIT0gMykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGJ1ZltzZW5zb3JfYWRkci84XSAmICgweDAxIDw8IChzZW5zb3JfYWRkciAlIDgpKSkgeworCQlpZiAoYWJpdHVndXJ1X3JlYWQoZGF0YSwgQUJJVF9VR1VSVV9TRU5TT1JfQkFOSzEgKyAxLAorCQkJCXNlbnNvcl9hZGRyLCBidWYsIDMsCisJCQkJQUJJVF9VR1VSVV9NQVhfUkVUUklFUykgIT0gMykKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoYnVmWzBdICYgQUJJVF9VR1VSVV9WT0xUX0xPV19BTEFSTV9GTEFHKSB7CisJCQkvKiBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzICovCisJCQlpZiAoYWJpdHVndXJ1X3dyaXRlKGRhdGEsIEFCSVRfVUdVUlVfU0VOU09SX0JBTksxICsgMiwKKwkJCQkJc2Vuc29yX2FkZHIsCisJCQkJCWRhdGEtPmJhbmsxX3NldHRpbmdzW3NlbnNvcl9hZGRyXSwKKwkJCQkJMykgIT0gMykKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCUFCSVRfVUdVUlVfREVCVUcoMiwgIiAgZm91bmQgdm9sdCBzZW5zb3JcbiIpOworCQkJcmV0dXJuIEFCSVRfVUdVUlVfSU5fU0VOU09SOworCQl9IGVsc2UKKwkJCUFCSVRfVUdVUlVfREVCVUcoMiwgIiAgYWxhcm0gcmFpc2VkIGR1cmluZyB2b2x0ICIKKwkJCQkic2Vuc29yIHRlc3QsIGJ1dCB2b2x0IGxvdyBmbGFnIG5vdCBzZXRcbiIpOworCX0gZWxzZQorCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIGFsYXJtIG5vdCByYWlzZWQgZHVyaW5nIHZvbHQgc2Vuc29yICIKKwkJCSJ0ZXN0XG4iKTsKKworCS8qIFRlbXAgc2Vuc29yIHRlc3QsIGVuYWJsZSBzZW5zb3IgYXMgYSB0ZW1wIHNlbnNvciwgc2V0IGJlZXAgdmFsdWUKKwkgICByaWRpY291c2x5IGxvdyAoYnV0IG5vdCB0b28gbG93LCBvdGhlcndpc2UgdWd1cnUgaWdub3JlcyBpdCkuCisJICAgSWYgaXRzIGEgdGVtcCBzZW5zb3IgdGhpcyBzaG91bGQgYWx3YXlzIGdpdmUgdXMgYW4gYWxhcm0uICovCisJYnVmWzBdID0gQUJJVF9VR1VSVV9URU1QX0hJR0hfQUxBUk1fRU5BQkxFOworCWJ1ZlsxXSA9IDU7CisJYnVmWzJdID0gMTA7CisJaWYgKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMSArIDIsIHNlbnNvcl9hZGRyLAorCQkJYnVmLCAzKSAhPSAzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBOb3cgd2UgbmVlZCA1MCBtcyB0byBnaXZlIHRoZSB1Z3VydSB0aW1lIHRvIHJlYWQgdGhlIHNlbnNvcnMKKwkgICBhbmQgcmFpc2UgYSB0ZW1wIGFsYXJtICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovMjApOworCS8qIENoZWNrIGZvciBhbGFybSBhbmQgY2hlY2sgdGhlIGFsYXJtIGlzIGEgdGVtcCBoaWdoIGFsYXJtLiAqLworCWlmIChhYml0dWd1cnVfcmVhZChkYXRhLCBBQklUX1VHVVJVX0FMQVJNX0JBTkssIDAsIGJ1ZiwgMywKKwkJCUFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDMpCisJCXJldHVybiAtRU5PREVWOworCWlmIChidWZbc2Vuc29yX2FkZHIvOF0gJiAoMHgwMSA8PCAoc2Vuc29yX2FkZHIgJSA4KSkpIHsKKwkJaWYgKGFiaXR1Z3VydV9yZWFkKGRhdGEsIEFCSVRfVUdVUlVfU0VOU09SX0JBTksxICsgMSwKKwkJCQlzZW5zb3JfYWRkciwgYnVmLCAzLAorCQkJCUFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGJ1ZlswXSAmIEFCSVRfVUdVUlVfVEVNUF9ISUdIX0FMQVJNX0ZMQUcpIHsKKwkJCXJldCA9IEFCSVRfVUdVUlVfVEVNUF9TRU5TT1I7CisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIGZvdW5kIHRlbXAgc2Vuc29yXG4iKTsKKwkJfSBlbHNlCisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIGFsYXJtIHJhaXNlZCBkdXJpbmcgdGVtcCAiCisJCQkJInNlbnNvciB0ZXN0LCBidXQgdGVtcCBoaWdoIGZsYWcgbm90IHNldFxuIik7CisJfSBlbHNlCisJCUFCSVRfVUdVUlVfREVCVUcoMiwgIiAgYWxhcm0gbm90IHJhaXNlZCBkdXJpbmcgdGVtcCBzZW5zb3IgIgorCQkJInRlc3RcbiIpOworCisJLyogUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncyAqLworCWlmIChhYml0dWd1cnVfd3JpdGUoZGF0YSwgQUJJVF9VR1VSVV9TRU5TT1JfQkFOSzEgKyAyLCBzZW5zb3JfYWRkciwKKwkJCWRhdGEtPmJhbmsxX3NldHRpbmdzW3NlbnNvcl9hZGRyXSwgMykgIT0gMykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBUaGVzZSBmdW5jdGlvbnMgdHJ5IHRvIGZpbmQgb3V0IGhvdyBtYW55IHNlbnNvcnMgdGhlcmUgYXJlIGluIGJhbmsyIGFuZCBob3cKKyAgIG1hbnkgcHdtcyB0aGVyZSBhcmUuIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ2l2ZQorICAgdGhlIHVzZXIgdGhlIHBvc3NpYmlsaXR5IHRvIGNoYW5nZSBzZXR0aW5ncyBmb3Igbm9uLWV4aXN0ZW50IHNlbnNvcnMgLyBwd20uCisgICBUaGUgdUd1cnUgd2lsbCBoYXBwaWx5IHJlYWQgLyB3cml0ZSB3aGF0ZXZlciBtZW1vcnkgaGFwcGVucyB0byBiZSBhZnRlciB0aGUKKyAgIG1lbW9yeSBzdG9yaW5nIHRoZSBQV00gc2V0dGluZ3Mgd2hlbiByZWFkaW5nL3dyaXRpbmcgdG8gYSBQV00gd2hpY2ggaXMgbm90CisgICB0aGVyZS4gTm90aWNlIGV2ZW4gaWYgd2UgZGV0ZWN0IGEgUFdNIHdoaWNoIGRvZXNuJ3QgZXhpc3Qgd2Ugbm9ybWFsbHkgd29uJ3QKKyAgIHdyaXRlIHRvIGl0LCB1bmxlc3MgdGhlIHVzZXIgdHJpZXMgdG8gY2hhbmdlIHRoZSBzZXR0aW5ncy4KKworICAgQWx0aG91Z2ggdGhlIHVHdXJ1IGFsbG93cyByZWFkaW5nIChzZXR0aW5ncykgZnJvbSBub24gZXhpc3RpbmcgYmFuazIKKyAgIHNlbnNvcnMsIG15IHZlcnNpb24gb2YgdGhlIHVHdXJ1IGRvZXMgc2VlbSB0byBzdG9wIHdyaXRpbmcgdG8gdGhlbSwgdGhlCisgICB3cml0ZSBmdW5jdGlvbiBhYm92ZSBhYm9ydHMgaW4gdGhpcyBjYXNlIHdpdGg6CisgICAiQ01EIHJlZyBkb2VzIG5vdCBob2xkIDB4QUMgYWZ0ZXIgd3JpdGUiCisKKyAgIE5vdGljZSB0aGVzZSAyIHRlc3RzIGFyZSBub24gZGVzdHJ1Y3RpdmUgaW93IHJlYWQtb25seSB0ZXN0cywgb3RoZXJ3aXNlCisgICB0aGV5IHdvdWxkIGRlZmVhdCB0aGVpciBwdXJwb3NlLiBBbHRob3VnaCBmb3IgdGhlIGJhbmsyX3NlbnNvcnMgZGV0ZWN0aW9uIGEKKyAgIHJlYWQvd3JpdGUgdGVzdCB3b3VsZCBiZSBmZWFzaWJsZSBiZWNhdXNlIG9mIHRoZSByZWFjdGlvbiBhYm92ZSwgSSd2ZQorICAgaG93ZXZlciBvcHRlZCB0byBzdGF5IG9uIHRoZSBzYWZlIHNpZGUuICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK2FiaXR1Z3VydV9kZXRlY3Rfbm9fYmFuazJfc2Vuc29ycyhzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlpZiAoZmFuX3NlbnNvcnMpIHsKKwkJZGF0YS0+YmFuazJfc2Vuc29ycyA9IGZhbl9zZW5zb3JzOworCQlBQklUX1VHVVJVX0RFQlVHKDIsICJhc3N1bWluZyAlZCBmYW4gc2Vuc29ycyBiZWNhdXNlIG9mICIKKwkJCSJcImZhbl9zZW5zb3JzXCIgbW9kdWxlIHBhcmFtXG4iLAorCQkJKGludClkYXRhLT5iYW5rMl9zZW5zb3JzKTsKKwkJcmV0dXJuOworCX0KKworCUFCSVRfVUdVUlVfREVCVUcoMiwgImRldGVjdGluZyBudW1iZXIgb2YgZmFuIHNlbnNvcnNcbiIpOworCWZvciAoaSA9IDA7IGkgPCBBQklUX1VHVVJVX01BWF9CQU5LMl9TRU5TT1JTOyBpKyspIHsKKwkJLyogMHg4OSBhcmUgdGhlIGtub3duIHVzZWQgYml0czoKKwkJICAgLTB4ODAgZW5hYmxlIHNodXRkb3duCisJCSAgIC0weDA4IGVuYWJsZSBiZWVwCisJCSAgIC0weDAxIGVuYWJsZSBhbGFybQorCQkgICBBbGwgb3RoZXIgYml0cyBzaG91bGQgYmUgMCwgYnV0IG9uIHNvbWUgbW90aGVyYm9hcmRzCisJCSAgIDB4NDAgKGJpdCA2KSBpcyBhbHNvIGhpZ2ggZm9yIHNvbWUgb2YgdGhlIGZhbnM/PyAqLworCQlpZiAoZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMF0gJiB+MHhDOSkgeworCQkJQUJJVF9VR1VSVV9ERUJVRygyLCAiICBiYW5rMiBzZW5zb3IgJWQgZG9lcyBub3Qgc2VlbSAiCisJCQkJInRvIGJlIGEgZmFuIHNlbnNvcjogc2V0dGluZ3NbMF0gPSAlMDJYXG4iLAorCQkJCWksICh1bnNpZ25lZCBpbnQpZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMF0pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBpZiB0aGUgdGhyZXNob2xkIGlzIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAqLworCQlpZiAoZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMV0gPAorCQkJCWFiaXR1Z3VydV9iYW5rMl9taW5fdGhyZXNob2xkKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIGJhbmsyIHNlbnNvciAlZCBkb2VzIG5vdCBzZWVtICIKKwkJCQkidG8gYmUgYSBmYW4gc2Vuc29yOiB0aGUgdGhyZXNob2xkICglZCkgaXMgIgorCQkJCSJiZWxvdyB0aGUgbWluaW11bSAoJWQpXG4iLCBpLAorCQkJCShpbnQpZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMV0sCisJCQkJKGludClhYml0dWd1cnVfYmFuazJfbWluX3RocmVzaG9sZCk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMV0gPgorCQkJCWFiaXR1Z3VydV9iYW5rMl9tYXhfdGhyZXNob2xkKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIGJhbmsyIHNlbnNvciAlZCBkb2VzIG5vdCBzZWVtICIKKwkJCQkidG8gYmUgYSBmYW4gc2Vuc29yOiB0aGUgdGhyZXNob2xkICglZCkgaXMgIgorCQkJCSJhYm92ZSB0aGUgbWF4aW11bSAoJWQpXG4iLCBpLAorCQkJCShpbnQpZGF0YS0+YmFuazJfc2V0dGluZ3NbaV1bMV0sCisJCQkJKGludClhYml0dWd1cnVfYmFuazJfbWF4X3RocmVzaG9sZCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWRhdGEtPmJhbmsyX3NlbnNvcnMgPSBpOworCUFCSVRfVUdVUlVfREVCVUcoMiwgIiBmb3VuZDogJWQgZmFuIHNlbnNvcnNcbiIsCisJCShpbnQpZGF0YS0+YmFuazJfc2Vuc29ycyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAorYWJpdHVndXJ1X2RldGVjdF9ub19wd21zKHN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSkKK3sKKwlpbnQgaSwgajsKKworCWlmIChwd21zKSB7CisJCWRhdGEtPnB3bXMgPSBwd21zOworCQlBQklUX1VHVVJVX0RFQlVHKDIsICJhc3N1bWluZyAlZCBQV00gb3V0cHV0cyBiZWNhdXNlIG9mICIKKwkJCSJcInB3bXNcIiBtb2R1bGUgcGFyYW1cbiIsIChpbnQpZGF0YS0+cHdtcyk7CisJCXJldHVybjsKKwl9CisKKwlBQklUX1VHVVJVX0RFQlVHKDIsICJkZXRlY3RpbmcgbnVtYmVyIG9mIFBXTSBvdXRwdXRzXG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgQUJJVF9VR1VSVV9NQVhfUFdNUzsgaSsrKSB7CisJCS8qIDB4ODAgaXMgdGhlIGVuYWJsZSBiaXQgYW5kIHRoZSBsb3cKKwkJICAgbmliYmxlIGlzIHdoaWNoIHRlbXAgc2Vuc29yIHRvIHVzZSwKKwkJICAgdGhlIG90aGVyIGJpdHMgc2hvdWxkIGJlIDAgKi8KKwkJaWYgKGRhdGEtPnB3bV9zZXR0aW5nc1tpXVswXSAmIH4weDhGKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIHB3bSBjaGFubmVsICVkIGRvZXMgbm90IHNlZW0gIgorCQkJCSJ0byBiZSBhIHB3bSBjaGFubmVsOiBzZXR0aW5nc1swXSA9ICUwMlhcbiIsCisJCQkJaSwgKHVuc2lnbmVkIGludClkYXRhLT5wd21fc2V0dGluZ3NbaV1bMF0pOworCQkJYnJlYWs7CisJCX0KKworCQkvKiB0aGUgbG93IG5pYmJsZSBtdXN0IGNvcnJlc3BvbmQgdG8gb25lIG9mIHRoZSB0ZW1wIHNlbnNvcnMKKwkJICAgd2UndmUgZm91bmQgKi8KKwkJZm9yIChqID0gMDsgaiA8IGRhdGEtPmJhbmsxX3NlbnNvcnNbQUJJVF9VR1VSVV9URU1QX1NFTlNPUl07CisJCQkJaisrKSB7CisJCQlpZiAoZGF0YS0+YmFuazFfYWRkcmVzc1tBQklUX1VHVVJVX1RFTVBfU0VOU09SXVtqXSA9PQorCQkJCQkoZGF0YS0+cHdtX3NldHRpbmdzW2ldWzBdICYgMHgwRikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGogPT0gZGF0YS0+YmFuazFfc2Vuc29yc1tBQklUX1VHVVJVX1RFTVBfU0VOU09SXSkgeworCQkJQUJJVF9VR1VSVV9ERUJVRygyLCAiICBwd20gY2hhbm5lbCAlZCBkb2VzIG5vdCBzZWVtICIKKwkJCQkidG8gYmUgYSBwd20gY2hhbm5lbDogJWQgaXMgbm90IGEgdmFsaWQgdGVtcCAiCisJCQkJInNlbnNvciBhZGRyZXNzXG4iLCBpLAorCQkJCWRhdGEtPnB3bV9zZXR0aW5nc1tpXVswXSAmIDB4MEYpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBjaGVjayBpZiBhbGwgb3RoZXIgc2V0dGluZ3MgYXJlIHdpdGhpbiB0aGUgYWxsb3dlZCByYW5nZSAqLworCQlmb3IgKGogPSAxOyBqIDwgNTsgaisrKSB7CisJCQl1OCBtaW47CisJCQkvKiBzcGVjaWFsIGNhc2UgcHdtMSBtaW4gcHdtJSAqLworCQkJaWYgKChpID09IDApICYmICgoaiA9PSAxKSB8fCAoaiA9PSAyKSkpCisJCQkJbWluID0gNzc7CisJCQllbHNlCisJCQkJbWluID0gYWJpdHVndXJ1X3B3bV9taW5bal07CisJCQlpZiAoZGF0YS0+cHdtX3NldHRpbmdzW2ldW2pdIDwgbWluKSB7CisJCQkJQUJJVF9VR1VSVV9ERUJVRygyLCAiICBwd20gY2hhbm5lbCAlZCBkb2VzICIKKwkJCQkJIm5vdCBzZWVtIHRvIGJlIGEgcHdtIGNoYW5uZWw6ICIKKwkJCQkJInNldHRpbmcgJWQgKCVkKSBpcyBiZWxvdyB0aGUgbWluaW11bSAiCisJCQkJCSJ2YWx1ZSAoJWQpXG4iLCBpLCBqLAorCQkJCQkoaW50KWRhdGEtPnB3bV9zZXR0aW5nc1tpXVtqXSwKKwkJCQkJKGludCltaW4pOworCQkJCWdvdG8gYWJpdHVndXJ1X2RldGVjdF9ub19wd21zX2V4aXQ7CisJCQl9CisJCQlpZiAoZGF0YS0+cHdtX3NldHRpbmdzW2ldW2pdID4gYWJpdHVndXJ1X3B3bV9tYXhbal0pIHsKKwkJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIHB3bSBjaGFubmVsICVkIGRvZXMgIgorCQkJCQkibm90IHNlZW0gdG8gYmUgYSBwd20gY2hhbm5lbDogIgorCQkJCQkic2V0dGluZyAlZCAoJWQpIGlzIGFib3ZlIHRoZSBtYXhpbXVtICIKKwkJCQkJInZhbHVlICglZClcbiIsIGksIGosCisJCQkJCShpbnQpZGF0YS0+cHdtX3NldHRpbmdzW2ldW2pdLAorCQkJCQkoaW50KWFiaXR1Z3VydV9wd21fbWF4W2pdKTsKKwkJCQlnb3RvIGFiaXR1Z3VydV9kZXRlY3Rfbm9fcHdtc19leGl0OworCQkJfQorCQl9CisKKwkJLyogY2hlY2sgdGhhdCBtaW4gdGVtcCA8IG1heCB0ZW1wIGFuZCBtaW4gcHdtIDwgbWF4IHB3bSAqLworCQlpZiAoZGF0YS0+cHdtX3NldHRpbmdzW2ldWzFdID49IGRhdGEtPnB3bV9zZXR0aW5nc1tpXVsyXSkgeworCQkJQUJJVF9VR1VSVV9ERUJVRygyLCAiICBwd20gY2hhbm5lbCAlZCBkb2VzIG5vdCBzZWVtICIKKwkJCQkidG8gYmUgYSBwd20gY2hhbm5lbDogbWluIHB3bSAoJWQpID49ICIKKwkJCQkibWF4IHB3bSAoJWQpXG4iLCBpLAorCQkJCShpbnQpZGF0YS0+cHdtX3NldHRpbmdzW2ldWzFdLAorCQkJCShpbnQpZGF0YS0+cHdtX3NldHRpbmdzW2ldWzJdKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkYXRhLT5wd21fc2V0dGluZ3NbaV1bM10gPj0gZGF0YS0+cHdtX3NldHRpbmdzW2ldWzRdKSB7CisJCQlBQklUX1VHVVJVX0RFQlVHKDIsICIgIHB3bSBjaGFubmVsICVkIGRvZXMgbm90IHNlZW0gIgorCQkJCSJ0byBiZSBhIHB3bSBjaGFubmVsOiBtaW4gdGVtcCAoJWQpID49ICIKKwkJCQkibWF4IHRlbXAgKCVkKVxuIiwgaSwKKwkJCQkoaW50KWRhdGEtPnB3bV9zZXR0aW5nc1tpXVszXSwKKwkJCQkoaW50KWRhdGEtPnB3bV9zZXR0aW5nc1tpXVs0XSk7CisJCQlicmVhazsKKwkJfQorCX0KKworYWJpdHVndXJ1X2RldGVjdF9ub19wd21zX2V4aXQ6CisJZGF0YS0+cHdtcyA9IGk7CisJQUJJVF9VR1VSVV9ERUJVRygyLCAiIGZvdW5kOiAlZCBQV00gb3V0cHV0c1xuIiwgKGludClkYXRhLT5wd21zKTsKK30KKworLyogRm9sbG93aW5nIGFyZSB0aGUgc3lzZnMgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGVzZSBmdW5jdGlvbnMgZXhwZWN0OgorICAgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMi0+aW5kZXg6ICAgc2Vuc29yIGFkZHJlc3Mvb2Zmc2V0IGluIHRoZSBiYW5rCisgICBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yLT5ucjogICAgICByZWdpc3RlciBvZmZzZXQsIGJpdG1hc2sgb3IgTkEuICovCitzdGF0aWMgc3RydWN0IGFiaXR1Z3VydV9kYXRhICphYml0dWd1cnVfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCitzdGF0aWMgc3NpemVfdCBzaG93X2JhbmsxX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gYWJpdHVndXJ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlPOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoZGF0YS0+YmFuazFfdmFsdWVbYXR0ci0+aW5kZXhdICoKKwkJZGF0YS0+YmFuazFfbWF4X3ZhbHVlW2F0dHItPmluZGV4XSArIDEyOCkgLyAyNTUpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JhbmsxX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJKGRhdGEtPmJhbmsxX3NldHRpbmdzW2F0dHItPmluZGV4XVthdHRyLT5ucl0gKgorCQlkYXRhLT5iYW5rMV9tYXhfdmFsdWVbYXR0ci0+aW5kZXhdICsgMTI4KSAvIDI1NSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmFuazJfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBhYml0dWd1cnVfdXBkYXRlX2RldmljZShkZXYpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5iYW5rMl92YWx1ZVthdHRyLT5pbmRleF0gKgorCQlBQklUX1VHVVJVX0ZBTl9NQVggKyAxMjgpIC8gMjU1KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19iYW5rMl9zZXR0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCShkYXRhLT5iYW5rMl9zZXR0aW5nc1thdHRyLT5pbmRleF1bYXR0ci0+bnJdICoKKwkJQUJJVF9VR1VSVV9GQU5fTUFYICsgMTI4KSAvIDI1NSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2JhbmsxX3NldHRpbmcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCSpkZXZhdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOworCXN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXU4IHZhbCA9IChzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSAqIDI1NSArCisJCWRhdGEtPmJhbmsxX21heF92YWx1ZVthdHRyLT5pbmRleF0vMikgLworCQlkYXRhLT5iYW5rMV9tYXhfdmFsdWVbYXR0ci0+aW5kZXhdOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKGRhdGEtPmJhbmsxX3NldHRpbmdzW2F0dHItPmluZGV4XVthdHRyLT5ucl0gIT0gdmFsKSB7CisJCXU4IG9yaWdfdmFsID0gZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXTsKKwkJZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9IHZhbDsKKwkJaWYgKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMSArIDIsCisJCQkJYXR0ci0+aW5kZXgsIGRhdGEtPmJhbmsxX3NldHRpbmdzW2F0dHItPmluZGV4XSwKKwkJCQkzKSA8PSBhdHRyLT5ucikgeworCQkJZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9IG9yaWdfdmFsOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9iYW5rMl9zZXR0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCB2YWwgPSAoc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCkqMjU1ICsgQUJJVF9VR1VSVV9GQU5fTUFYLzIpIC8KKwkJQUJJVF9VR1VSVV9GQU5fTUFYOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisKKwkvKiB0aGlzIGNoZWNrIGNhbiBiZSBkb25lIGJlZm9yZSB0YWtpbmcgdGhlIGxvY2sgKi8KKwlpZiAoKHZhbCA8IGFiaXR1Z3VydV9iYW5rMl9taW5fdGhyZXNob2xkKSB8fAorCQkJKHZhbCA+IGFiaXR1Z3VydV9iYW5rMl9tYXhfdGhyZXNob2xkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJaWYgKGRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XVthdHRyLT5ucl0gIT0gdmFsKSB7CisJCXU4IG9yaWdfdmFsID0gZGF0YS0+YmFuazJfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXTsKKwkJZGF0YS0+YmFuazJfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9IHZhbDsKKwkJaWYgKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMiArIDIsCisJCQkJYXR0ci0+aW5kZXgsIGRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XSwKKwkJCQkyKSA8PSBhdHRyLT5ucikgeworCQkJZGF0YS0+YmFuazJfc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9IG9yaWdfdmFsOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JhbmsxX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gYWJpdHVndXJ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlPOworCS8qIFNlZSBpZiB0aGUgYWxhcm0gYml0IGZvciB0aGlzIHNlbnNvciBpcyBzZXQsIGFuZCBpZiB0aGUKKwkgICBhbGFybSBtYXRjaGVzIHRoZSB0eXBlIG9mIGFsYXJtIHdlJ3JlIGxvb2tpbmcgZm9yIChmb3Igdm9sdAorCSAgIGl0IGNhbiBiZSBlaXRoZXIgbG93IG9yIGhpZ2gpLiBUaGUgdHlwZSBpcyBzdG9yZWQgaW4gYSBmZXcKKwkgICByZWFkb25seSBiaXRzIGluIHRoZSBzZXR0aW5ncyBwYXJ0IG9mIHRoZSByZWxldmFudCBzZW5zb3IuCisJICAgVGhlIGJpdG1hc2sgb2YgdGhlIHR5cGUgaXMgcGFzc2VkIHRvIHVzIGluIGF0dHItPm5yLiAqLworCWlmICgoZGF0YS0+YWxhcm1zW2F0dHItPmluZGV4IC8gOF0gJiAoMHgwMSA8PCAoYXR0ci0+aW5kZXggJSA4KSkpICYmCisJCQkoZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdICYgYXR0ci0+bnIpKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2JhbmsyX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gYWJpdHVndXJ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlPOworCWlmIChkYXRhLT5hbGFybXNbMl0gJiAoMHgwMSA8PCBhdHRyLT5pbmRleCkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjFcbiIpOworCWVsc2UKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYmFuazFfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOworCXN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWlmIChkYXRhLT5iYW5rMV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF0gJiBhdHRyLT5ucikKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiMVxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIwXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19iYW5rMl9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaWYgKGRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSAmIGF0dHItPm5yKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIxXG4iKTsKKwllbHNlCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjBcbiIpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9iYW5rMV9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgbWFzayA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisJdTggb3JpZ192YWw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJb3JpZ192YWwgPSBkYXRhLT5iYW5rMV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF07CisKKwlpZiAobWFzaykKKwkJZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdIHw9IGF0dHItPm5yOworCWVsc2UKKwkJZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdICY9IH5hdHRyLT5ucjsKKworCWlmICgoZGF0YS0+YmFuazFfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdICE9IG9yaWdfdmFsKSAmJgorCQkJKGFiaXR1Z3VydV93cml0ZShkYXRhLAorCQkJQUJJVF9VR1VSVV9TRU5TT1JfQkFOSzEgKyAyLCBhdHRyLT5pbmRleCwKKwkJCWRhdGEtPmJhbmsxX3NldHRpbmdzW2F0dHItPmluZGV4XSwgMykgPCAxKSkgeworCQlkYXRhLT5iYW5rMV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF0gPSBvcmlnX3ZhbDsKKwkJcmV0ID0gLUVJTzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfYmFuazJfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IG1hc2sgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlzc2l6ZV90IHJldCA9IGNvdW50OworCXU4IG9yaWdfdmFsOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCW9yaWdfdmFsID0gZGF0YS0+YmFuazJfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdOworCisJaWYgKG1hc2spCisJCWRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSB8PSBhdHRyLT5ucjsKKwllbHNlCisJCWRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSAmPSB+YXR0ci0+bnI7CisKKwlpZiAoKGRhdGEtPmJhbmsyX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSAhPSBvcmlnX3ZhbCkgJiYKKwkJCShhYml0dWd1cnVfd3JpdGUoZGF0YSwKKwkJCUFCSVRfVUdVUlVfU0VOU09SX0JBTksyICsgMiwgYXR0ci0+aW5kZXgsCisJCQlkYXRhLT5iYW5rMl9zZXR0aW5nc1thdHRyLT5pbmRleF0sIDIpIDwgMSkpIHsKKwkJZGF0YS0+YmFuazJfc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdID0gb3JpZ192YWw7CisJCXJldCA9IC1FSU87CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIEZhbiBQV00gKHNwZWVkIGNvbnRyb2wpICovCitzdGF0aWMgc3NpemVfdCBzaG93X3B3bV9zZXR0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bYXR0ci0+bnJdICoKKwkJYWJpdHVndXJ1X3B3bV9zZXR0aW5nc19tdWx0aXBsaWVyW2F0dHItPm5yXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3B3bV9zZXR0aW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBtaW4sIHZhbCA9IChzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSArCisJCWFiaXR1Z3VydV9wd21fc2V0dGluZ3NfbXVsdGlwbGllclthdHRyLT5ucl0vMikgLworCQlhYml0dWd1cnVfcHdtX3NldHRpbmdzX211bHRpcGxpZXJbYXR0ci0+bnJdOworCXNzaXplX3QgcmV0ID0gY291bnQ7CisKKwkvKiBzcGVjaWFsIGNhc2UgcHdtMSBtaW4gcHdtJSAqLworCWlmICgoYXR0ci0+aW5kZXggPT0gMCkgJiYgKChhdHRyLT5uciA9PSAxKSB8fCAoYXR0ci0+bnIgPT0gMikpKQorCQltaW4gPSA3NzsKKwllbHNlCisJCW1pbiA9IGFiaXR1Z3VydV9wd21fbWluW2F0dHItPm5yXTsKKworCS8qIHRoaXMgY2hlY2sgY2FuIGJlIGRvbmUgYmVmb3JlIHRha2luZyB0aGUgbG9jayAqLworCWlmICgodmFsIDwgbWluKSB8fCAodmFsID4gYWJpdHVndXJ1X3B3bV9tYXhbYXR0ci0+bnJdKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJLyogdGhpcyBjaGVjayBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRha2luZyB0aGUgbG9jayAqLworCWlmICgoYXR0ci0+bnIgJiAxKSAmJgorCQkJKHZhbCA+PSBkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yICsgMV0pKQorCQlyZXQgPSAtRUlOVkFMOworCWVsc2UgaWYgKCEoYXR0ci0+bnIgJiAxKSAmJgorCQkJKHZhbCA8PSBkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yIC0gMV0pKQorCQlyZXQgPSAtRUlOVkFMOworCWVsc2UgaWYgKGRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bYXR0ci0+bnJdICE9IHZhbCkgeworCQl1OCBvcmlnX3ZhbCA9IGRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bYXR0ci0+bnJdOworCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9IHZhbDsKKwkJaWYgKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX0ZBTl9QV00gKyAxLAorCQkJCWF0dHItPmluZGV4LCBkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdLAorCQkJCTUpIDw9IGF0dHItPm5yKSB7CisJCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdW2F0dHItPm5yXSA9CisJCQkJb3JpZ192YWw7CisJCQlyZXQgPSAtRUlPOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfcHdtX3NlbnNvcihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cl8yKGRldmF0dHIpOworCXN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOworCS8qIFdlIG5lZWQgdG8gd2FsayB0byB0aGUgdGVtcCBzZW5zb3IgYWRkcmVzc2VzIHRvIGZpbmQgd2hhdAorCSAgIHRoZSB1c2Vyc3BhY2UgaWQgb2YgdGhlIGNvbmZpZ3VyZWQgdGVtcCBzZW5zb3IgaXMuICovCisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmJhbmsxX3NlbnNvcnNbQUJJVF9VR1VSVV9URU1QX1NFTlNPUl07IGkrKykKKwkJaWYgKGRhdGEtPmJhbmsxX2FkZHJlc3NbQUJJVF9VR1VSVV9URU1QX1NFTlNPUl1baV0gPT0KKwkJCQkoZGF0YS0+cHdtX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSAmIDB4MEYpKQorCQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGkrMSk7CisKKwlyZXR1cm4gLUVOWElPOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fc2Vuc29yKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApIC0gMTsKKwlzc2l6ZV90IHJldCA9IGNvdW50OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmICh2YWwgPCBkYXRhLT5iYW5rMV9zZW5zb3JzW0FCSVRfVUdVUlVfVEVNUF9TRU5TT1JdKSB7CisJCXU4IG9yaWdfdmFsID0gZGF0YS0+cHdtX3NldHRpbmdzW2F0dHItPmluZGV4XVswXTsKKwkJdTggYWRkcmVzcyA9IGRhdGEtPmJhbmsxX2FkZHJlc3NbQUJJVF9VR1VSVV9URU1QX1NFTlNPUl1bdmFsXTsKKwkJZGF0YS0+cHdtX3NldHRpbmdzW2F0dHItPmluZGV4XVswXSAmPSAweEYwOworCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdIHw9IGFkZHJlc3M7CisJCWlmIChkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdICE9IG9yaWdfdmFsKSB7CisJCQlpZiAoYWJpdHVndXJ1X3dyaXRlKGRhdGEsIEFCSVRfVUdVUlVfRkFOX1BXTSArIDEsCisJCQkJCWF0dHItPmluZGV4LAorCQkJCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdLAorCQkJCQk1KSA8IDEpIHsKKwkJCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdID0gb3JpZ192YWw7CisJCQkJcmV0ID0gLUVJTzsKKwkJCX0KKwkJfQorCX0KKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyXzIoZGV2YXR0cik7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJlcyA9IDA7CisJaWYgKGRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF0gJiBBQklUX1VHVVJVX0ZBTl9QV01fRU5BQkxFKQorCQlyZXMgPSAyOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXMpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9wd21fZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUKKwkqZGV2YXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1OCBvcmlnX3ZhbCwgdXNlcl92YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlzc2l6ZV90IHJldCA9IGNvdW50OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCW9yaWdfdmFsID0gZGF0YS0+cHdtX3NldHRpbmdzW2F0dHItPmluZGV4XVswXTsKKwlzd2l0Y2ggKHVzZXJfdmFsKSB7CisJCWNhc2UgMDoKKwkJCWRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF0gJj0KKwkJCQl+QUJJVF9VR1VSVV9GQU5fUFdNX0VOQUJMRTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdIHw9CisJCQkJQUJJVF9VR1VSVV9GQU5fUFdNX0VOQUJMRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwl9CisJaWYgKChkYXRhLT5wd21fc2V0dGluZ3NbYXR0ci0+aW5kZXhdWzBdICE9IG9yaWdfdmFsKSAmJgorCQkJKGFiaXR1Z3VydV93cml0ZShkYXRhLCBBQklUX1VHVVJVX0ZBTl9QV00gKyAxLAorCQkJYXR0ci0+aW5kZXgsIGRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF0sCisJCQk1KSA8IDEpKSB7CisJCWRhdGEtPnB3bV9zZXR0aW5nc1thdHRyLT5pbmRleF1bMF0gPSBvcmlnX3ZhbDsKKwkJcmV0ID0gLUVJTzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBBQklUX1VHVVJVX05BTUUpOworfQorCisvKiBTeXNmcyBhdHRyIHRlbXBsYXRlcywgdGhlIHJlYWwgZW50cmllcyBhcmUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuICovCitzdGF0aWMgY29uc3QKK3N0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIGFiaXR1Z3VydV9zeXNmc19iYW5rMV90ZW1wbFsyXVs5XSA9IHsKKwl7CisJU0VOU09SX0FUVFJfMihpbiVkX2lucHV0LCAwNDQ0LCBzaG93X2JhbmsxX3ZhbHVlLCBOVUxMLCAwLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGluJWRfbWluLCAwNjQ0LCBzaG93X2JhbmsxX3NldHRpbmcsCisJCXN0b3JlX2JhbmsxX3NldHRpbmcsIDEsIDApLAorCVNFTlNPUl9BVFRSXzIoaW4lZF9taW5fYWxhcm0sIDA0NDQsIHNob3dfYmFuazFfYWxhcm0sIE5VTEwsCisJCUFCSVRfVUdVUlVfVk9MVF9MT1dfQUxBUk1fRkxBRywgMCksCisJU0VOU09SX0FUVFJfMihpbiVkX21heCwgMDY0NCwgc2hvd19iYW5rMV9zZXR0aW5nLAorCQlzdG9yZV9iYW5rMV9zZXR0aW5nLCAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGluJWRfbWF4X2FsYXJtLCAwNDQ0LCBzaG93X2JhbmsxX2FsYXJtLCBOVUxMLAorCQlBQklUX1VHVVJVX1ZPTFRfSElHSF9BTEFSTV9GTEFHLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGluJWRfYmVlcCwgMDY0NCwgc2hvd19iYW5rMV9tYXNrLAorCQlzdG9yZV9iYW5rMV9tYXNrLCBBQklUX1VHVVJVX0JFRVBfRU5BQkxFLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGluJWRfc2h1dGRvd24sIDA2NDQsIHNob3dfYmFuazFfbWFzaywKKwkJc3RvcmVfYmFuazFfbWFzaywgQUJJVF9VR1VSVV9TSFVURE9XTl9FTkFCTEUsIDApLAorCVNFTlNPUl9BVFRSXzIoaW4lZF9taW5fYWxhcm1fZW5hYmxlLCAwNjQ0LCBzaG93X2JhbmsxX21hc2ssCisJCXN0b3JlX2JhbmsxX21hc2ssIEFCSVRfVUdVUlVfVk9MVF9MT1dfQUxBUk1fRU5BQkxFLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGluJWRfbWF4X2FsYXJtX2VuYWJsZSwgMDY0NCwgc2hvd19iYW5rMV9tYXNrLAorCQlzdG9yZV9iYW5rMV9tYXNrLCBBQklUX1VHVVJVX1ZPTFRfSElHSF9BTEFSTV9FTkFCTEUsIDApLAorCX0sIHsKKwlTRU5TT1JfQVRUUl8yKHRlbXAlZF9pbnB1dCwgMDQ0NCwgc2hvd19iYW5rMV92YWx1ZSwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wJWRfYWxhcm0sIDA0NDQsIHNob3dfYmFuazFfYWxhcm0sIE5VTEwsCisJCUFCSVRfVUdVUlVfVEVNUF9ISUdIX0FMQVJNX0ZMQUcsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcCVkX21heCwgMDY0NCwgc2hvd19iYW5rMV9zZXR0aW5nLAorCQlzdG9yZV9iYW5rMV9zZXR0aW5nLCAxLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAlZF9jcml0LCAwNjQ0LCBzaG93X2JhbmsxX3NldHRpbmcsCisJCXN0b3JlX2JhbmsxX3NldHRpbmcsIDIsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcCVkX2JlZXAsIDA2NDQsIHNob3dfYmFuazFfbWFzaywKKwkJc3RvcmVfYmFuazFfbWFzaywgQUJJVF9VR1VSVV9CRUVQX0VOQUJMRSwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wJWRfc2h1dGRvd24sIDA2NDQsIHNob3dfYmFuazFfbWFzaywKKwkJc3RvcmVfYmFuazFfbWFzaywgQUJJVF9VR1VSVV9TSFVURE9XTl9FTkFCTEUsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcCVkX2FsYXJtX2VuYWJsZSwgMDY0NCwgc2hvd19iYW5rMV9tYXNrLAorCQlzdG9yZV9iYW5rMV9tYXNrLCBBQklUX1VHVVJVX1RFTVBfSElHSF9BTEFSTV9FTkFCTEUsIDApLAorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBhYml0dWd1cnVfc3lzZnNfZmFuX3RlbXBsWzZdID0geworCVNFTlNPUl9BVFRSXzIoZmFuJWRfaW5wdXQsIDA0NDQsIHNob3dfYmFuazJfdmFsdWUsIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIoZmFuJWRfYWxhcm0sIDA0NDQsIHNob3dfYmFuazJfYWxhcm0sIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIoZmFuJWRfbWluLCAwNjQ0LCBzaG93X2JhbmsyX3NldHRpbmcsCisJCXN0b3JlX2JhbmsyX3NldHRpbmcsIDEsIDApLAorCVNFTlNPUl9BVFRSXzIoZmFuJWRfYmVlcCwgMDY0NCwgc2hvd19iYW5rMl9tYXNrLAorCQlzdG9yZV9iYW5rMl9tYXNrLCBBQklUX1VHVVJVX0JFRVBfRU5BQkxFLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbiVkX3NodXRkb3duLCAwNjQ0LCBzaG93X2JhbmsyX21hc2ssCisJCXN0b3JlX2JhbmsyX21hc2ssIEFCSVRfVUdVUlVfU0hVVERPV05fRU5BQkxFLCAwKSwKKwlTRU5TT1JfQVRUUl8yKGZhbiVkX2FsYXJtX2VuYWJsZSwgMDY0NCwgc2hvd19iYW5rMl9tYXNrLAorCQlzdG9yZV9iYW5rMl9tYXNrLCBBQklUX1VHVVJVX0ZBTl9MT1dfQUxBUk1fRU5BQkxFLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBhYml0dWd1cnVfc3lzZnNfcHdtX3RlbXBsWzZdID0geworCVNFTlNPUl9BVFRSXzIocHdtJWRfZW5hYmxlLCAwNjQ0LCBzaG93X3B3bV9lbmFibGUsCisJCXN0b3JlX3B3bV9lbmFibGUsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtJWRfYXV0b19jaGFubmVsc190ZW1wLCAwNjQ0LCBzaG93X3B3bV9zZW5zb3IsCisJCXN0b3JlX3B3bV9zZW5zb3IsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIocHdtJWRfYXV0b19wb2ludDFfcHdtLCAwNjQ0LCBzaG93X3B3bV9zZXR0aW5nLAorCQlzdG9yZV9wd21fc2V0dGluZywgMSwgMCksCisJU0VOU09SX0FUVFJfMihwd20lZF9hdXRvX3BvaW50Ml9wd20sIDA2NDQsIHNob3dfcHdtX3NldHRpbmcsCisJCXN0b3JlX3B3bV9zZXR0aW5nLCAyLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bSVkX2F1dG9fcG9pbnQxX3RlbXAsIDA2NDQsIHNob3dfcHdtX3NldHRpbmcsCisJCXN0b3JlX3B3bV9zZXR0aW5nLCAzLCAwKSwKKwlTRU5TT1JfQVRUUl8yKHB3bSVkX2F1dG9fcG9pbnQyX3RlbXAsIDA2NDQsIHNob3dfcHdtX3NldHRpbmcsCisJCXN0b3JlX3B3bV9zZXR0aW5nLCA0LCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBhYml0dWd1cnVfc3lzZnNfYXR0cltdID0geworCVNFTlNPUl9BVFRSXzIobmFtZSwgMDQ0NCwgc2hvd19uYW1lLCBOVUxMLCAwLCAwKSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFiaXR1Z3VydV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YTsKKwlpbnQgaSwgaiwgdXNlZCwgc3lzZnNfbmFtZXNfZnJlZSwgc3lzZnNfYXR0cl9pLCByZXMgPSAtRU5PREVWOworCWNoYXIgKnN5c2ZzX2ZpbGVuYW1lOworCisJLyogRWwgd2VpcmRvIHByb2JlIG9yZGVyLCB0byBrZWVwIHRoZSBzeXNmcyBvcmRlciBpZGVudGljYWwgdG8gdGhlCisJICAgQklPUyBhbmQgd2luZG93LWFwcGxpY3Rpb24gbGlzdGluZyBvcmRlci4gKi8KKwljb25zdCB1OCBwcm9iZV9vcmRlcltBQklUX1VHVVJVX01BWF9CQU5LMV9TRU5TT1JTXSA9IHsKKwkJMHgwMCwgMHgwMSwgMHgwMywgMHgwNCwgMHgwQSwgMHgwOCwgMHgwRSwgMHgwMiwKKwkJMHgwOSwgMHgwNiwgMHgwNSwgMHgwQiwgMHgwRiwgMHgwRCwgMHgwNywgMHgwQyB9OworCisJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYml0dWd1cnVfZGF0YSksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhLT5hZGRyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSU8sIDApLT5zdGFydDsKKwltdXRleF9pbml0KCZkYXRhLT51cGRhdGVfbG9jayk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CisKKwkvKiBTZWUgaWYgdGhlIHVHdXJ1IGlzIHJlYWR5ICovCisJaWYgKGluYl9wKGRhdGEtPmFkZHIgKyBBQklUX1VHVVJVX0RBVEEpID09IEFCSVRfVUdVUlVfU1RBVFVTX0lOUFVUKQorCQlkYXRhLT51Z3VydV9yZWFkeSA9IDE7CisKKwkvKiBDb21wbGV0ZWx5IHJlYWQgdGhlIHVHdXJ1IHRoaXMgaGFzIDIgcHVycG9zZXM6CisJICAgLSB0ZXN0cmVhZCAvIHNlZSBpZiBvbmUgcmVhbGx5IGlzIHRoZXJlLgorCSAgIC0gbWFrZSBhbiBpbiBtZW1vcnkgY29weSBvZiBhbGwgdGhlIHVndXJ1IHNldHRpbmdzIGZvciBmdXR1cmUgdXNlLiAqLworCWlmIChhYml0dWd1cnVfcmVhZChkYXRhLCBBQklUX1VHVVJVX0FMQVJNX0JBTkssIDAsCisJCQlkYXRhLT5hbGFybXMsIDMsIEFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDMpCisJCWdvdG8gYWJpdHVndXJ1X3Byb2JlX2Vycm9yOworCisJZm9yIChpID0gMDsgaSA8IEFCSVRfVUdVUlVfTUFYX0JBTksxX1NFTlNPUlM7IGkrKykgeworCQlpZiAoYWJpdHVndXJ1X3JlYWQoZGF0YSwgQUJJVF9VR1VSVV9TRU5TT1JfQkFOSzEsIGksCisJCQkJJmRhdGEtPmJhbmsxX3ZhbHVlW2ldLCAxLAorCQkJCUFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDEpCisJCQlnb3RvIGFiaXR1Z3VydV9wcm9iZV9lcnJvcjsKKwkJaWYgKGFiaXR1Z3VydV9yZWFkKGRhdGEsIEFCSVRfVUdVUlVfU0VOU09SX0JBTksxKzEsIGksCisJCQkJZGF0YS0+YmFuazFfc2V0dGluZ3NbaV0sIDMsCisJCQkJQUJJVF9VR1VSVV9NQVhfUkVUUklFUykgIT0gMykKKwkJCWdvdG8gYWJpdHVndXJ1X3Byb2JlX2Vycm9yOworCX0KKwkvKiBOb3RlOiBXZSBkb24ndCBrbm93IGhvdyBtYW55IGJhbmsyIHNlbnNvcnMgLyBwd21zIHRoZXJlIHJlYWxseSBhcmUsCisJICAgYnV0IGluIG9yZGVyIHRvICJkZXRlY3QiIHRoaXMgd2UgbmVlZCB0byByZWFkIHRoZSBtYXhpbXVtIGFtb3VudAorCSAgIGFueXdheXMuIElmIHdlIHJlYWQgc2Vuc29ycy9wd21zIG5vdCB0aGVyZSB3ZSdsbCBqdXN0IHJlYWQgY3JhcAorCSAgIHRoaXMgY2FuJ3QgaHVydC4gV2UgbmVlZCB0aGUgZGV0ZWN0aW9uIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAorCSAgIHVud2FudGVkIHdyaXRlcywgd2hpY2ggd2lsbCBodXJ0ISAqLworCWZvciAoaSA9IDA7IGkgPCBBQklUX1VHVVJVX01BWF9CQU5LMl9TRU5TT1JTOyBpKyspIHsKKwkJaWYgKGFiaXR1Z3VydV9yZWFkKGRhdGEsIEFCSVRfVUdVUlVfU0VOU09SX0JBTksyLCBpLAorCQkJCSZkYXRhLT5iYW5rMl92YWx1ZVtpXSwgMSwKKwkJCQlBQklUX1VHVVJVX01BWF9SRVRSSUVTKSAhPSAxKQorCQkJZ290byBhYml0dWd1cnVfcHJvYmVfZXJyb3I7CisJCWlmIChhYml0dWd1cnVfcmVhZChkYXRhLCBBQklUX1VHVVJVX1NFTlNPUl9CQU5LMisxLCBpLAorCQkJCWRhdGEtPmJhbmsyX3NldHRpbmdzW2ldLCAyLAorCQkJCUFCSVRfVUdVUlVfTUFYX1JFVFJJRVMpICE9IDIpCisJCQlnb3RvIGFiaXR1Z3VydV9wcm9iZV9lcnJvcjsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFCSVRfVUdVUlVfTUFYX1BXTVM7IGkrKykgeworCQlpZiAoYWJpdHVndXJ1X3JlYWQoZGF0YSwgQUJJVF9VR1VSVV9GQU5fUFdNLCBpLAorCQkJCWRhdGEtPnB3bV9zZXR0aW5nc1tpXSwgNSwKKwkJCQlBQklUX1VHVVJVX01BWF9SRVRSSUVTKSAhPSA1KQorCQkJZ290byBhYml0dWd1cnVfcHJvYmVfZXJyb3I7CisJfQorCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisKKwkvKiBEZXRlY3Qgc2Vuc29yIHR5cGVzIGFuZCBmaWxsIHRoZSBzeXNmcyBhdHRyIGZvciBiYW5rMSAqLworCXN5c2ZzX2F0dHJfaSA9IDA7CisJc3lzZnNfZmlsZW5hbWUgPSBkYXRhLT5zeXNmc19uYW1lczsKKwlzeXNmc19uYW1lc19mcmVlID0gQUJJVFVHVVJVX1NZU0ZTX05BTUVTX0xFTkdUSDsKKwlmb3IgKGkgPSAwOyBpIDwgQUJJVF9VR1VSVV9NQVhfQkFOSzFfU0VOU09SUzsgaSsrKSB7CisJCXJlcyA9IGFiaXR1Z3VydV9kZXRlY3RfYmFuazFfc2Vuc29yX3R5cGUoZGF0YSwgcHJvYmVfb3JkZXJbaV0pOworCQlpZiAocmVzIDwgMCkKKwkJCWdvdG8gYWJpdHVndXJ1X3Byb2JlX2Vycm9yOworCQlpZiAocmVzID09IEFCSVRfVUdVUlVfTkMpCisJCQljb250aW51ZTsKKworCQkvKiByZXMgMSAodGVtcCkgc2Vuc29ycyBoYXZlIDcgc3lzZnMgZW50cmllcywgMCAoaW4pIDkgKi8KKwkJZm9yIChqID0gMDsgaiA8IChyZXMgPyA3IDogOSk7IGorKykgeworCQkJdXNlZCA9IHNucHJpbnRmKHN5c2ZzX2ZpbGVuYW1lLCBzeXNmc19uYW1lc19mcmVlLAorCQkJCWFiaXR1Z3VydV9zeXNmc19iYW5rMV90ZW1wbFtyZXNdW2pdLmRldl9hdHRyLgorCQkJCWF0dHIubmFtZSwgZGF0YS0+YmFuazFfc2Vuc29yc1tyZXNdICsgcmVzKQorCQkJCSsgMTsKKwkJCWRhdGEtPnN5c2ZzX2F0dHJbc3lzZnNfYXR0cl9pXSA9CisJCQkJYWJpdHVndXJ1X3N5c2ZzX2JhbmsxX3RlbXBsW3Jlc11bal07CisJCQlkYXRhLT5zeXNmc19hdHRyW3N5c2ZzX2F0dHJfaV0uZGV2X2F0dHIuYXR0ci5uYW1lID0KKwkJCQlzeXNmc19maWxlbmFtZTsKKwkJCWRhdGEtPnN5c2ZzX2F0dHJbc3lzZnNfYXR0cl9pXS5pbmRleCA9IHByb2JlX29yZGVyW2ldOworCQkJc3lzZnNfZmlsZW5hbWUgKz0gdXNlZDsKKwkJCXN5c2ZzX25hbWVzX2ZyZWUgLT0gdXNlZDsKKwkJCXN5c2ZzX2F0dHJfaSsrOworCQl9CisJCWRhdGEtPmJhbmsxX21heF92YWx1ZVtwcm9iZV9vcmRlcltpXV0gPQorCQkJYWJpdHVndXJ1X2JhbmsxX21heF92YWx1ZVtyZXNdOworCQlkYXRhLT5iYW5rMV9hZGRyZXNzW3Jlc11bZGF0YS0+YmFuazFfc2Vuc29yc1tyZXNdXSA9CisJCQlwcm9iZV9vcmRlcltpXTsKKwkJZGF0YS0+YmFuazFfc2Vuc29yc1tyZXNdKys7CisJfQorCS8qIERldGVjdCBudW1iZXIgb2Ygc2Vuc29ycyBhbmQgZmlsbCB0aGUgc3lzZnMgYXR0ciBmb3IgYmFuazIgKGZhbnMpICovCisJYWJpdHVndXJ1X2RldGVjdF9ub19iYW5rMl9zZW5zb3JzKGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5iYW5rMl9zZW5zb3JzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYWJpdHVndXJ1X3N5c2ZzX2Zhbl90ZW1wbCk7IGorKykgeworCQkJdXNlZCA9IHNucHJpbnRmKHN5c2ZzX2ZpbGVuYW1lLCBzeXNmc19uYW1lc19mcmVlLAorCQkJCWFiaXR1Z3VydV9zeXNmc19mYW5fdGVtcGxbal0uZGV2X2F0dHIuYXR0ci5uYW1lLAorCQkJCWkgKyAxKSArIDE7CisJCQlkYXRhLT5zeXNmc19hdHRyW3N5c2ZzX2F0dHJfaV0gPQorCQkJCWFiaXR1Z3VydV9zeXNmc19mYW5fdGVtcGxbal07CisJCQlkYXRhLT5zeXNmc19hdHRyW3N5c2ZzX2F0dHJfaV0uZGV2X2F0dHIuYXR0ci5uYW1lID0KKwkJCQlzeXNmc19maWxlbmFtZTsKKwkJCWRhdGEtPnN5c2ZzX2F0dHJbc3lzZnNfYXR0cl9pXS5pbmRleCA9IGk7CisJCQlzeXNmc19maWxlbmFtZSArPSB1c2VkOworCQkJc3lzZnNfbmFtZXNfZnJlZSAtPSB1c2VkOworCQkJc3lzZnNfYXR0cl9pKys7CisJCX0KKwl9CisJLyogRGV0ZWN0IG51bWJlciBvZiBzZW5zb3JzIGFuZCBmaWxsIHRoZSBzeXNmcyBhdHRyIGZvciBwd21zICovCisJYWJpdHVndXJ1X2RldGVjdF9ub19wd21zKGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5wd21zOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYWJpdHVndXJ1X3N5c2ZzX3B3bV90ZW1wbCk7IGorKykgeworCQkJdXNlZCA9IHNucHJpbnRmKHN5c2ZzX2ZpbGVuYW1lLCBzeXNmc19uYW1lc19mcmVlLAorCQkJCWFiaXR1Z3VydV9zeXNmc19wd21fdGVtcGxbal0uZGV2X2F0dHIuYXR0ci5uYW1lLAorCQkJCWkgKyAxKSArIDE7CisJCQlkYXRhLT5zeXNmc19hdHRyW3N5c2ZzX2F0dHJfaV0gPQorCQkJCWFiaXR1Z3VydV9zeXNmc19wd21fdGVtcGxbal07CisJCQlkYXRhLT5zeXNmc19hdHRyW3N5c2ZzX2F0dHJfaV0uZGV2X2F0dHIuYXR0ci5uYW1lID0KKwkJCQlzeXNmc19maWxlbmFtZTsKKwkJCWRhdGEtPnN5c2ZzX2F0dHJbc3lzZnNfYXR0cl9pXS5pbmRleCA9IGk7CisJCQlzeXNmc19maWxlbmFtZSArPSB1c2VkOworCQkJc3lzZnNfbmFtZXNfZnJlZSAtPSB1c2VkOworCQkJc3lzZnNfYXR0cl9pKys7CisJCX0KKwl9CisJLyogRmFpbCBzYWZlIGNoZWNrLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4hICovCisJaWYgKHN5c2ZzX25hbWVzX2ZyZWUgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUgIjogRmF0YWwgZXJyb3IgcmFuIG91dCBvZiAiCisJCSAgICAgICAic3BhY2UgZm9yIHN5c2ZzIGF0dHIgbmFtZXMuIFRoaXMgc2hvdWxkIG5ldmVyICIKKwkJICAgICAgICJoYXBwZW4gcGxlYXNlIHJlcG9ydCB0byB0aGUgYWJpdHVndXJ1IG1haW50YWluZXIgIgorCQkgICAgICAgIihzZWUgTUFJTlRBSU5FUlMpXG4iKTsKKwkJcmVzID0gLUVOQU1FVE9PTE9ORzsKKwkJZ290byBhYml0dWd1cnVfcHJvYmVfZXJyb3I7CisJfQorCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVV9OQU1FICI6IGZvdW5kIEFiaXQgdUd1cnVcbiIpOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldik7CisJaWYgKElTX0VSUihkYXRhLT5jbGFzc19kZXYpKSB7CisJCXJlcyA9IFBUUl9FUlIoZGF0YS0+Y2xhc3NfZGV2KTsKKwkJZ290byBhYml0dWd1cnVfcHJvYmVfZXJyb3I7CisJfQorCWZvciAoaSA9IDA7IGkgPCBzeXNmc19hdHRyX2k7IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkYXRhLT5zeXNmc19hdHRyW2ldLmRldl9hdHRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYml0dWd1cnVfc3lzZnNfYXR0cik7IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsCisJCQkmYWJpdHVndXJ1X3N5c2ZzX2F0dHJbaV0uZGV2X2F0dHIpOworCisJcmV0dXJuIDA7CisKK2FiaXR1Z3VydV9wcm9iZV9lcnJvcjoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhYml0dWd1cnVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFiaXR1Z3VydV9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5jbGFzc19kZXYpOworCWtmcmVlKGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWJpdHVndXJ1X2RhdGEgKmFiaXR1Z3VydV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgaSwgZXJyOworCXN0cnVjdCBhYml0dWd1cnVfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCS8qIGZha2UgYSBjb21wbGV0ZSBzdWNjZXNzZnVsIHJlYWQgaWYgbm8gdXBkYXRlIG5lY2Vzc2FyeS4gKi8KKwljaGFyIHN1Y2Nlc3MgPSAxOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZCArIEhaKSkgeworCQlzdWNjZXNzID0gMDsKKwkJaWYgKChlcnIgPSBhYml0dWd1cnVfcmVhZChkYXRhLCBBQklUX1VHVVJVX0FMQVJNX0JBTkssIDAsCisJCQkJZGF0YS0+YWxhcm1zLCAzLCAwKSkgIT0gMykKKwkJCWdvdG8gTEVBVkVfVVBEQVRFOworCQlmb3IgKGkgPSAwOyBpIDwgQUJJVF9VR1VSVV9NQVhfQkFOSzFfU0VOU09SUzsgaSsrKSB7CisJCQlpZiAoKGVyciA9IGFiaXR1Z3VydV9yZWFkKGRhdGEsCisJCQkJCUFCSVRfVUdVUlVfU0VOU09SX0JBTksxLCBpLAorCQkJCQkmZGF0YS0+YmFuazFfdmFsdWVbaV0sIDEsIDApKSAhPSAxKQorCQkJCWdvdG8gTEVBVkVfVVBEQVRFOworCQkJaWYgKChlcnIgPSBhYml0dWd1cnVfcmVhZChkYXRhLAorCQkJCQlBQklUX1VHVVJVX1NFTlNPUl9CQU5LMSArIDEsIGksCisJCQkJCWRhdGEtPmJhbmsxX3NldHRpbmdzW2ldLCAzLCAwKSkgIT0gMykKKwkJCQlnb3RvIExFQVZFX1VQREFURTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgZGF0YS0+YmFuazJfc2Vuc29yczsgaSsrKQorCQkJaWYgKChlcnIgPSBhYml0dWd1cnVfcmVhZChkYXRhLAorCQkJCQlBQklUX1VHVVJVX1NFTlNPUl9CQU5LMiwgaSwKKwkJCQkJJmRhdGEtPmJhbmsyX3ZhbHVlW2ldLCAxLCAwKSkgIT0gMSkKKwkJCQlnb3RvIExFQVZFX1VQREFURTsKKwkJLyogc3VjY2VzcyEgKi8KKwkJc3VjY2VzcyA9IDE7CisJCWRhdGEtPnVwZGF0ZV90aW1lb3V0cyA9IDA7CitMRUFWRV9VUERBVEU6CisJCS8qIGhhbmRsZSB0aW1lb3V0IGNvbmRpdGlvbiAqLworCQlpZiAoZXJyID09IC1FQlVTWSkgeworCQkJLyogTm8gb3ZlcmZsb3cgcGxlYXNlICovCisJCQlpZiAoZGF0YS0+dXBkYXRlX3RpbWVvdXRzIDwgMjU1dSkKKwkJCQlkYXRhLT51cGRhdGVfdGltZW91dHMrKzsKKwkJCWlmIChkYXRhLT51cGRhdGVfdGltZW91dHMgPD0gQUJJVF9VR1VSVV9NQVhfVElNRU9VVFMpIHsKKwkJCQlBQklUX1VHVVJVX0RFQlVHKDMsICJ0aW1lb3V0IGV4Y2VlZGVkLCB3aWxsICIKKwkJCQkJInRyeSBhZ2FpbiBuZXh0IHVwZGF0ZVxuIik7CisJCQkJLyogSnVzdCBhIHRpbWVvdXQsIGZha2UgYSBzdWNjZXNzZnVsIHJlYWQgKi8KKwkJCQlzdWNjZXNzID0gMTsKKwkJCX0gZWxzZQorCQkJCUFCSVRfVUdVUlVfREVCVUcoMSwgInRpbWVvdXQgZXhjZWVkZWQgJWQgIgorCQkJCQkidGltZXMgd2FpdGluZyBmb3IgbW9yZSBpbnB1dCBzdGF0ZVxuIiwKKwkJCQkJKGludClkYXRhLT51cGRhdGVfdGltZW91dHMpOworCQl9CisJCS8qIE9uIHN1Y2Nlc3Mgc2V0IGxhc3RfdXBkYXRlZCAqLworCQlpZiAoc3VjY2VzcykKKwkJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CisJfQorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHN1Y2Nlc3MpCisJCXJldHVybiBkYXRhOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFiaXR1Z3VydV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lCT0gQUJJVF9VR1VSVV9OQU1FLAorCX0sCisJLnByb2JlCT0gYWJpdHVndXJ1X3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChhYml0dWd1cnVfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFiaXR1Z3VydV9kZXRlY3Qodm9pZCkKK3sKKwkvKiBTZWUgaWYgdGhlcmUgaXMgYW4gdWd1cnUgdGhlcmUuIEFmdGVyIGEgcmVib290IHVHdXJ1IHdpbGwgaG9sZCAweDAwCisJICAgYXQgREFUQSBhbmQgMHhBQywgd2hlbiB0aGlzIGRyaXZlciBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBvbmNlCisJICAgREFUQSB3aWxsIGhvbGQgMHgwOC4gRm9yIG1vc3QgdUd1cnUncyBDTUQgd2lsbCBob2xkIDB4QUMgaW4gZWl0aGVyCisJICAgc2NlbmFyaW8gYnV0IHNvbWUgd2lsbCBob2xkIDB4MDAuCisJICAgU29tZSB1R3VydSdzIGluaXRhbGx5IGhvbGQgMHgwOSBhdCBEQVRBIGFuZCB3aWxsIG9ubHkgaG9sZCAweDA4CisJICAgYWZ0ZXIgcmVhZGluZyBDTUQgZmlyc3QsIHNvIENNRCBtdXN0IGJlIHJlYWQgZmlyc3QhICovCisJdTggY21kX3ZhbCA9IGluYl9wKEFCSVRfVUdVUlVfQkFTRSArIEFCSVRfVUdVUlVfQ01EKTsKKwl1OCBkYXRhX3ZhbCA9IGluYl9wKEFCSVRfVUdVUlVfQkFTRSArIEFCSVRfVUdVUlVfREFUQSk7CisJaWYgKCgoZGF0YV92YWwgPT0gMHgwMCkgfHwgKGRhdGFfdmFsID09IDB4MDgpKSAmJgorCSAgICAoKGNtZF92YWwgPT0gMHgwMCkgfHwgKGNtZF92YWwgPT0gMHhBQykpKQorCQlyZXR1cm4gQUJJVF9VR1VSVV9CQVNFOworCisJQUJJVF9VR1VSVV9ERUJVRygyLCAibm8gQWJpdCB1R3VydSBmb3VuZCwgZGF0YSA9IDB4JTAyWCwgY21kID0gIgorCQkiMHglMDJYXG4iLCAodW5zaWduZWQgaW50KWRhdGFfdmFsLCAodW5zaWduZWQgaW50KWNtZF92YWwpOworCisJaWYgKGZvcmNlKSB7CisJCXByaW50ayhLRVJOX0lORk8gQUJJVF9VR1VSVV9OQU1FICI6IEFzc3VtaW5nIEFiaXQgdUd1cnUgaXMgIgorCQkJCSJwcmVzZW50IGJlY2F1c2Ugb2YgXCJmb3JjZVwiIHBhcmFtZXRlclxuIik7CisJCXJldHVybiBBQklUX1VHVVJVX0JBU0U7CisJfQorCisJLyogTm8gdUd1cnUgZm91bmQgKi8KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmFiaXR1Z3VydV9wZGV2OworCitzdGF0aWMgaW50IF9faW5pdCBhYml0dWd1cnVfaW5pdCh2b2lkKQoreworCWludCBhZGRyZXNzLCBlcnI7CisJc3RydWN0IHJlc291cmNlIHJlcyA9IHsgLmZsYWdzID0gSU9SRVNPVVJDRV9JTyB9OworCisJYWRkcmVzcyA9IGFiaXR1Z3VydV9kZXRlY3QoKTsKKwlpZiAoYWRkcmVzcyA8IDApCisJCXJldHVybiBhZGRyZXNzOworCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYml0dWd1cnVfZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXQ7CisKKwlhYml0dWd1cnVfcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhBQklUX1VHVVJVX05BTUUsIGFkZHJlc3MpOworCWlmICghYWJpdHVndXJ1X3BkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRQorCQkJIjogRGV2aWNlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X2RyaXZlcl91bnJlZ2lzdGVyOworCX0KKworCXJlcy5zdGFydCA9IGFkZHJlc3M7CisJcmVzLmVuZCA9IGFkZHJlc3MgKyBBQklUX1VHVVJVX1JFR0lPTl9MRU5HVEggLSAxOworCXJlcy5uYW1lID0gQUJJVF9VR1VSVV9OQU1FOworCisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMoYWJpdHVndXJ1X3BkZXYsICZyZXMsIDEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIEFCSVRfVUdVUlVfTkFNRQorCQkJIjogRGV2aWNlIHJlc291cmNlIGFkZGl0aW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlnb3RvIGV4aXRfZGV2aWNlX3B1dDsKKwl9CisKKwllcnIgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGFiaXR1Z3VydV9wZGV2KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBBQklUX1VHVVJVX05BTUUKKwkJCSI6IERldmljZSBhZGRpdGlvbiBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKKwkJZ290byBleGl0X2RldmljZV9wdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfZGV2aWNlX3B1dDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGFiaXR1Z3VydV9wZGV2KTsKK2V4aXRfZHJpdmVyX3VucmVnaXN0ZXI6CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiaXR1Z3VydV9kcml2ZXIpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWJpdHVndXJ1X2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihhYml0dWd1cnVfcGRldik7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFiaXR1Z3VydV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxqLncuci5kZWdvZWRlQGhocy5ubD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQWJpdCB1R3VydSBTZW5zb3IgZGV2aWNlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGFiaXR1Z3VydV9pbml0KTsKK21vZHVsZV9leGl0KGFiaXR1Z3VydV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vZjcxODA1Zi5jIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKaW5kZXggODg1NDY1ZC4uZmQ3MjQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKKysrIGIvZHJpdmVycy9od21vbi9mNzE4MDVmLmMKQEAgLTk5LDEwICs5OSw2IEBACiAjZGVmaW5lIEFERFJfUkVHX09GRlNFVAkJMAogI2RlZmluZSBEQVRBX1JFR19PRkZTRVQJCTEKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBmNzE4MDVmX3Jlc291cmNlIF9faW5pdGRhdGEgPSB7Ci0JLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKLX07Ci0KIC8qCiAgKiBSZWdpc3RlcnMKICAqLwpAQCAtNzgyLDYgKzc3OCwxMSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmNzE4MDVmX2RldmljZV9hZGQodW5zaWduZWQgc2hvcnQgYWRkcmVzcykKIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzID0geworCQkuc3RhcnQJPSBhZGRyZXNzLAorCQkuZW5kCT0gYWRkcmVzcyArIFJFR0lPTl9MRU5HVEggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lPLAorCX07CiAJaW50IGVycjsKIAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoRFJWTkFNRSwgYWRkcmVzcyk7CkBAIC03OTEsMTAgKzc5Miw4IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlmNzE4MDVmX3Jlc291cmNlLnN0YXJ0ID0gYWRkcmVzczsKLQlmNzE4MDVmX3Jlc291cmNlLmVuZCA9IGFkZHJlc3MgKyBSRUdJT05fTEVOR1RIIC0gMTsKLQlmNzE4MDVmX3Jlc291cmNlLm5hbWUgPSBwZGV2LT5uYW1lOwotCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKHBkZXYsICZmNzE4MDVmX3Jlc291cmNlLCAxKTsKKwlyZXMubmFtZSA9IHBkZXYtPm5hbWU7CisJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9yZXNvdXJjZXMocGRldiwgJnJlcywgMSk7CiAJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgRFJWTkFNRSAiOiBEZXZpY2UgcmVzb3VyY2UgYWRkaXRpb24gZmFpbGVkICIKIAkJICAgICAgICIoJWQpXG4iLCBlcnIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9oZGFwcy5jIGIvZHJpdmVycy9od21vbi9oZGFwcy5jCmluZGV4IDE2NTlmNmMuLjQyYjYzMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaGRhcHMuYworKysgYi9kcml2ZXJzL2h3bW9uL2hkYXBzLmMKQEAgLTQxLDcgKzQxLDcgQEAKICNkZWZpbmUgSERBUFNfUE9SVF9TVEFURQkweDE2MTEJLyogZGV2aWNlIHN0YXRlICovCiAjZGVmaW5lIEhEQVBTX1BPUlRfWVBPUwkJMHgxNjEyCS8qIHktYXhpcyBwb3NpdGlvbiAqLwogI2RlZmluZQlIREFQU19QT1JUX1hQT1MJCTB4MTYxNAkvKiB4LWF4aXMgcG9zaXRpb24gKi8KLSNkZWZpbmUgSERBUFNfUE9SVF9URU1QMQkweDE2MTYJLyogZGV2aWNlIHRlbXBlcmF0dXJlLCBpbiBjZWxjaXVzICovCisjZGVmaW5lIEhEQVBTX1BPUlRfVEVNUDEJMHgxNjE2CS8qIGRldmljZSB0ZW1wZXJhdHVyZSwgaW4gQ2Vsc2l1cyAqLwogI2RlZmluZSBIREFQU19QT1JUX1lWQVIJCTB4MTYxNwkvKiB5LWF4aXMgdmFyaWFuY2UgKHdoYXQgaXMgdGhpcz8pICovCiAjZGVmaW5lIEhEQVBTX1BPUlRfWFZBUgkJMHgxNjE5CS8qIHgtYXhpcyB2YXJpYW5jZSAod2hhdCBpcyB0aGlzPykgKi8KICNkZWZpbmUgSERBUFNfUE9SVF9URU1QMgkweDE2MWIJLyogZGV2aWNlIHRlbXBlcmF0dXJlIChhZ2Fpbj8pICovCkBAIC01MjIsMTMgKzUyMiwxNSBAQAogewogCWludCByZXQ7CiAKLQkvKiBOb3RlIHRoYXQgRE1JX01BVENIKC4uLiwiVGhpbmtQYWQgVDQyIikgd2lsbCBtYXRjaCAiVGhpbmtQYWQgVDQycCIgKi8KKwkvKiBOb3RlIHRoYXQgSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgVDQyIikgd291bGQgbWF0Y2gKKwkgICJUaGlua1BhZCBUNDJwIiwgc28gdGhlIG9yZGVyIG9mIHRoZSBlbnRyaWVzIG1hdHRlcnMgKi8KIAlzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBoZGFwc193aGl0ZWxpc3RbXSA9IHsKIAkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgSCIpLAogCQlIREFQU19ETUlfTUFUQ0hfSU5WRVJUKCJUaGlua1BhZCBSNTBwIiksCiAJCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFI1MCIpLAogCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBSNTEiKSwKIAkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgUjUyIiksCisJCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIEgiKSwJIC8qIFI1MiAoMTg0NkFRRykgKi8KIAkJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiVGhpbmtQYWQgVDQxcCIpLAogCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBUNDEiKSwKIAkJSERBUFNfRE1JX01BVENIX0lOVkVSVCgiVGhpbmtQYWQgVDQycCIpLApAQCAtNTM2LDkgKzUzOCw5IEBACiAJCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFQ0MyIpLAogCQlIREFQU19ETUlfTUFUQ0hfTEVOT1ZPKCJUaGlua1BhZCBUNjBwIiksCiAJCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFg0MCIpLAotCQlIREFQU19ETUlfTUFUQ0hfTk9STUFMKCJUaGlua1BhZCBYNDEgVGFibGV0IiksCiAJCUhEQVBTX0RNSV9NQVRDSF9OT1JNQUwoIlRoaW5rUGFkIFg0MSIpLAogCQlIREFQU19ETUlfTUFUQ0hfTEVOT1ZPKCJUaGlua1BhZCBYNjAiKSwKKwkJSERBUFNfRE1JX01BVENIX05PUk1BTCgiVGhpbmtQYWQgWjYwbSIpLAogCQl7IC5pZGVudCA9IE5VTEwgfQogCX07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMgYi9kcml2ZXJzL2h3bW9uL2h3bW9uLXZpZC5jCmluZGV4IGE3NGE0NGYuLmE2NzY0ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vaHdtb24tdmlkLmMKKysrIGIvZHJpdmVycy9od21vbi9od21vbi12aWQuYwpAQCAtNTgsMTEgKzU4LDIwIEBACiAgICAgZG9lc24ndCBzZWVtIHRvIGJlIGFueSBuYW1lZCBzcGVjaWZpY2F0aW9uIGZvciB0aGVzZS4gVGhlIGNvbnZlcnNpb24KICAgICB0YWJsZXMgYXJlIGRldGFpbGVkIGRpcmVjdGx5IGluIHRoZSB2YXJpb3VzIFBlbnRpdW0gTSBkYXRhc2hlZXRzOgogICAgIGh0dHA6Ly93d3cuaW50ZWwuY29tL2Rlc2lnbi9pbnRhcmNoL3BlbnRpdW1tL2RvY3NfcGVudGl1bW0uaHRtCisKKyAgICBUaGUgMTQgc3BlY2lmaWNhdGlvbiBjb3JyZXNwb25kcyB0byBJbnRlbCBDb3JlIHNlcmllcy4gVGhlcmUKKyAgICBkb2Vzbid0IHNlZW0gdG8gYmUgYW55IG5hbWVkIHNwZWNpZmljYXRpb24gZm9yIHRoZXNlLiBUaGUgY29udmVyc2lvbgorICAgIHRhYmxlcyBhcmUgZGV0YWlsZWQgZGlyZWN0bHkgaW4gdGhlIHZhcmlvdXMgUGVudGl1bSBDb3JlIGRhdGFzaGVldHM6CisgICAgaHR0cDovL3d3dy5pbnRlbC5jb20vZGVzaWduL21vYmlsZS9kYXRhc2h0cy8zMDkyMjEuaHRtCisKKyAgICBUaGUgMTEwIChWUk0gMTEpIHNwZWNpZmljYXRpb24gY29ycmVzcG9uZHMgdG8gSW50ZWwgQ29ucm9lIGJhc2VkIHNlcmllcy4KKyAgICBodHRwOi8vd3d3LmludGVsLmNvbS9kZXNpZ24vcHJvY2Vzc29yL2FwcGxub3RzLzMxMzIxNC5odG0KICovCiAKIC8qIHZybSBpcyB0aGUgVlJNL1ZSRCBkb2N1bWVudCB2ZXJzaW9uIG11bHRpcGxpZWQgYnkgMTAuCi0gICB2YWwgaXMgdGhlIDQtLCA1LSBvciA2LWJpdCBWSUQgY29kZS4KLSAgIFJldHVybmVkIHZhbHVlIGlzIGluIG1WIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IGluIHRoZSBrZXJuZWwuICovCisgICB2YWwgaXMgdGhlIDQtYml0IG9yIG1vcmUgVklEIGNvZGUuCisgICBSZXR1cm5lZCB2YWx1ZSBpcyBpbiBtViB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBpbiB0aGUga2VybmVsLgorICAgU29tZSBWSUQgaGF2ZSBzb21lIGJpdHMgaW4gdVYgc2NhbGUsIHRoaXMgaXMgcm91bmRlZCB0byBtViAqLwogaW50IHZpZF9mcm9tX3JlZyhpbnQgdmFsLCB1OCB2cm0pCiB7CiAJaW50IHZpZDsKQEAgLTcwLDI2ICs3OSwzNiBAQAogCXN3aXRjaCh2cm0pIHsKIAogCWNhc2UgMTAwOiAgICAgICAgICAgICAgIC8qIFZSRCAxMC4wICovCisJCS8qIGNvbXB1dGUgaW4gdVYsIHJvdW5kIHRvIG1WICovCisJCXZhbCAmPSAweDNmOwogCQlpZigodmFsICYgMHgxZikgPT0gMHgxZikKIAkJCXJldHVybiAwOwogCQlpZigodmFsICYgMHgxZikgPD0gMHgwOSB8fCB2YWwgPT0gMHgwYSkKLQkJCXZpZCA9IDEwODc1IC0gKHZhbCAmIDB4MWYpICogMjUwOworCQkJdmlkID0gMTA4NzUwMCAtICh2YWwgJiAweDFmKSAqIDI1MDAwOwogCQllbHNlCi0JCQl2aWQgPSAxODYyNSAtICh2YWwgJiAweDFmKSAqIDI1MDsKKwkJCXZpZCA9IDE4NjI1MDAgLSAodmFsICYgMHgxZikgKiAyNTAwMDsKIAkJaWYodmFsICYgMHgyMCkKLQkJCXZpZCAtPSAxMjU7Ci0JCXZpZCAvPSAxMDsgICAgICAvKiBvbmx5IHJldHVybiAzIGRlYy4gcGxhY2VzIGZvciBub3cgKi8KLQkJcmV0dXJuIHZpZDsKKwkJCXZpZCAtPSAxMjUwMDsKKwkJcmV0dXJuKCh2aWQgKyA1MDApIC8gMTAwMCk7CiAKKwljYXNlIDExMDoJCS8qIEludGVsIENvbnJvZSAqLworCQkJCS8qIGNvbXB1dGUgaW4gdVYsIHJvdW5kIHRvIG1WICovCisJCXZhbCAmPSAweGZmOworCQlpZigoKHZhbCAmIDB4N2UpID09IDB4ZmUpIHx8ICghKHZhbCAmIDB4N2UpKSkKKwkJCXJldHVybiAwOworCQlyZXR1cm4oKDE2MDAwMDAgLSAodmFsIC0gMikgKiA2MjUwICsgNTAwKSAvIDEwMDApOwogCWNhc2UgMjQ6ICAgICAgICAgICAgICAgIC8qIE9wdGVyb24gcHJvY2Vzc29yICovCisJCXZhbCAmPSAweDFmOwogCQlyZXR1cm4odmFsID09IDB4MWYgPyAwIDogMTU1MCAtIHZhbCAqIDI1KTsKIAogCWNhc2UgOTE6CQkvKiBWUk0gOS4xICovCiAJY2FzZSA5MDoJCS8qIFZSTSA5LjAgKi8KKwkJdmFsICY9IDB4MWY7CiAJCXJldHVybih2YWwgPT0gMHgxZiA/IDAgOgogCQkgICAgICAgICAgICAgICAgICAgICAgIDE4NTAgLSB2YWwgKiAyNSk7CiAKIAljYXNlIDg1OgkJLyogVlJNIDguNSAqLworCQl2YWwgJj0gMHgxZjsKIAkJcmV0dXJuKCh2YWwgJiAweDEwICA/IDI1IDogMCkgKwogCQkgICAgICAgKCh2YWwgJiAweDBmKSA+IDB4MDQgPyAyMDUwIDogMTI1MCkgLQogCQkgICAgICAgKCh2YWwgJiAweDBmKSAqIDUwKSk7CkBAIC05OCwxNCArMTE3LDIxIEBACiAJCXZhbCAmPSAweDBmOwogCQkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgODI6CQkvKiBWUk0gOC4yICovCisJCXZhbCAmPSAweDFmOwogCQlyZXR1cm4odmFsID09IDB4MWYgPyAwIDoKIAkJICAgICAgIHZhbCAmIDB4MTAgID8gNTEwMCAtICh2YWwpICogMTAwIDoKIAkJICAgICAgICAgICAgICAgICAgICAgMjA1MCAtICh2YWwpICogNTApOwogCWNhc2UgMTc6CQkvKiBJbnRlbCBJTVZQLUlJICovCisJCXZhbCAmPSAweDFmOwogCQlyZXR1cm4odmFsICYgMHgxMCA/IDk3NSAtICh2YWwgJiAweEYpICogMjUgOgogCQkJCSAgICAxNzUwIC0gdmFsICogNTApOwogCWNhc2UgMTM6Ci0JCXJldHVybigxNzA4IC0gKHZhbCAmIDB4M2YpICogMTYpOworCQl2YWwgJj0gMHgzZjsKKwkJcmV0dXJuKDE3MDggLSB2YWwgKiAxNik7CisJY2FzZSAxNDoJCS8qIEludGVsIENvcmUgKi8KKwkJCQkvKiBjb21wdXRlIGluIHVWLCByb3VuZCB0byBtViAqLworCQl2YWwgJj0gMHg3ZjsKKwkJcmV0dXJuKHZhbCA+IDB4NzcgPyAwIDogKDE1MDAwMDAgLSAodmFsICogMTI1MDApICsgNTAwKSAvIDEwMDApOwogCWRlZmF1bHQ6CQkvKiByZXBvcnQgMCBmb3IgdW5rbm93biAqLwogCQlwcmludGsoS0VSTl9JTkZPICJod21vbi12aWQ6IHJlcXVlc3RlZCB1bmtub3duIFZSTSB2ZXJzaW9uXG4iKTsKIAkJcmV0dXJuIDA7CkBAIC0xMzgsNiArMTY0LDggQEAKIAl7WDg2X1ZFTkRPUl9JTlRFTCwgMHg2LCAweDksIEFOWSwgMTN9LAkJLyogUGVudGl1bSBNICgxMzAgbm0pICovCiAJe1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgMHhCLCBBTlksIDg1fSwJCS8qIFR1YWxhdGluICovCiAJe1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgMHhELCBBTlksIDEzfSwJCS8qIFBlbnRpdW0gTSAoOTAgbm0pICovCisJe1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgMHhFLCBBTlksIDE0fSwJCS8qIEludGVsIENvcmUgKDY1IG5tKSAqLworCXtYODZfVkVORE9SX0lOVEVMLCAweDYsIDB4RiwgQU5ZLCAxMTB9LAkJLyogSW50ZWwgQ29ucm9lICovCiAJe1g4Nl9WRU5ET1JfSU5URUwsIDB4NiwgQU5ZLCBBTlksIDgyfSwJCS8qIGFueSBQNiAqLwogCXtYODZfVkVORE9SX0lOVEVMLCAweDcsIEFOWSwgQU5ZLCAwfSwJCS8qIEl0YW5pdW0gKi8KIAl7WDg2X1ZFTkRPUl9JTlRFTCwgMHhGLCAweDAsIEFOWSwgOTB9LAkJLyogUDQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG03MC5jIGIvZHJpdmVycy9od21vbi9sbTcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhODQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbG03MC5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogbG03MC5jCisgKgorICogVGhlIExNNzAgaXMgYSB0ZW1wZXJhdHVyZSBzZW5zb3IgY2hpcCBmcm9tIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKE5TKS4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBLYWl3YW4gTiBCaWxsaW1vcmlhIDxrYWl3YW5AZGVzaWduZXJncmFwaGl4LmNvbT4KKyAqCisgKiBUaGUgTE03MCBjb21tdW5pY2F0ZXMgd2l0aCBhIGhvc3QgcHJvY2Vzc29yIHZpYSBhbiBTUEkvTWljcm93aXJlIEJ1cworICogaW50ZXJmYWNlLiBUaGUgY29tcGxldGUgZGF0YXNoZWV0IGlzIGF2YWlsYWJsZSBhdCBOYXRpb25hbCdzIHdlYnNpdGUKKyAqIGhlcmU6CisgKiBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTcwLmh0bWwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjZGVmaW5lIERSVk5BTUUJCSJsbTcwIgorCitzdHJ1Y3QgbG03MCB7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2RldjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKK307CisKKy8qIHN5c2ZzIGhvb2sgZnVuY3Rpb24gKi8KK3N0YXRpYyBzc2l6ZV90IGxtNzBfc2Vuc2VfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IHRvX3NwaV9kZXZpY2UoZGV2KTsKKwlpbnQgc3RhdHVzLCB2YWw7CisJdTggcnhidWZbMl07CisJczE2IHJhdz0wOworCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnBfbG03MC0+c2VtKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCS8qCisJICogc3BpX3JlYWQoKSByZXF1aXJlcyBhIERNQS1zYWZlIGJ1ZmZlcjsgc28gd2UgdXNlCisJICogc3BpX3dyaXRlX3RoZW5fcmVhZCgpLCB0cmFuc21pdHRpbmcgMCBieXRlcy4KKwkgKi8KKwlzdGF0dXMgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHNwaSwgTlVMTCwgMCwgJnJ4YnVmWzBdLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSJzcGlfd3JpdGVfdGhlbl9yZWFkIGZhaWxlZCB3aXRoIHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWRldl9kYmcoZGV2LCAicnhidWZbMV0gOiAweCV4IHJ4YnVmWzBdIDogMHgleFxuIiwgcnhidWZbMV0sIHJ4YnVmWzBdKTsKKworCXJhdyA9IChyeGJ1ZlsxXSA8PCA4KSArIHJ4YnVmWzBdOworCWRldl9kYmcoZGV2LCAicmF3PTB4JXhcbiIsIHJhdyk7CisKKwkvKgorCSAqIFRoZSAicmF3IiB0ZW1wZXJhdHVyZSByZWFkIGludG8gcnhidWZbXSBpcyBhIDE2LWJpdCBzaWduZWQgMidzCisJICogY29tcGxlbWVudCB2YWx1ZS4gT25seSB0aGUgTVNCIDExIGJpdHMgKDEgc2lnbiArIDEwIHRlbXBlcmF0dXJlCisJICogYml0cykgYXJlIG1lYW5pbmdmdWw7IHRoZSBMU0IgNSBiaXRzIGFyZSB0byBiZSBkaXNjYXJkZWQuCisJICogU2VlIHRoZSBkYXRhc2hlZXQuCisJICoKKwkgKiBGdXJ0aGVyLCBlYWNoIGJpdCByZXByZXNlbnRzIDAuMjUgZGVncmVlcyBDZWxzaXVzOyBzbywgbXVsdGlwbHkKKwkgKiBieSAwLjI1LiBBbHNvIG11bHRpcGx5IGJ5IDEwMDAgdG8gcmVwcmVzZW50IGluIG1pbGxpZGVncmVlcworCSAqIENlbHNpdXMuCisJICogU28gaXQncyBlcXVpdmFsZW50IHRvIG11bHRpcGx5aW5nIGJ5IDAuMjUgKiAxMDAwID0gMjUwLgorCSAqLworCXZhbCA9ICgoaW50KXJhdy8zMikgKiAyNTA7CisJc3RhdHVzID0gc3ByaW50ZihidWYsICIlK2RcbiIsIHZhbCk7IC8qIG1pbGxpZGVncmVlcyBDZWxzaXVzICovCitvdXQ6CisJdXAoJnBfbG03MC0+c2VtKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIGxtNzBfc2Vuc2VfdGVtcCwgTlVMTCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGxtNzBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgbG03MCAqcF9sbTcwOworCWludCBzdGF0dXM7CisKKwlwX2xtNzAgPSBremFsbG9jKHNpemVvZiAqcF9sbTcwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBfbG03MCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X01VVEVYKCZwX2xtNzAtPnNlbSk7CisKKwkvKiBzeXNmcyBob29rICovCisJcF9sbTcwLT5jZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKCZzcGktPmRldik7CisJaWYgKElTX0VSUihwX2xtNzAtPmNkZXYpKSB7CisJCWRldl9kYmcoJnNwaS0+ZGV2LCAiaHdtb25fZGV2aWNlX3JlZ2lzdGVyIGZhaWxlZC5cbiIpOworCQlzdGF0dXMgPSBQVFJfRVJSKHBfbG03MC0+Y2Rldik7CisJCWdvdG8gb3V0X2Rldl9yZWdfZmFpbGVkOworCX0KKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBwX2xtNzApOworCisJaWYgKChzdGF0dXMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJnNwaS0+ZGV2LCAmZGV2X2F0dHJfdGVtcDFfaW5wdXQpKSkgeworCQlkZXZfZGJnKCZzcGktPmRldiwgImRldmljZV9jcmVhdGVfZmlsZSBmYWlsdXJlLlxuIik7CisJCWdvdG8gb3V0X2Rldl9jcmVhdGVfZmlsZV9mYWlsZWQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9kZXZfY3JlYXRlX2ZpbGVfZmFpbGVkOgorCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKHBfbG03MC0+Y2Rldik7CitvdXRfZGV2X3JlZ19mYWlsZWQ6CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJa2ZyZWUocF9sbTcwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9fZXhpdCBsbTcwX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBsbTcwICpwX2xtNzAgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKworCWRldmljZV9yZW1vdmVfZmlsZSgmc3BpLT5kZXYsICZkZXZfYXR0cl90ZW1wMV9pbnB1dCk7CisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIocF9sbTcwLT5jZGV2KTsKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKwlrZnJlZShwX2xtNzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBsbTcwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJsbTcwIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSBsbTcwX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChsbTcwX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2xtNzAodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmbG03MF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9sbTcwKHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZsbTcwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbG03MCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2xtNzApOworCitNT0RVTEVfQVVUSE9SKCJLYWl3YW4gTiBCaWxsaW1vcmlhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE03MCBMaW51eCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbG04My5jIGIvZHJpdmVycy9od21vbi9sbTgzLmMKaW5kZXggYWFjNGVjMi4uMjEzN2Q3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9sbTgzLmMKKysrIGIvZHJpdmVycy9od21vbi9sbTgzLmMKQEAgLTEyLDYgKzEyLDEwIEBACiAgKiBTaW5jZSB0aGUgZGF0YXNoZWV0IG9taXRzIHRvIGdpdmUgdGhlIGNoaXAgc3RlcHBpbmcgY29kZSwgSSBnaXZlIGl0CiAgKiBoZXJlOiAweDAzIChhdCByZWdpc3RlciAweGZmKS4KICAqCisgKiBBbHNvIHN1cHBvcnRzIHRoZSBMTTgyIHRlbXAgc2Vuc29yLCB3aGljaCBpcyBiYXNpY2FsbHkgYSBzdHJpcHBlZCBkb3duCisgKiBtb2RlbCBvZiB0aGUgTE04My4gIERhdGFzaGVldCBpcyBoZXJlOgorICogaHR0cDovL3d3dy5uYXRpb25hbC5jb20vcGYvTE0vTE04Mi5odG1sCisgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgpAQCAtNTIsNyArNTYsNyBAQAogICogSW5zbW9kIHBhcmFtZXRlcnMKICAqLwogCi1JMkNfQ0xJRU5UX0lOU01PRF8xKGxtODMpOworSTJDX0NMSUVOVF9JTlNNT0RfMihsbTgzLCBsbTgyKTsKIAogLyoKICAqIFRoZSBMTTgzIHJlZ2lzdGVycwpAQCAtMjgzLDYgKzI4Nyw5IEBACiAJCWlmIChtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCiAJCQlpZiAoY2hpcF9pZCA9PSAweDAzKSB7CiAJCQkJa2luZCA9IGxtODM7CisJCQl9IGVsc2UKKwkJCWlmIChjaGlwX2lkID09IDB4MDEpIHsKKwkJCQlraW5kID0gbG04MjsKIAkJCX0KIAkJfQogCkBAIC0yOTYsNiArMzAzLDkgQEAKIAogCWlmIChraW5kID09IGxtODMpIHsKIAkJbmFtZSA9ICJsbTgzIjsKKwl9IGVsc2UKKwlpZiAoa2luZCA9PSBsbTgyKSB7CisJCW5hbWUgPSAibG04MiI7CiAJfQogCiAJLyogV2UgY2FuIGZpbGwgaW4gdGhlIHJlbWFpbmluZyBjbGllbnQgZmllbGRzICovCkBAIC0zMTksMzIgKzMyOSw0NiBAQAogCQlnb3RvIGV4aXRfZGV0YWNoOwogCX0KIAorCS8qCisJICogVGhlIExNODIgY2FuIG9ubHkgbW9uaXRvciBvbmUgZXh0ZXJuYWwgZGlvZGUgd2hpY2ggaXMKKwkgKiBhdCB0aGUgc2FtZSByZWdpc3RlciBhcyB0aGUgTE04MyB0ZW1wMyBlbnRyeSAtIHNvIHdlCisJICogZGVjbGFyZSAxIGFuZCAzIGNvbW1vbiwgYW5kIHRoZW4gMiBhbmQgNCBvbmx5IGZvciB0aGUgTE04My4KKwkgKi8KKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAogCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0cik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCi0JCQkgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKIAkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0cik7CisKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKIAkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKIAkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyKTsKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWF4LmRldl9hdHRyKTsKKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAogCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0LmRldl9hdHRyKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5ld19jbGllbnQtPmRldiwKLQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0cik7Ci0JZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCiAJCQkgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2NyaXQuZGV2X2F0dHIpOwotCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAotCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9jcml0LmRldl9hdHRyKTsKKwogCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LCAmZGV2X2F0dHJfYWxhcm1zKTsKIAorCWlmIChraW5kID09IGxtODMpIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfaW5wdXQuZGV2X2F0dHIpOworCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZuZXdfY2xpZW50LT5kZXYsCisJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9tYXguZGV2X2F0dHIpOworCisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmbmV3X2NsaWVudC0+ZGV2LAorCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfY3JpdC5kZXZfYXR0cik7CisJfQorCiAJcmV0dXJuIDA7CiAKIGV4aXRfZGV0YWNoOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9zbXNjNDdtMTkyLmMgYi9kcml2ZXJzL2h3bW9uL3Ntc2M0N20xOTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM0NTcwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9zbXNjNDdtMTkyLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgICAgc21zYzQ3bTE5Mi5jIC0gU3VwcG9ydCBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZyBibG9jayBvZgorICAgICAgICAgICAgICAgICAgIFNNU0MgTFBDNDdNMTkyIGFuZCBMUEM0N005OTcgU3VwZXIgSS9PIGNoaXBzCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgIEhhcnRtdXQgUmljayA8bGludXhAcmljay5jbGFyYW5ldC5kZT4KKworICAgIERlcml2ZWQgZnJvbSBsbTc4LmMgYW5kIG90aGVyIGNoaXAgZHJpdmVycy4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi12aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKworLyogQWRkcmVzc2VzIHRvIHNjYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4MmMsIDB4MmQsIEkyQ19DTElFTlRfRU5EIH07CisKKy8qIEluc21vZCBwYXJhbWV0ZXJzICovCitJMkNfQ0xJRU5UX0lOU01PRF8xKHNtc2M0N20xOTIpOworCisvKiBTTVNDNDdNMTkyIHJlZ2lzdGVycyAqLworI2RlZmluZSBTTVNDNDdNMTkyX1JFR19JTihucikJCSgobnIpPDYgPyAoMHgyMCArIChucikpIDogXAorCQkJCQkoMHg1MCArIChucikgLSA2KSkKKyNkZWZpbmUgU01TQzQ3TTE5Ml9SRUdfSU5fTUFYKG5yKQkoKG5yKTw2ID8gKDB4MmIgKyAobnIpICogMikgOiBcCisJCQkJCSgweDU0ICsgKCgobnIpIC0gNikgKiAyKSkpCisjZGVmaW5lIFNNU0M0N00xOTJfUkVHX0lOX01JTihucikJKChucik8NiA/ICgweDJjICsgKG5yKSAqIDIpIDogXAorCQkJCQkoMHg1NSArICgoKG5yKSAtIDYpICogMikpKQorc3RhdGljIHU4IFNNU0M0N00xOTJfUkVHX1RFTVBbM10gPQl7IDB4MjcsIDB4MjYsIDB4NTIgfTsKK3N0YXRpYyB1OCBTTVNDNDdNMTkyX1JFR19URU1QX01BWFszXSA9CXsgMHgzOSwgMHgzNywgMHg1OCB9Oworc3RhdGljIHU4IFNNU0M0N00xOTJfUkVHX1RFTVBfTUlOWzNdID0JeyAweDNBLCAweDM4LCAweDU5IH07CisjZGVmaW5lIFNNU0M0N00xOTJfUkVHX1RFTVBfT0ZGU0VUKG5yKQkoKG5yKT09MiA/IDB4MWUgOiAweDFmKQorI2RlZmluZSBTTVNDNDdNMTkyX1JFR19BTEFSTTEJCTB4NDEKKyNkZWZpbmUgU01TQzQ3TTE5Ml9SRUdfQUxBUk0yCQkweDQyCisjZGVmaW5lIFNNU0M0N00xOTJfUkVHX1ZJRAkJMHg0NworI2RlZmluZSBTTVNDNDdNMTkyX1JFR19WSUQ0CQkweDQ5CisjZGVmaW5lIFNNU0M0N00xOTJfUkVHX0NPTkZJRwkJMHg0MAorI2RlZmluZSBTTVNDNDdNMTkyX1JFR19TRlIJCTB4NGYKKyNkZWZpbmUgU01TQzQ3TTE5Ml9SRUdfQ09NUEFOWV9JRAkweDNlCisjZGVmaW5lIFNNU0M0N00xOTJfUkVHX1ZFUlNJT04JCTB4M2YKKworLyogZ2VuZXJhbGlzZWQgc2NhbGluZyB3aXRoIGludGVnZXIgcm91bmRpbmcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFNDQUxFKGxvbmcgdmFsLCBpbnQgbXVsLCBpbnQgZGl2KQoreworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gKHZhbCAqIG11bCAtIGRpdiAvIDIpIC8gZGl2OworCWVsc2UKKwkJcmV0dXJuICh2YWwgKiBtdWwgKyBkaXYgLyAyKSAvIGRpdjsKK30KKworLyogQ29udmVyc2lvbnMgKi8KKworLyogc21zYzQ3bTE5MiBpbnRlcm5hbGx5IHNjYWxlcyB2b2x0YWdlIG1lYXN1cmVtZW50cyAqLworc3RhdGljIGNvbnN0IHUxNiBub21fbXZbXSA9IHsgMjUwMCwgMjI1MCwgMzMwMCwgNTAwMCwgMTIwMDAsIDMzMDAsIDE1MDAsIDE4MDAgfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgSU5fRlJPTV9SRUcodTggcmVnLCBpbnQgbikKK3sKKwlyZXR1cm4gU0NBTEUocmVnLCBub21fbXZbbl0sIDE5Mik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggSU5fVE9fUkVHKHVuc2lnbmVkIGxvbmcgdmFsLCBpbnQgbikKK3sKKwlyZXR1cm4gU0VOU09SU19MSU1JVChTQ0FMRSh2YWwsIDE5Miwgbm9tX212W25dKSwgMCwgMjU1KTsKK30KKworLyogVEVNUDogMC4wMDEgZGVnQyB1bml0cyAoLTEyOEMgdG8gKzEyN0MpCisgICBSRUc6IDFDL2JpdCwgdHdvJ3MgY29tcGxlbWVudCAqLworc3RhdGljIGlubGluZSBzOCBURU1QX1RPX1JFRyhpbnQgdmFsKQoreworCXJldHVybiBTRU5TT1JTX0xJTUlUKFNDQUxFKHZhbCwgMSwgMTAwMCksIC0xMjgwMDAsIDEyNzAwMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IFRFTVBfRlJPTV9SRUcoczggdmFsKQoreworCXJldHVybiB2YWwgKiAxMDAwOworfQorCitzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjbGllbnQ7CisJc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2OworCXN0cnVjdCBzZW1hcGhvcmUgdXBkYXRlX2xvY2s7CisJY2hhciB2YWxpZDsJCS8qICE9MCBpZiBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBJbiBqaWZmaWVzICovCisKKwl1OCBpbls4XTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWF4WzhdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bOF07CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBbM107CQkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXM4IHRlbXBfbWF4WzNdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwlzOCB0ZW1wX21pblszXTsJCS8qIFJlZ2lzdGVyIHZhbHVlICovCisJczggdGVtcF9vZmZzZXRbM107CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGFsYXJtczsJCS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBjb21iaW5lZCAqLworCXU4IHZpZDsJCQkvKiBSZWdpc3RlciBlbmNvZGluZywgY29tYmluZWQgKi8KKwl1OCB2cm07Cit9OworCitzdGF0aWMgaW50IHNtc2M0N20xOTJfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgc21zYzQ3bTE5Ml9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJaW50IGtpbmQpOworc3RhdGljIGludCBzbXNjNDdtMTkyX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqc21zYzQ3bTE5Ml91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzbXNjNDdtMTkyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJzbXNjNDdtMTkyIiwKKwl9LAorCS5hdHRhY2hfYWRhcHRlcgk9IHNtc2M0N20xOTJfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSBzbXNjNDdtMTkyX2RldGFjaF9jbGllbnQsCit9OworCisvKiBWb2x0YWdlcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBJTl9GUk9NX1JFRyhkYXRhLT5pbltucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWluKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gc21zYzQ3bTE5Ml91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21pbltucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gc21zYzQ3bTE5Ml91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIElOX0ZST01fUkVHKGRhdGEtPmluX21heFtucl0sIG5yKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9pbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKworCWRvd24oJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5pbl9taW5bbnJdID0gSU5fVE9fUkVHKHZhbCwgbnIpOworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTTVNDNDdNMTkyX1JFR19JTl9NSU4obnIpLAorCQkJCQkJCWRhdGEtPmluX21pbltucl0pOworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfaW5fbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+aW5fbWF4W25yXSA9IElOX1RPX1JFRyh2YWwsIG5yKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfSU5fTUFYKG5yKSwKKwkJCQkJCQlkYXRhLT5pbl9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworI2RlZmluZSBzaG93X2luX29mZnNldChvZmZzZXQpCQkJCQlcCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluIyNvZmZzZXQjI19pbnB1dCwgU19JUlVHTywJCVwKKwkJc2hvd19pbiwgTlVMTCwgb2Zmc2V0KTsJCQkJXAorc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbiMjb2Zmc2V0IyNfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQlzaG93X2luX21pbiwgc2V0X2luX21pbiwgb2Zmc2V0KTsJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4jI29mZnNldCMjX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKwkJc2hvd19pbl9tYXgsIHNldF9pbl9tYXgsIG9mZnNldCk7CisKK3Nob3dfaW5fb2Zmc2V0KDApCitzaG93X2luX29mZnNldCgxKQorc2hvd19pbl9vZmZzZXQoMikKK3Nob3dfaW5fb2Zmc2V0KDMpCitzaG93X2luX29mZnNldCg0KQorc2hvd19pbl9vZmZzZXQoNSkKK3Nob3dfaW5fb2Zmc2V0KDYpCitzaG93X2luX29mZnNldCg3KQorCisvKiBUZW1wZXJhdHVyZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBbbnJdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCXN0cnVjdCBzbXNjNDdtMTkyX2RhdGEgKmRhdGEgPSBzbXNjNDdtMTkyX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUF9GUk9NX1JFRyhkYXRhLT50ZW1wX21pbltucl0pKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfbWF4W25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW25yXSA9IFRFTVBfVE9fUkVHKHZhbCk7CisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFNNU0M0N00xOTJfUkVHX1RFTVBfTUlOW25yXSwKKwkJCQkJCWRhdGEtPnRlbXBfbWluW25yXSk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21heChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9tYXhbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfVEVNUF9NQVhbbnJdLAorCQkJCQkJZGF0YS0+dGVtcF9tYXhbbnJdKTsKKwl1cCgmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlCisJCSphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBURU1QX0ZST01fUkVHKGRhdGEtPnRlbXBfb2Zmc2V0W25yXSkpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZQorCQkqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggc2ZyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfU0ZSKTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwlkb3duKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9vZmZzZXRbbnJdID0gVEVNUF9UT19SRUcodmFsKTsKKwlpZiAobnI+MSkKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQlTTVNDNDdNMTkyX1JFR19URU1QX09GRlNFVChuciksIGRhdGEtPnRlbXBfb2Zmc2V0W25yXSk7CisJZWxzZSBpZiAoZGF0YS0+dGVtcF9vZmZzZXRbbnJdICE9IDApIHsKKwkJLyogb2Zmc2V0WzBdIGFuZCBvZmZzZXRbMV0gc2hhcmUgdGhlIHNhbWUgcmVnaXN0ZXIsCisJCQlTRlIgYml0IDQgYWN0aXZhdGVzIG9mZnNldFswXSAqLworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfU0ZSLAorCQkJCQkoc2ZyICYgMHhlZikgfCAobnI9PTAgPyAweDEwIDogMCkpOworCQlkYXRhLT50ZW1wX29mZnNldFsxLW5yXSA9IDA7CisJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJU01TQzQ3TTE5Ml9SRUdfVEVNUF9PRkZTRVQobnIpLCBkYXRhLT50ZW1wX29mZnNldFtucl0pOworCX0gZWxzZSBpZiAoKHNmciAmIDB4MTApID09IChucj09MCA/IDB4MTAgOiAwKSkKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCVNNU0M0N00xOTJfUkVHX1RFTVBfT0ZGU0VUKG5yKSwgMCk7CisJdXAoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNkZWZpbmUgc2hvd190ZW1wX2luZGV4KGluZGV4KQkJCQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjaW5kZXgjI19pbnB1dCwgU19JUlVHTywJCQlcCisJCXNob3dfdGVtcCwgTlVMTCwgaW5kZXgtMSk7CQkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjaW5kZXgjI19taW4sIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X3RlbXBfbWluLCBzZXRfdGVtcF9taW4sIGluZGV4LTEpOwkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjaW5kZXgjI19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAkJXAorCQlzaG93X3RlbXBfbWF4LCBzZXRfdGVtcF9tYXgsIGluZGV4LTEpOwkJCVwKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcCMjaW5kZXgjI19vZmZzZXQsIFNfSVJVR08gfCBTX0lXVVNSLAlcCisJCXNob3dfdGVtcF9vZmZzZXQsIHNldF90ZW1wX29mZnNldCwgaW5kZXgtMSk7CisKK3Nob3dfdGVtcF9pbmRleCgxKQorc2hvd190ZW1wX2luZGV4KDIpCitzaG93X3RlbXBfaW5kZXgoMykKKworLyogVklEICovCitzdGF0aWMgc3NpemVfdCBzaG93X3ZpZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjcHUwX3ZpZCwgU19JUlVHTywgc2hvd192aWQsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT52cm0pOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdnJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWRhdGEtPnZybSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUih2cm0sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3ZybSwgc2V0X3ZybSk7CisKKy8qIEFsYXJtcyAqLworc3RhdGljIHNzaXplX3Qgc2hvd19hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqZGF0YSA9IHNtc2M0N20xOTJfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCAoZGF0YS0+YWxhcm1zICYgbnIpID8gMSA6IDApOworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAweDAwMTApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMHgwMDIwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDB4MDA0MCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2lucHV0X2ZhdWx0LCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAweDQwMDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dF9mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMHg4MDAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4wX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAweDAwMDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDB4MDAwMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMHgwMDA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAweDAwMDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDB4MDEwMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMHgwMjAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW42X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAweDA0MDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjdfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDB4MDgwMCk7CisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW46CisgICAgKiBzbXNjNDdtMTkyX2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorICAgICAgYXZhaWxhYmxlIGFkYXB0ZXIKKyAgICAqIHdoZW4gYSBuZXcgYWRhcHRlciBpcyBpbnNlcnRlZCAoYW5kIHNtc2M0N20xOTJfZHJpdmVyIGlzIHN0aWxsIHByZXNlbnQpICovCitzdGF0aWMgaW50IHNtc2M0N20xOTJfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCWlmICghKGFkYXB0ZXItPmNsYXNzICYgSTJDX0NMQVNTX0hXTU9OKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBzbXNjNDdtMTkyX2RldGVjdCk7Cit9CisKK3N0YXRpYyB2b2lkIHNtc2M0N20xOTJfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgaTsKKwl1OCBjb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTTVNDNDdNMTkyX1JFR19DT05GSUcpOworCXU4IHNmciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIFNNU0M0N00xOTJfUkVHX1NGUik7CisKKwkvKiBzZWxlY3QgY3ljbGUgbW9kZSAocGF1c2UgMSBzZWMgYmV0d2VlbiB1cGRhdGVzKSAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBTTVNDNDdNMTkyX1JFR19TRlIsCisJCQkJCQkoc2ZyICYgMHhmZCkgfCAweDAyKTsKKwlpZiAoIShjb25maWcgJiAweDAxKSkgeworCQkvKiBpbml0aWFsaXplIGFsYXJtIGxpbWl0cyAqLworCQlmb3IgKGk9MDsgaTw4OyBpKyspIHsKKwkJCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAorCQkJCVNNU0M0N00xOTJfUkVHX0lOX01JTihpKSwgMCk7CisJCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQlTTVNDNDdNMTkyX1JFR19JTl9NQVgoaSksIDB4ZmYpOworCQl9CisJCWZvciAoaT0wOyBpPDM7IGkrKykgeworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJU01TQzQ3TTE5Ml9SRUdfVEVNUF9NSU5baV0sIDB4ODApOworCQkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJU01TQzQ3TTE5Ml9SRUdfVEVNUF9NQVhbaV0sIDB4N2YpOworCQl9CisKKwkJLyogc3RhcnQgbW9uaXRvcmluZyAqLworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfQ09ORklHLAorCQkJCQkJKGNvbmZpZyAmIDB4ZjcpIHwgMHgwMSk7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpMmNfcHJvYmUgKi8KK3N0YXRpYyBpbnQgc21zYzQ3bTE5Ml9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhICpkYXRhOworCWludCBlcnIgPSAwOworCWludCB2ZXJzaW9uLCBjb25maWc7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCWdvdG8gZXhpdDsKKworCWlmICghKGRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc21zYzQ3bTE5Ml9kYXRhKSwgR0ZQX0tFUk5FTCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwljbGllbnQgPSAmZGF0YS0+Y2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWNsaWVudC0+YWRkciA9IGFkZHJlc3M7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmRyaXZlciA9ICZzbXNjNDdtMTkyX2RyaXZlcjsKKworCWlmIChraW5kID09IDApCisJCWtpbmQgPSBzbXNjNDdtMTkyOworCisJLyogRGV0ZWN0aW9uIGNyaXRlcmlhIGZyb20gc2Vuc29yc19kZXRlY3Qgc2NyaXB0ICovCisJaWYgKGtpbmQgPCAwKSB7CisJCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCVNNU0M0N00xOTJfUkVHX0NPTVBBTllfSUQpID09IDB4NTUKKwkJICYmICgodmVyc2lvbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJU01TQzQ3TTE5Ml9SRUdfVkVSU0lPTikpICYgMHhmMCkgPT0gMHgyMAorCQkgJiYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJU01TQzQ3TTE5Ml9SRUdfVklEKSAmIDB4NzApID09IDB4MDAKKwkJICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCVNNU0M0N00xOTJfUkVHX1ZJRDQpICYgMHhmZSkgPT0gMHg4MCkgeworCQkJZGV2X2luZm8oJmFkYXB0ZXItPmRldiwKKwkJCQkgImZvdW5kIFNNU0M0N00xOTIgb3IgU01TQzQ3TTk5NywgIgorCQkJCSAidmVyc2lvbiAyLCBzdGVwcGluZyBBJWRcbiIsIHZlcnNpb24gJiAweDBmKTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmFkYXB0ZXItPmRldiwKKwkJCQkiU01TQzQ3TTE5MiBkZXRlY3Rpb24gZmFpbGVkIGF0IDB4JTAyeFxuIiwKKwkJCQlhZGRyZXNzKTsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisJfQorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAic21zYzQ3bTE5MiIsIEkyQ19OQU1FX1NJWkUpOworCWRhdGEtPnZybSA9IHZpZF93aGljaF92cm0oKTsKKwlpbml0X01VVEVYKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJZ290byBleGl0X2ZyZWU7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTTVNDNDdNMTkyIGNoaXAgKi8KKwlzbXNjNDdtMTkyX2luaXRfY2xpZW50KGNsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWRhdGEtPmNsYXNzX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOworCWlmIChJU19FUlIoZGF0YS0+Y2xhc3NfZGV2KSkgeworCQllcnIgPSBQVFJfRVJSKGRhdGEtPmNsYXNzX2Rldik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjBfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4wX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjBfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMF9hbGFybS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4xX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjFfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMV9hbGFybS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjJfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4yX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjJfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luMl9hbGFybS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW4zX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjNfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luM19hbGFybS5kZXZfYXR0cik7CisKKwkvKiBQaW4gMTEwIGlzIGVpdGhlciBpbjQgKCsxMlYpIG9yIFZJRDQgKi8KKwljb25maWcgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTTVNDNDdNMTkyX1JFR19DT05GSUcpOworCWlmICghKGNvbmZpZyAmIDB4MjApKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9pbjRfaW5wdXQuZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJCSAgICZzZW5zb3JfZGV2X2F0dHJfaW40X21pbi5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkJICAgJnNlbnNvcl9kZXZfYXR0cl9pbjRfbWF4LmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCQkgICAmc2Vuc29yX2Rldl9hdHRyX2luNF9hbGFybS5kZXZfYXR0cik7CisJfQorCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luNV9taW4uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW41X21heC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjVfYWxhcm0uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW42X2lucHV0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luNl9taW4uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW42X21heC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjZfYWxhcm0uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW43X2lucHV0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX2luN19taW4uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfaW43X21heC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl9pbjdfYWxhcm0uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfb2Zmc2V0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2FsYXJtLmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsCisJCQkgICAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX29mZnNldC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9hbGFybS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfaW5wdXRfZmF1bHQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZSgmY2xpZW50LT5kZXYsICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwKKwkJCSAgICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfb2Zmc2V0LmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2FsYXJtLmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LAorCQkJICAgJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19pbnB1dF9mYXVsdC5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2NwdTBfdmlkKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoJmNsaWVudC0+ZGV2LCAmZGV2X2F0dHJfdnJtKTsKKworCXJldHVybiAwOworCitleGl0X2RldGFjaDoKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworZXhpdF9mcmVlOgorCWtmcmVlKGRhdGEpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNtc2M0N20xOTJfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBzbXNjNDdtMTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgZXJyOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+Y2xhc3NfZGV2KTsKKworCWlmICgoZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KSkpCisJCXJldHVybiBlcnI7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNtc2M0N20xOTJfZGF0YSAqc21zYzQ3bTE5Ml91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBzbXNjNDdtMTkyX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgaSwgY29uZmlnOworCisJZG93bigmZGF0YS0+dXBkYXRlX2xvY2spOworCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpCisJIHx8ICFkYXRhLT52YWxpZCkgeworCQl1OCBzZnIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBTTVNDNDdNMTkyX1JFR19TRlIpOworCisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiU3RhcnRpbmcgc21zYzQ3bTE5MiB1cGRhdGVcbiIpOworCisJCWZvciAoaSA9IDA7IGkgPD0gNzsgaSsrKSB7CisJCQlkYXRhLT5pbltpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlTTVNDNDdNMTkyX1JFR19JTihpKSk7CisJCQlkYXRhLT5pbl9taW5baV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU01TQzQ3TTE5Ml9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlTTVNDNDdNMTkyX1JFR19JTl9NQVgoaSkpOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCWRhdGEtPnRlbXBbaV0gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJU01TQzQ3TTE5Ml9SRUdfVEVNUFtpXSk7CisJCQlkYXRhLT50ZW1wX21heFtpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlTTVNDNDdNMTkyX1JFR19URU1QX01BWFtpXSk7CisJCQlkYXRhLT50ZW1wX21pbltpXSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCQlTTVNDNDdNMTkyX1JFR19URU1QX01JTltpXSk7CisJCX0KKwkJZm9yIChpID0gMTsgaSA8IDM7IGkrKykKKwkJCWRhdGEtPnRlbXBfb2Zmc2V0W2ldID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNNU0M0N00xOTJfUkVHX1RFTVBfT0ZGU0VUKGkpKTsKKwkJLyogZmlyc3Qgb2Zmc2V0IGlzIHRlbXBfb2Zmc2V0WzBdIGlmIFNGUiBiaXQgNCBpcyBzZXQsCisJCQkJCXRlbXBfb2Zmc2V0WzFdIG90aGVyd2lzZSAqLworCQlpZiAoc2ZyICYgMHgxMCkgeworCQkJZGF0YS0+dGVtcF9vZmZzZXRbMF0gPSBkYXRhLT50ZW1wX29mZnNldFsxXTsKKwkJCWRhdGEtPnRlbXBfb2Zmc2V0WzFdID0gMDsKKwkJfSBlbHNlCisJCQlkYXRhLT50ZW1wX29mZnNldFswXSA9IDA7CisKKwkJZGF0YS0+dmlkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgU01TQzQ3TTE5Ml9SRUdfVklEKQorCQkJICAgICYgMHgwZjsKKwkJY29uZmlnID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCSAgU01TQzQ3TTE5Ml9SRUdfQ09ORklHKTsKKwkJaWYgKGNvbmZpZyAmIDB4MjApCisJCQlkYXRhLT52aWQgfD0gKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCVNNU0M0N00xOTJfUkVHX1ZJRDQpICYgMHgwMSkgPDwgNDsKKwkJZGF0YS0+YWxhcm1zID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJCVNNU0M0N00xOTJfUkVHX0FMQVJNMSkgfAorCQkJICAgICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkgICAgICAgCQkJCVNNU0M0N00xOTJfUkVHX0FMQVJNMikgPDwgOCk7CisKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCXVwKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCBfX2luaXQgc21zYzQ3bTE5Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZzbXNjNDdtMTkyX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzbXNjNDdtMTkyX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmc21zYzQ3bTE5Ml9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJIYXJ0bXV0IFJpY2sgPGxpbnV4QHJpY2suY2xhcmFuZXQuZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNNU0M0N00xOTIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNtc2M0N20xOTJfaW5pdCk7Cittb2R1bGVfZXhpdChzbXNjNDdtMTkyX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYyBiL2RyaXZlcnMvaHdtb24vdzgzNjI3ZWhmLmMKaW5kZXggYjZiZDU2OC4uNDAzMDFiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM2MjdlaGYuYworKysgYi9kcml2ZXJzL2h3bW9uL3c4MzYyN2VoZi5jCkBAIC0zMCwxMCArMzAsNyBAQAogICAgIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY2hpcHM6CiAKICAgICBDaGlwICAgICAgICAjdmluICAgICNmYW4gICAgI3B3bSAgICAjdGVtcCAgIGNoaXBfaWQgbWFuX2lkCi0gICAgdzgzNjI3ZWhmICAgLSAgICAgICA1ICAgICAgIC0gICAgICAgMyAgICAgICAweDg4ICAgIDB4NWNhMwotCi0gICAgVGhpcyBpcyBhIHByZWxpbWluYXJ5IHZlcnNpb24gb2YgdGhlIGRyaXZlciwgb25seSBzdXBwb3J0aW5nIHRoZQotICAgIGZhbiBhbmQgdGVtcGVyYXR1cmUgaW5wdXRzLiBUaGUgY2hpcCBkb2VzIG11Y2ggbW9yZSB0aGFuIHRoYXQuCisgICAgdzgzNjI3ZWhmICAgMTAgICAgICA1ICAgICAgIC0gICAgICAgMyAgICAgICAweDg4ICAgIDB4NWNhMwogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTIxLDYgKzExOCwxNCBAQAogc3RhdGljIGNvbnN0IHUxNiBXODM2MjdFSEZfUkVHX0ZBTltdID0geyAweDI4LCAweDI5LCAweDJhLCAweDNmLCAweDU1MyB9Owogc3RhdGljIGNvbnN0IHUxNiBXODM2MjdFSEZfUkVHX0ZBTl9NSU5bXSA9IHsgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHg1NWMgfTsKIAorLyogVGhlIFc4MzYyN0VIRiByZWdpc3RlcnMgZm9yIG5yPTcsOCw5IGFyZSBpbiBiYW5rIDUgKi8KKyNkZWZpbmUgVzgzNjI3RUhGX1JFR19JTl9NQVgobnIpCSgobnIgPCA3KSA/ICgweDJiICsgKG5yKSAqIDIpIDogXAorCQkJCQkgKDB4NTU0ICsgKCgobnIpIC0gNykgKiAyKSkpCisjZGVmaW5lIFc4MzYyN0VIRl9SRUdfSU5fTUlOKG5yKQkoKG5yIDwgNykgPyAoMHgyYyArIChucikgKiAyKSA6IFwKKwkJCQkJICgweDU1NSArICgoKG5yKSAtIDcpICogMikpKQorI2RlZmluZSBXODM2MjdFSEZfUkVHX0lOKG5yKQkJKChuciA8IDcpID8gKDB4MjAgKyAobnIpKSA6IFwKKwkJCQkJICgweDU1MCArIChucikgLSA3KSkKKwogI2RlZmluZSBXODM2MjdFSEZfUkVHX1RFTVAxCQkweDI3CiAjZGVmaW5lIFc4MzYyN0VIRl9SRUdfVEVNUDFfSFlTVAkweDNhCiAjZGVmaW5lIFc4MzYyN0VIRl9SRUdfVEVNUDFfT1ZFUgkweDM5CkBAIC0xMzYsNiArMTQxLDEwIEBACiAjZGVmaW5lIFc4MzYyN0VIRl9SRUdfRElPREUJCTB4NTkKICNkZWZpbmUgVzgzNjI3RUhGX1JFR19TTUlfT1ZUCQkweDRDCiAKKyNkZWZpbmUgVzgzNjI3RUhGX1JFR19BTEFSTTEJCTB4NDU5CisjZGVmaW5lIFc4MzYyN0VIRl9SRUdfQUxBUk0yCQkweDQ1QQorI2RlZmluZSBXODM2MjdFSEZfUkVHX0FMQVJNMwkJMHg0NUIKKwogLyoKICAqIENvbnZlcnNpb25zCiAgKi8KQEAgLTE3Miw2ICsxODEsMjAgQEAKIAlyZXR1cm4gKHRlbXAgKyA1MDApIC8gMTAwMDsKIH0KIAorLyogU29tZSBvZiBhbmFsb2cgaW5wdXRzIGhhdmUgaW50ZXJuYWwgc2NhbGluZyAoMngpLCA4bVYgaXMgQURDIExTQiAqLworCitzdGF0aWMgdTggc2NhbGVfaW5bMTBdID0geyA4LCA4LCAxNiwgMTYsIDgsIDgsIDgsIDE2LCAxNiwgOCB9OworCitzdGF0aWMgaW5saW5lIGxvbmcgaW5fZnJvbV9yZWcodTggcmVnLCB1OCBucikKK3sKKwlyZXR1cm4gcmVnICogc2NhbGVfaW5bbnJdOworfQorCitzdGF0aWMgaW5saW5lIHU4IGluX3RvX3JlZyh1MzIgdmFsLCB1OCBucikKK3sKKwlyZXR1cm4gU0VOU09SU19MSU1JVCgoKHZhbCArIChzY2FsZV9pbltucl0gLyAyKSkgLyBzY2FsZV9pbltucl0pLCAwLCAyNTUpOworfQorCiAvKgogICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBtYW5pcHVsYXRpb24gdGhlcmVvZgogICovCkBAIC0xODYsNiArMjA5LDkgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLwogCiAJLyogUmVnaXN0ZXIgdmFsdWVzICovCisJdTggaW5bMTBdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbMTBdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9taW5bMTBdOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KIAl1OCBmYW5bNV07CiAJdTggZmFuX21pbls1XTsKIAl1OCBmYW5fZGl2WzVdOwpAQCAtMTk2LDYgKzIyMiw3IEBACiAJczE2IHRlbXBbMl07CiAJczE2IHRlbXBfbWF4WzJdOwogCXMxNiB0ZW1wX21heF9oeXN0WzJdOworCXUzMiBhbGFybXM7CiB9OwogCiBzdGF0aWMgaW5saW5lIGludCBpc193b3JkX3NpemVkKHUxNiByZWcpCkBAIC0zNDksNiArMzc2LDE2IEBACiAJCQlkYXRhLT5mYW5fZGl2WzNdIHw9IChpID4+IDUpICYgMHgwNDsKIAkJfQogCisJCS8qIE1lYXN1cmVkIHZvbHRhZ2VzIGFuZCBsaW1pdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCSAgICAgIFc4MzYyN0VIRl9SRUdfSU4oaSkpOworCQkJZGF0YS0+aW5fbWluW2ldID0gdzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQkgIFc4MzYyN0VIRl9SRUdfSU5fTUlOKGkpKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJICBXODM2MjdFSEZfUkVHX0lOX01BWChpKSk7CisJCX0KKwogCQkvKiBNZWFzdXJlZCBmYW4gc3BlZWRzIGFuZCBsaW1pdHMgKi8KIAkJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewogCQkJaWYgKCEoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IGkpKSkKQEAgLTM5NSw2ICs0MzIsMTMgQEAKIAkJCQkJCSBXODM2MjdFSEZfUkVHX1RFTVBfSFlTVFtpXSk7CiAJCX0KIAorCQlkYXRhLT5hbGFybXMgPSB3ODM2MjdlaGZfcmVhZF92YWx1ZShjbGllbnQsCisJCQkJCVc4MzYyN0VIRl9SRUdfQUxBUk0xKSB8CisJCQkgICAgICAgKHc4MzYyN2VoZl9yZWFkX3ZhbHVlKGNsaWVudCwKKwkJCQkJVzgzNjI3RUhGX1JFR19BTEFSTTIpIDw8IDgpIHwKKwkJCSAgICAgICAodzgzNjI3ZWhmX3JlYWRfdmFsdWUoY2xpZW50LAorCQkJCQlXODM2MjdFSEZfUkVHX0FMQVJNMykgPDwgMTYpOworCiAJCWRhdGEtPmxhc3RfdXBkYXRlZCA9IGppZmZpZXM7CiAJCWRhdGEtPnZhbGlkID0gMTsKIAl9CkBAIC00MDYsNiArNDUwLDEwOSBAQAogLyoKICAqIFN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucwogICovCisjZGVmaW5lIHNob3dfaW5fcmVnKHJlZykgXAorc3RhdGljIHNzaXplX3QgXAorc2hvd18jI3JlZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBcCisJICAgY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3QgdzgzNjI3ZWhmX2RhdGEgKmRhdGEgPSB3ODM2MjdlaGZfdXBkYXRlX2RldmljZShkZXYpOyBcCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsgXAorCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsgXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgaW5fZnJvbV9yZWcoZGF0YS0+cmVnW25yXSwgbnIpKTsgXAorfQorc2hvd19pbl9yZWcoaW4pCitzaG93X2luX3JlZyhpbl9taW4pCitzaG93X2luX3JlZyhpbl9tYXgpCisKKyNkZWZpbmUgc3RvcmVfaW5fcmVnKFJFRywgcmVnKSBcCitzdGF0aWMgc3NpemVfdCBcCitzdG9yZV9pbl8jI3JlZyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpIFwKK3sgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNjI3ZWhmX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsgXAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7IFwKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7IFwKKwl1MzIgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKyBcCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCisJZGF0YS0+aW5fIyNyZWdbbnJdID0gaW5fdG9fcmVnKHZhbCwgbnIpOyBcCisJdzgzNjI3ZWhmX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNjI3RUhGX1JFR19JTl8jI1JFRyhuciksIFwKKwkJCSAgICAgIGRhdGEtPmluXyMjcmVnW25yXSk7IFwKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCXJldHVybiBjb3VudDsgXAorfQorCitzdG9yZV9pbl9yZWcoTUlOLCBtaW4pCitzdG9yZV9pbl9yZWcoTUFYLCBtYXgpCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3ODM2MjdlaGZfZGF0YSAqZGF0YSA9IHc4MzYyN2VoZl91cGRhdGVfZGV2aWNlKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIChkYXRhLT5hbGFybXMgPj4gbnIpICYgMHgwMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX2luX2lucHV0W10gPSB7CisJU0VOU09SX0FUVFIoaW4wX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAwKSwKKwlTRU5TT1JfQVRUUihpbjFfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDEpLAorCVNFTlNPUl9BVFRSKGluMl9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIoaW4zX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAzKSwKKwlTRU5TT1JfQVRUUihpbjRfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDQpLAorCVNFTlNPUl9BVFRSKGluNV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIoaW42X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA2KSwKKwlTRU5TT1JfQVRUUihpbjdfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDcpLAorCVNFTlNPUl9BVFRSKGluOF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgOCksCisJU0VOU09SX0FUVFIoaW45X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA5KSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX2luX2FsYXJtW10gPSB7CisJU0VOU09SX0FUVFIoaW4wX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAwKSwKKwlTRU5TT1JfQVRUUihpbjFfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEpLAorCVNFTlNPUl9BVFRSKGluMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMiksCisJU0VOU09SX0FUVFIoaW4zX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKSwKKwlTRU5TT1JfQVRUUihpbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDgpLAorCVNFTlNPUl9BVFRSKGluNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMjEpLAorCVNFTlNPUl9BVFRSKGluNl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMjApLAorCVNFTlNPUl9BVFRSKGluN19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTYpLAorCVNFTlNPUl9BVFRSKGluOF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTcpLAorCVNFTlNPUl9BVFRSKGluOV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTkpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5fbWluW10gPSB7CisgICAgICAgU0VOU09SX0FUVFIoaW4wX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDApLAorICAgICAgIFNFTlNPUl9BVFRSKGluMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCAxKSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgMiksCisgICAgICAgU0VOU09SX0FUVFIoaW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDMpLAorICAgICAgIFNFTlNPUl9BVFRSKGluNF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCA0KSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjVfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgNSksCisgICAgICAgU0VOU09SX0FUVFIoaW42X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDYpLAorICAgICAgIFNFTlNPUl9BVFRSKGluN19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCA3KSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjhfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgOCksCisgICAgICAgU0VOU09SX0FUVFIoaW45X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDkpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5fbWF4W10gPSB7CisgICAgICAgU0VOU09SX0FUVFIoaW4wX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDApLAorICAgICAgIFNFTlNPUl9BVFRSKGluMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgMiksCisgICAgICAgU0VOU09SX0FUVFIoaW4zX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDMpLAorICAgICAgIFNFTlNPUl9BVFRSKGluNF9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCA0KSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjVfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgNSksCisgICAgICAgU0VOU09SX0FUVFIoaW42X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDYpLAorICAgICAgIFNFTlNPUl9BVFRSKGluN19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCA3KSwKKyAgICAgICBTRU5TT1JfQVRUUihpbjhfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgOCksCisgICAgICAgU0VOU09SX0FUVFIoaW45X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDkpLAorfTsKKworc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9maWxlX2luKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGkpCit7CisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9pbl9pbnB1dFtpXS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9pbl9hbGFybVtpXS5kZXZfYXR0cik7CisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9pbl9taW5baV0uZGV2X2F0dHIpOworCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5fbWF4W2ldLmRldl9hdHRyKTsKK30KIAogI2RlZmluZSBzaG93X2Zhbl9yZWcocmVnKSBcCiBzdGF0aWMgc3NpemVfdCBcCkBAIC01MDUsNiArNjUyLDE0IEBACiAJU0VOU09SX0FUVFIoZmFuNV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDQpLAogfTsKIAorc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfZmFuX2FsYXJtW10gPSB7CisJU0VOU09SX0FUVFIoZmFuMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNiksCisJU0VOU09SX0FUVFIoZmFuMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIoZmFuM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTEpLAorCVNFTlNPUl9BVFRSKGZhbjRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEwKSwKKwlTRU5TT1JfQVRUUihmYW41X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyMyksCit9OworCiBzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9mYW5fbWluW10gPSB7CiAJU0VOU09SX0FUVFIoZmFuMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2Zhbl9taW4sCiAJCSAgICBzdG9yZV9mYW5fbWluLCAwKSwKQEAgLTUyOSw2ICs2ODQsNyBAQAogc3RhdGljIHZvaWQgZGV2aWNlX2NyZWF0ZV9maWxlX2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpKQogewogCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfZmFuX2lucHV0W2ldLmRldl9hdHRyKTsKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9hbGFybVtpXS5kZXZfYXR0cik7CiAJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9mYW5fZGl2W2ldLmRldl9hdHRyKTsKIAlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9taW5baV0uZGV2X2F0dHIpOwogfQpAQCAtNjE2LDYgKzc3Miw5IEBACiAJCSAgICBzdG9yZV90ZW1wX21heF9oeXN0LCAwKSwKIAlTRU5TT1JfQVRUUih0ZW1wM19tYXhfaHlzdCwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfdGVtcF9tYXhfaHlzdCwKIAkJICAgIHN0b3JlX3RlbXBfbWF4X2h5c3QsIDEpLAorCVNFTlNPUl9BVFRSKHRlbXAxX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KSwKKwlTRU5TT1JfQVRUUih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNSksCisJU0VOU09SX0FUVFIodGVtcDNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKSwKIH07CiAKIC8qCkBAIC03MDUsNiArODY0LDkgQEAKIAkJZ290byBleGl0X2RldGFjaDsKIAl9CiAKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZGV2aWNlX2NyZWF0ZV9maWxlX2luKGRldiwgaSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CiAJCWlmIChkYXRhLT5oYXNfZmFuICYgKDEgPDwgaSkpCiAJCQlkZXZpY2VfY3JlYXRlX2ZpbGVfZmFuKGRldiwgaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYyBiL2RyaXZlcnMvaHdtb24vdzgzNzkxZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYzQzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL3c4Mzc5MWQuYwpAQCAtMCwwICsxLDEyNTUgQEAKKy8qCisgICAgdzgzNzkxZC5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nCisKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hhcmxlcyBTcGlyYWtpcyA8YmV6YXVyQGdtYWlsLmNvbT4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyoKKyAgICBTdXBwb3J0cyBmb2xsb3dpbmcgY2hpcHM6CisKKyAgICBDaGlwCSN2aW4JI2ZhbmluCSNwd20JI3RlbXAJd2NoaXBpZAl2ZW5kaWQJaTJjCUlTQQorICAgIHc4Mzc5MWQJMTAJNQkzCTMJMHg3MQkweDVjYTMJeWVzCW5vCisKKyAgICBUaGUgdzgzNzkxZCBjaGlwIGFwcGVhcnMgdG8gYmUgcGFydCB3YXkgYmV0d2VlbiB0aGUgODM3ODFkIGFuZCB0aGUKKyAgICA4Mzc5MmQuIFRodXMsIHRoaXMgZmlsZSBpcyBkZXJpdmVkIGZyb20gYm90aCB0aGUgdzgzNzkyZC5jIGFuZAorICAgIHc4Mzc4MWQuYyBmaWxlcywgYnV0IGl0cyBvdXRwdXQgaXMgbW9yZSBhbG9uZyB0aGUgbGluZXMgb2YgdGhlCisgICAgODM3ODFkICh3aGljaCBtZWFucyB0aGVyZSBhcmUgbm8gY2hhbmdlcyB0byB0aGUgdXNlci1tb2RlIHNlbnNvcnMKKyAgICBwcm9ncmFtIHdoaWNoIHRyZWF0cyB0aGUgODM3OTFkIGFzIGFuIDgzNzgxZCkuCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXZpZC5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKworI2RlZmluZSBOVU1CRVJfT0ZfVklOCQkxMAorI2RlZmluZSBOVU1CRVJfT0ZfRkFOSU4JCTUKKyNkZWZpbmUgTlVNQkVSX09GX1RFTVBJTgkzCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDJjLCAweDJkLCAweDJlLCAweDJmLCBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBJbnNtb2QgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0RfMSh3ODM3OTFkKTsKK0kyQ19DTElFTlRfTU9EVUxFX1BBUk0oZm9yY2Vfc3ViY2xpZW50cywgIkxpc3Qgb2Ygc3ViY2xpZW50IGFkZHJlc3NlczogIgorCQkJIntidXMsIGNsaWVudGFkZHIsIHN1YmNsaWVudGFkZHIxLCBzdWJjbGllbnRhZGRyMn0iKTsKKworc3RhdGljIGludCByZXNldDsKK21vZHVsZV9wYXJhbShyZXNldCwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlc2V0LCAiU2V0IHRvIG9uZSB0byBmb3JjZSBhIGhhcmR3YXJlIGNoaXAgcmVzZXQiKTsKKworc3RhdGljIGludCBpbml0OworbW9kdWxlX3BhcmFtKGluaXQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpbml0LCAiU2V0IHRvIG9uZSB0byBmb3JjZSBleHRyYSBzb2Z0d2FyZSBpbml0aWFsaXphdGlvbiIpOworCisvKiBUaGUgVzgzNzkxRCByZWdpc3RlcnMgKi8KK3N0YXRpYyBjb25zdCB1OCBXODM3OTFEX1JFR19JTltOVU1CRVJfT0ZfVklOXSA9IHsKKwkweDIwLAkJCS8qIFZDT1JFQSBpbiBEYXRhU2hlZXQgKi8KKwkweDIxLAkJCS8qIFZJTlIwIGluIERhdGFTaGVldCAqLworCTB4MjIsCQkJLyogKzMuM1ZJTiBpbiBEYXRhU2hlZXQgKi8KKwkweDIzLAkJCS8qIFZERDVWIGluIERhdGFTaGVldCAqLworCTB4MjQsCQkJLyogKzEyVklOIGluIERhdGFTaGVldCAqLworCTB4MjUsCQkJLyogLTEyVklOIGluIERhdGFTaGVldCAqLworCTB4MjYsCQkJLyogLTVWSU4gaW4gRGF0YVNoZWV0ICovCisJMHhCMCwJCQkvKiA1VlNCIGluIERhdGFTaGVldCAqLworCTB4QjEsCQkJLyogVkJBVCBpbiBEYXRhU2hlZXQgKi8KKwkweEIyCQkJLyogVklOUjEgaW4gRGF0YVNoZWV0ICovCit9OworCitzdGF0aWMgY29uc3QgdTggVzgzNzkxRF9SRUdfSU5fTUFYW05VTUJFUl9PRl9WSU5dID0geworCTB4MkIsCQkJLyogVkNPUkVBIEhpZ2ggTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgyRCwJCQkvKiBWSU5SMCBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MkYsCQkJLyogKzMuM1ZJTiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MzEsCQkJLyogVkRENVYgSGlnaCBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweDMzLAkJCS8qICsxMlZJTiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MzUsCQkJLyogLTEyVklOIEhpZ2ggTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzNywJCQkvKiAtNVZJTiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QjQsCQkJLyogNVZTQiBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QjYsCQkJLyogVkJBVCBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QjgJCQkvKiBWSU5SMSBIaWdoIExpbWl0IGluIERhdGFTaGVldCAqLworfTsKK3N0YXRpYyBjb25zdCB1OCBXODM3OTFEX1JFR19JTl9NSU5bTlVNQkVSX09GX1ZJTl0gPSB7CisJMHgyQywJCQkvKiBWQ09SRUEgTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MkUsCQkJLyogVklOUjAgTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MzAsCQkJLyogKzMuM1ZJTiBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzMiwJCQkvKiBWREQ1ViBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzNCwJCQkvKiArMTJWSU4gTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4MzYsCQkJLyogLTEyVklOIExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweDM4LAkJCS8qIC01VklOIExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KKwkweEI1LAkJCS8qIDVWU0IgTG93IExpbWl0IGluIERhdGFTaGVldCAqLworCTB4QjcsCQkJLyogVkJBVCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCOQkJCS8qIFZJTlIxIExvdyBMaW1pdCBpbiBEYXRhU2hlZXQgKi8KK307CitzdGF0aWMgY29uc3QgdTggVzgzNzkxRF9SRUdfRkFOW05VTUJFUl9PRl9GQU5JTl0gPSB7CisJMHgyOCwJCQkvKiBGQU4gMSBDb3VudCBpbiBEYXRhU2hlZXQgKi8KKwkweDI5LAkJCS8qIEZBTiAyIENvdW50IGluIERhdGFTaGVldCAqLworCTB4MkEsCQkJLyogRkFOIDMgQ291bnQgaW4gRGF0YVNoZWV0ICovCisJMHhCQSwJCQkvKiBGQU4gNCBDb3VudCBpbiBEYXRhU2hlZXQgKi8KKwkweEJCLAkJCS8qIEZBTiA1IENvdW50IGluIERhdGFTaGVldCAqLworfTsKK3N0YXRpYyBjb25zdCB1OCBXODM3OTFEX1JFR19GQU5fTUlOW05VTUJFUl9PRl9GQU5JTl0gPSB7CisJMHgzQiwJCQkvKiBGQU4gMSBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzQywJCQkvKiBGQU4gMiBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHgzRCwJCQkvKiBGQU4gMyBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCQywJCQkvKiBGQU4gNCBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCisJMHhCRCwJCQkvKiBGQU4gNSBDb3VudCBMb3cgTGltaXQgaW4gRGF0YVNoZWV0ICovCit9OworCitzdGF0aWMgY29uc3QgdTggVzgzNzkxRF9SRUdfRkFOX0NGR1syXSA9IHsKKwkweDg0LAkJCS8qIEZBTiAxLzIgY29uZmlndXJhdGlvbiAqLworCTB4OTUsCQkJLyogRkFOIDMgY29uZmlndXJhdGlvbiAqLworfTsKKworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MURfUkVHX0ZBTl9ESVZbM10gPSB7CisJMHg0NywJCQkvKiBjb250YWlucyBGQU4xIGFuZCBGQU4yIERpdmlzb3IgKi8KKwkweDRiLAkJCS8qIGNvbnRhaW5zIEZBTjMgRGl2aXNvciAqLworCTB4NUMsCQkJLyogY29udGFpbnMgRkFONCBhbmQgRkFONSBEaXZpc29yICovCit9OworCisjZGVmaW5lIFc4Mzc5MURfUkVHX0JBTksJCTB4NEUKKyNkZWZpbmUgVzgzNzkxRF9SRUdfVEVNUDJfQ09ORklHCTB4QzIKKyNkZWZpbmUgVzgzNzkxRF9SRUdfVEVNUDNfQ09ORklHCTB4Q0EKKworc3RhdGljIGNvbnN0IHU4IFc4Mzc5MURfUkVHX1RFTVAxWzNdID0geworCTB4MjcsCQkJLyogVEVNUCAxIGluIERhdGFTaGVldCAqLworCTB4MzksCQkJLyogVEVNUCAxIE92ZXIgaW4gRGF0YVNoZWV0ICovCisJMHgzQSwJCQkvKiBURU1QIDEgSHlzdCBpbiBEYXRhU2hlZXQgKi8KK307CisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTFEX1JFR19URU1QX0FERFsyXVs2XSA9IHsKKwl7MHhDMCwJCQkvKiBURU1QIDIgaW4gRGF0YVNoZWV0ICovCisJIDB4QzEsCQkJLyogVEVNUCAyKDAuNSBkZWcpIGluIERhdGFTaGVldCAqLworCSAweEM1LAkJCS8qIFRFTVAgMiBPdmVyIEhpZ2ggcGFydCBpbiBEYXRhU2hlZXQgKi8KKwkgMHhDNiwJCQkvKiBURU1QIDIgT3ZlciBMb3cgcGFydCBpbiBEYXRhU2hlZXQgKi8KKwkgMHhDMywJCQkvKiBURU1QIDIgVGh5c3QgSGlnaCBwYXJ0IGluIERhdGFTaGVldCAqLworCSAweEM0fSwJCQkvKiBURU1QIDIgVGh5c3QgTG93IHBhcnQgaW4gRGF0YVNoZWV0ICovCisJezB4QzgsCQkJLyogVEVNUCAzIGluIERhdGFTaGVldCAqLworCSAweEM5LAkJCS8qIFRFTVAgMygwLjUgZGVnKSBpbiBEYXRhU2hlZXQgKi8KKwkgMHhDRCwJCQkvKiBURU1QIDMgT3ZlciBIaWdoIHBhcnQgaW4gRGF0YVNoZWV0ICovCisJIDB4Q0UsCQkJLyogVEVNUCAzIE92ZXIgTG93IHBhcnQgaW4gRGF0YVNoZWV0ICovCisJIDB4Q0IsCQkJLyogVEVNUCAzIFRoeXN0IEhpZ2ggcGFydCBpbiBEYXRhU2hlZXQgKi8KKwkgMHhDQ30JCQkvKiBURU1QIDMgVGh5c3QgTG93IHBhcnQgaW4gRGF0YVNoZWV0ICovCit9OworCisjZGVmaW5lIFc4Mzc5MURfUkVHX0JFRVBfQ09ORklHCQkweDRECisKK3N0YXRpYyBjb25zdCB1OCBXODM3OTFEX1JFR19CRUVQX0NUUkxbM10gPSB7CisJMHg1NiwJCQkvKiBCRUVQIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworCTB4NTcsCQkJLyogQkVFUCBDb250cm9sIFJlZ2lzdGVyIDIgKi8KKwkweEEzLAkJCS8qIEJFRVAgQ29udHJvbCBSZWdpc3RlciAzICovCit9OworCisjZGVmaW5lIFc4Mzc5MURfUkVHX0NPTkZJRwkJMHg0MAorI2RlZmluZSBXODM3OTFEX1JFR19WSURfRkFORElWCQkweDQ3CisjZGVmaW5lIFc4Mzc5MURfUkVHX0RJRF9WSUQ0CQkweDQ5CisjZGVmaW5lIFc4Mzc5MURfUkVHX1dDSElQSUQJCTB4NTgKKyNkZWZpbmUgVzgzNzkxRF9SRUdfQ0hJUE1BTgkJMHg0RgorI2RlZmluZSBXODM3OTFEX1JFR19QSU4JCQkweDRCCisjZGVmaW5lIFc4Mzc5MURfUkVHX0kyQ19TVUJBRERSCQkweDRBCisKKyNkZWZpbmUgVzgzNzkxRF9SRUdfQUxBUk0xIDB4QTkJLyogcmVhbHRpbWUgc3RhdHVzIHJlZ2lzdGVyMSAqLworI2RlZmluZSBXODM3OTFEX1JFR19BTEFSTTIgMHhBQQkvKiByZWFsdGltZSBzdGF0dXMgcmVnaXN0ZXIyICovCisjZGVmaW5lIFc4Mzc5MURfUkVHX0FMQVJNMyAweEFCCS8qIHJlYWx0aW1lIHN0YXR1cyByZWdpc3RlcjMgKi8KKworI2RlZmluZSBXODM3OTFEX1JFR19WQkFUCQkweDVECisjZGVmaW5lIFc4Mzc5MURfUkVHX0kyQ19BRERSCQkweDQ4CisKKy8qIFRoZSBTTUJ1cyBsb2NrcyBpdHNlbGYuIFRoZSBXaW5ib25kIFc4Mzc5MUQgaGFzIGEgYmFuayBzZWxlY3QgcmVnaXN0ZXIKKyAgIChpbmRleCAweDRlKSwgYnV0IHRoZSBkcml2ZXIgb25seSBhY2Nlc3NlcyByZWdpc3RlcnMgaW4gYmFuayAwLiBTaW5jZQorICAgd2UgZG9uJ3Qgc3dpdGNoIGJhbmtzLCB3ZSBkb24ndCBuZWVkIGFueSBzcGVjaWFsIGNvZGUgdG8gaGFuZGxlCisgICBsb2NraW5nIGFjY2VzcyBiZXR3ZWVuIGJhbmsgc3dpdGNoZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHc4Mzc5MWRfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcpCit7CisJcmV0dXJuIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHc4Mzc5MWRfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgdmFsdWUpOworfQorCisvKiBUaGUgYW5hbG9nIHZvbHRhZ2UgaW5wdXRzIGhhdmUgMTZtViBMU0IuIFNpbmNlIHRoZSBzeXNmcyBvdXRwdXQgaXMKKyAgIGluIG1WIGFzIHdvdWxkIGJlIG1lYXN1cmVkIG9uIHRoZSBjaGlwIGlucHV0IHBpbiwgbmVlZCB0byBqdXN0CisgICBtdWx0aXBseS9kaXZpZGUgYnkgMTYgdG8gdHJhbnNsYXRlIGZyb20vdG8gcmVnaXN0ZXIgdmFsdWVzLiAqLworI2RlZmluZSBJTl9UT19SRUcodmFsKQkJKFNFTlNPUlNfTElNSVQoKCgodmFsKSArIDgpIC8gMTYpLCAwLCAyNTUpKQorI2RlZmluZSBJTl9GUk9NX1JFRyh2YWwpCSgodmFsKSAqIDE2KQorCitzdGF0aWMgdTggZmFuX3RvX3JlZyhsb25nIHJwbSwgaW50IGRpdikKK3sKKwlpZiAocnBtID09IDApCisJCXJldHVybiAyNTU7CisJcnBtID0gU0VOU09SU19MSU1JVChycG0sIDEsIDEwMDAwMDApOworCXJldHVybiBTRU5TT1JTX0xJTUlUKCgxMzUwMDAwICsgcnBtICogZGl2IC8gMikgLyAocnBtICogZGl2KSwgMSwgMjU0KTsKK30KKworI2RlZmluZSBGQU5fRlJPTV9SRUcodmFsLGRpdikJKCh2YWwpID09IDAgICA/IC0xIDogXAorCQkJCSgodmFsKSA9PSAyNTUgPyAwIDogXAorCQkJCQkxMzUwMDAwIC8gKCh2YWwpICogKGRpdikpKSkKKworLyogZm9yIHRlbXAxIHdoaWNoIGlzIDgtYml0IHJlc29sdXRpb24sIExTQiA9IDEgZGVncmVlIENlbHNpdXMgKi8KKyNkZWZpbmUgVEVNUDFfRlJPTV9SRUcodmFsKQkoKHZhbCkgKiAxMDAwKQorI2RlZmluZSBURU1QMV9UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IC0xMjggOiBcCisJCQkJICh2YWwpID49IDEyNzAwMCA/IDEyNyA6IFwKKwkJCQkgKHZhbCkgPCAwID8gKCh2YWwpIC0gNTAwKSAvIDEwMDAgOiBcCisJCQkJICgodmFsKSArIDUwMCkgLyAxMDAwKQorCisvKiBmb3IgdGVtcDIgYW5kIHRlbXAzIHdoaWNoIGFyZSA5LWJpdCByZXNvbHV0aW9uLCBMU0IgPSAwLjUgZGVncmVlIENlbHNpdXMKKyAgIEFzc3VtZXMgdGhlIHRvcCA4IGJpdHMgYXJlIHRoZSBpbnRlZ3JhbCBhbW91bnQgYW5kIHRoZSBib3R0b20gOCBiaXRzCisgICBhcmUgdGhlIGZyYWN0aW9uYWwgYW1vdW50LiBTaW5jZSB3ZSBvbmx5IGhhdmUgMC41IGRlZ3JlZSByZXNvbHV0aW9uLAorICAgdGhlIGJvdHRvbSA3IGJpdHMgd2lsbCBhbHdheXMgYmUgemVybyAqLworI2RlZmluZSBURU1QMjNfRlJPTV9SRUcodmFsKQkoKHZhbCkgLyAxMjggKiA1MDApCisjZGVmaW5lIFRFTVAyM19UT19SRUcodmFsKQkoKHZhbCkgPD0gLTEyODAwMCA/IDB4ODAwMCA6IFwKKwkJCQkgKHZhbCkgPj0gMTI3NTAwID8gMHg3RjgwIDogXAorCQkJCSAodmFsKSA8IDAgPyAoKHZhbCkgLSAyNTApIC8gNTAwICogMTI4IDogXAorCQkJCSAoKHZhbCkgKyAyNTApIC8gNTAwICogMTI4KQorCisKKyNkZWZpbmUgQkVFUF9NQVNLX1RPX1JFRyh2YWwpCQkoKHZhbCkgJiAweGZmZmZmZikKKyNkZWZpbmUgQkVFUF9NQVNLX0ZST01fUkVHKHZhbCkJCSgodmFsKSAmIDB4ZmZmZmZmKQorCisjZGVmaW5lIERJVl9GUk9NX1JFRyh2YWwpCQkoMSA8PCAodmFsKSkKKworc3RhdGljIHU4IGRpdl90b19yZWcoaW50IG5yLCBsb25nIHZhbCkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4OworCisJLyogZmlyc3QgdGhyZWUgZmFuJ3MgZGl2aXNvciBtYXggb3V0IGF0IDgsIHJlc3QgbWF4IG91dCBhdCAxMjggKi8KKwltYXggPSAobnIgPCAzKSA/IDggOiAxMjg7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDEsIG1heCkgPj4gMTsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCQl2YWwgPj49IDE7CisJfQorCXJldHVybiAodTgpIGk7Cit9CisKK3N0cnVjdCB3ODM3OTFkX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50IGNsaWVudDsKKwlzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXY7CisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCisJY2hhciB2YWxpZDsJCQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJLyogYXJyYXkgb2YgMiBwb2ludGVycyB0byBzdWJjbGllbnRzICovCisJc3RydWN0IGkyY19jbGllbnQgKmxtNzVbMl07CisKKwkvKiB2b2x0cyAqLworCXU4IGluW05VTUJFUl9PRl9WSU5dOwkJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBpbl9tYXhbTlVNQkVSX09GX1ZJTl07CS8qIFJlZ2lzdGVyIHZhbHVlICovCisJdTggaW5fbWluW05VTUJFUl9PRl9WSU5dOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCisJLyogZmFucyAqLworCXU4IGZhbltOVU1CRVJfT0ZfRkFOSU5dOwkvKiBSZWdpc3RlciB2YWx1ZSAqLworCXU4IGZhbl9taW5bTlVNQkVSX09GX0ZBTklOXTsJLyogUmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCBmYW5fZGl2W05VTUJFUl9PRl9GQU5JTl07CS8qIFJlZ2lzdGVyIGVuY29kaW5nLCBzaGlmdGVkIHJpZ2h0ICovCisKKwkvKiBUZW1wZXJhdHVyZSBzZW5zb3JzICovCisKKwlzOCB0ZW1wMVszXTsJCS8qIGN1cnJlbnQsIG92ZXIsIHRoeXN0ICovCisJczE2IHRlbXBfYWRkWzJdWzNdOwkvKiBmaXhlZCBwb2ludCB2YWx1ZS4gVG9wIDggYml0cyBhcmUgdGhlCisJCQkJICAgaW50ZWdyYWwgcGFydCwgYm90dG9tIDggYml0cyBhcmUgdGhlCisJCQkJICAgZnJhY3Rpb25hbCBwYXJ0LiBXZSBvbmx5IHVzZSB0aGUgdG9wCisJCQkJICAgOSBiaXRzIGFzIHRoZSByZXNvbHV0aW9uIGlzIG9ubHkKKwkJCQkgICB0byB0aGUgMC41IGRlZ3JlZSBDLi4uCisJCQkJICAgdHdvIHNlbnNvcnMgd2l0aCB0aHJlZSB2YWx1ZXMKKwkJCQkgICAoY3VyLCBvdmVyLCBoeXN0KSAgKi8KKworCS8qIE1pc2MgKi8KKwl1MzIgYWxhcm1zOwkJLyogcmVhbHRpbWUgc3RhdHVzIHJlZ2lzdGVyIGVuY29kaW5nLGNvbWJpbmVkICovCisJdTggYmVlcF9lbmFibGU7CQkvKiBHbG9iYWwgYmVlcCBlbmFibGUgKi8KKwl1MzIgYmVlcF9tYXNrOwkJLyogTWFzayBvZmYgc3BlY2lmaWMgYmVlcHMgKi8KKwl1OCB2aWQ7CQkJLyogUmVnaXN0ZXIgZW5jb2RpbmcsIGNvbWJpbmVkICovCisJdTggdnJtOwkJCS8qIGh3bW9uLXZpZCAqLworfTsKKworc3RhdGljIGludCB3ODM3OTFkX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcik7CitzdGF0aWMgaW50IHc4Mzc5MWRfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKTsKK3N0YXRpYyBpbnQgdzgzNzkxZF9kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworCitzdGF0aWMgaW50IHc4Mzc5MWRfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWdpc3Rlcik7CitzdGF0aWMgaW50IHc4Mzc5MWRfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnaXN0ZXIsIHU4IHZhbHVlKTsKK3N0YXRpYyBzdHJ1Y3QgdzgzNzkxZF9kYXRhICp3ODM3OTFkX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCB3ODM3OTFkX3ByaW50X2RlYnVnKHN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEsIHN0cnVjdCBkZXZpY2UgKmRldik7CisjZW5kaWYKKworc3RhdGljIHZvaWQgdzgzNzkxZF9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHc4Mzc5MWRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInc4Mzc5MWQiLAorCX0sCisJLmF0dGFjaF9hZGFwdGVyID0gdzgzNzkxZF9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudCA9IHc4Mzc5MWRfZGV0YWNoX2NsaWVudCwKK307CisKKy8qIGZvbGxvd2luZyBhcmUgdGhlIHN5c2ZzIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworI2RlZmluZSBzaG93X2luX3JlZyhyZWcpIFwKK3N0YXRpYyBzc2l6ZV90IHNob3dfIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgXAorCQkJY2hhciAqYnVmKSBcCit7IFwKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gXAorCQkJCQkJdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOyBcCisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOyBcCisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OyBcCisJcmV0dXJuIHNwcmludGYoYnVmLCIlZFxuIiwgSU5fRlJPTV9SRUcoZGF0YS0+cmVnW25yXSkpOyBcCit9CisKK3Nob3dfaW5fcmVnKGluKTsKK3Nob3dfaW5fcmVnKGluX21pbik7CitzaG93X2luX3JlZyhpbl9tYXgpOworCisjZGVmaW5lIHN0b3JlX2luX3JlZyhSRUcsIHJlZykgXAorc3RhdGljIHNzaXplX3Qgc3RvcmVfaW5fIyNyZWcoc3RydWN0IGRldmljZSAqZGV2LCBcCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkgXAoreyBcCisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IFwKKwkJCQkJCXRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsgXAorCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7IFwKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7IFwKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOyBcCisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OyBcCisJIFwKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKKwlkYXRhLT5pbl8jI3JlZ1tucl0gPSBJTl9UT19SRUcodmFsKTsgXAorCXc4Mzc5MWRfd3JpdGUoY2xpZW50LCBXODM3OTFEX1JFR19JTl8jI1JFR1tucl0sIGRhdGEtPmluXyMjcmVnW25yXSk7IFwKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsgXAorCSBcCisJcmV0dXJuIGNvdW50OyBcCit9CitzdG9yZV9pbl9yZWcoTUlOLCBtaW4pOworc3RvcmVfaW5fcmVnKE1BWCwgbWF4KTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5faW5wdXRbXSA9IHsKKwlTRU5TT1JfQVRUUihpbjBfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDApLAorCVNFTlNPUl9BVFRSKGluMV9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgMSksCisJU0VOU09SX0FUVFIoaW4yX2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCAyKSwKKwlTRU5TT1JfQVRUUihpbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDMpLAorCVNFTlNPUl9BVFRSKGluNF9pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNCksCisJU0VOU09SX0FUVFIoaW41X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA1KSwKKwlTRU5TT1JfQVRUUihpbjZfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDYpLAorCVNFTlNPUl9BVFRSKGluN19pbnB1dCwgU19JUlVHTywgc2hvd19pbiwgTlVMTCwgNyksCisJU0VOU09SX0FUVFIoaW44X2lucHV0LCBTX0lSVUdPLCBzaG93X2luLCBOVUxMLCA4KSwKKwlTRU5TT1JfQVRUUihpbjlfaW5wdXQsIFNfSVJVR08sIHNob3dfaW4sIE5VTEwsIDkpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5fbWluW10gPSB7CisJU0VOU09SX0FUVFIoaW4wX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDApLAorCVNFTlNPUl9BVFRSKGluMV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCAxKSwKKwlTRU5TT1JfQVRUUihpbjJfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgMiksCisJU0VOU09SX0FUVFIoaW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDMpLAorCVNFTlNPUl9BVFRSKGluNF9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCA0KSwKKwlTRU5TT1JfQVRUUihpbjVfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgNSksCisJU0VOU09SX0FUVFIoaW42X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDYpLAorCVNFTlNPUl9BVFRSKGluN19taW4sIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21pbiwgc3RvcmVfaW5fbWluLCA3KSwKKwlTRU5TT1JfQVRUUihpbjhfbWluLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9taW4sIHN0b3JlX2luX21pbiwgOCksCisJU0VOU09SX0FUVFIoaW45X21pbiwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWluLCBzdG9yZV9pbl9taW4sIDkpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfaW5fbWF4W10gPSB7CisJU0VOU09SX0FUVFIoaW4wX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDApLAorCVNFTlNPUl9BVFRSKGluMV9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCAxKSwKKwlTRU5TT1JfQVRUUihpbjJfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgMiksCisJU0VOU09SX0FUVFIoaW4zX21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDMpLAorCVNFTlNPUl9BVFRSKGluNF9tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCA0KSwKKwlTRU5TT1JfQVRUUihpbjVfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgNSksCisJU0VOU09SX0FUVFIoaW42X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDYpLAorCVNFTlNPUl9BVFRSKGluN19tYXgsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2luX21heCwgc3RvcmVfaW5fbWF4LCA3KSwKKwlTRU5TT1JfQVRUUihpbjhfbWF4LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19pbl9tYXgsIHN0b3JlX2luX21heCwgOCksCisJU0VOU09SX0FUVFIoaW45X21heCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfaW5fbWF4LCBzdG9yZV9pbl9tYXgsIDkpLAorfTsKKworI2RlZmluZSBzaG93X2Zhbl9yZWcocmVnKSBcCitzdGF0aWMgc3NpemVfdCBzaG93XyMjcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIFwKKwkJCQljaGFyICpidWYpIFwKK3sgXAorCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSBcCisJCQkJCQl0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7IFwKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gdzgzNzkxZF91cGRhdGVfZGV2aWNlKGRldik7IFwKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7IFwKKwlyZXR1cm4gc3ByaW50ZihidWYsIiVkXG4iLCBcCisJCUZBTl9GUk9NX1JFRyhkYXRhLT5yZWdbbnJdLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKSk7IFwKK30KKworc2hvd19mYW5fcmVnKGZhbik7CitzaG93X2Zhbl9yZWcoZmFuX21pbik7CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2Zhbl9taW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPmZhbl9taW5bbnJdID0gZmFuX3RvX3JlZyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOworCXc4Mzc5MWRfd3JpdGUoY2xpZW50LCBXODM3OTFEX1JFR19GQU5fTUlOW25yXSwgZGF0YS0+ZmFuX21pbltucl0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2Zhbl9kaXYoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKK30KKworLyogTm90ZTogd2Ugc2F2ZSBhbmQgcmVzdG9yZSB0aGUgZmFuIG1pbmltdW0gaGVyZSwgYmVjYXVzZSBpdHMgdmFsdWUgaXMKKyAgIGRldGVybWluZWQgaW4gcGFydCBieSB0aGUgZmFuIGRpdmlzb3IuICBUaGlzIGZvbGxvd3MgdGhlIHByaW5jaXBsZSBvZgorICAgbGVhc3Qgc3VwcmlzZTsgdGhlIHVzZXIgZG9lc24ndCBleHBlY3QgdGhlIGZhbiBtaW5pbXVtIHRvIGNoYW5nZSBqdXN0CisgICBiZWNhdXNlIHRoZSBkaXZpc29yIGNoYW5nZWQuICovCitzdGF0aWMgc3NpemVfdCBzdG9yZV9mYW5fZGl2KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICpzZW5zb3JfYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlpbnQgbnIgPSBzZW5zb3JfYXR0ci0+aW5kZXg7CisJdW5zaWduZWQgbG9uZyBtaW47CisJdTggdG1wX2Zhbl9kaXY7CisJdTggZmFuX2Rpdl9yZWc7CisJaW50IGluZHggPSAwOworCXU4IGtlZXBfbWFzayA9IDA7CisJdTggbmV3X3NoaWZ0ID0gMDsKKworCS8qIFNhdmUgZmFuX21pbiAqLworCW1pbiA9IEZBTl9GUk9NX1JFRyhkYXRhLT5mYW5fbWluW25yXSwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+ZmFuX2Rpdltucl0gPSBkaXZfdG9fcmVnKG5yLCBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSk7CisKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSAwOgorCQlpbmR4ID0gMDsKKwkJa2VlcF9tYXNrID0gMHhjZjsKKwkJbmV3X3NoaWZ0ID0gNDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpbmR4ID0gMDsKKwkJa2VlcF9tYXNrID0gMHgzZjsKKwkJbmV3X3NoaWZ0ID0gNjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlpbmR4ID0gMTsKKwkJa2VlcF9tYXNrID0gMHgzZjsKKwkJbmV3X3NoaWZ0ID0gNjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlpbmR4ID0gMjsKKwkJa2VlcF9tYXNrID0gMHhmODsKKwkJbmV3X3NoaWZ0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlpbmR4ID0gMjsKKwkJa2VlcF9tYXNrID0gMHg4ZjsKKwkJbmV3X3NoaWZ0ID0gNDsKKwkJYnJlYWs7CisjaWZkZWYgREVCVUcKKwlkZWZhdWx0OgorCQlkZXZfd2FybihkZXYsICJzdG9yZV9mYW5fZGl2OiBVbmV4cGVjdGVkIG5yIHNlZW46ICVkXG4iLCBucik7CisJCWNvdW50ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfZXhpdDsKKyNlbmRpZgorCX0KKworCWZhbl9kaXZfcmVnID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfRkFOX0RJVltpbmR4XSkKKwkJCSYga2VlcF9tYXNrOworCXRtcF9mYW5fZGl2ID0gKGRhdGEtPmZhbl9kaXZbbnJdIDw8IG5ld19zaGlmdCkgJiB+a2VlcF9tYXNrOworCisJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0ZBTl9ESVZbaW5keF0sCisJCQkJZmFuX2Rpdl9yZWcgfCB0bXBfZmFuX2Rpdik7CisKKwkvKiBSZXN0b3JlIGZhbl9taW4gKi8KKwlkYXRhLT5mYW5fbWluW25yXSA9IGZhbl90b19yZWcobWluLCBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKKwl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfRkFOX01JTltucl0sIGRhdGEtPmZhbl9taW5bbnJdKTsKKworI2lmZGVmIERFQlVHCitlcnJfZXhpdDoKKyNlbmRpZgorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9mYW5faW5wdXRbXSA9IHsKKwlTRU5TT1JfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCksCisJU0VOU09SX0FUVFIoZmFuMl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEpLAorCVNFTlNPUl9BVFRSKGZhbjNfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAyKSwKKwlTRU5TT1JfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyksCisJU0VOU09SX0FUVFIoZmFuNV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDQpLAorfTsKKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZGFfZmFuX21pbltdID0geworCVNFTlNPUl9BVFRSKGZhbjFfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCXNob3dfZmFuX21pbiwgc3RvcmVfZmFuX21pbiwgMCksCisJU0VOU09SX0FUVFIoZmFuMl9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJc2hvd19mYW5fbWluLCBzdG9yZV9mYW5fbWluLCAxKSwKKwlTRU5TT1JfQVRUUihmYW4zX21pbiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQlzaG93X2Zhbl9taW4sIHN0b3JlX2Zhbl9taW4sIDIpLAorCVNFTlNPUl9BVFRSKGZhbjRfbWluLCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCXNob3dfZmFuX21pbiwgc3RvcmVfZmFuX21pbiwgMyksCisJU0VOU09SX0FUVFIoZmFuNV9taW4sIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJc2hvd19mYW5fbWluLCBzdG9yZV9mYW5fbWluLCA0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX2Zhbl9kaXZbXSA9IHsKKwlTRU5TT1JfQVRUUihmYW4xX2RpdiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQlzaG93X2Zhbl9kaXYsIHN0b3JlX2Zhbl9kaXYsIDApLAorCVNFTlNPUl9BVFRSKGZhbjJfZGl2LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCXNob3dfZmFuX2Rpdiwgc3RvcmVfZmFuX2RpdiwgMSksCisJU0VOU09SX0FUVFIoZmFuM19kaXYsIFNfSVdVU1IgfCBTX0lSVUdPLAorCQkJc2hvd19mYW5fZGl2LCBzdG9yZV9mYW5fZGl2LCAyKSwKKwlTRU5TT1JfQVRUUihmYW40X2RpdiwgU19JV1VTUiB8IFNfSVJVR08sCisJCQlzaG93X2Zhbl9kaXYsIHN0b3JlX2Zhbl9kaXYsIDMpLAorCVNFTlNPUl9BVFRSKGZhbjVfZGl2LCBTX0lXVVNSIHwgU19JUlVHTywKKwkJCXNob3dfZmFuX2Rpdiwgc3RvcmVfZmFuX2RpdiwgNCksCit9OworCisvKiByZWFkL3dyaXRlIHRoZSB0ZW1wZXJhdHVyZTEsIGluY2x1ZGVzIG1lYXN1cmVkIHZhbHVlIGFuZCBsaW1pdHMgKi8KK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcDEoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSB3ODM3OTFkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgVEVNUDFfRlJPTV9SRUcoZGF0YS0+dGVtcDFbYXR0ci0+aW5kZXhdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RlbXAxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWxvbmcgdmFsID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKKwlpbnQgbnIgPSBhdHRyLT5pbmRleDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wMVtucl0gPSBURU1QMV9UT19SRUcodmFsKTsKKwl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfVEVNUDFbbnJdLCBkYXRhLT50ZW1wMVtucl0pOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCXJldHVybiBjb3VudDsKK30KKworLyogcmVhZC93cml0ZSB0ZW1wZXJhdHVyZTItMywgaW5jbHVkZXMgbWVhc3VyZWQgdmFsdWUgYW5kIGxpbWl0cyAqLworc3RhdGljIHNzaXplX3Qgc2hvd190ZW1wMjMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gdzgzNzkxZF91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IG5yID0gYXR0ci0+bnI7CisJaW50IGluZGV4ID0gYXR0ci0+aW5kZXg7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIFRFTVAyM19GUk9NX1JFRyhkYXRhLT50ZW1wX2FkZFtucl1baW5kZXhdKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RlbXAyMyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgKmF0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHJfMihkZXZhdHRyKTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IG5yID0gYXR0ci0+bnI7CisJaW50IGluZGV4ID0gYXR0ci0+aW5kZXg7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4XSA9IFRFTVAyM19UT19SRUcodmFsKTsKKwl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfVEVNUF9BRERbbnJdW2luZGV4ICogMl0sCisJCQkJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4XSA+PiA4KTsKKwl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfVEVNUF9BRERbbnJdW2luZGV4ICogMiArIDFdLAorCQkJCWRhdGEtPnRlbXBfYWRkW25yXVtpbmRleF0gJiAweDgwKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZV8yIHNkYV90ZW1wX2lucHV0W10gPSB7CisJU0VOU09SX0FUVFJfMih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMSwgTlVMTCwgMCwgMCksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wMjMsIE5VTEwsIDAsIDApLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfaW5wdXQsIFNfSVJVR08sIHNob3dfdGVtcDIzLCBOVUxMLCAxLCAwKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGVfMiBzZGFfdGVtcF9tYXhbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X3RlbXAxLCBzdG9yZV90ZW1wMSwgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wMl9tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd190ZW1wMjMsIHN0b3JlX3RlbXAyMywgMCwgMSksCisJU0VOU09SX0FUVFJfMih0ZW1wM19tYXgsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd190ZW1wMjMsIHN0b3JlX3RlbXAyMywgMSwgMSksCit9OworCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlXzIgc2RhX3RlbXBfbWF4X2h5c3RbXSA9IHsKKwlTRU5TT1JfQVRUUl8yKHRlbXAxX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfdGVtcDEsIHN0b3JlX3RlbXAxLCAwLCAyKSwKKwlTRU5TT1JfQVRUUl8yKHRlbXAyX21heF9oeXN0LCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfdGVtcDIzLCBzdG9yZV90ZW1wMjMsIDAsIDIpLAorCVNFTlNPUl9BVFRSXzIodGVtcDNfbWF4X2h5c3QsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd190ZW1wMjMsIHN0b3JlX3RlbXAyMywgMSwgMiksCit9OworCisKKy8qIGdldCByZWF0aW1lIHN0YXR1cyBvZiBhbGwgc2Vuc29ycyBpdGVtczogdm9sdGFnZSwgdGVtcCwgZmFuICovCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtc19yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBkYXRhLT5hbGFybXMpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoYWxhcm1zLCBTX0lSVUdPLCBzaG93X2FsYXJtc19yZWcsIE5VTEwpOworCisvKiBCZWVwIGNvbnRyb2wgKi8KKworI2RlZmluZSBHTE9CQUxfQkVFUF9FTkFCTEVfU0hJRlQJMTUKKyNkZWZpbmUgR0xPQkFMX0JFRVBfRU5BQkxFX01BU0sJCSgxIDw8IEdMT0JBTF9CRUVQX0VOQUJMRV9TSElGVCkKKworc3RhdGljIHNzaXplX3Qgc2hvd19iZWVwX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gdzgzNzkxZF91cGRhdGVfZGV2aWNlKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPmJlZXBfZW5hYmxlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19iZWVwX21hc2soc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBCRUVQX01BU0tfRlJPTV9SRUcoZGF0YS0+YmVlcF9tYXNrKSk7Cit9CisKKworc3RhdGljIHNzaXplX3Qgc3RvcmVfYmVlcF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwkvKiBUaGUgYmVlcF9lbmFibGUgc3RhdGUgb3ZlcnJpZGVzIGFueSBlbmFibGluZyByZXF1ZXN0IGZyb20KKwkgICB0aGUgbWFza3MgKi8KKwlkYXRhLT5iZWVwX21hc2sgPSBCRUVQX01BU0tfVE9fUkVHKHZhbCkgJiB+R0xPQkFMX0JFRVBfRU5BQkxFX01BU0s7CisJZGF0YS0+YmVlcF9tYXNrIHw9IChkYXRhLT5iZWVwX2VuYWJsZSA8PCBHTE9CQUxfQkVFUF9FTkFCTEVfU0hJRlQpOworCisJdmFsID0gZGF0YS0+YmVlcF9tYXNrOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfQkVFUF9DVFJMW2ldLCAodmFsICYgMHhmZikpOworCQl2YWwgPj49IDg7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2JlZXBfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlkYXRhLT5iZWVwX2VuYWJsZSA9IHZhbCA/IDEgOiAwOworCisJLyogS2VlcCB0aGUgZnVsbCBtYXNrIHZhbHVlIGluIHN5bmMgd2l0aCB0aGUgY3VycmVudCBlbmFibGUgKi8KKwlkYXRhLT5iZWVwX21hc2sgJj0gfkdMT0JBTF9CRUVQX0VOQUJMRV9NQVNLOworCWRhdGEtPmJlZXBfbWFzayB8PSAoZGF0YS0+YmVlcF9lbmFibGUgPDwgR0xPQkFMX0JFRVBfRU5BQkxFX1NISUZUKTsKKworCS8qIFRoZSBnbG9iYWwgY29udHJvbCBpcyBpbiB0aGUgc2Vjb25kIGJlZXAgY29udHJvbCByZWdpc3RlcgorCSAgIHNvIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhhdCByZWdpc3RlciAqLworCXZhbCA9IChkYXRhLT5iZWVwX21hc2sgPj4gOCkgJiAweGZmOworCisJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ1RSTFsxXSwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlIHNkYV9iZWVwX2N0cmxbXSA9IHsKKwlTRU5TT1JfQVRUUihiZWVwX2VuYWJsZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X2JlZXBfZW5hYmxlLCBzdG9yZV9iZWVwX2VuYWJsZSwgMCksCisJU0VOU09SX0FUVFIoYmVlcF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfYmVlcF9tYXNrLCBzdG9yZV9iZWVwX21hc2ssIDEpCit9OworCisvKiBjcHUgdm9sdGFnZSByZWd1bGF0aW9uIGluZm9ybWF0aW9uICovCitzdGF0aWMgc3NpemVfdCBzaG93X3ZpZF9yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2aWRfZnJvbV9yZWcoZGF0YS0+dmlkLCBkYXRhLT52cm0pKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGNwdTBfdmlkLCBTX0lSVUdPLCBzaG93X3ZpZF9yZWcsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3ZybV9yZWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IHc4Mzc5MWRfdXBkYXRlX2RldmljZShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhLT52cm0pOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV92cm1fcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCB3ODM3OTFkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCisJLyogTm8gbG9jayBuZWVkZWQgYXMgdnJtIGlzIGludGVybmFsIHRvIHRoZSBkcml2ZXIKKwkgICAobm90IHJlYWQgZnJvbSBhIGNoaXAgcmVnaXN0ZXIpIGFuZCBzbyBpcyBub3QKKwkgICB1cGRhdGVkIGluIHc4Mzc5MWRfdXBkYXRlX2RldmljZSgpICovCisJZGF0YS0+dnJtID0gdmFsOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodnJtLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd192cm1fcmVnLCBzdG9yZV92cm1fcmVnKTsKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbjoKKyAgICAgKiB3ODM3OTFkX2RyaXZlciBpcyBpbnNlcnRlZCAod2hlbiB0aGlzIG1vZHVsZSBpcyBsb2FkZWQpLCBmb3IgZWFjaAorICAgICAgIGF2YWlsYWJsZSBhZGFwdGVyCisgICAgICogd2hlbiBhIG5ldyBhZGFwdGVyIGlzIGluc2VydGVkIChhbmQgdzgzNzkxZF9kcml2ZXIgaXMgc3RpbGwgcHJlc2VudCkgKi8KK3N0YXRpYyBpbnQgdzgzNzkxZF9hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCEoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfSFdNT04pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHc4Mzc5MWRfZGV0ZWN0KTsKK30KKworCitzdGF0aWMgaW50IHc4Mzc5MWRfY3JlYXRlX3N1YmNsaWVudChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGFkZHIsCisJCQkJc3RydWN0IGkyY19jbGllbnQgKipzdWJfY2xpKQoreworCWludCBlcnI7CisJc3RydWN0IGkyY19jbGllbnQgKnN1Yl9jbGllbnQ7CisKKwkoKnN1Yl9jbGkpID0gc3ViX2NsaWVudCA9CisJCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmICghKHN1Yl9jbGllbnQpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdWJfY2xpZW50LT5hZGRyID0gMHg0OCArIGFkZHI7CisJaTJjX3NldF9jbGllbnRkYXRhKHN1Yl9jbGllbnQsIE5VTEwpOworCXN1Yl9jbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCXN1Yl9jbGllbnQtPmRyaXZlciA9ICZ3ODM3OTFkX2RyaXZlcjsKKwlzdHJsY3B5KHN1Yl9jbGllbnQtPm5hbWUsICJ3ODM3OTFkIHN1YmNsaWVudCIsIEkyQ19OQU1FX1NJWkUpOworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoc3ViX2NsaWVudCkpKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAic3ViY2xpZW50IHJlZ2lzdHJhdGlvbiAiCisJCQkiYXQgYWRkcmVzcyAweCV4IGZhaWxlZFxuIiwgc3ViX2NsaWVudC0+YWRkcik7CisJCWtmcmVlKHN1Yl9jbGllbnQpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHc4Mzc5MWRfZGV0ZWN0X3N1YmNsaWVudHMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywKKwkJCQlpbnQga2luZCwgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGksIGlkLCBlcnI7CisJdTggdmFsOworCisJaWQgPSBpMmNfYWRhcHRlcl9pZChhZGFwdGVyKTsKKwlpZiAoZm9yY2Vfc3ViY2xpZW50c1swXSA9PSBpZCAmJiBmb3JjZV9zdWJjbGllbnRzWzFdID09IGFkZHJlc3MpIHsKKwkJZm9yIChpID0gMjsgaSA8PSAzOyBpKyspIHsKKwkJCWlmIChmb3JjZV9zdWJjbGllbnRzW2ldIDwgMHg0OCB8fAorCQkJICAgIGZvcmNlX3N1YmNsaWVudHNbaV0gPiAweDRmKSB7CisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJCSJpbnZhbGlkIHN1YmNsaWVudCAiCisJCQkJCSJhZGRyZXNzICVkOyBtdXN0IGJlIDB4NDgtMHg0ZlxuIiwKKwkJCQkJZm9yY2Vfc3ViY2xpZW50c1tpXSk7CisJCQkJZXJyID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycm9yX3NjXzA7CisJCQl9CisJCX0KKwkJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0kyQ19TVUJBRERSLAorCQkJCQkoZm9yY2Vfc3ViY2xpZW50c1syXSAmIDB4MDcpIHwKKwkJCQkJKChmb3JjZV9zdWJjbGllbnRzWzNdICYgMHgwNykgPDwgNCkpOworCX0KKworCXZhbCA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0kyQ19TVUJBRERSKTsKKwlpZiAoISh2YWwgJiAweDA4KSkgeworCQllcnIgPSB3ODM3OTFkX2NyZWF0ZV9zdWJjbGllbnQoYWRhcHRlciwgY2xpZW50LAorCQkJCQkJdmFsICYgMHg3LCAmZGF0YS0+bG03NVswXSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcl9zY18wOworCX0KKwlpZiAoISh2YWwgJiAweDgwKSkgeworCQlpZiAoKGRhdGEtPmxtNzVbMF0gIT0gTlVMTCkgJiYKKwkJCQkoKHZhbCAmIDB4NykgPT0gKCh2YWwgPj4gNCkgJiAweDcpKSkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJImR1cGxpY2F0ZSBhZGRyZXNzZXMgMHgleCwgIgorCQkJCSJ1c2UgZm9yY2Vfc3ViY2xpZW50XG4iLAorCQkJCWRhdGEtPmxtNzVbMF0tPmFkZHIpOworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyb3Jfc2NfMTsKKwkJfQorCQllcnIgPSB3ODM3OTFkX2NyZWF0ZV9zdWJjbGllbnQoYWRhcHRlciwgY2xpZW50LAorCQkJCQkodmFsID4+IDQpICYgMHg3LCAmZGF0YS0+bG03NVsxXSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBlcnJvcl9zY18xOworCX0KKworCXJldHVybiAwOworCisvKiBVbmRvIGluaXRzIGluIGNhc2Ugb2YgZXJyb3JzICovCisKK2Vycm9yX3NjXzE6CisJaWYgKGRhdGEtPmxtNzVbMF0gIT0gTlVMTCkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzBdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVswXSk7CisJfQorZXJyb3Jfc2NfMDoKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBpbnQgdzgzNzkxZF9kZXRlY3Qoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCBpbnQgYWRkcmVzcywgaW50IGtpbmQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YTsKKwlpbnQgaSwgdmFsMSwgdmFsMjsKKwlpbnQgZXJyID0gMDsKKwljb25zdCBjaGFyICpjbGllbnRfbmFtZSA9ICIiOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qIE9LLiBGb3Igbm93LCB3ZSBwcmVzdW1lIHdlIGhhdmUgYSB2YWxpZCBjbGllbnQuIFdlIG5vdyBjcmVhdGUgdGhlCisJICAgY2xpZW50IHN0cnVjdHVyZSwgZXZlbiB0aG91Z2ggd2UgY2Fubm90IGZpbGwgaXQgY29tcGxldGVseSB5ZXQuCisJICAgQnV0IGl0IGFsbG93cyB1cyB0byBhY2Nlc3MgdzgzNzkxZF97cmVhZCx3cml0ZX1fdmFsdWUuICovCisJaWYgKCEoZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3ODM3OTFkX2RhdGEpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJY2xpZW50ID0gJmRhdGEtPmNsaWVudDsKKwlkZXYgPSAmY2xpZW50LT5kZXY7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisJY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwljbGllbnQtPmFkYXB0ZXIgPSBhZGFwdGVyOworCWNsaWVudC0+ZHJpdmVyID0gJnc4Mzc5MWRfZHJpdmVyOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIE5vdywgd2UgZG8gdGhlIHJlbWFpbmluZyBkZXRlY3Rpb24uICovCisKKwkvKiBUaGUgdzgzNzkxZCBtYXkgYmUgc3R1Y2sgaW4gc29tZSBvdGhlciBiYW5rIHRoYW4gYmFuayAwLiBUaGlzIG1heQorCSAgIG1ha2UgcmVhZGluZyBvdGhlciBpbmZvcm1hdGlvbiBpbXBvc3NpYmxlLiBTcGVjaWZ5IGEgZm9yY2U9Li4uCisJICAgcGFyYW1ldGVyLCBhbmQgdGhlIFdpbmJvbmQgd2lsbCBiZSByZXNldCB0byB0aGUgcmlnaHQgYmFuay4gKi8KKwlpZiAoa2luZCA8IDApIHsKKwkJaWYgKHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NPTkZJRykgJiAweDgwKSB7CisJCQlkZXZfZGJnKGRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAxXG4iKTsKKwkJCWdvdG8gZXJyb3IxOworCQl9CisJCXZhbDEgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19CQU5LKTsKKwkJdmFsMiA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NISVBNQU4pOworCQkvKiBDaGVjayBmb3IgV2luYm9uZCBJRCBpZiBpbiBiYW5rIDAgKi8KKwkJaWYgKCEodmFsMSAmIDB4MDcpKSB7CisJCQkvKiB5ZXMgaXQgaXMgQmFuazAgKi8KKwkJCWlmICgoKCEodmFsMSAmIDB4ODApKSAmJiAodmFsMiAhPSAweGEzKSkgfHwKKwkJCSAgICAoKHZhbDEgJiAweDgwKSAmJiAodmFsMiAhPSAweDVjKSkpIHsKKwkJCQlkZXZfZGJnKGRldiwgIkRldGVjdGlvbiBmYWlsZWQgYXQgc3RlcCAyXG4iKTsKKwkJCQlnb3RvIGVycm9yMTsKKwkJCX0KKwkJfQorCQkvKiBJZiBXaW5ib25kIGNoaXAsIGFkZHJlc3Mgb2YgY2hpcCBhbmQgVzgzNzkxRF9SRUdfSTJDX0FERFIKKwkJICAgc2hvdWxkIG1hdGNoICovCisJCWlmICh3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19JMkNfQUREUikgIT0gYWRkcmVzcykgeworCQkJZGV2X2RiZyhkZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgM1xuIik7CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCX0KKworCS8qIFdlIGVpdGhlciBoYXZlIGEgZm9yY2UgcGFyYW1ldGVyIG9yIHdlIGhhdmUgcmVhc29uIHRvCisJICAgYmVsaWV2ZSBpdCBpcyBhIFdpbmJvbmQgY2hpcC4gRWl0aGVyIHdheSwgd2Ugd2FudCBiYW5rIDAgYW5kCisJICAgVmVuZG9yIElEIGhpZ2ggYnl0ZSAqLworCXZhbDEgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19CQU5LKSAmIDB4Nzg7CisJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0JBTkssIHZhbDEgfCAweDgwKTsKKworCS8qIFZlcmlmeSBpdCBpcyBhIFdpbmJvbmQgdzgzNzkxZCAqLworCWlmIChraW5kIDw9IDApIHsKKwkJLyogZ2V0IHZlbmRvciBJRCAqLworCQl2YWwyID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQ0hJUE1BTik7CisJCWlmICh2YWwyICE9IDB4NWMpIHsJLyogdGhlIHZlbmRvciBpcyBOT1QgV2luYm9uZCAqLworCQkJZGV2X2RiZyhkZXYsICJEZXRlY3Rpb24gZmFpbGVkIGF0IHN0ZXAgNFxuIik7CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCQl2YWwxID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfV0NISVBJRCk7CisJCWlmICh2YWwxID09IDB4NzEpIHsKKwkJCWtpbmQgPSB3ODM3OTFkOworCQl9IGVsc2UgeworCQkJaWYgKGtpbmQgPT0gMCkKKwkJCQlkZXZfd2FybihkZXYsCisJCQkJCSJ3ODM3OTFkOiBJZ25vcmluZyAnZm9yY2UnIHBhcmFtZXRlciAiCisJCQkJCSJmb3IgdW5rbm93biBjaGlwIGF0IGFkYXB0ZXIgJWQsICIKKwkJCQkJImFkZHJlc3MgMHglMDJ4XG4iLAorCQkJCQlpMmNfYWRhcHRlcl9pZChhZGFwdGVyKSwgYWRkcmVzcyk7CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCX0KKworCWlmIChraW5kID09IHc4Mzc5MWQpIHsKKwkJY2xpZW50X25hbWUgPSAidzgzNzkxZCI7CisJfSBlbHNlIHsKKwkJZGV2X2VycihkZXYsICJ3ODM3OTFkOiBJbnRlcm5hbCBlcnJvcjogdW5rbm93biBraW5kICglZCk/IT8iLAorCQkJa2luZCk7CisJCWdvdG8gZXJyb3IxOworCX0KKworI2lmZGVmIERFQlVHCisJdmFsMSA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0RJRF9WSUQ0KTsKKwlkZXZfZGJnKGRldiwgIkRldmljZSBJRCB2ZXJzaW9uOiAlZC4lZCAoMHglMDJ4KVxuIiwKKwkJCSh2YWwxID4+IDUpICYgMHgwNywgKHZhbDEgPj4gMSkgJiAweDBmLCB2YWwxKTsKKyNlbmRpZgorCisJLyogRmlsbCBpbiB0aGUgcmVtYWluaW5nIGNsaWVudCBmaWVsZHMgYW5kIHB1dCBpbnRvIHRoZSBnbG9iYWwgbGlzdCAqLworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwkvKiBUZWxsIHRoZSBJMkMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKChlcnIgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJZ290byBlcnJvcjE7CisKKwlpZiAoKGVyciA9IHc4Mzc5MWRfZGV0ZWN0X3N1YmNsaWVudHMoYWRhcHRlciwgYWRkcmVzcywga2luZCwgY2xpZW50KSkpCisJCWdvdG8gZXJyb3IyOworCisJLyogSW5pdGlhbGl6ZSB0aGUgY2hpcCAqLworCXc4Mzc5MWRfaW5pdF9jbGllbnQoY2xpZW50KTsKKworCS8qIElmIHRoZSBmYW5fZGl2IGlzIGNoYW5nZWQsIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIHJhdGlvbmFsCisJICAgZmFuX21pbiBpbiBwbGFjZSAqLworCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfRkFOSU47IGkrKykgeworCQlkYXRhLT5mYW5fbWluW2ldID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfRkFOX01JTltpXSk7CisJfQorCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwlkYXRhLT5jbGFzc19kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmNsYXNzX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5jbGFzc19kZXYpOworCQlnb3RvIGVycm9yMzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1ZJTjsgaSsrKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5faW5wdXRbaV0uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2luX21pbltpXS5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfaW5fbWF4W2ldLmRldl9hdHRyKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0ZBTklOOyBpKyspIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV9mYW5faW5wdXRbaV0uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9kaXZbaV0uZGV2X2F0dHIpOworCQlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmc2RhX2Zhbl9taW5baV0uZGV2X2F0dHIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfVEVNUElOOyBpKyspIHsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV90ZW1wX2lucHV0W2ldLmRldl9hdHRyKTsKKwkJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJnNkYV90ZW1wX21heFtpXS5kZXZfYXR0cik7CisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfdGVtcF9tYXhfaHlzdFtpXS5kZXZfYXR0cik7CisJfQorCisJZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX2FsYXJtcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZGFfYmVlcF9jdHJsKTsgaSsrKSB7CisJCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZzZGFfYmVlcF9jdHJsW2ldLmRldl9hdHRyKTsKKwl9CisKKwlkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfY3B1MF92aWQpOworCWRldmljZV9jcmVhdGVfZmlsZShkZXYsICZkZXZfYXR0cl92cm0pOworCisJcmV0dXJuIDA7CisKK2Vycm9yMzoKKwlpZiAoZGF0YS0+bG03NVswXSAhPSBOVUxMKSB7CisJCWkyY19kZXRhY2hfY2xpZW50KGRhdGEtPmxtNzVbMF0pOworCQlrZnJlZShkYXRhLT5sbTc1WzBdKTsKKwl9CisJaWYgKGRhdGEtPmxtNzVbMV0gIT0gTlVMTCkgeworCQlpMmNfZGV0YWNoX2NsaWVudChkYXRhLT5sbTc1WzFdKTsKKwkJa2ZyZWUoZGF0YS0+bG03NVsxXSk7CisJfQorZXJyb3IyOgorCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CitlcnJvcjE6CisJa2ZyZWUoZGF0YSk7CitlcnJvcjA6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB3ODM3OTFkX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGVycjsKKworCS8qIG1haW4gY2xpZW50ICovCisJaWYgKGRhdGEpCisJCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmNsYXNzX2Rldik7CisKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCisJLyogbWFpbiBjbGllbnQgKi8KKwlpZiAoZGF0YSkKKwkJa2ZyZWUoZGF0YSk7CisJLyogc3ViY2xpZW50ICovCisJZWxzZQorCQlrZnJlZShjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHc4Mzc5MWRfaW5pdF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdTggdG1wOworCXU4IG9sZF9iZWVwOworCisJLyogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiByZXNldCBhbmQgaW5pdCBpcyB0aGF0IHJlc2V0CisJICAgZG9lcyBhIGhhcmQgcmVzZXQgb2YgdGhlIGNoaXAgdmlhIGluZGV4IDB4NDAsIGJpdCA3LAorCSAgIGJ1dCBpbml0IHNpbXBseSBmb3JjZXMgY2VydGFpbiByZWdpc3RlcnMgdG8gaGF2ZSAic2FuZSIKKwkgICB2YWx1ZXMuIFRoZSBob3BlIGlzIHRoYXQgdGhlIEJJT1MgaGFzIGRvbmUgdGhlIHJpZ2h0CisJICAgdGhpbmcgKHdoaWNoIGlzIHdoeSB0aGUgZGVmYXVsdCBpcyByZXNldD0wLCBpbml0PTApLAorCSAgIGJ1dCBpZiBub3QsIHJlc2V0IGlzIHRoZSBoYXJkIGhhbW1lciBhbmQgaW5pdAorCSAgIGlzIHRoZSBzb2Z0IG1hbGxldCBib3RoIG9mIHdoaWNoIGFyZSB0cnlpbmcgdG8gd2hhY2sKKwkgICB0aGluZ3MgaW50byBwbGFjZS4uLgorCSAgIE5PVEU6IFRoZSBkYXRhIHNoZWV0IG1ha2VzIGEgZGlzdGluY3Rpb24gYmV0d2VlbgorCSAgICJwb3dlciBvbiBkZWZhdWx0cyIgYW5kICJyZXNldCBieSBNUiIuIEFzIGZhciBhcyBJIGNhbiB0ZWxsLAorCSAgIHRoZSBoYXJkIHJlc2V0IHB1dHMgZXZlcnl0aGluZyBpbnRvIGEgcG93ZXItb24gc3RhdGUgc28gSSdtCisJICAgbm90IHN1cmUgd2hhdCAicmVzZXQgYnkgTVIiIG1lYW5zIG9yIGhvdyBpdCBjYW4gaGFwcGVuLgorCSAgICovCisJaWYgKHJlc2V0IHx8IGluaXQpIHsKKwkJLyoga2VlcCBzb21lIEJJT1Mgc2V0dGluZ3Mgd2hlbiB3ZS4uLiAqLworCQlvbGRfYmVlcCA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ09ORklHKTsKKworCQlpZiAocmVzZXQpIHsKKwkJCS8qIC4uLiByZXNldCB0aGUgY2hpcCBhbmQgLi4uICovCisJCQl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfQ09ORklHLCAweDgwKTsKKwkJfQorCisJCS8qIC4uLiBkaXNhYmxlIHBvd2VyLW9uIGFibm9ybWFsIGJlZXAgKi8KKwkJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ09ORklHLCBvbGRfYmVlcCB8IDB4ODApOworCisJCS8qIGRpc2FibGUgdGhlIGdsb2JhbCBiZWVwIChub3QgZG9uZSBieSBoYXJkIHJlc2V0KSAqLworCQl0bXAgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19CRUVQX0NUUkxbMV0pOworCQl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfQkVFUF9DVFJMWzFdLCB0bXAgJiAweGVmKTsKKworCQlpZiAoaW5pdCkgeworCQkJLyogTWFrZSBzdXJlIG1vbml0b3JpbmcgaXMgdHVybmVkIG9uIGZvciBhZGQtb25zICovCisJCQl0bXAgPSB3ODM3OTFkX3JlYWQoY2xpZW50LCBXODM3OTFEX1JFR19URU1QMl9DT05GSUcpOworCQkJaWYgKHRtcCAmIDEpIHsKKwkJCQl3ODM3OTFkX3dyaXRlKGNsaWVudCwgVzgzNzkxRF9SRUdfVEVNUDJfQ09ORklHLAorCQkJCQl0bXAgJiAweGZlKTsKKwkJCX0KKworCQkJdG1wID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfVEVNUDNfQ09ORklHKTsKKwkJCWlmICh0bXAgJiAxKSB7CisJCQkJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX1RFTVAzX0NPTkZJRywKKwkJCQkJdG1wICYgMHhmZSk7CisJCQl9CisKKwkJCS8qIFN0YXJ0IG1vbml0b3JpbmcgKi8KKwkJCXRtcCA9IHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0NPTkZJRykgJiAweGY3OworCQkJdzgzNzkxZF93cml0ZShjbGllbnQsIFc4Mzc5MURfUkVHX0NPTkZJRywgdG1wIHwgMHgwMSk7CisJCX0KKwl9CisKKwlkYXRhLT52cm0gPSB2aWRfd2hpY2hfdnJtKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdzgzNzkxZF9kYXRhICp3ODM3OTFkX3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHc4Mzc5MWRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWludCBpLCBqOworCXU4IHJlZ19hcnJheV90bXBbM107CisKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBkYXRhLT5sYXN0X3VwZGF0ZWQgKyAoSFogKiAzKSkKKwkJCXx8ICFkYXRhLT52YWxpZCkgeworCQlkZXZfZGJnKGRldiwgIlN0YXJ0aW5nIHc4Mzc5MWQgZGV2aWNlIHVwZGF0ZVxuIik7CisKKwkJLyogVXBkYXRlIHRoZSB2b2x0YWdlcyBtZWFzdXJlZCB2YWx1ZSBhbmQgbGltaXRzICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1CRVJfT0ZfVklOOyBpKyspIHsKKwkJCWRhdGEtPmluW2ldID0gdzgzNzkxZF9yZWFkKGNsaWVudCwKKwkJCQkJCVc4Mzc5MURfUkVHX0lOW2ldKTsKKwkJCWRhdGEtPmluX21heFtpXSA9IHc4Mzc5MWRfcmVhZChjbGllbnQsCisJCQkJCQlXODM3OTFEX1JFR19JTl9NQVhbaV0pOworCQkJZGF0YS0+aW5fbWluW2ldID0gdzgzNzkxZF9yZWFkKGNsaWVudCwKKwkJCQkJCVc4Mzc5MURfUkVHX0lOX01JTltpXSk7CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIGZhbiBjb3VudHMgYW5kIGxpbWl0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0ZBTklOOyBpKyspIHsKKwkJCS8qIFVwZGF0ZSB0aGUgRmFuIG1lYXN1cmVkIHZhbHVlIGFuZCBsaW1pdHMgKi8KKwkJCWRhdGEtPmZhbltpXSA9IHc4Mzc5MWRfcmVhZChjbGllbnQsCisJCQkJCQlXODM3OTFEX1JFR19GQU5baV0pOworCQkJZGF0YS0+ZmFuX21pbltpXSA9IHc4Mzc5MWRfcmVhZChjbGllbnQsCisJCQkJCQlXODM3OTFEX1JFR19GQU5fTUlOW2ldKTsKKwkJfQorCisJCS8qIFVwZGF0ZSB0aGUgZmFuIGRpdmlzb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJcmVnX2FycmF5X3RtcFtpXSA9IHc4Mzc5MWRfcmVhZChjbGllbnQsCisJCQkJCQlXODM3OTFEX1JFR19GQU5fRElWW2ldKTsKKwkJfQorCQlkYXRhLT5mYW5fZGl2WzBdID0gKHJlZ19hcnJheV90bXBbMF0gPj4gNCkgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzFdID0gKHJlZ19hcnJheV90bXBbMF0gPj4gNikgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzJdID0gKHJlZ19hcnJheV90bXBbMV0gPj4gNikgJiAweDAzOworCQlkYXRhLT5mYW5fZGl2WzNdID0gcmVnX2FycmF5X3RtcFsyXSAmIDB4MDc7CisJCWRhdGEtPmZhbl9kaXZbNF0gPSAocmVnX2FycmF5X3RtcFsyXSA+PiA0KSAmIDB4MDc7CisKKwkJLyogVXBkYXRlIHRoZSBmaXJzdCB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJZGF0YS0+dGVtcDFbaV0gPSB3ODM3OTFkX3JlYWQoY2xpZW50LAorCQkJCQkJVzgzNzkxRF9SRUdfVEVNUDFbaV0pOworCQl9CisKKwkJLyogVXBkYXRlIHRoZSByZXN0IG9mIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3JzICovCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKwkJCQlkYXRhLT50ZW1wX2FkZFtpXVtqXSA9CisJCQkJCSh3ODM3OTFkX3JlYWQoY2xpZW50LAorCQkJCQlXODM3OTFEX1JFR19URU1QX0FERFtpXVtqICogMl0pIDw8IDgpIHwKKwkJCQkJdzgzNzkxZF9yZWFkKGNsaWVudCwKKwkJCQkJVzgzNzkxRF9SRUdfVEVNUF9BRERbaV1baiAqIDIgKyAxXSk7CisJCQl9CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIHJlYWx0aW1lIHN0YXR1cyAqLworCQlkYXRhLT5hbGFybXMgPQorCQkJdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQUxBUk0xKSArCisJCQkodzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQUxBUk0yKSA8PCA4KSArCisJCQkodzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfQUxBUk0zKSA8PCAxNik7CisKKwkJLyogVXBkYXRlIHRoZSBiZWVwIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gKi8KKwkJZGF0YS0+YmVlcF9tYXNrID0KKwkJCXc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ1RSTFswXSkgKworCQkJKHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ1RSTFsxXSkgPDwgOCkgKworCQkJKHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0JFRVBfQ1RSTFsyXSkgPDwgMTYpOworCisJCWRhdGEtPmJlZXBfZW5hYmxlID0KKwkJCShkYXRhLT5iZWVwX21hc2sgPj4gR0xPQkFMX0JFRVBfRU5BQkxFX1NISUZUKSAmIDB4MDE7CisKKwkJLyogVXBkYXRlIHRoZSBjcHUgdm9sdGFnZSBpbmZvcm1hdGlvbiAqLworCQlpID0gdzgzNzkxZF9yZWFkKGNsaWVudCwgVzgzNzkxRF9SRUdfVklEX0ZBTkRJVik7CisJCWRhdGEtPnZpZCA9IGkgJiAweDBmOworCQlkYXRhLT52aWQgfD0gKHc4Mzc5MWRfcmVhZChjbGllbnQsIFc4Mzc5MURfUkVHX0RJRF9WSUQ0KSAmIDB4MDEpCisJCQkJPDwgNDsKKworCQlkYXRhLT5sYXN0X3VwZGF0ZWQgPSBqaWZmaWVzOworCQlkYXRhLT52YWxpZCA9IDE7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKyNpZmRlZiBERUJVRworCXc4Mzc5MWRfcHJpbnRfZGVidWcoZGF0YSwgZGV2KTsKKyNlbmRpZgorCisJcmV0dXJuIGRhdGE7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgdzgzNzkxZF9wcmludF9kZWJ1ZyhzdHJ1Y3QgdzgzNzkxZF9kYXRhICpkYXRhLCBzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGkgPSAwLCBqID0gMDsKKworCWRldl9kYmcoZGV2LCAiPT09PT09U3RhcnQgb2YgdzgzNzkxZCBkZWJ1ZyB2YWx1ZXM9PT09PT1cbiIpOworCWRldl9kYmcoZGV2LCAiJWQgc2V0IG9mIFZvbHRhZ2VzOiA9PT0+XG4iLCBOVU1CRVJfT0ZfVklOKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX1ZJTjsgaSsrKSB7CisJCWRldl9kYmcoZGV2LCAidmluWyVkXSBpczogICAgIDB4JTAyeFxuIiwgaSwgZGF0YS0+aW5baV0pOworCQlkZXZfZGJnKGRldiwgInZpblslZF0gbWluIGlzOiAweCUwMnhcbiIsIGksIGRhdGEtPmluX21pbltpXSk7CisJCWRldl9kYmcoZGV2LCAidmluWyVkXSBtYXggaXM6IDB4JTAyeFxuIiwgaSwgZGF0YS0+aW5fbWF4W2ldKTsKKwl9CisJZGV2X2RiZyhkZXYsICIlZCBzZXQgb2YgRmFuIENvdW50cy9EaXZpc29yczogPT09PlxuIiwgTlVNQkVSX09GX0ZBTklOKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQkVSX09GX0ZBTklOOyBpKyspIHsKKwkJZGV2X2RiZyhkZXYsICJmYW5bJWRdIGlzOiAgICAgMHglMDJ4XG4iLCBpLCBkYXRhLT5mYW5baV0pOworCQlkZXZfZGJnKGRldiwgImZhblslZF0gbWluIGlzOiAweCUwMnhcbiIsIGksIGRhdGEtPmZhbl9taW5baV0pOworCQlkZXZfZGJnKGRldiwgImZhbl9kaXZbJWRdIGlzOiAweCUwMnhcbiIsIGksIGRhdGEtPmZhbl9kaXZbaV0pOworCX0KKworCS8qIHRlbXBlcmF0dXJlIG1hdGggaXMgc2lnbmVkLCBidXQgb25seSBwcmludCBvdXQgdGhlCisJICAgYml0cyB0aGF0IG1hdHRlciAqLworCWRldl9kYmcoZGV2LCAiJWQgc2V0IG9mIFRlbXBlcmF0dXJlczogPT09PlxuIiwgTlVNQkVSX09GX1RFTVBJTik7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlkZXZfZGJnKGRldiwgInRlbXAxWyVkXSBpczogMHglMDJ4XG4iLCBpLCAodTgpIGRhdGEtPnRlbXAxW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCQlkZXZfZGJnKGRldiwgInRlbXBfYWRkWyVkXVslZF0gaXM6IDB4JTA0eFxuIiwgaSwgaiwKKwkJCQkodTE2KSBkYXRhLT50ZW1wX2FkZFtpXVtqXSk7CisJCX0KKwl9CisKKwlkZXZfZGJnKGRldiwgIk1pc2MgSW5mb3JtYXRpb246ID09PT5cbiIpOworCWRldl9kYmcoZGV2LCAiYWxhcm0gaXM6ICAgICAweCUwOHhcbiIsIGRhdGEtPmFsYXJtcyk7CisJZGV2X2RiZyhkZXYsICJiZWVwX21hc2sgaXM6IDB4JTA4eFxuIiwgZGF0YS0+YmVlcF9tYXNrKTsKKwlkZXZfZGJnKGRldiwgImJlZXBfZW5hYmxlIGlzOiAlZFxuIiwgZGF0YS0+YmVlcF9lbmFibGUpOworCWRldl9kYmcoZGV2LCAidmlkIGlzOiAweCUwMnhcbiIsIGRhdGEtPnZpZCk7CisJZGV2X2RiZyhkZXYsICJ2cm0gaXM6IDB4JTAyeFxuIiwgZGF0YS0+dnJtKTsKKwlkZXZfZGJnKGRldiwgIj09PT09PT1FbmQgb2YgdzgzNzkxZCBkZWJ1ZyB2YWx1ZXM9PT09PT09PVxuIik7CisJZGV2X2RiZyhkZXYsICJcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IHNlbnNvcnNfdzgzNzkxZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZ3ODM3OTFkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZW5zb3JzX3c4Mzc5MWRfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ3ODM3OTFkX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkNoYXJsZXMgU3BpcmFraXMgPGJlemF1ckBnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlc4Mzc5MUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KHNlbnNvcnNfdzgzNzkxZF9pbml0KTsKK21vZHVsZV9leGl0KHNlbnNvcnNfdzgzNzkxZF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vdzgzNzkyZC5jIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKaW5kZXggOTU4NjAyZS4uNGVmODg0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi93ODM3OTJkLmMKKysrIGIvZHJpdmVycy9od21vbi93ODM3OTJkLmMKQEAgLTI1MCw4ICsyNTAsNiBAQAogCQkJOiAodmFsKSkgLyAxMDAwLCAwLCAweGZmKSkKICNkZWZpbmUgVEVNUF9BRERfVE9fUkVHX0xPVyh2YWwpCSgodmFsJTEwMDApID8gMHg4MCA6IDB4MDApCiAKLSNkZWZpbmUgUFdNX0ZST01fUkVHKHZhbCkJCSh2YWwpCi0jZGVmaW5lIFBXTV9UT19SRUcodmFsKQkJCShTRU5TT1JTX0xJTUlUKCh2YWwpLDAsMjU1KSkKICNkZWZpbmUgRElWX0ZST01fUkVHKHZhbCkJCSgxIDw8ICh2YWwpKQogCiBzdGF0aWMgaW5saW5lIHU4CkBAIC0yOTEsNyArMjg5LDYgQEAKIAl1OCBwd21bN107CQkvKiBXZSBvbmx5IGNvbnNpZGVyIHRoZSBmaXJzdCAzIHNldCBvZiBwd20sCiAJCQkJICAgYWx0aG91Z2ggNzkyIGNoaXAgaGFzIDcgc2V0IG9mIHB3bS4gKi8KIAl1OCBwd21lbmFibGVbM107Ci0JdTggcHdtX21vZGVbN107CQkvKiBpbmRpY2F0ZXMgUFdNIG9yIERDIG1vZGU6IDEtPlBXTTsgMC0+REMgKi8KIAl1MzIgYWxhcm1zOwkJLyogcmVhbHRpbWUgc3RhdHVzIHJlZ2lzdGVyIGVuY29kaW5nLGNvbWJpbmVkICovCiAJdTggY2hhc3NpczsJCS8qIENoYXNzaXMgc3RhdHVzICovCiAJdTggY2hhc3Npc19jbGVhcjsJLyogQ0xSX0NIUywgY2xlYXIgY2hhc3NpcyBpbnRydXNpb24gZGV0ZWN0aW9uICovCkBAIC0zNzUsOCArMzcyLDEwIEBACiAJdTMyIHZhbDsgXAogCSBcCiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7IFwKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7IFwKIAlkYXRhLT5pbl8jI3JlZ1tucl0gPSBTRU5TT1JTX0xJTUlUKElOX1RPX1JFRyhuciwgdmFsKS80LCAwLCAyNTUpOyBcCiAJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0lOXyMjUkVHW25yXSwgZGF0YS0+aW5fIyNyZWdbbnJdKTsgXAorCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOyBcCiAJIFwKIAlyZXR1cm4gY291bnQ7IFwKIH0KQEAgLTQ0Myw5ICs0NDIsMTEgQEAKIAl1MzIgdmFsOwogCiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPmZhbl9taW5bbnJdID0gRkFOX1RPX1JFRyh2YWwsIERJVl9GUk9NX1JFRyhkYXRhLT5mYW5fZGl2W25yXSkpOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fTUlOW25yXSwKIAkJCQlkYXRhLT5mYW5fbWluW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC00NzgsNiArNDc5LDcgQEAKIAl1OCB0bXBfZmFuX2RpdjsKIAogCS8qIFNhdmUgZmFuX21pbiAqLworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAltaW4gPSBGQU5fRlJPTV9SRUcoZGF0YS0+ZmFuX21pbltucl0sCiAJCQkgICBESVZfRlJPTV9SRUcoZGF0YS0+ZmFuX2Rpdltucl0pKTsKIApAQCAtNDkzLDYgKzQ5NSw3IEBACiAJLyogUmVzdG9yZSBmYW5fbWluICovCiAJZGF0YS0+ZmFuX21pbltucl0gPSBGQU5fVE9fUkVHKG1pbiwgRElWX0ZST01fUkVHKGRhdGEtPmZhbl9kaXZbbnJdKSk7CiAJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX0ZBTl9NSU5bbnJdLCBkYXRhLT5mYW5fbWluW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC01NDcsMTAgKzU1MCwxMSBAQAogCXMzMiB2YWw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXAxW25yXSA9IFRFTVAxX1RPX1JFRyh2YWwpOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19URU1QMVtucl0sCiAJCWRhdGEtPnRlbXAxW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC01ODAsMTMgKzU4NCwxNCBAQAogCXMzMiB2YWw7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG9sKGJ1ZiwgTlVMTCwgMTApOwotCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnRlbXBfYWRkW25yXVtpbmRleF0gPSBURU1QX0FERF9UT19SRUdfSElHSCh2YWwpOwogCWRhdGEtPnRlbXBfYWRkW25yXVtpbmRleCsxXSA9IFRFTVBfQUREX1RPX1JFR19MT1codmFsKTsKIAl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVEVNUF9BRERbbnJdW2luZGV4XSwKIAkJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4XSk7CiAJdzgzNzkyZF93cml0ZV92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1RFTVBfQUREW25yXVtpbmRleCsxXSwKIAkJZGF0YS0+dGVtcF9hZGRbbnJdW2luZGV4KzFdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTYyNyw3ICs2MzIsNyBAQAogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqc2Vuc29yX2F0dHIgPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0cik7CiAJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSB3ODM3OTJkX3VwZGF0ZV9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbGRcbiIsIChsb25nKSBQV01fRlJPTV9SRUcoZGF0YS0+cHdtW25yLTFdKSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChkYXRhLT5wd21bbnJdICYgMHgwZikgPDwgNCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC02NTksMTQgKzY2NCwxNiBAQAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwotCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCXUzMiB2YWw7CisJdTggdmFsID0gU0VOU09SU19MSU1JVChzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKSwgMCwgMjU1KSA+PiA0OwogCi0JdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7Ci0JZGF0YS0+cHdtW25yXSA9IFBXTV9UT19SRUcodmFsKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisJdmFsIHw9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1BXTVtucl0pICYgMHhmMDsKKwlkYXRhLT5wd21bbnJdID0gdmFsOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19QV01bbnJdLCBkYXRhLT5wd21bbnJdKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTY4Myw2ICs2OTAsMTAgQEAKIAl1OCBmYW5fY2ZnX3RtcCwgY2ZnMV90bXAsIGNmZzJfdG1wLCBjZmczX3RtcCwgY2ZnNF90bXA7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwlpZiAodmFsIDwgMSB8fCB2YWwgPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgMToKIAkJZGF0YS0+cHdtZW5hYmxlW25yXSA9IDA7IC8qIG1hbnVhbCBtb2RlICovCkBAIC02OTMsOCArNzA0LDYgQEAKIAljYXNlIDM6CiAJCWRhdGEtPnB3bWVuYWJsZVtucl0gPSAxOyAvKiB0aGVybWFsIGNydWlzZS9TbWFydCBGYW4gSSAqLwogCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJY2ZnMV90bXAgPSBkYXRhLT5wd21lbmFibGVbMF07CiAJY2ZnMl90bXAgPSAoZGF0YS0+cHdtZW5hYmxlWzFdKSA8PCAyOwpAQCAtNzAyLDE0ICs3MTEsMTUgQEAKIAljZmc0X3RtcCA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsVzgzNzkyRF9SRUdfRkFOX0NGRykgJiAweGMwOwogCWZhbl9jZmdfdG1wID0gKChjZmc0X3RtcCB8IGNmZzNfdG1wKSB8IGNmZzJfdG1wKSB8IGNmZzFfdG1wOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19GQU5fQ0ZHLCBmYW5fY2ZnX3RtcCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX3B3bVtdID0gewotCVNFTlNPUl9BVFRSKHB3bTEsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAxKSwKLQlTRU5TT1JfQVRUUihwd20yLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHN0b3JlX3B3bSwgMiksCi0JU0VOU09SX0FUVFIocHdtMywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcHdtLCBzdG9yZV9wd20sIDMpLAorCVNFTlNPUl9BVFRSKHB3bTEsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X3B3bSwgc3RvcmVfcHdtLCAwKSwKKwlTRU5TT1JfQVRUUihwd20yLCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19wd20sIHN0b3JlX3B3bSwgMSksCisJU0VOU09SX0FUVFIocHdtMywgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfcHdtLCBzdG9yZV9wd20sIDIpLAogfTsKIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX3B3bV9lbmFibGVbXSA9IHsKIAlTRU5TT1JfQVRUUihwd20xX2VuYWJsZSwgU19JV1VTUiB8IFNfSVJVR08sCkBAIC03MjgsNyArNzM4LDcgQEAKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwogCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleDsKIAlzdHJ1Y3QgdzgzNzkyZF9kYXRhICpkYXRhID0gdzgzNzkyZF91cGRhdGVfZGV2aWNlKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnB3bV9tb2RlW25yLTFdKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+cHdtW25yXSA+PiA3KTsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTczNiwyOSArNzQ2LDM1IEBACiAJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgKnNlbnNvcl9hdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpOwotCWludCBuciA9IHNlbnNvcl9hdHRyLT5pbmRleCAtIDE7CisJaW50IG5yID0gc2Vuc29yX2F0dHItPmluZGV4OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IHc4Mzc5MmRfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXUzMiB2YWw7Ci0JdTggcHdtX21vZGVfbWFzayA9IDA7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQlkYXRhLT5wd21fbW9kZVtucl0gPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMSk7Ci0JcHdtX21vZGVfbWFzayA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCi0JCVc4Mzc5MkRfUkVHX1BXTVtucl0pICYgMHg3ZjsKLQl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfUFdNW25yXSwKLQkJKChkYXRhLT5wd21fbW9kZVtucl0pIDw8IDcpIHwgcHdtX21vZGVfbWFzayk7CisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT5wd21bbnJdID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfUFdNW25yXSk7CisJaWYgKHZhbCkgewkJCS8qIFBXTSBtb2RlICovCisJCWRhdGEtPnB3bVtucl0gfD0gMHg4MDsKKwl9IGVsc2UgewkJCS8qIERDIG1vZGUgKi8KKwkJZGF0YS0+cHdtW25yXSAmPSAweDdmOworCX0KKwl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfUFdNW25yXSwgZGF0YS0+cHdtW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgc2RhX3B3bV9tb2RlW10gPSB7CiAJU0VOU09SX0FUVFIocHdtMV9tb2RlLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJICAgIHNob3dfcHdtX21vZGUsIHN0b3JlX3B3bV9tb2RlLCAxKSwKKwkJICAgIHNob3dfcHdtX21vZGUsIHN0b3JlX3B3bV9tb2RlLCAwKSwKIAlTRU5TT1JfQVRUUihwd20yX21vZGUsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkgICAgc2hvd19wd21fbW9kZSwgc3RvcmVfcHdtX21vZGUsIDIpLAorCQkgICAgc2hvd19wd21fbW9kZSwgc3RvcmVfcHdtX21vZGUsIDEpLAogCVNFTlNPUl9BVFRSKHB3bTNfbW9kZSwgU19JV1VTUiB8IFNfSVJVR08sCi0JCSAgICBzaG93X3B3bV9tb2RlLCBzdG9yZV9wd21fbW9kZSwgMyksCisJCSAgICBzaG93X3B3bV9tb2RlLCBzdG9yZV9wd21fbW9kZSwgMiksCiB9OwogCiAKQEAgLTc4OSwxMiArODA1LDEzIEBACiAJdTggdGVtcDEgPSAwLCB0ZW1wMiA9IDA7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKLQorCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlkYXRhLT5jaGFzc2lzX2NsZWFyID0gU0VOU09SU19MSU1JVCh2YWwsIDAgLDEpOwogCXRlbXAxID0gKChkYXRhLT5jaGFzc2lzX2NsZWFyKSA8PCA3KSAmIDB4ODA7CiAJdGVtcDIgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAogCQlXODM3OTJEX1JFR19DSEFTU0lTX0NMUikgJiAweDdmOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19DSEFTU0lTX0NMUiwgdGVtcDEgfCB0ZW1wMik7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC04MjcsMTAgKzg0NCwxMiBAQAogCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCXRhcmdldF90bXAgPSB2YWw7CiAJdGFyZ2V0X3RtcCA9IHRhcmdldF90bXAgJiAweDdmOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAl0YXJnZXRfbWFzayA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsIFc4Mzc5MkRfUkVHX1RIRVJNQUxbbnJdKSAmIDB4ODA7CiAJZGF0YS0+dGhlcm1hbF9jcnVpc2VbbnJdID0gU0VOU09SU19MSU1JVCh0YXJnZXRfdG1wLCAwLCAyNTUpOwogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19USEVSTUFMW25yXSwKIAkJKGRhdGEtPnRoZXJtYWxfY3J1aXNlW25yXSkgfCB0YXJnZXRfbWFzayk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC04NjcsNiArODg2LDcgQEAKIAl1OCB0b2xfdG1wLCB0b2xfbWFzazsKIAogCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAl0b2xfbWFzayA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCiAJCVc4Mzc5MkRfUkVHX1RPTEVSQU5DRVtucl0pICYgKChuciA9PSAxKSA/IDB4MGYgOiAweGYwKTsKIAl0b2xfdG1wID0gU0VOU09SU19MSU1JVCh2YWwsIDAsIDE1KTsKQEAgLTg3Nyw2ICs4OTcsNyBAQAogCX0KIAl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfVE9MRVJBTkNFW25yXSwKIAkJdG9sX21hc2sgfCB0b2xfdG1wKTsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTkxNSwxMSArOTM2LDEzIEBACiAJdTggbWFza190bXAgPSAwOwogCiAJdmFsID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCWRhdGEtPnNmMl9wb2ludHNbaW5kZXhdW25yXSA9IFNFTlNPUlNfTElNSVQodmFsLCAwLCAxMjcpOwogCW1hc2tfdG1wID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwKIAkJCQkJVzgzNzkyRF9SRUdfUE9JTlRTW2luZGV4XVtucl0pICYgMHg4MDsKIAl3ODM3OTJkX3dyaXRlX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfUE9JTlRTW2luZGV4XVtucl0sCiAJCW1hc2tfdG1wfGRhdGEtPnNmMl9wb2ludHNbaW5kZXhdW25yXSk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC05NzksNiArMTAwMiw3IEBACiAJdTggbWFza190bXA9MCwgbGV2ZWxfdG1wPTA7CiAKIAl2YWwgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+c2YyX2xldmVsc1tpbmRleF1bbnJdID0gU0VOU09SU19MSU1JVCgodmFsICogMTUpIC8gMTAwLCAwLCAxNSk7CiAJbWFza190bXAgPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19MRVZFTFNbaW5kZXhdW25yXSkKIAkJJiAoKG5yPT0zKSA/IDB4ZjAgOiAweDBmKTsKQEAgLTk4OCw2ICsxMDEyLDcgQEAKIAkJbGV2ZWxfdG1wID0gZGF0YS0+c2YyX2xldmVsc1tpbmRleF1bbnJdIDw8IDQ7CiAJfQogCXc4Mzc5MmRfd3JpdGVfdmFsdWUoY2xpZW50LCBXODM3OTJEX1JFR19MRVZFTFNbaW5kZXhdW25yXSwgbGV2ZWxfdG1wIHwgbWFza190bXApOworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMTM3Myw3ICsxMzk4LDcgQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOwogCXN0cnVjdCB3ODM3OTJkX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlpbnQgaSwgajsKLQl1OCByZWdfYXJyYXlfdG1wWzRdLCBwd21fYXJyYXlfdG1wWzddLCByZWdfdG1wOworCXU4IHJlZ19hcnJheV90bXBbNF0sIHJlZ190bXA7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAKQEAgLTE0MDIsMTAgKzE0MjcsOCBAQAogCQkJZGF0YS0+ZmFuX21pbltpXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCiAJCQkJCQlXODM3OTJEX1JFR19GQU5fTUlOW2ldKTsKIAkJCS8qIFVwZGF0ZSB0aGUgUFdNL0RDIFZhbHVlIGFuZCBQV00vREMgZmxhZyAqLwotCQkJcHdtX2FycmF5X3RtcFtpXSA9IHc4Mzc5MmRfcmVhZF92YWx1ZShjbGllbnQsCisJCQlkYXRhLT5wd21baV0gPSB3ODM3OTJkX3JlYWRfdmFsdWUoY2xpZW50LAogCQkJCQkJVzgzNzkyRF9SRUdfUFdNW2ldKTsKLQkJCWRhdGEtPnB3bVtpXSA9IHB3bV9hcnJheV90bXBbaV0gJiAweDBmOwotCQkJZGF0YS0+cHdtX21vZGVbaV0gPSBwd21fYXJyYXlfdG1wW2ldID4+IDc7CiAJCX0KIAogCQlyZWdfdG1wID0gdzgzNzkyZF9yZWFkX3ZhbHVlKGNsaWVudCwgVzgzNzkyRF9SRUdfRkFOX0NGRyk7CkBAIC0xNTEzLDcgKzE1MzYsNiBAQAogCQlkZXZfZGJnKGRldiwgImZhblslZF0gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmZhbltpXSk7CiAJCWRldl9kYmcoZGV2LCAiZmFuWyVkXSBtaW4gaXM6IDB4JXhcbiIsIGksIGRhdGEtPmZhbl9taW5baV0pOwogCQlkZXZfZGJnKGRldiwgInB3bVslZF0gICAgIGlzOiAweCV4XG4iLCBpLCBkYXRhLT5wd21baV0pOwotCQlkZXZfZGJnKGRldiwgInB3bV9tb2RlWyVkXSBpczogMHgleFxuIiwgaSwgZGF0YS0+cHdtX21vZGVbaV0pOwogCX0KIAlkZXZfZGJnKGRldiwgIjMgc2V0IG9mIFRlbXBlcmF0dXJlczogPT09PT0+XG4iKTsKIAlmb3IgKGk9MDsgaTwzOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKaW5kZXggZDZkNDQ5NC4uODg0MzIwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKQEAgLTE2Myw3ICsxNjMsNyBAQAogCSAgSTJDIGJ1cy4KIAogY29uZmlnIEkyQ19QSUlYNAotCXRyaXN0YXRlICJJbnRlbCBQSUlYNCIKKwl0cmlzdGF0ZSAiSW50ZWwgUElJWDQgYW5kIGNvbXBhdGlibGUgKEFUSS9TZXJ2ZXJ3b3Jrcy9Ccm9hZGNvbS9TTVNDKSIKIAlkZXBlbmRzIG9uIEkyQyAmJiBQQ0kKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUgSW50ZWwKQEAgLTE3Miw2ICsxNzIsOSBAQAogCSAgb2YgQnJvYWRjb20pOgogCSAgICBJbnRlbCBQSUlYNAogCSAgICBJbnRlbCA0NDBNWAorCSAgICBBVEkgSVhQMjAwCisJICAgIEFUSSBJWFAzMDAKKwkgICAgQVRJIElYUDQwMAogCSAgICBTZXJ2ZXJ3b3JrcyBPU0I0CiAJICAgIFNlcnZlcndvcmtzIENTQjUKIAkgICAgU2VydmVyd29ya3MgQ1NCNgpAQCAtMjUyLDEyICsyNTUsMTIgQEAKIAkgIHdpbGwgYmUgY2FsbGVkIGkyYy1wb3dlcm1hYy4KIAogY29uZmlnIEkyQ19NUEMKLQl0cmlzdGF0ZSAiTVBDMTA3LzgyNHgvODV4eC81Mnh4IgorCXRyaXN0YXRlICJNUEMxMDcvODI0eC84NXh4LzUyeHgvODZ4eCIKIAlkZXBlbmRzIG9uIEkyQyAmJiBQUEMzMgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQogCSAgYnVpbHQtaW4gSTJDIGludGVyZmFjZSBvbiB0aGUgTVBDMTA3L1RzaTEwNy9NUEM4MjQwL01QQzgyNDUgYW5kCi0JICBNUEM4NXh4IGZhbWlseSBwcm9jZXNzb3JzLiBUaGUgZHJpdmVyIG1heSBhbHNvIHdvcmsgb24gNTJ4eAorCSAgTVBDODV4eC9NUEM4NjQxIGZhbWlseSBwcm9jZXNzb3JzLiBUaGUgZHJpdmVyIG1heSBhbHNvIHdvcmsgb24gNTJ4eAogCSAgZmFtaWx5IHByb2Nlc3NvcnMsIHRob3VnaCBpbnRlcnJ1cHRzIGFyZSBrbm93biBub3QgdG8gd29yay4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQpAQCAtMjczLDYgKzI3NiwxNyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLW5mb3JjZTIuCiAKK2NvbmZpZyBJMkNfT0NPUkVTCisJdHJpc3RhdGUgIk9wZW5Db3JlcyBJMkMgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgIE9wZW5Db3JlcyBJMkMgY29udHJvbGxlci4gRm9yIGRldGFpbHMgc2VlCisJICBodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvcHJvamVjdHMuY2dpL3dlYi9pMmMvb3ZlcnZpZXcKKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgaTJjLW9jb3Jlcy4KKwogY29uZmlnIEkyQ19QQVJQT1JUCiAJdHJpc3RhdGUgIlBhcmFsbGVsIHBvcnQgYWRhcHRlciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBQQVJQT1JUCkBAIC01MDAsNiArNTE0LDcgQEAKIAl0cmlzdGF0ZSAiUENBOTU2NCBvbiBhbiBJU0EgYnVzIgogCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IEkyQ19BTEdPUENBCisJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgSVNBIGJvYXJkcyB1c2luZyB0aGUgUGhpbGlwcyBQQ0EgOTU2NAogCSAgUGFyYWxsZWwgYnVzIHRvIEkyQyBidXMgY29udHJvbGxlcgpAQCAtNTA3LDYgKzUyMiwxMSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXBjYS1pc2EuCiAKKwkgIFRoaXMgZGV2aWNlIGlzIGFsbW9zdCB1bmRldGVjdGFibGUgYW5kIHVzaW5nIHRoaXMgZHJpdmVyIG9uIGEKKwkgIHN5c3RlbSB3aGljaCBkb2Vzbid0IGhhdmUgdGhpcyBkZXZpY2Ugd2lsbCByZXN1bHQgaW4gbG9uZworCSAgZGVsYXlzIHdoZW4gSTJDL1NNQnVzIGNoaXAgZHJpdmVycyBhcmUgbG9hZGVkIChlLmcuIGF0IGJvb3QKKwkgIHRpbWUpLiAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIEkyQ19NVjY0WFhYCiAJdHJpc3RhdGUgIk1hcnZlbGwgbXY2NHh4eCBJMkMgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEkyQyAmJiBNVjY0WDYwICYmIEVYUEVSSU1FTlRBTApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCmluZGV4IGI0NDgzMWQuLmFjNTZkZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKQEAgLTIzLDYgKzIzLDcgQEAKIG9iai0kKENPTkZJR19JMkNfTVBDKQkJKz0gaTJjLW1wYy5vCiBvYmotJChDT05GSUdfSTJDX01WNjRYWFgpCSs9IGkyYy1tdjY0eHh4Lm8KIG9iai0kKENPTkZJR19JMkNfTkZPUkNFMikJKz0gaTJjLW5mb3JjZTIubworb2JqLSQoQ09ORklHX0kyQ19PQ09SRVMpCSs9IGkyYy1vY29yZXMubwogb2JqLSQoQ09ORklHX0kyQ19QQVJQT1JUKQkrPSBpMmMtcGFycG9ydC5vCiBvYmotJChDT05GSUdfSTJDX1BBUlBPUlRfTElHSFQpCSs9IGkyYy1wYXJwb3J0LWxpZ2h0Lm8KIG9iai0kKENPTkZJR19JMkNfUENBX0lTQSkJKz0gaTJjLXBjYS1pc2EubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwppbmRleCBkZmNhNzQ5Li4zZTBkMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWk4MDEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgaTgwMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKKyAgICBpMmMtaTgwMS5jIC0gUGFydCBvZiBsbV9zZW5zb3JzLCBMaW51eCBrZXJuZWwgbW9kdWxlcyBmb3IgaGFyZHdhcmUKICAgICAgICAgICAgICAgbW9uaXRvcmluZwogICAgIENvcHlyaWdodCAoYykgMTk5OCAtIDIwMDIgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4sCiAgICAgUGhpbGlwIEVkZWxicm9jayA8cGhpbEBuZXRyb2VkZ2UuY29tPiwgYW5kIE1hcmsgRC4gU3R1ZGViYWtlcgpAQCAtMzYsNyArMzYsNyBAQAogICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHNldmVyYWwgdmVyc2lvbnMgb2YgSW50ZWwncyBJL08gQ29udHJvbGxlciBIdWJzIChJQ0gpLgogICAgIEZvciBTTUJ1cyBzdXBwb3J0LCB0aGV5IGFyZSBzaW1pbGFyIHRvIHRoZSBQSUlYNCBhbmQgYXJlIHBhcnQKICAgICBvZiBJbnRlbCdzICc4MTAnIGFuZCBvdGhlciBjaGlwc2V0cy4KLSAgICBTZWUgdGhlIGRvYy9idXNzZXMvaTJjLWk4MDEgZmlsZSBmb3IgZGV0YWlscy4KKyAgICBTZWUgdGhlIGZpbGUgRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1pODAxIGZvciBkZXRhaWxzLgogICAgIEkyQyBCbG9jayBSZWFkIGFuZCBQcm9jZXNzIENhbGwgYXJlIG5vdCBzdXBwb3J0ZWQuCiAqLwogCkBAIC02Niw5ICs2Niw4IEBACiAjZGVmaW5lIFNNQkFVWENUTAkoMTMgKyBpODAxX3NtYmEpCS8qIElDSDQgb25seSAqLwogCiAvKiBQQ0kgQWRkcmVzcyBDb25zdGFudHMgKi8KLSNkZWZpbmUgU01CQkEJCTB4MDIwCisjZGVmaW5lIFNNQkJBUgkJNAogI2RlZmluZSBTTUJIU1RDRkcJMHgwNDAKLSNkZWZpbmUgU01CUkVWCQkweDAwOAogCiAvKiBIb3N0IGNvbmZpZ3VyYXRpb24gYml0cyBmb3IgU01CSFNUQ0ZHICovCiAjZGVmaW5lIFNNQkhTVENGR19IU1RfRU4JMQpAQCAtOTIsOTIgKzkxLDE2IEBACiAjZGVmaW5lIEk4MDFfU1RBUlQJCTB4NDAKICNkZWZpbmUgSTgwMV9QRUNfRU4JCTB4ODAJLyogSUNINCBvbmx5ICovCiAKLS8qIGluc21vZCBwYXJhbWV0ZXJzICovCi0KLS8qIElmIGZvcmNlX2FkZHIgaXMgc2V0IHRvIGFueXRoaW5nIGRpZmZlcmVudCBmcm9tIDAsIHdlIGZvcmNpYmx5IGVuYWJsZQotICAgdGhlIEk4MDEgYXQgdGhlIGdpdmVuIGFkZHJlc3MuIFZFUlkgREFOR0VST1VTISAqLwotc3RhdGljIHUxNiBmb3JjZV9hZGRyOwotbW9kdWxlX3BhcmFtKGZvcmNlX2FkZHIsIHVzaG9ydCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlX2FkZHIsCi0JCSAiRm9yY2libHkgZW5hYmxlIHRoZSBJODAxIGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAiCi0JCSAiRVhUUkVNRUxZIERBTkdFUk9VUyEiKTsKIAogc3RhdGljIGludCBpODAxX3RyYW5zYWN0aW9uKHZvaWQpOwogc3RhdGljIGludCBpODAxX2Jsb2NrX3RyYW5zYWN0aW9uKHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhLCBjaGFyIHJlYWRfd3JpdGUsCiAJCQkJICBpbnQgY29tbWFuZCwgaW50IGh3cGVjKTsKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IGk4MDFfc21iYTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGk4MDFfc21iYTsKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpODAxX2RyaXZlcjsKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqSTgwMV9kZXY7CiBzdGF0aWMgaW50IGlzaWNoNDsKIAotc3RhdGljIGludCBpODAxX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpkZXYpCi17Ci0JaW50IGVycm9yX3JldHVybiA9IDA7Ci0JdW5zaWduZWQgY2hhciB0ZW1wOwotCi0JLyogTm90ZTogd2Uga2VlcCBvbiBzZWFyY2hpbmcgdW50aWwgd2UgaGF2ZSBmb3VuZCAnZnVuY3Rpb24gMycgKi8KLQlpZihQQ0lfRlVOQyhkZXYtPmRldmZuKSAhPSAzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCUk4MDFfZGV2ID0gZGV2OwotCWlmICgoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzMpIHx8Ci0JICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfMykgfHwKLQkgICAgKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzQpKQotCQlpc2ljaDQgPSAxOwotCWVsc2UKLQkJaXNpY2g0ID0gMDsKLQotCS8qIERldGVybWluZSB0aGUgYWRkcmVzcyBvZiB0aGUgU01CdXMgYXJlYXMgKi8KLQlpZiAoZm9yY2VfYWRkcikgewotCQlpODAxX3NtYmEgPSBmb3JjZV9hZGRyICYgMHhmZmYwOwotCX0gZWxzZSB7Ci0JCXBjaV9yZWFkX2NvbmZpZ193b3JkKEk4MDFfZGV2LCBTTUJCQSwgJmk4MDFfc21iYSk7Ci0JCWk4MDFfc21iYSAmPSAweGZmZjA7Ci0JCWlmKGk4MDFfc21iYSA9PSAwKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgIlNNQiBiYXNlIGFkZHJlc3MgdW5pbml0aWFsaXplZCAiCi0JCQkJIi0gdXBncmFkZSBCSU9TIG9yIHVzZSBmb3JjZV9hZGRyPTB4YWRkclxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWlmICghcmVxdWVzdF9yZWdpb24oaTgwMV9zbWJhLCAoaXNpY2g0ID8gMTYgOiA4KSwgaTgwMV9kcml2ZXIubmFtZSkpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJJODAxX3NtYiByZWdpb24gMHgleCBhbHJlYWR5IGluIHVzZSFcbiIsCi0JCQlpODAxX3NtYmEpOwotCQllcnJvcl9yZXR1cm4gPSAtRUJVU1k7Ci0JCWdvdG8gRU5EOwotCX0KLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJIU1RDRkcsICZ0ZW1wKTsKLQl0ZW1wICY9IH5TTUJIU1RDRkdfSTJDX0VOOwkvKiBTTUJ1cyB0aW1pbmcgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQkhTVENGRywgdGVtcCk7Ci0KLQkvKiBJZiBmb3JjZV9hZGRyIGlzIHNldCwgd2UgcHJvZ3JhbSB0aGUgbmV3IGFkZHJlc3MgaGVyZS4gSnVzdCB0byBtYWtlCi0JICAgc3VyZSwgd2UgZGlzYWJsZSB0aGUgZGV2aWNlIGZpcnN0LiAqLwotCWlmIChmb3JjZV9hZGRyKSB7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShJODAxX2RldiwgU01CSFNUQ0ZHLCB0ZW1wICYgMHhmZSk7Ci0JCXBjaV93cml0ZV9jb25maWdfd29yZChJODAxX2RldiwgU01CQkEsIGk4MDFfc21iYSk7Ci0JCXBjaV93cml0ZV9jb25maWdfYnl0ZShJODAxX2RldiwgU01CSFNUQ0ZHLCB0ZW1wIHwgMHgwMSk7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwgIldBUk5JTkc6IEk4MDEgU01CdXMgaW50ZXJmYWNlIHNldCB0byAiCi0JCQkibmV3IGFkZHJlc3MgJTA0eCFcbiIsIGk4MDFfc21iYSk7Ci0JfSBlbHNlIGlmICgodGVtcCAmIDEpID09IDApIHsKLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJIU1RDRkcsIHRlbXAgfCAxKTsKLQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiZW5hYmxpbmcgU01CdXMgZGV2aWNlXG4iKTsKLQl9Ci0KLQlpZiAodGVtcCAmIDB4MDIpCi0JCWRldl9kYmcoJmRldi0+ZGV2LCAiSTgwMSB1c2luZyBJbnRlcnJ1cHQgU01JIyBmb3IgU01CdXMuXG4iKTsKLQllbHNlCi0JCWRldl9kYmcoJmRldi0+ZGV2LCAiSTgwMSB1c2luZyBQQ0kgSW50ZXJydXB0IGZvciBTTUJ1cy5cbiIpOwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQlJFViwgJnRlbXApOwotCWRldl9kYmcoJmRldi0+ZGV2LCAiU01CUkVWID0gMHglWFxuIiwgdGVtcCk7Ci0JZGV2X2RiZygmZGV2LT5kZXYsICJJODAxX3NtYmEgPSAweCVYXG4iLCBpODAxX3NtYmEpOwotCi1FTkQ6Ci0JcmV0dXJuIGVycm9yX3JldHVybjsKLX0KLQogc3RhdGljIGludCBpODAxX3RyYW5zYWN0aW9uKHZvaWQpCiB7CiAJaW50IHRlbXA7CkBAIC0zMzQsOCArMjU3LDggQEAKIAkJLyogV2Ugd2lsbCBhbHdheXMgd2FpdCBmb3IgYSBmcmFjdGlvbiBvZiBhIHNlY29uZCEgKi8KIAkJdGltZW91dCA9IDA7CiAJCWRvIHsKLQkJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOwogCQkJbXNsZWVwKDEpOworCQkJdGVtcCA9IGluYl9wKFNNQkhTVFNUUyk7CiAJCX0KIAkJICAgIHdoaWxlICgoISh0ZW1wICYgMHg4MCkpCiAJCQkgICAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKQEAgLTM5Myw4ICszMTYsOCBAQAogCQkvKiB3YWl0IGZvciBJTlRSIGJpdCBhcyBhZHZpc2VkIGJ5IEludGVsICovCiAJCXRpbWVvdXQgPSAwOwogCQlkbyB7Ci0JCQl0ZW1wID0gaW5iX3AoU01CSFNUU1RTKTsKIAkJCW1zbGVlcCgxKTsKKwkJCXRlbXAgPSBpbmJfcChTTUJIU1RTVFMpOwogCQl9IHdoaWxlICgoISh0ZW1wICYgMHgwMikpCiAJCQkgICAmJiAodGltZW91dCsrIDwgTUFYX1RJTUVPVVQpKTsKIApAQCAtNTQxLDI1ICs0NjQsNzYgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgaTgwMV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCWludCBlcnI7CiAKLQlpZiAoaTgwMV9zZXR1cChkZXYpKSB7Ci0JCWRldl93YXJuKCZkZXYtPmRldiwKLQkJCSJJODAxIG5vdCBkZXRlY3RlZCwgbW9kdWxlIG5vdCBpbnNlcnRlZC5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKKwlJODAxX2RldiA9IGRldjsKKwlpZiAoKGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8zKSB8fAorCSAgICAoZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzMpIHx8CisJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQl80KSkKKwkJaXNpY2g0ID0gMTsKKwllbHNlCisJCWlzaWNoNCA9IDA7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZShkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIFNNQnVzIFBDSSBkZXZpY2UgKCVkKVxuIiwKKwkJCWVycik7CisJCWdvdG8gZXhpdDsKIAl9CiAKKwkvKiBEZXRlcm1pbmUgdGhlIGFkZHJlc3Mgb2YgdGhlIFNNQnVzIGFyZWEgKi8KKwlpODAxX3NtYmEgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBTTUJCQVIpOworCWlmICghaTgwMV9zbWJhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIHVuaW5pdGlhbGl6ZWQsICIKKwkJCSJ1cGdyYWRlIEJJT1NcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfZGlzYWJsZTsKKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCBTTUJCQVIsIGk4MDFfZHJpdmVyLm5hbWUpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBTTUJ1cyByZWdpb24gIgorCQkJIjB4JWx4LTB4JWx4XG4iLCBpODAxX3NtYmEsCisJCQlwY2lfcmVzb3VyY2VfZW5kKGRldiwgU01CQkFSKSk7CisJCWdvdG8gZXhpdF9kaXNhYmxlOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKEk4MDFfZGV2LCBTTUJIU1RDRkcsICZ0ZW1wKTsKKwl0ZW1wICY9IH5TTUJIU1RDRkdfSTJDX0VOOwkvKiBTTUJ1cyB0aW1pbmcgKi8KKwlpZiAoISh0ZW1wICYgU01CSFNUQ0ZHX0hTVF9FTikpIHsKKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiRW5hYmxpbmcgU01CdXMgZGV2aWNlXG4iKTsKKwkJdGVtcCB8PSBTTUJIU1RDRkdfSFNUX0VOOworCX0KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoSTgwMV9kZXYsIFNNQkhTVENGRywgdGVtcCk7CisKKwlpZiAodGVtcCAmIFNNQkhTVENGR19TTUJfU01JX0VOKQorCQlkZXZfZGJnKCZkZXYtPmRldiwgIlNNQnVzIHVzaW5nIGludGVycnVwdCBTTUkjXG4iKTsKKwllbHNlCisJCWRldl9kYmcoJmRldi0+ZGV2LCAiU01CdXMgdXNpbmcgUENJIEludGVycnVwdFxuIik7CisKIAkvKiBzZXQgdXAgdGhlIGRyaXZlcmZzIGxpbmthZ2UgdG8gb3VyIHBhcmVudCBkZXZpY2UgKi8KIAlpODAxX2FkYXB0ZXIuZGV2LnBhcmVudCA9ICZkZXYtPmRldjsKIAogCXNucHJpbnRmKGk4MDFfYWRhcHRlci5uYW1lLCBJMkNfTkFNRV9TSVpFLAotCQkiU01CdXMgSTgwMSBhZGFwdGVyIGF0ICUwNHgiLCBpODAxX3NtYmEpOwotCXJldHVybiBpMmNfYWRkX2FkYXB0ZXIoJmk4MDFfYWRhcHRlcik7CisJCSJTTUJ1cyBJODAxIGFkYXB0ZXIgYXQgJTA0bHgiLCBpODAxX3NtYmEpOworCWVyciA9IGkyY19hZGRfYWRhcHRlcigmaTgwMV9hZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBTTUJ1cyBhZGFwdGVyXG4iKTsKKwkJZ290byBleGl0X2Rpc2FibGU7CisJfQorCitleGl0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CitleGl0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODAxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCWkyY19kZWxfYWRhcHRlcigmaTgwMV9hZGFwdGVyKTsKLQlyZWxlYXNlX3JlZ2lvbihpODAxX3NtYmEsIChpc2ljaDQgPyAxNiA6IDgpKTsKKwlwY2lfcmVsZWFzZV9yZWdpb24oZGV2LCBTTUJCQVIpOworCXBjaV9kaXNhYmxlX2RldmljZShkZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaTgwMV9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5mb3JjZTIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jCmluZGV4IDJkODBlYjIuLjYwNGI0OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbmZvcmNlMi5jCkBAIC0zMSw2ICszMSw4IEBACiAgICAgbkZvcmNlMyAyNTBHYiBNQ1AJCTAwRTQKICAgICBuRm9yY2U0IE1DUAkJCTAwNTIKICAgICBuRm9yY2U0IE1DUC0wNAkJMDAzNAorICAgIG5Gb3JjZTQgTUNQNTEJCTAyNjQKKyAgICBuRm9yY2U0IE1DUDU1CQkwMzY4CiAKICAgICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgMiBTTUJ1c2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBNQ1Agb2YgdGhlCiAgICAgbkZvcmNlMi8zLzQgY2hpcHNldHMuCkBAIC02NCw2ICs2Niw3IEBACiAKIC8qCiAgKiBuVmlkaWEgbkZvcmNlMiBTTUJ1cyBjb250cm9sIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKiAoTmV3ZXIgaW5jYXJuYXRpb25zIHVzZSBzdGFuZGFyZCBCQVJzIDQgYW5kIDUgaW5zdGVhZCkKICAqLwogI2RlZmluZSBORk9SQ0VfUENJX1NNQjEJMHg1MAogI2RlZmluZSBORk9SQ0VfUENJX1NNQjIJMHg1NApAQCAtMjU5LDYgKzI2Miw4IEBACiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0UzU19TTUJVUykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRTRfU01CVVMpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQMDRfU01CVVMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfU01CVVMpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfU01CVVMpIH0sCiAJeyAwIH0KIH07CiAKQEAgLTI2NiwxOSArMjcxLDI5IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIG5mb3JjZTJfaWRzKTsKIAogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBuZm9yY2UyX3Byb2JlX3NtYiAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlZywKLQlzdHJ1Y3QgbmZvcmNlMl9zbWJ1cyAqc21idXMsIGNoYXIgKm5hbWUpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBuZm9yY2UyX3Byb2JlX3NtYiAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwKKwlpbnQgYWx0X3JlZywgc3RydWN0IG5mb3JjZTJfc21idXMgKnNtYnVzLCBjb25zdCBjaGFyICpuYW1lKQogewotCXUxNiBpb2Jhc2U7CiAJaW50IGVycm9yOwogCi0JaWYgKHBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgcmVnLCAmaW9iYXNlKSAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKLQkJZGV2X2Vycigmc21idXMtPmFkYXB0ZXIuZGV2LCAiRXJyb3IgcmVhZGluZyBQQ0kgY29uZmlnIGZvciAlc1xuIiwgbmFtZSk7Ci0JCXJldHVybiAtMTsKKwlzbWJ1cy0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhcik7CisJaWYgKHNtYnVzLT5iYXNlKSB7CisJCXNtYnVzLT5zaXplID0gcGNpX3Jlc291cmNlX2xlbihkZXYsIGJhcik7CisJfSBlbHNlIHsKKwkJLyogT2xkZXIgaW5jYXJuYXRpb25zIG9mIHRoZSBkZXZpY2UgdXNlZCBub24tc3RhbmRhcmQgQkFScyAqLworCQl1MTYgaW9iYXNlOworCisJCWlmIChwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIGFsdF9yZWcsICZpb2Jhc2UpCisJCSAgICAhPSBQQ0lCSU9TX1NVQ0NFU1NGVUwpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgcmVhZGluZyBQQ0kgY29uZmlnIGZvciAlc1xuIiwKKwkJCQluYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNtYnVzLT5iYXNlID0gaW9iYXNlICYgUENJX0JBU0VfQUREUkVTU19JT19NQVNLOworCQlzbWJ1cy0+c2l6ZSA9IDg7CiAJfQotCXNtYnVzLT5kZXYgID0gZGV2OwotCXNtYnVzLT5iYXNlID0gaW9iYXNlICYgMHhmZmZjOwotCXNtYnVzLT5zaXplID0gODsKKwlzbWJ1cy0+ZGV2ID0gZGV2OwogCiAJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzbWJ1cy0+YmFzZSwgc21idXMtPnNpemUsIG5mb3JjZTJfZHJpdmVyLm5hbWUpKSB7CiAJCWRldl9lcnIoJnNtYnVzLT5hZGFwdGVyLmRldiwgIkVycm9yIHJlcXVlc3RpbmcgcmVnaW9uICUwMnggLi4gJTAyWCBmb3IgJXNcbiIsCkBAIC0zMTMsMTIgKzMyOCwxMyBAQAogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIHNtYnVzZXMpOwogCiAJLyogU01CdXMgYWRhcHRlciAxICovCi0JcmVzMSA9IG5mb3JjZTJfcHJvYmVfc21iIChkZXYsIE5GT1JDRV9QQ0lfU01CMSwgJnNtYnVzZXNbMF0sICJTTUIxIik7CisJcmVzMSA9IG5mb3JjZTJfcHJvYmVfc21iKGRldiwgNCwgTkZPUkNFX1BDSV9TTUIxLCAmc21idXNlc1swXSwgIlNNQjEiKTsKIAlpZiAocmVzMSA8IDApIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJFcnJvciBwcm9iaW5nIFNNQjEuXG4iKTsKIAkJc21idXNlc1swXS5iYXNlID0gMDsJLyogdG8gaGF2ZSBhIGNoZWNrIHZhbHVlICovCiAJfQotCXJlczIgPSBuZm9yY2UyX3Byb2JlX3NtYiAoZGV2LCBORk9SQ0VfUENJX1NNQjIsICZzbWJ1c2VzWzFdLCAiU01CMiIpOworCS8qIFNNQnVzIGFkYXB0ZXIgMiAqLworCXJlczIgPSBuZm9yY2UyX3Byb2JlX3NtYihkZXYsIDUsIE5GT1JDRV9QQ0lfU01CMiwgJnNtYnVzZXNbMV0sICJTTUIyIik7CiAJaWYgKHJlczIgPCAwKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiRXJyb3IgcHJvYmluZyBTTUIyLlxuIik7CiAJCXNtYnVzZXNbMV0uYmFzZSA9IDA7CS8qIHRvIGhhdmUgYSBjaGVjayB2YWx1ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vY29yZXMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyODI0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtb2NvcmVzLmMKQEAgLTAsMCArMSwzNDEgQEAKKy8qCisgKiBpMmMtb2NvcmVzLmM6IEkyQyBidXMgZHJpdmVyIGZvciBPcGVuQ29yZXMgSTJDIGNvbnRyb2xsZXIKKyAqIChodHRwOi8vd3d3Lm9wZW5jb3Jlcy5vcmcvcHJvamVjdHMuY2dpL3dlYi9pMmMvb3ZlcnZpZXcpLgorICoKKyAqIFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1vY29yZXMuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworc3RydWN0IG9jb3Jlc19pMmMgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgcmVnc3RlcDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwOworCXN0cnVjdCBpMmNfbXNnICptc2c7CisJaW50IHBvczsKKwlpbnQgbm1zZ3M7CisJaW50IHN0YXRlOyAvKiBzZWUgU1RBVEVfICovCit9OworCisvKiByZWdpc3RlcnMgKi8KKyNkZWZpbmUgT0NJMkNfUFJFTE9XCQkwCisjZGVmaW5lIE9DSTJDX1BSRUhJR0gJCTEKKyNkZWZpbmUgT0NJMkNfQ09OVFJPTAkJMgorI2RlZmluZSBPQ0kyQ19EQVRBCQkzCisjZGVmaW5lIE9DSTJDX0NNRAkJNCAvKiB3cml0ZSBvbmx5ICovCisjZGVmaW5lIE9DSTJDX1NUQVRVUwkJNCAvKiByZWFkIG9ubHksIHNhbWUgYWRkcmVzcyBhcyBPQ0kyQ19DTUQgKi8KKworI2RlZmluZSBPQ0kyQ19DVFJMX0lFTgkJMHg0MAorI2RlZmluZSBPQ0kyQ19DVFJMX0VOCQkweDgwCisKKyNkZWZpbmUgT0NJMkNfQ01EX1NUQVJUCQkweDkxCisjZGVmaW5lIE9DSTJDX0NNRF9TVE9QCQkweDQxCisjZGVmaW5lIE9DSTJDX0NNRF9SRUFECQkweDIxCisjZGVmaW5lIE9DSTJDX0NNRF9XUklURQkJMHgxMQorI2RlZmluZSBPQ0kyQ19DTURfUkVBRF9BQ0sJMHgyMQorI2RlZmluZSBPQ0kyQ19DTURfUkVBRF9OQUNLCTB4MjkKKyNkZWZpbmUgT0NJMkNfQ01EX0lBQ0sJCTB4MDEKKworI2RlZmluZSBPQ0kyQ19TVEFUX0lGCQkweDAxCisjZGVmaW5lIE9DSTJDX1NUQVRfVElQCQkweDAyCisjZGVmaW5lIE9DSTJDX1NUQVRfQVJCTE9TVAkweDIwCisjZGVmaW5lIE9DSTJDX1NUQVRfQlVTWQkJMHg0MAorI2RlZmluZSBPQ0kyQ19TVEFUX05BQ0sJCTB4ODAKKworI2RlZmluZSBTVEFURV9ET05FCQkwCisjZGVmaW5lIFNUQVRFX1NUQVJUCQkxCisjZGVmaW5lIFNUQVRFX1dSSVRFCQkyCisjZGVmaW5lIFNUQVRFX1JFQUQJCTMKKyNkZWZpbmUgU1RBVEVfRVJST1IJCTQKKworc3RhdGljIGlubGluZSB2b2lkIG9jX3NldHJlZyhzdHJ1Y3Qgb2NvcmVzX2kyYyAqaTJjLCBpbnQgcmVnLCB1OCB2YWx1ZSkKK3sKKwlpb3dyaXRlOCh2YWx1ZSwgaTJjLT5iYXNlICsgcmVnICogaTJjLT5yZWdzdGVwKTsKK30KKworc3RhdGljIGlubGluZSB1OCBvY19nZXRyZWcoc3RydWN0IG9jb3Jlc19pMmMgKmkyYywgaW50IHJlZykKK3sKKwlyZXR1cm4gaW9yZWFkOChpMmMtPmJhc2UgKyByZWcgKiBpMmMtPnJlZ3N0ZXApOworfQorCitzdGF0aWMgdm9pZCBvY29yZXNfcHJvY2VzcyhzdHJ1Y3Qgb2NvcmVzX2kyYyAqaTJjKQoreworCXN0cnVjdCBpMmNfbXNnICptc2cgPSBpMmMtPm1zZzsKKwl1OCBzdGF0ID0gb2NfZ2V0cmVnKGkyYywgT0NJMkNfU1RBVFVTKTsKKworCWlmICgoaTJjLT5zdGF0ZSA9PSBTVEFURV9ET05FKSB8fCAoaTJjLT5zdGF0ZSA9PSBTVEFURV9FUlJPUikpIHsKKwkJLyogc3RvcCBoYXMgYmVlbiBzZW50ICovCisJCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NNRCwgT0NJMkNfQ01EX0lBQ0spOworCQl3YWtlX3VwKCZpMmMtPndhaXQpOworCQlyZXR1cm47CisJfQorCisJLyogZXJyb3I/ICovCisJaWYgKHN0YXQgJiBPQ0kyQ19TVEFUX0FSQkxPU1QpIHsKKwkJaTJjLT5zdGF0ZSA9IFNUQVRFX0VSUk9SOworCQlvY19zZXRyZWcoaTJjLCBPQ0kyQ19DTUQsIE9DSTJDX0NNRF9TVE9QKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoaTJjLT5zdGF0ZSA9PSBTVEFURV9TVEFSVCkgfHwgKGkyYy0+c3RhdGUgPT0gU1RBVEVfV1JJVEUpKSB7CisJCWkyYy0+c3RhdGUgPQorCQkJKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgPyBTVEFURV9SRUFEIDogU1RBVEVfV1JJVEU7CisKKwkJaWYgKHN0YXQgJiBPQ0kyQ19TVEFUX05BQ0spIHsKKwkJCWkyYy0+c3RhdGUgPSBTVEFURV9FUlJPUjsKKwkJCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NNRCwgT0NJMkNfQ01EX1NUT1ApOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlCisJCW1zZy0+YnVmW2kyYy0+cG9zKytdID0gb2NfZ2V0cmVnKGkyYywgT0NJMkNfREFUQSk7CisKKwkvKiBlbmQgb2YgbXNnPyAqLworCWlmIChpMmMtPnBvcyA9PSBtc2ctPmxlbikgeworCQlpMmMtPm5tc2dzLS07CisJCWkyYy0+bXNnKys7CisJCWkyYy0+cG9zID0gMDsKKwkJbXNnID0gaTJjLT5tc2c7CisKKwkJaWYgKGkyYy0+bm1zZ3MpIHsJLyogZW5kPyAqLworCQkJLyogc2VuZCBzdGFydD8gKi8KKwkJCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKSkgeworCQkJCXU4IGFkZHIgPSAobXNnLT5hZGRyIDw8IDEpOworCisJCQkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCQkJYWRkciB8PSAxOworCisJCQkJaTJjLT5zdGF0ZSA9IFNUQVRFX1NUQVJUOworCisJCQkJb2Nfc2V0cmVnKGkyYywgT0NJMkNfREFUQSwgYWRkcik7CisJCQkJb2Nfc2V0cmVnKGkyYywgT0NJMkNfQ01ELCAgT0NJMkNfQ01EX1NUQVJUKTsKKwkJCQlyZXR1cm47CisJCQl9IGVsc2UKKwkJCQlpMmMtPnN0YXRlID0gKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkKKwkJCQkJPyBTVEFURV9SRUFEIDogU1RBVEVfV1JJVEU7CisJCX0gZWxzZSB7CisJCQlpMmMtPnN0YXRlID0gU1RBVEVfRE9ORTsKKwkJCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NNRCwgT0NJMkNfQ01EX1NUT1ApOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaWYgKGkyYy0+c3RhdGUgPT0gU1RBVEVfUkVBRCkgeworCQlvY19zZXRyZWcoaTJjLCBPQ0kyQ19DTUQsIGkyYy0+cG9zID09IChtc2ctPmxlbi0xKSA/CisJCQkgIE9DSTJDX0NNRF9SRUFEX05BQ0sgOiBPQ0kyQ19DTURfUkVBRF9BQ0spOworCX0gZWxzZSB7CisJCW9jX3NldHJlZyhpMmMsIE9DSTJDX0RBVEEsIG1zZy0+YnVmW2kyYy0+cG9zKytdKTsKKwkJb2Nfc2V0cmVnKGkyYywgT0NJMkNfQ01ELCBPQ0kyQ19DTURfV1JJVEUpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IG9jb3Jlc19pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgb2NvcmVzX2kyYyAqaTJjID0gZGV2X2lkOworCisJb2NvcmVzX3Byb2Nlc3MoaTJjKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBvY29yZXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQoreworCXN0cnVjdCBvY29yZXNfaTJjICppMmMgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJaTJjLT5tc2cgPSBtc2dzOworCWkyYy0+cG9zID0gMDsKKwlpMmMtPm5tc2dzID0gbnVtOworCWkyYy0+c3RhdGUgPSBTVEFURV9TVEFSVDsKKworCW9jX3NldHJlZyhpMmMsIE9DSTJDX0RBVEEsCisJCQkoaTJjLT5tc2ctPmFkZHIgPDwgMSkgfAorCQkJKChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgPyAxOjApKTsKKworCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NNRCwgT0NJMkNfQ01EX1NUQVJUKTsKKworCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQoaTJjLT53YWl0LCAoaTJjLT5zdGF0ZSA9PSBTVEFURV9FUlJPUikgfHwKKwkJCSAgICAgICAoaTJjLT5zdGF0ZSA9PSBTVEFURV9ET05FKSwgSFopKQorCQlyZXR1cm4gKGkyYy0+c3RhdGUgPT0gU1RBVEVfRE9ORSkgPyBudW0gOiAtRUlPOworCWVsc2UKKwkJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKK3N0YXRpYyB2b2lkIG9jb3Jlc19pbml0KHN0cnVjdCBvY29yZXNfaTJjICppMmMsCisJCQlzdHJ1Y3Qgb2NvcmVzX2kyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcHJlc2NhbGU7CisJdTggY3RybCA9IG9jX2dldHJlZyhpMmMsIE9DSTJDX0NPTlRST0wpOworCisJLyogbWFrZSBzdXJlIHRoZSBkZXZpY2UgaXMgZGlzYWJsZWQgKi8KKwlvY19zZXRyZWcoaTJjLCBPQ0kyQ19DT05UUk9MLCBjdHJsICYgfihPQ0kyQ19DVFJMX0VOfE9DSTJDX0NUUkxfSUVOKSk7CisKKwlwcmVzY2FsZSA9IChwZGF0YS0+Y2xvY2tfa2h6IC8gKDUqMTAwKSkgLSAxOworCW9jX3NldHJlZyhpMmMsIE9DSTJDX1BSRUxPVywgcHJlc2NhbGUgJiAweGZmKTsKKwlvY19zZXRyZWcoaTJjLCBPQ0kyQ19QUkVISUdILCBwcmVzY2FsZSA+PiA4KTsKKworCS8qIEluaXQgdGhlIGRldmljZSAqLworCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NNRCwgT0NJMkNfQ01EX0lBQ0spOworCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NPTlRST0wsIGN0cmwgfCBPQ0kyQ19DVFJMX0lFTiB8IE9DSTJDX0NUUkxfRU4pOworfQorCisKK3N0YXRpYyB1MzIgb2NvcmVzX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMOworfQorCitzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gb2NvcmVzX2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIJPSBvY29yZXNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IG9jb3Jlc19mdW5jLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlciBvY29yZXNfYWRhcHRlciA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImkyYy1vY29yZXMiLAorCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmFsZ28JCT0gJm9jb3Jlc19hbGdvcml0aG0sCit9OworCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG9jb3Jlc19pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgb2NvcmVzX2kyYyAqaTJjOworCXN0cnVjdCBvY29yZXNfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzLCAqcmVzMjsKKwlpbnQgcmV0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXMyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIXJlczIpCisJCXJldHVybiAtRU5PREVWOworCisJcGRhdGEgPSAoc3RydWN0IG9jb3Jlc19pMmNfcGxhdGZvcm1fZGF0YSopIHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJaTJjID0ga3phbGxvYyhzaXplb2YoKmkyYyksIEdGUF9LRVJORUwpOworCWlmICghaTJjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEsCisJCQkJcGRldi0+bmFtZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWVtb3J5IHJlZ2lvbiBidXN5XG4iKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIHJlcXVlc3RfbWVtX2ZhaWxlZDsKKwl9CisKKwlpMmMtPmJhc2UgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCWlmICghaTJjLT5iYXNlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBtYXAgcmVnaXN0ZXJzXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBtYXBfZmFpbGVkOworCX0KKworCWkyYy0+cmVnc3RlcCA9IHBkYXRhLT5yZWdzdGVwOworCW9jb3Jlc19pbml0KGkyYywgcGRhdGEpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53YWl0KTsKKwlyZXQgPSByZXF1ZXN0X2lycShyZXMyLT5zdGFydCwgb2NvcmVzX2lzciwgMCwgcGRldi0+bmFtZSwgaTJjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBjbGFpbSBJUlFcbiIpOworCQlnb3RvIHJlcXVlc3RfaXJxX2ZhaWxlZDsKKwl9CisKKwkvKiBob29rIHVwIGRyaXZlciB0byB0cmVlICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKKwlpMmMtPmFkYXAgPSBvY29yZXNfYWRhcHRlcjsKKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmMtPmFkYXAsIGkyYyk7CisJaTJjLT5hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCisJLyogYWRkIGkyYyBhZGFwdGVyIHRvIGkyYyB0cmVlICovCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBhZGFwdGVyXG4iKTsKKwkJZ290byBhZGRfYWRhcHRlcl9mYWlsZWQ7CisJfQorCisJcmV0dXJuIDA7CisKK2FkZF9hZGFwdGVyX2ZhaWxlZDoKKwlmcmVlX2lycShyZXMyLT5zdGFydCwgaTJjKTsKK3JlcXVlc3RfaXJxX2ZhaWxlZDoKKwlpb3VubWFwKGkyYy0+YmFzZSk7CittYXBfZmFpbGVkOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKTsKK3JlcXVlc3RfbWVtX2ZhaWxlZDoKKwlrZnJlZShpMmMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgb2NvcmVzX2kyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSogcGRldikKK3sKKwlzdHJ1Y3Qgb2NvcmVzX2kyYyAqaTJjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwkvKiBkaXNhYmxlIGkyYyBsb2dpYyAqLworCW9jX3NldHJlZyhpMmMsIE9DSTJDX0NPTlRST0wsIG9jX2dldHJlZyhpMmMsIE9DSTJDX0NPTlRST0wpCisJCSAgJiB+KE9DSTJDX0NUUkxfRU58T0NJMkNfQ1RSTF9JRU4pKTsKKworCS8qIHJlbW92ZSBhZGFwdGVyICYgZGF0YSAqLworCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKHJlcykKKwkJZnJlZV9pcnEocmVzLT5zdGFydCwgaTJjKTsKKworCWlvdW5tYXAoaTJjLT5iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcykKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlcy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpOworCisJa2ZyZWUoaTJjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvY29yZXNfaTJjX2RyaXZlciA9IHsKKwkucHJvYmUgID0gb2NvcmVzX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3Aob2NvcmVzX2kyY19yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9ICJvY29yZXMtaTJjIiwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgb2NvcmVzX2kyY19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmb2NvcmVzX2kyY19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb2NvcmVzX2kyY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm9jb3Jlc19pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQob2NvcmVzX2kyY19pbml0KTsKK21vZHVsZV9leGl0KG9jb3Jlc19pMmNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9wZW5Db3JlcyBJMkMgYnVzIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1waWl4NC5jCmluZGV4IGQ5YzdjMDAuLjhmMmY2NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcGlpeDQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBpaXg0LmMKQEAgLTEwMiwxMyArMTAyLDYgQEAKIAkJICJGb3JjaWJseSBlbmFibGUgdGhlIFBJSVg0IGF0IHRoZSBnaXZlbiBhZGRyZXNzLiAiCiAJCSAiRVhUUkVNRUxZIERBTkdFUk9VUyEiKTsKIAotLyogSWYgZml4X2hzdGNmZyBpcyBzZXQgdG8gYW55dGhpbmcgZGlmZmVyZW50IGZyb20gMCwgd2UgcmVzZXQgb25lIG9mIHRoZQotICAgcmVnaXN0ZXJzIHRvIGJlIGEgdmFsaWQgdmFsdWUuICovCi1zdGF0aWMgaW50IGZpeF9oc3RjZmc7Ci1tb2R1bGVfcGFyYW0gKGZpeF9oc3RjZmcsIGludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZpeF9oc3RjZmcsCi0JCSJGaXggY29uZmlnIHJlZ2lzdGVyLiBOZWVkZWQgb24gc29tZSBib2FyZHMgKEZvcmNlIENQQ0k3MzUpLiIpOwotCiBzdGF0aWMgaW50IHBpaXg0X3RyYW5zYWN0aW9uKHZvaWQpOwogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGlpeDRfc21iYTsKQEAgLTEzNyw3ICsxMzAsNyBAQAogCS8qIERvbid0IGFjY2VzcyBTTUJ1cyBvbiBJQk0gc3lzdGVtcyB3aGljaCBnZXQgY29ycnVwdGVkIGVlcHJvbXMgKi8KIAlpZiAoZG1pX2NoZWNrX3N5c3RlbShwaWl4NF9kbWlfdGFibGUpICYmCiAJCQlQSUlYNF9kZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSB7Ci0JCWRldl9lcnIoJlBJSVg0X2Rldi0+ZGV2LCAiSUJNIExhcHRvcCBkZXRlY3RlZDsgdGhpcyBtb2R1bGUgIgorCQlkZXZfZXJyKCZQSUlYNF9kZXYtPmRldiwgIklCTSBzeXN0ZW0gZGV0ZWN0ZWQ7IHRoaXMgbW9kdWxlICIKIAkJCSJtYXkgY29ycnVwdCB5b3VyIHNlcmlhbCBlZXByb20hIFJlZnVzaW5nIHRvIGxvYWQgIgogCQkJIm1vZHVsZSFcbiIpOwogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTY2LDIyICsxNTksNiBAQAogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoUElJWDRfZGV2LCBTTUJIU1RDRkcsICZ0ZW1wKTsKIAotCS8qIFNvbWUgQklPUyB3aWxsIHNldCB1cCB0aGUgY2hpcHNldCBpbmNvcnJlY3RseSBhbmQgbGVhdmUgYSByZWdpc3RlcgotCSAgIGluIGFuIHVuZGVmaW5lZCBzdGF0ZSAoY2F1c2luZyBJMkMgdG8gYWN0IHZlcnkgc3RyYW5nZWx5KS4gKi8KLQlpZiAodGVtcCAmIDB4MDIpIHsKLQkJaWYgKGZpeF9oc3RjZmcpIHsKLQkJCWRldl9pbmZvKCZQSUlYNF9kZXYtPmRldiwgIldvcmtpbmcgYXJvdW5kIGJ1Z2d5IEJJT1MgIgotCQkJCQkiKEkyQylcbiIpOwotCQkJdGVtcCAmPSAweGZkOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKFBJSVg0X2RldiwgU01CSFNUQ0ZHLCB0ZW1wKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9pbmZvKCZQSUlYNF9kZXYtPmRldiwgIlVudXN1YWwgY29uZmlnIHJlZ2lzdGVyICIKLQkJCQkJInZhbHVlXG4iKTsKLQkJCWRldl9pbmZvKCZQSUlYNF9kZXYtPmRldiwgIlRyeSB1c2luZyBmaXhfaHN0Y2ZnPTEgaWYgIgotCQkJCQkieW91IGV4cGVyaWVuY2UgcHJvYmxlbXNcbiIpOwotCQl9Ci0JfQotIAogCS8qIElmIGZvcmNlX2FkZHIgaXMgc2V0LCB3ZSBwcm9ncmFtIHRoZSBuZXcgYWRkcmVzcyBoZXJlLiBKdXN0IHRvIG1ha2UKIAkgICBzdXJlLCB3ZSBkaXNhYmxlIHRoZSBQSUlYNCBmaXJzdC4gKi8KIAlpZiAoZm9yY2VfYWRkcikgewpAQCAtMjE0LDcgKzE5MSw3IEBACiAJCX0KIAl9CiAKLQlpZiAoKHRlbXAgJiAweDBFKSA9PSA4KQorCWlmICgoKHRlbXAgJiAweDBFKSA9PSA4KSB8fCAoKHRlbXAgJiAweDBFKSA9PSAyKSkKIAkJZGV2X2RiZygmUElJWDRfZGV2LT5kZXYsICJVc2luZyBJbnRlcnJ1cHQgOSBmb3IgU01CdXMuXG4iKTsKIAllbHNlIGlmICgodGVtcCAmIDB4MEUpID09IDApCiAJCWRldl9kYmcoJlBJSVg0X2Rldi0+ZGV2LCAiVXNpbmcgSW50ZXJydXB0IFNNSSMgZm9yIFNNQnVzLlxuIik7CkBAIC00MTMsNiArMzkwLDEyIEBACiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcGlpeDRfaWRzW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODIzNzFBQl8zKSwKIAkgIC5kcml2ZXJfZGF0YSA9IDMgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDIwMF9TTUJVUyksCisJICAuZHJpdmVyX2RhdGEgPSAwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfREVWSUNFX0lEX0FUSV9JWFAzMDBfU01CVVMpLAorCSAgLmRyaXZlcl9kYXRhID0gMCB9LAorCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0RFVklDRV9JRF9BVElfSVhQNDAwX1NNQlVTKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19PU0I0KSwKIAkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TRVJWRVJXT1JLUywgUENJX0RFVklDRV9JRF9TRVJWRVJXT1JLU19DU0I1KSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvc2N4MjAwX2FjYi5jCmluZGV4IDc2NmNjOTYuLjIyYTNlZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9zY3gyMDBfYWNiLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL3NjeDIwMF9hY2IuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vbXNyLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zY3gyMDAuaD4KIApAQCAtODUsNiArODQsMTAgQEAKIAl1OCAqcHRyOwogCWNoYXIgbmVlZHNfcmVzZXQ7CiAJdW5zaWduZWQgbGVuOworCisJLyogUENJIGRldmljZSBpbmZvICovCisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJaW50IGJhcjsKIH07CiAKIC8qIFJlZ2lzdGVyIERlZmluaXRpb25zICovCkBAIC0zODEsNyArMzg0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqc2N4MjAwX2FjYl9saXN0Owogc3RhdGljIERFQ0xBUkVfTVVURVgoc2N4MjAwX2FjYl9saXN0X211dGV4KTsKIAotc3RhdGljIGludCBzY3gyMDBfYWNiX3Byb2JlKHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZSkKK3N0YXRpYyBfX2luaXQgaW50IHNjeDIwMF9hY2JfcHJvYmUoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQogewogCXU4IHZhbDsKIApAQCAtNDE3LDE3ICs0MjAsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCAgX19pbml0IHNjeDIwMF9hY2JfY3JlYXRlKGNvbnN0IGNoYXIgKnRleHQsIGludCBiYXNlLCBpbnQgaW5kZXgpCitzdGF0aWMgX19pbml0IHN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICpzY3gyMDBfY3JlYXRlX2lmYWNlKGNvbnN0IGNoYXIgKnRleHQsCisJCWludCBpbmRleCkKIHsKIAlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyOwotCWludCByYzsKIAogCWlmYWNlID0ga3phbGxvYyhzaXplb2YoKmlmYWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpZmFjZSkgewogCQlwcmludGsoS0VSTl9FUlIgTkFNRSAiOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3V0OworCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlhZGFwdGVyID0gJmlmYWNlLT5hZGFwdGVyOwpAQCAtNDQwLDI2ICs0NDIsMjcgQEAKIAogCW11dGV4X2luaXQoJmlmYWNlLT5tdXRleCk7CiAKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGJhc2UsIDgsIGFkYXB0ZXItPm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGNhbid0IGFsbG9jYXRlIGlvIDB4JXgtMHgleFxuIiwKLQkJCWJhc2UsIGJhc2UgKyA4LTEpOwotCQlyYyA9IC1FQlVTWTsKLQkJZ290byBlcnJvdXRfZnJlZTsKLQl9Ci0JaWZhY2UtPmJhc2UgPSBiYXNlOworCXJldHVybiBpZmFjZTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2FjYl9jcmVhdGUoc3RydWN0IHNjeDIwMF9hY2JfaWZhY2UgKmlmYWNlKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcjsKKwlpbnQgcmM7CisKKwlhZGFwdGVyID0gJmlmYWNlLT5hZGFwdGVyOwogCiAJcmMgPSBzY3gyMDBfYWNiX3Byb2JlKGlmYWNlKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IHByb2JlIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3V0X3JlbGVhc2U7CisJCXJldHVybiByYzsKIAl9CiAKIAlzY3gyMDBfYWNiX3Jlc2V0KGlmYWNlKTsKIAogCWlmIChpMmNfYWRkX2FkYXB0ZXIoYWRhcHRlcikgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IGZhaWxlZCB0byByZWdpc3RlclxuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBlcnJvdXRfcmVsZWFzZTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJZG93bigmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKQEAgLTQ2OCw2NCArNDcxLDE0OCBAQAogCXVwKCZzY3gyMDBfYWNiX2xpc3RfbXV0ZXgpOwogCiAJcmV0dXJuIDA7Cit9CiAKLSBlcnJvdXRfcmVsZWFzZToKLQlyZWxlYXNlX3JlZ2lvbihpZmFjZS0+YmFzZSwgOCk7CitzdGF0aWMgX19pbml0IGludCBzY3gyMDBfY3JlYXRlX3BjaShjb25zdCBjaGFyICp0ZXh0LCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJaW50IGJhcikKK3sKKwlzdHJ1Y3Qgc2N4MjAwX2FjYl9pZmFjZSAqaWZhY2U7CisJaW50IHJjOworCisJaWZhY2UgPSBzY3gyMDBfY3JlYXRlX2lmYWNlKHRleHQsIDApOworCisJaWYgKGlmYWNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWZhY2UtPnBkZXYgPSBwZGV2OworCWlmYWNlLT5iYXIgPSBiYXI7CisKKwlwY2lfZW5hYmxlX2RldmljZV9iYXJzKGlmYWNlLT5wZGV2LCAxIDw8IGlmYWNlLT5iYXIpOworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24oaWZhY2UtPnBkZXYsIGlmYWNlLT5iYXIsIGlmYWNlLT5hZGFwdGVyLm5hbWUpOworCisJaWYgKHJjICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogY2FuJ3QgYWxsb2NhdGUgUENJIEJBUiAlZFxuIiwKKwkJCQlpZmFjZS0+YmFyKTsKKwkJZ290byBlcnJvdXRfZnJlZTsKKwl9CisKKwlpZmFjZS0+YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChpZmFjZS0+cGRldiwgaWZhY2UtPmJhcik7CisJcmMgPSBzY3gyMDBfYWNiX2NyZWF0ZShpZmFjZSk7CisKKwlpZiAocmMgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVsZWFzZV9yZWdpb24oaWZhY2UtPnBkZXYsIGlmYWNlLT5iYXIpOworCXBjaV9kZXZfcHV0KGlmYWNlLT5wZGV2KTsKICBlcnJvdXRfZnJlZToKIAlrZnJlZShpZmFjZSk7Ci0gZXJyb3V0OgogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjeDIwMFtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX1NDeDIwMF9CUklER0UpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsIFBDSV9ERVZJQ0VfSURfTlNfU0MxMTAwX0JSSURHRSkgfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZGl2aWxfcGNpW10gPSB7Ci0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfTlMsICBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9JU0EpIH0sCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSVNBKSB9LAotCXsgfSAvKiBOVUxMIGVudHJ5ICovCi19OwotCi0jZGVmaW5lIE1TUl9MQkFSX1NNQgkJMHg1MTQwMDAwQgotCi1zdGF0aWMgX19pbml0IGludCBzY3gyMDBfYWRkX2NzNTUzeCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgc2N4MjAwX2NyZWF0ZV9pc2EoY29uc3QgY2hhciAqdGV4dCwgdW5zaWduZWQgbG9uZyBiYXNlLAorCQlpbnQgaW5kZXgpCiB7Ci0JdTMyCWxvdywgaGk7Ci0JdTMyCXNtYl9iYXNlOworCXN0cnVjdCBzY3gyMDBfYWNiX2lmYWNlICppZmFjZTsKKwlpbnQgcmM7CiAKLQkvKiBHcmFiICYgcmVzZXJ2ZSB0aGUgU01CIEkvTyByYW5nZSAqLwotCXJkbXNyKE1TUl9MQkFSX1NNQiwgbG93LCBoaSk7CisJaWZhY2UgPSBzY3gyMDBfY3JlYXRlX2lmYWNlKHRleHQsIGluZGV4KTsKIAotCS8qIENoZWNrIHRoZSBJTyBtYXNrIGFuZCB3aGV0aGVyIFNNQiBpcyBlbmFibGVkICovCi0JaWYgKGhpICE9IDB4MDAwMEYwMDEpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICI6IFNNQnVzIG5vdCBlbmFibGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGlmYWNlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHJlcXVlc3RfcmVnaW9uKGJhc2UsIDgsIGlmYWNlLT5hZGFwdGVyLm5hbWUpID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIE5BTUUgIjogY2FuJ3QgYWxsb2NhdGUgaW8gMHglbHgtMHglbHhcbiIsCisJCSAgICAgICBiYXNlLCBiYXNlICsgOCAtIDEpOworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBlcnJvdXRfZnJlZTsKIAl9CiAKLQkvKiBTTUJ1cyBJTyBzaXplIGlzIDggYnl0ZXMgKi8KLQlzbWJfYmFzZSA9IGxvdyAmIDB4MDAwMEZGRjg7CisJaWZhY2UtPmJhc2UgPSBiYXNlOworCXJjID0gc2N4MjAwX2FjYl9jcmVhdGUoaWZhY2UpOwogCi0JcmV0dXJuIHNjeDIwMF9hY2JfY3JlYXRlKCJDUzU1MzUiLCBzbWJfYmFzZSwgMCk7CisJaWYgKHJjID09IDApCisJCXJldHVybiAwOworCisJcmVsZWFzZV9yZWdpb24oYmFzZSwgOCk7CisgZXJyb3V0X2ZyZWU6CisJa2ZyZWUoaWZhY2UpOworCXJldHVybiByYzsKK30KKworLyogRHJpdmVyIGRhdGEgaXMgYW4gaW5kZXggaW50byB0aGUgc2N4MjAwX2RhdGEgYXJyYXkgdGhhdCBpbmRpY2F0ZXMKKyAqIHRoZSBuYW1lIGFuZCB0aGUgQkFSIHdoZXJlIHRoZSBJL08gYWRkcmVzcyByZXNvdXJjZSBpcyBsb2NhdGVkLiAgSVNBCisgKiBkZXZpY2VzIGFyZSBmbGFnZ2VkIHdpdGggYSBiYXIgdmFsdWUgb2YgLTEgKi8KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNjeDIwMF9wY2lbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQ3gyMDBfQlJJREdFKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19TQzExMDBfQlJJREdFKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfSVNBKSwKKwkgIC5kcml2ZXJfZGF0YSA9IDEgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0NTNTUzNl9JU0EpLAorCSAgLmRyaXZlcl9kYXRhID0gMiB9Cit9OworCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBiYXI7Cit9IHNjeDIwMF9kYXRhW10gPSB7CisJeyAiU0N4MjAwIiwgLTEgfSwKKwl7ICJDUzU1MzUiLCAgMCB9LAorCXsgIkNTNTUzNiIsICAwIH0KK307CisKK3N0YXRpYyBfX2luaXQgaW50IHNjeDIwMF9zY2FuX3BjaSh2b2lkKQoreworCWludCBkYXRhLCBkZXY7CisJaW50IHJjID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCWZvcihkZXYgPSAwOyBkZXYgPCBBUlJBWV9TSVpFKHNjeDIwMF9wY2kpOyBkZXYrKykgeworCQlwZGV2ID0gcGNpX2dldF9kZXZpY2Uoc2N4MjAwX3BjaVtkZXZdLnZlbmRvciwKKwkJCQlzY3gyMDBfcGNpW2Rldl0uZGV2aWNlLCBOVUxMKTsKKworCQlpZiAocGRldiA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZGF0YSA9IHNjeDIwMF9wY2lbZGV2XS5kcml2ZXJfZGF0YTsKKworCQkvKiBpZiAuYmFyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gemVybywgdGhpcyBpcyBhCisJCSAqIFBDSSBkZXZpY2UgLSBvdGhlcndpc2UsIHdlIGFzc3VtZQorCQkgICB0aGF0IHRoZSBwb3J0cyBhcmUgSVNBIGJhc2VkCisJCSovCisKKwkJaWYgKHNjeDIwMF9kYXRhW2RhdGFdLmJhciA+PSAwKQorCQkJcmMgPSBzY3gyMDBfY3JlYXRlX3BjaShzY3gyMDBfZGF0YVtkYXRhXS5uYW1lLCBwZGV2LAorCQkJCQlzY3gyMDBfZGF0YVtkYXRhXS5iYXIpOworCQllbHNlIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0RFVklDRVM7ICsraSkgeworCQkJCWlmIChiYXNlW2ldID09IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJcmMgPSBzY3gyMDBfY3JlYXRlX2lzYShzY3gyMDBfZGF0YVtkYXRhXS5uYW1lLAorCQkJCQkJYmFzZVtpXSwKKwkJCQkJCWkpOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBzY3gyMDBfYWNiX2luaXQodm9pZCkKIHsKLQlpbnQgaTsKLQlpbnQJcmMgPSAtRU5PREVWOworCWludCByYzsKIAogCXByX2RlYnVnKE5BTUUgIjogTmF0U2VtaSBTQ3gyMDAgQUNDRVNTLmJ1cyBEcml2ZXJcbiIpOwogCi0JLyogVmVyaWZ5IHRoYXQgdGhpcyByZWFsbHkgaXMgYSBTQ3gyMDAgcHJvY2Vzc29yICovCi0JaWYgKHBjaV9kZXZfcHJlc2VudChzY3gyMDApKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfREVWSUNFUzsgKytpKSB7Ci0JCQlpZiAoYmFzZVtpXSA+IDApCi0JCQkJcmMgPSBzY3gyMDBfYWNiX2NyZWF0ZSgiU0N4MjAwIiwgYmFzZVtpXSwgaSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHBjaV9kZXZfcHJlc2VudChkaXZpbF9wY2kpKQotCQlyYyA9IHNjeDIwMF9hZGRfY3M1NTN4KCk7CisJcmMgPSBzY3gyMDBfc2Nhbl9wY2koKTsKIAogCS8qIElmIGF0IGxlYXN0IG9uZSBidXMgd2FzIGNyZWF0ZWQsIGluaXQgbXVzdCBzdWNjZWVkICovCiAJaWYgKHNjeDIwMF9hY2JfbGlzdCkKQEAgLTU0Myw3ICs2MzAsMTQgQEAKIAkJdXAoJnNjeDIwMF9hY2JfbGlzdF9tdXRleCk7CiAKIAkJaTJjX2RlbF9hZGFwdGVyKCZpZmFjZS0+YWRhcHRlcik7Ci0JCXJlbGVhc2VfcmVnaW9uKGlmYWNlLT5iYXNlLCA4KTsKKworCQlpZiAoaWZhY2UtPnBkZXYpIHsKKwkJCXBjaV9yZWxlYXNlX3JlZ2lvbihpZmFjZS0+cGRldiwgaWZhY2UtPmJhcik7CisJCQlwY2lfZGV2X3B1dChpZmFjZS0+cGRldik7CisJCX0KKwkJZWxzZQorCQkJcmVsZWFzZV9yZWdpb24oaWZhY2UtPmJhc2UsIDgpOworCiAJCWtmcmVlKGlmYWNlKTsKIAkJZG93bigmc2N4MjAwX2FjYl9saXN0X211dGV4KTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvY2hpcHMvS2NvbmZpZwppbmRleCA3YWE1YzM4Li44N2VlM2NlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2NoaXBzL0tjb25maWcKQEAgLTM5LDYgKzM5LDcgQEAKIGNvbmZpZyBTRU5TT1JTX1BDRjg1NzQKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0Y4NTc0IGFuZCBQQ0Y4NTc0QSIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgUGhpbGlwcyBQQ0Y4NTc0IGFuZCAKIAkgIFBDRjg1NzRBIGNoaXBzLgpAQCAtNDYsNiArNDcsOSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcGNmODU3NC4KIAorCSAgVGhlc2UgZGV2aWNlcyBhcmUgaGFyZCB0byBkZXRlY3QgYW5kIHJhcmVseSBmb3VuZCBvbiBtYWluc3RyZWFtCisJICBoYXJkd2FyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTRU5TT1JTX1BDQTk1MzkKIAl0cmlzdGF0ZSAiUGhpbGlwcyBQQ0E5NTM5IDE2LWJpdCBJL08gcG9ydCIKIAlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKQEAgLTU5LDEyICs2MywxNiBAQAogY29uZmlnIFNFTlNPUlNfUENGODU5MQogCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1OTEiCiAJZGVwZW5kcyBvbiBJMkMgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCiAJaGVscAogCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIFBoaWxpcHMgUENGODU5MSBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgcGNmODU5MS4KIAorCSAgVGhlc2UgZGV2aWNlcyBhcmUgaGFyZCB0byBkZXRlY3QgYW5kIHJhcmVseSBmb3VuZCBvbiBtYWluc3RyZWFtCisJICBoYXJkd2FyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBJU1AxMzAxX09NQVAKIAl0cmlzdGF0ZSAiUGhpbGlwcyBJU1AxMzAxIHdpdGggT01BUCBPVEciCiAJZGVwZW5kcyBvbiBJMkMgJiYgQVJDSF9PTUFQX09URwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwppbmRleCA5OWFiNGVjLi4yZGQwYTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYworKysgYi9kcml2ZXJzL2kyYy9jaGlwcy9tNDF0MDAuYwpAQCAtMSwxMSArMSw5IEBACiAvKgotICogZHJpdmVycy9pMmMvY2hpcHMvbTQxdDAwLmMKLSAqCi0gKiBJMkMgY2xpZW50L2RyaXZlciBmb3IgdGhlIFNUIE00MVQwMCBSZWFsLVRpbWUgQ2xvY2sgY2hpcC4KKyAqIEkyQyBjbGllbnQvZHJpdmVyIGZvciB0aGUgU1QgTTQxVDAwIGZhbWlseSBvZiBpMmMgcnRjIGNoaXBzLgogICoKICAqIEF1dGhvcjogTWFyayBBLiBHcmVlciA8bWdyZWVyQG12aXN0YS5jb20+CiAgKgotICogMjAwNSAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIKKyAqIDIwMDUsIDIwMDYgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCiAgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCiAgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKICAqIG9yIGltcGxpZWQuCkBAIC0xMyw5ICsxMSw2IEBACiAvKgogICogVGhpcyBpMmMgY2xpZW50L2RyaXZlciB3ZWRnZXMgYmV0d2VlbiB0aGUgZHJpdmVycy9jaGFyL2dlbnJ0Yy5jIFJUQwogICogaW50ZXJmYWNlIGFuZCB0aGUgU01CdXMgaW50ZXJmYWNlIG9mIHRoZSBpMmMgc3Vic3lzdGVtLgotICogSXQgd291bGQgYmUgbW9yZSBlZmZpY2llbnQgdG8gdXNlIGkyYyBtc2dzL2kyY190cmFuc2ZlciBkaXJlY3RseSBidXQsIGFzCi0gKiByZWNvbW1lbmVkIGluIC4uLi9Eb2N1bWVudGF0aW9uL2kyYy93cml0aW5nLWNsaWVudHMgc2VjdGlvbgotICogIlNlbmRpbmcgYW5kIHJlY2VpdmluZyIsIHVzaW5nIFNNQnVzIGxldmVsIGNvbW11bmljYXRpb24gaXMgcHJlZmVycmVkLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTI0LDU2ICsxOSwxMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9iY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbTQxdDAwLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vcnRjLmg+CiAKLSNkZWZpbmUJTTQxVDAwX0RSVl9OQU1FCQkibTQxdDAwIgotCi1zdGF0aWMgREVGSU5FX01VVEVYKG00MXQwMF9tdXRleCk7Ci0KIHN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtNDF0MDBfZHJpdmVyOwogc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50ICpzYXZlX2NsaWVudDsKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGlnbm9yZVtdID0geyBJMkNfQ0xJRU5UX0VORCB9Owotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9hZGRyW10gPSB7IDB4NjgsIEkyQ19DTElFTlRfRU5EIH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2FkZHJbXSA9IHsgSTJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0gewotCS5ub3JtYWxfaTJjCQk9IG5vcm1hbF9hZGRyLAotCS5wcm9iZQkJCT0gaWdub3JlLAotCS5pZ25vcmUJCQk9IGlnbm9yZSwKKwkubm9ybWFsX2kyYwk9IG5vcm1hbF9hZGRyLAorCS5wcm9iZQkJPSBpZ25vcmUsCisJLmlnbm9yZQkJPSBpZ25vcmUsCiB9OwogCitzdHJ1Y3QgbTQxdDAwX2NoaXBfaW5mbyB7CisJdTgJdHlwZTsKKwljaGFyCSpuYW1lOworCXU4CXJlYWRfbGltaXQ7CisJdTgJc2VjOwkJLyogT2Zmc2V0cyBmb3IgY2hpcCByZWdzICovCisJdTgJbWluOworCXU4CWhvdXI7CisJdTgJZGF5OworCXU4CW1vbjsKKwl1OAl5ZWFyOworCXU4CWFsYXJtX21vbjsKKwl1OAlhbGFybV9ob3VyOworCXU4CXNxdzsKKwl1OAlzcXdfZnJlcTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbTQxdDAwX2NoaXBfaW5mbyBtNDF0MDBfY2hpcF9pbmZvX3RibFtdID0geworCXsKKwkJLnR5cGUJCT0gTTQxVDAwX1RZUEVfTTQxVDAwLAorCQkubmFtZQkJPSAibTQxdDAwIiwKKwkJLnJlYWRfbGltaXQJPSA1LAorCQkuc2VjCQk9IDAsCisJCS5taW4JCT0gMSwKKwkJLmhvdXIJCT0gMiwKKwkJLmRheQkJPSA0LAorCQkubW9uCQk9IDUsCisJCS55ZWFyCQk9IDYsCisJfSwKKwl7CisJCS50eXBlCQk9IE00MVQwMF9UWVBFX000MVQ4MSwKKwkJLm5hbWUJCT0gIm00MXQ4MSIsCisJCS5yZWFkX2xpbWl0CT0gMSwKKwkJLnNlYwkJPSAxLAorCQkubWluCQk9IDIsCisJCS5ob3VyCQk9IDMsCisJCS5kYXkJCT0gNSwKKwkJLm1vbgkJPSA2LAorCQkueWVhcgkJPSA3LAorCQkuYWxhcm1fbW9uCT0gMHhhLAorCQkuYWxhcm1faG91cgk9IDB4YywKKwkJLnNxdwkJPSAweDEzLAorCX0sCisJeworCQkudHlwZQkJPSBNNDFUMDBfVFlQRV9NNDFUODUsCisJCS5uYW1lCQk9ICJtNDF0ODUiLAorCQkucmVhZF9saW1pdAk9IDEsCisJCS5zZWMJCT0gMSwKKwkJLm1pbgkJPSAyLAorCQkuaG91cgkJPSAzLAorCQkuZGF5CQk9IDUsCisJCS5tb24JCT0gNiwKKwkJLnllYXIJCT0gNywKKwkJLmFsYXJtX21vbgk9IDB4YSwKKwkJLmFsYXJtX2hvdXIJPSAweGMsCisJCS5zcXcJCT0gMHgxMywKKwl9LAorfTsKK3N0YXRpYyBzdHJ1Y3QgbTQxdDAwX2NoaXBfaW5mbyAqbTQxdDAwX2NoaXA7CisKIHVsb25nCiBtNDF0MDBfZ2V0X3J0Y190aW1lKHZvaWQpCiB7Ci0JczMyCXNlYywgbWluLCBob3VyLCBkYXksIG1vbiwgeWVhcjsKLQlzMzIJc2VjMSwgbWluMSwgaG91cjEsIGRheTEsIG1vbjEsIHllYXIxOwotCXVsb25nCWxpbWl0ID0gMTA7CisJczMyIHNlYywgbWluLCBob3VyLCBkYXksIG1vbiwgeWVhcjsKKwlzMzIgc2VjMSwgbWluMSwgaG91cjEsIGRheTEsIG1vbjEsIHllYXIxOworCXU4IHJlYWRzID0gMDsKKwl1OCBidWZbOF0sIG1zZ2J1ZlsxXSA9IHsgMCB9OyAvKiBvZmZzZXQgaW50byBydGMncyByZWdzICovCisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IG1zZ2J1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IDgsCisJCQkuYnVmCT0gYnVmLAorCQl9LAorCX07CiAKIAlzZWMgPSBtaW4gPSBob3VyID0gZGF5ID0gbW9uID0geWVhciA9IDA7Ci0Jc2VjMSA9IG1pbjEgPSBob3VyMSA9IGRheTEgPSBtb24xID0geWVhcjEgPSAwOwogCi0JbXV0ZXhfbG9jaygmbTQxdDAwX211dGV4KTsKIAlkbyB7Ci0JCWlmICgoKHNlYyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMCkpID49IDApCi0JCQkmJiAoKG1pbiA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMSkpCi0JCQkJPj0gMCkKLQkJCSYmICgoaG91ciA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMikpCi0JCQkJPj0gMCkKLQkJCSYmICgoZGF5ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA0KSkKLQkJCQk+PSAwKQotCQkJJiYgKChtb24gPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDUpKQotCQkJCT49IDApCi0JCQkmJiAoKHllYXIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDYpKQotCQkJCT49IDApCi0JCQkmJiAoKHNlYyA9PSBzZWMxKSAmJiAobWluID09IG1pbjEpICYmIChob3VyID09IGhvdXIxKQotCQkJCSYmIChkYXkgPT0gZGF5MSkgJiYgKG1vbiA9PSBtb24xKQotCQkJCSYmICh5ZWFyID09IHllYXIxKSkpCi0KLQkJCQlicmVhazsKKwkJaWYgKGkyY190cmFuc2ZlcihzYXZlX2NsaWVudC0+YWRhcHRlciwgbXNncywgMikgPCAwKQorCQkJZ290byByZWFkX2VycjsKIAogCQlzZWMxID0gc2VjOwogCQltaW4xID0gbWluOwpAQCAtODEsNjkgKzEzMCw4OCBAQAogCQlkYXkxID0gZGF5OwogCQltb24xID0gbW9uOwogCQl5ZWFyMSA9IHllYXI7Ci0JfSB3aGlsZSAoLS1saW1pdCA+IDApOwotCW11dGV4X3VubG9jaygmbTQxdDAwX211dGV4KTsKIAotCWlmIChsaW1pdCA9PSAwKSB7Ci0JCWRldl93YXJuKCZzYXZlX2NsaWVudC0+ZGV2LAotCQkJIm00MXQwMDogY2FuJ3QgcmVhZCBydGMgY2hpcFxuIik7Ci0JCXNlYyA9IG1pbiA9IGhvdXIgPSBkYXkgPSBtb24gPSB5ZWFyID0gMDsKLQl9CisJCXNlYyA9IGJ1ZlttNDF0MDBfY2hpcC0+c2VjXSAmIDB4N2Y7CisJCW1pbiA9IGJ1ZlttNDF0MDBfY2hpcC0+bWluXSAmIDB4N2Y7CisJCWhvdXIgPSBidWZbbTQxdDAwX2NoaXAtPmhvdXJdICYgMHgzZjsKKwkJZGF5ID0gYnVmW200MXQwMF9jaGlwLT5kYXldICYgMHgzZjsKKwkJbW9uID0gYnVmW200MXQwMF9jaGlwLT5tb25dICYgMHgxZjsKKwkJeWVhciA9IGJ1ZlttNDF0MDBfY2hpcC0+eWVhcl07CisJfSB3aGlsZSAoKCsrcmVhZHMgPCBtNDF0MDBfY2hpcC0+cmVhZF9saW1pdCkgJiYgKChzZWMgIT0gc2VjMSkKKwkJCXx8IChtaW4gIT0gbWluMSkgfHwgKGhvdXIgIT0gaG91cjEpIHx8IChkYXkgIT0gZGF5MSkKKwkJCXx8IChtb24gIT0gbW9uMSkgfHwgKHllYXIgIT0geWVhcjEpKSk7CiAKLQlzZWMgJj0gMHg3ZjsKLQltaW4gJj0gMHg3ZjsKLQlob3VyICY9IDB4M2Y7Ci0JZGF5ICY9IDB4M2Y7Ci0JbW9uICY9IDB4MWY7Ci0JeWVhciAmPSAweGZmOworCWlmICgobTQxdDAwX2NoaXAtPnJlYWRfbGltaXQgPiAxKSAmJiAoKHNlYyAhPSBzZWMxKSB8fCAobWluICE9IG1pbjEpCisJCQl8fCAoaG91ciAhPSBob3VyMSkgfHwgKGRheSAhPSBkYXkxKSB8fCAobW9uICE9IG1vbjEpCisJCQl8fCAoeWVhciAhPSB5ZWFyMSkpKQorCQlnb3RvIHJlYWRfZXJyOwogCi0JQkNEX1RPX0JJTihzZWMpOwotCUJDRF9UT19CSU4obWluKTsKLQlCQ0RfVE9fQklOKGhvdXIpOwotCUJDRF9UT19CSU4oZGF5KTsKLQlCQ0RfVE9fQklOKG1vbik7Ci0JQkNEX1RPX0JJTih5ZWFyKTsKKwlzZWMgPSBCQ0QyQklOKHNlYyk7CisJbWluID0gQkNEMkJJTihtaW4pOworCWhvdXIgPSBCQ0QyQklOKGhvdXIpOworCWRheSA9IEJDRDJCSU4oZGF5KTsKKwltb24gPSBCQ0QyQklOKG1vbik7CisJeWVhciA9IEJDRDJCSU4oeWVhcik7CiAKIAl5ZWFyICs9IDE5MDA7CiAJaWYgKHllYXIgPCAxOTcwKQogCQl5ZWFyICs9IDEwMDsKIAogCXJldHVybiBta3RpbWUoeWVhciwgbW9uLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKKworcmVhZF9lcnI6CisJZGV2X2Vycigmc2F2ZV9jbGllbnQtPmRldiwgIm00MXQwMF9nZXRfcnRjX3RpbWU6IFJlYWQgZXJyb3JcbiIpOworCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobTQxdDAwX2dldF9ydGNfdGltZSk7CiAKIHN0YXRpYyB2b2lkCiBtNDF0MDBfc2V0KHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgcnRjX3RpbWUJdG07Ci0JdWxvbmcJbm93dGltZSA9ICoodWxvbmcgKilhcmc7CisJaW50IG5vd3RpbWUgPSAqKGludCAqKWFyZzsKKwlzMzIgc2VjLCBtaW4sIGhvdXIsIGRheSwgbW9uLCB5ZWFyOworCXU4IHdidWZbOV0sICpidWYgPSAmd2J1ZlsxXSwgbXNnYnVmWzFdID0geyAwIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1tdID0geworCQl7CisJCQkuYWRkcgk9IHNhdmVfY2xpZW50LT5hZGRyLAorCQkJLmZsYWdzCT0gMCwKKwkJCS5sZW4JPSAxLAorCQkJLmJ1Zgk9IG1zZ2J1ZiwKKwkJfSwKKwkJeworCQkJLmFkZHIJPSBzYXZlX2NsaWVudC0+YWRkciwKKwkJCS5mbGFncwk9IEkyQ19NX1JELAorCQkJLmxlbgk9IDgsCisJCQkuYnVmCT0gYnVmLAorCQl9LAorCX07CiAKIAl0b190bShub3d0aW1lLCAmdG0pOwogCXRtLnRtX3llYXIgPSAodG0udG1feWVhciAtIDE5MDApICUgMTAwOwogCi0JQklOX1RPX0JDRCh0bS50bV9zZWMpOwotCUJJTl9UT19CQ0QodG0udG1fbWluKTsKLQlCSU5fVE9fQkNEKHRtLnRtX2hvdXIpOwotCUJJTl9UT19CQ0QodG0udG1fbW9uKTsKLQlCSU5fVE9fQkNEKHRtLnRtX21kYXkpOwotCUJJTl9UT19CQ0QodG0udG1feWVhcik7CisJc2VjID0gQklOMkJDRCh0bS50bV9zZWMpOworCW1pbiA9IEJJTjJCQ0QodG0udG1fbWluKTsKKwlob3VyID0gQklOMkJDRCh0bS50bV9ob3VyKTsKKwlkYXkgPSBCSU4yQkNEKHRtLnRtX21kYXkpOworCW1vbiA9IEJJTjJCQ0QodG0udG1fbW9uKTsKKwl5ZWFyID0gQklOMkJDRCh0bS50bV95ZWFyKTsKIAotCW11dGV4X2xvY2soJm00MXQwMF9tdXRleCk7Ci0JaWYgKChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCAwLCB0bS50bV9zZWMgJiAweDdmKSA8IDApCi0JCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCAxLCB0bS50bV9taW4gJiAweDdmKQotCQkJPCAwKQotCQl8fCAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShzYXZlX2NsaWVudCwgMiwgdG0udG1faG91ciAmIDB4M2YpCi0JCQk8IDApCi0JCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA0LCB0bS50bV9tZGF5ICYgMHgzZikKLQkJCTwgMCkKLQkJfHwgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoc2F2ZV9jbGllbnQsIDUsIHRtLnRtX21vbiAmIDB4MWYpCi0JCQk8IDApCi0JCXx8IChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNhdmVfY2xpZW50LCA2LCB0bS50bV95ZWFyICYgMHhmZikKLQkJCTwgMCkpCisJLyogUmVhZCByZWcgdmFsdWVzIGludG8gYnVmWzAuLjddL3didWZbMS4uOF0gKi8KKwlpZiAoaTJjX3RyYW5zZmVyKHNhdmVfY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA8IDApIHsKKwkJZGV2X2Vycigmc2F2ZV9jbGllbnQtPmRldiwgIm00MXQwMF9zZXQ6IFJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm47CisJfQogCi0JCWRldl93YXJuKCZzYXZlX2NsaWVudC0+ZGV2LCJtNDF0MDA6IGNhbid0IHdyaXRlIHRvIHJ0YyBjaGlwXG4iKTsKKwl3YnVmWzBdID0gMDsgLyogb2Zmc2V0IGludG8gcnRjJ3MgcmVncyAqLworCWJ1ZlttNDF0MDBfY2hpcC0+c2VjXSA9IChidWZbbTQxdDAwX2NoaXAtPnNlY10gJiB+MHg3ZikgfCAoc2VjICYgMHg3Zik7CisJYnVmW200MXQwMF9jaGlwLT5taW5dID0gKGJ1ZlttNDF0MDBfY2hpcC0+bWluXSAmIH4weDdmKSB8IChtaW4gJiAweDdmKTsKKwlidWZbbTQxdDAwX2NoaXAtPmhvdXJdID0gKGJ1ZlttNDF0MDBfY2hpcC0+aG91cl0gJiB+MHgzZikgfCAoaG91ciYgMHgzZik7CisJYnVmW200MXQwMF9jaGlwLT5kYXldID0gKGJ1ZlttNDF0MDBfY2hpcC0+ZGF5XSAmIH4weDNmKSB8IChkYXkgJiAweDNmKTsKKwlidWZbbTQxdDAwX2NoaXAtPm1vbl0gPSAoYnVmW200MXQwMF9jaGlwLT5tb25dICYgfjB4MWYpIHwgKG1vbiAmIDB4MWYpOwogCi0JbXV0ZXhfdW5sb2NrKCZtNDF0MDBfbXV0ZXgpOwotCXJldHVybjsKKwlpZiAoaTJjX21hc3Rlcl9zZW5kKHNhdmVfY2xpZW50LCB3YnVmLCA5KSA8IDApCisJCWRldl9lcnIoJnNhdmVfY2xpZW50LT5kZXYsICJtNDF0MDBfc2V0OiBXcml0ZSBlcnJvclxuIik7CiB9CiAKIHN0YXRpYyB1bG9uZyBuZXdfdGltZTsKQEAgLTE2Miw2ICsyMzAsNDggQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwobTQxdDAwX3NldF9ydGNfdGltZSk7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglwbGF0Zm9ybV9kYXRhIERyaXZlciBJbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworc3RhdGljIGludCBfX2luaXQKK200MXQwMF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtNDF0MDBfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IGk7CisKKwlpZiAocGRldiAmJiAocGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkpIHsKKwkJbm9ybWFsX2FkZHJbMF0gPSBwZGF0YS0+aTJjX2FkZHI7CisKKwkJZm9yIChpPTA7IGk8QVJSQVlfU0laRShtNDF0MDBfY2hpcF9pbmZvX3RibCk7IGkrKykKKwkJCWlmIChtNDF0MDBfY2hpcF9pbmZvX3RibFtpXS50eXBlID09IHBkYXRhLT50eXBlKSB7CisJCQkJbTQxdDAwX2NoaXAgPSAmbTQxdDAwX2NoaXBfaW5mb190YmxbaV07CisJCQkJbTQxdDAwX2NoaXAtPnNxd19mcmVxID0gcGRhdGEtPnNxd19mcmVxOworCQkJCXJldHVybiAwOworCQkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2V4aXQKK200MXQwMF9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbTQxdDAwX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkucHJvYmUgID0gbTQxdDAwX3BsYXRmb3JtX3Byb2JlLAorCS5yZW1vdmUgPSBtNDF0MDBfcGxhdGZvcm1fcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSAgPSBNNDFUMDBfRFJWX05BTUUsCisJfSwKK307CiAKIC8qCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE3NiwyMyArMjg2LDcxIEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlpbnQgcmM7CiAKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXAsIEkyQ19GVU5DX0kyQworCQkJfCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gMDsKKwogCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMmNfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjbGllbnQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3RybmNweShjbGllbnQtPm5hbWUsIE00MVQwMF9EUlZfTkFNRSwgSTJDX05BTUVfU0laRSk7CisJc3RybGNweShjbGllbnQtPm5hbWUsIG00MXQwMF9jaGlwLT5uYW1lLCBJMkNfTkFNRV9TSVpFKTsKIAljbGllbnQtPmFkZHIgPSBhZGRyOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXA7CiAJY2xpZW50LT5kcml2ZXIgPSAmbTQxdDAwX2RyaXZlcjsKIAotCWlmICgocmMgPSBpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpKSAhPSAwKSB7Ci0JCWtmcmVlKGNsaWVudCk7Ci0JCXJldHVybiByYzsKKwlpZiAoKHJjID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCisJCWdvdG8gYXR0YWNoX2VycjsKKworCWlmIChtNDF0MDBfY2hpcC0+dHlwZSAhPSBNNDFUMDBfVFlQRV9NNDFUMDApIHsKKwkJLyogSWYgYXNrZWQsIGRpc2FibGUgU1FXLCBzZXQgU1FXIGZyZXF1ZW5jeSAmIHJlLWVuYWJsZSAqLworCQlpZiAobTQxdDAwX2NoaXAtPnNxd19mcmVxKQorCQkJaWYgKCgocmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQltNDF0MDBfY2hpcC0+YWxhcm1fbW9uKSkgPCAwKQorCQkJIHx8ICgocmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJbTQxdDAwX2NoaXAtPmFsYXJtX21vbiwgcmMgJiB+MHg0MCkpIDwwKQorCQkJIHx8ICgocmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJbTQxdDAwX2NoaXAtPnNxdywKKwkJCQkJbTQxdDAwX2NoaXAtPnNxd19mcmVxKSkgPCAwKQorCQkJIHx8ICgocmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJbTQxdDAwX2NoaXAtPmFsYXJtX21vbiwgcmMgfCAweDQwKSkgPDApKQorCQkJCWdvdG8gc3F3X2VycjsKKworCQkvKiBNYWtlIHN1cmUgSFQgKEhhbHQgVXBkYXRlKSBiaXQgaXMgY2xlYXJlZCAqLworCQlpZiAoKHJjID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQltNDF0MDBfY2hpcC0+YWxhcm1faG91cikpIDwgMCkKKwkJCWdvdG8gaHRfZXJyOworCisJCWlmIChyYyAmIDB4NDApCisJCQlpZiAoKHJjID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCW00MXQwMF9jaGlwLT5hbGFybV9ob3VyLCByYyAmIH4weDQwKSk8MCkKKwkJCQlnb3RvIGh0X2VycjsKIAl9CiAKLQltNDF0MDBfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgibTQxdDAwIik7CisJLyogTWFrZSBzdXJlIFNUIChzdG9wKSBiaXQgaXMgY2xlYXJlZCAqLworCWlmICgocmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBtNDF0MDBfY2hpcC0+c2VjKSkgPCAwKQorCQlnb3RvIHN0X2VycjsKKworCWlmIChyYyAmIDB4ODApCisJCWlmICgocmMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgbTQxdDAwX2NoaXAtPnNlYywKKwkJCQlyYyAmIH4weDgwKSkgPCAwKQorCQkJZ290byBzdF9lcnI7CisKKwltNDF0MDBfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShtNDF0MDBfY2hpcC0+bmFtZSk7CiAJc2F2ZV9jbGllbnQgPSBjbGllbnQ7CiAJcmV0dXJuIDA7CisKK3N0X2VycjoKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm00MXQwMF9wcm9iZTogQ2FuJ3QgY2xlYXIgU1QgYml0XG4iKTsKKwlnb3RvIGF0dGFjaF9lcnI7CitodF9lcnI6CisJZGV2X2VycigmY2xpZW50LT5kZXYsICJtNDF0MDBfcHJvYmU6IENhbid0IGNsZWFyIEhUIGJpdFxuIik7CisJZ290byBhdHRhY2hfZXJyOworc3F3X2VycjoKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIm00MXQwMF9wcm9iZTogQ2FuJ3Qgc2V0IFNRVyBGcmVxdWVuY3lcbiIpOworYXR0YWNoX2VycjoKKwlrZnJlZShjbGllbnQpOworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludApAQCAtMjA0LDcgKzM2Miw3IEBACiBzdGF0aWMgaW50CiBtNDF0MDBfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0JaW50CXJjOworCWludCByYzsKIAogCWlmICgocmMgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSA9PSAwKSB7CiAJCWtmcmVlKGNsaWVudCk7CkBAIC0yMjUsMTQgKzM4MywxOCBAQAogc3RhdGljIGludCBfX2luaXQKIG00MXQwMF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZtNDF0MDBfZHJpdmVyKTsKKwlpbnQgcmM7CisKKwlpZiAoIShyYyA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbTQxdDAwX3BsYXRmb3JtX2RyaXZlcikpKQorCQlyYyA9IGkyY19hZGRfZHJpdmVyKCZtNDF0MDBfZHJpdmVyKTsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdAogbTQxdDAwX2V4aXQodm9pZCkKIHsKIAlpMmNfZGVsX2RyaXZlcigmbTQxdDAwX2RyaXZlcik7Ci0JcmV0dXJuOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtNDF0MDBfcGxhdGZvcm1fZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQobTQxdDAwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKaW5kZXggNDVlMmNkZi4uYTQ1MTU1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvaTJjLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCkBAIC05MTYsNyArOTE2LDcgQEAKIH0KIAogczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IGNvbW1hbmQsCi0JCQkgICAgICAgdTggbGVuZ3RoLCB1OCAqdmFsdWVzKQorCQkJICAgICAgIHU4IGxlbmd0aCwgY29uc3QgdTggKnZhbHVlcykKIHsKIAl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOwogCkBAIC05NDQsNyArOTQ0LDcgQEAKIH0KIAogczMyIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBjb21tYW5kLAotCQkJCSAgIHU4IGxlbmd0aCwgdTggKnZhbHVlcykKKwkJCQkgICB1OCBsZW5ndGgsIGNvbnN0IHU4ICp2YWx1ZXMpCiB7CiAJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvaTJjLWRldi5jIGIvZHJpdmVycy9pMmMvaTJjLWRldi5jCmluZGV4IGVkN2VlZDMuLjU4Y2NkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1kZXYuYworKysgYi9kcml2ZXJzL2kyYy9pMmMtZGV2LmMKQEAgLTQyNiwxMCArNDI2LDcgQEAKIAogCS8qIHJlZ2lzdGVyIHRoaXMgaTJjIGRldmljZSB3aXRoIHRoZSBkcml2ZXIgY29yZSAqLwogCWkyY19kZXYtPmFkYXAgPSBhZGFwOwotCWlmIChhZGFwLT5kZXYucGFyZW50ID09ICZwbGF0Zm9ybV9idXMpCi0JCWRldiA9ICZhZGFwLT5kZXY7Ci0JZWxzZQotCQlkZXYgPSBhZGFwLT5kZXYucGFyZW50OworCWRldiA9ICZhZGFwLT5kZXY7CiAJaTJjX2Rldi0+Y2xhc3NfZGV2ID0gY2xhc3NfZGV2aWNlX2NyZWF0ZShpMmNfZGV2X2NsYXNzLCBOVUxMLAogCQkJCQkJIE1LREVWKEkyQ19NQUpPUiwgaTJjX2Rldi0+bWlub3IpLAogCQkJCQkJIGRldiwgImkyYy0lZCIsIGkyY19kZXYtPm1pbm9yKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1jZC5jIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKaW5kZXggYjRhNDFkNi4uOTlmYTQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWNkLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLWNkLmMKQEAgLTM5NSw3ICszOTUsOCBAQAogCQkJICogd2UgY2Fubm90IHJlbGlhYmx5IGNoZWNrIGlmIGRyaXZlIGNhbiBhdXRvLWNsb3NlCiAJCQkgKi8KIAkJCWlmIChycS0+Y21kWzBdID09IEdQQ01EX1NUQVJUX1NUT1BfVU5JVCAmJiBzZW5zZS0+YXNjID09IDB4MjQpCi0JCQkJbG9nID0gMDsKKwkJCQlicmVhazsKKwkJCWxvZyA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSBVTklUX0FUVEVOVElPTjoKIAkJCS8qCkBAIC00MTcsNiArNDE4LDExIEBACiAJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdCAqZmFpbGVkX2NvbW1hbmQsCiAJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zZW5zZSAqc2Vuc2UpCiB7CisJdW5zaWduZWQgbG9uZyBzZWN0b3I7CisJdW5zaWduZWQgbG9uZyBiaW9fc2VjdG9yczsKKwl1bnNpZ25lZCBsb25nIHZhbGlkOworCXN0cnVjdCBjZHJvbV9pbmZvICppbmZvID0gZHJpdmUtPmRyaXZlcl9kYXRhOworCiAJaWYgKCFjZHJvbV9sb2dfc2Vuc2UoZHJpdmUsIGZhaWxlZF9jb21tYW5kLCBzZW5zZSkpCiAJCXJldHVybjsKIApAQCAtNDI5LDYgKzQzNSwzNyBAQAogCQlpZiAoc2Vuc2UtPnNlbnNlX2tleSA9PSAweDA1ICYmIHNlbnNlLT5hc2MgPT0gMHgyNCkKIAkJCXJldHVybjsKIAorIAlpZiAoc2Vuc2UtPmVycm9yX2NvZGUgPT0gMHg3MCkgewkvKiBDdXJyZW50IEVycm9yICovCisgCQlzd2l0Y2goc2Vuc2UtPnNlbnNlX2tleSkgeworCQljYXNlIE1FRElVTV9FUlJPUjoKKwkJY2FzZSBWT0xVTUVfT1ZFUkZMT1c6CisJCWNhc2UgSUxMRUdBTF9SRVFVRVNUOgorCQkJaWYgKCFzZW5zZS0+dmFsaWQpCisJCQkJYnJlYWs7CisJCQlpZiAoZmFpbGVkX2NvbW1hbmQgPT0gTlVMTCB8fAorCQkJCQkhYmxrX2ZzX3JlcXVlc3QoZmFpbGVkX2NvbW1hbmQpKQorCQkJCWJyZWFrOworCQkJc2VjdG9yID0gKHNlbnNlLT5pbmZvcm1hdGlvblswXSA8PCAyNCkgfAorCQkJCSAoc2Vuc2UtPmluZm9ybWF0aW9uWzFdIDw8IDE2KSB8CisJCQkJIChzZW5zZS0+aW5mb3JtYXRpb25bMl0gPDwgIDgpIHwKKwkJCQkgKHNlbnNlLT5pbmZvcm1hdGlvblszXSk7CisKKwkJCWJpb19zZWN0b3JzID0gYmlvX3NlY3RvcnMoZmFpbGVkX2NvbW1hbmQtPmJpbyk7CisJCQlpZiAoYmlvX3NlY3RvcnMgPCA0KQorCQkJCWJpb19zZWN0b3JzID0gNDsKKwkJCWlmIChkcml2ZS0+cXVldWUtPmhhcmRzZWN0X3NpemUgPT0gMjA0OCkKKwkJCQlzZWN0b3IgPDw9IDI7CS8qIERldmljZSBzZWN0b3Igc2l6ZSBpcyAySyAqLworCQkJc2VjdG9yICY9IH4oYmlvX3NlY3RvcnMgLTEpOworCQkJdmFsaWQgPSAoc2VjdG9yIC0gZmFpbGVkX2NvbW1hbmQtPnNlY3RvcikgPDwgOTsKKworCQkJaWYgKHZhbGlkIDwgMCkKKwkJCQl2YWxpZCA9IDA7CisJCQlpZiAoc2VjdG9yIDwgZ2V0X2NhcGFjaXR5KGluZm8tPmRpc2spICYmCisJCQkJZHJpdmUtPnByb2JlZF9jYXBhY2l0eSAtIHNlY3RvciA8IDQgKiA3NSkgeworCQkJCXNldF9jYXBhY2l0eShpbmZvLT5kaXNrLCBzZWN0b3IpOworCQkJfQorIAkJfQorIAl9CiAjaWYgVkVSQk9TRV9JREVfQ0RfRVJST1JTCiAJewogCQlpbnQgaTsKQEAgLTYwOSwxNyArNjQ2LDIzIEBACiAJCQkJc2Vuc2UgPSBmYWlsZWQtPnNlbnNlOwogCQkJCWZhaWxlZC0+c2Vuc2VfbGVuID0gcnEtPnNlbnNlX2xlbjsKIAkJCX0KLQorCQkJY2Ryb21fYW5hbHl6ZV9zZW5zZV9kYXRhKGRyaXZlLCBmYWlsZWQsIHNlbnNlKTsKIAkJCS8qCiAJCQkgKiBub3cgZW5kIGZhaWxlZCByZXF1ZXN0CiAJCQkgKi8KLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhmYWlsZWQsIDAsIGZhaWxlZC0+ZGF0YV9sZW4pOwotCQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGZhaWxlZCwgMCk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZGVfbG9jaywgZmxhZ3MpOwotCQl9Ci0KLQkJY2Ryb21fYW5hbHl6ZV9zZW5zZV9kYXRhKGRyaXZlLCBmYWlsZWQsIHNlbnNlKTsKKwkJCWlmIChibGtfZnNfcmVxdWVzdChmYWlsZWQpKSB7CisJCQkJaWYgKGlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdChkcml2ZSwgZmFpbGVkLCAwLAorCQkJCQkJZmFpbGVkLT5oYXJkX25yX3NlY3RvcnMpKQorCQkJCQlCVUcoKTsKKwkJCX0gZWxzZSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisJCQkJZW5kX3RoYXRfcmVxdWVzdF9jaHVuayhmYWlsZWQsIDAsCisJCQkJCQkJZmFpbGVkLT5kYXRhX2xlbik7CisJCQkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KGZhaWxlZCwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfSBlbHNlCisJCQljZHJvbV9hbmFseXplX3NlbnNlX2RhdGEoZHJpdmUsIE5VTEwsIHNlbnNlKTsKIAl9CiAKIAlpZiAoIXJxLT5jdXJyZW50X25yX3NlY3RvcnMgJiYgYmxrX2ZzX3JlcXVlc3QocnEpKQpAQCAtNjMzLDYgKzY3NiwxMyBAQAogCWlkZV9lbmRfcmVxdWVzdChkcml2ZSwgdXB0b2RhdGUsIG5zZWN0b3JzKTsKIH0KIAorc3RhdGljIHZvaWQgaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlKGlkZV9kcml2ZV90ICpkcml2ZSwgY29uc3QgY2hhciAqbXNnLCB1OCBzdGF0KQoreworCWlmIChzdGF0ICYgMHg4MCkKKwkJcmV0dXJuOworCWlkZV9kdW1wX3N0YXR1cyhkcml2ZSwgbXNnLCBzdGF0KTsKK30KKwogLyogUmV0dXJucyAwIGlmIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBjb250aW51ZWQuCiAgICBSZXR1cm5zIDEgaWYgdGhlIHJlcXVlc3Qgd2FzIGVuZGVkLiAqLwogc3RhdGljIGludCBjZHJvbV9kZWNvZGVfc3RhdHVzKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IGdvb2Rfc3RhdCwgaW50ICpzdGF0X3JldCkKQEAgLTc2MSwxNiArODExLDE2IEBACiAJCQkgICBzZW5zZV9rZXkgPT0gREFUQV9QUk9URUNUKSB7CiAJCQkvKiBObyBwb2ludCBpbiByZXRyeWluZyBhZnRlciBhbiBpbGxlZ2FsCiAJCQkgICByZXF1ZXN0IG9yIGRhdGEgcHJvdGVjdCBlcnJvci4qLwotCQkJaWRlX2R1bXBfc3RhdHVzIChkcml2ZSwgImNvbW1hbmQgZXJyb3IiLCBzdGF0KTsKKwkJCWlkZV9kdW1wX3N0YXR1c19ub19zZW5zZSAoZHJpdmUsICJjb21tYW5kIGVycm9yIiwgc3RhdCk7CiAJCQlkb19lbmRfcmVxdWVzdCA9IDE7CiAJCX0gZWxzZSBpZiAoc2Vuc2Vfa2V5ID09IE1FRElVTV9FUlJPUikgewogCQkJLyogTm8gcG9pbnQgaW4gcmUtdHJ5aW5nIGEgemlsbGlvbiB0aW1lcyBvbiBhIGJhZCAKIAkJCSAqIHNlY3Rvci4uLiAgSWYgd2UgZ290IGhlcmUgdGhlIGVycm9yIGlzIG5vdCBjb3JyZWN0YWJsZSAqLwotCQkJaWRlX2R1bXBfc3RhdHVzIChkcml2ZSwgIm1lZGlhIGVycm9yIChiYWQgc2VjdG9yKSIsIHN0YXQpOworCQkJaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlIChkcml2ZSwgIm1lZGlhIGVycm9yIChiYWQgc2VjdG9yKSIsIHN0YXQpOwogCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwogCQl9IGVsc2UgaWYgKHNlbnNlX2tleSA9PSBCTEFOS19DSEVDSykgewogCQkJLyogRGlzayBhcHBlYXJzIGJsYW5rID8/ICovCi0JCQlpZGVfZHVtcF9zdGF0dXMgKGRyaXZlLCAibWVkaWEgZXJyb3IgKGJsYW5rKSIsIHN0YXQpOworCQkJaWRlX2R1bXBfc3RhdHVzX25vX3NlbnNlIChkcml2ZSwgIm1lZGlhIGVycm9yIChibGFuaykiLCBzdGF0KTsKIAkJCWRvX2VuZF9yZXF1ZXN0ID0gMTsKIAkJfSBlbHNlIGlmICgoZXJyICYgfkFCUlRfRVJSKSAhPSAwKSB7CiAJCQkvKiBHbyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCkBAIC03ODIsMTMgKzgzMiwyNyBAQAogCQkJZG9fZW5kX3JlcXVlc3QgPSAxOwogCQl9CiAKLQkJaWYgKGRvX2VuZF9yZXF1ZXN0KQotCQkJY2Ryb21fZW5kX3JlcXVlc3QoZHJpdmUsIDApOworCQkvKiBFbmQgYSByZXF1ZXN0IHRocm91Z2ggcmVxdWVzdCBzZW5zZSBhbmFseXNpcyB3aGVuIHdlIGhhdmUKKwkJICAgc2Vuc2UgZGF0YS4gV2UgbmVlZCB0aGlzIGluIG9yZGVyIHRvIHBlcmZvcm0gZW5kIG9mIG1lZGlhCisJCSAgIHByb2Nlc3NpbmcgKi8KIAotCQkvKiBJZiB3ZSBnb3QgYSBDSEVDS19DT05ESVRJT04gc3RhdHVzLAotCQkgICBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZC4gKi8KLQkJaWYgKChzdGF0ICYgRVJSX1NUQVQpICE9IDApCi0JCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBOVUxMLCBOVUxMKTsKKwkJaWYgKGRvX2VuZF9yZXF1ZXN0KSB7CisJCQlpZiAoc3RhdCAmIEVSUl9TVEFUKSB7CisJCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKKwkJCQlibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKKwkJCQlIV0dST1VQKGRyaXZlKS0+cnEgPSBOVUxMOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwkJCQljZHJvbV9xdWV1ZV9yZXF1ZXN0X3NlbnNlKGRyaXZlLCBycS0+c2Vuc2UsIHJxKTsKKwkJCX0gZWxzZQorCQkJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKKwkJfSBlbHNlIHsKKwkJCS8qIElmIHdlIGdvdCBhIENIRUNLX0NPTkRJVElPTiBzdGF0dXMsCisJCQkgICBxdWV1ZSBhIHJlcXVlc3Qgc2Vuc2UgY29tbWFuZC4gKi8KKwkJCWlmIChzdGF0ICYgRVJSX1NUQVQpCisJCQkJY2Ryb21fcXVldWVfcmVxdWVzdF9zZW5zZShkcml2ZSwgTlVMTCwgTlVMTCk7CisJCX0KIAl9IGVsc2UgewogCQlibGtfZHVtcF9ycV9mbGFncyhycSwgImlkZS1jZDogYmFkIHJxIik7CiAJCWNkcm9tX2VuZF9yZXF1ZXN0KGRyaXZlLCAwKTsKQEAgLTE0NTEsOSArMTUxNSwxMiBAQAogCX0gZWxzZSB7CiBjb25mdXNlZDoKIAkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IGNkcm9tX3BjX2ludHI6IFRoZSBkcml2ZSAiCi0JCQkiYXBwZWFycyBjb25mdXNlZCAoaXJlYXNvbiA9IDB4JTAyeClcbiIsCisJCQkiYXBwZWFycyBjb25mdXNlZCAoaXJlYXNvbiA9IDB4JTAyeCkuICIKKwkJCSJUcnlpbmcgdG8gcmVjb3ZlciBieSBlbmRpbmcgcmVxdWVzdC5cbiIsCiAJCQlkcml2ZS0+bmFtZSwgaXJlYXNvbik7CiAJCXJxLT5mbGFncyB8PSBSRVFfRkFJTEVEOworCQljZHJvbV9lbmRfcmVxdWVzdChkcml2ZSwgMCk7CisJCXJldHVybiBpZGVfc3RvcHBlZDsKIAl9CiAKIAkvKiBOb3cgd2Ugd2FpdCBmb3IgYW5vdGhlciBpbnRlcnJ1cHQuICovCkBAIC0xNDg4LDggKzE1NTUsNyBAQAogfQogCiAKLXN0YXRpYwotaW50IGNkcm9tX3F1ZXVlX3BhY2tldF9jb21tYW5kKGlkZV9kcml2ZV90ICpkcml2ZSwgc3RydWN0IHJlcXVlc3QgKnJxKQorc3RhdGljIGludCBjZHJvbV9xdWV1ZV9wYWNrZXRfY29tbWFuZChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgcmVxdWVzdF9zZW5zZSBzZW5zZTsKIAlpbnQgcmV0cmllcyA9IDEwOwpAQCAtMTcyMiw4ICsxNzg4LDcgQEAKIAkJfQogCX0KIAotCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQotCQlCVUcoKTsKKwlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CiAKIAlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsIGNkcm9tX25ld3BjX2ludHIsIHJxLT50aW1lb3V0LCBOVUxMKTsKIAlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CkBAIC0yMjE4LDYgKzIyODMsOSBAQAogCQl0b2MtPmNhcGFjaXR5ID0gMHgxZmZmZmY7CiAKIAlzZXRfY2FwYWNpdHkoaW5mby0+ZGlzaywgdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lKTsKKwkvKiBTYXZlIGEgcHJpdmF0ZSBjb3B5IG9mIHRlIFRPQyBjYXBhY2l0eSBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKwlkcml2ZS0+cHJvYmVkX2NhcGFjaXR5ID0gdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lOworCiAJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZHJpdmUtPnF1ZXVlLAogCQkJCXNlY3RvcnNfcGVyX2ZyYW1lIDw8IFNFQ1RPUl9CSVRTKTsKIApAQCAtMjM0MCw2ICsyNDA4LDcgQEAKIAlpZiAoIXN0YXQgJiYgKGxhc3Rfd3JpdHRlbiA+IHRvYy0+Y2FwYWNpdHkpKSB7CiAJCXRvYy0+Y2FwYWNpdHkgPSBsYXN0X3dyaXR0ZW47CiAJCXNldF9jYXBhY2l0eShpbmZvLT5kaXNrLCB0b2MtPmNhcGFjaXR5ICogc2VjdG9yc19wZXJfZnJhbWUpOworCQlkcml2ZS0+cHJvYmVkX2NhcGFjaXR5ID0gdG9jLT5jYXBhY2l0eSAqIHNlY3RvcnNfcGVyX2ZyYW1lOwogCX0KIAogCS8qIFJlbWVtYmVyIHRoYXQgd2UndmUgcmVhZCB0aGlzIHN0dWZmLiAqLwpAQCAtMjY5NiwxNCArMjc2NSwxMSBAQAogCSAqIGFueSBvdGhlciB3YXkgdG8gZGV0ZWN0IHRoaXMuLi4KIAkgKi8KIAlpZiAoc2Vuc2Uuc2Vuc2Vfa2V5ID09IE5PVF9SRUFEWSkgewotCQlpZiAoc2Vuc2UuYXNjID09IDB4M2EpIHsKLQkJCWlmIChzZW5zZS5hc2NxID09IDEpCi0JCQkJcmV0dXJuIENEU19OT19ESVNDOwotCQkJZWxzZSBpZiAoc2Vuc2UuYXNjcSA9PSAwIHx8IHNlbnNlLmFzY3EgPT0gMikKLQkJCQlyZXR1cm4gQ0RTX1RSQVlfT1BFTjsKLQkJfQorCQlpZiAoc2Vuc2UuYXNjID09IDB4M2EgJiYgc2Vuc2UuYXNjcSA9PSAxKQorCQkJcmV0dXJuIENEU19OT19ESVNDOworCQllbHNlCisJCQlyZXR1cm4gQ0RTX1RSQVlfT1BFTjsKIAl9Ci0KIAlyZXR1cm4gQ0RTX0RSSVZFX05PVF9SRUFEWTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWRtYS5jIGIvZHJpdmVycy9pZGUvaWRlLWRtYS5jCmluZGV4IGM0ODFiZTguLjc4M2EyNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1kbWEuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtZG1hLmMKQEAgLTIwNiw4ICsyMDYsNyBAQAogCWlkZV9od2lmX3QgKmh3aWYgPSBIV0lGKGRyaXZlKTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gaHdpZi0+c2dfdGFibGU7CiAKLQlpZiAoKHJxLT5mbGFncyAmIFJFUV9EUklWRV9UQVNLRklMRSkgJiYgcnEtPm5yX3NlY3RvcnMgPiAyNTYpCi0JCUJVRygpOworCUJVR19PTigocnEtPmZsYWdzICYgUkVRX0RSSVZFX1RBU0tGSUxFKSAmJiBycS0+bnJfc2VjdG9ycyA+IDI1Nik7CiAKIAlpZGVfbWFwX3NnKGRyaXZlLCBycSk7CiAKQEAgLTk0Nyw4ICs5NDYsNyBAQAogCX0KIAlwcmludGsoIlxuIik7CiAKLQlpZiAoIShod2lmLT5kbWFfbWFzdGVyKSkKLQkJQlVHKCk7CisJQlVHX09OKCFod2lmLT5kbWFfbWFzdGVyKTsKIH0KIAogRVhQT1JUX1NZTUJPTF9HUEwoaWRlX3NldHVwX2RtYSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMgYi9kcml2ZXJzL2lkZS9pZGUtZmxvcHB5LmMKaW5kZXggYTUzZTNjZS4uNDY1NjU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWZsb3BweS5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1mbG9wcHkuYwpAQCAtODk4LDggKzg5OCw3IEBACiAJCQkJCSJ0byBzZW5kIHVzIG1vcmUgZGF0YSB0aGFuIGV4cGVjdGVkICIKIAkJCQkJIi0gZGlzY2FyZGluZyBkYXRhXG4iKTsKIAkJCQlpZGVmbG9wcHlfZGlzY2FyZF9kYXRhKGRyaXZlLGJjb3VudC5hbGwpOwotCQkJCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQotCQkJCQlCVUcoKTsKKwkJCQlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CiAJCQkJaWRlX3NldF9oYW5kbGVyKGRyaXZlLAogCQkJCQkJJmlkZWZsb3BweV9wY19pbnRyLAogCQkJCQkJSURFRkxPUFBZX1dBSVRfQ01ELApAQCAtOTMyLDggKzkzMSw3IEBACiAJcGMtPmFjdHVhbGx5X3RyYW5zZmVycmVkICs9IGJjb3VudC5hbGw7CiAJcGMtPmN1cnJlbnRfcG9zaXRpb24gKz0gYmNvdW50LmFsbDsKIAotCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQotCQlCVUcoKTsKKwlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CiAJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRlZmxvcHB5X3BjX2ludHIsIElERUZMT1BQWV9XQUlUX0NNRCwgTlVMTCk7CQkvKiBBbmQgc2V0IHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBhZ2FpbiAqLwogCXJldHVybiBpZGVfc3RhcnRlZDsKIH0KQEAgLTk2MCw4ICs5NTgsNyBAQAogCQkJCSJpc3N1aW5nIGEgcGFja2V0IGNvbW1hbmRcbiIpOwogCQlyZXR1cm4gaWRlX2RvX3Jlc2V0KGRyaXZlKTsKIAl9Ci0JaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCi0JCUJVRygpOworCUJVR19PTihIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKTsKIAkvKiBTZXQgdGhlIGludGVycnVwdCByb3V0aW5lICovCiAJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRlZmxvcHB5X3BjX2ludHIsIElERUZMT1BQWV9XQUlUX0NNRCwgTlVMTCk7CiAJLyogU2VuZCB0aGUgYWN0dWFsIHBhY2tldCAqLwpAQCAtMTAxNyw4ICsxMDE0LDcgQEAKIAkgKiA0MCBhbmQgNTBtc2VjIHdvcmsgd2VsbC4gaWRlZmxvcHB5X3BjX2ludHIgd2lsbCBub3QgYmUgYWN0dWFsbHkKIAkgKiB1c2VkIHVudGlsIGFmdGVyIHRoZSBwYWNrZXQgaXMgbW92ZWQgaW4gYWJvdXQgNTAgbXNlYy4KIAkgKi8KLQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpOwogCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgCiAJICAmaWRlZmxvcHB5X3BjX2ludHIsIAkJLyogc2VydmljZSByb3V0aW5lIGZvciBwYWNrZXQgY29tbWFuZCAqLwogCSAgZmxvcHB5LT50aWNrcywJCS8qIHdhaXQgdGhpcyBsb25nIGJlZm9yZSAiZmFpbGluZyIgKi8KQEAgLTEyODgsNyArMTI4NCw3IEBACiAKIAlkZWJ1Z19sb2coS0VSTl9JTkZPICJycV9zdGF0dXM6ICVkLCBkZXY6ICVzLCBmbGFnczogJWx4LCBlcnJvcnM6ICVkXG4iLAogCQkJcnEtPnJxX3N0YXR1cywKLQkJCXJxLT5ycV9kaXNrID8gcnEtPnJxX2Rpc2stPmRpc2tfbmFtZSA/ICI/IiwKKwkJCXJxLT5ycV9kaXNrID8gcnEtPnJxX2Rpc2stPmRpc2tfbmFtZSA6ICI/IiwKIAkJCXJxLT5mbGFncywgcnEtPmVycm9ycyk7CiAJZGVidWdfbG9nKEtFUk5fSU5GTyAic2VjdG9yOiAlbGQsIG5yX3NlY3RvcnM6ICVsZCwgIgogCQkJImN1cnJlbnRfbnJfc2VjdG9yczogJWRcbiIsIChsb25nKXJxLT5zZWN0b3IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtaW8uYyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCmluZGV4IGMwMTYxNWQuLjYyMmE1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1pby5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1pby5jCkBAIC0xNDIsMzggKzE0Miw0MSBAQAogCiBzdGF0aWMgdm9pZCBpZGVfY29tcGxldGVfcG93ZXJfc3RlcChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwgdTggc3RhdCwgdTggZXJyb3IpCiB7CisJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPmVuZF9pb19kYXRhOworCiAJaWYgKGRyaXZlLT5tZWRpYSAhPSBpZGVfZGlzaykKIAkJcmV0dXJuOwogCi0Jc3dpdGNoIChycS0+cG0tPnBtX3N0ZXApIHsKKwlzd2l0Y2ggKHBtLT5wbV9zdGVwKSB7CiAJY2FzZSBpZGVfcG1fZmx1c2hfY2FjaGU6CS8qIFN1c3BlbmQgc3RlcCAxIChmbHVzaCBjYWNoZSkgY29tcGxldGUgKi8KLQkJaWYgKHJxLT5wbS0+cG1fc3RhdGUgPT0gUE1fRVZFTlRfRlJFRVpFKQotCQkJcnEtPnBtLT5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZDsKKwkJaWYgKHBtLT5wbV9zdGF0ZSA9PSBQTV9FVkVOVF9GUkVFWkUpCisJCQlwbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CiAJCWVsc2UKLQkJCXJxLT5wbS0+cG1fc3RlcCA9IGlkZWRpc2tfcG1fc3RhbmRieTsKKwkJCXBtLT5wbV9zdGVwID0gaWRlZGlza19wbV9zdGFuZGJ5OwogCQlicmVhazsKIAljYXNlIGlkZWRpc2tfcG1fc3RhbmRieToJLyogU3VzcGVuZCBzdGVwIDIgKHN0YW5kYnkpIGNvbXBsZXRlICovCi0JCXJxLT5wbS0+cG1fc3RlcCA9IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQ7CisJCXBtLT5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZDsKIAkJYnJlYWs7CiAJY2FzZSBpZGVkaXNrX3BtX2lkbGU6CQkvKiBSZXN1bWUgc3RlcCAxIChpZGxlKSBjb21wbGV0ZSAqLwotCQlycS0+cG0tPnBtX3N0ZXAgPSBpZGVfcG1fcmVzdG9yZV9kbWE7CisJCXBtLT5wbV9zdGVwID0gaWRlX3BtX3Jlc3RvcmVfZG1hOwogCQlicmVhazsKIAl9CiB9CiAKIHN0YXRpYyBpZGVfc3RhcnRzdG9wX3QgaWRlX3N0YXJ0X3Bvd2VyX3N0ZXAoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpCiB7CisJc3RydWN0IHJlcXVlc3RfcG1fc3RhdGUgKnBtID0gcnEtPmVuZF9pb19kYXRhOwogCWlkZV90YXNrX3QgKmFyZ3MgPSBycS0+c3BlY2lhbDsKIAogCW1lbXNldChhcmdzLCAwLCBzaXplb2YoKmFyZ3MpKTsKIAogCWlmIChkcml2ZS0+bWVkaWEgIT0gaWRlX2Rpc2spIHsKIAkJLyogc2tpcCBpZGVkaXNrX3BtX2lkbGUgZm9yIEFUQVBJIGRldmljZXMgKi8KLQkJaWYgKHJxLT5wbS0+cG1fc3RlcCA9PSBpZGVkaXNrX3BtX2lkbGUpCi0JCQlycS0+cG0tPnBtX3N0ZXAgPSBpZGVfcG1fcmVzdG9yZV9kbWE7CisJCWlmIChwbS0+cG1fc3RlcCA9PSBpZGVkaXNrX3BtX2lkbGUpCisJCQlwbS0+cG1fc3RlcCA9IGlkZV9wbV9yZXN0b3JlX2RtYTsKIAl9CiAKLQlzd2l0Y2ggKHJxLT5wbS0+cG1fc3RlcCkgeworCXN3aXRjaCAocG0tPnBtX3N0ZXApIHsKIAljYXNlIGlkZV9wbV9mbHVzaF9jYWNoZToJLyogU3VzcGVuZCBzdGVwIDEgKGZsdXNoIGNhY2hlKSAqLwogCQlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrKQogCQkJYnJlYWs7CkBAIC0yMTUsMTEgKzIxOCw2OCBAQAogCQlkcml2ZS0+aHdpZi0+aWRlX2RtYV9jaGVjayhkcml2ZSk7CiAJCWJyZWFrOwogCX0KLQlycS0+cG0tPnBtX3N0ZXAgPSBpZGVfcG1fc3RhdGVfY29tcGxldGVkOworCXBtLT5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZDsKIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CiAKIC8qKgorICoJaWRlX2VuZF9kZXF1ZXVlZF9yZXF1ZXN0CS0JY29tcGxldGUgYW4gSURFIEkvTworICoJQGRyaXZlOiBJREUgZGV2aWNlIGZvciB0aGUgSS9PCisgKglAdXB0b2RhdGU6CisgKglAbnJfc2VjdG9yczogbnVtYmVyIG9mIHNlY3RvcnMgY29tcGxldGVkCisgKgorICoJQ29tcGxldGUgYW4gSS9PIHRoYXQgaXMgbm8gbG9uZ2VyIG9uIHRoZSByZXF1ZXN0IHF1ZXVlLiBUaGlzCisgKgl0eXBpY2FsbHkgb2NjdXJzIHdoZW4gd2UgcHVsbCB0aGUgcmVxdWVzdCBhbmQgaXNzdWUgYSBSRVFVRVNUX1NFTlNFLgorICoJV2UgbXVzdCBzdGlsbCBmaW5pc2ggdGhlIG9sZCByZXF1ZXN0IGJ1dCB3ZSBtdXN0IG5vdCB0YW1wZXIgd2l0aCB0aGUKKyAqCXF1ZXVlIGluIHRoZSBtZWFudGltZS4KKyAqCisgKglOT1RFOiBUaGlzIHBhdGggZG9lcyBub3QgaGFuZGxlIGJhcnJpZXIsIGJ1dCBiYXJyaWVyIGlzIG5vdCBzdXBwb3J0ZWQKKyAqCW9uIGlkZS1jZCBhbnl3YXkuCisgKi8KKworaW50IGlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdChpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSwKKwkJCSAgICAgaW50IHVwdG9kYXRlLCBpbnQgbnJfc2VjdG9ycykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlkZV9sb2NrLCBmbGFncyk7CisKKwlCVUdfT04oIShycS0+ZmxhZ3MgJiBSRVFfU1RBUlRFRCkpOworCisJLyoKKwkgKiBpZiBmYWlsZmFzdCBpcyBzZXQgb24gYSByZXF1ZXN0LCBvdmVycmlkZSBudW1iZXIgb2Ygc2VjdG9ycyBhbmQKKwkgKiBjb21wbGV0ZSB0aGUgd2hvbGUgcmVxdWVzdCByaWdodCBub3cKKwkgKi8KKwlpZiAoYmxrX25vcmV0cnlfcmVxdWVzdChycSkgJiYgZW5kX2lvX2Vycm9yKHVwdG9kYXRlKSkKKwkJbnJfc2VjdG9ycyA9IHJxLT5oYXJkX25yX3NlY3RvcnM7CisKKwlpZiAoIWJsa19mc19yZXF1ZXN0KHJxKSAmJiBlbmRfaW9fZXJyb3IodXB0b2RhdGUpICYmICFycS0+ZXJyb3JzKQorCQlycS0+ZXJyb3JzID0gLUVJTzsKKworCS8qCisJICogZGVjaWRlIHdoZXRoZXIgdG8gcmVlbmFibGUgRE1BIC0tIDMgaXMgYSByYW5kb20gbWFnaWMgZm9yIG5vdywKKwkgKiBpZiB3ZSBETUEgdGltZW91dCBtb3JlIHRoYW4gMyB0aW1lcywganVzdCBzdGF5IGluIFBJTworCSAqLworCWlmIChkcml2ZS0+c3RhdGUgPT0gRE1BX1BJT19SRVRSWSAmJiBkcml2ZS0+cmV0cnlfcGlvIDw9IDMpIHsKKwkJZHJpdmUtPnN0YXRlID0gMDsKKwkJSFdHUk9VUChkcml2ZSktPmh3aWYtPmlkZV9kbWFfb24oZHJpdmUpOworCX0KKworCWlmICghZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2RhdGUsIG5yX3NlY3RvcnMpKSB7CisJCWFkZF9kaXNrX3JhbmRvbW5lc3MocnEtPnJxX2Rpc2spOworCQlpZiAoYmxrX3JxX3RhZ2dlZChycSkpCisJCQlibGtfcXVldWVfZW5kX3RhZyhkcml2ZS0+cXVldWUsIHJxKTsKKwkJZW5kX3RoYXRfcmVxdWVzdF9sYXN0KHJxLCB1cHRvZGF0ZSk7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlkZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlkZV9lbmRfZGVxdWV1ZWRfcmVxdWVzdCk7CisKKworLyoqCiAgKglpZGVfY29tcGxldGVfcG1fcmVxdWVzdCAtIGVuZCB0aGUgY3VycmVudCBQb3dlciBNYW5hZ2VtZW50IHJlcXVlc3QKICAqCUBkcml2ZTogdGFyZ2V0IGRyaXZlCiAgKglAcnE6IHJlcXVlc3QKQEAgLTM2MiwxMiArNDIyLDEzIEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKGJsa19wbV9yZXF1ZXN0KHJxKSkgeworCQlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSAqcG0gPSBycS0+ZW5kX2lvX2RhdGE7CiAjaWZkZWYgREVCVUdfUE0KIAkJcHJpbnRrKCIlczogY29tcGxldGVfcG93ZXJfc3RlcChzdGVwOiAlZCwgc3RhdDogJXgsIGVycjogJXgpXG4iLAogCQkJZHJpdmUtPm5hbWUsIHJxLT5wbS0+cG1fc3RlcCwgc3RhdCwgZXJyKTsKICNlbmRpZgogCQlpZGVfY29tcGxldGVfcG93ZXJfc3RlcChkcml2ZSwgcnEsIHN0YXQsIGVycik7Ci0JCWlmIChycS0+cG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZCkKKwkJaWYgKHBtLT5wbV9zdGVwID09IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQpCiAJCQlpZGVfY29tcGxldGVfcG1fcmVxdWVzdChkcml2ZSwgcnEpOwogCQlyZXR1cm47CiAJfQpAQCAtODcxLDYgKzkzMiwzOSBAQAogIAlyZXR1cm4gaWRlX3N0b3BwZWQ7CiB9CiAKK3N0YXRpYyB2b2lkIGlkZV9jaGVja19wbV9zdGF0ZShpZGVfZHJpdmVfdCAqZHJpdmUsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlzdHJ1Y3QgcmVxdWVzdF9wbV9zdGF0ZSAqcG0gPSBycS0+ZW5kX2lvX2RhdGE7CisKKwlpZiAoYmxrX3BtX3N1c3BlbmRfcmVxdWVzdChycSkgJiYKKwkgICAgcG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3N1c3BlbmQpCisJCS8qIE1hcmsgZHJpdmUgYmxvY2tlZCB3aGVuIHN0YXJ0aW5nIHRoZSBzdXNwZW5kIHNlcXVlbmNlLiAqLworCQlkcml2ZS0+YmxvY2tlZCA9IDE7CisJZWxzZSBpZiAoYmxrX3BtX3Jlc3VtZV9yZXF1ZXN0KHJxKSAmJgorCQkgcG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZSkgeworCQkvKiAKKwkJICogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIG9uIHdha2V1cCBpcyB0byB3YWl0IGZvciBCU1kgYml0IHRvCisJCSAqIGdvIGF3YXkgKHdpdGggYSBsb29vbmcgdGltZW91dCkgYXMgYSBkcml2ZSBvbiB0aGlzIGh3aWYgbWF5CisJCSAqIGp1c3QgYmUgUE9TVGluZyBpdHNlbGYuCisJCSAqIFdlIGRvIHRoYXQgYmVmb3JlIGV2ZW4gc2VsZWN0aW5nIGFzIHRoZSAib3RoZXIiIGRldmljZSBvbgorCQkgKiB0aGUgYnVzIG1heSBiZSBicm9rZW4gZW5vdWdoIHRvIHdhbGsgb24gb3VyIHRvZXMgYXQgdGhpcworCQkgKiBwb2ludC4KKwkJICovCisJCWludCByYzsKKyNpZmRlZiBERUJVR19QTQorCQlwcmludGsoIiVzOiBXYWtldXAgcmVxdWVzdCBpbml0ZWQsIHdhaXRpbmcgZm9yICFCU1kuLi5cbiIsIGRyaXZlLT5uYW1lKTsKKyNlbmRpZgorCQlyYyA9IGlkZV93YWl0X25vdF9idXN5KEhXSUYoZHJpdmUpLCAzNTAwMCk7CisJCWlmIChyYykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBidXMgbm90IHJlYWR5IG9uIHdha2V1cFxuIiwgZHJpdmUtPm5hbWUpOworCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOworCQlIV0lGKGRyaXZlKS0+T1VUQig4LCBIV0lGKGRyaXZlKS0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSk7CisJCXJjID0gaWRlX3dhaXRfbm90X2J1c3koSFdJRihkcml2ZSksIDEwMDAwKTsKKwkJaWYgKHJjKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKKwl9Cit9CisKIC8qKgogICoJc3RhcnRfcmVxdWVzdAktCXN0YXJ0IG9mIEkvTyBhbmQgY29tbWFuZCBpc3N1aW5nIGZvciBJREUKICAqCkBAIC05MDksMzMgKzEwMDMsOCBAQAogCWlmIChibG9jayA9PSAwICYmIGRyaXZlLT5yZW1hcF8wX3RvXzEgPT0gMSkKIAkJYmxvY2sgPSAxOyAgLyogcmVkaXJlY3QgTUJSIGFjY2VzcyB0byBFWi1Ecml2ZSBwYXJ0biB0YWJsZSAqLwogCi0JaWYgKGJsa19wbV9zdXNwZW5kX3JlcXVlc3QocnEpICYmCi0JICAgIHJxLT5wbS0+cG1fc3RlcCA9PSBpZGVfcG1fc3RhdGVfc3RhcnRfc3VzcGVuZCkKLQkJLyogTWFyayBkcml2ZSBibG9ja2VkIHdoZW4gc3RhcnRpbmcgdGhlIHN1c3BlbmQgc2VxdWVuY2UuICovCi0JCWRyaXZlLT5ibG9ja2VkID0gMTsKLQllbHNlIGlmIChibGtfcG1fcmVzdW1lX3JlcXVlc3QocnEpICYmCi0JCSBycS0+cG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX3N0YXJ0X3Jlc3VtZSkgewotCQkvKiAKLQkJICogVGhlIGZpcnN0IHRoaW5nIHdlIGRvIG9uIHdha2V1cCBpcyB0byB3YWl0IGZvciBCU1kgYml0IHRvCi0JCSAqIGdvIGF3YXkgKHdpdGggYSBsb29vbmcgdGltZW91dCkgYXMgYSBkcml2ZSBvbiB0aGlzIGh3aWYgbWF5Ci0JCSAqIGp1c3QgYmUgUE9TVGluZyBpdHNlbGYuCi0JCSAqIFdlIGRvIHRoYXQgYmVmb3JlIGV2ZW4gc2VsZWN0aW5nIGFzIHRoZSAib3RoZXIiIGRldmljZSBvbgotCQkgKiB0aGUgYnVzIG1heSBiZSBicm9rZW4gZW5vdWdoIHRvIHdhbGsgb24gb3VyIHRvZXMgYXQgdGhpcwotCQkgKiBwb2ludC4KLQkJICovCi0JCWludCByYzsKLSNpZmRlZiBERUJVR19QTQotCQlwcmludGsoIiVzOiBXYWtldXAgcmVxdWVzdCBpbml0ZWQsIHdhaXRpbmcgZm9yICFCU1kuLi5cbiIsIGRyaXZlLT5uYW1lKTsKLSNlbmRpZgotCQlyYyA9IGlkZV93YWl0X25vdF9idXN5KEhXSUYoZHJpdmUpLCAzNTAwMCk7Ci0JCWlmIChyYykKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBidXMgbm90IHJlYWR5IG9uIHdha2V1cFxuIiwgZHJpdmUtPm5hbWUpOwotCQlTRUxFQ1RfRFJJVkUoZHJpdmUpOwotCQlIV0lGKGRyaXZlKS0+T1VUQig4LCBIV0lGKGRyaXZlKS0+aW9fcG9ydHNbSURFX0NPTlRST0xfT0ZGU0VUXSk7Ci0JCXJjID0gaWRlX3dhaXRfbm90X2J1c3koSFdJRihkcml2ZSksIDEwMDAwKTsKLQkJaWYgKHJjKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlIG5vdCByZWFkeSBvbiB3YWtldXBcbiIsIGRyaXZlLT5uYW1lKTsKLQl9CisJaWYgKGJsa19wbV9yZXF1ZXN0KHJxKSkKKwkJaWRlX2NoZWNrX3BtX3N0YXRlKGRyaXZlLCBycSk7CiAKIAlTRUxFQ1RfRFJJVkUoZHJpdmUpOwogCWlmIChpZGVfd2FpdF9zdGF0KCZzdGFydHN0b3AsIGRyaXZlLCBkcml2ZS0+cmVhZHlfc3RhdCwgQlVTWV9TVEFUfERSUV9TVEFULCBXQUlUX1JFQURZKSkgewpAQCAtOTUwLDEzICsxMDE5LDE0IEBACiAJCWVsc2UgaWYgKHJxLT5mbGFncyAmIFJFUV9EUklWRV9UQVNLRklMRSkKIAkJCXJldHVybiBleGVjdXRlX2RyaXZlX2NtZChkcml2ZSwgcnEpOwogCQllbHNlIGlmIChibGtfcG1fcmVxdWVzdChycSkpIHsKKwkJCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbSA9IHJxLT5lbmRfaW9fZGF0YTsKICNpZmRlZiBERUJVR19QTQogCQkJcHJpbnRrKCIlczogc3RhcnRfcG93ZXJfc3RlcChzdGVwOiAlZClcbiIsCiAJCQkJZHJpdmUtPm5hbWUsIHJxLT5wbS0+cG1fc3RlcCk7CiAjZW5kaWYKIAkJCXN0YXJ0c3RvcCA9IGlkZV9zdGFydF9wb3dlcl9zdGVwKGRyaXZlLCBycSk7CiAJCQlpZiAoc3RhcnRzdG9wID09IGlkZV9zdG9wcGVkICYmCi0JCQkgICAgcnEtPnBtLT5wbV9zdGVwID09IGlkZV9wbV9zdGF0ZV9jb21wbGV0ZWQpCisJCQkgICAgcG0tPnBtX3N0ZXAgPT0gaWRlX3BtX3N0YXRlX2NvbXBsZXRlZCkKIAkJCQlpZGVfY29tcGxldGVfcG1fcmVxdWVzdChkcml2ZSwgcnEpOwogCQkJcmV0dXJuIHN0YXJ0c3RvcDsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYyBiL2RyaXZlcnMvaWRlL2lkZS1pb3BzLmMKaW5kZXggYjcyZGRlNy4uOTdhNDllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWlvcHMuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtaW9wcy5jCkBAIC05MzksOCArOTM5LDcgQEAKIAkKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWRlX2xvY2ssIGZsYWdzKTsKIAkKLQlpZihod2dyb3VwLT5oYW5kbGVyKQotCQlCVUcoKTsKKwlCVUdfT04oaHdncm91cC0+aGFuZGxlcik7CiAJaHdncm91cC0+aGFuZGxlcgk9IGhhbmRsZXI7CiAJaHdncm91cC0+ZXhwaXJ5CQk9IGV4cGlyeTsKIAlod2dyb3VwLT50aW1lci5leHBpcmVzCT0gamlmZmllcyArIHRpbWVvdXQ7CkBAIC05ODEsOCArOTgwLDcgQEAKIAkJcHJpbnRrKCIlczogQVRBUEkgcmVzZXQgY29tcGxldGVcbiIsIGRyaXZlLT5uYW1lKTsKIAl9IGVsc2UgewogCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgaHdncm91cC0+cG9sbF90aW1lb3V0KSkgewotCQkJaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCi0JCQkJQlVHKCk7CisJCQlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CiAJCQlpZGVfc2V0X2hhbmRsZXIoZHJpdmUsICZhdGFwaV9yZXNldF9wb2xsZnVuYywgSFovMjAsIE5VTEwpOwogCQkJLyogY29udGludWUgcG9sbGluZyAqLwogCQkJcmV0dXJuIGlkZV9zdGFydGVkOwpAQCAtMTAyMSw4ICsxMDE5LDcgQEAKIAogCWlmICghT0tfU1RBVCh0bXAgPSBod2lmLT5JTkIoSURFX1NUQVRVU19SRUcpLCAwLCBCVVNZX1NUQVQpKSB7CiAJCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBod2dyb3VwLT5wb2xsX3RpbWVvdXQpKSB7Ci0JCQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKLQkJCQlCVUcoKTsKKwkJCUJVR19PTihIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKTsKIAkJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnJlc2V0X3BvbGxmdW5jLCBIWi8yMCwgTlVMTCk7CiAJCQkvKiBjb250aW51ZSBwb2xsaW5nICovCiAJCQlyZXR1cm4gaWRlX3N0YXJ0ZWQ7CkBAIC0xMTM4LDggKzExMzUsNyBAQAogCWh3Z3JvdXAgPSBIV0dST1VQKGRyaXZlKTsKIAogCS8qIFdlIG11c3Qgbm90IHJlc2V0IHdpdGggcnVubmluZyBoYW5kbGVycyAqLwotCWlmKGh3Z3JvdXAtPmhhbmRsZXIgIT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKGh3Z3JvdXAtPmhhbmRsZXIgIT0gTlVMTCk7CiAKIAkvKiBGb3IgYW4gQVRBUEkgZGV2aWNlLCBmaXJzdCB0cnkgYW4gQVRBUEkgU1JTVC4gKi8KIAlpZiAoZHJpdmUtPm1lZGlhICE9IGlkZV9kaXNrICYmICFkb19ub3RfdHJ5X2F0YXBpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9pZGUtbGliLmMgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKaW5kZXggNDFkNDZkYi4uMTZhMTQzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jCisrKyBiL2RyaXZlcnMvaWRlL2lkZS1saWIuYwpAQCAtMTY0LDggKzE2NCw3IEBACiAvLwlwcmludGsoIiVzOiBtb2RlIDB4JTAyeCwgc3BlZWQgMHglMDJ4XG4iLCBfX0ZVTkNUSU9OX18sIG1vZGUsIHNwZWVkKTsKIAogCS8qIFNvIHRoYXQgd2UgcmVtZW1iZXIgdG8gdXBkYXRlIHRoaXMgaWYgbmV3IG1vZGVzIGFwcGVhciAqLwotCWlmIChtb2RlID4gNCkKLQkJQlVHKCk7CisJQlVHX09OKG1vZGUgPiA0KTsKIAlyZXR1cm4gbWluKHNwZWVkLCBzcGVlZF9tYXhbbW9kZV0pOwogI2Vsc2UgLyogIUNPTkZJR19CTEtfREVWX0lERURNQSAqLwogCXJldHVybiBtaW4oc3BlZWQsICh1OClYRkVSX1BJT180KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IGYwNDc5MWEuLjA5ZjNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMjY0NiwyMSArMjY0NiwyMyBAQAogCXJldHVybiBfX2lkZXRhcGVfa21hbGxvY19zdGFnZSh0YXBlLCAwLCAwKTsKIH0KIAotc3RhdGljIHZvaWQgaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlciAoaWRldGFwZV90YXBlX3QgKnRhcGUsIGlkZXRhcGVfc3RhZ2VfdCAqc3RhZ2UsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBuKQorc3RhdGljIGludCBpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyIChpZGV0YXBlX3RhcGVfdCAqdGFwZSwgaWRldGFwZV9zdGFnZV90ICpzdGFnZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IG4pCiB7CiAJc3RydWN0IGlkZXRhcGVfYmggKmJoID0gdGFwZS0+Ymg7CiAJaW50IGNvdW50OworCWludCByZXQgPSAwOwogCiAJd2hpbGUgKG4pIHsKICNpZiBJREVUQVBFX0RFQlVHX0JVR1MKIAkJaWYgKGJoID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiaWRlLXRhcGU6IGJoID09IE5VTEwgaW4gIgogCQkJCSJpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyXG4iKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAxOwogCQl9CiAjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCiAJCWNvdW50ID0gbWluKCh1bnNpZ25lZCBpbnQpKGJoLT5iX3NpemUgLSBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpKSwgKHVuc2lnbmVkIGludCluKTsKLQkJY29weV9mcm9tX3VzZXIoYmgtPmJfZGF0YSArIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCksIGJ1ZiwgY291bnQpOworCQlpZiAoY29weV9mcm9tX3VzZXIoYmgtPmJfZGF0YSArIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCksIGJ1ZiwgY291bnQpKQorCQkJcmV0ID0gMTsKIAkJbiAtPSBjb3VudDsKIAkJYXRvbWljX2FkZChjb3VudCwgJmJoLT5iX2NvdW50KTsKIAkJYnVmICs9IGNvdW50OwpAQCAtMjY3MSwyMyArMjY3MywyNiBAQAogCQl9CiAJfQogCXRhcGUtPmJoID0gYmg7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIgKGlkZXRhcGVfdGFwZV90ICp0YXBlLCBjaGFyIF9fdXNlciAqYnVmLCBpZGV0YXBlX3N0YWdlX3QgKnN0YWdlLCBpbnQgbikKK3N0YXRpYyBpbnQgaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIgKGlkZXRhcGVfdGFwZV90ICp0YXBlLCBjaGFyIF9fdXNlciAqYnVmLCBpZGV0YXBlX3N0YWdlX3QgKnN0YWdlLCBpbnQgbikKIHsKIAlzdHJ1Y3QgaWRldGFwZV9iaCAqYmggPSB0YXBlLT5iaDsKIAlpbnQgY291bnQ7CisJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAobikgewogI2lmIElERVRBUEVfREVCVUdfQlVHUwogCQlpZiAoYmggPT0gTlVMTCkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJpZGUtdGFwZTogYmggPT0gTlVMTCBpbiAiCiAJCQkJImlkZXRhcGVfY29weV9zdGFnZV90b191c2VyXG4iKTsKLQkJCXJldHVybjsKKwkJCXJldHVybiAxOwogCQl9CiAjZW5kaWYgLyogSURFVEFQRV9ERUJVR19CVUdTICovCiAJCWNvdW50ID0gbWluKHRhcGUtPmJfY291bnQsIG4pOwotCQljb3B5X3RvX3VzZXIoYnVmLCB0YXBlLT5iX2RhdGEsIGNvdW50KTsKKwkJaWYgIChjb3B5X3RvX3VzZXIoYnVmLCB0YXBlLT5iX2RhdGEsIGNvdW50KSkKKwkJCXJldCA9IDE7CiAJCW4gLT0gY291bnQ7CiAJCXRhcGUtPmJfZGF0YSArPSBjb3VudDsKIAkJdGFwZS0+Yl9jb3VudCAtPSBjb3VudDsKQEAgLTI3MDAsNiArMjcwNSw3IEBACiAJCQl9CiAJCX0KIAl9CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgaWRldGFwZV9pbml0X21lcmdlX3N0YWdlIChpZGV0YXBlX3RhcGVfdCAqdGFwZSkKQEAgLTM3MTksNiArMzcyNSw3IEBACiAJc3RydWN0IGlkZV90YXBlX29iaiAqdGFwZSA9IGlkZV90YXBlX2YoZmlsZSk7CiAJaWRlX2RyaXZlX3QgKmRyaXZlID0gdGFwZS0+ZHJpdmU7CiAJc3NpemVfdCBieXRlc19yZWFkLHRlbXAsIGFjdHVhbGx5X3JlYWQgPSAwLCByYzsKKwlzc2l6ZV90IHJldCA9IDA7CiAKICNpZiBJREVUQVBFX0RFQlVHX0xPRwogCWlmICh0YXBlLT5kZWJ1Z19sZXZlbCA+PSAzKQpAQCAtMzczNyw3ICszNzQ0LDggQEAKIAkJcmV0dXJuICgwKTsKIAlpZiAodGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSkgewogCQlhY3R1YWxseV9yZWFkID0gbWluKCh1bnNpZ25lZCBpbnQpKHRhcGUtPm1lcmdlX3N0YWdlX3NpemUpLCAodW5zaWduZWQgaW50KWNvdW50KTsKLQkJaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCB0YXBlLT5tZXJnZV9zdGFnZSwgYWN0dWFsbHlfcmVhZCk7CisJCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCBhY3R1YWxseV9yZWFkKSkKKwkJCXJldCA9IC1FRkFVTFQ7CiAJCWJ1ZiArPSBhY3R1YWxseV9yZWFkOwogCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplIC09IGFjdHVhbGx5X3JlYWQ7CiAJCWNvdW50IC09IGFjdHVhbGx5X3JlYWQ7CkBAIC0zNzQ2LDcgKzM3NTQsOCBAQAogCQlieXRlc19yZWFkID0gaWRldGFwZV9hZGRfY2hyZGV2X3JlYWRfcmVxdWVzdChkcml2ZSwgdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCk7CiAJCWlmIChieXRlc19yZWFkIDw9IDApCiAJCQlnb3RvIGZpbmlzaDsKLQkJaWRldGFwZV9jb3B5X3N0YWdlX3RvX3VzZXIodGFwZSwgYnVmLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnl0ZXNfcmVhZCk7CisJCWlmIChpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCBieXRlc19yZWFkKSkKKwkJCXJldCA9IC1FRkFVTFQ7CiAJCWJ1ZiArPSBieXRlc19yZWFkOwogCQljb3VudCAtPSBieXRlc19yZWFkOwogCQlhY3R1YWxseV9yZWFkICs9IGJ5dGVzX3JlYWQ7CkBAIC0zNzU2LDcgKzM3NjUsOCBAQAogCQlpZiAoYnl0ZXNfcmVhZCA8PSAwKQogCQkJZ290byBmaW5pc2g7CiAJCXRlbXAgPSBtaW4oKHVuc2lnbmVkIGxvbmcpY291bnQsICh1bnNpZ25lZCBsb25nKWJ5dGVzX3JlYWQpOwotCQlpZGV0YXBlX2NvcHlfc3RhZ2VfdG9fdXNlcih0YXBlLCBidWYsIHRhcGUtPm1lcmdlX3N0YWdlLCB0ZW1wKTsKKwkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV90b191c2VyKHRhcGUsIGJ1ZiwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIHRlbXApKQorCQkJcmV0ID0gLUVGQVVMVDsKIAkJYWN0dWFsbHlfcmVhZCArPSB0ZW1wOwogCQl0YXBlLT5tZXJnZV9zdGFnZV9zaXplID0gYnl0ZXNfcmVhZC10ZW1wOwogCX0KQEAgLTM3NjksNyArMzc3OSw4IEBACiAJCWlkZXRhcGVfc3BhY2Vfb3Zlcl9maWxlbWFya3MoZHJpdmUsIE1URlNGLCAxKTsKIAkJcmV0dXJuIDA7CiAJfQotCXJldHVybiBhY3R1YWxseV9yZWFkOworCisJcmV0dXJuIChyZXQpID8gcmV0IDogYWN0dWFsbHlfcmVhZDsKIH0KIAogc3RhdGljIHNzaXplX3QgaWRldGFwZV9jaHJkZXZfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLApAQCAtMzc3Nyw3ICszNzg4LDggQEAKIHsKIAlzdHJ1Y3QgaWRlX3RhcGVfb2JqICp0YXBlID0gaWRlX3RhcGVfZihmaWxlKTsKIAlpZGVfZHJpdmVfdCAqZHJpdmUgPSB0YXBlLT5kcml2ZTsKLQlzc2l6ZV90IHJldHZhbCwgYWN0dWFsbHlfd3JpdHRlbiA9IDA7CisJc3NpemVfdCBhY3R1YWxseV93cml0dGVuID0gMDsKKwlzc2l6ZV90IHJldCA9IDA7CiAKIAkvKiBUaGUgZHJpdmUgaXMgd3JpdGUgcHJvdGVjdGVkLiAqLwogCWlmICh0YXBlLT53cml0ZV9wcm90KQpAQCAtMzgxMyw3ICszODI1LDcgQEAKIAkJICoJc29tZSBkcml2ZXMgKFNlYWdhdGUgU1RUMzQwMUEpIHdpbGwgcmV0dXJuIGFuIGVycm9yLgogCQkgKi8KIAkJaWYgKGRyaXZlLT5kc2Nfb3ZlcmxhcCkgewotCQkJcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9XUklURSwgMCwgdGFwZS0+bWVyZ2Vfc3RhZ2UtPmJoKTsKKwkJCXNzaXplX3QgcmV0dmFsID0gaWRldGFwZV9xdWV1ZV9yd190YWlsKGRyaXZlLCBSRVFfSURFVEFQRV9XUklURSwgMCwgdGFwZS0+bWVyZ2Vfc3RhZ2UtPmJoKTsKIAkJCWlmIChyZXR2YWwgPCAwKSB7CiAJCQkJX19pZGV0YXBlX2tmcmVlX3N0YWdlKHRhcGUtPm1lcmdlX3N0YWdlKTsKIAkJCQl0YXBlLT5tZXJnZV9zdGFnZSA9IE5VTEw7CkBAIC0zODM0LDEyICszODQ2LDE0IEBACiAJCX0KICNlbmRpZiAvKiBJREVUQVBFX0RFQlVHX0JVR1MgKi8KIAkJYWN0dWFsbHlfd3JpdHRlbiA9IG1pbigodW5zaWduZWQgaW50KSh0YXBlLT5zdGFnZV9zaXplIC0gdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSksICh1bnNpZ25lZCBpbnQpY291bnQpOwotCQlpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRhcGUsIHRhcGUtPm1lcmdlX3N0YWdlLCBidWYsIGFjdHVhbGx5X3dyaXR0ZW4pOworCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnVmLCBhY3R1YWxseV93cml0dGVuKSkKKwkJCQlyZXQgPSAtRUZBVUxUOwogCQlidWYgKz0gYWN0dWFsbHlfd3JpdHRlbjsKIAkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSArPSBhY3R1YWxseV93cml0dGVuOwogCQljb3VudCAtPSBhY3R1YWxseV93cml0dGVuOwogCiAJCWlmICh0YXBlLT5tZXJnZV9zdGFnZV9zaXplID09IHRhcGUtPnN0YWdlX3NpemUpIHsKKwkJCXNzaXplX3QgcmV0dmFsOwogCQkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSA9IDA7CiAJCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCk7CiAJCQlpZiAocmV0dmFsIDw9IDApCkBAIC0zODQ3LDcgKzM4NjEsOSBAQAogCQl9CiAJfQogCXdoaWxlIChjb3VudCA+PSB0YXBlLT5zdGFnZV9zaXplKSB7Ci0JCWlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgdGFwZS0+c3RhZ2Vfc2l6ZSk7CisJCXNzaXplX3QgcmV0dmFsOworCQlpZiAoaWRldGFwZV9jb3B5X3N0YWdlX2Zyb21fdXNlcih0YXBlLCB0YXBlLT5tZXJnZV9zdGFnZSwgYnVmLCB0YXBlLT5zdGFnZV9zaXplKSkKKwkJCXJldCA9IC1FRkFVTFQ7CiAJCWJ1ZiArPSB0YXBlLT5zdGFnZV9zaXplOwogCQljb3VudCAtPSB0YXBlLT5zdGFnZV9zaXplOwogCQlyZXR2YWwgPSBpZGV0YXBlX2FkZF9jaHJkZXZfd3JpdGVfcmVxdWVzdChkcml2ZSwgdGFwZS0+Y2FwYWJpbGl0aWVzLmN0bCk7CkBAIC0zODU3LDEwICszODczLDExIEBACiAJfQogCWlmIChjb3VudCkgewogCQlhY3R1YWxseV93cml0dGVuICs9IGNvdW50OwotCQlpZGV0YXBlX2NvcHlfc3RhZ2VfZnJvbV91c2VyKHRhcGUsIHRhcGUtPm1lcmdlX3N0YWdlLCBidWYsIGNvdW50KTsKKwkJaWYgKGlkZXRhcGVfY29weV9zdGFnZV9mcm9tX3VzZXIodGFwZSwgdGFwZS0+bWVyZ2Vfc3RhZ2UsIGJ1ZiwgY291bnQpKQorCQkJcmV0ID0gLUVGQVVMVDsKIAkJdGFwZS0+bWVyZ2Vfc3RhZ2Vfc2l6ZSArPSBjb3VudDsKIAl9Ci0JcmV0dXJuIChhY3R1YWxseV93cml0dGVuKTsKKwlyZXR1cm4gKHJldCkgPyByZXQgOiBhY3R1YWxseV93cml0dGVuOwogfQogCiBzdGF0aWMgaW50IGlkZXRhcGVfd3JpdGVfZmlsZW1hcmsgKGlkZV9kcml2ZV90ICpkcml2ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXNrZmlsZS5jIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKaW5kZXggOTIzM2I4MS4uYTgzOWIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhc2tmaWxlLmMKQEAgLTE5Niw4ICsxOTYsNyBAQAogCWlmIChzdGF0ICYgKEVSUl9TVEFUfERSUV9TVEFUKSkKIAkJcmV0dXJuIGlkZV9lcnJvcihkcml2ZSwgInNldF9nZW9tZXRyeV9pbnRyIiwgc3RhdCk7CiAKLQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpOwogCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJnNldF9nZW9tZXRyeV9pbnRyLCBXQUlUX1dPUlNUQ0FTRSwgTlVMTCk7CiAJcmV0dXJuIGlkZV9zdGFydGVkOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLmMgYi9kcml2ZXJzL2lkZS9pZGUuYwppbmRleCAzZmRhYjU2Li41OWZlMzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUuYwpAQCAtNzI2LDYgKzcyNiw3IEBACiB7CiAJaW50IGk7CiAKKwltZW1zZXQoaHcsIDAsIHNpemVvZihod19yZWdzX3QpKTsKIAlmb3IgKGkgPSAwOyBpIDwgSURFX05SX1BPUlRTOyBpKyspIHsKIAkJaWYgKG9mZnNldHNbaV0gPT0gLTEpIHsKIAkJCXN3aXRjaChpKSB7CkBAIC0xMjI1LDcgKzEyMjYsNyBAQAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAlycS5mbGFncyA9IFJFUV9QTV9TVVNQRU5EOwogCXJxLnNwZWNpYWwgPSAmYXJnczsKLQlycS5wbSA9ICZycXBtOworCXJxLmVuZF9pb19kYXRhID0gJnJxcG07CiAJcnFwbS5wbV9zdGVwID0gaWRlX3BtX3N0YXRlX3N0YXJ0X3N1c3BlbmQ7CiAJcnFwbS5wbV9zdGF0ZSA9IHN0YXRlLmV2ZW50OwogCkBAIC0xMjQ0LDcgKzEyNDUsNyBAQAogCW1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKIAlycS5mbGFncyA9IFJFUV9QTV9SRVNVTUU7CiAJcnEuc3BlY2lhbCA9ICZhcmdzOwotCXJxLnBtID0gJnJxcG07CisJcnEuZW5kX2lvX2RhdGEgPSAmcnFwbTsKIAlycXBtLnBtX3N0ZXAgPSBpZGVfcG1fc3RhdGVfc3RhcnRfcmVzdW1lOwogCXJxcG0ucG1fc3RhdGUgPSBQTV9FVkVOVF9PTjsKIApAQCAtMTM2Niw4ICsxMzY3LDcgQEAKIAogCQkJaWRlX2Fib3J0KGRyaXZlLCAiZHJpdmUgcmVzZXQiKTsKIAotCQkJaWYoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIpCi0JCQkJQlVHKCk7CisJCQlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIpOwogCQkJCQogCQkJLyogRW5zdXJlIG5vdGhpbmcgZ2V0cyBxdWV1ZWQgYWZ0ZXIgd2UKIAkJCSAgIGRyb3AgdGhlIGxvY2suIFJlc2V0IHdpbGwgY2xlYXIgdGhlIGJ1c3kgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYyBiL2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYwppbmRleCAyYTc4Yjc5Li40MzRhOTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9sZWdhY3kvcTQwaWRlLmMKKysrIGIvZHJpdmVycy9pZGUvbGVnYWN5L3E0MGlkZS5jCkBAIC04MCw2ICs4MCw3IEBACiB7CiAJaW50IGk7CiAKKwltZW1zZXQoaHcsIDAsIHNpemVvZihod19yZWdzX3QpKTsKIAlmb3IgKGkgPSAwOyBpIDwgSURFX05SX1BPUlRTOyBpKyspIHsKIAkJLyogQklHIEZBVCBXQVJOSU5HOiAKIAkJICAgYXNzdW1wdGlvbjogb25seSBEQVRBIHBvcnQgaXMgZXZlciB1c2VkIGluIDE2IGJpdCBtb2RlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jIGIvZHJpdmVycy9pZGUvcGNpL2FtZDc0eHguYwppbmRleCBiMjJlZTU0Li42ZTlkYmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvYW1kNzR4eC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9hbWQ3NHh4LmMKQEAgLTc0LDYgKzc0LDcgQEAKIAl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1AwNF9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDUxX0lERSwJMHg1MCwgQU1EX1VETUFfMTMzIH0sCiAJeyBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTVfSURFLAkweDUwLCBBTURfVURNQV8xMzMgfSwKKwl7IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A2MV9JREUsCTB4NTAsIEFNRF9VRE1BXzEzMyB9LAogCXsgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSwJCQkweDQwLCBBTURfVURNQV8xMDAgfSwKIAl7IDAgfQogfTsKQEAgLTQ4OCw3ICs0ODksOCBAQAogCS8qIDE0ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQMDQiKSwKIAkvKiAxNSAqLyBERUNMQVJFX05WX0RFVigiTkZPUkNFLU1DUDUxIiksCiAJLyogMTYgKi8gREVDTEFSRV9OVl9ERVYoIk5GT1JDRS1NQ1A1NSIpLAotCS8qIDE3ICovIERFQ0xBUkVfQU1EX0RFVigiQU1ENTUzNiIpLAorCS8qIDE3ICovIERFQ0xBUkVfTlZfREVWKCJORk9SQ0UtTUNQNjEiKSwKKwkvKiAxOCAqLyBERUNMQVJFX0FNRF9ERVYoIkFNRDU1MzYiKSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFtZDc0eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQpAQCAtNTI1LDcgKzUyNyw4IEBACiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDA0X0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTQgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfSURFLAlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAxNSB9LAogCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9JREUsCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE2IH0sCi0JeyBQQ0lfVkVORE9SX0lEX0FNRCwJUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0lERSwJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDE3IH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX0lERSwJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTcgfSwKKwl7IFBDSV9WRU5ET1JfSURfQU1ELAlQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfSURFLAkJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMTggfSwKIAl7IDAsIH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFtZDc0eHhfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jIGIvZHJpdmVycy9pZGUvcGNpL3NnaWlvYzQuYwppbmRleCAyN2M5ZWI5Li5lMTI1MDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9wY2kvc2dpaW9jNC5jCisrKyBiL2RyaXZlcnMvaWRlL3BjaS9zZ2lpb2M0LmMKQEAgLTcyMyw2ICs3MjMsMTIgQEAKIGludAogaW9jNF9pZGVfYXR0YWNoX29uZShzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSAqaWRkKQogeworCS8qIFBDSS1SVCBkb2VzIG5vdCBicmluZyBvdXQgSURFIGNvbm5lY3Rpb24uCisJICogRG8gbm90IGF0dGFjaCB0byB0aGlzIHBhcnRpY3VsYXIgSU9DNC4KKwkgKi8KKwlpZiAoaWRkLT5pZGRfdmFyaWFudCA9PSBJT0M0X1ZBUklBTlRfUENJX1JUKQorCQlyZXR1cm4gMDsKKwogCXJldHVybiBwY2lfaW5pdF9zZ2lpb2M0KGlkZC0+aWRkX3BkZXYsCiAJCQkJJnNnaWlvYzRfY2hpcHNldHNbaWRkLT5pZGRfcGNpX2lkLT5kcml2ZXJfZGF0YV0pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvcGNpL3RybTI5MC5jIGIvZHJpdmVycy9pZGUvcGNpL3RybTI5MC5jCmluZGV4IGMyNmM4Y2EuLmZlODAyOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL3BjaS90cm0yOTAuYworKysgYi9kcml2ZXJzL2lkZS9wY2kvdHJtMjkwLmMKQEAgLTE4Myw4ICsxODMsNyBAQAogewogCWlkZV9od2lmX3QgKmh3aWYJPSBIV0lGKGRyaXZlKTsKIAotCWlmIChIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKQkvKiBwYXJhbm9pYSBjaGVjayAqLwotCQlCVUcoKTsKKwlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CS8qIHBhcmFub2lhIGNoZWNrICovCiAJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRlX2RtYV9pbnRyLCBXQUlUX0NNRCwgTlVMTCk7CiAJLyogaXNzdWUgY21kIHRvIGRyaXZlICovCiAJaHdpZi0+T1VUQihjb21tYW5kLCBJREVfQ09NTUFORF9SRUcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlMTM5NC9ub2RlbWdyLmMgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwppbmRleCA5NDhmMWI4Li41MGM3MWUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYworKysgYi9kcml2ZXJzL2llZWUxMzk0L25vZGVtZ3IuYwpAQCAtOCw2ICs4LDcgQEAKICAqIGRpcmVjdG9yeSBvZiB0aGUga2VybmVsIHNvdXJjZXMgZm9yIGRldGFpbHMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTMzNCwxMCArMzM1LDEyIEBACiBzdGF0aWMgREVWSUNFX0FUVFIoYnVzX29wdGlvbnMsU19JUlVHTyxmd19zaG93X25lX2J1c19vcHRpb25zLE5VTEwpOwogCiAKKy8qIHRsYWJlbHNfZnJlZSwgdGxhYmVsc19hbGxvY2F0aW9ucywgdGxhYmVsc19tYXNrIGFyZSByZWFkIG5vbi1hdG9taWNhbGx5CisgKiBoZXJlLCB0aGVyZWZvcmUgZGlzcGxheWVkIHZhbHVlcyBtYXkgYmUgb2NjYXNpb25hbGx5IHdyb25nLiAqLwogc3RhdGljIHNzaXplX3QgZndfc2hvd19uZV90bGFiZWxzX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBub2RlX2VudHJ5ICpuZSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBub2RlX2VudHJ5LCBkZXZpY2UpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBhdG9taWNfcmVhZCgmbmUtPnRwb29sLT5jb3VudC5jb3VudCkgKyAxKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgNjQgLSBiaXRtYXBfd2VpZ2h0KG5lLT50cG9vbC0+cG9vbCwgNjQpKTsKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUih0bGFiZWxzX2ZyZWUsU19JUlVHTyxmd19zaG93X25lX3RsYWJlbHNfZnJlZSxOVUxMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3V2ZXJic19tYWluLmMKaW5kZXggZGMxZjRkZS4uZTcyNWNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdXZlcmJzX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91dmVyYnNfbWFpbi5jCkBAIC04MTUsMTEgKzgxNSwxMiBAQAogCWtyZWZfcHV0KCZ1dmVyYnNfZGV2LT5yZWYsIGliX3V2ZXJic19yZWxlYXNlX2Rldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnV2ZXJic19ldmVudF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKLQkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCB1dmVyYnNfZXZlbnRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImluZmluaWJhbmRldmVudDoiLCBOVUxMLAotCQkJICAgICBJTkZJTklCQU5ERVZFTlRGU19NQUdJQyk7CisJCQkgICAgIElORklOSUJBTkRFVkVOVEZTX01BR0lDLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdXZlcmJzX2V2ZW50X2ZzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZzLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwppbmRleCBlMjc0MTIwLi42M2RlMzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvaXBhdGgvaXBhdGhfZnMuYwpAQCAtNTQyLDEzICs1NDIsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICppcGF0aGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkgICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGlwYXRoZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCQljb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JaXBhdGhfc3VwZXIgPSBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLAotCQkJCSAgICBpcGF0aGZzX2ZpbGxfc3VwZXIpOwotCXJldHVybiBpcGF0aF9zdXBlcjsKKwlpbnQgcmV0ID0gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwKKwkJCQkgICAgaXBhdGhmc19maWxsX3N1cGVyLCBtbnQpOworCWlmIChyZXQgPj0gMCkKKwkJaXBhdGhfc3VwZXIgPSBtbnQtPm1udF9zYjsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBpcGF0aGZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9ldmRldi5jIGIvZHJpdmVycy9pbnB1dC9ldmRldi5jCmluZGV4IGJhMzI1ZjEuLjVmNTYxZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvZXZkZXYuYworKysgYi9kcml2ZXJzL2lucHV0L2V2ZGV2LmMKQEAgLTgyLDcgKzgyLDcgQEAKIAlyZXR1cm4gcmV0dmFsIDwgMCA/IHJldHZhbCA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgZXZkZXZfZmx1c2goc3RydWN0IGZpbGUgKiBmaWxlKQorc3RhdGljIGludCBldmRldl9mbHVzaChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IGV2ZGV2X2xpc3QgKmxpc3QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaWYgKCFsaXN0LT5ldmRldi0+ZXhpc3QpIHJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hbWlrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYW1pa2JkLmMKaW5kZXggNGM4ZmIxZi4uZjFmOWRiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hbWlrYmQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2FtaWtiZC5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleWJvYXJkLmg+CiAKICNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KQEAgLTQ1LDcgKzQ2LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQW1pZ2Ega2V5Ym9hcmQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFtaWtiZF9rZXljb2RlWzB4NzhdID0geworc3RhdGljIHVuc2lnbmVkIGNoYXIgYW1pa2JkX2tleWNvZGVbMHg3OF0gX19pbml0ZGF0YSA9IHsKIAlbMF0JID0gS0VZX0dSQVZFLAogCVsxXQkgPSBLRVlfMSwKIAlbMl0JID0gS0VZXzIsCkBAIC0xNzAsMTIgKzE3MSw5IEBACiAJc2NhbmNvZGUgPj49IDE7CiAKIAlpZiAoc2NhbmNvZGUgPCAweDc4KSB7CQkvKiBzY2FuY29kZXMgPCAweDc4IGFyZSBrZXlzICovCi0KLQkJc2NhbmNvZGUgPSBhbWlrYmRfa2V5Y29kZVtzY2FuY29kZV07Ci0KIAkJaW5wdXRfcmVncyhhbWlrYmRfZGV2LCBmcCk7CiAKLQkJaWYgKHNjYW5jb2RlID09IEtFWV9DQVBTTE9DSykgewkvKiBDYXBzTG9jayBpcyBhIHRvZ2dsZSBzd2l0Y2gga2V5IG9uIEFtaWdhICovCisJCWlmIChzY2FuY29kZSA9PSA5OCkgewkvKiBDYXBzTG9jayBpcyBhIHRvZ2dsZSBzd2l0Y2gga2V5IG9uIEFtaWdhICovCiAJCQlpbnB1dF9yZXBvcnRfa2V5KGFtaWtiZF9kZXYsIHNjYW5jb2RlLCAxKTsKIAkJCWlucHV0X3JlcG9ydF9rZXkoYW1pa2JkX2Rldiwgc2NhbmNvZGUsIDApOwogCQl9IGVsc2UgewpAQCAtMTkxLDcgKzE4OSw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGFtaWtiZF9pbml0KHZvaWQpCiB7Ci0JaW50IGk7CisJaW50IGksIGo7CiAKIAlpZiAoIUFNSUdBSFdfUFJFU0VOVChBTUlfS0VZQk9BUkQpKQogCQlyZXR1cm4gLUVJTzsKQEAgLTIxNCwxNCArMjEyLDI2IEBACiAJYW1pa2JkX2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKIAogCWFtaWtiZF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX0tFWSkgfCBCSVQoRVZfUkVQKTsKLQlhbWlrYmRfZGV2LT5rZXljb2RlID0gYW1pa2JkX2tleWNvZGU7Ci0JYW1pa2JkX2Rldi0+a2V5Y29kZXNpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0JYW1pa2JkX2Rldi0+a2V5Y29kZW1heCA9IEFSUkFZX1NJWkUoYW1pa2JkX2tleWNvZGUpOwogCiAJZm9yIChpID0gMDsgaSA8IDB4Nzg7IGkrKykKLQkJaWYgKGFtaWtiZF9rZXljb2RlW2ldKQotCQkJc2V0X2JpdChhbWlrYmRfa2V5Y29kZVtpXSwgYW1pa2JkX2Rldi0+a2V5Yml0KTsKKwkJc2V0X2JpdChpLCBhbWlrYmRfZGV2LT5rZXliaXQpOwogCisJZm9yIChpID0gMDsgaSA8IE1BWF9OUl9LRVlNQVBTOyBpKyspIHsKKwkJc3RhdGljIHVfc2hvcnQgdGVtcF9tYXBbTlJfS0VZU10gX19pbml0ZGF0YTsKKwkJaWYgKCFrZXlfbWFwc1tpXSkKKwkJCWNvbnRpbnVlOworCQltZW1zZXQodGVtcF9tYXAsIDAsIHNpemVvZih0ZW1wX21hcCkpOworCQlmb3IgKGogPSAwOyBqIDwgMHg3ODsgaisrKSB7CisJCQlpZiAoIWFtaWtiZF9rZXljb2RlW2pdKQorCQkJCWNvbnRpbnVlOworCQkJdGVtcF9tYXBbal0gPSBrZXlfbWFwc1tpXVthbWlrYmRfa2V5Y29kZVtqXV07CisJCX0KKwkJZm9yIChqID0gMDsgaiA8IE5SX0tFWVM7IGorKykgeworCQkJaWYgKCF0ZW1wX21hcFtqXSkKKwkJCQl0ZW1wX21hcFtqXSA9IDB4ZjIwMDsKKwkJfQorCQltZW1jcHkoa2V5X21hcHNbaV0sIHRlbXBfbWFwLCBzaXplb2YodGVtcF9tYXApKTsKKwl9CiAJY2lhYS5jcmEgJj0gfjB4NDE7CSAvKiBzZXJpYWwgZGF0YSBpbiwgdHVybiBvZmYgVEEgKi8KIAlyZXF1ZXN0X2lycShJUlFfQU1JR0FfQ0lBQV9TUCwgYW1pa2JkX2ludGVycnVwdCwgMCwgImFtaWtiZCIsIGFtaWtiZF9pbnRlcnJ1cHQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCmluZGV4IDRiYWQ1ODguLmE2ZGZjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9LY29uZmlnCkBAIC0yNiw3ICsyNiw3IEBACiAKIGNvbmZpZyBJTlBVVF9TUEFSQ1NQS1IKIAl0cmlzdGF0ZSAiU1BBUkMgU3BlYWtlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gUENJICYmIFNQQVJDCisJZGVwZW5kcyBvbiBQQ0kgJiYgU1BBUkM2NAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIHN0YW5kYXJkIFNwZWFrZXIgb24gU3BhcmMgUENJIHN5c3RlbXMKIAkgIHRvIGJlIHVzZWQgZm9yIGJlbGxzIGFuZCB3aGlzdGxlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9zcGFyY3Nwa3IuYwppbmRleCBmMGZkMmM0Li40MmMxMWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mvc3BhcmNzcGtyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9taXNjL3NwYXJjc3Brci5jCkBAIC0yLDcgKzIsNyBAQAogICogIERyaXZlciBmb3IgUEMtc3BlYWtlciBsaWtlIGRldmljZXMgZm91bmQgb24gdmFyaW91cyBTcGFyYyBzeXN0ZW1zLgogICoKICAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVm9qdGVjaCBQYXZsaWsKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDIgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKQorICogIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTEzLDIxICsxMywyMyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2VidXMuaD4KLSNpZmRlZiBDT05GSUdfU1BBUkM2NAogI2luY2x1ZGUgPGFzbS9pc2EuaD4KLSNlbmRpZgogCi1NT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwYXJjIFNwZWFrZXIgYmVlcGVyIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1jb25zdCBjaGFyICpiZWVwX25hbWU7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBiZWVwX2lvYmFzZTsKLXN0YXRpYyBpbnQgKCpiZWVwX2V2ZW50KShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKTsKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmVlcF9sb2NrKTsKK3N0cnVjdCBzcGFyY3Nwa3Jfc3RhdGUgeworCWNvbnN0IGNoYXIJCSpuYW1lOworCXVuc2lnbmVkIGxvbmcJCWlvYmFzZTsKKwlpbnQgKCpldmVudCkoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSk7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgaW5wdXRfZGV2CSppbnB1dF9kZXY7Cit9OwogCiBzdGF0aWMgaW50IGVidXNfc3Brcl9ldmVudChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsIHVuc2lnbmVkIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgY29kZSwgaW50IHZhbHVlKQogeworCXN0cnVjdCBzcGFyY3Nwa3Jfc3RhdGUgKnN0YXRlID0gZGV2X2dldF9kcnZkYXRhKGRldi0+Y2Rldi5kZXYpOwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNDMsMjQgKzQ1LDI0IEBACiAJaWYgKHZhbHVlID4gMjAgJiYgdmFsdWUgPCAzMjc2NykKIAkJY291bnQgPSAxMTkzMTgyIC8gdmFsdWU7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmVlcF9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5sb2NrLCBmbGFncyk7CiAKIAkvKiBFQlVTIHNwZWFrZXIgb25seSBoYXMgb24vb2ZmIHN0YXRlLCB0aGUgZnJlcXVlbmN5IGRvZXMgbm90CiAJICogYXBwZWFyIHRvIGJlIHByb2dyYW1tYWJsZS4KIAkgKi8KLQlpZiAoYmVlcF9pb2Jhc2UgJiAweDJVTCkKLQkJb3V0YighIWNvdW50LCBiZWVwX2lvYmFzZSk7CisJaWYgKHN0YXRlLT5pb2Jhc2UgJiAweDJVTCkKKwkJb3V0YighIWNvdW50LCBzdGF0ZS0+aW9iYXNlKTsKIAllbHNlCi0JCW91dGwoISFjb3VudCwgYmVlcF9pb2Jhc2UpOworCQlvdXRsKCEhY291bnQsIHN0YXRlLT5pb2Jhc2UpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmVlcF9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1NQQVJDNjQKIHN0YXRpYyBpbnQgaXNhX3Nwa3JfZXZlbnQoc3RydWN0IGlucHV0X2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgdHlwZSwgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKKwlzdHJ1Y3Qgc3BhcmNzcGtyX3N0YXRlICpzdGF0ZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPmNkZXYuZGV2KTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTc2LDI5ICs3OCwyOSBAQAogCWlmICh2YWx1ZSA+IDIwICYmIHZhbHVlIDwgMzI3NjcpCiAJCWNvdW50ID0gMTE5MzE4MiAvIHZhbHVlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJlZXBfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGNvdW50KSB7CiAJCS8qIGVuYWJsZSBjb3VudGVyIDIgKi8KLQkJb3V0YihpbmIoYmVlcF9pb2Jhc2UgKyAweDYxKSB8IDMsIGJlZXBfaW9iYXNlICsgMHg2MSk7CisJCW91dGIoaW5iKHN0YXRlLT5pb2Jhc2UgKyAweDYxKSB8IDMsIHN0YXRlLT5pb2Jhc2UgKyAweDYxKTsKIAkJLyogc2V0IGNvbW1hbmQgZm9yIGNvdW50ZXIgMiwgMiBieXRlIHdyaXRlICovCi0JCW91dGIoMHhCNiwgYmVlcF9pb2Jhc2UgKyAweDQzKTsKKwkJb3V0YigweEI2LCBzdGF0ZS0+aW9iYXNlICsgMHg0Myk7CiAJCS8qIHNlbGVjdCBkZXNpcmVkIEhaICovCi0JCW91dGIoY291bnQgJiAweGZmLCBiZWVwX2lvYmFzZSArIDB4NDIpOwotCQlvdXRiKChjb3VudCA+PiA4KSAmIDB4ZmYsIGJlZXBfaW9iYXNlICsgMHg0Mik7CisJCW91dGIoY291bnQgJiAweGZmLCBzdGF0ZS0+aW9iYXNlICsgMHg0Mik7CisJCW91dGIoKGNvdW50ID4+IDgpICYgMHhmZiwgc3RhdGUtPmlvYmFzZSArIDB4NDIpOwogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgY291bnRlciAyICovCi0JCW91dGIoaW5iX3AoYmVlcF9pb2Jhc2UgKyAweDYxKSAmIDB4RkMsIGJlZXBfaW9iYXNlICsgMHg2MSk7CisJCW91dGIoaW5iX3Aoc3RhdGUtPmlvYmFzZSArIDB4NjEpICYgMHhGQywgc3RhdGUtPmlvYmFzZSArIDB4NjEpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJlZXBfbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBzcGFyY3Nwa3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQorc3RhdGljIGludCBfX2RldmluaXQgc3BhcmNzcGtyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3Qgc3BhcmNzcGtyX3N0YXRlICpzdGF0ZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgZXJyb3I7CiAKQEAgLTEwNiwxOCArMTA4LDE4IEBACiAJaWYgKCFpbnB1dF9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5wdXRfZGV2LT5uYW1lID0gYmVlcF9uYW1lOworCWlucHV0X2Rldi0+bmFtZSA9IHN0YXRlLT5uYW1lOwogCWlucHV0X2Rldi0+cGh5cyA9ICJzcGFyYy9pbnB1dDAiOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19JU0E7CiAJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSAweDAwMWY7CiAJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOwogCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKLQlpbnB1dF9kZXYtPmNkZXYuZGV2ID0gJmRldi0+ZGV2OworCWlucHV0X2Rldi0+Y2Rldi5kZXYgPSBkZXY7CiAKIAlpbnB1dF9kZXYtPmV2Yml0WzBdID0gQklUKEVWX1NORCk7CiAJaW5wdXRfZGV2LT5zbmRiaXRbMF0gPSBCSVQoU05EX0JFTEwpIHwgQklUKFNORF9UT05FKTsKIAotCWlucHV0X2Rldi0+ZXZlbnQgPSBiZWVwX2V2ZW50OworCWlucHV0X2Rldi0+ZXZlbnQgPSBzdGF0ZS0+ZXZlbnQ7CiAKIAllcnJvciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwogCWlmIChlcnJvcikgewpAQCAtMTI1LDExMSArMTI3LDEzNyBAQAogCQlyZXR1cm4gZXJyb3I7CiAJfQogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBpbnB1dF9kZXYpOworCXN0YXRlLT5pbnB1dF9kZXYgPSBpbnB1dF9kZXY7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc3BhcmNzcGtyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzcGFyY3Nwa3JfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzcGFyY3Nwa3Jfc3RhdGUgKnN0YXRlID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2ID0gc3RhdGUtPmlucHV0X2RldjsKKworCS8qIHR1cm4gb2ZmIHRoZSBzcGVha2VyICovCisJc3RhdGUtPmV2ZW50KGlucHV0X2RldiwgRVZfU05ELCBTTkRfQkVMTCwgMCk7CiAKIAlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpbnB1dF9kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Ci0JLyogdHVybiBvZmYgdGhlIHNwZWFrZXIgKi8KLQliZWVwX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJa2ZyZWUoc3RhdGUpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNwYXJjc3Brcl9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNwYXJjc3Brcl9zaHV0ZG93bihzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHNwYXJjc3Brcl9zdGF0ZSAqc3RhdGUgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXYgPSBzdGF0ZS0+aW5wdXRfZGV2OworCiAJLyogdHVybiBvZmYgdGhlIHNwZWFrZXIgKi8KLQliZWVwX2V2ZW50KE5VTEwsIEVWX1NORCwgU05EX0JFTEwsIDApOworCXN0YXRlLT5ldmVudChpbnB1dF9kZXYsIEVWX1NORCwgU05EX0JFTEwsIDApOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwYXJjc3Brcl9wbGF0Zm9ybV9kcml2ZXIgPSB7Ci0JLmRyaXZlcgkJPSB7Ci0JCS5uYW1lCT0gInNwYXJjc3BrciIsCi0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAorc3RhdGljIGludCBfX2RldmluaXQgZWJ1c19iZWVwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gdG9fZWJ1c19kZXZpY2UoJmRldi0+ZGV2KTsKKwlzdHJ1Y3Qgc3BhcmNzcGtyX3N0YXRlICpzdGF0ZTsKKwlpbnQgZXJyOworCisJc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXRlLT5uYW1lID0gIlNwYXJjIEVCVVMgU3BlYWtlciI7CisJc3RhdGUtPmlvYmFzZSA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OworCXN0YXRlLT5ldmVudCA9IGVidXNfc3Brcl9ldmVudDsKKwlzcGluX2xvY2tfaW5pdCgmc3RhdGUtPmxvY2spOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgc3RhdGUpOworCisJZXJyID0gc3BhcmNzcGtyX3Byb2JlKCZkZXYtPmRldik7CisJaWYgKGVycikgeworCQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwkJa2ZyZWUoc3RhdGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBlYnVzX2JlZXBfbWF0Y2hbXSA9IHsKKwl7CisJCS5uYW1lID0gImJlZXAiLAogCX0sCi0JLnByb2JlCQk9IHNwYXJjc3Brcl9wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNwYXJjc3Brcl9yZW1vdmUpLAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgZWJ1c19iZWVwX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYmVlcCIsCisJLm1hdGNoX3RhYmxlCT0gZWJ1c19iZWVwX21hdGNoLAorCS5wcm9iZQkJPSBlYnVzX2JlZXBfcHJvYmUsCisJLnJlbW92ZQkJPSBzcGFyY3Nwa3JfcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHNwYXJjc3Brcl9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzcGFyY3Nwa3JfcGxhdGZvcm1fZGV2aWNlOwotCi1zdGF0aWMgaW50IF9faW5pdCBzcGFyY3Nwa3JfZHJ2X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGlzYV9iZWVwX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0JaW50IGVycm9yOworCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppZGV2ID0gdG9faXNhX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBzcGFyY3Nwa3Jfc3RhdGUgKnN0YXRlOworCWludCBlcnI7CiAKLQllcnJvciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3BhcmNzcGtyX3BsYXRmb3JtX2RyaXZlcik7Ci0JaWYgKGVycm9yKQotCQlyZXR1cm4gZXJyb3I7CisJc3RhdGUgPSBremFsbG9jKHNpemVvZigqc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwYXJjc3Brcl9wbGF0Zm9ybV9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNwYXJjc3BrciIsIC0xKTsKLQlpZiAoIXNwYXJjc3Brcl9wbGF0Zm9ybV9kZXZpY2UpIHsKLQkJZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIGVycl91bnJlZ2lzdGVyX2RyaXZlcjsKKwlzdGF0ZS0+bmFtZSA9ICJTcGFyYyBJU0EgU3BlYWtlciI7CisJc3RhdGUtPmlvYmFzZSA9IGlkZXYtPnJlc291cmNlLnN0YXJ0OworCXN0YXRlLT5ldmVudCA9IGlzYV9zcGtyX2V2ZW50OworCXNwaW5fbG9ja19pbml0KCZzdGF0ZS0+bG9jayk7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBzdGF0ZSk7CisKKwllcnIgPSBzcGFyY3Nwa3JfcHJvYmUoJmRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCQlrZnJlZShzdGF0ZSk7CiAJfQogCi0JZXJyb3IgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNwYXJjc3Brcl9wbGF0Zm9ybV9kZXZpY2UpOwotCWlmIChlcnJvcikKLQkJZ290byBlcnJfZnJlZV9kZXZpY2U7Ci0KIAlyZXR1cm4gMDsKLQotIGVycl9mcmVlX2RldmljZToKLQlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNwYXJjc3Brcl9wbGF0Zm9ybV9kZXZpY2UpOwotIGVycl91bnJlZ2lzdGVyX2RyaXZlcjoKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3BhcmNzcGtyX3BsYXRmb3JtX2RyaXZlcik7Ci0KLQlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlzYV9iZWVwX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJkbWEiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBpc2FfYmVlcF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImJlZXAiLAorCS5tYXRjaF90YWJsZQk9IGlzYV9iZWVwX21hdGNoLAorCS5wcm9iZQkJPSBpc2FfYmVlcF9wcm9iZSwKKwkucmVtb3ZlCQk9IHNwYXJjc3Brcl9yZW1vdmUsCisJLnNodXRkb3duCT0gc3BhcmNzcGtyX3NodXRkb3duLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgc3BhcmNzcGtyX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbGludXhfZWJ1cyAqZWJ1czsKLQlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgKmVkZXY7Ci0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSAqaXNhX2JyOwotCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlICppc2FfZGV2OwotI2VuZGlmCisJaW50IGVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmZWJ1c19iZWVwX2RyaXZlciwgJmVidXNfYnVzX3R5cGUpOwogCi0JZm9yX2VhY2hfZWJ1cyhlYnVzKSB7Ci0JCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCAiYmVlcCIpKSB7Ci0JCQkJYmVlcF9uYW1lID0gIlNwYXJjIEVCVVMgU3BlYWtlciI7Ci0JCQkJYmVlcF9ldmVudCA9IGVidXNfc3Brcl9ldmVudDsKLQkJCQliZWVwX2lvYmFzZSA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCQkJCXJldHVybiBzcGFyY3Nwa3JfZHJ2X2luaXQoKTsKLQkJCX0KLQkJfQorCWlmICghZXJyKSB7CisJCWVyciA9IG9mX3JlZ2lzdGVyX2RyaXZlcigmaXNhX2JlZXBfZHJpdmVyLCAmaXNhX2J1c190eXBlKTsKKwkJaWYgKGVycikKKwkJCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZlYnVzX2JlZXBfZHJpdmVyKTsKIAl9Ci0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQlmb3JfZWFjaF9pc2EoaXNhX2JyKSB7Ci0JCWZvcl9lYWNoX2lzYWRldihpc2FfZGV2LCBpc2FfYnIpIHsKLQkJCS8qIEEgaGFjaywgdGhlIGJlZXAgZGV2aWNlJ3MgYmFzZSBsaXZlcyBpbgotCQkJICogdGhlIERNQSBpc2Egbm9kZS4KLQkJCSAqLwotCQkJaWYgKCFzdHJjbXAoaXNhX2Rldi0+cHJvbV9uYW1lLCAiZG1hIikpIHsKLQkJCQliZWVwX25hbWUgPSAiU3BhcmMgSVNBIFNwZWFrZXIiOwotCQkJCWJlZXBfZXZlbnQgPSBpc2Ffc3Brcl9ldmVudCwKLQkJCQliZWVwX2lvYmFzZSA9IGlzYV9kZXYtPnJlc291cmNlLnN0YXJ0OwotCQkJCXJldHVybiBzcGFyY3Nwa3JfZHJ2X2luaXQoKTsKLQkJCX0KLQkJfQotCX0KLSNlbmRpZgogCi0JcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNwYXJjc3Brcl9leGl0KHZvaWQpCiB7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc3BhcmNzcGtyX3BsYXRmb3JtX2RldmljZSk7Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwYXJjc3Brcl9wbGF0Zm9ybV9kcml2ZXIpOworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZlYnVzX2JlZXBfZHJpdmVyKTsKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmaXNhX2JlZXBfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoc3BhcmNzcGtyX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi1zcGFyY2lvLmggYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXNwYXJjaW8uaAppbmRleCBlZDk0NDZmLi42ZDY2MzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXNwYXJjaW8uaAorKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLXNwYXJjaW8uaApAQCAtNzQsNyArNzQsNyBAQAogCiAJCWZvcl9lYWNoX2VidXMoZWJ1cykgewogCQkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCAiODA0MiIpKQorCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgIjgwNDIiKSkKIAkJCQkJZ290byBlZGV2X2ZvdW5kOwogCQkJfQogCQl9CkBAIC04MiwxNCArODIsMTQgQEAKIAogCWVkZXZfZm91bmQ6CiAJCWZvcl9lYWNoX2VkZXZjaGlsZChlZGV2LCBjaGlsZCkgewotCQkJaWYgKCFzdHJjbXAoY2hpbGQtPnByb21fbmFtZSwgT0JQX1BTMktCRF9OQU1FMSkgfHwKLQkJCSAgICAhc3RyY21wKGNoaWxkLT5wcm9tX25hbWUsIE9CUF9QUzJLQkRfTkFNRTIpKSB7CisJCQlpZiAoIXN0cmNtcChjaGlsZC0+cHJvbV9ub2RlLT5uYW1lLCBPQlBfUFMyS0JEX05BTUUxKSB8fAorCQkJICAgICFzdHJjbXAoY2hpbGQtPnByb21fbm9kZS0+bmFtZSwgT0JQX1BTMktCRF9OQU1FMikpIHsKIAkJCQlpODA0Ml9rYmRfaXJxID0gY2hpbGQtPmlycXNbMF07CiAJCQkJa2JkX2lvYmFzZSA9CiAJCQkJCWlvcmVtYXAoY2hpbGQtPnJlc291cmNlWzBdLnN0YXJ0LCA4KTsKIAkJCX0KLQkJCWlmICghc3RyY21wKGNoaWxkLT5wcm9tX25hbWUsIE9CUF9QUzJNU19OQU1FMSkgfHwKLQkJCSAgICAhc3RyY21wKGNoaWxkLT5wcm9tX25hbWUsIE9CUF9QUzJNU19OQU1FMikpCisJCQlpZiAoIXN0cmNtcChjaGlsZC0+cHJvbV9ub2RlLT5uYW1lLCBPQlBfUFMyTVNfTkFNRTEpIHx8CisJCQkgICAgIXN0cmNtcChjaGlsZC0+cHJvbV9ub2RlLT5uYW1lLCBPQlBfUFMyTVNfTkFNRTIpKQogCQkJCWk4MDQyX2F1eF9pcnEgPSBjaGlsZC0+aXJxc1swXTsKIAkJfQogCQlpZiAoaTgwNDJfa2JkX2lycSA9PSAtMSB8fApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwppbmRleCAxNjFhZmRkLi4zODYwMjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2Fkczc4NDYuYwpAQCAtNzczLDggKzc3Myw3IEBACiAKIAl0cy0+bGFzdF9tc2cgPSBtOwogCi0JaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwKLQkJCVNBX1NBTVBMRV9SQU5ET00gfCBTQV9UUklHR0VSX0ZBTExJTkcsCisJaWYgKHJlcXVlc3RfaXJxKHNwaS0+aXJxLCBhZHM3ODQ2X2lycSwgU0FfVFJJR0dFUl9GQUxMSU5HLAogCQkJc3BpLT5kZXYuZHJpdmVyLT5uYW1lLCB0cykpIHsKIAkJZGV2X2RiZygmc3BpLT5kZXYsICJpcnEgJWQgYnVzeT9cbiIsIHNwaS0+aXJxKTsKIAkJZXJyID0gLUVCVVNZOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCmluZGV4IGExOGQ1NmIuLmE1OTVkMzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2gzNjAwX3RzX2lucHV0LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9oMzYwMF90c19pbnB1dC5jCkBAIC0zOTksMTYgKzM5OSwxNCBAQAogCXNldF9HUElPX0lSUV9lZGdlKEdQSU9fQklUU1lfTlBPV0VSX0JVVFRPTiwgR1BJT19SSVNJTkdfRURHRSk7CiAKIAlpZiAocmVxdWVzdF9pcnEoSVJRX0dQSU9fQklUU1lfQUNUSU9OX0JVVFRPTiwgYWN0aW9uX2J1dHRvbl9oYW5kbGVyLAotCQkJU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQgfCBTQV9TQU1QTEVfUkFORE9NLAotCQkJImgzNjAwX2FjdGlvbiIsICZ0cy0+ZGV2KSkgeworCQkJU0FfU0hJUlEgfCBTQV9JTlRFUlJVUFQsICJoMzYwMF9hY3Rpb24iLCAmdHMtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoMzYwMHRzLmM6IENvdWxkIG5vdCBhbGxvY2F0ZSBBY3Rpb24gQnV0dG9uIElSUSFcbiIpOwogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZmFpbDI7CiAJfQogCiAJaWYgKHJlcXVlc3RfaXJxKElSUV9HUElPX0JJVFNZX05QT1dFUl9CVVRUT04sIG5wb3dlcl9idXR0b25faGFuZGxlciwKLQkJCVNBX1NISVJRIHwgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwKLQkJCSJoMzYwMF9zdXNwZW5kIiwgJnRzLT5kZXYpKSB7CisJCQlTQV9TSElSUSB8IFNBX0lOVEVSUlVQVCwgImgzNjAwX3N1c3BlbmQiLCAmdHMtPmRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoMzYwMHRzLmM6IENvdWxkIG5vdCBhbGxvY2F0ZSBQb3dlciBCdXR0b24gSVJRIVxuIik7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBmYWlsMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9jYXBpL2NhcGlmcy5jIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKaW5kZXggMGEzN2FkZS4uOWVhNmJkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKKysrIGIvZHJpdmVycy9pc2RuL2NhcGkvY2FwaWZzLmMKQEAgLTEyMSwxMCArMTIxLDEwIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNhcGlmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgY2FwaWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgY2FwaWZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBjYXBpZnNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGNhcGlmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX2NvbW1vbi5jCmluZGV4IDIyNzU5YzAuLjgxYWNjZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9jb21tb24uYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fY29tbW9uLmMKQEAgLTExNzcsOSArMTE3Nyw4IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQljaGlkeCA9IGlzZG5fbWlub3IyY2hhbihtaW5vcik7Ci0JCXdoaWxlIChpc2RuX3dyaXRlYnVmX3N0dWIoZHJ2aWR4LCBjaGlkeCwgYnVmLCBjb3VudCkgIT0gY291bnQpCisJCXdoaWxlICgocmV0dmFsID0gaXNkbl93cml0ZWJ1Zl9zdHViKGRydmlkeCwgY2hpZHgsIGJ1ZiwgY291bnQpKSA9PSAwKQogCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGV2LT5kcnZbZHJ2aWR4XS0+c25kX3dhaXRxW2NoaWR4XSk7Ci0JCXJldHZhbCA9IGNvdW50OwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKG1pbm9yIDw9IElTRE5fTUlOT1JfQ1RSTE1BWCkgewpAQCAtMTk1MSw5ICsxOTUwLDEwIEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFsbG9jX3NrYihobCArIGxlbiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAoIXNrYikKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU5PTUVNOwogCXNrYl9yZXNlcnZlKHNrYiwgaGwpOwotCWNvcHlfZnJvbV91c2VyKHNrYl9wdXQoc2tiLCBsZW4pLCBidWYsIGxlbik7CisJaWYgKGNvcHlfZnJvbV91c2VyKHNrYl9wdXQoc2tiLCBsZW4pLCBidWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOwogCXJldCA9IGRldi0+ZHJ2W2RydmlkeF0tPmludGVyZmFjZS0+d3JpdGVidWZfc2tiKGRydmlkeCwgY2hhbiwgMSwgc2tiKTsKIAlpZiAocmV0IDw9IDApCiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9zYy9pb2N0bC5jIGIvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKaW5kZXggZjRmNzEyMi4uNTdjNGFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKKysrIGIvZHJpdmVycy9pc2RuL3NjL2lvY3RsLmMKQEAgLTk3LDYgKzk3LDcgQEAKIAogCWNhc2UgU0NJT0NTVEFSVDoKIAl7CisJCWtmcmVlKHJjdm1zZyk7CiAJCXByX2RlYnVnKCIlczogU0NJT1NUQVJUOiBpb2N0bCByZWNlaXZlZFxuIiwKIAkJCQlzY19hZGFwdGVyW2NhcmRdLT5kZXZpY2VuYW1lKTsKIAkJaWYoc2NfYWRhcHRlcltjYXJkXS0+RW5naW5lVXApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9LY29uZmlnIGIvZHJpdmVycy9sZWRzL0tjb25maWcKaW5kZXggNjI2NTA2Mi4uOTY1MDk5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL0tjb25maWcKKysrIGIvZHJpdmVycy9sZWRzL0tjb25maWcKQEAgLTYzLDYgKzYzLDEyIEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIExFRHMgY29ubmVjdGVkIHRvIEdQSU8gbGluZXMKIAkgIG9uIFNhbXN1bmcgUzNDMjRYWCBzZXJpZXMgQ1BVcywgc3VjaCBhcyB0aGUgUzNDMjQxMCBhbmQgUzNDMjQ0MC4KIAorY29uZmlnIExFRFNfQU1TX0RFTFRBCisJdHJpc3RhdGUgIkxFRCBTdXBwb3J0IGZvciB0aGUgQW1zdHJhZCBEZWx0YSAoRTMpIgorCWRlcGVuZHMgTEVEU19DTEFTUyAmJiBNQUNIX0FNU19ERUxUQQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIExFRHMgb24gQW1zdHJhZCBEZWx0YSAoRTMpLgorCiBjb21tZW50ICJMRUQgVHJpZ2dlcnMiCiAKIGNvbmZpZyBMRURTX1RSSUdHRVJTCkBAIC04Nyw1ICs5MywxNCBAQAogCSAgVGhpcyBhbGxvd3MgTEVEcyB0byBiZSBjb250cm9sbGVkIGJ5IElERSBkaXNrIGFjdGl2aXR5LgogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIExFRFNfVFJJR0dFUl9IRUFSVEJFQVQKKwl0cmlzdGF0ZSAiTEVEIEhlYXJ0YmVhdCBUcmlnZ2VyIgorCWRlcGVuZHMgTEVEU19UUklHR0VSUworCWhlbHAKKwkgIFRoaXMgYWxsb3dzIExFRHMgdG8gYmUgY29udHJvbGxlZCBieSBhIENQVSBsb2FkIGF2ZXJhZ2UuCisJICBUaGUgZmxhc2ggZnJlcXVlbmN5IGlzIGEgaHlwZXJib2xpYyBmdW5jdGlvbiBvZiB0aGUgMS1taW51dGUKKwkgIGxvYWQgYXZlcmFnZS4KKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKIGVuZG1lbnUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL01ha2VmaWxlIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCmluZGV4IDQwZjA0MjYuLjg4ZDNiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKQEAgLTExLDcgKzExLDkgQEAKIG9iai0kKENPTkZJR19MRURTX0lYUDRYWCkJCSs9IGxlZHMtaXhwNHh4LWdwaW8ubwogb2JqLSQoQ09ORklHX0xFRFNfVE9TQSkJCQkrPSBsZWRzLXRvc2Eubwogb2JqLSQoQ09ORklHX0xFRFNfUzNDMjRYWCkJCSs9IGxlZHMtczNjMjR4eC5vCitvYmotJChDT05GSUdfTEVEU19BTVNfREVMVEEpCQkrPSBsZWRzLWFtcy1kZWx0YS5vCiAKICMgTEVEIFRyaWdnZXJzCiBvYmotJChDT05GSUdfTEVEU19UUklHR0VSX1RJTUVSKQkrPSBsZWR0cmlnLXRpbWVyLm8KIG9iai0kKENPTkZJR19MRURTX1RSSUdHRVJfSURFX0RJU0spCSs9IGxlZHRyaWctaWRlLWRpc2subworb2JqLSQoQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQpCSs9IGxlZHRyaWctaGVhcnRiZWF0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLWFtcy1kZWx0YS5jIGIvZHJpdmVycy9sZWRzL2xlZHMtYW1zLWRlbHRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMDYxMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLWFtcy1kZWx0YS5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogTEVEcyBkcml2ZXIgZm9yIEFtc3RyYWQgRGVsdGEgKEUzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBKb25hdGhhbiBNY0Rvd2VsbCA8bm9vZGxlc0BlYXJ0aC5saT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JvYXJkLWFtcy1kZWx0YS5oPgorCisvKgorICogT3VyIGNvbnRleHQKKyAqLworc3RydWN0IGFtc19kZWx0YV9sZWQgeworCXN0cnVjdCBsZWRfY2xhc3NkZXYJY2RldjsKKwl1OAkJCWJpdG1hc2s7Cit9OworCitzdGF0aWMgdm9pZCBhbXNfZGVsdGFfbGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgYW1zX2RlbHRhX2xlZCAqbGVkX2RldiA9CisJCWNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGFtc19kZWx0YV9sZWQsIGNkZXYpOworCisJaWYgKHZhbHVlKQorCQlhbXNfZGVsdGFfbGF0Y2gxX3dyaXRlKGxlZF9kZXYtPmJpdG1hc2ssIGxlZF9kZXYtPmJpdG1hc2spOworCWVsc2UKKwkJYW1zX2RlbHRhX2xhdGNoMV93cml0ZShsZWRfZGV2LT5iaXRtYXNrLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBhbXNfZGVsdGFfbGVkIGFtc19kZWx0YV9sZWRzW10gPSB7CisJeworCQkuY2RldgkJPSB7CisJCQkubmFtZQkJPSAiYW1zLWRlbHRhOmNhbWVyYSIsCisJCQkuYnJpZ2h0bmVzc19zZXQgPSBhbXNfZGVsdGFfbGVkX3NldCwKKwkJfSwKKwkJLmJpdG1hc2sJPSBBTVNfREVMVEFfTEFUQ0gxX0xFRF9DQU1FUkEsCisJfSwKKwl7CisJCS5jZGV2CQk9IHsKKwkJCS5uYW1lCQk9ICJhbXMtZGVsdGE6YWR2ZXJ0IiwKKwkJCS5icmlnaHRuZXNzX3NldCA9IGFtc19kZWx0YV9sZWRfc2V0LAorCQl9LAorCQkuYml0bWFzawk9IEFNU19ERUxUQV9MQVRDSDFfTEVEX0FEVkVSVCwKKwl9LAorCXsKKwkJLmNkZXYJCT0geworCQkJLm5hbWUJCT0gImFtcy1kZWx0YTplbWFpbCIsCisJCQkuYnJpZ2h0bmVzc19zZXQgPSBhbXNfZGVsdGFfbGVkX3NldCwKKwkJfSwKKwkJLmJpdG1hc2sJPSBBTVNfREVMVEFfTEFUQ0gxX0xFRF9FTUFJTCwKKwl9LAorCXsKKwkJLmNkZXYJCT0geworCQkJLm5hbWUJCT0gImFtcy1kZWx0YTpoYW5kc2ZyZWUiLAorCQkJLmJyaWdodG5lc3Nfc2V0ID0gYW1zX2RlbHRhX2xlZF9zZXQsCisJCX0sCisJCS5iaXRtYXNrCT0gQU1TX0RFTFRBX0xBVENIMV9MRURfSEFORFNGUkVFLAorCX0sCisJeworCQkuY2RldgkJPSB7CisJCQkubmFtZQkJPSAiYW1zLWRlbHRhOnZvaWNlbWFpbCIsCisJCQkuYnJpZ2h0bmVzc19zZXQgPSBhbXNfZGVsdGFfbGVkX3NldCwKKwkJfSwKKwkJLmJpdG1hc2sJPSBBTVNfREVMVEFfTEFUQ0gxX0xFRF9WT0lDRU1BSUwsCisJfSwKKwl7CisJCS5jZGV2CQk9IHsKKwkJCS5uYW1lCQk9ICJhbXMtZGVsdGE6dm9pY2UiLAorCQkJLmJyaWdodG5lc3Nfc2V0ID0gYW1zX2RlbHRhX2xlZF9zZXQsCisJCX0sCisJCS5iaXRtYXNrCT0gQU1TX0RFTFRBX0xBVENIMV9MRURfVk9JQ0UsCisJfSwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYW1zX2RlbHRhX2xlZF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJcG1fbWVzc2FnZV90IHN0YXRlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYW1zX2RlbHRhX2xlZHMpOyBpKyspCisJCWxlZF9jbGFzc2Rldl9zdXNwZW5kKCZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtc19kZWx0YV9sZWRfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFtc19kZWx0YV9sZWRzKTsgaSsrKQorCQlsZWRfY2xhc3NkZXZfcmVzdW1lKCZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgYW1zX2RlbHRhX2xlZF9zdXNwZW5kIE5VTEwKKyNkZWZpbmUgYW1zX2RlbHRhX2xlZF9yZXN1bWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBpbnQgYW1zX2RlbHRhX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCWludCByZXQ7CisKKwlmb3IgKGkgPSByZXQgPSAwOyByZXQgPj0gMCAmJiBpIDwgQVJSQVlfU0laRShhbXNfZGVsdGFfbGVkcyk7IGkrKykgeworCQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkmYW1zX2RlbHRhX2xlZHNbaV0uY2Rldik7CisJfQorCisJaWYgKHJldCA8IDAgJiYgaSA+IDEpIHsKKwkJZm9yIChpID0gaSAtIDI7IGkgPj0gMDsgaS0tKQorCQkJbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJmFtc19kZWx0YV9sZWRzW2ldLmNkZXYpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1zX2RlbHRhX2xlZF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IEFSUkFZX1NJWkUoYW1zX2RlbHRhX2xlZHMpIC0gMTsgaSA+PSAwOyBpLS0pCisJCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZhbXNfZGVsdGFfbGVkc1tpXS5jZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhbXNfZGVsdGFfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYW1zX2RlbHRhX2xlZF9wcm9iZSwKKwkucmVtb3ZlCQk9IGFtc19kZWx0YV9sZWRfcmVtb3ZlLAorCS5zdXNwZW5kCT0gYW1zX2RlbHRhX2xlZF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYW1zX2RlbHRhX2xlZF9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lID0gImFtcy1kZWx0YS1sZWQiLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbXNfZGVsdGFfbGVkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhbXNfZGVsdGFfbGVkX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbXNfZGVsdGFfbGVkX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFtc19kZWx0YV9sZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYW1zX2RlbHRhX2xlZF9pbml0KTsKK21vZHVsZV9leGl0KGFtc19kZWx0YV9sZWRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkpvbmF0aGFuIE1jRG93ZWxsIDxub29kbGVzQGVhcnRoLmxpPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbXN0cmFkIERlbHRhIExFRCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWhlYXJ0YmVhdC5jIGIvZHJpdmVycy9sZWRzL2xlZHRyaWctaGVhcnRiZWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJmOGNlYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbGVkcy9sZWR0cmlnLWhlYXJ0YmVhdC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogTEVEIEhlYXJ0YmVhdCBUcmlnZ2VyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPgorICoKKyAqIEJhc2VkIG9uIFJpY2hhcmQgUHVyZGllJ3MgbGVkdHJpZy10aW1lci5jIGFuZCBzb21lIGFyY2gncworICogQ09ORklHX0hFQVJUQkVBVCBjb2RlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSAibGVkcy5oIgorCitzdHJ1Y3QgaGVhcnRiZWF0X3RyaWdfZGF0YSB7CisJdW5zaWduZWQgaW50IHBoYXNlOworCXVuc2lnbmVkIGludCBwZXJpb2Q7CisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Cit9OworCitzdGF0aWMgdm9pZCBsZWRfaGVhcnRiZWF0X2Z1bmN0aW9uKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICopIGRhdGE7CisJc3RydWN0IGhlYXJ0YmVhdF90cmlnX2RhdGEgKmhlYXJ0YmVhdF9kYXRhID0gbGVkX2NkZXYtPnRyaWdnZXJfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGJyaWdodG5lc3MgPSBMRURfT0ZGOworCXVuc2lnbmVkIGxvbmcgZGVsYXkgPSAwOworCisJLyogYWN0cyBsaWtlIGFuIGFjdHVhbCBoZWFydCBiZWF0IC0tIGllIHRodW1wLXRodW1wLXBhdXNlLi4uICovCisJc3dpdGNoIChoZWFydGJlYXRfZGF0YS0+cGhhc2UpIHsKKwljYXNlIDA6CisJCS8qCisJCSAqIFRoZSBoeXBlcmJvbGljIGZ1bmN0aW9uIGJlbG93IG1vZGlmaWVzIHRoZQorCQkgKiBoZWFydGJlYXQgcGVyaW9kIGxlbmd0aCBpbiBkZXBlbmRlbmN5IG9mIHRoZQorCQkgKiBjdXJyZW50ICgxbWluKSBsb2FkLiBJdCBnb2VzIHRocm91Z2ggdGhlIHBvaW50cworCQkgKiBmKDApPTEyNjAsIGYoMSk9ODYwLCBmKDUpPTUxMCwgZihpbmYpLT4zMDAuCisJCSAqLworCQloZWFydGJlYXRfZGF0YS0+cGVyaW9kID0gMzAwICsKKwkJCSg2NzIwIDw8IEZTSElGVCkgLyAoNSAqIGF2ZW5ydW5bMF0gKyAoNyA8PCBGU0hJRlQpKTsKKwkJaGVhcnRiZWF0X2RhdGEtPnBlcmlvZCA9CisJCQltc2Vjc190b19qaWZmaWVzKGhlYXJ0YmVhdF9kYXRhLT5wZXJpb2QpOworCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoNzApOworCQloZWFydGJlYXRfZGF0YS0+cGhhc2UrKzsKKwkJYnJpZ2h0bmVzcyA9IExFRF9GVUxMOworCQlicmVhazsKKwljYXNlIDE6CisJCWRlbGF5ID0gaGVhcnRiZWF0X2RhdGEtPnBlcmlvZCAvIDQgLSBtc2Vjc190b19qaWZmaWVzKDcwKTsKKwkJaGVhcnRiZWF0X2RhdGEtPnBoYXNlKys7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKDcwKTsKKwkJaGVhcnRiZWF0X2RhdGEtPnBoYXNlKys7CisJCWJyaWdodG5lc3MgPSBMRURfRlVMTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGVsYXkgPSBoZWFydGJlYXRfZGF0YS0+cGVyaW9kIC0gaGVhcnRiZWF0X2RhdGEtPnBlcmlvZCAvIDQgLQorCQkJbXNlY3NfdG9famlmZmllcyg3MCk7CisJCWhlYXJ0YmVhdF9kYXRhLT5waGFzZSA9IDA7CisJCWJyZWFrOworCX0KKworCWxlZF9zZXRfYnJpZ2h0bmVzcyhsZWRfY2RldiwgYnJpZ2h0bmVzcyk7CisJbW9kX3RpbWVyKCZoZWFydGJlYXRfZGF0YS0+dGltZXIsIGppZmZpZXMgKyBkZWxheSk7Cit9CisKK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF90cmlnX2FjdGl2YXRlKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KQoreworCXN0cnVjdCBoZWFydGJlYXRfdHJpZ19kYXRhICpoZWFydGJlYXRfZGF0YTsKKworCWhlYXJ0YmVhdF9kYXRhID0ga3phbGxvYyhzaXplb2YoKmhlYXJ0YmVhdF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZWFydGJlYXRfZGF0YSkKKwkJcmV0dXJuOworCisJbGVkX2NkZXYtPnRyaWdnZXJfZGF0YSA9IGhlYXJ0YmVhdF9kYXRhOworCXNldHVwX3RpbWVyKCZoZWFydGJlYXRfZGF0YS0+dGltZXIsCisJCSAgICBsZWRfaGVhcnRiZWF0X2Z1bmN0aW9uLCAodW5zaWduZWQgbG9uZykgbGVkX2NkZXYpOworCWhlYXJ0YmVhdF9kYXRhLT5waGFzZSA9IDA7CisJbGVkX2hlYXJ0YmVhdF9mdW5jdGlvbihoZWFydGJlYXRfZGF0YS0+dGltZXIuZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF90cmlnX2RlYWN0aXZhdGUoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJc3RydWN0IGhlYXJ0YmVhdF90cmlnX2RhdGEgKmhlYXJ0YmVhdF9kYXRhID0gbGVkX2NkZXYtPnRyaWdnZXJfZGF0YTsKKworCWlmIChoZWFydGJlYXRfZGF0YSkgeworCQlkZWxfdGltZXJfc3luYygmaGVhcnRiZWF0X2RhdGEtPnRpbWVyKTsKKwkJa2ZyZWUoaGVhcnRiZWF0X2RhdGEpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBsZWRfdHJpZ2dlciBoZWFydGJlYXRfbGVkX3RyaWdnZXIgPSB7CisJLm5hbWUgICAgID0gImhlYXJ0YmVhdCIsCisJLmFjdGl2YXRlID0gaGVhcnRiZWF0X3RyaWdfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUgPSBoZWFydGJlYXRfdHJpZ19kZWFjdGl2YXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGVhcnRiZWF0X3RyaWdfaW5pdCh2b2lkKQoreworCXJldHVybiBsZWRfdHJpZ2dlcl9yZWdpc3RlcigmaGVhcnRiZWF0X2xlZF90cmlnZ2VyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhlYXJ0YmVhdF90cmlnX2V4aXQodm9pZCkKK3sKKwlsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyKCZoZWFydGJlYXRfbGVkX3RyaWdnZXIpOworfQorCittb2R1bGVfaW5pdChoZWFydGJlYXRfdHJpZ19pbml0KTsKK21vZHVsZV9leGl0KGhlYXJ0YmVhdF90cmlnX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGVhcnRiZWF0IExFRCB0cmlnZ2VyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnIGIvZHJpdmVycy9tYWNpbnRvc2gvS2NvbmZpZwppbmRleCAxMmFkNDYyLi4zN2NkNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21hY2ludG9zaC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL0tjb25maWcKQEAgLTk5LDE3ICs5OSwyMiBAQAogCSAgZGV2aWNlcyBhcmUgbm90IGZ1bGx5IHN1cHBvcnRlZCBpbiB0aGUgYmF5IGFzIEkgbmV2ZXIgaGFkIG9uZSB0bwogCSAgdHJ5IHdpdGgKIAotIyBtYWRlIGEgc2VwYXJhdGUgb3B0aW9uIHNpbmNlIGJhY2tsaWdodCBtYXkgZW5kIHVwIGJlZWluZyB1c2VkCi0jIG9uIG5vbi1wb3dlcmJvb2sgbWFjaGluZXMgKGJ1dCBvbmx5IG9uIFBNVSBiYXNlZCBvbmVzIEFGQUlLKQogY29uZmlnIFBNQUNfQkFDS0xJR0hUCiAJYm9vbCAiQmFja2xpZ2h0IGNvbnRyb2wgZm9yIExDRCBzY3JlZW5zIgogCWRlcGVuZHMgb24gQURCX1BNVSAmJiAoQlJPS0VOIHx8ICFQUEM2NCkKIAloZWxwCi0JICBTYXkgWSBoZXJlIHRvIGJ1aWxkIGluIGNvZGUgdG8gbWFuYWdlIHRoZSBMQ0QgYmFja2xpZ2h0IG9uIGEKLQkgIE1hY2ludG9zaCBQb3dlckJvb2suICBXaXRoIHRoaXMgY29kZSwgdGhlIGJhY2tsaWdodCB3aWxsIGJlIHR1cm5lZAotCSAgb24gYW5kIG9mZiBhcHByb3ByaWF0ZWx5IG9uIHBvd2VyLW1hbmFnZW1lbnQgYW5kIGxpZC1vcGVuL2xpZC1jbG9zZWQKLQkgIGV2ZW50czsgYWxzbywgdGhlIFBvd2VyQm9vayBidXR0b24gZGV2aWNlIHdpbGwgYmUgZW5hYmxlZCBzbyB5b3UgY2FuCi0JICBjaGFuZ2UgdGhlIHNjcmVlbiBicmlnaHRuZXNzLgorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgTWFjaW50b3NoIHNwZWNpZmljIGV4dGVuc2lvbnMgb2YgdGhlIGdlbmVyaWMKKwkgIGJhY2tsaWdodCBjb2RlLiBXaXRoIHRoaXMgZW5hYmxlZCwgdGhlIGJyaWdodG5lc3Mga2V5cyBvbiBvbGRlcgorCSAgUG93ZXJCb29rcyB3aWxsIGJlIGVuYWJsZWQgc28geW91IGNhbiBjaGFuZ2UgdGhlIHNjcmVlbiBicmlnaHRuZXNzLgorCSAgTmV3ZXIgbW9kZWxzIHNob3VsZCB1c2UgYW4gdXNlcnNwYWNlIGRhZW1vbiBsaWtlIHBiYnV0dG9uc2QuCisKK2NvbmZpZyBQTUFDX0JBQ0tMSUdIVF9MRUdBQ1kKKwlib29sICJQcm92aWRlIGxlZ2FjeSBpb2N0bCdzIG9uIC9kZXYvcG11IGZvciB0aGUgYmFja2xpZ2h0IgorCWRlcGVuZHMgb24gUE1BQ19CQUNLTElHSFQgJiYgKEJST0tFTiB8fCAhUFBDNjQpCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGxlZ2FjeSBpb2N0bCdzIG9uIC9kZXYvcG11LiBUaGlzIGlzIGZvcgorCSAgcHJvZ3JhbXMgd2hpY2ggdXNlIHRoaXMgb2xkIGludGVyZmFjZS4gTmV3IGFuZCB1cGRhdGVkIHByb2dyYW1zCisJICBzaG91bGQgdXNlIHRoZSBiYWNrbGlnaHQgY2xhc3NlcyBpbiBzeXNmcy4KIAogY29uZmlnIEFEQl9NQUNJTwogCWJvb2wgIkluY2x1ZGUgTWFjSU8gKENIUlApIEFEQiBkcml2ZXIiCkBAIC0xNzEsNiArMTc2LDcgQEAKIAogY29uZmlnIFdJTkRGQVJNCiAJdHJpc3RhdGUgIk5ldyBQb3dlck1hYyB0aGVybWFsIGNvbnRyb2wgaW5mcmFzdHJ1Y3R1cmUiCisJZGVwZW5kcyBvbiBQUEMKIAogY29uZmlnIFdJTkRGQVJNX1BNODEKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgdGhlcm1hbCBtYW5hZ2VtZW50IG9uIGlNYWMgRzUiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9NYWtlZmlsZSBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCmluZGV4IDYwODFhY2QuLjg5NzJlNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL01ha2VmaWxlCkBAIC0xMiw2ICsxMiw3IEBACiBvYmotJChDT05GSUdfQU5TTENEKQkJKz0gYW5zLWxjZC5vCiAKIG9iai0kKENPTkZJR19BREJfUE1VKQkJKz0gdmlhLXBtdS5vCitvYmotJChDT05GSUdfUE1BQ19CQUNLTElHSFQpCSs9IHZpYS1wbXUtYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19BREJfQ1VEQSkJCSs9IHZpYS1jdWRhLm8KIG9iai0kKENPTkZJR19QTUFDX0FQTV9FTVUpCSs9IGFwbV9lbXUubwogb2JqLSQoQ09ORklHX1BNQUNfU01VKQkJKz0gc211Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL2FkYmhpZC5jIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKaW5kZXggMzk0MzM0ZS4uYzI2ZTEyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKKysrIGIvZHJpdmVycy9tYWNpbnRvc2gvYWRiaGlkLmMKQEAgLTUwMyw5ICs1MDMsNyBAQAogCWNhc2UgMHgxZjogLyogUG93ZXJib29rIGJ1dHRvbiBkZXZpY2UgKi8KIAkgIHsKIAkJaW50IGRvd24gPSAoZGF0YVsxXSA9PSAoZGF0YVsxXSAmIDB4ZikpOwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCQlpbnQgYmFja2xpZ2h0ID0gZ2V0X2JhY2tsaWdodF9sZXZlbCgpOwotI2VuZGlmCisKIAkJLyoKIAkJICogWFhYOiBXaGVyZSBpcyB0aGUgY29udHJhc3QgY29udHJvbCBmb3IgdGhlIHBhc3NpdmU/CiAJCSAqICAtLSBDb3J0CkBAIC01MzAsMjkgKzUyOCwxNyBAQAogCiAJCWNhc2UgMHhhOgkvKiBicmlnaHRuZXNzIGRlY3JlYXNlICovCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JCQlpZiAoIWRpc2FibGVfa2VybmVsX2JhY2tsaWdodCkgewotCQkJCWlmIChkb3duICYmIGJhY2tsaWdodCA+PSAwKSB7Ci0JCQkJCWlmIChiYWNrbGlnaHQgPiBCQUNLTElHSFRfT0ZGKQotCQkJCQkJc2V0X2JhY2tsaWdodF9sZXZlbChiYWNrbGlnaHQtMSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXNldF9iYWNrbGlnaHRfbGV2ZWwoQkFDS0xJR0hUX09GRik7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLworCQkJaWYgKCFkaXNhYmxlX2tlcm5lbF9iYWNrbGlnaHQgJiYgZG93bikKKwkJCQlwbWFjX2JhY2tsaWdodF9rZXlfZG93bigpOworI2VuZGlmCiAJCQlpbnB1dF9yZXBvcnRfa2V5KGFkYmhpZFtpZF0tPmlucHV0LCBLRVlfQlJJR0hUTkVTU0RPV04sIGRvd24pOwogCQkJYnJlYWs7CiAKIAkJY2FzZSAweDk6CS8qIGJyaWdodG5lc3MgaW5jcmVhc2UgKi8KICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkJCWlmICghZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0KSB7Ci0JCQkJaWYgKGRvd24gJiYgYmFja2xpZ2h0ID49IDApIHsKLQkJCQkJaWYgKGJhY2tsaWdodCA8IEJBQ0tMSUdIVF9NQVgpCi0JCQkJCQlzZXRfYmFja2xpZ2h0X2xldmVsKGJhY2tsaWdodCsxKTsKLQkJCQkJZWxzZSAKLQkJCQkJCXNldF9iYWNrbGlnaHRfbGV2ZWwoQkFDS0xJR0hUX01BWCk7Ci0JCQkJfQotCQkJfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLworCQkJaWYgKCFkaXNhYmxlX2tlcm5lbF9iYWNrbGlnaHQgJiYgZG93bikKKwkJCQlwbWFjX2JhY2tsaWdodF9rZXlfdXAoKTsKKyNlbmRpZgogCQkJaW5wdXRfcmVwb3J0X2tleShhZGJoaWRbaWRdLT5pbnB1dCwgS0VZX0JSSUdIVE5FU1NVUCwgZG93bik7CiAJCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS1iYWNrbGlnaHQuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtYmFja2xpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyZDA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUtYmFja2xpZ2h0LmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBCYWNrbGlnaHQgY29kZSBmb3IgdmlhLXBtdQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBQYXVsIE1hY2tlcnJhcyBhbmQgRmFiaW8gUmljY2FyZGkuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBCZW5qYW1pbiBIZXJyZW5zY2htaWR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgICAgICBNaWNoYWVsIEhhbnNlbG1hbm4gPGxpbnV4LWtlcm5lbEBoYW5zbWkuY2g+CisgKgorICovCisKKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvYWRiLmg+CisjaW5jbHVkZSA8bGludXgvcG11Lmg+CisjaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNkZWZpbmUgTUFYX1BNVV9MRVZFTCAweEZGCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKnZpYXM7CitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHBtdV9iYWNrbGlnaHRfZGF0YTsKKworc3RhdGljIGludCBwbXVfYmFja2xpZ2h0X2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQlpbnQgbGV2ZWwpCit7CisJaW50IHBtdWxldmVsOworCisJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlwbXVsZXZlbCA9IGluZm8tPmJsX2N1cnZlW2xldmVsXSAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfUE1VX0xFVkVMOworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJaWYgKHBtdWxldmVsIDwgMCkKKwkJcG11bGV2ZWwgPSAwOworCWVsc2UgaWYgKHBtdWxldmVsID4gTUFYX1BNVV9MRVZFTCkKKwkJcG11bGV2ZWwgPSBNQVhfUE1VX0xFVkVMOworCisJcmV0dXJuIHBtdWxldmVsOworfQorCitzdGF0aWMgaW50IHBtdV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwlpbnQgcG11bGV2ZWwsIGxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCisJaWYgKHZpYXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJbGV2ZWwgPSAwOworCisJcG11bGV2ZWwgPSBwbXVfYmFja2xpZ2h0X2dldF9sZXZlbF9icmlnaHRuZXNzKGluZm8sIGxldmVsKTsKKworCXBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIFBNVV9CQUNLTElHSFRfQlJJR0hULCBwbXVsZXZlbCk7CisJcG11X3dhaXRfY29tcGxldGUoJnJlcSk7CisKKwlwbXVfcmVxdWVzdCgmcmVxLCBOVUxMLCAyLCBQTVVfUE9XRVJfQ1RSTCwKKwkJUE1VX1BPV19CQUNLTElHSFQgfCAobGV2ZWwgPiAwID8gUE1VX1BPV19PTiA6IFBNVV9QT1dfT0ZGKSk7CisJcG11X3dhaXRfY29tcGxldGUoJnJlcSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbXVfYmFja2xpZ2h0X2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHBtdV9iYWNrbGlnaHRfZGF0YSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmdldF9icmlnaHRuZXNzCT0gcG11X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cwk9IHBtdV9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1cywKKwkubWF4X2JyaWdodG5lc3MJPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAorfTsKKwordm9pZCBfX2luaXQgcG11X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqaW5fdmlhcykKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJY2hhciBuYW1lWzEwXTsKKwlpbnQgbGV2ZWwsIGF1dG9zYXZlOworCisJdmlhcyA9IGluX3ZpYXM7CisKKwkvKiBTcGVjaWFsIGNhc2UgZm9yIHRoZSBvbGQgUG93ZXJCb29rIHNpbmNlIEkgY2FuJ3QgdGVzdCBvbiBpdCAqLworCWF1dG9zYXZlID0KKwkJbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM0MDAvMjQwMCIpIHx8CisJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCwzNTAwIik7CisKKwlpZiAoIWF1dG9zYXZlICYmCisJICAgICFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgicG11IikgJiYKKwkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikgJiYKKwkgICAgIW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpCisJCXJldHVybjsKKworCS8qIEFjdHVhbGx5LCB0aGlzIGlzIGEgaGFjaywgYnV0IEkgZG9uJ3Qga25vdyBvZiBhIGJldHRlciB3YXkKKwkgKiB0byBnZXQgdGhlIGZpcnN0IGZyYW1lYnVmZmVyIGRldmljZS4KKwkgKi8KKwlpbmZvID0gcmVnaXN0ZXJlZF9mYlswXTsKKwlpZiAoIWluZm8pIHsKKwkJcHJpbnRrKCJwbXVibDogTm8gZnJhbWVidWZmZXIgZm91bmRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInBtdWJsJWQiLCBpbmZvLT5ub2RlKTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBpbmZvLCAmcG11X2JhY2tsaWdodF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlwcmludGsoInBtdWJsOiBCYWNrbGlnaHQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCWluZm8tPmJsX2RldiA9IGJkOworCWZiX2JsX2RlZmF1bHRfY3VydmUoaW5mbywgMHg3RiwgMHg0NiwgMHgwRSk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlsZXZlbCA9IHBtdV9iYWNrbGlnaHRfZGF0YS5tYXhfYnJpZ2h0bmVzczsKKworCWlmIChhdXRvc2F2ZSkgeworCQkvKiByZWFkIGF1dG9zYXZlZCB2YWx1ZSBpZiBhdmFpbGFibGUgKi8KKwkJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKwkJcG11X3JlcXVlc3QoJnJlcSwgTlVMTCwgMiwgMHhkOSwgMCk7CisJCXBtdV93YWl0X2NvbXBsZXRlKCZyZXEpOworCisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJbGV2ZWwgPSBwbWFjX2JhY2tsaWdodF9jdXJ2ZV9sb29rdXAoaW5mbywKKwkJCQkocmVxLnJlcGx5WzBdID4+IDQpICoKKwkJCQlwbXVfYmFja2xpZ2h0X2RhdGEubWF4X2JyaWdodG5lc3MgLyAxNSk7CisJCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCX0KKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSBsZXZlbDsKKwliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOworCWRvd24oJmJkLT5zZW0pOworCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmICghcG1hY19iYWNrbGlnaHQpCisJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisKKwlwcmludGsoInBtdWJsOiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwppbmRleCAwYjVmZjU1Li4yYTM1NWFlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvdmlhLXBtdS5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3ZpYS1wbXUuYwpAQCAtMTQ0LDcgKzE0NCw2IEBACiBzdGF0aWMgaW50IGRhdGFfbGVuOwogc3RhdGljIHZvbGF0aWxlIGludCBhZGJfaW50X3BlbmRpbmc7CiBzdGF0aWMgdm9sYXRpbGUgaW50IGRpc2FibGVfcG9sbDsKLXN0YXRpYyBzdHJ1Y3QgYWRiX3JlcXVlc3QgYnJpZ2h0X3JlcV8xLCBicmlnaHRfcmVxXzI7CiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICp2aWFzOwogc3RhdGljIGludCBwbXVfa2luZCA9IFBNVV9VTktOT1dOOwogc3RhdGljIGludCBwbXVfZnVsbHlfaW5pdGVkID0gMDsKQEAgLTE2MSw3ICsxNjAsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QUEMzMikKIHN0YXRpYyBpbnQgb3B0aW9uX2xpZF93YWtldXAgPSAxOwogI2VuZGlmIC8qIENPTkZJR19QTSAmJiBDT05GSUdfUFBDMzIgKi8KLSNpZiAoZGVmaW5lZChDT05GSUdfUE0pJiZkZWZpbmVkKENPTkZJR19QUEMzMikpfHxkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVCkKKyNpZiAoZGVmaW5lZChDT05GSUdfUE0pJiZkZWZpbmVkKENPTkZJR19QUEMzMikpfHxkZWZpbmVkKENPTkZJR19QTUFDX0JBQ0tMSUdIVF9MRUdBQ1kpCiBzdGF0aWMgaW50IHNsZWVwX2luX3Byb2dyZXNzOwogI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBhc3luY19yZXFfbG9ja3M7CkBAIC0yMDgsMTAgKzIwNyw2IEBACiAJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCBwcm9jX2dldF9pcnFzdGF0cyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKIAkJCSAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi1zdGF0aWMgaW50IHBtdV9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCogZGF0YSk7Ci1zdGF0aWMgaW50IHBtdV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCogZGF0YSk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiBzdGF0aWMgdm9pZCBwbXVfcGFzc19pbnRyKHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBsZW4pOwogc3RhdGljIGludCBwcm9jX2dldF9iYXR0KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAogCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CkBAIC0yOTIsMTMgKzI4Nyw2IEBACiAJIkNvcmU5OSIKIH07CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgcG11X2JhY2tsaWdodF9jb250cm9sbGVyID0gewotCXBtdV9zZXRfYmFja2xpZ2h0X2VuYWJsZSwKLQlwbXVfc2V0X2JhY2tsaWdodF9sZXZlbAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQogaW50IF9faW5pdCBmaW5kX3ZpYV9wbXUodm9pZCkKIHsKIAl1NjQgdGFkZHI7CkBAIC00MTcsOCArNDA1LDYgQEAKIAlpZiAodmlhcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWJyaWdodF9yZXFfMS5jb21wbGV0ZSA9IDE7Ci0JYnJpZ2h0X3JlcV8yLmNvbXBsZXRlID0gMTsKIAliYXR0X3JlcS5jb21wbGV0ZSA9IDE7CiAKICNpZm5kZWYgQ09ORklHX1BQQ19NRVJHRQpAQCAtNDgzLDkgKzQ2OSw5IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JLyogRW5hYmxlIGJhY2tsaWdodCAqLwotCXJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKCZwbXVfYmFja2xpZ2h0X2NvbnRyb2xsZXIsIE5VTEwsICJwbXUiKTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwkvKiBJbml0aWFsaXplIGJhY2tsaWdodCAqLworCXBtdV9iYWNrbGlnaHRfaW5pdCh2aWFzKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAgIAlpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM0MDAvMjQwMCIpIHx8CkBAIC0xNDI0LDcgKzE0MTAsNyBAQAogI2lmZGVmIENPTkZJR19JTlBVVF9BREJISUQKIAkJCWlmICghZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0KQogI2VuZGlmIC8qIENPTkZJR19JTlBVVF9BREJISUQgKi8KLQkJCQlzZXRfYmFja2xpZ2h0X2xldmVsKGRhdGFbMV0gPj4gNCk7CisJCQkJcG1hY19iYWNrbGlnaHRfc2V0X2xlZ2FjeV9icmlnaHRuZXNzKGRhdGFbMV0gPj4gNCk7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAJfQogCS8qIFRpY2sgaW50ZXJydXB0ICovCkBAIC0xNjc0LDYxICsxNjYwLDYgQEAKIAlyZXR1cm4gSVJRX05PTkU7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X3RvX2JyaWdodFtdID0gewotCTB4N2YsIDB4NDYsIDB4NDIsIDB4M2UsIDB4M2EsIDB4MzYsIDB4MzIsIDB4MmUsCi0JMHgyYSwgMHgyNiwgMHgyMiwgMHgxZSwgMHgxYSwgMHgxNiwgMHgxMiwgMHgwZQotfTsKLSAKLXN0YXRpYyBpbnQKLXBtdV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCogZGF0YSkKLXsKLQlzdHJ1Y3QgYWRiX3JlcXVlc3QgcmVxOwotCQotCWlmICh2aWFzID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKG9uKSB7Ci0JCXBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIFBNVV9CQUNLTElHSFRfQlJJR0hULAotCQkJICAgIGJhY2tsaWdodF90b19icmlnaHRbbGV2ZWxdKTsKLQkJcG11X3dhaXRfY29tcGxldGUoJnJlcSk7Ci0JfQotCXBtdV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDIsIFBNVV9QT1dFUl9DVFJMLAotCQkgICAgUE1VX1BPV19CQUNLTElHSFQgfCAob24gPyBQTVVfUE9XX09OIDogUE1VX1BPV19PRkYpKTsKLSAgICAgICAJcG11X3dhaXRfY29tcGxldGUoJnJlcSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLXBtdV9icmlnaHRfY29tcGxldGUoc3RydWN0IGFkYl9yZXF1ZXN0ICpyZXEpCi17Ci0JaWYgKHJlcSA9PSAmYnJpZ2h0X3JlcV8xKQotCQljbGVhcl9iaXQoMSwgJmFzeW5jX3JlcV9sb2Nrcyk7Ci0JaWYgKHJlcSA9PSAmYnJpZ2h0X3JlcV8yKQotCQljbGVhcl9iaXQoMiwgJmFzeW5jX3JlcV9sb2Nrcyk7Ci19Ci0KLXN0YXRpYyBpbnQKLXBtdV9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCogZGF0YSkKLXsKLQlpZiAodmlhcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDEsICZhc3luY19yZXFfbG9ja3MpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlwbXVfcmVxdWVzdCgmYnJpZ2h0X3JlcV8xLCBwbXVfYnJpZ2h0X2NvbXBsZXRlLCAyLCBQTVVfQkFDS0xJR0hUX0JSSUdIVCwKLQkJYmFja2xpZ2h0X3RvX2JyaWdodFtsZXZlbF0pOwotCWlmICh0ZXN0X2FuZF9zZXRfYml0KDIsICZhc3luY19yZXFfbG9ja3MpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlwbXVfcmVxdWVzdCgmYnJpZ2h0X3JlcV8yLCBwbXVfYnJpZ2h0X2NvbXBsZXRlLCAyLCBQTVVfUE9XRVJfQ1RSTCwKLQkJICAgIFBNVV9QT1dfQkFDS0xJR0hUIHwgKGxldmVsID4gQkFDS0xJR0hUX09GRiA/Ci0JCQkJCSBQTVVfUE9XX09OIDogUE1VX1BPV19PRkYpKTsKLQotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwotCiB2b2lkCiBwbXVfZW5hYmxlX2lybGVkKGludCBvbikKIHsKQEAgLTIxNDUsOSArMjA3Niw4IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiBhc3luYyBiYWNrbGlnaHQgcmVxdWVzdHMgKi8KLQl3aGlsZSAoIWJyaWdodF9yZXFfMS5jb21wbGV0ZSB8fCAhYnJpZ2h0X3JlcV8yLmNvbXBsZXRlIHx8Ci0JCQkhYmF0dF9yZXEuY29tcGxldGUpCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiBhc3luYyByZXF1ZXN0cyAqLworCXdoaWxlICghYmF0dF9yZXEuY29tcGxldGUpCiAJCXBtdV9wb2xsKCk7CiAKIAkvKiBHaXZldXAgdGhlIGxhenkgRlBVICYgdmVjIHNvIHdlIGRvbid0IGhhdmUgdG8gYmFjayB0aGVtCkBAIC0yMjY4LDcgKzIxOTgsNyBAQAogIAkJX3NldF9MMkNSKHNhdmVfbDJjcik7CiAJCiAJLyogUmVzdG9yZSB1c2VybGFuZCBNTVUgY29udGV4dCAqLwotCXNldF9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dCwgY3VycmVudC0+YWN0aXZlX21tLT5wZ2QpOworCXNldF9jb250ZXh0KGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5pZCwgY3VycmVudC0+YWN0aXZlX21tLT5wZ2QpOwogCiAJLyogUG93ZXIgdGhpbmdzIHVwICovCiAJcG11X3VubG9jaygpOwpAQCAtMjM2Niw3ICsyMjk2LDcgQEAKICAJCV9zZXRfTDNDUihzYXZlX2wzY3IpOwogCQogCS8qIFJlc3RvcmUgdXNlcmxhbmQgTU1VIGNvbnRleHQgKi8KLQlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKKwlzZXRfY29udGV4dChjdXJyZW50LT5hY3RpdmVfbW0tPmNvbnRleHQuaWQsIGN1cnJlbnQtPmFjdGl2ZV9tbS0+cGdkKTsKIAogCS8qIFRlbGwgUE1VIHdlIGFyZSByZWFkeSAqLwogCXBtdV91bmxvY2soKTsKQEAgLTI2NzgsMjYgKzI2MDgsMzQgQEAKIAkJCXJldHVybiBwdXRfdXNlcigxLCBhcmdwKTsKICNlbmRpZiAvKiBDT05GSUdfUE0gJiYgQ09ORklHX1BQQzMyICovCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkvKiBCYWNrbGlnaHQgc2hvdWxkIGhhdmUgaXRzIG93biBkZXZpY2Ugb3IgZ28gdmlhCi0JICogdGhlIGZiZGV2Ci0JICovCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUX0xFR0FDWQorCS8qIENvbXBhdGliaWxpdHkgaW9jdGwncyBmb3IgYmFja2xpZ2h0ICovCiAJY2FzZSBQTVVfSU9DX0dFVF9CQUNLTElHSFQ6CisJeworCQlpbnQgYnJpZ2h0bmVzczsKKwogCQlpZiAoc2xlZXBfaW5fcHJvZ3Jlc3MpCiAJCQlyZXR1cm4gLUVCVVNZOwotCQllcnJvciA9IGdldF9iYWNrbGlnaHRfbGV2ZWwoKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCXJldHVybiBlcnJvcjsKLQkJcmV0dXJuIHB1dF91c2VyKGVycm9yLCBhcmdwKTsKKworCQlicmlnaHRuZXNzID0gcG1hY19iYWNrbGlnaHRfZ2V0X2xlZ2FjeV9icmlnaHRuZXNzKCk7CisJCWlmIChicmlnaHRuZXNzIDwgMCkKKwkJCXJldHVybiBicmlnaHRuZXNzOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIoYnJpZ2h0bmVzcywgYXJncCk7CisKKwl9CiAJY2FzZSBQTVVfSU9DX1NFVF9CQUNLTElHSFQ6CiAJewotCQlfX3UzMiB2YWx1ZTsKKwkJaW50IGJyaWdodG5lc3M7CisKIAkJaWYgKHNsZWVwX2luX3Byb2dyZXNzKQogCQkJcmV0dXJuIC1FQlVTWTsKLQkJZXJyb3IgPSBnZXRfdXNlcih2YWx1ZSwgYXJncCk7Ci0JCWlmICghZXJyb3IpCi0JCQllcnJvciA9IHNldF9iYWNrbGlnaHRfbGV2ZWwodmFsdWUpOwotCQlicmVhazsKKworCQllcnJvciA9IGdldF91c2VyKGJyaWdodG5lc3MsIGFyZ3ApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJcmV0dXJuIHBtYWNfYmFja2xpZ2h0X3NldF9sZWdhY3lfYnJpZ2h0bmVzcyhicmlnaHRuZXNzKTsKIAl9CiAjaWZkZWYgQ09ORklHX0lOUFVUX0FEQkhJRAogCWNhc2UgUE1VX0lPQ19HUkFCX0JBQ0tMSUdIVDogewpAQCAtMjcxMyw3ICsyNjUxLDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmIC8qIENPTkZJR19JTlBVVF9BREJISUQgKi8KLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKyNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFRfTEVHQUNZICovCiAJY2FzZSBQTVVfSU9DX0dFVF9NT0RFTDoKIAkgICAgCXJldHVybiBwdXRfdXNlcihwbXVfa2luZCwgYXJncCk7CiAJY2FzZSBQTVVfSU9DX0hBU19BREI6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL3JhaWQ2YWxnb3MuYyBiL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCmluZGV4IDUxYzYzYzAuLjkyNjU3NjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCisrKyBiL2RyaXZlcnMvbWQvcmFpZDZhbGdvcy5jCkBAIC0xMzksMTUgKzEzOSwxNCBAQAogCQl9CiAJfQogCi0JaWYgKCBiZXN0ICkKKwlpZiAoYmVzdCkgewogCQlwcmludGsoInJhaWQ2OiB1c2luZyBhbGdvcml0aG0gJXMgKCVsZCBNQi9zKVxuIiwKIAkJICAgICAgIGJlc3QtPm5hbWUsCiAJCSAgICAgICAoYmVzdHBlcmYqSFopID4+ICgyMC0xNitSQUlENl9USU1FX0pJRkZJRVNfTEcyKSk7Ci0JZWxzZQorCQlyYWlkNl9jYWxsID0gKmJlc3Q7CisJfSBlbHNlCiAJCXByaW50aygicmFpZDY6IFlpa2VzISAgTm8gYWxnb3JpdGhtIGZvdW5kIVxuIik7CiAKLQlyYWlkNl9jYWxsID0gKmJlc3Q7Ci0KIAlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXN5bmRyb21lcywgMSk7CiAKIAlyZXR1cm4gYmVzdCA/IDAgOiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9LY29uZmlnCmluZGV4IDM0NGQ4M2EuLjU4M2QxNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL0tjb25maWcKQEAgLTI1LDcgKzI1LDcgQEAKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2aWRlb2Rldi4KIAogY29uZmlnIFZJREVPX1Y0TDEKLQlib29sZWFuICJFbmFibGUgVmlkZW8gRm9yIExpbnV4IEFQSSAxIChERVBSRUNBVEVEKSIKKwlib29sICJFbmFibGUgVmlkZW8gRm9yIExpbnV4IEFQSSAxIChERVBSRUNBVEVEKSIKIAlkZXBlbmRzIG9uIFZJREVPX0RFVgogCXNlbGVjdCBWSURFT19WNEwxX0NPTVBBVAogCWRlZmF1bHQgeQpAQCAtMzYsNyArMzYsNyBAQAogCSAgSWYgeW91IGFyZSB1bnN1cmUgYXMgdG8gd2hldGhlciB0aGlzIGlzIHJlcXVpcmVkLCBhbnN3ZXIgWS4KIAogY29uZmlnIFZJREVPX1Y0TDFfQ09NUEFUCi0JYm9vbGVhbiAiRW5hYmxlIFZpZGVvIEZvciBMaW51eCBBUEkgMSBjb21wYXRpYmxlIExheWVyIgorCWJvb2wgIkVuYWJsZSBWaWRlbyBGb3IgTGludXggQVBJIDEgY29tcGF0aWJsZSBMYXllciIKIAlkZXBlbmRzIG9uIFZJREVPX0RFVgogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KQEAgLTgyLDYgKzgyLDkgQEAKIGNvbmZpZyBWSURFT19UVkVFUFJPTQogCXRyaXN0YXRlCiAKK2NvbmZpZyBWSURFT19DWDIzNDFYCisJdHJpc3RhdGUKKwogY29uZmlnIFVTQl9EQUJVU0IKIAl0cmlzdGF0ZSAiREFCVVNCIGRyaXZlciIKIAlkZXBlbmRzIG9uIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQppbmRleCA2MWI4OTYxLi44ZTc0NDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKIHNhYTcxNDYtb2JqcyAgICA6PSBzYWE3MTQ2X2kyYy5vIHNhYTcxNDZfY29yZS5vCi1zYWE3MTQ2X3Z2LW9ianMgOj0gc2FhNzE0Nl92dl9rc3ltcy5vIHNhYTcxNDZfZm9wcy5vIHNhYTcxNDZfdmlkZW8ubyBzYWE3MTQ2X2hscC5vIHNhYTcxNDZfdmJpLm8KK3NhYTcxNDZfdnYtb2JqcyA6PSBzYWE3MTQ2X2ZvcHMubyBzYWE3MTQ2X3ZpZGVvLm8gc2FhNzE0Nl9obHAubyBzYWE3MTQ2X3ZiaS5vCiBpci1jb21tb24tb2JqcyAgOj0gaXItZnVuY3Rpb25zLm8gaXIta2V5bWFwcy5vCiAKIG9iai0kKENPTkZJR19WSURFT19TQUE3MTQ2KSArPSBzYWE3MTQ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWZ1bmN0aW9ucy5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKaW5kZXggMzk3Y2ZmOC4uOGVhYTg4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vaXItZnVuY3Rpb25zLmMKQEAgLTI2OSw0ICsyNjksMyBAQAogICogYy1iYXNpYy1vZmZzZXQ6IDgKICAqIEVuZDoKICAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9pci1rZXltYXBzLmMKaW5kZXggYTI5NGQ1Yy4uY2E5OGQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vaXIta2V5bWFwcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL2lyLWtleW1hcHMuYwpAQCAtNjE4LDcgKzYxOCw3IEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX2VtX3RlcnJhdGVjKTsKIAotSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW1fcGlubmFjbGVfdXNiW0lSX0tFWVRBQl9TSVpFXSA9IHsKK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXlbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHgzYSBdID0gS0VZXzAsCiAJWyAweDMxIF0gPSBLRVlfMSwKIAlbIDB4MzIgXSA9IEtFWV8yLApAQCAtNjcwLDcgKzY3MCw3IEBACiAJWyAweDI3IF0gPSBLRVlfUkVDT1JELAogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfZW1fcGlubmFjbGVfdXNiKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXkpOwogCiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19mbHl2aWRlb1tJUl9LRVlUQUJfU0laRV0gPSB7CiAJWyAweDBmIF0gPSBLRVlfMCwKQEAgLTEyNjMsMzQgKzEyNjMsNTEgQEAKIAlbIDB4MGYgXSA9IEtFWV85LAogCiAJWyAweDAwIF0gPSBLRVlfUE9XRVIsCi0JWyAweDAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSAqLwotCVsgMHgxZSBdID0gS0VZX1ZJREVPLAorCVsgMHgxYiBdID0gS0VZX0FVRElPLCAgICAgICAgICAgLyogQXVkaW8gU291cmNlICovCisJWyAweDAyIF0gPSBLRVlfVFVORVIsCQkvKiBUVi9GTSwgbm90IG9uIFkwNDAwMDUyICovCisJWyAweDFlIF0gPSBLRVlfVklERU8sICAgICAgICAgICAvKiBWaWRlbyBTb3VyY2UgKi8KKwlbIDB4MTYgXSA9IEtFWV9JTkZPLCAgICAgICAgICAgIC8qIERpc3BsYXkgaW5mb3JtYXRpb24gKi8KIAlbIDB4MDQgXSA9IEtFWV9WT0xVTUVVUCwKIAlbIDB4MDggXSA9IEtFWV9WT0xVTUVET1dOLAogCVsgMHgwYyBdID0gS0VZX0NIQU5ORUxVUCwKIAlbIDB4MTAgXSA9IEtFWV9DSEFOTkVMRE9XTiwKIAlbIDB4MDMgXSA9IEtFWV9aT09NLAkJLyogZnVsbHNjcmVlbiAqLwotCVsgMHgxZiBdID0gS0VZX1NVQlRJVExFLAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KKwlbIDB4MWYgXSA9IEtFWV9URVhULAkJLyogY2xvc2VkIGNhcHRpb24vdGVsZXRleHQgKi8KIAlbIDB4MjAgXSA9IEtFWV9TTEVFUCwKKwlbIDB4MjkgXSA9IEtFWV9DTEVBUiwgICAgICAgICAgIC8qIGJvc3Mga2V5ICovCiAJWyAweDE0IF0gPSBLRVlfTVVURSwKIAlbIDB4MmIgXSA9IEtFWV9SRUQsCiAJWyAweDJjIF0gPSBLRVlfR1JFRU4sCiAJWyAweDJkIF0gPSBLRVlfWUVMTE9XLAogCVsgMHgyZSBdID0gS0VZX0JMVUUsCi0JWyAweDE4IF0gPSBLRVlfS1BQTFVTLAkJLyogZmluZSB0dW5lICsgKi8KLQlbIDB4MTkgXSA9IEtFWV9LUE1JTlVTLAkJLyogZmluZSB0dW5lIC0gKi8KKwlbIDB4MTggXSA9IEtFWV9LUFBMVVMsCQkvKiBmaW5lIHR1bmUgKyAsIG5vdCBvbiBZMDQwMDUyICovCisJWyAweDE5IF0gPSBLRVlfS1BNSU5VUywJCS8qIGZpbmUgdHVuZSAtICwgbm90IG9uIFkwNDAwNTIgKi8KKwlbIDB4MmEgXSA9IEtFWV9NRURJQSwgICAgICAgICAgIC8qIFBJUCAoUGljdHVyZSBpbiBwaWN0dXJlICovCiAJWyAweDIxIF0gPSBLRVlfRE9ULAogCVsgMHgxMyBdID0gS0VZX0VOVEVSLAotCVsgMHgyMiBdID0gS0VZX0JBQ0ssCisJWyAweDExIF0gPSBLRVlfTEFTVCwgICAgICAgICAgICAvKiBSZWNhbGwgKGxhc3QgY2hhbm5lbCAqLworCVsgMHgyMiBdID0gS0VZX1BSRVZJT1VTLAogCVsgMHgyMyBdID0gS0VZX1BMQVlQQVVTRSwKIAlbIDB4MjQgXSA9IEtFWV9ORVhULAorCVsgMHgyNSBdID0gS0VZX0FSQ0hJVkUsICAgICAgIC8qIFRpbWUgU2hpZnRpbmcgKi8KIAlbIDB4MjYgXSA9IEtFWV9TVE9QLAotCVsgMHgyNyBdID0gS0VZX1JFQ09SRAorCVsgMHgyNyBdID0gS0VZX1JFQ09SRCwKKwlbIDB4MjggXSA9IEtFWV9TQVZFLCAgICAgICAgICAvKiBTY3JlZW5zaG90ICovCisJWyAweDJmIF0gPSBLRVlfTUVOVSwKKwlbIDB4MzAgXSA9IEtFWV9DQU5DRUwsCisJWyAweDMxIF0gPSBLRVlfQ0hBTk5FTCwgICAgICAgLyogQ2hhbm5lbCBTdXJmICovCisJWyAweDMyIF0gPSBLRVlfU1VCVElUTEUsCisJWyAweDMzIF0gPSBLRVlfTEFOR1VBR0UsCisJWyAweDM0IF0gPSBLRVlfUkVXSU5ELAorCVsgMHgzNSBdID0gS0VZX0ZBU1RGT1JXQVJELAorCVsgMHgzNiBdID0gS0VZX1RWLAorCVsgMHgzNyBdID0gS0VZX1JBRElPLCAgICAgICAgIC8qIEZNICovCisJWyAweDM4IF0gPSBLRVlfRFZECiB9OwogCiBFWFBPUlRfU1lNQk9MX0dQTChpcl9jb2Rlc193aW5mYXN0KTsKIAotSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVbSVJfS0VZVEFCX1NJWkVdID0geworSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVfY29sb3JbSVJfS0VZVEFCX1NJWkVdID0gewogCVsgMHg1OSBdID0gS0VZX01VVEUsCiAJWyAweDRhIF0gPSBLRVlfUE9XRVIsCiAKQEAgLTEzNDgsNyArMTM2NSw3IEBACiAJWyAweDBhIF0gPSBLRVlfQkFDS1NQQUNFLAogfTsKIAotRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcGlubmFjbGUpOworRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfcGlubmFjbGVfY29sb3IpOwogCiAvKiBIYXVwcGF1Z2U6IHRoZSBuZXdlciwgZ3JheSByZW1vdGVzIChzZWVtcyB0aGVyZSBhcmUgbXVsdGlwbGUKICAqIHNsaWdodGx5IGRpZmZlcmVudCB2ZXJzaW9ucyksIHNoaXBwZWQgd2l0aCBjeDg4K2l2dHYgY2FyZHMuCkBAIC0xNDEzLDMgKzE0MzAsNDYgQEAKIAogRVhQT1JUX1NZTUJPTF9HUEwoaXJfY29kZXNfaGF1cHBhdWdlX25ldyk7CiAKK0lSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX25wZ3RlY2hbSVJfS0VZVEFCX1NJWkVdID0geworCVsgMHgxZCBdID0gS0VZX1NXSVRDSFZJREVPTU9ERSwgLyogc3dpdGNoIGlucHV0cyAqLworCVsgMHgyYSBdID0gS0VZX0ZST05ULAorCisJWyAweDNlIF0gPSBLRVlfMSwKKwlbIDB4MDIgXSA9IEtFWV8yLAorCVsgMHgwNiBdID0gS0VZXzMsCisJWyAweDBhIF0gPSBLRVlfNCwKKwlbIDB4MGUgXSA9IEtFWV81LAorCVsgMHgxMiBdID0gS0VZXzYsCisJWyAweDE2IF0gPSBLRVlfNywKKwlbIDB4MWEgXSA9IEtFWV84LAorCVsgMHgxZSBdID0gS0VZXzksCisJWyAweDNhIF0gPSBLRVlfMCwKKwlbIDB4MjIgXSA9IEtFWV9OVU1MT0NLLCAgICAgICAgIC8qIC0vLS0gKi8KKwlbIDB4MjAgXSA9IEtFWV9SRUZSRVNILAorCisJWyAweDAzIF0gPSBLRVlfQlJJR0hUTkVTU0RPV04sCisJWyAweDI4IF0gPSBLRVlfQVVESU8sCisJWyAweDNjIF0gPSBLRVlfVVAsCisJWyAweDNmIF0gPSBLRVlfTEVGVCwKKwlbIDB4MmUgXSA9IEtFWV9NVVRFLAorCVsgMHgzYiBdID0gS0VZX1JJR0hULAorCVsgMHgwMCBdID0gS0VZX0RPV04sCisJWyAweDA3IF0gPSBLRVlfQlJJR0hUTkVTU1VQLAorCVsgMHgyYyBdID0gS0VZX1RFWFQsCisKKwlbIDB4MzcgXSA9IEtFWV9SRUNPUkQsCisJWyAweDE3IF0gPSBLRVlfUExBWSwKKwlbIDB4MTMgXSA9IEtFWV9QQVVTRSwKKwlbIDB4MjYgXSA9IEtFWV9TVE9QLAorCVsgMHgxOCBdID0gS0VZX0ZBU1RGT1JXQVJELAorCVsgMHgxNCBdID0gS0VZX1JFV0lORCwKKwlbIDB4MzMgXSA9IEtFWV9aT09NLAorCVsgMHgzMiBdID0gS0VZX0tFWUJPQVJELAorCVsgMHgzMCBdID0gS0VZX0dPVE8sICAgICAgICAgICAgLyogUG9pbnRpbmcgYXJyb3cgKi8KKwlbIDB4MzYgXSA9IEtFWV9NQUNSTywgICAgICAgICAgIC8qIE1heGltaXplL01pbmltaXplICh5ZWxsb3cpICovCisJWyAweDBiIF0gPSBLRVlfUkFESU8sCisJWyAweDEwIF0gPSBLRVlfUE9XRVIsCisKK307CisKK0VYUE9SVF9TWU1CT0xfR1BMKGlyX2NvZGVzX25wZ3RlY2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9mb3BzLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwppbmRleCA1MjNhYjM4Li4wMDI3YWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2ZvcHMuYwpAQCAtNTAxLDYgKzUwMSw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfdnZfaW5pdCk7CiAKIGludCBzYWE3MTQ2X3Z2X3JlbGVhc2Uoc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCiB7CkBAIC01MTUsNiArNTE2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl92dl9yZWxlYXNlKTsKIAogaW50IHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB2aWRlb19kZXZpY2UgKip2aWQsIHN0cnVjdCBzYWE3MTQ2X2RldiogZGV2LAogCQkJICAgIGNoYXIgKm5hbWUsIGludCB0eXBlKQpAQCAtNTUzLDYgKzU1NSw3IEBACiAJKnZpZCA9IHZmZDsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKTsKIAogaW50IHNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKnZpZCwgc3RydWN0IHNhYTcxNDZfZGV2KiBkZXYpCiB7CkBAIC01NzEsNiArNTc0LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl91bnJlZ2lzdGVyX2RldmljZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHNhYTcxNDZfdnZfaW5pdF9tb2R1bGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X2hscC5jCmluZGV4IDMzYmVjOGEuLjIwOTJlNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfaGxwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl9obHAuYwpAQCAtNjQxLDYgKzY0MSw3IEBACiAJdnYtPmN1cnJlbnRfaHBzX3NvdXJjZSA9IHNvdXJjZTsKIAl2di0+Y3VycmVudF9ocHNfc3luYyA9IHN5bmM7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKTsKIAogaW50IHNhYTcxNDZfZW5hYmxlX292ZXJsYXkoc3RydWN0IHNhYTcxNDZfZmggKmZoKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vc2FhNzE0Nl92aWRlby5jCmluZGV4IGU3MDc5ZDEuLjgzOTNkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3ZpZGVvLmMKQEAgLTMxOCw2ICszMTgsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcpOwogCiBpbnQgc2FhNzE0Nl9zdG9wX3ByZXZpZXcoc3RydWN0IHNhYTcxNDZfZmggKmZoKQogewpAQCAtMzUyLDYgKzM1Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfc3RvcF9wcmV2aWV3KTsKIAogc3RhdGljIGludCBzX2ZtdChzdHJ1Y3Qgc2FhNzE0Nl9maCAqZmgsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdnZfa3N5bXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3NhYTcxNDZfdnZfa3N5bXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIyMjZlYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL2NvbW1vbi9zYWE3MTQ2X3Z2X2tzeW1zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc2FhNzE0Nl92di5oPgotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3N0YXJ0X3ByZXZpZXcpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl9zdG9wX3ByZXZpZXcpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3NldF9ocHNfc291cmNlX2FuZF9zeW5jKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfcmVnaXN0ZXJfZGV2aWNlKTsKLUVYUE9SVF9TWU1CT0xfR1BMKHNhYTcxNDZfdW5yZWdpc3Rlcl9kZXZpY2UpOwotCi1FWFBPUlRfU1lNQk9MX0dQTChzYWE3MTQ2X3Z2X2luaXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoc2FhNzE0Nl92dl9yZWxlYXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1mZS10dW5lci5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKaW5kZXggOWM3ZjEyMi4uM2JlODdjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLWZlLXR1bmVyLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJzdHYwMjk3LmgiCiAjaW5jbHVkZSAibXQzMTIuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgorI2luY2x1ZGUgImxnX2gwNnhmLmgiCiAjaW5jbHVkZSAiZHZiLXBsbC5oIgogCiAvKiBsbmIgY29udHJvbCAqLwpAQCAtMTY2LDExICsxNjcsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYW1zdW5nX3RibXUyNDExMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IHNhbXN1bmdfdGJtdTI0MTEyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXU4IGJ1Zls0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKIAogCWRpdiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTI1OwogCkBAIC0xODEsOCArMTgzLDExIEBACiAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTAwMDAwKSBidWZbM10gfD0gMHgxMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CiAJCXJldHVybiAtRUlPOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQxLDcgKzI0Niw2IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AxLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHNhbXN1bmdfdGJtdTI0MTEyX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHNhbXN1bmdfdGJtdTI0MTEyX3BsbF9zZXQsCiB9OwogCiAvKiBkdmItdCBtdDM1MiAqLwpAQCAtMjY0LDExICsyNjgsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBzYW1zdW5nX3RkdGM5MjUxZGgwX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewogCXUzMiBkaXY7CiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybiAtRUlOVkFMOworCiAJI2RlZmluZSBJRl9GUkVRVUVOQ1l4NiAyMTcgICAgLyogNiAqIDM2LjE2NjY2NjY2NjY3TUh6ICovCiAJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKIApAQCAtMjc2LDE5ICsyODMsMTggQEAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPj0gMTYxMDAwMDAwICYmIHBhcmFtcy0+ZnJlcXVlbmN5IDw9IDQzOTAwMDAwMCkgYnMgPSAweDBhOwogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+PSA0NDcwMDAwMDAgJiYgcGFyYW1zLT5mcmVxdWVuY3kgPD0gODYzMDAwMDAwKSBicyA9IDB4MDg7CiAKLQlwbGxidWZbMF0gPSAweGMyOyAvKiBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzICovCisJcGxsYnVmWzBdID0gMHg2MTsKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKIAlwbGxidWZbMl0gPSBkaXYgJiAweGZmOwogCXBsbGJ1ZlszXSA9IDB4Y2M7CiAJcGxsYnVmWzRdID0gYnM7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIGludCBmbGV4Y29wX2ZlX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjaGFyKiBuYW1lKQpAQCAtMjk3LDU2ICszMDMsMjEgQEAKIAlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZShmdywgbmFtZSwgZmMtPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgbGdkdDMzMDNfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCSAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgbGdkdDMzMDNfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGZsZXhjb3BfZGV2aWNlICpmYyA9IGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9Ci0JCXsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwotCWludCBlcnI7Ci0KLQlkdmJfcGxsX2NvbmZpZ3VyZSgmZHZiX3BsbF90ZHZzX3R1YTYwMzQsYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7Ci0JZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAotCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKLQlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJsZ2R0MzMwMzogJXMgZXJyb3IgIgotCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJICAgX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQlidWZbMF0gPSAweDg2IHwgMHgxODsKLQlidWZbMV0gPSAweDUwOwotCW1zZy5sZW4gPSAyOwotCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKCZmYy0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImxnZHQzMzAzOiAlcyBlcnJvciAiCi0JCQkgICAiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCi0JCQkgICBfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRVJFTU9URUlPOwotCX0KLQotCXJldHVybiAwOworCXJldHVybiBsZ19oMDZ4Zl9wbGxfc2V0KGZlLCAmZmMtPmkyY19hZGFwLCBwYXJhbXMpOwogfQogCiBzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBhaXIycGNfYXRzY19oZDUwMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzICAgICAgID0gMHg1OSwKIAkuZGVtb2RfY2hpcCAgICAgICAgICA9IExHRFQzMzAzLAogCS5zZXJpYWxfbXBlZyAgICAgICAgID0gMHgwNCwKLQkucGxsX3NldCAgICAgICAgICAgICA9IGxnZHQzMzAzX3BsbF9zZXQsCiAJLmNsb2NrX3BvbGFyaXR5X2ZsaXAgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBzYW1zdW5nX3RibXZfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwYSwKLQkucGxsX2FkZHJlc3MgICAgICA9IDB4YzIsCi0JLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF9zYW1zdW5nX3RibXYsCiB9OwogCiBzdGF0aWMgc3RydWN0IGJjbTM1MTBfY29uZmlnIGFpcjJwY19hdHNjX2ZpcnN0X2dlbl9jb25maWcgPSB7CkBAIC0zNTQsNyArMzI1LDcgQEAKIAkucmVxdWVzdF9maXJtd2FyZSA9IGZsZXhjb3BfZmVfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKLXN0YXRpYyBpbnQgc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTggYnVmWzRdOwogCXUzMiBkaXY7CkBAIC0zNzEsNiArMzQyLDggQEAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNTUwMDAwKQogCQlidWZbM10gfD0gMHgwMjsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmZmMtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTM3OSw5ICszNTIsNTIgQEAKIHN0YXRpYyBzdHJ1Y3QgbXQzMTJfY29uZmlnIHNreXN0YXIyM19zYW1zdW5nX3RiZHUxODEzMl9jb25maWcgPSB7CiAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MGUsCi0JLnBsbF9zZXQgPSBza3lzdGFyMjNfc2Ftc3VuZ190YmR1MTgxMzJfcGxsX3NldCwKIH07CiAKK3N0YXRpYyBpbnQgYWxwc190ZGVlNF9zdHYwMjk3X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKK3sKKwlzdHJ1Y3QgZmxleGNvcF9kZXZpY2UgKmZjID0gZmUtPmR2Yi0+cHJpdjsKKwl1OCBidWZbNF07CisJdTE2IGRpdjsKKwlpbnQgcmV0OworCisvKiAgNjIuNSBrSHogKiAxMCAqLworI2RlZmluZSBSRUZfRlJFUSAgICA2MjUKKyNkZWZpbmUgRlJFUV9PRkZTRVQgMzYxMjUKKworCWRpdiA9ICgoZmVwLT5mcmVxdWVuY3kvMTAwMCArIEZSRVFfT0ZGU0VUICkgKiAxMCkgIC8gUkVGX0ZSRVE7IC8vIDQgTUh6ID0gNDAwMCBLSHoKKworCWJ1ZlswXSA9ICh1OCkoIGRpdiA+PiA4KSAmIDB4N2Y7CisJYnVmWzFdID0gKHU4KSAgICAgICAgZGl2ICYgMHhmZjsKKworLyogRihvc2MpID0gTiAqIFJlZmVyZW5jZSBGcmVxLiAoNjIuNSBrSHopCisgKiBieXRlIDIgOiAgMCBOMTQgTjEzIE4xMiBOMTEgTjEwIE45ICBOOAorICogYnl0ZSAzIDogTjcgTjYgIE41ICBONCAgTjMgIE4yICBOMSAgTjAKKyAqIGJ5dGUgNCA6IDEgICogICAqICAgQUdEIFIzICBSMiAgUjEgIFIwCisgKiBieXRlIDUgOiBDMSAqICAgUkUgIFJUUyBCUzQgQlMzIEJTMiBCUzEKKyAqIEFHRCA9IDEsIFIzIFIyIFIxIFIwID0gMCAxIDAgMSA9PiBieXRlIDQgPSAxKioxMDEwMSA9IDB4OTUgKi8KKwlidWZbMl0gPSAweDk1OworCisvLyBSYW5nZShNSHopICBDMSAqICBSRSBSVFMgQlM0IEJTMyBCUzIgQlMxICBCeXRlIDUKKy8vICA0NyAtIDE1MyAgIDAgICogIDAgICAwICAgMCAgIDAgICAwICAgMSAgIDB4MDEKKy8vIDE1MyAtIDQzMCAgIDAgICogIDAgICAwICAgMCAgIDAgICAxICAgMCAgIDB4MDIKKy8vIDQzMCAtIDgyMiAgIDAgICogIDAgICAwICAgMSAgIDAgICAwICAgMCAgIDB4MDgKKy8vIDgyMiAtIDg2MiAgIDEgICogIDAgICAwICAgMSAgIDAgICAwICAgMCAgIDB4ODgKKworCSAgICAgaWYgKGZlcC0+ZnJlcXVlbmN5IDw9IDE1MzAwMDAwMCkgYnVmWzNdID0gMHgwMTsKKwllbHNlIGlmIChmZXAtPmZyZXF1ZW5jeSA8PSA0MzAwMDAwMDApIGJ1ZlszXSA9IDB4MDI7CisJZWxzZSBpZiAoZmVwLT5mcmVxdWVuY3kgPD0gODIyMDAwMDAwKSBidWZbM10gPSAweDA4OworCWVsc2UgYnVmWzNdID0gMHg4ODsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJZGViX3R1bmVyKCJ0dW5lciBidWZmZXIgZm9yICVkIEh6OiAleCAleCAleCAleFxuIixmZXAtPmZyZXF1ZW5jeSwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKwlyZXQgPSBmYy0+aTJjX3JlcXVlc3QoZmMsRkNfV1JJVEUsRkNfSTJDX1BPUlRfVFVORVIsMHg2MSxidWZbMF0sJmJ1ZlsxXSwzKTsKKwlkZWJfdHVuZXIoInR1bmVyIHdyaXRlIHJldHVybmVkOiAlZFxuIixyZXQpOworCisJcmV0dXJuIDA7Cit9CiAKIHN0YXRpYyB1OCBhbHBzX3RkZWU0X3N0djAyOTdfaW5pdHRhYltdID0gewogCTB4ODAsIDB4MDEsCkBAIC00OTAsNyArNTA2LDkgQEAKIAogCS8qIHRyeSB0aGUgc2t5IHYyLjYgKHN0djAyOTkvU2Ftc3VuZyB0Ym11MjQxMTIoc2wxOTM1KSkgKi8KIAlpZiAoKGZjLT5mZSA9IHN0djAyOTlfYXR0YWNoKCZzYW1zdW5nX3RibXUyNDExMl9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7Ci0JCW9wcyA9IGZjLT5mZS0+b3BzOworCQlvcHMgPSAmZmMtPmZlLT5vcHM7CisKKwkJb3BzLT50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHNhbXN1bmdfdGJtdTI0MTEyX3R1bmVyX3NldF9wYXJhbXM7CiAKIAkJb3BzLT5zZXRfdm9sdGFnZSA9IGZsZXhjb3Bfc2V0X3ZvbHRhZ2U7CiAKQEAgLTUwMywxNiArNTIxLDE5IEBACiAJLyogdHJ5IHRoZSBhaXIgZHZiLXQgKG10MzUyL1NhbXN1bmcgdGR0YzkyNTFkaDAoPz8pKSAqLwogCWlmICgoZmMtPmZlID0gbXQzNTJfYXR0YWNoKCZzYW1zdW5nX3RkdGM5MjUxZGgwX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwgKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9EVkI7CisJCWZjLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBzYW1zdW5nX3RkdGM5MjUxZGgwX2NhbGNfcmVnczsKIAkJaW5mbygiZm91bmQgdGhlIG10MzUyIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGR0YzkyNTFkaDBfY29uZmlnLmRlbW9kX2FkZHJlc3MpOwogCX0gZWxzZQogCS8qIHRyeSB0aGUgYWlyIGF0c2MgMm5kIGdlbmVyYXRpb24gKG54dDIwMDIpICovCiAJaWYgKChmYy0+ZmUgPSBueHQyMDB4X2F0dGFjaCgmc2Ftc3VuZ190Ym12X2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAkJZmMtPmRldl90eXBlICAgICAgICAgID0gRkNfQUlSX0FUU0MyOworCQlkdmJfcGxsX2F0dGFjaChmYy0+ZmUsIDB4NjEsICZmYy0+aTJjX2FkYXAsICZkdmJfcGxsX3NhbXN1bmdfdGJtdik7CiAJCWluZm8oImZvdW5kIHRoZSBueHQyMDAyIGF0IGkyYyBhZGRyZXNzOiAweCUwMngiLHNhbXN1bmdfdGJtdl9jb25maWcuZGVtb2RfYWRkcmVzcyk7CiAJfSBlbHNlCiAJLyogdHJ5IHRoZSBhaXIgYXRzYyAzbmQgZ2VuZXJhdGlvbiAobGdkdDMzMDMpICovCiAJaWYgKChmYy0+ZmUgPSBsZ2R0MzMweF9hdHRhY2goJmFpcjJwY19hdHNjX2hkNTAwMF9jb25maWcsICZmYy0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CiAJCWZjLT5kZXZfdHlwZSAgICAgICAgICA9IEZDX0FJUl9BVFNDMzsKKwkJZmMtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOwogCQlpbmZvKCJmb3VuZCB0aGUgbGdkdDMzMDMgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWlyMnBjX2F0c2NfaGQ1MDAwX2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkvKiB0cnkgdGhlIGFpciBhdHNjIDFuZCBnZW5lcmF0aW9uIChiY20zNTEwKS9wYW5hc29uaWMgY3QxMHMgKi8KQEAgLTUyMywxMSArNTQ0LDE0IEBACiAJLyogdHJ5IHRoZSBjYWJsZSBkdmIgKHN0djAyOTcpICovCiAJaWYgKChmYy0+ZmUgPSBzdHYwMjk3X2F0dGFjaCgmYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKIAkJZmMtPmRldl90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBGQ19DQUJMRTsKKwkJZmMtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX3RkZWU0X3N0djAyOTdfdHVuZXJfc2V0X3BhcmFtczsKIAkJaW5mbygiZm91bmQgdGhlIHN0djAyOTcgYXQgaTJjIGFkZHJlc3M6IDB4JTAyeCIsYWxwc190ZGVlNF9zdHYwMjk3X2NvbmZpZy5kZW1vZF9hZGRyZXNzKTsKIAl9IGVsc2UKIAkvKiB0cnkgdGhlIHNreSB2Mi4zICh2cDMxMC9TYW1zdW5nIHRiZHUxODEzMih0c2E1MDU5KSkgKi8KIAlpZiAoKGZjLT5mZSA9IHZwMzEwX210MzEyX2F0dGFjaCgmc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX2NvbmZpZywgJmZjLT5pMmNfYWRhcCkpICE9IE5VTEwpIHsKLQkJb3BzID0gZmMtPmZlLT5vcHM7CisJCW9wcyA9ICZmYy0+ZmUtPm9wczsKKworCQlvcHMtPnR1bmVyX29wcy5zZXRfcGFyYW1zID0gc2t5c3RhcjIzX3NhbXN1bmdfdGJkdTE4MTMyX3R1bmVyX3NldF9wYXJhbXM7CiAKIAkJb3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gZmxleGNvcF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwogCQlvcHMtPmRpc2VxY19zZW5kX2J1cnN0ICAgICAgPSBmbGV4Y29wX2Rpc2VxY19zZW5kX2J1cnN0OwpAQCAtNTQ3LDcgKzU3MSw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZCgmZmMtPmR2Yl9hZGFwdGVyLCBmYy0+ZmUpKSB7CiAJCQllcnIoImZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhIik7Ci0JCQlvcHMgPSBmYy0+ZmUtPm9wczsKKwkJCW9wcyA9ICZmYy0+ZmUtPm9wczsKIAkJCWlmIChvcHMtPnJlbGVhc2UgIT0gTlVMTCkKIAkJCQlvcHMtPnJlbGVhc2UoZmMtPmZlKTsKIAkJCWZjLT5mZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKaW5kZXggOWJjNDBiZC4uZjA0MDQxNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC1wY2kuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AtcGNpLmMKQEAgLTI0MiwxOSArMjQyLDE2IEBACiAJaWYgKChyZXQgPSBmbGV4Y29wX2RtYV9hbGxvY2F0ZShmY19wY2ktPnBkZXYsJmZjX3BjaS0+ZG1hWzBdLEZDX0RFRkFVTFRfRE1BMV9CVUZTSVpFKSkgIT0gMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgocmV0ID0gZmxleGNvcF9kbWFfYWxsb2NhdGUoZmNfcGNpLT5wZGV2LCZmY19wY2ktPmRtYVsxXSxGQ19ERUZBVUxUX0RNQTJfQlVGU0laRSkpICE9IDApCi0JCWdvdG8gZG1hMV9mcmVlOworCWlmICgocmV0ID0gZmxleGNvcF9kbWFfYWxsb2NhdGUoZmNfcGNpLT5wZGV2LCZmY19wY2ktPmRtYVsxXSxGQ19ERUZBVUxUX0RNQTJfQlVGU0laRSkpICE9IDApIHsKKwkJZmxleGNvcF9kbWFfZnJlZSgmZmNfcGNpLT5kbWFbMF0pOworCQlyZXR1cm4gcmV0OworCX0KIAogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfTUVESUEgfCBGQ19TUkFNX0RFU1RfTkVULCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTEpOwogCWZsZXhjb3Bfc3JhbV9zZXRfZGVzdChmY19wY2ktPmZjX2RldixGQ19TUkFNX0RFU1RfQ0FPICAgfCBGQ19TUkFNX0RFU1RfQ0FJLCBGQ19TUkFNX0RFU1RfVEFSR0VUX0RNQTIpOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9ETUFfSU5JVDsKIAotCWdvdG8gc3VjY2VzczsKLWRtYTFfZnJlZToKLQlmbGV4Y29wX2RtYV9mcmVlKCZmY19wY2ktPmRtYVswXSk7Ci0KLXN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzAzLDcgKzMwMCw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJmZjX3BjaS0+aXJxX2xvY2spOwogCiAJZmNfcGNpLT5pbml0X3N0YXRlIHw9IEZDX1BDSV9JTklUOwotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gcmV0OwogCiBlcnJfcGNpX2lvdW5tYXA6CiAJcGNpX2lvdW5tYXAoZmNfcGNpLT5wZGV2LCBmY19wY2ktPmlvX21lbSk7CkBAIC0zMTIsOCArMzA5LDYgQEAKIAlwY2lfcmVsZWFzZV9yZWdpb25zKGZjX3BjaS0+cGRldik7CiBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOgogCXBjaV9kaXNhYmxlX2RldmljZShmY19wY2ktPnBkZXYpOwotCi1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM3OCwxNCArMzczLDE0IEBACiAKIAlJTklUX1dPUksoJmZjX3BjaS0+aXJxX2NoZWNrX3dvcmssIGZsZXhjb3BfcGNpX2lycV9jaGVja193b3JrLCBmY19wY2kpOwogCi0JZ290byBzdWNjZXNzOworCXJldHVybiByZXQ7CisKIGVycl9mY19leGl0OgogCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOwogZXJyX3BjaV9leGl0OgogCWZsZXhjb3BfcGNpX2V4aXQoZmNfcGNpKTsKIGVycl9rZnJlZToKIAlmbGV4Y29wX2RldmljZV9rZnJlZShmYyk7Ci1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwppbmRleCAwNmVjOWZmZi4uNTE1OTU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLXVzYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2IyYzIvZmxleGNvcC11c2IuYwpAQCAtNDMzLDExICs0MzMsMTAgQEAKIAlmbGV4Y29wX3dhbl9zZXRfc3BlZWQoZmNfdXNiLT5mY19kZXYsRkNfV0FOX1NQRUVEXzhNQklUUyk7CiAJZmxleGNvcF9zcmFtX2N0cmwoZmNfdXNiLT5mY19kZXYsMSwxLDEpOwogCi0JcmV0ID0gMDsKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuIDA7CisKIHVyYl9lcnJvcjoKIAlmbGV4Y29wX3VzYl90cmFuc2Zlcl9leGl0KGZjX3VzYik7Ci1zdWNjZXNzOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUxNSwxNSArNTE0LDE0IEBACiAJCWdvdG8gZXJyX2ZjX2V4aXQ7CiAKIAlpbmZvKCIlcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgYW5kIGNvbm5lY3RlZC4iLERSSVZFUl9OQU1FKTsKLQlyZXQgPSAwOwotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gMDsKKwogZXJyX2ZjX2V4aXQ6CiAJZmxleGNvcF9kZXZpY2VfZXhpdChmYyk7CiBlcnJfdXNiX2V4aXQ6CiAJZmxleGNvcF91c2JfZXhpdChmY191c2IpOwogZXJyX2tmcmVlOgogCWZsZXhjb3BfZGV2aWNlX2tmcmVlKGZjKTsKLXN1Y2Nlc3M6CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYjJjMi9mbGV4Y29wLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwppbmRleCA1NmJhNTI0Li4yOWVjNDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9iMmMyL2ZsZXhjb3AuYwpAQCAtNjcsNyArNjcsNyBAQAogc3RhdGljIGludCBmbGV4Y29wX2R2Yl9pbml0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCiB7CiAJaW50IHJldDsKLQlpZiAoKHJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZmYy0+ZHZiX2FkYXB0ZXIsIkZsZXhDb3AgRGlnaXRhbCBUViBkZXZpY2UiLGZjLT5vd25lcikpIDwgMCkgeworCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmZjLT5kdmJfYWRhcHRlciwiRmxleENvcCBEaWdpdGFsIFRWIGRldmljZSIsZmMtPm93bmVyLGZjLT5kZXYpKSA8IDApIHsKIAkJZXJyKCJlcnJvciByZWdpc3RlcmluZyBEVkIgYWRhcHRlciIpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTExNiw3ICsxMTYsNyBAQAogCWR2Yl9uZXRfaW5pdCgmZmMtPmR2Yl9hZGFwdGVyLCAmZmMtPmR2Ym5ldCwgJmZjLT5kZW11eC5kbXgpOwogCiAJZmMtPmluaXRfc3RhdGUgfD0gRkNfU1RBVEVfRFZCX0lOSVQ7Ci0JZ290byBzdWNjZXNzOworCXJldHVybiAwOwogCiBlcnJfY29ubmVjdF9mcm9udGVuZDoKIAlmYy0+ZGVtdXguZG14LnJlbW92ZV9mcm9udGVuZCgmZmMtPmRlbXV4LmRteCwmZmMtPm1lbV9mcm9udGVuZCk7CkBAIC0xMjksOSArMTI5LDYgQEAKIGVycl9kbXg6CiAJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmZmMtPmR2Yl9hZGFwdGVyKTsKIAlyZXR1cm4gcmV0OwotCi1zdWNjZXNzOgotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBmbGV4Y29wX2R2Yl9leGl0KHN0cnVjdCBmbGV4Y29wX2RldmljZSAqZmMpCkBAIC0yNzksMTEgKzI3NiwxMCBAQAogCiAJZmxleGNvcF9kZXZpY2VfbmFtZShmYywiaW5pdGlhbGl6YXRpb24gb2YiLCJjb21wbGV0ZSIpOwogCi0JcmV0ID0gMDsKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuIDA7CisKIGVycm9yOgogCWZsZXhjb3BfZGV2aWNlX2V4aXQoZmMpOwotc3VjY2VzczoKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChmbGV4Y29wX2RldmljZV9pbml0aWFsaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9idDg3OC5jCmluZGV4IDU1MDBmOGEuLjc2MWZhNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2J0ODc4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvYnQ4NzguYwpAQCAtNjMsOCArNjMsNiBAQAogaW50IGJ0ODc4X251bTsKIHN0cnVjdCBidDg3OCBidDg3OFtCVDg3OF9NQVhdOwogCi1FWFBPUlRfU1lNQk9MKGJ0ODc4X2RlYnVnKTsKLUVYUE9SVF9TWU1CT0woYnQ4NzhfdmVyYm9zZSk7CiBFWFBPUlRfU1lNQk9MKGJ0ODc4X251bSk7CiBFWFBPUlRfU1lNQk9MKGJ0ODc4KTsKIApAQCAtMzkzLDcgKzM5MSw5IEBACiAJeyAweDA3NzExNDYxLCBCVFRWX0JPQVJEX0FWRFZCVF83NzEsCQkJIkFWZXJtZWRpYSBBdmVyVFYgRFZCLVQgNzcxIiB9LAogCXsgMHhkYjEwMThhYywgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEUsCQkiRFZpQ08gRnVzaW9uSERUViBEVkItVCBMaXRlIiB9LAogCXsgMHhkNTAwMThhYywgQlRUVl9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfTElURSwJIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiB9LAotCXsgMHgyMDAwNzA2MywgQlRUVl9CT0FSRF9QQ19IRFRWLAkJCSJwY0hEVFYgSEQtMjAwMCBUViJ9LAorCXsgMHgyMDAwNzA2MywgQlRUVl9CT0FSRF9QQ19IRFRWLAkJCSJwY0hEVFYgSEQtMjAwMCBUViIgfSwKKwl7IDB4MDAyNjE4MjIsIEJUVFZfQk9BUkRfVFdJTkhBTl9EU1QsCQkJIkROVFYgTGl2ZSEgTWluaSIgfSwKKwogCXsgMCwgLTEsIE5VTEwgfQogfTsKIApAQCAtNDE3LDYgKzQxNywxMSBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiYnQ4Nzg6IEJ0ODc4IEFVRElPIGZ1bmN0aW9uIGZvdW5kICglZCkuXG4iLAogCSAgICAgICBidDg3OF9udW0pOworCWlmIChidDg3OF9udW0gPj0gQlQ4NzhfTUFYKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYnQ4Nzg6IFRvbyBtYW55IGRldmljZXMgaW5zZXJ0ZWRcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWwwOworCX0KIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UoZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKaW5kZXggMWNmYTVlNS4uZDY4N2ExNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0LmMKQEAgLTM4LDYgKzM4LDEwIEBACiBtb2R1bGVfcGFyYW0oZHN0X2FkZG9ucywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZHN0X2FkZG9ucywgIkNBIGRhdWdodGVyYm9hcmQsIGRlZmF1bHQgaXMgMCAoTm8gYWRkb25zKSIpOwogCitzdGF0aWMgdW5zaWduZWQgaW50IGRzdF9hbGdvOworbW9kdWxlX3BhcmFtKGRzdF9hbGdvLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkc3RfYWxnbywgInR1bmluZyBhbGdvOiBkZWZhdWx0IGlzIDA9KFNXKSwgMT0oSFcpIik7CisKICNkZWZpbmUgSEFTX0xPQ0sJCTEKICNkZWZpbmUgQVRURU1QVF9UVU5FCQkyCiAjZGVmaW5lIEhBU19QT1dFUgkJNApAQCAtNDcsMjAgKzUxLDI0IEBACiAjZGVmaW5lIERTVF9JTkZPCQkyCiAjZGVmaW5lIERTVF9ERUJVRwkJMwogCi0jZGVmaW5lIGRwcmludGsoeCwgeSwgeiwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCQkJCQlcCi0JaWYgKHopIHsJCQkJCQkJCQlcCi0JCWlmCSgoeCA+IERTVF9FUlJPUikgJiYgKHggPiB5KSkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAotCQllbHNlIGlmCSgoeCA+IERTVF9OT1RJQ0UpICYmICh4ID4geSkpCQkJCQlcCi0JCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKLQkJZWxzZSBpZiAoKHggPiBEU1RfSU5GTykgJiYgKHggPiB5KSkJCQkJCVwKLQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjI2FyZyk7CVwKLQkJZWxzZSBpZiAoKHggPiBEU1RfREVCVUcpICYmICh4ID4geSkpCQkJCQlcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm9ybWF0ICJcbiIsIF9fRlVOQ1RJT05fXyAsICMjYXJnKTsJXAotCX0gZWxzZSB7CQkJCQkJCQkJXAotCQlpZiAoeCA+IHkpCQkJCQkJCQlcCi0JCQlwcmludGsoZm9ybWF0LCAjI2FyZyk7CQkJCQkJXAotCX0JCQkJCQkJCQkJXAorI2RlZmluZSBkcHJpbnRrKHgsIHksIHosIGZvcm1hdCwgYXJnLi4uKSBkbyB7CQkJCVwKKwlpZiAoeikgewkJCQkJCQlcCisJCWlmCSgoeCA+IERTVF9FUlJPUikgJiYgKHggPiB5KSkJCQlcCisJCQlwcmludGsoS0VSTl9FUlIgImRzdCglZCkgJXM6ICIgZm9ybWF0ICJcbiIsCVwKKwkJCQlzdGF0ZS0+YnQtPm5yLCBfX2Z1bmNfXyAsICMjYXJnKTsJXAorCQllbHNlIGlmCSgoeCA+IERTVF9OT1RJQ0UpICYmICh4ID4geSkpCQkJXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJkc3QoJWQpICVzOiAiIGZvcm1hdCAiXG4iLCAgXAorCQkJCXN0YXRlLT5idC0+bnIsIF9fZnVuY19fICwgIyNhcmcpOwlcCisJCWVsc2UgaWYgKCh4ID4gRFNUX0lORk8pICYmICh4ID4geSkpCQkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZHN0KCVkKSAlczogIiBmb3JtYXQgIlxuIiwJXAorCQkJCXN0YXRlLT5idC0+bnIsIF9fZnVuY19fICwgIyNhcmcpOwlcCisJCWVsc2UgaWYgKCh4ID4gRFNUX0RFQlVHKSAmJiAoeCA+IHkpKQkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJkc3QoJWQpICVzOiAiIGZvcm1hdCAiXG4iLAlcCisJCQkJc3RhdGUtPmJ0LT5uciwgIF9fZnVuY19fICwgIyNhcmcpOwlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQlpZiAoeCA+IHkpCQkJCQkJXAorCQkJcHJpbnRrKGZvcm1hdCwgIyNhcmcpOwkJCQlcCisJfQkJCQkJCQkJXAogfSB3aGlsZSgwKQogCiAKQEAgLTExMCw3ICsxMTgsNyBAQAogCiAJKnJlc3VsdCA9IDA7CiAJaWYgKChlcnIgPSBidDg3OF9kZXZpY2VfY29udHJvbChzdGF0ZS0+YnQsIERTVF9JR19SRUFELCAmcmRfcGFja2V0KSkgPCAwKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiZHN0X2dwaW9faW5iIGVycm9yIChlcnIgPT0gJWkpXG4iLCBlcnIpOworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgImRzdF9ncGlvX2luYiBlcnJvciAoZXJyID09ICVpKSIsIGVycik7CiAJCXJldHVybiAtRVJFTU9URUlPOwogCX0KIAkqcmVzdWx0ID0gKHU4KSByZF9wYWNrZXQucmQudmFsdWU7CkBAIC0zNjMsNiArMzcxLDE3IEBACiAJCXN0YXRlLT50eF90dW5hWzJdID0gKGZyZXEgPj4gMTYpICYgMHhmZjsKIAkJc3RhdGUtPnR4X3R1bmFbM10gPSAoZnJlcSA+PiA4KSAmIDB4ZmY7CiAJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpIHsKKwkJZnJlcSA9IGZyZXEgLyAxMDAwOworCQlpZiAoZnJlcSA8IDUxMDAwIHx8IGZyZXEgPiA4NTgwMDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPnR4X3R1bmFbMl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOworCQlzdGF0ZS0+dHhfdHVuYVszXSA9IChmcmVxID4+ICA4KSAmIDB4ZmY7CisJCXN0YXRlLT50eF90dW5hWzRdID0gKHU4KSBmcmVxOworCQlzdGF0ZS0+dHhfdHVuYVs1XSA9IDB4MDA7CQkvKglBVFNDCSovCisJCXN0YXRlLT50eF90dW5hWzZdID0gMHgwMDsKKwkJaWYgKHN0YXRlLT5kc3RfaHdfY2FwICYgRFNUX1RZUEVfSEFTX0FOQUxPRykKKwkJCXN0YXRlLT50eF90dW5hWzddID0gMHgwMDsJLyoJRGlnaXRhbAkqLwogCX0gZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDQ3LDI5ICs0NjYsNDEgQEAKIAl9CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBzeW1yYXRlICV1Iiwgc3JhdGUpOwogCXNyYXRlIC89IDEwMDA7Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikgewotCQlzdmFsID0gc3JhdGU7Ci0JCXN2YWwgPDw9IDIwOwotCQlkb19kaXYoc3ZhbCwgODgwMDApOwotCQlzeW1jYWxjID0gKHUzMikgc3ZhbDsKLQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgInNldCBzeW1jYWxjICV1Iiwgc3ltY2FsYyk7Ci0JCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3ltY2FsYyA+PiAxMik7Ci0JCXN0YXRlLT50eF90dW5hWzZdID0gKHU4KSAoc3ltY2FsYyA+PiA0KTsKLQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIChzeW1jYWxjIDw8IDQpOwotCX0gZWxzZSB7Ci0JCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3JhdGUgPj4gMTYpICYgMHg3ZjsKLQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIChzcmF0ZSA+PiA4KTsKLQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIHNyYXRlOwotCX0KLQlzdGF0ZS0+dHhfdHVuYVs4XSAmPSB+MHgyMDsKLQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKLQkJaWYgKHNyYXRlID4gODAwMCkKLQkJCXN0YXRlLT50eF90dW5hWzhdIHw9IDB4MjA7CisJaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19TQVQpIHsKKwkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1NZTURJVikgeworCQkJc3ZhbCA9IHNyYXRlOworCQkJc3ZhbCA8PD0gMjA7CisJCQlkb19kaXYoc3ZhbCwgODgwMDApOworCQkJc3ltY2FsYyA9ICh1MzIpIHN2YWw7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAic2V0IHN5bWNhbGMgJXUiLCBzeW1jYWxjKTsKKwkJCXN0YXRlLT50eF90dW5hWzVdID0gKHU4KSAoc3ltY2FsYyA+PiAxMik7CisJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHN5bWNhbGMgPj4gNCk7CisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgKHN5bWNhbGMgPDwgNCk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+dHhfdHVuYVs1XSA9ICh1OCkgKHNyYXRlID4+IDE2KSAmIDB4N2Y7CisJCQlzdGF0ZS0+dHhfdHVuYVs2XSA9ICh1OCkgKHNyYXRlID4+IDgpOworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAodTgpIHNyYXRlOworCQl9CisJCXN0YXRlLT50eF90dW5hWzhdICY9IH4weDIwOworCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpIHsKKwkJCWlmIChzcmF0ZSA+IDgwMDApCisJCQkJc3RhdGUtPnR4X3R1bmFbOF0gfD0gMHgyMDsKKwkJfQorCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0NBQkxFKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiJXMiLCBzdGF0ZS0+ZndfbmFtZSk7CisJCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVE5FVyIsIDYpKSB7CisJCQlzdGF0ZS0+dHhfdHVuYVs1XSA9ICh1OCkgKHNyYXRlID4+IDgpOworCQkJc3RhdGUtPnR4X3R1bmFbNl0gPSAodTgpIHNyYXRlOworCQkJc3RhdGUtPnR4X3R1bmFbN10gPSAweDAwOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHN0YXRlLT5md19uYW1lLCAiRENULUNJIiwgNikpIHsKKwkJCXN0YXRlLT50eF90dW5hWzVdID0gMHgwMDsKKwkJCXN0YXRlLT50eF90dW5hWzZdID0gKHU4KSAoc3JhdGUgPj4gOCk7CisJCQlzdGF0ZS0+dHhfdHVuYVs3XSA9ICh1OCkgc3JhdGU7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCBkc3Rfc2V0X21vZHVsYXRpb24oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUsIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uKQogewogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfQ0FCTEUpCkBAIC00OTAsNyArNTIxLDEwIEBACiAJCXN0YXRlLT50eF90dW5hWzhdID0gMHg4MDsKIAkJYnJlYWs7CiAJY2FzZSBRQU1fMjU2OgotCQlzdGF0ZS0+dHhfdHVuYVs4XSA9IDB4MDA7CisJCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVE5FVyIsIDYpKQorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweGZmOworCQllbHNlIGlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVC1DSSIsIDYpKQorCQkJc3RhdGUtPnR4X3R1bmFbOF0gPSAweDAwOwogCQlicmVhazsKIAljYXNlIFFQU0s6CiAJY2FzZSBRQU1fQVVUTzoKQEAgLTUyMywxMyArNTU3LDE5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRzdF9jaGVja19zdW0pOwogCi1zdGF0aWMgdm9pZCBkc3RfdHlwZV9mbGFnc19wcmludCh1MzIgdHlwZV9mbGFncykKK3N0YXRpYyB2b2lkIGRzdF90eXBlX2ZsYWdzX3ByaW50KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogeworCXUzMiB0eXBlX2ZsYWdzID0gc3RhdGUtPnR5cGVfZmxhZ3M7CisKIAlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIkRTVCB0eXBlIGZsYWdzIDoiKTsKLQlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKQotCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX05FV1RVTkUpOworCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1RTMTg4KQorCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IG5ld3R1bmVyIiwgRFNUX1RZUEVfSEFTX1RTMTg4KTsKKwlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FXzIpCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggbmV3dHVuZXIgMiIsIERTVF9UWVBFX0hBU19ORVdUVU5FXzIpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1RTMjA0KQogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IHRzMjA0IiwgRFNUX1RZUEVfSEFTX1RTMjA0KTsKKwlpZiAodHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpCisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAwLCAiIDB4JXggVkxGIiwgRFNUX1RZUEVfSEFTX1ZMRik7CiAJaWYgKHR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfU1lNRElWKQogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMCwgIiAweCV4IHN5bWRpdiIsIERTVF9UWVBFX0hBU19TWU1ESVYpOwogCWlmICh0eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXXzEpCkBAIC01NDIsNyArNTgyLDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHU4IHR5cGUpCitzdGF0aWMgaW50IGRzdF90eXBlX3ByaW50KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlLCB1OCB0eXBlKQogewogCWNoYXIgKm90eXBlOwogCXN3aXRjaCAodHlwZSkgewpAQCAtNTU4LDYgKzU5OCwxMCBAQAogCQlvdHlwZSA9ICJjYWJsZSI7CiAJCWJyZWFrOwogCisJY2FzZSBEU1RfVFlQRV9JU19BVFNDOgorCQlvdHlwZSA9ICJhdHNjIjsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiaW52YWxpZCBkc3QgdHlwZSAlZCIsIHR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU2Nyw2ICs2MTEsMTI3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCB0dW5lcl90eXBlcyB0dW5lcl9saXN0W10gPSB7CisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTDY0NzI0LAorCQkudHVuZXJfbmFtZSA9ICJMIDY0NzI0IiwKKwkJLmJvYXJkX25hbWUgPSAiVU5LTk9XTiIsCisJCS5md19uYW1lICAgID0gIlVOS05PV04iCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1NUVjAyOTksCisJCS50dW5lcl9uYW1lID0gIlNUViAwMjk5IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDIwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFNULU1PVCIKKwl9LAorCisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfU1RWMDI5OSwKKwkJLnR1bmVyX25hbWUgPSAiU1RWIDAyOTkiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDEwMjAiLAorCQkuZndfbmFtZSAgICA9ICJEU1QtMDNUIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NQjg2QTE1LAorCQkudHVuZXJfbmFtZSA9ICJNQiA4NkExNSIsCisJCS5ib2FyZF9uYW1lID0gIlZQMTAyMiIsCisJCS5md19uYW1lICAgID0gIkRTVC0wM1QiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX01CODZBMTUsCisJCS50dW5lcl9uYW1lID0gIk1CIDg2QTE1IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDI1IiwKKwkJLmZ3X25hbWUgICAgPSAiRFNULTAzVCIKKwl9LAorCisJeworCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfU1RWMDI5OSwKKwkJLnR1bmVyX25hbWUgPSAiU1RWIDAyOTkiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDEwMzAiLAorCQkuZndfbmFtZSAgICA9ICJEU1QtQ0kiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1NUVjAyOTksCisJCS50dW5lcl9uYW1lID0gIlNUViAwMjk5IiwKKwkJLmJvYXJkX25hbWUgPSAiVlAxMDMwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFNUTUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDIxIiwKKwkJLmZ3X25hbWUgICAgPSAiRENUTkVXIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDMwIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDMxIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAyMDQwIiwKKwkJLmZ3X25hbWUgICAgPSAiRENULUNJIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAzMDIwIiwKKwkJLmZ3X25hbWUgICAgPSAiRFRURlRBIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9VTktOT1dOLAorCQkudHVuZXJfbmFtZSA9ICJVTktOT1dOIiwKKwkJLmJvYXJkX25hbWUgPSAiVlAzMDIxIiwKKwkJLmZ3X25hbWUgICAgPSAiRFRURlRBIgorCX0sCisKKwl7CisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9UREExMDA0NiwKKwkJLnR1bmVyX25hbWUgPSAiVERBMTAwNDYiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMwNDAiLAorCQkuZndfbmFtZSAgICA9ICJEVFQtQ0kiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX1VOS05PV04sCisJCS50dW5lcl9uYW1lID0gIlVOS05PV04iLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMwNTEiLAorCQkuZndfbmFtZSAgICA9ICJEVFROWFQiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX05YVDIwMHgsCisJCS50dW5lcl9uYW1lID0gIk5YVDIwMHgiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMyMjAiLAorCQkuZndfbmFtZSAgICA9ICJBVFNDREkiCisJfSwKKworCXsKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9UWVBFX05YVDIwMHgsCisJCS50dW5lcl9uYW1lID0gIk5YVDIwMHgiLAorCQkuYm9hcmRfbmFtZSA9ICJWUDMyNTAiLAorCQkuZndfbmFtZSAgICA9ICJBVFNDQUQiCisJfSwKK307CisKIC8qCiAJS25vd24gY2FyZHMgbGlzdAogCVNhdGVsbGl0ZQpAQCAtNjA4LDcgKzc3Myw4IEBACiAJCS5vZmZzZXQgPSAwLAogCQkuZHN0X3R5cGUgPSAgRFNUX1RZUEVfSVNfU0FULAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19TWU1ESVYgfCBEU1RfVFlQRV9IQVNfRldfMSB8IERTVF9UWVBFX0hBU19PQlNfUkVHUywKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKglvYnNvbGV0ZQkqLwogCiAJewpAQCAtNjE2LDE1ICs3ODIsMTcgQEAKIAkJLm9mZnNldCA9IDAsCiAJCS5kc3RfdHlwZSA9ICBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiRFNULTAzMCIsCiAJCS5vZmZzZXQgPSAgMCwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzEsCi0JCS5kc3RfZmVhdHVyZSA9IDAKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfVFMxODggfCBEU1RfVFlQRV9IQVNfRldfMSwKKwkJLmRzdF9mZWF0dXJlID0gMCwKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwJLyoJb2Jzb2xldGUJKi8KIAogCXsKQEAgLTYzMyw3ICs4MDEsOCBAQAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19GV18yLAogCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfRElTRVFDMyB8IERTVF9UWVBFX0hBU19ESVNFUUM0IHwgRFNUX1RZUEVfSEFTX0RJU0VRQzUKLQkJCQkJCQkgfCBEU1RfVFlQRV9IQVNfTUFDIHwgRFNUX1RZUEVfSEFTX01PVE8KKwkJCQkJCQkgfCBEU1RfVFlQRV9IQVNfTUFDIHwgRFNUX1RZUEVfSEFTX01PVE8sCisJCS50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NVUxUSQogCSB9LAogCiAJewpAQCAtNjQxLDU3ICs4MTAsNjMgQEAKIAkJLm9mZnNldCA9ICAwLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX1NZTURJViB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCS8qCW9ic29sZXRlCSovCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiRFNULUNJIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVCwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xLAotCQkuZHN0X2ZlYXR1cmUgPSBEU1RfVFlQRV9IQVNfQ0EKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfRldfMSwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKglBbiBPRU0gYm9hcmQJKi8KIAogCXsKIAkJLmRldmljZV9pZCA9ICJEU1RNQ0kiLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfU0FULAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfRldfQlVJTEQgfCBEU1RfVFlQRV9IQVNfSU5DX0NPVU5ULAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX0lOQ19DT1VOVCB8IERTVF9UWVBFX0hBU19WTEYsCiAJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQSB8IERTVF9UWVBFX0hBU19ESVNFUUMzIHwgRFNUX1RZUEVfSEFTX0RJU0VRQzQKLQkJCQkJCQl8IERTVF9UWVBFX0hBU19NT1RPIHwgRFNUX1RZUEVfSEFTX01BQworCQkJCQkJCXwgRFNUX1RZUEVfSEFTX01PVE8gfCBEU1RfVFlQRV9IQVNfTUFDLAorCQkudHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTVVMVEkKIAl9LAogCiAJewogCQkuZGV2aWNlX2lkID0gIkRTVEZDSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19TQVQsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMSwKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18xLAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAkvKiB1bmtub3duIHRvIHZlbmRvcgkqLwogCiAJewogCQkuZGV2aWNlX2lkID0gIkRDVC1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19DQUJMRSwKLQkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfVFMyMDQgfCBEU1RfVFlQRV9IQVNfTkVXVFVORSB8IERTVF9UWVBFX0hBU19GV18xCi0JCQkJCQkJfCBEU1RfVFlQRV9IQVNfRldfMiwKLQkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBCisJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX01VTFRJX0ZFIHwgRFNUX1RZUEVfSEFTX0ZXXzEJfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19WTEYsCisJCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQSwKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwKIAogCXsKIAkJLmRldmljZV9pZCA9ICJEQ1RORVciLAogCQkub2Zmc2V0ID0gMSwKIAkJLmRzdF90eXBlID0gRFNUX1RZUEVfSVNfQ0FCTEUsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX05FV1RVTkUgfCBEU1RfVFlQRV9IQVNfRldfMyB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKLQkJLmRzdF9mZWF0dXJlID0gMAorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzE4OCB8IERTVF9UWVBFX0hBU19GV18zIHwgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEIHwgRFNUX1RZUEVfSEFTX01VTFRJX0ZFLAorCQkuZHN0X2ZlYXR1cmUgPSAwLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAogCiAJewogCQkuZGV2aWNlX2lkID0gIkRUVC1DSSIsCiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19URVJSLAotCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19UUzIwNCB8IERTVF9UWVBFX0hBU19ORVdUVU5FIHwgRFNUX1RZUEVfSEFTX0ZXXzIgfCBEU1RfVFlQRV9IQVNfTVVMVElfRkUsCi0JCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19DQQorCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yIHwgRFNUX1RZUEVfSEFTX01VTFRJX0ZFIHwgRFNUX1RZUEVfSEFTX1ZMRiwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0NBLAorCQkudHVuZXJfdHlwZSA9IDAKIAl9LAogCiAJewpAQCAtNjk5LDcgKzg3NCw4IEBACiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19URVJSLAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7CkBAIC03MDcsNyArODgzLDggQEAKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1RFUlIsCiAJCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX0ZXXzIsCi0JCS5kc3RfZmVhdHVyZSA9IERTVF9UWVBFX0hBU19BTkFMT0cKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX0FOQUxPRywKKwkJLnR1bmVyX3R5cGUgPSAwCiAJfSwKIAogCXsKQEAgLTcxNSwxNSArODkyLDE3IEBACiAJCS5vZmZzZXQgPSAxLAogCQkuZHN0X3R5cGUgPSBEU1RfVFlQRV9JU19BVFNDLAogCQkudHlwZV9mbGFncyA9IERTVF9UWVBFX0hBU19GV18yLAotCQkuZHN0X2ZlYXR1cmUgPSAwCisJCS5kc3RfZmVhdHVyZSA9IDAsCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7CiAJCS5kZXZpY2VfaWQgPSAiQVRTQ0FEIiwKIAkJLm9mZnNldCA9IDEsCiAJCS5kc3RfdHlwZSA9IERTVF9UWVBFX0lTX0FUU0MsCi0JCS50eXBlX2ZsYWdzID0gRFNUX1RZUEVfSEFTX0ZXXzIsCi0JCS5kc3RfZmVhdHVyZSA9IDAKKwkJLnR5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfTVVMVElfRkUgfCBEU1RfVFlQRV9IQVNfRldfMiB8IERTVF9UWVBFX0hBU19GV19CVUlMRCwKKwkJLmRzdF9mZWF0dXJlID0gRFNUX1RZUEVfSEFTX01BQyB8IERTVF9UWVBFX0hBU19BTkFMT0csCisJCS50dW5lcl90eXBlID0gMAogCX0sCiAKIAl7IH0KQEAgLTc2OCw2ICs5NDcsOSBAQAogCiBzdGF0aWMgaW50IGRzdF9jYXJkX3R5cGUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CisJaW50IGo7CisJc3RydWN0IHR1bmVyX3R5cGVzICpwX3R1bmVyX2xpc3QgPSBOVUxMOworCiAJdTggZ2V0X3R5cGVbXSA9IHsgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCWdldF90eXBlWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdHlwZSwgNyk7CiAJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHlwZSwgOCkgPCAwKSB7CkBAIC03NzUsOSArOTU3LDE3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJbWVtc2V0KCZzdGF0ZS0+Y2FyZF9pbmZvLCAnXDAnLCA4KTsKLQltZW1jcHkoJnN0YXRlLT5jYXJkX2luZm8sICZzdGF0ZS0+cnhidWZmZXIsIDgpOworCW1lbWNweSgmc3RhdGUtPmNhcmRfaW5mbywgJnN0YXRlLT5yeGJ1ZmZlciwgNyk7CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEZXZpY2UgTW9kZWw9WyVzXSIsICZzdGF0ZS0+Y2FyZF9pbmZvWzBdKTsKIAorCWZvciAoaiA9IDAsIHBfdHVuZXJfbGlzdCA9IHR1bmVyX2xpc3Q7IGogPCBBUlJBWV9TSVpFKHR1bmVyX2xpc3QpOyBqKyssIHBfdHVuZXJfbGlzdCsrKSB7CisJCWlmICghc3RyY21wKCZzdGF0ZS0+Y2FyZF9pbmZvWzBdLCBwX3R1bmVyX2xpc3QtPmJvYXJkX25hbWUpKSB7CisJCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IHBfdHVuZXJfbGlzdC0+dHVuZXJfdHlwZTsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRFNUIGhhcyBbJXNdIHR1bmVyLCB0dW5lciB0eXBlPVslZF0iLAorCQkJCXBfdHVuZXJfbGlzdC0+dHVuZXJfbmFtZSwgcF90dW5lcl9saXN0LT50dW5lcl90eXBlKTsKKwkJfQorCX0KKwogCXJldHVybiAwOwogfQogCkBAIC03OTAsMTIgKzk4MCw2NCBAQAogCQlyZXR1cm4gLTE7CiAJfQogCW1lbXNldCgmc3RhdGUtPnZlbmRvciwgJ1wwJywgOCk7Ci0JbWVtY3B5KCZzdGF0ZS0+dmVuZG9yLCAmc3RhdGUtPnJ4YnVmZmVyLCA4KTsKKwltZW1jcHkoJnN0YXRlLT52ZW5kb3IsICZzdGF0ZS0+cnhidWZmZXIsIDcpOwogCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiVmVuZG9yPVslc10iLCAmc3RhdGUtPnZlbmRvclswXSk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZGVidWdfZHN0X2J1ZmZlcihzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgaTsKKworCWlmICh2ZXJib3NlID4gMikgeworCQlwcmludGsoIiVzOiBbIiwgX19mdW5jX18pOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJcHJpbnRrKCIgJTAyeCIsIHN0YXRlLT5yeGJ1ZmZlcltpXSk7CisJCXByaW50aygiXVxuIik7CisJfQorfQorCitzdGF0aWMgaW50IGRzdF9jaGVja19zdHYwMjk5KHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQoreworCXU4IGNoZWNrX3N0djAyOTlbXSA9IHsgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCisJY2hlY2tfc3R2MDI5OVs3XSA9IGRzdF9jaGVja19zdW0oY2hlY2tfc3R2MDI5OSwgNyk7CisJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBjaGVja19zdHYwMjk5LCA4KSA8IDApIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJDbWQ9WzB4MDRdIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCWRlYnVnX2RzdF9idWZmZXIoc3RhdGUpOworCisJaWYgKG1lbWNtcCgmY2hlY2tfc3R2MDI5OSwgJnN0YXRlLT5yeGJ1ZmZlciwgOCkpIHsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJGb3VuZCBhIFNUVjAyOTkgTklNIik7CisJCXN0YXRlLT50dW5lcl90eXBlID0gVFVORVJfVFlQRV9TVFYwMjk5OworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHN0X2NoZWNrX21iODZhMTUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJdTggY2hlY2tfbWI4NmExNVtdID0geyAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CisKKwljaGVja19tYjg2YTE1WzddID0gZHN0X2NoZWNrX3N1bShjaGVja19tYjg2YTE1LCA3KTsKKwlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGNoZWNrX21iODZhMTUsIDgpIDwgMCkgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkNtZD1bMHgxMF0sIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCWRlYnVnX2RzdF9idWZmZXIoc3RhdGUpOworCisJaWYgKG1lbWNtcCgmY2hlY2tfbWI4NmExNSwgJnN0YXRlLT5yeGJ1ZmZlciwgOCkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRm91bmQgYSBNQjg2QTE1IE5JTSIpOworCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IFRVTkVSX1RZUEVfTUI4NkExNTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgaW50IGRzdF9nZXRfdHVuZXJfaW5mbyhzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSkKIHsKIAl1OCBnZXRfdHVuZXJfMVtdID0geyAweDAwLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CkBAIC04MDMsNjAgKzEwNDUsNTkgQEAKIAogCWdldF90dW5lcl8xWzddID0gZHN0X2NoZWNrX3N1bShnZXRfdHVuZXJfMSwgNyk7CiAJZ2V0X3R1bmVyXzJbN10gPSBkc3RfY2hlY2tfc3VtKGdldF90dW5lcl8yLCA3KTsKKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkRTVCBUWXBlID0gTVVMVEkgRkUiKTsKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTVVMVElfRkUpIHsKLQkJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHVuZXJfMiwgOCkgPCAwKSB7Ci0JCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiVW5zdXBwb3J0ZWQgQ29tbWFuZCIpOwotCQkJcmV0dXJuIC0xOworCQlpZiAoZHN0X2NvbW1hbmQoc3RhdGUsIGdldF90dW5lcl8xLCA4KSA8IDApIHsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0lORk8sIDEsICJDbWQ9WzB4MTNdLCBVbnN1cHBvcnRlZCIpOworCQkJZ290byBmb3JjZTsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkc3RfY29tbWFuZChzdGF0ZSwgZ2V0X3R1bmVyXzEsIDgpIDwgMCkgewotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIlVuc3VwcG9ydGVkIENvbW1hbmQiKTsKLQkJCXJldHVybiAtMTsKKwkJaWYgKGRzdF9jb21tYW5kKHN0YXRlLCBnZXRfdHVuZXJfMiwgOCkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiQ21kPVsweGJdLCBVbnN1cHBvcnRlZCIpOworCQkJZ290byBmb3JjZTsKIAkJfQogCX0KIAltZW1zZXQoJnN0YXRlLT5ib2FyZF9pbmZvLCAnXDAnLCA4KTsKIAltZW1jcHkoJnN0YXRlLT5ib2FyZF9pbmZvLCAmc3RhdGUtPnJ4YnVmZmVyLCA4KTsKIAlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTVVMVElfRkUpIHsKLQkJaWYgKHN0YXRlLT5ib2FyZF9pbmZvWzFdID09IDB4MGIpIHsKLQkJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19UUzIwNCkKLQkJCQlzdGF0ZS0+dHlwZV9mbGFncyAmPSB+RFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX05FV1RVTkU7Ci0JCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9JTkZPLCAxLCAiRFNUIHR5cGUgaGFzIFRTPTE4OCIpOwotCQl9IGVsc2UgewotCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0yMDQiKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChzdGF0ZS0+Ym9hcmRfaW5mb1swXSA9PSAweGJjKSB7Ci0JCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfVFMyMDQpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19UUzIwNDsKLQkJCXN0YXRlLT50eXBlX2ZsYWdzIHw9IERTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0xODgsIERhdWdodGVyYm9hcmQ9WyVkXSIsIHN0YXRlLT5ib2FyZF9pbmZvWzFdKTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJEU1QgdHlwZSBoYXMgVFM9MTg4Iik7CisJfQorCWlmIChzdGF0ZS0+Ym9hcmRfaW5mb1swXSA9PSAweGJjKSB7CisJCWlmIChzdGF0ZS0+dHlwZV9mbGFncyAhPSBEU1RfVFlQRV9JU19BVFNDKQorCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMTg4OworCQllbHNlCisJCQlzdGF0ZS0+dHlwZV9mbGFncyB8PSBEU1RfVFlQRV9IQVNfTkVXVFVORV8yOwogCi0JCX0gZWxzZSBpZiAoc3RhdGUtPmJvYXJkX2luZm9bMF0gPT0gMHhjYykgewotCQkJaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCQkJc3RhdGUtPnR5cGVfZmxhZ3MgJj0gfkRTVF9UWVBFX0hBU19ORVdUVU5FOwotCQkJc3RhdGUtPnR5cGVfZmxhZ3MgfD0gRFNUX1RZUEVfSEFTX1RTMjA0OwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIkRTVCB0eXBlIGhhcyBUUz0yMDQgRGF1Z2h0ZXJib2FyZD1bJWRdIiwgc3RhdGUtPmJvYXJkX2luZm9bMV0pOworCQlpZiAoc3RhdGUtPmJvYXJkX2luZm9bMV0gPT0gMHgwMSkgeworCQkJc3RhdGUtPmRzdF9od19jYXAgfD0gRFNUX1RZUEVfSEFTX0RCT0FSRDsKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiRFNUIGhhcyBEYXVnaHRlcmJvYXJkIik7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKK2ZvcmNlOgorCWlmICghc3RybmNtcChzdGF0ZS0+ZndfbmFtZSwgIkRDVC1DSSIsIDYpKSB7CisJCXN0YXRlLT50eXBlX2ZsYWdzIHw9IERTVF9UWVBFX0hBU19UUzIwNDsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJGb3JjaW5nIFslc10gdG8gVFMxODgiLCBzdGF0ZS0+ZndfbmFtZSk7CisJfQorCisJcmV0dXJuIC0xOwogfQogCiBzdGF0aWMgaW50IGRzdF9nZXRfZGV2aWNlX2lkKHN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlKQogewogCXU4IHJlcGx5OwogCi0JaW50IGk7Ci0Jc3RydWN0IGRzdF90eXBlcyAqcF9kc3RfdHlwZTsKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgZHN0X3R5cGVzICpwX2RzdF90eXBlID0gTlVMTDsKKwlzdHJ1Y3QgdHVuZXJfdHlwZXMgKnBfdHVuZXJfbGlzdCA9IE5VTEw7CisKIAl1OCB1c2VfZHN0X3R5cGUgPSAwOwogCXUzMiB1c2VfdHlwZV9mbGFncyA9IDA7CiAKIAlzdGF0aWMgdTggZGV2aWNlX3R5cGVbOF0gPSB7MHgwMCwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZn07CiAKKwlzdGF0ZS0+dHVuZXJfdHlwZSA9IDA7CiAJZGV2aWNlX3R5cGVbN10gPSBkc3RfY2hlY2tfc3VtKGRldmljZV90eXBlLCA3KTsKIAogCWlmICh3cml0ZV9kc3Qoc3RhdGUsIGRldmljZV90eXBlLCBGSVhFRF9DT01NKSkKQEAgLTg4OCw4ICsxMTI5LDM0IEBACiAKIAkJCS8qCUNhcmQgY2FwYWJpbGl0aWVzCSovCiAJCQlzdGF0ZS0+ZHN0X2h3X2NhcCA9IHBfZHN0X3R5cGUtPmRzdF9mZWF0dXJlOwotCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJSZWNvZ25pc2UgWyVzXVxuIiwgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkKTsKLQorCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJSZWNvZ25pc2UgWyVzXSIsIHBfZHN0X3R5cGUtPmRldmljZV9pZCk7CisJCQlzdHJuY3B5KCZzdGF0ZS0+ZndfbmFtZVswXSwgcF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCA2KTsKKwkJCS8qCU11bHRpcGxlIHR1bmVycwkJKi8KKwkJCWlmIChwX2RzdF90eXBlLT50dW5lcl90eXBlICYgVFVORVJfVFlQRV9NVUxUSSkgeworCQkJCXN3aXRjaCAodXNlX2RzdF90eXBlKSB7CisJCQkJY2FzZSBEU1RfVFlQRV9JU19TQVQ6CisJCQkJCS8qCVNUVjAyOTkgY2hlY2sJKi8KKwkJCQkJaWYgKGRzdF9jaGVja19zdHYwMjk5KHN0YXRlKSA8IDApIHsKKwkJCQkJCWRwcmludGsodmVyYm9zZSwgRFNUX0VSUk9SLCAxLCAiVW5zdXBwb3J0ZWQiKTsKKwkJCQkJCXN0YXRlLT50dW5lcl90eXBlID0gVFVORVJfVFlQRV9NQjg2QTE1OworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAoZHN0X2NoZWNrX21iODZhMTUoc3RhdGUpIDwgMCkKKwkJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJVbnN1cHBvcnRlZCIpOworCQkJLyoJU2luZ2xlIHR1bmVyCQkqLworCQkJfSBlbHNlIHsKKwkJCQlzdGF0ZS0+dHVuZXJfdHlwZSA9IHBfZHN0X3R5cGUtPnR1bmVyX3R5cGU7CisJCQl9CisJCQlmb3IgKGogPSAwLCBwX3R1bmVyX2xpc3QgPSB0dW5lcl9saXN0OyBqIDwgQVJSQVlfU0laRSh0dW5lcl9saXN0KTsgaisrLCBwX3R1bmVyX2xpc3QrKykgeworCQkJCWlmICghKHN0cm5jbXAocF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCBwX3R1bmVyX2xpc3QtPmZ3X25hbWUsIDcpKSAmJgorCQkJCQlwX3R1bmVyX2xpc3QtPnR1bmVyX3R5cGUgPT0gc3RhdGUtPnR1bmVyX3R5cGUpIHsKKwkJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfRVJST1IsIDEsICJbJXNdIGhhcyBhIFslc10iLAorCQkJCQkJcF9kc3RfdHlwZS0+ZGV2aWNlX2lkLCBwX3R1bmVyX2xpc3QtPnR1bmVyX25hbWUpOworCQkJCX0KKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtOTAwLDEwICsxMTY3LDEwIEBACiAJCXVzZV9kc3RfdHlwZSA9IERTVF9UWVBFX0lTX1NBVDsKIAkJdXNlX3R5cGVfZmxhZ3MgPSBEU1RfVFlQRV9IQVNfU1lNRElWOwogCX0KLQlkc3RfdHlwZV9wcmludCh1c2VfZHN0X3R5cGUpOworCWRzdF90eXBlX3ByaW50KHN0YXRlLCB1c2VfZHN0X3R5cGUpOwogCXN0YXRlLT50eXBlX2ZsYWdzID0gdXNlX3R5cGVfZmxhZ3M7CiAJc3RhdGUtPmRzdF90eXBlID0gdXNlX2RzdF90eXBlOwotCWRzdF90eXBlX2ZsYWdzX3ByaW50KHN0YXRlLT50eXBlX2ZsYWdzKTsKKwlkc3RfdHlwZV9mbGFnc19wcmludChzdGF0ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTkxMSwxNSArMTE3OCwxNSBAQAogc3RhdGljIGludCBkc3RfcHJvYmUoc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CiAJbXV0ZXhfaW5pdCgmc3RhdGUtPmRzdF9tdXRleCk7Ci0JaWYgKChyZGNfODgyMF9yZXNldChzdGF0ZSkpIDwgMCkgewotCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFJFU0VUIEZhaWxlZC4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoZHN0X2FkZG9ucyAmIERTVF9UWVBFX0hBU19DQSkKKwlpZiAoZHN0X2FkZG9ucyAmIERTVF9UWVBFX0hBU19DQSkgeworCQlpZiAoKHJkY184ODIwX3Jlc2V0KHN0YXRlKSkgPCAwKSB7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIlJEQyA4ODIwIFJFU0VUIEZhaWxlZC4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQogCQltc2xlZXAoNDAwMCk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCW1zbGVlcCgxMDApOwotCisJfQogCWlmICgoZHN0X2NvbW1faW5pdChzdGF0ZSkpIDwgMCkgewogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgIkRTVCBJbml0aWFsaXphdGlvbiBGYWlsZWQuIik7CiAJCXJldHVybiAtMTsKQEAgLTkzMSw3ICsxMTk4LDYgQEAKIAl9CiAJaWYgKGRzdF9nZXRfbWFjKHN0YXRlKSA8IDApIHsKIAkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgIk1BQzogVW5zdXBwb3J0ZWQgY29tbWFuZCIpOwotCQlyZXR1cm4gMDsKIAl9CiAJaWYgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19NVUxUSV9GRSkgfHwgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX0ZXX0JVSUxEKSkgewogCQlpZiAoZHN0X2dldF90dW5lcl9pbmZvKHN0YXRlKSA8IDApCkBAIC0xMDQ4LDYgKzEzMTQsMTAgQEAKIAkJCXN0YXRlLT5kZWNvZGVfbG9jayA9IChzdGF0ZS0+cnhidWZmZXJbMV0pID8gMSA6IDA7CiAJCQlzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPnJ4YnVmZmVyWzRdIDw8IDg7CiAJCQlzdGF0ZS0+ZGVjb2RlX3NuciA9IHN0YXRlLT5yeGJ1ZmZlclszXSA8PCA4OworCQl9IGVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19BVFNDKSB7CisJCQlzdGF0ZS0+ZGVjb2RlX2xvY2sgPSAoc3RhdGUtPnJ4YnVmZmVyWzZdID09IDB4MDApID8gMSA6IDA7CisJCQlzdGF0ZS0+ZGVjb2RlX3N0cmVuZ3RoID0gc3RhdGUtPnJ4YnVmZmVyWzRdIDw8IDg7CisJCQlzdGF0ZS0+ZGVjb2RlX3NuciA9IHN0YXRlLT5yeGJ1ZmZlclsyXSA8PCA4IHwgc3RhdGUtPnJ4YnVmZmVyWzNdOwogCQl9CiAJCXN0YXRlLT5jdXJfamlmZiA9IGppZmZpZXM7CiAJfQpAQCAtMTA3OCw4ICsxMzQ4LDkgQEAKIAlzdGF0ZS0+ZGlzZXFfZmxhZ3MgJj0gfihIQVNfTE9DSyk7CiAJaWYgKCFkc3Rfd2FpdF9kc3RfcmVhZHkoc3RhdGUsIE5PX0RFTEFZKSkKIAkJcmV0dXJuIC1FSU87Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpCi0JCS8qIGhvdyB0byBnZXQgdmFyaWFibGUgbGVuZ3RoIHJlcGx5ID8/Pz8gKi8KKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJIShzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQVRTQykpCisKIAkJcmV0dmFsID0gcmVhZF9kc3Qoc3RhdGUsIHN0YXRlLT5yeF90dW5hLCAxMCk7CiAJZWxzZQogCQlyZXR2YWwgPSByZWFkX2RzdChzdGF0ZSwgJnN0YXRlLT5yeF90dW5hWzJdLCBGSVhFRF9DT01NKTsKQEAgLTEwODcsNyArMTM1OCwxMCBAQAogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgInJlYWQgbm90IHN1Y2Nlc3NmdWwiKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9Ci0JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJIShzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpICYmCisJCSEoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpKSB7CisKIAkJaWYgKHN0YXRlLT5yeF90dW5hWzldICE9IGRzdF9jaGVja19zdW0oJnN0YXRlLT5yeF90dW5hWzBdLCA5KSkgewogCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfSU5GTywgMSwgImNoZWNrc3VtIGZhaWx1cmUgPyAiKTsKIAkJCXJldHVybiAtRUlPOwpAQCAtMTEzMyw3ICsxNDA3LDEwIEBACiAJCWRwcmludGsodmVyYm9zZSwgRFNUX0RFQlVHLCAxLCAiRFNUIENvbW11bmljYXRpb24gaW5pdGlhbGl6YXRpb24gZmFpbGVkLiIpOwogCQlnb3RvIGVycm9yOwogCX0KLQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgeworLy8JaWYgKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX05FV1RVTkUpIHsKKwlpZiAoKHN0YXRlLT50eXBlX2ZsYWdzICYgRFNUX1RZUEVfSEFTX1ZMRikgJiYKKwkJKCEoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX0FUU0MpKSkgeworCiAJCXN0YXRlLT50eF90dW5hWzldID0gZHN0X2NoZWNrX3N1bSgmc3RhdGUtPnR4X3R1bmFbMF0sIDkpOwogCQlyZXR2YWwgPSB3cml0ZV9kc3Qoc3RhdGUsICZzdGF0ZS0+dHhfdHVuYVswXSwgMTApOwogCX0gZWxzZSB7CkBAIC0xMTg5LDkgKzE0NjYsMTIgQEAKIAogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgIT0gRFNUX1RZUEVfSVNfU0FUKQogCQlyZXR1cm4gMDsKLQlpZiAoY21kLT5tc2dfbGVuID09IDAgfHwgY21kLT5tc2dfbGVuID4gNCkKKwlpZiAoY21kLT5tc2dfbGVuID4gMCAmJiBjbWQtPm1zZ19sZW4gPCA1KQorCQltZW1jcHkoJnBha2V0WzNdLCBjbWQtPm1zZywgY21kLT5tc2dfbGVuKTsKKwllbHNlIGlmIChjbWQtPm1zZ19sZW4gPT0gNSAmJiBzdGF0ZS0+ZHN0X2h3X2NhcCAmIERTVF9UWVBFX0hBU19ESVNFUUM1KQorCQltZW1jcHkoJnBha2V0WzJdLCBjbWQtPm1zZywgY21kLT5tc2dfbGVuKTsKKwllbHNlCiAJCXJldHVybiAtRUlOVkFMOwotCW1lbWNweSgmcGFrZXRbM10sIGNtZC0+bXNnLCBjbWQtPm1zZ19sZW4pOwogCXBha2V0WzddID0gZHN0X2NoZWNrX3N1bSgmcGFrZXRbMF0sIDcpOwogCWRzdF9jb21tYW5kKHN0YXRlLCBwYWtldCwgOCk7CiAJcmV0dXJuIDA7CkBAIC0xMjg3LDggKzE1NjcsOSBAQAogCXN0YXRpYyB1OCBzYXRfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHg1NSwgMHhiZCwgMHg1MCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCB0ZXJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCB0ZXJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCXN0YXRpYyB1OCBjYWJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCXN0YXRpYyB1OCBjYWJfdHVuYV8xODhbXSA9IHsgMHgwOSwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBjYWJfdHVuYV8yMDRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMywgMHhiNiwgMHgwMSwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9OworCXN0YXRpYyB1OCBhdHNjX3R1bmVyW10gPSB7IDB4MDAsIDB4MDAsIDB4MDMsIDB4YjYsIDB4MDEsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfTsKIAogCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwogCXN0YXRlLT52b2x0YWdlID0gU0VDX1ZPTFRBR0VfMTM7CkBAIC0xMjk4LDExICsxNTc5LDEzIEBACiAJc3RhdGUtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF83X01IWjsKIAlzdGF0ZS0+Y3VyX2ppZmYgPSBqaWZmaWVzOwogCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKQotCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfTkVXVFVORSkgPyBzYXRfdHVuYV8xODggOiBzYXRfdHVuYV8yMDQpLCBzaXplb2YgKHNhdF90dW5hXzIwNCkpOworCQltZW1jcHkoc3RhdGUtPnR4X3R1bmEsICgoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfVkxGKSA/IHNhdF90dW5hXzE4OCA6IHNhdF90dW5hXzIwNCksIHNpemVvZiAoc2F0X3R1bmFfMjA0KSk7CiAJZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCi0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IHRlcl90dW5hXzE4OCA6IHRlcl90dW5hXzIwNCksIHNpemVvZiAodGVyX3R1bmFfMjA0KSk7CisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpID8gdGVyX3R1bmFfMTg4IDogdGVyX3R1bmFfMjA0KSwgc2l6ZW9mICh0ZXJfdHVuYV8yMDQpKTsKIAllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQ0FCTEUpCi0JCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19ORVdUVU5FKSA/IGNhYl90dW5hXzE4OCA6IGNhYl90dW5hXzIwNCksIHNpemVvZiAoY2FiX3R1bmFfMjA0KSk7CisJCW1lbWNweShzdGF0ZS0+dHhfdHVuYSwgKChzdGF0ZS0+dHlwZV9mbGFncyAmIERTVF9UWVBFX0hBU19WTEYpID8gY2FiX3R1bmFfMTg4IDogY2FiX3R1bmFfMjA0KSwgc2l6ZW9mIChjYWJfdHVuYV8yMDQpKTsKKwllbHNlIGlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfQVRTQykKKwkJbWVtY3B5KHN0YXRlLT50eF90dW5hLCBhdHNjX3R1bmVyLCBzaXplb2YgKGF0c2NfdHVuZXIpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTM0MSw3ICsxNjI0LDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKK3N0YXRpYyBpbnQgZHN0X3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAocCAhPSBOVUxMKSB7CisJCWRzdF9zZXRfZnJlcShzdGF0ZSwgcC0+ZnJlcXVlbmN5KTsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfREVCVUcsIDEsICJTZXQgRnJlcXVlbmN5PVslZF0iLCBwLT5mcmVxdWVuY3kpOworCisJCWlmIChzdGF0ZS0+ZHN0X3R5cGUgPT0gRFNUX1RZUEVfSVNfU0FUKSB7CisJCQlpZiAoc3RhdGUtPnR5cGVfZmxhZ3MgJiBEU1RfVFlQRV9IQVNfT0JTX1JFR1MpCisJCQkJZHN0X3NldF9pbnZlcnNpb24oc3RhdGUsIHAtPmludmVyc2lvbik7CisJCQlkc3Rfc2V0X2ZlYyhzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CisJCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CisJCQlkc3Rfc2V0X3BvbGFyaXphdGlvbihzdGF0ZSk7CisJCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9ERUJVRywgMSwgIlNldCBTeW1ib2xyYXRlPVslZF0iLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOworCisJCX0gZWxzZSBpZiAoc3RhdGUtPmRzdF90eXBlID09IERTVF9UWVBFX0lTX1RFUlIpCisJCQlkc3Rfc2V0X2JhbmR3aWR0aChzdGF0ZSwgcC0+dS5vZmRtLmJhbmR3aWR0aCk7CisJCWVsc2UgaWYgKHN0YXRlLT5kc3RfdHlwZSA9PSBEU1RfVFlQRV9JU19DQUJMRSkgeworCQkJZHN0X3NldF9mZWMoc3RhdGUsIHAtPnUucWFtLmZlY19pbm5lcik7CisJCQlkc3Rfc2V0X3N5bWJvbHJhdGUoc3RhdGUsIHAtPnUucWFtLnN5bWJvbF9yYXRlKTsKKwkJCWRzdF9zZXRfbW9kdWxhdGlvbihzdGF0ZSwgcC0+dS5xYW0ubW9kdWxhdGlvbik7CisJCX0KKwkJZHN0X3dyaXRlX3R1bmEoZmUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzdF90dW5lX2Zyb250ZW5kKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcCwKIAkJCSAgICB1bnNpZ25lZCBpbnQgbW9kZV9mbGFncywKIAkJCSAgICBpbnQgKmRlbGF5LApAQCAtMTM3OCw2ICsxNjkwLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZHN0X2dldF90dW5pbmdfYWxnbyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlyZXR1cm4gZHN0X2FsZ287Cit9CisKIHN0YXRpYyBpbnQgZHN0X2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogewogCXN0cnVjdCBkc3Rfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC0xNDA4LDYgKzE3MjUsNyBAQAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9kdmJ0X29wczsKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBkc3RfZHZic19vcHM7CiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHN0X2R2YmNfb3BzOworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9hdHNjX29wczsKIAogc3RydWN0IGRzdF9zdGF0ZSAqZHN0X2F0dGFjaChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGR2Yl9hZGFwdGVyICpkdmJfYWRhcHRlcikKIHsKQEAgLTE0MTcsMjQgKzE3MzUsMjUgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qIGRldGVybWluZSBzZXR0aW5ncyBiYXNlZCBvbiB0eXBlICovCisJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwogCXN3aXRjaCAoc3RhdGUtPmRzdF90eXBlKSB7CiAJY2FzZSBEU1RfVFlQRV9JU19URVJSOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZidF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfZHZidF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAljYXNlIERTVF9UWVBFX0lTX0NBQkxFOgotCQltZW1jcHkoJnN0YXRlLT5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfZHZiY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAljYXNlIERTVF9UWVBFX0lTX1NBVDoKLQkJbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHN0X2R2YnNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwkJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmZHN0X2R2YnNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwkJYnJlYWs7CisJY2FzZSBEU1RfVFlQRV9JU19BVFNDOgorCQltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkc3RfYXRzY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9FUlJPUiwgMSwgInVua25vd24gRFNUIHR5cGUuIHBsZWFzZSByZXBvcnQgdG8gdGhlIExpbnV4VFYub3JnIERWQiBtYWlsaW5nbGlzdC4iKTsKIAkJa2ZyZWUoc3RhdGUpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0KLQkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAlyZXR1cm4gc3RhdGU7CQkJCS8qCU1hbnUgKERTVCBpcyBhIGNhcmQgbm90IGEgZnJvbnRlbmQpCSovCkBAIC0xNDU1LDggKzE3NzQsMTAgQEAKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCiAJLmluaXQgPSBkc3RfaW5pdCwKLQkudHVuZSA9IGRzdF9zZXRfZnJvbnRlbmQsCisJLnR1bmUgPSBkc3RfdHVuZV9mcm9udGVuZCwKKwkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kX2FsZ28gPSBkc3RfZ2V0X3R1bmluZ19hbGdvLAogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gZHN0X3JlYWRfc25yLApAQCAtMTQ3OSw4ICsxODAwLDEwIEBACiAKIAkucmVsZWFzZSA9IGRzdF9yZWxlYXNlLAogCS5pbml0ID0gZHN0X2luaXQsCi0JLnR1bmUgPSBkc3Rfc2V0X2Zyb250ZW5kLAorCS50dW5lID0gZHN0X3R1bmVfZnJvbnRlbmQsCisJLnNldF9mcm9udGVuZCA9IGRzdF9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IGRzdF9nZXRfZnJvbnRlbmQsCisJLmdldF9mcm9udGVuZF9hbGdvID0gZHN0X2dldF90dW5pbmdfYWxnbywKIAkucmVhZF9zdGF0dXMgPSBkc3RfcmVhZF9zdGF0dXMsCiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gZHN0X3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAogCS5yZWFkX3NuciA9IGRzdF9yZWFkX3NuciwKQEAgLTE1MDYsMTMgKzE4MjksMzggQEAKIAogCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCiAJLmluaXQgPSBkc3RfaW5pdCwKLQkudHVuZSA9IGRzdF9zZXRfZnJvbnRlbmQsCisJLnR1bmUgPSBkc3RfdHVuZV9mcm9udGVuZCwKKwkuc2V0X2Zyb250ZW5kID0gZHN0X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gZHN0X2dldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kX2FsZ28gPSBkc3RfZ2V0X3R1bmluZ19hbGdvLAogCS5yZWFkX3N0YXR1cyA9IGRzdF9yZWFkX3N0YXR1cywKIAkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkc3RfcmVhZF9zaWduYWxfc3RyZW5ndGgsCiAJLnJlYWRfc25yID0gZHN0X3JlYWRfc25yLAogfTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1QgRFZCLVMvVC9DIENvbWJvIEZyb250ZW5kIGRyaXZlciIpOworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRzdF9hdHNjX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiRFNUIEFUU0MiLAorCQkudHlwZSA9IEZFX0FUU0MsCisJCS5mcmVxdWVuY3lfc3RlcHNpemUgPSA2MjUwMCwKKwkJLmZyZXF1ZW5jeV9taW4gPSA1MTAwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ID0gODU4MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWluID0gMTAwMDAwMCwKKwkJLnN5bWJvbF9yYXRlX21heCA9IDQ1MDAwMDAwLAorCQkuY2FwcyA9IEZFX0NBTl9GRUNfQVVUTyB8IEZFX0NBTl9RQU1fQVVUTyB8IEZFX0NBTl9RQU1fNjQgfCBGRV9DQU5fUUFNXzI1NiB8IEZFX0NBTl84VlNCCisJfSwKKworCS5yZWxlYXNlID0gZHN0X3JlbGVhc2UsCisJLmluaXQgPSBkc3RfaW5pdCwKKwkudHVuZSA9IGRzdF90dW5lX2Zyb250ZW5kLAorCS5zZXRfZnJvbnRlbmQgPSBkc3Rfc2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmQgPSBkc3RfZ2V0X2Zyb250ZW5kLAorCS5nZXRfZnJvbnRlbmRfYWxnbyA9IGRzdF9nZXRfdHVuaW5nX2FsZ28sCisJLnJlYWRfc3RhdHVzID0gZHN0X3JlYWRfc3RhdHVzLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGRzdF9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBkc3RfcmVhZF9zbnIsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRTVCBEVkItUy9UL0MvQVRTQyBDb21ibyBGcm9udGVuZCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkphbWllIEhvbmFuLCBNYW51IEFicmFoYW0iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jYS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKaW5kZXggZjZiNDlhOC4uZmE5MjNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NhLmMKQEAgLTY4LDYgKzY4LDEzIEBACiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCitzdGF0aWMgdm9pZCBwdXRfY29tbWFuZF9hbmRfbGVuZ3RoKHU4ICpkYXRhLCBpbnQgY29tbWFuZCwgaW50IGxlbmd0aCkKK3sKKwlkYXRhWzBdID0gKGNvbW1hbmQgPj4gMTYpICYgMHhmZjsKKwlkYXRhWzFdID0gKGNvbW1hbmQgPj4gOCkgJiAweGZmOworCWRhdGFbMl0gPSBjb21tYW5kICYgMHhmZjsKKwlkYXRhWzNdID0gbGVuZ3RoOworfQogCiBzdGF0aWMgdm9pZCBwdXRfY2hlY2tzdW0odTggKmNoZWNrX3N0cmluZywgaW50IGxlbmd0aCkKIHsKQEAgLTEyNCwxNSArMTMxLDE4IEBACiAJdTggZHN0X2NhX2NvbW1fZXJyID0gMDsKIAogCXdoaWxlIChkc3RfY2FfY29tbV9lcnIgPCBSRVRSSUVTKSB7Ci0JCWRzdF9jb21tX2luaXQoc3RhdGUpOwogCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9OT1RJQ0UsIDEsICIgUHV0IENvbW1hbmQiKTsKIAkJaWYgKGRzdF9jaV9jb21tYW5kKHN0YXRlLCBkYXRhLCBjYV9zdHJpbmcsIGxlbiwgcmVhZCkpIHsJLy8gSWYgZXJyb3IKIAkJCWRzdF9lcnJvcl9yZWNvdmVyeShzdGF0ZSk7CiAJCQlkc3RfY2FfY29tbV9lcnIrKzsgLy8gd29yayByZXF1aXJlZCBoZXJlLgorCQl9IGVsc2UgeworCQkJYnJlYWs7CiAJCX0KLQkJYnJlYWs7CiAJfQogCisJaWYoZHN0X2NhX2NvbW1fZXJyID09IFJFVFJJRVMpCisJCXJldHVybiAtMTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDAsNiArMTUwLDcgQEAKIAogc3RhdGljIGludCBjYV9nZXRfYXBwX2luZm8oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCiB7CisJaW50IGxlbmd0aCwgc3RyX2xlbmd0aDsKIAlzdGF0aWMgdTggY29tbWFuZFs4XSA9IHsweDA3LCAweDQwLCAweDAxLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweGZmfTsKIAogCXB1dF9jaGVja3N1bSgmY29tbWFuZFswXSwgY29tbWFuZFswXSk7CkBAIC0xNTQsNiArMTY1LDY4IEBACiAJCShzdGF0ZS0+bWVzc2FnZXNbMTBdIDw8IDgpIHwgc3RhdGUtPm1lc3NhZ2VzWzExXSwgX19GVU5DVElPTl9fLCAoY2hhciAqKSgmc3RhdGUtPm1lc3NhZ2VzWzEyXSkpOwogCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKIAorCS8vIFRyYW5zZm9ybSBkc3QgbWVzc2FnZSB0byBjb3JyZWN0IGFwcGxpY2F0aW9uX2luZm8gbWVzc2FnZQorCWxlbmd0aCA9IHN0YXRlLT5tZXNzYWdlc1s1XTsKKwlzdHJfbGVuZ3RoID0gbGVuZ3RoIC0gNjsKKwlpZiAoc3RyX2xlbmd0aCA8IDApIHsKKwkJc3RyX2xlbmd0aCA9IDA7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiSW52YWxpZCBzdHJpbmcgbGVuZ3RoIHJldHVybmVkIGluIGNhX2dldF9hcHBfaW5mbygpLiBSZWNvdmVyaW5nLiIpOworCX0KKworCS8vIEZpcnN0LCB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIGZpZWxkcworCXB1dF9jb21tYW5kX2FuZF9sZW5ndGgoJnN0YXRlLT5tZXNzYWdlc1swXSwgQ0FfQVBQX0lORk8sIGxlbmd0aCk7CisKKwkvLyBDb3B5IGFwcGxpY2F0aW9uX3R5cGUsIGFwcGxpY2F0aW9uX21hbnVmYWN0dXJlciBhbmQgbWFudWZhY3R1cmVyX2NvZGUKKwltZW1jcHkoJnN0YXRlLT5tZXNzYWdlc1s0XSwgJnN0YXRlLT5tZXNzYWdlc1s3XSwgNSk7CisKKwkvLyBTZXQgc3RyaW5nIGxlbmd0aCBhbmQgY29weSBzdHJpbmcKKwlzdGF0ZS0+bWVzc2FnZXNbOV0gPSBzdHJfbGVuZ3RoOworCW1lbWNweSgmc3RhdGUtPm1lc3NhZ2VzWzEwXSwgJnN0YXRlLT5tZXNzYWdlc1sxMl0sIHN0cl9sZW5ndGgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2FfZ2V0X2NhX2luZm8oc3RydWN0IGRzdF9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHNyY1B0ciwgZHN0UHRyLCBpLCBudW1faWRzOworCXN0YXRpYyB1OCBzbG90X2NvbW1hbmRbOF0gPSB7MHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhmZn07CisJY29uc3QgaW50IGluX3N5c3RlbV9pZF9wb3MgPSA4LCBvdXRfc3lzdGVtX2lkX3BvcyA9IDQsIGluX251bV9pZHNfcG9zID0gNzsKKworCXB1dF9jaGVja3N1bSgmc2xvdF9jb21tYW5kWzBdLCBzbG90X2NvbW1hbmRbMF0pOworCWlmICgoZHN0X3B1dF9jaShzdGF0ZSwgc2xvdF9jb21tYW5kLCBzaXplb2YgKHNsb3RfY29tbWFuZCksIHN0YXRlLT5tZXNzYWdlcywgR0VUX1JFUExZKSkgPCAwKSB7CisJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIC0tPmRzdF9wdXRfY2kgRkFJTEVEICEiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAxLCAiIC0tPmRzdF9wdXRfY2kgU1VDQ0VTUyAhIik7CisKKwkvLyBQcmludCByYXcgZGF0YQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgRFNUIGRhdGEgPSBbIik7CisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5tZXNzYWdlc1swXSArIDE7IGkrKykgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiIDB4JTAyeCIsIHN0YXRlLT5tZXNzYWdlc1tpXSk7CisJfQorCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICJdXG4iKTsKKworCS8vIFNldCB0aGUgY29tbWFuZCBhbmQgbGVuZ3RoIG9mIHRoZSBvdXRwdXQKKwludW1faWRzID0gc3RhdGUtPm1lc3NhZ2VzW2luX251bV9pZHNfcG9zXTsKKwlpZiAobnVtX2lkcyA+PSAxMDApIHsKKwkJbnVtX2lkcyA9IDEwMDsKKwkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICJJbnZhbGlkIG51bWJlciBvZiBpZHMgKD4xMDApLiBSZWNvdmVyaW5nLiIpOworCX0KKwlwdXRfY29tbWFuZF9hbmRfbGVuZ3RoKCZzdGF0ZS0+bWVzc2FnZXNbMF0sIENBX0lORk8sIG51bV9pZHMgKiAyKTsKKworCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDAsICIgQ0FfSU5GTyA9IFsiKTsKKwlzcmNQdHIgPSBpbl9zeXN0ZW1faWRfcG9zOworCWRzdFB0ciA9IG91dF9zeXN0ZW1faWRfcG9zOworCWZvcihpID0gMDsgaSA8IG51bV9pZHM7IGkrKykgeworCQlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiIDB4JTAyeCUwMngiLCBzdGF0ZS0+bWVzc2FnZXNbc3JjUHRyICsgMF0sIHN0YXRlLT5tZXNzYWdlc1tzcmNQdHIgKyAxXSk7CisJCS8vIEFwcGVuZCB0byBvdXRwdXQKKwkJc3RhdGUtPm1lc3NhZ2VzW2RzdFB0ciArIDBdID0gc3RhdGUtPm1lc3NhZ2VzW3NyY1B0ciArIDBdOworCQlzdGF0ZS0+bWVzc2FnZXNbZHN0UHRyICsgMV0gPSBzdGF0ZS0+bWVzc2FnZXNbc3JjUHRyICsgMV07CisJCXNyY1B0ciArPSAyOworCQlkc3RQdHIgKz0gMjsKKwl9CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIl1cbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NCw3ICsyNDcsNyBAQAogCiAJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMSwgIiBTbG90IGNhcCA9IFslZF0iLCBzbG90X2NhcFs3XSk7CiAJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBzbG90X2NhcFswXSArIDE7IGkrKykKIAkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfSU5GTywgMCwgIiAlZCIsIHNsb3RfY2FwW2ldKTsKIAlkcHJpbnRrKHZlcmJvc2UsIERTVF9DQV9JTkZPLCAwLCAiXG4iKTsKIApAQCAtMjYwLDYgKzMzMywxMSBAQAogCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIHBfY2FfbWVzc2FnZSwgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkgKQogCQkJCXJldHVybiAtRUZBVUxUOwogCQkJYnJlYWs7CisJCWNhc2UgQ0FfSU5GTzoKKwkJCW1lbWNweShwX2NhX21lc3NhZ2UtPm1zZywgc3RhdGUtPm1lc3NhZ2VzLCAxMjgpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIHBfY2FfbWVzc2FnZSwgc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSkgKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTMwMiw3ICszODAsNyBAQAogCQlyZGNfcmVzZXRfc3RhdGUoc3RhdGUpOwogCQlyZXR1cm4gLTE7CiAJfQotCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX05PVElDRSwgMSwgIiBEU1QtQ0kgQ29tbWFuZCBzdWNjZXMuIik7CisJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfTk9USUNFLCAxLCAiIERTVC1DSSBDb21tYW5kIHN1Y2Nlc3MuIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0MCw2ICs0MTgsNyBAQAogCXJldHVybiAwOwogfQogCisKIHN0YXRpYyBpbnQgY2Ffc2V0X3BtdChzdHJ1Y3QgZHN0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGNhX21zZyAqcF9jYV9tZXNzYWdlLCBzdHJ1Y3QgY2FfbXNnICpod19idWZmZXIsIHU4IHJlcGx5LCB1OCBxdWVyeSkKIHsKIAl1MzIgbGVuZ3RoID0gMDsKQEAgLTQ1NSw2ICs1MzQsMTYgQEAKIAkJCX0KIAkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfQVBQX0lORk9fRU5RVUlSWSBTdWNjZXNzICEiKTsKIAkJCWJyZWFrOworCQljYXNlIENBX0lORk9fRU5RVUlSWToKKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgR2V0dGluZyBDQSBJbmZvcm1hdGlvbiIpOworCisJCQlpZiAoKGNhX2dldF9jYV9pbmZvKHN0YXRlKSkgPCAwKSB7CisJCQkJZHByaW50ayh2ZXJib3NlLCBEU1RfQ0FfRVJST1IsIDEsICIgLS0+Q0FfSU5GT19FTlFVSVJZIEZhaWxlZCAhIik7CisJCQkJcmVzdWx0ID0gLTE7CisJCQkJZ290byBmcmVlX21lbV9hbmRfZXhpdDsKKwkJCX0KKwkJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0lORk8sIDEsICIgLS0+Q0FfSU5GT19FTlFVSVJZIFN1Y2Nlc3MgISIpOworCQkJYnJlYWs7CiAJCX0KIAl9CiBmcmVlX21lbV9hbmRfZXhpdDoKQEAgLTQ3MywxOCArNTYyLDE1IEBACiAJdm9pZCBfX3VzZXIgKmFyZyA9ICh2b2lkIF9fdXNlciAqKWlvY3RsX2FyZzsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCWlmICgocF9jYV9tZXNzYWdlID0gKHN0cnVjdCBjYV9tc2cgKikga21hbGxvYyhzaXplb2YgKHN0cnVjdCBjYV9tc2cpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCXBfY2FfbWVzc2FnZSA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfbXNnKSwgR0ZQX0tFUk5FTCk7CisJcF9jYV9zbG90X2luZm8gPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpOworCXBfY2FfY2FwcyA9IGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpOworCWlmICghcF9jYV9tZXNzYWdlIHx8ICFwX2NhX3Nsb3RfaW5mbyB8fCAhcF9jYV9jYXBzKSB7CiAJCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJlc3VsdCA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9tZW1fYW5kX2V4aXQ7CiAJfQotCWlmICgocF9jYV9zbG90X2luZm8gPSAoc3RydWN0IGNhX3Nsb3RfaW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNhX3Nsb3RfaW5mbyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWlmICgocF9jYV9jYXBzID0gKHN0cnVjdCBjYV9jYXBzICopIGttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgY2FfY2FwcyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0VSUk9SLCAxLCAiIE1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUiKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCiAJLyoJV2UgaGF2ZSBub3cgb25seSB0aGUgc3RhbmRhcmQgaW9jdGwncywgdGhlIGRyaXZlciBpcyB1cHBvc2VkIHRvIGhhbmRsZSBpbnRlcm5hbHMuCSovCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIENBX1NFTkRfTVNHOgpAQCAtNTgyLDcgKzY2OCw3IEBACiAKIHN0YXRpYyBzc2l6ZV90IGRzdF9jYV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoLCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlpbnQgYnl0ZXNfcmVhZCA9IDA7CisJc3NpemVfdCBieXRlc19yZWFkID0gMDsKIAogCWRwcmludGsodmVyYm9zZSwgRFNUX0NBX0RFQlVHLCAxLCAiIERldmljZSByZWFkLiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kc3RfY29tbW9uLmgKaW5kZXggNTFkNGUwNC4uMDY3N2IwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHN0X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2RzdF9jb21tb24uaApAQCAtNDIsNyArNDIsNyBAQAogI2RlZmluZSBEU1RfVFlQRV9JU19DQUJMRQkyCiAjZGVmaW5lIERTVF9UWVBFX0lTX0FUU0MJMwogCi0jZGVmaW5lIERTVF9UWVBFX0hBU19ORVdUVU5FCTEKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX1RTMTg4CTEKICNkZWZpbmUgRFNUX1RZUEVfSEFTX1RTMjA0CTIKICNkZWZpbmUgRFNUX1RZUEVfSEFTX1NZTURJVgk0CiAjZGVmaW5lIERTVF9UWVBFX0hBU19GV18xCTgKQEAgLTUyLDYgKzUyLDkgQEAKICNkZWZpbmUgRFNUX1RZUEVfSEFTX09CU19SRUdTCTEyOAogI2RlZmluZSBEU1RfVFlQRV9IQVNfSU5DX0NPVU5UCTI1NgogI2RlZmluZSBEU1RfVFlQRV9IQVNfTVVMVElfRkUJNTEyCisjZGVmaW5lIERTVF9UWVBFX0hBU19ORVdUVU5FXzIJMTAyNAorI2RlZmluZSBEU1RfVFlQRV9IQVNfREJPQVJECTIwNDgKKyNkZWZpbmUgRFNUX1RZUEVfSEFTX1ZMRgk0MDk2CiAKIC8qCUNhcmQgY2FwYWJpbGl0eSBsaXN0CSovCiAKQEAgLTY0LDYgKzY3LDIwIEBACiAjZGVmaW5lCURTVF9UWVBFX0hBU19BTkFMT0cJNjQJLyoJQW5hbG9nIGlucHV0cwkqLwogI2RlZmluZSBEU1RfVFlQRV9IQVNfU0VTU0lPTgkxMjgKIAorI2RlZmluZSBUVU5FUl9UWVBFX01VTFRJCTEKKyNkZWZpbmUgVFVORVJfVFlQRV9VTktOT1dOCTIKKy8qCURWQi1TCQkqLworI2RlZmluZSBUVU5FUl9UWVBFX0w2NDcyNAk0CisjZGVmaW5lIFRVTkVSX1RZUEVfU1RWMDI5OQk4CisjZGVmaW5lIFRVTkVSX1RZUEVfTUI4NkExNQkxNgorCisvKglEVkItVAkJKi8KKyNkZWZpbmUgVFVORVJfVFlQRV9UREExMDA0NgkzMgorCisvKglBVFNDCQkqLworI2RlZmluZSBUVU5FUl9UWVBFX05YVDIwMHgJNjQKKworCiAjZGVmaW5lIFJEQ184ODIwX1BJT18wX0RJU0FCTEUJMAogI2RlZmluZSBSRENfODgyMF9QSU9fMF9FTkFCTEUJMQogI2RlZmluZSBSRENfODgyMF9JTlQJCTIKQEAgLTg0LDggKzEwMSw2IEBACiAKIAlzdHJ1Y3QgYnQ4NzgqIGJ0OwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwotCiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCBkc3RfY29uZmlnKiBjb25maWc7CiAKQEAgLTEyMSw4ICsxMzYsMTcgQEAKIAl1OCBjYXJkX2luZm9bOF07CiAJdTggdmVuZG9yWzhdOwogCXU4IGJvYXJkX2luZm9bOF07Ci0KKwl1MzIgdHVuZXJfdHlwZTsKKwljaGFyICp0dW5lcl9uYW1lOwogCXN0cnVjdCBtdXRleCBkc3RfbXV0ZXg7CisJdTggZndfbmFtZVs4XTsKK307CisKK3N0cnVjdCB0dW5lcl90eXBlcyB7CisJdTMyIHR1bmVyX3R5cGU7CisJY2hhciAqdHVuZXJfbmFtZTsKKwljaGFyICpib2FyZF9uYW1lOworCWNoYXIgKmZ3X25hbWU7CiB9OwogCiBzdHJ1Y3QgZHN0X3R5cGVzIHsKQEAgLTEzMSw2ICsxNTUsNyBAQAogCXU4IGRzdF90eXBlOwogCXUzMiB0eXBlX2ZsYWdzOwogCXUzMiBkc3RfZmVhdHVyZTsKKwl1MzIgdHVuZXJfdHlwZTsKIH07CiAKIHN0cnVjdCBkc3RfY29uZmlnCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCmluZGV4IGNjYzdiMmUuLmI3MTViOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2J0OHh4L2R2Yi1idDh4eC5jCkBAIC0xNDcsMTIgKzE0NywxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRob21zb25fZHR0NzU3OV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZikKK3N0YXRpYyBpbnQgdGhvbXNvbl9kdHQ3NTc5X3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewogCXUzMiBkaXY7CiAJdW5zaWduZWQgY2hhciBicyA9IDA7CiAJdW5zaWduZWQgY2hhciBjcCA9IDA7CiAKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybiAtRUlOVkFMOworCiAJZGl2ID0gKCgocGFyYW1zLT5mcmVxdWVuY3kgKyA4MzMzMykgKiAzKSAvIDUwMDAwMCkgKyBJRl9GUkVRVUVOQ1l4NjsKIAogCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDU0MjAwMDAwMCkKQEAgLTE2OSwyMiArMTcyLDI1IEBACiAJZWxzZQogCQlicyA9IDB4MDg7CiAKLQlwbGxidWZbMF0gPSAweGMwOyAvLyBOb3RlOiBub24tbGludXggc3RhbmRhcmQgUExMIGkyYyBhZGRyZXNzCisJcGxsYnVmWzBdID0gMHg2MDsKIAlwbGxidWZbMV0gPSBkaXYgPj4gODsKIAlwbGxidWZbMl0gPSBkaXYgJiAweGZmOwogCXBsbGJ1ZlszXSA9IGNwOwogCXBsbGJ1Zls0XSA9IGJzOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIHRob21zb25fZHR0NzU3OV9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gdGhvbXNvbl9kdHQ3NTc5X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSB0aG9tc29uX2R0dDc1NzlfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgY3gyNDEwOF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBzdHJ1Y3QgemwxMDM1M19jb25maWcgdGhvbXNvbl9kdHQ3NTc5X3psMTAzNTNfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKK307CisKK3N0YXRpYyBpbnQgY3gyNDEwOF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAl1MzIgZnJlcSA9IHBhcmFtcy0+ZnJlcXVlbmN5OwogCkBAIC0yMzcsNyArMjQzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaW5uc2F0X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQorc3RhdGljIGludCBwaW5uc2F0X3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gZmUtPmR2Yi0+cHJpdjsKIApAQCAtMjQ3LDcgKzI1Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGlubnNhdF9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCitzdGF0aWMgaW50IHBpbm5zYXRfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gZmUtPmR2Yi0+cHJpdjsKIApAQCAtMjU4LDEyICsyNjQsOSBAQAogCiBzdGF0aWMgc3RydWN0IGN4MjQxMTBfY29uZmlnIHBjdHZzYXRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKLQkucGxsX2luaXQgPSBwaW5uc2F0X3BsbF9pbml0LAotCS5wbGxfc2V0ID0gY3gyNDEwOF9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBwaW5uc2F0X3BsbF9zbGVlcCwKIH07CiAKLXN0YXRpYyBpbnQgbWljcm90dW5lX210NzIwMmR0Zl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgbWljcm90dW5lX210NzIwMmR0Zl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7CiAJdTggY2ZnLCBjcHVtcCwgYmFuZF9zZWxlY3Q7CkBAIC0yOTcsNiArMzAwLDggQEAKIAlkYXRhWzJdID0gKChkaXYgPj4gMTApICYgMHg2MCkgfCBjZmc7CiAJZGF0YVszXSA9IChjcHVtcCA8PCA2KSB8IGJhbmRfc2VsZWN0OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoY2FyZC0+aTJjX2FkYXB0ZXIsICZtc2csIDEpOwogCXJldHVybiAoZGl2ICogMTY2NjY2IC0gMzYwMDAwMDApOwogfQpAQCAtMzEwLDcgKzMxNSw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyBtaWNyb3R1bmVfbXQ3MjAyZHRmX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NzAsCi0JLnBsbF9zZXQgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3BsbF9zZXQsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBtaWNyb3R1bmVfbXQ3MjAyZHRmX3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC0zMzcsMTIgKzM0MSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHU4KiBwbGxidWYpCitzdGF0aWMgaW50IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfdHVuZXJfY2FsY19yZWdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1ZiwgaW50IGJ1Zl9sZW4pCiB7CiAJdTMyIGRpdjsKIAl1bnNpZ25lZCBjaGFyIGJzID0gMDsKIAl1bnNpZ25lZCBjaGFyIGNwID0gMDsKIAorCWlmIChidWZfbGVuIDwgNSkgcmV0dXJuIC1FSU5WQUw7CisKIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCiAJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwKQpAQCAtMzgzLDE5ICszODksMTggQEAKIAllbHNlCiAJCWJzID0gMHgwODsKIAotCXBsbGJ1ZlswXSA9IDB4YzI7IC8vIE5vdGU6IG5vbi1saW51eCBzdGFuZGFyZCBQTEwgaTJjIGFkZHJlc3MKKwlwbGxidWZbMF0gPSAweDYxOwogCXBsbGJ1ZlsxXSA9IGRpdiA+PiA4OwogCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4ZmY7CiAJcGxsYnVmWzNdID0gY3A7CiAJcGxsYnVmWzRdID0gYnM7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ID0gYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBkc3RfY29uZmlnIGRzdF9jb25maWcgPSB7CkBAIC00NTUsNyArNDYwLDcgQEAKIAkuc2xlZXAgPSBvcjUxMjExX3NsZWVwLAogfTsKIAotc3RhdGljIGludCB2cDMwMjFfYWxwc190ZGVkNF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgdnAzMDIxX2FscHNfdGRlZDRfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGR2Yl9idDh4eF9jYXJkICpjYXJkID0gKHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGJ1Zls0XTsKQEAgLTQ3OCw2ICs0ODMsOCBAQAogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcihjYXJkLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7CiAJcmV0dXJuIDA7CiB9CkBAIC00ODUsNyArNDkyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcgdnAzMDIxX2FscHNfdGRlZDRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKIAkuY2xvY2tfaW52ZXJzaW9uID0gMSwKLQkucGxsX3NldCA9IHZwMzAyMV9hbHBzX3RkZWQ0X3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCkBAIC01MDYsMTQgKzUxMiwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRpZ2l0dl9hbHBzX3RkZWQ0X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBkaWdpdHZfYWxwc190ZGVkNF90dW5lcl9jYWxjX3JlZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1OCogcGxsYnVmLCBpbnQgYnVmX2xlbikKIHsKIAl1MzIgZGl2OwogCXN0cnVjdCBkdmJfb2ZkbV9wYXJhbWV0ZXJzICpvcCA9ICZwYXJhbXMtPnUub2ZkbTsKIAorCWlmIChidWZfbGVuIDwgNSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlkaXYgPSAoKChwYXJhbXMtPmZyZXF1ZW5jeSArIDgzMzMzKSAqIDMpIC8gNTAwMDAwKSArIElGX0ZSRVFVRU5DWXg2OwogCi0JcGxsYnVmWzBdID0gMHhjMjsKKwlwbGxidWZbMF0gPSAweDYxOwogCXBsbGJ1ZlsxXSA9IChkaXYgPj4gOCkgJiAweDdGOwogCXBsbGJ1ZlsyXSA9IGRpdiAmIDB4RkY7CiAJcGxsYnVmWzNdID0gMHg4NTsKQEAgLTUzMCw3ICs1MzksNyBAQAogCWlmIChvcC0+YmFuZHdpZHRoID09IDgpCiAJCXBsbGJ1Zls0XSB8PSAweDA0OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIDU7CiB9CiAKIHN0YXRpYyB2b2lkIGRpZ2l0dl9hbHBzX3RkZWQ0X3Jlc2V0KHN0cnVjdCBkdmJfYnQ4eHhfY2FyZCAqYnQpCkBAIC01NTcsNDMgKzU2NiwxOCBAQAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZGlnaXR2X2FscHNfdGRlZDRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYSwKIAkuZGVtb2RfaW5pdCA9IGRpZ2l0dl9hbHBzX3RkZWQ0X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSBkaWdpdHZfYWxwc190ZGVkNF9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCB0ZHZzX3R1YTYwMzRfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IHRkdnNfdHVhNjAzNF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmNhcmQgPSAoc3RydWN0IGR2Yl9idDh4eF9jYXJkICopIGZlLT5kdmItPnByaXY7Ci0JdTggYnVmWzRdOwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKLQlpbnQgZXJyOwotCi0JZHZiX3BsbF9jb25maWd1cmUoJmR2Yl9wbGxfdGR2c190dWE2MDM0LCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCAwKTsKLQlkcHJpbnRrKCIlczogdHVuZXIgYXQgMHglMDJ4IGJ5dGVzOiAweCUwMnggMHglMDJ4IDB4JTAyeCAweCUwMnhcbiIsCi0JCV9fRlVOQ1RJT05fXywgbXNnLmFkZHIsIGJ1ZlswXSxidWZbMV0sYnVmWzJdLGJ1ZlszXSk7Ci0JaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoY2FyZC0+aTJjX2FkYXB0ZXIsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImR2Yi1idDh4eDogJXMgZXJyb3IgIgotCQkJIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJX19GVU5DVElPTl9fLCBidWZbMF0sIGJ1ZlsxXSwgZXJyKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllbHNlCi0JCQlyZXR1cm4gLUVSRU1PVEVJTzsKLQl9Ci0KLQkvKiBTZXQgdGhlIEF1eGlsaWFyeSBCeXRlLiAqLwotCWJ1ZlsyXSAmPSB+MHgyMDsKLQlidWZbMl0gfD0gMHgxODsKLQlidWZbM10gPSAweDUwOwotCWkyY190cmFuc2ZlcihjYXJkLT5pMmNfYWRhcHRlciwgJm1zZywgMSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgY2FyZC0+aTJjX2FkYXB0ZXIsIHBhcmFtcyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGdkdDMzMHhfY29uZmlnIHRkdnNfdHVhNjAzNF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAogCS5kZW1vZF9jaGlwICAgICAgID0gTEdEVDMzMDMsCiAJLnNlcmlhbF9tcGVnICAgICAgPSAweDQwLCAvKiBUUFNFUklBTCBmb3IgMzMwMyBpbiBUT1BfQ09OVFJPTCAqLwotCS5wbGxfc2V0ICAgICAgICAgID0gdGR2c190dWE2MDM0X3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdm9pZCBsZ2R0MzMweF9yZXNldChzdHJ1Y3QgZHZiX2J0OHh4X2NhcmQgKmJ0KQpAQCAtNjE3LDE3ICs2MDEsMjUgQEAKIAlzd2l0Y2godHlwZSkgewogCWNhc2UgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEU6CiAJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZ0aG9tc29uX2R0dDc1NzlfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CisKKwkJaWYgKGNhcmQtPmZlID09IE5VTEwpCisJCQljYXJkLT5mZSA9IHpsMTAzNTNfYXR0YWNoKCZ0aG9tc29uX2R0dDc1NzlfemwxMDM1M19jb25maWcsCisJCQkJCQkgIGNhcmQtPmkyY19hZGFwdGVyKTsKKwogCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkgewotCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOwotCQkJY2FyZC0+ZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwOworCQkJY2FyZC0+ZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gdGhvbXNvbl9kdHQ3NTc5X3R1bmVyX2NhbGNfcmVnczsKKwkJCWNhcmQtPmZlLT5vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gMTc0MDAwMDAwOworCQkJY2FyZC0+ZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9tYXggPSA4NjIwMDAwMDA7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJUVFZfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0xJVEU6CiAJCWxnZHQzMzB4X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IGxnZHQzMzB4X2F0dGFjaCgmdGR2c190dWE2MDM0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOwotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkKKwkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSB0ZHZzX3R1YTYwMzRfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGxnZHQzMzB4IGRldGVjdGVkXG4iKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9ORUJVTEFfRElHSVRWOgpAQCAtNjQwLDYgKzYzMiw3IEBACiAJCWRpZ2l0dl9hbHBzX3RkZWQ0X3Jlc2V0KGNhcmQpOwogCQljYXJkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZ2cDMwMjFfYWxwc190ZGVkNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSB2cDMwMjFfYWxwc190ZGVkNF90dW5lcl9zZXRfcGFyYW1zOwogCQkJZHByaW50ayAoImR2Yl9idDh4eDogYW4gbnh0NjAwMCB3YXMgZGV0ZWN0ZWQgb24geW91ciBkaWdpdHYgY2FyZFxuIik7CiAJCQlicmVhazsKIAkJfQpAQCAtNjQ4LDE5ICs2NDEsMjUgQEAKIAkJZGlnaXR2X2FscHNfdGRlZDRfcmVzZXQoY2FyZCk7CiAJCWNhcmQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfYWxwc190ZGVkNF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAotCQlpZiAoY2FyZC0+ZmUgIT0gTlVMTCkKKwkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGRpZ2l0dl9hbHBzX3RkZWQ0X3R1bmVyX2NhbGNfcmVnczsKIAkJCWRwcmludGsgKCJkdmJfYnQ4eHg6IGFuIG10MzUyIHdhcyBkZXRlY3RlZCBvbiB5b3VyIGRpZ2l0diBjYXJkXG4iKTsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzYxOgogCQljYXJkLT5mZSA9IHNwODg3eF9hdHRhY2goJm1pY3JvdHVuZV9tdDcyMDJkdGZfY29uZmlnLCBjYXJkLT5pMmNfYWRhcHRlcik7CisJCWlmIChjYXJkLT5mZSkgeworCQkJY2FyZC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IG1pY3JvdHVuZV9tdDcyMDJkdGZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQlRUVl9CT0FSRF9BVkRWQlRfNzcxOgogCQljYXJkLT5mZSA9IG10MzUyX2F0dGFjaCgmYWR2YnQ3NzFfc2Ftc3VuZ190ZHRjOTI1MWRoMF9jb25maWcsIGNhcmQtPmkyY19hZGFwdGVyKTsKIAkJaWYgKGNhcmQtPmZlICE9IE5VTEwpIHsKLQkJCWNhcmQtPmZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21pbiA9IDE3NDAwMDAwMDsKLQkJCWNhcmQtPmZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMDsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncyA9IGFkdmJ0NzcxX3NhbXN1bmdfdGR0YzkyNTFkaDBfdHVuZXJfY2FsY19yZWdzOworCQkJY2FyZC0+ZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSAxNzQwMDAwMDA7CisJCQljYXJkLT5mZS0+b3BzLmluZm8uZnJlcXVlbmN5X21heCA9IDg2MjAwMDAwMDsKIAkJfQogCQlicmVhazsKIApAQCAtNjg3LDYgKzY4NiwxMSBAQAogCiAJY2FzZSBCVFRWX0JPQVJEX1BJTk5BQ0xFU0FUOgogCQljYXJkLT5mZSA9IGN4MjQxMTBfYXR0YWNoKCZwY3R2c2F0X2NvbmZpZywgY2FyZC0+aTJjX2FkYXB0ZXIpOworCQlpZiAoY2FyZC0+ZmUpIHsKKwkJCWNhcmQtPmZlLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaW5uc2F0X3R1bmVyX2luaXQ7CisJCQljYXJkLT5mZS0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBpbm5zYXRfdHVuZXJfc2xlZXA7CisJCQljYXJkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gY3gyNDEwOF90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBCVFRWX0JPQVJEX1BDX0hEVFY6CkBAIC03MDMsOCArNzA3LDggQEAKIAllbHNlCiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5mZSkpIHsKIAkJCXByaW50aygiZHZiLWJ0OHh4OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoY2FyZC0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCQljYXJkLT5mZS0+b3BzLT5yZWxlYXNlKGNhcmQtPmZlKTsKKwkJCWlmIChjYXJkLT5mZS0+b3BzLnJlbGVhc2UpCisJCQkJY2FyZC0+ZmUtPm9wcy5yZWxlYXNlKGNhcmQtPmZlKTsKIAkJCWNhcmQtPmZlID0gTlVMTDsKIAkJfQogfQpAQCAtNzEzLDcgKzcxNyw3IEBACiB7CiAJaW50IHJlc3VsdDsKIAotCWlmICgocmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNhcmQtPmR2Yl9hZGFwdGVyLCBjYXJkLT5jYXJkX25hbWUsIFRISVNfTU9EVUxFKSkgPCAwKSB7CisJaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmY2FyZC0+ZHZiX2FkYXB0ZXIsIGNhcmQtPmNhcmRfbmFtZSwgVEhJU19NT0RVTEUsICZjYXJkLT5idC0+ZGV2LT5kZXYpKSA8IDApIHsKIAkJcHJpbnRrKCJkdmJfYnQ4eHg6IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyIGZhaWxlZCAoZXJybm8gPSAlZClcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAppbmRleCAwMGRkOWZhLi40NzQ1YTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguaApAQCAtMzcsNiArMzcsOCBAQAogI2luY2x1ZGUgImN4MjQxMTAuaCIKICNpbmNsdWRlICJvcjUxMjExLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKKyNpbmNsdWRlICJsZ19oMDZ4Zi5oIgorI2luY2x1ZGUgInpsMTAzNTMuaCIKIAogc3RydWN0IGR2Yl9idDh4eF9jYXJkIHsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKaW5kZXggNjAxOGZjZC4uYjVjZGQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL0tjb25maWcKQEAgLTY0LDcgKzY0LDcgQEAKIGNvbmZpZyBEVkJfQ0lORVJHWVQyX0VOQUJMRV9SQ19JTlBVVF9ERVZJQ0UKIAlib29sICJSZWdpc3RlciB0aGUgb25ib2FyZCBJUiBSZW1vdGUgQ29udHJvbCBSZWNlaXZlciBhcyBJbnB1dCBEZXZpY2UiCiAJZGVwZW5kcyBvbiBEVkJfQ0lORVJHWVQyX1RVTklORwotCWRlZmF1bHQgInllcyIKKwlkZWZhdWx0IHkKIAloZWxwCiAJICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBvbmJvYXJkIEluZnJhcmVkIFJlbW90ZQogCSAgQ29udHJvbCBSZWNlaXZlciBhcyBMaW51eC1JbnB1dCBkZXZpY2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9jaW5lcmd5VDIvY2luZXJneVQyLmMKaW5kZXggOTMyNWQwMy4uMWI4OTUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvY2luZXJneVQyL2NpbmVyZ3lUMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2NpbmVyZ3lUMi9jaW5lcmd5VDIuYwpAQCAtNTQ0LDE1ICs1NDQsMTkgQEAKIHsKIAlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjaW5lcmd5dDIgKmNpbmVyZ3l0MiA9IGR2YmRldi0+cHJpdjsKKyAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlpZiAoY2luZXJneXQyLT5kaXNjb25uZWN0X3BlbmRpbmcgfHwgbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZjaW5lcmd5dDItPnNlbSkpCiAJCXJldHVybiAtRVJFU1RBUlRTWVM7CiAKIAlwb2xsX3dhaXQoZmlsZSwgJmNpbmVyZ3l0Mi0+cG9sbF93cSwgd2FpdCk7CiAKKyAgICAgICBpZiAoY2luZXJneXQyLT5wZW5kaW5nX2ZlX2V2ZW50cyAhPSAwKQorCQltYXNrIHw9IChQT0xMSU4gfCBQT0xMUkROT1JNIHwgUE9MTFBSSSk7CisKIAltdXRleF91bmxvY2soJmNpbmVyZ3l0Mi0+c2VtKTsKIAotCXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExQUkkpOworICAgICAgIHJldHVybiBtYXNrOwogfQogCiAKQEAgLTkwMiw3ICs5MDYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAoKGVyciA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZjaW5lcmd5dDItPmFkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSkpIDwgMCkgeworCWlmICgoZXJyID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmNpbmVyZ3l0Mi0+YWRhcHRlciwgRFJJVkVSX05BTUUsIFRISVNfTU9EVUxFLCAmY2luZXJneXQyLT51ZGV2LT5kZXYpKSA8IDApIHsKIAkJa2ZyZWUoY2luZXJneXQyKTsKIAkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCmluZGV4IDdhZGI1MGMuLjExMDU0NjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL01ha2VmaWxlCkBAIC0yLDggKzIsOCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGtlcm5lbCBEVkIgZGV2aWNlIGRyaXZlcnMuCiAjCiAKLWR2Yi1jb3JlLW9ianMgPSBkdmJkZXYubyBkbXhkZXYubyBkdmJfZGVtdXgubyBkdmJfZmlsdGVyLm8gXAotCQlkdmJfY2FfZW41MDIyMS5vIGR2Yl9mcm9udGVuZC5vIFwKLQkJZHZiX25ldC5vIGR2Yl9yaW5nYnVmZmVyLm8KK2R2Yi1jb3JlLW9ianMgPSBkdmJkZXYubyBkbXhkZXYubyBkdmJfZGVtdXgubyBkdmJfZmlsdGVyLm8gCVwKKwkJZHZiX2NhX2VuNTAyMjEubyBkdmJfZnJvbnRlbmQubyAJCVwKKwkJZHZiX25ldC5vIGR2Yl9yaW5nYnVmZmVyLm8gZHZiX21hdGgubwogCiBvYmotJChDT05GSUdfRFZCX0NPUkUpICs9IGR2Yi1jb3JlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2RteGRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKaW5kZXggMDQ1NzhkZi4uOTg4NDk5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZG14ZGV2LmMKQEAgLTg3Miw5ICs4NzIsNiBAQAogCQltdXRleF91bmxvY2soJmRteGRldmZpbHRlci0+bXV0ZXgpOwogCQlicmVhazsKIAotCWNhc2UgRE1YX0dFVF9FVkVOVDoKLQkJYnJlYWs7Ci0KIAljYXNlIERNWF9HRVRfUEVTX1BJRFM6CiAJCWlmICghZG14ZGV2LT5kZW11eC0+Z2V0X3Blc19waWRzKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9jYV9lbjUwMjIxLmMKaW5kZXggMDAzNDdhNy4uMmEwM2JmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2NhX2VuNTAyMjEuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfY2FfZW41MDIyMS5jCkBAIC0xMDYwLDggKzEwNjAsMTggQEAKIAkJCQlicmVhazsKIAogCQkJY2FzZSBEVkJfQ0FfU0xPVFNUQVRFX1ZBTElEQVRFOgotCQkJCWlmIChkdmJfY2FfZW41MDIyMV9wYXJzZV9hdHRyaWJ1dGVzKGNhLCBzbG90KQotCQkJCSAgICAhPSAwKSB7CisJCQkJaWYgKGR2Yl9jYV9lbjUwMjIxX3BhcnNlX2F0dHJpYnV0ZXMoY2EsIHNsb3QpICE9IDApIHsKKwkJCQkJLyogd2UgbmVlZCB0aGlzIGV4dHJhIGNoZWNrIGZvciBhbm5veWluZyBpbnRlcmZhY2VzIGxpa2UgdGhlIGJ1ZGdldC1hdiAqLworCQkJCQlpZiAoKCEoY2EtPmZsYWdzICYgRFZCX0NBX0VONTAyMjFfRkxBR19JUlFfQ0FNQ0hBTkdFKSkgJiYKKwkJCQkJICAgIChjYS0+cHViLT5wb2xsX3Nsb3Rfc3RhdHVzKSkgeworCQkJCQkJaW50IHN0YXR1cyA9IGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMoY2EtPnB1Yiwgc2xvdCwgMCk7CisJCQkJCQlpZiAoIShzdGF0dXMgJiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UKSkgeworCQkJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfTk9ORTsKKwkJCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCiAJCQkJCXByaW50aygiZHZiX2NhIGFkYXB0ZXIgJWQ6IEludmFsaWQgUEMgY2FyZCBpbnNlcnRlZCA6KFxuIiwKIAkJCQkJICAgICAgIGNhLT5kdmJkZXYtPmFkYXB0ZXItPm51bSk7CiAJCQkJCWNhLT5zbG90X2luZm9bc2xvdF0uc2xvdF9zdGF0ZSA9IERWQl9DQV9TTE9UU1RBVEVfSU5WQUxJRDsKQEAgLTExMDgsNiArMTExOCwxNyBAQAogCiAJCQljYXNlIERWQl9DQV9TTE9UU1RBVEVfTElOS0lOSVQ6CiAJCQkJaWYgKGR2Yl9jYV9lbjUwMjIxX2xpbmtfaW5pdChjYSwgc2xvdCkgIT0gMCkgeworCQkJCQkvKiB3ZSBuZWVkIHRoaXMgZXh0cmEgY2hlY2sgZm9yIGFubm95aW5nIGludGVyZmFjZXMgbGlrZSB0aGUgYnVkZ2V0LWF2ICovCisJCQkJCWlmICgoIShjYS0+ZmxhZ3MgJiBEVkJfQ0FfRU41MDIyMV9GTEFHX0lSUV9DQU1DSEFOR0UpKSAmJgorCQkJCQkgICAgKGNhLT5wdWItPnBvbGxfc2xvdF9zdGF0dXMpKSB7CisJCQkJCQlpbnQgc3RhdHVzID0gY2EtPnB1Yi0+cG9sbF9zbG90X3N0YXR1cyhjYS0+cHViLCBzbG90LCAwKTsKKwkJCQkJCWlmICghKHN0YXR1cyAmIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpKSB7CisJCQkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9OT05FOworCQkJCQkJCWR2Yl9jYV9lbjUwMjIxX3RocmVhZF91cGRhdGVfZGVsYXkoY2EpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisKIAkJCQkJcHJpbnRrKCJkdmJfY2EgYWRhcHRlciAlZDogRFZCIENBTSBsaW5rIGluaXRpYWxpc2F0aW9uIGZhaWxlZCA6KFxuIiwgY2EtPmR2YmRldi0+YWRhcHRlci0+bnVtKTsKIAkJCQkJY2EtPnNsb3RfaW5mb1tzbG90XS5zbG90X3N0YXRlID0gRFZCX0NBX1NMT1RTVEFURV9JTlZBTElEOwogCQkJCQlkdmJfY2FfZW41MDIyMV90aHJlYWRfdXBkYXRlX2RlbGF5KGNhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9kZW11eC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKaW5kZXggODNlYzVlMC4uZmNmZjVlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2RlbXV4LmMKQEAgLTQ3Myw3ICs0NzMsNyBAQAogCQkJZ290byBiYWlsb3V0OwogCQl9CiAJCW1lbWNweSgmZGVtdXgtPnRzYnVmW2ldLCBidWYsIGopOwotCQlpZiAoKGRlbXV4LT50c2J1ZlswXSA9PSAweDQ3KSB8IChkZW11eC0+dHNidWZbMF0gPT0gMHhCOCkpIHsKKwkJaWYgKChkZW11eC0+dHNidWZbMF0gPT0gMHg0NykgfHwgKGRlbXV4LT50c2J1ZlswXSA9PSAweEI4KSkgewogCQkJbWVtY3B5KHRtcHBhY2ssIGRlbXV4LT50c2J1ZiwgMTg4KTsKIAkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCiAJCQkJdG1wcGFja1swXSA9IDB4NDc7CkBAIC00ODQsNyArNDg0LDcgQEAKIAl9CiAKIAl3aGlsZSAocCA8IGNvdW50KSB7Ci0JCWlmICgoYnVmW3BdID09IDB4NDcpIHwgKGJ1ZltwXSA9PSAweEI4KSkgeworCQlpZiAoKGJ1ZltwXSA9PSAweDQ3KSB8fCAoYnVmW3BdID09IDB4QjgpKSB7CiAJCQlpZiAoY291bnQgLSBwID49IDIwNCkgewogCQkJCW1lbWNweSh0bXBwYWNrLCAmYnVmW3BdLCAxODgpOwogCQkJCWlmICh0bXBwYWNrWzBdID09IDB4QjgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCmluZGV4IGEwNTE3OTAuLjMxNTJhNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9mcm9udGVuZC5jCkBAIC01Niw3ICs1Niw3IEBACiBtb2R1bGVfcGFyYW0oZHZiX292ZXJyaWRlX3R1bmVfZGVsYXksIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGR2Yl9vdmVycmlkZV90dW5lX2RlbGF5LCAiMDogbm9ybWFsIChkZWZhdWx0KSwgPjAgPT4gZGVsYXkgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgZm9yIGxvY2sgYWZ0ZXIgYSB0dW5lIGF0dGVtcHQiKTsKIG1vZHVsZV9wYXJhbShkdmJfcG93ZXJkb3duX29uX3NsZWVwLCBpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkdmJfcG93ZXJkb3duX29uX3NsZWVwLCAiMDogZG8gbm90IHBvd2VyIGRvd24sIDE6IHR1cm4gTE5CIHZvbGF0YWdlIG9mZiBvbiBzbGVlcCAoZGVmYXVsdCkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZHZiX3Bvd2VyZG93bl9vbl9zbGVlcCwgIjA6IGRvIG5vdCBwb3dlciBkb3duLCAxOiB0dXJuIExOQiB2b2x0YWdlIG9mZiBvbiBzbGVlcCAoZGVmYXVsdCkiKTsKIAogI2RlZmluZSBkcHJpbnRrIGlmIChkdmJfZnJvbnRlbmRfZGVidWcpIHByaW50awogCkBAIC03Miw2ICs3Miw4IEBACiAjZGVmaW5lIEZFU1RBVEVfU0VBUkNISU5HX0ZBU1QgKEZFU1RBVEVfVFVOSU5HX0ZBU1QgfCBGRVNUQVRFX1pJR1pBR19GQVNUKQogI2RlZmluZSBGRVNUQVRFX1NFQVJDSElOR19TTE9XIChGRVNUQVRFX1RVTklOR19TTE9XIHwgRkVTVEFURV9aSUdaQUdfU0xPVykKICNkZWZpbmUgRkVTVEFURV9MT1NUTE9DSyAoRkVTVEFURV9aSUdaQUdfRkFTVCB8IEZFU1RBVEVfWklHWkFHX1NMT1cpCisKKyNkZWZpbmUgRkVfQUxHT19IVwkJMQogLyoKICAqIEZFU1RBVEVfSURMRS4gTm8gdHVuaW5nIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHN1cHBsaWVkIGFuZCB0aGUgbG9vcCBpcyBpZGxpbmcuCiAgKiBGRVNUQVRFX1JFVFVORS4gUGFyYW1ldGVycyBoYXZlIGJlZW4gc3VwcGxpZWQsIGJ1dCB3ZSBoYXZlIG5vdCB5ZXQgcGVyZm9ybWVkIHRoZSBmaXJzdCB0dW5lLgpAQCAtMTUxLDggKzE1Myw4IEBACiAJCXNpemVvZiAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7CiAKIAlpZiAoc3RhdHVzICYgRkVfSEFTX0xPQ0spCi0JCWlmIChmZS0+b3BzLT5nZXRfZnJvbnRlbmQpCi0JCQlmZS0+b3BzLT5nZXRfZnJvbnRlbmQoZmUsICZlLT5wYXJhbWV0ZXJzKTsKKwkJaWYgKGZlLT5vcHMuZ2V0X2Zyb250ZW5kKQorCQkJZmUtPm9wcy5nZXRfZnJvbnRlbmQoZmUsICZlLT5wYXJhbWV0ZXJzKTsKIAogCWV2ZW50cy0+ZXZlbnR3ID0gd3A7CiAKQEAgLTIxMSwxMCArMjEzLDE1IEBACiB7CiAJZHByaW50ayAoIkRWQjogaW5pdGlhbGlzaW5nIGZyb250ZW5kICVpICglcykuLi5cbiIsCiAJCSBmZS0+ZHZiLT5udW0sCi0JCSBmZS0+b3BzLT5pbmZvLm5hbWUpOworCQkgZmUtPm9wcy5pbmZvLm5hbWUpOwogCi0JaWYgKGZlLT5vcHMtPmluaXQpCi0JCWZlLT5vcHMtPmluaXQoZmUpOworCWlmIChmZS0+b3BzLmluaXQpCisJCWZlLT5vcHMuaW5pdChmZSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmluaXQpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuaW5pdChmZSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIH0KIAogdm9pZCBkdmJfZnJvbnRlbmRfcmVpbml0aWFsaXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQpAQCAtMjU5LDcgKzI2Niw3IEBACiAJdTMyIG9yaWdpbmFsX2ZyZXF1ZW5jeSA9IGZlcHJpdi0+cGFyYW1ldGVycy5mcmVxdWVuY3k7CiAKIAkvKiBhcmUgd2UgdXNpbmcgYXV0b2ludmVyc2lvbj8gKi8KLQlhdXRvaW52ZXJzaW9uID0gKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCisJYXV0b2ludmVyc2lvbiA9ICgoIShmZS0+b3BzLmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCiAJCQkgKGZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPT0gSU5WRVJTSU9OX0FVVE8pKTsKIAogCS8qIHNldHVwIHBhcmFtZXRlcnMgY29ycmVjdGx5ICovCkBAIC0zMjksOCArMzM2LDggQEAKIAlmZXByaXYtPnBhcmFtZXRlcnMuZnJlcXVlbmN5ICs9IGZlcHJpdi0+bG5iX2RyaWZ0OwogCWlmIChhdXRvaW52ZXJzaW9uKQogCQlmZXByaXYtPnBhcmFtZXRlcnMuaW52ZXJzaW9uID0gZmVwcml2LT5pbnZlcnNpb247Ci0JaWYgKGZlLT5vcHMtPnNldF9mcm9udGVuZCkKLQkJZmUtPm9wcy0+c2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKKwlpZiAoZmUtPm9wcy5zZXRfZnJvbnRlbmQpCisJCWZlLT5vcHMuc2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKIAogCWZlcHJpdi0+cGFyYW1ldGVycy5mcmVxdWVuY3kgPSBvcmlnaW5hbF9mcmVxdWVuY3k7CiAJZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9IG9yaWdpbmFsX2ludmVyc2lvbjsKQEAgLTM1NCw4ICszNjEsOCBAQAogCS8qIGluIFNDQU4gbW9kZSwgd2UganVzdCBzZXQgdGhlIGZyb250ZW5kIHdoZW4gYXNrZWQgYW5kIGxlYXZlIGl0IGFsb25lICovCiAJaWYgKGZlcHJpdi0+dHVuZV9tb2RlX2ZsYWdzICYgRkVfVFVORV9NT0RFX09ORVNIT1QpIHsKIAkJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgewotCQkJaWYgKGZlLT5vcHMtPnNldF9mcm9udGVuZCkKLQkJCQlmZS0+b3BzLT5zZXRfZnJvbnRlbmQoZmUsICZmZXByaXYtPnBhcmFtZXRlcnMpOworCQkJaWYgKGZlLT5vcHMuc2V0X2Zyb250ZW5kKQorCQkJCWZlLT5vcHMuc2V0X2Zyb250ZW5kKGZlLCAmZmVwcml2LT5wYXJhbWV0ZXJzKTsKIAkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOwogCQl9CiAJCWZlcHJpdi0+ZGVsYXkgPSAzKkhaOwpAQCAtMzY3LDggKzM3NCw4IEBACiAJaWYgKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX1JFVFVORSkgewogCQlzID0gMDsKIAl9IGVsc2UgewotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQlmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgJnMpOworCQlpZiAoZmUtPm9wcy5yZWFkX3N0YXR1cykKKwkJCWZlLT5vcHMucmVhZF9zdGF0dXMoZmUsICZzKTsKIAkJaWYgKHMgIT0gZmVwcml2LT5zdGF0dXMpIHsKIAkJCWR2Yl9mcm9udGVuZF9hZGRfZXZlbnQoZmUsIHMpOwogCQkJZmVwcml2LT5zdGF0dXMgPSBzOwpAQCAtMzgxLDcgKzM4OCw3IEBACiAJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX1RVTkVEOwogCiAJCS8qIGlmIHdlJ3JlIHR1bmVkLCB0aGVuIHdlIGhhdmUgZGV0ZXJtaW5lZCB0aGUgY29ycmVjdCBpbnZlcnNpb24gKi8KLQkJaWYgKCghKGZlLT5vcHMtPmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCisJCWlmICgoIShmZS0+b3BzLmluZm8uY2FwcyAmIEZFX0NBTl9JTlZFUlNJT05fQVVUTykpICYmCiAJCSAgICAoZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9PSBJTlZFUlNJT05fQVVUTykpIHsKIAkJCWZlcHJpdi0+cGFyYW1ldGVycy5pbnZlcnNpb24gPSBmZXByaXYtPmludmVyc2lvbjsKIAkJfQpAQCAtNDA1LDcgKzQxMiw3IEBACiAJLyogZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgaWYgd2UncmUgaW4gdGhlIExPU1RMT0NLIHN0YXRlLAogCSAqIHRoZSBmcm9udGVuZCBpcyBzZXQgdG8gRkVfQ0FOX1JFQ09WRVIsIGFuZCB0aGUgbWF4X2RyaWZ0IGlzIDAgKi8KIAlpZiAoKGZlcHJpdi0+c3RhdGUgJiBGRVNUQVRFX0xPU1RMT0NLKSAmJgotCSAgICAoZmUtPm9wcy0+aW5mby5jYXBzICYgRkVfQ0FOX1JFQ09WRVIpICYmIChmZXByaXYtPm1heF9kcmlmdCA9PSAwKSkgeworCSAgICAoZmUtPm9wcy5pbmZvLmNhcHMgJiBGRV9DQU5fUkVDT1ZFUikgJiYgKGZlcHJpdi0+bWF4X2RyaWZ0ID09IDApKSB7CiAJCWR2Yl9mcm9udGVuZF9zd3ppZ3phZ191cGRhdGVfZGVsYXkoZmVwcml2LCBzICYgRkVfSEFTX0xPQ0spOwogCQlyZXR1cm47CiAJfQpAQCAtNTQwLDE2ICs1NDcsMTYgQEAKIAkJaWYgKGZlcHJpdi0+cmVpbml0aWFsaXNlKSB7CiAJCQlkdmJfZnJvbnRlbmRfaW5pdChmZSk7CiAJCQlpZiAoZmVwcml2LT50b25lICE9IC0xKSB7Ci0JCQkJZmUtPm9wcy0+c2V0X3RvbmUoZmUsIGZlcHJpdi0+dG9uZSk7CisJCQkJZmUtPm9wcy5zZXRfdG9uZShmZSwgZmVwcml2LT50b25lKTsKIAkJCX0KIAkJCWlmIChmZXByaXYtPnZvbHRhZ2UgIT0gLTEpIHsKLQkJCQlmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgZmVwcml2LT52b2x0YWdlKTsKKwkJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCBmZXByaXYtPnZvbHRhZ2UpOwogCQkJfQogCQkJZmVwcml2LT5yZWluaXRpYWxpc2UgPSAwOwogCQl9CiAKIAkJLyogZG8gYW4gaXRlcmF0aW9uIG9mIHRoZSB0dW5pbmcgbG9vcCAqLwotCQlpZiAoZmUtPm9wcy0+dHVuZSkgeworCQlpZiAoZmUtPm9wcy5nZXRfZnJvbnRlbmRfYWxnbyhmZSkgPT0gRkVfQUxHT19IVykgewogCQkJLyogaGF2ZSB3ZSBiZWVuIGFza2VkIHRvIHJldHVuZT8gKi8KIAkJCXBhcmFtcyA9IE5VTEw7CiAJCQlpZiAoZmVwcml2LT5zdGF0ZSAmIEZFU1RBVEVfUkVUVU5FKSB7CkBAIC01NTcsNyArNTY0LDcgQEAKIAkJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9UVU5FRDsKIAkJCX0KIAotCQkJZmUtPm9wcy0+dHVuZShmZSwgcGFyYW1zLCBmZXByaXYtPnR1bmVfbW9kZV9mbGFncywgJmZlcHJpdi0+ZGVsYXksICZzKTsKKwkJCWZlLT5vcHMudHVuZShmZSwgcGFyYW1zLCBmZXByaXYtPnR1bmVfbW9kZV9mbGFncywgJmZlcHJpdi0+ZGVsYXksICZzKTsKIAkJCWlmIChzICE9IGZlcHJpdi0+c3RhdHVzKSB7CiAJCQkJZHZiX2Zyb250ZW5kX2FkZF9ldmVudChmZSwgcyk7CiAJCQkJZmVwcml2LT5zdGF0dXMgPSBzOwpAQCAtNTY5LDEwICs1NzYsMTUgQEAKIAogCWlmIChkdmJfc2h1dGRvd25fdGltZW91dCkgewogCQlpZiAoZHZiX3Bvd2VyZG93bl9vbl9zbGVlcCkKLQkJCWlmIChmZS0+b3BzLT5zZXRfdm9sdGFnZSkKLQkJCQlmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKTsKLQkJaWYgKGZlLT5vcHMtPnNsZWVwKQotCQkJZmUtPm9wcy0+c2xlZXAoZmUpOworCQkJaWYgKGZlLT5vcHMuc2V0X3ZvbHRhZ2UpCisJCQkJZmUtPm9wcy5zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKTsKKwkJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNsZWVwKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zbGVlcChmZSk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCX0KKwkJaWYgKGZlLT5vcHMuc2xlZXApCisJCQlmZS0+b3BzLnNsZWVwKGZlKTsKIAl9CiAKIAlmZXByaXYtPnRocmVhZF9waWQgPSAwOwpAQCAtNzI0LDcgKzczNiw3IEBACiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIEZFX0dFVF9JTkZPOiB7CiAJCXN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbyogaW5mbyA9IHBhcmc7Ci0JCW1lbWNweShpbmZvLCAmZmUtPm9wcy0+aW5mbywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykpOworCQltZW1jcHkoaW5mbywgJmZlLT5vcHMuaW5mbywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfaW5mbykpOwogCiAJCS8qIEZvcmNlIHRoZSBDQU5fSU5WRVJTSU9OX0FVVE8gYml0IG9uLiBJZiB0aGUgZnJvbnRlbmQgZG9lc24ndAogCQkgKiBkbyBpdCwgaXQgaXMgZG9uZSBmb3IgaXQuICovCkBAIC03NDQsNTggKzc1Niw1OCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoZmUtPm9wcy0+cmVhZF9zdGF0dXMpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3N0YXR1cyhmZSwgc3RhdHVzKTsKKwkJaWYgKGZlLT5vcHMucmVhZF9zdGF0dXMpCisJCQllcnIgPSBmZS0+b3BzLnJlYWRfc3RhdHVzKGZlLCBzdGF0dXMpOwogCQlicmVhazsKIAl9CiAJY2FzZSBGRV9SRUFEX0JFUjoKLQkJaWYgKGZlLT5vcHMtPnJlYWRfYmVyKQotCQkJZXJyID0gZmUtPm9wcy0+cmVhZF9iZXIoZmUsIChfX3UzMiopIHBhcmcpOworCQlpZiAoZmUtPm9wcy5yZWFkX2JlcikKKwkJCWVyciA9IGZlLT5vcHMucmVhZF9iZXIoZmUsIChfX3UzMiopIHBhcmcpOwogCQlicmVhazsKIAogCWNhc2UgRkVfUkVBRF9TSUdOQUxfU1RSRU5HVEg6Ci0JCWlmIChmZS0+b3BzLT5yZWFkX3NpZ25hbF9zdHJlbmd0aCkKLQkJCWVyciA9IGZlLT5vcHMtPnJlYWRfc2lnbmFsX3N0cmVuZ3RoKGZlLCAoX191MTYqKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMucmVhZF9zaWduYWxfc3RyZW5ndGgpCisJCQllcnIgPSBmZS0+b3BzLnJlYWRfc2lnbmFsX3N0cmVuZ3RoKGZlLCAoX191MTYqKSBwYXJnKTsKIAkJYnJlYWs7CiAKIAljYXNlIEZFX1JFQURfU05SOgotCQlpZiAoZmUtPm9wcy0+cmVhZF9zbnIpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3NucihmZSwgKF9fdTE2KikgcGFyZyk7CisJCWlmIChmZS0+b3BzLnJlYWRfc25yKQorCQkJZXJyID0gZmUtPm9wcy5yZWFkX3NucihmZSwgKF9fdTE2KikgcGFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9SRUFEX1VOQ09SUkVDVEVEX0JMT0NLUzoKLQkJaWYgKGZlLT5vcHMtPnJlYWRfdWNibG9ja3MpCi0JCQllcnIgPSBmZS0+b3BzLT5yZWFkX3VjYmxvY2tzKGZlLCAoX191MzIqKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMucmVhZF91Y2Jsb2NrcykKKwkJCWVyciA9IGZlLT5vcHMucmVhZF91Y2Jsb2NrcyhmZSwgKF9fdTMyKikgcGFyZyk7CiAJCWJyZWFrOwogCiAKIAljYXNlIEZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRDoKLQkJaWYgKGZlLT5vcHMtPmRpc2VxY19yZXNldF9vdmVybG9hZCkgewotCQkJZXJyID0gZmUtPm9wcy0+ZGlzZXFjX3Jlc2V0X292ZXJsb2FkKGZlKTsKKwkJaWYgKGZlLT5vcHMuZGlzZXFjX3Jlc2V0X292ZXJsb2FkKSB7CisJCQllcnIgPSBmZS0+b3BzLmRpc2VxY19yZXNldF9vdmVybG9hZChmZSk7CiAJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9ESVNFUUM7CiAJCQlmZXByaXYtPnN0YXR1cyA9IDA7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZFX0RJU0VRQ19TRU5EX01BU1RFUl9DTUQ6Ci0JCWlmIChmZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKSB7Ci0JCQllcnIgPSBmZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKGZlLCAoc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCopIHBhcmcpOworCQlpZiAoZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKSB7CisJCQllcnIgPSBmZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQoZmUsIChzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKikgcGFyZyk7CiAJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9ESVNFUUM7CiAJCQlmZXByaXYtPnN0YXR1cyA9IDA7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZFX0RJU0VRQ19TRU5EX0JVUlNUOgotCQlpZiAoZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QpIHsKLQkJCWVyciA9IGZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0KGZlLCAoZmVfc2VjX21pbmlfY21kX3QpIHBhcmcpOworCQlpZiAoZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCkgeworCQkJZXJyID0gZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdChmZSwgKGZlX3NlY19taW5pX2NtZF90KSBwYXJnKTsKIAkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX0RJU0VRQzsKIAkJCWZlcHJpdi0+c3RhdHVzID0gMDsKIAkJfQogCQlicmVhazsKIAogCWNhc2UgRkVfU0VUX1RPTkU6Ci0JCWlmIChmZS0+b3BzLT5zZXRfdG9uZSkgewotCQkJZXJyID0gZmUtPm9wcy0+c2V0X3RvbmUoZmUsIChmZV9zZWNfdG9uZV9tb2RlX3QpIHBhcmcpOworCQlpZiAoZmUtPm9wcy5zZXRfdG9uZSkgeworCQkJZXJyID0gZmUtPm9wcy5zZXRfdG9uZShmZSwgKGZlX3NlY190b25lX21vZGVfdCkgcGFyZyk7CiAJCQlmZXByaXYtPnRvbmUgPSAoZmVfc2VjX3RvbmVfbW9kZV90KSBwYXJnOwogCQkJZmVwcml2LT5zdGF0ZSA9IEZFU1RBVEVfRElTRVFDOwogCQkJZmVwcml2LT5zdGF0dXMgPSAwOwpAQCAtODAzLDggKzgxNSw4IEBACiAJCWJyZWFrOwogCiAJY2FzZSBGRV9TRVRfVk9MVEFHRToKLQkJaWYgKGZlLT5vcHMtPnNldF92b2x0YWdlKSB7Ci0JCQllcnIgPSBmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgKGZlX3NlY192b2x0YWdlX3QpIHBhcmcpOworCQlpZiAoZmUtPm9wcy5zZXRfdm9sdGFnZSkgeworCQkJZXJyID0gZmUtPm9wcy5zZXRfdm9sdGFnZShmZSwgKGZlX3NlY192b2x0YWdlX3QpIHBhcmcpOwogCQkJZmVwcml2LT52b2x0YWdlID0gKGZlX3NlY192b2x0YWdlX3QpIHBhcmc7CiAJCQlmZXByaXYtPnN0YXRlID0gRkVTVEFURV9ESVNFUUM7CiAJCQlmZXByaXYtPnN0YXR1cyA9IDA7CkBAIC04MTIsMTEgKzgyNCwxMSBAQAogCQlicmVhazsKIAogCWNhc2UgRkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EOgotCQlpZiAoZmUtPm9wcy0+ZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCkgewotCQkJZXJyID0gZmUtPm9wcy0+ZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZChmZSwgKHVuc2lnbmVkIGxvbmcpIHBhcmcpOworCQlpZiAoZmUtPm9wcy5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKSB7CisJCQllcnIgPSBmZS0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQoZmUsICh1bnNpZ25lZCBsb25nKSBwYXJnKTsKIAkJCWZlcHJpdi0+c3RhdGUgPSBGRVNUQVRFX0RJU0VRQzsKIAkJCWZlcHJpdi0+c3RhdHVzID0gMDsKLQkJfSBlbHNlIGlmIChmZS0+b3BzLT5zZXRfdm9sdGFnZSkgeworCQl9IGVsc2UgaWYgKGZlLT5vcHMuc2V0X3ZvbHRhZ2UpIHsKIAkJCS8qCiAJCQkgKiBOT1RFOiBUaGlzIGlzIGEgZmFsbGJhY2sgY29uZGl0aW9uLiAgU29tZSBmcm9udGVuZHMKIAkJCSAqIChzdHYwMjk5IGZvciBpbnN0YW5jZSkgdGFrZSBsb25nZXIgdGhhbiA4bXNlYyB0bwpAQCAtODQ2LDcgKzg1OCw3IEBACiAJCQkvKiBiZWZvcmUgc2VuZGluZyBhIGNvbW1hbmQsIGluaXRpYWxpemUgYnkgc2VuZGluZwogCQkJICogYSAzMm1zIDE4ViB0byB0aGUgc3dpdGNoCiAJCQkgKi8KLQkJCWZlLT5vcHMtPnNldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV8xOCk7CisJCQlmZS0+b3BzLnNldF92b2x0YWdlKGZlLCBTRUNfVk9MVEFHRV8xOCk7CiAJCQlkdmJfZnJvbnRlbmRfc2xlZXBfdW50aWwoJm5leHR0aW1lLCAzMjAwMCk7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKQEAgLTg1NCw3ICs4NjYsNyBAQAogCQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2W2kgKyAxXSk7CiAJCQkJaWYgKChjbWQgJiAweDAxKSAhPSBsYXN0KSB7CiAJCQkJCS8qIHNldCB2b2x0YWdlIHRvIChsYXN0ID8gMTNWIDogMThWKSAqLwotCQkJCQlmZS0+b3BzLT5zZXRfdm9sdGFnZShmZSwgKGxhc3QpID8gU0VDX1ZPTFRBR0VfMTMgOiBTRUNfVk9MVEFHRV8xOCk7CisJCQkJCWZlLT5vcHMuc2V0X3ZvbHRhZ2UoZmUsIChsYXN0KSA/IFNFQ19WT0xUQUdFXzEzIDogU0VDX1ZPTFRBR0VfMTgpOwogCQkJCQlsYXN0ID0gKGxhc3QpID8gMCA6IDE7CiAJCQkJfQogCQkJCWNtZCA9IGNtZCA+PiAxOwpAQCAtODc0LDEzICs4ODYsMTMgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZOgotCQlpZiAoZmUtPm9wcy0+ZGlzZXFjX3JlY3Zfc2xhdmVfcmVwbHkpCi0JCQllcnIgPSBmZS0+b3BzLT5kaXNlcWNfcmVjdl9zbGF2ZV9yZXBseShmZSwgKHN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5KikgcGFyZyk7CisJCWlmIChmZS0+b3BzLmRpc2VxY19yZWN2X3NsYXZlX3JlcGx5KQorCQkJZXJyID0gZmUtPm9wcy5kaXNlcWNfcmVjdl9zbGF2ZV9yZXBseShmZSwgKHN0cnVjdCBkdmJfZGlzZXFjX3NsYXZlX3JlcGx5KikgcGFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRToKLQkJaWYgKGZlLT5vcHMtPmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKQotCQkJZXJyID0gZmUtPm9wcy0+ZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UoZmUsIChsb25nKSBwYXJnKTsKKwkJaWYgKGZlLT5vcHMuZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UpCisJCQllcnIgPSBmZS0+b3BzLmVuYWJsZV9oaWdoX2xuYl92b2x0YWdlKGZlLCAobG9uZykgcGFyZyk7CiAJCWJyZWFrOwogCiAJY2FzZSBGRV9TRVRfRlJPTlRFTkQ6IHsKQEAgLTg5OCw3ICs5MTAsNyBAQAogCQkJZmVwcml2LT5wYXJhbWV0ZXJzLmludmVyc2lvbiA9IElOVkVSU0lPTl9BVVRPOwogCQkJZmV0dW5lc2V0dGluZ3MucGFyYW1ldGVycy5pbnZlcnNpb24gPSBJTlZFUlNJT05fQVVUTzsKIAkJfQotCQlpZiAoZmUtPm9wcy0+aW5mby50eXBlID09IEZFX09GRE0pIHsKKwkJaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX09GRE0pIHsKIAkJCS8qIHdpdGhvdXQgaGllcmFjaGljYWwgY29kaW5nIGNvZGVfcmF0ZV9MUCBpcyBpcnJlbGV2YW50LAogCQkJICogc28gd2UgdG9sZXJhdGUgdGhlIG90aGVyd2lzZSBpbnZhbGlkIEZFQ19OT05FIHNldHRpbmcgKi8KIAkJCWlmIChmZXByaXYtPnBhcmFtZXRlcnMudS5vZmRtLmhpZXJhcmNoeV9pbmZvcm1hdGlvbiA9PSBISUVSQVJDSFlfTk9ORSAmJgpAQCAtOTA3LDEzICs5MTksMTMgQEAKIAkJfQogCiAJCS8qIGdldCBmcm9udGVuZC1zcGVjaWZpYyB0dW5pbmcgc2V0dGluZ3MgKi8KLQkJaWYgKGZlLT5vcHMtPmdldF90dW5lX3NldHRpbmdzICYmIChmZS0+b3BzLT5nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZldHVuZXNldHRpbmdzKSA9PSAwKSkgeworCQlpZiAoZmUtPm9wcy5nZXRfdHVuZV9zZXR0aW5ncyAmJiAoZmUtPm9wcy5nZXRfdHVuZV9zZXR0aW5ncyhmZSwgJmZldHVuZXNldHRpbmdzKSA9PSAwKSkgewogCQkJZmVwcml2LT5taW5fZGVsYXkgPSAoZmV0dW5lc2V0dGluZ3MubWluX2RlbGF5X21zICogSFopIC8gMTAwMDsKIAkJCWZlcHJpdi0+bWF4X2RyaWZ0ID0gZmV0dW5lc2V0dGluZ3MubWF4X2RyaWZ0OwogCQkJZmVwcml2LT5zdGVwX3NpemUgPSBmZXR1bmVzZXR0aW5ncy5zdGVwX3NpemU7CiAJCX0gZWxzZSB7CiAJCQkvKiBkZWZhdWx0IHZhbHVlcyAqLwotCQkJc3dpdGNoKGZlLT5vcHMtPmluZm8udHlwZSkgeworCQkJc3dpdGNoKGZlLT5vcHMuaW5mby50eXBlKSB7CiAJCQljYXNlIEZFX1FQU0s6CiAJCQkJZmVwcml2LT5taW5fZGVsYXkgPSBIWi8yMDsKIAkJCQlmZXByaXYtPnN0ZXBfc2l6ZSA9IGZlcHJpdi0+cGFyYW1ldGVycy51LnFwc2suc3ltYm9sX3JhdGUgLyAxNjAwMDsKQEAgLTkyOCwxMSArOTQwLDEzIEBACiAKIAkJCWNhc2UgRkVfT0ZETToKIAkJCQlmZXByaXYtPm1pbl9kZWxheSA9IEhaLzIwOwotCQkJCWZlcHJpdi0+c3RlcF9zaXplID0gZmUtPm9wcy0+aW5mby5mcmVxdWVuY3lfc3RlcHNpemUgKiAyOwotCQkJCWZlcHJpdi0+bWF4X2RyaWZ0ID0gKGZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X3N0ZXBzaXplICogMikgKyAxOworCQkJCWZlcHJpdi0+c3RlcF9zaXplID0gZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9zdGVwc2l6ZSAqIDI7CisJCQkJZmVwcml2LT5tYXhfZHJpZnQgPSAoZmUtPm9wcy5pbmZvLmZyZXF1ZW5jeV9zdGVwc2l6ZSAqIDIpICsgMTsKIAkJCQlicmVhazsKIAkJCWNhc2UgRkVfQVRTQzoKLQkJCQlwcmludGsoImR2Yi1jb3JlOiBGRV9BVFNDIG5vdCBoYW5kbGVkIHlldC5cbiIpOworCQkJCWZlcHJpdi0+bWluX2RlbGF5ID0gSFovMjA7CisJCQkJZmVwcml2LT5zdGVwX3NpemUgPSAwOworCQkJCWZlcHJpdi0+bWF4X2RyaWZ0ID0gMDsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtOTUyLDkgKzk2Niw5IEBACiAJCWJyZWFrOwogCiAJY2FzZSBGRV9HRVRfRlJPTlRFTkQ6Ci0JCWlmIChmZS0+b3BzLT5nZXRfZnJvbnRlbmQpIHsKKwkJaWYgKGZlLT5vcHMuZ2V0X2Zyb250ZW5kKSB7CiAJCQltZW1jcHkgKHBhcmcsICZmZXByaXYtPnBhcmFtZXRlcnMsIHNpemVvZiAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKSk7Ci0JCQllcnIgPSBmZS0+b3BzLT5nZXRfZnJvbnRlbmQoZmUsIChzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqKSBwYXJnKTsKKwkJCWVyciA9IGZlLT5vcHMuZ2V0X2Zyb250ZW5kKGZlLCAoc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKikgcGFyZyk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTEwNjcsNyArMTA4MSw3IEBACiAKIAlwcmludGsgKCJEVkI6IHJlZ2lzdGVyaW5nIGZyb250ZW5kICVpICglcykuLi5cbiIsCiAJCWZlLT5kdmItPm51bSwKLQkJZmUtPm9wcy0+aW5mby5uYW1lKTsKKwkJZmUtPm9wcy5pbmZvLm5hbWUpOwogCiAJZHZiX3JlZ2lzdGVyX2RldmljZSAoZmUtPmR2YiwgJmZlcHJpdi0+ZHZiZGV2LCAmZHZiZGV2X3RlbXBsYXRlLAogCQkJICAgICBmZSwgRFZCX0RFVklDRV9GUk9OVEVORCk7CkBAIC0xMDg1LDEwICsxMDk5LDE1IEBACiAJbXV0ZXhfbG9jaygmZnJvbnRlbmRfbXV0ZXgpOwogCWR2Yl91bnJlZ2lzdGVyX2RldmljZSAoZmVwcml2LT5kdmJkZXYpOwogCWR2Yl9mcm9udGVuZF9zdG9wIChmZSk7Ci0JaWYgKGZlLT5vcHMtPnJlbGVhc2UpCi0JCWZlLT5vcHMtPnJlbGVhc2UoZmUpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5yZWxlYXNlKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnJlbGVhc2UoZmUpOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisJaWYgKGZlLT5vcHMucmVsZWFzZSkKKwkJZmUtPm9wcy5yZWxlYXNlKGZlKTsKIAllbHNlCi0JCXByaW50aygiZHZiX2Zyb250ZW5kOiBEZW1vZHVsYXRvciAoJXMpIGRvZXMgbm90IGhhdmUgYSByZWxlYXNlIGNhbGxiYWNrIVxuIiwgZmUtPm9wcy0+aW5mby5uYW1lKTsKKwkJcHJpbnRrKCJkdmJfZnJvbnRlbmQ6IERlbW9kdWxhdG9yICglcykgZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UgY2FsbGJhY2shXG4iLCBmZS0+b3BzLmluZm8ubmFtZSk7CiAJLyogZmUgaXMgaW52YWxpZCBub3cgKi8KIAlrZnJlZShmZXByaXYpOwogCW11dGV4X3VubG9jaygmZnJvbnRlbmRfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAppbmRleCA1OTI2YTNiLi4yODg3ZTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuaApAQCAtNDksNiArNDksNDQgQEAKIAogc3RydWN0IGR2Yl9mcm9udGVuZDsKIAorc3RydWN0IGR2Yl90dW5lcl9pbmZvIHsKKwljaGFyIG5hbWVbMTI4XTsKKworCXUzMiBmcmVxdWVuY3lfbWluOworCXUzMiBmcmVxdWVuY3lfbWF4OworCXUzMiBmcmVxdWVuY3lfc3RlcDsKKworCXUzMiBiYW5kd2lkdGhfbWluOworCXUzMiBiYW5kd2lkdGhfbWF4OworCXUzMiBiYW5kd2lkdGhfc3RlcDsKK307CisKK3N0cnVjdCBkdmJfdHVuZXJfb3BzIHsKKworCXN0cnVjdCBkdmJfdHVuZXJfaW5mbyBpbmZvOworCisJaW50ICgqcmVsZWFzZSkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOworCWludCAoKmluaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKKwlpbnQgKCpzbGVlcCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpOworCisJLyoqIFRoaXMgaXMgZm9yIHNpbXBsZSBQTExzIC0gc2V0IGFsbCBwYXJhbWV0ZXJzIGluIG9uZSBnby4gKi8KKwlpbnQgKCpzZXRfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKTsKKworCS8qKiBUaGlzIGlzIHN1cHBvcnQgZm9yIGRlbW9kcyBsaWtlIHRoZSBtdDM1MiAtIGZpbGxzIG91dCB0aGUgc3VwcGxpZWQgYnVmZmVyIHdpdGggd2hhdCB0byB3cml0ZS4gKi8KKwlpbnQgKCpjYWxjX3JlZ3MpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnAsIHU4ICpidWYsIGludCBidWZfbGVuKTsKKworCWludCAoKmdldF9mcmVxdWVuY3kpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSk7CisJaW50ICgqZ2V0X2JhbmR3aWR0aCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqYmFuZHdpZHRoKTsKKworI2RlZmluZSBUVU5FUl9TVEFUVVNfTE9DS0VEIDEKKwlpbnQgKCpnZXRfc3RhdHVzKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpzdGF0dXMpOworCisJLyoqIFRoZXNlIGFyZSBwcm92aWRlZCBzZXBlcmF0ZWx5IGZyb20gc2V0X3BhcmFtcyBpbiBvcmRlciB0byBmYWNpbGl0YXRlIHNpbGljb24KKwkgKiB0dW5lcnMgd2hpY2ggcmVxdWlyZSBzb3BoaXN0aWNhdGVkIHR1bmluZyBsb29wcywgY29udHJvbGxpbmcgZWFjaCBwYXJhbWV0ZXIgc2VwZXJhdGVseS4gKi8KKwlpbnQgKCpzZXRfZnJlcXVlbmN5KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyIGZyZXF1ZW5jeSk7CisJaW50ICgqc2V0X2JhbmR3aWR0aCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiBiYW5kd2lkdGgpOworfTsKKwogc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgewogCiAJc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIGluZm87CkBAIC02NCw2ICsxMDIsOCBAQAogCQkgICAgdW5zaWduZWQgaW50IG1vZGVfZmxhZ3MsCiAJCSAgICBpbnQgKmRlbGF5LAogCQkgICAgZmVfc3RhdHVzX3QgKnN0YXR1cyk7CisJLyogZ2V0IGZyb250ZW5kIHR1bmluZyBhbGdvcml0aG0gZnJvbSB0aGUgbW9kdWxlICovCisJaW50ICgqZ2V0X2Zyb250ZW5kX2FsZ28pKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKTsKIAogCS8qIHRoZXNlIHR3byBhcmUgb25seSB1c2VkIGZvciB0aGUgc3d6aWd6YWcgY29kZSAqLwogCWludCAoKnNldF9mcm9udGVuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKQEAgLTg2LDYgKzEyNiw4IEBACiAJaW50ICgqZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBsb25nIGFyZyk7CiAJaW50ICgqZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHVuc2lnbmVkIGxvbmcgY21kKTsKIAlpbnQgKCppMmNfZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSk7CisKKwlzdHJ1Y3QgZHZiX3R1bmVyX29wcyB0dW5lcl9vcHM7CiB9OwogCiAjZGVmaW5lIE1BWF9FVkVOVCA4CkBAIC0xMDAsOSArMTQyLDEwIEBACiB9OwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kIHsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyogb3BzOworCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2YjsKIAl2b2lkKiBkZW1vZHVsYXRvcl9wcml2OworCXZvaWQqIHR1bmVyX3ByaXY7CiAJdm9pZCogZnJvbnRlbmRfcHJpdjsKIAl2b2lkKiBtaXNjX3ByaXY7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX21hdGguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9tYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmViN2M5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9tYXRoLmMKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBkdmItbWF0aCBwcm92aWRlcyBzb21lIGNvbXBsZXggZml4ZWQtcG9pbnQgbWF0aAorICogb3BlcmF0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgZHZiIHJlbGF0ZWQgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXN0b3BoIFBmaXN0ZXIgKGNocmlzdG9waHBmaXN0ZXJAZ21haWwuY29tKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CisjaW5jbHVkZSAiZHZiX21hdGguaCIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxvZ3RhYmxlWzI1Nl0gPSB7CisJMHgwMDAwLCAweDAxNzEsIDB4MDJlMCwgMHgwNDRlLCAweDA1YmEsIDB4MDcyNSwgMHgwODhlLCAweDA5ZjcsCisJMHgwYjVkLCAweDBjYzMsIDB4MGUyNywgMHgwZjhhLCAweDEwZWIsIDB4MTI0YiwgMHgxM2FhLCAweDE1MDgsCisJMHgxNjY0LCAweDE3YmYsIDB4MTkxOSwgMHgxYTcxLCAweDFiYzgsIDB4MWQxZSwgMHgxZTczLCAweDFmYzYsCisJMHgyMTE5LCAweDIyNmEsIDB4MjNiYSwgMHgyNTA4LCAweDI2NTYsIDB4MjdhMiwgMHgyOGVkLCAweDJhMzcsCisJMHgyYjgwLCAweDJjYzgsIDB4MmUwZiwgMHgyZjU0LCAweDMwOTgsIDB4MzFkYywgMHgzMzFlLCAweDM0NWYsCisJMHgzNTlmLCAweDM2ZGUsIDB4MzgxYiwgMHgzOTU4LCAweDNhOTQsIDB4M2JjZSwgMHgzZDA4LCAweDNlNDEsCisJMHgzZjc4LCAweDQwYWYsIDB4NDFlNCwgMHg0MzE5LCAweDQ0NGMsIDB4NDU3ZiwgMHg0NmIwLCAweDQ3ZTEsCisJMHg0OTEwLCAweDRhM2YsIDB4NGI2YywgMHg0Yzk5LCAweDRkYzUsIDB4NGVlZiwgMHg1MDE5LCAweDUxNDIsCisJMHg1MjZhLCAweDUzOTEsIDB4NTRiNywgMHg1NWRjLCAweDU3MDAsIDB4NTgyNCwgMHg1OTQ2LCAweDVhNjgsCisJMHg1Yjg5LCAweDVjYTgsIDB4NWRjNywgMHg1ZWU1LCAweDYwMDMsIDB4NjExZiwgMHg2MjNhLCAweDYzNTUsCisJMHg2NDZmLCAweDY1ODgsIDB4NjZhMCwgMHg2N2I3LCAweDY4Y2UsIDB4NjllNCwgMHg2YWY4LCAweDZjMGMsCisJMHg2ZDIwLCAweDZlMzIsIDB4NmY0NCwgMHg3MDU1LCAweDcxNjUsIDB4NzI3NCwgMHg3MzgzLCAweDc0OTAsCisJMHg3NTlkLCAweDc2YWEsIDB4NzdiNSwgMHg3OGMwLCAweDc5Y2EsIDB4N2FkMywgMHg3YmRiLCAweDdjZTMsCisJMHg3ZGVhLCAweDdlZjAsIDB4N2ZmNiwgMHg4MGZiLCAweDgxZmYsIDB4ODMwMiwgMHg4NDA1LCAweDg1MDcsCisJMHg4NjA4LCAweDg3MDksIDB4ODgwOSwgMHg4OTA4LCAweDhhMDYsIDB4OGIwNCwgMHg4YzAxLCAweDhjZmUsCisJMHg4ZGZhLCAweDhlZjUsIDB4OGZlZiwgMHg5MGU5LCAweDkxZTIsIDB4OTJkYiwgMHg5M2QyLCAweDk0Y2EsCisJMHg5NWMwLCAweDk2YjYsIDB4OTdhYiwgMHg5OGEwLCAweDk5OTQsIDB4OWE4NywgMHg5YjdhLCAweDljNmMsCisJMHg5ZDVlLCAweDllNGYsIDB4OWYzZiwgMHhhMDJlLCAweGExMWUsIDB4YTIwYywgMHhhMmZhLCAweGEzZTcsCisJMHhhNGQ0LCAweGE1YzAsIDB4YTZhYiwgMHhhNzk2LCAweGE4ODEsIDB4YTk2YSwgMHhhYTUzLCAweGFiM2MsCisJMHhhYzI0LCAweGFkMGMsIDB4YWRmMiwgMHhhZWQ5LCAweGFmYmUsIDB4YjBhNCwgMHhiMTg4LCAweGIyNmMsCisJMHhiMzUwLCAweGI0MzMsIDB4YjUxNSwgMHhiNWY3LCAweGI2ZDksIDB4YjdiYSwgMHhiODlhLCAweGI5N2EsCisJMHhiYTU5LCAweGJiMzgsIDB4YmMxNiwgMHhiY2Y0LCAweGJkZDEsIDB4YmVhZCwgMHhiZjhhLCAweGMwNjUsCisJMHhjMTQwLCAweGMyMWIsIDB4YzJmNSwgMHhjM2NmLCAweGM0YTgsIDB4YzU4MCwgMHhjNjU4LCAweGM3MzAsCisJMHhjODA3LCAweGM4ZGUsIDB4YzliNCwgMHhjYThhLCAweGNiNWYsIDB4Y2MzNCwgMHhjZDA4LCAweGNkZGMsCisJMHhjZWFmLCAweGNmODIsIDB4ZDA1NCwgMHhkMTI2LCAweGQxZjcsIDB4ZDJjOCwgMHhkMzk5LCAweGQ0NjksCisJMHhkNTM4LCAweGQ2MDcsIDB4ZDZkNiwgMHhkN2E0LCAweGQ4NzIsIDB4ZDkzZiwgMHhkYTBjLCAweGRhZDksCisJMHhkYmE1LCAweGRjNzAsIDB4ZGQzYiwgMHhkZTA2LCAweGRlZDAsIDB4ZGY5YSwgMHhlMDYzLCAweGUxMmMsCisJMHhlMWY1LCAweGUyYmQsIDB4ZTM4NSwgMHhlNDRjLCAweGU1MTMsIDB4ZTVkOSwgMHhlNjlmLCAweGU3NjUsCisJMHhlODJhLCAweGU4ZWYsIDB4ZTliMywgMHhlYTc3LCAweGViM2IsIDB4ZWJmZSwgMHhlY2MxLCAweGVkODMsCisJMHhlZTQ1LCAweGVmMDYsIDB4ZWZjOCwgMHhmMDg4LCAweGYxNDksIDB4ZjIwOSwgMHhmMmM4LCAweGYzODcsCisJMHhmNDQ2LCAweGY1MDUsIDB4ZjVjMywgMHhmNjgwLCAweGY3M2UsIDB4ZjdmYiwgMHhmOGI3LCAweGY5NzMsCisJMHhmYTJmLCAweGZhZWEsIDB4ZmJhNSwgMHhmYzYwLCAweGZkMWEsIDB4ZmRkNCwgMHhmZThlLCAweGZmNDcKK307CisKK3Vuc2lnbmVkIGludCBpbnRsb2cyKHUzMiB2YWx1ZSkKK3sKKwkvKioKKwkgKglyZXR1cm5zOiBsb2cyKHZhbHVlKSAqIDJeMjQKKwkgKgl3cm9uZyByZXN1bHQgaWYgdmFsdWUgPSAwIChsb2cyKDApIGlzIHVuZGVmaW5lZCkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgbXNiOworCXVuc2lnbmVkIGludCBsb2dlbnRyeTsKKwl1bnNpZ25lZCBpbnQgc2lnbmlmaWNhbmQ7CisJdW5zaWduZWQgaW50IGludGVycG9sYXRpb247CisKKwlpZiAodW5saWtlbHkodmFsdWUgPT0gMCkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZmlyc3QgZGV0ZWN0IHRoZSBtc2IgKGNvdW50IGJlZ2lucyBhdCAwKSAqLworCW1zYiA9IGZscyh2YWx1ZSkgLSAxOworCisJLyoqCisJICoJbm93IHdlIHVzZSBhIGxvZ3RhYmxlIGFmdGVyIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorCSAqCisJICoJbG9nMigyXnggKiB5KSAqIDJeMjQgPSB4ICogMl4yNCArIGxvZzIoeSkgKiAyXjI0CisJICoJd2hlcmUgeCA9IG1zYiBhbmQgdGhlcmVmb3JlIDEgPD0geSA8IDIKKwkgKglmaXJzdCB5IGlzIGRldGVybWluZWQgYnkgc2hpZnRpbmcgdGhlIHZhbHVlIGxlZnQKKwkgKglzbyB0aGF0IG1zYiBpcyBiaXQgMzEKKwkgKgkJMHgwMDIzMWY1NiAtPiAweDhDN0Q1ODAwCisJICoJdGhlIHJlc3VsdCBpcyB5ICogMl4zMSAtPiAic2lnbmlmaWNhbmQiCisJICoJdGhlbiB0aGUgaGlnaGVzdCA5IGJpdHMgYXJlIHVzZWQgZm9yIGEgdGFibGUgbG9va3VwCisJICoJdGhlIGhpZ2hlc3QgYml0IGlzIGRpc2NhcmRlZCBiZWNhdXNlIGl0J3MgYWx3YXlzIHNldAorCSAqCXRoZSBoaWdoZXN0IG5pbmUgYml0cyBpbiBvdXIgZXhhbXBsZSBhcmUgMTAwMDExMDAwCisJICoJc28gd2Ugd291bGQgdXNlIHRoZSBlbnRyeSAweDE4CisJICovCisJc2lnbmlmaWNhbmQgPSB2YWx1ZSA8PCAoMzEgLSBtc2IpOworCWxvZ2VudHJ5ID0gKHNpZ25pZmljYW5kID4+IDIzKSAmIDB4ZmY7CisKKwkvKioKKwkgKglsYXN0IHN0ZXAgd2UgZG8gaXMgaW50ZXJwb2xhdGlvbiBiZWNhdXNlIG9mIHRoZQorCSAqCWxpbWl0YXRpb25zIG9mIHRoZSBsb2cgdGFibGUgdGhlIGVycm9yIGlzIHRoYXQgcGFydCBvZgorCSAqCXRoZSBzaWduaWZpY2FuZCB3aGljaCBpc24ndCB1c2VkIGZvciBsb29rdXAgdGhlbiB3ZQorCSAqCWNvbXB1dGUgdGhlIHJhdGlvIGJldHdlZW4gdGhlIGVycm9yIGFuZCB0aGUgbmV4dCB0YWJsZSBlbnRyeQorCSAqCWFuZCBpbnRlcnBvbGF0ZSBpdCBiZXR3ZWVuIHRoZSBsb2cgdGFibGUgZW50cnkgdXNlZCBhbmQgdGhlCisJICoJbmV4dCBvbmUgdGhlIGJpZ2dlc3QgZXJyb3IgcG9zc2libGUgaXMgMHg3ZmZmZmYKKwkgKgkoaW4gb3VyIGV4YW1wbGUgaXQncyAweDdENTgwMCkKKwkgKgluZWVkZWQgdmFsdWUgZm9yIG5leHQgdGFibGUgZW50cnkgaXMgMHg4MDAwMDAKKwkgKglzbyB0aGUgaW50ZXJwb2xhdGlvbiBpcworCSAqCShlcnJvciAvIDB4ODAwMDAwKSAqIChsb2d0YWJsZV9uZXh0IC0gbG9ndGFibGVfY3VycmVudCkKKwkgKglpbiB0aGUgaW1wbGVtZW50YXRpb24gdGhlIGRpdmlzaW9uIGlzIG1vdmVkIHRvIHRoZSBlbmQgZm9yCisJICoJYmV0dGVyIGFjY3VyYWN5IHRoZXJlIGlzIGFsc28gYW4gb3ZlcmZsb3cgY29ycmVjdGlvbiBpZgorCSAqCWxvZ3RhYmxlX25leHQgaXMgMjU2CisJICovCisJaW50ZXJwb2xhdGlvbiA9ICgoc2lnbmlmaWNhbmQgJiAweDdmZmZmZikgKgorCQkJKChsb2d0YWJsZVsobG9nZW50cnkgKyAxKSAmIDB4ZmZdIC0KKwkJCSAgbG9ndGFibGVbbG9nZW50cnldKSAmIDB4ZmZmZikpID4+IDE1OworCisJLyogbm93IHdlIHJldHVybiB0aGUgcmVzdWx0ICovCisJcmV0dXJuICgobXNiIDw8IDI0KSArIChsb2d0YWJsZVtsb2dlbnRyeV0gPDwgOCkgKyBpbnRlcnBvbGF0aW9uKTsKK30KK0VYUE9SVF9TWU1CT0woaW50bG9nMik7CisKK3Vuc2lnbmVkIGludCBpbnRsb2cxMCh1MzIgdmFsdWUpCit7CisJLyoqCisJICoJcmV0dXJuczogbG9nMTAodmFsdWUpICogMl4yNAorCSAqCXdyb25nIHJlc3VsdCBpZiB2YWx1ZSA9IDAgKGxvZzEwKDApIGlzIHVuZGVmaW5lZCkKKwkgKi8KKwl1NjQgbG9nOworCisJaWYgKHVubGlrZWx5KHZhbHVlID09IDApKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCWxvZyA9IGludGxvZzIodmFsdWUpOworCisJLyoqCisJICoJd2UgdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorCSAqCWxvZzEwKHgpID0gbG9nMih4KSAqIGxvZzEwKDIpCisJICovCisKKwlyZXR1cm4gKGxvZyAqIDY0NjQ1Njk5MykgPj4gMzE7Cit9CitFWFBPUlRfU1lNQk9MKGludGxvZzEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9tYXRoLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlY2M4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbWF0aC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBkdmItbWF0aCBwcm92aWRlcyBzb21lIGNvbXBsZXggZml4ZWQtcG9pbnQgbWF0aAorICogb3BlcmF0aW9ucyBzaGFyZWQgYmV0d2VlbiB0aGUgZHZiIHJlbGF0ZWQgc3R1ZmYKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2hyaXN0b3BoIFBmaXN0ZXIgKGNocmlzdG9waHBmaXN0ZXJAZ21haWwuY29tKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgX19EVkJfTUFUSF9ICisjZGVmaW5lIF9fRFZCX01BVEhfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyoqCisgKiBjb21wdXRlcyBsb2cyIG9mIGEgdmFsdWU7IHRoZSByZXN1bHQgaXMgc2hpZnRlZCBsZWZ0IGJ5IDI0IGJpdHMKKyAqCisgKiB0byB1c2UgcmF0aW9uYWwgdmFsdWVzIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgbWV0aG9kOgorICogICBpbnRsb2cyKHZhbHVlKSA9IGludGxvZzIodmFsdWUgKiAyXngpIC0geCAqIDJeMjQKKyAqCisgKiBleGFtcGxlOiBpbnRsb2cyKDgpIHdpbGwgZ2l2ZSAzIDw8IDI0ID0gMyAqIDJeMjQKKyAqIGV4YW1wbGU6IGludGxvZzIoOSkgd2lsbCBnaXZlIDMgPDwgMjQgKyAuLi4gPSAzLjE2Li4uICogMl4yNAorICogZXhhbXBsZTogaW50bG9nMigxLjUpID0gaW50bG9nMigzKSAtIDJeMjQgPSAwLjU4NC4uLiAqIDJeMjQKKyAqCisgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIChtdXN0IGJlICE9IDApCisgKiBAcmV0dXJuIGxvZzIodmFsdWUpICogMl4yNAorICovCitleHRlcm4gdW5zaWduZWQgaW50IGludGxvZzIodTMyIHZhbHVlKTsKKworLyoqCisgKiBjb21wdXRlcyBsb2cxMCBvZiBhIHZhbHVlOyB0aGUgcmVzdWx0IGlzIHNoaWZ0ZWQgbGVmdCBieSAyNCBiaXRzCisgKgorICogdG8gdXNlIHJhdGlvbmFsIHZhbHVlcyB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIG1ldGhvZDoKKyAqICAgaW50bG9nMTAodmFsdWUpID0gaW50bG9nMTAodmFsdWUgKiAxMF54KSAtIHggKiAyXjI0CisgKgorICogZXhhbXBsZTogaW50bG9nMTAoMTAwMCkgd2lsbCBnaXZlIDMgPDwgMjQgPSAzICogMl4yNAorICogICBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIGludGxvZzEwKDEwMDApIG1pZ2h0IGJlIG5vdCBleGFjdGx5IDMgKiAyXjI0CisgKgorICogbG9vayBhdCBpbnRsb2cyIGZvciBzaW1pbGFyIGV4YW1wbGVzCisgKgorICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSAobXVzdCBiZSAhPSAwKQorICogQHJldHVybiBsb2cxMCh2YWx1ZSkgKiAyXjI0CisgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgaW50bG9nMTAodTMyIHZhbHVlKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggOWZkODc1Mi4uODg1OWFiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX25ldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuYwpAQCAtMTIsNyArMTIsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgIEhpbG1hciBMaW5kZXIgPGhsaW5kZXJAY29zeS5zYmcuYWMuYXQ+CiAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgV29sZnJhbSBTdGVyaW5nIDx3c3RlcmluZ0Bjb3N5LnNiZy5hYy5hdD4KICAqCi0gKiBVTEUgRGVjYXBzIGFjY29yZGluZyB0byBkcmFmdC1pZXRmLWlwZHZiLXVsZS0wMy50eHQuCisgKiBVTEUgRGVjYXBzIGFjY29yZGluZyB0byBSRkMgNDMyNi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtNDIsNiArNDIsOSBAQAogICogICAgICAgICAgICAgICAgICAgICBCdWdmaXhlcyBhbmQgcm9idXN0bmVzcyBpbXByb3ZlbWVudHMuCiAgKiAgICAgICAgICAgICAgICAgICAgIEZpbHRlcmluZyBvbiBkZXN0IE1BQyBhZGRyZXNzZXMsIGlmIHByZXNlbnQgKEQtQml0ID0gMCkKICAqICAgICAgICAgICAgICAgICAgICAgVUxFX0RFQlVHIGNvbXBpbGUtdGltZSBvcHRpb24uCisgKiBBcHIgMjAwNjogY3AgdjM6ICAgIEJ1Z2ZpeGVzIGFuZCBjb21wbGllbmN5IHdpdGggUkZDIDQzMjYgKFVMRSkgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICBDaHJpc3RpYW4gUHJhZWhhdXNlciA8Y3ByYWVoYXVzQGNvc3kuc2JnLmFjLmF0PiwKKyAqICAgICAgICAgICAgICAgICAgICAgICBQYXJpcyBMb2Ryb24gVW5pdmVyc2l0eSBvZiBTYWx6YnVyZy4KICAqLwogCiAvKgpAQCAtNDksOSArNTIsNiBAQAogICoKICAqIFVubG9hZGluZyBkb2VzIG5vdCB3b3JrIGZvciAyLjYuOSBrZXJuZWxzOiBhIHJlZmNvdW50IGRvZXNuJ3QgZ28gdG8gemVyby4KICAqCi0gKiBUU19GRUVEIGNhbGxiYWNrIGlzIGNhbGxlZCBvbmNlIGZvciBldmVyeSBzaW5nbGUgVFMgY2VsbCBhbHRob3VnaCBpdCBpcwotICogcmVnaXN0ZXJlZCAoaW4gZHZiX25ldF9mZWVkX3N0YXJ0KCkpIGZvciAxMDAgVFMgY2VsbHMgKHVzZWQgZm9yIGR2Yl9uZXRfdWxlKCkpLgotICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC04OSw2ICs4OSw5IEBACiAKICNpZmRlZiBVTEVfREVCVUcKIAorI2RlZmluZSBNQUNfQUREUl9QUklOVEZNVCAiJS4yeDolLjJ4OiUuMng6JS4yeDolLjJ4OiUuMngiCisjZGVmaW5lIE1BWF9BRERSX1BSSU5URk1UX0FSR1MobWFjYXApIChtYWNhcClbMF0sKG1hY2FwKVsxXSwobWFjYXApWzJdLChtYWNhcClbM10sKG1hY2FwKVs0XSwobWFjYXApWzVdCisKICNkZWZpbmUgaXNwcmludChjKQkoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykpCiAKIHN0YXRpYyB2b2lkIGhleGR1bXAoIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2hvcnQgbGVuICkKQEAgLTIxNCw2ICsyMTcsOCBAQAogI2RlZmluZSBVTEVfVEVTVAkwCiAjZGVmaW5lIFVMRV9CUklER0VECTEKIAorI2RlZmluZSBVTEVfT1BURVhUSERSX1BBRERJTkcgMAorCiBzdGF0aWMgaW50IHVsZV90ZXN0X3NuZHUoIHN0cnVjdCBkdmJfbmV0X3ByaXYgKnAgKQogewogCXJldHVybiAtMTsKQEAgLTIyMSwxNCArMjI2LDI4IEBACiAKIHN0YXRpYyBpbnQgdWxlX2JyaWRnZWRfc25kdSggc3RydWN0IGR2Yl9uZXRfcHJpdiAqcCApCiB7Ci0JLyogQlJJREdFIFNORFUgaGFuZGxpbmcgc3Vja3MgaW4gZHJhZnQtaWV0Zi1pcGR2Yi11bGUtMDMudHh0LgotCSAqIFRoaXMgaGFzIHRvIGJlIHRoZSBsYXN0IGV4dGVuc2lvbiBoZWFkZXIsIG90aGVyd2lzZSBpdCB3b24ndCB3b3JrLgotCSAqIEJsYW1lIHRoZSBhdXRob3JzIQorCXN0cnVjdCBldGhoZHIgKmhkciA9IChzdHJ1Y3QgZXRoaGRyKikgcC0+dWxlX25leHRfaGRyOworCWlmKG50b2hzKGhkci0+aF9wcm90bykgPCAxNTM2KSB7CisJCWludCBmcmFtZWxlbiA9IHAtPnVsZV9zbmR1X2xlbiAtICgocC0+dWxlX25leHRfaGRyK3NpemVvZihzdHJ1Y3QgZXRoaGRyKSkgLSBwLT51bGVfc2tiLT5kYXRhKTsKKwkJLyogQSBmcmFtZSBUeXBlIDwgMTUzNiBmb3IgYSBicmlkZ2VkIGZyYW1lLCBpbnRyb2R1Y2VzIGEgTExDIExlbmd0aCBmaWVsZC4gKi8KKwkJaWYoZnJhbWVsZW4gIT0gbnRvaHMoaGRyLT5oX3Byb3RvKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCS8qIE5vdGU6CisJICogRnJvbSBSRkM0MzI2OgorCSAqICAiQSBicmlkZ2VkIFNORFUgaXMgYSBNYW5kYXRvcnkgRXh0ZW5zaW9uIEhlYWRlciBvZiBUeXBlIDEuCisJICogICBJdCBtdXN0IGJlIHRoZSBmaW5hbCAob3Igb25seSkgZXh0ZW5zaW9uIGhlYWRlciBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBjaGFpbiBvZiBhIFNORFUuIgorCSAqIFRoZSAndWxlX2JyaWRnZWQnIGZsYWcgd2lsbCBjYXVzZSB0aGUgZXh0ZW5zaW9uIGhlYWRlciBwcm9jZXNzaW5nIGxvb3AgdG8gdGVybWluYXRlLgogCSAqLwogCXAtPnVsZV9icmlkZ2VkID0gMTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB1bGVfZXh0aGRyX3BhZGRpbmcoc3RydWN0IGR2Yl9uZXRfcHJpdiAqcCkKK3sKKwlyZXR1cm4gMDsKK30KIAogLyoqIEhhbmRsZSBVTEUgZXh0ZW5zaW9uIGhlYWRlcnMuCiAgKiAgRnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGEgc3VjY2Vzc2Z1bCBDUkMzMiB2ZXJpZmljYXRpb24gb2YgYW4gVUxFIFNORFUgdG8gY29tcGxldGUgaXRzIGRlY29kaW5nLgpAQCAtMjQyLDcgKzI2MSw4IEBACiAJCXsgWzBdID0gdWxlX3Rlc3Rfc25kdSwgWzFdID0gdWxlX2JyaWRnZWRfc25kdSwgWzJdID0gTlVMTCwgIH07CiAKIAkvKiBUYWJsZSBvZiBvcHRpb25hbCBleHRlbnNpb24gaGVhZGVyIGhhbmRsZXJzLiAgVGhlIGhlYWRlciB0eXBlIGlzIHRoZSBpbmRleC4gKi8KLQlzdGF0aWMgaW50ICgqdWxlX29wdGlvbmFsX2V4dF9oYW5kbGVyc1syNTVdKSggc3RydWN0IGR2Yl9uZXRfcHJpdiAqcCApID0geyBOVUxMLCB9OworCXN0YXRpYyBpbnQgKCp1bGVfb3B0aW9uYWxfZXh0X2hhbmRsZXJzWzI1NV0pKCBzdHJ1Y3QgZHZiX25ldF9wcml2ICpwICkgPQorCQl7IFswXSA9IHVsZV9leHRoZHJfcGFkZGluZywgWzFdID0gTlVMTCwgfTsKIAogCWludCBleHRfbGVuID0gMDsKIAl1bnNpZ25lZCBjaGFyIGhsZW4gPSAocC0+dWxlX3NuZHVfdHlwZSAmIDB4MDcwMCkgPj4gODsKQEAgLTI1MywyNSArMjczLDMxIEBACiAJCS8qIE1hbmRhdG9yeSBleHRlbnNpb24gaGVhZGVyICovCiAJCWlmICh1bGVfbWFuZGF0b3J5X2V4dF9oYW5kbGVyc1todHlwZV0pIHsKIAkJCWV4dF9sZW4gPSB1bGVfbWFuZGF0b3J5X2V4dF9oYW5kbGVyc1todHlwZV0oIHAgKTsKLQkJCXAtPnVsZV9uZXh0X2hkciArPSBleHRfbGVuOwotCQkJaWYgKCEgcC0+dWxlX2JyaWRnZWQpIHsKLQkJCQlwLT51bGVfc25kdV90eXBlID0gbnRvaHMoICoodW5zaWduZWQgc2hvcnQgKilwLT51bGVfbmV4dF9oZHIgKTsKLQkJCQlwLT51bGVfbmV4dF9oZHIgKz0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJcC0+dWxlX3NuZHVfdHlwZSA9IG50b2hzKCAqKHVuc2lnbmVkIHNob3J0ICopKHAtPnVsZV9uZXh0X2hkciArICgocC0+dWxlX2RiaXQgPyAyIDogMykgKiBFVEhfQUxFTikpICk7Ci0JCQkJLyogVGhpcyBhc3N1cmVzIHRoZSBleHRlbnNpb24gaGFuZGxpbmcgbG9vcCB3aWxsIHRlcm1pbmF0ZS4gKi8KKwkJCWlmKGV4dF9sZW4gPj0gMCkgeworCQkJCXAtPnVsZV9uZXh0X2hkciArPSBleHRfbGVuOworCQkJCWlmICghcC0+dWxlX2JyaWRnZWQpIHsKKwkJCQkJcC0+dWxlX3NuZHVfdHlwZSA9IG50b2hzKCoodW5zaWduZWQgc2hvcnQgKilwLT51bGVfbmV4dF9oZHIpOworCQkJCQlwLT51bGVfbmV4dF9oZHIgKz0gMjsKKwkJCQl9IGVsc2UgeworCQkJCQlwLT51bGVfc25kdV90eXBlID0gbnRvaHMoKih1bnNpZ25lZCBzaG9ydCAqKShwLT51bGVfbmV4dF9oZHIgKyAoKHAtPnVsZV9kYml0ID8gMiA6IDMpICogRVRIX0FMRU4pKSk7CisJCQkJCS8qIFRoaXMgYXNzdXJlcyB0aGUgZXh0ZW5zaW9uIGhhbmRsaW5nIGxvb3Agd2lsbCB0ZXJtaW5hdGUuICovCisJCQkJfQogCQkJfQorCQkJLy8gZWxzZTogZXh0ZW5zaW9uIGhhbmRsZXIgZmFpbGVkIG9yIFNORFUgc2hvdWxkIGJlIGRpc2NhcmRlZAogCQl9IGVsc2UKIAkJCWV4dF9sZW4gPSAtMTsJLyogU05EVSBoYXMgdG8gYmUgZGlzY2FyZGVkLiAqLwogCX0gZWxzZSB7CiAJCS8qIE9wdGlvbmFsIGV4dGVuc2lvbiBoZWFkZXIuICBDYWxjdWxhdGUgdGhlIGxlbmd0aC4gKi8KLQkJZXh0X2xlbiA9IGhsZW4gPDwgMjsKKwkJZXh0X2xlbiA9IGhsZW4gPDwgMTsKIAkJLyogUHJvY2VzcyB0aGUgb3B0aW9uYWwgZXh0ZW5zaW9uIGhlYWRlciBhY2NvcmRpbmcgdG8gaXRzIHR5cGUuICovCiAJCWlmICh1bGVfb3B0aW9uYWxfZXh0X2hhbmRsZXJzW2h0eXBlXSkKIAkJCSh2b2lkKXVsZV9vcHRpb25hbF9leHRfaGFuZGxlcnNbaHR5cGVdKCBwICk7CiAJCXAtPnVsZV9uZXh0X2hkciArPSBleHRfbGVuOwotCQlwLT51bGVfc25kdV90eXBlID0gbnRvaHMoICoodW5zaWduZWQgc2hvcnQgKilwLT51bGVfbmV4dF9oZHIgKTsKLQkJcC0+dWxlX25leHRfaGRyICs9IDI7CisJCXAtPnVsZV9zbmR1X3R5cGUgPSBudG9ocyggKih1bnNpZ25lZCBzaG9ydCAqKShwLT51bGVfbmV4dF9oZHItMikgKTsKKwkJLyoKKwkJICogbm90ZTogdGhlIGxlbmd0aCBvZiB0aGUgbmV4dCBoZWFkZXIgdHlwZSBpcyBpbmNsdWRlZCBpbiB0aGUKKwkJICogbGVuZ3RoIG9mIFRISVMgb3B0aW9uYWwgZXh0ZW5zaW9uIGhlYWRlcgorCQkgKi8KIAl9CiAKIAlyZXR1cm4gZXh0X2xlbjsKQEAgLTI4NCw4ICszMTAsMTQgQEAKIAlwLT51bGVfbmV4dF9oZHIgPSBwLT51bGVfc2tiLT5kYXRhOwogCWRvIHsKIAkJbCA9IGhhbmRsZV9vbmVfdWxlX2V4dGVuc2lvbiggcCApOwotCQlpZiAobCA9PSAtMSkgcmV0dXJuIC0xOwkvKiBTdG9wIGV4dGVuc2lvbiBoZWFkZXIgcHJvY2Vzc2luZyBhbmQgZGlzY2FyZCBTTkRVLiAqLworCQlpZiAobCA8IDApCisJCQlyZXR1cm4gbDsJLyogU3RvcCBleHRlbnNpb24gaGVhZGVyIHByb2Nlc3NpbmcgYW5kIGRpc2NhcmQgU05EVS4gKi8KIAkJdG90YWxfZXh0X2xlbiArPSBsOworI2lmZGVmIFVMRV9ERUJVRworCQlkcHJpbnRrKCJoYW5kbGVfdWxlX2V4dGVuc2lvbnM6IHVsZV9uZXh0X2hkcj0lcCwgdWxlX3NuZHVfdHlwZT0laSwgIgorCQkJImw9JWksIHRvdGFsX2V4dF9sZW49JWlcbiIsIHAtPnVsZV9uZXh0X2hkciwKKwkJCShpbnQpIHAtPnVsZV9zbmR1X3R5cGUsIGwsIHRvdGFsX2V4dF9sZW4pOworI2VuZGlmCiAKIAl9IHdoaWxlIChwLT51bGVfc25kdV90eXBlIDwgMTUzNik7CiAKQEAgLTM1NSw4ICszODcsOCBAQAogCQkJCWlmIChwcml2LT51bGVfc2tiKSB7CiAJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKIAkJCQkJLyogUHJlcGFyZSBmb3IgbmV4dCBTTkRVLiAqLwotCQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfZXJyb3JzKys7Ci0JCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9mcmFtZV9lcnJvcnMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwogCQkJCX0KIAkJCQlyZXNldF91bGUocHJpdik7CiAJCQkJcHJpdi0+bmVlZF9wdXNpID0gMTsKQEAgLTM5NiwyNyArNDI4LDI1IEBACiAJCQl9CiAJCX0KIAotCQkvKiBDaGVjayBjb250aW51aXR5IGNvdW50ZXIuICovCiAJCWlmIChuZXdfdHMpIHsKKwkJCS8qIENoZWNrIGNvbnRpbnVpdHkgY291bnRlci4gKi8KIAkJCWlmICgodHNbM10gJiAweDBGKSA9PSBwcml2LT50c2NjKQogCQkJCXByaXYtPnRzY2MgPSAocHJpdi0+dHNjYyArIDEpICYgMHgwRjsKIAkJCWVsc2UgewogCQkJCS8qIFRTIGRpc2NvbnRpbnVpdHkgaGFuZGxpbmc6ICovCiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBUUyBkaXNjb250aW51aXR5OiBnb3QgJSN4LCAiCi0JCQkJICAgICAgICJleHB0ZWN0ZWQgJSN4LlxuIiwgcHJpdi0+dHNfY291bnQsIHRzWzNdICYgMHgwRiwgcHJpdi0+dHNjYyk7CisJCQkJICAgICAgICJleHBlY3RlZCAlI3guXG4iLCBwcml2LT50c19jb3VudCwgdHNbM10gJiAweDBGLCBwcml2LT50c2NjKTsKIAkJCQkvKiBEcm9wIHBhcnRseSBkZWNvZGVkIFNORFUsIHJlc2V0IHN0YXRlLCByZXN5bmMgb24gUFVTSS4gKi8KIAkJCQlpZiAocHJpdi0+dWxlX3NrYikgewogCQkJCQlkZXZfa2ZyZWVfc2tiKCBwcml2LT51bGVfc2tiICk7CiAJCQkJCS8qIFByZXBhcmUgZm9yIG5leHQgU05EVS4gKi8KIAkJCQkJLy8gcmVzZXRfdWxlKHByaXYpOyAgbW92ZWQgdG8gYmVsb3cuCi0JCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKys7CiAJCQkJfQogCQkJCXJlc2V0X3VsZShwcml2KTsKIAkJCQkvKiBza2lwIHRvIG5leHQgUFVTSS4gKi8KIAkJCQlwcml2LT5uZWVkX3B1c2kgPSAxOwotCQkJCXRzICs9IFRTX1NaOwotCQkJCXByaXYtPnRzX2NvdW50Kys7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQkvKiBJZiB3ZSBzdGlsbCBoYXZlIGFuIGluY29tcGxldGUgcGF5bG9hZCwgYnV0IFBVU0kgaXMKQEAgLTQyNSw3ICs0NTUsNyBAQAogCQkJICogY2VsbHMgKGNvbnRpbnVpdHkgY291bnRlciB3cmFwKS4gKi8KIAkJCWlmICh0c1sxXSAmIFRTX1BVU0kpIHsKIAkJCQlpZiAoISBwcml2LT5uZWVkX3B1c2kpIHsKLQkJCQkJaWYgKCpmcm9tX3doZXJlID4gMTgxKSB7CisJCQkJCWlmICghKCpmcm9tX3doZXJlIDwgKHRzX3JlbWFpbi0xKSkgfHwgKmZyb21fd2hlcmUgIT0gcHJpdi0+dWxlX3NuZHVfcmVtYWluKSB7CiAJCQkJCQkvKiBQb2ludGVyIGZpZWxkIGlzIGludmFsaWQuICBEcm9wIHRoaXMgVFMgY2VsbCBhbmQgYW55IHN0YXJ0ZWQgVUxFIFNORFUuICovCiAJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlbHU6IEludmFsaWQgcG9pbnRlciAiCiAJCQkJCQkgICAgICAgImZpZWxkOiAldS5cbiIsIHByaXYtPnRzX2NvdW50LCAqZnJvbV93aGVyZSk7CkBAIC00MzgsOCArNDY4LDYgQEAKIAkJCQkJCX0KIAkJCQkJCXJlc2V0X3VsZShwcml2KTsKIAkJCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7Ci0JCQkJCQl0cyArPSBUU19TWjsKLQkJCQkJCXByaXYtPnRzX2NvdW50Kys7CiAJCQkJCQljb250aW51ZTsKIAkJCQkJfQogCQkJCQkvKiBTa2lwIHBvaW50ZXIgZmllbGQgKHdlJ3JlIHByb2Nlc3NpbmcgYQpAQCAtNDUyLDggKzQ4MCw4IEBACiAJCQkJaWYgKHByaXYtPnVsZV9zbmR1X3JlbWFpbiA+IDE4MykgewogCQkJCQkvKiBDdXJyZW50IFNORFUgbGFja3MgbW9yZSBkYXRhIHRoYW4gdGhlcmUgY291bGQgYmUgYXZhaWxhYmxlIGluIHRoZQogCQkJCQkgKiBjdXJyZW50IFRTIGNlbGwuICovCi0JCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKKwkJCQkJcHJpdi0+c3RhdHMucnhfZXJyb3JzKys7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnMrKzsKIAkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJWx1OiBFeHBlY3RlZCAlZCBtb3JlIFNORFUgYnl0ZXMsIGJ1dCAiCiAJCQkJCSAgICAgICAiZ290IFBVU0kgKHBmICVkLCB0c19yZW1haW4gJWQpLiAgRmx1c2hpbmcgaW5jb21wbGV0ZSBwYXlsb2FkLlxuIiwKIAkJCQkJICAgICAgIHByaXYtPnRzX2NvdW50LCBwcml2LT51bGVfc25kdV9yZW1haW4sIHRzWzRdLCB0c19yZW1haW4pOwpAQCAtNDkyLDkgKzUyMCwxMSBAQAogCQkJCX0gZWxzZQogCQkJCQlwcml2LT51bGVfZGJpdCA9IDA7CiAKLQkJCQlpZiAocHJpdi0+dWxlX3NuZHVfbGVuID4gMzI3NjMpIHsKKwkJCQlpZiAocHJpdi0+dWxlX3NuZHVfbGVuIDwgNSkgewogCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlbHU6IEludmFsaWQgVUxFIFNORFUgbGVuZ3RoICV1LiAiCiAJCQkJCSAgICAgICAiUmVzeW5jaW5nLlxuIiwgcHJpdi0+dHNfY291bnQsIHByaXYtPnVsZV9zbmR1X2xlbik7CisJCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCQlwcml2LT5zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCQkJCXByaXYtPnVsZV9zbmR1X2xlbiA9IDA7CiAJCQkJCXByaXYtPm5lZWRfcHVzaSA9IDE7CiAJCQkJCW5ld190cyA9IDE7CkBAIC02MDgsNTggKzYzOCwxMDMgQEAKIAkJCQl1bGVfZHVtcCA9IDE7CiAjZW5kaWYKIAotCQkJCSgoc3RydWN0IGR2Yl9uZXRfcHJpdiAqKSBkZXYtPnByaXYpLT5zdGF0cy5yeF9lcnJvcnMrKzsKLQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfY3JjX2Vycm9ycysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2Vycm9ycysrOworCQkJCXByaXYtPnN0YXRzLnJ4X2NyY19lcnJvcnMrKzsKIAkJCQlkZXZfa2ZyZWVfc2tiKHByaXYtPnVsZV9za2IpOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBDUkMzMiB2ZXJpZmllZCBPSy4gKi8KLQkJCQkvKiBIYW5kbGUgVUxFIEV4dGVuc2lvbiBIZWFkZXJzLiAqLwotCQkJCWlmIChwcml2LT51bGVfc25kdV90eXBlIDwgMTUzNikgewotCQkJCQkvKiBUaGVyZSBpcyBhbiBleHRlbnNpb24gaGVhZGVyLiAgSGFuZGxlIGl0IGFjY29yZGluZ2x5LiAqLwotCQkJCQlpbnQgbCA9IGhhbmRsZV91bGVfZXh0ZW5zaW9ucyggcHJpdiApOwotCQkJCQlpZiAobCA8IDApIHsKLQkJCQkJCS8qIE1hbmRhdG9yeSBleHRlbnNpb24gaGVhZGVyIHVua25vd24gb3IgVEVTVCBTTkRVLiAgRHJvcCBpdC4gKi8KLQkJCQkJCS8vIHByaW50ayggS0VSTl9XQVJOSU5HICJEcm9wcGluZyBTTkRVLCBleHRlbnNpb24gaGVhZGVycy5cbiIgKTsKLQkJCQkJCWRldl9rZnJlZV9za2IoIHByaXYtPnVsZV9za2IgKTsKLQkJCQkJCWdvdG8gc25kdV9kb25lOwotCQkJCQl9Ci0JCQkJCXNrYl9wdWxsKCBwcml2LT51bGVfc2tiLCBsICk7Ci0JCQkJfQorCQkJCXU4IGRlc3RfYWRkcltFVEhfQUxFTl07CisJCQkJc3RhdGljIGNvbnN0IHU4IGJjX2FkZHJbRVRIX0FMRU5dID0KKwkJCQkJeyBbIDAgLi4uIEVUSF9BTEVOLTFdID0gMHhmZiB9OwogCiAJCQkJLyogQ1JDMzIgd2FzIE9LLiBSZW1vdmUgaXQgZnJvbSBza2IuICovCiAJCQkJcHJpdi0+dWxlX3NrYi0+dGFpbCAtPSA0OwogCQkJCXByaXYtPnVsZV9za2ItPmxlbiAtPSA0OwogCi0JCQkJLyogRmlsdGVyIG9uIHJlY2VpdmVyJ3MgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MsIGlmIHByZXNlbnQuICovCiAJCQkJaWYgKCFwcml2LT51bGVfZGJpdCkgewotCQkJCQkvKiBUaGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgaXMgdGhlIG5leHQgZGF0YSBpbiB0aGUgc2tiLiAqLwotCQkJCQlpZiAobWVtY21wKCBwcml2LT51bGVfc2tiLT5kYXRhLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTiApKSB7Ci0JCQkJCQkvKiBNQUMgYWRkcmVzc2VzIGRvbid0IG1hdGNoLiAgRHJvcCBTTkRVLiAqLwotCQkJCQkJLy8gcHJpbnRrKCBLRVJOX1dBUk5JTkcgIkRyb3BwaW5nIFNORFUsIE1BQyBhZGRyZXNzLlxuIiApOwotCQkJCQkJZGV2X2tmcmVlX3NrYiggcHJpdi0+dWxlX3NrYiApOworCQkJCQkvKgorCQkJCQkgKiBUaGUgZGVzdGluYXRpb24gTUFDIGFkZHJlc3MgaXMgdGhlCisJCQkJCSAqIG5leHQgZGF0YSBpbiB0aGUgc2tiLiAgSXQgY29tZXMKKwkJCQkJICogYmVmb3JlIGFueSBleHRlbnNpb24gaGVhZGVycy4KKwkJCQkJICoKKwkJCQkJICogQ2hlY2sgaWYgdGhlIHBheWxvYWQgb2YgdGhpcyBTTkRVCisJCQkJCSAqIHNob3VsZCBiZSBwYXNzZWQgdXAgdGhlIHN0YWNrLgorCQkJCQkgKi8KKwkJCQkJcmVnaXN0ZXIgaW50IGRyb3AgPSAwOworCQkJCQlpZiAocHJpdi0+cnhfbW9kZSAhPSBSWF9NT0RFX1BST01JU0MpIHsKKwkJCQkJCWlmIChwcml2LT51bGVfc2tiLT5kYXRhWzBdICYgMHgwMSkgeworCQkJCQkJCS8qIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KKwkJCQkJCQlpZiAobWVtY21wKHByaXYtPnVsZV9za2ItPmRhdGEsIGJjX2FkZHIsIEVUSF9BTEVOKSkgeworCQkJCQkJCQkvKiBtdWx0aWNhc3QgKi8KKwkJCQkJCQkJaWYgKHByaXYtPnJ4X21vZGUgPT0gUlhfTU9ERV9NVUxUSSkgeworCQkJCQkJCQkJaW50IGk7CisJCQkJCQkJCQlmb3IoaSA9IDA7IGkgPCBwcml2LT5tdWx0aV9udW0gJiYgbWVtY21wKHByaXYtPnVsZV9za2ItPmRhdGEsIHByaXYtPm11bHRpX21hY3NbaV0sIEVUSF9BTEVOKTsgaSsrKQorCQkJCQkJCQkJCTsKKwkJCQkJCQkJCWlmIChpID09IHByaXYtPm11bHRpX251bSkKKwkJCQkJCQkJCQlkcm9wID0gMTsKKwkJCQkJCQkJfSBlbHNlIGlmIChwcml2LT5yeF9tb2RlICE9IFJYX01PREVfQUxMX01VTFRJKQorCQkJCQkJCQkJZHJvcCA9IDE7IC8qIG5vIGJyb2FkY2FzdDsgKi8KKwkJCQkJCQkJLyogZWxzZTogYWxsIG11bHRpY2FzdCBtb2RlOiBhY2NlcHQgYWxsIG11bHRpY2FzdCBwYWNrZXRzICovCisJCQkJCQkJfQorCQkJCQkJCS8qIGVsc2U6IGJyb2FkY2FzdCAqLworCQkJCQkJfQorCQkJCQkJZWxzZSBpZiAobWVtY21wKHByaXYtPnVsZV9za2ItPmRhdGEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJCQkJCQlkcm9wID0gMTsKKwkJCQkJCS8qIGVsc2U6IGRlc3RpbmF0aW9uIGFkZHJlc3MgbWF0Y2hlcyB0aGUgTUFDIGFkZHJlc3Mgb2Ygb3VyIHJlY2VpdmVyIGRldmljZSAqLworCQkJCQl9CisJCQkJCS8qIGVsc2U6IHByb21pc2Npb3VzIG1vZGU7IHBhc3MgZXZlcnl0aGluZyB1cCB0aGUgc3RhY2sgKi8KKworCQkJCQlpZiAoZHJvcCkgeworI2lmZGVmIFVMRV9ERUJVRworCQkJCQkJZHByaW50aygiRHJvcHBpbmcgU05EVTogTUFDIGRlc3RpbmF0aW9uIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2g6IGRlc3QgYWRkcjogIk1BQ19BRERSX1BSSU5URk1UIiwgZGV2IGFkZHI6ICJNQUNfQUREUl9QUklOVEZNVCJcbiIsCisJCQkJCQkJTUFYX0FERFJfUFJJTlRGTVRfQVJHUyhwcml2LT51bGVfc2tiLT5kYXRhKSwgTUFYX0FERFJfUFJJTlRGTVRfQVJHUyhkZXYtPmRldl9hZGRyKSk7CisjZW5kaWYKKwkJCQkJCWRldl9rZnJlZV9za2IocHJpdi0+dWxlX3NrYik7CiAJCQkJCQlnb3RvIHNuZHVfZG9uZTsKIAkJCQkJfQotCQkJCQlpZiAoISBwcml2LT51bGVfYnJpZGdlZCkgewotCQkJCQkJc2tiX3B1c2goIHByaXYtPnVsZV9za2IsIEVUSF9BTEVOICsgMiApOwotCQkJCQkJZXRoaCA9IChzdHJ1Y3QgZXRoaGRyICopcHJpdi0+dWxlX3NrYi0+ZGF0YTsKLQkJCQkJCW1lbWNweSggZXRoaC0+aF9kZXN0LCBldGhoLT5oX3NvdXJjZSwgRVRIX0FMRU4gKTsKLQkJCQkJCW1lbXNldCggZXRoaC0+aF9zb3VyY2UsIDAsIEVUSF9BTEVOICk7Ci0JCQkJCQlldGhoLT5oX3Byb3RvID0gaHRvbnMoIHByaXYtPnVsZV9zbmR1X3R5cGUgKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIFNraXAgdGhlIFJlY2VpdmVyIGRlc3RpbmF0aW9uIE1BQyBhZGRyZXNzLiAqLwotCQkJCQkJc2tiX3B1bGwoIHByaXYtPnVsZV9za2IsIEVUSF9BTEVOICk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoISBwcml2LT51bGVfYnJpZGdlZCkgewotCQkJCQkJc2tiX3B1c2goIHByaXYtPnVsZV9za2IsIEVUSF9ITEVOICk7Ci0JCQkJCQlldGhoID0gKHN0cnVjdCBldGhoZHIgKilwcml2LT51bGVfc2tiLT5kYXRhOwotCQkJCQkJbWVtY3B5KCBldGhoLT5oX2Rlc3QsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOICk7Ci0JCQkJCQltZW1zZXQoIGV0aGgtPmhfc291cmNlLCAwLCBFVEhfQUxFTiApOwotCQkJCQkJZXRoaC0+aF9wcm90byA9IGh0b25zKCBwcml2LT51bGVfc25kdV90eXBlICk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBza2IgaXMgaW4gY29ycmVjdCBzdGF0ZTsgbm90aGluZyB0byBkby4gKi8KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQltZW1jcHkoZGVzdF9hZGRyLCAgcHJpdi0+dWxlX3NrYi0+ZGF0YSwgRVRIX0FMRU4pOworCQkJCQkJc2tiX3B1bGwocHJpdi0+dWxlX3NrYiwgRVRIX0FMRU4pOwogCQkJCQl9CiAJCQkJfQorCisJCQkJLyogSGFuZGxlIFVMRSBFeHRlbnNpb24gSGVhZGVycy4gKi8KKwkJCQlpZiAocHJpdi0+dWxlX3NuZHVfdHlwZSA8IDE1MzYpIHsKKwkJCQkJLyogVGhlcmUgaXMgYW4gZXh0ZW5zaW9uIGhlYWRlci4gIEhhbmRsZSBpdCBhY2NvcmRpbmdseS4gKi8KKwkJCQkJaW50IGwgPSBoYW5kbGVfdWxlX2V4dGVuc2lvbnMocHJpdik7CisJCQkJCWlmIChsIDwgMCkgeworCQkJCQkJLyogTWFuZGF0b3J5IGV4dGVuc2lvbiBoZWFkZXIgdW5rbm93biBvciBURVNUIFNORFUuICBEcm9wIGl0LiAqLworCQkJCQkJLy8gcHJpbnRrKCBLRVJOX1dBUk5JTkcgIkRyb3BwaW5nIFNORFUsIGV4dGVuc2lvbiBoZWFkZXJzLlxuIiApOworCQkJCQkJZGV2X2tmcmVlX3NrYihwcml2LT51bGVfc2tiKTsKKwkJCQkJCWdvdG8gc25kdV9kb25lOworCQkJCQl9CisJCQkJCXNrYl9wdWxsKHByaXYtPnVsZV9za2IsIGwpOworCQkJCX0KKworCQkJCS8qCisJCQkJICogQ29uc3RydWN0L2Fzc3VyZSBjb3JyZWN0IGV0aGVybmV0IGhlYWRlci4KKwkJCQkgKiBOb3RlOiBpbiBicmlkZ2VkIG1vZGUgKHByaXYtPnVsZV9icmlkZ2VkICE9CisJCQkJICogMCkgd2UgYWxyZWFkeSBoYXZlIHRoZSAob3JpZ2luYWwpIGV0aGVybmV0CisJCQkJICogaGVhZGVyIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAoYWZ0ZXIKKwkJCQkgKiBvcHRpb25hbCBkZXN0LiBhZGRyZXNzIGFuZCBhbnkgZXh0ZW5zaW9uCisJCQkJICogaGVhZGVycykuCisJCQkJICovCisKKwkJCQlpZiAoIXByaXYtPnVsZV9icmlkZ2VkKSB7CisJCQkJCXNrYl9wdXNoKHByaXYtPnVsZV9za2IsIEVUSF9ITEVOKTsKKwkJCQkJZXRoaCA9IChzdHJ1Y3QgZXRoaGRyICopcHJpdi0+dWxlX3NrYi0+ZGF0YTsKKwkJCQkJaWYgKCFwcml2LT51bGVfZGJpdCkgeworCQkJCQkJIC8qIGRlc3RfYWRkciBidWZmZXIgaXMgb25seSB2YWxpZCBpZiBwcml2LT51bGVfZGJpdCA9PSAwICovCisJCQkJCQltZW1jcHkoZXRoaC0+aF9kZXN0LCBkZXN0X2FkZHIsIEVUSF9BTEVOKTsKKwkJCQkJCW1lbXNldChldGhoLT5oX3NvdXJjZSwgMCwgRVRIX0FMRU4pOworCQkJCQl9CisJCQkJCWVsc2UgLyogemVyb2l6ZSBzb3VyY2UgYW5kIGRlc3QgKi8KKwkJCQkJCW1lbXNldCggZXRoaCwgMCwgRVRIX0FMRU4qMiApOworCisJCQkJCWV0aGgtPmhfcHJvdG8gPSBodG9ucyhwcml2LT51bGVfc25kdV90eXBlKTsKKwkJCQl9CisJCQkJLyogZWxzZTogIHNrYiBpcyBpbiBjb3JyZWN0IHN0YXRlOyBub3RoaW5nIHRvIGRvLiAqLwogCQkJCXByaXYtPnVsZV9icmlkZ2VkID0gMDsKIAogCQkJCS8qIFN0dWZmIGludG8ga2VybmVsJ3MgcHJvdG9jb2wgc3RhY2suICovCkBAIC02NjgsOCArNzQzLDggQEAKIAkJCQkgKiByZWNlaXZlIHRoZSBwYWNrZXQgYW55aG93LiAqLwogCQkJCS8qIGlmIChwcml2LT51bGVfZGJpdCAmJiBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9PVEhFUkhPU1QpCiAJCQkJCXByaXYtPnVsZV9za2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7ICovCi0JCQkJKChzdHJ1Y3QgZHZiX25ldF9wcml2ICopIGRldi0+cHJpdiktPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCQkoKHN0cnVjdCBkdmJfbmV0X3ByaXYgKikgZGV2LT5wcml2KS0+c3RhdHMucnhfYnl0ZXMgKz0gcHJpdi0+dWxlX3NrYi0+bGVuOworCQkJCXByaXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCQlwcml2LT5zdGF0cy5yeF9ieXRlcyArPSBwcml2LT51bGVfc2tiLT5sZW47CiAJCQkJbmV0aWZfcngocHJpdi0+dWxlX3NrYik7CiAJCQl9CiAJCQlzbmR1X2RvbmU6CkBAIC05NDQsNyArMTAxOSw3IEBACiAJCWRwcmludGsoIiVzOiBzdGFydCBmaWx0ZXJpbmdcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCXByaXYtPnNlY2ZlZWQtPnN0YXJ0X2ZpbHRlcmluZyhwcml2LT5zZWNmZWVkKTsKIAl9IGVsc2UgaWYgKHByaXYtPmZlZWR0eXBlID09IERWQl9ORVRfRkVFRFRZUEVfVUxFKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0ID0geyAwLCAzMDAwMDAwMCB9OyAvLyAzMCBtc2VjCisJCXN0cnVjdCB0aW1lc3BlYyB0aW1lb3V0ID0geyAwLCAxMDAwMDAwMCB9OyAvLyAxMCBtc2VjCiAKIAkJLyogd2UgaGF2ZSBwYXlsb2FkcyBlbmNhcHN1bGF0ZWQgaW4gVFMgKi8KIAkJZHByaW50aygiJXM6IGFsbG9jIHRzZmVlZFxuIiwgX19GVU5DVElPTl9fKTsKQEAgLTk1NiwxMCArMTAzMSwxMyBAQAogCiAJCS8qIFNldCBuZXRkZXZpY2UgcG9pbnRlciBmb3IgdHMgZGVjYXBzIGNhbGxiYWNrLiAqLwogCQlwcml2LT50c2ZlZWQtPnByaXYgPSAodm9pZCAqKWRldjsKLQkJcmV0ID0gcHJpdi0+dHNmZWVkLT5zZXQocHJpdi0+dHNmZWVkLCBwcml2LT5waWQsCi0JCQkJCVRTX1BBQ0tFVCwgRE1YX1RTX1BFU19PVEhFUiwKKwkJcmV0ID0gcHJpdi0+dHNmZWVkLT5zZXQocHJpdi0+dHNmZWVkLAorCQkJCQlwcml2LT5waWQsIC8qIHBpZCAqLworCQkJCQlUU19QQUNLRVQsIC8qIHR5cGUgKi8KKwkJCQkJRE1YX1RTX1BFU19PVEhFUiwgLyogcGVzIHR5cGUgKi8KIAkJCQkJMzI3NjgsICAgICAvKiBjaXJjdWxhciBidWZmZXIgc2l6ZSAqLwotCQkJCQl0aW1lb3V0KTsKKwkJCQkJdGltZW91dCAgICAvKiB0aW1lb3V0ICovCisJCQkJCSk7CiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50aygiJXM6IGNvdWxkIG5vdCBzZXQgdHMgZmVlZFxuIiwgZGV2LT5uYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2YmRldi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKaW5kZXggMzg1MjQzMC4uMTM0YzJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCQkJImR2Yi9hZGFwdGVyJWQvJXMlZCIsIGFkYXAtPm51bSwgZG5hbWVzW3R5cGVdLCBpZCk7CiAKIAljbGFzc19kZXZpY2VfY3JlYXRlKGR2Yl9jbGFzcywgTlVMTCwgTUtERVYoRFZCX01BSk9SLCBudW1zMm1pbm9yKGFkYXAtPm51bSwgdHlwZSwgaWQpKSwKLQkJCSAgICBOVUxMLCAiZHZiJWQuJXMlZCIsIGFkYXAtPm51bSwgZG5hbWVzW3R5cGVdLCBpZCk7CisJCQkgICAgYWRhcC0+ZGV2aWNlLCAiZHZiJWQuJXMlZCIsIGFkYXAtPm51bSwgZG5hbWVzW3R5cGVdLCBpZCk7CiAKIAlkcHJpbnRrKCJEVkI6IHJlZ2lzdGVyIGFkYXB0ZXIlZC8lcyVkIEAgbWlub3I6ICVpICgweCUwMngpXG4iLAogCQlhZGFwLT5udW0sIGRuYW1lc1t0eXBlXSwgaWQsIG51bXMybWlub3IoYWRhcC0+bnVtLCB0eXBlLCBpZCksCkBAIC0yODUsNyArMjg1LDcgQEAKIH0KIAogCi1pbnQgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpCitpbnQgZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgbnVtOwogCkBAIC0zMDYsNiArMzA2LDcgQEAKIAlhZGFwLT5udW0gPSBudW07CiAJYWRhcC0+bmFtZSA9IG5hbWU7CiAJYWRhcC0+bW9kdWxlID0gbW9kdWxlOworCWFkYXAtPmRldmljZSA9IGRldmljZTsKIAogCWxpc3RfYWRkX3RhaWwgKCZhZGFwLT5saXN0X2hlYWQsICZkdmJfYWRhcHRlcl9saXN0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiZGV2LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaAppbmRleCA3NGVkNTg1Li5kN2E5NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJkZXYuaApAQCAtNTEsNiArNTEsOCBAQAogCXU4IHByb3Bvc2VkX21hYyBbNl07CiAJdm9pZCogcHJpdjsKIAorCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwogCXN0cnVjdCBtb2R1bGUgKm1vZHVsZTsKIH07CiAKQEAgLTc2LDcgKzc4LDcgQEAKIH07CiAKIAotZXh0ZXJuIGludCBkdmJfcmVnaXN0ZXJfYWRhcHRlciAoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUpOworZXh0ZXJuIGludCBkdmJfcmVnaXN0ZXJfYWRhcHRlciAoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLCBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiBleHRlcm4gaW50IGR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIgKHN0cnVjdCBkdmJfYWRhcHRlciAqYWRhcCk7CiAKIGV4dGVybiBpbnQgZHZiX3JlZ2lzdGVyX2RldmljZSAoc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCmluZGV4IGUzODhmYjEuLjNiYzY3MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKQEAgLTg4LDYgKzg4LDcgQEAKIAlzZWxlY3QgRFZCX0NYMjI3MDIKIAlzZWxlY3QgRFZCX0xHRFQzMzBYCiAJc2VsZWN0IERWQl9NVDM1MgorCXNlbGVjdCBEVkJfWkwxMDM1MwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCB0aGUgQ29uZXhhbnQgVVNCMi4wIGh5YnJpZCByZWZlcmVuY2UgZGVzaWduLgogCSAgQ3VycmVudGx5LCBvbmx5IERWQiBhbmQgQVRTQyBtb2RlcyBhcmUgc3VwcG9ydGVkLCBhbmFsb2cgbW9kZQpAQCAtMTMwLDYgKzEzMSwxNSBAQAogCiAJICBEVkItUyBVU0IyLjAgcmVjZWl2ZXJzLgogCitjb25maWcgRFZCX1VTQl9HUDhQU0sKKwl0cmlzdGF0ZSAiR0VOUElYIDhQU0stPlVTQiBtb2R1bGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9VU0IKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIHN1cHBvcnQgdGhlCisJICAgIEdFTlBJWCA4cHNrIG1vZHVsZQorCisJICBEVkItUyBVU0IyLjAgcmVjZWl2ZXJzLgorCiBjb25maWcgRFZCX1VTQl9OT1ZBX1RfVVNCMgogCXRyaXN0YXRlICJIYXVwcGF1Z2UgV2luVFYtTk9WQS1UIHVzYjIgRFZCLVQgVVNCMi4wIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBEVkJfVVNCCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9NYWtlZmlsZQppbmRleCAyZGM5YWFkLi45NjQzZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvTWFrZWZpbGUKQEAgLTcsNiArNyw5IEBACiBkdmItdXNiLXZwNzAyeC1vYmpzID0gdnA3MDJ4Lm8gdnA3MDJ4LWZlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX1ZQNzAyWCkgKz0gZHZiLXVzYi12cDcwMngubwogCitkdmItdXNiLWdwOHBzay1vYmpzID0gZ3A4cHNrLm8gZ3A4cHNrLWZlLm8KK29iai0kKENPTkZJR19EVkJfVVNCX0dQOFBTSykgKz0gZHZiLXVzYi1ncDhwc2subworCiBkdmItdXNiLWR0dDIwMHUtb2JqcyA9IGR0dDIwMHUubyBkdHQyMDB1LWZlLm8KIG9iai0kKENPTkZJR19EVkJfVVNCX0RUVDIwMFUpICs9IGR2Yi11c2ItZHR0MjAwdS5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvY3h1c2IuYwppbmRleCAxZjBkM2U5Li5hZTIzYmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2N4dXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9jeHVzYi5jCkBAIC0yNyw4ICsyNywxMCBAQAogCiAjaW5jbHVkZSAiY3gyMjcwMi5oIgogI2luY2x1ZGUgImxnZHQzMzB4LmgiCisjaW5jbHVkZSAibGdfaDA2eGYuaCIKICNpbmNsdWRlICJtdDM1Mi5oIgogI2luY2x1ZGUgIm10MzUyX3ByaXYuaCIKKyNpbmNsdWRlICJ6bDEwMzUzLmgiCiAKIC8qIGRlYnVnICovCiBpbnQgZHZiX3VzYl9jeHVzYl9kZWJ1ZzsKQEAgLTMyMiwzMiArMzI0LDM3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGZlLT5kdmItPnByaXY7CisJcmV0dXJuIGxnX2gwNnhmX3BsbF9zZXQoZmUsICZkLT5pMmNfYWRhcCwgZmVwKTsKK30KKwogc3RhdGljIHN0cnVjdCBjeDIyNzAyX2NvbmZpZyBjeHVzYl9jeDIyNzAyX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NjMsCiAKIAkub3V0cHV0X21vZGUgPSBDWDIyNzAyX1BBUkFMTEVMX09VVFBVVCwKLQotCS5wbGxfaW5pdCA9IGR2Yl91c2JfcGxsX2luaXRfaTJjLAotCS5wbGxfc2V0ICA9IGR2Yl91c2JfcGxsX3NldF9pMmMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGxnZHQzMzB4X2NvbmZpZyBjeHVzYl9sZ2R0MzMwM19jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBlLAogCS5kZW1vZF9jaGlwICAgID0gTEdEVDMzMDMsCi0JLnBsbF9zZXQgICAgICAgPSBkdmJfdXNiX3BsbF9zZXRfaTJjLAogfTsKIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgY3h1c2JfZGVlMTYwMV9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5kZW1vZF9pbml0ICAgID0gY3h1c2JfZGVlMTYwMV9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gZHZiX3VzYl9wbGxfc2V0LAogfTsKIAotc3RydWN0IG10MzUyX2NvbmZpZyBjeHVzYl9tdDM1Ml9jb25maWcgPSB7CitzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIGN4dXNiX3psMTAzNTNfZGVlMTYwMV9jb25maWcgPSB7CisJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAorfTsKKworc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgY3h1c2JfbXQzNTJfY29uZmlnID0gewogCS8qIHVzZWQgaW4gYm90aCBsZ3oyMDEgYW5kIHRoNzU3OSAqLwogCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKIAkuZGVtb2RfaW5pdCAgICA9IGN4dXNiX210MzUyX2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSBkdmJfdXNiX3BsbF9zZXQsCiB9OwogCiAvKiBDYWxsYmFja3MgZm9yIERWQiBVU0IgKi8KQEAgLTM1NywxNyArMzY0LDEwIEBACiAJZC0+cGxsX2FkZHIgPSAweDYxOwogCW1lbWNweShkLT5wbGxfaW5pdCwgYnBsbCwgNCk7CiAJZC0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9mbWQxMjE2bWU7Ci0JcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbnQgY3h1c2JfbGdoMDY0Zl90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQotewotCXU4IGJwbGxbNF0gPSB7IDB4MDAsIDB4MDAsIDB4MTgsIDB4NTAgfTsKLQkvKiBicGxsWzJdIDogdW5zZXQgYml0IDMsIHNldCBiaXRzIDQmNQotCSAgIGJwbGxbM10gOiAweDUwIC0gZGlnaXRhbCwgMHgyMCAtIGFuYWxvZyAqLwotCWQtPnBsbF9hZGRyID0gMHg2MTsKLQltZW1jcHkoZC0+cGxsX2luaXQsIGJwbGwsIDQpOwotCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGR2c190dWE2MDM0OworCWQtPmZlLT5vcHMudHVuZXJfb3BzLmluaXQgPSBkdmJfdXNiX3R1bmVyX2luaXRfaTJjOworCWQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkdmJfdXNiX3R1bmVyX3NldF9wYXJhbXNfaTJjOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM3NSw2ICszNzUsNyBAQAogewogCWQtPnBsbF9hZGRyID0gMHg2MTsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzgyLDYgKzM4Myw3IEBACiB7CiAJZC0+cGxsX2FkZHIgPSAweDYxOwogCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfbGdfejIwMTsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzg5LDYgKzM5MSwxMyBAQAogewogCWQtPnBsbF9hZGRyID0gMHg2MDsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeHVzYl9sZ2R0MzMwM190dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBjeHVzYl9sZ2gwNjRmX3R1bmVyX3NldF9wYXJhbXM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzOSw3ICs0NDgsOCBAQAogCiAJY3h1c2JfY3RybF9tc2coZCxDTURfRElHSVRBTCwgTlVMTCwgMCwgTlVMTCwgMCk7CiAKLQlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZjeHVzYl9kZWUxNjAxX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkKKwlpZiAoKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmY3h1c2JfZGVlMTYwMV9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpIHx8CisJICAgICgoZC0+ZmUgPSB6bDEwMzUzX2F0dGFjaCgmY3h1c2JfemwxMDM1M19kZWUxNjAxX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkpCiAJCXJldHVybiAwOwogCiAJcmV0dXJuIC1FSU87CkBAIC01NTUsNyArNTY1LDcgQEAKIAkuc3RyZWFtaW5nX2N0cmwgICA9IGN4dXNiX3N0cmVhbWluZ19jdHJsLAogCS5wb3dlcl9jdHJsICAgICAgID0gY3h1c2JfYmx1ZWJpcmRfcG93ZXJfY3RybCwKIAkuZnJvbnRlbmRfYXR0YWNoICA9IGN4dXNiX2xnZHQzMzAzX2Zyb250ZW5kX2F0dGFjaCwKLQkudHVuZXJfYXR0YWNoICAgICA9IGN4dXNiX2xnaDA2NGZfdHVuZXJfYXR0YWNoLAorCS50dW5lcl9hdHRhY2ggICAgID0gY3h1c2JfbGdkdDMzMDNfdHVuZXJfYXR0YWNoLAogCiAJLmkyY19hbGdvICAgICAgICAgPSAmY3h1c2JfaTJjX2FsZ28sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKaW5kZXggMmQ1MmI3Ni4uYWJkNzViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItY29tbW9uLmMKQEAgLTE3MywxMSArMTczLDEwIEBACiAJc3RydWN0IGRpYjMwMDBfY29uZmlnIGRlbW9kX2NmZzsKIAlzdHJ1Y3QgZGlidXNiX3N0YXRlICpzdCA9IGQtPnByaXY7CiAKLQlkZW1vZF9jZmcucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldF9pMmM7Ci0JZGVtb2RfY2ZnLnBsbF9pbml0ID0gZHZiX3VzYl9wbGxfaW5pdF9pMmM7Ci0KIAlmb3IgKGRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzID0gMHg4OyBkZW1vZF9jZmcuZGVtb2RfYWRkcmVzcyA8IDB4ZDsgZGVtb2RfY2ZnLmRlbW9kX2FkZHJlc3MrKykKIAkJaWYgKChkLT5mZSA9IGRpYjMwMDBtY19hdHRhY2goJmRlbW9kX2NmZywmZC0+aTJjX2FkYXAsJnN0LT5vcHMpKSAhPSBOVUxMKSB7CisJCQlkLT5mZS0+b3BzLnR1bmVyX29wcy5pbml0ID0gZHZiX3VzYl90dW5lcl9pbml0X2kyYzsKKwkJCWQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkdmJfdXNiX3R1bmVyX3NldF9wYXJhbXNfaTJjOwogCQkJZC0+dHVuZXJfcGFzc19jdHJsID0gc3QtPm9wcy50dW5lcl9wYXNzX2N0cmw7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTkwLDYgKzE4OSwxMCBAQAogewogCWQtPnBsbF9hZGRyID0gMHg2MDsKIAlkLT5wbGxfZGVzYyA9ICZkdmJfcGxsX2VudjU3aDF4ZDU7CisKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5pbml0ID0gZHZiX3VzYl90dW5lcl9pbml0X2kyYzsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYzsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChkaWJ1c2JfZGliMzAwMG1jX3R1bmVyX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWJ1c2ItbWIuYwppbmRleCBkZDVhMTMxLi5mNGM0NWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYnVzYi1tYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlidXNiLW1iLmMKQEAgLTIwLDExICsyMCwxMiBAQAogCXN0cnVjdCBkaWJ1c2Jfc3RhdGUgKnN0ID0gZC0+cHJpdjsKIAogCWRlbW9kX2NmZy5kZW1vZF9hZGRyZXNzID0gMHg4OwotCWRlbW9kX2NmZy5wbGxfc2V0ID0gZHZiX3VzYl9wbGxfc2V0X2kyYzsKLQlkZW1vZF9jZmcucGxsX2luaXQgPSBkdmJfdXNiX3BsbF9pbml0X2kyYzsKIAotCWlmICgoZC0+ZmUgPSBkaWIzMDAwbWJfYXR0YWNoKCZkZW1vZF9jZmcsJmQtPmkyY19hZGFwLCZzdC0+b3BzKSkgPT0gTlVMTCkKKwlpZiAoKGQtPmZlID0gZGliMzAwMG1iX2F0dGFjaCgmZGVtb2RfY2ZnLCZkLT5pMmNfYWRhcCwmc3QtPm9wcykpID09IE5VTEwpIHsKKwkJZC0+ZmUtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGR2Yl91c2JfdHVuZXJfaW5pdF9pMmM7CisJCWQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkdmJfdXNiX3R1bmVyX3NldF9wYXJhbXNfaTJjOwogCQlyZXR1cm4gLUVOT0RFVjsKKwl9CiAKIAlkLT50dW5lcl9wYXNzX2N0cmwgPSBzdC0+b3BzLnR1bmVyX3Bhc3NfY3RybDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGlnaXR2LmMKaW5kZXggOTExMzZjMC4uYzE0ZDllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWdpdHYuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpZ2l0di5jCkBAIC0xMTIsMjcgKzExMiwzMCBAQAogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkaWdpdHZfbXQzNTJfY29uZmlnID0gewogCS5kZW1vZF9pbml0ID0gZGlnaXR2X210MzUyX2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgPSBkdmJfdXNiX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IGRpZ2l0dl9ueHQ2MDAwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQorc3RhdGljIGludCBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCkKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OwogCXU4IGJbNV07Ci0JZHZiX3VzYl9wbGxfc2V0KGZlLGZlcCxiKTsKKwlkdmJfdXNiX3R1bmVyX2NhbGNfcmVncyhmZSxmZXAsYiwgNSk7CiAJcmV0dXJuIGRpZ2l0dl9jdHJsX21zZyhkLFVTQl9XUklURV9UVU5FUiwwLCZiWzFdLDQsTlVMTCwwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBueHQ2MDAwX2NvbmZpZyBkaWdpdHZfbnh0NjAwMF9jb25maWcgPSB7CiAJLmNsb2NrX2ludmVyc2lvbiA9IDEsCi0JLnBsbF9zZXQgPSBkaWdpdHZfbnh0NjAwMF9wbGxfc2V0LAogfTsKIAogc3RhdGljIGludCBkaWdpdHZfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKIHsKLQlpZiAoKGQtPmZlID0gbXQzNTJfYXR0YWNoKCZkaWdpdHZfbXQzNTJfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMIHx8Ci0JCShkLT5mZSA9IG54dDYwMDBfYXR0YWNoKCZkaWdpdHZfbnh0NjAwMF9jb25maWcsICZkLT5pMmNfYWRhcCkpICE9IE5VTEwpCisJaWYgKChkLT5mZSA9IG10MzUyX2F0dGFjaCgmZGlnaXR2X210MzUyX2NvbmZpZywgJmQtPmkyY19hZGFwKSkgIT0gTlVMTCkgeworCQlkLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKIAkJcmV0dXJuIDA7CisJfQorCWlmICgoZC0+ZmUgPSBueHQ2MDAwX2F0dGFjaCgmZGlnaXR2X254dDYwMDBfY29uZmlnLCAmZC0+aTJjX2FkYXApKSAhPSBOVUxMKSB7CisJCWQtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkaWdpdHZfbnh0NjAwMF90dW5lcl9zZXRfcGFyYW1zOworCQlyZXR1cm4gMDsKKwl9CiAJcmV0dXJuIC1FSU87CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHR0MjAwdS1mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKaW5kZXggY2QyMWRkYi4uMTc0MTNhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdHQyMDB1LWZlLmMKQEAgLTE4LDcgKzE4LDYgQEAKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBmZXA7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiB9OwogCiBzdGF0aWMgaW50IGR0dDIwMHVfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0KQpAQCAtMTYzLDE2ICsxNjIsMTMgQEAKIAlkZWJfaW5mbygiYXR0YWNoaW5nIGZyb250ZW5kIGR0dDIwMHVcbiIpOwogCiAJc3RhdGUtPmQgPSBkOwotCW1lbWNweSgmc3RhdGUtPm9wcywmZHR0MjAwdV9mZV9vcHMsc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCZkdHQyMDB1X2ZlX29wcyxzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCi0JZ290byBzdWNjZXNzOworCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogZXJyb3I6CiAJcmV0dXJuIE5VTEw7Ci1zdWNjZXNzOgotCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogfQogCiBzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHR0MjAwdV9mZV9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItZHZiLmMKaW5kZXggNmZhOTIxMC4uZWM2MzE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1kdmIuYwpAQCAtODIsNyArODIsNyBAQAogCWludCByZXQ7CiAKIAlpZiAoKHJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkLT5kdmJfYWRhcCwgZC0+ZGVzYy0+bmFtZSwKLQkJCWQtPm93bmVyKSkgPCAwKSB7CisJCQlkLT5vd25lciwgJmQtPnVkZXYtPmRldikpIDwgMCkgewogCQlkZWJfaW5mbygiZHZiX3JlZ2lzdGVyX2FkYXB0ZXIgZmFpbGVkOiBlcnJvciAlZCIsIHJldCk7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTEyMSwxNiArMTIxLDE1IEBACiAKIAlkdmJfbmV0X2luaXQoJmQtPmR2Yl9hZGFwLCAmZC0+ZHZiX25ldCwgJmQtPmRlbXV4LmRteCk7CiAKLQlnb3RvIHN1Y2Nlc3M7CisJZC0+c3RhdGUgfD0gRFZCX1VTQl9TVEFURV9EVkI7CisJcmV0dXJuIDA7CisKIGVycl9kbXhfZGV2OgogCWR2Yl9kbXhfcmVsZWFzZSgmZC0+ZGVtdXgpOwogZXJyX2RteDoKIAlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKCZkLT5kdmJfYWRhcCk7CiBlcnI6CiAJcmV0dXJuIHJldDsKLXN1Y2Nlc3M6Ci0JZC0+c3RhdGUgfD0gRFZCX1VTQl9TVEFURV9EVkI7Ci0JcmV0dXJuIDA7CiB9CiAKIGludCBkdmJfdXNiX2R2Yl9leGl0KHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKQEAgLTE4NCwxMyArMTgzLDEzIEBACiAKIAkvKiByZS1hc3NpZ24gc2xlZXAgYW5kIHdha2V1cCBmdW5jdGlvbnMgKi8KIAlpZiAoZC0+ZmUgIT0gTlVMTCkgewotCQlkLT5mZV9pbml0ID0gZC0+ZmUtPm9wcy0+aW5pdDsgICBkLT5mZS0+b3BzLT5pbml0ICA9IGR2Yl91c2JfZmVfd2FrZXVwOwotCQlkLT5mZV9zbGVlcCA9IGQtPmZlLT5vcHMtPnNsZWVwOyBkLT5mZS0+b3BzLT5zbGVlcCA9IGR2Yl91c2JfZmVfc2xlZXA7CisJCWQtPmZlX2luaXQgPSBkLT5mZS0+b3BzLmluaXQ7ICAgZC0+ZmUtPm9wcy5pbml0ICA9IGR2Yl91c2JfZmVfd2FrZXVwOworCQlkLT5mZV9zbGVlcCA9IGQtPmZlLT5vcHMuc2xlZXA7IGQtPmZlLT5vcHMuc2xlZXAgPSBkdmJfdXNiX2ZlX3NsZWVwOwogCiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmQtPmR2Yl9hZGFwLCBkLT5mZSkpIHsKIAkJCWVycigiRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZC4iKTsKLQkJCWlmIChkLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWQtPmZlLT5vcHMtPnJlbGVhc2UoZC0+ZmUpOworCQkJaWYgKGQtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQlkLT5mZS0+b3BzLnJlbGVhc2UoZC0+ZmUpOwogCQkJZC0+ZmUgPSBOVUxMOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pMmMuYwppbmRleCA5YjI1NDUzLi42YjYxMWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWkyYy5jCkBAIC00Niw3ICs0Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkdmJfdXNiX3BsbF9pbml0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK2ludCBkdmJfdXNiX3R1bmVyX2luaXRfaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IGZlLT5kdmItPnByaXY7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IGQtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZC0+cGxsX2luaXQsIC5sZW4gPSA0IH07CkBAIC02Myw2ICs2Myw4IEBACiAJZGViX3BsbCgicGxsLWJ1ZjogJXggJXggJXggJXhcbiIsZC0+cGxsX2luaXRbMF0sZC0+cGxsX2luaXRbMV0sCiAJCQlkLT5wbGxfaW5pdFsyXSxkLT5wbGxfaW5pdFszXSk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZkLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgewogCQllcnIoInR1bmVyIGkyYyB3cml0ZSBmYWlsZWQgZm9yIHBsbF9pbml0LiIpOwogCQlyZXQgPSAtRVJFTU9URUlPOwpAQCAtNzMsMzggKzc1LDQyIEBACiAJCWQtPnR1bmVyX3Bhc3NfY3RybChmZSwwLGQtPnBsbF9hZGRyKTsKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChkdmJfdXNiX3BsbF9pbml0X2kyYyk7CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfdHVuZXJfaW5pdF9pMmMpOwogCi1pbnQgZHZiX3VzYl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKmZlcCwgdTggYls1XSkKK2ludCBkdmJfdXNiX3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXAsIHU4ICpiLCBpbnQgYnVmX2xlbikKIHsKIAlzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQgPSBmZS0+ZHZiLT5wcml2OwogCisJaWYgKGJ1Zl9sZW4gIT0gNSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKGQtPnBsbF9kZXNjID09IE5VTEwpCiAJCXJldHVybiAwOwogCiAJZGViX3BsbCgicGxsIGFkZHI6ICV4LCBmcmVxOiAlZCAlcFxuIixkLT5wbGxfYWRkcixmZXAtPmZyZXF1ZW5jeSxkLT5wbGxfZGVzYyk7CiAKLQliWzBdID0gZC0+cGxsX2FkZHIgPDwgMTsKKwliWzBdID0gZC0+cGxsX2FkZHI7CiAJZHZiX3BsbF9jb25maWd1cmUoZC0+cGxsX2Rlc2MsJmJbMV0sZmVwLT5mcmVxdWVuY3ksZmVwLT51Lm9mZG0uYmFuZHdpZHRoKTsKIAogCWRlYl9wbGwoInBsbC1idWY6ICV4ICV4ICV4ICV4ICV4XG4iLGJbMF0sYlsxXSxiWzJdLGJbM10sYls0XSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KLUVYUE9SVF9TWU1CT0woZHZiX3VzYl9wbGxfc2V0KTsKK0VYUE9SVF9TWU1CT0woZHZiX3VzYl90dW5lcl9jYWxjX3JlZ3MpOwogCi1pbnQgZHZiX3VzYl9wbGxfc2V0X2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCitpbnQgZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpmZXApCiB7CiAJc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkID0gZmUtPmR2Yi0+cHJpdjsKIAlpbnQgcmV0ID0gMDsKIAl1OCBiWzVdOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSBkLT5wbGxfYWRkciwgLmZsYWdzID0gMCwgLmJ1ZiA9ICZiWzFdLCAubGVuID0gNCB9OwogCi0JZHZiX3VzYl9wbGxfc2V0KGZlLGZlcCxiKTsKKwlkdmJfdXNiX3R1bmVyX2NhbGNfcmVncyhmZSxmZXAsYiw1KTsKIAogCWlmIChkLT50dW5lcl9wYXNzX2N0cmwpCiAJCWQtPnR1bmVyX3Bhc3NfY3RybChmZSwxLGQtPnBsbF9hZGRyKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CiAJCWVycigidHVuZXIgaTJjIHdyaXRlIGZhaWxlZCBmb3IgcGxsX3NldC4iKTsKIAkJcmV0ID0gLUVSRU1PVEVJTzsKQEAgLTExNiw0ICsxMjIsNCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woZHZiX3VzYl9wbGxfc2V0X2kyYyk7CitFWFBPUlRfU1lNQk9MKGR2Yl91c2JfdHVuZXJfc2V0X3BhcmFtc19pMmMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCmluZGV4IGNiMjM5MDQuLjk1Njk4OTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNkZWZpbmUgVVNCX1ZJRF9WSVNJT05QTFVTCQkJCQkweDEzZDMKICNkZWZpbmUgVVNCX1ZJRF9UV0lOSEFOCQkJCQkJMHgxODIyCiAjZGVmaW5lIFVTQl9WSURfVUxUSU1BX0VMRUNUUk9OSUMJCQkweDA1ZDgKKyNkZWZpbmUgVVNCX1ZJRF9HRU5QSVgJCQkJCTB4MDljMAogCiAvKiBQcm9kdWN0IElEcyAqLwogI2RlZmluZSBVU0JfUElEX0FEU1RFQ0hfVVNCMl9DT0xECQkJMHhhMzMzCkBAIC0xMDQsNSArMTA1LDYgQEAKICNkZWZpbmUgVVNCX1BJRF9LWUVfRFZCX1RfV0FSTQkJCQkweDcwMWYKICNkZWZpbmUgVVNCX1BJRF9QQ1RWXzIwMEUJCQkJCTB4MDIwZQogI2RlZmluZSBVU0JfUElEX1BDVFZfNDAwRQkJCQkJMHgwMjBmCi0KKyNkZWZpbmUgVVNCX1BJRF9HRU5QSVhfOFBTS19DT0xECQkJCTB4MDIwMAorI2RlZmluZSBVU0JfUElEX0dFTlBJWF84UFNLX1dBUk0JCQkJMHgwMjAxCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKaW5kZXggZmVhZDk1OC4uNGNmOWY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLmgKQEAgLTMzMCw5ICszMzAsOSBAQAogZXh0ZXJuIGludCBkdmJfdXNiX25lY19yY19rZXlfdG9fZXZlbnQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICosIHU4W10sIHUzMiAqLCBpbnQgKik7CiAKIC8qIGNvbW1vbmx5IHVzZWQgcGxsIGluaXQgYW5kIHNldCBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgZHZiX3VzYl9wbGxfaW5pdF9pMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqKTsKLWV4dGVybiBpbnQgZHZiX3VzYl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICosIHU4W10pOwotZXh0ZXJuIGludCBkdmJfdXNiX3BsbF9zZXRfaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICopOworZXh0ZXJuIGludCBkdmJfdXNiX3R1bmVyX2luaXRfaTJjKHN0cnVjdCBkdmJfZnJvbnRlbmQgKik7CitleHRlcm4gaW50IGR2Yl91c2JfdHVuZXJfY2FsY19yZWdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICosIHU4ICpidWYsIGludCBidWZfbGVuKTsKK2V4dGVybiBpbnQgZHZiX3VzYl90dW5lcl9zZXRfcGFyYW1zX2kyYyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqKTsKIAogLyogY29tbW9ubHkgdXNlZCBmaXJtd2FyZSBkb3dubG9hZCB0eXBlcyBhbmQgZnVuY3Rpb24gKi8KIHN0cnVjdCBoZXhsaW5lIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjY2JkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay1mZS5jCkBAIC0wLDAgKzEsMjcyIEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZQorICogIC0gR0VOUElYIDhwa3MvcXBzayBVU0IyLjAgRFZCLVMgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsYW4gTmlzb3RhIChhbGFubmlzb3RhQGdtYWlsLmNvbSkKKyAqCisgKiBUaGFua3MgdG8gR0VOUElYIGZvciB0aGUgc2FtcGxlIGNvZGUgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBtb2R1bGUuCisgKgorICogVGhpcyBtb2R1bGUgaXMgYmFzZWQgb2ZmIHRoZSB2cDcwNDUgYW5kIHZwNzAyeCBtb2R1bGVzCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJncDhwc2suaCIKKworc3RydWN0IGdwOHBza19mZV9zdGF0ZSB7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBmZTsKKworCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKKworCXUxNiBzbnI7CisKKwl1bnNpZ25lZCBsb25nIG5leHRfc25yX2NoZWNrOworfTsKKworc3RhdGljIGludCBncDhwc2tfZmVfcmVhZF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3N0YXR1c190ICpzdGF0dXMpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBsb2NrOworCisJaWYgKGdwOHBza191c2JfaW5fb3Aoc3QtPmQsIEdFVF9TSUdOQUxfTE9DSywgMCwgMCwgJmxvY2ssMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxvY2spCisJCSpzdGF0dXMgPSBGRV9IQVNfTE9DSyB8IEZFX0hBU19TWU5DIHwgRkVfSEFTX1ZJVEVSQkkgfCBGRV9IQVNfU0lHTkFMIHwgRkVfSEFTX0NBUlJJRVI7CisJZWxzZQorCQkqc3RhdHVzID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgRnJvbnRlbmQgKi8KK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3JlYWRfYmVyKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKmJlcikKK3sKKwkodm9pZCkgZmU7CisJKmJlciA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBGcm9udGVuZCAqLworc3RhdGljIGludCBncDhwc2tfZmVfcmVhZF91bmNfYmxvY2tzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgKnVuYykKK3sKKwkodm9pZCkgZmU7CisJKnVuYyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlsyXTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsc3QtPm5leHRfc25yX2NoZWNrKSkgeworCQlncDhwc2tfdXNiX2luX29wKHN0LT5kLEdFVF9TSUdOQUxfU1RSRU5HVEgsMCwwLGJ1ZiwyKTsKKwkJKnNuciA9IChpbnQpKGJ1ZlsxXSkgPDwgOCB8IGJ1ZlswXTsKKwkJLyogc25yIGlzIHJlcG9ydGVkIGluIGRCdSoyNTYgKi8KKwkJLyogc25yIC8gMzguNCB+PSAxMDAlIHN0cmVuZ3RoICovCisJCS8qIHNuciAqIDE3IHJldHVybnMgMTAwJSBzdHJlbmd0aCBhcyA2NTUzNSAqLworCQlpZiAoKnNuciA8PSAzODU1KQorCQkJKnNuciA9ICgqc25yPDw0KSArICpzbnI7IC8vIHNuciAqIDE3CisJCWVsc2UKKwkJCSpzbnIgPSA2NTUzNTsKKwkJc3QtPm5leHRfc25yX2NoZWNrID0gamlmZmllcyArICgxMCpIWikvMTAwMDsKKwl9IGVsc2UgeworCQkqc25yID0gc3QtPnNucjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3JlYWRfc2lnbmFsX3N0cmVuZ3RoKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MTYgKnN0cmVuZ3RoKQoreworCXJldHVybiBncDhwc2tfZmVfcmVhZF9zbnIoZmUsIHN0cmVuZ3RoKTsKK30KKworc3RhdGljIGludCBncDhwc2tfZmVfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyAqdHVuZSkKK3sKKwl0dW5lLT5taW5fZGVsYXlfbXMgPSA4MDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXN0cnVjdCBncDhwc2tfZmVfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTggY21kWzEwXTsKKwl1MzIgZnJlcSA9IGZlcC0+ZnJlcXVlbmN5ICogMTAwMDsKKworCWNtZFs0XSA9IGZyZXEgICAgICAgICAmIDB4ZmY7CisJY21kWzVdID0gKGZyZXEgPj4gOCkgICYgMHhmZjsKKwljbWRbNl0gPSAoZnJlcSA+PiAxNikgJiAweGZmOworCWNtZFs3XSA9IChmcmVxID4+IDI0KSAmIDB4ZmY7CisKKwlzd2l0Y2goZmUtPm9wcy5pbmZvLnR5cGUpIHsKKwljYXNlIEZFX1FQU0s6CisJCWNtZFswXSA9ICBmZXAtPnUucXBzay5zeW1ib2xfcmF0ZSAgICAgICAgJiAweGZmOworCQljbWRbMV0gPSAoZmVwLT51LnFwc2suc3ltYm9sX3JhdGUgPj4gIDgpICYgMHhmZjsKKwkJY21kWzJdID0gKGZlcC0+dS5xcHNrLnN5bWJvbF9yYXRlID4+IDE2KSAmIDB4ZmY7CisJCWNtZFszXSA9IChmZXAtPnUucXBzay5zeW1ib2xfcmF0ZSA+PiAyNCkgJiAweGZmOworCQljbWRbOF0gPSBBRFZfTU9EX0RWQl9RUFNLOworCQljbWRbOV0gPSAweDAzOyAvKkFEVl9NT0RfRkVDX1hYWCovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8vIG90aGVyIG1vZGVzIGFyZSB1bnN1cG9ydGVkIHJpZ2h0IG5vdworCQljbWRbMF0gPSAwOworCQljbWRbMV0gPSAwOworCQljbWRbMl0gPSAwOworCQljbWRbM10gPSAwOworCQljbWRbOF0gPSAwOworCQljbWRbOV0gPSAwOworCQlicmVhazsKKwl9CisKKwlncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCxUVU5FXzhQU0ssMCwwLGNtZCwxMCk7CisKKwlzdGF0ZS0+bmV4dF9zbnJfY2hlY2sgPSBqaWZmaWVzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKKwkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqZmVwKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NlbmRfZGlzZXFjX21zZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgIHN0cnVjdCBkdmJfZGlzZXFjX21hc3Rlcl9jbWQgKm0pCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSAqc3QgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChzdC0+ZCxTRU5EX0RJU0VRQ19DT01NQU5ELCBtLT5tc2dbMF0sIDAsCisJCQltLT5tc2csIG0tPm1zZ19sZW4pKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncDhwc2tfZmVfc2VuZF9kaXNlcWNfYnVyc3QgKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAorCQkJCSAgICBmZV9zZWNfbWluaV9jbWRfdCBidXJzdCkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdCA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGNtZDsKKworCWRlYl9mZSgiJXNcbiIsX19GVU5DVElPTl9fKTsKKworCS8qIFRoZXNlIGNvbW1hbmRzIGFyZSBjZXJ0YWlubHkgd3JvbmcgKi8KKwljbWQgPSAoYnVyc3QgPT0gU0VDX01JTklfQSkgPyAweDAwIDogMHgwMTsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChzdC0+ZCxTRU5EX0RJU0VRQ19DT01NQU5ELCBjbWQsIDAsCisJCQkmY21kLCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NldF90b25lIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX3RvbmVfbW9kZV90IHRvbmUpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChncDhwc2tfdXNiX291dF9vcChzdGF0ZS0+ZCxTRVRfMjJLSFpfVE9ORSwKKwkJICh0b25lID09IFNFQ19UT05FX09OKSwgMCwgTlVMTCwgMCkpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdwOHBza19mZV9zZXRfdm9sdGFnZSAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGdwOHBza191c2Jfb3V0X29wKHN0YXRlLT5kLFNFVF9MTkJfVk9MVEFHRSwKKwkJCSB2b2x0YWdlID09IFNFQ19WT0xUQUdFXzE4LCAwLCBOVUxMLCAwKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX2ZlX3NlbmRfbGVnYWN5X2Rpc2hfY21kIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgdW5zaWduZWQgbG9uZyBzd19jbWQpCit7CisJc3RydWN0IGdwOHBza19mZV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1OCBjbWQgPSBzd19jbWQgJiAweDdmOworCisJaWYgKGdwOHBza191c2Jfb3V0X29wKHN0YXRlLT5kLFNFVF9ETl9TV0lUQ0gsIGNtZCwgMCwKKwkJCU5VTEwsIDApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZ3A4cHNrX3VzYl9vdXRfb3Aoc3RhdGUtPmQsU0VUX0xOQl9WT0xUQUdFLCAhIShzd19jbWQgJiAweDgwKSwKKwkJCTAsIE5VTEwsIDApKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBncDhwc2tfZmVfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCWtmcmVlKHN0YXRlKTsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGdwOHBza19mZV9vcHM7CisKK3N0cnVjdCBkdmJfZnJvbnRlbmQgKiBncDhwc2tfZmVfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlzdHJ1Y3QgZ3A4cHNrX2ZlX3N0YXRlICpzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGdwOHBza19mZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwlzLT5kID0gZDsKKwltZW1jcHkoJnMtPmZlLm9wcywgJmdwOHBza19mZV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCXMtPmZlLmRlbW9kdWxhdG9yX3ByaXYgPSBzOworCisJZ290byBzdWNjZXNzOworZXJyb3I6CisJcmV0dXJuIE5VTEw7CitzdWNjZXNzOgorCXJldHVybiAmcy0+ZmU7Cit9CisKKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGdwOHBza19mZV9vcHMgPSB7CisJLmluZm8gPSB7CisJCS5uYW1lCQkJPSAiR2VucGl4IDhwc2stVVNCIERWQi1TIiwKKwkJLnR5cGUJCQk9IEZFX1FQU0ssCisJCS5mcmVxdWVuY3lfbWluCQk9IDk1MDAwMCwKKwkJLmZyZXF1ZW5jeV9tYXgJCT0gMjE1MDAwMCwKKwkJLmZyZXF1ZW5jeV9zdGVwc2l6ZQk9IDEwMCwKKwkJLnN5bWJvbF9yYXRlX21pbiAgICAgICAgPSAxMDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfbWF4ICAgICAgICA9IDQ1MDAwMDAwLAorCQkuc3ltYm9sX3JhdGVfdG9sZXJhbmNlICA9IDUwMCwgIC8qIHBwbSAqLworCQkuY2FwcyA9IEZFX0NBTl9JTlZFUlNJT05fQVVUTyB8CisJCQkJRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8IEZFX0NBTl9GRUNfM180IHwKKwkJCQlGRV9DQU5fRkVDXzVfNiB8IEZFX0NBTl9GRUNfN184IHwgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJCQlGRV9DQU5fUVBTSworCX0sCisKKwkucmVsZWFzZSA9IGdwOHBza19mZV9yZWxlYXNlLAorCisJLmluaXQgPSBOVUxMLAorCS5zbGVlcCA9IE5VTEwsCisKKwkuc2V0X2Zyb250ZW5kID0gZ3A4cHNrX2ZlX3NldF9mcm9udGVuZCwKKwkuZ2V0X2Zyb250ZW5kID0gZ3A4cHNrX2ZlX2dldF9mcm9udGVuZCwKKwkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBncDhwc2tfZmVfZ2V0X3R1bmVfc2V0dGluZ3MsCisKKwkucmVhZF9zdGF0dXMgPSBncDhwc2tfZmVfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gZ3A4cHNrX2ZlX3JlYWRfYmVyLAorCS5yZWFkX3NpZ25hbF9zdHJlbmd0aCA9IGdwOHBza19mZV9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKKwkucmVhZF9zbnIgPSBncDhwc2tfZmVfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBncDhwc2tfZmVfcmVhZF91bmNfYmxvY2tzLAorCisJLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBncDhwc2tfZmVfc2VuZF9kaXNlcWNfbXNnLAorCS5kaXNlcWNfc2VuZF9idXJzdCA9IGdwOHBza19mZV9zZW5kX2Rpc2VxY19idXJzdCwKKwkuc2V0X3RvbmUgPSBncDhwc2tfZmVfc2V0X3RvbmUsCisJLnNldF92b2x0YWdlID0gZ3A4cHNrX2ZlX3NldF92b2x0YWdlLAorCS5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kID0gZ3A4cHNrX2ZlX3NlbmRfbGVnYWN5X2Rpc2hfY21kLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOThmM2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5jCkBAIC0wLDAgKzEsMjU2IEBACisvKiBEVkIgVVNCIGNvbXBsaWFudCBMaW51eCBkcml2ZXIgZm9yIHRoZQorICogIC0gR0VOUElYIDhwa3MvcXBzayBVU0IyLjAgRFZCLVMgbW9kdWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsYW4gTmlzb3RhIChhbGFubmlzb3RhQGdtYWlsLmNvbSkKKyAqCisgKiBUaGFua3MgdG8gR0VOUElYIGZvciB0aGUgc2FtcGxlIGNvZGUgdXNlZCB0byBpbXBsZW1lbnQgdGhpcyBtb2R1bGUuCisgKgorICogVGhpcyBtb2R1bGUgaXMgYmFzZWQgb2ZmIHRoZSB2cDcwNDUgYW5kIHZwNzAyeCBtb2R1bGVzCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqCXVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKglTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogc2VlIERvY3VtZW50YXRpb24vZHZiL1JFQURNRS5kdmItdXNiIGZvciBtb3JlIGluZm9ybWF0aW9uCisgKi8KKyNpbmNsdWRlICJncDhwc2suaCIKKworLyogZGVidWcgKi8KK3N0YXRpYyBjaGFyIGJjbTQ1MDBfZmlybXdhcmVbXSA9ICJkdmItdXNiLWdwOHBzay0wMi5mdyI7CitpbnQgZHZiX3VzYl9ncDhwc2tfZGVidWc7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWcsZHZiX3VzYl9ncDhwc2tfZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAic2V0IGRlYnVnZ2luZyBsZXZlbCAoMT1pbmZvLHhmZXI9MixyYz00IChvci1hYmxlKSkuIiBEVkJfVVNCX0RFQlVHX1NUQVRVUyk7CisKK2ludCBncDhwc2tfdXNiX2luX29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKQoreworCWludCByZXQgPSAwLHRyeSA9IDA7CisKKwlpZiAoKHJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSkpCisJCXJldHVybiByZXQ7CisKKwl3aGlsZSAocmV0ID49IDAgJiYgcmV0ICE9IGJsZW4gJiYgdHJ5IDwgMykgeworCQlyZXQgPSB1c2JfY29udHJvbF9tc2coZC0+dWRldiwKKwkJCXVzYl9yY3ZjdHJscGlwZShkLT51ZGV2LDApLAorCQkJcmVxLAorCQkJVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiwKKwkJCXZhbHVlLGluZGV4LGIsYmxlbiwKKwkJCTIwMDApOworCQlkZWJfaW5mbygicmVhZGluZyBudW1iZXIgJWQgKHJldDogJWQpXG4iLHRyeSxyZXQpOworCQl0cnkrKzsKKwl9CisKKwlpZiAocmV0IDwgMCB8fCByZXQgIT0gYmxlbikgeworCQl3YXJuKCJ1c2IgaW4gb3BlcmF0aW9uIGZhaWxlZC4iKTsKKwkJcmV0ID0gLUVJTzsKKwl9IGVsc2UKKwkJcmV0ID0gMDsKKworCWRlYl94ZmVyKCJpbjogcmVxLiAleCwgdmFsOiAleCwgaW5kOiAleCwgYnVmZmVyOiAiLHJlcSx2YWx1ZSxpbmRleCk7CisJZGVidWdfZHVtcChiLGJsZW4sZGViX3hmZXIpOworCisJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGdwOHBza191c2Jfb3V0X29wKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCwgdTggcmVxLCB1MTYgdmFsdWUsCisJCQkgICAgIHUxNiBpbmRleCwgdTggKmIsIGludCBibGVuKQoreworCWludCByZXQ7CisKKwlkZWJfeGZlcigib3V0OiByZXEuICV4LCB2YWw6ICV4LCBpbmQ6ICV4LCBidWZmZXI6ICIscmVxLHZhbHVlLGluZGV4KTsKKwlkZWJ1Z19kdW1wKGIsYmxlbixkZWJfeGZlcik7CisKKwlpZiAoKHJldCA9IG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmZC0+dXNiX211dGV4KSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAodXNiX2NvbnRyb2xfbXNnKGQtPnVkZXYsCisJCQl1c2Jfc25kY3RybHBpcGUoZC0+dWRldiwwKSwKKwkJCXJlcSwKKwkJCVVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VULAorCQkJdmFsdWUsaW5kZXgsYixibGVuLAorCQkJMjAwMCkgIT0gYmxlbikgeworCQl3YXJuKCJ1c2Igb3V0IG9wZXJhdGlvbiBmYWlsZWQuIik7CisJCXJldCA9IC1FSU87CisJfSBlbHNlCisJCXJldCA9IDA7CisJbXV0ZXhfdW5sb2NrKCZkLT51c2JfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBncDhwc2tfbG9hZF9iY200NTAwZncoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQoreworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyA9IE5VTEw7CisJdTggKnB0ciwgKmJ1ZjsKKwlpZiAoKHJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBiY200NTAwX2Zpcm13YXJlLAorCQkJCQkmZC0+dWRldi0+ZGV2KSkgIT0gMCkgeworCQllcnIoImRpZCBub3QgZmluZCB0aGUgYmNtNDUwMCBmaXJtd2FyZSBmaWxlLiAoJXMpICIKKwkJCSJQbGVhc2Ugc2VlIGxpbnV4L0RvY3VtZW50YXRpb24vZHZiLyBmb3IgbW9yZSBkZXRhaWxzIG9uIGZpcm13YXJlLXByb2JsZW1zLiAoJWQpIiwKKwkJCWJjbTQ1MDBfZmlybXdhcmUscmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSAtRUlOVkFMOworCisJaWYgKGdwOHBza191c2Jfb3V0X29wKGQsIExPQURfQkNNNDUwMCwxLDAsTlVMTCwgMCkpCisJCWdvdG8gb3V0X3JlbF9mdzsKKworCWluZm8oImRvd25sb2FpZG5nIGJjbTQ1MDAgZmlybXdhcmUgZnJvbSBmaWxlICclcyciLGJjbTQ1MDBfZmlybXdhcmUpOworCisJcHRyID0gZnctPmRhdGE7CisJYnVmID0ga21hbGxvYyg1MTIsIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKworCXdoaWxlIChwdHJbMF0gIT0gMHhmZikgeworCQl1MTYgYnVmbGVuID0gcHRyWzBdICsgNDsKKwkJaWYgKHB0ciArIGJ1ZmxlbiA+PSBmdy0+ZGF0YSArIGZ3LT5zaXplKSB7CisJCQllcnIoImZhaWxlZCB0byBsb2FkIGJjbTQ1MDAgZmlybXdhcmUuIik7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCW1lbWNweShidWYsIHB0ciwgYnVmbGVuKTsKKwkJaWYgKGR2Yl91c2JfZ2VuZXJpY193cml0ZShkLCBidWYsIGJ1ZmxlbikpIHsKKwkJCWVycigiZmFpbGVkIHRvIGxvYWQgYmNtNDUwMCBmaXJtd2FyZS4iKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJcHRyICs9IGJ1ZmxlbjsKKwl9CisKKwlyZXQgPSAwOworCitvdXRfZnJlZToKKwlrZnJlZShidWYpOworb3V0X3JlbF9mdzoKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ3A4cHNrX3Bvd2VyX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJdTggc3RhdHVzLCBidWY7CisJaWYgKG9ub2ZmKSB7CisJCWdwOHBza191c2JfaW5fb3AoZCwgR0VUXzhQU0tfQ09ORklHLDAsMCwmc3RhdHVzLDEpOworCQlpZiAoISAoc3RhdHVzICYgMHgwMSkpICAvKiBzdGFydGVkICovCisJCQlpZiAoZ3A4cHNrX3VzYl9pbl9vcChkLCBCT09UXzhQU0ssIDEsIDAsICZidWYsIDEpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghIChzdGF0dXMgJiAweDAyKSkgLyogQkNNNDUwMCBmaXJtd2FyZSBsb2FkZWQgKi8KKwkJCWlmKGdwOHBza19sb2FkX2JjbTQ1MDBmdyhkKSkKKwkJCQlyZXR1cm4gRUlOVkFMOworCisJCWlmICghIChzdGF0dXMgJiAweDA0KSkgLyogTE5CIFBvd2VyICovCisJCQlpZiAoZ3A4cHNrX3VzYl9pbl9vcChkLCBTVEFSVF9JTlRFUlNJTCwgMSwgMCwKKwkJCQkJJmJ1ZiwgMSkpCisJCQkJcmV0dXJuIEVJTlZBTDsKKworCQkvKiBTZXQgRFZCIG1vZGUgKi8KKwkJaWYoZ3A4cHNrX3VzYl9vdXRfb3AoZCwgU0VUX0RWQl9NT0RFLCAxLCAwLCBOVUxMLCAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlncDhwc2tfdXNiX2luX29wKGQsIEdFVF84UFNLX0NPTkZJRywwLDAsJnN0YXR1cywxKTsKKwl9IGVsc2UgeworCQkvKiBUdXJuIG9mZiBMTkIgcG93ZXIgKi8KKwkJaWYgKGdwOHBza191c2JfaW5fb3AoZCwgU1RBUlRfSU5URVJTSUwsIDAsIDAsICZidWYsIDEpKQorCQkJcmV0dXJuIEVJTlZBTDsKKwkJLyogVHVybiBvZmYgOHBzayBwb3dlciAqLworCQlpZiAoZ3A4cHNrX3VzYl9pbl9vcChkLCBCT09UXzhQU0ssIDAsIDAsICZidWYsIDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBncDhwc2tfc3RyZWFtaW5nX2N0cmwoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCBpbnQgb25vZmYpCit7CisJcmV0dXJuIGdwOHBza191c2Jfb3V0X29wKGQsIEFSTV9UUkFOU0ZFUiwgb25vZmYsIDAgLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBncDhwc2tfZnJvbnRlbmRfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCkKK3sKKwlkLT5mZSA9IGdwOHBza19mZV9hdHRhY2goZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfdXNiX3Byb3BlcnRpZXMgZ3A4cHNrX3Byb3BlcnRpZXM7CisKK3N0YXRpYyBpbnQgZ3A4cHNrX3VzYl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXJldHVybiBkdmJfdXNiX2RldmljZV9pbml0KGludGYsJmdwOHBza19wcm9wZXJ0aWVzLFRISVNfTU9EVUxFLE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgZ3A4cHNrX3VzYl90YWJsZSBbXSA9IHsKKwkgICAgeyBVU0JfREVWSUNFKFVTQl9WSURfR0VOUElYLCBVU0JfUElEX0dFTlBJWF84UFNLX0NPTEQpIH0sCisJICAgIHsgVVNCX0RFVklDRShVU0JfVklEX0dFTlBJWCwgVVNCX1BJRF9HRU5QSVhfOFBTS19XQVJNKSB9LAorCSAgICB7IDAgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZ3A4cHNrX3VzYl90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3VzYl9wcm9wZXJ0aWVzIGdwOHBza19wcm9wZXJ0aWVzID0geworCS5jYXBzID0gMCwKKworCS51c2JfY3RybCA9IENZUFJFU1NfRlgyLAorCS5maXJtd2FyZSA9ICJkdmItdXNiLWdwOHBzay0wMS5mdyIsCisKKwkuc3RyZWFtaW5nX2N0cmwgICA9IGdwOHBza19zdHJlYW1pbmdfY3RybCwKKwkucG93ZXJfY3RybCAgICAgICA9IGdwOHBza19wb3dlcl9jdHJsLAorCS5mcm9udGVuZF9hdHRhY2ggID0gZ3A4cHNrX2Zyb250ZW5kX2F0dGFjaCwKKworCS5nZW5lcmljX2J1bGtfY3RybF9lbmRwb2ludCA9IDB4MDEsCisJLyogcGFyYW1ldGVyIGZvciB0aGUgTVBFRzItZGF0YSB0cmFuc2ZlciAqLworCS51cmIgPSB7CisJCS50eXBlID0gRFZCX1VTQl9CVUxLLAorCQkuY291bnQgPSA3LAorCQkuZW5kcG9pbnQgPSAweDgyLAorCQkudSA9IHsKKwkJCS5idWxrID0geworCQkJCS5idWZmZXJzaXplID0gODE5MiwKKwkJCX0KKwkJfQorCX0sCisKKwkubnVtX2RldmljZV9kZXNjcyA9IDEsCisJLmRldmljZXMgPSB7CisJCXsgLm5hbWUgPSAiR2VucGl4IDhQU0stVVNCIERWQi1TIFVTQjIuMCByZWNlaXZlciIsCisJCSAgLmNvbGRfaWRzID0geyAmZ3A4cHNrX3VzYl90YWJsZVswXSwgTlVMTCB9LAorCQkgIC53YXJtX2lkcyA9IHsgJmdwOHBza191c2JfdGFibGVbMV0sIE5VTEwgfSwKKwkJfSwKKwkJeyAwIH0sCisJfQorfTsKKworLyogdXNiIHNwZWNpZmljIG9iamVjdCBuZWVkZWQgdG8gcmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgdXNiIHN1YnN5c3RlbSAqLworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGdwOHBza191c2JfZHJpdmVyID0geworCS5uYW1lCQk9ICJkdmJfdXNiX2dwOHBzayIsCisJLnByb2JlCQk9IGdwOHBza191c2JfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBkdmJfdXNiX2RldmljZV9leGl0LAorCS5pZF90YWJsZQk9IGdwOHBza191c2JfdGFibGUsCit9OworCisvKiBtb2R1bGUgc3R1ZmYgKi8KK3N0YXRpYyBpbnQgX19pbml0IGdwOHBza191c2JfbW9kdWxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0OworCWlmICgocmVzdWx0ID0gdXNiX3JlZ2lzdGVyKCZncDhwc2tfdXNiX2RyaXZlcikpKSB7CisJCWVycigidXNiX3JlZ2lzdGVyIGZhaWxlZC4gKCVkKSIscmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGdwOHBza191c2JfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwkvKiBkZXJlZ2lzdGVyIHRoaXMgZHJpdmVyIGZyb20gdGhlIFVTQiBzdWJzeXN0ZW0gKi8KKwl1c2JfZGVyZWdpc3RlcigmZ3A4cHNrX3VzYl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChncDhwc2tfdXNiX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGdwOHBza191c2JfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGFuIE5pc290YSA8YWxhbm5pc290YUBnYW1pbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgR2VucGl4IDhwc2stVVNCIERWQi1TIFVTQjIuMCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViYTcwNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKQEAgLTAsMCArMSw3OSBAQAorLyogRFZCIFVTQiBjb21wbGlhbnQgTGludXggZHJpdmVyIGZvciB0aGUKKyAqICAtIEdFTlBJWCA4cGtzL3Fwc2sgVVNCMi4wIERWQi1TIG1vZHVsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbGFuIE5pc290YSAoYWxhbm5pc290YUBnbWFpbC5jb20pCisgKgorICogVGhhbmtzIHRvIEdFTlBJWCBmb3IgdGhlIHNhbXBsZSBjb2RlIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgbW9kdWxlLgorICoKKyAqIFRoaXMgbW9kdWxlIGlzIGJhc2VkIG9mZiB0aGUgdnA3MDQ1IGFuZCB2cDcwMnggbW9kdWxlcworICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKgl1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICoJU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqIHNlZSBEb2N1bWVudGF0aW9uL2R2Yi9SRUFETUUuZHZiLXVzYiBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICovCisjaWZuZGVmIF9EVkJfVVNCX0dQOFBTS19IXworI2RlZmluZSBfRFZCX1VTQl9HUDhQU0tfSF8KKworI2RlZmluZSBEVkJfVVNCX0xPR19QUkVGSVggImdwOHBzayIKKyNpbmNsdWRlICJkdmItdXNiLmgiCisKK2V4dGVybiBpbnQgZHZiX3VzYl9ncDhwc2tfZGVidWc7CisjZGVmaW5lIGRlYl9pbmZvKGFyZ3MuLi4pIGRwcmludGsoZHZiX3VzYl9ncDhwc2tfZGVidWcsMHgwMSxhcmdzKQorI2RlZmluZSBkZWJfeGZlcihhcmdzLi4uKSBkcHJpbnRrKGR2Yl91c2JfZ3A4cHNrX2RlYnVnLDB4MDIsYXJncykKKyNkZWZpbmUgZGViX3JjKGFyZ3MuLi4pICAgZHByaW50ayhkdmJfdXNiX2dwOHBza19kZWJ1ZywweDA0LGFyZ3MpCisjZGVmaW5lIGRlYl9mZShhcmdzLi4uKSAgIGRwcmludGsoZHZiX3VzYl9ncDhwc2tfZGVidWcsMHgwOCxhcmdzKQorLyogZ3A4cHNrIGNvbW1hbmRzICovCisKKy8qIFR3aW5oYW4gVmVuZG9yIHJlcXVlc3RzICovCisjZGVmaW5lIFRIX0NPTU1BTkRfSU4gICAgICAgICAgICAgICAgICAgICAweEMwCisjZGVmaW5lIFRIX0NPTU1BTkRfT1VUICAgICAgICAgICAgICAgICAgICAweEMxCisKKy8qIGNvbW1hbmQgYnl0ZXMgKi8KKyNkZWZpbmUgR0VUXzhQU0tfQ09ORklHICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFNFVF84UFNLX0NPTkZJRyAgICAgICAgICAgICAgICAgMHg4MQorI2RlZmluZSBBUk1fVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgIDB4ODUKKyNkZWZpbmUgVFVORV84UFNLICAgICAgICAgICAgICAgICAgICAgICAweDg2CisjZGVmaW5lIEdFVF9TSUdOQUxfU1RSRU5HVEggICAgICAgICAgICAgMHg4NworI2RlZmluZSBMT0FEX0JDTTQ1MDAgICAgICAgICAgICAgICAgICAgIDB4ODgKKyNkZWZpbmUgQk9PVF84UFNLICAgICAgICAgICAgICAgICAgICAgICAweDg5CisjZGVmaW5lIFNUQVJUX0lOVEVSU0lMICAgICAgICAgICAgICAgICAgMHg4QQorI2RlZmluZSBTRVRfTE5CX1ZPTFRBR0UgICAgICAgICAgICAgICAgIDB4OEIKKyNkZWZpbmUgU0VUXzIyS0haX1RPTkUgICAgICAgICAgICAgICAgICAweDhDCisjZGVmaW5lIFNFTkRfRElTRVFDX0NPTU1BTkQgICAgICAgICAgICAgMHg4RAorI2RlZmluZSBTRVRfRFZCX01PREUgICAgICAgICAgICAgICAgICAgIDB4OEUKKyNkZWZpbmUgU0VUX0ROX1NXSVRDSCAgICAgICAgICAgICAgICAgICAweDhGCisjZGVmaW5lIEdFVF9TSUdOQUxfTE9DSyAgICAgICAgICAgICAgICAgMHg5MAorCisvKiBTYXRlbGxpdGUgbW9kdWxhdGlvbiBtb2RlcyAqLworI2RlZmluZSBBRFZfTU9EX0RWQl9RUFNLIDAgICAgIC8qIERWQi1TIFFQU0sgKi8KKyNkZWZpbmUgQURWX01PRF9UVVJCT19RUFNLIDEgICAvKiBUdXJibyBRUFNLICovCisjZGVmaW5lIEFEVl9NT0RfVFVSQk9fOFBTSyAyICAgLyogVHVyYm8gOFBTSyAoYWxzbyB1c2VkIGZvciBUcmVsbGlzIDhQU0spICovCisjZGVmaW5lIEFEVl9NT0RfVFVSQk9fMTZRQU0gMyAgLyogVHVyYm8gMTZRQU0gKGFsc28gdXNlZCBmb3IgVHJlbGxpcyA4UFNLKSAqLworCisjZGVmaW5lIEFEVl9NT0RfRENJSV9DX1FQU0sgNCAgLyogRGlnaWNpcGhlciBJSSBDb21ibyAqLworI2RlZmluZSBBRFZfTU9EX0RDSUlfSV9RUFNLIDUgIC8qIERpZ2ljaXBoZXIgSUkgSS1zdHJlYW0gKi8KKyNkZWZpbmUgQURWX01PRF9EQ0lJX1FfUVBTSyA2ICAvKiBEaWdpY2lwaGVyIElJIFEtc3RyZWFtICovCisjZGVmaW5lIEFEVl9NT0RfRENJSV9DX09RUFNLIDcgLyogRGlnaWNpcGhlciBJSSBvZmZzZXQgUVBTSyAqLworI2RlZmluZSBBRFZfTU9EX0RTU19RUFNLIDggICAgIC8qIERTUyAoRElSRUNUVikgUVBTSyAqLworI2RlZmluZSBBRFZfTU9EX0RWQl9CUFNLIDkgICAgIC8qIERWQi1TIEJQU0sgKi8KKworI2RlZmluZSBHRVRfVVNCX1NQRUVEICAgICAgICAgICAgICAgICAgICAgMHgwNworICNkZWZpbmUgVVNCX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgMAorICNkZWZpbmUgVVNCX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAgICAgMQorICNkZWZpbmUgVVNCX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIFJFU0VUX0ZYMiAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCisKKyNkZWZpbmUgRldfVkVSU0lPTl9SRUFEICAgICAgICAgICAgICAgICAgIDB4MEIKKyNkZWZpbmUgVkVORE9SX1NUUklOR19SRUFEICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgUFJPRFVDVF9TVFJJTkdfUkVBRCAgICAgICAgICAgICAgIDB4MEQKKyNkZWZpbmUgRldfQkNEX1ZFUlNJT05fUkVBRCAgICAgICAgICAgICAgIDB4MTQKKworZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKiBncDhwc2tfZmVfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCk7CitleHRlcm4gaW50IGdwOHBza191c2JfaW5fb3Aoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkLCB1OCByZXEsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LCB1OCAqYiwgaW50IGJsZW4pOworZXh0ZXJuIGludCBncDhwc2tfdXNiX291dF9vcChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQsIHU4IHJlcSwgdTE2IHZhbHVlLAorCQkJICAgICB1MTYgaW5kZXgsIHU4ICpiLCBpbnQgYmxlbik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi91bXQtMDEwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwppbmRleCAxNGYxOTExLi45N2Q3NGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3VtdC0wMTAuYwpAQCAtNTcsNyArNTcsNiBAQAogCW1lbXNldCgmdW10X2NvbmZpZywwLHNpemVvZihzdHJ1Y3QgbXQzNTJfY29uZmlnKSk7CiAJdW10X2NvbmZpZy5kZW1vZF9pbml0ID0gdW10X210MzUyX2RlbW9kX2luaXQ7CiAJdW10X2NvbmZpZy5kZW1vZF9hZGRyZXNzID0gMHhmOwotCXVtdF9jb25maWcucGxsX3NldCA9IGR2Yl91c2JfcGxsX3NldDsKIAogCWQtPmZlID0gbXQzNTJfYXR0YWNoKCZ1bXRfY29uZmlnLCAmZC0+aTJjX2FkYXApOwogCkBAIC02OCw2ICs2Nyw3IEBACiB7CiAJZC0+cGxsX2FkZHIgPSAweDYxOwogCWQtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdHVhNjAzNDsKKwlkLT5mZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MgPSBkdmJfdXNiX3R1bmVyX2NhbGNfcmVnczsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDJ4LWZlLmMKaW5kZXggMmE4OWY4Yy4uZDRkYTQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwMngtZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzAyeC1mZS5jCkBAIC0yODcsMTcgKzI4NywxNiBAQAogCQlnb3RvIGVycm9yOwogCiAJcy0+ZCA9IGQ7Ci0Jcy0+ZmUub3BzID0gJnZwNzAyeF9mZV9vcHM7CisKKwltZW1jcHkoJnMtPmZlLm9wcywmdnA3MDJ4X2ZlX29wcyxzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzLT5mZS5kZW1vZHVsYXRvcl9wcml2ID0gczsKIAogCXMtPmxuYl9idWZbMV0gPSBTRVRfTE5CX1BPV0VSOwogCXMtPmxuYl9idWZbM10gPSAweGZmOyAvKiAwPXRvbmUgYnVyc3QsIDI9ZGF0YSBidXJzdCwgZmY9b2ZmICovCiAKLQlnb3RvIHN1Y2Nlc3M7CisJcmV0dXJuICZzLT5mZTsKIGVycm9yOgogCXJldHVybiBOVUxMOwotc3VjY2VzczoKLQlyZXR1cm4gJnMtPmZlOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS1mZS5jCmluZGV4IDk5OTkzMzYuLjg0NTJlZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LWZlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUtZmUuYwpAQCAtMjMsOCArMjMsNiBAQAogCiBzdHJ1Y3QgdnA3MDQ1X2ZlX3N0YXRlIHsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZlOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZDsKIH07CiAKQEAgLTE1MSwxNSArMTQ5LDEyIEBACiAJCWdvdG8gZXJyb3I7CiAKIAlzLT5kID0gZDsKLQltZW1jcHkoJnMtPm9wcywgJnZwNzA0NV9mZV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwotCXMtPmZlLm9wcyA9ICZzLT5vcHM7CisJbWVtY3B5KCZzLT5mZS5vcHMsICZ2cDcwNDVfZmVfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzLT5mZS5kZW1vZHVsYXRvcl9wcml2ID0gczsKIAotCWdvdG8gc3VjY2VzczsKKwlyZXR1cm4gJnMtPmZlOwogZXJyb3I6CiAJcmV0dXJuIE5VTEw7Ci1zdWNjZXNzOgotCXJldHVybiAmcy0+ZmU7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwppbmRleCAzN2Q1ZTBhLi4wZWYzNjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvS2NvbmZpZwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJaGVscAogCSAgQSBEVkItQyB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQgdG8gc3VwcG9ydCB0aGlzIGZyb250ZW5kLgogCi1jb21tZW50ICJBVFNDIChOb3J0aCBBbWVyaWNhbi9Lb3JlYW4gVGVycmVzdGVyaWFsIERUVikgZnJvbnRlbmRzIgorY29tbWVudCAiQVRTQyAoTm9ydGggQW1lcmljYW4vS29yZWFuIFRlcnJlc3RyaWFsL0NhYmxlIERUVikgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIAogY29uZmlnIERWQl9OWFQyMDBYCkBAIC0yMTYsNCArMjE2LDIwIEBACiAJICBBbiBBVFNDIDhWU0IgYW5kIFFBTTY0LzI1NiB0dW5lciBtb2R1bGUuIFNheSBZIHdoZW4geW91IHdhbnQKIAkgIHRvIHN1cHBvcnQgdGhpcyBmcm9udGVuZC4KIAorCitjb21tZW50ICJNaXNjZWxsYW5lb3VzIGRldmljZXMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCitjb25maWcgRFZCX0xOQlAyMQorCXRyaXN0YXRlICJMTkJQMjEgU0VDIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCWhlbHAKKwkgIEFuIFNFQyBjb250cm9sIGNoaXAuCisKK2NvbmZpZyBEVkJfSVNMNjQyMQorCXRyaXN0YXRlICJJU0w2NDIxIFNFQyBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gRFZCX0NPUkUKKwloZWxwCisJICBBbiBTRUMgY29udHJvbCBjaGlwLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKaW5kZXggZDA5YjYwNy4uNTIyMjI0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQpAQCAtMzEsMyArMzEsNSBAQAogb2JqLSQoQ09ORklHX0RWQl9TNUgxNDIwKSArPSBzNWgxNDIwLm8KIG9iai0kKENPTkZJR19EVkJfTEdEVDMzMFgpICs9IGxnZHQzMzB4Lm8KIG9iai0kKENPTkZJR19EVkJfQ1gyNDEyMykgKz0gY3gyNDEyMy5vCitvYmotJChDT05GSUdfRFZCX0xOQlAyMSkgKz0gbG5icDIxLm8KK29iai0kKENPTkZJR19EVkJfSVNMNjQyMSkgKz0gaXNsNjQyMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuYwppbmRleCAxNzA4YTFkLi5iYWViMzExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JjbTM1MTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYmNtMzUxMC5jCkBAIC00OCw3ICs0OCw2IEBACiBzdHJ1Y3QgYmNtMzUxMF9zdGF0ZSB7CiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IGJjbTM1MTBfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtNzkxLDEwICs3OTAsOSBAQAogCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmJjbTM1MTBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmYmNtMzUxMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAltdXRleF9pbml0KCZzdGF0ZS0+aGFiX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic2JlMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzYmUxLmgKaW5kZXggNzg1NzNiMi4uZDhmNjU3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzYmUxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzYmUxLmgKQEAgLTg5LDEyICs4OSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNiZTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX2JzYmUxX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCWludCByZXQ7CiAJdTggZGF0YVs0XTsKIAl1MzIgZGl2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDYxLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IHNpemVvZihkYXRhKSB9OworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gZmUtPnR1bmVyX3ByaXY7CiAKIAlpZiAoKHBhcmFtcy0+ZnJlcXVlbmN5IDwgOTUwMDAwKSB8fCAocGFyYW1zLT5mcmVxdWVuY3kgPiAyMTUwMDAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDUsNiArMTA2LDggQEAKIAlkYXRhWzJdID0gMHg4MCB8ICgoZGl2ICYgMHgxODAwMCkgPj4gMTApIHwgNDsKIAlkYXRhWzNdID0gKHBhcmFtcy0+ZnJlcXVlbmN5ID4gMTUzMDAwMCkgPyAweEUwIDogMHhFNDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJcmV0ID0gaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSk7CiAJcmV0dXJuIChyZXQgIT0gMSkgPyAtRUlPIDogMDsKIH0KQEAgLTExNyw3ICsxMjAsNiBAQAogCS5za2lwX3JlaW5pdCA9IDAsCiAJLm1pbl9kZWxheV9tcyA9IDEwMCwKIAkuc2V0X3N5bWJvbF9yYXRlID0gYWxwc19ic2JlMV9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBhbHBzX2JzYmUxX3BsbF9zZXQsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ic3J1Ni5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzcnU2LmgKaW5kZXggMmE1MzY2Yy4uZTIzMWNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzcnU2LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2JzcnU2LmgKQEAgLTEwMSwxMSArMTAxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J1Nl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTggYnVmWzRdOwogCXUzMiBkaXY7CiAJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBzaXplb2YoYnVmKSB9OworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gZmUtPnR1bmVyX3ByaXY7CiAKIAlpZiAoKHBhcmFtcy0+ZnJlcXVlbmN5IDwgOTUwMDAwKSB8fCAocGFyYW1zLT5mcmVxdWVuY3kgPiAyMTUwMDAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTksNiArMTIwLDggQEAKIAlpZiAocGFyYW1zLT5mcmVxdWVuY3kgPiAxNTMwMDAwKQogCQlidWZbM10gPSAweGMwOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CkBAIC0xMzQsNyArMTM3LDYgQEAKIAkudm9sdDEzX29wMF9vcDEgPSBTVFYwMjk5X1ZPTFQxM19PUDEsCiAJLm1pbl9kZWxheV9tcyA9IDEwMCwKIAkuc2V0X3N5bWJvbF9yYXRlID0gYWxwc19ic3J1Nl9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBhbHBzX2JzcnU2X3BsbF9zZXQsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5jCmluZGV4IDc1NWY3NzQuLjNjN2MwOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuYwpAQCAtMzQsOCArMzQsNiBAQAogCiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Ci0KIAljb25zdCBzdHJ1Y3QgY3gyMjcwMF9jb25maWcqIGNvbmZpZzsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yNDcsMTIgKzI0NSw2IEBACiAKIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMSk7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MGEsIDB4MDApOyAgLyogb3BlbiBpMmMgYnVzIHN3aXRjaCAqLwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDBhLCAweDAxKTsgIC8qIGNsb3NlIGkyYyBidXMgc3dpdGNoICovCi0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMzMyw5ICszMjUsMTEgQEAKIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMik7IC8qIFhYWCBDSEVDS01FOiBzb2Z0IHJlc2V0Ki8KIAljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgwMCk7CiAKLQljeDIyNzAwX3dyaXRlcmVnIChzdGF0ZSwgMHgwYSwgMHgwMCk7ICAvKiBvcGVuIGkyYyBidXMgc3dpdGNoICovCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7Ci0JY3gyMjcwMF93cml0ZXJlZyAoc3RhdGUsIDB4MGEsIDB4MDEpOyAgLyogY2xvc2UgaTJjIGJ1cyBzd2l0Y2ggKi8KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKIAljeDIyNzAwX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCWN4MjI3MDBfc2V0X3RwcyAoc3RhdGUsICZwLT51Lm9mZG0pOwogCWN4MjI3MDBfd3JpdGVyZWcgKHN0YXRlLCAweDM3LCAweDAxKTsgIC8qIFBBTCBsb29wIGZpbHRlciBvZmYgKi8KQEAgLTM1Myw2ICszNDcsMTcgQEAKIAlyZXR1cm4gY3gyMjcwMF9nZXRfdHBzIChzdGF0ZSwgJnAtPnUub2ZkbSk7CiB9CiAKK3N0YXRpYyBpbnQgY3gyMjcwMF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBjeDIyNzAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gY3gyMjcwMF93cml0ZXJlZyhzdGF0ZSwgMHgwYSwgMHgwMCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGN4MjI3MDBfd3JpdGVyZWcoc3RhdGUsIDB4MGEsIDB4MDEpOworCX0KK30KKwogc3RhdGljIGludCBjeDIyNzAwX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJZmVzZXR0aW5ncy0+bWluX2RlbGF5X21zID0gMTUwOwpAQCAtMzgxLDEzICszODYsMTIgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmY3gyMjcwMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKGN4MjI3MDBfcmVhZHJlZyhzdGF0ZSwgMHgwNykgPCAwKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZjeDIyNzAwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtNDEzLDYgKzQxNyw3IEBACiAJLnJlbGVhc2UgPSBjeDIyNzAwX3JlbGVhc2UsCiAKIAkuaW5pdCA9IGN4MjI3MDBfaW5pdCwKKwkuaTJjX2dhdGVfY3RybCA9IGN4MjI3MDBfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSBjeDIyNzAwX3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gY3gyMjcwMF9nZXRfZnJvbnRlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDAuaAppbmRleCBjOTE0NWI0Li5kY2Q4OTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAwLmgKQEAgLTI5LDEwICsyOSw2IEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjI3MDBfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDIyNzAwX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmMKaW5kZXggMGZjODk5Zi4uNDEwNmQ0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5jCkBAIC00MCw4ICs0MCw2IEBACiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKIAotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgY3gyMjcwMl9jb25maWcqIGNvbmZpZzsKIApAQCAtMjExLDIyICsyMDksMTAgQEAKIAl1OCB2YWw7CiAJc3RydWN0IGN4MjI3MDJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQkvKiBzZXQgUExMICovCi0JY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX3NldCkgewotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKLQl9IGVsc2UgaWYgKHN0YXRlLT5jb25maWctPnBsbF9kZXNjKSB7Ci0JCXU4IHBsbGJ1Zls0XTsKLQkJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzLAotCQkJCSAgICAgICAuYnVmID0gcGxsYnVmLCAubGVuID0gNCB9OwotCQlkdmJfcGxsX2NvbmZpZ3VyZShzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYywgcGxsYnVmLAotCQkJCSAgcC0+ZnJlcXVlbmN5LAotCQkJCSAgcC0+dS5vZmRtLmJhbmR3aWR0aCk7Ci0JCWkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnLCAxKTsKLQl9IGVsc2UgewotCQlCVUcoKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAl9Ci0JY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAogCS8qIHNldCBpbnZlcnNpb24gKi8KIAljeDIyNzAyX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwpAQCAtMzU4LDEwICszNDQsNiBAQAogCiAJY3gyMjcwMl93cml0ZXJlZyAoc3RhdGUsIDB4ZjgsIChzdGF0ZS0+Y29uZmlnLT5vdXRwdXRfbW9kZSA8PCAxKSAmIDB4MDIpOwogCi0JLyogaW5pdCBQTEwgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQogCWN4MjI3MDJfaTJjX2dhdGVfY3RybChmZSwgMCk7CiAKIAlyZXR1cm4gMDsKQEAgLTQ5NSw3ICs0NzcsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZjeDIyNzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPnByZXZVQ0Jsb2NrcyA9IDA7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KQEAgLTUwMyw3ICs0ODQsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZjeDIyNzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtNTMwLDYgKzUxMSw3IEBACiAJLnJlbGVhc2UgPSBjeDIyNzAyX3JlbGVhc2UsCiAKIAkuaW5pdCA9IGN4MjI3MDJfaW5pdCwKKwkuaTJjX2dhdGVfY3RybCA9IGN4MjI3MDJfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSBjeDIyNzAyX3NldF90cHMsCiAJLmdldF9mcm9udGVuZCA9IGN4MjI3MDJfZ2V0X2Zyb250ZW5kLApAQCAtNTQwLDcgKzUyMiw2IEBACiAJLnJlYWRfc2lnbmFsX3N0cmVuZ3RoID0gY3gyMjcwMl9yZWFkX3NpZ25hbF9zdHJlbmd0aCwKIAkucmVhZF9zbnIgPSBjeDIyNzAyX3JlYWRfc25yLAogCS5yZWFkX3VjYmxvY2tzID0gY3gyMjcwMl9yZWFkX3VjYmxvY2tzLAotCS5pMmNfZ2F0ZV9jdHJsID0gY3gyMjcwMl9pMmNfZ2F0ZV9jdHJsLAogfTsKIAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDIyNzAyLmgKaW5kZXggNTYzMzk3Ni4uN2YyZjI0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjI3MDIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyMjcwMi5oCkBAIC0zOSwxMyArMzksNiBAQAogI2RlZmluZSBDWDIyNzAyX1BBUkFMTEVMX09VVFBVVCAwCiAjZGVmaW5lIENYMjI3MDJfU0VSSUFMX09VVFBVVCAgIDEKIAl1OCBvdXRwdXRfbW9kZTsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCXU4IHBsbF9hZGRyZXNzOwotCXN0cnVjdCBkdmJfcGxsX2Rlc2MgKnBsbF9kZXNjOwotCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIGN4MjI3MDJfYXR0YWNoKGNvbnN0IHN0cnVjdCBjeDIyNzAyX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmMKaW5kZXggZjNlZGY4Yi4uY2UzYzczOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5jCkBAIC0zNiw4ICszNiw2IEBACiAKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKIAotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCWNvbnN0IHN0cnVjdCBjeDI0MTEwX2NvbmZpZyogY29uZmlnOwogCiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKQEAgLTI1MCw3ICsyNDgsNyBAQAogCXN0YXRpYyBjb25zdCB1MzIgYmFuZHNbXT17NTAwMDAwMFVMLDE1MDAwMDAwVUwsOTA5OTkwMDBVTC8yfTsKIAlpbnQgaTsKIAotZHByaW50aygiY3gyNDExMCBkZWJ1ZzogZW50ZXJpbmcgJXMoJWQpXG4iLF9fRlVOQ1RJT05fXyxzcmF0ZSk7CisJZHByaW50aygiY3gyNDExMCBkZWJ1ZzogZW50ZXJpbmcgJXMoJWQpXG4iLF9fRlVOQ1RJT05fXyxzcmF0ZSk7CiAJaWYgKHNyYXRlPjkwOTk5MDAwVUwvMikKIAkJc3JhdGU9OTA5OTkwMDBVTC8yOwogCWlmIChzcmF0ZTw1MDAwMDApCkBAIC0zNjYsMTcgKzM2NCw2IEBACiAJCWN4MjQxMTBfd3JpdGVyZWcoc3RhdGUsIGN4MjQxMTBfcmVnZGF0YVtpXS5yZWcsIGN4MjQxMTBfcmVnZGF0YVtpXS5kYXRhKTsKIAl9OwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSBzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjeDI0MTEwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQotewotCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9zbGVlcCkKLQkJICByZXR1cm4gc3RhdGUtPmNvbmZpZy0+cGxsX3NsZWVwKGZlKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTQ4LDcgKzUzNSwxMiBAQAogewogCXN0cnVjdCBjeDI0MTEwX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CisKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKIAljeDI0MTEwX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCWN4MjQxMTBfc2V0X2ZlYyAoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCWN4MjQxMTBfc2V0X3N5bWJvbHJhdGUgKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOwpAQCAtNjEyLDcgKzYwNCw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmN4MjQxMTBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+bGFzdGJlciA9IDA7CiAJc3RhdGUtPmxhc3RibGVyID0gMDsKIAlzdGF0ZS0+bGFzdGVzbjAgPSAwOwpAQCAtNjIyLDcgKzYxMyw3IEBACiAJaWYgKChyZXQgIT0gMHg1YSkgJiYgKHJldCAhPSAweDY5KSkgZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmY3gyNDExMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTY1MSw3ICs2NDIsNiBAQAogCS5yZWxlYXNlID0gY3gyNDExMF9yZWxlYXNlLAogCiAJLmluaXQgPSBjeDI0MTEwX2luaXRmZSwKLQkuc2xlZXAgPSBjeDI0MTEwX3NsZWVwLAogCS5zZXRfZnJvbnRlbmQgPSBjeDI0MTEwX3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gY3gyNDExMF9nZXRfZnJvbnRlbmQsCiAJLnJlYWRfc3RhdHVzID0gY3gyNDExMF9yZWFkX3N0YXR1cywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMC5oCmluZGV4IDYwOWFjNjQuLmIzNTRhNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTAuaApAQCAtMzEsMTEgKzMxLDYgQEAKIHsKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7Ci0JaW50ICgqcGxsX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyNDExMF9hdHRhY2goY29uc3Qgc3RydWN0IGN4MjQxMTBfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuYwppbmRleCA2OTFkYzg0Li5mMmY3OTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmMKQEAgLTQxLDE0ICs0MSwxMiBAQAogc3RydWN0IGN4MjQxMjNfc3RhdGUKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IGN4MjQxMjNfY29uZmlnKiBjb25maWc7CiAKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCiAJdTMyIGxhc3RiZXI7CiAJdTE2IHNucjsKLQl1OCAgbG5icmVnOwogCiAJLyogU29tZSBQTEwgc3BlY2lmaWNzIGZvciB0dW5pbmcgKi8KIAl1MzIgVkNBYXJnOwpAQCAtMjQ5LDI5ICsyNDcsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCBpbnQgcmVnLCBpbnQgZGF0YSkKLXsKLQl1OCBidWZbXSA9IHsgcmVnLCBkYXRhIH07Ci0JLyogZml4bWU6IHB1dCB0aGUgaW50ZXJzaWwgYWRkciBpbnQgdGhlIGNvbmZpZyAqLwotCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsgLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gMiB9OwotCWludCBlcnI7Ci0KLQlpZiAoZGVidWc+MSkKLQkJcHJpbnRrKCJjeDI0MTIzOiAlczogIHdyaXRlbG4gYWRkcj0weDA4LCByZWcgMHglMDJ4LCB2YWx1ZSAweCUwMnhcbiIsCi0JCQkJCQlfX0ZVTkNUSU9OX18scmVnLCBkYXRhKTsKLQotCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2csIDEpKSAhPSAxKSB7Ci0JCXByaW50aygiJXM6IHdyaXRlbG5icmVnIGVycm9yIChlcnIgPT0gJWksIHJlZyA9PSAweCUwMngsIgotCQkJICIgZGF0YSA9PSAweCUwMngpXG4iLCBfX0ZVTkNUSU9OX18sIGVyciwgcmVnLCBkYXRhKTsKLQkJcmV0dXJuIC1FUkVNT1RFSU87Ci0JfQotCi0JLyogY2FjaGUgdGhlIHdyaXRlLCBubyB3YXkgdG8gcmVhZCBiYWNrICovCi0Jc3RhdGUtPmxuYnJlZyA9IGRhdGE7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBjeDI0MTIzX3JlYWRyZWcoc3RydWN0IGN4MjQxMjNfc3RhdGUqIHN0YXRlLCB1OCByZWcpCiB7CiAJaW50IHJldDsKQEAgLTI5NSwxMSArMjcwLDYgQEAKIAlyZXR1cm4gYjFbMF07CiB9CiAKLXN0YXRpYyBpbnQgY3gyNDEyM19yZWFkbG5icmVnKHN0cnVjdCBjeDI0MTIzX3N0YXRlKiBzdGF0ZSwgdTggcmVnKQotewotCXJldHVybiBzdGF0ZS0+bG5icmVnOwotfQotCiBzdGF0aWMgaW50IGN4MjQxMjNfc2V0X2ludmVyc2lvbihzdHJ1Y3QgY3gyNDEyM19zdGF0ZSogc3RhdGUsIGZlX3NwZWN0cmFsX2ludmVyc2lvbl90IGludmVyc2lvbikKIHsKIAl1OCBub21fcmVnID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDBlKTsKQEAgLTQ1OCw4ICs0MjgsOCBAQAogCXU4IHBsbF9tdWx0OwogCiAJLyogIGNoZWNrIGlmIHN5bWJvbCByYXRlIGlzIHdpdGhpbiBsaW1pdHMgKi8KLQlpZiAoKHNyYXRlID4gc3RhdGUtPm9wcy5pbmZvLnN5bWJvbF9yYXRlX21heCkgfHwKLQkgICAgKHNyYXRlIDwgc3RhdGUtPm9wcy5pbmZvLnN5bWJvbF9yYXRlX21pbikpCisJaWYgKChzcmF0ZSA+IHN0YXRlLT5mcm9udGVuZC5vcHMuaW5mby5zeW1ib2xfcmF0ZV9tYXgpIHx8CisJICAgIChzcmF0ZSA8IHN0YXRlLT5mcm9udGVuZC5vcHMuaW5mby5zeW1ib2xfcmF0ZV9taW4pKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7OwogCiAJLyogY2hvb3NlIHRoZSBzYW1wbGluZyByYXRlIGhpZ2ggZW5vdWdoIGZvciB0aGUgcmVxdWlyZWQgb3BlcmF0aW9uLApAQCAtNjg3LDEzICs2NTcsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoY3gyNDEyM19yZWdkYXRhKSAvIHNpemVvZihjeDI0MTIzX3JlZ2RhdGFbMF0pOyBpKyspCiAJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIGN4MjQxMjNfcmVnZGF0YVtpXS5yZWcsIGN4MjQxMjNfcmVnZGF0YVtpXS5kYXRhKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCi0JLyogQ29uZmlndXJlIHRoZSBMTkIgZm9yIDE0ViAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT51c2VfaXNsNjQyMSkKLQkJY3gyNDEyM193cml0ZWxuYnJlZyhzdGF0ZSwgMHgwLCAweDJhKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03MDIsNTAgKzY2NSwxOCBAQAogCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHZhbDsKIAotCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpIHsKKwl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpICYgfjB4NDA7CiAKLQljYXNlIDE6Ci0KLQkJdmFsID0gY3gyNDEyM19yZWFkbG5icmVnKHN0YXRlLCAweDApOwotCi0JCXN3aXRjaCAodm9sdGFnZSkgewotCQljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQkJZHByaW50aygiJXM6ICBpc2w2NDIxIHZvbHRhZ2UgPSAxM1ZcbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCAmIDB4MzIpOyAvKiBWIDEzdiAqLwotCQljYXNlIFNFQ19WT0xUQUdFXzE4OgotCQkJZHByaW50aygiJXM6ICBpc2w2NDIxIHZvbHRhZ2UgPSAxOFZcbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCB8IDB4MDQpOyAvKiBIIDE4diAqLwotCQljYXNlIFNFQ19WT0xUQUdFX09GRjoKLQkJCWRwcmludGsoIiVzOiAgaXNsNTQyMSB2b2x0YWdlIG9mZlxuIixfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVsbmJyZWcoc3RhdGUsIDB4MCwgdmFsICYgMHgzMCk7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfTsKLQotCWNhc2UgMDoKLQotCQl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpOwotCi0JCXN3aXRjaCAodm9sdGFnZSkgewotCQljYXNlIFNFQ19WT0xUQUdFXzEzOgotCQkJZHByaW50aygiJXM6IHNldHRpbmcgdm9sdGFnZSAxM1ZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCQlpZiAoc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKQotCQkJCXN0YXRlLT5jb25maWctPmVuYWJsZV9sbmJfdm9sdGFnZShmZSwgMSk7Ci0JCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsIHwgMHg4MCk7Ci0JCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCQlkcHJpbnRrKCIlczogc2V0dGluZyB2b2x0YWdlIDE4VlxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWlmIChzdGF0ZS0+Y29uZmlnLT5lbmFibGVfbG5iX3ZvbHRhZ2UpCi0JCQkJc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKGZlLCAxKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgJiAweDdmKTsKLQkJY2FzZSBTRUNfVk9MVEFHRV9PRkY6Ci0JCQlkcHJpbnRrKCIlczogc2V0dGluZyB2b2x0YWdlIG9mZlxuIiwgX19GVU5DVElPTl9fKTsKLQkJCWlmIChzdGF0ZS0+Y29uZmlnLT5lbmFibGVfbG5iX3ZvbHRhZ2UpCi0JCQkJc3RhdGUtPmNvbmZpZy0+ZW5hYmxlX2xuYl92b2x0YWdlKGZlLCAwKTsKLQkJCXJldHVybiAwOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX07Ci0JfQorCXN3aXRjaCAodm9sdGFnZSkgeworCWNhc2UgU0VDX1ZPTFRBR0VfMTM6CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHZvbHRhZ2UgMTNWXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsIHwgMHg4MCk7CisJY2FzZSBTRUNfVk9MVEFHRV8xODoKKwkJZHByaW50aygiJXM6IHNldHRpbmcgdm9sdGFnZSAxOFZcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgJiAweDdmKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OwogCiAJcmV0dXJuIDA7CiB9CkBAIC03NjYsMjcgKzY5NywyMCBAQAogc3RhdGljIGludCBjeDI0MTIzX3NlbmRfZGlzZXFjX21zZyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCAqY21kKQogewogCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwotCWludCBpLCB2YWw7CisJaW50IGksIHZhbCwgdG9uZTsKIAogCWRwcmludGsoIiVzOlxuIixfX0ZVTkNUSU9OX18pOwogCi0JLyogY2hlY2sgaWYgY29udGludW91cyB0b25lIGhhcyBiZWVuIHN0b3BwZWQgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpCi0JCXZhbCA9IGN4MjQxMjNfcmVhZGxuYnJlZyhzdGF0ZSwgMHgwMCkgJiAweDEwOwotCWVsc2UKLQkJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KSAmIDB4MTA7Ci0KLQotCWlmICh2YWwpIHsKLQkJcHJpbnRrKCIlczogRVJST1I6IGF0dGVtcHQgdG8gc2VuZCBkaXNlcWMgY29tbWFuZCBiZWZvcmUgdG9uZSBpcyBvZmZcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQorCS8qIHN0b3AgY29udGludW91cyB0b25lIGlmIGVuYWJsZWQgKi8KKwl0b25lID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KTsKKwlpZiAodG9uZSAmIDB4MTApCisJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHRvbmUgJiB+MHg1MCk7CiAKIAkvKiB3YWl0IGZvciBkaXNlcWMgcXVldWUgcmVhZHkgKi8KIAljeDI0MTIzX3dhaXRfZm9yX2Rpc2VxYyhzdGF0ZSk7CiAKIAkvKiBzZWxlY3QgdG9uZSBtb2RlICovCi0JY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyYSwgY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDJhKSAmIDB4ZjgpOworCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MmEsIGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyYSkgJiAweGZiKTsKIAogCWZvciAoaSA9IDA7IGkgPCBjbWQtPm1zZ19sZW47IGkrKykKIAkJY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyQyArIGksIGNtZC0+bXNnW2ldKTsKQEAgLTc5NywzNiArNzIxLDMzIEBACiAJLyogd2FpdCBmb3IgZGlzZXFjIG1lc3NhZ2UgdG8gZmluaXNoIHNlbmRpbmcgKi8KIAljeDI0MTIzX3dhaXRfZm9yX2Rpc2VxYyhzdGF0ZSk7CiAKKwkvKiByZXN0YXJ0IGNvbnRpbnVvdXMgdG9uZSBpZiBlbmFibGVkICovCisJaWYgKHRvbmUgJiAweDEwKSB7CisJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHRvbmUgJiB+MHg0MCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgY3gyNDEyM19kaXNlcWNfc2VuZF9idXJzdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgZmVfc2VjX21pbmlfY21kX3QgYnVyc3QpCiB7CiAJc3RydWN0IGN4MjQxMjNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JaW50IHZhbDsKKwlpbnQgdmFsLCB0b25lOwogCiAJZHByaW50aygiJXM6XG4iLCBfX0ZVTkNUSU9OX18pOwogCi0JLyogY2hlY2sgaWYgY29udGludW91cyB0b25lIGhhcyBiZWVuIHN0b3BlZCAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT51c2VfaXNsNjQyMSkKLQkJdmFsID0gY3gyNDEyM19yZWFkbG5icmVnKHN0YXRlLCAweDAwKSAmIDB4MTA7Ci0JZWxzZQotCQl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpICYgMHgxMDsKKwkvKiBzdG9wIGNvbnRpbnVvdXMgdG9uZSBpZiBlbmFibGVkICovCisJdG9uZSA9IGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyOSk7CisJaWYgKHRvbmUgJiAweDEwKQorCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB0b25lICYgfjB4NTApOwogCi0KLQlpZiAodmFsKSB7Ci0JCXByaW50aygiJXM6IEVSUk9SOiBhdHRlbXB0IHRvIHNlbmQgZGlzZXFjIGNvbW1hbmQgYmVmb3JlIHRvbmUgaXMgb2ZmXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQorCS8qIHdhaXQgZm9yIGRpc2VxYyBxdWV1ZSByZWFkeSAqLwogCWN4MjQxMjNfd2FpdF9mb3JfZGlzZXFjKHN0YXRlKTsKIAogCS8qIHNlbGVjdCB0b25lIG1vZGUgKi8KLQl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MmEpICYgMHhmODsKLQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDJhLCB2YWwgfCAweDA0KTsKLQorCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MmEsIGN4MjQxMjNfcmVhZHJlZyhzdGF0ZSwgMHgyYSkgfCAweDQpOworCW1zbGVlcCgzMCk7CiAJdmFsID0gY3gyNDEyM19yZWFkcmVnKHN0YXRlLCAweDI5KTsKLQogCWlmIChidXJzdCA9PSBTRUNfTUlOSV9BKQogCQljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCAoKHZhbCAmIDB4OTApIHwgMHg0MCB8IDB4MDApKTsKIAllbHNlIGlmIChidXJzdCA9PSBTRUNfTUlOSV9CKQpAQCAtODM1LDcgKzc1NiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWN4MjQxMjNfd2FpdF9mb3JfZGlzZXFjKHN0YXRlKTsKKwljeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDJhLCBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MmEpICYgMHhmYik7CiAKKwkvKiByZXN0YXJ0IGNvbnRpbnVvdXMgdG9uZSBpZiBlbmFibGVkICovCisJaWYgKHRvbmUgJiAweDEwKSB7CisJCWN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHRvbmUgJiB+MHg0MCk7CisJfQogCXJldHVybiAwOwogfQogCkBAIC05NzYsMzggKzkwMiwyMSBAQAogCXN0cnVjdCBjeDI0MTIzX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXU4IHZhbDsKIAotCXN3aXRjaCAoc3RhdGUtPmNvbmZpZy0+dXNlX2lzbDY0MjEpIHsKLQljYXNlIDE6CisJLyogd2FpdCBmb3IgZGlzZXFjIHF1ZXVlIHJlYWR5ICovCisJY3gyNDEyM193YWl0X2Zvcl9kaXNlcWMoc3RhdGUpOwogCi0JCXZhbCA9IGN4MjQxMjNfcmVhZGxuYnJlZyhzdGF0ZSwgMHgwKTsKKwl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpICYgfjB4NDA7CiAKLQkJc3dpdGNoICh0b25lKSB7Ci0JCWNhc2UgU0VDX1RPTkVfT046Ci0JCQlkcHJpbnRrKCIlczogIGlzbDY0MjEgc2VjIHRvbmUgb25cbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCB8IDB4MTApOwotCQljYXNlIFNFQ19UT05FX09GRjoKLQkJCWRwcmludGsoIiVzOiAgaXNsNjQyMSBzZWMgdG9uZSBvZmZcbiIsX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlbG5icmVnKHN0YXRlLCAweDAsIHZhbCAmIDB4MmYpOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIlczogQ0FTRSByZWFjaGVkIGRlZmF1bHQgd2l0aCB0b25lPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvbmUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCWNhc2UgMDoKLQotCQl2YWwgPSBjeDI0MTIzX3JlYWRyZWcoc3RhdGUsIDB4MjkpOwotCi0JCXN3aXRjaCAodG9uZSkgewotCQljYXNlIFNFQ19UT05FX09OOgotCQkJZHByaW50aygiJXM6IHNldHRpbmcgdG9uZSBvblxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgfCAweDEwKTsKLQkJY2FzZSBTRUNfVE9ORV9PRkY6Ci0JCQlkcHJpbnRrKCIlczogc2V0dGluZyB0b25lIG9mZlxuIixfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIGN4MjQxMjNfd3JpdGVyZWcoc3RhdGUsIDB4MjksIHZhbCAmIDB4ZWYpOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKCIlczogQ0FTRSByZWFjaGVkIGRlZmF1bHQgd2l0aCB0b25lPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHRvbmUpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwlzd2l0Y2ggKHRvbmUpIHsKKwljYXNlIFNFQ19UT05FX09OOgorCQlkcHJpbnRrKCIlczogc2V0dGluZyB0b25lIG9uXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gY3gyNDEyM193cml0ZXJlZyhzdGF0ZSwgMHgyOSwgdmFsIHwgMHgxMCk7CisJY2FzZSBTRUNfVE9ORV9PRkY6CisJCWRwcmludGsoIiVzOiBzZXR0aW5nIHRvbmUgb2ZmXG4iLF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiBjeDI0MTIzX3dyaXRlcmVnKHN0YXRlLCAweDI5LCB2YWwgJiAweGVmKTsKKwlkZWZhdWx0OgorCQlwcmludGsoIiVzOiBDQVNFIHJlYWNoZWQgZGVmYXVsdCB3aXRoIHRvbmU9JWRcbiIsIF9fRlVOQ1RJT05fXywgdG9uZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTA0MCwxMCArOTQ5LDggQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmY3gyNDEyM19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5sYXN0YmVyID0gMDsKIAlzdGF0ZS0+c25yID0gMDsKLQlzdGF0ZS0+bG5icmVnID0gMDsKIAlzdGF0ZS0+VkNBYXJnID0gMDsKIAlzdGF0ZS0+VkdBYXJnID0gMDsKIAlzdGF0ZS0+YmFuZHNlbGVjdGFyZyA9IDA7CkBAIC0xMDU5LDcgKzk2Niw3IEBACiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZjeDI0MTIzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTIzLmgKaW5kZXggMGM5MjJiNS4uOTYwNmY4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMjMuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDEyMy5oCkBAIC0yOCwyMSArMjgsOCBAQAogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKIAotCS8qCi0JICAgY2FyZHMgbGlrZSBIYXVwcGF1Z2UgTm92YS1TIFBsdXMvTm92YS1TRTIgdXNlIGFuIEludGVyc2lsIElTTDY0MjEgY2hpcAotCSAgIGZvciBMTkIgY29udHJvbCwgd2hpbGUgS1dvcmxkIERWQi1TIDEwMCB1c2UgdGhlIExOQkRDIGFuZCBMTkJUb25lIGJpdHMKLQkgICBmcm9tIHJlZ2lzdGVyIDB4Mjkgb2YgdGhlIENYMjQxMjMgZGVtb2R1bGF0b3IKLQkqLwotCWludCB1c2VfaXNsNjQyMTsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKLQogCS8qIE5lZWQgdG8gc2V0IGRldmljZSBwYXJhbSBmb3Igc3RhcnRfZG1hICovCiAJaW50ICgqc2V0X3RzX3BhcmFtcykoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpc19wdW5jdHVyZWQpOwotCi0Jdm9pZCAoKmVuYWJsZV9sbmJfdm9sdGFnZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBvbik7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogY3gyNDEyM19hdHRhY2goY29uc3Qgc3RydWN0IGN4MjQxMjNfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC1jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5oCmluZGV4IGMzMWQ2ZGYuLmJlMWMwZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLWNvbW1vbi5oCkBAIC0zOCw4ICszOCw2IEBACiBzdHJ1Y3QgZGliMzAwMF9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7Ci0KIC8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAlzdHJ1Y3QgZGliMzAwMF9jb25maWcgY29uZmlnOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDAuaAppbmRleCAyZDU0NzViLi5lYzkyNzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwLmgKQEAgLTMwLDEwICszMCw2IEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlIGFuZCB0aGUgaTJjIGFkZHJlc3Mgb2YgdGhlIFBMTCAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIHN0cnVjdCBkaWJfZmVfeGZlcl9vcHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWIuYwppbmRleCBhZTU4OWFkLi43YzZkYzdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1iLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYi5jCkBAIC02MCw4ICs2MCw5IEBACiAJZmVfY29kZV9yYXRlX3QgZmVfY3IgPSBGRUNfTk9ORTsKIAlpbnQgc2VhcmNoX3N0YXRlLCBzZXE7CiAKLQlpZiAodHVuZXIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfc2V0KSB7Ci0JCXN0YXRlLT5jb25maWcucGxsX3NldChmZSwgZmVwKTsKKwlpZiAodHVuZXIgJiYgZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBmZXApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCiAJCWRlYl9zZXRmKCJiYW5kd2lkdGg6ICIpOwogCQlzd2l0Y2ggKG9mZG0tPmJhbmR3aWR0aCkgewpAQCAtMzg2LDkgKzM4Nyw2IEBACiAKIAl3cihESUIzMDAwTUJfUkVHX0RBVEFfSU5fRElWRVJTSVRZLCBESUIzMDAwTUJfREFUQV9ESVZFUlNJVFlfSU5fT0ZGKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLnBsbF9pbml0KQotCQlzdGF0ZS0+Y29uZmlnLnBsbF9pbml0KGZlKTsKLQogCXJldHVybiAwOwogfQogCkBAIC03MDcsNyArNzA1LDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+aTJjID0gaTJjOwogCW1lbWNweSgmc3RhdGUtPmNvbmZpZyxjb25maWcsc2l6ZW9mKHN0cnVjdCBkaWIzMDAwX2NvbmZpZykpOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmRpYjMwMDBtYl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgZm9yIHRoZSBjb3JyZWN0IGRlbW9kICovCiAJaWYgKHJkKERJQjMwMDBfUkVHX01BTlVGQUNUT1JfSUQpICE9IERJQjMwMDBfSTJDX0lEX0RJQkNPTSkKQEAgLTcxNyw3ICs3MTQsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkaWIzMDAwbWJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCiAJLyogc2V0IHRoZSB4ZmVyIG9wZXJhdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kaWIzMDAwbWMuYwppbmRleCAzYjMwM2RiLi42YzNiZTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliMzAwMG1jLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjMwMDBtYy5jCkBAIC00NjIsOCArNDYyLDkgQEAKIAlpbnQgc2VhcmNoX3N0YXRlLGF1dG9fdmFsOwogCXUxNiB2YWw7CiAKLQlpZiAodHVuZXIgJiYgc3RhdGUtPmNvbmZpZy5wbGxfc2V0KSB7IC8qIGluaXRpYWwgY2FsbCBmcm9tIGR2YiAqLwotCQlzdGF0ZS0+Y29uZmlnLnBsbF9zZXQoZmUsZmVwKTsKKwlpZiAodHVuZXIgJiYgZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeyAvKiBpbml0aWFsIGNhbGwgZnJvbSBkdmIgKi8KKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgZmVwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAogCQlzdGF0ZS0+bGFzdF90dW5lZF9mcmVxID0gZmVwLT5mcmVxdWVuY3k7CiAJLy8JaWYgKCFzY2FuYm9vc3QpIHsKQEAgLTY0Miw5ICs2NDMsNiBAQAogCiAJc2V0X29yKERJQjMwMDBNQ19SRUdfQ0xLX0NGR183LERJQjMwMDBNQ19DTEtfQ0ZHXzdfRElWX0lOX09GRik7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy5wbGxfaW5pdCkKLQkJc3RhdGUtPmNvbmZpZy5wbGxfaW5pdChmZSk7Ci0KIAlkZWJfaW5mbygiaW5pdCBlbmRcbiIpOwogCXJldHVybiAwOwogfQpAQCAtODM5LDcgKzgzNyw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmkyYyA9IGkyYzsKIAltZW1jcHkoJnN0YXRlLT5jb25maWcsY29uZmlnLHNpemVvZihzdHJ1Y3QgZGliMzAwMF9jb25maWcpKTsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZkaWIzMDAwbWNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNoZWNrIGZvciB0aGUgY29ycmVjdCBkZW1vZCAqLwogCWlmIChyZChESUIzMDAwX1JFR19NQU5VRkFDVE9SX0lEKSAhPSBESUIzMDAwX0kyQ19JRF9ESUJDT00pCkBAIC04NTksNyArODU2LDcgQEAKIAl9CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmRpYjMwMDBtY19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAkvKiBzZXQgdGhlIHhmZXIgb3BlcmF0aW9ucyAqLwpAQCAtODc2LDYgKzg3Myw3IEBACiAJa2ZyZWUoc3RhdGUpOwogCXJldHVybiBOVUxMOwogfQorRVhQT1JUX1NZTUJPTChkaWIzMDAwbWNfYXR0YWNoKTsKIAogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRpYjMwMDBtY19vcHMgPSB7CiAKQEAgLTkxNCw1ICs5MTIsMyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLUVYUE9SVF9TWU1CT0woZGliMzAwMG1jX2F0dGFjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuYwppbmRleCA3OTE3MDZlLi5hMTg5NjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmMKQEAgLTIyNywxMCArMjI3LDEwIEBACiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdHVhNjAzNCk7CiAKIC8qIEluZmluZW9uIFRVQTYwMzQKLSAqIHVzZWQgaW4gTEcgVERWUyBIMDYxRiBhbmQgTEcgVERWUyBIMDYyRgorICogdXNlZCBpbiBMRyBURFZTLUgwNjFGLCBMRyBURFZTLUgwNjJGIGFuZCBMRyBURFZTLUgwNjRGCiAgKi8KLXN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZHZzX3R1YTYwMzQgPSB7Ci0JLm5hbWUgID0gIkxHL0luZmluZW9uIFRVQTYwMzQiLAorc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX2xnX3RkdnNfaDA2eGYgPSB7CisJLm5hbWUgID0gIkxHIFREVlMtSDA2eEYiLAogCS5taW4gICA9ICA1NDAwMDAwMCwKIAkubWF4ICAgPSA4NjMwMDAwMDAsCiAJLmNvdW50ID0gMywKQEAgLTI0MCw3ICsyNDAsNyBAQAogCQl7ICA5OTk5OTk5OTksIDQ0MDAwMDAwLCA2MjUwMCwgMHhjZSwgMHgwNCB9LAogCX0sCiB9OwotRVhQT1JUX1NZTUJPTChkdmJfcGxsX3RkdnNfdHVhNjAzNCk7CitFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfbGdfdGR2c19oMDZ4Zik7CiAKIC8qIFBoaWxpcHMgRk1EMTIxNk1FCiAgKiB1c2VkIGluIE1lZGlvbiBIeWJyaWQgUENNQ0lBIGNhcmQgYW5kIFVTQiBCb3gKQEAgLTQxOSw2ICs0MTksMTkgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGR2Yl9wbGxfdGhvbXNvbl9mZTY2MDApOwogCitzdHJ1Y3QgZHZiX3BsbF9wcml2IHsKKwkvKiBpMmMgZGV0YWlscyAqLworCWludCBwbGxfaTJjX2FkZHJlc3M7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisKKwkvKiB0aGUgUExMIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgZHZiX3BsbF9kZXNjICpwbGxfZGVzYzsKKworCS8qIGNhY2hlZCBmcmVxdWVuY3kvYmFuZHdpZHRoICovCisJdTMyIGZyZXF1ZW5jeTsKKwl1MzIgYmFuZHdpZHRoOworfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKQEAgLTQ0Myw3ICs0NTYsOCBAQAogCWlmIChkZWJ1ZykKIAkJcHJpbnRrKCJwbGw6ICVzOiBmcmVxPSVkIGJ3PSVkIHwgaT0lZC8lZFxuIiwKIAkJICAgICAgIGRlc2MtPm5hbWUsIGZyZXEsIGJhbmR3aWR0aCwgaSwgZGVzYy0+Y291bnQpOwotCUJVR19PTihpID09IGRlc2MtPmNvdW50KTsKKwlpZiAoaSA9PSBkZXNjLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkaXYgPSAoZnJlcSArIGRlc2MtPmVudHJpZXNbaV0ub2Zmc2V0KSAvIGRlc2MtPmVudHJpZXNbaV0uc3RlcHNpemU7CiAJYnVmWzBdID0gZGl2ID4+IDg7CkBAIC00NjIsNiArNDc2LDE2MyBAQAogfQogRVhQT1JUX1NZTUJPTChkdmJfcGxsX2NvbmZpZ3VyZSk7CiAKK3N0YXRpYyBpbnQgZHZiX3BsbF9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCWlmIChmZS0+dHVuZXJfcHJpdikKKwkJa2ZyZWUoZmUtPnR1bmVyX3ByaXYpOworCWZlLT50dW5lcl9wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfcGxsX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwl1OCBidWZbNF07CisJc3RydWN0IGkyY19tc2cgbXNnID0KKwkJeyAuYWRkciA9IHByaXYtPnBsbF9pMmNfYWRkcmVzcywgLmZsYWdzID0gMCwgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisJaW50IGk7CisJaW50IHJlc3VsdDsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5wbGxfZGVzYy0+Y291bnQ7IGkrKykgeworCQlpZiAocHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0ubGltaXQgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBwcml2LT5wbGxfZGVzYy0+Y291bnQpCisJCXJldHVybiAwOworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAwOworCWJ1ZlsyXSA9IHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLmNvbmZpZzsKKwlidWZbM10gPSBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5jYjsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChyZXN1bHQgPSBpMmNfdHJhbnNmZXIocHJpdi0+aTJjLCAmbXNnLCAxKSkgIT0gMSkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl9wbGxfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCit7CisJc3RydWN0IGR2Yl9wbGxfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXU4IGJ1Zls0XTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPQorCQl7IC5hZGRyID0gcHJpdi0+cGxsX2kyY19hZGRyZXNzLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gc2l6ZW9mKGJ1ZikgfTsKKwlpbnQgcmVzdWx0OworCXUzMiBkaXY7CisJaW50IGk7CisJdTMyIGJhbmR3aWR0aCA9IDA7CisKKwlpZiAocHJpdi0+aTJjID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gRFZCVCBiYW5kd2lkdGggb25seSBqdXN0IG5vdworCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSB7CisJCWJhbmR3aWR0aCA9IHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aDsKKwl9CisKKwlpZiAoKHJlc3VsdCA9IGR2Yl9wbGxfY29uZmlndXJlKHByaXYtPnBsbF9kZXNjLCBidWYsIHBhcmFtcy0+ZnJlcXVlbmN5LCBiYW5kd2lkdGgpKSAhPSAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoKHJlc3VsdCA9IGkyY190cmFuc2Zlcihwcml2LT5pMmMsICZtc2csIDEpKSAhPSAxKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLy8gY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgd2Ugc2V0IGl0IHRvCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnBsbF9kZXNjLT5jb3VudDsgaSsrKSB7CisJCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLmxpbWl0KQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5vZmZzZXQpIC8gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uc3RlcHNpemU7CisJcHJpdi0+ZnJlcXVlbmN5ID0gKGRpdiAqIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplKSAtIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLm9mZnNldDsKKwlwcml2LT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdmJfcGxsX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4ICpidWYsIGludCBidWZfbGVuKQoreworCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlpbnQgcmVzdWx0OworCXUzMiBkaXY7CisJaW50IGk7CisJdTMyIGJhbmR3aWR0aCA9IDA7CisKKwlpZiAoYnVmX2xlbiA8IDUpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gRFZCVCBiYW5kd2lkdGggb25seSBqdXN0IG5vdworCWlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSB7CisJCWJhbmR3aWR0aCA9IHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aDsKKwl9CisKKwlpZiAoKHJlc3VsdCA9IGR2Yl9wbGxfY29uZmlndXJlKHByaXYtPnBsbF9kZXNjLCBidWYrMSwgcGFyYW1zLT5mcmVxdWVuY3ksIGJhbmR3aWR0aCkpICE9IDApCisJCXJldHVybiByZXN1bHQ7CisJYnVmWzBdID0gcHJpdi0+cGxsX2kyY19hZGRyZXNzOworCisJLy8gY2FsY3VsYXRlIHRoZSBmcmVxdWVuY3kgd2Ugc2V0IGl0IHRvCisJZm9yIChpID0gMDsgaSA8IHByaXYtPnBsbF9kZXNjLT5jb3VudDsgaSsrKSB7CisJCWlmIChwYXJhbXMtPmZyZXF1ZW5jeSA+IHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLmxpbWl0KQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKwlkaXYgPSAocGFyYW1zLT5mcmVxdWVuY3kgKyBwcml2LT5wbGxfZGVzYy0+ZW50cmllc1tpXS5vZmZzZXQpIC8gcHJpdi0+cGxsX2Rlc2MtPmVudHJpZXNbaV0uc3RlcHNpemU7CisJcHJpdi0+ZnJlcXVlbmN5ID0gKGRpdiAqIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLnN0ZXBzaXplKSAtIHByaXYtPnBsbF9kZXNjLT5lbnRyaWVzW2ldLm9mZnNldDsKKwlwcml2LT5iYW5kd2lkdGggPSBiYW5kd2lkdGg7CisKKwlyZXR1cm4gNTsKK30KKworc3RhdGljIGludCBkdmJfcGxsX2dldF9mcmVxdWVuY3koc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqZnJlcXVlbmN5KQoreworCXN0cnVjdCBkdmJfcGxsX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwkqZnJlcXVlbmN5ID0gcHJpdi0+ZnJlcXVlbmN5OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR2Yl9wbGxfZ2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiYW5kd2lkdGgpCit7CisJc3RydWN0IGR2Yl9wbGxfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCSpiYW5kd2lkdGggPSBwcml2LT5iYW5kd2lkdGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHZiX3R1bmVyX29wcyBkdmJfcGxsX3R1bmVyX29wcyA9IHsKKwkucmVsZWFzZSA9IGR2Yl9wbGxfcmVsZWFzZSwKKwkuc2xlZXAgPSBkdmJfcGxsX3NsZWVwLAorCS5zZXRfcGFyYW1zID0gZHZiX3BsbF9zZXRfcGFyYW1zLAorCS5jYWxjX3JlZ3MgPSBkdmJfcGxsX2NhbGNfcmVncywKKwkuZ2V0X2ZyZXF1ZW5jeSA9IGR2Yl9wbGxfZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2JhbmR3aWR0aCA9IGR2Yl9wbGxfZ2V0X2JhbmR3aWR0aCwKK307CisKK2ludCBkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IHBsbF9hZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZHZiX3BsbF9wcml2ICpwcml2ID0gTlVMTDsKKworCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX3BsbF9wcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHByaXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcml2LT5wbGxfaTJjX2FkZHJlc3MgPSBwbGxfYWRkcjsKKwlwcml2LT5pMmMgPSBpMmM7CisJcHJpdi0+cGxsX2Rlc2MgPSBkZXNjOworCisJbWVtY3B5KCZmZS0+b3BzLnR1bmVyX29wcywgJmR2Yl9wbGxfdHVuZXJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl90dW5lcl9vcHMpKTsKKwlzdHJuY3B5KGZlLT5vcHMudHVuZXJfb3BzLmluZm8ubmFtZSwgZGVzYy0+bmFtZSwgMTI4KTsKKwlmZS0+b3BzLnR1bmVyX29wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXNjLT5taW47CisJZmUtPm9wcy50dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluID0gZGVzYy0+bWF4OworCisJZmUtPnR1bmVyX3ByaXYgPSBwcml2OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkdmJfcGxsX2F0dGFjaCk7CisKIE1PRFVMRV9ERVNDUklQVElPTigiZHZiIHBsbCBsaWJyYXJ5Iik7CiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yi1wbGwuaAppbmRleCAyYjg0NjE3Li42NjM2MWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiLXBsbC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmItcGxsLmgKQEAgLTUsNiArNSw5IEBACiAjaWZuZGVmIF9fRFZCX1BMTF9IX18KICNkZWZpbmUgX19EVkJfUExMX0hfXwogCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisKIHN0cnVjdCBkdmJfcGxsX2Rlc2MgewogCWNoYXIgKm5hbWU7CiAJdTMyICBtaW47CkBAIC0zMSw3ICszNCw3IEBACiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3R1YTYwMTB4czsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfZW52NTdoMXhkNTsKIGV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdHVhNjAzNDsKLWV4dGVybiBzdHJ1Y3QgZHZiX3BsbF9kZXNjIGR2Yl9wbGxfdGR2c190dWE2MDM0OworZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9sZ190ZHZzX2gwNnhmOwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90ZGE2NjV4OwogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF9mbWQxMjE2bWU7CiBleHRlcm4gc3RydWN0IGR2Yl9wbGxfZGVzYyBkdmJfcGxsX3RkZWQ0OwpAQCAtNDQsNyArNDcsMTggQEAKIAogZXh0ZXJuIHN0cnVjdCBkdmJfcGxsX2Rlc2MgZHZiX3BsbF90aG9tc29uX2ZlNjYwMDsKIAotaW50IGR2Yl9wbGxfY29uZmlndXJlKHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MsIHU4ICpidWYsCitleHRlcm4gaW50IGR2Yl9wbGxfY29uZmlndXJlKHN0cnVjdCBkdmJfcGxsX2Rlc2MgKmRlc2MsIHU4ICpidWYsCiAJCSAgICAgIHUzMiBmcmVxLCBpbnQgYmFuZHdpZHRoKTsKIAorLyoqCisgKiBBdHRhY2ggYSBkdmItcGxsIHRvIHRoZSBzdXBwbGllZCBmcm9udGVuZCBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGZlIEZyb250ZW5kIHRvIGF0dGFjaCB0by4KKyAqIEBwYXJhbSBwbGxfYWRkciBpMmMgYWRkcmVzcyBvZiB0aGUgUExMIChpZiB1c2VkKS4KKyAqIEBwYXJhbSBpMmMgaTJjIGFkYXB0ZXIgdG8gdXNlIChzZXQgdG8gTlVMTCBpZiBub3QgdXNlZCkuCisgKiBAcGFyYW0gZGVzYyBkdmJfcGxsX2Rlc2MgdG8gdXNlLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZmFpbHVyZS4KKyAqLworZXh0ZXJuIGludCBkdmJfcGxsX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IHBsbF9hZGRyLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgc3RydWN0IGR2Yl9wbGxfZGVzYyAqZGVzYyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yl9kdW1teV9mZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2R2Yl9kdW1teV9mZS5jCmluZGV4IDY0NTk0NmEuLjYyNzFiMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kdmJfZHVtbXlfZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHZiX2R1bW15X2ZlLmMKQEAgLTMwLDcgKzMwLDYgQEAKIAogCiBzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlIHsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIH07CiAKQEAgLTc3LDYgKzc2LDExIEBACiAKIHN0YXRpYyBpbnQgZHZiX2R1bW15X2ZlX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQogeworCWlmIChmZS0+b3BzLT50dW5lcl9vcHMtPnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy0+dHVuZXJfb3BzLT5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMtPmkyY19nYXRlX2N0cmwpIGZlLT5vcHMtPmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMTYsMTEgKzEyMCw4IEBACiAJc3RhdGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZHZiX2R1bW15X2ZlX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0YXRlID09IE5VTEwpIGdvdG8gZXJyb3I7CiAKLQkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KLQltZW1jcHkoJnN0YXRlLT5vcHMsICZkdmJfZHVtbXlfZmVfb2ZkbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwotCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkdmJfZHVtbXlfZmVfb2ZkbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTEzOSwxMSArMTQwLDggQEAKIAlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkdmJfZHVtbXlfZmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUgPT0gTlVMTCkgZ290byBlcnJvcjsKIAotCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwotCW1lbWNweSgmc3RhdGUtPm9wcywgJmR2Yl9kdW1teV9mZV9xcHNrX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7Ci0KIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmR2Yl9kdW1teV9mZV9xcHNrX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtMTYyLDExICsxNjAsOCBAQAogCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGR2Yl9kdW1teV9mZV9zdGF0ZSksIEdGUF9LRVJORUwpOwogCWlmIChzdGF0ZSA9PSBOVUxMKSBnb3RvIGVycm9yOwogCi0JLyogc2V0dXAgdGhlIHN0YXRlICovCi0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmZHZiX2R1bW15X2ZlX3FhbV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwotCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZkdmJfZHVtbXlfZmVfcWFtX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2lzbDY0MjEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjMzRkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBpc2w2NDIxLmggLSBkcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgSVNMNjQyMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbmRyZXcgZGUgUXVpbmNleQorICogQ29weXJpZ2h0IChDKSAyMDA2IE9saXZlciBFbmRyaXNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqCisgKgorICogdGhlIHByb2plY3QncyBwYWdlIGlzIGF0IGh0dHA6Ly93d3cubGludXh0di5vcmcKKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKKyNpbmNsdWRlICJpc2w2NDIxLmgiCisKK3N0cnVjdCBpc2w2NDIxIHsKKwl1OAkJCWNvbmZpZzsKKwl1OAkJCW92ZXJyaWRlX29yOworCXU4CQkJb3ZlcnJpZGVfYW5kOworCXN0cnVjdCBpMmNfYWRhcHRlcgkqaTJjOworCXU4CQkJaTJjX2FkZHI7CisJdm9pZAkJCSgqcmVsZWFzZV9jaGFpbikoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOworfTsKKworc3RhdGljIGludCBpc2w2NDIxX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCit7CisJc3RydWN0IGlzbDY0MjEgKmlzbDY0MjEgPSAoc3RydWN0IGlzbDY0MjEgKikgZmUtPm1pc2NfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CS5hZGRyID0gaXNsNjQyMS0+aTJjX2FkZHIsIC5mbGFncyA9IDAsCisJCQkJLmJ1ZiA9ICZpc2w2NDIxLT5jb25maWcsCisJCQkJLmxlbiA9IHNpemVvZihpc2w2NDIxLT5jb25maWcpIH07CisKKwlpc2w2NDIxLT5jb25maWcgJj0gfihJU0w2NDIxX1ZTRUwxIHwgSVNMNjQyMV9FTjEpOworCisJc3dpdGNoKHZvbHRhZ2UpIHsKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJaXNsNjQyMS0+Y29uZmlnIHw9IElTTDY0MjFfRU4xOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQlpc2w2NDIxLT5jb25maWcgfD0gKElTTDY0MjFfRU4xIHwgSVNMNjQyMV9WU0VMMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisKKwlpc2w2NDIxLT5jb25maWcgfD0gaXNsNjQyMS0+b3ZlcnJpZGVfb3I7CisJaXNsNjQyMS0+Y29uZmlnICY9IGlzbDY0MjEtPm92ZXJyaWRlX2FuZDsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGlzbDY0MjEtPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBpc2w2NDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXNsNjQyMSAqaXNsNjQyMSA9IChzdHJ1Y3QgaXNsNjQyMSAqKSBmZS0+bWlzY19wcml2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsJLmFkZHIgPSBpc2w2NDIxLT5pMmNfYWRkciwgLmZsYWdzID0gMCwKKwkJCQkuYnVmID0gJmlzbDY0MjEtPmNvbmZpZywKKwkJCQkubGVuID0gc2l6ZW9mKGlzbDY0MjEtPmNvbmZpZykgfTsKKworCWlmIChhcmcpCisJCWlzbDY0MjEtPmNvbmZpZyB8PSBJU0w2NDIxX0xMQzE7CisJZWxzZQorCQlpc2w2NDIxLT5jb25maWcgJj0gfklTTDY0MjFfTExDMTsKKworCWlzbDY0MjEtPmNvbmZpZyB8PSBpc2w2NDIxLT5vdmVycmlkZV9vcjsKKwlpc2w2NDIxLT5jb25maWcgJj0gaXNsNjQyMS0+b3ZlcnJpZGVfYW5kOworCisJcmV0dXJuIChpMmNfdHJhbnNmZXIoaXNsNjQyMS0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBpc2w2NDIxX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IGlzbDY0MjEgKmlzbDY0MjEgPSAoc3RydWN0IGlzbDY0MjEgKikgZmUtPm1pc2NfcHJpdjsKKworCS8qIHBvd2VyIG9mZiAqLworCWlzbDY0MjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7CisKKwkvKiBmcmVlIGRhdGEgJiBjYWxsIG5leHQgcmVsZWFzZSByb3V0aW5lICovCisJZmUtPm9wcy5yZWxlYXNlID0gaXNsNjQyMS0+cmVsZWFzZV9jaGFpbjsKKwlrZnJlZShmZS0+bWlzY19wcml2KTsKKwlmZS0+bWlzY19wcml2ID0gTlVMTDsKKwlpZiAoZmUtPm9wcy5yZWxlYXNlKQorCQlmZS0+b3BzLnJlbGVhc2UoZmUpOworfQorCitpbnQgaXNsNjQyMV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBpMmNfYWRkciwKKwkJICAgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcikKK3sKKwlzdHJ1Y3QgaXNsNjQyMSAqaXNsNjQyMSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpc2w2NDIxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpc2w2NDIxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCWlzbDY0MjEtPmNvbmZpZyA9IElTTDY0MjFfSVNFTDE7CisJaXNsNjQyMS0+aTJjID0gaTJjOworCWlzbDY0MjEtPmkyY19hZGRyID0gaTJjX2FkZHI7CisJZmUtPm1pc2NfcHJpdiA9IGlzbDY0MjE7CisKKwkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzEnICovCisJaXNsNjQyMS0+b3ZlcnJpZGVfb3IgPSBvdmVycmlkZV9zZXQ7CisKKwkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzAnICovCisJaXNsNjQyMS0+b3ZlcnJpZGVfYW5kID0gfm92ZXJyaWRlX2NsZWFyOworCisJLyogZGV0ZWN0IGlmIGl0IGlzIHByZXNlbnQgb3Igbm90ICovCisJaWYgKGlzbDY0MjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRikpIHsKKwkJa2ZyZWUoaXNsNjQyMSk7CisJCWZlLT5taXNjX3ByaXYgPSBOVUxMOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBpbnN0YWxsIHJlbGVhc2UgY2FsbGJhY2sgKi8KKwlpc2w2NDIxLT5yZWxlYXNlX2NoYWluID0gZmUtPm9wcy5yZWxlYXNlOworCWZlLT5vcHMucmVsZWFzZSA9IGlzbDY0MjFfcmVsZWFzZTsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBpc2w2NDIxX3NldF92b2x0YWdlOworCWZlLT5vcHMuZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UgPSBpc2w2NDIxX2VuYWJsZV9oaWdoX2xuYl92b2x0YWdlOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlzbDY0MjFfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgaXNsNjQyMSIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IGRlIFF1aW5jZXkgJiBPbGl2ZXIgRW5kcmlzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2lzbDY0MjEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1ZjgwYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pc2w2NDIxLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIGlzbDY0MjEuaCAtIGRyaXZlciBmb3IgbG5iIHN1cHBseSBhbmQgY29udHJvbCBpYyBJU0w2NDIxCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFuZHJldyBkZSBRdWluY2V5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgT2xpdmVyIEVuZHJpc3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICoKKyAqCisgKiB0aGUgcHJvamVjdCdzIHBhZ2UgaXMgYXQgaHR0cDovL3d3dy5saW51eHR2Lm9yZworICovCisKKyNpZm5kZWYgX0lTTDY0MjFfSAorI2RlZmluZSBfSVNMNjQyMV9ICisKKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKworLyogc3lzdGVtIHJlZ2lzdGVyIGJpdHMgKi8KKyNkZWZpbmUgSVNMNjQyMV9PTEYxCTB4MDEKKyNkZWZpbmUgSVNMNjQyMV9FTjEJMHgwMgorI2RlZmluZSBJU0w2NDIxX1ZTRUwxCTB4MDQKKyNkZWZpbmUgSVNMNjQyMV9MTEMxCTB4MDgKKyNkZWZpbmUgSVNMNjQyMV9FTlQxCTB4MTAKKyNkZWZpbmUgSVNMNjQyMV9JU0VMMQkweDIwCisjZGVmaW5lIElTTDY0MjFfRENMCTB4NDAKKworLyogb3ZlcnJpZGVfc2V0IGFuZCBvdmVycmlkZV9jbGVhciBjb250cm9sIHdoaWNoIHN5c3RlbSByZWdpc3RlciBiaXRzIChhYm92ZSkgdG8gYWx3YXlzIHNldCAmIGNsZWFyICovCitleHRlcm4gaW50IGlzbDY0MjFfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggaTJjX2FkZHIsCisJCQkgIHU4IG92ZXJyaWRlX3NldCwgdTggb3ZlcnJpZGVfY2xlYXIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuYwppbmRleCAxYzdjOTEyLi5mM2JjODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5jCkBAIC0zMiw3ICszMiw2IEBACiAKIHN0cnVjdCBsNjQ3ODFfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3QgbDY0NzgxX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKQEAgLTE0MSw3ICsxNDAsMTAgQEAKIAl1OCB2YWwweDA2OwogCWludCBidyA9IHAtPmJhbmR3aWR0aCAtIEJBTkRXSURUSF84X01IWjsKIAotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHBhcmFtKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwYXJhbSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJaWYgKHBhcmFtLT5pbnZlcnNpb24gIT0gSU5WRVJTSU9OX09OICYmCiAJICAgIHBhcmFtLT5pbnZlcnNpb24gIT0gSU5WRVJTSU9OX09GRikKQEAgLTQ2Myw4ICs0NjUsNiBAQAogCS8qIEV2ZXJ5dGhpbmcgaXMgdHdvJ3MgY29tcGxlbWVudCwgc29mdCBiaXQgYW5kIENTSV9PVVQgdG9vICovCiAJbDY0NzgxX3dyaXRlcmVnIChzdGF0ZSwgMHgxZSwgMHgwOSk7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQogCS8qIGRlbGF5IGEgYml0IGFmdGVyIGZpcnN0IGluaXQgYXR0ZW1wdCAqLwogCWlmIChzdGF0ZS0+Zmlyc3QpIHsKIAkJc3RhdGUtPmZpcnN0ID0gMDsKQEAgLTUwOCw3ICs1MDgsNiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZsNjQ3ODFfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+Zmlyc3QgPSAxOwogCiAJLyoqCkBAIC01NTQsNyArNTUzLDcgQEAKIAl9CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmw2NDc4MV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sNjQ3ODEuaAppbmRleCA5NDdmNjVmLi44M2I4YmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbDY0NzgxLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2w2NDc4MS5oCkBAIC0yOSwxMCArMjksNiBAQAogewogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnX2gwNnhmLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdfaDA2eGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTRkNTFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnX2gwNnhmLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqICBsZ19oMDZ4Zi5oIC0gQVRTQyBUdW5lciBzdXBwb3J0IGZvciBMRyBURFZTLUgwNnhGCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaWZuZGVmIF9MR19IMDZYRl9IXworI2RlZmluZSBfTEdfSDA2WEZfSF8KKyNpbmNsdWRlICJkdmItcGxsLmgiCisKK3N0YXRpYyBpbnQgbGdfaDA2eGZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGkyY19hZGFwdGVyKiBpMmNfYWRhcCwKKwkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3sKKwl1OCBidWZbNF07CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4NjEsIC5mbGFncyA9IDAsCisJCQkgICAgICAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IHNpemVvZihidWYpIH07CisJaW50IGVycjsKKworCWR2Yl9wbGxfY29uZmlndXJlKCZkdmJfcGxsX2xnX3RkdnNfaDA2eGYsIGJ1ZiwgcGFyYW1zLT5mcmVxdWVuY3ksIDApOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoaTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnX2gwNnhmOiAlcyBlcnJvciAiCisJCQkiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCS8qIFNldCB0aGUgQXV4aWxpYXJ5IEJ5dGUuICovCisJYnVmWzBdID0gYnVmWzJdOworCWJ1ZlswXSAmPSB+MHgyMDsKKwlidWZbMF0gfD0gMHgxODsKKwlidWZbMV0gPSAweDUwOworCW1zZy5sZW4gPSAyOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoaTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxnX2gwNnhmOiAlcyBlcnJvciAiCisJCQkiKGFkZHIgJTAyeCA8LSAlMDJ4LCBlcnIgPSAlaSlcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGJ1ZlswXSwgYnVmWzFdLCBlcnIpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVsc2UKKwkJCXJldHVybiAtRVJFTU9URUlPOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCmluZGV4IDQ2OTFhYzUuLjZlOGFkMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sZ2R0MzMweC5jCkBAIC0yOSw2ICsyOSw3IEBACiAgKiAgIERWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlCiAgKiAgIERWaUNPIEZ1c2lvbkhEVFYgNSBVU0IgR29sZAogICogICBBaXIyUEMvQWlyU3RhciAyIEFUU0MgM3JkIGdlbmVyYXRpb24gKEhENTAwMCkKKyAqICAgcGNIRFRWIEhENTUwMAogICoKICAqIFRPRE86CiAgKiBzaWduYWwgc3RyZW5ndGggYWx3YXlzIHJldHVybnMgMC4KQEAgLTU5LDcgKzYwLDYgQEAKIHN0cnVjdCBsZ2R0MzMweF9zdGF0ZQogewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAogCS8qIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgbGdkdDMzMHhfY29uZmlnKiBjb25maWc7CkBAIC0zOTksOCArMzk5LDEwIEBACiAJfQogCiAJLyogVHVuZSB0byB0aGUgc3BlY2lmaWVkIGZyZXF1ZW5jeSAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KQotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwYXJhbSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAogCS8qIEtlZXAgdHJhY2sgb2YgdGhlIG5ldyBmcmVxdWVuY3kgKi8KIAkvKiBGSVhNRSB0aGlzIGlzIHRoZSB3cm9uZyB3YXkgdG8gZG8gdGhpcy4uLiAgICAgICAgICAgKi8KQEAgLTY3Miw2ICs2NzQsNyBAQAogCiAJaWYgKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPT0gVlNCXzgpIHsKIAorCQlpMmNfcmVhZF9kZW1vZF9ieXRlcyhzdGF0ZSwgMHg2ZSwgYnVmLCA1KTsKIAkJLyogUGhhc2UgVHJhY2tlciBNZWFuLVNxdWFyZSBFcnJvciBSZWdpc3RlciBmb3IgVlNCICovCiAJCW5vaXNlID0gKChidWZbMF0gJiA3KSA8PCAxNikgfCAoYnVmWzNdIDw8IDgpIHwgYnVmWzRdOwogCX0gZWxzZSB7CkBAIC03MjEsMTYgKzcyNCwxOSBAQAogCS8qIFNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKKworCS8qIENyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KIAlzd2l0Y2ggKGNvbmZpZy0+ZGVtb2RfY2hpcCkgewogCWNhc2UgTEdEVDMzMDI6Ci0JCW1lbWNweSgmc3RhdGUtPm9wcywgJmxnZHQzMzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmxnZHQzMzAyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJCWJyZWFrOwogCWNhc2UgTEdEVDMzMDM6Ci0JCW1lbWNweSgmc3RhdGUtPm9wcywgJmxnZHQzMzAzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJmxnZHQzMzAzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWdvdG8gZXJyb3I7CiAJfQorCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAKIAkvKiBWZXJpZnkgY29tbXVuaWNhdGlvbiB3aXRoIGRlbW9kIGNoaXAgKi8KIAlpZiAoaTJjX3JlYWRfZGVtb2RfYnl0ZXMoc3RhdGUsIDIsIGJ1ZiwgMSkpCkBAIC03MzksOSArNzQ1LDYgQEAKIAlzdGF0ZS0+Y3VycmVudF9mcmVxdWVuY3kgPSAtMTsKIAlzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uID0gLTE7CiAKLQkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOwotCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKIGVycm9yOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xnZHQzMzB4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaAppbmRleCAyYTY1MjljLi5iYWQ5MDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbGdkdDMzMHguaApAQCAtNDMsNyArNDMsNiBAQAogCiAJLyogUExMIGludGVyZmFjZSAqLwogCWludCAoKnBsbF9yZl9zZXQpIChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGluZGV4KTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogCiAJLyogTmVlZCB0byBzZXQgZGV2aWNlIHBhcmFtIGZvciBzdGFydF9kbWEgKi8KIAlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzM2VkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuYwpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIGxuYnAyMS5oIC0gZHJpdmVyIGZvciBsbmIgc3VwcGx5IGFuZCBjb250cm9sIGljIGxuYnAyMQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBPbGl2ZXIgRW5kcmlzcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKgorICoKKyAqIHRoZSBwcm9qZWN0J3MgcGFnZSBpcyBhdCBodHRwOi8vd3d3LmxpbnV4dHYub3JnCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAibG5icDIxLmgiCisKK3N0cnVjdCBsbmJwMjEgeworCXU4CQkJY29uZmlnOworCXU4CQkJb3ZlcnJpZGVfb3I7CisJdTgJCQlvdmVycmlkZV9hbmQ7CisJc3RydWN0IGkyY19hZGFwdGVyCSppMmM7CisJdm9pZAkJCSgqcmVsZWFzZV9jaGFpbikoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOworfTsKKworc3RhdGljIGludCBsbmJwMjFfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKK3sKKwlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSAoc3RydWN0IGxuYnAyMSAqKSBmZS0+bWlzY19wcml2OworCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsJLmFkZHIgPSAweDA4LCAuZmxhZ3MgPSAwLAorCQkJCS5idWYgPSAmbG5icDIxLT5jb25maWcsCisJCQkJLmxlbiA9IHNpemVvZihsbmJwMjEtPmNvbmZpZykgfTsKKworCWxuYnAyMS0+Y29uZmlnICY9IH4oTE5CUDIxX1ZTRUwgfCBMTkJQMjFfRU4pOworCisJc3dpdGNoKHZvbHRhZ2UpIHsKKwljYXNlIFNFQ19WT0xUQUdFX09GRjoKKwkJYnJlYWs7CisJY2FzZSBTRUNfVk9MVEFHRV8xMzoKKwkJbG5icDIxLT5jb25maWcgfD0gTE5CUDIxX0VOOworCQlicmVhazsKKwljYXNlIFNFQ19WT0xUQUdFXzE4OgorCQlsbmJwMjEtPmNvbmZpZyB8PSAoTE5CUDIxX0VOIHwgTE5CUDIxX1ZTRUwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJbG5icDIxLT5jb25maWcgfD0gbG5icDIxLT5vdmVycmlkZV9vcjsKKwlsbmJwMjEtPmNvbmZpZyAmPSBsbmJwMjEtPm92ZXJyaWRlX2FuZDsKKworCXJldHVybiAoaTJjX3RyYW5zZmVyKGxuYnAyMS0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOworfQorCitzdGF0aWMgaW50IGxuYnAyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgbG9uZyBhcmcpCit7CisJc3RydWN0IGxuYnAyMSAqbG5icDIxID0gKHN0cnVjdCBsbmJwMjEgKikgZmUtPm1pc2NfcHJpdjsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CS5hZGRyID0gMHgwOCwgLmZsYWdzID0gMCwKKwkJCQkuYnVmID0gJmxuYnAyMS0+Y29uZmlnLAorCQkJCS5sZW4gPSBzaXplb2YobG5icDIxLT5jb25maWcpIH07CisKKwlpZiAoYXJnKQorCQlsbmJwMjEtPmNvbmZpZyB8PSBMTkJQMjFfTExDOworCWVsc2UKKwkJbG5icDIxLT5jb25maWcgJj0gfkxOQlAyMV9MTEM7CisKKwlsbmJwMjEtPmNvbmZpZyB8PSBsbmJwMjEtPm92ZXJyaWRlX29yOworCWxuYnAyMS0+Y29uZmlnICY9IGxuYnAyMS0+b3ZlcnJpZGVfYW5kOworCisJcmV0dXJuIChpMmNfdHJhbnNmZXIobG5icDIxLT5pMmMsICZtc2csIDEpID09IDEpID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyB2b2lkIGxuYnAyMV9yZWxlYXNlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IChzdHJ1Y3QgbG5icDIxICopIGZlLT5taXNjX3ByaXY7CisKKwkvKiBMTkJQIHBvd2VyIG9mZiAqLworCWxuYnAyMV9zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKTsKKworCS8qIGZyZWUgZGF0YSAmIGNhbGwgbmV4dCByZWxlYXNlIHJvdXRpbmUgKi8KKwlmZS0+b3BzLnJlbGVhc2UgPSBsbmJwMjEtPnJlbGVhc2VfY2hhaW47CisJa2ZyZWUoZmUtPm1pc2NfcHJpdik7CisJZmUtPm1pc2NfcHJpdiA9IE5VTEw7CisJaWYgKGZlLT5vcHMucmVsZWFzZSkKKwkJZmUtPm9wcy5yZWxlYXNlKGZlKTsKK30KKworaW50IGxuYnAyMV9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBvdmVycmlkZV9zZXQsIHU4IG92ZXJyaWRlX2NsZWFyKQoreworCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbmJwMjEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxuYnAyMSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKi8KKwlsbmJwMjEtPmNvbmZpZyA9IExOQlAyMV9JU0VMOworCWxuYnAyMS0+aTJjID0gaTJjOworCWZlLT5taXNjX3ByaXYgPSBsbmJwMjE7CisKKwkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzEnICovCisJbG5icDIxLT5vdmVycmlkZV9vciA9IG92ZXJyaWRlX3NldDsKKworCS8qIGJpdHMgd2hpY2ggc2hvdWxkIGJlIGZvcmNlZCB0byAnMCcgKi8KKwlsbmJwMjEtPm92ZXJyaWRlX2FuZCA9IH5vdmVycmlkZV9jbGVhcjsKKworCS8qIGRldGVjdCBpZiBpdCBpcyBwcmVzZW50IG9yIG5vdCAqLworCWlmIChsbmJwMjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRikpIHsKKwkJa2ZyZWUobG5icDIxKTsKKwkJZmUtPm1pc2NfcHJpdiA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGluc3RhbGwgcmVsZWFzZSBjYWxsYmFjayAqLworCWxuYnAyMS0+cmVsZWFzZV9jaGFpbiA9IGZlLT5vcHMucmVsZWFzZTsKKwlmZS0+b3BzLnJlbGVhc2UgPSBsbmJwMjFfcmVsZWFzZTsKKworCS8qIG92ZXJyaWRlIGZyb250ZW5kIG9wcyAqLworCWZlLT5vcHMuc2V0X3ZvbHRhZ2UgPSBsbmJwMjFfc2V0X3ZvbHRhZ2U7CisJZmUtPm9wcy5lbmFibGVfaGlnaF9sbmJfdm9sdGFnZSA9IGxuYnAyMV9lbmFibGVfaGlnaF9sbmJfdm9sdGFnZTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChsbmJwMjFfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGxuYiBzdXBwbHkgYW5kIGNvbnRyb2wgaWMgbG5icDIxIik7CitNT0RVTEVfQVVUSE9SKCJPbGl2ZXIgRW5kcmlzcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2xuYnAyMS5oCmluZGV4IDBkY2JlNjEuLjA0N2E0YWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9sbmJwMjEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbG5icDIxLmgKQEAgLTI3LDcgKzI3LDcgQEAKICNpZm5kZWYgX0xOQlAyMV9ICiAjZGVmaW5lIF9MTkJQMjFfSAogCi0vKiBzeXN0ZW0gcmVnaXN0ZXIgKi8KKy8qIHN5c3RlbSByZWdpc3RlciBiaXRzICovCiAjZGVmaW5lIExOQlAyMV9PTEYJMHgwMQogI2RlZmluZSBMTkJQMjFfT1RGCTB4MDIKICNkZWZpbmUgTE5CUDIxX0VOCTB4MDQKQEAgLTM3LDEwMyArMzcsOSBAQAogI2RlZmluZSBMTkJQMjFfSVNFTAkweDQwCiAjZGVmaW5lIExOQlAyMV9QQ0wJMHg4MAogCi1zdHJ1Y3QgbG5icDIxIHsKLQl1OAkJCWNvbmZpZzsKLQl1OAkJCW92ZXJyaWRlX29yOwotCXU4CQkJb3ZlcnJpZGVfYW5kOwotCXN0cnVjdCBpMmNfYWRhcHRlcgkqaTJjOwotCXZvaWQJCQkoKnJlbGVhc2VfY2hhaW4pKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLX07CisjaW5jbHVkZSA8bGludXgvZHZiL2Zyb250ZW5kLmg+CiAKLXN0YXRpYyBpbnQgbG5icDIxX3NldF92b2x0YWdlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zZWNfdm9sdGFnZV90IHZvbHRhZ2UpCi17Ci0Jc3RydWN0IGxuYnAyMSAqbG5icDIxID0gKHN0cnVjdCBsbmJwMjEgKikgZmUtPm1pc2NfcHJpdjsKLQlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CS5hZGRyID0gMHgwOCwgLmZsYWdzID0gMCwKLQkJCQkuYnVmID0gJmxuYnAyMS0+Y29uZmlnLAotCQkJCS5sZW4gPSBzaXplb2YobG5icDIxLT5jb25maWcpIH07Ci0KLQlsbmJwMjEtPmNvbmZpZyAmPSB+KExOQlAyMV9WU0VMIHwgTE5CUDIxX0VOKTsKLQotCXN3aXRjaCh2b2x0YWdlKSB7Ci0JY2FzZSBTRUNfVk9MVEFHRV9PRkY6Ci0JCWJyZWFrOwotCWNhc2UgU0VDX1ZPTFRBR0VfMTM6Ci0JCWxuYnAyMS0+Y29uZmlnIHw9IExOQlAyMV9FTjsKLQkJYnJlYWs7Ci0JY2FzZSBTRUNfVk9MVEFHRV8xODoKLQkJbG5icDIxLT5jb25maWcgfD0gKExOQlAyMV9FTiB8IExOQlAyMV9WU0VMKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLQotCWxuYnAyMS0+Y29uZmlnIHw9IGxuYnAyMS0+b3ZlcnJpZGVfb3I7Ci0JbG5icDIxLT5jb25maWcgJj0gbG5icDIxLT5vdmVycmlkZV9hbmQ7Ci0KLQlyZXR1cm4gKGkyY190cmFuc2ZlcihsbmJwMjEtPmkyYywgJm1zZywgMSkgPT0gMSkgPyAwIDogLUVJTzsKLX0KLQotc3RhdGljIGludCBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGxvbmcgYXJnKQotewotCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IChzdHJ1Y3QgbG5icDIxICopIGZlLT5taXNjX3ByaXY7Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0gewkuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsCi0JCQkJLmJ1ZiA9ICZsbmJwMjEtPmNvbmZpZywKLQkJCQkubGVuID0gc2l6ZW9mKGxuYnAyMS0+Y29uZmlnKSB9OwotCi0JaWYgKGFyZykKLQkJbG5icDIxLT5jb25maWcgfD0gTE5CUDIxX0xMQzsKLQllbHNlCi0JCWxuYnAyMS0+Y29uZmlnICY9IH5MTkJQMjFfTExDOwotCi0JbG5icDIxLT5jb25maWcgfD0gbG5icDIxLT5vdmVycmlkZV9vcjsKLQlsbmJwMjEtPmNvbmZpZyAmPSBsbmJwMjEtPm92ZXJyaWRlX2FuZDsKLQotCXJldHVybiAoaTJjX3RyYW5zZmVyKGxuYnAyMS0+aTJjLCAmbXNnLCAxKSA9PSAxKSA/IDAgOiAtRUlPOwotfQotCi1zdGF0aWMgdm9pZCBsbmJwMjFfZXhpdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlzdHJ1Y3QgbG5icDIxICpsbmJwMjEgPSAoc3RydWN0IGxuYnAyMSAqKSBmZS0+bWlzY19wcml2OwotCi0JLyogTE5CUCBwb3dlciBvZmYgKi8KLQlsbmJwMjFfc2V0X3ZvbHRhZ2UoZmUsIFNFQ19WT0xUQUdFX09GRik7Ci0KLQkvKiBmcmVlIGRhdGEgJiBjYWxsIG5leHQgcmVsZWFzZSByb3V0aW5lICovCi0JZmUtPm9wcy0+cmVsZWFzZSA9IGxuYnAyMS0+cmVsZWFzZV9jaGFpbjsKLQlrZnJlZShmZS0+bWlzY19wcml2KTsKLQlmZS0+bWlzY19wcml2ID0gTlVMTDsKLQlpZiAoZmUtPm9wcy0+cmVsZWFzZSkKLQkJZmUtPm9wcy0+cmVsZWFzZShmZSk7Ci19Ci0KLXN0YXRpYyBpbnQgbG5icDIxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBvdmVycmlkZV9zZXQsIHU4IG92ZXJyaWRlX2NsZWFyKQotewotCXN0cnVjdCBsbmJwMjEgKmxuYnAyMSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsbmJwMjEpLCBHRlBfS0VSTkVMKTsKLQotCWlmICghbG5icDIxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLwotCWxuYnAyMS0+Y29uZmlnID0gTE5CUDIxX0lTRUw7Ci0KLQkvKiBiaXRzIHdoaWNoIHNob3VsZCBiZSBmb3JjZWQgdG8gJzEnICovCi0JbG5icDIxLT5vdmVycmlkZV9vciA9IG92ZXJyaWRlX3NldDsKLQotCS8qIGJpdHMgd2hpY2ggc2hvdWxkIGJlIGZvcmNlZCB0byAnMCcgKi8KLQlsbmJwMjEtPm92ZXJyaWRlX2FuZCA9IH5vdmVycmlkZV9jbGVhcjsKLQotCS8qIGluc3RhbGwgcmVsZWFzZSBjYWxsYmFjayAqLwotCWxuYnAyMS0+cmVsZWFzZV9jaGFpbiA9IGZlLT5vcHMtPnJlbGVhc2U7Ci0JZmUtPm9wcy0+cmVsZWFzZSA9IGxuYnAyMV9leGl0OwotCi0JLyogb3ZlcnJpZGUgZnJvbnRlbmQgb3BzICovCi0JZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBsbmJwMjFfc2V0X3ZvbHRhZ2U7Ci0JZmUtPm9wcy0+ZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2UgPSBsbmJwMjFfZW5hYmxlX2hpZ2hfbG5iX3ZvbHRhZ2U7Ci0KLQlsbmJwMjEtPmkyYyA9IGkyYzsKLQlmZS0+bWlzY19wcml2ID0gbG5icDIxOwotCi0JcmV0dXJuIGxuYnAyMV9zZXRfdm9sdGFnZShmZSwgU0VDX1ZPTFRBR0VfT0ZGKTsKLX0KKy8qIG92ZXJyaWRlX3NldCBhbmQgb3ZlcnJpZGVfY2xlYXIgY29udHJvbCB3aGljaCBzeXN0ZW0gcmVnaXN0ZXIgYml0cyAoYWJvdmUpIHRvIGFsd2F5cyBzZXQgJiBjbGVhciAqLworZXh0ZXJuIGludCBsbmJwMjFfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgdTggb3ZlcnJpZGVfc2V0LCB1OCBvdmVycmlkZV9jbGVhcik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwppbmRleCBkM2FlYTgzLi4xZWY4MjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzMTIuYwpAQCAtMzksNyArMzksNiBAQAogCiBzdHJ1Y3QgbXQzMTJfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IG10MzEyX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yNzcsMTIgKzI3Niw2IEBACiAJaWYgKChyZXQgPSBtdDMxMl93cml0ZXJlZyhzdGF0ZSwgQ1NfU1dfTElNLCAweDY5KSkgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCW10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHg0MCk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQkJbXQzMTJfd3JpdGVyZWcoc3RhdGUsIEdQUF9DVFJMLCAweDAwKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDc3LDE2ICs0NzAsMTYgQEAKIAogCWRwcmludGsoIiVzOiBGcmVxICVkXG4iLCBfX0ZVTkNUSU9OX18sIHAtPmZyZXF1ZW5jeSk7CiAKLQlpZiAoKHAtPmZyZXF1ZW5jeSA8IGZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21pbikKLQkgICAgfHwgKHAtPmZyZXF1ZW5jeSA+IGZlLT5vcHMtPmluZm8uZnJlcXVlbmN5X21heCkpCisJaWYgKChwLT5mcmVxdWVuY3kgPCBmZS0+b3BzLmluZm8uZnJlcXVlbmN5X21pbikKKwkgICAgfHwgKHAtPmZyZXF1ZW5jeSA+IGZlLT5vcHMuaW5mby5mcmVxdWVuY3lfbWF4KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoKHAtPmludmVyc2lvbiA8IElOVkVSU0lPTl9PRkYpCiAJICAgIHx8IChwLT5pbnZlcnNpb24gPiBJTlZFUlNJT05fT04pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICgocC0+dS5xcHNrLnN5bWJvbF9yYXRlIDwgZmUtPm9wcy0+aW5mby5zeW1ib2xfcmF0ZV9taW4pCi0JICAgIHx8IChwLT51LnFwc2suc3ltYm9sX3JhdGUgPiBmZS0+b3BzLT5pbmZvLnN5bWJvbF9yYXRlX21heCkpCisJaWYgKChwLT51LnFwc2suc3ltYm9sX3JhdGUgPCBmZS0+b3BzLmluZm8uc3ltYm9sX3JhdGVfbWluKQorCSAgICB8fCAocC0+dS5xcHNrLnN5bWJvbF9yYXRlID4gZmUtPm9wcy5pbmZvLnN5bWJvbF9yYXRlX21heCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKChwLT51LnFwc2suZmVjX2lubmVyIDwgRkVDX05PTkUpCkBAIC01MjksOSArNTIyLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW10MzEyX3dyaXRlcmVnKHN0YXRlLCBHUFBfQ1RSTCwgMHg0MCk7Ci0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7Ci0JbXQzMTJfd3JpdGVyZWcoc3RhdGUsIEdQUF9DVFJMLCAweDAwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAkvKiBzciA9ICh1MTYpKHNyICogMjU2LjAgLyAxMDAwMDAwLjApICovCiAJc3IgPSBtdDMxMl9kaXYocC0+dS5xcHNrLnN5bWJvbF9yYXRlICogNCwgMTU2MjUpOwpAQCAtNTc4LDYgKzU3MiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG10MzEyX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IG10MzEyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gbXQzMTJfd3JpdGVyZWcoc3RhdGUsIEdQUF9DVFJMLCAweDQwKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gbXQzMTJfd3JpdGVyZWcoc3RhdGUsIEdQUF9DVFJMLCAweDAwKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgbXQzMTJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IG10MzEyX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNjMzLDYgKzYzOCw3IEBACiAKIAkuaW5pdCA9IG10MzEyX2luaXRmZSwKIAkuc2xlZXAgPSBtdDMxMl9zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IG10MzEyX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gbXQzMTJfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBtdDMxMl9nZXRfZnJvbnRlbmQsCkBAIC02NjMsMTkgKzY2OSwyMiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ2cDMxMF9tdDMxMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCiAJaWYgKG10MzEyX3JlYWRyZWcoc3RhdGUsIElELCAmc3RhdGUtPmlkKSA8IDApCiAJCWdvdG8gZXJyb3I7CiAKKwkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdnAzMTBfbXQzMTJfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCiAJc3dpdGNoIChzdGF0ZS0+aWQpIHsKIAljYXNlIElEX1ZQMzEwOgotCQlzdHJjcHkoc3RhdGUtPm9wcy5pbmZvLm5hbWUsICJaYXJsaW5rIFZQMzEwIERWQi1TIik7CisJCXN0cmNweShzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8ubmFtZSwgIlphcmxpbmsgVlAzMTAgRFZCLVMiKTsKIAkJc3RhdGUtPmZyZXF1ZW5jeSA9IDkwOwogCQlicmVhazsKIAljYXNlIElEX01UMzEyOgotCQlzdHJjcHkoc3RhdGUtPm9wcy5pbmZvLm5hbWUsICJaYXJsaW5rIE1UMzEyIERWQi1TIik7CisJCXN0cmNweShzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8ubmFtZSwgIlphcmxpbmsgTVQzMTIgRFZCLVMiKTsKIAkJc3RhdGUtPmZyZXF1ZW5jeSA9IDYwOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNjgzLDkgKzY5Miw2IEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKLQlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDMxMi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKaW5kZXggMDc0ZDg0NC4uNjY2YTFiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzEyLmgKQEAgLTMyLDEwICszMiw2IEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogc3RydWN0IGR2Yl9mcm9udGVuZCogdnAzMTBfbXQzMTJfYXR0YWNoKGNvbnN0IHN0cnVjdCBtdDMxMl9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9tdDM1Mi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKaW5kZXggYWFhZWM5MC4uNWRlNzM3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKIHN0cnVjdCBtdDM1Ml9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAKIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJc3RydWN0IG10MzUyX2NvbmZpZyBjb25maWc7CkBAIC0yODYsMTYgKzI4NSwyNSBAQAogCiAJbXQzNTJfY2FsY19ub21pbmFsX3JhdGUoc3RhdGUsIG9wLT5iYW5kd2lkdGgsIGJ1Zis0KTsKIAltdDM1Ml9jYWxjX2lucHV0X2ZyZXEoc3RhdGUsIGJ1Zis2KTsKLQlzdGF0ZS0+Y29uZmlnLnBsbF9zZXQoZmUsIHBhcmFtLCBidWYrOCk7CiAKLQltdDM1Ml93cml0ZShmZSwgYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKHN0YXRlLT5jb25maWcubm9fdHVuZXIpIHsKLQkJLyogc3RhcnQgZGVjb2RpbmcgKi8KKwkJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKwkJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwkJfQorCisJCW10MzUyX3dyaXRlKGZlLCBidWYsIDgpOwogCQltdDM1Ml93cml0ZShmZSwgZnNtX2dvLCAyKTsKIAl9IGVsc2UgewotCQkvKiBzdGFydCB0dW5pbmcgKi8KLQkJbXQzNTJfd3JpdGUoZmUsIHR1bmVyX2dvLCAyKTsKKwkJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncykgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzKGZlLCBwYXJhbSwgYnVmKzgsIDUpOworCQkJYnVmWzhdIDw8PSAxOworCQkJbXQzNTJfd3JpdGUoZmUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQkJbXQzNTJfd3JpdGUoZmUsIHR1bmVyX2dvLCAyKTsKKwkJfQogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC01NDEsMTMgKzU0OSwxMiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5pMmMgPSBpMmM7CiAJbWVtY3B5KCZzdGF0ZS0+Y29uZmlnLGNvbmZpZyxzaXplb2Yoc3RydWN0IG10MzUyX2NvbmZpZykpOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJm10MzUyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAobXQzNTJfcmVhZF9yZWdpc3RlcihzdGF0ZSwgQ0hJUF9JRCkgIT0gSURfTVQzNTIpIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJm10MzUyX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL210MzUyLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAppbmRleCAwMzA0MGNkLi45ZTdmZjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbXQzNTIuaApAQCAtNDksMTIgKzQ5LDYgQEAKIAogCS8qIEluaXRpYWxpc2UgdGhlIGRlbW9kdWxhdG9yIGFuZCBQTEwuIENhbm5vdCBiZSBOVUxMICovCiAJaW50ICgqZGVtb2RfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCi0JLyogUExMIHNldHVwIC0gZmlsbCBvdXQgdGhlIHN1cHBsaWVkIDUgYnl0ZSBidWZmZXIgd2l0aCB5b3VyIFBMTCBzZXR0aW5ncy4KLQkgKiBieXRlMDogU2V0IHRvIHBsbCBpMmMgYWRkcmVzcyAobm9ubGludXg7IGxlZnQgc2hpZnRlZCBieSAxKQotCSAqIGJ5dGUxLTQ6IFBMTCBjb25maWd1cmF0aW9uLgotCSAqLwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywgdTgqIHBsbGJ1Zik7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogbXQzNTJfYXR0YWNoKGNvbnN0IHN0cnVjdCBtdDM1Ml9jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jCmluZGV4IDllMzUzNTM5Li41NTY3MWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmMKQEAgLTU1LDcgKzU1LDYgQEAKIHN0cnVjdCBueHQyMDB4X3N0YXRlIHsKIAogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3Qgbnh0MjAweF9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC0zMzMsMTcgKzMzMiwxNyBAQAogCiAJZHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXyk7CiAKLQlkcHJpbnRrKCJUdW5lciBCeXRlczogJTAyWCAlMDJYICUwMlggJTAyWFxuIiwgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwgZGF0YVszXSk7CisJZHByaW50aygiVHVuZXIgQnl0ZXM6ICUwMlggJTAyWCAlMDJYICUwMlhcbiIsIGRhdGFbMV0sIGRhdGFbMl0sIGRhdGFbM10sIGRhdGFbNF0pOwogCiAJLyogaWYgTlhUMjAwNCwgd3JpdGUgZGlyZWN0bHkgdG8gdHVuZXIuIGlmIE5YVDIwMDIsIHdyaXRlIHRocm91Z2ggTlhUIGNoaXAuCiAJICogZGlyZWN0IHdyaXRlIGlzIHJlcXVpcmVkIGZvciBQaGlsaXBzIFRVVjEyMzZEIGFuZCBBTFBTIFRESFUyICovCiAJc3dpdGNoIChzdGF0ZS0+ZGVtb2RfY2hpcCkgewogCQljYXNlIE5YVDIwMDQ6Ci0JCQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzLCBkYXRhLCA0KSkKKwkJCWlmIChpMmNfd3JpdGVieXRlcyhzdGF0ZSwgZGF0YVswXSwgZGF0YSsxLCA0KSkKIAkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJueHQyMDB4OiBlcnJvciB3cml0aW5nIHRvIHR1bmVyXG4iKTsKIAkJCS8qIHdhaXQgdW50aWwgd2UgaGF2ZSBhIGxvY2sgKi8KIAkJCXdoaWxlIChjb3VudCA8IDIwKSB7Ci0JCQkJaTJjX3JlYWRieXRlcyhzdGF0ZSwgc3RhdGUtPmNvbmZpZy0+cGxsX2FkZHJlc3MsICZidWYsIDEpOworCQkJCWkyY19yZWFkYnl0ZXMoc3RhdGUsIGRhdGFbMF0sICZidWYsIDEpOwogCQkJCWlmIChidWYgJiAweDQwKQogCQkJCQlyZXR1cm4gMDsKIAkJCQltc2xlZXAoMTAwKTsKQEAgLTM2MSwxMCArMzYwLDEwIEBACiAJCQlueHQyMDB4X3dyaXRlYnl0ZXMoc3RhdGUsIDB4MzQsICZidWYsIDEpOwogCiAJCQkvKiB3cml0ZSBhY3R1YWwgdHVuZXIgYnl0ZXMgKi8KLQkJCW54dDIwMHhfd3JpdGVieXRlcyhzdGF0ZSwgMHgzNiwgZGF0YSwgNCk7CisJCQlueHQyMDB4X3dyaXRlYnl0ZXMoc3RhdGUsIDB4MzYsIGRhdGErMSwgNCk7CiAKIAkJCS8qIHNldCB0dW5lciBpMmMgYWRkcmVzcyAqLwotCQkJYnVmID0gc3RhdGUtPmNvbmZpZy0+cGxsX2FkZHJlc3M7CisJCQlidWYgPSBkYXRhWzBdIDw8IDE7CiAJCQlueHQyMDB4X3dyaXRlYnl0ZXMoc3RhdGUsIDB4MzUsICZidWYsIDEpOwogCiAJCQkvKiB3cml0ZSBVQyBPcG1vZGUgdG8gYmVnaW4gdHJhbnNmZXIgKi8KQEAgLTUzNCw3ICs1MzMsNyBAQAogCQkJCQkgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3Qgbnh0MjAweF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKLQl1OCBidWZbNF07CisJdTggYnVmWzVdOwogCiAJLyogc3RvcCB0aGUgbWljcm8gZmlyc3QgKi8KIAlueHQyMDB4X21pY3JvY29udHJvbGxlcl9zdG9wKHN0YXRlKTsKQEAgLTU0OCw3ICs1NDcsOSBAQAogCX0KIAogCS8qIGdldCB0dW5pbmcgaW5mb3JtYXRpb24gKi8KLQlkdmJfcGxsX2NvbmZpZ3VyZShzdGF0ZS0+Y29uZmlnLT5wbGxfZGVzYywgYnVmLCBwLT5mcmVxdWVuY3ksIDApOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzKGZlLCBwLCBidWYsIDUpOworCX0KIAogCS8qIHNldCBhZGRpdGlvbmFsIHBhcmFtcyAqLwogCXN3aXRjaCAocC0+dS52c2IubW9kdWxhdGlvbikgewpAQCAtMTE1OSw3ICsxMTYwLDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmbnh0MjAweF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CiAKIAkvKiByZWFkIGNhcmQgaWQgKi8KQEAgLTExOTgsNyArMTE5OCw3IEBACiAJfQogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZueHQyMDB4X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQyMDB4LmgKaW5kZXggMWQ5ZDcwYi4uMzRkNjE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDIwMHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0MjAweC5oCkBAIC0zOCwxMCArMzgsNiBAQAogCS8qIHRoZSBkZW1vZHVsYXRvcidzIGkyYyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKIAotCS8qIHR1bmVyIGluZm9ybWF0aW9uICovCi0JdTggcGxsX2FkZHJlc3M7Ci0Jc3RydWN0IGR2Yl9wbGxfZGVzYyAqcGxsX2Rlc2M7Ci0KIAkvKiB1c2VkIHRvIHNldCBwbGwgaW5wdXQgKi8KIAlpbnQgKCpzZXRfcGxsX2lucHV0KSh1OCogYnVmLCBpbnQgaW5wdXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwppbmRleCBhMTZlZWJhLi5kMzEzZDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmMKQEAgLTMzLDcgKzMzLDYgQEAKIAogc3RydWN0IG54dDYwMDBfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IG54dDYwMDBfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKQEAgLTIwNywxMiArMjA2LDYgQEAKIAkJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgU1VCX0RJQUdfTU9ERV9TRUwsIDApOwogCiAJbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgVFNfRk9STUFULCAwKTsKLQotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQlueHQ2MDAwX3dyaXRlcmVnKHN0YXRlLCBFTkFCTEVfVFVORVJfSUlDLCAweDAxKTsJLyogb3BlbiBpMmMgYnVzIHN3aXRjaCAqLwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDApOwkvKiBjbG9zZSBpMmMgYnVzIHN3aXRjaCAqLwotCX0KIH0KIAogc3RhdGljIHZvaWQgbnh0NjAwMF9kdW1wX3N0YXR1cyhzdHJ1Y3Qgbnh0NjAwMF9zdGF0ZSAqc3RhdGUpCkBAIC00NjksOSArNDYyLDEwIEBACiAJc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAJaW50IHJlc3VsdDsKIAotCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDEpOwkvKiBvcGVuIGkyYyBidXMgc3dpdGNoICovCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcGFyYW0pOwotCW54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDApOwkvKiBjbG9zZSBpMmMgYnVzIHN3aXRjaCAqLworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAlpZiAoKHJlc3VsdCA9IG54dDYwMDBfc2V0X2JhbmR3aWR0aChzdGF0ZSwgcGFyYW0tPnUub2ZkbS5iYW5kd2lkdGgpKSA8IDApCiAJCXJldHVybiByZXN1bHQ7CkBAIC01MzIsNiArNTI2LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbnh0NjAwMF9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBueHQ2MDAwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gbnh0NjAwMF93cml0ZXJlZyhzdGF0ZSwgRU5BQkxFX1RVTkVSX0lJQywgMHgwMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG54dDYwMDBfd3JpdGVyZWcoc3RhdGUsIEVOQUJMRV9UVU5FUl9JSUMsIDB4MDApOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG54dDYwMDBfb3BzOwogCiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBueHQ2MDAwX2F0dGFjaChjb25zdCBzdHJ1Y3Qgbnh0NjAwMF9jb25maWcqIGNvbmZpZywKQEAgLTU0NiwxMyArNTUxLDEyIEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJm54dDYwMDBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwogCWlmIChueHQ2MDAwX3JlYWRyZWcoc3RhdGUsIE9GRE1fTVNDX1JFVikgIT0gTlhUNjAwMEFTSUNERVZJQ0UpIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJm54dDYwMDBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC01ODQsNiArNTg4LDcgQEAKIAkucmVsZWFzZSA9IG54dDYwMDBfcmVsZWFzZSwKIAogCS5pbml0ID0gbnh0NjAwMF9pbml0LAorCS5pMmNfZ2F0ZV9jdHJsID0gbnh0NjAwMF9pMmNfZ2F0ZV9jdHJsLAogCiAJLmdldF90dW5lX3NldHRpbmdzID0gbnh0NjAwMF9mZV9nZXRfdHVuZV9zZXR0aW5ncywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9ueHQ2MDAwLmgKaW5kZXggYjdkOWJlYS4uMTE3MDMxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5oCkBAIC0zMSwxMCArMzEsNiBAQAogCiAJLyogc2hvdWxkIGNsb2NrIGludmVyc2lvbiBiZSB1c2VkPyAqLwogCXU4IGNsb2NrX2ludmVyc2lvbjoxOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIG54dDYwMDBfYXR0YWNoKGNvbnN0IHN0cnVjdCBueHQ2MDAwX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmMKaW5kZXggODBlMGYyOC4uZDIwYWIzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5jCkBAIC01NCw3ICs1NCw2IEBACiBzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZQogewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAogCS8qIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3Qgb3I1MTEzMl9jb25maWcqIGNvbmZpZzsKQEAgLTEwNiw5ICsxMDUsOCBAQAogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCXN0YXRpYyB1OCBydW5fYnVmW10gPSB7MHg3RiwweDAxfTsKLQlzdGF0aWMgdTggZ2V0X3Zlcl9idWZbXSA9IHsweDA0LDB4MDAsMHgzMCwweDAwLDB4MDB9OwotCXU4IHJlY19idWZbMTRdOwotCXU4IGNtZF9idWZbMTRdOworCXU4IHJlY19idWZbOF07CisJdTggY21kX2J1ZlszXTsKIAl1MzIgZmlybXdhcmVBc2l6ZSwgZmlybXdhcmVCc2l6ZTsKIAlpbnQgaSxyZXQ7CiAKQEAgLTE1Nyw3ICsxNTUsNiBAQAogCWNtZF9idWZbMF0gPSAweDEwOwogCWNtZF9idWZbMV0gPSAweDEwOwogCWNtZF9idWZbMl0gPSAweDAwOwotCWNtZF9idWZbM10gPSAweDAwOwogCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KIAlpZiAoKHJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkJIGNtZF9idWYsMykpKSB7CkBAIC0xNjcsOCArMTY0LDYgQEAKIAogCWNtZF9idWZbMF0gPSAweDA0OwogCWNtZF9idWZbMV0gPSAweDE3OwotCWNtZF9idWZbMl0gPSAweDAwOwotCWNtZF9idWZbM10gPSAweDAwOwogCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KIAlpZiAoKHJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkJIGNtZF9idWYsMikpKSB7CkBAIC0xNzgsOCArMTczLDYgQEAKIAogCWNtZF9idWZbMF0gPSAweDAwOwogCWNtZF9idWZbMV0gPSAweDAwOwotCWNtZF9idWZbMl0gPSAweDAwOwotCWNtZF9idWZbM10gPSAweDAwOwogCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KIAlpZiAoKHJldCA9IGkyY193cml0ZWJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsCiAJCQkJIGNtZF9idWYsMikpKSB7CkBAIC0xODksNyArMTgyLDExIEBACiAKIAlmb3IoaT0wO2k8NDtpKyspIHsKIAkJbXNsZWVwKDIwKTsgLyogMjBtcyAqLwotCQlnZXRfdmVyX2J1Zls0XSA9IGkrMTsKKwkJLyogT25jZSB1cG9uIGEgdGltZSwgdGhpcyBjb21tYW5kIG1pZ2h0IGhhdmUgaGFkIHNvbWV0aGluZworCQkgICB0byBkbyB3aXRoIGdldHRpbmcgdGhlIGZpcm13YXJlIHZlcnNpb24sIGJ1dCBpdCdzCisJCSAgIG5vdCB1c2VkIGFueW1vcmU6CisJCSAgIHsweDA0LDB4MDAsMHgzMCwweDAwLGkrMX0gKi8KKwkJLyogUmVhZCA4IGJ5dGVzLCB0d28gYnl0ZXMgYXQgYSB0aW1lICovCiAJCWlmICgocmV0ID0gaTJjX3JlYWRieXRlcyhzdGF0ZSxzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLAogCQkJCQkmcmVjX2J1ZltpKjJdLDIpKSkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORwpAQCAtMjA4LDcgKzIwNSw2IEBACiAJY21kX2J1ZlswXSA9IDB4MTA7CiAJY21kX2J1ZlsxXSA9IDB4MDA7CiAJY21kX2J1ZlsyXSA9IDB4MDA7Ci0JY21kX2J1ZlszXSA9IDB4MDA7CiAJbXNsZWVwKDIwKTsgLyogMjBtcyAqLwogCWlmICgocmV0ID0gaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKIAkJCQkgY21kX2J1ZiwzKSkpIHsKQEAgLTI0Myw3ICsyMzksNyBAQAogc3RhdGljIGludCBvcjUxMTMyX3NldG1vZGUoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IG9yNTExMzJfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0JdW5zaWduZWQgY2hhciBjbWRfYnVmWzRdOworCXVuc2lnbmVkIGNoYXIgY21kX2J1ZlszXTsKIAogCWRwcmludGsoInNldG1vZGUgJWRcbiIsKGludClzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uKTsKIAkvKiBzZXQgb3BlcmF0aW9uIG1vZGUgaW4gUmVjZWl2ZXIgMSByZWdpc3RlcjsgKi8KQEAgLTI2Myw3ICsyNTksNiBAQAogCWRlZmF1bHQ6CiAJCXByaW50aygic2V0bW9kZTpNb2R1bGF0aW9uIHNldCB0byB1bnN1cHBvcnRlZCB2YWx1ZVxuIik7CiAJfTsKLQljbWRfYnVmWzNdID0gMHgwMDsKIAlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKIAkJCSAgIGNtZF9idWYsMykpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogc2V0X21vZGUgZXJyb3IgMVxuIik7CkBAIC0zMDEsNyArMjk2LDYgQEAKIAlkZWZhdWx0OgogCQlwcmludGsoInNldG1vZGU6IE1vZHVsYXRpb24gc2V0IHRvIHVuc3VwcG9ydGVkIHZhbHVlXG4iKTsKIAl9OwotCWNtZF9idWZbM10gPSAweDAwOwogCW1zbGVlcCgyMCk7IC8qIDIwbXMgKi8KIAlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywKIAkJCSAgIGNtZF9idWYsMykpIHsKQEAgLTMxMyw1MiArMzA3LDY1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFNvbWUgbW9kdWxhdGlvbnMgdXNlIHRoZSBzYW1lIGZpcm13YXJlLiAgVGhpcyBjbGFzc2lmaWVzIG1vZHVsYXRpb25zCisgICBieSB0aGUgZmlybXdhcmUgdGhleSB1c2UuICovCisjZGVmaW5lIE1PRF9GV0NMQVNTX1VOS05PV04JMAorI2RlZmluZSBNT0RfRldDTEFTU19WU0IJCTEKKyNkZWZpbmUgTU9EX0ZXQ0xBU1NfUUFNCQkyCitzdGF0aWMgaW50IG1vZHVsYXRpb25fZndfY2xhc3MoZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb24pCit7CisJc3dpdGNoKG1vZHVsYXRpb24pIHsKKwljYXNlIFZTQl84OgorCQlyZXR1cm4gTU9EX0ZXQ0xBU1NfVlNCOworCWNhc2UgUUFNX0FVVE86CisJY2FzZSBRQU1fNjQ6CisJY2FzZSBRQU1fMjU2OgorCQlyZXR1cm4gTU9EX0ZXQ0xBU1NfUUFNOworCWRlZmF1bHQ6CisJCXJldHVybiBNT0RfRldDTEFTU19VTktOT1dOOworCX0KK30KKwogc3RhdGljIGludCBvcjUxMTMyX3NldF9wYXJhbWV0ZXJzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAogCQkJCSAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbSkKIHsKIAlpbnQgcmV0OwotCXU4IGJ1Zls0XTsKIAlzdHJ1Y3Qgb3I1MTEzMl9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNvbnN0IGNoYXIgKmZ3bmFtZTsKKwlpbnQgY2xvY2tfbW9kZTsKIAotCS8qIENoYW5nZSBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBjaGFuZ2luZyB0aGUgbW9kdWxhdGlvbiAqLwotCWlmIChzdGF0ZS0+Y3VycmVudF9tb2R1bGF0aW9uICE9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSB7Ci0JCXN3aXRjaChwYXJhbS0+dS52c2IubW9kdWxhdGlvbikgewotCQljYXNlIFZTQl84OgorCS8qIFVwbG9hZCBuZXcgZmlybXdhcmUgb25seSBpZiB3ZSBuZWVkIGEgZGlmZmVyZW50IG9uZSAqLworCWlmIChtb2R1bGF0aW9uX2Z3X2NsYXNzKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24pICE9CisJICAgIG1vZHVsYXRpb25fZndfY2xhc3MocGFyYW0tPnUudnNiLm1vZHVsYXRpb24pKSB7CisJCXN3aXRjaChtb2R1bGF0aW9uX2Z3X2NsYXNzKHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uKSkgeworCQljYXNlIE1PRF9GV0NMQVNTX1ZTQjoKIAkJCWRwcmludGsoInNldF9wYXJhbWV0ZXJzIFZTQiBNT0RFXG4iKTsKLQkJCXByaW50aygib3I1MTEzMjogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkKCVzKS4uLlxuIiwKLQkJCSAgICAgICBPUjUxMTMyX1ZTQl9GSVJNV0FSRSk7Ci0JCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgT1I1MTEzMl9WU0JfRklSTVdBUkUsCi0JCQkJCSAgICAgICAmc3RhdGUtPmkyYy0+ZGV2KTsKLQkJCWlmIChyZXQpewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IE5vIGZpcm13YXJlIHVwIgotCQkJCSAgICAgICAibG9hZGVkKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KKwkJCWZ3bmFtZSA9IE9SNTExMzJfVlNCX0ZJUk1XQVJFOworCiAJCQkvKiBTZXQgbm9uLXB1bmN0dXJlZCBjbG9jayBmb3IgVlNCICovCi0JCQlzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKGZlLCAwKTsKKwkJCWNsb2NrX21vZGUgPSAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgUUFNX0FVVE86Ci0JCWNhc2UgUUFNXzY0OgotCQljYXNlIFFBTV8yNTY6CisJCWNhc2UgTU9EX0ZXQ0xBU1NfUUFNOgogCQkJZHByaW50aygic2V0X3BhcmFtZXRlcnMgUUFNIE1PREVcbiIpOwotCQkJcHJpbnRrKCJvcjUxMTMyOiBXYWl0aW5nIGZvciBmaXJtd2FyZSB1cGxvYWQoJXMpLi4uXG4iLAotCQkJICAgICAgIE9SNTExMzJfUUFNX0ZJUk1XQVJFKTsKLQkJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBPUjUxMTMyX1FBTV9GSVJNV0FSRSwKLQkJCQkJICAgICAgICZzdGF0ZS0+aTJjLT5kZXYpOwotCQkJaWYgKHJldCl7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogTm8gZmlybXdhcmUgdXAiCi0JCQkJICAgICAgICJsb2FkZWQodGltZW91dCBvciBmaWxlIG5vdCBmb3VuZD8pXG4iKTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQorCQkJZnduYW1lID0gT1I1MTEzMl9RQU1fRklSTVdBUkU7CisKIAkJCS8qIFNldCBwdW5jdHVyZWQgY2xvY2sgZm9yIFFBTSAqLwotCQkJc3RhdGUtPmNvbmZpZy0+c2V0X3RzX3BhcmFtcyhmZSwgMSk7CisJCQljbG9ja19tb2RlID0gMTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJcHJpbnRrKCJvcjUxMTMyOk1vZHVsYXRpb24gdHlwZSglZCkgVU5TVVBQT1JURURcbiIsCisJCQlwcmludGsoIm9yNTExMzI6IE1vZHVsYXRpb24gdHlwZSglZCkgVU5TVVBQT1JURURcbiIsCiAJCQkgICAgICAgcGFyYW0tPnUudnNiLm1vZHVsYXRpb24pOwogCQkJcmV0dXJuIC0xOwotCQl9OworCQl9CisJCXByaW50aygib3I1MTEzMjogV2FpdGluZyBmb3IgZmlybXdhcmUgdXBsb2FkKCVzKS4uLlxuIiwKKwkJICAgICAgIGZ3bmFtZSk7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd25hbWUsICZzdGF0ZS0+aTJjLT5kZXYpOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBObyBmaXJtd2FyZSB1cCIKKwkJCSAgICAgICAibG9hZGVkKHRpbWVvdXQgb3IgZmlsZSBub3QgZm91bmQ/KVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CiAJCXJldCA9IG9yNTExMzJfbG9hZF9maXJtd2FyZShmZSwgZncpOwogCQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAkJaWYgKHJldCkgewpAQCAtMzY3LDE4ICszNzQsMTggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAkJcHJpbnRrKCJvcjUxMTMyOiBGaXJtd2FyZSB1cGxvYWQgY29tcGxldGUuXG4iKTsKLQorCQlzdGF0ZS0+Y29uZmlnLT5zZXRfdHNfcGFyYW1zKGZlLCBjbG9ja19tb2RlKTsKKwl9CisJLyogQ2hhbmdlIG9ubHkgaWYgd2UgYXJlIGFjdHVhbGx5IGNoYW5naW5nIHRoZSBtb2R1bGF0aW9uICovCisJaWYgKHN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gIT0gcGFyYW0tPnUudnNiLm1vZHVsYXRpb24pIHsKIAkJc3RhdGUtPmN1cnJlbnRfbW9kdWxhdGlvbiA9IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uOwogCQlvcjUxMTMyX3NldG1vZGUoZmUpOwogCX0KIAotCWR2Yl9wbGxfY29uZmlndXJlKHN0YXRlLT5jb25maWctPnBsbF9kZXNjLCBidWYsCi0JCQkgIHBhcmFtLT5mcmVxdWVuY3ksIDApOwotCWRwcmludGsoInNldF9wYXJhbWV0ZXJzIHR1bmVyIGJ5dGVzOiAweCUwMnggMHglMDJ4ICIKLQkJIjB4JTAyeCAweCUwMnhcbiIsYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKLQlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsIHN0YXRlLT5jb25maWctPnBsbF9hZGRyZXNzICxidWYsIDQpKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcjUxMTMyOiBzZXRfcGFyYW1ldGVycyBlcnJvciAiCi0JCSAgICAgICAid3JpdGluZyB0byB0dW5lclxuIik7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcGFyYW0pOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KIAogCS8qIFNldCB0byBjdXJyZW50IG1vZGUgKi8KIAlvcjUxMTMyX3NldG1vZGUoZmUpOwpAQCAtMzg4LDYgKzM5NSw0NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG9yNTExMzJfZ2V0X3BhcmFtZXRlcnMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtKQoreworCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXU4IGJ1ZlsyXTsKKworCS8qIFJlY2VpdmVyIFN0YXR1cyAqLworCWJ1ZlswXT0weDA0OworCWJ1ZlsxXT0weDAwOworCW1zbGVlcCgzMCk7IC8qIDMwbXMgKi8KKwlpZiAoaTJjX3dyaXRlYnl0ZXMoc3RhdGUsc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcyxidWYsMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogZ2V0X3BhcmFtZXRlcnMgd3JpdGUgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJbXNsZWVwKDMwKTsgLyogMzBtcyAqLworCWlmIChpMmNfcmVhZGJ5dGVzKHN0YXRlLHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsYnVmLDIpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9yNTExMzI6IGdldF9wYXJhbWV0ZXJzIHJlYWQgZXJyb3JcbiIpOworCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisJc3dpdGNoKGJ1ZlswXSkgeworCQljYXNlIDB4MDY6IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uID0gVlNCXzg7IGJyZWFrOworCQljYXNlIDB4NDM6IHBhcmFtLT51LnZzYi5tb2R1bGF0aW9uID0gUUFNXzY0OyBicmVhazsKKwkJY2FzZSAweDQ1OiBwYXJhbS0+dS52c2IubW9kdWxhdGlvbiA9IFFBTV8yNTY7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAib3I1MTEzMjogdW5rbm93biBzdGF0dXMgMHglMDJ4XG4iLAorCQkJICAgICAgIGJ1ZlswXSk7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwl9CisKKwkvKiBGSVhNRTogUmVhZCBmcmVxdWVuY3kgZnJvbSBmcm9udGVuZCwgdGFrZSBBRkMgaW50byBhY2NvdW50ICovCisJcGFyYW0tPmZyZXF1ZW5jeSA9IHN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeTsKKworCS8qIEZJWE1FOiBIb3cgdG8gcmVhZCBpbnZlcnNpb24gc2V0dGluZz8gUmVjZWl2ZXIgNiByZWdpc3Rlcj8gKi8KKwlwYXJhbS0+aW52ZXJzaW9uID0gSU5WRVJTSU9OX0FVVE87CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBvcjUxMTMyX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBmZV9zdGF0dXNfdCogc3RhdHVzKQogewogCXN0cnVjdCBvcjUxMTMyX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNTcyLDEyICs2MTcsMTEgQEAKIAkvKiBTZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmb3I1MTEzMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IC0xOwogCXN0YXRlLT5jdXJyZW50X21vZHVsYXRpb24gPSAtMTsKIAogCS8qIENyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmb3I1MTEzMl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTU5MCw3ICs2MzQsNyBAQAogCiAJLmluZm8gPSB7CiAJCS5uYW1lCQkJPSAiT3JlbiBPUjUxMTMyIFZTQi9RQU0gRnJvbnRlbmQiLAotCQkudHlwZSAJCQk9IEZFX0FUU0MsCisJCS50eXBlCQkJPSBGRV9BVFNDLAogCQkuZnJlcXVlbmN5X21pbgkJPSA0NDAwMDAwMCwKIAkJLmZyZXF1ZW5jeV9tYXgJCT0gOTU4MDAwMDAwLAogCQkuZnJlcXVlbmN5X3N0ZXBzaXplCT0gMTY2NjY2LApAQCAtNjA2LDYgKzY1MCw3IEBACiAJLnNsZWVwID0gb3I1MTEzMl9zbGVlcCwKIAogCS5zZXRfZnJvbnRlbmQgPSBvcjUxMTMyX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgPSBvcjUxMTMyX2dldF9wYXJhbWV0ZXJzLAogCS5nZXRfdHVuZV9zZXR0aW5ncyA9IG9yNTExMzJfZ2V0X3R1bmVfc2V0dGluZ3MsCiAKIAkucmVhZF9zdGF0dXMgPSBvcjUxMTMyX3JlYWRfc3RhdHVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMTMyLmgKaW5kZXggNjIyY2RkMS4uODk2NTg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTExMzIuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTEzMi5oCkBAIC0yOSw4ICsyOSw2IEBACiB7CiAJLyogVGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCXU4IHBsbF9hZGRyZXNzOwotCXN0cnVjdCBkdmJfcGxsX2Rlc2MgKnBsbF9kZXNjOwogCiAJLyogTmVlZCB0byBzZXQgZGV2aWNlIHBhcmFtIGZvciBzdGFydF9kbWEgKi8KIAlpbnQgKCpzZXRfdHNfcGFyYW1zKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGlzX3B1bmN0dXJlZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL29yNTEyMTEuYwppbmRleCA3YzNhZWQxLi4yNmJlZDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvb3I1MTIxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9vcjUxMjExLmMKQEAgLTU0LDcgKzU0LDYgQEAKIHN0cnVjdCBvcjUxMjExX3N0YXRlIHsKIAogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAogCS8qIENvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3Qgb3I1MTIxMV9jb25maWcqIGNvbmZpZzsKQEAgLTU4NSwxMiArNTg0LDExIEBACiAJLyogU2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJm9yNTEyMTFfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+aW5pdGlhbGl6ZWQgPSAwOwogCXN0YXRlLT5jdXJyZW50X2ZyZXF1ZW5jeSA9IDA7CiAKIAkvKiBDcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJm9yNTEyMTFfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwppbmRleCBkNjk0Nzc1Li4yYzJjMzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogc3RydWN0IHM1aDE0MjBfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3QgczVoMTQyMF9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC01ODQsNyArNTgzLDYgQEAKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAlpbnQgZnJlcXVlbmN5X2RlbHRhOwogCXN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyBmZXNldHRpbmdzOwotCXUzMiB0bXA7CiAKIAkvKiBjaGVjayBpZiB3ZSBzaG91bGQgZG8gYSBmYXN0LXR1bmUgKi8KIAltZW1jcHkoJmZlc2V0dGluZ3MucGFyYW1ldGVycywgcCwgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykpOwpAQCAtNTk2LDEwICs1OTQsMTcgQEAKIAkgICAgKHN0YXRlLT5mZWNfaW5uZXIgPT0gcC0+dS5xcHNrLmZlY19pbm5lcikgJiYKIAkgICAgKHN0YXRlLT5zeW1ib2xfcmF0ZSA9PSBwLT51LnFwc2suc3ltYm9sX3JhdGUpKSB7CiAKLQkJaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpIHsKLQkJCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgfCAxKTsKLQkJCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHAsICZ0bXApOworCQlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCQl9CisJCWlmIChmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KSB7CisJCQl1MzIgdG1wOworCQkJZmUtPm9wcy50dW5lcl9vcHMuZ2V0X2ZyZXF1ZW5jeShmZSwgJnRtcCk7CisJCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOwogCQkJczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0YXRlLCBwLT5mcmVxdWVuY3kgLSB0bXApOworCQl9IGVsc2UgeworCQkJczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0YXRlLCAwKTsKIAkJfQogCQlyZXR1cm4gMDsKIAl9CkBAIC02NDYsOSArNjUxLDkgQEAKIAlzNWgxNDIwX3dyaXRlcmVnKHN0YXRlLCAweDA1LCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsIDB4MDUpIHwgMSk7CiAKIAkvKiBzZXQgdHVuZXIgUExMICovCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9zZXQpIHsKLQkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwLCAmdG1wKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKIAkJczVoMTQyMF9zZXRmcmVxb2Zmc2V0KHN0YXRlLCAwKTsKIAl9CiAKQEAgLTcwOCw2ICs3MTMsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzNWgxNDIwX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHM1aDE0MjBfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCXJldHVybiBzNWgxNDIwX3dyaXRlcmVnIChzdGF0ZSwgMHgwMiwgczVoMTQyMF9yZWFkcmVnKHN0YXRlLDB4MDIpIHwgMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgJiAweGZlKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgczVoMTQyMF9pbml0IChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3QgczVoMTQyMF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTcxNywxMyArNzMzLDYgQEAKIAltc2xlZXAoMTApOwogCXM1aDE0MjBfcmVzZXQoc3RhdGUpOwogCi0JLyogaW5pdCBQTEwgKi8KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJczVoMTQyMF93cml0ZXJlZyAoc3RhdGUsIDB4MDIsIHM1aDE0MjBfcmVhZHJlZyhzdGF0ZSwweDAyKSB8IDEpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCXM1aDE0MjBfd3JpdGVyZWcgKHN0YXRlLCAweDAyLCBzNWgxNDIwX3JlYWRyZWcoc3RhdGUsMHgwMikgJiAweGZlKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzU2LDcgKzc2NSw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnM1aDE0MjBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+cG9zdGxvY2tlZCA9IDA7CiAJc3RhdGUtPmZjbGsgPSA4ODAwMDAwMDsKIAlzdGF0ZS0+dHVuZWRmcmVxID0gMDsKQEAgLTc2OSw3ICs3NzcsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZzNWgxNDIwX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIApAQCAtODAwLDYgKzgwOCw3IEBACiAKIAkuaW5pdCA9IHM1aDE0MjBfaW5pdCwKIAkuc2xlZXAgPSBzNWgxNDIwX3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gczVoMTQyMF9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IHM1aDE0MjBfc2V0X2Zyb250ZW5kLAogCS5nZXRfZnJvbnRlbmQgPSBzNWgxNDIwX2dldF9mcm9udGVuZCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5oCmluZGV4IDczMjk2ZjEuLjRlMzkwMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuaApAQCAtMzIsMTAgKzMyLDYgQEAKIAogCS8qIGRvZXMgdGhlIGludmVyc2lvbiByZXF1aXJlIGludmVyc2lvbj8gKi8KIAl1OCBpbnZlcnQ6MTsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zLCB1MzIqIGZyZXFvdXQpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHM1aDE0MjBfYXR0YWNoKGNvbnN0IHN0cnVjdCBzNWgxNDIwX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5jCmluZGV4IDczODI5ZTYuLjQ0ZWM1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmMKQEAgLTQ0LDggKzQ0LDYgQEAKIAogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwogCi0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwotCiAJY29uc3Qgc3RydWN0IHNwODg3MF9jb25maWcqIGNvbmZpZzsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yNjIsOSArMjYwLDEwIEBACiAJc3A4ODcwX21pY3JvY29udHJvbGxlcl9zdG9wKHN0YXRlKTsKIAogCS8vIHNldCB0dW5lciBwYXJhbWV0ZXJzCi0Jc3A4ODcwX3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDEpOwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAkvLyBzYW1wbGUgcmF0ZSBjb3JyZWN0aW9uIGJpdCBbMjMuLjE3XQogCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgwMzE5LCAweDAwMEEpOwpAQCAtMzQ5LDEzICszNDgsNiBAQAogCXNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgwRDAwLCAweDAxMCk7CiAJc3A4ODcwX3dyaXRlcmVnKHN0YXRlLCAweDBEMDEsIDB4MDAwKTsKIAotCS8qIHNldHVwIFBMTCAqLwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQlzcDg4NzBfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMSk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQkJc3A4ODcwX3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDApOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC01NDEsNiArNTMzLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc3A4ODcwX2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIHNwODg3MF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAxKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gc3A4ODcwX3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDApOworCX0KK30KKwogc3RhdGljIHZvaWQgc3A4ODcwX3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IHNwODg3MF9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKQEAgLTU2MSwxNCArNTY0LDEzIEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnNwODg3MF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAoc3A4ODcwX3JlYWRyZWcoc3RhdGUsIDB4MDIwMCkgPCAwKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZzcDg4NzBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC01OTcsNiArNTk5LDcgQEAKIAogCS5pbml0ID0gc3A4ODcwX2luaXQsCiAJLnNsZWVwID0gc3A4ODcwX3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gc3A4ODcwX2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gc3A4ODcwX3NldF9mcm9udGVuZCwKIAkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBzcDg4NzBfZ2V0X3R1bmVfc2V0dGluZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODcwLmgKaW5kZXggZjNiNTU1ZC4uOTNhZmJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4NzAuaApAQCAtMzEsMTAgKzMxLDYgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7Ci0KIAkvKiByZXF1ZXN0IGZpcm13YXJlIGZvciBkZXZpY2UgKi8KIAlpbnQgKCpyZXF1ZXN0X2Zpcm13YXJlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guYwppbmRleCBlYjhhNjAyLi5iMGEyYjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5jCkBAIC0yNCw3ICsyNCw2IEBACiAKIHN0cnVjdCBzcDg4N3hfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3Qgc3A4ODd4X2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CiAKQEAgLTIwOCwxNSArMjA3LDYgQEAKIAkvKiBiaXQgMHgwMTA6IGVuYWJsZSBkYXRhIHZhbGlkIHNpZ25hbCAqLwogCXNwODg3eF93cml0ZXJlZyhzdGF0ZSwgMHhkMDAsIDB4MDEwKTsKIAlzcDg4N3hfd3JpdGVyZWcoc3RhdGUsIDB4MGQxLCAweDAwMCk7Ci0KLQkvKiBzZXR1cCB0aGUgUExMICovCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCXNwODg3eF93cml0ZXJlZyhzdGF0ZSwgMHgyMDYsIDB4MDAxKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQlzcDg4N3hfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMCk7Ci0JfQotCi0JcHJpbnRrICgiZG9uZS5cbiIpOwogCXJldHVybiAwOwogfTsKIApAQCAtMzYyLDkgKzM1MiwxNiBAQAogCXNwODg3eF9taWNyb2NvbnRyb2xsZXJfc3RvcChzdGF0ZSk7CiAKIAkvKiBzZXR1cCB0aGUgUExMICovCi0Jc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDEpOwotCWFjdHVhbF9mcmVxID0gc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7Ci0Jc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDApOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHApOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuZ2V0X2ZyZXF1ZW5jeSkgeworCQlmZS0+b3BzLnR1bmVyX29wcy5nZXRfZnJlcXVlbmN5KGZlLCAmYWN0dWFsX2ZyZXEpOworCQlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKSBmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCX0gZWxzZSB7CisJCWFjdHVhbF9mcmVxID0gcC0+ZnJlcXVlbmN5OworCX0KIAogCS8qIHJlYWQgc3RhdHVzIHJlZyBpbiBvcmRlciB0byBjbGVhciA8cGVuZGluZyBpcnFzICovCiAJc3A4ODd4X3JlYWRyZWcoc3RhdGUsIDB4MjAwKTsKQEAgLTQ4Niw2ICs0ODMsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzcDg4N3hfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gc3A4ODd4X3dyaXRlcmVnKHN0YXRlLCAweDIwNiwgMHgwMDEpOworCX0gZWxzZSB7CisJCXJldHVybiBzcDg4N3hfd3JpdGVyZWcoc3RhdGUsIDB4MjA2LCAweDAwMCk7CisJfQorfQorCiBzdGF0aWMgaW50IHNwODg3eF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKIHsKIAlzdHJ1Y3Qgc3A4ODd4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNTU1LDE0ICs1NjMsMTMgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmc3A4ODd4X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmluaXRpYWxpc2VkID0gMDsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwogCWlmIChzcDg4N3hfcmVhZHJlZyhzdGF0ZSwgMHgwMjAwKSA8IDApIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnNwODg3eF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTU4OSw2ICs1OTYsNyBAQAogCiAJLmluaXQgPSBzcDg4N3hfaW5pdCwKIAkuc2xlZXAgPSBzcDg4N3hfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBzcDg4N3hfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSBzcDg4N3hfc2V0dXBfZnJvbnRlbmRfcGFyYW1ldGVycywKIAkuZ2V0X3R1bmVfc2V0dGluZ3MgPSBzcDg4N3hfZ2V0X3R1bmVfc2V0dGluZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3A4ODd4LmgKaW5kZXggNmEwNWQ4Zi4uYzQ0YjBlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3NwODg3eC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zcDg4N3guaApAQCAtMTMsMTIgKzEzLDYgQEAKIAkvKiB0aGUgZGVtb2R1bGF0b3IncyBpMmMgYWRkcmVzcyAqLwogCXU4IGRlbW9kX2FkZHJlc3M7CiAKLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCi0JLyogdGhpcyBzaG91bGQgcmV0dXJuIHRoZSBhY3R1YWwgZnJlcXVlbmN5IHR1bmVkIHRvICovCi0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKLQogCS8qIHJlcXVlc3QgZmlybXdhcmUgZm9yIGRldmljZSAqLwogCWludCAoKnJlcXVlc3RfZmlybXdhcmUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKipmdywgY2hhciogbmFtZSk7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmMKaW5kZXggZWIxNTY3Ni4uMWNhNjQyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5jCkBAIC0zMiw3ICszMiw2IEBACiAKIHN0cnVjdCBzdHYwMjk3X3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJY29uc3Qgc3RydWN0IHN0djAyOTdfY29uZmlnICpjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKIApAQCAtNjgsMTkgKzY3LDI1IEBACiAJaW50IHJldDsKIAl1OCBiMFtdID0geyByZWcgfTsKIAl1OCBiMVtdID0geyAwIH07Ci0Jc3RydWN0IGkyY19tc2cgbXNnW10gPSB7IHsuYWRkciA9IHN0YXRlLT5jb25maWctPmRlbW9kX2FkZHJlc3MsLmZsYWdzID0gMCwuYnVmID0gYjAsLmxlbiA9Ci0JCQkJICAxfSwKLQl7LmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLC5mbGFncyA9IEkyQ19NX1JELC5idWYgPSBiMSwubGVuID0gMX0KLQl9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geyB7LmFkZHIgPSBzdGF0ZS0+Y29uZmlnLT5kZW1vZF9hZGRyZXNzLC5mbGFncyA9IDAsLmJ1ZiA9IGIwLC5sZW4gPSAxfSwKKwkJCQkgey5hZGRyID0gc3RhdGUtPmNvbmZpZy0+ZGVtb2RfYWRkcmVzcywuZmxhZ3MgPSBJMkNfTV9SRCwuYnVmID0gYjEsLmxlbiA9IDF9CisJCQkgICAgICAgfTsKIAogCS8vIHRoaXMgZGV2aWNlIG5lZWRzIGEgU1RPUCBiZXR3ZWVuIHRoZSByZWdpc3RlciBhbmQgZGF0YQotCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dbMF0sIDEpKSAhPSAxKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZywgcmV0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzFdLCAxKSkgIT0gMSkgewotCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcsIHJldCk7Ci0JCXJldHVybiAtMTsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c3RvcF9kdXJpbmdfcmVhZCkgeworCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzBdLCAxKSkgIT0gMSkgeworCQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnLCByZXQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dbMV0sIDEpKSAhPSAxKSB7CisJCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpKSAhPSAyKSB7CisJCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAKIAlyZXR1cm4gYjFbMF07CkBAIC0xMDcsMTMgKzExMiwyMCBAQAogCX07CiAKIAkvLyB0aGlzIGRldmljZSBuZWVkcyBhIFNUT1AgYmV0d2VlbiB0aGUgcmVnaXN0ZXIgYW5kIGRhdGEKLQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzBdLCAxKSkgIT0gMSkgewotCQlkcHJpbnRrKCIlczogcmVhZHJlZyBlcnJvciAocmVnID09IDB4JTAyeCwgcmV0ID09ICVpKVxuIiwgX19GVU5DVElPTl9fLCByZWcxLCByZXQpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsICZtc2dbMV0sIDEpKSAhPSAxKSB7Ci0JCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZzEsIHJldCk7Ci0JCXJldHVybiAtMTsKKwlpZiAoc3RhdGUtPmNvbmZpZy0+c3RvcF9kdXJpbmdfcmVhZCkgeworCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzBdLCAxKSkgIT0gMSkgeworCQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnMSwgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoKHJldCA9IGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCAmbXNnWzFdLCAxKSkgIT0gMSkgeworCQkJZHByaW50aygiJXM6IHJlYWRyZWcgZXJyb3IgKHJlZyA9PSAweCUwMngsIHJldCA9PSAlaSlcbiIsIF9fRlVOQ1RJT05fXywgcmVnMSwgcmV0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgocmV0ID0gaTJjX3RyYW5zZmVyKHN0YXRlLT5pMmMsIG1zZywgMikpICE9IDIpIHsKKwkJCWRwcmludGsoIiVzOiByZWFkcmVnIGVycm9yIChyZWcgPT0gMHglMDJ4LCByZXQgPT0gJWkpXG4iLCBfX0ZVTkNUSU9OX18sIHJlZzEsIHJldCk7CisJCQlyZXR1cm4gLTE7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI3NiwxMiArMjg4LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBzdHYwMjk3X2VuYWJsZV9wbGxpMmMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHN0djAyOTdfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgc3R2MDI5N19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKIAotCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4ODcsIDB4NzgpOwotCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4ODYsIDB4YzgpOworCWlmIChlbmFibGUpIHsKKwkJc3R2MDI5N193cml0ZXJlZyhzdGF0ZSwgMHg4NywgMHg3OCk7CisJCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4ODYsIDB4YzgpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjk2LDkgKzMxMCw2IEBACiAJCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIHN0YXRlLT5jb25maWctPmluaXR0YWJbaV0sIHN0YXRlLT5jb25maWctPmluaXR0YWJbaSsxXSk7CiAJbXNsZWVwKDIwMCk7CiAKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpCi0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zODksNyArNDAwLDcgQEAKIAljYXNlIFFBTV8zMjoKIAljYXNlIFFBTV82NDoKIAkJZGVsYXkgPSAxMDA7Ci0JCXN3ZWVwcmF0ZSA9IDE1MDA7CisJCXN3ZWVwcmF0ZSA9IDEwMDA7CiAJCWJyZWFrOwogCiAJY2FzZSBRQU1fMTI4OgpAQCAtNDIxLDcgKzQzMiwxMCBAQAogCX0KIAogCXN0djAyOTdfaW5pdChmZSk7Ci0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJLyogY2xlYXIgc29mdHdhcmUgaW50ZXJydXB0cyAqLwogCXN0djAyOTdfd3JpdGVyZWcoc3RhdGUsIDB4ODIsIDB4MCk7CkBAIC02MzQsNyArNjQ4LDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmc3R2MDI5N19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5iYXNlX2ZyZXEgPSAwOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCkBAIC02NDIsNyArNjU1LDcgQEAKIAkJZ290byBlcnJvcjsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmc3R2MDI5N19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTY2OCw2ICs2ODEsNyBAQAogCiAJLmluaXQgPSBzdHYwMjk3X2luaXQsCiAJLnNsZWVwID0gc3R2MDI5N19zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHN0djAyOTdfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSBzdHYwMjk3X3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gc3R2MDI5N19nZXRfZnJvbnRlbmQsCkBAIC02ODQsNCArNjk4LDMgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogRVhQT1JUX1NZTUJPTChzdHYwMjk3X2F0dGFjaCk7Ci1FWFBPUlRfU1lNQk9MKHN0djAyOTdfZW5hYmxlX3BsbGkyYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTcuaAppbmRleCA5ZTUzZjAxLi4xZGE1Mzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5Ny5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk3LmgKQEAgLTM4LDEzICszOCwxMSBAQAogCS8qIGRvZXMgdGhlICJpbnZlcnNpb24iIG5lZWQgaW52ZXJ0ZWQ/ICovCiAJdTggaW52ZXJ0OjE7CiAKLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CisJLyogc2V0IHRvIDEgaWYgdGhlIGRldmljZSByZXF1aXJlcyBhbiBpMmMgU1RPUCBkdXJpbmcgcmVhZGluZyAqLworCXU4IHN0b3BfZHVyaW5nX3JlYWQ6MTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBzdHYwMjk3X2F0dGFjaChjb25zdCBzdHJ1Y3Qgc3R2MDI5N19jb25maWcqIGNvbmZpZywKIAkJCQkJICAgc3RydWN0IGkyY19hZGFwdGVyKiBpMmMpOwotZXh0ZXJuIGludCBzdHYwMjk3X2VuYWJsZV9wbGxpMmMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogCiAjZW5kaWYgLy8gU1RWMDI5N19ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuYwppbmRleCA1YmNkMDBmLi45NjY0OGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmMKQEAgLTU2LDcgKzU2LDYgQEAKIAogc3RydWN0IHN0djAyOTlfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAljb25zdCBzdHJ1Y3Qgc3R2MDI5OV9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC0xMzEsMTMgKzEzMCw2IEBACiAJcmV0dXJuIHJldCA9PSAyID8gMCA6IHJldDsKIH0KIAotaW50IHN0djAyOTlfZW5hYmxlX3BsbGkyYyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCi17Ci0Jc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7Ci0KLQlyZXR1cm4gc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4YjUpOwkvKiAgZW5hYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotfQotCiBzdGF0aWMgaW50IHN0djAyOTlfc2V0X0ZFQyAoc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlLCBmZV9jb2RlX3JhdGVfdCBmZWMpCiB7CiAJZHByaW50ayAoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtNDU3LDEyICs0NDksNiBAQAogCWZvciAoaT0wOyAhKHN0YXRlLT5jb25maWctPmluaXR0YWJbaV0gPT0gMHhmZiAmJiBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2krMV0gPT0gMHhmZik7IGkrPTIpCiAJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2ldLCBzdGF0ZS0+Y29uZmlnLT5pbml0dGFiW2krMV0pOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweGI1KTsJLyogIGVuYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUsIHN0YXRlLT5pMmMpOwotCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHgzNSk7CS8qICBkaXNhYmxlIGkyYyByZXBlYXRlciBvbiBzdHYwMjk5ICAqLwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC01NjAsOSArNTQ2LDEwIEBACiAJaWYgKHN0YXRlLT5jb25maWctPmludmVydCkgaW52dmFsID0gKH5pbnZ2YWwpICYgMTsKIAlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwYywgKHN0djAyOTlfcmVhZHJlZyhzdGF0ZSwgMHgwYykgJiAweGZlKSB8IGludnZhbCk7CiAKLQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHhiNSk7CS8qICBlbmFibGUgaTJjIHJlcGVhdGVyIG9uIHN0djAyOTkgICovCi0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgc3RhdGUtPmkyYywgcCk7Ci0Jc3R2MDI5OV93cml0ZXJlZ0koc3RhdGUsIDB4MDUsIDB4MzUpOwkvKiAgZGlzYWJsZSBpMmMgcmVwZWF0ZXIgb24gc3R2MDI5OSAgKi8KKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CiAKIAlzdHYwMjk5X3NldF9GRUMgKHN0YXRlLCBwLT51LnFwc2suZmVjX2lubmVyKTsKIAlzdHYwMjk5X3NldF9zeW1ib2xyYXRlIChmZSwgcC0+dS5xcHNrLnN5bWJvbF9yYXRlKTsKQEAgLTYxMSw2ICs1OTgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzdHYwMjk5X2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlpZiAoZW5hYmxlKSB7CisJCXN0djAyOTlfd3JpdGVyZWdJKHN0YXRlLCAweDA1LCAweGI1KTsKKwl9IGVsc2UgeworCQlzdHYwMjk5X3dyaXRlcmVnSShzdGF0ZSwgMHgwNSwgMHgzNSk7CisJfQorCXVkZWxheSgxKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBzdHYwMjk5X2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MqIGZlc2V0dGluZ3MpCiB7CiAJc3RydWN0IHN0djAyOTlfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CkBAIC02NDcsNyArNjQ3LDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmc3R2MDI5OV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5pbml0aWFsaXNlZCA9IDA7CiAJc3RhdGUtPnR1bmVyX2ZyZXF1ZW5jeSA9IDA7CiAJc3RhdGUtPnN5bWJvbF9yYXRlID0gMDsKQEAgLTY2NCw3ICs2NjMsNyBAQAogCWlmIChpZCAhPSAweGExICYmIGlkICE9IDB4ODApIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnN0djAyOTlfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCkBAIC02OTUsNiArNjk0LDcgQEAKIAogCS5pbml0ID0gc3R2MDI5OV9pbml0LAogCS5zbGVlcCA9IHN0djAyOTlfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBzdHYwMjk5X2kyY19nYXRlX2N0cmwsCiAKIAkuc2V0X2Zyb250ZW5kID0gc3R2MDI5OV9zZXRfZnJvbnRlbmQsCiAJLmdldF9mcm9udGVuZCA9IHN0djAyOTlfZ2V0X2Zyb250ZW5kLApAQCAtNzIxLDkgKzcyMSw4IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiU1QgU1RWMDI5OSBEVkIgRGVtb2R1bGF0b3IgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyLCBIb2xnZXIgV2FlY2h0bGVyLCBQZXRlciBTY2hpbGRtYW5uLCBGZWxpeCBEb21rZSwgIgotCSAgICAgICJBbmRyZWFzIE9iZXJyaXR0ZXIsIEFuZHJldyBkZSBRdWluY2V5LCBLZW5uZXRoIEFhZmz4eSIpOworCSAgICAgICJBbmRyZWFzIE9iZXJyaXR0ZXIsIEFuZHJldyBkZSBRdWluY2V5LCBLZW5uZXRoIEFhZmx5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLUVYUE9SVF9TWU1CT0woc3R2MDI5OV9lbmFibGVfcGxsaTJjKTsKIEVYUE9SVF9TWU1CT0woc3R2MDI5OV93cml0ZXJlZyk7CiBFWFBPUlRfU1lNQk9MKHN0djAyOTlfYXR0YWNoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvc3R2MDI5OS5oCmluZGV4IDMyYzg3YjQuLjE1MDQ4MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zdHYwMjk5LmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3N0djAyOTkuaApAQCAtODcsMTQgKzg3LDkgQEAKIAogCS8qIFNldCB0aGUgc3ltYm9sIHJhdGUgKi8KIAlpbnQgKCpzZXRfc3ltYm9sX3JhdGUpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCB1MzIgc3JhdGUsIHUzMiByYXRpbyk7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGkyY19hZGFwdGVyICppMmMsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKTsKIH07CiAKIGV4dGVybiBpbnQgc3R2MDI5OV93cml0ZXJlZyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHU4IHJlZywgdTggZGF0YSk7Ci1leHRlcm4gaW50IHN0djAyOTlfZW5hYmxlX3BsbGkyYyAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogc3R2MDI5OV9hdHRhY2goY29uc3Qgc3RydWN0IHN0djAyOTlfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciogaTJjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDAyMS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMKaW5kZXggMjEyNTVjYS4uZTgzZmYyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmMKQEAgLTM2LDcgKzM2LDYgQEAKIAogc3RydWN0IHRkYTEwMDIxX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCB0ZGExMDAyMV9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtOTAsNiArODksMTQgQEAKIAlyZXR1cm4gKHJldCAhPSAxKSA/IC1FUkVNT1RFSU8gOiAwOwogfQogCitpbnQgdGRhMTAwMjFfd3JpdGVfYnl0ZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IHJlZywgaW50IGRhdGEpCit7CisJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJcmV0dXJuIHRkYTEwMDIxX3dyaXRlcmVnKHN0YXRlLCByZWcsIGRhdGEpOworfQorRVhQT1JUX1NZTUJPTCh0ZGExMDAyMV93cml0ZV9ieXRlKTsKKwogc3RhdGljIHU4IHRkYTEwMDIxX3JlYWRyZWcgKHN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUsIHU4IHJlZykKIHsKIAl1OCBiMCBbXSA9IHsgcmVnIH07CkBAIC0yMjUsMTMgKzIzMiw2IEBACiAKIAkvL0FjdGl2YXRlIFBMTAogCXRkYTEwMDIxX3dyaXRlcmVnKHN0YXRlLCAweDJhLCB0ZGExMDAyMV9pbml0dGFiWzB4MmFdICYgMHhlZik7Ci0KLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJbG9ja190dW5lcihzdGF0ZSk7Ci0JCXN0YXRlLT5jb25maWctPnBsbF9pbml0KGZlKTsKLQkJdW5sb2NrX3R1bmVyKHN0YXRlKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU5LDkgKzI1OSwxMCBAQAogCiAJLy9wcmludGsoInRkYTEwMDIxOiBzZXQgZnJlcXVlbmN5IHRvICVkIHFhbT0lZCBzeW1yYXRlPSVkXG4iLCBwLT5mcmVxdWVuY3kscWFtLHAtPnUucWFtLnN5bWJvbF9yYXRlKTsKIAotCWxvY2tfdHVuZXIoc3RhdGUpOwotCXN0YXRlLT5jb25maWctPnBsbF9zZXQoZmUsIHApOwotCXVubG9ja190dW5lcihzdGF0ZSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCiAJdGRhMTAwMjFfc2V0X3N5bWJvbHJhdGUgKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CiAJdGRhMTAwMjFfd3JpdGVyZWcgKHN0YXRlLCAweDM0LCBzdGF0ZS0+cHdtKTsKQEAgLTM3Niw2ICszNzcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0ZGExMDAyMV9pMmNfZ2F0ZV9jdHJsKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCB0ZGExMDAyMV9zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJbG9ja190dW5lcihzdGF0ZSk7CisJfSBlbHNlIHsKKwkJdW5sb2NrX3R1bmVyKHN0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdGRhMTAwMjFfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpCiB7CiAJc3RydWN0IHRkYTEwMDIxX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwpAQCAtNDA3LDcgKzQyMCw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDIxX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPnB3bSA9IHB3bTsKIAlzdGF0ZS0+cmVnMCA9IHRkYTEwMDIxX2luaXR0YWJbMF07CiAKQEAgLTQxNSw3ICs0MjcsNyBAQAogCWlmICgodGRhMTAwMjFfcmVhZHJlZyhzdGF0ZSwgMHgxYSkgJiAweGYwKSAhPSAweDcwKSBnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ0ZGExMDAyMV9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTQ0OCw2ICs0NjAsNyBAQAogCiAJLmluaXQgPSB0ZGExMDAyMV9pbml0LAogCS5zbGVlcCA9IHRkYTEwMDIxX3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gdGRhMTAwMjFfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSB0ZGExMDAyMV9zZXRfcGFyYW1ldGVycywKIAkuZ2V0X2Zyb250ZW5kID0gdGRhMTAwMjFfZ2V0X2Zyb250ZW5kLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDIxLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuaAppbmRleCA1M2JlOTM5Li5iMWRmNDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwMjEuaApAQCAtMzAsMTMgKzMwLDExIEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTEwMDIxX2F0dGFjaChjb25zdCBzdHJ1Y3QgdGRhMTAwMjFfY29uZmlnKiBjb25maWcsCiAJCQkJCSAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYywgdTggcHdtKTsKIAorZXh0ZXJuIGludCB0ZGExMDAyMV93cml0ZV9ieXRlKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBpbnQgcmVnLCBpbnQgZGF0YSk7CisKICNlbmRpZiAvLyBUREExMDAyMV9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCmluZGV4IGI4M2RhZmEuLjU5YTJlZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExMDA0eC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAKIHN0cnVjdCB0ZGExMDA0eF9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCWNvbnN0IHN0cnVjdCB0ZGExMDA0eF9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwogCkBAIC02MDAsMTMgKzU5OSw2IEBACiAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQURDMSwgMHgxMCwgMCk7IC8vIHdha2UgdXAgdGhlIEFEQwogCi0JLy8gSW5pdCB0aGUgUExMCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSB7Ci0JCXRkYTEwMDR4X2VuYWJsZV90dW5lcl9pMmMoc3RhdGUpOwotCQlzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0JCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKLQl9Ci0KIAkvLyB0ZGEgc2V0dXAKIAl0ZGExMDA0eF93cml0ZV9tYXNrKHN0YXRlLCBUREExMDA0WF9DT05GQzQsIDB4MjAsIDApOyAvLyBkaXNhYmxlIERTUCB3YXRjaGRvZyB0aW1lcgogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0FVVE8sIDgsIDApOyAvLyBzZWxlY3QgSFAgc3RyZWFtCkBAIC02MzUsMTYgKzYyNyw2IEBACiAJCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQkvLyBJbml0IHRoZSB0dW5lciBQTEwKLQlpZiAoc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQpIHsKLQkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7Ci0JCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAidGRhMTAwNHg6IHBsbCBpbml0IGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gCS1FSU87Ci0JCX0KLQkJdGRhMTAwNHhfZGlzYWJsZV90dW5lcl9pMmMoc3RhdGUpOwotCX0KLQogCS8vIHRkYSBzZXR1cAogCXRkYTEwMDR4X3dyaXRlX21hc2soc3RhdGUsIFREQTEwMDRYX0NPTkZDNCwgMHgyMCwgMCk7IC8vIGRpc2FibGUgRFNQIHdhdGNoZG9nIHRpbWVyCiAJdGRhMTAwNHhfd3JpdGVfYnl0ZUkoc3RhdGUsIFREQTEwMDRYX0FVVE8sIDB4ODcpOyAgICAvLyAxMDAgcHBtIGNyeXN0YWwsIHNlbGVjdCBIUCBzdHJlYW0KQEAgLTcxMiwxMiArNjk0LDEwIEBACiAJfQogCiAJLy8gc2V0IGZyZXF1ZW5jeQotCXRkYTEwMDR4X2VuYWJsZV90dW5lcl9pMmMoc3RhdGUpOwotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBmZV9wYXJhbXMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGRhMTAwNHg6IHBsbCBzZXQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIAktRUlPOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKSB7CisJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIGZlX3BhcmFtcyk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CiAJfQotCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKIAogCS8vIEhhcmRjb2RlZCB0byB1c2UgYXV0byBhcyBtdWNoIGFzIHBvc3NpYmxlIG9uIHRoZSBUREExMDA0NSBhcyBpdAogCS8vIGlzIHZlcnkgdW5yZWxpYWJsZSBpZiBBVVRPIG1vZGUgaXMgX25vdF8gdXNlZC4KQEAgLTExODMsMTYgKzExNjMsNiBAQAogCQlicmVhazsKIAogCWNhc2UgVERBMTAwNFhfREVNT0RfVERBMTAwNDY6Ci0JCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAgIT0gTlVMTCkgewotCQkJdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7Ci0JCQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2xlZXAoZmUpOwotCQkJaWYgKHN0YXRlLT5jb25maWctPmlmX2ZyZXEgIT0gVERBMTAwNDZfRlJFUV8wNTIpIHsKLQkJCQkvKiBzcGVjaWFsIGhhY2sgZm9yIFBoaWxpcHMgRVVST1BBIEJhc2VkIGJvYXJkczoKLQkJCQkgKiBrZWVwIHRoZSBJMmMgYnJpZGdlIG9wZW4gZm9yIHR1bmVyIGFjY2VzcyBpbiBhbmFsb2cgbW9kZQotCQkJCSAqLwotCQkJCXRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKLQkJCX0KLQkJfQogCQkvKiBzZXQgb3V0cHV0cyB0byB0cmlzdGF0ZSAqLwogCQl0ZGExMDA0eF93cml0ZV9ieXRlSShzdGF0ZSwgVERBMTAwNDZIX0NPTkZfVFJJU1RBVEUxLCAweGZmKTsKIAkJdGRhMTAwNHhfd3JpdGVfbWFzayhzdGF0ZSwgVERBMTAwNFhfQ09ORkM0LCAxLCAxKTsKQEAgLTEyMDIsNiArMTE3MiwxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHRkYTEwMDR4X2kyY19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IHRkYTEwMDR4X3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJaWYgKGVuYWJsZSkgeworCQlyZXR1cm4gdGRhMTAwNHhfZW5hYmxlX3R1bmVyX2kyYyhzdGF0ZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRkYTEwMDR4X2Rpc2FibGVfdHVuZXJfaTJjKHN0YXRlKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgdGRhMTAwNHhfZ2V0X3R1bmVfc2V0dGluZ3Moc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfdHVuZV9zZXR0aW5ncyogZmVzZXR0aW5ncykKIHsKIAlmZXNldHRpbmdzLT5taW5fZGVsYXlfbXMgPSA4MDA7CkBAIC0xMjM1LDYgKzEyMTYsNyBAQAogCiAJLmluaXQgPSB0ZGExMDA0NV9pbml0LAogCS5zbGVlcCA9IHRkYTEwMDR4X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gdGRhMTAwNHhfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSB0ZGExMDA0eF9zZXRfZmUsCiAJLmdldF9mcm9udGVuZCA9IHRkYTEwMDR4X2dldF9mZSwKQEAgLTEyNjAsNyArMTI0Miw2IEBACiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwotCW1lbWNweSgmc3RhdGUtPm9wcywgJnRkYTEwMDQ1X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmRlbW9kX3R5cGUgPSBUREExMDA0WF9ERU1PRF9UREExMDA0NTsKIAogCS8qIGNoZWNrIGlmIHRoZSBkZW1vZCBpcyB0aGVyZSAqLwpAQCAtMTI3MCw3ICsxMjUxLDcgQEAKIAl9CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnRkYTEwMDQ1X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIH0KQEAgLTEyOTMsNiArMTI3NCw3IEBACiAKIAkuaW5pdCA9IHRkYTEwMDQ2X2luaXQsCiAJLnNsZWVwID0gdGRhMTAwNHhfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSB0ZGExMDA0eF9pMmNfZ2F0ZV9jdHJsLAogCiAJLnNldF9mcm9udGVuZCA9IHRkYTEwMDR4X3NldF9mZSwKIAkuZ2V0X2Zyb250ZW5kID0gdGRhMTAwNHhfZ2V0X2ZlLApAQCAtMTMxOCw3ICsxMzAwLDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdGRhMTAwNDZfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZGVtb2RfdHlwZSA9IFREQTEwMDRYX0RFTU9EX1REQTEwMDQ2OwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICovCkBAIC0xMzI4LDcgKzEzMDksNyBAQAogCX0KIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdGRhMTAwNDZfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTEwMDR4LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaAppbmRleCBjYzBjNGFmLi5iODc3YjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTAwNHguaApAQCAtNjYsMTEgKzY2LDYgQEAKIAkvKiBBR0MgY29uZmlndXJhdGlvbiAqLwogCWVudW0gdGRhMTAwNDZfYWdjIGFnY19jb25maWc7CiAKLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCXZvaWQgKCpwbGxfc2xlZXApKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwotCiAJLyogcmVxdWVzdCBmaXJtd2FyZSBmb3IgZGV2aWNlICovCiAJLyogc2V0IHRoaXMgdG8gTlVMTCBpZiB0aGUgY2FyZCBoYXMgYSBmaXJtd2FyZSBFRVBST00gKi8KIAlpbnQgKCpyZXF1ZXN0X2Zpcm13YXJlKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZncsIGNoYXIqIG5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmMKaW5kZXggOTFiYWE5Yy4uM2FhNDVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5jCkBAIC0zNyw3ICszNyw2IEBACiAKIHN0cnVjdCB0ZGE4MDgzX3N0YXRlIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIqIGkyYzsKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyBvcHM7CiAJLyogY29uZmlndXJhdGlvbiBzZXR0aW5ncyAqLwogCWNvbnN0IHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyogY29uZmlnOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7CkBAIC0yOTMsNyArMjkyLDExIEBACiB7CiAJc3RydWN0IHRkYTgwODNfc3RhdGUqIHN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CiAKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKIAl0ZGE4MDgzX3NldF9pbnZlcnNpb24gKHN0YXRlLCBwLT5pbnZlcnNpb24pOwogCXRkYTgwODNfc2V0X2ZlYyAoc3RhdGUsIHAtPnUucXBzay5mZWNfaW5uZXIpOwogCXRkYTgwODNfc2V0X3N5bWJvbHJhdGUgKHN0YXRlLCBwLT51LnFwc2suc3ltYm9sX3JhdGUpOwpAQCAtMzM0LDggKzMzNyw2IEBACiAJZm9yIChpPTA7IGk8NDQ7IGkrKykKIAkJdGRhODA4M193cml0ZXJlZyAoc3RhdGUsIGksIHRkYTgwODNfaW5pdF90YWJbaV0pOwogCi0JaWYgKHN0YXRlLT5jb25maWctPnBsbF9pbml0KSBzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdChmZSk7Ci0KIAl0ZGE4MDgzX3dyaXRlcmVnIChzdGF0ZSwgMHgwMCwgMHgzYyk7CiAJdGRhODA4M193cml0ZXJlZyAoc3RhdGUsIDB4MDAsIDB4MDQpOwogCkBAIC0zOTUsMTMgKzM5NiwxMiBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ0ZGE4MDgzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAoKHRkYTgwODNfcmVhZHJlZyhzdGF0ZSwgMHgwMCkpICE9IDB4MDUpIGdvdG8gZXJyb3I7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnRkYTgwODNfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAlzdGF0ZS0+ZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTgwODMuaAppbmRleCA0NjY2NjMzLi5lN2E0OGY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhODA4My5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGE4MDgzLmgKQEAgLTMzLDEwICszMyw2IEBACiB7CiAJLyogdGhlIGRlbW9kdWxhdG9yJ3MgaTJjIGFkZHJlc3MgKi8KIAl1OCBkZW1vZF9hZGRyZXNzOwotCi0JLyogUExMIG1haW50ZW5hbmNlICovCi0JaW50ICgqcGxsX2luaXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKTsKLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQqIHRkYTgwODNfYXR0YWNoKGNvbnN0IHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyogY29uZmlnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKaW5kZXggYWQ4NjQ3YTMuLjZiZmZlODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuYwpAQCAtMzUsNyArMzUsNiBAQAogCiBzdHJ1Y3QgdmVzMTgyMF9zdGF0ZSB7CiAJc3RydWN0IGkyY19hZGFwdGVyKiBpMmM7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgdmVzMTgyMF9jb25maWcqIGNvbmZpZzsKIAlzdHJ1Y3QgZHZiX2Zyb250ZW5kIGZyb250ZW5kOwpAQCAtMjA0LDkgKzIwMyw2IEBACiAKIAl2ZXMxODIwX3dyaXRlcmVnKHN0YXRlLCAweDM0LCBzdGF0ZS0+cHdtKTsKIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyMyw3ICsyMTksMTEgQEAKIAlpZiAocmVhbF9xYW0gPCAwIHx8IHJlYWxfcWFtID4gNCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlzdGF0ZS0+Y29uZmlnLT5wbGxfc2V0KGZlLCBwKTsKKwlpZiAoZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkgZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAwKTsKKwl9CisKIAl2ZXMxODIwX3NldF9zeW1ib2xyYXRlKHN0YXRlLCBwLT51LnFhbS5zeW1ib2xfcmF0ZSk7CiAJdmVzMTgyMF93cml0ZXJlZyhzdGF0ZSwgMHgzNCwgc3RhdGUtPnB3bSk7CiAKQEAgLTM4MCw3ICszODAsNiBAQAogCQlnb3RvIGVycm9yOwogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCi0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdmVzMTgyMF9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5yZWcwID0gdmVzMTgyMF9pbml0dGFiWzBdOwogCXN0YXRlLT5jb25maWcgPSBjb25maWc7CiAJc3RhdGUtPmkyYyA9IGkyYzsKQEAgLTM5MywxMiArMzkyLDEyIEBACiAJaWYgKHZlcmJvc2UpCiAJCXByaW50aygidmVzMTgyMDogcHdtPTB4JTAyeFxuIiwgc3RhdGUtPnB3bSk7CiAKLQlzdGF0ZS0+b3BzLmluZm8uc3ltYm9sX3JhdGVfbWluID0gKHN0YXRlLT5jb25maWctPnhpbiAvIDIpIC8gNjQ7ICAgICAgLyogU0FDTEsvNjQgPT0gKFhJTi8yKS82NCAqLwotCXN0YXRlLT5vcHMuaW5mby5zeW1ib2xfcmF0ZV9tYXggPSAoc3RhdGUtPmNvbmZpZy0+eGluIC8gMikgLyA0OyAgICAgICAvKiBTQUNMSy80ICovCi0KIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnZlczE4MjBfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKKwlzdGF0ZS0+ZnJvbnRlbmQub3BzLmluZm8uc3ltYm9sX3JhdGVfbWluID0gKHN0YXRlLT5jb25maWctPnhpbiAvIDIpIC8gNjQ7ICAgICAgLyogU0FDTEsvNjQgPT0gKFhJTi8yKS82NCAqLworCXN0YXRlLT5mcm9udGVuZC5vcHMuaW5mby5zeW1ib2xfcmF0ZV9tYXggPSAoc3RhdGUtPmNvbmZpZy0+eGluIC8gMikgLyA0OyAgICAgICAvKiBTQUNMSy80ICovCiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKwogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwogCiBlcnJvcjoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMTgyMC5oCmluZGV4IDM1NWYxMzAuLjUyMGYwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxODIwLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczE4MjAuaApAQCAtMzksMTAgKzM5LDYgQEAKIAogCS8qIFNFTEFHQyBjb250cm9sICovCiAJdTggc2VsYWdjOjE7Ci0KLQkvKiBQTEwgbWFpbnRlbmFuY2UgKi8KLQlpbnQgKCpwbGxfaW5pdCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUpOwotCWludCAoKnBsbF9zZXQpKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcyk7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogdmVzMTgyMF9hdHRhY2goY29uc3Qgc3RydWN0IHZlczE4MjBfY29uZmlnKiBjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuYwppbmRleCA4MjFkZjhlLi41NGQ3YjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmMKQEAgLTM2LDcgKzM2LDYgQEAKIAogc3RydWN0IHZlczF4OTNfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciogaTJjOwotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKIAkvKiBjb25maWd1cmF0aW9uIHNldHRpbmdzICovCiAJY29uc3Qgc3RydWN0IHZlczF4OTNfY29uZmlnKiBjb25maWc7CiAJc3RydWN0IGR2Yl9mcm9udGVuZCBmcm9udGVuZDsKQEAgLTI3OCwxMiArMjc3LDYgQEAKIAkJfQogCX0KIAotCWlmIChzdGF0ZS0+Y29uZmlnLT5wbGxfaW5pdCkgewotCQl2ZXMxeDkzX3dyaXRlcmVnKHN0YXRlLCAweDAwLCAweDExKTsKLQkJc3RhdGUtPmNvbmZpZy0+cGxsX2luaXQoZmUpOwotCQl2ZXMxeDkzX3dyaXRlcmVnKHN0YXRlLCAweDAwLCAweDAxKTsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzk1LDkgKzM4OCwxMCBAQAogewogCXN0cnVjdCB2ZXMxeDkzX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCi0JdmVzMXg5M193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgxMSk7Ci0Jc3RhdGUtPmNvbmZpZy0+cGxsX3NldChmZSwgcCk7Ci0JdmVzMXg5M193cml0ZXJlZyhzdGF0ZSwgMHgwMCwgMHgwMSk7CisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyhmZSwgcCk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJfQogCXZlczF4OTNfc2V0X2ludmVyc2lvbiAoc3RhdGUsIHAtPmludmVyc2lvbik7CiAJdmVzMXg5M19zZXRfZmVjIChzdGF0ZSwgcC0+dS5xcHNrLmZlY19pbm5lcik7CiAJdmVzMXg5M19zZXRfc3ltYm9scmF0ZSAoc3RhdGUsIHAtPnUucXBzay5zeW1ib2xfcmF0ZSk7CkBAIC00NDIsNiArNDM2LDE3IEBACiAJa2ZyZWUoc3RhdGUpOwogfQogCitzdGF0aWMgaW50IHZlczF4OTNfaTJjX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgdmVzMXg5M19zdGF0ZSogc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWlmIChlbmFibGUpIHsKKwkJcmV0dXJuIHZlczF4OTNfd3JpdGVyZWcoc3RhdGUsIDB4MDAsIDB4MTEpOworCX0gZWxzZSB7CisJCXJldHVybiB2ZXMxeDkzX3dyaXRlcmVnKHN0YXRlLCAweDAwLCAweDAxKTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcyB2ZXMxeDkzX29wczsKIAogc3RydWN0IGR2Yl9mcm9udGVuZCogdmVzMXg5M19hdHRhY2goY29uc3Qgc3RydWN0IHZlczF4OTNfY29uZmlnKiBjb25maWcsCkBAIC00NTcsNyArNDYyLDYgQEAKIAkvKiBzZXR1cCB0aGUgc3RhdGUgKi8KIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT5pMmMgPSBpMmM7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdmVzMXg5M19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5pbnZlcnNpb24gPSBJTlZFUlNJT05fT0ZGOwogCiAJLyogY2hlY2sgaWYgdGhlIGRlbW9kIGlzIHRoZXJlICsgaWRlbnRpZnkgaXQgKi8KQEAgLTQ5Miw3ICs0OTYsNyBAQAogCX0KIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdmVzMXg5M19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiAKQEAgLTUyMyw2ICs1MjcsNyBAQAogCiAJLmluaXQgPSB2ZXMxeDkzX2luaXQsCiAJLnNsZWVwID0gdmVzMXg5M19zbGVlcCwKKwkuaTJjX2dhdGVfY3RybCA9IHZlczF4OTNfaTJjX2dhdGVfY3RybCwKIAogCS5zZXRfZnJvbnRlbmQgPSB2ZXMxeDkzX3NldF9mcm9udGVuZCwKIAkuZ2V0X2Zyb250ZW5kID0gdmVzMXg5M19nZXRfZnJvbnRlbmQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3ZlczF4OTMuaAppbmRleCAxNjI3ZTM3Li5iYTg4YWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdmVzMXg5My5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy92ZXMxeDkzLmgKQEAgLTM4LDEwICszOCw2IEBACiAKIAkvKiBzaG91bGQgUFdNIGJlIGludmVydGVkPyAqLwogCXU4IGludmVydF9wd206MTsKLQotCS8qIFBMTCBtYWludGVuYW5jZSAqLwotCWludCAoKnBsbF9pbml0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7Ci0JaW50ICgqcGxsX3NldCkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKTsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgZHZiX2Zyb250ZW5kKiB2ZXMxeDkzX2F0dGFjaChjb25zdCBzdHJ1Y3QgdmVzMXg5M19jb25maWcqIGNvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvemwxMDM1My5jCmluZGV4IGQ3ZDlmNTkuLjJiOTVlOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuYwpAQCAtMzQsNyArMzQsNiBAQAogc3RydWN0IHpsMTAzNTNfc3RhdGUgewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgZnJvbnRlbmQ7Ci0Jc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgb3BzOwogCiAJc3RydWN0IHpsMTAzNTNfY29uZmlnIGNvbmZpZzsKIH07CkBAIC0xMjYsNiArMTI1LDcgQEAKIAkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW0pCiB7CiAJc3RydWN0IHpsMTAzNTNfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKIAl1OCBwbGxidWZbNl0gPSB7IDB4NjcgfTsKIAogCS8qIFRoZXNlIHNldHRpbmdzIHNldCAiYXV0by1ldmVyeXRoaW5nIiBhbmQgc3RhcnQgdGhlIEZTTS4gKi8KQEAgLTE0Miw3ICsxNDIsMzAgQEAKIAl6bDEwMzUzX3NpbmdsZV93cml0ZShmZSwgMHg2NiwgMHhFOSk7CiAJemwxMDM1M19zaW5nbGVfd3JpdGUoZmUsIDB4NjIsIDB4MEEpOwogCi0Jc3RhdGUtPmNvbmZpZy5wbGxfc2V0KGZlLCBwYXJhbSwgcGxsYnVmICsgMSk7CisJLy8gaWYgdGhlcmUgaXMgbm8gYXR0YWNoZWQgc2Vjb25kYXJ5IHR1bmVyLCB3ZSBjYWxsIHNldF9wYXJhbXMgdG8gcHJvZ3JhbQorCS8vIGEgcG90ZW50aWFsIHR1bmVyIGF0dGFjaGVkIHNvbWV3aGVyZSBlbHNlCisJaWYgKHN0YXRlLT5jb25maWcubm9fdHVuZXIpIHsKKwkJaWYgKGZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMoZmUsIHBhcmFtKTsKKwkJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpIGZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMCk7CisJCX0KKwl9CisKKwkvLyBpZiBwbGxidWYgaXMgZGVmaW5lZCwgcmV0cmlldmUgdGhlIHNldHRpbmdzCisJaWYgKGZlLT5vcHMudHVuZXJfb3BzLmNhbGNfcmVncykgeworCQlmZS0+b3BzLnR1bmVyX29wcy5jYWxjX3JlZ3MoZmUsIHBhcmFtLCBwbGxidWYrMSwgNSk7CisJCXBsbGJ1ZlsxXSA8PD0gMTsKKwl9IGVsc2UgeworCQkvLyBmYWtlIHBsbGJ1ZiBzZXR0aW5ncworCQlwbGxidWZbMV0gPSAweDYxIDw8IDE7CisJCXBsbGJ1ZlsyXSA9IDA7CisJCXBsbGJ1ZlszXSA9IDA7CisJCXBsbGJ1ZlszXSA9IDA7CisJCXBsbGJ1Zls0XSA9IDA7CisJfQorCisJLy8gdGhlcmUgaXMgbm8gY2FsbCB0byBfanVzdF8gc3RhcnQgZGVjb2RpbmcsIHNvIHdlIHNlbmQgdGhlIHBsbGJ1ZiBhbnl3YXkKKwkvLyBldmVuIGlmIHRoZXJlIGlzbid0IGEgUExMIGF0dGFjaGVkIHRvIHRoZSBzZWNvbmRhcnkgYnVzCiAJemwxMDM1M193cml0ZShmZSwgcGxsYnVmLCBzaXplb2YocGxsYnVmKSk7CiAKIAl6bDEwMzUzX3NpbmdsZV93cml0ZShmZSwgMHg3MCwgMHgwMSk7CkBAIC0yNTQsMTQgKzI3NywxMyBAQAogCS8qIHNldHVwIHRoZSBzdGF0ZSAqLwogCXN0YXRlLT5pMmMgPSBpMmM7CiAJbWVtY3B5KCZzdGF0ZS0+Y29uZmlnLCBjb25maWcsIHNpemVvZihzdHJ1Y3QgemwxMDM1M19jb25maWcpKTsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ6bDEwMzUzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjaGVjayBpZiB0aGUgZGVtb2QgaXMgdGhlcmUgKi8KIAlpZiAoemwxMDM1M19yZWFkX3JlZ2lzdGVyKHN0YXRlLCBDSElQX0lEKSAhPSBJRF9aTDEwMzUzKQogCQlnb3RvIGVycm9yOwogCiAJLyogY3JlYXRlIGR2Yl9mcm9udGVuZCAqLwotCXN0YXRlLT5mcm9udGVuZC5vcHMgPSAmc3RhdGUtPm9wczsKKwltZW1jcHkoJnN0YXRlLT5mcm9udGVuZC5vcHMsICZ6bDEwMzUzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAogCXJldHVybiAmc3RhdGUtPmZyb250ZW5kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmgKaW5kZXggNWNjNGFlNzEuLjk3NzBjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy96bDEwMzUzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3psMTAzNTMuaApAQCAtMjksMTAgKzI5LDggQEAKIAkvKiBkZW1vZHVsYXRvcidzIEkyQyBhZGRyZXNzICovCiAJdTggZGVtb2RfYWRkcmVzczsKIAotCS8qIGZ1bmN0aW9uIHdoaWNoIGNvbmZpZ3VyZXMgdGhlIFBMTCBidWZmZXIgKGZvciBzZWNvbmRhcnkgSTJDCi0JICogY29ubmVjdGVkIHR1bmVyKSBvciB0dW5lcyB0aGUgUExMIChmb3IgZGlyZWN0IGNvbm5lY3RlZCB0dW5lcikgKi8KLQlpbnQgKCpwbGxfc2V0KShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLCB1OCAqcGxsYnVmKTsKKwkvKiBzZXQgaWYgbm8gcGxsIGlzIGNvbm5lY3RlZCB0byB0aGUgc2Vjb25kYXJ5IGkyYyBidXMgKi8KKwlpbnQgbm9fdHVuZXI7CiB9OwogCiBleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCogemwxMDM1M19hdHRhY2goY29uc3Qgc3RydWN0IHpsMTAzNTNfY29uZmlnICpjb25maWcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9wbHV0bzIvcGx1dG8yLmMKaW5kZXggMWM1MzE2ZS4uYWNhYmVhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvcGx1dG8yL3BsdXRvMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3BsdXRvMi9wbHV0bzIuYwpAQCAtNDI0LDggKzQyNCw4IEBACiB9CiAKIC8qIExHIElubm90ZWsgVERURS1FMDAxUCAoSW5maW5lb24gVFVBNjAzNCkgKi8KLXN0YXRpYyBpbnQgbGdfdGR0cGUwMDFwX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQorc3RhdGljIGludCBsZ190ZHRwZTAwMXBfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCkKIHsKIAlzdHJ1Y3QgcGx1dG8gKnBsdXRvID0gZnJvbnRlbmRfdG9fcGx1dG8oZmUpOwogCXN0cnVjdCBpMmNfbXNnIG1zZzsKQEAgLTQ3Myw2ICs0NzMsOCBAQAogCW1zZy5idWYgPSBidWY7CiAJbXNnLmxlbiA9IHNpemVvZihidWYpOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlyZXQgPSBpMmNfdHJhbnNmZXIoJnBsdXRvLT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC00OTcsOCArNDk5LDYgQEAKIAkueHRhbF9mcmVxID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucGxsX3NldCA9IGxnX3RkdHBlMDAxcF9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGx1dG8yX3JlcXVlc3RfZmlybXdhcmUsCiB9OwogCkBAIC01MTEsMTEgKzUxMSwxMiBAQAogCQlkZXZfZXJyKCZwbHV0by0+cGRldi0+ZGV2LCAiY291bGQgbm90IGF0dGFjaCBmcm9udGVuZFxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KKwlwbHV0by0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnX3RkdHBlMDAxcF90dW5lcl9zZXRfcGFyYW1zOwogCiAJcmV0ID0gZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIHBsdXRvLT5mZSk7CiAJaWYgKHJldCA8IDApIHsKLQkJaWYgKHBsdXRvLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJcGx1dG8tPmZlLT5vcHMtPnJlbGVhc2UocGx1dG8tPmZlKTsKKwkJaWYgKHBsdXRvLT5mZS0+b3BzLnJlbGVhc2UpCisJCQlwbHV0by0+ZmUtPm9wcy5yZWxlYXNlKHBsdXRvLT5mZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02NDcsNyArNjQ4LDcgQEAKIAkJZ290byBlcnJfcGx1dG9faHdfZXhpdDsKIAogCS8qIGR2YiAqLwotCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZwbHV0by0+ZHZiX2FkYXB0ZXIsIERSSVZFUl9OQU1FLCBUSElTX01PRFVMRSk7CisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJnBsdXRvLT5kdmJfYWRhcHRlciwgRFJJVkVSX05BTUUsIFRISVNfTU9EVUxFLCAmcGRldi0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfaTJjX2JpdF9kZWxfYnVzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvS2NvbmZpZwppbmRleCBiNWFjN2RmLi45ODc4ODFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL0tjb25maWcKQEAgLTEwLDYgKzEwLDcgQEAKIAlzZWxlY3QgRFZCX1NQODg3MAogCXNlbGVjdCBEVkJfU1RWMDI5NwogCXNlbGVjdCBEVkJfTDY0NzgxCisJc2VsZWN0IERWQl9MTkJQMjEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBTQUE3MTQ2IGFuZCBBVjcxMTAgYmFzZWQgRFZCIGNhcmRzIGFzIHByb2R1Y2VkCiAJICBieSBGdWppdHN1LVNpZW1lbnMsIFRlY2hub3RyZW5kLCBIYXVwcGF1Z2UgYW5kIG90aGVycy4KQEAgLTY3LDYgKzY4LDcgQEAKIAlzZWxlY3QgRFZCX1REQTgwODMKIAlzZWxlY3QgRFZCX1REQTEwMDIxCiAJc2VsZWN0IERWQl9TNUgxNDIwCisJc2VsZWN0IERWQl9MTkJQMjEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBzaW1wbGUgU0FBNzE0NiBiYXNlZCBEVkIgY2FyZHMKIAkgIChzbyBjYWxsZWQgQnVkZ2V0LSBvciBOb3ZhLVBDSSBjYXJkcykgd2l0aG91dCBvbmJvYXJkCkBAIC04NCw2ICs4Niw3IEBACiAJc2VsZWN0IERWQl9TVFYwMjk3CiAJc2VsZWN0IERWQl9TVFYwMjk5CiAJc2VsZWN0IERWQl9UREExMDA0WAorCXNlbGVjdCBEVkJfTE5CUDIxCiAJaGVscAogCSAgU3VwcG9ydCBmb3Igc2ltcGxlIFNBQTcxNDYgYmFzZWQgRFZCIGNhcmRzCiAJICAoc28gY2FsbGVkIEJ1ZGdldC0gb3IgTm92YS1QQ0kgY2FyZHMpIHdpdGhvdXQgb25ib2FyZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQppbmRleCBhNjkwNzMwLi5hYTg1ZWNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9NYWtlZmlsZQpAQCAtMTUsOSArMTUsOSBAQAogCiBob3N0cHJvZ3MteQk6PSBmZHVtcAogCi1pZmRlZiBDT05GSUdfRFZCX0FWNzExMF9GSVJNV0FSRQotJChvYmopL2F2NzExMC5vOiAkKG9iaikvZmR1bXAgJChvYmopL2F2NzExMF9maXJtLmgKK2lmZXEgKCQoQ09ORklHX0RWQl9BVjcxMTBfRklSTVdBUkUpLHkpCiskKG9iaikvYXY3MTEwLm86ICQob2JqKS9hdjcxMTBfZmlybS5oCiAKLSQob2JqKS9hdjcxMTBfZmlybS5oOgorJChvYmopL2F2NzExMF9maXJtLmg6ICQob2JqKS9mZHVtcAogCSQob2JqKS9mZHVtcCAkKENPTkZJR19EVkJfQVY3MTEwX0ZJUk1XQVJFX0ZJTEUpIGR2Yl90dHBjaV9mdyAkQAogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2F2NzExMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKaW5kZXggZDAyODI0NS4uODgzMmY4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYXY3MTEwLmMKQEAgLTE1NTIsNyArMTU1Miw3IEBACiAjZW5kaWYKIAogCi1zdGF0aWMgaW50IGFscHNfYnNydjJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHB3ciA9IDA7CkBAIC0xNTc1LDYgKzE1NzUsOCBAQAogCS8vIE5PVEU6IHNpbmNlIHdlJ3JlIHVzaW5nIGEgcHJlc2NhbGVyIG9mIDIsIHdlIHNldCB0aGUKIAkvLyBkaXZpc29yIGZyZXF1ZW5jeSB0byA2Mi41a0h6IGFuZCBkaXZpZGUgYnkgMTI1IGFib3ZlCiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTE1ODQsMTAgKzE1ODYsOSBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHgwOCwKIAkueGluID0gOTAxMDAwMDBVTCwKIAkuaW52ZXJ0X3B3bSA9IDAsCi0JLnBsbF9zZXQgPSBhbHBzX2JzcnYyX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IGFscHNfdGRiZTJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMTYwMSw2ICsxNjAyLDggQEAKIAlkYXRhWzJdID0gMHg4NSB8ICgoZGl2ID4+IDEwKSAmIDB4NjApOwogCWRhdGFbM10gPSAocGFyYW1zLT5mcmVxdWVuY3kgPCAxNzQwMDAwMDAgPyAweDg4IDogcGFyYW1zLT5mcmVxdWVuY3kgPCA0NzAwMDAwMDAgPyAweDg0IDogMHg4MSk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTYxMSwxNCArMTYxNCwxMiBAQAogCS54aW4gPSA1Nzg0MDAwMFVMLAogCS5pbnZlcnQgPSAxLAogCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAotCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAogfTsKIAogCiAKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLAotCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTE2MzEsNiArMTYzMiw4IEBACiAJZGF0YVsyXSA9IDB4OGU7CiAJZGF0YVszXSA9IDB4MDA7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTYzOCwxMyArMTY0MSwxMSBAQAogCiBzdGF0aWMgc3RydWN0IHRkYTgwODNfY29uZmlnIGdydW5kaWdfMjk1MDRfNDUxX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCi0JLnBsbF9zZXQgPSBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0LAogfTsKIAogCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19jZDE1MTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwKLQkJCQkgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBwaGlsaXBzX2NkMTUxNl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYXY3MTEwKiBhdjcxMTAgPSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xNjU5LDYgKzE2NjAsOCBAQAogCWRhdGFbMl0gPSAweDhlOwogCWRhdGFbM10gPSAoZiA8IDE3NDAwMDAwMCA/IDB4YTEgOiBmIDwgNDcwMDAwMDAwID8gMHg5MiA6IDB4MzQpOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKQEAgLTE2NjksMTIgKzE2NzIsMTEgQEAKIAkueGluID0gNTc4NDAwMDBVTCwKIAkuaW52ZXJ0ID0gMSwKIAkuc2VsYWdjID0gVkVTMTgyMF9TRUxBR0NfU0lHTkFNUEVSUiwKLQkucGxsX3NldCA9IHBoaWxpcHNfY2QxNTE2X3BsbF9zZXQsCiB9OwogCiAKIAotc3RhdGljIGludCBhbHBzX3RkbGI3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX3RkbGI3X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBhdjcxMTAqIGF2NzExMCA9IGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdiwgcHdyOwpAQCAtMTY5Myw2ICsxNjk1LDggQEAKIAlkYXRhWzJdID0gMHg4NTsKIAlkYXRhWzNdID0gcHdyIDw8IDY7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtMTcwOCw3ICsxNzEyLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3A4ODcwX2NvbmZpZyBhbHBzX3RkbGI3X2NvbmZpZyA9IHsKIAogCS5kZW1vZF9hZGRyZXNzID0gMHg3MSwKLQkucGxsX3NldCA9IGFscHNfdGRsYjdfcGxsX3NldCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IGFscHNfdGRsYjdfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTE4MDYsNyArMTgwOSw3IEBACiAJMHhmZiwgMHhmZiwKIH07CiAKLXN0YXRpYyBpbnQgbmV4dXNjYV9zdHYwMjk3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBuZXh1c2NhX3N0djAyOTdfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMTgzMiw3ICsxODM1LDggQEAKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHsKIAkJcHJpbnRrKCJuZXh1c2NhOiBwbGwgdHJhbnNmZXIgZmFpbGVkIVxuIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTg0MCw4ICsxODQ0LDggQEAKIAogCS8vIHdhaXQgZm9yIFBMTCBsb2NrCiAJZm9yKGkgPSAwOyBpIDwgMjA7IGkrKykgewotCi0JCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCQlpZiAoaTJjX3RyYW5zZmVyKCZhdjcxMTAtPmkyY19hZGFwLCAmcmVhZG1zZywgMSkgPT0gMSkKIAkJCWlmIChkYXRhWzBdICYgMHg0MCkgYnJlYWs7CiAJCW1zbGVlcCgxMCk7CkBAIC0xODU1LDEyICsxODU5LDEyIEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDFDLAogCS5pbml0dGFiID0gbmV4dXNjYV9zdHYwMjk3X2luaXR0YWIsCiAJLmludmVydCA9IDEsCi0JLnBsbF9zZXQgPSBuZXh1c2NhX3N0djAyOTdfcGxsX3NldCwKKwkuc3RvcF9kdXJpbmdfcmVhZCA9IDEsCiB9OwogCiAKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80MDFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF2NzExMCogYXY3MTEwID0gKHN0cnVjdCBhdjcxMTAqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xODg3LDEzICsxODkxLDE0IEBACiAJZGF0YVsyXSA9ICgoZGl2ID4+IDEwKSAmIDB4NjApIHwgY2ZnOwogCWRhdGFbM10gPSAoY3B1bXAgPDwgNikgfCBiYW5kX3NlbGVjdDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmF2NzExMC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGw2NDc4MV9jb25maWcgZ3J1bmRpZ18yOTUwNF80MDFfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1NSwKLQkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDAxX3BsbF9zZXQsCiB9OwogCiAKQEAgLTIwNzksNiArMjA4NCw5IEBACiAJCWNhc2UgMHgwMDAwOiAvLyBGdWppdHN1L1NpZW1lbnMgRFZCLUNhYmxlICh2ZXMxODIwL1BoaWxpcHMgQ0QxNTE2KD8/KSkKIAkJCWF2NzExMC0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmcGhpbGlwc19jZDE1MTZfY29uZmlnLAogCQkJCQkJICAgICZhdjcxMTAtPmkyY19hZGFwLCByZWFkX3B3bShhdjcxMTApKTsKKwkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jZDE1MTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAKQEAgLTIwOTEsOSArMjA5OSwxMCBAQAogCQkJLy8gdHJ5IHRoZSBBTFBTIEJTUlYyIGZpcnN0IG9mIGFsbAogCQkJYXY3MTEwLT5mZSA9IHZlczF4OTNfYXR0YWNoKCZhbHBzX2JzcnYyX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXApOwogCQkJaWYgKGF2NzExMC0+ZmUpIHsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJCWF2NzExMC0+ZmUtPm9wcy5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKIAkJCQlhdjcxMTAtPnJlY292ZXIgPSBkdmJfc19yZWNvdmVyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjEwMSw5ICsyMTEwLDEyIEBACiAJCQkvLyB0cnkgdGhlIEFMUFMgQlNSVTYgbm93CiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+dHVuZXJfcHJpdiA9ICZhdjcxMTAtPmkyY19hZGFwOworCisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnNldF90b25lID0gYXY3MTEwX3NldF90b25lOwogCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yMTExLDkgKzIxMjMsMTAgQEAKIAkJCS8vIFRyeSB0aGUgZ3J1bmRpZyAyOTUwNC00NTEKIAkJCWF2NzExMC0+ZmUgPSB0ZGE4MDgzX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJCWF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBncnVuZGlnXzI5NTA0XzQ1MV90dW5lcl9zZXRfcGFyYW1zOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYXY3MTEwX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJCWF2NzExMC0+ZmUtPm9wcy5zZXRfdG9uZSA9IGF2NzExMF9zZXRfdG9uZTsKIAkJCQlhdjcxMTAtPnJlY292ZXIgPSBkdmJfc19yZWNvdmVyOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjEyNCwxMSArMjEzNywxNyBAQAogCQkJCS8qIFNpZW1lbnMgRFZCLUMgKGZ1bGwtbGVuZ3RoIGNhcmQpIFZFUzE4MjAvUGhpbGlwcyBDRDE1MTYgKi8KIAkJCQlhdjcxMTAtPmZlID0gdmVzMTgyMF9hdHRhY2goJnBoaWxpcHNfY2QxNTE2X2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXAsCiAJCQkJCQkJcmVhZF9wd20oYXY3MTEwKSk7CisJCQkJaWYgKGF2NzExMC0+ZmUpIHsKKwkJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jZDE1MTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQljYXNlIDB4MDAwMzoKIAkJCQkvKiBIYXVwcGF1Z2UgRFZCLUMgMi4xIFZFUzE4MjAvQUxQUyBUREJFMiAqLwogCQkJCWF2NzExMC0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwLAogCQkJCQkJCXJlYWRfcHdtKGF2NzExMCkpOworCQkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQl9CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxMzcsMjAgKzIxNTYsMjcgQEAKIAogCQkJLy8gQUxQUyBURExCNwogCQkJYXY3MTEwLT5mZSA9IHNwODg3MF9hdHRhY2goJmFscHNfdGRsYjdfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CisJCQlpZiAoYXY3MTEwLT5mZSkgeworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRsYjdfdHVuZXJfc2V0X3BhcmFtczsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgMHgwMDAyOiAvLyBIYXVwcGF1Z2UvVFQgRFZCLUMgcHJlbWl1bSByZXYyLlgKIAogCQkJYXY3MTEwLT5mZSA9IHZlczE4MjBfYXR0YWNoKCZhbHBzX3RkYmUyX2NvbmZpZywgJmF2NzExMC0+aTJjX2FkYXAsIHJlYWRfcHdtKGF2NzExMCkpOworCQkJaWYgKGF2NzExMC0+ZmUpIHsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX3RkYmUyX3R1bmVyX3NldF9wYXJhbXM7CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwNDogLy8gR2FsYXhpcyBEVkItUyByZXYxLjMKIAkJCS8qIEFMUFMgQlNSVjIgKi8KIAkJCWF2NzExMC0+ZmUgPSB2ZXMxeDkzX2F0dGFjaCgmYWxwc19ic3J2Ml9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtczsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGF2NzExMF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOworCQkJCWF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuc2V0X3RvbmUgPSBhdjcxMTBfc2V0X3RvbmU7CiAJCQkJYXY3MTEwLT5yZWNvdmVyID0gZHZiX3NfcmVjb3ZlcjsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjE1OSw5ICsyMTg1LDEwIEBACiAJCQkvKiBHcnVuZGlnIDI5NTA0LTQ1MSAqLwogCQkJYXY3MTEwLT5mZSA9IHRkYTgwODNfYXR0YWNoKCZncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYXY3MTEwX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQkJYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGF2NzExMF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCQlhdjcxMTAtPmZlLT5vcHMtPnNldF90b25lID0gYXY3MTEwX3NldF90b25lOworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBhdjcxMTBfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBhdjcxMTBfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnNldF90b25lID0gYXY3MTEwX3NldF90b25lOwogCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQl9CiAJCQlicmVhazsKQEAgLTIxNjksMTIgKzIxOTYsMTcgQEAKIAkJY2FzZSAweDAwMDg6IC8vIEhhdXBwYXVnZS9UVCBEVkItVAogCiAJCQlhdjcxMTAtPmZlID0gbDY0NzgxX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80MDFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CisJCQlpZiAoYXY3MTEwLT5mZSkgeworCQkJCWF2NzExMC0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDAxX3R1bmVyX3NldF9wYXJhbXM7CisJCQl9CiAJCQlicmVhazsKIAogCQljYXNlIDB4MDAwQTogLy8gSGF1cHBhdWdlL1RUIE5leHVzLUNBIHJldjEuWAogCiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5N19hdHRhY2goJm5leHVzY2Ffc3R2MDI5N19jb25maWcsICZhdjcxMTAtPmkyY19hZGFwKTsKIAkJCWlmIChhdjcxMTAtPmZlKSB7CisJCQkJYXY3MTEwLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbmV4dXNjYV9zdHYwMjk3X3R1bmVyX3NldF9wYXJhbXM7CisKIAkJCQkvKiBzZXQgVERBOTgxOSBpbnRvIERWQiBtb2RlICovCiAJCQkJc2FhNzE0Nl9zZXRncGlvKGF2NzExMC0+ZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvLyBUREE5MTk4IHBpbjkoU1REKQogCQkJCXNhYTcxNDZfc2V0Z3BpbyhhdjcxMTAtPmRldiwgMywgU0FBNzE0Nl9HUElPX09VVExPKTsgLy8gVERBOTE5OCBwaW4zMChWSUYpCkBAIC0yMTg5LDEzICsyMjIxLDE2IEBACiAJCQkvKiBBTFBTIEJTQkUxICovCiAJCQlhdjcxMTAtPmZlID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNiZTFfY29uZmlnLCAmYXY3MTEwLT5pMmNfYWRhcCk7CiAJCQlpZiAoYXY3MTEwLT5mZSkgewotCQkJCWlmIChsbmJwMjFfaW5pdChhdjcxMTAtPmZlLCAmYXY3MTEwLT5pMmNfYWRhcCwgMCwgMCkpIHsKKwkJCQlhdjcxMTAtPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzYmUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQkJYXY3MTEwLT5mZS0+dHVuZXJfcHJpdiA9ICZhdjcxMTAtPmkyY19hZGFwOworCisJCQkJaWYgKGxuYnAyMV9hdHRhY2goYXY3MTEwLT5mZSwgJmF2NzExMC0+aTJjX2FkYXAsIDAsIDApKSB7CiAJCQkJCXByaW50aygiZHZiLXR0cGNpOiBMTkJQMjEgbm90IGZvdW5kIVxuIik7Ci0JCQkJCWlmIChhdjcxMTAtPmZlLT5vcHMtPnJlbGVhc2UpCi0JCQkJCQlhdjcxMTAtPmZlLT5vcHMtPnJlbGVhc2UoYXY3MTEwLT5mZSk7CisJCQkJCWlmIChhdjcxMTAtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQkJCWF2NzExMC0+ZmUtPm9wcy5yZWxlYXNlKGF2NzExMC0+ZmUpOwogCQkJCQlhdjcxMTAtPmZlID0gTlVMTDsKIAkJCQl9IGVsc2UgewotCQkJCQlhdjcxMTAtPmZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJCQlhdjcxMTAtPmZlLT5vcHMuZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCA9IE5VTEw7CiAJCQkJCWF2NzExMC0+cmVjb3ZlciA9IGR2Yl9zX3JlY292ZXI7CiAJCQkJfQogCQkJfQpAQCAtMjIxMiwyMSArMjI0NywyMSBAQAogCQkgICAgICAgYXY3MTEwLT5kZXYtPnBjaS0+c3Vic3lzdGVtX3ZlbmRvciwKIAkJICAgICAgIGF2NzExMC0+ZGV2LT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpOwogCX0gZWxzZSB7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5pbml0LCBhdjcxMTAtPmZlX2luaXQsIGF2NzExMF9mZV9pbml0KTsKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPnJlYWRfc3RhdHVzLCBhdjcxMTAtPmZlX3JlYWRfc3RhdHVzLCBhdjcxMTBfZmVfcmVhZF9zdGF0dXMpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+ZGlzZXFjX3Jlc2V0X292ZXJsb2FkLCBhdjcxMTAtPmZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCwgYXY3MTEwX2ZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCk7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kLCBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQsIGF2NzExMF9mZV9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kKTsKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0LCBhdjcxMTAtPmZlX2Rpc2VxY19zZW5kX2J1cnN0LCBhdjcxMTBfZmVfZGlzZXFjX3NlbmRfYnVyc3QpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+c2V0X3RvbmUsIGF2NzExMC0+ZmVfc2V0X3RvbmUsIGF2NzExMF9mZV9zZXRfdG9uZSk7Ci0JCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSwgYXY3MTEwLT5mZV9zZXRfdm9sdGFnZSwgYXY3MTEwX2ZlX3NldF92b2x0YWdlOykKLQkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQsIGF2NzExMC0+ZmVfZGlzaG5ldHdvcmtfc2VuZF9sZWdhY3lfY29tbWFuZCwgYXY3MTEwX2ZlX2Rpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQpOwotCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy0+c2V0X2Zyb250ZW5kLCBhdjcxMTAtPmZlX3NldF9mcm9udGVuZCwgYXY3MTEwX2ZlX3NldF9mcm9udGVuZCk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLmluaXQsIGF2NzExMC0+ZmVfaW5pdCwgYXY3MTEwX2ZlX2luaXQpOworCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5yZWFkX3N0YXR1cywgYXY3MTEwLT5mZV9yZWFkX3N0YXR1cywgYXY3MTEwX2ZlX3JlYWRfc3RhdHVzKTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuZGlzZXFjX3Jlc2V0X292ZXJsb2FkLCBhdjcxMTAtPmZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCwgYXY3MTEwX2ZlX2Rpc2VxY19yZXNldF9vdmVybG9hZCk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQsIGF2NzExMC0+ZmVfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCwgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQpOworCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5kaXNlcWNfc2VuZF9idXJzdCwgYXY3MTEwLT5mZV9kaXNlcWNfc2VuZF9idXJzdCwgYXY3MTEwX2ZlX2Rpc2VxY19zZW5kX2J1cnN0KTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuc2V0X3RvbmUsIGF2NzExMC0+ZmVfc2V0X3RvbmUsIGF2NzExMF9mZV9zZXRfdG9uZSk7CisJCUZFX0ZVTkNfT1ZFUlJJREUoYXY3MTEwLT5mZS0+b3BzLnNldF92b2x0YWdlLCBhdjcxMTAtPmZlX3NldF92b2x0YWdlLCBhdjcxMTBfZmVfc2V0X3ZvbHRhZ2U7KQorCQlGRV9GVU5DX09WRVJSSURFKGF2NzExMC0+ZmUtPm9wcy5kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kLCBhdjcxMTAtPmZlX2Rpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQsIGF2NzExMF9mZV9kaXNobmV0d29ya19zZW5kX2xlZ2FjeV9jb21tYW5kKTsKKwkJRkVfRlVOQ19PVkVSUklERShhdjcxMTAtPmZlLT5vcHMuc2V0X2Zyb250ZW5kLCBhdjcxMTAtPmZlX3NldF9mcm9udGVuZCwgYXY3MTEwX2ZlX3NldF9mcm9udGVuZCk7CiAKIAkJcmV0ID0gZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZhdjcxMTAtPmR2Yl9hZGFwdGVyLCBhdjcxMTAtPmZlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByaW50aygiYXY3MTEwOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoYXY3MTEwLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWF2NzExMC0+ZmUtPm9wcy0+cmVsZWFzZShhdjcxMTAtPmZlKTsKKwkJCWlmIChhdjcxMTAtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQlhdjcxMTAtPmZlLT5vcHMucmVsZWFzZShhdjcxMTAtPmZlKTsKIAkJCWF2NzExMC0+ZmUgPSBOVUxMOwogCQl9CiAJfQpAQCAtMjQxMyw3ICsyNDQ4LDcgQEAKIAkJZ290byBlcnJfa2ZyZWVfMDsKIAogCXJldCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZhdjcxMTAtPmR2Yl9hZGFwdGVyLCBhdjcxMTAtPmNhcmRfbmFtZSwKLQkJCQkgICBUSElTX01PRFVMRSk7CisJCQkJICAgVEhJU19NT0RVTEUsICZkZXYtPnBjaS0+ZGV2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJfcHV0X2Zpcm13YXJlXzE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1hdi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKaW5kZXggOGE3Y2Q3ZC4uNjE2M2NiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWF2LmMKQEAgLTUwLDYgKzUwLDEyIEBACiAKICNkZWZpbmUgREVCSUNJQ0FNCQkweDAyNDIwMDAwCiAKKyNkZWZpbmUgU0xPVFNUQVRVU19OT05FICAgICAgICAgMQorI2RlZmluZSBTTE9UU1RBVFVTX1BSRVNFTlQgICAgICAyCisjZGVmaW5lIFNMT1RTVEFUVVNfUkVTRVQgICAgICAgIDQKKyNkZWZpbmUgU0xPVFNUQVRVU19SRUFEWSAgICAgICAgOAorI2RlZmluZSBTTE9UU1RBVFVTX09DQ1VQSUVEICAgICAoU0xPVFNUQVRVU19QUkVTRU5UfFNMT1RTVEFUVVNfUkVTRVR8U0xPVFNUQVRVU19SRUFEWSkKKwogc3RydWN0IGJ1ZGdldF9hdiB7CiAJc3RydWN0IGJ1ZGdldCBidWRnZXQ7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmQ7CkBAIC01OCw4ICs2NCwxNSBAQAogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBjaWludGZfaXJxX3Rhc2tsZXQ7CiAJaW50IHNsb3Rfc3RhdHVzOwogCXN0cnVjdCBkdmJfY2FfZW41MDIyMSBjYTsKKwl1OCByZWluaXRpYWxpc2VfZGVtb2Q6MTsKKwl1OCB0ZGExMDAyMV9wb2Nsa3A6MTsKKwl1OCB0ZGExMDAyMV90c19lbmFibGVkOworCWludCAoKnRkYTEwMDIxX3NldF9mcm9udGVuZCkoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcCk7CiB9OwogCitzdGF0aWMgaW50IGNpaW50Zl9zbG90X3NodXRkb3duKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIGludCBzbG90KTsKKworCiAvKiBHUElPIENvbm5lY3Rpb25zOgogICogMCAtIFZjYy9SZXNldCAoUmVzZXQgaXMgY29udHJvbGxlZCBieSBjYXBhY2l0b3IpLiBSZXNldHMgdGhlIGZyb250ZW5kICpBUyBXRUxMKiEKICAqIDEgLSBDSSBtZW1vcnkgc2VsZWN0IDA9PklPIG1lbW9yeSwgMT0+QXR0cmlidXRlIE1lbW9yeQpAQCAtMTI5LDkgKzE0MiwxMCBAQAogCXVkZWxheSgxKTsKIAogCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgYWRkcmVzcyAmIDB4ZmZmLCAxLCAwLCAxKTsKLQotCWlmIChyZXN1bHQgPT0gLUVUSU1FRE9VVCkKLQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CisJaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKSB7CisJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAxXG4iKTsKKwl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMTQ3LDkgKzE2MSwxMCBAQAogCXVkZWxheSgxKTsKIAogCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpd3JpdGUoJmJ1ZGdldF9hdi0+YnVkZ2V0LCBERUJJQ0lDQU0sIGFkZHJlc3MgJiAweGZmZiwgMSwgdmFsdWUsIDAsIDEpOwotCi0JaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKQotCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKKwkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDJcbiIpOworCX0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xNjUsOSArMTgwLDExIEBACiAJdWRlbGF5KDEpOwogCiAJcmVzdWx0ID0gdHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgMCwgMCk7Ci0KLQlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpCi0JCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSAwOworCWlmICgocmVzdWx0ID09IC1FVElNRURPVVQpIHx8ICgocmVzdWx0ID09IDB4ZmYpICYmICgoYWRkcmVzcyAmIDMpIDwgMikpKSB7CisJCWNpaW50Zl9zbG90X3NodXRkb3duKGNhLCBzbG90KTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCAzXG4iKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE4Myw5ICsyMDAsMTAgQEAKIAl1ZGVsYXkoMSk7CiAKIAlyZXN1bHQgPSB0dHBjaV9idWRnZXRfZGViaXdyaXRlKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCBhZGRyZXNzICYgMywgMSwgdmFsdWUsIDAsIDApOwotCi0JaWYgKHJlc3VsdCA9PSAtRVRJTUVET1VUKQotCQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlpZiAocmVzdWx0ID09IC1FVElNRURPVVQpIHsKKwkJY2lpbnRmX3Nsb3Rfc2h1dGRvd24oY2EsIHNsb3QpOworCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkIDVcbiIpOworCX0KIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xOTMsMTIgKzIxMSwxMiBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCB0aW1lb3V0ID0gNTA7IC8vIDUgc2Vjb25kcyAoNC40LjYgUmVhZHkpCiAKIAlpZiAoc2xvdCAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRwcmludGsoMSwgImNpaW50Zl9zbG90X3Jlc2V0XG4iKTsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19SRVNFVDsKIAogCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwogCkBAIC0yMDgsMjAgKzIyNiwxNyBAQAogCW1zbGVlcCgyMCk7IC8qIDIwIG1zIFZjYyBzZXR0bGluZyB0aW1lICovCiAKIAlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOyAvKiBlbmFibGUgY2FyZCAqLworCXR0cGNpX2J1ZGdldF9zZXRfdmlkZW9fcG9ydChzYWEsIEJVREdFVF9WSURFT19QT1JUQik7CisJbXNsZWVwKDIwKTsKIAotCS8qIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBiYXNlZCBvbiBwaW4gMTYgUkVBRFkgb2YgdGhlIHBjbWNpYSBwb3J0LAotCSAqIGJ1dCBBRkFJQ1MgaXQgaXMgbm90IHJvdXRlZCB0byB0aGUgc2FhNzE0NiAqLwotCXdoaWxlICgtLXRpbWVvdXQgPiAwICYmIGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApICE9IDB4MWQpCi0JCW1zbGVlcCgxMDApOworCS8qIHJlaW5pdGlhbGlzZSB0aGUgZnJvbnRlbmQgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGJ1ZGdldF9hdi0+cmVpbml0aWFsaXNlX2RlbW9kKQorCQlkdmJfZnJvbnRlbmRfcmVpbml0aWFsaXNlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAKLQkvKiByZWluaXRpYWxpc2UgdGhlIGZyb250ZW5kICovCi0JZHZiX2Zyb250ZW5kX3JlaW5pdGlhbGlzZShidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQpOwotCi0JaWYgKHRpbWVvdXQgPD0gMCkKLQl7Ci0JCXByaW50ayhLRVJOX0VSUiAiYnVkZ2V0LWF2OiBjYW0gcmVzZXQgZmFpbGVkICh0aW1lb3V0KS5cbiIpOwotCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAyLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOyAvKiBkaXNhYmxlIGNhcmQgKi8KLQkJcmV0dXJuIC1FVElNRURPVVQ7CisJLyogc2V0IHRkYTEwMDIxIGJhY2sgdG8gb3JpZ2luYWwgY2xvY2sgY29uZmlndXJhdGlvbiBvbiByZXNldCAqLworCWlmIChidWRnZXRfYXYtPnRkYTEwMDIxX3BvY2xrcCkgeworCQl0ZGExMDAyMV93cml0ZV9ieXRlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgMHgxMiwgMHhhMCk7CisJCWJ1ZGdldF9hdi0+dGRhMTAwMjFfdHNfZW5hYmxlZCA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMzgsNyArMjUzLDEzIEBACiAJZHByaW50aygxLCAiY2lpbnRmX3Nsb3Rfc2h1dGRvd25cbiIpOwogCiAJdHRwY2lfYnVkZ2V0X3NldF92aWRlb19wb3J0KHNhYSwgQlVER0VUX1ZJREVPX1BPUlRCKTsKLQlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gMDsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19OT05FOworCisJLyogc2V0IHRkYTEwMDIxIGJhY2sgdG8gb3JpZ2luYWwgY2xvY2sgY29uZmlndXJhdGlvbiB3aGVuIGNhbSByZW1vdmVkICovCisJaWYgKGJ1ZGdldF9hdi0+dGRhMTAwMjFfcG9jbGtwKSB7CisJCXRkYTEwMDIxX3dyaXRlX2J5dGUoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGEwKTsKKwkJYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkID0gMDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Myw2ICsyNzQsMTMgQEAKIAlkcHJpbnRrKDEsICJjaWludGZfc2xvdF90c19lbmFibGU6ICVkXG4iLCBidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKTsKIAogCXR0cGNpX2J1ZGdldF9zZXRfdmlkZW9fcG9ydChzYWEsIEJVREdFVF9WSURFT19QT1JUQSk7CisKKwkvKiB0ZGExMDAyMSBzZWVtcyB0byBuZWVkIGEgZGlmZmVyZW50IFRTIGNsb2NrIGNvbmZpZyB3aGVuIGRhdGEgaXMgcm91dGVkIHRvIHRoZSBDQU0gKi8KKwlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV9wb2Nsa3ApIHsKKwkJdGRhMTAwMjFfd3JpdGVfYnl0ZShidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQsIDB4MTIsIDB4YTEpOworCQlidWRnZXRfYXYtPnRkYTEwMDIxX3RzX2VuYWJsZWQgPSAxOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yNjAsNTAgKzI4OCw2MSBAQAogewogCXN0cnVjdCBidWRnZXRfYXYgKmJ1ZGdldF9hdiA9IChzdHJ1Y3QgYnVkZ2V0X2F2ICopIGNhLT5kYXRhOwogCXN0cnVjdCBzYWE3MTQ2X2RldiAqc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwotCWludCBjYW1fcHJlc2VudCA9IDA7CisJaW50IHJlc3VsdDsKIAogCWlmIChzbG90ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFidWRnZXRfYXYtPnNsb3Rfc3RhdHVzKQotCXsKLQkJLy8gZmlyc3Qgb2YgYWxsIHRlc3QgdGhlIGNhcmQgZGV0ZWN0IGxpbmUKKwkvKiB0ZXN0IHRoZSBjYXJkIGRldGVjdCBsaW5lIC0gbmVlZHMgdG8gYmUgZG9uZSBjYXJlZnVsbHkKKwkgKiBzaW5jZSBpdCBuZXZlciBnb2VzIGhpZ2ggZm9yIHNvbWUgQ0FNcyBvbiB0aGlzIGludGVyZmFjZSAoZS5nLiB0b3B1cHR2KSAqLworCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkgewogCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fSU5QVVQpOwogCQl1ZGVsYXkoMSk7Ci0JCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikKLQkJewotCQkJY2FtX3ByZXNlbnQgPSAxOwotCQl9Ci0JCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDMsIFNBQTcxNDZfR1BJT19PVVRMTyk7Ci0KLQkJLy8gdGhhdCBpcyB1bnJlbGlhYmxlIGhvd2V2ZXIsIHNvIHRyeSBhbmQgcmVhZCBmcm9tIElPIG1lbW9yeQotCQlpZiAoIWNhbV9wcmVzZW50KQotCQl7Ci0JCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwotCQkJaWYgKHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSkgIT0gLUVUSU1FRE9VVCkKLQkJCXsKLQkJCQljYW1fcHJlc2VudCA9IDE7CisJCWlmIChzYWE3MTQ2X3JlYWQoc2FhLCBQU1IpICYgTUFTS18wNikgeworCQkJaWYgKGJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPT0gU0xPVFNUQVRVU19OT05FKSB7CisJCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IFNMT1RTVEFUVVNfUFJFU0VOVDsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBBXG4iKTsKIAkJCX0KIAkJfQorCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOworCX0KIAotCQkvLyBkaWQgd2UgZmluZCBzb21ldGhpbmc/Ci0JCWlmIChjYW1fcHJlc2VudCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gaW5zZXJ0ZWRcbiIpOwotCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDE7Ci0JCX0KLQl9IGVsc2UgaWYgKCFvcGVuKSB7CisJLyogV2UgYWxzbyB0cnkgYW5kIHJlYWQgZnJvbSBJTyBtZW1vcnkgdG8gd29yayByb3VuZCB0aGUgYWJvdmUgZGV0ZWN0aW9uIGJ1Zy4gSWYKKwkgKiB0aGVyZSBpcyBubyBDQU0sIHdlIHdpbGwgZ2V0IGEgdGltZW91dC4gT25seSBkb25lIGlmIHRoZXJlIGlzIG5vIGNhbQorCSAqIHByZXNlbnQsIHNpbmNlIHRoaXMgdGVzdCBhY3R1YWxseSBicmVha3Mgc29tZSBjYW1zIDooCisJICoKKwkgKiBpZiB0aGUgQ0kgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLCB3ZSBhbHNvIGRvIHRoZSBhYm92ZSB0ZXN0IHNpbmNlIHdlCisJICogZG9uJ3QgY2FyZSBpZiB0aGUgY2FtIGhhcyBwcm9ibGVtcyAtIHdlJ2xsIGJlIHJlc2V0dGluZyBpdCBvbiBvcGVuKCkgYW55d2F5ICovCisJaWYgKChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkgfHwgKCFvcGVuKSkgewogCQlzYWE3MTQ2X3NldGdwaW8oYnVkZ2V0X2F2LT5idWRnZXQuZGV2LCAxLCBTQUE3MTQ2X0dQSU9fT1VUTE8pOwotCQlpZiAodHRwY2lfYnVkZ2V0X2RlYmlyZWFkKCZidWRnZXRfYXYtPmJ1ZGdldCwgREVCSUNJQ0FNLCAwLCAxLCAwLCAxKSA9PSAtRVRJTUVET1VUKQotCQl7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBlamVjdGVkXG4iKTsKLQkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDIsIFNBQTcxNDZfR1BJT19PVVRISSk7IC8qIGRpc2FibGUgY2FyZCAqLwotCQkJYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9IDA7CisJCXJlc3VsdCA9IHR0cGNpX2J1ZGdldF9kZWJpcmVhZCgmYnVkZ2V0X2F2LT5idWRnZXQsIERFQklDSUNBTSwgMCwgMSwgMCwgMSk7CisJCWlmICgocmVzdWx0ID49IDApICYmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IFNMT1RTVEFUVVNfTk9ORSkpIHsKKwkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1BSRVNFTlQ7CisJCQlwcmludGsoS0VSTl9JTkZPICJidWRnZXQtYXY6IGNhbSBpbnNlcnRlZCBCXG4iKTsKKwkJfSBlbHNlIGlmIChyZXN1bHQgPCAwKSB7CisJCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAhPSBTTE9UU1RBVFVTX05PTkUpIHsKKwkJCQljaWludGZfc2xvdF9zaHV0ZG93bihjYSwgc2xvdCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnVkZ2V0LWF2OiBjYW0gZWplY3RlZCA1XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQogCX0KIAotCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID09IDEpCi0JCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisJLyogcmVhZCBmcm9tIGF0dHJpYnV0ZSBtZW1vcnkgaW4gcmVzZXQvcmVhZHkgc3RhdGUgdG8ga25vdyB3aGVuIHRoZSBDQU0gaXMgcmVhZHkgKi8KKwlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyA9PSBTTE9UU1RBVFVTX1JFU0VUKSB7CisJCXJlc3VsdCA9IGNpaW50Zl9yZWFkX2F0dHJpYnV0ZV9tZW0oY2EsIHNsb3QsIDApOworCQlpZiAocmVzdWx0ID09IDB4MWQpIHsKKwkJCWJ1ZGdldF9hdi0+c2xvdF9zdGF0dXMgPSBTTE9UU1RBVFVTX1JFQURZOworCQl9CisJfQogCisJLyogd29yayBvdXQgY29ycmVjdCByZXR1cm4gY29kZSAqLworCWlmIChidWRnZXRfYXYtPnNsb3Rfc3RhdHVzICE9IFNMT1RTVEFUVVNfTk9ORSkgeworCQlpZiAoYnVkZ2V0X2F2LT5zbG90X3N0YXR1cyAmIFNMT1RTVEFUVVNfUkVBRFkpIHsKKwkJCXJldHVybiBEVkJfQ0FfRU41MDIyMV9QT0xMX0NBTV9QUkVTRU5UIHwgRFZCX0NBX0VONTAyMjFfUE9MTF9DQU1fUkVBRFk7CisJCX0KKwkJcmV0dXJuIERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQ7CisJfQogCXJldHVybiAwOwogfQogCkBAIC0zMzMsNiArMzcyLDggQEAKIAlidWRnZXRfYXYtPmNhLnNsb3RfdHNfZW5hYmxlID0gY2lpbnRmX3Nsb3RfdHNfZW5hYmxlOwogCWJ1ZGdldF9hdi0+Y2EucG9sbF9zbG90X3N0YXR1cyA9IGNpaW50Zl9wb2xsX3Nsb3Rfc3RhdHVzOwogCWJ1ZGdldF9hdi0+Y2EuZGF0YSA9IGJ1ZGdldF9hdjsKKwlidWRnZXRfYXYtPmJ1ZGdldC5jaV9wcmVzZW50ID0gMTsKKwlidWRnZXRfYXYtPnNsb3Rfc3RhdHVzID0gU0xPVFNUQVRVU19OT05FOwogCiAJaWYgKChyZXN1bHQgPSBkdmJfY2FfZW41MDIyMV9pbml0KCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkJICAmYnVkZ2V0X2F2LT5jYSwgMCwgMSkpICE9IDApIHsKQEAgLTM0MSw3ICszODIsNiBAQAogCX0KIAogCXByaW50ayhLRVJOX0lORk8gImJ1ZGdldC1hdjogY2kgaW50ZXJmYWNlIGluaXRpYWxpc2VkLlxuIik7Ci0JYnVkZ2V0X2F2LT5idWRnZXQuY2lfcHJlc2VudCA9IDE7CiAJcmV0dXJuIDA7CiAKIGVycm9yOgpAQCAtNDcyLDEyICs1MTIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3N1MTI3OF90eV9jaV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKLQkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTMyIGRpdjsKIAl1OCBidWZbNF07CisJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7LmFkZHIgPSAweDYxLC5mbGFncyA9IDAsLmJ1ZiA9IGJ1ZiwubGVuID0gc2l6ZW9mKGJ1ZikgfTsKIAogCWlmICgocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQpAQCAtNTAxLDcgKzU0MSw5IEBACiAJZWxzZSBpZiAocGFyYW1zLT5mcmVxdWVuY3kgPCAyMTUwMDAwKQogCQlidWZbM10gfD0gMHhDMDsKIAotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC01MDksOSArNTUxLDggQEAKICNkZWZpbmUgTUlOMihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiAjZGVmaW5lIE1JTjMoYSxiLGMpIE1JTjIoTUlOMihhLGIpLGMpCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19zdTEyNzhzaDJfdHVhNjEwMF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAotCQkJCQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywKLQkJCQkJc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4c2gyX3R1YTYxMDBfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJCSAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXU4IHJlZzAgWzJdID0geyAweDAwLCAweDAwIH07CiAJdTggcmVnMSBbNF0gPSB7IDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAgfTsKQEAgLTUyMSw2ICs1NjIsNyBAQAogCWludCBSLCBBLCBOLCBQLCBNOwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9IHsuYWRkciA9IDB4NjAsLmZsYWdzID0gMCwuYnVmID0gTlVMTCwubGVuID0gMCB9OwogCWludCBmcmVxID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJc3RydWN0IGJ1ZGdldCAqYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQgKikgZmUtPmR2Yi0+cHJpdjsKIAogCWZpcnN0X1pGID0gKGZyZXEpIC8gMTAwMDsKIApAQCAtNjIwLDIxICs2NjIsMjUgQEAKIAlyZWcwWzFdIHw9IDB4MDM7CiAKIAkvKiBhbHJlYWR5IGVuYWJsZWQgLSBkbyBub3QgcmVlbmFibGUgaTJjIHJlcGVhdGVyIG9yIFRYIGZhaWxzICovCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAltc2cuYnVmID0gcmVnMDsKIAltc2cubGVuID0gc2l6ZW9mKHJlZzApOwotCWlmIChpMmNfdHJhbnNmZXIoaTJjLCAmbXNnLCAxKSAhPSAxKQorCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCi0Jc3R2MDI5OV9lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCW1zZy5idWYgPSByZWcxOwogCW1zZy5sZW4gPSBzaXplb2YocmVnMSk7Ci0JaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCisJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKLQlzdHYwMjk5X2VuYWJsZV9wbGxpMmMoZmUpOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJbXNnLmJ1ZiA9IHJlZzI7CiAJbXNnLmxlbiA9IHNpemVvZihyZWcyKTsKLQlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAogCXJldHVybiAwOwpAQCAtNjkyLDcgKzczOCw2IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3BsbF9zZXQsCiB9OwogCiAKQEAgLTcwNiw3ICs3NTEsNiBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMCwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV9wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBjaW5lcmd5XzEyMDBzXzE4OTRfMDAxMF9jb25maWcgPSB7CkBAIC03MTksMTAgKzc2Myw5IEBACiAJLnZvbHQxM19vcDBfb3AxID0gU1RWMDI5OV9WT0xUMTNfT1AwLAogCS5taW5fZGVsYXlfbXMgPSAxMDAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R5X2NpX3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4c2gyX3R1YTYxMDBfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgcGhpbGlwc19jdTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfY3UxMjE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJdTggYnVmWzRdOwpAQCAtNzM4LDYgKzc4MSw4IEBACiAJYnVmWzNdID0gKHBhcmFtcy0+ZnJlcXVlbmN5IDwgMTUwMDAwMDAwID8gMHgwMSA6CiAJCSAgcGFyYW1zLT5mcmVxdWVuY3kgPCA0NDUwMDAwMDAgPyAweDAyIDogMHgwNCk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtNzQ1LDE5ICs3OTAsMjAgQEAKIAogc3RhdGljIHN0cnVjdCB0ZGExMDAyMV9jb25maWcgcGhpbGlwc19jdTEyMTZfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwYywKLQkucGxsX3NldCA9IHBoaWxpcHNfY3UxMjE2X3BsbF9zZXQsCiB9OwogCiAKIAogCi1zdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHR1MTIxNl9pbml0W10gPSB7IDB4MGIsIDB4ZjUsIDB4ODUsIDB4YWIgfTsKIAlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLC5mbGFncyA9IDAsLmJ1ZiA9IHR1MTIxNl9pbml0LC5sZW4gPSBzaXplb2YodHUxMjE2X2luaXQpIH07CiAKIAkvLyBzZXR1cCBQTEwgY29uZmlndXJhdGlvbgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJbXNsZWVwKDEpOwpAQCAtNzY1LDcgKzgxMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtODM5LDYgKzg4NSw4IEBACiAJdHVuZXJfYnVmWzJdID0gMHhjYTsKIAl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTg2Miw5ICs5MTAsNiBAQAogCS54dGFsX2ZyZXEgPSBUREExMDA0Nl9YVEFMXzRNLAogCS5hZ2NfY29uZmlnID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnBsbF9pbml0ID0gcGhpbGlwc190dTEyMTZfcGxsX2luaXQsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3R1MTIxNl9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTkxMSwxMyArOTU2LDEzIEBACiAJMHhmZiwgMHhmZgogfTsKIAotc3RhdGljIGludCBwaGlsaXBzX3NkMTg3OF90ZGE4MjYxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAotCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc19zZDE4NzhfdGRhODI2MV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJdTggICAgICAgICAgICAgIGJ1Zls0XTsKIAlpbnQgICAgICAgICAgICAgcmM7CiAJc3RydWN0IGkyY19tc2cgIHR1bmVyX21zZyA9IHsuYWRkcj0weDYwLC5mbGFncz0wLC5idWY9YnVmLC5sZW49c2l6ZW9mKGJ1Zil9OworCXN0cnVjdCBidWRnZXQgKmJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0ICopIGZlLT5kdmItPnByaXY7CiAKIAlpZigocGFyYW1zLT5mcmVxdWVuY3kgPCA5NTAwMDApIHx8IChwYXJhbXMtPmZyZXF1ZW5jeSA+IDIxNTAwMDApKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTkyNiw3ICs5NzEsOSBAQAogCQkJcGFyYW1zLT5mcmVxdWVuY3ksIDApOwogCWlmKHJjIDwgMCkgcmV0dXJuIHJjOwogCi0JaWYoaTJjX3RyYW5zZmVyKGkyYywgJnR1bmVyX21zZywgMSkgIT0gMSkKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmKGkyY190cmFuc2ZlcigmYnVkZ2V0LT5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKICAgICByZXR1cm4gMDsKQEAgLTk2OSw3ICsxMDE2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzdHYwMjk5X2NvbmZpZyBwaGlsaXBzX3NkMTg3OF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5pbml0dGFiID0gcGhpbGlwc19zZDE4NzhfaW5pdHRhYiwKKyAgICAgLmluaXR0YWIgPSBwaGlsaXBzX3NkMTg3OF9pbml0dGFiLAogCS5tY2xrID0gODgwMDAwMDBVTCwKIAkuaW52ZXJ0ID0gMCwKIAkuc2tpcF9yZWluaXQgPSAwLApAQCAtOTc3LDcgKzEwMjQsNiBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMCwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBwaGlsaXBzX3NkMTg3OF9jaV9zZXRfc3ltYm9sX3JhdGUsCi0JLnBsbF9zZXQgPSBwaGlsaXBzX3NkMTg3OF90ZGE4MjYxX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IGJ1ZGdldF9hdiAqYnVkZ2V0X2F2KQpAQCAtMTAwMyw2ICsxMDQ5LDcgQEAKIAogI2RlZmluZSBTVUJJRF9EVkJTX1RWX1NUQVIJMHgwMDE0CiAjZGVmaW5lIFNVQklEX0RWQlNfVFZfU1RBUl9DSQkweDAwMTYKKyNkZWZpbmUgU1VCSURfRFZCU19FQVNZV0FUQ0hfMSAgMHgwMDFhCiAjZGVmaW5lIFNVQklEX0RWQlNfRUFTWVdBVENICTB4MDAxZQogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzEJCTB4MDAyMAogI2RlZmluZSBTVUJJRF9EVkJDX0tOQzFfUExVUwkweDAwMjEKQEAgLTEwMTIsMTcgKzEwNTksMzYgQEAKICNkZWZpbmUgU1VCSURfRFZCVF9LTkMxCQkweDAwMzAKICNkZWZpbmUgU1VCSURfRFZCVF9DSU5FUkdZMTIwMAkweDExNTcKIAorCitzdGF0aWMgaW50IHRkYTEwMDIxX3NldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCXN0cnVjdCBidWRnZXRfYXYqIGJ1ZGdldF9hdiA9IGZlLT5kdmItPnByaXY7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGJ1ZGdldF9hdi0+dGRhMTAwMjFfc2V0X2Zyb250ZW5kKGZlLCBwKTsKKwlpZiAoYnVkZ2V0X2F2LT50ZGExMDAyMV90c19lbmFibGVkKSB7CisJCXRkYTEwMDIxX3dyaXRlX2J5dGUoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLCAweDEyLCAweGExKTsKKwl9IGVsc2UgeworCQl0ZGExMDAyMV93cml0ZV9ieXRlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgMHgxMiwgMHhhMCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKwogc3RhdGljIHZvaWQgZnJvbnRlbmRfaW5pdChzdHJ1Y3QgYnVkZ2V0X2F2ICpidWRnZXRfYXYpCiB7CiAJc3RydWN0IHNhYTcxNDZfZGV2ICogc2FhID0gYnVkZ2V0X2F2LT5idWRnZXQuZGV2OwogCXN0cnVjdCBkdmJfZnJvbnRlbmQgKiBmZSA9IE5VTEw7CiAKKwkvKiBFbmFibGUgLyBQb3dlck9OIEZyb250ZW5kICovCisJc2FhNzE0Nl9zZXRncGlvKHNhYSwgMCwgU0FBNzE0Nl9HUElPX09VVExPKTsKKworCS8qIGFkZGl0aW9uYWwgc2V0dXAgbmVjZXNzYXJ5IGZvciB0aGUgUExVUyBjYXJkcyAqLwogCXN3aXRjaCAoc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKIAkJY2FzZSBTVUJJRF9EVkJTX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJDX0tOQzFfUExVUzoKIAkJY2FzZSBTVUJJRF9EVkJUX0tOQzFfUExVUzoKLQkJCS8vIEVuYWJsZSAvIFBvd2VyT04gRnJvbnRlbmQKLQkJCXNhYTcxNDZfc2V0Z3BpbyhzYWEsIDAsIFNBQTcxNDZfR1BJT19PVVRMTyk7CiAJCQlzYWE3MTQ2X3NldGdwaW8oc2FhLCAzLCBTQUE3MTQ2X0dQSU9fT1VUSEkpOwogCQkJYnJlYWs7CiAJfQpAQCAtMTAzMCwxMiArMTA5NiwxOSBAQAogCXN3aXRjaCAoc2FhLT5wY2ktPnN1YnN5c3RlbV9kZXZpY2UpIHsKIAogCWNhc2UgU1VCSURfRFZCU19LTkMxOgorCWNhc2UgU1VCSURfRFZCU19FQVNZV0FUQ0hfMToKIAkJaWYgKHNhYS0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yID09IDB4MTg5NCkgewogCQkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmY2luZXJneV8xMjAwc18xODk0XzAwMTBfY29uZmlnLAogCQkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CisJCQlpZiAoZmUpIHsKKwkJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19zdTEyNzhzaDJfdHVhNjEwMF90dW5lcl9zZXRfcGFyYW1zOworCQkJfQogCQl9IGVsc2UgewogCQkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmdHlwaG9vbl9jb25maWcsCiAJCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJCWlmIChmZSkgeworCQkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV90dW5lcl9zZXRfcGFyYW1zOworCQkJfQogCQl9CiAJCWJyZWFrOwogCkBAIC0xMDQ1LDQxICsxMTE4LDUzIEBACiAJY2FzZSBTVUJJRF9EVkJTX0VBU1lXQVRDSDoKIAkJZmUgPSBzdHYwMjk5X2F0dGFjaCgmcGhpbGlwc19zZDE4NzhfY29uZmlnLAogCQkJCSZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCk7CisJCWlmIChmZSkgeworCQkJZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfc2QxODc4X3RkYTgyNjFfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCU19LTkMxX1BMVVM6CiAJY2FzZSBTVUJJRF9EVkJTX1RZUEhPT046CiAJCWZlID0gc3R2MDI5OV9hdHRhY2goJnR5cGhvb25fY29uZmlnLAogCQkJCSAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOworCQlpZiAoZmUpIHsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90eV9jaV90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBTVUJJRF9EVkJTX0NJTkVSR1kxMjAwOgogCQlmZSA9IHN0djAyOTlfYXR0YWNoKCZjaW5lcmd5XzEyMDBzX2NvbmZpZywKIAkJCQkgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGZlKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19zdTEyNzhfdHlfY2lfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCQ19LTkMxOgogCWNhc2UgU1VCSURfRFZCQ19LTkMxX1BMVVM6CisJY2FzZSBTVUJJRF9EVkJDX0NJTkVSR1kxMjAwOgorCQlidWRnZXRfYXYtPnJlaW5pdGlhbGlzZV9kZW1vZCA9IDE7CiAJCWZlID0gdGRhMTAwMjFfYXR0YWNoKCZwaGlsaXBzX2N1MTIxNl9jb25maWcsCiAJCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXAsCiAJCQkJICAgICByZWFkX3B3bShidWRnZXRfYXYpKTsKKwkJaWYgKGZlKSB7CisJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3BvY2xrcCA9IDE7CisJCQlidWRnZXRfYXYtPnRkYTEwMDIxX3NldF9mcm9udGVuZCA9IGZlLT5vcHMuc2V0X2Zyb250ZW5kOworCQkJZmUtPm9wcy5zZXRfZnJvbnRlbmQgPSB0ZGExMDAyMV9zZXRfZnJvbnRlbmQ7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc19jdTEyMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU1VCSURfRFZCVF9LTkMxOgogCWNhc2UgU1VCSURfRFZCVF9LTkMxX1BMVVM6Ci0JCWZlID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3R1MTIxNl9jb25maWcsCi0JCQkJICAgICAmYnVkZ2V0X2F2LT5idWRnZXQuaTJjX2FkYXApOwotCQlicmVhazsKLQotCWNhc2UgU1VCSURfRFZCQ19DSU5FUkdZMTIwMDoKLQkJZmUgPSB0ZGExMDAyMV9hdHRhY2goJnBoaWxpcHNfY3UxMjE2X2NvbmZpZywKLQkJCQkgICAgICZidWRnZXRfYXYtPmJ1ZGdldC5pMmNfYWRhcCwKLQkJCQkgICAgIHJlYWRfcHdtKGJ1ZGdldF9hdikpOwotCQlicmVhazsKLQogCWNhc2UgU1VCSURfRFZCVF9DSU5FUkdZMTIwMDoKKwkJYnVkZ2V0X2F2LT5yZWluaXRpYWxpc2VfZGVtb2QgPSAxOwogCQlmZSA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190dTEyMTZfY29uZmlnLAogCQkJCSAgICAgJmJ1ZGdldF9hdi0+YnVkZ2V0LmkyY19hZGFwKTsKKwkJaWYgKGZlKSB7CisJCQlmZS0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190dTEyMTZfdHVuZXJfaW5pdDsKKwkJCWZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3R1MTIxNl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtMTA5OCw4ICsxMTgzLDggQEAKIAlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXRfYXYtPmJ1ZGdldC5kdmJfYWRhcHRlciwKIAkJCQkgIGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJidWRnZXQtYXY6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKLQkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQotCQkJYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0X2F2LT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKKwkJaWYgKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQlidWRnZXRfYXYtPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAJCWJ1ZGdldF9hdi0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9IE5VTEw7CiAJfQogfQpAQCAtMTI5Myw2ICsxMzc4LDcgQEAKIE1BS0VfQlVER0VUX0lORk8oa25jMXQsICJLTkMxIERWQi1UIiwgQlVER0VUX0tOQzFUKTsKIE1BS0VfQlVER0VUX0lORk8oa25jeHMsICJLTkMgVFYgU1RBUiBEVkItUyIsIEJVREdFVF9UVlNUQVIpOwogTUFLRV9CVURHRVRfSU5GTyhzYXRld3BscywgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX1RWU1RBUik7CitNQUtFX0JVREdFVF9JTkZPKHNhdGV3cGxzMSwgIlNhdGVsY28gRWFzeVdhdGNoIERWQi1TIGxpZ2h0IiwgQlVER0VUX0tOQzFTKTsKIE1BS0VfQlVER0VUX0lORk8oa25jMXNwLCAiS05DMSBEVkItUyBQbHVzIiwgQlVER0VUX0tOQzFTUCk7CiBNQUtFX0JVREdFVF9JTkZPKGtuYzFjcCwgIktOQzEgRFZCLUMgUGx1cyIsIEJVREdFVF9LTkMxQ1ApOwogTUFLRV9CVURHRVRfSU5GTyhrbmMxdHAsICJLTkMxIERWQi1UIFBsdXMiLCBCVURHRVRfS05DMVRQKTsKQEAgLTEzMDksNiArMTM5NSw3IEBACiAJTUFLRV9FWFRFTlNJT05fUENJKGtuY3hzLCAweDE4OTQsIDB4MDAxNCksCiAJTUFLRV9FWFRFTlNJT05fUENJKGtuY3hzLCAweDE4OTQsIDB4MDAxNiksCiAJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxzLCAweDE4OTQsIDB4MDAxZSksCisJTUFLRV9FWFRFTlNJT05fUENJKHNhdGV3cGxzMSwgMHgxODk0LCAweDAwMWEpLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxYywgMHgxODk0LCAweDAwMjApLAogCU1BS0VfRVhURU5TSU9OX1BDSShrbmMxY3AsIDB4MTg5NCwgMHgwMDIxKSwKIAlNQUtFX0VYVEVOU0lPTl9QQ0koa25jMXQsIDB4MTg5NCwgMHgwMDMwKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKaW5kZXggZTY0YTYwOS4uNGI5NjZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNpLmMKQEAgLTYyMCwxMCArNjIwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc19zdTEyNzhfdHRfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQkJCQkgICAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAotCQkJCSAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfc3UxMjc4X3R0X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogeworCXN0cnVjdCBidWRnZXRfY2kgKmJ1ZGdldF9jaSA9IChzdHJ1Y3QgYnVkZ2V0X2NpICopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKIAl1OCBidWZbNF07CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSBidWYsLmxlbiA9IHNpemVvZihidWYpIH07CkBAIC02NDksNyArNjQ5LDkgQEAKIAllbHNlIGlmIChwYXJhbXMtPmZyZXF1ZW5jeSA8IDIxNTAwMDApCiAJCWJ1ZlszXSB8PSAweEMwOwogCi0JaWYgKGkyY190cmFuc2ZlcihpMmMsICZtc2csIDEpICE9IDEpCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC02NjUsMTIgKzY2NywxMSBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMSwKIAkubWluX2RlbGF5X21zID0gNTAsCiAJLnNldF9zeW1ib2xfcmF0ZSA9IHBoaWxpcHNfc3UxMjc4X3R0X3NldF9zeW1ib2xfcmF0ZSwKLQkucGxsX3NldCA9IHBoaWxpcHNfc3UxMjc4X3R0X3BsbF9zZXQsCiB9OwogCiAKIAotc3RhdGljIGludCBwaGlsaXBzX3RkbTEzMTZsX3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RkbTEzMTZsX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpID0gKHN0cnVjdCBidWRnZXRfY2kgKikgZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggdGQxMzE2X2luaXRbXSA9IHsgMHgwYiwgMHhmNSwgMHg4NSwgMHhhYiB9OwpAQCAtNjc5LDYgKzY4MCw4IEBACiAJCQlzaXplb2YodGQxMzE2X2luaXQpIH07CiAKIAkvLyBzZXR1cCBQTEwgY29uZmlndXJhdGlvbgorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKQEAgLTY4NywxNCArNjkwLDE4IEBACiAJdHVuZXJfbXNnLmFkZHIgPSAweDY1OwogCXR1bmVyX21zZy5idWYgPSBkaXNhYmxlX21jNDRCQzM3NGM7CiAJdHVuZXJfbXNnLmxlbiA9IHNpemVvZihkaXNhYmxlX21jNDRCQzM3NGMpOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKKwkJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJCWkyY190cmFuc2ZlcigmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldF9jaSAqYnVkZ2V0X2NpID0gKHN0cnVjdCBidWRnZXRfY2kgKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCB0dW5lcl9idWZbNF07CkBAIC03NzAsNiArNzc3LDggQEAKIAl0dW5lcl9idWZbMl0gPSAweGNhOwogCXR1bmVyX2J1ZlszXSA9IChjcCA8PCA1KSB8IChmaWx0ZXIgPDwgMykgfCBiYW5kOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTc5MywxMyArODAyLDEwIEBACiAJLnh0YWxfZnJlcSA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucGxsX2luaXQgPSBwaGlsaXBzX3RkbTEzMTZsX3BsbF9pbml0LAotCS5wbGxfc2V0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfc2V0LAotCS5wbGxfc2xlZXAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190ZG0xMzE2bF9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAotc3RhdGljIGludCBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGR2YmNfcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0X2NpICpidWRnZXRfY2kgPSAoc3RydWN0IGJ1ZGdldF9jaSAqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHR1bmVyX2J1Zls1XTsKQEAgLTg1NywxMyArODYzLDE1IEBACiAJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CiAJdHVuZXJfYnVmWzRdID0gMHg4MDsKIAotCXN0djAyOTdfZW5hYmxlX3BsbGkyYyhmZSk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCwgJnR1bmVyX21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKIAltc2xlZXAoNTApOwogCi0Jc3R2MDI5N19lbmFibGVfcGxsaTJjKGZlKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtOTY5LDcgKzk3Nyw3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDFjLAogCS5pbml0dGFiID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX2luaXR0YWIsCiAJLmludmVydCA9IDAsCi0JLnBsbF9zZXQgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKKwkuc3RvcF9kdXJpbmdfcmVhZCA9IDEsCiB9OwogCiAKQEAgLTk4Miw2ICs5OTAsOCBAQAogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcDsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtOTkwLDYgKzEwMDAsNyBAQAogCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPQogCQkJc3R2MDI5OV9hdHRhY2goJnBoaWxpcHNfc3UxMjc4X3R0X2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3N1MTI3OF90dF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC05OTksNiArMTAxMCw3IEBACiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQlzdHYwMjk3X2F0dGFjaCgmZHZiY19waGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMTAwOCw2ICsxMDIwLDggQEAKIAkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kID0KIAkJCXRkYTEwMDQ1X2F0dGFjaCgmcGhpbGlwc190ZG0xMzE2bF9jb25maWcsICZidWRnZXRfY2ktPmJ1ZGdldC5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpIHsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9pbml0OworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkbTEzMTZsX3R1bmVyX3NldF9wYXJhbXM7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTEwMTcsNiArMTAzMSw4IEBACiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9CiAJCQl0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdGRtMTMxNmxfY29uZmlnLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfaW5pdDsKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0xMDI0LDExICsxMDQwLDE0IEBACiAJY2FzZSAweDEwMTc6CQkvLyBUVCBTLTE1MDAgUENJCiAJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCA9IHN0djAyOTlfYXR0YWNoKCZhbHBzX2JzYmUxX2NvbmZpZywgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwotCQkJaWYgKGxuYnAyMV9pbml0KGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCwgJmJ1ZGdldF9jaS0+YnVkZ2V0LmkyY19hZGFwLCBMTkJQMjFfTExDLCAwKSkgeworCQkJYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzYmUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPnR1bmVyX3ByaXYgPSAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXA7CisKKwkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJaWYgKGxuYnAyMV9hdHRhY2goYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLCAmYnVkZ2V0X2NpLT5idWRnZXQuaTJjX2FkYXAsIExOQlAyMV9MTEMsIDApKSB7CiAJCQkJcHJpbnRrKCIlczogTm8gTE5CUDIxIGZvdW5kIVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCi0JCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CisJCQkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kKTsKIAkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCQkJfQogCQl9CkBAIC0xMDQ2LDggKzEwNjUsOCBAQAogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kCiAJCSAgICAoJmJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9hZGFwdGVyLCBidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQpKSB7CiAJCQlwcmludGsoImJ1ZGdldC1jaTogRnJvbnRlbmQgcmVnaXN0cmF0aW9uIGZhaWxlZCFcbiIpOwotCQkJaWYgKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKQotCQkJCWJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CisJCQlpZiAoYnVkZ2V0X2NpLT5idWRnZXQuZHZiX2Zyb250ZW5kLT5vcHMucmVsZWFzZSkKKwkJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldF9jaS0+YnVkZ2V0LmR2Yl9mcm9udGVuZCk7CiAJCQlidWRnZXRfY2ktPmJ1ZGdldC5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC1jb3JlLmMKaW5kZXggZWEyMDY2ZC4uZTRjZjc3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtY29yZS5jCkBAIC00MDAsNyArNDAwLDkgQEAKIAkJYnVkZ2V0LT5kZXYtPm5hbWUsIGJ1ZGdldC0+YnVmZmVyX3dpZHRoLCBidWRnZXQtPmJ1ZmZlcl9oZWlnaHQpOwogCXByaW50aygiJXM6IGRtYSBidWZmZXIgc2l6ZSAldVxuIiwgYnVkZ2V0LT5kZXYtPm5hbWUsIGJ1ZGdldC0+YnVmZmVyX3NpemUpOwogCi0JZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+Y2FyZC0+bmFtZSwgb3duZXIpOworCWlmICgocmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmJ1ZGdldC0+ZHZiX2FkYXB0ZXIsIGJ1ZGdldC0+Y2FyZC0+bmFtZSwgb3duZXIsICZidWRnZXQtPmRldi0+cGNpLT5kZXYpKSA8IDApIHsKKwkJcmV0dXJuIHJldDsKKwl9CiAKIAkvKiBzZXQgZGQxIHN0cmVhbSBhICYgYiAqLwogCXNhYTcxNDZfd3JpdGUoZGV2LCBERDFfU1RSRUFNX0IsIDB4MDAwMDAwMDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LXBhdGNoLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYwppbmRleCAxYjNhYWFjLi5lZTYwY2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHBjaS9idWRnZXQtcGF0Y2guYwpAQCAtMjU4LDcgKzI1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxwc19ic3J2Ml9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0X3BhdGNoKiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldF9wYXRjaCopIGZlLT5kdmItPnByaXY7CiAJdTggcHdyID0gMDsKQEAgLTI4MSw3ICsyODEsMTAgQEAKIAkvLyBOT1RFOiBzaW5jZSB3ZSdyZSB1c2luZyBhIHByZXNjYWxlciBvZiAyLCB3ZSBzZXQgdGhlCiAJLy8gZGl2aXNvciBmcmVxdWVuY3kgdG8gNjIuNWtIeiBhbmQgZGl2aWRlIGJ5IDEyNSBhYm92ZQogCi0JaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCisJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQogCkBAIC0yODksMTAgKzI5Miw5IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAogCS54aW4gPSA5MDEwMDAwMFVMLAogCS5pbnZlcnRfcHdtID0gMCwKLQkucGxsX3NldCA9IGFscHNfYnNydjJfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80NTFfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCBidWRnZXRfcGF0Y2gqIGJ1ZGdldCA9IChzdHJ1Y3QgYnVkZ2V0X3BhdGNoKikgZmUtPmR2Yi0+cHJpdjsKIAl1MzIgZGl2OwpAQCAtMzA1LDEzICszMDcsMTUgQEAKIAlkYXRhWzJdID0gMHg4ZTsKIAlkYXRhWzNdID0gMHgwMDsKIAotCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKQorCQlyZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyBncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDY4LAotCS5wbGxfc2V0ID0gZ3J1bmRpZ18yOTUwNF80NTFfcGxsX3NldCwKIH07CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IGJ1ZGdldF9wYXRjaCogYnVkZ2V0KQpAQCAtMzIzLDI3ICszMjcsMzIgQEAKIAkJLy8gdHJ5IHRoZSBBTFBTIEJTUlYyIGZpcnN0IG9mIGFsbAogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHZlczF4OTNfYXR0YWNoKCZhbHBzX2JzcnYyX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfcGF0Y2hfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3RvbmUgPSBidWRnZXRfcGF0Y2hfc2V0X3RvbmU7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J2Ml90dW5lcl9zZXRfcGFyYW1zOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X3BhdGNoX2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9wYXRjaF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLy8gdHJ5IHRoZSBBTFBTIEJTUlU2IG5vdwogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHN0djAyOTlfYXR0YWNoKCZhbHBzX2JzcnU2X2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3RvbmUgPSBidWRnZXRfc2V0X3RvbmU7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc19ic3J1Nl90dW5lcl9zZXRfcGFyYW1zOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPnR1bmVyX3ByaXYgPSAmYnVkZ2V0LT5pMmNfYWRhcDsKKworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAKIAkJLy8gVHJ5IHRoZSBncnVuZGlnIDI5NTA0LTQ1MQogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHRkYTgwODNfYXR0YWNoKCZncnVuZGlnXzI5NTA0XzQ1MV9jb25maWcsICZidWRnZXQtPmkyY19hZGFwKTsKIAkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5kaXNlcWNfc2VuZF9idXJzdCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9idXJzdDsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0zNTgsOCArMzY3LDggQEAKIAl9IGVsc2UgewogCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKCZidWRnZXQtPmR2Yl9hZGFwdGVyLCBidWRnZXQtPmR2Yl9mcm9udGVuZCkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWF2OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+cmVsZWFzZSkKLQkJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5yZWxlYXNlKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKTsKKwkJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5yZWxlYXNlKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKTsKIAkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gTlVMTDsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0cGNpL2J1ZGdldC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKaW5kZXggYzIzYzAyZC4uMzU3NjFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHRwY2kvYnVkZ2V0LmMKQEAgLTE4Niw3ICsxODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFscHNfYnNydjJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfYnNydjJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXU4IHB3ciA9IDA7CkBAIC0yMDksNiArMjA5LDggQEAKIAkvLyBOT1RFOiBzaW5jZSB3ZSdyZSB1c2luZyBhIHByZXNjYWxlciBvZiAyLCB3ZSBzZXQgdGhlCiAJLy8gZGl2aXNvciBmcmVxdWVuY3kgdG8gNjIuNWtIeiBhbmQgZGl2aWRlIGJ5IDEyNSBhYm92ZQogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CkBAIC0yMTgsMTAgKzIyMCw5IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDA4LAogCS54aW4gPSA5MDEwMDAwMFVMLAogCS5pbnZlcnRfcHdtID0gMCwKLQkucGxsX3NldCA9IGFscHNfYnNydjJfcGxsX3NldCwKIH07CiAKLXN0YXRpYyBpbnQgYWxwc190ZGJlMl9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgYWxwc190ZGJlMl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTIzNSw2ICsyMzYsOCBAQAogCWRhdGFbMl0gPSAweDg1IHwgKChkaXYgPj4gMTApICYgMHg2MCk7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NDAwMDAwMCA/IDB4ODggOiBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCA/IDB4ODQgOiAweDgxKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCXJldHVybiAwOwogfQpAQCAtMjQ0LDEwICsyNDcsOSBAQAogCS54aW4gPSA1Nzg0MDAwMFVMLAogCS5pbnZlcnQgPSAxLAogCS5zZWxhZ2MgPSBWRVMxODIwX1NFTEFHQ19TSUdOQU1QRVJSLAotCS5wbGxfc2V0ID0gYWxwc190ZGJlMl9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80MDFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0yNzQsMTYgKzI3NiwxNyBAQAogCWRhdGFbMl0gPSAoKGRpdiA+PiAxMCkgJiAweDYwKSB8IGNmZzsKIAlkYXRhWzNdID0gKGNwdW1wIDw8IDYpIHwgYmFuZF9zZWxlY3Q7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIgKCZidWRnZXQtPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBsNjQ3ODFfY29uZmlnIGdydW5kaWdfMjk1MDRfNDAxX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NTUsCi0JLnBsbF9zZXQgPSBncnVuZGlnXzI5NTA0XzQwMV9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBncnVuZGlnXzI5NTA0XzQ1MV9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgZ3J1bmRpZ18yOTUwNF80NTFfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IGJ1ZGdldCogYnVkZ2V0ID0gKHN0cnVjdCBidWRnZXQqKSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0yOTYsMTYgKzI5OSwxNyBAQAogCWRhdGFbMl0gPSAweDhlOwogCWRhdGFbM10gPSAweDAwOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyICgmYnVkZ2V0LT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkgcmV0dXJuIC1FSU87CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGRhODA4M19jb25maWcgZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2OCwKLQkucGxsX3NldCA9IGdydW5kaWdfMjk1MDRfNDUxX3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IHM1aDE0MjBfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsIHUzMiogZnJlcW91dCkKK3N0YXRpYyBpbnQgczVoMTQyMF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQgPSAoc3RydWN0IGJ1ZGdldCopIGZlLT5kdmItPnByaXY7CiAJdTMyIGRpdjsKQEAgLTMyNiwxNiArMzMwLDE2IEBACiAJZWxzZQogCQlkYXRhWzNdID0gMHhjMDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJmJ1ZGdldC0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCi0JKmZyZXFvdXQgPSBkaXYgKiAxMDAwOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHM1aDE0MjBfY29uZmlnIHM1aDE0MjBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg1MywKIAkuaW52ZXJ0ID0gMSwKLQkucGxsX3NldCA9IHM1aDE0MjBfcGxsX3NldCwKIH07CiAKIHN0YXRpYyB1OCByZWFkX3B3bShzdHJ1Y3QgYnVkZ2V0KiBidWRnZXQpCkBAIC0zNTksMTggKzM2MywyMSBAQAogCQkvLyB0cnkgdGhlIEFMUFMgQlNSVjIgZmlyc3Qgb2YgYWxsCiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gdmVzMXg5M19hdHRhY2goJmFscHNfYnNydjJfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnYyX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX21hc3Rlcl9jbWQgPSBidWRnZXRfZGlzZXFjX3NlbmRfbWFzdGVyX2NtZDsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMuZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF90b25lID0gYnVkZ2V0X3NldF90b25lOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvLyB0cnkgdGhlIEFMUFMgQlNSVTYgbm93CiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfbWFzdGVyX2NtZCA9IGJ1ZGdldF9kaXNlcWNfc2VuZF9tYXN0ZXJfY21kOwotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+ZGlzZXFjX3NlbmRfYnVyc3QgPSBidWRnZXRfZGlzZXFjX3NlbmRfYnVyc3Q7Ci0JCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLT5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhbHBzX2JzcnU2X3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+dHVuZXJfcHJpdiA9ICZidWRnZXQtPmkyY19hZGFwOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5kaXNlcWNfc2VuZF9tYXN0ZXJfY21kID0gYnVkZ2V0X2Rpc2VxY19zZW5kX21hc3Rlcl9jbWQ7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2VxY19zZW5kX2J1cnN0ID0gYnVkZ2V0X2Rpc2VxY19zZW5kX2J1cnN0OworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy5zZXRfdG9uZSA9IGJ1ZGdldF9zZXRfdG9uZTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtMzc4LDM1ICszODUsNDUgQEAKIAljYXNlIDB4MTAwNDogLy8gSGF1cHBhdWdlL1RUIERWQi1DIGJ1ZGdldCAodmVzMTgyMC9BTFBTIFREQkUyKHNwNTY1OSkpCiAKIAkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZidWRnZXQtPmkyY19hZGFwLCByZWFkX3B3bShidWRnZXQpKTsKLQkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSBicmVhazsKKwkJaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gYWxwc190ZGJlMl90dW5lcl9zZXRfcGFyYW1zOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIDB4MTAwNTogLy8gSGF1cHBhdWdlL1RUIE5vdmEtVCBidWRnZXQgKEw2NDc4MS9HcnVuZGlnIDI5NTA0LTQwMSh0c2E1MDYwKSkKIAogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IGw2NDc4MV9hdHRhY2goJmdydW5kaWdfMjk1MDRfNDAxX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwotCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIGJyZWFrOworCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBncnVuZGlnXzI5NTA0XzQwMV90dW5lcl9zZXRfcGFyYW1zOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIDB4NGY2MDogLy8gRnVqaXRzdSBTaWVtZW5zIEFjdGl2eSBCdWRnZXQtUyBQQ0kgcmV2IEFMIChzdHYwMjk5L0FMUFMgQlNSVTYodHNhNTA1OSkpCiAJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kID0gc3R2MDI5OV9hdHRhY2goJmFscHNfYnNydTZfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBzaWVtZW5zX2J1ZGdldF9zZXRfdm9sdGFnZTsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfYnNydTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT50dW5lcl9wcml2ID0gJmJ1ZGdldC0+aTJjX2FkYXA7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gc2llbWVuc19idWRnZXRfc2V0X3ZvbHRhZ2U7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAweDRmNjE6IC8vIEZ1aml0c3UgU2llbWVucyBBY3RpdnkgQnVkZ2V0LVMgUENJIHJldiBHUiAodGRhODA4My9HcnVuZGlnIDI5NTA0LTQ1MSh0c2E1NTIyKSkKIAkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSB0ZGE4MDgzX2F0dGFjaCgmZ3J1bmRpZ18yOTUwNF80NTFfY29uZmlnLCAmYnVkZ2V0LT5pMmNfYWRhcCk7CiAJCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZCkgewotCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBzaWVtZW5zX2J1ZGdldF9zZXRfdm9sdGFnZTsKLQkJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOworCQkJYnVkZ2V0LT5kdmJfZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGdydW5kaWdfMjk1MDRfNDUxX3R1bmVyX3NldF9wYXJhbXM7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnNldF92b2x0YWdlID0gc2llbWVuc19idWRnZXRfc2V0X3ZvbHRhZ2U7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLmRpc2huZXR3b3JrX3NlbmRfbGVnYWN5X2NvbW1hbmQgPSBOVUxMOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMTY6IC8vIEhhdXBwYXVnZS9UVCBOb3ZhLVMgU0UgKHNhbXN1bmcgczVoMTQyMC8/Pz8/KHRkYTgyNjApKQogCQlidWRnZXQtPmR2Yl9mcm9udGVuZCA9IHM1aDE0MjBfYXR0YWNoKCZzNWgxNDIwX2NvbmZpZywgJmJ1ZGdldC0+aTJjX2FkYXApOwogCQlpZiAoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpIHsKLQkJCWlmIChsbmJwMjFfaW5pdChidWRnZXQtPmR2Yl9mcm9udGVuZCwgJmJ1ZGdldC0+aTJjX2FkYXAsIDAsIDApKSB7CisJCQlidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gczVoMTQyMF90dW5lcl9zZXRfcGFyYW1zOworCQkJaWYgKGxuYnAyMV9hdHRhY2goYnVkZ2V0LT5kdmJfZnJvbnRlbmQsICZidWRnZXQtPmkyY19hZGFwLCAwLCAwKSkgewogCQkJCXByaW50aygiJXM6IE5vIExOQlAyMSBmb3VuZCFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQkJZ290byBlcnJvcl9vdXQ7CiAJCQl9CkBAIC00MjgsOCArNDQ1LDggQEAKIAogZXJyb3Jfb3V0OgogCXByaW50aygiYnVkZ2V0OiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JaWYgKGJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UpCi0JCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMtPnJlbGVhc2UoYnVkZ2V0LT5kdmJfZnJvbnRlbmQpOworCWlmIChidWRnZXQtPmR2Yl9mcm9udGVuZC0+b3BzLnJlbGVhc2UpCisJCWJ1ZGdldC0+ZHZiX2Zyb250ZW5kLT5vcHMucmVsZWFzZShidWRnZXQtPmR2Yl9mcm9udGVuZCk7CiAJYnVkZ2V0LT5kdmJfZnJvbnRlbmQgPSBOVUxMOwogCXJldHVybjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKaW5kZXggOTE0NTg3ZC4uOTJjN2NkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L0tjb25maWcKQEAgLTYsNiArNiw4IEBACiAJc2VsZWN0IERWQl9WRVMxODIwCiAJc2VsZWN0IERWQl9UREE4MDgzCiAJc2VsZWN0IERWQl9TVFYwMjk5CisJc2VsZWN0IERWQl9TVFYwMjk3CisJc2VsZWN0IERWQl9MTkJQMjEKIAloZWxwCiAJICBTdXBwb3J0IGZvciBleHRlcm5hbCBVU0IgYWRhcHRlcnMgZGVzaWduZWQgYnkgVGVjaG5vdHJlbmQgYW5kCiAJICBwcm9kdWNlZCBieSBIYXVwcGF1Z2UsIHNoaXBwZWQgdW5kZXIgdGhlIGJyYW5kIG5hbWUgJ05vdmEtVVNCJy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1idWRnZXQvZHZiLXR0dXNiLWJ1ZGdldC5jCmluZGV4IDZjZWFlMzguLjE0NTU5ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWJ1ZGdldC9kdmItdHR1c2ItYnVkZ2V0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItYnVkZ2V0L2R2Yi10dHVzYi1idWRnZXQuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgInRkYTEwMDR4LmgiCiAjaW5jbHVkZSAic3R2MDI5OS5oIgogI2luY2x1ZGUgInRkYTgwODMuaCIKKyNpbmNsdWRlICJzdHYwMjk3LmgiCisjaW5jbHVkZSAibG5icDIxLmgiCiAKICNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9kdmIvZG14Lmg+CkBAIC00ODYsMzEgKzQ4OCw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBsbmJwMjFfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKLXsKLQlzdHJ1Y3QgIHR0dXNiKiB0dHVzYiA9IChzdHJ1Y3QgdHR1c2IqKSAgZmUtPmR2Yi0+cHJpdjsKLQlpbnQgcmV0OwotCXU4IGRhdGFbMV07Ci0Jc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IDB4MDgsIC5mbGFncyA9IDAsIC5idWYgPSBkYXRhLCAubGVuID0gc2l6ZW9mKGRhdGEpIH07Ci0KLQlzd2l0Y2godm9sdGFnZSkgewotCWNhc2UgU0VDX1ZPTFRBR0VfT0ZGOgotCQlkYXRhWzBdID0gMHgwMDsKLQkJYnJlYWs7Ci0JY2FzZSBTRUNfVk9MVEFHRV8xMzoKLQkJZGF0YVswXSA9IDB4NDQ7Ci0JCWJyZWFrOwotCWNhc2UgU0VDX1ZPTFRBR0VfMTg6Ci0JCWRhdGFbMF0gPSAweDRjOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0ID0gaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZtc2csIDEpOwotCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHR1c2JfdXBkYXRlX2xuYihzdHJ1Y3QgdHR1c2IgKnR0dXNiKQogewogCXU4IGJbXSA9IHsgMHhhYSwgKyt0dHVzYi0+YywgMHgxNiwgNSwgLypwb3dlcjogKi8gMSwKQEAgLTEwNDgsNyArMTAyNSw3IEBACiAKIAogCi1zdGF0aWMgaW50IGFscHNfdGRtYjdfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGFscHNfdGRtYjdfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCiB7CiAJc3RydWN0IHR0dXNiKiB0dHVzYiA9IChzdHJ1Y3QgdHR1c2IqKSBmZS0+ZHZiLT5wcml2OwogCXU4IGRhdGFbNF07CkBAIC0xMDYyLDIwICsxMDM5LDIxIEBACiAJZGF0YVsyXSA9ICgoZGl2ID4+IDEwKSAmIDB4NjApIHwgMHg4NTsKIAlkYXRhWzNdID0gcGFyYW1zLT5mcmVxdWVuY3kgPCA1OTIwMDAwMDAgPyAweDQwIDogMHg4MDsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlcigmdHR1c2ItPmkyY19hZGFwLCAmbXNnLCAxKSAhPSAxKSByZXR1cm4gLUVJTzsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjeDIyNzAwX2NvbmZpZyBhbHBzX3RkbWI3X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCi0JLnBsbF9zZXQgPSBhbHBzX3RkbWI3X3BsbF9zZXQsCiB9OwogCiAKIAogCiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSAoc3RydWN0IHR0dXNiKikgZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggdGQxMzE2X2luaXRbXSA9IHsgMHgwYiwgMHhmNSwgMHg4NSwgMHhhYiB9OwpAQCAtMTA4Myw2ICsxMDYxLDggQEAKIAlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7IC5hZGRyPTB4NjAsIC5mbGFncz0wLCAuYnVmPXRkMTMxNl9pbml0LCAubGVuPXNpemVvZih0ZDEzMTZfaW5pdCkgfTsKIAogCS8vIHNldHVwIFBMTCBjb25maWd1cmF0aW9uCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKIApAQCAtMTA5MCw2ICsxMDcwLDggQEAKIAl0dW5lcl9tc2cuYWRkciA9IDB4NjU7CiAJdHVuZXJfbXNnLmJ1ZiA9IGRpc2FibGVfbWM0NEJDMzc0YzsKIAl0dW5lcl9tc2cubGVuID0gc2l6ZW9mKGRpc2FibGVfbWM0NEJDMzc0Yyk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKIAkJaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCX0KQEAgLTEwOTcsNyArMTA3OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgdHR1c2IqIHR0dXNiID0gKHN0cnVjdCB0dHVzYiopIGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtMTE1Nyw2ICsxMTM5LDggQEAKIAl0dW5lcl9idWZbMl0gPSAweGNhOwogCXR1bmVyX2J1ZlszXSA9IChjcCA8PCA1KSB8IChmaWx0ZXIgPDwgMykgfCBiYW5kOwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCkBAIC0xMTc2LDggKzExNjAsNiBAQAogCS5kZW1vZF9hZGRyZXNzID0gMHg4LAogCS5pbnZlcnQgPSAxLAogCS5pbnZlcnRfb2NsayA9IDAsCi0JLnBsbF9pbml0ID0gcGhpbGlwc190ZG0xMzE2bF9wbGxfaW5pdCwKLQkucGxsX3NldCA9IHBoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCwKIAkucmVxdWVzdF9maXJtd2FyZSA9IHBoaWxpcHNfdGRtMTMxNmxfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKQEAgLTEyOTksNyArMTI4MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190c2E1MDU5X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190c2E1MDU5X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSAoc3RydWN0IHR0dXNiKikgZmUtPmR2Yi0+cHJpdjsKIAl1OCBidWZbNF07CkBAIC0xMzIyLDcgKzEzMDQsOSBAQAogCWlmICh0dHVzYi0+cmV2aXNpb24gPT0gVFRVU0JfUkVWXzJfMikKIAkJYnVmWzNdIHw9IDB4MjA7CiAKLQlpZiAoaTJjX3RyYW5zZmVyKGkyYywgJm1zZywgMSkgIT0gMSkKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKIAlyZXR1cm4gMDsKQEAgLTEzMzgsMTAgKzEzMjIsOSBAQAogCS52b2x0MTNfb3AwX29wMSA9IFNUVjAyOTlfVk9MVDEzX09QMSwKIAkubWluX2RlbGF5X21zID0gMTAwLAogCS5zZXRfc3ltYm9sX3JhdGUgPSBhbHBzX3N0djAyOTlfc2V0X3N5bWJvbF9yYXRlLAotCS5wbGxfc2V0ID0gcGhpbGlwc190c2E1MDU5X3BsbF9zZXQsCiB9OwogCi1zdGF0aWMgaW50IHR0dXNiX25vdmFzX2dydW5kaWdfMjk1MDRfNDkxX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQorc3RhdGljIGludCB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgdHR1c2IqIHR0dXNiID0gKHN0cnVjdCB0dHVzYiopIGZlLT5kdmItPnByaXY7CiAJdTggYnVmWzRdOwpAQCAtMTM1NSw2ICsxMzM4LDggQEAKIAlidWZbMl0gPSAweDhlOwogCWJ1ZlszXSA9IDB4MDA7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEzNjQsMTAgKzEzNDksOSBAQAogc3RhdGljIHN0cnVjdCB0ZGE4MDgzX2NvbmZpZyB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV9jb25maWcgPSB7CiAKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NjgsCi0JLnBsbF9zZXQgPSB0dHVzYl9ub3Zhc19ncnVuZGlnXzI5NTA0XzQ5MV9wbGxfc2V0LAogfTsKIAotc3RhdGljIGludCBhbHBzX3RkYmUyX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQorc3RhdGljIGludCBhbHBzX3RkYmUyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXN0cnVjdCB0dHVzYiogdHR1c2IgPSBmZS0+ZHZiLT5wcml2OwogCXUzMiBkaXY7CkBAIC0xMzgxLDYgKzEzNjUsOCBAQAogCWRhdGFbMl0gPSAweDg1IHwgKChkaXYgPj4gMTApICYgMHg2MCk7CiAJZGF0YVszXSA9IChwYXJhbXMtPmZyZXF1ZW5jeSA8IDE3NDAwMDAwMCA/IDB4ODggOiBwYXJhbXMtPmZyZXF1ZW5jeSA8IDQ3MDAwMDAwMCA/IDB4ODQgOiAweDgxKTsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKGkyY190cmFuc2ZlciAoJnR0dXNiLT5pMmNfYWRhcCwgJm1zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAKQEAgLTEzOTMsNyArMTM3OSw2IEBACiAJLnhpbiA9IDU3ODQwMDAwVUwsCiAJLmludmVydCA9IDEsCiAJLnNlbGFnYyA9IFZFUzE4MjBfU0VMQUdDX1NJR05BTVBFUlIsCi0JLnBsbF9zZXQgPSBhbHBzX3RkYmUyX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgdTggcmVhZF9wd20oc3RydWN0IHR0dXNiKiB0dHVzYikKQEAgLTE0MTAsNiArMTM5NSwxNzQgQEAKIH0KIAogCitzdGF0aWMgaW50IGR2YmNfcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdHR1c2IgKnR0dXNiID0gKHN0cnVjdCB0dHVzYiAqKSBmZS0+ZHZiLT5wcml2OworCXU4IHR1bmVyX2J1Zls1XTsKKwlzdHJ1Y3QgaTJjX21zZyB0dW5lcl9tc2cgPSB7LmFkZHIgPSAweDYwLAorCQkJCSAgICAuZmxhZ3MgPSAwLAorCQkJCSAgICAuYnVmID0gdHVuZXJfYnVmLAorCQkJCSAgICAubGVuID0gc2l6ZW9mKHR1bmVyX2J1ZikgfTsKKwlpbnQgdHVuZXJfZnJlcXVlbmN5ID0gMDsKKwl1OCBiYW5kLCBjcCwgZmlsdGVyOworCisJLy8gZGV0ZXJtaW5lIGNoYXJnZSBwdW1wCisJdHVuZXJfZnJlcXVlbmN5ID0gcGFyYW1zLT5mcmVxdWVuY3k7CisJaWYgICAgICAodHVuZXJfZnJlcXVlbmN5IDwgIDg3MDAwMDAwKSB7cmV0dXJuIC1FSU5WQUw7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDEzMDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDE2MDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDIwMDAwMDAwMCkge2NwID0gNjsgYmFuZCA9IDE7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDI5MDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQyMDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDQ4MDAwMDAwMCkge2NwID0gNjsgYmFuZCA9IDI7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDYyMDAwMDAwMCkge2NwID0gMzsgYmFuZCA9IDQ7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDgzMDAwMDAwMCkge2NwID0gNTsgYmFuZCA9IDQ7fQorCWVsc2UgaWYgKHR1bmVyX2ZyZXF1ZW5jeSA8IDg5NTAwMDAwMCkge2NwID0gNzsgYmFuZCA9IDQ7fQorCWVsc2Uge3JldHVybiAtRUlOVkFMO30KKworCS8vIGFzc3VtZSBQTEwgZmlsdGVyIHNob3VsZCBhbHdheXMgYmUgOE1IeiBmb3IgdGhlIG1vbWVudC4KKwlmaWx0ZXIgPSAxOworCisJLy8gY2FsY3VsYXRlIGRpdmlzb3IKKwkvLyAoRmlucHV0ICsgRmlmKS9GcmVmOyBGaWYgPSAzNjEyNTAwMCBIeiwgRnJlZiA9IDYyNTAwIEh6CisJdHVuZXJfZnJlcXVlbmN5ID0gKChwYXJhbXMtPmZyZXF1ZW5jeSArIDM2MTI1MDAwKSAvIDYyNTAwKTsKKworCS8vIHNldHVwIHR1bmVyIGJ1ZmZlcgorCXR1bmVyX2J1ZlswXSA9IHR1bmVyX2ZyZXF1ZW5jeSA+PiA4OworCXR1bmVyX2J1ZlsxXSA9IHR1bmVyX2ZyZXF1ZW5jeSAmIDB4ZmY7CisJdHVuZXJfYnVmWzJdID0gMHhjODsKKwl0dW5lcl9idWZbM10gPSAoY3AgPDwgNSkgfCAoZmlsdGVyIDw8IDMpIHwgYmFuZDsKKwl0dW5lcl9idWZbNF0gPSAweDgwOworCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlpZiAoaTJjX3RyYW5zZmVyKCZ0dHVzYi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpIHsKKwkJcHJpbnRrKCJkdmItdHR1c2ItYnVkZ2V0OiBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfcGxsX3NldCBFcnJvciAxXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXNsZWVwKDUwKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CisJaWYgKGkyY190cmFuc2ZlcigmdHR1c2ItPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKSB7CisJCXByaW50aygiZHZiLXR0dXNiLWJ1ZGdldDogZHZiY19waGlsaXBzX3RkbTEzMTZsX3BsbF9zZXQgRXJyb3IgMlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW1zbGVlcCgxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggZHZiY19waGlsaXBzX3RkbTEzMTZsX2luaXR0YWJbXSA9IHsKKwkweDgwLCAweDIxLAorCTB4ODAsIDB4MjAsCisJMHg4MSwgMHgwMSwKKwkweDgxLCAweDAwLAorCTB4MDAsIDB4MDksCisJMHgwMSwgMHg2OSwKKwkweDAzLCAweDAwLAorCTB4MDQsIDB4MDAsCisJMHgwNywgMHgwMCwKKwkweDA4LCAweDAwLAorCTB4MjAsIDB4MDAsCisJMHgyMSwgMHg0MCwKKwkweDIyLCAweDAwLAorCTB4MjMsIDB4MDAsCisJMHgyNCwgMHg0MCwKKwkweDI1LCAweDg4LAorCTB4MzAsIDB4ZmYsCisJMHgzMSwgMHgwMCwKKwkweDMyLCAweGZmLAorCTB4MzMsIDB4MDAsCisJMHgzNCwgMHg1MCwKKwkweDM1LCAweDdmLAorCTB4MzYsIDB4MDAsCisJMHgzNywgMHgyMCwKKwkweDM4LCAweDAwLAorCTB4NDAsIDB4MWMsCisJMHg0MSwgMHhmZiwKKwkweDQyLCAweDI5LAorCTB4NDMsIDB4MjAsCisJMHg0NCwgMHhmZiwKKwkweDQ1LCAweDAwLAorCTB4NDYsIDB4MDAsCisJMHg0OSwgMHgwNCwKKwkweDRhLCAweGZmLAorCTB4NGIsIDB4N2YsCisJMHg1MiwgMHgzMCwKKwkweDU1LCAweGFlLAorCTB4NTYsIDB4NDcsCisJMHg1NywgMHhlMSwKKwkweDU4LCAweDNhLAorCTB4NWEsIDB4MWUsCisJMHg1YiwgMHgzNCwKKwkweDYwLCAweDAwLAorCTB4NjMsIDB4MDAsCisJMHg2NCwgMHgwMCwKKwkweDY1LCAweDAwLAorCTB4NjYsIDB4MDAsCisJMHg2NywgMHgwMCwKKwkweDY4LCAweDAwLAorCTB4NjksIDB4MDAsCisJMHg2YSwgMHgwMiwKKwkweDZiLCAweDAwLAorCTB4NzAsIDB4ZmYsCisJMHg3MSwgMHgwMCwKKwkweDcyLCAweDAwLAorCTB4NzMsIDB4MDAsCisJMHg3NCwgMHgwYywKKwkweDgwLCAweDAwLAorCTB4ODEsIDB4MDAsCisJMHg4MiwgMHgwMCwKKwkweDgzLCAweDAwLAorCTB4ODQsIDB4MDQsCisJMHg4NSwgMHg4MCwKKwkweDg2LCAweDI0LAorCTB4ODcsIDB4NzgsCisJMHg4OCwgMHgwMCwKKwkweDg5LCAweDAwLAorCTB4OTAsIDB4MDEsCisJMHg5MSwgMHgwMSwKKwkweGEwLCAweDAwLAorCTB4YTEsIDB4MDAsCisJMHhhMiwgMHgwMCwKKwkweGIwLCAweDkxLAorCTB4YjEsIDB4MGIsCisJMHhjMCwgMHg0YiwKKwkweGMxLCAweDAwLAorCTB4YzIsIDB4MDAsCisJMHhkMCwgMHgwMCwKKwkweGQxLCAweDAwLAorCTB4ZDIsIDB4MDAsCisJMHhkMywgMHgwMCwKKwkweGQ0LCAweDAwLAorCTB4ZDUsIDB4MDAsCisJMHhkZSwgMHgwMCwKKwkweGRmLCAweDAwLAorCTB4NjEsIDB4MzgsCisJMHg2MiwgMHgwYSwKKwkweDUzLCAweDEzLAorCTB4NTksIDB4MDgsCisJMHg1NSwgMHgwMCwKKwkweDU2LCAweDQwLAorCTB4NTcsIDB4MDgsCisJMHg1OCwgMHgzZCwKKwkweDg4LCAweDEwLAorCTB4YTAsIDB4MDAsCisJMHhhMCwgMHgwMCwKKwkweGEwLCAweDAwLAorCTB4YTAsIDB4MDQsCisJMHhmZiwgMHhmZiwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDI5N19jb25maWcgZHZiY19waGlsaXBzX3RkbTEzMTZsX2NvbmZpZyA9IHsKKwkuZGVtb2RfYWRkcmVzcyA9IDB4MWMsCisJLmluaXR0YWIgPSBkdmJjX3BoaWxpcHNfdGRtMTMxNmxfaW5pdHRhYiwKKwkuaW52ZXJ0ID0gMCwKK307CisKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2luaXQoc3RydWN0IHR0dXNiKiB0dHVzYikKIHsKIAlzd2l0Y2gobGUxNl90b19jcHUodHR1c2ItPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSB7CkBAIC0xNDE3LDExICsxNTcwLDEzIEBACiAJCS8vIHRyeSB0aGUgc3R2MDI5OSBiYXNlZCBmaXJzdAogCQl0dHVzYi0+ZmUgPSBzdHYwMjk5X2F0dGFjaCgmYWxwc19zdHYwMjk5X2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7CiAJCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkgeworCQkJdHR1c2ItPmZlLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RzYTUwNTlfdHVuZXJfc2V0X3BhcmFtczsKKwogCQkJaWYodHR1c2ItPnJldmlzaW9uID09IFRUVVNCX1JFVl8yXzIpIHsgLy8gQUxQUyBCU0JFMQogCQkJCWFscHNfc3R2MDI5OV9jb25maWcuaW5pdHRhYiA9IGFscHNfYnNiZTFfaW5pdHRhYjsKLQkJCQl0dHVzYi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSBsbmJwMjFfc2V0X3ZvbHRhZ2U7CisJCQkJbG5icDIxX2F0dGFjaCh0dHVzYi0+ZmUsICZ0dHVzYi0+aTJjX2FkYXAsIDAsIDApOwogCQkJfSBlbHNlIHsgLy8gQUxQUyBCU1JVNgotCQkJCXR0dXNiLT5mZS0+b3BzLT5zZXRfdm9sdGFnZSA9IHR0dXNiX3NldF92b2x0YWdlOworCQkJCXR0dXNiLT5mZS0+b3BzLnNldF92b2x0YWdlID0gdHR1c2Jfc2V0X3ZvbHRhZ2U7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMTQyOSwyOCArMTU4NCw0MSBAQAogCQkvLyBHcnVuZGlnIDI5NTA0LTQ5MQogCQl0dHVzYi0+ZmUgPSB0ZGE4MDgzX2F0dGFjaCgmdHR1c2Jfbm92YXNfZ3J1bmRpZ18yOTUwNF80OTFfY29uZmlnLCAmdHR1c2ItPmkyY19hZGFwKTsKIAkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7Ci0JCQl0dHVzYi0+ZmUtPm9wcy0+c2V0X3ZvbHRhZ2UgPSB0dHVzYl9zZXRfdm9sdGFnZTsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gdHR1c2Jfbm92YXNfZ3J1bmRpZ18yOTUwNF80OTFfdHVuZXJfc2V0X3BhcmFtczsKKwkJCXR0dXNiLT5mZS0+b3BzLnNldF92b2x0YWdlID0gdHR1c2Jfc2V0X3ZvbHRhZ2U7CiAJCQlicmVhazsKIAkJfQotCiAJCWJyZWFrOwogCiAJY2FzZSAweDEwMDQ6IC8vIEhhdXBwYXVnZS9UVCBEVkItQyBidWRnZXQgKHZlczE4MjAvQUxQUyBUREJFMihzcDU2NTkpKQogCQl0dHVzYi0+ZmUgPSB2ZXMxODIwX2F0dGFjaCgmYWxwc190ZGJlMl9jb25maWcsICZ0dHVzYi0+aTJjX2FkYXAsIHJlYWRfcHdtKHR0dXNiKSk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRiZTJfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOworCQl9CisKKwkJdHR1c2ItPmZlID0gc3R2MDI5N19hdHRhY2goJmR2YmNfcGhpbGlwc190ZG0xMzE2bF9jb25maWcsICZ0dHVzYi0+aTJjX2FkYXApOworCQlpZiAodHR1c2ItPmZlICE9IE5VTEwpIHsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZiY19waGlsaXBzX3RkbTEzMTZsX3R1bmVyX3NldF9wYXJhbXM7CisJCQlicmVhazsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgMHgxMDA1OiAvLyBIYXVwcGF1Z2UvVFQgTm92YS1VU0ItdCBidWRnZXQgKHRkYTEwMDQ2L1BoaWxpcHMgdGQxMzE2KHRkYTY2NTF0dCkgT1IgY3gyMjcwMC9BTFBTIFRETUI3KD8/KSkKIAkJLy8gdHJ5IHRoZSBBTFBTIFRETUI3IGZpcnN0CiAJCXR0dXNiLT5mZSA9IGN4MjI3MDBfYXR0YWNoKCZhbHBzX3RkbWI3X2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGFscHNfdGRtYjdfdHVuZXJfc2V0X3BhcmFtczsKIAkJCWJyZWFrOworCQl9CiAKIAkJLy8gUGhpbGlwcyB0ZDEzMTYKIAkJdHR1c2ItPmZlID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX3RkbTEzMTZsX2NvbmZpZywgJnR0dXNiLT5pMmNfYWRhcCk7Ci0JCWlmICh0dHVzYi0+ZmUgIT0gTlVMTCkKKwkJaWYgKHR0dXNiLT5mZSAhPSBOVUxMKSB7CisJCQl0dHVzYi0+ZmUtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdGRtMTMxNmxfdHVuZXJfaW5pdDsKKwkJCXR0dXNiLT5mZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190ZG0xMzE2bF90dW5lcl9zZXRfcGFyYW1zOwogCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJfQogCkBAIC0xNDYxLDggKzE2MjksOCBAQAogCX0gZWxzZSB7CiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJnR0dXNiLT5hZGFwdGVyLCB0dHVzYi0+ZmUpKSB7CiAJCQlwcmludGsoImR2Yi10dHVzYi1idWRnZXQ6IEZyb250ZW5kIHJlZ2lzdHJhdGlvbiBmYWlsZWQhXG4iKTsKLQkJCWlmICh0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSkKLQkJCQl0dHVzYi0+ZmUtPm9wcy0+cmVsZWFzZSh0dHVzYi0+ZmUpOworCQkJaWYgKHR0dXNiLT5mZS0+b3BzLnJlbGVhc2UpCisJCQkJdHR1c2ItPmZlLT5vcHMucmVsZWFzZSh0dHVzYi0+ZmUpOwogCQkJdHR1c2ItPmZlID0gTlVMTDsKIAkJfQogCX0KQEAgLTE1MDcsNyArMTY3NSw3IEBACiAKIAltdXRleF91bmxvY2soJnR0dXNiLT5zZW1pMmMpOwogCi0JaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmdHR1c2ItPmFkYXB0ZXIsICJUZWNobm90cmVuZC9IYXVwcGF1Z2UgTm92YS1VU0IiLCBUSElTX01PRFVMRSkpIDwgMCkgeworCWlmICgocmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJnR0dXNiLT5hZGFwdGVyLCAiVGVjaG5vdHJlbmQvSGF1cHBhdWdlIE5vdmEtVVNCIiwgVEhJU19NT0RVTEUsICZ1ZGV2LT5kZXYpKSA8IDApIHsKIAkJdHR1c2JfZnJlZV9pc29fdXJicyh0dHVzYik7CiAJCWtmcmVlKHR0dXNiKTsKIAkJcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYl9kZWMuYwppbmRleCA0NGRlYTMyLi42YzFjYjc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JfZGVjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiX2RlYy5jCkBAIC0xNDMyLDcgKzE0MzIsNyBAQAogCWRwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCiAJaWYgKChyZXN1bHQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmZGVjLT5hZGFwdGVyLAotCQkJCQkgICBkZWMtPm1vZGVsX25hbWUsIFRISVNfTU9EVUxFKSkgPCAwKSB7CisJCQkJCSAgIGRlYy0+bW9kZWxfbmFtZSwgVEhJU19NT0RVTEUsICZkZWMtPnVkZXYtPmRldikpIDwgMCkgewogCQlwcmludGsoIiVzOiBkdmJfcmVnaXN0ZXJfYWRhcHRlciBmYWlsZWQ6IGVycm9yICVkXG4iLAogCQkgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQpOwogCkBAIC0xNjU3LDggKzE2NTcsOCBAQAogCX0gZWxzZSB7CiAJCWlmIChkdmJfcmVnaXN0ZXJfZnJvbnRlbmQoJmRlYy0+YWRhcHRlciwgZGVjLT5mZSkpIHsKIAkJCXByaW50aygiYnVkZ2V0LWNpOiBGcm9udGVuZCByZWdpc3RyYXRpb24gZmFpbGVkIVxuIik7Ci0JCQlpZiAoZGVjLT5mZS0+b3BzLT5yZWxlYXNlKQotCQkJCWRlYy0+ZmUtPm9wcy0+cmVsZWFzZShkZWMtPmZlKTsKKwkJCWlmIChkZWMtPmZlLT5vcHMucmVsZWFzZSkKKwkJCQlkZWMtPmZlLT5vcHMucmVsZWFzZShkZWMtPmZlKTsKIAkJCWRlYy0+ZmUgPSBOVUxMOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL3R0dXNiLWRlYy90dHVzYmRlY2ZlLmMKaW5kZXggYTVhNDYxNy4uNDJmMzlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvdHR1c2ItZGVjL3R0dXNiZGVjZmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi90dHVzYi1kZWMvdHR1c2JkZWNmZS5jCkBAIC0yOCw4ICsyOCw2IEBACiAKIHN0cnVjdCB0dHVzYmRlY2ZlX3N0YXRlIHsKIAotCXN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIG9wczsKLQogCS8qIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgKi8KIAljb25zdCBzdHJ1Y3QgdHR1c2JkZWNmZV9jb25maWcqIGNvbmZpZzsKIApAQCAtMjAzLDEwICsyMDEsOSBAQAogCiAJLyogc2V0dXAgdGhlIHN0YXRlICovCiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKLQltZW1jcHkoJnN0YXRlLT5vcHMsICZ0dHVzYmRlY2ZlX2R2YnRfb3BzLCBzaXplb2Yoc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMpKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KLQlzdGF0ZS0+ZnJvbnRlbmQub3BzID0gJnN0YXRlLT5vcHM7CisJbWVtY3B5KCZzdGF0ZS0+ZnJvbnRlbmQub3BzLCAmdHR1c2JkZWNmZV9kdmJ0X29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAJc3RhdGUtPmZyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKIAlyZXR1cm4gJnN0YXRlLT5mcm9udGVuZDsKIH0KQEAgLTIyNiwxMCArMjIzLDkgQEAKIAlzdGF0ZS0+Y29uZmlnID0gY29uZmlnOwogCXN0YXRlLT52b2x0YWdlID0gMDsKIAlzdGF0ZS0+aGlfYmFuZCA9IDA7Ci0JbWVtY3B5KCZzdGF0ZS0+b3BzLCAmdHR1c2JkZWNmZV9kdmJzX29wcywgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CiAKIAkvKiBjcmVhdGUgZHZiX2Zyb250ZW5kICovCi0Jc3RhdGUtPmZyb250ZW5kLm9wcyA9ICZzdGF0ZS0+b3BzOworCW1lbWNweSgmc3RhdGUtPmZyb250ZW5kLm9wcywgJnR0dXNiZGVjZmVfZHZic19vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOwogCXN0YXRlLT5mcm9udGVuZC5kZW1vZHVsYXRvcl9wcml2ID0gc3RhdGU7CiAJcmV0dXJuICZzdGF0ZS0+ZnJvbnRlbmQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3JhZGlvL0tjb25maWcKaW5kZXggM2ZmZjc1Ny4uZGUzMTI4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vS2NvbmZpZwpAQCAtMTM2LDcgKzEzNiw3IEBACiAJICBDaG9vc2UgWSBoZXJlIGlmIHlvdSBoYXZlIHRoaXMgUENJIEZNIHJhZGlvIGNhcmQuCiAKIAkgIEluIG9yZGVyIHRvIGNvbnRyb2wgeW91ciByYWRpbyBjYXJkLCB5b3Ugd2lsbCBuZWVkIHRvIHVzZSBwcm9ncmFtcwotCSAgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBWaWRlbyBmb3IgTGludXggQVBJLiAgSW5mb3JtYXRpb24gb24gCisJICB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggdGhlIFZpZGVvIGZvciBMaW51eCBBUEkuICBJbmZvcm1hdGlvbiBvbgogCSAgdGhpcyBBUEkgYW5kIHBvaW50ZXJzIHRvICJ2NGwiIHByb2dyYW1zIG1heSBiZSBmb3VuZCBhdAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbD4uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3JhZGlvL01ha2VmaWxlCmluZGV4IDhiMzUxOTQuLmU5NWI2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9NYWtlZmlsZQpAQCAtMjAsMyArMjAsNSBAQAogb2JqLSQoQ09ORklHX1JBRElPX0dFTVRFS19QQ0kpICs9IHJhZGlvLWdlbXRlay1wY2kubwogb2JqLSQoQ09ORklHX1JBRElPX1RSVVNUKSArPSByYWRpby10cnVzdC5vCiBvYmotJChDT05GSUdfUkFESU9fTUFFU1RSTykgKz0gcmFkaW8tbWFlc3Ryby5vCisKK0VYVFJBX0NGTEFHUyArPSAtSXNvdW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yYWRpby5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9taXJvcGNtMjAtcmFkaW8uYwppbmRleCBkYzI5MmRhLi5jNDMxMmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yYWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJhZGlvLmMKQEAgLTE2LDEzICsxNiwxNCBAQAogCiAvKiBXaGF0IGV2ZXIgeW91IHRoaW5rIGFib3V0IHRoZSBBQ0ksIHZlcnNpb24gMHgwNyBpcyBub3QgdmVyeSB3ZWxsIQogICogSSBjYW4ndCBnZXQgZnJlcXVlbmN5LCAndHVuZXIgc3RhdHVzJywgJ3R1bmVyIGZsYWdzJyBvciBtdXRlL21vbm8KLSAqIGNvbmRpdGlvbnMuLi4gICAgICAgICAgICAgICAgUm9iZXJ0IAorICogY29uZGl0aW9ucy4uLiAgICAgICAgICAgICAgICBSb2JlcnQKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vc291bmQvb3NzL2FjaS5oIgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSAib3NzL2FjaS5oIgogI2luY2x1ZGUgIm1pcm9wY20yMC1yZHMtY29yZS5oIgogCiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CkBAIC0xMjMsNyArMTI0LDcgQEAKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwY20yMF9kZXZpY2UgKnBjbTIwID0gZGV2LT5wcml2OwogCWludCBpOwotCQorCiAJc3dpdGNoKGNtZCkKIAl7CiAJCWNhc2UgVklESU9DR0NBUDoKQEAgLTEzOSw3ICsxNDAsNyBAQAogCQljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXYtPnJhbmdlbG93PTg3KjE2MDAwOwogCQkJdi0+cmFuZ2VoaWdoPTEwOCoxNjAwMDsKQEAgLTE3Miw3ICsxNzMsNyBAQAogCQkJcmV0dXJuIGk7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3M9VklERU9fQVVESU9fTVVUQUJMRTsKQEAgLTE4MywxMiArMTg0LDEyIEBACiAJCQkJdi0+bW9kZXw9VklERU9fU09VTkRfTU9OTzsKIAkJCS8qIHYtPnN0ZXA9MjA0ODsgKi8KIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCQlwY20yMF9tdXRlKHBjbTIwLCAhISh2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSk7CkBAIC0yMzcsNyArMjM4LDcgQEAKIHsKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJnBjbTIwX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpPT0tMSkKIAkJZ290byB2aWRlb19yZWdpc3Rlcl9kZXZpY2U7Ci0JCQorCiAJaWYoYXR0YWNoX2FjaV9yZHMoKTwwKQogCQlnb3RvIGF0dGFjaF9hY2lfcmRzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9taXJvcGNtMjAtcmRzLWNvcmUuYwppbmRleCBiNjAyYzczLi45NDI4ZDhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy1jb3JlLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSAiLi4vLi4vLi4vc291bmQvb3NzL2FjaS5oIgorI2luY2x1ZGUgIm9zcy9hY2kuaCIKICNpbmNsdWRlICJtaXJvcGNtMjAtcmRzLWNvcmUuaCIKIAogI2RlZmluZSBERUJVRyAwCkBAIC0zMywyNCArMzMsMjQgQEAKICNkZWZpbmUgUkRTX0JVU1lNQVNLICAgICAgICAweDEwICAgLyogQml0IDQgKi8KICNkZWZpbmUgUkRTX0NMT0NLTUFTSyAgICAgICAweDA4ICAgLyogQml0IDMgKi8KIAotI2RlZmluZSBSRFNfREFUQSh4KSAgICAgICAgICgoKHgpID4+IFJEU19EQVRBU0hJRlQpICYgMSkgCisjZGVmaW5lIFJEU19EQVRBKHgpICAgICAgICAgKCgoeCkgPj4gUkRTX0RBVEFTSElGVCkgJiAxKQogCiAKICNpZiBERUJVRwogc3RhdGljIHZvaWQgcHJpbnRfbWF0cml4KGNoYXIgYXJyYXlbXSwgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKLSAgICAgICAgaW50IGksIGo7CisJaW50IGksIGo7CiAKLSAgICAgICAgZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiYWNpLXJkczogIik7Ci0gICAgICAgICAgICAgICAgZm9yIChqPTc7IGo+PTA7IGotLSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIlZCIsIChhcnJheVtpXSA+PiBqKSAmIDB4MSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpJTggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiIGJ5dGUtYm9yZGVyXG4iKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7Ci0gICAgICAgIH0KKwlmb3IgKGk9MDsgaTxsZW5ndGg7IGkrKykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpLXJkczogIik7CisJCWZvciAoaj03OyBqPj0wOyBqLS0pIHsKKwkJCXByaW50aygiJWQiLCAoYXJyYXlbaV0gPj4gaikgJiAweDEpOworCQl9CisJCWlmIChpJTggPT0gMCkKKwkJCXByaW50aygiIGJ5dGUtYm9yZGVyXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKCJcbiIpOworCX0KIH0KICNlbmRpZiAvKiBERUJVRyAqLwogCkBAIC0xMTQsNyArMTE0LDcgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIHNlbmRidWZmZXJbOF07CiAJaW50IGk7Ci0JCisKIAlpZiAoYnl0ZTJ0cmFucyhjbWQsIHNlbmRidWZmZXIsIDgpICE9IDApewogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIHsKQEAgLTE1MSw3ICsxNTEsNyBAQAogCSAgIEkgaGF2ZSB0byB3YWl0cmVhZCgpIGhlcmUgKi8KIAlpZiAocmRzX3dhaXRyZWFkKCkgPCAwKQogCQlyZXR1cm4gLTE7Ci0JCisKIAltZW1zZXQoZGF0YWJ1ZmZlciwgMCwgZGF0YXNpemUpOwogCiAJZm9yIChpPTA7IGk8IFJFQURTSVpFOyBpKyspCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJcmV0ID0gMDsKIAogCW11dGV4X3VubG9jaygmYWNpX3Jkc19tdXRleCk7Ci0JCisKIAlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTChhY2lfcmRzX2NtZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL21pcm9wY20yMC1yZHMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCmluZGV4IGUwOTIxNDAuLjg3YjM3YjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vbWlyb3BjbTIwLXJkcy5jCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X21hdHJpeChjaGFyICpjaCwgY2hhciBvdXRbXSkKIHsKLSAgICAgICAgaW50IGo7CisJaW50IGo7CiAKIAlmb3IgKGo9Nzsgaj49MDsgai0tKSB7CiAJCSBvdXRbNy1qXSA9ICgoKmNoID4+IGopICYgMHgxKSArICcwJzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKaW5kZXggNTU3ZmI1Yy4uZGYyMmE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1haW1zbGFiLmMKQEAgLTI0LDcgKzI0LDcgQEAKICAqICAgb3V0KHBvcnQsIHN0YXJ0X2luY3JlYXNpbmdfdm9sdW1lKTsKICAqICAgd2FpdChhX3dlZV93aGlsZSk7CiAgKiAgIG91dChwb3J0LCBzdG9wX2NoYW5naW5nX3RoZV92b2x1bWUpOwotICogIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIE1vZHVsZXMgCQkJKi8KQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX1JUUkFDS19QT1JUIAkqLwogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4JLyogTG9jayBmb3IgdGhlIEkvTyAJCSovCiAKQEAgLTQxLDcgKzQyLDcgQEAKICNkZWZpbmUgQ09ORklHX1JBRElPX1JUUkFDS19QT1JUIC0xCiAjZW5kaWYKIAotc3RhdGljIGludCBpbyA9IENPTkZJR19SQURJT19SVFJBQ0tfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1JUUkFDS19QT1JUOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHN0cnVjdCBtdXRleCBsb2NrOwogCkBAIC05MywxMiArOTQsMTIgQEAKIAlpbnQgaTsKIAogCW11dGV4X2xvY2soJmxvY2spOwotCQorCiAJaWYodm9sID09IGRldi0+Y3Vydm9sKSB7CS8qIHJlcXVlc3RlZCB2b2x1bWUgPSBjdXJyZW50ICovCiAJCWlmIChkZXYtPm11dGVkKSB7CS8qIHVzZXIgaXMgdW5tdXRpbmcgdGhlIGNhcmQgICovCiAJCQlkZXYtPm11dGVkID0gMDsKIAkJCW91dGIgKDB4ZDgsIGlvKTsJLyogZW5hYmxlIGNhcmQgKi8KLQkJfQkKKwkJfQogCQltdXRleF91bmxvY2soJmxvY2spOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTQsMTAgKzExNSwxMCBAQAogCiAJZGV2LT5tdXRlZCA9IDA7CiAJaWYodm9sID4gZGV2LT5jdXJ2b2wpCi0JCWZvcihpID0gZGV2LT5jdXJ2b2w7IGkgPCB2b2w7IGkrKykgCisJCWZvcihpID0gZGV2LT5jdXJ2b2w7IGkgPCB2b2w7IGkrKykKIAkJCXJ0X2luY3ZvbCgpOwogCWVsc2UKLQkJZm9yKGkgPSBkZXYtPmN1cnZvbDsgaSA+IHZvbDsgaS0tKSAKKwkJZm9yKGkgPSBkZXYtPmN1cnZvbDsgaSA+IHZvbDsgaS0tKQogCQkJcnRfZGVjdm9sKCk7CiAKIAlkZXYtPmN1cnZvbCA9IHZvbDsKQEAgLTEyNSw3ICsxMjYsNyBAQAogCXJldHVybiAwOwogfQogCi0vKiB0aGUgMTI4KzY0IG9uIHRoZXNlIG91dGIncyBpcyB0byBrZWVwIHRoZSB2b2x1bWUgc3RhYmxlIHdoaWxlIHR1bmluZyAKKy8qIHRoZSAxMjgrNjQgb24gdGhlc2Ugb3V0YidzIGlzIHRvIGtlZXAgdGhlIHZvbHVtZSBzdGFibGUgd2hpbGUgdHVuaW5nCiAgKiB3aXRob3V0IHRoZW0sIHRoZSB2b2x1bWUgX3dpbGxfIGNyZWVwIHVwIHdpdGggZWFjaCBmcmVxdWVuY3kgY2hhbmdlCiAgKiBhbmQgYml0IDQgKCsxNikgaXMgdG8ga2VlcCB0aGUgc2lnbmFsIHN0cmVuZ3RoIG1ldGVyIGVuYWJsZWQKICAqLwpAQCAtMTQwLDcgKzE0MSw3IEBACiAJCW91dGJfcCgxMjgrNjQrMTYrOCsgIDEsIHBvcnQpOyAgLyogb24gKyB3ci1lbmFibGUgKyBkYXRhIGxvdyAqLwogCQlvdXRiX3AoMTI4KzY0KzE2KzgrMisxLCBwb3J0KTsgIC8qIGNsb2NrICovCiAJfQotCXNsZWVwX2RlbGF5KDEwMDApOyAKKwlzbGVlcF9kZWxheSgxMDAwKTsKIH0KIAogc3RhdGljIHZvaWQgc2VuZF8xX2J5dGUoaW50IHBvcnQsIHN0cnVjdCBydF9kZXZpY2UgKmRldikKQEAgLTE0OCwxMyArMTQ5LDEzIEBACiAJaWYgKChkZXYtPmN1cnZvbCA9PSAwKSB8fCAoZGV2LT5tdXRlZCkpIHsKIAkJb3V0Yl9wKDEyOCs2NCsxNis0ICArMSwgcG9ydCk7ICAgLyogd3ItZW5hYmxlK2RhdGEgaGlnaCAqLwogCQlvdXRiX3AoMTI4KzY0KzE2KzQrMisxLCBwb3J0KTsgICAvKiBjbG9jayAqLwotCX0gCisJfQogCWVsc2UgewogCQlvdXRiX3AoMTI4KzY0KzE2KzgrNCAgKzEsIHBvcnQpOyAvKiBvbit3ci1lbmFibGUrZGF0YSBoaWdoICovCiAJCW91dGJfcCgxMjgrNjQrMTYrOCs0KzIrMSwgcG9ydCk7IC8qIGNsb2NrICovCiAJfQogCi0Jc2xlZXBfZGVsYXkoMTAwMCk7IAorCXNsZWVwX2RlbGF5KDEwMDApOwogfQogCiBzdGF0aWMgaW50IHJ0X3NldGZyZXEoc3RydWN0IHJ0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZyZXEpCkBAIC0xNjcsOSArMTY4LDkgQEAKIAogCWZyZXEgKz0gMTcxMjAwOwkJCS8qIEFkZCAxMC43IE1IeiBJRiAJCSovCiAJZnJlcSAvPSA4MDA7CQkJLyogQ29udmVydCB0byA1MCBrSHogdW5pdHMJKi8KLQkKKwogCW11dGV4X2xvY2soJmxvY2spOwkJCS8qIFN0b3Agb3RoZXIgb3BzIGludGVyZmVyaW5nICovCi0JIAorCiAJc2VuZF8wX2J5dGUgKGlvLCBkZXYpOwkJLyogIDA6IExTQiBvZiBmcmVxdWVuY3kJCSovCiAKIAlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykJLyogICA6IGZyZXF1ZW5jeSBiaXRzICgxLTEzKQkqLwpAQCAtMTk1LDcgKzE5Niw3IEBACiAJCW91dGIgKDB4ZDAsIGlvKTsJLyogdm9sdW1lIHN0ZWFkeSArIHNpZ3N0ciAqLwogCWVsc2UKIAkJb3V0YiAoMHhkOCwgaW8pOwkvKiB2b2x1bWUgc3RlYWR5ICsgc2lnc3RyICsgb24gKi8KLQkJCisKIAltdXRleF91bmxvY2soJmxvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMTMsNyArMjE0LDcgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBydF9kZXZpY2UgKnJ0PWRldi0+cHJpdjsKLQkKKwogCXN3aXRjaChjbWQpCiAJewogCQljYXNlIFZJRElPQ0dDQVA6CkBAIC0yMjksNyArMjMwLDcgQEAKIAkJY2FzZSBWSURJT0NHVFVORVI6CiAJCXsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8gCisJCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl2LT5yYW5nZWxvdz0oODcqMTYwMDApOwogCQkJdi0+cmFuZ2VoaWdoPSgxMDgqMTYwMDApOwpAQCAtMjYxLDIxICsyNjIsMjEgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0FVRElPOgotCQl7CQorCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CiAJCQltZW1zZXQodiwwLCBzaXplb2YoKnYpKTsKIAkJCXYtPmZsYWdzfD1WSURFT19BVURJT19NVVRBQkxFfFZJREVPX0FVRElPX1ZPTFVNRTsKIAkJCXYtPnZvbHVtZT1ydC0+Y3Vydm9sICogNjU1NDsKIAkJCXYtPnN0ZXA9NjU1NDsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCXJ0X211dGUocnQpOwogCQkJZWxzZQogCQkJCXJ0X3NldHZvbChydCx2LT52b2x1bWUvNjU1NCk7CkBAIC0yOTgsNyArMjk5LDcgQEAKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UsCi0JLmlvY3RsCSAgICAgICAgPSBydF9pb2N0bCwKKwkuaW9jdGwJCT0gcnRfaW9jdGwsCiAJLmNvbXBhdF9pb2N0bAk9IHY0bF9jb21wYXRfaW9jdGwzMiwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwpAQCAtMzIwLDE0ICszMjEsMTQgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgInJ0cmFjayIpKSAKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyLCAicnRyYWNrIikpCiAJewogCQlwcmludGsoS0VSTl9FUlIgInJ0cmFjazogcG9ydCAweCV4IGFscmVhZHkgaW4gdXNlXG4iLCBpbyk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJcnRyYWNrX3JhZGlvLnByaXY9JnJ0cmFja191bml0OwotCQorCiAJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZydHJhY2tfcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik9PS0xKQogCXsKIAkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwpAQCAtMzM2LDEwICszMzcsMTAgQEAKIAlwcmludGsoS0VSTl9JTkZPICJBSU1TbGFiIFJhZGlvVHJhY2svUmFkaW9SZXZlYWwgY2FyZCBkcml2ZXIuXG4iKTsKIAogCS8qIFNldCB1cCB0aGUgSS9PIGxvY2tpbmcgKi8KLQkKKwogCW11dGV4X2luaXQoJmxvY2spOwotCQotIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCisKKwkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAKIAkvKiB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgdm9sdW1lIGlzIGFsbCB0aGUgd2F5IGRvd24gICovCiAJb3V0YigweDQ4LCBpbyk7CQkvKiB2b2x1bWUgZG93biBidXQgc3RpbGwgIm9uIgkqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKaW5kZXggODNiZGFlMi4uOTVlNjMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCkBAIC0xLDExICsxLDExIEBACi0vKiByYWRpby1henRlY2guYyAtIEF6dGVjaCByYWRpbyBjYXJkIGRyaXZlciBmb3IgTGludXggMi4yIAorLyogcmFkaW8tYXp0ZWNoLmMgLSBBenRlY2ggcmFkaW8gY2FyZCBkcml2ZXIgZm9yIExpbnV4IDIuMgogICoKLSAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieSAKKyAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieQogICogUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4uICBCYXNlZCBvbiBvcmlnaW5hbCB0dW5lciBjb2RlIGJ5OgogICoKICAqIFF1YXkgTHkKICAqIERvbmFsZCBTb25nCi0gKiBKYXNvbiBMZXdpcyAgICAgIChqbGV3aXNAdHdpbGlnaHQudnRjLnZzYy5lZHUpIAorICogSmFzb24gTGV3aXMgICAgICAoamxld2lzQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICogU2NvdHQgTWNHcmF0aCAgICAoc21jZ3JhdGhAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKiBXaWxsaWFtIE1jR3JhdGggICh3bWNncmF0aEB0d2lsaWdodC52dGMudnNjLmVkdSkKICAqCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIENPTkZJR19SQURJT19BWlRFQ0hfUE9SVCAJKi8KIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwpAQCAtMzksNyArNDAsNyBAQAogI2RlZmluZSBDT05GSUdfUkFESU9fQVpURUNIX1BPUlQgLTEKICNlbmRpZgogCi1zdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX0FaVEVDSF9QT1JUOyAKK3N0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fQVpURUNIX1BPUlQ7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBzdGF0aWMgaW50IHJhZGlvX3dhaXRfdGltZSA9IDEwMDA7CiBzdGF0aWMgc3RydWN0IG11dGV4IGxvY2s7CkBAIC01MywxNSArNTQsMTUgQEAKIAogc3RhdGljIGludCB2b2xjb252ZXJ0KGludCBsZXZlbCkKIHsKLQlsZXZlbD4+PTE0OwkgCS8qIE1hcCAxNmJpdHMgZG93biB0byAyIGJpdCAqLwotIAlsZXZlbCY9MzsKLQkKKwlsZXZlbD4+PTE0OwkJLyogTWFwIDE2Yml0cyBkb3duIHRvIDIgYml0ICovCisJbGV2ZWwmPTM7CisKIAkvKiBjb252ZXJ0IHRvIGNhcmQtZnJpZW5kbHkgdmFsdWVzICovCi0Jc3dpdGNoIChsZXZlbCkgCisJc3dpdGNoIChsZXZlbCkKIAl7Ci0JCWNhc2UgMDogCisJCWNhc2UgMDoKIAkJCXJldHVybiAwOwotCQljYXNlIDE6IAorCQljYXNlIDE6CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSAyOgogCQkJcmV0dXJuIDQ7CkBAIC0xMjEsOSArMTIyLDkgQEAKIAogCWZyZXF1ZW5jeSArPSAxNzEyMDA7CQkvKiBBZGQgMTAuNyBNSHogSUYJCSovCiAJZnJlcXVlbmN5IC89IDgwMDsJCS8qIENvbnZlcnQgdG8gNTAga0h6IHVuaXRzCSovCi0JCQkJCQorCiAJbXV0ZXhfbG9jaygmbG9jayk7Ci0JCisKIAlzZW5kXzBfYnl0ZSAoZGV2KTsJCS8qICAwOiBMU0Igb2YgZnJlcXVlbmN5ICAgICAgICovCiAKIAlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykJLyogICA6IGZyZXF1ZW5jeSBiaXRzICgxLTEzKSAgKi8KQEAgLTE1MSw3ICsxNTIsNyBAQAogCiAJdWRlbGF5IChyYWRpb193YWl0X3RpbWUpOwogCW91dGJfcCgxMjgrNjQrdm9sY29udmVydChkZXYtPmN1cnZvbCksIGlvKTsKLQkKKwogCW11dGV4X3VubG9jaygmbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTE2Miw3ICsxNjMsNyBAQAogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IGF6X2RldmljZSAqYXogPSBkZXYtPnByaXY7Ci0JCisKIAlzd2l0Y2goY21kKQogCXsKIAkJY2FzZSBWSURJT0NHQ0FQOgpAQCAtMTc4LDcgKzE3OSw3IEBACiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7Ci0JCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovIAorCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJdi0+cmFuZ2Vsb3c9KDg3KjE2MDAwKTsKIAkJCXYtPnJhbmdlaGlnaD0oMTA4KjE2MDAwKTsKQEAgLTIxMSw3ICsyMTIsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3N8PVZJREVPX0FVRElPX01VVEFCTEV8VklERU9fQVVESU9fVk9MVU1FOwpAQCAtMjIyLDE3ICsyMjMsMTcgQEAKIAkJCXYtPnZvbHVtZT1hei0+Y3Vydm9sOwogCQkJdi0+c3RlcD0xNjM4NDsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJYXotPmN1cnZvbD12LT52b2x1bWU7CiAKIAkJCWF6LT5zdGVyZW89KHYtPm1vZGUmVklERU9fU09VTkRfU1RFUkVPKT8xOjA7Ci0JCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSAKKwkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpCiAJCQkJYXpfc2V0dm9sKGF6LDApOwogCQkJZWxzZQogCQkJCWF6X3NldHZvbChheixhei0+Y3Vydm9sKTsKQEAgLTI3Nyw3ICsyNzgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyLCAiYXp0ZWNoIikpIAorCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDIsICJhenRlY2giKSkKIAl7CiAJCXByaW50ayhLRVJOX0VSUiAiYXp0ZWNoOiBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTI4NSwxMyArMjg2LDEzIEBACiAKIAltdXRleF9pbml0KCZsb2NrKTsKIAlhenRlY2hfcmFkaW8ucHJpdj0mYXp0ZWNoX3VuaXQ7Ci0JCisKIAlpZih2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmF6dGVjaF9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKT09LTEpCiAJewogCQlyZWxlYXNlX3JlZ2lvbihpbywyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQkKKwogCXByaW50ayhLRVJOX0lORk8gIkF6dGVjaCByYWRpbyBjYXJkIGRyaXZlciB2MS4wMC8xOTk5MDIyNCBya3JvbGxAZXhwbG9pdHMub3JnXG4iKTsKIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAJb3V0YiAoMCwgaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCmluZGV4IGYxYjVhYzguLjg2NDFhZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKQEAgLTgsNyArOCw3IEBACiAgKiBSdXNzZWxsIEtyb2xsICAgIChya3JvbGxAZXhwbG9pdHMub3JnKQogICogUXVheSBMeQogICogRG9uYWxkIFNvbmcKLSAqIEphc29uIExld2lzICAgICAgKGpsZXdpc0B0d2lsaWdodC52dGMudnNjLmVkdSkgCisgKiBKYXNvbiBMZXdpcyAgICAgIChqbGV3aXNAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKiBTY290dCBNY0dyYXRoICAgIChzbWNncmF0aEB0d2lsaWdodC52dGMudnNjLmVkdSkKICAqIFdpbGxpYW0gTWNHcmF0aCAgKHdtY2dyYXRoQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICoKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3BucC5oPgogCkBAIC01NSwyOSArNTYsMjkgQEAKIAogLyoKICAqIFNpZ25hbCBTdHJlbmd0aCBUaHJlc2hvbGQgVmFsdWVzCi0gKiBUaGUgVjRMIEFQSSBzcGVjIGRvZXMgbm90IGRlZmluZSBhbnkgcGFydGljdWxhciB1bml0IGZvciB0aGUgc2lnbmFsIAorICogVGhlIFY0TCBBUEkgc3BlYyBkb2VzIG5vdCBkZWZpbmUgYW55IHBhcnRpY3VsYXIgdW5pdCBmb3IgdGhlIHNpZ25hbAogICogc3RyZW5ndGggdmFsdWUuICBUaGVzZSB2YWx1ZXMgYXJlIGluIG1pY3Jvdm9sdHMgb2YgUkYgYXQgdGhlIHR1bmVyJ3MgaW5wdXQuCiAgKi8KIHN0YXRpYyBfX3UxNiBzaWd0YWJsZVsyXVs0XT17ezUsMTAsMzAsMTUwfSx7MjgsNDAsNjMsMTAwMH19OwogCiBzdGF0aWMgaW50IGNhZGV0X2dldHJkcyh2b2lkKQogewotICAgICAgICBpbnQgcmRzc3RhdD0wOworCWludCByZHNzdGF0PTA7CiAKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICBvdXRiKDMsaW8pOyAgICAgICAgICAgICAgICAgLyogU2VsZWN0IERlY29kZXIgQ29udHJvbC9TdGF0dXMgKi8KKwlvdXRiKDMsaW8pOyAgICAgICAgICAgICAgICAgLyogU2VsZWN0IERlY29kZXIgQ29udHJvbC9TdGF0dXMgKi8KIAlvdXRiKGluYihpbysxKSYweDdmLGlvKzEpOyAgLyogUmVzZXQgUkRTIGRldGVjdGlvbiAqLwogCXNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLQkKKwogCW1zbGVlcCgxMDApOwogCi0Jc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsJCi0gICAgICAgIG91dGIoMyxpbyk7ICAgICAgICAgICAgICAgICAvKiBTZWxlY3QgRGVjb2RlciBDb250cm9sL1N0YXR1cyAqLworCXNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7CisJb3V0YigzLGlvKTsgICAgICAgICAgICAgICAgIC8qIFNlbGVjdCBEZWNvZGVyIENvbnRyb2wvU3RhdHVzICovCiAJaWYoKGluYihpbysxKSYweDgwKSE9MCkgewotCSAgICAgICAgcmRzc3RhdHw9VklERU9fVFVORVJfUkRTX09OOworCQlyZHNzdGF0fD1WSURFT19UVU5FUl9SRFNfT047CiAJfQogCWlmKChpbmIoaW8rMSkmMHgxMCkhPTApIHsKLQkgICAgICAgIHJkc3N0YXR8PVZJREVPX1RVTkVSX01CU19PTjsKKwkJcmRzc3RhdHw9VklERU9fVFVORVJfTUJTX09OOwogCX0KIAlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CiAJcmV0dXJuIHJkc3N0YXQ7CkBAIC04Niw0OSArODcsNDkgQEAKIHN0YXRpYyBpbnQgY2FkZXRfZ2V0c3RlcmVvKHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0gICAgICAgIGlmKGN1cnR1bmVyICE9IDApCS8qIE9ubHkgRk0gaGFzIHN0ZXJlbyBjYXBhYmlsaXR5ISAqLwotCSAgICAgICAgcmV0dXJuIDA7CisJaWYoY3VydHVuZXIgIT0gMCkJLyogT25seSBGTSBoYXMgc3RlcmVvIGNhcGFiaWxpdHkhICovCisJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsKLSAgICAgICAgb3V0Yig3LGlvKTsgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlvdXRiKDcsaW8pOyAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwogCWlmKCAoaW5iKGlvKzEpICYgMHg0MCkgPT0gMCkKLSAgICAgICAgCXJldCA9IDE7Ci0gICAgICAgIHNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLSAgICAgICAgcmV0dXJuIHJldDsKKwkJcmV0ID0gMTsKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGNhZGV0X2dldHR1bmUodm9pZCkKIHsKLSAgICAgICAgaW50IGN1cnZvbCxpOworCWludCBjdXJ2b2wsaTsKIAl1bnNpZ25lZCBmaWZvPTA7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogUHJlcGFyZSBmb3IgcmVhZAotICAgICAgICAgKi8KKwkvKgorCSAqIFByZXBhcmUgZm9yIHJlYWQKKwkgKi8KIAogCXNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7Ci0JCi0gICAgICAgIG91dGIoNyxpbyk7ICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCi0gICAgICAgIGN1cnZvbD1pbmIoaW8rMSk7IC8qIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nICovCi0gICAgICAgIG91dGIoMHgwMCxpbysxKTsgIC8qIEVuc3VyZSBXUklURS1FTkFCTEUgaXMgTE9XICovCisKKwlvdXRiKDcsaW8pOyAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLworCWN1cnZvbD1pbmIoaW8rMSk7IC8qIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nICovCisJb3V0YigweDAwLGlvKzEpOyAgLyogRW5zdXJlIFdSSVRFLUVOQUJMRSBpcyBMT1cgKi8KIAl0dW5lc3RhdD0weGZmZmY7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCB0aGUgc2hpZnQgcmVnaXN0ZXIKLSAgICAgICAgICovCi0gICAgICAgIGZvcihpPTA7aTwyNTtpKyspIHsKLSAgICAgICAgICAgICAgICBmaWZvPShmaWZvPDwxKXwoKGluYihpbysxKT4+NykmMHgwMSk7Ci0gICAgICAgICAgICAgICAgaWYoaTwyNCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0YigweDAxLGlvKzEpOworCS8qCisJICogUmVhZCB0aGUgc2hpZnQgcmVnaXN0ZXIKKwkgKi8KKwlmb3IoaT0wO2k8MjU7aSsrKSB7CisJCWZpZm89KGZpZm88PDEpfCgoaW5iKGlvKzEpPj43KSYweDAxKTsKKwkJaWYoaTwyNCkgeworCQkJb3V0YigweDAxLGlvKzEpOwogCQkJdHVuZXN0YXQmPWluYihpbysxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGIoMHgwMCxpbysxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKwkJCW91dGIoMHgwMCxpbysxKTsKKwkJfQorCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBSZXN0b3JlIHZvbHVtZS9tdXRlIHNldHRpbmcKLSAgICAgICAgICovCi0gICAgICAgIG91dGIoY3Vydm9sLGlvKzEpOworCS8qCisJICogUmVzdG9yZSB2b2x1bWUvbXV0ZSBzZXR0aW5nCisJICovCisJb3V0YihjdXJ2b2wsaW8rMSk7CiAJc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwogCiAJcmV0dXJuIGZpZm87CkBAIC0xMzYsNDMgKzEzNyw0MyBAQAogCiBzdGF0aWMgdW5zaWduZWQgY2FkZXRfZ2V0ZnJlcSh2b2lkKQogewotICAgICAgICBpbnQgaTsKLSAgICAgICAgdW5zaWduZWQgZnJlcT0wLHRlc3QsZmlmbz0wOworCWludCBpOworCXVuc2lnbmVkIGZyZXE9MCx0ZXN0LGZpZm89MDsKIAogCS8qCiAJICogUmVhZCBjdXJyZW50IHR1bmluZwogCSAqLwogCWZpZm89Y2FkZXRfZ2V0dHVuZSgpOwogCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgdG8gYWN0dWFsIGZyZXF1ZW5jeQotICAgICAgICAgKi8KKwkvKgorCSAqIENvbnZlcnQgdG8gYWN0dWFsIGZyZXF1ZW5jeQorCSAqLwogCWlmKGN1cnR1bmVyPT0wKSB7ICAgIC8qIEZNICovCi0JICAgICAgICB0ZXN0PTEyNTAwOwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwxNDtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKChmaWZvJjB4MDEpIT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXErPXRlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0PXRlc3Q8PDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWZvPWZpZm8+PjE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZXEtPTEwNzAwMDAwOyAgICAgICAgICAgLyogSUYgZnJlcXVlbmN5IGlzIDEwLjcgTUh6ICovCi0gICAgICAgICAgICAgICAgZnJlcT0oZnJlcSoxNikvMTAwMDAwMDsgICAvKiBNYWtlIGl0IDEvMTYgTUh6ICovCisJCXRlc3Q9MTI1MDA7CisJCWZvcihpPTA7aTwxNDtpKyspIHsKKwkJCWlmKChmaWZvJjB4MDEpIT0wKSB7CisJCQkJZnJlcSs9dGVzdDsKKwkJCX0KKwkJCXRlc3Q9dGVzdDw8MTsKKwkJCWZpZm89Zmlmbz4+MTsKKwkJfQorCQlmcmVxLT0xMDcwMDAwMDsgICAgICAgICAgIC8qIElGIGZyZXF1ZW5jeSBpcyAxMC43IE1IeiAqLworCQlmcmVxPShmcmVxKjE2KS8xMDAwMDAwOyAgIC8qIE1ha2UgaXQgMS8xNiBNSHogKi8KIAl9CiAJaWYoY3VydHVuZXI9PTEpIHsgICAgLyogQU0gKi8KLQkgICAgICAgIGZyZXE9KChmaWZvJjB4N2ZmZiktMjAxMCkqMTY7CisJCWZyZXE9KChmaWZvJjB4N2ZmZiktMjAxMCkqMTY7CiAJfQogCi0gICAgICAgIHJldHVybiBmcmVxOworCXJldHVybiBmcmVxOwogfQogCiBzdGF0aWMgdm9pZCBjYWRldF9zZXR0dW5lKHVuc2lnbmVkIGZpZm8pCiB7Ci0gICAgICAgIGludCBpOwotCXVuc2lnbmVkIHRlc3Q7ICAKKwlpbnQgaTsKKwl1bnNpZ25lZCB0ZXN0OwogCiAJc3Bpbl9sb2NrKCZjYWRldF9pb19sb2NrKTsKLQkKKwogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJLyoKIAkgKiBXcml0ZSB0aGUgc2hpZnQgcmVnaXN0ZXIKQEAgLTE4Myw3ICsxODQsNyBAQAogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJb3V0Yih0ZXN0LGlvKzEpOyAgICAgICAgICAgLyogSW5pdGlhbGl6ZSBmb3Igd3JpdGUgKi8KIAlmb3IoaT0wO2k8MjU7aSsrKSB7Ci0gICAJICAgICAgICB0ZXN0fD0weDAxOyAgICAgICAgICAgICAgLyogVG9nZ2xlIFNDSyBIaWdoICovCisJCXRlc3R8PTB4MDE7ICAgICAgICAgICAgICAvKiBUb2dnbGUgU0NLIEhpZ2ggKi8KIAkJb3V0Yih0ZXN0LGlvKzEpOwogCQl0ZXN0Jj0weGZlOyAgICAgICAgICAgICAgLyogVG9nZ2xlIFNDSyBMb3cgKi8KIAkJb3V0Yih0ZXN0LGlvKzEpOwpAQCAtMTk2LDU3ICsxOTcsNTcgQEAKIAogc3RhdGljIHZvaWQgY2FkZXRfc2V0ZnJlcSh1bnNpZ25lZCBmcmVxKQogewotICAgICAgICB1bnNpZ25lZCBmaWZvOwotICAgICAgICBpbnQgaSxqLHRlc3Q7Ci0gICAgICAgIGludCBjdXJ2b2w7CisJdW5zaWduZWQgZmlmbzsKKwlpbnQgaSxqLHRlc3Q7CisJaW50IGN1cnZvbDsKIAotICAgICAgICAvKiAKLSAgICAgICAgICogRm9ybXVsYXRlIGEgZmlmbyBjb21tYW5kCi0gICAgICAgICAqLworCS8qCisJICogRm9ybXVsYXRlIGEgZmlmbyBjb21tYW5kCisJICovCiAJZmlmbz0wOwogCWlmKGN1cnR1bmVyPT0wKSB7ICAgIC8qIEZNICovCi0gICAgICAgIAl0ZXN0PTEwMjQwMDsKLSAgICAgICAgICAgICAgICBmcmVxPShmcmVxKjEwMDApLzE2OyAgICAgICAvKiBNYWtlIGl0IGtIeiAqLwotICAgICAgICAgICAgICAgIGZyZXErPTEwNzAwOyAgICAgICAgICAgICAgIC8qIElGIGlzIDEwNzAwIGtIeiAqLwotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwxNDtpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZm89Zmlmbzw8MTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyZXE+PXRlc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlmb3w9MHgwMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcS09dGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Q9dGVzdD4+MTsKLSAgICAgICAgICAgICAgICB9CisJCXRlc3Q9MTAyNDAwOworCQlmcmVxPShmcmVxKjEwMDApLzE2OyAgICAgICAvKiBNYWtlIGl0IGtIeiAqLworCQlmcmVxKz0xMDcwMDsgICAgICAgICAgICAgICAvKiBJRiBpcyAxMDcwMCBrSHogKi8KKwkJZm9yKGk9MDtpPDE0O2krKykgeworCQkJZmlmbz1maWZvPDwxOworCQkJaWYoZnJlcT49dGVzdCkgeworCQkJCWZpZm98PTB4MDE7CisJCQkJZnJlcS09dGVzdDsKKwkJCX0KKwkJCXRlc3Q9dGVzdD4+MTsKKwkJfQogCX0KIAlpZihjdXJ0dW5lcj09MSkgeyAgICAvKiBBTSAqLwotICAgICAgICAgICAgICAgIGZpZm89KGZyZXEvMTYpKzIwMTA7ICAgICAgICAgICAgLyogTWFrZSBpdCBrSHogKi8KKwkJZmlmbz0oZnJlcS8xNikrMjAxMDsgICAgICAgICAgICAvKiBNYWtlIGl0IGtIeiAqLwogCQlmaWZvfD0weDEwMDAwMDsgICAgICAgICAgICAvKiBTZWxlY3QgQU0gQmFuZCAqLwogCX0KIAotICAgICAgICAvKgotICAgICAgICAgKiBTYXZlIGN1cnJlbnQgdm9sdW1lL211dGUgc2V0dGluZwotICAgICAgICAgKi8KKwkvKgorCSAqIFNhdmUgY3VycmVudCB2b2x1bWUvbXV0ZSBzZXR0aW5nCisJICovCiAKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwogCW91dGIoNyxpbyk7ICAgICAgICAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCi0gICAgICAgIGN1cnZvbD1pbmIoaW8rMSk7IAotICAgICAgICBzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJY3Vydm9sPWluYihpbysxKTsKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CiAKIAkvKgogCSAqIFR1bmUgdGhlIGNhcmQKIAkgKi8KIAlmb3Ioaj0zO2o+LTE7ai0tKSB7Ci0JICAgICAgICBjYWRldF9zZXR0dW5lKGZpZm98KGo8PDE2KSk7Ci0JICAgICAgICAKLQkgICAgICAgIHNwaW5fbG9jaygmY2FkZXRfaW9fbG9jayk7CisJCWNhZGV0X3NldHR1bmUoZmlmb3woajw8MTYpKTsKKworCQlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwogCQlvdXRiKDcsaW8pOyAgICAgICAgIC8qIFNlbGVjdCB0dW5lciBjb250cm9sICovCiAJCW91dGIoY3Vydm9sLGlvKzEpOwogCQlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7Ci0JCQorCiAJCW1zbGVlcCgxMDApOwogCiAJCWNhZGV0X2dldHR1bmUoKTsKIAkJaWYoKHR1bmVzdGF0ICYgMHg0MCkgPT0gMCkgeyAgIC8qIFR1bmVkICovCi0JCSAgICAgICAgc2lnc3RyZW5ndGg9c2lndGFibGVbY3VydHVuZXJdW2pdOworCQkJc2lnc3RyZW5ndGg9c2lndGFibGVbY3VydHVuZXJdW2pdOwogCQkJcmV0dXJuOwogCQl9CiAJfQpAQCAtMjU3LDI4ICsyNTgsMjggQEAKIHN0YXRpYyBpbnQgY2FkZXRfZ2V0dm9sKHZvaWQpCiB7CiAJaW50IHJldCA9IDA7Ci0JCisKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotCQotICAgICAgICBvdXRiKDcsaW8pOyAgICAgICAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwotICAgICAgICBpZigoaW5iKGlvICsgMSkgJiAweDIwKSAhPSAwKQotICAgICAgICAJcmV0ID0gMHhmZmZmOwotICAgICAgICAKLSAgICAgICAgc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICByZXR1cm4gcmV0OworCisJb3V0Yig3LGlvKTsgICAgICAgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlpZigoaW5iKGlvICsgMSkgJiAweDIwKSAhPSAwKQorCQlyZXQgPSAweGZmZmY7CisKKwlzcGluX3VubG9jaygmY2FkZXRfaW9fbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogCiBzdGF0aWMgdm9pZCBjYWRldF9zZXR2b2woaW50IHZvbCkKIHsKIAlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotICAgICAgICBvdXRiKDcsaW8pOyAgICAgICAgICAgICAgICAvKiBTZWxlY3QgdHVuZXIgY29udHJvbCAqLwotICAgICAgICBpZih2b2w+MCkKLSAgICAgICAgICAgICAgICBvdXRiKDB4MjAsaW8rMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvdXRiKDB4MDAsaW8rMSk7CisJb3V0Yig3LGlvKTsgICAgICAgICAgICAgICAgLyogU2VsZWN0IHR1bmVyIGNvbnRyb2wgKi8KKwlpZih2b2w+MCkKKwkJb3V0YigweDIwLGlvKzEpOworCWVsc2UKKwkJb3V0YigweDAwLGlvKzEpOwogCXNwaW5fdW5sb2NrKCZjYWRldF9pb19sb2NrKTsKLX0gIAorfQogCiBzdGF0aWMgdm9pZCBjYWRldF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKQEAgLTI4OCwxNSArMjg5LDE1IEBACiAKIAlpZihzcGluX3RyeWxvY2soJmNhZGV0X2lvX2xvY2spKQogCXsKLQkgICAgICAgIG91dGIoMHgzLGlvKTsgICAgICAgLyogU2VsZWN0IFJEUyBEZWNvZGVyIENvbnRyb2wgKi8KKwkJb3V0YigweDMsaW8pOyAgICAgICAvKiBTZWxlY3QgUkRTIERlY29kZXIgQ29udHJvbCAqLwogCQlpZigoaW5iKGlvKzEpJjB4MjApIT0wKSB7Ci0JCSAgICAgICAgcHJpbnRrKEtFUk5fQ1JJVCAiY2FkZXQ6IFJEUyBmaWZvIG92ZXJmbG93XG4iKTsKKwkJCXByaW50ayhLRVJOX0NSSVQgImNhZGV0OiBSRFMgZmlmbyBvdmVyZmxvd1xuIik7CiAJCX0KIAkJb3V0YigweDgwLGlvKTsgICAgICAvKiBTZWxlY3QgUkRTIGZpZm8gKi8KIAkJd2hpbGUoKGluYihpbykmMHg4MCkhPTApIHsKLQkJICAgICAgICByZHNidWZbcmRzaW5dPWluYihpbysxKTsKKwkJCXJkc2J1ZltyZHNpbl09aW5iKGlvKzEpOwogCQkJaWYocmRzaW49PXJkc291dCkKLQkJCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiY2FkZXQ6IFJEUyBidWZmZXIgb3ZlcmZsb3dcbiIpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImNhZGV0OiBSRFMgYnVmZmVyIG92ZXJmbG93XG4iKTsKIAkJCWVsc2UKIAkJCQlyZHNpbisrOwogCQl9CkBAIC0zMDcsOSArMzA4LDkgQEAKIAkgKiBTZXJ2aWNlIHBlbmRpbmcgcmVhZAogCSAqLwogCWlmKCByZHNpbiE9cmRzb3V0KQotCSAgICAgICAgd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZWFkX3F1ZXVlKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZWFkX3F1ZXVlKTsKIAotCS8qIAorCS8qCiAJICogQ2xlYW4gdXAgYW5kIGV4aXQKIAkgKi8KIAlpbml0X3RpbWVyKCZyZWFkdGltZXIpOwpAQCAtMzI0LDEyICszMjUsMTIgQEAKIHN0YXRpYyBzc2l6ZV90IGNhZGV0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpkYXRhLAogCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLSAgICAgICAgaW50IGk9MDsKKwlpbnQgaT0wOwogCXVuc2lnbmVkIGNoYXIgcmVhZGJ1ZltSRFNfQlVGRkVSXTsKIAotICAgICAgICBpZihyZHNzdGF0PT0wKSB7CisJaWYocmRzc3RhdD09MCkgewogCQlzcGluX2xvY2soJmNhZGV0X2lvX2xvY2spOwotCSAgICAgICAgcmRzc3RhdD0xOworCQlyZHNzdGF0PTE7CiAJCW91dGIoMHg4MCxpbyk7ICAgICAgICAvKiBTZWxlY3QgUkRTIGZpZm8gKi8KIAkJc3Bpbl91bmxvY2soJmNhZGV0X2lvX2xvY2spOwogCQlpbml0X3RpbWVyKCZyZWFkdGltZXIpOwpAQCAtMzM5LDE1ICszNDAsMTUgQEAKIAkJYWRkX3RpbWVyKCZyZWFkdGltZXIpOwogCX0KIAlpZihyZHNpbj09cmRzb3V0KSB7Ci0gIAkgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKLQkJICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotCSAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcmVhZF9xdWV1ZSk7Ci0JfQkJCisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCXJldHVybiAtRVdPVUxEQkxPQ0s7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnJlYWRfcXVldWUpOworCX0KIAl3aGlsZSggaTxjb3VudCAmJiByZHNpbiE9cmRzb3V0KQotCSAgICAgICAgcmVhZGJ1ZltpKytdPXJkc2J1ZltyZHNvdXQrK107CisJCXJlYWRidWZbaSsrXT1yZHNidWZbcmRzb3V0KytdOwogCiAJaWYgKGNvcHlfdG9fdXNlcihkYXRhLHJlYWRidWYsaSkpCi0JICAgICAgICByZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTM3NSwyOSArMzc2LDI5IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlzd2l0Y2godi0+dHVuZXIpIHsKLQkJCSAgICAgICAgY2FzZSAwOgotCQkJICAgICAgICBzdHJjcHkodi0+bmFtZSwiRk0iKTsKLQkJCSAgICAgICAgdi0+cmFuZ2Vsb3c9MTQwMDsgICAgIC8qIDg3LjUgTUh6ICovCi0JCQkgICAgICAgIHYtPnJhbmdlaGlnaD0xNzI4OyAgICAvKiAxMDguMCBNSHogKi8KLQkJCSAgICAgICAgdi0+ZmxhZ3M9MDsKLQkJCSAgICAgICAgdi0+bW9kZT0wOwotCQkJICAgICAgICB2LT5tb2RlfD1WSURFT19NT0RFX0FVVE87Ci0JCQkgICAgICAgIHYtPnNpZ25hbD1zaWdzdHJlbmd0aDsKLQkJCSAgICAgICAgaWYoY2FkZXRfZ2V0c3RlcmVvKCk9PTEpIHsKLQkJCQkgICAgICAgIHYtPmZsYWdzfD1WSURFT19UVU5FUl9TVEVSRU9fT047Ci0JCQkgICAgICAgIH0KKwkJCQljYXNlIDA6CisJCQkJc3RyY3B5KHYtPm5hbWUsIkZNIik7CisJCQkJdi0+cmFuZ2Vsb3c9MTQwMDsgICAgIC8qIDg3LjUgTUh6ICovCisJCQkJdi0+cmFuZ2VoaWdoPTE3Mjg7ICAgIC8qIDEwOC4wIE1IeiAqLworCQkJCXYtPmZsYWdzPTA7CisJCQkJdi0+bW9kZT0wOworCQkJCXYtPm1vZGV8PVZJREVPX01PREVfQVVUTzsKKwkJCQl2LT5zaWduYWw9c2lnc3RyZW5ndGg7CisJCQkJaWYoY2FkZXRfZ2V0c3RlcmVvKCk9PTEpIHsKKwkJCQkJdi0+ZmxhZ3N8PVZJREVPX1RVTkVSX1NURVJFT19PTjsKKwkJCQl9CiAJCQkJdi0+ZmxhZ3N8PWNhZGV0X2dldHJkcygpOwotCQkJICAgICAgICBicmVhazsKLQkJCSAgICAgICAgY2FzZSAxOgotCQkJICAgICAgICBzdHJjcHkodi0+bmFtZSwiQU0iKTsKLQkJCSAgICAgICAgdi0+cmFuZ2Vsb3c9ODMyMDsgICAgICAvKiA1MjAga0h6ICovCi0JCQkgICAgICAgIHYtPnJhbmdlaGlnaD0yNjQwMDsgICAgLyogMTY1MCBrSHogKi8KLQkJCSAgICAgICAgdi0+ZmxhZ3M9MDsKLQkJCSAgICAgICAgdi0+ZmxhZ3N8PVZJREVPX1RVTkVSX0xPVzsKLQkJCSAgICAgICAgdi0+bW9kZT0wOwotCQkJICAgICAgICB2LT5tb2RlfD1WSURFT19NT0RFX0FVVE87Ci0JCQkgICAgICAgIHYtPnNpZ25hbD1zaWdzdHJlbmd0aDsKLQkJCSAgICAgICAgYnJlYWs7CisJCQkJYnJlYWs7CisJCQkJY2FzZSAxOgorCQkJCXN0cmNweSh2LT5uYW1lLCJBTSIpOworCQkJCXYtPnJhbmdlbG93PTgzMjA7ICAgICAgLyogNTIwIGtIeiAqLworCQkJCXYtPnJhbmdlaGlnaD0yNjQwMDsgICAgLyogMTY1MCBrSHogKi8KKwkJCQl2LT5mbGFncz0wOworCQkJCXYtPmZsYWdzfD1WSURFT19UVU5FUl9MT1c7CisJCQkJdi0+bW9kZT0wOworCQkJCXYtPm1vZGV8PVZJREVPX01PREVfQVVUTzsKKwkJCQl2LT5zaWduYWw9c2lnc3RyZW5ndGg7CisJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtNDA3LDQ5ICs0MDgsNDkgQEAKIAkJCWlmKCh2LT50dW5lcjwwKXx8KHYtPnR1bmVyPjEpKSB7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQljdXJ0dW5lcj12LT50dW5lcjsJCisJCQljdXJ0dW5lcj12LT50dW5lcjsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0ZSRVE6CiAJCXsKLQkJICAgICAgICB1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOworCQkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKIAkJCSpmcmVxID0gY2FkZXRfZ2V0ZnJlcSgpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTRlJFUToKIAkJewotCQkgICAgICAgIHVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7CisJCQl1bnNpZ25lZCBsb25nICpmcmVxID0gYXJnOwogCQkJaWYoKGN1cnR1bmVyPT0wKSYmKCgqZnJlcTwxNDAwKXx8KCpmcmVxPjE3MjgpKSkgewotCQkJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCWlmKChjdXJ0dW5lcj09MSkmJigoKmZyZXE8ODMyMCl8fCgqZnJlcT4yNjQwMCkpKSB7Ci0JCQkgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJY2FkZXRfc2V0ZnJlcSgqZnJlcSk7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKCp2KSk7CiAJCQl2LT5mbGFncz1WSURFT19BVURJT19NVVRBQkxFfFZJREVPX0FVRElPX1ZPTFVNRTsKIAkJCWlmKGNhZGV0X2dldHN0ZXJlbygpPT0wKSB7Ci0JCQkgICAgICAgIHYtPm1vZGU9VklERU9fU09VTkRfTU9OTzsKKwkJCQl2LT5tb2RlPVZJREVPX1NPVU5EX01PTk87CiAJCQl9IGVsc2UgewogCQkJCXYtPm1vZGU9VklERU9fU09VTkRfU1RFUkVPOwogCQkJfQogCQkJdi0+dm9sdW1lPWNhZGV0X2dldHZvbCgpOwogCQkJdi0+c3RlcD0weGZmZmY7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNhZGV0X3NldHZvbCh2LT52b2x1bWUpOwotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCWNhZGV0X3NldHZvbCgwKTsKIAkJCWVsc2UKIAkJCQljYWRldF9zZXR2b2woMHhmZmZmKTsKQEAgLTUzOSwxNiArNTQwLDE2IEBACiAKIHN0YXRpYyBpbnQgY2FkZXRfcHJvYmUodm9pZCkKIHsKLSAgICAgICAgc3RhdGljIGludCBpb3ZhbHNbOF09ezB4MzMwLDB4MzMyLDB4MzM0LDB4MzM2LDB4MzM4LDB4MzNhLDB4MzNjLDB4MzNlfTsKKwlzdGF0aWMgaW50IGlvdmFsc1s4XT17MHgzMzAsMHgzMzIsMHgzMzQsMHgzMzYsMHgzMzgsMHgzM2EsMHgzM2MsMHgzM2V9OwogCWludCBpOwogCiAJZm9yKGk9MDtpPDg7aSsrKSB7Ci0JICAgICAgICBpbz1pb3ZhbHNbaV07CisJCWlvPWlvdmFsc1tpXTsKIAkJaWYgKHJlcXVlc3RfcmVnaW9uKGlvLCAyLCAiY2FkZXQtcHJvYmUiKSkgewotCQkgICAgICAgIGNhZGV0X3NldGZyZXEoMTQxMCk7CisJCQljYWRldF9zZXRmcmVxKDE0MTApOwogCQkJaWYoY2FkZXRfZ2V0ZnJlcSgpPT0xNDEwKSB7CiAJCQkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwotCQkJICAgICAgICByZXR1cm4gaW87CisJCQkJcmV0dXJuIGlvOwogCQkJfQogCQkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOwogCQl9CkBAIC01NTYsNyArNTU3LDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLS8qIAorLyoKICAqIGlvIHNob3VsZCBvbmx5IGJlIHNldCBpZiB0aGUgdXNlciBoYXMgdXNlZCBzb21ldGhpbmcgbGlrZQogICogaXNhcG5wICh0aGUgdXNlcnNwYWNlIHByb2dyYW0pIHRvIGluaXRpYWxpemUgdGhpcyBjYXJkIGZvciB1cwogICovCkBAIC01NjQsNyArNTY1LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGNhZGV0X2luaXQodm9pZCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmY2FkZXRfaW9fbG9jayk7Ci0JCisKIAkvKgogCSAqCUlmIGEgcHJvYmUgd2FzIHJlcXVlc3RlZCB0aGVuIHByb2JlIElTQVBuUCBmaXJzdCAoc2FmZXN0KQogCSAqLwpAQCAtNTc5LDEyICs1ODAsMTIgQEAKIAkvKgogCSAqCUVsc2Ugd2UgYmFpbCBvdXQKIAkgKi8KLQkgCi0gICAgICAgIGlmKGlvIDwgMCkgewotI2lmZGVmIE1PRFVMRSAgICAgICAgCisKKwlpZihpbyA8IDApIHsKKyNpZmRlZiBNT0RVTEUKIAkJcHJpbnRrKEtFUk5fRVJSICJZb3UgbXVzdCBzZXQgYW4gSS9PIGFkZHJlc3Mgd2l0aCBpbz0weD8/P1xuIik7CiAjZW5kaWYKLQkgICAgICAgIGdvdG8gZmFpbDsKKwkJZ290byBmYWlsOwogCX0KIAlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLDIsImNhZGV0IikpCiAJCWdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLXBjaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKaW5kZXggOGU0OTliOC4uOWYyNDllNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWstcGNpLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgIAorICoKICAqICAgICByYWRpby1nZW10ZWstcGNpLmMgLSBHZW10ZWsgUENJIFJhZGlvIGRyaXZlcgogICogICAgIChDKSAyMDAxIFZsYWRpbWlyIFNoZWJvcmRhZXYgPHZzaGVib3JkYWV2QG1haWwucnU+CiAgKgpAQCAtMzEsNyArMzEsNyBAQAogICogICAgIHJhZGlvIGRldmljZSBkcml2ZXIuCiAgKgogICogICAgIFBsZWFzZSwgbGV0IG1lIGtub3cgaWYgdGhpcyBwaWVjZSBvZiBjb2RlIHdhcyB1c2VmdWwgOikKLSAqIAorICoKICAqICAgICBUT0RPOiBtdWx0aXBsZSBkZXZpY2Ugc3VwcG9ydCBhbmQgcG9ydGFiaWxpdHkgd2VyZSBub3QgdGVzdGVkCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtNjksMTggKzcwLDE4IEBACiAjZGVmaW5lIFRSVUUgKDEpCiAjZW5kaWYKIAotI2lmbmRlZiBGQUxTRSAKKyNpZm5kZWYgRkFMU0UKICNkZWZpbmUgRkFMU0UgKDApCiAjZW5kaWYKIAogc3RydWN0IGdlbXRla19wY2lfY2FyZCB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmlkZW9kZXY7Ci0JCisKIAl1MzIgaW9iYXNlOwogCXUzMiBsZW5ndGg7CiAJdTggIGNoaXByZXY7CiAJdTE2IG1vZGVsOwotCQorCiAJdTMyIGN1cnJlbnRfZnJlcXVlbmN5OwogCXU4ICBtdXRlOwogfTsKQEAgLTk2LDcgKzk3LDcgQEAKIAlyZXR1cm4gKHU4KXZhbHVlOwogfQogCi0jZGVmaW5lIF9iMCggdiApICooKHU4ICopJnYpICAKKyNkZWZpbmUgX2IwKCB2ICkgKigodTggKikmdikKIHN0YXRpYyB2b2lkIF9fZ2VtdGVrX3BjaV9jbWQoIHUxNiB2YWx1ZSwgdTMyIHBvcnQsIHU4ICpsYXN0X2J5dGUsIGludCBrZWVwICkKIHsKIAlyZWdpc3RlciB1OCBieXRlID0gKmxhc3RfYnl0ZTsKQEAgLTEwNCw3ICsxMDUsNyBAQAogCWlmICggIXZhbHVlICkgewogCQlpZiAoICFrZWVwICkKIAkJCXZhbHVlID0gKHUxNilwb3J0OwotCQlieXRlICY9IDB4ZmQ7CQorCQlieXRlICY9IDB4ZmQ7CiAJfSBlbHNlCiAJCWJ5dGUgfD0gMjsKIApAQCAtMTE2LDcgKzExNyw3IEBACiAJYnl0ZSAmPSAweGZlOwogCV9iMCggdmFsdWUgKSA9IGJ5dGU7CiAJb3V0dyggdmFsdWUsIHBvcnQgKTsKLQkKKwogCSpsYXN0X2J5dGUgPSBieXRlOwogfQogCkBAIC0xOTMsMTMgKzE5NCwxMyBAQAogCQkJYy0+YXVkaW9zID0gMTsKIAkJCXN0cmNweSggYy0+bmFtZSwgIkdlbXRlayBQQ0kgUmFkaW8iICk7CiAJCQlyZXR1cm4gMDsKLQkJfSAKKwkJfQogCiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnQgPSBhcmc7CiAKLQkJCWlmICggdC0+dHVuZXIgKSAKKwkJCWlmICggdC0+dHVuZXIgKQogCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCQl0LT5yYW5nZWxvdyA9IEdFTVRFS19QQ0lfUkFOR0VfTE9XOwpAQCAtMjI4LDcgKzIyOSw3IEBACiAJCWNhc2UgVklESU9DU0ZSRVE6CiAJCXsKIAkJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7Ci0JIAorCiAJCQlpZiAoICgqZnJlcSA8IEdFTVRFS19QQ0lfUkFOR0VfTE9XKSB8fAogCQkJICAgICAoKmZyZXEgPiBHRU1URUtfUENJX1JBTkdFX0hJR0gpICkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzOSw5ICsyNDAsOSBAQAogCiAJCQlyZXR1cm4gMDsKIAkJfQotICAKKwogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICphID0gYXJnOwogCiAJCQltZW1zZXQoIGEsIDAsIHNpemVvZiggKmEgKSApOwpAQCAtMjQ5LDE3ICsyNTAsMTcgQEAKIAkJCWEtPnZvbHVtZSA9IDE7CiAJCQlhLT5zdGVwID0gNjU1MzU7CiAJCQlzdHJjcHkoIGEtPm5hbWUsICJSYWRpbyIgKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAogCQljYXNlIFZJRElPQ1NBVURJTzoKIAkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICphID0gYXJnOwogCi0JCQlpZiAoIGEtPmF1ZGlvICkgCisJCQlpZiAoIGEtPmF1ZGlvICkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYgKCBhLT5mbGFncyAmIFZJREVPX0FVRElPX01VVEUgKSAKKwkJCWlmICggYS0+ZmxhZ3MgJiBWSURFT19BVURJT19NVVRFICkKIAkJCQlnZW10ZWtfcGNpX211dGUoIGNhcmQgKTsKIAkJCWVsc2UKIAkJCQlnZW10ZWtfcGNpX3VubXV0ZSggY2FyZCApOwpAQCAtMzIzLDkgKzMyNCw5IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWlmICggcGNpX2VuYWJsZV9kZXZpY2UoIHBjaV9kZXYgKSApIAorCWlmICggcGNpX2VuYWJsZV9kZXZpY2UoIHBjaV9kZXYgKSApCiAJCWdvdG8gZXJyX3BjaTsKLQkKKwogCWNhcmQtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCggcGNpX2RldiwgMCApOwogCWNhcmQtPmxlbmd0aCA9IHBjaV9yZXNvdXJjZV9sZW4oIHBjaV9kZXYsIDAgKTsKIApAQCAtMzM4LDcgKzMzOSw3IEBACiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoIHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fSUQsICZjYXJkLT5tb2RlbCApOwogCiAJcGNpX3NldF9kcnZkYXRhKCBwY2lfZGV2LCBjYXJkICk7Ci0gCisKIAlpZiAoIChkZXZyYWRpbyA9IGttYWxsb2MoIHNpemVvZiggc3RydWN0IHZpZGVvX2RldmljZSApLCBHRlBfS0VSTkVMICkpID09IE5VTEwgKSB7CiAJCXByaW50ayggS0VSTl9FUlIgImdlbXRla19wY2k6IG91dCBvZiBtZW1vcnlcbiIgKTsKIAkJZ290byBlcnJfdmlkZW87CkBAIC0zNTQsNyArMzU1LDcgQEAKIAlkZXZyYWRpby0+cHJpdiA9IGNhcmQ7CiAJZ2VtdGVrX3BjaV9tdXRlKCBjYXJkICk7CiAKLQlwcmludGsoIEtFUk5fSU5GTyAiR2VtdGVrIFBDSSBSYWRpbyAocmV2LiAlZCkgZm91bmQgYXQgMHglMDR4LTB4JTA0eC5cbiIsIAorCXByaW50ayggS0VSTl9JTkZPICJHZW10ZWsgUENJIFJhZGlvIChyZXYuICVkKSBmb3VuZCBhdCAweCUwNHgtMHglMDR4LlxuIiwKIAkJY2FyZC0+Y2hpcHJldiwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pb2Jhc2UgKyBjYXJkLT5sZW5ndGggLSAxICk7CiAKIAlyZXR1cm4gMDsKQEAgLTM2NCw3ICszNjUsNyBAQAogCiBlcnJfcGNpOgogCWtmcmVlKCBjYXJkICk7Ci0JcmV0dXJuIC1FTk9ERVY7ICAgICAgICAKKwlyZXR1cm4gLUVOT0RFVjsKIH0KIAogc3RhdGljIHZvaWQgX19kZXZleGl0IGdlbXRla19wY2lfcmVtb3ZlKCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiApCkBAIC0zNzUsMTIgKzM3NiwxMiBAQAogCWtmcmVlKCBjYXJkLT52aWRlb2RldiApOwogCiAJcmVsZWFzZV9yZWdpb24oIGNhcmQtPmlvYmFzZSwgY2FyZC0+bGVuZ3RoICk7Ci0JCisKIAlpZiAoIG14ICkKIAkJZ2VtdGVrX3BjaV9tdXRlKCBjYXJkICk7CiAKIAlrZnJlZSggY2FyZCApOwotCQorCiAJcGNpX3NldF9kcnZkYXRhKCBwY2lfZGV2LCBOVUxMICk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCmluZGV4IDQ3MTczYmUuLjE2MmYzN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwpAQCAtNiw3ICs2LDcgQEAKICAqIEJlc2lkZXMgdGhlIHByb3RvY29sIGNoYW5nZXMsIHRoaXMgaXMgbW9zdGx5IGEgY29weSBvZjoKICAqCiAgKiAgICBSYWRpb1RyYWNrIElJIGRyaXZlciBmb3IgTGludXggcmFkaW8gc3VwcG9ydCAoQykgMTk5OCBCZW4gUGZhZmYKLSAqIAorICoKICAqICAgIEJhc2VkIG9uIFJhZGlvVHJhY2sgSS9SYWRpb1JldmVhbCAoQykgMTk5NyBNLiBLaXJrd29vZAogICogICAgQ29udmVydGVkIHRvIG5ldyBBUEkgYnkgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KICAqICAgIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cyBieSBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPgpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBjb3B5IHRvL2Zyb20gdXNlcgkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQgCSovCiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIApAQCAtMjksNyArMzAsNyBAQAogI2RlZmluZSBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQgLTEKICNlbmRpZgogCi1zdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX0dFTVRFS19QT1JUOyAKK3N0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fR0VNVEVLX1BPUlQ7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwogCkBAIC00OCw3ICs0OSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGdlbXRla19tdXRlKHN0cnVjdCBnZW10ZWtfZGV2aWNlICpkZXYpCiB7Ci0gICAgICAgIGlmKGRldi0+bXV0ZWQpCisJaWYoZGV2LT5tdXRlZCkKIAkJcmV0dXJuOwogCXNwaW5fbG9jaygmbG9jayk7CiAJb3V0YigweDEwLCBpbyk7CkBAIC05NCwyMCArOTUsMjAgQEAKIAlmcmVxIC89IDEwMDAwMDsKIAogCXNwaW5fbG9jaygmbG9jayk7Ci0JCisKIAkvKiAyIHN0YXJ0IGJpdHMgKi8KIAlvdXRiX3AoMHgwMywgaW8pOwogCXVkZWxheSg1KTsKIAlvdXRiX3AoMHgwNywgaW8pOwogCXVkZWxheSg1KTsKIAotICAgICAgICAvKiAyOCBmcmVxdWVuY3kgYml0cyAobHNiIGZpcnN0KSAqLworCS8qIDI4IGZyZXF1ZW5jeSBiaXRzIChsc2IgZmlyc3QpICovCiAJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCiAJCWlmIChmcmVxICYgKDEgPDwgaSkpCiAJCQlvbmUoKTsKIAkJZWxzZQogCQkJemVybygpOwotICAgICAgICAvKiAzNiB1bmtub3duIGJpdHMgKi8KKwkvKiAzNiB1bmtub3duIGJpdHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykKIAkJemVybygpOwogCW9uZSgpOwpAQCAtMTIzLDcgKzEyNCw3IEBACiAJdWRlbGF5KDUpOwogCiAJc3Bpbl91bmxvY2soJmxvY2spOwotCQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OSw3ICsxNjAsNyBAQAogCQljYXNlIFZJRElPQ0dUVU5FUjoKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLyAKKwkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8KIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCXYtPnJhbmdlbG93PTg3KjE2MDAwOwogCQkJdi0+cmFuZ2VoaWdoPTEwOCoxNjAwMDsKQEAgLTE5MywyNSArMTk0LDI1IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKCp2KSk7CiAJCQl2LT5mbGFnc3w9VklERU9fQVVESU9fTVVUQUJMRTsKIAkJCXYtPnZvbHVtZT0xOwogCQkJdi0+c3RlcD02NTUzNTsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKLQkJCWlmKHYtPmF1ZGlvKSAKKwkJCWlmKHYtPmF1ZGlvKQogCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKSAKKwkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpCiAJCQkJZ2VtdGVrX211dGUocnQpOwogCQkJZWxzZQotCQkJICAgICAgICBnZW10ZWtfdW5tdXRlKHJ0KTsKKwkJCQlnZW10ZWtfdW5tdXRlKHJ0KTsKIAogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTI1NCwxNCArMjU1LDE0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDQsICJnZW10ZWsiKSkgCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgNCwgImdlbXRlayIpKQogCXsKIAkJcHJpbnRrKEtFUk5fRVJSICJnZW10ZWs6IHBvcnQgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgaW8pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWdlbXRla19yYWRpby5wcml2PSZnZW10ZWtfdW5pdDsKLQkKKwogCWlmKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmZ2VtdGVrX3JhZGlvLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpPT0tMSkKIAl7CiAJCXJlbGVhc2VfcmVnaW9uKGlvLCA0KTsKQEAgLTI3NCw3ICsyNzUsNyBAQAogCS8qIHRoaXMgaXMgX21heWJlXyB1bm5lY2Vzc2FyeSAqLwogCW91dGIoMHgwMSwgaW8pOwogCi0gCS8qIG11dGUgY2FyZCAtIHByZXZlbnRzIG5vaXN5IGJvb3R1cHMgKi8KKwkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAJZ2VtdGVrX3VuaXQubXV0ZWQgPSAwOwogCWdlbXRla19tdXRlKCZnZW10ZWtfdW5pdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWFlc3Ryby5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKaW5kZXggMzljMWQ5MS4uZmNmYTZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYWVzdHJvLmMKQEAgLTIsNyArMiw3IEBACiAgKiAoYykgMjAwMCBBLiBUbGFsa2EsIGF0bGthQHBnLmdkYS5wbAogICogTm90ZXMgb24gdGhlIGhhcmR3YXJlCiAgKgotICogICsgRnJlcXVlbmN5IGNvbnRyb2wgaXMgZG9uZSBkaWdpdGFsbHkgCisgKiAgKyBGcmVxdWVuY3kgY29udHJvbCBpcyBkb25lIGRpZ2l0YWxseQogICogICsgTm8gdm9sdW1lIGNvbnRyb2wgLSBvbmx5IG11dGUvdW5tdXRlIC0geW91IGhhdmUgdG8gdXNlIEF1eCBsaW5lIHZvbHVtZQogICogIGNvbnRyb2wgb24gTWFlc3RybyBjYXJkIHRvIHNldCB0aGUgdm9sdW1lCiAgKiAgKyBSYWRpbyBzdGF0dXMgKHR1bmVkL25vdF90dW5lZCBhbmQgc3RlcmVvL21vbm8pIGlzIHZhbGlkIHNvbWUgdGltZSBhZnRlcgpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMDUiCiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogc3RydWN0IHJhZGlvX2RldmljZSB7CiAJdTE2CWlvLAkvKiBiYXNlIG9mIE1hZXN0cm8gY2FyZCByYWRpbyBpbyAoR1BJT19EQVRBKSovCiAJCW11dGVkLAkvKiBWSURFT19BVURJT19NVVRFICovCi0JCXN0ZXJlbywJLyogVklERU9fVFVORVJfU1RFUkVPX09OICovCQorCQlzdGVyZW8sCS8qIFZJREVPX1RVTkVSX1NURVJFT19PTiAqLwogCQl0dW5lZDsJLyogc2lnbmFsIHN0cmVuZ3RoICgwIG9yIDB4ZmZmZikgKi8KIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIH07CkBAIC0xMjIsMTQgKzEyMiwxNCBAQAogCWZvciAobD0yNDtsLS07KSB7CiAJCW91dHcoU1RSX0NMSywgaW8pOwkJLyogSEkgc3RhdGUgKi8KIAkJdWRlbGF5KDIpOwotCQlpZighbCkgCisJCWlmKCFsKQogCQkJZGV2LT50dW5lZCA9IGludyhpbykgJiBTVFJfTU9TVCA/IDAgOiAweGZmZmY7CiAJCW91dHcoMCwgaW8pOwkJCS8qIExPIHN0YXRlICovCiAJCXVkZWxheSgyKTsKIAkJZGF0YSA8PD0gMTsJCQkvKiBzaGlmdCBkYXRhICovCiAJCXJkYXRhID0gaW53KGlvKTsKIAkJaWYoIWwpCi0JCQlkZXYtPnN0ZXJlbyA9ICByZGF0YSAmIFNUUl9NT1NUID8gCisJCQlkZXYtPnN0ZXJlbyA9ICByZGF0YSAmIFNUUl9NT1NUID8KIAkJCTAgOiBWSURFT19UVU5FUl9TVEVSRU9fT047CiAJCWVsc2UKIAkJCWlmKHJkYXRhICYgU1RSX0RBVEEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYwppbmRleCBmMGJmNDdiLi5mOTNkN2FmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKQEAgLTEsMTUgKzEsMTUgQEAKLS8qIAotICogR3VpbGxlbW90IE1heGkgUmFkaW8gRk0gMjAwMCBQQ0kgcmFkaW8gY2FyZCBkcml2ZXIgZm9yIExpbnV4IAorLyoKKyAqIEd1aWxsZW1vdCBNYXhpIFJhZGlvIEZNIDIwMDAgUENJIHJhZGlvIGNhcmQgZHJpdmVyIGZvciBMaW51eAogICogKEMpIDIwMDEgRGltaXRyb21hbm9sYWtpcyBBcG9zdG9sb3MgPGFwZGltQGdyZWNpYW4ubmV0PgogICoKICAqIEJhc2VkIGluIHRoZSByYWRpbyBNYWVzdHJvIFBDSSBkcml2ZXIuIEFjdHVhbGx5IGl0IHVzZXMgdGhlIHNhbWUgY2hpcAogICogZm9yIHJhZGlvIGJ1dCBkaWZmZXJlbnQgcGNpIGNvbnRyb2xsZXIuCiAgKgogICogSSBkaWRuJ3QgaGF2ZSBhbnkgc3BlY3MgSSByZXZlcnNlZCBlbmdpbmVlcmVkIHRoZSBwcm90b2NvbCBmcm9tCi0gKiB0aGUgd2luZG93cyBkcml2ZXIgKHJhZGlvLmRsbCkuIAorICogdGhlIHdpbmRvd3MgZHJpdmVyIChyYWRpby5kbGwpLgogICoKICAqIFRoZSBjYXJkIHVzZXMgdGhlIFRFQTU3NTcgY2hpcCB0aGF0IGluY2x1ZGVzIGEgc2VhcmNoIGZ1bmN0aW9uIGJ1dCBpdAotICogaXMgdXNlbGVzcyBhcyBJIGhhdmVuJ3QgZm91bmQgYW55IHdheSB0byByZWFkIGJhY2sgdGhlIGZyZXF1ZW5jeS4gSWYgCisgKiBpcyB1c2VsZXNzIGFzIEkgaGF2ZW4ndCBmb3VuZCBhbnkgd2F5IHRvIHJlYWQgYmFjayB0aGUgZnJlcXVlbmN5LiBJZgogICogYW55Ym9keSBkb2VzIHBsZWFzZSBtYWlsIG1lLgogICoKICAqIEZvciB0aGUgcGRmIGZpbGUgc2VlOgpAQCAtMjQsNyArMjQsNyBAQAogICogICAgIC0gdGlkaW5nIHVwCiAgKiAgICAgLSByZW1vdmVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGRldmljZXMgYXMgaXQgZGlkbid0IHdvcmsgYW55d2F5CiAgKgotICogQlVHUzogCisgKiBCVUdTOgogICogICAtIGNhcmQgdW5tdXRlcyBpZiB5b3UgY2hhbmdlIGZyZXF1ZW5jeQogICoKICAqLwpAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAvKiB2ZXJzaW9uIDAuNzUgICAgICBTdW4gRmViICA0IDIyOjUxOjI3IEVFVCAyMDAxICovCiAjZGVmaW5lIERSSVZFUl9WRVJTSU9OCSIwLjc1IgpAQCAtODAsNyArODEsNyBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbiAgICAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfb3BlbiwKIAkucmVsZWFzZSAgICAgICAgPSB2aWRlb19leGNsdXNpdmVfcmVsZWFzZSwKLQkuaW9jdGwJICAgICAgICA9IHJhZGlvX2lvY3RsLAorCS5pb2N0bAkJPSByYWRpb19pb2N0bCwKIAkuY29tcGF0X2lvY3RsCT0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgICAgICAgICA9IG5vX2xsc2VlaywKIH07CkBAIC05NywxMSArOTgsMTEgQEAKIHsKIAlfX3UxNglpbywJLyogYmFzZSBvZiByYWRpbyBpbyAqLwogCQltdXRlZCwJLyogVklERU9fQVVESU9fTVVURSAqLwotCQlzdGVyZW8sCS8qIFZJREVPX1RVTkVSX1NURVJFT19PTiAqLwkKKwkJc3RlcmVvLAkvKiBWSURFT19UVU5FUl9TVEVSRU9fT04gKi8KIAkJdHVuZWQ7CS8qIHNpZ25hbCBzdHJlbmd0aCAoMCBvciAweGZmZmYpICovCi0JCQorCiAJdW5zaWduZWQgbG9uZyBmcmVxOwotCQorCiAJc3RydWN0IG11dGV4IGxvY2s7CiB9IHJhZGlvX3VuaXQgPSB7MCwgMCwgMCwgMCwgfTsKIApAQCAtMTE0LDcgKzExNSw3IEBACiAJCQlvdXRiKCAgcG93ZXJ8d3JlbnxkYXRhfGNsayAsaW8pOyB1ZGVsYXkoNCk7CiAJCQlvdXRiKCAgcG93ZXJ8d3JlbnxkYXRhICAgICAsaW8pOyB1ZGVsYXkoNCk7CiAJCX0KLQllbHNlCQorCWVsc2UKIAkJewogCQkJb3V0YiggIHBvd2VyfHdyZW4gICAgICAgICAgLGlvKTsgdWRlbGF5KDQpOwogCQkJb3V0YiggIHBvd2VyfHdyZW58Y2xrICAgICAgLGlvKTsgdWRlbGF5KDQpOwpAQCAtMTMyLDEyICsxMzMsMTIgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGludCBzaTsKIAlpbnQgYmw7Ci0JCisKIAkvKiBURUE1NzU3IHNoaWZ0IHJlZ2lzdGVyIGJpdHMgKHNlZSBwZGYpICovCiAKLQlvdXRiaXQoMCxpbyk7IC8vIDI0ICBzZWFyY2ggCisJb3V0Yml0KDAsaW8pOyAvLyAyNCAgc2VhcmNoCiAJb3V0Yml0KDEsaW8pOyAvLyAyMyAgc2VhcmNoIHVwL2Rvd24KLQkKKwogCW91dGJpdCgwLGlvKTsgLy8gMjIgIHN0ZXJlby9tb25vCiAKIAlvdXRiaXQoMCxpbyk7IC8vIDIxICBiYW5kCkBAIC0xNDUsMjQgKzE0NiwyNCBAQAogCiAJb3V0Yml0KDAsaW8pOyAvLyAxOSAgcG9ydCA/CiAJb3V0Yml0KDAsaW8pOyAvLyAxOCAgcG9ydCA/Ci0JCisKIAlvdXRiaXQoMCxpbyk7IC8vIDE3ICBzZWFyY2ggbGV2ZWwKIAlvdXRiaXQoMCxpbyk7IC8vIDE2ICBzZWFyY2ggbGV2ZWwKLSAKKwogCXNpID0gMHg4MDAwOwogCWZvcihibCA9IDE7IGJsIDw9IDE2IDsgYmwrKykgeyBvdXRiaXQoZGF0YSAmIHNpLGlvKTsgc2kgPj49MTsgfQotCQorCiAJb3V0Yihwb3dlcixpbyk7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X3N0ZXJlbyhfX3UxNiBpbykKLXsJCit7CiAJb3V0Yihwb3dlcixpbyk7IHVkZWxheSg0KTsKIAlyZXR1cm4gIShpbmIoaW8pICYgbW9fc3QpOwogfQogCiBzdGF0aWMgaW50IGdldF90dW5lKF9fdTE2IGlvKQotewkKK3sKIAlvdXRiKHBvd2VyK2Nsayxpbyk7IHVkZWxheSg0KTsKIAlyZXR1cm4gIShpbmIoaW8pICYgbW9fc3QpOwogfQpAQCAtMTc3LDcgKzE3OCw3IEBACiAJc3dpdGNoKGNtZCkgewogCQljYXNlIFZJRElPQ0dDQVA6IHsKIAkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICp2ID0gYXJnOwotCQkJCisKIAkJCW1lbXNldCh2LDAsc2l6ZW9mKCp2KSk7CiAJCQlzdHJjcHkodi0+bmFtZSwgIk1heGkgUmFkaW8gRk0yMDAwIHJhZGlvIik7CiAJCQl2LT50eXBlPVZJRF9UWVBFX1RVTkVSOwpAQCAtMTg2LDIyICsxODcsMjIgQEAKIAkJfQogCQljYXNlIFZJRElPQ0dUVU5FUjogewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwotCQkJCisKIAkJCWlmKHYtPnR1bmVyKQogCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCQorCiAJCQljYXJkLT5zdGVyZW8gPSAweGZmZmYgKiBnZXRfc3RlcmVvKGNhcmQtPmlvKTsKIAkJCWNhcmQtPnR1bmVkID0gMHhmZmZmICogZ2V0X3R1bmUoY2FyZC0+aW8pOwotCQkJCisKIAkJCXYtPmZsYWdzID0gVklERU9fVFVORVJfTE9XIHwgY2FyZC0+c3RlcmVvOwogCQkJdi0+c2lnbmFsID0gY2FyZC0+dHVuZWQ7Ci0JCQkKKwogCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwotCQkJCisKIAkJCXYtPnJhbmdlbG93ID0gRlJFUV9MTzsKIAkJCXYtPnJhbmdlaGlnaCA9IEZSRVFfSEk7CiAJCQl2LT5tb2RlID0gVklERU9fTU9ERV9BVVRPOwotCQkJCisKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU1RVTkVSOiB7CkBAIC0yMTIsMTMgKzIxMywxMyBAQAogCQl9CiAJCWNhc2UgVklESU9DR0ZSRVE6IHsKIAkJCXVuc2lnbmVkIGxvbmcgKmZyZXEgPSBhcmc7Ci0JCQkKKwogCQkJKmZyZXEgPSBjYXJkLT5mcmVxOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTRlJFUTogewogCQkJdW5zaWduZWQgbG9uZyAqZnJlcSA9IGFyZzsKLQkJCQorCiAJCQlpZiAoKmZyZXEgPCBGUkVRX0xPIHx8ICpmcmVxID4gRlJFUV9ISSkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWNhcmQtPmZyZXEgPSAqZnJlcTsKQEAgLTIyNiwxOCArMjI3LDE4IEBACiAJCQltc2xlZXAoMTI1KTsKIAkJCXJldHVybiAwOwogCQl9Ci0JCWNhc2UgVklESU9DR0FVRElPOiB7CQorCQljYXNlIFZJRElPQ0dBVURJTzogewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCxzaXplb2YoKnYpKTsKIAkJCXN0cmNweSh2LT5uYW1lLCAiUmFkaW8iKTsKIAkJCXYtPmZsYWdzPVZJREVPX0FVRElPX01VVEFCTEUgfCBjYXJkLT5tdXRlZDsKIAkJCXYtPm1vZGU9VklERU9fU09VTkRfU1RFUkVPOwotCQkJcmV0dXJuIDA7CQkKKwkJCXJldHVybiAwOwogCQl9Ci0JCQorCiAJCWNhc2UgVklESU9DU0FVRElPOiB7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQkKKwogCQkJaWYodi0+YXVkaW8pCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQljYXJkLT5tdXRlZCA9IHYtPmZsYWdzICYgVklERU9fQVVESU9fTVVURTsKQEAgLTI0OSwxMyArMjUwLDEzIEBACiAJCX0KIAkJY2FzZSBWSURJT0NHVU5JVDogewogCQkJc3RydWN0IHZpZGVvX3VuaXQgKnYgPSBhcmc7Ci0JCQkKKwogCQkJdi0+dmlkZW89VklERU9fTk9fVU5JVDsKIAkJCXYtPnZiaT1WSURFT19OT19VTklUOwogCQkJdi0+cmFkaW89ZGV2LT5taW5vcjsKIAkJCXYtPmF1ZGlvPTA7CiAJCQl2LT50ZWxldGV4dD1WSURFT19OT19VTklUOwotCQkJcmV0dXJuIDA7CQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWRlZmF1bHQ6IHJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQpAQCAtMjY3LDcgKzI2OCw3IEBACiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgcmFkaW9fZGV2aWNlICpjYXJkPWRldi0+cHJpdjsKIAlpbnQgcmV0OwotCQorCiAJbXV0ZXhfbG9jaygmY2FyZC0+bG9jayk7CiAJcmV0ID0gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCByYWRpb19mdW5jdGlvbik7CiAJbXV0ZXhfdW5sb2NrKCZjYXJkLT5sb2NrKTsKQEAgLTI4MiwyMSArMjgzLDIxIEBACiBzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXhpcmFkaW9faW5pdF9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJaWYoIXJlcXVlc3RfcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkgICAgICAgICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgIk1heGkgUmFkaW8gRk0gMjAwMCIpKSB7Ci0JICAgICAgICBwcmludGsoS0VSTl9FUlIgInJhZGlvLW1heGlyYWRpbzogY2FuJ3QgcmVzZXJ2ZSBJL08gcG9ydHNcbiIpOwotCSAgICAgICAgZ290byBlcnJfb3V0OworCQkJICAgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSwgIk1heGkgUmFkaW8gRk0gMjAwMCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAicmFkaW8tbWF4aXJhZGlvOiBjYW4ndCByZXNlcnZlIEkvTyBwb3J0c1xuIik7CisJCWdvdG8gZXJyX291dDsKIAl9CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JICAgICAgICBnb3RvIGVycl9vdXRfZnJlZV9yZWdpb247CisJCWdvdG8gZXJyX291dF9mcmVlX3JlZ2lvbjsKIAogCXJhZGlvX3VuaXQuaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CiAJbXV0ZXhfaW5pdCgmcmFkaW9fdW5pdC5sb2NrKTsKIAltYXhpcmFkaW9fcmFkaW8ucHJpdiA9ICZyYWRpb191bml0OwogCiAJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZtYXhpcmFkaW9fcmFkaW8sIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik9PS0xKSB7Ci0JICAgICAgICBwcmludGsoInJhZGlvLW1heGlyYWRpbzogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlISIpOwotCSAgICAgICAgZ290byBlcnJfb3V0X2ZyZWVfcmVnaW9uOworCQlwcmludGsoInJhZGlvLW1heGlyYWRpbzogY2FuJ3QgcmVnaXN0ZXIgZGV2aWNlISIpOworCQlnb3RvIGVycl9vdXRfZnJlZV9yZWdpb247CiAJfQogCiAJcHJpbnRrKEtFUk5fSU5GTyAicmFkaW8tbWF4aXJhZGlvOiB2ZXJzaW9uICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKaW5kZXggMjhhNDdjOS4uNWI2OGFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKQEAgLTEsNSArMSw1IEBACiAvKiBSYWRpb1RyYWNrIElJIGRyaXZlciBmb3IgTGludXggcmFkaW8gc3VwcG9ydCAoQykgMTk5OCBCZW4gUGZhZmYKLSAqIAorICoKICAqIEJhc2VkIG9uIFJhZGlvVHJhY2sgSS9SYWRpb1JldmVhbCAoQykgMTk5NyBNLiBLaXJrd29vZAogICogQ29udmVydGVkIHRvIG5ldyBBUEkgYnkgQWxhbiBDb3ggPEFsYW4uQ294QGxpbnV4Lm9yZz4KICAqIFZhcmlvdXMgYnVnZml4ZXMgYW5kIGVuaGFuY2VtZW50cyBieSBSdXNzZWxsIEtyb2xsIDxya3JvbGxAZXhwbG9pdHMub3JnPgpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBjb3B5IHRvL2Zyb20gdXNlcgkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUIAkqLwogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAKQEAgLTIyLDcgKzIzLDcgQEAKICNkZWZpbmUgQ09ORklHX1JBRElPX1JUUkFDSzJfUE9SVCAtMQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUOyAKK3N0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHNwaW5sb2NrX3QgbG9jazsKIApAQCAtMzgsNyArMzksNyBAQAogCiBzdGF0aWMgdm9pZCBydF9tdXRlKHN0cnVjdCBydF9kZXZpY2UgKmRldikKIHsKLSAgICAgICAgaWYoZGV2LT5tdXRlZCkKKwlpZihkZXYtPm11dGVkKQogCQlyZXR1cm47CiAJc3Bpbl9sb2NrKCZsb2NrKTsKIAlvdXRiKDEsIGlvKTsKQEAgLTU4LDE0ICs1OSwxNCBAQAogCiBzdGF0aWMgdm9pZCB6ZXJvKHZvaWQpCiB7Ci0gICAgICAgIG91dGJfcCgxLCBpbyk7CisJb3V0Yl9wKDEsIGlvKTsKIAlvdXRiX3AoMywgaW8pOwogCW91dGJfcCgxLCBpbyk7CiB9CiAKIHN0YXRpYyB2b2lkIG9uZSh2b2lkKQogewotICAgICAgICBvdXRiX3AoNSwgaW8pOworCW91dGJfcCg1LCBpbyk7CiAJb3V0Yl9wKDcsIGlvKTsKIAlvdXRiX3AoNSwgaW8pOwogfQpAQCAtNzUsNyArNzYsNyBAQAogCWludCBpOwogCiAJZnJlcSA9IGZyZXEgLyAyMDAgKyA4NTY7Ci0JCisKIAlzcGluX2xvY2soJmxvY2spOwogCiAJb3V0Yl9wKDB4YzgsIGlvKTsKQEAgLTk0LDcgKzk1LDcgQEAKIAlvdXRiX3AoMHhjOCwgaW8pOwogCWlmICghZGV2LT5tdXRlZCkKIAkJb3V0Yl9wKDAsIGlvKTsKLQkJCisKIAlzcGluX3VubG9jaygmbG9jayk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjcsNyArMTI4LDcgQEAKIAkJY2FzZSBWSURJT0NHVFVORVI6CiAJCXsKIAkJCXN0cnVjdCB2aWRlb190dW5lciAqdiA9IGFyZzsKLQkJCWlmKHYtPnR1bmVyKQkvKiBPbmx5IDEgdHVuZXIgKi8gCisJCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl2LT5yYW5nZWxvdz04OCoxNjAwMDsKIAkJCXYtPnJhbmdlaGlnaD0xMDgqMTYwMDA7CkBAIC0xNTksMjUgKzE2MCwyNSBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAkJCW1lbXNldCh2LDAsIHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3N8PVZJREVPX0FVRElPX01VVEFCTEU7CiAJCQl2LT52b2x1bWU9MTsKIAkJCXYtPnN0ZXA9NjU1MzU7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkgCisJCQlpZih2LT5mbGFncyZWSURFT19BVURJT19NVVRFKQogCQkJCXJ0X211dGUocnQpOwogCQkJZWxzZQotCQkJICAgICAgICBydF91bm11dGUocnQpOworCQkJCXJ0X3VubXV0ZShydCk7CiAKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMTksNyArMjIwLDcgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJZb3UgbXVzdCBzZXQgYW4gSS9PIGFkZHJlc3Mgd2l0aCBpbz0weDIwYyBvciBpbz0weDMwY1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCA0LCAicnRyYWNrMiIpKSAKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCA0LCAicnRyYWNrMiIpKQogCXsKIAkJcHJpbnRrKEtFUk5fRVJSICJydHJhY2syOiBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTIyNywxNiArMjI4LDE2IEBACiAKIAlydHJhY2syX3JhZGlvLnByaXY9JnJ0cmFjazJfdW5pdDsKIAotCXNwaW5fbG9ja19pbml0KCZsb2NrKTsJCisJc3Bpbl9sb2NrX2luaXQoJmxvY2spOwogCWlmKHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcnRyYWNrMl9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKT09LTEpCiAJewogCQlyZWxlYXNlX3JlZ2lvbihpbywgNCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkJCisKIAlwcmludGsoS0VSTl9JTkZPICJBSU1TbGFiIFJhZGlvdHJhY2sgSUkgY2FyZCBkcml2ZXIuXG4iKTsKIAotIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCisJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwogCW91dGIoMSwgaW8pOwogCXJ0cmFjazJfdW5pdC5tdXRlZCA9IDE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtaS5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKaW5kZXggNTMwNzNiNC4uZWZlZTZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqICBGcmVxdWVuY3kgY29udHJvbCBpcyBkb25lIGRpZ2l0YWxseSAtLSBpZSBvdXQocG9ydCxlbmNvZGVmcmVxKDk1LjgpKTsKICAqICBObyB2b2x1bWUgY29udHJvbCAtIG9ubHkgbXV0ZS91bm11dGUgLSB5b3UgaGF2ZSB0byB1c2UgbGluZSB2b2x1bWUKICAqICBjb250cm9sIG9uIFNCLXBhcnQgb2YgU0YxNkZNSQotICogIAorICoKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIF9fc2V0dXAJCQkqLwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyCQkqLwpAQCAtMjksMTkgKzMwLDE5IEBACiBzdHJ1Y3QgZm1pX2RldmljZQogewogCWludCBwb3J0OwotICAgICAgICBpbnQgY3Vydm9sOyAvKiAxIG9yIDAgKi8KLSAgICAgICAgdW5zaWduZWQgbG9uZyBjdXJmcmVxOyAvKiBmcmVxIGluIGtIeiAqLwotICAgICAgICBfX3UzMiBmbGFnczsKKwlpbnQgY3Vydm9sOyAvKiAxIG9yIDAgKi8KKwl1bnNpZ25lZCBsb25nIGN1cmZyZXE7IC8qIGZyZXEgaW4ga0h6ICovCisJX191MzIgZmxhZ3M7CiB9OwogCi1zdGF0aWMgaW50IGlvID0gLTE7IAorc3RhdGljIGludCBpbyA9IC0xOwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwogc3RhdGljIHN0cnVjdCBwbnBfZGV2ICpkZXYgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBtdXRleCBsb2NrOwogCiAvKiBmcmVxIGlzIGluIDEvMTYga0h6IHRvIGludGVybmFsIG51bWJlciwgaHcgcHJlY2lzaW9uIGlzIDUwIGtIeiAqLwogLyogSXQgaXMgb25seSB1c2VmdWwgdG8gZ2l2ZSBmcmVxIGluIGludGVydmFsbCBvZiA4MDAgKD0wLjA1TWh6KSwKLSAqIG90aGVyIGJpdHMgd2lsbCBiZSB0cnVuY2F0ZWQsIGUuZyA5Mi43NDAwMDE2IC0+IDkyLjcsIGJ1dCAKKyAqIG90aGVyIGJpdHMgd2lsbCBiZSB0cnVuY2F0ZWQsIGUuZyA5Mi43NDAwMDE2IC0+IDkyLjcsIGJ1dAogICogOTIuNzQwMDAxNyAtPiA5Mi43NQogICovCiAjZGVmaW5lIFJTRjE2X0VOQ09ERSh4KQkoKHgpLzgwMCsyMTQpCkBAIC01MSw3ICs1Miw3IEBACiBzdGF0aWMgdm9pZCBvdXRiaXRzKGludCBiaXRzLCB1bnNpZ25lZCBpbnQgZGF0YSwgaW50IHBvcnQpCiB7CiAJd2hpbGUoYml0cy0tKSB7Ci0gCQlpZihkYXRhICYgMSkgeworCQlpZihkYXRhICYgMSkgewogCQkJb3V0Yig1LCBwb3J0KTsKIAkJCXVkZWxheSg2KTsKIAkJCW91dGIoNywgcG9ydCk7CkBAIC0xMDEsNyArMTAyLDcgQEAKIAlpbnQgcmVzOwogCWludCBteXBvcnQgPSBkZXYtPnBvcnQ7CiAKLQkKKwogCW11dGV4X2xvY2soJmxvY2spOwogCXZhbCA9IGRldi0+Y3Vydm9sID8gMHgwOCA6IDB4MDA7CS8qIHVubXV0ZS9tdXRlICovCiAJb3V0Yih2YWwsIG15cG9ydCk7CkBAIC0xMDksNyArMTEwLDcgQEAKIAltc2xlZXAoMTQzKTsgCQkvKiB3YXMgc2NoZWR1bGVfdGltZW91dChIWi83KSAqLwogCXJlcyA9IChpbnQpaW5iKG15cG9ydCsxKTsKIAlvdXRiKHZhbCwgbXlwb3J0KTsKLQkKKwogCW11dGV4X3VubG9jaygmbG9jayk7CiAJcmV0dXJuIChyZXMgJiAyKSA/IDAgOiAweEZGRkY7CiB9CkBAIC0xMTksNyArMTIwLDcgQEAKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBmbWlfZGV2aWNlICpmbWk9ZGV2LT5wcml2OwotCQorCiAJc3dpdGNoKGNtZCkKIAl7CiAJCWNhc2UgVklESU9DR0NBUDoKQEAgLTE3NCwxOCArMTc1LDE4IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkvKnJvdW5kaW5nIGluIHN0ZXBzIG9mIDgwMCB0byBtYXRjaCB0aCBmcmVxCiAJCQkgIHRoYXQgd2lsbCBiZSB1c2VkICovCi0JCQlmbWktPmN1cmZyZXEgPSAoKmZyZXEvODAwKSo4MDA7IAorCQkJZm1pLT5jdXJmcmVxID0gKCpmcmVxLzgwMCkqODAwOwogCQkJZm1pX3NldGZyZXEoZm1pKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DR0FVRElPOgotCQl7CQorCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CiAJCQltZW1zZXQodiwwLHNpemVvZigqdikpOwogCQkJdi0+ZmxhZ3M9KCAoIWZtaS0+Y3Vydm9sKSpWSURFT19BVURJT19NVVRFIHwgVklERU9fQVVESU9fTVVUQUJMRSk7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7CiAJCQl2LT5tb2RlPVZJREVPX1NPVU5EX1NURVJFTzsKLQkJCXJldHVybiAwOwkJCQorCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NTQVVESU86CiAJCXsKQEAgLTE5MywxOSArMTk0LDE5IEBACiAJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCWZtaS0+Y3Vydm9sPSB2LT5mbGFncyZWSURFT19BVURJT19NVVRFID8gMCA6IDE7Ci0JCQlmbWktPmN1cnZvbCA/IAorCQkJZm1pLT5jdXJ2b2wgPwogCQkJCWZtaV91bm11dGUoZm1pLT5wb3J0KSA6IGZtaV9tdXRlKGZtaS0+cG9ydCk7CiAJCQlyZXR1cm4gMDsKIAkJfQotCSAgICAgICAgY2FzZSBWSURJT0NHVU5JVDoKKwkJY2FzZSBWSURJT0NHVU5JVDoKIAkJewotICAgICAgICAgICAgICAgCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdiA9IGFyZzsKKwkJCXN0cnVjdCB2aWRlb191bml0ICp2ID0gYXJnOwogCQkJdi0+dmlkZW89VklERU9fTk9fVU5JVDsKIAkJCXYtPnZiaT1WSURFT19OT19VTklUOwogCQkJdi0+cmFkaW89ZGV2LT5taW5vcjsKIAkJCXYtPmF1ZGlvPTA7IC8qIEhvdyBkbyB3ZSBmaW5kIG91dCB0aGlzPz8/ICovCiAJCQl2LT50ZWxldGV4dD1WSURFT19OT19VTklUOwotCQkJcmV0dXJuIDA7CQkJCisJCQlyZXR1cm4gMDsKIAkJfQogCQlkZWZhdWx0OgogCQkJcmV0dXJuIC1FTk9JT0NUTENNRDsKQEAgLTI5NSwxNCArMjk2LDE0IEBACiAJZm1pX3VuaXQuY3VyZnJlcSA9IDA7CiAJZm1pX3VuaXQuZmxhZ3MgPSBWSURFT19UVU5FUl9MT1c7CiAJZm1pX3JhZGlvLnByaXYgPSAmZm1pX3VuaXQ7Ci0JCisKIAltdXRleF9pbml0KCZsb2NrKTsKLQkKKwogCWlmICh2aWRlb19yZWdpc3Rlcl9kZXZpY2UoJmZtaV9yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKSA9PSAtMSkgewogCQlyZWxlYXNlX3JlZ2lvbihpbywgMik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQkJCisKIAlwcmludGsoS0VSTl9JTkZPICJTRjE2Rk14IHJhZGlvIGNhcmQgZHJpdmVyIGF0IDB4JXhcbiIsIGlvKTsKIAkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAJZm1pX211dGUoaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCmluZGV4IGJjZWJkOGMuLjM0ODNiMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMJCSovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiBzdGF0aWMgc3RydWN0IG11dGV4IGxvY2s7CkBAIC0yMDIsNyArMjAzLDcgQEAKIH0KIAogc3RhdGljIGludCBmbXIyX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7CiAJc3RydWN0IGZtcjJfZGV2aWNlICpmbXIyID0gZGV2LT5wcml2OwpAQCAtMzQ0LDcgKzM0NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZm1yMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKKwkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiAgewogCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIGZtcjJfZG9faW9jdGwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCmluZGV4IGZjZmRlMmUuLmRmYmE0YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKQEAgLTIsMTEgKzIsMTEgQEAKICAqIChjKSAxOTk5IFIuIE9mZmVybWFubnMgKHJvbGZAb2ZmZXJtYW5ucy5kZSkKICAqIGJhc2VkIG9uIHRoZSBhaW1zbGFiIHJhZGlvIGRyaXZlciBmcm9tIE0uIEtpcmt3b29kCiAgKiBtYW55IHRoYW5rcyB0byBNaWNoYWVsIEJlY2tlciBhbmQgRnJpZWRoZWxtIEJpcnRoIChmcm9tIFRlcnJhVGVjKQotICogCisgKgogICoKICAqIEhpc3Rvcnk6CiAgKiAxOTk5LTA1LTIxCUZpcnN0IHByZXZpZXcgcmVsZWFzZQotICogCisgKgogICogIE5vdGVzIG9uIHRoZSBoYXJkd2FyZToKICAqICBUaGVyZSBhcmUgdHdvICJtYWluIiBjaGlwcyBvbiB0aGUgY2FyZDoKICAqICAtIFBoaWxpcHMgT001NjEwIChodHRwOi8vd3d3LXVzLnNlbWljb25kdWN0b3JzLnBoaWxpcHMuY29tL2Fjcm9iYXQvZGF0YXNoZWV0cy9PTTU2MTBfMi5wZGYpCkBAIC0yMCw3ICsyMCw3IEBACiAgKiAgKGFzIHNvb24gaSBoYXZlIHVuZGVyc3RhbmQgaG93IHRvIGdldCBzdGFydGVkIDopCiAgKiAgSWYgeW91IGNhbiBoZWxwIG1lIG91dCB3aXRoIHRoYXQsIHBsZWFzZSBjb250YWN0IG1lISEKICAqCi0gKiAgCisgKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogTW9kdWxlcyAJCQkqLwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgkvKiBjb3B5IHRvL2Zyb20gdXNlcgkJKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgkvKiBDT05GSUdfUkFESU9fVEVSUkFURUNfUE9SVCAJKi8KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCkBAIC00OSw3ICs1MCw3IEBACiAjZGVmaW5lIFdSVF9FTgkJMHgxMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fVEVSUkFURUNfUE9SVDsgCitzdGF0aWMgaW50IGlvID0gQ09ORklHX1JBRElPX1RFUlJBVEVDX1BPUlQ7CiBzdGF0aWMgaW50IHJhZGlvX25yID0gLTE7CiBzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOwogCkBAIC04OCwxNSArODksMTUgQEAKIAogc3RhdGljIGludCB0dF9zZXR2b2woc3RydWN0IHR0X2RldmljZSAqZGV2LCBpbnQgdm9sKQogewotCQorCiAvLwlwcmludGsoS0VSTl9FUlIgInNldHZvbCBjYWxsZWQsIHZvbCA9ICVkXG4iLCB2b2wpOwogCiAJaWYodm9sID09IGRldi0+Y3Vydm9sKSB7CS8qIHJlcXVlc3RlZCB2b2x1bWUgPSBjdXJyZW50ICovCiAJCWlmIChkZXYtPm11dGVkKSB7CS8qIHVzZXIgaXMgdW5tdXRpbmcgdGhlIGNhcmQgICovCiAJCQlkZXYtPm11dGVkID0gMDsKIAkJCWNhcmRXcml0ZVZvbCh2b2wpOwkvKiBlbmFibGUgY2FyZCAqLwotCQl9CQotCQorCQl9CisKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDcsOSArMTA4LDkgQEAKIAl9CiAKIAlkZXYtPm11dGVkID0gMDsKLQkKKwogCWNhcmRXcml0ZVZvbCh2b2wpOwotCSAKKwogCWRldi0+Y3Vydm9sID0gdm9sOwogCiAJcmV0dXJuIDA7CkBAIC0xMjEsMTMgKzEyMiwxMyBAQAogLyogbWFueSBtb3JlIG9yIGxlc3Mgc3RyYW5nZSB0aGluZ3MgYXJlIGdvaW5nIG9uIGhlcmUsIGJ1dCBoZXksIGl0IHdvcmtzIDopICovCiAKIHN0YXRpYyBpbnQgdHRfc2V0ZnJlcShzdHJ1Y3QgdHRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgZnJlcTEpCi17CQorewogCWludCBmcmVxOwogCWludCBpOwogCWludCBwOwogCWludCAgdGVtcDsKIAlsb25nIHJlc3Q7Ci0gICAgIAorCiAJdW5zaWduZWQgY2hhciBidWZmZXJbMjVdOwkJLyogd2UgaGF2ZSB0byBiaXQgc2hpZnQgMjUgcmVnaXN0ZXJzICovCiAJZnJlcSA9IGZyZXExLzE2MDsJCQkvKiBjb252ZXJ0IHRoZSBmcmVxLiB0byBhIG5pY2UgdG8gaGFuZGxlIHZhbHVlICovCiAJZm9yKGk9MjQ7aT4tMTtpLS0pCkBAIC0xNDIsOSArMTQzLDkgQEAKIAl7CiAJCWlmIChyZXN0JXRlbXAgID09IHJlc3QpCiAJCQlidWZmZXJbaV0gPSAwOwotCQllbHNlIAorCQllbHNlCiAJCXsKLQkJCWJ1ZmZlcltpXSA9IDE7IAorCQkJYnVmZmVyW2ldID0gMTsKIAkJCXJlc3QgPSByZXN0LXRlbXA7CiAJCX0KIAkJaS0tOwpAQCAtMTUzLDEwICsxNTQsMTAgQEAKICAgICAgICB9CiAKIAlzcGluX2xvY2soJmxvY2spOwotCQorCiAJZm9yIChpPTI0O2k+LTE7aS0tKQkJCS8qIGJpdCBzaGlmdCB0aGUgdmFsdWVzIHRvIHRoZSByYWRpb2NhcmQgKi8KIAl7Ci0JCWlmIChidWZmZXJbaV09PTEpIAorCQlpZiAoYnVmZmVyW2ldPT0xKQogCQl7CiAJCQlvdXRiKFdSVF9FTnxEQVRBLCBCQVNFUE9SVCk7CiAJCQlvdXRiKFdSVF9FTnxEQVRBfENMS19PTiAgLCBCQVNFUE9SVCk7CkBAIC0xNjgsMTEgKzE2OSwxMSBAQAogCQkJb3V0YihXUlRfRU58MHgwMHxDTEtfT04gICwgQkFTRVBPUlQpOwogCQl9CiAJfQotCW91dGIoMHgwMCwgQkFTRVBPUlQpOyAgICAgCi0JCisJb3V0YigweDAwLCBCQVNFUE9SVCk7CisKIAlzcGluX3VubG9jaygmbG9jayk7Ci0gIAotICAJcmV0dXJuIDA7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB0dF9nZXRzaWdzdHIoc3RydWN0IHR0X2RldmljZSAqZGV2KQkJLyogVE9ETyAqLwpAQCAtMTkwLDcgKzE5MSw3IEBACiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgdHRfZGV2aWNlICp0dD1kZXYtPnByaXY7Ci0JCisKIAlzd2l0Y2goY21kKQogCXsKIAkJY2FzZSBWSURJT0NHQ0FQOgpAQCAtMjA2LDcgKzIwNyw3IEBACiAJCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7Ci0JCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovIAorCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJdi0+cmFuZ2Vsb3c9KDg3KjE2MDAwKTsKIAkJCXYtPnJhbmdlaGlnaD0oMTA4KjE2MDAwKTsKQEAgLTIzOCwyMSArMjM5LDIxIEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ0dBVURJTzoKLQkJewkKKwkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKCp2KSk7CiAJCQl2LT5mbGFnc3w9VklERU9fQVVESU9fTVVUQUJMRXxWSURFT19BVURJT19WT0xVTUU7CiAJCQl2LT52b2x1bWU9dHQtPmN1cnZvbCAqIDY1NTQ7CiAJCQl2LT5zdGVwPTY1NTQ7CiAJCQlzdHJjcHkodi0+bmFtZSwgIlJhZGlvIik7Ci0JCQlyZXR1cm4gMDsJCQkKKwkJCXJldHVybiAwOwogCQl9CiAJCWNhc2UgVklESU9DU0FVRElPOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlmKHYtPmZsYWdzJlZJREVPX0FVRElPX01VVEUpIAorCQkJaWYodi0+ZmxhZ3MmVklERU9fQVVESU9fTVVURSkKIAkJCQl0dF9tdXRlKHR0KTsKIAkJCWVsc2UKIAkJCQl0dF9zZXR2b2wodHQsdi0+dm9sdW1lLzY1NTQpOwpAQCAtMjk2LDI1ICsyOTcsMjUgQEAKIAkJcHJpbnRrKEtFUk5fRVJSICJZb3UgbXVzdCBzZXQgYW4gSS9PIGFkZHJlc3Mgd2l0aCBpbz0weD8/P1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAyLCAidGVycmF0ZWMiKSkgCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgMiwgInRlcnJhdGVjIikpCiAJewogCQlwcmludGsoS0VSTl9FUlIgIlRlcnJhVGVjOiBwb3J0IDB4JXggYWxyZWFkeSBpbiB1c2VcbiIsIGlvKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAl0ZXJyYXRlY19yYWRpby5wcml2PSZ0ZXJyYXRlY191bml0OwotCQorCiAJc3Bpbl9sb2NrX2luaXQoJmxvY2spOwotCQorCiAJaWYodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ0ZXJyYXRlY19yYWRpbywgVkZMX1RZUEVfUkFESU8sIHJhZGlvX25yKT09LTEpCiAJewogCQlyZWxlYXNlX3JlZ2lvbihpbywyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCQkKKwogCXByaW50ayhLRVJOX0lORk8gIlRFUlJBVEVDIEFjdGl2UmFkaW8gU3RhbmRhbG9uZSBjYXJkIGRyaXZlci5cbiIpOwogCi0gCS8qIG11dGUgY2FyZCAtIHByZXZlbnRzIG5vaXN5IGJvb3R1cHMgKi8KKwkvKiBtdXRlIGNhcmQgLSBwcmV2ZW50cyBub2lzeSBib290dXBzICovCiAKIAkvKiB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgdm9sdW1lIGlzIGFsbCB0aGUgd2F5IGRvd24gICovCiAJY2FyZFdyaXRlVm9sKDApOwpAQCAtMzM0LDcgKzMzNSw3IEBACiB7CiAJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnRlcnJhdGVjX3JhZGlvKTsKIAlyZWxlYXNlX3JlZ2lvbihpbywyKTsKLQlwcmludGsoS0VSTl9JTkZPICJURVJSQVRFQyBBY3RpdlJhZGlvIFN0YW5kYWxvbmUgY2FyZCBkcml2ZXIgdW5sb2FkZWQuXG4iKTsJCisJcHJpbnRrKEtFUk5fSU5GTyAiVEVSUkFURUMgQWN0aXZSYWRpbyBTdGFuZGFsb25lIGNhcmQgZHJpdmVyIHVubG9hZGVkLlxuIik7CiB9CiAKIG1vZHVsZV9pbml0KHRlcnJhdGVjX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCmluZGV4IDVhMDk5YTUuLjhkYTRiYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKQEAgLTEsMTQgKzEsMTQgQEAKLS8qIHJhZGlvLXRydXN0LmMgLSBUcnVzdCBGTSBSYWRpbyBjYXJkIGRyaXZlciBmb3IgTGludXggMi4yIAorLyogcmFkaW8tdHJ1c3QuYyAtIFRydXN0IEZNIFJhZGlvIGNhcmQgZHJpdmVyIGZvciBMaW51eCAyLjIKICAqIGJ5IEVyaWMgTGFtbWVydHMgPGVyaWNAc2NpbnRpbGxhLnV0d2VudGUubmw+CiAgKgogICogQmFzZWQgb24gcmFkaW8tYXp0ZWNoLmMuIE9yaWdpbmFsIG5vdGVzOgogICoKLSAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieSAKKyAqIEFkYXB0ZWQgdG8gc3VwcG9ydCB0aGUgVmlkZW8gZm9yIExpbnV4IEFQSSBieQogICogUnVzc2VsbCBLcm9sbCA8cmtyb2xsQGV4cGxvaXRzLm9yZz4uICBCYXNlZCBvbiBvcmlnaW5hbCB0dW5lciBjb2RlIGJ5OgogICoKICAqIFF1YXkgTHkKICAqIERvbmFsZCBTb25nCi0gKiBKYXNvbiBMZXdpcyAgICAgIChqbGV3aXNAdHdpbGlnaHQudnRjLnZzYy5lZHUpIAorICogSmFzb24gTGV3aXMgICAgICAoamxld2lzQHR3aWxpZ2h0LnZ0Yy52c2MuZWR1KQogICogU2NvdHQgTWNHcmF0aCAgICAoc21jZ3JhdGhAdHdpbGlnaHQudnRjLnZzYy5lZHUpCiAgKiBXaWxsaWFtIE1jR3JhdGggICh3bWNncmF0aEB0d2lsaWdodC52dGMudnNjLmVkdSkKICAqCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIENPTkZJR19SQURJT19UUlVTVF9QT1JUIAkqLwogCiAvKiBhY2NlcHRhYmxlIHBvcnRzOiAweDM1MCAoSlAzIHNob3J0ZWQpLCAweDM1OCAoSlAzIG9wZW4pICovCkBAIC0zMCw3ICszMSw3IEBACiAjZGVmaW5lIENPTkZJR19SQURJT19UUlVTVF9QT1JUIC0xCiAjZW5kaWYKIAotc3RhdGljIGludCBpbyA9IENPTkZJR19SQURJT19UUlVTVF9QT1JUOyAKK3N0YXRpYyBpbnQgaW8gPSBDT05GSUdfUkFESU9fVFJVU1RfUE9SVDsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIHN0YXRpYyBpbnQgaW92YWwgPSAweGY7CiBzdGF0aWMgX191MTYgY3Vydm9sOwpAQCAtMTM1LDcgKzEzNiw3IEBACiBzdGF0aWMgaW50IHRyX2dldHNpZ3N0cih2b2lkKQogewogCWludCBpLCB2OwotCQorCiAJZm9yKGkgPSAwLCB2ID0gMDsgaSA8IDEwMDsgaSsrKSB2IHw9IGluYihpbyk7CiAJcmV0dXJuICh2ICYgMSk/IDAgOiAweGZmZmY7CiB9CkBAIC0xNzUsNyArMTc2LDcgQEAKIAkJewogCQkJc3RydWN0IHZpZGVvX3R1bmVyICp2ID0gYXJnOwogCi0JCQlpZih2LT50dW5lcikJLyogT25seSAxIHR1bmVyICovIAorCQkJaWYodi0+dHVuZXIpCS8qIE9ubHkgMSB0dW5lciAqLwogCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCQl2LT5yYW5nZWxvdyA9IDg3NTAwICogMTY7CkBAIC0yMTEsMjggKzIxMiwyOCBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJY2FzZSBWSURJT0NHQVVESU86Ci0JCXsJCisJCXsKIAkJCXN0cnVjdCB2aWRlb19hdWRpbyAqdiA9IGFyZzsKIAogCQkJbWVtc2V0KHYsMCwgc2l6ZW9mKCp2KSk7CiAJCQl2LT5mbGFncyA9IFZJREVPX0FVRElPX01VVEFCTEUgfCBWSURFT19BVURJT19WT0xVTUUgfAotCQkJICAgICAgICAgIFZJREVPX0FVRElPX0JBU1MgfCBWSURFT19BVURJT19UUkVCTEU7CisJCQkJICBWSURFT19BVURJT19CQVNTIHwgVklERU9fQVVESU9fVFJFQkxFOwogCQkJdi0+bW9kZSA9IGN1cnN0ZXJlbz8gVklERU9fU09VTkRfU1RFUkVPIDogVklERU9fU09VTkRfTU9OTzsKIAkJCXYtPnZvbHVtZSA9IGN1cnZvbCAqIDIwNDg7CiAJCQl2LT5zdGVwID0gMjA0ODsKIAkJCXYtPmJhc3MgPSBjdXJiYXNzICogNDM3MDsKIAkJCXYtPnRyZWJsZSA9IGN1cnRyZWJsZSAqIDQzNzA7Ci0JCQkKKwogCQkJc3RyY3B5KHYtPm5hbWUsICJUcnVzdCBGTSBSYWRpbyIpOwotCQkJcmV0dXJuIDA7CQkJCisJCQlyZXR1cm4gMDsKIAkJfQogCQljYXNlIFZJRElPQ1NBVURJTzoKIAkJewogCQkJc3RydWN0IHZpZGVvX2F1ZGlvICp2ID0gYXJnOwogCi0JCQlpZih2LT5hdWRpbykgCisJCQlpZih2LT5hdWRpbykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCXRyX3NldHZvbCh2LT52b2x1bWUpOwkJCQkJCisJCQl0cl9zZXR2b2wodi0+dm9sdW1lKTsKIAkJCXRyX3NldGJhc3Modi0+YmFzcyk7CiAJCQl0cl9zZXR0cmVibGUodi0+dHJlYmxlKTsKIAkJCXRyX3NldHN0ZXJlbyh2LT5tb2RlICYgVklERU9fU09VTkRfU1RFUkVPKTsKQEAgLTI5Miw3ICsyOTMsNyBAQAogCXdyaXRlX2kyYygyLCBUREE3MzE4X0FERFIsIDB4ZTApOwkvKiBzcGVha2VyIGF0dC4gUlIgPSAwIGRCICovCiAJd3JpdGVfaTJjKDIsIFREQTczMThfQUREUiwgMHg0MCk7CS8qIHN0ZXJlbyAxIGlucHV0LCBnYWluID0gMTguNzUgZEIgKi8KIAotCXRyX3NldHZvbCgweDgwMDApOwkJCQkJCisJdHJfc2V0dm9sKDB4ODAwMCk7CiAJdHJfc2V0YmFzcygweDgwMDApOwogCXRyX3NldHRyZWJsZSgweDgwMDApOwogCXRyX3NldHN0ZXJlbygxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10eXBob29uLmMKaW5kZXggZTUwOTU1OC4uZWRkMDEyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10eXBob29uLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10eXBob29uLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4JCS8qIG91dGIsIG91dGJfcCAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CS8qIGNvcHkgdG8vZnJvbSB1c2VyICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzICAgICAgICAgICAqLworI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CS8qIENPTkZJR19SQURJT19UWVBIT09OXyogICAgICAgICAqLwogCiAjZGVmaW5lIEJBTk5FUiAiVHlwaG9vbiBSYWRpbyBDYXJkIGRyaXZlciB2MC4xXG4iCkBAIC0zNjEsOCArMzYyLDggQEAKIAogI2lmZGVmIENPTkZJR19SQURJT19UWVBIT09OX1BST0NfRlMKIAlpZiAoIWNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImRyaXZlci9yYWRpby10eXBob29uIiwgMCwgTlVMTCwKLQkJCQkgICAgdHlwaG9vbl9nZXRfaW5mbykpIAotCSAgICAJcHJpbnRrKEtFUk5fRVJSICJyYWRpby10eXBob29uOiByZWdpc3RlcmluZyAvcHJvYy9kcml2ZXIvcmFkaW8tdHlwaG9vbiBmYWlsZWRcbiIpOworCQkJCSAgICB0eXBob29uX2dldF9pbmZvKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby10eXBob29uOiByZWdpc3RlcmluZyAvcHJvYy9kcml2ZXIvcmFkaW8tdHlwaG9vbiBmYWlsZWRcbiIpOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKaW5kZXggN2JmMWE0Mi4uNTliODZhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKQEAgLTEsNyArMSw3IEBACiAvKiB6b2x0cml4IHJhZGlvIHBsdXMgZHJpdmVyIGZvciBMaW51eCByYWRpbyBzdXBwb3J0CiAgKiAoYykgMTk5OCBDLiB2YW4gU2NoYWlrIDxjYXJsQGxlZy51Y3QuYWMuemE+CiAgKgotICogQlVHUyAgCisgKiBCVUdTCiAgKiAgRHVlIHRvIHRoZSBpbmNvbnNpc3RlbmN5IGluIHJlYWRpbmcgZnJvbSB0aGUgc2lnbmFsIGZsYWdzCiAgKiAgaXQgaXMgZGlmZmljdWx0IHRvIGdldCBhbiBhY2N1cmF0ZSB0dW5lZCBzaWduYWwuCiAgKgpAQCAtMTQsNyArMTQsNyBAQAogICoKICAqIDE5OTktMDUtMDYgLSAoQy4gdmFuIFNjaGFpaykKICAqCSAgICAgIC0gTWFrZSBzaWduYWwgc3RyZW5ndGggYW5kIHN0ZXJlbyBzY2FucwotICoJICAgICAgICBraW5kZXIgdG8gY3B1IHdoaWxlIGluIGRlbGF5CisgKgkJa2luZGVyIHRvIGNwdSB3aGlsZSBpbiBkZWxheQogICogMTk5OS0wMS0wNSAtIChDLiB2YW4gU2NoYWlrKQogICoJICAgICAgLSBDaGFuZ2VkIHR1bmluZyB0byAxLzE2ME1oeiBhY2N1cmFjeQogICoJICAgICAgLSBBZGRlZCBzdGVyZW8gc3VwcG9ydApAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wICAgICAgICAgICAgICAgICAgICovCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4JLyogY29weSB0by9mcm9tIHVzZXIgICAgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMgICAgICAgICAgICovCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogQ09ORklHX1JBRElPX1pPTFRSSVhfUE9SVCAgICAgICovCiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1pPTFRSSVhfUE9SVApAQCAtMTA1LDcgKzEwNiw3IEBACiAJaSA9IDQ1OwogCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQkKKwogCW91dGIoMCwgaW8pOwogCW91dGIoMCwgaW8pOwogCWluYihpbyArIDMpOyAgICAgICAgICAgIC8qIFpvbHRyaXggbmVlZHMgdG8gYmUgcmVhZCB0byBjb25maXJtICovCkBAIC0xMzksOCArMTQwLDggQEAKIAl1ZGVsYXkoMTAwMCk7CiAJaW5iKGlvKzIpOwogCi0gICAgICAgIHVkZWxheSgxMDAwKTsKLSAgICAgICAgCisJdWRlbGF5KDEwMDApOworCiAJaWYgKGRldi0+bXV0ZWQpCiAJewogCQlvdXRiKDAsIGlvKTsKQEAgLTE0OCwxMiArMTQ5LDEyIEBACiAJCWluYihpbyArIDMpOwogCQl1ZGVsYXkoMTAwMCk7CiAJfQotCQorCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQorCiAJaWYoIWRldi0+bXV0ZWQpCiAJewotCSAgICAgICAgem9sX3NldHZvbChkZXYsIGRldi0+Y3Vydm9sKTsKKwkJem9sX3NldHZvbChkZXYsIGRldi0+Y3Vydm9sKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNzQsMTQgKzE3NSwxNCBAQAogCWIgPSBpbmIoaW8pOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQorCiAJaWYgKGEgIT0gYikKIAkJcmV0dXJuICgwKTsKIAotICAgICAgICBpZiAoKGEgPT0gMHhjZikgfHwgKGEgPT0gMHhkZikgIC8qIEkgZm91bmQgdGhpcyBvdXQgYnkgcGxheWluZyAqLworCWlmICgoYSA9PSAweGNmKSB8fCAoYSA9PSAweGRmKSAgLyogSSBmb3VuZCB0aGlzIG91dCBieSBwbGF5aW5nICovCiAJCXx8IChhID09IDB4ZWYpKSAgICAgICAvKiB3aXRoIGEgYmluYXJ5IHNjYW5uZXIgb24gdGhlIGNhcmQgaW8gKi8KIAkJcmV0dXJuICgxKTsKLSAJcmV0dXJuICgwKTsKKwlyZXR1cm4gKDApOwogfQogCiBzdGF0aWMgaW50IHpvbF9pc19zdGVyZW8gKHN0cnVjdCB6b2xfZGV2aWNlICpkZXYpCkBAIC0xODksNyArMTkwLDcgQEAKIAlpbnQgeDEsIHgyOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKLQkKKwogCW91dGIoMHgwMCwgaW8pOwogCW91dGIoZGV2LT5jdXJ2b2wsIGlvKTsKIAltc2xlZXAoMjApOwpAQCAtMTk5LDcgKzIwMCw3IEBACiAJeDIgPSBpbmIoaW8pOwogCiAJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOwotCQorCiAJaWYgKCh4MSA9PSB4MikgJiYgKHgxID09IDB4Y2YpKQogCQlyZXR1cm4gMTsKIAlyZXR1cm4gMDsKQEAgLTIyNiw3ICsyMjcsNyBAQAogCWNhc2UgVklESU9DR1RVTkVSOgogCQl7CiAJCQlzdHJ1Y3QgdmlkZW9fdHVuZXIgKnYgPSBhcmc7Ci0JCQlpZiAodi0+dHVuZXIpCQorCQkJaWYgKHYtPnR1bmVyKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJc3RyY3B5KHYtPm5hbWUsICJGTSIpOwogCQkJdi0+cmFuZ2Vsb3cgPSAoaW50KSAoODguMCAqIDE2MDAwKTsKQEAgLTM1MSw3ICszNTIsNyBAQAogCXByaW50ayhLRVJOX0lORk8gIlpvbHRyaXggUmFkaW8gUGx1cyBjYXJkIGRyaXZlci5cbiIpOwogCiAJbXV0ZXhfaW5pdCgmem9sdHJpeF91bml0LmxvY2spOwotCQorCiAJLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwogCiAJLyogdGhpcyBlbnN1cmVzIHRoYXQgdGhlIHZvbHVtZSBpcyBhbGwgdGhlIHdheSBkb3duICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCmluZGV4IDZiNDE5NzAuLjgyNGE2M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKQEAgLTIyNCw2ICsyMjQsMTIgQEAKIAkgIHN1cHBvcnQgZm9yIHRoZSBMaW51eCBNZWRpYSBMYWJzIExNTDMzUjEwIE1KUEVHIGNhcHR1cmUvcGxheWJhY2sKIAkgIGNhcmQuCiAKK2NvbmZpZyBWSURFT19aT1JBTl9BVlM2RVlFUworCXRyaXN0YXRlICJBdmVyTWVkaWEgNiBFeWVzIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBWSURFT19aT1JBTiAmJiBFWFBFUklNRU5UQUwgJiYgVklERU9fVjRMMQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBBdmVyTWVkaWEgNiBFeWVzIHZpZGVvIHN1cnZlaWxsYW5jZSBjYXJkLgorCiBjb25maWcgVklERU9fWlIzNjEyMAogCXRyaXN0YXRlICJab3JhbiBaUjM2MTIwLzM2MTI1IFZpZGVvIEZvciBMaW51eCIKIAlkZXBlbmRzIG9uIFBDSSAmJiBJMkMgJiYgVklERU9fVjRMMSAmJiBCUk9LRU4KQEAgLTMwNiwxNyArMzEyLDYgQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZyIKIAotY29uZmlnIFZJREVPX09WQ0FNQ0hJUAotCXRyaXN0YXRlICJPbW5pVmlzaW9uIENhbWVyYSBDaGlwIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBJMkMgJiYgVklERU9fVjRMMQotCS0tLWhlbHAtLS0KLQkgIFN1cHBvcnQgZm9yIHRoZSBPbW5pVmlzaW9uIE9WNnh4eCBhbmQgT1Y3eHh4IHNlcmllcyBvZiBjYW1lcmEgY2hpcHMuCi0JICBUaGlzIGRyaXZlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG92NTExIGFuZCB3OTk2OGNmIFVTQgotCSAgY2FtZXJhIGRyaXZlcnMuCi0KLQkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQotCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG92Y2FtY2hpcC4KLQogY29uZmlnIFZJREVPX00zMlJfQVIKIAl0cmlzdGF0ZSAiQVIgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIE0zMlIgJiYgVklERU9fVjRMMQpAQCAtMzU3LDYgKzM1MiwxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY3M1M2wzMmEuCiAKK2NvbmZpZyBWSURFT19UTFYzMjBBSUMyM0IKKwl0cmlzdGF0ZSAiVGV4YXMgSW5zdHJ1bWVudHMgVExWMzIwQUlDMjNCIGF1ZGlvIGNvZGVjIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgVGV4YXMgSW5zdHJ1bWVudHMgVExWMzIwQUlDMjNCIGF1ZGlvIGNvZGVjLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0bHYzMjBhaWMyM2IuCisKIGNvbmZpZyBWSURFT19XTTg3NzUKIAl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODc3NSBhdWRpbyBBREMgd2l0aCBpbnB1dCBtaXhlciIKIAlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMgJiYgRVhQRVJJTUVOVEFMCkBAIC0zODAsMTAgKzM4NCwxMCBAQAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvS2NvbmZpZyIKIAogY29uZmlnIFZJREVPX1NBQTcxMVgKLQl0cmlzdGF0ZSAiUGhpbGlwcyBTQUE3MTEzLzQvNSB2aWRlbyBkZWNvZGVycyAoT0JTT0xFVEVEKSIKLQlkZXBlbmRzIG9uIFZJREVPX1Y0TDEgJiYgSTJDICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJQaGlsaXBzIFNBQTcxMTMvNC81IHZpZGVvIGRlY29kZXJzIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIEkyQyAmJiBFWFBFUklNRU5UQUwKIAktLS1oZWxwLS0tCi0JICBPbGQgc3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgU0FBNzExMy80IHZpZGVvIGRlY29kZXJzLgorCSAgU3VwcG9ydCBmb3IgdGhlIFBoaWxpcHMgU0FBNzExMy80LzUgdmlkZW8gZGVjb2RlcnMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNhYTcxMTUuCkBAIC00NDcsNiArNDUxLDM1IEBACiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9LY29uZmlnIgogCitjb25maWcgVklERU9fT1ZDQU1DSElQCisJdHJpc3RhdGUgIk9tbmlWaXNpb24gQ2FtZXJhIENoaXAgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwxCisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgdGhlIE9tbmlWaXNpb24gT1Y2eHh4IGFuZCBPVjd4eHggc2VyaWVzIG9mIGNhbWVyYSBjaGlwcy4KKwkgIFRoaXMgZHJpdmVyIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUgb3Y1MTEgYW5kIHc5OTY4Y2YgVVNCCisJICBjYW1lcmEgZHJpdmVycy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgb3ZjYW1jaGlwLgorCitjb25maWcgVVNCX1c5OTY4Q0YKKwl0cmlzdGF0ZSAiVVNCIFc5OTZbODddQ0YgSlBFRyBEdWFsIE1vZGUgQ2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fVjRMMSAmJiBJMkMKKwlzZWxlY3QgVklERU9fT1ZDQU1DSElQCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBjYW1lcmFzIGJhc2VkIG9uIE9WNjgxIG9yCisJICBXaW5ib25kIFc5OTY3Q0YvVzk5NjhDRiBKUEVHIFVTQiBEdWFsIE1vZGUgQ2FtZXJhIENoaXBzLgorCisJICBUaGlzIGRyaXZlciBoYXMgYW4gb3B0aW9uYWwgcGx1Z2luLCB3aGljaCBpcyBkaXN0cmlidXRlZCBhcyBhCisJICBzZXBhcmF0ZSBtb2R1bGUgb25seSAocmVsZWFzZWQgdW5kZXIgR1BMKS4gSXQgYWxsb3dzIHRvIHVzZSBoaWdoZXIKKwkgIHJlc29sdXRpb25zIGFuZCBmcmFtZXJhdGVzLCBidXQgY2Fubm90IGJlIGluY2x1ZGVkIGluIHRoZSBvZmZpY2lhbAorCSAgTGludXgga2VybmVsIGZvciBwZXJmb3JtYW5jZSBwdXJwb3Nlcy4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdmlkZW80bGludXgvdzk5NjhjZi50eHQ+IGZvciBtb3JlIGluZm8uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHc5OTY4Y2YuCisKIGNvbmZpZyBVU0JfT1Y1MTEKIAl0cmlzdGF0ZSAiVVNCIE9WNTExIENhbWVyYSBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEKQEAgLTQ4MywyNCArNTE2LDYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN0djY4MC4KIAotY29uZmlnIFVTQl9XOTk2OENGCi0JdHJpc3RhdGUgIlVTQiBXOTk2Wzg3XUNGIEpQRUcgRHVhbCBNb2RlIENhbWVyYSBzdXBwb3J0IgotCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX1Y0TDEgJiYgSTJDCi0Jc2VsZWN0IFZJREVPX09WQ0FNQ0hJUAotCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiBPVjY4MSBvcgotCSAgV2luYm9uZCBXOTk2N0NGL1c5OTY4Q0YgSlBFRyBVU0IgRHVhbCBNb2RlIENhbWVyYSBDaGlwcy4KLQotCSAgVGhpcyBkcml2ZXIgaGFzIGFuIG9wdGlvbmFsIHBsdWdpbiwgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgYXMgYQotCSAgc2VwYXJhdGUgbW9kdWxlIG9ubHkgKHJlbGVhc2VkIHVuZGVyIEdQTCkuIEl0IGFsbG93cyB0byB1c2UgaGlnaGVyCi0JICByZXNvbHV0aW9ucyBhbmQgZnJhbWVyYXRlcywgYnV0IGNhbm5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb2ZmaWNpYWwKLQkgIExpbnV4IGtlcm5lbCBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMuCi0KLQkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3c5OTY4Y2YudHh0PiBmb3IgbW9yZSBpbmZvLgotCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKLQkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB3OTk2OGNmLgotCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCmluZGV4IGU1YmYyNjguLjZjNDAxYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIHpyMzYwNjctb2Jqcwk6PQl6b3Jhbl9wcm9jZnMubyB6b3Jhbl9kZXZpY2UubyBcCiAJCQl6b3Jhbl9kcml2ZXIubyB6b3Jhbl9jYXJkLm8KIHR1bmVyLW9ianMJOj0JdHVuZXItY29yZS5vIHR1bmVyLXR5cGVzLm8gdHVuZXItc2ltcGxlLm8gXAotCQkJbXQyMHh4Lm8gdGRhODI5MC5vIHRlYTU3NjcubworCQkJbXQyMHh4Lm8gdGRhODI5MC5vIHRlYTU3NjcubyB0ZGE5ODg3Lm8KIAogbXNwMzQwMC1vYmpzCTo9CW1zcDM0MDAtZHJpdmVyLm8gbXNwMzQwMC1rdGhyZWFkcy5vCiAKQEAgLTMzLDYgKzMzLDcgQEAKIAl6cjM2MDE2Lm8KIG9iai0kKENPTkZJR19WSURFT19aT1JBTl9MTUwzMykgKz0gYnQ4MTkubyBidDg1Ni5vIHpyMzYwNjAubwogb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX0xNTDMzUjEwKSArPSBzYWE3MTE0Lm8gYWR2NzE3MC5vIHpyMzYwNjAubworb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOX0FWUzZFWUVTKSArPSBidDg2Ni5vIGtzMDEyNy5vIHpyMzYwNjAubwogb2JqLSQoQ09ORklHX1ZJREVPX1pPUkFOKSArPSB6cjM2MDY3Lm8gdmlkZW9jb2RlYy5vCiBvYmotJChDT05GSUdfVklERU9fUE1TKSArPSBwbXMubwogb2JqLSQoQ09ORklHX1ZJREVPX1BMQU5CKSArPSBwbGFuYi5vCkBAIC00OCw2ICs0OSw3IEBACiBvYmotJChDT05GSUdfVklERU9fRU0yOFhYKSArPSB0dnA1MTUwLm8KIG9iai0kKENPTkZJR19WSURFT19NU1AzNDAwKSArPSBtc3AzNDAwLm8KIG9iai0kKENPTkZJR19WSURFT19DUzUzTDMyQSkgKz0gY3M1M2wzMmEubworb2JqLSQoQ09ORklHX1ZJREVPX1RMVjMyMEFJQzIzQikgKz0gdGx2MzIwYWljMjNiLm8KIG9iai0kKENPTkZJR19WSURFT19XTTg3NzUpICs9IHdtODc3NS5vCiBvYmotJChDT05GSUdfVklERU9fV004NzM5KSArPSB3bTg3Mzkubwogb2JqLSQoQ09ORklHX1ZJREVPX09WQ0FNQ0hJUCkgKz0gb3ZjYW1jaGlwLwpAQCAtNTgsNyArNjAsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0RQQykgKz0gc2FhNzExMS5vIGRwYzcxNDYubwogb2JqLSQoQ09ORklHX1RVTkVSXzMwMzYpICs9IHR1bmVyLTMwMzYubwogCi1vYmotJChDT05GSUdfVklERU9fVFVORVIpICs9IHR1bmVyLm8gdGRhOTg4Ny5vCitvYmotJChDT05GSUdfVklERU9fVFVORVIpICs9IHR1bmVyLm8KIG9iai0kKENPTkZJR19WSURFT19CVUYpICAgKz0gdmlkZW8tYnVmLm8KIG9iai0kKENPTkZJR19WSURFT19CVUZfRFZCKSArPSB2aWRlby1idWYtZHZiLm8KIG9iai0kKENPTkZJR19WSURFT19CVENYKSAgKz0gYnRjeC1yaXNjLm8KQEAgLTcxLDYgKzczLDcgQEAKIG9iai0kKENPTkZJR19WSURFT19TQUE3MTI3KSArPSBzYWE3MTI3Lm8KIG9iai0kKENPTkZJR19WSURFT19VUEQ2NDAzMUEpICs9IHVwZDY0MDMxYS5vCiBvYmotJChDT05GSUdfVklERU9fVVBENjQwODMpICs9IHVwZDY0MDgzLm8KK29iai0kKENPTkZJR19WSURFT19DWDIzNDFYKSArPSBjeDIzNDF4Lm8KIAogb2JqLSQoQ09ORklHX1VTQl9EQUJVU0IpICAgICAgICArPSBkYWJ1c2Iubwogb2JqLSQoQ09ORklHX1VTQl9EU0JSKSAgICAgICAgICArPSBkc2JyMTAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCmluZGV4IGRiZTAyNTEuLjZlMDhlMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yMTIsNyArMjEzLDcgQEAKIAlhcl9vdXRsKDB4MDMwMCwgUExESTJDTU9EKTsgCS8qIEkyQ01PRCBBQ0svOGItZGF0YS83Yi1hZGRyL2F1dG8gKi8KIAlhcl9vdXRsKDB4MSwgUExESTJDQUNLKTsJLyogSTJDQUNLIEFDSyAgICAgICAgICAgICAgICAgICAgICAqLwogCi0gICAgCS8qIEkyQyBDTEsgKi8KKwkvKiBJMkMgQ0xLICovCiAJLyogNTBNSC0xMDBrICovCiAJaWYgKGZyZXEgPT0gNzUpIHsKIAkJYXJfb3V0bCgzNjksIFBMREkyQ0ZSRVEpOwkvKiBCQ0xLID0gNzVNSHogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NjYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4NjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWU0MmJiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDg2Ni5jCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICAgIGJ0ODY2IC0gQlQ4NjYgRGlnaXRhbCBWaWRlbyBFbmNvZGVyIChSb2Nrd2VsbCBQYXJ0KQorCisgICAgQ29weXJpZ2h0IChDKSAxOTk5IE1pa2UgQmVybnNvbiA8bWlrZUBtbGIub3JnPgorICAgIENvcHlyaWdodCAoQykgMTk5OCBEYXZlIFBlcmtzIDxkcGVya3NAaWJtLm5ldD4KKworICAgIE1vZGlmaWNhdGlvbnMgZm9yIExNTDMzL0RDMTBwbHVzIHVuaWZpZWQgZHJpdmVyCisgICAgQ29weXJpZ2h0IChDKSAyMDAwIFNlcmd1ZWkgTWlyaWRvbm92IDxtaXJzZXZAY2ljZXNlLm14PgorCisgICAgVGhpcyBjb2RlIHdhcyBtb2RpZnkvcG9ydGVkIGZyb20gdGhlIHNhYTcxMTEgZHJpdmVyIHdyaXR0ZW4KKyAgICBieSBEYXZlIFBlcmtzLgorCisgICAgVGhpcyBjb2RlIHdhcyBhZGFwdGVkIGZvciB0aGUgYnQ4NjYgYnkgQ2hyaXN0ZXIgV2VpbmlnZWwgYW5kIHBvcnRlZAorICAgIHRvIDIuNiBieSBNYXJ0aW4gU2FtdWVsc3Nvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC92aWRlb19lbmNvZGVyLmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2RlZmluZQlCVDg2Nl9ERVZOQU1FCSJidDg2NiIKKyNkZWZpbmUgSTJDX0JUODY2CTB4ODgKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIERFQlVHKHgpCQkvKiBEZWJ1ZyBkcml2ZXIgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGJ0ODY2IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjOworCWludCBhZGRyOworCXVuc2lnbmVkIGNoYXIgcmVnWzEyOF07CisKKwlpbnQgbm9ybTsKKwlpbnQgZW5hYmxlOworCWludCBicmlnaHQ7CisJaW50IGNvbnRyYXN0OworCWludCBodWU7CisJaW50IHNhdDsKK307CisKK3N0YXRpYyBpbnQgYnQ4NjZfd3JpdGUoc3RydWN0IGJ0ODY2ICpkZXYsCisJCQl1bnNpZ25lZCBjaGFyIHN1YmFkZHIsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisKK3N0YXRpYyBpbnQgYnQ4NjZfZG9fY29tbWFuZChzdHJ1Y3QgYnQ4NjYgKmVuY29kZXIsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEVOQ09ERVJfR0VUX0NBUEFCSUxJVElFUzoKKwl7CisJCXN0cnVjdCB2aWRlb19lbmNvZGVyX2NhcGFiaWxpdHkgKmNhcCA9IGFyZzsKKworCQlERUJVRyhwcmludGsKKwkJICAgICAgKEtFUk5fSU5GTyAiJXM6IGdldCBjYXBhYmlsaXRpZXNcbiIsCisJCSAgICAgICBlbmNvZGVyLT5pMmMtPm5hbWUpKTsKKworCQljYXAtPmZsYWdzCisJCQk9IFZJREVPX0VOQ09ERVJfUEFMCisJCQl8IFZJREVPX0VOQ09ERVJfTlRTQworCQkJfCBWSURFT19FTkNPREVSX0NDSVI7CisJCWNhcC0+aW5wdXRzID0gMjsKKwkJY2FwLT5vdXRwdXRzID0gMTsKKwl9CisJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfU0VUX05PUk06CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldCBub3JtICVkXG4iLAorCQkJICAgICBlbmNvZGVyLT5pMmMtPm5hbWUsICppYXJnKSk7CisKKwkJc3dpdGNoICgqaWFyZykgeworCisJCWNhc2UgVklERU9fTU9ERV9OVFNDOgorCQkJYnJlYWs7CisKKwkJY2FzZSBWSURFT19NT0RFX1BBTDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJCWVuY29kZXItPm5vcm0gPSAqaWFyZzsKKwl9CisJYnJlYWs7CisKKwljYXNlIEVOQ09ERVJfU0VUX0lOUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlzdGF0aWMgY29uc3QgX191OCBpbml0W10gPSB7CisJCQkweGM4LCAweGNjLCAvKiBDUlNDQUxFICovCisJCQkweGNhLCAweDkxLCAvKiBDQlNDQUxFICovCisJCQkweGNjLCAweDI0LCAvKiBZQzE2IHwgT1NETlVNICovCisJCQkweGRhLCAweDAwLCAvKiAgKi8KKwkJCTB4ZGMsIDB4MjQsIC8qIFNFVE1PREUgfCBQQUwgKi8KKwkJCTB4ZGUsIDB4MDIsIC8qIEVBQ1RJVkUgKi8KKworCQkJLyogb3ZlcmxheSBjb2xvcnMgKi8KKwkJCTB4NzAsIDB4RUIsIDB4OTAsIDB4ODAsIDB4QjAsIDB4ODAsIC8qIHdoaXRlICovCisJCQkweDcyLCAweEEyLCAweDkyLCAweDhFLCAweEIyLCAweDJDLCAvKiB5ZWxsb3cgKi8KKwkJCTB4NzQsIDB4ODMsIDB4OTQsIDB4MkMsIDB4QjQsIDB4OUMsIC8qIGN5YW4gKi8KKwkJCTB4NzYsIDB4NzAsIDB4OTYsIDB4M0EsIDB4QjYsIDB4NDgsIC8qIGdyZWVuICovCisJCQkweDc4LCAweDU0LCAweDk4LCAweEM2LCAweEI4LCAweEI4LCAvKiBtYWdlbnRhICovCisJCQkweDdBLCAweDQxLCAweDlBLCAweEQ0LCAweEJBLCAweDY0LCAvKiByZWQgKi8KKwkJCTB4N0MsIDB4MjMsIDB4OUMsIDB4NzIsIDB4QkMsIDB4RDQsIC8qIGJsdWUgKi8KKwkJCTB4N0UsIDB4MTAsIDB4OUUsIDB4ODAsIDB4QkUsIDB4ODAsIC8qIGJsYWNrICovCisKKwkJCTB4NjAsIDB4RUIsIDB4ODAsIDB4ODAsIDB4YzAsIDB4ODAsIC8qIHdoaXRlICovCisJCQkweDYyLCAweEEyLCAweDgyLCAweDhFLCAweGMyLCAweDJDLCAvKiB5ZWxsb3cgKi8KKwkJCTB4NjQsIDB4ODMsIDB4ODQsIDB4MkMsIDB4YzQsIDB4OUMsIC8qIGN5YW4gKi8KKwkJCTB4NjYsIDB4NzAsIDB4ODYsIDB4M0EsIDB4YzYsIDB4NDgsIC8qIGdyZWVuICovCisJCQkweDY4LCAweDU0LCAweDg4LCAweEM2LCAweGM4LCAweEI4LCAvKiBtYWdlbnRhICovCisJCQkweDZBLCAweDQxLCAweDhBLCAweEQ0LCAweGNBLCAweDY0LCAvKiByZWQgKi8KKwkJCTB4NkMsIDB4MjMsIDB4OEMsIDB4NzIsIDB4Y0MsIDB4RDQsIC8qIGJsdWUgKi8KKwkJCTB4NkUsIDB4MTAsIDB4OEUsIDB4ODAsIDB4Y0UsIDB4ODAsIC8qIGJsYWNrICovCisJCX07CisJCWludCBpOworCQl1OCB2YWw7CisKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdCkgLyAyOyBpICs9IDIpCisJCQlidDg2Nl93cml0ZShlbmNvZGVyLCBpbml0W2ldLCBpbml0W2krMV0pOworCisJCXZhbCA9IGVuY29kZXItPnJlZ1sweGRjXTsKKworCQlpZiAoKmlhcmcgPT0gMCkKKwkJCXZhbCB8PSAweDQwOyAvKiBDQlNXQVAgKi8KKwkJZWxzZQorCQkJdmFsICY9IH4weDQwOyAvKiAhQ0JTV0FQICovCisKKwkJYnQ4NjZfd3JpdGUoZW5jb2RlciwgMHhkYywgdmFsKTsKKworCQl2YWwgPSBlbmNvZGVyLT5yZWdbMHhjY107CisJCWlmICgqaWFyZyA9PSAyKQorCQkJdmFsIHw9IDB4MDE7IC8qIE9TREJBUiAqLworCQllbHNlCisJCQl2YWwgJj0gfjB4MDE7IC8qICFPU0RCQVIgKi8KKwkJYnQ4NjZfd3JpdGUoZW5jb2RlciwgMHhjYywgdmFsKTsKKworCQlERUJVRyhwcmludGsoS0VSTl9JTkZPICIlczogc2V0IGlucHV0ICVkXG4iLAorCQkJICAgICBlbmNvZGVyLT5pMmMtPm5hbWUsICppYXJnKSk7CisKKwkJc3dpdGNoICgqaWFyZykgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9CisJfQorCWJyZWFrOworCisJY2FzZSBFTkNPREVSX1NFVF9PVVRQVVQ6CisJeworCQlpbnQgKmlhcmcgPSBhcmc7CisKKwkJREVCVUcocHJpbnRrKEtFUk5fSU5GTyAiJXM6IHNldCBvdXRwdXQgJWRcbiIsCisJCQkgICAgIGVuY29kZXItPmkyYy0+bmFtZSwgKmlhcmcpKTsKKworCQkvKiBub3QgbXVjaCBjaG9pY2Ugb2Ygb3V0cHV0cyAqLworCQlpZiAoKmlhcmcgIT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlicmVhazsKKworCWNhc2UgRU5DT0RFUl9FTkFCTEVfT1VUUFVUOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQllbmNvZGVyLT5lbmFibGUgPSAhISppYXJnOworCisJCURFQlVHKHByaW50aworCQkgICAgICAoS0VSTl9JTkZPICIlczogZW5hYmxlIG91dHB1dCAlZFxuIiwKKwkJICAgICAgIGVuY29kZXItPmkyYy0+bmFtZSwgZW5jb2Rlci0+ZW5hYmxlKSk7CisJfQorCWJyZWFrOworCisJY2FzZSA0NzExOgorCXsKKwkJaW50ICppYXJnID0gYXJnOworCQlfX3U4IHZhbDsKKworCQlwcmludGsoImJ0ODY2OiBzcXVhcmUgPSAlZFxuIiwgKmlhcmcpOworCisJCXZhbCA9IGVuY29kZXItPnJlZ1sweGRjXTsKKwkJaWYgKCppYXJnKQorCQkJdmFsIHw9IDE7IC8qIFNRVUFSRSAqLworCQllbHNlCisJCQl2YWwgJj0gfjE7IC8qICFTUVVBUkUgKi8KKwkJYnQ4NjZfd3JpdGUoZW5jb2RlciwgMHhkYywgdmFsKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4NjZfd3JpdGUoc3RydWN0IGJ0ODY2ICplbmNvZGVyLAorCQkJdW5zaWduZWQgY2hhciBzdWJhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciBidWZmZXJbMl07CisJaW50IGVycjsKKworCWJ1ZmZlclswXSA9IHN1YmFkZHI7CisJYnVmZmVyWzFdID0gZGF0YTsKKworCWVuY29kZXItPnJlZ1tzdWJhZGRyXSA9IGRhdGE7CisKKwlERUJVRyhwcmludGsKKwkgICAgICAoIiVzOiB3cml0ZSAweCUwMlggPSAweCUwMlhcbiIsCisJICAgICAgIGVuY29kZXItPmkyYy0+bmFtZSwgc3ViYWRkciwgZGF0YSkpOworCisJZm9yIChlcnIgPSAwOyBlcnIgPCAzOykgeworCQlpZiAoaTJjX21hc3Rlcl9zZW5kKGVuY29kZXItPmkyYywgYnVmZmVyLCAyKSA9PSAyKQorCQkJYnJlYWs7CisJCWVycisrOworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogSS9PIGVycm9yICMlZCAiCisJCSAgICAgICAiKHdyaXRlIDB4JTAyeC8weCUwMngpXG4iLAorCQkgICAgICAgZW5jb2Rlci0+aTJjLT5uYW1lLCBlcnIsIGVuY29kZXItPmFkZHIsIHN1YmFkZHIpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFovMTApOworCX0KKwlpZiAoZXJyID09IDMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGdpdmluZyB1cFxuIiwKKwkJICAgICAgIGVuY29kZXItPmkyYy0+bmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidDg2Nl9hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgYnQ4NjZfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIGludCBidDg2Nl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXQk9IHtJMkNfQlQ4NjY+PjEsIEkyQ19DTElFTlRfRU5EfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBwcm9iZVsyXQkJPSB7STJDX0NMSUVOVF9FTkQsIEkyQ19DTElFTlRfRU5EfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpZ25vcmVbMl0JCT0ge0kyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH07CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudF9hZGRyZXNzX2RhdGEgYWRkcl9kYXRhID0geworCW5vcm1hbF9pMmMsCisJcHJvYmUsCisJaWdub3JlLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXJfYnQ4NjYgPSB7CisJLmRyaXZlci5uYW1lID0gQlQ4NjZfREVWTkFNRSwKKwkuaWQgPSBJMkNfRFJJVkVSSURfQlQ4NjYsCisJLmF0dGFjaF9hZGFwdGVyID0gYnQ4NjZfYXR0YWNoLAorCS5kZXRhY2hfY2xpZW50ID0gYnQ4NjZfZGV0YWNoLAorCS5jb21tYW5kID0gYnQ4NjZfY29tbWFuZAorfTsKKworCitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgYnQ4NjZfY2xpZW50X3RtcGwgPQoreworCS5uYW1lID0gIihuaWwpIiwKKwkuYWRkciA9IDAsCisJLmFkYXB0ZXIgPSBOVUxMLAorCS5kcml2ZXIgPSAmaTJjX2RyaXZlcl9idDg2NiwKKwkudXNhZ2VfY291bnQgPSAwCit9OworCitzdGF0aWMgaW50IGJ0ODY2X2ZvdW5kX3Byb2Moc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLAorCQkJICAgIGludCBhZGRyLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgYnQ4NjYgKmVuY29kZXI7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCWNsaWVudCA9IGt6YWxsb2Moc2l6ZW9mKCpjbGllbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2xpZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShjbGllbnQsICZidDg2Nl9jbGllbnRfdG1wbCwgc2l6ZW9mKCpjbGllbnQpKTsKKworCWVuY29kZXIgPSBremFsbG9jKHNpemVvZigqZW5jb2RlciksIEdGUF9LRVJORUwpOworCWlmIChlbmNvZGVyID09IE5VTEwpIHsKKwkJa2ZyZWUoY2xpZW50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZW5jb2Rlcik7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmFkZHIgPSBhZGRyOworCXNwcmludGYoY2xpZW50LT5uYW1lLCAiJXMtJTAyeCIsIEJUODY2X0RFVk5BTUUsIGFkYXB0ZXItPmlkKTsKKworCWVuY29kZXItPmkyYyA9IGNsaWVudDsKKwllbmNvZGVyLT5hZGRyID0gYWRkcjsKKwkvL2VuY29kZXItPmVuY29kZXJfdHlwZSA9IEVOQ09ERVJfVFlQRV9VTktOT1dOOworCisJLyogaW5pdGlhbGl6ZSAqLworCisJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ0ODY2X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKGFkYXB0ZXItPmlkID09IEkyQ19IV19CX1pSMzYwNjcpCisJCXJldHVybiBpMmNfcHJvYmUoYWRhcHRlciwgJmFkZHJfZGF0YSwgYnQ4NjZfZm91bmRfcHJvYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnQ4NjZfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGJ0ODY2ICplbmNvZGVyID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpOworCWtmcmVlKGVuY29kZXIpOworCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidDg2Nl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBidDg2NiAqZW5jb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXJldHVybiBidDg2Nl9kb19jb21tYW5kKGVuY29kZXIsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYnQ4NjZfaW5pdCh2b2lkKQoreworCWkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyX2J0ODY2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGJ0ODY2X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaTJjX2RyaXZlcl9idDg2Nik7Cit9CisKK21vZHVsZV9pbml0KGJ0ODY2X2luaXQpOworbW9kdWxlX2V4aXQoYnQ4NjZfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCmluZGV4IDJiNjRhYTguLjMxMTYzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAl7IDB4NDFhMGEwNTEsIEJUVFZfQk9BUkRfRkxZVklERU9fOThGTSwgIkxpZmV2aWV3IEZseVZpZGVvIDk4IExSNTAgUmV2IFEiIH0sCiAJeyAweDE4NTAxZjdmLCBCVFRWX0JPQVJEX0ZMWVZJREVPXzk4LCAgICJMaWZldmlldyBGbHl2aWRlbyA5OCIgfSwKIAotICAgIAl7IDB4MDEwMTE1Y2IsIEJUVFZfQk9BUkRfR01WMSwgICAgICAgICAgIkFHIEdNVjEiIH0sCisJeyAweDAxMDExNWNiLCBCVFRWX0JPQVJEX0dNVjEsICAgICAgICAgICJBRyBHTVYxIiB9LAogCXsgMHgwMTAxMTRjNywgQlRUVl9CT0FSRF9NT0RURUNfMjA1LCAgICAiTW9kdWxhciBUZWNobm9sb2d5IE1NMjAxL01NMjAyL01NMjA1L01NMjEwL01NMjE1IFBDVFYiIH0sCiAKIAl7IDB4MTBiNDI2MzYsIEJUVFZfQk9BUkRfSEFVUFBBVUdFODc4LCAgIlNUQiA/Pz8iIH0sCkBAIC0zMDksNiArMzA5LDcgQEAKIAl7IDB4MDc2MTE0NjEsIEJUVFZfQk9BUkRfQVZEVkJUXzc2MSwgICAgIkF2ZXJNZWRpYSBBdmVyVFYgRFZCLVQgNzYxIiB9LAogCXsgMHhkYjEwMThhYywgQlRUVl9CT0FSRF9EVklDT19EVkJUX0xJVEUsICAgICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIExpdGUiIH0sCiAJeyAweGQ1MDAxOGFjLCBCVFRWX0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9MSVRFLCAgICAiRFZpQ08gRnVzaW9uSERUViA1IExpdGUiIH0sCisJeyAweDAwMjYxODIyLCBCVFRWX0JPQVJEX1RXSU5IQU5fRFNULAkiRE5UViBMaXZlISBNaW5pICJ9LAogCiAJeyAwLCAtMSwgTlVMTCB9CiB9OwpAQCAtMTkwMyw3ICsxOTA0LDcgQEAKIAkJLm5vX3RkYTc0MzIgICAgID0gMSwKIAl9LAogCVtCVFRWX0JPQVJEX09TUFJFWTJ4MF0gPSB7Ci0JCS5uYW1lICAgICAgICAgICA9ICJPc3ByZXkgMjEwLzIyMCIsICAgLyogMHgxKEF8QiktMDRDMC1DMSAqLworCQkubmFtZSAgICAgICAgICAgPSAiT3NwcmV5IDIxMC8yMjAvMjMwIiwgICAvKiAweDEoQXxCKS0wNEMwLUMxICovCiAJCS52aWRlb19pbnB1dHMgICA9IDIsCiAJCS5hdWRpb19pbnB1dHMgICA9IDEsCiAJCS50dW5lciAgICAgICAgICA9IC0xLApAQCAtMjc0NSw3ICsyNzQ2LDcgQEAKIAkJLyogTWljaGFlbCBLcnVma3kgPG1rcnVma3lAbTFrLm5ldD4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgNSBMaXRlIiwKIAkJLnR1bmVyICAgICAgICAgID0gMCwKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDYyRiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDZYRiwgLyogVERWUy1IMDY0RiAqLwogCQkudHVuZXJfYWRkcgk9IEFERFJfVU5TRVQsCiAJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCiAJCS52aWRlb19pbnB1dHMgICA9IDMsCkBAIC0yNzYyLDcgKzI3NjMsNyBAQAogCX0sCiAJCS8qIC0tLS0gY2FyZCAweDg4LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCVtCVFRWX0JPQVJEX0FDT1JQX1k4NzhGXSA9IHsKLQkJLyogTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPiAqLworCQkvKiBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4gKi8KIAkJLm5hbWUJCT0gIkFjb3JwIFk4NzhGIiwKIAkJLnZpZGVvX2lucHV0cwk9IDMsCiAJCS5hdWRpb19pbnB1dHMJPSAxLApAQCAtMzc5MCw2ICszNzkxLDcgQEAKIAkJICAgICAgIGJyZWFrOwogCSAgICAgICBjYXNlIDB4MDA2MDoKIAkgICAgICAgY2FzZSAweDAwNzA6CisJICAgICAgIGNhc2UgMHgwMEEwOgogCQkgICAgICAgYnR2LT5jLnR5cGUgPSBCVFRWX0JPQVJEX09TUFJFWTJ4MDsKIAkJICAgICAgIC8qIGVuYWJsZSBvdXRwdXQgb24gc2VsZWN0IGNvbnRyb2wgbGluZXMgKi8KIAkJICAgICAgIGdwaW9faW5vdXQoMHhmZmZmZmYsMHgwMDAzMDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1ncGlvLmMKaW5kZXggYzRkNWUyYi4uYmEwODFmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWdwaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZ3Bpby5jCkBAIC0xMTgsMjAgKzExOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYnR0dl9ncGlvX2lycShzdHJ1Y3QgYnR0dl9jb3JlICpjb3JlKQotewotCXN0cnVjdCBidHR2X3N1Yl9kcml2ZXIgKmRydjsKLQlzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKLQotCWxpc3RfZm9yX2VhY2goaXRlbSwmY29yZS0+c3VicykgewotCQlkZXYgPSBsaXN0X2VudHJ5KGl0ZW0sc3RydWN0IGJ0dHZfc3ViX2RldmljZSxsaXN0KTsKLQkJZHJ2ID0gdG9fYnR0dl9zdWJfZHJ2KGRldi0+ZGV2LmRyaXZlcik7Ci0JCWlmIChkcnYgJiYgZHJ2LT5ncGlvX2lycSkKLQkJCWRydi0+Z3Bpb19pcnEoZGV2KTsKLQl9Ci19Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiBleHRlcm5hbDogc3ViLWRyaXZlciByZWdpc3Rlci91bnJlZ2lzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCmluZGV4IDY5ZWZhMGUuLmI0MWY4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1pbnB1dC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAogCWlmIChpci0+cmM1X2dwaW8pIHsKIAkJdTMyIGdwaW87Ci0JICAgIAkvKiBlbmFibGUgcmVtb3RlIGlycSAqLworCQkvKiBlbmFibGUgcmVtb3RlIGlycSAqLwogCQlidHR2X2dwaW9faW5vdXQoJmJ0di0+YywgKDEgPDwgNCksIDEgPDwgNCk7CiAJCWdwaW8gPSBidHR2X2dwaW9fcmVhZCgmYnR2LT5jKTsKIAkJYnR0dl9ncGlvX3dyaXRlKCZidHYtPmMsIGdwaW8gJiB+KDEgPDwgNCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAppbmRleCAzYTIzMjY1Li5mOWM5ZTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYuaApAQCAtMzUwLDcgKzM1MCw2IEBACiAJY2hhciAgICAgICAgICAgICAgICAgICB3YW50ZWRbQlVTX0lEX1NJWkVdOwogCWludCAgICAgICAgICAgICAgICAgICAgKCpwcm9iZSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIAl2b2lkICAgICAgICAgICAgICAgICAgICgqcmVtb3ZlKShzdHJ1Y3QgYnR0dl9zdWJfZGV2aWNlICpzdWIpOwotCXZvaWQgICAgICAgICAgICAgICAgICAgKCpncGlvX2lycSkoc3RydWN0IGJ0dHZfc3ViX2RldmljZSAqc3ViKTsKIH07CiAjZGVmaW5lIHRvX2J0dHZfc3ViX2Rydih4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgYnR0dl9zdWJfZHJpdmVyLCBkcnYpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAppbmRleCBlZTk4OWQyLi5kMjk1NjAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KQEAgLTIxNCw3ICsyMTUsNiBAQAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBidHR2X3N1Yl9idXNfdHlwZTsKIGludCBidHR2X3N1Yl9hZGRfZGV2aWNlKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUsIGNoYXIgKm5hbWUpOwogaW50IGJ0dHZfc3ViX2RlbF9kZXZpY2VzKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwotdm9pZCBidHR2X2dwaW9faXJxKHN0cnVjdCBidHR2X2NvcmUgKmNvcmUpOwogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKaW5kZXggY2Y2MWM1OS4uN2QwYjZlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idy1xY2FtLmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC03NTksNyArNzYwLDcgQEAKIAkJewogCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CiAJCQlpZihwLT5wYWxldHRlIT1WSURFT19QQUxFVFRFX0dSRVkpCi0JCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJaWYocC0+ZGVwdGghPTQgJiYgcC0+ZGVwdGghPTYpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCmluZGV4IDIyYTczODYuLmEzOTg5YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwpAQCAtMzQsNiArMzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BhcnBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKaW5kZXggODVkODRlOC4uOTVjNWFjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmMKQEAgLTQ3LDEzICs0Nyw2IEBACiAKICNpbmNsdWRlICJjcGlhLmgiCiAKLSNpZmRlZiBDT05GSUdfVklERU9fQ1BJQV9QUAotZXh0ZXJuIGludCBjcGlhX3BwX2luaXQodm9pZCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfVklERU9fQ1BJQV9VU0IKLWV4dGVybiBpbnQgY3BpYV91c2JfaW5pdCh2b2lkKTsKLSNlbmRpZgotCiBzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CiAKICNpZmRlZiBNT0RVTEUKQEAgLTY3LDEwICs2MCwxMCBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvbG9yc3BhY2VfY29udjsKIG1vZHVsZV9wYXJhbShjb2xvcnNwYWNlX2NvbnYsIHVzaG9ydCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbG9yc3BhY2VfY29udiwKLSAgICAgICAgICAgICAgICAgIiBDb2xvcnNwYWNlIGNvbnZlcnNpb246IgotICAgICAgICAgICAgICAgICAiXG4gIDAgPSBkaXNhYmxlLCAxID0gZW5hYmxlIgotICAgICAgICAgICAgICAgICAiXG4gIERlZmF1bHQgdmFsdWUgaXMgMCIKLSAgICAgICAgICAgICAgICAgKTsKKwkJICIgQ29sb3JzcGFjZSBjb252ZXJzaW9uOiIKKwkJICJcbiAgMCA9IGRpc2FibGUsIDEgPSBlbmFibGUiCisJCSAiXG4gIERlZmF1bHQgdmFsdWUgaXMgMCIKKwkJICk7CiAKICNkZWZpbmUgQUJPVVQgIlY0TC1Ecml2ZXIgZm9yIFZpc2lvbiBDUGlBIGJhc2VkIGNhbWVyYXMiCiAKQEAgLTQwNDcsMTMgKzQwNDAsNiBAQAogCXByb2NfY3BpYV9jcmVhdGUoKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1ZJREVPX0NQSUFfUFAKLQljcGlhX3BwX2luaXQoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19WSURFT19DUElBX1VTQgotCWNwaWFfdXNiX2luaXQoKTsKLSNlbmRpZgotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKaW5kZXggZGRlMjdhNi4uNmVhYTY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CkBAIC0yNDcsNyArMjQ4LDcgQEAKIHN0cnVjdCBjYW1fZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBjYW1fZGF0YV9saXN0OwogCi0Jc3RydWN0IG11dGV4IGJ1c3lfbG9jazsgICAgIC8qIGd1YXJkIGFnYWluc3QgU01QIG11bHRpdGhyZWFkaW5nICovCisJc3RydWN0IG11dGV4IGJ1c3lfbG9jazsJCS8qIGd1YXJkIGFnYWluc3QgU01QIG11bHRpdGhyZWFkaW5nICovCiAJc3RydWN0IGNwaWFfY2FtZXJhX29wcyAqb3BzOwkvKiBsb3dsZXZlbCBkcml2ZXIgb3BlcmF0aW9ucyAqLwogCXZvaWQgKmxvd2xldmVsX2RhdGE7CQkvKiBwcml2YXRlIGRhdGEgZm9yIGxvd2xldmVsIGRyaXZlciAqLwogCXU4ICpyYXdfaW1hZ2U7CQkJLyogYnVmZmVyIGZvciByYXcgaW1hZ2UgZGF0YSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oCmluZGV4IDE3NjQ5OTEuLmM1ZWNiMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmgKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYwppbmRleCA0ODFlMTc4Li5kMTI5ZGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKQEAgLTM0Myw3ICszNDMsOSBAQAogCQljcGlhMl9mcmVlX2J1ZmZlcnMoY2FtKTsKIAkJaWYgKCFjYW0tPnByZXNlbnQpIHsKIAkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldik7CisJCQltdXRleF91bmxvY2soJmNhbS0+YnVzeV9sb2NrKTsKIAkJCWtmcmVlKGNhbSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIApAQCAtMTE2Nyw5ICsxMTY5LDkgQEAKIAkJfSBlbHNlIHsKIAkJICAgIGlmKGNhbS0+cGFyYW1zLmZsaWNrZXJfY29udHJvbC5jYW1fcmVnaXN0ZXIgJgogCQkgICAgICAgQ1BJQTJfVlBfRkxJQ0tFUl9NT0RFU181MEhaKSB7Ci0JCSAgICAJbW9kZSA9IEZMSUNLRVJfNTA7CisJCQltb2RlID0gRkxJQ0tFUl81MDsKIAkJICAgIH0gZWxzZSB7Ci0JCSAgICAJbW9kZSA9IEZMSUNLRVJfNjA7CisJCQltb2RlID0gRkxJQ0tFUl82MDsKIAkJICAgIH0KIAkJfQogCQlmb3IoaT0wOyBpPE5VTV9GTElDS0VSX0NPTlRST0xTOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV9wcC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKaW5kZXggMGIwMGU2MC4uNGM4OWJkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3BwLmMKQEAgLTgwMyw3ICs4MDMsNyBAQAogCS5kZXRhY2ggPSBjcGlhX3BwX2RldGFjaCwKIH07CiAKLWludCBjcGlhX3BwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgY3BpYV9wcF9pbml0KHZvaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTyAiJXMgdiVkLiVkLiVkXG4iLEFCT1VULAogCSAgICAgICBDUElBX1BQX01BSl9WRVIsQ1BJQV9QUF9NSU5fVkVSLENQSUFfUFBfUEFUQ0hfVkVSKTsKQEAgLTg2MCw2ICs4NjAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcGlhX3BwX3NldHVwKGNoYXIgKnN0cikKIHsKKwlpbnQgZXJyOworCiAJaWYgKCFzdHJuY21wKHN0ciwgInBhcnBvcnQiLCA3KSkgewogCQlpbnQgbiA9IHNpbXBsZV9zdHJ0b3VsKHN0ciArIDcsIE5VTEwsIDEwKTsKIAkJaWYgKHBhcnBvcnRfcHRyIDwgUEFSUE9SVF9NQVgpIHsKQEAgLTg3Myw2ICs4NzUsMTAgQEAKIAkJcGFycG9ydF9ucltwYXJwb3J0X3B0cisrXSA9IFBQQ1BJQV9QQVJQT1JUX05PTkU7CiAJfQogCisJZXJyPWNwaWFfcHBfaW5pdCgpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKIAlyZXR1cm4gMTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhX3VzYi5jCmluZGV4IDljNDlhNGIuLjJlZTM0YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYV91c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWFfdXNiLmMKQEAgLTQ3NCwxMiArNDc0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGNwaWFfdXNiX2luaXQodm9pZCkKLXsKLQkvKiByZXR1cm4gLUVOT0RFVjsgKi8KLQlyZXR1cm4gMDsKLX0KLQogLyogUHJvYmluZyBhbmQgaW5pdGlhbGl6aW5nICovCiAKIHN0YXRpYyBpbnQgY3BpYV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzNDF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ODEzZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzQxeC5jCkBAIC0wLDAgKzEsOTE1IEBACisvKgorICogY3gyMzQxeCAtIGdlbmVyaWMgY29kZSBmb3IgY3gyMzQxNS82IGJhc2VkIGRldmljZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9jeDIzNDF4Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJjeDIzNDE1LzYgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIFZlcmt1aWwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBkZWJ1ZyA9IDA7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWcgbGV2ZWwgKDAtMSkiKTsKKworY29uc3QgdTMyIGN4MjM0MXhfbXBlZ19jdHJsc1tdID0geworCVY0TDJfQ0lEX01QRUdfQ0xBU1MsCisJVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSwKKwlWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEsCisJVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORywKKwlWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUsCisJVjRMMl9DSURfTVBFR19BVURJT19NT0RFLAorCVY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT04sCisJVjRMMl9DSURfTVBFR19BVURJT19FTVBIQVNJUywKKwlWNEwyX0NJRF9NUEVHX0FVRElPX0NSQywKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HLAorCVY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNULAorCVY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVMsCisJVjRMMl9DSURfTVBFR19WSURFT19HT1BfU0laRSwKKwlWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFLAorCVY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV04sCisJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREUsCisJVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFLAorCVY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLLAorCVY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTiwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERSwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVIsCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRSwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEUsCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVIsCisJVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRSwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX0JPVFRPTSwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUCwKKwlWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NLAorCVY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1AsCisJMAorfTsKKworCisvKiBNYXAgdGhlIGNvbnRyb2wgSUQgdG8gdGhlIGNvcnJlY3QgZmllbGQgaW4gdGhlIGN4MjM0MXhfbXBlZ19wYXJhbXMKKyAgIHN0cnVjdC4gUmV0dXJuIC1FSU5WQUwgaWYgdGhlIElEIGlzIHVua25vd24sIGVsc2UgcmV0dXJuIDAuICovCitzdGF0aWMgaW50IGN4MjM0MXhfZ2V0X2N0cmwoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+YXVkaW9fc2FtcGxpbmdfZnJlcTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+YXVkaW9fZW5jb2Rpbmc7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+YXVkaW9fbDJfYml0cmF0ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19tb2RlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19tb2RlX2V4dGVuc2lvbjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+YXVkaW9fZW1waGFzaXM7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT5hdWRpb19jcmM7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2VuY29kaW5nOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fYXNwZWN0OworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19iX2ZyYW1lczsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fZ29wX3NpemU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2dvcF9jbG9zdXJlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19wdWxsZG93bjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2JpdHJhdGVfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19iaXRyYXRlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fYml0cmF0ZV9wZWFrOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb247CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnN0cmVhbV90eXBlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVI6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19zcGF0aWFsX2ZpbHRlcjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVI6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb190ZW1wb3JhbF9maWx0ZXI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3A7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1A6CisJCWN0cmwtPnZhbHVlID0gcGFyYW1zLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3A7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTToKKwkJY3RybC0+dmFsdWUgPSBwYXJhbXMtPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX2JvdHRvbTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiBNYXAgdGhlIGNvbnRyb2wgSUQgdG8gdGhlIGNvcnJlY3QgZmllbGQgaW4gdGhlIGN4MjM0MXhfbXBlZ19wYXJhbXMKKyAgIHN0cnVjdC4gUmV0dXJuIC1FSU5WQUwgaWYgdGhlIElEIGlzIHVua25vd24sIGVsc2UgcmV0dXJuIDAuICovCitzdGF0aWMgaW50IGN4MjM0MXhfc2V0X2N0cmwoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwpCit7CisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19TQU1QTElOR19GUkVROgorCQlwYXJhbXMtPmF1ZGlvX3NhbXBsaW5nX2ZyZXEgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgorCQlwYXJhbXMtPmF1ZGlvX2VuY29kaW5nID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQlwYXJhbXMtPmF1ZGlvX2wyX2JpdHJhdGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CisJCXBhcmFtcy0+YXVkaW9fbW9kZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT046CisJCXBhcmFtcy0+YXVkaW9fbW9kZV9leHRlbnNpb24gPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOgorCQlwYXJhbXMtPmF1ZGlvX2VtcGhhc2lzID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19DUkM6CisJCXBhcmFtcy0+YXVkaW9fY3JjID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCXBhcmFtcy0+dmlkZW9fYXNwZWN0ID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzogeworCQlpbnQgYiA9IGN0cmwtPnZhbHVlICsgMTsKKwkJaW50IGdvcCA9IHBhcmFtcy0+dmlkZW9fZ29wX3NpemU7CisJCXBhcmFtcy0+dmlkZW9fYl9mcmFtZXMgPSBjdHJsLT52YWx1ZTsKKwkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA9IGIgKiAoKGdvcCArIGIgLSAxKSAvIGIpOworCQkvKiBNYXggR09QIHNpemUgPSAzNCAqLworCQl3aGlsZSAocGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA+IDM0KQorCQkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSAtPSBiOworCQlicmVhazsKKwl9CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOiB7CisJCWludCBiID0gcGFyYW1zLT52aWRlb19iX2ZyYW1lcyArIDE7CisJCWludCBnb3AgPSBjdHJsLT52YWx1ZTsKKwkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA9IGIgKiAoKGdvcCArIGIgLSAxKSAvIGIpOworCQkvKiBNYXggR09QIHNpemUgPSAzNCAqLworCQl3aGlsZSAocGFyYW1zLT52aWRlb19nb3Bfc2l6ZSA+IDM0KQorCQkJcGFyYW1zLT52aWRlb19nb3Bfc2l6ZSAtPSBiOworCQljdHJsLT52YWx1ZSA9IHBhcmFtcy0+dmlkZW9fZ29wX3NpemU7CisJCWJyZWFrOworCX0KKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXBhcmFtcy0+dmlkZW9fZ29wX2Nsb3N1cmUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOOgorCQlwYXJhbXMtPnZpZGVvX3B1bGxkb3duID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCS8qIE1QRUctMSBvbmx5IGFsbG93cyBDQlIgKi8KKwkJaWYgKHBhcmFtcy0+dmlkZW9fZW5jb2RpbmcgPT0gVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSAmJgorCQkgICAgY3RybC0+dmFsdWUgIT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGFyYW1zLT52aWRlb19iaXRyYXRlX21vZGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6CisJCXBhcmFtcy0+dmlkZW9fYml0cmF0ZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgorCQlwYXJhbXMtPnZpZGVvX2JpdHJhdGVfcGVhayA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjoKKwkJcGFyYW1zLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJcGFyYW1zLT5zdHJlYW1fdHlwZSA9IGN0cmwtPnZhbHVlOworCQlwYXJhbXMtPnZpZGVvX2VuY29kaW5nID0KKwkJCShwYXJhbXMtPnN0cmVhbV90eXBlID09IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyB8fAorCQkJIHBhcmFtcy0+c3RyZWFtX3R5cGUgPT0gVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1ZDRCkgPworCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSA6IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCWlmIChwYXJhbXMtPnZpZGVvX2VuY29kaW5nID09IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEpIHsKKwkJCS8qIE1QRUctMSBpbXBsaWVzIENCUiAqLworCQkJcGFyYW1zLT52aWRlb19iaXRyYXRlX21vZGUgPSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX0NCUjsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCQlwYXJhbXMtPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVI6CisJCXBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXIgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQlwYXJhbXMtPnZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwkJcGFyYW1zLT52aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwkJcGFyYW1zLT52aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVI6CisJCXBhcmFtcy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJcGFyYW1zLT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9NRURJQU5fRklMVEVSX1RPUDoKKwkJcGFyYW1zLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfdG9wID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCXBhcmFtcy0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9UT1A6CisJCXBhcmFtcy0+dmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfdG9wID0gY3RybC0+dmFsdWU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTToKKwkJcGFyYW1zLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gPSBjdHJsLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIHMzMiBtaW4sIHMzMiBtYXgsIHMzMiBzdGVwLCBzMzIgZGVmKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwlxY3RybC0+ZmxhZ3MgPSAwOworCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJLyogTVBFRyBjb250cm9scyAqLworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREU6CisJCW5hbWUgPSAiU3BhdGlhbCBGaWx0ZXIgTW9kZSI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSOgorCQluYW1lID0gIlNwYXRpYWwgRmlsdGVyIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQluYW1lID0gIlNwYXRpYWwgTHVtYSBGaWx0ZXIgVHlwZSI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQluYW1lID0gIlNwYXRpYWwgQ2hyb21hIEZpbHRlciBUeXBlIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREU6CisJCW5hbWUgPSAiVGVtcG9yYWwgRmlsdGVyIE1vZGUiOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVI6CisJCW5hbWUgPSAiVGVtcG9yYWwgRmlsdGVyIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFOgorCQluYW1lID0gIk1lZGlhbiBGaWx0ZXIgVHlwZSI7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9UT1A6CisJCW5hbWUgPSAiTWVkaWFuIEx1bWEgRmlsdGVyIE1heGltdW0iOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NOgorCQluYW1lID0gIk1lZGlhbiBMdW1hIEZpbHRlciBNaW5pbXVtIjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QOgorCQluYW1lID0gIk1lZGlhbiBDaHJvbWEgRmlsdGVyIE1heGltdW0iOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCW5hbWUgPSAiTWVkaWFuIENocm9tYSBGaWx0ZXIgTWluaW11bSI7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCBtaW4sIG1heCwgc3RlcCwgZGVmKTsKKwl9CisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEU6CisJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVTsKKwkJbWluID0gMDsKKwkJc3RlcCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXFjdHJsLT50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEU6CisJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19VUERBVEU7CisJCWJyZWFrOworCX0KKwlxY3RybC0+bWluaW11bSA9IG1pbjsKKwlxY3RybC0+bWF4aW11bSA9IG1heDsKKwlxY3RybC0+c3RlcCA9IHN0ZXA7CisJcWN0cmwtPmRlZmF1bHRfdmFsdWUgPSBkZWY7CisJcWN0cmwtPnJlc2VydmVkWzBdID0gcWN0cmwtPnJlc2VydmVkWzFdID0gMDsKKwlzbnByaW50ZihxY3RybC0+bmFtZSwgc2l6ZW9mKHFjdHJsLT5uYW1lKSwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBjeDIzNDF4X2N0cmxfcXVlcnkoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCkKK3sKKwlpbnQgZXJyOworCisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMiwgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMik7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE5MkssCisJCQkJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yMjRLKTsKKworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwkJZXJyID0gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKKwkJaWYgKGVyciA9PSAwICYmIHBhcmFtcy0+YXVkaW9fbW9kZSAhPSBWNEwyX01QRUdfQVVESU9fTU9ERV9KT0lOVF9TVEVSRU8pCisJCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiBlcnI7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJCS8qIHRoaXMgc2V0dGluZyBpcyByZWFkLW9ubHkgZm9yIHRoZSBjeDIzNDF4IHNpbmNlIHRoZQorCQkgICBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFIHJlYWxseSBkZXRlcm1pbmVzIHRoZQorCQkgICBNUEVHLTEvMiBzZXR0aW5nICovCisJCWVyciA9IHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxY3RybCk7CisJCWlmIChlcnIgPT0gMCkKKwkJCXFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFk7CisJCXJldHVybiBlcnI7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgorCQllcnIgPSB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWN0cmwpOworCQlpZiAoZXJyID09IDAgJiYgcGFyYW1zLT52aWRlb19lbmNvZGluZyA9PSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xKQorCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gZXJyOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzoKKwkJZXJyID0gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKKwkJaWYgKGVyciA9PSAwICYmIHBhcmFtcy0+dmlkZW9fYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSKQorCQkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gZXJyOworCisJLyogQ1gyMzQxNS82IHNwZWNpZmljICovCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERToKKwkJcmV0dXJuIGN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfTUFOVUFMLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfQVVUTywgMSwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX01BTlVBTCk7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUjoKKwkJY3gyMzQxeF9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDE1LCAxLCAwKTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSA9PSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8pCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9TWU1fTk9OX1NFUEFSQUJMRSwgMSwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGKTsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSA9PSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8pCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEU6CisJCWN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IsIDEsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGKTsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSA9PSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFX0FVVE8pCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREU6CisJCXJldHVybiBjeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9NQU5VQUwsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfQVVUTywgMSwKKwkJCQlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9NQU5VQUwpOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMzEsIDEsIDApOworCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlpZiAocGFyYW1zLT52aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSA9PSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVJfTU9ERV9BVVRPKQorCQkgICAgICAgcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlyZXR1cm4gMDsKKworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJcmV0dXJuIGN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0RJQUcsIDEsCisJCQkJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRik7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfVE9QOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAyNTUpOworCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlpZiAocGFyYW1zLT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRikKKwkJICAgICAgIHFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJaWYgKHBhcmFtcy0+dmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlID09IFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYpCisJCSAgICAgICBxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCisJY2FzZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QOgorCQljeDIzNDF4X2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAyNTUpOworCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlpZiAocGFyYW1zLT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRikKKwkJICAgICAgIHFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfTUVESUFOX0ZJTFRFUl9CT1RUT006CisJCWN4MjM0MXhfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOworCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfU0xJREVSOworCQlpZiAocGFyYW1zLT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgPT0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX09GRikKKwkJICAgICAgIHFjdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjdHJsKTsKKworCX0KK30KKworY29uc3QgY2hhciAqKmN4MjM0MXhfY3RybF9nZXRfbWVudSh1MzIgaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfc3RyZWFtX3R5cGVbXSA9IHsKKwkJIk1QRUctMiBQcm9ncmFtIFN0cmVhbSIsCisJCSIiLAorCQkiTVBFRy0xIFN5c3RlbSBTdHJlYW0iLAorCQkiTVBFRy0yIERWRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCSJNUEVHLTEgVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKKwkJIk1QRUctMiBTVkNELWNvbXBhdGlibGUgU3RyZWFtIiwKKwkJTlVMTAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlX21lbnVbXSA9IHsKKwkJIk1hbnVhbCIsCisJCSJBdXRvIiwKKwkJTlVMTAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGVfbWVudVtdID0geworCQkiT2ZmIiwKKwkJIjFEIEhvcml6b250YWwiLAorCQkiMUQgVmVydGljYWwiLAorCQkiMkQgSC9WIFNlcGFyYWJsZSIsCisJCSIyRCBTeW1tZXRyaWMgbm9uLXNlcGFyYWJsZSIsCisJCU5VTEwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKmN4MjM0MXhfdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGVfbWVudVtdID0geworCQkiT2ZmIiwKKwkJIjFEIEhvcml6b250YWwiLAorCQlOVUxMCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyICpjeDIzNDF4X3ZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlX21lbnVbXSA9IHsKKwkJIk1hbnVhbCIsCisJCSJBdXRvIiwKKwkJTlVMTAorCX07CisKKwlzdGF0aWMgY29uc3QgY2hhciAqY3gyMzQxeF92aWRlb19tZWRpYW5fZmlsdGVyX3R5cGVfbWVudVtdID0geworCQkiT2ZmIiwKKwkJIkhvcml6b250YWwiLAorCQkiVmVydGljYWwiLAorCQkiSG9yaXpvbnRhbC9WZXJ0aWNhbCIsCisJCSJEaWFnb25hbCIsCisJCU5VTEwKKwl9OworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJcmV0dXJuIG1wZWdfc3RyZWFtX3R5cGU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CisJCXJldHVybiBOVUxMOworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREU6CisJCXJldHVybiBjeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGVfbWVudTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEU6CisJCXJldHVybiBjeDIzNDF4X3ZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZV9tZW51OworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9TUEFUSUFMX0ZJTFRFUl9UWVBFOgorCQlyZXR1cm4gY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZV9tZW51OworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFOgorCQlyZXR1cm4gY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZV9tZW51OworCWNhc2UgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRToKKwkJcmV0dXJuIGN4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlX21lbnU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHY0bDJfY3RybF9nZXRfbWVudShpZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjeDIzNDF4X2NhbGNfYXVkaW9fcHJvcGVydGllcyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcGFyYW1zKQoreworCXBhcmFtcy0+YXVkaW9fcHJvcGVydGllcyA9IChwYXJhbXMtPmF1ZGlvX3NhbXBsaW5nX2ZyZXEgPDwgMCkgfAorCQkoKDMgLSBwYXJhbXMtPmF1ZGlvX2VuY29kaW5nKSA8PCAyKSB8CisJCSgoMSArIHBhcmFtcy0+YXVkaW9fbDJfYml0cmF0ZSkgPDwgNCkgfAorCQkocGFyYW1zLT5hdWRpb19tb2RlIDw8IDgpIHwKKwkJKHBhcmFtcy0+YXVkaW9fbW9kZV9leHRlbnNpb24gPDwgMTApIHwKKwkJKCgocGFyYW1zLT5hdWRpb19lbXBoYXNpcyA9PSBWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfQ0NJVFRfSjE3KSA/CisJCSAgMyA6CisJCSAgcGFyYW1zLT5hdWRpb19lbXBoYXNpcykgPDwgMTIpIHwKKwkJKHBhcmFtcy0+YXVkaW9fY3JjIDw8IDE0KTsKK30KKworaW50IGN4MjM0MXhfZXh0X2N0cmxzKHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwYXJhbXMsCisJCSAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscywgaW50IGNtZCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKworCWlmIChjbWQgPT0gVklESU9DX0dfRVhUX0NUUkxTKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjdHJscy0+Y291bnQ7IGkrKykgeworCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwgPSBjdHJscy0+Y29udHJvbHMgKyBpOworCisJCQllcnIgPSBjeDIzNDF4X2dldF9jdHJsKHBhcmFtcywgY3RybCk7CisJCQlpZiAoZXJyKSB7CisJCQkJY3RybHMtPmVycm9yX2lkeCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJcmV0dXJuIGVycjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGN0cmxzLT5jb3VudDsgaSsrKSB7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsID0gY3RybHMtPmNvbnRyb2xzICsgaTsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsIHFjdHJsOworCQljb25zdCBjaGFyICoqbWVudV9pdGVtcyA9IE5VTEw7CisKKwkJcWN0cmwuaWQgPSBjdHJsLT5pZDsKKwkJZXJyID0gY3gyMzQxeF9jdHJsX3F1ZXJ5KHBhcmFtcywgJnFjdHJsKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlpZiAocWN0cmwudHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VKQorCQkJbWVudV9pdGVtcyA9IGN4MjM0MXhfY3RybF9nZXRfbWVudShxY3RybC5pZCk7CisJCWVyciA9IHY0bDJfY3RybF9jaGVjayhjdHJsLCAmcWN0cmwsIG1lbnVfaXRlbXMpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWVyciA9IGN4MjM0MXhfc2V0X2N0cmwocGFyYW1zLCBjdHJsKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyID09IDAgJiYgcGFyYW1zLT52aWRlb19iaXRyYXRlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIgJiYKKwkJCXBhcmFtcy0+dmlkZW9fYml0cmF0ZV9wZWFrIDwgcGFyYW1zLT52aWRlb19iaXRyYXRlKSB7CisJCWVyciA9IC1FUkFOR0U7CisJCWN0cmxzLT5lcnJvcl9pZHggPSBjdHJscy0+Y291bnQ7CisJfQorCWlmIChlcnIpIHsKKwkJY3RybHMtPmVycm9yX2lkeCA9IGk7CisJfQorCWVsc2UgeworCQljeDIzNDF4X2NhbGNfYXVkaW9fcHJvcGVydGllcyhwYXJhbXMpOworCX0KKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGN4MjM0MXhfZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcCkKK3sKKwlzdGF0aWMgc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgZGVmYXVsdF9wYXJhbXMgPSB7CisJLyogbWlzYyAqLworCS5wb3J0ID0gQ1gyMzQxWF9QT1JUX01FTU9SWSwKKwkud2lkdGggPSA3MjAsCisJLmhlaWdodCA9IDQ4MCwKKwkuaXNfNTBoeiA9IDAsCisKKwkvKiBzdHJlYW0gKi8KKwkuc3RyZWFtX3R5cGUgPSBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMsCisKKwkvKiBhdWRpbyAqLworCS5hdWRpb19zYW1wbGluZ19mcmVxID0gVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDAsCisJLmF1ZGlvX2VuY29kaW5nID0gVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIsCisJLmF1ZGlvX2wyX2JpdHJhdGUgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yMjRLLAorCS5hdWRpb19tb2RlID0gVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPLAorCS5hdWRpb19tb2RlX2V4dGVuc2lvbiA9IFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80LAorCS5hdWRpb19lbXBoYXNpcyA9IFY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FLAorCS5hdWRpb19jcmMgPSBWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUsCisKKwkvKiB2aWRlbyAqLworCS52aWRlb19lbmNvZGluZyA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIsCisJLnZpZGVvX2FzcGVjdCA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzLAorCS52aWRlb19iX2ZyYW1lcyA9IDIsCisJLnZpZGVvX2dvcF9zaXplID0gMTIsCisJLnZpZGVvX2dvcF9jbG9zdXJlID0gMSwKKwkudmlkZW9fcHVsbGRvd24gPSAwLAorCS52aWRlb19iaXRyYXRlX21vZGUgPSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKKwkudmlkZW9fYml0cmF0ZSA9IDYwMDAwMDAsCisJLnZpZGVvX2JpdHJhdGVfcGVhayA9IDgwMDAwMDAsCisJLnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb24gPSAwLAorCisJLyogZW5jb2RpbmcgZmlsdGVycyAqLworCS52aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlID0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9NQU5VQUwsCisJLnZpZGVvX3NwYXRpYWxfZmlsdGVyID0gMCwKKwkudmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlID0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiwKKwkudmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUgPSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IsCisJLnZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlID0gVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfTUFOVUFMLAorCS52aWRlb190ZW1wb3JhbF9maWx0ZXIgPSAwLAorCS52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgPSBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfT0ZGLAorCS52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfdG9wID0gMjU1LAorCS52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tID0gMCwKKwkudmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfdG9wID0gMjU1LAorCS52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gPSAwLAorCX07CisKKwkqcCA9IGRlZmF1bHRfcGFyYW1zOworCWN4MjM0MXhfY2FsY19hdWRpb19wcm9wZXJ0aWVzKHApOworfQorCitzdGF0aWMgaW50IGN4MjM0MXhfYXBpKHZvaWQgKnByaXYsIGN4MjM0MXhfbWJveF9mdW5jIGZ1bmMsIGludCBjbWQsIGludCBhcmdzLCAuLi4pCit7CisJdTMyIGRhdGFbQ1gyMzQxWF9NQk9YX01BWF9EQVRBXTsKKwl2YV9saXN0IHZhcmdzOworCWludCBpOworCisJdmFfc3RhcnQodmFyZ3MsIGFyZ3MpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ3M7IGkrKykgeworCQlkYXRhW2ldID0gdmFfYXJnKHZhcmdzLCBpbnQpOworCX0KKwl2YV9lbmQodmFyZ3MpOworCXJldHVybiBmdW5jKHByaXYsIGNtZCwgYXJncywgMCwgZGF0YSk7Cit9CisKK2ludCBjeDIzNDF4X3VwZGF0ZSh2b2lkICpwcml2LCBjeDIzNDF4X21ib3hfZnVuYyBmdW5jLAorCQljb25zdCBzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqb2xkLCBjb25zdCBzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqbmV3KQoreworCXN0YXRpYyBpbnQgbXBlZ19zdHJlYW1fdHlwZVtdID0geworCQkwLAkvKiBNUEVHLTIgUFMgKi8KKwkJMSwJLyogTVBFRy0yIFRTICovCisJCTIsCS8qIE1QRUctMSBTUyAqLworCQkxNCwJLyogRFZEICovCisJCTExLAkvKiBWQ0QgKi8KKwkJMTIsCS8qIFNWQ0QgKi8KKwl9OworCisJaW50IGVyciA9IDA7CisKKwljeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfT1VUUFVUX1BPUlQsIDIsIG5ldy0+cG9ydCwgMCk7CisKKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT5pc181MGh6ICE9IG5ldy0+aXNfNTBoeikgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfRlJBTUVfUkFURSwgMSwgbmV3LT5pc181MGh6KTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisKKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT53aWR0aCAhPSBuZXctPndpZHRoIHx8IG9sZC0+aGVpZ2h0ICE9IG5ldy0+aGVpZ2h0IHx8CisJCQlvbGQtPnZpZGVvX2VuY29kaW5nICE9IG5ldy0+dmlkZW9fZW5jb2RpbmcpIHsKKwkJdTE2IHcgPSBuZXctPndpZHRoOworCQl1MTYgaCA9IG5ldy0+aGVpZ2h0OworCisJCWlmIChuZXctPnZpZGVvX2VuY29kaW5nID09IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzEpIHsKKwkJCXcgLz0gMjsKKwkJCWggLz0gMjsKKwkJfQorCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfRlJBTUVfU0laRSwgMiwgaCwgdyk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+c3RyZWFtX3R5cGUgIT0gbmV3LT5zdHJlYW1fdHlwZSkgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfU1RSRUFNX1RZUEUsIDEsIG1wZWdfc3RyZWFtX3R5cGVbbmV3LT5zdHJlYW1fdHlwZV0pOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT52aWRlb19hc3BlY3QgIT0gbmV3LT52aWRlb19hc3BlY3QpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0FTUEVDVF9SQVRJTywgMSwgMSArIG5ldy0+dmlkZW9fYXNwZWN0KTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fYl9mcmFtZXMgIT0gbmV3LT52aWRlb19iX2ZyYW1lcyB8fAorCQlvbGQtPnZpZGVvX2dvcF9zaXplICE9IG5ldy0+dmlkZW9fZ29wX3NpemUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0dPUF9QUk9QRVJUSUVTLCAyLAorCQkJCW5ldy0+dmlkZW9fZ29wX3NpemUsIG5ldy0+dmlkZW9fYl9mcmFtZXMgKyAxKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fZ29wX2Nsb3N1cmUgIT0gbmV3LT52aWRlb19nb3BfY2xvc3VyZSkgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfR09QX0NMT1NVUkUsIDEsIG5ldy0+dmlkZW9fZ29wX2Nsb3N1cmUpOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT52aWRlb19wdWxsZG93biAhPSBuZXctPnZpZGVvX3B1bGxkb3duKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF8zXzJfUFVMTERPV04sIDEsIG5ldy0+dmlkZW9fcHVsbGRvd24pOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT5hdWRpb19wcm9wZXJ0aWVzICE9IG5ldy0+YXVkaW9fcHJvcGVydGllcykgeworCQllcnIgPSBjeDIzNDF4X2FwaShwcml2LCBmdW5jLCBDWDIzNDFYX0VOQ19TRVRfQVVESU9fUFJPUEVSVElFUywgMSwgbmV3LT5hdWRpb19wcm9wZXJ0aWVzKTsKKwkJaWYgKGVycikgcmV0dXJuIGVycjsKKwl9CisJaWYgKG9sZCA9PSBOVUxMIHx8IG9sZC0+dmlkZW9fYml0cmF0ZV9tb2RlICE9IG5ldy0+dmlkZW9fYml0cmF0ZV9tb2RlIHx8CisJCW9sZC0+dmlkZW9fYml0cmF0ZSAhPSBuZXctPnZpZGVvX2JpdHJhdGUgfHwKKwkJb2xkLT52aWRlb19iaXRyYXRlX3BlYWsgIT0gbmV3LT52aWRlb19iaXRyYXRlX3BlYWspIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0JJVF9SQVRFLCA1LAorCQkJCW5ldy0+dmlkZW9fYml0cmF0ZV9tb2RlLCBuZXctPnZpZGVvX2JpdHJhdGUsCisJCQkJbmV3LT52aWRlb19iaXRyYXRlX3BlYWsgLyA0MDAsIDAsIDApOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlpZiAob2xkID09IE5VTEwgfHwgb2xkLT52aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlICE9IG5ldy0+dmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSB8fAorCQlvbGQtPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlICE9IG5ldy0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgfHwKKwkJb2xkLT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgIT0gbmV3LT52aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfTU9ERSwgMiwKKwkJCQluZXctPnZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgfCAobmV3LT52aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSA8PCAxKSwKKwkJCQluZXctPnZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZSk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fAorCQlvbGQtPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gIT0gbmV3LT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tIHx8CisJCW9sZC0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcCAhPSBuZXctPnZpZGVvX2x1bWFfbWVkaWFuX2ZpbHRlcl90b3AgfHwKKwkJb2xkLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gIT0gbmV3LT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20gfHwKKwkJb2xkLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3AgIT0gbmV3LT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl90b3ApIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0NPUklOR19MRVZFTFMsIDQsCisJCQkJbmV3LT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tLAorCQkJCW5ldy0+dmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcCwKKwkJCQluZXctPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX2JvdHRvbSwKKwkJCQluZXctPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX3RvcCk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fAorCQlvbGQtPnZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSAhPSBuZXctPnZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSB8fAorCQlvbGQtPnZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlICE9IG5ldy0+dmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX1NQQVRJQUxfRklMVEVSX1RZUEUsIDIsCisJCQluZXctPnZpZGVvX2x1bWFfc3BhdGlhbF9maWx0ZXJfdHlwZSwgbmV3LT52aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZSk7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fAorCQlvbGQtPnZpZGVvX3NwYXRpYWxfZmlsdGVyICE9IG5ldy0+dmlkZW9fc3BhdGlhbF9maWx0ZXIgfHwKKwkJb2xkLT52aWRlb190ZW1wb3JhbF9maWx0ZXIgIT0gbmV3LT52aWRlb190ZW1wb3JhbF9maWx0ZXIpIHsKKwkJZXJyID0gY3gyMzQxeF9hcGkocHJpdiwgZnVuYywgQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfUFJPUFMsIDIsCisJCQluZXctPnZpZGVvX3NwYXRpYWxfZmlsdGVyLCBuZXctPnZpZGVvX3RlbXBvcmFsX2ZpbHRlcik7CisJCWlmIChlcnIpIHJldHVybiBlcnI7CisJfQorCWlmIChvbGQgPT0gTlVMTCB8fCBvbGQtPnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb24gIT0gbmV3LT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uKSB7CisJCWVyciA9IGN4MjM0MXhfYXBpKHByaXYsIGZ1bmMsIENYMjM0MVhfRU5DX1NFVF9GUkFNRV9EUk9QX1JBVEUsIDEsCisJCQluZXctPnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb24pOworCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmN4MjM0MXhfbWVudV9pdGVtKHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwLCB1MzIgaWQpCit7CisJY29uc3QgY2hhciAqKm1lbnUgPSBjeDIzNDF4X2N0cmxfZ2V0X21lbnUoaWQpOworCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sIGN0cmw7CisKKwlpZiAobWVudSA9PSBOVUxMKQorCQlnb3RvIGludmFsaWQ7CisJY3RybC5pZCA9IGlkOworCWlmIChjeDIzNDF4X2dldF9jdHJsKHAsICZjdHJsKSkKKwkJZ290byBpbnZhbGlkOworCXdoaWxlIChjdHJsLnZhbHVlLS0gJiYgKm1lbnUpIG1lbnUrKzsKKwlpZiAoKm1lbnUgPT0gTlVMTCkKKwkJZ290byBpbnZhbGlkOworCXJldHVybiAqbWVudTsKKworaW52YWxpZDoKKwlyZXR1cm4gIjxpbnZhbGlkPiI7Cit9CisKK3ZvaWQgY3gyMzQxeF9sb2dfc3RhdHVzKHN0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zICpwLCBpbnQgY2FyZF9pZCkKK3sKKwlpbnQgaXNfbXBlZzEgPSBwLT52aWRlb19lbmNvZGluZyA9PSBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xOworCisJLyogU3RyZWFtICovCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogU3RyZWFtOiAlc1xuIiwKKwkJY2FyZF9pZCwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSkpOworCisJLyogVmlkZW8gKi8KKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBWaWRlbzogICVkeCVkLCAlZCBmcHNcbiIsCisJCWNhcmRfaWQsCisJCXAtPndpZHRoIC8gKGlzX21wZWcxID8gMiA6IDEpLCBwLT5oZWlnaHQgLyAoaXNfbXBlZzEgPyAyIDogMSksCisJCXAtPmlzXzUwaHogPyAyNSA6IDMwKTsKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBWaWRlbzogICVzLCAlcywgJXMsICVkIiwKKwkJY2FyZF9pZCwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREUpLAorCQlwLT52aWRlb19iaXRyYXRlKTsKKwlpZiAocC0+dmlkZW9fYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSKSB7CisJCXByaW50aygiLCBQZWFrICVkIiwgcC0+dmlkZW9fYml0cmF0ZV9wZWFrKTsKKwl9CisJcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0lORk8gImN4MjM0MXgtJWQ6IFZpZGVvOiAgR09QIFNpemUgJWQsICVkIEItRnJhbWVzLCAlc0dPUCBDbG9zdXJlLCAlczM6MiBQdWxsZG93blxuIiwKKwkJY2FyZF9pZCwKKwkJcC0+dmlkZW9fZ29wX3NpemUsIHAtPnZpZGVvX2JfZnJhbWVzLAorCQlwLT52aWRlb19nb3BfY2xvc3VyZSA/ICIiIDogIk5vICIsCisJCXAtPnZpZGVvX3B1bGxkb3duID8gIiIgOiAiTm8gIik7CisJaWYgKHAtPnZpZGVvX3RlbXBvcmFsX2RlY2ltYXRpb24pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzQxeC0lZDogVmlkZW86IFRlbXBvcmFsIERlY2ltYXRpb24gJWRcbiIsCisJCQljYXJkX2lkLCBwLT52aWRlb190ZW1wb3JhbF9kZWNpbWF0aW9uKTsKKwl9CisKKwkvKiBBdWRpbyAqLworCXByaW50ayhLRVJOX0lORk8gImN4MjM0MXgtJWQ6IEF1ZGlvOiAgJXMsICVzLCAlcywgJXMiLAorCQljYXJkX2lkLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEpLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19BVURJT19NT0RFKSk7CisJaWYgKHAtPmF1ZGlvX21vZGUgPT0gVjRMMl9NUEVHX0FVRElPX01PREVfSk9JTlRfU1RFUkVPKSB7CisJCXByaW50aygiLCAlcyIsCisJCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OKSk7CisJfQorCXByaW50aygiLCAlcywgJXNcbiIsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVMpLAorCQljeDIzNDF4X21lbnVfaXRlbShwLCBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQykpOworCisJLyogRW5jb2RpbmcgZmlsdGVycyAqLworCXByaW50ayhLRVJOX0lORk8gImN4MjM0MXgtJWQ6IFNwYXRpYWwgRmlsdGVyOiAgJXMsIEx1bWEgJXMsIENocm9tYSAlcywgJWRcbiIsCisJCWNhcmRfaWQsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFKSwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRSksCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSksCisJCXAtPnZpZGVvX3NwYXRpYWxfZmlsdGVyKTsKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBUZW1wb3JhbCBGaWx0ZXI6ICVzLCAlZFxuIiwKKwkJY2FyZF9pZCwKKwkJY3gyMzQxeF9tZW51X2l0ZW0ocCwgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFKSwKKwkJcC0+dmlkZW9fdGVtcG9yYWxfZmlsdGVyKTsKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzNDF4LSVkOiBNZWRpYW4gRmlsdGVyOiAgICVzLCBMdW1hIFslZCwgJWRdLCBDaHJvbWEgWyVkLCAlZF1cbiIsCisJCWNhcmRfaWQsCisJCWN4MjM0MXhfbWVudV9pdGVtKHAsIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEUpLAorCQlwLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfYm90dG9tLAorCQlwLT52aWRlb19sdW1hX21lZGlhbl9maWx0ZXJfdG9wLAorCQlwLT52aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b20sCisJCXAtPnZpZGVvX2Nocm9tYV9tZWRpYW5fZmlsdGVyX3RvcCk7Cit9CisKK0VYUE9SVF9TWU1CT0woY3gyMzQxeF9maWxsX2RlZmF1bHRzKTsKK0VYUE9SVF9TWU1CT0woY3gyMzQxeF9jdHJsX3F1ZXJ5KTsKK0VYUE9SVF9TWU1CT0woY3gyMzQxeF9jdHJsX2dldF9tZW51KTsKK0VYUE9SVF9TWU1CT0woY3gyMzQxeF9leHRfY3RybHMpOworRVhQT1JUX1NZTUJPTChjeDIzNDF4X3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfbG9nX3N0YXR1cyk7CitFWFBPUlRfU1lNQk9MKGN4MjM0MXhfbXBlZ19jdHJscyk7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1hdWRpby5jCmluZGV4IDlhNGI4MTMuLmY4OTdjMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWF1ZGlvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtYXVkaW8uYwpAQCAtMzAsOSArMzAsNiBAQAogCWlmIChmcmVxICE9IDMyMDAwICYmIGZyZXEgIT0gNDQxMDAgJiYgZnJlcSAhPSA0ODAwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBhc3NlcnQgc29mdCByZXNldCAqLwotCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MTAsIH4weDEsIDB4MDEpOwotCiAJLyogY29tbW9uIGZvciBhbGwgaW5wdXRzIGFuZCByYXRlcyAqLwogCS8qIFNBX01DTEtfU0VMPTEsIFNBX01DTEtfRElWPTB4MTAgKi8KIAljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHgxMjcsIDB4NTApOwpAQCAtNDYsNiArNDMsOSBAQAogCQkJLyogQVVYX1BMTF9GUkFDICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweGVlMzliYjAxKTsKIAorCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJCWJyZWFrOworCiAJCQkvKiBzcmMzLzQvNl9jdGwgPSAweDA4MDFmNzdmICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweDdmZjcwMTA4KTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4N2ZmNzAxMDgpOwpAQCAtNTksNiArNTksOSBAQAogCQkJLyogQVVYX1BMTF9GUkFDICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweGQ2NmJlYzAwKTsKIAorCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJCWJyZWFrOworCiAJCQkvKiBzcmMzLzQvNl9jdGwgPSAweDA4MDE2ZDU5ICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweDU5NmQwMTA4KTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4NTk2ZDAxMDgpOwpAQCAtNzIsNiArNzUsOSBAQAogCQkJLyogQVVYX1BMTF9GUkFDICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweGU1ZDY5ODAwKTsKIAorCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJCWJyZWFrOworCiAJCQkvKiBzcmMzLzQvNl9jdGwgPSAweDA4MDE0ZmFhICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OTAwLCAweGFhNGYwMTA4KTsKIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg5MDQsIDB4YWE0ZjAxMDgpOwpAQCAtODcsNiArOTMsOSBAQAogCQkJLyogQVVYX1BMTF9GUkFDICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4MTEwLCAweDY5MDgyYTAxKTsKIAorCQkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJCWJyZWFrOworCiAJCQkvKiBzcmMxX2N0bCA9IDB4MDgwMTAwMDAgKi8KIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHg4ZjgsIDB4MDAwMDAxMDgpOwogCkBAIC0xMDYsNiArMTE1LDkgQEAKIAkJCS8qIEFVWF9QTExfRlJBQyAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDExMCwgMHhkNjZiZWMwMCk7CiAKKwkJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCQlicmVhazsKKwogCQkJLyogc3JjMV9jdGwgPSAweDA4MDEwMDAwICovCiAJCQljeDI1ODQwX3dyaXRlNChjbGllbnQsIDB4OGY4LCAweGNkNjAwMTA4KTsKIApAQCAtMTIyLDYgKzEzNCw5IEBACiAJCQkvKiBBVVhfUExMX0ZSQUMgKi8KIAkJCWN4MjU4NDBfd3JpdGU0KGNsaWVudCwgMHgxMTAsIDB4ZTVkNjk4MDApOwogCisJCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQkJYnJlYWs7CisKIAkJCS8qIHNyYzFfY3RsID0gMHgwODAxMDAwMCAqLwogCQkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhmOCwgMHgwMDgwMDEwOCk7CiAKQEAgLTEzMyw5ICsxNDgsNiBAQAogCQl9CiAJfQogCi0JLyogZGVhc3NlcnQgc29mdCByZXNldCAqLwotCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MTAsIH4weDEsIDB4MDApOwotCiAJc3RhdGUtPmF1ZGNsa19mcmVxID0gZnJlcTsKIAogCXJldHVybiAwOwpAQCAtMTQ4LDYgKzE2MCwxMCBAQAogCS8qIHN0b3AgbWljcm9jb250cm9sbGVyICovCiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDgwMywgfjB4MTAsIDApOwogCisJLyogYXNzZXJ0IHNvZnQgcmVzZXQgKi8KKwlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAweDAxKTsKKwogCS8qIE11dGUgZXZlcnl0aGluZyB0byBwcmV2ZW50IHRoZSBQRkZUISAqLwogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDhkMywgMHgxZik7CiAKQEAgLTE2MSwxMyArMTc3LDE5IEBACiAJfSBlbHNlIHsKIAkJLyogU2V0IFBhdGgxIHRvIEFuYWxvZyBEZW1vZCBNYWluIENoYW5uZWwgKi8KIAkJY3gyNTg0MF93cml0ZTQoY2xpZW50LCAweDhkMCwgMHg3MDM4MDYxZik7CisJfQogCisJc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKKworCS8qIGRlYXNzZXJ0IHNvZnQgcmVzZXQgKi8KKwlpZiAoIXN0YXRlLT5pc19jeDI1ODM2KQorCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAweDAwKTsKKworCWlmIChzdGF0ZS0+YXVkX2lucHV0ICE9IENYMjU4NDBfQVVESU9fU0VSSUFMKSB7CiAJCS8qIFdoZW4gdGhlIG1pY3JvY29udHJvbGxlciBkZXRlY3RzIHRoZQogCQkgKiBhdWRpbyBmb3JtYXQsIGl0IHdpbGwgdW5tdXRlIHRoZSBsaW5lcyAqLwogCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODAzLCB+MHgxMCwgMHgxMCk7CiAJfQotCi0Jc2V0X2F1ZGNsa19mcmVxKGNsaWVudCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKIH0KIAogc3RhdGljIGludCBnZXRfdm9sdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCkBAIC0yOTEsMTEgKzMxMywyNSBAQAogCiBpbnQgY3gyNTg0MF9hdWRpbyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCA9IGFyZzsKKwlpbnQgcmV0dmFsOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKLQkJcmV0dXJuIHNldF9hdWRjbGtfZnJlcShjbGllbnQsICoodTMyICopYXJnKTsKKwkJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKKwkJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAwKTsKKwkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDhkMywgMHgxZik7CisJCX0KKwkJaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MTAsIH4weDEsIDEpOworCQlyZXR2YWwgPSBzZXRfYXVkY2xrX2ZyZXEoY2xpZW50LCAqKHUzMiAqKWFyZyk7CisJCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpCisJCQljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4ODEwLCB+MHgxLCAwKTsKKwkJaWYgKHN0YXRlLT5hdWRfaW5wdXQgIT0gQ1gyNTg0MF9BVURJT19TRVJJQUwpIHsKKwkJCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHg4MDMsIH4weDEwLCAweDEwKTsKKwkJfQorCQlyZXR1cm4gcmV0dmFsOwogCiAJY2FzZSBWSURJT0NfR19DVFJMOgogCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmMKaW5kZXggYTk2MWJiMi4uNWMyMDM2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuYwpAQCAtMTAsNiArMTAsOSBAQAogICoKICAqIFZCSSBzdXBwb3J0IGJ5IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPi4KICAqCisgKiBOVFNDIHNsaWNlZCBWQkkgc3VwcG9ydCBieSBDaHJpc3RvcGhlciBOZXVmZWxkIDx0ZWxldmlzaW9uQGNuZXVmZWxkLmNhPgorICogd2l0aCBhZGRpdGlvbmFsIGZpeGVzIGJ5IEhhbnMgVmVya3VpbCA8aHZlcmt1aWxAeHM0YWxsLm5sPi4KKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKQEAgLTQzLDcgKzQ2LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7IDB4ODggPj4gMSwgSTJDX0NMSUVOVF9FTkQgfTsKIAogCi1zdGF0aWMgaW50IGN4MjU4NDBfZGVidWc7CitpbnQgY3gyNTg0MF9kZWJ1ZzsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLGN4MjU4NDBfZGVidWcsIGludCwgMDY0NCk7CiAKQEAgLTEwNSw3ICsxMDgsNyBAQAogCSAgICAoYnVmZmVyWzJdIDw8IDgpIHwgYnVmZmVyWzNdOwogfQogCi1pbnQgY3gyNTg0MF9hbmRfb3Ioc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHU4IGFuZF9tYXNrLAoraW50IGN4MjU4NDBfYW5kX29yKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBhZGRyLCB1bnNpZ25lZCBhbmRfbWFzaywKIAkJICAgdTggb3JfdmFsdWUpCiB7CiAJcmV0dXJuIGN4MjU4NDBfd3JpdGUoY2xpZW50LCBhZGRyLApAQCAtMTE3LDcgKzEyMCw4IEBACiAKIHN0YXRpYyBpbnQgc2V0X2lucHV0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGVudW0gY3gyNTg0MF92aWRlb19pbnB1dCB2aWRfaW5wdXQsCiAJCQkJCQllbnVtIGN4MjU4NDBfYXVkaW9faW5wdXQgYXVkX2lucHV0KTsKLXN0YXRpYyB2b2lkIGxvZ19zdGF0dXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CitzdGF0aWMgdm9pZCBsb2dfYXVkaW9fc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOworc3RhdGljIHZvaWQgbG9nX3ZpZGVvX3N0YXR1cyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIApAQCAtMTQ3LDYgKzE1MSwzMyBAQAogCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDE1ZCwgMHhlMSk7CiB9CiAKK3N0YXRpYyB2b2lkIGN4MjU4MzZfaW5pdGlhbGl6ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCS8qIHJlc2V0IGNvbmZpZ3VyYXRpb24gaXMgZGVzY3JpYmVkIG9uIHBhZ2UgMy03NyBvZiB0aGUgQ1gyNTgzNiBkYXRhc2hlZXQgKi8KKwkvKiAyLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgwMDAsIH4weDAxLCAweDAxKTsKKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MDAwLCB+MHgwMSwgMHgwMCk7CisJLyogM2EuICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1YSwgfjB4NzAsIDB4MDApOworCS8qIDNiLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxNWIsIH4weDFlLCAweDA2KTsKKwkvKiAzYy4gKi8KKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTU5LCB+MHgwMiwgMHgwMik7CisJLyogM2QuICovCisJLyogVGhlcmUgc2hvdWxkIGJlIGEgMTAtdXMgZGVsYXkgaGVyZSwgYnV0IHNpbmNlIHRoZQorCSAgIGkyYyBidXMgYWxyZWFkeSBoYXMgYSAxMC11cyBkZWxheSB3ZSBkb24ndCBuZWVkIHRvIGRvCisJICAgYW55dGhpbmcgKi8KKwkvKiAzZS4gKi8KKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTU5LCB+MHgwMiwgMHgwMCk7CisJLyogM2YuICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1OSwgfjB4YzAsIDB4YzApOworCS8qIDNnLiAqLworCWN4MjU4NDBfYW5kX29yKGNsaWVudCwgMHgxNTksIH4weDAxLCAweDAwKTsKKwljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4MTU5LCB+MHgwMSwgMHgwMSk7CisJLyogM2guICovCisJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDE1YiwgfjB4MWUsIDB4MTApOworfQorCiBzdGF0aWMgdm9pZCBjeDI1ODQwX2luaXRpYWxpemUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGxvYWRmdykKIHsKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTIyMCwxNyArMjUxLDcgQEAKIAljeDI1ODQwX2FuZF9vcihjbGllbnQsIDB4NDAxLCB+MHg2MCwgMCk7CiAJY3gyNTg0MF9hbmRfb3IoY2xpZW50LCAweDQwMSwgfjB4NjAsIDB4NjApOwogCi0JLyogTm90ZTogcGVyaGFwcyBWNEwyX1NURF9QQUxfTSBzaG91bGQgYmUgaGFuZGxlZCBhcyBWNEwyX1NURF9OVFNDCi0JICAgaW5zdGVhZCBvZiBWNEwyX1NURF9QQUwuIFNvbWVvbmUgbmVlZHMgdG8gdGVzdCB0aGlzLiAqLwotCWlmIChzdGQgJiBWNEwyX1NURF9QQUwpIHsKLQkJLyogRm9sbG93IHR1bmVyIGNoYW5nZSBwcm9jZWR1cmUgZm9yIFBBTCAqLwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDgsIDB4ZmYpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MTApOwotCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKLQkJLyogU2VsZWN0IGF1dG9kZXRlY3QgZm9yIFNFQ0FNICovCi0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwOCwgMHhmZik7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDgwYiwgMHgxMCk7Ci0JfSBlbHNlIGlmIChzdGQgJiBWNEwyX1NURF9OVFNDKSB7CisJaWYgKHN0ZCAmIFY0TDJfU1REXzUyNV82MCkgewogCQkvKiBDZXJ0YWluIEhhdXBwYXVnZSBQVlIxNTAgbW9kZWxzIGhhdmUgYSBoYXJkd2FyZSBidWcKIAkJICAgdGhhdCBjYXVzZXMgYXVkaW8gdG8gZHJvcCBvdXQuIEZvciB0aGVzZSBtb2RlbHMgdGhlCiAJCSAgIGF1ZGlvIHN0YW5kYXJkIG11c3QgYmUgc2V0IGV4cGxpY2l0bHkuCkBAIC0yNDksNiArMjcwLDE0IEBACiAJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDgsIGh3X2ZpeCA/IDB4MWYgOiAweGY2KTsKIAkJfQogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MDApOworCX0gZWxzZSBpZiAoc3RkICYgVjRMMl9TVERfUEFMKSB7CisJCS8qIEZvbGxvdyB0dW5lciBjaGFuZ2UgcHJvY2VkdXJlIGZvciBQQUwgKi8KKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODA4LCAweGZmKTsKKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4ODBiLCAweDEwKTsKKwl9IGVsc2UgaWYgKHN0ZCAmIFY0TDJfU1REX1NFQ0FNKSB7CisJCS8qIFNlbGVjdCBhdXRvZGV0ZWN0IGZvciBTRUNBTSAqLworCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MDgsIDB4ZmYpOworCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg4MGIsIDB4MTApOwogCX0KIAogCWlmIChjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwMykgJiAweDEwKSB7CkBAIC0zMTksOCArMzQ4LDEwIEBACiAKIAlzdGF0ZS0+dmlkX2lucHV0ID0gdmlkX2lucHV0OwogCXN0YXRlLT5hdWRfaW5wdXQgPSBhdWRfaW5wdXQ7Ci0JY3gyNTg0MF9hdWRpb19zZXRfcGF0aChjbGllbnQpOwotCWlucHV0X2NoYW5nZShjbGllbnQpOworCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpIHsKKwkJY3gyNTg0MF9hdWRpb19zZXRfcGF0aChjbGllbnQpOworCQlpbnB1dF9jaGFuZ2UoY2xpZW50KTsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM1NCw2ICszODUsOCBAQAogCQl9CiAJfQogCisJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJjaGFuZ2luZyB2aWRlbyBzdGQgdG8gZm10ICVpXG4iLGZtdCk7CisKIAkvKiBGb2xsb3cgc3RlcCA5IG9mIHNlY3Rpb24gMy4xNiBpbiB0aGUgY3gyNTg0MCBkYXRhc2hlZXQuCiAJICAgV2l0aG91dCB0aGlzIFBBTCBtYXkgZGlzcGxheSBhIHZlcnRpY2FsIGdob3N0aW5nIGVmZmVjdC4KIAkgICBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgd2l0aCB0aGUgWXVhbiBNUEM2MjIuICovCkBAIC0zNzAsNiArNDAzLDcgQEAKIAogdjRsMl9zdGRfaWQgY3gyNTg0MF9nZXRfdjRsc3RkKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50KQogeworCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCS8qIGNoZWNrIFZJRF9GTVRfU0VMIGZpcnN0ICovCiAJdTggZm10ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MDApICYgMHhmOwogCkBAIC0zODMsNyArNDE3LDcgQEAKIAl7CiAJCS8qIGlmIHRoZSBhdWRpbyBzdGQgaXMgQTItTSwgdGhlbiB0aGlzIGlzIHRoZSBTb3V0aCBLb3JlYW4KIAkJICAgTlRTQyBzdGFuZGFyZCAqLwotCQlpZiAoY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDUpID09IDIpCisJCWlmICghc3RhdGUtPmlzX2N4MjU4MzYgJiYgY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDUpID09IDIpCiAJCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NX0tSOwogCQlyZXR1cm4gVjRMMl9TVERfTlRTQ19NOwogCX0KQEAgLTQ1Niw2ICs0OTAsOCBAQAogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gY3gyNTg0MF9hdWRpbyhjbGllbnQsIFZJRElPQ19TX0NUUkwsIGN0cmwpOwogCiAJZGVmYXVsdDoKQEAgLTQ5MCw2ICs1MjYsOCBAQAogCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgogCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRToKIAljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlyZXR1cm4gY3gyNTg0MF9hdWRpbyhjbGllbnQsIFZJRElPQ19HX0NUUkwsIGN0cmwpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTc5LDkxICs2MTcsNiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIGN4MjU4NDBfcWN0cmxbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQlJJR0hUTkVTUywKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJCcmlnaHRuZXNzIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDI1NSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDEyOCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJDb250cmFzdCIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxMjcsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9TQVRVUkFUSU9OLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIlNhdHVyYXRpb24iLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMTI3LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gNjQsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQl9LCB7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfSFVFLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkh1ZSIsCi0JCS5taW5pbXVtICAgICAgID0gLTEyOCwKLQkJLm1heGltdW0gICAgICAgPSAxMjcsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAwLAotCQkuZmxhZ3MgCSAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDU4ODgwLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0UsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiQmFsYW5jZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQl9LCB7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fTVVURSwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX0JBU1MsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiQmFzcyIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0FVRElPX1RSRUJMRSwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCQkubmFtZSAgICAgICAgICA9ICJUcmVibGUiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDMyNzY4LAotCX0sCi19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCiBzdGF0aWMgaW50IGN4MjU4NDBfY29tbWFuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgdm9pZCAqYXJnKQogewpAQCAtNzA2LDggKzY1OSw4IEBACiAKIAljYXNlIFZJRElPQ19TVFJFQU1PTjoKIAkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJlbmFibGUgb3V0cHV0XG4iKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTE1LCAweDhjKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTE2LCAweDA3KTsKKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTE1LCBzdGF0ZS0+aXNfY3gyNTgzNiA/IDB4MGMgOiAweDhjKTsKKwkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4MTE2LCBzdGF0ZS0+aXNfY3gyNTgzNiA/IDB4MDQgOiAweDA3KTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19TVFJFQU1PRkY6CkBAIC03MTcsNyArNjcwLDkgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQlsb2dfc3RhdHVzKGNsaWVudCk7CisJCWxvZ192aWRlb19zdGF0dXMoY2xpZW50KTsKKwkJaWYgKCFzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCWxvZ19hdWRpb19zdGF0dXMoY2xpZW50KTsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19HX0NUUkw6CkBAIC03MjksMTMgKzY4NCwyOSBAQAogCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAl7CiAJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN4MjU4NDBfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBjeDI1ODQwX3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmY3gyNTg0MF9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQlzd2l0Y2ggKHFjLT5pZCkgeworCQkJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgorCQkJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCWNhc2UgVjRMMl9DSURfSFVFOgorCQkJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKHFjLT5pZCkgeworCQkJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0JBU1M6CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX1RSRUJMRToKKwkJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NjAsMzEgKzczMSw0MSBAQAogCQlyZXR1cm4gc2V0X2lucHV0KGNsaWVudCwgcm91dGUtPmlucHV0LCBzdGF0ZS0+YXVkX2lucHV0KTsKIAogCWNhc2UgVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkc6CisJCWlmIChzdGF0ZS0+aXNfY3gyNTgzNikKKwkJCXJldHVybiAtRUlOVkFMOwogCQlyb3V0ZS0+aW5wdXQgPSBzdGF0ZS0+YXVkX2lucHV0OwogCQlyb3V0ZS0+b3V0cHV0ID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIFZJRElPQ19JTlRfU19BVURJT19ST1VUSU5HOgorCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIHNldF9pbnB1dChjbGllbnQsIHN0YXRlLT52aWRfaW5wdXQsIHJvdXRlLT5pbnB1dCk7CiAKIAljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKLQkJaW5wdXRfY2hhbmdlKGNsaWVudCk7CisJCWlmICghc3RhdGUtPmlzX2N4MjU4MzYpIHsKKwkJCWlucHV0X2NoYW5nZShjbGllbnQpOworCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBWSURJT0NfR19UVU5FUjoKIAl7Ci0JCXU4IG1vZGUgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwNCk7Ci0JCXU4IHZwcmVzID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MGEpICYgMHgxMDsKKwkJdTggdnByZXMgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwZSkgJiAweDIwOworCQl1OCBtb2RlOwogCQlpbnQgdmFsID0gMDsKIAogCQlpZiAoc3RhdGUtPnJhZGlvKQogCQkJYnJlYWs7CiAKKwkJdnQtPnNpZ25hbCA9IHZwcmVzID8gMHhmZmZmIDogMHgwOworCQlpZiAoc3RhdGUtPmlzX2N4MjU4MzYpCisJCQlicmVhazsKKwogCQl2dC0+Y2FwYWJpbGl0eSB8PQogCQkgICAgVjRMMl9UVU5FUl9DQVBfU1RFUkVPIHwgVjRMMl9UVU5FUl9DQVBfTEFORzEgfAogCQkgICAgVjRMMl9UVU5FUl9DQVBfTEFORzIgfCBWNEwyX1RVTkVSX0NBUF9TQVA7CiAKLQkJdnQtPnNpZ25hbCA9IHZwcmVzID8gMHhmZmZmIDogMHgwOworCQltb2RlID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDQpOwogCiAJCS8qIGdldCByeHN1YmNoYW5zIGFuZCBhdWRtb2RlICovCiAJCWlmICgobW9kZSAmIDB4ZikgPT0gMSkKQEAgLTgwNCw3ICs3ODUsNyBAQAogCX0KIAogCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JCWlmIChzdGF0ZS0+cmFkaW8pCisJCWlmIChzdGF0ZS0+cmFkaW8gfHwgc3RhdGUtPmlzX2N4MjU4MzYpCiAJCQlicmVhazsKIAogCQlzd2l0Y2ggKHZ0LT5hdWRtb2RlKSB7CkBAIC04NDYsMTIgKzgyNywxNCBAQAogCQlyZXR1cm4gc2V0X3Y0bGZtdChjbGllbnQsIChzdHJ1Y3QgdjRsMl9mb3JtYXQgKilhcmcpOwogCiAJY2FzZSBWSURJT0NfSU5UX1JFU0VUOgotCQljeDI1ODQwX2luaXRpYWxpemUoY2xpZW50LCAwKTsKKwkJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQkJY3gyNTgzNl9pbml0aWFsaXplKGNsaWVudCk7CisJCWVsc2UKKwkJCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQsIDApOwogCQlicmVhazsKIAogCWNhc2UgVklESU9DX0lOVF9HX0NISVBfSURFTlQ6Ci0JCSooZW51bSB2NGwyX2NoaXBfaWRlbnQgKilhcmcgPQotCQkJVjRMMl9JREVOVF9DWDI1ODQwICsgKChjeDI1ODQwX3JlYWQoY2xpZW50LCAweDEwMCkgPj4gNCkgJiAweGYpOworCQkqKGVudW0gdjRsMl9jaGlwX2lkZW50ICopYXJnID0gc3RhdGUtPmlkOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC04NzAsNiArODUzLDcgQEAKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwogCXN0cnVjdCBjeDI1ODQwX3N0YXRlICpzdGF0ZTsKKwllbnVtIHY0bDJfY2hpcF9pZGVudCBpZDsKIAl1MTYgZGV2aWNlX2lkOwogCiAJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcwpAQCAtODc4LDEwICs4NjIsMTEgQEAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX0kyQykpCiAJCXJldHVybiAwOwogCi0JY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19jbGllbnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2xpZW50ID09IDApCisJc3RhdGUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSAwKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWNsaWVudCA9ICZzdGF0ZS0+YzsKIAljbGllbnQtPmFkZHIgPSBhZGRyZXNzOwogCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CiAJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcl9jeDI1ODQwOwpAQCAtODkzLDEwICs4NzgsMTggQEAKIAlkZXZpY2VfaWQgfD0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHgxMDApOwogCiAJLyogVGhlIGhpZ2ggYnl0ZSBvZiB0aGUgZGV2aWNlIElEIHNob3VsZCBiZQotCSAqIDB4ODQgaWYgY2hpcCBpcyBwcmVzZW50ICovCi0JaWYgKChkZXZpY2VfaWQgJiAweGZmMDApICE9IDB4ODQwMCkgeworCSAqIDB4ODMgZm9yIHRoZSBjeDI1ODN4IGFuZCAweDg0IGZvciB0aGUgY3gyNTg0eCAqLworCWlmICgoZGV2aWNlX2lkICYgMHhmZjAwKSA9PSAweDgzMDApIHsKKwkJaWQgPSBWNEwyX0lERU5UX0NYMjU4MzYgKyAoKGRldmljZV9pZCA+PiA0KSAmIDB4ZikgLSA2OworCQlzdGF0ZS0+aXNfY3gyNTgzNiA9IDE7CisJfQorCWVsc2UgaWYgKChkZXZpY2VfaWQgJiAweGZmMDApID09IDB4ODQwMCkgeworCQlpZCA9IFY0TDJfSURFTlRfQ1gyNTg0MCArICgoZGV2aWNlX2lkID4+IDQpICYgMHhmKTsKKwkJc3RhdGUtPmlzX2N4MjU4MzYgPSAwOworCX0KKwllbHNlIHsKIAkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJjeDI1ODQwIG5vdCBmb3VuZFxuIik7Ci0JCWtmcmVlKGNsaWVudCk7CisJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC05MDUsMjEgKzg5OCwxOSBAQAogCQkgICAgKGRldmljZV9pZCAmIDB4MGYpIDwgMyA/IChkZXZpY2VfaWQgJiAweDBmKSArIDEgOiAzLAogCQkgICAgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKIAotCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGN4MjU4NDBfc3RhdGUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3RhdGUgPT0gTlVMTCkgewotCQlrZnJlZShjbGllbnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBzdGF0ZSk7Ci0JbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IGN4MjU4NDBfc3RhdGUpKTsKIAlzdGF0ZS0+dmlkX2lucHV0ID0gQ1gyNTg0MF9DT01QT1NJVEU3OwogCXN0YXRlLT5hdWRfaW5wdXQgPSBDWDI1ODQwX0FVRElPODsKIAlzdGF0ZS0+YXVkY2xrX2ZyZXEgPSA0ODAwMDsKIAlzdGF0ZS0+cHZyMTUwX3dvcmthcm91bmQgPSAwOwogCXN0YXRlLT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX0xBTkcxOworCXN0YXRlLT52YmlfbGluZV9vZmZzZXQgPSA4OworCXN0YXRlLT5pZCA9IGlkOwogCi0JY3gyNTg0MF9pbml0aWFsaXplKGNsaWVudCwgMSk7CisJaWYgKHN0YXRlLT5pc19jeDI1ODM2KQorCQljeDI1ODM2X2luaXRpYWxpemUoY2xpZW50KTsKKwllbHNlCisJCWN4MjU4NDBfaW5pdGlhbGl6ZShjbGllbnQsIDEpOwogCiAJaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKIApAQCAtOTQ0LDcgKzkzNSw2IEBACiAJfQogCiAJa2ZyZWUoc3RhdGUpOwotCWtmcmVlKGNsaWVudCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTk3Nyw3ICs5NjcsNyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBsb2dfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBsb2dfdmlkZW9fc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGZtdF9zdHJzW10gPSB7CiAJCSIweDAiLApAQCAtOTg5LDkgKzk3OSwzNiBAQAogCX07CiAKIAlzdHJ1Y3QgY3gyNTg0MF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQl1OCBtaWNyb2N0cmxfdmlkZm10ID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MGEpOwogCXU4IHZpZGZtdF9zZWwgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDQwMCkgJiAweGY7CiAJdTggZ2VuX3N0YXQxID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg0MGQpOworCXU4IGdlbl9zdGF0MiA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4NDBlKTsKKwlpbnQgdmlkX2lucHV0ID0gc3RhdGUtPnZpZF9pbnB1dDsKKworCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvIHNpZ25hbDogICAgICAgICAgICAgICVzcHJlc2VudFxuIiwKKwkJICAgIChnZW5fc3RhdDIgJiAweDIwKSA/ICIiIDogIm5vdCAiKTsKKwl2NGxfaW5mbyhjbGllbnQsICJEZXRlY3RlZCBmb3JtYXQ6ICAgICAgICAgICAlc1xuIiwKKwkJICAgIGZtdF9zdHJzW2dlbl9zdGF0MSAmIDB4Zl0pOworCisJdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHN0YW5kYXJkOiAgICAgICAgJXNcbiIsCisJCSAgICB2aWRmbXRfc2VsID8gZm10X3N0cnNbdmlkZm10X3NlbF0gOiAiYXV0b21hdGljIGRldGVjdGlvbiIpOworCisJaWYgKHZpZF9pbnB1dCA+PSBDWDI1ODQwX0NPTVBPU0lURTEgJiYKKwkgICAgdmlkX2lucHV0IDw9IENYMjU4NDBfQ09NUE9TSVRFOCkgeworCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBDb21wb3NpdGUgJWRcbiIsCisJCQl2aWRfaW5wdXQgLSBDWDI1ODQwX0NPTVBPU0lURTEgKyAxKTsKKwl9IGVsc2UgeworCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBTLVZpZGVvIChMdW1hIEluJWQsIENocm9tYSBJbiVkKVxuIiwKKwkJCSh2aWRfaW5wdXQgJiAweGYwKSA+PiA0LCAodmlkX2lucHV0ICYgMHhmMDApID4+IDgpOworCX0KKworCXY0bF9pbmZvKGNsaWVudCwgIlNwZWNpZmllZCBhdWRpb2Nsb2NrIGZyZXE6ICVkIEh6XG4iLCBzdGF0ZS0+YXVkY2xrX2ZyZXEpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBsb2dfYXVkaW9fc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdTggZG93bmxvYWRfY3RsID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDMpOwogCXU4IG1vZF9kZXRfc3RhdDAgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwNCk7CiAJdTggbW9kX2RldF9zdGF0MSA9IGN4MjU4NDBfcmVhZChjbGllbnQsIDB4ODA1KTsKQEAgLTk5OSwxNSArMTAxNiw5IEBACiAJdTggcHJlZl9tb2RlID0gY3gyNTg0MF9yZWFkKGNsaWVudCwgMHg4MDkpOwogCXU4IGFmYzAgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDgwYik7CiAJdTggbXV0ZV9jdGwgPSBjeDI1ODQwX3JlYWQoY2xpZW50LCAweDhkMyk7Ci0JaW50IHZpZF9pbnB1dCA9IHN0YXRlLT52aWRfaW5wdXQ7CiAJaW50IGF1ZF9pbnB1dCA9IHN0YXRlLT5hdWRfaW5wdXQ7CiAJY2hhciAqcDsKIAotCXY0bF9pbmZvKGNsaWVudCwgIlZpZGVvIHNpZ25hbDogICAgICAgICAgICAgICVzcHJlc2VudFxuIiwKLQkJICAgIChtaWNyb2N0cmxfdmlkZm10ICYgMHgxMCkgPyAiIiA6ICJub3QgIik7Ci0JdjRsX2luZm8oY2xpZW50LCAiRGV0ZWN0ZWQgZm9ybWF0OiAgICAgICAgICAgJXNcbiIsCi0JCSAgICBmbXRfc3Ryc1tnZW5fc3RhdDEgJiAweGZdKTsKLQogCXN3aXRjaCAobW9kX2RldF9zdGF0MCkgewogCWNhc2UgMHgwMDogcCA9ICJtb25vIjsgYnJlYWs7CiAJY2FzZSAweDAxOiBwID0gInN0ZXJlbyI7IGJyZWFrOwpAQCAtMTEwNywyNSArMTExOCwxMiBAQAogCQl2NGxfaW5mbyhjbGllbnQsICJDb25maWd1cmVkIGF1ZGlvIHN5c3RlbTogICAlc1xuIiwgcCk7CiAJfQogCi0JdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIHN0YW5kYXJkOiAgICAgICAgJXNcbiIsCi0JCSAgICB2aWRmbXRfc2VsID8gZm10X3N0cnNbdmlkZm10X3NlbF0gOiAiYXV0b21hdGljIGRldGVjdGlvbiIpOwotCi0JaWYgKHZpZF9pbnB1dCA+PSBDWDI1ODQwX0NPTVBPU0lURTEgJiYKLQkgICAgdmlkX2lucHV0IDw9IENYMjU4NDBfQ09NUE9TSVRFOCkgewotCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBDb21wb3NpdGUgJWRcbiIsCi0JCQl2aWRfaW5wdXQgLSBDWDI1ODQwX0NPTVBPU0lURTEgKyAxKTsKLQl9IGVsc2UgewotCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgdmlkZW8gaW5wdXQ6ICAgICBTLVZpZGVvIChMdW1hIEluJWQsIENocm9tYSBJbiVkKVxuIiwKLQkJCSh2aWRfaW5wdXQgJiAweGYwKSA+PiA0LCAodmlkX2lucHV0ICYgMHhmMDApID4+IDgpOwotCX0KIAlpZiAoYXVkX2lucHV0KSB7CiAJCXY0bF9pbmZvKGNsaWVudCwgIlNwZWNpZmllZCBhdWRpbyBpbnB1dDogICAgIFR1bmVyIChJbiVkKVxuIiwgYXVkX2lucHV0KTsKIAl9IGVsc2UgewogCQl2NGxfaW5mbyhjbGllbnQsICJTcGVjaWZpZWQgYXVkaW8gaW5wdXQ6ICAgICBFeHRlcm5hbFxuIik7CiAJfQogCi0JdjRsX2luZm8oY2xpZW50LCAiU3BlY2lmaWVkIGF1ZGlvY2xvY2sgZnJlcTogJWQgSHpcbiIsIHN0YXRlLT5hdWRjbGtfZnJlcSk7Ci0KIAlzd2l0Y2ggKHByZWZfbW9kZSAmIDB4ZikgewogCWNhc2UgMDogcCA9ICJtb25vL2xhbmd1YWdlIEEiOyBicmVhazsKIAljYXNlIDE6IHAgPSAibGFuZ3VhZ2UgQiI7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtY29yZS5oCmluZGV4IDE3MzY5MjkuLjI4MDQ5MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyNTg0MC9jeDI1ODQwLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC1jb3JlLmgKQEAgLTI0LDYgKzI0LDggQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KIAorZXh0ZXJuIGludCBjeDI1ODQwX2RlYnVnOworCiAvKiBFTkFCTEVfUFZSMTUwX1dPUktBUk9VTkQgYWN0aXZhdGVzIGEgd29ya2Fyb3VuZCBmb3IgYSBoYXJkd2FyZSBidWcgdGhhdCBpcwogICAgcHJlc2VudCBpbiBIYXVwcGF1Z2UgUFZSLTE1MCAoYW5kIHBvc3NpYmx5IFBWUi01MDApIGNhcmRzIHRoYXQgaGF2ZQogICAgY2VydGFpbiBOVFNDIHR1bmVycyAodHZlZXByb20gdHVuZXIgbW9kZWwgbnVtYmVycyA4NSwgOTkgYW5kIDExMikuIFRoZQpAQCAtMzMsMTIgKzM1LDE2IEBACiAjZGVmaW5lIENYMjU4NDBfQ0lEX0VOQUJMRV9QVlIxNTBfV09SS0FST1VORCAoVjRMMl9DSURfUFJJVkFURV9CQVNFKzApCiAKIHN0cnVjdCBjeDI1ODQwX3N0YXRlIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCBjOwogCWludCBwdnIxNTBfd29ya2Fyb3VuZDsKIAlpbnQgcmFkaW87CiAJZW51bSBjeDI1ODQwX3ZpZGVvX2lucHV0IHZpZF9pbnB1dDsKIAllbnVtIGN4MjU4NDBfYXVkaW9faW5wdXQgYXVkX2lucHV0OwogCXUzMiBhdWRjbGtfZnJlcTsKIAlpbnQgYXVkbW9kZTsKKwlpbnQgdmJpX2xpbmVfb2Zmc2V0OworCWVudW0gdjRsMl9jaGlwX2lkZW50IGlkOworCWludCBpc19jeDI1ODM2OwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ3LDcgKzUzLDcgQEAKIGludCBjeDI1ODQwX3dyaXRlNChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdTMyIHZhbHVlKTsKIHU4IGN4MjU4NDBfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkcik7CiB1MzIgY3gyNTg0MF9yZWFkNChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkcik7Ci1pbnQgY3gyNTg0MF9hbmRfb3Ioc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTE2IGFkZHIsIHU4IG1hc2ssIHU4IHZhbHVlKTsKK2ludCBjeDI1ODQwX2FuZF9vcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgYWRkciwgdW5zaWduZWQgbWFzaywgdTggdmFsdWUpOwogdjRsMl9zdGRfaWQgY3gyNTg0MF9nZXRfdjRsc3RkKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDI1ODQwL2N4MjU4NDAtdmJpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwppbmRleCA1N2ZlY2EyLi42Y2M4YmYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjU4NDAvY3gyNTg0MC12YmkuYwpAQCAtODQsNjcgKzg0LDE0MCBAQAogCiB2b2lkIGN4MjU4NDBfdmJpX3NldHVwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdjRsMl9zdGRfaWQgc3RkID0gY3gyNTg0MF9nZXRfdjRsc3RkKGNsaWVudCk7CisJaW50IGhibGFuayxoYWN0aXZlLGJ1cnN0LHZibGFuayx2YWN0aXZlLHNjLHZibGFuazY1NixzcmNfZGVjaW1hdGlvbjsKKwlpbnQgbHVtYV9scGYsdXZfbHBmLCBjb21iOworCXUzMiBwbGxfaW50LHBsbF9mcmFjLHBsbF9wb3N0OwogCisJLyogZGF0YXNoZWV0IHN0YXJ0dXAsIHN0ZXAgOGQgKi8KIAlpZiAoc3RkICYgflY0TDJfU1REX05UU0MpIHsKLQkJLyogZGF0YXNoZWV0IHN0YXJ0dXAsIHN0ZXAgOGQgKi8KIAkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDlmLCAweDExKTsKLQotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzAsIDB4ODQpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzEsIDB4MDApOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzIsIDB4MmQpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzMsIDB4NWQpOwotCi0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NCwgMHgyNCk7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NSwgMHg0MCk7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NiwgMHgyNCk7Ci0JCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NywgMHgyOCk7Ci0KLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc4LCAweDFmKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc5LCAweDAyKTsKLQotCQlpZiAoc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3YSwgMHg4MCk7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2IsIDB4MDApOwotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdjLCAweDVmKTsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3ZCwgMHg0Mik7Ci0JCX0gZWxzZSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2EsIDB4OTApOwotCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdiLCAweDIwKTsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3YywgMHg2Myk7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2QsIDB4ODIpOwotCQl9Ci0KLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdlLCAweDBhKTsKLQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdmLCAweDAxKTsKIAl9IGVsc2UgewotCQkvKiBkYXRhc2hlZXQgc3RhcnR1cCwgc3RlcCA4ZCAqLwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0OWYsIDB4MTQpOworCX0KIAotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzAsIDB4N2EpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzEsIDB4MDApOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzIsIDB4MmQpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzMsIDB4NWIpOworCWlmIChzdGQgJiBWNEwyX1NURF82MjVfNTApIHsKKwkJaGJsYW5rPTB4MDg0OworCQloYWN0aXZlPTB4MmQwOworCQlidXJzdD0weDVkOworCQl2Ymxhbms9MHgwMjQ7CisJCXZhY3RpdmU9MHgyNDQ7CisJCXZibGFuazY1Nj0weDI4OworCQlzcmNfZGVjaW1hdGlvbj0weDIxZjsKIAotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzQsIDB4MWEpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzUsIDB4NzApOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzYsIDB4MWUpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzcsIDB4MWUpOworCQlsdW1hX2xwZj0yOworCQlpZiAoc3RkICYgVjRMMl9TVERfU0VDQU0pIHsKKwkJCXV2X2xwZj0wOworCQkJY29tYj0wOworCQkJc2M9MHgwYTQyNWY7CisJCX0gZWxzZSB7CisJCQl1dl9scGY9MTsKKwkJCWNvbWI9MHgyMDsKKwkJCXNjPTB4MGE4MjYzOworCQl9CisJfSBlbHNlIHsKKwkJaGFjdGl2ZT03MjA7CisJCWhibGFuaz0xMjI7CisJCXZhY3RpdmU9NDg3OworCQlsdW1hX2xwZj0xOworCQl1dl9scGY9MTsKIAotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzgsIDB4MWYpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzksIDB4MDIpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2EsIDB4NTApOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2IsIDB4NjYpOworCQlzcmNfZGVjaW1hdGlvbj0weDIxZjsKKwkJaWYgKHN0ZCA9PSBWNEwyX1NURF9QQUxfTSkgeworCQkJdmJsYW5rPTIwOworCQkJdmJsYW5rNjU2PTI0OworCQkJYnVyc3Q9MHg2MTsKKwkJCWNvbWI9MHgyMDsKIAotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2MsIDB4MWYpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2QsIDB4N2MpOwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2UsIDB4MDgpOworCQkJc2M9NTU1NDUyOworCQl9IGVsc2UgeworCQkJdmJsYW5rPTI2OworCQkJdmJsYW5rNjU2PTI2OworCQkJYnVyc3Q9MHg1YjsKKwkJCWNvbWI9MHg2NjsKKwkJCXNjPTU1NjA2MzsKKwkJfQorCX0KKworCS8qIERFQlVHOiBEaXNwbGF5cyBjb25maWd1cmVkIFBMTCBmcmVxdWVuY3kgKi8KKwlwbGxfaW50PWN4MjU4NDBfcmVhZChjbGllbnQsIDB4MTA4KTsKKwlwbGxfZnJhYz1jeDI1ODQwX3JlYWQ0KGNsaWVudCwgMHgxMGMpJjB4MWZmZmZmZjsKKwlwbGxfcG9zdD1jeDI1ODQwX3JlYWQoY2xpZW50LCAweDEwOSk7CisJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsCisJCQkJIlBMTCByZWdzID0gaW50OiAldSwgZnJhYzogJXUsIHBvc3Q6ICV1XG4iLAorCQkJCXBsbF9pbnQscGxsX2ZyYWMscGxsX3Bvc3QpOworCisJaWYgKHBsbF9wb3N0KSB7CisJCWludCBmaW4sIGZzYzsKKwkJaW50IHBsbD0gKDI4NjM2MzYzTCooKCgodTY0KXBsbF9pbnQpPDwyNUwpK3BsbF9mcmFjKSkgPj4yNUw7CisKKwkJcGxsLz1wbGxfcG9zdDsKKwkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJQTEwgPSAlZC4lMDZkIE1IelxuIiwKKwkJCQkJCXBsbC8xMDAwMDAwLCBwbGwlMTAwMDAwMCk7CisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiUExMLzggPSAlZC4lMDZkIE1IelxuIiwKKwkJCQkJCXBsbC84MDAwMDAwLCAocGxsLzgpJTEwMDAwMDApOworCisJCWZpbj0oKHU2NClzcmNfZGVjaW1hdGlvbipwbGwpPj4xMjsKKwkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJBREMgU2FtcGxpbmcgZnJlcSA9ICIKKwkJCQkJCSIlZC4lMDZkIE1IelxuIiwKKwkJCQkJCWZpbi8xMDAwMDAwLGZpbiUxMDAwMDAwKTsKKworCQlmc2M9ICgoKHU2NClzYykqcGxsKSA+PiAyNEw7CisJCXY0bF9kYmcoMSwgY3gyNTg0MF9kZWJ1ZywgY2xpZW50LCAiQ2hyb21hIHN1Yi1jYXJyaWVyIGZyZXEgPSAiCisJCQkJCQkiJWQuJTA2ZCBNSHpcbiIsCisJCQkJCQlmc2MvMTAwMDAwMCxmc2MlMTAwMDAwMCk7CisKKwkJdjRsX2RiZygxLCBjeDI1ODQwX2RlYnVnLCBjbGllbnQsICJoYmxhbmsgJWksIGhhY3RpdmUgJWksICIKKwkJCSJ2YmxhbmsgJWkgLCB2YWN0aXZlICVpLCB2Ymxhbms2NTYgJWksIHNyY19kZWMgJWksIgorCQkJImJ1cnN0IDB4JTAyeCwgbHVtYV9scGYgJWksIHV2X2xwZiAlaSwgY29tYiAweCUwMngsIgorCQkJIiBzYyAweCUwNnhcbiIsCisJCQloYmxhbmssIGhhY3RpdmUsIHZibGFuaywgdmFjdGl2ZSwgdmJsYW5rNjU2LAorCQkJc3JjX2RlY2ltYXRpb24sIGJ1cnN0LCBsdW1hX2xwZiwgdXZfbHBmLCBjb21iLCBzYyk7CisJfQorCisJLyogU2V0cyBob3Jpem9udGFsIGJsYW5raW5nIGRlbGF5IGFuZCBhY3RpdmUgbGluZXMgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzAsIGhibGFuayk7CisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcxLCAweGZmJigoKGhibGFuaz4+OCkmMHgzKXwoaGFjdGl2ZSA8PDQpKSk7CisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDcyLCBoYWN0aXZlPj40KTsKKworCS8qIFNldHMgYnVyc3QgZ2F0ZSBkZWxheSAqLworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3MywgYnVyc3QpOworCisJLyogU2V0cyB2ZXJ0aWNhbCBibGFua2luZyBkZWxheSBhbmQgYWN0aXZlIGR1cmF0aW9uICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc0LCB2YmxhbmspOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NSwgMHhmZiYoKCh2Ymxhbms+PjgpJjB4Myl8KHZhY3RpdmUgPDw0KSkpOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NiwgdmFjdGl2ZT4+NCk7CisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc3LCB2Ymxhbms2NTYpOworCisJLyogU2V0cyBzcmMgZGVjaW1hdGlvbiByYXRlICovCisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc4LCAweGZmJnNyY19kZWNpbWF0aW9uKTsKKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0NzksIDB4ZmYmKHNyY19kZWNpbWF0aW9uPj44KSk7CisKKwkvKiBTZXRzIEx1bWEgYW5kIFVWIExvdyBwYXNzIGZpbHRlcnMgKi8KKwljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2EsIGx1bWFfbHBmPDw2fCgodXZfbHBmPDw0KSYweDMwKSk7CisKKwkvKiBFbmFibGVzIGNvbWIgZmlsdGVycyAqLworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3YiwgY29tYik7CisKKwkvKiBTZXRzIFNDIFN0ZXAqLworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3Yywgc2MpOworCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3ZCwgMHhmZiZzYz4+OCk7CisJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDdlLCAweGZmJnNjPj4xNik7CisKKwkvKiBTZXRzIFZCSSBwYXJhbWV0ZXJzICovCisJaWYgKHN0ZCAmIFY0TDJfU1REXzYyNV81MCkgeworCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2YsIDB4MDEpOworCQlzdGF0ZS0+dmJpX2xpbmVfb2Zmc2V0ID0gNTsKKwl9IGVsc2UgewogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2YsIDB4MDApOworCQlzdGF0ZS0+dmJpX2xpbmVfb2Zmc2V0ID0gODsKIAl9CiB9CiAKIGludCBjeDI1ODQwX3ZiaShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CisJc3RydWN0IGN4MjU4NDBfc3RhdGUgKnN0YXRlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQ7CiAJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQgKnN2Ymk7CiAKQEAgLTE4Miw3ICsyNTUsNyBAQAogCiAJY2FzZSBWSURJT0NfU19GTVQ6CiAJewotCQlpbnQgaXNfcGFsID0gIShjeDI1ODQwX2dldF92NGxzdGQoY2xpZW50KSAmIFY0TDJfU1REX05UU0MpOworCQlpbnQgaXNfcGFsID0gIShjeDI1ODQwX2dldF92NGxzdGQoY2xpZW50KSAmIFY0TDJfU1REXzUyNV82MCk7CiAJCWludCB2Ymlfb2Zmc2V0ID0gaXNfcGFsID8gMSA6IDA7CiAJCWludCBpLCB4OwogCQl1OCBsY3JbMjRdOwpAQCAtMjExLDcgKzI4NCw3IEBACiAJCWN4MjU4NDBfdmJpX3NldHVwKGNsaWVudCk7CiAKIAkJLyogU2xpY2VkIFZCSSAqLwotCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MDQsIDB4MzYpOwkvKiBBbmNpbGxlcnkgZGF0YSAqLworCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MDQsIDB4MzIpOwkvKiBBbmNpbGxhcnkgZGF0YSAqLwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0MDYsIDB4MTMpOwogCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgMHg0N2YsIHZiaV9vZmZzZXQpOwogCkBAIC0yNDgsOCArMzIxLDE4IEBACiAJCQl9CiAJCX0KIAotCQlmb3IgKHggPSAxLCBpID0gMHg0MjQ7IGkgPD0gMHg0MzQ7IGkrKywgeCsrKSB7Ci0JCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgaSwgbGNyWzYgKyB4XSk7CisJCWlmIChpc19wYWwpIHsKKwkJCWZvciAoeCA9IDEsIGkgPSAweDQyNDsgaSA8PSAweDQzNDsgaSsrLCB4KyspIHsKKwkJCQljeDI1ODQwX3dyaXRlKGNsaWVudCwgaSwgbGNyWzYgKyB4XSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlmb3IgKHggPSAxLCBpID0gMHg0MjQ7IGkgPD0gMHg0MzA7IGkrKywgeCsrKSB7CisJCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIGksIGxjcls5ICsgeF0pOworCQkJfQorCQkJZm9yIChpID0gMHg0MzE7IGkgPD0gMHg0MzQ7IGkrKykgeworCQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCBpLCAwKTsKKwkJCX0KIAkJfQogCiAJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQzYywgMHgxNik7CkBAIC0yNTcsNyArMzQwLDcgQEAKIAkJaWYgKGlzX3BhbCkgewogCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc0LCAweDJhKTsKIAkJfSBlbHNlIHsKLQkJCWN4MjU4NDBfd3JpdGUoY2xpZW50LCAweDQ3NCwgMHgxYSArIDYpOworCQkJY3gyNTg0MF93cml0ZShjbGllbnQsIDB4NDc0LCAweDIyKTsKIAkJfQogCQlicmVhazsKIAl9CkBAIC0yNzgsNyArMzYxLDcgQEAKIAkJaWQxID0gcFstMV07CiAJCWlkMiA9IHBbMF0gJiAweGY7CiAJCWwgPSBwWzJdICYgMHgzZjsKLQkJbCArPSA1OworCQlsICs9IHN0YXRlLT52YmlfbGluZV9vZmZzZXQ7CiAJCXAgKz0gNDsKIAogCQlzd2l0Y2ggKGlkMikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwppbmRleCA2MzAyNzM5Li45MWUxYzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvS2NvbmZpZwpAQCAtMTEsNiArMTEsNyBAQAogCXNlbGVjdCBWSURFT19CVUYKIAlzZWxlY3QgVklERU9fVFVORVIKIAlzZWxlY3QgVklERU9fVFZFRVBST00KKwlzZWxlY3QgVklERU9fQ1gyMzQxWAogCXNlbGVjdCBWSURFT19JUgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eCBkcml2ZXIgZm9yIENvbmV4YW50IDIzODh4IGJhc2VkCkBAIC02MSw2ICs2Miw3IEBACiAJc2VsZWN0IERWQl9MR0RUMzMwWAogCXNlbGVjdCBEVkJfTlhUMjAwWAogCXNlbGVjdCBEVkJfQ1gyNDEyMworCXNlbGVjdCBEVkJfSVNMNjQyMQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYnVpbGRzIGN4ODgtZHZiIHdpdGggYWxsIGN1cnJlbnRseSBzdXBwb3J0ZWQgZnJvbnRlbmQKIAkgIGRlbW9kdWxhdG9ycy4gIElmIHlvdSB3aXNoIHRvIHR3ZWFrIHlvdXIgY29uZmlndXJhdGlvbiwgYW5kCkBAIC0xMzksNiArMTQxLDcgQEAKIAlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIFZJREVPX0NYODhfRFZCICYmICFWSURFT19DWDg4X0RWQl9BTExfRlJPTlRFTkRTCiAJc2VsZWN0IERWQl9DWDI0MTIzCisJc2VsZWN0IERWQl9JU0w2NDIxCiAJLS0taGVscC0tLQogCSAgVGhpcyBhZGRzIERWQi1TIHN1cHBvcnQgZm9yIGNhcmRzIGJhc2VkIG9uIHRoZQogCSAgQ29ubmV4YW50IDIzODh4IGNoaXAgYW5kIHRoZSBDWDI0MTIzIGRlbW9kdWxhdG9yLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCmluZGV4IDMyMGIzZDkuLjIxOTRjYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKQEAgLTQsNyArNCw3IEBACiAgKiAgUENJIGZ1bmN0aW9uICMxIG9mIHRoZSBjeDIzODh4LgogICoKICAqICAgIChjKSAyMDA1LDIwMDYgUmljYXJkbyBDZXJxdWVpcmEgPHY0bEBjZXJxdWVpcmEub3JnPgotICogICAgKGMpIDIwMDUgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPgorICogICAgKGMpIDIwMDUgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAgKiAgICBCYXNlZCBvbiBhIGR1bW15IGN4ODggbW9kdWxlIGJ5IEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4KICAqICAgIEJhc2VkIG9uIGR1bW15LmMgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgogICoKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkFMU0EgZHJpdmVyIG1vZHVsZSBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiUmljYXJkbyBDZXJxdWVpcmEiKTsKLU1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4iKTsKK01PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoInt7Q29uZXhhbnQsMjM4ODF9LCIKIAkJCSJ7e0NvbmV4YW50LDIzODgyfSwiCkBAIC02OTYsNyArNjk2LDYgQEAKIAljaGlwLT5pcnEgPSAtMTsKIAlzcGluX2xvY2tfaW5pdCgmY2hpcC0+cmVnX2xvY2spOwogCi0JY3g4OF9yZXNldChjb3JlKTsKIAljaGlwLT5jb3JlID0gY29yZTsKIAogCS8qIGdldCBpcnEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKaW5kZXggZTEwMGQ4ZS4uNjdmZDMzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYmxhY2tiaXJkLmMKQEAgLTMwLDkgKzMwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvY3gyMzQxeC5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4L2N4MjM0MTYgYmFzZWQgbXBlZyBlbmNvZGVyIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJKZWxsZSBGb2tzIDxqZWxsZUBmb2tzLjhtLmNvbT4sIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKQEAgLTUzLDcgKzU0LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNkZWZpbmUgQkxBQ0tCSVJEX0ZJUk1fRU5DX0ZJTEVOQU1FICJibGFja2JpcmQtZnctZW5jLmJpbiIKICNkZWZpbmUgQkxBQ0tCSVJEX0ZJUk1fSU1BR0VfU0laRSAyNTYqMTAyNAogCiAvKiBkZWZpbmVzIGJlbG93IGFyZSBmcm9tIGl2dHYtZHJpdmVyLmggKi8KQEAgLTYzLDggKzYzLDYgQEAKIC8qIEZpcm13YXJlIEFQSSBjb21tYW5kcyAqLwogI2RlZmluZSBJVlRWX0FQSV9TVERfVElNRU9VVCA1MDAKIAotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1BJTkcgICAgICAgICAgICAgICAweDgwCi0jZGVmaW5lIEJMQUNLQklSRF9BUElfQkVHSU5fQ0FQVFVSRSAgICAgIDB4ODEKIGVudW0gYmxhY2tiaXJkX2NhcHR1cmVfdHlwZSB7CiAJQkxBQ0tCSVJEX01QRUdfQ0FQVFVSRSwKIAlCTEFDS0JJUkRfUkFXX0NBUFRVUkUsCkBAIC03OCwyMDUgKzc2LDI5IEBACiAJQkxBQ0tCSVJEX1JBV19CSVRTX1BBU1NUSFJVX0NBUFRVUkUgPSAweDA4LAogCUJMQUNLQklSRF9SQVdfQklUU19UT19IT1NUX0NBUFRVUkUgID0gMHgxMAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9FTkRfQ0FQVFVSRSAgICAgICAgMHg4MgogZW51bSBibGFja2JpcmRfY2FwdHVyZV9lbmQgewogCUJMQUNLQklSRF9FTkRfQVRfR09QLCAvKiBzdG9wIGF0IHRoZSBlbmQgb2YgZ29wLCBnZW5lcmF0ZSBpcnEgKi8KIAlCTEFDS0JJUkRfRU5EX05PVywgLyogc3RvcCBpbW1lZGlhdGVseSwgbm8gaXJxICovCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9BVURJT19JRCAgICAgICAweDg5Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1ZJREVPX0lEICAgICAgIDB4OEIKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfUENSX0lEICAgICAgICAgMHg4RAotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9GUkFNRVJBVEUgICAgICAweDhGCiBlbnVtIGJsYWNrYmlyZF9mcmFtZXJhdGUgewogCUJMQUNLQklSRF9GUkFNRVJBVEVfTlRTQ18zMCwgLyogTlRTQzogMzBmcHMgKi8KIAlCTEFDS0JJUkRfRlJBTUVSQVRFX1BBTF8yNSAgIC8qIFBBTDogMjVmcHMgKi8KIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1JFU09MVVRJT04gICAgIDB4OTEKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfVklERU9fQklUUkFURSAgMHg5NQotZW51bSBibGFja2JpcmRfdmlkZW9fYml0cmF0ZV90eXBlIHsKLQlCTEFDS0JJUkRfVklERU9fVkJSLAotCUJMQUNLQklSRF9WSURFT19DQlIKLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9QRUFLX1JBVEVfRElWSVNPUiA0MDAKLWVudW0gYmxhY2tiaXJkX211eF9yYXRlIHsKLQlCTEFDS0JJUkRfTVVYX1JBVEVfREVGQVVMVCwKLQkgLyogZHZkIG11eCByYXRlOiBtdWx0aXBseSBieSA0MDAgdG8gZ2V0IHRoZSBhY3R1YWwgcmF0ZSAqLwotCUJMQUNLQklSRF9NVVhfUkFURV9EVkQgPSAyNTIwMAotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfR09QX1NUUlVDVFVSRSAgMHg5NwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9BU1BFQ1RfUkFUSU8gICAweDk5Ci1lbnVtIGJsYWNrYmlyZF9hc3BlY3RfcmF0aW8gewotCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fRk9SQklEREVOLAotCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fMV8xX1NRVUFSRSwKLQlCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzRfMywKLQlCTEFDS0JJUkRfQVNQRUNUX1JBVElPXzE2XzksCi0JQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18yMjFfMTAwLAotCUJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fUkVTRVJWRUQKLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0ROUl9NT0RFICAgICAgIDB4OUIKLWVudW0gYmxhY2tiaXJkX2Rucl9iaXRzIHsKLQlCTEFDS0JJUkRfRE5SX0JJVFNfTUFOVUFMLAotCUJMQUNLQklSRF9ETlJfQklUU19BVVRPX1NQQVRJQUwsCi0JQkxBQ0tCSVJEX0ROUl9CSVRTX0FVVE9fVEVNUE9SQUwsCi0JQkxBQ0tCSVJEX0ROUl9CSVRTX0FVVE8KLX07Ci1lbnVtIGJsYWNrYmlyZF9tZWRpYW5fZmlsdGVyIHsKLQlCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESVNBQkxFRCwKLQlCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9IT1JJWk9OVEFMLAotCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX1ZFUlRJQ0FMLAotCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX0hWLAotCUJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJQUdPTkFMCi19OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9NQU5VQUxfRE5SICAgICAweDlECi0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0ROUl9NRURJQU4gICAgIDB4OUYKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfU1BBVElBTF9GSUxURVIgMHhBMQotZW51bSBibGFja2JpcmRfc3BhdGlhbF9maWx0ZXJfbHVtYSB7Ci0JQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0xVTUFfRElTQUJMRUQsCi0JQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0xVTUFfMURfSE9SSVosCi0JQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0xVTUFfMURfVkVSVCwKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8yRF9IViwgLyogc2VwYXJhYmxlLCBkZWZhdWx0ICovCi0JQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0xVTUFfMkRfU1lNTSAvKiBzeW1tZXRyaWMgbm9uLXNlcGFyYWJsZSAqLwotfTsKLWVudW0gYmxhY2tiaXJkX3NwYXRpYWxfZmlsdGVyX2Nocm9tYSB7Ci0JQkxBQ0tCSVJEX1NQQVRJQUxfRklMVEVSX0NIUk9NQV9ESVNBQkxFRCwKLQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfQ0hST01BXzFEX0hPUklaIC8qIGRlZmF1bHQgKi8KLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUXzNfMl9QVUxMRE9XTiAgIDB4QjEKLWVudW0gYmxhY2tiaXJkX3B1bGxkb3duIHsKLQlCTEFDS0JJUkRfM18yX1BVTExET1dOX0RJU0FCTEVELAotCUJMQUNLQklSRF8zXzJfUFVMTERPV05fRU5BQkxFRAotfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfVkJJX0xJTkVfTk8gICAgMHhCNwotZW51bSBibGFja2JpcmRfdmJpX2xpbmVfYml0cyB7Ci0JQkxBQ0tCSVJEX1ZCSV9MSU5FX0JJVFNfVE9QX0ZJRUxELAotCUJMQUNLQklSRF9WQklfTElORV9CSVRTX0JPVF9GSUVMRCA9ICgxIDw8IDMxKSwKLQlCTEFDS0JJUkRfVkJJX0xJTkVfQklUU19BTExfTElORVMgPSAweEZGRkZGRkZGCi19OwotZW51bSBibGFja2JpcmRfdmJpX2xpbmUgewotCUJMQUNLQklSRF9WQklfTElORV9ESVNBQkxFRCwKLQlCTEFDS0JJUkRfVkJJX0xJTkVfRU5BQkxFRAotfTsKLWVudW0gYmxhY2tiaXJkX3ZiaV9zbGljaW5nIHsKLQlCTEFDS0JJUkRfVkJJX1NMSUNJTkdfTk9ORSwKLQlCTEFDS0JJUkRfVkJJX1NMSUNJTkdfQ0xPU0VEX0NBUFRJT04KLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX1NUUkVBTV9UWVBFICAgIDB4QjkKLWVudW0gYmxhY2tiaXJkX3N0cmVhbV90eXBlIHsKLQlCTEFDS0JJUkRfU1RSRUFNX1BST0dSQU0sCi0JQkxBQ0tCSVJEX1NUUkVBTV9UUkFOU1BPUlQsCi0JQkxBQ0tCSVJEX1NUUkVBTV9NUEVHMSwKLQlCTEFDS0JJUkRfU1RSRUFNX1BFU19BViwKLQlCTEFDS0JJUkRfU1RSRUFNX1VOS05PV040LAotCUJMQUNLQklSRF9TVFJFQU1fUEVTX1ZJREVPLAotCUJMQUNLQklSRF9TVFJFQU1fVU5LTk9XTjYsCi0JQkxBQ0tCSVJEX1NUUkVBTV9QRVNfQVVESU8sCi0JQkxBQ0tCSVJEX1NUUkVBTV9VTktOT1dOOCwKLQlCTEFDS0JJUkRfU1RSRUFNX1VOS05PV045LCAvKiBhdWRpby9wY20gPyAqLwotCUJMQUNLQklSRF9TVFJFQU1fRFZELAotCUJMQUNLQklSRF9TVFJFQU1fVkNELAotCUJMQUNLQklSRF9TVFJFQU1fVU5LTk9XTjEyIC8qIHN2Y2QveHZjZCA/ICovCi19OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9PVVRQVVRfUE9SVCAgICAweEJCCiBlbnVtIGJsYWNrYmlyZF9zdHJlYW1fcG9ydCB7CiAJQkxBQ0tCSVJEX09VVFBVVF9QT1JUX01FTU9SWSwKIAlCTEFDS0JJUkRfT1VUUFVUX1BPUlRfU1RSRUFNSU5HLAogCUJMQUNLQklSRF9PVVRQVVRfUE9SVF9TRVJJQUwKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0FVRElPX1BBUkFNUyAgIDB4QkQKLWVudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfc2FtcGxlX3JhdGUgewotCUJMQUNLQklSRF9BVURJT19CSVRTXzQ0MTAwSFosCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDgwMDBIWiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU18zMjAwMEhaLAotCUJMQUNLQklSRF9BVURJT19CSVRTX1JFU0VSVkVEX0haLAotfTsKLWVudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfZW5jb2RpbmcgewotCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzEgPSAweDEgPDwgMiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yID0gMHgyIDw8IDIsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19iaXRyYXRlX2xheWVyXzEgewotCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzFfRlJFRV9GT1JNQVQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8zMiAgPSAweDAxIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV82NCAgPSAweDAyIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV85NiAgPSAweDAzIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8xMjggPSAweDA0IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8xNjAgPSAweDA1IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8xOTIgPSAweDA2IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8yMjQgPSAweDA3IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8yNTYgPSAweDA4IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8yODggPSAweDA5IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8zMjAgPSAweDBBIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8zNTIgPSAweDBCIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV8zODQgPSAweDBDIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV80MTYgPSAweDBEIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMV80NDggPSAweDBFIDw8IDQsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19iaXRyYXRlX2xheWVyXzIgewotCUJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfRlJFRV9GT1JNQVQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zMiAgPSAweDAxIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl80OCAgPSAweDAyIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl81NiAgPSAweDAzIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl82NCAgPSAweDA0IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl84MCAgPSAweDA1IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl85NiAgPSAweDA2IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xMTIgPSAweDA3IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xMjggPSAweDA4IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xNjAgPSAweDA5IDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8xOTIgPSAweDBBIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8yMjQgPSAweDBCIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8yNTYgPSAweDBDIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zMjAgPSAweDBEIDw8IDQsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMl8zODQgPSAweDBFIDw8IDQsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19tb2RlIHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19TVEVSRU8sCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfSk9JTlRfU1RFUkVPID0gMHgxIDw8IDgsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfRFVBTCAgICAgICAgID0gMHgyIDw8IDgsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfTU9OTyAgICAgICAgID0gMHgzIDw8IDgsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19tb2RlX2V4dGVuc2lvbiB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfQk9VTkRfNCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19CT1VORF84ICA9IDB4MSA8PCAxMCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19CT1VORF8xMiA9IDB4MiA8PCAxMCwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19CT1VORF8xNiA9IDB4MyA8PCAxMCwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2VtcGhhc2lzIHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU19OT05FLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0VNUEhBU0lTXzUwXzE1ICAgICA9IDB4MSA8PCAxMiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19FTVBIQVNJU19SRVNFUlZFRCAgPSAweDIgPDwgMTIsCi0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfQ0NJVFRfSjE3ID0gMHgzIDw8IDEyLAotfTsKLWVudW0gYmxhY2tiaXJkX2F1ZGlvX2JpdHNfY3JjIHsKLQlCTEFDS0JJUkRfQVVESU9fQklUU19DUkNfT0ZGLAotCUJMQUNLQklSRF9BVURJT19CSVRTX0NSQ19PTiA9IDB4MSA8PCAxNCwKLX07Ci1lbnVtIGJsYWNrYmlyZF9hdWRpb19iaXRzX2NvcHlyaWdodCB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWVJJR0hUX09GRiwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19DT1BZUklHSFRfT04gPSAweDEgPDwgMTUsCi19OwotZW51bSBibGFja2JpcmRfYXVkaW9fYml0c19vcmlnaW5hbCB7Ci0JQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWSwKLQlCTEFDS0JJUkRfQVVESU9fQklUU19PUklHSU5BTCA9IDB4MSA8PCAxNiwKLX07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfSEFMVCAgICAgICAgICAgICAgIDB4QzMKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9HRVRfVkVSU0lPTiAgICAgICAgMHhDNAotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9HT1BfQ0xPU1VSRSAgICAweEM1Ci1lbnVtIGJsYWNrYmlyZF9nb3BfY2xvc3VyZSB7Ci0JQkxBQ0tCSVJEX0dPUF9DTE9TVVJFX09GRiwKLQlCTEFDS0JJUkRfR09QX0NMT1NVUkVfT04sCi19OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX0RBVEFfWEZFUl9TVEFUVVMgICAweEM2CiBlbnVtIGJsYWNrYmlyZF9kYXRhX3hmZXJfc3RhdHVzIHsKIAlCTEFDS0JJUkRfTU9SRV9CVUZGRVJTX0ZPTExPVywKIAlCTEFDS0JJUkRfTEFTVF9CVUZGRVIsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1BST0dSQU1fSU5ERVhfSU5GTyAweEM3CiBlbnVtIGJsYWNrYmlyZF9waWN0dXJlX21hc2sgewogCUJMQUNLQklSRF9QSUNUVVJFX01BU0tfTk9ORSwKIAlCTEFDS0JJUkRfUElDVFVSRV9NQVNLX0lfRlJBTUVTLAogCUJMQUNLQklSRF9QSUNUVVJFX01BU0tfSV9QX0ZSQU1FUyA9IDB4MywKIAlCTEFDS0JJUkRfUElDVFVSRV9NQVNLX0FMTF9GUkFNRVMgPSAweDcsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9WQklfUEFSQU1TICAgICAweEM4CiBlbnVtIGJsYWNrYmlyZF92YmlfbW9kZV9iaXRzIHsKIAlCTEFDS0JJUkRfVkJJX0JJVFNfU0xJQ0VELAogCUJMQUNLQklSRF9WQklfQklUU19SQVcsCkBAIC0yODgsMzMgKzExMCwyMyBAQAogCUJMQUNLQklSRF9WQklfQklUU19TRVBBUkFURV9TVFJFQU1fVVNSX0RBVEEgPSAweDQgPDwgMSwKIAlCTEFDS0JJUkRfVkJJX0JJVFNfU0VQQVJBVEVfU1RSRUFNX1BSVl9EQVRBID0gMHg1IDw8IDEsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9ETUFfQkxPQ0tfU0laRSAweEM5CiBlbnVtIGJsYWNrYmlyZF9kbWFfdW5pdCB7CiAJQkxBQ0tCSVJEX0RNQV9CWVRFUywKIAlCTEFDS0JJUkRfRE1BX0ZSQU1FUywKIH07Ci0jZGVmaW5lIEJMQUNLQklSRF9BUElfRE1BX1RSQU5TRkVSX0lORk8gIDB4Q0EKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9ETUFfVFJBTlNGRVJfU1RBVCAgMHhDQgogZW51bSBibGFja2JpcmRfZG1hX3RyYW5zZmVyX3N0YXR1c19iaXRzIHsKIAlCTEFDS0JJUkRfRE1BX1RSQU5TRkVSX0JJVFNfRE9ORSA9IDB4MDEsCiAJQkxBQ0tCSVJEX0RNQV9UUkFOU0ZFUl9CSVRTX0VSUk9SID0gMHgwNCwKIAlCTEFDS0JJUkRfRE1BX1RSQU5TRkVSX0JJVFNfTExfRVJST1IgPSAweDEwLAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfRE1BMkhPU1RfQUREUiAgMHhDQwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX0lOSVRfVklERU9fSU5QVVQgICAweENECi0jZGVmaW5lIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FU0tJUCAgICAgIDB4RDAKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9QQVVTRSAgICAgICAgICAgICAgMHhEMgogZW51bSBibGFja2JpcmRfcGF1c2UgewogCUJMQUNLQklSRF9QQVVTRV9FTkNPRElORywKIAlCTEFDS0JJUkRfUkVTVU1FX0VOQ09ESU5HLAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9SRUZSRVNIX0lOUFVUICAgICAgMHhEMwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9DT1BZUklHSFQgICAgICAweEQ0CiBlbnVtIGJsYWNrYmlyZF9jb3B5cmlnaHQgewogCUJMQUNLQklSRF9DT1BZUklHSFRfT0ZGLAogCUJMQUNLQklSRF9DT1BZUklHSFRfT04sCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9OT1RJRklDQVRJT04gICAweEQ1CiBlbnVtIGJsYWNrYmlyZF9ub3RpZmljYXRpb25fdHlwZSB7CiAJQkxBQ0tCSVJEX05PVElGSUNBVElPTl9SRUZSRVNILAogfTsKQEAgLTMyNSw3ICsxMzcsNiBAQAogZW51bSBibGFja2JpcmRfbm90aWZpY2F0aW9uX21haWxib3ggewogCUJMQUNLQklSRF9OT1RJRklDQVRJT05fTk9fTUFJTEJPWCA9IC0xLAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9TRVRfQ0FQVFVSRV9MSU5FUyAgMHhENgogZW51bSBibGFja2JpcmRfZmllbGQxX2xpbmVzIHsKIAlCTEFDS0JJUkRfRklFTEQxX1NBQTcxMTQgPSAweDAwRUYsIC8qIDIzOSAqLwogCUJMQUNLQklSRF9GSUVMRDFfU0FBNzExNSA9IDB4MDBGMCwgLyogMjQwICovCkBAIC0zMzYsMTIgKzE0NywxMCBAQAogCUJMQUNLQklSRF9GSUVMRDJfU0FBNzExNSA9IDB4MDBGMCwgLyogMjQwICovCiAJQkxBQ0tCSVJEX0ZJRUxEMl9NSUNST05BUyA9IDB4MDEwNiwgLyogMjYyICovCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX1NFVF9DVVNUT01fREFUQSAgICAweEQ3CiBlbnVtIGJsYWNrYmlyZF9jdXN0b21fZGF0YV90eXBlIHsKIAlCTEFDS0JJUkRfQ1VTVE9NX0VYVEVOU0lPTl9VU1JfREFUQSwKIAlCTEFDS0JJUkRfQ1VTVE9NX1BSSVZBVEVfUEFDS0VULAogfTsKLSNkZWZpbmUgQkxBQ0tCSVJEX0FQSV9NVVRFX1ZJREVPICAgICAgICAgMHhEOQogZW51bSBibGFja2JpcmRfbXV0ZSB7CiAJQkxBQ0tCSVJEX1VOTVVURSwKIAlCTEFDS0JJUkRfTVVURSwKQEAgLTM1Niw3ICsxNjUsNiBAQAogCUJMQUNLQklSRF9NVVRFX1ZJREVPX1VfU0hJRlQgPSAxNiwKIAlCTEFDS0JJUkRfTVVURV9WSURFT19ZX1NISUZUID0gMjQsCiB9OwotI2RlZmluZSBCTEFDS0JJUkRfQVBJX01VVEVfQVVESU8gICAgICAgICAweERBCiAKIC8qIFJlZ2lzdGVycyAqLwogI2RlZmluZSBJVlRWX1JFR19FTkNfU0RSQU1fUkVGUkVTSCAoMHgwN0Y4IC8qfCBJVlRWX1JFR19PRkZTRVQqLykKQEAgLTQ5OCwxNSArMzA2LDEyIEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiBXZSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlIEFQSSBvZnRlbiwgc28gdXNpbmcganVzdCBvbmUgbWFpbGJveCB3aWxsIHByb2JhYmx5IHN1ZmZpY2UgKi8KLXN0YXRpYyBpbnQgYmxhY2tiaXJkX2FwaV9jbWQoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgdTMyIGNvbW1hbmQsCi0JCQkgICAgIHUzMiBpbnB1dGNudCwgdTMyIG91dHB1dGNudCwgLi4uKQorc3RhdGljIGludCBibGFja2JpcmRfbWJveF9mdW5jKHZvaWQgKnByaXYsIGludCBjb21tYW5kLCBpbnQgaW4sIGludCBvdXQsIHUzMiBkYXRhW0NYMjM0MVhfTUJPWF9NQVhfREFUQV0pCiB7CisJc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IHByaXY7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXUzMiB2YWx1ZSwgZmxhZywgcmV0dmFsOwogCWludCBpOwotCXZhX2xpc3QgYXJnczsKLQl2YV9zdGFydChhcmdzLCBvdXRwdXRjbnQpOwogCiAJZHByaW50aygxLCIlczogMHglWFxuIiwgX19GVU5DVElPTl9fLCBjb21tYW5kKTsKIApAQCAtNTMwLDEyICszMzUsMTEgQEAKIAkvKiB3cml0ZSBjb21tYW5kICsgYXJncyArIGZpbGwgcmVtYWluaW5nIHdpdGggemVyb3MgKi8KIAltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyAxLCBjb21tYW5kKTsgLyogY29tbWFuZCBjb2RlICovCiAJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgMywgSVZUVl9BUElfU1REX1RJTUVPVVQpOyAvKiB0aW1lb3V0ICovCi0JZm9yIChpID0gMDsgaSA8IGlucHV0Y250IDsgaSsrKSB7Ci0JCXZhbHVlID0gdmFfYXJnKGFyZ3MsIGludCk7Ci0JCW1lbW9yeV93cml0ZShkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDQgKyBpLCB2YWx1ZSk7Ci0JCWRwcmludGsoMSwgIkFQSSBJbnB1dCAlZCA9ICVkXG4iLCBpLCB2YWx1ZSk7CisJZm9yIChpID0gMDsgaSA8IGluOyBpKyspIHsKKwkJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIGRhdGFbaV0pOworCQlkcHJpbnRrKDEsICJBUEkgSW5wdXQgJWQgPSAlZFxuIiwgaSwgZGF0YVtpXSk7CiAJfQotCWZvciAoOyBpIDwgMTYgOyBpKyspCisJZm9yICg7IGkgPCBDWDIzNDFYX01CT1hfTUFYX0RBVEE7IGkrKykKIAkJbWVtb3J5X3dyaXRlKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIDApOwogCiAJZmxhZyB8PSAzOyAvKiB0ZWxsICdlbSB3ZSdyZSBkb25lIHdyaXRpbmcgKi8KQEAgLTU1NSwxMiArMzU5LDEwIEBACiAJfQogCiAJLyogcmVhZCBvdXRwdXQgdmFsdWVzICovCi0JZm9yIChpID0gMDsgaSA8IG91dHB1dGNudCA7IGkrKykgewotCQlpbnQgKnZwdHIgPSB2YV9hcmcoYXJncywgaW50ICopOwotCQltZW1vcnlfcmVhZChkZXYtPmNvcmUsIGRldi0+bWFpbGJveCArIDQgKyBpLCB2cHRyKTsKLQkJZHByaW50aygxLCAiQVBJIE91dHB1dCAlZCA9ICVkXG4iLCBpLCAqdnB0cik7CisJZm9yIChpID0gMDsgaSA8IG91dDsgaSsrKSB7CisJCW1lbW9yeV9yZWFkKGRldi0+Y29yZSwgZGV2LT5tYWlsYm94ICsgNCArIGksIGRhdGEgKyBpKTsKKwkJZHByaW50aygxLCAiQVBJIE91dHB1dCAlZCA9ICVkXG4iLCBpLCBkYXRhW2ldKTsKIAl9Ci0JdmFfZW5kKGFyZ3MpOwogCiAJbWVtb3J5X3JlYWQoZGV2LT5jb3JlLCBkZXYtPm1haWxib3ggKyAyLCAmcmV0dmFsKTsKIAlkcHJpbnRrKDEsICJBUEkgcmVzdWx0ID0gJWRcbiIscmV0dmFsKTsKQEAgLTU2OSw3ICszNzEsMjkgQEAKIAltZW1vcnlfd3JpdGUoZGV2LT5jb3JlLCBkZXYtPm1haWxib3gsIGZsYWcpOwogCXJldHVybiByZXR2YWw7CiB9CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogV2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBBUEkgb2Z0ZW4sIHNvIHVzaW5nIGp1c3Qgb25lIG1haWxib3ggd2lsbCBwcm9iYWJseSBzdWZmaWNlICovCitzdGF0aWMgaW50IGJsYWNrYmlyZF9hcGlfY21kKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHUzMiBjb21tYW5kLAorCQkJICAgICB1MzIgaW5wdXRjbnQsIHUzMiBvdXRwdXRjbnQsIC4uLikKK3sKKwl1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdOworCXZhX2xpc3QgdmFyZ3M7CisJaW50IGksIGVycjsKKworCXZhX3N0YXJ0KHZhcmdzLCBvdXRwdXRjbnQpOworCisJZm9yIChpID0gMDsgaSA8IGlucHV0Y250OyBpKyspIHsKKwkJZGF0YVtpXSA9IHZhX2FyZyh2YXJncywgaW50KTsKKwl9CisJZXJyID0gYmxhY2tiaXJkX21ib3hfZnVuYyhkZXYsIGNvbW1hbmQsIGlucHV0Y250LCBvdXRwdXRjbnQsIGRhdGEpOworCWZvciAoaSA9IDA7IGkgPCBvdXRwdXRjbnQ7IGkrKykgeworCQlpbnQgKnZwdHIgPSB2YV9hcmcodmFyZ3MsIGludCAqKTsKKwkJKnZwdHIgPSBkYXRhW2ldOworCX0KKwl2YV9lbmQodmFyZ3MpOworCXJldHVybiBlcnI7Cit9CiAKIHN0YXRpYyBpbnQgYmxhY2tiaXJkX2ZpbmRfbWFpbGJveChzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewpAQCAtNjE0LDEzICs0MzgsMTMgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZHByaW50aygwLCAiRXJyb3Igd2l0aCByZWdpc3Rlcl93cml0ZVxuIik7CiAKLQlyZXR2YWwgPSByZXF1ZXN0X2Zpcm13YXJlKCZmaXJtd2FyZSwgQkxBQ0tCSVJEX0ZJUk1fRU5DX0ZJTEVOQU1FLAorCXJldHZhbCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBDWDIzNDFYX0ZJUk1fRU5DX0ZJTEVOQU1FLAogCQkJCSAgJmRldi0+cGNpLT5kZXYpOwogCiAKIAlpZiAocmV0dmFsICE9IDApIHsKIAkJZHByaW50aygwLCAiRVJST1I6IEhvdHBsdWcgZmlybXdhcmUgcmVxdWVzdCBmYWlsZWQgKCVzKS5cbiIsCi0JCQlCTEFDS0JJUkRfRklSTV9FTkNfRklMRU5BTUUpOworCQkJQ1gyMzQxWF9GSVJNX0VOQ19GSUxFTkFNRSk7CiAJCWRwcmludGsoMCwgIlBsZWFzZSBmaXggeW91ciBob3RwbHVnIHNldHVwLCB0aGUgYm9hcmQgd2lsbCAiCiAJCQkibm90IHdvcmsgd2l0aG91dCBmaXJtd2FyZSBsb2FkZWQhXG4iKTsKIAkJcmV0dXJuIC0xOwpAQCAtNjg2LDEyICs1MTAsMTkgQEAKICpEQjogIkRpcmVjdEJ1cm4iCiAqLwogCi1zdGF0aWMgc3RydWN0IGJsYWNrYmlyZF9kbnIgZGVmYXVsdF9kbnJfcGFyYW1zID0gewotCS5tb2RlICAgICA9IEJMQUNLQklSRF9ETlJfQklUU19NQU5VQUwsCi0JLnR5cGUgICAgID0gQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfRElTQUJMRUQsCi0JLnNwYXRpYWwgID0gMCwKLQkudGVtcG9yYWwgPSAwCi19Oworc3RhdGljIHZvaWQgYmxhY2tiaXJkX2NvZGVjX3NldHRpbmdzKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCit7CisJLyogYXNzaWduIGZyYW1lIHNpemUgKi8KKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1NFVF9GUkFNRV9TSVpFLCAyLCAwLAorCQkJCWRldi0+aGVpZ2h0LCBkZXYtPndpZHRoKTsKKworCWRldi0+cGFyYW1zLndpZHRoID0gZGV2LT53aWR0aDsKKwlkZXYtPnBhcmFtcy5oZWlnaHQgPSBkZXYtPmhlaWdodDsKKwlkZXYtPnBhcmFtcy5pc181MGh6ID0gKGRldi0+Y29yZS0+dHZub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgIT0gMDsKKworCWN4MjM0MXhfdXBkYXRlKGRldiwgYmxhY2tiaXJkX21ib3hfZnVuYywgTlVMTCwgJmRldi0+cGFyYW1zKTsKK30KKwogc3RhdGljIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gZGVmYXVsdF9tcGVnX3BhcmFtcyA9IHsKIAkuc3RfdHlwZSAgICAgICAgICA9IFY0TDJfTVBFR19QU18yLAogCS5zdF9iaXRyYXRlICAgICAgID0gewpAQCAtNzEyLDcgKzU0Myw3IEBACiAJCS50YXJnZXQgICA9IDIyNCwKIAkJLm1heCAgICAgID0gMjI0CiAJfSwKLQkuYXVfc2FtcGxlX3JhdGUgICAgPSA0NDEwMCwKKwkuYXVfc2FtcGxlX3JhdGUgICAgPSA0ODAwMCwKIAkuYXVfcGVzaWQgICAgICAgICAgPSAwLAogCS52aV90eXBlICAgICAgICAgICA9IFY0TDJfTVBFR19WSV8yLAogCS52aV9hc3BlY3RfcmF0aW8gICA9IFY0TDJfTVBFR19BU1BFQ1RfNF8zLApAQCAtNzIzLDUyNCArNTU0LDEzIEBACiAJCS5tYXggICAgICAgPSA2MDAwCiAJfSwKIAkudmlfZnJhbWVfcmF0ZSAgICAgPSAyNSwKLQkudmlfZnJhbWVzX3Blcl9nb3AgPSAxNSwKKwkudmlfZnJhbWVzX3Blcl9nb3AgPSAxMiwKIAkudmlfYmZyYW1lc19jb3VudCAgPSAyLAogCS52aV9wZXNpZCAgICAgICAgICA9IDAsCi0JLmNsb3NlZF9nb3BzICAgICAgID0gMCwKKwkuY2xvc2VkX2dvcHMgICAgICAgPSAxLAogCS5wdWxsZG93biAgICAgICAgICA9IDAKIH07CiAKLXN0YXRpYyBlbnVtIGJsYWNrYmlyZF9zdHJlYW1fdHlwZSBtcGVnX3N0cmVhbV90eXBlc1tdID0gewotCVtWNEwyX01QRUdfU1NfMV0gICA9IEJMQUNLQklSRF9TVFJFQU1fTVBFRzEsCi0JW1Y0TDJfTVBFR19QU18yXSAgID0gQkxBQ0tCSVJEX1NUUkVBTV9QUk9HUkFNLAotCVtWNEwyX01QRUdfVFNfMl0gICA9IEJMQUNLQklSRF9TVFJFQU1fVFJBTlNQT1JULAotCVtWNEwyX01QRUdfUFNfRFZEXSA9IEJMQUNLQklSRF9TVFJFQU1fRFZELAotfTsKLXN0YXRpYyBlbnVtIGJsYWNrYmlyZF9hc3BlY3RfcmF0aW8gbXBlZ19zdHJlYW1fcmF0aW9zW10gPSB7Ci0JW1Y0TDJfTVBFR19BU1BFQ1RfU1FVQVJFXSA9IEJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fMV8xX1NRVUFSRSwKLQlbVjRMMl9NUEVHX0FTUEVDVF80XzNdICAgID0gQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT180XzMsCi0JW1Y0TDJfTVBFR19BU1BFQ1RfMTZfOV0gICA9IEJMQUNLQklSRF9BU1BFQ1RfUkFUSU9fMTZfOSwKLQlbVjRMMl9NUEVHX0FTUEVDVF8xXzIyMV0gID0gQkxBQ0tCSVJEX0FTUEVDVF9SQVRJT18yMjFfMTAwLAotfTsKLXN0YXRpYyBlbnVtIGJsYWNrYmlyZF92aWRlb19iaXRyYXRlX3R5cGUgbXBlZ192aWRlb19iaXRyYXRlc1tdID0gewotCVtWNEwyX0JJVFJBVEVfTk9ORV0gPSBCTEFDS0JJUkRfVklERU9fQ0JSLAotCVtWNEwyX0JJVFJBVEVfQ0JSXSAgPSBCTEFDS0JJUkRfVklERU9fQ0JSLAotCVtWNEwyX0JJVFJBVEVfVkJSXSAgPSBCTEFDS0JJUkRfVklERU9fVkJSLAotfTsKLS8qIGZpbmQgdGhlIGJlc3QgbGF5ZXIgSS9JSSBiaXRyYXRlIHRvIGZpdCBhIGdpdmVuIG51bWVyaWMgdmFsdWUgKi8KLXN0cnVjdCBiaXRyYXRlX2JpdHMgewotCXUzMiBiaXRzOyAvKiBsYXllciBiaXRzIGZvciB0aGUgYmVzdCBmaXQgKi8KLQl1MzIgcmF0ZTsgLyogYWN0dWFsIG51bWVyaWMgdmFsdWUgZm9yIHRoZSBsYXllciBiZXN0IGZpdCAqLwotfTsKLXN0cnVjdCBiaXRyYXRlX2FwcHJveGltYXRpb24gewotCXUzMiAgICAgICAgICAgICAgICAgdGFyZ2V0OyAgIC8qIG51bWVyaWMgdmFsdWUgb2YgdGhlIHJhdGUgd2Ugd2FudCAqLwotCXN0cnVjdCBiaXRyYXRlX2JpdHMgbGF5ZXJbMl07Ci19Owotc3RhdGljIHN0cnVjdCBiaXRyYXRlX2FwcHJveGltYXRpb24gbXBlZ19hdWRpb19iaXRyYXRlc1tdID0gewotCS8qIHRhcmdldCAgbGF5ZXJbMF0uYml0cyAgICAgICAgICAgbGF5ZXJbMF0ucmF0ZSAgICAgICBsYXllclsxXS5iaXRzICAgICAgICAgICBsYXllclsxXS5yYXRlICovCi0JeyAgIDAsIHsgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAwLCB9LCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIDAsIH0sIH0sIH0sCi0JeyAgMzIsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzMyICwgIDMyLCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzIgLCAgMzIsIH0sIH0sIH0sCi0JeyAgNDgsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzY0ICwgIDY0LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNDggLCAgNDgsIH0sIH0sIH0sCi0JeyAgNTYsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzY0ICwgIDY0LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNTYgLCAgNTYsIH0sIH0sIH0sCi0JeyAgNjQsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzY0ICwgIDY0LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfNjQgLCAgNjQsIH0sIH0sIH0sCi0JeyAgODAsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzk2ICwgIDk2LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfODAgLCAgODAsIH0sIH0sIH0sCi0JeyAgOTYsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzk2ICwgIDk2LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfOTYgLCAgOTYsIH0sIH0sIH0sCi0JeyAxMTIsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzEyOCwgMTI4LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTEyLCAxMTIsIH0sIH0sIH0sCi0JeyAxMjgsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzEyOCwgMTI4LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTI4LCAxMjgsIH0sIH0sIH0sCi0JeyAxNjAsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzE2MCwgMTYwLCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTYwLCAxNjAsIH0sIH0sIH0sCi0JeyAxOTIsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzE5MiwgMTkyLCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMTkyLCAxOTIsIH0sIH0sIH0sCi0JeyAyMjQsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzIyNCwgMjI0LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMjI0LCAyMjQsIH0sIH0sIH0sCi0JeyAyNTYsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzI1NiwgMjU2LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMjU2LCAyNTYsIH0sIH0sIH0sCi0JeyAyODgsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzI4OCwgMjg4LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzIwLCAzMjAsIH0sIH0sIH0sCi0JeyAzMjAsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzMyMCwgMzIwLCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzIwLCAzMjAsIH0sIH0sIH0sCi0JeyAzNTIsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzM1MiwgMzUyLCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzg0LCAzODQsIH0sIH0sIH0sCi0JeyAzODQsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzM4NCwgMzg0LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzg0LCAzODQsIH0sIH0sIH0sCi0JeyA0MTYsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzQxNiwgNDE2LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzg0LCAzODQsIH0sIH0sIH0sCi0JeyA0NDgsIHsgeyBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xXzQ0OCwgNDQ4LCB9LCB7IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzJfMzg0LCAzODQsIH0sIH0sIH0sCi19Owotc3RhdGljIGNvbnN0IGludCBCSVRSQVRFU19TSVpFID0gQVJSQVlfU0laRShtcGVnX2F1ZGlvX2JpdHJhdGVzKTsKLQotc3RhdGljIHZvaWQgYmxhY2tiaXJkX3NldF9kZWZhdWx0X3BhcmFtcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQotewotCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKnBhcmFtcyA9ICZkZXYtPnBhcmFtczsKLQl1MzIgYXVfcGFyYW1zOwotCi0JLyogYXNzaWduIHN0cmVhbSB0eXBlICovCi0JaWYoIHBhcmFtcy0+c3RfdHlwZSA+PSBBUlJBWV9TSVpFKG1wZWdfc3RyZWFtX3R5cGVzKSApCi0JCXBhcmFtcy0+c3RfdHlwZSA9IFY0TDJfTVBFR19QU18yOwotCWlmKCBwYXJhbXMtPnN0X3R5cGUgPT0gVjRMMl9NUEVHX1NTXzEgKQotCQlwYXJhbXMtPnZpX3R5cGUgPSBWNEwyX01QRUdfVklfMTsKLQllbHNlCi0JCXBhcmFtcy0+dmlfdHlwZSA9IFY0TDJfTVBFR19WSV8yOwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIG1wZWdfc3RyZWFtX3R5cGVzW3BhcmFtcy0+c3RfdHlwZV0pOwotCi0JLyogYXNzaWduIGZyYW1lcmF0ZSAqLwotCWlmKCBwYXJhbXMtPnZpX2ZyYW1lX3JhdGUgPD0gMjUgKQotCXsKLQkJcGFyYW1zLT52aV9mcmFtZV9yYXRlID0gMjU7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRlJBTUVSQVRFLCAxLCAwLCBCTEFDS0JJUkRfRlJBTUVSQVRFX1BBTF8yNSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXBhcmFtcy0+dmlfZnJhbWVfcmF0ZSA9IDMwOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FUkFURSwgMSwgMCwgQkxBQ0tCSVJEX0ZSQU1FUkFURV9OVFNDXzMwKTsKLQl9Ci0KLQkvKiBhc3NpZ24gYXNwZWN0IHJhdGlvICovCi0JaWYoIHBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID49IEFSUkFZX1NJWkUobXBlZ19zdHJlYW1fcmF0aW9zKSApCi0JCXBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID0gVjRMMl9NUEVHX0FTUEVDVF80XzM7Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9BU1BFQ1RfUkFUSU8sIDEsIDAsIG1wZWdfc3RyZWFtX3JhdGlvc1twYXJhbXMtPnZpX2FzcGVjdF9yYXRpb10pOwotCi0JLyogYXNzaWduIGdvcCBwcm9wZXJ0aWVzICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9HT1BfU1RSVUNUVVJFLCAyLCAwLCBwYXJhbXMtPnZpX2ZyYW1lc19wZXJfZ29wLCBwYXJhbXMtPnZpX2JmcmFtZXNfY291bnQrMSk7Ci0KLQkvKiBhc3NpZ24gZ29wIGNsb3N1cmUgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0dPUF9DTE9TVVJFLCAxLCAwLCBwYXJhbXMtPmNsb3NlZF9nb3BzKTsKLQotCS8qIGFzc2lnbiAzIDIgcHVsbGRvd24gKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUXzNfMl9QVUxMRE9XTiwgMSwgMCwgcGFyYW1zLT5wdWxsZG93bik7Ci0KLQkvKiBtYWtlIHN1cmUgdGhlIHBhcmFtcyBhcmUgd2l0aGluIGJvdW5kcyAqLwotCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubW9kZSA+PSBBUlJBWV9TSVpFKG1wZWdfdmlkZW9fYml0cmF0ZXMpICkKLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPSBWNEwyX0JJVFJBVEVfTk9ORTsKLQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPj0gQVJSQVlfU0laRShtcGVnX3ZpZGVvX2JpdHJhdGVzKSApCi0JCXBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID0gVjRMMl9CSVRSQVRFX05PTkU7Ci0JaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID49IEFSUkFZX1NJWkUobXBlZ192aWRlb19iaXRyYXRlcykgKQotCQlwYXJhbXMtPmF1X2JpdHJhdGUubW9kZSA9IFY0TDJfQklUUkFURV9OT05FOwotCi0JLyogYXNzaWduIGF1ZGlvIHByb3BlcnRpZXMgKi8KLQkvKiBub3RlOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzYW1wbGVyYXRlLCB0aGUgbXBlZyBlbmNvZGVyIHNlZW1zIHRvIGF1dG9kZXRlY3QvYWRqdXN0ICovCi0JYXVfcGFyYW1zID0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfU1RFUkVPIHwKLQkJCS8qIEJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzQgfCAqLwotCQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfRU1QSEFTSVNfTk9ORSB8Ci0JCQlCTEFDS0JJUkRfQVVESU9fQklUU19DUkNfT0ZGIHwKLQkJCUJMQUNLQklSRF9BVURJT19CSVRTX0NPUFlSSUdIVF9PRkYgfAotCQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWSB8Ci0JCQkwOwotCWlmKCBwYXJhbXMtPmF1X3NhbXBsZV9yYXRlIDw9IDMyMDAwICkKLQl7Ci0JCXBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPSAzMjAwMDsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTXzMyMDAwSFo7Ci0JfQotCWVsc2UgaWYoIHBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPD0gNDQxMDAgKQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDQxMDBIWjsKLQl9Ci0JZWxzZQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDQ4MDAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfNDgwMDBIWjsKLQl9Ci0JaWYoIHBhcmFtcy0+YXVfdHlwZSA9PSBWNEwyX01QRUdfQVVfMl9JICkKLQl7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8xOwotCX0KLQllbHNlCi0JewotCQkvKiBUT0RPOiB0cnkgdG8gaGFuZGxlIHRoZSBvdGhlciBmb3JtYXRzIG1vcmUgZ3JhY2VmdWxseSAqLwotCQlwYXJhbXMtPmF1X3R5cGUgPSBWNEwyX01QRUdfQVVfMl9JSTsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTX0xBWUVSXzI7Ci0JfQotCWlmKCBwYXJhbXMtPmF1X2JpdHJhdGUubW9kZSApCi0JewotCQlpbnQgbGF5ZXI7Ci0KLQkJaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9DQlIgKQotCQkJcGFyYW1zLT5hdV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQ7Ci0JCWVsc2UKLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUubWF4OwotCi0JCWxheWVyID0gcGFyYW1zLT5hdV90eXBlOwotCQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9PSAwICkKLQkJewotCQkJLyogVE9ETzogdXNlIHRoZSBtaW5pbXVtIHBvc3NpYmxlIGJpdHJhdGUgaW5zdGVhZCBvZiAwID8gKi8KLQkJCWF1X3BhcmFtcyB8PSAwOwotCQl9Ci0JCWVsc2UgaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPj0KLQkJCSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLnJhdGUgKQotCQl7Ci0JCQkvKiBjbGFtcCB0aGUgYml0cmF0ZSB0byB0aGUgbWF4IHN1cHBvcnRlZCBieSB0aGUgc3RhbmRhcmQgKi8KLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLnJhdGU7Ci0JCQlwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKLQkJCWF1X3BhcmFtcyB8PSBtcGVnX2F1ZGlvX2JpdHJhdGVzW0JJVFJBVEVTX1NJWkUtMV0ubGF5ZXJbbGF5ZXJdLmJpdHM7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvKiByb3VuZCB1cCB0byB0aGUgbmVhcmVzdCBzdXBwb3J0ZWQgYml0cmF0ZSAqLwotCQkJaW50IGk7Ci0JCQlmb3IoaSA9IDE7IGkgPCBCSVRSQVRFU19TSVpFOyBpKyspCi0JCQl7Ci0JCQkJaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPiBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ktMV0ubGF5ZXJbbGF5ZXJdLnJhdGUgJiYKLQkJCQkgICAgcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA8PSBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ldLmxheWVyW2xheWVyXS5yYXRlICkKLQkJCQl7Ci0JCQkJCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ldLmxheWVyW2xheWVyXS5yYXRlOwotCQkJCQlwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKLQkJCQkJYXVfcGFyYW1zIHw9IG1wZWdfYXVkaW9fYml0cmF0ZXNbaV0ubGF5ZXJbbGF5ZXJdLmJpdHM7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQllbHNlCi0JewotCQkvKiBUT0RPOiA/Pz8gKi8KLQkJcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+YXVfYml0cmF0ZS5tYXggPSAwOwotCQlhdV9wYXJhbXMgfD0gMDsKLQl9Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9BVURJT19QQVJBTVMsIDEsIDAsIGF1X3BhcmFtcyApOwotCi0JLyogYXNzaWduIGJpdHJhdGVzICovCi0JaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlICkKLQl7Ci0JCS8qIGJpdHJhdGUgaXMgc2V0LCBsZXQncyBmaWd1cmUgb3V0IHRoZSBjYnIvdmJyIG1lc3MgKi8KLQkJaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPCBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICkKLQkJewotCQkJaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9DQlIgKQotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0OwotCQkJZWxzZQotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUubWF4OwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubWF4IDwgcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCApCi0JCXsKLQkJCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSICkKLQkJCQlwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLm1heDsKLQkJCWVsc2UKLQkJCQlwYXJhbXMtPnN0X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldDsKLQkJfQotCQkvKiBjYWxjdWxhdGUgdmlfYml0cmF0ZSA9IHN0X2JpdHJhdGUgLSBhdV9iaXRyYXRlICovCi0JCXBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnN0X2JpdHJhdGUubWF4IC0gcGFyYW1zLT5hdV9iaXRyYXRlLm1heDsKLQkJcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgLSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OwotCX0KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX1ZJREVPX0JJVFJBVEUsIDQsIDAsCi0JCQkJbXBlZ192aWRlb19iaXRyYXRlc1twYXJhbXMtPnZpX2JpdHJhdGUubW9kZV0sCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCAqIDEwMDAsIC8qIGticHMgLT4gYnBzICovCi0JCQkJcGFyYW1zLT52aV9iaXRyYXRlLm1heCAqIDEwMDAgLyBCTEFDS0JJUkRfUEVBS19SQVRFX0RJVklTT1IsIC8qIHBlYWsvNDAwICovCi0JCQkJQkxBQ0tCSVJEX01VWF9SQVRFX0RFRkFVTFQgLyosIDB4NzAqLyk7IC8qIGVuY29kaW5nIGJ1ZmZlciwgY2tlbm5lZHkgKi8KLQotCS8qIFRPRE86IGltcGxlbWVudCB0aGUgc3RyZWFtIElEIHN0dWZmOgotCQl0c19waWRfcG10LCB0c19waWRfYXVkaW8sIHRzX3BpZF92aWRlbywgdHNfcGlkX3BjciwKLQkJcHNfc2l6ZSwgYXVfcGVzaWQsIHZpX3Blc2lkCi0JKi8KLX0KLSNkZWZpbmUgQ0hFQ0tfUEFSQU0oIG5hbWUgKSAoIGRldi0+cGFyYW1zLm5hbWUgIT0gcGFyYW1zLT5uYW1lICkKLSNkZWZpbmUgSUZfUEFSQU0oIG5hbWUgKSBpZiggQ0hFQ0tfUEFSQU0oIG5hbWUgKSApCi0jZGVmaW5lIFVQREFURV9QQVJBTSggbmFtZSApIGRldi0+cGFyYW1zLm5hbWUgPSBwYXJhbXMtPm5hbWUKLXZvaWQgYmxhY2tiaXJkX3NldF9wYXJhbXMoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcGFyYW1zKQotewotCXUzMiBhdV9wYXJhbXM7Ci0KLQkvKiBhc3NpZ24gc3RyZWFtIHR5cGUgKi8KLQlpZiggcGFyYW1zLT5zdF90eXBlID49IEFSUkFZX1NJWkUobXBlZ19zdHJlYW1fdHlwZXMpICkKLQkJcGFyYW1zLT5zdF90eXBlID0gVjRMMl9NUEVHX1BTXzI7Ci0JaWYoIHBhcmFtcy0+c3RfdHlwZSA9PSBWNEwyX01QRUdfU1NfMSApCi0JCXBhcmFtcy0+dmlfdHlwZSA9IFY0TDJfTVBFR19WSV8xOwotCWVsc2UKLQkJcGFyYW1zLT52aV90eXBlID0gVjRMMl9NUEVHX1ZJXzI7Ci0JaWYoIENIRUNLX1BBUkFNKCBzdF90eXBlICkgfHwgQ0hFQ0tfUEFSQU0oIHZpX3R5cGUgKSApCi0JewotCQlVUERBVEVfUEFSQU0oIHN0X3R5cGUgKTsKLQkJVVBEQVRFX1BBUkFNKCB2aV90eXBlICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfU1RSRUFNX1RZUEUsIDEsIDAsIG1wZWdfc3RyZWFtX3R5cGVzW3BhcmFtcy0+c3RfdHlwZV0pOwotCX0KLQotCS8qIGFzc2lnbiBmcmFtZXJhdGUgKi8KLQlpZiggcGFyYW1zLT52aV9mcmFtZV9yYXRlIDw9IDI1ICkKLQkJcGFyYW1zLT52aV9mcmFtZV9yYXRlID0gMjU7Ci0JZWxzZQotCQlwYXJhbXMtPnZpX2ZyYW1lX3JhdGUgPSAzMDsKLQlJRl9QQVJBTSggdmlfZnJhbWVfcmF0ZSApCi0JewotCQlVUERBVEVfUEFSQU0oIHZpX2ZyYW1lX3JhdGUgKTsKLQkJaWYoIHBhcmFtcy0+dmlfZnJhbWVfcmF0ZSA9PSAyNSApCi0JCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FUkFURSwgMSwgMCwgQkxBQ0tCSVJEX0ZSQU1FUkFURV9QQUxfMjUpOwotCQllbHNlCi0JCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ZSQU1FUkFURSwgMSwgMCwgQkxBQ0tCSVJEX0ZSQU1FUkFURV9OVFNDXzMwKTsKLQl9Ci0KLQkvKiBhc3NpZ24gYXNwZWN0IHJhdGlvICovCi0JaWYoIHBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID49IEFSUkFZX1NJWkUobXBlZ19zdHJlYW1fcmF0aW9zKSApCi0JCXBhcmFtcy0+dmlfYXNwZWN0X3JhdGlvID0gVjRMMl9NUEVHX0FTUEVDVF80XzM7Ci0JSUZfUEFSQU0oIHZpX2FzcGVjdF9yYXRpbyApCi0JewotCQlVUERBVEVfUEFSQU0oIHZpX2FzcGVjdF9yYXRpbyApOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0FTUEVDVF9SQVRJTywgMSwgMCwgbXBlZ19zdHJlYW1fcmF0aW9zW3BhcmFtcy0+dmlfYXNwZWN0X3JhdGlvXSk7Ci0JfQotCi0JLyogYXNzaWduIGdvcCBwcm9wZXJ0aWVzICovCi0JaWYoIENIRUNLX1BBUkFNKCB2aV9mcmFtZXNfcGVyX2dvcCApIHx8IENIRUNLX1BBUkFNKCB2aV9iZnJhbWVzX2NvdW50ICkgKQotCXsKLQkJVVBEQVRFX1BBUkFNKCB2aV9mcmFtZXNfcGVyX2dvcCApOwotCQlVUERBVEVfUEFSQU0oIHZpX2JmcmFtZXNfY291bnQgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9HT1BfU1RSVUNUVVJFLCAyLCAwLCBwYXJhbXMtPnZpX2ZyYW1lc19wZXJfZ29wLCBwYXJhbXMtPnZpX2JmcmFtZXNfY291bnQrMSk7Ci0JfQotCi0JLyogYXNzaWduIGdvcCBjbG9zdXJlICovCi0JSUZfUEFSQU0oIGNsb3NlZF9nb3BzICkKLQl7Ci0JCVVQREFURV9QQVJBTSggY2xvc2VkX2dvcHMgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9HT1BfQ0xPU1VSRSwgMSwgMCwgcGFyYW1zLT5jbG9zZWRfZ29wcyk7Ci0JfQotCi0JLyogYXNzaWduIDMgMiBwdWxsZG93biAqLwotCUlGX1BBUkFNKCBwdWxsZG93biApCi0JewotCQlVUERBVEVfUEFSQU0oIHB1bGxkb3duICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfM18yX1BVTExET1dOLCAxLCAwLCBwYXJhbXMtPnB1bGxkb3duKTsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgdGhlIHBhcmFtcyBhcmUgd2l0aGluIGJvdW5kcyAqLwotCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubW9kZSA+PSBBUlJBWV9TSVpFKG1wZWdfdmlkZW9fYml0cmF0ZXMpICkKLQkJcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPSBWNEwyX0JJVFJBVEVfTk9ORTsKLQlpZiggcGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPj0gQVJSQVlfU0laRShtcGVnX3ZpZGVvX2JpdHJhdGVzKSApCi0JCXBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID0gVjRMMl9CSVRSQVRFX05PTkU7Ci0JaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlID49IEFSUkFZX1NJWkUobXBlZ192aWRlb19iaXRyYXRlcykgKQotCQlwYXJhbXMtPmF1X2JpdHJhdGUubW9kZSA9IFY0TDJfQklUUkFURV9OT05FOwotCi0JLyogYXNzaWduIGF1ZGlvIHByb3BlcnRpZXMgKi8KLQkvKiBub3RlOiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzYW1wbGVyYXRlLCB0aGUgbXBlZyBlbmNvZGVyIHNlZW1zIHRvIGF1dG9kZXRlY3QvYWRqdXN0ICovCi0JYXVfcGFyYW1zID0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfU1RFUkVPIHwKLQkJCS8qIEJMQUNLQklSRF9BVURJT19CSVRTX0JPVU5EXzQgfCAqLwotCUJMQUNLQklSRF9BVURJT19CSVRTX0VNUEhBU0lTX05PTkUgfAotCQlCTEFDS0JJUkRfQVVESU9fQklUU19DUkNfT0ZGIHwKLQkJQkxBQ0tCSVJEX0FVRElPX0JJVFNfQ09QWVJJR0hUX09GRiB8Ci0JCUJMQUNLQklSRF9BVURJT19CSVRTX0NPUFkgfAotCQkwOwotCWlmKCBwYXJhbXMtPmF1X3NhbXBsZV9yYXRlIDwgMzIwMDAgKQotCXsKLQkJcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA9IDMyMDAwOwotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfMzIwMDBIWjsKLQl9Ci0JZWxzZSBpZiggcGFyYW1zLT5hdV9zYW1wbGVfcmF0ZSA8IDQ0MTAwICkKLQl7Ci0JCXBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPSA0NDEwMDsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTXzQ0MTAwSFo7Ci0JfQotCWVsc2UKLQl7Ci0JCXBhcmFtcy0+YXVfc2FtcGxlX3JhdGUgPSA0ODAwMDsKLQkJYXVfcGFyYW1zIHw9IEJMQUNLQklSRF9BVURJT19CSVRTXzQ4MDAwSFo7Ci0JfQotCWlmKCBwYXJhbXMtPmF1X3R5cGUgPT0gVjRMMl9NUEVHX0FVXzJfSSApCi0JewotCQlhdV9wYXJhbXMgfD0gQkxBQ0tCSVJEX0FVRElPX0JJVFNfTEFZRVJfMTsKLQl9Ci0JZWxzZQotCXsKLQkJLyogVE9ETzogdHJ5IHRvIGhhbmRsZSB0aGUgb3RoZXIgZm9ybWF0cyBtb3JlIGdyYWNlZnVsbHkgKi8KLQkJcGFyYW1zLT5hdV90eXBlID0gVjRMMl9NUEVHX0FVXzJfSUk7Ci0JCWF1X3BhcmFtcyB8PSBCTEFDS0JJUkRfQVVESU9fQklUU19MQVlFUl8yOwotCX0KLQlpZiggcGFyYW1zLT5hdV9iaXRyYXRlLm1vZGUgKQotCXsKLQkJaW50IGxheWVyOwotCi0JCWlmKCBwYXJhbXMtPmF1X2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfQ0JSICkKLQkJCXBhcmFtcy0+YXVfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0OwotCQllbHNlCi0JCQlwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heDsKLQotCQlsYXllciA9IHBhcmFtcy0+YXVfdHlwZTsKLQkJaWYoIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPT0gMCApCi0JCXsKLQkJCS8qIFRPRE86IHVzZSB0aGUgbWluaW11bSBwb3NzaWJsZSBiaXRyYXRlIGluc3RlYWQgb2YgMCA/ICovCi0JCQlhdV9wYXJhbXMgfD0gMDsKLQkJfQotCQllbHNlIGlmKCBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID49Ci0JCQkgbXBlZ19hdWRpb19iaXRyYXRlc1tCSVRSQVRFU19TSVpFLTFdLmxheWVyW2xheWVyXS5yYXRlICkKLQkJewotCQkJLyogY2xhbXAgdGhlIGJpdHJhdGUgdG8gdGhlIG1heCBzdXBwb3J0ZWQgYnkgdGhlIHN0YW5kYXJkICovCi0JCQlwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID0gbXBlZ19hdWRpb19iaXRyYXRlc1tCSVRSQVRFU19TSVpFLTFdLmxheWVyW2xheWVyXS5yYXRlOwotCQkJcGFyYW1zLT5hdV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQ7Ci0JCQlhdV9wYXJhbXMgfD0gbXBlZ19hdWRpb19iaXRyYXRlc1tCSVRSQVRFU19TSVpFLTFdLmxheWVyW2xheWVyXS5iaXRzOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLyogcm91bmQgdXAgdG8gdGhlIG5lYXJlc3Qgc3VwcG9ydGVkIGJpdHJhdGUgKi8KLQkJCWludCBpOwotCQkJZm9yKGkgPSAxOyBpIDwgQklUUkFURVNfU0laRTsgaSsrKQotCQkJewotCQkJCWlmKCBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID4gbXBlZ19hdWRpb19iaXRyYXRlc1tpLTFdLmxheWVyW2xheWVyXS5yYXRlICYmCi0JCQkJICAgIHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPD0gbXBlZ19hdWRpb19iaXRyYXRlc1tpXS5sYXllcltsYXllcl0ucmF0ZSApCi0JCQkJewotCQkJCQlwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0ID0gbXBlZ19hdWRpb19iaXRyYXRlc1tpXS5sYXllcltsYXllcl0ucmF0ZTsKLQkJCQkJcGFyYW1zLT5hdV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQ7Ci0JCQkJCWF1X3BhcmFtcyB8PSBtcGVnX2F1ZGlvX2JpdHJhdGVzW2ldLmxheWVyW2xheWVyXS5iaXRzOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JZWxzZQotCXsKLQkJLyogVE9ETzogPz8/ICovCi0JCXBhcmFtcy0+YXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPmF1X2JpdHJhdGUubWF4ID0gMDsKLQkJYXVfcGFyYW1zIHw9IDA7Ci0JfQotCWlmKCBDSEVDS19QQVJBTSggYXVfdHlwZSApIHx8IENIRUNLX1BBUkFNKCBhdV9zYW1wbGVfcmF0ZSApCi0JCXx8IENIRUNLX1BBUkFNKCBhdV9iaXRyYXRlLm1vZGUgKSB8fCBDSEVDS19QQVJBTSggYXVfYml0cmF0ZS5tYXggKQotCQl8fCBDSEVDS19QQVJBTSggYXVfYml0cmF0ZS50YXJnZXQgKQotCSkKLQl7Ci0JCVVQREFURV9QQVJBTSggYXVfdHlwZSApOwotCQlVUERBVEVfUEFSQU0oIGF1X3NhbXBsZV9yYXRlICk7Ci0JCVVQREFURV9QQVJBTSggYXVfYml0cmF0ZSApOwotCQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0FVRElPX1BBUkFNUywgMSwgMCwgYXVfcGFyYW1zICk7Ci0JfQotCi0JLyogYXNzaWduIGJpdHJhdGVzICovCi0JaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlICkKLQl7Ci0JCS8qIGJpdHJhdGUgaXMgc2V0LCBsZXQncyBmaWd1cmUgb3V0IHRoZSBjYnIvdmJyIG1lc3MgKi8KLQkJaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPCBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICkKLQkJewotCQkJaWYoIHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9DQlIgKQotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0OwotCQkJZWxzZQotCQkJCXBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUubWF4OwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubWF4IDwgcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCApCi0JCXsKLQkJCWlmKCBwYXJhbXMtPnN0X2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSICkKLQkJCQlwYXJhbXMtPnN0X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLm1heDsKLQkJCWVsc2UKLQkJCQlwYXJhbXMtPnN0X2JpdHJhdGUubWF4ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldDsKLQkJfQotCQkvKiBjYWxjdWxhdGUgdmlfYml0cmF0ZSA9IHN0X2JpdHJhdGUgLSBhdV9iaXRyYXRlICovCi0JCXBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPSBwYXJhbXMtPnN0X2JpdHJhdGUubWF4IC0gcGFyYW1zLT5hdV9iaXRyYXRlLm1heDsKLQkJcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgLSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OwotCX0KLQlVUERBVEVfUEFSQU0oIHN0X2JpdHJhdGUgKTsKLQlpZiggQ0hFQ0tfUEFSQU0oIHZpX2JpdHJhdGUubW9kZSApIHx8IENIRUNLX1BBUkFNKCB2aV9iaXRyYXRlLm1heCApCi0JCXx8IENIRUNLX1BBUkFNKCB2aV9iaXRyYXRlLnRhcmdldCApCi0JKQotCXsKLQkJVVBEQVRFX1BBUkFNKCB2aV9iaXRyYXRlICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfVklERU9fQklUUkFURSwgNCwgMCwKLQkJCQltcGVnX3ZpZGVvX2JpdHJhdGVzW3BhcmFtcy0+dmlfYml0cmF0ZS5tb2RlXSwKLQkJCQlwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICogMTAwMCwgLyoga2JwcyAtPiBicHMgKi8KLQkJCQlwYXJhbXMtPnZpX2JpdHJhdGUubWF4ICogMTAwMCAvIEJMQUNLQklSRF9QRUFLX1JBVEVfRElWSVNPUiwgLyogcGVhay80MDAgKi8KLQkJCQlCTEFDS0JJUkRfTVVYX1JBVEVfREVGQVVMVCAvKiwgMHg3MCovKTsgLyogZW5jb2RpbmcgYnVmZmVyLCBja2VubmVkeSAqLwotCX0KLQotCS8qIFRPRE86IGltcGxlbWVudCB0aGUgc3RyZWFtIElEIHN0dWZmOgotCQl0c19waWRfcG10LCB0c19waWRfYXVkaW8sIHRzX3BpZF92aWRlbywgdHNfcGlkX3BjciwKLQkJcHNfc2l6ZSwgYXVfcGVzaWQsIHZpX3Blc2lkCi0JKi8KLQlVUERBVEVfUEFSQU0oIHRzX3BpZF9wbXQgKTsKLQlVUERBVEVfUEFSQU0oIHRzX3BpZF9hdWRpbyApOwotCVVQREFURV9QQVJBTSggdHNfcGlkX3ZpZGVvICk7Ci0JVVBEQVRFX1BBUkFNKCB0c19waWRfcGNyICk7Ci0JVVBEQVRFX1BBUkFNKCBwc19zaXplICk7Ci0JVVBEQVRFX1BBUkFNKCBhdV9wZXNpZCApOwotCVVQREFURV9QQVJBTSggdmlfcGVzaWQgKTsKLX0KLQotc3RhdGljIHZvaWQgYmxhY2tiaXJkX3NldF9kZWZhdWx0X2Rucl9wYXJhbXMoc3RydWN0IGN4ODgwMl9kZXYgKmRldikKLXsKLQkvKiBhc3NpZ24gZG5yIGZpbHRlciBtb2RlICovCi0JaWYoIGRldi0+ZG5yX3BhcmFtcy5tb2RlID4gQkxBQ0tCSVJEX0ROUl9CSVRTX0FVVE8gKQotCQlkZXYtPmRucl9wYXJhbXMubW9kZSA9IEJMQUNLQklSRF9ETlJfQklUU19NQU5VQUw7Ci0JaWYoIGRldi0+ZG5yX3BhcmFtcy50eXBlID4gQkxBQ0tCSVJEX01FRElBTl9GSUxURVJfRElBR09OQUwgKQotCQlkZXYtPmRucl9wYXJhbXMudHlwZSA9IEJMQUNLQklSRF9NRURJQU5fRklMVEVSX0RJU0FCTEVEOwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01PREUsIDIsIDAsCi0JCQkJZGV2LT5kbnJfcGFyYW1zLm1vZGUsCi0JCQkJZGV2LT5kbnJfcGFyYW1zLnR5cGUKLQkJCSk7Ci0KLQkvKiBhc3NpZ24gZG5yIGZpbHRlciBwcm9wcyovCi0JaWYoIGRldi0+ZG5yX3BhcmFtcy5zcGF0aWFsID4gMTUgKQotCQlkZXYtPmRucl9wYXJhbXMuc3BhdGlhbCA9IDE1OwotCWlmKCBkZXYtPmRucl9wYXJhbXMudGVtcG9yYWwgPiAzMSApCi0JCWRldi0+ZG5yX3BhcmFtcy50ZW1wb3JhbCA9IDMxOwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfTUFOVUFMX0ROUiwgMiwgMCwKLQkJCQlkZXYtPmRucl9wYXJhbXMuc3BhdGlhbCwKLQkJCQlkZXYtPmRucl9wYXJhbXMudGVtcG9yYWwKLQkJCSk7Ci19Ci0jZGVmaW5lIENIRUNLX0ROUl9QQVJBTSggbmFtZSApICggZGV2LT5kbnJfcGFyYW1zLm5hbWUgIT0gZG5yX3BhcmFtcy0+bmFtZSApCi0jZGVmaW5lIFVQREFURV9ETlJfUEFSQU0oIG5hbWUgKSBkZXYtPmRucl9wYXJhbXMubmFtZSA9IGRucl9wYXJhbXMtPm5hbWUKLXZvaWQgYmxhY2tiaXJkX3NldF9kbnJfcGFyYW1zKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYsIHN0cnVjdCBibGFja2JpcmRfZG5yKiBkbnJfcGFyYW1zKQotewotCS8qIGFzc2lnbiBkbnIgZmlsdGVyIG1vZGUgKi8KLQkvKiBjbGFtcCB2YWx1ZXMgKi8KLQlpZiggZG5yX3BhcmFtcy0+bW9kZSA+IEJMQUNLQklSRF9ETlJfQklUU19BVVRPICkKLQkJZG5yX3BhcmFtcy0+bW9kZSA9IEJMQUNLQklSRF9ETlJfQklUU19NQU5VQUw7Ci0JaWYoIGRucl9wYXJhbXMtPnR5cGUgPiBCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESUFHT05BTCApCi0JCWRucl9wYXJhbXMtPnR5cGUgPSBCTEFDS0JJUkRfTUVESUFOX0ZJTFRFUl9ESVNBQkxFRDsKLQkvKiBjaGVjayBpZiB0aGUgcGFyYW1zIGFjdHVhbGx5IGNoYW5nZWQgKi8KLQlpZiggQ0hFQ0tfRE5SX1BBUkFNKCBtb2RlICkgfHwgQ0hFQ0tfRE5SX1BBUkFNKCB0eXBlICkgKQotCXsKLQkJVVBEQVRFX0ROUl9QQVJBTSggbW9kZSApOwotCQlVUERBVEVfRE5SX1BBUkFNKCB0eXBlICk7Ci0JCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfRE5SX01PREUsIDIsIDAsIGRucl9wYXJhbXMtPm1vZGUsIGRucl9wYXJhbXMtPnR5cGUpOwotCX0KLQotCS8qIGFzc2lnbiBkbnIgZmlsdGVyIHByb3BzKi8KLQlpZiggZG5yX3BhcmFtcy0+c3BhdGlhbCA+IDE1ICkKLQkJZG5yX3BhcmFtcy0+c3BhdGlhbCA9IDE1OwotCWlmKCBkbnJfcGFyYW1zLT50ZW1wb3JhbCA+IDMxICkKLQkJZG5yX3BhcmFtcy0+dGVtcG9yYWwgPSAzMTsKLQlpZiggQ0hFQ0tfRE5SX1BBUkFNKCBzcGF0aWFsICkgfHwgQ0hFQ0tfRE5SX1BBUkFNKCB0ZW1wb3JhbCApICkKLQl7Ci0JCVVQREFURV9ETlJfUEFSQU0oIHNwYXRpYWwgKTsKLQkJVVBEQVRFX0ROUl9QQVJBTSggdGVtcG9yYWwgKTsKLQkJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9NQU5VQUxfRE5SLCAyLCAwLCBkbnJfcGFyYW1zLT5zcGF0aWFsLCBkbnJfcGFyYW1zLT50ZW1wb3JhbCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBibGFja2JpcmRfY29kZWNfc2V0dGluZ3Moc3RydWN0IGN4ODgwMl9kZXYgKmRldikKLXsKLQotCS8qIGFzc2lnbiBvdXRwdXQgcG9ydCAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfT1VUUFVUX1BPUlQsIDEsIDAsIEJMQUNLQklSRF9PVVRQVVRfUE9SVF9TVFJFQU1JTkcpOyAvKiBIb3N0ICovCi0KLQkvKiBhc3NpZ24gZnJhbWUgc2l6ZSAqLwotCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9TRVRfUkVTT0xVVElPTiwgMiwgMCwKLQkJCQlkZXYtPmhlaWdodCwgZGV2LT53aWR0aCk7Ci0KLQkvKiBhc3NpZ24gY29yaW5nIGxldmVscyAobHVtYV9oLCBsdW1hX2wsIGNocm9tYV9oLCBjaHJvbWFfbCkgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0ROUl9NRURJQU4sIDQsIDAsIDAsIDI1NSwgMCwgMjU1KTsKLQotCS8qIGFzc2lnbiBzcGF0aWFsIGZpbHRlciB0eXBlOiBsdW1hX3Q6IGhvcml6X29ubHksIGNocm9tYV90OiBob3Jpel9vbmx5ICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9TUEFUSUFMX0ZJTFRFUiwgMiwgMCwKLQkJCQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfTFVNQV8xRF9IT1JJWiwKLQkJCQlCTEFDS0JJUkRfU1BBVElBTF9GSUxURVJfQ0hST01BXzFEX0hPUklaCi0JCQkpOwotCi0JLyogYXNzaWduIGZyYW1lIGRyb3AgcmF0ZSAqLwotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX0ZSQU1FX0RST1BfUkFURSwgMSwgMCwgMCk7ICovCi0KLQlibGFja2JpcmRfc2V0X2RlZmF1bHRfcGFyYW1zKGRldik7Ci0JYmxhY2tiaXJkX3NldF9kZWZhdWx0X2Rucl9wYXJhbXMoZGV2KTsKLX0KLQogc3RhdGljIGludCBibGFja2JpcmRfaW5pdGlhbGl6ZV9jb2RlYyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2KQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CkBAIC0xMjQ4LDcgKzU2OCw3IEBACiAJaW50IHJldHZhbDsKIAogCWRwcmludGsoMSwiSW5pdGlhbGl6ZSBjb2RlY1xuIik7Ci0JcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1BJTkcsIDAsIDApOyAvKiBwaW5nICovCisJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19QSU5HX0ZXLCAwLCAwKTsgLyogcGluZyAqLwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCS8qIHBpbmcgd2FzIG5vdCBzdWNjZXNzZnVsLCByZXNldCBhbmQgdXBsb2FkIGZpcm13YXJlICovCiAJCWN4X3dyaXRlKE1PX1NSU1RfSU8sIDApOyAvKiBTWVNfUlNUTz0wICovCkBAIC0xMjYzLDEzICs1ODMsMTMgQEAKIAkJaWYgKGRldi0+bWFpbGJveCA8IDApCiAJCQlyZXR1cm4gLTE7CiAKLQkJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1BJTkcsIDAsIDApOyAvKiBwaW5nICovCisJCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfUElOR19GVywgMCwgMCk7IC8qIHBpbmcgKi8KIAkJaWYgKHJldHZhbCA8IDApIHsKIAkJCWRwcmludGsoMCwgIkVSUk9SOiBGaXJtd2FyZSBwaW5nIGZhaWxlZCFcbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKLQkJcmV0dmFsID0gYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0dFVF9WRVJTSU9OLCAwLCAxLCAmdmVyc2lvbik7CisJCXJldHZhbCA9IGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfR0VUX1ZFUlNJT04sIDAsIDEsICZ2ZXJzaW9uKTsKIAkJaWYgKHJldHZhbCA8IDApIHsKIAkJCWRwcmludGsoMCwgIkVSUk9SOiBGaXJtd2FyZSBnZXQgZW5jb2RlciB2ZXJzaW9uIGZhaWxlZCFcbiIpOwogCQkJcmV0dXJuIC0xOwpAQCAtMTI4OSwzNSArNjA5LDM1IEBACiAJLyogYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBJVlRWX0FQSV9BU1NJR05fTlVNX1ZTWU5DX0xJTkVTLCA0LCAwLCAweGVmLCAweGVmKTsKIAkgICBibGFja2JpcmRfYXBpX2NtZChkZXYsIElWVFZfQVBJX0FTU0lHTl9OVU1fVlNZTkNfTElORVMsIDQsIDAsIDB4ZjAsIDB4ZjApOwogCSAgIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX05VTV9WU1lOQ19MSU5FUywgNCwgMCwgMHgxODAsIDB4MTgwKTsgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfU0VUX0NBUFRVUkVfTElORVMsIDIsIDAsCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19TRVRfTlVNX1ZTWU5DX0xJTkVTLCAyLCAwLAogCQkJQkxBQ0tCSVJEX0ZJRUxEMV9TQUE3MTE1LAotCQkJQkxBQ0tCSVJEX0ZJRUxEMV9TQUE3MTE1CisJCQlCTEFDS0JJUkRfRklFTEQyX1NBQTcxMTUKIAkJKTsKIAogCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgSVZUVl9BUElfQVNTSUdOX1BMQUNFSE9MREVSLCAxMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7ICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX1NFVF9DVVNUT01fREFUQSwgMTIsIDAsCisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19TRVRfUExBQ0VIT0xERVIsIDEyLCAwLAogCQkJQkxBQ0tCSVJEX0NVU1RPTV9FWFRFTlNJT05fVVNSX0RBVEEsCiAJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKIAogCS8qIGluaXRpYWxpemUgdGhlIHZpZGVvIGlucHV0ICovCi0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX0lOSVRfVklERU9fSU5QVVQsIDAsIDApOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfSU5JVElBTElaRV9JTlBVVCwgMCwgMCk7CiAKIAltc2xlZXAoMSk7CiAKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfTVVURV9WSURFTywgMSwgMCwgQkxBQ0tCSVJEX1VOTVVURSk7CisJYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBDWDIzNDFYX0VOQ19NVVRFX1ZJREVPLCAxLCAwLCBCTEFDS0JJUkRfVU5NVVRFKTsKIAltc2xlZXAoMSk7Ci0JYmxhY2tiaXJkX2FwaV9jbWQoZGV2LCBCTEFDS0JJUkRfQVBJX01VVEVfQVVESU8sIDEsIDAsIEJMQUNLQklSRF9VTk1VVEUpOworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfTVVURV9BVURJTywgMSwgMCwgQkxBQ0tCSVJEX1VOTVVURSk7CiAJbXNsZWVwKDEpOwogCiAJLyogc3RhcnQgY2FwdHVyaW5nIHRvIHRoZSBob3N0IGludGVyZmFjZSAqLwotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGRldiwgQkxBQ0tCSVJEX0FQSV9CRUdJTl9DQVBUVVJFLCAyLCAwLCAwLCAweDEzKTsgKi8KLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfQkVHSU5fQ0FQVFVSRSwgMiwgMCwKKwkvKiBibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1NUQVJUX0NBUFRVUkUsIDIsIDAsIDAsIDB4MTMpOyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGRldiwgQ1gyMzQxWF9FTkNfU1RBUlRfQ0FQVFVSRSwgMiwgMCwKIAkJCUJMQUNLQklSRF9NUEVHX0NBUFRVUkUsCiAJCQlCTEFDS0JJUkRfUkFXX0JJVFNfTk9ORQogCQkpOwogCW1zbGVlcCgxMCk7CiAKLQlibGFja2JpcmRfYXBpX2NtZChkZXYsIEJMQUNLQklSRF9BUElfUkVGUkVTSF9JTlBVVCwgMCwwKTsKKwlibGFja2JpcmRfYXBpX2NtZChkZXYsIENYMjM0MVhfRU5DX1JFRlJFU0hfSU5QVVQsIDAsMCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0ODUsMTQgKzgwNSw1MiBAQAogCXsKIAkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqZiA9IGFyZzsKIAotCQltZW1jcHkoZiwmZGV2LT5wYXJhbXMsc2l6ZW9mKCpmKSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19HX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX0dfRVhUX0NUUkxTISIpOworCQltZW1jcHkoZiwmZGVmYXVsdF9tcGVnX3BhcmFtcyxzaXplb2YoKmYpKTsKIAkJcmV0dXJuIDA7CiAJfQogCWNhc2UgVklESU9DX1NfTVBFR0NPTVA6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19TX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX1NfRVhUX0NUUkxTISIpOworCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKIAl7Ci0JCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKmYgPSBhcmc7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqZiA9IGFyZzsKIAotCQlibGFja2JpcmRfc2V0X3BhcmFtcyhkZXYsIGYpOworCQlpZiAoZi0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gY3gyMzQxeF9leHRfY3RybHMoJmRldi0+cGFyYW1zLCBmLCBjbWQpOworCX0KKwljYXNlIFZJRElPQ19TX0VYVF9DVFJMUzoKKwljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpmID0gYXJnOworCQlzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyBwOworCQlpbnQgZXJyOworCisJCWlmIChmLT5jdHJsX2NsYXNzICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXAgPSBkZXYtPnBhcmFtczsKKwkJZXJyID0gY3gyMzQxeF9leHRfY3RybHMoJnAsIGYsIGNtZCk7CisJCWlmIChlcnIgPT0gMCAmJiBjbWQgPT0gVklESU9DX1NfRVhUX0NUUkxTKSB7CisJCQllcnIgPSBjeDIzNDF4X3VwZGF0ZShkZXYsIGJsYWNrYmlyZF9tYm94X2Z1bmMsICZkZXYtPnBhcmFtcywgJnApOworCQkJZGV2LT5wYXJhbXMgPSBwOworCQl9CisJCXJldHVybiBlcnI7CisJfQorCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgorCXsKKwkJYmxhY2tiaXJkX2FwaV9jbWQoZmgtPmRldiwgQ1gyMzQxWF9FTkNfU1RPUF9DQVBUVVJFLCAzLCAwLAorCQkJCSAgQkxBQ0tCSVJEX0VORF9OT1csCisJCQkJICBCTEFDS0JJUkRfTVBFR19DQVBUVVJFLAorCQkJCSAgQkxBQ0tCSVJEX1JBV19CSVRTX05PTkUpOworCisJCWN4ODhfZG9faW9jdGwoIGlub2RlLCBmaWxlLCAwLCBkZXYtPmNvcmUsIGNtZCwgYXJnLCBjeDg4X2lvY3RsX2hvb2sgKTsKKworCQlibGFja2JpcmRfaW5pdGlhbGl6ZV9jb2RlYyhkZXYpOworCQljeDg4X3NldF9zY2FsZShkZXYtPmNvcmUsIGRldi0+d2lkdGgsIGRldi0+aGVpZ2h0LAorCQkJICAgICAgIGZoLT5tcGVncS5maWVsZCk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTU2MiwxMyArOTIwLDE0IEBACiB7CiAJc3RydWN0IGN4ODgwMl9maCAgKmZoICA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCS8qIGJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIEJMQUNLQklSRF9BUElfRU5EX0NBUFRVUkUsIDMsIDAsIEJMQUNLQklSRF9FTkRfTk9XLCAwLCAweDEzKTsgKi8KLQlibGFja2JpcmRfYXBpX2NtZChmaC0+ZGV2LCBCTEFDS0JJUkRfQVBJX0VORF9DQVBUVVJFLCAzLCAwLAorCS8qIGJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgMywgMCwgQkxBQ0tCSVJEX0VORF9OT1csIDAsIDB4MTMpOyAqLworCWJsYWNrYmlyZF9hcGlfY21kKGZoLT5kZXYsIENYMjM0MVhfRU5DX1NUT1BfQ0FQVFVSRSwgMywgMCwKIAkJCUJMQUNLQklSRF9FTkRfTk9XLAogCQkJQkxBQ0tCSVJEX01QRUdfQ0FQVFVSRSwKIAkJCUJMQUNLQklSRF9SQVdfQklUU19OT05FCiAJCSk7CiAKKwljeDg4MDJfY2FuY2VsX2J1ZmZlcnMoZmgtPmRldik7CiAJLyogc3RvcCBtcGVnIGNhcHR1cmUgKi8KIAlpZiAoZmgtPm1wZWdxLnN0cmVhbWluZykKIAkJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+bXBlZ3EpOwpAQCAtMTY4MywxOSArMTA0MiwxMyBAQAogCWRldi0+Y29yZSA9IGNvcmU7CiAJZGV2LT53aWR0aCA9IDcyMDsKIAlkZXYtPmhlaWdodCA9IDU3NjsKLQltZW1jcHkoJmRldi0+cGFyYW1zLCZkZWZhdWx0X21wZWdfcGFyYW1zLHNpemVvZihkZWZhdWx0X21wZWdfcGFyYW1zKSk7Ci0JbWVtY3B5KCZkZXYtPmRucl9wYXJhbXMsJmRlZmF1bHRfZG5yX3BhcmFtcyxzaXplb2YoZGVmYXVsdF9kbnJfcGFyYW1zKSk7CisJY3gyMzQxeF9maWxsX2RlZmF1bHRzKCZkZXYtPnBhcmFtcyk7CisJZGV2LT5wYXJhbXMucG9ydCA9IENYMjM0MVhfUE9SVF9TVFJFQU1JTkc7CiAKLQlpZiAoY29yZS0+Ym9hcmQgPT0gQ1g4OF9CT0FSRF9IQVVQUEFVR0VfUk9TTFlOKSB7Ci0KLQkJaWYgKGNvcmUtPnR1bmVyX2Zvcm1hdHMgJiBWNEwyX1NURF81MjVfNjApIHsKLQkJCWRldi0+aGVpZ2h0ID0gNDgwOwotCQkJZGV2LT5wYXJhbXMudmlfZnJhbWVfcmF0ZSA9IDMwOwotCQl9IGVsc2UgewotCQkJZGV2LT5oZWlnaHQgPSA1NzY7Ci0JCQlkZXYtPnBhcmFtcy52aV9mcmFtZV9yYXRlID0gMjU7Ci0JCX0KLQorCWlmIChjb3JlLT50dm5vcm0tPmlkICYgVjRMMl9TVERfNTI1XzYwKSB7CisJCWRldi0+aGVpZ2h0ID0gNDgwOworCX0gZWxzZSB7CisJCWRldi0+aGVpZ2h0ID0gNTc2OwogCX0KIAogCWVyciA9IGN4ODgwMl9pbml0X2NvbW1vbihkZXYpOwpAQCAtMTc4MSw4ICsxMTM0LDYgQEAKIAogRVhQT1JUX1NZTUJPTChjeDg4X2lvY3RsX2hvb2spOwogRVhQT1JUX1NZTUJPTChjeDg4X2lvY3RsX3RyYW5zbGF0b3IpOwotRVhQT1JUX1NZTUJPTChibGFja2JpcmRfc2V0X3BhcmFtcyk7Ci1FWFBPUlRfU1lNQk9MKGJsYWNrYmlyZF9zZXRfZG5yX3BhcmFtcyk7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKaW5kZXggZjgwMTU0Yi4uNjdjZGQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAkJLnJhZGlvID0gewogCQkJIC50eXBlICA9IENYODhfUkFESU8sCiAJCQkgLmdwaW8wID0gMHhmZjEwLAotCQkgfSwKKwkJfSwKIAl9LAogCVtDWDg4X0JPQVJEX0FUSV9XT05ERVJfUFJPXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkFUSSBUViBXb25kZXIgUHJvIiwKQEAgLTI2Nyw3ICsyNjcsNyBAQAogCQkJLmdwaW8xICA9IDB4MDAwMDcwMDQsCiAJCQkuZ3BpbzIgID0gMHgwMDM1ZDcwMCwKIAkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAotCQkgfSwKKwkJfSwKIAl9LAogCVtDWDg4X0JPQVJEX0xFQURURUtfUFZSMjAwMF0gPSB7CiAJCS8vIGdwaW8gdmFsdWVzIGZvciBQQUwgdmVyc2lvbiBmcm9tIHJlZ3NweSBieSBEU2NhbGVyCkBAIC00MTMsNyArNDEzLDcgQEAKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgPSAxLAogCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCi0JCSB9LHsKKwkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgPSAyLAogCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCkBAIC01MzYsNyArNTM2LDcgQEAKIAkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKIAkJCS52bXV4ICAgPSAxLAogCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCi0JCSB9LHsKKwkJfSx7CiAJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKIAkJCS52bXV4ICAgPSAyLAogCQkJLmdwaW8wICA9IDB4MDAwMDI3ZGYsCkBAIC03NTksNyArNzU5LDcgQEAKIAl9LAogCVtDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfNV9HT0xEXSA9IHsKIAkJLm5hbWUgICAgICAgICAgID0gIkRWaUNPIEZ1c2lvbkhEVFYgNSBHb2xkIiwKLQkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDYyRiwKKwkJLnR1bmVyX3R5cGUgICAgID0gVFVORVJfTEdfVERWU19IMDZYRiwgLyogVERWUy1IMDYyRiAqLwogCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKIAkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAogCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCkBAIC0xMDUwLDExICsxMDUwLDcgQEAKIAkJLmR2YiAgICAgICAgICAgID0gMSwKIAl9LAogCVtDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUXSA9IHsKLQkJLyogRklYTUU6IFN0YW5kYXJkIHZpZGVvIHVzaW5nIHRoZSBjeDg4IGJyb2FkY2FzdCBkZWNvZGVyIGlzCi0JCSAqIHdvcmtpbmcsIGJ1dCBibGFja2JpcmQgaXNuJ3Qgd29ya2luZyB5ZXQsIGF1ZGlvIGlzIG9ubHkKLQkJICogd29ya2luZyBjb3JyZWN0bHkgZm9yIHRlbGV2aXNpb24gbW9kZS4gUy1WaWRlbyBhbmQgQ29tcG9zaXRlCi0JCSAqIGFyZSB3b3JraW5nIGZvciB2aWRlby1vbmx5LCBzbyBJIGhhdmUgdGhlbSBkaXNhYmxlZCBmb3Igbm93LgotCQkgKi8KKwkJLyogRklYTUU6IEF1ZGlvIG5vdCB3b3JraW5nIGZvciBzLXZpZGVvIC8gY29tcG9zaXRlIGlucHV0cy4gKi8KIAkJLm5hbWUgICAgICAgICAgID0gIktXb3JsZCBIYXJkd2FyZU1wZWdUViBYUGVydCIsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfVERBODI5MCwKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCkBAIC0xMDY1LDEyICsxMDYxLDIxIEBACiAJCQkudm11eCAgID0gMCwKIAkJCS5ncGlvMCAgPSAweDNkZTIsCiAJCQkuZ3BpbzIgID0gMHgwMGZmLAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ICAgPSAxLAorCQkJLmdwaW8wICA9IDB4M2RlNiwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wICA9IDB4M2RlNiwKIAkJfX0sCiAJCS5yYWRpbyA9IHsKIAkJCS50eXBlICAgPSBDWDg4X1JBRElPLAogCQkJLmdwaW8wICA9IDB4M2RlNiwKIAkJCS5ncGlvMiAgPSAweDAwZmYsCiAJCX0sCisJCS5ibGFja2JpcmQgICAgICA9IDEsCiAJfSwKIAlbQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRF0gPSB7CiAJCS5uYW1lICAgICAgICAgICA9ICJEVmlDTyBGdXNpb25IRFRWIERWQi1UIEh5YnJpZCIsCkBAIC0xMDkzLDcgKzEwOTgsMTAyIEBACiAJCX19LAogCQkuZHZiICAgICAgICAgICAgPSAxLAogCX0sCi0KKwlbQ1g4OF9CT0FSRF9QQ0hEVFZfSEQ1NTAwXSA9IHsKKwkJLm5hbWUgICAgICAgICAgID0gInBjSERUViBIRDU1MDAgSERUViIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX0xHX1REVlNfSDA2WEYsIC8qIFREVlMtSDA2NEYgKi8KKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDg3ZmQsCisJCX0seworCQkJLnR5cGUgICA9IENYODhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggICA9IDEsCisJCQkuZ3BpbzAgID0gMHg4N2Y5LAorCQl9LHsKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggICA9IDIsCisJCQkuZ3BpbzAgID0gMHg4N2Y5LAorCQl9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX0tXT1JMRF9NQ0UyMDBfREVMVVhFXSA9IHsKKwkJLyogRklYTUU6IHRlc3RlZCBUViBpbnB1dCBvbmx5LCBkaXNhYmxlZCBjb21wb3NpdGUsCisJCSAgIHN2aWRlbyBhbmQgcmFkaW8gdW50aWwgdGhleSBjYW4gYmUgdGVzdGVkIGFsc28uICovCisJCS5uYW1lICAgICAgICAgICA9ICJLd29ybGQgTUNFIDIwMCBEZWx1eGUiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9URU5BXzk1MzNfREksCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMDBCREU2CisJCX19LAorCQkuYmxhY2tiaXJkID0gMSwKKwl9LAorCVtDWDg4X0JPQVJEX1BJWEVMVklFV19QTEFZVFZfUDcwMDBdID0geworCQkvKiBGSVhNRTogU1ZpZGVvLCBDb21wb3NpdGUgYW5kIEZNIGlucHV0cyBhcmUgdW50ZXN0ZWQgKi8KKwkJLm5hbWUgICAgICAgICAgID0gIlBpeGVsVmlldyBQbGF5VFYgUDcwMDAiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnJhZGlvX2FkZHIJPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQgfCBUREE5ODg3X1BPUlQxX0FDVElWRSB8CisJCQkJICBUREE5ODg3X1BPUlQyX0FDVElWRSwKKwkJLmlucHV0ICAgICAgICAgID0ge3sKKwkJCS50eXBlICAgPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4ICAgPSAwLAorCQkJLmdwaW8wICA9IDB4NWRhNiwKKwkJfX0sCisJCS5ibGFja2JpcmQgPSAxLAorCX0sCisJW0NYODhfQk9BUkRfTlBHVEVDSF9SRUFMVFZfVE9QMTBGTV0gPSB7CisJCS5uYW1lICAgICAgICAgICA9ICJOUEcgVGVjaCBSZWFsIFRWIEZNIFRvcCAxMCIsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1RORl81MzM1TUYsIC8qIEFjdHVhbGx5IGEgVE5GOTUzNSAqLworCQkucmFkaW9fdHlwZSAgICAgPSBVTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMAk9IDB4MDc4OCwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eCAgID0gMSwKKwkJCS5ncGlvMAk9IDB4MDc4YiwKKwkJfSx7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4ICAgPSAyLAorCQkJLmdwaW8wCT0gMHgwNzhiLAorCQl9fSwKKwkJLnJhZGlvID0geworCQkJIC50eXBlICA9IENYODhfUkFESU8sCisJCQkgLmdwaW8wID0gMHgwNzRhLAorCQl9LAorCX0sCisJW0NYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF0gPSB7CisJCS8qIHZpZGVvIGlucHV0cyBhbmQgcmFkaW8gc3RpbGwgaW4gdGVzdGluZyAqLworCQkubmFtZSAgICAgICAgICAgPSAiV2luRmFzdCBEVFYyMDAwIEgiLAorCQkudHVuZXJfdHlwZSAgICAgPSBUVU5FUl9QSElMSVBTX0ZNRDEyMTZNRV9NSzMsCisJCS5yYWRpb190eXBlICAgICA9IFVOU0VULAorCQkudHVuZXJfYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkucmFkaW9fYWRkciAgICAgPSBBRERSX1VOU0VULAorCQkudGRhOTg4N19jb25mICAgPSBUREE5ODg3X1BSRVNFTlQsCisJCS5pbnB1dCAgICAgICAgICA9IHt7CisJCQkudHlwZSAgID0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCAgID0gMCwKKwkJCS5ncGlvMCAgPSAweDAwMDE3MzA0LAorCQkJLmdwaW8xICA9IDB4MDAwMDgyMDMsCisJCQkuZ3BpbzIgID0gMHgwMDAxNzMwNCwKKwkJCS5ncGlvMyAgPSAweDAyMDAwMDAwLAorCQl9fSwKKwkJLmR2YiAgICAgICAgICAgID0gMSwKKwl9LAogfTsKIGNvbnN0IHVuc2lnbmVkIGludCBjeDg4X2Jjb3VudCA9IEFSUkFZX1NJWkUoY3g4OF9ib2FyZHMpOwogCkBAIC0xMzExLDYgKzE0MTEsMzQgQEAKIAkJLnN1YnZlbmRvciA9IDB4MThhYywKIAkJLnN1YmRldmljZSA9IDB4ZGI0NCwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9IWUJSSUQsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDcwNjMsCisJCS5zdWJkZXZpY2UgPSAweDU1MDAsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDAsCisJfSx7CisJCS5zdWJ2ZW5kb3IgPSAweDE3ZGUsCisJCS5zdWJkZXZpY2UgPSAweDA4NDEsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0tXT1JMRF9NQ0UyMDBfREVMVVhFLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxODIyLAorCQkuc3ViZGV2aWNlID0gMHgwMDE5LAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9ETlRWX0xJVkVfRFZCX1RfUFJPLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxNTU0LAorCQkuc3ViZGV2aWNlID0gMHg0ODEzLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9QSVhFTFZJRVdfUExBWVRWX1A3MDAwLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxNGYxLAorCQkuc3ViZGV2aWNlID0gMHgwODQyLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9OUEdURUNIX1JFQUxUVl9UT1AxMEZNLAorCX0seworCQkuc3VidmVuZG9yID0gMHgxMDdkLAorCQkuc3ViZGV2aWNlID0gMHg2NjVlLAorCQkuY2FyZCAgICAgID0gQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBILAorCX0seworCQkuc3VidmVuZG9yID0gMHgxOGFjLAorCQkuc3ViZGV2aWNlID0gMHhkODAwLCAvKiBGdXNpb25IRFRWIDMgR29sZCAob3JpZ2luYWwgcmV2aXNpb24pICovCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1EsCiAJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3g4OF9pZGNvdW50ID0gQVJSQVlfU0laRShjeDg4X3N1Ymlkcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKaW5kZXggZTEwOTJkNS4uYzU2MjkyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNvcmUuYwpAQCAtNjc3LDcgKzY3Nyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaW5saW5lIG5vcm1fdmJpcGFjayhzdHJ1Y3QgY3g4OF90dm5vcm0gKm5vcm0pCiB7Ci0JcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA1MTEgOiAyODg7CisJcmV0dXJuIChub3JtLT5pZCAmIFY0TDJfU1REXzYyNV81MCkgPyA1MTEgOiA0MDA7CiB9CiAKIGludCBjeDg4X3NldF9zY2FsZShzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCkBAIC05MzIsOSArOTMyLDkgQEAKIAkJaHRvdGFsLCBjeF9yZWFkKE1PX0hUT1RBTCksICh1MzIpdG1wNjQpOwogCWN4X3dyaXRlKE1PX0hUT1RBTCwgaHRvdGFsKTsKIAotCS8vIHZiaSBzdHVmZgotCWN4X3dyaXRlKE1PX1ZCSV9QQUNLRVQsICgoMSA8PCAxMSkgfCAvKiAobm9ybV92ZGVsYXkobm9ybSkgICA8PCAxMSkgfCAqLwotCQkJCSBub3JtX3ZiaXBhY2sobm9ybSkpKTsKKwkvLyB2Ymkgc3R1ZmYsIHNldCB2Ymkgb2Zmc2V0IHRvIDEwIChmb3IgMjAgQ2xrKjIgcGl4ZWxzKSwgdGhpcyBtYWtlcworCS8vIHRoZSBlZmZlY3RpdmUgdmJpIG9mZnNldCB+MjQ0IHNhbXBsZXMsIHRoZSBzYW1lIGFzIHRoZSBCdDh4OAorCWN4X3dyaXRlKE1PX1ZCSV9QQUNLRVQsICgxMDw8MTEpIHwgbm9ybV92YmlwYWNrKG5vcm0pKTsKIAogCS8vIHRoaXMgaXMgbmVlZGVkIGFzIHdlbGwgdG8gc2V0IGFsbCB0dm5vcm0gcGFyYW1ldGVyCiAJY3g4OF9zZXRfc2NhbGUoY29yZSwgMzIwLCAyNDAsIFY0TDJfRklFTERfSU5URVJMQUNFRCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCmluZGV4IDM2MTlhNDQuLmRjZTFmZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jCkBAIC01MSw2ICs1MSw3IEBACiAjZW5kaWYKICNpZmRlZiBIQVZFX0xHRFQzMzBYCiAjIGluY2x1ZGUgImxnZHQzMzB4LmgiCisjIGluY2x1ZGUgImxnX2gwNnhmLmgiCiAjZW5kaWYKICNpZmRlZiBIQVZFX05YVDIwMFgKICMgaW5jbHVkZSAibnh0MjAweC5oIgpAQCAtNTgsNiArNTksNyBAQAogI2lmZGVmIEhBVkVfQ1gyNDEyMwogIyBpbmNsdWRlICJjeDI0MTIzLmgiCiAjZW5kaWYKKyNpbmNsdWRlICJpc2w2NDIxLmgiCiAKIE1PRFVMRV9ERVNDUklQVElPTigiZHJpdmVyIGZvciBjeDIzODh4IGJhc2VkIERWQiBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKQEAgLTExMywyMSArMTE1LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZiBkZWZpbmVkKEhBVkVfTVQzNTIpIHx8IGRlZmluZWQoSEFWRV9aTDEwMzUzKQotc3RhdGljIGludCB6YXJsaW5rX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcywKLQkJCSAgICAgIHU4ICpwbGxidWYpCi17Ci0Jc3RydWN0IGN4ODgwMl9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7Ci0KLQlwbGxidWZbMF0gPSBkZXYtPmNvcmUtPnBsbF9hZGRyIDw8IDE7Ci0JZHZiX3BsbF9jb25maWd1cmUoZGV2LT5jb3JlLT5wbGxfZGVzYywgcGxsYnVmICsgMSwKLQkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCi0JCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogI2lmZGVmIEhBVkVfTVQzNTIKIHN0YXRpYyBpbnQgZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQqIGZlKQogewpAQCAtMTk2LDE5ICsxODMsMTYgQEAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGR2aWNvX2Z1c2lvbmhkdHYgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBGLAogCS5kZW1vZF9pbml0ICAgID0gZHZpY29fZnVzaW9uaGR0dl9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gemFybGlua19wbGxfc2V0LAogfTsKIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgZG50dl9saXZlX2R2YnRfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwZiwKIAkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X2RlbW9kX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSB6YXJsaW5rX3BsbF9zZXQsCiB9OwogCiBzdGF0aWMgc3RydWN0IG10MzUyX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X2R1YWwgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDBGLAogCS5kZW1vZF9pbml0ICAgID0gZHZpY29fZHVhbF9kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gemFybGlua19wbGxfc2V0LAogfTsKIAogI2lmZGVmIEhBVkVfVlAzMDU0X0kyQwpAQCAtMjQ2LDYgKzIzMCw4IEBACiAJCSAgLmJ1ZiA9IGZtZDEyMTZfaW5pdCwgLmxlbiA9IHNpemVvZihmbWQxMjE2X2luaXQpIH07CiAJaW50IGVycjsKIAorCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmRldi0+Y29yZS0+aTJjX2FkYXAsICZtc2csIDEpKSAhPSAxKSB7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKQEAgLTI1NiwxNCArMjQyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfcHJvX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMsCi0JCQkJICAgICAgdTgqIHBsbGJ1ZikKK3N0YXRpYyBpbnQgZG50dl9saXZlX2R2YnRfcHJvX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXU4IGJ1Zls0XTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2cgPQogCQl7IC5hZGRyID0gZGV2LT5jb3JlLT5wbGxfYWRkciwgLmZsYWdzID0gMCwKLQkJICAuYnVmID0gcGxsYnVmKzEsIC5sZW4gPSA0IH07CisJCSAgLmJ1ZiA9IGJ1ZiwgLmxlbiA9IDQgfTsKIAlpbnQgZXJyOwogCiAJLyogU3dpdGNoIFBMTCB0byBEVkIgbW9kZSAqLwpAQCAtMjcyLDE0ICsyNTgsMTYgQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qIFR1bmUgUExMICovCi0JcGxsYnVmWzBdID0gZGV2LT5jb3JlLT5wbGxfYWRkciA8PCAxOwotCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIHBsbGJ1ZisxLAorCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIGJ1ZiwKIAkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCiAJCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoKGVyciA9IGkyY190cmFuc2ZlcigmZGV2LT5jb3JlLT5pMmNfYWRhcCwgJm1zZywgMSkpICE9IDEpIHsKKwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLAotCQkJICAgX19GVU5DVElPTl9fLCBwbGxidWZbMF0sIHBsbGJ1ZlsxXSwgZXJyKTsKKwkJCSAgIF9fRlVOQ1RJT05fXywgZGV2LT5jb3JlLT5wbGxfYWRkciwgYnVmWzBdLCBlcnIpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWVsc2UKQEAgLTI5MywyNyArMjgxLDI3IEBACiAJLmRlbW9kX2FkZHJlc3MgPSAweDBmLAogCS5ub190dW5lciAgICAgID0gMSwKIAkuZGVtb2RfaW5pdCAgICA9IGRudHZfbGl2ZV9kdmJ0X3Byb19kZW1vZF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gZG50dl9saXZlX2R2YnRfcHJvX3BsbF9zZXQsCiB9OwogI2VuZGlmCiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfWkwxMDM1Mwotc3RhdGljIGludCBkdmljb19oeWJyaWRfdHVuZV9wbGwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCi0JCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLAotCQkJCSB1OCAqcGxsYnVmKQorc3RhdGljIGludCBkdmljb19oeWJyaWRfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogeworCXU4IHBsbGJ1Zls0XTsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwogCXN0cnVjdCBpMmNfbXNnIG1zZyA9CiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLAotCQkgIC5idWYgPSBwbGxidWYgKyAxLCAubGVuID0gNCB9OworCQkgIC5idWYgPSBwbGxidWYsIC5sZW4gPSA0IH07CiAJaW50IGVycjsKIAotCXBsbGJ1ZlswXSA9IGRldi0+Y29yZS0+cGxsX2FkZHIgPDwgMTsKLQlkdmJfcGxsX2NvbmZpZ3VyZShkZXYtPmNvcmUtPnBsbF9kZXNjLCBwbGxidWYgKyAxLAorCWR2Yl9wbGxfY29uZmlndXJlKGRldi0+Y29yZS0+cGxsX2Rlc2MsIHBsbGJ1ZiwKIAkJCSAgcGFyYW1zLT5mcmVxdWVuY3ksCiAJCQkgIHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCk7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmICgoZXJyID0gaTJjX3RyYW5zZmVyKCZkZXYtPmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLApAQCAtMzI5LDEyICszMTcsMTEgQEAKIAogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X2h5YnJpZCA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MEYsCi0JLnBsbF9zZXQgICAgICAgPSBkdmljb19oeWJyaWRfdHVuZV9wbGwsCisJLm5vX3R1bmVyICAgICAgPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCB6bDEwMzUzX2NvbmZpZyBkdmljb19mdXNpb25oZHR2X3BsdXNfdjFfMSA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MEYsCi0JLnBsbF9zZXQgICAgICAgPSB6YXJsaW5rX3BsbF9zZXQsCiB9OwogI2VuZGlmCiAKQEAgLTM0MiwyMSArMzI5LDE1IEBACiBzdGF0aWMgc3RydWN0IGN4MjI3MDJfY29uZmlnIGNvbm5leGFudF9yZWZib2FyZF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweDQzLAogCS5vdXRwdXRfbW9kZSAgID0gQ1gyMjcwMl9TRVJJQUxfT1VUUFVULAotCS5wbGxfYWRkcmVzcyAgID0gMHg2MCwKLQkucGxsX2Rlc2MgICAgICA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX25vdmF0X2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4NDMsCiAJLm91dHB1dF9tb2RlICAgPSBDWDIyNzAyX1NFUklBTF9PVVRQVVQsCi0JLnBsbF9hZGRyZXNzICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4LAogfTsKIHN0YXRpYyBzdHJ1Y3QgY3gyMjcwMl9jb25maWcgaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHg2MywKIAkub3V0cHV0X21vZGUgICA9IENYMjI3MDJfU0VSSUFMX09VVFBVVCwKLQkucGxsX2FkZHJlc3MgICA9IDB4NjEsCi0JLnBsbF9kZXNjICAgICAgPSAmZHZiX3BsbF9mbWQxMjE2bWUsCiB9OwogI2VuZGlmCiAKQEAgLTM3MSwxNSArMzUyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qgb3I1MTEzMl9jb25maWcgcGNoZHR2X2hkMzAwMCA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MTUsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4LAogCS5zZXRfdHNfcGFyYW1zICAgID0gb3I1MTEzMl9zZXRfdHNfcGFyYW0sCiB9OwogI2VuZGlmCiAKICNpZmRlZiBIQVZFX0xHRFQzMzBYCi1zdGF0aWMgaW50IGxnZHQzMzB4X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKiBwYXJhbXMpCitzdGF0aWMgaW50IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKIHsKIAkvKiBGSVhNRSBtYWtlIHRoaXMgcm91dGluZSB1c2UgdGhlIHR1bmVyLXNpbXBsZSBjb2RlLgogCSAqIEl0IGNvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIGEgbnVtYmVyIG9mIEFUU0MKQEAgLTM5MiwxMiArMzcxLDEyIEBACiAJCXsgLmFkZHIgPSBkZXYtPmNvcmUtPnBsbF9hZGRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gYnVmLCAubGVuID0gNCB9OwogCWludCBlcnI7CiAKLQkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLwotCWN4ODhfY2FsbF9pMmNfY2xpZW50cyAoZGV2LT5jb3JlLCBUVU5FUl9TRVRfU1RBTkRCWSwgTlVMTCk7Ci0KIAlkdmJfcGxsX2NvbmZpZ3VyZShjb3JlLT5wbGxfZGVzYywgYnVmLCBwYXJhbXMtPmZyZXF1ZW5jeSwgMCk7CiAJZHByaW50aygxLCAiJXM6IHR1bmVyIGF0IDB4JTAyeCBieXRlczogMHglMDJ4IDB4JTAyeCAweCUwMnggMHglMDJ4XG4iLAogCQkJX19GVU5DVElPTl9fLCBtc2cuYWRkciwgYnVmWzBdLGJ1ZlsxXSxidWZbMl0sYnVmWzNdKTsKKworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaWYgKChlcnIgPSBpMmNfdHJhbnNmZXIoJmNvcmUtPmkyY19hZGFwLCAmbXNnLCAxKSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeDg4LWR2YjogJXMgZXJyb3IgIgogCQkJICAgIihhZGRyICUwMnggPC0gJTAyeCwgZXJyID0gJWkpXG4iLApAQCAtNDA3LDE2ICszODYsMjEgQEAKIAkJZWxzZQogCQkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCWlmIChjb3JlLT50dW5lcl90eXBlID09IFRVTkVSX0xHX1REVlNfSDA2MkYpIHsKLQkJLyogU2V0IHRoZSBBdXhpbGlhcnkgQnl0ZS4gKi8KLQkJYnVmWzJdICY9IH4weDIwOwotCQlidWZbMl0gfD0gMHgxODsKLQkJYnVmWzNdID0gMHg1MDsKLQkJaTJjX3RyYW5zZmVyKCZjb3JlLT5pMmNfYWRhcCwgJm1zZywgMSk7Ci0JfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxnZHQzMzAzX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcykKK3sKKwlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OworCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CisKKwkvKiBQdXQgdGhlIGFuYWxvZyBkZWNvZGVyIGluIHN0YW5kYnkgdG8ga2VlcCBpdCBxdWlldCAqLworCWN4ODhfY2FsbF9pMmNfY2xpZW50cyAoZGV2LT5jb3JlLCBUVU5FUl9TRVRfU1RBTkRCWSwgTlVMTCk7CisKKwlyZXR1cm4gbGdfaDA2eGZfcGxsX3NldChmZSwgJmNvcmUtPmkyY19hZGFwLCBwYXJhbXMpOworfQorCiBzdGF0aWMgaW50IGxnZHQzMzB4X3BsbF9yZl9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGludCBpbmRleCkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwpAQCAtNDQ0LDcgKzQyOCw2IEBACiAJLmRlbW9kX2FkZHJlc3MgICAgPSAweDBlLAogCS5kZW1vZF9jaGlwICAgICAgID0gTEdEVDMzMDIsCiAJLnNlcmlhbF9tcGVnICAgICAgPSAweDA0LCAvKiBUUFNFUklBTCBmb3IgMzMwMiBpbiBUT1BfQ09OVFJPTCAqLwotCS5wbGxfc2V0ICAgICAgICAgID0gbGdkdDMzMHhfcGxsX3NldCwKIAkuc2V0X3RzX3BhcmFtcyAgICA9IGxnZHQzMzB4X3NldF90c19wYXJhbSwKIH07CiAKQEAgLTQ1Miw3ICs0MzUsMTMgQEAKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGUsCiAJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKIAkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCi0JLnBsbF9zZXQgICAgICAgICAgPSBsZ2R0MzMweF9wbGxfc2V0LAorCS5zZXRfdHNfcGFyYW1zICAgID0gbGdkdDMzMHhfc2V0X3RzX3BhcmFtLAorfTsKKworc3RhdGljIHN0cnVjdCBsZ2R0MzMweF9jb25maWcgcGNoZHR2X2hkNTUwMCA9IHsKKwkuZGVtb2RfYWRkcmVzcyAgICA9IDB4NTksCisJLmRlbW9kX2NoaXAgICAgICAgPSBMR0RUMzMwMywKKwkuc2VyaWFsX21wZWcgICAgICA9IDB4NDAsIC8qIFRQU0VSSUFMIGZvciAzMzAzIGluIFRPUF9DT05UUk9MICovCiAJLnNldF90c19wYXJhbXMgICAgPSBsZ2R0MzMweF9zZXRfdHNfcGFyYW0sCiB9OwogI2VuZGlmCkBAIC00NzcsOCArNDY2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBhdGlfaGR0dndvbmRlciA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGEsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdHV2MTIzNmQsCiAJLnNldF9wbGxfaW5wdXQgICAgPSBueHQyMDB4X3NldF9wbGxfaW5wdXQsCiAJLnNldF90c19wYXJhbXMgICAgPSBueHQyMDB4X3NldF90c19wYXJhbSwKIH07CkBAIC00OTMsMjggKzQ4MCwzMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjeDI0MTIzX2VuYWJsZV9sbmJfdm9sdGFnZShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSwgaW50IG9uKQorc3RhdGljIGludCBrd29ybGRfZHZic18xMDBfc2V0X3ZvbHRhZ2Uoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSkKIHsKIAlzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2PSBmZS0+ZHZiLT5wcml2OwogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBkZXYtPmNvcmU7CiAKLQlpZiAob24pCi0JCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwMDZmOSk7Ci0JZWxzZQorCWlmICh2b2x0YWdlID09IFNFQ19WT0xUQUdFX09GRikgewogCQljeF93cml0ZShNT19HUDBfSU8sIDB4MDAwMDA2ZkIpOworCX0gZWxzZSB7CisJCWN4X3dyaXRlKE1PX0dQMF9JTywgMHgwMDAwMDZmOSk7CisJfQorCisJaWYgKGNvcmUtPnByZXZfc2V0X3ZvbHRhZ2UpCisJCXJldHVybiBjb3JlLT5wcmV2X3NldF92b2x0YWdlKGZlLCB2b2x0YWdlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBjeDI0MTIzX2NvbmZpZyBoYXVwcGF1Z2Vfbm92YXNfY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzCQk9IDB4NTUsCi0JLnVzZV9pc2w2NDIxCQk9IDEsCiAJLnNldF90c19wYXJhbXMJCT0gY3gyNDEyM19zZXRfdHNfcGFyYW0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGN4MjQxMjNfY29uZmlnIGt3b3JsZF9kdmJzXzEwMF9jb25maWcgPSB7CiAJLmRlbW9kX2FkZHJlc3MJCT0gMHgxNSwKLQkudXNlX2lzbDY0MjEJCT0gMCwKIAkuc2V0X3RzX3BhcmFtcwkJPSBjeDI0MTIzX3NldF90c19wYXJhbSwKLQkuZW5hYmxlX2xuYl92b2x0YWdlCT0gY3gyNDEyM19lbmFibGVfbG5iX3ZvbHRhZ2UsCiB9OwogI2VuZGlmCiAKQEAgLTUzMCw2ICs1MTksMTEgQEAKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0RWQl9UMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX25vdmF0X2NvbmZpZywKIAkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTl4KTsKKwkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfVEVSUkFURUNfQ0lORVJHWV8xNDAwX0RWQl9UMToKIAljYXNlIENYODhfQk9BUkRfQ09ORVhBTlRfRFZCX1QxOgpAQCAtNTM3LDQ0ICs1MzEsOTIgQEAKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxMDAwOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGN4MjI3MDJfYXR0YWNoKCZjb25uZXhhbnRfcmVmYm9hcmRfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX3BsbF9hdHRhY2goZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjAsCisJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwLAorCQkJCSAgICAgICAmZHZiX3BsbF90aG9tc29uX2R0dDc1NzkpOworCQl9CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfSFZSMTEwMDoKIAljYXNlIENYODhfQk9BUkRfSEFVUFBBVUdFX0hWUjExMDBMUDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDIyNzAyX2F0dGFjaCgmaGF1cHBhdWdlX2h2cjExMDBfY29uZmlnLAogCQkJCQkJICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZHZiX3BsbF9hdHRhY2goZGV2LT5kdmIuZnJvbnRlbmQsIDB4NjEsCisJCQkJICAgICAgICZkZXYtPmNvcmUtPmkyY19hZGFwLAorCQkJCSAgICAgICAmZHZiX3BsbF9mbWQxMjE2bWUpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAjaWYgZGVmaW5lZChIQVZFX01UMzUyKSB8fCBkZWZpbmVkKEhBVkVfWkwxMDM1MykKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9QTFVTOgotCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MDsKLQkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OTsKICNpZmRlZiBIQVZFX01UMzUyCiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2LAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKLQkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpCisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MCwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSk7CiAJCQlicmVhazsKKwkJfQogI2VuZGlmCiAjaWZkZWYgSEFWRV9aTDEwMzUzCiAJCS8qIFpMMTAzNTMgcmVwbGFjZXMgTVQzNTIgb24gbGF0ZXIgY2FyZHMgKi8KIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB6bDEwMzUzX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9wbHVzX3YxXzEsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MCwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzU3OSk7CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMOgorI2lmZGVmIEhBVkVfTVQzNTIKKwkJLyogVGhlIHRpbiBib3ggc2F5cyBERUUxNjAxLCBidXQgaXQgc2VlbXMgdG8gYmUgRFRUNzU3OQorCQkgKiBjb21wYXRpYmxlLCB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IE1UMzUyIEFHQyBnYWluLiAqLworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9kdWFsLAorCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKyNpZmRlZiBIQVZFX1pMMTAzNTMKKwkJLyogWkwxMDM1MyByZXBsYWNlcyBNVDM1MiBvbiBsYXRlciBjYXJkcyAqLworCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHpsMTAzNTNfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2X3BsdXNfdjFfMSwKKwkJCQkJCSAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NTc5KTsKKwkJfQogI2VuZGlmCiAJCWJyZWFrOwogI2VuZGlmIC8qIEhBVkVfTVQzNTIgfHwgSEFWRV9aTDEwMzUzICovCiAjaWZkZWYgSEFWRV9NVDM1MgogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UMToKLQkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7Ci0JCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9sZ196MjAxOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0diwKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX2xnX3oyMDEpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCX1Q6CiAJY2FzZSBDWDg4X0JPQVJEX0ROVFZfTElWRV9EVkJfVDoKIAljYXNlIENYODhfQk9BUkRfQURTVEVDSF9EVkJfVF9QQ0k6Ci0JCWRldi0+Y29yZS0+cGxsX2FkZHIgPSAweDYxOwotCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdW5rbm93bl8xOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmZG50dl9saXZlX2R2YnRfY29uZmlnLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdW5rbm93bl8xKTsKKwkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRE5UVl9MSVZFX0RWQl9UX1BSTzoKICNpZmRlZiBIQVZFX1ZQMzA1NF9JMkMKQEAgLTU4MiwxOCArNjI0LDEzIEBACiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF9mbWQxMjE2bWU7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkbnR2X2xpdmVfZHZidF9wcm9fY29uZmlnLAogCQkJJigoc3RydWN0IHZwMzA1NF9pMmNfc3RhdGUgKilkZXYtPmNhcmRfcHJpdiktPmFkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGRudHZfbGl2ZV9kdmJ0X3Byb190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAjZWxzZQogCQlwcmludGsoIiVzOiBidWlsdCB3aXRob3V0IHZwMzA1NCBzdXBwb3J0XG4iLCBkZXYtPmNvcmUtPm5hbWUpOwogI2VuZGlmCiAJCWJyZWFrOwotCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0RVQUw6Ci0JCS8qIFRoZSB0aW4gYm94IHNheXMgREVFMTYwMSwgYnV0IGl0IHNlZW1zIHRvIGJlIERUVDc1NzkKLQkJICogY29tcGF0aWJsZSwgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudCBNVDM1MiBBR0MgZ2Fpbi4gKi8KLQkJZGV2LT5jb3JlLT5wbGxfYWRkciA9IDB4NjE7Ci0JCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2R0dDc1Nzk7Ci0JCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZkdmljb19mdXNpb25oZHR2X2R1YWwsCi0JCQkJCQkgJmRldi0+Y29yZS0+aTJjX2FkYXApOwotCQlicmVhazsKICNlbmRpZgogI2lmZGVmIEhBVkVfWkwxMDM1MwogCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRDoKQEAgLTYwMSwxMiArNjM4LDIwIEBACiAJCWRldi0+Y29yZS0+cGxsX2Rlc2MgPSAmZHZiX3BsbF90aG9tc29uX2ZlNjYwMDsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB6bDEwMzUzX2F0dGFjaCgmZHZpY29fZnVzaW9uaGR0dl9oeWJyaWQsCiAJCQkJCQkgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gZHZpY29faHlicmlkX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX09SNTExMzIKIAljYXNlIENYODhfQk9BUkRfUENIRFRWX0hEMzAwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBvcjUxMTMyX2F0dGFjaCgmcGNoZHR2X2hkMzAwMCwKIAkJCQkJCSAmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlkdmJfcGxsX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgMHg2MSwKKwkJCQkgICAgICAgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgICZkdmJfcGxsX3Rob21zb25fZHR0NzYxeCk7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX0xHRFQzMzBYCkBAIC02MjcsNiArNjcyLDkgQEAKIAkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX21pY3JvdHVuZV80MDQyOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGQsCiAJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfVDoKQEAgLTY0Myw2ICs2OTEsOSBAQAogCQlkZXYtPmNvcmUtPnBsbF9kZXNjID0gJmR2Yl9wbGxfdGhvbXNvbl9kdHQ3NjF4OwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IGxnZHQzMzB4X2F0dGFjaCgmZnVzaW9uaGR0dl8zX2dvbGQsCiAJCQkJCQkgICAgJmRldi0+Y29yZS0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQgIT0gTlVMTCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IGxnZHQzMzAyX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJfQogCQlicmVhazsKIAljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl81X0dPTEQ6CkBAIC02NTUsMTAgKzcwNiwyOCBAQAogCQltZGVsYXkoMTAwKTsKIAkJY3hfc2V0KE1PX0dQMF9JTywgMSk7CiAJCW1kZWxheSgyMDApOwotCQlkZXYtPmNvcmUtPnBsbF9hZGRyID0gMHg2MTsKLQkJZGV2LT5jb3JlLT5wbGxfZGVzYyA9ICZkdmJfcGxsX3RkdnNfdHVhNjAzNDsKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBsZ2R0MzMweF9hdHRhY2goJmZ1c2lvbmhkdHZfNV9nb2xkLAogCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOworCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDA6CisJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwODsKKwkJeworCQkvKiBEbyBhIGhhcmR3YXJlIHJlc2V0IG9mIGNoaXAgYmVmb3JlIHVzaW5nIGl0LiAqLworCQlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOworCisJCWN4X2NsZWFyKE1PX0dQMF9JTywgMSk7CisJCW1kZWxheSgxMDApOworCQljeF9zZXQoTU9fR1AwX0lPLCAxKTsKKwkJbWRlbGF5KDIwMCk7CisJCWRldi0+ZHZiLmZyb250ZW5kID0gbGdkdDMzMHhfYXR0YWNoKCZwY2hkdHZfaGQ1NTAwLAorCQkJCQkJICAgICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBsZ2R0MzMwM190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTY2Niw2ICs3MzUsMTEgQEAKIAljYXNlIENYODhfQk9BUkRfQVRJX0hEVFZXT05ERVI6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbnh0MjAweF9hdHRhY2goJmF0aV9oZHR2d29uZGVyLAogCQkJCQkJICZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLAorCQkJCSAgICAgICAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCQkgICAgICAgJmR2Yl9wbGxfdHV2MTIzNmQpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAjaWZkZWYgSEFWRV9DWDI0MTIzCkBAIC02NzMsMTAgKzc0NywxOCBAQAogCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNFMl9TMToKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBjeDI0MTIzX2F0dGFjaCgmaGF1cHBhdWdlX25vdmFzX2NvbmZpZywKIAkJCSZkZXYtPmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlpc2w2NDIxX2F0dGFjaChkZXYtPmR2Yi5mcm9udGVuZCwgJmRldi0+Y29yZS0+aTJjX2FkYXAsCisJCQkJICAgICAgIDB4MDgsIDB4MDAsIDB4MDApOworCQl9CiAJCWJyZWFrOwogCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfRFZCU18xMDA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gY3gyNDEyM19hdHRhY2goJmt3b3JsZF9kdmJzXzEwMF9jb25maWcsCiAJCQkmZGV2LT5jb3JlLT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5jb3JlLT5wcmV2X3NldF92b2x0YWdlID0gZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zZXRfdm9sdGFnZTsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuc2V0X3ZvbHRhZ2UgPSBrd29ybGRfZHZic18xMDBfc2V0X3ZvbHRhZ2U7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgpAQCAtNjkwLDE1ICs3NzIsMTUgQEAKIAl9CiAKIAlpZiAoZGV2LT5jb3JlLT5wbGxfZGVzYykgewotCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5taW47Ci0JCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmluZm8uZnJlcXVlbmN5X21heCA9IGRldi0+Y29yZS0+cGxsX2Rlc2MtPm1heDsKKwkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pbmZvLmZyZXF1ZW5jeV9taW4gPSBkZXYtPmNvcmUtPnBsbF9kZXNjLT5taW47CisJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaW5mby5mcmVxdWVuY3lfbWF4ID0gZGV2LT5jb3JlLT5wbGxfZGVzYy0+bWF4OwogCX0KIAogCS8qIFB1dCB0aGUgYW5hbG9nIGRlY29kZXIgaW4gc3RhbmRieSB0byBrZWVwIGl0IHF1aWV0ICovCiAJY3g4OF9jYWxsX2kyY19jbGllbnRzIChkZXYtPmNvcmUsIFRVTkVSX1NFVF9TVEFOREJZLCBOVUxMKTsKIAogCS8qIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcgKi8KLQlyZXR1cm4gdmlkZW9idWZfZHZiX3JlZ2lzdGVyKCZkZXYtPmR2YiwgVEhJU19NT0RVTEUsIGRldik7CisJcmV0dXJuIHZpZGVvYnVmX2R2Yl9yZWdpc3RlcigmZGV2LT5kdmIsIFRISVNfTU9EVUxFLCBkZXYsICZkZXYtPnBjaS0+ZGV2KTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKaW5kZXggZjcyMDkwMS4uN2VmYTZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaTJjLmMKQEAgLTEzOCwxMyArMTM4LDEzIEBACiAJCXJldHVybjsKIAogCWlmIChjb3JlLT5kdmJkZXYpIHsKLQkJaWYgKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmkyY19nYXRlX2N0cmwpCi0JCQljb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLT5pMmNfZ2F0ZV9jdHJsKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLCAxKTsKKwkJaWYgKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMuaTJjX2dhdGVfY3RybChjb3JlLT5kdmJkZXYtPmR2Yi5mcm9udGVuZCwgMSk7CiAKIAkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIAotCQlpZiAoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy0+aTJjX2dhdGVfY3RybCkKLQkJCWNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLT5vcHMtPmkyY19nYXRlX2N0cmwoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQsIDApOworCQlpZiAoY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQkJY29yZS0+ZHZiZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsKGNvcmUtPmR2YmRldi0+ZHZiLmZyb250ZW5kLCAwKTsKIAl9IGVsc2UKIAkJaTJjX2NsaWVudHNfY29tbWFuZCgmY29yZS0+aTJjX2FkYXAsIGNtZCwgYXJnKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCmluZGV4IDc4YTYzYjcuLjcyYjYzMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYwpAQCAtNzAsMTQgKzcwLDMzIEBACiBzdGF0aWMgdm9pZCBjeDg4X2lyX2hhbmRsZV9rZXkoc3RydWN0IGN4ODhfSVIgKmlyKQogewogCXN0cnVjdCBjeDg4X2NvcmUgKmNvcmUgPSBpci0+Y29yZTsKLQl1MzIgZ3BpbywgZGF0YTsKKwl1MzIgZ3BpbywgZGF0YSwgYXV4Z3BpbzsKIAogCS8qIHJlYWQgZ3BpbyB2YWx1ZSAqLwogCWdwaW8gPSBjeF9yZWFkKGlyLT5ncGlvX2FkZHIpOworCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX05QR1RFQ0hfUkVBTFRWX1RPUDEwRk0pIHsKKwkJLyogVGhpcyBib2FyZCBhcHBhcmVudGx5IHVzZXMgYSBjb21iaW5hdGlvbiBvZiAyIEdQSU8KKwkJICAgdG8gcmVwcmVzZW50IHRoZSBrZXlzLiBBZGRpdGlvbmFsbHksIHRoZSBzZWNvbmQgR1BJTworCQkgICBjYW4gYmUgdXNlZCBmb3IgcGFyaXR5LgorCisJCSAgIEV4YW1wbGU6CisKKwkJICAgZm9yIGtleSAiNSIKKwkJCWdwaW8gPSAweDc1OCwgYXV4Z3BpbyA9IDB4ZTUgb3IgMHhmNQorCQkgICBmb3Iga2V5ICJQb3dlciIKKwkJCWdwaW8gPSAweDc1OCwgYXV4Z3BpbyA9IDB4ZWQgb3IgMHhmZAorCQkgKi8KKworCQlhdXhncGlvID0gY3hfcmVhZChNT19HUDFfSU8pOworCQkvKiBUYWtlIG91dCB0aGUgcGFyaXR5IHBhcnQgKi8KKwkJZ3Bpbys9KGdwaW8gJiAweDdmZCkgKyAoYXV4Z3BpbyAmIDB4ZWYpOworCX0gZWxzZQorCQlhdXhncGlvID0gZ3BpbzsKKwogCWlmIChpci0+cG9sbGluZykgewotCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBncGlvKQorCQlpZiAoaXItPmxhc3RfZ3BpbyA9PSBhdXhncGlvKQogCQkJcmV0dXJuOwotCQlpci0+bGFzdF9ncGlvID0gZ3BpbzsKKwkJaXItPmxhc3RfZ3BpbyA9IGF1eGdwaW87CiAJfQogCiAJLyogZXh0cmFjdCBkYXRhICovCkBAIC0xNzIsMTIgKzE5MSwxMyBAQAogCQlpcl90eXBlID0gSVJfVFlQRV9SQzU7CiAJCWlyLT5zYW1wbGluZyA9IDE7CiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUMjAwMFhQX0VYUEVSVDoKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc193aW5mYXN0OwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CiAJCWlyLT5tYXNrX2tleXVwID0gMHgxMDA7Ci0JCWlyLT5wb2xsaW5nID0gMTsgLyogbXMgKi8KKwkJaXItPnBvbGxpbmcgPSA1MDsgLyogbXMgKi8KIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX0lPREFUQV9HVkJDVFY3RToKIAkJaXJfY29kZXMgPSBpcl9jb2Rlc19pb2RhdGFfYmN0djdlOwpAQCAtMjI4LDYgKzI0OCwxMiBAQAogCQlpcl90eXBlID0gSVJfVFlQRV9QRDsKIAkJaXItPnNhbXBsaW5nID0gMHhmZjAwOyAvKiBhZGRyZXNzICovCiAJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9OUEdURUNIX1JFQUxUVl9UT1AxMEZNOgorCQlpcl9jb2RlcyA9IGlyX2NvZGVzX25wZ3RlY2g7CisJCWlyLT5ncGlvX2FkZHIgPSBNT19HUDBfSU87CisJCWlyLT5tYXNrX2tleWNvZGUgPSAweGZhOworCQlpci0+cG9sbGluZyA9IDUwOyAvKiBtcyAqLworCQlicmVhazsKIAl9CiAKIAlpZiAoTlVMTCA9PSBpcl9jb2RlcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCmluZGV4IDdkMTY4ODguLmE5ZDc3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKQEAgLTU0LDcgKzU0LDcgQEAKIHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICpjb3JlID0gZGV2LT5jb3JlOwogCi0JZHByaW50aygwLCAiY3g4ODAyX3N0YXJ0X2RtYSB3OiAlZCwgaDogJWQsIGY6ICVkXG4iLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwgYnVmLT52Yi5maWVsZCk7CisJZHByaW50aygxLCAiY3g4ODAyX3N0YXJ0X2RtYSB3OiAlZCwgaDogJWQsIGY6ICVkXG4iLCBkZXYtPndpZHRoLCBkZXYtPmhlaWdodCwgYnVmLT52Yi5maWVsZCk7CiAKIAkvKiBzZXR1cCBmaWZvICsgZm9ybWF0ICovCiAJY3g4OF9zcmFtX2NoYW5uZWxfc2V0dXAoY29yZSwgJmN4ODhfc3JhbV9jaGFubmVsc1tTUkFNX0NIMjhdLApAQCAtNzYsNiArNzYsNyBAQAogCQljYXNlIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl8zX0dPTERfUToKIAkJY2FzZSBDWDg4X0JPQVJEX0RWSUNPX0ZVU0lPTkhEVFZfM19HT0xEX1Q6CiAJCWNhc2UgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWXzVfR09MRDoKKwkJY2FzZSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDA6CiAJCQljeF93cml0ZShUU19TT1BfU1RBVCwgMTw8MTMpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1g4OF9CT0FSRF9IQVVQUEFVR0VfTk9WQVNQTFVTX1MxOgpAQCAtMTA5LDcgKzExMCw3IEBACiAJcS0+Y291bnQgPSAxOwogCiAJLyogZW5hYmxlIGlycXMgKi8KLQlkcHJpbnRrKCAwLCAic2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2tcbiIgKTsKKwlkcHJpbnRrKCAxLCAic2V0dGluZyB0aGUgaW50ZXJydXB0IG1hc2tcbiIgKTsKIAljeF9zZXQoTU9fUENJX0lOVE1TSywgY29yZS0+cGNpX2lycW1hc2sgfCAweDA0KTsKIAljeF9zZXQoTU9fVFNfSU5UTVNLLCAgMHgxZjAwMTEpOwogCkBAIC0xMjIsNyArMTIzLDcgQEAKIHN0YXRpYyBpbnQgY3g4ODAyX3N0b3BfZG1hKHN0cnVjdCBjeDg4MDJfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGN4ODhfY29yZSAqY29yZSA9IGRldi0+Y29yZTsKLQlkcHJpbnRrKCAwLCAiY3g4ODAyX3N0b3BfZG1hXG4iICk7CisJZHByaW50ayggMSwgImN4ODgwMl9zdG9wX2RtYVxuIiApOwogCiAJLyogc3RvcCBkbWEgKi8KIAljeF9jbGVhcihNT19UU19ETUFDTlRSTCwgMHgxMSk7CkBAIC0xNDIsMTAgKzE0Myw0MyBAQAogCXN0cnVjdCBjeDg4X2J1ZmZlciAqYnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CiAKLQlkcHJpbnRrKCAwLCAiY3g4ODAyX3Jlc3RhcnRfcXVldWVcbiIgKTsKKyAgICAgICBkcHJpbnRrKCAxLCAiY3g4ODAyX3Jlc3RhcnRfcXVldWVcbiIgKTsKIAlpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkKIAl7Ci0JCWRwcmludGsoIDAsICJjeDg4MDJfcmVzdGFydF9xdWV1ZTogcXVldWUgaXMgZW1wdHlcbiIgKTsKKwkgICAgICAgc3RydWN0IGN4ODhfYnVmZmVyICpwcmV2OworCSAgICAgICBwcmV2ID0gTlVMTDsKKworCSAgICAgICBkcHJpbnRrKDEsICJjeDg4MDJfcmVzdGFydF9xdWV1ZTogcXVldWUgaXMgZW1wdHlcbiIgKTsKKworCSAgICAgICBmb3IgKDs7KSB7CisJCSAgICAgICBpZiAobGlzdF9lbXB0eSgmcS0+cXVldWVkKSkKKwkJCSAgICAgICByZXR1cm4gMDsKKwkJICAgICAgIGJ1ZiA9IGxpc3RfZW50cnkocS0+cXVldWVkLm5leHQsIHN0cnVjdCBjeDg4X2J1ZmZlciwgdmIucXVldWUpOworCQkgICAgICAgaWYgKE5VTEwgPT0gcHJldikgeworCQkJICAgICAgIGxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQkJICAgICAgIGN4ODgwMl9zdGFydF9kbWEoZGV2LCBxLCBidWYpOworCQkJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQkgICAgICAgYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCQkgICAgICAgbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzK0JVRkZFUl9USU1FT1VUKTsKKwkJCSAgICAgICBkcHJpbnRrKDEsIlslcC8lZF0gcmVzdGFydF9xdWV1ZSAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJCQkgICAgICAgYnVmLGJ1Zi0+dmIuaSk7CisKKwkJICAgICAgIH0gZWxzZSBpZiAocHJldi0+dmIud2lkdGggID09IGJ1Zi0+dmIud2lkdGggICYmCisJCQkJICBwcmV2LT52Yi5oZWlnaHQgPT0gYnVmLT52Yi5oZWlnaHQgJiYKKwkJCQkgIHByZXYtPmZtdCAgICAgICA9PSBidWYtPmZtdCkgeworCQkJICAgICAgIGxpc3RfZGVsKCZidWYtPnZiLnF1ZXVlKTsKKwkJCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCZxLT5hY3RpdmUpOworCQkJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CisJCQkgICAgICAgYnVmLT5jb3VudCAgICA9IHEtPmNvdW50Kys7CisJCQkgICAgICAgcHJldi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihidWYtPnJpc2MuZG1hKTsKKwkJCSAgICAgICBkcHJpbnRrKDEsIlslcC8lZF0gcmVzdGFydF9xdWV1ZSAtIG1vdmUgdG8gYWN0aXZlXG4iLAorCQkJCSAgICAgICBidWYsYnVmLT52Yi5pKTsKKwkJICAgICAgIH0gZWxzZSB7CisJCQkgICAgICAgcmV0dXJuIDA7CisJCSAgICAgICB9CisJCSAgICAgICBwcmV2ID0gYnVmOworCSAgICAgICB9CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjA0LDEzICsyMzgsMTMgQEAKIAlidWYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoY3g4OHEtPnN0b3BwZXIuZG1hKTsKIAogCWlmIChsaXN0X2VtcHR5KCZjeDg4cS0+YWN0aXZlKSkgewotCQlkcHJpbnRrKCAwLCAicXVldWUgaXMgZW1wdHkgLSBmaXJzdCBhY3RpdmVcbiIgKTsKKwkJZHByaW50ayggMSwgInF1ZXVlIGlzIGVtcHR5IC0gZmlyc3QgYWN0aXZlXG4iICk7CiAJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsJmN4ODhxLT5hY3RpdmUpOwogCQljeDg4MDJfc3RhcnRfZG1hKGRldiwgY3g4OHEsIGJ1Zik7CiAJCWJ1Zi0+dmIuc3RhdGUgPSBTVEFURV9BQ1RJVkU7CiAJCWJ1Zi0+Y291bnQgICAgPSBjeDg4cS0+Y291bnQrKzsKIAkJbW9kX3RpbWVyKCZjeDg4cS0+dGltZW91dCwgamlmZmllcytCVUZGRVJfVElNRU9VVCk7Ci0JCWRwcmludGsoMCwiWyVwLyVkXSAlcyAtIGZpcnN0IGFjdGl2ZVxuIiwKKwkJZHByaW50aygxLCJbJXAvJWRdICVzIC0gZmlyc3QgYWN0aXZlXG4iLAogCQkJYnVmLCBidWYtPnZiLmksIF9fRlVOQ1RJT05fXyk7CiAKIAl9IGVsc2UgewpAQCAtMjQ0LDcgKzI3OCw3IEBACiAJfQogCWlmIChyZXN0YXJ0KQogCXsKLQkJZHByaW50aygwLCAicmVzdGFydGluZyBxdWV1ZVxuIiApOworCQlkcHJpbnRrKDEsICJyZXN0YXJ0aW5nIHF1ZXVlXG4iICk7CiAJCWN4ODgwMl9yZXN0YXJ0X3F1ZXVlKGRldixxKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jayxmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC10dmF1ZGlvLmMKaW5kZXggNjQxYTBjNS4uMWU0Mjc4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdHZhdWRpby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXR2YXVkaW8uYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCiAjaW5jbHVkZSAiY3g4OC5oIgpAQCAtMTM3LDIxICsxMzgsMjggQEAKIHsKIAl1MzIgdm9sdW1lOwogCi0jaWZuZGVmIFVTSU5HX0NYODhfQUxTQQorI2lmbmRlZiBDT05GSUdfVklERU9fQ1g4OF9BTFNBCiAJLyogcmVzdGFydCBkbWE7IFRoaXMgYXZvaWRzIGJ1enogaW4gTklDQU0gYW5kIGlzIGdvb2QgaW4gb3RoZXJzICAqLwogCWN4ODhfc3RvcF9hdWRpb19kbWEoY29yZSk7CiAjZW5kaWYKIAljeF93cml0ZShBVURfUkFURV9USFJFU19ETUQsIDB4MDAwMDAwQzApOwotI2lmbmRlZiBVU0lOR19DWDg4X0FMU0EKKyNpZm5kZWYgQ09ORklHX1ZJREVPX0NYODhfQUxTQQogCWN4ODhfc3RhcnRfYXVkaW9fZG1hKGNvcmUpOwogI2VuZGlmCiAKIAlpZiAoY3g4OF9ib2FyZHNbY29yZS0+Ym9hcmRdLmJsYWNrYmlyZCkgewogCQkvKiBzZXRzIHNvdW5kIGlucHV0IGZyb20gZXh0ZXJuYWwgYWRjICovCi0JCWlmIChjb3JlLT5ib2FyZCA9PSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU4pCisJCXN3aXRjaCAoY29yZS0+Ym9hcmQpIHsKKwkJY2FzZSBDWDg4X0JPQVJEX0hBVVBQQVVHRV9ST1NMWU46CisJCWNhc2UgQ1g4OF9CT0FSRF9LV09STERfTUNFMjAwX0RFTFVYRToKKwkJY2FzZSBDWDg4X0JPQVJEX0tXT1JMRF9IQVJEV0FSRV9NUEVHX1RWX1hQRVJUOgorCQljYXNlIENYODhfQk9BUkRfUElYRUxWSUVXX1BMQVlUVl9QNzAwMDoKKwkJY2FzZSBDWDg4X0JPQVJEX0FTVVNfUFZSXzQxNjoKIAkJCWN4X2NsZWFyKEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7Ci0JCWVsc2UKKwkJCWJyZWFrOworCQlkZWZhdWx0OgogCQkJY3hfc2V0KEFVRF9DVEwsIEVOX0kyU0lOX0VOQUJMRSk7CisJCX0KIAogCQljeF93cml0ZShBVURfSTJTSU5QVVRDTlRMLCA0KTsKIAkJY3hfd3JpdGUoQVVEX0JBVURSQVRFLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZiaS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKaW5kZXggODQ2ZmFhZC4uYWEyYTY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmJpLmMKQEAgLTM0LDggKzM0LDggQEAKIAlpZiAoZGV2LT5jb3JlLT50dm5vcm0tPmlkICYgVjRMMl9TVERfNTI1XzYwKSB7CiAJCS8qIG50c2MgKi8KIAkJZi0+Zm10LnZiaS5zYW1wbGluZ19yYXRlID0gMjg2MzYzNjM7Ci0JCWYtPmZtdC52Ymkuc3RhcnRbMF0gPSAxMCAtMTsKLQkJZi0+Zm10LnZiaS5zdGFydFsxXSA9IDI3MyAtMTsKKwkJZi0+Zm10LnZiaS5zdGFydFswXSA9IDEwOworCQlmLT5mbXQudmJpLnN0YXJ0WzFdID0gMjczOwogCiAJfSBlbHNlIGlmIChkZXYtPmNvcmUtPnR2bm9ybS0+aWQgJiBWNEwyX1NURF82MjVfNTApIHsKIAkJLyogcGFsICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaAppbmRleCAzMjZhMjVmLi5kYzdiYzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKQEAgLTI1LDkgKzI1LDExIEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlby1idWYuaD4KKyNpbmNsdWRlIDxtZWRpYS9jeDIzNDF4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW8tYnVmLWR2Yi5oPgogCiAjaW5jbHVkZSAiYnRjeC1yaXNjLmgiCkBAIC0zNSw3ICszNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNkZWZpbmUgQ1g4OF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwwLDUpCisjZGVmaW5lIENYODhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsMCw2KQogCiAjaWZuZGVmIFRSVUUKICMgZGVmaW5lIFRSVUUgKDE9PTEpCkBAIC0xODksNiArMTkxLDExIEBACiAjZGVmaW5lIENYODhfQk9BUkRfRFZJQ09fRlVTSU9OSERUVl9EVkJfVF9EVUFMIDQ0CiAjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX0hBUkRXQVJFX01QRUdfVFZfWFBFUlQgNDUKICNkZWZpbmUgQ1g4OF9CT0FSRF9EVklDT19GVVNJT05IRFRWX0RWQl9UX0hZQlJJRCA0NgorI2RlZmluZSBDWDg4X0JPQVJEX1BDSERUVl9IRDU1MDAgICAgICAgICAgIDQ3CisjZGVmaW5lIENYODhfQk9BUkRfS1dPUkxEX01DRTIwMF9ERUxVWEUgICAgNDgKKyNkZWZpbmUgQ1g4OF9CT0FSRF9QSVhFTFZJRVdfUExBWVRWX1A3MDAwICA0OQorI2RlZmluZSBDWDg4X0JPQVJEX05QR1RFQ0hfUkVBTFRWX1RPUDEwRk0gIDUwCisjZGVmaW5lIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSCAgICAgICAgNTEKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCkBAIC0yOTYsNiArMzAzLDcgQEAKIAkvKiBjb25maWcgaW5mbyAtLSBkdmIgKi8KIAlzdHJ1Y3QgZHZiX3BsbF9kZXNjICAgICAgICAqcGxsX2Rlc2M7CiAJdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgcGxsX2FkZHI7CisJaW50IAkJCSAgICgqcHJldl9zZXRfdm9sdGFnZSkoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsIGZlX3NlY192b2x0YWdlX3Qgdm9sdGFnZSk7CiAKIAkvKiBzdGF0ZSBpbmZvICovCiAJc3RydWN0IHRhc2tfc3RydWN0ICAgICAgICAgKmt0aHJlYWQ7CkBAIC0zOTEsMTQgKzM5OSw2IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ7CiB9OwogCi0vKiBUT0RPOiBtb3ZlIHRoaXMgdG8gc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiA/ICovCi1zdHJ1Y3QgYmxhY2tiaXJkX2RuciB7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICBtb2RlOwotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgIHNwYXRpYWw7Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbDsKLX07Ci0KIHN0cnVjdCBjeDg4MDJfZGV2IHsKIAlzdHJ1Y3QgY3g4OF9jb3JlICAgICAgICAgICAqY29yZTsKIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKQEAgLTQzMiw4ICs0MzIsNyBAQAogCXVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgIHRzX2dlbl9jbnRybDsKIAogCS8qIG1wZWcgcGFyYW1zICovCi0Jc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiBwYXJhbXM7Ci0Jc3RydWN0IGJsYWNrYmlyZF9kbnIgICAgICAgZG5yX3BhcmFtczsKKwlzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyBwYXJhbXM7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTk4LDEwICs1OTcsNiBAQAogZXh0ZXJuIGludCAoKmN4ODhfaW9jdGxfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgKCpjeDg4X2lvY3RsX3RyYW5zbGF0b3IpKHVuc2lnbmVkIGludCBjbWQpOwotdm9pZCBibGFja2JpcmRfc2V0X3BhcmFtcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2LAotCQkJCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKnBhcmFtcyk7Ci12b2lkIGJsYWNrYmlyZF9zZXRfZG5yX3BhcmFtcyhzdHJ1Y3QgY3g4ODAyX2RldiAqZGV2LAotCQkJCXN0cnVjdCBibGFja2JpcmRfZG5yKiBkbnJfcGFyYW1zKTsKIAogLyoKICAqIExvY2FsIHZhcmlhYmxlczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZHNicjEwMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKaW5kZXggM2I0ZTk5OC4uZjdlMzNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kc2JyMTAwLmMKQEAgLTcyLDYgKzcyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwppbmRleCAzYmEzNDM5Li5lZDg4MmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYwpAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+CiAJCSAgICAgIE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAJCSAgICAgIFNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPgogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMjksNiArMjksOCBAQAogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPG1lZGlhL3R1bmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbXNwMzQwMC5oPgorI2luY2x1ZGUgPG1lZGlhL3NhYTcxMTUuaD4KKyNpbmNsdWRlIDxtZWRpYS90dnA1MTUwLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHZlZXByb20uaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2NoaXAuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpAQCAtNDYsMTEgKzQ4LDExIEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC02NCwxMSArNjYsMTEgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTgyLDExICs4NCwxMSBAQAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCiAJCS5pbnB1dCAgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKLQkJCS52bXV4ICAgICA9IDAsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKLQkJCS52bXV4ICAgICA9IDksCisJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9fSwKIAl9LApAQCAtMTAwLDE1ICsxMDIsMTUgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDIsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTEyMiwxNSArMTI0LDE1IEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAyLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAogCQkJLmFtdXggICAgID0gMCwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC0xNDYsMTEgKzE0OCwxMSBAQAogCQkvKkZJWE1FOiBTLVZpZGVvIG5vdCB0ZXN0ZWQgKi8KIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gVFZQNTE1MF9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gTVNQX0lOUFVUX0RFRkFVTFQsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gMiwKKwkJCS52bXV4ICAgICA9IFRWUDUxNTBfU1ZJREVPLAogCQkJLmFtdXggICAgID0gTVNQX0lOUFVUKE1TUF9JTl9TQ0FSVDEsIE1TUF9JTl9UVU5FUjEsCiAJCQkJCU1TUF9EU1BfSU5fU0NBUlQsIE1TUF9EU1BfSU5fU0NBUlQpLAogCQl9fSwKQEAgLTE2NSwxNSArMTY3LDE1IEBACiAJCS5kZWNvZGVyICAgICAgICA9IEVNMjhYWF9TQUE3MTE0LAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDQsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTQsCiAJCQkuYW11eCAgICAgPSAwLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTE4OCwxNSArMTkwLDE1IEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1RFTEVWSVNJT04sCi0JCQkudm11eCAgICAgPSAyLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUyLAogCQkJLmFtdXggICAgID0gMCwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9DT01QT1NJVEUxLAotCQkJLnZtdXggICAgID0gMCwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMCwKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfU1ZJREVPLAotCQkJLnZtdXggICAgID0gOSwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfU1ZJREVPMywKIAkJCS5hbXV4ICAgICA9IDEsCiAJCX19LAogCX0sCkBAIC0yMTEsMTUgKzIxMywxNSBAQAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1NBQTcxMTMsCiAJCS5pbnB1dCAgICAgICAgICA9IHt7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9URUxFVklTSU9OLAotCQkJLnZtdXggICAgID0gMiwKKwkJCS52bXV4ICAgICA9IFNBQTcxMTVfQ09NUE9TSVRFMiwKIAkJCS5hbXV4ICAgICA9IDAsCiAJCX0sewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfQ09NUE9TSVRFMSwKLQkJCS52bXV4ICAgICA9IDAsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTAsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX1NWSURFTywKLQkJCS52bXV4ICAgICA9IDksCisJCQkudm11eCAgICAgPSBTQUE3MTE1X1NWSURFTzMsCiAJCQkuYW11eCAgICAgPSAxLAogCQl9fSwKIAl9LApAQCAtMjM0LDE1ICsyMzYsMTUgQEAKIAkJLmRlY29kZXIgICAgICA9IEVNMjhYWF9TQUE3MTEzLAogCQkuaW5wdXQgICAgICAgICAgPSB7ewogCQkJLnR5cGUgICAgID0gRU0yOFhYX1ZNVVhfVEVMRVZJU0lPTiwKLQkJCS52bXV4ICAgICA9IDIsCisJCQkudm11eCAgICAgPSBTQUE3MTE1X0NPTVBPU0lURTIsCiAJCQkuYW11eCAgICAgPSAwLAogCQl9LHsKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTI1NCwxMSArMjU2LDExIEBACiAJCS5kZWNvZGVyICAgICAgPSBFTTI4WFhfU0FBNzExMywKIAkJLmlucHV0ICAgICAgICAgID0ge3sKIAkJCS50eXBlICAgICA9IEVNMjhYWF9WTVVYX0NPTVBPU0lURTEsCi0JCQkudm11eCAgICAgPSAwLAorCQkJLnZtdXggICAgID0gU0FBNzExNV9DT01QT1NJVEUwLAogCQkJLmFtdXggICAgID0gMSwKIAkJfSx7CiAJCQkudHlwZSAgICAgPSBFTTI4WFhfVk1VWF9TVklERU8sCi0JCQkudm11eCAgICAgPSA5LAorCQkJLnZtdXggICAgID0gU0FBNzExNV9TVklERU8zLAogCQkJLmFtdXggICAgID0gMSwKIAkJfX0sCiAJfSwKQEAgLTMyNCw4ICszMjYsNCBAQAogCX0KIH0KIAotRVhQT1JUX1NZTUJPTChlbTI4eHhfYm9hcmRzKTsKLUVYUE9SVF9TWU1CT0woZW0yOHh4X2Jjb3VudCk7Ci1FWFBPUlRfU1lNQk9MKGVtMjh4eF9pZF90YWJsZSk7Ci0KIE1PRFVMRV9ERVZJQ0VfVEFCTEUgKHVzYiwgZW0yOHh4X2lkX3RhYmxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCmluZGV4IGU1ZWU4YmMuLjQzNTBjYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYwpAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+CiAJCSAgICAgIE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAJCSAgICAgIFNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPgogCiAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMzE3LDggKzMxNyw4IEBACiAJcmV0dXJuIGVtMjh4eF93cml0ZV9yZWdzKGRldiwgVklOQ1RSTF9SRUcsICJceDExIiwgMSk7CiB9CiAKLWludCBlbTI4eHhfYWNjdW11bGF0b3Jfc2V0KHN0cnVjdCBlbTI4eHggKmRldiwgdTggeG1pbiwgdTggeG1heCwgdTggeW1pbiwKLQkJCQkgIHU4IHltYXgpCitzdGF0aWMgaW50IGVtMjh4eF9hY2N1bXVsYXRvcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCB4bWluLCB1OCB4bWF4LAorCQkJCSAgdTggeW1pbiwgdTggeW1heCkKIHsKIAllbTI4eHhfY29yZWRiZygiZW0yOHh4IFNjYWxlOiAoJWQsJWQpLSglZCwlZClcbiIsIHhtaW4sIHltaW4sIHhtYXgsIHltYXgpOwogCkBAIC0zMjgsNyArMzI4LDcgQEAKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBZTUFYX1JFRywgJnltYXgsIDEpOwogfQogCi1pbnQgZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCBoc3RhcnQsIHU4IHZzdGFydCwKK3N0YXRpYyBpbnQgZW0yOHh4X2NhcHR1cmVfYXJlYV9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1OCBoc3RhcnQsIHU4IHZzdGFydCwKIAkJCQkgICB1MTYgd2lkdGgsIHUxNiBoZWlnaHQpCiB7CiAJdTggY3dpZHRoID0gd2lkdGg7CkBAIC0zNDUsNyArMzQ1LDcgQEAKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBPRkxPV19SRUcsICZvdmVyZmxvdywgMSk7CiB9CiAKLWludCBlbTI4eHhfc2NhbGVyX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHUxNiBoLCB1MTYgdikKK3N0YXRpYyBpbnQgZW0yOHh4X3NjYWxlcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgaCwgdTE2IHYpCiB7CiAJdTggbW9kZTsKIAkvKiB0aGUgZW0yODAwIHNjYWxlciBvbmx5IHN1cHBvcnRzIHNjYWxpbmcgZG93biB0byA1MCUgKi8KQEAgLTUzNCw3ICs1MzQsNyBAQAogICogZW0yOHh4X2lzb0lycSgpCiAgKiBoYW5kbGVzIHRoZSBpbmNvbWluZyBpc29jIHVyYnMgYW5kIGZpbGxzIHRoZSBmcmFtZXMgZnJvbSBvdXIgaW5xdWV1ZQogICovCi12b2lkIGVtMjh4eF9pc29jSXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgdm9pZCBlbTI4eHhfaXNvY0lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHVyYi0+Y29udGV4dDsKIAlpbnQgaSwgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCmluZGV4IDViNmNlY2UuLmQ4MjlkOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKQEAgLTMsNyArMyw3IEBACiAKICAgIENvcHlyaWdodCAoQykgMjAwNSBMdWRvdmljbyBDYXZlZG9uIDxjYXZlZG9uQHNzc3VwLml0PgogCQkgICAgICBNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPgotCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAYnJ0dXJiby5jb20uYnI+CisJCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogCQkgICAgICBTYXNjaGEgU29tbWVyIDxzYXNjaGFzb21tZXJAZnJlZW5ldC5kZT4KIAogICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTM5OSwxNyArMzk5LDYgQEAKIAlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTDsKIH0KIAotI2lmbmRlZiBJMkNfUEVDCi1zdGF0aWMgdm9pZCBpbmNfdXNlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKLXsKLQlNT0RfSU5DX1VTRV9DT1VOVDsKLX0KLQotc3RhdGljIHZvaWQgZGVjX3VzZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JTU9EX0RFQ19VU0VfQ09VTlQ7Ci19Ci0jZW5kaWYKIAogc3RhdGljIGludCBlbTI4eHhfc2V0X3R1bmVyKGludCBjaGVja19lZXByb20sIHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CkBAIC00MzYsOSArNDI1LDE5IEBACiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gY2xpZW50LT5hZGFwdGVyLT5hbGdvX2RhdGE7CiAKIAlzd2l0Y2ggKGNsaWVudC0+YWRkciA8PCAxKSB7Ci0JCWNhc2UgMHg4NjoKKwkJY2FzZSAweDQzOgorCQljYXNlIDB4NGI6CisJCXsKKwkJCXN0cnVjdCB0dW5lcl9zZXR1cCB0dW5fc2V0dXA7CisKKwkJCXR1bl9zZXR1cC5tb2RlX21hc2sgPSBUX0FOQUxPR19UViB8IFRfUkFESU87CisJCQl0dW5fc2V0dXAudHlwZSA9IFRVTkVSX1REQTk4ODc7CisJCQl0dW5fc2V0dXAuYWRkciA9IGNsaWVudC0+YWRkcjsKKworCQkJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBUVU5FUl9TRVRfVFlQRV9BRERSLCAmdHVuX3NldHVwKTsKIAkJCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVERBOTg4N19TRVRfQ09ORklHLCAmZGV2LT50ZGE5ODg3X2NvbmYpOwogCQkJYnJlYWs7CisJCX0KIAkJY2FzZSAweDQyOgogCQkJZHByaW50azEoMSwiYXR0YWNoX2luZm9ybTogc2FhNzExNCBkZXRlY3RlZC5cbiIpOwogCQkJYnJlYWs7CkBAIC00NjQsNiArNDYzLDcgQEAKIAkJY2FzZSAweGJhOgogCQkJZHByaW50azEoMSwiYXR0YWNoX2luZm9ybTogdHZwNTE1MCBkZXRlY3RlZC5cbiIpOwogCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCWRwcmludGsxKDEsImF0dGFjaCBpbmZvcm06IGRldGVjdGVkIEkyQyBhZGRyZXNzICV4XG4iLCBjbGllbnQtPmFkZHIgPDwgMSk7CiAJCQlkZXYtPnR1bmVyX2FkZHIgPSBjbGllbnQtPmFkZHI7CkBAIC00ODAsMTIgKzQ4MCw3IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyIGVtMjh4eF9hZGFwX3RlbXBsYXRlID0gewotI2lmZGVmIEkyQ19QRUMKIAkub3duZXIgPSBUSElTX01PRFVMRSwKLSNlbHNlCi0JLmluY191c2UgPSBpbmNfdXNlLAotCS5kZWNfdXNlID0gZGVjX3VzZSwKLSNlbmRpZgogCS5jbGFzcyA9IEkyQ19DTEFTU19UVl9BTkFMT0csCiAJLm5hbWUgPSAiZW0yOHh4IiwKIAkuaWQgPSBJMkNfSFdfQl9FTTI4WFgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IDMxZTg5ZTQuLjNmZmI1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zLDcgKzMsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTHVkb3ZpY28gQ2F2ZWRvbiA8Y2F2ZWRvbkBzc3N1cC5pdD4KIAkJICAgICAgTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KLQkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPgorCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KIAkJICAgICAgU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGdldF9rZXlfcGlubmFjbGVfdXNiKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpCitzdGF0aWMgaW50IGdldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKIApAQCAtMTQ4LDggKzE0OCw4IEBACiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgImkyYyBJUiAoRU0yOFhYIFRlcnJhdGVjKSIpOwogCQlicmVhazsKIAljYXNlIChFTTI4MjBfQk9BUkRfUElOTkFDTEVfVVNCXzIpOgotCQlpci0+aXJfY29kZXMgPSBpcl9jb2Rlc19lbV9waW5uYWNsZV91c2I7Ci0JCWlyLT5nZXRfa2V5ID0gZ2V0X2tleV9waW5uYWNsZV91c2I7CisJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXk7CisJCWlyLT5nZXRfa2V5ID0gZ2V0X2tleV9waW5uYWNsZV91c2JfZ3JleTsKIAkJc25wcmludGYoaXItPmMubmFtZSwgc2l6ZW9mKGlyLT5jLm5hbWUpLCAiaTJjIElSIChFTTI4WFggUGlubmFjbGUgUENUVikiKTsKIAkJYnJlYWs7CiAJY2FzZSAoRU0yODIwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9VU0JfMik6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCmluZGV4IGNmN2NkZjkuLjkyODYwOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC12aWRlby5jCkBAIC0zLDcgKzMsNyBAQAogCiAgICBDb3B5cmlnaHQgKEMpIDIwMDUgTHVkb3ZpY28gQ2F2ZWRvbiA8Y2F2ZWRvbkBzc3N1cC5pdD4KIAkJICAgICAgTWFya3VzIFJlY2hiZXJnZXIgPG1yZWNoYmVyZ2VyQGdtYWlsLmNvbT4KLQkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGJydHVyYm8uY29tLmJyPgorCQkgICAgICBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KIAkJICAgICAgU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKIAlTb21lIHBhcnRzIGJhc2VkIG9uIFNOOUMxMHggUEMgQ2FtZXJhIENvbnRyb2xsZXJzIEdQTCBkcml2ZXIgbWFkZQpAQCAtNDIsNyArNDIsNyBAQAogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+LCAiIFwKIAkJICAgICAgIk1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+LCAiIFwKLQkJICAgICAgIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4sICIgXAorCQkgICAgICAiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+LCAiIFwKIAkJICAgICAgIlNhc2NoYSBTb21tZXIgPHNhc2NoYXNvbW1lckBmcmVlbmV0LmRlPiIKIAogI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICJlbTI4eHgiCkBAIC0xNzAsOCArMTcwLDEyIEBACiBzdGF0aWMgdm9pZCBlbTI4eHhfY29uZmlnX2kyYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpCiB7CiAJc3RydWN0IHY0bDJfZnJlcXVlbmN5IGY7CisJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKKworCXJvdXRlLmlucHV0ID0gSU5QVVQoZGV2LT5jdGxfaW5wdXQpLT52bXV4OworCXJvdXRlLm91dHB1dCA9IDA7CiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1JFU0VULCBOVUxMKTsKLQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX0lOUFVULCAmZGV2LT5jdGxfaW5wdXQpOworCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX0lOVF9TX1ZJREVPX1JPVVRJTkcsICZyb3V0ZSk7CiAJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU1RSRUFNT04sIE5VTEwpOwogCiAJLyogY29uZmlndXJlIHR1bmVyICovCkBAIC0yMDYsMTkgKzIxMCwxOSBAQAogCiBzdGF0aWMgdm9pZCB2aWRlb19tdXgoc3RydWN0IGVtMjh4eCAqZGV2LCBpbnQgaW5kZXgpCiB7Ci0JaW50IGlucHV0LCBhaW5wdXQ7CisJaW50IGFpbnB1dDsKKwlzdHJ1Y3QgdjRsMl9yb3V0aW5nIHJvdXRlOwogCi0JaW5wdXQgPSBJTlBVVChpbmRleCktPnZtdXg7CisJcm91dGUuaW5wdXQgPSBJTlBVVChpbmRleCktPnZtdXg7CisJcm91dGUub3V0cHV0ID0gMDsKIAlkZXYtPmN0bF9pbnB1dCA9IGluZGV4OwogCWRldi0+Y3RsX2FpbnB1dCA9IElOUFVUKGluZGV4KS0+YW11eDsKIAotCWVtMjh4eF9pMmNfY2FsbF9jbGllbnRzKGRldiwgVklESU9DX1NfSU5QVVQsICZpbnB1dCk7CisJZW0yOHh4X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORywgJnJvdXRlKTsKIAotCWVtMjh4eF92aWRlb2RiZygiU2V0dGluZyBpbnB1dCBpbmRleD0lZCwgdm11eD0lZCwgYW11eD0lZFxuIixpbmRleCxpbnB1dCxkZXYtPmN0bF9haW5wdXQpOworCWVtMjh4eF92aWRlb2RiZygiU2V0dGluZyBpbnB1dCBpbmRleD0lZCwgdm11eD0lZCwgYW11eD0lZFxuIixpbmRleCxyb3V0ZS5pbnB1dCxkZXYtPmN0bF9haW5wdXQpOwogCiAJaWYgKGRldi0+aGFzX21zcDM0eHgpIHsKLQkJc3RydWN0IHY0bDJfcm91dGluZyByb3V0ZTsKLQogCQlpZiAoZGV2LT5pMnNfc3BlZWQpCiAJCQllbTI4eHhfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19JTlRfSTJTX0NMT0NLX0ZSRVEsICZkZXYtPmkyc19zcGVlZCk7CiAJCXJvdXRlLmlucHV0ID0gZGV2LT5jdGxfYWlucHV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAppbmRleCBlMWRkYzJmLi5kOGZjYzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHguaApAQCAtMyw3ICszLDcgQEAKIAogICAgQ29weXJpZ2h0IChDKSAyMDA1IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+CiAJCSAgICAgIEx1ZG92aWNvIENhdmVkb24gPGNhdmVkb25Ac3NzdXAuaXQ+Ci0JCSAgICAgIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBicnR1cmJvLmNvbS5icj4KKwkJICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+CiAKICAgIEJhc2VkIG9uIHRoZSBlbTI4MDAgZHJpdmVyIGZyb20gU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+CiAKQEAgLTMxOSwxMyArMzE5LDcgQEAKIGludCBlbTI4eHhfY29sb3JsZXZlbHNfc2V0X2RlZmF1bHQoc3RydWN0IGVtMjh4eCAqZGV2KTsKIGludCBlbTI4eHhfY2FwdHVyZV9zdGFydChzdHJ1Y3QgZW0yOHh4ICpkZXYsIGludCBzdGFydCk7CiBpbnQgZW0yOHh4X291dGZtdF9zZXRfeXV2NDIyKHN0cnVjdCBlbTI4eHggKmRldik7Ci1pbnQgZW0yOHh4X2FjY3VtdWxhdG9yX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IHhtaW4sIHU4IHhtYXgsIHU4IHltaW4sCi0JCQkgICB1OCB5bWF4KTsKLWludCBlbTI4eHhfY2FwdHVyZV9hcmVhX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYsIHU4IGhzdGFydCwgdTggdnN0YXJ0LAotCQkJICAgIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7Ci1pbnQgZW0yOHh4X3NjYWxlcl9zZXQoc3RydWN0IGVtMjh4eCAqZGV2LCB1MTYgaCwgdTE2IHYpOwogaW50IGVtMjh4eF9yZXNvbHV0aW9uX3NldChzdHJ1Y3QgZW0yOHh4ICpkZXYpOwotdm9pZCBlbTI4eHhfaXNvY0lycShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIGludCBlbTI4eHhfaW5pdF9pc29jKHN0cnVjdCBlbTI4eHggKmRldik7CiB2b2lkIGVtMjh4eF91bmluaXRfaXNvYyhzdHJ1Y3QgZW0yOHh4ICpkZXYpOwogaW50IGVtMjh4eF9zZXRfYWx0ZXJuYXRlKHN0cnVjdCBlbTI4eHggKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCmluZGV4IGRmYzlkZDcuLjg5OTJiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jCkBAIC0yMzQxLDExICsyMzQxLDkgQEAKIAljYXNlIFZJRElPQ19HX0NUUkw6CiAJCXJldHVybiBldDYxeDI1MV92aWRpb2NfZ19jdHJsKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQlyZXR1cm4gZXQ2MXgyNTFfdmlkaW9jX3NfY3RybChjYW0sIGFyZyk7CiAKLQljYXNlIFZJRElPQ19DUk9QQ0FQX09MRDoKIAljYXNlIFZJRElPQ19DUk9QQ0FQOgogCQlyZXR1cm4gZXQ2MXgyNTFfdmlkaW9jX2Nyb3BjYXAoY2FtLCBhcmcpOwogCkBAIC0yMzkyLDcgKzIzOTAsNiBAQAogCWNhc2UgVklESU9DX0dfUEFSTToKIAkJcmV0dXJuIGV0NjF4MjUxX3ZpZGlvY19nX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19QQVJNX09MRDoKIAljYXNlIFZJRElPQ19TX1BBUk06CiAJCXJldHVybiBldDYxeDI1MV92aWRpb2Nfc19wYXJtKGNhbSwgYXJnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pci1rYmQtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwppbmRleCA3ZTY2ZDgzLi5mYmEzMGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2lyLWtiZC1pMmMuYwpAQCAtMTUwLDEyICsxNTAsMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogVGhlIG5ldyBwaW5uYWNsZSBQQ1RWIHJlbW90ZSAod2l0aCB0aGUgY29sb3JlZCBidXR0b25zKQorLyogQ29tbW9uIChncmV5IG9yIGNvbG91cmVkKSBwaW5uYWNsZSBQQ1RWIHJlbW90ZSBoYW5kbGluZwogICoKLSAqIFJpY2FyZG8gQ2VycXVlaXJhIDx2NGxAY2VycXVlaXJhLm9yZz4KICAqLwotCi1pbnQgZ2V0X2tleV9waW5uYWNsZShzdHJ1Y3QgSVJfaTJjICppciwgdTMyICppcl9rZXksIHUzMiAqaXJfcmF3KQorc3RhdGljIGludCBnZXRfa2V5X3Bpbm5hY2xlKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcsCisJCQkgICAgaW50IHBhcml0eV9vZmZzZXQsIGludCBtYXJrZXIsIGludCBjb2RlX21vZHVsbykKIHsKIAl1bnNpZ25lZCBjaGFyIGJbNF07CiAJdW5zaWduZWQgaW50IHN0YXJ0ID0gMCxwYXJpdHkgPSAwLGNvZGUgPSAwOwpAQCAtMTY3LDkgKzE2Niw5IEBACiAJfQogCiAJZm9yIChzdGFydCA9IDA7IHN0YXJ0PDQ7IHN0YXJ0KyspIHsKLQkJaWYgKGJbc3RhcnRdID09IDB4ODApIHsKLQkJCWNvZGU9Ylsoc3RhcnQrMyklNF07Ci0JCQlwYXJpdHk9Ylsoc3RhcnQrMiklNF07CisJCWlmIChiW3N0YXJ0XSA9PSBtYXJrZXIpIHsKKwkJCWNvZGU9Ylsoc3RhcnQrcGFyaXR5X29mZnNldCsxKSU0XTsKKwkJCXBhcml0eT1iWyhzdGFydCtwYXJpdHlfb2Zmc2V0KSU0XTsKIAkJfQogCX0KIApAQCAtMTgxLDE2ICsxODAsMTQgQEAKIAlpZiAoaXItPm9sZCA9PSBwYXJpdHkpCiAJCXJldHVybiAwOwogCi0KIAlpci0+b2xkID0gcGFyaXR5OwogCi0JLyogUmVkdWNlIGNvZGUgdmFsdWUgdG8gZml0IGluc2lkZSBJUl9LRVlUQUJfU0laRQotCSAqCi0JICogdGhpcyBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IHJlc3VsdHMgaW4gNDIgdW5pcXVlCi0JICogY29kZXMgPCAxMjgKLQkgKi8KKwkvKiBkcm9wIHNwZWNpYWwgY29kZXMgd2hlbiBhIGtleSBpcyBoZWxkIGRvd24gYSBsb25nIHRpbWUgZm9yIHRoZSBncmV5IGNvbnRyb2xsZXIKKwkgICBJbiB0aGlzIGNhc2UsIHRoZSBzZWNvbmQgYml0IG9mIHRoZSBjb2RlIGlzIGFzc2VydGVkICovCisJaWYgKG1hcmtlciA9PSAweGZlICYmIChjb2RlICYgMHg0MCkpCisJCXJldHVybiAwOwogCi0JY29kZSAlPSAweDg4OworCWNvZGUgJT0gY29kZV9tb2R1bG87CiAKIAkqaXJfcmF3ID0gY29kZTsKIAkqaXJfa2V5ID0gY29kZTsKQEAgLTIwMCw3ICsxOTcsNDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2tleV9waW5uYWNsZSk7CisvKiBUaGUgZ3JleSBwaW5uYWNsZSBQQ1RWIHJlbW90ZQorICoKKyAqICBUaGVyZSBhcmUgb25lIGlzc3VlIHdpdGggdGhpcyByZW1vdGU6CisgKiAgIC0gSTJjIHBhY2tldCBkb2VzIG5vdCBjaGFuZ2Ugd2hlbiB0aGUgc2FtZSBrZXkgaXMgcHJlc3NlZCBxdWlja2x5LiBUaGUgd29ya2Fyb3VuZAorICogICAgIGlzIHRvIGhvbGQgZG93biBlYWNoIGtleSBmb3IgYWJvdXQgaGFsZiBhIHNlY29uZCwgc28gdGhhdCBhbm90aGVyIGNvZGUgaXMgZ2VuZXJhdGVkCisgKiAgICAgaW4gdGhlIGkyYyBwYWNrZXQsIGFuZCB0aGUgZnVuY3Rpb24gY2FuIGRpc3Rpbmd1aXNoIGtleSBwcmVzc2VzLgorICoKKyAqIFN5bHZhaW4gUGFzY2hlIDxzeWx2YWluLnBhc2NoZUBnbWFpbC5jb20+CisgKi8KK2ludCBnZXRfa2V5X3Bpbm5hY2xlX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKworCXJldHVybiBnZXRfa2V5X3Bpbm5hY2xlKGlyLCBpcl9rZXksIGlyX3JhdywgMSwgMHhmZSwgMHhmZik7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9rZXlfcGlubmFjbGVfZ3JleSk7CisKKworLyogVGhlIG5ldyBwaW5uYWNsZSBQQ1RWIHJlbW90ZSAod2l0aCB0aGUgY29sb3JlZCBidXR0b25zKQorICoKKyAqIFJpY2FyZG8gQ2VycXVlaXJhIDx2NGxAY2VycXVlaXJhLm9yZz4KKyAqLworaW50IGdldF9rZXlfcGlubmFjbGVfY29sb3Ioc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3JhdykKK3sKKwkvKiBjb2RlX21vZHVsbyBwYXJhbWV0ZXIgKDB4ODgpIGlzIHVzZWQgdG8gcmVkdWNlIGNvZGUgdmFsdWUgdG8gZml0IGluc2lkZSBJUl9LRVlUQUJfU0laRQorCSAqCisJICogdGhpcyBpcyB0aGUgb25seSB2YWx1ZSB0aGF0IHJlc3VsdHMgaW4gNDIgdW5pcXVlCisJICogY29kZXMgPCAxMjgKKwkgKi8KKworCXJldHVybiBnZXRfa2V5X3Bpbm5hY2xlKGlyLCBpcl9rZXksIGlyX3JhdywgMiwgMHg4MCwgMHg4OCk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGdldF9rZXlfcGlubmFjbGVfY29sb3IpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9rczAxMjcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3YWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9rczAxMjcuYwpAQCAtMCwwICsxLDg0NiBAQAorLyoKKyAqIFZpZGVvIENhcHR1cmUgRHJpdmVyIChWaWRlbyBmb3IgTGludXggMS8yKQorICogZm9yIHRoZSBNYXRyb3ggTWFydmVsIEcyMDAsRzQwMCBhbmQgUmFpbmJvdyBSdW5uZXItRyBzZXJpZXMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEtTMDEyNyB2aWRlbyBkZWNvZGVyIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBSeWFuIERyYWtlIDxzdGlsZXR0b0BtZWRpYW9uZS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTW9kaWZpZWQgYW5kIGV4dGVuZGVkIGJ5CisgKglNaWtlIEJlcm5zb24gPG1pa2VAbWxiLm9yZz4KKyAqCUdlcmFyZCB2LmQuIEhvcnN0CisgKglMZW9uIHZhbiBTdHVpdmVuYmVyZyA8bC52YW5zdHVpdmVuYmVyZ0BjaGVsbG8ubmw+CisgKglHZXJub3QgWmllZ2xlciA8Z3pAbHlzYXRvci5saXUuc2U+CisgKgorICogVmVyc2lvbiBIaXN0b3J5OgorICogVjEuMCBSeWFuIERyYWtlCSAgIEluaXRpYWwgdmVyc2lvbiBieSBSeWFuIERyYWtlCisgKiBWMS4xIEdlcmFyZCB2LmQuIEhvcnN0ICBBZGRlZCBzb21lIGRlYnVnb3V0cHV0LCByZXNldCB0aGUgdmlkZW8tc3RhbmRhcmQKKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgX19LRVJORUxfXworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSAia3MwMTI3LmgiCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisKKyNkZWZpbmUgZHByaW50ayAgICAgaWYgKGRlYnVnKSBwcmludGsKKworLyogaTJjIGlkZW50aWZpY2F0aW9uICovCisjZGVmaW5lIEkyQ19LUzAxMjdfQURET04gICAweEQ4CisjZGVmaW5lIEkyQ19LUzAxMjdfT05CT0FSRCAweERBCisKKyNkZWZpbmUgS1NfVFlQRV9VTktOT1dOCTAKKyNkZWZpbmUgS1NfVFlQRV8wMTIyUwkxCisjZGVmaW5lIEtTX1RZUEVfMDEyNwkyCisjZGVmaW5lIEtTX1RZUEVfMDEyN0IJMworCisvKiBrczAxMjcgY29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgS1NfU1RBVCAgICAgMHgwMAorI2RlZmluZSBLU19DTURBICAgICAweDAxCisjZGVmaW5lIEtTX0NNREIgICAgIDB4MDIKKyNkZWZpbmUgS1NfQ01EQyAgICAgMHgwMworI2RlZmluZSBLU19DTUREICAgICAweDA0CisjZGVmaW5lIEtTX0hBVkIgICAgIDB4MDUKKyNkZWZpbmUgS1NfSEFWRSAgICAgMHgwNgorI2RlZmluZSBLU19IUzFCICAgICAweDA3CisjZGVmaW5lIEtTX0hTMUUgICAgIDB4MDgKKyNkZWZpbmUgS1NfSFMyQiAgICAgMHgwOQorI2RlZmluZSBLU19IUzJFICAgICAweDBhCisjZGVmaW5lIEtTX0FHQyAgICAgIDB4MGIKKyNkZWZpbmUgS1NfSFhUUkEgICAgMHgwYworI2RlZmluZSBLU19DREVNICAgICAweDBkCisjZGVmaW5lIEtTX1BPUlRBQiAgIDB4MGUKKyNkZWZpbmUgS1NfTFVNQSAgICAgMHgwZgorI2RlZmluZSBLU19DT04gICAgICAweDEwCisjZGVmaW5lIEtTX0JSVCAgICAgIDB4MTEKKyNkZWZpbmUgS1NfQ0hST01BICAgMHgxMgorI2RlZmluZSBLU19DSFJPTUIgICAweDEzCisjZGVmaW5lIEtTX0RFTU9EICAgIDB4MTQKKyNkZWZpbmUgS1NfU0FUICAgICAgMHgxNQorI2RlZmluZSBLU19IVUUgICAgICAweDE2CisjZGVmaW5lIEtTX1ZFUlRJQSAgIDB4MTcKKyNkZWZpbmUgS1NfVkVSVElCICAgMHgxOAorI2RlZmluZSBLU19WRVJUSUMgICAweDE5CisjZGVmaW5lIEtTX0hTQ0xMICAgIDB4MWEKKyNkZWZpbmUgS1NfSFNDTEggICAgMHgxYgorI2RlZmluZSBLU19WU0NMTCAgICAweDFjCisjZGVmaW5lIEtTX1ZTQ0xIICAgIDB4MWQKKyNkZWZpbmUgS1NfT0ZNVEEgICAgMHgxZQorI2RlZmluZSBLU19PRk1UQiAgICAweDFmCisjZGVmaW5lIEtTX1ZCSUNUTCAgIDB4MjAKKyNkZWZpbmUgS1NfQ0NEQVQyICAgMHgyMQorI2RlZmluZSBLU19DQ0RBVDEgICAweDIyCisjZGVmaW5lIEtTX1ZCSUwzMCAgIDB4MjMKKyNkZWZpbmUgS1NfVkJJTDc0ICAgMHgyNAorI2RlZmluZSBLU19WQklMMTE4ICAweDI1CisjZGVmaW5lIEtTX1ZCSUwxNTEyIDB4MjYKKyNkZWZpbmUgS1NfVFRGUkFNICAgMHgyNworI2RlZmluZSBLU19URVNUQSAgICAweDI4CisjZGVmaW5lIEtTX1VWT0ZGSCAgIDB4MjkKKyNkZWZpbmUgS1NfVVZPRkZMICAgMHgyYQorI2RlZmluZSBLU19VR0FJTiAgICAweDJiCisjZGVmaW5lIEtTX1ZHQUlOICAgIDB4MmMKKyNkZWZpbmUgS1NfVkFWQiAgICAgMHgyZAorI2RlZmluZSBLU19WQVZFICAgICAweDJlCisjZGVmaW5lIEtTX0NUUkFDSyAgIDB4MmYKKyNkZWZpbmUgS1NfUE9MQ1RMICAgMHgzMAorI2RlZmluZSBLU19SRUZDT0QgICAweDMxCisjZGVmaW5lIEtTX0lOVkFMWSAgIDB4MzIKKyNkZWZpbmUgS1NfSU5WQUxVICAgMHgzMworI2RlZmluZSBLU19JTlZBTFYgICAweDM0CisjZGVmaW5lIEtTX1VOVVNFWSAgIDB4MzUKKyNkZWZpbmUgS1NfVU5VU0VVICAgMHgzNgorI2RlZmluZSBLU19VTlVTRVYgICAweDM3CisjZGVmaW5lIEtTX1VTUlNBViAgIDB4MzgKKyNkZWZpbmUgS1NfVVNSRUFWICAgMHgzOQorI2RlZmluZSBLU19TSFMxQSAgICAweDNhCisjZGVmaW5lIEtTX1NIUzFCICAgIDB4M2IKKyNkZWZpbmUgS1NfU0hTMUMgICAgMHgzYworI2RlZmluZSBLU19DTURFICAgICAweDNkCisjZGVmaW5lIEtTX1ZTREVMICAgIDB4M2UKKyNkZWZpbmUgS1NfQ01ERiAgICAgMHgzZgorI2RlZmluZSBLU19HQU1NQTAgICAweDQwCisjZGVmaW5lIEtTX0dBTU1BMSAgIDB4NDEKKyNkZWZpbmUgS1NfR0FNTUEyICAgMHg0MgorI2RlZmluZSBLU19HQU1NQTMgICAweDQzCisjZGVmaW5lIEtTX0dBTU1BNCAgIDB4NDQKKyNkZWZpbmUgS1NfR0FNTUE1ICAgMHg0NQorI2RlZmluZSBLU19HQU1NQTYgICAweDQ2CisjZGVmaW5lIEtTX0dBTU1BNyAgIDB4NDcKKyNkZWZpbmUgS1NfR0FNTUE4ICAgMHg0OAorI2RlZmluZSBLU19HQU1NQTkgICAweDQ5CisjZGVmaW5lIEtTX0dBTU1BMTAgIDB4NGEKKyNkZWZpbmUgS1NfR0FNTUExMSAgMHg0YgorI2RlZmluZSBLU19HQU1NQTEyICAweDRjCisjZGVmaW5lIEtTX0dBTU1BMTMgIDB4NGQKKyNkZWZpbmUgS1NfR0FNTUExNCAgMHg0ZQorI2RlZmluZSBLU19HQU1NQTE1ICAweDRmCisjZGVmaW5lIEtTX0dBTU1BMTYgIDB4NTAKKyNkZWZpbmUgS1NfR0FNTUExNyAgMHg1MQorI2RlZmluZSBLU19HQU1NQTE4ICAweDUyCisjZGVmaW5lIEtTX0dBTU1BMTkgIDB4NTMKKyNkZWZpbmUgS1NfR0FNTUEyMCAgMHg1NAorI2RlZmluZSBLU19HQU1NQTIxICAweDU1CisjZGVmaW5lIEtTX0dBTU1BMjIgIDB4NTYKKyNkZWZpbmUgS1NfR0FNTUEyMyAgMHg1NworI2RlZmluZSBLU19HQU1NQTI0ICAweDU4CisjZGVmaW5lIEtTX0dBTU1BMjUgIDB4NTkKKyNkZWZpbmUgS1NfR0FNTUEyNiAgMHg1YQorI2RlZmluZSBLU19HQU1NQTI3ICAweDViCisjZGVmaW5lIEtTX0dBTU1BMjggIDB4NWMKKyNkZWZpbmUgS1NfR0FNTUEyOSAgMHg1ZAorI2RlZmluZSBLU19HQU1NQTMwICAweDVlCisjZGVmaW5lIEtTX0dBTU1BMzEgIDB4NWYKKyNkZWZpbmUgS1NfR0FNTUFEMCAgMHg2MAorI2RlZmluZSBLU19HQU1NQUQxICAweDYxCisjZGVmaW5lIEtTX0dBTU1BRDIgIDB4NjIKKyNkZWZpbmUgS1NfR0FNTUFEMyAgMHg2MworI2RlZmluZSBLU19HQU1NQUQ0ICAweDY0CisjZGVmaW5lIEtTX0dBTU1BRDUgIDB4NjUKKyNkZWZpbmUgS1NfR0FNTUFENiAgMHg2NgorI2RlZmluZSBLU19HQU1NQUQ3ICAweDY3CisjZGVmaW5lIEtTX0dBTU1BRDggIDB4NjgKKyNkZWZpbmUgS1NfR0FNTUFEOSAgMHg2OQorI2RlZmluZSBLU19HQU1NQUQxMCAweDZhCisjZGVmaW5lIEtTX0dBTU1BRDExIDB4NmIKKyNkZWZpbmUgS1NfR0FNTUFEMTIgMHg2YworI2RlZmluZSBLU19HQU1NQUQxMyAweDZkCisjZGVmaW5lIEtTX0dBTU1BRDE0IDB4NmUKKyNkZWZpbmUgS1NfR0FNTUFEMTUgMHg2ZgorI2RlZmluZSBLU19HQU1NQUQxNiAweDcwCisjZGVmaW5lIEtTX0dBTU1BRDE3IDB4NzEKKyNkZWZpbmUgS1NfR0FNTUFEMTggMHg3MgorI2RlZmluZSBLU19HQU1NQUQxOSAweDczCisjZGVmaW5lIEtTX0dBTU1BRDIwIDB4NzQKKyNkZWZpbmUgS1NfR0FNTUFEMjEgMHg3NQorI2RlZmluZSBLU19HQU1NQUQyMiAweDc2CisjZGVmaW5lIEtTX0dBTU1BRDIzIDB4NzcKKyNkZWZpbmUgS1NfR0FNTUFEMjQgMHg3OAorI2RlZmluZSBLU19HQU1NQUQyNSAweDc5CisjZGVmaW5lIEtTX0dBTU1BRDI2IDB4N2EKKyNkZWZpbmUgS1NfR0FNTUFEMjcgMHg3YgorI2RlZmluZSBLU19HQU1NQUQyOCAweDdjCisjZGVmaW5lIEtTX0dBTU1BRDI5IDB4N2QKKyNkZWZpbmUgS1NfR0FNTUFEMzAgMHg3ZQorI2RlZmluZSBLU19HQU1NQUQzMSAweDdmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogbWdhX2RldiA6IHJlcHJlc2VudHMgb25lIGtzMDEyNyBjaGlwLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFkanVzdCB7CisJaW50CWNvbnRyYXN0OworCWludAlicmlnaHQ7CisJaW50CWh1ZTsKKwlpbnQJdWdhaW47CisJaW50CXZnYWluOworfTsKKworc3RydWN0IGtzMDEyNyB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl1bnNpZ25lZCBjaGFyCWFkZHI7CisJaW50CQlmb3JtYXRfd2lkdGg7CisJaW50CQlmb3JtYXRfaGVpZ2h0OworCWludAkJY2FwX3dpZHRoOworCWludAkJY2FwX2hlaWdodDsKKwlpbnQJCW5vcm07CisJaW50CQlrc190eXBlOworCXU4IAkJcmVnc1syNTZdOworfTsKKworCitzdGF0aWMgaW50IGRlYnVnOyAvKiBpbnNtb2QgcGFyYW1ldGVyICovCisKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBvdXRwdXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHU4IHJlZ19kZWZhdWx0c1s2NF07CisKKworCitzdGF0aWMgdm9pZCBpbml0X3JlZ19kZWZhdWx0cyh2b2lkKQoreworCXU4ICp0YWJsZSA9IHJlZ19kZWZhdWx0czsKKworCXRhYmxlW0tTX0NNREFdICAgICA9IDB4MmM7ICAvKiBWU0U9MCwgQ0NJUiA2MDEsIGF1dG9kZXRlY3Qgc3RhbmRhcmQgKi8KKwl0YWJsZVtLU19DTURCXSAgICAgPSAweDEyOyAgLyogVkFMSUdOPTAsIEFHQyBjb250cm9sIGFuZCBpbnB1dCAqLworCXRhYmxlW0tTX0NNRENdICAgICA9IDB4MDA7ICAvKiBUZXN0IG9wdGlvbnMgKi8KKwkvKiBjbG9jayAmIGlucHV0IHNlbGVjdCwgd3JpdGUgMSB0byBQT1JUQSAqLworCXRhYmxlW0tTX0NNRERdICAgICA9IDB4MDE7CisJdGFibGVbS1NfSEFWQl0gICAgID0gMHgwMDsgIC8qIEhBViBTdGFydCBDb250cm9sICovCisJdGFibGVbS1NfSEFWRV0gICAgID0gMHgwMDsgIC8qIEhBViBFbmQgQ29udHJvbCAqLworCXRhYmxlW0tTX0hTMUJdICAgICA9IDB4MTA7ICAvKiBIUzEgU3RhcnQgQ29udHJvbCAqLworCXRhYmxlW0tTX0hTMUVdICAgICA9IDB4MDA7ICAvKiBIUzEgRW5kIENvbnRyb2wgKi8KKwl0YWJsZVtLU19IUzJCXSAgICAgPSAweDAwOyAgLyogSFMyIFN0YXJ0IENvbnRyb2wgKi8KKwl0YWJsZVtLU19IUzJFXSAgICAgPSAweDAwOyAgLyogSFMyIEVuZCBDb250cm9sICovCisJdGFibGVbS1NfQUdDXSAgICAgID0gMHg1MzsgIC8qIE1hbnVhbCBzZXR0aW5nIGZvciBBR0MgKi8KKwl0YWJsZVtLU19IWFRSQV0gICAgPSAweDAwOyAgLyogRXh0cmEgQml0cyBmb3IgSEFWIGFuZCBIUzEvMiAqLworCXRhYmxlW0tTX0NERU1dICAgICA9IDB4MDA7ICAvKiBDaHJvbWEgRGVtb2R1bGF0aW9uIENvbnRyb2wgKi8KKwl0YWJsZVtLU19QT1JUQUJdICAgPSAweDBmOyAgLyogcG9ydCBCIGlzIGlucHV0LCBwb3J0IEEgb3V0cHV0IEdQUE9SVCAqLworCXRhYmxlW0tTX0xVTUFdICAgICA9IDB4MDE7ICAvKiBMdW1hIGNvbnRyb2wgKi8KKwl0YWJsZVtLU19DT05dICAgICAgPSAweDAwOyAgLyogQ29udHJhc3QgQ29udHJvbCAqLworCXRhYmxlW0tTX0JSVF0gICAgICA9IDB4MDA7ICAvKiBCcmlnaHRuZXNzIENvbnRyb2wgKi8KKwl0YWJsZVtLU19DSFJPTUFdICAgPSAweDJhOyAgLyogQ2hyb21hIGNvbnRyb2wgQSAqLworCXRhYmxlW0tTX0NIUk9NQl0gICA9IDB4OTA7ICAvKiBDaHJvbWEgY29udHJvbCBCICovCisJdGFibGVbS1NfREVNT0RdICAgID0gMHgwMDsgIC8qIENocm9tYSBEZW1vZHVsYXRpb24gQ29udHJvbCAmIFN0YXR1cyAqLworCXRhYmxlW0tTX1NBVF0gICAgICA9IDB4MDA7ICAvKiBDb2xvciBTYXR1cmF0aW9uIENvbnRyb2wqLworCXRhYmxlW0tTX0hVRV0gICAgICA9IDB4MDA7ICAvKiBIdWUgQ29udHJvbCAqLworCXRhYmxlW0tTX1ZFUlRJQV0gICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBQcm9jZXNzaW5nIENvbnRyb2wgQSAqLworCS8qIFZlcnRpY2FsIFByb2Nlc3NpbmcgQ29udHJvbCBCLCBsdW1hIDEgbGluZSBkZWxheWVkICovCisJdGFibGVbS1NfVkVSVElCXSAgID0gMHgxMjsKKwl0YWJsZVtLU19WRVJUSUNdICAgPSAweDBiOyAgLyogVmVydGljYWwgUHJvY2Vzc2luZyBDb250cm9sIEMgKi8KKwl0YWJsZVtLU19IU0NMTF0gICAgPSAweDAwOyAgLyogSG9yaXpvbnRhbCBTY2FsaW5nIFJhdGlvIExvdyAqLworCXRhYmxlW0tTX0hTQ0xIXSAgICA9IDB4MDA7ICAvKiBIb3Jpem9udGFsIFNjYWxpbmcgUmF0aW8gSGlnaCAqLworCXRhYmxlW0tTX1ZTQ0xMXSAgICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBTY2FsaW5nIFJhdGlvIExvdyAqLworCXRhYmxlW0tTX1ZTQ0xIXSAgICA9IDB4MDA7ICAvKiBWZXJ0aWNhbCBTY2FsaW5nIFJhdGlvIEhpZ2ggKi8KKwkvKiAxNiBiaXQgWUNiQ3IgNDoyOjIgb3V0cHV0OyBJIGNhbid0IG1ha2UgdGhlIGJ0ODY2IGxpa2UgOCBiaXQgL1NhbSAqLworCXRhYmxlW0tTX09GTVRBXSAgICA9IDB4MzA7CisJdGFibGVbS1NfT0ZNVEJdICAgID0gMHgwMDsgIC8qIE91dHB1dCBDb250cm9sIEIgKi8KKwkvKiBWQkkgRGVjb2RlciBDb250cm9sOyA0Yml0IGZtdDogYXZvaWQgWSBvdmVyZmxvdyAqLworCXRhYmxlW0tTX1ZCSUNUTF0gICA9IDB4NWQ7CisJdGFibGVbS1NfQ0NEQVQyXSAgID0gMHgwMDsgIC8qIFJlYWQgT25seSByZWdpc3RlciAqLworCXRhYmxlW0tTX0NDREFUMV0gICA9IDB4MDA7ICAvKiBSZWFkIE9ubHkgcmVnaXN0ZXIgKi8KKwl0YWJsZVtLU19WQklMMzBdICAgPSAweGE4OyAgLyogVkJJIGRhdGEgZGVjb2Rpbmcgb3B0aW9ucyAqLworCXRhYmxlW0tTX1ZCSUw3NF0gICA9IDB4YWE7ICAvKiBWQkkgZGF0YSBkZWNvZGluZyBvcHRpb25zICovCisJdGFibGVbS1NfVkJJTDExOF0gID0gMHgyYTsgIC8qIFZCSSBkYXRhIGRlY29kaW5nIG9wdGlvbnMgKi8KKwl0YWJsZVtLU19WQklMMTUxMl0gPSAweDAwOyAgLyogVkJJIGRhdGEgZGVjb2Rpbmcgb3B0aW9ucyAqLworCXRhYmxlW0tTX1RURlJBTV0gICA9IDB4MDA7ICAvKiBUZWxldGV4dCBmcmFtZSBhbGlnbm1lbnQgcGF0dGVybiAqLworCXRhYmxlW0tTX1RFU1RBXSAgICA9IDB4MDA7ICAvKiB0ZXN0IHJlZ2lzdGVyLCBzaG91bGRuJ3QgYmUgd3JpdHRlbiAqLworCXRhYmxlW0tTX1VWT0ZGSF0gICA9IDB4MDA7ICAvKiBVViBPZmZzZXQgQWRqdXN0bWVudCBIaWdoICovCisJdGFibGVbS1NfVVZPRkZMXSAgID0gMHgwMDsgIC8qIFVWIE9mZnNldCBBZGp1c3RtZW50IExvdyAqLworCXRhYmxlW0tTX1VHQUlOXSAgICA9IDB4MDA7ICAvKiBVIENvbXBvbmVudCBHYWluIEFkanVzdG1lbnQgKi8KKwl0YWJsZVtLU19WR0FJTl0gICAgPSAweDAwOyAgLyogViBDb21wb25lbnQgR2FpbiBBZGp1c3RtZW50ICovCisJdGFibGVbS1NfVkFWQl0gICAgID0gMHgwNzsgIC8qIFZBViBCZWdpbiAqLworCXRhYmxlW0tTX1ZBVkVdICAgICA9IDB4MDA7ICAvKiBWQVYgRW5kICovCisJdGFibGVbS1NfQ1RSQUNLXSAgID0gMHgwMDsgIC8qIENocm9tYSBUcmFja2luZyBDb250cm9sICovCisJdGFibGVbS1NfUE9MQ1RMXSAgID0gMHg0MTsgIC8qIFRpbWluZyBTaWduYWwgUG9sYXJpdHkgQ29udHJvbCAqLworCXRhYmxlW0tTX1JFRkNPRF0gICA9IDB4ODA7ICAvKiBSZWZlcmVuY2UgQ29kZSBJbnNlcnRpb24gQ29udHJvbCAqLworCXRhYmxlW0tTX0lOVkFMWV0gICA9IDB4MTA7ICAvKiBJbnZhbGlkIFkgQ29kZSAqLworCXRhYmxlW0tTX0lOVkFMVV0gICA9IDB4ODA7ICAvKiBJbnZhbGlkIFUgQ29kZSAqLworCXRhYmxlW0tTX0lOVkFMVl0gICA9IDB4ODA7ICAvKiBJbnZhbGlkIFYgQ29kZSAqLworCXRhYmxlW0tTX1VOVVNFWV0gICA9IDB4MTA7ICAvKiBVbnVzZWQgWSBDb2RlICovCisJdGFibGVbS1NfVU5VU0VVXSAgID0gMHg4MDsgIC8qIFVudXNlZCBVIENvZGUgKi8KKwl0YWJsZVtLU19VTlVTRVZdICAgPSAweDgwOyAgLyogVW51c2VkIFYgQ29kZSAqLworCXRhYmxlW0tTX1VTUlNBVl0gICA9IDB4MDA7ICAvKiByZXNlcnZlZCAqLworCXRhYmxlW0tTX1VTUkVBVl0gICA9IDB4MDA7ICAvKiByZXNlcnZlZCAqLworCXRhYmxlW0tTX1NIUzFBXSAgICA9IDB4MDA7ICAvKiBVc2VyIERlZmluZWQgU0hTMSBBICovCisJLyogVXNlciBEZWZpbmVkIFNIUzEgQiwgQUxUNjU2PTEgb24gMDEyN0IgKi8KKwl0YWJsZVtLU19TSFMxQl0gICAgPSAweDgwOworCXRhYmxlW0tTX1NIUzFDXSAgICA9IDB4MDA7ICAvKiBVc2VyIERlZmluZWQgU0hTMSBDICovCisJdGFibGVbS1NfQ01ERV0gICAgID0gMHgwMDsgIC8qIENvbW1hbmQgUmVnaXN0ZXIgRSAqLworCXRhYmxlW0tTX1ZTREVMXSAgICA9IDB4MDA7ICAvKiBWUyBEZWxheSBDb250cm9sICovCisJLyogQ29tbWFuZCBSZWdpc3RlciBGLCB1cGRhdGUgLWltbWVkaWF0ZWx5LSAqLworCS8qICh0aGVyZSBtaWdodCBjb21lIG5vIHZzeW5jKSovCisJdGFibGVbS1NfQ01ERl0gICAgID0gMHgwMjsKK30KKworCisvKiBXZSBuZWVkIHRvIG1hbnVhbGx5IHJlYWQgYmVjYXVzZSBvZiBhIGJ1ZyBpbiB0aGUgS1MwMTI3IGNoaXAuCisgKgorICogQW4gZXhwbGFuYXRpb24gZnJvbSBrYXlvcmtAbWFpbC51dGV4YXMuZWR1OgorICoKKyAqIER1cmluZyBJMkMgcmVhZHMsIHRoZSBLUzAxMjcgb25seSBzYW1wbGVzIGZvciBhIHN0b3AgY29uZGl0aW9uCisgKiBkdXJpbmcgdGhlIHBsYWNlIHdoZXJlIHRoZSBhY2tub2xlZGdlIGJpdCBzaG91bGQgYmUuIEFueSBzdGFuZGFyZAorICogSTJDIGltcGxlbWVudGF0aW9uIChjb3JyZWN0bHkpIHRocm93cyBpbiBhbm90aGVyIGNsb2NrIHRyYW5zaXRpb24KKyAqIGF0IHRoZSA5dGggYml0LCBhbmQgdGhlIEtTMDEyNyB3aWxsIG5vdCByZWNvZ25pemUgdGhlIHN0b3AgY29uZGl0aW9uCisgKiBhbmQgd2lsbCBjb250aW51ZSB0byBjbG9jayBvdXQgZGF0YS4KKyAqCisgKiBTbyB3ZSBoYXZlIHRvIGRvIHRoZSByZWFkIG91cnNlbGYuICBCaWcgZGVhbC4KKwkgICB3b3JrYXJvdW5kIGluIGkyYy1hbGdvLWJpdAorICovCisKKworc3RhdGljIHU4IGtzMDEyN19yZWFkKHN0cnVjdCBrczAxMjcgKmtzLCB1OCByZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmMgPSBrcy0+Y2xpZW50OworCWNoYXIgdmFsID0gMDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXtjLT5hZGRyLCAwLCBzaXplb2YocmVnKSwgJnJlZ30sCisJCXtjLT5hZGRyLCBJMkNfTV9SRCB8IEkyQ19NX05PX1JEX0FDSywgc2l6ZW9mKHZhbCksICZ2YWx9fTsKKwlpbnQgcmV0OworCisJcmV0ID0gaTJjX3RyYW5zZmVyKGMtPmFkYXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOworCWlmIChyZXQgIT0gQVJSQVlfU0laRShtc2dzKSkKKwkJZHByaW50aygia3MwMTI3X3dyaXRlIGVycm9yXG4iKTsKKworCXJldHVybiB2YWw7Cit9CisKKworc3RhdGljIHZvaWQga3MwMTI3X3dyaXRlKHN0cnVjdCBrczAxMjcgKmtzLCB1OCByZWcsIHU4IHZhbCkKK3sKKwljaGFyIG1zZ1tdID0ge3JlZywgdmFsfTsKKworCWlmIChpMmNfbWFzdGVyX3NlbmQoa3MtPmNsaWVudCwgbXNnLCBzaXplb2YobXNnKSkgIT0gc2l6ZW9mKG1zZykpCisJCWRwcmludGsoImtzMDEyN193cml0ZSBlcnJvclxuIik7CisKKwlrcy0+cmVnc1tyZWddID0gdmFsOworfQorCisKKy8qIGdlbmVyaWMgYml0LXR3aWRkbGluZyAqLworc3RhdGljIHZvaWQga3MwMTI3X2FuZF9vcihzdHJ1Y3Qga3MwMTI3ICprcywgdTggcmVnLCB1OCBhbmRfdiwgdTggb3JfdikKK3sKKwl1OCB2YWwgPSBrcy0+cmVnc1tyZWddOworCXZhbCA9ICh2YWwgJiBhbmRfdikgfCBvcl92OworCWtzMDEyN193cml0ZShrcywgcmVnLCB2YWwpOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoga3MwMTI3IHByaXZhdGUgYXBpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQga3MwMTI3X3Jlc2V0KHN0cnVjdCBrczAxMjcqIGtzKQoreworCWludCBpOworCXU4ICp0YWJsZSA9IHJlZ19kZWZhdWx0czsKKworCWtzLT5rc190eXBlID0gS1NfVFlQRV9VTktOT1dOOworCisJZHByaW50aygia3MwMTI3OiByZXNldFxuIik7CisJbXNsZWVwKDEpOworCisJLyogaW5pdGlhbGl6ZSBhbGwgcmVnaXN0ZXJzIHRvIGtub3duIHZhbHVlcyAqLworCS8qIChleGNlcHQgU1RBVCwgMHgyMSwgMHgyMiwgVEVTVCBhbmQgMHgzOCwweDM5KSAqLworCisJZm9yKGkgPSAxOyBpIDwgMzM7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDM1OyBpIDwgNDA7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDQxOyBpIDwgNTY7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKwlmb3IoaSA9IDU4OyBpIDwgNjQ7IGkrKykKKwkJa3MwMTI3X3dyaXRlKGtzLCBpLCB0YWJsZVtpXSk7CisKKworCWlmICgoa3MwMTI3X3JlYWQoa3MsIEtTX1NUQVQpICYgMHg4MCkgPT0gMCkgeworCQlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfMDEyMlM7CisJCWRwcmludGsoImtzMDEyNzoga3MwMTIycyBGb3VuZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2goa3MwMTI3X3JlYWQoa3MsIEtTX0NNREUpICYgMHgwZikgeworCisJY2FzZSAwOgorCQlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfMDEyNzsKKwkJZHByaW50aygia3MwMTI3OiBrczAxMjcgZm91bmRcbiIpOworCQlicmVhazsKKworCWNhc2UgOToKKwkJa3MtPmtzX3R5cGUgPSBLU19UWVBFXzAxMjdCOworCQlkcHJpbnRrKCJrczAxMjc6IGtzMDEyN0IgUmV2aXNpb24gQSBmb3VuZFxuIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZHByaW50aygia3MwMTI3OiB1bmtub3duIHJldmlzaW9uXG4iKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGtzMDEyN19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qga3MwMTI3ICprcyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaW50CQkqaWFyZyA9IChpbnQqKWFyZzsKKworCWludAkJc3RhdHVzOworCisJaWYgKCFrcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBERUNPREVSX0lOSVQ6CisJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX0lOSVRcbiIpOworCQlrczAxMjdfcmVzZXQoa3MpOworCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfSU5QVVQ6CisJCXN3aXRjaCgqaWFyZykgeworCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8xOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8yOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV8zOgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV80OgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV81OgorCQljYXNlIEtTX0lOUFVUX0NPTVBPU0lURV82OgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX0lOUFVUICVkOiAiCisJCQkJIkNvbXBvc2l0ZVxuIiwgKmlhcmcpOworCQkJLyogYXV0b2RldGVjdCA1MC82MCBIeiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAwKTsKKwkJCS8qIFZTRT0wICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIH4weDQwLCAweDAwKTsKKwkJCS8qIHNldCBpbnB1dCBsaW5lICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURCLCAgIDB4YjAsICppYXJnKTsKKwkJCS8qIG5vbi1mcmVlcnVubmluZyBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURDLCAgIDB4NzAsIDB4MGEpOworCQkJLyogYW5hbG9nIGlucHV0ICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURELCAgIDB4MDMsIDB4MDApOworCQkJLyogZW5hYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgwMCk7CisJCQkvKiBjaHJvbWEgdHJhcCwgSFlCV1I9MSAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfTFVNQSwgICAweDAwLAorCQkJCSAgICAgICAocmVnX2RlZmF1bHRzW0tTX0xVTUFdKXwweDBjKTsKKwkJCS8qIHNjYWxlciBmdWxsYncsIGx1bWEgY29tYiBvZmYgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX1ZFUlRJQSwgMHgwOCwgMHg4MSk7CisJCQkvKiBtYW51YWwgY2hyb21hIGNvbWIgLjI1IC41IC4yNSAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLCAweDkwKTsKKworCQkJLyogY2hyb21hIHBhdGggZGVsYXkgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQiwgMHgwZiwgMHg5MCk7CisKKwkJCWtzMDEyN193cml0ZShrcywgS1NfVUdBSU4sIHJlZ19kZWZhdWx0c1tLU19VR0FJTl0pOworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19WR0FJTiwgcmVnX2RlZmF1bHRzW0tTX1ZHQUlOXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1VWT0ZGSCwgcmVnX2RlZmF1bHRzW0tTX1VWT0ZGSF0pOworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19VVk9GRkwsIHJlZ19kZWZhdWx0c1tLU19VVk9GRkxdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzE6CisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzI6CisJCWNhc2UgS1NfSU5QVVRfU1ZJREVPXzM6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQgJWQ6ICIKKwkJCQkiUy1WaWRlb1xuIiwgKmlhcmcpOworCQkJLyogYXV0b2RldGVjdCA1MC82MCBIeiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAwKTsKKwkJCS8qIFZTRT0wICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIH4weDQwLCAweDAwKTsKKwkJCS8qIHNldCBpbnB1dCBsaW5lICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURCLCAgIDB4YjAsICppYXJnKTsKKwkJCS8qIG5vbi1mcmVlcnVubmluZyBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURDLCAgIDB4NzAsIDB4MGEpOworCQkJLyogYW5hbG9nIGlucHV0ICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURELCAgIDB4MDMsIDB4MDApOworCQkJLyogZW5hYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgwMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19MVU1BLCAweDAwLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfTFVNQV0pOworCQkJLyogZGlzYWJsZSBsdW1hIGNvbWIgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX1ZFUlRJQSwgMHgwOCwKKwkJCQkgICAgICAgKHJlZ19kZWZhdWx0c1tLU19WRVJUSUFdJjB4ZjApfDB4MDEpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfVkVSVElDXSYweGYwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01CLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfQ0hST01CXSYweGYwKTsKKworCQkJa3MwMTI3X3dyaXRlKGtzLCBLU19VR0FJTiwgcmVnX2RlZmF1bHRzW0tTX1VHQUlOXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1ZHQUlOLCByZWdfZGVmYXVsdHNbS1NfVkdBSU5dKTsKKwkJCWtzMDEyN193cml0ZShrcywgS1NfVVZPRkZILCByZWdfZGVmYXVsdHNbS1NfVVZPRkZIXSk7CisJCQlrczAxMjdfd3JpdGUoa3MsIEtTX1VWT0ZGTCwgcmVnX2RlZmF1bHRzW0tTX1VWT0ZGTF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBLU19JTlBVVF9ZVVY2NTY6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQgMTU6ICIKKwkJCQkiWVVWNjU2XG4iKTsKKwkJCWlmIChrcy0+bm9ybSA9PSBWSURFT19NT0RFX05UU0MgfHwKKwkJCSAgICBrcy0+bm9ybSA9PSBLU19TVERfUEFMX00pCisJCQkJLyogZm9yY2UgNjAgSHogKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DTURBLCAgIDB4ZmMsIDB4MDMpOworCQkJZWxzZQorCQkJCS8qIGZvcmNlIDUwIEh6ICovCisJCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZjLCAweDAyKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQSwgICAweGZmLCAweDQwKTsgLyogVlNFPTEgKi8KKwkJCS8qIHNldCBpbnB1dCBsaW5lIGFuZCBWQUxJR04gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREIsICAgMHhiMCwgKCppYXJnIHwgMHg0MCkpOworCQkJLyogZnJlZXJ1bm5pbmcgbW9kZSwgKi8KKwkJCS8qIFRTVEdFTiA9IDEgVFNUR0ZSPTExIFRTVEdQSD0wIFRTVEdQSz0wICBWTUVNPTEqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ01EQywgICAweDcwLCAweDg3KTsKKwkJCS8qIGRpZ2l0YWwgaW5wdXQsIFNZTkRJUiA9IDAgSU5QU0w9MDEgQ0xLRElSPTAgRUFWPTAgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREQsICAgMHgwMywgMHgwOCk7CisJCQkvKiBkaXNhYmxlIGNocm9tYSBkZW1vZHVsYXRpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NUUkFDSywgMHhjZiwgMHgzMCk7CisJCQkvKiBIWVBLID0wMSBDVFJBUCA9IDAgSFlCV1I9MCBQRUQ9MSBSR0JIPTEgVU5JVD0xICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19MVU1BLCAgIDB4MDAsIDB4NzEpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElDLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfVkVSVElDXSYweGYwKTsKKworCQkJLyogc2NhbGVyIGZ1bGxidywgbHVtYSBjb21iIG9mZiAqLworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVkVSVElBLCAweDA4LCAweDgxKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01CLCAweDBmLAorCQkJCSAgICAgICByZWdfZGVmYXVsdHNbS1NfQ0hST01CXSYweGYwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ09OLCAweDAwLCAweDAwKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0JSVCwgMHgwMCwgMzIpOwkvKiBzcGVjOiAzNCAqLworCQkJCS8qIHNwZWM6IDIyOSAoZTUpICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19TQVQsIDB4MDAsIDB4ZTgpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfSFVFLCAweDAwLCAwKTsKKworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVUdBSU4sIDB4MDAsIDIzOCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19WR0FJTiwgMHgwMCwgMHgwMCk7CisKKwkJCS8qVU9GRjoweDMwLCBWT0ZGOjB4MzAsIFRTVENHTj0xICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19VVk9GRkgsIDB4MDAsIDB4NGYpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfVVZPRkZMLCAweDAwLCAweDAwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgREVDT0RFUl9TRVRfSU5QVVQ6ICIKKwkJCQkiVW5rbm93biBpbnB1dCAlZFxuIiwgKmlhcmcpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBoYWNrOiBDRE1MUEYgc29tZXRpbWVzIHNwb250YW5lb3VzbHkgc3dpdGNoZXMgb247ICovCisJCS8qIGZvcmNlIGJhY2sgb2ZmICovCisJCWtzMDEyN193cml0ZShrcywgS1NfREVNT0QsIHJlZ19kZWZhdWx0c1tLU19ERU1PRF0pOworCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfT1VUUFVUOgorCQlzd2l0Y2goKmlhcmcpIHsKKwkJY2FzZSBLU19PVVRQVVRfWVVWNjU2RToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX1NFVF9PVVRQVVQ6ICIKKwkJCQkiT1VUUFVUX1lVVjY1NkUgKE1pc3NpbmcpXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBLU19PVVRQVVRfRVhWOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX09VVFBVVDogIgorCQkJCSJPVVRQVVRfRVhWXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX09GTVRBLCAweGYwLCAweDA5KTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBERUNPREVSX1NFVF9OT1JNOiAvL3NhbSBUaGlzIGJsb2NrIG1peGVzIG9sZCBhbmQgbmV3IG5vcm0gbmFtZXMuLi4KKwkJLyogU2V0IHRvIGF1dG9tYXRpYyBTRUNBTS9Gc2MgbW9kZSAqLworCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwMCk7CisKKwkJa3MtPm5vcm0gPSAqaWFyZzsKKwkJc3dpdGNoKCppYXJnKQorCQl7CisJCS8qIHRoaXMgaXMgdW50ZXN0ZWQgISEgKi8KKwkJLyogSXQganVzdCBkZXRlY3RzIFBBTF9OL05UU0NfTSAobm8gc3BlY2lhbCBmcmVxdWVuY2llcykgKi8KKwkJLyogQW5kIHlvdSBoYXZlIHRvIHNldCB0aGUgc3RhbmRhcmQgYSBzZWNvbmQgdGltZSBhZnRlcndhcmRzICovCisJCWNhc2UgVklERU9fTU9ERV9BVVRPOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06IEFVVE9cbiIpOworCisJCQkvKiBUaGUgY2hpcCBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgKi8KKwkJCS8qIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpZWxkIHJhdGUgKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NNREEsICAgMHhmYywgMHgwMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DSFJPTUEsIDB4OWYsIDB4MjApOworCQkJLyogVGhpcyBpcyB3cm9uZyBmb3IgUEFMICEgQXMgSSBzYWlkLCAqLworCQkJLyogeW91IG5lZWQgdG8gc2V0IHRoZSBzdGFuZGFyZCBvbmNlIGFnYWluICEhICovCisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI0MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfTlRTQzoKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX1NFVF9OT1JNOiBOVFNDX01cbiIpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01BLCAweDlmLCAweDIwKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjQwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKwkJCWJyZWFrOworCisJCWNhc2UgS1NfU1REX05UU0NfTjoKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIk5UU0NfTiAoZml4bWUpXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHg5ZiwgMHg0MCk7CisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI0MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIFZJREVPX01PREVfUEFMOgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06IFBBTF9OXG4iKTsKKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHg5ZiwgMHgyMCk7CisJCQlrcy0+Zm9ybWF0X2hlaWdodCA9IDI5MDsKKwkJCWtzLT5mb3JtYXRfd2lkdGggPSA3MDQ7CisJCQlicmVhazsKKworCQljYXNlIEtTX1NURF9QQUxfTToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIlBBTF9NIChmaXhtZSlcbiIpOworCQkJa3MwMTI3X2FuZF9vcihrcywgS1NfQ0hST01BLCAweDlmLCAweDQwKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjkwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKwkJCWJyZWFrOworCisJCWNhc2UgVklERU9fTU9ERV9TRUNBTToKKwkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBLUzAxMjdfU0VUX1NUQU5EQVJEOiAiCisJCQkJIlNFQ0FNXG4iKTsKKwkJCWtzLT5mb3JtYXRfaGVpZ2h0ID0gMjkwOworCQkJa3MtPmZvcm1hdF93aWR0aCA9IDcwNDsKKworCQkJLyogc2V0IHRvIHNlY2FtIGF1dG9kZXRlY3Rpb24gKi8KKwkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NIUk9NQSwgMHhkZiwgMHgyMCk7CisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwMCk7CisJCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoSFovMTArMSk7CisKKwkJCS8qIGRpZCBpdCBhdXRvZGV0ZWN0PyAqLworCQkJaWYgKGtzMDEyN19yZWFkKGtzLCBLU19ERU1PRCkgJiAweDQwKQorCQkJCWJyZWFrOworCisJCQkvKiBmb3JjZSB0byBzZWNhbSBtb2RlICovCisJCQlrczAxMjdfYW5kX29yKGtzLCBLU19ERU1PRCwgMHhmMCwgMHgwZik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX05PUk06ICIKKwkJCQkiVW5rbm93biBub3JtICVkXG4iLCAqaWFyZyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgREVDT0RFUl9TRVRfUElDVFVSRToKKwkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIERFQ09ERVJfU0VUX1BJQ1RVUkUgIgorCQkJIm5vdCB5ZXQgc3VwcG9ydGVkIChmaXhtZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKworCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfQlJJR0hUTkVTUzogTWVyZ2UgaW50byBERUNPREVSX1NFVF9QSUNUVVJFCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9DT05UUkFTVDogTWVyZ2UgaW50byBERUNPREVSX1NFVF9QSUNUVVJFCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9IVUU6IE1lcmdlIGludG8gREVDT0RFUl9TRVRfUElDVFVSRT8KKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1NBVFVSQVRJT046IE1lcmdlIGludG8gREVDT0RFUl9TRVRfUElDVFVSRQorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfQUdDX01PREU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9BR0M6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9DSFJPTUFfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1BJWENMS19NT0RFOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfR0FNTUFfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1VHQUlOOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfVkdBSU46CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFk6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9JTlZBTFY6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVk6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVU6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9VTlVTRVY6CisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9WU0FMSUdOX01PREU6CisKKwljYXNlIERFQ09ERVJfRU5BQkxFX09VVFBVVDoKKwl7CisKKwkJaW50ICppYXJnID0gYXJnOworCQlpbnQgZW5hYmxlID0gKCppYXJnICE9IDApOworCQkJaWYgKGVuYWJsZSkgeworCQkJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCAiCisJCQkJCSJERUNPREVSX0VOQUJMRV9PVVRQVVQgb24gIgorCQkJCQkiKCVkKVxuIiwgZW5hYmxlKTsKKwkJCQkvKiBBbGwgb3V0cHV0IHBpbnMgb24gKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19PRk1UQSwgMHhjZiwgMHgzMCk7CisJCQkJLyogT2JleSB0aGUgT0VOIHBpbiAqLworCQkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX0NERU0sIDB4N2YsIDB4MDApOworCQkJfSBlbHNlIHsKKwkJCQlkcHJpbnRrKCJrczAxMjc6IGNvbW1hbmQgIgorCQkJCQkiREVDT0RFUl9FTkFCTEVfT1VUUFVUIG9mZiAiCisJCQkJCSIoJWQpXG4iLCBlbmFibGUpOworCQkJCS8qIFZpZGVvIG91dHB1dCBwaW5zIG9mZiAqLworCQkJCWtzMDEyN19hbmRfb3Ioa3MsIEtTX09GTVRBLCAweGNmLCAweDAwKTsKKwkJCQkvKiBJZ25vcmUgdGhlIE9FTiBwaW4gKi8KKwkJCQlrczAxMjdfYW5kX29yKGtzLCBLU19DREVNLCAweDdmLCAweDgwKTsKKwkJCX0KKwl9CisJCWJyZWFrOworCisJLy9zYW0gdG9kbzogS1MwMTI3X1NFVF9PVVRQVVRfTU9ERToKKwkvL3NhbSB0b2RvOiBLUzAxMjdfU0VUX1dJRFRIOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfSEVJR0hUOgorCS8vc2FtIHRvZG86IEtTMDEyN19TRVRfSFNDQUxFOgorCisJY2FzZSBERUNPREVSX0dFVF9TVEFUVVM6CisJCWRwcmludGsoImtzMDEyNzogY29tbWFuZCBERUNPREVSX0dFVF9TVEFUVVNcbiIpOworCQkqaWFyZyA9IDA7CisJCXN0YXR1cyA9IGtzMDEyN19yZWFkKGtzLCBLU19TVEFUKTsKKwkJaWYgKCEoc3RhdHVzICYgMHgyMCkpCQkgLyogTk9WSUQgbm90IHNldCAqLworCQkJKmlhcmcgPSAoKmlhcmcgJiBERUNPREVSX1NUQVRVU19HT09EKTsKKwkJaWYgKChzdGF0dXMgJiAweDAxKSkJCSAgICAgIC8qIENMT0NLIHNldCAqLworCQkJKmlhcmcgPSAoKmlhcmcgJiBERUNPREVSX1NUQVRVU19DT0xPUik7CisJCWlmICgoc3RhdHVzICYgMHgwOCkpCQkgICAvKiBQQUxERVQgc2V0ICovCisJCQkqaWFyZyA9ICgqaWFyZyAmIERFQ09ERVJfU1RBVFVTX1BBTCk7CisJCWVsc2UKKwkJCSppYXJnID0gKCppYXJnICYgREVDT0RFUl9TVEFUVVNfTlRTQyk7CisJCWJyZWFrOworCisJLy9DYXRjaCBhbnkgdW5rbm93biBjb21tYW5kCisJZGVmYXVsdDoKKwkJZHByaW50aygia3MwMTI3OiBjb21tYW5kIHVua25vd246ICUwNFhcbiIsIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworCisKKworc3RhdGljIGludCBrczAxMjdfcHJvYmUoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQga3MwMTI3X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KTsKK3N0YXRpYyBpbnQga3MwMTI3X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKKworCisKKy8qIEFkZHJlc3NlcyB0byBzY2FuICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0ge0kyQ19LUzAxMjdfQURET04+PjEsCisJCQkJICAgICAgIEkyQ19LUzAxMjdfT05CT0FSRD4+MSwgSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHVuc2lnbmVkIHNob3J0IHByb2JlWzJdID0Je0kyQ19DTElFTlRfRU5ELCBJMkNfQ0xJRU5UX0VORH07CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaWdub3JlWzJdID0gCXtJMkNfQ0xJRU5UX0VORCwgSTJDX0NMSUVOVF9FTkR9Oworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50X2FkZHJlc3NfZGF0YSBhZGRyX2RhdGEgPSB7CisJbm9ybWFsX2kyYywKKwlwcm9iZSwKKwlpZ25vcmUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlcl9rczAxMjcgPSB7CisJLmRyaXZlci5uYW1lID0gImtzMDEyNyIsCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX0tTMDEyNywKKwkuYXR0YWNoX2FkYXB0ZXIgPSBrczAxMjdfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0ga3MwMTI3X2RldGFjaCwKKwkuY29tbWFuZCAgICAgICAgPSBrczAxMjdfY29tbWFuZAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGtzMDEyN19jbGllbnRfdG1wbCA9Cit7CisJLm5hbWUgPSAiKGtzMDEyNyB1bnNldCkiLAorCS5hZGRyID0gMCwKKwkuYWRhcHRlciA9IE5VTEwsCisJLmRyaXZlciA9ICZpMmNfZHJpdmVyX2tzMDEyNywKKwkudXNhZ2VfY291bnQgPSAwCit9OworCitzdGF0aWMgaW50IGtzMDEyN19mb3VuZF9wcm9jKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBrczAxMjcgKmtzOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZigqY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNsaWVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoY2xpZW50LCAma3MwMTI3X2NsaWVudF90bXBsLCBzaXplb2YoKmNsaWVudCkpOworCisJa3MgPSBremFsbG9jKHNpemVvZigqa3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoa3MgPT0gTlVMTCkgeworCQlrZnJlZShjbGllbnQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBrcyk7CisJY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwljbGllbnQtPmFkZHIgPSBhZGRyOworCXNwcmludGYoY2xpZW50LT5uYW1lLCAia3MwMTI3LSUwMngiLCBhZGFwdGVyLT5pZCk7CisKKwlrcy0+Y2xpZW50ID0gY2xpZW50OworCWtzLT5hZGRyID0gYWRkcjsKKwlrcy0+a3NfdHlwZSA9IEtTX1RZUEVfVU5LTk9XTjsKKworCS8qIHBvd2VyIHVwICovCisJa3MwMTI3X3dyaXRlKGtzLCBLU19DTURBLCAweDJjKTsKKwltZGVsYXkoMTApOworCisJLyogcmVzZXQgdGhlIGRldmljZSAqLworCWtzMDEyN19yZXNldChrcyk7CisJcHJpbnRrKEtFUk5fSU5GTyAia3MwMTI3OiBhdHRhY2g6ICVzIHZpZGVvIGRlY29kZXJcbiIsCisJICAgICAgIGtzLT5hZGRyPT0oSTJDX0tTMDEyN19BRERPTj4+MSkgPyAiYWRkb24iIDogIm9uLWJvYXJkIik7CisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQga3MwMTI3X3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+aWQgPT0gSTJDX0hXX0JfWlIzNjA2NykKKwkJcmV0dXJuIGkyY19wcm9iZShhZGFwdGVyLCAmYWRkcl9kYXRhLCBrczAxMjdfZm91bmRfcHJvYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3MwMTI3X2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBrczAxMjcgKmtzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlrczAxMjdfd3JpdGUoa3MsIEtTX09GTVRBLCAweDIwKTsgLyp0cmlzdGF0ZSovCisJa3MwMTI3X3dyaXRlKGtzLCBLU19DTURBLCAweDJjIHwgMHg4MCk7IC8qIHBvd2VyIGRvd24gKi8KKworCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoa3MpOworCWtmcmVlKGNsaWVudCk7CisKKwlkcHJpbnRrKCJrczAxMjc6IGRldGFjaFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBfX2RldmluaXQga3MwMTI3X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW5pdF9yZWdfZGVmYXVsdHMoKTsKKwlpMmNfYWRkX2RyaXZlcigmaTJjX2RyaXZlcl9rczAxMjcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQga3MwMTI3X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmkyY19kcml2ZXJfa3MwMTI3KTsKK30KKworCittb2R1bGVfaW5pdChrczAxMjdfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoa3MwMTI3X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8va3MwMTI3LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzU3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2tzMDEyNy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBWaWRlbyBDYXB0dXJlIERyaXZlciAoIFZpZGVvIGZvciBMaW51eCAxLzIgKQorICogZm9yIHRoZSBNYXRyb3ggTWFydmVsIEcyMDAsRzQwMCBhbmQgUmFpbmJvdyBSdW5uZXItRyBzZXJpZXMKKyAqCisgKiBUaGlzIG1vZHVsZSBpcyBhbiBpbnRlcmZhY2UgdG8gdGhlIEtTMDEyNyB2aWRlbyBkZWNvZGVyIGNoaXAuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBSeWFuIERyYWtlIDxzdGlsZXR0b0BtZWRpYW9uZS5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBLUzAxMjdfSAorI2RlZmluZSBLUzAxMjdfSAorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKworLyogaW5wdXQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgS1NfSU5QVVRfQ09NUE9TSVRFXzEgICAgMAorI2RlZmluZSBLU19JTlBVVF9DT01QT1NJVEVfMiAgICAxCisjZGVmaW5lIEtTX0lOUFVUX0NPTVBPU0lURV8zICAgIDIKKyNkZWZpbmUgS1NfSU5QVVRfQ09NUE9TSVRFXzQgICAgNAorI2RlZmluZSBLU19JTlBVVF9DT01QT1NJVEVfNSAgICA1CisjZGVmaW5lIEtTX0lOUFVUX0NPTVBPU0lURV82ICAgIDYKKworI2RlZmluZSBLU19JTlBVVF9TVklERU9fMSAgICAgICA4CisjZGVmaW5lIEtTX0lOUFVUX1NWSURFT18yICAgICAgIDkKKyNkZWZpbmUgS1NfSU5QVVRfU1ZJREVPXzMgICAgICAgMTAKKworI2RlZmluZSBLU19JTlBVVF9ZVVY2NTYJCTE1CisjZGVmaW5lIEtTX0lOUFVUX0NPVU5UICAgICAgICAgIDEwCisKKy8qIG91dHB1dCBjaGFubmVscyAqLworI2RlZmluZSBLU19PVVRQVVRfWVVWNjU2RSAgICAgICAwCisjZGVmaW5lIEtTX09VVFBVVF9FWFYgICAgICAgICAgIDEKKworLyogdmlkZW8gc3RhbmRhcmRzICovCisjZGVmaW5lIEtTX1NURF9OVFNDX04gICAgICAgICAgIDExMiAgICAgICAvKiA1MCBIeiBOVFNDICovCisjZGVmaW5lIEtTX1NURF9QQUxfTSAgICAgICAgICAgIDExMyAgICAgICAvKiA2MCBIeiBQQUwgICovCisKKyNlbmRpZiAvKiBLUzAxMjdfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21leWUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCmluZGV4IDg1MGJlZTkuLmY2OGNhN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWV5ZS5jCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTE2ODIsMTMgKzE2ODMsMTMgQEAKIAogc3RhdGljIHZvaWQgbWV5ZV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCWludCBpZHggPSAoaW50KXZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCWxvbmcgaWR4ID0gKGxvbmcpdm1hLT52bV9wcml2YXRlX2RhdGE7CiAJbWV5ZS52bWFfdXNlX2NvdW50W2lkeF0rKzsKIH0KIAogc3RhdGljIHZvaWQgbWV5ZV92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKLQlpbnQgaWR4ID0gKGludCl2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlsb25nIGlkeCA9IChsb25nKXZtYS0+dm1fcHJpdmF0ZV9kYXRhOwogCW1leWUudm1hX3VzZV9jb3VudFtpZHhdLS07CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXNwMzQwMC1kcml2ZXIuYwppbmRleCBiODA2OTk5Li5kYmI3NWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWRyaXZlci5jCkBAIC0zODUsNjcgKzM4NSw2IEBACiAJcmV0dXJuIFY0TDJfVFVORVJfTU9ERV9NT05POwogfQogCi1zdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIG1zcF9xY3RybF9zdGRbXSA9IHsKLQl7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fVk9MVU1FLAotCQkubmFtZSAgICAgICAgICA9ICJWb2x1bWUiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gNjU1MzUsCi0JCS5zdGVwICAgICAgICAgID0gNjU1MzUvMTAwLAotCQkuZGVmYXVsdF92YWx1ZSA9IDU4ODgwLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAotCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSAxLAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBtc3BfcWN0cmxfc291bmRfcHJvY2Vzc2luZ1tdID0gewotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19CQUxBTkNFLAotCQkubmFtZSAgICAgICAgICA9ICJCYWxhbmNlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDY1NTM1LAotCQkuc3RlcCAgICAgICAgICA9IDY1NTM1LzEwMCwKLQkJLmRlZmF1bHRfdmFsdWUgPSAzMjc2OCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JfSx7Ci0JCS5pZCAgICAgICAgICAgID0gVjRMMl9DSURfQVVESU9fQkFTUywKLQkJLm5hbWUgICAgICAgICAgPSAiQmFzcyIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19UUkVCTEUsCi0JCS5uYW1lICAgICAgICAgID0gIlRyZWJsZSIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSA2NTUzNSwKLQkJLnN0ZXAgICAgICAgICAgPSA2NTUzNS8xMDAsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMzI3NjgsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQl9LHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19MT1VETkVTUywKLQkJLm5hbWUgICAgICAgICAgPSAiTG91ZG5lc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMSwKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDEsCi0JCS5mbGFncyAgICAgICAgID0gMCwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCX0sCi19OwotCi0KIHN0YXRpYyBpbnQgbXNwX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7CiAJc3RydWN0IG1zcF9zdGF0ZSAqc3RhdGUgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKQEAgLTY3NCwyMiArNjEzLDMxIEBACiAJCWludCBzYzFfb3V0ID0gcnQtPm91dHB1dCAmIDB4ZjsKIAkJaW50IHNjMl9vdXQgPSAocnQtPm91dHB1dCA+PiA0KSAmIDB4ZjsKIAkJdTE2IHZhbCwgcmVnOworCQlpbnQgaTsKKwkJaW50IGV4dGVybl9pbnB1dCA9IDE7CiAKIAkJaWYgKHN0YXRlLT5yb3V0aW5nLmlucHV0ID09IHJ0LT5pbnB1dCAmJgogCQkgICAgc3RhdGUtPnJvdXRpbmcub3V0cHV0ID09IHJ0LT5vdXRwdXQpCiAJCQlicmVhazsKIAkJc3RhdGUtPnJvdXRpbmcgPSAqcnQ7CisJCS8qIGNoZWNrIGlmIHRoZSB0dW5lciBpbnB1dCBpcyB1c2VkICovCisJCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJCWlmICgoKHJ0LT5pbnB1dCA+PiAoNCArIGkgKiA0KSkgJiAweGYpID09IDApCisJCQkJZXh0ZXJuX2lucHV0ID0gMDsKKwkJfQorCQlpZiAoZXh0ZXJuX2lucHV0KQorCQkJc3RhdGUtPm1vZGUgPSBNU1BfTU9ERV9FWFRFUk47CisJCWVsc2UKKwkJCXN0YXRlLT5tb2RlID0gTVNQX01PREVfQU1fREVURUNUOwogCQltc3Bfc2V0X3NjYXJ0KGNsaWVudCwgc2NfaW4sIDApOwogCQltc3Bfc2V0X3NjYXJ0KGNsaWVudCwgc2MxX291dCwgMSk7CiAJCW1zcF9zZXRfc2NhcnQoY2xpZW50LCBzYzJfb3V0LCAyKTsKIAkJbXNwX3NldF9hdWRtb2RlKGNsaWVudCk7CiAJCXJlZyA9IChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9BVVRPU0VMRUNUKSA/IDB4MzAgOiAweGJiOwogCQl2YWwgPSBtc3BfcmVhZF9kZW0oY2xpZW50LCByZWcpOwotCQlpZiAodHVuZXIgIT0gKCh2YWwgPj4gOCkgJiAxKSkgewotCQkJbXNwX3dyaXRlX2RlbShjbGllbnQsIHJlZywgKHZhbCAmIH4weDEwMCkgfCAodHVuZXIgPDwgOCkpOwotCQkJLyogd2FrZSB0aHJlYWQgd2hlbiBhIG5ldyB0dW5lciBpbnB1dCBpcyBjaG9zZW4gKi8KLQkJCW1zcF93YWtlX3RocmVhZChjbGllbnQpOwotCQl9CisJCW1zcF93cml0ZV9kZW0oY2xpZW50LCByZWcsICh2YWwgJiB+MHgxMDApIHwgKHR1bmVyIDw8IDgpKTsKKwkJLyogd2FrZSB0aHJlYWQgd2hlbiBhIG5ldyBpbnB1dCBpcyBjaG9zZW4gKi8KKwkJbXNwX3dha2VfdGhyZWFkKGNsaWVudCk7CiAJCWJyZWFrOwogCX0KIApAQCAtNzQ0LDIxICs2OTIsMjUgQEAKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAJewogCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjID0gYXJnOwotCQlpbnQgaTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3BfcWN0cmxfc3RkKTsgaSsrKQotCQkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gbXNwX3FjdHJsX3N0ZFtpXS5pZCkgewotCQkJCW1lbWNweShxYywgJm1zcF9xY3RybF9zdGRbaV0sIHNpemVvZigqcWMpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCQkJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQocWMpOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJfQogCQlpZiAoIXN0YXRlLT5oYXNfc291bmRfcHJvY2Vzc2luZykKIAkJCXJldHVybiAtRUlOVkFMOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtc3BfcWN0cmxfc291bmRfcHJvY2Vzc2luZyk7IGkrKykKLQkJCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IG1zcF9xY3RybF9zb3VuZF9wcm9jZXNzaW5nW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmbXNwX3FjdHJsX3NvdW5kX3Byb2Nlc3NpbmdbaV0sIHNpemVvZigqcWMpKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJcmV0dXJuIC1FSU5WQUw7CisJCXN3aXRjaCAocWMtPmlkKSB7CisJCQljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCQkJY2FzZSBWNEwyX0NJRF9BVURJT19UUkVCTEU6CisJCQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsX3N0ZChxYyk7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CiAJfQogCiAJY2FzZSBWSURJT0NfR19DVFJMOgpAQCAtNzk0LDcgKzc0Niw5IEBACiAJCWNhc2UgTVNQX01PREVfRVhURVJOOiBwID0gIkV4dGVybmFsIGlucHV0IjsgYnJlYWs7CiAJCWRlZmF1bHQ6IHAgPSAidW5rbm93biI7IGJyZWFrOwogCQl9Ci0JCWlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9NQU5VQUwpIHsKKwkJaWYgKHN0YXRlLT5tb2RlID09IE1TUF9NT0RFX0VYVEVSTikgeworCQkJdjRsX2luZm8oY2xpZW50LCAiTW9kZTogICAgICVzXG4iLCBwKTsKKwkJfSBlbHNlIGlmIChzdGF0ZS0+b3Btb2RlID09IE9QTU9ERV9NQU5VQUwpIHsKIAkJCXY0bF9pbmZvKGNsaWVudCwgIk1vZGU6ICAgICAlcyAoJXMlcylcbiIsIHAsCiAJCQkJKHN0YXRlLT5yeHN1YmNoYW5zICYgVjRMMl9UVU5FUl9TVUJfU1RFUkVPKSA/ICJzdGVyZW8iIDogIm1vbm8iLAogCQkJCShzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSA/ICIsIGR1YWwiIDogIiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tc3AzNDAwLWt0aHJlYWRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwppbmRleCA2MzNhMTAyLi5mMmZkOTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21zcDM0MDAta3RocmVhZHMuYwpAQCAtMjQ0LDE5ICsyNDQsMjEgQEAKIAkgICB0aGUgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBTQVAuIFNvIHRoZSByeHN1YmNoYW5zIGNvbWJpbmF0aW9uCiAJICAgb2YgU1RFUkVPIHwgTEFORzIgZG9lcyBub3Qgb2NjdXIuICovCiAKLQkvKiBzd2l0Y2ggdG8gbW9ubyBpZiBvbmx5IG1vbm8gaXMgYXZhaWxhYmxlICovCi0JaWYgKHN0YXRlLT5yeHN1YmNoYW5zID09IFY0TDJfVFVORVJfU1VCX01PTk8pCi0JCWF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTU9OTzsKLQkvKiBpZiBiaWxpbmd1YWwgKi8KLQllbHNlIGlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSB7Ci0JCS8qIGFuZCBtb25vIG9yIHN0ZXJlbywgdGhlbiBmYWxsYmFjayB0byBsYW5nMSAqLwotCQlpZiAoYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTyB8fAotCQkgICAgYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQotCQkJYXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9MQU5HMTsKKwlpZiAoc3RhdGUtPm1vZGUgIT0gTVNQX01PREVfRVhURVJOKSB7CisJCS8qIHN3aXRjaCB0byBtb25vIGlmIG9ubHkgbW9ubyBpcyBhdmFpbGFibGUgKi8KKwkJaWYgKHN0YXRlLT5yeHN1YmNoYW5zID09IFY0TDJfVFVORVJfU1VCX01PTk8pCisJCQlhdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX01PTk87CisJCS8qIGlmIGJpbGluZ3VhbCAqLworCQllbHNlIGlmIChzdGF0ZS0+cnhzdWJjaGFucyAmIFY0TDJfVFVORVJfU1VCX0xBTkcyKSB7CisJCQkvKiBhbmQgbW9ubyBvciBzdGVyZW8sIHRoZW4gZmFsbGJhY2sgdG8gbGFuZzEgKi8KKwkJCWlmIChhdWRtb2RlID09IFY0TDJfVFVORVJfTU9ERV9NT05PIHx8CisJCQkgICAgYXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfU1RFUkVPKQorCQkJCWF1ZG1vZGUgPSBWNEwyX1RVTkVSX01PREVfTEFORzE7CisJCX0KKwkJLyogaWYgc3RlcmVvLCBhbmQgYXVkbW9kZSBpcyBub3QgbW9ubywgdGhlbiBzd2l0Y2ggdG8gc3RlcmVvICovCisJCWVsc2UgaWYgKGF1ZG1vZGUgIT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJCQlhdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAl9Ci0JLyogaWYgc3RlcmVvLCBhbmQgYXVkbW9kZSBpcyBub3QgbW9ubywgdGhlbiBzd2l0Y2ggdG8gc3RlcmVvICovCi0JZWxzZSBpZiAoYXVkbW9kZSAhPSBWNEwyX1RVTkVSX01PREVfTU9OTykKLQkJYXVkbW9kZSA9IFY0TDJfVFVORVJfTU9ERV9TVEVSRU87CiAKIAkvKiBzd2l0Y2ggZGVtb2R1bGF0b3IgKi8KIAlzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CkBAIC00ODEsNiArNDgzLDcgQEAKIAkJCS8qIG5vIGNhcnJpZXIgc2NhbiwganVzdCB1bm11dGUgKi8KIAkJCXY0bF9kYmcoMSwgbXNwX2RlYnVnLCBjbGllbnQsICJ0aHJlYWQ6IG5vIGNhcnJpZXIgc2NhblxuIik7CiAJCQlzdGF0ZS0+c2Nhbl9pbl9wcm9ncmVzcyA9IDA7CisJCQlzdGF0ZS0+cnhzdWJjaGFucyA9IFY0TDJfVFVORVJfU1VCX1NURVJFTzsKIAkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC05NDcsNiArOTUwLDE0IEBACiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAorCQlpZiAoc3RhdGUtPm1vZGUgPT0gTVNQX01PREVfRVhURVJOKSB7CisJCQkvKiBubyBjYXJyaWVyIHNjYW4gbmVlZGVkLCBqdXN0IHVubXV0ZSAqLworCQkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgInRocmVhZDogbm8gY2FycmllciBzY2FuXG4iKTsKKwkJCXN0YXRlLT5zY2FuX2luX3Byb2dyZXNzID0gMDsKKwkJCW1zcF9zZXRfYXVkaW8oY2xpZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJLyogc2V0dXAgdGhlIGNoaXAqLwogCQltc3AzNHh4Z19yZXNldChjbGllbnQpOwogCQlzdGF0ZS0+c3RkID0gc3RhdGUtPnJhZGlvID8gMHg0MCA6IG1zcF9zdGFuZGFyZDsKQEAgLTk3OCw2ICs5ODksMTEgQEAKIAkJdjRsX2RiZygxLCBtc3BfZGVidWcsIGNsaWVudCwgImRldGVjdGVkIHN0YW5kYXJkOiAlcyAoMHglMDR4KVxuIiwKIAkJCW1zcF9zdGFuZGFyZF9zdGRfbmFtZShzdGF0ZS0+c3RkKSwgc3RhdGUtPnN0ZCk7CiAKKwkJaWYgKHN0YXRlLT5zdGQgPT0gOSkgeworCQkJLyogQU0gTklDQU0gbW9kZSAqLworCQkJbXNwX3dyaXRlX2RzcChjbGllbnQsIDB4MGUsIDB4N2MwMCk7CisJCX0KKwogCQkvKiB1bm11dGU6IGRpc3BhdGNoIHNvdW5kIHRvIHNjYXJ0IG91dHB1dCwgc2V0IHNjYXJ0IHZvbHVtZSAqLwogCQltc3Bfc2V0X2F1ZGlvKGNsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuYwppbmRleCBmZGM4ZTNmLi5hOTg4ZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5jCkBAIC0zMjM5LDcgKzMyMzksNyBAQAogCQlSRVNUUklDVF9UT19SQU5HRShmcmFtZS0+Ynl0ZXNfcmVjdmQsIDgsIG1heF9yYXcpOwogCiAJCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0JICAgIAkJaW50IG5leHRmOworCQkJaW50IG5leHRmOwogCiAJCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZnJhbWUtPndxKTsKQEAgLTM0MDUsNyArMzQwNSw3IEBACiAJUkVTVFJJQ1RfVE9fUkFOR0UoZnJhbWUtPmJ5dGVzX3JlY3ZkLCA4LCBtYXhfcmF3KTsKIAogCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNUQVRFX0xJTkVTKSB7Ci0gICAgCQlpbnQgbmV4dGY7CisJCWludCBuZXh0ZjsKIAogCQlmcmFtZS0+Z3JhYnN0YXRlID0gRlJBTUVfRE9ORTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZmcmFtZS0+d3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjUxMS5oCmluZGV4IDEyYjNkNTEuLjY4YjA4MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1MTEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NTExLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3BsYW5iLmMKaW5kZXggZDllM2NhZC4uMzQ4NGUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wbGFuYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcGxhbmIuYwpAQCAtNDAsNiArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCAwOTgzNWNhLi41ZDY4MWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTgwNCw3ICs4MDUsNyBAQAogCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7CiAJCQlpZighKChwLT5wYWxldHRlPT1WSURFT19QQUxFVFRFX1JHQjU2NSAmJiBwLT5kZXB0aD09MTYpCiAJCQkgICAgfHwocC0+cGFsZXR0ZT09VklERU9fUEFMRVRURV9SR0I1NTUgJiYgcC0+ZGVwdGg9PTE1KSkpCi0JCQkgICAgCXJldHVybiAtRUlOVkFMOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJcGQtPnBpY3R1cmU9ICpwOwogCiAJCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKaW5kZXggNTNjYmM5NS4uNjk3MTQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCSAgICogUGhpbGlwcyBQQ0E2NDUsIFBDQTY0NgogCSAgICogUGhpbGlwcyBQQ1ZDNjc1LCBQQ1ZDNjgwLCBQQ1ZDNjkwCiAJICAgKiBQaGlsaXBzIFBDVkM3MjAvNDAsIFBDVkM3MzAsIFBDVkM3NDAsIFBDVkM3NTAKKwkgICAqIFBoaWxpcHMgU1BDOTAwTkMKIAkgICAqIEFza2V5IFZDMDEwCiAJICAgKiBMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCwgNDAwMCwgJ1pvb20nLCAnTm90ZWJvb2sgUHJvJwogCSAgICAgYW5kICdPcmJpdCcvJ1NwaGVyZScKQEAgLTE5LDEwICsyMCwxOCBAQAogCSAgYW5kIG5ldmVyIHdpbGwgYmUsIGJ1dCB0aGUgNjY1IGFuZCA3MjAvMjAgYXJlIHN1cHBvcnRlZCBieSBvdGhlcgogCSAgZHJpdmVycy4KIAotCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vdXNiL3BoaWxpcHMudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQKLQkgIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisJICBTb21lIG5ld2VyIGxvZ2l0ZWNoIHdlYmNhbXMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgZHJpdmVyIGJ1dCBieSB0aGUKKwkgIFVzYiBWaWRlbyBDbGFzcyBkcml2ZXIgKGxpbnV4LXV2YykuCiAKIAkgIFRoZSBidWlsdC1pbiBtaWNyb3Bob25lIGlzIGVuYWJsZWQgYnkgc2VsZWN0aW5nIFVTQiBBdWRpbyBzdXBwb3J0LgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBwd2MuCisKK2NvbmZpZyBVU0JfUFdDX0RFQlVHCisJYm9vbCAiVVNCIFBoaWxpcHMgQ2FtZXJhcyB2ZXJib3NlIGRlYnVnIgorCWRlcGVuZHMgVVNCX1BXQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaW4gb3JkZXIgdG8gaGF2ZSB0aGUgcHdjIGRyaXZlciBnZW5lcmF0ZSB2ZXJib3NlIGRlYnVnZ2luZworCSAgbWVzc2FnZXMuCisJICBBIHNwZWNpYWwgbW9kdWxlIG9wdGlvbnMgJ3RyYWNlJyBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHZlcmJvc2l0eS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKaW5kZXggMzNkNjAxMi4uOWRiMjI2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvTWFrZWZpbGUKQEAgLTEsMyArMSwxMiBAQAotcHdjLW9ianMJOj0gcHdjLWlmLm8gcHdjLW1pc2MubyBwd2MtY3RybC5vIHB3Yy11bmNvbXByZXNzLm8gcHdjLXRpbW9uLm8gcHdjLWtpYXJhLm8KK3B3Yy1vYmpzCTo9IHB3Yy1pZi5vIHB3Yy1taXNjLm8gcHdjLWN0cmwubyBwd2MtdjRsLm8gcHdjLXVuY29tcHJlc3MubworcHdjLW9ianMJKz0gcHdjLWRlYzEubyBwd2MtZGVjMjMubyBwd2Mta2lhcmEubyBwd2MtdGltb24ubwogCiBvYmotJChDT05GSUdfVVNCX1BXQykgKz0gcHdjLm8KKworaWZlcSAoJChDT05GSUdfVVNCX1BXQ19ERUJVRykseSkKK0VYVFJBX0NGTEFHUyArPSAtRENPTkZJR19QV0NfREVCVUc9MQorZWxzZQorRVhUUkFfQ0ZMQUdTICs9IC1EQ09ORklHX1BXQ19ERUJVRz0wCitlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCmluZGV4IDRiYTU0OWIuLjBiZDExNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwpAQCAtMiw3ICsyLDcgQEAKICAgIEZ1bmN0aW9ucyB0aGF0IHNlbmQgdmFyaW91cyBjb250cm9sIG1lc3NhZ2VzIHRvIHRoZSB3ZWJjYW0sIGluY2x1ZGluZwogICAgdmlkZW8gbW9kZXMuCiAgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC00MSwxMiArNDEsMTQgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2VuZGlmCiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSAicHdjLmgiCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCiAjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKICNpbmNsdWRlICJwd2Mta2lhcmEuaCIKICNpbmNsdWRlICJwd2MtdGltb24uaCIKKyNpbmNsdWRlICJwd2MtZGVjMS5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgogCiAvKiBSZXF1ZXN0IHR5cGVzOiB2aWRlbyAqLwogI2RlZmluZSBTRVRfTFVNX0NUTAkJCTB4MDEKQEAgLTU3LDYgKzU5LDEwIEBACiAjZGVmaW5lIEdFVF9TVEFUVVNfQ1RMCQkJMHgwNgogI2RlZmluZSBTRVRfRVBfU1RSRUFNX0NUTAkJMHgwNwogI2RlZmluZSBHRVRfRVBfU1RSRUFNX0NUTAkJMHgwOAorI2RlZmluZSBHRVRfWFhfQ1RMCQkJMHgwOQorI2RlZmluZSBTRVRfWFhfQ1RMCQkJMHgwQQorI2RlZmluZSBHRVRfWFlfQ1RMCQkJMHgwQgorI2RlZmluZSBTRVRfWFlfQ1RMCQkJMHgwQwogI2RlZmluZSBTRVRfTVBUX0NUTAkJCTB4MEQKICNkZWZpbmUgR0VUX01QVF9DVEwJCQkweDBFCiAKQEAgLTkzLDEyICs5OSwyMCBAQAogI2RlZmluZSBSRUFEX1NIVVRURVJfRk9STUFUVEVSCQkJMHgwNjAwCiAjZGVmaW5lIFJFQURfUkVEX0dBSU5fRk9STUFUVEVSCQkJMHgwNzAwCiAjZGVmaW5lIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUgkJMHgwODAwCisjZGVmaW5lIEdFVF9TVEFUVVNfQjAwCQkJCTB4MEIwMAogI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIxCQkJMHgwQzAwCisjZGVmaW5lIEdFVF9TVEFUVVNfMzAwMAkJCQkweDMwMDAKICNkZWZpbmUgUkVBRF9SQVdfWV9NRUFOX0ZPUk1BVFRFUgkJMHgzMTAwCiAjZGVmaW5lIFNFVF9QT1dFUl9TQVZFX01PREVfRk9STUFUVEVSCQkweDMyMDAKICNkZWZpbmUgTUlSUk9SX0lNQUdFX0ZPUk1BVFRFUgkJCTB4MzMwMAogI2RlZmluZSBMRURfRk9STUFUVEVSCQkJCTB4MzQwMAorI2RlZmluZSBMT1dMSUdIVAkJCQkweDM1MDAKKyNkZWZpbmUgR0VUX1NUQVRVU18zNjAwCQkJCTB4MzYwMAogI2RlZmluZSBTRU5TT1JfVFlQRV9GT1JNQVRURVIyCQkJMHgzNzAwCisjZGVmaW5lIEdFVF9TVEFUVVNfMzgwMAkJCQkweDM4MDAKKyNkZWZpbmUgR0VUX1NUQVRVU180MDAwCQkJCTB4NDAwMAorI2RlZmluZSBHRVRfU1RBVFVTXzQxMDAJCQkJMHg0MTAwCS8qIEdldCAqLworI2RlZmluZSBDVExfU1RBVFVTXzQyMDAJCQkJMHg0MjAwCS8qIFtHU10gMSAqLwogCiAvKiBGb3JtYXR0ZXJzIGZvciB0aGUgVmlkZW8gRW5kcG9pbnQgY29udHJvbHMgW0dTXUVUX0VQX1NUUkVBTV9DVEwgKi8KICNkZWZpbmUgVklERU9fT1VUUFVUX0NPTlRST0xfRk9STUFUVEVSCQkweDAxMDAKQEAgLTEzOCw2ICsxNTIsNyBAQAogI2luY2x1ZGUgInB3Yy1uYWxhLmgiCiB9OwogCitzdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE1OSwzMSArMTc0LDcgQEAKIAkJJmJ1ZiwgYnVmbGVuLCA1MDApCiAKIAotI2lmIFBXQ19ERUJVRwotdm9pZCBwd2NfaGV4ZHVtcCh2b2lkICpwLCBpbnQgbGVuKQotewotCWludCBpOwotCXVuc2lnbmVkIGNoYXIgKnM7Ci0JY2hhciBidWZbMTAwXSwgKmQ7Ci0KLQlzID0gKHVuc2lnbmVkIGNoYXIgKilwOwotCWQgPSBidWY7Ci0JKmQgPSAnXDAnOwotCURlYnVnKCJEb2luZyBoZXhkdW1wIEAgJXAsICVkIGJ5dGVzLlxuIiwgcCwgbGVuKTsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJZCArPSBzcHJpbnRmKGQsICIlMDJYICIsICpzKyspOwotCQlpZiAoKGkgJiAweEYpID09IDB4RikgewotCQkJRGVidWcoIiVzXG4iLCBidWYpOwotCQkJZCA9IGJ1ZjsKLQkJCSpkID0gJ1wwJzsKLQkJfQotCX0KLQlpZiAoKGkgJiAweEYpICE9IDApCi0JCURlYnVnKCIlc1xuIiwgYnVmKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGludCBzZW5kX3ZpZGVvX2NvbW1hbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQorc3RhdGljIGludCBzZW5kX3ZpZGVvX2NvbW1hbmQoc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYsIGludCBpbmRleCwgdm9pZCAqYnVmLCBpbnQgYnVmbGVuKQogewogCXJldHVybiB1c2JfY29udHJvbF9tc2codWRldiwKIAkJdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApLApAQCAtMTk2LDcgKzE4Nyw3IEBACiAKIAogCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9OYWxhKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc2l6ZSwgaW50IGZyYW1lcykKK3N0YXRpYyBpbnQgc2V0X3ZpZGVvX21vZGVfTmFsYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbM107CiAJaW50IHJldCwgZnBzOwpAQCAtMjI5LDM0ICsyMjAsMTQgQEAKIAlpZiAocEVudHJ5LT5hbHRlcm5hdGUgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAocEVudHJ5LT5jb21wcmVzc2VkKQotCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KLQogCW1lbWNweShidWYsIHBFbnRyeS0+bW9kZSwgMyk7CiAJcmV0ID0gc2VuZF92aWRlb19jb21tYW5kKHBkZXYtPnVkZXYsIHBkZXYtPnZlbmRwb2ludCwgYnVmLCAzKTsKIAlpZiAocmV0IDwgMCkgewotCQlEZWJ1ZygiRmFpbGVkIHRvIHNlbmQgdmlkZW8gY29tbWFuZC4uLiAlZFxuIiwgcmV0KTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNlbmQgdmlkZW8gY29tbWFuZC4uLiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJaWYgKHBFbnRyeS0+Y29tcHJlc3NlZCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKLQkgewotCSAgIHN3aXRjaChwZGV2LT50eXBlKSB7Ci0JICAgICBjYXNlIDY0NToKLQkgICAgIGNhc2UgNjQ2OgotLyoJICAgICAgIHB3Y19kZWMxX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLwotCSAgICAgICBicmVhazsKLQotCSAgICAgY2FzZSA2NzU6Ci0JICAgICBjYXNlIDY4MDoKLQkgICAgIGNhc2UgNjkwOgotCSAgICAgY2FzZSA3MjA6Ci0JICAgICBjYXNlIDczMDoKLQkgICAgIGNhc2UgNzQwOgotCSAgICAgY2FzZSA3NTA6Ci0vKgkgICAgICAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLwotCSAgICAgICBicmVhazsKLQkgICB9Ci0JfQorCQlwd2NfZGVjMV9pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAzOwogCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDMpOwpAQCAtMjgzLDcgKzI1NCw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgc2V0X3ZpZGVvX21vZGVfVGltb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKK3N0YXRpYyBpbnQgc2V0X3ZpZGVvX21vZGVfVGltb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZlsxM107CiAJY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5ICpwQ2hvb3NlOwpAQCAtMzE1LDggKzI4Niw4IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLS8qIAlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+dnBhbGV0dGUgIT0gVklERU9fUEFMRVRURV9SQVcpCi0JICAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAxMzsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMyk7CkBAIC0zMzYsNyArMzA3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBzZXRfdmlkZW9fbW9kZV9LaWFyYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQorc3RhdGljIGludCBzZXRfdmlkZW9fbW9kZV9LaWFyYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHNpemUsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KQogewogCWNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSAqcENob29zZSA9IE5VTEw7CiAJaW50IGZwcywgcmV0OwpAQCAtMzUwLDIxICszMjEsMTQgQEAKIAlmcHMgPSAoZnJhbWVzIC8gNSkgLSAxOwogCiAJLyogc3BlY2lhbCBjYXNlOiBWR0EgQCA1IGZwcyBhbmQgc25hcHNob3QgaXMgcmF3IGJheWVyIG1vZGUgKi8KLQlpZiAoc2l6ZSA9PSBQU1pfVkdBICYmIGZyYW1lcyA9PSA1ICYmIHNuYXBzaG90KQorCWlmIChzaXplID09IFBTWl9WR0EgJiYgZnJhbWVzID09IDUgJiYgc25hcHNob3QgJiYgcGRldi0+dnBhbGV0dGUgPT0gVklERU9fUEFMRVRURV9SQVcpCiAJewogCQkvKiBPbmx5IGF2YWlsYWJsZSBpbiBjYXNlIHRoZSByYXcgcGFsZXR0ZSBpcyBzZWxlY3RlZCBvcgogCQkgICB3ZSBoYXZlIHRoZSBkZWNvbXByZXNzb3IgYXZhaWxhYmxlLiBUaGlzIG1vZGUgaXMKIAkJICAgb25seSBhdmFpbGFibGUgaW4gY29tcHJlc3NlZCBmb3JtCiAJCSovCi0JCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKLQkJewotCQkJSW5mbygiQ2hvb3NpbmcgVkdBLzUgQkFZRVIgbW9kZSAoJWQpLlxuIiwgcGRldi0+dnBhbGV0dGUpOwotCQkJcENob29zZSA9ICZSYXdFbnRyeTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCUluZm8oIlZHQS81IEJBWUVSIG1vZGUgX211c3RfIGhhdmUgYSBkZWNvbXByZXNzb3IgYXZhaWxhYmxlLCBvciB1c2UgUkFXIHBhbGV0dGUuXG4iKTsKLQkJfQorCQlQV0NfREVCVUdfU0laRSgiQ2hvb3NpbmcgVkdBLzUgQkFZRVIgbW9kZS5cbiIpOworCQlwQ2hvb3NlID0gJlJhd0VudHJ5OwogCX0KIAllbHNlCiAJewpAQCAtMzcyLDYgKzMzNiw3IEBACiAJCSAgIGlmIHRoZSBwcmVmZXJyZWQgcmF0aW8gaXMgbm90IGF2YWlsYWJsZS4KIAkJICAgU2tpcCB0aGlzIHN0ZXAgd2hlbiB1c2luZyBSQVcgbW9kZXMuCiAJCSovCisJCXNuYXBzaG90ID0gMDsKIAkJd2hpbGUgKGNvbXByZXNzaW9uIDw9IDMpIHsKIAkJCXBDaG9vc2UgPSAmS2lhcmFfdGFibGVbc2l6ZV1bZnBzXVtjb21wcmVzc2lvbl07CiAJCQlpZiAocENob29zZS0+YWx0ZXJuYXRlICE9IDApCkBAIC0zODIsNyArMzQ3LDcgQEAKIAlpZiAocENob29zZSA9PSBOVUxMIHx8IHBDaG9vc2UtPmFsdGVybmF0ZSA9PSAwKQogCQlyZXR1cm4gLUVOT0VOVDsgLyogTm90IHN1cHBvcnRlZC4gKi8KIAotCURlYnVnKCJVc2luZyBhbHRlcm5hdGUgc2V0dGluZyAlZC5cbiIsIHBDaG9vc2UtPmFsdGVybmF0ZSk7CisJUFdDX1RSQUNFKCJVc2luZyBhbHRlcm5hdGUgc2V0dGluZyAlZC5cbiIsIHBDaG9vc2UtPmFsdGVybmF0ZSk7CiAKIAkvKiB1c2JfY29udHJvbF9tc2cgd29uJ3QgdGFrZSBzdGF0aWNseSBhbGxvY2F0ZWQgYXJyYXlzIGFzIGFyZ3VtZW50Pz8gKi8KIAltZW1jcHkoYnVmLCBwQ2hvb3NlLT5tb2RlLCAxMik7CkBAIC0zOTQsOCArMzU5LDggQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotLyoJaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnZwYWxldHRlICE9IFZJREVPX1BBTEVUVEVfUkFXKQotCSAgcHdjX2RlYzIzX2luaXQocGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOyAqLworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT52cGFsZXR0ZSAhPSBWSURFT19QQUxFVFRFX1JBVykKKwkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKIAogCXBkZXYtPmNtZF9sZW4gPSAxMjsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMik7CkBAIC00MTAsNDkgKzM3NSwxMyBAQAogCQlwZGV2LT5mcmFtZV9zaXplID0gKHBkZXYtPnZiYW5kbGVuZ3RoICogcGRldi0+aW1hZ2UueSkgLyA0OwogCWVsc2UKIAkJcGRldi0+ZnJhbWVfc2l6ZSA9IChwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIDEyKSAvIDg7CisJUFdDX1RSQUNFKCJmcmFtZV9zaXplPSVkLCB2ZnJhbWVzPSVkLCB2c2l6ZT0lZCwgdnNuYXBzaG90PSVkLCB2YmFuZGxlbmd0aD0lZFxuIiwKKwkgICAgcGRldi0+ZnJhbWVfc2l6ZSxwZGV2LT52ZnJhbWVzLHBkZXYtPnZzaXplLHBkZXYtPnZzbmFwc2hvdCxwZGV2LT52YmFuZGxlbmd0aCk7CiAJcmV0dXJuIDA7CiB9CiAKIAogCi1zdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCBpLCBmYWN0b3IgPSAwLCBmaWxsZXIgPSAwOwotCi0JLyogZm9yIFBBTEVUVEVfWVVWNDIwUCAqLwotCXN3aXRjaChwZGV2LT52cGFsZXR0ZSkKLQl7Ci0JY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6Ci0JCWZhY3RvciA9IDY7Ci0JCWZpbGxlciA9IDEyODsKLQkJYnJlYWs7Ci0JY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJZmFjdG9yID0gNjsgLyogY2FuIGJlIHVuY29tcHJlc3NlZCBZVVY0MjBQICovCi0JCWZpbGxlciA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNldCBzaXplcyBpbiBieXRlcyAqLwotCXBkZXYtPmltYWdlLnNpemUgPSBwZGV2LT5pbWFnZS54ICogcGRldi0+aW1hZ2UueSAqIGZhY3RvciAvIDQ7Ci0JcGRldi0+dmlldy5zaXplICA9IHBkZXYtPnZpZXcueCAgKiBwZGV2LT52aWV3LnkgICogZmFjdG9yIC8gNDsKLQotCS8qIEFsaWduIG9mZnNldCwgb3IgeW91J2xsIGdldCBzb21lIHZlcnkgd2VpcmQgcmVzdWx0cyBpbgotCSAgIFlVVjQyMCBtb2RlLi4uIHggbXVzdCBiZSBtdWx0aXBsZSBvZiA0ICh0byBnZXQgdGhlIFkncyBpbgotCSAgIHBsYWNlKSwgYW5kIHkgZXZlbiAob3IgeW91J2xsIG1peHVwIFUgJiBWKS4gVGhpcyBpcyBsZXNzIG9mIGEKLQkgICBwcm9ibGVtIGZvciBZVVY0MjBQLgotCSAqLwotCXBkZXYtPm9mZnNldC54ID0gKChwZGV2LT52aWV3LnggLSBwZGV2LT5pbWFnZS54KSAvIDIpICYgMHhGRkZDOwotCXBkZXYtPm9mZnNldC55ID0gKChwZGV2LT52aWV3LnkgLSBwZGV2LT5pbWFnZS55KSAvIDIpICYgMHhGRkZFOwotCi0JLyogRmlsbCBidWZmZXJzIHdpdGggZ3JheSBvciBibGFjayAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKLQkJaWYgKHBkZXYtPmltYWdlX3B0cltpXSAhPSBOVUxMKQotCQkJbWVtc2V0KHBkZXYtPmltYWdlX3B0cltpXSwgZmlsbGVyLCBwZGV2LT52aWV3LnNpemUpOwotCX0KLX0KLQotCi0KIC8qKgogICAgQHBkZXY6IGRldmljZSBzdHJ1Y3R1cmUKICAgIEB3aWR0aDogdmlld3BvcnQgd2lkdGgKQEAgLTQ2NSw1MCArMzk0LDc4IEBACiB7CiAJaW50IHJldCwgc2l6ZTsKIAotCVRyYWNlKFRSQUNFX0ZMT1csICJzZXRfdmlkZW9fbW9kZSglZHglZCBAICVkLCBwYWxldHRlICVkKS5cbiIsIHdpZHRoLCBoZWlnaHQsIGZyYW1lcywgcGRldi0+dnBhbGV0dGUpOworCVBXQ19ERUJVR19GTE9XKCJzZXRfdmlkZW9fbW9kZSglZHglZCBAICVkLCBwYWxldHRlICVkKS5cbiIsIHdpZHRoLCBoZWlnaHQsIGZyYW1lcywgcGRldi0+dnBhbGV0dGUpOwogCXNpemUgPSBwd2NfZGVjb2RlX3NpemUocGRldiwgd2lkdGgsIGhlaWdodCk7CiAJaWYgKHNpemUgPCAwKSB7Ci0JCURlYnVnKCJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBzaXplLlxuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoIkNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIHNpemUuXG4iKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQotCURlYnVnKCJkZWNvZGVfc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CisJUFdDX1RSQUNFKCJkZWNvZGVfc2l6ZSA9ICVkLlxuIiwgc2l6ZSk7CiAKLQlyZXQgPSAtRUlOVkFMOwotCXN3aXRjaChwZGV2LT50eXBlKSB7Ci0JY2FzZSA2NDU6Ci0JY2FzZSA2NDY6CisJaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKSB7CiAJCXJldCA9IHNldF92aWRlb19tb2RlX05hbGEocGRldiwgc2l6ZSwgZnJhbWVzKTsKLQkJYnJlYWs7CiAKLQljYXNlIDY3NToKLQljYXNlIDY4MDoKLQljYXNlIDY5MDoKLQkJcmV0ID0gc2V0X3ZpZGVvX21vZGVfVGltb24ocGRldiwgc2l6ZSwgZnJhbWVzLCBjb21wcmVzc2lvbiwgc25hcHNob3QpOwotCQlicmVhazsKLQotCWNhc2UgNzIwOgotCWNhc2UgNzMwOgotCWNhc2UgNzQwOgotCWNhc2UgNzUwOgorCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKIAkJcmV0ID0gc2V0X3ZpZGVvX21vZGVfS2lhcmEocGRldiwgc2l6ZSwgZnJhbWVzLCBjb21wcmVzc2lvbiwgc25hcHNob3QpOwotCQlicmVhazsKKworCX0gZWxzZSB7CisJCXJldCA9IHNldF92aWRlb19tb2RlX1RpbW9uKHBkZXYsIHNpemUsIGZyYW1lcywgY29tcHJlc3Npb24sIHNuYXBzaG90KTsKIAl9CiAJaWYgKHJldCA8IDApIHsKLQkJaWYgKHJldCA9PSAtRU5PRU5UKQotCQkJSW5mbygiVmlkZW8gbW9kZSAlc0AlZCBmcHMgaXMgb25seSBzdXBwb3J0ZWQgd2l0aCB0aGUgZGVjb21wcmVzc29yIG1vZHVsZSAocHdjeCkuXG4iLCBzaXplMm5hbWVbc2l6ZV0sIGZyYW1lcyk7Ci0JCWVsc2UgewotCQkJRXJyKCJGYWlsZWQgdG8gc2V0IHZpZGVvIG1vZGUgJXNAJWQgZnBzOyByZXR1cm4gY29kZSA9ICVkXG4iLCBzaXplMm5hbWVbc2l6ZV0sIGZyYW1lcywgcmV0KTsKLQkJfQorCQlQV0NfRVJST1IoIkZhaWxlZCB0byBzZXQgdmlkZW8gbW9kZSAlc0AlZCBmcHM7IHJldHVybiBjb2RlID0gJWRcbiIsIHNpemUybmFtZVtzaXplXSwgZnJhbWVzLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAlwZGV2LT52aWV3LnggPSB3aWR0aDsKIAlwZGV2LT52aWV3LnkgPSBoZWlnaHQ7CiAJcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemUgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZSArIHBkZXYtPmZyYW1lX3RyYWlsZXJfc2l6ZTsKIAlwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHBkZXYpOwotCVRyYWNlKFRSQUNFX1NJWkUsICJTZXQgdmlld3BvcnQgdG8gJWR4JWQsIGltYWdlIHNpemUgaXMgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLnkpOworCVBXQ19ERUJVR19TSVpFKCJTZXQgdmlld3BvcnQgdG8gJWR4JWQsIGltYWdlIHNpemUgaXMgJWR4JWQuXG4iLCB3aWR0aCwgaGVpZ2h0LCBwd2NfaW1hZ2Vfc2l6ZXNbc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLnkpOwogCXJldHVybiAwOwogfQogCisjZGVmaW5lIEJMQUNLX1kgMAorI2RlZmluZSBCTEFDS19VIDEyOAorI2RlZmluZSBCTEFDS19WIDEyOAorCitzdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCBpLCBmYWN0b3IgPSAwOworCisJLyogZm9yIFBBTEVUVEVfWVVWNDIwUCAqLworCXN3aXRjaChwZGV2LT52cGFsZXR0ZSkKKwl7CisJY2FzZSBWSURFT19QQUxFVFRFX1lVVjQyMFA6CisJCWZhY3RvciA9IDY7CisJCWJyZWFrOworCWNhc2UgVklERU9fUEFMRVRURV9SQVc6CisJCWZhY3RvciA9IDY7IC8qIGNhbiBiZSB1bmNvbXByZXNzZWQgWVVWNDIwUCAqLworCQlicmVhazsKKwl9CisKKwkvKiBTZXQgc2l6ZXMgaW4gYnl0ZXMgKi8KKwlwZGV2LT5pbWFnZS5zaXplID0gcGRldi0+aW1hZ2UueCAqIHBkZXYtPmltYWdlLnkgKiBmYWN0b3IgLyA0OworCXBkZXYtPnZpZXcuc2l6ZSAgPSBwZGV2LT52aWV3LnggICogcGRldi0+dmlldy55ICAqIGZhY3RvciAvIDQ7CisKKwkvKiBBbGlnbiBvZmZzZXQsIG9yIHlvdSdsbCBnZXQgc29tZSB2ZXJ5IHdlaXJkIHJlc3VsdHMgaW4KKwkgICBZVVY0MjAgbW9kZS4uLiB4IG11c3QgYmUgbXVsdGlwbGUgb2YgNCAodG8gZ2V0IHRoZSBZJ3MgaW4KKwkgICBwbGFjZSksIGFuZCB5IGV2ZW4gKG9yIHlvdSdsbCBtaXh1cCBVICYgVikuIFRoaXMgaXMgbGVzcyBvZiBhCisJICAgcHJvYmxlbSBmb3IgWVVWNDIwUC4KKwkgKi8KKwlwZGV2LT5vZmZzZXQueCA9ICgocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyKSAmIDB4RkZGQzsKKwlwZGV2LT5vZmZzZXQueSA9ICgocGRldi0+dmlldy55IC0gcGRldi0+aW1hZ2UueSkgLyAyKSAmIDB4RkZGRTsKKworCS8qIEZpbGwgYnVmZmVycyB3aXRoIGJsYWNrIGNvbG9ycyAqLworCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyICpwID0gcGRldi0+aW1hZ2VfZGF0YSArIHBkZXYtPmltYWdlc1tpXS5vZmZzZXQ7CisJCW1lbXNldChwLCBCTEFDS19ZLCBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkpOworCQlwICs9IHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueTsKKwkJbWVtc2V0KHAsIEJMQUNLX1UsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKKwkJcCArPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3LnkvNDsKKwkJbWVtc2V0KHAsIEJMQUNLX1YsIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80KTsKKwl9Cit9CisKKwogCiAvKiBCUklHSFRORVNTICovCiAKQEAgLTUyMCw3ICs0NzcsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBCUklHSFRORVNTX0ZPUk1BVFRFUiwgMSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZiA8PCA5OworCXJldHVybiBidWY7CiB9CiAKIGludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU0NSw3ICs1MDIsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWYgPDwgMTA7CisJcmV0dXJuIGJ1ZjsKIH0KIAogaW50IHB3Y19zZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU3MCw3ICs1MjcsNyBAQAogCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWYgPDwgMTE7CisJcmV0dXJuIGJ1ZjsKIH0KIAogaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKQEAgLTU4OCwzNyArNTQ1LDQ3IEBACiAKIC8qIFNBVFVSQVRJT04gKi8KIAotaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKKy8qIHJldHVybiBhIHZhbHVlIGJldHdlZW4gWy0xMDAgLCAxMDBdICovCitpbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCWNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlpZiAocGRldi0+dHlwZSA8IDY3NSkKLQkJcmV0dXJuIC0xOwotCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9DSFJPTV9DVEwsIHBkZXYtPnR5cGUgPCA3MzAgPyBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMiA6IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMzI3NjggKyBidWYgKiAzMjc7Ci19Ci0KLWludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKLXsKLQljaGFyIGJ1ZjsKKwlpbnQgcmV0LCBzYXR1cmF0aW9uX3JlZ2lzdGVyOwogCiAJaWYgKHBkZXYtPnR5cGUgPCA2NzUpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWx1ZSA8IDApCi0JCXZhbHVlID0gMDsKLQlpZiAodmFsdWUgPiAweGZmZmYpCi0JCXZhbHVlID0gMHhmZmZmOwotCS8qIHNhdHVyYXRpb24gcmFuZ2VzIGZyb20gLTEwMCB0byArMTAwICovCi0JYnVmID0gKHZhbHVlIC0gMzI3NjgpIC8gMzI3OwotCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBwZGV2LT50eXBlIDwgNzMwID8gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjIgOiBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMSwgMSk7CisJaWYgKHBkZXYtPnR5cGUgPCA3MzApCisJCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMjsKKwllbHNlCisJCXNhdHVyYXRpb25fcmVnaXN0ZXIgPSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMTsKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSAoc2lnbmVkKWJ1ZjsKKwlyZXR1cm4gMDsKK30KKworLyogQHBhcmFtIHZhbHVlIHNhdHVyYXRpb24gY29sb3IgYmV0d2VlbiBbLTEwMCAsIDEwMF0gKi8KK2ludCBwd2Nfc2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKK3sKKwljaGFyIGJ1ZjsKKwlpbnQgc2F0dXJhdGlvbl9yZWdpc3RlcjsKKworCWlmIChwZGV2LT50eXBlIDwgNjc1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsdWUgPCAtMTAwKQorCQl2YWx1ZSA9IC0xMDA7CisJaWYgKHZhbHVlID4gMTAwKQorCQl2YWx1ZSA9IDEwMDsKKwlpZiAocGRldi0+dHlwZSA8IDczMCkKKwkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyOworCWVsc2UKKwkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxOworCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfQ0hST01fQ1RMLCBzYXR1cmF0aW9uX3JlZ2lzdGVyLCAxKTsKIH0KIAogLyogQUdDICovCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQoraW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQogewogCWNoYXIgYnVmOwogCWludCByZXQ7CkBAIC02NDMsNyArNjEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCitpbnQgcHdjX2dldF9hZ2Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTY3Myw3ICs2NDAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlLCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQogewogCWNoYXIgYnVmWzJdOwogCWludCBzcGVlZCwgcmV0OwpAQCAtNjkxLDIzICs2NTgsMTYgQEAKIAkJCXZhbHVlID0gMDsKIAkJaWYgKHZhbHVlID4gMHhmZmZmKQogCQkJdmFsdWUgPSAweGZmZmY7Ci0JCXN3aXRjaChwZGV2LT50eXBlKSB7Ci0JCWNhc2UgNjc1OgotCQljYXNlIDY4MDoKLQkJY2FzZSA2OTA6CisKKwkJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKSB7CiAJCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KIAkJCXNwZWVkID0gKHZhbHVlIC8gMTAwKTsKIAkJCWJ1ZlsxXSA9IHNwZWVkID4+IDg7CiAJCQlidWZbMF0gPSBzcGVlZCAmIDB4ZmY7Ci0JCQlicmVhazsKLQkJY2FzZSA3MjA6Ci0JCWNhc2UgNzMwOgotCQljYXNlIDc0MDoKLQkJY2FzZSA3NTA6CisJCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKIAkJCS8qIHNwZWVkIHNlZW1zIHRvIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmYgKi8KIAkJCWJ1ZlsxXSA9IDA7CiAJCQlidWZbMF0gPSB2YWx1ZSA+PiA4OwotCQkJYnJlYWs7CiAJCX0KIAogCQlyZXQgPSBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLCAyKTsKQEAgLTcxNSw2ICs2NzUsMjUgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBvcnRlZCB0byB2NGwxLCBzbyBvdXRwdXQgdmFsdWVzIGJldHdlZW4gMCAtPiAyNTYgKi8KK2ludCBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCit7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IHJldDsKKworCXJldCA9IFJlY3ZDb250cm9sTXNnKEdFVF9TVEFUVVNfQ1RMLCBSRUFEX1NIVVRURVJfRk9STUFUVEVSLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsdWUgPSBidWZbMF0gKyAoYnVmWzFdIDw8IDgpOworCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgeworCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KKwkJKnZhbHVlICo9IDI1Ni82NTY7CisJfSBlbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkgeworCQkvKiBzcGVlZCBzZWVtcyB0byByYW5nZSBmcm9tIDB4MCB0byAweGZmICovCisJfQorCXJldHVybiAwOworfQorCiAKIC8qIFBPV0VSICovCiAKQEAgLTczNiwxOSArNzE1LDE5IEBACiAKIC8qIHByaXZhdGUgY2FsbHMgKi8KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX3Jlc3RvcmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK2ludCBwd2NfcmVzdG9yZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCWNoYXIgYnVmOyAvKiBkdW1teSAqLwogCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfU1RBVFVTX0NUTCwgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUiwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zYXZlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX3NhdmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAljaGFyIGJ1ZjsgLyogZHVtbXkgKi8KIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX1NUQVRVU19DVEwsIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfcmVzdG9yZV9mYWN0b3J5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19yZXN0b3JlX2ZhY3Rvcnkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJY2hhciBidWY7IC8qIGR1bW15ICovCiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9TVEFUVVNfQ1RMLCBSRVNUT1JFX0ZBQ1RPUllfREVGQVVMVFNfRk9STUFUVEVSLCAwKTsKQEAgLTc2Niw3ICs3NDUsNyBAQAogICAqIDAzOiBtYW51YWwKICAgKiAwNDogYXV0bwogICAqLwotc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBtb2RlKQoraW50IHB3Y19zZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSkKIHsKIAljaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtNzg2LDcgKzc2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC03OTgsNyArNzc3LDcgQEAKIAlyZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC04MTEsNyArNzkwLDcgQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoraW50IHB3Y19nZXRfcmVkX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTgyNCw3ICs4MDMsNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCitpbnQgcHdjX3NldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIApAQCAtODM3LDcgKzgxNiw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfQkxVRV9HQUlOX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQoraW50IHB3Y19nZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC04NTQsNyArODMzLDcgQEAKICAgIGludGVybmFsIHJlZC9ibHVlIGdhaW5zLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIG1hbnVhbAogICAgZ2FpbnMgc2V0IG9yIHJlYWQgYWJvdmUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19yZWFkX3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQorc3RhdGljIGludCBwd2NfcmVhZF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtODY2LDcgKzg0NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19yZWFkX2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3N0YXRpYyBpbnQgcHdjX3JlYWRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC04NzksNyArODU4LDcgQEAKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X3diX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc3BlZWQpCitzdGF0aWMgaW50IHB3Y19zZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzcGVlZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIApAQCAtODg4LDcgKzg2Nyw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9DSFJPTV9DVEwsIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCitzdGF0aWMgaW50IHB3Y19nZXRfd2Jfc3BlZWQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAJaW50IHJldDsKQEAgLTkwMSw3ICs4ODAsNyBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfd2JfZGVsYXkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBkZWxheSkKK3N0YXRpYyBpbnQgcHdjX3NldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGRlbGF5KQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC05MTAsNyArODg5LDcgQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQVdCX0NPTlRST0xfREVMQVlfRk9STUFUVEVSLCAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX2dldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKK3N0YXRpYyBpbnQgcHdjX2dldF93Yl9kZWxheShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtOTY1LDcgKzk0NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGNvbnRvdXIpCitpbnQgcHdjX3NldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29udG91cikKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKIAlpbnQgcmV0OwpAQCAtOTkwLDcgKzk2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKQoraW50IHB3Y19nZXRfY29udG91cihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb250b3VyKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCWludCByZXQ7CkBAIC0xMDEyLDcgKzk5MSw3IEBACiB9CiAKIAotc3RhdGljIGlubGluZSBpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCitpbnQgcHdjX3NldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBiYWNrbGlnaHQpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAKQEAgLTEwMjMsNyArMTAwMiw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsIDEpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwd2NfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpiYWNrbGlnaHQpCitpbnQgcHdjX2dldF9iYWNrbGlnaHQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqYmFja2xpZ2h0KQogewogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMDMxLDEyICsxMDEwLDM1IEBACiAJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwgMSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JKmJhY2tsaWdodCA9IGJ1ZjsKKwkqYmFja2xpZ2h0ID0gISFidWY7CisJcmV0dXJuIDA7Cit9CisKK2ludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKQoreworCXVuc2lnbmVkIGNoYXIgYnVmOworCisJaWYgKGNvbG91cikKKwkJYnVmID0gMHhmZjsKKwllbHNlCisJCWJ1ZiA9IDB4MDsKKwlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX0NIUk9NX0NUTCwgQ09MT1VSX01PREVfRk9STUFUVEVSLCAxKTsKK30KKworaW50IHB3Y19nZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqY29sb3VyKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciBidWY7CisKKwlyZXQgPSBSZWN2Q29udHJvbE1zZyhHRVRfQ0hST01fQ1RMLCBDT0xPVVJfTU9ERV9GT1JNQVRURVIsIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCSpjb2xvdXIgPSAhIWJ1ZjsKIAlyZXR1cm4gMDsKIH0KIAogCi1zdGF0aWMgaW5saW5lIGludCBwd2Nfc2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGlja2VyKQoraW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CiAKQEAgLTEwNDcsNyArMTA0OSw3IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9MVU1fQ1RMLCBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKQoraW50IHB3Y19nZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpmbGlja2VyKQogewogCWludCByZXQ7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMDU1LDEyICsxMDU3LDExIEBACiAJcmV0ID0gUmVjdkNvbnRyb2xNc2coR0VUX0xVTV9DVEwsIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAxKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQkqZmxpY2tlciA9IGJ1ZjsKKwkqZmxpY2tlciA9ICEhYnVmOwogCXJldHVybiAwOwogfQogCi0KLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQoraW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC0xMDcyLDcgKzEwNzMsNyBAQAogCXJldHVybiBTZW5kQ29udHJvbE1zZyhTRVRfTFVNX0NUTCwgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwgMSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19nZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpub2lzZSkKK2ludCBwd2NfZ2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqbm9pc2UpCiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKQEAgLTEwODQsNyArMTA4NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQorc3RhdGljIGludCBfcHdjX21wdF9yZXNldChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsYWdzKQogewogCXVuc2lnbmVkIGNoYXIgYnVmOwogCkBAIC0xMDkyLDcgKzEwOTMsMTggQEAKIAlyZXR1cm4gU2VuZENvbnRyb2xNc2coU0VUX01QVF9DVEwsIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSLCAxKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KQoraW50IHB3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncykKK3sKKwlpbnQgcmV0OworCXJldCA9IF9wd2NfbXB0X3Jlc2V0KHBkZXYsIGZsYWdzKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcGRldi0+cGFuX2FuZ2xlID0gMDsKKwkJcGRldi0+dGlsdF9hbmdsZSA9IDA7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX3B3Y19tcHRfc2V0X2FuZ2xlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcGFuLCBpbnQgdGlsdCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1Zls0XTsKIApAQCAtMTExMCw3ICsxMTIyLDM1IEBACiAJcmV0dXJuIFNlbmRDb250cm9sTXNnKFNFVF9NUFRfQ1RMLCBQVF9SRUxBVElWRV9DT05UUk9MX0ZPUk1BVFRFUiwgNCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHB3Y19tcHRfZ2V0X3N0YXR1cyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHB3Y19tcHRfc3RhdHVzICpzdGF0dXMpCitpbnQgcHdjX21wdF9zZXRfYW5nbGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBwYW4sIGludCB0aWx0KQoreworCWludCByZXQ7CisKKwkvKiBjaGVjayBhYnNvbHV0ZSByYW5nZXMgKi8KKwlpZiAocGFuICA8IHBkZXYtPmFuZ2xlX3JhbmdlLnBhbl9taW4gIHx8CisJICAgIHBhbiAgPiBwZGV2LT5hbmdsZV9yYW5nZS5wYW5fbWF4ICB8fAorCSAgICB0aWx0IDwgcGRldi0+YW5nbGVfcmFuZ2UudGlsdF9taW4gfHwKKwkgICAgdGlsdCA+IHBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWF4KQorCQlyZXR1cm4gLUVSQU5HRTsKKworCS8qIGdvIHRvIHJlbGF0aXZlIHJhbmdlLCBjaGVjayBhZ2FpbiAqLworCXBhbiAgLT0gcGRldi0+cGFuX2FuZ2xlOworCXRpbHQgLT0gcGRldi0+dGlsdF9hbmdsZTsKKwkvKiBhbmdsZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzICogMTAwLCB0aHVzIHRoZSBsaW1pdCA9IDM2MDAwICovCisJaWYgKHBhbiA8IC0zNjAwMCB8fCBwYW4gPiAzNjAwMCB8fCB0aWx0IDwgLTM2MDAwIHx8IHRpbHQgPiAzNjAwMCkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwlyZXQgPSBfcHdjX21wdF9zZXRfYW5nbGUocGRldiwgcGFuLCB0aWx0KTsKKwlpZiAocmV0ID49IDApIHsKKwkJcGRldi0+cGFuX2FuZ2xlICArPSBwYW47CisJCXBkZXYtPnRpbHRfYW5nbGUgKz0gdGlsdDsKKwl9CisJaWYgKHJldCA9PSAtRVBJUEUpIC8qIHN0YWxsIC0+IG91dCBvZiByYW5nZSAqLworCQlyZXQgPSAtRVJBTkdFOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHdjX21wdF9nZXRfc3RhdHVzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgcHdjX21wdF9zdGF0dXMgKnN0YXR1cykKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGNoYXIgYnVmWzVdOwpAQCAtMTE1MSw2ICsxMTkxLDI2IEBACiAgLyogRW5kIG9mIEFkZC1PbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KIAorLyogTGludXggMi41LnNvbWV0aGluZyBhbmQgMi42IHBhc3MgZGlyZWN0IHBvaW50ZXJzIHRvIGFyZ3VtZW50cyBvZgorICAgaW9jdGwoKSBjYWxscy4gV2l0aCAyLjQsIHlvdSBoYXZlIHRvIGRvIHRlZGlvdXMgY29weV9mcm9tX3VzZXIoKQorICAgYW5kIGNvcHlfdG9fdXNlcigpIGNhbGxzLiBXaXRoIHRoZXNlIG1hY3JvcyB3ZSBjaXJjdW12ZW50IHRoaXMsCisgICBhbmQgbGV0IG1lIG1haW50YWluIG9ubHkgb25lIHNvdXJjZSBmaWxlLiBUaGUgZnVuY3Rpb25hbGl0eSBpcworICAgZXhhY3RseSB0aGUgc2FtZSBvdGhlcndpc2UuCisgKi8KKworCisvKiBkZWZpbmUgbG9jYWwgdmFyaWFibGUgZm9yIGFyZyAqLworI2RlZmluZSBBUkdfREVGKEFSR190eXBlLCBBUkdfbmFtZSlcCisJQVJHX3R5cGUgKkFSR19uYW1lID0gYXJnOworLyogY29weSBhcmcgdG8gbG9jYWwgdmFyaWFibGUgKi8KKyNkZWZpbmUgQVJHX0lOKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisvKiBhcmd1bWVudCBpdHNlbGYgKHJlZmVyZW5jZWQpICovCisjZGVmaW5lIEFSR1IoQVJHX25hbWUpICgqQVJHX25hbWUpCisvKiBhcmd1bWVudCBhZGRyZXNzICovCisjZGVmaW5lIEFSR0EoQVJHX25hbWUpIEFSR19uYW1lCisvKiBjb3B5IGxvY2FsIHZhcmlhYmxlIHRvIGFyZyAqLworI2RlZmluZSBBUkdfT1VUKEFSR19uYW1lKSAvKiBub3RoaW5nICovCisKIAogaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewpAQCAtMTE4MCwyMDYgKzEyNDAsMjQzIEBACiAKIAljYXNlIFZJRElPQ1BXQ1NDUVVBTDoKIAl7Ci0JCWludCAqcXVhbCA9IGFyZzsKKwkJQVJHX0RFRihpbnQsIHF1YWwpCiAKLQkJaWYgKCpxdWFsIDwgMCB8fCAqcXVhbCA+IDMpCisJCUFSR19JTihxdWFsKQorCQlpZiAoQVJHUihxdWFsKSA8IDAgfHwgQVJHUihxdWFsKSA+IDMpCiAJCQlyZXQgPSAtRUlOVkFMOwogCQllbHNlCi0JCQlyZXQgPSBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsICpxdWFsLCBwZGV2LT52c25hcHNob3QpOworCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXcueCwgcGRldi0+dmlldy55LCBwZGV2LT52ZnJhbWVzLCBBUkdSKHF1YWwpLCBwZGV2LT52c25hcHNob3QpOwogCQlpZiAocmV0ID49IDApCi0JCQlwZGV2LT52Y29tcHJlc3Npb24gPSAqcXVhbDsKKwkJCXBkZXYtPnZjb21wcmVzc2lvbiA9IEFSR1IocXVhbCk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0NRVUFMOgogCXsKLQkJaW50ICpxdWFsID0gYXJnOwotCQkqcXVhbCA9IHBkZXYtPnZjb21wcmVzc2lvbjsKKwkJQVJHX0RFRihpbnQsIHF1YWwpCisKKwkJQVJHUihxdWFsKSA9IHBkZXYtPnZjb21wcmVzc2lvbjsKKwkJQVJHX09VVChxdWFsKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1BST0JFOgogCXsKLQkJc3RydWN0IHB3Y19wcm9iZSAqcHJvYmUgPSBhcmc7Ci0JCXN0cmNweShwcm9iZS0+bmFtZSwgcGRldi0+dmRldi0+bmFtZSk7Ci0JCXByb2JlLT50eXBlID0gcGRldi0+dHlwZTsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3Byb2JlLCBwcm9iZSkKKworCQlzdHJjcHkoQVJHUihwcm9iZSkubmFtZSwgcGRldi0+dmRldi0+bmFtZSk7CisJCUFSR1IocHJvYmUpLnR5cGUgPSBwZGV2LT50eXBlOworCQlBUkdfT1VUKHByb2JlKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dTRVJJQUw6CiAJewotCQlzdHJ1Y3QgcHdjX3NlcmlhbCAqc2VyaWFsID0gYXJnOwotCQlzdHJjcHkoc2VyaWFsLT5zZXJpYWwsIHBkZXYtPnNlcmlhbCk7CisJCUFSR19ERUYoc3RydWN0IHB3Y19zZXJpYWwsIHNlcmlhbCkKKworCQlzdHJjcHkoQVJHUihzZXJpYWwpLnNlcmlhbCwgcGRldi0+c2VyaWFsKTsKKwkJQVJHX09VVChzZXJpYWwpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0FHQzoKIAl7Ci0JCWludCAqYWdjID0gYXJnOwotCQlpZiAocHdjX3NldF9hZ2MocGRldiwgKmFnYyA8IDAgPyAxIDogMCwgKmFnYykpCisJCUFSR19ERUYoaW50LCBhZ2MpCisKKwkJQVJHX0lOKGFnYykKKwkJaWYgKHB3Y19zZXRfYWdjKHBkZXYsIEFSR1IoYWdjKSA8IDAgPyAxIDogMCwgQVJHUihhZ2MpKSkKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0FHQzoKIAl7Ci0JCWludCAqYWdjID0gYXJnOworCQlBUkdfREVGKGludCwgYWdjKQogCi0JCWlmIChwd2NfZ2V0X2FnYyhwZGV2LCBhZ2MpKQorCQlpZiAocHdjX2dldF9hZ2MocGRldiwgQVJHQShhZ2MpKSkKIAkJCXJldCA9IC1FSU5WQUw7CisJCUFSR19PVVQoYWdjKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NTSFVUVEVSOgogCXsKLQkJaW50ICpzaHV0dGVyX3NwZWVkID0gYXJnOwotCQlyZXQgPSBwd2Nfc2V0X3NodXR0ZXJfc3BlZWQocGRldiwgKnNodXR0ZXJfc3BlZWQgPCAwID8gMSA6IDAsICpzaHV0dGVyX3NwZWVkKTsKKwkJQVJHX0RFRihpbnQsIHNodXR0ZXJfc3BlZWQpCisKKwkJQVJHX0lOKHNodXR0ZXJfc3BlZWQpCisJCXJldCA9IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChwZGV2LCBBUkdSKHNodXR0ZXJfc3BlZWQpIDwgMCA/IDEgOiAwLCBBUkdSKHNodXR0ZXJfc3BlZWQpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NTQVdCOgogCXsKLQkJc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UgKndiID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKIAotCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCB3Yi0+bW9kZSk7Ci0JCWlmIChyZXQgPj0gMCAmJiB3Yi0+bW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7Ci0JCQlwd2Nfc2V0X3JlZF9nYWluKHBkZXYsIHdiLT5tYW51YWxfcmVkKTsKLQkJCXB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIHdiLT5tYW51YWxfYmx1ZSk7CisJCUFSR19JTih3YikKKwkJcmV0ID0gcHdjX3NldF9hd2IocGRldiwgQVJHUih3YikubW9kZSk7CisJCWlmIChyZXQgPj0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKKwkJCXB3Y19zZXRfcmVkX2dhaW4ocGRldiwgQVJHUih3YikubWFudWFsX3JlZCk7CisJCQlwd2Nfc2V0X2JsdWVfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CiAJCX0KIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQVdCOgogCXsKLQkJc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UgKndiID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlLCB3YikKIAotCQltZW1zZXQod2IsIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOwotCQl3Yi0+bW9kZSA9IHB3Y19nZXRfYXdiKHBkZXYpOwotCQlpZiAod2ItPm1vZGUgPCAwKQorCQltZW1zZXQoQVJHQSh3YiksIDAsIHNpemVvZihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkpOworCQlBUkdSKHdiKS5tb2RlID0gcHdjX2dldF9hd2IocGRldik7CisJCWlmIChBUkdSKHdiKS5tb2RlIDwgMCkKIAkJCXJldCA9IC1FSU5WQUw7CiAJCWVsc2UgewotCQkJaWYgKHdiLT5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKLQkJCQlyZXQgPSBwd2NfZ2V0X3JlZF9nYWluKHBkZXYsICZ3Yi0+bWFudWFsX3JlZCk7CisJCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfTUFOVUFMKSB7CisJCQkJcmV0ID0gcHdjX2dldF9yZWRfZ2FpbihwZGV2LCAmQVJHUih3YikubWFudWFsX3JlZCk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZ3Yi0+bWFudWFsX2JsdWUpOworCQkJCXJldCA9IHB3Y19nZXRfYmx1ZV9nYWluKHBkZXYsICZBUkdSKHdiKS5tYW51YWxfYmx1ZSk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwogCQkJfQotCQkJaWYgKHdiLT5tb2RlID09IFBXQ19XQl9BVVRPKSB7Ci0JCQkJcmV0ID0gcHdjX3JlYWRfcmVkX2dhaW4ocGRldiwgJndiLT5yZWFkX3JlZCk7CisJCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfQVVUTykgeworCQkJCXJldCA9IHB3Y19yZWFkX3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX3JlZCk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19yZWFkX2JsdWVfZ2FpbihwZGV2LCAmd2ItPnJlYWRfYmx1ZSk7CisJCQkJcmV0ID1wd2NfcmVhZF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLnJlYWRfYmx1ZSk7CiAJCQkJaWYgKHJldCA8IDApCiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CisJCUFSR19PVVQod2IpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0FXQlNQRUVEOgogCXsKLQkJc3RydWN0IHB3Y193Yl9zcGVlZCAqd2JzID0gYXJnOworCQlBUkdfREVGKHN0cnVjdCBwd2Nfd2Jfc3BlZWQsIHdicykKIAotCQlpZiAod2JzLT5jb250cm9sX3NwZWVkID4gMCkgewotCQkJcmV0ID0gcHdjX3NldF93Yl9zcGVlZChwZGV2LCB3YnMtPmNvbnRyb2xfc3BlZWQpOworCQlpZiAoQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQgPiAwKSB7CisJCQlyZXQgPSBwd2Nfc2V0X3diX3NwZWVkKHBkZXYsIEFSR1Iod2JzKS5jb250cm9sX3NwZWVkKTsKIAkJfQotCQlpZiAod2JzLT5jb250cm9sX2RlbGF5ID4gMCkgewotCQkJcmV0ID0gcHdjX3NldF93Yl9kZWxheShwZGV2LCB3YnMtPmNvbnRyb2xfZGVsYXkpOworCQlpZiAoQVJHUih3YnMpLmNvbnRyb2xfZGVsYXkgPiAwKSB7CisJCQlyZXQgPSBwd2Nfc2V0X3diX2RlbGF5KHBkZXYsIEFSR1Iod2JzKS5jb250cm9sX2RlbGF5KTsKIAkJfQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dBV0JTUEVFRDoKIAl7Ci0JCXN0cnVjdCBwd2Nfd2Jfc3BlZWQgKndicyA9IGFyZzsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3diX3NwZWVkLCB3YnMpCiAKLQkJcmV0ID0gcHdjX2dldF93Yl9zcGVlZChwZGV2LCAmd2JzLT5jb250cm9sX3NwZWVkKTsKKwkJcmV0ID0gcHdjX2dldF93Yl9zcGVlZChwZGV2LCAmQVJHUih3YnMpLmNvbnRyb2xfc3BlZWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWJyZWFrOwotCQlyZXQgPSBwd2NfZ2V0X3diX2RlbGF5KHBkZXYsICZ3YnMtPmNvbnRyb2xfZGVsYXkpOworCQlyZXQgPSBwd2NfZ2V0X3diX2RlbGF5KHBkZXYsICZBUkdSKHdicykuY29udHJvbF9kZWxheSk7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CisJCUFSR19PVVQod2JzKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NMRUQ6CiAJewotCQlzdHJ1Y3QgcHdjX2xlZHMgKmxlZHMgPSBhcmc7Ci0JCXJldCA9IHB3Y19zZXRfbGVkcyhwZGV2LCBsZWRzLT5sZWRfb24sIGxlZHMtPmxlZF9vZmYpOwotCSAgICAJYnJlYWs7CisJCUFSR19ERUYoc3RydWN0IHB3Y19sZWRzLCBsZWRzKQorCisJCUFSR19JTihsZWRzKQorCQlyZXQgPSBwd2Nfc2V0X2xlZHMocGRldiwgQVJHUihsZWRzKS5sZWRfb24sIEFSR1IobGVkcykubGVkX29mZik7CisJCWJyZWFrOwogCX0KIAogCiAJY2FzZSBWSURJT0NQV0NHTEVEOgogCXsKLQkJc3RydWN0IHB3Y19sZWRzICpsZWRzID0gYXJnOwotCQlyZXQgPSBwd2NfZ2V0X2xlZHMocGRldiwgJmxlZHMtPmxlZF9vbiwgJmxlZHMtPmxlZF9vZmYpOworCQlBUkdfREVGKHN0cnVjdCBwd2NfbGVkcywgbGVkcykKKworCQlyZXQgPSBwd2NfZ2V0X2xlZHMocGRldiwgJkFSR1IobGVkcykubGVkX29uLCAmQVJHUihsZWRzKS5sZWRfb2ZmKTsKKwkJQVJHX09VVChsZWRzKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NDT05UT1VSOgogCXsKLQkJaW50ICpjb250b3VyID0gYXJnOwotCQlyZXQgPSBwd2Nfc2V0X2NvbnRvdXIocGRldiwgKmNvbnRvdXIpOworCQlBUkdfREVGKGludCwgY29udG91cikKKworCQlBUkdfSU4oY29udG91cikKKwkJcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIEFSR1IoY29udG91cikpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dDT05UT1VSOgogCXsKLQkJaW50ICpjb250b3VyID0gYXJnOwotCQlyZXQgPSBwd2NfZ2V0X2NvbnRvdXIocGRldiwgY29udG91cik7CisJCUFSR19ERUYoaW50LCBjb250b3VyKQorCisJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCBBUkdBKGNvbnRvdXIpKTsKKwkJQVJHX09VVChjb250b3VyKQogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ1NCQUNLTElHSFQ6CiAJewotCQlpbnQgKmJhY2tsaWdodCA9IGFyZzsKLQkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgKmJhY2tsaWdodCk7CisJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCisKKwkJQVJHX0lOKGJhY2tsaWdodCkKKwkJcmV0ID0gcHdjX3NldF9iYWNrbGlnaHQocGRldiwgQVJHUihiYWNrbGlnaHQpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQkFDS0xJR0hUOgogCXsKLQkJaW50ICpiYWNrbGlnaHQgPSBhcmc7Ci0JCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsIGJhY2tsaWdodCk7CisJCUFSR19ERUYoaW50LCBiYWNrbGlnaHQpCisKKwkJcmV0ID0gcHdjX2dldF9iYWNrbGlnaHQocGRldiwgQVJHQShiYWNrbGlnaHQpKTsKKwkJQVJHX09VVChiYWNrbGlnaHQpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0ZMSUNLRVI6CiAJewotCQlpbnQgKmZsaWNrZXIgPSBhcmc7Ci0JCXJldCA9IHB3Y19zZXRfZmxpY2tlcihwZGV2LCAqZmxpY2tlcik7CisJCUFSR19ERUYoaW50LCBmbGlja2VyKQorCisJCUFSR19JTihmbGlja2VyKQorCQlyZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgQVJHUihmbGlja2VyKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0ZMSUNLRVI6CiAJewotCQlpbnQgKmZsaWNrZXIgPSBhcmc7Ci0JCXJldCA9IHB3Y19nZXRfZmxpY2tlcihwZGV2LCBmbGlja2VyKTsKKwkJQVJHX0RFRihpbnQsIGZsaWNrZXIpCisKKwkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsIEFSR0EoZmxpY2tlcikpOworCQlBUkdfT1VUKGZsaWNrZXIpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU0RZTk5PSVNFOgogCXsKLQkJaW50ICpkeW5ub2lzZSA9IGFyZzsKLQkJcmV0ID0gcHdjX3NldF9keW5hbWljX25vaXNlKHBkZXYsICpkeW5ub2lzZSk7CisJCUFSR19ERUYoaW50LCBkeW5ub2lzZSkKKworCQlBUkdfSU4oZHlubm9pc2UpCisJCXJldCA9IHB3Y19zZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdSKGR5bm5vaXNlKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0RZTk5PSVNFOgogCXsKLQkJaW50ICpkeW5ub2lzZSA9IGFyZzsKLQkJcmV0ID0gcHdjX2dldF9keW5hbWljX25vaXNlKHBkZXYsIGR5bm5vaXNlKTsKKwkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQorCisJCXJldCA9IHB3Y19nZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdBKGR5bm5vaXNlKSk7CisJCUFSR19PVVQoZHlubm9pc2UpOwogCQlicmVhazsKIAl9CiAKIAljYXNlIFZJRElPQ1BXQ0dSRUFMU0laRToKIAl7Ci0JCXN0cnVjdCBwd2NfaW1hZ2VzaXplICpzaXplID0gYXJnOwotCQlzaXplLT53aWR0aCA9IHBkZXYtPmltYWdlLng7Ci0JCXNpemUtPmhlaWdodCA9IHBkZXYtPmltYWdlLnk7CisJCUFSR19ERUYoc3RydWN0IHB3Y19pbWFnZXNpemUsIHNpemUpCisKKwkJQVJHUihzaXplKS53aWR0aCA9IHBkZXYtPmltYWdlLng7CisJCUFSR1Ioc2l6ZSkuaGVpZ2h0ID0gcGRldi0+aW1hZ2UueTsKKwkJQVJHX09VVChzaXplKQogCQlicmVhazsKIAl9CiAKQEAgLTEzODcsMTQgKzE0ODQsMTAgQEAKIAl7CiAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKIAkJewotCQkJaW50ICpmbGFncyA9IGFyZzsKKwkJCUFSR19ERUYoaW50LCBmbGFncykKIAotCQkJcmV0ID0gcHdjX21wdF9yZXNldChwZGV2LCAqZmxhZ3MpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJewotCQkJCXBkZXYtPnBhbl9hbmdsZSA9IDA7Ci0JCQkJcGRldi0+dGlsdF9hbmdsZSA9IDA7Ci0JCQl9CisJCQlBUkdfSU4oZmxhZ3MpCisJCQlyZXQgPSBwd2NfbXB0X3Jlc2V0KHBkZXYsIEFSR1IoZmxhZ3MpKTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0MDcsOCArMTUwMCwxMCBAQAogCXsKIAkJaWYgKHBkZXYtPmZlYXR1cmVzICYgRkVBVFVSRV9NT1RPUl9QQU5USUxUKQogCQl7Ci0JCQlzdHJ1Y3QgcHdjX21wdF9yYW5nZSAqcmFuZ2UgPSBhcmc7Ci0JCQkqcmFuZ2UgPSBwZGV2LT5hbmdsZV9yYW5nZTsKKwkJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfcmFuZ2UsIHJhbmdlKQorCisJCQlBUkdSKHJhbmdlKSA9IHBkZXYtPmFuZ2xlX3JhbmdlOworCQkJQVJHX09VVChyYW5nZSkKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0MjMsNDggKzE1MTgsMjMgQEAKIAogCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCiAJCXsKLQkJCXN0cnVjdCBwd2NfbXB0X2FuZ2xlcyAqYW5nbGVzID0gYXJnOworCQkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9hbmdsZXMsIGFuZ2xlcykKKworCQkJQVJHX0lOKGFuZ2xlcykKIAkJCS8qIFRoZSBjYW1lcmEgY2FuIG9ubHkgc2V0IHJlbGF0aXZlIGFuZ2xlcywgc28KIAkJCSAgIGRvIHNvbWUgY2FsY3VsYXRpb25zIHdoZW4gZ2V0dGluZyBhbiBhYnNvbHV0ZSBhbmdsZSAuCiAJCQkgKi8KLQkJCWlmIChhbmdsZXMtPmFic29sdXRlKQorCQkJaWYgKEFSR1IoYW5nbGVzKS5hYnNvbHV0ZSkKIAkJCXsKLQkJCQluZXdfcGFuICA9IGFuZ2xlcy0+cGFuOwotCQkJCW5ld190aWx0ID0gYW5nbGVzLT50aWx0OworCQkJCW5ld19wYW4gID0gQVJHUihhbmdsZXMpLnBhbjsKKwkJCQluZXdfdGlsdCA9IEFSR1IoYW5nbGVzKS50aWx0OwogCQkJfQogCQkJZWxzZQogCQkJewotCQkJCW5ld19wYW4gID0gcGRldi0+cGFuX2FuZ2xlICArIGFuZ2xlcy0+cGFuOwotCQkJCW5ld190aWx0ID0gcGRldi0+dGlsdF9hbmdsZSArIGFuZ2xlcy0+dGlsdDsKKwkJCQluZXdfcGFuICA9IHBkZXYtPnBhbl9hbmdsZSAgKyBBUkdSKGFuZ2xlcykucGFuOworCQkJCW5ld190aWx0ID0gcGRldi0+dGlsdF9hbmdsZSArIEFSR1IoYW5nbGVzKS50aWx0OwogCQkJfQotCQkJLyogY2hlY2sgYWJzb2x1dGUgcmFuZ2VzICovCi0JCQlpZiAobmV3X3BhbiAgPCBwZGV2LT5hbmdsZV9yYW5nZS5wYW5fbWluICB8fAotCQkJICAgIG5ld19wYW4gID4gcGRldi0+YW5nbGVfcmFuZ2UucGFuX21heCAgfHwKLQkJCSAgICBuZXdfdGlsdCA8IHBkZXYtPmFuZ2xlX3JhbmdlLnRpbHRfbWluIHx8Ci0JCQkgICAgbmV3X3RpbHQgPiBwZGV2LT5hbmdsZV9yYW5nZS50aWx0X21heCkKLQkJCXsKLQkJCQlyZXQgPSAtRVJBTkdFOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCS8qIGdvIHRvIHJlbGF0aXZlIHJhbmdlLCBjaGVjayBhZ2FpbiAqLwotCQkJCW5ld19wYW4gIC09IHBkZXYtPnBhbl9hbmdsZTsKLQkJCQluZXdfdGlsdCAtPSBwZGV2LT50aWx0X2FuZ2xlOwotCQkJCS8qIGFuZ2xlcyBhcmUgc3BlY2lmaWVkIGluIGRlZ3JlZXMgKiAxMDAsIHRodXMgdGhlIGxpbWl0ID0gMzYwMDAgKi8KLQkJCQlpZiAobmV3X3BhbiA8IC0zNjAwMCB8fCBuZXdfcGFuID4gMzYwMDAgfHwgbmV3X3RpbHQgPCAtMzYwMDAgfHwgbmV3X3RpbHQgPiAzNjAwMCkKLQkJCQkJcmV0ID0gLUVSQU5HRTsKLQkJCX0KLQkJCWlmIChyZXQgPT0gMCkgLyogbm8gZXJyb3JzIHNvIGZhciAqLwotCQkJewotCQkJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIG5ld19wYW4sIG5ld190aWx0KTsKLQkJCQlpZiAocmV0ID49IDApCi0JCQkJewotCQkJCQlwZGV2LT5wYW5fYW5nbGUgICs9IG5ld19wYW47Ci0JCQkJCXBkZXYtPnRpbHRfYW5nbGUgKz0gbmV3X3RpbHQ7Ci0JCQkJfQotCQkJCWlmIChyZXQgPT0gLUVQSVBFKSAvKiBzdGFsbCAtPiBvdXQgb2YgcmFuZ2UgKi8KLQkJCQkJcmV0ID0gLUVSQU5HRTsKLQkJCX0KKwkJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIG5ld19wYW4sIG5ld190aWx0KTsKIAkJfQogCQllbHNlCiAJCXsKQEAgLTE0NzgsMTEgKzE1NDgsMTIgQEAKIAogCQlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCiAJCXsKLQkJCXN0cnVjdCBwd2NfbXB0X2FuZ2xlcyAqYW5nbGVzID0gYXJnOworCQkJQVJHX0RFRihzdHJ1Y3QgcHdjX21wdF9hbmdsZXMsIGFuZ2xlcykKIAotCQkJYW5nbGVzLT5hYnNvbHV0ZSA9IDE7Ci0JCQlhbmdsZXMtPnBhbiAgPSBwZGV2LT5wYW5fYW5nbGU7Ci0JCQlhbmdsZXMtPnRpbHQgPSBwZGV2LT50aWx0X2FuZ2xlOworCQkJQVJHUihhbmdsZXMpLmFic29sdXRlID0gMTsKKwkJCUFSR1IoYW5nbGVzKS5wYW4gID0gcGRldi0+cGFuX2FuZ2xlOworCQkJQVJHUihhbmdsZXMpLnRpbHQgPSBwZGV2LT50aWx0X2FuZ2xlOworCQkJQVJHX09VVChhbmdsZXMpCiAJCX0KIAkJZWxzZQogCQl7CkBAIC0xNDk1LDggKzE1NjYsMTAgQEAKIAl7CiAJCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKIAkJewotCQkJc3RydWN0IHB3Y19tcHRfc3RhdHVzICpzdGF0dXMgPSBhcmc7Ci0JCQlyZXQgPSBwd2NfbXB0X2dldF9zdGF0dXMocGRldiwgc3RhdHVzKTsKKwkJCUFSR19ERUYoc3RydWN0IHB3Y19tcHRfc3RhdHVzLCBzdGF0dXMpCisKKwkJCXJldCA9IHB3Y19tcHRfZ2V0X3N0YXR1cyhwZGV2LCBBUkdBKHN0YXR1cykpOworCQkJQVJHX09VVChzdGF0dXMpCiAJCX0KIAkJZWxzZQogCQl7CkBAIC0xNTA3LDIyICsxNTgwLDI0IEBACiAKIAljYXNlIFZJRElPQ1BXQ0dWSURDTUQ6CiAJewotCQlzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQgKmNtZCA9IGFyZzsKKwkJQVJHX0RFRihzdHJ1Y3QgcHdjX3ZpZGVvX2NvbW1hbmQsIGNtZCk7CiAKLQkJY21kLT50eXBlID0gcGRldi0+dHlwZTsKLQkJY21kLT5yZWxlYXNlID0gcGRldi0+cmVsZWFzZTsKLQkJY21kLT5jb21tYW5kX2xlbiA9IHBkZXYtPmNtZF9sZW47Ci0JCW1lbWNweSgmY21kLT5jb21tYW5kX2J1ZiwgcGRldi0+Y21kX2J1ZiwgcGRldi0+Y21kX2xlbik7Ci0JCWNtZC0+YmFuZGxlbmd0aCA9IHBkZXYtPnZiYW5kbGVuZ3RoOwotCQljbWQtPmZyYW1lX3NpemUgPSBwZGV2LT5mcmFtZV9zaXplOworCQlBUkdSKGNtZCkudHlwZSA9IHBkZXYtPnR5cGU7CisJCUFSR1IoY21kKS5yZWxlYXNlID0gcGRldi0+cmVsZWFzZTsKKwkJQVJHUihjbWQpLmNvbW1hbmRfbGVuID0gcGRldi0+Y21kX2xlbjsKKwkJbWVtY3B5KCZBUkdSKGNtZCkuY29tbWFuZF9idWYsIHBkZXYtPmNtZF9idWYsIHBkZXYtPmNtZF9sZW4pOworCQlBUkdSKGNtZCkuYmFuZGxlbmd0aCA9IHBkZXYtPnZiYW5kbGVuZ3RoOworCQlBUkdSKGNtZCkuZnJhbWVfc2l6ZSA9IHBkZXYtPmZyYW1lX3NpemU7CisJCUFSR19PVVQoY21kKQogCQlicmVhazsKIAl9CiAgICAgICAgLyoKIAljYXNlIFZJRElPQ1BXQ0dWSURUQUJMRToKIAl7Ci0JCXN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIgKnRhYmxlID0gYXJnOwotCQl0YWJsZS0+bGVuID0gcGRldi0+Y21kX2xlbjsKLQkJbWVtY3B5KCZ0YWJsZS0+YnVmZmVyLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEsIHBkZXYtPmRlY29tcHJlc3Nvci0+dGFibGVfc2l6ZSk7CisJCUFSR19ERUYoc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciwgdGFibGUpOworCQlBUkdSKHRhYmxlKS5sZW4gPSBwZGV2LT5jbWRfbGVuOworCQltZW1jcHkoJkFSR1IodGFibGUpLmJ1ZmZlciwgcGRldi0+ZGVjb21wcmVzc19kYXRhLCBwZGV2LT5kZWNvbXByZXNzb3ItPnRhYmxlX3NpemUpOworCQlBUkdfT1VUKHRhYmxlKQogCQlicmVhazsKIAl9CiAJKi8KQEAgLTE1MzgsNCArMTYxMyw0IEBACiB9CiAKIAotCisvKiB2aW06IHNldCBjaW5vcHRpb25zPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTU5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KKyAgIERlY29tcHJlc3Npb24gZm9yIGNoaXBzZXQgdmVyc2lvbiAxCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworCisjaW5jbHVkZSAicHdjLWRlYzEuaCIKKworCit2b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnRhYmxlKQoreworCit9CisKK3ZvaWQgcHdjX2RlYzFfZXhpdCh2b2lkKQoreworCisKKworfQorCitpbnQgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKK3sKKwlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjYyZGRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaApAQCAtMCwwICsxLDQzIEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKworCisjaWZuZGVmIFBXQ19ERUMxX0gKKyNkZWZpbmUgUFdDX0RFQzFfSAorCisjaW5jbHVkZSAicHdjLmgiCisKK3N0cnVjdCBwd2NfZGVjMV9wcml2YXRlCit7CisJaW50IHZlcnNpb247CisKK307CisKK2ludCAgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3Yyk7Cit2b2lkIHB3Y19kZWMxX2luaXQoaW50IHR5cGUsIGludCByZWxlYXNlLCB2b2lkICpidWZmZXIsIHZvaWQgKnByaXZhdGVfZGF0YSk7Cit2b2lkIHB3Y19kZWMxX2V4aXQodm9pZCk7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMmQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuYwpAQCAtMCwwICsxLDk0MSBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgRGVjb21wcmVzc2lvbiBmb3IgY2hpcHNldCB2ZXJzaW9uIDIgZXQgMworICAgKEMpIDIwMDQtMjAwNiAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorCisgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKKyAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgorICAgUGxlYXNlIHNlbmQgYnVnIHJlcG9ydHMgYW5kIHN1cHBvcnQgcmVxdWVzdHMgdG8gPGx1Y0BzYWlsbGFyZC5vcmc+LgorICAgVGhlIGRlY29tcHJlc3Npb24gcm91dGluZXMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGJ5IHJldmVyc2UtZW5naW5lZXJpbmcgdGhlCisgICBOZW1vc29mdCBiaW5hcnkgcHdjeCBtb2R1bGUuIENhdmVhdCBlbXB0b3IuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisqLworCisjaW5jbHVkZSAicHdjLXRpbW9uLmgiCisjaW5jbHVkZSAicHdjLWtpYXJhLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoKKyAqIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAKKyAqICAgMDogdXNlIGEgQyB2ZXJzaW9uIG9mIHRoaXMgdGVzdHM6ICB7ICBhPDA/MDooYT4yNTU/MjU1OmEpIH0KKyAqICAgMTogdXNlIGEgZmFzdGVyIGxvb2t1cCB0YWJsZSBmb3IgY3B1IHdpdGggYSBiaWcgY2FjaGUgKGludGVsKQorICovCisjZGVmaW5lIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAJMQorLyoKKyAqIFVOUk9MTF9MT09QX0ZPUl9DT1BZSU5HX0JMT0NLCisgKiAgIDA6IHVzZSBhIGxvb3AgZm9yIGEgc21hbGxlciBjb2RlIChidXQgbGl0dGxlIHNsb3dlcikKKyAqICAgMTogd2hlbiB1bnJvbGxpbmcgdGhlIGxvb3AsIGdjYyBwcm9kdWNlcyBzb21lIGZhc3RlciBjb2RlIChwZXJoYXBzIG9ubHkKKyAqICAgdmFsaWQgZm9yIGludGVsIHByb2Nlc3NvciBjbGFzcykuIEFjdGl2YXRpbmcgdGhpcyBvcHRpb24sIGF1dG9tYXRpY2FseQorICogICBhY3RpdmF0ZSBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QCisgKi8KKyNkZWZpbmUgVU5ST0xMX0xPT1BfRk9SX0NPUFkJCTEKKyNpZiBVTlJPTExfTE9PUF9GT1JfQ09QWQorIyB1bmRlZiBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QCisjIGRlZmluZSBVU0VfTE9PS1VQX1RBQkxFX1RPX0NMQU1QIDEKKyNlbmRpZgorCisvKgorICogRU5BQkxFX0JBWUVSX0RFQ09ERVIKKyAqICAgMDogYmF5ZXIgZGVjb2RlciBpcyBub3QgYnVpbGQgKHNhdmUgc29tZSBzcGFjZSkKKyAqICAgMTogYmF5ZXIgZGVjb2RlciBpcyBidWlsZCBhbmQgY2FuIGJlIHVzZWQKKyAqLworI2RlZmluZSBFTkFCTEVfQkFZRVJfREVDT0RFUiAwCisKK3N0YXRpYyB2b2lkIGJ1aWxkX3N1YmJsb2NrX3BhdHRlcm4oc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaW5pdGlhbF92YWx1ZXNbMTJdID0geworCQktMHg1MjY1MDAsIC0weDIyMTIwMCwgMHgyMjEyMDAsIDB4NTI2NTAwLAorCQkJICAgLTB4M2RlMjAwLCAweDNkZTIwMCwKKwkJLTB4NmRiNDgwLCAtMHgyZDVkMDAsIDB4MmQ1ZDAwLCAweDZkYjQ4MCwKKwkJCSAgIC0weDEyYzIwMCwgMHgxMmMyMDAKKworCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2YWx1ZXNfZGVyaXZhdGVkWzEyXSA9IHsKKwkJMHhhNGNhLCAweDQ0MjQsIC0weDQ0MjQsIC0weGE0Y2EsCisJCQkweDdiYzQsIC0weDdiYzQsCisJCTB4ZGI2OSwgMHg1YWJhLCAtMHg1YWJhLCAtMHhkYjY5LAorCQkJMHgyNTg0LCAtMHgyNTg0CisJfTsKKwl1bnNpZ25lZCBpbnQgdGVtcF92YWx1ZXNbMTJdOworCWludCBpLCBqOworCisJbWVtY3B5KHRlbXBfdmFsdWVzLCBpbml0aWFsX3ZhbHVlcywgc2l6ZW9mKGluaXRpYWxfdmFsdWVzKSk7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCAxMjsgaisrKSB7CisJCQlwZGVjLT50YWJsZV9zdWJibG9ja1tpXVtqXSA9IHRlbXBfdmFsdWVzW2pdOworCQkJdGVtcF92YWx1ZXNbal0gKz0gdmFsdWVzX2Rlcml2YXRlZFtqXTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfYml0X3Bvd2VybWFza190YWJsZShzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUgKnBkZWMpCit7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBpbnQgYml0LCBieXRlLCBtYXNrLCB2YWw7CisJdW5zaWduZWQgaW50IGJpdHBvd2VyID0gMTsKKworCWZvciAoYml0ID0gMDsgYml0IDwgODsgYml0KyspIHsKKwkJbWFzayA9IGJpdHBvd2VyIC0gMTsKKwkJcCA9IHBkZWMtPnRhYmxlX2JpdHBvd2VybWFza1tiaXRdOworCQlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgMjU2OyBieXRlKyspIHsKKwkJCXZhbCA9IChieXRlICYgbWFzayk7CisJCQlpZiAoYnl0ZSAmIGJpdHBvd2VyKQorCQkJCXZhbCA9IC12YWw7CisJCQkqcCsrID0gdmFsOworCQl9CisJCWJpdHBvd2VyPDw9MTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgYnVpbGRfdGFibGVfY29sb3IoY29uc3QgdW5zaWduZWQgaW50IHJvbXRhYmxlWzE2XVs4XSwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgcDAwMDRbMTZdWzEwMjRdLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBwODAwNFsxNl1bMjU2XSkKK3sKKwlpbnQgY29tcHJlc3Npb25fbW9kZSwgaiwgaywgYml0LCBwdzsKKwl1bnNpZ25lZCBjaGFyICpwMCwgKnA4OworCWNvbnN0IHVuc2lnbmVkIGludCAqcjsKKworCS8qIFdlIGhhdmUgMTYgY29tcHJlc3Npb25zIHRhYmxlcyAqLworCWZvciAoY29tcHJlc3Npb25fbW9kZSA9IDA7IGNvbXByZXNzaW9uX21vZGUgPCAxNjsgY29tcHJlc3Npb25fbW9kZSsrKSB7CisJCXAwID0gcDAwMDRbY29tcHJlc3Npb25fbW9kZV07CisJCXA4ID0gcDgwMDRbY29tcHJlc3Npb25fbW9kZV07CisJCXIgID0gcm9tdGFibGVbY29tcHJlc3Npb25fbW9kZV07CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKywgcisrLCBwMCArPSAxMjgpIHsKKworCQkJZm9yIChrID0gMDsgayA8IDE2OyBrKyspIHsKKwkJCQlpZiAoayA9PSAwKQorCQkJCQliaXQgPSAxOworCQkJCWVsc2UgaWYgKGsgPj0gMSAmJiBrIDwgMykKKwkJCQkJYml0ID0gKHJbMF0gPj4gMTUpICYgNzsKKwkJCQllbHNlIGlmIChrID49IDMgJiYgayA8IDYpCisJCQkJCWJpdCA9IChyWzBdID4+IDEyKSAmIDc7CisJCQkJZWxzZSBpZiAoayA+PSA2ICYmIGsgPCAxMCkKKwkJCQkJYml0ID0gKHJbMF0gPj4gOSkgJiA3OworCQkJCWVsc2UgaWYgKGsgPj0gMTAgJiYgayA8IDEzKQorCQkJCQliaXQgPSAoclswXSA+PiA2KSAmIDc7CisJCQkJZWxzZSBpZiAoayA+PSAxMyAmJiBrIDwgMTUpCisJCQkJCWJpdCA9IChyWzBdID4+IDMpICYgNzsKKwkJCQllbHNlCisJCQkJCWJpdCA9IChyWzBdKSAmIDc7CisJCQkJaWYgKGsgPT0gMCkKKwkJCQkJKnA4KysgPSA4OworCQkJCWVsc2UKKwkJCQkJKnA4KysgPSBqIC0gYml0OworCQkJCSpwOCsrID0gYml0OworCisJCQkJcHcgPSAxIDw8IGJpdDsKKwkJCQlwMFtrICsgMHgwMF0gPSAoMSAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4MTBdID0gKDIgKiBwdykgKyAweDgwOworCQkJCXAwW2sgKyAweDIwXSA9ICgzICogcHcpICsgMHg4MDsKKwkJCQlwMFtrICsgMHgzMF0gPSAoNCAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4NDBdID0gKC0xICogcHcpICsgMHg4MDsKKwkJCQlwMFtrICsgMHg1MF0gPSAoLTIgKiBwdykgKyAweDgwOworCQkJCXAwW2sgKyAweDYwXSA9ICgtMyAqIHB3KSArIDB4ODA7CisJCQkJcDBbayArIDB4NzBdID0gKC00ICogcHcpICsgMHg4MDsKKwkJCX0JLyogZW5kIG9mIGZvciAoaz0wOyBrPDE2OyBrKyssIHA4KyspICovCisJCX0JLyogZW5kIG9mIGZvciAoaj0wOyBqPDg7IGorKyAsIHRhYmxlKyspICovCisJfSAvKiBlbmQgb2YgZm9yZWFjaCBjb21wcmVzc2lvbl9tb2RlICovCit9CisKKy8qCisgKgorICovCitzdGF0aWMgdm9pZCBmaWxsX3RhYmxlX2RjMDBfZDgwMChzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUgKnBkZWMpCit7CisjZGVmaW5lIFNDQUxFQklUUyAxNQorI2RlZmluZSBPTkVfSEFMRiAgKDFVTCA8PCAoU0NBTEVCSVRTIC0gMSkpCisJaW50IGk7CisJdW5zaWduZWQgaW50IG9mZnNldDEgPSBPTkVfSEFMRjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0MiA9IDB4MDAwMDsKKworCWZvciAoaT0wOyBpPDI1NjsgaSsrKSB7CisJCXBkZWMtPnRhYmxlX2RjMDBbaV0gPSBvZmZzZXQxICYgfihPTkVfSEFMRik7CisJCXBkZWMtPnRhYmxlX2Q4MDBbaV0gPSBvZmZzZXQyOworCisJCW9mZnNldDEgKz0gMHg3YmM0OworCQlvZmZzZXQyICs9IDB4N2JjNDsKKwl9Cit9CisKKy8qCisgKiBUbyBkZWNvZGUgdGhlIHN0cmVhbToKKyAqICAgaWYgbG9va19iaXRzKDIpID09IDA6CSMgb3AgPT0gMiBpbiB0aGUgbG9va3VwIHRhYmxlCisgKiAgICAgIHNraXBfYml0cygyKQorICogICAgICBlbmQgb2YgdGhlIHN0cmVhbQorICogICBlbGlmIGxvb2tfYml0cygzKSA9PSA3OgkjIG9wID09IDEgaW4gdGhlIGxvb2t1cCB0YWJsZQorICogICAgICBza2lwX2JpdHMoMykKKyAqICAgICAgeXl5eSA9IGdldF9iaXRzKDQpCisgKiAgICAgIHh4eHggPSBnZXRfYml0cyg4KQorICogICBlbHNlOgkJCSMgb3AgPT0gMCBpbiB0aGUgbG9va3VwIHRhYmxlCisgKiAgICAgIHNraXBfYml0cyh4KQorICoKKyAqIEZvciBzcGVlZHVwIHByb2Nlc3NpbmcsIHdlIGJ1aWxkIGEgbG9va3VwIHRhYmxlIGFuZCB3ZSB0YWtlcyB0aGUgZmlyc3QgNiBiaXRzLgorICoKKyAqIHN0cnVjdCB7CisgKiAgIHVuc2lnbmVkIGNoYXIgb3A7CSAgICAvLyBvcGVyYXRpb24gdG8gZXhlY3V0ZQorICogICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgIC8vIGJpdHMgdXNlIHRvIHBlcmZvcm0gb3BlcmF0aW9uCisgKiAgIHVuc2lnbmVkIGNoYXIgb2Zmc2V0MTsgLy8gb2Zmc2V0IHRvIGFkZCB0byBhY2Nlc3MgaW4gdGhlIHRhYmxlXzAwMDQgJSAxNgorICogICB1bnNpZ25lZCBjaGFyIG9mZnNldDI7IC8vIG9mZnNldCB0byBhZGQgdG8gYWNjZXNzIGluIHRoZSB0YWJsZV8wMDA0CisgKiB9CisgKgorICogSG93IHRvIGJ1aWxkIHRoaXMgdGFibGUgPworICogICBvcCA9PSAyIHdoZW4gKGklNCk9PTAKKyAqICAgb3AgPT0gMSB3aGVuIChpJTgpPT03CisgKiAgIG9wID09IDAgb3RoZXJ3aXNlCisgKgorICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBoYXNoX3RhYmxlX29wc1s2NCo0XSA9IHsKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHgxMCwKKwkweDAwLCAweDA2LCAweDAxLCAweDMwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAxLCAweDIwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4NTAsCisJMHgwMCwgMHgwNSwgMHgwMiwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMywgMHgwMCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweDA0LCAweDAxLCAweDEwLAorCTB4MDAsIDB4MDYsIDB4MDIsIDB4MTAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDQwLAorCTB4MDAsIDB4MDUsIDB4MDEsIDB4NjAsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHg1MCwKKwkweDAwLCAweDA1LCAweDAyLCAweDQwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAzLCAweDQwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4MTAsCisJMHgwMCwgMHgwNiwgMHgwMSwgMHg3MCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMSwgMHgyMCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHgwMCwKKwkweDAwLCAweDA0LCAweDAxLCAweDUwLAorCTB4MDAsIDB4MDUsIDB4MDIsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDQwLAorCTB4MDAsIDB4MDUsIDB4MDMsIDB4MDAsCisJMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4MDAsCisJMHgwMCwgMHgwNCwgMHgwMSwgMHgxMCwKKwkweDAwLCAweDA2LCAweDAyLCAweDUwLAorCTB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMywgMHgwMSwgMHg0MCwKKwkweDAwLCAweDA1LCAweDAxLCAweDYwLAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAzLCAweDAxLCAweDAwLAorCTB4MDAsIDB4MDQsIDB4MDEsIDB4NTAsCisJMHgwMCwgMHgwNSwgMHgwMiwgMHg0MCwKKwkweDAyLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDMsIDB4MDEsIDB4NDAsCisJMHgwMCwgMHgwNSwgMHgwMywgMHg0MCwKKwkweDAxLCAweDAwLCAweDAwLCAweDAwCit9OworCisvKgorICoKKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBNdWxJZHhbMTZdWzE2XSA9IHsKKwl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCx9LAorCXswLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLCAwLCAxLCAyLCAzLH0sCisJezAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsfSwKKwl7NCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCx9LAorCXs2LCA3LCA4LCA5LCA3LCAxMCwgMTEsIDgsIDgsIDExLCAxMCwgNywgOSwgOCwgNywgNix9LAorCXs0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LCA0LCA1LCA1LCA0LH0sCisJezEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsIDEsIDMsIDAsIDIsfSwKKwl7MCwgMywgMywgMCwgMSwgMiwgMiwgMSwgMiwgMSwgMSwgMiwgMywgMCwgMCwgMyx9LAorCXswLCAxLCAyLCAzLCAzLCAyLCAxLCAwLCAzLCAyLCAxLCAwLCAwLCAxLCAyLCAzLH0sCisJezEsIDEsIDEsIDEsIDMsIDMsIDMsIDMsIDAsIDAsIDAsIDAsIDIsIDIsIDIsIDIsfSwKKwl7NywgMTAsIDExLCA4LCA5LCA4LCA3LCA2LCA2LCA3LCA4LCA5LCA4LCAxMSwgMTAsIDcsfSwKKwl7NCwgNSwgNSwgNCwgNSwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNCwgNSwgNSwgNCx9LAorCXs3LCA5LCA2LCA4LCAxMCwgOCwgNywgMTEsIDExLCA3LCA4LCAxMCwgOCwgNiwgOSwgNyx9LAorCXsxLCAzLCAwLCAyLCAyLCAwLCAzLCAxLCAyLCAwLCAzLCAxLCAxLCAzLCAwLCAyLH0sCisJezEsIDIsIDIsIDEsIDMsIDAsIDAsIDMsIDAsIDMsIDMsIDAsIDIsIDEsIDEsIDIsfSwKKwl7MTAsIDgsIDcsIDExLCA4LCA2LCA5LCA3LCA3LCA5LCA2LCA4LCAxMSwgNywgOCwgMTB9Cit9OworCisjaWYgVVNFX0xPT0tVUF9UQUJMRV9UT19DTEFNUAorI2RlZmluZSBNQVhfT1VURVJfQ1JPUF9WQUxVRQkoNTEyKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgcHdjX2Nyb3BfdGFibGVbMjU2ICsgMipNQVhfT1VURVJfQ1JPUF9WQUxVRV07CisjZGVmaW5lIENMQU1QKHgpIChwd2NfY3JvcF90YWJsZVtNQVhfT1VURVJfQ1JPUF9WQUxVRSsoeCldKQorI2Vsc2UKKyNkZWZpbmUgQ0xBTVAoeCkgKCh4KT4yNTU/MjU1OigoeCk8MD8wOngpKQorI2VuZGlmCisKKworLyogSWYgdGhlIHR5cGUgb3IgdGhlIGNvbW1hbmQgY2hhbmdlLCB3ZSByZWJ1aWxkIHRoZSBsb29rdXAgdGFibGUgKi8KK2ludCBwd2NfZGVjMjNfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLCBpbnQgdHlwZSwgdW5zaWduZWQgY2hhciAqY21kKQoreworCWludCBmbGFncywgdmVyc2lvbiwgc2hpZnQsIGk7CisJc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjOworCisJaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpIHsKKwkJcGRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAocGRlYyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXB3Yy0+ZGVjb21wcmVzc19kYXRhID0gcGRlYzsKKwl9CisJcGRlYyA9IHB3Yy0+ZGVjb21wcmVzc19kYXRhOworCisJaWYgKERFVklDRV9VU0VfQ09ERUMzKHR5cGUpKSB7CisJCWZsYWdzID0gY21kWzJdICYgMHgxODsKKwkJaWYgKGZsYWdzID09IDgpCisJCQlwZGVjLT5uYml0cyA9IDc7CS8qIE1vcmUgYml0cywgbWVhbiBtb3JlIGJpdHMgdG8gZW5jb2RlIHRoZSBzdHJlYW0sIGJ1dCBiZXR0ZXIgcXVhbGl0eSAqLworCQllbHNlIGlmIChmbGFncyA9PSAweDEwKQorCQkJcGRlYy0+bmJpdHMgPSA4OworCQllbHNlCisJCQlwZGVjLT5uYml0cyA9IDY7CisKKwkJdmVyc2lvbiA9IGNtZFsyXSA+PiA1OworCQlidWlsZF90YWJsZV9jb2xvcihLaWFyYVJvbVRhYmxlW3ZlcnNpb25dWzBdLCBwZGVjLT50YWJsZV8wMDA0X3Bhc3MxLCBwZGVjLT50YWJsZV84MDA0X3Bhc3MxKTsKKwkJYnVpbGRfdGFibGVfY29sb3IoS2lhcmFSb21UYWJsZVt2ZXJzaW9uXVsxXSwgcGRlYy0+dGFibGVfMDAwNF9wYXNzMiwgcGRlYy0+dGFibGVfODAwNF9wYXNzMik7CisKKwl9IGVsc2UgeworCisJCWZsYWdzID0gY21kWzJdICYgNjsKKwkJaWYgKGZsYWdzID09IDIpCisJCQlwZGVjLT5uYml0cyA9IDc7CisJCWVsc2UgaWYgKGZsYWdzID09IDQpCisJCQlwZGVjLT5uYml0cyA9IDg7CisJCWVsc2UKKwkJCXBkZWMtPm5iaXRzID0gNjsKKworCQl2ZXJzaW9uID0gY21kWzJdID4+IDM7CisJCWJ1aWxkX3RhYmxlX2NvbG9yKFRpbW9uUm9tVGFibGVbdmVyc2lvbl1bMF0sIHBkZWMtPnRhYmxlXzAwMDRfcGFzczEsIHBkZWMtPnRhYmxlXzgwMDRfcGFzczEpOworCQlidWlsZF90YWJsZV9jb2xvcihUaW1vblJvbVRhYmxlW3ZlcnNpb25dWzFdLCBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyLCBwZGVjLT50YWJsZV84MDA0X3Bhc3MyKTsKKwl9CisKKwkvKiBJbmZvcm1hdGlvbnMgY2FuIGJlIGNvZGVkIG9uIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJpdHMgYnV0IG5ldmVyIGxlc3MgdGhhbiA4ICovCisJc2hpZnQgPSA4IC0gcGRlYy0+bmJpdHM7CisJcGRlYy0+c2NhbGViaXRzID0gU0NBTEVCSVRTIC0gc2hpZnQ7CisJcGRlYy0+bmJpdHNtYXNrID0gMHhGRiA+PiBzaGlmdDsKKworCWZpbGxfdGFibGVfZGMwMF9kODAwKHBkZWMpOworCWJ1aWxkX3N1YmJsb2NrX3BhdHRlcm4ocGRlYyk7CisJYnVpbGRfYml0X3Bvd2VybWFza190YWJsZShwZGVjKTsKKworI2lmIFVTRV9MT09LVVBfVEFCTEVfVE9fQ0xBTVAKKwkvKiBCdWlsZCB0aGUgc3RhdGljIHRhYmxlIHRvIGNsYW1wIHZhbHVlIFswLTI1NV0gKi8KKwlmb3IgKGk9MDtpPE1BWF9PVVRFUl9DUk9QX1ZBTFVFO2krKykKKwkJcHdjX2Nyb3BfdGFibGVbaV0gPSAwOworCWZvciAoaT0wOyBpPDI1NjsgaSsrKQorCQlwd2NfY3JvcF90YWJsZVtNQVhfT1VURVJfQ1JPUF9WQUxVRStpXSA9IGk7CisJZm9yIChpPTA7IGk8TUFYX09VVEVSX0NST1BfVkFMVUU7IGkrKykKKwkJcHdjX2Nyb3BfdGFibGVbTUFYX09VVEVSX0NST1BfVkFMVUUrMjU2K2ldID0gMjU1OworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvcHkgdGhlIDR4NCBpbWFnZSBibG9jayB0byBZIHBsYW5lIGJ1ZmZlcgorICovCitzdGF0aWMgdm9pZCBjb3B5X2ltYWdlX2Jsb2NrX1koY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJY29uc3QgdW5zaWduZWQgY2hhciAqY20gPSBwd2NfY3JvcF90YWJsZStNQVhfT1VURVJfQ1JPUF9WQUxVRTsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKworCSpkKysgPSBjbVtjWzBdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbMV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1syXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzNdID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJKmQrKyA9IGNtW2NbNF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s1XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbN10gPj4gc2NhbGViaXRzXTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSoyOworCSpkKysgPSBjbVtjWzhdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbOV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMV0gPj4gc2NhbGViaXRzXTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSozOworCSpkKysgPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzEzXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzE0XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzE1XSA+PiBzY2FsZWJpdHNdOworI2Vsc2UKKwlpbnQgaTsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBjKyspCisJCSpkKysgPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lKjI7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lKjM7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYysrKQorCQkqZCsrID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworI2VuZGlmCit9CisKKy8qCisgKiBDb3B5IHRoZSA0eDQgaW1hZ2UgYmxvY2sgdG8gYSBDckNiIHBsYW5lIGJ1ZmZlcgorICoKKyAqLworc3RhdGljIHZvaWQgY29weV9pbWFnZV9ibG9ja19DckNiKGNvbnN0IGludCAqc3JjLCB1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGludCBieXRlc19wZXJfbGluZSwgdW5zaWduZWQgaW50IHNjYWxlYml0cykKK3sKKyNpZiBVTlJPTExfTE9PUF9GT1JfQ09QWQorCS8qIFVucm9sbCBhbGwgbG9vcHMgKi8KKwljb25zdCB1bnNpZ25lZCBjaGFyICpjbSA9IHB3Y19jcm9wX3RhYmxlK01BWF9PVVRFUl9DUk9QX1ZBTFVFOworCWNvbnN0IGludCAqYyA9IHNyYzsKKwl1bnNpZ25lZCBjaGFyICpkID0gZHN0OworCisJKmQrKyA9IGNtW2NbMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s0XSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbNV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1syXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbM10gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1s3XSA+PiBzY2FsZWJpdHNdOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCSpkKysgPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCSpkKysgPSBjbVtjWzhdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbMTNdID4+IHNjYWxlYml0c107CisJKmQrKyA9IGNtW2NbOV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxNF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMF0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxNV0gPj4gc2NhbGViaXRzXTsKKwkqZCsrID0gY21bY1sxMV0gPj4gc2NhbGViaXRzXTsKKyNlbHNlCisJaW50IGk7CisJY29uc3QgaW50ICpjMSA9IHNyYzsKKwljb25zdCBpbnQgKmMyID0gc3JjICsgNDsKKwl1bnNpZ25lZCBjaGFyICpkID0gZHN0OworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgYzErKywgYzIrKykgeworCQkqZCsrID0gQ0xBTVAoKCpjMSkgPj4gc2NhbGViaXRzKTsKKwkJKmQrKyA9IENMQU1QKCgqYzIpID4+IHNjYWxlYml0cyk7CisJfQorCWMxID0gc3JjICsgMTI7CisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMxKyssIGMyKyspIHsKKwkJKmQrKyA9IENMQU1QKCgqYzEpID4+IHNjYWxlYml0cyk7CisJCSpkKysgPSBDTEFNUCgoKmMyKSA+PiBzY2FsZWJpdHMpOworCX0KKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKy8qCisgKiBGb3JtYXQ6IDh4MiBwaXhlbHMKKyAqICAgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLiBHCisgKiAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICogICAuIEcgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcKKyAqICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgKiAgIG9yCisgKiAgIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICogICBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLiBHIC4KKyAqICAgLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgKiAgIEcgLiBHIC4gRyAuIEcgLiBHIC4gRyAuIEcgLgorKi8KK3N0YXRpYyB2b2lkIGNvcHlfaW1hZ2VfYmxvY2tfR3JlZW4oY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJLyogVW5yb2xsIGFsbCBsb29wcyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtID0gcHdjX2Nyb3BfdGFibGUrTUFYX09VVEVSX0NST1BfVkFMVUU7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkWzBdID0gY21bY1swXSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMl0gPj4gc2NhbGViaXRzXTsKKwlkWzZdID0gY21bY1szXSA+PiBzY2FsZWJpdHNdOworCWRbOF0gPSBjbVtjWzRdID4+IHNjYWxlYml0c107CisJZFsxMF0gPSBjbVtjWzVdID4+IHNjYWxlYml0c107CisJZFsxMl0gPSBjbVtjWzZdID4+IHNjYWxlYml0c107CisJZFsxNF0gPSBjbVtjWzddID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZFswXSA9IGNtW2NbOF0gPj4gc2NhbGViaXRzXTsKKwlkWzJdID0gY21bY1s5XSA+PiBzY2FsZWJpdHNdOworCWRbNF0gPSBjbVtjWzEwXSA+PiBzY2FsZWJpdHNdOworCWRbNl0gPSBjbVtjWzExXSA+PiBzY2FsZWJpdHNdOworCWRbOF0gPSBjbVtjWzEyXSA+PiBzY2FsZWJpdHNdOworCWRbMTBdID0gY21bY1sxM10gPj4gc2NhbGViaXRzXTsKKwlkWzEyXSA9IGNtW2NbMTRdID4+IHNjYWxlYml0c107CisJZFsxNF0gPSBjbVtjWzE1XSA+PiBzY2FsZWJpdHNdOworI2Vsc2UKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpkOworCWNvbnN0IGludCAqYyA9IHNyYzsKKworCWQgPSBkc3Q7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYysrKQorCQlkW2kqMl0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmU7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgYysrKQorCQlkW2kqMl0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKy8qCisgKiBGb3JtYXQ6IDR4NCBwaXhlbHMKKyAqICAgUiAuIFIgLiBSIC4gUgorICogICAuIEIgLiBCIC4gQiAuCisgKiAgIFIgLiBSIC4gUiAuIFIKKyAqICAgLiBCIC4gQiAuIEIgLgorICovCitzdGF0aWMgdm9pZCBjb3B5X2ltYWdlX2Jsb2NrX1JlZEJsdWUoY29uc3QgaW50ICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGJ5dGVzX3Blcl9saW5lLCB1bnNpZ25lZCBpbnQgc2NhbGViaXRzKQoreworI2lmIFVOUk9MTF9MT09QX0ZPUl9DT1BZCisJLyogVW5yb2xsIGFsbCBsb29wcyAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtID0gcHdjX2Nyb3BfdGFibGUrTUFYX09VVEVSX0NST1BfVkFMVUU7CisJdW5zaWduZWQgY2hhciAqZCA9IGRzdDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkWzBdID0gY21bY1swXSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzFdID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMl0gPj4gc2NhbGViaXRzXTsKKwlkWzZdID0gY21bY1szXSA+PiBzY2FsZWJpdHNdOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWRbMV0gPSBjbVtjWzRdID4+IHNjYWxlYml0c107CisJZFszXSA9IGNtW2NbNV0gPj4gc2NhbGViaXRzXTsKKwlkWzVdID0gY21bY1s2XSA+PiBzY2FsZWJpdHNdOworCWRbN10gPSBjbVtjWzddID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMjsKKwlkWzBdID0gY21bY1s4XSA+PiBzY2FsZWJpdHNdOworCWRbMl0gPSBjbVtjWzldID4+IHNjYWxlYml0c107CisJZFs0XSA9IGNtW2NbMTBdID4+IHNjYWxlYml0c107CisJZFs2XSA9IGNtW2NbMTFdID4+IHNjYWxlYml0c107CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMzsKKwlkWzFdID0gY21bY1sxMl0gPj4gc2NhbGViaXRzXTsKKwlkWzNdID0gY21bY1sxM10gPj4gc2NhbGViaXRzXTsKKwlkWzVdID0gY21bY1sxNF0gPj4gc2NhbGViaXRzXTsKKwlkWzddID0gY21bY1sxNV0gPj4gc2NhbGViaXRzXTsKKyNlbHNlCisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqZDsKKwljb25zdCBpbnQgKmMgPSBzcmM7CisKKwlkID0gZHN0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjJdID0gQ0xBTVAoKCpjKSA+PiBzY2FsZWJpdHMpOworCisJZCA9IGRzdCArIGJ5dGVzX3Blcl9saW5lOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjIrMV0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisKKwlkID0gZHN0ICsgYnl0ZXNfcGVyX2xpbmUqMjsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBjKyspCisJCWRbaSoyXSA9IENMQU1QKCgqYykgPj4gc2NhbGViaXRzKTsKKworCWQgPSBkc3QgKyBieXRlc19wZXJfbGluZSozOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyssIGMrKykKKwkJZFtpKjIrMV0gPSBDTEFNUCgoKmMpID4+IHNjYWxlYml0cyk7CisjZW5kaWYKK30KKyNlbmRpZgorCisvKgorICogVG8gbWFuYWdlIHRoZSBzdHJlYW0sIHdlIGtlZXAgYml0cyBpbiBhIDMyIGJpdHMgcmVnaXN0ZXIuCisgKiBmaWxsX25iaXRzKG4pOiBmaWxsIHRoZSByZXNlcnZvaXIgd2l0aCBhdCBsZWFzdCBuIGJpdHMKKyAqIHNraXBfYml0cyhuKTogZGlzY2FyZCBuIGJpdHMgZnJvbSB0aGUgcmVzZXJ2b2lyCisgKiBnZXRfYml0cyhuKTogZmlsbCB0aGUgcmVzZXJ2b2lyLCByZXR1cm5zIHRoZSBmaXJzdCBuIGJpdHMgYW5kIGRpc2NhcmQgdGhlCisgKiAgICAgICAgICAgICAgYml0cyBmcm9tIHRoZSByZXNlcnZvaXIuCisgKiBfX2dldF9uYml0cyhuKTogZmFzdGVyIHZlcnNpb24gb2YgZ2V0X2JpdHMobiksIGJ1dCBhc3VtZXMgdGhhdCB0aGUgcmVzZXJ2b2lyCisgKiAgICAgICAgICAgICAgICAgY29udGFpbnMgYXQgbGVhc3QgbiBiaXRzLiBiaXRzIHJldHVybmVkIGlzIGRpc2NhcmRlZC4KKyAqLworI2RlZmluZSBmaWxsX25iaXRzKHBkZWMsIG5iaXRzX3dhbnRlZCkgZG8geyBcCisgICB3aGlsZSAocGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyPChuYml0c193YW50ZWQpKSBcCisgICAgeyBcCisgICAgICBwZGVjLT5yZXNlcnZvaXIgfD0gKCoocGRlYy0+c3RyZWFtKSsrKSA8PCAocGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyKTsgXAorICAgICAgcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyICs9IDg7IFwKKyAgICB9IFwKK30gIHdoaWxlKDApOworCisjZGVmaW5lIHNraXBfbmJpdHMocGRlYywgbmJpdHNfdG9fc2tpcCkgZG8geyBcCisgICBwZGVjLT5yZXNlcnZvaXIgPj49IChuYml0c190b19za2lwKTsgXAorICAgcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyIC09IChuYml0c190b19za2lwKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgZ2V0X25iaXRzKHBkZWMsIG5iaXRzX3dhbnRlZCwgcmVzdWx0KSBkbyB7IFwKKyAgIGZpbGxfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorICAgcmVzdWx0ID0gKHBkZWMtPnJlc2Vydm9pcikgJiAoKDFVPDwobmJpdHNfd2FudGVkKSktMSk7IFwKKyAgIHNraXBfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgX19nZXRfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkLCByZXN1bHQpIGRvIHsgXAorICAgcmVzdWx0ID0gKHBkZWMtPnJlc2Vydm9pcikgJiAoKDFVPDwobmJpdHNfd2FudGVkKSktMSk7IFwKKyAgIHNraXBfbmJpdHMocGRlYywgbmJpdHNfd2FudGVkKTsgXAorfSAgd2hpbGUoMCk7CisKKyNkZWZpbmUgbG9va19uYml0cyhwZGVjLCBuYml0c193YW50ZWQpIFwKKyAgICgocGRlYy0+cmVzZXJ2b2lyKSAmICgoMVU8PChuYml0c193YW50ZWQpKS0xKSkKKworLyoKKyAqIERlY29kZSBhIDR4NCBwaXhlbCBibG9jaworICovCitzdGF0aWMgdm9pZCBkZWNvZGVfYmxvY2soc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjLAorCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTAwMDQsCisJCQkgY29uc3QgdW5zaWduZWQgY2hhciAqcHRhYmxlODAwNCkKK3sKKwl1bnNpZ25lZCBpbnQgcHJpbWFyeV9jb2xvcjsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbF92LCBvZmZzZXQxLCBvcDsKKwlpbnQgaTsKKworCWZpbGxfbmJpdHMocGRlYywgMTYpOworCV9fZ2V0X25iaXRzKHBkZWMsIHBkZWMtPm5iaXRzLCBwcmltYXJ5X2NvbG9yKTsKKworCWlmIChsb29rX25iaXRzKHBkZWMsMikgPT0gMCkgeworCQlza2lwX25iaXRzKHBkZWMsIDIpOworCQkvKiBWZXJ5IHNpbXBsZSwgdGhlIGNvbG9yIGlzIHRoZSBzYW1lIGZvciBhbGwgcGl4ZWxzIG9mIHRoZSBzcXVhcmUgKi8KKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlwZGVjLT50ZW1wX2NvbG9yc1tpXSA9IHBkZWMtPnRhYmxlX2RjMDBbcHJpbWFyeV9jb2xvcl07CisKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgYmxvY2sgaXMgZW5jb2RlZCB3aXRoIHNtYWxsIHBhdHRlcm4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcGRlYy0+dGVtcF9jb2xvcnNbaV0gPSBwZGVjLT50YWJsZV9kODAwW3ByaW1hcnlfY29sb3JdOworCisJX19nZXRfbmJpdHMocGRlYywgMywgY2hhbm5lbF92KTsKKwljaGFubmVsX3YgPSAoKGNoYW5uZWxfdiAmIDEpIDw8IDIpIHwgKGNoYW5uZWxfdiAmIDIpIHwgKChjaGFubmVsX3YgJiA0KSA+PiAyKTsKKworCXB0YWJsZTAwMDQgKz0gKGNoYW5uZWxfdiAqIDEyOCk7CisJcHRhYmxlODAwNCArPSAoY2hhbm5lbF92ICogMzIpOworCisJb2Zmc2V0MSA9IDA7CisJZG8KKwl7CisJCXVuc2lnbmVkIGludCBodGFibGVfaWR4LCByb3dzID0gMDsKKwkJY29uc3QgdW5zaWduZWQgaW50ICpibG9jazsKKworCQkvKiBbICB6enp6IHkgeCB4IF0KKwkJICogICAgIHh4ID09IDAwIDo9PiBlbmQgb2YgdGhlIGJsb2NrIGRlZiwgcmVtb3ZlIHRoZSB0d28gYml0cyBmcm9tIHRoZSBzdHJlYW0KKwkJICogICAgeXh4ID09IDExMQorCQkgKiAgICB5eHggPT0gYW55IG90aGVyIHZhbHVlCisJCSAqCisJCSAqLworCQlmaWxsX25iaXRzKHBkZWMsIDE2KTsKKwkJaHRhYmxlX2lkeCA9IGxvb2tfbmJpdHMocGRlYywgNik7CisJCW9wID0gaGFzaF90YWJsZV9vcHNbaHRhYmxlX2lkeCAqIDRdOworCisJCWlmIChvcCA9PSAyKSB7CisJCQlza2lwX25iaXRzKHBkZWMsIDIpOworCisJCX0gZWxzZSBpZiAob3AgPT0gMSkgeworCQkJLyogMTViaXRzIFsgeHh4eCB4eHh4IHl5eXkgMTExIF0KKwkJCSAqIHl5eSA9PiBvZmZzZXQgaW4gdGhlIHRhYmxlODAwNAorCQkJICogeHh4ID0+IG9mZnNldCBpbiB0aGUgdGFibGVkMDA0ICh0cmVlKQorCQkJICovCisJCQl1bnNpZ25lZCBpbnQgbWFzaywgc2hpZnQ7CisJCQl1bnNpZ25lZCBpbnQgbmJpdHMsIGNvbDE7CisJCQl1bnNpZ25lZCBpbnQgeXl5eTsKKworCQkJc2tpcF9uYml0cyhwZGVjLCAzKTsKKwkJCS8qIG9mZnNldDEgKz0geXl5eSAqLworCQkJX19nZXRfbmJpdHMocGRlYywgNCwgeXl5eSk7CisJCQlvZmZzZXQxICs9IDEgKyB5eXl5OworCQkJb2Zmc2V0MSAmPSAweDBGOworCQkJbmJpdHMgPSBwdGFibGU4MDA0W29mZnNldDEgKiAyXTsKKworCQkJLyogY29sMSA9IHh4eHggeHh4eCAqLworCQkJX19nZXRfbmJpdHMocGRlYywgbmJpdHMrMSwgY29sMSk7CisKKwkJCS8qIEJpdCBtYXNrIHRhYmxlICovCisJCQltYXNrID0gcGRlYy0+dGFibGVfYml0cG93ZXJtYXNrW25iaXRzXVtjb2wxXTsKKwkJCXNoaWZ0ID0gcHRhYmxlODAwNFtvZmZzZXQxICogMiArIDFdOworCQkJcm93cyA9ICgobWFzayA8PCBzaGlmdCkgKyAweDgwKSAmIDB4RkY7CisKKwkJCWJsb2NrID0gcGRlYy0+dGFibGVfc3ViYmxvY2tbcm93c107CisJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCQlwZGVjLT50ZW1wX2NvbG9yc1tpXSArPSBibG9ja1tNdWxJZHhbb2Zmc2V0MV1baV1dOworCisJCX0gZWxzZSB7CisJCQkvKiBvcCA9PSAwCisJCQkgKiBvZmZzZXQxIGlzIGNvZGVkIG9uIDMgYml0cworCQkJICovCisJCQl1bnNpZ25lZCBpbnQgc2hpZnQ7CisKKwkJCW9mZnNldDEgKz0gaGFzaF90YWJsZV9vcHMgW2h0YWJsZV9pZHggKiA0ICsgMl07CisJCQlvZmZzZXQxICY9IDB4MEY7CisKKwkJCXJvd3MgPSBwdGFibGUwMDA0W29mZnNldDEgKyBoYXNoX3RhYmxlX29wcyBbaHRhYmxlX2lkeCAqIDQgKyAzXV07CisJCQlibG9jayA9IHBkZWMtPnRhYmxlX3N1YmJsb2NrW3Jvd3NdOworCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQkJcGRlYy0+dGVtcF9jb2xvcnNbaV0gKz0gYmxvY2tbTXVsSWR4W29mZnNldDFdW2ldXTsKKworCQkJc2hpZnQgPSBoYXNoX3RhYmxlX29wc1todGFibGVfaWR4ICogNCArIDFdOworCQkJc2tpcF9uYml0cyhwZGVjLCBzaGlmdCk7CisJCX0KKworCX0gd2hpbGUgKG9wICE9IDIpOworCit9CisKK3N0YXRpYyB2b2lkIERlY29tcHJlc3NCYW5kMjMoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlICpwZGVjLAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpyYXd5dXYsCisJCQkgICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5hcl95LAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpwbGFuYXJfdSwKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqcGxhbmFyX3YsCisJCQkgICAgIHVuc2lnbmVkIGludCAgIGNvbXByZXNzZWRfaW1hZ2Vfd2lkdGgsCisJCQkgICAgIHVuc2lnbmVkIGludCAgIHJlYWxfaW1hZ2Vfd2lkdGgpCit7CisJaW50IGNvbXByZXNzaW9uX2luZGV4LCBuYmxvY2tzOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTAwMDQ7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHRhYmxlODAwNDsKKworCXBkZWMtPnJlc2Vydm9pciA9IDA7CisJcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyID0gMDsKKwlwZGVjLT5zdHJlYW0gPSByYXd5dXYgKyAxOwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIGlzIHNraXBwZWQgKi8KKworCWdldF9uYml0cyhwZGVjLCA0LCBjb21wcmVzc2lvbl9pbmRleCk7CisKKwkvKiBwYXNzIDE6IHVuY29tcHJlc3MgWSBjb21wb25lbnQgKi8KKwluYmxvY2tzID0gY29tcHJlc3NlZF9pbWFnZV93aWR0aCAvIDQ7CisKKwlwdGFibGUwMDA0ID0gcGRlYy0+dGFibGVfMDAwNF9wYXNzMVtjb21wcmVzc2lvbl9pbmRleF07CisJcHRhYmxlODAwNCA9IHBkZWMtPnRhYmxlXzgwMDRfcGFzczFbY29tcHJlc3Npb25faW5kZXhdOworCisJLyogRWFjaCBibG9jayBkZWNvZGUgYSBzcXVhcmUgb2YgNHg0ICovCisJd2hpbGUgKG5ibG9ja3MpIHsKKwkJZGVjb2RlX2Jsb2NrKHBkZWMsIHB0YWJsZTAwMDQsIHB0YWJsZTgwMDQpOworCQljb3B5X2ltYWdlX2Jsb2NrX1kocGRlYy0+dGVtcF9jb2xvcnMsIHBsYW5hcl95LCByZWFsX2ltYWdlX3dpZHRoLCBwZGVjLT5zY2FsZWJpdHMpOworCQlwbGFuYXJfeSArPSA0OworCQluYmxvY2tzLS07CisJfQorCisJLyogcGFzcyAyOiB1bmNvbXByZXNzIFVWIGNvbXBvbmVudCAqLworCW5ibG9ja3MgPSBjb21wcmVzc2VkX2ltYWdlX3dpZHRoIC8gODsKKworCXB0YWJsZTAwMDQgPSBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyW2NvbXByZXNzaW9uX2luZGV4XTsKKwlwdGFibGU4MDA0ID0gcGRlYy0+dGFibGVfODAwNF9wYXNzMltjb21wcmVzc2lvbl9pbmRleF07CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfQ3JDYihwZGVjLT50ZW1wX2NvbG9ycywgcGxhbmFyX3UsIHJlYWxfaW1hZ2Vfd2lkdGgvMiwgcGRlYy0+c2NhbGViaXRzKTsKKworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfQ3JDYihwZGVjLT50ZW1wX2NvbG9ycywgcGxhbmFyX3YsIHJlYWxfaW1hZ2Vfd2lkdGgvMiwgcGRlYy0+c2NhbGViaXRzKTsKKworCQlwbGFuYXJfdiArPSA4OworCQlwbGFuYXJfdSArPSA4OworCQluYmxvY2tzIC09IDI7CisJfQorCit9CisKKyNpZiBFTkFCTEVfQkFZRVJfREVDT0RFUgorLyoKKyAqIFNpemUgbmVlZCB0byBiZSBhIG11bHRpcGxlIG9mIDggaW4gd2lkdGgKKyAqCisgKiBSZXR1cm4gYSBibG9jayBvZiBmb3VyIGxpbmUgZW5jb2RlZCBsaWtlIHRoaXM6CisgKgorICogICBHIFIgRyBSIEcgUiBHIFIgRyBSIEcgUiBHIFIgRyBSCisgKiAgIEIgRyBCIEcgQiBHIEIgRyBCIEcgQiBHIEIgRyBCIEcKKyAqICAgRyBSIEcgUiBHIFIgRyBSIEcgUiBHIFIgRyBSIEcgUgorICogICBCIEcgQiBHIEIgRyBCIEcgQiBHIEIgRyBCIEcgQiBHCisgKgorICovCitzdGF0aWMgdm9pZCBEZWNvbXByZXNzQmFuZEJheWVyKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSAqcGRlYywKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpyYXd5dXYsCisJCQkJdW5zaWduZWQgY2hhciAqcmdiYmF5ZXIsCisJCQkJdW5zaWduZWQgaW50ICAgY29tcHJlc3NlZF9pbWFnZV93aWR0aCwKKwkJCQl1bnNpZ25lZCBpbnQgICByZWFsX2ltYWdlX3dpZHRoKQoreworCWludCBjb21wcmVzc2lvbl9pbmRleCwgbmJsb2NrczsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdGFibGUwMDA0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTgwMDQ7CisJdW5zaWduZWQgY2hhciAqZGVzdDsKKworCXBkZWMtPnJlc2Vydm9pciA9IDA7CisJcGRlYy0+bmJpdHNfaW5fcmVzZXJ2b2lyID0gMDsKKwlwZGVjLT5zdHJlYW0gPSByYXd5dXYgKyAxOwkvKiBUaGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyZWFtIGlzIHNraXBwZWQgKi8KKworCWdldF9uYml0cyhwZGVjLCA0LCBjb21wcmVzc2lvbl9pbmRleCk7CisKKwkvKiBwYXNzIDE6IHVuY29tcHJlc3MgUkIgY29tcG9uZW50ICovCisJbmJsb2NrcyA9IGNvbXByZXNzZWRfaW1hZ2Vfd2lkdGggLyA0OworCisJcHRhYmxlMDAwNCA9IHBkZWMtPnRhYmxlXzAwMDRfcGFzczFbY29tcHJlc3Npb25faW5kZXhdOworCXB0YWJsZTgwMDQgPSBwZGVjLT50YWJsZV84MDA0X3Bhc3MxW2NvbXByZXNzaW9uX2luZGV4XTsKKwlkZXN0ID0gcmdiYmF5ZXI7CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfUmVkQmx1ZShwZGVjLT50ZW1wX2NvbG9ycywgcmdiYmF5ZXIsIHJlYWxfaW1hZ2Vfd2lkdGgsIHBkZWMtPnNjYWxlYml0cyk7CisJCWRlc3QgKz0gODsKKwkJbmJsb2Nrcy0tOworCX0KKworCS8qIHBhc3MgMjogdW5jb21wcmVzcyBHIGNvbXBvbmVudCAqLworCW5ibG9ja3MgPSBjb21wcmVzc2VkX2ltYWdlX3dpZHRoIC8gODsKKworCXB0YWJsZTAwMDQgPSBwZGVjLT50YWJsZV8wMDA0X3Bhc3MyW2NvbXByZXNzaW9uX2luZGV4XTsKKwlwdGFibGU4MDA0ID0gcGRlYy0+dGFibGVfODAwNF9wYXNzMltjb21wcmVzc2lvbl9pbmRleF07CisKKwkvKiBFYWNoIGJsb2NrIGRlY29kZSBhIHNxdWFyZSBvZiA0eDQgKi8KKwl3aGlsZSAobmJsb2NrcykgeworCQlkZWNvZGVfYmxvY2socGRlYywgcHRhYmxlMDAwNCwgcHRhYmxlODAwNCk7CisJCWNvcHlfaW1hZ2VfYmxvY2tfR3JlZW4ocGRlYy0+dGVtcF9jb2xvcnMsIHJnYmJheWVyKzEsIHJlYWxfaW1hZ2Vfd2lkdGgsIHBkZWMtPnNjYWxlYml0cyk7CisKKwkJZGVjb2RlX2Jsb2NrKHBkZWMsIHB0YWJsZTAwMDQsIHB0YWJsZTgwMDQpOworCQljb3B5X2ltYWdlX2Jsb2NrX0dyZWVuKHBkZWMtPnRlbXBfY29sb3JzLCByZ2JiYXllcityZWFsX2ltYWdlX3dpZHRoLCByZWFsX2ltYWdlX3dpZHRoLCBwZGVjLT5zY2FsZWJpdHMpOworCisJCXJnYmJheWVyICs9IDE2OworCQluYmxvY2tzIC09IDI7CisJfQorfQorI2VuZGlmCisKKworLyoqCisgKgorICogVW5jb21wcmVzcyBhIHB3YzIzIGJ1ZmZlci4KKyAqCisgKiBwd2Mudmlldzogc2l6ZSBvZiB0aGUgaW1hZ2Ugd2FudGVkCisgKiBwd2MuaW1hZ2U6IHNpemUgb2YgdGhlIGltYWdlIHJldHVybmVkIGJ5IHRoZSBjYW1lcmEKKyAqIHB3Yy5vZmZzZXQ6ICh4LHkpIHRvIGRpc3BsYXllciBpbWFnZSBpbiB0aGUgdmlldworICoKKyAqIHNyYzogcmF3IGRhdGEKKyAqIGRzdDogaW1hZ2Ugb3V0cHV0CisgKiBmbGFnczogUFdDWF9GTEFHX1BMQU5BUiBvciBQV0NYX0ZMQUdfQkFZRVIKKyAqLwordm9pZCBwd2NfZGVjMjNfZGVjb21wcmVzcyhjb25zdCBzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLAorCQkJICBjb25zdCB2b2lkICpzcmMsCisJCQkgIHZvaWQgKmRzdCwKKwkJCSAgaW50IGZsYWdzKQoreworCWludCBiYW5kbGluZXNfbGVmdCwgc3RyaWRlLCBieXRlc19wZXJfYmxvY2s7CisKKwliYW5kbGluZXNfbGVmdCA9IHB3Yy0+aW1hZ2UueSAvIDQ7CisJYnl0ZXNfcGVyX2Jsb2NrID0gcHdjLT52aWV3LnggKiA0OworCisJaWYgKGZsYWdzICYgUFdDWF9GTEFHX0JBWUVSKSB7CisjaWYgRU5BQkxFX0JBWUVSX0RFQ09ERVIKKwkJLyogUkdCIEJheWVyIGZvcm1hdCAqLworCQl1bnNpZ25lZCBjaGFyICpyZ2JvdXQ7CisKKwkJc3RyaWRlID0gcHdjLT52aWV3LnggKiBwd2MtPm9mZnNldC55OworCQlyZ2JvdXQgPSBkc3QgKyBzdHJpZGUgKyBwd2MtPm9mZnNldC54OworCisKKwkJd2hpbGUgKGJhbmRsaW5lc19sZWZ0LS0pIHsKKworCQkJRGVjb21wcmVzc0JhbmRCYXllcihwd2MtPmRlY29tcHJlc3NfZGF0YSwKKwkJCQkJICAgIHNyYywKKwkJCQkJICAgIHJnYm91dCwKKwkJCQkJICAgIHB3Yy0+aW1hZ2UueCwgcHdjLT52aWV3LngpOworCisJCQlzcmMgKz0gcHdjLT52YmFuZGxlbmd0aDsKKwkJCXJnYm91dCArPSBieXRlc19wZXJfYmxvY2s7CisKKwkJfQorI2Vsc2UKKwkJbWVtc2V0KGRzdCwgMCwgcHdjLT52aWV3LnggKiBwd2MtPnZpZXcueSk7CisjZW5kaWYKKworCX0gZWxzZSB7CisJCS8qIFlVVjQyMFAgaW1hZ2UgZm9ybWF0ICovCisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3k7CisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3U7CisJCXVuc2lnbmVkIGNoYXIgKnBvdXRfcGxhbmFyX3Y7CisJCXVuc2lnbmVkIGludCAgIHBsYW5lX3NpemU7CisKKwkJcGxhbmVfc2l6ZSA9IHB3Yy0+dmlldy54ICogcHdjLT52aWV3Lnk7CisKKwkJLyogb2Zmc2V0IGluIFkgcGxhbmUgKi8KKwkJc3RyaWRlID0gcHdjLT52aWV3LnggKiBwd2MtPm9mZnNldC55OworCQlwb3V0X3BsYW5hcl95ID0gZHN0ICsgc3RyaWRlICsgcHdjLT5vZmZzZXQueDsKKworCQkvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKwkJc3RyaWRlID0gKHB3Yy0+dmlldy54ICogcHdjLT5vZmZzZXQueSkgLyA0ICsgcHdjLT5vZmZzZXQueCAvIDI7CisJCXBvdXRfcGxhbmFyX3UgPSBkc3QgKyBwbGFuZV9zaXplICsgc3RyaWRlOworCQlwb3V0X3BsYW5hcl92ID0gZHN0ICsgcGxhbmVfc2l6ZSArIHBsYW5lX3NpemUgLyA0ICsgc3RyaWRlOworCisJCXdoaWxlIChiYW5kbGluZXNfbGVmdC0tKSB7CisKKwkJCURlY29tcHJlc3NCYW5kMjMocHdjLT5kZWNvbXByZXNzX2RhdGEsCisJCQkJCSBzcmMsCisJCQkJCSBwb3V0X3BsYW5hcl95LCBwb3V0X3BsYW5hcl91LCBwb3V0X3BsYW5hcl92LAorCQkJCQkgcHdjLT5pbWFnZS54LCBwd2MtPnZpZXcueCk7CisJCQlzcmMgKz0gcHdjLT52YmFuZGxlbmd0aDsKKwkJCXBvdXRfcGxhbmFyX3kgKz0gYnl0ZXNfcGVyX2Jsb2NrOworCQkJcG91dF9wbGFuYXJfdSArPSBwd2MtPnZpZXcueDsKKwkJCXBvdXRfcGxhbmFyX3YgKz0gcHdjLT52aWV3Lng7CisKKwkJfQorCisJfQorCit9CisKK3ZvaWQgcHdjX2RlYzIzX2V4aXQodm9pZCkKK3sKKwkvKiBEbyBub3RoaW5nICovCisKK30KKworLyoqCisgKiBBbGxvY2F0ZSBhIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgYnkgbG9va3VwIHRhYmxlLgorICogWW91IG11c3QgY2FsbCBrZnJlZSgpIHRvIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQuCisgKi8KK2ludCBwd2NfZGVjMjNfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKK3sKKwlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOworCWlmIChwd2MtPmRlY29tcHJlc3NfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNTUyOTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaApAQCAtMCwwICsxLDY3IEBACisvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKyNpZm5kZWYgUFdDX0RFQzIzX0gKKyNkZWZpbmUgUFdDX0RFQzIzX0gKKworI2luY2x1ZGUgInB3Yy5oIgorCitzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUKK3sKKyAgdW5zaWduZWQgaW50IHNjYWxlYml0czsKKyAgdW5zaWduZWQgaW50IG5iaXRzbWFzaywgbmJpdHM7IC8qIE51bWJlciBvZiBiaXRzIG9mIGEgY29sb3IgaW4gdGhlIGNvbXByZXNzZWQgc3RyZWFtICovCisKKyAgdW5zaWduZWQgaW50IHJlc2Vydm9pcjsKKyAgdW5zaWduZWQgaW50IG5iaXRzX2luX3Jlc2Vydm9pcjsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqc3RyZWFtOworICBpbnQgdGVtcF9jb2xvcnNbMTZdOworCisgIHVuc2lnbmVkIGNoYXIgdGFibGVfMDAwNF9wYXNzMVsxNl1bMTAyNF07CisgIHVuc2lnbmVkIGNoYXIgdGFibGVfMDAwNF9wYXNzMlsxNl1bMTAyNF07CisgIHVuc2lnbmVkIGNoYXIgdGFibGVfODAwNF9wYXNzMVsxNl1bMjU2XTsKKyAgdW5zaWduZWQgY2hhciB0YWJsZV84MDA0X3Bhc3MyWzE2XVsyNTZdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX3N1YmJsb2NrWzI1Nl1bMTJdOworCisgIHVuc2lnbmVkIGNoYXIgdGFibGVfYml0cG93ZXJtYXNrWzhdWzI1Nl07CisgIHVuc2lnbmVkIGludCAgdGFibGVfZDgwMFsyNTZdOworICB1bnNpZ25lZCBpbnQgIHRhYmxlX2RjMDBbMjU2XTsKKworfTsKKworCitpbnQgcHdjX2RlYzIzX2FsbG9jKHN0cnVjdCBwd2NfZGV2aWNlICpwd2MpOworaW50IHB3Y19kZWMyM19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsIGludCB0eXBlLCB1bnNpZ25lZCBjaGFyICpjbWQpOwordm9pZCBwd2NfZGVjMjNfZXhpdCh2b2lkKTsKK3ZvaWQgcHdjX2RlYzIzX2RlY29tcHJlc3MoY29uc3Qgc3RydWN0IHB3Y19kZXZpY2UgKnB3YywKKwkJCSAgY29uc3Qgdm9pZCAqc3JjLAorCQkJICB2b2lkICpkc3QsCisJCQkgIGludCBmbGFncyk7CisKKworCisjZW5kaWYKKworCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlmLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwppbmRleCA0MTQxODI5Li40N2QwZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KICAgIFVTQiBhbmQgVmlkZW80TGludXggaW50ZXJmYWNlIHBhcnQuCiAgICAoQykgMTk5OS0yMDA0IE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC02MiwxOCArNjIsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgInB3Yy5oIgotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgogI2luY2x1ZGUgInB3Yy1raWFyYS5oIgogI2luY2x1ZGUgInB3Yy10aW1vbi5oIgorI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCiAjaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgZHJpdmVyIHRlbXBsYXRlcyAqLwogCiAvKiBob3RwbHVnIGRldmljZSB0YWJsZSBzdXBwb3J0ICovCi1zdGF0aWMgc3RydWN0IHVzYl9kZXZpY2VfaWQgcHdjX2RldmljZV90YWJsZSBbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwd2NfZGV2aWNlX3RhYmxlIFtdID0gewogCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMwMikgfSwgLyogUGhpbGlwcyBtb2RlbHMgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzA0KSB9LApAQCAtODEsOSArODQsMTAgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMDgpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBDKSB9LAogCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMxMCkgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzExKSB9LCAvKiBQaGlsaXBzIFRvVWNhbSBQUk8gSUkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDcxLCAweDAzMTIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzEzKSB9LCAvKiB0aGUgJ25ldycgNzIwSyAqLworCXsgVVNCX0RFVklDRSgweDA0NzEsIDB4MDMyOSkgfSwgLyogUGhpbGlwcyBTUEMgOTAwTkMgUEMgQ2FtZXJhICovCiAJeyBVU0JfREVWSUNFKDB4MDY5QSwgMHgwMDAxKSB9LCAvKiBBc2tleSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCMCkgfSwgLyogTG9naXRlY2ggUXVpY2tDYW0gUHJvIDMwMDAgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDZELCAweDA4QjEpIH0sIC8qIExvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybyAqLwpAQCAtOTQsOCArOTgsOSBAQAogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNikgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCNykgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwogCXsgVVNCX0RFVklDRSgweDA0NkQsIDB4MDhCOCkgfSwgLyogTG9naXRlY2ggKHJlc2VydmVkKSAqLwotCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMCkgfSwgLyogU2Ftc3VuZyAqLwotCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNTVELCAweDkwMDApIH0sIC8qIFNhbXN1bmcgTVBDLUMxMCAqLworCXsgVVNCX0RFVklDRSgweDA1NUQsIDB4OTAwMSkgfSwgLyogU2Ftc3VuZyBNUEMtQzMwICovCisJeyBVU0JfREVWSUNFKDB4MDU1RCwgMHg5MDAyKSB9LAkvKiBTYW1zdW5nIFNOQy0zNUUgKFZlcjMuMCkgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDFFLCAweDQwMEMpIH0sIC8qIENyZWF0aXZlIFdlYmNhbSA1ICovCiAJeyBVU0JfREVWSUNFKDB4MDQxRSwgMHg0MDExKSB9LCAvKiBDcmVhdGl2ZSBXZWJjYW0gUHJvIEV4ICovCiAJeyBVU0JfREVWSUNFKDB4MDRDQywgMHg4MTE2KSB9LCAvKiBBZmluYSBFeWUgKi8KQEAgLTEyMiwxMSArMTI3LDEzIEBACiBzdGF0aWMgaW50IGRlZmF1bHRfc2l6ZSA9IFBTWl9RQ0lGOwogc3RhdGljIGludCBkZWZhdWx0X2ZwcyA9IDEwOwogc3RhdGljIGludCBkZWZhdWx0X2ZidWZzID0gMzsgICAvKiBEZWZhdWx0IG51bWJlciBvZiBmcmFtZSBidWZmZXJzICovCi1zdGF0aWMgaW50IGRlZmF1bHRfbWJ1ZnMgPSAyOwkvKiBEZWZhdWx0IG51bWJlciBvZiBtbWFwKCkgYnVmZmVycyAqLwotICAgICAgIGludCBwd2NfdHJhY2UgPSBUUkFDRV9NT0RVTEUgfCBUUkFDRV9GTE9XIHwgVFJBQ0VfUFdDWDsKKyAgICAgICBpbnQgcHdjX21idWZzID0gMjsJLyogRGVmYXVsdCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnMgKi8KKyNpZiBDT05GSUdfUFdDX0RFQlVHCisgICAgICAgaW50IHB3Y190cmFjZSA9IFBXQ19ERUJVR19MRVZFTDsKKyNlbmRpZgogc3RhdGljIGludCBwb3dlcl9zYXZlID0gMDsKIHN0YXRpYyBpbnQgbGVkX29uID0gMTAwLCBsZWRfb2ZmID0gMDsgLyogZGVmYXVsdHMgdG8gTEVEIHRoYXQgaXMgb24gd2hpbGUgaW4gdXNlICovCi1zdGF0aWMgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAyOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCitzdGF0aWMgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAxOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCiBzdGF0aWMgc3RydWN0IHsKIAlpbnQgdHlwZTsKIAljaGFyIHNlcmlhbF9udW1iZXJbMzBdOwpAQCAtMTM4LDcgKzE0NSw3IEBACiAKIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBwd2NfdmlkZW9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICogYnVmLAorc3RhdGljIHNzaXplX3QgcHdjX3ZpZGVvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCiAJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcHdjX3ZpZGVvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwogc3RhdGljIGludCAgcHdjX3ZpZGVvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTUzLDcgKzE2MCw2IEBACiAJLnBvbGwgPQkJcHdjX3ZpZGVvX3BvbGwsCiAJLm1tYXAgPQkJcHdjX3ZpZGVvX21tYXAsCiAJLmlvY3RsID0gICAgICAgIHB3Y192aWRlb19pb2N0bCwKLQkuY29tcGF0X2lvY3RsID0gdjRsX2NvbXBhdF9pb2N0bDMyLAogCS5sbHNlZWsgPSAgICAgICBub19sbHNlZWssCiB9Owogc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2UgcHdjX3RlbXBsYXRlID0gewpAQCAtMjAzLDUyICsyMDksNDQgQEAKIC8qIEhlcmUgd2Ugd2FudCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgogICogVGhpcyBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXJlYS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGt2aXJ0X3RvX3BhKHVuc2lnbmVkIGxvbmcgYWRyKQotewotCXVuc2lnbmVkIGxvbmcga3ZhLCByZXQ7CiAKLQlrdmEgPSAodW5zaWduZWQgbG9uZykgcGFnZV9hZGRyZXNzKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCWt2YSB8PSBhZHIgJiAoUEFHRV9TSVpFLTEpOyAvKiByZXN0b3JlIHRoZSBvZmZzZXQgKi8KLQlyZXQgPSBfX3BhKGt2YSk7Ci0JcmV0dXJuIHJldDsKLX0KIAotc3RhdGljIHZvaWQgKiBydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCisKK3N0YXRpYyB2b2lkICpwd2NfcnZtYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQogewogCXZvaWQgKiBtZW07CiAJdW5zaWduZWQgbG9uZyBhZHI7CiAKLQlzaXplPVBBR0VfQUxJR04oc2l6ZSk7CiAJbWVtPXZtYWxsb2NfMzIoc2l6ZSk7Ci0JaWYgKG1lbSkKLQl7Ci0JCW1lbXNldChtZW0sIDAsIHNpemUpOyAvKiBDbGVhciB0aGUgcmFtIG91dCwgbm8ganVuayB0byB0aGUgdXNlciAqLwotCQlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKLQkJd2hpbGUgKHNpemUgPiAwKQotCQl7Ci0JCQlTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7Ci0JCQlhZHIrPVBBR0VfU0laRTsKLQkJCXNpemUtPVBBR0VfU0laRTsKLQkJfQotCX0KKwlpZiAoIW1lbSkKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQobWVtLCAwLCBzaXplKTsgLyogQ2xlYXIgdGhlIHJhbSBvdXQsIG5vIGp1bmsgdG8gdGhlIHVzZXIgKi8KKwlhZHI9KHVuc2lnbmVkIGxvbmcpIG1lbTsKKwl3aGlsZSAoc2l6ZSA+IDApCisJIHsKKwkgICBTZXRQYWdlUmVzZXJ2ZWQodm1hbGxvY190b19wYWdlKCh2b2lkICopYWRyKSk7CisJICAgYWRyICArPSBQQUdFX1NJWkU7CisJICAgc2l6ZSAtPSBQQUdFX1NJWkU7CisJIH0KIAlyZXR1cm4gbWVtOwogfQogCi1zdGF0aWMgdm9pZCBydmZyZWUodm9pZCAqIG1lbSwgdW5zaWduZWQgbG9uZyBzaXplKQorc3RhdGljIHZvaWQgcHdjX3J2ZnJlZSh2b2lkICogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBhZHI7CiAKLQlpZiAobWVtKQotCXsKLQkJYWRyPSh1bnNpZ25lZCBsb25nKSBtZW07Ci0JCXdoaWxlICgobG9uZykgc2l6ZSA+IDApCi0JCXsKLQkJCUNsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCQkJYWRyKz1QQUdFX1NJWkU7Ci0JCQlzaXplLT1QQUdFX1NJWkU7Ci0JCX0KLQkJdmZyZWUobWVtKTsKLQl9CisJaWYgKCFtZW0pCisJCXJldHVybjsKKworCWFkcj0odW5zaWduZWQgbG9uZykgbWVtOworCXdoaWxlICgobG9uZykgc2l6ZSA+IDApCisJIHsKKwkgICBDbGVhclBhZ2VSZXNlcnZlZCh2bWFsbG9jX3RvX3BhZ2UoKHZvaWQgKilhZHIpKTsKKwkgICBhZHIgICs9IFBBR0VfU0laRTsKKwkgICBzaXplIC09IFBBR0VfU0laRTsKKwkgfQorCXZmcmVlKG1lbSk7CiB9CiAKIApAQCAtMjU2LDEwMCArMjU0LDgzIEBACiAKIHN0YXRpYyBpbnQgcHdjX2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0JaW50IGk7CisJaW50IGksIGVycjsKIAl2b2lkICprYnVmOwogCi0JVHJhY2UoVFJBQ0VfTUVNT1JZLCAiPj4gcHdjX2FsbG9jYXRlX2J1ZmZlcnMocGRldiA9IDB4JXApXG4iLCBwZGV2KTsKKwlQV0NfREVCVUdfTUVNT1JZKCI+PiBwd2NfYWxsb2NhdGVfYnVmZmVycyhwZGV2ID0gMHglcClcbiIsIHBkZXYpOwogCiAJaWYgKHBkZXYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotI2lmZGVmIFBXQ19NQUdJQwotCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKLQkJRXJyKCJhbGxvY2F0ZV9idWZmZXJzKCk6IG1hZ2ljIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLSNlbmRpZgotCS8qIEFsbG9jYXRlIElzb2Nocm9ub3VzIHBpcGUgYnVmZmVycyAqLworCS8qIEFsbG9jYXRlIElzb2Nocm9udW91cyBwaXBlIGJ1ZmZlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKIAkJaWYgKHBkZXYtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQlrYnVmID0ga21hbGxvYyhJU09fQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOworCQkJa2J1ZiA9IGt6YWxsb2MoSVNPX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChrYnVmID09IE5VTEwpIHsKLQkJCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBpc28gYnVmZmVyICVkLlxuIiwgaSk7CisJCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaXNvIGJ1ZmZlciAlZC5cbiIsIGkpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGlzbyBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwkJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBpc28gYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CiAJCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBrYnVmOwotCQkJbWVtc2V0KGtidWYsIDAsIElTT19CVUZGRVJfU0laRSk7CiAJCX0KIAl9CiAKIAkvKiBBbGxvY2F0ZSBmcmFtZSBidWZmZXIgc3RydWN0dXJlICovCiAJaWYgKHBkZXYtPmZidWYgPT0gTlVMTCkgewotCQlrYnVmID0ga21hbGxvYyhkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWtidWYgPSBremFsbG9jKGRlZmF1bHRfZmJ1ZnMgKiBzaXplb2Yoc3RydWN0IHB3Y19mcmFtZV9idWYpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJRXJyKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOworCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZS5cbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKKwkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciBzdHJ1Y3R1cmUgYXQgJXAuXG4iLCBrYnVmKTsKIAkJcGRldi0+ZmJ1ZiA9IGtidWY7Ci0JCW1lbXNldChrYnVmLCAwLCBkZWZhdWx0X2ZidWZzICogc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKSk7CiAJfQorCiAJLyogY3JlYXRlIGZyYW1lIGJ1ZmZlcnMsIGFuZCBtYWtlIGNpcmN1bGFyIHJpbmcgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7CiAJCWlmIChwZGV2LT5mYnVmW2ldLmRhdGEgPT0gTlVMTCkgewogCQkJa2J1ZiA9IHZtYWxsb2MoUFdDX0ZSQU1FX1NJWkUpOyAvKiBuZWVkIHZtYWxsb2Mgc2luY2UgZnJhbWUgYnVmZmVyID4gMTI4SyAqLwogCQkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZC5cbiIsIGkpOworCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZC5cbiIsIGkpOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIGtidWYpOworCQkJUFdDX0RFQlVHX01FTU9SWSgiQWxsb2NhdGVkIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIGtidWYpOwogCQkJcGRldi0+ZmJ1ZltpXS5kYXRhID0ga2J1ZjsKLQkJCW1lbXNldChrYnVmLCAxMjgsIFBXQ19GUkFNRV9TSVpFKTsKKwkJCW1lbXNldChrYnVmLCAwLCBQV0NfRlJBTUVfU0laRSk7CiAJCX0KIAl9CiAKIAkvKiBBbGxvY2F0ZSBkZWNvbXByZXNzb3IgdGFibGUgc3BhY2UgKi8KLQlrYnVmID0gTlVMTDsKLQlzd2l0Y2ggKHBkZXYtPnR5cGUpCi0JIHsKLQkgIGNhc2UgNjc1OgotCSAgY2FzZSA2ODA6Ci0JICBjYXNlIDY5MDoKLQkgIGNhc2UgNzIwOgotCSAgY2FzZSA3MzA6Ci0JICBjYXNlIDc0MDoKLQkgIGNhc2UgNzUwOgotI2lmIDAKLQkgICAgVHJhY2UoVFJBQ0VfTUVNT1JZLCJwcml2YXRlX2RhdGEoJXp1KVxuIixzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSk7Ci0JICAgIGtidWYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHdjX2RlYzIzX3ByaXZhdGUpLCBHRlBfS0VSTkVMKTsJLyogVGltb24gJiBLaWFyYSAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNjQ1OgotCSAgY2FzZSA2NDY6Ci0JICAgIC8qIFRPRE8gJiBGSVhNRSAqLwotCSAgICBrYnVmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHB3Y19kZWMyM19wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JICAgIGJyZWFrOwotI2VuZGlmCi0JOwotCSB9Ci0JcGRldi0+ZGVjb21wcmVzc19kYXRhID0ga2J1ZjsKKwlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpCisJCWVyciA9IHB3Y19kZWMxX2FsbG9jKHBkZXYpOworCWVsc2UKKwkJZXJyID0gcHdjX2RlYzIzX2FsbG9jKHBkZXYpOworCisJaWYgKGVycikgeworCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvbXByZXNzIHRhYmxlLlxuIik7CisJCXJldHVybiBlcnI7CisJfQogCiAJLyogQWxsb2NhdGUgaW1hZ2UgYnVmZmVyOyBkb3VibGUgYnVmZmVyIGZvciBtbWFwKCkgKi8KLQlrYnVmID0gcnZtYWxsb2MoZGVmYXVsdF9tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOworCWtidWYgPSBwd2NfcnZtYWxsb2MocHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7CiAJaWYgKGtidWYgPT0gTlVMTCkgewotCQlFcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBidWZmZXIocykuIG5lZWRlZCAoJWQpXG4iLGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgaW1hZ2UgYnVmZmVyKHMpLiBuZWVkZWQgKCVkKVxuIiwKKwkJCQlwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCVRyYWNlKFRSQUNFX01FTU9SWSwgIkFsbG9jYXRlZCBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBrYnVmKTsKKwlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7CiAJcGRldi0+aW1hZ2VfZGF0YSA9IGtidWY7Ci0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKLQkJcGRldi0+aW1hZ2VfcHRyW2ldID0ga2J1ZiArIGkgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCWZvciAoOyBpIDwgTUFYX0lNQUdFUzsgaSsrKQotCQlwZGV2LT5pbWFnZV9wdHJbaV0gPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBwd2NfbWJ1ZnM7IGkrKykgeworCQlwZGV2LT5pbWFnZXNbaV0ub2Zmc2V0ID0gaSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCXBkZXYtPmltYWdlc1tpXS52bWFfdXNlX2NvdW50ID0gMDsKKwl9CisJZm9yICg7IGkgPCBNQVhfSU1BR0VTOyBpKyspIHsKKwkJcGRldi0+aW1hZ2VzW2ldLm9mZnNldCA9IDA7CisJfQogCiAJa2J1ZiA9IE5VTEw7CiAKLQlUcmFjZShUUkFDRV9NRU1PUlksICI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKKwlQV0NfREVCVUdfTUVNT1JZKCI8PCBwd2NfYWxsb2NhdGVfYnVmZmVycygpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzU3LDIxICszMzgsMTQgQEAKIHsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX01FTU9SWSwgIkVudGVyaW5nIGZyZWVfYnVmZmVycyglcCkuXG4iLCBwZGV2KTsKKwlQV0NfREVCVUdfTUVNT1JZKCJFbnRlcmluZyBmcmVlX2J1ZmZlcnMoJXApLlxuIiwgcGRldik7CiAKIAlpZiAocGRldiA9PSBOVUxMKQogCQlyZXR1cm47Ci0jaWZkZWYgUFdDX01BR0lDCi0JaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgewotCQlFcnIoImZyZWVfYnVmZmVycygpOiBtYWdpYyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCiAJLyogUmVsZWFzZSBJc28tcGlwZSBidWZmZXJzICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKQogCQlpZiAocGRldi0+c2J1ZltpXS5kYXRhICE9IE5VTEwpIHsKLQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgSVNPIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPnNidWZbaV0uZGF0YSk7CisJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIElTTyBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5zYnVmW2ldLmRhdGEpOwogCQkJa2ZyZWUocGRldi0+c2J1ZltpXS5kYXRhKTsKIAkJCXBkZXYtPnNidWZbaV0uZGF0YSA9IE5VTEw7CiAJCX0KQEAgLTM4MCw3ICszNTQsNyBAQAogCWlmIChwZGV2LT5mYnVmICE9IE5VTEwpIHsKIAkJZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfZmJ1ZnM7IGkrKykgewogCQkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSAhPSBOVUxMKSB7Ci0JCQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBmcmFtZSBidWZmZXIgJWQgYXQgJXAuXG4iLCBpLCBwZGV2LT5mYnVmW2ldLmRhdGEpOworCQkJCVBXQ19ERUJVR19NRU1PUlkoIkZyZWVpbmcgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwgcGRldi0+ZmJ1ZltpXS5kYXRhKTsKIAkJCQl2ZnJlZShwZGV2LT5mYnVmW2ldLmRhdGEpOwogCQkJCXBkZXYtPmZidWZbaV0uZGF0YSA9IE5VTEw7CiAJCQl9CkBAIC0zOTEsMjAgKzM2NSwxOSBAQAogCiAJLyogSW50ZXJtZWRpYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICYgdGFibGVzICovCiAJaWYgKHBkZXYtPmRlY29tcHJlc3NfZGF0YSAhPSBOVUxMKSB7Ci0JCVRyYWNlKFRSQUNFX01FTU9SWSwgIkZyZWVpbmcgZGVjb21wcmVzc2lvbiBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5kZWNvbXByZXNzX2RhdGEpOworCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGRlY29tcHJlc3Npb24gYnVmZmVyIGF0ICVwLlxuIiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAkJa2ZyZWUocGRldi0+ZGVjb21wcmVzc19kYXRhKTsKIAkJcGRldi0+ZGVjb21wcmVzc19kYXRhID0gTlVMTDsKIAl9Ci0JcGRldi0+ZGVjb21wcmVzc29yID0gTlVMTDsKIAogCS8qIFJlbGVhc2UgaW1hZ2UgYnVmZmVycyAqLwogCWlmIChwZGV2LT5pbWFnZV9kYXRhICE9IE5VTEwpIHsKLQkJVHJhY2UoVFJBQ0VfTUVNT1JZLCAiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKLQkJcnZmcmVlKHBkZXYtPmltYWdlX2RhdGEsIGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKKwkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBpbWFnZSBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5pbWFnZV9kYXRhKTsKKwkJcHdjX3J2ZnJlZShwZGV2LT5pbWFnZV9kYXRhLCBwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKIAl9CiAJcGRldi0+aW1hZ2VfZGF0YSA9IE5VTEw7CiAKLQlUcmFjZShUUkFDRV9NRU1PUlksICJMZWF2aW5nIGZyZWVfYnVmZmVycygpLlxuIik7CisJUFdDX0RFQlVHX01FTU9SWSgiTGVhdmluZyBmcmVlX2J1ZmZlcnMoKS5cbiIpOwogfQogCiAvKiBUaGUgZnJhbWUgJiBpbWFnZSBidWZmZXIgbWVzcy4KQEAgLTQ2NCw3ICs0MzcsNyBAQAogLyoqCiAgIFxicmllZiBGaW5kIG5leHQgZnJhbWUgYnVmZmVyIHRvIGZpbGwuIFRha2UgZnJvbSBlbXB0eSBvciBmdWxsIGxpc3QsIHdoaWNoZXZlciBjb21lcyBmaXJzdC4KICAqLwotc3RhdGljIGlubGluZSBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC00ODksMjMgKzQ2MiwxNyBAQAogCX0KIAllbHNlIHsKIAkJLyogSG1tLiBUYWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCAqLwotI2lmIFBXQ19ERUJVRwogCQkvKiBzYW5pdHkgY2hlY2sgKi8KIAkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJCUVycigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKKwkJCVBXQ19FUlJPUigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0jZW5kaWYKIAkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOwogCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZ1bGxfZnJhbWVzLT5uZXh0OwogCQlyZXQgPSAxOwogCX0KIAlwZGV2LT5maWxsX2ZyYW1lLT5uZXh0ID0gTlVMTDsKLSNpZiBQV0NfREVCVUcKLQlUcmFjZShUUkFDRV9TRVFVRU5DRSwgIkFzc2lnbmluZyBzZXF1ZW5jZSBudW1iZXIgJWQuXG4iLCBwZGV2LT5zZXF1ZW5jZSk7Ci0JcGRldi0+ZmlsbF9mcmFtZS0+c2VxdWVuY2UgPSBwZGV2LT5zZXF1ZW5jZSsrOwotI2VuZGlmCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwogCXJldHVybiByZXQ7CiB9CkBAIC01MjEsNiArNDg4LDggQEAKIAlpbnQgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJUFdDX0RFQlVHX01FTU9SWSgiPj4gJXMgX19lbnRlcl9fXG4iLCBfX0ZVTkNUSU9OX18pOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAlwZGV2LT5mdWxsX2ZyYW1lcyA9IE5VTEw7CiAJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IE5VTEw7CkBAIC01NDAsMTMgKzUwOSwxNSBAQAogCXBkZXYtPmltYWdlX3JlYWRfcG9zID0gMDsKIAlwZGV2LT5maWxsX2ltYWdlID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisKKwlQV0NfREVCVUdfTUVNT1JZKCI8PCAlcyBfX2xlYXZpbmdfX1xuIiwgX19GVU5DVElPTl9fKTsKIH0KIAogCiAvKioKICAgXGJyaWVmIERvIGFsbCB0aGUgaGFuZGxpbmcgZm9yIGdldHRpbmcgb25lIGZyYW1lOiBnZXQgcG9pbnRlciwgZGVjb21wcmVzcywgYWR2YW5jZSBwb2ludGVycy4KICAqLwotc3RhdGljIGludCBwd2NfaGFuZGxlX2ZyYW1lKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoraW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTU1Niw0MSArNTI3LDQwIEBACiAJICAgd2UgY2FuIHJlbGVhc2UgdGhlIGxvY2sgYWZ0ZXIgdGhpcyB3aXRob3V0IHByb2JsZW1zICovCiAJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgewogCQkvKiBUaGlzIGNhbid0IHRoZW9yZXRpY2FsbHkgaGFwcGVuICovCi0JCUVycigiSHVoPyBSZWFkIGZyYW1lIHN0aWxsIGluIHVzZT9cbiIpOworCQlQV0NfRVJST1IoIkh1aD8gUmVhZCBmcmFtZSBzdGlsbCBpbiB1c2U/XG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCisJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKKwkJUFdDX0VSUk9SKCJXb29wcy4gTm8gZnJhbWVzIHJlYWR5LlxuIik7CiAJfQogCWVsc2UgewotCQlpZiAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQkJRXJyKCJXb29wcy4gTm8gZnJhbWVzIHJlYWR5LlxuIik7CisJCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKKwkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKKwkJcGRldi0+cmVhZF9mcmFtZS0+bmV4dCA9IE5VTEw7CisJfQorCisJaWYgKHBkZXYtPnJlYWRfZnJhbWUgIT0gTlVMTCkgeworCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ2h0eSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCisJCSAgIFRoaXMgZ2l2ZXMgdGhlIGlzb2NfaGFuZGxlciB0aGUgb3Bwb3J0dW5pdHkgdG8gZmlsbCBtb3JlIGZyYW1lcworCQkgICBpbiB0aGUgbWVhbiB0aW1lLgorCQkqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7CisJCXJldCA9IHB3Y19kZWNvbXByZXNzKHBkZXYpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOworCisJCS8qIFdlJ3JlIGRvbmUgd2l0aCByZWFkX2J1ZmZlciwgdGFjayBpdCB0byB0aGUgZW5kIG9mIHRoZSBlbXB0eSBidWZmZXIgbGlzdCAqLworCQlpZiAocGRldi0+ZW1wdHlfZnJhbWVzID09IE5VTEwpIHsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7CisJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbCA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKIAkJfQogCQllbHNlIHsKLQkJCXBkZXYtPnJlYWRfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZnVsbF9mcmFtZXMtPm5leHQ7Ci0JCQlwZGV2LT5yZWFkX2ZyYW1lLT5uZXh0ID0gTlVMTDsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsLT5uZXh0ID0gcGRldi0+cmVhZF9mcmFtZTsKKwkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+cmVhZF9mcmFtZTsKIAkJfQotCi0JCWlmIChwZGV2LT5yZWFkX2ZyYW1lICE9IE5VTEwpIHsKLSNpZiBQV0NfREVCVUcKLQkJCVRyYWNlKFRSQUNFX1NFUVVFTkNFLCAiRGVjb21wcmVzc2luZyBmcmFtZSAlZFxuIiwgcGRldi0+cmVhZF9mcmFtZS0+c2VxdWVuY2UpOwotI2VuZGlmCi0JCQkvKiBEZWNvbXByZXNzaW9uIGlzIGEgbGVuZ2h0eSBwcm9jZXNzLCBzbyBpdCdzIG91dHNpZGUgb2YgdGhlIGxvY2suCi0JCQkgICBUaGlzIGdpdmVzIHRoZSBpc29jX2hhbmRsZXIgdGhlIG9wcG9ydHVuaXR5IHRvIGZpbGwgbW9yZSBmcmFtZXMKLQkJCSAgIGluIHRoZSBtZWFuIHRpbWUuCi0JCQkqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCQkJcmV0ID0gcHdjX2RlY29tcHJlc3MocGRldik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCi0JCQkvKiBXZSdyZSBkb25lIHdpdGggcmVhZF9idWZmZXIsIHRhY2sgaXQgdG8gdGhlIGVuZCBvZiB0aGUgZW1wdHkgYnVmZmVyIGxpc3QgKi8KLQkJCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgPT0gTlVMTCkgewotCQkJCXBkZXYtPmVtcHR5X2ZyYW1lcyA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5lbXB0eV9mcmFtZXM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwZGV2LT5lbXB0eV9mcmFtZXNfdGFpbC0+bmV4dCA9IHBkZXYtPnJlYWRfZnJhbWU7Ci0JCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCQkJfQotCQkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7Ci0JCX0KKwkJcGRldi0+cmVhZF9mcmFtZSA9IE5VTEw7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtNTk5LDEyICs1NjksMTE0IEBACiAvKioKICAgXGJyaWVmIEFkdmFuY2UgcG9pbnRlcnMgb2YgaW1hZ2UgYnVmZmVyIChhZnRlciBlYWNoIHVzZXIgcmVxdWVzdCkKICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcHdjX25leHRfaW1hZ2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCit2b2lkIHB3Y19uZXh0X2ltYWdlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewogCXBkZXYtPmltYWdlX3VzZWRbcGRldi0+ZmlsbF9pbWFnZV0gPSAwOwotCXBkZXYtPmZpbGxfaW1hZ2UgPSAocGRldi0+ZmlsbF9pbWFnZSArIDEpICUgZGVmYXVsdF9tYnVmczsKKwlwZGV2LT5maWxsX2ltYWdlID0gKHBkZXYtPmZpbGxfaW1hZ2UgKyAxKSAlIHB3Y19tYnVmczsKIH0KIAorLyoqCisgKiBQcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aGVuIGEgZnJhbWUgaXMgZGlzY2FyZGVkIGJlY2F1c2UgYWxsIG9mIG91ciBidWZmZXIKKyAqIGlzIGZ1bGwKKyAqLworc3RhdGljIHZvaWQgcHdjX2ZyYW1lX2R1bXBlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOworCWlmIChwZGV2LT52ZnJhbWVfY291bnQgPCBGUkFNRV9MT1dNQVJLKQorCQlyZXR1cm47CisKKwlpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPCAyMCkKKwkJUFdDX0RFQlVHX0ZMT1coIkR1bXBpbmcgZnJhbWUgJWRcbiIsIHBkZXYtPnZmcmFtZV9jb3VudCk7CisJZWxzZSBpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPT0gMjApCisJCVBXQ19ERUJVR19GTE9XKCJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpXG4iLAorCQkJCXBkZXYtPnZmcmFtZV9jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgcHdjX3Jjdl9zaG9ydF9wYWNrZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGNvbnN0IHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmKQoreworCWludCBhd2FrZSA9IDA7CisKKwkvKiBUaGUgVG9VQ2FtIEZ1biBDTU9TIHNlbnNvciBjYXVzZXMgdGhlIGZpcm13YXJlIHRvIHNlbmQgMiBvciAzIGJvZ3VzCisJICAgZnJhbWVzIG9uIHRoZSBVU0Igd2lyZSBhZnRlciBhbiBleHBvc3VyZSBjaGFuZ2UuIFRoaXMgY29uZGl0aXRpb24gaXMKKwkgICBob3dldmVyIGRldGVjdGVkICBpbiB0aGUgY2FtIGFuZCBhIGJpdCBpcyBzZXQgaW4gdGhlIGhlYWRlci4KKwkgICAqLworCWlmIChwZGV2LT50eXBlID09IDczMCkgeworCQl1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKWZidWYtPmRhdGE7CisKKwkJaWYgKHB0clsxXSA9PSAxICYmIHB0clswXSAmIDB4MTApIHsKKwkJCVBXQ19UUkFDRSgiSHl1bmRhaSBDTU9TIHNlbnNvciBidWcuIERyb3BwaW5nIGZyYW1lLlxuIik7CisJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOworCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOworCQl9CisJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7CisJCQlpZiAocHRyWzBdICYgMHgwMSkgeworCQkJCXBkZXYtPnNuYXBzaG90X2J1dHRvbl9zdGF0dXMgPSAxOworCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHByZXNzZWQuXG4iKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHJlbGVhc2VkLlxuIik7CisJCQl9CisJCX0KKwkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDIpIHsKKwkJCWlmIChwdHJbMF0gJiAweDAyKQorCQkJCVBXQ19UUkFDRSgiSW1hZ2UgaXMgbWlycm9yZWQuXG4iKTsKKwkJCWVsc2UKKwkJCQlQV0NfVFJBQ0UoIkltYWdlIGlzIG5vcm1hbC5cbiIpOworCQl9CisJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOworCQkvKiBTb21ldGltZXMgdGhlIHRyYWlsZXIgb2YgdGhlIDczMCBpcyBzdGlsbCBzZW50IGFzIGEgNCBieXRlIHBhY2tldAorCQkgICBhZnRlciBhIHNob3J0IGZyYW1lOyB0aGlzIGNvbmRpdGlvbiBpcyBmaWx0ZXJlZCBvdXQgc3BlY2lmaWNhbGx5LiBBIDQgYnl0ZQorCQkgICBmcmFtZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55d2F5LgorCQkgICBTbyB3ZSBnZXQgZWl0aGVyIHRoaXMgc2VxdWVuY2U6CisJCSAgIGRyb3BfYml0IHNldCAtPiA0IGJ5dGUgZnJhbWUgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQorCQkgICBPciB0aGlzIG9uZToKKwkJICAgZHJvcF9iaXQgc2V0IC0+IHNob3J0IGZyYW1lIC0+IGdvb2QgZnJhbWUKKwkJICAgU28gd2UgZHJvcCBlaXRoZXIgMyBvciAyIGZyYW1lcyBpbiBhbGwhCisJCSAgICovCisJCWlmIChmYnVmLT5maWxsZWQgPT0gNCkKKwkJCXBkZXYtPmRyb3BfZnJhbWVzKys7CisJfQorCWVsc2UgaWYgKHBkZXYtPnR5cGUgPT0gNzQwIHx8IHBkZXYtPnR5cGUgPT0gNzIwKSB7CisJCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZmJ1Zi0+ZGF0YTsKKwkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDEpIHsKKwkJCWlmIChwdHJbMF0gJiAweDAxKSB7CisJCQkJcGRldi0+c25hcHNob3RfYnV0dG9uX3N0YXR1cyA9IDE7CisJCQkJUFdDX1RSQUNFKCJTbmFwc2hvdCBidXR0b24gcHJlc3NlZC5cbiIpOworCQkJfQorCQkJZWxzZQorCQkJCVBXQ19UUkFDRSgiU25hcHNob3QgYnV0dG9uIHJlbGVhc2VkLlxuIik7CisJCX0KKwkJcGRldi0+dm1pcnJvciA9IHB0clswXSAmIDB4MDM7CisJfQorCisJLyogSW4gY2FzZSB3ZSB3ZXJlIGluc3RydWN0ZWQgdG8gZHJvcCB0aGUgZnJhbWUsIGRvIHNvIHNpbGVudGx5LgorCSAgIFRoZSBidWZmZXIgcG9pbnRlcnMgYXJlIG5vdCB1cGRhdGVkIGVpdGhlciAoYnV0IHRoZSBjb3VudGVycyBhcmUgcmVzZXQgYmVsb3cpLgorCSAgICovCisJaWYgKHBkZXYtPmRyb3BfZnJhbWVzID4gMCkKKwkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKKwllbHNlIHsKKwkJLyogQ2hlY2sgZm9yIHVuZGVyZmxvdyBmaXJzdCAqLworCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgeworCQkJUFdDX0RFQlVHX0ZMT1coIkZyYW1lIGJ1ZmZlciB1bmRlcmZsb3cgKCVkIGJ5dGVzKTsiCisJCQkJICAgICAgICIgZGlzY2FyZGVkLlxuIiwgZmJ1Zi0+ZmlsbGVkKTsKKwkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKKwkJfQorCQllbHNlIHsKKwkJCS8qIFNlbmQgb25seSBvbmNlIHBlciBFT0YgKi8KKwkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KKworCQkJLyogRmluZCBvdXIgbmV4dCBmcmFtZSB0byBmaWxsLiBUaGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQsIHNpbmNlIHdlCisJCQkgKiBuaWNrIGEgZnJhbWUgZnJvbSBlaXRoZXIgZW1wdHkgb3IgZnVsbCBsaXN0LCBidXQgaWYgd2UgaGFkIHRvCisJCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KKwkJCSAqLworCQkJaWYgKHB3Y19uZXh0X2ZpbGxfZnJhbWUocGRldikpCisJCQkJcHdjX2ZyYW1lX2R1bXBlZChwZGV2KTsKKworCQl9CisJfSAvKiAhZHJvcF9mcmFtZXMgKi8KKwlwZGV2LT52ZnJhbWVfY291bnQrKzsKKwlyZXR1cm4gYXdha2U7Cit9CiAKIC8qIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIHRoZSBJc29jaHJvbm91cyBwaXBlICh2aWRlbykuIFRoaXMgaXMgZG9uZSBpbgogICogaW50ZXJydXB0IHRpbWUsIHNvIGl0IGhhcyB0byBiZSBmYXN0LCBub3QgY3Jhc2gsIGFuZCBub3Qgc3RhbGwuIE5lYXQuCkBAIC02MjAsMTcgKzY5MiwxMiBAQAogCWF3YWtlID0gMDsKIAlwZGV2ID0gKHN0cnVjdCBwd2NfZGV2aWNlICopdXJiLT5jb250ZXh0OwogCWlmIChwZGV2ID09IE5VTEwpIHsKLQkJRXJyKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKKwkJUFdDX0VSUk9SKCJpc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBOVUxMIGRldmljZT8hXG4iKTsKIAkJcmV0dXJuOwogCX0KLSNpZmRlZiBQV0NfTUFHSUMKLQlpZiAocGRldi0+bWFnaWMgIT0gUFdDX01BR0lDKSB7Ci0JCUVycigiaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggYmFkIG1hZ2ljIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKKwogCWlmICh1cmItPnN0YXR1cyA9PSAtRU5PRU5UIHx8IHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCVRyYWNlKFRSQUNFX09QRU4sICJwd2NfaXNvY19oYW5kbGVyKCk6IFVSQiAoJXApIHVubGlua2VkICVzc3luY2hyb251b3VzbHkuXG4iLCB1cmIsIHVyYi0+c3RhdHVzID09IC1FTk9FTlQgPyAiIiA6ICJhIik7CisJCVBXQ19ERUJVR19PUEVOKCJVUkIgKCVwKSB1bmxpbmtlZCAlc3N5bmNocm9udW91c2x5LlxuIiwgdXJiLCB1cmItPnN0YXR1cyA9PSAtRU5PRU5UID8gIiIgOiAiYSIpOwogCQlyZXR1cm47CiAJfQogCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MgJiYgdXJiLT5zdGF0dXMgIT0gMCkgewpAQCAtNjQ1LDEzICs3MTIsMTMgQEAKIAkJCWNhc2UgLUVJTFNFUToJCWVycm1zZyA9ICJDUkMvVGltZW91dCAoY291bGQgYmUgYW55dGhpbmcpIjsgYnJlYWs7CiAJCQljYXNlIC1FVElNRURPVVQ6CWVycm1zZyA9ICJOQUsgKGRldmljZSBkb2VzIG5vdCByZXNwb25kKSI7IGJyZWFrOwogCQl9Ci0JCVRyYWNlKFRSQUNFX0ZMT1csICJwd2NfaXNvY19oYW5kbGVyKCkgY2FsbGVkIHdpdGggc3RhdHVzICVkIFslc10uXG4iLCB1cmItPnN0YXR1cywgZXJybXNnKTsKKwkJUFdDX0RFQlVHX0ZMT1coInB3Y19pc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBzdGF0dXMgJWQgWyVzXS5cbiIsIHVyYi0+c3RhdHVzLCBlcnJtc2cpOwogCQkvKiBHaXZlIHVwIGFmdGVyIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZXJyb3JzIG9uIHRoZSBVU0IgYnVzLgogCQkgICBBcHBlYXJhbnRseSBzb21ldGhpbmcgaXMgd3Jvbmcgc28gd2Ugc2ltdWxhdGUgYW4gdW5wbHVnIGV2ZW50LgogCQkgKi8KIAkJaWYgKCsrcGRldi0+dmlzb2NfZXJyb3JzID4gTUFYX0lTT0NfRVJST1JTKQogCQl7Ci0JCQlJbmZvKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKKwkJCVBXQ19JTkZPKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKIAkJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVJTzsKIAkJCWF3YWtlID0gMTsKIAkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGRldi0+ZnJhbWVxKTsKQEAgLTY2MSw3ICs3MjgsNyBAQAogCiAJZmJ1ZiA9IHBkZXYtPmZpbGxfZnJhbWU7CiAJaWYgKGZidWYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19pc29jX2hhbmRsZXIgd2l0aG91dCB2YWxpZCBmaWxsIGZyYW1lLlxuIik7CisJCVBXQ19FUlJPUigicHdjX2lzb2NfaGFuZGxlciB3aXRob3V0IHZhbGlkIGZpbGwgZnJhbWUuXG4iKTsKIAkJYXdha2UgPSAxOwogCQlnb3RvIGhhbmRsZXJfZW5kOwogCX0KQEAgLTY4OCw3ICs3NTUsNyBAQAogCiAJCQkJCS8qIC4uLmNvcHkgZGF0YSB0byBmcmFtZSBidWZmZXIsIGlmIHBvc3NpYmxlICovCiAJCQkJCWlmIChmbGVuICsgZmJ1Zi0+ZmlsbGVkID4gcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewotCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkZyYW1lIGJ1ZmZlciBvdmVyZmxvdyAoZmxlbiA9ICVkLCBmcmFtZV90b3RhbF9zaXplID0gJWQpLlxuIiwgZmxlbiwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSk7CisJCQkJCQlQV0NfREVCVUdfRkxPVygiRnJhbWUgYnVmZmVyIG92ZXJmbG93IChmbGVuID0gJWQsIGZyYW1lX3RvdGFsX3NpemUgPSAlZCkuXG4iLCBmbGVuLCBwZGV2LT5mcmFtZV90b3RhbF9zaXplKTsKIAkJCQkJCXBkZXYtPnZzeW5jID0gMDsgLyogSG1tLCBsZXQncyB3YWl0IGZvciBhbiBFT0YgKGVuZC1vZi1mcmFtZSkgKi8KIAkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKIAkJCQkJfQpAQCAtNzA0LDk2ICs3NzEsMjggQEAKIAkJCQkvKiBTaG9ydGVyIHBhY2tldC4uLiBXZSBwcm9iYWJseSBoYXZlIHRoZSBlbmQgb2YgYW4gaW1hZ2UtZnJhbWU7CiAJCQkJICAgd2FrZSB1cCByZWFkKCkgcHJvY2VzcyBhbmQgbGV0IHNlbGVjdCgpL3BvbGwoKSBkbyBzb21ldGhpbmcuCiAJCQkJICAgRGVjb21wcmVzc2lvbiBpcyBkb25lIGluIHVzZXIgdGltZSBvdmVyIHRoZXJlLgotCQkJCSAqLworCQkJCSAgICovCiAJCQkJaWYgKHBkZXYtPnZzeW5jID09IDIpIHsKLQkJCQkJLyogVGhlIFRvVUNhbSBGdW4gQ01PUyBzZW5zb3IgY2F1c2VzIHRoZSBmaXJtd2FyZSB0byBzZW5kIDIgb3IgMyBib2d1cwotCQkJCQkgICBmcmFtZXMgb24gdGhlIFVTQiB3aXJlIGFmdGVyIGFuIGV4cG9zdXJlIGNoYW5nZS4gVGhpcyBjb25kaXRpdGlvbiBpcwotCQkJCQkgICBob3dldmVyIGRldGVjdGVkICBpbiB0aGUgY2FtIGFuZCBhIGJpdCBpcyBzZXQgaW4gdGhlIGhlYWRlci4KLQkJCQkJICovCi0JCQkJCWlmIChwZGV2LT50eXBlID09IDczMCkgewotCQkJCQkJdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKilmYnVmLT5kYXRhOwotCi0JCQkJCQlpZiAocHRyWzFdID09IDEgJiYgcHRyWzBdICYgMHgxMCkgewotI2lmIFBXQ19ERUJVRwotCQkJCQkJCURlYnVnKCJIeXVuZGFpIENNT1Mgc2Vuc29yIGJ1Zy4gRHJvcHBpbmcgZnJhbWUgJWQuXG4iLCBmYnVmLT5zZXF1ZW5jZSk7Ci0jZW5kaWYKLQkJCQkJCQlwZGV2LT5kcm9wX2ZyYW1lcyArPSAyOwotCQkJCQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKLQkJCQkJCX0KLQkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAxKSB7Ci0JCQkJCQkJaWYgKHB0clswXSAmIDB4MDEpCi0JCQkJCQkJCUluZm8oIlNuYXBzaG90IGJ1dHRvbiBwcmVzc2VkLlxuIik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlJbmZvKCJTbmFwc2hvdCBidXR0b24gcmVsZWFzZWQuXG4iKTsKLQkJCQkJCX0KLQkJCQkJCWlmICgocHRyWzBdIF4gcGRldi0+dm1pcnJvcikgJiAweDAyKSB7Ci0JCQkJCQkJaWYgKHB0clswXSAmIDB4MDIpCi0JCQkJCQkJCUluZm8oIkltYWdlIGlzIG1pcnJvcmVkLlxuIik7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlJbmZvKCJJbWFnZSBpcyBub3JtYWwuXG4iKTsKLQkJCQkJCX0KLQkJCQkJCXBkZXYtPnZtaXJyb3IgPSBwdHJbMF0gJiAweDAzOwotCQkJCQkJLyogU29tZXRpbWVzIHRoZSB0cmFpbGVyIG9mIHRoZSA3MzAgaXMgc3RpbGwgc2VudCBhcyBhIDQgYnl0ZSBwYWNrZXQKLQkJCQkJCSAgIGFmdGVyIGEgc2hvcnQgZnJhbWU7IHRoaXMgY29uZGl0aW9uIGlzIGZpbHRlcmVkIG91dCBzcGVjaWZpY2FsbHkuIEEgNCBieXRlCi0JCQkJCQkgICBmcmFtZSBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55d2F5LgotCQkJCQkJICAgU28gd2UgZ2V0IGVpdGhlciB0aGlzIHNlcXVlbmNlOgotCQkJCQkJCWRyb3BfYml0IHNldCAtPiA0IGJ5dGUgZnJhbWUgLT4gc2hvcnQgZnJhbWUgLT4gZ29vZCBmcmFtZQotCQkJCQkJICAgT3IgdGhpcyBvbmU6Ci0JCQkJCQkJZHJvcF9iaXQgc2V0IC0+IHNob3J0IGZyYW1lIC0+IGdvb2QgZnJhbWUKLQkJCQkJCSAgIFNvIHdlIGRyb3AgZWl0aGVyIDMgb3IgMiBmcmFtZXMgaW4gYWxsIQotCQkJCQkJICovCi0JCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkID09IDQpCi0JCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMrKzsKKwkJCQkJaWYgKHB3Y19yY3Zfc2hvcnRfcGFja2V0KHBkZXYsIGZidWYpKSB7CisJCQkJCQlhd2FrZSA9IDE7CisJCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKIAkJCQkJfQotCi0JCQkJCS8qIEluIGNhc2Ugd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIGRyb3AgdGhlIGZyYW1lLCBkbyBzbyBzaWxlbnRseS4KLQkJCQkJICAgVGhlIGJ1ZmZlciBwb2ludGVycyBhcmUgbm90IHVwZGF0ZWQgZWl0aGVyIChidXQgdGhlIGNvdW50ZXJzIGFyZSByZXNldCBiZWxvdykuCi0JCQkJCSAqLwotCQkJCQlpZiAocGRldi0+ZHJvcF9mcmFtZXMgPiAwKQotCQkJCQkJcGRldi0+ZHJvcF9mcmFtZXMtLTsKLQkJCQkJZWxzZSB7Ci0JCQkJCQkvKiBDaGVjayBmb3IgdW5kZXJmbG93IGZpcnN0ICovCi0JCQkJCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewotCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJGcmFtZSBidWZmZXIgdW5kZXJmbG93ICglZCBieXRlcyk7IGRpc2NhcmRlZC5cbiIsIGZidWYtPmZpbGxlZCk7Ci0JCQkJCQkJcGRldi0+dmZyYW1lc19lcnJvcisrOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLyogU2VuZCBvbmx5IG9uY2UgcGVyIEVPRiAqLwotCQkJCQkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KLQotCQkJCQkJCS8qIEZpbmQgb3VyIG5leHQgZnJhbWUgdG8gZmlsbC4gVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkLCBzaW5jZSB3ZQotCQkJCQkJCSAqIG5pY2sgYSBmcmFtZSBmcm9tIGVpdGhlciBlbXB0eSBvciBmdWxsIGxpc3QsIGJ1dCBpZiB3ZSBoYWQgdG8KLQkJCQkJCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KLQkJCQkJCQkgKi8KLQkJCQkJCQlpZiAocHdjX25leHRfZmlsbF9mcmFtZShwZGV2KSkgewotCQkJCQkJCQlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOwotCQkJCQkJCQlpZiAoKHBkZXYtPnZmcmFtZV9jb3VudCA+IEZSQU1FX0xPV01BUkspICYmIChwd2NfdHJhY2UgJiBUUkFDRV9GTE9XKSkgewotCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkIDwgMjApCi0JCQkJCQkJCQkJVHJhY2UoVFJBQ0VfRkxPVywgIkR1bXBpbmcgZnJhbWUgJWQuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQpOwotCQkJCQkJCQkJaWYgKHBkZXYtPnZmcmFtZXNfZHVtcGVkID09IDIwKQotCQkJCQkJCQkJCVRyYWNlKFRSQUNFX0ZMT1csICJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJCQkJCX0KLQkJCQkJfSAvKiAhZHJvcF9mcmFtZXMgKi8KLQkJCQkJcGRldi0+dmZyYW1lX2NvdW50Kys7CiAJCQkJfQogCQkJCWZidWYtPmZpbGxlZCA9IDA7CiAJCQkJZmlsbHB0ciA9IGZidWYtPmRhdGE7CiAJCQkJcGRldi0+dnN5bmMgPSAxOwotCQkJfSAvKiAuLiBmbGVuIDwgbGFzdF9wYWNrZXRfc2l6ZSAqLworCQkJfQorCiAJCQlwZGV2LT52bGFzdF9wYWNrZXRfc2l6ZSA9IGZsZW47CiAJCX0gLyogLi5zdGF0dXMgPT0gMCAqLwotI2lmIFBXQ19ERUJVRwotCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzIHlvdSBhcmUgcmVhbGx5IGRlYnVnZ2luZyBzb21ldGhpbmcgKi8KIAkJZWxzZSB7CisJCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzCisJCQkgKiB5b3UgYXJlIHJlYWxseSBkZWJ1Z2dpbmcgc29tZXRoaW5nICovCiAJCQlzdGF0aWMgaW50IGlzb19lcnJvciA9IDA7CiAJCQlpc29fZXJyb3IrKzsKIAkJCWlmIChpc29fZXJyb3IgPCAyMCkKLQkJCQlUcmFjZShUUkFDRV9GTE9XLCAiSXNvIGZyYW1lICVkIG9mIFVTQiBoYXMgZXJyb3IgJWRcbiIsIGksIGZzdCk7CisJCQkJUFdDX0RFQlVHX0ZMT1coIklzbyBmcmFtZSAlZCBvZiBVU0IgaGFzIGVycm9yICVkXG4iLCBpLCBmc3QpOwogCQl9Ci0jZW5kaWYKIAl9CiAKIGhhbmRsZXJfZW5kOgpAQCAtODAzLDExICs4MDIsMTEgQEAKIAl1cmItPmRldiA9IHBkZXYtPnVkZXY7CiAJaSA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKGkgIT0gMCkKLQkJRXJyKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKKwkJUFdDX0VSUk9SKCJFcnJvciAoJWQpIHJlLXN1Ym1pdHRpbmcgdXJiIGluIHB3Y19pc29jX2hhbmRsZXIuXG4iLCBpKTsKIH0KIAogCi1zdGF0aWMgaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitpbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKIAlzdHJ1Y3QgdXJiICp1cmI7CkBAIC04MjYsNyArODI1LDYgQEAKIAkvKiBHZXQgdGhlIGN1cnJlbnQgYWx0ZXJuYXRlIGludGVyZmFjZSwgYWRqdXN0IHBhY2tldCBzaXplICovCiAJaWYgKCF1ZGV2LT5hY3Rjb25maWcpCiAJCXJldHVybiAtRUZBVUxUOwotCiAJaW50ZiA9IHVzYl9pZm51bV90b19pZih1ZGV2LCAwKTsKIAlpZiAoaW50ZikKIAkJaWRlc2MgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoaW50ZiwgcGRldi0+dmFsdGVybmF0ZSk7CkBAIC04MzYsMjAgKzgzNCwyMSBAQAogCiAJLyogU2VhcmNoIHZpZGVvIGVuZHBvaW50ICovCiAJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IC0xOwotCWZvciAoaSA9IDA7IGkgPCBpZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspCisJZm9yIChpID0gMDsgaSA8IGlkZXNjLT5kZXNjLmJOdW1FbmRwb2ludHM7IGkrKykgewogCQlpZiAoKGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLmJFbmRwb2ludEFkZHJlc3MgJiAweEYpID09IHBkZXYtPnZlbmRwb2ludCkgewogCQkJcGRldi0+dm1heF9wYWNrZXRfc2l6ZSA9IGxlMTZfdG9fY3B1KGlkZXNjLT5lbmRwb2ludFtpXS5kZXNjLndNYXhQYWNrZXRTaXplKTsKIAkJCWJyZWFrOwogCQl9CisJfQogCiAJaWYgKHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPCAwIHx8IHBkZXYtPnZtYXhfcGFja2V0X3NpemUgPiBJU09fTUFYX0ZSQU1FX1NJWkUpIHsKLQkJRXJyKCJGYWlsZWQgdG8gZmluZCBwYWNrZXQgc2l6ZSBmb3IgdmlkZW8gZW5kcG9pbnQgaW4gY3VycmVudCBhbHRlcm5hdGUgc2V0dGluZy5cbiIpOworCQlQV0NfRVJST1IoIkZhaWxlZCB0byBmaW5kIHBhY2tldCBzaXplIGZvciB2aWRlbyBlbmRwb2ludCBpbiBjdXJyZW50IGFsdGVybmF0ZSBzZXR0aW5nLlxuIik7CiAJCXJldHVybiAtRU5GSUxFOyAvKiBPZGQgZXJyb3IsIHRoYXQgc2hvdWxkIGJlIG5vdGljZWFibGUgKi8KIAl9CiAKIAkvKiBTZXQgYWx0ZXJuYXRlIGludGVyZmFjZSAqLwogCXJldCA9IDA7Ci0JVHJhY2UoVFJBQ0VfT1BFTiwgIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAlZFxuIiwgcGRldi0+dmFsdGVybmF0ZSk7CisJUFdDX0RFQlVHX09QRU4oIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAlZFxuIiwgcGRldi0+dmFsdGVybmF0ZSk7CiAJcmV0ID0gdXNiX3NldF9pbnRlcmZhY2UocGRldi0+dWRldiwgMCwgcGRldi0+dmFsdGVybmF0ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC04NTcsMTIgKzg1NiwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKLQkJCUVycigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7CisJCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSB1cmIgJWRcbiIsIGkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWJyZWFrOwogCQl9CiAJCXBkZXYtPnNidWZbaV0udXJiID0gdXJiOwotCQlUcmFjZShUUkFDRV9NRU1PUlksICJBbGxvY2F0ZWQgVVJCIGF0IDB4JXBcbiIsIHVyYik7CisJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBVUkIgYXQgMHglcFxuIiwgdXJiKTsKIAl9CiAJaWYgKHJldCkgewogCQkvKiBEZS1hbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyICovCkBAIC04OTksMjQgKzg5OCwyNiBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwZGV2LT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CiAJCWlmIChyZXQpCi0JCQlFcnIoImlzb2NfaW5pdCgpIHN1Ym1pdF91cmIgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHJldCk7CisJCQlQV0NfRVJST1IoImlzb2NfaW5pdCgpIHN1Ym1pdF91cmIgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHJldCk7CiAJCWVsc2UKLQkJCVRyYWNlKFRSQUNFX01FTU9SWSwgIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnNidWZbaV0udXJiKTsKKwkJCVBXQ19ERUJVR19NRU1PUlkoIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnNidWZbaV0udXJiKTsKIAl9CiAKIAkvKiBBbGwgaXMgZG9uZS4uLiAqLwogCXBkZXYtPmlzb19pbml0ID0gMTsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgcHdjX2lzb2NfaW5pdCgpXG4iKTsKKwlQV0NfREVCVUdfT1BFTigiPDwgcHdjX2lzb2NfaW5pdCgpXG4iKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3ZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX09QRU4sICI+PiBwd2NfaXNvY19jbGVhbnVwKClcbiIpOworCVBXQ19ERUJVR19PUEVOKCI+PiBwd2NfaXNvY19jbGVhbnVwKClcbiIpOwogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybjsKKwlpZiAocGRldi0+aXNvX2luaXQgPT0gMCkKKwkJcmV0dXJuOwogCiAJLyogVW5saW5raW5nIElTT0MgYnVmZmVycyBvbmUgYnkgb25lICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7CkBAIC05MjUsMTAgKzkyNiwxMCBAQAogCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKIAkJaWYgKHVyYiAhPSAwKSB7CiAJCQlpZiAocGRldi0+aXNvX2luaXQpIHsKLQkJCQlUcmFjZShUUkFDRV9NRU1PUlksICJVbmxpbmtpbmcgVVJCICVwXG4iLCB1cmIpOworCQkJCVBXQ19ERUJVR19NRU1PUlkoIlVubGlua2luZyBVUkIgJXBcbiIsIHVyYik7CiAJCQkJdXNiX2tpbGxfdXJiKHVyYik7CiAJCQl9Ci0JCQlUcmFjZShUUkFDRV9NRU1PUlksICJGcmVlaW5nIFVSQlxuIik7CisJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIFVSQlxuIik7CiAJCQl1c2JfZnJlZV91cmIodXJiKTsKIAkJCXBkZXYtPnNidWZbaV0udXJiID0gTlVMTDsKIAkJfQpAQCAtOTM4LDEyICs5MzksMTIgQEAKIAkgICBpcyBzaWduYWxsZWQgYnkgRVBJUEUpCiAJICovCiAJaWYgKHBkZXYtPmVycm9yX3N0YXR1cyAmJiBwZGV2LT5lcnJvcl9zdGF0dXMgIT0gRVBJUEUpIHsKLQkJVHJhY2UoVFJBQ0VfT1BFTiwgIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAwLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJTZXR0aW5nIGFsdGVybmF0ZSBpbnRlcmZhY2UgMC5cbiIpOwogCQl1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCAwKTsKIAl9CiAKIAlwZGV2LT5pc29faW5pdCA9IDA7Ci0JVHJhY2UoVFJBQ0VfT1BFTiwgIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CisJUFdDX0RFQlVHX09QRU4oIjw8IHB3Y19pc29jX2NsZWFudXAoKVxuIik7CiB9CiAKIGludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpCkBAIC05NTcsMTggKzk1OCwxOCBAQAogCS8qIFRyeSB0byBzZXQgdmlkZW8gbW9kZS4uLiAqLwogCXN0YXJ0ID0gcmV0ID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHdpZHRoLCBoZWlnaHQsIG5ld19mcHMsIG5ld19jb21wcmVzc2lvbiwgbmV3X3NuYXBzaG90KTsKIAlpZiAocmV0KSB7Ci0JCVRyYWNlKFRSQUNFX0ZMT1csICJwd2Nfc2V0X3ZpZGVvX21vZGUgYXR0ZW1wdCAxIGZhaWxlZC5cbiIpOworCQlQV0NfREVCVUdfRkxPVygicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMSBmYWlsZWQuXG4iKTsKIAkJLyogVGhhdCBmYWlsZWQuLi4gcmVzdG9yZSBvbGQgbW9kZSAod2Uga25vdyB0aGF0IHdvcmtlZCkgKi8KIAkJc3RhcnQgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKIAkJaWYgKHN0YXJ0KSB7Ci0JCQlUcmFjZShUUkFDRV9GTE9XLCAicHdjX3NldF92aWRlb19tb2RlIGF0dGVtcHQgMiBmYWlsZWQuXG4iKTsKKwkJCVBXQ19ERUJVR19GTE9XKCJwd2Nfc2V0X3ZpZGVvX21vZGUgYXR0ZW1wdCAyIGZhaWxlZC5cbiIpOwogCQl9CiAJfQogCWlmIChzdGFydCA9PSAwKQogCXsKIAkJaWYgKHB3Y19pc29jX2luaXQocGRldikgPCAwKQogCQl7Ci0JCQlJbmZvKCJGYWlsZWQgdG8gcmVzdGFydCBJU09DIHRyYW5zZmVycyBpbiBwd2NfdHJ5X3ZpZGVvX21vZGUuXG4iKTsKKwkJCVBXQ19XQVJOSU5HKCJGYWlsZWQgdG8gcmVzdGFydCBJU09DIHRyYW5zZmVycyBpbiBwd2NfdHJ5X3ZpZGVvX21vZGUuXG4iKTsKIAkJCXJldCA9IC1FQUdBSU47IC8qIGxldCdzIHRyeSBhZ2Fpbiwgd2hvIGtub3dzIGlmIGl0IHdvcmtzIGEgc2Vjb25kIHRpbWUgKi8KIAkJfQogCX0KQEAgLTk3Niw1NCArOTc3LDEyOSBAQAogCXJldHVybiByZXQ7IC8qIFJldHVybiBvcmlnaW5hbCBlcnJvciBjb2RlICovCiB9CiAKKy8qKioqKioqKioKKyAqIHN5c2ZzCisgKioqKioqKioqLworc3RhdGljIHN0cnVjdCBwd2NfZGV2aWNlICpjZF90b19wd2Moc3RydWN0IGNsYXNzX2RldmljZSAqY2QpCit7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShjZCk7CisJcmV0dXJuIHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3Bhbl90aWx0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gY2RfdG9fcHdjKGNsYXNzX2Rldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQgJWRcbiIsIHBkZXYtPnBhbl9hbmdsZSwgcGRldi0+dGlsdF9hbmdsZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3Bhbl90aWx0KHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY29uc3QgY2hhciAqYnVmLAorCQkJIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IGNkX3RvX3B3YyhjbGFzc19kZXYpOworCWludCBwYW4sIHRpbHQ7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoc3RybmNtcChidWYsICJyZXNldCIsIDUpID09IDApCisJCXJldCA9IHB3Y19tcHRfcmVzZXQocGRldiwgMHgzKTsKKworCWVsc2UgaWYgKHNzY2FuZihidWYsICIlZCAlZCIsICZwYW4sICZ0aWx0KSA+IDApCisJCXJldCA9IHB3Y19tcHRfc2V0X2FuZ2xlKHBkZXYsIHBhbiwgdGlsdCk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIocGFuX3RpbHQsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3Bhbl90aWx0LAorCQkJIHN0b3JlX3Bhbl90aWx0KTsKKworc3RhdGljIHNzaXplX3Qgc2hvd19zbmFwc2hvdF9idXR0b25fc3RhdHVzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gY2RfdG9fcHdjKGNsYXNzX2Rldik7CisJaW50IHN0YXR1cyA9IHBkZXYtPnNuYXBzaG90X2J1dHRvbl9zdGF0dXM7CisJcGRldi0+c25hcHNob3RfYnV0dG9uX3N0YXR1cyA9IDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBDTEFTU19ERVZJQ0VfQVRUUihidXR0b24sIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3NuYXBzaG90X2J1dHRvbl9zdGF0dXMsCisJCQkgTlVMTCk7CisKK3N0YXRpYyB2b2lkIHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2dldF9kcnZkYXRhKHZkZXYpOworCWlmIChwZGV2LT5mZWF0dXJlcyAmIEZFQVRVUkVfTU9UT1JfUEFOVElMVCkKKwkJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9wYW5fdGlsdCk7CisJdmlkZW9fZGV2aWNlX2NyZWF0ZV9maWxlKHZkZXYsICZjbGFzc19kZXZpY2VfYXR0cl9idXR0b24pOworfQorCitzdGF0aWMgdm9pZCBwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKKwlpZiAocGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisJCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfcGFuX3RpbHQpOworCXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZSh2ZGV2LCAmY2xhc3NfZGV2aWNlX2F0dHJfYnV0dG9uKTsKK30KKworI2lmIENPTkZJR19QV0NfREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICpwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKHVuc2lnbmVkIGludCBzZW5zb3JfdHlwZSkKK3sKKwlzd2l0Y2goc2Vuc29yX3R5cGUpIHsKKwkJY2FzZSAweDAwOgorCQkJcmV0dXJuICJIeXVuZGFpIENNT1Mgc2Vuc29yIjsKKwkJY2FzZSAweDIwOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBUREE4Nzg3IjsKKwkJY2FzZSAweDJFOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsKKwkJY2FzZSAweDJGOgorCQkJcmV0dXJuICJTb255IENDRCBzZW5zb3IgKyBBREkgOTgwNCI7CisJCWNhc2UgMHgzMDoKKwkJCXJldHVybiAiU2hhcnAgQ0NEIHNlbnNvciArIFREQTg3ODciOworCQljYXNlIDB4M0U6CisJCQlyZXR1cm4gIlNoYXJwIENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsKKwkJY2FzZSAweDNGOgorCQkJcmV0dXJuICJTaGFycCBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOworCQljYXNlIDB4NDA6CisJCQlyZXR1cm4gIlVQQSAxMDIxIHNlbnNvciI7CisJCWNhc2UgMHgxMDA6CisJCQlyZXR1cm4gIlZHQSBzZW5zb3IiOworCQljYXNlIDB4MTAxOgorCQkJcmV0dXJuICJQQUwgTVIgc2Vuc29yIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAidW5rbm93biB0eXBlIG9mIHNlbnNvciI7CisJfQorfQorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBWaWRlbzRMaW51eCBmdW5jdGlvbnMgKi8KIAogc3RhdGljIGludCBwd2NfdmlkZW9fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwogCi0JVHJhY2UoVFJBQ0VfT1BFTiwgIj4+IHZpZGVvX29wZW4gY2FsbGVkKHZkZXYgPSAweCVwKS5cbiIsIHZkZXYpOworCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19vcGVuIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OwogCWlmIChwZGV2ID09IE5VTEwpCiAJCUJVRygpOwotCWlmIChwZGV2LT52b3BlbikKKwlpZiAocGRldi0+dm9wZW4pIHsKKwkJUFdDX0RFQlVHX09QRU4oIkknbSBidXN5LCBzb21lb25lIGlzIHVzaW5nIHRoZSBkZXZpY2UuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAlkb3duKCZwZGV2LT5tb2Rsb2NrKTsKIAlpZiAoIXBkZXYtPnVzYl9pbml0KSB7Ci0JCVRyYWNlKFRSQUNFX09QRU4sICJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJEb2luZyBmaXJzdCB0aW1lIGluaXRpYWxpemF0aW9uLlxuIik7CiAJCXBkZXYtPnVzYl9pbml0ID0gMTsKIAotCQlpZiAocHdjX3RyYWNlICYgVFJBQ0VfT1BFTikKKwkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KKwkJcmV0ID0gcHdjX2dldF9jbW9zX3NlbnNvcihwZGV2LCAmaSk7CisJCWlmIChyZXQgPj0gMCkKIAkJewotCQkJLyogUXVlcnkgc2Vuc29yIHR5cGUgKi8KLQkJCWNvbnN0IGNoYXIgKnNlbnNvcl90eXBlID0gTlVMTDsKLQkJCWludCByZXQ7Ci0KLQkJCXJldCA9IHB3Y19nZXRfY21vc19zZW5zb3IocGRldiwgJmkpOwotCQkJaWYgKHJldCA+PSAwKQotCQkJewotCQkJCXN3aXRjaChpKSB7Ci0JCQkJY2FzZSAweDAwOiAgc2Vuc29yX3R5cGUgPSAiSHl1bmRhaSBDTU9TIHNlbnNvciI7IGJyZWFrOwotCQkJCWNhc2UgMHgyMDogIHNlbnNvcl90eXBlID0gIlNvbnkgQ0NEIHNlbnNvciArIFREQTg3ODciOyBicmVhazsKLQkJCQljYXNlIDB4MkU6ICBzZW5zb3JfdHlwZSA9ICJTb255IENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDJGOiAgc2Vuc29yX3R5cGUgPSAiU29ueSBDQ0Qgc2Vuc29yICsgQURJIDk4MDQiOyBicmVhazsKLQkJCQljYXNlIDB4MzA6ICBzZW5zb3JfdHlwZSA9ICJTaGFycCBDQ0Qgc2Vuc29yICsgVERBODc4NyI7IGJyZWFrOwotCQkJCWNhc2UgMHgzRTogIHNlbnNvcl90eXBlID0gIlNoYXJwIENDRCBzZW5zb3IgKyBFeGFzIDk4TDU5IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDNGOiAgc2Vuc29yX3R5cGUgPSAiU2hhcnAgQ0NEIHNlbnNvciArIEFESSA5ODA0IjsgYnJlYWs7Ci0JCQkJY2FzZSAweDQwOiAgc2Vuc29yX3R5cGUgPSAiVVBBIDEwMjEgc2Vuc29yIjsgYnJlYWs7Ci0JCQkJY2FzZSAweDEwMDogc2Vuc29yX3R5cGUgPSAiVkdBIHNlbnNvciI7IGJyZWFrOwotCQkJCWNhc2UgMHgxMDE6IHNlbnNvcl90eXBlID0gIlBBTCBNUiBzZW5zb3IiOyBicmVhazsKLQkJCQlkZWZhdWx0OiAgICBzZW5zb3JfdHlwZSA9ICJ1bmtub3duIHR5cGUgb2Ygc2Vuc29yIjsgYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNlbnNvcl90eXBlICE9IE5VTEwpCi0JCQkJSW5mbygiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLCBwZGV2LT52ZGV2LT5uYW1lLCBzZW5zb3JfdHlwZSwgaSk7CisJCQlQV0NfREVCVUdfT1BFTigiVGhpcyAlcyBjYW1lcmEgaXMgZXF1aXBwZWQgd2l0aCBhICVzICglZCkuXG4iLAorCQkJCQlwZGV2LT52ZGV2LT5uYW1lLAorCQkJCQlwd2Nfc2Vuc29yX3R5cGVfdG9fc3RyaW5nKGkpLCBpKTsKIAkJfQogCX0KIApAQCAtMTAzMSwzNCArMTEwNywzMiBAQAogCWlmIChwb3dlcl9zYXZlKSB7CiAJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDEpOwogCQlpZiAoaSA8IDApCi0JCQlJbmZvKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKKwkJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gcmVzdG9yZSBwb3dlciB0byB0aGUgY2FtZXJhISAoJWQpXG4iLCBpKTsKIAl9CiAJLyogU2V0IExFRCBvbi9vZmYgdGltZSAqLwogCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgbGVkX29uLCBsZWRfb2ZmKSA8IDApCi0JCUluZm8oIkZhaWxlZCB0byBzZXQgTEVEIG9uL29mZiB0aW1lLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOwogCiAJcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLwogCiAJLyogU28gZmFyLCBzbyBnb29kLiBBbGxvY2F0ZSBtZW1vcnkuICovCiAJaSA9IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYpOwogCWlmIChpIDwgMCkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBtZW1vcnkuXG4iKTsKKwkJUFdDX0RFQlVHX09QRU4oIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXJzIG1lbW9yeS5cbiIpOworCQlwd2NfZnJlZV9idWZmZXJzKHBkZXYpOwogCQl1cCgmcGRldi0+bW9kbG9jayk7CiAJCXJldHVybiBpOwogCX0KIAogCS8qIFJlc2V0IGJ1ZmZlcnMgJiBwYXJhbWV0ZXJzICovCiAJcHdjX3Jlc2V0X2J1ZmZlcnMocGRldik7Ci0JZm9yIChpID0gMDsgaSA8IGRlZmF1bHRfbWJ1ZnM7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspCiAJCXBkZXYtPmltYWdlX3VzZWRbaV0gPSAwOwogCXBkZXYtPnZmcmFtZV9jb3VudCA9IDA7CiAJcGRldi0+dmZyYW1lc19kdW1wZWQgPSAwOwogCXBkZXYtPnZmcmFtZXNfZXJyb3IgPSAwOwogCXBkZXYtPnZpc29jX2Vycm9ycyA9IDA7CiAJcGRldi0+ZXJyb3Jfc3RhdHVzID0gMDsKLSNpZiBQV0NfREVCVUcKLQlwZGV2LT5zZXF1ZW5jZSA9IDA7Ci0jZW5kaWYKIAlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCiAKIAkvKiBTZXQgc29tZSBkZWZhdWx0cyAqLwpAQCAtMTA3MCwyOSArMTE0NCw0NCBAQAogCSAqLwogCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbcGRldi0+dnNpemVdLnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CiAJaWYgKGkpCXsKLQkJVHJhY2UoVFJBQ0VfT1BFTiwgIkZpcnN0IGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7Ci0JCWlmIChwZGV2LT50eXBlID09IDczMCB8fCBwZGV2LT50eXBlID09IDc0MCB8fCBwZGV2LT50eXBlID09IDc1MCkKLQkJCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW1BTWl9RU0lGXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FTSUZdLnksIDEwLCBwZGV2LT52Y29tcHJlc3Npb24sIDApOworCQl1bnNpZ25lZCBpbnQgZGVmYXVsdF9yZXNvbHV0aW9uOworCQlQV0NfREVCVUdfT1BFTigiRmlyc3QgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKKwkJaWYgKHBkZXYtPnR5cGU+PSA3MzApCisJCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUVNJRjsKIAkJZWxzZQotCQkJaSA9IHB3Y19zZXRfdmlkZW9fbW9kZShwZGV2LCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX1FDSUZdLngsIHB3Y19pbWFnZV9zaXplc1tQU1pfUUNJRl0ueSwgMTAsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7CisJCQlkZWZhdWx0X3Jlc29sdXRpb24gPSBQU1pfUUNJRjsKKworCQlpID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsCisJCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLngsCisJCQkJICAgICAgIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3Jlc29sdXRpb25dLnksCisJCQkJICAgICAgIDEwLAorCQkJCSAgICAgICBwZGV2LT52Y29tcHJlc3Npb24sCisJCQkJICAgICAgIDApOwogCX0KIAlpZiAoaSkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiU2Vjb25kIGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7CisJCVBXQ19ERUJVR19PUEVOKCJTZWNvbmQgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKKwkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKIAkJdXAoJnBkZXYtPm1vZGxvY2spOwogCQlyZXR1cm4gaTsKIAl9CiAKIAlpID0gcHdjX2lzb2NfaW5pdChwZGV2KTsKIAlpZiAoaSkgewotCQlUcmFjZShUUkFDRV9PUEVOLCAiRmFpbGVkIHRvIGluaXQgSVNPQyBzdHVmZiA9ICVkLlxuIiwgaSk7CisJCVBXQ19ERUJVR19PUEVOKCJGYWlsZWQgdG8gaW5pdCBJU09DIHN0dWZmID0gJWQuXG4iLCBpKTsKKwkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKIAkJdXAoJnBkZXYtPm1vZGxvY2spOwogCQlyZXR1cm4gaTsKIAl9CiAKKwkvKiBJbml0aWFsaXplIHRoZSB3ZWJjYW0gdG8gc2FuZSB2YWx1ZSAqLworCXB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCAweDdmZmYpOworCXB3Y19zZXRfYWdjKHBkZXYsIDEsIDApOworCiAJcGRldi0+dm9wZW4rKzsKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSB2ZGV2OwogCXVwKCZwZGV2LT5tb2Rsb2NrKTsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fb3BlbigpIHJldHVybnMgMC5cbiIpOworCVBXQ19ERUJVR19PUEVOKCI8PCB2aWRlb19vcGVuKCkgcmV0dXJucyAwLlxuIik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMDMsMzUgKzExOTIsMjMgQEAKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKIAlpbnQgaTsKIAotCVRyYWNlKFRSQUNFX09QRU4sICI+PiB2aWRlb19jbG9zZSBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CisJUFdDX0RFQlVHX09QRU4oIj4+IHZpZGVvX2Nsb3NlIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil2ZGV2LT5wcml2OwogCWlmIChwZGV2LT52b3BlbiA9PSAwKQotCQlJbmZvKCJ2aWRlb19jbG9zZSgpIGNhbGxlZCBvbiBjbG9zZWQgZGV2aWNlP1xuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoInZpZGVvX2Nsb3NlKCkgY2FsbGVkIG9uIGNsb3NlZCBkZXZpY2U/XG4iKTsKIAogCS8qIER1bXAgc3RhdGlzdGljcywgYnV0IG9ubHkgaWYgYSByZWFzb25hYmxlIGFtb3VudCBvZiBmcmFtZXMgd2VyZQogCSAgIHByb2Nlc3NlZCAodG8gcHJldmVudCBlbmRsZXNzIGxvZy1lbnRyaWVzIGluIGNhc2Ugb2Ygc25hcC1zaG90CiAJICAgcHJvZ3JhbXMpCiAJICovCiAJaWYgKHBkZXYtPnZmcmFtZV9jb3VudCA+IDIwKQotCQlJbmZvKCJDbG9zaW5nIHZpZGVvIGRldmljZTogJWQgZnJhbWVzIHJlY2VpdmVkLCBkdW1wZWQgJWQgZnJhbWVzLCAlZCBmcmFtZXMgd2l0aCBlcnJvcnMuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQsIHBkZXYtPnZmcmFtZXNfZHVtcGVkLCBwZGV2LT52ZnJhbWVzX2Vycm9yKTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiQ2xvc2luZyB2aWRlbyBkZXZpY2U6ICVkIGZyYW1lcyByZWNlaXZlZCwgZHVtcGVkICVkIGZyYW1lcywgJWQgZnJhbWVzIHdpdGggZXJyb3JzLlxuIiwgcGRldi0+dmZyYW1lX2NvdW50LCBwZGV2LT52ZnJhbWVzX2R1bXBlZCwgcGRldi0+dmZyYW1lc19lcnJvcik7CiAKLQlzd2l0Y2ggKHBkZXYtPnR5cGUpCi0JIHsKLQkgIGNhc2UgNjc1OgotCSAgY2FzZSA2ODA6Ci0JICBjYXNlIDY5MDoKLQkgIGNhc2UgNzIwOgotCSAgY2FzZSA3MzA6Ci0JICBjYXNlIDc0MDoKLQkgIGNhc2UgNzUwOgotLyoJICAgIHB3Y19kZWMyM19leGl0KCk7CSovLyogVGltb24gJiBLaWFyYSAqLwotCSAgICBicmVhazsKLQkgIGNhc2UgNjQ1OgotCSAgY2FzZSA2NDY6Ci0vKgkgICAgcHdjX2RlYzFfZXhpdCgpOyAqLwotCSAgICBicmVhazsKLQkgfQorCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKKwkgICAgcHdjX2RlYzFfZXhpdCgpOworCWVsc2UKKwkgICAgcHdjX2RlYzIzX2V4aXQoKTsKIAogCXB3Y19pc29jX2NsZWFudXAocGRldik7CiAJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKQEAgLTExNDAsMTUgKzEyMTcsMTUgQEAKIAlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzICE9IEVQSVBFKSB7CiAJCS8qIFR1cm4gTEVEcyBvZmYgKi8KIAkJaWYgKHB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKSA8IDApCi0JCQlJbmZvKCJGYWlsZWQgdG8gc2V0IExFRCBvbi9vZmYgdGltZS5cbiIpOworCQkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKIAkJaWYgKHBvd2VyX3NhdmUpIHsKIAkJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOwogCQkJaWYgKGkgPCAwKQotCQkJCUVycigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOworCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOwogCQl9CiAJfQotCXBkZXYtPnZvcGVuID0gMDsKLQlUcmFjZShUUkFDRV9PUEVOLCAiPDwgdmlkZW9fY2xvc2UoKVxuIik7CisJcGRldi0+dm9wZW4tLTsKKwlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fY2xvc2UoKSB2b3Blbj0lZFxuIiwgcGRldi0+dm9wZW4pOwogCXJldHVybiAwOwogfQogCkBAIC0xMTY0LDcgKzEyNDEsNyBAQAogCQlkZXZpY2UgaXMgdHJpY2t5IGFueWhvdy4KICAqLwogCi1zdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBidWYsCitzdGF0aWMgc3NpemVfdCBwd2NfdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTExNzIsOCArMTI0OSwxMCBAQAogCWludCBub2Jsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJaW50IGJ5dGVzX3RvX3JlYWQ7CisJdm9pZCAqaW1hZ2VfYnVmZmVyX2FkZHI7CiAKLQlUcmFjZShUUkFDRV9SRUFELCAidmlkZW9fcmVhZCgweCVwLCAlcCwgJXp1KSBjYWxsZWQuXG4iLCB2ZGV2LCBidWYsIGNvdW50KTsKKwlQV0NfREVCVUdfUkVBRCgicHdjX3ZpZGVvX3JlYWQodmRldj0weCVwLCBidWY9JXAsIGNvdW50PSV6ZCkgY2FsbGVkLlxuIiwKKwkJCXZkZXYsIGJ1ZiwgY291bnQpOwogCWlmICh2ZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwogCXBkZXYgPSB2ZGV2LT5wcml2OwpAQCAtMTIxNCwxNiArMTI5MywxOSBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JVHJhY2UoVFJBQ0VfUkVBRCwgIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7CisJUFdDX0RFQlVHX1JFQUQoIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7CiAJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQotCQlieXRlc190b19yZWFkID0gcGRldi0+ZnJhbWVfc2l6ZTsKKwkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOwogCWVsc2UKIAkJYnl0ZXNfdG9fcmVhZCA9IHBkZXYtPnZpZXcuc2l6ZTsKIAogCS8qIGNvcHkgYnl0ZXMgdG8gdXNlciBzcGFjZTsgd2UgYWxsb3cgZm9yIHBhcnRpYWwgcmVhZHMgKi8KIAlpZiAoY291bnQgKyBwZGV2LT5pbWFnZV9yZWFkX3BvcyA+IGJ5dGVzX3RvX3JlYWQpCiAJCWNvdW50ID0gYnl0ZXNfdG9fcmVhZCAtIHBkZXYtPmltYWdlX3JlYWRfcG9zOwotCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwZGV2LT5pbWFnZV9wdHJbcGRldi0+ZmlsbF9pbWFnZV0gKyBwZGV2LT5pbWFnZV9yZWFkX3BvcywgY291bnQpKQorCWltYWdlX2J1ZmZlcl9hZGRyID0gcGRldi0+aW1hZ2VfZGF0YTsKKwlpbWFnZV9idWZmZXJfYWRkciArPSBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0ub2Zmc2V0OworCWltYWdlX2J1ZmZlcl9hZGRyICs9IHBkZXYtPmltYWdlX3JlYWRfcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBpbWFnZV9idWZmZXJfYWRkciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlwZGV2LT5pbWFnZV9yZWFkX3BvcyArPSBjb3VudDsKIAlpZiAocGRldi0+aW1hZ2VfcmVhZF9wb3MgPj0gYnl0ZXNfdG9fcmVhZCkgeyAvKiBBbGwgZGF0YSBoYXMgYmVlbiByZWFkICovCkBAIC0xMjUzLDM3MCArMTMzNSw1NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB3Y192aWRlb19kb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JaWYgKHZkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcGRldiA9IHZkZXYtPnByaXY7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCQkvKiBRdWVyeSBjYWJhcGlsaXRpZXMgKi8KLQkJY2FzZSBWSURJT0NHQ0FQOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSAqY2FwcyA9IGFyZzsKLQotCQkJc3RyY3B5KGNhcHMtPm5hbWUsIHZkZXYtPm5hbWUpOwotCQkJY2Fwcy0+dHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7Ci0JCQljYXBzLT5jaGFubmVscyA9IDE7Ci0JCQljYXBzLT5hdWRpb3MgPSAxOwotCQkJY2Fwcy0+bWlud2lkdGggID0gcGRldi0+dmlld19taW4ueDsKLQkJCWNhcHMtPm1pbmhlaWdodCA9IHBkZXYtPnZpZXdfbWluLnk7Ci0JCQljYXBzLT5tYXh3aWR0aCAgPSBwZGV2LT52aWV3X21heC54OwotCQkJY2Fwcy0+bWF4aGVpZ2h0ID0gcGRldi0+dmlld19tYXgueTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogQ2hhbm5lbCBmdW5jdGlvbnMgKHNpbXVsYXRlIDEgY2hhbm5lbCkgKi8KLQkJY2FzZSBWSURJT0NHQ0hBTjoKLQkJewotCQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnYgPSBhcmc7Ci0KLQkJCWlmICh2LT5jaGFubmVsICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl2LT5mbGFncyA9IDA7Ci0JCQl2LT50dW5lcnMgPSAwOwotCQkJdi0+dHlwZSA9IFZJREVPX1RZUEVfQ0FNRVJBOwotCQkJc3RyY3B5KHYtPm5hbWUsICJXZWJjYW0iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTQ0hBTjoKLQkJewotCQkJLyogVGhlIHNwZWMgc2F5cyB0aGUgYXJndW1lbnQgaXMgYW4gaW50ZWdlciwgYnV0Ci0JCQkgICB0aGUgYnR0diBkcml2ZXIgdXNlcyBhIHZpZGVvX2NoYW5uZWwgYXJnLCB3aGljaAotCQkJICAgbWFrZXMgc2Vuc2UgYmVjYXN1ZSBpdCBhbHNvIGhhcyB0aGUgbm9ybSBmbGFnLgotCQkJICovCi0JCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKLQkJCWlmICh2LT5jaGFubmVsICE9IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0KLQkJLyogUGljdHVyZSBmdW5jdGlvbnM7IGNvbnRyYXN0IGV0Yy4gKi8KLQkJY2FzZSBWSURJT0NHUElDVDoKLQkJewotCQkJc3RydWN0IHZpZGVvX3BpY3R1cmUgKnAgPSBhcmc7Ci0JCQlpbnQgdmFsOwotCi0JCQl2YWwgPSBwd2NfZ2V0X2JyaWdodG5lc3MocGRldik7Ci0JCQlpZiAodmFsID49IDApCi0JCQkJcC0+YnJpZ2h0bmVzcyA9IHZhbDsKLQkJCWVsc2UKLQkJCQlwLT5icmlnaHRuZXNzID0gMHhmZmZmOwotCQkJdmFsID0gcHdjX2dldF9jb250cmFzdChwZGV2KTsKLQkJCWlmICh2YWwgPj0gMCkKLQkJCQlwLT5jb250cmFzdCA9IHZhbDsKLQkJCWVsc2UKLQkJCQlwLT5jb250cmFzdCA9IDB4ZmZmZjsKLQkJCS8qIEdhbW1hLCBXaGl0ZW5lc3MsIHdoYXQncyB0aGUgZGlmZmVyZW5jZT8gOikgKi8KLQkJCXZhbCA9IHB3Y19nZXRfZ2FtbWEocGRldik7Ci0JCQlpZiAodmFsID49IDApCi0JCQkJcC0+d2hpdGVuZXNzID0gdmFsOwotCQkJZWxzZQotCQkJCXAtPndoaXRlbmVzcyA9IDB4ZmZmZjsKLQkJCXZhbCA9IHB3Y19nZXRfc2F0dXJhdGlvbihwZGV2KTsKLQkJCWlmICh2YWwgPj0gMCkKLQkJCQlwLT5jb2xvdXIgPSB2YWw7Ci0JCQllbHNlCi0JCQkJcC0+Y29sb3VyID0gMHhmZmZmOwotCQkJcC0+ZGVwdGggPSAyNDsKLQkJCXAtPnBhbGV0dGUgPSBwZGV2LT52cGFsZXR0ZTsKLQkJCXAtPmh1ZSA9IDB4RkZGRjsgLyogTi9BICovCi0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgVklESU9DU1BJQ1Q6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOwotCQkJLyoKLQkJCSAqCUZJWE1FOglTdXBwb3NlIHdlIGFyZSBtaWQgcmVhZAotCQkJCUFOU1dFUjogTm8gcHJvYmxlbTogdGhlIGZpcm13YXJlIG9mIHRoZSBjYW1lcmEKLQkJCQkJY2FuIGhhbmRsZSBicmlnaHRuZXNzL2NvbnRyYXN0L2V0YwotCQkJCQljaGFuZ2VzIGF0IF9hbnlfIHRpbWUsIGFuZCB0aGUgcGFsZXR0ZQotCQkJCQlpcyB1c2VkIGV4YWN0bHkgb25jZSBpbiB0aGUgdW5jb21wcmVzcwotCQkJCQlyb3V0aW5lLgotCQkJICovCi0JCQlwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgcC0+YnJpZ2h0bmVzcyk7Ci0JCQlwd2Nfc2V0X2NvbnRyYXN0KHBkZXYsIHAtPmNvbnRyYXN0KTsKLQkJCXB3Y19zZXRfZ2FtbWEocGRldiwgcC0+d2hpdGVuZXNzKTsKLQkJCXB3Y19zZXRfc2F0dXJhdGlvbihwZGV2LCBwLT5jb2xvdXIpOwotCQkJaWYgKHAtPnBhbGV0dGUgJiYgcC0+cGFsZXR0ZSAhPSBwZGV2LT52cGFsZXR0ZSkgewotCQkJCXN3aXRjaCAocC0+cGFsZXR0ZSkgewotCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJCQkJCXBkZXYtPnZwYWxldHRlID0gcC0+cGFsZXR0ZTsKLQkJCQkJCXJldHVybiBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+aW1hZ2UueCwgcGRldi0+aW1hZ2UueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogV2luZG93L3NpemUgcGFyYW1ldGVycyAqLwotCQljYXNlIFZJRElPQ0dXSU46Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOwotCi0JCQl2dy0+eCA9IDA7Ci0JCQl2dy0+eSA9IDA7Ci0JCQl2dy0+d2lkdGggPSBwZGV2LT52aWV3Lng7Ci0JCQl2dy0+aGVpZ2h0ID0gcGRldi0+dmlldy55OwotCQkJdnctPmNocm9tYWtleSA9IDA7Ci0JCQl2dy0+ZmxhZ3MgPSAocGRldi0+dmZyYW1lcyA8PCBQV0NfRlBTX1NISUZUKSB8Ci0JCQkJICAgKHBkZXYtPnZzbmFwc2hvdCA/IFBXQ19GUFNfU05BUFNIT1QgOiAwKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTV0lOOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKLQkJCWludCBmcHMsIHNuYXBzaG90LCByZXQ7Ci0KLQkJCWZwcyA9ICh2dy0+ZmxhZ3MgJiBQV0NfRlBTX0ZSTUFTSykgPj4gUFdDX0ZQU19TSElGVDsKLQkJCXNuYXBzaG90ID0gdnctPmZsYWdzICYgUFdDX0ZQU19TTkFQU0hPVDsKLQkJCWlmIChmcHMgPT0gMCkKLQkJCQlmcHMgPSBwZGV2LT52ZnJhbWVzOwotCQkJaWYgKHBkZXYtPnZpZXcueCA9PSB2dy0+d2lkdGggJiYgcGRldi0+dmlldy55ICYmIGZwcyA9PSBwZGV2LT52ZnJhbWVzICYmIHNuYXBzaG90ID09IHBkZXYtPnZzbmFwc2hvdCkKLQkJCQlyZXR1cm4gMDsKLQkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsIGZwcywgcGRldi0+dmNvbXByZXNzaW9uLCBzbmFwc2hvdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFdlIGRvbid0IGhhdmUgb3ZlcmxheSBzdXBwb3J0ICh5ZXQpICovCi0JCWNhc2UgVklESU9DR0ZCVUY6Ci0JCXsKLQkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOwotCi0JCQltZW1zZXQodmIsMCxzaXplb2YoKnZiKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIG1tYXAoKSBmdW5jdGlvbnMgKi8KLQkJY2FzZSBWSURJT0NHTUJVRjoKLQkJewotCQkJLyogVGVsbCB0aGUgdXNlciBwcm9ncmFtIGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgbW1hcCgpICovCi0JCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7Ci0JCQlpbnQgaTsKLQotCQkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7Ci0JCQl2bS0+c2l6ZSA9IGRlZmF1bHRfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCQkJdm0tPmZyYW1lcyA9IGRlZmF1bHRfbWJ1ZnM7IC8qIGRvdWJsZSBidWZmZXJpbmcgc2hvdWxkIGJlIGVub3VnaCBmb3IgbW9zdCBhcHBsaWNhdGlvbnMgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X21idWZzOyBpKyspCi0JCQkJdm0tPm9mZnNldHNbaV0gPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NNQ0FQVFVSRToKLQkJewotCQkJLyogU3RhcnQgY2FwdHVyZSBpbnRvIGEgZ2l2ZW4gaW1hZ2UgYnVmZmVyIChjYWxsZWQgJ2ZyYW1lJyBpbiB2aWRlb19tbWFwIHN0cnVjdHVyZSkgKi8KLQkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKLQotCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ01DQVBUVVJFOiAlZHglZCwgZnJhbWUgJWQsIGZvcm1hdCAlZFxuIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+ZnJhbWUsIHZtLT5mb3JtYXQpOwotCQkJaWYgKHZtLT5mcmFtZSA8IDAgfHwgdm0tPmZyYW1lID49IGRlZmF1bHRfbWJ1ZnMpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCS8qIHhhd3R2IGlzIG5hc3R5LiBJdCBwcm9iZXMgdGhlIGF2YWlsYWJsZSBwYWxldHRlcwotCQkJICAgYnkgc2V0dGluZyBhIHZlcnkgc21hbGwgaW1hZ2Ugc2l6ZSBhbmQgdHJ5aW5nCi0JCQkgICB2YXJpb3VzIHBhbGV0dGVzLi4uIFRoZSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0Ci0JCQkgICBzdWNoIHNtYWxsIGltYWdlcywgc28gSSdtIHdvcmtpbmcgYXJvdW5kIGl0LgotCQkJICovCi0JCQlpZiAodm0tPmZvcm1hdCkKLQkJCXsKLQkJCQlzd2l0Y2ggKHZtLT5mb3JtYXQpCi0JCQkJewotCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKLQkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgodm0tPndpZHRoICE9IHBkZXYtPnZpZXcueCB8fCB2bS0+aGVpZ2h0ICE9IHBkZXYtPnZpZXcueSkgJiYKLQkJCSAgICAodm0tPndpZHRoID49IHBkZXYtPnZpZXdfbWluLnggJiYgdm0tPmhlaWdodCA+PSBwZGV2LT52aWV3X21pbi55KSkgewotCQkJCWludCByZXQ7Ci0KLQkJCQlUcmFjZShUUkFDRV9PUEVOLCAiVklESU9DTUNBUFRVUkU6IGNoYW5naW5nIHNpemUgdG8gcGxlYXNlIHhhd3R2IDotKC5cbiIpOwotCQkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2bS0+d2lkdGgsIHZtLT5oZWlnaHQsIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgcGRldi0+dnNuYXBzaG90KTsKLQkJCQlpZiAocmV0KQotCQkJCQlyZXR1cm4gcmV0OwotCQkJfSAvKiAuLi4gc2l6ZSBtaXNtYXRjaCAqLwotCi0JCQkvKiBGSVhNRTogc2hvdWxkIHdlIGxvY2sgaGVyZT8gKi8KLQkJCWlmIChwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0pCi0JCQkJcmV0dXJuIC1FQlVTWTsJLyogYnVmZmVyIHdhc24ndCBhdmFpbGFibGUuIEJ1bW1lciAqLwotCQkJcGRldi0+aW1hZ2VfdXNlZFt2bS0+ZnJhbWVdID0gMTsKLQotCQkJLyogT2theSwgd2UncmUgZG9uZSBoZXJlLiBJbiB0aGUgU1lOQyBjYWxsIHdlIHdhaXQgdW50aWwgYQotCQkJICAgZnJhbWUgY29tZXMgYXZhaWxhYmxlLCB0aGVuIGV4cGFuZCBpbWFnZSBpbnRvIHRoZSBnaXZlbgotCQkJICAgYnVmZmVyLgotCQkJICAgSW4gY29udHJhc3QgdG8gdGhlIENQaUEgY2FtIHRoZSBQaGlsaXBzIGNhbXMgZGVsaXZlciBhCi0JCQkgICBjb25zdGFudCBzdHJlYW0sIGFsbW9zdCBsaWtlIGEgZ3JhYmJlciBjYXJkLiBBbHNvLAotCQkJICAgd2UgaGF2ZSBzZXBhcmF0ZSBidWZmZXJzIGZvciB0aGUgcmF3ZGF0YSBhbmQgdGhlIGltYWdlLAotCQkJICAgbWVhbmluZyB3ZSBjYW4gbmVhcmx5IGFsd2F5cyBleHBhbmQgaW50byB0aGUgcmVxdWVzdGVkIGJ1ZmZlci4KLQkJCSAqLwotCQkJVHJhY2UoVFJBQ0VfUkVBRCwgIlZJRElPQ01DQVBUVVJFIGRvbmUuXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBWSURJT0NTWU5DOgotCQl7Ci0JCQkvKiBUaGUgZG9jIHNheXM6ICJXaGVuZXZlciBhIGJ1ZmZlciBpcyB1c2VkIGl0IHNob3VsZAotCQkJICAgY2FsbCBWSURJT0NTWU5DIHRvIGZyZWUgdGhpcyBmcmFtZSB1cCBhbmQgY29udGludWUuIgotCi0JCQkgICBUaGUgb25seSBvZGQgdGhpbmcgYWJvdXQgdGhpcyB3aG9sZSBwcm9jZWR1cmUgaXMKLQkJCSAgIHRoYXQgTUNBUFRVUkUgZmxhZ3MgdGhlIGJ1ZmZlciBhcyAiaW4gdXNlIiwgYW5kCi0JCQkgICBTWU5DIGltbWVkaWF0ZWx5IHVubWFya3MgaXQsIHdoaWxlIGl0IGlzbid0Ci0JCQkgICBhZnRlciBTWU5DIHRoYXQgeW91IGtub3cgdGhhdCB0aGUgYnVmZmVyIGFjdHVhbGx5Ci0JCQkgICBnb3QgZmlsbGVkISBTbyB5b3UgYmV0dGVyIG5vdCBzdGFydCBhIENBUFRVUkUgaW4KLQkJCSAgIHRoZSBzYW1lIGZyYW1lIGltbWVkaWF0ZWx5ICh1c2UgZG91YmxlIGJ1ZmZlcmluZykuCi0JCQkgICBUaGlzIGlzIG5vdCBhIHByb2JsZW0gZm9yIHRoaXMgY2FtLCBzaW5jZSBpdCBoYXMKLQkJCSAgIGV4dHJhIGludGVybWVkaWF0ZSBidWZmZXJzLCBidXQgYSBoYXJkd2FyZQotCQkJICAgZ3JhYmJlciBjYXJkIHdpbGwgdGhlbiBvdmVyd3JpdGUgdGhlIGJ1ZmZlcgotCQkJICAgeW91J3JlIHdvcmtpbmcgb24uCi0JCQkgKi8KLQkJCWludCAqbWJ1ZiA9IGFyZzsKLQkJCWludCByZXQ7Ci0KLQkJCVRyYWNlKFRSQUNFX1JFQUQsICJWSURJT0NTWU5DIGNhbGxlZCAoJWQpLlxuIiwgKm1idWYpOwotCi0JCQkvKiBib3VuZHMgY2hlY2sgKi8KLQkJCWlmICgqbWJ1ZiA8IDAgfHwgKm1idWYgPj0gZGVmYXVsdF9tYnVmcykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCS8qIGNoZWNrIGlmIHRoaXMgYnVmZmVyIHdhcyByZXF1ZXN0ZWQgYW55d2F5ICovCi0JCQlpZiAocGRldi0+aW1hZ2VfdXNlZFsqbWJ1Zl0gPT0gMCkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJLyogQWRkIG91cnNlbHZlcyB0byB0aGUgZnJhbWUgd2FpdC1xdWV1ZS4KLQotCQkJICAgRklYTUU6IG5lZWRzIGF1ZGl0aW5nIGZvciBzYWZldHkuCi0JCQkgICBRVUVTVElPTjogSW4gd2hhdCByZXNwZWN0PyBJIHRoaW5rIHRoYXQgdXNpbmcgdGhlCi0JCQkJICAgICBmcmFtZXEgaXMgc2FmZSBub3cuCi0JCQkgKi8KLQkJCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgewotCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOwotCQkJCX0KLQotCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7Ci0JCQkJfQotCQkJCXNjaGVkdWxlKCk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJCX0KLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQkJCS8qIFRoZSBmcmFtZSBpcyByZWFkeS4gRXhwYW5kIGluIHRoZSBpbWFnZSBidWZmZXIKLQkJCSAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSSBkb24ndCBjYXJlIGlmIHlvdQotCQkJICAgbW1hcCgpIDUgYnVmZmVycyBhbmQgcmVxdWVzdCBkYXRhIGluIHRoaXMgb3JkZXI6Ci0JCQkgICBidWZmZXIgNCAyIDMgMCAxIDIgMyAwIDQgMyAxIC4gLiAuCi0JCQkgICBHcmFiYmVyIGhhcmR3YXJlIG1heSBub3QgYmUgc28gZm9yZ2l2aW5nLgotCQkJICovCi0JCQlUcmFjZShUUkFDRV9SRUFELCAiVklESU9DU1lOQzogZnJhbWUgcmVhZHkuXG4iKTsKLQkJCXBkZXYtPmZpbGxfaW1hZ2UgPSAqbWJ1ZjsgLyogdGVsbCBpbiB3aGljaCBidWZmZXIgd2Ugd2FudCB0aGUgaW1hZ2UgdG8gYmUgZXhwYW5kZWQgKi8KLQkJCS8qIERlY29tcHJlc3MsIGV0YyAqLwotCQkJcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKLQkJCXBkZXYtPmltYWdlX3VzZWRbKm1idWZdID0gMDsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgVklESU9DR0FVRElPOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7Ci0KLQkJCXN0cmNweSh2LT5uYW1lLCAiTWljcm9waG9uZSIpOwotCQkJdi0+YXVkaW8gPSAtMTsgLyogdW5rbm93biBhdWRpbyBtaW5vciAqLwotCQkJdi0+ZmxhZ3MgPSAwOwotCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87Ci0JCQl2LT52b2x1bWUgPSAwOwotCQkJdi0+YmFzcyA9IDA7Ci0JCQl2LT50cmVibGUgPSAwOwotCQkJdi0+YmFsYW5jZSA9IDB4ODAwMDsKLQkJCXYtPnN0ZXAgPSAxOwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFZJRElPQ1NBVURJTzoKLQkJewotCQkJLyogRHVtbXk6IG5vdGhpbmcgY2FuIGJlIHNldCAqLwotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIFZJRElPQ0dVTklUOgotCQl7Ci0JCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdnUgPSBhcmc7Ci0KLQkJCXZ1LT52aWRlbyA9IHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRjsKLQkJCXZ1LT5hdWRpbyA9IC0xOyAvKiBub3Qga25vd24geWV0ICovCi0JCQl2dS0+dmJpID0gLTE7Ci0JCQl2dS0+cmFkaW8gPSAtMTsKLQkJCXZ1LT50ZWxldGV4dCA9IC0xOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCXJldHVybiBwd2NfaW9jdGwocGRldiwgY21kLCBhcmcpOwotCX0gLyogLi5zd2l0Y2ggKi8KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBwd2NfdmlkZW9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlyZXR1cm4gdmlkZW9fdXNlcmNvcHkoaW5vZGUsIGZpbGUsIGNtZCwgYXJnLCBwd2NfdmlkZW9fZG9faW9jdGwpOwogfQogCi0KIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IHZtYS0+dm1fc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBzaXplICA9IHZtYS0+dm1fZW5kLXZtYS0+dm1fc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBwYWdlLCBwb3M7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJdW5zaWduZWQgbG9uZyBwYWdlLCBwb3MgPSAwOworCWludCBpbmRleDsKIAotCVRyYWNlKFRSQUNFX01FTU9SWSwgIm1tYXAoMHglcCwgMHglbHgsICVsdSkgY2FsbGVkLlxuIiwgdmRldiwgc3RhcnQsIHNpemUpOworCVBXQ19ERUJVR19NRU1PUlkoIj4+ICVzXG4iLCBfX0ZVTkNUSU9OX18pOwogCXBkZXYgPSB2ZGV2LT5wcml2OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OwogCi0Jdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkvKiBGaW5kIHRoZSBpZHggYnVmZmVyIGZvciB0aGlzIG1hcHBpbmcgKi8KKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwd2NfbWJ1ZnM7IGluZGV4KyspIHsKKwkJcG9zID0gcGRldi0+aW1hZ2VzW2luZGV4XS5vZmZzZXQ7CisJCWlmICgocG9zPj5QQUdFX1NISUZUKSA9PSB2bWEtPnZtX3Bnb2ZmKQorCQkJYnJlYWs7CisJfQorCWlmIChpbmRleCA9PSBNQVhfSU1BR0VTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaW5kZXggPT0gMCkgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHY0bDEuIEluIHY0bDEsIHdlIG1hcCBvbmx5IG9uZSBiaWcgYnVmZmVyLAorCQkgKiBidXQgaW4gdjRsMiBlYWNoIGJ1ZmZlciBpcyBtYXBwZWQKKwkJICovCisJCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKKwkJdG90YWxfc2l6ZSA9IHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCWlmIChzaXplICE9IHBkZXYtPmxlbl9wZXJfaW1hZ2UgJiYgc2l6ZSAhPSB0b3RhbF9zaXplKSB7CisJCQlQV0NfRVJST1IoIldyb25nIHNpemUgKCVsdSkgbmVlZGVkIHRvIGJlIGxlbl9wZXJfaW1hZ2U9JWQgb3IgdG90YWxfc2l6ZT0lbHVcbiIsCisJCQkJICAgc2l6ZSwgcGRldi0+bGVuX3Blcl9pbWFnZSwgdG90YWxfc2l6ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAoc2l6ZSA+IHBkZXYtPmxlbl9wZXJfaW1hZ2UpCisJCXJldHVybiAtRUlOVkFMOwogCi0JcG9zID0gKHVuc2lnbmVkIGxvbmcpcGRldi0+aW1hZ2VfZGF0YTsKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwkvKiBmcm9tIDIuNi45LWFjWCAqLworCisJcG9zICs9ICh1bnNpZ25lZCBsb25nKXBkZXYtPmltYWdlX2RhdGE7CiAJd2hpbGUgKHNpemUgPiAwKSB7CiAJCXBhZ2UgPSB2bWFsbG9jX3RvX3Bmbigodm9pZCAqKXBvcyk7CiAJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCBzdGFydCwgcGFnZSwgUEFHRV9TSVpFLCBQQUdFX1NIQVJFRCkpCiAJCQlyZXR1cm4gLUVBR0FJTjsKLQogCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJCXBvcyArPSBQQUdFX1NJWkU7CiAJCWlmIChzaXplID4gUEFHRV9TSVpFKQpAQCAtMTYyNCw3ICsxMzkyLDYgQEAKIAkJZWxzZQogCQkJc2l6ZSA9IDA7CiAJfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NDUsMTAgKzE0MTIsMTIgQEAKIAlpbnQgdmlkZW9fbnIgPSAtMTsgLyogZGVmYXVsdDogdXNlIG5leHQgYXZhaWxhYmxlIGRldmljZSAqLwogCWNoYXIgc2VyaWFsX251bWJlclszMF0sICpuYW1lOwogCisJdmVuZG9yX2lkID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcik7CisJcHJvZHVjdF9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KTsKKwogCS8qIENoZWNrIGlmIHdlIGNhbiBoYW5kbGUgdGhpcyBkZXZpY2UgKi8KLQlUcmFjZShUUkFDRV9QUk9CRSwgInByb2JlKCkgY2FsbGVkIFslMDRYICUwNFhdLCBpZiAlZFxuIiwKLQkJbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCi0JCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRQcm9kdWN0KSwKKwlQV0NfREVCVUdfUFJPQkUoInByb2JlKCkgY2FsbGVkIFslMDRYICUwNFhdLCBpZiAlZFxuIiwKKwkJdmVuZG9yX2lkLCBwcm9kdWN0X2lkLAogCQlpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIpOwogCiAJLyogdGhlIGludGVyZmFjZXMgYXJlIHByb2JlZCBvbmUgYnkgb25lLiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZQpAQCAtMTY1OCw2MSArMTQyNyw2MyBAQAogCWlmIChpbnRmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPiAwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXZlbmRvcl9pZCA9IGxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpOwotCXByb2R1Y3RfaWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCk7Ci0KIAlpZiAodmVuZG9yX2lkID09IDB4MDQ3MSkgewogCQlzd2l0Y2ggKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDAzMDI6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDQTY0NVZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDQTY0NVZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2NDUgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2NDU7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMDM6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDQTY0NlZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDQTY0NlZDIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2NDYgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2NDY7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMDQ6Ci0JCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDIgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkFza2V5IFZDMDEwIHR5cGUgMiBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkFza2V5IFZDMDEwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNjQ2OwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwMzA3OgotCQkJSW5mbygiUGhpbGlwcyBQQ1ZDNjc1SyAoVmVzdGEpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM2NzVLIChWZXN0YSkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJQaGlsaXBzIDY3NSB3ZWJjYW0iOwogCQkJdHlwZV9pZCA9IDY3NTsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDMwODoKLQkJCUluZm8oIlBoaWxpcHMgUENWQzY4MEsgKFZlc3RhIFBybykgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlBoaWxpcHMgUENWQzY4MEsgKFZlc3RhIFBybykgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJQaGlsaXBzIDY4MCB3ZWJjYW0iOwogCQkJdHlwZV9pZCA9IDY4MDsKIAkJCWJyZWFrOwogCQljYXNlIDB4MDMwQzoKLQkJCUluZm8oIlBoaWxpcHMgUENWQzY5MEsgKFZlc3RhIFBybyBTY2FuKSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiUGhpbGlwcyBQQ1ZDNjkwSyAoVmVzdGEgUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA2OTAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA2OTA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTA6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3MzBLIChUb1VDYW0gRnVuKS9QQ1ZDODMwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3MzBLIChUb1VDYW0gRnVuKS9QQ1ZDODMwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3MzAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3MzA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTE6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3NDBLIChUb1VDYW0gUHJvKS9QQ1ZDODQwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3NDBLIChUb1VDYW0gUHJvKS9QQ1ZDODQwIChUb1VDYW0gSUkpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3NDAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3NDA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTI6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3NTBLIChUb1VDYW0gUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3NTBLIChUb1VDYW0gUHJvIFNjYW4pIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3NTAgd2ViY2FtIjsKIAkJCXR5cGVfaWQgPSA3NTA7CiAJCQlicmVhazsKIAkJY2FzZSAweDAzMTM6Ci0JCQlJbmZvKCJQaGlsaXBzIFBDVkM3MjBLLzQwIChUb1VDYW0gWFMpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJQaGlsaXBzIFBDVkM3MjBLLzQwIChUb1VDYW0gWFMpIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiUGhpbGlwcyA3MjBLLzQwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNzIwOwogCQkJYnJlYWs7CisJCWNhc2UgMHgwMzI5OgorCQkJUFdDX0lORk8oIlBoaWxpcHMgU1BDIDkwME5DIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiUGhpbGlwcyBTUEMgOTAwTkMgd2ViY2FtIjsKKwkJCXR5cGVfaWQgPSA3MjA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PREVWOwogCQkJYnJlYWs7CkBAIC0xNzIxLDcgKzE0OTIsNyBAQAogCWVsc2UgaWYgKHZlbmRvcl9pZCA9PSAweDA2OUEpIHsKIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDAwMDE6Ci0JCQlJbmZvKCJBc2tleSBWQzAxMCB0eXBlIDEgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkFza2V5IFZDMDEwIHR5cGUgMSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkFza2V5IFZDMDEwIHdlYmNhbSI7CiAJCQl0eXBlX2lkID0gNjQ1OwogCQkJYnJlYWs7CkBAIC0xNzMzLDMyICsxNTA0LDMzIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQ2ZCkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4MDhiMDoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyAzMDAwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBQcm8gMzAwMCBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyAzMDAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMToKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIE5vdGVib29rIFBybyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gTm90ZWJvb2sgUHJvIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMjoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIDQwMDAgUHJvIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSA0MDAwIFBybyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyA0MDAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhiMzoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBab29tIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MDhCNDoKLQkJCUluZm8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBab29tIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCXBvd2VyX3NhdmUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGI1OgotCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdC9TcGhlcmUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBPcmJpdCI7CiAJCQl0eXBlX2lkID0gNzQwOyAvKiBDQ0Qgc2Vuc29yICovCiAJCQlmZWF0dXJlcyB8PSBGRUFUVVJFX01PVE9SX1BBTlRJTFQ7CkBAIC0xNzY2LDcgKzE1MzgsNyBAQAogCQljYXNlIDB4MDhiNjoKIAkJY2FzZSAweDA4Yjc6CiAJCWNhc2UgMHgwOGI4OgotCQkJSW5mbygiTG9naXRlY2ggUXVpY2tDYW0gZGV0ZWN0ZWQgKHJlc2VydmVkIElEKS5cbiIpOworCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIGRldGVjdGVkIChyZXNlcnZlZCBJRCkuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gKHJlcy4pIjsKIAkJCXR5cGVfaWQgPSA3MzA7IC8qIEFzc3VtaW5nIENNT1MgKi8KIAkJCWJyZWFrOwpAQCAtMTc4MiwxNSArMTU1NCwyMCBAQAogCQkgKi8KIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDkwMDA6Ci0JCQlJbmZvKCJTYW1zdW5nIE1QQy1DMTAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlNhbXN1bmcgTVBDLUMxMCBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIlNhbXN1bmcgTVBDLUMxMCI7CiAJCQl0eXBlX2lkID0gNjc1OwogCQkJYnJlYWs7CiAJCWNhc2UgMHg5MDAxOgotCQkJSW5mbygiU2Ftc3VuZyBNUEMtQzMwIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJTYW1zdW5nIE1QQy1DMzAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJTYW1zdW5nIE1QQy1DMzAiOwogCQkJdHlwZV9pZCA9IDY3NTsKIAkJCWJyZWFrOworCQljYXNlIDB4OTAwMjoKKwkJCVBXQ19JTkZPKCJTYW1zdW5nIFNOQy0zNUUgKHYzLjApIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCW5hbWUgPSAiU2Ftc3VuZyBNUEMtQzMwIjsKKwkJCXR5cGVfaWQgPSA3NDA7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PREVWOwogCQkJYnJlYWs7CkBAIC0xNzk5LDEyICsxNTc2LDEyIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MDQxZSkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4NDAwYzoKLQkJCUluZm8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUgZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJDcmVhdGl2ZSBMYWJzIFdlYmNhbSA1IGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUiOwogCQkJdHlwZV9pZCA9IDczMDsKIAkJCWJyZWFrOwogCQljYXNlIDB4NDAxMToKLQkJCUluZm8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIFBybyBFeCBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJDcmVhdGl2ZSBMYWJzIFdlYmNhbSBQcm8gRXgiOwogCQkJdHlwZV9pZCA9IDc0MDsKIAkJCWJyZWFrOwpAQCAtMTgxNiw3ICsxNTkzLDcgQEAKIAllbHNlIGlmICh2ZW5kb3JfaWQgPT0gMHgwNGNjKSB7CiAJCXN3aXRjaChwcm9kdWN0X2lkKSB7CiAJCWNhc2UgMHg4MTE2OgotCQkJSW5mbygiU290ZWMgQWZpbmEgRXllIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKKwkJCVBXQ19JTkZPKCJTb3RlYyBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJTb3RlYyBBZmluYSBFeWUiOwogCQkJdHlwZV9pZCA9IDczMDsKIAkJCWJyZWFrOwpAQCAtMTgyOSw3ICsxNjA2LDcgQEAKIAkJc3dpdGNoKHByb2R1Y3RfaWQpIHsKIAkJY2FzZSAweDgxMTY6CiAJCQkvKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGNhbSBhcyB0aGUgU290ZWMgQWZpbmEgRXllICovCi0JCQlJbmZvKCJBTUUgQ28uIEFmaW5hIEV5ZSBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CisJCQlQV0NfSU5GTygiQU1FIENvLiBBZmluYSBFeWUgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJBTUUgQ28uIEFmaW5hIEV5ZSI7CiAJCQl0eXBlX2lkID0gNzUwOwogCQkJYnJlYWs7CkBAIC0xODQyLDEyICsxNjE5LDEyIEBACiAJZWxzZSBpZiAodmVuZG9yX2lkID09IDB4MGQ4MSkgewogCQlzd2l0Y2gocHJvZHVjdF9pZCkgewogCQljYXNlIDB4MTkwMDoKLQkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVUMzMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlZpc2lvbml0ZSBWQ1MtVUMzMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVDMzAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KIAkJCWJyZWFrOwogCQljYXNlIDB4MTkxMDoKLQkJCUluZm8oIlZpc2lvbml0ZSBWQ1MtVU0xMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOworCQkJUFdDX0lORk8oIlZpc2lvbml0ZSBWQ1MtVU0xMDAgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJWaXNpb25pdGUgVkNTLVVNMTAwIjsKIAkJCXR5cGVfaWQgPSA3MzA7IC8qIENNT1Mgc2Vuc29yICovCiAJCQlicmVhazsKQEAgLTE4NjEsMTUgKzE2MzgsMTUgQEAKIAogCW1lbXNldChzZXJpYWxfbnVtYmVyLCAwLCAzMCk7CiAJdXNiX3N0cmluZyh1ZGV2LCB1ZGV2LT5kZXNjcmlwdG9yLmlTZXJpYWxOdW1iZXIsIHNlcmlhbF9udW1iZXIsIDI5KTsKLQlUcmFjZShUUkFDRV9QUk9CRSwgIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKKwlQV0NfREVCVUdfUFJPQkUoIkRldmljZSBzZXJpYWwgbnVtYmVyIGlzICVzXG4iLCBzZXJpYWxfbnVtYmVyKTsKIAogCWlmICh1ZGV2LT5kZXNjcmlwdG9yLmJOdW1Db25maWd1cmF0aW9ucyA+IDEpCi0JCUluZm8oIldhcm5pbmc6IG1vcmUgdGhhbiAxIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlLlxuIik7CisJCVBXQ19XQVJOSU5HKCJXYXJuaW5nOiBtb3JlIHRoYW4gMSBjb25maWd1cmF0aW9uIGF2YWlsYWJsZS5cbiIpOwogCiAJLyogQWxsb2NhdGUgc3RydWN0dXJlLCBpbml0aWFsaXplIHBvaW50ZXJzLCBtdXRleGVzLCBldGMuIGFuZCBsaW5rIGl0IHRvIHRoZSB1c2JfZGV2aWNlICovCiAJcGRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHBkZXYgPT0gTlVMTCkgewotCQlFcnIoIk9vcHMsIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHB3Y19kZXZpY2UuXG4iKTsKKwkJUFdDX0VSUk9SKCJPb3BzLCBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwd2NfZGV2aWNlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwZGV2LT50eXBlID0gdHlwZV9pZDsKQEAgLTE5MDAsMTcgKzE2NzcsMTggQEAKIAlwZGV2LT52ZGV2ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7CiAJaWYgKHBkZXYtPnZkZXYgPT0gMCkKIAl7Ci0JCUVycigiRXJyLCBjYW5ub3QgYWxsb2NhdGUgdmlkZW9fZGV2aWNlIHN0cnV0dXJlLiBGYWlsaW5nIHByb2JlLiIpOworCQlQV0NfRVJST1IoIkVyciwgY2Fubm90IGFsbG9jYXRlIHZpZGVvX2RldmljZSBzdHJ1dHVyZS4gRmFpbGluZyBwcm9iZS4iKTsKIAkJa2ZyZWUocGRldik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAltZW1jcHkocGRldi0+dmRldiwgJnB3Y190ZW1wbGF0ZSwgc2l6ZW9mKHB3Y190ZW1wbGF0ZSkpOworCXBkZXYtPnZkZXYtPmRldiA9ICYodWRldi0+ZGV2KTsKIAlzdHJjcHkocGRldi0+dmRldi0+bmFtZSwgbmFtZSk7CiAJcGRldi0+dmRldi0+b3duZXIgPSBUSElTX01PRFVMRTsKIAl2aWRlb19zZXRfZHJ2ZGF0YShwZGV2LT52ZGV2LCBwZGV2KTsKIAogCXBkZXYtPnJlbGVhc2UgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSk7Ci0JVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWxlYXNlOiAlMDR4XG4iLCBwZGV2LT5yZWxlYXNlKTsKKwlQV0NfREVCVUdfUFJPQkUoIlJlbGVhc2U6ICUwNHhcbiIsIHBkZXYtPnJlbGVhc2UpOwogCiAJLyogTm93IHNlYXJjaCBkZXZpY2VfaGludFtdIHRhYmxlIGZvciBhIG1hdGNoLCBzbyB3ZSBjYW4gaGludCBhIG5vZGUgbnVtYmVyLiAqLwogCWZvciAoaGludCA9IDA7IGhpbnQgPCBNQVhfREVWX0hJTlRTOyBoaW50KyspIHsKQEAgLTE5MTgsMTAgKzE2OTYsMTAgQEAKIAkJICAgICAoZGV2aWNlX2hpbnRbaGludF0ucGRldiA9PSBOVUxMKSkgewogCQkJLyogc28gZmFyLCBzbyBnb29kLi4uIHRyeSBzZXJpYWwgbnVtYmVyICovCiAJCQlpZiAoKGRldmljZV9oaW50W2hpbnRdLnNlcmlhbF9udW1iZXJbMF0gPT0gJyonKSB8fCAhc3RyY21wKGRldmljZV9oaW50W2hpbnRdLnNlcmlhbF9udW1iZXIsIHNlcmlhbF9udW1iZXIpKSB7Ci0JCQkgICAgCS8qIG1hdGNoISAqLwotCQkJICAgIAl2aWRlb19uciA9IGRldmljZV9oaW50W2hpbnRdLmRldmljZV9ub2RlOwotCQkJICAgIAlUcmFjZShUUkFDRV9QUk9CRSwgIkZvdW5kIGhpbnQsIHdpbGwgdHJ5IHRvIHJlZ2lzdGVyIGFzIC9kZXYvdmlkZW8lZFxuIiwgdmlkZW9fbnIpOwotCQkJICAgIAlicmVhazsKKwkJCQkvKiBtYXRjaCEgKi8KKwkJCQl2aWRlb19uciA9IGRldmljZV9oaW50W2hpbnRdLmRldmljZV9ub2RlOworCQkJCVBXQ19ERUJVR19QUk9CRSgiRm91bmQgaGludCwgd2lsbCB0cnkgdG8gcmVnaXN0ZXIgYXMgL2Rldi92aWRlbyVkXG4iLCB2aWRlb19ucik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CkBAIC0xOTI5LDIxICsxNzA3LDI3IEBACiAJcGRldi0+dmRldi0+cmVsZWFzZSA9IHZpZGVvX2RldmljZV9yZWxlYXNlOwogCWkgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOwogCWlmIChpIDwgMCkgewotCQlFcnIoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOworCQlQV0NfRVJST1IoIkZhaWxlZCB0byByZWdpc3RlciBhcyB2aWRlbyBkZXZpY2UgKCVkKS5cbiIsIGkpOwogCQl2aWRlb19kZXZpY2VfcmVsZWFzZShwZGV2LT52ZGV2KTsgLyogRHJpcC4uLiBkcmlwLi4uIGRyaXAuLi4gKi8KIAkJa2ZyZWUocGRldik7IC8qIE9vcHMsIG5vIG1lbW9yeSBsZWFrcyBwbGVhc2UgKi8KIAkJcmV0dXJuIC1FSU87CiAJfQogCWVsc2UgewotCQlJbmZvKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CisJCVBXQ19JTkZPKCJSZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZC5cbiIsIHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRik7CiAJfQogCiAJLyogb2NjdXB5IHNsb3QgKi8KIAlpZiAoaGludCA8IE1BWF9ERVZfSElOVFMpCiAJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBwZGV2OwogCi0JVHJhY2UoVFJBQ0VfUFJPQkUsICJwcm9iZSgpIGZ1bmN0aW9uIHJldHVybmluZyBzdHJ1Y3QgYXQgMHglcC5cbiIsIHBkZXYpOworCVBXQ19ERUJVR19QUk9CRSgicHJvYmUoKSBmdW5jdGlvbiByZXR1cm5pbmcgc3RydWN0IGF0IDB4JXAuXG4iLCBwZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhIChpbnRmLCBwZGV2KTsKKwlwd2NfY3JlYXRlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOworCisJLyogU2V0IHRoZSBsZWRzIG9mZiAqLworCXB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKTsKKwlwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5NTcsMjcgKzE3NDEsMjEgQEAKIAlwZGV2ID0gdXNiX2dldF9pbnRmZGF0YSAoaW50Zik7CiAJdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7CiAJaWYgKHBkZXYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgQ2FsbGVkIHdpdGhvdXQgcHJpdmF0ZSBwb2ludGVyLlxuIik7CisJCVBXQ19FUlJPUigicHdjX2Rpc2Nvbm5lY3QoKSBDYWxsZWQgd2l0aG91dCBwcml2YXRlIHBvaW50ZXIuXG4iKTsKIAkJZ290byBkaXNjb25uZWN0X291dDsKIAl9CiAJaWYgKHBkZXYtPnVkZXYgPT0gTlVMTCkgewotCQlFcnIoInB3Y19kaXNjb25uZWN0KCkgYWxyZWFkeSBjYWxsZWQgZm9yICVwXG4iLCBwZGV2KTsKKwkJUFdDX0VSUk9SKCJwd2NfZGlzY29ubmVjdCgpIGFscmVhZHkgY2FsbGVkIGZvciAlcFxuIiwgcGRldik7CiAJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CiAJfQogCWlmIChwZGV2LT51ZGV2ICE9IGludGVyZmFjZV90b191c2JkZXYoaW50ZikpIHsKLQkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIFdvb3BzOiBwb2ludGVyIG1pc21hdGNoIHVkZXYvcGRldi5cbiIpOworCQlQV0NfRVJST1IoInB3Y19kaXNjb25uZWN0KCkgV29vcHM6IHBvaW50ZXIgbWlzbWF0Y2ggdWRldi9wZGV2LlxuIik7CiAJCWdvdG8gZGlzY29ubmVjdF9vdXQ7CiAJfQotI2lmZGVmIFBXQ19NQUdJQwotCWlmIChwZGV2LT5tYWdpYyAhPSBQV0NfTUFHSUMpIHsKLQkJRXJyKCJwd2NfZGlzY29ubmVjdCgpIE1hZ2ljIG51bWJlciBmYWlsZWQuIENvbnN1bHQgeW91ciBzY3JvbGxzIGFuZCB0cnkgYWdhaW4uXG4iKTsKLQkJZ290byBkaXNjb25uZWN0X291dDsKLQl9Ci0jZW5kaWYKIAogCS8qIFdlIGdvdCB1bnBsdWdnZWQ7IHRoaXMgaXMgc2lnbmFsbGVkIGJ5IGFuIEVQSVBFIGVycm9yIGNvZGUgKi8KIAlpZiAocGRldi0+dm9wZW4pIHsKLQkJSW5mbygiRGlzY29ubmVjdGVkIHdoaWxlIHdlYmNhbSBpcyBpbiB1c2UhXG4iKTsKKwkJUFdDX0lORk8oIkRpc2Nvbm5lY3RlZCB3aGlsZSB3ZWJjYW0gaXMgaW4gdXNlIVxuIik7CiAJCXBkZXYtPmVycm9yX3N0YXR1cyA9IEVQSVBFOwogCX0KIApAQCAtMTk4Nyw3ICsxNzY1LDggQEAKIAl3aGlsZSAocGRldi0+dm9wZW4pCiAJCXNjaGVkdWxlKCk7CiAJLyogRGV2aWNlIGlzIG5vdyBjbG9zZWQsIHNvIHdlIGNhbiBzYWZlbHkgdW5yZWdpc3RlciBpdCAqLwotCVRyYWNlKFRSQUNFX1BST0JFLCAiVW5yZWdpc3RlcmluZyB2aWRlbyBkZXZpY2UgaW4gZGlzY29ubmVjdCgpLlxuIik7CisJUFdDX0RFQlVHX1BST0JFKCJVbnJlZ2lzdGVyaW5nIHZpZGVvIGRldmljZSBpbiBkaXNjb25uZWN0KCkuXG4iKTsKKwlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYtPnZkZXYpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkZXYtPnZkZXYpOwogCiAJLyogRnJlZSBtZW1vcnkgKGRvbid0IHNldCBwZGV2IHRvIDAganVzdCB5ZXQpICovCkBAIC0yMDIxLDU4ICsxODAwLDY0IEBACiAgKiBJbml0aWFsaXphdGlvbiBjb2RlICYgbW9kdWxlIHN0dWZmCiAgKi8KIAotc3RhdGljIGNoYXIgc2l6ZVsxMF07Ci1zdGF0aWMgaW50IGZwcyA9IDA7Ci1zdGF0aWMgaW50IGZidWZzID0gMDsKLXN0YXRpYyBpbnQgbWJ1ZnMgPSAwOwotc3RhdGljIGludCB0cmFjZSA9IC0xOworc3RhdGljIGNoYXIgKnNpemU7CitzdGF0aWMgaW50IGZwczsKK3N0YXRpYyBpbnQgZmJ1ZnM7CitzdGF0aWMgaW50IG1idWZzOwogc3RhdGljIGludCBjb21wcmVzc2lvbiA9IC0xOwogc3RhdGljIGludCBsZWRzWzJdID0geyAtMSwgLTEgfTsKLXN0YXRpYyBjaGFyICpkZXZfaGludFtNQVhfREVWX0hJTlRTXSA9IHsgfTsKK3N0YXRpYyBpbnQgbGVkc19uYXJnczsKK3N0YXRpYyBjaGFyICpkZXZfaGludFtNQVhfREVWX0hJTlRTXTsKK3N0YXRpYyBpbnQgZGV2X2hpbnRfbmFyZ3M7CiAKLW1vZHVsZV9wYXJhbV9zdHJpbmcoc2l6ZSwgc2l6ZSwgc2l6ZW9mKHNpemUpLCAwKTsKK21vZHVsZV9wYXJhbShzaXplLCBjaGFycCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGZidWZzLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKG1idWZzLCBpbnQsIDA0NDQpOworI2lmIENPTkZJR19QV0NfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZCh0cmFjZSwgcHdjX3RyYWNlLCBpbnQsIDA2NDQpOworI2VuZGlmCittb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShsZWRzLCBpbnQsICZsZWRzX25hcmdzLCAwNDQ0KTsKK21vZHVsZV9wYXJhbV9hcnJheShkZXZfaGludCwgY2hhcnAsICZkZXZfaGludF9uYXJncywgMDQ0NCk7CisKIE1PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgaW1hZ2Ugc2l6ZS4gT25lIG9mIHNxY2lmLCBxc2lmLCBxY2lmLCBzaWYsIGNpZiwgdmdhIik7Ci1tb2R1bGVfcGFyYW0oZnBzLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyhmcHMsICJJbml0aWFsIGZyYW1lcyBwZXIgc2Vjb25kLiBWYXJpZXMgd2l0aCBtb2RlbCwgdXNlZnVsIHJhbmdlIDUtMzAiKTsKLW1vZHVsZV9wYXJhbShmYnVmcywgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmJ1ZnMsICJOdW1iZXIgb2YgaW50ZXJuYWwgZnJhbWUgYnVmZmVycyB0byByZXNlcnZlIik7Ci1tb2R1bGVfcGFyYW0obWJ1ZnMsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1idWZzLCAiTnVtYmVyIG9mIGV4dGVybmFsIChtbWFwKCllZCkgaW1hZ2UgYnVmZmVycyIpOwotbW9kdWxlX3BhcmFtKHRyYWNlLCBpbnQsIDAwMDApOwogTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkZvciBkZWJ1Z2dpbmcgcHVycG9zZXMiKTsKLW1vZHVsZV9wYXJhbShwb3dlcl9zYXZlLCBib29sLCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocG93ZXJfc2F2ZSwgIlR1cm4gcG93ZXIgc2F2ZSBmZWF0dXJlIGluIGNhbWVyYSBvbiBvciBvZmYiKTsKLW1vZHVsZV9wYXJhbShjb21wcmVzc2lvbiwgaW50LCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoY29tcHJlc3Npb24sICJQcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eS4gUmFuZ2UgMCAodW5jb21wcmVzc2VkKSB0byAzIChoaWdoIGNvbXByZXNzaW9uKSIpOwotbW9kdWxlX3BhcmFtX2FycmF5KGxlZHMsIGludCwgTlVMTCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxlZHMsICJMRUQgb24sb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzIik7Ci1tb2R1bGVfcGFyYW1fYXJyYXkoZGV2X2hpbnQsIGNoYXJwLCBOVUxMLCAwMDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X2hpbnQsICJEZXZpY2Ugbm9kZSBoaW50cyIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlBoaWxpcHMgJiBPRU0gVVNCIHdlYmNhbSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkx1YyBTYWlsbGFyZCA8bHVjQHNhaWxsYXJkLm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicHdjeCIpOworTU9EVUxFX1ZFUlNJT04oIFBXQ19WRVJTSU9OICk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHVzYl9wd2NfaW5pdCh2b2lkKQogewogCWludCBpLCBzejsKIAljaGFyICpzaXplbmFtZXNbUFNaX01BWF0gPSB7ICJzcWNpZiIsICJxc2lmIiwgInFjaWYiLCAic2lmIiwgImNpZiIsICJ2Z2EiIH07CiAKLQlJbmZvKCJQaGlsaXBzIHdlYmNhbSBtb2R1bGUgdmVyc2lvbiAiIFBXQ19WRVJTSU9OICIgbG9hZGVkLlxuIik7Ci0JSW5mbygiU3VwcG9ydHMgUGhpbGlwcyBQQ0E2NDUvNjQ2LCBQQ1ZDNjc1LzY4MC82OTAsIFBDVkM3MjBbNDBdLzczMC83NDAvNzUwICYgUENWQzgzMC84NDAuXG4iKTsKLQlJbmZvKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOwotCUluZm8oInRoZSBDcmVhdGl2ZSBXZWJDYW0gNSAmIFBybyBFeCwgU09URUMgQWZpbmEgRXllIGFuZCBWaXNpb25pdGUgVkNTLVVDMzAwIGFuZCBWQ1MtVU0xMDAuXG4iKTsKKwlQV0NfSU5GTygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHZlcnNpb24gIiBQV0NfVkVSU0lPTiAiIGxvYWRlZC5cbiIpOworCVBXQ19JTkZPKCJTdXBwb3J0cyBQaGlsaXBzIFBDQTY0NS82NDYsIFBDVkM2NzUvNjgwLzY5MCwgUENWQzcyMFs0MF0vNzMwLzc0MC83NTAgJiBQQ1ZDODMwLzg0MC5cbiIpOworCVBXQ19JTkZPKCJBbHNvIHN1cHBvcnRzIHRoZSBBc2tleSBWQzAxMCwgdmFyaW91cyBMb2dpdGVjaCBRdWlja2NhbXMsIFNhbXN1bmcgTVBDLUMxMCBhbmQgTVBDLUMzMCxcbiIpOworCVBXQ19JTkZPKCJ0aGUgQ3JlYXRpdmUgV2ViQ2FtIDUgJiBQcm8gRXgsIFNPVEVDIEFmaW5hIEV5ZSBhbmQgVmlzaW9uaXRlIFZDUy1VQzMwMCBhbmQgVkNTLVVNMTAwLlxuIik7CiAKIAlpZiAoZnBzKSB7CiAJCWlmIChmcHMgPCA0IHx8IGZwcyA+IDMwKSB7Ci0JCQlFcnIoIkZyYW1lcmF0ZSBvdXQgb2YgYm91bmRzICg0LTMwKS5cbiIpOworCQkJUFdDX0VSUk9SKCJGcmFtZXJhdGUgb3V0IG9mIGJvdW5kcyAoNC0zMCkuXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWRlZmF1bHRfZnBzID0gZnBzOwotCQlJbmZvKCJEZWZhdWx0IGZyYW1lcmF0ZSBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2Zwcyk7CisJCVBXQ19ERUJVR19NT0RVTEUoIkRlZmF1bHQgZnJhbWVyYXRlIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZnBzKTsKIAl9CiAKLQlpZiAoc2l6ZVswXSkgeworCWlmIChzaXplKSB7CiAJCS8qIHN0cmluZzsgdHJ5IG1hdGNoaW5nIHdpdGggYXJyYXkgKi8KIAkJZm9yIChzeiA9IDA7IHN6IDwgUFNaX01BWDsgc3orKykgewogCQkJaWYgKCFzdHJjbXAoc2l6ZW5hbWVzW3N6XSwgc2l6ZSkpIHsgLyogRm91bmQhICovCkBAIC0yMDgxLDQxICsxODY2LDQyIEBACiAJCQl9CiAJCX0KIAkJaWYgKHN6ID09IFBTWl9NQVgpIHsKLQkJCUVycigiU2l6ZSBub3QgcmVjb2duaXplZDsgdHJ5IHNpemU9W3NxY2lmIHwgcXNpZiB8IHFjaWYgfCBzaWYgfCBjaWYgfCB2Z2FdLlxuIik7CisJCQlQV0NfRVJST1IoIlNpemUgbm90IHJlY29nbml6ZWQ7IHRyeSBzaXplPVtzcWNpZiB8IHFzaWYgfCBxY2lmIHwgc2lmIHwgY2lmIHwgdmdhXS5cbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJSW5mbygiRGVmYXVsdCBpbWFnZSBzaXplIHNldCB0byAlcyBbJWR4JWRdLlxuIiwgc2l6ZW5hbWVzW2RlZmF1bHRfc2l6ZV0sIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLngsIHB3Y19pbWFnZV9zaXplc1tkZWZhdWx0X3NpemVdLnkpOworCQlQV0NfREVCVUdfTU9EVUxFKCJEZWZhdWx0IGltYWdlIHNpemUgc2V0IHRvICVzIFslZHglZF0uXG4iLCBzaXplbmFtZXNbZGVmYXVsdF9zaXplXSwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueSk7CiAJfQogCWlmIChtYnVmcykgewogCQlpZiAobWJ1ZnMgPCAxIHx8IG1idWZzID4gTUFYX0lNQUdFUykgewotCQkJRXJyKCJJbGxlZ2FsIG51bWJlciBvZiBtbWFwKCkgYnVmZmVyczsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgJWQuXG4iLCBNQVhfSU1BR0VTKTsKKwkJCVBXQ19FUlJPUigiSWxsZWdhbCBudW1iZXIgb2YgbW1hcCgpIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDEgYW5kICVkLlxuIiwgTUFYX0lNQUdFUyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlkZWZhdWx0X21idWZzID0gbWJ1ZnM7Ci0JCUluZm8oIk51bWJlciBvZiBpbWFnZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfbWJ1ZnMpOworCQlwd2NfbWJ1ZnMgPSBtYnVmczsKKwkJUFdDX0RFQlVHX01PRFVMRSgiTnVtYmVyIG9mIGltYWdlIGJ1ZmZlcnMgc2V0IHRvICVkLlxuIiwgcHdjX21idWZzKTsKIAl9CiAJaWYgKGZidWZzKSB7CiAJCWlmIChmYnVmcyA8IDIgfHwgZmJ1ZnMgPiBNQVhfRlJBTUVTKSB7Ci0JCQlFcnIoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7CisJCQlQV0NfRVJST1IoIklsbGVnYWwgbnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnM7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDIgYW5kICVkLlxuIiwgTUFYX0ZSQU1FUyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlkZWZhdWx0X2ZidWZzID0gZmJ1ZnM7Ci0JCUluZm8oIk51bWJlciBvZiBmcmFtZSBidWZmZXJzIHNldCB0byAlZC5cbiIsIGRlZmF1bHRfZmJ1ZnMpOworCQlQV0NfREVCVUdfTU9EVUxFKCJOdW1iZXIgb2YgZnJhbWUgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBkZWZhdWx0X2ZidWZzKTsKIAl9Ci0JaWYgKHRyYWNlID49IDApIHsKLQkJSW5mbygiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCB0cmFjZSk7Ci0JCXB3Y190cmFjZSA9IHRyYWNlOworI2lmIENPTkZJR19QV0NfREVCVUcKKwlpZiAocHdjX3RyYWNlID49IDApIHsKKwkJUFdDX0RFQlVHX01PRFVMRSgiVHJhY2Ugb3B0aW9uczogMHglMDR4XG4iLCBwd2NfdHJhY2UpOwogCX0KKyNlbmRpZgogCWlmIChjb21wcmVzc2lvbiA+PSAwKSB7CiAJCWlmIChjb21wcmVzc2lvbiA+IDMpIHsKLQkJCUVycigiSW52YWxpZCBjb21wcmVzc2lvbiBzZXR0aW5nOyB1c2UgYSBudW1iZXIgYmV0d2VlbiAwICh1bmNvbXByZXNzZWQpIGFuZCAzIChoaWdoKS5cbiIpOworCQkJUFdDX0VSUk9SKCJJbnZhbGlkIGNvbXByZXNzaW9uIHNldHRpbmc7IHVzZSBhIG51bWJlciBiZXR3ZWVuIDAgKHVuY29tcHJlc3NlZCkgYW5kIDMgKGhpZ2gpLlxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uID0gY29tcHJlc3Npb247Ci0JCUluZm8oIlByZWZlcnJlZCBjb21wcmVzc2lvbiBzZXQgdG8gJWQuXG4iLCBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uKTsKKwkJUFdDX0RFQlVHX01PRFVMRSgiUHJlZmVycmVkIGNvbXByZXNzaW9uIHNldCB0byAlZC5cbiIsIHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24pOwogCX0KIAlpZiAocG93ZXJfc2F2ZSkKLQkJSW5mbygiRW5hYmxpbmcgcG93ZXIgc2F2ZSBvbiBvcGVuL2Nsb3NlLlxuIik7CisJCVBXQ19ERUJVR19NT0RVTEUoIkVuYWJsaW5nIHBvd2VyIHNhdmUgb24gb3Blbi9jbG9zZS5cbiIpOwogCWlmIChsZWRzWzBdID49IDApCiAJCWxlZF9vbiA9IGxlZHNbMF07CiAJaWYgKGxlZHNbMV0gPj0gMCkKQEAgLTIxNDYsMTQgKzE5MzIsMTQgQEAKIAkJCQlkb3QrKzsKIAkJCS8qIEZldyBzYW5pdHkgY2hlY2tzICovCiAJCQlpZiAoKmRvdCAhPSAnXDAnICYmIGRvdCA+IGNvbG9uKSB7Ci0JCQkJRXJyKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IHRoZSBjb2xvbiBtdXN0IGJlIGFmdGVyIHRoZSBkb3QuXG4iKTsKKwkJCQlQV0NfRVJST1IoIk1hbGZvcm1lZCBjYW1lcmEgaGludDogdGhlIGNvbG9uIG11c3QgYmUgYWZ0ZXIgdGhlIGRvdC5cbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCiAJCQlpZiAoKmNvbG9uID09ICdcMCcpIHsKIAkJCQkvKiBObyBjb2xvbiAqLwogCQkJCWlmICgqZG90ICE9ICdcMCcpIHsKLQkJCQkJRXJyKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IG5vIGNvbG9uICsgZGV2aWNlIG5vZGUgZ2l2ZW4uXG4iKTsKKwkJCQkJUFdDX0VSUk9SKCJNYWxmb3JtZWQgY2FtZXJhIGhpbnQ6IG5vIGNvbG9uICsgZGV2aWNlIG5vZGUgZ2l2ZW4uXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWVsc2UgewpAQCAtMjE3OCwyOCArMTk2NCwyNyBAQAogCQkJCQlkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyW2tdID0gJ1wwJzsKIAkJCQl9CiAJCQl9Ci0jaWYgUFdDX0RFQlVHCi0JCQlEZWJ1ZygiZGV2aWNlX2hpbnRbJWRdOlxuIiwgaSk7Ci0JCQlEZWJ1ZygiICB0eXBlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLnR5cGUpOwotCQkJRGVidWcoIiAgc2VyaWFsIyA6ICVzXG4iLCBkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyKTsKLQkJCURlYnVnKCIgIG5vZGUgICAgOiAlZFxuIiwgZGV2aWNlX2hpbnRbaV0uZGV2aWNlX25vZGUpOwotI2VuZGlmCisJCQlQV0NfVFJBQ0UoImRldmljZV9oaW50WyVkXTpcbiIsIGkpOworCQkJUFdDX1RSQUNFKCIgIHR5cGUgICAgOiAlZFxuIiwgZGV2aWNlX2hpbnRbaV0udHlwZSk7CisJCQlQV0NfVFJBQ0UoIiAgc2VyaWFsIyA6ICVzXG4iLCBkZXZpY2VfaGludFtpXS5zZXJpYWxfbnVtYmVyKTsKKwkJCVBXQ19UUkFDRSgiICBub2RlICAgIDogJWRcbiIsIGRldmljZV9oaW50W2ldLmRldmljZV9ub2RlKTsKIAkJfQogCQllbHNlCiAJCQlkZXZpY2VfaGludFtpXS50eXBlID0gMDsgLyogbm90IGZpbGxlZCAqLwogCX0gLyogLi5mb3IgTUFYX0RFVl9ISU5UUyAqLwogCi0JVHJhY2UoVFJBQ0VfUFJPQkUsICJSZWdpc3RlcmluZyBkcml2ZXIgYXQgYWRkcmVzcyAweCVwLlxuIiwgJnB3Y19kcml2ZXIpOworCVBXQ19ERUJVR19QUk9CRSgiUmVnaXN0ZXJpbmcgZHJpdmVyIGF0IGFkZHJlc3MgMHglcC5cbiIsICZwd2NfZHJpdmVyKTsKIAlyZXR1cm4gdXNiX3JlZ2lzdGVyKCZwd2NfZHJpdmVyKTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHVzYl9wd2NfZXhpdCh2b2lkKQogewotCVRyYWNlKFRSQUNFX01PRFVMRSwgIkRlcmVnaXN0ZXJpbmcgZHJpdmVyLlxuIik7CisJUFdDX0RFQlVHX01PRFVMRSgiRGVyZWdpc3RlcmluZyBkcml2ZXIuXG4iKTsKIAl1c2JfZGVyZWdpc3RlcigmcHdjX2RyaXZlcik7Ci0JSW5mbygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHJlbW92ZWQuXG4iKTsKKwlQV0NfSU5GTygiUGhpbGlwcyB3ZWJjYW0gbW9kdWxlIHJlbW92ZWQuXG4iKTsKIH0KIAogbW9kdWxlX2luaXQodXNiX3B3Y19pbml0KTsKIG1vZHVsZV9leGl0KHVzYl9wd2NfZXhpdCk7CiAKKy8qIHZpbTogc2V0IGNpbm89IGZvcm1hdG9wdGlvbnM9Y3JvcWwgY2luZGVudCBzaGlmdHdpZHRoPTggdGFic3RvcD04OiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwppbmRleCA0Yzk2MDM3Li5mZWMzOWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2Mta2lhcmEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIExpbnV4IGRyaXZlciBmb3IgUGhpbGlwcyB3ZWJjYW0KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0zMTYsMyArMzE2LDU3NiBAQAogICAgfSwKIH07CiAKKworLyoKKyAqIFJvbSB0YWJsZSBmb3Iga2lhcmEgY2hpcHMKKyAqCisgKiAzMiByb21zIHRhYmxlcyAob25lIGZvciBlYWNoIHJlc29sdXRpb24gPykKKyAqICAyIHRhYmxlcyBwZXIgcm9tcyAob25lIGZvciBlYWNoIHBhc3NlcykgKFksIGFuZCBVJlYpCisgKiAxMjggYnl0ZXMgcGVyIHBhc3NlcworICovCisKK2NvbnN0IHVuc2lnbmVkIGludCBLaWFyYVJvbVRhYmxlIFs4XVsyXVsxNl1bOF0gPQoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5MjUyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMjRiNmQsMHgwMDAyZGRiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0KK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKaW5kZXggMTI5MjlhYi4uMGJkYjIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmgKQEAgLTEsNSArMSw1IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCi0gICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtMjcsNyArMjcsNyBAQAogI2lmbmRlZiBQV0NfS0lBUkFfSAogI2RlZmluZSBQV0NfS0lBUkFfSAogCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeQogewpAQCAtMzcsOCArMzcsOCBAQAogCXVuc2lnbmVkIGNoYXIgbW9kZVsxMl07CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KIH07CiAKLWNvbnN0IGV4dGVybiBzdHJ1Y3QgS2lhcmFfdGFibGVfZW50cnkgS2lhcmFfdGFibGVbUFNaX01BWF1bNl1bNF07Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgaW50IEtpYXJhUm9tVGFibGVbOF1bMl1bMTZdWzhdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBLaWFyYV90YWJsZV9lbnRyeSBLaWFyYV90YWJsZVtQU1pfTUFYXVs2XVs0XTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBpbnQgS2lhcmFSb21UYWJsZVs4XVsyXVsxNl1bOF07CiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYwppbmRleCA1OGZlNzk3Li41ODljNjg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMKQEAgLTEsNyArMSw3IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCiAgICBWYXJpb3VzIG1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zIGFuZCB0YWJsZXMuCiAgICAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0yNCwxOCArMjQsMTcgQEAKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiAKLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJwd2MuaCIKIAotc3RydWN0IHB3Y19jb29yZCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX01BWF0gPQorY29uc3Qgc3RydWN0IHB3Y19jb29yZCBwd2NfaW1hZ2Vfc2l6ZXNbUFNaX01BWF0gPQogewotCXsgMTI4LCAgOTYsIDAgfSwKLQl7IDE2MCwgMTIwLCAwIH0sCi0JeyAxNzYsIDE0NCwgMCB9LAotCXsgMzIwLCAyNDAsIDAgfSwKLQl7IDM1MiwgMjg4LCAwIH0sCi0JeyA2NDAsIDQ4MCwgMCB9LAorCXsgMTI4LCAgOTYsIDAgfSwgLyogc3FjaWYgKi8KKwl7IDE2MCwgMTIwLCAwIH0sIC8qIHFzaWYgKi8KKwl7IDE3NiwgMTQ0LCAwIH0sIC8qIHFjaWYgKi8KKwl7IDMyMCwgMjQwLCAwIH0sIC8qIHNpZiAqLworCXsgMzUyLCAyODgsIDAgfSwgLyogY2lmICovCisJeyA2NDAsIDQ4MCwgMCB9LCAvKiB2Z2EgKi8KIH07CiAKIC8qIHgseSAtPiBQU1pfICovCkBAIC01Miw3ICs1MSw3IEBACiAJewogCQlpZiAod2lkdGggPiBwZGV2LT5hYnNfbWF4LnggfHwgaGVpZ2h0ID4gcGRldi0+YWJzX21heC55KQogCQl7Ci0JCQlEZWJ1ZygiVklERU9fUEFMRVRURV9SQVc6IGdvaW5nIGJleW9uZCBhYnNfbWF4LlxuIik7CisJCQlQV0NfREVCVUdfU0laRSgiVklERU9fUEFMRVRURV9SQVc6IGdvaW5nIGJleW9uZCBhYnNfbWF4LlxuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC02MCw3ICs1OSw3IEBACiAJewogCQlpZiAod2lkdGggPiBwZGV2LT52aWV3X21heC54IHx8IGhlaWdodCA+IHBkZXYtPnZpZXdfbWF4LnkpCiAJCXsKLQkJCURlYnVnKCJWSURFT19QQUxFVFRFXyBub3QgUkFXOiBnb2luZyBiZXlvbmQgdmlld19tYXguXG4iKTsKKwkJCVBXQ19ERUJVR19TSVpFKCJWSURFT19QQUxFVFRFX25vdCBSQVc6IGdvaW5nIGJleW9uZCB2aWV3X21heC5cbiIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtODEsOSArODAsOCBAQAogLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgZGVwZW5kaW5nIG9uIHR5cGUgYW5kIGRlY29tcHJlc3NvciovCiB2b2lkIHB3Y19jb25zdHJ1Y3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3dpdGNoKHBkZXYtPnR5cGUpIHsKLQljYXNlIDY0NToKLQljYXNlIDY0NjoKKwlpZiAoREVWSUNFX1VTRV9DT0RFQzEocGRldi0+dHlwZSkpIHsKKwogCQlwZGV2LT52aWV3X21pbi54ID0gMTI4OwogCQlwZGV2LT52aWV3X21pbi55ID0gIDk2OwogCQlwZGV2LT52aWV3X21heC54ID0gMzUyOwpAQCAtOTUsMTAgKzkzLDIzIEBACiAJCXBkZXYtPnZlbmRwb2ludCA9IDQ7CiAJCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gMDsKIAkJcGRldi0+ZnJhbWVfdHJhaWxlcl9zaXplID0gMDsKLQkJYnJlYWs7Ci0JY2FzZSA2NzU6Ci0JY2FzZSA2ODA6Ci0JY2FzZSA2OTA6CisKKwl9IGVsc2UgaWYgKERFVklDRV9VU0VfQ09ERUMzKHBkZXYtPnR5cGUpKSB7CisKKwkJcGRldi0+dmlld19taW4ueCA9IDE2MDsKKwkJcGRldi0+dmlld19taW4ueSA9IDEyMDsKKwkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKKwkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKKwkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9WR0E7CisJCXBkZXYtPmFic19tYXgueCA9IDY0MDsKKwkJcGRldi0+YWJzX21heC55ID0gNDgwOworCQlwZGV2LT52Y2ludGVyZmFjZSA9IDM7CisJCXBkZXYtPnZlbmRwb2ludCA9IDU7CisJCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gVE9VQ0FNX0hFQURFUl9TSVpFOworCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSBUT1VDQU1fVFJBSUxFUl9TSVpFOworCisJfSBlbHNlIC8qIGlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgKi8geworCiAJCXBkZXYtPnZpZXdfbWluLnggPSAxMjg7CiAJCXBkZXYtPnZpZXdfbWluLnkgPSAgOTY7CiAJCS8qIEFudGhpbGwgYnVnICMzODogUFdDIGFsd2F5cyByZXBvcnRzIG1heCBzaXplLCBldmVuIHdpdGhvdXQgUFdDWCAqLwpAQCAtMTExLDMwICsxMjIsMTIgQEAKIAkJcGRldi0+dmVuZHBvaW50ID0gNDsKIAkJcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgPSAwOwogCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSAwOwotCQlicmVhazsKLQljYXNlIDcyMDoKLQljYXNlIDczMDoKLQljYXNlIDc0MDoKLQljYXNlIDc1MDoKLQkJcGRldi0+dmlld19taW4ueCA9IDE2MDsKLQkJcGRldi0+dmlld19taW4ueSA9IDEyMDsKLQkJcGRldi0+dmlld19tYXgueCA9IDY0MDsKLQkJcGRldi0+dmlld19tYXgueSA9IDQ4MDsKLQkJcGRldi0+aW1hZ2VfbWFzayA9IDEgPDwgUFNaX1FTSUYgfCAxIDw8IFBTWl9TSUYgfCAxIDw8IFBTWl9WR0E7Ci0JCXBkZXYtPmFic19tYXgueCA9IDY0MDsKLQkJcGRldi0+YWJzX21heC55ID0gNDgwOwotCQlwZGV2LT52Y2ludGVyZmFjZSA9IDM7Ci0JCXBkZXYtPnZlbmRwb2ludCA9IDU7Ci0JCXBkZXYtPmZyYW1lX2hlYWRlcl9zaXplID0gVE9VQ0FNX0hFQURFUl9TSVpFOwotCQlwZGV2LT5mcmFtZV90cmFpbGVyX3NpemUgPSBUT1VDQU1fVFJBSUxFUl9TSVpFOwotCQlicmVhazsKIAl9Ci0JRGVidWcoInR5cGUgPSAlZFxuIixwZGV2LT50eXBlKTsKIAlwZGV2LT52cGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIwUDsgLyogZGVmYXVsdCAqLwogCXBkZXYtPnZpZXdfbWluLnNpemUgPSBwZGV2LT52aWV3X21pbi54ICogcGRldi0+dmlld19taW4ueTsKIAlwZGV2LT52aWV3X21heC5zaXplID0gcGRldi0+dmlld19tYXgueCAqIHBkZXYtPnZpZXdfbWF4Lnk7CiAJLyogbGVuZ3RoIG9mIGltYWdlLCBpbiBZVVYgZm9ybWF0OyBhbHdheXMgYWxsb2NhdGUgZW5vdWdoIG1lbW9yeS4gKi8KLQlwZGV2LT5sZW5fcGVyX2ltYWdlID0gKHBkZXYtPmFic19tYXgueCAqIHBkZXYtPmFic19tYXgueSAqIDMpIC8gMjsKKwlwZGV2LT5sZW5fcGVyX2ltYWdlID0gUEFHRV9BTElHTigocGRldi0+YWJzX21heC54ICogcGRldi0+YWJzX21heC55ICogMykgLyAyKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdGltb24uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCmluZGV4IDE3NTI1MGQuLmJlNjViZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5jCkBAIC0xLDUgKzEsNSBAQAogLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQotICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTMxNCwzICszMTQsMTEzMyBAQAogICAgfSwKIH07CiAKKy8qCisgKiAxNiB2ZXJzaW9uczoKKyAqICAgMiB0YWJsZXMgIChvbmUgZm9yIFksIGFuZCBvbmUgZm9yIFUmVikKKyAqICAgMTYgbGV2ZWxzIG9mIGRldGFpbHMgcGVyIHRhYmxlcworICogICA4IGJsb2NzCisgKi8KKworY29uc3QgdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF0gPQoreworIHsgLyogdmVyc2lvbiAwICovCisgIHsgLyogdmVyc2lvbiAwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwKKyAgICAweDAwMDAwMDAxLDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDAsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMSwweDAwMDAwMDAxLAorICAgIDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDAwOSwweDAwMDAwMDQ5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMSAqLworICB7IC8qIHZlcnNpb24gMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxLDB4MDAwMDAwMDEsCisgICAgMHgwMDAwMDAwMSwweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDA5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDksMHgwMDAwMDAwOSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMjQ5LDB4MDAwMDAwMDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMDQ5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDAwNDksMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDIgKi8KKyAgeyAvKiB2ZXJzaW9uIDIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwOSwweDAwMDAwMDA5LAorICAgIDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMiwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwMDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDEsMHgwMDAwMDAwMH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDI0YSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAzICovCisgIHsgLyogdmVyc2lvbiAzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDMsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDAxLDB4MDAwMDAwMDB9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDAwMX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAwMDAxfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwMDAwOX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjUyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNCAqLworICB7IC8qIHZlcnNpb24gNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDA0OSwweDAwMDAwMDQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDk0OTMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA0LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDBhNDliLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDUgKi8KKyAgeyAvKiB2ZXJzaW9uIDUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gNSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAxMjRkYiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDEyNGRiLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA2ICovCisgIHsgLyogdmVyc2lvbiA2LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwOTQ5MiwweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDI1YmI2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDYsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMDI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI2ZGMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNmRjLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gNyAqLworICB7IC8qIHZlcnNpb24gNywgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFjOTZlLDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAyNDk2ZX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiA3LCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDggKi8KKyAgeyAvKiB2ZXJzaW9uIDgsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEzNmU0LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMjRiNzYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI5MjUsMHgwMDAyNGI3NiwweDAwMDI1YmJmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gOCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyOTIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiOTI1LDB4MDAwMWI3MjUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMjQ5NmQsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiA5ICovCisgIHsgLyogdmVyc2lvbiA5LCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDQ5LDB4MDAwMDAwNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMjQ5LDB4MDAwMDAyNDksMHgwMDAwMDI0YSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwOTQ5MywKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDksIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwKKyAgICAweDAwMDAwMDA5LDB4MDAwMDAwMDksMHgwMDAwMDAwOSwweDAwMDAwMDA5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAwNDksMHgwMDAwMDA0OSwweDAwMDAwMDA5LDB4MDAwMDAwMDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAwMjQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwMTI0YSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTI1MiwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyNTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjUyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTAgKi8KKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDI0OSwweDAwMDAwMjQ5LDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDkyNTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDkyNGEsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI5MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI5MjUsMHgwMDAxYjkyZCwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAyNDk2ZCwweDAwMDFjOTZlLDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEwLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMjQ5LDB4MDAwMDAyNDksCisgICAgMHgwMDAwMDA0OSwweDAwMDAwMDQ5LDB4MDAwMDAwNDksMHgwMDAwMDA0OX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDAyNDksMHgwMDAwMDA0OSwweDAwMDAwMDQ5fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwOTI1MiwweDAwMDAwMjRhLDB4MDAwMDAwNDl9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5NDkzLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI1MiwKKyAgICAweDAwMDA5NDkyLDB4MDAwMDk0OTMsMHgwMDAwMTI1MiwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTQ5MywweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwOTQ5MiwweDAwMDA5NDkzLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMDk0OTMsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI1MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDExICovCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5NDkyLDB4MDAwMGE0OWIsMHgwMDAwYTQ5YiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5NDkzLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDEyNGRiLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjQ5NmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxMSwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAwMjQ5LAorICAgIDB4MDAwMDAyNDksMHgwMDAwMDI0OSwweDAwMDAwMjRhLDB4MDAwMDAyNGF9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDAyNGEsMHgwMDAwMDI0YX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyNTIsMHgwMDAwMDI0YSwweDAwMDAwMjRhfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjRkYiwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjRkYiwweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxMiAqLworICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDA5MjUyLDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI2ZGMsMHgwMDAxMjZkYywweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAxYjcyNSwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiOTJkLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFiOTJkLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiOTI1LDB4MDAwMWM5NmUsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTIsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwMTI0OSwKKyAgICAweDAwMDAxMjRhLDB4MDAwMDEyNGEsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjkyLAorICAgIDB4MDAwMDk0OTIsMHgwMDAwOTI1MiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDBhNDliLDB4MDAwMDk0OTMsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNGRiLDB4MDAwMTI0ZGIsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0ZGIsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfSwKKyB7IC8qIHZlcnNpb24gMTMgKi8KKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMCAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwOTI1MiwweDAwMDA5MjkyLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMTI0ZGIsMHgwMDAxMjZkYywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEyNmRjLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMTM2ZTQsMHgwMDAxYjcyNSwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI5MiwweDAwMDBhNDliLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDFiNzI1LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYzk2ZSwweDAwMDEzNmU0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMzZlNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMjQ5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfSwKKyAgeyAvKiB2ZXJzaW9uIDEzLCBwYXNzZXMgMSAqLworICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMDEyNDksCisgICAgMHgwMDAwMTI0YSwweDAwMDAxMjRhLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTQ5MywKKyAgICAweDAwMDA5NDkyLDB4MDAwMDkyOTIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAwYTQ5YiwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDBhNDliLDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAwYTQ5YiwweDAwMDA5NDkzLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDBhNDliLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEyNmRjLDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyOTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMjZkYywweDAwMDEyNGRiLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjZkYywweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDFiNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisgICAgMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMH0KKyAgfQorIH0sCisgeyAvKiB2ZXJzaW9uIDE0ICovCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDAgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDA5MjRhLAorICAgIDB4MDAwMDkyOTIsMHgwMDAwOTQ5MywweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAxMjQ5LDB4MDAwMGE0OWIsCisgICAgMHgwMDAwYTQ5MywweDAwMDEyNGRiLDB4MDAwMTI2ZGMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDEyNDliLDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTI2ZGMsMHgwMDAxMzZlNCwweDAwMDFiNzI1LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI5MmQsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFiOTI1fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDI0Yjc2LDB4MDAwMWM5MmR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDI0OTZlfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjRiNzd9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDI0YjZkLDB4MDAwMmRkYjYsMHgwMDAyNWJiZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDI0OTI0LDB4MDAwMmRiNmQsMHgwMDAzNmRiNiwweDAwMDJlZmZmfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0sCisgIHsgLyogdmVyc2lvbiAxNCwgcGFzc2VzIDEgKi8KKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMTI0OSwweDAwMDAxMjQ5LAorICAgIDB4MDAwMDEyNGEsMHgwMDAwMTI0YSwweDAwMDAxMjUyLDB4MDAwMDEyNTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMDk0OTMsCisgICAgMHgwMDAwYTQ5MywweDAwMDA5MjkyLDB4MDAwMDEyNTIsMHgwMDAwMTI1Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwYTQ5YiwKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAwMTI1MiwweDAwMDAxMjUyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMzZlNCwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjQ5YiwweDAwMDEzNmU0LDB4MDAwMDkyOTIsMHgwMDAwOTI5Mn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMTM2ZTQsMHgwMDAwOTQ5MywweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDA5NDkzLDB4MDAwMDk0OTN9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMGE0OWIsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAwYTQ5YiwweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI0ZGIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMTM2ZTQsMHgwMDAxMjRkYiwweDAwMDBhNDlifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDEzNmU0LDB4MDAwMTI2ZGMsMHgwMDAxMjRkYn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMTI0OTIsMHgwMDAxYjZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMzZlNCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorICAgIDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDB9CisgIH0KKyB9LAorIHsgLyogdmVyc2lvbiAxNSAqLworICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAwICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDEyNDksMHgwMDAwOTQ5MywKKyAgICAweDAwMDBhNDkzLDB4MDAwMGE0OWIsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMTI0OWIsMHgwMDAxMjZkYywweDAwMDEzNmU0LDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMGE0OWIsCisgICAgMHgwMDAxMjZkYywweDAwMDFiNzI0LDB4MDAwMWI3MjUsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEzNmU0LDB4MDAwMWI3MjQsMHgwMDAxYjkyZCwweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjkyNSwweDAwMDFjOTZlLDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5NDkyLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFjOTJkLDB4MDAwMWM5NmUsMHgwMDAxYjcyNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMjRkYiwKKyAgICAweDAwMDFiNzI0LDB4MDAwMWM5MmQsMHgwMDAxYzk2ZSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEyNmRiLAorICAgIDB4MDAwMWI3MjQsMHgwMDAxYzkyZCwweDAwMDFjOTZlLDB4MDAwMWI5MjV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTI2ZGIsCisgICAgMHgwMDAxYjkyNCwweDAwMDFjOTJkLDB4MDAwMjRiNzYsMHgwMDAxYzkyZH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFiOTI0LDB4MDAwMWM5MmQsMHgwMDAyNGI3NiwweDAwMDFjOTJkfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWI5MjQsMHgwMDAyNDk2ZCwweDAwMDI0Yjc2LDB4MDAwMjQ5NmV9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDI0OTZkLDB4MDAwMjViYjYsMHgwMDAyNGI3N30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMjRiNmQsMHgwMDAyNWJiNiwweDAwMDI0Yjc3fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAyNGI2ZCwweDAwMDJkZGI2LDB4MDAwMjViYmZ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDJkYjZkLDB4MDAwMzZkYjYsMHgwMDAyZWZmZn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9LAorICB7IC8qIHZlcnNpb24gMTUsIHBhc3NlcyAxICovCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAwOTI0YSwKKyAgICAweDAwMDA5MjkyLDB4MDAwMDkyOTIsMHgwMDAwOTI5MiwweDAwMDA5MjkyfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDBhNDliLAorICAgIDB4MDAwMGE0OTMsMHgwMDAxMjRkYiwweDAwMDA5MjkyLDB4MDAwMDkyOTJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjRhLDB4MDAwMTI0ZGIsCisgICAgMHgwMDAxMjRkYiwweDAwMDFiNzI0LDB4MDAwMDk0OTMsMHgwMDAwOTQ5M30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDkyNGEsMHgwMDAxMjRkYiwKKyAgICAweDAwMDEyNmRjLDB4MDAwMWI3MjQsMHgwMDAwOTQ5MywweDAwMDA5NDkzfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTI0YSwweDAwMDEyNGRiLAorICAgIDB4MDAwMTM2ZTQsMHgwMDAxYjcyNCwweDAwMDBhNDliLDB4MDAwMGE0OWJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA5MjkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYjcyNCwweDAwMDFiNzI0LDB4MDAwMGE0OWIsMHgwMDAwYTQ5Yn0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDk0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI3MjQsMHgwMDAxMjRkYiwweDAwMDEyNGRifSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwOTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjcyNCwweDAwMDEyNGRiLDB4MDAwMTI0ZGJ9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiNzI0LDB4MDAwMTI2ZGMsMHgwMDAxMjZkY30sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxMjZkYywweDAwMDEyNmRjfSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwYTQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDEzNmU0LDB4MDAwMTM2ZTR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNDkyLDB4MDAwMTM2ZGIsCisgICAgMHgwMDAxYzkyNCwweDAwMDFiOTI1LDB4MDAwMTM2ZTQsMHgwMDAxMzZlNH0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMGE0OTIsMHgwMDAxMzZkYiwKKyAgICAweDAwMDFjOTI0LDB4MDAwMWI5MjUsMHgwMDAxYjcyNSwweDAwMDFiNzI0fSwKKyAgIHsweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMjQ5MiwweDAwMDEzNmRiLAorICAgIDB4MDAwMWM5MjQsMHgwMDAxYjkyNSwweDAwMDFiNzI1LDB4MDAwMWI3MjR9LAorICAgezB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDEyNDkyLDB4MDAwMWI2ZGIsCisgICAgMHgwMDAyNDkyNCwweDAwMDI0OTZkLDB4MDAwMWI5MmQsMHgwMDAxYjkyNX0sCisgICB7MHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKyAgICAweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfQorICB9CisgfQorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy10aW1vbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKaW5kZXggYTg2YjM3OC4uZWVmOWUyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXRpbW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKiBMaW51eCBkcml2ZXIgZm9yIFBoaWxpcHMgd2ViY2FtCi0gICAoQykgMjAwNCAgICAgIEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDA0LTIwMDYgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtNDIsNyArNDIsNyBAQAogI2lmbmRlZiBQV0NfVElNT05fSAogI2RlZmluZSBQV0NfVElNT05fSAogCi0jaW5jbHVkZSAicHdjLWlvY3RsLmgiCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIHN0cnVjdCBUaW1vbl90YWJsZV9lbnRyeQogewpAQCAtNTIsOCArNTIsOCBAQAogCXVuc2lnbmVkIGNoYXIgbW9kZVsxM107CQkvKiBwcmVjb21wdXRlZCBtb2RlIHNldHRpbmdzIGZvciBjYW0gKi8KIH07CiAKLWNvbnN0IGV4dGVybiBzdHJ1Y3QgVGltb25fdGFibGVfZW50cnkgVGltb25fdGFibGVbUFNaX01BWF1bNl1bNF07Ci1jb25zdCBleHRlcm4gdW5zaWduZWQgaW50IFRpbW9uUm9tVGFibGUgWzE2XVsyXVsxNl1bOF07CitleHRlcm4gY29uc3Qgc3RydWN0IFRpbW9uX3RhYmxlX2VudHJ5IFRpbW9uX3RhYmxlW1BTWl9NQVhdWzZdWzRdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGludCBUaW1vblJvbVRhYmxlIFsxNl1bMl1bMTZdWzhdOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMKaW5kZXggYjM3YTg5YS4uNWQ4MjAyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jCkBAIC0xLDcgKzEsNyBAQAogLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQogICAgRGVjb21wcmVzc2lvbiBmcm9udGVuZC4KICAgIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgotICAgKEMpIDIwMDQgICAgICBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKIAogICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CiAgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KQEAgLTIyLDYgKzIyLDggQEAKICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgICB2aW06IHNldCB0cz04OgogKi8KIAogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CkBAIC0yOSw2ICszMSw4IEBACiAKICNpbmNsdWRlICJwd2MuaCIKICNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgorI2luY2x1ZGUgInB3Yy1kZWMxLmgiCisjaW5jbHVkZSAicHdjLWRlYzIzLmgiCiAKIGludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKQEAgLTQwLDEwNyArNDQsOTUgQEAKIAogCWlmIChwZGV2ID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwotI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChQV0NfTUFHSUMpCi0JaWYgKHBkZXYtPm1hZ2ljICE9IFBXQ19NQUdJQykgewotCQlFcnIoInB3Y19kZWNvbXByZXNzKCk6IG1hZ2ljIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci0jZW5kaWYKIAogCWZidWYgPSBwZGV2LT5yZWFkX2ZyYW1lOwogCWlmIChmYnVmID09IE5VTEwpCiAJCXJldHVybiAtRUZBVUxUOwotCWltYWdlID0gcGRldi0+aW1hZ2VfcHRyW3BkZXYtPmZpbGxfaW1hZ2VdOwotCWlmICghaW1hZ2UpCi0JCXJldHVybiAtRUZBVUxUOworCWltYWdlICA9IHBkZXYtPmltYWdlX2RhdGE7CisJaW1hZ2UgKz0gcGRldi0+aW1hZ2VzW3BkZXYtPmZpbGxfaW1hZ2VdLm9mZnNldDsKIAogCXl1diA9IGZidWYtPmRhdGEgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZTsgIC8qIFNraXAgaGVhZGVyICovCiAKIAkvKiBSYXcgZm9ybWF0OyB0aGF0J3MgZWFzeS4uLiAqLwogCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKIAl7Ci0JCW1lbWNweShpbWFnZSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKKwkJc3RydWN0IHB3Y19yYXdfZnJhbWUgKnJhd19mcmFtZSA9IGltYWdlOworCQlyYXdfZnJhbWUtPnR5cGUgPSBjcHVfdG9fbGUxNihwZGV2LT50eXBlKTsKKwkJcmF3X2ZyYW1lLT52YmFuZGxlbmd0aCA9IGNwdV90b19sZTE2KHBkZXYtPnZiYW5kbGVuZ3RoKTsKKwkJCS8qIGNtZF9idWYgaXMgYWx3YXlzIDQgYnl0ZXMsIGJ1dCBzb21ldGltZXMsIG9ubHkgdGhlCisJCQkgKiBmaXJzdCAzIGJ5dGVzIGlzIGZpbGxlZCAoTmFsYSBjYXNlKS4gV2UgY2FuCisJCQkgKiBkZXRlcm1pbmUgdGhpcyB1c2luZyB0aGUgdHlwZSBvZiB0aGUgd2ViY2FtICovCisJCW1lbWNweShyYXdfZnJhbWUtPmNtZCwgcGRldi0+Y21kX2J1ZiwgNCk7CisJCW1lbWNweShyYXdfZnJhbWUrMSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJaWYgKHBkZXYtPnZiYW5kbGVuZ3RoID09IDApIHsKLQkJLyogVW5jb21wcmVzc2VkIG1vZGUuIFdlIGNvcHkgdGhlIGRhdGEgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwKLQkJICAgdXNpbmcgdGhlIHZpZXdwb3J0IHNpemUgKHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiB0aGUgaW1hZ2UKLQkJICAgc2l6ZSkuIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byBkbyBhIGJpdCBvZiBieXRlIHN0dWZmaW5nCi0JCSAgIHRvIGdldCB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0L3NpemUuCisJCS8qIFVuY29tcHJlc3NlZCBtb2RlLgorCQkgKiBXZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIsIHVzaW5nIHRoZSB2aWV3cG9ydAorCQkgKiBzaXplICh3aGljaCBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIGltYWdlIHNpemUpLgorCQkgKiBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gZG8gYSBiaXQgb2YgYnl0ZSBzdHVmZmluZyB0byBnZXQKKwkJICogdGhlIGRlc2lyZWQgb3V0cHV0IGZvcm1hdC9zaXplLgorCQkgKgorCQkgKiBXZSBkbyBzb21lIGJ5dGUgc2h1ZmZsaW5nIGhlcmUgdG8gZ28gZnJvbSB0aGUKKwkJICogbmF0aXZlIGZvcm1hdCB0byBZVVY0MjBQLgogCQkgKi8KLQkJCS8qCi0JCQkgKiBXZSBkbyBzb21lIGJ5dGUgc2h1ZmZsaW5nIGhlcmUgdG8gZ28gZnJvbSB0aGUKLQkJCSAqIG5hdGl2ZSBmb3JtYXQgdG8gWVVWNDIwUC4KLQkJCSAqLwotCQkJc3JjID0gKHUxNiAqKXl1djsKLQkJCW4gPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7CisJCXNyYyA9ICh1MTYgKil5dXY7CisJCW4gPSBwZGV2LT52aWV3LnggKiBwZGV2LT52aWV3Lnk7CiAKLQkJCS8qIG9mZnNldCBpbiBZIHBsYW5lICovCi0JCQlzdHJpZGUgPSBwZGV2LT52aWV3LnggKiBwZGV2LT5vZmZzZXQueSArIHBkZXYtPm9mZnNldC54OwotCQkJZHN0eSA9ICh1MTYgKikoaW1hZ2UgKyBzdHJpZGUpOworCQkvKiBvZmZzZXQgaW4gWSBwbGFuZSAqLworCQlzdHJpZGUgPSBwZGV2LT52aWV3LnggKiBwZGV2LT5vZmZzZXQueSArIHBkZXYtPm9mZnNldC54OworCQlkc3R5ID0gKHUxNiAqKShpbWFnZSArIHN0cmlkZSk7CiAKLQkJCS8qIG9mZnNldHMgaW4gVS9WIHBsYW5lcyAqLwotCQkJc3RyaWRlID0gcGRldi0+dmlldy54ICogcGRldi0+b2Zmc2V0LnkgLyA0ICsgcGRldi0+b2Zmc2V0LnggLyAyOwotCQkJZHN0dSA9ICh1MTYgKikoaW1hZ2UgKyBuICsgICAgICAgICBzdHJpZGUpOwotCQkJZHN0diA9ICh1MTYgKikoaW1hZ2UgKyBuICsgbiAvIDQgKyBzdHJpZGUpOworCQkvKiBvZmZzZXRzIGluIFUvViBwbGFuZXMgKi8KKwkJc3RyaWRlID0gcGRldi0+dmlldy54ICogcGRldi0+b2Zmc2V0LnkgLyA0ICsgcGRldi0+b2Zmc2V0LnggLyAyOworCQlkc3R1ID0gKHUxNiAqKShpbWFnZSArIG4gKyAgICAgICAgIHN0cmlkZSk7CisJCWRzdHYgPSAodTE2ICopKGltYWdlICsgbiArIG4gLyA0ICsgc3RyaWRlKTsKIAotCQkJLyogaW5jcmVtZW50IGFmdGVyIGVhY2ggbGluZSAqLwotCQkJc3RyaWRlID0gKHBkZXYtPnZpZXcueCAtIHBkZXYtPmltYWdlLngpIC8gMjsgLyogdTE2IGlzIDIgYnl0ZXMgKi8KKwkJLyogaW5jcmVtZW50IGFmdGVyIGVhY2ggbGluZSAqLworCQlzdHJpZGUgPSAocGRldi0+dmlldy54IC0gcGRldi0+aW1hZ2UueCkgLyAyOyAvKiB1MTYgaXMgMiBieXRlcyAqLwogCi0JCQlmb3IgKGxpbmUgPSAwOyBsaW5lIDwgcGRldi0+aW1hZ2UueTsgbGluZSsrKSB7Ci0JCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGV2LT5pbWFnZS54OyBjb2wgKz0gNCkgewotCQkJCQkqZHN0eSsrID0gKnNyYysrOwotCQkJCQkqZHN0eSsrID0gKnNyYysrOwotCQkJCQlpZiAobGluZSAmIDEpCi0JCQkJCQkqZHN0disrID0gKnNyYysrOwotCQkJCQllbHNlCi0JCQkJCQkqZHN0dSsrID0gKnNyYysrOwotCQkJCX0KLQkJCQlkc3R5ICs9IHN0cmlkZTsKKwkJZm9yIChsaW5lID0gMDsgbGluZSA8IHBkZXYtPmltYWdlLnk7IGxpbmUrKykgeworCQkJZm9yIChjb2wgPSAwOyBjb2wgPCBwZGV2LT5pbWFnZS54OyBjb2wgKz0gNCkgeworCQkJCSpkc3R5KysgPSAqc3JjKys7CisJCQkJKmRzdHkrKyA9ICpzcmMrKzsKIAkJCQlpZiAobGluZSAmIDEpCi0JCQkJCWRzdHYgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCQkJKmRzdHYrKyA9ICpzcmMrKzsKIAkJCQllbHNlCi0JCQkJCWRzdHUgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCQkJKmRzdHUrKyA9ICpzcmMrKzsKIAkJCX0KKwkJCWRzdHkgKz0gc3RyaWRlOworCQkJaWYgKGxpbmUgJiAxKQorCQkJCWRzdHYgKz0gKHN0cmlkZSA+PiAxKTsKKwkJCWVsc2UKKwkJCQlkc3R1ICs9IChzdHJpZGUgPj4gMSk7CisJCX0KKworCQlyZXR1cm4gMDsKIAl9Ci0JZWxzZSB7Ci0JCS8qIENvbXByZXNzZWQ7IHRoZSBkZWNvbXByZXNzb3Igcm91dGluZXMgd2lsbCB3cml0ZSB0aGUgZGF0YQotCQkgICBpbiBwbGFuYXIgZm9ybWF0IGltbWVkaWF0ZWx5LgotCQkgKi8KLQkJaW50IGZsYWdzOwogCi0JCWZsYWdzID0gUFdDWF9GTEFHX1BMQU5BUjsKLQkJaWYgKHBkZXYtPnZzaXplID09IFBTWl9WR0EgJiYgcGRldi0+dmZyYW1lcyA9PSA1ICYmIHBkZXYtPnZzbmFwc2hvdCkKLQkJIHsKLQkJICAgcHJpbnRrKEtFUk5fRVJSICJwd2M6IE1vZGUgQmF5ZXIgaXMgbm90IHN1cHBvcnRlZCBmb3Igbm93XG4iKTsKLQkJICAgZmxhZ3MgfD0gUFdDWF9GTEFHX0JBWUVSOwotCQkgICByZXR1cm4gLUVOWElPOyAvKiBObyBzdWNoIGRldmljZSBvciBhZGRyZXNzOiBtaXNzaW5nIGRlY29tcHJlc3NvciAqLwotCQkgfQorCS8qCisJICogQ29tcHJlc3NlZDsKKwkgKiB0aGUgZGVjb21wcmVzc29yIHJvdXRpbmVzIHdpbGwgd3JpdGUgdGhlIGRhdGEgaW4gcGxhbmFyIGZvcm1hdAorCSAqIGltbWVkaWF0ZWx5LgorCSAqLworCWlmIChwZGV2LT52c2l6ZSA9PSBQU1pfVkdBICYmIHBkZXYtPnZmcmFtZXMgPT0gNSAmJiBwZGV2LT52c25hcHNob3QpIHsKKwkJUFdDX0VSUk9SKCJNb2RlIEJheWVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vd1xuIik7CisJCS8qIGZsYWdzIHw9IFBXQ1hfRkxBR19CQVlFUjsgKi8KKwkJcmV0dXJuIC1FTlhJTzsgLyogTm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzczogbWlzc2luZyBkZWNvbXByZXNzb3IgKi8KKwl9CiAKLSNpZiAwCi0JCXN3aXRjaCAocGRldi0+dHlwZSkKLQkJIHsKLQkJICBjYXNlIDY3NToKLQkJICBjYXNlIDY4MDoKLQkJICBjYXNlIDY5MDoKLQkJICBjYXNlIDcyMDoKLQkJICBjYXNlIDczMDoKLQkJICBjYXNlIDc0MDoKLQkJICBjYXNlIDc1MDoKLQkJICAgIHB3Y19kZWMyM19kZWNvbXByZXNzKCZwZGV2LT5pbWFnZSwgJnBkZXYtPnZpZXcsCi0JCQkJJnBkZXYtPm9mZnNldCwgeXV2LCBpbWFnZSwgZmxhZ3MsCi0JCQkJcGRldi0+ZGVjb21wcmVzc19kYXRhLCBwZGV2LT52YmFuZGxlbmd0aCk7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDY0NToKLQkJICBjYXNlIDY0NjoKLQkJICAgIC8qIFRPRE8gJiBGSVhNRSAqLwotCQkgICAgcmV0dXJuIC1FTlhJTzsgLyogTWlzc2luZyBkZWNvbXByZXNzb3IgKi8KLQkJICAgIGJyZWFrOwotCQkgfQotI2VuZGlmCisJaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKSB7CisKKwkJLyogVE9ETyAmIEZJWE1FICovCisJCVBXQ19FUlJPUigiVGhpcyBjaGlwc2V0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vd1xuIik7CisJCXJldHVybiAtRU5YSU87IC8qIE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3M6IG1pc3NpbmcgZGVjb21wcmVzc29yICovCisKKwl9IGVsc2UgeworCQlwd2NfZGVjMjNfZGVjb21wcmVzcyhwZGV2LCB5dXYsIGltYWdlLCBQV0NYX0ZMQUdfUExBTkFSKTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIAorLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuaAppbmRleCBmNzVlMWI2Li4wNDEyMjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmgKQEAgLTEsNSArMSw1IEBACiAvKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0zMiw3ICszMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KIAotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgorI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgogCiAvKiBmcm9tIHB3Yy1kZWMuaCAqLwogI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSICAgICAgICAweDAwMDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ViM2NlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCkBAIC0wLDAgKzEsMTIwMiBAQAorLyogTGludXggZHJpdmVyIGZvciBQaGlsaXBzIHdlYmNhbQorICAgVVNCIGFuZCBWaWRlbzRMaW51eCBpbnRlcmZhY2UgcGFydC4KKyAgIChDKSAxOTk5LTIwMDQgTmVtb3NvZnQgVW52LgorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisKKyAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAorICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCisgICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCisgICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKKyAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAicHdjLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcHdjX2NvbnRyb2xzW10gPSB7CisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiQnJpZ2h0bmVzcyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxMjgsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSA2NCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJDb250cmFzdCIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSA2NCwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJTYXR1cmF0aW9uIiwKKwkgICAgLm1pbmltdW0gPSAtMTAwLAorCSAgICAubWF4aW11bSA9IDEwMCwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfR0FNTUEsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiR2FtbWEiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMzIsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIlJlZCBHYWluIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDI1NiwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkJsdWUgR2FpbiIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAyNTYsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJBdXRvIFdoaXRlIEJhbGFuY2UiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMSwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJICAgIC5pZCAgICAgID0gVjRMMl9DSURfRVhQT1NVUkUsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkgICAgLm5hbWUgICAgPSAiU2h1dHRlciBTcGVlZCAoRXhwb3N1cmUpIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDI1NiwKKwkgICAgLnN0ZXAgICAgPSAxLAorCSAgICAuZGVmYXVsdF92YWx1ZSA9IDIwMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJBdXRvIEdhaW4gRW5hYmxlZCIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAxLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9HQUlOLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIkdhaW4gTGV2ZWwiLAorCSAgICAubWluaW11bSA9IDAsCisJICAgIC5tYXhpbXVtID0gMjU2LAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlNhdmUgVXNlciBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlJlc3RvcmUgVXNlciBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWSwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJICAgIC5uYW1lICAgID0gIlJlc3RvcmUgRmFjdG9yeSBTZXR0aW5ncyIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAwLAorCSAgICAuc3RlcCAgICA9IDAsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkNvbG91ciBtb2RlIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVIsCisJICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkgICAgLm5hbWUgICAgPSAiQXV0byBjb250b3VyIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUiwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCSAgICAubmFtZSAgICA9ICJDb250b3VyIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDYzLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVCwKKwkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCSAgICAubmFtZSAgICA9ICJCYWNrbGlnaHQgY29tcGVuc2F0aW9uIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJICAgIC5uYW1lICAgID0gIkZsaWNrZXJsZXNzIiwKKwkgICAgLm1pbmltdW0gPSAwLAorCSAgICAubWF4aW11bSA9IDEsCisJICAgIC5zdGVwICAgID0gMSwKKwkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OLAorCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJICAgIC5uYW1lICAgID0gIk5vaXNlIHJlZHVjdGlvbiIsCisJICAgIC5taW5pbXVtID0gMCwKKwkgICAgLm1heGltdW0gPSAzLAorCSAgICAuc3RlcCAgICA9IDEsCisJICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorfTsKKworCitzdGF0aWMgdm9pZCBwd2NfdmlkaW9jX2ZpbGxfZm10KGNvbnN0IHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJbWVtc2V0KCZmLT5mbXQucGl4LCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCkpOworCWYtPmZtdC5waXgud2lkdGggICAgICAgID0gcGRldi0+dmlldy54OworCWYtPmZtdC5waXguaGVpZ2h0ICAgICAgID0gcGRldi0+dmlldy55OworCWYtPmZtdC5waXguZmllbGQgICAgICAgID0gVjRMMl9GSUVMRF9OT05FOworCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1lVVjQyMFApIHsKKwkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCAgPSBWNEwyX1BJWF9GTVRfWVVWNDIwOworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IChmLT5mbXQucGl4LndpZHRoICogMykvMjsKKwkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPSBmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCX0gZWxzZSB7CisJCS8qIHZiYW5kbGVuZ3RoIGNvbnRhaW5zIDQgbGluZXMgLi4uICAqLworCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9IHBkZXYtPnZiYW5kbGVuZ3RoLzQ7CisJCWYtPmZtdC5waXguc2l6ZWltYWdlID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7CisJCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKKwkJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX1BXQzE7CisJCWVsc2UKKwkJCWYtPmZtdC5waXgucGl4ZWxmb3JtYXQgID0gVjRMMl9QSVhfRk1UX1BXQzI7CisJfQorCVBXQ19ERUJVR19JT0NUTCgicHdjX3ZpZGlvY19maWxsX2ZtdCgpICIKKwkJCSJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBieXRlc3BlcmxpbmU9JWQsIHNpemVpbWFnZT0lZCwgcGl4ZWxmb3JtYXQ9JWMlYyVjJWNcbiIsCisJCQlmLT5mbXQucGl4LndpZHRoLAorCQkJZi0+Zm10LnBpeC5oZWlnaHQsCisJCQlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSwKKwkJCWYtPmZtdC5waXguc2l6ZWltYWdlLAorCQkJKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpJjI1NSwKKwkJCShmLT5mbXQucGl4LnBpeGVsZm9ybWF0Pj44KSYyNTUsCisJCQkoZi0+Zm10LnBpeC5waXhlbGZvcm1hdD4+MTYpJjI1NSwKKwkJCShmLT5mbXQucGl4LnBpeGVsZm9ybWF0Pj4yNCkmMjU1KTsKK30KKworLyogaW9jdGwoVklESU9DX1RSWV9GTVQpICovCitzdGF0aWMgaW50IHB3Y192aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgeworCQlQV0NfREVCVUdfSU9DVEwoIkJhZCB2aWRlbyB0eXBlIG11c3QgYmUgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSB7CisJCWNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfUElYX0ZNVF9QV0MxOgorCQkJaWYgKERFVklDRV9VU0VfQ09ERUMyMyhwZGV2LT50eXBlKSkgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiY29kZWMxIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBvbGQgcHdjIHdlYmNhbVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX1BJWF9GTVRfUFdDMjoKKwkJCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiY29kZWMyMyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgbmV3IHB3YyB3ZWJjYW1cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlQV0NfREVCVUdfSU9DVEwoIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCX0KKworCWlmIChmLT5mbXQucGl4LndpZHRoID4gcGRldi0+dmlld19tYXgueCkKKwkJZi0+Zm10LnBpeC53aWR0aCA9IHBkZXYtPnZpZXdfbWF4Lng7CisJZWxzZSBpZiAoZi0+Zm10LnBpeC53aWR0aCA8IHBkZXYtPnZpZXdfbWluLngpCisJCWYtPmZtdC5waXgud2lkdGggPSBwZGV2LT52aWV3X21pbi54OworCisJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gcGRldi0+dmlld19tYXgueSkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBwZGV2LT52aWV3X21heC55OworCWVsc2UgaWYgKGYtPmZtdC5waXguaGVpZ2h0IDwgcGRldi0+dmlld19taW4ueSkKKwkJZi0+Zm10LnBpeC5oZWlnaHQgPSBwZGV2LT52aWV3X21pbi55OworCisJcmV0dXJuIDA7Cit9CisKKy8qIGlvY3RsKFZJRElPQ19TRVRfRk1UKSAqLworc3RhdGljIGludCBwd2NfdmlkaW9jX3NldF9mbXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlpbnQgcmV0LCBmcHMsIHNuYXBzaG90LCBjb21wcmVzc2lvbiwgcGl4ZWxmb3JtYXQ7CisKKwlyZXQgPSBwd2NfdmlkaW9jX3RyeV9mbXQocGRldiwgZik7CisJaWYgKHJldDwwKQorCQlyZXR1cm4gcmV0OworCisJcGl4ZWxmb3JtYXQgPSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0OworCWNvbXByZXNzaW9uID0gcGRldi0+dmNvbXByZXNzaW9uOworCXNuYXBzaG90ID0gMDsKKwlmcHMgPSBwZGV2LT52ZnJhbWVzOworCWlmIChmLT5mbXQucGl4LnByaXYpIHsKKwkJY29tcHJlc3Npb24gPSAoZi0+Zm10LnBpeC5wcml2ICYgUFdDX1FMVF9NQVNLKSA+PiBQV0NfUUxUX1NISUZUOworCQlzbmFwc2hvdCA9ICEhKGYtPmZtdC5waXgucHJpdiAmIFBXQ19GUFNfU05BUFNIT1QpOworCQlmcHMgPSAoZi0+Zm10LnBpeC5wcml2ICYgUFdDX0ZQU19GUk1BU0spID4+IFBXQ19GUFNfU0hJRlQ7CisJCWlmIChmcHMgPT0gMCkKKwkJCWZwcyA9IHBkZXYtPnZmcmFtZXM7CisJfQorCisJaWYgKHBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApCisJCXBkZXYtPnZwYWxldHRlID0gVklERU9fUEFMRVRURV9ZVVY0MjBQOworCWVsc2UKKwkJcGRldi0+dnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JBVzsKKworCVBXQ19ERUJVR19JT0NUTCgiVHJ5IHRvIGNoYW5nZSBmb3JtYXQgdG86IHdpZHRoPSVkIGhlaWdodD0lZCBmcHM9JWQgIgorCQkJImNvbXByZXNzaW9uPSVkIHNuYXBzaG90PSVkIGZvcm1hdD0lYyVjJWMlY1xuIiwKKwkJCWYtPmZtdC5waXgud2lkdGgsIGYtPmZtdC5waXguaGVpZ2h0LCBmcHMsCisJCQljb21wcmVzc2lvbiwgc25hcHNob3QsCisJCQkocGl4ZWxmb3JtYXQpJjI1NSwKKwkJCShwaXhlbGZvcm1hdD4+OCkmMjU1LAorCQkJKHBpeGVsZm9ybWF0Pj4xNikmMjU1LAorCQkJKHBpeGVsZm9ybWF0Pj4yNCkmMjU1KTsKKworCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LAorCQkJCSBmLT5mbXQucGl4LndpZHRoLAorCQkJCSBmLT5mbXQucGl4LmhlaWdodCwKKwkJCQkgZnBzLAorCQkJCSBjb21wcmVzc2lvbiwKKwkJCQkgc25hcHNob3QpOworCisJUFdDX0RFQlVHX0lPQ1RMKCJwd2NfdHJ5X3ZpZGVvX21vZGUoKSwgcmV0dXJuPSVkXG4iLCByZXQpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXB3Y192aWRpb2NfZmlsbF9mbXQocGRldiwgZik7CisKKwlyZXR1cm4gMDsKKworfQorCitpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJaWYgKHZkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcGRldiA9IHZkZXYtPnByaXY7CisJaWYgKHBkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyNpZiBDT05GSUdfUFdDX0RFQlVHCisJaWYgKFBXQ19ERUJVR19MRVZFTF9JT0NUTCAmIHB3Y190cmFjZSkKKwkJdjRsX3ByaW50a19pb2N0bChjbWQpOworI2VuZGlmCisKKworCXN3aXRjaCAoY21kKSB7CisJCS8qIFF1ZXJ5IGNhYmFwaWxpdGllcyAqLworCQljYXNlIFZJRElPQ0dDQVA6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19jYXBhYmlsaXR5ICpjYXBzID0gYXJnOworCisJCQlzdHJjcHkoY2Fwcy0+bmFtZSwgdmRldi0+bmFtZSk7CisJCQljYXBzLT50eXBlID0gVklEX1RZUEVfQ0FQVFVSRTsKKwkJCWNhcHMtPmNoYW5uZWxzID0gMTsKKwkJCWNhcHMtPmF1ZGlvcyA9IDE7CisJCQljYXBzLT5taW53aWR0aCAgPSBwZGV2LT52aWV3X21pbi54OworCQkJY2Fwcy0+bWluaGVpZ2h0ID0gcGRldi0+dmlld19taW4ueTsKKwkJCWNhcHMtPm1heHdpZHRoICA9IHBkZXYtPnZpZXdfbWF4Lng7CisJCQljYXBzLT5tYXhoZWlnaHQgPSBwZGV2LT52aWV3X21heC55OworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDaGFubmVsIGZ1bmN0aW9ucyAoc2ltdWxhdGUgMSBjaGFubmVsKSAqLworCQljYXNlIFZJRElPQ0dDSEFOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fY2hhbm5lbCAqdiA9IGFyZzsKKworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXYtPmZsYWdzID0gMDsKKwkJCXYtPnR1bmVycyA9IDA7CisJCQl2LT50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJCQlzdHJjcHkodi0+bmFtZSwgIldlYmNhbSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ1NDSEFOOgorCQl7CisJCQkvKiBUaGUgc3BlYyBzYXlzIHRoZSBhcmd1bWVudCBpcyBhbiBpbnRlZ2VyLCBidXQKKwkJCSAgIHRoZSBidHR2IGRyaXZlciB1c2VzIGEgdmlkZW9fY2hhbm5lbCBhcmcsIHdoaWNoCisJCQkgICBtYWtlcyBzZW5zZSBiZWNhc3VlIGl0IGFsc28gaGFzIHRoZSBub3JtIGZsYWcuCisJCQkgKi8KKwkJCXN0cnVjdCB2aWRlb19jaGFubmVsICp2ID0gYXJnOworCQkJaWYgKHYtPmNoYW5uZWwgIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9CisKKworCQkvKiBQaWN0dXJlIGZ1bmN0aW9uczsgY29udHJhc3QgZXRjLiAqLworCQljYXNlIFZJRElPQ0dQSUNUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fcGljdHVyZSAqcCA9IGFyZzsKKwkJCWludCB2YWw7CisKKwkJCXZhbCA9IHB3Y19nZXRfYnJpZ2h0bmVzcyhwZGV2KTsKKwkJCWlmICh2YWwgPj0gMCkKKwkJCQlwLT5icmlnaHRuZXNzID0gKHZhbDw8OSk7CisJCQllbHNlCisJCQkJcC0+YnJpZ2h0bmVzcyA9IDB4ZmZmZjsKKwkJCXZhbCA9IHB3Y19nZXRfY29udHJhc3QocGRldik7CisJCQlpZiAodmFsID49IDApCisJCQkJcC0+Y29udHJhc3QgPSAodmFsPDwxMCk7CisJCQllbHNlCisJCQkJcC0+Y29udHJhc3QgPSAweGZmZmY7CisJCQkvKiBHYW1tYSwgV2hpdGVuZXNzLCB3aGF0J3MgdGhlIGRpZmZlcmVuY2U/IDopICovCisJCQl2YWwgPSBwd2NfZ2V0X2dhbW1hKHBkZXYpOworCQkJaWYgKHZhbCA+PSAwKQorCQkJCXAtPndoaXRlbmVzcyA9ICh2YWw8PDExKTsKKwkJCWVsc2UKKwkJCQlwLT53aGl0ZW5lc3MgPSAweGZmZmY7CisJCQlpZiAocHdjX2dldF9zYXR1cmF0aW9uKHBkZXYsICZ2YWwpPDApCisJCQkJcC0+Y29sb3VyID0gMHhmZmZmOworCQkJZWxzZQorCQkJCXAtPmNvbG91ciA9IDMyNzY4ICsgdmFsICogMzI3OworCQkJcC0+ZGVwdGggPSAyNDsKKwkJCXAtPnBhbGV0dGUgPSBwZGV2LT52cGFsZXR0ZTsKKwkJCXAtPmh1ZSA9IDB4RkZGRjsgLyogTi9BICovCisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVklESU9DU1BJQ1Q6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19waWN0dXJlICpwID0gYXJnOworCQkJLyoKKwkJCSAqCUZJWE1FOglTdXBwb3NlIHdlIGFyZSBtaWQgcmVhZAorCQkJCUFOU1dFUjogTm8gcHJvYmxlbTogdGhlIGZpcm13YXJlIG9mIHRoZSBjYW1lcmEKKwkJCQkJY2FuIGhhbmRsZSBicmlnaHRuZXNzL2NvbnRyYXN0L2V0YworCQkJCQljaGFuZ2VzIGF0IF9hbnlfIHRpbWUsIGFuZCB0aGUgcGFsZXR0ZQorCQkJCQlpcyB1c2VkIGV4YWN0bHkgb25jZSBpbiB0aGUgdW5jb21wcmVzcworCQkJCQlyb3V0aW5lLgorCQkJICovCisJCQlwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgcC0+YnJpZ2h0bmVzcyk7CisJCQlwd2Nfc2V0X2NvbnRyYXN0KHBkZXYsIHAtPmNvbnRyYXN0KTsKKwkJCXB3Y19zZXRfZ2FtbWEocGRldiwgcC0+d2hpdGVuZXNzKTsKKwkJCXB3Y19zZXRfc2F0dXJhdGlvbihwZGV2LCAocC0+Y29sb3VyLTMyNzY4KS8zMjcpOworCQkJaWYgKHAtPnBhbGV0dGUgJiYgcC0+cGFsZXR0ZSAhPSBwZGV2LT52cGFsZXR0ZSkgeworCQkJCXN3aXRjaCAocC0+cGFsZXR0ZSkgeworCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfWVVWNDIwUDoKKwkJCQkJY2FzZSBWSURFT19QQUxFVFRFX1JBVzoKKwkJCQkJCXBkZXYtPnZwYWxldHRlID0gcC0+cGFsZXR0ZTsKKwkJCQkJCXJldHVybiBwd2NfdHJ5X3ZpZGVvX21vZGUocGRldiwgcGRldi0+aW1hZ2UueCwgcGRldi0+aW1hZ2UueSwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogV2luZG93L3NpemUgcGFyYW1ldGVycyAqLworCQljYXNlIFZJRElPQ0dXSU46CisJCXsKKwkJCXN0cnVjdCB2aWRlb193aW5kb3cgKnZ3ID0gYXJnOworCisJCQl2dy0+eCA9IDA7CisJCQl2dy0+eSA9IDA7CisJCQl2dy0+d2lkdGggPSBwZGV2LT52aWV3Lng7CisJCQl2dy0+aGVpZ2h0ID0gcGRldi0+dmlldy55OworCQkJdnctPmNocm9tYWtleSA9IDA7CisJCQl2dy0+ZmxhZ3MgPSAocGRldi0+dmZyYW1lcyA8PCBQV0NfRlBTX1NISUZUKSB8CisJCQkJICAgKHBkZXYtPnZzbmFwc2hvdCA/IFBXQ19GUFNfU05BUFNIT1QgOiAwKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NTV0lOOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dyA9IGFyZzsKKwkJCWludCBmcHMsIHNuYXBzaG90LCByZXQ7CisKKwkJCWZwcyA9ICh2dy0+ZmxhZ3MgJiBQV0NfRlBTX0ZSTUFTSykgPj4gUFdDX0ZQU19TSElGVDsKKwkJCXNuYXBzaG90ID0gdnctPmZsYWdzICYgUFdDX0ZQU19TTkFQU0hPVDsKKwkJCWlmIChmcHMgPT0gMCkKKwkJCQlmcHMgPSBwZGV2LT52ZnJhbWVzOworCQkJaWYgKHBkZXYtPnZpZXcueCA9PSB2dy0+d2lkdGggJiYgcGRldi0+dmlldy55ICYmIGZwcyA9PSBwZGV2LT52ZnJhbWVzICYmIHNuYXBzaG90ID09IHBkZXYtPnZzbmFwc2hvdCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldCA9IHB3Y190cnlfdmlkZW9fbW9kZShwZGV2LCB2dy0+d2lkdGgsIHZ3LT5oZWlnaHQsIGZwcywgcGRldi0+dmNvbXByZXNzaW9uLCBzbmFwc2hvdCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGRvbid0IGhhdmUgb3ZlcmxheSBzdXBwb3J0ICh5ZXQpICovCisJCWNhc2UgVklESU9DR0ZCVUY6CisJCXsKKwkJCXN0cnVjdCB2aWRlb19idWZmZXIgKnZiID0gYXJnOworCisJCQltZW1zZXQodmIsMCxzaXplb2YoKnZiKSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIG1tYXAoKSBmdW5jdGlvbnMgKi8KKwkJY2FzZSBWSURJT0NHTUJVRjoKKwkJeworCQkJLyogVGVsbCB0aGUgdXNlciBwcm9ncmFtIGhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgbW1hcCgpICovCisJCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqdm0gPSBhcmc7CisJCQlpbnQgaTsKKworCQkJbWVtc2V0KHZtLCAwLCBzaXplb2YoKnZtKSk7CisJCQl2bS0+c2l6ZSA9IHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCQl2bS0+ZnJhbWVzID0gcHdjX21idWZzOyAvKiBkb3VibGUgYnVmZmVyaW5nIHNob3VsZCBiZSBlbm91Z2ggZm9yIG1vc3QgYXBwbGljYXRpb25zICovCisJCQlmb3IgKGkgPSAwOyBpIDwgcHdjX21idWZzOyBpKyspCisJCQkJdm0tPm9mZnNldHNbaV0gPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBWSURJT0NNQ0FQVFVSRToKKwkJeworCQkJLyogU3RhcnQgY2FwdHVyZSBpbnRvIGEgZ2l2ZW4gaW1hZ2UgYnVmZmVyIChjYWxsZWQgJ2ZyYW1lJyBpbiB2aWRlb19tbWFwIHN0cnVjdHVyZSkgKi8KKwkJCXN0cnVjdCB2aWRlb19tbWFwICp2bSA9IGFyZzsKKworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ01DQVBUVVJFOiAlZHglZCwgZnJhbWUgJWQsIGZvcm1hdCAlZFxuIiwgdm0tPndpZHRoLCB2bS0+aGVpZ2h0LCB2bS0+ZnJhbWUsIHZtLT5mb3JtYXQpOworCQkJaWYgKHZtLT5mcmFtZSA8IDAgfHwgdm0tPmZyYW1lID49IHB3Y19tYnVmcykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogeGF3dHYgaXMgbmFzdHkuIEl0IHByb2JlcyB0aGUgYXZhaWxhYmxlIHBhbGV0dGVzCisJCQkgICBieSBzZXR0aW5nIGEgdmVyeSBzbWFsbCBpbWFnZSBzaXplIGFuZCB0cnlpbmcKKwkJCSAgIHZhcmlvdXMgcGFsZXR0ZXMuLi4gVGhlIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQKKwkJCSAgIHN1Y2ggc21hbGwgaW1hZ2VzLCBzbyBJJ20gd29ya2luZyBhcm91bmQgaXQuCisJCQkgKi8KKwkJCWlmICh2bS0+Zm9ybWF0KQorCQkJeworCQkJCXN3aXRjaCAodm0tPmZvcm1hdCkKKwkJCQl7CisJCQkJCWNhc2UgVklERU9fUEFMRVRURV9ZVVY0MjBQOgorCQkJCQljYXNlIFZJREVPX1BBTEVUVEVfUkFXOgorCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCh2bS0+d2lkdGggIT0gcGRldi0+dmlldy54IHx8IHZtLT5oZWlnaHQgIT0gcGRldi0+dmlldy55KSAmJgorCQkJICAgICh2bS0+d2lkdGggPj0gcGRldi0+dmlld19taW4ueCAmJiB2bS0+aGVpZ2h0ID49IHBkZXYtPnZpZXdfbWluLnkpKSB7CisJCQkJaW50IHJldDsKKworCQkJCVBXQ19ERUJVR19PUEVOKCJWSURJT0NNQ0FQVFVSRTogY2hhbmdpbmcgc2l6ZSB0byBwbGVhc2UgeGF3dHYgOi0oLlxuIik7CisJCQkJcmV0ID0gcHdjX3RyeV92aWRlb19tb2RlKHBkZXYsIHZtLT53aWR0aCwgdm0tPmhlaWdodCwgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCBwZGV2LT52c25hcHNob3QpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisJCQl9IC8qIC4uLiBzaXplIG1pc21hdGNoICovCisKKwkJCS8qIEZJWE1FOiBzaG91bGQgd2UgbG9jayBoZXJlPyAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbdm0tPmZyYW1lXSkKKwkJCQlyZXR1cm4gLUVCVVNZOwkvKiBidWZmZXIgd2Fzbid0IGF2YWlsYWJsZS4gQnVtbWVyICovCisJCQlwZGV2LT5pbWFnZV91c2VkW3ZtLT5mcmFtZV0gPSAxOworCisJCQkvKiBPa2F5LCB3ZSdyZSBkb25lIGhlcmUuIEluIHRoZSBTWU5DIGNhbGwgd2Ugd2FpdCB1bnRpbCBhCisJCQkgICBmcmFtZSBjb21lcyBhdmFpbGFibGUsIHRoZW4gZXhwYW5kIGltYWdlIGludG8gdGhlIGdpdmVuCisJCQkgICBidWZmZXIuCisJCQkgICBJbiBjb250cmFzdCB0byB0aGUgQ1BpQSBjYW0gdGhlIFBoaWxpcHMgY2FtcyBkZWxpdmVyIGEKKwkJCSAgIGNvbnN0YW50IHN0cmVhbSwgYWxtb3N0IGxpa2UgYSBncmFiYmVyIGNhcmQuIEFsc28sCisJCQkgICB3ZSBoYXZlIHNlcGFyYXRlIGJ1ZmZlcnMgZm9yIHRoZSByYXdkYXRhIGFuZCB0aGUgaW1hZ2UsCisJCQkgICBtZWFuaW5nIHdlIGNhbiBuZWFybHkgYWx3YXlzIGV4cGFuZCBpbnRvIHRoZSByZXF1ZXN0ZWQgYnVmZmVyLgorCQkJICovCisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DTUNBUFRVUkUgZG9uZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NZTkM6CisJCXsKKwkJCS8qIFRoZSBkb2Mgc2F5czogIldoZW5ldmVyIGEgYnVmZmVyIGlzIHVzZWQgaXQgc2hvdWxkCisJCQkgICBjYWxsIFZJRElPQ1NZTkMgdG8gZnJlZSB0aGlzIGZyYW1lIHVwIGFuZCBjb250aW51ZS4iCisKKwkJCSAgIFRoZSBvbmx5IG9kZCB0aGluZyBhYm91dCB0aGlzIHdob2xlIHByb2NlZHVyZSBpcworCQkJICAgdGhhdCBNQ0FQVFVSRSBmbGFncyB0aGUgYnVmZmVyIGFzICJpbiB1c2UiLCBhbmQKKwkJCSAgIFNZTkMgaW1tZWRpYXRlbHkgdW5tYXJrcyBpdCwgd2hpbGUgaXQgaXNuJ3QKKwkJCSAgIGFmdGVyIFNZTkMgdGhhdCB5b3Uga25vdyB0aGF0IHRoZSBidWZmZXIgYWN0dWFsbHkKKwkJCSAgIGdvdCBmaWxsZWQhIFNvIHlvdSBiZXR0ZXIgbm90IHN0YXJ0IGEgQ0FQVFVSRSBpbgorCQkJICAgdGhlIHNhbWUgZnJhbWUgaW1tZWRpYXRlbHkgKHVzZSBkb3VibGUgYnVmZmVyaW5nKS4KKwkJCSAgIFRoaXMgaXMgbm90IGEgcHJvYmxlbSBmb3IgdGhpcyBjYW0sIHNpbmNlIGl0IGhhcworCQkJICAgZXh0cmEgaW50ZXJtZWRpYXRlIGJ1ZmZlcnMsIGJ1dCBhIGhhcmR3YXJlCisJCQkgICBncmFiYmVyIGNhcmQgd2lsbCB0aGVuIG92ZXJ3cml0ZSB0aGUgYnVmZmVyCisJCQkgICB5b3UncmUgd29ya2luZyBvbi4KKwkJCSAqLworCQkJaW50ICptYnVmID0gYXJnOworCQkJaW50IHJldDsKKworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ1NZTkMgY2FsbGVkICglZCkuXG4iLCAqbWJ1Zik7CisKKwkJCS8qIGJvdW5kcyBjaGVjayAqLworCQkJaWYgKCptYnVmIDwgMCB8fCAqbWJ1ZiA+PSBwd2NfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBjaGVjayBpZiB0aGlzIGJ1ZmZlciB3YXMgcmVxdWVzdGVkIGFueXdheSAqLworCQkJaWYgKHBkZXYtPmltYWdlX3VzZWRbKm1idWZdID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGZyYW1lIHdhaXQtcXVldWUuCisKKwkJCSAgIEZJWE1FOiBuZWVkcyBhdWRpdGluZyBmb3Igc2FmZXR5LgorCQkJICAgUVVFU1RJT046IEluIHdoYXQgcmVzcGVjdD8gSSB0aGluayB0aGF0IHVzaW5nIHRoZQorCQkJCSAgICAgZnJhbWVxIGlzIHNhZmUgbm93LgorCQkJICovCisJCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgeworCQkJCS8qIENoZWNrIGZvciB1bnBsdWdnZWQvZXRjLiBoZXJlICovCisJCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgeworCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJCXJldHVybiAtcGRldi0+ZXJyb3Jfc3RhdHVzOworCQkJCX0KKworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQkJfQorCQkJCXNjaGVkdWxlKCk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCX0KKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJCS8qIFRoZSBmcmFtZSBpcyByZWFkeS4gRXhwYW5kIGluIHRoZSBpbWFnZSBidWZmZXIKKwkJCSAgIHJlcXVlc3RlZCBieSB0aGUgdXNlci4gSSBkb24ndCBjYXJlIGlmIHlvdQorCQkJICAgbW1hcCgpIDUgYnVmZmVycyBhbmQgcmVxdWVzdCBkYXRhIGluIHRoaXMgb3JkZXI6CisJCQkgICBidWZmZXIgNCAyIDMgMCAxIDIgMyAwIDQgMyAxIC4gLiAuCisJCQkgICBHcmFiYmVyIGhhcmR3YXJlIG1heSBub3QgYmUgc28gZm9yZ2l2aW5nLgorCQkJICovCisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DU1lOQzogZnJhbWUgcmVhZHkuXG4iKTsKKwkJCXBkZXYtPmZpbGxfaW1hZ2UgPSAqbWJ1ZjsgLyogdGVsbCBpbiB3aGljaCBidWZmZXIgd2Ugd2FudCB0aGUgaW1hZ2UgdG8gYmUgZXhwYW5kZWQgKi8KKwkJCS8qIERlY29tcHJlc3MsIGV0YyAqLworCQkJcmV0ID0gcHdjX2hhbmRsZV9mcmFtZShwZGV2KTsKKwkJCXBkZXYtPmltYWdlX3VzZWRbKm1idWZdID0gMDsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgVklESU9DR0FVRElPOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fYXVkaW8gKnYgPSBhcmc7CisKKwkJCXN0cmNweSh2LT5uYW1lLCAiTWljcm9waG9uZSIpOworCQkJdi0+YXVkaW8gPSAtMTsgLyogdW5rbm93biBhdWRpbyBtaW5vciAqLworCQkJdi0+ZmxhZ3MgPSAwOworCQkJdi0+bW9kZSA9IFZJREVPX1NPVU5EX01PTk87CisJCQl2LT52b2x1bWUgPSAwOworCQkJdi0+YmFzcyA9IDA7CisJCQl2LT50cmVibGUgPSAwOworCQkJdi0+YmFsYW5jZSA9IDB4ODAwMDsKKwkJCXYtPnN0ZXAgPSAxOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ1NBVURJTzoKKwkJeworCQkJLyogRHVtbXk6IG5vdGhpbmcgY2FuIGJlIHNldCAqLworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFZJRElPQ0dVTklUOgorCQl7CisJCQlzdHJ1Y3QgdmlkZW9fdW5pdCAqdnUgPSBhcmc7CisKKwkJCXZ1LT52aWRlbyA9IHBkZXYtPnZkZXYtPm1pbm9yICYgMHgzRjsKKwkJCXZ1LT5hdWRpbyA9IC0xOyAvKiBub3Qga25vd24geWV0ICovCisJCQl2dS0+dmJpID0gLTE7CisJCQl2dS0+cmFkaW8gPSAtMTsKKwkJCXZ1LT50ZWxldGV4dCA9IC0xOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBWNEwyIExheWVyICovCisJCWNhc2UgVklESU9DX1FVRVJZQ0FQOgorCQl7CisJCSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSBhcmc7CisKKwkJICAgIFBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQ0FQKSBUaGlzIGFwcGxpY2F0aW9uICJcCisJCQkJICAgICAgICJ0cnkgdG8gdXNlIHRoZSB2NGwyIGxheWVyXG4iKTsKKwkJICAgIHN0cmNweShjYXAtPmRyaXZlcixQV0NfTkFNRSk7CisJCSAgICBzdHJsY3B5KGNhcC0+Y2FyZCwgdmRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCQkgICAgdXNiX21ha2VfcGF0aChwZGV2LT51ZGV2LGNhcC0+YnVzX2luZm8sc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKKwkJICAgIGNhcC0+dmVyc2lvbiA9IFBXQ19WRVJTSU9OX0NPREU7CisJCSAgICBjYXAtPmNhcGFiaWxpdGllcyA9CisJCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFCXwKKwkJCVY0TDJfQ0FQX1NUUkVBTUlORwl8CisJCQlWNEwyX0NBUF9SRUFEV1JJVEU7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX0VOVU1JTlBVVDoKKwkJeworCQkgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkgPSBhcmc7CisKKwkJICAgIGlmICggaS0+aW5kZXggKQkvKiBPbmx5IG9uZSBJTlBVVCBpcyBzdXBwb3J0ZWQgKi8KKwkJCSAgcmV0dXJuIC1FSU5WQUw7CisKKwkJICAgIG1lbXNldChpLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKTsKKwkJICAgIHN0cmNweShpLT5uYW1lLCAidXNiIik7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJCXsKKwkJICAgIGludCAqaSA9IGFyZzsKKwkJICAgICppID0gMDsJLyogT25seSBvbmUgSU5QVVQgaXMgc3VwcG9ydGVkICovCisJCSAgICByZXR1cm4gMDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0lOUFVUOgorCQl7CisJCQlpbnQgKmkgPSBhcmc7CisKKwkJCWlmICggKmkgKSB7CS8qIE9ubHkgb25lIElOUFVUIGlzIHN1cHBvcnRlZCAqLworCQkJCVBXQ19ERUJVR19JT0NUTCgiT25seSBvbmUgaW5wdXQgc291cmNlIGlzIlwKKwkJCQkJIiBzdXBwb3J0ZWQgd2l0aCB0aGlzIHdlYmNhbS5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBUT0RPOiAqLworCQljYXNlIFZJRElPQ19RVUVSWUNUUkw6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYyA9IGFyZzsKKwkJCWludCBpOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUNUUkwpIHF1ZXJ5IGlkPSVkXG4iLCBjLT5pZCk7CisJCQlmb3IgKGk9MDsgaTxzaXplb2YocHdjX2NvbnRyb2xzKS9zaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKTsgaSsrKSB7CisJCQkJaWYgKHB3Y19jb250cm9sc1tpXS5pZCA9PSBjLT5pZCkgeworCQkJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUNUUkwpIGZvdW5kXG4iKTsKKwkJCQkJbWVtY3B5KGMsJnB3Y19jb250cm9sc1tpXSxzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQ1RSTCkgbm90IGZvdW5kXG4iKTsKKworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY2FzZSBWSURJT0NfR19DVFJMOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjID0gYXJnOworCQkJaW50IHJldDsKKworCQkJc3dpdGNoIChjLT5pZCkKKwkJCXsKKwkJCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCQkJCWMtPnZhbHVlID0gcHdjX2dldF9icmlnaHRuZXNzKHBkZXYpOworCQkJCQlpZiAoYy0+dmFsdWU8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJCQljLT52YWx1ZSA9IHB3Y19nZXRfY29udHJhc3QocGRldik7CisJCQkJCWlmIChjLT52YWx1ZTwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwkJCQkJcmV0ID0gcHdjX2dldF9zYXR1cmF0aW9uKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0dBTU1BOgorCQkJCQljLT52YWx1ZSA9IHB3Y19nZXRfZ2FtbWEocGRldik7CisJCQkJCWlmIChjLT52YWx1ZTwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6CisJCQkJCXJldCA9IHB3Y19nZXRfcmVkX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID4+PSA4OworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJCQkJcmV0ID0gcHdjX2dldF9ibHVlX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID4+PSA4OworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRToKKwkJCQkJcmV0ID0gcHdjX2dldF9hd2IocGRldik7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA9IChyZXQgPT0gUFdDX1dCX01BTlVBTCk/MDoxOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0dBSU46CisJCQkJCXJldCA9IHB3Y19nZXRfYWdjKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA+Pj0gODsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJCQkJcmV0ID0gcHdjX2dldF9hZ2MocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlID0gKGMtPnZhbHVlIDwgMCk/MTowOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQkJCQlyZXQgPSBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERToKKwkJCQkJcmV0ID0gcHdjX2dldF9jb2xvdXJfbW9kZShwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVI6CisJCQkJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZT0oYy0+dmFsdWUgPT0gLTE/MTowKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVI6CisJCQkJCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCAmYy0+dmFsdWUpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQljLT52YWx1ZSA+Pj0gMTA7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6CisJCQkJCXJldCA9IHB3Y19nZXRfYmFja2xpZ2h0KHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9GTElDS0VSTEVTUzoKKwkJCQkJcmV0ID0gcHdjX2dldF9mbGlja2VyKHBkZXYsICZjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQgPCAwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWMtPnZhbHVlPShjLT52YWx1ZT8xOjApOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OOgorCQkJCQlyZXQgPSBwd2NfZ2V0X2R5bmFtaWNfbm9pc2UocGRldiwgJmMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSOgorCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVI6CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQljYXNlIFZJRElPQ19TX0NUUkw6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmMgPSBhcmc7CisJCQlpbnQgcmV0OworCisJCQlzd2l0Y2ggKGMtPmlkKQorCQkJeworCQkJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCQkJYy0+dmFsdWUgPDw9IDk7CisJCQkJCXJldCA9IHB3Y19zZXRfYnJpZ2h0bmVzcyhwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCQkJCQljLT52YWx1ZSA8PD0gMTA7CisJCQkJCXJldCA9IHB3Y19zZXRfY29udHJhc3QocGRldiwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQkJCQlyZXQgPSBwd2Nfc2V0X3NhdHVyYXRpb24ocGRldiwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCSAgcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfR0FNTUE6CisJCQkJCWMtPnZhbHVlIDw8PSAxMTsKKwkJCQkJcmV0ID0gcHdjX3NldF9nYW1tYShwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9yZWRfZ2FpbihwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0JMVUVfQkFMQU5DRToKKwkJCQkJYy0+dmFsdWUgPDw9IDg7CisJCQkJCXJldCA9IHB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldDwwKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQkJCQljLT52YWx1ZSA9IChjLT52YWx1ZSA9PSAwKT9QV0NfV0JfTUFOVUFMOlBXQ19XQl9BVVRPOworCQkJCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCBjLT52YWx1ZSk7CisJCQkJCWlmIChyZXQ8MCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9zaHV0dGVyX3NwZWVkKHBkZXYsIGMtPnZhbHVlPzA6MSwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJCQkJLyogYXV0b2dhaW4gb2ZmIG1lYW5zIG5vdGhpbmcgd2l0aG91dCBhIGdhaW4gKi8KKwkJCQkJaWYgKGMtPnZhbHVlID09IDApCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgYy0+dmFsdWUsIDApOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9HQUlOOgorCQkJCQljLT52YWx1ZSA8PD0gODsKKwkJCQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgMCwgYy0+dmFsdWUpOworCQkJCQlpZiAocmV0PDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUjoKKwkJCQkJaWYgKHB3Y19zYXZlX3VzZXIocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUjoKKwkJCQkJaWYgKHB3Y19yZXN0b3JlX3VzZXIocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWToKKwkJCQkJaWYgKHB3Y19yZXN0b3JlX2ZhY3RvcnkocGRldikpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJcmV0dXJuIDA7CisJCQkJY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFOgorCQkJCQlyZXQgPSBwd2Nfc2V0X2NvbG91cl9tb2RlKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkJaWYgKHJldCA8IDApCisJCQkJCSAgcmV0dXJuIC1FSU5WQUw7CisJCQkJCXJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUjoKKwkJCQkgIGMtPnZhbHVlPShjLT52YWx1ZSA9PSAxKT8tMTowOworCQkJCSAgcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkgIGlmIChyZXQgPCAwKQorCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQkgIHJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSOgorCQkJCSAgYy0+dmFsdWUgPDw9IDEwOworCQkJCSAgcmV0ID0gcHdjX3NldF9jb250b3VyKHBkZXYsIGMtPnZhbHVlKTsKKwkJCQkgIGlmIChyZXQgPCAwKQorCQkJCSAgICByZXR1cm4gLUVJTlZBTDsKKwkJCQkgIHJldHVybiAwOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6CisJCQkJICByZXQgPSBwd2Nfc2V0X2JhY2tsaWdodChwZGV2LCBjLT52YWx1ZSk7CisJCQkJICBpZiAocmV0IDwgMCkKKwkJCQkgICAgcmV0dXJuIC1FSU5WQUw7CisJCQkJICByZXR1cm4gMDsKKwkJCQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1M6CisJCQkJICByZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgYy0+dmFsdWUpOworCQkJCSAgaWYgKHJldCA8IDApCisJCQkJICAgIHJldHVybiAtRUlOVkFMOworCQkJCWNhc2UgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT046CisJCQkJICByZXQgPSBwd2Nfc2V0X2R5bmFtaWNfbm9pc2UocGRldiwgYy0+dmFsdWUpOworCQkJCSAgaWYgKHJldCA8IDApCisJCQkJICAgIHJldHVybiAtRUlOVkFMOworCQkJCSAgcmV0dXJuIDA7CisKKwkJCX0KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY2FzZSBWSURJT0NfRU5VTV9GTVQ6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYgPSBhcmc7CisJCQlpbnQgaW5kZXg7CisKKwkJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCSAgICAgIHJldHVybiAtRUlOVkFMOworCisJCQkvKiBXZSBvbmx5IHN1cHBvcnQgdHdvIGZvcm1hdDogdGhlIHJhdyBmb3JtYXQsIGFuZCBZVVYgKi8KKwkJCWluZGV4ID0gZi0+aW5kZXg7CisJCQltZW1zZXQoZiwwLHNpemVvZihzdHJ1Y3QgdjRsMl9mbXRkZXNjKSk7CisJCQlmLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCQkJZi0+aW5kZXggPSBpbmRleDsKKwkJCXN3aXRjaChpbmRleCkKKwkJCXsKKwkJCQljYXNlIDA6CisJCQkJCS8qIFJBVyBmb3JtYXQgKi8KKwkJCQkJZi0+cGl4ZWxmb3JtYXQgPSBwZGV2LT50eXBlPD02NDY/VjRMMl9QSVhfRk1UX1BXQzE6VjRMMl9QSVhfRk1UX1BXQzI7CisJCQkJCWYtPmZsYWdzID0gVjRMMl9GTVRfRkxBR19DT01QUkVTU0VEOworCQkJCQlzdHJsY3B5KGYtPmRlc2NyaXB0aW9uLCJSYXcgUGhpbGlwcyBXZWJjYW0iLHNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE6CisJCQkJCWYtPnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVVjQyMDsKKwkJCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbiwiNDoyOjAsIHBsYW5hciwgWS1DYi1DciIsc2l6ZW9mKGYtPmRlc2NyaXB0aW9uKSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19HX0ZNVDoKKwkJeworCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19HX0ZNVCkgcmV0dXJuIHNpemUgJWR4JWRcbiIscGRldi0+aW1hZ2UueCxwZGV2LT5pbWFnZS55KTsKKwkJCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJCSAgICAgIHJldHVybiAtRUlOVkFMOworCisJCQlwd2NfdmlkaW9jX2ZpbGxfZm10KHBkZXYsIGYpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1RSWV9GTVQ6CisJCQlyZXR1cm4gcHdjX3ZpZGlvY190cnlfZm10KHBkZXYsIGFyZyk7CisKKwkJY2FzZSBWSURJT0NfU19GTVQ6CisJCQlyZXR1cm4gcHdjX3ZpZGlvY19zZXRfZm10KHBkZXYsIGFyZyk7CisKKwkJY2FzZSBWSURJT0NfR19TVEQ6CisJCXsKKwkJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCQkqc3RkID0gVjRMMl9TVERfVU5LTk9XTjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfU19TVEQ6CisJCXsKKwkJCXY0bDJfc3RkX2lkICpzdGQgPSBhcmc7CisJCQlpZiAoKnN0ZCAhPSBWNEwyX1NURF9VTktOT1dOKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19FTlVNU1REOgorCQl7CisJCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqc3RkID0gYXJnOworCQkJaWYgKHN0ZC0+aW5kZXggIT0gMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXN0ZC0+aWQgPSBWNEwyX1NURF9VTktOT1dOOworCQkJc3RybmNweShzdGQtPm5hbWUsICJ3ZWJjYW0iLCBzaXplb2Yoc3RkLT5uYW1lKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1JFUUJVRlM6CisJCXsKKwkJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyYiA9IGFyZzsKKwkJCWludCBuYnVmZmVyczsKKworCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUkVRQlVGUykgY291bnQ9JWRcbiIscmItPmNvdW50KTsKKwkJCWlmIChyYi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAocmItPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQluYnVmZmVycyA9IHJiLT5jb3VudDsKKwkJCWlmIChuYnVmZmVycyA8IDIpCisJCQkJbmJ1ZmZlcnMgPSAyOworCQkJZWxzZSBpZiAobmJ1ZmZlcnMgPiBwd2NfbWJ1ZnMpCisJCQkJbmJ1ZmZlcnMgPSBwd2NfbWJ1ZnM7CisJCQkvKiBGb3JjZSB0byB1c2Ugb3VyICMgb2YgYnVmZmVycyAqLworCQkJcmItPmNvdW50ID0gcHdjX21idWZzOworCQkJcmV0dXJuIDA7CisJCX0KKworCQljYXNlIFZJRElPQ19RVUVSWUJVRjoKKwkJeworCQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYgPSBhcmc7CisJCQlpbnQgaW5kZXg7CisKKwkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBpbmRleD0lZFxuIixidWYtPmluZGV4KTsKKwkJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7CisJCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCB0eXBlXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKSB7CisJCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCBtZW1vcnkgdHlwZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpbmRleCA9IGJ1Zi0+aW5kZXg7CisJCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHB3Y19tYnVmcykgeworCQkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBCYWQgaW5kZXggJWRcbiIsIGJ1Zi0+aW5kZXgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSk7CisJCQlidWYtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQlidWYtPmluZGV4ID0gaW5kZXg7CisJCQlidWYtPm0ub2Zmc2V0ID0gaW5kZXggKiBwZGV2LT5sZW5fcGVyX2ltYWdlOworCQkJaWYgKHBkZXYtPnZwYWxldHRlID09IFZJREVPX1BBTEVUVEVfUkFXKQorCQkJCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7CisJCQllbHNlCisJCQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT52aWV3LnNpemU7CisJCQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQkJYnVmLT5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOworCQkJLy9idWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7CisJCQlidWYtPmxlbmd0aCA9IHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisKKwkJCVBXQ19ERUJVR19SRUFEKCJWSURJT0NfUVVFUllCVUY6IGluZGV4PSVkXG4iLGJ1Zi0+aW5kZXgpOworCQkJUFdDX0RFQlVHX1JFQUQoIlZJRElPQ19RVUVSWUJVRjogbS5vZmZzZXQ9JWRcbiIsYnVmLT5tLm9mZnNldCk7CisJCQlQV0NfREVCVUdfUkVBRCgiVklESU9DX1FVRVJZQlVGOiBieXRlc3VzZWQ9JWRcbiIsYnVmLT5ieXRlc3VzZWQpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWNhc2UgVklESU9DX1FCVUY6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOworCisJCQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RQlVGKSBpbmRleD0lZFxuIixidWYtPmluZGV4KTsKKwkJCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYnVmLT5pbmRleCA8IDAgfHwgYnVmLT5pbmRleCA+PSBwd2NfbWJ1ZnMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7CisJCQlidWYtPmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX0RPTkU7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfRFFCVUY6CisJCXsKKwkJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmID0gYXJnOworCQkJaW50IHJldDsKKworCQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfRFFCVUYpXG4iKTsKKworCQkJaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGZyYW1lIHdhaXQtcXVldWUuCisKKwkJCSAgIEZJWE1FOiBuZWVkcyBhdWRpdGluZyBmb3Igc2FmZXR5LgorCQkJICAgUVVFU1RJT046IEluIHdoYXQgcmVzcGVjdD8gSSB0aGluayB0aGF0IHVzaW5nIHRoZQorCQkJCSAgICAgZnJhbWVxIGlzIHNhZmUgbm93LgorCQkJICovCisJCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgeworCQkJCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpIHsKKwkJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCQlyZXR1cm4gLXBkZXYtPmVycm9yX3N0YXR1czsKKwkJCQl9CisKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnBkZXYtPmZyYW1lcSwgJndhaXQpOworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJCX0KKwkJCQlzY2hlZHVsZSgpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQl9CisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJCQlQV0NfREVCVUdfSU9DVEwoIlZJRElPQ19EUUJVRjogZnJhbWUgcmVhZHkuXG4iKTsKKwkJCS8qIERlY29tcHJlc3MgZGF0YSBpbiBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0gKi8KKwkJCXJldCA9IHB3Y19oYW5kbGVfZnJhbWUocGRldik7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGFmdGVyIHB3Y19oYW5kbGVfZnJhbWVcbiIpOworCisJCQlidWYtPmluZGV4ID0gcGRldi0+ZmlsbF9pbWFnZTsKKwkJCWlmIChwZGV2LT52cGFsZXR0ZSA9PSBWSURFT19QQUxFVFRFX1JBVykKKwkJCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOworCQkJZWxzZQorCQkJCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+dmlldy5zaXplOworCQkJYnVmLT5mbGFncyA9IFY0TDJfQlVGX0ZMQUdfTUFQUEVEOworCQkJYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCWRvX2dldHRpbWVvZmRheSgmYnVmLT50aW1lc3RhbXApOworCQkJYnVmLT5zZXF1ZW5jZSA9IDA7CisJCQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJCQlidWYtPm0ub2Zmc2V0ID0gcGRldi0+ZmlsbF9pbWFnZSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7CisJCQlidWYtPmxlbmd0aCA9IGJ1Zi0+Ynl0ZXN1c2VkOworCQkJcHdjX25leHRfaW1hZ2UocGRldik7CisKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBidWYtPmluZGV4PSVkXG4iLGJ1Zi0+aW5kZXgpOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGJ1Zi0+bGVuZ3RoPSVkXG4iLGJ1Zi0+bGVuZ3RoKTsKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBtLm9mZnNldD0lZFxuIixidWYtPm0ub2Zmc2V0KTsKKwkJCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBieXRlc3VzZWQ9JWRcbiIsYnVmLT5ieXRlc3VzZWQpOworCQkJUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGxlYXZpbmdcbiIpOworCQkJcmV0dXJuIDA7CisKKwkJfQorCisJCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCQl7CisJCQkvKiBXQVJOSU5HOiBwd2NfdHJ5X3ZpZGVvX21vZGUoKSBjYWxsZWQgcHdjX2lzb2NfaW5pdCAqLworCQkJcHdjX2lzb2NfaW5pdChwZGV2KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgorCQl7CisJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIHB3Y19pb2N0bChwZGV2LCBjbWQsIGFyZyk7CisJfSAvKiAuLnN3aXRjaCAqLworCXJldHVybiAwOworfQorCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKaW5kZXggMWIwZWUwYy4uNjI5Zjc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKQEAgLTEsNSArMSw1IEBACiAvKiAoQykgMTk5OS0yMDAzIE5lbW9zb2Z0IFVudi4KLSAgIChDKSAyMDA0ICAgICAgTHVjIFNhaWxsYXJkIChsdWNAc2FpbGxhcmQub3JnKQorICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0yOSw1MSArMjksODcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgotI2luY2x1ZGUgInB3Yy1pb2N0bC5oIgotCi0vKiBEZWZpbmVzIGFuZCBzdHJ1Y3R1cmVzIGZvciB0aGUgUGhpbGlwcyB3ZWJjYW0gKi8KLS8qIFVzZWQgZm9yIGNoZWNraW5nIG1lbW9yeSBjb3JydXB0aW9uL3BvaW50ZXIgdmFsaWRhdGlvbiAqLwotI2RlZmluZSBQV0NfTUFHSUMgMHg4OURDMTBBQlVMCi0jdW5kZWYgUFdDX01BR0lDCisjaW5jbHVkZSA8bWVkaWEvcHdjLWlvY3RsLmg+CiAKIC8qIFR1cm4gc29tZSBkZWJ1Z2dpbmcgb3B0aW9ucyBvbi9vZmYgKi8KLSNkZWZpbmUgUFdDX0RFQlVHIDAKKyNpZm5kZWYgQ09ORklHX1BXQ19ERUJVRworI2RlZmluZSBDT05GSUdfUFdDX0RFQlVHIDEKKyNlbmRpZgorCisvKiBWZXJzaW9uIGJsb2NrICovCisjZGVmaW5lIFBXQ19NQUpPUgkxMAorI2RlZmluZSBQV0NfTUlOT1IJMAorI2RlZmluZSBQV0NfRVhUUkFNSU5PUgkxMgorI2RlZmluZSBQV0NfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKFBXQ19NQUpPUixQV0NfTUlOT1IsUFdDX0VYVFJBTUlOT1IpCisjZGVmaW5lIFBXQ19WRVJTSU9OIAkiMTAuMC4xMiIKKyNkZWZpbmUgUFdDX05BTUUgCSJwd2MiCisjZGVmaW5lIFBGWAkJUFdDX05BTUUgIjogIgorCiAKIC8qIFRyYWNlIGNlcnRhaW4gYWN0aW9ucyBpbiB0aGUgZHJpdmVyICovCi0jZGVmaW5lIFRSQUNFX01PRFVMRQkweDAwMDEKLSNkZWZpbmUgVFJBQ0VfUFJPQkUJMHgwMDAyCi0jZGVmaW5lIFRSQUNFX09QRU4JMHgwMDA0Ci0jZGVmaW5lIFRSQUNFX1JFQUQJMHgwMDA4Ci0jZGVmaW5lIFRSQUNFX01FTU9SWQkweDAwMTAKLSNkZWZpbmUgVFJBQ0VfRkxPVwkweDAwMjAKLSNkZWZpbmUgVFJBQ0VfU0laRQkweDAwNDAKLSNkZWZpbmUgVFJBQ0VfUFdDWAkweDAwODAKLSNkZWZpbmUgVFJBQ0VfU0VRVUVOQ0UJMHgxMDAwCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9NT0RVTEUJKDE8PDApCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9QUk9CRQkoMTw8MSkKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX09QRU4JKDE8PDIpCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9SRUFECSgxPDwzKQorI2RlZmluZSBQV0NfREVCVUdfTEVWRUxfTUVNT1JZCSgxPDw0KQorI2RlZmluZSBQV0NfREVCVUdfTEVWRUxfRkxPVwkoMTw8NSkKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX1NJWkUJKDE8PDYpCisjZGVmaW5lIFBXQ19ERUJVR19MRVZFTF9JT0NUTAkoMTw8NykKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMX1RSQUNFCSgxPDw4KQogCi0jZGVmaW5lIFRyYWNlKFIsIEEuLi4pIGlmIChwd2NfdHJhY2UgJiBSKSBwcmludGsoS0VSTl9ERUJVRyBQV0NfTkFNRSAiICIgQSkKLSNkZWZpbmUgRGVidWcoQS4uLikgcHJpbnRrKEtFUk5fREVCVUcgUFdDX05BTUUgIiAiIEEpCi0jZGVmaW5lIEluZm8oQS4uLikgIHByaW50ayhLRVJOX0lORk8gIFBXQ19OQU1FICIgIiBBKQotI2RlZmluZSBFcnIoQS4uLikgICBwcmludGsoS0VSTl9FUlIgICBQV0NfTkFNRSAiICIgQSkKKyNkZWZpbmUgUFdDX0RFQlVHX01PRFVMRShmbXQsIGFyZ3MuLi4pIFBXQ19ERUJVRyhNT0RVTEUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfUFJPQkUoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoUFJPQkUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfT1BFTihmbXQsIGFyZ3MuLi4pIFBXQ19ERUJVRyhPUEVOLCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0RFQlVHX1JFQUQoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoUkVBRCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBXQ19ERUJVR19NRU1PUlkoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoTUVNT1JZLCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0RFQlVHX0ZMT1coZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoRkxPVywgZm10LCAjI2FyZ3MpCisjZGVmaW5lIFBXQ19ERUJVR19TSVpFKGZtdCwgYXJncy4uLikgUFdDX0RFQlVHKFNJWkUsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfSU9DVEwoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoSU9DVEwsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBQV0NfREVCVUdfVFJBQ0UoZm10LCBhcmdzLi4uKSBQV0NfREVCVUcoVFJBQ0UsIGZtdCwgIyNhcmdzKQogCiAKKyNpZiBDT05GSUdfUFdDX0RFQlVHCisKKyNkZWZpbmUgUFdDX0RFQlVHX0xFVkVMCShQV0NfREVCVUdfTEVWRUxfTU9EVUxFKQorCisjZGVmaW5lIFBXQ19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7XAorCSAgaWYgKChQV0NfREVCVUdfTEVWRUxfICMjbGV2ZWwpICYgcHdjX3RyYWNlKSBcCisJICAgICBwcmludGsoS0VSTl9ERUJVRyBQRlggZm10LCAjI2FyZ3MpOyBcCisJICB9IHdoaWxlKDApCisKKyNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0lORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1RSQUNFKGZtdCwgYXJncy4uLikgUFdDX0RFQlVHKFRSQUNFLCBmbXQsICMjYXJncykKKworI2Vsc2UgLyogaWYgISBDT05GSUdfUFdDX0RFQlVHICovCisKKyNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX0lORk8oZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJncykKKyNkZWZpbmUgUFdDX1RSQUNFKGZtdCwgYXJncy4uLikgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIFBXQ19ERUJVRyhsZXZlbCwgZm10LCBhcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKKworI2RlZmluZSBwd2NfdHJhY2UgMAorCisjZW5kaWYKKwogLyogRGVmaW5lcyBmb3IgVG9VQ2FtIGNhbWVyYXMgKi8KICNkZWZpbmUgVE9VQ0FNX0hFQURFUl9TSVpFCQk4CiAjZGVmaW5lIFRPVUNBTV9UUkFJTEVSX1NJWkUJCTQKIAogI2RlZmluZSBGRUFUVVJFX01PVE9SX1BBTlRJTFQJCTB4MDAwMQotCi0vKiBWZXJzaW9uIGJsb2NrICovCi0jZGVmaW5lIFBXQ19NQUpPUgk5Ci0jZGVmaW5lIFBXQ19NSU5PUgkwCi0jZGVmaW5lIFBXQ19WRVJTSU9OIAkiOS4wLjItdW5vZmZpY2lhbCIKLSNkZWZpbmUgUFdDX05BTUUgCSJwd2MiCisjZGVmaW5lIEZFQVRVUkVfQ09ERUMxCQkJMHgwMDAyCisjZGVmaW5lIEZFQVRVUkVfQ09ERUMyCQkJMHgwMDA0CiAKIC8qIFR1cm4gY2VydGFpbiBmZWF0dXJlcyBvbi9vZmYgKi8KICNkZWZpbmUgUFdDX0lOVF9QSVBFIDAKQEAgLTk1LDYgKzEzMSwxOCBAQAogLyogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBhdmFpbGFibGUgZm9yIG1tYXAoKSAqLwogI2RlZmluZSBNQVhfSU1BR0VTIAkJMTAKIAorLyogU29tZSBtYWNyb3MgdG8gcXVpY2tseSBmaW5kIHRoZSB0eXBlIG9mIGEgd2ViY2FtICovCisjZGVmaW5lIERFVklDRV9VU0VfQ09ERUMxKHgpICgoeCk8Njc1KQorI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMih4KSAoKHgpPj02NzUgJiYgKHgpPDcwMCkKKyNkZWZpbmUgREVWSUNFX1VTRV9DT0RFQzMoeCkgKCh4KT49NzAwKQorI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMjMoeCkgKCh4KT49Njc1KQorCisKKyNpZm5kZWYgVjRMMl9QSVhfRk1UX1BXQzEKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1BXQzEJdjRsMl9mb3VyY2MoJ1AnLCdXJywnQycsJzEnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfUFdDMgl2NGwyX2ZvdXJjYygnUCcsJ1cnLCdDJywnMicpCisjZW5kaWYKKwogLyogVGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmVzIHdlcmUgYmFzZWQgb24gY3BpYS5oLiBXaHkgcmVpbnZlbnQgdGhlIHdoZWVsPyA6LSkgKi8KIHN0cnVjdCBwd2NfaXNvX2J1ZgogewpAQCAtMTEwLDE3ICsxNTgsMTkgQEAKICAgIHZvaWQgKmRhdGE7CiAgICB2b2xhdGlsZSBpbnQgZmlsbGVkOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCAqLwogICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKm5leHQ7CS8qIGxpc3QgKi8KLSNpZiBQV0NfREVCVUcKLSAgIGludCBzZXF1ZW5jZTsJCS8qIFNlcXVlbmNlIG51bWJlciAqLwotI2VuZGlmCit9OworCisvKiBhZGRpdGlvbm5hbCBpbmZvcm1hdGlvbnMgdXNlZCB3aGVuIGRlYWxpbmcgaW1hZ2UgYmV0d2VlbiBrZXJuZWwgYW5kIHVzZXJsYW5kICovCitzdHJ1Y3QgcHdjX2ltZ2J1ZgoreworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwkvKiBvZmZzZXQgb2YgdGhpcyBidWZmZXIgaW4gdGhlIGJpZyBhcnJheSBvZiBpbWFnZV9kYXRhICovCisJaW50ICAgdm1hX3VzZV9jb3VudDsJLyogY291bnQgdGhlIG51bWJlciBvZiB0aW1lIHRoaXMgbWVtb3J5IGlzIG1hcHBlZCAqLwogfTsKIAogc3RydWN0IHB3Y19kZXZpY2UKIHsKICAgIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7Ci0jaWZkZWYgUFdDX01BR0lDCi0gICBpbnQgbWFnaWM7Ci0jZW5kaWYKKwogICAgLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSAqLwogICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAKQEAgLTE3NywxMiArMjI3LDggQEAKICAgIGludCBmcmFtZV9zaXplOwogICAgaW50IGZyYW1lX3RvdGFsX3NpemU7IC8qIGluY2x1ZGluZyBoZWFkZXIgJiB0cmFpbGVyICovCiAgICBpbnQgZHJvcF9mcmFtZXM7Ci0jaWYgUFdDX0RFQlVHCi0gICBpbnQgc2VxdWVuY2U7CQkJLyogRGVidWdnaW5nIGFpZCAqLwotI2VuZGlmCiAKICAgIC8qIDM6IGRlY29tcHJlc3Npb24gKi8KLSAgIHN0cnVjdCBwd2NfZGVjb21wcmVzc29yICpkZWNvbXByZXNzb3I7CS8qIGZ1bmN0aW9uIGJsb2NrIHdpdGggZGVjb21wcmVzc2lvbiByb3V0aW5lcyAqLwogICAgdm9pZCAqZGVjb21wcmVzc19kYXRhOwkJLyogcHJpdmF0ZSBkYXRhIGZvciBkZWNvbXByZXNzaW9uIGVuZ2luZSAqLwogCiAgICAvKiA0OiBpbWFnZSAqLwpAQCAtMTk4LDcgKzI0NCw3IEBACiAgICBzdHJ1Y3QgcHdjX2Nvb3JkIG9mZnNldDsJCS8qIG9mZnNldCB3aXRoaW4gdGhlIHZpZXdwb3J0ICovCiAKICAgIHZvaWQgKmltYWdlX2RhdGE7CQkJLyogdG90YWwgYnVmZmVyLCB3aGljaCBpcyBzdWJkaXZpZGVkIGludG8gLi4uICovCi0gICB2b2lkICppbWFnZV9wdHJbTUFYX0lNQUdFU107CQkvKiAuLi5zZXZlcmFsIGltYWdlcy4uLiAqLworICAgc3RydWN0IHB3Y19pbWdidWYgaW1hZ2VzW01BWF9JTUFHRVNdOy8qIC4uLnNldmVyYWwgaW1hZ2VzLi4uICovCiAgICBpbnQgZmlsbF9pbWFnZTsJCQkvKiAuLi53aGljaCBhcmUgcm90YXRlZC4gKi8KICAgIGludCBsZW5fcGVyX2ltYWdlOwkJCS8qIGxlbmd0aCBwZXIgaW1hZ2UgKi8KICAgIGludCBpbWFnZV9yZWFkX3BvczsJCQkvKiBJbiBjYXNlIHdlIHJlYWQgZGF0YSBpbiBwaWVjZXMsIGtlZXAgdHJhY2sgb2Ygd2VyZSB3ZSBhcmUgaW4gdGhlIGltYWdlYnVmZmVyICovCkBAIC0yMTEsNiArMjU3LDcgQEAKICAgIHN0cnVjdCBwd2NfbXB0X3JhbmdlIGFuZ2xlX3JhbmdlOwogICAgaW50IHBhbl9hbmdsZTsJCQkvKiBpbiBkZWdyZWVzICogMTAwICovCiAgICBpbnQgdGlsdF9hbmdsZTsJCQkvKiBhYnNvbHV0ZSBhbmdsZTsgMCwwIGlzIGhvbWUgcG9zaXRpb24gKi8KKyAgIGludCBzbmFwc2hvdF9idXR0b25fc3RhdHVzOwkJLyogc2V0IHRvIDEgd2hlbiB0aGUgdXNlciBwdXNoIHRoZSBidXR0b24sIHJlc2V0IHRvIDAgd2hlbiB0aGlzIHZhbHVlIGlzIHJlYWQgKi8KIAogICAgLyoqKiBNaXNjLiBkYXRhICoqKi8KICAgIHdhaXRfcXVldWVfaGVhZF90IGZyYW1lcTsJCS8qIFdoZW4gd2FpdGluZyBmb3IgYSBmcmFtZSB0byBmaW5pc2guLi4gKi8KQEAgLTIxOSwyMCArMjY2LDI2IEBACiAjZW5kaWYKIH07CiAKLQogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vKiBHbG9iYWwgdmFyaWFibGUgKi8KKy8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KKyNpZiBDT05GSUdfUFdDX0RFQlVHCiBleHRlcm4gaW50IHB3Y190cmFjZTsKKyNlbmRpZgorZXh0ZXJuIGludCBwd2NfbWJ1ZnM7CiAKIC8qKiBmdW5jdGlvbnMgaW4gcHdjLWlmLmMgKi8KIGludCBwd2NfdHJ5X3ZpZGVvX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5ld19mcHMsIGludCBuZXdfY29tcHJlc3Npb24sIGludCBuZXdfc25hcHNob3QpOworaW50IHB3Y19oYW5kbGVfZnJhbWUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwordm9pZCBwd2NfbmV4dF9pbWFnZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitpbnQgcHdjX2lzb2NfaW5pdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Cit2b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwogCiAvKiogRnVuY3Rpb25zIGluIHB3Yy1taXNjLmMgKi8KIC8qIHNpemVzIGluIHBpeGVscyAqLwotZXh0ZXJuIHN0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBwd2NfY29vcmQgcHdjX2ltYWdlX3NpemVzW1BTWl9NQVhdOwogCiBpbnQgcHdjX2RlY29kZV9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogdm9pZCBwd2NfY29uc3RydWN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKQEAgLTI0MCw2ICsyOTMsOSBAQAogLyoqIEZ1bmN0aW9ucyBpbiBwd2MtY3RybC5jICovCiAvKiBSZXF1ZXN0IGEgY2VydGFpbiB2aWRlbyBtb2RlLiBSZXR1cm5zIDwgMCBpZiBub3QgcG9zc2libGUgKi8KIGV4dGVybiBpbnQgcHdjX3NldF92aWRlb19tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmcmFtZXMsIGludCBjb21wcmVzc2lvbiwgaW50IHNuYXBzaG90KTsKKy8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBpbWFnZSAobm90IGZyYW1lKSAqLworZXh0ZXJuIGludCBwd2NfbXB0X3Jlc2V0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxhZ3MpOworZXh0ZXJuIGludCBwd2NfbXB0X3NldF9hbmdsZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBhbiwgaW50IHRpbHQpOwogCiAvKiBWYXJpb3VzIGNvbnRyb2xzOyBzaG91bGQgYmUgb2J2aW91cy4gVmFsdWUgMC4uNjU1MzUsIG9yIDwgMCBvbiBlcnJvciAqLwogZXh0ZXJuIGludCBwd2NfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwpAQCAtMjQ4LDEwICszMDQsMzYgQEAKIGV4dGVybiBpbnQgcHdjX3NldF9jb250cmFzdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX2dldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CiBleHRlcm4gaW50IHB3Y19zZXRfZ2FtbWEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CitleHRlcm4gaW50IHB3Y19nZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSk7CiBleHRlcm4gaW50IHB3Y19zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKIGV4dGVybiBpbnQgcHdjX3NldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgb25fdmFsdWUsIGludCBvZmZfdmFsdWUpOwogZXh0ZXJuIGludCBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnNlbnNvcik7CitleHRlcm4gaW50IHB3Y19yZXN0b3JlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2F2ZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKK2V4dGVybiBpbnQgcHdjX3Jlc3RvcmVfZmFjdG9yeShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CisKKy8qIGV4cG9ydGVkIGZvciB1c2UgYnkgdjRsMiBjb250cm9scyAqLworZXh0ZXJuIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOworZXh0ZXJuIGludCBwd2Nfc2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOworZXh0ZXJuIGludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUpOworZXh0ZXJuIGludCBwd2Nfc2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSk7CitleHRlcm4gaW50IHB3Y19nZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKKworZXh0ZXJuIGludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKTsKK2V4dGVybiBpbnQgcHdjX2dldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb2xvdXIpOworZXh0ZXJuIGludCBwd2Nfc2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb250b3VyKTsKK2V4dGVybiBpbnQgcHdjX2dldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbnRvdXIpOworZXh0ZXJuIGludCBwd2Nfc2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGJhY2tsaWdodCk7CitleHRlcm4gaW50IHB3Y19nZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmJhY2tsaWdodCk7CitleHRlcm4gaW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpOworZXh0ZXJuIGludCBwd2NfZ2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqZmxpY2tlcik7CitleHRlcm4gaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKTsKK2V4dGVybiBpbnQgcHdjX2dldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm5vaXNlKTsKIAogLyogUG93ZXIgZG93biBvciB1cCB0aGUgY2FtZXJhOyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBtb2RlbHMgKi8KIGV4dGVybiBpbnQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKTsKQEAgLTI1OSw2ICszNDEsOSBAQAogLyogUHJpdmF0ZSBpb2N0bCgpczsgc2VlIHB3Yy1pb2N0bC5oICovCiBleHRlcm4gaW50IHB3Y19pb2N0bChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIAorLyoqIEZ1bmN0aW9ucyBpbiBwd2MtdjRsLmMgKi8KK2V4dGVybiBpbnQgcHdjX3ZpZGVvX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKIAogLyoqIHB3Yy11bmNvbXByZXNzLmMgKi8KIC8qIEV4cGFuZCBmcmFtZSB0byBpbWFnZSwgcG9zc2libHkgaW5jbHVkaW5nIGRlY29tcHJlc3Npb24uIFVzZXMgcmVhZF9mcmFtZSBhbmQgZmlsbF9pbWFnZSAqLwpAQCAtMjcwLDMgKzM1NSw0IEBACiAKIAogI2VuZGlmCisvKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNTI0NmEuYwppbmRleCBkZDgzMGUwLi41OWExODcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDZhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ2YS5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW90ZXh0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKICNpbmNsdWRlICJzYWE1MjQ2YS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE1MjQ5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwppbmRleCA1MzFlOTQ2Li4xOWE4ZDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTUyNDkuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvdGV4dC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKaW5kZXggNDFkOTUxZC4uNjc2Yjk5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTEwLmMKQEAgLTQzLDYgKzQzLDcgQEAKICNkZWZpbmUgSTJDX05BTUUocykgKHMpLT5uYW1lCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiBzdGF0aWMgaW50IGRlYnVnID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggZGNlZWJjMC4uYjU5YzExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTcyLDYgKzcyLDEwIEBACiAJaW50IHNhdDsKIAllbnVtIHY0bDJfY2hpcF9pZGVudCBpZGVudDsKIAl1MzIgYXVkY2xrX2ZyZXE7CisJdTMyIGNyeXN0YWxfZnJlcTsKKwl1OCB1Y2djOworCXU4IGNnY2RpdjsKKwl1OCBhcGxsOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTM3NSwxMCArMzc5LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNhYTcxMTVfaW5pdF9taXNjW10gPSB7Ci0JMHgzOCwgMHgwMywJCS8qIGF1ZGlvIHN0dWZmICovCi0JMHgzOSwgMHgxMCwKLQkweDNhLCAweDA4LAotCiAJMHg4MSwgMHgwMSwJCS8qIHJlZyAweDE1LDB4MTYgZGVmaW5lIGJsYW5raW5nIHdpbmRvdyAqLwogCTB4ODIsIDB4MDAsCiAJMHg4MywgMHgwMSwJCS8qIEkgcG9ydCBzZXR0aW5ncyAqLwpAQCAtNTg0LDYgKzU4NCw3IEBACiAJdTMyIGFjbmk7CiAJdTMyIGh6OwogCXU2NCBmOworCXU4IGFjYyA9IDA7IAkvKiByZWcgMHgzYSwgYXVkaW8gY2xvY2sgY29udHJvbCAqLwogCiAJdjRsX2RiZygxLCBkZWJ1ZywgY2xpZW50LCAic2V0IGF1ZGlvIGNsb2NrIGZyZXE6ICVkXG4iLCBmcmVxKTsKIApAQCAtNTkxLDE4ICs1OTIsMzQgQEAKIAlpZiAoZnJlcSA8IDMyMDAwIHx8IGZyZXEgPiA0ODAwMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBUaGUgc2FhNzExMyBoYXMgbm8gYXVkaW8gY2xvY2sgKi8KKwlpZiAoc3RhdGUtPmlkZW50ID09IFY0TDJfSURFTlRfU0FBNzExMykKKwkJcmV0dXJuIDA7CisKIAkvKiBoeiBpcyB0aGUgcmVmcmVzaCByYXRlIHRpbWVzIDEwMCAqLwogCWh6ID0gKHN0YXRlLT5zdGQgJiBWNEwyX1NURF81MjVfNjApID8gNTk5NCA6IDUwMDA7CiAJLyogYWNwZiA9ICgyNTYgKiBmcmVxKSAvIGZpZWxkX2ZyZXF1ZW5jeSA9PSAoMjU2ICogMTAwICogZnJlcSkgLyBoeiAqLwogCWFjcGYgPSAoMjU2MDAgKiBmcmVxKSAvIGh6OwogCS8qIGFjbmkgPSAoMjU2ICogZnJlcSAqIDJeMjMpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQogCQkgIChmcmVxICogMl4oOCsyMykpIC8gY3J5c3RhbF9mcmVxdWVuY3kgPQotCQkgIChmcmVxIDw8IDMxKSAvIDMyLjExIE1IeiAqLworCQkgIChmcmVxIDw8IDMxKSAvIGNyeXN0YWxfZnJlcXVlbmN5ICovCiAJZiA9IGZyZXE7CiAJZiA9IGYgPDwgMzE7Ci0JZG9fZGl2KGYsIDMyMTEwMDAwKTsKKwlkb19kaXYoZiwgc3RhdGUtPmNyeXN0YWxfZnJlcSk7CiAJYWNuaSA9IGY7CisJaWYgKHN0YXRlLT51Y2djKSB7CisJCWFjcGYgPSBhY3BmICogc3RhdGUtPmNnY2RpdiAvIDE2OworCQlhY25pID0gYWNuaSAqIHN0YXRlLT5jZ2NkaXYgLyAxNjsKKwkJYWNjID0gMHg4MDsKKwkJaWYgKHN0YXRlLT5jZ2NkaXYgPT0gMykKKwkJCWFjYyB8PSAweDQwOworCX0KKwlpZiAoc3RhdGUtPmFwbGwpCisJCWFjYyB8PSAweDA4OwogCisJc2FhNzExNV93cml0ZShjbGllbnQsIDB4MzgsIDB4MDMpOworCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDM5LCAweDEwKTsKKwlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzYSwgYWNjKTsKIAlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgzMCwgYWNwZiAmIDB4ZmYpOwogCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMxLCAoYWNwZiA+PiA4KSAmIDB4ZmYpOwogCXNhYTcxMTVfd3JpdGUoY2xpZW50LCAweDMyLCAoYWNwZiA+PiAxNikgJiAweDAzKTsKQEAgLTEwNzMsNDggKzEwOTAsNiBAQAogCiAvKiA9PT09PT09PT09PT0gU0FBNzExNSBBVURJTyBzZXR0aW5ncyAoZW5kKSA9PT09PT09PT09PT09ICovCiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgc2FhNzExNV9xY3RybFtdID0gewotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9CUklHSFRORVNTLAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkJyaWdodG5lc3MiLAotCQkubWluaW11bSAgICAgICA9IDAsCi0JCS5tYXhpbXVtICAgICAgID0gMjU1LAotCQkuc3RlcCAgICAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMTI4LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0NPTlRSQVNULAotCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JCS5uYW1lICAgICAgICAgID0gIkNvbnRyYXN0IiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDY0LAotCQkuZmxhZ3MgICAgICAgICA9IDAsCi0JfSwgewotCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NBVFVSQVRJT04sCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiU2F0dXJhdGlvbiIsCi0JCS5taW5pbXVtICAgICAgID0gMCwKLQkJLm1heGltdW0gICAgICAgPSAxMjcsCi0JCS5zdGVwICAgICAgICAgID0gMSwKLQkJLmRlZmF1bHRfdmFsdWUgPSA2NCwKLQkJLmZsYWdzICAgICAgICAgPSAwLAotCX0sIHsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9IVUUsCi0JCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkJLm5hbWUgICAgICAgICAgPSAiSHVlIiwKLQkJLm1pbmltdW0gICAgICAgPSAtMTI4LAotCQkubWF4aW11bSAgICAgICA9IDEyNywKLQkJLnN0ZXAgICAgICAgICAgPSAxLAotCQkuZGVmYXVsdF92YWx1ZSA9IDAsCi0JCS5mbGFncyAJICAgICAgID0gMCwKLQl9LAotfTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQogc3RhdGljIGludCBzYWE3MTE1X2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBzYWE3MTE1X3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwpAQCAtMTE1OCwxNCArMTEzMywxNiBAQAogCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAl7CiAJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNhYTcxMTVfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSBzYWE3MTE1X3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmc2FhNzExNV9xY3RybFtpXSwgc2l6ZW9mKCpxYykpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3dpdGNoIChxYy0+aWQpIHsKKwkJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6CisJCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCQljYXNlIFY0TDJfQ0lEX0hVRToKKwkJCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHFjKTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAl9CiAKIAljYXNlIFZJRElPQ19HX1NURDoKQEAgLTEyMjEsMzQgKzExOTgsNiBAQAogCQlicmVhazsKIAl9CiAKLQljYXNlIFZJRElPQ19HX0lOUFVUOgotCQkqKGludCAqKWFyZyA9IHN0YXRlLT5pbnB1dDsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJRElPQ19TX0lOUFVUOgotCQl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJkZWNvZGVyIHNldCBpbnB1dCAlZFxuIiwgKmlhcmcpOwotCQkvKiBpbnB1dHMgZnJvbSAwLTkgYXJlIGF2YWlsYWJsZSAqLwotCQlpZiAoKmlhcmcgPCAwIHx8ICppYXJnID4gOSkgewotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlpZiAoc3RhdGUtPmlucHV0ID09ICppYXJnKQotCQkJYnJlYWs7Ci0JCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIm5vdyBzZXR0aW5nICVzIGlucHV0XG4iLAotCQkJKmlhcmcgPj0gNiA/ICJTLVZpZGVvIiA6ICJDb21wb3NpdGUiKTsKLQkJc3RhdGUtPmlucHV0ID0gKmlhcmc7Ci0KLQkJLyogc2VsZWN0IG1vZGUgKi8KLQkJc2FhNzExNV93cml0ZShjbGllbnQsIDB4MDIsCi0JCQkgICAgICAoc2FhNzExNV9yZWFkKGNsaWVudCwgMHgwMikgJiAweGYwKSB8Ci0JCQkgICAgICAgc3RhdGUtPmlucHV0KTsKLQotCQkvKiBieXBhc3MgY2hyb21pbmFuY2UgdHJhcCBmb3IgbW9kZXMgNi4uOSAqLwotCQlzYWE3MTE1X3dyaXRlKGNsaWVudCwgMHgwOSwKLQkJCSAgICAgIChzYWE3MTE1X3JlYWQoY2xpZW50LCAweDA5KSAmIDB4N2YpIHwKLQkJCSAgICAgICAoc3RhdGUtPmlucHV0IDwgNiA/IDB4MCA6IDB4ODApKTsKLQkJYnJlYWs7Ci0KIAljYXNlIFZJRElPQ19TVFJFQU1PTjoKIAljYXNlIFZJRElPQ19TVFJFQU1PRkY6CiAJCXY0bF9kYmcoMSwgZGVidWcsIGNsaWVudCwgIiVzIG91dHB1dFxuIiwKQEAgLTEyNjAsNiArMTIwOSwyMSBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVROgorCXsKKwkJc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxICpmcmVxID0gYXJnOworCisJCWlmIChmcmVxLT5mcmVxICE9IFNBQTcxMTVfRlJFUV8zMl8xMV9NSFogJiYKKwkJICAgIGZyZXEtPmZyZXEgIT0gU0FBNzExNV9GUkVRXzI0XzU3Nl9NSFopCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUtPmNyeXN0YWxfZnJlcSA9IGZyZXEtPmZyZXE7CisJCXN0YXRlLT5jZ2NkaXYgPSAoZnJlcS0+ZmxhZ3MgJiBTQUE3MTE1X0ZSRVFfRkxfQ0dDRElWKSA/IDMgOiA0OworCQlzdGF0ZS0+dWNnYyA9IChmcmVxLT5mbGFncyAmIFNBQTcxMTVfRlJFUV9GTF9VQ0dDKSA/IDEgOiAwOworCQlzdGF0ZS0+YXBsbCA9IChmcmVxLT5mbGFncyAmIFNBQTcxMTVfRlJFUV9GTF9BUExMKSA/IDEgOiAwOworCQlzYWE3MTE1X3NldF9hdWRpb19jbG9ja19mcmVxKGNsaWVudCwgc3RhdGUtPmF1ZGNsa19mcmVxKTsKKwkJYnJlYWs7CisJfQorCiAJY2FzZSBWSURJT0NfSU5UX0RFQ09ERV9WQklfTElORToKIAkJc2FhNzExNV9kZWNvZGVfdmJpX2xpbmUoY2xpZW50LCBhcmcpOwogCQlicmVhazsKQEAgLTE0MDEsMTAgKzEzNjUsMTMgQEAKIAl2NGxfZGJnKDEsIGRlYnVnLCBjbGllbnQsICJ3cml0aW5nIGluaXQgdmFsdWVzXG4iKTsKIAogCS8qIGluaXQgdG8gNjBoei80OGtoeiAqLwotCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzKQorCWlmIChzdGF0ZS0+aWRlbnQgPT0gVjRMMl9JREVOVF9TQUE3MTEzKSB7CisJCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBTQUE3MTE1X0ZSRVFfMjRfNTc2X01IWjsKIAkJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTEzX2luaXRfYXV0b19pbnB1dCk7Ci0JZWxzZQorCX0gZWxzZSB7CisJCXN0YXRlLT5jcnlzdGFsX2ZyZXEgPSBTQUE3MTE1X0ZSRVFfMzJfMTFfTUhaOwogCQlzYWE3MTE1X3dyaXRlcmVncyhjbGllbnQsIHNhYTcxMTVfaW5pdF9hdXRvX2lucHV0KTsKKwl9CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2luaXRfbWlzYyk7CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X2Z1bGxyZXNfeCk7CiAJc2FhNzExNV93cml0ZXJlZ3MoY2xpZW50LCBzYWE3MTE1X2NmZ182MGh6X2Z1bGxyZXNfeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMjcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCmluZGV4IGMyNzFlMmUuLmFkNDAxYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEyNy5jCkBAIC0yNzAsNyArMjcwLDcgQEAKIAkibGV0dGVyYm94IDE2OjkgdG9wIiwKIAkiaW52YWxpZCIsCiAJImludmFsaWQiLAotCSIxNjo5IGZ1bGwgZm9ybWF0IGFuYW1vcnBoaWMiCisJIjE2OjkgZnVsbCBmb3JtYXQgYW5hbW9ycGhpYyIsCiAJIjQ6MyBmdWxsIGZvcm1hdCIsCiAJImludmFsaWQiLAogCSJpbnZhbGlkIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE2NzUyaHMuYwppbmRleCAwZTBiYTUwLi5kZTdiOWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNjc1MmhzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTY3NTJocy5jCkBAIC0zOSw2ICszOSwyMyBAQAogCVNBQTY3NTJIU19WRl9VTktOT1dOLAogfTsKIAorc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyB7CisJLyogdHJhbnNwb3J0IHN0cmVhbXMgKi8KKwlfX3UxNgkJCQl0c19waWRfcG10OworCV9fdTE2CQkJCXRzX3BpZF9hdWRpbzsKKwlfX3UxNgkJCQl0c19waWRfdmlkZW87CisJX191MTYJCQkJdHNfcGlkX3BjcjsKKworCS8qIGF1ZGlvICovCisJZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSBhdV9sMl9iaXRyYXRlOworCisJLyogdmlkZW8gKi8KKwllbnVtIHY0bDJfbXBlZ192aWRlb19hc3BlY3QJdmlfYXNwZWN0OworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZSB2aV9iaXRyYXRlX21vZGU7CisJX191MzIgCQkJCXZpX2JpdHJhdGU7CisJX191MzIgCQkJCXZpX2JpdHJhdGVfcGVhazsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9mb3JtYXQgdjRsMl9mb3JtYXRfdGFibGVbXSA9CiB7CiAJW1NBQTY3NTJIU19WRl9EMV0gPQpAQCAtNTUsMTggKzcyLDE5IEBACiAKIHN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgewogCXN0cnVjdCBpMmNfY2xpZW50ICAgICAgICAgICAgIGNsaWVudDsKLQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICBwYXJhbXM7CisJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAgb2xkX3BhcmFtczsKKwlzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zICBwYXJhbXM7CiAJZW51bSBzYWE2NzUyaHNfdmlkZW9mb3JtYXQgICAgdmlkZW9fZm9ybWF0OwogCXY0bDJfc3RkX2lkICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkOwogfTsKIAogZW51bSBzYWE2NzUyaHNfY29tbWFuZCB7CiAJU0FBNjc1MkhTX0NPTU1BTkRfUkVTRVQgPSAwLAotICAgIAlTQUE2NzUySFNfQ09NTUFORF9TVE9QID0gMSwKLSAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU1RBUlQgPSAyLAotICAgIAlTQUE2NzUySFNfQ09NTUFORF9QQVVTRSA9IDMsCi0gICAgCVNBQTY3NTJIU19DT01NQU5EX1JFQ09ORklHVVJFID0gNCwKLSAgICAJU0FBNjc1MkhTX0NPTU1BTkRfU0xFRVAgPSA1LAorCVNBQTY3NTJIU19DT01NQU5EX1NUT1AgPSAxLAorCVNBQTY3NTJIU19DT01NQU5EX1NUQVJUID0gMiwKKwlTQUE2NzUySFNfQ09NTUFORF9QQVVTRSA9IDMsCisJU0FBNjc1MkhTX0NPTU1BTkRfUkVDT05GSUdVUkUgPSA0LAorCVNBQTY3NTJIU19DT01NQU5EX1NMRUVQID0gNSwKIAlTQUE2NzUySFNfQ09NTUFORF9SRUNPTkZJR1VSRV9GT1JDRSA9IDYsCiAKIAlTQUE2NzUySFNfQ09NTUFORF9NQVgKQEAgLTEyOSw3ICsxNDcsMjIgQEAKIAkweDAwLCAweDAwLCAweDAwLCAweDAwIC8qIENSQzMyICovCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiBwYXJhbV9kZWZhdWx0cyA9CitzdGF0aWMgc3RydWN0IHNhYTY3NTJoc19tcGVnX3BhcmFtcyBwYXJhbV9kZWZhdWx0cyA9Cit7CisJLnRzX3BpZF9wbXQgICAgICA9IDE2LAorCS50c19waWRfdmlkZW8gICAgPSAyNjAsCisJLnRzX3BpZF9hdWRpbyAgICA9IDI1NiwKKwkudHNfcGlkX3BjciAgICAgID0gMjU5LAorCisJLnZpX2FzcGVjdCAgICAgICA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzLAorCS52aV9iaXRyYXRlICAgICAgPSA0MDAwLAorCS52aV9iaXRyYXRlX3BlYWsgPSA2MDAwLAorCS52aV9iaXRyYXRlX21vZGUgPSBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiwKKworCS5hdV9sMl9iaXRyYXRlICAgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLLAorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gb2xkX3BhcmFtX2RlZmF1bHRzID0KIHsKIAkuc3RfdHlwZSAgICAgICAgID0gVjRMMl9NUEVHX1RTXzIsCiAJLnN0X2JpdHJhdGUgICAgICA9IHsKQEAgLTIyOCw0NSArMjYxLDU3IEBACiAKIAogc3RhdGljIGludCBzYWE2NzUyaHNfc2V0X2JpdHJhdGUoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKLQkJCQkgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiogcGFyYW1zKQorCQkJCSBzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zKiBwYXJhbXMpCiB7CiAJdTggYnVmWzNdOworCWludCB0b3RfYml0cmF0ZTsKIAogCS8qIHNldCB0aGUgYml0cmF0ZSBtb2RlICovCiAJYnVmWzBdID0gMHg3MTsKLQlidWZbMV0gPSAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX1ZCUikgPyAwIDogMTsKKwlidWZbMV0gPSAocGFyYW1zLT52aV9iaXRyYXRlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpID8gMCA6IDE7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAyKTsKIAogCS8qIHNldCB0aGUgdmlkZW8gYml0cmF0ZSAqLwotCWlmIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSKSB7CisJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZV9tb2RlID09IFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSKSB7CiAJCS8qIHNldCB0aGUgdGFyZ2V0IGJpdHJhdGUgKi8KIAkJYnVmWzBdID0gMHg4MDsKLQkgICAgCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS50YXJnZXQgPj4gODsKLQkJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCAmIDB4ZmY7CisJCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZSA+PiA4OworCQlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGUgJiAweGZmOwogCQlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDMpOwogCiAJCS8qIHNldCB0aGUgbWF4IGJpdHJhdGUgKi8KIAkJYnVmWzBdID0gMHg4MTsKLQkgICAgCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXggPj4gODsKLQkJYnVmWzJdID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heCAmIDB4ZmY7CisJCWJ1ZlsxXSA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrID4+IDg7CisJCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrICYgMHhmZjsKIAkJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgYnVmLCAzKTsKKwkJdG90X2JpdHJhdGUgPSBwYXJhbXMtPnZpX2JpdHJhdGVfcGVhazsKIAl9IGVsc2UgewogCQkvKiBzZXQgdGhlIHRhcmdldCBiaXRyYXRlIChubyBtYXggYml0cmF0ZSBmb3IgQ0JSKSAqLwogCQlidWZbMF0gPSAweDgxOwotCSAgICAJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldCA+PiA4OwotCQlidWZbMl0gPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0ICYgMHhmZjsKKwkJYnVmWzFdID0gcGFyYW1zLT52aV9iaXRyYXRlID4+IDg7CisJCWJ1ZlsyXSA9IHBhcmFtcy0+dmlfYml0cmF0ZSAmIDB4ZmY7CiAJCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CisJCXRvdF9iaXRyYXRlID0gcGFyYW1zLT52aV9iaXRyYXRlOwogCX0KIAogCS8qIHNldCB0aGUgYXVkaW8gYml0cmF0ZSAqLwogCWJ1ZlswXSA9IDB4OTQ7Ci0JYnVmWzFdID0gKDI1NiA9PSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0KSA/IDAgOiAxOworCWJ1ZlsxXSA9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAwIDogMTsKIAlpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBidWYsIDIpOworCXRvdF9iaXRyYXRlICs9IChWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID09IHBhcmFtcy0+YXVfbDJfYml0cmF0ZSkgPyAyNTYgOiAzODQ7CisKKwkvKiBOb3RlOiB0aGUgdG90YWwgbWF4IGJpdHJhdGUgaXMgZGV0ZXJtaW5lZCBieSBhZGRpbmcgdGhlIHZpZGVvIGFuZCBhdWRpbworCSAgIGJpdHJhdGVzIHRvZ2V0aGVyIGFuZCBhbHNvIGFkZGluZyBhbiBleHRyYSA3NjhrYml0L3MgdG8gc3RheSBvbiB0aGUKKwkgICBzYWZlIHNpZGUuIElmIG1vcmUgY29udHJvbCBzaG91bGQgYmUgcmVxdWlyZWQsIHRoZW4gYW4gZXh0cmEgTVBFRyBjb250cm9sCisJICAgc2hvdWxkIGJlIGFkZGVkLiAqLworCXRvdF9iaXRyYXRlICs9IDc2ODsKKwlpZiAodG90X2JpdHJhdGUgPiBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWCkKKwkJdG90X2JpdHJhdGUgPSBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWDsKIAogCS8qIHNldCB0aGUgdG90YWwgYml0cmF0ZSAqLwogCWJ1ZlswXSA9IDB4YjE7Ci0JYnVmWzFdID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldCA+PiA4OwotCWJ1ZlsyXSA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQgJiAweGZmOworCWJ1ZlsxXSA9IHRvdF9iaXRyYXRlID4+IDg7CisJYnVmWzJdID0gdG90X2JpdHJhdGUgJiAweGZmOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZiwgMyk7CiAKIAlyZXR1cm4gMDsKQEAgLTMxOCw1MCArMzYzLDE4OCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHNhYTY3NTJoc19zZXRfcGFyYW1zKHN0cnVjdCBpMmNfY2xpZW50KiBjbGllbnQsCitzdGF0aWMgdm9pZCBzYWE2NzUyaHNfb2xkX3NldF9wYXJhbXMoc3RydWN0IGkyY19jbGllbnQqIGNsaWVudCwKIAkJCQkgc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiogcGFyYW1zKQogewogCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCS8qIGNoZWNrIFBJRHMgKi8KLQlpZiAocGFyYW1zLT50c19waWRfcG10IDw9IE1QRUdfUElEX01BWCkKKwlpZiAocGFyYW1zLT50c19waWRfcG10IDw9IE1QRUdfUElEX01BWCkgeworCQloLT5vbGRfcGFyYW1zLnRzX3BpZF9wbXQgPSBwYXJhbXMtPnRzX3BpZF9wbXQ7CiAJCWgtPnBhcmFtcy50c19waWRfcG10ID0gcGFyYW1zLT50c19waWRfcG10OwotCWlmIChwYXJhbXMtPnRzX3BpZF9wY3IgPD0gTVBFR19QSURfTUFYKQorCX0KKwlpZiAocGFyYW1zLT50c19waWRfcGNyIDw9IE1QRUdfUElEX01BWCkgeworCQloLT5vbGRfcGFyYW1zLnRzX3BpZF9wY3IgPSBwYXJhbXMtPnRzX3BpZF9wY3I7CiAJCWgtPnBhcmFtcy50c19waWRfcGNyID0gcGFyYW1zLT50c19waWRfcGNyOwotCWlmIChwYXJhbXMtPnRzX3BpZF92aWRlbyA8PSBNUEVHX1BJRF9NQVgpCisJfQorCWlmIChwYXJhbXMtPnRzX3BpZF92aWRlbyA8PSBNUEVHX1BJRF9NQVgpIHsKKwkJaC0+b2xkX3BhcmFtcy50c19waWRfdmlkZW8gPSBwYXJhbXMtPnRzX3BpZF92aWRlbzsKIAkJaC0+cGFyYW1zLnRzX3BpZF92aWRlbyA9IHBhcmFtcy0+dHNfcGlkX3ZpZGVvOwotCWlmIChwYXJhbXMtPnRzX3BpZF9hdWRpbyA8PSBNUEVHX1BJRF9NQVgpCisJfQorCWlmIChwYXJhbXMtPnRzX3BpZF9hdWRpbyA8PSBNUEVHX1BJRF9NQVgpIHsKKwkJaC0+b2xkX3BhcmFtcy50c19waWRfYXVkaW8gPSBwYXJhbXMtPnRzX3BpZF9hdWRpbzsKIAkJaC0+cGFyYW1zLnRzX3BpZF9hdWRpbyA9IHBhcmFtcy0+dHNfcGlkX2F1ZGlvOworCX0KIAogCS8qIGNoZWNrIGJpdHJhdGUgcGFyYW1ldGVycyAqLwogCWlmICgocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX0NCUikgfHwKLQkgICAgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS5tb2RlID0gcGFyYW1zLT52aV9iaXRyYXRlLm1vZGU7CisJICAgIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSA9PSBWNEwyX0JJVFJBVEVfVkJSKSkgeworCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUubW9kZSA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlOworCQloLT5wYXJhbXMudmlfYml0cmF0ZV9tb2RlID0gKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlID09IFY0TDJfQklUUkFURV9WQlIpID8KKwkJICAgICAgIFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfVkJSIDogVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlI7CisJfQogCWlmIChwYXJhbXMtPnZpX2JpdHJhdGUubW9kZSAhPSBWNEwyX0JJVFJBVEVfTk9ORSkKLQkJaC0+cGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5zdF9iaXRyYXRlLnRhcmdldDsKKwkJaC0+b2xkX3BhcmFtcy5zdF9iaXRyYXRlLnRhcmdldCA9IHBhcmFtcy0+c3RfYml0cmF0ZS50YXJnZXQ7CiAJaWYgKHBhcmFtcy0+dmlfYml0cmF0ZS5tb2RlICE9IFY0TDJfQklUUkFURV9OT05FKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPnZpX2JpdHJhdGUudGFyZ2V0OworCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldDsKIAlpZiAocGFyYW1zLT52aV9iaXRyYXRlLm1vZGUgPT0gVjRMMl9CSVRSQVRFX1ZCUikKLQkJaC0+cGFyYW1zLnZpX2JpdHJhdGUubWF4ID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heDsKKwkJaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLm1heCA9IHBhcmFtcy0+dmlfYml0cmF0ZS5tYXg7CiAJaWYgKHBhcmFtcy0+YXVfYml0cmF0ZS5tb2RlICE9IFY0TDJfQklUUkFURV9OT05FKQotCQloLT5wYXJhbXMuYXVfYml0cmF0ZS50YXJnZXQgPSBwYXJhbXMtPmF1X2JpdHJhdGUudGFyZ2V0OworCQloLT5vbGRfcGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gcGFyYW1zLT5hdV9iaXRyYXRlLnRhcmdldDsKIAogCS8qIGFzcGVjdCByYXRpbyAqLwogCWlmIChwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzRfMyB8fAotCSAgICBwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzE2XzkpCi0JCWgtPnBhcmFtcy52aV9hc3BlY3RfcmF0aW8gPSBwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbzsKKwkgICAgcGFyYW1zLT52aV9hc3BlY3RfcmF0aW8gPT0gVjRMMl9NUEVHX0FTUEVDVF8xNl85KSB7CisJCWgtPm9sZF9wYXJhbXMudmlfYXNwZWN0X3JhdGlvID0gcGFyYW1zLT52aV9hc3BlY3RfcmF0aW87CisJCWlmIChwYXJhbXMtPnZpX2FzcGVjdF9yYXRpbyA9PSBWNEwyX01QRUdfQVNQRUNUXzRfMykKKwkJCWgtPnBhcmFtcy52aV9hc3BlY3QgPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzR4MzsKKwkJZWxzZQorCQkJaC0+cGFyYW1zLnZpX2FzcGVjdCA9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OTsKKwl9CiAKIAkvKiByYW5nZSBjaGVja3MgKi8KLQlpZiAoaC0+cGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID4gTVBFR19UT1RBTF9UQVJHRVRfQklUUkFURV9NQVgpCi0JCWgtPnBhcmFtcy5zdF9iaXRyYXRlLnRhcmdldCA9IE1QRUdfVE9UQUxfVEFSR0VUX0JJVFJBVEVfTUFYOwotCWlmIChoLT5wYXJhbXMudmlfYml0cmF0ZS50YXJnZXQgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCkKLQkJaC0+cGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVg7Ci0JaWYgKGgtPnBhcmFtcy52aV9iaXRyYXRlLm1heCA+IE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYKQotCQloLT5wYXJhbXMudmlfYml0cmF0ZS5tYXggPSBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWDsKLQlpZiAoaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0IDw9IDI1NikKLQkJaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gMjU2OworCWlmIChoLT5vbGRfcGFyYW1zLnN0X2JpdHJhdGUudGFyZ2V0ID4gTVBFR19UT1RBTF9UQVJHRVRfQklUUkFURV9NQVgpCisJCWgtPm9sZF9wYXJhbXMuc3RfYml0cmF0ZS50YXJnZXQgPSBNUEVHX1RPVEFMX1RBUkdFVF9CSVRSQVRFX01BWDsKKwlpZiAoaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLnRhcmdldCA+IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYKQorCQloLT5vbGRfcGFyYW1zLnZpX2JpdHJhdGUudGFyZ2V0ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVg7CisJaWYgKGgtPm9sZF9wYXJhbXMudmlfYml0cmF0ZS5tYXggPiBNUEVHX1ZJREVPX01BWF9CSVRSQVRFX01BWCkKKwkJaC0+b2xkX3BhcmFtcy52aV9iaXRyYXRlLm1heCA9IE1QRUdfVklERU9fTUFYX0JJVFJBVEVfTUFYOworCWgtPnBhcmFtcy52aV9iaXRyYXRlID0gcGFyYW1zLT52aV9iaXRyYXRlLnRhcmdldDsKKwloLT5wYXJhbXMudmlfYml0cmF0ZV9wZWFrID0gcGFyYW1zLT52aV9iaXRyYXRlLm1heDsKKwlpZiAoaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA8PSAyNTYpIHsKKwkJaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDI1NjsKKwkJaC0+cGFyYW1zLmF1X2wyX2JpdHJhdGUgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLOworCX0KKwllbHNlIHsKKwkJaC0+b2xkX3BhcmFtcy5hdV9iaXRyYXRlLnRhcmdldCA9IDM4NDsKKwkJaC0+cGFyYW1zLmF1X2wyX2JpdHJhdGUgPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLOworCX0KK30KKworc3RhdGljIGludCBoYW5kbGVfY3RybChzdHJ1Y3Qgc2FhNjc1MmhzX21wZWdfcGFyYW1zICpwYXJhbXMsCisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBpbnQgY21kKQoreworCWludCBvbGQgPSAwLCBuZXc7CisJaW50IHNldCA9IGNtZCA9PSBWSURJT0NfU19FWFRfQ1RSTFM7CisKKwluZXcgPSBjdHJsLT52YWx1ZTsKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJCW9sZCA9IFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9UUzsKKwkJCWlmIChzZXQgJiYgbmV3ICE9IG9sZCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCW5ldyA9IG9sZDsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQ6CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF9wbXQ7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfcG10ID0gbmV3OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX0FVRElPOgorCQkJb2xkID0gcGFyYW1zLT50c19waWRfYXVkaW87CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfYXVkaW8gPSBuZXc7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF92aWRlbzsKKwkJCWlmIChzZXQgJiYgbmV3ID4gTVBFR19QSURfTUFYKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQluZXcgPSBNUEVHX1BJRF9NQVg7CisJCQlwYXJhbXMtPnRzX3BpZF92aWRlbyA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QQ1I6CisJCQlvbGQgPSBwYXJhbXMtPnRzX3BpZF9wY3I7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfUElEX01BWCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1BJRF9NQVgpCisJCQkJbmV3ID0gTVBFR19QSURfTUFYOworCQkJcGFyYW1zLT50c19waWRfcGNyID0gbmV3OworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJCW9sZCA9IFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yOworCQkJaWYgKHNldCAmJiBuZXcgIT0gb2xkKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJbmV3ID0gb2xkOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQkJb2xkID0gcGFyYW1zLT5hdV9sMl9iaXRyYXRlOworCQkJaWYgKHNldCAmJiBuZXcgIT0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjU2SyAmJgorCQkJCSAgIG5ldyAhPSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyA8PSBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLKQorCQkJCW5ldyA9IFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzI1Nks7CisJCQllbHNlCisJCQkJbmV3ID0gVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SzsKKwkJCXBhcmFtcy0+YXVfbDJfYml0cmF0ZSA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKKwkJCW9sZCA9IFY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwOworCQkJaWYgKHNldCAmJiBuZXcgIT0gb2xkKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJbmV3ID0gb2xkOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzoKKwkJCW9sZCA9IFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzI7CisJCQlpZiAoc2V0ICYmIG5ldyAhPSBvbGQpCisJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQluZXcgPSBvbGQ7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYXNwZWN0OworCQkJaWYgKHNldCAmJiBuZXcgIT0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5ICYmCisJCQkJICAgbmV3ICE9IFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJaWYgKG5ldyAhPSBWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkpCisJCQkJbmV3ID0gVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDM7CisJCQlwYXJhbXMtPnZpX2FzcGVjdCA9IG5ldzsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURToKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYml0cmF0ZSAqIDEwMDA7CisJCQluZXcgPSAxMDAwICogKG5ldyAvIDEwMDApOworCQkJaWYgKHNldCAmJiBuZXcgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAqIDEwMDApCisJCQkJcmV0dXJuIC1FUkFOR0U7CisJCQlpZiAobmV3ID4gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVggKiAxMDAwKQorCQkJCW5ldyA9IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYICogMTAwMDsKKwkJCXBhcmFtcy0+dmlfYml0cmF0ZSA9IG5ldyAvIDEwMDA7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfUEVBSzoKKwkJCW9sZCA9IHBhcmFtcy0+dmlfYml0cmF0ZV9wZWFrICogMTAwMDsKKwkJCW5ldyA9IDEwMDAgKiAobmV3IC8gMTAwMCk7CisJCQlpZiAoc2V0ICYmIG5ldyA+IE1QRUdfVklERU9fVEFSR0VUX0JJVFJBVEVfTUFYICogMTAwMCkKKwkJCQlyZXR1cm4gLUVSQU5HRTsKKwkJCWlmIChuZXcgPiBNUEVHX1ZJREVPX1RBUkdFVF9CSVRSQVRFX01BWCAqIDEwMDApCisJCQkJbmV3ID0gTVBFR19WSURFT19UQVJHRVRfQklUUkFURV9NQVggKiAxMDAwOworCQkJcGFyYW1zLT52aV9iaXRyYXRlX3BlYWsgPSBuZXcgLyAxMDAwOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCQlvbGQgPSBwYXJhbXMtPnZpX2JpdHJhdGVfbW9kZTsKKwkJCXBhcmFtcy0+dmlfYml0cmF0ZV9tb2RlID0gbmV3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMpCisJCWN0cmwtPnZhbHVlID0gb2xkOwogCWVsc2UKLQkJaC0+cGFyYW1zLmF1X2JpdHJhdGUudGFyZ2V0ID0gMzg0OworCQljdHJsLT52YWx1ZSA9IG5ldzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzYWE2NzUyaHNfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCogY2xpZW50KQpAQCAtMzk1LDIyICs1NzgsMjIgQEAKIAlidWZbMl0gPSAweDBEOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDMpOwogCi0gICAgCS8qIFNldCBtaW5pbXVtIFEtc2NhbGUgezR9ICovCisJLyogU2V0IG1pbmltdW0gUS1zY2FsZSB7NH0gKi8KIAlidWZbMF0gPSAweDgyOwogCWJ1ZlsxXSA9IDB4MDQ7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CiAKLSAgICAJLyogU2V0IG1heGltdW0gUS1zY2FsZSB7MTJ9ICovCisJLyogU2V0IG1heGltdW0gUS1zY2FsZSB7MTJ9ICovCiAJYnVmWzBdID0gMHg4MzsKIAlidWZbMV0gPSAweDBDOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOwogCi0gICAgCS8qIFNldCBPdXRwdXQgUHJvdG9jb2wgKi8KKwkvKiBTZXQgT3V0cHV0IFByb3RvY29sICovCiAJYnVmWzBdID0gMHhEMDsKIAlidWZbMV0gPSAweDgxOwogCWkyY19tYXN0ZXJfc2VuZChjbGllbnQsYnVmLDIpOwogCi0gICAgCS8qIFNldCB2aWRlbyBvdXRwdXQgc3RyZWFtIGZvcm1hdCB7VFN9ICovCisJLyogU2V0IHZpZGVvIG91dHB1dCBzdHJlYW0gZm9ybWF0IHtUU30gKi8KIAlidWZbMF0gPSAweEIwOwogCWJ1ZlsxXSA9IDB4MDU7CiAJaTJjX21hc3Rlcl9zZW5kKGNsaWVudCxidWYsMik7CkBAIC00NDEsNyArNjI0LDcgQEAKIAlsb2NhbFBNVFtzaXplb2YoUE1UKSAtIDJdID0gKGNyYyA+PiA4KSAmIDB4RkY7CiAJbG9jYWxQTVRbc2l6ZW9mKFBNVCkgLSAxXSA9IGNyYyAmIDB4RkY7CiAKLSAgICAJLyogU2V0IEF1ZGlvIFBJRCAqLworCS8qIFNldCBBdWRpbyBQSUQgKi8KIAlidWZbMF0gPSAweEMxOwogCWJ1ZlsxXSA9IChoLT5wYXJhbXMudHNfcGlkX2F1ZGlvID4+IDgpICYgMHhGRjsKIAlidWZbMl0gPSBoLT5wYXJhbXMudHNfcGlkX2F1ZGlvICYgMHhGRjsKQEAgLTQ4OSwxMSArNjcyLDExIEBACiAJYnVmWzNdID0gMHg4MjsKIAlidWZbNF0gPSAweEIwOwogCWJ1Zls1XSA9IGJ1ZjJbMF07Ci0Jc3dpdGNoKGgtPnBhcmFtcy52aV9hc3BlY3RfcmF0aW8pIHsKLQljYXNlIFY0TDJfTVBFR19BU1BFQ1RfMTZfOToKKwlzd2l0Y2goaC0+cGFyYW1zLnZpX2FzcGVjdCkgeworCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF8xNng5OgogCQlidWZbNl0gPSBidWYyWzFdIHwgMHg0MDsKIAkJYnJlYWs7Ci0JY2FzZSBWNEwyX01QRUdfQVNQRUNUXzRfMzoKKwljYXNlIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzOgogCWRlZmF1bHQ6CiAJCWJ1Zls2XSA9IGJ1ZjJbMV0gJiAweEJGOwogCQlicmVhazsKQEAgLTUxNSw2ICs2OTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAloLT5jbGllbnQgPSBjbGllbnRfdGVtcGxhdGU7CiAJaC0+cGFyYW1zID0gcGFyYW1fZGVmYXVsdHM7CisJaC0+b2xkX3BhcmFtcyA9IG9sZF9wYXJhbV9kZWZhdWx0czsKIAloLT5jbGllbnQuYWRhcHRlciA9IGFkYXA7CiAJaC0+Y2xpZW50LmFkZHIgPSBhZGRyOwogCkBAIC01NTAsMjAgKzczNCw0NSBAQAogc2FhNjc1MmhzX2NvbW1hbmQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBzYWE2NzUyaHNfc3RhdGUgKmggPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwYXJhbXMgPSBhcmc7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyA9IGFyZzsKKwlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpvbGRfcGFyYW1zID0gYXJnOworCXN0cnVjdCBzYWE2NzUyaHNfbXBlZ19wYXJhbXMgcGFyYW1zOwogCWludCBlcnIgPSAwOworCWludCBpOwogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19TX01QRUdDT01QOgotCQlpZiAoTlVMTCA9PSBwYXJhbXMpIHsKKwkJaWYgKE5VTEwgPT0gb2xkX3BhcmFtcykgewogCQkJLyogYXBwbHkgc2V0dGluZ3MgYW5kIHN0YXJ0IGVuY29kZXIgKi8KIAkJCXNhYTY3NTJoc19pbml0KGNsaWVudCk7CiAJCQlicmVhazsKIAkJfQotCQlzYWE2NzUyaHNfc2V0X3BhcmFtcyhjbGllbnQsIHBhcmFtcyk7CisJCXNhYTY3NTJoc19vbGRfc2V0X3BhcmFtcyhjbGllbnQsIG9sZF9wYXJhbXMpOwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFZJRElPQ19HX01QRUdDT01QOgotCQkqcGFyYW1zID0gaC0+cGFyYW1zOworCQkqb2xkX3BhcmFtcyA9IGgtPm9sZF9wYXJhbXM7CisJCWJyZWFrOworCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCQlpZiAoY3RybHMtPmN0cmxfY2xhc3MgIT0gVjRMMl9DVFJMX0NMQVNTX01QRUcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGN0cmxzLT5jb3VudCA9PSAwKSB7CisJCQkvKiBhcHBseSBzZXR0aW5ncyBhbmQgc3RhcnQgZW5jb2RlciAqLworCQkJc2FhNjc1MmhzX2luaXQoY2xpZW50KTsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJY2FzZSBWSURJT0NfR19FWFRfQ1RSTFM6CisJCWlmIChjdHJscy0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwYXJhbXMgPSBoLT5wYXJhbXM7CisJCWZvciAoaSA9IDA7IGkgPCBjdHJscy0+Y291bnQ7IGkrKykgeworCQkJaWYgKChlcnIgPSBoYW5kbGVfY3RybCgmcGFyYW1zLCBjdHJscy0+Y29udHJvbHMgKyBpLCBjbWQpKSkgeworCQkJCWN0cmxzLT5lcnJvcl9pZHggPSBpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCX0KKwkJaC0+cGFyYW1zID0gcGFyYW1zOwogCQlicmVhazsKIAljYXNlIFZJRElPQ19HX0ZNVDoKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1hbHNhLmMKaW5kZXggYmIzZTBiYS4uZDc3ZTZhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWFsc2EuYwpAQCAtODE4LDcgKzgxOCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCSAgICAJLyogb3V0cHV0IHhiYXIgYWx3YXlzIG1haW4gY2hhbm5lbCAqLworCQkvKiBvdXRwdXQgeGJhciBhbHdheXMgbWFpbiBjaGFubmVsICovCiAJCXNhYV9kc3Bfd3JpdGVsKGRldiwgU0FBNzEzM19ESUdJVEFMX09VVFBVVF9TRUwxLCAweGJiYmIxMCk7CiAKIAkJaWYgKGxlZnQgfHwgcmlnaHQpIHsgLy8gV2UndmUgZ290IGRhdGEsIHR1cm4gdGhlIGlucHV0IG9uCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCA4NmVhZTM1Li45Mjc0MTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTIxNjAsNyArMjE2MCw3IEBACiAJCS5yYWRpbyA9IHsKIAkJCSAgLm5hbWUgPSBuYW1lX3JhZGlvLAogCQkJICAuYW11eCA9IExJTkUyLAotICAgIAkJfSwKKwkJfSwKIAl9LAogCVtTQUE3MTM0X0JPQVJEX0dPVFZJRVdfNzEzNV0gPSB7CiAJCS8qIE1pa2UgQmFpa292IDxtaWtlQGJhaWtvdi5jb20+ICovCkBAIC0yODQyLDYgKzI4NDIsNTUgQEAKIAkJCS5ncGlvID0gMHgwMDAwMDAsCS8qIEdQSU8yMT1Mb3cgZm9yIEZNIHJhZGlvIGFudGVubmEgKi8KIAkJfSwKIAl9LAorCVtTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMF9OVFNDXSA9IHsKKwkJLyogIlphYyBCb3dsaW5nIiA8emFjQHphY2Jvd2xpbmcuY29tPiAqLworCQkubmFtZSAgICAgICAgICAgPSAiTGlmZVZpZXcgRmx5VklERU8zMDAwIChOVFNDKSIsCisJCS5hdWRpb19jbG9jayAgICA9IDB4MDAyMDAwMDAsCisJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1BISUxJUFNfTlRTQywKKwkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCisJCS50dW5lcl9hZGRyICAgICA9IEFERFJfVU5TRVQsCisJCS5yYWRpb19hZGRyICAgICA9IEFERFJfVU5TRVQsCisKKwkJLmdwaW9tYXNrICAgICAgID0gMHhlMDAwLAorCQkuaW5wdXRzICAgICAgICAgPSB7eworCQkJLm5hbWUgPSBuYW1lX3R2LAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBUViwKKwkJCS5ncGlvID0gMHg4MDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV90dl9tb25vLAorCQkJLnZtdXggPSAxLAorCQkJLmFtdXggPSBMSU5FMiwKKwkJCS5ncGlvID0gMHgwMDAwLAorCQkJLnR2ICAgPSAxLAorCQl9LHsKKwkJCS5uYW1lID0gbmFtZV9jb21wMSwKKwkJCS52bXV4ID0gMCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfSx7CisJCQkubmFtZSA9IG5hbWVfY29tcDIsCisJCQkudm11eCA9IDMsCisJCQkuYW11eCA9IExJTkUyLAorCQkJLmdwaW8gPSAweDQwMDAsCisJCX0seworCQkJLm5hbWUgPSBuYW1lX3N2aWRlbywKKwkJCS52bXV4ID0gOCwKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4NDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS5uYW1lID0gbmFtZV9yYWRpbywKKwkJCS5hbXV4ID0gTElORTIsCisJCQkuZ3BpbyA9IDB4MjAwMCwKKwkJfSwKKwkJCS5tdXRlID0geworCQkJLm5hbWUgPSBuYW1lX211dGUsCisJCQkuYW11eCA9IFRWLAorCQkJLmdwaW8gPSAweDgwMDAsCisJCX0sCisJfSwKIH07CiAKIGNvbnN0IHVuc2lnbmVkIGludCBzYWE3MTM0X2Jjb3VudCA9IEFSUkFZX1NJWkUoc2FhNzEzNF9ib2FyZHMpOwpAQCAtMjkwMSw2ICsyOTUwLDEyIEBACiAJfSx7CiAJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCiAJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKKwkJLnN1YnZlbmRvciAgICA9IDB4NTE2OSwKKwkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKKwkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwX05UU0MsCisJfSx7CisJCS52ZW5kb3IgICAgICAgPSBQQ0lfVkVORE9SX0lEX1BISUxJUFMsCisJCS5kZXZpY2UgICAgICAgPSBQQ0lfREVWSUNFX0lEX1BISUxJUFNfU0FBNzEzNCwKIAkJLnN1YnZlbmRvciAgICA9IDB4NTE2OCwKIAkJLnN1YmRldmljZSAgICA9IDB4MDEzOCwKIAkJLmRyaXZlcl9kYXRhICA9IFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwLApAQCAtMzQ1OSw2ICszNTE0LDcgQEAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZVklERU8yMDAwOgogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlWSURFTzMwMDA6CisJY2FzZSBTQUE3MTM0X0JPQVJEX0ZMWVZJREVPMzAwMF9OVFNDOgogCQlkZXYtPmhhc19yZW1vdGUgPSBTQUE3MTM0X1JFTU9URV9HUElPOwogCQlib2FyZF9mbHl2aWRlbyhkZXYpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKaW5kZXggMjIyYTM2Yy4uMjc5ODI4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMKQEAgLTEzMiw5ICsxMzIsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCi0JCQkJICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMqIHBhcmFtcywKLQkJCQkgIHU4KiBwbGxidWYpCitzdGF0aWMgaW50IG10MzUyX3Bpbm5hY2xlX3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCogZmUsCisJCQkJCSAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyogcGFyYW1zKQogewogCXU4IG9mZltdID0geyAweDAwLCAweGYxfTsKIAl1OCBvbltdICA9IHsgMHgwMCwgMHg3MX07CkBAIC0xNDcsMzAgKzE0NiwzMSBAQAogCWYudHVuZXIgICAgID0gMDsKIAlmLnR5cGUgICAgICA9IFY0TDJfVFVORVJfRElHSVRBTF9UVjsKIAlmLmZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5IC8gMTAwMCAqIDE2IC8gMTAwMDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAJc2FhNzEzNF9pMmNfY2FsbF9jbGllbnRzKGRldixWSURJT0NfU19GUkVRVUVOQ1ksJmYpOwogCW1zZy5idWYgPSBvbjsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAlwaW5uYWNsZV9hbnRlbm5hX3B3cihkZXYsIGFudGVubmFfcHdyKTsKIAogCS8qIG10MzUyIHNldHVwICovCi0JbXQzNTJfcGlubmFjbGVfaW5pdChmZSk7Ci0JcGxsYnVmWzBdID0gMHhjMjsKLQlwbGxidWZbMV0gPSAweDAwOwotCXBsbGJ1ZlsyXSA9IDB4MDA7Ci0JcGxsYnVmWzNdID0gMHg4MDsKLQlwbGxidWZbNF0gPSAweDAwOwotCXJldHVybiAwOworCXJldHVybiBtdDM1Ml9waW5uYWNsZV9pbml0KGZlKTsKIH0KIAotc3RhdGljIGludCBtdDM1Ml9hdmVyNzc3X3BsbF9zZXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zLCB1OCogcGxsYnVmKQorc3RhdGljIGludCBtdDM1Ml9hdmVyNzc3X3R1bmVyX2NhbGNfcmVncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMsIHU4KiBwbGxidWYsIGludCBidWZfbGVuKQogewotCXBsbGJ1ZlswXSA9IDB4YzI7CisJaWYgKGJ1Zl9sZW4gPCA1KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBsbGJ1ZlswXSA9IDB4NjE7CiAJZHZiX3BsbF9jb25maWd1cmUoJmR2Yl9wbGxfcGhpbGlwc190ZDEzMTYsIHBsbGJ1ZisxLAogCQkJICBwYXJhbXMtPmZyZXF1ZW5jeSwKIAkJCSAgcGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gNTsKIH0KIAogc3RhdGljIHN0cnVjdCBtdDM1Ml9jb25maWcgcGlubmFjbGVfMzAwaSA9IHsKQEAgLTE3OSwxMyArMTc5LDExIEBACiAJLmlmMiAgICAgICAgICAgPSAzNjE1MCwKIAkubm9fdHVuZXIgICAgICA9IDEsCiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9waW5uYWNsZV9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gbXQzNTJfcGlubmFjbGVfcGxsX3NldCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbXQzNTJfY29uZmlnIGF2ZXJtZWRpYV83NzcgPSB7CiAJLmRlbW9kX2FkZHJlc3MgPSAweGYsCiAJLmRlbW9kX2luaXQgICAgPSBtdDM1Ml9hdmVyNzc3X2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSBtdDM1Ml9hdmVyNzc3X3BsbF9zZXQsCiB9OwogI2VuZGlmCiAKQEAgLTI2OCw2ICsyNjYsOCBAQAogCXR1bmVyX2J1ZlsyXSA9IDB4Y2E7CiAJdHVuZXJfYnVmWzNdID0gKGNwIDw8IDUpIHwgKGZpbHRlciA8PCAzKSB8IGJhbmQ7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCW1zbGVlcCgxKTsKQEAgLTI4MSw2ICsyODEsOCBAQAogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdHUxMjE2X2luaXQsLmxlbiA9IHNpemVvZih0dTEyMTZfaW5pdCkgfTsKIAogCS8qIHNldHVwIFBMTCBjb25maWd1cmF0aW9uICovCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAltc2xlZXAoMSk7CkBAIC0yOTAsMTIgKzI5MiwxMiBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfNjBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlyZXR1cm4gcGhpbGlwc190ZGE2NjUxX3BsbF9pbml0KDB4NjAsIGZlKTsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3R1MTIxNl9wbGxfNjBfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJcmV0dXJuIHBoaWxpcHNfdGRhNjY1MV9wbGxfc2V0KDB4NjAsIGZlLCBwYXJhbXMpOwogfQpAQCAtMzE1LDIwICszMTcsMTcgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfREVGQVVMVCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMzYxNywKLQkucGxsX2luaXQgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF82MF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190dTEyMTZfcGxsXzYwX3NldCwKLQkucGxsX3NsZWVwICAgICA9IE5VTEwsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBwaGlsaXBzX3R1MTIxNl9yZXF1ZXN0X2Zpcm13YXJlLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsXzYxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJcmV0dXJuIHBoaWxpcHNfdGRhNjY1MV9wbGxfaW5pdCgweDYxLCBmZSk7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190dTEyMTZfcGxsXzYxX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKIH0KQEAgLTM0MSwyMSArMzQwLDIwIEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzRNLAogCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX0RFRkFVTFQsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTcsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX3R1MTIxNl9wbGxfNjFfaW5pdCwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdHUxMjE2X3BsbF82MV9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBOVUxMLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gcGhpbGlwc190dTEyMTZfcmVxdWVzdF9maXJtd2FyZSwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHBoaWxpcHNfZXVyb3BhX3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAlzdGF0aWMgdTggbXNnW10gPSB7IDB4MGIsIDB4ZjUsIDB4ODYsIDB4YWIgfTsKIAlzdHJ1Y3QgaTJjX21zZyBpbml0X21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gbXNnLC5sZW4gPSBzaXplb2YobXNnKSB9OwogCiAJLyogc2V0dXAgUExMIGNvbmZpZ3VyYXRpb24gKi8KKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZpbml0X21zZywgMSkgIT0gMSkKIAkJcmV0dXJuIC1FSU87CiAJbXNsZWVwKDEpOwpAQCAtMzY1LDE4ICszNjMsMjAgQEAKIAlpbml0X21zZy5sZW4gID0gMHgwMjsKIAltc2dbMF0gPSAweDAwOwogCW1zZ1sxXSA9IDB4NDA7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmaW5pdF9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGhpbGlwc190ZDEzMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXJldHVybiBwaGlsaXBzX3RkYTY2NTFfcGxsX3NldCgweDYxLCBmZSwgcGFyYW1zKTsKIH0KIAotc3RhdGljIHZvaWQgcGhpbGlwc19ldXJvcGFfYW5hbG9nKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJLyogdGhpcyBtZXNzYWdlIGFjdHVhbGx5IHR1cm5zIHRoZSB0dW5lciBiYWNrIHRvIGFuYWxvZyBtb2RlICovCkBAIC0zOTEsNyArMzkxLDIwIEBACiAJYW5hbG9nX21zZy5sZW4gID0gMHgwMjsKIAltc2dbMF0gPSAweDAwOwogCW1zZ1sxXSA9IDB4MTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZhbmFsb2dfbXNnLCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwaGlsaXBzX2V1cm9wYV9kZW1vZF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CisKKwlpZiAoZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcCkKKwkJZGV2LT5vcmlnaW5hbF9kZW1vZF9zbGVlcChmZSk7CisJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGhpbGlwc19ldXJvcGFfY29uZmlnID0gewpAQCAtNDAyLDIxICs0MTUsMjAgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfNE0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfSUZPX0FVVE9fUE9TLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNTIsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX2V1cm9wYV9wbGxfaW5pdCwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdGQxMzE2X3BsbF9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBwaGlsaXBzX2V1cm9wYV9hbmFsb2csCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgcGhpbGlwc19mbWQxMjE2X3BsbF9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJLyogdGhpcyBtZXNzYWdlIGlzIHRvIHNldCB1cCBBVEMgYW5kIEFMQyAqLwogCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHhhMCB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIAltc2xlZXAoMSk7CkBAIC00MjQsMjIgKzQzNiwyNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwaGlsaXBzX2ZtZDEyMTZfYW5hbG9nKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCS8qIHRoaXMgbWVzc2FnZSBhY3R1YWxseSB0dXJucyB0aGUgdHVuZXIgYmFjayB0byBhbmFsb2cgbW9kZSAqLwogCXN0YXRpYyB1OCBmbWQxMjE2X2luaXRbXSA9IHsgMHgwYiwgMHhkYywgMHg5YywgMHg2MCB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IDB4NjEsLmZsYWdzID0gMCwuYnVmID0gZm1kMTIxNl9pbml0LC5sZW4gPSBzaXplb2YoZm1kMTIxNl9pbml0KSB9OwogCisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCW1zbGVlcCgxKTsKIAlmbWQxMjE2X2luaXRbMl0gPSAweDg2OwogCWZtZDEyMTZfaW5pdFszXSA9IDB4NTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCW1zbGVlcCgxKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJdTggdHVuZXJfYnVmWzRdOwpAQCAtNTE2LDYgKzUzMyw4IEBACiAJdHVuZXJfYnVmWzJdID0gMHg4MCB8IChjcCA8PCA2KSB8IChtb2RlICA8PCAzKSB8IDQ7CiAJdHVuZXJfYnVmWzNdID0gMHg0MCB8IGJhbmQ7CiAKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCXJldHVybiAwOwpAQCAtNTI4LDkgKzU0Nyw2IEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19JRk9fQVVUT19ORUcsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzM2MTMsCi0JLnBsbF9pbml0ICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSBwaGlsaXBzX2ZtZDEyMTZfcGxsX3NldCwKLQkucGxsX3NsZWVwCSAgID0gcGhpbGlwc19mbWQxMjE2X2FuYWxvZywKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwogCkBAIC01NzgsMTIgKzU5NCwxMiBAQAogCXsgLmxvbWF4ID0gICAgICAgICAwLCAuc3BkID0gMCwgLmJzID0gMCwgLmJwID0gMCwgLmNwID0gMCwgLmdjMyA9IDAsIC5kaXYxcDUgPSAwfQogfTsKIAotc3RhdGljIGludCBwaGlsaXBzX3RkYTgyN3hfcGxsX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF9wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NldF9wYXJhbXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAl1OCB0dW5lcl9idWZbMTRdOwpAQCAtNjMwLDYgKzY0Niw4IEBACiAJdHVuZXJfYnVmWzEzXSA9IDB4NDA7CiAKIAl0dW5lcl9tc2cubGVuID0gMTQ7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpZiAoaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdHVuZXJfbXNnLCAxKSAhPSAxKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtNjM4LDE4ICs2NTYsMjMgQEAKIAl0dW5lcl9idWZbMF0gPSAweDMwOwogCXR1bmVyX2J1ZlsxXSA9IDB4NTAgKyB0ZGE4Mjd4X2R2YnRbaV0uY3A7CiAJdHVuZXJfbXNnLmxlbiA9IDI7CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCitzdGF0aWMgaW50IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyN3hfc2xlZXBbXSA9IHsgMHgzMCwgMHhkMH07CiAJc3RydWN0IGkyY19tc2cgdHVuZXJfbXNnID0gey5hZGRyID0gMHg2MCwuZmxhZ3MgPSAwLC5idWYgPSB0ZGE4Mjd4X3NsZWVwLAogCQkJCSAgICAubGVuID0gc2l6ZW9mKHRkYTgyN3hfc2xlZXApIH07CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZGE4Mjd4X2xpZmV2aWV3X2NvbmZpZyA9IHsKQEAgLTY1OSw5ICs2ODIsNiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9pbml0LAotCS5wbGxfc2V0ICAgICAgID0gcGhpbGlwc190ZGE4Mjd4X3BsbF9zZXQsCi0JLnBsbF9zbGVlcAkgICA9IHBoaWxpcHNfdGRhODI3eF9wbGxfc2xlZXAsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIApAQCAtNzUzLDYgKzc3Myw4IEBACiAJdHVuZXJfYnVmWzEyXSA9IDB4MDA7CiAJdHVuZXJfYnVmWzEzXSA9IDB4Mzk7ICAvLyBscHNlbAogCW1zZy5sZW4gPSAxNDsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWlmIChpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZtc2csIDEpICE9IDEpCiAJCXJldHVybiAtRUlPOwogCkBAIC03NjAsMTAgKzc4MiwxNCBAQAogCW1zZy5sZW4gPSAyOwogCXJlZzJbMF0gPSAweDYwOwogCXJlZzJbMV0gPSAweDNjOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKIAogCXJlZzJbMF0gPSAweGEwOwogCXJlZzJbMV0gPSAweDQwOworCWlmIChmZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWZlLT5vcHMuaTJjX2dhdGVfY3RybChmZSwgMSk7CiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKIAogCW1zbGVlcCgyKTsKQEAgLTc3MSwzNiArNzk3LDQzIEBACiAJcmVnMlswXSA9IDB4MzA7CiAJcmVnMlsxXSA9IDB4MTAgKyB0ZGE4Mjd4YV9kdmJ0W2ldLnNjcjsKIAltc2cubGVuID0gMjsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAltc2xlZXAoNTUwKTsKIAlyZWcyWzBdID0gMHg1MDsKIAlyZWcyWzFdID0gMHg0ZiArICh0ZGE4Mjd4YV9kdmJ0W2ldLmdjMyA8PCA0KTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOwogCWkyY190cmFuc2ZlcigmZGV2LT5pMmNfYWRhcCwgJm1zZywgMSk7CiAKIAlyZXR1cm4gMDsKIAogfQogCi1zdGF0aWMgdm9pZCBwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCh1OCBhZGRyLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyN3hhX3NsZWVwW10gPSB7IDB4MzAsIDB4OTB9OwogCXN0cnVjdCBpMmNfbXNnIHR1bmVyX21zZyA9IHsuYWRkciA9IGFkZHIsLmZsYWdzID0gMCwuYnVmID0gdGRhODI3eGFfc2xlZXAsCiAJCQkJICAgIC5sZW4gPSBzaXplb2YodGRhODI3eGFfc2xlZXApIH07CisJaWYgKGZlLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKGZlLCAxKTsKIAlpMmNfdHJhbnNmZXIoJmRldi0+aTJjX2FkYXAsICZ0dW5lcl9tc2csIDEpOwotCisJcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHBoaWxpcHNfdGlnZXJfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IHRkYTgyOTBfY2xvc2VbXSA9IHsgMHgyMSwgMHhjMH07CiAJc3RhdGljIHU4IHRkYTgyOTBfb3BlbltdICA9IHsgMHgyMSwgMHg4MH07CiAJc3RydWN0IGkyY19tc2cgdGRhODI5MF9tc2cgPSB7LmFkZHIgPSAweDRiLC5mbGFncyA9IDAsIC5sZW4gPSAyfTsKKwogCS8qIGNsb3NlIHRkYTgyOTAgaTJjIGJyaWRnZSAqLwogCXRkYTgyOTBfbXNnLmJ1ZiA9IHRkYTgyOTBfY2xvc2U7CiAJcmV0ID0gaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmdGRhODI5MF9tc2csIDEpOwpAQCAtODE2LDcgKzg0OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX2R2Yl9tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCXN0YXRpYyB1OCBkYXRhW10gPSB7IDB4M2MsIDB4MzMsIDB4NmF9OwpAQCAtODI3LDE0ICs4NjAsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGhpbGlwc190aWdlcl9hbmFsb2dfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgcGhpbGlwc190aWdlcl90dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKIAlzdHJ1Y3Qgc2FhNzEzNF9kZXYgKmRldiA9IGZlLT5kdmItPnByaXY7CiAJc3RhdGljIHU4IGRhdGFbXSA9IHsgMHgzYywgMHgzMywgMHg2OH07CiAJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyPTB4MDgsIC5mbGFncz0wLCAuYnVmPWRhdGEsIC5sZW4gPSBzaXplb2YoZGF0YSl9OwogCiAJaTJjX3RyYW5zZmVyKCZkZXYtPmkyY19hZGFwLCAmbXNnLCAxKTsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCggMHg2MSwgZmUpOworCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCB0ZGExMDA0eF9jb25maWcgcGhpbGlwc190aWdlcl9jb25maWcgPSB7CkBAIC04NDQsMTUgKzg3OCwxMiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WCwKIAkuaWZfZnJlcSAgICAgICA9IFREQTEwMDQ2X0ZSRVFfMDQ1LAotCS5wbGxfaW5pdCAgICAgID0gcGhpbGlwc190aWdlcl9kdmJfbW9kZSwKLQkucGxsX3NldCAgICAgICA9IHBoaWxpcHNfdGlnZXJfcGxsX3NldCwKLQkucGxsX3NsZWVwICAgICA9IHBoaWxpcHNfdGlnZXJfYW5hbG9nX21vZGUsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb19wbGxfc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb190dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwogCkBAIC04NjAsMTYgKzg5MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb19kdmJfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgbGlmZXZpZXdfdHJpb190dW5lcl9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKIHsKKwlwaGlsaXBzX3RkYTgyN3hhX3R1bmVyX3NsZWVwKDB4NjAsIGZlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbGlmZXZpZXdfdHJpb19hbmFsb2dfbW9kZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCgweDYwLCBmZSk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgdGRhMTAwNHhfY29uZmlnIGxpZmV2aWV3X3RyaW9fY29uZmlnID0gewogCS5kZW1vZF9hZGRyZXNzID0gMHgwOSwKIAkuaW52ZXJ0ICAgICAgICA9IDEsCkBAIC04NzcsMTUgKzkwNCwxMiBAQAogCS54dGFsX2ZyZXEgICAgID0gVERBMTAwNDZfWFRBTF8xNk0sCiAJLmFnY19jb25maWcgICAgPSBUREExMDA0Nl9BR0NfVERBODI3WF9HUEwsCiAJLmlmX2ZyZXEgICAgICAgPSBUREExMDA0Nl9GUkVRXzA0NSwKLQkucGxsX2luaXQgICAgICA9IGxpZmV2aWV3X3RyaW9fZHZiX21vZGUsCi0JLnBsbF9zZXQgICAgICAgPSBsaWZldmlld190cmlvX3BsbF9zZXQsCi0JLnBsbF9zbGVlcCAgICAgPSBsaWZldmlld190cmlvX2FuYWxvZ19tb2RlLAogCS5yZXF1ZXN0X2Zpcm13YXJlID0gTlVMTCwKIH07CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IGFkc19kdW9fcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IGFkc19kdW9fdHVuZXJfc2V0X3BhcmFtcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJaW50IHJldDsKIApAQCAtODkzLDcgKzkxNyw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZHNfZHVvX2R2Yl9tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBhZHNfZHVvX3R1bmVyX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmZS0+ZHZiLT5wcml2OwogCS8qIHJvdXRlIFREQTgyNzVhIEFHQyBpbnB1dCB0byB0aGUgY2hhbm5lbCBkZWNvZGVyICovCkBAIC05MDEsMTIgKzkyNSwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhZHNfZHVvX2FuYWxvZ19tb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQorc3RhdGljIGludCBhZHNfZHVvX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogewogCXN0cnVjdCBzYWE3MTM0X2RldiAqZGV2ID0gZmUtPmR2Yi0+cHJpdjsKIAkvKiByb3V0ZSBUREE4Mjc1YSBBR0MgaW5wdXQgdG8gdGhlIGFuYWxvZyBJRiBjaGlwKi8KIAlzYWFfd3JpdGViKFNBQTcxMzRfR1BJT19HUFNUQVRVUzIsIDB4MjApOwotCXBoaWxpcHNfdGRhODI3eGFfcGxsX3NsZWVwKCAweDYxLCBmZSk7CisJcGhpbGlwc190ZGE4Mjd4YV90dW5lcl9zbGVlcCggMHg2MSwgZmUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyBhZHNfdGVjaF9kdW9fY29uZmlnID0gewpAQCAtOTE2LDMxICs5NDEsMjQgQEAKIAkueHRhbF9mcmVxICAgICA9IFREQTEwMDQ2X1hUQUxfMTZNLAogCS5hZ2NfY29uZmlnICAgID0gVERBMTAwNDZfQUdDX1REQTgyN1hfR1BMLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnBsbF9pbml0ICAgICAgPSBhZHNfZHVvX2R2Yl9tb2RlLAotCS5wbGxfc2V0ICAgICAgID0gYWRzX2R1b19wbGxfc2V0LAotCS5wbGxfc2xlZXAgICAgID0gYWRzX2R1b19hbmFsb2dfbW9kZSwKIAkucmVxdWVzdF9maXJtd2FyZSA9IE5VTEwsCiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCB0ZXZpb25fZHZiMjIwcmZfcGxsX3NldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwYXJhbXMpCitzdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl90dW5lcl9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKIHsKIAlpbnQgcmV0OwogCXJldCA9IHBoaWxpcHNfdGRhODI3eGFfcGxsX3NldCgweDYwLCBmZSwgcGFyYW1zKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRldmlvbl9kdmIyMjByZl9wbGxfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3N0YXRpYyBpbnQgdGV2aW9uX2R2YjIyMHJmX3R1bmVyX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQogeworCXBoaWxpcHNfdGRhODI3eGFfdHVuZXJfc2xlZXAoIDB4NjEsIGZlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdGV2aW9uX2R2YjIyMHJmX3BsbF9zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKLXsKLQlwaGlsaXBzX3RkYTgyN3hhX3BsbF9zbGVlcCggMHg2MSwgZmUpOwotfQotCiBzdGF0aWMgc3RydWN0IHRkYTEwMDR4X2NvbmZpZyB0ZXZpb25fZHZidDIyMHJmX2NvbmZpZyA9IHsKIAkuZGVtb2RfYWRkcmVzcyA9IDB4MDgsCiAJLmludmVydCAgICAgICAgPSAxLApAQCAtOTQ4LDkgKzk2Niw2IEBACiAJLnh0YWxfZnJlcSAgICAgPSBUREExMDA0Nl9YVEFMXzE2TSwKIAkuYWdjX2NvbmZpZyAgICA9IFREQTEwMDQ2X0FHQ19UREE4MjdYLAogCS5pZl9mcmVxICAgICAgID0gVERBMTAwNDZfRlJFUV8wNDUsCi0JLnBsbF9pbml0ICAgICAgPSB0ZXZpb25fZHZiMjIwcmZfcGxsX2luaXQsCi0JLnBsbF9zZXQgICAgICAgPSB0ZXZpb25fZHZiMjIwcmZfcGxsX3NldCwKLQkucGxsX3NsZWVwICAgICA9IHRldmlvbl9kdmIyMjByZl9wbGxfc2xlZXAsCiAJLnJlcXVlc3RfZmlybXdhcmUgPSBOVUxMLAogfTsKIApAQCAtOTYxLDggKzk3Niw2IEBACiAjaWZkZWYgSEFWRV9OWFQyMDBYCiBzdGF0aWMgc3RydWN0IG54dDIwMHhfY29uZmlnIGF2ZXJ0dmhkYTE4MCA9IHsKIAkuZGVtb2RfYWRkcmVzcyAgICA9IDB4MGEsCi0JLnBsbF9hZGRyZXNzICAgICAgPSAweDYxLAotCS5wbGxfZGVzYyAgICAgICAgID0gJmR2Yl9wbGxfdGRodTIsCiB9OwogCiBzdGF0aWMgaW50IG54dDIwMHhfc2V0X3BsbF9pbnB1dCh1OCAqYnVmLCBpbnQgaW5wdXQpCkBAIC05NzYsOCArOTg5LDYgQEAKIAogc3RhdGljIHN0cnVjdCBueHQyMDB4X2NvbmZpZyBrd29ybGRhdHNjMTEwID0gewogCS5kZW1vZF9hZGRyZXNzICAgID0gMHgwYSwKLQkucGxsX2FkZHJlc3MgICAgICA9IDB4NjEsCi0JLnBsbF9kZXNjICAgICAgICAgPSAmZHZiX3BsbF90dXYxMjM2ZCwKIAkuc2V0X3BsbF9pbnB1dCAgICA9IG54dDIwMHhfc2V0X3BsbF9pbnB1dCwKIH07CiAjZW5kaWYKQEAgLTEwMDMsNzggKzEwMTQsMTU4IEBACiAJCXByaW50aygiJXM6IHBpbm5hY2xlIDMwMGkgZHZiIHNldHVwXG4iLGRldi0+bmFtZSk7CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbXQzNTJfYXR0YWNoKCZwaW5uYWNsZV8zMDBpLAogCQkJCQkJICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbXQzNTJfcGlubmFjbGVfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfNzc3OgogCQlwcmludGsoIiVzOiBhdmVydHYgNzc3IGR2YiBzZXR1cFxuIixkZXYtPm5hbWUpOwogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IG10MzUyX2F0dGFjaCgmYXZlcm1lZGlhXzc3NywKIAkJCQkJCSAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuY2FsY19yZWdzID0gbXQzNTJfYXZlcjc3N190dW5lcl9jYWxjX3JlZ3M7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX1REQTEwMDRYCiAJY2FzZSBTQUE3MTM0X0JPQVJEX01ENzEzNDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJm1lZGlvbl9jYXJkYnVzLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc19mbWQxMjE2X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZm1kMTIxNl90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX2ZtZDEyMTZfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19UT1VHSDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2XzYwX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYwX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjBfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVERVTzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfRkxZRFZCVF9EVU9fQ0FSREJVUzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnRkYTgyN3hfbGlmZXZpZXdfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19FVVJPUEE6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gdGRhMTAwNDZfYXR0YWNoKCZwaGlsaXBzX2V1cm9wYV9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+b3JpZ2luYWxfZGVtb2Rfc2xlZXAgPSBkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnNsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX2RlbW9kX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzMwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfZXVyb3BhX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfZXVyb3BhX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGQxMzE2X3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9EVkJUXzIwMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdHUxMjE2XzYxX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IHBoaWxpcHNfdHUxMjE2X3R1bmVyXzYxX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190dTEyMTZfdHVuZXJfNjFfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfUEhJTElQU19USUdFUjoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJnBoaWxpcHNfdGlnZXJfY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5pbml0ID0gcGhpbGlwc190aWdlcl90dW5lcl9pbml0OworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2xlZXAgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2V0X3BhcmFtczsKKwkJfQogCQlicmVhazsKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVNVU1RlS19QNzEzMV9EVUFMOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmcGhpbGlwc190aWdlcl9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RpZ2VyX3R1bmVyX2luaXQ7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IHBoaWxpcHNfdGlnZXJfdHVuZXJfc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gcGhpbGlwc190aWdlcl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0xSMzAxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGRhODI3eF9saWZldmlld19jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLmluaXQgPSBwaGlsaXBzX3RkYTgyN3hfdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gcGhpbGlwc190ZGE4Mjd4X3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHBoaWxpcHNfdGRhODI3eF90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJfVFJJTzoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSB0ZGExMDA0Nl9hdHRhY2goJmxpZmV2aWV3X3RyaW9fY29uZmlnLAogCQkJCQkJICAgICZkZXYtPmkyY19hZGFwKTsKKwkJaWYgKGRldi0+ZHZiLmZyb250ZW5kKSB7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zbGVlcCA9IGxpZmV2aWV3X3RyaW9fdHVuZXJfc2xlZXA7CisJCQlkZXYtPmR2Yi5mcm9udGVuZC0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zID0gbGlmZXZpZXdfdHJpb190dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9BRFNfRFVPX0NBUkRCVVNfUFRWMzMxOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmYWRzX3RlY2hfZHVvX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFkc19kdW9fdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gYWRzX2R1b190dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhZHNfZHVvX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1RFVklPTl9EVkJUXzIyMFJGOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmdGV2aW9uX2R2YnQyMjByZl9jb25maWcsCiAJCQkJCQkgICAgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gdGV2aW9uX2R2YjIyMHJmX3R1bmVyX3NsZWVwOworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuc2V0X3BhcmFtcyA9IHRldmlvbl9kdmIyMjByZl90dW5lcl9zZXRfcGFyYW1zOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0hZQlJJRF9DQVJEQlVTOgogCQlkZXYtPmR2Yi5mcm9udGVuZCA9IHRkYTEwMDQ2X2F0dGFjaCgmYWRzX3RlY2hfZHVvX2NvbmZpZywKIAkJCQkJCSAgICAmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChkZXYtPmR2Yi5mcm9udGVuZCkgeworCQkJZGV2LT5kdmIuZnJvbnRlbmQtPm9wcy50dW5lcl9vcHMuaW5pdCA9IGFkc19kdW9fdHVuZXJfaW5pdDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNsZWVwID0gYWRzX2R1b190dW5lcl9zbGVlcDsKKwkJCWRldi0+ZHZiLmZyb250ZW5kLT5vcHMudHVuZXJfb3BzLnNldF9wYXJhbXMgPSBhZHNfZHVvX3R1bmVyX3NldF9wYXJhbXM7CisJCX0KIAkJYnJlYWs7CiAjZW5kaWYKICNpZmRlZiBIQVZFX05YVDIwMFgKIAljYXNlIFNBQTcxMzRfQk9BUkRfQVZFUk1FRElBX0FWRVJUVkhEX0ExODA6CiAJCWRldi0+ZHZiLmZyb250ZW5kID0gbnh0MjAweF9hdHRhY2goJmF2ZXJ0dmhkYTE4MCwgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLCAmZGV2LT5pMmNfYWRhcCwgJmR2Yl9wbGxfdGRodTIpOworCQl9CiAJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9LV09STERfQVRTQzExMDoKIAkJZGV2LT5kdmIuZnJvbnRlbmQgPSBueHQyMDB4X2F0dGFjaCgma3dvcmxkYXRzYzExMCwgJmRldi0+aTJjX2FkYXApOworCQlpZiAoZGV2LT5kdmIuZnJvbnRlbmQpIHsKKwkJCWR2Yl9wbGxfYXR0YWNoKGRldi0+ZHZiLmZyb250ZW5kLCAweDYxLCAmZGV2LT5pMmNfYWRhcCwgJmR2Yl9wbGxfdHV2MTIzNmQpOworCQl9CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKQEAgLTEwODgsNyArMTE3OSw3IEBACiAJfQogCiAJLyogcmVnaXN0ZXIgZXZlcnl0aGluZyBlbHNlICovCi0JcmV0dXJuIHZpZGVvYnVmX2R2Yl9yZWdpc3RlcigmZGV2LT5kdmIsIFRISVNfTU9EVUxFLCBkZXYpOworCXJldHVybiB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoJmRldi0+ZHZiLCBUSElTX01PRFVMRSwgZGV2LCAmZGV2LT5wY2ktPmRldik7CiB9CiAKIHN0YXRpYyBpbnQgZHZiX2Zpbmkoc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKaW5kZXggMWQ5NzJlZC4uNjVkMDQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwpAQCAtNjQsOCArNjQsMTAgQEAKIAogc3RhdGljIGludCB0c19pbml0X2VuY29kZXIoc3RydWN0IHNhYTcxMzRfZGV2KiBkZXYpCiB7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzIGN0cmxzID0geyBWNEwyX0NUUkxfQ0xBU1NfTVBFRywgMCB9OworCiAJdHNfcmVzZXRfZW5jb2RlcihkZXYpOwotCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19TX01QRUdDT01QLCBOVUxMKTsKKwlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19FWFRfQ1RSTFMsICZjdHJscyk7CiAJZGV2LT5lbXByZXNzX3N0YXJ0ZWQgPSAxOwogCXJldHVybiAwOwogfQpAQCAtMTYyLDYgKzE2NCw3IEBACiAJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCiB7CiAJc3RydWN0IHNhYTcxMzRfZGV2ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscyA9IGFyZzsKIAogCWlmIChkZWJ1ZyA+IDEpCiAJCXY0bF9wcmludF9pb2N0bChkZXYtPm5hbWUsY21kKTsKQEAgLTI3OCwxMiArMjgxLDMxIEBACiAJCXJldHVybiBzYWE3MTM0X2NvbW1vbl9pb2N0bChkZXYsIGNtZCwgYXJnKTsKIAogCWNhc2UgVklESU9DX1NfTVBFR0NPTVA6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19TX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX1NfRVhUX0NUUkxTISIpOwogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19NUEVHQ09NUCwgYXJnKTsKIAkJdHNfaW5pdF9lbmNvZGVyKGRldik7CiAJCXJldHVybiAwOwogCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZJRElPQ19HX01QRUdDT01QIGlzIG9ic29sZXRlLiAiCisJCQkJICAgICJSZXBsYWNlIHdpdGggVklESU9DX0dfRVhUX0NUUkxTISIpOwogCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfR19NUEVHQ09NUCwgYXJnKTsKIAkJcmV0dXJuIDA7CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CisJCS8qIGNvdW50ID09IDAgaXMgYWJ1c2VkIGluIHNhYTY3NTJocy5jLCBzbyB0aGF0IHNwZWNpYWwKKwkJICAgY2FzZSBpcyBoYW5kbGVkIGhlcmUgZXhwbGljaXRseS4gKi8KKwkJaWYgKGN0cmxzLT5jb3VudCA9PSAwKQorCQkJcmV0dXJuIDA7CisJCWlmIChjdHJscy0+Y3RybF9jbGFzcyAhPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRykKKwkJCXJldHVybiAtRUlOVkFMOworCQlzYWE3MTM0X2kyY19jYWxsX2NsaWVudHMoZGV2LCBWSURJT0NfU19FWFRfQ1RSTFMsIGFyZyk7CisJCXRzX2luaXRfZW5jb2RlcihkZXYpOworCQlyZXR1cm4gMDsKKwljYXNlIFZJRElPQ19HX0VYVF9DVFJMUzoKKwkJaWYgKGN0cmxzLT5jdHJsX2NsYXNzICE9IFY0TDJfQ1RSTF9DTEFTU19NUEVHKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNhYTcxMzRfaTJjX2NhbGxfY2xpZW50cyhkZXYsIFZJRElPQ19HX0VYVF9DVFJMUywgYXJnKTsKKwkJcmV0dXJuIDA7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWlucHV0LmMKaW5kZXggMTQyNmU0Yy4uN2M1OTU0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1pbnB1dC5jCkBAIC0zNyw2ICszNywxMCBAQAogbW9kdWxlX3BhcmFtKGlyX2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpcl9kZWJ1ZywiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIFtJUl0iKTsKIAorc3RhdGljIGludCBwaW5uYWNsZV9yZW1vdGUgPSAwOworbW9kdWxlX3BhcmFtKHBpbm5hY2xlX3JlbW90ZSwgaW50LCAwNjQ0KTsgICAgLyogQ2hvb3NlIFBpbm5hY2xlIFBDVFYgcmVtb3RlICovCitNT0RVTEVfUEFSTV9ERVNDKHBpbm5hY2xlX3JlbW90ZSwgIlNwZWNpZnkgUGlubmFjbGUgUENUViByZW1vdGU6IDA9Y29sb3VyZWQsIDE9Z3JleSAoZGVmYXVsdHMgdG8gMCkiKTsKKwogI2RlZmluZSBkcHJpbnRrKGZtdCwgYXJnLi4uKQlpZiAoaXJfZGVidWcpIFwKIAlwcmludGsoS0VSTl9ERUJVRyAiJXMvaXI6ICIgZm10LCBkZXYtPm5hbWUgLCAjIyBhcmcpCiAjZGVmaW5lIGkyY2RwcmludGsoZm10LCBhcmcuLi4pICAgIGlmIChpcl9kZWJ1ZykgXApAQCAtMzE2LDggKzMyMCwxMyBAQAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgewogCWNhc2UgU0FBNzEzNF9CT0FSRF9QSU5OQUNMRV9QQ1RWXzExMGk6CiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgIlBpbm5hY2xlIFBDVFYiKTsKLQkJaXItPmdldF9rZXkgICA9IGdldF9rZXlfcGlubmFjbGU7Ci0JCWlyLT5pcl9jb2RlcyAgPSBpcl9jb2Rlc19waW5uYWNsZTsKKwkJaWYgKHBpbm5hY2xlX3JlbW90ZSA9PSAwKSB7CisJCQlpci0+Z2V0X2tleSAgID0gZ2V0X2tleV9waW5uYWNsZV9jb2xvcjsKKwkJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2NvbG9yOworCQl9IGVsc2UgeworCQkJaXItPmdldF9rZXkgICA9IGdldF9rZXlfcGlubmFjbGVfZ3JleTsKKwkJCWlyLT5pcl9jb2RlcyA9IGlyX2NvZGVzX3Bpbm5hY2xlX2dyZXk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTQUE3MTM0X0JPQVJEX1VQTU9TVF9QVVJQTEVfVFY6CiAJCXNucHJpbnRmKGlyLT5jLm5hbWUsIHNpemVvZihpci0+Yy5uYW1lKSwgIlB1cnBsZSBUViIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggMzUzYWYzYS4uZDVlZTk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9pci1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9pci1rYmQtaTJjLmg+CkBAIC0yMjEsNiArMjIyLDcgQEAKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9BVkVSTUVESUFfQTE2OV9CMSA5MgogI2RlZmluZSBTQUE3MTM0X0JPQVJEX01ENzEzNF9CUklER0VfMiAgICAgOTMKICNkZWZpbmUgU0FBNzEzNF9CT0FSRF9GTFlEVkJUX0hZQlJJRF9DQVJEQlVTIDk0CisjZGVmaW5lIFNBQTcxMzRfQk9BUkRfRkxZVklERU8zMDAwX05UU0MgOTUKIAogI2RlZmluZSBTQUE3MTM0X01BWEJPQVJEUyA4CiAjZGVmaW5lIFNBQTcxMzRfSU5QVVRfTUFYIDgKQEAgLTUzMSw2ICs1MzMsNyBAQAogCiAJLyogU0FBNzEzNF9NUEVHX0RWQiBvbmx5ICovCiAJc3RydWN0IHZpZGVvYnVmX2R2YiAgICAgICAgZHZiOworCWludCAoKm9yaWdpbmFsX2RlbW9kX3NsZWVwKShzdHJ1Y3QgZHZiX2Zyb250ZW5kKiBmZSk7CiB9OwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zZTQwMS5oCmluZGV4IGE3YTIxNmIuLmMwODkxYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2U0MDEuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NlNDAxLmgKQEAgLTQsNiArNCw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCBlYTQzOTRkLi40OGQxMzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMl9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCkBAIC0yNjA4LDExICsyNjA4LDkgQEAKIAljYXNlIFZJRElPQ19HX0NUUkw6CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19nX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19DVFJMX09MRDoKIAljYXNlIFZJRElPQ19TX0NUUkw6CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19zX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfQ1JPUENBUF9PTEQ6CiAJY2FzZSBWSURJT0NfQ1JPUENBUDoKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX2Nyb3BjYXAoY2FtLCBhcmcpOwogCkBAIC0yNjU5LDcgKzI2NTcsNiBAQAogCWNhc2UgVklESU9DX0dfUEFSTToKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX2dfcGFybShjYW0sIGFyZyk7CiAKLQljYXNlIFZJRElPQ19TX1BBUk1fT0xEOgogCWNhc2UgVklESU9DX1NfUEFSTToKIAkJcmV0dXJuIHNuOWMxMDJfdmlkaW9jX3NfcGFybShjYW0sIGFyZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3RyYWRpcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKaW5kZXggMDc0NzZjNy4uNmJlOWMxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zdHJhZGlzLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlICJzYWE3MTQ2LmgiCiAjaW5jbHVkZSAic2FhNzE0NnJlZy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3R2NjgwLmMKaW5kZXggYjM4YmRhOC4uMzUxYjE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zdHY2ODAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3N0djY4MC5jCkBAIC02Niw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg3NS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKaW5kZXggMTAzY2NiOS4uODI3NjMzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90ZGE5ODc1LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMTYzLDcgKzE2NCw3IEBACiAJc3RydWN0IHRkYTk4NzUgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlkcHJpbnRrKCJJbiB0ZGE5ODc1X2luaXRcbiIpOwogCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0NGRywgMHhkMCApOyAvKnJlZyBkZSBjb25maWcgMCAocmVzZXQpKi8KLSAgICAJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVNSLCAweDAzICk7ICAgIC8qIE1vbml0b3IgMGIwMDAwMFhYWCovCisJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfTVNSLCAweDAzICk7ICAgIC8qIE1vbml0b3IgMGIwMDAwMFhYWCovCiAJdGRhOTg3NV93cml0ZShjbGllbnQsIFREQTk4NzVfQzFNU0IsIDB4MDAgKTsgIC8qQ2FyMShGTSkgTVNCIFhNSHoqLwogCXRkYTk4NzVfd3JpdGUoY2xpZW50LCBUREE5ODc1X0MxTUlCLCAweDAwICk7ICAvKkNhcjEoRk0pIE1JQiBYTUh6Ki8KIAl0ZGE5ODc1X3dyaXRlKGNsaWVudCwgVERBOTg3NV9DMUxTQiwgMHgwMCApOyAgLypDYXIxKEZNKSBMU0IgWE1IeiovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTk4ODcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCmluZGV4IDBkNTRmNmMuLmI2YWU5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhOTg4Ny5jCkBAIC0xOCw0OSArMTgsMjEgQEAKICAgIFREQTk4ODYgKFBBTCwgU0VDQU0sIE5UU0MpCiAgICBUREE5ODg3IChQQUwsIFNFQ0FNLCBOVFNDLCBGTSBSYWRpbykKIAotICAgZm91bmQgb246Ci0gICAtIFBpbm5hY2xlIFBDVFYgKEp1bC4yMDAyIFZlcnNpb24gd2l0aCBNVDIwMzIsIGJ0dHYpCi0gICAgICBUREE5ODg3ICh3b3JsZCksIFREQTk4ODUgKFVTQSkKLSAgICAgIE5vdGU6IE9QMiBvZiB0ZGE5ODh4IG11c3QgYmUgc2V0IHRvIDEsIGVsc2UgTVQyMDMyIGlzIGRpc2FibGVkIQotICAgLSBLTkMgT25lIFRWLVN0YXRpb24gUkRTIChzYWE3MTM0KQotICAgLSBIYXVwcGF1Z2UgUFZSLTE1MC81MDAgKHBvc3NpYmx5IG1vcmUpCisgICBVc2VkIGFzIHBhcnQgb2Ygc2V2ZXJhbCB0dW5lcnMKICovCiAKKyNkZWZpbmUgdGRhOTg4N19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAorCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHggKHRkYTk4ODcpOiAiIGZtdCwgdC0+aTJjLm5hbWUsIFwKKwkJCWkyY19hZGFwdGVyX2lkKHQtPmkyYy5hZGFwdGVyKSwgdC0+aTJjLmFkZHIgLCAjI2FyZyk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHRkYTk4ODdfZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAorCWlmICh0dW5lcl9kZWJ1ZykgXAorCQlwcmludGsoS0VSTl9JTkZPICIlcyAlZC0lMDR4ICh0ZGE5ODg3KTogIiBmbXQsIHQtPmkyYy5uYW1lLCBcCisJCQlpMmNfYWRhcHRlcl9pZCh0LT5pMmMuYWRhcHRlciksIHQtPmkyYy5hZGRyICwgIyNhcmcpOyB9IHdoaWxlICgwKQogCi0vKiBBZGRyZXNzZXMgdG8gc2NhbiAqLwotc3RhdGljIHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDg0ID4+MSwKLQkweDg2ID4+MSwKLQkweDk2ID4+MSwKLQlJMkNfQ0xJRU5UX0VORCwKLX07Ci1JMkNfQ0xJRU5UX0lOU01PRDsKLQotLyogaW5zbW9kIG9wdGlvbnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWcgPSAwOwotbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKICNkZWZpbmUgVU5TRVQgICAgICAgKC0xVSkKLSNkZWZpbmUgdGRhOTg4N19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7XAotCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCB0LT5jbGllbnQubmFtZSwgXAotCQkJaTJjX2FkYXB0ZXJfaWQodC0+Y2xpZW50LmFkYXB0ZXIpLCB0LT5jbGllbnQuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdGRhOTg4N19kYmcoZm10LCBhcmcuLi4pIGRvIHtcCi0JaWYgKGRlYnVnKSBcCi0JCXByaW50ayhLRVJOX0lORk8gIiVzICVkLSUwNHg6ICIgZm10LCB0LT5jbGllbnQubmFtZSwgXAotCQkJaTJjX2FkYXB0ZXJfaWQodC0+Y2xpZW50LmFkYXB0ZXIpLCB0LT5jbGllbnQuYWRkciAsICMjYXJnKTsgfSB3aGlsZSAoMCkKLQotc3RydWN0IHRkYTk4ODcgewotCXN0cnVjdCBpMmNfY2xpZW50ICBjbGllbnQ7Ci0JdjRsMl9zdGRfaWQgICAgICAgIHN0ZDsKLQllbnVtIHR1bmVyX21vZGUgICAgbW9kZTsKLQl1bnNpZ25lZCBpbnQgICAgICAgY29uZmlnOwotCXVuc2lnbmVkIGludCAgICAgICB1c2luZ192NGwyOwotCXVuc2lnbmVkIGludCAJICAgcmFkaW9fbW9kZTsKLQl1bnNpZ25lZCBjaGFyIAkgICBkYXRhWzRdOwotfTsKIAogc3RydWN0IHR2bm9ybSB7CiAJdjRsMl9zdGRfaWQgICAgICAgc3RkOwpAQCAtNzAsOSArNDIsNiBAQAogCXVuc2lnbmVkIGNoYXIgICAgIGU7CiB9OwogCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgZHJpdmVyOwotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvLwpAQCAtMjgxLDcgKzI1MCw3IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgZHVtcF9yZWFkX21lc3NhZ2Uoc3RydWN0IHRkYTk4ODcgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGR1bXBfcmVhZF9tZXNzYWdlKHN0cnVjdCB0dW5lciAqdCwgdW5zaWduZWQgY2hhciAqYnVmKQogewogCXN0YXRpYyBjaGFyICphZmNbMTZdID0gewogCQkiLSAxMi41IGtIeiIsCkBAIC0zMDksNyArMjc4LDcgQEAKIAl0ZGE5ODg3X2luZm8oIiAgdmZpIGxldmVsICAgICAgOiAlc1xuIiwgKGJ1ZlswXSAmIDB4ODApID8gImhpZ2giIDogImxvdyIpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wX3dyaXRlX21lc3NhZ2Uoc3RydWN0IHRkYTk4ODcgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGR1bXBfd3JpdGVfbWVzc2FnZShzdHJ1Y3QgdHVuZXIgKnQsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKIAlzdGF0aWMgY2hhciAqc291bmRbNF0gPSB7CiAJCSJBTS9UViIsCkBAIC00MDUsMTMgKzM3NCwxMyBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgdGRhOTg4N19zZXRfdHZub3JtKHN0cnVjdCB0ZGE5ODg3ICp0LCBjaGFyICpidWYpCitzdGF0aWMgaW50IHRkYTk4ODdfc2V0X3R2bm9ybShzdHJ1Y3QgdHVuZXIgKnQsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdHZub3JtICpub3JtID0gTlVMTDsKIAlpbnQgaTsKIAotCWlmICh0LT5tb2RlID09IFRfUkFESU8pIHsKLQkJaWYgKHQtPnJhZGlvX21vZGUgPT0gVjRMMl9UVU5FUl9NT0RFX01PTk8pCisJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlpZiAodC0+YXVkbW9kZSA9PSBWNEwyX1RVTkVSX01PREVfTU9OTykKIAkJCW5vcm0gPSAmcmFkaW9fbW9ubzsKIAkJZWxzZQogCQkJbm9ybSA9ICZyYWRpb19zdGVyZW87CkBAIC00NDUsNyArNDE0LDcgQEAKIG1vZHVsZV9wYXJhbShxc3MsIGludCwgMDY0NCk7CiBtb2R1bGVfcGFyYW0oYWRqdXN0LCBpbnQsIDA2NDQpOwogCi1zdGF0aWMgaW50IHRkYTk4ODdfc2V0X2luc21vZChzdHJ1Y3QgdGRhOTg4NyAqdCwgY2hhciAqYnVmKQorc3RhdGljIGludCB0ZGE5ODg3X3NldF9pbnNtb2Qoc3RydWN0IHR1bmVyICp0LCBjaGFyICpidWYpCiB7CiAJaWYgKFVOU0VUICE9IHBvcnQxKSB7CiAJCWlmIChwb3J0MSkKQEAgLTQ3NCwyNyArNDQzLDI3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGRhOTg4N19zZXRfY29uZmlnKHN0cnVjdCB0ZGE5ODg3ICp0LCBjaGFyICpidWYpCitzdGF0aWMgaW50IHRkYTk4ODdfc2V0X2NvbmZpZyhzdHJ1Y3QgdHVuZXIgKnQsIGNoYXIgKmJ1ZikKIHsKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMV9BQ1RJVkUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19QT1JUMV9BQ1RJVkUpCiAJCWJ1ZlsxXSAmPSB+Y091dHB1dFBvcnQxSW5hY3RpdmU7Ci0JaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfUE9SVDFfSU5BQ1RJVkUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19QT1JUMV9JTkFDVElWRSkKIAkJYnVmWzFdIHw9IGNPdXRwdXRQb3J0MUluYWN0aXZlOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X1BPUlQyX0FDVElWRSkKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X1BPUlQyX0FDVElWRSkKIAkJYnVmWzFdICY9IH5jT3V0cHV0UG9ydDJJbmFjdGl2ZTsKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19QT1JUMl9JTkFDVElWRSkKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X1BPUlQyX0lOQUNUSVZFKQogCQlidWZbMV0gfD0gY091dHB1dFBvcnQySW5hY3RpdmU7CiAKLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19RU1MpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19RU1MpCiAJCWJ1ZlsxXSB8PSBjUVNTOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUikKKwlpZiAodC0+dGRhOTg4N19jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUikKIAkJYnVmWzFdICY9IH5jUVNTOwogCi0JaWYgKHQtPmNvbmZpZyAmIFREQTk4ODdfQVVUT01VVEUpCisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19BVVRPTVVURSkKIAkJYnVmWzFdIHw9IGNBdXRvTXV0ZUZtQWN0aXZlOwotCWlmICh0LT5jb25maWcgJiBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSykgeworCWlmICh0LT50ZGE5ODg3X2NvbmZpZyAmIFREQTk4ODdfREVFTVBIQVNJU19NQVNLKSB7CiAJCWJ1ZlsyXSAmPSB+MHg2MDsKLQkJc3dpdGNoICh0LT5jb25maWcgJiBUREE5ODg3X0RFRU1QSEFTSVNfTUFTSykgeworCQlzd2l0Y2ggKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19ERUVNUEhBU0lTX01BU0spIHsKIAkJY2FzZSBUREE5ODg3X0RFRU1QSEFTSVNfTk9ORToKIAkJCWJ1ZlsyXSB8PSBjRGVlbXBoYXNpc09GRjsKIAkJCWJyZWFrOwpAQCAtNTA2LDE1MyArNDc1LDM2IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAodC0+Y29uZmlnICYgVERBOTg4N19UT1BfU0VUKSB7CisJaWYgKHQtPnRkYTk4ODdfY29uZmlnICYgVERBOTg4N19UT1BfU0VUKSB7CiAJCWJ1ZlsyXSAmPSB+Y1RvcE1hc2s7Ci0JCWJ1ZlsyXSB8PSAodC0+Y29uZmlnID4+IDgpICYgY1RvcE1hc2s7CisJCWJ1ZlsyXSB8PSAodC0+dGRhOTg4N19jb25maWcgPj4gOCkgJiBjVG9wTWFzazsKIAl9Ci0JaWYgKCh0LT5jb25maWcgJiBUREE5ODg3X0lOVEVSQ0FSUklFUl9OVFNDKSAmJiAodC0+c3RkICYgVjRMMl9TVERfTlRTQykpCisJaWYgKCh0LT50ZGE5ODg3X2NvbmZpZyAmIFREQTk4ODdfSU5URVJDQVJSSUVSX05UU0MpICYmICh0LT5zdGQgJiBWNEwyX1NURF9OVFNDKSkKIAkJYnVmWzFdICY9IH5jUVNTOwogCXJldHVybiAwOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBjaGFyIHBhbFtdID0gIi0tIjsKLXN0YXRpYyBjaGFyIHNlY2FtW10gPSAiLS0iOwotc3RhdGljIGNoYXIgbnRzY1tdID0gIi0iOwotCi1tb2R1bGVfcGFyYW1fc3RyaW5nKHBhbCwgcGFsLCBzaXplb2YocGFsKSwgMDY0NCk7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKHNlY2FtLCBzZWNhbSwgc2l6ZW9mKHNlY2FtKSwgMDY0NCk7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKG50c2MsIG50c2MsIHNpemVvZihudHNjKSwgMDY0NCk7Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19maXh1cF9zdGQoc3RydWN0IHRkYTk4ODcgKnQpCi17Ci0JLyogZ2V0IG1vcmUgcHJlY2lzZSBub3JtIGluZm8gZnJvbSBpbnNtb2Qgb3B0aW9uICovCi0JaWYgKCh0LT5zdGQgJiBWNEwyX1NURF9QQUwpID09IFY0TDJfU1REX1BBTCkgewotCQlzd2l0Y2ggKHBhbFswXSkgewotCQljYXNlICdiJzoKLQkJY2FzZSAnQic6Ci0JCWNhc2UgJ2cnOgotCQljYXNlICdHJzoKLQkJY2FzZSAnaCc6Ci0JCWNhc2UgJ0gnOgotCQljYXNlICduJzoKLQkJY2FzZSAnTic6Ci0JCQlpZiAocGFsWzFdID09ICdjJyB8fCBwYWxbMV0gPT0gJ0MnKSB7Ci0JCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1OY1xuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfUEFMX05jOwotCQkJfSBlbHNlIHsKLQkJCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBQQUwgPT4gUEFMLUJHSE5cbiIpOwotCQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9CRyB8IFY0TDJfU1REX1BBTF9IIHwgVjRMMl9TVERfUEFMX047Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSAnaSc6Ci0JCWNhc2UgJ0knOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1JXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9JOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2QnOgotCQljYXNlICdEJzoKLQkJY2FzZSAnayc6Ci0JCWNhc2UgJ0snOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1ES1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9QQUxfREs7Ci0JCQlicmVhazsKLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ00nOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogUEFMID0+IFBBTC1NXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX1BBTF9NOwotCQkJYnJlYWs7Ci0JCWNhc2UgJy0nOgotCQkJLyogZGVmYXVsdCBwYXJhbWV0ZXIsIGRvIG5vdGhpbmcgKi8KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdGRhOTg4N19pbmZvKCJwYWw9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgodC0+c3RkICYgVjRMMl9TVERfU0VDQU0pID09IFY0TDJfU1REX1NFQ0FNKSB7Ci0JCXN3aXRjaCAoc2VjYW1bMF0pIHsKLQkJY2FzZSAnYic6Ci0JCWNhc2UgJ0InOgotCQljYXNlICdnJzoKLQkJY2FzZSAnRyc6Ci0JCWNhc2UgJ2gnOgotCQljYXNlICdIJzoKLQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUJHSFxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9CIHwgVjRMMl9TVERfU0VDQU1fRyB8IFY0TDJfU1REX1NFQ0FNX0g7Ci0JCQlicmVhazsKLQkJY2FzZSAnZCc6Ci0JCWNhc2UgJ0QnOgotCQljYXNlICdrJzoKLQkJY2FzZSAnSyc6Ci0JCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBTRUNBTSA9PiBTRUNBTS1ES1xuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9ESzsKLQkJCWJyZWFrOwotCQljYXNlICdsJzoKLQkJY2FzZSAnTCc6Ci0JCQlpZiAoc2VjYW1bMV0gPT0gJ2MnIHx8IHNlY2FtWzFdID09ICdDJykgewotCQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IFNFQ0FNID0+IFNFQ0FNLUwnXG4iKTsKLQkJCQl0LT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MQzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogU0VDQU0gPT4gU0VDQU0tTFxuIik7Ci0JCQkJdC0+c3RkID0gVjRMMl9TVERfU0VDQU1fTDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICctJzoKLQkJCS8qIGRlZmF1bHQgcGFyYW1ldGVyLCBkbyBub3RoaW5nICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXRkYTk4ODdfaW5mbygic2VjYW09IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICgodC0+c3RkICYgVjRMMl9TVERfTlRTQykgPT0gVjRMMl9TVERfTlRTQykgewotCQlzd2l0Y2ggKG50c2NbMF0pIHsKLQkJY2FzZSAnbSc6Ci0JCWNhc2UgJ00nOgotCQkJdGRhOTg4N19kYmcoImluc21vZCBmaXh1cDogTlRTQyA9PiBOVFNDLU1cbiIpOwotCQkJdC0+c3RkID0gVjRMMl9TVERfTlRTQ19NOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2onOgotCQljYXNlICdKJzoKLQkJCXRkYTk4ODdfZGJnKCJpbnNtb2QgZml4dXA6IE5UU0MgPT4gTlRTQ19NX0pQXG4iKTsKLQkJCXQtPnN0ZCA9IFY0TDJfU1REX05UU0NfTV9KUDsKLQkJCWJyZWFrOwotCQljYXNlICdrJzoKLQkJY2FzZSAnSyc6Ci0JCQl0ZGE5ODg3X2RiZygiaW5zbW9kIGZpeHVwOiBOVFNDID0+IE5UU0NfTV9LUlxuIik7Ci0JCQl0LT5zdGQgPSBWNEwyX1NURF9OVFNDX01fS1I7Ci0JCQlicmVhazsKLQkJY2FzZSAnLSc6Ci0JCQkvKiBkZWZhdWx0IHBhcmFtZXRlciwgZG8gbm90aGluZyAqLwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQl0ZGE5ODg3X2luZm8oIm50c2M9IGFyZ3VtZW50IG5vdCByZWNvZ25pc2VkXG4iKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRkYTk4ODdfc3RhdHVzKHN0cnVjdCB0ZGE5ODg3ICp0KQorc3RhdGljIGludCB0ZGE5ODg3X3N0YXR1cyhzdHJ1Y3QgdHVuZXIgKnQpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbMV07CiAJaW50IHJjOwogCiAJbWVtc2V0KGJ1ZiwwLHNpemVvZihidWYpKTsKLQlpZiAoMSAhPSAocmMgPSBpMmNfbWFzdGVyX3JlY3YoJnQtPmNsaWVudCxidWYsMSkpKQorCWlmICgxICE9IChyYyA9IGkyY19tYXN0ZXJfcmVjdigmdC0+aTJjLGJ1ZiwxKSkpCiAJCXRkYTk4ODdfaW5mbygiaTJjIGkvbyBlcnJvcjogcmMgPT0gJWQgKHNob3VsZCBiZSAxKVxuIixyYyk7CiAJZHVtcF9yZWFkX21lc3NhZ2UodCwgYnVmKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZGE5ODg3X2NvbmZpZ3VyZShzdHJ1Y3QgdGRhOTg4NyAqdCkKK3N0YXRpYyB2b2lkIHRkYTk4ODdfY29uZmlndXJlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IHJjOwogCi0JbWVtc2V0KHQtPmRhdGEsMCxzaXplb2YodC0+ZGF0YSkpOwotCXRkYTk4ODdfc2V0X3R2bm9ybSh0LHQtPmRhdGEpOworCW1lbXNldCh0LT50ZGE5ODg3X2RhdGEsMCxzaXplb2YodC0+dGRhOTg4N19kYXRhKSk7CisJdGRhOTg4N19zZXRfdHZub3JtKHQsdC0+dGRhOTg4N19kYXRhKTsKIAogCS8qIEEgbm90ZSBvbiB0aGUgcG9ydCBzZXR0aW5nczoKIAkgICBUaGVzZSBzZXR0aW5ncyB0ZW5kIHRvIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWNzIG9mIHRoZSBib2FyZC4KQEAgLTY2NywyNDkgKzUxOSw4NCBAQAogCSAgIHRoZSBwb3J0cyBzaG91bGQgYmUgc2V0IHRvIGFjdGl2ZSAoMCksIGJ1dCwgYWdhaW4sIHRoYXQgbWF5CiAJICAgZGlmZmVyIGRlcGVuZGluZyBvbiB0aGUgcHJlY2lzZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uLgogCSAqLwotCXQtPmRhdGFbMV0gfD0gY091dHB1dFBvcnQxSW5hY3RpdmU7Ci0JdC0+ZGF0YVsxXSB8PSBjT3V0cHV0UG9ydDJJbmFjdGl2ZTsKKwl0LT50ZGE5ODg3X2RhdGFbMV0gfD0gY091dHB1dFBvcnQxSW5hY3RpdmU7CisJdC0+dGRhOTg4N19kYXRhWzFdIHw9IGNPdXRwdXRQb3J0MkluYWN0aXZlOwogCi0JdGRhOTg4N19zZXRfY29uZmlnKHQsdC0+ZGF0YSk7Ci0JdGRhOTg4N19zZXRfaW5zbW9kKHQsdC0+ZGF0YSk7CisJdGRhOTg4N19zZXRfY29uZmlnKHQsdC0+dGRhOTg4N19kYXRhKTsKKwl0ZGE5ODg3X3NldF9pbnNtb2QodCx0LT50ZGE5ODg3X2RhdGEpOwogCiAJaWYgKHQtPm1vZGUgPT0gVF9TVEFOREJZKSB7Ci0JCXQtPmRhdGFbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOworCQl0LT50ZGE5ODg3X2RhdGFbMV0gfD0gY0ZvcmNlZE11dGVBdWRpb09OOwogCX0KIAogCXRkYTk4ODdfZGJnKCJ3cml0aW5nOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwKLQkJdC0+ZGF0YVsxXSx0LT5kYXRhWzJdLHQtPmRhdGFbM10pOwotCWlmIChkZWJ1ZyA+IDEpCi0JCWR1bXBfd3JpdGVfbWVzc2FnZSh0LCB0LT5kYXRhKTsKKwkJdC0+dGRhOTg4N19kYXRhWzFdLHQtPnRkYTk4ODdfZGF0YVsyXSx0LT50ZGE5ODg3X2RhdGFbM10pOworCWlmICh0dW5lcl9kZWJ1ZyA+IDEpCisJCWR1bXBfd3JpdGVfbWVzc2FnZSh0LCB0LT50ZGE5ODg3X2RhdGEpOwogCi0JaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKCZ0LT5jbGllbnQsdC0+ZGF0YSw0KSkpCisJaWYgKDQgIT0gKHJjID0gaTJjX21hc3Rlcl9zZW5kKCZ0LT5pMmMsdC0+dGRhOTg4N19kYXRhLDQpKSkKIAkJdGRhOTg4N19pbmZvKCJpMmMgaS9vIGVycm9yOiByYyA9PSAlZCAoc2hvdWxkIGJlIDQpXG4iLHJjKTsKIAotCWlmIChkZWJ1ZyA+IDIpIHsKKwlpZiAodHVuZXJfZGVidWcgPiAyKSB7CiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKDEwMDApOwogCQl0ZGE5ODg3X3N0YXR1cyh0KTsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIGludCB0ZGE5ODg3X2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIGludCBhZGRyLCBpbnQga2luZCkKK3N0YXRpYyB2b2lkIHRkYTk4ODdfdHVuZXJfc3RhdHVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHRkYTk4ODcgKnQ7CisJc3RydWN0IHR1bmVyICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdGRhOTg4N19pbmZvKCJEYXRhIGJ5dGVzOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwgdC0+dGRhOTg4N19kYXRhWzFdLCB0LT50ZGE5ODg3X2RhdGFbMl0sIHQtPnRkYTk4ODdfZGF0YVszXSk7Cit9CiAKLQljbGllbnRfdGVtcGxhdGUuYWRhcHRlciA9IGFkYXA7Ci0JY2xpZW50X3RlbXBsYXRlLmFkZHIgICAgPSBhZGRyOworc3RhdGljIGludCB0ZGE5ODg3X2dldF9hZmMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdGF0aWMgaW50IEFGQ19CSVRTXzJfa0h6W10gPSB7CisJCS0xMjUwMCwgIC0zNzUwMCwgIC02MjUwMCwgIC05NzUwMCwKKwkJLTExMjUwMCwgLTEzNzUwMCwgLTE2MjUwMCwgLTE4NzUwMCwKKwkJMTg3NTAwLCAgMTYyNTAwLCAgMTM3NTAwLCAgMTEyNTAwLAorCQk5NzUwMCAsICA2MjUwMCwgICAzNzUwMCAsICAxMjUwMAorCX07CisJaW50IGFmYz0wOworCV9fdTggcmVnID0gMDsKIAotCWlmIChOVUxMID09ICh0ID0ga3phbGxvYyhzaXplb2YoKnQpLCBHRlBfS0VSTkVMKSkpCi0JCXJldHVybiAtRU5PTUVNOworCWlmICgxID09IGkyY19tYXN0ZXJfcmVjdigmdC0+aTJjLCZyZWcsMSkpCisJCWFmYyA9IEFGQ19CSVRTXzJfa0h6WyhyZWc+PjEpJjB4MGZdOwogCi0JdC0+Y2xpZW50ICAgICAgPSBjbGllbnRfdGVtcGxhdGU7Ci0JdC0+c3RkICAgICAgICAgPSAwOwotCXQtPnJhZGlvX21vZGUgPSBWNEwyX1RVTkVSX01PREVfU1RFUkVPOworCXJldHVybiBhZmM7Cit9CiAKLQl0ZGE5ODg3X2luZm8oImNoaXAgZm91bmQgQCAweCV4ICglcylcbiIsIGFkZHI8PDEsIGFkYXAtPm5hbWUpOworc3RhdGljIHZvaWQgdGRhOTg4N19zdGFuZGJ5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJdGRhOTg4N19jb25maWd1cmUoY2xpZW50KTsKK30KIAotCWkyY19zZXRfY2xpZW50ZGF0YSgmdC0+Y2xpZW50LCB0KTsKLQlpMmNfYXR0YWNoX2NsaWVudCgmdC0+Y2xpZW50KTsKK3N0YXRpYyB2b2lkIHRkYTk4ODdfc2V0X2ZyZXEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgaW50IGZyZXEpCit7CisJdGRhOTg4N19jb25maWd1cmUoY2xpZW50KTsKK30KKworaW50IHRkYTk4ODdfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKK3sKKwlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CisKKwlzdHJsY3B5KGMtPm5hbWUsICJ0ZGE5ODg3Iiwgc2l6ZW9mKGMtPm5hbWUpKTsKKworCXRkYTk4ODdfaW5mbygidGRhOTg4WzUvNi83XSBmb3VuZCBAIDB4JXggKCVzKVxuIiwgdC0+aTJjLmFkZHIsCisJCQkJCQl0LT5pMmMuZHJpdmVyLT5kcml2ZXIubmFtZSk7CisKKwl0LT5zZXRfdHZfZnJlcSA9IHRkYTk4ODdfc2V0X2ZyZXE7CisJdC0+c2V0X3JhZGlvX2ZyZXEgPSB0ZGE5ODg3X3NldF9mcmVxOworCXQtPnN0YW5kYnkgPSB0ZGE5ODg3X3N0YW5kYnk7CisJdC0+dHVuZXJfc3RhdHVzPXRkYTk4ODdfdHVuZXJfc3RhdHVzOworCXQtPmdldF9hZmM9dGRhOTg4N19nZXRfYWZjOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGRhOTg4N19wcm9iZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCi17Ci0JaWYgKGFkYXAtPmNsYXNzICYgSTJDX0NMQVNTX1RWX0FOQUxPRykKLQkJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCB0ZGE5ODg3X2F0dGFjaCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgdGRhOTg4NyAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKLQlrZnJlZSh0KTsKLQlyZXR1cm4gMDsKLX0KLQotI2RlZmluZSBTV0lUQ0hfVjRMMglpZiAoIXQtPnVzaW5nX3Y0bDIgJiYgZGVidWcpIFwKLQkJCSAgdGRhOTg4N19pbmZvKCJzd2l0Y2hpbmcgdG8gdjRsMlxuIik7IFwKLQkJCSAgdC0+dXNpbmdfdjRsMiA9IDE7Ci0jZGVmaW5lIENIRUNLX1Y0TDIJaWYgKHQtPnVzaW5nX3Y0bDIpIHsgaWYgKGRlYnVnKSBcCi0JCQkgIHRkYTk4ODdfaW5mbygiaWdub3JlIHY0bDEgY2FsbFxuIik7IFwKLQkJCSAgcmV0dXJuIDA7IH0KLQotc3RhdGljIGludAotdGRhOTg4N19jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgdGRhOTg4NyAqdCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQotCS8qIC0tLSBjb25maWd1cmF0aW9uIC0tLSAqLwotCWNhc2UgQVVEQ19TRVRfUkFESU86Ci0JewotCQl0LT5tb2RlID0gVF9SQURJTzsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFRVTkVSX1NFVF9TVEFOREJZOgotCXsKLQkJdC0+bW9kZSA9IFRfU1RBTkRCWTsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQljYXNlIFREQTk4ODdfU0VUX0NPTkZJRzoKLQl7Ci0JCWludCAqaSA9IGFyZzsKLQotCQl0LT5jb25maWcgPSAqaTsKLQkJdGRhOTg4N19jb25maWd1cmUodCk7Ci0JCWJyZWFrOwotCX0KLQkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KLQkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKLQkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCi0JY2FzZSBWSURJT0NTQ0hBTjoKLQl7Ci0JCXN0YXRpYyBjb25zdCB2NGwyX3N0ZF9pZCBtYXBbXSA9IHsKLQkJCVsgVklERU9fTU9ERV9QQUwgICBdID0gVjRMMl9TVERfUEFMLAotCQkJWyBWSURFT19NT0RFX05UU0MgIF0gPSBWNEwyX1NURF9OVFNDX00sCi0JCQlbIFZJREVPX01PREVfU0VDQU0gXSA9IFY0TDJfU1REX1NFQ0FNLAotCQkJWyA0IC8qIGJ0dHYgKi8gICAgIF0gPSBWNEwyX1NURF9QQUxfTSwKLQkJCVsgNSAvKiBidHR2ICovICAgICBdID0gVjRMMl9TVERfUEFMX04sCi0JCQlbIDYgLyogYnR0diAqLyAgICAgXSA9IFY0TDJfU1REX05UU0NfTV9KUCwKLQkJfTsKLQkJc3RydWN0IHZpZGVvX2NoYW5uZWwgKnZjID0gYXJnOwotCi0JCUNIRUNLX1Y0TDI7Ci0JCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKLQkJaWYgKHZjLT5ub3JtIDwgQVJSQVlfU0laRShtYXApKQotCQkJdC0+c3RkID0gbWFwW3ZjLT5ub3JtXTsKLQkJdGRhOTg4N19maXh1cF9zdGQodCk7Ci0JCXRkYTk4ODdfY29uZmlndXJlKHQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7Ci0KLQkJU1dJVENIX1Y0TDI7Ci0JCXQtPm1vZGUgPSBUX0FOQUxPR19UVjsKLQkJdC0+c3RkICAgPSAqaWQ7Ci0JCXRkYTk4ODdfZml4dXBfc3RkKHQpOwotCQl0ZGE5ODg3X2NvbmZpZ3VyZSh0KTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfRlJFUVVFTkNZOgotCXsKLQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmID0gYXJnOwotCi0JCVNXSVRDSF9WNEwyOwotCQlpZiAoVjRMMl9UVU5FUl9BTkFMT0dfVFYgPT0gZi0+dHlwZSkgewotCQkJaWYgKHQtPm1vZGUgPT0gVF9BTkFMT0dfVFYpCi0JCQkJcmV0dXJuIDA7Ci0JCQl0LT5tb2RlID0gVF9BTkFMT0dfVFY7Ci0JCX0KLQkJaWYgKFY0TDJfVFVORVJfUkFESU8gPT0gZi0+dHlwZSkgewotCQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykKLQkJCQlyZXR1cm4gMDsKLQkJCXQtPm1vZGUgPSBUX1JBRElPOwotCQl9Ci0JCXRkYTk4ODdfY29uZmlndXJlKHQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19UVU5FUjoKLQl7Ci0JCXN0YXRpYyBpbnQgQUZDX0JJVFNfMl9rSHpbXSA9IHsKLQkJCS0xMjUwMCwgIC0zNzUwMCwgIC02MjUwMCwgIC05NzUwMCwKLQkJCS0xMTI1MDAsIC0xMzc1MDAsIC0xNjI1MDAsIC0xODc1MDAsCi0JCQkxODc1MDAsICAxNjI1MDAsICAxMzc1MDAsICAxMTI1MDAsCi0JCQk5NzUwMCAsICA2MjUwMCwgICAzNzUwMCAsICAxMjUwMAotCQl9OwotCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7Ci0KLQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewotCQkJX191OCByZWcgPSAwOwotCQkJdHVuZXItPmFmYz0wOwotCQkJaWYgKDEgPT0gaTJjX21hc3Rlcl9yZWN2KCZ0LT5jbGllbnQsJnJlZywxKSkKLQkJCQl0dW5lci0+YWZjID0gQUZDX0JJVFNfMl9rSHpbKHJlZz4+MSkmMHgwZl07Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfVFVORVI6Ci0JewotCQlzdHJ1Y3QgdjRsMl90dW5lciogdHVuZXIgPSBhcmc7Ci0KLQkJaWYgKHQtPm1vZGUgPT0gVF9SQURJTykgewotCQkJdC0+cmFkaW9fbW9kZSA9IHR1bmVyLT5hdWRtb2RlOwotCQkJdGRhOTg4N19jb25maWd1cmUgKHQpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCXsKLQkJdGRhOTg4N19pbmZvKCJEYXRhIGJ5dGVzOiBiPTB4JTAyeCBjPTB4JTAyeCBlPTB4JTAyeFxuIiwgdC0+ZGF0YVsxXSwgdC0+ZGF0YVsyXSwgdC0+ZGF0YVszXSk7Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotCQkvKiBub3RoaW5nICovCi0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0ZGE5ODg3X3N1c3BlbmQoc3RydWN0IGRldmljZSAqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7Ci0Jc3RydWN0IHRkYTk4ODcgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0KLQl0ZGE5ODg3X2RiZygic3VzcGVuZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGRhOTg4N19yZXN1bWUoc3RydWN0IGRldmljZSAqIGRldikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOwotCXN0cnVjdCB0ZGE5ODg3ICp0ID0gaTJjX2dldF9jbGllbnRkYXRhKGMpOwotCi0JdGRhOTg4N19kYmcoInJlc3VtZVxuIik7Ci0JdGRhOTg4N19jb25maWd1cmUodCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkcml2ZXIgPSB7Ci0JLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1REQTk4ODcsCi0JLmF0dGFjaF9hZGFwdGVyID0gdGRhOTg4N19wcm9iZSwKLQkuZGV0YWNoX2NsaWVudCAgPSB0ZGE5ODg3X2RldGFjaCwKLQkuY29tbWFuZCAgICAgICAgPSB0ZGE5ODg3X2NvbW1hbmQsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgICAgPSAidGRhOTg4NyIsCi0JCS5zdXNwZW5kID0gdGRhOTg4N19zdXNwZW5kLAotCQkucmVzdW1lICA9IHRkYTk4ODdfcmVzdW1lLAotCX0sCi19Owotc3RhdGljIHN0cnVjdCBpMmNfY2xpZW50IGNsaWVudF90ZW1wbGF0ZSA9Ci17Ci0JLm5hbWUgICAgICA9ICJ0ZGE5ODg3IiwKLQkuZHJpdmVyICAgID0gJmRyaXZlciwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHRkYTk4ODdfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB0ZGE5ODg3X2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHRkYTk4ODdfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQodGRhOTg4N19jbGVhbnVwX21vZHVsZSk7Ci0KIC8qCiAgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90ZWE1NzY3LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwppbmRleCBjMmI5OGY4Li5kMWM0MTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RlYTU3NjcuYwpAQCAtMyw3ICszLDcgQEAKICAqIEkyQyBhZGRyZXNzIGlzIGFsbHdheXMgMHhDMC4KICAqCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA1IE1hdXJvIENhcnZhbGhvIENoZWhhYiAobWNoZWhhYkBicnR1cmJvLmNvbS5icikKKyAqIENvcHlyaWdodCAoYykgMjAwNSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgKG1jaGVoYWJAaW5mcmFkZWFkLm9yZykKICAqIFRoaXMgY29kZSBpcyBwbGFjZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICoKICAqIHRlYTU3NjcgYXV0b2RldGVjdGlvbiB0aGFua3MgdG8gVG9yc3RlbiBTZWVib3RoIGFuZCBBdHN1c2hpIE5ha2FnYXdhCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsdjMyMGFpYzIzYi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmIyZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90bHYzMjBhaWMyM2IuYwpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIHRsdjMyMGFpYzIzYiAtIGRyaXZlciB2ZXJzaW9uIDAuMC4xCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IFNjb3R0IEFsZnRlciA8c2FsZnRlckBzc2FpLnVzPgorICoKKyAqIEJhc2VkIG9uIHdtODc3NSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVWxmIEVrbHVuZCA8aXZ0diBhdCBla2x1bmQudG8+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1pZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJ0bHYzMjBhaWMyM2IgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTY290dCBBbGZ0ZXIsIFVsZiBFa2x1bmQsIEhhbnMgVmVya3VpbCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDM0ID4+IDEsIEkyQ19DTElFTlRfRU5EIH07CisKKworSTJDX0NMSUVOVF9JTlNNT0Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgeworCXU4IG11dGVkOworfTsKKworc3RhdGljIGludCB0bHYzMjBhaWMyM2Jfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlpbnQgaTsKKworCWlmICgocmVnIDwgMCB8fCByZWcgPiA5KSAmJiAocmVnICE9IDE1KSkgeworCQl2NGxfZXJyKGNsaWVudCwgIkludmFsaWQgcmVnaXN0ZXIgUiVkXG4iLCByZWcpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIChyZWcgPDwgMSkgfAorCQkJCQkodmFsID4+IDgpLCB2YWwgJiAweGZmKSA9PSAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwl2NGxfZXJyKGNsaWVudCwgIkkyQzogY2Fubm90IHdyaXRlICUwM3ggdG8gcmVnaXN0ZXIgUiVkXG4iLCB2YWwsIHJlZyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl9jb21tYW5kKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdGx2MzIwYWljMjNiX3N0YXRlICpzdGF0ZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7CisJdTMyKiBmcmVxID0gYXJnOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZJRElPQ19JTlRfQVVESU9fQ0xPQ0tfRlJFUToKKwkJc3dpdGNoICgqZnJlcSkgeworCQkJY2FzZSAzMjAwMDogLyogc2V0IHNhbXBsZSByYXRlIHRvIDMyIGtIeiAqLworCQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDE4KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDQxMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0NC4xIGtIeiAqLworCQkJCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDIyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDgwMDA6IC8qIHNldCBzYW1wbGUgcmF0ZSB0byA0OCBrSHogKi8KKwkJCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCA4LCAweDAwMCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfR19DVFJMOgorCQlpZiAoY3RybC0+aWQgIT0gVjRMMl9DSURfQVVESU9fTVVURSkKKwkJCXJldHVybiAtRUlOVkFMOworCQljdHJsLT52YWx1ZSA9IHN0YXRlLT5tdXRlZDsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ19TX0NUUkw6CisJCWlmIChjdHJsLT5pZCAhPSBWNEwyX0NJRF9BVURJT19NVVRFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlLT5tdXRlZCA9IGN0cmwtPnZhbHVlOworCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCAwLCAweDE4MCk7IC8qIG11dGUgYm90aCBjaGFubmVscyAqLworCQkvKiBzZXQgZ2FpbiBvbiBib3RoIGNoYW5uZWxzIHRvICszLjAgZEIgKi8KKwkJaWYgKCFzdGF0ZS0+bXV0ZWQpCisJCQl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCAwLCAweDExOSk7CisJCWJyZWFrOworCisJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKKwkJdjRsX2luZm8oY2xpZW50LCAiSW5wdXQ6ICVzXG4iLAorCQkJICAgIHN0YXRlLT5tdXRlZCA/ICJtdXRlZCIgOiAiYWN0aXZlIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBpMmMgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIEdlbmVyaWMgaTJjIHByb2JlCisgKiBjb25jZXJuaW5nIHRoZSBhZGRyZXNzZXM6IGkyYyB3YW50cyA3IGJpdCAod2l0aG91dCB0aGUgci93IGJpdCksIHNvICc+PjEnCisgKi8KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGkyY19kcml2ZXI7CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzLCBpbnQga2luZCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCB0bHYzMjBhaWMyM2Jfc3RhdGUgKnN0YXRlOworCisJLyogQ2hlY2sgaWYgdGhlIGFkYXB0ZXIgc3VwcG9ydHMgdGhlIG5lZWRlZCBmZWF0dXJlcyAqLworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBKSkKKwkJcmV0dXJuIDA7CisKKwljbGllbnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaTJjX2NsaWVudCksIEdGUF9LRVJORUwpOworCWlmIChjbGllbnQgPT0gMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5kcml2ZXIgPSAmaTJjX2RyaXZlcjsKKwlzbnByaW50ZihjbGllbnQtPm5hbWUsIHNpemVvZihjbGllbnQtPm5hbWUpIC0gMSwgInRsdjMyMGFpYzIzYiIpOworCisJdjRsX2luZm8oY2xpZW50LCAiY2hpcCBmb3VuZCBAIDB4JXggKCVzKVxuIiwgYWRkcmVzcyA8PCAxLCBhZGFwdGVyLT5uYW1lKTsKKworCXN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRsdjMyMGFpYzIzYl9zdGF0ZSksIEdGUF9LRVJORUwpOworCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCWtmcmVlKGNsaWVudCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzdGF0ZS0+bXV0ZWQgPSAwOworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHN0YXRlKTsKKworCS8qIGluaXRpYWxpemUgdGx2MzIwYWljMjNiICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgMTUsIDB4MDAwKTsJLyogUkVTRVQgKi8KKwl0bHYzMjBhaWMyM2Jfd3JpdGUoY2xpZW50LCA2LCAweDAwQSk7ICAgLyogdHVybiBvZmYgREFDICYgbWljIGlucHV0ICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgNywgMHgwNDkpOyAgIC8qIGxlZnQtanVzdGlmaWVkLCAyNC1iaXQsIG1hc3RlciBtb2RlICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgMCwgMHgxMTkpOyAgIC8qIHNldCBnYWluIG9uIGJvdGggY2hhbm5lbHMgdG8gKzMuMCBkQiAqLworCXRsdjMyMGFpYzIzYl93cml0ZShjbGllbnQsIDgsIDB4MDAwKTsgICAvKiBzZXQgc2FtcGxlIHJhdGUgdG8gNDgga0h6ICovCisJdGx2MzIwYWljMjNiX3dyaXRlKGNsaWVudCwgOSwgMHgwMDEpOyAgIC8qIGFjdGl2YXRlIGRpZ2l0YWwgaW50ZXJmYWNlICovCisKKwlpMmNfYXR0YWNoX2NsaWVudChjbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx2MzIwYWljMjNiX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+Y2xhc3MgJiBJMkNfQ0xBU1NfVFZfQU5BTE9HKQorCQlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIHRsdjMyMGFpYzIzYl9hdHRhY2gpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzYl9kZXRhY2goc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKwlpZiAoZXJyKSB7CisJCXJldHVybiBlcnI7CisJfQorCWtmcmVlKGNsaWVudCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogaTJjIGltcGxlbWVudGF0aW9uICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0bHYzMjBhaWMyM2IiLAorCX0sCisJLmlkICAgICAgICAgICAgID0gSTJDX0RSSVZFUklEX1RMVjMyMEFJQzIzQiwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB0bHYzMjBhaWMyM2JfcHJvYmUsCisJLmRldGFjaF9jbGllbnQgID0gdGx2MzIwYWljMjNiX2RldGFjaCwKKwkuY29tbWFuZCAgICAgICAgPSB0bHYzMjBhaWMyM2JfY29tbWFuZCwKK307CisKKworc3RhdGljIGludCBfX2luaXQgdGx2MzIwYWljMjNiX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRsdjMyMGFpYzIzYl9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZpMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodGx2MzIwYWljMjNiX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHRsdjMyMGFpYzIzYl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLTMwMzYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCmluZGV4IDc0YWI0OGMuLmJkZjUwNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItMzAzNi5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAKICNpbmNsdWRlIDxtZWRpYS90dW5lci5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCmluZGV4IDEwMTNiNGQuLmU5NTc5MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jCkBAIC0xOTksNyArMTk5LDcgQEAKIAkJaTJjX21hc3Rlcl9zZW5kKGMsIGJ1ZmZlciwgNCk7CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7Ci0JY2FzZSBUVU5FUl9MR19URFZTX0gwNjJGOgorCWNhc2UgVFVORVJfTEdfVERWU19IMDZYRjoKIAkJLyogU2V0IHRoZSBBdXhpbGlhcnkgQnl0ZS4gKi8KIAkJYnVmZmVyWzJdICY9IH4weDIwOwogCQlidWZmZXJbMl0gfD0gMHgxODsKQEAgLTIxNSw2ICsyMTUsOSBAQAogCQlpMmNfbWFzdGVyX3NlbmQoYyxidWZmZXIsNCk7CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CisJY2FzZSBUVU5FUl9UREE5ODg3OgorCQl0ZGE5ODg3X3R1bmVyX2luaXQoYyk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlZmF1bHRfdHVuZXJfaW5pdChjKTsKIAkJYnJlYWs7CkBAIC0yNDEsNiArMjQ0LDggQEAKIHsKIAlzdHJ1Y3QgdHVuZXIgKnQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7CiAKKwl0dW5lcl9kYmcoInNldCBhZGRyIGZvciB0eXBlICVpXG4iLCB0LT50eXBlKTsKKwogCWlmICggdC0+dHlwZSA9PSBVTlNFVCAmJiAoKHR1bl9zZXR1cC0+YWRkciA9PSBBRERSX1VOU0VUICYmCiAJCSh0LT5tb2RlX21hc2sgJiB0dW5fc2V0dXAtPm1vZGVfbWFzaykpIHx8CiAJCXR1bl9zZXR1cC0+YWRkciA9PSBjLT5hZGRyKSkgewpAQCAtNDM2LDYgKzQ0MSw3IEBACiAJdC0+cmFkaW9faWYyID0gMTA3MDAgKiAxMDAwOwkvKiAxMC43TUh6IC0gRk0gcmFkaW8gKi8KIAl0LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKIAl0LT5tb2RlX21hc2sgPSBUX1VOSU5JVElBTElaRUQ7CisJdC0+dHVuZXJfc3RhdHVzID0gdHVuZXJfc3RhdHVzOwogCWlmICh0dW5lcl9kZWJ1Z19vbGQpIHsKIAkJdHVuZXJfZGVidWcgPSB0dW5lcl9kZWJ1Z19vbGQ7CiAJCXByaW50ayhLRVJOX0VSUiAidHVuZXI6IHR1bmVyX2RlYnVnIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAyLjYuMTcuXG4iKTsKQEAgLTQ2MiwxMCArNDY4LDE0IEBACiAJCWNhc2UgMHg0YjoKIAkJCS8qIElmIGNoaXAgaXMgbm90IHRkYTgyOTAsIGRvbid0IHJlZ2lzdGVyLgogCQkJICAgc2luY2UgaXQgY2FuIGJlIHRkYTk4ODcqLwotCQkJaWYgKHRkYTgyOTBfcHJvYmUoJnQtPmkyYykgIT0gMCkgewotCQkJCXR1bmVyX2RiZygiY2hpcCBhdCBhZGRyICV4IGlzIG5vdCBhIHRkYTgyOTBcbiIsIGFkZHIpOwotCQkJCWtmcmVlKHQpOwotCQkJCXJldHVybiAwOworCQkJaWYgKHRkYTgyOTBfcHJvYmUoJnQtPmkyYykgPT0gMCkgeworCQkJCXR1bmVyX2RiZygiY2hpcCBhdCBhZGRyICV4IGlzIGEgdGRhODI5MFxuIiwgYWRkcik7CisJCQl9IGVsc2UgeworCQkJCS8qIERlZmF1bHQgaXMgYmVpbmcgdGRhOTg4NyAqLworCQkJCXQtPnR5cGUgPSBUVU5FUl9UREE5ODg3OworCQkJCXQtPm1vZGVfbWFzayA9IFRfUkFESU8gfCBUX0FOQUxPR19UViB8IFRfRElHSVRBTF9UVjsKKwkJCQl0LT5tb2RlID0gVF9TVEFOREJZOworCQkJCWdvdG8gcmVnaXN0ZXJfY2xpZW50OwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgMHg2MDoKQEAgLTU5Miw2ICs2MDIsNyBAQAogCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CiAJCWlmIChjaGVja19tb2RlKHQsICJUVU5FUl9TRVRfU1RBTkRCWSIpID09IEVJTlZBTCkKIAkJCXJldHVybiAwOworCQl0LT5tb2RlID0gVF9TVEFOREJZOwogCQlpZiAodC0+c3RhbmRieSkKIAkJCXQtPnN0YW5kYnkgKGNsaWVudCk7CiAJCWJyZWFrOwpAQCAtNjA0LDYgKzYxNSwxNCBAQAogCQkvKiBTaG91bGQgYmUgaW1wbGVtZW50ZWQsIHNpbmNlIGJ0dHYgY2FsbHMgaXQgKi8KIAkJdHVuZXJfZGJnKCJWSURJT0NTQVVESU8gbm90IGltcGxlbWVudGVkLlxuIik7CiAJCWJyZWFrOworCWNhc2UgVERBOTg4N19TRVRfQ09ORklHOgorCXsKKwkJaW50ICppID0gYXJnOworCisJCXQtPnRkYTk4ODdfY29uZmlnID0gKmk7CisJCXNldF9mcmVxKGNsaWVudCwgdC0+dHZfZnJlcSk7CisJCWJyZWFrOworCX0KIAkvKiAtLS0gdjRsIGlvY3RscyAtLS0gKi8KIAkvKiB0YWtlIGNhcmU6IGJ0dHYgZG9lcyB1c2Vyc3BhY2UgY29weWluZywgd2UnbGwgZ2V0IGEKIAkgICBrZXJuZWwgcG9pbnRlciBoZXJlLi4uICovCkBAIC03NDQsNiArNzYzLDggQEAKIAkJCXN3aXRjaF92NGwyKCk7CiAKIAkJCXR1bmVyLT50eXBlID0gdC0+bW9kZTsKKwkJCWlmICh0LT5nZXRfYWZjKQorCQkJCXR1bmVyLT5hZmM9dC0+Z2V0X2FmYyhjbGllbnQpOwogCQkJaWYgKHQtPm1vZGUgPT0gVjRMMl9UVU5FUl9BTkFMT0dfVFYpCiAJCQkJdHVuZXItPmNhcGFiaWxpdHkgfD0gVjRMMl9UVU5FUl9DQVBfTk9STTsKIAkJCWlmICh0LT5tb2RlICE9IFY0TDJfVFVORVJfUkFESU8pIHsKQEAgLTc4Nyw3ICs4MDgsOCBAQAogCQkJYnJlYWs7CiAJCX0KIAljYXNlIFZJRElPQ19MT0dfU1RBVFVTOgotCQl0dW5lcl9zdGF0dXMoY2xpZW50KTsKKwkJaWYgKHQtPnR1bmVyX3N0YXR1cykKKwkJCXQtPnR1bmVyX3N0YXR1cyhjbGllbnQpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXNpbXBsZS5jCmluZGV4IDVkN2FiZWQuLjZkYTZmODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1zaW1wbGUuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAKIAlzd2l0Y2ggKHQtPnR5cGUpIHsKIAkJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1FX01LMzoKLSAgICAJCWNhc2UgVFVORVJfUEhJTElQU19GTTEyMzZfTUszOgorCQljYXNlIFRVTkVSX1BISUxJUFNfRk0xMjM2X01LMzoKIAkJY2FzZSBUVU5FUl9QSElMSVBTX0ZNMTI1Nl9JSDM6CiAJCQlzdGVyZW8gPSAoKHN0YXR1cyAmIFRVTkVSX1NJR05BTCkgPT0gVFVORVJfU1RFUkVPX01LMyk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItdHlwZXMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItdHlwZXMuYwppbmRleCBhMWFlMDM2Li45ZDkyMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R1bmVyLXR5cGVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci10eXBlcy5jCkBAIC04NzQsNyArODc0LDcgQEAKIH07CiAKIAotLyogLS0tLS0tLS0tLS0tIFRVTkVSX0xHX1REVlNfSDA2MkYgLSBJTkZJTkVPTiBBVFNDIC0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tIFRVTkVSX0xHX1REVlNfSDA2WEYgLSBMRyBJTk5PVEVLIC8gSU5GSU5FT04gQVRTQyAtLS0tLSAqLwogCiBzdGF0aWMgc3RydWN0IHR1bmVyX3JhbmdlIHR1bmVyX3R1YTYwMzRfbnRzY19yYW5nZXNbXSA9IHsKIAl7IDE2ICogMTY1LjAwIC8qTUh6Ki8sIDB4OGUsIDB4MDEgfSwKQEAgLTg4Myw3ICs4ODMsNyBAQAogfTsKIAogCi1zdGF0aWMgc3RydWN0IHR1bmVyX3BhcmFtcyB0dW5lcl90dWE2MDM0X3BhcmFtc1tdID0geworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfbGdfdGR2c19oMDZ4Zl9wYXJhbXNbXSA9IHsKIAl7CiAJCS50eXBlICAgPSBUVU5FUl9QQVJBTV9UWVBFX05UU0MsCiAJCS5yYW5nZXMgPSB0dW5lcl90dWE2MDM0X250c2NfcmFuZ2VzLApAQCAtMTAyNCw2ICsxMDI0LDIyIEBACiAJfSwKIH07CiAKKy8qIC0tLS0tLS0tLS0tLSBUVU5FUl9TQU1TVU5HX1RDUEdfNjEyMVAzMEEgLSBTYW1zdW5nIFBBTCAtLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCB0dW5lcl9yYW5nZSB0dW5lcl9zYW1zdW5nX3RjcGdfNjEyMXAzMGFfcGFsX3Jhbmdlc1tdID0geworCXsgMTYgKiAxNDYuMjUgLypNSHoqLywgMHhjZSwgMHgwMSwgfSwKKwl7IDE2ICogNDI4LjUwIC8qTUh6Ki8sIDB4Y2UsIDB4MDIsIH0sCisJeyAxNiAqIDk5OS45OSAgICAgICAgLCAweGNlLCAweDA4LCB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0dW5lcl9wYXJhbXMgdHVuZXJfc2Ftc3VuZ190Y3BnXzYxMjFwMzBhX3BhcmFtc1tdID0geworCXsKKwkJLnR5cGUgICA9IFRVTkVSX1BBUkFNX1RZUEVfUEFMLAorCQkucmFuZ2VzID0gdHVuZXJfc2Ftc3VuZ190Y3BnXzYxMjFwMzBhX3BhbF9yYW5nZXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3NhbXN1bmdfdGNwZ182MTIxcDMwYV9wYWxfcmFuZ2VzKSwKKwl9LAorfTsKKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIHN0cnVjdCB0dW5lcnR5cGUgdHVuZXJzW10gPSB7CkBAIC0xMzU0LDEwICsxMzcwLDEwIEBACiAJCS5wYXJhbXMgPSB0dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFyYW1zLAogCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl9waGlsaXBzX2ZtZDEyMTZtZV9tazNfcGFyYW1zKSwKIAl9LAotCVtUVU5FUl9MR19URFZTX0gwNjJGXSA9IHsgLyogTEdJTk5PVEVLIEFUU0MgKi8KLQkJLm5hbWUgICA9ICJMRyBURFZTLUgwNjJGL1RVQTYwMzQiLAotCQkucGFyYW1zID0gdHVuZXJfdHVhNjAzNF9wYXJhbXMsCi0JCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3R1YTYwMzRfcGFyYW1zKSwKKwlbVFVORVJfTEdfVERWU19IMDZYRl0gPSB7IC8qIExHSU5OT1RFSyBBVFNDICovCisJCS5uYW1lICAgPSAiTEcgVERWUy1IMDZ4RiIsIC8qIEgwNjFGLCBIMDYyRiAmIEgwNjRGICovCisJCS5wYXJhbXMgPSB0dW5lcl9sZ190ZHZzX2gwNnhmX3BhcmFtcywKKwkJLmNvdW50ICA9IEFSUkFZX1NJWkUodHVuZXJfbGdfdGR2c19oMDZ4Zl9wYXJhbXMpLAogCX0sCiAJW1RVTkVSX1lNRUNfVFZGNjZUNV9CX0RGRl0gPSB7IC8qIFBoaWxpcHMgUEFMICovCiAJCS5uYW1lICAgPSAiWW1lYyBUVkY2NlQ1LUIvREZGIiwKQEAgLTE0MDAsNiArMTQxNiwxNiBAQAogCQkucGFyYW1zID0gdHVuZXJfdGhvbXNvbl9mZTY2MDBfcGFyYW1zLAogCQkuY291bnQgID0gQVJSQVlfU0laRSh0dW5lcl90aG9tc29uX2ZlNjYwMF9wYXJhbXMpLAogCX0sCisJW1RVTkVSX1NBTVNVTkdfVENQR182MTIxUDMwQV0gPSB7IC8qIFNhbXN1bmcgUEFMICovCisJCS5uYW1lICAgPSAiU2Ftc3VuZyBUQ1BHIDYxMjFQMzBBIiwKKwkJLnBhcmFtcyA9IHR1bmVyX3NhbXN1bmdfdGNwZ182MTIxcDMwYV9wYXJhbXMsCisJCS5jb3VudCAgPSBBUlJBWV9TSVpFKHR1bmVyX3NhbXN1bmdfdGNwZ182MTIxcDMwYV9wYXJhbXMpLAorCX0sCisJW1RVTkVSX1REQTk4ODddID0geyAvKiBQaGlsaXBzIFREQSA5ODg3IElGIFBMTCBEZW1vZHVsYXRvci4KKwkJCQlUaGlzIGNoaXAgaXMgcGFydCBvZiBzb21lIG1vZGVybiB0dW5lcnMgKi8KKwkJLm5hbWUgICA9ICJQaGlsaXBzIFREQTk4OFs1LDYsN10gSUYgUExMIERlbW9kdWxhdG9yIiwKKwkJLyogc2VlIHRkYTk4ODcuYyBmb3IgZGV0YWlscyAqLworCX0sCiB9OwogCiB1bnNpZ25lZCBjb25zdCBpbnQgdHVuZXJfY291bnQgPSBBUlJBWV9TSVpFKHR1bmVycyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2ZWVwcm9tLmMKaW5kZXggYjQ2M2U5OS4uMzBmOGQ4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dmVlcHJvbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZlZXByb20uYwpAQCAtMjAwLDcgKzIwMCw3IEBACiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyODZBIE1LNCJ9LAogCXsgVFVORVJfQUJTRU5ULCAgICAgICAgIlBoaWxpcHMgRlExMjE2TUUgTUs1In0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiUGhpbGlwcyBGUTEyMzYgTUs1In0sCi0JeyBUVU5FUl9BQlNFTlQsICAgICAgICAiU2Ftc3VuZyBUQ1BHXzYxMjFQMzBBIn0sCisJeyBUVU5FUl9TQU1TVU5HX1RDUEdfNjEyMVAzMEEsICJTYW1zdW5nIFRDUEcgNjEyMVAzMEEifSwKIAl7IFRVTkVSX1RDTF8yMDAyTUIsICAgICJUQ0wgMjAwMk1CXzNIIn0sCiAJeyBUVU5FUl9BQlNFTlQsICAgICAgICAiVENMIDIwMDJNSV8zSCJ9LAogCXsgVFVORVJfVENMXzIwMDJOLCAgICAgIlRDTCAyMDAyTiA1SCJ9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90dm1peGVyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwppbmRleCA5ZTg2Y2FlLi4xNjU0NTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2bWl4ZXIuYwpAQCAtMTk4LDEwICsxOTgsNiBAQAogCiAJLyogbG9jayBidHR2IGluIG1lbW9yeSB3aGlsZSB0aGUgbWl4ZXIgaXMgaW4gdXNlICAqLwogCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1peDsKLSNpZm5kZWYgSTJDX1BFQwotCWlmIChjbGllbnQtPmFkYXB0ZXItPmluY191c2UpCi0JCWNsaWVudC0+YWRhcHRlci0+aW5jX3VzZShjbGllbnQtPmFkYXB0ZXIpOwotI2VuZGlmCiAJaWYgKGNsaWVudC0+YWRhcHRlci0+b3duZXIpCiAJCXRyeV9tb2R1bGVfZ2V0KGNsaWVudC0+YWRhcHRlci0+b3duZXIpOwogCXJldHVybiAwOwpAQCAtMjE3LDEwICsyMTMsNiBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLSNpZm5kZWYgSTJDX1BFQwotCWlmIChjbGllbnQtPmFkYXB0ZXItPmRlY191c2UpCi0JCWNsaWVudC0+YWRhcHRlci0+ZGVjX3VzZShjbGllbnQtPmFkYXB0ZXIpOwotI2VuZGlmCiAJaWYgKGNsaWVudC0+YWRhcHRlci0+b3duZXIpCiAJCW1vZHVsZV9wdXQoY2xpZW50LT5hZGFwdGVyLT5vd25lcik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R2cDUxNTAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCmluZGV4IGRhYjQ5NzMuLmIxNjdmZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHZwNTE1MC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS90dnA1MTUwLmg+CiAKICNpbmNsdWRlICJ0dnA1MTUwX3JlZy5oIgogCkBAIC04OSw3ICs5MCw3IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAogCXY0bDJfc3RkX2lkIG5vcm07CS8qIEN1cnJlbnQgc2V0IHN0YW5kYXJkICovCi0JaW50IGlucHV0OworCXN0cnVjdCB2NGwyX3JvdXRpbmcgcm91dGU7CiAJaW50IGVuYWJsZTsKIAlpbnQgYnJpZ2h0OwogCWludCBjb250cmFzdDsKQEAgLTI4MywyOSArMjg0LDI2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCQkJQmFzaWMgZnVuY3Rpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWVudW0gdHZwNTE1MF9pbnB1dCB7Ci0JVFZQNTE1MF9BTkFMT0dfQ0gwID0gMCwKLQlUVlA1MTUwX1NWSURFTyA9IDEsCi0JVFZQNTE1MF9BTkFMT0dfQ0gxID0gMiwKLQlUVlA1MTUwX0JMQUNLX1NDUkVFTiA9IDgKLX07CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0dnA1MTUwX3NlbG11eChzdHJ1Y3QgaTJjX2NsaWVudCAqYywKLQkJCQkgIGVudW0gdHZwNTE1MF9pbnB1dCBpbnB1dCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0dnA1MTUwX3NlbG11eChzdHJ1Y3QgaTJjX2NsaWVudCAqYykKIHsKIAlpbnQgb3Btb2RlPTA7Ci0KIAlzdHJ1Y3QgdHZwNTE1MCAqZGVjb2RlciA9IGkyY19nZXRfY2xpZW50ZGF0YShjKTsKKwlpbnQgaW5wdXQgPSAwOwogCi0JaWYgKCFkZWNvZGVyLT5lbmFibGUpCi0JCWlucHV0IHw9IFRWUDUxNTBfQkxBQ0tfU0NSRUVOOworCWlmICgoZGVjb2Rlci0+cm91dGUub3V0cHV0ICYgVFZQNTE1MF9CTEFDS19TQ1JFRU4pIHx8ICFkZWNvZGVyLT5lbmFibGUpCisJCWlucHV0ID0gODsKIAogCXN3aXRjaCAoaW5wdXQpIHsKLQljYXNlIFRWUDUxNTBfQU5BTE9HX0NIMDoKLQljYXNlIFRWUDUxNTBfQU5BTE9HX0NIMToKKwljYXNlIFRWUDUxNTBfQ09NUE9TSVRFMToKKwkJaW5wdXQgfD0gMjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBUVlA1MTUwX0NPTVBPU0lURTA6CiAJCW9wbW9kZT0weDMwOwkJLyogVFYgTW9kZSAqLwogCQlicmVhazsKKwljYXNlIFRWUDUxNTBfU1ZJREVPOgogCWRlZmF1bHQ6CisJCWlucHV0IHw9IDE7CiAJCW9wbW9kZT0wOwkJLyogQXV0byBNb2RlICovCiAJCWJyZWFrOwogCX0KQEAgLTc5MCw3ICs3ODgsNyBAQAogCXR2cDUxNTBfdmRwX2luaXQoYywgdmJpX3JhbV9kZWZhdWx0KTsKIAogCS8qIFNlbGVjdHMgZGVjb2RlciBpbnB1dCAqLwotCXR2cDUxNTBfc2VsbXV4KGMsIGRlY29kZXItPmlucHV0KTsKKwl0dnA1MTUwX3NlbG11eChjKTsKIAogCS8qIEluaXRpYWxpemVzIFRWUDUxNTAgdG8gc3RyZWFtIGVuYWJsZWQgdmFsdWVzICovCiAJdHZwNTE1MF93cml0ZV9pbml0dGFiKGMsIHR2cDUxNTBfaW5pdF9lbmFibGUpOwpAQCAtODYwLDYgKzg1OCwyMSBAQAogCWNhc2UgVklESU9DX0lOVF9SRVNFVDoKIAkJdHZwNTE1MF9yZXNldChjKTsKIAkJYnJlYWs7CisJY2FzZSBWSURJT0NfSU5UX0dfVklERU9fUk9VVElORzoKKwl7CisJCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOworCisJCSpyb3V0ZSA9IGRlY29kZXItPnJvdXRlOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfSU5UX1NfVklERU9fUk9VVElORzoKKwl7CisJCXN0cnVjdCB2NGwyX3JvdXRpbmcgKnJvdXRlID0gYXJnOworCisJCWRlY29kZXItPnJvdXRlID0gKnJvdXRlOworCQl0dnA1MTUwX3NlbG11eChjKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgVklESU9DX1NfU1REOgogCQlpZiAoZGVjb2Rlci0+bm9ybSA9PSAqKHY0bDJfc3RkX2lkICopYXJnKQogCQkJYnJlYWs7CkBAIC0xMDYzLDcgKzEwNzYsNyBAQAogCXJ2ID0gaTJjX2F0dGFjaF9jbGllbnQoYyk7CiAKIAljb3JlLT5ub3JtID0gVjRMMl9TVERfQUxMOwkvKiBEZWZhdWx0IGlzIGF1dG9kZXRlY3QgKi8KLQljb3JlLT5pbnB1dCA9IDI7CisJY29yZS0+cm91dGUuaW5wdXQgPSBUVlA1MTUwX0NPTVBPU0lURTE7CiAJY29yZS0+ZW5hYmxlID0gMTsKIAljb3JlLT5icmlnaHQgPSAzMjc2ODsKIAljb3JlLT5jb250cmFzdCA9IDMyNzY4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9LY29uZmlnCmluZGV4IDM5MjY5YTIuLjU5ZmI4OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL0tjb25maWcKQEAgLTM2LDMgKzM2LDE1IEBACiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGtvbmljYXdjLgorCitjb25maWcgVVNCX1FVSUNLQ0FNX01FU1NFTkdFUgorCXRyaXN0YXRlICJVU0IgTG9naXRlY2ggUXVpY2tjYW0gTWVzc2VuZ2VyIgorCWRlcGVuZHMgb24gVVNCICYmIFZJREVPX0RFVgorCXNlbGVjdCBWSURFT19VU0JWSURFTworCS0tLWhlbHAtLS0KKwkgIFNheSBZIG9yIE0gaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIFVTQiBMb2dpdGVjaCBRdWlja2NhbQorCSAgTWVzc2VuZ2VyIHdlYmNhbS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcXVpY2tjYW1fbWVzc2VuZ2VyLgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby9NYWtlZmlsZQppbmRleCBiYjUyZWI4Li40YTFiMTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiBvYmotJChDT05GSUdfVVNCX0lCTUNBTSkgICAgICAgICs9IGlibWNhbS5vIHVsdHJhY2FtLm8KIG9iai0kKENPTkZJR19VU0JfS09OSUNBV0MpICAgICAgKz0ga29uaWNhd2Mubwogb2JqLSQoQ09ORklHX1VTQl9WSUNBTSkgICAgICAgICArPSB2aWNhbS5vCitvYmotJChDT05GSUdfVVNCX1FVSUNLQ0FNX01FU1NFTkdFUikJKz0gcXVpY2tjYW1fbWVzc2VuZ2VyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzE4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5jCkBAIC0wLDAgKzEsMTEyMCBAQAorLyoKKyAqIERyaXZlciBmb3IgTG9naXRlY2ggUXVpY2tjYW0gTWVzc2VuZ2VyIHVzYiB2aWRlbyBjYW1lcmEKKyAqIENvcHlyaWdodCAoQykgSmF5YSBLdW1hcgorICoKKyAqIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IENJUyhNKSBTZG4gQmhkLgorICogSGlzdG9yeToKKyAqIDA1LzA4LzIwMDYgLSBKYXlhIEt1bWFyCisgKiBJIHdyb3RlIHRoaXMgYmFzZWQgb24gdGhlIGtvbmljYXdjIGJ5IFNpbW9uIEV2YW5zLgorICogLQorICogRnVsbCBjcmVkaXQgZm9yIHJldmVyc2UgZW5naW5lZXJpbmcgYW5kIGNyZWF0aW5nIGFuIGluaXRpYWwKKyAqIHdvcmtpbmcgbGludXggZHJpdmVyIGZvciB0aGUgVlY2NDIyIGdvZXMgdG8gdGhlIHFjZS1nYSBwcm9qZWN0IGJ5CisgKiBUdXVra2EgVG9pdm9uZW4sIEpvY2hlbiBIb2VuaWNrZSwgUGV0ZXIgTWNDb25uZWxsLAorICogQ3Jpc3RpYW5vIERlIE1pY2hlbGUsIEdlb3JnIEFjaGVyLCBKZWFuLUZyZWRlcmljIENsZXJlIGFzIHdlbGwgYXMKKyAqIG90aGVycy4KKyAqIC0tLQorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JfaW5wdXQuaD4KKworI2luY2x1ZGUgInVzYnZpZGVvLmgiCisjaW5jbHVkZSAicXVpY2tjYW1fbWVzc2VuZ2VyLmgiCisKKy8qCisgKiBWZXJzaW9uIEluZm9ybWF0aW9uCisgKi8KKworI2lmZGVmIENPTkZJR19VU0JfREVCVUcKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIERFQlVHKG4sIGZvcm1hdCwgYXJnLi4uKSBcCisJaWYgKG4gPD0gZGVidWcpIHsJIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgX19GSUxFX18gIjolcygpOiAiIGZvcm1hdCAiXG4iLCBfX0ZVTkNUSU9OX18gLCAjIyBhcmcpOyBcCisJfQorI2Vsc2UKKyNkZWZpbmUgREVCVUcobiwgYXJnLi4uKQorc3RhdGljIGNvbnN0IGludCBkZWJ1ZyA9IDA7CisjZW5kaWYKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuMDEiCisjZGVmaW5lIERSSVZFUl9ERVNDICJMb2dpdGVjaCBRdWlja2NhbSBNZXNzZW5nZXIgVVNCIgorCisjZGVmaW5lIFVTQl9MT0dJVEVDSF9WRU5ET1JfSUQJMHgwNDZECisjZGVmaW5lIFVTQl9RQ01fUFJPRFVDVF9JRAkweDA4RjAKKworI2RlZmluZSBNQVhfQ0FNRVJBUwkxCisKKyNkZWZpbmUgTUFYX0NPTE9VUgkzMjc2OAorI2RlZmluZSBNQVhfSFVFCQkzMjc2OAorI2RlZmluZSBNQVhfQlJJR0hUTkVTUwkzMjc2OAorI2RlZmluZSBNQVhfQ09OVFJBU1QJMzI3NjgKKyNkZWZpbmUgTUFYX1dISVRFTkVTUwkzMjc2OAorCitzdGF0aWMgaW50IHNpemUgPSBTSVpFXzMyMFgyNDA7CitzdGF0aWMgaW50IGNvbG91ciA9IE1BWF9DT0xPVVI7CitzdGF0aWMgaW50IGh1ZSA9IE1BWF9IVUU7CitzdGF0aWMgaW50IGJyaWdodG5lc3MgPQlNQVhfQlJJR0hUTkVTUzsKK3N0YXRpYyBpbnQgY29udHJhc3QgPQlNQVhfQ09OVFJBU1Q7CitzdGF0aWMgaW50IHdoaXRlbmVzcyA9CU1BWF9XSElURU5FU1M7CisKK3N0YXRpYyBzdHJ1Y3QgdXNidmlkZW8gKmNhbXM7CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBxY21fdGFibGUgW10gPSB7CisJeyBVU0JfREVWSUNFKFVTQl9MT0dJVEVDSF9WRU5ET1JfSUQsIFVTQl9RQ01fUFJPRFVDVF9JRCkgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcWNtX3RhYmxlKTsKKworI2lmZGVmIENPTkZJR19JTlBVVAorc3RhdGljIHZvaWQgcWNtX3JlZ2lzdGVyX2lucHV0KHN0cnVjdCBxY20gKmNhbSwgc3RydWN0IHVzYl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisKKwl1c2JfbWFrZV9wYXRoKGRldiwgY2FtLT5pbnB1dF9waHlzbmFtZSwgc2l6ZW9mKGNhbS0+aW5wdXRfcGh5c25hbWUpKTsKKwlzdHJuY2F0KGNhbS0+aW5wdXRfcGh5c25hbWUsICIvaW5wdXQwIiwgc2l6ZW9mKGNhbS0+aW5wdXRfcGh5c25hbWUpKTsKKworCWNhbS0+aW5wdXQgPSBpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKKwlpZiAoIWlucHV0X2RldikgeworCQl3YXJuKCJpbnN1ZmZpY2llbnQgbWVtIGZvciBjYW0gaW5wdXQgZGV2aWNlIik7CisJCXJldHVybjsKKwl9CisKKwlpbnB1dF9kZXYtPm5hbWUgPSAiUUNNIGJ1dHRvbiI7CisJaW5wdXRfZGV2LT5waHlzID0gY2FtLT5pbnB1dF9waHlzbmFtZTsKKwl1c2JfdG9faW5wdXRfaWQoZGV2LCAmaW5wdXRfZGV2LT5pZCk7CisJaW5wdXRfZGV2LT5jZGV2LmRldiA9ICZkZXYtPmRldjsKKworCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVQoRVZfS0VZKTsKKwlpbnB1dF9kZXYtPmtleWJpdFtMT05HKEJUTl8wKV0gPSBCSVQoQlROXzApOworCisJaW5wdXRfZGV2LT5wcml2YXRlID0gY2FtOworCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGNhbS0+aW5wdXQpOworfQorCitzdGF0aWMgdm9pZCBxY21fdW5yZWdpc3Rlcl9pbnB1dChzdHJ1Y3QgcWNtICpjYW0pCit7CisJaWYgKGNhbS0+aW5wdXQpIHsKKwkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2UoY2FtLT5pbnB1dCk7CisJCWNhbS0+aW5wdXQgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgcWNtX3JlcG9ydF9idXR0b25zdGF0KHN0cnVjdCBxY20gKmNhbSkKK3sKKwlpZiAoY2FtLT5pbnB1dCkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGNhbS0+aW5wdXQsIEJUTl8wLCBjYW0tPmJ1dHRvbl9zdHMpOworCQlpbnB1dF9zeW5jKGNhbS0+aW5wdXQpOworCX0KK30KKworc3RhdGljIHZvaWQgcWNtX2ludF9pcnEoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB1dmQgKnV2ZCA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgcWNtICpjYW07CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm47CisKKwlpZiAoIXV2ZC0+c3RyZWFtaW5nKQorCQlyZXR1cm47CisKKwl1dmQtPnN0YXRzLnVyYl9jb3VudCsrOworCisJaWYgKHVyYi0+c3RhdHVzIDwgMCkKKwkJdXZkLT5zdGF0cy5pc29fZXJyX2NvdW50Kys7CisJZWxzZSB7CisJCWlmICh1cmItPmFjdHVhbF9sZW5ndGggPiAwICkgeworCQkJY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisJCQlpZiAoY2FtLT5idXR0b25fc3RzX2J1ZiA9PSAweDg4KQorCQkJCWNhbS0+YnV0dG9uX3N0cyA9IDB4MDsKKwkJCWVsc2UgaWYgKGNhbS0+YnV0dG9uX3N0c19idWYgPT0gMHg4MCkKKwkJCQljYW0tPmJ1dHRvbl9zdHMgPSAweDE7CisJCQlxY21fcmVwb3J0X2J1dHRvbnN0YXQoY2FtKTsKKwkJfQorCX0KKworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCA8IDApCisJCWVycigidXNiX3N1Ym1pdF91cmIgZXJyb3IgKCVkKSIsIHJldCk7Cit9CisKK3N0YXRpYyBpbnQgcWNtX3NldHVwX2lucHV0X2ludChzdHJ1Y3QgcWNtICpjYW0sIHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgZXJyZmxhZzsKKwl1c2JfZmlsbF9pbnRfdXJiKGNhbS0+YnV0dG9uX3VyYiwgdXZkLT5kZXYsCisJCQl1c2JfcmN2aW50cGlwZSh1dmQtPmRldiwgdXZkLT52aWRlb19lbmRwICsgMSksCisJCQkmY2FtLT5idXR0b25fc3RzX2J1ZiwKKwkJCTEsCisJCQlxY21faW50X2lycSwKKwkJCXV2ZCwgMTYpOworCisJZXJyZmxhZyA9IHVzYl9zdWJtaXRfdXJiKGNhbS0+YnV0dG9uX3VyYiwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycmZsYWcpCisJCWVyciAoInVzYl9zdWJtaXRfaW50IHJldCAlZCIsIGVycmZsYWcpOworCXJldHVybiBlcnJmbGFnOworfQorCitzdGF0aWMgdm9pZCBxY21fc3RvcF9pbnRfZGF0YShzdHJ1Y3QgcWNtICpjYW0pCit7CisJdXNiX2tpbGxfdXJiKGNhbS0+YnV0dG9uX3VyYik7Cit9CisKK3N0YXRpYyBpbnQgcWNtX2FsbG9jX2ludF91cmIoc3RydWN0IHFjbSAqY2FtKQoreworCWNhbS0+YnV0dG9uX3VyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWNhbS0+YnV0dG9uX3VyYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNtX2ZyZWVfaW50KHN0cnVjdCBxY20gKmNhbSkKK3sKKwlpZiAoY2FtLT5idXR0b25fdXJiKQorCQl1c2JfZnJlZV91cmIoY2FtLT5idXR0b25fdXJiKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfSU5QVVQgKi8KKworc3RhdGljIGludCBxY21fc3R2X3NldGIoc3RydWN0IHVzYl9kZXZpY2UgKmRldiwgdTE2IHJlZywgdTggdmFsKQoreworCWludCByZXQ7CisKKwkvKiB3ZSdsbCB3YWl0IHVwIHRvIDMgc2xpY2VzIGJ1dCBubyBtb3JlICovCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCTB4MDQsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJcmVnLCAwLCAmdmFsLCAxLCAzKkhaKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFjbV9zdHZfc2V0dyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1MTYgcmVnLCB1MTYgdmFsKQoreworCWludCByZXQ7CisKKwkvKiB3ZSdsbCB3YWl0IHVwIHRvIDMgc2xpY2VzIGJ1dCBubyBtb3JlICovCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKGRldiwgdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCTB4MDQsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJcmVnLCAwLCAmdmFsLCAyLCAzKkhaKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFjbV9zdHZfZ2V0dyhzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCByZWcsCisJCQkJCQkJX19sZTE2ICp2YWwpCit7CisJaW50IHJldDsKKworCS8qIHdlJ2xsIHdhaXQgdXAgdG8gMyBzbGljZXMgYnV0IG5vIG1vcmUgKi8KKwlyZXQgPSB1c2JfY29udHJvbF9tc2coZGV2LCB1c2JfcmN2Y3RybHBpcGUoZGV2LCAwKSwKKwkJMHgwNCwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX0RJUl9JTiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCXJlZywgMCwgdmFsLCAyLCAzKkhaKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFjbV9jYW1lcmFfb24oc3RydWN0IHV2ZCAqdXZkKQoreworCWludCByZXQ7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCBTVFZfSVNPX0VOQUJMRSwgMHgwMSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9jYW1lcmFfb2ZmKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgcmV0OworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgU1RWX0lTT19FTkFCTEUsIDB4MDApKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNtX2hzdjJyZ2IodTE2IGh1ZSwgdTE2IHNhdCwgdTE2IHZhbCwgdTE2ICpyLCB1MTYgKmcsIHUxNiAqYikKK3sKKwl1bnNpZ25lZCBpbnQgc2VnbWVudCwgdmFsc2F0OworCXNpZ25lZCBpbnQgICBoID0gKHNpZ25lZCBpbnQpIGh1ZTsKKwl1bnNpZ25lZCBpbnQgcyA9IChzYXQgLSAzMjc2OCkgKiAyOwkvKiByZXNjYWxlICovCisJdW5zaWduZWQgaW50IHYgPSB2YWw7CisJdW5zaWduZWQgaW50IHA7CisKKwkvKgorCXRoZSByZWdpc3RlcnMgY29udHJvbGluZyBnYWluIGFyZSA4IGJpdCBvZiB3aGljaAorCXdlIGFmZmVjdCBvbmx5IHRoZSBsYXN0IDQgYml0cyB3aXRoIG91ciBnYWluLgorCXdlIGtub3cgdGhhdCBpZiBzYXR1cmF0aW9uIGlzIDAsICh1bnNhdHVyYXRlZCkgdGhlbgorCXdlJ3JlIGdyYXlzY2FsZSAoY2VudGVyIGF4aXMgb2YgdGhlIGNvbG91ciBjb25lKSBzbworCXdlIHNldCByZ2I9dmFsdWUuIHdlIHVzZSBhIGZvcm11bGEgb2J0YWluZWQgZnJvbQorCXdpa2lwZWRpYSB0byBtYXAgdGhlIGNvbmUgdG8gdGhlIFJHQiBwbGFuZS4gaXQncworCWFzIGZvbGxvd3MgZm9yIHRoZSBodW1hbiB2YWx1ZSBjYXNlIG9mIGg9MC4uMzYwLAorCXM9MC4uMSwgdj0wLi4xCisJaF9pID0gaC82MCAlIDYgLCBmID0gaC82MCAtIGhfaSAsIHAgPSB2KDEtcykKKwlxID0gdigxIC0gZipzKSAsIHQgPSB2KDEgLSAoMS1mKXMpCisJaF9pPT0wID0+IHI9diAsIGc9dCwgYj1wCisJaF9pPT0xID0+IHI9cSAsIGc9diwgYj1wCisJaF9pPT0yID0+IHI9cCAsIGc9diwgYj10CisJaF9pPT0zID0+IHI9cCAsIGc9cSwgYj12CisJaF9pPT00ID0+IHI9dCAsIGc9cCwgYj12CisJaF9pPT01ID0+IHI9diAsIGc9cCwgYj1xCisJdGhlIGJvdHRvbSBzaWRlICh0aGUgcG9pbnQpIGFuZCB0aGUgc3R1ZmYganVzdCB1cAorCW9mIHRoYXQgaXMgYmxhY2sgc28gd2Ugc2ltcGxpZnkgdGhvc2UgdHdvIGNhc2VzLgorCSovCisJaWYgKHNhdCA8IDMyNzY4KSB7CisJCS8qIGFueXRoaW5nIGxlc3MgdGhhbiB0aGlzIGlzIHVuc2F0dXJhdGVkICovCisJCSpyID0gdmFsOworCQkqZyA9IHZhbDsKKwkJKmIgPSB2YWw7CisJCXJldHVybjsKKwl9CisJaWYgKHZhbCA8PSAoMHhGRkZGLzgpKSB7CisJCS8qIGFueXRoaW5nIGxlc3MgdGhhbiB0aGlzIGlzIGJsYWNrICovCisJCSpyID0gMDsKKwkJKmcgPSAwOworCQkqYiA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKiB0aGUgcmVzdCBvZiB0aGlzIGNvZGUgaXMgY29weWluZyB0dWtrYXQncworCWltcGxlbWVudGF0aW9uIG9mIHRoZSBoc3YycmdiIGNvbnZlcnNpb24gYXMgdGFrZW4KKwlmcm9tIHFjLXVzYi1tZXNzZW5nZXIgY29kZS4gdGhlIDEwOTIzIGlzIDB4RkZGRi82CisJdG8gZGl2aWRlIHRoZSBjb25lIGludG8gNiBzZWN0b3JzLiAgKi8KKworCXNlZ21lbnQgPSAoaCArIDEwOTIzKSAmIDB4RkZGRjsKKwlzZWdtZW50ID0gc2VnbWVudCozID4+IDE2OwkJLyogMC4uMjogMD1SLCAxPUcsIDI9QiAqLworCWh1ZSAtPSBzZWdtZW50ICogMjE4NDU7CQkJLyogLTEwOTIzLi4xMDkyMyAqLworCWggPSBodWU7CisJaCAqPSAzOworCXZhbHNhdCA9IHYqcyA+PiAxNjsJCQkvKiAwLi42NTUzNCAqLworCXAgPSB2IC0gdmFsc2F0OworCWlmIChoID49IDApIHsKKwkJdW5zaWduZWQgaW50IHQgPSB2IC0gKHZhbHNhdCAqICgzMjc2OSAtIGgpID4+IDE1KTsKKwkJc3dpdGNoIChzZWdtZW50KSB7CisJCWNhc2UgMDoJLyogUi0+ICovCisJCQkqciA9IHY7CisJCQkqZyA9IHQ7CisJCQkqYiA9IHA7CisJCQlicmVhazsKKwkJY2FzZSAxOgkvKiBHLT4gKi8KKwkJCSpyID0gcDsKKwkJCSpnID0gdjsKKwkJCSpiID0gdDsKKwkJCWJyZWFrOworCQljYXNlIDI6CS8qIEItPiAqLworCQkJKnIgPSB0OworCQkJKmcgPSBwOworCQkJKmIgPSB2OworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgcSA9IHYgLSAodmFsc2F0ICogKDMyNzY5ICsgaCkgPj4gMTUpOworCQlzd2l0Y2ggKHNlZ21lbnQpIHsKKwkJY2FzZSAwOgkvKiAtPlIgKi8KKwkJCSpyID0gdjsKKwkJCSpnID0gcDsKKwkJCSpiID0gcTsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIC0+RyAqLworCQkJKnIgPSBxOworCQkJKmcgPSB2OworCQkJKmIgPSBwOworCQkJYnJlYWs7CisJCWNhc2UgMjoJLyogLT5CICovCisJCQkqciA9IHA7CisJCQkqZyA9IHE7CisJCQkqYiA9IHY7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBxY21fc2Vuc29yX3NldF9nYWlucyhzdHJ1Y3QgdXZkICp1dmQsIHUxNiBodWUsCisJdTE2IHNhdHVyYXRpb24sIHUxNiB2YWx1ZSkKK3sKKwlpbnQgcmV0OworCXUxNiByPTAsZz0wLGI9MDsKKworCS8qIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBxYy11c2ItbWVzc2VuZ2VyICovCisJcWNtX2hzdjJyZ2IoaHVlLCBzYXR1cmF0aW9uLCB2YWx1ZSwgJnIsICZnLCAmYik7CisKKwlyID4+PSAxMjsKKwlnID4+PSAxMjsKKwliID4+PSAxMjsKKworCS8qIG1pbiB2YWwgaXMgOCAqLworCXIgPSBtYXgoKHUxNikgOCwgcik7CisJZyA9IG1heCgodTE2KSA4LCBnKTsKKwliID0gbWF4KCh1MTYpIDgsIGIpOworCisJciB8PSAweDMwOworCWcgfD0gMHgzMDsKKwliIHw9IDB4MzA7CisKKwkvKiBzZXQgdGhlIHIsZyxiIGdhaW4gcmVnaXN0ZXJzICovCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDA1MDksIHIpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwQSwgZykpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgwNTBCLCBiKSk7CisKKwkvKiBkb2luZyBhcyBxYy11c2IgZGlkICovCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDA1MEMsIDB4MkEpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MDUwRCwgMHgwMSkpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNDNGLCAweDAxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY21fc2Vuc29yX3NldF9leHBvc3VyZShzdHJ1Y3QgdXZkICp1dmQsIGludCBleHBvc3VyZSkKK3sKKwlpbnQgcmV0OworCWludCBmb3JtZWR2YWw7CisKKwkvKiBjYWxjdWxhdGlvbiB3YXMgZnJvbSBxYy11c2ItbWVzc2VuZ2VyIGRyaXZlciAqLworCWZvcm1lZHZhbCA9ICggZXhwb3N1cmUgPj4gMTIgKTsKKworCS8qIG1heCB2YWx1ZSBmb3IgZm9ybWVkdmFsIGlzIDE0ICovCisJZm9ybWVkdmFsID0gbWluKGZvcm1lZHZhbCwgMTQpOworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LAorCQkJMHgxNDNBLCAweEYwIHwgZm9ybWVkdmFsKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0YsIDB4MDEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY21fc2Vuc29yX3NldGxldmVscyhzdHJ1Y3QgdXZkICp1dmQsIGludCBicmlnaHRuZXNzLCBpbnQgY29udHJhc3QsCisJCQkJCWludCBodWUsIGludCBjb2xvdXIpCit7CisJaW50IHJldDsKKwkvKiBicmlnaHRuZXNzIGlzIGV4cG9zdXJlLCBjb250cmFzdCBpcyBnYWluLCBjb2xvdXIgaXMgc2F0dXJhdGlvbiAqLworCUNIRUNLX1JFVChyZXQsCisJCXFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHV2ZCwgYnJpZ2h0bmVzcykpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X2dhaW5zKHV2ZCwgaHVlLCBjb2xvdXIsIGNvbnRyYXN0KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY21fc2Vuc29yX3NldHNpemUoc3RydWN0IHV2ZCAqdXZkLCB1OCBzaXplKQoreworCWludCByZXQ7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTUwNSwgc2l6ZSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIoc3RydWN0IHV2ZCAqdXZkLCBpbnQgd2hpdGVuZXNzKQoreworCWludCByZXQ7CisJLyogc29tZSByZXNjYWxpbmcgYXMgZG9uZSBieSB0aGUgcWMtdXNiLW1lc3NlbmdlciBjb2RlICovCisJaWYgKHdoaXRlbmVzcyA+IDB4QzAwMCkKKwkJd2hpdGVuZXNzID0gMHhDMDAwICsgKHdoaXRlbmVzcyAmIDB4M0ZGRikqODsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNDNELAorCQkJCSh3aGl0ZW5lc3MgPj4gOCkgJiAweEZGKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0UsCisJCQkJKHdoaXRlbmVzcyA+PiAxNikgJiAweDAzKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LCAweDE0M0YsIDB4MDEpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZW5zb3JfaW5pdChzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpIDwgc2l6ZW9mKHJlZ3ZhbF90YWJsZSkvc2l6ZW9mKHJlZ3ZhbF90YWJsZVswXSkgOyBpKyspIHsKKwkJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXRiKHV2ZC0+ZGV2LAorCQkJCQlyZWd2YWxfdGFibGVbaV0ucmVnLAorCQkJCQlyZWd2YWxfdGFibGVbaV0udmFsKSk7CisJfQorCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3N0dl9zZXR3KHV2ZC0+ZGV2LCAweDE1YzEsCisJCQkJY3B1X3RvX2xlMTYoSVNPQ19QQUNLRVRfU0laRSkpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIDB4MTVjMywgMHgwOCkpOworCUNIRUNLX1JFVChyZXQsIHJldCA9IHFjbV9zdHZfc2V0Yih1dmQtPmRldiwgMHgxNDNmLCAweDAxKSk7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc3R2X3NldGIodXZkLT5kZXYsIFNUVl9JU09fRU5BQkxFLCAweDAwKSk7CisKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldHNpemUodXZkLCBjYW1lcmFfc2l6ZXNbY2FtLT5zaXplXS5jbWQpKTsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0bGV2ZWxzKHV2ZCwgdXZkLT52cGljLmJyaWdodG5lc3MsCisJCQl1dmQtPnZwaWMuY29udHJhc3QsIHV2ZC0+dnBpYy5odWUsIHV2ZC0+dnBpYy5jb2xvdXIpKTsKKworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIodXZkLCB1dmQtPnZwaWMud2hpdGVuZXNzKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRzaXplKHV2ZCwgY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uY21kKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY21fc2V0X2NhbWVyYV9zaXplKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRzaXplKHV2ZCwgY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uY21kKSk7CisJY2FtLT53aWR0aCA9IGNhbWVyYV9zaXplc1tjYW0tPnNpemVdLndpZHRoOworCWNhbS0+aGVpZ2h0ID0gY2FtZXJhX3NpemVzW2NhbS0+c2l6ZV0uaGVpZ2h0OworCXV2ZC0+dmlkZW9zaXplID0gVklERU9TSVpFKGNhbS0+d2lkdGgsIGNhbS0+aGVpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9zZXR1cF9vbl9vcGVuKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgcmV0OworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9zZXRfZ2FpbnModXZkLCB1dmQtPnZwaWMuaHVlLAorCQkJCXV2ZC0+dnBpYy5jb2xvdXIsIHV2ZC0+dnBpYy5jb250cmFzdCkpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zZW5zb3Jfc2V0X2V4cG9zdXJlKHV2ZCwgdXZkLT52cGljLmJyaWdodG5lc3MpKTsKKwlDSEVDS19SRVQocmV0LCBxY21fc2Vuc29yX3NldF9zaHV0dGVyKHV2ZCwgdXZkLT52cGljLndoaXRlbmVzcykpOworCUNIRUNLX1JFVChyZXQsIHFjbV9zZXRfY2FtZXJhX3NpemUodXZkKSk7CisJQ0hFQ0tfUkVUKHJldCwgcWNtX2NhbWVyYV9vbih1dmQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcWNtX2FkanVzdF9waWN0dXJlKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCisJcmV0ID0gcWNtX2NhbWVyYV9vZmYodXZkKTsKKwlpZiAocmV0KSB7CisJCWVycigiY2FuJ3QgdHVybiBjYW1lcmEgb2ZmLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gY29udHJhc3QsIGh1ZSwgb3IKKwljb2xvdXIgdGhlbiB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIGhzdiBpbiBvcmRlcgorCXRvIHVwZGF0ZSBnYWlucyAqLworCWlmICgoY2FtLT5jb250cmFzdCAhPSB1dmQtPnZwaWMuY29udHJhc3QpIHx8CisJCShjYW0tPmh1ZSAhPSB1dmQtPnZwaWMuaHVlKSB8fAorCQkoY2FtLT5jb2xvdXIgIT0gdXZkLT52cGljLmNvbG91cikpIHsKKwkJY2FtLT5jb250cmFzdCA9IHV2ZC0+dnBpYy5jb250cmFzdDsKKwkJY2FtLT5odWUgPSB1dmQtPnZwaWMuaHVlOworCQljYW0tPmNvbG91ciA9IHV2ZC0+dnBpYy5jb2xvdXI7CisJCXJldCA9IHFjbV9zZW5zb3Jfc2V0X2dhaW5zKHV2ZCwgY2FtLT5odWUsIGNhbS0+Y29sb3VyLAorCQkJCQkJY2FtLT5jb250cmFzdCk7CisJCWlmIChyZXQpIHsKKwkJCWVycigiY2FuJ3Qgc2V0IGdhaW5zLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoY2FtLT5icmlnaHRuZXNzICE9IHV2ZC0+dnBpYy5icmlnaHRuZXNzKSB7CisJCWNhbS0+YnJpZ2h0bmVzcyA9IHV2ZC0+dnBpYy5icmlnaHRuZXNzOworCQlyZXQgPSBxY21fc2Vuc29yX3NldF9leHBvc3VyZSh1dmQsIGNhbS0+YnJpZ2h0bmVzcyk7CisJCWlmIChyZXQpIHsKKwkJCWVycigiY2FuJ3Qgc2V0IGV4cG9zdXJlLiBhYmFuZG9uaW5nIHBpYyBhZGp1c3RtZW50Iik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoY2FtLT53aGl0ZW5lc3MgIT0gdXZkLT52cGljLndoaXRlbmVzcykgeworCQljYW0tPndoaXRlbmVzcyA9IHV2ZC0+dnBpYy53aGl0ZW5lc3M7CisJCXFjbV9zZW5zb3Jfc2V0X3NodXR0ZXIodXZkLCBjYW0tPndoaXRlbmVzcyk7CisJCWlmIChyZXQpIHsKKwkJCWVycigiY2FuJ3Qgc2V0IHNodXR0ZXIuIGFiYW5kb25pbmcgcGljIGFkanVzdG1lbnQiKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXJldCA9IHFjbV9jYW1lcmFfb24odXZkKTsKKwlpZiAocmV0KSB7CisJCWVycigiY2FuJ3QgcmVlbmFibGUgY2FtZXJhLiBwaWMgYWRqdXN0bWVudCBmYWlsZWQiKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBxY21fcHJvY2Vzc19mcmFtZShzdHJ1Y3QgdXZkICp1dmQsIHU4ICpjZGF0YSwgaW50IGZyYW1lbGVuKQoreworCWludCBkYXRhbGVuOworCWludCB0b3RhbGRhdGE7CisJc3RydWN0IGZyYW1laGRyIHsKKwkJX19iZTE2IGlkOworCQlfX2JlMTYgbGVuOworCX07CisJc3RydWN0IGZyYW1laGRyICpmaGRyOworCisJdG90YWxkYXRhID0gMDsKKwl3aGlsZSAoZnJhbWVsZW4pIHsKKwkJZmhkciA9IChzdHJ1Y3QgZnJhbWVoZHIgKikgY2RhdGE7CisJCWRhdGFsZW4gPSBiZTE2X3RvX2NwdShmaGRyLT5sZW4pOworCQlmcmFtZWxlbiAtPSA0OworCQljZGF0YSArPSA0OworCisJCWlmICgoZmhkci0+aWQpID09IGNwdV90b19iZTE2KDB4ODAwMSkpIHsKKwkJCVJpbmdRdWV1ZV9FbnF1ZXVlKCZ1dmQtPmRwLCBtYXJrZXIsIDQpOworCQkJdG90YWxkYXRhICs9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKGZoZHItPmlkICYgY3B1X3RvX2JlMTYoMHhGRjAwKSkgPT0gY3B1X3RvX2JlMTYoMHgwMjAwKSkgeworCQkJUmluZ1F1ZXVlX0VucXVldWUoJnV2ZC0+ZHAsIGNkYXRhLCBkYXRhbGVuKTsKKwkJCXRvdGFsZGF0YSArPSBkYXRhbGVuOworCQl9CisJCWZyYW1lbGVuIC09IGRhdGFsZW47CisJCWNkYXRhICs9IGRhdGFsZW47CisJfQorCXJldHVybiB0b3RhbGRhdGE7Cit9CisKK3N0YXRpYyBpbnQgcWNtX2NvbXByZXNzX2lzbyhzdHJ1Y3QgdXZkICp1dmQsIHN0cnVjdCB1cmIgKmRhdGF1cmIpCit7CisJaW50IHRvdGxlbjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpjZGF0YTsKKworCXRvdGxlbj0wOworCWZvciAoaSA9IDA7IGkgPCBkYXRhdXJiLT5udW1iZXJfb2ZfcGFja2V0czsgaSsrKSB7CisJCWludCBuID0gZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKKwkJaW50IHN0ID0gZGF0YXVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uc3RhdHVzOworCisJCWNkYXRhID0gZGF0YXVyYi0+dHJhbnNmZXJfYnVmZmVyICsKKwkJCWRhdGF1cmItPmlzb19mcmFtZV9kZXNjW2ldLm9mZnNldDsKKworCQlpZiAoc3QgPCAwKSB7CisJCQl3YXJuKCJEYXRhIGVycm9yOiBwYWNrZXQ9JWQuIGxlbj0lZC4gc3RhdHVzPSVkLiIsCisJCQkgICAgICBpLCBuLCBzdCk7CisJCQl1dmQtPnN0YXRzLmlzb19lcnJfY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghbikKKwkJCWNvbnRpbnVlOworCisJCXRvdGxlbiArPSBxY21fcHJvY2Vzc19mcmFtZSh1dmQsIGNkYXRhLCBuKTsKKwl9CisJcmV0dXJuIHRvdGxlbjsKK30KKworc3RhdGljIHZvaWQgcmVzdWJtaXRfdXJiKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVyYiAqdXJiKQoreworCWludCByZXQ7CisKKwl1cmItPmRldiA9IHV2ZC0+ZGV2OworCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJldCkKKwkJZXJyKCJ1c2Jfc3VibWl0X3VyYiBlcnJvciAoJWQpIiwgcmV0KTsKK30KKworc3RhdGljIHZvaWQgcWNtX2lzb2NfaXJxKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgdXZkICp1dmQgPSB1cmItPmNvbnRleHQ7CisKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKQorCQlyZXR1cm47CisKKwlpZiAoIXV2ZC0+c3RyZWFtaW5nKQorCQlyZXR1cm47CisKKwl1dmQtPnN0YXRzLnVyYl9jb3VudCsrOworCisJaWYgKCF1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJcmVzdWJtaXRfdXJiKHV2ZCwgdXJiKTsKKwkJcmV0dXJuOworCX0KKworCWxlbiA9IHFjbV9jb21wcmVzc19pc28odXZkLCB1cmIpOworCXJlc3VibWl0X3VyYih1dmQsIHVyYik7CisJdXZkLT5zdGF0cy51cmJfbGVuZ3RoID0gbGVuOworCXV2ZC0+c3RhdHMuZGF0YV9jb3VudCArPSBsZW47CisJaWYgKGxlbikKKwkJUmluZ1F1ZXVlX1dha2VVcEludGVycnVwdGlibGUoJnV2ZC0+ZHApOworfQorCitzdGF0aWMgaW50IHFjbV9zdGFydF9kYXRhKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKwlpbnQgaTsKKwlpbnQgZXJyZmxhZzsKKwlpbnQgcGt0c3o7CisJaW50IGVycjsKKworCXBrdHN6ID0gdXZkLT5pc29fcGFja2V0X2xlbjsKKwlpZiAoIUNBTUVSQV9JU19PUEVSQVRJT05BTCh1dmQpKSB7CisJCWVycigiQ2FtZXJhIGlzIG5vdCBvcGVyYXRpb25hbCIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZSh1dmQtPmRldiwgdXZkLT5pZmFjZSwgdXZkLT5pZmFjZUFsdEFjdGl2ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyKCJ1c2Jfc2V0X2ludGVyZmFjZSBlcnJvciIpOworCQl1dmQtPmxhc3RfZXJyb3IgPSBlcnI7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJaW50IGosIGs7CisJCXN0cnVjdCB1cmIgKnVyYiA9IHV2ZC0+c2J1ZltpXS51cmI7CisJCXVyYi0+ZGV2ID0gdXZkLT5kZXY7CisJCXVyYi0+Y29udGV4dCA9IHV2ZDsKKwkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHV2ZC0+ZGV2LCB1dmQtPnZpZGVvX2VuZHApOworCQl1cmItPmludGVydmFsID0gMTsKKwkJdXJiLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXIgPSB1dmQtPnNidWZbaV0uZGF0YTsKKwkJdXJiLT5jb21wbGV0ZSA9IHFjbV9pc29jX2lycTsKKwkJdXJiLT5udW1iZXJfb2ZfcGFja2V0cyA9IEZSQU1FU19QRVJfREVTQzsKKwkJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gcGt0c3ogKiBGUkFNRVNfUEVSX0RFU0M7CisJCWZvciAoaj1rPTA7IGogPCBGUkFNRVNfUEVSX0RFU0M7IGorKywgayArPSBwa3RzeikgeworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5vZmZzZXQgPSBrOworCQkJdXJiLT5pc29fZnJhbWVfZGVzY1tqXS5sZW5ndGggPSBwa3RzejsKKwkJfQorCX0KKworCXV2ZC0+c3RyZWFtaW5nID0gMTsKKwl1dmQtPmN1cmZyYW1lID0gLTE7CisJZm9yIChpPTA7IGkgPCBVU0JWSURFT19OVU1TQlVGOyBpKyspIHsKKwkJZXJyZmxhZyA9IHVzYl9zdWJtaXRfdXJiKHV2ZC0+c2J1ZltpXS51cmIsIEdGUF9LRVJORUwpOworCQlpZiAoZXJyZmxhZykKKwkJCWVyciAoInVzYl9zdWJtaXRfaXNvYyglZCkgcmV0ICVkIiwgaSwgZXJyZmxhZyk7CisJfQorCisJQ0hFQ0tfUkVUKGVyciwgcWNtX3NldHVwX2lucHV0X2ludChjYW0sIHV2ZCkpOworCUNIRUNLX1JFVChlcnIsIHFjbV9jYW1lcmFfb24odXZkKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFjbV9zdG9wX2RhdGEoc3RydWN0IHV2ZCAqdXZkKQoreworCXN0cnVjdCBxY20gKmNhbSA9IChzdHJ1Y3QgcWNtICopIHV2ZC0+dXNlcl9kYXRhOworCWludCBpLCBqOworCWludCByZXQ7CisKKwlpZiAoKHV2ZCA9PSBOVUxMKSB8fCAoIXV2ZC0+c3RyZWFtaW5nKSB8fCAodXZkLT5kZXYgPT0gTlVMTCkpCisJCXJldHVybjsKKworCXJldCA9IHFjbV9jYW1lcmFfb2ZmKHV2ZCk7CisJaWYgKHJldCkKKwkJd2FybigiY291bGRuJ3QgdHVybiB0aGUgY2FtIG9mZi4iKTsKKworCXV2ZC0+c3RyZWFtaW5nID0gMDsKKworCS8qIFVuc2NoZWR1bGUgYWxsIG9mIHRoZSBpc28gdGQncyAqLworCWZvciAoaT0wOyBpIDwgVVNCVklERU9fTlVNU0JVRjsgaSsrKQorCQl1c2Jfa2lsbF91cmIodXZkLT5zYnVmW2ldLnVyYik7CisKKwlxY21fc3RvcF9pbnRfZGF0YShjYW0pOworCisJaWYgKCF1dmQtPnJlbW92ZV9wZW5kaW5nKSB7CisJCS8qIFNldCBwYWNrZXQgc2l6ZSB0byAwICovCisJCWogPSB1c2Jfc2V0X2ludGVyZmFjZSh1dmQtPmRldiwgdXZkLT5pZmFjZSwKKwkJCQkJdXZkLT5pZmFjZUFsdEluYWN0aXZlKTsKKwkJaWYgKGogPCAwKSB7CisJCQllcnIoInVzYl9zZXRfaW50ZXJmYWNlKCkgZXJyb3IgJWQuIiwgaik7CisJCQl1dmQtPmxhc3RfZXJyb3IgPSBqOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBxY21fcHJvY2Vzc19pc29jKHN0cnVjdCB1dmQgKnV2ZCwgc3RydWN0IHVzYnZpZGVvX2ZyYW1lICpmcmFtZSkKK3sKKwlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKwlpbnQgeDsKKwlzdHJ1Y3QgcmdiICpyZ2JMMDsKKwlzdHJ1Y3QgcmdiICpyZ2JMMTsKKwlzdHJ1Y3QgYmF5TDAgKmJheUwwOworCXN0cnVjdCBiYXlMMSAqYmF5TDE7CisJaW50IGhvcix2ZXIsaG9yZGVsLHZlcmRlbDsKKwlhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CisKKwlzd2l0Y2ggKGNhbS0+c2l6ZSkgeworCWNhc2UgU0laRV8xNjBYMTIwOgorCQlob3IgPSAxNjI7IHZlciA9IDEyNDsgaG9yZGVsID0gMTsgdmVyZGVsID0gMjsKKwkJYnJlYWs7CisJY2FzZSBTSVpFXzMyMFgyNDA6CisJZGVmYXVsdDoKKwkJaG9yID0gMzI0OyB2ZXIgPSAyNDg7IGhvcmRlbCA9IDI7IHZlcmRlbCA9IDQ7CisJCWJyZWFrOworCX0KKworCWlmIChmcmFtZS0+c2NhbnN0YXRlID09IFNjYW5TdGF0ZV9TY2FubmluZykgeworCQl3aGlsZSAoUmluZ1F1ZXVlX0dldExlbmd0aCgmdXZkLT5kcCkgPj0KKwkJCSA0ICsgKGhvcip2ZXJkZWwgKyBob3JkZWwpKSB7CisJCQlpZiAoKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMCkgPT0gMHgwMCkgJiYKKwkJCSAgICAoUklOR19RVUVVRV9QRUVLKCZ1dmQtPmRwLCAxKSA9PSAweGZmKSAmJgorCQkJICAgIChSSU5HX1FVRVVFX1BFRUsoJnV2ZC0+ZHAsIDIpID09IDB4MDApICYmCisJCQkgICAgKFJJTkdfUVVFVUVfUEVFSygmdXZkLT5kcCwgMykgPT0gMHhmZikpIHsKKwkJCQlmcmFtZS0+Y3VybGluZSA9IDA7CisJCQkJZnJhbWUtPnNjYW5zdGF0ZSA9IFNjYW5TdGF0ZV9MaW5lczsKKwkJCQlmcmFtZS0+ZnJhbWVTdGF0ZSA9IEZyYW1lU3RhdGVfR3JhYmJpbmc7CisJCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLCA0KTsKKwkJCS8qCisJCQkqIGlmIHdlJ3JlIHN0YXJ0aW5nLCB3ZSBuZWVkIHRvIGRpc2NhcmQgdGhlIGZpcnN0CisJCQkqIDQgbGluZXMgb2YgeSBiYXllciBkYXRhCisJCQkqIGFuZCB0aGUgZmlyc3QgMiBnciBlbGVtZW50cyBvZiB4IGJheWVyIGRhdGEKKwkJCSovCisJCQkJUklOR19RVUVVRV9ERVFVRVVFX0JZVEVTKCZ1dmQtPmRwLAorCQkJCQkJCShob3IqdmVyZGVsICsgaG9yZGVsKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlSSU5HX1FVRVVFX0RFUVVFVUVfQllURVMoJnV2ZC0+ZHAsIDEpOworCQl9CisJfQorCisJaWYgKGZyYW1lLT5zY2Fuc3RhdGUgPT0gU2NhblN0YXRlX1NjYW5uaW5nKQorCQlyZXR1cm47CisKKwkvKiBub3cgd2UgY2FuIHN0YXJ0IHByb2Nlc3NpbmcgYmF5ZXIgZGF0YSBzbyBsb25nIGFzIHdlIGhhdmUgYXQgbGVhc3QKKwkqIDIgbGluZXMgd29ydGggb2YgZGF0YS4gdGhpcyBpcyB0aGUgc2ltcGxlc3QgZGVtb3NhaWNpbmcgbWV0aG9kIHRoYXQKKwkqIEkgY291bGQgdGhpbmsgb2YuIEkgdXNlIGVhY2ggMngyIGJheWVyIGVsZW1lbnQgd2l0aG91dCBpbnRlcnBvbGF0aW9uCisJKiB0byBnZW5lcmF0ZSA0IHJnYiBwaXhlbHMuCisJKi8KKwl3aGlsZSAoIGZyYW1lLT5jdXJsaW5lIDwgY2FtLT5oZWlnaHQgJiYKKwkJKFJpbmdRdWV1ZV9HZXRMZW5ndGgoJnV2ZC0+ZHApID49IGhvcioyKSkgeworCQkvKiBnZXQgMiBsaW5lcyBvZiBiYXllciBmb3IgZGVtb3NhaWNpbmcKKwkJICogaW50byAyIGxpbmVzIG9mIFJHQiAqLworCQlSaW5nUXVldWVfRGVxdWV1ZSgmdXZkLT5kcCwgY2FtLT5zY3JhdGNoLCBob3IqMik7CisJCWJheUwwID0gKHN0cnVjdCBiYXlMMCAqKSBjYW0tPnNjcmF0Y2g7CisJCWJheUwxID0gKHN0cnVjdCBiYXlMMSAqKSAoY2FtLT5zY3JhdGNoICsgaG9yKTsKKwkJLyogZnJhbWUtPmN1cmxpbmUgaXMgdGhlIHJnYiB5IGxpbmUgKi8KKwkJcmdiTDAgPSAoc3RydWN0IHJnYiAqKQorCQkJCSggZnJhbWUtPmRhdGEgKyAoY2FtLT53aWR0aCozKmZyYW1lLT5jdXJsaW5lKSk7CisJCS8qIHcvMiBiZWNhdXNlIHdlJ3JlIGFscmVhZHkgZG9pbmcgMiBwaXhlbHMgKi8KKwkJcmdiTDEgPSByZ2JMMCArIChjYW0tPndpZHRoLzIpOworCisJCWZvciAoeD0wOyB4IDwgY2FtLT53aWR0aDsgeCs9MikgeworCQkJcmdiTDAtPnIgPSBiYXlMMC0+cjsKKwkJCXJnYkwwLT5nID0gYmF5TDAtPmc7CisJCQlyZ2JMMC0+YiA9IGJheUwxLT5iOworCisJCQlyZ2JMMC0+cjIgPSBiYXlMMC0+cjsKKwkJCXJnYkwwLT5nMiA9IGJheUwxLT5nOworCQkJcmdiTDAtPmIyID0gYmF5TDEtPmI7CisKKwkJCXJnYkwxLT5yID0gYmF5TDAtPnI7CisJCQlyZ2JMMS0+ZyA9IGJheUwxLT5nOworCQkJcmdiTDEtPmIgPSBiYXlMMS0+YjsKKworCQkJcmdiTDEtPnIyID0gYmF5TDAtPnI7CisJCQlyZ2JMMS0+ZzIgPSBiYXlMMS0+ZzsKKwkJCXJnYkwxLT5iMiA9IGJheUwxLT5iOworCisJCQlyZ2JMMCsrOworCQkJcmdiTDErKzsKKworCQkJYmF5TDArKzsKKwkJCWJheUwxKys7CisJCX0KKworCQlmcmFtZS0+c2VxUmVhZF9MZW5ndGggKz0gY2FtLT53aWR0aCozKjI7CisJCWZyYW1lLT5jdXJsaW5lICs9IDI7CisJfQorCS8qIFNlZSBpZiB3ZSBmaWxsZWQgdGhlIGZyYW1lICovCisJaWYgKGZyYW1lLT5jdXJsaW5lID09IGNhbS0+aGVpZ2h0KSB7CisJCWZyYW1lLT5mcmFtZVN0YXRlID0gRnJhbWVTdGF0ZV9Eb25lX0hvbGQ7CisJCWZyYW1lLT5jdXJsaW5lID0gMDsKKwkJdXZkLT5jdXJmcmFtZSA9IC0xOworCQl1dmQtPnN0YXRzLmZyYW1lX251bSsrOworCX0KK30KKworLyogdGFrZW4gZnJvbSBrb25pY2F3YyAqLworc3RhdGljIGludCBxY21fc2V0X3ZpZGVvX21vZGUoc3RydWN0IHV2ZCAqdXZkLCBzdHJ1Y3QgdmlkZW9fd2luZG93ICp2dykKK3sKKwlpbnQgcmV0OworCWludCBuZXdzaXplOworCWludCBvbGRzaXplOworCWludCB4ID0gdnctPndpZHRoOworCWludCB5ID0gdnctPmhlaWdodDsKKwlzdHJ1Y3QgcWNtICpjYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKworCWlmICh4ID4gMCAmJiB5ID4gMCkgeworCQlERUJVRygyLCAidHJ5aW5nIHRvIGZpbmQgc2l6ZSAlZCwlZCIsIHgsIHkpOworCQlmb3IgKG5ld3NpemUgPSAwOyBuZXdzaXplIDw9IE1BWF9GUkFNRV9TSVpFOyBuZXdzaXplKyspIHsKKwkJCWlmICgoY2FtZXJhX3NpemVzW25ld3NpemVdLndpZHRoID09IHgpICYmCisJCQkJKGNhbWVyYV9zaXplc1tuZXdzaXplXS5oZWlnaHQgPT0geSkpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJbmV3c2l6ZSA9IGNhbS0+c2l6ZTsKKworCWlmIChuZXdzaXplID4gTUFYX0ZSQU1FX1NJWkUpIHsKKwkJREVCVUcoMSwgImNvdWxkbid0IGZpbmQgc2l6ZSAlZCwlZCIsIHgsIHkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobmV3c2l6ZSA9PSBjYW0tPnNpemUpIHsKKwkJREVCVUcoMSwgIk5vdGhpbmcgdG8gZG8iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcWNtX3N0b3BfZGF0YSh1dmQpOworCisJaWYgKGNhbS0+c2l6ZSAhPSBuZXdzaXplKSB7CisJCW9sZHNpemUgPSBjYW0tPnNpemU7CisJCWNhbS0+c2l6ZSA9IG5ld3NpemU7CisJCXJldCA9IHFjbV9zZXRfY2FtZXJhX3NpemUodXZkKTsKKwkJaWYgKHJldCkgeworCQkJZXJyKCJDb3VsZG4ndCBzZXQgY2FtZXJhIHNpemUsIGVycj0lZCIscmV0KTsKKwkJCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHNpemUgKi8KKwkJCWNhbS0+c2l6ZSA9IG9sZHNpemU7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogRmx1c2ggdGhlIGlucHV0IHF1ZXVlIGFuZCBjbGVhciBhbnkgY3VycmVudCBmcmFtZSBpbiBwcm9ncmVzcyAqLworCisJUmluZ1F1ZXVlX0ZsdXNoKCZ1dmQtPmRwKTsKKwlpZiAodXZkLT5jdXJmcmFtZSAhPSAtMSkgeworCQl1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdLmN1cmxpbmUgPSAwOworCQl1dmQtPmZyYW1lW3V2ZC0+Y3VyZnJhbWVdLnNlcVJlYWRfTGVuZ3RoID0gMDsKKwkJdXZkLT5mcmFtZVt1dmQtPmN1cmZyYW1lXS5zZXFSZWFkX0luZGV4ID0gMDsKKwl9CisKKwlDSEVDS19SRVQocmV0LCBxY21fc3RhcnRfZGF0YSh1dmQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxY21fY29uZmlndXJlX3ZpZGVvKHN0cnVjdCB1dmQgKnV2ZCkKK3sKKwlpbnQgcmV0OworCW1lbXNldCgmdXZkLT52cGljLCAwLCBzaXplb2YodXZkLT52cGljKSk7CisJbWVtc2V0KCZ1dmQtPnZwaWNfb2xkLCAweDU1LCBzaXplb2YodXZkLT52cGljX29sZCkpOworCisJdXZkLT52cGljLmNvbG91ciA9IGNvbG91cjsKKwl1dmQtPnZwaWMuaHVlID0gaHVlOworCXV2ZC0+dnBpYy5icmlnaHRuZXNzID0gYnJpZ2h0bmVzczsKKwl1dmQtPnZwaWMuY29udHJhc3QgPSBjb250cmFzdDsKKwl1dmQtPnZwaWMud2hpdGVuZXNzID0gd2hpdGVuZXNzOworCXV2ZC0+dnBpYy5kZXB0aCA9IDI0OworCXV2ZC0+dnBpYy5wYWxldHRlID0gVklERU9fUEFMRVRURV9SR0IyNDsKKworCW1lbXNldCgmdXZkLT52Y2FwLCAwLCBzaXplb2YodXZkLT52Y2FwKSk7CisJc3RyY3B5KHV2ZC0+dmNhcC5uYW1lLCAiUUNNIFVTQiBDYW1lcmEiKTsKKwl1dmQtPnZjYXAudHlwZSA9IFZJRF9UWVBFX0NBUFRVUkU7CisJdXZkLT52Y2FwLmNoYW5uZWxzID0gMTsKKwl1dmQtPnZjYXAuYXVkaW9zID0gMDsKKworCXV2ZC0+dmNhcC5taW53aWR0aCA9IGNhbWVyYV9zaXplc1tTSVpFXzE2MFgxMjBdLndpZHRoOworCXV2ZC0+dmNhcC5taW5oZWlnaHQgPSBjYW1lcmFfc2l6ZXNbU0laRV8xNjBYMTIwXS5oZWlnaHQ7CisJdXZkLT52Y2FwLm1heHdpZHRoID0gY2FtZXJhX3NpemVzW1NJWkVfMzIwWDI0MF0ud2lkdGg7CisJdXZkLT52Y2FwLm1heGhlaWdodCA9IGNhbWVyYV9zaXplc1tTSVpFXzMyMFgyNDBdLmhlaWdodDsKKworCW1lbXNldCgmdXZkLT52Y2hhbiwgMCwgc2l6ZW9mKHV2ZC0+dmNoYW4pKTsKKwl1dmQtPnZjaGFuLmZsYWdzID0gMCA7CisJdXZkLT52Y2hhbi50dW5lcnMgPSAwOworCXV2ZC0+dmNoYW4uY2hhbm5lbCA9IDA7CisJdXZkLT52Y2hhbi50eXBlID0gVklERU9fVFlQRV9DQU1FUkE7CisJc3RyY3B5KHV2ZC0+dmNoYW4ubmFtZSwgIkNhbWVyYSIpOworCisJQ0hFQ0tfUkVUKHJldCwgcWNtX3NlbnNvcl9pbml0KHV2ZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFjbV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICpkZXZpZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1dmQgKnV2ZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgcWNtICpjYW07CisJc2l6ZV90IGJ1ZmZlcl9zaXplOworCXVuc2lnbmVkIGNoYXIgdmlkZW9fZXA7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZW5kcG9pbnQ7CisJaW50IGksajsKKwl1bnNpZ25lZCBpbnQgaWZhY2VudW0sIGlmYWNlbnVtX2luYWN0PTA7CisJX19sZTE2IHNlbnNvcl9pZDsKKworCS8qIHdlIGRvbid0IHN1cHBvcnQgbXVsdGljb25maWcgY2FtcyAqLworCWlmIChkZXYtPmRlc2NyaXB0b3IuYk51bUNvbmZpZ3VyYXRpb25zICE9IDEpCisJCXJldHVybiAtRU5PREVWOworCisJLyogZmlyc3QgY2hlY2sgZm9yIHRoZSB2aWRlbyBpbnRlcmZhY2UgYW5kIG5vdAorCSogdGhlIGF1ZGlvIGludGVyZmFjZSAqLworCWludGVyZmFjZSA9ICZpbnRmLT5jdXJfYWx0c2V0dGluZ1swXTsKKwlpZiAoKGludGVyZmFjZS0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MgIT0gVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKQorCQl8fCAoaW50ZXJmYWNlLT5kZXNjLmJJbnRlcmZhY2VTdWJDbGFzcyAhPQorCQkJVVNCX0NMQVNTX1ZFTkRPUl9TUEVDKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKgorCXdhbGsgdGhyb3VnaCBlYWNoIGVuZHBvaW50IGluIGVhY2ggc2V0dGluZyBpbiB0aGUgaW50ZXJmYWNlCisJc3RvcCB3aGVuIHdlIGZpbmQgdGhlIG9uZSB0aGF0J3MgYW4gaXNvY2hyb25vdXMgSU4gZW5kcG9pbnQuCisJKi8KKwlmb3IgKGk9MDsgaSA8IGludGYtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKKwkJaW50ZXJmYWNlID0gJmludGYtPmN1cl9hbHRzZXR0aW5nW2ldOworCQlpZmFjZW51bSA9IGludGVyZmFjZS0+ZGVzYy5iQWx0ZXJuYXRlU2V0dGluZzsKKwkJLyogd2FsayB0aGUgZW5kIHBvaW50cyAqLworCQlmb3IgKGo9MDsgaiA8IGludGVyZmFjZS0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBqKyspIHsKKwkJCWVuZHBvaW50ID0gJmludGVyZmFjZS0+ZW5kcG9pbnRbal0uZGVzYzsKKworCQkJaWYgKChlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzcyAmCisJCQkJVVNCX0VORFBPSU5UX0RJUl9NQVNLKSAhPSBVU0JfRElSX0lOKQorCQkJCWNvbnRpbnVlOyAvKiBub3QgaW5wdXQgdGhlbiBub3QgZ29vZCAqLworCisJCQlidWZmZXJfc2l6ZSA9IGxlMTZfdG9fY3B1KGVuZHBvaW50LT53TWF4UGFja2V0U2l6ZSk7CisJCQlpZiAoIWJ1ZmZlcl9zaXplKSB7CisJCQkJaWZhY2VudW1faW5hY3QgPSBpZmFjZW51bTsKKwkJCQljb250aW51ZTsgLyogMCBwa3Qgc2l6ZSBpcyBub3Qgd2hhdCB3ZSB3YW50ICovCisJCQl9CisKKwkJCWlmICgoZW5kcG9pbnQtPmJtQXR0cmlidXRlcyAmCisJCQkJVVNCX0VORFBPSU5UX1hGRVJUWVBFX01BU0spID09CisJCQkJVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQkJCXZpZGVvX2VwID0gZW5kcG9pbnQtPmJFbmRwb2ludEFkZHJlc3M7CisJCQkJLyogYnJlYWsgb3V0IG9mIHRoZSBzZWFyY2ggKi8KKwkJCQlnb3RvIGdvb2RfdmlkZW9lcDsKKwkJCX0KKwkJfQorCX0KKwkvKiBmYWlsZWQgb3V0IHNpbmNlIG5vdGhpbmcgdXNlZnVsIHdhcyBmb3VuZCAqLworCWVycigiTm8gc3VpdGFibGUgZW5kcG9pbnQgd2FzIGZvdW5kXG4iKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworZ29vZF92aWRlb2VwOgorCS8qIGRpc2FibGUgaXNvY2hyb25vdXMgc3RyZWFtIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlICovCisJZXJyID0gcWNtX3N0dl9zZXRiKGRldiwgU1RWX0lTT19FTkFCTEUsIDApOworCWlmIChlcnIgPCAwKSB7CisJCWVycigiRmFpbGVkIHRvIGRpc2FibGUgc2Vuc29yIHN0cmVhbSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCUNoZWNrIHRoYXQgdGhpcyBpcyB0aGUgc2FtZSB1bmtub3duIHNlbnNvciB0aGF0IGlzIGtub3duIHRvIHdvcmsuIFRoaXMKKwlzZW5zb3IgaXMgc3VzcGVjdGVkIHRvIGJlIHRoZSBTVCBWVjY0MjJDMDAxLiBJJ2xsIGNoZWNrIHRoZSBzYW1lIHZhbHVlCisJdGhhdCB0aGUgcWMtdXNiIGRyaXZlciBjaGVja3MuIFRoaXMgdmFsdWUgaXMgcHJvYmFibHkgbm90IGV2ZW4gdGhlCisJc2Vuc29yIElEIHNpbmNlIGl0IG1hdGNoZXMgdGhlIFVTQiBkZXYgSUQuIE9oIHdlbGwuIElmIGl0IGRvZXNuJ3QKKwltYXRjaCwgaXQncyBwcm9iYWJseSBhIGRpZmYgc2Vuc29yIHNvIGV4aXQgYW5kIGFwb2xvZ2l6ZS4KKwkqLworCWVyciA9IHFjbV9zdHZfZ2V0dyhkZXYsIENNT1NfU0VOU09SX0lEUkVWLCAmc2Vuc29yX2lkKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIoIkNvdWxkbid0IHJlYWQgc2Vuc29yIHZhbHVlcy4gRXJyICVkXG4iLGVycik7CisJCXJldHVybiBlcnI7CisJfQorCWlmIChzZW5zb3JfaWQgIT0gY3B1X3RvX2xlMTYoMHgwOEYwKSkgeworCQllcnIoIlNlbnNvciBJRCAleCAhPSAleC4gVW5zdXBwb3J0ZWQuIFNvcnJ5XG4iLAorCQkJbGUxNl90b19jcHUoc2Vuc29yX2lkKSwgKDB4MDhGMCkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl1dmQgPSB1c2J2aWRlb19BbGxvY2F0ZURldmljZShjYW1zKTsKKwlpZiAoIXV2ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYW0gPSAoc3RydWN0IHFjbSAqKSB1dmQtPnVzZXJfZGF0YTsKKworCS8qIGJ1ZiBmb3IgZG9pbmcgZGVtb3NhaWNpbmcgKi8KKwljYW0tPnNjcmF0Y2ggPSBrbWFsbG9jKDMyNCoyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhbS0+c2NyYXRjaCkgLyogdXZkIGZyZWVkIGluIGRlcmVnICovCisJCXJldHVybiAtRU5PTUVNOworCisJLyogeWVzLCBpZiB3ZSBmYWlsIGFmdGVyIGhlcmUsIGNhbS0+c2NyYXRjaCBnZXRzIGZyZWVkCisJYnkgcWNtX2ZyZWVfdXZkICovCisKKwllcnIgPSBxY21fYWxsb2NfaW50X3VyYihjYW0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogeWVzLCBpZiB3ZSBmYWlsIGFmdGVyIGhlcmUsIGludCB1cmIgZ2V0cyBmcmVlZAorCWJ5IHFjbV9mcmVlX3V2ZCAqLworCisJUkVTVFJJQ1RfVE9fUkFOR0Uoc2l6ZSwgU0laRV8xNjBYMTIwLCBTSVpFXzMyMFgyNDApOworCWNhbS0+d2lkdGggPSBjYW1lcmFfc2l6ZXNbc2l6ZV0ud2lkdGg7CisJY2FtLT5oZWlnaHQgPSBjYW1lcmFfc2l6ZXNbc2l6ZV0uaGVpZ2h0OworCWNhbS0+c2l6ZSA9IHNpemU7CisKKwl1dmQtPmRlYnVnID0gZGVidWc7CisJdXZkLT5mbGFncyA9IDA7CisJdXZkLT5kZXYgPSBkZXY7CisJdXZkLT5pZmFjZSA9IGludGYtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwl1dmQtPmlmYWNlQWx0QWN0aXZlID0gaWZhY2VudW07CisJdXZkLT5pZmFjZUFsdEluYWN0aXZlID0gaWZhY2VudW1faW5hY3Q7CisJdXZkLT52aWRlb19lbmRwID0gdmlkZW9fZXA7CisJdXZkLT5pc29fcGFja2V0X2xlbiA9IGJ1ZmZlcl9zaXplOworCXV2ZC0+cGFsZXR0ZUJpdHMgPSAxTCA8PCBWSURFT19QQUxFVFRFX1JHQjI0OworCXV2ZC0+ZGVmYXVsdFBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0OworCXV2ZC0+Y2FudmFzID0gVklERU9TSVpFKDMyMCwgMjQwKTsKKwl1dmQtPnZpZGVvc2l6ZSA9IFZJREVPU0laRShjYW0tPndpZHRoLCBjYW0tPmhlaWdodCk7CisJZXJyID0gcWNtX2NvbmZpZ3VyZV92aWRlbyh1dmQpOworCWlmIChlcnIpIHsKKwkJZXJyKCJmYWlsZWQgdG8gY29uZmlndXJlIHZpZGVvIHNldHRpbmdzIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdXNidmlkZW9fUmVnaXN0ZXJWaWRlb0RldmljZSh1dmQpOworCWlmIChlcnIpIHsgLyogdGhlIHV2ZCBnZXRzIGZyZWVkIGluIERlcmVnaXN0ZXIgKi8KKwkJZXJyKCJ1c2J2aWRlb19SZWdpc3RlclZpZGVvRGV2aWNlKCkgZmFpbGVkLiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXV2ZC0+bWF4X2ZyYW1lX3NpemUgPSAoMzIwICogMjQwICogMyk7CisJcWNtX3JlZ2lzdGVyX2lucHV0KGNhbSwgZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHV2ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFjbV9mcmVlX3V2ZChzdHJ1Y3QgdXZkICp1dmQpCit7CisJc3RydWN0IHFjbSAqY2FtID0gKHN0cnVjdCBxY20gKikgdXZkLT51c2VyX2RhdGE7CisKKwlrZnJlZShjYW0tPnNjcmF0Y2gpOworCXFjbV91bnJlZ2lzdGVyX2lucHV0KGNhbSk7CisJcWNtX2ZyZWVfaW50KGNhbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNidmlkZW9fY2IgcWNtX2RyaXZlciA9IHsKKwkucHJvYmUgPSAJCXFjbV9wcm9iZSwKKwkuc2V0dXBPbk9wZW4gPSAJCXFjbV9zZXR1cF9vbl9vcGVuLAorCS5wcm9jZXNzRGF0YSA9IAkJcWNtX3Byb2Nlc3NfaXNvYywKKwkuc2V0VmlkZW9Nb2RlID0gCXFjbV9zZXRfdmlkZW9fbW9kZSwKKwkuc3RhcnREYXRhUHVtcCA9IAlxY21fc3RhcnRfZGF0YSwKKwkuc3RvcERhdGFQdW1wID0gCXFjbV9zdG9wX2RhdGEsCisJLmFkanVzdFBpY3R1cmUgPSAJcWNtX2FkanVzdF9waWN0dXJlLAorCS51c2VyRnJlZSA9IAkJcWNtX2ZyZWVfdXZkCit9OworCitzdGF0aWMgaW50IF9faW5pdCBxY21faW5pdCh2b2lkKQoreworCWluZm8oRFJJVkVSX0RFU0MgIiAiIERSSVZFUl9WRVJTSU9OKTsKKworCXJldHVybiB1c2J2aWRlb19yZWdpc3RlcigKKwkJJmNhbXMsCisJCU1BWF9DQU1FUkFTLAorCQlzaXplb2Yoc3RydWN0IHFjbSksCisJCSJRQ00iLAorCQkmcWNtX2RyaXZlciwKKwkJVEhJU19NT0RVTEUsCisJCXFjbV90YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBxY21fZXhpdCh2b2lkKQoreworCXVzYnZpZGVvX0RlcmVnaXN0ZXIoJmNhbXMpOworfQorCittb2R1bGVfcGFyYW0oc2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Moc2l6ZSwgIkluaXRpYWwgU2l6ZSAwOiAxNjB4MTIwIDE6IDMyMHgyNDAiKTsKK21vZHVsZV9wYXJhbShjb2xvdXIsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvbG91ciwgIkluaXRpYWwgY29sb3VyIik7Cittb2R1bGVfcGFyYW0oaHVlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhodWUsICJJbml0aWFsIGh1ZSIpOworbW9kdWxlX3BhcmFtKGJyaWdodG5lc3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJyaWdodG5lc3MsICJJbml0aWFsIGJyaWdodG5lc3MiKTsKK21vZHVsZV9wYXJhbShjb250cmFzdCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29udHJhc3QsICJJbml0aWFsIGNvbnRyYXN0Iik7Cittb2R1bGVfcGFyYW0od2hpdGVuZXNzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh3aGl0ZW5lc3MsICJJbml0aWFsIHdoaXRlbmVzcyIpOworCisjaWZkZWYgQ09ORklHX1VTQl9ERUJVRworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbDogMC05IChkZWZhdWx0PTApIik7CisjZW5kaWYKKworbW9kdWxlX2luaXQocWNtX2luaXQpOworbW9kdWxlX2V4aXQocWNtX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKYXlhIEt1bWFyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlFDTSBVU0IgQ2FtZXJhIik7CitNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiUUNNIFVTQiBDYW1lcmEiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vcXVpY2tjYW1fbWVzc2VuZ2VyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWI5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3F1aWNrY2FtX21lc3Nlbmdlci5oCkBAIC0wLDAgKzEsMTI2IEBACisjaWZuZGVmIHF1aWNrY2FtX21lc3Nlbmdlcl9oCisjZGVmaW5lIHF1aWNrY2FtX21lc3Nlbmdlcl9oCisKKyNpZm5kZWYgQ09ORklHX0lOUFVUCisvKiBpZiB3ZSdyZSBub3QgdXNpbmcgaW5wdXQgd2UgZHVtbXkgb3V0IHRoZXNlIGZ1bmN0aW9ucyAqLworI2RlZmluZSBxY21fcmVnaXN0ZXJfaW5wdXQoLi4uKQorI2RlZmluZSBxY21fdW5yZWdpc3Rlcl9pbnB1dCguLi4pCisjZGVmaW5lIHFjbV9yZXBvcnRfYnV0dG9uc3RhdCguLi4pCisjZGVmaW5lIHFjbV9zZXR1cF9pbnB1dF9pbnQoLi4uKSAwCisjZGVmaW5lIHFjbV9zdG9wX2ludF9kYXRhKC4uLikKKyNkZWZpbmUgcWNtX2FsbG9jX2ludF91cmIoLi4uKSAwCisjZGVmaW5lIHFjbV9mcmVlX2ludCguLi4pCisjZW5kaWYKKworCisjZGVmaW5lIENIRUNLX1JFVChyZXQsIGV4cHIpIFwKKwlpZiAoKHJldCA9IGV4cHIpIDwgMCkgcmV0dXJuIHJldAorCisvKiBDb250cm9sIFJlZ2lzdGVycyBmb3IgdGhlIFNUVlY2NDIyIEFTSUMKKyAqIC0gdGhpcyBkZWZpbmUgaXMgdGFrZW4gZnJvbSB0aGUgcWMtdXNiLW1lc3NlbmdlciBjb2RlCisgKi8KKyNkZWZpbmUgU1RWX0lTT19FTkFCTEUJCTB4MTQ0MAorI2RlZmluZSBJU09DX1BBQ0tFVF9TSVpFCTEwMjMKKworLyogQ2hpcCBpZGVudGlmaWNhdGlvbiBudW1iZXIgaW5jbHVkaW5nIHJldmlzaW9uIGluZGljYXRvciAqLworI2RlZmluZSBDTU9TX1NFTlNPUl9JRFJFVgkweEUwMEEKKworc3RydWN0IHJnYiB7CisJdTggYjsKKwl1OCBnOworCXU4IHI7CisJdTggYjI7CisJdTggZzI7CisJdTggcjI7Cit9OworCitzdHJ1Y3QgYmF5TDAgeworI2lmZGVmIF9fQklHX0VORElBTgorCXU4IHI7CisJdTggZzsKKyNlbGlmIF9fTElUVExFX0VORElBTgorCXU4IGc7CisJdTggcjsKKyNlbHNlCisjZXJyb3Igbm90IGJ5dGUgb3JkZXIgZGVmaW5lZAorI2VuZGlmCit9OworCitzdHJ1Y3QgYmF5TDEgeworI2lmZGVmIF9fQklHX0VORElBTgorCXU4IGc7CisJdTggYjsKKyNlbGlmIF9fTElUVExFX0VORElBTgorCXU4IGI7CisJdTggZzsKKyNlbHNlCisjZXJyb3Igbm90IGJ5dGUgb3JkZXIgZGVmaW5lZAorI2VuZGlmCit9OworCitzdHJ1Y3QgY2FtX3NpemUgeworCXUxNgl3aWR0aDsKKwl1MTYJaGVpZ2h0OworCXU4CWNtZDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2FtX3NpemUgY2FtZXJhX3NpemVzW10gPSB7CisJeyAxNjAsIDEyMCwgMHhmIH0sCisJeyAzMjAsIDI0MCwgMHgyIH0sCit9OworCitlbnVtIGZyYW1lX3NpemVzIHsKKwlTSVpFXzE2MFgxMjAJPSAwLAorCVNJWkVfMzIwWDI0MAk9IDEsCit9OworCisjZGVmaW5lIE1BWF9GUkFNRV9TSVpFIFNJWkVfMzIwWDI0MAorCitzdHJ1Y3QgcWNtIHsKKwl1MTYgY29sb3VyOworCXUxNiBodWU7CisJdTE2IGJyaWdodG5lc3M7CisJdTE2IGNvbnRyYXN0OworCXUxNiB3aGl0ZW5lc3M7CisKKwl1OCBzaXplOworCWludCBoZWlnaHQ7CisJaW50IHdpZHRoOworCXU4ICpzY3JhdGNoOworCXN0cnVjdCB1cmIgKmJ1dHRvbl91cmI7CisJdTggYnV0dG9uX3N0czsKKwl1OCBidXR0b25fc3RzX2J1ZjsKKworI2lmZGVmIENPTkZJR19JTlBVVAorCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0OworCWNoYXIgaW5wdXRfcGh5c25hbWVbNjRdOworI2VuZGlmCit9OworCitzdHJ1Y3QgcmVndmFsIHsKKwl1MTYgcmVnOworCXU4IHZhbDsKK307CisvKiB0aGlzIHRhYmxlIGlzIGRlcml2ZWQgZnJvbSB0aGUKK3FjLXVzYi1tZXNzZW5nZXIgY29kZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCByZWd2YWwgcmVndmFsX3RhYmxlW10gPSB7CisJeyBTVFZfSVNPX0VOQUJMRSwgMHgwMCB9LAorCXsgMHgxNDM2LCAweDAwIH0sIHsgMHgxNDMyLCAweDAzIH0sCisJeyAweDE0M2EsIDB4RjkgfSwgeyAweDA1MDksIDB4MzggfSwKKwl7IDB4MDUwYSwgMHgzOCB9LCB7IDB4MDUwYiwgMHgzOCB9LAorCXsgMHgwNTBjLCAweDJBIH0sIHsgMHgwNTBkLCAweDAxIH0sCisJeyAweDE0MzEsIDB4MDAgfSwgeyAweDE0MzMsIDB4MzQgfSwKKwl7IDB4MTQzOCwgMHgxOCB9LCB7IDB4MTQzOSwgMHgwMCB9LAorCXsgMHgxNDNiLCAweDA1IH0sIHsgMHgxNDNjLCAweDAwIH0sCisJeyAweDE0M2UsIDB4MDEgfSwgeyAweDE0M2QsIDB4MDAgfSwKKwl7IDB4MTQ0MiwgMHhlMiB9LCB7IDB4MTUwMCwgMHhkMCB9LAorCXsgMHgxNTAwLCAweGQwIH0sIHsgMHgxNTAwLCAweDUwIH0sCisJeyAweDE1MDEsIDB4YWYgfSwgeyAweDE1MDIsIDB4YzIgfSwKKwl7IDB4MTUwMywgMHg0NSB9LCB7IDB4MTUwNSwgMHgwMiB9LAorCXsgMHgxNTBlLCAweDhlIH0sIHsgMHgxNTBmLCAweDM3IH0sCisJeyAweDE1YzAsIDB4MDAgfSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1hcmtlcltdID0geyAweDAwLCAweGZmLCAweDAwLCAweEZGIH07CisKKyNlbmRpZiAvKiBxdWlja2NhbV9tZXNzZW5nZXJfaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aWRlby91c2J2aWRlby5oCmluZGV4IDNjYmY0ZmMuLjQ5ZGJlZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlkZW8vdXNidmlkZW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3VzYnZpZGVvL3VzYnZpZGVvLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDEtY29tcGF0LmMKaW5kZXggNDc0YTI5Yi4uMTlkM2MyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwxLWNvbXBhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMS1jb21wYXQuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCmluZGV4IGQzMzBmYTkuLjE0ZTUyMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CisjZGVmaW5lIF9fT0xEX1ZJRElPQ18gLyogVG8gYWxsb3cgZml4aW5nIG9sZCBjYWxscyovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2lmZGVmIENPTkZJR19LTU9ECkBAIC0yOTMsNyArMjk0LDEwIEBACiAjaWYgMQogCVtfSU9DX05SKFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQKV0gPSAiVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVAiLAogI2VuZGlmCi0JW19JT0NfTlIoVklESU9DX0xPR19TVEFUVVMpXSAgICAgICA9ICJWSURJT0NfTE9HX1NUQVRVUyIKKwlbX0lPQ19OUihWSURJT0NfTE9HX1NUQVRVUyldICAgICAgID0gIlZJRElPQ19MT0dfU1RBVFVTIiwKKwlbX0lPQ19OUihWSURJT0NfR19FWFRfQ1RSTFMpXSAgICAgID0gIlZJRElPQ19HX0VYVF9DVFJMUyIsCisJW19JT0NfTlIoVklESU9DX1NfRVhUX0NUUkxTKV0gICAgICA9ICJWSURJT0NfU19FWFRfQ1RSTFMiLAorCVtfSU9DX05SKFZJRElPQ19UUllfRVhUX0NUUkxTKV0gICAgPSAiVklESU9DX1RSWV9FWFRfQ1RSTFMiCiB9OwogI2RlZmluZSBWNEwyX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW9jdGxzKQogCkBAIC0zMzEsNyArMzM1LDggQEAKIAlbX0lPQ19OUihWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX1NfQVVESU9fUk9VVElORyIsCiAJW19JT0NfTlIoVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkcpXSAgPSAiVklESU9DX0lOVF9HX0FVRElPX1JPVVRJTkciLAogCVtfSU9DX05SKFZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HKV0gID0gIlZJRElPQ19JTlRfU19WSURFT19ST1VUSU5HIiwKLQlbX0lPQ19OUihWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyIKKwlbX0lPQ19OUihWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyldICA9ICJWSURJT0NfSU5UX0dfVklERU9fUk9VVElORyIsCisJW19JT0NfTlIoVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSldICAgPSAiVklESU9DX0lOVF9TX0NSWVNUQUxfRlJFUSIKIH07CiAjZGVmaW5lIFY0TDJfSU5UX0lPQ1RMUyBBUlJBWV9TSVpFKHY0bDJfaW50X2lvY3RscykKIApAQCAtNDIzLDcgKzQyOCw5IEBACiAJY2FzZSBUVU5FUl9TRVRfVFlQRV9BRERSOgogCWNhc2UgVFVORVJfU0VUX1NUQU5EQlk6CiAJY2FzZSBUREE5ODg3X1NFVF9DT05GSUc6CisjaWZkZWYgX19PTERfVklESU9DXwogCWNhc2UgVklESU9DX09WRVJMQVlfT0xEOgorI2VuZGlmCiAJY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgogCWNhc2UgVklESU9DX0dfT1VUUFVUOgogCWNhc2UgVklESU9DX1NfT1VUUFVUOgpAQCAtNDM5LDcgKzQ0Niw5IEBACiAJY2FzZSBWSURJT0NfR19BVURJTzoKIAljYXNlIFZJRElPQ19TX0FVRElPOgogCWNhc2UgVklESU9DX0VOVU1BVURJTzoKKyNpZmRlZiBfX09MRF9WSURJT0NfCiAJY2FzZSBWSURJT0NfR19BVURJT19PTEQ6CisjZW5kaWYKIAl7CiAJCXN0cnVjdCB2NGwyX2F1ZGlvICpwPWFyZzsKIApAQCAtNDUwLDcgKzQ1OSw5IEBACiAJY2FzZSBWSURJT0NfR19BVURPVVQ6CiAJY2FzZSBWSURJT0NfU19BVURPVVQ6CiAJY2FzZSBWSURJT0NfRU5VTUFVRE9VVDoKKyNpZmRlZiBfX09MRF9WSURJT0NfCiAJY2FzZSBWSURJT0NfR19BVURPVVRfT0xEOgorI2VuZGlmCiAJewogCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqcD1hcmc7CiAJCXByaW50ayAoIiVzOiBpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgbW9kZT0lZFxuIiwgcywKQEAgLTQ3OCw5ICs0ODksOSBAQAogCQkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpLAogCQkJCXAtPm0udXNlcnB0cik7CiAJCXByaW50ayAoIiVzOiB0aW1lY29kZT0gJTAyZDolMDJkOiUwMmQgdHlwZT0lZCwgIgotCQkJImZsYWdzPTB4JTA4eCwgZnJhbWVzPSVkLCB1c2VyYml0cz0weCVwXG4iLAorCQkJImZsYWdzPTB4JTA4eCwgZnJhbWVzPSVkLCB1c2VyYml0cz0weCUwOHhcbiIsCiAJCQkJcyx0Yy0+aG91cnMsdGMtPm1pbnV0ZXMsdGMtPnNlY29uZHMsCi0JCQkJdGMtPnR5cGUsIHRjLT5mbGFncywgdGMtPmZyYW1lcywgdGMtPnVzZXJiaXRzKTsKKwkJCQl0Yy0+dHlwZSwgdGMtPmZsYWdzLCB0Yy0+ZnJhbWVzLCAqKF9fdTMyICopIHRjLT51c2VyYml0cyk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ19RVUVSWUNBUDoKQEAgLTQ5NSwxMiArNTA2LDMxIEBACiAJfQogCWNhc2UgVklESU9DX0dfQ1RSTDoKIAljYXNlIFZJRElPQ19TX0NUUkw6CisjaWZkZWYgX19PTERfVklESU9DXwogCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CisjZW5kaWYKIAl7CiAJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKnA9YXJnOwogCQlwcmludGsgKCIlczogaWQ9JWQsIHZhbHVlPSVkXG4iLCBzLCBwLT5pZCwgcC0+dmFsdWUpOwogCQlicmVhazsKIAl9CisJY2FzZSBWSURJT0NfR19FWFRfQ1RSTFM6CisJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFM6CisJY2FzZSBWSURJT0NfVFJZX0VYVF9DVFJMUzoKKwl7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqcCA9IGFyZzsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCIlczogY3RybF9jbGFzcz0lZCwgY291bnQ9JWRcbiIsIHMsIHAtPmN0cmxfY2xhc3MsIHAtPmNvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IHAtPmNvdW50OyBpKyspIHsKKwkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjID0gJnAtPmNvbnRyb2xzW2ldOworCQkJaWYgKGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMpCisJCQkJcHJpbnRrKCIlczogaWQ9JWRcbiIsIHMsIGMtPmlkKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiVzOiBpZD0lZCwgdmFsdWU9JWRcbiIsIHMsIGMtPmlkLCBjLT52YWx1ZSk7CisJCX0KKwkJYnJlYWs7CisJfQogCWNhc2UgVklESU9DX0dfQ1JPUDoKIAljYXNlIFZJRElPQ19TX0NST1A6CiAJewpAQCAtNTEwLDcgKzU0MCw5IEBACiAJCWJyZWFrOwogCX0KIAljYXNlIFZJRElPQ19DUk9QQ0FQOgorI2lmZGVmIF9fT0xEX1ZJRElPQ18KIAljYXNlIFZJRElPQ19DUk9QQ0FQX09MRDoKKyNlbmRpZgogCXsKIAkJc3RydWN0IHY0bDJfY3JvcGNhcCAqcD1hcmc7CiAJCS8qRklYTUU6IFNob3VsZCBhbHNvIHNob3cgcmVjdCBzdHJ1Y3RzICovCkBAIC02NjcsNiArNjk5LDEyIEBACiAJCXByaW50ayAoIiVzOiBpbnB1dD0weCV4LCBvdXRwdXQ9MHgleFxuIiwgcywgcC0+aW5wdXQsIHAtPm91dHB1dCk7CiAJCWJyZWFrOwogCX0KKwljYXNlIFZJRElPQ19JTlRfU19DUllTVEFMX0ZSRVE6CisJeworCQlzdHJ1Y3QgdjRsMl9jcnlzdGFsX2ZyZXEgKnA9YXJnOworCQlwcmludGsgKCIlczogZnJlcT0ldSwgZmxhZ3M9MHgleFxuIiwgcywgcC0+ZnJlcSwgcC0+ZmxhZ3MpOworCQlicmVhazsKKwl9CiAJY2FzZSBWSURJT0NfR19TTElDRURfVkJJX0NBUDoKIAl7CiAJCXN0cnVjdCB2NGwyX3NsaWNlZF92YmlfY2FwICpwPWFyZzsKQEAgLTY5Niw3ICs3MzQsOSBAQAogCX0KIAljYXNlIFZJRElPQ19HX1BBUk06CiAJY2FzZSBWSURJT0NfU19QQVJNOgorI2lmZGVmIF9fT0xEX1ZJRElPQ18KIAljYXNlIFZJRElPQ19TX1BBUk1fT0xEOgorI2VuZGlmCiAJewogCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICpwPWFyZzsKIAkJcHJpbnRrICgiJXM6IHR5cGU9JWRcbiIsIHMsIHAtPnR5cGUpOwpAQCAtOTE1LDYgKzk1NSw0ODQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29udHJvbCBoYW5kbGluZwkJCSAgICAgKi8KKworLyogQ2hlY2sgZm9yIGNvcnJlY3RuZXNzIG9mIHRoZSBjdHJsJ3MgdmFsdWUgYmFzZWQgb24gdGhlIGRhdGEgZnJvbQorICAgc3RydWN0IHY0bDJfcXVlcnljdHJsIGFuZCB0aGUgYXZhaWxhYmxlIG1lbnUgaXRlbXMuIE5vdGUgdGhhdAorICAgbWVudV9pdGVtcyBtYXkgYmUgTlVMTCwgaW4gdGhhdCBjYXNlIGl0IGlzIGlnbm9yZWQuICovCitpbnQgdjRsMl9jdHJsX2NoZWNrKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjdHJsLCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLAorCQljb25zdCBjaGFyICoqbWVudV9pdGVtcykKK3sKKwlpZiAocWN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfRElTQUJMRUQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChxY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKQorCQlyZXR1cm4gLUVCVVNZOworCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CVVRUT04gfHwKKwkgICAgcWN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0IHx8CisJICAgIHFjdHJsLT50eXBlID09IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1MpCisJCXJldHVybiAwOworCWlmIChjdHJsLT52YWx1ZSA8IHFjdHJsLT5taW5pbXVtIHx8IGN0cmwtPnZhbHVlID4gcWN0cmwtPm1heGltdW0pCisJCXJldHVybiAtRVJBTkdFOworCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VICYmIG1lbnVfaXRlbXMgIT0gTlVMTCkgeworCQlpZiAobWVudV9pdGVtc1tjdHJsLT52YWx1ZV0gPT0gTlVMTCB8fAorCQkgICAgbWVudV9pdGVtc1tjdHJsLT52YWx1ZV1bMF0gPT0gJ1wwJykKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyBOVUxMIG9yIGEgY2hhcmFjdGVyIHBvaW50ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgbWVudSBmb3IKKyAgIHRoZSBnaXZlbiBjb250cm9sIElELiBUaGUgcG9pbnRlciBhcnJheSBlbmRzIHdpdGggYSBOVUxMIHBvaW50ZXIuCisgICBBbiBlbXB0eSBzdHJpbmcgc2lnbmlmaWVzIGEgbWVudSBlbnRyeSB0aGF0IGlzIGludmFsaWQuIFRoaXMgYWxsb3dzCisgICBkcml2ZXJzIHRvIGRpc2FibGUgY2VydGFpbiBvcHRpb25zIGlmIGl0IGlzIG5vdCBzdXBwb3J0ZWQuICovCitjb25zdCBjaGFyICoqdjRsMl9jdHJsX2dldF9tZW51KHUzMiBpZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxW10gPSB7CisJCSI0NC4xIGtIeiIsCisJCSI0OCBrSHoiLAorCQkiMzIga0h6IiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fZW5jb2RpbmdbXSA9IHsKKwkJIkxheWVyIEkiLAorCQkiTGF5ZXIgSUkiLAorCQkiTGF5ZXIgSUlJIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fbDFfYml0cmF0ZVtdID0geworCQkiMzIga2JwcyIsCisJCSI2NCBrYnBzIiwKKwkJIjk2IGticHMiLAorCQkiMTI4IGticHMiLAorCQkiMTYwIGticHMiLAorCQkiMTkyIGticHMiLAorCQkiMjI0IGticHMiLAorCQkiMjU2IGticHMiLAorCQkiMjg4IGticHMiLAorCQkiMzIwIGticHMiLAorCQkiMzUyIGticHMiLAorCQkiMzg0IGticHMiLAorCQkiNDE2IGticHMiLAorCQkiNDQ4IGticHMiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19sMl9iaXRyYXRlW10gPSB7CisJCSIzMiBrYnBzIiwKKwkJIjQ4IGticHMiLAorCQkiNTYga2JwcyIsCisJCSI2NCBrYnBzIiwKKwkJIjgwIGticHMiLAorCQkiOTYga2JwcyIsCisJCSIxMTIga2JwcyIsCisJCSIxMjgga2JwcyIsCisJCSIxNjAga2JwcyIsCisJCSIxOTIga2JwcyIsCisJCSIyMjQga2JwcyIsCisJCSIyNTYga2JwcyIsCisJCSIzMjAga2JwcyIsCisJCSIzODQga2JwcyIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX2wzX2JpdHJhdGVbXSA9IHsKKwkJIjMyIGticHMiLAorCQkiNDAga2JwcyIsCisJCSI0OCBrYnBzIiwKKwkJIjU2IGticHMiLAorCQkiNjQga2JwcyIsCisJCSI4MCBrYnBzIiwKKwkJIjk2IGticHMiLAorCQkiMTEyIGticHMiLAorCQkiMTI4IGticHMiLAorCQkiMTYwIGticHMiLAorCQkiMTkyIGticHMiLAorCQkiMjI0IGticHMiLAorCQkiMjU2IGticHMiLAorCQkiMzIwIGticHMiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19tb2RlW10gPSB7CisJCSJTdGVyZW8iLAorCQkiSm9pbnQgU3RlcmVvIiwKKwkJIkR1YWwiLAorCQkiTW9ubyIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uW10gPSB7CisJCSJCb3VuZCA0IiwKKwkJIkJvdW5kIDgiLAorCQkiQm91bmQgMTIiLAorCQkiQm91bmQgMTYiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19hdWRpb19lbXBoYXNpc1tdID0geworCQkiTm8gRW1waGFzaXMiLAorCQkiNTAvMTUgdXMiLAorCQkiQ0NJVFQgSjE3IiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfYXVkaW9fY3JjW10gPSB7CisJCSJObyBDUkMiLAorCQkiMTYtYml0IENSQyIsCisJCU5VTEwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICptcGVnX3ZpZGVvX2VuY29kaW5nW10gPSB7CisJCSJNUEVHLTEiLAorCQkiTVBFRy0yIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYXNwZWN0W10gPSB7CisJCSIxeDEiLAorCQkiNHgzIiwKKwkJIjE2eDkiLAorCQkiMi4yMXgxIiwKKwkJTlVMTAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKm1wZWdfdmlkZW9fYml0cmF0ZV9tb2RlW10gPSB7CisJCSJWYXJpYWJsZSBCaXRyYXRlIiwKKwkJIkNvbnN0YW50IEJpdHJhdGUiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbXBlZ19zdHJlYW1fdHlwZVtdID0geworCQkiTVBFRy0yIFByb2dyYW0gU3RyZWFtIiwKKwkJIk1QRUctMiBUcmFuc3BvcnQgU3RyZWFtIiwKKwkJIk1QRUctMSBTeXN0ZW0gU3RyZWFtIiwKKwkJIk1QRUctMiBEVkQtY29tcGF0aWJsZSBTdHJlYW0iLAorCQkiTVBFRy0xIFZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCSJNUEVHLTIgU1ZDRC1jb21wYXRpYmxlIFN0cmVhbSIsCisJCU5VTEwKKwl9OworCisJc3dpdGNoIChpZCkgeworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORzoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2VuY29kaW5nOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2wxX2JpdHJhdGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCQkJcmV0dXJuIG1wZWdfYXVkaW9fbDJfYml0cmF0ZTsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6CisJCQlyZXR1cm4gbXBlZ19hdWRpb19sM19iaXRyYXRlOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERToKKwkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uOworCQljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CisJCQlyZXR1cm4gbXBlZ19hdWRpb19lbXBoYXNpczsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKKwkJCXJldHVybiBtcGVnX2F1ZGlvX2NyYzsKKwkJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQkJcmV0dXJuIG1wZWdfdmlkZW9fZW5jb2Rpbmc7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCQlyZXR1cm4gbXBlZ192aWRlb19hc3BlY3Q7CisJCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREU6CisJCQlyZXR1cm4gbXBlZ192aWRlb19iaXRyYXRlX21vZGU7CisJCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJCXJldHVybiBtcGVnX3N0cmVhbV90eXBlOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBGaWxsIGluIGEgc3RydWN0IHY0bDJfcXVlcnljdHJsICovCitpbnQgdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwoc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCwgczMyIG1pbiwgczMyIG1heCwgczMyIHN0ZXAsIHMzMiBkZWYpCit7CisJY29uc3QgY2hhciAqbmFtZTsKKworCXFjdHJsLT5mbGFncyA9IDA7CisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwkvKiBVU0VSIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOiAJbmFtZSA9ICJVc2VyIENvbnRyb2xzIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6IAluYW1lID0gIlZvbHVtZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURTogCW5hbWUgPSAiTXV0ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFMQU5DRTogCW5hbWUgPSAiQmFsYW5jZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fQkFTUzogCW5hbWUgPSAiQmFzcyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOiAJbmFtZSA9ICJUcmVibGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTOiAJbmFtZSA9ICJMb3VkbmVzcyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzogCW5hbWUgPSAiQnJpZ2h0bmVzcyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6IAluYW1lID0gIkNvbnRyYXN0IjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOiAJbmFtZSA9ICJTYXR1cmF0aW9uIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9IVUU6IAkJbmFtZSA9ICJIdWUiOyBicmVhazsKKworCS8qIE1QRUcgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6IAkJbmFtZSA9ICJNUEVHIEVuY29kZXIgQ29udHJvbHMiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUTogbmFtZSA9ICJBdWRpbyBTYW1wbGluZyBGcmVxdWVuY3kiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6IAluYW1lID0gIkF1ZGlvIEVuY29kaW5nIExheWVyIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIEkgQml0cmF0ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOiAJbmFtZSA9ICJBdWRpbyBMYXllciBJSSBCaXRyYXRlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEU6IAluYW1lID0gIkF1ZGlvIExheWVyIElJSSBCaXRyYXRlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6IAkJbmFtZSA9ICJBdWRpbyBTdGVyZW8gTW9kZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjogbmFtZSA9ICJBdWRpbyBTdGVyZW8gTW9kZSBFeHRlbnNpb24iOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6IAluYW1lID0gIkF1ZGlvIEVtcGhhc2lzIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzogCQluYW1lID0gIkF1ZGlvIENSQyI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORzogCW5hbWUgPSAiVmlkZW8gRW5jb2RpbmciOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUOiAJbmFtZSA9ICJWaWRlbyBBc3BlY3QiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6IAluYW1lID0gIlZpZGVvIEIgRnJhbWVzIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOiAJbmFtZSA9ICJWaWRlbyBHT1AgU2l6ZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRTogCW5hbWUgPSAiVmlkZW8gR09QIENsb3N1cmUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV046IAluYW1lID0gIlZpZGVvIFB1bGxkb3duIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERTogCW5hbWUgPSAiVmlkZW8gQml0cmF0ZSBNb2RlIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEU6IAluYW1lID0gIlZpZGVvIEJpdHJhdGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOiAJbmFtZSA9ICJWaWRlbyBQZWFrIEJpdHJhdGUiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjogbmFtZSA9ICJWaWRlbyBUZW1wb3JhbCBEZWNpbWF0aW9uIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOiAJbmFtZSA9ICJTdHJlYW0gVHlwZSI7IGJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDogCW5hbWUgPSAiU3RyZWFtIFBNVCBQcm9ncmFtIElEIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU86IAluYW1lID0gIlN0cmVhbSBBdWRpbyBQcm9ncmFtIElEIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU86IAluYW1lID0gIlN0cmVhbSBWaWRlbyBQcm9ncmFtIElEIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSOiAJbmFtZSA9ICJTdHJlYW0gUENSIFByb2dyYW0gSUQiOyBicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BFU19JRF9BVURJTzogbmFtZSA9ICJTdHJlYW0gUEVTIEF1ZGlvIElEIjsgYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86IG5hbWUgPSAiU3RyZWFtIFBFUyBWaWRlbyBJRCI7IGJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN3aXRjaCAocWN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgorCWNhc2UgVjRMMl9DSURfQVVESU9fTE9VRE5FU1M6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKKwkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOOworCQltaW4gPSAwOworCQltYXggPSBzdGVwID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMV9CSVRSQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU1QSEFTSVM6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0FTUEVDVDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VOworCQlzdGVwID0gMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgorCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKKwkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTOworCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZOworCQltaW4gPSBtYXggPSBzdGVwID0gZGVmID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcWN0cmwtPnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOworCQlicmVhazsKKwl9CisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQl9GUkFNRVM6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFOgorCQlxY3RybC0+ZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfVVBEQVRFOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgorCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKKwljYXNlIFY0TDJfQ0lEX0hVRToKKwkJcWN0cmwtPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1NMSURFUjsKKwkJYnJlYWs7CisJfQorCXFjdHJsLT5taW5pbXVtID0gbWluOworCXFjdHJsLT5tYXhpbXVtID0gbWF4OworCXFjdHJsLT5zdGVwID0gc3RlcDsKKwlxY3RybC0+ZGVmYXVsdF92YWx1ZSA9IGRlZjsKKwlxY3RybC0+cmVzZXJ2ZWRbMF0gPSBxY3RybC0+cmVzZXJ2ZWRbMV0gPSAwOworCXNucHJpbnRmKHFjdHJsLT5uYW1lLCBzaXplb2YocWN0cmwtPm5hbWUpLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmlsbCBpbiBhIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCB3aXRoIHN0YW5kYXJkIHZhbHVlcyBiYXNlZCBvbgorICAgdGhlIGNvbnRyb2wgSUQuICovCitpbnQgdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpCit7CisJc3dpdGNoIChxY3RybC0+aWQpIHsKKwkvKiBVU0VSIGNvbnRyb2xzICovCisJY2FzZSBWNEwyX0NJRF9VU0VSX0NMQVNTOgorCWNhc2UgVjRMMl9DSURfTVBFR19DTEFTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAwLCAwLCAwKTsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCA2NTUzNSwgNjU1MzUgLyAxMDAsIDU4ODgwKTsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6CisJY2FzZSBWNEwyX0NJRF9BVURJT19MT1VETkVTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKKwljYXNlIFY0TDJfQ0lEX0FVRElPX0JBTEFOQ0U6CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQVNTOgorCWNhc2UgVjRMMl9DSURfQVVESU9fVFJFQkxFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDY1NTM1LCA2NTUzNSAvIDEwMCwgMzI3NjgpOworCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDEyOCk7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMTI3LCAxLCA2NCk7CisJY2FzZSBWNEwyX0NJRF9IVUU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgLTEyOCwgMTI3LCAxLCAwKTsKKworCS8qIE1QRUcgY29udHJvbHMgKi8KKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ0MTAwLAorCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzMyMDAwLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkc6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wxX0JJVFJBVEU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zMkssCisJCQkJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yNTZLKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfQVVESU9fTDJfQklUUkFURToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMySywKKwkJCQlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLLCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzIyNEspOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLLAorCQkJCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMyMEssIDEsCisJCQkJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTkySyk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREU6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8sCisJCQkJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9TVEVSRU8pOworCWNhc2UgVjRMMl9DSURfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTjoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80LAorCQkJCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xNiwgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfNCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUsCisJCQkJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX0NDSVRUX0oxNywgMSwKKwkJCQlWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfTk9ORSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSwKKwkJCQlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2LCAxLAorCQkJCVY0TDJfTVBFR19BVURJT19DUkNfTk9ORSk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSwKKwkJCQlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yLCAxLAorCQkJCVY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1Q6CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzF4MSwKKwkJCQlWNEwyX01QRUdfVklERU9fQVNQRUNUXzIyMXgxMDAsIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAzMywgMSwgMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDEsIDM0LCAxLCAxMik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9DTE9TVVJFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDEsIDEsIDEpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19QVUxMRE9XTjoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAxLCAxLCAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIsIDEsCisJCQkJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9WQlIpOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI3MDAwMDAwLCAxLCA2MDAwMDAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI3MDAwMDAwLCAxLCA4MDAwMDAwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAyNTUsIDEsIDApOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRToKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLAorCQkJCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9QUywKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCwgMSwKKwkJCQlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMpOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BNVDoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAxNik7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU86CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgKDEgPDwgMTQpIC0gMSwgMSwgMjYwKTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9WSURFTzoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNTYpOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1BDUjoKKwkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjdHJsLCAwLCAoMSA8PCAxNCkgLSAxLCAxLCAyNTkpOworCWNhc2UgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX0FVRElPOgorCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWN0cmwsIDAsIDI1NSwgMSwgMCk7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU86CisJCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxY3RybCwgMCwgMjU1LCAxLCAwKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIEZpbGwgaW4gYSBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgYmFzZWQgb24gdGhlIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBhbmQKKyAgIHRoZSBtZW51LiBUaGUgcWN0cmwgcG9pbnRlciBtYXkgYmUgTlVMTCwgaW4gd2hpY2ggY2FzZSBpdCBpcyBpZ25vcmVkLiAqLworaW50IHY0bDJfY3RybF9xdWVyeV9tZW51KHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCisJICAgICAgIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKQoreworCWludCBpOworCisJaWYgKG1lbnVfaXRlbXMgPT0gTlVMTCB8fAorCSAgICAocWN0cmwgJiYgKHFtZW51LT5pbmRleCA8IHFjdHJsLT5taW5pbXVtIHx8IHFtZW51LT5pbmRleCA+IHFjdHJsLT5tYXhpbXVtKSkpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBxbWVudS0+aW5kZXggJiYgbWVudV9pdGVtc1tpXTsgaSsrKSA7CisJaWYgKG1lbnVfaXRlbXNbaV0gPT0gTlVMTCB8fCBtZW51X2l0ZW1zW2ldWzBdID09ICdcMCcpCisJCXJldHVybiAtRUlOVkFMOworCXNucHJpbnRmKHFtZW51LT5uYW1lLCBzaXplb2YocW1lbnUtPm5hbWUpLCBtZW51X2l0ZW1zW3FtZW51LT5pbmRleF0pOworCXFtZW51LT5yZXNlcnZlZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIGN0cmxfY2xhc3NlcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgdTMyIHBvaW50ZXJzLCB0aGUgbGFzdCBlbGVtZW50IGlzCisgICBhIE5VTEwgcG9pbnRlci4gRWFjaCB1MzIgYXJyYXkgaXMgYSAwLXRlcm1pbmF0ZWQgYXJyYXkgb2YgY29udHJvbCBJRHMuCisgICBFYWNoIGFycmF5IG11c3QgYmUgc29ydGVkIGxvdyB0byBoaWdoIGFuZCBiZWxvbmcgdG8gdGhlIHNhbWUgY29udHJvbAorICAgY2xhc3MuIFRoZSBhcnJheSBvZiB1MzIgcG9pbnRlciBtdXN0IGFsc28gYmUgc29ydGVkLCBmcm9tIGxvdyBjbGFzcyBJRHMKKyAgIHRvIGhpZ2ggY2xhc3MgSURzLgorCisgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZpcnN0IElEIHRoYXQgZm9sbG93cyBhZnRlciB0aGUgZ2l2ZW4gSUQuCisgICBXaGVuIG5vIG1vcmUgY29udHJvbHMgYXJlIGF2YWlsYWJsZSAwIGlzIHJldHVybmVkLiAqLwordTMyIHY0bDJfY3RybF9uZXh0KGNvbnN0IHUzMiAqIGNvbnN0ICogY3RybF9jbGFzc2VzLCB1MzIgaWQpCit7CisJdTMyIGN0cmxfY2xhc3M7CisJY29uc3QgdTMyICpwY3RybDsKKworCS8qIGlmIG5vIHF1ZXJ5IGlzIGRlc2lyZWQsIHRoZW4ganVzdCByZXR1cm4gdGhlIGNvbnRyb2wgSUQgKi8KKwlpZiAoKGlkICYgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMKSA9PSAwKQorCQlyZXR1cm4gaWQ7CisJaWYgKGN0cmxfY2xhc3NlcyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlpZCAmPSBWNEwyX0NUUkxfSURfTUFTSzsKKwljdHJsX2NsYXNzID0gVjRMMl9DVFJMX0lEMkNMQVNTKGlkKTsKKwlpZCsrOwkvKiBzZWxlY3QgbmV4dCBjb250cm9sICovCisJLyogZmluZCBmaXJzdCBjbGFzcyB0aGF0IG1hdGNoZXMgKG9yIGlzIGdyZWF0ZXIgdGhhbikgdGhlIGNsYXNzIG9mCisJICAgdGhlIElEICovCisJd2hpbGUgKCpjdHJsX2NsYXNzZXMgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKCoqY3RybF9jbGFzc2VzKSA8IGN0cmxfY2xhc3MpCisJCWN0cmxfY2xhc3NlcysrOworCS8qIG5vIG1vcmUgY2xhc3NlcyAqLworCWlmICgqY3RybF9jbGFzc2VzID09IE5VTEwpCisJCXJldHVybiAwOworCXBjdHJsID0gKmN0cmxfY2xhc3NlczsKKwkvKiBmaW5kIGZpcnN0IGN0cmwgd2l0aGluIHRoZSBjbGFzcyB0aGF0IGlzID49IElEICovCisJd2hpbGUgKCpwY3RybCAmJiAqcGN0cmwgPCBpZCkgcGN0cmwrKzsKKwlpZiAoKnBjdHJsKQorCQlyZXR1cm4gKnBjdHJsOworCS8qIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBjb250cm9scyBvZiB0aGUgY3VycmVudCBjbGFzcy4gKi8KKwkvKiBjb250aW51ZSB3aXRoIG5leHQgY2xhc3MgaWYgYXZhaWxhYmxlICovCisJY3RybF9jbGFzc2VzKys7CisJaWYgKCpjdHJsX2NsYXNzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICoqY3RybF9jbGFzc2VzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCiBFWFBPUlRfU1lNQk9MKHY0bDJfdmlkZW9fc3RkX2NvbnN0cnVjdCk7CiAKIEVYUE9SVF9TWU1CT0wodjRsMl9wcmlvX2luaXQpOwpAQCAtOTI5LDYgKzE0NDcsMTMgQEAKIEVYUE9SVF9TWU1CT0wodjRsX3ByaW50a19pb2N0bCk7CiBFWFBPUlRfU1lNQk9MKHY0bF9wcmludGtfaW9jdGxfYXJnKTsKIAorRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfbmV4dCk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9jaGVjayk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9nZXRfbWVudSk7CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9xdWVyeV9tZW51KTsKK0VYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3F1ZXJ5X2ZpbGwpOworRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfcXVlcnlfZmlsbF9zdGQpOworCiAvKgogICogTG9jYWwgdmFyaWFibGVzOgogICogYy1iYXNpYy1vZmZzZXQ6IDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW8tYnVmLWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKaW5kZXggY2FmM2U3ZS4uN2VlOGE1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlby1idWYtZHZiLmMKQEAgLTEzNSwxNCArMTM1LDE1IEBACiAKIGludCB2aWRlb2J1Zl9kdmJfcmVnaXN0ZXIoc3RydWN0IHZpZGVvYnVmX2R2YiAqZHZiLAogCQkJICBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsCi0JCQkgIHZvaWQgKmFkYXB0ZXJfcHJpdikKKwkJCSAgdm9pZCAqYWRhcHRlcl9wcml2LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJaW50IHJlc3VsdDsKIAogCW11dGV4X2luaXQoJmR2Yi0+bG9jayk7CiAKIAkvKiByZWdpc3RlciBhZGFwdGVyICovCi0JcmVzdWx0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlciwgZHZiLT5uYW1lLCBtb2R1bGUpOworCXJlc3VsdCA9IGR2Yl9yZWdpc3Rlcl9hZGFwdGVyKCZkdmItPmFkYXB0ZXIsIGR2Yi0+bmFtZSwgbW9kdWxlLCBkZXZpY2UpOwogCWlmIChyZXN1bHQgPCAwKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkdmJfcmVnaXN0ZXJfYWRhcHRlciBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAogCQkgICAgICAgZHZiLT5uYW1lLCByZXN1bHQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2Rldi5jCmluZGV4IDVmODdkZDUuLjJkZmE3ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9kZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvZGV2LmMKQEAgLTEsMjAgKzEsMzEgQEAKIC8qCi0gKiBWaWRlbyBjYXB0dXJlIGludGVyZmFjZSBmb3IgTGludXgKKyAqIFZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlIGZvciBMaW51eCB2ZXJzaW9uIDIKICAqCi0gKgkJQSBnZW5lcmljIHZpZGVvIGRldmljZSBpbnRlcmZhY2UgZm9yIHRoZSBMSU5VWCBvcGVyYXRpbmcgc3lzdGVtCi0gKgkJdXNpbmcgYSBzZXQgb2YgZGV2aWNlIHN0cnVjdHVyZXMvdmVjdG9ycyBmb3IgbG93IGxldmVsIG9wZXJhdGlvbnMuCisgKglBIGdlbmVyaWMgdmlkZW8gZGV2aWNlIGludGVyZmFjZSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0KKyAqCXVzaW5nIGEgc2V0IG9mIGRldmljZSBzdHJ1Y3R1cmVzL3ZlY3RvcnMgZm9yIGxvdyBsZXZlbCBvcGVyYXRpb25zLgogICoKLSAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiBBdXRob3I6CUFsYW4gQ294LCA8YWxhbkByZWRoYXQuY29tPgorICogQXV0aG9yczoJQWxhbiBDb3gsIDxhbGFuQHJlZGhhdC5jb20+ICh2ZXJzaW9uIDEpCisgKiAgICAgICAgICAgICAgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+ICh2ZXJzaW9uIDIpCiAgKgogICogRml4ZXM6CTIwMDAwNTE2ICBDbGF1ZGlvIE1hdHN1b2thIDxjbGF1ZGlvQGNvbmVjdGl2YS5jb20+CiAgKgkJLSBBZGRlZCBwcm9jZnMgc3VwcG9ydAogICovCiAKKyNkZWZpbmUgZGJnYXJnKGNtZCwgZm10LCBhcmcuLi4pIFwKKwkJaWYgKHZmZC0+ZGVidWcgJiBWNEwyX0RFQlVHX0lPQ1RMX0FSRykJCQlcCisJCQlwcmludGsgKEtFUk5fREVCVUcgIiVzOiAiLCAgdmZkLT5uYW1lKTsJCVwKKwkJCXY0bF9wcmludGtfaW9jdGwoY21kKTsJCQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiBmbXQsIHZmZC0+bmFtZSwgIyMgYXJnKTsKKworI2RlZmluZSBkYmdhcmcyKGZtdCwgYXJnLi4uKSBcCisJCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpCQkJXAorCQkJcHJpbnRrIChLRVJOX0RFQlVHICIlczogIiBmbXQsIHZmZC0+bmFtZSwgIyMgYXJnKTsKKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0zMCw3ICs0MSwxMyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogCisjZGVmaW5lIF9fT0xEX1ZJRElPQ18gLyogVG8gYWxsb3cgZml4aW5nIG9sZCBjYWxscyovCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpZmRlZiBDT05GSUdfVklERU9fVjRMMQogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogCiAjZGVmaW5lIFZJREVPX05VTV9ERVZJQ0VTCTI1NgogI2RlZmluZSBWSURFT19OQU1FICAgICAgICAgICAgICAidmlkZW80bGludXgiCkBAIC00MSw3ICs1OCw4IEBACiAKIHN0YXRpYyBzc2l6ZV90IHNob3dfbmFtZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjZCwgY2hhciAqYnVmKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsCisJCQkJCQkJCWNsYXNzX2Rldik7CiAJcmV0dXJuIHNwcmludGYoYnVmLCIlLipzXG4iLChpbnQpc2l6ZW9mKHZmZC0+bmFtZSksdmZkLT5uYW1lKTsKIH0KIApAQCAtNjIsNyArODAsOCBAQAogCiBzdGF0aWMgdm9pZCB2aWRlb19yZWxlYXNlKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNkKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCA9IGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgY2xhc3NfZGV2KTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSBjb250YWluZXJfb2YoY2QsIHN0cnVjdCB2aWRlb19kZXZpY2UsCisJCQkJCQkJCWNsYXNzX2Rldik7CiAKICNpZiAxCiAJLyogbmVlZGVkIHVudGlsIGFsbCBkcml2ZXJzIGFyZSBmaXhlZCAqLwpAQCAtOTAsNyArMTA5LDcgQEAKIH0KIAogLyoKLSAqCU9wZW4gYSB2aWRlbyBkZXZpY2UuCisgKglPcGVuIGEgdmlkZW8gZGV2aWNlIC0gRklYTUU6IE9ic29sZXRlZAogICovCiBzdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CkBAIC0xMzAsNiArMTQ5LDcgQEAKICAqIGhlbHBlciBmdW5jdGlvbiAtLSBoYW5kbGVzIHVzZXJzcGFjZSBjb3B5aW5nIGZvciBpb2N0bCBhcmd1bWVudHMKICAqLwogCisjaWZkZWYgX19PTERfVklESU9DXwogc3RhdGljIHVuc2lnbmVkIGludAogdmlkZW9fZml4X2NvbW1hbmQodW5zaWduZWQgaW50IGNtZCkKIHsKQEAgLTE1NSw3ICsxNzUsMTEgQEAKIAl9CiAJcmV0dXJuIGNtZDsKIH0KKyNlbmRpZgogCisvKgorICogT2Jzb2xldGUgdXNlcmNvcHkgZnVuY3Rpb24gLSBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCisgKi8KIGludAogdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCiAJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLApAQCAtMTY2LDggKzE5MCwxMjE4IEBACiAJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CiAJdm9pZAkqcGFyZyA9IE5VTEw7CiAJaW50CWVyciAgPSAtRUlOVkFMOworCWludCAgICAgaXNfZXh0X2N0cmw7CisJc2l6ZV90ICBjdHJsc19zaXplID0gMDsKKwl2b2lkIF9fdXNlciAqdXNlcl9wdHIgPSBOVUxMOwogCisjaWZkZWYgX19PTERfVklESU9DXwogCWNtZCA9IHZpZGVvX2ZpeF9jb21tYW5kKGNtZCk7CisjZW5kaWYKKwlpc19leHRfY3RybCA9IChjbWQgPT0gVklESU9DX1NfRVhUX0NUUkxTIHx8IGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMgfHwKKwkJICAgICAgIGNtZCA9PSBWSURJT0NfVFJZX0VYVF9DVFJMUyk7CisKKwkvKiAgQ29weSBhcmd1bWVudHMgaW50byB0ZW1wIGtlcm5lbCBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CisJY2FzZSBfSU9DX05PTkU6CisJCXBhcmcgPSBOVUxMOworCQlicmVhazsKKwljYXNlIF9JT0NfUkVBRDoKKwljYXNlIF9JT0NfV1JJVEU6CisJY2FzZSAoX0lPQ19XUklURSB8IF9JT0NfUkVBRCk6CisJCWlmIChfSU9DX1NJWkUoY21kKSA8PSBzaXplb2Yoc2J1ZikpIHsKKwkJCXBhcmcgPSBzYnVmOworCQl9IGVsc2UgeworCQkJLyogdG9vIGJpZyB0byBhbGxvY2F0ZSBmcm9tIHN0YWNrICovCisJCQltYnVmID0ga21hbGxvYyhfSU9DX1NJWkUoY21kKSxHRlBfS0VSTkVMKTsKKwkJCWlmIChOVUxMID09IG1idWYpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlwYXJnID0gbWJ1ZjsKKwkJfQorCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihwYXJnLCAodm9pZCBfX3VzZXIgKilhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJfQorCWlmIChpc19leHRfY3RybCkgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBwYXJnOworCisJCS8qIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHRlbGwgdGhlIGNhbGxlciB0aGF0IGl0IHdhc24ndAorCQkgICBhIHNwZWNpZmljIGNvbnRyb2wgdGhhdCBjYXVzZWQgaXQuICovCisJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OworCQl1c2VyX3B0ciA9ICh2b2lkIF9fdXNlciAqKXAtPmNvbnRyb2xzOworCQlpZiAocC0+Y291bnQpIHsKKwkJCWN0cmxzX3NpemUgPSBzaXplb2Yoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wpICogcC0+Y291bnQ7CisJCQkvKiBOb3RlOiB2NGwyX2V4dF9jb250cm9scyBmaXRzIGluIHNidWZbXSBzbyBtYnVmIGlzIHN0aWxsIE5VTEwuICovCisJCQltYnVmID0ga21hbGxvYyhjdHJsc19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlpZiAoTlVMTCA9PSBtYnVmKQorCQkJCWdvdG8gb3V0X2V4dF9jdHJsOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihtYnVmLCB1c2VyX3B0ciwgY3RybHNfc2l6ZSkpCisJCQkJZ290byBvdXRfZXh0X2N0cmw7CisJCQlwLT5jb250cm9scyA9IG1idWY7CisJCX0KKwl9CisKKwkvKiBjYWxsIGRyaXZlciAqLworCWVyciA9IGZ1bmMoaW5vZGUsIGZpbGUsIGNtZCwgcGFyZyk7CisJaWYgKGVyciA9PSAtRU5PSU9DVExDTUQpCisJCWVyciA9IC1FSU5WQUw7CisJaWYgKGlzX2V4dF9jdHJsKSB7CisJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqcCA9IHBhcmc7CisKKwkJcC0+Y29udHJvbHMgPSAodm9pZCAqKXVzZXJfcHRyOworCQlpZiAocC0+Y291bnQgJiYgZXJyID09IDAgJiYgY29weV90b191c2VyKHVzZXJfcHRyLCBtYnVmLCBjdHJsc19zaXplKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X2V4dF9jdHJsOworCX0KKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CisKK291dF9leHRfY3RybDoKKwkvKiAgQ29weSByZXN1bHRzIGludG8gdXNlciBidWZmZXIgICovCisJc3dpdGNoIChfSU9DX0RJUihjbWQpKQorCXsKKwljYXNlIF9JT0NfUkVBRDoKKwljYXNlIChfSU9DX1dSSVRFIHwgX0lPQ19SRUFEKToKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHBhcmcsIF9JT0NfU0laRShjbWQpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKworb3V0OgorCWtmcmVlKG1idWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBvcGVuL3JlbGVhc2UgaGVscGVyIGZ1bmN0aW9ucyAtLSBoYW5kbGUgZXhjbHVzaXZlIG9wZW5zCisgKiBTaG91bGQgYmUgcmVtb3ZlZCBzb29uCisgKi8KK2ludCB2aWRlb19leGNsdXNpdmVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqdmZsID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKwlpbnQgcmV0dmFsID0gMDsKKworCW11dGV4X2xvY2soJnZmbC0+bG9jayk7CisJaWYgKHZmbC0+dXNlcnMpIHsKKwkJcmV0dmFsID0gLUVCVVNZOworCX0gZWxzZSB7CisJCXZmbC0+dXNlcnMrKzsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2ZmwtPmxvY2spOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgIHZpZGVvX2RldmljZSAqdmZsID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKKworCXZmbC0+dXNlcnMtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKnY0bDJfbWVtb3J5X25hbWVzW10gPSB7CisJW1Y0TDJfTUVNT1JZX01NQVBdICAgID0gIm1tYXAiLAorCVtWNEwyX01FTU9SWV9VU0VSUFRSXSA9ICJ1c2VycHRyIiwKKwlbVjRMMl9NRU1PUllfT1ZFUkxBWV0gPSAib3ZlcmxheSIsCit9OworCisKKy8qIEZJWE1FOiBUaG9zZSBzdHVmZiBhcmUgcmVwbGljYXRlZCBhbHNvIG9uIHY0bDItY29tbW9uLmMgKi8KK3N0YXRpYyBjaGFyICp2NGwyX3R5cGVfbmFtZXNfRklYTUVbXSA9IHsKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFXSAgICAgID0gInZpZGVvLWNhcCIsCisJW1Y0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWV0gICAgICA9ICJ2aWRlby1vdmVyIiwKKwlbVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRdICAgICAgID0gInZpZGVvLW91dCIsCisJW1Y0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkVdICAgICAgICA9ICJ2YmktY2FwIiwKKwlbVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUXSAgICAgICAgID0gInZiaS1vdXQiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUXSAgPSAic2xpY2VkLXZiaS1vdXQiLAorCVtWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRV0gPSAic2xpY2VkLXZiaS1jYXB0dXJlIiwKKwlbVjRMMl9CVUZfVFlQRV9QUklWQVRFXSAgICAgICAgICAgID0gInByaXZhdGUiLAorfTsKKworc3RhdGljIGNoYXIgKnY0bDJfZmllbGRfbmFtZXNfRklYTUVbXSA9IHsKKwlbVjRMMl9GSUVMRF9BTlldICAgICAgICA9ICJhbnkiLAorCVtWNEwyX0ZJRUxEX05PTkVdICAgICAgID0gIm5vbmUiLAorCVtWNEwyX0ZJRUxEX1RPUF0gICAgICAgID0gInRvcCIsCisJW1Y0TDJfRklFTERfQk9UVE9NXSAgICAgPSAiYm90dG9tIiwKKwlbVjRMMl9GSUVMRF9JTlRFUkxBQ0VEXSA9ICJpbnRlcmxhY2VkIiwKKwlbVjRMMl9GSUVMRF9TRVFfVEJdICAgICA9ICJzZXEtdGIiLAorCVtWNEwyX0ZJRUxEX1NFUV9CVF0gICAgID0gInNlcS1idCIsCisJW1Y0TDJfRklFTERfQUxURVJOQVRFXSAgPSAiYWx0ZXJuYXRlIiwKK307CisKKyNkZWZpbmUgcHJ0X25hbWVzKGEsYXJyKSAoKChhKT49MCkmJigoYSk8QVJSQVlfU0laRShhcnIpKSk/YXJyW2FdOiJ1bmtub3duIgorCitzdGF0aWMgdm9pZCBkYmdidWYodW5zaWduZWQgaW50IGNtZCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IHY0bDJfdGltZWNvZGUgKnRjPSZwLT50aW1lY29kZTsKKworCWRiZ2FyZyAoY21kLCAiJTAybGQ6JTAyZDolMDJkLiUwOGxkIGluZGV4PSVkLCB0eXBlPSVzLCAiCisJCSJieXRlc3VzZWQ9JWQsIGZsYWdzPTB4JTA4ZCwgIgorCQkiZmllbGQ9JTBkLCBzZXF1ZW5jZT0lZCwgbWVtb3J5PSVzLCBvZmZzZXQvdXNlcnB0cj0weCUwOGx4XG4iLAorCQkJKHAtPnRpbWVzdGFtcC50dl9zZWMvMzYwMCksCisJCQkoaW50KShwLT50aW1lc3RhbXAudHZfc2VjLzYwKSU2MCwKKwkJCShpbnQpKHAtPnRpbWVzdGFtcC50dl9zZWMlNjApLAorCQkJcC0+dGltZXN0YW1wLnR2X3VzZWMsCisJCQlwLT5pbmRleCwKKwkJCXBydF9uYW1lcyhwLT50eXBlLHY0bDJfdHlwZV9uYW1lc19GSVhNRSksCisJCQlwLT5ieXRlc3VzZWQscC0+ZmxhZ3MsCisJCQlwLT5maWVsZCxwLT5zZXF1ZW5jZSwKKwkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpLAorCQkJcC0+bS51c2VycHRyKTsKKwlkYmdhcmcyICgidGltZWNvZGU9ICUwMmQ6JTAyZDolMDJkIHR5cGU9JWQsICIKKwkJImZsYWdzPTB4JTA4ZCwgZnJhbWVzPSVkLCB1c2VyYml0cz0weCUwOHhcbiIsCisJCQl0Yy0+aG91cnMsdGMtPm1pbnV0ZXMsdGMtPnNlY29uZHMsCisJCQl0Yy0+dHlwZSwgdGMtPmZsYWdzLCB0Yy0+ZnJhbWVzLCAqKF9fdTMyICopIHRjLT51c2VyYml0cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYmdyZWN0KHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwgY2hhciAqcywKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9yZWN0ICpyKQoreworCWRiZ2FyZzIgKCIlc1JlY3Qgc3RhcnQgYXQgJWR4JWQsIHNpemU9ICVkeCVkXG4iLCBzLCByLT5sZWZ0LCByLT50b3AsCisJCQkJCQlyLT53aWR0aCwgci0+aGVpZ2h0KTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2NGxfcHJpbnRfcGl4X2ZtdCAoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJCQkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10KQoreworCWRiZ2FyZzIgKCJ3aWR0aD0lZCwgaGVpZ2h0PSVkLCBmb3JtYXQ9MHglMDh4LCBmaWVsZD0lcywgIgorCQkiYnl0ZXNwZXJsaW5lPSVkIHNpemVpbWFnZT0lZCwgY29sb3JzcGFjZT0lZFxuIiwKKwkJZm10LT53aWR0aCxmbXQtPmhlaWdodCxmbXQtPnBpeGVsZm9ybWF0LAorCQlwcnRfbmFtZXMoZm10LT5maWVsZCx2NGwyX2ZpZWxkX25hbWVzX0ZJWE1FKSwKKwkJZm10LT5ieXRlc3BlcmxpbmUsZm10LT5zaXplaW1hZ2UsZm10LT5jb2xvcnNwYWNlKTsKK307CisKKworc3RhdGljIGludCBjaGVja19mbXQgKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCwgZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X2NhcCkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF9vdmVybGF5KQorCQkJcmV0dXJuICgwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmkpCisJCQlyZXR1cm4gKDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQpCisJCQlyZXR1cm4gKDApOworCQlicmVhazsKKwljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZSkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZpZGVvX291dHB1dCkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KQorCQkJcmV0dXJuICgwKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCXJldHVybiAoMCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW50IF9fdmlkZW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXZvaWQgICAgICAgICAgICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOworCisJaWYgKCAodmZkLT5kZWJ1ZyAmIFY0TDJfREVCVUdfSU9DVEwpICYmCisJCQkJISh2ZmQtPmRlYnVnIHwgVjRMMl9ERUJVR19JT0NUTF9BUkcpKSB7CisJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CisJfQorCisJc3dpdGNoKGNtZCkgeworCS8qIC0tLSBjYXBhYmlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfUVVFUllDQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXAgPSAoc3RydWN0IHY0bDJfY2FwYWJpbGl0eSopYXJnOworCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOworCisJCWlmICghdmZkLT52aWRpb2NfcXVlcnljYXApCisJCQlicmVhazsKKworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnljYXAoZmlsZSwgZmgsIGNhcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJkcml2ZXI9JXMsIGNhcmQ9JXMsIGJ1cz0lcywgIgorCQkJCQkidmVyc2lvbj0weCUwOHgsICIKKwkJCQkJImNhcGFiaWxpdGllcz0weCUwOHhcbiIsCisJCQkJCWNhcC0+ZHJpdmVyLGNhcC0+Y2FyZCxjYXAtPmJ1c19pbmZvLAorCQkJCQljYXAtPnZlcnNpb24sCisJCQkJCWNhcC0+Y2FwYWJpbGl0aWVzKTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIHByaW9yaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0dfUFJJT1JJVFk6CisJeworCQllbnVtIHY0bDJfcHJpb3JpdHkgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19wcmlvcml0eSkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19wcmlvcml0eShmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnKGNtZCwgInByaW9yaXR5IGlzICVkXG4iLCAqcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1BSSU9SSVRZOgorCXsKKwkJZW51bSB2NGwyX3ByaW9yaXR5ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3NfcHJpb3JpdHkpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgInNldHRpbmcgcHJpb3JpdHkgdG8gJWRcbiIsICpwKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfcHJpb3JpdHkoZmlsZSwgZmgsICpwKTsKKwkJYnJlYWs7CisJfQorCisJLyogLS0tIGNhcHR1cmUgaW9jdGxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwljYXNlIFZJRElPQ19FTlVNX0ZNVDoKKwl7CisJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYgPSBhcmc7CisJCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlOworCQl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkJaW5kZXggPSBmLT5pbmRleDsKKwkJdHlwZSAgPSBmLT50eXBlOworCQltZW1zZXQoZiwwLHNpemVvZigqZikpOworCQlmLT5pbmRleCA9IGluZGV4OworCQlmLT50eXBlICA9IHR5cGU7CisKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2VudW1fZm10X2NhcCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZW51bV9mbXRfY2FwKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF9vdmVybGF5KQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdmJpKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92YmkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92Ymlfb3V0cHV0KGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2VudW1fZm10X3ZiaV9jYXB0dXJlKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF92YmlfY2FwdHVyZShmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19lbnVtX2ZtdF92aWRlb19vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX2VudW1fZm10X3ZpZGVvX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZW51bV9mbXRfdmJpX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCQlpZiAodmZkLT52aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKQorCQkJCXJldD12ZmQtPnZpZGlvY19lbnVtX2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgImluZGV4PSVkLCB0eXBlPSVkLCBmbGFncz0lZCwgIgorCQkJCQkiZGVzY3JpcHRpb249JXMsIgorCQkJCQkiIHBpeGVsZm9ybWF0PTB4JTh4XG4iLAorCQkJCQlmLT5pbmRleCwgZi0+dHlwZSwgZi0+ZmxhZ3MsCisJCQkJCWYtPmRlc2NyaXB0aW9uLAorCQkJCQlmLT5waXhlbGZvcm1hdCk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU9Zi0+dHlwZTsKKworCQltZW1zZXQoJmYtPmZtdC5waXgsMCxzaXplb2YoZi0+Zm10LnBpeCkpOworCQlmLT50eXBlPXR5cGU7CisKKwkJLyogRklYTUU6IFNob3VsZCBiZSBvbmUgZHVtcCBwZXIgdHlwZSAqLworCQlkYmdhcmcgKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyh0eXBlLAorCQkJCQl2NGwyX3R5cGVfbmFtZXNfRklYTUUpKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfY2FwKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF9jYXAoZmlsZSwgZmgsIGYpOworCQkJaWYgKCFyZXQpCisJCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCZmLT5mbXQucGl4KTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWToKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF9vdmVybGF5KQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdmJpKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92YmkoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92Ymlfb3V0cHV0KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX2dfZm10X3ZiaV9jYXB0dXJlKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF92YmlfY2FwdHVyZShmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY19nX2ZtdF92aWRlb19vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX2dfZm10X3ZpZGVvX291dHB1dChmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfZ19mbXRfdmJpX291dHB1dChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1BSSVZBVEU6CisJCQlpZiAodmZkLT52aWRpb2NfZ19mbXRfdHlwZV9wcml2YXRlKQorCQkJCXJldD12ZmQtPnZpZGlvY19nX2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19GTVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSAoc3RydWN0IHY0bDJfZm9ybWF0ICopYXJnOworCisJCS8qIEZJWE1FOiBTaG91bGQgYmUgb25lIGR1bXAgcGVyIHR5cGUgKi8KKwkJZGJnYXJnIChjbWQsICJ0eXBlPSVzXG4iLCBwcnRfbmFtZXMoZi0+dHlwZSwKKwkJCQkJdjRsMl90eXBlX25hbWVzX0ZJWE1FKSk7CisKKwkJc3dpdGNoIChmLT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJdjRsX3ByaW50X3BpeF9mbXQodmZkLCZmLT5mbXQucGl4KTsKKwkJCWlmICh2ZmQtPnZpZGlvY19zX2ZtdF9jYXApCisJCQkJcmV0PXZmZC0+dmlkaW9jX3NfZm10X2NhcChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfb3ZlcmxheShmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3ZiaSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpX291dHB1dChmaWxlLCBmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfQ0FQVFVSRToKKwkJCWlmICh2ZmQtPnZpZGlvY19zX2ZtdF92YmlfY2FwdHVyZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdmJpX2NhcHR1cmUoZmlsZSwgZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2Nfc19mbXRfdmlkZW9fb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY19zX2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQpCisJCQkJcmV0PXZmZC0+dmlkaW9jX3NfZm10X3ZiaV9vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9QUklWQVRFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3NfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2Nfc19mbXRfdHlwZV9wcml2YXRlKGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19UUllfRk1UOgorCXsKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKKworCQkvKiBGSVhNRTogU2hvdWxkIGJlIG9uZSBkdW1wIHBlciB0eXBlICovCisJCWRiZ2FyZyAoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKGYtPnR5cGUsCisJCQkJCQl2NGwyX3R5cGVfbmFtZXNfRklYTUUpKTsKKwkJc3dpdGNoIChmLT50eXBlKSB7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfY2FwKQorCQkJCXJldD12ZmQtPnZpZGlvY190cnlfZm10X2NhcChmaWxlLCBmaCwgZik7CisJCQlpZiAoIXJldCkKKwkJCQl2NGxfcHJpbnRfcGl4X2ZtdCh2ZmQsJmYtPmZtdC5waXgpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfb3ZlcmxheSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF9vdmVybGF5KGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmkpCisJCQkJcmV0PXZmZC0+dmlkaW9jX3RyeV9mbXRfdmJpKGZpbGUsIGZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9PVVRQVVQ6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KQorCQkJCXJldD12ZmQtPnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkU6CisJCQlpZiAodmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZShmaWxlLAorCQkJCQkJCQlmaCwgZik7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDoKKwkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3ZpZGVvX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92aWRlb19vdXRwdXQoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUOgorCQkJaWYgKHZmZC0+dmlkaW9jX3RyeV9mbXRfdmJpX291dHB1dCkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF92Ymlfb3V0cHV0KGZpbGUsCisJCQkJCQkJCWZoLCBmKTsKKwkJCWJyZWFrOworCQljYXNlIFY0TDJfQlVGX1RZUEVfUFJJVkFURToKKwkJCWlmICh2ZmQtPnZpZGlvY190cnlfZm10X3R5cGVfcHJpdmF0ZSkKKwkJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUoZmlsZSwKKwkJCQkJCQkJZmgsIGYpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKwl9CisJLyogRklYTUU6IFRob3NlIGJ1ZiByZXFzIGNvdWxkIGJlIGhhbmRsZWQgaGVyZSwKKwkgICB3aXRoIHNvbWUgY2hhbmdlcyBvbiB2aWRlb2J1ZiB0byBhbGxvdyBpdHMgaGVhZGVyIHRvIGJlIGluY2x1ZGVkIGF0CisJICAgdmlkZW9kZXYyLmggb3IgYmVpbmcgbWVyZ2VkIGF0IHZpZGVvZGV2Mi4KKwkgKi8KKwljYXNlIFZJRElPQ19SRVFCVUZTOgorCXsKKwkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfcmVxYnVmcykKKwkJCWJyZWFrOworCQlyZXQgPSBjaGVja19mbXQgKHZmZCwgcC0+dHlwZSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQlyZXQ9dmZkLT52aWRpb2NfcmVxYnVmcyhmaWxlLCBmaCwgcCk7CisJCWRiZ2FyZyAoY21kLCAiY291bnQ9JWQsIHR5cGU9JXMsIG1lbW9yeT0lc1xuIiwKKwkJCQlwLT5jb3VudCwKKwkJCQlwcnRfbmFtZXMocC0+dHlwZSx2NGwyX3R5cGVfbmFtZXNfRklYTUUpLAorCQkJCXBydF9uYW1lcyhwLT5tZW1vcnksdjRsMl9tZW1vcnlfbmFtZXMpKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3F1ZXJ5YnVmKQorCQkJYnJlYWs7CisJCXJldCA9IGNoZWNrX2ZtdCAodmZkLCBwLT50eXBlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCisJCXJldD12ZmQtPnZpZGlvY19xdWVyeWJ1ZihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYnVmKGNtZCx2ZmQscCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19RQlVGOgorCXsKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3FidWYpCisJCQlicmVhazsKKwkJcmV0ID0gY2hlY2tfZm10ICh2ZmQsIHAtPnR5cGUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJcmV0PXZmZC0+dmlkaW9jX3FidWYoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2J1ZihjbWQsdmZkLHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfRFFCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3FidWYpCisJCQlicmVhazsKKwkJcmV0ID0gY2hlY2tfZm10ICh2ZmQsIHAtPnR5cGUpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJcmV0PXZmZC0+dmlkaW9jX3FidWYoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2J1ZihjbWQsdmZkLHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfT1ZFUkxBWToKKwl7CisJCWludCAqaSA9IGFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX292ZXJsYXkpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ2YWx1ZT0lZFxuIiwqaSk7CisJCXJldD12ZmQtPnZpZGlvY19vdmVybGF5KGZpbGUsIGZoLCAqaSk7CisJCWJyZWFrOworCX0KKyNpZmRlZiBIQVZFX1Y0TDEKKwkvKiAtLS0gc3RyZWFtaW5nIGNhcHR1cmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DR01CVUY6CisJeworCQlzdHJ1Y3QgdmlkZW9fbWJ1ZiAqcD1hcmc7CisKKwkJbWVtc2V0KHAsMCxzaXplb2YocCkpOworCisJCWlmICghdmZkLT52aWRpb2NnbWJ1ZikKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NnbWJ1ZihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJzaXplPSVkLCBmcmFtZXM9JWQsIG9mZnNldHM9MHglMDhseFxuIiwKKwkJCQkJCXAtPnNpemUsIHAtPmZyYW1lcywKKwkJCQkJCSh1bnNpZ25lZCBsb25nKXAtPm9mZnNldHMpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwljYXNlIFZJRElPQ19HX0ZCVUY6CisJeworCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19mYnVmKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX2ZidWYoZmlsZSwgZmgsIGFyZyk7CisJCWlmICghcmV0KSB7CisJCQlkYmdhcmcgKGNtZCwgImNhcGFiaWxpdHk9JWQsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsCisJCQkJCXAtPmNhcGFiaWxpdHkscC0+ZmxhZ3MsCisJCQkJCSh1bnNpZ25lZCBsb25nKXAtPmJhc2UpOworCQkJdjRsX3ByaW50X3BpeF9mbXQgKHZmZCwgJnAtPmZtdCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRkJVRjoKKwl7CisJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX2ZidWYpCisJCQlicmVhazsKKworCQlkYmdhcmcgKGNtZCwgImNhcGFiaWxpdHk9JWQsIGZsYWdzPSVkLCBiYXNlPTB4JTA4bHhcbiIsCisJCQkJcC0+Y2FwYWJpbGl0eSxwLT5mbGFncywodW5zaWduZWQgbG9uZylwLT5iYXNlKTsKKwkJdjRsX3ByaW50X3BpeF9mbXQgKHZmZCwgJnAtPmZtdCk7CisJCXJldD12ZmQtPnZpZGlvY19zX2ZidWYoZmlsZSwgZmgsIGFyZyk7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NUUkVBTU9OOgorCXsKKwkJZW51bSB2NGwyX2J1Zl90eXBlIGkgPSAqKGludCAqKWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zdHJlYW1vbikKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInR5cGU9JXNcbiIsIHBydF9uYW1lcyhpLHY0bDJfdHlwZV9uYW1lc19GSVhNRSkpOworCQlyZXQ9dmZkLT52aWRpb2Nfc3RyZWFtb24oZmlsZSwgZmgsaSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TVFJFQU1PRkY6CisJeworCQllbnVtIHY0bDJfYnVmX3R5cGUgaSA9ICooaW50ICopYXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc3RyZWFtb2ZmKQorCQkJYnJlYWs7CisJCWRiZ2FyZyAoY21kLCAidHlwZT0lc1xuIiwgcHJ0X25hbWVzKGksdjRsMl90eXBlX25hbWVzX0ZJWE1FKSk7CisJCXJldD12ZmQtPnZpZGlvY19zdHJlYW1vZmYoZmlsZSwgZmgsIGkpOworCQlicmVhazsKKwl9CisJLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfRU5VTVNURDoKKwl7CisJCXN0cnVjdCB2NGwyX3N0YW5kYXJkICpwID0gYXJnOworCQl1bnNpZ25lZCBpbnQgaW5kZXggPSBwLT5pbmRleDsKKworCQlpZiAoIXZmZC0+dHZub3Jtc2l6ZSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIiVzOiBubyBUViBub3JtcyBkZWZpbmVkIVxuIiwKKwkJCQkJCXZmZC0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpbmRleDw9MCB8fCBpbmRleCA+PSB2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCXJldD0tRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJdjRsMl92aWRlb19zdGRfY29uc3RydWN0KHAsIHZmZC0+dHZub3Jtc1twLT5pbmRleF0uaWQsCisJCQkJCSB2ZmQtPnR2bm9ybXNbcC0+aW5kZXhdLm5hbWUpOworCQlwLT5pbmRleCA9IGluZGV4OworCisJCWRiZ2FyZyAoY21kLCAiaW5kZXg9JWQsIGlkPSVMZCwgbmFtZT0lcywgZnBzPSVkLyVkLCAiCisJCQkJImZyYW1lbGluZXM9JWRcbiIsIHAtPmluZGV4LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcC0+aWQsIHAtPm5hbWUsCisJCQkJcC0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yLAorCQkJCXAtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yLAorCQkJCXAtPmZyYW1lbGluZXMpOworCisJCXJldD0wOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19TVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisKKwkJKmlkID0gdmZkLT5jdXJyZW50X25vcm07CisKKwkJZGJnYXJnIChjbWQsICJ2YWx1ZT0lTHVcbiIsIChsb25nIGxvbmcgdW5zaWduZWQpICppZCk7CisKKwkJcmV0PTA7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1NURDoKKwl7CisJCXY0bDJfc3RkX2lkICppZCA9IGFyZzsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJaWYgKCF2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HICIlczogbm8gVFYgbm9ybXMgZGVmaW5lZCFcbiIsCisJCQkJCQl2ZmQtPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVMdVxuIiwgKGxvbmcgbG9uZyB1bnNpZ25lZCkgKmlkKTsKKworCQkvKiBGaXJzdCBzZWFyY2ggZm9yIGV4YWN0IG1hdGNoICovCisJCWZvciAoaSA9IDA7IGkgPCB2ZmQtPnR2bm9ybXNpemU7IGkrKykKKwkJCWlmICgqaWQgPT0gdmZkLT50dm5vcm1zW2ldLmlkKQorCQkJCWJyZWFrOworCQkvKiBUaGVuIGZvciBhIGdlbmVyaWMgdmlkZW8gc3RkIHRoYXQgY29udGFpbnMgZGVzaXJlZCBzdGQgKi8KKwkJaWYgKGkgPT0gdmZkLT50dm5vcm1zaXplKQorCQkJZm9yIChpID0gMDsgaSA8IHZmZC0+dHZub3Jtc2l6ZTsgaSsrKQorCQkJCWlmICgqaWQgJiB2ZmQtPnR2bm9ybXNbaV0uaWQpCisJCQkJCWJyZWFrOworCQlpZiAoaSA9PSB2ZmQtPnR2bm9ybXNpemUpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ2FsbHMgdGhlIHNwZWNpZmljIGhhbmRsZXIgKi8KKwkJaWYgKHZmZC0+dmlkaW9jX3Nfc3RkKQorCQkJcmV0PXZmZC0+dmlkaW9jX3Nfc3RkKGZpbGUsIGZoLCBpKTsKKwkJZWxzZQorCQkJcmV0PS1FSU5WQUw7CisKKwkJLyogVXBkYXRlcyBzdGFuZGFyZCBpbmZvcm1hdGlvbiAqLworCQlpZiAoIXJldCkKKwkJCXZmZC0+Y3VycmVudF9ub3JtPSppZDsKKworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfUVVFUllTVEQ6CisJeworCQl2NGwyX3N0ZF9pZCAqcD1hcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19xdWVyeXN0ZCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnlzdGQoZmlsZSwgZmgsIGFyZyk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJkZXRlY3RlZCBzdGQ9JUx1XG4iLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykqcCk7CisJCWJyZWFrOworCX0KKwkvKiAtLS0tLS0gaW5wdXQgc3dpdGNoaW5nIC0tLS0tLS0tLS0gKi8KKwkvKiBGSVhNRTogSW5wdXRzIGNhbiBiZSBoYW5kbGVkIGluc2lkZSB2aWRlb2RldjIgKi8KKwljYXNlIFZJRElPQ19FTlVNSU5QVVQ6CisJeworCQlzdHJ1Y3QgdjRsMl9pbnB1dCAqcD1hcmc7CisJCWludCBpPXAtPmluZGV4OworCisJCWlmICghdmZkLT52aWRpb2NfZW51bV9pbnB1dCkKKwkJCWJyZWFrOworCQltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJCXAtPmluZGV4PWk7CisKKwkJcmV0PXZmZC0+dmlkaW9jX2VudW1faW5wdXQoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIHR5cGU9JWQsICIKKwkJCQkJImF1ZGlvc2V0PSVkLCAiCisJCQkJCSJ0dW5lcj0lZCwgc3RkPSVMZCwgc3RhdHVzPSVkXG4iLAorCQkJCQlwLT5pbmRleCxwLT5uYW1lLHAtPnR5cGUscC0+YXVkaW9zZXQsCisJCQkJCXAtPnR1bmVyLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXAtPnN0ZCwKKwkJCQkJcC0+c3RhdHVzKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX2lucHV0KQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX2lucHV0KGZpbGUsIGZoLCBpKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVkXG4iLCppKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfSU5QVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX2lucHV0KQorCQkJYnJlYWs7CisJCWRiZ2FyZyAoY21kLCAidmFsdWU9JWRcbiIsKmkpOworCQlyZXQ9dmZkLT52aWRpb2Nfc19pbnB1dChmaWxlLCBmaCwgKmkpOworCQlicmVhazsKKwl9CisKKwkvKiAtLS0tLS0gb3V0cHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfR19PVVRQVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX291dHB1dCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19vdXRwdXQoZmlsZSwgZmgsIGkpOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAidmFsdWU9JWRcbiIsKmkpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19PVVRQVVQ6CisJeworCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX291dHB1dCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInZhbHVlPSVkXG4iLCppKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3Nfb3V0cHV0KGZpbGUsIGZoLCAqaSk7CisJCWJyZWFrOworCX0KKworCS8qIC0tLSBjb250cm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJY2FzZSBWSURJT0NfUVVFUllDVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3F1ZXJ5Y3RybCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfcXVlcnljdHJsKGZpbGUsIGZoLCBwKTsKKworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaWQ9JWQsIHR5cGU9JWQsIG5hbWU9JXMsICIKKwkJCQkJIm1pbi9tYXg9JWQvJWQsIgorCQkJCQkiIHN0ZXA9JWQsIGRlZmF1bHQ9JWQsIGZsYWdzPTB4JTA4eFxuIiwKKwkJCQkJcC0+aWQscC0+dHlwZSxwLT5uYW1lLHAtPm1pbmltdW0sCisJCQkJCXAtPm1heGltdW0scC0+c3RlcCxwLT5kZWZhdWx0X3ZhbHVlLAorCQkJCQlwLT5mbGFncyk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0NUUkw6CisJeworCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwID0gYXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19jdHJsKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJFbnVtIGZvciBpbmRleD0lZFxuIiwgcC0+aWQpOworCisJCXJldD12ZmQtPnZpZGlvY19nX2N0cmwoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZzIgKCAiaWQ9JWQsIHZhbHVlPSVkXG4iLCBwLT5pZCwgcC0+dmFsdWUpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DVFJMOgorCXsKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqcCA9IGFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX3NfY3RybCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgImlkPSVkLCB2YWx1ZT0lZFxuIiwgcC0+aWQsIHAtPnZhbHVlKTsKKworCQlyZXQ9dmZkLT52aWRpb2Nfc19jdHJsKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOworCisJCWlmICh2ZmQtPnZpZGlvY19nX2V4dF9jdHJscykgeworCQkJZGJnYXJnKGNtZCwgImNvdW50PSVkXG4iLCBwLT5jb3VudCk7CisKKwkJCXJldD12ZmQtPnZpZGlvY19nX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgorCXsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOworCisJCWlmICh2ZmQtPnZpZGlvY19zX2V4dF9jdHJscykgeworCQkJZGJnYXJnKGNtZCwgImNvdW50PSVkXG4iLCBwLT5jb3VudCk7CisKKwkJCXJldD12ZmQtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1RSWV9FWFRfQ1RSTFM6CisJeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CisKKwkJaWYgKHZmZC0+dmlkaW9jX3RyeV9leHRfY3RybHMpIHsKKwkJCWRiZ2FyZyhjbWQsICJjb3VudD0lZFxuIiwgcC0+Y291bnQpOworCisJCQlyZXQ9dmZkLT52aWRpb2NfdHJ5X2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1FVRVJZTUVOVToKKwl7CisJCXN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfcXVlcnltZW51KQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19xdWVyeW1lbnUoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZyAoY21kLCAiaWQ9JWQsIGluZGV4PSVkLCBuYW1lPSVzXG4iLAorCQkJCQkJcC0+aWQscC0+aW5kZXgscC0+bmFtZSk7CisJCWJyZWFrOworCX0KKwkvKiAtLS0gYXVkaW8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCWNhc2UgVklESU9DX0VOVU1BVURJTzoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2VudW1hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiRW51bSBmb3IgaW5kZXg9JWRcbiIsIHAtPmluZGV4KTsKKwkJcmV0PXZmZC0+dmlkaW9jX2VudW1hdWRpbyhmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnMigiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIscC0+aW5kZXgscC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2NfZ19hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiR2V0IGZvciBpbmRleD0lZFxuIiwgcC0+aW5kZXgpOworCQlyZXQ9dmZkLT52aWRpb2NfZ19hdWRpbyhmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnMigiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIscC0+aW5kZXgsCisJCQkJCXAtPm5hbWUscC0+Y2FwYWJpbGl0eSwgcC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0FVRElPOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW8gKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc19hdWRpbykKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkJIm1vZGU9JWRcbiIsIHAtPmluZGV4LCBwLT5uYW1lLAorCQkJCQlwLT5jYXBhYmlsaXR5LCBwLT5tb2RlKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfYXVkaW8oZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfRU5VTUFVRE9VVDoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2VudW1hdWRvdXQpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgIkVudW0gZm9yIGluZGV4PSVkXG4iLCBwLT5pbmRleCk7CisJCXJldD12ZmQtPnZpZGlvY19lbnVtYXVkb3V0KGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcyKCJpbmRleD0lZCwgbmFtZT0lcywgY2FwYWJpbGl0eT0lZCwgIgorCQkJCQkibW9kZT0lZFxuIiwgcC0+aW5kZXgsIHAtPm5hbWUsCisJCQkJCXAtPmNhcGFiaWxpdHkscC0+bW9kZSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0FVRE9VVDoKKwl7CisJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICpwPWFyZzsKKworCQlpZiAoIXZmZC0+dmlkaW9jX2dfYXVkb3V0KQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJFbnVtIGZvciBpbmRleD0lZFxuIiwgcC0+aW5kZXgpOworCQlyZXQ9dmZkLT52aWRpb2NfZ19hdWRvdXQoZmlsZSwgZmgsIHApOworCQlpZiAoIXJldCkKKwkJCWRiZ2FyZzIoImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCAiCisJCQkJCSJtb2RlPSVkXG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSxwLT5tb2RlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfQVVET1VUOgorCXsKKwkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKnA9YXJnOworCisJCWlmICghdmZkLT52aWRpb2Nfc19hdWRvdXQpCisJCQlicmVhazsKKwkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCBjYXBhYmlsaXR5PSVkLCAiCisJCQkJCSJtb2RlPSVkXG4iLCBwLT5pbmRleCwgcC0+bmFtZSwKKwkJCQkJcC0+Y2FwYWJpbGl0eSxwLT5tb2RlKTsKKworCQlyZXQ9dmZkLT52aWRpb2Nfc19hdWRvdXQoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19NT0RVTEFUT1I6CisJeworCQlzdHJ1Y3QgdjRsMl9tb2R1bGF0b3IgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX2dfbW9kdWxhdG9yKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX21vZHVsYXRvcihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnKGNtZCwgImluZGV4PSVkLCBuYW1lPSVzLCAiCisJCQkJCSJjYXBhYmlsaXR5PSVkLCByYW5nZWxvdz0lZCwiCisJCQkJCSIgcmFuZ2VoaWdoPSVkLCB0eHN1YmNoYW5zPSVkXG4iLAorCQkJCQlwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LAorCQkJCQlwLT5yYW5nZWxvdywgcC0+cmFuZ2VoaWdoLAorCQkJCQlwLT50eHN1YmNoYW5zKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfTU9EVUxBVE9SOgorCXsKKwkJc3RydWN0IHY0bDJfbW9kdWxhdG9yICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19zX21vZHVsYXRvcikKKwkJCWJyZWFrOworCQlkYmdhcmcoY21kLCAiaW5kZXg9JWQsIG5hbWU9JXMsIGNhcGFiaWxpdHk9JWQsICIKKwkJCQkicmFuZ2Vsb3c9JWQsIHJhbmdlaGlnaD0lZCwgdHhzdWJjaGFucz0lZFxuIiwKKwkJCQlwLT5pbmRleCwgcC0+bmFtZSxwLT5jYXBhYmlsaXR5LHAtPnJhbmdlbG93LAorCQkJCXAtPnJhbmdlaGlnaCxwLT50eHN1YmNoYW5zKTsKKwkJCXJldD12ZmQtPnZpZGlvY19zX21vZHVsYXRvcihmaWxlLCBmaCwgcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0NST1A6CisJeworCQlzdHJ1Y3QgdjRsMl9jcm9wICpwPWFyZzsKKwkJaWYgKCF2ZmQtPnZpZGlvY19nX2Nyb3ApCisJCQlicmVhazsKKwkJcmV0PXZmZC0+dmlkaW9jX2dfY3JvcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KSB7CisJCQlkYmdhcmcoY21kLCAidHlwZT0lZFxuIiwgcC0+dHlwZSk7CisJCQlkYmdyZWN0KHZmZCwgIiIsICZwLT5jKTsKKwkJfQorCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19DUk9QOgorCXsKKwkJc3RydWN0IHY0bDJfY3JvcCAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2Nfc19jcm9wKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJZGJncmVjdCh2ZmQsICIiLCAmcC0+Yyk7CisJCXJldD12ZmQtPnZpZGlvY19zX2Nyb3AoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfQ1JPUENBUDoKKwl7CisJCXN0cnVjdCB2NGwyX2Nyb3BjYXAgKnA9YXJnOworCQkvKkZJWE1FOiBTaG91bGQgYWxzbyBzaG93IHY0bDJfZnJhY3QgcGl4ZWxhc3BlY3QgKi8KKwkJaWYgKCF2ZmQtPnZpZGlvY19jcm9wY2FwKQorCQkJYnJlYWs7CisJCWRiZ2FyZyhjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJZGJncmVjdCh2ZmQsICJib3VuZHMgIiwgJnAtPmJvdW5kcyk7CisJCWRiZ3JlY3QodmZkLCAiZGVmcmVjdCAiLCAmcC0+ZGVmcmVjdCk7CisJCXJldD12ZmQtPnZpZGlvY19jcm9wY2FwKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfTVBFR0NPTVA6CisJeworCQlzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uICpwPWFyZzsKKworCQkvKkZJWE1FOiBTZXZlcmFsIGZpZWxkcyBub3Qgc2hvd24gKi8KKwkJaWYgKCF2ZmQtPnZpZGlvY19nX21wZWdjb21wKQorCQkJYnJlYWs7CisJCXJldD12ZmQtPnZpZGlvY19nX21wZWdjb21wKGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInRzX3BpZF9wbXQ9JWQsIHRzX3BpZF9hdWRpbz0lZCwiCisJCQkJCSIgdHNfcGlkX3ZpZGVvPSVkLCB0c19waWRfcGNyPSVkLCAiCisJCQkJCSJwc19zaXplPSVkLCBhdV9zYW1wbGVfcmF0ZT0lZCwgIgorCQkJCQkiYXVfcGVzaWQ9JWMsIHZpX2ZyYW1lX3JhdGU9JWQsICIKKwkJCQkJInZpX2ZyYW1lc19wZXJfZ29wPSVkLCAiCisJCQkJCSJ2aV9iZnJhbWVzX2NvdW50PSVkLCB2aV9wZXNpZD0lY1xuIiwKKwkJCQkJcC0+dHNfcGlkX3BtdCxwLT50c19waWRfYXVkaW8sCisJCQkJCXAtPnRzX3BpZF92aWRlbyxwLT50c19waWRfcGNyLAorCQkJCQlwLT5wc19zaXplLCBwLT5hdV9zYW1wbGVfcmF0ZSwKKwkJCQkJcC0+YXVfcGVzaWQsIHAtPnZpX2ZyYW1lX3JhdGUsCisJCQkJCXAtPnZpX2ZyYW1lc19wZXJfZ29wLAorCQkJCQlwLT52aV9iZnJhbWVzX2NvdW50LCBwLT52aV9wZXNpZCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX01QRUdDT01QOgorCXsKKwkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqcD1hcmc7CisJCS8qRklYTUU6IFNldmVyYWwgZmllbGRzIG5vdCBzaG93biAqLworCQlpZiAoIXZmZC0+dmlkaW9jX3NfbXBlZ2NvbXApCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ0c19waWRfcG10PSVkLCB0c19waWRfYXVkaW89JWQsICIKKwkJCQkidHNfcGlkX3ZpZGVvPSVkLCB0c19waWRfcGNyPSVkLCBwc19zaXplPSVkLCAiCisJCQkJImF1X3NhbXBsZV9yYXRlPSVkLCBhdV9wZXNpZD0lYywgIgorCQkJCSJ2aV9mcmFtZV9yYXRlPSVkLCB2aV9mcmFtZXNfcGVyX2dvcD0lZCwgIgorCQkJCSJ2aV9iZnJhbWVzX2NvdW50PSVkLCB2aV9wZXNpZD0lY1xuIiwKKwkJCQlwLT50c19waWRfcG10LHAtPnRzX3BpZF9hdWRpbywgcC0+dHNfcGlkX3ZpZGVvLAorCQkJCXAtPnRzX3BpZF9wY3IsIHAtPnBzX3NpemUsIHAtPmF1X3NhbXBsZV9yYXRlLAorCQkJCXAtPmF1X3Blc2lkLCBwLT52aV9mcmFtZV9yYXRlLAorCQkJCXAtPnZpX2ZyYW1lc19wZXJfZ29wLCBwLT52aV9iZnJhbWVzX2NvdW50LAorCQkJCXAtPnZpX3Blc2lkKTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfbXBlZ2NvbXAoZmlsZSwgZmgsIHApOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfR19KUEVHQ09NUDoKKwl7CisJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19qcGVnY29tcCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19qcGVnY29tcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJxdWFsaXR5PSVkLCBBUFBuPSVkLCAiCisJCQkJCQkiQVBQX2xlbj0lZCwgQ09NX2xlbj0lZCwgIgorCQkJCQkJImpwZWdfbWFya2Vycz0lZFxuIiwKKwkJCQkJCXAtPnF1YWxpdHkscC0+QVBQbixwLT5BUFBfbGVuLAorCQkJCQkJcC0+Q09NX2xlbixwLT5qcGVnX21hcmtlcnMpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfU19KUEVHQ09NUDoKKwl7CisJCXN0cnVjdCB2NGwyX2pwZWdjb21wcmVzc2lvbiAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19qcGVnY29tcCkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInF1YWxpdHk9JWQsIEFQUG49JWQsIEFQUF9sZW49JWQsICIKKwkJCQkJIkNPTV9sZW49JWQsIGpwZWdfbWFya2Vycz0lZFxuIiwKKwkJCQkJcC0+cXVhbGl0eSxwLT5BUFBuLHAtPkFQUF9sZW4sCisJCQkJCXAtPkNPTV9sZW4scC0+anBlZ19tYXJrZXJzKTsKKwkJCXJldD12ZmQtPnZpZGlvY19zX2pwZWdjb21wKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfUEFSTToKKwl7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX2dfcGFybSkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19wYXJtKGZpbGUsIGZoLCBwKTsKKwkJZGJnYXJnIChjbWQsICJ0eXBlPSVkXG4iLCBwLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX1NfUEFSTToKKwl7CisJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3NfcGFybSkKKwkJCWJyZWFrOworCQlkYmdhcmcgKGNtZCwgInR5cGU9JWRcbiIsIHAtPnR5cGUpOworCQlyZXQ9dmZkLT52aWRpb2Nfc19wYXJtKGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfVFVORVI6CisJeworCQlzdHJ1Y3QgdjRsMl90dW5lciAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ190dW5lcikKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ190dW5lcihmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgorCQkJCQkiY2FwYWJpbGl0eT0lZCwgcmFuZ2Vsb3c9JWQsICIKKwkJCQkJInJhbmdlaGlnaD0lZCwgc2lnbmFsPSVkLCBhZmM9JWQsICIKKwkJCQkJInJ4c3ViY2hhbnM9JWQsIGF1ZG1vZGU9JWRcbiIsCisJCQkJCXAtPmluZGV4LCBwLT5uYW1lLCBwLT50eXBlLAorCQkJCQlwLT5jYXBhYmlsaXR5LCBwLT5yYW5nZWxvdywKKwkJCQkJcC0+cmFuZ2VoaWdoLCBwLT5yeHN1YmNoYW5zLAorCQkJCQlwLT5hdWRtb2RlLCBwLT5zaWduYWwsIHAtPmFmYyk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX1RVTkVSOgorCXsKKwkJc3RydWN0IHY0bDJfdHVuZXIgKnA9YXJnOworCQlpZiAoIXZmZC0+dmlkaW9jX3NfdHVuZXIpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJpbmRleD0lZCwgbmFtZT0lcywgdHlwZT0lZCwgIgorCQkJCSJjYXBhYmlsaXR5PSVkLCByYW5nZWxvdz0lZCwgcmFuZ2VoaWdoPSVkLCAiCisJCQkJInNpZ25hbD0lZCwgYWZjPSVkLCByeHN1YmNoYW5zPSVkLCAiCisJCQkJImF1ZG1vZGU9JWRcbiIscC0+aW5kZXgsIHAtPm5hbWUsIHAtPnR5cGUsCisJCQkJcC0+Y2FwYWJpbGl0eSwgcC0+cmFuZ2Vsb3cscC0+cmFuZ2VoaWdoLAorCQkJCXAtPnJ4c3ViY2hhbnMsIHAtPmF1ZG1vZGUsIHAtPnNpZ25hbCwKKwkJCQlwLT5hZmMpOworCQlyZXQ9dmZkLT52aWRpb2Nfc190dW5lcihmaWxlLCBmaCwgcCk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19HX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19mcmVxdWVuY3kpCisJCQlicmVhazsKKwkJcmV0PXZmZC0+dmlkaW9jX2dfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKKwkJaWYgKCFyZXQpCisJCQlkYmdhcmcgKGNtZCwgInR1bmVyPSVkLCB0eXBlPSVkLCBmcmVxdWVuY3k9JWRcbiIsCisJCQkJCQlwLT50dW5lcixwLT50eXBlLHAtPmZyZXF1ZW5jeSk7CisJCWJyZWFrOworCX0KKwljYXNlIFZJRElPQ19TX0ZSRVFVRU5DWToKKwl7CisJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2Nfc19mcmVxdWVuY3kpCisJCQlicmVhazsKKwkJZGJnYXJnIChjbWQsICJ0dW5lcj0lZCwgdHlwZT0lZCwgZnJlcXVlbmN5PSVkXG4iLAorCQkJCXAtPnR1bmVyLHAtPnR5cGUscC0+ZnJlcXVlbmN5KTsKKwkJcmV0PXZmZC0+dmlkaW9jX3NfZnJlcXVlbmN5KGZpbGUsIGZoLCBwKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgVklESU9DX0dfU0xJQ0VEX1ZCSV9DQVA6CisJeworCQlzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCAqcD1hcmc7CisJCWlmICghdmZkLT52aWRpb2NfZ19zbGljZWRfdmJpX2NhcCkKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfZ19zbGljZWRfdmJpX2NhcChmaWxlLCBmaCwgcCk7CisJCWlmICghcmV0KQorCQkJZGJnYXJnIChjbWQsICJzZXJ2aWNlX3NldD0lZFxuIiwgcC0+c2VydmljZV9zZXQpOworCQlicmVhazsKKwl9CisJY2FzZSBWSURJT0NfTE9HX1NUQVRVUzoKKwl7CisJCWlmICghdmZkLT52aWRpb2NfbG9nX3N0YXR1cykKKwkJCWJyZWFrOworCQlyZXQ9dmZkLT52aWRpb2NfbG9nX3N0YXR1cyhmaWxlLCBmaCk7CisJCWJyZWFrOworCX0KKworCS8qIC0tLSBPdGhlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwlkZWZhdWx0OgorCQlyZXQ9djRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLF9fdmlkZW9fZG9faW9jdGwpOworCX0KKworCWlmICh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTF9BUkcpIHsKKwkJaWYgKHJldDwwKSB7CisJCQlwcmludGsgKCIlczogZXJyOlxuIiwgdmZkLT5uYW1lKTsKKwkJCXY0bF9wcmludF9pb2N0bCh2ZmQtPm5hbWUsIGNtZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgdmlkZW9faW9jdGwyIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhcglzYnVmWzEyOF07CisJdm9pZCAgICAqbWJ1ZiA9IE5VTEw7CisJdm9pZAkqcGFyZyA9IE5VTEw7CisJaW50CWVyciAgPSAtRUlOVkFMOworCWludCAgICAgaXNfZXh0X2N0cmw7CisJc2l6ZV90ICBjdHJsc19zaXplID0gMDsKKwl2b2lkIF9fdXNlciAqdXNlcl9wdHIgPSBOVUxMOworCisjaWZkZWYgX19PTERfVklESU9DXworCWNtZCA9IHZpZGVvX2ZpeF9jb21tYW5kKGNtZCk7CisjZW5kaWYKKwlpc19leHRfY3RybCA9IChjbWQgPT0gVklESU9DX1NfRVhUX0NUUkxTIHx8IGNtZCA9PSBWSURJT0NfR19FWFRfQ1RSTFMgfHwKKwkJICAgICAgIGNtZCA9PSBWSURJT0NfVFJZX0VYVF9DVFJMUyk7CiAKIAkvKiAgQ29weSBhcmd1bWVudHMgaW50byB0ZW1wIGtlcm5lbCBidWZmZXIgICovCiAJc3dpdGNoIChfSU9DX0RJUihjbWQpKSB7CkBAIC0xOTQsMTMgKzE0MjgsNDMgQEAKIAkJYnJlYWs7CiAJfQogCi0JLyogY2FsbCBkcml2ZXIgKi8KLQllcnIgPSBmdW5jKGlub2RlLCBmaWxlLCBjbWQsIHBhcmcpOworCWlmIChpc19leHRfY3RybCkgeworCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBwYXJnOworCisJCS8qIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHRlbGwgdGhlIGNhbGxlciB0aGF0IGl0IHdhc24ndAorCQkgICBhIHNwZWNpZmljIGNvbnRyb2wgdGhhdCBjYXVzZWQgaXQuICovCisJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OworCQl1c2VyX3B0ciA9ICh2b2lkIF9fdXNlciAqKXAtPmNvbnRyb2xzOworCQlpZiAocC0+Y291bnQpIHsKKwkJCWN0cmxzX3NpemUgPSBzaXplb2Yoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wpICogcC0+Y291bnQ7CisJCQkvKiBOb3RlOiB2NGwyX2V4dF9jb250cm9scyBmaXRzIGluIHNidWZbXSBzbyBtYnVmIGlzIHN0aWxsIE5VTEwuICovCisJCQltYnVmID0ga21hbGxvYyhjdHJsc19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlpZiAoTlVMTCA9PSBtYnVmKQorCQkJCWdvdG8gb3V0X2V4dF9jdHJsOworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihtYnVmLCB1c2VyX3B0ciwgY3RybHNfc2l6ZSkpCisJCQkJZ290byBvdXRfZXh0X2N0cmw7CisJCQlwLT5jb250cm9scyA9IG1idWY7CisJCX0KKwl9CisKKwkvKiBIYW5kbGVzIElPQ1RMICovCisJZXJyID0gX192aWRlb19kb19pb2N0bChpbm9kZSwgZmlsZSwgY21kLCBwYXJnKTsKIAlpZiAoZXJyID09IC1FTk9JT0NUTENNRCkKIAkJZXJyID0gLUVJTlZBTDsKKwlpZiAoaXNfZXh0X2N0cmwpIHsKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gcGFyZzsKKworCQlwLT5jb250cm9scyA9ICh2b2lkICopdXNlcl9wdHI7CisJCWlmIChwLT5jb3VudCAmJiBlcnIgPT0gMCAmJiBjb3B5X3RvX3VzZXIodXNlcl9wdHIsIG1idWYsIGN0cmxzX3NpemUpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJZ290byBvdXRfZXh0X2N0cmw7CisJfQogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dDsKIAorb3V0X2V4dF9jdHJsOgogCS8qICBDb3B5IHJlc3VsdHMgaW50byB1c2VyIGJ1ZmZlciAgKi8KIAlzd2l0Y2ggKF9JT0NfRElSKGNtZCkpCiAJewpAQCAtMjE2LDMxICsxNDgwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogb3Blbi9yZWxlYXNlIGhlbHBlciBmdW5jdGlvbnMgLS0gaGFuZGxlIGV4Y2x1c2l2ZSBvcGVucwotICovCi1pbnQgdmlkZW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0ICB2aWRlb19kZXZpY2UgKnZmbCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZ2ZmwtPmxvY2spOwotCWlmICh2ZmwtPnVzZXJzKSB7Ci0JCXJldHZhbCA9IC1FQlVTWTsKLQl9IGVsc2UgewotCQl2ZmwtPnVzZXJzKys7Ci0JfQotCW11dGV4X3VubG9jaygmdmZsLT5sb2NrKTsKLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0Jc3RydWN0ICB2aWRlb19kZXZpY2UgKnZmbCA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0KLQl2ZmwtPnVzZXJzLS07Ci0JcmV0dXJuIDA7Ci19CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM7CiAKQEAgLTM3MSw3ICsxNjEwLDkgQEAKIAltdXRleF91bmxvY2soJnZpZGVvZGV2X2xvY2spOwogfQogCi0KKy8qCisgKiBWaWRlbyBmcyBvcGVyYXRpb25zCisgKi8KIHN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHM9CiB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtMzg3LDcgKzE2MjgsNyBAQAogewogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICJMaW51eCB2aWRlbyBjYXB0dXJlIGludGVyZmFjZTogdjEuMDBcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkxpbnV4IHZpZGVvIGNhcHR1cmUgaW50ZXJmYWNlOiB2Mi4wMFxuIik7CiAJaWYgKHJlZ2lzdGVyX2NocmRldihWSURFT19NQUpPUiwgVklERU9fTkFNRSwgJnZpZGVvX2ZvcHMpKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvX2RldjogdW5hYmxlIHRvIGdldCBtYWpvciAlZFxuIiwgVklERU9fTUFKT1IpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTQxOCwxMSArMTY1OSwxMiBAQAogRVhQT1JUX1NZTUJPTCh2aWRlb191c2VyY29weSk7CiBFWFBPUlRfU1lNQk9MKHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKTsKIEVYUE9SVF9TWU1CT0wodmlkZW9fZXhjbHVzaXZlX3JlbGVhc2UpOworRVhQT1JUX1NZTUJPTCh2aWRlb19pb2N0bDIpOwogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZpY2VfYWxsb2MpOwogRVhQT1JUX1NZTUJPTCh2aWRlb19kZXZpY2VfcmVsZWFzZSk7CiAKLU1PRFVMRV9BVVRIT1IoIkFsYW4gQ294Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkRldmljZSByZWdpc3RyYXIgZm9yIFZpZGVvNExpbnV4IGRyaXZlcnMiKTsKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294LCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGV2aWNlIHJlZ2lzdHJhciBmb3IgVmlkZW80TGludXggZHJpdmVycyB2MiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmluby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKaW5kZXggYThjMTAxNC4uMjY4ZTY5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1zZ2kuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb19kZWNvZGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aXZpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwppbmRleCA3NzlkYjI2Li40MWQyM2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYwpAQCAtNDgsMzQgKzQ4LDE1IEBACiAKICNpbmNsdWRlICJmb250LmgiCiAKLSNpZm5kZWYga3phbGxvYwotI2RlZmluZSBremFsbG9jKHNpemUsIGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0oeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl2b2lkICpfX3JldCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOyAgICAgICAgICAgICBcCi0JaWYgKF9fcmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQltZW1zZXQoX19yZXQsIDAsIHNpemUpOyAgICAgICAgICAgICAgICAgXAotCV9fcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0jZW5kaWYKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOwotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotCiAjZGVmaW5lIFZJVklfTUFKT1JfVkVSU0lPTiAwCiAjZGVmaW5lIFZJVklfTUlOT1JfVkVSU0lPTiA0CiAjZGVmaW5lIFZJVklfUkVMRUFTRSAwCiAjZGVmaW5lIFZJVklfVkVSU0lPTiBLRVJORUxfVkVSU0lPTihWSVZJX01BSk9SX1ZFUlNJT04sIFZJVklfTUlOT1JfVkVSU0lPTiwgVklWSV9SRUxFQVNFKQogCi1zdGF0aWMgaW50IHZpZGVvX25yID0gLTE7ICAgICAgICAvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KLW1vZHVsZV9wYXJhbSh2aWRlb19uciwgaW50LCAwKTsKLQotc3RhdGljIGludCBkZWJ1ZyA9IDA7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMCk7Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkX2xpbWl0ID0gMTY7Ci1tb2R1bGVfcGFyYW0odmlkX2xpbWl0LGludCwwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0ModmlkX2xpbWl0LCJjYXB0dXJlIG1lbW9yeSBsaW1pdCBpbiBtZWdhYnl0ZXMiKTsKKy8qIERlY2xhcmUgc3RhdGljIHZhcnMgdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyYW1ldGVycyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2aWRfbGltaXQgPSAxNjsJLyogVmlkZW8gbWVtb3J5IGxpbWl0LCBpbiBNYiAqLworc3RhdGljIHN0cnVjdCB2aWRlb19kZXZpY2Ugdml2aTsJLyogVmlkZW8gZGV2aWNlICovCitzdGF0aWMgaW50IHZpZGVvX25yID0gLTE7CQkvKiAvZGV2L3ZpZGVvTiwgLTEgZm9yIGF1dG9kZXRlY3QgKi8KIAogLyogc3VwcG9ydGVkIGNvbnRyb2xzICovCiBzdGF0aWMgc3RydWN0IHY0bDJfcXVlcnljdHJsIHZpdmlfcWN0cmxbXSA9IHsKQEAgLTEyOSwxMCArMTEwLDEwIEBACiAKIHN0YXRpYyBpbnQgcWN0bF9yZWdzW0FSUkFZX1NJWkUodml2aV9xY3RybCldOwogCi0jZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCQkJICAgICBcCi0JZG8geyAJCQkJCQkgICAgIFwKLQkJaWYgKGRlYnVnID49IChsZXZlbCkpCQkJICAgICBcCi0JCQlwcmludGsoS0VSTl9ERUJVRyAidml2aTogIiBmbXQgLCAjIyBhcmcpOyAgICBcCisjZGVmaW5lIGRwcmludGsobGV2ZWwsZm10LCBhcmcuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAodml2aS5kZWJ1ZyA+PSAobGV2ZWwpKQkJCQlcCisJCQlwcmludGsoS0VSTl9ERUJVRyAidml2aTogIiBmbXQgLCAjIyBhcmcpOwlcCiAJfSB3aGlsZSAoMCkKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xOTAsNyArMTcxLDcgQEAKIAogCS8qIHZhcmlvdXMgZGV2aWNlIGluZm8gKi8KIAl1bnNpZ25lZCBpbnQgICAgICAgICAgICAgICByZXNvdXJjZXM7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAgICAgICAgdmlkZW9fZGV2OworCXN0cnVjdCB2aWRlb19kZXZpY2UgICAgICAgIHZmZDsKIAogCXN0cnVjdCB2aXZpX2RtYXF1ZXVlICAgICAgIHZpZHE7CiAKQEAgLTI0OCw3ICsyMjksOCBAQAogI2RlZmluZSBUU1RBTVBfTUFYX1kgVFNUQU1QX01JTl9ZKzE1CiAjZGVmaW5lIFRTVEFNUF9NSU5fWCA2NAogCi12b2lkIHByZXBfdG9fYWRkcihzdHJ1Y3Qgc2dfdG9fYWRkciB0b19hZGRyW10sc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCitzdGF0aWMgdm9pZCBwcmVwX3RvX2FkZHIoc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdLAorCQkJIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCWludCBpLCBwb3M9MDsKIApAQCAtMjU5LDcgKzI0MSw3IEBACiAJfQogfQogCi1pbmxpbmUgaW50IGdldF9hZGRyX3BvcyhpbnQgcG9zLCBpbnQgcGFnZXMsIHN0cnVjdCBzZ190b19hZGRyIHRvX2FkZHJbXSkKK3N0YXRpYyBpbnQgZ2V0X2FkZHJfcG9zKGludCBwb3MsIGludCBwYWdlcywgc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdKQogewogCWludCBwMT0wLHAyPXBhZ2VzLTEscDM9cGFnZXMvMjsKIApAQCAtMjgwLDggKzI2Miw4IEBACiAJcmV0dXJuIChwMSk7CiB9CiAKLXZvaWQgZ2VuX2xpbmUoc3RydWN0IHNnX3RvX2FkZHIgdG9fYWRkcltdLGludCBpbmlwb3MsaW50IHBhZ2VzLGludCB3bWF4LAotCQkJCQlpbnQgaG1heCwgaW50IGxpbmUsIGNoYXIgKnRpbWVzdHIpCitzdGF0aWMgdm9pZCBnZW5fbGluZShzdHJ1Y3Qgc2dfdG9fYWRkciB0b19hZGRyW10saW50IGluaXBvcyxpbnQgcGFnZXMsaW50IHdtYXgsCisJCSAgICAgaW50IGhtYXgsIGludCBsaW5lLCBjaGFyICp0aW1lc3RyKQogewogCWludCAgdyxpLGoscG9zPWluaXBvcyxwZ3BvcyxvbGRwZyx5OwogCWNoYXIgKnAsKnMsKmJhc2VwOwpAQCAtNDkxLDcgKzQ3Myw3IEBACiAJCWRwcmludGsoMSwiJXM6ICVkIGJ1ZmZlcnMgaGFuZGxlZCAoc2hvdWxkIGJlIDEpXG4iLF9fRlVOQ1RJT05fXyxiYyk7CiB9CiAKLXZvaWQgdml2aV9zbGVlcChzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xKQorc3RhdGljIHZvaWQgdml2aV9zbGVlcChzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xKQogewogCWludCB0aW1lb3V0OwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwpAQCAtNTI2LDcgKzUwOCw3IEBACiAJdHJ5X3RvX2ZyZWV6ZSgpOwogfQogCi1pbnQgdml2aV90aHJlYWQodm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdml2aV90aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgdml2aV9kbWFxdWV1ZSAgKmRtYV9xPWRhdGE7CiAKQEAgLTU0Miw3ICs1MjQsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdml2aV9zdGFydF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKK3N0YXRpYyBpbnQgdml2aV9zdGFydF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKIHsKIAlkbWFfcS0+ZnJhbWU9MDsKIAlkbWFfcS0+aW5pX2ppZmZpZXM9amlmZmllczsKQEAgLTU2MCw3ICs1NDIsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHZpdmlfc3RvcF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKK3N0YXRpYyB2b2lkIHZpdmlfc3RvcF90aHJlYWQoc3RydWN0IHZpdmlfZG1hcXVldWUgICpkbWFfcSkKIHsKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAJLyogc2h1dGRvd24gY29udHJvbCB0aHJlYWQgKi8KQEAgLTY2Niw4ICs2NDgsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkCi1mcmVlX2J1ZmZlcihzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnZxLCBzdHJ1Y3Qgdml2aV9idWZmZXIgKmJ1ZikKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCB2aXZpX2J1ZmZlciAqYnVmKQogewogCWRwcmludGsoMSwiJXNcbiIsX19GVU5DVElPTl9fKTsKIApAQCAtNzkxLDggKzc3Miw4IEBACiAJZnJlZV9idWZmZXIodnEsYnVmKTsKIH0KIAotaW50IHZpdmlfbWFwX3NnICh2b2lkICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKLQkgICBpbnQgZGlyZWN0aW9uKQorc3RhdGljIGludCB2aXZpX21hcF9zZyh2b2lkICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBuZW50cywKKwkJICAgICAgIGludCBkaXJlY3Rpb24pCiB7CiAJaW50IGk7CiAKQEAgLTgwOCwxNSArNzg5LDE1IEBACiAJcmV0dXJuIG5lbnRzOwogfQogCi1pbnQgdml2aV91bm1hcF9zZyh2b2lkICpkZXYsc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsaW50IG5yX3BhZ2VzLAotCQkJCQlpbnQgZGlyZWN0aW9uKQorc3RhdGljIGludCB2aXZpX3VubWFwX3NnKHZvaWQgKmRldixzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCxpbnQgbnJfcGFnZXMsCisJCQkgaW50IGRpcmVjdGlvbikKIHsKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAJcmV0dXJuIDA7CiB9CiAKLWludCB2aXZpX2RtYV9zeW5jX3NnKHZvaWQgKmRldixzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCxpbnQgbnJfcGFnZXMsCi0JCQkJCWludCBkaXJlY3Rpb24pCitzdGF0aWMgaW50IHZpdmlfZG1hX3N5bmNfc2codm9pZCAqZGV2LHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCBpbnQgbnJfcGFnZXMsCisJCQkgICAgaW50IGRpcmVjdGlvbikKIHsKIC8vCWRwcmludGsoMSwiJXNcbiIsX19GVU5DVElPTl9fKTsKIApAQCAtODQwLDcgKzgyMSw4MCBAQAogCUlPQ1RMIGhhbmRsaW5nCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCi1zdGF0aWMgaW50IHZpdmlfdHJ5X2ZtdChzdHJ1Y3Qgdml2aV9kZXYgKmRldiwgc3RydWN0IHZpdmlfZmggKmZoLAorCitzdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IHZpdmlfZGV2ICpkZXYsIHN0cnVjdCB2aXZpX2ZoICpmaCkKK3sKKwkvKiBpcyBpdCBmcmVlPyAqLworCWRvd24oJmRldi0+bG9jayk7CisJaWYgKGRldi0+cmVzb3VyY2VzKSB7CisJCS8qIG5vLCBzb21lb25lIGVsc2UgdXNlcyBpdCAqLworCQl1cCgmZGV2LT5sb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLworCWRldi0+cmVzb3VyY2VzID0xOworCWRwcmludGsoMSwicmVzOiBnZXRcbiIpOworCXVwKCZkZXYtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHJlc19sb2NrZWQoc3RydWN0IHZpdmlfZGV2ICpkZXYpCit7CisJcmV0dXJuIChkZXYtPnJlc291cmNlcyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc19mcmVlKHN0cnVjdCB2aXZpX2RldiAqZGV2LCBzdHJ1Y3Qgdml2aV9maCAqZmgpCit7CisJZG93bigmZGV2LT5sb2NrKTsKKwlkZXYtPnJlc291cmNlcyA9IDA7CisJZHByaW50aygxLCJyZXM6IHB1dFxuIik7CisJdXAoJmRldi0+bG9jayk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUlPQ1RMIHZpZGlvYyBoYW5kbGluZworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJ2aXZpIik7CisJc3RyY3B5KGNhcC0+Y2FyZCwgInZpdmkiKTsKKwljYXAtPnZlcnNpb24gPSBWSVZJX1ZFUlNJT047CisJY2FwLT5jYXBhYmlsaXRpZXMgPQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKKwkJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKKwkJCQlWNEwyX0NBUF9SRUFEV1JJVEU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCWlmIChmLT5pbmRleCA+IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbixmb3JtYXQubmFtZSxzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwlmLT5waXhlbGZvcm1hdCA9IGZvcm1hdC5mb3VyY2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2dfZm10X2NhcCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisKKwlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKKwlmLT5mbXQucGl4LmhlaWdodCAgICAgICA9IGZoLT5oZWlnaHQ7CisJZi0+Zm10LnBpeC5maWVsZCAgICAgICAgPSBmaC0+dmJfdmlkcS5maWVsZDsKKwlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKKwlmLT5mbXQucGl4LmJ5dGVzcGVybGluZSA9CisJCShmLT5mbXQucGl4LndpZHRoICogZmgtPmZtdC0+ZGVwdGgpID4+IDM7CisJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQorCQlmLT5mbXQucGl4LmhlaWdodCAqIGYtPmZtdC5waXguYnl0ZXNwZXJsaW5lOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdF9jYXAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAogCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewogCXN0cnVjdCB2aXZpX2ZtdCAqZm10OwpAQCAtODQ4LDcgKzkwMiw4IEBACiAJdW5zaWduZWQgaW50IG1heHcsIG1heGg7CiAKIAlpZiAoZm9ybWF0LmZvdXJjYyAhPSBmLT5mbXQucGl4LnBpeGVsZm9ybWF0KSB7Ci0JCWRwcmludGsoMSwiRm91cmNjIGZvcm1hdCBpbnZhbGlkLlxuIik7CisJCWRwcmludGsoMSwiRm91cmNjIGZvcm1hdCAoMHglMDh4KSBpbnZhbGlkLiBEcml2ZXIgYWNjZXB0cyAiCisJCQkib25seSAweCUwOHhcbiIsZi0+Zm10LnBpeC5waXhlbGZvcm1hdCxmb3JtYXQuZm91cmNjKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZtdD0mZm9ybWF0OwpAQCAtODg0LDM1NiArOTM5LDE5NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlc19nZXQoc3RydWN0IHZpdmlfZGV2ICpkZXYsIHN0cnVjdCB2aXZpX2ZoICpmaCkKKy8qRklYTUU6IFRoaXMgc2VlbXMgdG8gYmUgZ2VuZXJpYyBlbm91Z2ggdG8gYmUgYXQgdmlkZW9kZXYyICovCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdF9jYXAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0JLyogaXMgaXQgZnJlZT8gKi8KLQlkb3duKCZkZXYtPmxvY2spOwotCWlmIChkZXYtPnJlc291cmNlcykgewotCQkvKiBubywgc29tZW9uZSBlbHNlIHVzZXMgaXQgKi8KLQkJdXAoJmRldi0+bG9jayk7Ci0JCXJldHVybiAwOwotCX0KLQkvKiBpdCdzIGZyZWUsIGdyYWIgaXQgKi8KLQlkZXYtPnJlc291cmNlcyA9MTsKLQlkcHJpbnRrKDEsInJlczogZ2V0XG4iKTsKLQl1cCgmZGV2LT5sb2NrKTsKLQlyZXR1cm4gMTsKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJaW50IHJldCA9IHZpZGlvY190cnlfZm10X2NhcChmaWxlLGZoLGYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gKHJldCk7CisKKwlmaC0+Zm10ICAgICAgICAgICA9ICZmb3JtYXQ7CisJZmgtPndpZHRoICAgICAgICAgPSBmLT5mbXQucGl4LndpZHRoOworCWZoLT5oZWlnaHQgICAgICAgID0gZi0+Zm10LnBpeC5oZWlnaHQ7CisJZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOworCWZoLT50eXBlICAgICAgICAgID0gZi0+dHlwZTsKKworCXJldHVybiAoMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlc19sb2NrZWQoc3RydWN0IHZpdmlfZGV2ICpkZXYpCitzdGF0aWMgaW50IHZpZGlvY19yZXFidWZzIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCiB7Ci0JcmV0dXJuIChkZXYtPnJlc291cmNlcyk7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCisJcmV0dXJuICh2aWRlb2J1Zl9yZXFidWZzKCZmaC0+dmJfdmlkcSwgcCkpOwogfQogCi1zdGF0aWMgdm9pZCByZXNfZnJlZShzdHJ1Y3Qgdml2aV9kZXYgKmRldiwgc3RydWN0IHZpdmlfZmggKmZoKQorc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCiB7Ci0JZG93bigmZGV2LT5sb2NrKTsKLQlkZXYtPnJlc291cmNlcyA9IDA7Ci0JZHByaW50aygxLCJyZXM6IHB1dFxuIik7Ci0JdXAoJmRldi0+bG9jayk7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCisJcmV0dXJuICh2aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIHApKTsKIH0KIAotc3RhdGljIGludCB2aXZpX2RvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpCitzdGF0aWMgaW50IHZpZGlvY19xYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewotCXN0cnVjdCB2aXZpX2ZoICAqZmggICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2RldiAqZGV2ICAgID0gZmgtPmRldjsKLQlpbnQgcmV0PTA7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OwogCi0JaWYgKGRlYnVnKSB7Ci0JCWlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19XUklURSkKLQkJCXY0bF9wcmludGtfaW9jdGxfYXJnKCJ2aXZpKHcpIixjbWQsIGFyZyk7Ci0JCWVsc2UgaWYgKCFfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKSB7Ci0JCQl2NGxfcHJpbnRfaW9jdGwoInZpdmkiLCBjbWQpOwotCQl9Ci0JfQorCXJldHVybiAodmlkZW9idWZfcWJ1ZigmZmgtPnZiX3ZpZHEsIHApKTsKK30KIAotCXN3aXRjaChjbWQpIHsKLQkvKiAtLS0gY2FwYWJpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX1FVRVJZQ0FQOgotCXsKLQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwID0gKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkqKWFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX2RxYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB2aXZpX2ZoICAqZmg9cHJpdjsKIAotCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOworCXJldHVybiAodmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBwLAorCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSk7Cit9CiAKLQkJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidml2aSIpOwotCQlzdHJjcHkoY2FwLT5jYXJkLCAidml2aSIpOwotCQljYXAtPnZlcnNpb24gPSBWSVZJX1ZFUlNJT047Ci0JCWNhcC0+Y2FwYWJpbGl0aWVzID0KLQkJCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyAgICAgfAotCQkJCQlWNEwyX0NBUF9SRUFEV1JJVEU7Ci0JCWJyZWFrOwotCX0KLQkvKiAtLS0gY2FwdHVyZSBpb2N0bHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX0VOVU1fRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm10ZGVzYyAqZiA9IGFyZzsKLQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGU7Ci0JCXVuc2lnbmVkIGludCBpbmRleDsKLQotCQlpbmRleCA9IGYtPmluZGV4OwotCQl0eXBlICA9IGYtPnR5cGU7Ci0KLQkJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOgotCQkJaWYgKGluZGV4ID4gMCl7Ci0JCQkJcmV0PS1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQltZW1zZXQoZiwwLHNpemVvZigqZikpOwotCi0JCQlmLT5pbmRleCA9IGluZGV4OwotCQkJZi0+dHlwZSAgPSB0eXBlOwotCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbixmb3JtYXQubmFtZSxzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKLQkJCWYtPnBpeGVsZm9ybWF0ID0gZm9ybWF0LmZvdXJjYzsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0PS1FSU5WQUw7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gKHN0cnVjdCB2NGwyX2Zvcm1hdCAqKWFyZzsKLQotCQlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJCXJldD0tRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQotCQltZW1zZXQoJmYtPmZtdC5waXgsMCxzaXplb2YoZi0+Zm10LnBpeCkpOwotCQlmLT5mbXQucGl4LndpZHRoICAgICAgICA9IGZoLT53aWR0aDsKLQkJZi0+Zm10LnBpeC5oZWlnaHQgICAgICAgPSBmaC0+aGVpZ2h0OwotCQlmLT5mbXQucGl4LmZpZWxkICAgICAgICA9IGZoLT52Yl92aWRxLmZpZWxkOwotCQlmLT5mbXQucGl4LnBpeGVsZm9ybWF0ICA9IGZoLT5mbXQtPmZvdXJjYzsKLQkJZi0+Zm10LnBpeC5ieXRlc3BlcmxpbmUgPQotCQkJKGYtPmZtdC5waXgud2lkdGggKiBmaC0+Zm10LT5kZXB0aCkgPj4gMzsKLQkJZi0+Zm10LnBpeC5zaXplaW1hZ2UgPQotCQkJZi0+Zm10LnBpeC5oZWlnaHQgKiBmLT5mbXQucGl4LmJ5dGVzcGVybGluZTsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfRk1UOgotCXsKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmID0gYXJnOwotCi0JCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJZHByaW50aygxLCJPbmx5IGNhcHR1cmUgc3VwcG9ydGVkLlxuIik7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0ID0gdml2aV90cnlfZm10KGRldixmaCxmKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQotCQlmaC0+Zm10ICAgICAgICAgICA9ICZmb3JtYXQ7Ci0JCWZoLT53aWR0aCAgICAgICAgID0gZi0+Zm10LnBpeC53aWR0aDsKLQkJZmgtPmhlaWdodCAgICAgICAgPSBmLT5mbXQucGl4LmhlaWdodDsKLQkJZmgtPnZiX3ZpZHEuZmllbGQgPSBmLT5mbXQucGl4LmZpZWxkOwotCQlmaC0+dHlwZSAgICAgICAgICA9IGYtPnR5cGU7Ci0KLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1RSWV9GTVQ6Ci0JewotCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYgPSBhcmc7Ci0JCWlmIChmLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXJldD12aXZpX3RyeV9mbXQoZGV2LGZoLGYpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfUkVRQlVGUzoKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQ9dmlkZW9idWZfcmVxYnVmcygmZmgtPnZiX3ZpZHEsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX1FVRVJZQlVGOgotCQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldD12aWRlb2J1Zl9xdWVyeWJ1ZigmZmgtPnZiX3ZpZHEsIGFyZyk7Ci0JCWJyZWFrOwotCWNhc2UgVklESU9DX1FCVUY6Ci0JCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKLQkJCXJldD0tRUlOVkFMOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0PXZpZGVvYnVmX3FidWYoJmZoLT52Yl92aWRxLCBhcmcpOwotCQlicmVhazsKLQljYXNlIFZJRElPQ19EUUJVRjoKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQ9dmlkZW9idWZfZHFidWYoJmZoLT52Yl92aWRxLCBhcmcsCi0JCQkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKLQkJYnJlYWs7CiAjaWZkZWYgSEFWRV9WNEwxCi0JLyogLS0tIHN0cmVhbWluZyBjYXB0dXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQljYXNlIFZJRElPQ0dNQlVGOgotCXsKLQkJc3RydWN0IHZpZGVvX21idWYgKm1idWYgPSBhcmc7Ci0JCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcT0mZmgtPnZiX3ZpZHE7Ci0JCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzIHJlcTsKLQkJdW5zaWduZWQgaW50IGk7CitzdGF0aWMgaW50IHZpZGlvY2dtYnVmIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHZpZGVvX21idWYgKm1idWYpCit7CisJc3RydWN0IHZpdmlfZmggICpmaD1wcml2OworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcT0mZmgtPnZiX3ZpZHE7CisJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxOworCXVuc2lnbmVkIGludCBpLCByZXQ7CiAKLQkJbWVtc2V0KCZyZXEsMCxzaXplb2YocmVxKSk7Ci0JCXJlcS50eXBlICAgPSBxLT50eXBlOwotCQlyZXEuY291bnQgID0gODsKLQkJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JCXJldCA9IHZpZGVvYnVmX3JlcWJ1ZnMocSwmcmVxKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQkJbWVtc2V0KG1idWYsMCxzaXplb2YoKm1idWYpKTsKLQkJbWJ1Zi0+ZnJhbWVzID0gcmVxLmNvdW50OwotCQltYnVmLT5zaXplICAgPSAwOwotCQlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKLQkJCW1idWYtPm9mZnNldHNbaV0gID0gcS0+YnVmc1tpXS0+Ym9mZjsKLQkJCW1idWYtPnNpemUgICAgICAgKz0gcS0+YnVmc1tpXS0+YnNpemU7Ci0JCX0KLQkJYnJlYWs7CisJcmVxLnR5cGUgICA9IHEtPnR5cGU7CisJcmVxLmNvdW50ICA9IDg7CisJcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisJcmV0ID0gdmlkZW9idWZfcmVxYnVmcyhxLCZyZXEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gKHJldCk7CisKKwltYnVmLT5mcmFtZXMgPSByZXEuY291bnQ7CisJbWJ1Zi0+c2l6ZSAgID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+ZnJhbWVzOyBpKyspIHsKKwkJbWJ1Zi0+b2Zmc2V0c1tpXSAgPSBxLT5idWZzW2ldLT5ib2ZmOworCQltYnVmLT5zaXplICAgICAgICs9IHEtPmJ1ZnNbaV0tPmJzaXplOwogCX0KKwlyZXR1cm4gKDApOworfQogI2VuZGlmCi0JY2FzZSBWSURJT0NfU1RSRUFNT046CisKK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJc3RydWN0IHZpdmlfZGV2ICpkZXYgICAgPSBmaC0+ZGV2OworCisJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkgIT0gZmgtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFyZXNfZ2V0KGRldixmaCkpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuICh2aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpKTsKK30KKworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKK3sKKwlzdHJ1Y3Qgdml2aV9maCAgKmZoPXByaXY7CisJc3RydWN0IHZpdmlfZGV2ICpkZXYgICAgPSBmaC0+ZGV2OworCisJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkgIT0gZmgtPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJdmlkZW9idWZfc3RyZWFtb2ZmKCZmaC0+dmJfdmlkcSk7CisJcmVzX2ZyZWUoZGV2LGZoKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl90dm5vcm0gdHZub3Jtc1tdID0gewogCXsKLQkJaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoIXJlc19nZXQoZGV2LGZoKSkKLQkJCXJldHVybiAtRUJVU1k7Ci0JCXJldD12aWRlb2J1Zl9zdHJlYW1vbigmZmgtPnZiX3ZpZHEpOwotCQlicmVhazsKKwkJLm5hbWUgICAgICA9ICJOVFNDLU0iLAorCQkuaWQgICAgICAgID0gVjRMMl9TVERfTlRTQ19NLAogCX0KLQljYXNlIFZJRElPQ19TVFJFQU1PRkY6Ci0JewotCQlpZiAoZmgtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXJldCA9IHZpZGVvYnVmX3N0cmVhbW9mZigmZmgtPnZiX3ZpZHEpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCQlyZXNfZnJlZShkZXYsZmgpOwotCQlicmVhazsKLQl9Ci0JLyogLS0tLS0tLS0tLSB0diBub3JtcyAtLS0tLS0tLS0tICovCi0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3N0YW5kYXJkICplID0gYXJnOworfTsKIAotCQlpZiAoZS0+aW5kZXg+MCkgewotCQkJcmV0PS1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgPSB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3QoZSwgVjRMMl9TVERfTlRTQ19NLCAiTlRTQy1NIik7CitzdGF0aWMgaW50IHZpZGlvY19zX3N0ZCAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHY0bDJfc3RkX2lkIGEpCit7CiAKLQkJLyogQWxsb3dzIHZpdmkgdG8gdXNlIGRpZmZlcmVudCBmcHMgZnJvbSB2aWRlbyBzdGQgKi8KLQkJZS0+ZnJhbWVwZXJpb2QubnVtZXJhdG9yID0gV0FLRV9OVU1FUkFUT1I7Ci0JCWUtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gV0FLRV9ERU5PTUlOQVRPUjsKKwlyZXR1cm4gMDsKK30KIAotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JewotCQl2NGwyX3N0ZF9pZCAqaWQgPSBhcmc7CisvKiBvbmx5IG9uZSBpbnB1dCBpbiB0aGlzIHNhbXBsZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1faW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2lucHV0ICppbnApCit7CisJaWYgKGlucC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJKmlkID0gVjRMMl9TVERfTlRTQ19NOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JewotCQlicmVhazsKLQl9Ci0JLyogLS0tLS0tIGlucHV0IHN3aXRjaGluZyAtLS0tLS0tLS0tICovCi0JY2FzZSBWSURJT0NfRU5VTUlOUFVUOgotCXsgLyogb25seSBvbmUgaW5wdXQgaW4gdGhpcyBzYW1wbGUgZHJpdmVyICovCi0JCXN0cnVjdCB2NGwyX2lucHV0ICppbnAgPSBhcmc7CisJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKKwlpbnAtPnN0ZCA9IFY0TDJfU1REX05UU0NfTTsKKwlzdHJjcHkoaW5wLT5uYW1lLCJDYW1lcmEiKTsKIAotCQlpZiAoaW5wLT5pbmRleCAhPSAwKSB7Ci0JCQlyZXQ9LUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCW1lbXNldChpbnAsIDAsIHNpemVvZigqaW5wKSk7CisJcmV0dXJuICgwKTsKK30KIAotCQlpbnAtPmluZGV4ID0gMDsKLQkJaW5wLT50eXBlID0gVjRMMl9JTlBVVF9UWVBFX0NBTUVSQTsKLQkJaW5wLT5zdGQgPSBWNEwyX1NURF9OVFNDX007Ci0JCXN0cmNweShpbnAtPm5hbWUsIkNhbWVyYSIpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBWSURJT0NfR19JTlBVVDoKLQl7Ci0JCXVuc2lnbmVkIGludCAqaSA9IGFyZzsKK3N0YXRpYyBpbnQgdmlkaW9jX2dfaW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCit7CisJKmkgPSAwOwogCi0JCSppID0gMDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfSU5QVVQ6Ci0JewotCQl1bnNpZ25lZCBpbnQgKmkgPSBhcmc7CisJcmV0dXJuICgwKTsKK30KK3N0YXRpYyBpbnQgdmlkaW9jX3NfaW5wdXQgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+IDApCisJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmICgqaSA+IDApCi0JCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQorCXJldHVybiAoMCk7Cit9CiAKIAkvKiAtLS0gY29udHJvbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMgPSBhcmc7Ci0JCWludCBpOworc3RhdGljIGludCB2aWRpb2NfcXVlcnljdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjKQoreworCWludCBpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpdmlfcWN0cmwpOyBpKyspCi0JCQlpZiAocWMtPmlkICYmIHFjLT5pZCA9PSB2aXZpX3FjdHJsW2ldLmlkKSB7Ci0JCQkJbWVtY3B5KHFjLCAmKHZpdmlfcWN0cmxbaV0pLAotCQkJCQlzaXplb2YoKnFjKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKHFjLT5pZCAmJiBxYy0+aWQgPT0gdml2aV9xY3RybFtpXS5pZCkgeworCQkJbWVtY3B5KHFjLCAmKHZpdmlfcWN0cmxbaV0pLAorCQkJCXNpemVvZigqcWMpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KIAotCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX0dfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZpdmlfcWN0cmwpOyBpKyspCi0JCQlpZiAoY3RybC0+aWQgPT0gdml2aV9xY3RybFtpXS5pZCkgewotCQkJCWN0cmwtPnZhbHVlPXFjdGxfcmVnc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQlyZXQ9LUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCWNhc2UgVklESU9DX1NfQ1RSTDoKLQl7Ci0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwgPSBhcmc7Ci0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2aXZpX3FjdHJsKTsgaSsrKQotCQkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKLQkJCQlpZiAoY3RybC0+dmFsdWUgPAotCQkJCQl2aXZpX3FjdHJsW2ldLm1pbmltdW0KLQkJCQkJfHwgY3RybC0+dmFsdWUgPgotCQkJCQl2aXZpX3FjdHJsW2ldLm1heGltdW0pIHsKLQkJCQkJCXJldD0tRVJBTkdFOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlxY3RsX3JlZ3NbaV09Y3RybC0+dmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCXJldD0tRUlOVkFMOwotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJcmV0PXY0bF9jb21wYXRfdHJhbnNsYXRlX2lvY3RsKGlub2RlLGZpbGUsY21kLGFyZyx2aXZpX2RvX2lvY3RsKTsKLQl9Ci0KLQlpZiAoZGVidWcpIHsKLQkJaWYgKHJldDwwKSB7Ci0JCQl2NGxfcHJpbnRfaW9jdGwoInZpdmkoZXJyKSIsIGNtZCk7Ci0JCQlkcHJpbnRrKDEsImVycmNvZGU9JWRcbiIscmV0KTsKLQkJfSBlbHNlIGlmIChfSU9DX0RJUihjbWQpICYgX0lPQ19SRUFEKQotCQkJdjRsX3ByaW50a19pb2N0bF9hcmcoInZpdmkocikiLGNtZCwgYXJnKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IHZpdmlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIGludCB2aWRpb2NfZ19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXJldHVybiB2aWRlb191c2VyY29weShpbm9kZSwgZmlsZSwgY21kLCBhcmcsIHZpdmlfZG9faW9jdGwpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKKwkJCWN0cmwtPnZhbHVlPXFjdGxfcmVnc1tpXTsKKwkJCXJldHVybiAoMCk7CisJCX0KKworCXJldHVybiAtRUlOVkFMOworfQorc3RhdGljIGludCB2aWRpb2Nfc19jdHJsIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodml2aV9xY3RybCk7IGkrKykKKwkJaWYgKGN0cmwtPmlkID09IHZpdmlfcWN0cmxbaV0uaWQpIHsKKwkJCWlmIChjdHJsLT52YWx1ZSA8CisJCQkJdml2aV9xY3RybFtpXS5taW5pbXVtCisJCQkJfHwgY3RybC0+dmFsdWUgPgorCQkJCXZpdmlfcWN0cmxbaV0ubWF4aW11bSkgeworCQkJCQlyZXR1cm4gKC1FUkFOR0UpOworCQkJCX0KKwkJCXFjdGxfcmVnc1tpXT1jdHJsLT52YWx1ZTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjU1LDcgKzExNTAsNyBAQAogCiAJbGlzdF9mb3JfZWFjaChsaXN0LCZ2aXZpX2Rldmxpc3QpIHsKIAkJaCA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IHZpdmlfZGV2LCB2aXZpX2Rldmxpc3QpOwotCQlpZiAoaC0+dmlkZW9fZGV2Lm1pbm9yID09IG1pbm9yKSB7CisJCWlmIChoLT52ZmQubWlub3IgPT0gbWlub3IpIHsKIAkJCWRldiAgPSBoOwogCQkJdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKIAkJfQpAQCAtMTI2NCw2ICsxMTU5LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAorCiAJLyogSWYgbW9yZSB0aGFuIG9uZSB1c2VyLCBtdXRleCBzaG91bGQgYmUgYWRkZWQgKi8KIAlkZXYtPnVzZXJzKys7CiAKQEAgLTEyNzksNiArMTE3NSw3IEBACiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKIAlmaC0+ZGV2ICAgICAgPSBkZXY7CisKIAlmaC0+dHlwZSAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CiAJZmgtPmZtdCAgICAgID0gJmZvcm1hdDsKIAlmaC0+d2lkdGggICAgPSA2NDA7CkBAIC0xMzE0LDcgKzEyMTEsNyBAQAogc3RhdGljIHNzaXplX3QKIHZpdmlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmRhdGEsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCB2aXZpX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdml2aV9maCAgICAgICAgKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCiAJaWYgKGZoLT50eXBlPT1WNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKIAkJaWYgKHJlc19sb2NrZWQoZmgtPmRldikpCkBAIC0xMzI4LDggKzEyMjUsOCBAQAogc3RhdGljIHVuc2lnbmVkIGludAogdml2aV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0Jc3RydWN0IHZpdmlfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2J1ZmZlciAqYnVmOworCXN0cnVjdCB2aXZpX2ZoICAgICAgICAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpdmlfYnVmZmVyICAgICpidWY7CiAKIAlkcHJpbnRrKDEsIiVzXG4iLF9fRlVOQ1RJT05fXyk7CiAKQEAgLTEzNTgsOCArMTI1NSw4IEBACiAKIHN0YXRpYyBpbnQgdml2aV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCB2aXZpX2ZoICAqZmggICAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB2aXZpX2RldiAqZGV2ICAgID0gZmgtPmRldjsKKwlzdHJ1Y3Qgdml2aV9maCAgICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgdml2aV9kZXYgKmRldiAgICAgICA9IGZoLT5kZXY7CiAJc3RydWN0IHZpdmlfZG1hcXVldWUgKnZpZHEgPSAmZGV2LT52aWRxOwogCiAJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKQEAgLTEzNzksNyArMTI3Niw3IEBACiBzdGF0aWMgaW50CiB2aXZpX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSkKIHsKLQlzdHJ1Y3Qgdml2aV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZpdmlfZmggICAgICAgICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmV0OwogCiAJZHByaW50ayAoMSwibW1hcCBjYWxsZWQsIHZtYT0weCUwOGx4XG4iLCh1bnNpZ25lZCBsb25nKXZtYSk7CkBAIC0xNDAwLDIwICsxMjk3LDQ0IEBACiAJLnJlbGVhc2UgICAgICAgID0gdml2aV9yZWxlYXNlLAogCS5yZWFkICAgICAgICAgICA9IHZpdmlfcmVhZCwKIAkucG9sbAkJPSB2aXZpX3BvbGwsCi0JLmlvY3RsICAgICAgICAgID0gdml2aV9pb2N0bCwKKwkuaW9jdGwgICAgICAgICAgPSB2aWRlb19pb2N0bDIsIC8qIFY0TDIgaW9jdGwgaGFuZGxlciAqLwogCS5tbWFwCQk9IHZpdmlfbW1hcCwKIAkubGxzZWVrICAgICAgICAgPSBub19sbHNlZWssCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2aXZpID0gewotCS5uYW1lCQk9ICJWVE0gVmlydHVhbCBWaWRlbyBDYXB0dXJlIEJvYXJkIiwKKwkubmFtZQkJPSAidml2aSIsCiAJLnR5cGUJCT0gVklEX1RZUEVfQ0FQVFVSRSwKIAkuaGFyZHdhcmUJPSAwLAogCS5mb3BzICAgICAgICAgICA9ICZ2aXZpX2ZvcHMsCiAJLm1pbm9yCQk9IC0xLAogLy8JLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKworCS52aWRpb2NfcXVlcnljYXAgICAgICA9IHZpZGlvY19xdWVyeWNhcCwKKwkudmlkaW9jX2VudW1fZm10X2NhcCAgPSB2aWRpb2NfZW51bV9mbXRfY2FwLAorCS52aWRpb2NfZ19mbXRfY2FwICAgICA9IHZpZGlvY19nX2ZtdF9jYXAsCisJLnZpZGlvY190cnlfZm10X2NhcCAgID0gdmlkaW9jX3RyeV9mbXRfY2FwLAorCS52aWRpb2Nfc19mbXRfY2FwICAgICA9IHZpZGlvY19zX2ZtdF9jYXAsCisJLnZpZGlvY19yZXFidWZzICAgICAgID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiAgICAgID0gdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiAgICAgICAgICA9IHZpZGlvY19xYnVmLAorCS52aWRpb2NfZHFidWYgICAgICAgICA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3Nfc3RkICAgICAgICAgPSB2aWRpb2Nfc19zdGQsCisJLnZpZGlvY19lbnVtX2lucHV0ICAgID0gdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0ICAgICAgID0gdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0ICAgICAgID0gdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19xdWVyeWN0cmwgICAgID0gdmlkaW9jX3F1ZXJ5Y3RybCwKKwkudmlkaW9jX2dfY3RybCAgICAgICAgPSB2aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsICAgICAgICA9IHZpZGlvY19zX2N0cmwsCisJLnZpZGlvY19zdHJlYW1vbiAgICAgID0gdmlkaW9jX3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmICAgICA9IHZpZGlvY19zdHJlYW1vZmYsCisjaWZkZWYgSEFWRV9WNEwxCisJLnZpZGlvY2dtYnVmICAgICAgICAgID0gdmlkaW9jZ21idWYsCisjZW5kaWYKKwkudHZub3JtcyAgICAgICAgICAgICAgPSB0dm5vcm1zLAorCS50dm5vcm1zaXplICAgICAgICAgICA9IEFSUkFZX1NJWkUodHZub3JtcyksCiB9OwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCUluaXRpYWxpemF0aW9uIGFuZCBtb2R1bGUgc3R1ZmYKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTE0NTcsMyArMTM3OCwxNiBAQAogCiBtb2R1bGVfaW5pdCh2aXZpX2luaXQpOwogbW9kdWxlX2V4aXQodml2aV9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOworTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCittb2R1bGVfcGFyYW0odmlkZW9fbnIsIGludCwgMCk7CisKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1Zyx2aXZpLmRlYnVnLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywiYWN0aXZhdGVzIGRlYnVnIGluZm8iKTsKKworbW9kdWxlX3BhcmFtKHZpZF9saW1pdCxpbnQsMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHZpZF9saW1pdCwiY2FwdHVyZSBtZW1vcnkgbGltaXQgaW4gbWVnYWJ5dGVzIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdnB4MzIyMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKaW5kZXggNDBiMjA1Yi4uMWVjYTdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92cHgzMjIwLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNkZWZpbmUgSTJDX05BTUUoeCkgKHgpLT5uYW1lCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9fZGVjb2Rlci5oPgogCiAjZGVmaW5lIEkyQ19WUFgzMjIwICAgICAgICAweDg2CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKaW5kZXggODBlZjhhMS4uNGJkYzg4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYwpAQCAtNTgsNiArNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAKIC8vI2RlZmluZSBERUJVRwkJCQkvLyBVbmRlZiBtZSBmb3IgcHJvZHVjdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL0tjb25maWcKaW5kZXggMTE1ODMzZS4uYTg1OWE2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS9LY29uZmlnCkBAIC0xLDkgKzEsOSBAQAogY29uZmlnIFVTQl9aQzAzMDEKLQl0cmlzdGF0ZSAiVVNCIFpDMDMwMSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCBzdXBwb3J0IgorCXRyaXN0YXRlICJVU0IgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBVU0IgJiYgVklERU9fVjRMMQogCS0tLWhlbHAtLS0KLQkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgWkMwMzAxCi0JICBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcC4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUgWkMwMzAxIG9yCisJICBaQzAzMDFQIEltYWdlIFByb2Nlc3NvcnMgYW5kIENvbnRyb2wgQ2hpcHMuCiAKIAkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3pjMDMwMS50eHQ+IGZvciBtb3JlIGluZm8uCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKaW5kZXggZDc0OTE5OS4uZDllNmQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvTWFrZWZpbGUKQEAgLTEsMyArMSwzIEBACi16YzAzMDEtb2JqcyAgICAgOj0gemMwMzAxX2NvcmUubyB6YzAzMDFfcGFzMjAyYmNiLm8KK3pjMDMwMS1vYmpzICAgICA6PSB6YzAzMDFfY29yZS5vIHpjMDMwMV9wYjAzMzAubyB6YzAzMDFfcGFzMjAyYmNiLm8KIAogb2JqLSQoQ09ORklHX1VTQl9aQzAzMDEpICAgICAgICArPSB6YzAzMDEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9jb3JlLmMKaW5kZXggMGZhZDM5Ny4uMWIyYmUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX2NvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfY29yZS5jCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmlkZW80TGludXgyIGRyaXZlciBmb3IgWkMwMzAxIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgICAgKgorICogVmlkZW80TGludXgyIGRyaXZlciBmb3IgWkMwMzAxW1BdIEltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgpAQCAtNDcsMTMgKzQ3LDEzIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBaQzAzMDFfTU9EVUxFX05BTUUgICAgIlY0TDIgZHJpdmVyIGZvciBaQzAzMDEgIiAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBaQzAzMDFfTU9EVUxFX05BTUUgICAgIlY0TDIgZHJpdmVyIGZvciBaQzAzMDFbUF0gIiAgICAgICAgICAgICAgICAgICAgXAogCQkJICAgICAgIkltYWdlIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwIgogI2RlZmluZSBaQzAzMDFfTU9EVUxFX0FVVEhPUiAgIihDKSAyMDA2IEx1Y2EgUmlzb2xpYSIKICNkZWZpbmUgWkMwMzAxX0FVVEhPUl9FTUFJTCAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFpDMDMwMV9NT0RVTEVfTElDRU5TRSAiR1BMIgotI2RlZmluZSBaQzAzMDFfTU9EVUxFX1ZFUlNJT04gIjE6MS4wMyIKLSNkZWZpbmUgWkMwMzAxX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDAsIDMpCisjZGVmaW5lIFpDMDMwMV9NT0RVTEVfVkVSU0lPTiAiMToxLjA1IgorI2RlZmluZSBaQzAzMDFfTU9EVUxFX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMSwgMCwgNSkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00MjcsMTAgKzQyNywxMSBAQAogc3RhdGljIGludCB6YzAzMDFfc3RhcnRfdHJhbnNmZXIoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGNhbS0+dXNiZGV2OworCXN0cnVjdCB1c2JfaG9zdF9pbnRlcmZhY2UqIGFsdHNldHRpbmcgPSB1c2JfYWx0bnVtX3RvX2FsdHNldHRpbmcoCisJCQkJCQkgICAgIHVzYl9pZm51bV90b19pZih1ZGV2LCAwKSwKKwkJCQkJCSAgICAgWkMwMzAxX0FMVEVSTkFURV9TRVRUSU5HKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgcHN6ID0gYWx0c2V0dGluZy0+ZW5kcG9pbnRbMF0uZGVzYy53TWF4UGFja2V0U2l6ZTsKIAlzdHJ1Y3QgdXJiKiB1cmI7Ci0JY29uc3QgdW5zaWduZWQgaW50IHdNYXhQYWNrZXRTaXplW10gPSB7MCwgMTI4LCAxOTIsIDI1NiwgMzg0LAotCQkJCQkgICAgICAgNTEyLCA3NjgsIDEwMjN9OwotCWNvbnN0IHVuc2lnbmVkIGludCBwc3ogPSB3TWF4UGFja2V0U2l6ZVtaQzAzMDFfQUxURVJOQVRFX1NFVFRJTkddOwogCXM4IGksIGo7CiAJaW50IGVyciA9IDA7CiAKQEAgLTE3NzIsMTEgKzE3NzMsOSBAQAogCWNhc2UgVklESU9DX0dfQ1RSTDoKIAkJcmV0dXJuIHpjMDMwMV92aWRpb2NfZ19jdHJsKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX1NfQ1RSTF9PTEQ6CiAJY2FzZSBWSURJT0NfU19DVFJMOgogCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19zX2N0cmwoY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfQ1JPUENBUF9PTEQ6CiAJY2FzZSBWSURJT0NfQ1JPUENBUDoKIAkJcmV0dXJuIHpjMDMwMV92aWRpb2NfY3JvcGNhcChjYW0sIGFyZyk7CiAKQEAgLTE4MjMsNyArMTgyMiw2IEBACiAJY2FzZSBWSURJT0NfR19QQVJNOgogCQlyZXR1cm4gemMwMzAxX3ZpZGlvY19nX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfU19QQVJNX09MRDoKIAljYXNlIFZJRElPQ19TX1BBUk06CiAJCXJldHVybiB6YzAzMDFfdmlkaW9jX3NfcGFybShjYW0sIGFyZyk7CiAKQEAgLTE5MTQsNyArMTkxMiw3IEBACiAKIAltdXRleF9pbml0KCZjYW0tPmRldl9tdXRleCk7CiAKLQlEQkcoMiwgIlpDMDMwMSBJbWFnZSBQcm9jZXNzb3IgYW5kIENvbnRyb2wgQ2hpcCBkZXRlY3RlZCAiCisJREJHKDIsICJaQzAzMDFbUF0gSW1hZ2UgUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAgZGV0ZWN0ZWQgIgogCSAgICAgICAiKHZpZC9waWQgMHglMDRYLzB4JTA0WCkiLGlkLT5pZFZlbmRvciwgaWQtPmlkUHJvZHVjdCk7CiAKIAlmb3IgIChpID0gMDsgemMwMzAxX3NlbnNvcl90YWJsZVtpXTsgaSsrKSB7CkBAIC0xOTM2LDcgKzE5MzQsNyBAQAogCQljYW0tPnN0YXRlIHw9IERFVl9NSVNDT05GSUdVUkVEOwogCX0KIAotCXN0cmNweShjYW0tPnY0bGRldi0+bmFtZSwgIlpDMDMwMSBQQyBDYW1lcmEiKTsKKwlzdHJjcHkoY2FtLT52NGxkZXYtPm5hbWUsICJaQzAzMDFbUF0gUEMgQ2FtZXJhIik7CiAJY2FtLT52NGxkZXYtPm93bmVyID0gVEhJU19NT0RVTEU7CiAJY2FtLT52NGxkZXYtPnR5cGUgPSBWSURfVFlQRV9DQVBUVVJFIHwgVklEX1RZUEVfU0NBTEVTOwogCWNhbS0+djRsZGV2LT5oYXJkd2FyZSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGFzMjAyYmNiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGFzMjAyYmNiLmMKaW5kZXggZWFhZGYwMi4uZWNmZDM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BhczIwMmJjYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9wYXMyMDJiY2IuYwpAQCAtMSwxMCArMSwxMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwISBJbWFnZSAgICAgICAgKgorICogUGx1Zy1pbiBmb3IgUEFTMjAyQkNCIGltYWdlIHNlbnNvciBjb25uZWN0ZWQgdG8gdGhlIFpDMDMwMVtQXSBJbWFnZSAgICAgKgogICogUHJvY2Vzc29yIGFuZCBDb250cm9sIENoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IEx1Y2EgUmlzb2xpYSA8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4gICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogSW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDEgaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggICAgKgorICogSW5pdGlhbGl6YXRpb24gdmFsdWVzIG9mIHRoZSBaQzAzMDFbUF0gaGF2ZSBiZWVuIHRha2VuIGZyb20gdGhlIFNQQ0E1WFggKgogICogZHJpdmVyIG1haW50YWluZWQgYnkgTWljaGVsIFhoYWFyZCA8bXhoYWFyZEBtYWdpYy5mcj4gICAgICAgICAgICAgICAgICAgKgogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3BiMDMzMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODU0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfcGIwMzMwLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsdWctaW4gZm9yIFBCLTAzMzAgaW1hZ2Ugc2Vuc29yIGNvbm5lY3RlZCB0byB0aGUgWkMwMzAxW1BdIEltYWdlICAgICAgICoKKyAqIFByb2Nlc3NvciBhbmQgQ29udHJvbCBDaGlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBMdWNhIFJpc29saWEgPGx1Y2Eucmlzb2xpYUBzdHVkaW8udW5pYm8uaXQ+ICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIEluaXRpYWxpemF0aW9uIHZhbHVlcyBvZiB0aGUgWkMwMzAxW1BdIGhhdmUgYmVlbiB0YWtlbiBmcm9tIHRoZSBTUENBNVhYICoKKyAqIGRyaXZlciBtYWludGFpbmVkIGJ5IE1pY2hlbCBYaGFhcmQgPG14aGFhcmRAbWFnaWMuZnI+ICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICoKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICoKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlICAgICAgICAgICAgICoKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgInpjMDMwMV9zZW5zb3IuaCIKKworCitzdGF0aWMgc3RydWN0IHpjMDMwMV9zZW5zb3IgcGIwMzMwOworCisKK3N0YXRpYyBpbnQgcGIwMzMwX2luaXQoc3RydWN0IHpjMDMwMV9kZXZpY2UqIGNhbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwOCwgMHgwMyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTAsIDB4MEEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAyLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwMywgMHgwMik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDQsIDB4ODApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDA1LCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAwNiwgMHhFMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDEsIDB4MDEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDA1KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwOTgsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDlBLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExQSwgMHgwMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMUMsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDA1KTsKKworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwMSwgMHgwMDA2KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDIsIDB4MDAxMSk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDAzLCAweDAxRTcpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNCwgMHgwMjg3KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDYsIDB4MDAwMyk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDA3LCAweDMwMDIpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgyMCwgMHgxMTAwKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MkYsIDB4RjdCMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDMwLCAweDAwMDUpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzMSwgMHgwMDAwKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MzQsIDB4MDEwMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDM1LCAweDAwNjApOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgzRCwgMHgwNjhGKTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4NDAsIDB4MDFFMCk7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDU4LCAweDAwNzgpOworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHg2MiwgMHgwNDExKTsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDg3LCAweDEwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwMSwgMHgzNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMTIsIDB4MDUpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTAwLCAweDBEKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4OSwgMHgwNik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQUQsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUM1LCAweDAzKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDQiwgMHgxMyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAyNTAsIDB4MDgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMzAxLCAweDA4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBOCwgMHg2MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOEQsIDB4NkMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFELCAweDA5KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFBRSwgMHgxNSk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEEsIDB4NTApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBCLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQywgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEQsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBFLCAweDUwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRiwgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTAsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTExLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMiwgMHg1MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDgsIDB4MDMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUM2LCAweDA4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDFDQiwgMHgwRik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEEsIDB4NTApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBCLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwQywgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMEQsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTBFLCAweDUwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDEwRiwgMHhGOCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMTAsIDB4RjgpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTExLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDExMiwgMHg1MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4MDApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDE5LCAweDAwKTsKKworCWVyciArPSB6YzAzMDFfaTJjX3dyaXRlKGNhbSwgMHgwNSwgMHgwMDY2KTsKKwllcnIgKz0gemMwMzAxX2kyY193cml0ZShjYW0sIDB4MDksIDB4MDJCMik7CisJZXJyICs9IHpjMDMwMV9pMmNfd3JpdGUoY2FtLCAweDEwLCAweDAwMDIpOworCisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxMUQsIDB4NjApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTkwLCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5MSwgMHgwNyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTIsIDB4OEMpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMTk1LCAweDAwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE5NiwgMHgwMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxOTcsIDB4OEEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMThDLCAweDEwKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4RiwgMHgyMCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQTksIDB4MTQpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFBLCAweDI0KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxRCwgMHhENyk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMUUsIDB4RjApOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDFGLCAweEY4KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAyMCwgMHhGRik7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxQUQsIDB4MDkpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMUFFLCAweDE1KTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDE4MCwgMHg0MCk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAxODAsIDB4NDIpOworCisJbXNsZWVwKDEwMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgemMwMzAxX3NlbnNvciBwYjAzMzAgPSB7CisJLm5hbWUgPSAiUEItMDMzMCIsCisJLmluaXQgPSAmcGIwMzMwX2luaXQsCisJLmNyb3BjYXAgPSB7CisJCS5ib3VuZHMgPSB7CisJCQkubGVmdCA9IDAsCisJCQkudG9wID0gMCwKKwkJCS53aWR0aCA9IDY0MCwKKwkJCS5oZWlnaHQgPSA0ODAsCisJCX0sCisJCS5kZWZyZWN0ID0geworCQkJLmxlZnQgPSAwLAorCQkJLnRvcCA9IDAsCisJCQkud2lkdGggPSA2NDAsCisJCQkuaGVpZ2h0ID0gNDgwLAorCQl9LAorCX0sCisJLnBpeF9mb3JtYXQgPSB7CisJCS53aWR0aCA9IDY0MCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX0pQRUcsCisJCS5wcml2ID0gOCwKKwl9LAorfTsKKworCitpbnQgemMwMzAxX3Byb2JlX3BiMDMzMChzdHJ1Y3QgemMwMzAxX2RldmljZSogY2FtKQoreworCWludCByMCwgZXJyID0gMDsKKworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDAwLCAweDAxKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMCwgMHgwYSk7CisJZXJyICs9IHpjMDMwMV93cml0ZV9yZWcoY2FtLCAweDAwMDEsIDB4MDEpOworCWVyciArPSB6YzAzMDFfd3JpdGVfcmVnKGNhbSwgMHgwMDEyLCAweDAzKTsKKwllcnIgKz0gemMwMzAxX3dyaXRlX3JlZyhjYW0sIDB4MDAxMiwgMHgwMSk7CisKKwltc2xlZXAoMTApOworCisJcjAgPSB6YzAzMDFfaTJjX3JlYWQoY2FtLCAweDAwLCAyKTsKKworCWlmIChyMCA8IDAgfHwgZXJyKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChyMCAhPSAweDgyNDMpCisJCXJldHVybiAtRU5PREVWOworCisJemMwMzAxX2F0dGFjaF9zZW5zb3IoY2FtLCAmcGIwMzMwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3NlbnNvci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96YzAzMDEvemMwMzAxX3NlbnNvci5oCmluZGV4IDFmOTVjMjguLjQzNjNhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vemMwMzAxL3pjMDMwMV9zZW5zb3IuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pjMDMwMS96YzAzMDFfc2Vuc29yLmgKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBBUEkgZm9yIGltYWdlIHNlbnNvcnMgY29ubmVjdGVkIHRvIHRoZSBaQzAzMCEgSW1hZ2UgUHJvY2Vzc29yIGFuZCAgICAgICAqCisgKiBBUEkgZm9yIGltYWdlIHNlbnNvcnMgY29ubmVjdGVkIHRvIHRoZSBaQzAzMDEgSW1hZ2UgUHJvY2Vzc29yIGFuZCAgICAgICAqCiAgKiBDb250cm9sIENoaXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgTHVjYSBSaXNvbGlhIDxsdWNhLnJpc29saWFAc3R1ZGlvLnVuaWJvLml0PiAgICAgICAqCkBAIC0zNSwxMSArMzUsMTMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogZXh0ZXJuIGludCB6YzAzMDFfcHJvYmVfcGFzMjAyYmNiKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pOworZXh0ZXJuIGludCB6YzAzMDFfcHJvYmVfcGIwMzMwKHN0cnVjdCB6YzAzMDFfZGV2aWNlKiBjYW0pOwogCiAjZGVmaW5lIFpDMDMwMV9TRU5TT1JfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAvKiBXZWFrIGRldGVjdGlvbnMgbXVzdCBnbyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgaW50ICgqemMwMzAxX3NlbnNvcl90YWJsZVtdKShzdHJ1Y3QgemMwMzAxX2RldmljZSopID0geyAgICAgICAgICAgICAgICBcCiAJJnpjMDMwMV9wcm9iZV9wYXMyMDJiY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkmemMwMzAxX3Byb2JlX3BiMDMzMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9OwogCkBAIC01OCwxNCArNjAsMjggQEAKIAogI2RlZmluZSBaQzAzMDFfSURfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHpjMDMwMV9pZF90YWJsZVtdID0gIHsgICAgICAgICAgICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMTcsIDB4ZmYpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAxNywgMHhmZiksIH0sIC8qIElDTTEwNSAqLyAgICAgICAgICAgIFwKIAl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDFjLCAweGZmKSwgfSwgLyogUEFTMTA2ICovICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMWUsIDB4ZmYpLCB9LCAvKiBIVjcxMzFCICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAxZSwgMHhmZiksIH0sIC8qIEhWNzEzMSAqLyAgICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDFmLCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwMjIsIDB4ZmYpLCB9LCAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAzNCwgMHhmZiksIH0sIC8qIFBBUzEwNiAqLyAgICAgICAgICAgIFwKIAl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDM1LCAweGZmKSwgfSwgLyogUEFTMTA2ICovICAgICAgICAgICAgXAotCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDJCQ0IgKi8gICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0MWUsIDB4NDAzNiwgMHhmZiksIH0sIC8qIEhWNzEzMSAqLyAgICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQxZSwgMHg0MDNhLCAweGZmKSwgfSwgLyogSFY3MTMxICovICAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDU4LCAweDcwMDcsIDB4ZmYpLCB9LCAvKiBUQVM1MTMwICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA0NTgsIDB4NzAwQywgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDQ1OCwgMHg3MDBmLCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDIgKi8gICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDA1NWYsIDB4ZDAwMywgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MDU1ZiwgMHhkMDA0LCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwNDZkLCAweDA4YWUsIDB4ZmYpLCB9LCAvKiBQQVMyMDIgKi8gICAgICAgICAgICBcCiAJeyBaQzAzMDFfVVNCX0RFVklDRSgweDBhYzgsIDB4MDMwMSwgMHhmZiksIH0sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MTBmZCwgMHg4MDUwLCAweGZmKSwgfSwgLyogVEFTNTEzMEQgKi8gICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgwYWM4LCAweDMwMWIsIDB4ZmYpLCB9LCAvKiBQQi0wMzMwL0hWNzEzMSAqLyAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDBhYzgsIDB4MzAzYiwgMHhmZiksIH0sIC8qIFBCLTAzMzAgKi8gICAgICAgICAgIFwKKwl7IFpDMDMwMV9VU0JfREVWSUNFKDB4MTBmZCwgMHgwMTI4LCAweGZmKSwgfSwgLyogVEFTNTEzMCAqLyAgICAgICAgICAgXAorCXsgWkMwMzAxX1VTQl9ERVZJQ0UoMHgxMGZkLCAweDgwNTAsIDB4ZmYpLCB9LCAvKiBUQVM1MTMwICovICAgICAgICAgICBcCisJeyBaQzAzMDFfVVNCX0RFVklDRSgweDEwZmQsIDB4ODA0ZSwgMHhmZiksIH0sIC8qIFRBUzUxMzAgKi8gICAgICAgICAgIFwKIAl7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi5oCmluZGV4IDAxNjZmNTUuLmZmY2RhOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuLmgKQEAgLTE1OSw3ICsxNTksNyBAQAogI2RlZmluZSBCVVpfTUFYX0ZSQU1FICAgICAyNTYJLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgQlVaX01BU0tfRlJBTUUgICAgMjU1CS8qIE11c3QgYmUgQlVaX01BWF9GUkFNRS0xICovCiAKLSNkZWZpbmUgQlVaX01BWF9JTlBVVCAgICAgICA4CisjZGVmaW5lIEJVWl9NQVhfSU5QVVQgICAgICAgMTYKIAogI2lmIFZJREVPX01BWF9GUkFNRSA8PSAzMgogIyAgIGRlZmluZSAgIFY0TF9NQVhfRlJBTUUgICAzMgpAQCAtMTkxLDYgKzE5MSw5IEBACiAJLyogSW9tZWdhICovCiAJQlVaLAogCisJLyogQXZlck1lZGlhICovCisJQVZTNkVZRVMsCisKIAkvKiB0b3RhbCBudW1iZXIgb2YgY2FyZHMgKi8KIAlOVU1fQ0FSRFMKIH07CkBAIC0zNzksNiArMzgyLDkgQEAKIAkvKiBpcyB0aGUgL0dXUyBsaW5lIGNvbmVjdGVkPyAqLwogCXU4IGd3c19ub3RfY29ubmVjdGVkOwogCisJLyogYXZzNmV5ZXMgbXV4IHNldHRpbmcgKi8KKwl1OCBpbnB1dF9tdXg7CisKIAl2b2lkICgqaW5pdCkgKHN0cnVjdCB6b3JhbiAqIHpyKTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fY2FyZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKaW5kZXggMGE4NWM5ZS4uOTU4YzFlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9jYXJkLmMKQEAgLTI3LDYgKzI3LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zZW0uaD4KICNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CkBAIC05Myw2ICs5NiwxMSBAQAogTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X2lucHV0LAogCQkgIkRlZmF1bHQgaW5wdXQgKDA9Q29tcG9zaXRlLCAxPVMtVmlkZW8sIDI9SW50ZXJuYWwpIik7CiAKK3N0YXRpYyBpbnQgZGVmYXVsdF9tdXggPSAxOwkvKiA2IEV5ZXMgaW5wdXQgc2VsZWN0aW9uICovCittb2R1bGVfcGFyYW0oZGVmYXVsdF9tdXgsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlZmF1bHRfbXV4LAorCQkgIkRlZmF1bHQgNiBFeWVzIG11eCBzZXR0aW5nIChJbnB1dCBzZWxlY3Rpb24pIik7CisKIHN0YXRpYyBpbnQgZGVmYXVsdF9ub3JtID0gMDsJLyogMD1QQUwsIDE9TlRTQyAyPVNFQ0FNICovCiBtb2R1bGVfcGFyYW0oZGVmYXVsdF9ub3JtLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhkZWZhdWx0X25vcm0sICJEZWZhdWx0IG5vcm0gKDA9UEFMLCAxPU5UU0MsIDI9U0VDQU0pIik7CkBAIC0zMDEsNiArMzA5LDMwIEBACiAJR1BJTyh6ciwgMiwgMSk7CQkvLyBTZXQgQ29tcG9zaXRlIGlucHV0L291dHB1dAogfQogCitzdGF0aWMgdm9pZAorYXZzNmV5ZXNfaW5pdCAoc3RydWN0IHpvcmFuICp6cikKK3sKKwkvLyBBdmVyTWVkaWEgNi1FeWVzIG9yaWdpbmFsIGRyaXZlciBieSBDaHJpc3RlciBXZWluaWdlbAorCisJLy8gTGlmdGVkIHN0cmFpZ2h0IGZyb20gQ2hyaXN0ZXIncyBvbGQgZHJpdmVyIGFuZAorCS8vIG1vZGlmaWVkIHNsaWdodGx5IGJ5IE1hcnRpbiBTYW11ZWxzc29uLgorCisJaW50IG11eCA9IGRlZmF1bHRfbXV4OyAvKiAxID0gQlQ4NjYsIDcgPSBWSUQxICovCisKKwlHUElPKHpyLCA0LCAxKTsgLyogQnQ4NjYgU0xFRVAgb24gKi8KKwl1ZGVsYXkoMik7CisKKwlHUElPKHpyLCAwLCAxKTsgLyogWlIzNjA2MCAvUkVTRVQgb24gKi8KKwlHUElPKHpyLCAxLCAwKTsgLyogWlIzNjA2MCAvU0xFRVAgb24gKi8KKwlHUElPKHpyLCAyLCBtdXggJiAxKTsgICAvKiBNVVggUzAgKi8KKwlHUElPKHpyLCAzLCAwKTsgLyogL0ZSQU1FIG9uICovCisJR1BJTyh6ciwgNCwgMCk7IC8qIEJ0ODY2IFNMRUVQIG9mZiAqLworCUdQSU8oenIsIDUsIG11eCAmIDIpOyAgIC8qIE1VWCBTMSAqLworCUdQSU8oenIsIDYsIDApOyAvKiA/ICovCisJR1BJTyh6ciwgNywgbXV4ICYgNCk7ICAgLyogTVVYIFMyICovCisKK30KKwogc3RhdGljIGNoYXIgKgogaTJjaWRfdG9fbW9kdWxlbmFtZSAodTE2IGkyY19pZCkKIHsKQEAgLTM5MSw2ICs0MjMsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgdHZub3JtIGY1MGNjaXI2MDFfbG0zM3IxMCA9IHsgODY0LCA3MjAsIDc0KzU0LCA4MDQsIDYyNSwgNTc2LCAxOCB9Owogc3RhdGljIHN0cnVjdCB0dm5vcm0gZjYwY2NpcjYwMV9sbTMzcjEwID0geyA4NTgsIDcyMCwgNTYrNTQsIDc4OCwgNTI1LCA0ODAsIDE2IH07CiAKKy8qIEZJWE1FOiBUaGUga3MwMTI3IHNlZW0gaW5jYXBhYmxlIG9mIHN3YXBwaW5nIFUgYW5kIFYsIHRvbywgd2hpY2ggaXMgd2h5IEkKKyAqIGNvcHkgTWF4aW0ncyBsZWZ0IHNoaWZ0IGhhY2sgZm9yIHRoZSA2IEV5ZXMuCisgKgorICogQ2hyaXN0ZXIncyBkcml2ZXIgdXNlZCB0aGUgdW5zaGlmdGVkIG5vcm1zLCB0aG91Z2guLi4KKyAqIC9TYW0gICovCitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNTBjY2lyNjAxX2F2czZleWVzID0geyA4NjQsIDcyMCwgNzQsIDgwNCwgNjI1LCA1NzYsIDE4IH07CitzdGF0aWMgc3RydWN0IHR2bm9ybSBmNjBjY2lyNjAxX2F2czZleWVzID0geyA4NTgsIDcyMCwgNTYsIDc4OCwgNTI1LCA0ODAsIDE2IH07CisKIHN0YXRpYyBzdHJ1Y3QgY2FyZF9pbmZvIHpvcmFuX2NhcmRzW05VTV9DQVJEU10gX19kZXZpbml0ZGF0YSA9IHsKIAl7CiAJCS50eXBlID0gREMxMF9vbGQsCkBAIC00MTksNiArNDU5LDcgQEAKIAkJLmdwY3MgPSB7IC0xLCAwIH0sCiAJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMTBfbmV3LApAQCAtNDQ1LDYgKzQ4Niw3IEBACiAJCS5ncGNzID0geyAtMSwgMX0sCiAJCS52ZmVfcG9sID0geyAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwcGx1c19pbml0LAogCX0sIHsKIAkJLnR5cGUgPSBEQzEwcGx1cywKQEAgLTQ3NCw2ICs1MTYsNyBAQAogCQkuZ3BjcyA9IHsgLTEsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMCwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmRjMTBwbHVzX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMzAsCkBAIC01MDIsNiArNTQ1LDcgQEAKIAkJLmdwY3MgPSB7IC0xLCAwIH0sCiAJCS52ZmVfcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCiAJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDAsCisJCS5pbnB1dF9tdXggPSAwLAogCQkuaW5pdCA9ICZkYzEwX2luaXQsCiAJfSwgewogCQkudHlwZSA9IERDMzBwbHVzLApAQCAtNTMyLDYgKzU3Niw3IEBACiAJCS5ncGNzID0geyAtMSwgMCB9LAogCQkudmZlX3BvbCA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAogCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAwLAorCQkuaW5wdXRfbXV4ID0gMCwKIAkJLmluaXQgPSAmZGMxMF9pbml0LAogCX0sIHsKIAkJLnR5cGUgPSBMTUwzMywKQEAgLTU1OCw2ICs2MDMsNyBAQAogCQkuZ3BjcyA9IHsgMywgMSB9LAogCQkudmZlX3BvbCA9IHsgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCB9LAogCQkuZ3dzX25vdF9jb25uZWN0ZWQgPSAxLAorCQkuaW5wdXRfbXV4ID0gMCwKIAkJLmluaXQgPSAmbG1sMzNfaW5pdCwKIAl9LCB7CiAJCS50eXBlID0gTE1MMzNSMTAsCkBAIC01ODYsNiArNjMyLDcgQEAKIAkJLmdwY3MgPSB7IDMsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmxtbDMzX2luaXQsCiAJfSwgewogCQkudHlwZSA9IEJVWiwKQEAgLTYxNCw4ICs2NjEsNDkgQEAKIAkJLmdwY3MgPSB7IDMsIDEgfSwKIAkJLnZmZV9wb2wgPSB7IDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAgfSwKIAkJLmd3c19ub3RfY29ubmVjdGVkID0gMSwKKwkJLmlucHV0X211eCA9IDAsCiAJCS5pbml0ID0gJmJ1el9pbml0LAorCX0sIHsKKwkJLnR5cGUgPSBBVlM2RVlFUywKKwkJLm5hbWUgPSAiNi1FeWVzIiwKKwkJLyogQXZlck1lZGlhIGNob3NlIG5vdCB0byBicmFuZCB0aGUgNi1FeWVzLiBUaHVzIGl0CisJCSAgIGNhbid0IGJlIGF1dG9kZXRlY3RlZCwgYW5kIHJlcXVpcmVzIGNhcmQ9eC4gKi8KKwkJLnZlbmRvcl9pZCA9IC0xLAorCQkuZGV2aWNlX2lkID0gLTEsCisJCS5pMmNfZGVjb2RlciA9IEkyQ19EUklWRVJJRF9LUzAxMjcsCisJCS5pMmNfZW5jb2RlciA9IEkyQ19EUklWRVJJRF9CVDg2NiwKKwkJLnZpZGVvX2NvZGVjID0gQ09ERUNfVFlQRV9aUjM2MDYwLAorCisJCS5pbnB1dHMgPSAxMCwKKwkJLmlucHV0ID0geworCQkJeyAwLCAiQ29tcG9zaXRlIDEiIH0sCisJCQl7IDEsICJDb21wb3NpdGUgMiIgfSwKKwkJCXsgMiwgIkNvbXBvc2l0ZSAzIiB9LAorCQkJeyA0LCAiQ29tcG9zaXRlIDQiIH0sCisJCQl7IDUsICJDb21wb3NpdGUgNSIgfSwKKwkJCXsgNiwgIkNvbXBvc2l0ZSA2IiB9LAorCQkJeyA4LCAiUy1WaWRlbyAxIiB9LAorCQkJeyA5LCAiUy1WaWRlbyAyIiB9LAorCQkJezEwLCAiUy1WaWRlbyAzIiB9LAorCQkJezE1LCAiWUNiQ3IiIH0KKwkJfSwKKwkJLm5vcm1zID0gMiwKKwkJLnR2biA9IHsKKwkJCSZmNTBjY2lyNjAxX2F2czZleWVzLAorCQkJJmY2MGNjaXI2MDFfYXZzNmV5ZXMsCisJCQlOVUxMCisJCX0sCisJCS5qcGVnX2ludCA9IFpSMzYwNTdfSVNSX0dJUlExLAorCQkudnN5bmNfaW50ID0gWlIzNjA1N19JU1JfR0lSUTAsCisJCS5ncGlvID0geyAxLCAwLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwvLyBWYWxpZGl0eSB1bmtub3duIC9TYW0KKwkJLmdwaW9fcG9sID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sIC8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkuZ3BjcyA9IHsgMywgMSB9LAkJCS8vIFZhbGlkaXR5IHVua25vd24gL1NhbQorCQkudmZlX3BvbCA9IHsgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LCAgLy8gVmFsaWRpdHkgdW5rbm93biAvU2FtCisJCS5nd3Nfbm90X2Nvbm5lY3RlZCA9IDEsCisJCS5pbnB1dF9tdXggPSAxLAorCQkuaW5pdCA9ICZhdnM2ZXllc19pbml0LAogCX0KKwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RldmljZS5jCmluZGV4IGM2OTBiMmUuLjAyMTY4ZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kZXZpY2UuYwpAQCAtNTM2LDcgKzUzNiw3IEBACiAJCSAqIEFsbCBlcnJvciBtZXNzYWdlcyBhcmUgaW50ZXJuYWwgZHJpdmVyIGNoZWNraW5nIG9ubHkhICovCiAKIAkJLyogdmlkZW8gZGlzcGxheSB0b3AgYW5kIGJvdHRvbSByZWdpc3RlcnMgKi8KLQkJcmVnID0gKHUzMikgenItPmJ1ZmZlci5iYXNlICsKKwkJcmVnID0gKGxvbmcpIHpyLT5idWZmZXIuYmFzZSArCiAJCSAgICB6ci0+b3ZlcmxheV9zZXR0aW5ncy54ICoKIAkJICAgICgoenItPm92ZXJsYXlfc2V0dGluZ3MuZm9ybWF0LT5kZXB0aCArIDcpIC8gOCkgKwogCQkgICAgenItPm92ZXJsYXlfc2V0dGluZ3MueSAqCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9kcml2ZXIuYwppbmRleCBiNWE1NzZhLi45NzExZjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fZHJpdmVyLmMKQEAgLTczLDYgKzczLDcgQEAKIAkJCSAgICAgKQogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgInZpZGVvY29kZWMuaCIKIAogI2luY2x1ZGUgPGFzbS9pby5oPgpAQCAtMjA0Nyw3ICsyMDQ4LDcgQEAKIAkJZHByaW50aygzLCBLRVJOX0RFQlVHICIlczogVklESU9DR0NBUFxuIiwgWlJfREVWTkFNRSh6cikpOwogCiAJCW1lbXNldCh2Y2FwLCAwLCBzaXplb2Yoc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkpKTsKLQkJc3RybmNweSh2Y2FwLT5uYW1lLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKHZjYXAtPm5hbWUpKTsKKwkJc3RybmNweSh2Y2FwLT5uYW1lLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKHZjYXAtPm5hbWUpLTEpOwogCQl2Y2FwLT50eXBlID0gWk9SQU5fVklEX1RZUEU7CiAKIAkJdmNhcC0+Y2hhbm5lbHMgPSB6ci0+Y2FyZC5pbnB1dHM7CkBAIC0yNjg5LDggKzI2OTAsOCBAQAogCQlkcHJpbnRrKDMsIEtFUk5fREVCVUcgIiVzOiBWSURJT0NfUVVFUllDQVBcbiIsIFpSX0RFVk5BTUUoenIpKTsKIAogCQltZW1zZXQoY2FwLCAwLCBzaXplb2YoKmNhcCkpOwotCQlzdHJuY3B5KGNhcC0+Y2FyZCwgWlJfREVWTkFNRSh6ciksIHNpemVvZihjYXAtPmNhcmQpKTsKLQkJc3RybmNweShjYXAtPmRyaXZlciwgInpvcmFuIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CisJCXN0cm5jcHkoY2FwLT5jYXJkLCBaUl9ERVZOQU1FKHpyKSwgc2l6ZW9mKGNhcC0+Y2FyZCktMSk7CisJCXN0cm5jcHkoY2FwLT5kcml2ZXIsICJ6b3JhbiIsIHNpemVvZihjYXAtPmRyaXZlciktMSk7CiAJCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwgIlBDSTolcyIsCiAJCQkgcGNpX25hbWUoenItPnBjaV9kZXYpKTsKIAkJY2FwLT52ZXJzaW9uID0KQEAgLTI3NDIsNyArMjc0Myw3IEBACiAJCW1lbXNldChmbXQsIDAsIHNpemVvZigqZm10KSk7CiAJCWZtdC0+aW5kZXggPSBpbmRleDsKIAkJZm10LT50eXBlID0gdHlwZTsKLQkJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCB6b3Jhbl9mb3JtYXRzW2ldLm5hbWUsIDMxKTsKKwkJc3RybmNweShmbXQtPmRlc2NyaXB0aW9uLCB6b3Jhbl9mb3JtYXRzW2ldLm5hbWUsIHNpemVvZihmbXQtPmRlc2NyaXB0aW9uKS0xKTsKIAkJZm10LT5waXhlbGZvcm1hdCA9IHpvcmFuX2Zvcm1hdHNbaV0uZm91cmNjOwogCQlpZiAoem9yYW5fZm9ybWF0c1tpXS5mbGFncyAmIFpPUkFOX0ZPUk1BVF9DT01QUkVTU0VEKQogCQkJZm10LT5mbGFncyB8PSBWNEwyX0ZNVF9GTEFHX0NPTVBSRVNTRUQ7CkBAIC0zNTY2LDE2ICszNTY3LDE2IEBACiAKIAkJc3dpdGNoIChjdHJsLT5pZCkgewogCQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJCcmlnaHRuZXNzIiwgMzEpOworCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQnJpZ2h0bmVzcyIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQkJc3RybmNweShjdHJsLT5uYW1lLCAiQ29udHJhc3QiLCAzMSk7CisJCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJDb250cmFzdCIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCQlzdHJuY3B5KGN0cmwtPm5hbWUsICJTYXR1cmF0aW9uIiwgMzEpOworCQkJc3RybmNweShjdHJsLT5uYW1lLCAiU2F0dXJhdGlvbiIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQljYXNlIFY0TDJfQ0lEX0hVRToKLQkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkh1ZSIsIDMxKTsKKwkJCXN0cm5jcHkoY3RybC0+bmFtZSwgIkh1ZSIsIHNpemVvZihjdHJsLT5uYW1lKS0xKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM2OTMsNyArMzY5NCw3IEBACiAJCQkJCSZjYXBzKTsKIAkJCWlmIChjYXBzLmZsYWdzICYgVklERU9fREVDT0RFUl9BVVRPKSB7CiAJCQkJc3RkLT5pZCA9IFY0TDJfU1REX0FMTDsKLQkJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIkF1dG9kZXRlY3QiLCAzMSk7CisJCQkJc3RybmNweShzdGQtPm5hbWUsICJBdXRvZGV0ZWN0Iiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9IGVsc2UKIAkJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTM3MDEsMjEgKzM3MDIsMjEgQEAKIAkJc3dpdGNoIChzdGQtPmluZGV4KSB7CiAJCWNhc2UgMDoKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9QQUw7Ci0JCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlBBTCIsIDMxKTsKKwkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiUEFMIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMF0tPkh0OwogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9OVFNDOwotCQkJc3RybmNweShzdGQtPm5hbWUsICJOVFNDIiwgMzEpOworCQkJc3RybmNweShzdGQtPm5hbWUsICJOVFNDIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDEwMDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMzAwMDA7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMV0tPkh0OwogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAkJCXN0ZC0+aWQgPSBWNEwyX1NURF9TRUNBTTsKLQkJCXN0cm5jcHkoc3RkLT5uYW1lLCAiU0VDQU0iLCAzMSk7CisJCQlzdHJuY3B5KHN0ZC0+bmFtZSwgIlNFQ0FNIiwgc2l6ZW9mKHN0ZC0+bmFtZSktMSk7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLm51bWVyYXRvciA9IDE7CiAJCQlzdGQtPmZyYW1lcGVyaW9kLmRlbm9taW5hdG9yID0gMjU7CiAJCQlzdGQtPmZyYW1lbGluZXMgPSB6ci0+Y2FyZC50dm5bMl0tPkh0OwpAQCAtMzg3MSw3ICszODcyLDcgQEAKIAkJbWVtc2V0KG91dHAsIDAsIHNpemVvZigqb3V0cCkpOwogCQlvdXRwLT5pbmRleCA9IDA7CiAJCW91dHAtPnR5cGUgPSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPR1ZHQU9WRVJMQVk7Ci0JCXN0cm5jcHkob3V0cC0+bmFtZSwgIkF1dG9kZXRlY3QiLCAzMSk7CisJCXN0cm5jcHkob3V0cC0+bmFtZSwgIkF1dG9kZXRlY3QiLCBzaXplb2Yob3V0cC0+bmFtZSktMSk7CiAKIAkJcmV0dXJuIDA7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW5fcHJvY2ZzLmMKaW5kZXggYTAwZmFlOS4uZjRmZmU3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbl9wcm9jZnMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuX3Byb2Nmcy5jCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAidmlkZW9jb2RlYy5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jIGIvZHJpdmVycy9taXNjL2libWFzbS9pYm1hc21mcy5jCmluZGV4IDI2YTIzMGIuLjRhMzVjYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9pYm1hc20vaWJtYXNtZnMuYworKysgYi9kcml2ZXJzL21pc2MvaWJtYXNtL2libWFzbWZzLmMKQEAgLTkwLDEwICs5MCwxMSBAQAogc3RhdGljIGludCBpYm1hc21mc19maWxsX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KTsKIAogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICppYm1hc21mc19nZXRfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzdCwKLQkJCWludCBmbGFncywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaWJtYXNtZnNfZ2V0X3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc3QsCisJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsCisJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc3QsIGZsYWdzLCBkYXRhLCBpYm1hc21mc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc3QsIGZsYWdzLCBkYXRhLCBpYm1hc21mc19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaWJtYXNtZnNfc19vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9hdDkxX21jaS5jIGIvZHJpdmVycy9tbWMvYXQ5MV9tY2kuYwppbmRleCA4OGYwZWVmLi4zMjI4NTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9hdDkxX21jaS5jCisrKyBiL2RyaXZlcnMvbW1jL2F0OTFfbWNpLmMKQEAgLTgxLDEzICs4MSw2IEBACiAKICN1bmRlZglTVVBQT1JUXzRXSVJFCiAKLSNpZmRlZiBDT05GSUdfTU1DX0RFQlVHCi0jZGVmaW5lIERCRyhmbXQuLi4pCVwKLQlwcmludGsoZm10KQotI2Vsc2UKLSNkZWZpbmUgREJHKGZtdC4uLikJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgY2xrICptY2lfY2xrOwogCiAjZGVmaW5lIEZMX1NFTlRfQ09NTUFORCAoMSA8PCAwKQpAQCAtMjAyLDUwICsxOTUsNTAgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CiAKLQlEQkcoInByZSBkbWEgcmVhZFxuIik7CisJcHJfZGVidWcoInByZSBkbWEgcmVhZFxuIik7CiAKIAljbWQgPSBob3N0LT5jbWQ7CiAJaWYgKCFjbWQpIHsKLQkJREJHKCJubyBjb21tYW5kXG4iKTsKKwkJcHJfZGVidWcoIm5vIGNvbW1hbmRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJZGF0YSA9IGNtZC0+ZGF0YTsKIAlpZiAoIWRhdGEpIHsKLQkJREJHKCJubyBkYXRhXG4iKTsKKwkJcHJfZGVidWcoIm5vIGRhdGFcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQkvKiBub3RoaW5nIGxlZnQgdG8gdHJhbnNmZXIgKi8KIAkJaWYgKGhvc3QtPnRyYW5zZmVyX2luZGV4ID49IGRhdGEtPnNnX2xlbikgewotCQkJREJHKCJOb3RoaW5nIGxlZnQgdG8gdHJhbnNmZXIgKGluZGV4ID0gJWQpXG4iLCBob3N0LT50cmFuc2Zlcl9pbmRleCk7CisJCQlwcl9kZWJ1ZygiTm90aGluZyBsZWZ0IHRvIHRyYW5zZmVyIChpbmRleCA9ICVkKVxuIiwgaG9zdC0+dHJhbnNmZXJfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAogCQkvKiBDaGVjayB0byBzZWUgaWYgdGhpcyBuZWVkcyBmaWxsaW5nICovCiAJCWlmIChpID09IDApIHsKIAkJCWlmIChhdDkxX21jaV9yZWFkKEFUOTFfUERDX1JDUikgIT0gMCkgewotCQkJCURCRygiVHJhbnNmZXIgYWN0aXZlIGluIGN1cnJlbnRcbiIpOworCQkJCXByX2RlYnVnKCJUcmFuc2ZlciBhY3RpdmUgaW4gY3VycmVudFxuIik7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KIAkJZWxzZSB7CiAJCQlpZiAoYXQ5MV9tY2lfcmVhZChBVDkxX1BEQ19STkNSKSAhPSAwKSB7Ci0JCQkJREJHKCJUcmFuc2ZlciBhY3RpdmUgaW4gbmV4dFxuIik7CisJCQkJcHJfZGVidWcoIlRyYW5zZmVyIGFjdGl2ZSBpbiBuZXh0XG4iKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQogCiAJCS8qIFNldHVwIHRoZSBuZXh0IHRyYW5zZmVyICovCi0JCURCRygiVXNpbmcgdHJhbnNmZXIgaW5kZXggJWRcbiIsIGhvc3QtPnRyYW5zZmVyX2luZGV4KTsKKwkJcHJfZGVidWcoIlVzaW5nIHRyYW5zZmVyIGluZGV4ICVkXG4iLCBob3N0LT50cmFuc2Zlcl9pbmRleCk7CiAKIAkJc2cgPSAmZGF0YS0+c2dbaG9zdC0+dHJhbnNmZXJfaW5kZXgrK107Ci0JCURCRygic2cgPSAlcFxuIiwgc2cpOworCQlwcl9kZWJ1Zygic2cgPSAlcFxuIiwgc2cpOwogCiAJCXNnLT5kbWFfYWRkcmVzcyA9IGRtYV9tYXBfcGFnZShOVUxMLCBzZy0+cGFnZSwgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCwgRE1BX0ZST01fREVWSUNFKTsKIAotCQlEQkcoImRtYSBhZGRyZXNzID0gJTA4WCwgbGVuZ3RoID0gJWRcbiIsIHNnLT5kbWFfYWRkcmVzcywgc2ctPmxlbmd0aCk7CisJCXByX2RlYnVnKCJkbWEgYWRkcmVzcyA9ICUwOFgsIGxlbmd0aCA9ICVkXG4iLCBzZy0+ZG1hX2FkZHJlc3MsIHNnLT5sZW5ndGgpOwogCiAJCWlmIChpID09IDApIHsKIAkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1JQUiwgc2ctPmRtYV9hZGRyZXNzKTsKQEAgLTI1Nyw3ICsyNTAsNyBAQAogCQl9CiAJfQogCi0JREJHKCJwcmUgZG1hIHJlYWQgZG9uZVxuIik7CisJcHJfZGVidWcoInByZSBkbWEgcmVhZCBkb25lXG4iKTsKIH0KIAogLyoKQEAgLTI2OCwxNyArMjYxLDE3IEBACiAJc3RydWN0IG1tY19jb21tYW5kICpjbWQ7CiAJc3RydWN0IG1tY19kYXRhICpkYXRhOwogCi0JREJHKCJwb3N0IGRtYSByZWFkXG4iKTsKKwlwcl9kZWJ1ZygicG9zdCBkbWEgcmVhZFxuIik7CiAKIAljbWQgPSBob3N0LT5jbWQ7CiAJaWYgKCFjbWQpIHsKLQkJREJHKCJubyBjb21tYW5kXG4iKTsKKwkJcHJfZGVidWcoIm5vIGNvbW1hbmRcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJZGF0YSA9IGNtZC0+ZGF0YTsKIAlpZiAoIWRhdGEpIHsKLQkJREJHKCJubyBkYXRhXG4iKTsKKwkJcHJfZGVidWcoIm5vIGRhdGFcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yODksMTcgKzI4MiwxNyBAQAogCiAJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAKLQkJREJHKCJmaW5pc2hpbmcgaW5kZXggJWRcbiIsIGhvc3QtPmluX3VzZV9pbmRleCk7CisJCXByX2RlYnVnKCJmaW5pc2hpbmcgaW5kZXggJWRcbiIsIGhvc3QtPmluX3VzZV9pbmRleCk7CiAKIAkJc2cgPSAmZGF0YS0+c2dbaG9zdC0+aW5fdXNlX2luZGV4KytdOwogCi0JCURCRygiVW5tYXBwaW5nIHBhZ2UgJTA4WFxuIiwgc2ctPmRtYV9hZGRyZXNzKTsKKwkJcHJfZGVidWcoIlVubWFwcGluZyBwYWdlICUwOFhcbiIsIHNnLT5kbWFfYWRkcmVzcyk7CiAKIAkJZG1hX3VubWFwX3BhZ2UoTlVMTCwgc2ctPmRtYV9hZGRyZXNzLCBzZy0+bGVuZ3RoLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCS8qIFN3YXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgKi8KIAkJYnVmZmVyID0ga21hcF9hdG9taWMoc2ctPnBhZ2UsIEtNX0JJT19TUkNfSVJRKSArIHNnLT5vZmZzZXQ7Ci0JCURCRygiYnVmZmVyID0gJXAsIGxlbmd0aCA9ICVkXG4iLCBidWZmZXIsIHNnLT5sZW5ndGgpOworCQlwcl9kZWJ1ZygiYnVmZmVyID0gJXAsIGxlbmd0aCA9ICVkXG4iLCBidWZmZXIsIHNnLT5sZW5ndGgpOwogCiAJCWRhdGEtPmJ5dGVzX3hmZXJlZCArPSBzZy0+bGVuZ3RoOwogCkBAIC0zMjAsNyArMzEzLDcgQEAKIAkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfUFRDUiwgQVQ5MV9QRENfUlhURElTIHwgQVQ5MV9QRENfVFhURElTKTsKIAl9CiAKLQlEQkcoInBvc3QgZG1hIHJlYWQgZG9uZVxuIik7CisJcHJfZGVidWcoInBvc3QgZG1hIHJlYWQgZG9uZVxuIik7CiB9CiAKIC8qCkBAIC0zMzEsNyArMzI0LDcgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsKIAlzdHJ1Y3QgbW1jX2RhdGEgKmRhdGE7CiAKLQlEQkcoIkhhbmRsaW5nIHRoZSB0cmFuc21pdFxuIik7CisJcHJfZGVidWcoIkhhbmRsaW5nIHRoZSB0cmFuc21pdFxuIik7CiAKIAkvKiBEaXNhYmxlIHRoZSB0cmFuc2ZlciAqLwogCWF0OTFfbWNpX3dyaXRlKEFUOTFfUERDX1BUQ1IsIEFUOTFfUERDX1JYVERJUyB8IEFUOTFfUERDX1RYVERJUyk7CkBAIC0zODcsMTIgKzM4MCwxMiBAQAogCS8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgbmVlZGVkICovCiAjaWYgMAogCWlmICgoYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TUikgJiBBVDkxX01DSV9SVE9FKSAmJiAoY21kLT5vcGNvZGUgPT0gMSkpIHsKLQkJREJHKCJDbGVhcmluZyB0aW1lb3V0XG4iKTsKKwkJcHJfZGVidWcoIkNsZWFyaW5nIHRpbWVvdXRcbiIpOwogCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9BUkdSLCAwKTsKIAkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfQ01EUiwgQVQ5MV9NQ0lfT1BEQ01EKTsKIAkJd2hpbGUgKCEoYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9TUikgJiBBVDkxX01DSV9DTURSRFkpKSB7CiAJCQkvKiBzcGluICovCi0JCQlEQkcoIkNsZWFyaW5nOiBTUiA9ICUwOFhcbiIsIGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfU1IpKTsKKwkJCXByX2RlYnVnKCJDbGVhcmluZzogU1IgPSAlMDhYXG4iLCBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NSKSk7CiAJCX0KIAl9CiAjZW5kaWYKQEAgLTQxMSw3ICs0MDQsNyBAQAogCX0KIAogCWlmIChkYXRhKSB7Ci0JCWJsb2NrX2xlbmd0aCA9IDEgPDwgZGF0YS0+Ymxrc3pfYml0czsKKwkJYmxvY2tfbGVuZ3RoID0gZGF0YS0+Ymxrc3o7CiAJCWJsb2NrcyA9IGRhdGEtPmJsb2NrczsKIAogCQkvKiBhbHdheXMgc2V0IGRhdGEgc3RhcnQgLSBhbHNvIHNldCBkaXJlY3Rpb24gZmxhZyBmb3IgcmVhZCAqLwpAQCAtNDM5LDcgKzQzMiw3IEBACiAJLyoKIAkgKiBTZXQgdGhlIGFyZ3VtZW50cyBhbmQgc2VuZCB0aGUgY29tbWFuZAogCSAqLwotCURCRygiU2VuZGluZyBjb21tYW5kICVkIGFzICUwOFgsIGFyZyA9ICUwOFgsIGJsb2NrcyA9ICVkLCBsZW5ndGggPSAlZCAoTVIgPSAlMDhsWClcbiIsCisJcHJfZGVidWcoIlNlbmRpbmcgY29tbWFuZCAlZCBhcyAlMDhYLCBhcmcgPSAlMDhYLCBibG9ja3MgPSAlZCwgbGVuZ3RoID0gJWQgKE1SID0gJTA4bFgpXG4iLAogCQljbWQtPm9wY29kZSwgY21kciwgY21kLT5hcmcsIGJsb2NrcywgYmxvY2tfbGVuZ3RoLCBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX01SKSk7CiAKIAlpZiAoIWRhdGEpIHsKQEAgLTQ5MSw3ICs0ODQsNyBAQAogCiAJCQlhdDkxbWNpX3NnX3RvX2RtYShob3N0LCBkYXRhKTsKIAotCQkJREJHKCJUcmFuc21pdHRpbmcgJWQgYnl0ZXNcbiIsIGhvc3QtPnRvdGFsX2xlbmd0aCk7CisJCQlwcl9kZWJ1ZygiVHJhbnNtaXR0aW5nICVkIGJ5dGVzXG4iLCBob3N0LT50b3RhbF9sZW5ndGgpOwogCiAJCQlhdDkxX21jaV93cml0ZShBVDkxX1BEQ19UUFIsIGhvc3QtPnBoeXNpY2FsX2FkZHJlc3MpOwogCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9QRENfVENSLCBob3N0LT50b3RhbF9sZW5ndGggLyA0KTsKQEAgLTUyNSw3ICs1MTgsNyBAQAogCiAJaWVyID0gYXQ5MV9tY2lfc2VuZF9jb21tYW5kKGhvc3QsIGNtZCk7CiAKLQlEQkcoInNldHRpbmcgaWVyIHRvICUwOFhcbiIsIGllcik7CisJcHJfZGVidWcoInNldHRpbmcgaWVyIHRvICUwOFhcbiIsIGllcik7CiAKIAkvKiBTdG9wIG9uIGVycm9ycyBvciB0aGUgcmVxdWlyZWQgdmFsdWUgKi8KIAlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRVIsIDB4ZmZmZjAwMDAgfCBpZXIpOwpAQCAtNTcwLDcgKzU2Myw3IEBACiAKIAlzdGF0dXMgPSBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NSKTsKIAotCURCRygiU3RhdHVzID0gJTA4WCBbJTA4WCAlMDhYICUwOFggJTA4WF1cbiIsCisJcHJfZGVidWcoIlN0YXR1cyA9ICUwOFggWyUwOFggJTA4WCAlMDhYICUwOFhdXG4iLAogCQkgc3RhdHVzLCBjbWQtPnJlc3BbMF0sIGNtZC0+cmVzcFsxXSwgY21kLT5yZXNwWzJdLCBjbWQtPnJlc3BbM10pOwogCiAJaWYgKHN0YXR1cyAmIChBVDkxX01DSV9SSU5ERSB8IEFUOTFfTUNJX1JESVJFIHwgQVQ5MV9NQ0lfUkNSQ0UgfApAQCAtNTkwLDcgKzU4Myw3IEBACiAJCQllbHNlCiAJCQkJY21kLT5lcnJvciA9IE1NQ19FUlJfRkFJTEVEOwogCi0JCQlEQkcoIkVycm9yIGRldGVjdGVkIGFuZCBzZXQgdG8gJWQgKGNtZCA9ICVkLCByZXRyaWVzID0gJWQpXG4iLAorCQkJcHJfZGVidWcoIkVycm9yIGRldGVjdGVkIGFuZCBzZXQgdG8gJWQgKGNtZCA9ICVkLCByZXRyaWVzID0gJWQpXG4iLAogCQkJCSBjbWQtPmVycm9yLCBjbWQtPm9wY29kZSwgY21kLT5yZXRyaWVzKTsKIAkJfQogCX0KQEAgLTYyMSwxMCArNjE0LDcgQEAKIAlzdHJ1Y3QgYXQ5MW1jaV9ob3N0ICpob3N0ID0gbW1jX3ByaXYobW1jKTsKIAl1bnNpZ25lZCBsb25nIGF0OTFfbWFzdGVyX2Nsb2NrID0gY2xrX2dldF9yYXRlKG1jaV9jbGspOwogCi0JaWYgKGhvc3QpCi0JCWhvc3QtPmJ1c19tb2RlID0gaW9zLT5idXNfbW9kZTsKLQllbHNlCi0JCXByaW50aygiTU1DOiBObyBob3N0IGZvciBidXNfbW9kZVxuIik7CisJaG9zdC0+YnVzX21vZGUgPSBpb3MtPmJ1c19tb2RlOwogCiAJaWYgKGlvcy0+Y2xvY2sgPT0gMCkgewogCQkvKiBEaXNhYmxlIHRoZSBNQ0kgY29udHJvbGxlciAqLwpAQCAtNjQwLDE1ICs2MzAsMTUgQEAKIAkJZWxzZQogCQkJY2xrZGl2ID0gKGF0OTFfbWFzdGVyX2Nsb2NrIC8gaW9zLT5jbG9jaykgLyAyOwogCi0JCURCRygiY2xrZGl2ID0gJWQuIG1jY2sgPSAlbGRcbiIsIGNsa2RpdiwKKwkJcHJfZGVidWcoImNsa2RpdiA9ICVkLiBtY2NrID0gJWxkXG4iLCBjbGtkaXYsCiAJCQlhdDkxX21hc3Rlcl9jbG9jayAvICgyICogKGNsa2RpdiArIDEpKSk7CiAJfQogCWlmIChpb3MtPmJ1c193aWR0aCA9PSBNTUNfQlVTX1dJRFRIXzQgJiYgaG9zdC0+Ym9hcmQtPndpcmU0KSB7Ci0JCURCRygiTU1DOiBTZXR0aW5nIGNvbnRyb2xsZXIgYnVzIHdpZHRoIHRvIDRcbiIpOworCQlwcl9kZWJ1ZygiTU1DOiBTZXR0aW5nIGNvbnRyb2xsZXIgYnVzIHdpZHRoIHRvIDRcbiIpOwogCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9TRENSLCBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NEQ1IpIHwgQVQ5MV9NQ0lfU0RDQlVTKTsKIAl9CiAJZWxzZSB7Ci0JCURCRygiTU1DOiBTZXR0aW5nIGNvbnRyb2xsZXIgYnVzIHdpZHRoIHRvIDFcbiIpOworCQlwcl9kZWJ1ZygiTU1DOiBTZXR0aW5nIGNvbnRyb2xsZXIgYnVzIHdpZHRoIHRvIDFcbiIpOwogCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9TRENSLCBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NEQ1IpICYgfkFUOTFfTUNJX1NEQ0JVUyk7CiAJfQogCkBAIC02NTYsNyArNjQ2LDcgQEAKIAlhdDkxX21jaV93cml0ZShBVDkxX01DSV9NUiwgKGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfTVIpICYgfkFUOTFfTUNJX0NMS0RJVikgfCBjbGtkaXYpOwogCiAJLyogbWF5YmUgc3dpdGNoIHBvd2VyIHRvIHRoZSBjYXJkICovCi0JaWYgKGhvc3QgJiYgaG9zdC0+Ym9hcmQtPnZjY19waW4pIHsKKwlpZiAoaG9zdC0+Ym9hcmQtPnZjY19waW4pIHsKIAkJc3dpdGNoIChpb3MtPnBvd2VyX21vZGUpIHsKIAkJCWNhc2UgTU1DX1BPV0VSX09GRjoKIAkJCQlhdDkxX3NldF9ncGlvX291dHB1dChob3N0LT5ib2FyZC0+dmNjX3BpbiwgMCk7CkBAIC02NzksMTEgKzY2OSw4IEBACiAKIAl1bnNpZ25lZCBpbnQgaW50X3N0YXR1czsKIAotCWlmIChob3N0ID09IE5VTEwpCi0JCXJldHVybiBJUlFfSEFORExFRDsKLQogCWludF9zdGF0dXMgPSBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX1NSKTsKLQlEQkcoIk1DSSBpcnE6IHN0YXR1cyA9ICUwOFgsICUwOGxYLCAlMDhsWFxuIiwgaW50X3N0YXR1cywgYXQ5MV9tY2lfcmVhZChBVDkxX01DSV9JTVIpLAorCXByX2RlYnVnKCJNQ0kgaXJxOiBzdGF0dXMgPSAlMDhYLCAlMDhsWCwgJTA4bFhcbiIsIGludF9zdGF0dXMsIGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfSU1SKSwKIAkJaW50X3N0YXR1cyAmIGF0OTFfbWNpX3JlYWQoQVQ5MV9NQ0lfSU1SKSk7CiAKIAlpZiAoKGludF9zdGF0dXMgJiBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX0lNUikpICYgMHhmZmZmMDAwMCkKQEAgLTY5Miw3NSArNjc5LDc1IEBACiAJaW50X3N0YXR1cyAmPSBhdDkxX21jaV9yZWFkKEFUOTFfTUNJX0lNUik7CiAKIAlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1VOUkUpCi0JCURCRygiTU1DOiBVbmRlcnJ1biBlcnJvclxuIik7CisJCXByX2RlYnVnKCJNTUM6IFVuZGVycnVuIGVycm9yXG4iKTsKIAlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX09WUkUpCi0JCURCRygiTU1DOiBPdmVycnVuIGVycm9yXG4iKTsKKwkJcHJfZGVidWcoIk1NQzogT3ZlcnJ1biBlcnJvclxuIik7CiAJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9EVE9FKQotCQlEQkcoIk1NQzogRGF0YSB0aW1lb3V0XG4iKTsKKwkJcHJfZGVidWcoIk1NQzogRGF0YSB0aW1lb3V0XG4iKTsKIAlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0RDUkNFKQotCQlEQkcoIk1NQzogQ1JDIGVycm9yIGluIGRhdGFcbiIpOworCQlwcl9kZWJ1ZygiTU1DOiBDUkMgZXJyb3IgaW4gZGF0YVxuIik7CiAJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SVE9FKQotCQlEQkcoIk1NQzogUmVzcG9uc2UgdGltZW91dFxuIik7CisJCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIHRpbWVvdXRcbiIpOwogCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfUkVOREUpCi0JCURCRygiTU1DOiBSZXNwb25zZSBlbmQgYml0IGVycm9yXG4iKTsKKwkJcHJfZGVidWcoIk1NQzogUmVzcG9uc2UgZW5kIGJpdCBlcnJvclxuIik7CiAJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SQ1JDRSkKLQkJREJHKCJNTUM6IFJlc3BvbnNlIENSQyBlcnJvclxuIik7CisJCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIENSQyBlcnJvclxuIik7CiAJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SRElSRSkKLQkJREJHKCJNTUM6IFJlc3BvbnNlIGRpcmVjdGlvbiBlcnJvclxuIik7CisJCXByX2RlYnVnKCJNTUM6IFJlc3BvbnNlIGRpcmVjdGlvbiBlcnJvclxuIik7CiAJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9SSU5ERSkKLQkJREJHKCJNTUM6IFJlc3BvbnNlIGluZGV4IGVycm9yXG4iKTsKKwkJcHJfZGVidWcoIk1NQzogUmVzcG9uc2UgaW5kZXggZXJyb3JcbiIpOwogCiAJLyogT25seSBjb250aW51ZSBwcm9jZXNzaW5nIGlmIG5vIGVycm9ycyAqLwogCWlmICghY29tcGxldGVkKSB7CiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfVFhCVUZFKSB7Ci0JCQlEQkcoIlRYIGJ1ZmZlciBlbXB0eVxuIik7CisJCQlwcl9kZWJ1ZygiVFggYnVmZmVyIGVtcHR5XG4iKTsKIAkJCWF0OTFfbWNpX2hhbmRsZV90cmFuc21pdHRlZChob3N0KTsKIAkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfUlhCVUZGKSB7Ci0JCQlEQkcoIlJYIGJ1ZmZlciBmdWxsXG4iKTsKKwkJCXByX2RlYnVnKCJSWCBidWZmZXIgZnVsbFxuIik7CiAJCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRVIsIEFUOTFfTUNJX0NNRFJEWSk7CiAJCX0KIAogCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX0VORFRYKSB7Ci0JCQlEQkcoIlRyYW5zbWl0IGhhcyBlbmRlZFxuIik7CisJCQlwcl9kZWJ1ZygiVHJhbnNtaXQgaGFzIGVuZGVkXG4iKTsKIAkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRU5EUlgpIHsKLQkJCURCRygiUmVjZWl2ZSBoYXMgZW5kZWRcbiIpOworCQkJcHJfZGVidWcoIlJlY2VpdmUgaGFzIGVuZGVkXG4iKTsKIAkJCWF0OTFtY2lfcG9zdF9kbWFfcmVhZChob3N0KTsKIAkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfTk9UQlVTWSkgewotCQkJREJHKCJDYXJkIGlzIHJlYWR5XG4iKTsKKwkJCXByX2RlYnVnKCJDYXJkIGlzIHJlYWR5XG4iKTsKIAkJCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0lFUiwgQVQ5MV9NQ0lfQ01EUkRZKTsKIAkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfRFRJUCkgewotCQkJREJHKCJEYXRhIHRyYW5zZmVyIGluIHByb2dyZXNzXG4iKTsKKwkJCXByX2RlYnVnKCJEYXRhIHRyYW5zZmVyIGluIHByb2dyZXNzXG4iKTsKIAkJfQogCiAJCWlmIChpbnRfc3RhdHVzICYgQVQ5MV9NQ0lfQkxLRSkgewotCQkJREJHKCJCbG9jayB0cmFuc2ZlciBoYXMgZW5kZWRcbiIpOworCQkJcHJfZGVidWcoIkJsb2NrIHRyYW5zZmVyIGhhcyBlbmRlZFxuIik7CiAJCX0KIAogCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1RYUkRZKSB7Ci0JCQlEQkcoIlJlYWR5IHRvIHRyYW5zbWl0XG4iKTsKKwkJCXByX2RlYnVnKCJSZWFkeSB0byB0cmFuc21pdFxuIik7CiAJCX0KIAogCQlpZiAoaW50X3N0YXR1cyAmIEFUOTFfTUNJX1JYUkRZKSB7Ci0JCQlEQkcoIlJlYWR5IHRvIHJlY2VpdmVcbiIpOworCQkJcHJfZGVidWcoIlJlYWR5IHRvIHJlY2VpdmVcbiIpOwogCQl9CiAKIAkJaWYgKGludF9zdGF0dXMgJiBBVDkxX01DSV9DTURSRFkpIHsKLQkJCURCRygiQ29tbWFuZCByZWFkeVxuIik7CisJCQlwcl9kZWJ1ZygiQ29tbWFuZCByZWFkeVxuIik7CiAJCQljb21wbGV0ZWQgPSAxOwogCQl9CiAJfQogCWF0OTFfbWNpX3dyaXRlKEFUOTFfTUNJX0lEUiwgaW50X3N0YXR1cyk7CiAKIAlpZiAoY29tcGxldGVkKSB7Ci0JCURCRygiQ29tcGxldGVkIGNvbW1hbmRcbiIpOworCQlwcl9kZWJ1ZygiQ29tcGxldGVkIGNvbW1hbmRcbiIpOwogCQlhdDkxX21jaV93cml0ZShBVDkxX01DSV9JRFIsIDB4ZmZmZmZmZmYpOwogCQlhdDkxbWNpX2NvbXBsZXRlZF9jb21tYW5kKGhvc3QpOwogCX0KQEAgLTc3OSwxMCArNzY2LDEwIEBACiAJICovCiAJaWYgKHByZXNlbnQgIT0gaG9zdC0+cHJlc2VudCkgewogCQlob3N0LT5wcmVzZW50ID0gcHJlc2VudDsKLQkJREJHKCIlczogY2FyZCAlc1xuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksCisJCXByX2RlYnVnKCIlczogY2FyZCAlc1xuIiwgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksCiAJCQlwcmVzZW50ID8gImluc2VydCIgOiAicmVtb3ZlIik7CiAJCWlmICghcHJlc2VudCkgewotCQkJREJHKCIqKioqKiogUmVzZXR0aW5nIFNELWNhcmQgYnVzIHdpZHRoICoqKioqKlxuIik7CisJCQlwcl9kZWJ1ZygiKioqKioqIFJlc2V0dGluZyBTRC1jYXJkIGJ1cyB3aWR0aCAqKioqKipcbiIpOwogCQkJYXQ5MV9tY2lfd3JpdGUoQVQ5MV9NQ0lfU0RDUiwgMCk7CiAJCX0KIAkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwpAQCAtODIyLDEzICs4MDksMTMgQEAKIAlzdHJ1Y3QgYXQ5MW1jaV9ob3N0ICpob3N0OwogCWludCByZXQ7CiAKLQlEQkcoIlByb2JlIE1DSSBkZXZpY2VzXG4iKTsKKwlwcl9kZWJ1ZygiUHJvYmUgTUNJIGRldmljZXNcbiIpOwogCWF0OTFfbWNpX2Rpc2FibGUoKTsKIAlhdDkxX21jaV9lbmFibGUoKTsKIAogCW1tYyA9IG1tY19hbGxvY19ob3N0KHNpemVvZihzdHJ1Y3QgYXQ5MW1jaV9ob3N0KSwgJnBkZXYtPmRldik7CiAJaWYgKCFtbWMpIHsKLQkJREJHKCJGYWlsZWQgdG8gYWxsb2NhdGUgbW1jIGhvc3RcbiIpOworCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGFsbG9jYXRlIG1tYyBob3N0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC04NTQsOCArODQxLDkgQEAKIAkgKiBHZXQgQ2xvY2sKIAkgKi8KIAltY2lfY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAibWNpX2NsayIpOwotCWlmICghbWNpX2NsaykgeworCWlmIChJU19FUlIobWNpX2NsaykpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJBVDkxIE1NQzogbm8gY2xvY2sgZGVmaW5lZC5cbiIpOworCQltbWNfZnJlZV9ob3N0KG1tYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAljbGtfZW5hYmxlKG1jaV9jbGspOwkJCS8qIEVuYWJsZSB0aGUgcGVyaXBoZXJhbCBjbG9jayAqLwpAQCAtODY1LDcgKzg1MywxMCBAQAogCSAqLwogCXJldCA9IHJlcXVlc3RfaXJxKEFUOTFfSURfTUNJLCBhdDkxX21jaV9pcnEsIFNBX1NISVJRLCBEUklWRVJfTkFNRSwgaG9zdCk7CiAJaWYgKHJldCkgewotCQlEQkcoIkZhaWxlZCB0byByZXF1ZXN0IE1DSSBpbnRlcnJ1cHRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZXF1ZXN0IE1DSSBpbnRlcnJ1cHRcbiIpOworCQljbGtfZGlzYWJsZShtY2lfY2xrKTsKKwkJY2xrX3B1dChtY2lfY2xrKTsKKwkJbW1jX2ZyZWVfaG9zdChtbWMpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtODg2LDEyICs4NzcsMTIgQEAKIAkgKi8KIAlpZiAoaG9zdC0+Ym9hcmQtPmRldF9waW4pIHsKIAkJcmV0ID0gcmVxdWVzdF9pcnEoaG9zdC0+Ym9hcmQtPmRldF9waW4sIGF0OTFfbW1jX2RldF9pcnEsCi0JCQkJU0FfU0FNUExFX1JBTkRPTSwgRFJJVkVSX05BTUUsIGhvc3QpOworCQkJCTAsIERSSVZFUl9OQU1FLCBob3N0KTsKIAkJaWYgKHJldCkKLQkJCURCRygiY291bGRuJ3QgYWxsb2NhdGUgTU1DIGRldGVjdCBpcnFcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZG4ndCBhbGxvY2F0ZSBNTUMgZGV0ZWN0IGlycVxuIik7CiAJfQogCi0JREJHKEtFUk5fSU5GTyAiQWRkZWQgTUNJIGRyaXZlclxuIik7CisJcHJfZGVidWcoS0VSTl9JTkZPICJBZGRlZCBNQ0kgZHJpdmVyXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTI0LDcgKzkxNSw3IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAotCURCRygiUmVtb3ZlZFxuIik7CisJcHJfZGVidWcoIk1DSSBSZW1vdmVkXG4iKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaW14bW1jLmMgYi9kcml2ZXJzL21tYy9pbXhtbWMuYwppbmRleCBhNGViMWQwLi41YzYyZjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9pbXhtbWMuYworKysgYi9kcml2ZXJzL21tYy9pbXhtbWMuYwpAQCAtMjI4LDcgKzIyOCw3IEBACiBzdGF0aWMgdm9pZCBpbXhtY2lfc2V0dXBfZGF0YShzdHJ1Y3QgaW14bWNpX2hvc3QgKmhvc3QsIHN0cnVjdCBtbWNfZGF0YSAqZGF0YSkKIHsKIAl1bnNpZ25lZCBpbnQgbm9iID0gZGF0YS0+YmxvY2tzOwotCXVuc2lnbmVkIGludCBibGtzeiA9IDEgPDwgZGF0YS0+Ymxrc3pfYml0czsKKwl1bnNpZ25lZCBpbnQgYmxrc3ogPSBkYXRhLT5ibGtzejsKIAl1bnNpZ25lZCBpbnQgZGF0YXN6ID0gbm9iICogYmxrc3o7CiAJaW50IGk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL29tYXAuYyBiL2RyaXZlcnMvbW1jL29tYXAuYwppbmRleCBiZWNiM2M2Li5jMjUyNDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9vbWFwLmMKKysrIGIvZHJpdmVycy9tbWMvb21hcC5jCkBAIC01ODQsMTAgKzU4NCwxMCBAQAogCWludCBzeW5jX2RldiA9IDA7CiAKIAlkYXRhX2FkZHIgPSBpb192MnAoKHUzMikgaG9zdC0+YmFzZSkgKyBPTUFQX01NQ19SRUdfREFUQTsKLQlmcmFtZSA9IDEgPDwgZGF0YS0+Ymxrc3pfYml0czsKKwlmcmFtZSA9IGRhdGEtPmJsa3N6OwogCWNvdW50ID0gc2dfZG1hX2xlbihzZyk7CiAKLQlpZiAoKGRhdGEtPmJsb2NrcyA9PSAxKSAmJiAoY291bnQgPiAoMSA8PCBkYXRhLT5ibGtzel9iaXRzKSkpCisJaWYgKChkYXRhLT5ibG9ja3MgPT0gMSkgJiYgKGNvdW50ID4gZGF0YS0+Ymxrc3opKQogCQljb3VudCA9IGZyYW1lOwogCiAJaG9zdC0+ZG1hX2xlbiA9IGNvdW50OwpAQCAtNzc2LDcgKzc3Niw3IEBACiAJfQogCiAKLQlibG9ja19zaXplID0gMSA8PCBkYXRhLT5ibGtzel9iaXRzOworCWJsb2NrX3NpemUgPSBkYXRhLT5ibGtzejsKIAogCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIE5CTEssIGRhdGEtPmJsb2NrcyAtIDEpOwogCU9NQVBfTU1DX1dSSVRFKGhvc3QtPmJhc2UsIEJMRU4sIGJsb2NrX3NpemUgLSAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL3NkaGNpLmMgYi9kcml2ZXJzL21tYy9zZGhjaS5jCmluZGV4IDZiZmNkYmMuLjhlOTEwMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvc2RoY2kuYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAJfQogCiAJREJHKCJibGtzeiAlMDR4IGJsa3MgJTA0eCBmbGFncyAlMDh4XG4iLAotCQkxIDw8IGRhdGEtPmJsa3N6X2JpdHMsIGRhdGEtPmJsb2NrcywgZGF0YS0+ZmxhZ3MpOworCQlkYXRhLT5ibGtzeiwgZGF0YS0+YmxvY2tzLCBkYXRhLT5mbGFncyk7CiAJREJHKCJ0c2FjICVkIG1zIG5zYWMgJWQgY2xrXG4iLAogCQlkYXRhLT50aW1lb3V0X25zIC8gMTAwMDAwMCwgZGF0YS0+dGltZW91dF9jbGtzKTsKIApAQCAtMjgyLDcgKzI4Miw3IEBACiAKIAl3cml0ZXcobW9kZSwgaG9zdC0+aW9hZGRyICsgU0RIQ0lfVFJBTlNGRVJfTU9ERSk7CiAKLQl3cml0ZXcoMSA8PCBkYXRhLT5ibGtzel9iaXRzLCBob3N0LT5pb2FkZHIgKyBTREhDSV9CTE9DS19TSVpFKTsKKwl3cml0ZXcoZGF0YS0+Ymxrc3osIGhvc3QtPmlvYWRkciArIFNESENJX0JMT0NLX1NJWkUpOwogCXdyaXRldyhkYXRhLT5ibG9ja3MsIGhvc3QtPmlvYWRkciArIFNESENJX0JMT0NLX0NPVU5UKTsKIAogCWlmIChob3N0LT5mbGFncyAmIFNESENJX1VTRV9ETUEpIHsKQEAgLTI5NCw3ICsyOTQsNyBAQAogCiAJCXdyaXRlbChzZ19kbWFfYWRkcmVzcyhkYXRhLT5zZyksIGhvc3QtPmlvYWRkciArIFNESENJX0RNQV9BRERSRVNTKTsKIAl9IGVsc2UgewotCQlob3N0LT5zaXplID0gKDEgPDwgZGF0YS0+Ymxrc3pfYml0cykgKiBkYXRhLT5ibG9ja3M7CisJCWhvc3QtPnNpemUgPSBkYXRhLT5ibGtzeiAqIGRhdGEtPmJsb2NrczsKIAogCQlob3N0LT5jdXJfc2cgPSBkYXRhLT5zZzsKIAkJaG9zdC0+bnVtX3NnID0gZGF0YS0+c2dfbGVuOwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJCWJsb2NrcyA9IDA7CiAJZWxzZQogCQlibG9ja3MgPSByZWFkdyhob3N0LT5pb2FkZHIgKyBTREhDSV9CTE9DS19DT1VOVCk7Ci0JZGF0YS0+Ynl0ZXNfeGZlcmVkID0gKDEgPDwgZGF0YS0+Ymxrc3pfYml0cykgKiAoZGF0YS0+YmxvY2tzIC0gYmxvY2tzKTsKKwlkYXRhLT5ieXRlc194ZmVyZWQgPSBkYXRhLT5ibGtzeiAqIChkYXRhLT5ibG9ja3MgLSBibG9ja3MpOwogCiAJaWYgKChkYXRhLT5lcnJvciA9PSBNTUNfRVJSX05PTkUpICYmIGJsb2NrcykgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb250cm9sbGVyIHNpZ25hbGxlZCBjb21wbGV0aW9uIGV2ZW4gIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvM2M1MjcuYyBiL2RyaXZlcnMvbmV0LzNjNTI3LmMKaW5kZXggMWIxY2IwMC4uMTU3ZWRhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvM2M1MjcuYworKysgYi9kcml2ZXJzL25ldC8zYzUyNy5jCkBAIC0xMDMxLDggKzEwMzEsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JaWYgKHNrYiA9PSBOVUxMKSB7CisJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkgewogCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CiAJCXJldHVybiAwOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0LzgxMzljcC5jIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKaW5kZXggNDZkOGMwMS4uMGNkYzgzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODEzOWNwLmMKKysrIGIvZHJpdmVycy9uZXQvODEzOWNwLmMKQEAgLTQwMSw2ICs0MDEsMTEgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgY3BfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogI2VuZGlmCitzdGF0aWMgaW50IGNwX2dldF9lZXByb21fbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIGludCBjcF9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKTsKK3N0YXRpYyBpbnQgY3Bfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjcF9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfVkVORE9SX0lEX1JFQUxURUssIFBDSV9ERVZJQ0VfSURfUkVBTFRFS184MTM5LApAQCAtNzkyLDcgKzc5Nyw3IEBACiAJZW50cnkgPSBjcC0+dHhfaGVhZDsKIAllb3IgPSAoZW50cnkgPT0gKENQX1RYX1JJTkdfU0laRSAtIDEpKSA/IFJpbmdFbmQgOiAwOwogCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pCi0JCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemU7CisJCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAKIAlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyA9PSAwKSB7CiAJCXN0cnVjdCBjcF9kZXNjICp0eGQgPSAmY3AtPnR4X3JpbmdbZW50cnldOwpAQCAtMTU3Nyw2ICsxNTgyLDkgQEAKIAkuZ2V0X3N0cmluZ3MJCT0gY3BfZ2V0X3N0cmluZ3MsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gY3BfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9wZXJtX2FkZHIJCT0gZXRodG9vbF9vcF9nZXRfcGVybV9hZGRyLAorCS5nZXRfZWVwcm9tX2xlbgkJPSBjcF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbQkJPSBjcF9nZXRfZWVwcm9tLAorCS5zZXRfZWVwcm9tCQk9IGNwX3NldF9lZXByb20sCiB9OwogCiBzdGF0aWMgaW50IGNwX2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQpAQCAtMTYxMiwyNCArMTYyMCwzMiBAQAogI2RlZmluZSBlZXByb21fZGVsYXkoKQlyZWFkbChlZV9hZGRyKQogCiAvKiBUaGUgRUVQUk9NIGNvbW1hbmRzIGluY2x1ZGUgdGhlIGFsd2F5LXNldCBsZWFkaW5nIGJpdC4gKi8KKyNkZWZpbmUgRUVfRVhURU5EX0NNRAkoNCkKICNkZWZpbmUgRUVfV1JJVEVfQ01ECSg1KQogI2RlZmluZSBFRV9SRUFEX0NNRAkJKDYpCiAjZGVmaW5lIEVFX0VSQVNFX0NNRAkoNykKIAotc3RhdGljIGludCByZWFkX2VlcHJvbSAodm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbiwgaW50IGFkZHJfbGVuKQotewotCWludCBpOwotCXVuc2lnbmVkIHJldHZhbCA9IDA7Ci0Jdm9pZCBfX2lvbWVtICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKLQlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisjZGVmaW5lIEVFX0VXRFNfQUREUgkoMCkKKyNkZWZpbmUgRUVfV1JBTF9BRERSCSgxKQorI2RlZmluZSBFRV9FUkFMX0FERFIJKDIpCisjZGVmaW5lIEVFX0VXRU5fQUREUgkoMykKIAorI2RlZmluZSBDUF9FRVBST01fTUFHSUMgUENJX0RFVklDRV9JRF9SRUFMVEVLXzgxMzkKKworc3RhdGljIHZvaWQgZWVwcm9tX2NtZF9zdGFydCh2b2lkIF9faW9tZW0gKmVlX2FkZHIpCit7CiAJd3JpdGViIChFRV9FTkIgJiB+RUVfQ1MsIGVlX2FkZHIpOwogCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKIAllZXByb21fZGVsYXkgKCk7Cit9CiAKLQkvKiBTaGlmdCB0aGUgcmVhZCBjb21tYW5kIGJpdHMgb3V0LiAqLwotCWZvciAoaSA9IDQgKyBhZGRyX2xlbjsgaSA+PSAwOyBpLS0pIHsKLQkJaW50IGRhdGF2YWwgPSAocmVhZF9jbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKK3N0YXRpYyB2b2lkIGVlcHJvbV9jbWQodm9pZCBfX2lvbWVtICplZV9hZGRyLCBpbnQgY21kLCBpbnQgY21kX2xlbikKK3sKKwlpbnQgaTsKKworCS8qIFNoaWZ0IHRoZSBjb21tYW5kIGJpdHMgb3V0LiAqLworCWZvciAoaSA9IGNtZF9sZW4gLSAxOyBpID49IDA7IGktLSkgeworCQlpbnQgZGF0YXZhbCA9IChjbWQgJiAoMSA8PCBpKSkgPyBFRV9EQVRBX1dSSVRFIDogMDsKIAkJd3JpdGViIChFRV9FTkIgfCBkYXRhdmFsLCBlZV9hZGRyKTsKIAkJZWVwcm9tX2RlbGF5ICgpOwogCQl3cml0ZWIgKEVFX0VOQiB8IGRhdGF2YWwgfCBFRV9TSElGVF9DTEssIGVlX2FkZHIpOwpAQCAtMTYzNyw2ICsxNjUzLDMzIEBACiAJfQogCXdyaXRlYiAoRUVfRU5CLCBlZV9hZGRyKTsKIAllZXByb21fZGVsYXkgKCk7Cit9CisKK3N0YXRpYyB2b2lkIGVlcHJvbV9jbWRfZW5kKHZvaWQgX19pb21lbSAqZWVfYWRkcikKK3sKKwl3cml0ZWIgKH5FRV9DUywgZWVfYWRkcik7CisJZWVwcm9tX2RlbGF5ICgpOworfQorCitzdGF0aWMgdm9pZCBlZXByb21fZXh0ZW5kX2NtZCh2b2lkIF9faW9tZW0gKmVlX2FkZHIsIGludCBleHRlbmRfY21kLAorCQkJICAgICAgaW50IGFkZHJfbGVuKQoreworCWludCBjbWQgPSAoRUVfRVhURU5EX0NNRCA8PCBhZGRyX2xlbikgfCAoZXh0ZW5kX2NtZCA8PCAoYWRkcl9sZW4gLSAyKSk7CisKKwllZXByb21fY21kX3N0YXJ0KGVlX2FkZHIpOworCWVlcHJvbV9jbWQoZWVfYWRkciwgY21kLCAzICsgYWRkcl9sZW4pOworCWVlcHJvbV9jbWRfZW5kKGVlX2FkZHIpOworfQorCitzdGF0aWMgdTE2IHJlYWRfZWVwcm9tICh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGxvY2F0aW9uLCBpbnQgYWRkcl9sZW4pCit7CisJaW50IGk7CisJdTE2IHJldHZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgcmVhZF9jbWQgPSBsb2NhdGlvbiB8IChFRV9SRUFEX0NNRCA8PCBhZGRyX2xlbik7CisKKwllZXByb21fY21kX3N0YXJ0KGVlX2FkZHIpOworCWVlcHJvbV9jbWQoZWVfYWRkciwgcmVhZF9jbWQsIDMgKyBhZGRyX2xlbik7CiAKIAlmb3IgKGkgPSAxNjsgaSA+IDA7IGktLSkgewogCQl3cml0ZWIgKEVFX0VOQiB8IEVFX1NISUZUX0NMSywgZWVfYWRkcik7CkBAIC0xNjQ4LDEzICsxNjkxLDEyNSBAQAogCQllZXByb21fZGVsYXkgKCk7CiAJfQogCi0JLyogVGVybWluYXRlIHRoZSBFRVBST00gYWNjZXNzLiAqLwotCXdyaXRlYiAofkVFX0NTLCBlZV9hZGRyKTsKLQllZXByb21fZGVsYXkgKCk7CisJZWVwcm9tX2NtZF9lbmQoZWVfYWRkcik7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgdm9pZCB3cml0ZV9lZXByb20odm9pZCBfX2lvbWVtICppb2FkZHIsIGludCBsb2NhdGlvbiwgdTE2IHZhbCwKKwkJCSBpbnQgYWRkcl9sZW4pCit7CisJaW50IGk7CisJdm9pZCBfX2lvbWVtICplZV9hZGRyID0gaW9hZGRyICsgQ2ZnOTM0NjsKKwlpbnQgd3JpdGVfY21kID0gbG9jYXRpb24gfCAoRUVfV1JJVEVfQ01EIDw8IGFkZHJfbGVuKTsKKworCWVlcHJvbV9leHRlbmRfY21kKGVlX2FkZHIsIEVFX0VXRU5fQUREUiwgYWRkcl9sZW4pOworCisJZWVwcm9tX2NtZF9zdGFydChlZV9hZGRyKTsKKwllZXByb21fY21kKGVlX2FkZHIsIHdyaXRlX2NtZCwgMyArIGFkZHJfbGVuKTsKKwllZXByb21fY21kKGVlX2FkZHIsIHZhbCwgMTYpOworCWVlcHJvbV9jbWRfZW5kKGVlX2FkZHIpOworCisJZWVwcm9tX2NtZF9zdGFydChlZV9hZGRyKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwMDA7IGkrKykKKwkJaWYgKHJlYWRiKGVlX2FkZHIpICYgRUVfREFUQV9SRUFEKQorCQkJYnJlYWs7CisJZWVwcm9tX2NtZF9lbmQoZWVfYWRkcik7CisKKwllZXByb21fZXh0ZW5kX2NtZChlZV9hZGRyLCBFRV9FV0RTX0FERFIsIGFkZHJfbGVuKTsKK30KKworc3RhdGljIGludCBjcF9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IHNpemU7CisKKwlzcGluX2xvY2tfaXJxKCZjcC0+bG9jayk7CisJc2l6ZSA9IHJlYWRfZWVwcm9tKGNwLT5yZWdzLCAwLCA4KSA9PSAweDgxMjkgPyAyNTYgOiAxMjg7CisJc3Bpbl91bmxvY2tfaXJxKCZjcC0+bG9jayk7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCBjcF9nZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpkYXRhKQoreworCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgaW50IGFkZHJfbGVuOworCXUxNiB2YWw7CisJdTMyIG9mZnNldCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDE7CisJdTMyIGxlbiA9IGVlcHJvbS0+bGVuOworCXUzMiBpID0gMDsKKworCWVlcHJvbS0+bWFnaWMgPSBDUF9FRVBST01fTUFHSUM7CisKKwlzcGluX2xvY2tfaXJxKCZjcC0+bG9jayk7CisKKwlhZGRyX2xlbiA9IHJlYWRfZWVwcm9tKGNwLT5yZWdzLCAwLCA4KSA9PSAweDgxMjkgPyA4IDogNjsKKworCWlmIChlZXByb20tPm9mZnNldCAmIDEpIHsKKwkJdmFsID0gcmVhZF9lZXByb20oY3AtPnJlZ3MsIG9mZnNldCwgYWRkcl9sZW4pOworCQlkYXRhW2krK10gPSAodTgpKHZhbCA+PiA4KTsKKwkJb2Zmc2V0Kys7CisJfQorCisJd2hpbGUgKGkgPCBsZW4gLSAxKSB7CisJCXZhbCA9IHJlYWRfZWVwcm9tKGNwLT5yZWdzLCBvZmZzZXQsIGFkZHJfbGVuKTsKKwkJZGF0YVtpKytdID0gKHU4KXZhbDsKKwkJZGF0YVtpKytdID0gKHU4KSh2YWwgPj4gOCk7CisJCW9mZnNldCsrOworCX0KKworCWlmIChpIDwgbGVuKSB7CisJCXZhbCA9IHJlYWRfZWVwcm9tKGNwLT5yZWdzLCBvZmZzZXQsIGFkZHJfbGVuKTsKKwkJZGF0YVtpXSA9ICh1OCl2YWw7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZjcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3Bfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBhZGRyX2xlbjsKKwl1MTYgdmFsOworCXUzMiBvZmZzZXQgPSBlZXByb20tPm9mZnNldCA+PiAxOworCXUzMiBsZW4gPSBlZXByb20tPmxlbjsKKwl1MzIgaSA9IDA7CisKKwlpZiAoZWVwcm9tLT5tYWdpYyAhPSBDUF9FRVBST01fTUFHSUMpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmY3AtPmxvY2spOworCisJYWRkcl9sZW4gPSByZWFkX2VlcHJvbShjcC0+cmVncywgMCwgOCkgPT0gMHg4MTI5ID8gOCA6IDY7CisKKwlpZiAoZWVwcm9tLT5vZmZzZXQgJiAxKSB7CisJCXZhbCA9IHJlYWRfZWVwcm9tKGNwLT5yZWdzLCBvZmZzZXQsIGFkZHJfbGVuKSAmIDB4ZmY7CisJCXZhbCB8PSAodTE2KWRhdGFbaSsrXSA8PCA4OworCQl3cml0ZV9lZXByb20oY3AtPnJlZ3MsIG9mZnNldCwgdmFsLCBhZGRyX2xlbik7CisJCW9mZnNldCsrOworCX0KKworCXdoaWxlIChpIDwgbGVuIC0gMSkgeworCQl2YWwgPSAodTE2KWRhdGFbaSsrXTsKKwkJdmFsIHw9ICh1MTYpZGF0YVtpKytdIDw8IDg7CisJCXdyaXRlX2VlcHJvbShjcC0+cmVncywgb2Zmc2V0LCB2YWwsIGFkZHJfbGVuKTsKKwkJb2Zmc2V0Kys7CisJfQorCisJaWYgKGkgPCBsZW4pIHsKKwkJdmFsID0gcmVhZF9lZXByb20oY3AtPnJlZ3MsIG9mZnNldCwgYWRkcl9sZW4pICYgMHhmZjAwOworCQl2YWwgfD0gKHUxNilkYXRhW2ldOworCQl3cml0ZV9lZXByb20oY3AtPnJlZ3MsIG9mZnNldCwgdmFsLCBhZGRyX2xlbik7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKCZjcC0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKIC8qIFB1dCB0aGUgYm9hcmQgaW50byBEM2NvbGQgc3RhdGUgYW5kIHdhaXQgZm9yIFdha2VVcCBzaWduYWwgKi8KIHN0YXRpYyB2b2lkIGNwX3NldF9kM19zdGF0ZSAoc3RydWN0IGNwX3ByaXZhdGUgKmNwKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODI1OTYuYyBiL2RyaXZlcnMvbmV0LzgyNTk2LmMKaW5kZXggZGEwYzg3OC4uOGE5ZjdkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvODI1OTYuYworKysgYi9kcml2ZXJzL25ldC84MjU5Ni5jCkBAIC0xMDcwLDggKzEwNzAsNyBAQAogCQkJCXNrYi0+bGVuLCAodW5zaWduZWQgaW50KXNrYi0+ZGF0YSkpOwogCiAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCisJCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAJCQlyZXR1cm4gMDsKIAkJbGVuZ3RoID0gRVRIX1pMRU47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvODM5MC5jIGIvZHJpdmVycy9uZXQvODM5MC5jCmluZGV4IGY4NzAyNzQuLjg2YmU5NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0LzgzOTAuYworKysgYi9kcml2ZXJzL25ldC84MzkwLmMKQEAgLTI3NSwxMiArMjc1LDE0IEBACiAJc3RydWN0IGVpX2RldmljZSAqZWlfbG9jYWwgPSAoc3RydWN0IGVpX2RldmljZSAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzZW5kX2xlbmd0aCA9IHNrYi0+bGVuLCBvdXRwdXRfcGFnZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgYnVmW0VUSF9aTEVOXTsKKwljaGFyICpkYXRhID0gc2tiLT5kYXRhOwogCiAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKKwkJbWVtc2V0KGJ1ZiwgMCwgRVRIX1pMRU4pOwkvKiBtb3JlIGVmZmljaWVudCB0aGFuIGRvaW5nIGp1c3QgdGhlIG5lZWRlZCBiaXRzICovCisJCW1lbWNweShidWYsIGRhdGEsIHNrYi0+bGVuKTsKIAkJc2VuZF9sZW5ndGggPSBFVEhfWkxFTjsKKwkJZGF0YSA9IGJ1ZjsKIAl9CiAKIAkvKiBNYXNrIGludGVycnVwdHMgZnJvbSB0aGUgZXRoZXJjYXJkLiAKQEAgLTM0Nyw3ICszNDksNyBAQAogCSAqIHRyaWdnZXIgdGhlIHNlbmQgbGF0ZXIsIHVwb24gcmVjZWl2aW5nIGEgVHggZG9uZSBpbnRlcnJ1cHQuCiAJICovCiAJIAotCWVpX2Jsb2NrX291dHB1dChkZXYsIHNlbmRfbGVuZ3RoLCBza2ItPmRhdGEsIG91dHB1dF9wYWdlKTsKKwllaV9ibG9ja19vdXRwdXQoZGV2LCBzZW5kX2xlbmd0aCwgZGF0YSwgb3V0cHV0X3BhZ2UpOwogCQkKIAlpZiAoISBlaV9sb2NhbC0+dHhpbmcpIAogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L0tjb25maWcgYi9kcml2ZXJzL25ldC9LY29uZmlnCmluZGV4IDBjNmI0NWEuLjM5MTg5OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvS2NvbmZpZwpAQCAtODU0LDYgKzg1NCwxNyBAQAogCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL25ldC1tb2R1bGVzLnR4dD4uIFRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNtYzkxOTQuCiAKK2NvbmZpZyBORVRfTkVUWAorCXRyaXN0YXRlICJOZXRYIEV0aGVybmV0IHN1cHBvcnQiCisJc2VsZWN0IE1JSQorCWRlcGVuZHMgb24gTkVUX0VUSEVSTkVUICYmIEFSQ0hfTkVUWAorCWhlbHAKKwkgIFRoaXMgaXMgc3VwcG9ydCBmb3IgdGhlIEhpbHNjaGVyIG5ldFggYnVpbHRpbiBFdGhlcm5ldCBwb3J0cworCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvbmV0LW1vZHVsZXMudHh0Pi4gVGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbmV0eC1ldGguCisKIGNvbmZpZyBETTkwMDAKIAl0cmlzdGF0ZSAiRE05MDAwIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiAoQVJNIHx8IE1JUFMpICYmIE5FVF9FVEhFUk5FVApAQCAtMTM3Niw4ICsxMzg3LDggQEAKIAkgIGNhbGxlZCBhcHJpY290LgogCiBjb25maWcgQjQ0Ci0JdHJpc3RhdGUgIkJyb2FkY29tIDQ0MDAgZXRoZXJuZXQgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIE5FVF9QQ0kgJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCXRyaXN0YXRlICJCcm9hZGNvbSA0NDAwIGV0aGVybmV0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfUENJICYmIFBDSQogCXNlbGVjdCBNSUkKIAloZWxwCiAJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjb250cm9sbGVyIG9mIHRoaXMgdHlwZSwgc2F5IFkgYW5kCkBAIC0yMTkwLDcgKzIyMDEsNyBAQAogCiBjb25maWcgU1BJREVSX05FVAogCXRyaXN0YXRlICJTcGlkZXIgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgUFBDX0NFTEwKKwlkZXBlbmRzIG9uIFBDSSAmJiBQUENfSUJNX0NFTExfQkxBREUKIAlzZWxlY3QgRldfTE9BREVSCiAJaGVscAogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIEdpZ2FiaXQgRXRoZXJuZXQgY2hpcHMgcHJlc2VudCBvbiB0aGUKQEAgLTIxOTgsMTEgKzIyMDksMTEgQEAKIAogY29uZmlnIEdJQU5GQVIKIAl0cmlzdGF0ZSAiR2lhbmZhciBFdGhlcm5ldCIKLQlkZXBlbmRzIG9uIDg1eHggfHwgODN4eAorCWRlcGVuZHMgb24gODV4eCB8fCA4M3h4IHx8IFBQQ184Nnh4CiAJc2VsZWN0IFBIWUxJQgogCWhlbHAKLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBHaWdhYml0IFRTRUMgb24gdGhlIE1QQzg1eHggCi0JICBmYW1pbHkgb2YgY2hpcHMsIGFuZCB0aGUgRkVDIG9uIHRoZSA4NTQwCisJICBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgR2lnYWJpdCBUU0VDIG9uIHRoZSBNUEM4M3h4LCBNUEM4NXh4LAorCSAgYW5kIE1QQzg2eHggZmFtaWx5IG9mIGNoaXBzLCBhbmQgdGhlIEZFQyBvbiB0aGUgODU0MC4KIAogY29uZmlnIEdGQVJfTkFQSQogCWJvb2wgIk5BUEkgU3VwcG9ydCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggMWVjZWQzMi4uYzkxZTk1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTE4Nyw2ICsxODcsNyBAQAogb2JqLSQoQ09ORklHX01BQ01BQ0UpICs9IG1hY21hY2Uubwogb2JqLSQoQ09ORklHX01BQzg5eDApICs9IG1hYzg5eDAubwogb2JqLSQoQ09ORklHX1RVTikgKz0gdHVuLm8KK29iai0kKENPTkZJR19ORVRfTkVUWCkgKz0gbmV0eC1ldGgubwogb2JqLSQoQ09ORklHX0RMMkspICs9IGRsMmsubwogb2JqLSQoQ09ORklHX1I4MTY5KSArPSByODE2OS5vCiBvYmotJChDT05GSUdfQU1EODExMV9FVEgpICs9IGFtZDgxMTFlLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2EyMDY1LmMgYi9kcml2ZXJzL25ldC9hMjA2NS5jCmluZGV4IDc5YmI1NmIuLjcxMTY1YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2EyMDY1LmMKKysrIGIvZHJpdmVycy9uZXQvYTIwNjUuYwpAQCAtNTczLDggKzU3Myw3IEBACiAJCiAJaWYgKGxlbiA8IEVUSF9aTEVOKSB7CiAJCWxlbiA9IEVUSF9aTEVOOwotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCXJldHVybiAwOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJpYWRuZS5jIGIvZHJpdmVycy9uZXQvYXJpYWRuZS5jCmluZGV4IGQxYjZiMWYuLmE5YmI3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FyaWFkbmUuYworKysgYi9kcml2ZXJzL25ldC9hcmlhZG5lLmMKQEAgLTYwNyw4ICs2MDcsNyBAQAogICAgIC8qIEZJWE1FOiBpcyB0aGUgNzlDOTYwIG5ldyBlbm91Z2ggdG8gZG8gaXRzIG93biBwYWRkaW5nIHJpZ2h0ID8gKi8KICAgICBpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikKICAgICB7Ci0gICAgCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLSAgICAJaWYgKHNrYiA9PSBOVUxMKQorICAgIAlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogICAgIAkgICAgcmV0dXJuIDA7CiAgICAgCWxlbiA9IEVUSF9aTEVOOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMgYi9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5jCmluZGV4IDU1MDNkYzguLjYxMzAwNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuYwpAQCAtNDMsNyArNDMsOSBAQAogI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmF0OTFfZGV2Owotc3RhdGljIHN0cnVjdCBjbGsgKmV0aGVyX2NsazsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGNoZWNrX3RpbWVyOworI2RlZmluZSBMSU5LX1BPTExfSU5URVJWQUwJKEhaKQogCiAvKiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gKi8KIApAQCAtMTQzLDcgKzE0NSw3IEBACiAgKiBNQUMgYWNjb3JkaW5nbHkuCiAgKiBJZiBubyBsaW5rIG9yIGF1dG8tbmVnb3RpYXRpb24gaXMgYnVzeSwgdGhlbiBubyBjaGFuZ2VzIGFyZSBtYWRlLgogICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfbGlua3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB1cGRhdGVfbGlua3NwZWVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzaWxlbnQpCiB7CiAJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgaW50IGJtc3IsIGJtY3IsIGxwYSwgbWFjX2NmZzsKQEAgLTE1MSw3ICsxNTMsOCBAQAogCiAJaWYgKCFtaWlfbGlua19vaygmbHAtPm1paSkpIHsJCS8qIG5vIGxpbmsgKi8KIAkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgZG93bi5cbiIsIGRldi0+bmFtZSk7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgZG93bi5cbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE4Niw3ICsxODksOCBAQAogCX0KIAlhdDkxX2VtYWNfd3JpdGUoQVQ5MV9FTUFDX0NGRywgbWFjX2NmZyk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogTGluayBub3cgJWktJXNcbiIsIGRldi0+bmFtZSwgc3BlZWQsIChkdXBsZXggPT0gRFVQTEVYX0ZVTEwpID8gIkZ1bGxEdXBsZXgiIDogIkhhbGZEdXBsZXgiKTsKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IExpbmsgbm93ICVpLSVzXG4iLCBkZXYtPm5hbWUsIHNwZWVkLCAoZHVwbGV4ID09IERVUExFWF9GVUxMKSA/ICJGdWxsRHVwbGV4IiA6ICJIYWxmRHVwbGV4Iik7CiAJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogfQogCkBAIC0yMjYsNyArMjMwLDcgQEAKIAkJCWdvdG8gZG9uZTsKIAl9CiAKLQl1cGRhdGVfbGlua3NwZWVkKGRldik7CisJdXBkYXRlX2xpbmtzcGVlZChkZXYsIDApOwogCiBkb25lOgogCWRpc2FibGVfbWRpKCk7CkBAIC0yNDMsMTQgKzI0NywxNyBAQAogCXVuc2lnbmVkIGludCBkc2ludHIsIGlycV9udW1iZXI7CiAJaW50IHN0YXR1czsKIAotCWlmIChscC0+cGh5X3R5cGUgPT0gTUlJX1JUTDgyMDFfSUQpCS8qIFJUTDgyMDEgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcnJ1cHQgKi8KLQkJcmV0dXJuOwotCWlmIChscC0+cGh5X3R5cGUgPT0gTUlJX0RQODM4NDdfSUQpCS8qIERQODM4NDcgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcnJ1cHQgKi8KLQkJcmV0dXJuOwotCWlmIChscC0+cGh5X3R5cGUgPT0gTUlJX0FDMTAxTF9JRCkJLyogQUMxMDFMIGludGVycnVwdCBub3Qgc3VwcG9ydGVkIHlldCAqLwotCQlyZXR1cm47Ci0KIAlpcnFfbnVtYmVyID0gbHAtPmJvYXJkX2RhdGEucGh5X2lycV9waW47CisJaWYgKCFpcnFfbnVtYmVyKSB7CisJCS8qCisJCSAqIFBIWSBkb2Vzbid0IGhhdmUgYW4gSVJRIHBpbiAoUlRMODIwMSwgRFA4Mzg0NywgQUMxMDFMKSwKKwkJICogb3IgYm9hcmQgZG9lcyBub3QgaGF2ZSBpdCBjb25uZWN0ZWQuCisJCSAqLworCQljaGVja190aW1lci5leHBpcmVzID0gamlmZmllcyArIExJTktfUE9MTF9JTlRFUlZBTDsKKwkJYWRkX3RpbWVyKCZjaGVja190aW1lcik7CisJCXJldHVybjsKKwl9CisKIAlzdGF0dXMgPSByZXF1ZXN0X2lycShpcnFfbnVtYmVyLCBhdDkxZXRoZXJfcGh5X2ludGVycnVwdCwgMCwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChzdGF0dXMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhdDkxX2V0aGVyOiBQSFkgSVJRICVkIHJlcXVlc3QgZmFpbGVkIC0gc3RhdHVzICVkIVxuIiwgaXJxX251bWJlciwgc3RhdHVzKTsKQEAgLTI5MiwxMiArMjk5LDExIEBACiAJdW5zaWduZWQgaW50IGRzaW50cjsKIAl1bnNpZ25lZCBpbnQgaXJxX251bWJlcjsKIAotCWlmIChscC0+cGh5X3R5cGUgPT0gTUlJX1JUTDgyMDFfSUQpIAkvKiBSVEw4MjAxIGRvZXMgbm90IGhhdmUgYW4gaW50ZXJydXB0ICovCisJaXJxX251bWJlciA9IGxwLT5ib2FyZF9kYXRhLnBoeV9pcnFfcGluOworCWlmICghaXJxX251bWJlcikgeworCQlkZWxfdGltZXJfc3luYygmY2hlY2tfdGltZXIpOwogCQlyZXR1cm47Ci0JaWYgKGxwLT5waHlfdHlwZSA9PSBNSUlfRFA4Mzg0N19JRCkJLyogRFA4Mzg0NyBkb2VzIG5vdCBoYXZlIGFuIGludGVycnVwdCAqLwotCQlyZXR1cm47Ci0JaWYgKGxwLT5waHlfdHlwZSA9PSBNSUlfQUMxMDFMX0lEKQkvKiBBQzEwMUwgaW50ZXJydXB0IG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JCXJldHVybjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CiAJZW5hYmxlX21kaSgpOwpAQCAtMzI2LDcgKzMzMiw2IEBACiAJZGlzYWJsZV9tZGkoKTsKIAlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKIAotCWlycV9udW1iZXIgPSBscC0+Ym9hcmRfZGF0YS5waHlfaXJxX3BpbjsKIAlmcmVlX2lycShpcnFfbnVtYmVyLCBkZXYpOwkJCS8qIEZyZWUgaW50ZXJydXB0IGhhbmRsZXIgKi8KIH0KIApAQCAtMzU1LDYgKzM2MCwxOCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGF0OTFldGhlcl9jaGVja19saW5rKHVuc2lnbmVkIGxvbmcgZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGV2X2lkOworCisJZW5hYmxlX21kaSgpOworCXVwZGF0ZV9saW5rc3BlZWQoZGV2LCAxKTsKKwlkaXNhYmxlX21kaSgpOworCisJY2hlY2tfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMSU5LX1BPTExfSU5URVJWQUw7CisJYWRkX3RpbWVyKCZjaGVja190aW1lcik7Cit9CisKIC8qIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gQUREUkVTUyBNQU5BR0VNRU5UIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAqLwogCiAvKgpAQCAtNTAxLDcgKzUxOCw3IEBACiAJCWhhc2hfaW5kZXggfD0gKGJpdHZhbCA8PCBqKTsKIAl9CiAKLSAgICAgICAgcmV0dXJuIGhhc2hfaW5kZXg7CisJcmV0dXJuIGhhc2hfaW5kZXg7CiB9CiAKIC8qCkBAIC01NTcsMTAgKzU3NCw4IEBACiAJYXQ5MV9lbWFjX3dyaXRlKEFUOTFfRU1BQ19DRkcsIGNmZyk7CiB9CiAKLQogLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiBFVEhUT09MIFNVUFBPUlQgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCiAKLQogc3RhdGljIGludCBtZGlvX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHBoeV9pZCwgaW50IGxvY2F0aW9uKQogewogCXVuc2lnbmVkIGludCB2YWx1ZTsKQEAgLTY0Miw2ICs2NTcsMjIgQEAKIAkuZ2V0X2xpbmsJPSBldGh0b29sX29wX2dldF9saW5rLAogfTsKIAorc3RhdGljIGludCBhdDkxZXRoZXJfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGRldi0+cHJpdjsKKwlpbnQgcmVzOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOworCWVuYWJsZV9tZGkoKTsKKwlyZXMgPSBnZW5lcmljX21paV9pb2N0bCgmbHAtPm1paSwgaWZfbWlpKHJxKSwgY21kLCBOVUxMKTsKKwlkaXNhYmxlX21kaSgpOworCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOworCisJcmV0dXJuIHJlczsKK30KIAogLyogLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gTUFDIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uICovCiAKQEAgLTY4NSwxMCArNzE2LDEwIEBACiAJc3RydWN0IGF0OTFfcHJpdmF0ZSAqbHAgPSAoc3RydWN0IGF0OTFfcHJpdmF0ZSAqKSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBjdGw7CiAKLSAgICAgICAgaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQotICAgICAgICAJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JY2xrX2VuYWJsZShldGhlcl9jbGspOwkJCS8qIFJlLWVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrICovCisJY2xrX2VuYWJsZShscC0+ZXRoZXJfY2xrKTsJCS8qIFJlLWVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrICovCiAKIAkvKiBDbGVhciBpbnRlcm5hbCBzdGF0aXN0aWNzICovCiAJY3RsID0gYXQ5MV9lbWFjX3JlYWQoQVQ5MV9FTUFDX0NUTCk7CkBAIC03MDgsNyArNzM5LDcgQEAKIAkvKiBEZXRlcm1pbmUgY3VycmVudCBsaW5rIHNwZWVkICovCiAJc3Bpbl9sb2NrX2lycSgmbHAtPmxvY2spOwogCWVuYWJsZV9tZGkoKTsKLQl1cGRhdGVfbGlua3NwZWVkKGRldik7CisJdXBkYXRlX2xpbmtzcGVlZChkZXYsIDApOwogCWRpc2FibGVfbWRpKCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZscC0+bG9jayk7CiAKQEAgLTcyMiw2ICs3NTMsNyBAQAogICovCiBzdGF0aWMgaW50IGF0OTFldGhlcl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogeworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgY3RsOwogCiAJLyogRGlzYWJsZSBSZWNlaXZlciBhbmQgVHJhbnNtaXR0ZXIgKi8KQEAgLTczOCw3ICs3NzAsNyBAQAogCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCi0JY2xrX2Rpc2FibGUoZXRoZXJfY2xrKTsJCQkvKiBEaXNhYmxlIFBlcmlwaGVyYWwgY2xvY2sgKi8KKwljbGtfZGlzYWJsZShscC0+ZXRoZXJfY2xrKTsJCS8qIERpc2FibGUgUGVyaXBoZXJhbCBjbG9jayAqLwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NzAsNyArOTAyLDcgQEAKIAlpZiAoaW50c3RhdHVzICYgQVQ5MV9FTUFDX1JDT00pCQkvKiBSZWNlaXZlIGNvbXBsZXRlICovCiAJCWF0OTFldGhlcl9yeChkZXYpOwogCi0JaWYgKGludHN0YXR1cyAmIEFUOTFfRU1BQ19UQ09NKSB7CQkvKiBUcmFuc21pdCBjb21wbGV0ZSAqLworCWlmIChpbnRzdGF0dXMgJiBBVDkxX0VNQUNfVENPTSkgewkvKiBUcmFuc21pdCBjb21wbGV0ZSAqLwogCQkvKiBUaGUgVENPTSBiaXQgaXMgc2V0IGV2ZW4gaWYgdGhlIHRyYW5zbWlzc2lvbiBmYWlsZWQuICovCiAJCWlmIChpbnRzdGF0dXMgJiAoQVQ5MV9FTUFDX1RVTkQgfCBBVDkxX0VNQUNfUlRSWSkpCiAJCQlscC0+c3RhdHMudHhfZXJyb3JzICs9IDE7CkBAIC04OTksNyArOTMxLDggQEAKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBldGhlcm5ldCBpbnRlcmZhY2UKICAqLwotc3RhdGljIGludCBfX2luaXQgYXQ5MWV0aGVyX3NldHVwKHVuc2lnbmVkIGxvbmcgcGh5X3R5cGUsIHVuc2lnbmVkIHNob3J0IHBoeV9hZGRyZXNzLCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBfX2luaXQgYXQ5MWV0aGVyX3NldHVwKHVuc2lnbmVkIGxvbmcgcGh5X3R5cGUsIHVuc2lnbmVkIHNob3J0IHBoeV9hZGRyZXNzLAorCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqZXRoZXJfY2xrKQogewogCXN0cnVjdCBhdDkxX2V0aF9kYXRhICpib2FyZF9kYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTkzMyw2ICs5NjYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJbHAtPmJvYXJkX2RhdGEgPSAqYm9hcmRfZGF0YTsKKwlscC0+ZXRoZXJfY2xrID0gZXRoZXJfY2xrOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7CiAKIAlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOwpAQCAtOTQ1LDYgKzk3OSw3IEBACiAJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBhdDkxZXRoZXJfc2V0X3J4X21vZGU7CiAJZGV2LT5zZXRfbWFjX2FkZHJlc3MgPSBzZXRfbWFjX2FkZHJlc3M7CiAJZGV2LT5ldGh0b29sX29wcyA9ICZhdDkxZXRoZXJfZXRodG9vbF9vcHM7CisJZGV2LT5kb19pb2N0bCA9IGF0OTFldGhlcl9pb2N0bDsKIAogCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CiAKQEAgLTk3NSw2ICsxMDEwLDkgQEAKIAlscC0+bWlpLmRldiA9IGRldjsJCS8qIFN1cHBvcnQgZm9yIGV0aHRvb2wgKi8KIAlscC0+bWlpLm1kaW9fcmVhZCA9IG1kaW9fcmVhZDsKIAlscC0+bWlpLm1kaW9fd3JpdGUgPSBtZGlvX3dyaXRlOworCWxwLT5taWkucGh5X2lkID0gcGh5X2FkZHJlc3M7CisJbHAtPm1paS5waHlfaWRfbWFzayA9IDB4MWY7CisJbHAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwogCiAJbHAtPnBoeV90eXBlID0gcGh5X3R5cGU7CS8qIFR5cGUgb2YgUEhZIGNvbm5lY3RlZCAqLwogCWxwLT5waHlfYWRkcmVzcyA9IHBoeV9hZGRyZXNzOwkvKiBNREkgYWRkcmVzcyBvZiBQSFkgKi8KQEAgLTk5MiwxMSArMTAzMCwxOCBAQAogCS8qIERldGVybWluZSBjdXJyZW50IGxpbmsgc3BlZWQgKi8KIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CiAJZW5hYmxlX21kaSgpOwotCXVwZGF0ZV9saW5rc3BlZWQoZGV2KTsKKwl1cGRhdGVfbGlua3NwZWVkKGRldiwgMCk7CiAJZGlzYWJsZV9tZGkoKTsKIAlzcGluX3VubG9ja19pcnEoJmxwLT5sb2NrKTsKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwkJLyogd2lsbCBiZSBlbmFibGVkIGluIG9wZW4oKSAqLwogCisJLyogSWYgYm9hcmQgaGFzIG5vIFBIWSBJUlEsIHVzZSBhIHRpbWVyIHRvIHBvbGwgdGhlIFBIWSAqLworCWlmICghbHAtPmJvYXJkX2RhdGEucGh5X2lycV9waW4pIHsKKwkJaW5pdF90aW1lcigmY2hlY2tfdGltZXIpOworCQljaGVja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OworCQljaGVja190aW1lci5mdW5jdGlvbiA9IGF0OTFldGhlcl9jaGVja19saW5rOworCX0KKwogCS8qIERpc3BsYXkgZXRoZXJuZXQgYmFubmVyICovCiAJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEFUOTEgZXRoZXJuZXQgYXQgMHglMDh4IGludD0lZCAlcyVzICglMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeClcbiIsCiAJCWRldi0+bmFtZSwgKHVpbnQpIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSwKQEAgLTEwMDUsNyArMTA1MCw3IEBACiAJCWRldi0+ZGV2X2FkZHJbMF0sIGRldi0+ZGV2X2FkZHJbMV0sIGRldi0+ZGV2X2FkZHJbMl0sCiAJCWRldi0+ZGV2X2FkZHJbM10sIGRldi0+ZGV2X2FkZHJbNF0sIGRldi0+ZGV2X2FkZHJbNV0pOwogCWlmICgocGh5X3R5cGUgPT0gTUlJX0RNOTE2MV9JRCkgfHwgKGxwLT5waHlfdHlwZSA9PSBNSUlfRE05MTYxQV9JRCkpCi0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBEYXZpY29tIDkxOTYgUEhZICVzXG4iLCBkZXYtPm5hbWUsIChscC0+cGh5X21lZGlhID09IFBPUlRfRklCUkUpID8gIihGaWJlcikiIDogIihDb3BwZXIpIik7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBEYXZpY29tIDkxNjEgUEhZICVzXG4iLCBkZXYtPm5hbWUsIChscC0+cGh5X21lZGlhID09IFBPUlRfRklCUkUpID8gIihGaWJlcikiIDogIihDb3BwZXIpIik7CiAJZWxzZSBpZiAocGh5X3R5cGUgPT0gTUlJX0xYVDk3MUFfSUQpCiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBJbnRlbCBMWFQ5NzFBIFBIWVxuIiwgZGV2LT5uYW1lKTsKIAllbHNlIGlmIChwaHlfdHlwZSA9PSBNSUlfUlRMODIwMV9JRCkKQEAgLTEwMzEsOSArMTA3NiwxMCBAQAogCWludCBkZXRlY3RlZCA9IC0xOwogCXVuc2lnbmVkIGxvbmcgcGh5X2lkOwogCXVuc2lnbmVkIHNob3J0IHBoeV9hZGRyZXNzID0gMDsKKwlzdHJ1Y3QgY2xrICpldGhlcl9jbGs7CiAKIAlldGhlcl9jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJldGhlcl9jbGsiKTsKLQlpZiAoIWV0aGVyX2NsaykgeworCWlmIChJU19FUlIoZXRoZXJfY2xrKSkgewogCQlwcmludGsoS0VSTl9FUlIgImF0OTFfZXRoZXI6IG5vIGNsb2NrIGRlZmluZWRcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xMDU2LDcgKzExMDIsNyBAQAogCQkJY2FzZSBNSUlfRFA4Mzg0N19JRDoJCS8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgRFA4Mzg0NzogICovCiAJCQljYXNlIE1JSV9BQzEwMUxfSUQ6CQkvKiBBbHRpbWEgQUMxMDFMOiBQSFlfSUQxID0gMHgyMiwgUEhZX0lEMiA9IDB4NTUyMCAqLwogCQkJY2FzZSBNSUlfS1M4NzIxX0lEOgkJLyogTWljcmVsIEtTODcyMTogUEhZX0lEMSA9IDB4MjIsIFBIWV9JRDIgPSAweDE2MTAgKi8KLQkJCQlkZXRlY3RlZCA9IGF0OTFldGhlcl9zZXR1cChwaHlfaWQsIHBoeV9hZGRyZXNzLCBwZGV2KTsKKwkJCQlkZXRlY3RlZCA9IGF0OTFldGhlcl9zZXR1cChwaHlfaWQsIHBoeV9hZGRyZXNzLCBwZGV2LCBldGhlcl9jbGspOwogCQkJCWJyZWFrOwogCQl9CiAKQEAgLTEwNzUsMTcgKzExMjEsNjEgQEAKIAl1bnJlZ2lzdGVyX25ldGRldihhdDkxX2Rldik7CiAJZnJlZV9pcnEoYXQ5MV9kZXYtPmlycSwgYXQ5MV9kZXYpOwogCWRtYV9mcmVlX2NvaGVyZW50KE5VTEwsIHNpemVvZihzdHJ1Y3QgcmVjdl9kZXNjX2J1ZnMpLCBscC0+ZGxpc3QsIChkbWFfYWRkcl90KWxwLT5kbGlzdF9waHlzKTsKLQljbGtfcHV0KGV0aGVyX2Nsayk7CisJY2xrX3B1dChscC0+ZXRoZXJfY2xrKTsKIAogCWZyZWVfbmV0ZGV2KGF0OTFfZGV2KTsKIAlhdDkxX2RldiA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBhdDkxZXRoZXJfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgYXQ5MV9wcml2YXRlICpscCA9IChzdHJ1Y3QgYXQ5MV9wcml2YXRlICopIGF0OTFfZGV2LT5wcml2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IHBoeV9pcnEgPSBscC0+Ym9hcmRfZGF0YS5waHlfaXJxX3BpbjsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldF9kZXYpKSB7CisJCWlmIChwaHlfaXJxKQorCQkJZGlzYWJsZV9pcnEocGh5X2lycSk7CisKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRfZGV2KTsKKworCQljbGtfZGlzYWJsZShscC0+ZXRoZXJfY2xrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MWV0aGVyX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhdDkxX3ByaXZhdGUgKmxwID0gKHN0cnVjdCBhdDkxX3ByaXZhdGUgKikgYXQ5MV9kZXYtPnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcGh5X2lycSA9IGxwLT5ib2FyZF9kYXRhLnBoeV9pcnFfcGluOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKKwkJY2xrX2VuYWJsZShscC0+ZXRoZXJfY2xrKTsKKworCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOworCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKKworCQlpZiAocGh5X2lycSkKKwkJCWVuYWJsZV9pcnEocGh5X2lycSk7CisJfQorCXJldHVybiAwOworfQorCisjZWxzZQorI2RlZmluZSBhdDkxZXRoZXJfc3VzcGVuZAlOVUxMCisjZGVmaW5lIGF0OTFldGhlcl9yZXN1bWUJTlVMTAorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFldGhlcl9kcml2ZXIgPSB7CiAJLnByb2JlCQk9IGF0OTFldGhlcl9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0OTFldGhlcl9yZW1vdmUpLAotCS8qIEZJWE1FOiAgc3VwcG9ydCBzdXNwZW5kIGFuZCByZXN1bWUgKi8KKwkuc3VzcGVuZAk9IGF0OTFldGhlcl9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYXQ5MWV0aGVyX3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSBEUlZfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5oIGIvZHJpdmVycy9uZXQvYXJtL2F0OTFfZXRoZXIuaAppbmRleCA5ODg1NzM1Li5kMWU3MmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vYXQ5MV9ldGhlci5oCisrKyBiL2RyaXZlcnMvbmV0L2FybS9hdDkxX2V0aGVyLmgKQEAgLTgwLDYgKzgwLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgbWlpX2lmX2luZm8gbWlpOwkJCS8qIGV0aHRvb2wgc3VwcG9ydCAqLwogCXN0cnVjdCBhdDkxX2V0aF9kYXRhIGJvYXJkX2RhdGE7CS8qIGJvYXJkLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3QgY2xrICpldGhlcl9jbGs7CQkJLyogY2xvY2sgKi8KIAogCS8qIFBIWSAqLwogCXVuc2lnbmVkIGxvbmcgcGh5X3R5cGU7CQkJLyogdHlwZSBvZiBQSFkgKFBIWV9JRCkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYyBiL2RyaXZlcnMvbmV0L2FybS9ldGhlcjEuYwppbmRleCAzNjQ3NWViLi4zMTI5NTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcm0vZXRoZXIxLmMKKysrIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMS5jCkBAIC03MDAsOCArNzAwLDcgQEAKIAl9CiAKIAlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jIGIvZHJpdmVycy9uZXQvYXJtL2V0aGVyMy5jCmluZGV4IGYxZDViMTAuLjA4MTA3NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2FybS9ldGhlcjMuYworKysgYi9kcml2ZXJzL25ldC9hcm0vZXRoZXIzLmMKQEAgLTUxOCw4ICs1MTgsNyBAQAogCiAJbGVuZ3RoID0gKGxlbmd0aCArIDEpICYgfjE7CiAJaWYgKGxlbmd0aCAhPSBza2ItPmxlbikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBsZW5ndGgpOwotCQlpZiAoc2tiID09IE5VTEwpCisJCWlmIChza2JfcGFkdG8oc2tiLCBsZW5ndGgpKQogCQkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMgYi9kcml2ZXJzL25ldC9hdGFyaWxhbmNlLmMKaW5kZXggNDQyYjJjYi4uOTE3ODNhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXRhcmlsYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L2F0YXJpbGFuY2UuYwpAQCAtODA0LDggKzgwNCw3IEBACiAJCSsrbGVuOwogCQkKIAlpZiAobGVuID4gc2tiLT5sZW4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgbGVuKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQorCQlpZiAoc2tiX3BhZHRvKHNrYiwgbGVuKSkKIAkJCXJldHVybiAwOwogCX0KIAkJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuYyBiL2RyaXZlcnMvbmV0L2I0NC5jCmluZGV4IGQ4MjMzZTAuLmE3ZTRiYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5jCkBAIC0yOSw4ICsyOSw4IEBACiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYjQ0IgogI2RlZmluZSBQRlggRFJWX01PRFVMRV9OQU1FCSI6ICIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIxLjAwIgotI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkFwciA3LCAyMDA2IgorI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIjEuMDEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuIDE2LCAyMDA2IgogCiAjZGVmaW5lIEI0NF9ERUZfTVNHX0VOQUJMRQkgIFwKIAkoTkVUSUZfTVNHX0RSVgkJfCBcCkBAIC03NSw2ICs3NSwxNSBAQAogLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KICNkZWZpbmUgQjQ0X1RYX1dBS0VVUF9USFJFU0gJCShCNDRfVFhfUklOR19TSVpFIC8gNCkKIAorLyogYjQ0IGludGVybmFsIHBhdHRlcm4gbWF0Y2ggZmlsdGVyIGluZm8gKi8KKyNkZWZpbmUgQjQ0X1BBVFRFUk5fQkFTRQkweDQwMAorI2RlZmluZSBCNDRfUEFUVEVSTl9TSVpFCTB4ODAKKyNkZWZpbmUgQjQ0X1BNQVNLX0JBU0UJCTB4NjAwCisjZGVmaW5lIEI0NF9QTUFTS19TSVpFCQkweDEwCisjZGVmaW5lIEI0NF9NQVhfUEFUVEVSTlMJMTYKKyNkZWZpbmUgQjQ0X0VUSElQVjZVRFBfSExFTgk2MgorI2RlZmluZSBCNDRfRVRISVBWNFVEUF9ITEVOCTQyCisKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTU9EVUxFX05BTUUgIi5jOnYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKIApAQCAtMTAxLDcgKzExMCw3IEBACiAKIHN0YXRpYyB2b2lkIGI0NF9oYWx0KHN0cnVjdCBiNDQgKik7CiBzdGF0aWMgdm9pZCBiNDRfaW5pdF9yaW5ncyhzdHJ1Y3QgYjQ0ICopOwotc3RhdGljIHZvaWQgYjQ0X2luaXRfaHcoc3RydWN0IGI0NCAqKTsKK3N0YXRpYyB2b2lkIGI0NF9pbml0X2h3KHN0cnVjdCBiNDQgKiwgaW50KTsKIAogc3RhdGljIGludCBkbWFfZGVzY19hbGlnbl9tYXNrOwogc3RhdGljIGludCBkbWFfZGVzY19zeW5jX3NpemU7CkBAIC04NzMsNyArODgyLDcgQEAKIAkJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOwogCQliNDRfaGFsdChicCk7CiAJCWI0NF9pbml0X3JpbmdzKGJwKTsKLQkJYjQ0X2luaXRfaHcoYnApOworCQliNDRfaW5pdF9odyhicCwgMSk7CiAJCW5ldGlmX3dha2VfcXVldWUoYnAtPmRldik7CiAJCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCQlkb25lID0gMTsKQEAgLTk0Miw3ICs5NTEsNyBAQAogCiAJYjQ0X2hhbHQoYnApOwogCWI0NF9pbml0X3JpbmdzKGJwKTsKLQliNDRfaW5pdF9odyhicCk7CisJYjQ0X2luaXRfaHcoYnAsIDEpOwogCiAJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CiAKQEAgLTEwNTksNyArMTA2OCw3IEBACiAJYjQ0X2hhbHQoYnApOwogCWRldi0+bXR1ID0gbmV3X210dTsKIAliNDRfaW5pdF9yaW5ncyhicCk7Ci0JYjQ0X2luaXRfaHcoYnApOworCWI0NF9pbml0X2h3KGJwLCAxKTsKIAlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKIAogCWI0NF9lbmFibGVfaW50cyhicCk7CkBAIC0xMzU2LDEzICsxMzY1LDE1IEBACiAgKiBwYWNrZXQgcHJvY2Vzc2luZy4gIEludm9rZWQgd2l0aCBicC0+bG9jayBoZWxkLgogICovCiBzdGF0aWMgdm9pZCBfX2I0NF9zZXRfcnhfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLXN0YXRpYyB2b2lkIGI0NF9pbml0X2h3KHN0cnVjdCBiNDQgKmJwKQorc3RhdGljIHZvaWQgYjQ0X2luaXRfaHcoc3RydWN0IGI0NCAqYnAsIGludCBmdWxsX3Jlc2V0KQogewogCXUzMiB2YWw7CiAKIAliNDRfY2hpcF9yZXNldChicCk7Ci0JYjQ0X3BoeV9yZXNldChicCk7Ci0JYjQ0X3NldHVwX3BoeShicCk7CisJaWYgKGZ1bGxfcmVzZXQpIHsKKwkJYjQ0X3BoeV9yZXNldChicCk7CisJCWI0NF9zZXR1cF9waHkoYnApOworCX0KIAogCS8qIEVuYWJsZSBDUkMzMiwgc2V0IHByb3BlciBMRUQgbW9kZXMgYW5kIHBvd2VyIG9uIFBIWSAqLwogCWJ3MzIoYnAsIEI0NF9NQUNfQ1RSTCwgTUFDX0NUUkxfQ1JDMzJfRU5BQiB8IE1BQ19DVFJMX1BIWV9MRURDVFJMKTsKQEAgLTEzNzYsMTYgKzEzODcsMjEgQEAKIAlidzMyKGJwLCBCNDRfVFhNQVhMRU4sIGJwLT5kZXYtPm10dSArIEVUSF9ITEVOICsgOCArIFJYX0hFQURFUl9MRU4pOwogCiAJYnczMihicCwgQjQ0X1RYX1dNQVJLLCA1Nik7IC8qIFhYWCBtYWdpYyAqLwotCWJ3MzIoYnAsIEI0NF9ETUFUWF9DVFJMLCBETUFUWF9DVFJMX0VOQUJMRSk7Ci0JYnczMihicCwgQjQ0X0RNQVRYX0FERFIsIGJwLT50eF9yaW5nX2RtYSArIGJwLT5kbWFfb2Zmc2V0KTsKLQlidzMyKGJwLCBCNDRfRE1BUlhfQ1RSTCwgKERNQVJYX0NUUkxfRU5BQkxFIHwKLQkJCSAgICAgIChicC0+cnhfb2Zmc2V0IDw8IERNQVJYX0NUUkxfUk9TSElGVCkpKTsKLQlidzMyKGJwLCBCNDRfRE1BUlhfQUREUiwgYnAtPnJ4X3JpbmdfZG1hICsgYnAtPmRtYV9vZmZzZXQpOworCWlmIChmdWxsX3Jlc2V0KSB7CisJCWJ3MzIoYnAsIEI0NF9ETUFUWF9DVFJMLCBETUFUWF9DVFJMX0VOQUJMRSk7CisJCWJ3MzIoYnAsIEI0NF9ETUFUWF9BRERSLCBicC0+dHhfcmluZ19kbWEgKyBicC0+ZG1hX29mZnNldCk7CisJCWJ3MzIoYnAsIEI0NF9ETUFSWF9DVFJMLCAoRE1BUlhfQ1RSTF9FTkFCTEUgfAorCQkJCSAgICAgIChicC0+cnhfb2Zmc2V0IDw8IERNQVJYX0NUUkxfUk9TSElGVCkpKTsKKwkJYnczMihicCwgQjQ0X0RNQVJYX0FERFIsIGJwLT5yeF9yaW5nX2RtYSArIGJwLT5kbWFfb2Zmc2V0KTsKIAotCWJ3MzIoYnAsIEI0NF9ETUFSWF9QVFIsIGJwLT5yeF9wZW5kaW5nKTsKLQlicC0+cnhfcHJvZCA9IGJwLT5yeF9wZW5kaW5nOworCQlidzMyKGJwLCBCNDRfRE1BUlhfUFRSLCBicC0+cnhfcGVuZGluZyk7CisJCWJwLT5yeF9wcm9kID0gYnAtPnJ4X3BlbmRpbmc7CiAKLQlidzMyKGJwLCBCNDRfTUlCX0NUUkwsIE1JQl9DVFJMX0NMUl9PTl9SRUFEKTsKKwkJYnczMihicCwgQjQ0X01JQl9DVFJMLCBNSUJfQ1RSTF9DTFJfT05fUkVBRCk7CisJfSBlbHNlIHsKKwkJYnczMihicCwgQjQ0X0RNQVJYX0NUUkwsIChETUFSWF9DVFJMX0VOQUJMRSB8CisJCQkJICAgICAgKGJwLT5yeF9vZmZzZXQgPDwgRE1BUlhfQ1RSTF9ST1NISUZUKSkpOworCX0KIAogCXZhbCA9IGJyMzIoYnAsIEI0NF9FTkVUX0NUUkwpOwogCWJ3MzIoYnAsIEI0NF9FTkVUX0NUUkwsICh2YWwgfCBFTkVUX0NUUkxfRU5BQkxFKSk7CkBAIC0xNDAxLDcgKzE0MTcsNyBAQAogCQlnb3RvIG91dDsKIAogCWI0NF9pbml0X3JpbmdzKGJwKTsKLQliNDRfaW5pdF9odyhicCk7CisJYjQ0X2luaXRfaHcoYnAsIDEpOwogCiAJYjQ0X2NoZWNrX3BoeShicCk7CiAKQEAgLTE0NTAsNiArMTQ2NiwxNDAgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCBid2ZpbHRlcl90YWJsZShzdHJ1Y3QgYjQ0ICpicCwgdTggKnBwLCB1MzIgYnl0ZXMsIHUzMiB0YWJsZV9vZmZzZXQpCit7CisJdTMyIGk7CisJdTMyICpwYXR0ZXJuID0gKHUzMiAqKSBwcDsKKworCWZvciAoaSA9IDA7IGkgPCBieXRlczsgaSArPSBzaXplb2YodTMyKSkgeworCQlidzMyKGJwLCBCNDRfRklMVF9BRERSLCB0YWJsZV9vZmZzZXQgKyBpKTsKKwkJYnczMihicCwgQjQ0X0ZJTFRfREFUQSwgcGF0dGVybltpIC8gc2l6ZW9mKHUzMildKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYjQ0X21hZ2ljX3BhdHRlcm4odTggKm1hY2FkZHIsIHU4ICpwcGF0dGVybiwgdTggKnBtYXNrLCBpbnQgb2Zmc2V0KQoreworCWludCBtYWdpY3N5bmMgPSA2OworCWludCBrLCBqLCBsZW4gPSBvZmZzZXQ7CisJaW50IGV0aGFkZHJfYnl0ZXMgPSBFVEhfQUxFTjsKKworCW1lbXNldChwcGF0dGVybiArIG9mZnNldCwgMHhmZiwgbWFnaWNzeW5jKTsKKwlmb3IgKGogPSAwOyBqIDwgbWFnaWNzeW5jOyBqKyspCisJCXNldF9iaXQobGVuKyssICh1bnNpZ25lZCBsb25nICopIHBtYXNrKTsKKworCWZvciAoaiA9IDA7IGogPCBCNDRfTUFYX1BBVFRFUk5TOyBqKyspIHsKKwkJaWYgKChCNDRfUEFUVEVSTl9TSVpFIC0gbGVuKSA+PSBFVEhfQUxFTikKKwkJCWV0aGFkZHJfYnl0ZXMgPSBFVEhfQUxFTjsKKwkJZWxzZQorCQkJZXRoYWRkcl9ieXRlcyA9IEI0NF9QQVRURVJOX1NJWkUgLSBsZW47CisJCWlmIChldGhhZGRyX2J5dGVzIDw9MCkKKwkJCWJyZWFrOworCQlmb3IgKGsgPSAwOyBrPCBldGhhZGRyX2J5dGVzOyBrKyspIHsKKwkJCXBwYXR0ZXJuW29mZnNldCArIG1hZ2ljc3luYyArCisJCQkJKGogKiBFVEhfQUxFTikgKyBrXSA9IG1hY2FkZHJba107CisJCQlsZW4rKzsKKwkJCXNldF9iaXQobGVuLCAodW5zaWduZWQgbG9uZyAqKSBwbWFzayk7CisJCX0KKwl9CisJcmV0dXJuIGxlbiAtIDE7Cit9CisKKy8qIFNldHVwIG1hZ2ljIHBhY2tldCBwYXR0ZXJucyBpbiB0aGUgYjQ0IFdPTAorICogcGF0dGVybiBtYXRjaGluZyBmaWx0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGI0NF9zZXR1cF9wc2V1ZG9fbWFnaWNwKHN0cnVjdCBiNDQgKmJwKQoreworCisJdTMyIHZhbDsKKwlpbnQgcGxlbjAsIHBsZW4xLCBwbGVuMjsKKwl1OCAqcHdvbF9wYXR0ZXJuOworCXU4IHB3b2xfbWFza1tCNDRfUE1BU0tfU0laRV07CisKKwlwd29sX3BhdHRlcm4gPSBrbWFsbG9jKEI0NF9QQVRURVJOX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcHdvbF9wYXR0ZXJuKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIk1lbW9yeSBub3QgYXZhaWxhYmxlIGZvciBXT0xcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogSXB2NCBtYWdpYyBwYWNrZXQgcGF0dGVybiAtIHBhdHRlcm4gMC4qLworCW1lbXNldChwd29sX3BhdHRlcm4sIDAsIEI0NF9QQVRURVJOX1NJWkUpOworCW1lbXNldChwd29sX21hc2ssIDAsIEI0NF9QTUFTS19TSVpFKTsKKwlwbGVuMCA9IGI0NF9tYWdpY19wYXR0ZXJuKGJwLT5kZXYtPmRldl9hZGRyLCBwd29sX3BhdHRlcm4sIHB3b2xfbWFzaywKKwkJCQkgIEI0NF9FVEhJUFY0VURQX0hMRU4pOworCisgICAJYndmaWx0ZXJfdGFibGUoYnAsIHB3b2xfcGF0dGVybiwgQjQ0X1BBVFRFUk5fU0laRSwgQjQ0X1BBVFRFUk5fQkFTRSk7CisgICAJYndmaWx0ZXJfdGFibGUoYnAsIHB3b2xfbWFzaywgQjQ0X1BNQVNLX1NJWkUsIEI0NF9QTUFTS19CQVNFKTsKKworCS8qIFJhdyBldGhlcm5ldCBJSSBtYWdpYyBwYWNrZXQgcGF0dGVybiAtIHBhdHRlcm4gMSAqLworCW1lbXNldChwd29sX3BhdHRlcm4sIDAsIEI0NF9QQVRURVJOX1NJWkUpOworCW1lbXNldChwd29sX21hc2ssIDAsIEI0NF9QTUFTS19TSVpFKTsKKwlwbGVuMSA9IGI0NF9tYWdpY19wYXR0ZXJuKGJwLT5kZXYtPmRldl9hZGRyLCBwd29sX3BhdHRlcm4sIHB3b2xfbWFzaywKKwkJCQkgIEVUSF9ITEVOKTsKKworICAgCWJ3ZmlsdGVyX3RhYmxlKGJwLCBwd29sX3BhdHRlcm4sIEI0NF9QQVRURVJOX1NJWkUsCisJCSAgICAgICBCNDRfUEFUVEVSTl9CQVNFICsgQjQ0X1BBVFRFUk5fU0laRSk7CisgIAlid2ZpbHRlcl90YWJsZShicCwgcHdvbF9tYXNrLCBCNDRfUE1BU0tfU0laRSwKKwkJICAgICAgIEI0NF9QTUFTS19CQVNFICsgQjQ0X1BNQVNLX1NJWkUpOworCisJLyogSXB2NiBtYWdpYyBwYWNrZXQgcGF0dGVybiAtIHBhdHRlcm4gMiAqLworCW1lbXNldChwd29sX3BhdHRlcm4sIDAsIEI0NF9QQVRURVJOX1NJWkUpOworCW1lbXNldChwd29sX21hc2ssIDAsIEI0NF9QTUFTS19TSVpFKTsKKwlwbGVuMiA9IGI0NF9tYWdpY19wYXR0ZXJuKGJwLT5kZXYtPmRldl9hZGRyLCBwd29sX3BhdHRlcm4sIHB3b2xfbWFzaywKKwkJCQkgIEI0NF9FVEhJUFY2VURQX0hMRU4pOworCisgICAJYndmaWx0ZXJfdGFibGUoYnAsIHB3b2xfcGF0dGVybiwgQjQ0X1BBVFRFUk5fU0laRSwKKwkJICAgICAgIEI0NF9QQVRURVJOX0JBU0UgKyBCNDRfUEFUVEVSTl9TSVpFICsgQjQ0X1BBVFRFUk5fU0laRSk7CisgIAlid2ZpbHRlcl90YWJsZShicCwgcHdvbF9tYXNrLCBCNDRfUE1BU0tfU0laRSwKKwkJICAgICAgIEI0NF9QTUFTS19CQVNFICsgQjQ0X1BNQVNLX1NJWkUgKyBCNDRfUE1BU0tfU0laRSk7CisKKwlrZnJlZShwd29sX3BhdHRlcm4pOworCisJLyogc2V0IHRoZXNlIHBhdHRlcm4ncyBsZW5ndGhzOiBvbmUgbGVzcyB0aGFuIGVhY2ggcmVhbCBsZW5ndGggKi8KKwl2YWwgPSBwbGVuMCB8IChwbGVuMSA8PCA4KSB8IChwbGVuMiA8PCAxNikgfCBXS1VQX0xFTl9FTkFCTEVfVEhSRUU7CisJYnczMihicCwgQjQ0X1dLVVBfTEVOLCB2YWwpOworCisJLyogZW5hYmxlIHdha2V1cCBwYXR0ZXJuIG1hdGNoaW5nICovCisJdmFsID0gYnIzMihicCwgQjQ0X0RFVkNUUkwpOworCWJ3MzIoYnAsIEI0NF9ERVZDVFJMLCB2YWwgfCBERVZDVFJMX1BGRSk7CisKK30KKworc3RhdGljIHZvaWQgYjQ0X3NldHVwX3dvbChzdHJ1Y3QgYjQ0ICpicCkKK3sKKwl1MzIgdmFsOworCXUxNiBwbXZhbDsKKworCWJ3MzIoYnAsIEI0NF9SWENPTkZJRywgUlhDT05GSUdfQUxMTVVMVEkpOworCisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX0IwX0FORExBVEVSKSB7CisKKwkJYnczMihicCwgQjQ0X1dLVVBfTEVOLCBXS1VQX0xFTl9ESVNBQkxFKTsKKworCQl2YWwgPSBicC0+ZGV2LT5kZXZfYWRkclsyXSA8PCAyNCB8CisJCQlicC0+ZGV2LT5kZXZfYWRkclszXSA8PCAxNiB8CisJCQlicC0+ZGV2LT5kZXZfYWRkcls0XSA8PCA4IHwKKwkJCWJwLT5kZXYtPmRldl9hZGRyWzVdOworCQlidzMyKGJwLCBCNDRfQUREUl9MTywgdmFsKTsKKworCQl2YWwgPSBicC0+ZGV2LT5kZXZfYWRkclswXSA8PCA4IHwKKwkJCWJwLT5kZXYtPmRldl9hZGRyWzFdOworCQlidzMyKGJwLCBCNDRfQUREUl9ISSwgdmFsKTsKKworCQl2YWwgPSBicjMyKGJwLCBCNDRfREVWQ1RSTCk7CisJCWJ3MzIoYnAsIEI0NF9ERVZDVFJMLCB2YWwgfCBERVZDVFJMX01QTSB8IERFVkNUUkxfUEZFKTsKKworIAl9IGVsc2UgeworIAkJYjQ0X3NldHVwX3BzZXVkb19tYWdpY3AoYnApOworIAl9CisKKwl2YWwgPSBicjMyKGJwLCBCNDRfU0JUTVNMT1cpOworCWJ3MzIoYnAsIEI0NF9TQlRNU0xPVywgdmFsIHwgU0JUTVNMT1dfUEUpOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoYnAtPnBkZXYsIFNTQl9QTUNTUiwgJnBtdmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQoYnAtPnBkZXYsIFNTQl9QTUNTUiwgcG12YWwgfCBTU0JfUEUpOworCit9CisKIHN0YXRpYyBpbnQgYjQ0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwpAQCAtMTQ3NSw2ICsxNjI1LDExIEBACiAKIAluZXRpZl9wb2xsX2VuYWJsZShkZXYpOwogCisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1dPTF9FTkFCTEUpIHsKKwkJYjQ0X2luaXRfaHcoYnAsIDApOworCQliNDRfc2V0dXBfd29sKGJwKTsKKwl9CisKIAliNDRfZnJlZV9jb25zaXN0ZW50KGJwKTsKIAogCXJldHVybiAwOwpAQCAtMTYyMCw4ICsxNzc1LDYgQEAKIHsKIAlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIC1FQUdBSU47CiAJY21kLT5zdXBwb3J0ZWQgPSAoU1VQUE9SVEVEX0F1dG9uZWcpOwogCWNtZC0+c3VwcG9ydGVkIHw9IChTVVBQT1JURURfMTAwYmFzZVRfSGFsZiB8CiAJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsIHwKQEAgLTE2NDksNiArMTgwMiwxMiBAQAogCQlYQ1ZSX0lOVEVSTkFMIDogWENWUl9FWFRFUk5BTDsKIAljbWQtPmF1dG9uZWcgPSAoYnAtPmZsYWdzICYgQjQ0X0ZMQUdfRk9SQ0VfTElOSykgPwogCQlBVVRPTkVHX0RJU0FCTEUgOiBBVVRPTkVHX0VOQUJMRTsKKwlpZiAoY21kLT5hdXRvbmVnID09IEFVVE9ORUdfRU5BQkxFKQorCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXV0b25lZzsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSl7CisJCWNtZC0+c3BlZWQgPSAwOworCQljbWQtPmR1cGxleCA9IDB4ZmY7CisJfQogCWNtZC0+bWF4dHhwa3QgPSAwOwogCWNtZC0+bWF4cnhwa3QgPSAwOwogCXJldHVybiAwOwpAQCAtMTY1OCw5ICsxODE3LDYgQEAKIHsKIAlzdHJ1Y3QgYjQ0ICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KIAkvKiBXZSBkbyBub3Qgc3VwcG9ydCBnaWdhYml0LiAqLwogCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKIAkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJgpAQCAtMTY3NywyOCArMTgzMywzOSBAQAogCXNwaW5fbG9ja19pcnEoJmJwLT5sb2NrKTsKIAogCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKLQkJYnAtPmZsYWdzICY9IH5CNDRfRkxBR19GT1JDRV9MSU5LOwotCQlicC0+ZmxhZ3MgJj0gfihCNDRfRkxBR19BRFZfMTBIQUxGIHwKKwkJYnAtPmZsYWdzICY9IH4oQjQ0X0ZMQUdfRk9SQ0VfTElOSyB8CisJCQkgICAgICAgQjQ0X0ZMQUdfMTAwX0JBU0VfVCB8CisJCQkgICAgICAgQjQ0X0ZMQUdfRlVMTF9EVVBMRVggfAorCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMEhBTEYgfAogCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMEZVTEwgfAogCQkJICAgICAgIEI0NF9GTEFHX0FEVl8xMDBIQUxGIHwKIAkJCSAgICAgICBCNDRfRkxBR19BRFZfMTAwRlVMTCk7Ci0JCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFXzEwSEFMRikKLQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTBIQUxGOwotCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRV8xMEZVTEwpCi0JCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwRlVMTDsKLQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTAwSEFMRikKLQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTAwSEFMRjsKLQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VfMTAwRlVMTCkKLQkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19BRFZfMTAwRlVMTDsKKwkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgPT0gMCkgeworCQkJYnAtPmZsYWdzIHw9IChCNDRfRkxBR19BRFZfMTBIQUxGIHwKKwkJCQkgICAgICBCNDRfRkxBR19BRFZfMTBGVUxMIHwKKwkJCQkgICAgICBCNDRfRkxBR19BRFZfMTAwSEFMRiB8CisJCQkJICAgICAgQjQ0X0ZMQUdfQURWXzEwMEZVTEwpOworCQl9IGVsc2UgeworCQkJaWYgKGNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKKwkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwSEFMRjsKKwkJCWlmIChjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0FEVl8xMEZVTEw7CisJCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZikKKwkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEhBTEY7CisJCQlpZiAoY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKKwkJCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQURWXzEwMEZVTEw7CisJCX0KIAl9IGVsc2UgewogCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfRk9SQ0VfTElOSzsKKwkJYnAtPmZsYWdzICY9IH4oQjQ0X0ZMQUdfMTAwX0JBU0VfVCB8IEI0NF9GTEFHX0ZVTExfRFVQTEVYKTsKIAkJaWYgKGNtZC0+c3BlZWQgPT0gU1BFRURfMTAwKQogCQkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHXzEwMF9CQVNFX1Q7CiAJCWlmIChjbWQtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKIAkJCWJwLT5mbGFncyB8PSBCNDRfRkxBR19GVUxMX0RVUExFWDsKIAl9CiAKLQliNDRfc2V0dXBfcGh5KGJwKTsKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQliNDRfc2V0dXBfcGh5KGJwKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCkBAIC0xNzM0LDcgKzE5MDEsNyBAQAogCiAJYjQ0X2hhbHQoYnApOwogCWI0NF9pbml0X3JpbmdzKGJwKTsKLQliNDRfaW5pdF9odyhicCk7CisJYjQ0X2luaXRfaHcoYnAsIDEpOwogCW5ldGlmX3dha2VfcXVldWUoYnAtPmRldik7CiAJc3Bpbl91bmxvY2tfaXJxKCZicC0+bG9jayk7CiAKQEAgLTE3NzcsNyArMTk0NCw3IEBACiAJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1BBVVNFX0FVVE8pIHsKIAkJYjQ0X2hhbHQoYnApOwogCQliNDRfaW5pdF9yaW5ncyhicCk7Ci0JCWI0NF9pbml0X2h3KGJwKTsKKwkJYjQ0X2luaXRfaHcoYnAsIDEpOwogCX0gZWxzZSB7CiAJCV9fYjQ0X3NldF9mbG93X2N0cmwoYnAsIGJwLT5mbGFncyk7CiAJfQpAQCAtMTgxOSwxMiArMTk4Niw0MCBAQAogCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogfQogCitzdGF0aWMgdm9pZCBiNDRfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDOworCWlmIChicC0+ZmxhZ3MgJiBCNDRfRkxBR19XT0xfRU5BQkxFKQorCQl3b2wtPndvbG9wdHMgPSBXQUtFX01BR0lDOworCWVsc2UKKwkJd29sLT53b2xvcHRzID0gMDsKKwltZW1zZXQoJndvbC0+c29wYXNzLCAwLCBzaXplb2Yod29sLT5zb3Bhc3MpKTsKK30KKworc3RhdGljIGludCBiNDRfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IGI0NCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3Bpbl9sb2NrX2lycSgmYnAtPmxvY2spOworCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKQorCQlicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfV09MX0VOQUJMRTsKKwllbHNlCisJCWJwLT5mbGFncyAmPSB+QjQ0X0ZMQUdfV09MX0VOQUJMRTsKKwlzcGluX3VubG9ja19pcnEoJmJwLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGI0NF9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8JCT0gYjQ0X2dldF9kcnZpbmZvLAogCS5nZXRfc2V0dGluZ3MJCT0gYjQ0X2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IGI0NF9zZXRfc2V0dGluZ3MsCiAJLm53YXlfcmVzZXQJCT0gYjQ0X253YXlfcmVzZXQsCiAJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF93b2wJCT0gYjQ0X2dldF93b2wsCisJLnNldF93b2wJCT0gYjQ0X3NldF93b2wsCiAJLmdldF9yaW5ncGFyYW0JCT0gYjQ0X2dldF9yaW5ncGFyYW0sCiAJLnNldF9yaW5ncGFyYW0JCT0gYjQ0X3NldF9yaW5ncGFyYW0sCiAJLmdldF9wYXVzZXBhcmFtCQk9IGI0NF9nZXRfcGF1c2VwYXJhbSwKQEAgLTE5MDMsNiArMjA5OCwxMCBAQAogCS8qIFhYWCAtIHJlYWxseSByZXF1aXJlZD8KIAkgICBicC0+ZmxhZ3MgfD0gQjQ0X0ZMQUdfQlVHR1lfVFhQVFI7CiAgICAgICAgICAqLworCisgCWlmIChzc2JfZ2V0X2NvcmVfcmV2KGJwKSA+PSA3KQorIAkJYnAtPmZsYWdzIHw9IEI0NF9GTEFHX0IwX0FORExBVEVSOworCiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIxMDMsNiArMjMwMiwxMCBAQAogCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCiAJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaWYgKGJwLT5mbGFncyAmIEI0NF9GTEFHX1dPTF9FTkFCTEUpIHsKKwkJYjQ0X2luaXRfaHcoYnAsIDApOworCQliNDRfc2V0dXBfd29sKGJwKTsKKwl9CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCXJldHVybiAwOwogfQpAQCAtMjEyNSw3ICsyMzI4LDcgQEAKIAlzcGluX2xvY2tfaXJxKCZicC0+bG9jayk7CiAKIAliNDRfaW5pdF9yaW5ncyhicCk7Ci0JYjQ0X2luaXRfaHcoYnApOworCWI0NF9pbml0X2h3KGJwLCAxKTsKIAluZXRpZl9kZXZpY2VfYXR0YWNoKGJwLT5kZXYpOwogCXNwaW5fdW5sb2NrX2lycSgmYnAtPmxvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9iNDQuaCBiL2RyaXZlcnMvbmV0L2I0NC5oCmluZGV4IGIxNzg2NjIuLjQ5NDQ1MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2I0NC5oCisrKyBiL2RyaXZlcnMvbmV0L2I0NC5oCkBAIC0yNCw2ICsyNCw5IEBACiAjZGVmaW5lICBXS1VQX0xFTl9QM19NQVNLCTB4N2YwMDAwMDAgLyogUGF0dGVybiAzICovCiAjZGVmaW5lICBXS1VQX0xFTl9QM19TSElGVAkyNAogI2RlZmluZSAgV0tVUF9MRU5fRDMJCTB4ODAwMDAwMDAKKyNkZWZpbmUgIFdLVVBfTEVOX0RJU0FCTEUJMHg4MDgwODA4MAorI2RlZmluZSAgV0tVUF9MRU5fRU5BQkxFX1RXTwkweDgwODAwMDAwCisjZGVmaW5lICBXS1VQX0xFTl9FTkFCTEVfVEhSRUUJMHg4MDAwMDAwMAogI2RlZmluZSBCNDRfSVNUQVQJMHgwMDIwVUwgLyogSW50ZXJydXB0IFN0YXR1cyAqLwogI2RlZmluZSAgSVNUQVRfTFMJCTB4MDAwMDAwMjAgLyogTGluayBDaGFuZ2UgKEIwIG9ubHkpICovCiAjZGVmaW5lICBJU1RBVF9QTUUJCTB4MDAwMDAwNDAgLyogUG93ZXIgTWFuYWdlbWVudCBFdmVudCAqLwpAQCAtMjY0LDYgKzI2Nyw4IEBACiAjZGVmaW5lICBTQklESElHSF9WQ19TSElGVAkxNgogCiAvKiBTU0IgUENJIGNvbmZpZyBzcGFjZSByZWdpc3RlcnMuICAqLworI2RlZmluZSBTU0JfUE1DU1IJCTB4NDQKKyNkZWZpbmUgIFNTQl9QRQkJCTB4MTAwCiAjZGVmaW5lCVNTQl9CQVIwX1dJTgkJMHg4MAogI2RlZmluZQlTU0JfQkFSMV9XSU4JCTB4ODQKICNkZWZpbmUJU1NCX1NQUk9NX0NPTlRST0wJMHg4OApAQCAtNDIwLDYgKzQyNSw3IEBACiAKIAl1MzIJCQlkbWFfb2Zmc2V0OwogCXUzMgkJCWZsYWdzOworI2RlZmluZSBCNDRfRkxBR19CMF9BTkRMQVRFUgkweDAwMDAwMDAxCiAjZGVmaW5lIEI0NF9GTEFHX0JVR0dZX1RYUFRSCTB4MDAwMDAwMDIKICNkZWZpbmUgQjQ0X0ZMQUdfUkVPUkRFUl9CVUcJMHgwMDAwMDAwNAogI2RlZmluZSBCNDRfRkxBR19QQVVTRV9BVVRPCTB4MDAwMDgwMDAKQEAgLTQzNSw2ICs0NDEsNyBAQAogI2RlZmluZSBCNDRfRkxBR19JTlRFUk5BTF9QSFkJMHgxMDAwMDAwMAogI2RlZmluZSBCNDRfRkxBR19SWF9SSU5HX0hBQ0sJMHgyMDAwMDAwMAogI2RlZmluZSBCNDRfRkxBR19UWF9SSU5HX0hBQ0sJMHg0MDAwMDAwMAorI2RlZmluZSBCNDRfRkxBR19XT0xfRU5BQkxFCTB4ODAwMDAwMDAKIAogCXUzMgkJCXJ4X29mZnNldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm54Mi5jIGIvZHJpdmVycy9uZXQvYm54Mi5jCmluZGV4IDcwMmQ1NDYuLjc2MzU3MzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ibngyLmMKQEAgLTE2NDAsNyArMTY0MCw3IEBACiAJCXNrYiA9IHR4X2J1Zi0+c2tiOwogI2lmZGVmIEJDTV9UU08gCiAJCS8qIHBhcnRpYWwgQkQgY29tcGxldGlvbnMgcG9zc2libGUgd2l0aCBUU08gcGFja2V0cyAqLwotCQlpZiAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgeworCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQkJdTE2IGxhc3RfaWR4LCBsYXN0X3JpbmdfaWR4OwogCiAJCQlsYXN0X2lkeCA9IHN3X2NvbnMgKwpAQCAtNDQyOCw3ICs0NDI4LDcgQEAKIAkJCShUWF9CRF9GTEFHU19WTEFOX1RBRyB8ICh2bGFuX3R4X3RhZ19nZXQoc2tiKSA8PCAxNikpOwogCX0KICNpZmRlZiBCQ01fVFNPIAotCWlmICgobXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgJiYKKwlpZiAoKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICYmCiAJCShza2ItPmxlbiA+IChicC0+ZGV2LT5tdHUgKyBFVEhfSExFTikpKSB7CiAJCXUzMiB0Y3Bfb3B0X2xlbiwgaXBfdGNwX2xlbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2Fzc2luaS5jIGIvZHJpdmVycy9uZXQvY2Fzc2luaS5jCmluZGV4IDM5ZjM2YWEuLjU2NWE1NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9jYXNzaW5pLmMKQEAgLTI5MTUsOCArMjkxNSw3IEBACiAJICovCiAJc3RhdGljIGludCByaW5nOyAKIAotCXNrYiA9IHNrYl9wYWR0byhza2IsIGNwLT5taW5fZnJhbWVfc2l6ZSk7Ci0JaWYgKCFza2IpCisJaWYgKHNrYl9wYWR0byhza2IsIGNwLT5taW5fZnJhbWVfc2l6ZSkpCiAJCXJldHVybiAwOwogCiAJLyogWFhYOiB3ZSBuZWVkIHNvbWUgaGlnaGVyLWxldmVsIFFvUyBob29rcyB0byBzdGVlciBwYWNrZXRzIHRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jIGIvZHJpdmVycy9uZXQvY2hlbHNpby9zZ2UuYwppbmRleCA0MzkxYmY0Li41M2VmZmY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jaGVsc2lvL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2NoZWxzaW8vc2dlLmMKQEAgLTE0MTgsNyArMTQxOCw3IEBACiAJc3RydWN0IGNwbF90eF9wa3QgKmNwbDsKIAogI2lmZGVmIE5FVElGX0ZfVFNPCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpIHsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQlpbnQgZXRoX3R5cGU7CiAJCXN0cnVjdCBjcGxfdHhfcGt0X2xzbyAqaGRyOwogCkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogCQloZHItPmlwX2hkcl93b3JkcyA9IHNrYi0+bmguaXBoLT5paGw7CiAJCWhkci0+dGNwX2hkcl93b3JkcyA9IHNrYi0+aC50aC0+ZG9mZjsKIAkJaGRyLT5ldGhfdHlwZV9tc3MgPSBodG9ucyhNS19FVEhfVFlQRV9NU1MoZXRoX3R5cGUsCi0JCQkJCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSk7CisJCQkJCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSk7CiAJCWhkci0+bGVuID0gaHRvbmwoc2tiLT5sZW4gLSBzaXplb2YoKmhkcikpOwogCQljcGwgPSAoc3RydWN0IGNwbF90eF9wa3QgKiloZHI7CiAJCXNnZS0+c3RhdHMudHhfbHNvX3BrdHMrKzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMgYi9kcml2ZXJzL25ldC9kZWNsYW5jZS5jCmluZGV4IGYxMzBiZGEuLmQzZDk1OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RlY2xhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvZGVjbGFuY2UuYwpAQCAtODg1LDggKzg4NSw3IEBACiAJbGVuID0gc2tibGVuOwogCQogCWlmIChsZW4gPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCXJldHVybiAwOwogCQlsZW4gPSBFVEhfWkxFTjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kZXBjYS5jIGIvZHJpdmVycy9uZXQvZGVwY2EuYwppbmRleCAwOTQxZDQwLi5lOTQ2YzQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZGVwY2EuYworKysgYi9kcml2ZXJzL25ldC9kZXBjYS5jCkBAIC05MzgsMTEgKzkzOCw4IEBACiAJaWYgKHNrYi0+bGVuIDwgMSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKLQkJCWdvdG8gb3V0OwotCX0KKwlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQorCQlnb3RvIG91dDsKIAkKIAluZXRpZl9zdG9wX3F1ZXVlKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYyBiL2RyaXZlcnMvbmV0L2UxMDAwL2UxMDAwX21haW4uYwppbmRleCBhMzczY2NiLi4zMmI3ZDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lMTAwMC9lMTAwMF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZTEwMDAvZTEwMDBfbWFpbi5jCkBAIC0yMzk0LDcgKzIzOTQsNyBAQAogCXVpbnQ4X3QgaXBjc3MsIGlwY3NvLCB0dWNzcywgdHVjc28sIGhkcl9sZW47CiAJaW50IGVycjsKIAotCWlmIChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSB7CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikpIHsKIAkJCWVyciA9IHBza2JfZXhwYW5kX2hlYWQoc2tiLCAwLCAwLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChlcnIpCkBAIC0yNDAyLDcgKzI0MDIsNyBAQAogCQl9CiAKIAkJaGRyX2xlbiA9ICgoc2tiLT5oLnJhdyAtIHNrYi0+ZGF0YSkgKyAoc2tiLT5oLnRoLT5kb2ZmIDw8IDIpKTsKLQkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkJbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7CiAJCQlza2ItPm5oLmlwaC0+Y2hlY2sgPSAwOwpAQCAtMjUxOSw3ICsyNTE5LDcgQEAKIAkJICogdHNvIGdldHMgd3JpdHRlbiBiYWNrIHByZW1hdHVyZWx5IGJlZm9yZSB0aGUgZGF0YSBpcyBmdWxseQogCQkgKiBETUEnZCB0byB0aGUgY29udHJvbGxlciAqLwogCQlpZiAoIXNrYi0+ZGF0YV9sZW4gJiYgdHhfcmluZy0+bGFzdF90eF90c28gJiYKLQkJICAgICFza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSB7CisJCSAgICAhc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQkJdHhfcmluZy0+bGFzdF90eF90c28gPSAwOwogCQkJc2l6ZSAtPSA0OwogCQl9CkBAIC0yNzU3LDcgKzI3NTcsNyBAQAogCX0KIAogI2lmZGVmIE5FVElGX0ZfVFNPCi0JbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCS8qIFRoZSBjb250cm9sbGVyIGRvZXMgYSBzaW1wbGUgY2FsY3VsYXRpb24gdG8KIAkgKiBtYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gdGhlIEZJRk8gYmVmb3JlCiAJICogaW5pdGlhdGluZyB0aGUgRE1BIGZvciBlYWNoIGJ1ZmZlci4gIFRoZSBjYWxjIGlzOgpAQCAtMjgwNyw3ICsyODA3LDcgQEAKICNpZmRlZiBORVRJRl9GX1RTTwogCS8qIENvbnRyb2xsZXIgRXJyYXR1bSB3b3JrYXJvdW5kICovCiAJaWYgKCFza2ItPmRhdGFfbGVuICYmIHR4X3JpbmctPmxhc3RfdHhfdHNvICYmCi0JICAgICFza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKQorCSAgICAhc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKIAkJY291bnQrKzsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9lZXByby5jIGIvZHJpdmVycy9uZXQvZWVwcm8uYwppbmRleCBhODA2ZGZlLi5lNzBmMTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lZXByby5jCisrKyBiL2RyaXZlcnMvbmV0L2VlcHJvLmMKQEAgLTExNTQsOCArMTE1NCw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICAiJXM6IGVudGVyaW5nIGVlcHJvX3NlbmRfcGFja2V0IHJvdXRpbmUuXG4iLCBkZXYtPm5hbWUpOwogCiAJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7Ci0JCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQorCQlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogCQkJcmV0dXJuIDA7CiAJCWxlbmd0aCA9IEVUSF9aTEVOOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMgYi9kcml2ZXJzL25ldC9lZXhwcmVzcy5jCmluZGV4IDgyYmQzNTYuLmE3NGIyMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2VleHByZXNzLmMKKysrIGIvZHJpdmVycy9uZXQvZWV4cHJlc3MuYwpAQCAtNjc3LDggKzY3Nyw3IEBACiAjZW5kaWYKIAogCWlmIChidWYtPmxlbiA8IEVUSF9aTEVOKSB7Ci0JCWJ1ZiA9IHNrYl9wYWR0byhidWYsIEVUSF9aTEVOKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQlpZiAoc2tiX3BhZHRvKGJ1ZiwgRVRIX1pMRU4pKQogCQkJcmV0dXJuIDA7CiAJCWxlbmd0aCA9IEVUSF9aTEVOOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2VwaWMxMDAuYwppbmRleCA4ZDY4MGNlLi43MjRkN2RjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9lcGljMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXBpYzEwMC5jCkBAIC0xMDI3LDExICsxMDI3LDggQEAKIAl1MzIgY3RybF93b3JkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KKwlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQorCQlyZXR1cm4gMDsKIAogCS8qIENhdXRpb246IHRoZSB3cml0ZSBvcmRlciBpcyBpbXBvcnRhbnQgaGVyZSwgc2V0IHRoZSBmaWVsZCB3aXRoIHRoZQogCSAgICJvd25lcnNoaXAiIGJpdCBsYXN0LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoMTZpLmMgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwppbmRleCBiNjc1NDViLi40YmY3NmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGgxNmkuYworKysgYi9kcml2ZXJzL25ldC9ldGgxNmkuYwpAQCAtMTA2NCw4ICsxMDY0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGxlbmd0aCA8IEVUSF9aTEVOKSB7Ci0JCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQorCQlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogCQkJcmV0dXJuIDA7CiAJCWxlbmd0aCA9IEVUSF9aTEVOOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2ZvcmNlZGV0aC5jIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKaW5kZXggNjJiMzhhNC4uMjFiZTRmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZm9yY2VkZXRoLmMKQEAgLTE0OTUsOCArMTQ5NSw4IEBACiAJbnAtPnR4X3NrYnVmZltucl0gPSBza2I7CiAKICNpZmRlZiBORVRJRl9GX1RTTwotCWlmIChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKQotCQl0eF9mbGFnc19leHRyYSA9IE5WX1RYMl9UU08gfCAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA8PCBOVl9UWDJfVFNPX1NISUZUKTsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKKwkJdHhfZmxhZ3NfZXh0cmEgPSBOVl9UWDJfVFNPIHwgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPDwgTlZfVFgyX1RTT19TSElGVCk7CiAJZWxzZQogI2VuZGlmCiAJdHhfZmxhZ3NfZXh0cmEgPSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcgPyAoTlZfVFgyX0NIRUNLU1VNX0wzfE5WX1RYMl9DSEVDS1NVTV9MNCkgOiAwKTsKQEAgLTIwNzYsNyArMjA3Niw3IEBACiAJc3Bpbl91bmxvY2tfaXJxKCZucC0+bG9jayk7CiB9CiAKLXZvaWQgbnZfdXBkYXRlX3BhdXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBwYXVzZV9mbGFncykKK3N0YXRpYyB2b2lkIG52X3VwZGF0ZV9wYXVzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcGF1c2VfZmxhZ3MpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHAxMDAuYyBiL2RyaXZlcnMvbmV0L2hwMTAwLmMKaW5kZXggMjQ3YzhjYS4uZGQxZGMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHAxMDAuYworKysgYi9kcml2ZXJzL25ldC9ocDEwMC5jCkBAIC0xNDg3LDExICsxNDg3LDggQEAKIAlpZiAoc2tiLT5sZW4gPD0gMCkKIAkJcmV0dXJuIDA7CiAJCQotCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOICYmIGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEpIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQl9CisJaWYgKGxwLT5jaGlwID09IEhQMTAwX0NISVBJRF9TSEFTVEEgJiYgc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQorCQlyZXR1cm4gMDsKIAogCS8qIEdldCBUeCByaW5nIHRhaWwgcG9pbnRlciAqLwogCWlmIChscC0+dHhydGFpbC0+bmV4dCA9PSBscC0+dHhyaGVhZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtdmV0aC5jIGIvZHJpdmVycy9uZXQvaWJtdmV0aC5jCmluZGV4IDY2NjM0NmYuLjRjMmU3MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9pYm12ZXRoLmMKQEAgLTYxLDcgKzYxLDcgQEAKICN1bmRlZiBERUJVRwogCiAjZGVmaW5lIGlibXZldGhfcHJpbnRrKGZtdCwgYXJncy4uLikgXAotICBwcmludGsoS0VSTl9JTkZPICIlczogIiBmbXQsIF9fRklMRV9fLCAjIyBhcmdzKQorICBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZJTEVfXywgIyMgYXJncykKIAogI2RlZmluZSBpYm12ZXRoX2Vycm9yX3ByaW50ayhmbXQsIGFyZ3MuLi4pIFwKICAgcHJpbnRrKEtFUk5fRVJSICIoJXM6JTMuM2QgdWE6JXgpIEVSUk9SOiAiIGZtdCwgX19GSUxFX18sIF9fTElORV9fICwgYWRhcHRlci0+dmRldi0+dW5pdF9hZGRyZXNzLCAjIyBhcmdzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYyBiL2RyaXZlcnMvbmV0L2lvYzMtZXRoLmMKaW5kZXggYWU3MWVkNS4uZTc2ZTZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaW9jMy1ldGguYworKysgYi9kcml2ZXJzL25ldC9pb2MzLWV0aC5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBpb2MzX21hcCh2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgdmRldikKIHsKICNpZmRlZiBDT05GSUdfU0dJX0lQMjcKLQl2ZGV2IDw8PSA1ODsgICAvKiBTaGlmdCB0byBQQ0k2NF9BVFRSX1ZJUlRVQUwgKi8KKwl2ZGV2IDw8PSA1NzsgICAvKiBTaGlmdCB0byBQQ0k2NF9BVFRSX1ZJUlRVQUwgKi8KIAogCXJldHVybiB2ZGV2IHwgKDB4YVVMIDw8IFBDSTY0X0FUVFJfVEFSR19TSEZUKSB8IFBDSTY0X0FUVFJfUFJFRiB8CiAJICAgICAgICgodW5zaWduZWQgbG9uZylwdHIgJiBUT19QSFlTX01BU0spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jIGIvZHJpdmVycy9uZXQvaXJkYS9pcmRhLXVzYi5jCmluZGV4IDg0NGZhNzQuLjJhMGQ1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvaXJkYS11c2IuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2lyZGEtdXNiLmMKQEAgLTExMDUsNyArMTEwNSw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICAvKiBXZSBnZXQgYSBwYXRjaCBmcm9tIHVzZXJzcGFjZSAqLwotICAgICAgICBJUkRBX01FU1NBR0UoIiVzKCk6IFJlY2VpdmVkIGZpcm13YXJlICVzICgldSBieXRlcylcbiIsCisgICAgICAgIElSREFfTUVTU0FHRSgiJXMoKTogUmVjZWl2ZWQgZmlybXdhcmUgJXMgKCV6dSBieXRlcylcbiIsCiAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0aXI0MjF4X2Z3X25hbWUsIGZ3LT5zaXplKTsKIAogICAgICAgICByZXQgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXNlcmllc192ZXRoLmMgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwppbmRleCBmMGYwNGJlLi45MzM5NGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9pc2VyaWVzX3ZldGguYwpAQCAtNjksNiArNjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9hYnNfYWRkci5oPgogI2luY2x1ZGUgPGFzbS9pc2VyaWVzL21mLmg+CkBAIC0xMDM1LDExICsxMDM2LDIyIEBACiAJLmdldF9saW5rID0gdmV0aF9nZXRfbGluaywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB2ZXRoX3Byb2JlX29uZShpbnQgdmxhbiwgc3RydWN0IGRldmljZSAqdmRldikKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqIF9faW5pdCB2ZXRoX3Byb2JlX29uZShpbnQgdmxhbiwKKwkJc3RydWN0IHZpb19kZXYgKnZpb19kZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0OworCXN0cnVjdCBkZXZpY2UgKnZkZXYgPSAmdmlvX2Rldi0+ZGV2OwogCWludCBpLCByYzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICptYWNfYWRkcjsKKworCW1hY19hZGRyID0gdmlvX2dldF9hdHRyaWJ1dGUodmlvX2RldiwgImxvY2FsLW1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKG1hY19hZGRyID09IE5VTEwpCisJCW1hY19hZGRyID0gdmlvX2dldF9hdHRyaWJ1dGUodmlvX2RldiwgIm1hYy1hZGRyZXNzIiwgTlVMTCk7CisJaWYgKG1hY19hZGRyID09IE5VTEwpIHsKKwkJdmV0aF9lcnJvcigiVW5hYmxlIHRvIGZldGNoIE1BQyBhZGRyZXNzIGZyb20gZGV2aWNlIHRyZWUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCiAJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mIChzdHJ1Y3QgdmV0aF9wb3J0KSk7CiAJaWYgKCEgZGV2KSB7CkBAIC0xMDY0LDE2ICsxMDc2LDExIEBACiAJfQogCXBvcnQtPmRldiA9IHZkZXY7CiAKLQlkZXYtPmRldl9hZGRyWzBdID0gMHgwMjsKLQlkZXYtPmRldl9hZGRyWzFdID0gMHgwMTsKLQlkZXYtPmRldl9hZGRyWzJdID0gMHhmZjsKLQlkZXYtPmRldl9hZGRyWzNdID0gdmxhbjsKLQlkZXYtPmRldl9hZGRyWzRdID0gMHhmZjsKLQlkZXYtPmRldl9hZGRyWzVdID0gdGhpc19scDsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWRldi0+bXR1ID0gVkVUSF9NQVhfTVRVOwogCi0JbWVtY3B5KCZwb3J0LT5tYWNfYWRkciwgZGV2LT5kZXZfYWRkciwgNik7CisJbWVtY3B5KCZwb3J0LT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWRldi0+b3BlbiA9IHZldGhfb3BlbjsKIAlkZXYtPmhhcmRfc3RhcnRfeG1pdCA9IHZldGhfc3RhcnRfeG1pdDsKQEAgLTE2MDgsNyArMTYxNSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgdmV0aF9wb3J0ICpwb3J0OwogCi0JZGV2ID0gdmV0aF9wcm9iZV9vbmUoaSwgJnZkZXYtPmRldik7CisJZGV2ID0gdmV0aF9wcm9iZV9vbmUoaSwgdmRldik7CiAJaWYgKGRldiA9PSBOVUxMKSB7CiAJCXZldGhfcmVtb3ZlKHZkZXYpOwogCQlyZXR1cm4gMTsKQEAgLTE2NDEsNyArMTY0OCw3IEBACiAgKiBzdXBwb3J0LgogICovCiBzdGF0aWMgc3RydWN0IHZpb19kZXZpY2VfaWQgdmV0aF9kZXZpY2VfdGFibGVbXSBfX2RldmluaXRkYXRhID0gewotCXsgInZsYW4iLCAiIiB9LAorCXsgIm5ldHdvcmsiLCAiSUJNLGlTZXJpZXMtbC1sYW4iIH0sCiAJeyAiIiwgIiIgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUodmlvLCB2ZXRoX2RldmljZV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvaXhnYi9peGdiX21haW4uYwppbmRleCA1NzAwNmZiLi44YmIzMmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2l4Z2IvaXhnYl9tYWluLmMKQEAgLTExNzMsNyArMTE3Myw3IEBACiAJdWludDE2X3QgaXBjc2UsIHR1Y3NlLCBtc3M7CiAJaW50IGVycjsKIAotCWlmKGxpa2VseShza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSkgeworCWlmKGxpa2VseShza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKSkgewogCQlpZiAoc2tiX2hlYWRlcl9jbG9uZWQoc2tiKSkgewogCQkJZXJyID0gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGVycikKQEAgLTExODEsNyArMTE4MSw3IEBACiAJCX0KIAogCQloZHJfbGVuID0gKChza2ItPmgucmF3IC0gc2tiLT5kYXRhKSArIChza2ItPmgudGgtPmRvZmYgPDwgMikpOwotCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCQlza2ItPm5oLmlwaC0+dG90X2xlbiA9IDA7CiAJCXNrYi0+bmguaXBoLT5jaGVjayA9IDA7CiAJCXNrYi0+aC50aC0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoc2tiLT5uaC5pcGgtPnNhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbGFuY2UuYyBiL2RyaXZlcnMvbmV0L2xhbmNlLmMKaW5kZXggYmI1YWQ0Ny4uYzFjMzQ1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9sYW5jZS5jCkBAIC05NjgsOCArOTY4LDcgQEAKIAkvKiBUaGUgb2xkIExBTkNFIGNoaXBzIGRvZXNuJ3QgYXV0b21hdGljYWxseSBwYWQgYnVmZmVycyB0byBtaW4uIHNpemUuICovCiAJaWYgKGNoaXBfdGFibGVbbHAtPmNoaXBfdmVyc2lvbl0uZmxhZ3MgJiBMQU5DRV9NVVNUX1BBRCkgewogCQlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCQlnb3RvIG91dDsKIAkJCWxwLT50eF9yaW5nW2VudHJ5XS5sZW5ndGggPSAtRVRIX1pMRU47CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYyBiL2RyaXZlcnMvbmV0L2xhc2lfODI1OTYuYwppbmRleCA5NTc4ODhkLi4xYWIwOTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sYXNpXzgyNTk2LmMKKysrIGIvZHJpdmVycy9uZXQvbGFzaV84MjU5Ni5jCkBAIC0xMDgzLDggKzEwODMsNyBAQAogCQkJCXNrYi0+bGVuLCBza2ItPmRhdGEpKTsKIAogCWlmIChsZW5ndGggPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCXJldHVybiAwOwogCQlsZW5ndGggPSBFVEhfWkxFTjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9sb29wYmFjay5jIGIvZHJpdmVycy9uZXQvbG9vcGJhY2suYwppbmRleCBiNzlkNmU4Li40M2ZlZjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9sb29wYmFjay5jCisrKyBiL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IHNrYi0+bmguaXBoOwogCXN0cnVjdCB0Y3BoZHIgKnRoID0gKHN0cnVjdCB0Y3BoZHIqKShza2ItPm5oLnJhdyArIChpcGgtPmlobCAqIDQpKTsKIAl1bnNpZ25lZCBpbnQgZG9mZnNldCA9IChpcGgtPmlobCArIHRoLT5kb2ZmKSAqIDQ7Ci0JdW5zaWduZWQgaW50IG10dSA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgKyBkb2Zmc2V0OworCXVuc2lnbmVkIGludCBtdHUgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICsgZG9mZnNldDsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKIAl1MzIgc2VxID0gbnRvaGwodGgtPnNlcSk7CiAJdTE2IGlkICA9IG50b2hzKGlwaC0+aWQpOwpAQCAtMTM5LDcgKzEzOSw3IEBACiAjZW5kaWYKIAogI2lmZGVmIExPT1BCQUNLX1RTTwotCWlmIChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSB7CisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHsKIAkJQlVHX09OKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfSVApKTsKIAkJQlVHX09OKHNrYi0+bmguaXBoLT5wcm90b2NvbCAhPSBJUFBST1RPX1RDUCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xwNDg2ZS5jIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKaW5kZXggOTRkNWVhMS4uYmYzZjM0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbHA0ODZlLmMKKysrIGIvZHJpdmVycy9uZXQvbHA0ODZlLmMKQEAgLTg3Nyw4ICs4NzcsNyBAQAogCWxlbmd0aCA9IHNrYi0+bGVuOwogCQogCWlmIChsZW5ndGggPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCXJldHVybiAwOwogCQlsZW5ndGggPSBFVEhfWkxFTjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvbXlyaTEwZ2UvbXlyaTEwZ2UuYwppbmRleCBlMWZlYjU4Li5kYmRmMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpMTBnZS9teXJpMTBnZS5jCisrKyBiL2RyaXZlcnMvbmV0L215cmkxMGdlL215cmkxMGdlLmMKQEAgLTE4NzksNyArMTg3OSw3IEBACiAKICNpZmRlZiBORVRJRl9GX1RTTwogCWlmIChza2ItPmxlbiA+IChkZXYtPm10dSArIEVUSF9ITEVOKSkgewotCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCQlpZiAobXNzICE9IDApCiAJCQltYXhfc2VnbWVudHMgPSBNWVJJMTBHRV9NQVhfU0VORF9ERVNDX1RTTzsKIAl9CkBAIC0xOTM5LDggKzE5MzksNyBAQAogCiAJCS8qIHBhZCBmcmFtZXMgdG8gYXQgbGVhc3QgRVRIX1pMRU4gYnl0ZXMgKi8KIAkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX1pMRU4pKSB7Ci0JCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpIHsKIAkJCQkvKiBUaGUgcGFja2V0IGlzIGdvbmUsIHNvIHdlIG11c3QKIAkJCQkgKiByZXR1cm4gMCAqLwogCQkJCW1ncC0+c3RhdHMudHhfZHJvcHBlZCArPSAxOwpAQCAtMjExMywxNCArMjExMiwxNCBAQAogCQl9CiAJCWlkeCA9IChpZHggKyAxKSAmIHR4LT5tYXNrOwogCX0gd2hpbGUgKGlkeCAhPSBsYXN0X2lkeCk7Ci0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpIHsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgewogCQlwcmludGsoS0VSTl9FUlIKIAkJICAgICAgICJteXJpMTBnZTogJXM6IFRTTyBidXQgd2FudGVkIHRvIGxpbmVhcml6ZT8hPyE/XG4iLAogCQkgICAgICAgbWdwLT5kZXYtPm5hbWUpOwogCQlnb3RvIGRyb3A7CiAJfQogCi0JaWYgKHNrYl9saW5lYXJpemUoc2tiLCBHRlBfQVRPTUlDKSkKKwlpZiAoc2tiX2xpbmVhcml6ZShza2IpKQogCQlnb3RvIGRyb3A7CiAKIAltZ3AtPnR4X2xpbmVhcml6ZWQrKzsKQEAgLTIyNTEsMTIgKzIyNTAsNiBAQAogCX0KIAogCWNhcCA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGJyaWRnZSwgUENJX0VYVF9DQVBfSURfRVJSKTsKLQkvKiBudmlkaWEgZXh0IGNhcCBpcyBub3QgYWx3YXlzIGxpbmtlZCBpbiBleHQgY2FwIGNoYWluICovCi0JaWYgKCFjYXAKLQkgICAgJiYgYnJpZGdlLT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9OVklESUEKLQkgICAgJiYgYnJpZGdlLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX0NLODA0X1BDSUUpCi0JCWNhcCA9IDB4MTYwOwotCiAJaWYgKCFjYXApCiAJCXJldHVybjsKIApAQCAtMjczMiw4ICsyNzI1LDYgQEAKIAkvKiBTYXZlIGNvbmZpZ3VyYXRpb24gc3BhY2UgdG8gYmUgcmVzdG9yZWQgaWYgdGhlCiAJICogbmljIHJlc2V0cyBkdWUgdG8gYSBwYXJpdHkgZXJyb3IgKi8KIAlteXJpMTBnZV9zYXZlX3N0YXRlKG1ncCk7Ci0JLyogUmVzdG9yZSBzdGF0ZSBpbW1lZGlhdGVseSBzaW5jZSBwY2lfc2F2ZV9tc2lfc3RhdGUgZGlzYWJsZXMgTVNJICovCi0JbXlyaTEwZ2VfcmVzdG9yZV9zdGF0ZShtZ3ApOwogCiAJLyogU2V0dXAgdGhlIHdhdGNoZG9nIHRpbWVyICovCiAJc2V0dXBfdGltZXIoJm1ncC0+d2F0Y2hkb2dfdGltZXIsIG15cmkxMGdlX3dhdGNoZG9nX3RpbWVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmMgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwppbmRleCA2Yzg2ZGNhLi5kOWY2MTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9teXJpX3NidXMuYworKysgYi9kcml2ZXJzL25ldC9teXJpX3NidXMuYwpAQCAtMSwxMCArMSwxMCBAQAotLyogbXlyaV9zYnVzLmg6IE15cmlDT00gTXlyaU5FVCBTQlVTIGNhcmQgZHJpdmVyLgorLyogbXlyaV9zYnVzLmM6IE15cmlDT00gTXlyaU5FVCBTQlVTIGNhcmQgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTksIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9Ci0gICAgICAgICJteXJpX3NidXMuYzp2MS45IDEyL1NlcC85OSBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pXG4iOworICAgICAgICAibXlyaV9zYnVzLmM6djIuMCBKdW5lIDIzLCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldClcbiI7CiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KQEAgLTgxLDEwICs4MSw2IEBACiAjZGVmaW5lIERIRFIoeCkKICNlbmRpZgogCi0jaWZkZWYgTU9EVUxFCi1zdGF0aWMgc3RydWN0IG15cmlfZXRoICpyb290X215cmlfZGV2OwotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIG15cmlfcmVzZXRfb2ZmKHZvaWQgX19pb21lbSAqbHAsIHZvaWQgX19pb21lbSAqY3JlZ3MpCiB7CiAJLyogQ2xlYXIgSVJRIG1hc2suICovCkBAIC04OTYsOCArODkyLDkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50IF9faW5pdCBteXJpX2V0aGVyX2luaXQoc3RydWN0IHNidXNfZGV2ICpzZGV2LCBpbnQgbnVtKQorc3RhdGljIGludCBfX2luaXQgbXlyaV9ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKIHsKKwlzdGF0aWMgaW50IG51bTsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IG15cmlfZXRoICptcDsKQEAgLTkxMyw2ICs5MTAsOSBAQAogCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQogCQlwcmludGsodmVyc2lvbik7CiAKKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmc2Rldi0+b2ZkZXYuZGV2KTsKKwogCW1wID0gKHN0cnVjdCBteXJpX2V0aCAqKSBkZXYtPnByaXY7CiAJc3Bpbl9sb2NrX2luaXQoJm1wLT5pcnFfbG9jayk7CiAJbXAtPm15cmlfc2RldiA9IHNkZXY7CkBAIC0xMDkyLDEwICsxMDkyLDkgQEAKIAkJZ290byBlcnJfZnJlZV9pcnE7CiAJfQogCi0jaWZkZWYgTU9EVUxFCi0JbXAtPm5leHRfbW9kdWxlID0gcm9vdF9teXJpX2RldjsKLQlyb290X215cmlfZGV2ID0gbXA7Ci0jZW5kaWYKKwlkZXZfc2V0X2RydmRhdGEoJnNkZXYtPm9mZGV2LmRldiwgbXApOworCisJbnVtKys7CiAKIAlwcmludGsoIiVzOiBNeXJpQ09NIE15cmlORVQgRXRoZXJuZXQgIiwgZGV2LT5uYW1lKTsKIApAQCAtMTExNCw2MSArMTExMyw2OCBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBteXJpX3NidXNfbWF0Y2goc3RydWN0IHNidXNfZGV2ICpzZGV2KQotewotCWNoYXIgKm5hbWUgPSBzZGV2LT5wcm9tX25hbWU7CiAKLQlpZiAoIXN0cmNtcChuYW1lLCAiTVlSSUNPTSxtbGFuYWkiKSB8fAotCSAgICAhc3RyY21wKG5hbWUsICJteXJpIikpCi0JCXJldHVybiAxOworc3RhdGljIGludCBfX2RldmluaXQgbXlyaV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKKworCXJldHVybiBteXJpX2V0aGVyX2luaXQoc2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG15cmlfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBteXJpX2V0aCAqbXAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IG1wLT5kZXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZShuZXRfZGV2KTsKKworCWZyZWVfaXJxKG5ldF9kZXYtPmlycSwgbmV0X2Rldik7CisKKwlpZiAobXAtPmVlcHJvbS5jcHV2ZXJzIDwgQ1BVVkVSU180XzApIHsKKwkJc2J1c19pb3VubWFwKG1wLT5yZWdzLCBtcC0+cmVnX3NpemUpOworCX0gZWxzZSB7CisJCXNidXNfaW91bm1hcChtcC0+Y3JlZ3MsIFBBR0VfU0laRSk7CisJCXNidXNfaW91bm1hcChtcC0+bHJlZ3MsICgyNTYgKiAxMDI0KSk7CisJCXNidXNfaW91bm1hcChtcC0+bGFuYWksICg1MTIgKiAxMDI0KSk7CisJfQorCisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBteXJpX3NidXNfcHJvYmUodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG15cmlfc2J1c19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiTVlSSUNPTSxtbGFuYWkiLAorCX0sCisJeworCQkubmFtZSA9ICJteXJpIiwKKwl9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXlyaV9zYnVzX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgbXlyaV9zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibXlyaSIsCisJLm1hdGNoX3RhYmxlCT0gbXlyaV9zYnVzX21hdGNoLAorCS5wcm9iZQkJPSBteXJpX3NidXNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChteXJpX3NidXNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG15cmlfc2J1c19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHNidXNfYnVzICpidXM7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gTlVMTDsKLQlzdGF0aWMgaW50IGNhbGxlZDsKLQlpbnQgY2FyZHMgPSAwLCB2OwotCi0jaWZkZWYgTU9EVUxFCi0Jcm9vdF9teXJpX2RldiA9IE5VTEw7Ci0jZW5kaWYKLQotCWlmIChjYWxsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCWNhbGxlZCsrOwotCi0JZm9yX2VhY2hfc2J1cyhidXMpIHsKLQkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBidXMpIHsKLQkJCWlmIChteXJpX3NidXNfbWF0Y2goc2RldikpIHsKLQkJCQljYXJkcysrOwotCQkJCURFVCgoIkZvdW5kIG15cmljb20gbXlyaW5ldCBhcyAlc1xuIiwgc2Rldi0+cHJvbV9uYW1lKSk7Ci0JCQkJaWYgKCh2ID0gbXlyaV9ldGhlcl9pbml0KHNkZXYsIChjYXJkcyAtIDEpKSkpCi0JCQkJCXJldHVybiB2OwotCQkJfQotCQl9Ci0JfQotCWlmICghY2FyZHMpCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJm15cmlfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IG15cmlfc2J1c19jbGVhbnVwKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbXlyaV9zYnVzX2V4aXQodm9pZCkKIHsKLSNpZmRlZiBNT0RVTEUKLQl3aGlsZSAocm9vdF9teXJpX2RldikgewotCQlzdHJ1Y3QgbXlyaV9ldGggKm5leHQgPSByb290X215cmlfZGV2LT5uZXh0X21vZHVsZTsKLQotCQl1bnJlZ2lzdGVyX25ldGRldihyb290X215cmlfZGV2LT5kZXYpOwotCQkvKiB0aGlzIHdpbGwgYWxzbyBmcmVlIHRoZSBjby1hbGxvY2F0ZWQgJ3Jvb3RfbXlyaV9kZXYnICovCi0JCWZyZWVfbmV0ZGV2KHJvb3RfbXlyaV9kZXYtPmRldik7Ci0JCXJvb3RfbXlyaV9kZXYgPSBuZXh0OwotCX0KLSNlbmRpZiAvKiBNT0RVTEUgKi8KKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmbXlyaV9zYnVzX2RyaXZlcik7CiB9CiAKLW1vZHVsZV9pbml0KG15cmlfc2J1c19wcm9iZSk7Ci1tb2R1bGVfZXhpdChteXJpX3NidXNfY2xlYW51cCk7Cittb2R1bGVfaW5pdChteXJpX3NidXNfaW5pdCk7Cittb2R1bGVfZXhpdChteXJpX3NidXNfZXhpdCk7CisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L215cmlfc2J1cy5oIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKaW5kZXggNDc3MjJmNy4uMmY2OWVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKKysrIGIvZHJpdmVycy9uZXQvbXlyaV9zYnVzLmgKQEAgLTI5MCw3ICsyOTAsNiBAQAogCXVuc2lnbmVkIGludAkJCXJlZ19zaXplOwkvKiBTaXplIG9mIHJlZ2lzdGVyIHNwYWNlLiAgICAqLwogCXVuc2lnbmVkIGludAkJCXNobWVtX2Jhc2U7CS8qIE9mZnNldCB0byBzaGFyZWQgcmFtLiAgICAgICovCiAJc3RydWN0IHNidXNfZGV2CQkJKm15cmlfc2RldjsJLyogT3VyIFNCVVMgZGV2aWNlIHN0cnVjdC4gICAgKi8KLQlzdHJ1Y3QgbXlyaV9ldGgJCQkqbmV4dF9tb2R1bGU7CS8qIE5leHQgaW4gYWRhcHRlciBjaGFpbi4gICAgICovCiB9OwogCiAvKiBXZSB1c2UgdGhpcyB0byBhY3F1aXJlIHJlY2VpdmUgc2tiJ3MgdGhhdCB3ZSBjYW4gRE1BIGRpcmVjdGx5IGludG8uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9uZXR4LWV0aC5jIGIvZHJpdmVycy9uZXQvbmV0eC1ldGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTI0MzBjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvbmV0eC1ldGguYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqIGRyaXZlcnMvbmV0L25ldHgtZXRoLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2FzY2hhIEhhdWVyIDxzLmhhdWVyQHBlbmd1dHJvbml4LmRlPiwgUGVuZ3V0cm9uaXgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbmV0eC1yZWdzLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvcGZpZm8uaD4KKyNpbmNsdWRlIDxhc20vYXJjaC94Yy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2V0aC5oPgorCisvKiBYQyBGaWZvIE9mZnNldHMgKi8KKyNkZWZpbmUgRU1QVFlfUFRSX0ZJRk8oeGNubykgICAgKDAgKyAoKHhjbm8pIDw8IDMpKQkvKiBJbmRleCBvZiB0aGUgZW1wdHkgcG9pbnRlciBGSUZPICovCisjZGVmaW5lIElORF9GSUZPX1BPUlRfSEkoeGNubykgICgxICsgKCh4Y25vKSA8PCAzKSkJLyogSW5kZXggb2YgdGhlIEZJRk8gd2hlcmUgcmVjZWl2ZWQgKi8KKwkJCQkJCQkvKiBEYXRhIHBhY2thZ2VzIGFyZSBpbmRpY2F0ZWQgYnkgWEMgKi8KKyNkZWZpbmUgSU5EX0ZJRk9fUE9SVF9MTyh4Y25vKSAgKDIgKyAoKHhjbm8pIDw8IDMpKQkvKiBJbmRleCBvZiB0aGUgRklGTyB3aGVyZSByZWNlaXZlZCAqLworCQkJCQkJCS8qIERhdGEgcGFja2FnZXMgYXJlIGluZGljYXRlZCBieSBYQyAqLworI2RlZmluZSBSRVFfRklGT19QT1JUX0hJKHhjbm8pICAoMyArICgoeGNubykgPDwgMykpCS8qIEluZGV4IG9mIHRoZSBGSUZPIHdoZXJlIERhdGEgcGFja2FnZXMgKi8KKwkJCQkJCQkvKiBoYXZlIHRvIGJlIGluZGljYXRlZCBieSBBUk0gd2hpY2ggKi8KKwkJCQkJCQkvKiBzaGFsbCBiZSBzZW50ICovCisjZGVmaW5lIFJFUV9GSUZPX1BPUlRfTE8oeGNubykgICg0ICsgKCh4Y25vKSA8PCAzKSkJLyogSW5kZXggb2YgdGhlIEZJRk8gd2hlcmUgRGF0YSBwYWNrYWdlcyAqLworCQkJCQkJCS8qIGhhdmUgdG8gYmUgaW5kaWNhdGVkIGJ5IEFSTSB3aGljaCBzaGFsbCAqLworCQkJCQkJCS8qIGJlIHNlbnQgKi8KKyNkZWZpbmUgQ09OX0ZJRk9fUE9SVF9ISSh4Y25vKSAgKDUgKyAoKHhjbm8pIDw8IDMpKQkvKiBJbmRleCBvZiB0aGUgRklGTyB3aGVyZSBzZW50IERhdGEgcGFja2FnZXMgKi8KKwkJCQkJCQkvKiBhcmUgY29uZmlybWVkICovCisjZGVmaW5lIENPTl9GSUZPX1BPUlRfTE8oeGNubykgICg2ICsgKCh4Y25vKSA8PCAzKSkJLyogSW5kZXggb2YgdGhlIEZJRk8gd2hlcmUgc2VudCBEYXRhICovCisJCQkJCQkJLyogcGFja2FnZXMgYXJlIGNvbmZpcm1lZCAqLworI2RlZmluZSBQRklGT19NQVNLKHhjbm8pICAgICAgICAoMHg3ZiA8PCAoeGNubyo4KSkKKworI2RlZmluZSBGSUZPX1BUUl9GUkFNRUxFTl9TSElGVCAwCisjZGVmaW5lIEZJRk9fUFRSX0ZSQU1FTEVOX01BU0sgICgweDdmZiA8PCAwKQorI2RlZmluZSBGSUZPX1BUUl9GUkFNRUxFTihsZW4pICAoKChsZW4pIDw8IDApICYgRklGT19QVFJfRlJBTUVMRU5fTUFTSykKKyNkZWZpbmUgRklGT19QVFJfVElNRVRSSUcgICAgICAgKDE8PDExKQorI2RlZmluZSBGSUZPX1BUUl9NVUxUSV9SRVEKKyNkZWZpbmUgRklGT19QVFJfT1JJR0lOICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBGSUZPX1BUUl9WTEFOICAgICAgICAgICAoMTw8MTUpCisjZGVmaW5lIEZJRk9fUFRSX0ZSQU1FTk9fU0hJRlQgIDE2CisjZGVmaW5lIEZJRk9fUFRSX0ZSQU1FTk9fTUFTSyAgICgweDNmIDw8IDE2KQorI2RlZmluZSBGSUZPX1BUUl9GUkFNRU5PKG5vKSAgICAoKChubykgPDwgMTYpICYgRklGT19QVFJfRlJBTUVOT19NQVNLKQorI2RlZmluZSBGSUZPX1BUUl9TRUdNRU5UX1NISUZUICAyMgorI2RlZmluZSBGSUZPX1BUUl9TRUdNRU5UX01BU0sgICAoMHhmIDw8IDIyKQorI2RlZmluZSBGSUZPX1BUUl9TRUdNRU5UKHNlZykgICAoKChzZWcpICYgMHhmKSA8PCAyMikKKyNkZWZpbmUgRklGT19QVFJfRVJST1JfU0hJRlQgICAgMjgKKyNkZWZpbmUgRklGT19QVFJfRVJST1JfTUFTSyAgICAgKDB4ZiA8PCAyOCkKKworI2RlZmluZSBJU1JfTElOS19TVEFUVVNfQ0hBTkdFICgxPDw0KQorI2RlZmluZSBJU1JfSU5EX0xPICAgICAgICAgICAgICgxPDwzKQorI2RlZmluZSBJU1JfQ09OX0xPICAgICAgICAgICAgICgxPDwyKQorI2RlZmluZSBJU1JfSU5EX0hJICAgICAgICAgICAgICgxPDwxKQorI2RlZmluZSBJU1JfQ09OX0hJICAgICAgICAgICAgICgxPDwwKQorCisjZGVmaW5lIEVUSF9NQUNfTE9DQUxfQ09ORklHIDB4MTU2MAorI2RlZmluZSBFVEhfTUFDXzQzMjEgICAgICAgICAweDE1NjQKKyNkZWZpbmUgRVRIX01BQ182NSAgICAgICAgICAgMHgxNTY4CisKKyNkZWZpbmUgTUFDX1RSQUZGSUNfQ0xBU1NfQVJSQU5HRU1FTlRfU0hJRlQgMTYKKyNkZWZpbmUgTUFDX1RSQUZGSUNfQ0xBU1NfQVJSQU5HRU1FTlRfTUFTSyAoMHhmPDxNQUNfVFJBRkZJQ19DTEFTU19BUlJBTkdFTUVOVF9TSElGVCkKKyNkZWZpbmUgTUFDX1RSQUZGSUNfQ0xBU1NfQVJSQU5HRU1FTlQoeCkgKCgoeCk8PE1BQ19UUkFGRklDX0NMQVNTX0FSUkFOR0VNRU5UX1NISUZUKSAmIE1BQ19UUkFGRklDX0NMQVNTX0FSUkFOR0VNRU5UX01BU0spCisjZGVmaW5lIExPQ0FMX0NPTkZJR19MSU5LX1NUQVRVU19JUlFfRU4gKDE8PDI0KQorI2RlZmluZSBMT0NBTF9DT05GSUdfQ09OX0xPX0lSUV9FTiAoMTw8MjMpCisjZGVmaW5lIExPQ0FMX0NPTkZJR19DT05fSElfSVJRX0VOICgxPDwyMikKKyNkZWZpbmUgTE9DQUxfQ09ORklHX0lORF9MT19JUlFfRU4gKDE8PDIxKQorI2RlZmluZSBMT0NBTF9DT05GSUdfSU5EX0hJX0lSUV9FTiAoMTw8MjApCisKKyNkZWZpbmUgQ0FSRE5BTUUgIm5ldHgtZXRoIgorCisvKiBMU0IgbXVzdCBiZSB6ZXJvICovCisjZGVmaW5lIElOVEVSTkFMX1BIWV9BRFIgMHgxYworCitzdHJ1Y3QgbmV0eF9ldGhfcHJpdiB7CisJdm9pZCAgICAgICAgICAgICAgICAgICAgX19pb21lbSAqc3JhbV9iYXNlLCAqeHBlY19iYXNlLCAqeG1hY19iYXNlOworCWludCAgICAgICAgICAgICAgICAgICAgIGlkOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOworCXN0cnVjdCBtaWlfaWZfaW5mbyAgICAgIG1paTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBtc2dfZW5hYmxlOworCXN0cnVjdCB4YyAgICAgICAgICAgICAgICp4YzsKKwlzcGlubG9ja190ICAgICAgICAgICAgICBsb2NrOworfTsKKworc3RhdGljIHZvaWQgbmV0eF9ldGhfc2V0X211bHRpY2FzdF9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCS8qIGltcGxlbWVudCBtZSAqLworfQorCitzdGF0aWMgaW50CituZXR4X2V0aF9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5ldHhfZXRoX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSBza2ItPmRhdGE7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOworCisJc3Bpbl9sb2NrX2lycSgmcHJpdi0+bG9jayk7CisJbWVtY3B5X3RvaW8ocHJpdi0+c3JhbV9iYXNlICsgMTU2MCwgKHZvaWQgKilidWYsIGxlbik7CisJaWYgKGxlbiA8IDYwKSB7CisJCW1lbXNldF9pbyhwcml2LT5zcmFtX2Jhc2UgKyAxNTYwICsgbGVuLCAwLCA2MCAtIGxlbik7CisJCWxlbiA9IDYwOworCX0KKworCXBmaWZvX3B1c2goUkVRX0ZJRk9fUE9SVF9MTyhwcml2LT5pZCksCisJICAgICAgICAgICBGSUZPX1BUUl9TRUdNRU5UKHByaXYtPmlkKSB8CisJICAgICAgICAgICBGSUZPX1BUUl9GUkFNRU5PKDEpIHwKKwkgICAgICAgICAgIEZJRk9fUFRSX0ZSQU1FTEVOKGxlbikpOworCisJbmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCXByaXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKKwlwcml2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmV0eF9ldGhfcmVjZWl2ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuc2lnbmVkIGludCB2YWwsIGZyYW1lbm8sIHNlZywgbGVuOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXZhbCA9IHBmaWZvX3BvcChJTkRfRklGT19QT1JUX0xPKHByaXYtPmlkKSk7CisKKwlmcmFtZW5vID0gKHZhbCAmIEZJRk9fUFRSX0ZSQU1FTk9fTUFTSykgPj4gRklGT19QVFJfRlJBTUVOT19TSElGVDsKKwlzZWcgPSAodmFsICYgRklGT19QVFJfU0VHTUVOVF9NQVNLKSA+PiBGSUZPX1BUUl9TRUdNRU5UX1NISUZUOworCWxlbiA9ICh2YWwgJiBGSUZPX1BUUl9GUkFNRUxFTl9NQVNLKSA+PiBGSUZPX1BUUl9GUkFNRUxFTl9TSElGVDsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IExvdyBtZW1vcnksIHBhY2tldCBkcm9wcGVkLlxuIiwKKwkJCW5kZXYtPm5hbWUpOworCQlwcml2LT5zdGF0cy5yeF9kcm9wcGVkKys7CisJCXJldHVybjsKKwl9CisKKwlkYXRhID0gc2tiX3B1dChza2IsIGxlbik7CisKKwltZW1jcHlfZnJvbWlvKGRhdGEsIHByaXYtPnNyYW1fYmFzZSArIGZyYW1lbm8gKiAxNTYwLCBsZW4pOworCisJcGZpZm9fcHVzaChFTVBUWV9QVFJfRklGTyhwcml2LT5pZCksCisJCUZJRk9fUFRSX1NFR01FTlQoc2VnKSB8IEZJRk9fUFRSX0ZSQU1FTk8oZnJhbWVubykpOworCisJbmRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJc2tiLT5kZXYgPSBuZGV2OworCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCW5ldGlmX3J4KHNrYik7CisJcHJpdi0+c3RhdHMucnhfcGFja2V0cysrOworCXByaXYtPnN0YXRzLnJ4X2J5dGVzICs9IGxlbjsKK30KKworc3RhdGljIGlycXJldHVybl90CituZXR4X2V0aF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisKKwlzdGF0dXMgPSByZWFkbChORVRYX1BGSUZPX1hQRUNfSVNSKHByaXYtPmlkKSk7CisJd2hpbGUgKHN0YXR1cykgeworCQlpbnQgZmlsbF9sZXZlbDsKKwkJd3JpdGVsKHN0YXR1cywgTkVUWF9QRklGT19YUEVDX0lTUihwcml2LT5pZCkpOworCisJCWlmICgoc3RhdHVzICYgSVNSX0NPTl9ISSkgfHwgKHN0YXR1cyAmIElTUl9JTkRfSEkpKQorCQkJcHJpbnRrKCIlczogdW5leHBlY3RlZCBzdGF0dXM6IDB4JTA4eFxuIiwKKwkJCSAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisKKwkJZmlsbF9sZXZlbCA9CisJCSAgICByZWFkbChORVRYX1BGSUZPX0ZJTExfTEVWRUwoSU5EX0ZJRk9fUE9SVF9MTyhwcml2LT5pZCkpKTsKKwkJd2hpbGUgKGZpbGxfbGV2ZWwtLSkKKwkJCW5ldHhfZXRoX3JlY2VpdmUobmRldik7CisKKwkJaWYgKHN0YXR1cyAmIElTUl9DT05fTE8pCisJCQluZXRpZl93YWtlX3F1ZXVlKG5kZXYpOworCisJCWlmIChzdGF0dXMgJiBJU1JfTElOS19TVEFUVVNfQ0hBTkdFKQorCQkJbWlpX2NoZWNrX21lZGlhKCZwcml2LT5taWksIG5ldGlmX21zZ19saW5rKHByaXYpLCAxKTsKKworCQlzdGF0dXMgPSByZWFkbChORVRYX1BGSUZPX1hQRUNfSVNSKHByaXYtPmlkKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbmV0eF9ldGhfcXVlcnlfc3RhdGlzdGljcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXJldHVybiAmcHJpdi0+c3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgbmV0eF9ldGhfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChuZGV2LT5pcnEsICZuZXR4X2V0aF9pbnRlcnJ1cHQsIFNBX1NISVJRLCBuZGV2LT5uYW1lLCBuZGV2KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwl3cml0ZWwobmRldi0+ZGV2X2FkZHJbMF0gfAorCSAgICAgICBuZGV2LT5kZXZfYWRkclsxXTw8OCB8CisJICAgICAgIG5kZXYtPmRldl9hZGRyWzJdPDwxNiB8CisJICAgICAgIG5kZXYtPmRldl9hZGRyWzNdPDwyNCwKKwkgICAgICAgcHJpdi0+eHBlY19iYXNlICsgTkVUWF9YUEVDX1JBTV9TVEFSVF9PRlMgKyBFVEhfTUFDXzQzMjEpOworCXdyaXRlbChuZGV2LT5kZXZfYWRkcls0XSB8CisJICAgICAgIG5kZXYtPmRldl9hZGRyWzVdPDw4LAorCSAgICAgICBwcml2LT54cGVjX2Jhc2UgKyBORVRYX1hQRUNfUkFNX1NUQVJUX09GUyArIEVUSF9NQUNfNjUpOworCisJd3JpdGVsKExPQ0FMX0NPTkZJR19MSU5LX1NUQVRVU19JUlFfRU4gfAorCQlMT0NBTF9DT05GSUdfQ09OX0xPX0lSUV9FTiB8CisJCUxPQ0FMX0NPTkZJR19DT05fSElfSVJRX0VOIHwKKwkJTE9DQUxfQ09ORklHX0lORF9MT19JUlFfRU4gfAorCQlMT0NBTF9DT05GSUdfSU5EX0hJX0lSUV9FTiwKKwkJcHJpdi0+eHBlY19iYXNlICsgTkVUWF9YUEVDX1JBTV9TVEFSVF9PRlMgKworCQlFVEhfTUFDX0xPQ0FMX0NPTkZJRyk7CisKKwltaWlfY2hlY2tfbWVkaWEoJnByaXYtPm1paSwgbmV0aWZfbXNnX2xpbmsocHJpdiksIDEpOworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eF9ldGhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5ldHhfZXRoX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisKKwl3cml0ZWwoMCwKKwkgICAgcHJpdi0+eHBlY19iYXNlICsgTkVUWF9YUEVDX1JBTV9TVEFSVF9PRlMgKyBFVEhfTUFDX0xPQ0FMX0NPTkZJRyk7CisKKwlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5ldHhfZXRoX3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IG5ldHhfZXRoX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgaTsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IHRyYW5zbWl0IHRpbWVkIG91dCwgcmVzZXR0aW5nXG4iLCBuZGV2LT5uYW1lKTsKKworCXNwaW5fbG9ja19pcnEoJnByaXYtPmxvY2spOworCisJeGNfcmVzZXQocHJpdi0+eGMpOworCXhjX3N0YXJ0KHByaXYtPnhjKTsKKworCWZvciAoaT0yOyBpPD0xODsgaSsrKQorCQlwZmlmb19wdXNoKEVNUFRZX1BUUl9GSUZPKHByaXYtPmlkKSwKKwkJCUZJRk9fUFRSX0ZSQU1FTk8oaSkgfCBGSUZPX1BUUl9TRUdNRU5UKHByaXYtPmlkKSk7CisKKwlzcGluX3VubG9ja19pcnEoJnByaXYtPmxvY2spOworCisJbmV0aWZfd2FrZV9xdWV1ZShuZGV2KTsKK30KKworc3RhdGljIGludAorbmV0eF9ldGhfcGh5X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBwaHlfaWQsIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXZhbCA9IE1JSU1VX1NOUkRZIHwgTUlJTVVfUFJFQU1CTEUgfCBNSUlNVV9QSFlBRERSKHBoeV9pZCkgfAorCSAgICAgIE1JSU1VX1JFR0FERFIocmVnKSB8IE1JSU1VX1BIWV9OUkVTOworCisJd3JpdGVsKHZhbCwgTkVUWF9NSUlNVSk7CisJd2hpbGUgKHJlYWRsKE5FVFhfTUlJTVUpICYgTUlJTVVfU05SRFkpOworCisJcmV0dXJuIHJlYWRsKE5FVFhfTUlJTVUpID4+IDE2OworCit9CisKK3N0YXRpYyB2b2lkCituZXR4X2V0aF9waHlfd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBwaHlfaWQsIGludCByZWcsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gTUlJTVVfU05SRFkgfCBNSUlNVV9QUkVBTUJMRSB8IE1JSU1VX1BIWUFERFIocGh5X2lkKSB8CisJICAgICAgTUlJTVVfUkVHQUREUihyZWcpIHwgTUlJTVVfUEhZX05SRVMgfCBNSUlNVV9PUE1PREVfV1JJVEUgfAorCSAgICAgIE1JSU1VX0RBVEEodmFsdWUpOworCisJd3JpdGVsKHZhbCwgTkVUWF9NSUlNVSk7CisJd2hpbGUgKHJlYWRsKE5FVFhfTUlJTVUpICYgTUlJTVVfU05SRFkpOworfQorCitzdGF0aWMgaW50IG5ldHhfZXRoX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKK3sKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXVuc2lnbmVkIGludCBtYWM0MzIxLCBtYWM2NTsKKwlpbnQgcnVubmluZywgaTsKKworCWV0aGVyX3NldHVwKG5kZXYpOworCisJbmRldi0+b3BlbiA9IG5ldHhfZXRoX29wZW47CisJbmRldi0+c3RvcCA9IG5ldHhfZXRoX2Nsb3NlOworCW5kZXYtPmhhcmRfc3RhcnRfeG1pdCA9IG5ldHhfZXRoX2hhcmRfc3RhcnRfeG1pdDsKKwluZGV2LT50eF90aW1lb3V0ID0gbmV0eF9ldGhfdGltZW91dDsKKwluZGV2LT53YXRjaGRvZ190aW1lbyA9IG1zZWNzX3RvX2ppZmZpZXMoNTAwMCk7CisJbmRldi0+Z2V0X3N0YXRzID0gbmV0eF9ldGhfcXVlcnlfc3RhdGlzdGljczsKKwluZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSBuZXR4X2V0aF9zZXRfbXVsdGljYXN0X2xpc3Q7CisKKwlwcml2LT5tc2dfZW5hYmxlICAgICAgID0gTkVUSUZfTVNHX0xJTks7CisJcHJpdi0+bWlpLnBoeV9pZF9tYXNrICA9IDB4MWY7CisJcHJpdi0+bWlpLnJlZ19udW1fbWFzayA9IDB4MWY7CisJcHJpdi0+bWlpLmZvcmNlX21lZGlhICA9IDA7CisJcHJpdi0+bWlpLmZ1bGxfZHVwbGV4ICA9IDA7CisJcHJpdi0+bWlpLmRldgkgICAgID0gbmRldjsKKwlwcml2LT5taWkubWRpb19yZWFkICAgID0gbmV0eF9ldGhfcGh5X3JlYWQ7CisJcHJpdi0+bWlpLm1kaW9fd3JpdGUgICA9IG5ldHhfZXRoX3BoeV93cml0ZTsKKwlwcml2LT5taWkucGh5X2lkID0gSU5URVJOQUxfUEhZX0FEUiArIHByaXYtPmlkOworCisJcnVubmluZyA9IHhjX3J1bm5pbmcocHJpdi0+eGMpOworCXhjX3N0b3AocHJpdi0+eGMpOworCisJLyogaWYgdGhlIHhjIGVuZ2luZSBpcyBhbHJlYWR5IHJ1bm5pbmcsIGFzc3VtZSB0aGUgYm9vdGxvYWRlciBoYXMKKwkgKiBsb2FkZWQgdGhlIGZpcm13YXJlIGZvciB1cworCSAqLworCWlmIChydW5uaW5nKSB7CisJCS8qIGdldCBOb2RlIEFkZHJlc3MgZnJvbSBoYXJkd2FyZSAqLworCQltYWM0MzIxID0gcmVhZGwocHJpdi0+eHBlY19iYXNlICsKKwkJCU5FVFhfWFBFQ19SQU1fU1RBUlRfT0ZTICsgRVRIX01BQ180MzIxKTsKKwkJbWFjNjUgPSByZWFkbChwcml2LT54cGVjX2Jhc2UgKworCQkJTkVUWF9YUEVDX1JBTV9TVEFSVF9PRlMgKyBFVEhfTUFDXzY1KTsKKworCQluZGV2LT5kZXZfYWRkclswXSA9IG1hYzQzMjEgJiAweGZmOworCQluZGV2LT5kZXZfYWRkclsxXSA9IChtYWM0MzIxID4+IDgpICYgMHhmZjsKKwkJbmRldi0+ZGV2X2FkZHJbMl0gPSAobWFjNDMyMSA+PiAxNikgJiAweGZmOworCQluZGV2LT5kZXZfYWRkclszXSA9IChtYWM0MzIxID4+IDI0KSAmIDB4ZmY7CisJCW5kZXYtPmRldl9hZGRyWzRdID0gbWFjNjUgJiAweGZmOworCQluZGV2LT5kZXZfYWRkcls1XSA9IChtYWM2NSA+PiA4KSAmIDB4ZmY7CisJfSBlbHNlIHsKKwkJaWYgKHhjX3JlcXVlc3RfZmlybXdhcmUocHJpdi0+eGMpKSB7CisJCQlwcmludGsoQ0FSRE5BTUUgIjogcmVxdWVzdGluZyBmaXJtd2FyZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9CisKKwl4Y19yZXNldChwcml2LT54Yyk7CisJeGNfc3RhcnQocHJpdi0+eGMpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5kZXYtPmRldl9hZGRyKSkKKwkJcHJpbnRrKCIlczogSW52YWxpZCBldGhlcm5ldCBNQUMgYWRkcmVzcy4gIFBsZWFzZSAiCisJCSAgICAgICAic2V0IHVzaW5nIGlmY29uZmlnXG4iLCBuZGV2LT5uYW1lKTsKKworCWZvciAoaT0yOyBpPD0xODsgaSsrKQorCQlwZmlmb19wdXNoKEVNUFRZX1BUUl9GSUZPKHByaXYtPmlkKSwKKwkJCUZJRk9fUFRSX0ZSQU1FTk8oaSkgfCBGSUZPX1BUUl9TRUdNRU5UKHByaXYtPmlkKSk7CisKKwlyZXR1cm4gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCit9CisKK3N0YXRpYyBpbnQgbmV0eF9ldGhfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldHhfZXRoX3ByaXYgKnByaXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IG5ldHhldGhfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHJldDsKKworCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2YgKHN0cnVjdCBuZXR4X2V0aF9wcml2KSk7CisJaWYgKCFuZGV2KSB7CisJCXByaW50aygiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBkZXZpY2UuXG4iLCBDQVJETkFNRSk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisJU0VUX01PRFVMRV9PV05FUihuZGV2KTsKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOworCisJcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcGRhdGEgPSAoc3RydWN0IG5ldHhldGhfcGxhdGZvcm1fZGF0YSAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXByaXYtPnhjID0gcmVxdWVzdF94YyhwZGF0YS0+eGNubywgJnBkZXYtPmRldik7CisJaWYgKCFwcml2LT54YykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVxdWVzdCB4YyBlbmdpbmVcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfZnJlZV9uZXRkZXY7CisJfQorCisJbmRldi0+aXJxID0gcHJpdi0+eGMtPmlycTsKKwlwcml2LT5pZCA9IHBkZXYtPmlkOworCXByaXYtPnhwZWNfYmFzZSA9IHByaXYtPnhjLT54cGVjX2Jhc2U7CisJcHJpdi0+eG1hY19iYXNlID0gcHJpdi0+eGMtPnhtYWNfYmFzZTsKKwlwcml2LT5zcmFtX2Jhc2UgPSBwcml2LT54Yy0+c3JhbV9iYXNlOworCisJcmV0ID0gcGZpZm9fcmVxdWVzdChQRklGT19NQVNLKHByaXYtPmlkKSk7CisJaWYgKHJldCkgeworCQlwcmludGsoInVuYWJsZSB0byByZXF1ZXN0IFBGSUZPXG4iKTsKKwkJZ290byBleGl0X2ZyZWVfeGM7CisJfQorCisJcmV0ID0gbmV0eF9ldGhfZW5hYmxlKG5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdF9mcmVlX3BmaWZvOworCisJcmV0dXJuIDA7CitleGl0X2ZyZWVfcGZpZm86CisJcGZpZm9fZnJlZShQRklGT19NQVNLKHByaXYtPmlkKSk7CitleGl0X2ZyZWVfeGM6CisJZnJlZV94Yyhwcml2LT54Yyk7CitleGl0X2ZyZWVfbmV0ZGV2OgorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWZyZWVfbmV0ZGV2KG5kZXYpOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG5ldHhfZXRoX2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgbmV0eF9ldGhfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKKwl4Y19zdG9wKHByaXYtPnhjKTsKKwlmcmVlX3hjKHByaXYtPnhjKTsKKwlmcmVlX25ldGRldihuZGV2KTsKKwlwZmlmb19mcmVlKFBGSUZPX01BU0socHJpdi0+aWQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5ldHhfZXRoX2Rydl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlkZXZfZXJyKCZwZGV2LT5kZXYsICJzdXNwZW5kIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV0eF9ldGhfZHJ2X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWRldl9lcnIoJnBkZXYtPmRldiwgInJlc3VtZSBub3QgaW1wbGVtZW50ZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuZXR4X2V0aF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG5ldHhfZXRoX2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IG5ldHhfZXRoX2Rydl9yZW1vdmUsCisJLnN1c3BlbmQJPSBuZXR4X2V0aF9kcnZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IG5ldHhfZXRoX2Rydl9yZXN1bWUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gQ0FSRE5BTUUsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZXR4X2V0aF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHBoeV9jb250cm9sLCB2YWw7CisKKwlwcmludGsoIk5ldFggRXRoZXJuZXQgZHJpdmVyXG4iKTsKKworCXBoeV9jb250cm9sID0gUEhZX0NPTlRST0xfUEhZX0FERFJFU1MoSU5URVJOQUxfUEhZX0FEUj4+MSkgfAorCQkgICAgICBQSFlfQ09OVFJPTF9QSFkxX01PREUoUEhZX01PREVfQUxMKSB8CisJCSAgICAgIFBIWV9DT05UUk9MX1BIWTFfQVVUT01ESVggfAorCQkgICAgICBQSFlfQ09OVFJPTF9QSFkxX0VOIHwKKwkJICAgICAgUEhZX0NPTlRST0xfUEhZMF9NT0RFKFBIWV9NT0RFX0FMTCkgfAorCQkgICAgICBQSFlfQ09OVFJPTF9QSFkwX0FVVE9NRElYIHwKKwkJICAgICAgUEhZX0NPTlRST0xfUEhZMF9FTiB8CisJCSAgICAgIFBIWV9DT05UUk9MX0NMS19YTEFUSU47CisKKwl2YWwgPSByZWFkbChORVRYX1NZU1RFTV9JT0NfQUNDRVNTX0tFWSk7CisJd3JpdGVsKHZhbCwgTkVUWF9TWVNURU1fSU9DX0FDQ0VTU19LRVkpOworCisJd3JpdGVsKHBoeV9jb250cm9sIHwgUEhZX0NPTlRST0xfUkVTRVQsIE5FVFhfU1lTVEVNX1BIWV9DT05UUk9MKTsKKwl1ZGVsYXkoMTAwKTsKKworCXZhbCA9IHJlYWRsKE5FVFhfU1lTVEVNX0lPQ19BQ0NFU1NfS0VZKTsKKwl3cml0ZWwodmFsLCBORVRYX1NZU1RFTV9JT0NfQUNDRVNTX0tFWSk7CisKKwl3cml0ZWwocGh5X2NvbnRyb2wsIE5FVFhfU1lTVEVNX1BIWV9DT05UUk9MKTsKKworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm5ldHhfZXRoX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXR4X2V0aF9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm5ldHhfZXRoX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG5ldHhfZXRoX2luaXQpOworbW9kdWxlX2V4aXQobmV0eF9ldGhfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciwgUGVuZ3V0cm9uaXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKaW5kZXggMDliMTE3Ni4uZWE5M2I4ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BjbWNpYS9mbXZqMTh4X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL2ZtdmoxOHhfY3MuYwpAQCAtODMxLDggKzgzMSw3IEBACiAgICAgCiAgICAgaWYgKGxlbmd0aCA8IEVUSF9aTEVOKQogICAgIHsKLSAgICAJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotICAgIAlpZiAoc2tiID09IE5VTEwpCisgICAgCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAgICAgCQlyZXR1cm4gMDsKICAgICAJbGVuZ3RoID0gRVRIX1pMRU47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYyBiL2RyaXZlcnMvbmV0L3BjbWNpYS94aXJjMnBzX2NzLmMKaW5kZXggNzFmNDUwNS4uOWJhZTc3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3hpcmMycHNfY3MuYworKysgYi9kcml2ZXJzL25ldC9wY21jaWEveGlyYzJwc19jcy5jCkBAIC0xMzU5LDcgKzEzNTksNyBAQAogICAgIGtpb19hZGRyX3QgaW9hZGRyID0gZGV2LT5iYXNlX2FkZHI7CiAgICAgaW50IG9rYXk7CiAgICAgdW5zaWduZWQgZnJlZXNwYWNlOwotICAgIHVuc2lnbmVkIHBrdGxlbiA9IHNrYj8gc2tiLT5sZW4gOiAwOworICAgIHVuc2lnbmVkIHBrdGxlbiA9IHNrYi0+bGVuOwogCiAgICAgREVCVUcoMSwgImRvX3N0YXJ0X3htaXQoc2tiPSVwLCBkZXY9JXApIGxlbj0ldVxuIiwKIAkgIHNrYiwgZGV2LCBwa3RsZW4pOwpAQCAtMTM3NCw4ICsxMzc0LDcgQEAKICAgICAgKi8KICAgICBpZiAocGt0bGVuIDwgRVRIX1pMRU4pCiAgICAgewotICAgICAgICBza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0gICAgICAgIGlmIChza2IgPT0gTlVMTCkKKyAgICAgICAgaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKICAgICAgICAgCXJldHVybiAwOwogCXBrdGxlbiA9IEVUSF9aTEVOOwogICAgIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKaW5kZXggY2RhM2U1My4uMmJhNmQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKQEAgLTQ0LDYgKzQ0LDExIEBACiAJZGVwZW5kcyBvbiBQSFlMSUIKIAktLS1oZWxwLS0tCiAJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIGNpczgyMDQKK2NvbmZpZyBWSVRFU1NFX1BIWQorICAgICAgICB0cmlzdGF0ZSAiRHJpdmVycyBmb3IgdGhlIFZpdGVzc2UgUEhZcyIKKyAgICAgICAgZGVwZW5kcyBvbiBQSFlMSUIKKyAgICAgICAgLS0taGVscC0tLQorICAgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyB0aGUgdnNjODI0NAogCiBjb25maWcgU01TQ19QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgU01TQyBQSFlzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCmluZGV4IGQ5NjE0MTMuLmEwMGU2MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKQEAgLTksMyArOSw0IEBACiBvYmotJChDT05GSUdfTFhUX1BIWSkJCSs9IGx4dC5vCiBvYmotJChDT05GSUdfUVNFTUlfUEhZKQkJKz0gcXNlbWkubwogb2JqLSQoQ09ORklHX1NNU0NfUEhZKQkJKz0gc21zYy5vCitvYmotJChDT05GSUdfVklURVNTRV9QSFkpCSs9IHZpdGVzc2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L3ZpdGVzc2UuYyBiL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkMjE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3BoeS92aXRlc3NlLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFZpdGVzc2UgUEhZcworICoKKyAqIEF1dGhvcjogS3Jpc3RvbiBDYXJzb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorCisvKiBWaXRlc3NlIEV4dGVuZGVkIENvbnRyb2wgUmVnaXN0ZXIgMSAqLworI2RlZmluZSBNSUlfVlNDODI0NF9FWFRfQ09OMSAgICAgICAgICAgMHgxNworI2RlZmluZSBNSUlfVlNDODI0NF9FWFRDT04xX0lOSVQgICAgICAgMHgwMDAwCisKKy8qIFZpdGVzc2UgSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSU1BU0sJCTB4MTkKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSU1BU0tfSUVOCQkweDgwMDAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSU1BU0tfU1BFRUQJCTB4NDAwMAorI2RlZmluZSBNSUlfVlNDODI0NF9JTUFTS19MSU5LCQkweDIwMDAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSU1BU0tfRFVQTEVYCTB4MTAwMAorI2RlZmluZSBNSUlfVlNDODI0NF9JTUFTS19NQVNLCQkweGYwMDAKKworLyogVml0ZXNzZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIE1JSV9WU0M4MjQ0X0lTVEFUCQkweDFhCisjZGVmaW5lIE1JSV9WU0M4MjQ0X0lTVEFUX1NUQVRVUwkweDgwMDAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSVNUQVRfU1BFRUQJCTB4NDAwMAorI2RlZmluZSBNSUlfVlNDODI0NF9JU1RBVF9MSU5LCQkweDIwMDAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfSVNUQVRfRFVQTEVYCTB4MTAwMAorCisvKiBWaXRlc3NlIEF1eGlsaWFyeSBDb250cm9sL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNSUlfVlNDODI0NF9BVVhfQ09OU1RBVCAgICAgICAgCTB4MWMKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfQVVYQ09OU1RBVF9JTklUICAgIAkweDAwMDQKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfQVVYQ09OU1RBVF9EVVBMRVggIAkweDAwMjAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfQVVYQ09OU1RBVF9TUEVFRCAgIAkweDAwMTgKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfQVVYQ09OU1RBVF9HQklUICAgIAkweDAwMTAKKyNkZWZpbmUgTUlJX1ZTQzgyNDRfQVVYQ09OU1RBVF8xMDAgICAgIAkweDAwMDgKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJWaXRlc3NlIFBIWSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIktyaXN0b24gQ2Fyc29uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgdnNjODI0eF9jb25maWdfaW5pdChzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfVlNDODI0NF9BVVhfQ09OU1RBVCwKKwkJCU1JSV9WU0M4MjQ0X0FVWENPTlNUQVRfSU5JVCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfVlNDODI0NF9FWFRfQ09OMSwKKwkJCU1JSV9WU0M4MjQ0X0VYVENPTjFfSU5JVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2c2M4MjR4X2Fja19pbnRlcnJ1cHQoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKK3sKKwlpbnQgZXJyID0gcGh5X3JlYWQocGh5ZGV2LCBNSUlfVlNDODI0NF9JU1RBVCk7CisKKwlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKK30KKworc3RhdGljIGludCB2c2M4MjR4X2NvbmZpZ19pbnRyKHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYpCit7CisJaW50IGVycjsKKworCWlmIChwaHlkZXYtPmludGVycnVwdHMgPT0gUEhZX0lOVEVSUlVQVF9FTkFCTEVEKQorCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfVlNDODI0NF9JTUFTSywKKwkJCQlNSUlfVlNDODI0NF9JTUFTS19NQVNLKTsKKwllbHNlCisJCWVyciA9IHBoeV93cml0ZShwaHlkZXYsIE1JSV9WU0M4MjQ0X0lNQVNLLCAwKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBWaXRlc3NlIDgyNHggKi8KK3N0YXRpYyBzdHJ1Y3QgcGh5X2RyaXZlciB2c2M4MjQ0X2RyaXZlciA9IHsKKwkucGh5X2lkCQk9IDB4MDAwZmM2YzIsCisJLm5hbWUJCT0gIlZpdGVzc2UgVlNDODI0NCIsCisJLnBoeV9pZF9tYXNrCT0gMHgwMDBmZmZjMCwKKwkuZmVhdHVyZXMJPSBQSFlfR0JJVF9GRUFUVVJFUywKKwkuZmxhZ3MJCT0gUEhZX0hBU19JTlRFUlJVUFQsCisJLmNvbmZpZ19pbml0CT0gJnZzYzgyNHhfY29uZmlnX2luaXQsCisJLmNvbmZpZ19hbmVnCT0gJmdlbnBoeV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSAmZ2VucGh5X3JlYWRfc3RhdHVzLAorCS5hY2tfaW50ZXJydXB0CT0gJnZzYzgyNHhfYWNrX2ludGVycnVwdCwKKwkuY29uZmlnX2ludHIJPSAmdnNjODI0eF9jb25maWdfaW50ciwKKwkuZHJpdmVyIAk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUsfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHZzYzgyNDRfaW5pdCh2b2lkKQoreworCXJldHVybiBwaHlfZHJpdmVyX3JlZ2lzdGVyKCZ2c2M4MjQ0X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB2c2M4MjQ0X2V4aXQodm9pZCkKK3sKKwlwaHlfZHJpdmVyX3VucmVnaXN0ZXIoJnZzYzgyNDRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodnNjODI0NF9pbml0KTsKK21vZHVsZV9leGl0KHZzYzgyNDRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9yODE2OS5jIGIvZHJpdmVycy9uZXQvcjgxNjkuYwppbmRleCA5OTQ1Y2M2Li4xMmQxY2IyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9yODE2OS5jCisrKyBiL2RyaXZlcnMvbmV0L3I4MTY5LmMKQEAgLTIxNzIsNyArMjE3Miw3IEBACiBzdGF0aWMgaW5saW5lIHUzMiBydGw4MTY5X3Rzb19jc3VtKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykgewotCQl1MzIgbXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwkJdTMyIG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAKIAkJaWYgKG1zcykKIAkJCXJldHVybiBMYXJnZVNlbmQgfCAoKG1zcyAmIE1TU01hc2spIDw8IE1TU1NoaWZ0KTsKQEAgLTIyMjIsOCArMjIyMiw3IEBACiAJCWxlbiA9IHNrYi0+bGVuOwogCiAJCWlmICh1bmxpa2VseShsZW4gPCBFVEhfWkxFTikpIHsKLQkJCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLQkJCWlmICghc2tiKQorCQkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKIAkJCQlnb3RvIGVycl91cGRhdGVfc3RhdHM7CiAJCQlsZW4gPSBFVEhfWkxFTjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvczJpby5jIGIvZHJpdmVycy9uZXQvczJpby5jCmluZGV4IGNhYzlmZGQuLjNkZWZlNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9zMmlvLmMKQEAgLTI2MjcsNiArMjYyNyw1MCBAQAogI2VuZGlmCiAKIC8qKgorICogczJpb19uZXRwb2xsIC0gUnggaW50ZXJydXB0IHNlcnZpY2UgaGFuZGxlciBmb3IgbmV0cG9sbCBzdXBwb3J0CisgKiBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqIERlc2NyaXB0aW9uOgorICogUG9sbGluZyAnaW50ZXJydXB0JyAtIHVzZWQgYnkgdGhpbmdzIGxpa2UgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIHJlLWVuYWJsZSBpbnRlcnJ1cHRzLiBJdCdzIG5vdCBjYWxsZWQgd2hpbGUKKyAqIHRoZSBpbnRlcnJ1cHQgcm91dGluZSBpcyBleGVjdXRpbmcuCisgKi8KKworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCitzdGF0aWMgdm9pZCBzMmlvX25ldHBvbGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluaWNfdCAqbmljID0gZGV2LT5wcml2OworCW1hY19pbmZvX3QgKm1hY19jb250cm9sOworCXN0cnVjdCBjb25maWdfcGFyYW0gKmNvbmZpZzsKKwlYRU5BX2Rldl9jb25maWdfdCBfX2lvbWVtICpiYXIwID0gbmljLT5iYXIwOworCXU2NCB2YWw2NDsKKwlpbnQgaTsKKworCWRpc2FibGVfaXJxKGRldi0+aXJxKTsKKworCWF0b21pY19pbmMoJm5pYy0+aXNyX2NudCk7CisJbWFjX2NvbnRyb2wgPSAmbmljLT5tYWNfY29udHJvbDsKKwljb25maWcgPSAmbmljLT5jb25maWc7CisKKwl2YWw2NCA9IHJlYWRxKCZiYXIwLT5yeF90cmFmZmljX2ludCk7CisJd3JpdGVxKHZhbDY0LCAmYmFyMC0+cnhfdHJhZmZpY19pbnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykKKwkJcnhfaW50cl9oYW5kbGVyKCZtYWNfY29udHJvbC0+cmluZ3NbaV0pOworCisJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgeworCQlpZiAoZmlsbF9yeF9idWZmZXJzKG5pYywgaSkgPT0gLUVOT01FTSkgeworCQkJREJHX1BSSU5UKEVSUl9EQkcsICIlczpPdXQgb2YgbWVtb3J5IiwgZGV2LT5uYW1lKTsKKwkJCURCR19QUklOVChFUlJfREJHLCAiIGluIFJ4IE5ldHBvbGwhIVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlhdG9taWNfZGVjKCZuaWMtPmlzcl9jbnQpOworCWVuYWJsZV9pcnEoZGV2LT5pcnEpOworCXJldHVybjsKK30KKyNlbmRpZgorCisvKioKICAqICByeF9pbnRyX2hhbmRsZXIgLSBSeCBpbnRlcnJ1cHQgaGFuZGxlcgogICogIEBuaWM6IGRldmljZSBwcml2YXRlIHZhcmlhYmxlLgogICogIERlc2NyaXB0aW9uOgpAQCAtMzkxNSw4ICszOTU5LDggQEAKIAl0eGRwLT5Db250cm9sXzEgPSAwOwogCXR4ZHAtPkNvbnRyb2xfMiA9IDA7CiAjaWZkZWYgTkVUSUZfRl9UU08KLQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOwotCWlmIChtc3MpIHsKKwltc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOworCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID09IFNLQl9HU09fVENQVjQpIHsKIAkJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9UQ1BfTFNPX0VOOwogCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1RDUF9MU09fTVNTKG1zcyk7CiAJfQpAQCAtMzkzNiwxMCArMzk4MCwxMCBAQAogCX0KIAogCWZyZ19sZW4gPSBza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47Ci0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dWZvX3NpemUpIHsKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9PSBTS0JfR1NPX1VEUFY0KSB7CiAJCWludCB1Zm9fc2l6ZTsKIAotCQl1Zm9fc2l6ZSA9IHNrYl9zaGluZm8oc2tiKS0+dWZvX3NpemU7CisJCXVmb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkJdWZvX3NpemUgJj0gfjc7CiAJCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfVUZPX0VOOwogCQl0eGRwLT5Db250cm9sXzEgfD0gVFhEX1VGT19NU1ModWZvX3NpemUpOwpAQCAtMzk2NSw3ICs0MDA5LDcgQEAKIAl0eGRwLT5Ib3N0X0NvbnRyb2wgPSAodW5zaWduZWQgbG9uZykgc2tiOwogCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfQlVGRkVSMF9TSVpFKGZyZ19sZW4pOwogCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dWZvX3NpemUpCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPT0gU0tCX0dTT19VRFBWNCkKIAkJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9VRk9fRU47CiAKIAlmcmdfY250ID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKQEAgLTM5ODAsMTIgKzQwMjQsMTIgQEAKIAkJICAgIChzcC0+cGRldiwgZnJhZy0+cGFnZSwgZnJhZy0+cGFnZV9vZmZzZXQsCiAJCSAgICAgZnJhZy0+c2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CiAJCXR4ZHAtPkNvbnRyb2xfMSA9IFRYRF9CVUZGRVIwX1NJWkUoZnJhZy0+c2l6ZSk7Ci0JCWlmIChza2Jfc2hpbmZvKHNrYiktPnVmb19zaXplKQorCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9PSBTS0JfR1NPX1VEUFY0KQogCQkJdHhkcC0+Q29udHJvbF8xIHw9IFRYRF9VRk9fRU47CiAJfQogCXR4ZHAtPkNvbnRyb2xfMSB8PSBUWERfR0FUSEVSX0NPREVfTEFTVDsKIAotCWlmIChza2Jfc2hpbmZvKHNrYiktPnVmb19zaXplKQorCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID09IFNLQl9HU09fVURQVjQpCiAJCWZyZ19jbnQrKzsgLyogYXMgVHhkMCB3YXMgdXNlZCBmb3IgaW5iYW5kIGhlYWRlciAqLwogCiAJdHhfZmlmbyA9IG1hY19jb250cm9sLT50eF9GSUZPX3N0YXJ0W3F1ZXVlXTsKQEAgLTM5OTksNyArNDA0Myw3IEBACiAJaWYgKG1zcykKIAkJdmFsNjQgfD0gVFhfRklGT19TUEVDSUFMX0ZVTkM7CiAjZW5kaWYKLQlpZiAoc2tiX3NoaW5mbyhza2IpLT51Zm9fc2l6ZSkKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9PSBTS0JfR1NPX1VEUFY0KQogCQl2YWw2NCB8PSBUWF9GSUZPX1NQRUNJQUxfRlVOQzsKIAl3cml0ZXEodmFsNjQsICZ0eF9maWZvLT5MaXN0X0NvbnRyb2wpOwogCkBAIC02OTY3LDYgKzcwMTEsMTAgQEAKIAlkZXYtPndlaWdodCA9IDMyOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCWRldi0+cG9sbF9jb250cm9sbGVyID0gczJpb19uZXRwb2xsOworI2VuZGlmCisKIAlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0lQX0NTVU07CiAJaWYgKHNwLT5oaWdoX2RtYV9mbGFnID09IFRSVUUpCiAJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYyBiL2RyaXZlcnMvbmV0L3NlZXE4MDA1LmMKaW5kZXggYmNlZjAzZi4uZWZkMGYyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2VlcTgwMDUuYworKysgYi9kcml2ZXJzL25ldC9zZWVxODAwNS5jCkBAIC0zOTYsOCArMzk2LDcgQEAKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAKIAlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCisJCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAJCQlyZXR1cm4gMDsKIAkJbGVuZ3RoID0gRVRIX1pMRU47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2lzMTkwLmMgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwppbmRleCAzMWRkM2YwLi5kZjM5ZjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zaXMxOTAuYworKysgYi9kcml2ZXJzL25ldC9zaXMxOTAuYwpAQCAtMTE1Niw4ICsxMTU2LDcgQEAKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBFVEhfWkxFTikpIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoIXNrYikgeworCQlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKSB7CiAJCQl0cC0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQkJZ290byBvdXQ7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrOThsaW4vc2tnZS5jIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKaW5kZXggMzhhMjZkZi4uZjNlZmJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2s5OGxpbi9za2dlLmMKQEAgLTE1MjUsNyArMTUyNSw3IEBACiAJKiogVGhpcyBpcyB0byByZXNvbHZlIGZhdWx0eSBwYWRkaW5nIGJ5IHRoZSBIVyB3aXRoIDB4YWEgYnl0ZXMuCiAJKi8KIAlpZiAoQnl0ZXNTZW5kIDwgQ19MRU5fRVRIRVJORVRfTUlOU0laRSkgewotCQlpZiAoKHBNZXNzYWdlID0gc2tiX3BhZHRvKHBNZXNzYWdlLCBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFKSkgPT0gTlVMTCkgeworCQlpZiAoc2tiX3BhZHRvKHBNZXNzYWdlLCBDX0xFTl9FVEhFUk5FVF9NSU5TSVpFKSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcFR4UG9ydC0+VHhEZXNSaW5nTG9jaywgRmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NrZ2UuYyBiL2RyaXZlcnMvbmV0L3NrZ2UuYwppbmRleCA1MzZkZDFjLi4xOWE0YTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za2dlLmMKKysrIGIvZHJpdmVycy9uZXQvc2tnZS5jCkBAIC0yMzEwLDggKzIzMTAsNyBAQAogCXU2NCBtYXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLQlpZiAoIXNrYikKKwlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCiAJaWYgKCFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmc2tnZS0+dHhfbG9jaywgZmxhZ3MpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc2t5Mi5jIGIvZHJpdmVycy9uZXQvc2t5Mi5jCmluZGV4IGZiYTFlNGQ0Li5kMzU3Nzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9za3kyLmMKKysrIGIvZHJpdmVycy9uZXQvc2t5Mi5jCkBAIC0xMTYwLDcgKzExNjAsNyBAQAogCWNvdW50ID0gc2l6ZW9mKGRtYV9hZGRyX3QpIC8gc2l6ZW9mKHUzMik7CiAJY291bnQgKz0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAqIGNvdW50OwogCi0JaWYgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpCisJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCiAJCSsrY291bnQ7CiAKIAlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fSFcpCkBAIC0xMjMyLDcgKzEyMzIsNyBAQAogCX0KIAogCS8qIENoZWNrIGZvciBUQ1AgU2VnbWVudGF0aW9uIE9mZmxvYWQgKi8KLQltc3MgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCW1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJaWYgKG1zcyAhPSAwKSB7CiAJCS8qIGp1c3QgZHJvcCB0aGUgcGFja2V0IGlmIG5vbi1saW5lYXIgZXhwYW5zaW9uIGZhaWxzICovCiAJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zbWM5MTk0LmMgYi9kcml2ZXJzL25ldC9zbWM5MTk0LmMKaW5kZXggNmNmMTZmMy4uOGIwMzIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc21jOTE5NC5jCisrKyBiL2RyaXZlcnMvbmV0L3NtYzkxOTQuYwpAQCAtNTIzLDggKzUyMyw3IEBACiAJbGVuZ3RoID0gc2tiLT5sZW47CiAKIAlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkgewogCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCQkJcmV0dXJuIDA7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NvbmljLmMgYi9kcml2ZXJzL25ldC9zb25pYy5jCmluZGV4IDkwYjgxOGEuLmNhYjBkZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3NvbmljLmMKKysrIGIvZHJpdmVycy9uZXQvc29uaWMuYwpAQCAtMjMxLDggKzIzMSw3IEBACiAKIAlsZW5ndGggPSBza2ItPmxlbjsKIAlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCisJCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAJCQlyZXR1cm4gMDsKIAkJbGVuZ3RoID0gRVRIX1pMRU47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYyBiL2RyaXZlcnMvbmV0L3N0YXJmaXJlLmMKaW5kZXggOWI3ODA1Yi4uYzE1OGVlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3RhcmZpcmUuYworKysgYi9kcml2ZXJzL25ldC9zdGFyZmlyZS5jCkBAIC0xMzQ5LDggKzEzNDksNyBAQAogCiAjaWYgZGVmaW5lZChaRVJPQ09QWSkgJiYgZGVmaW5lZChIQVNfQlJPS0VOX0ZJUk1XQVJFKQogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9IVykgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCAoc2tiLT5sZW4gKyBQQURESU5HX01BU0spICYgflBBRERJTkdfTUFTSyk7Ci0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKHNrYl9wYWR0byhza2IsIChza2ItPmxlbiArIFBBRERJTkdfTUFTSykgJiB+UEFERElOR19NQVNLKSkKIAkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJfQogI2VuZGlmIC8qIFpFUk9DT1BZICYmIEhBU19CUk9LRU5fRklSTVdBUkUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bjNsYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKaW5kZXggZDRjMDAwMi4uYTJmYWQ1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuM2xhbmNlLmMKQEAgLTU1LDcgKzU1LDcgQEAKIC8qIHN1bjMvNjAgYWRkci9pcnEgZm9yIHRoZSBsYW5jZSBjaGlwLiAgSWYgeW91ciBzdW4gaXMgZGlmZmVyZW50LAogICAgY2hhbmdlIHRoaXMuICovCiAjZGVmaW5lIExBTkNFX09CSU8gMHgxMjAwMDAKLSNkZWZpbmUgTEFOQ0VfSVJRIElSUTMKKyNkZWZpbmUgTEFOQ0VfSVJRIElSUV9BVVRPXzMKIAogLyogRGVidWcgbGV2ZWw6CiAgKiAgMCA9IHNpbGVudCwgcHJpbnQgb25seSBzZXJpb3VzIGVycm9ycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuYm1hYy5jIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5jCmluZGV4IGNmYWY0N2MuLjcxMjdmMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuYworKysgYi9kcml2ZXJzL25ldC9zdW5ibWFjLmMKQEAgLTcyLDggKzcyLDYgQEAKICNkZWZpbmUgRElSUSh4KQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgYmlnbWFjICpyb290X2JpZ21hY19kZXY7Ci0KICNkZWZpbmUgREVGQVVMVF9KQU1TSVpFICAgIDQgLyogVG9lIGphbSAqLwogCiAjZGVmaW5lIFFFQ19SRVNFVF9UUklFUyAyMDAKQEAgLTQ5MSw3ICs0ODksNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBiaWdtYWNfaW5pdChzdHJ1Y3QgYmlnbWFjICosIGludCk7CitzdGF0aWMgaW50IGJpZ21hY19pbml0X2h3KHN0cnVjdCBiaWdtYWMgKiwgaW50KTsKIAogc3RhdGljIGludCB0cnlfbmV4dF9wZXJtdXRhdGlvbihzdHJ1Y3QgYmlnbWFjICpicCwgdm9pZCBfX2lvbWVtICp0cmVncykKIHsKQEAgLTU1MSw3ICs1NDksNyBAQAogCQkJCWlmIChyZXQgPT0gLTEpIHsKIAkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogTGluayBkb3duLCBjYWJsZSBwcm9ibGVtP1xuIiwKIAkJCQkJICAgICAgIGJwLT5kZXYtPm5hbWUpOwotCQkJCQlyZXQgPSBiaWdtYWNfaW5pdChicCwgMCk7CisJCQkJCXJldCA9IGJpZ21hY19pbml0X2h3KGJwLCAwKTsKIAkJCQkJaWYgKHJldCkgewogCQkJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogRXJyb3IsIGNhbm5vdCByZS1pbml0IHRoZSAiCiAJCQkJCQkgICAgICAgIkJpZ01BQy5cbiIsIGJwLT5kZXYtPm5hbWUpOwpAQCAtNjIxLDcgKzYxOSw3IEBACiAJYWRkX3RpbWVyKCZicC0+YmlnbWFjX3RpbWVyKTsKIH0KIAotc3RhdGljIGludCBiaWdtYWNfaW5pdChzdHJ1Y3QgYmlnbWFjICpicCwgaW50IGZyb21faXJxKQorc3RhdGljIGludCBiaWdtYWNfaW5pdF9odyhzdHJ1Y3QgYmlnbWFjICpicCwgaW50IGZyb21faXJxKQogewogCXZvaWQgX19pb21lbSAqZ3JlZ3MgICAgICAgID0gYnAtPmdyZWdzOwogCXZvaWQgX19pb21lbSAqY3JlZ3MgICAgICAgID0gYnAtPmNyZWc7CkBAIC03NTIsNyArNzUwLDcgQEAKIAl9CiAKIAlwcmludGsoIiBSRVNFVFxuIik7Ci0JYmlnbWFjX2luaXQoYnAsIDEpOworCWJpZ21hY19pbml0X2h3KGJwLCAxKTsKIH0KIAogLyogQmlnTUFDIHRyYW5zbWl0IGNvbXBsZXRlIHNlcnZpY2Ugcm91dGluZXMuICovCkBAIC05MjYsNyArOTI0LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAJaW5pdF90aW1lcigmYnAtPmJpZ21hY190aW1lcik7Ci0JcmV0ID0gYmlnbWFjX2luaXQoYnAsIDApOworCXJldCA9IGJpZ21hY19pbml0X2h3KGJwLCAwKTsKIAlpZiAocmV0KQogCQlmcmVlX2lycShkZXYtPmlycSwgYnApOwogCXJldHVybiByZXQ7CkBAIC05NTAsNyArOTQ4LDcgQEAKIHsKIAlzdHJ1Y3QgYmlnbWFjICpicCA9IChzdHJ1Y3QgYmlnbWFjICopIGRldi0+cHJpdjsKIAotCWJpZ21hY19pbml0KGJwLCAwKTsKKwliaWdtYWNfaW5pdF9odyhicCwgMCk7CiAJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogfQogCkBAIC0xMTA0LDYgKzExMDIsOCBAQAogCWJwLT5xZWNfc2RldiA9IHFlY19zZGV2OwogCWJwLT5iaWdtYWNfc2RldiA9IHFlY19zZGV2LT5jaGlsZDsKIAorCVNFVF9ORVRERVZfREVWKGRldiwgJmJwLT5iaWdtYWNfc2Rldi0+b2ZkZXYuZGV2KTsKKwogCXNwaW5fbG9ja19pbml0KCZicC0+bG9jayk7CiAKIAkvKiBWZXJpZnkgdGhlIHJlZ2lzdGVycyB3ZSBleHBlY3QsIGFyZSBhY3R1YWxseSB0aGVyZS4gKi8KQEAgLTEyMjYsMTEgKzEyMjYsNyBAQAogCQlnb3RvIGZhaWxfYW5kX2NsZWFudXA7CiAJfQogCi0JLyogUHV0IHVzIGludG8gdGhlIGxpc3Qgb2YgaW5zdGFuY2VzIGF0dGFjaGVkIGZvciBsYXRlciBkcml2ZXIKLQkgKiBleGl0LgotCSAqLwotCWJwLT5uZXh0X21vZHVsZSA9IHJvb3RfYmlnbWFjX2RldjsKLQlyb290X2JpZ21hY19kZXYgPSBicDsKKwlkZXZfc2V0X2RydmRhdGEoJmJwLT5iaWdtYWNfc2Rldi0+b2ZkZXYuZGV2LCBicCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogQmlnTUFDIDEwMGJhc2VUIEV0aGVybmV0ICIsIGRldi0+bmFtZSk7CiAJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKQEAgLTEyNjYsNjkgKzEyNjIsNjggQEAKIC8qIFFFQyBjYW4gYmUgdGhlIHBhcmVudCBvZiBlaXRoZXIgUXVhZEV0aGVybmV0IG9yCiAgKiBhIEJpZ01BQy4gIFdlIHdhbnQgdGhlIGxhdHRlci4KICAqLwotc3RhdGljIGludCBfX2luaXQgYmlnbWFjX21hdGNoKHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJpZ21hY19zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCiB7Ci0Jc3RydWN0IHNidXNfZGV2ICpjaGlsZCA9IHNkZXYtPmNoaWxkOworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IGRldi0+bm9kZTsKIAotCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAicWVjIikgIT0gMCkKLQkJcmV0dXJuIDA7CisJaWYgKCFzdHJjbXAoZHAtPm5hbWUsICJiZSIpKQorCQlzZGV2ID0gc2Rldi0+cGFyZW50OwogCi0JaWYgKGNoaWxkID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JaWYgKHN0cmNtcChjaGlsZC0+cHJvbV9uYW1lLCAiYmUiKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOworCXJldHVybiBiaWdtYWNfZXRoZXJfaW5pdChzZGV2KTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYmlnbWFjX3Byb2JlKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBiaWdtYWNfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBzYnVzX2J1cyAqc2J1czsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBOVUxMOwotCXN0YXRpYyBpbnQgY2FsbGVkOwotCWludCBjYXJkcyA9IDAsIHY7CisJc3RydWN0IGJpZ21hYyAqYnAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGJwLT5kZXY7CiAKLQlyb290X2JpZ21hY19kZXYgPSBOVUxMOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKG5ldF9kZXYpOwogCi0JaWYgKGNhbGxlZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JY2FsbGVkKys7CisJc2J1c19pb3VubWFwKGJwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKKwlzYnVzX2lvdW5tYXAoYnAtPmJyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlzYnVzX2lvdW5tYXAoYnAtPnRyZWdzLCBUQ1ZSX1JFR19TSVpFKTsKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCisJCQkgICAgIFBBR0VfU0laRSwKKwkJCSAgICAgYnAtPmJtYWNfYmxvY2ssCisJCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7CiAKLQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLQkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7Ci0JCQlpZiAoYmlnbWFjX21hdGNoKHNkZXYpKSB7Ci0JCQkJY2FyZHMrKzsKLQkJCQlpZiAoKHYgPSBiaWdtYWNfZXRoZXJfaW5pdChzZGV2KSkpCi0JCQkJCXJldHVybiB2OwotCQkJfQotCQl9Ci0JfQotCWlmICghY2FyZHMpCi0JCXJldHVybiAtRU5PREVWOworCWZyZWVfbmV0ZGV2KG5ldF9kZXYpOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGJpZ21hY19jbGVhbnVwKHZvaWQpCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBiaWdtYWNfc2J1c19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAicWVjIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiYmUiLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiaWdtYWNfc2J1c19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGJpZ21hY19zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAic3VuYm1hYyIsCisJLm1hdGNoX3RhYmxlCT0gYmlnbWFjX3NidXNfbWF0Y2gsCisJLnByb2JlCQk9IGJpZ21hY19zYnVzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmlnbWFjX3NidXNfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGJpZ21hY19pbml0KHZvaWQpCiB7Ci0Jd2hpbGUgKHJvb3RfYmlnbWFjX2RldikgewotCQlzdHJ1Y3QgYmlnbWFjICpicCA9IHJvb3RfYmlnbWFjX2RldjsKLQkJc3RydWN0IGJpZ21hYyAqYnBfbnh0ID0gcm9vdF9iaWdtYWNfZGV2LT5uZXh0X21vZHVsZTsKLQotCQlzYnVzX2lvdW5tYXAoYnAtPmdyZWdzLCBHTE9CX1JFR19TSVpFKTsKLQkJc2J1c19pb3VubWFwKGJwLT5jcmVnLCBDUkVHX1JFR19TSVpFKTsKLQkJc2J1c19pb3VubWFwKGJwLT5icmVncywgQk1BQ19SRUdfU0laRSk7Ci0JCXNidXNfaW91bm1hcChicC0+dHJlZ3MsIFRDVlJfUkVHX1NJWkUpOwotCQlzYnVzX2ZyZWVfY29uc2lzdGVudChicC0+YmlnbWFjX3NkZXYsCi0JCQkJICAgICBQQUdFX1NJWkUsCi0JCQkJICAgICBicC0+Ym1hY19ibG9jaywKLQkJCQkgICAgIGJwLT5iYmxvY2tfZHZtYSk7Ci0KLQkJdW5yZWdpc3Rlcl9uZXRkZXYoYnAtPmRldik7Ci0JCWZyZWVfbmV0ZGV2KGJwLT5kZXYpOwotCQlyb290X2JpZ21hY19kZXYgPSBicF9ueHQ7Ci0JfQorCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmJpZ21hY19zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOwogfQogCi1tb2R1bGVfaW5pdChiaWdtYWNfcHJvYmUpOwotbW9kdWxlX2V4aXQoYmlnbWFjX2NsZWFudXApOworc3RhdGljIHZvaWQgX19leGl0IGJpZ21hY19leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmJpZ21hY19zYnVzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGJpZ21hY19pbml0KTsKK21vZHVsZV9leGl0KGJpZ21hY19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmJtYWMuaCBiL2RyaXZlcnMvbmV0L3N1bmJtYWMuaAppbmRleCBiMGRiYzUxLi5iNTYzZDNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5ibWFjLmgKKysrIGIvZHJpdmVycy9uZXQvc3VuYm1hYy5oCkBAIC0zMzIsNyArMzMyLDYgQEAKIAlzdHJ1Y3Qgc2J1c19kZXYJCSpxZWNfc2RldjsKIAlzdHJ1Y3Qgc2J1c19kZXYJCSpiaWdtYWNfc2RldjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotCXN0cnVjdCBiaWdtYWMJCSpuZXh0X21vZHVsZTsKIH07CiAKIC8qIFdlIHVzZSB0aGlzIHRvIGFjcXVpcmUgcmVjZWl2ZSBza2IncyB0aGF0IHdlIGNhbiBETUEgZGlyZWN0bHkgaW50by4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9zdW5kYW5jZS5jCmluZGV4IDYxZWVjNDYuLmYxM2IyYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmRhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvc3VuZGFuY2UuYwpAQCAtOTQsMTEgKzk0LDEzIEBACiAJVmVyc2lvbiBMSzEuMTAgKFBoaWxpcHBlIERlIE11eXRlciBwaGRtQG1hY3FlbC5iZSk6CiAJLSBNYWtlICd1bmJsb2NrIGludGVyZmFjZSBhZnRlciBUeCB1bmRlcnJ1bicgd29yawogCisJVmVyc2lvbiBMSzEuMTEgKFBlZHJvIEFsZWphbmRybyBMb3Blei1WYWxlbmNpYSBwYWxvcGV6diBhdCBnbWFpbC5jb20pOgorCS0gQWRkIHN1cHBvcnQgZm9yIElDIFBsdXMgQ29ycG9yYXRpb24gSVAxMDBBIGNoaXBzZXQKICovCiAKICNkZWZpbmUgRFJWX05BTUUJInN1bmRhbmNlIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wMStMSzEuMTAiCi0jZGVmaW5lIERSVl9SRUxEQVRFCSIyOC1PY3QtMjAwNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDErTEsxLjExIgorI2RlZmluZSBEUlZfUkVMREFURQkiMTQtSnVuLTIwMDYiCiAKIAogLyogVGhlIHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KQEAgLTI4Nyw2ICsyODksNyBAQAogCXsweDExODYsIDB4MTAwMiwgMHgxMTg2LCAweDEwNDAsIDAsIDAsIDN9LAogCXsweDExODYsIDB4MTAwMiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgNH0sCiAJezB4MTNGMCwgMHgwMjAxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCA1fSwKKwl7MHgxM0YwLCAweDAyMDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDZ9LAogCXswLH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc3VuZGFuY2VfcGNpX3RibCk7CkBAIC0zMDUsNiArMzA4LDcgQEAKIAl7IkQtTGluayBERkUtNTMwVFhTIEZBU1QgRXRoZXJuZXQgQWRhcHRlciJ9LAogCXsiRC1MaW5rIERMMTAwNTAtYmFzZWQgRkFTVCBFdGhlcm5ldCBBZGFwdGVyIn0sCiAJeyJTdW5kYW5jZSBUZWNobm9sb2d5IEFsdGEifSwKKwl7IklDIFBsdXMgQ29ycG9yYXRpb24gSVAxMDBBIEZBU1QgRXRoZXJuZXQgQWRhcHRlciJ9LAogCXtOVUxMLH0sCQkJLyogMCB0ZXJtaW5hdGVkIGxpc3QuICovCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCmluZGV4IDM4Y2QzMGMuLjUyNDg2NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCkBAIC0yODgwLDE3ICsyODgwLDIwIEBACiAjaWYgZGVmaW5lZChfX3NwYXJjX18pCiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBncC0+cGRldjsKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKLQlpbnQgbm9kZSA9IC0xOworCWludCB1c2VfaWRwcm9tID0gMTsKIAogCWlmIChwY3AgIT0gTlVMTCkgewotCQlub2RlID0gcGNwLT5wcm9tX25vZGU7Ci0JCWlmIChwcm9tX2dldHByb3BsZW4obm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikKLQkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKLQkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOwotCQllbHNlCi0JCQlub2RlID0gLTE7CisJCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisJCWludCBsZW47CisKKwkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShwY3AtPnByb21fbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKKwkJCQkgICAgICAgJmxlbik7CisJCWlmIChhZGRyICYmIGxlbiA9PSA2KSB7CisJCQl1c2VfaWRwcm9tID0gMDsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCA2KTsKKwkJfQogCX0KLQlpZiAobm9kZSA9PSAtMSkKKwlpZiAodXNlX2lkcHJvbSkKIAkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CiAjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfUE1BQykKIAl1bnNpZ25lZCBjaGFyICphZGRyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9zdW5obWUuYwppbmRleCBiZDVkMjY2Li5jMzNlYWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5obWUuYworKysgYi9kcml2ZXJzL25ldC9zdW5obWUuYwpAQCAtMSw5ICsxLDkgQEAKLS8qICRJZDogc3VuaG1lLmMsdiAxLjEyNCAyMDAyLzAxLzE1IDA2OjI1OjUxIGRhdmVtIEV4cCAkCi0gKiBzdW5obWUuYzogU3BhcmMgSE1FL0JpZ01hYyAxMC8xMDBiYXNlVCBoYWxmL2Z1bGwgZHVwbGV4IGF1dG8gc3dpdGNoaW5nLAorLyogc3VuaG1lLmM6IFNwYXJjIEhNRS9CaWdNYWMgMTAvMTAwYmFzZVQgaGFsZi9mdWxsIGR1cGxleCBhdXRvIHN3aXRjaGluZywKICAqICAgICAgICAgICBhdXRvIGNhcnJpZXIgZGV0ZWN0aW5nIGV0aGVybmV0IGRyaXZlci4gIEFsc28ga25vd24gYXMgdGhlCiAgKiAgICAgICAgICAgIkhhcHB5IE1lYWwgRXRoZXJuZXQiIGZvdW5kIG9uIFN1blN3aWZ0IFNCVVMgY2FyZHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk4LCAxOTk5LCAyMDAyLCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OCwgMTk5OSwgMjAwMiwgMjAwMywKKwkJIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICoKICAqIENoYW5nZXMgOgogICogMjAwMC8xMS8xMSBXaWxseSBUYXJyZWF1IDx3aWxseSBBVCBtZXRhLXgub3JnPgpAQCAtNDAsMTUgKzQwLDEzIEBACiAjaW5jbHVkZSA8YXNtL2RtYS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAotI2lmZGVmIF9fc3BhcmNfXworI2lmZGVmIENPTkZJR19TUEFSQwogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KICNpbmNsdWRlIDxhc20vc2J1cy5oPgogI2luY2x1ZGUgPGFzbS9vcGVucHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2F1eGlvLmg+Ci0jaWZuZGVmIF9fc3BhcmNfdjlfXwotI2luY2x1ZGUgPGFzbS9pby11bml0Lmg+Ci0jZW5kaWYKICNlbmRpZgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTU3LDcgKzU1LDcgQEAKIAogI2lmZGVmIENPTkZJR19QQ0kKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpZmRlZiBfX3NwYXJjX18KKyNpZmRlZiBDT05GSUdfU1BBUkMKICNpbmNsdWRlIDxhc20vcGJtLmg+CiAjZW5kaWYKICNlbmRpZgpAQCAtNjUsOSArNjMsOSBAQAogI2luY2x1ZGUgInN1bmhtZS5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJzdW5obWUiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIyLjAyIgotI2RlZmluZSBEUlZfUkVMREFURQkiOC8yNC8wMyIKLSNkZWZpbmUgRFJWX0FVVEhPUgkiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjMuMDAiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJKdW5lIDIzLCAyMDA2IgorI2RlZmluZSBEUlZfQVVUSE9SCSJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIgogCiBzdGF0aWMgY2hhciB2ZXJzaW9uW10gPQogCURSVl9OQU1FICIuYzp2IiBEUlZfVkVSU0lPTiAiICIgRFJWX1JFTERBVEUgIiAiIERSVl9BVVRIT1IgIlxuIjsKQEAgLTgzLDggKzgxLDYgQEAKIG1vZHVsZV9wYXJhbV9hcnJheShtYWNhZGRyLCBpbnQsIE5VTEwsIDApOwogTU9EVUxFX1BBUk1fREVTQyhtYWNhZGRyLCAiSGFwcHkgTWVhbCBNQUMgYWRkcmVzcyB0byBzZXQiKTsKIAotc3RhdGljIHN0cnVjdCBoYXBweV9tZWFsICpyb290X2hhcHB5X2RldjsKLQogI2lmZGVmIENPTkZJR19TQlVTCiBzdGF0aWMgc3RydWN0IHF1YXR0cm8gKnFmZV9zYnVzX2xpc3Q7CiAjZW5kaWYKQEAgLTE4MSwyNiArMTc3LDYgQEAKICNkZWZpbmUgREVGQVVMVF9JUEcyICAgICAgIDQgLyogRm9yIGFsbCBtb2RlcyAqLwogI2RlZmluZSBERUZBVUxUX0pBTVNJWkUgICAgNCAvKiBUb2UgamFtICovCiAKLSNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoTU9EVUxFKQotLyogVGhpcyBoYXBweV9wY2lfaWRzIGlzIGRlY2xhcmVkIF9faW5pdGRhdGEgYmVjYXVzZSBpdCBpcyBvbmx5IHVzZWQKLSAgIGFzIGFuIGFkdmlzb3J5IHRvIGRlcG1vZC4gIElmIHRoaXMgaXMgcG9ydGVkIHRvIHRoZSBuZXcgUENJIGludGVyZmFjZQotICAgd2hlcmUgaXQgY291bGQgYmUgcmVmZXJlbmNlZCBhdCBhbnkgdGltZSBkdWUgdG8gaG90IHBsdWdnaW5nLAotICAgdGhlIF9faW5pdGRhdGEgcmVmZXJlbmNlIHNob3VsZCBiZSByZW1vdmVkLiAqLwotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaGFwcHltZWFsX3BjaV9pZHNbXSA9IHsKLQl7Ci0JICAudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9TVU4sCi0JICAuZGV2aWNlCT0gUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMLAotCSAgLnN1YnZlbmRvcgk9IFBDSV9BTllfSUQsCi0JICAuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKLQl9LAotCXsgfQkJCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaGFwcHltZWFsX3BjaV9pZHMpOwotCi0jZW5kaWYKLQogLyogTk9URTogSW4gdGhlIGRlc2NyaXB0b3Igd3JpdGVzIG9uZSBfbXVzdF8gd3JpdGUgdGhlIGFkZHJlc3MKICAqCSBtZW1iZXIgX2ZpcnN0Xy4gIFRoZSBjYXJkIG11c3Qgbm90IGJlIGFsbG93ZWQgdG8gc2VlCiAgKgkgdGhlIHVwZGF0ZWQgZGVzY3JpcHRvciBmbGFncyB1bnRpbCB0aGUgYWRkcmVzcyBpcwpAQCAtMTYxMCw3ICsxNTg2LDcgQEAKIAlITUQoKCJoYXBweV9tZWFsX2luaXQ6IG9sZFslMDh4XSBidXJzdHM8IiwKIAkgICAgIGhtZV9yZWFkMzIoaHAsIGdyZWdzICsgR1JFR19DRkcpKSk7CiAKLSNpZm5kZWYgX19zcGFyY19fCisjaWZuZGVmIENPTkZJR19TUEFSQwogCS8qIEl0IGlzIGFsd2F5cyBQQ0kgYW5kIGNhbiBoYW5kbGUgNjRieXRlIGJ1cnN0cy4gKi8KIAlobWVfd3JpdGUzMihocCwgZ3JlZ3MgKyBHUkVHX0NGRywgR1JFR19DRkdfQlVSU1Q2NCk7CiAjZWxzZQpAQCAtMTY0Nyw3ICsxNjIzLDcgQEAKIAkJSE1EKCgiWFhYPiIpKTsKIAkJaG1lX3dyaXRlMzIoaHAsIGdyZWdzICsgR1JFR19DRkcsIDApOwogCX0KLSNlbmRpZiAvKiBfX3NwYXJjX18gKi8KKyNlbmRpZiAvKiBDT05GSUdfU1BBUkMgKi8KIAogCS8qIFR1cm4gb2ZmIGludGVycnVwdHMgd2UgZG8gbm90IHdhbnQgdG8gaGVhci4gKi8KIAlITUQoKCIsIGVuYWJsZSBnbG9iYWwgaW50ZXJydXB0cywgIikpOwpAQCAtMjU5MiwxNCArMjU2OCwxMCBAQAogICovCiBzdGF0aWMgc3RydWN0IHF1YXR0cm8gKiBfX2luaXQgcXVhdHRyb19zYnVzX2ZpbmQoc3RydWN0IHNidXNfZGV2ICpnb2FsX3NkZXYpCiB7Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzOwogCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKIAlzdHJ1Y3QgcXVhdHRybyAqcXA7CiAJaW50IGk7CiAKLQlpZiAocWZlX3NidXNfbGlzdCA9PSBOVUxMKQotCQlnb3RvIGZvdW5kOwotCiAJZm9yIChxcCA9IHFmZV9zYnVzX2xpc3Q7IHFwICE9IE5VTEw7IHFwID0gcXAtPm5leHQpIHsKIAkJZm9yIChpID0gMCwgc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKIAkJICAgICAoc2RldiAhPSBOVUxMKSAmJiAoaSA8IDQpOwpAQCAtMjYwOCwxNyArMjU4MCw3IEBACiAJCQkJcmV0dXJuIHFwOwogCQl9CiAJfQotCWZvcl9lYWNoX3NidXMoc2J1cykgewotCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJCWlmIChzZGV2ID09IGdvYWxfc2RldikKLQkJCQlnb3RvIGZvdW5kOwotCQl9Ci0JfQogCi0JLyogQ2Fubm90IGZpbmQgcXVhdHRybyBwYXJlbnQsIGZhaWwuICovCi0JcmV0dXJuIE5VTEw7Ci0KLWZvdW5kOgogCXFwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHF1YXR0cm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAocXAgIT0gTlVMTCkgewogCQlpbnQgaTsKQEAgLTI2NTUsNiArMjYxNywxNyBAQAogCQl9CiAJfQogfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcXVhdHRyb19zYnVzX2ZyZWVfaXJxcyh2b2lkKQoreworCXN0cnVjdCBxdWF0dHJvICpxcDsKKworCWZvciAocXAgPSBxZmVfc2J1c19saXN0OyBxcCAhPSBOVUxMOyBxcCA9IHFwLT5uZXh0KSB7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHFwLT5xdWF0dHJvX2RldjsKKworCQlmcmVlX2lycShzZGV2LT5pcnFzWzBdLCBxcCk7CisJfQorfQogI2VuZGlmIC8qIENPTkZJR19TQlVTICovCiAKICNpZmRlZiBDT05GSUdfUENJCkBAIC0yNjg5LDggKzI2NjIsOSBAQAogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAogI2lmZGVmIENPTkZJR19TQlVTCi1zdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3NidXNfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBpc19xZmUpCitzdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3NidXNfcHJvYmVfb25lKHN0cnVjdCBzYnVzX2RldiAqc2RldiwgaW50IGlzX3FmZSkKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gc2Rldi0+b2ZkZXYubm9kZTsKIAlzdHJ1Y3QgcXVhdHRybyAqcXAgPSBOVUxMOwogCXN0cnVjdCBoYXBweV9tZWFsICpocDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjcxMyw2ICsyNjg3LDcgQEAKIAlpZiAoIWRldikKIAkJZ290byBlcnJfb3V0OwogCVNFVF9NT0RVTEVfT1dORVIoZGV2KTsKKwlTRVRfTkVUREVWX0RFVihkZXYsICZzZGV2LT5vZmRldi5kZXYpOwogCiAJaWYgKGhtZV92ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQogCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwpAQCAtMjcyOCwxMyArMjcwMywxNiBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogCQkJZGV2LT5kZXZfYWRkcltpXSA9IG1hY2FkZHJbaV07CiAJCW1hY2FkZHJbNV0rKzsKLQl9IGVsc2UgaWYgKHFmZV9zbG90ICE9IC0xICYmCi0JCSAgIHByb21fZ2V0cHJvcGxlbihzZGV2LT5wcm9tX25vZGUsCi0JCQkJICAgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgewotCQlwcm9tX2dldHByb3BlcnR5KHNkZXYtPnByb21fbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKLQkJCQkgZGV2LT5kZXZfYWRkciwgNik7CiAJfSBlbHNlIHsKLQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGlkcHJvbS0+aWRfZXRoYWRkciwgNik7CisJCXVuc2lnbmVkIGNoYXIgKmFkZHI7CisJCWludCBsZW47CisKKwkJYWRkciA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImxvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CisKKwkJaWYgKHFmZV9zbG90ICE9IC0xICYmIGFkZHIgJiYgbGVuID09IDYpCisJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgNik7CisJCWVsc2UKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBpZHByb20tPmlkX2V0aGFkZHIsIDYpOwogCX0KIAogCWhwID0gZGV2LT5wcml2OwpAQCAtMjc0NSw5ICsyNzIzLDggQEAKIAogCWVyciA9IC1FTk9ERVY7CiAJaWYgKHNkZXYtPm51bV9yZWdpc3RlcnMgIT0gNSkgewotCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogRGV2aWNlIGRvZXMgbm90IGhhdmUgNSByZWdzLCBpdCBoYXMgJWQuXG4iLAorCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogRGV2aWNlIG5lZWRzIDUgcmVncywgaGFzICVkLlxuIiwKIAkJICAgICAgIHNkZXYtPm51bV9yZWdpc3RlcnMpOwotCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogV291bGQgeW91IGxpa2UgdGhhdCBmb3IgaGVyZSBvciB0byBnbz9cbiIpOwogCQlnb3RvIGVycl9vdXRfZnJlZV9uZXRkZXY7CiAJfQogCkBAIC0yNzYxLDM5ICsyNzM4LDM5IEBACiAJaHAtPmdyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVswXSwgMCwKIAkJCQkgR1JFR19SRUdfU0laRSwgIkhNRSBHbG9iYWwgUmVncyIpOwogCWlmICghaHAtPmdyZWdzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgZ2xvYmFsIHJlZ2lzdGVycy5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBnbG9iYWwgcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKIAl9CiAKIAlocC0+ZXR4cmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbMV0sIDAsCiAJCQkJICAgRVRYX1JFR19TSVpFLCAiSE1FIFRYIFJlZ3MiKTsKIAlpZiAoIWhwLT5ldHhyZWdzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEhhcHB5IE1lYWwgTUFDIFRyYW5zbWl0IHJlZ2lzdGVycy5cbiIpOworCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBNQUMgVFggcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAogCWhwLT5lcnhyZWdzID0gc2J1c19pb3JlbWFwKCZzZGV2LT5yZXNvdXJjZVsyXSwgMCwKIAkJCQkgICBFUlhfUkVHX1NJWkUsICJITUUgUlggUmVncyIpOwogCWlmICghaHAtPmVyeHJlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBNQUMgUmVjZWl2ZSByZWdpc3RlcnMuXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgTUFDIFJYIHJlZ2lzdGVycy5cbiIpOwogCQlnb3RvIGVycl9vdXRfaW91bm1hcDsKIAl9CiAKIAlocC0+YmlnbWFjcmVncyA9IHNidXNfaW9yZW1hcCgmc2Rldi0+cmVzb3VyY2VbM10sIDAsCiAJCQkJICAgICAgQk1BQ19SRUdfU0laRSwgIkhNRSBCSUdNQUMgUmVncyIpOwogCWlmICghaHAtPmJpZ21hY3JlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWw6IENhbm5vdCBtYXAgSGFwcHkgTWVhbCBCSUdNQUMgcmVnaXN0ZXJzLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIEJJR01BQyByZWdpc3RlcnMuXG4iKTsKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CiAJfQogCiAJaHAtPnRjdnJlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzRdLCAwLAogCQkJCSAgIFRDVlJfUkVHX1NJWkUsICJITUUgVHJhbmNlaXZlciBSZWdzIik7CiAJaWYgKCFocC0+dGN2cmVncykgewotCQlwcmludGsoS0VSTl9FUlIgImhhcHB5bWVhbDogQ2Fubm90IG1hcCBIYXBweSBNZWFsIFRyYW5jZWl2ZXIgcmVnaXN0ZXJzLlxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiaGFwcHltZWFsOiBDYW5ub3QgbWFwIFRDVlIgcmVnaXN0ZXJzLlxuIik7CiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCX0KIAotCWhwLT5obV9yZXZpc2lvbiA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5wcm9tX25vZGUsICJobS1yZXYiLCAweGZmKTsKKwlocC0+aG1fcmV2aXNpb24gPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJobS1yZXYiLCAweGZmKTsKIAlpZiAoaHAtPmhtX3JldmlzaW9uID09IDB4ZmYpCiAJCWhwLT5obV9yZXZpc2lvbiA9IDB4YTA7CiAKQEAgLTI4MDcsOCArMjc4NCw4IEBACiAJCWhwLT5oYXBweV9mbGFncyB8PSBIRkxBR19RVUFUVFJPOwogCiAJLyogR2V0IHRoZSBzdXBwb3J0ZWQgRFZNQSBidXJzdCBzaXplcyBmcm9tIG91ciBIYXBweSBTQlVTLiAqLwotCWhwLT5oYXBweV9idXJzdHMgPSBwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCi0JCQkJCSAgICAgICJidXJzdC1zaXplcyIsIDB4MDApOworCWhwLT5oYXBweV9idXJzdHMgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoc2Rldi0+YnVzLT5vZmRldi5ub2RlLAorCQkJCQkJICJidXJzdC1zaXplcyIsIDB4MDApOwogCiAJaHAtPmhhcHB5X2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCiAJCQkJCQlQQUdFX1NJWkUsCkBAIC0yODcxLDYgKzI4NDgsOCBAQAogCQlnb3RvIGVycl9vdXRfZnJlZV9jb25zaXN0ZW50OwogCX0KIAorCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBocCk7CisKIAlpZiAocWZlX3Nsb3QgIT0gLTEpCiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBRdWF0dHJvIEhNRSBzbG90ICVkIChTQlVTKSAxMC8xMDBiYXNlVCBFdGhlcm5ldCAiLAogCQkgICAgICAgZGV2LT5uYW1lLCBxZmVfc2xvdCk7CkBAIC0yODgzLDEyICsyODYyLDYgQEAKIAkJICAgICAgIGRldi0+ZGV2X2FkZHJbaV0sIGkgPT0gNSA/ICcgJyA6ICc6Jyk7CiAJcHJpbnRrKCJcbiIpOwogCi0JLyogV2UgYXJlIGhvbWUgZnJlZSBhdCB0aGlzIHBvaW50LCBsaW5rIHVzIGluIHRvIHRoZSBoYXBweQotCSAqIGRldmljZSBsaXN0LgotCSAqLwotCWhwLT5uZXh0X21vZHVsZSA9IHJvb3RfaGFwcHlfZGV2OwotCXJvb3RfaGFwcHlfZGV2ID0gaHA7Ci0KIAlyZXR1cm4gMDsKIAogZXJyX291dF9mcmVlX2NvbnNpc3RlbnQ6CkBAIC0yOTE4LDcgKzI4OTEsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUENJCi0jaWZuZGVmIF9fc3BhcmNfXworI2lmbmRlZiBDT05GSUdfU1BBUkMKIHN0YXRpYyBpbnQgaXNfcXVhdHRyb19wKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpidXNkZXYgPSBwZGV2LT5idXMtPnNlbGY7CkBAIC0zMDA2LDE0ICsyOTc5LDE0IEBACiAJZ2V0X3JhbmRvbV9ieXRlcygmZGV2X2FkZHJbM10sIDMpOwogCXJldHVybjsKIH0KLSNlbmRpZiAvKiAhKF9fc3BhcmNfXykgKi8KKyNlbmRpZiAvKiAhKENPTkZJR19TUEFSQykgKi8KIAotc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wY2lfaW5pdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhhcHB5X21lYWxfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJc3RydWN0IHF1YXR0cm8gKnFwID0gTlVMTDsKLSNpZmRlZiBfX3NwYXJjX18KKyNpZmRlZiBDT05GSUdfU1BBUkMKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwotCWludCBub2RlOwogI2VuZGlmCiAJc3RydWN0IGhhcHB5X21lYWwgKmhwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0zMDI0LDE1ICsyOTk3LDE0IEBACiAJaW50IGVycjsKIAogCS8qIE5vdyBtYWtlIHN1cmUgcGNpX2RldiBjb29raWUgaXMgdGhlcmUuICovCi0jaWZkZWYgX19zcGFyY19fCisjaWZkZWYgQ09ORklHX1NQQVJDCiAJcGNwID0gcGRldi0+c3lzZGF0YTsKLQlpZiAocGNwID09IE5VTEwgfHwgcGNwLT5wcm9tX25vZGUgPT0gLTEpIHsKKwlpZiAocGNwID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJoYXBweW1lYWwoUENJKTogU29tZSBQQ0kgZGV2aWNlIGluZm8gbWlzc2luZ1xuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlub2RlID0gcGNwLT5wcm9tX25vZGU7CiAJCi0JcHJvbV9nZXRzdHJpbmcobm9kZSwgIm5hbWUiLCBwcm9tX25hbWUsIHNpemVvZihwcm9tX25hbWUpKTsKKwlzdHJjcHkocHJvbV9uYW1lLCBwY3AtPnByb21fbm9kZS0+bmFtZSk7CiAjZWxzZQogCWlmIChpc19xdWF0dHJvX3AocGRldikpCiAJCXN0cmNweShwcm9tX25hbWUsICJTVU5XLHFmZSIpOwpAQCAtMzEwMywxMSArMzA3NSwxNSBAQAogCQkJZGV2LT5kZXZfYWRkcltpXSA9IG1hY2FkZHJbaV07CiAJCW1hY2FkZHJbNV0rKzsKIAl9IGVsc2UgewotI2lmZGVmIF9fc3BhcmNfXworI2lmZGVmIENPTkZJR19TUEFSQworCQl1bnNpZ25lZCBjaGFyICphZGRyOworCQlpbnQgbGVuOworCiAJCWlmIChxZmVfc2xvdCAhPSAtMSAmJgotCQkgICAgcHJvbV9nZXRwcm9wbGVuKG5vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIpID09IDYpIHsKLQkJCXByb21fZ2V0cHJvcGVydHkobm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKLQkJCQkJIGRldi0+ZGV2X2FkZHIsIDYpOworCQkgICAgKGFkZHIgPSBvZl9nZXRfcHJvcGVydHkocGNwLT5wcm9tX25vZGUsCisJCQkJCSAgICAibG9jYWwtbWFjLWFkZHJlc3MiLCAmbGVuKSkgIT0gTlVMTAorCQkgICAgJiYgbGVuID09IDYpIHsKKwkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLCA2KTsKIAkJfSBlbHNlIHsKIAkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBpZHByb20tPmlkX2V0aGFkZHIsIDYpOwogCQl9CkBAIC0zMTIzLDggKzMwOTksOCBAQAogCWhwLT5iaWdtYWNyZWdzID0gKGhwcmVnX2Jhc2UgKyAweDYwMDBVTCk7CiAJaHAtPnRjdnJlZ3MgICAgPSAoaHByZWdfYmFzZSArIDB4NzAwMFVMKTsKIAotI2lmZGVmIF9fc3BhcmNfXwotCWhwLT5obV9yZXZpc2lvbiA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiaG0tcmV2IiwgMHhmZik7CisjaWZkZWYgQ09ORklHX1NQQVJDCisJaHAtPmhtX3JldmlzaW9uID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHBjcC0+cHJvbV9ub2RlLCAiaG0tcmV2IiwgMHhmZik7CiAJaWYgKGhwLT5obV9yZXZpc2lvbiA9PSAweGZmKSB7CiAJCXVuc2lnbmVkIGNoYXIgcHJldjsKIApAQCAtMzE0OCw3ICszMTI0LDcgQEAKIAkvKiBBbmQgb2YgY291cnNlLCBpbmRpY2F0ZSB0aGlzIGlzIFBDSS4gKi8KIAlocC0+aGFwcHlfZmxhZ3MgfD0gSEZMQUdfUENJOwogCi0jaWZkZWYgX19zcGFyY19fCisjaWZkZWYgQ09ORklHX1NQQVJDCiAJLyogQXNzdW1lIFBDSSBoYXBweSBtZWFscyBjYW4gaGFuZGxlIGFsbCBidXJzdCBzaXplcy4gKi8KIAlocC0+aGFwcHlfYnVyc3RzID0gRE1BX0JVUlNUQklUUzsKICNlbmRpZgpAQCAtMzIxMSw2ICszMTg3LDggQEAKIAkJZ290byBlcnJfb3V0X2lvdW5tYXA7CiAJfQogCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGhwKTsKKwogCWlmICghcWZlX3Nsb3QpIHsKIAkJc3RydWN0IHBjaV9kZXYgKnFwZGV2ID0gcXAtPnF1YXR0cm9fZGV2OwogCkBAIC0zMjQwLDEyICszMjE4LDYgQEAKIAogCXByaW50aygiXG4iKTsKIAotCS8qIFdlIGFyZSBob21lIGZyZWUgYXQgdGhpcyBwb2ludCwgbGluayB1cyBpbiB0byB0aGUgaGFwcHkKLQkgKiBkZXZpY2UgbGlzdC4KLQkgKi8KLQlocC0+bmV4dF9tb2R1bGUgPSByb290X2hhcHB5X2RldjsKLQlyb290X2hhcHB5X2RldiA9IGhwOwotCiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfaW91bm1hcDoKQEAgLTMyNjMsMTQ2ICszMjM1LDU0IEBACiBlcnJfb3V0OgogCXJldHVybiBlcnI7CiB9Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR19TQlVTCi1zdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3NidXNfcHJvYmUodm9pZCkKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBoYXBweV9tZWFsX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzOwotCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKLQlpbnQgY2FyZHMgPSAwOwotCWNoYXIgbW9kZWxbMTI4XTsKKwlzdHJ1Y3QgaGFwcHlfbWVhbCAqaHAgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBocC0+ZGV2OwogCi0JZm9yX2VhY2hfc2J1cyhzYnVzKSB7Ci0JCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgewotCQkJY2hhciAqbmFtZSA9IHNkZXYtPnByb21fbmFtZTsKKwl1bnJlZ2lzdGVyX25ldGRldihuZXRfZGV2KTsKIAotCQkJaWYgKCFzdHJjbXAobmFtZSwgIlNVTlcsaG1lIikpIHsKLQkJCQljYXJkcysrOwotCQkJCXByb21fZ2V0c3RyaW5nKHNkZXYtPnByb21fbm9kZSwgIm1vZGVsIiwKLQkJCQkJICAgICAgIG1vZGVsLCBzaXplb2YobW9kZWwpKTsKLQkJCQlpZiAoIXN0cmNtcChtb2RlbCwgIlNVTlcsc2J1cy1xZmUiKSkKLQkJCQkJaGFwcHlfbWVhbF9zYnVzX2luaXQoc2RldiwgMSk7Ci0JCQkJZWxzZQotCQkJCQloYXBweV9tZWFsX3NidXNfaW5pdChzZGV2LCAwKTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAicWZlIikgfHwKLQkJCQkgICAhc3RyY21wKG5hbWUsICJTVU5XLHFmZSIpKSB7Ci0JCQkJY2FyZHMrKzsKLQkJCQloYXBweV9tZWFsX3NidXNfaW5pdChzZGV2LCAxKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoY2FyZHMgIT0gMCkKLQkJcXVhdHRyb19zYnVzX3JlZ2lzdGVyX2lycXMoKTsKLQlyZXR1cm4gY2FyZHM7Ci19Ci0jZW5kaWYKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkgICAgUEFHRV9TSVpFLAorCQkJICAgIGhwLT5oYXBweV9ibG9jaywKKwkJCSAgICBocC0+aGJsb2NrX2R2bWEpOworCWlvdW5tYXAoaHAtPmdyZWdzKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKGhwLT5oYXBweV9kZXYpOwogCi0jaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wY2lfcHJvYmUodm9pZCkKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7Ci0JaW50IGNhcmRzID0gMDsKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKIAotCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX1NVTiwKLQkJCQkgICAgICAgUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMLCBwZGV2KSkgIT0gTlVMTCkgewotCQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpCi0JCQljb250aW51ZTsKLQkJcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JCWNhcmRzKys7Ci0JCWhhcHB5X21lYWxfcGNpX2luaXQocGRldik7Ci0JfQotCXJldHVybiBjYXJkczsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBoYXBweV9tZWFsX3Byb2JlKHZvaWQpCi17Ci0Jc3RhdGljIGludCBjYWxsZWQgPSAwOwotCWludCBjYXJkczsKLQotCXJvb3RfaGFwcHlfZGV2ID0gTlVMTDsKLQotCWlmIChjYWxsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCWNhbGxlZCsrOwotCi0JY2FyZHMgPSAwOwotI2lmZGVmIENPTkZJR19TQlVTCi0JY2FyZHMgKz0gaGFwcHlfbWVhbF9zYnVzX3Byb2JlKCk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUENJCi0JY2FyZHMgKz0gaGFwcHlfbWVhbF9wY2lfcHJvYmUoKTsKLSNlbmRpZgotCWlmICghY2FyZHMpCi0JCXJldHVybiAtRU5PREVWOwotCXJldHVybiAwOworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKIH0KIAorc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGhhcHB5bWVhbF9wY2lfaWRzW10gPSB7CisJeworCSAgLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfU1VOLAorCSAgLmRldmljZQk9IFBDSV9ERVZJQ0VfSURfU1VOX0hBUFBZTUVBTCwKKwkgIC5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCSAgLnN1YmRldmljZQk9IFBDSV9BTllfSUQsCisJfSwKKwl7IH0JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKIAotc3RhdGljIHZvaWQgX19leGl0IGhhcHB5X21lYWxfY2xlYW51cF9tb2R1bGUodm9pZCkKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBoYXBweW1lYWxfcGNpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBobWVfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaG1lIiwKKwkuaWRfdGFibGUJPSBoYXBweW1lYWxfcGNpX2lkcywKKwkucHJvYmUJCT0gaGFwcHlfbWVhbF9wY2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChoYXBweV9tZWFsX3BjaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9wY2lfaW5pdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19TQlVTCi0Jc3RydWN0IHF1YXR0cm8gKmxhc3Rfc2Vlbl9xZmUgPSBOVUxMOwotI2VuZGlmCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmaG1lX3BjaV9kcml2ZXIpOworfQogCi0Jd2hpbGUgKHJvb3RfaGFwcHlfZGV2KSB7Ci0JCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IHJvb3RfaGFwcHlfZGV2OwotCQlzdHJ1Y3QgaGFwcHlfbWVhbCAqbmV4dCA9IHJvb3RfaGFwcHlfZGV2LT5uZXh0X21vZHVsZTsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGhwLT5kZXY7CitzdGF0aWMgdm9pZCBoYXBweV9tZWFsX3BjaV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZobWVfcGNpX2RyaXZlcik7CiAKLQkJLyogVW5yZWdpc3RlciBuZXRkZXYgYmVmb3JlIHVubWFwcGluZyByZWdpc3RlcnMgYXMgdGhpcwotCQkgKiBjYWxsIGNhbiBlbmQgdXAgdHJ5aW5nIHRvIGFjY2VzcyB0aG9zZSByZWdpc3RlcnMuCi0JCSAqLwotCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCi0jaWZkZWYgQ09ORklHX1NCVVMKLQkJaWYgKCEoaHAtPmhhcHB5X2ZsYWdzICYgSEZMQUdfUENJKSkgewotCQkJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1FVQVRUUk8pIHsKLQkJCQlpZiAoaHAtPnFmZV9wYXJlbnQgIT0gbGFzdF9zZWVuX3FmZSkgewotCQkJCQlmcmVlX2lycShkZXYtPmlycSwgaHAtPnFmZV9wYXJlbnQpOwotCQkJCQlsYXN0X3NlZW5fcWZlID0gaHAtPnFmZV9wYXJlbnQ7Ci0JCQkJfQotCQkJfQotCi0JCQlzYnVzX2lvdW5tYXAoaHAtPmdyZWdzLCBHUkVHX1JFR19TSVpFKTsKLQkJCXNidXNfaW91bm1hcChocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKLQkJCXNidXNfaW91bm1hcChocC0+ZXJ4cmVncywgRVJYX1JFR19TSVpFKTsKLQkJCXNidXNfaW91bm1hcChocC0+YmlnbWFjcmVncywgQk1BQ19SRUdfU0laRSk7Ci0JCQlzYnVzX2lvdW5tYXAoaHAtPnRjdnJlZ3MsIFRDVlJfUkVHX1NJWkUpOwotCQkJc2J1c19mcmVlX2NvbnNpc3RlbnQoaHAtPmhhcHB5X2RldiwKLQkJCQkJICAgICBQQUdFX1NJWkUsCi0JCQkJCSAgICAgaHAtPmhhcHB5X2Jsb2NrLAotCQkJCQkgICAgIGhwLT5oYmxvY2tfZHZtYSk7Ci0JCX0KLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQ0kKLQkJaWYgKChocC0+aGFwcHlfZmxhZ3MgJiBIRkxBR19QQ0kpKSB7Ci0JCQlwY2lfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCi0JCQkJCSAgICBQQUdFX1NJWkUsCi0JCQkJCSAgICBocC0+aGFwcHlfYmxvY2ssCi0JCQkJCSAgICBocC0+aGJsb2NrX2R2bWEpOwotCQkJaW91bm1hcChocC0+Z3JlZ3MpOwotCQkJcGNpX3JlbGVhc2VfcmVnaW9ucyhocC0+aGFwcHlfZGV2KTsKLQkJfQotI2VuZGlmCi0JCWZyZWVfbmV0ZGV2KGRldik7Ci0KLQkJcm9vdF9oYXBweV9kZXYgPSBuZXh0OwotCX0KLQotCS8qIE5vdyBjbGVhbnVwIHRoZSBxdWF0dHJvIGxpc3RzLiAqLwotI2lmZGVmIENPTkZJR19TQlVTCi0Jd2hpbGUgKHFmZV9zYnVzX2xpc3QpIHsKLQkJc3RydWN0IHF1YXR0cm8gKnFmZSA9IHFmZV9zYnVzX2xpc3Q7Ci0JCXN0cnVjdCBxdWF0dHJvICpuZXh0ID0gcWZlLT5uZXh0OwotCi0JCWtmcmVlKHFmZSk7Ci0KLQkJcWZlX3NidXNfbGlzdCA9IG5leHQ7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BDSQogCXdoaWxlIChxZmVfcGNpX2xpc3QpIHsKIAkJc3RydWN0IHF1YXR0cm8gKnFmZSA9IHFmZV9wY2lfbGlzdDsKIAkJc3RydWN0IHF1YXR0cm8gKm5leHQgPSBxZmUtPm5leHQ7CkBAIC0zNDExLDggKzMyOTEsMTMxIEBACiAKIAkJcWZlX3BjaV9saXN0ID0gbmV4dDsKIAl9Cit9CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NCVVMKK3N0YXRpYyBpbnQgX19kZXZpbml0IGhtZV9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwID0gZGV2LT5ub2RlOworCWNoYXIgKm1vZGVsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAibW9kZWwiLCBOVUxMKTsKKwlpbnQgaXNfcWZlID0gKG1hdGNoLT5kYXRhICE9IE5VTEwpOworCisJaWYgKCFpc19xZmUgJiYgbW9kZWwgJiYgIXN0cmNtcChtb2RlbCwgIlNVTlcsc2J1cy1xZmUiKSkKKwkJaXNfcWZlID0gMTsKKworCXJldHVybiBoYXBweV9tZWFsX3NidXNfcHJvYmVfb25lKHNkZXYsIGlzX3FmZSk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGhtZV9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhhcHB5X21lYWwgKmhwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBocC0+ZGV2OworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2UobmV0X2Rldik7CisKKwkvKiBYWFggcWZlIHBhcmVudCBpbnRlcnJ1cHQuLi4gKi8KKworCXNidXNfaW91bm1hcChocC0+Z3JlZ3MsIEdSRUdfUkVHX1NJWkUpOworCXNidXNfaW91bm1hcChocC0+ZXR4cmVncywgRVRYX1JFR19TSVpFKTsKKwlzYnVzX2lvdW5tYXAoaHAtPmVyeHJlZ3MsIEVSWF9SRUdfU0laRSk7CisJc2J1c19pb3VubWFwKGhwLT5iaWdtYWNyZWdzLCBCTUFDX1JFR19TSVpFKTsKKwlzYnVzX2lvdW5tYXAoaHAtPnRjdnJlZ3MsIFRDVlJfUkVHX1NJWkUpOworCXNidXNfZnJlZV9jb25zaXN0ZW50KGhwLT5oYXBweV9kZXYsCisJCQkgICAgIFBBR0VfU0laRSwKKwkJCSAgICAgaHAtPmhhcHB5X2Jsb2NrLAorCQkJICAgICBocC0+aGJsb2NrX2R2bWEpOworCisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBobWVfc2J1c19tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiU1VOVyxobWUiLAorCX0sCisJeworCQkubmFtZSA9ICJTVU5XLHFmZSIsCisJCS5kYXRhID0gKHZvaWQgKikgMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAicWZlIiwKKwkJLmRhdGEgPSAodm9pZCAqKSAxLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBobWVfc2J1c19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGhtZV9zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiaG1lIiwKKwkubWF0Y2hfdGFibGUJPSBobWVfc2J1c19tYXRjaCwKKwkucHJvYmUJCT0gaG1lX3NidXNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChobWVfc2J1c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGFwcHlfbWVhbF9zYnVzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZobWVfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKKwlpZiAoIWVycikKKwkJcXVhdHRyb19zYnVzX3JlZ2lzdGVyX2lycXMoKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGhhcHB5X21lYWxfc2J1c19leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmhtZV9zYnVzX2RyaXZlcik7CisJcXVhdHRyb19zYnVzX2ZyZWVfaXJxcygpOworCisJd2hpbGUgKHFmZV9zYnVzX2xpc3QpIHsKKwkJc3RydWN0IHF1YXR0cm8gKnFmZSA9IHFmZV9zYnVzX2xpc3Q7CisJCXN0cnVjdCBxdWF0dHJvICpuZXh0ID0gcWZlLT5uZXh0OworCisJCWtmcmVlKHFmZSk7CisKKwkJcWZlX3NidXNfbGlzdCA9IG5leHQ7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGhhcHB5X21lYWxfcHJvYmUodm9pZCkKK3sKKwlpbnQgZXJyID0gMDsKKworI2lmZGVmIENPTkZJR19TQlVTCisJZXJyID0gaGFwcHlfbWVhbF9zYnVzX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwlpZiAoIWVycikgeworCQllcnIgPSBoYXBweV9tZWFsX3BjaV9pbml0KCk7CisjaWZkZWYgQ09ORklHX1NCVVMKKwkJaWYgKGVycikKKwkJCWhhcHB5X21lYWxfc2J1c19leGl0KCk7CisjZW5kaWYKKwl9CisjZW5kaWYKKworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGhhcHB5X21lYWxfZXhpdCh2b2lkKQoreworI2lmZGVmIENPTkZJR19TQlVTCisJaGFwcHlfbWVhbF9zYnVzX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwloYXBweV9tZWFsX3BjaV9leGl0KCk7CiAjZW5kaWYKIH0KIAogbW9kdWxlX2luaXQoaGFwcHlfbWVhbF9wcm9iZSk7Ci1tb2R1bGVfZXhpdChoYXBweV9tZWFsX2NsZWFudXBfbW9kdWxlKTsKK21vZHVsZV9leGl0KGhhcHB5X21lYWxfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5obWUuaCBiL2RyaXZlcnMvbmV0L3N1bmhtZS5oCmluZGV4IDM0ZTlmOTUuLjliN2NjYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmhtZS5oCisrKyBiL2RyaXZlcnMvbmV0L3N1bmhtZS5oCkBAIC00NjEsNyArNDYxLDYgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZQkgKmRldjsJCS8qIEJhY2twb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAqLwogCXN0cnVjdCBxdWF0dHJvCQkgKnFmZV9wYXJlbnQ7CS8qIEZvciBRdWF0dHJvIGNhcmRzICAgICAgICAgICAgICAgICAqLwogCWludAkJCSAgcWZlX2VudDsJLyogV2hpY2ggaW5zdGFuY2Ugb24gcXVhdHRybyAgICAgICAgICovCi0Jc3RydWN0IGhhcHB5X21lYWwgICAgICAgICAqbmV4dF9tb2R1bGU7CiB9OwogCiAvKiBIZXJlIGFyZSB0aGUgaGFwcHkgZmxhZ3MuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5sYW5jZS5jIGIvZHJpdmVycy9uZXQvc3VubGFuY2UuYwppbmRleCA2MzgxMjQzLi4yYzIzOWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5sYW5jZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmxhbmNlLmMKQEAgLTI2Niw3ICsyNjYsNiBAQAogCWNoYXIJICAgICAgIAkgICAgICAgKm5hbWU7CiAJZG1hX2FkZHJfdAkJaW5pdF9ibG9ja19kdm1hOwogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgKmRldjsJCSAgLyogQmFja3BvaW50ZXIJKi8KLQlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAgICpuZXh0X21vZHVsZTsKIAlzdHJ1Y3Qgc2J1c19kZXYJICAgICAgICpzZGV2OwogCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIG11bHRpY2FzdF90aW1lcjsKIH07CkBAIC0yOTgsOCArMjk3LDYgQEAKIAogI2RlZmluZSBMQU5DRV9BRERSKHgpICgobG9uZykoeCkgJiB+MHhmZjAwMDAwMCkKIAotc3RhdGljIHN0cnVjdCBsYW5jZV9wcml2YXRlICpyb290X2xhbmNlX2RldjsKLQogLyogTG9hZCB0aGUgQ1NSIHJlZ2lzdGVycyAqLwogc3RhdGljIHZvaWQgbG9hZF9jc3JzKHN0cnVjdCBsYW5jZV9wcml2YXRlICpscCkKIHsKQEAgLTEzMjcsOSArMTMyNCw5IEBACiAJLmdldF9saW5rCQk9IHNwYXJjX2xhbmNlX2dldF9saW5rLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfaW5pdChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsCi0JCQkJICAgc3RydWN0IHNidXNfZG1hICpsZWRtYSwKLQkJCQkgICBzdHJ1Y3Qgc2J1c19kZXYgKmxlYnVmZmVyKQorc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfcHJvYmVfb25lKHN0cnVjdCBzYnVzX2RldiAqc2RldiwKKwkJCQkJc3RydWN0IHNidXNfZG1hICpsZWRtYSwKKwkJCQkJc3RydWN0IHNidXNfZGV2ICpsZWJ1ZmZlcikKIHsKIAlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0xNDczLDYgKzE0NzAsNyBAQAogCiAJbHAtPmRldiA9IGRldjsKIAlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmc2Rldi0+b2ZkZXYuZGV2KTsKIAlkZXYtPm9wZW4gPSAmbGFuY2Vfb3BlbjsKIAlkZXYtPnN0b3AgPSAmbGFuY2VfY2xvc2U7CiAJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSAmbGFuY2Vfc3RhcnRfeG1pdDsKQEAgLTE1MDAsOCArMTQ5OCw3IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlscC0+bmV4dF9tb2R1bGUgPSByb290X2xhbmNlX2RldjsKLQlyb290X2xhbmNlX2RldiA9IGxwOworCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBscCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogTEFOQ0UgIiwgZGV2LT5uYW1lKTsKIApAQCAtMTUzNiw4OCArMTUzMywxMTIgQEAKICNpbmNsdWRlIDxhc20vbWFjaGluZXMuaD4KIAogLyogRmluZCBhbGwgdGhlIGxhbmNlIGNhcmRzIG9uIHRoZSBzeXN0ZW0gYW5kIGluaXRpYWxpemUgdGhlbSAqLwotc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfcHJvYmUodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgc3VuNF9zZGV2Oworc3RhdGljIGludCBfX2luaXQgc3BhcmNfbGFuY2VfaW5pdCh2b2lkKQogewotCXN0YXRpYyBzdHJ1Y3Qgc2J1c19kZXYgc2RldjsKLQlzdGF0aWMgaW50IGNhbGxlZDsKLQotCXJvb3RfbGFuY2VfZGV2ID0gTlVMTDsKLQotCWlmIChjYWxsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCWNhbGxlZCsrOwotCiAJaWYgKChpZHByb20tPmlkX21hY2h0eXBlID09IChTTV9TVU40fFNNXzRfMzMwKSkgfHwKIAkgICAgKGlkcHJvbS0+aWRfbWFjaHR5cGUgPT0gKFNNX1NVTjR8U01fNF80NzApKSkgewotCQltZW1zZXQoJnNkZXYsIDAsIHNpemVvZihzZGV2KSk7Ci0JCXNkZXYucmVnX2FkZHJzWzBdLnBoeXNfYWRkciA9IHN1bjRfZXRoX3BoeXNhZGRyOwotCQlzZGV2LmlycXNbMF0gPSA2OwotCQlyZXR1cm4gc3BhcmNfbGFuY2VfaW5pdCgmc2RldiwgTlVMTCwgTlVMTCk7CisJCW1lbXNldCgmc3VuNF9zZGV2LCAwLCBzaXplb2Yoc2RldikpOworCQlzdW40X3NkZXYucmVnX2FkZHJzWzBdLnBoeXNfYWRkciA9IHN1bjRfZXRoX3BoeXNhZGRyOworCQlzdW40X3NkZXYuaXJxc1swXSA9IDY7CisJCXJldHVybiBzcGFyY19sYW5jZV9wcm9iZV9vbmUoJnN1bjRfc2RldiwgTlVMTCwgTlVMTCk7CiAJfQogCXJldHVybiAtRU5PREVWOwogfQogCitzdGF0aWMgaW50IF9fZXhpdCBzdW5sYW5jZV9zdW40X3JlbW92ZSh2b2lkKQoreworCXN0cnVjdCBsYW5jZV9wcml2YXRlICpscCA9IGRldl9nZXRfZHJ2ZGF0YSgmc3VuNF9zZGV2LT5kZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gbHAtPmRldjsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKG5ldF9kZXYpOworCisJbGFuY2VfZnJlZV9od3Jlc291cmNlcyhyb290X2xhbmNlX2Rldik7CisKKwlmcmVlX25ldGRldihuZXRfZGV2KTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc3VuNF9zZGV2LT5kZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKICNlbHNlIC8qICFDT05GSUdfU1VONCAqLwogCi0vKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCi1zdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9wcm9iZSh2b2lkKQorc3RhdGljIGludCBfX2RldmluaXQgc3VubGFuY2Vfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBzYnVzX2J1cyAqYnVzOwotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IE5VTEw7Ci0Jc3RydWN0IHNidXNfZG1hICpsZWRtYSA9IE5VTEw7Ci0Jc3RhdGljIGludCBjYWxsZWQ7Ci0JaW50IGNhcmRzID0gMCwgdjsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisJaW50IGVycjsKIAotCXJvb3RfbGFuY2VfZGV2ID0gTlVMTDsKKwlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImxlIikpIHsKKwkJZXJyID0gc3BhcmNfbGFuY2VfcHJvYmVfb25lKHNkZXYsIE5VTEwsIE5VTEwpOworCX0gZWxzZSBpZiAoIXN0cmNtcChkcC0+bmFtZSwgImxlZG1hIikpIHsKKwkJc3RydWN0IHNidXNfZG1hICpsZWRtYSA9IGZpbmRfbGVkbWEoc2Rldik7CiAKLQlpZiAoY2FsbGVkKQotCQlyZXR1cm4gLUVOT0RFVjsKLQljYWxsZWQrKzsKKwkJZXJyID0gc3BhcmNfbGFuY2VfcHJvYmVfb25lKHNkZXYtPmNoaWxkLCBsZWRtYSwgTlVMTCk7CisJfSBlbHNlIHsKKwkJQlVHX09OKHN0cmNtcChkcC0+bmFtZSwgImxlYnVmZmVyIikpOwogCi0JZm9yX2VhY2hfc2J1cyAoYnVzKSB7Ci0JCWZvcl9lYWNoX3NidXNkZXYgKHNkZXYsIGJ1cykgewotCQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJsZSIpID09IDApIHsKLQkJCQljYXJkcysrOwotCQkJCWlmICgodiA9IHNwYXJjX2xhbmNlX2luaXQoc2RldiwgTlVMTCwgTlVMTCkpKQotCQkJCQlyZXR1cm4gdjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAibGVkbWEiKSA9PSAwKSB7Ci0JCQkJY2FyZHMrKzsKLQkJCQlsZWRtYSA9IGZpbmRfbGVkbWEoc2Rldik7Ci0JCQkJaWYgKCh2ID0gc3BhcmNfbGFuY2VfaW5pdChzZGV2LT5jaGlsZCwKLQkJCQkJCQkgIGxlZG1hLCBOVUxMKSkpCi0JCQkJCXJldHVybiB2OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJsZWJ1ZmZlciIpID09IDApewotCQkJCWNhcmRzKys7Ci0JCQkJaWYgKCh2ID0gc3BhcmNfbGFuY2VfaW5pdChzZGV2LT5jaGlsZCwKLQkJCQkJCQkgIE5VTEwsIHNkZXYpKSkKLQkJCQkJcmV0dXJuIHY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gLyogZm9yIGVhY2ggc2J1c2RldiAqLwotCX0gLyogZm9yIGVhY2ggc2J1cyAqLwotCWlmICghY2FyZHMpCi0JCXJldHVybiAtRU5PREVWOworCQllcnIgPSBzcGFyY19sYW5jZV9wcm9iZV9vbmUoc2Rldi0+Y2hpbGQsIE5VTEwsIHNkZXYpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHN1bmxhbmNlX3NidXNfcmVtb3ZlKHN0cnVjdCBvZl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbGFuY2VfcHJpdmF0ZSAqbHAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IGxwLT5kZXY7CisKKwl1bnJlZ2lzdGVyX25ldGRldmljZShuZXRfZGV2KTsKKworCWxhbmNlX2ZyZWVfaHdyZXNvdXJjZXMobHApOworCisJZnJlZV9uZXRkZXYobmV0X2Rldik7CisKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwogCXJldHVybiAwOwogfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdW5sYW5jZV9zYnVzX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJsZSIsCisJfSwKKwl7CisJCS5uYW1lID0gImxlZG1hIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAibGVidWZmZXIiLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzdW5sYW5jZV9zYnVzX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgc3VubGFuY2Vfc2J1c19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInN1bmxhbmNlIiwKKwkubWF0Y2hfdGFibGUJPSBzdW5sYW5jZV9zYnVzX21hdGNoLAorCS5wcm9iZQkJPSBzdW5sYW5jZV9zYnVzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3VubGFuY2Vfc2J1c19yZW1vdmUpLAorfTsKKworCisvKiBGaW5kIGFsbCB0aGUgbGFuY2UgY2FyZHMgb24gdGhlIHN5c3RlbSBhbmQgaW5pdGlhbGl6ZSB0aGVtICovCitzdGF0aWMgaW50IF9faW5pdCBzcGFyY19sYW5jZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmc3VubGFuY2Vfc2J1c19kcml2ZXIsICZzYnVzX2J1c190eXBlKTsKK30KICNlbmRpZiAvKiAhQ09ORklHX1NVTjQgKi8KIAotc3RhdGljIHZvaWQgX19leGl0IHNwYXJjX2xhbmNlX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBzcGFyY19sYW5jZV9leGl0KHZvaWQpCiB7Ci0Jc3RydWN0IGxhbmNlX3ByaXZhdGUgKmxwOwotCi0Jd2hpbGUgKHJvb3RfbGFuY2VfZGV2KSB7Ci0JCWxwID0gcm9vdF9sYW5jZV9kZXYtPm5leHRfbW9kdWxlOwotCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KHJvb3RfbGFuY2VfZGV2LT5kZXYpOwotCQlsYW5jZV9mcmVlX2h3cmVzb3VyY2VzKHJvb3RfbGFuY2VfZGV2KTsKLQkJZnJlZV9uZXRkZXYocm9vdF9sYW5jZV9kZXYtPmRldik7Ci0JCXJvb3RfbGFuY2VfZGV2ID0gbHA7Ci0JfQorI2lmZGVmIENPTkZJR19TVU40CisJc3VubGFuY2Vfc3VuNF9yZW1vdmUoKTsKKyNlbHNlCisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnN1bmxhbmNlX3NidXNfZHJpdmVyKTsKKyNlbmRpZgogfQogCi1tb2R1bGVfaW5pdChzcGFyY19sYW5jZV9wcm9iZSk7Ci1tb2R1bGVfZXhpdChzcGFyY19sYW5jZV9jbGVhbnVwKTsKK21vZHVsZV9pbml0KHNwYXJjX2xhbmNlX2luaXQpOworbW9kdWxlX2V4aXQoc3BhcmNfbGFuY2VfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5xZS5jIGIvZHJpdmVycy9uZXQvc3VucWUuYwppbmRleCAxZjIzMjNiLi45ZGE2ZDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9zdW5xZS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bnFlLmMKQEAgLTEsMTAgKzEsOSBAQAotLyogJElkOiBzdW5xZS5jLHYgMS41NSAyMDAyLzAxLzE1IDA2OjQ4OjU1IGRhdmVtIEV4cCAkCi0gKiBzdW5xZS5jOiBTcGFyYyBRdWFkRXRoZXJuZXQgMTBiYXNlVCBTQlVTIGNhcmQgZHJpdmVyLgorLyogc3VucWUuYzogU3BhcmMgUXVhZEV0aGVybmV0IDEwYmFzZVQgU0JVUyBjYXJkIGRyaXZlci4KICAqICAgICAgICAgIE9uY2UgYWdhaW4gSSBhbSBvdXQgdG8gcHJvdmUgdGhhdCBldmVyeSBldGhlcm5ldAogICogICAgICAgICAgY29udHJvbGxlciBvdXQgdGhlcmUgY2FuIGJlIG1vc3QgZWZmaWNpZW50bHkgcHJvZ3JhbW1lZAogICogICAgICAgICAgaWYgeW91IG1ha2UgaXQgbG9vayBsaWtlIGEgTEFOQ0UuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk5LCAyMDAzIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgMTk5OSwgMjAwMywgMjAwNiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNDEsOSArNDAsOSBAQAogI2luY2x1ZGUgInN1bnFlLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJInN1bnFlIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMy4wIgotI2RlZmluZSBEUlZfUkVMREFURQkiOC8yNC8wMyIKLSNkZWZpbmUgRFJWX0FVVEhPUgkiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUByZWRoYXQuY29tKSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjQuMCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkp1bmUgMjMsIDIwMDYiCisjZGVmaW5lIERSVl9BVVRIT1IJIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkiCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9CiAJRFJWX05BTUUgIi5jOnYiIERSVl9WRVJTSU9OICIgIiBEUlZfUkVMREFURSAiICIgRFJWX0FVVEhPUiAiXG4iOwpAQCAtNzU1LDI5OCArNzU0LDI2OSBAQAogCQkgICAgcWVjcC0+Z3JlZ3MgKyBHTE9CX1JTSVpFKTsKIH0KIAotLyogRm91ciBRRSdzIHBlciBRRUMgY2FyZC4gKi8KLXN0YXRpYyBpbnQgX19pbml0IHFlY19ldGhlcl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3N0YXRpYyB1OCBfX2luaXQgcWVjX2dldF9idXJzdChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCXN0YXRpYyB1bnNpZ25lZCB2ZXJzaW9uX3ByaW50ZWQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnFlX2RldnNbNF07Ci0Jc3RydWN0IHN1bnFlICpxZXBzWzRdOwotCXN0cnVjdCBzYnVzX2RldiAqcWVzZGV2c1s0XTsKLQlzdHJ1Y3Qgc2J1c19kZXYgKmNoaWxkOwotCXN0cnVjdCBzdW5xZWMgKnFlY3AgPSBOVUxMOwogCXU4IGJzaXplcywgYnNpemVzX21vcmU7Ci0JaW50IGksIGosIHJlcyA9IC1FTk9NRU07CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXFlX2RldnNbaV0gPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHN1bnFlKSk7Ci0JCWlmICghcWVfZGV2c1tpXSkKLQkJCWdvdG8gb3V0OwotCX0KLQotCWlmICh2ZXJzaW9uX3ByaW50ZWQrKyA9PSAwKQotCQlwcmludGsoS0VSTl9JTkZPICIlcyIsIHZlcnNpb24pOwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlxZXBzW2ldID0gKHN0cnVjdCBzdW5xZSAqKSBxZV9kZXZzW2ldLT5wcml2OwotCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQotCQkJcWVfZGV2c1tpXS0+ZGV2X2FkZHJbal0gPSBpZHByb20tPmlkX2V0aGFkZHJbal07Ci0JCXFlcHNbaV0tPmNoYW5uZWwgPSBpOwotCQlzcGluX2xvY2tfaW5pdCgmcWVwc1tpXS0+bG9jayk7Ci0JfQotCi0JcWVjcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdW5xZWMpLCBHRlBfS0VSTkVMKTsKLQlpZiAocWVjcCA9PSBOVUxMKQotCQlnb3RvIG91dDE7Ci0JcWVjcC0+cWVjX3NkZXYgPSBzZGV2OwotCi0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlxZWNwLT5xZXNbaV0gPSBxZXBzW2ldOwotCQlxZXBzW2ldLT5kZXYgPSBxZV9kZXZzW2ldOwotCQlxZXBzW2ldLT5wYXJlbnQgPSBxZWNwOwotCX0KLQotCXJlcyA9IC1FTk9ERVY7Ci0KLQlmb3IgKGkgPSAwLCBjaGlsZCA9IHNkZXYtPmNoaWxkOyBpIDwgNDsgaSsrLCBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7Ci0JCS8qIExpbmsgaW4gY2hhbm5lbCAqLwotCQlqID0gcHJvbV9nZXRpbnRkZWZhdWx0KGNoaWxkLT5wcm9tX25vZGUsICJjaGFubmVsIyIsIC0xKTsKLQkJaWYgKGogPT0gLTEpCi0JCQlnb3RvIG91dDI7Ci0JCXFlc2RldnNbal0gPSBjaGlsZDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQlxZXBzW2ldLT5xZV9zZGV2ID0gcWVzZGV2c1tpXTsKLQotCS8qIE5vdyBtYXAgaW4gdGhlIHJlZ2lzdGVycywgUUVDIGdsb2JhbHMgZmlyc3QuICovCi0JcWVjcC0+Z3JlZ3MgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAotCQkJCSAgIEdMT0JfUkVHX1NJWkUsICJRRUMgR2xvYmFsIFJlZ2lzdGVycyIpOwotCWlmICghcWVjcC0+Z3JlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbm5vdCBtYXAgUUVDIGdsb2JhbCByZWdpc3RlcnMuXG4iKTsKLQkJZ290byBvdXQyOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGUgUUVDIGlzIGluIE1BQ0UgbW9kZS4gKi8KLQlpZiAoKHNidXNfcmVhZGwocWVjcC0+Z3JlZ3MgKyBHTE9CX0NUUkwpICYgMHhmMDAwMDAwMCkgIT0gR0xPQl9DVFJMX01NT0RFKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBBSUVFRSwgUUVDIGlzIG5vdCBpbiBNQUNFIG1vZGUhXG4iKTsKLQkJZ290byBvdXQzOwotCX0KLQotCS8qIFJlc2V0IHRoZSBRRUMuICovCi0JaWYgKHFlY19nbG9iYWxfcmVzZXQocWVjcC0+Z3JlZ3MpKQotCQlnb3RvIG91dDM7Ci0KLQkvKiBGaW5kIGFuZCBzZXQgdGhlIGJ1cnN0IHNpemVzIGZvciB0aGUgUUVDLCBzaW5jZSBpdCBkb2VzCi0JICogdGhlIGFjdHVhbCBkbWEgZm9yIGFsbCA0IGNoYW5uZWxzLgorCS8qIEZpbmQgYW5kIHNldCB0aGUgYnVyc3Qgc2l6ZXMgZm9yIHRoZSBRRUMsIHNpbmNlIGl0CisJICogZG9lcyB0aGUgYWN0dWFsIGRtYSBmb3IgYWxsIDQgY2hhbm5lbHMuCiAJICovCi0JYnNpemVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KHNkZXYtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJYnNpemVzID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KGRwLCAiYnVyc3Qtc2l6ZXMiLCAweGZmKTsKIAlic2l6ZXMgJj0gMHhmZjsKLQlic2l6ZXNfbW9yZSA9IHByb21fZ2V0aW50ZGVmYXVsdChzZGV2LT5idXMtPnByb21fbm9kZSwgImJ1cnN0LXNpemVzIiwgMHhmZik7CisJYnNpemVzX21vcmUgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAtPnBhcmVudCwgImJ1cnN0LXNpemVzIiwgMHhmZik7CiAKIAlpZiAoYnNpemVzX21vcmUgIT0gMHhmZikKIAkJYnNpemVzICY9IGJzaXplc19tb3JlOwogCWlmIChic2l6ZXMgPT0gMHhmZiB8fCAoYnNpemVzICYgRE1BX0JVUlNUMTYpID09IDAgfHwKLQkgICAoYnNpemVzICYgRE1BX0JVUlNUMzIpPT0wKQorCSAgICAoYnNpemVzICYgRE1BX0JVUlNUMzIpPT0wKQogCQlic2l6ZXMgPSAoRE1BX0JVUlNUMzIgLSAxKTsKIAotCXFlY3AtPnFlY19idXJzdHMgPSBic2l6ZXM7CisJcmV0dXJuIGJzaXplczsKK30KIAotCS8qIFBlcmZvcm0gb25lIHRpbWUgUUVDIGluaXRpYWxpemF0aW9uLCB3ZSBuZXZlciB0b3VjaCB0aGUgUUVDCi0JICogZ2xvYmFscyBhZ2FpbiBhZnRlciB0aGlzLgotCSAqLwotCXFlY19pbml0X29uY2UocWVjcCwgc2Rldik7CitzdGF0aWMgc3RydWN0IHN1bnFlYyAqIF9faW5pdCBnZXRfcWVjKHN0cnVjdCBzYnVzX2RldiAqY2hpbGRfc2RldikKK3sKKwlzdHJ1Y3Qgc2J1c19kZXYgKnFlY19zZGV2ID0gY2hpbGRfc2Rldi0+cGFyZW50OworCXN0cnVjdCBzdW5xZWMgKnFlY3A7CiAKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCXN0cnVjdCBzdW5xZSAqcWUgPSBxZXBzW2ldOwotCQkvKiBNYXAgaW4gUUVDIHBlci1jaGFubmVsIGNvbnRyb2wgcmVnaXN0ZXJzLiAqLwotCQlxZS0+cWNyZWdzID0gc2J1c19pb3JlbWFwKCZxZS0+cWVfc2Rldi0+cmVzb3VyY2VbMF0sIDAsCi0JCQkJICAgICAgIENSRUdfUkVHX1NJWkUsICJRRUMgQ2hhbm5lbCBSZWdpc3RlcnMiKTsKLQkJaWYgKCFxZS0+cWNyZWdzKSB7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlF1YWRFdGhlcjogQ2Fubm90IG1hcCBRRSAlZCdzIGNoYW5uZWwgcmVnaXN0ZXJzLlxuIiwgaSk7Ci0JCQlnb3RvIG91dDQ7CisJZm9yIChxZWNwID0gcm9vdF9xZWNfZGV2OyBxZWNwOyBxZWNwID0gcWVjcC0+bmV4dF9tb2R1bGUpIHsKKwkJaWYgKHFlY3AtPnFlY19zZGV2ID09IHFlY19zZGV2KQorCQkJYnJlYWs7CisJfQorCWlmICghcWVjcCkgeworCQlxZWNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN1bnFlYyksIEdGUF9LRVJORUwpOworCQlpZiAocWVjcCkgeworCQkJdTMyIGN0cmw7CisKKwkJCXFlY3AtPnFlY19zZGV2ID0gcWVjX3NkZXY7CisJCQlxZWNwLT5ncmVncyA9IHNidXNfaW9yZW1hcCgmcWVjX3NkZXYtPnJlc291cmNlWzBdLCAwLAorCQkJCQkJICAgR0xPQl9SRUdfU0laRSwKKwkJCQkJCSAgICJRRUMgR2xvYmFsIFJlZ2lzdGVycyIpOworCQkJaWYgKCFxZWNwLT5ncmVncykKKwkJCQlnb3RvIGZhaWw7CisKKwkJCS8qIE1ha2Ugc3VyZSB0aGUgUUVDIGlzIGluIE1BQ0UgbW9kZS4gKi8KKwkJCWN0cmwgPSBzYnVzX3JlYWRsKHFlY3AtPmdyZWdzICsgR0xPQl9DVFJMKTsKKwkJCWN0cmwgJj0gMHhmMDAwMDAwMDsKKwkJCWlmIChjdHJsICE9IEdMT0JfQ1RSTF9NTU9ERSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAicWVjOiBOb3QgaW4gTUFDRSBtb2RlIVxuIik7CisJCQkJZ290byBmYWlsOworCQkJfQorCisJCQlpZiAocWVjX2dsb2JhbF9yZXNldChxZWNwLT5ncmVncykpCisJCQkJZ290byBmYWlsOworCisJCQlxZWNwLT5xZWNfYnVyc3RzID0gcWVjX2dldF9idXJzdChxZWNfc2Rldi0+b2ZkZXYubm9kZSk7CisKKwkJCXFlY19pbml0X29uY2UocWVjcCwgcWVjX3NkZXYpOworCisJCQlpZiAocmVxdWVzdF9pcnEocWVjX3NkZXYtPmlycXNbMF0sICZxZWNfaW50ZXJydXB0LAorCQkJCQlTQV9TSElSUSwgInFlYyIsICh2b2lkICopIHFlY3ApKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJxZWM6IENhbid0IHJlZ2lzdGVyIGlycS5cbiIpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKworCQkJcWVjcC0+bmV4dF9tb2R1bGUgPSByb290X3FlY19kZXY7CisJCQlyb290X3FlY19kZXYgPSBxZWNwOwogCQl9CisJfQogCi0JCS8qIE1hcCBpbiBwZXItY2hhbm5lbCBBTUQgTUFDRSByZWdpc3RlcnMuICovCi0JCXFlLT5tcmVncyA9IHNidXNfaW9yZW1hcCgmcWUtPnFlX3NkZXYtPnJlc291cmNlWzFdLCAwLAotCQkJCSAgICAgIE1SRUdTX1JFR19TSVpFLCAiUUUgTUFDRSBSZWdpc3RlcnMiKTsKLQkJaWYgKCFxZS0+bXJlZ3MpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiUXVhZEV0aGVyOiBDYW5ub3QgbWFwIFFFICVkJ3MgTUFDRSByZWdpc3RlcnMuXG4iLCBpKTsKLQkJCWdvdG8gb3V0NDsKKwlyZXR1cm4gcWVjcDsKKworZmFpbDoKKwlpZiAocWVjcC0+Z3JlZ3MpCisJCXNidXNfaW91bm1hcChxZWNwLT5ncmVncywgR0xPQl9SRUdfU0laRSk7CisJa2ZyZWUocWVjcCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHFlY19ldGhlcl9pbml0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3sKKwlzdGF0aWMgdW5zaWduZWQgdmVyc2lvbl9wcmludGVkOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHN1bnFlICpxZTsKKwlzdHJ1Y3Qgc3VucWVjICpxZWNwOworCWludCBpLCByZXM7CisKKwlpZiAodmVyc2lvbl9wcmludGVkKysgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMiLCB2ZXJzaW9uKTsKKworCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3Qgc3VucWUpKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlxZSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpID0gb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHNkZXYtPm9mZGV2Lm5vZGUsICJjaGFubmVsIyIsIC0xKTsKKwlpZiAoaSA9PSAtMSkgeworCQlzdHJ1Y3Qgc2J1c19kZXYgKnRkID0gc2Rldi0+cGFyZW50LT5jaGlsZDsKKwkJaSA9IDA7CisJCXdoaWxlICh0ZCAhPSBzZGV2KSB7CisJCQl0ZCA9IHRkLT5uZXh0OworCQkJaSsrOwogCQl9CisJfQorCXFlLT5jaGFubmVsID0gaTsKKwlzcGluX2xvY2tfaW5pdCgmcWUtPmxvY2spOworCQorCXJlcyA9IC1FTk9ERVY7CisJcWVjcCA9IGdldF9xZWMoc2Rldik7CisJaWYgKCFxZWNwKQorCQlnb3RvIGZhaWw7CiAKLQkJcWUtPnFlX2Jsb2NrID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAotCQkJCQkJICBQQUdFX1NJWkUsCi0JCQkJCQkgICZxZS0+cWJsb2NrX2R2bWEpOwotCQlxZS0+YnVmZmVycyA9IHNidXNfYWxsb2NfY29uc2lzdGVudChxZS0+cWVfc2RldiwKLQkJCQkJCSBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAotCQkJCQkJICZxZS0+YnVmZmVyc19kdm1hKTsKLQkJaWYgKHFlLT5xZV9ibG9jayA9PSBOVUxMIHx8IHFlLT5xYmxvY2tfZHZtYSA9PSAwIHx8Ci0JCSAgICBxZS0+YnVmZmVycyA9PSBOVUxMIHx8IHFlLT5idWZmZXJzX2R2bWEgPT0gMCkgewotCQkJZ290byBvdXQ0OwotCQl9CisJcWVjcC0+cWVzW3FlLT5jaGFubmVsXSA9IHFlOworCXFlLT5kZXYgPSBkZXY7CisJcWUtPnBhcmVudCA9IHFlY3A7CisJcWUtPnFlX3NkZXYgPSBzZGV2OwogCi0JCS8qIFN0b3AgdGhpcyBRRS4gKi8KLQkJcWVfc3RvcChxZSk7CisJcmVzID0gLUVOT01FTTsKKwlxZS0+cWNyZWdzID0gc2J1c19pb3JlbWFwKCZxZS0+cWVfc2Rldi0+cmVzb3VyY2VbMF0sIDAsCisJCQkJICBDUkVHX1JFR19TSVpFLCAiUUVDIENoYW5uZWwgUmVnaXN0ZXJzIik7CisJaWYgKCFxZS0+cWNyZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAicWU6IENhbm5vdCBtYXAgY2hhbm5lbCByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJU0VUX01PRFVMRV9PV05FUihxZV9kZXZzW2ldKTsKLQkJcWVfZGV2c1tpXS0+b3BlbiA9IHFlX29wZW47Ci0JCXFlX2RldnNbaV0tPnN0b3AgPSBxZV9jbG9zZTsKLQkJcWVfZGV2c1tpXS0+aGFyZF9zdGFydF94bWl0ID0gcWVfc3RhcnRfeG1pdDsKLQkJcWVfZGV2c1tpXS0+Z2V0X3N0YXRzID0gcWVfZ2V0X3N0YXRzOwotCQlxZV9kZXZzW2ldLT5zZXRfbXVsdGljYXN0X2xpc3QgPSBxZV9zZXRfbXVsdGljYXN0OwotCQlxZV9kZXZzW2ldLT50eF90aW1lb3V0ID0gcWVfdHhfdGltZW91dDsKLQkJcWVfZGV2c1tpXS0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOwotCQlxZV9kZXZzW2ldLT5pcnEgPSBzZGV2LT5pcnFzWzBdOwotCQlxZV9kZXZzW2ldLT5kbWEgPSAwOwotCQlxZV9kZXZzW2ldLT5ldGh0b29sX29wcyA9ICZxZV9ldGh0b29sX29wczsKKwlxZS0+bXJlZ3MgPSBzYnVzX2lvcmVtYXAoJnFlLT5xZV9zZGV2LT5yZXNvdXJjZVsxXSwgMCwKKwkJCQkgTVJFR1NfUkVHX1NJWkUsICJRRSBNQUNFIFJlZ2lzdGVycyIpOworCWlmICghcWUtPm1yZWdzKSB7CisJCXByaW50ayhLRVJOX0VSUiAicWU6IENhbm5vdCBtYXAgTUFDRSByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsOwogCX0KIAotCS8qIFFFQyByZWNlaXZlcyBpbnRlcnJ1cHRzIGZyb20gZWFjaCBRRSwgdGhlbiBpdCBzZW5kcyB0aGUgYWN0dWFsCi0JICogSVJRIHRvIHRoZSBjcHUgaXRzZWxmLiAgU2luY2UgUUVDIGlzIHRoZSBzaW5nbGUgcG9pbnQgb2YKLQkgKiBpbnRlcnJ1cHQgZm9yIGFsbCBRRSBjaGFubmVscyB3ZSByZWdpc3RlciB0aGUgSVJRIGhhbmRsZXIKLQkgKiBmb3IgaXQgbm93LgotCSAqLwotCWlmIChyZXF1ZXN0X2lycShzZGV2LT5pcnFzWzBdLCAmcWVjX2ludGVycnVwdCwKLQkJCVNBX1NISVJRLCAiUXVhZEV0aGVyIiwgKHZvaWQgKikgcWVjcCkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJRdWFkRXRoZXI6IENhbid0IHJlZ2lzdGVyIFFFQyBtYXN0ZXIgaXJxIGhhbmRsZXIuXG4iKTsKLQkJcmVzID0gLUVBR0FJTjsKLQkJZ290byBvdXQ0OwotCX0KKwlxZS0+cWVfYmxvY2sgPSBzYnVzX2FsbG9jX2NvbnNpc3RlbnQocWUtPnFlX3NkZXYsCisJCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCQkgICAgICZxZS0+cWJsb2NrX2R2bWEpOworCXFlLT5idWZmZXJzID0gc2J1c19hbGxvY19jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkJICAgICZxZS0+YnVmZmVyc19kdm1hKTsKKwlpZiAocWUtPnFlX2Jsb2NrID09IE5VTEwgfHwgcWUtPnFibG9ja19kdm1hID09IDAgfHwKKwkgICAgcWUtPmJ1ZmZlcnMgPT0gTlVMTCB8fCBxZS0+YnVmZmVyc19kdm1hID09IDApCisJCWdvdG8gZmFpbDsKIAotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHJlZ2lzdGVyX25ldGRldihxZV9kZXZzW2ldKSAhPSAwKQotCQkJZ290byBvdXQ1OwotCX0KKwkvKiBTdG9wIHRoaXMgUUUuICovCisJcWVfc3RvcChxZSk7CiAKLQkvKiBSZXBvcnQgdGhlIFFFIGNoYW5uZWxzLiAqLwotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFF1YWRFdGhlcm5ldCBjaGFubmVsWyVkXSAiLCBxZV9kZXZzW2ldLT5uYW1lLCBpKTsKLQkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKLQkJCXByaW50ayAoIiUyLjJ4JWMiLAotCQkJCXFlX2RldnNbaV0tPmRldl9hZGRyW2pdLAotCQkJCWogPT0gNSA/ICcgJzogJzonKTsKLQkJcHJpbnRrKCJcbiIpOwotCX0KKwlTRVRfTU9EVUxFX09XTkVSKGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmc2Rldi0+b2ZkZXYuZGV2KTsKIAotCS8qIFdlIGFyZSBob21lIGZyZWUgYXQgdGhpcyBwb2ludCwgbGluayB0aGUgcWUncyBpbnRvCi0JICogdGhlIG1hc3RlciBsaXN0IGZvciBsYXRlciBkcml2ZXIgZXhpdC4KLQkgKi8KLQlxZWNwLT5uZXh0X21vZHVsZSA9IHJvb3RfcWVjX2RldjsKLQlyb290X3FlY19kZXYgPSBxZWNwOworCWRldi0+b3BlbiA9IHFlX29wZW47CisJZGV2LT5zdG9wID0gcWVfY2xvc2U7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBxZV9zdGFydF94bWl0OworCWRldi0+Z2V0X3N0YXRzID0gcWVfZ2V0X3N0YXRzOworCWRldi0+c2V0X211bHRpY2FzdF9saXN0ID0gcWVfc2V0X211bHRpY2FzdDsKKwlkZXYtPnR4X3RpbWVvdXQgPSBxZV90eF90aW1lb3V0OworCWRldi0+d2F0Y2hkb2dfdGltZW8gPSA1KkhaOworCWRldi0+aXJxID0gc2Rldi0+aXJxc1swXTsKKwlkZXYtPmRtYSA9IDA7CisJZGV2LT5ldGh0b29sX29wcyA9ICZxZV9ldGh0b29sX29wczsKKworCXJlcyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChyZXMpCisJCWdvdG8gZmFpbDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBxZSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogcWUgY2hhbm5lbFslZF0gIiwgZGV2LT5uYW1lLCBxZS0+Y2hhbm5lbCk7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJcHJpbnRrICgiJTIuMnglYyIsCisJCQlkZXYtPmRldl9hZGRyW2ldLAorCQkJaSA9PSA1ID8gJyAnOiAnOicpOworCXByaW50aygiXG4iKTsKKwogCiAJcmV0dXJuIDA7CiAKLW91dDU6Ci0Jd2hpbGUgKGktLSkKLQkJdW5yZWdpc3Rlcl9uZXRkZXYocWVfZGV2c1tpXSk7Ci0JZnJlZV9pcnEoc2Rldi0+aXJxc1swXSwgKHZvaWQgKilxZWNwKTsKLW91dDQ6Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotCQlzdHJ1Y3Qgc3VucWUgKnFlID0gKHN0cnVjdCBzdW5xZSAqKXFlX2RldnNbaV0tPnByaXY7CitmYWlsOgorCWlmIChxZS0+cWNyZWdzKQorCQlzYnVzX2lvdW5tYXAocWUtPnFjcmVncywgQ1JFR19SRUdfU0laRSk7CisJaWYgKHFlLT5tcmVncykKKwkJc2J1c19pb3VubWFwKHFlLT5tcmVncywgTVJFR1NfUkVHX1NJWkUpOworCWlmIChxZS0+cWVfYmxvY2spCisJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCSAgICAgUEFHRV9TSVpFLAorCQkJCSAgICAgcWUtPnFlX2Jsb2NrLAorCQkJCSAgICAgcWUtPnFibG9ja19kdm1hKTsKKwlpZiAocWUtPmJ1ZmZlcnMpCisJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzdW5xZV9idWZmZXJzKSwKKwkJCQkgICAgIHFlLT5idWZmZXJzLAorCQkJCSAgICAgcWUtPmJ1ZmZlcnNfZHZtYSk7CiAKLQkJaWYgKHFlLT5xY3JlZ3MpCi0JCQlzYnVzX2lvdW5tYXAocWUtPnFjcmVncywgQ1JFR19SRUdfU0laRSk7Ci0JCWlmIChxZS0+bXJlZ3MpCi0JCQlzYnVzX2lvdW5tYXAocWUtPm1yZWdzLCBNUkVHU19SRUdfU0laRSk7Ci0JCWlmIChxZS0+cWVfYmxvY2spCi0JCQlzYnVzX2ZyZWVfY29uc2lzdGVudChxZS0+cWVfc2RldiwKLQkJCQkJICAgICBQQUdFX1NJWkUsCi0JCQkJCSAgICAgcWUtPnFlX2Jsb2NrLAotCQkJCQkgICAgIHFlLT5xYmxvY2tfZHZtYSk7Ci0JCWlmIChxZS0+YnVmZmVycykKLQkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFlLT5xZV9zZGV2LAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCi0JCQkJCSAgICAgcWUtPmJ1ZmZlcnMsCi0JCQkJCSAgICAgcWUtPmJ1ZmZlcnNfZHZtYSk7Ci0JfQotb3V0MzoKLQlzYnVzX2lvdW5tYXAocWVjcC0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOwotb3V0MjoKLQlrZnJlZShxZWNwKTsKLW91dDE6Ci0JaSA9IDQ7Ci1vdXQ6Ci0Jd2hpbGUgKGktLSkKLQkJZnJlZV9uZXRkZXYocWVfZGV2c1tpXSk7CisJZnJlZV9uZXRkZXYoZGV2KTsKKwogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHFlY19tYXRjaChzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBxZWNfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogewotCXN0cnVjdCBzYnVzX2RldiAqc2libGluZzsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOwogCi0JaWYgKHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJxZWMiKSAhPSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIFFFQyBjYW4gYmUgcGFyZW50IG9mIGVpdGhlciBRdWFkRXRoZXJuZXQgb3IgQmlnTUFDCi0JICogY2hpbGRyZW4uICBEbyBub3QgY29uZnVzZSB0aGlzIHdpdGggcWZlL1NVTlcscWZlCi0JICogd2hpY2ggaXMgYSBxdWFkLWhhcHB5bWVhbCBjYXJkIGFuZCBoYW5kbGVkIGJ5Ci0JICogYSBkaWZmZXJlbnQgZHJpdmVyLgotCSAqLwotCXNpYmxpbmcgPSBzZGV2LT5jaGlsZDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWlmIChzaWJsaW5nID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHN0cmNtcChzaWJsaW5nLT5wcm9tX25hbWUsICJxZSIpICE9IDApCi0JCQlyZXR1cm4gMDsKLQkJc2libGluZyA9IHNpYmxpbmctPm5leHQ7Ci0JfQotCXJldHVybiAxOworCXJldHVybiBxZWNfZXRoZXJfaW5pdChzZGV2KTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcWVjX3Byb2JlKHZvaWQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBxZWNfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBOVUxMOwotCXN0cnVjdCBzYnVzX2J1cyAqYnVzOwotCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IE5VTEw7Ci0Jc3RhdGljIGludCBjYWxsZWQ7Ci0JaW50IGNhcmRzID0gMCwgdjsKKwlzdHJ1Y3Qgc3VucWUgKnFwID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBxcC0+ZGV2OwogCi0Jcm9vdF9xZWNfZGV2ID0gTlVMTDsKKwl1bnJlZ2lzdGVyX25ldGRldmljZShuZXRfZGV2KTsKIAotCWlmIChjYWxsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCWNhbGxlZCsrOworCXNidXNfaW91bm1hcChxcC0+cWNyZWdzLCBDUkVHX1JFR19TSVpFKTsKKwlzYnVzX2lvdW5tYXAocXAtPm1yZWdzLCBNUkVHU19SRUdfU0laRSk7CisJc2J1c19mcmVlX2NvbnNpc3RlbnQocXAtPnFlX3NkZXYsCisJCQkgICAgIFBBR0VfU0laRSwKKwkJCSAgICAgcXAtPnFlX2Jsb2NrLAorCQkJICAgICBxcC0+cWJsb2NrX2R2bWEpOworCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwLT5xZV9zZGV2LAorCQkJICAgICBzaXplb2Yoc3RydWN0IHN1bnFlX2J1ZmZlcnMpLAorCQkJICAgICBxcC0+YnVmZmVycywKKwkJCSAgICAgcXAtPmJ1ZmZlcnNfZHZtYSk7CiAKLQlmb3JfZWFjaF9zYnVzKGJ1cykgewotCQlmb3JfZWFjaF9zYnVzZGV2KHNkZXYsIGJ1cykgewotCQkJaWYgKGNhcmRzKQotCQkJCWRldiA9IE5VTEw7CisJZnJlZV9uZXRkZXYobmV0X2Rldik7CiAKLQkJCWlmIChxZWNfbWF0Y2goc2RldikpIHsKLQkJCQljYXJkcysrOwotCQkJCWlmICgodiA9IHFlY19ldGhlcl9pbml0KGRldiwgc2RldikpKQotCQkJCQlyZXR1cm4gdjsKLQkJCX0KLQkJfQotCX0KLQlpZiAoIWNhcmRzKQotCQlyZXR1cm4gLUVOT0RFVjsKKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2LCBOVUxMKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgcWVjX2NsZWFudXAodm9pZCkKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHFlY19zYnVzX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJxZSIsCisJfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHFlY19zYnVzX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgcWVjX3NidXNfZHJpdmVyID0geworCS5uYW1lCQk9ICJxZWMiLAorCS5tYXRjaF90YWJsZQk9IHFlY19zYnVzX21hdGNoLAorCS5wcm9iZQkJPSBxZWNfc2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFlY19zYnVzX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBxZWNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBzdW5xZWMgKm5leHRfcWVjOwotCWludCBpOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJnFlY19zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcWVjX2V4aXQodm9pZCkKK3sKKwlvZl91bnJlZ2lzdGVyX2RyaXZlcigmcWVjX3NidXNfZHJpdmVyKTsKIAogCXdoaWxlIChyb290X3FlY19kZXYpIHsKLQkJbmV4dF9xZWMgPSByb290X3FlY19kZXYtPm5leHRfbW9kdWxlOworCQlzdHJ1Y3Qgc3VucWVjICpuZXh0ID0gcm9vdF9xZWNfZGV2LT5uZXh0X21vZHVsZTsKIAotCQkvKiBSZWxlYXNlIGFsbCBmb3VyIFFFIGNoYW5uZWxzLCB0aGVuIHRoZSBRRUMgaXRzZWxmLiAqLwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihyb290X3FlY19kZXYtPnFlc1tpXS0+ZGV2KTsKLQkJCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPnFlc1tpXS0+cWNyZWdzLCBDUkVHX1JFR19TSVpFKTsKLQkJCXNidXNfaW91bm1hcChyb290X3FlY19kZXYtPnFlc1tpXS0+bXJlZ3MsIE1SRUdTX1JFR19TSVpFKTsKLQkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xZV9zZGV2LAotCQkJCQkgICAgIFBBR0VfU0laRSwKLQkJCQkJICAgICByb290X3FlY19kZXYtPnFlc1tpXS0+cWVfYmxvY2ssCi0JCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPnFibG9ja19kdm1hKTsKLQkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHJvb3RfcWVjX2Rldi0+cWVzW2ldLT5xZV9zZGV2LAotCQkJCQkgICAgIHNpemVvZihzdHJ1Y3Qgc3VucWVfYnVmZmVycyksCi0JCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPmJ1ZmZlcnMsCi0JCQkJCSAgICAgcm9vdF9xZWNfZGV2LT5xZXNbaV0tPmJ1ZmZlcnNfZHZtYSk7Ci0JCQlmcmVlX25ldGRldihyb290X3FlY19kZXYtPnFlc1tpXS0+ZGV2KTsKLQkJfQotCQlmcmVlX2lycShyb290X3FlY19kZXYtPnFlY19zZGV2LT5pcnFzWzBdLCAodm9pZCAqKXJvb3RfcWVjX2Rldik7CisJCWZyZWVfaXJxKHJvb3RfcWVjX2Rldi0+cWVjX3NkZXYtPmlycXNbMF0sCisJCQkgKHZvaWQgKikgcm9vdF9xZWNfZGV2KTsKIAkJc2J1c19pb3VubWFwKHJvb3RfcWVjX2Rldi0+Z3JlZ3MsIEdMT0JfUkVHX1NJWkUpOworCiAJCWtmcmVlKHJvb3RfcWVjX2Rldik7Ci0JCXJvb3RfcWVjX2RldiA9IG5leHRfcWVjOworCisJCXJvb3RfcWVjX2RldiA9IG5leHQ7CiAJfQogfQogCi1tb2R1bGVfaW5pdChxZWNfcHJvYmUpOwotbW9kdWxlX2V4aXQocWVjX2NsZWFudXApOworbW9kdWxlX2luaXQocWVjX2luaXQpOworbW9kdWxlX2V4aXQocWVjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGczLmMgYi9kcml2ZXJzL25ldC90ZzMuYwppbmRleCBiMmRkZDQ1Li4zNWY5MzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90ZzMuYworKysgYi9kcml2ZXJzL25ldC90ZzMuYwpAQCAtMzc4MCw3ICszNzgwLDcgQEAKICNpZiBURzNfVFNPX1NVUFBPUlQgIT0gMAogCW1zcyA9IDA7CiAJaWYgKHNrYi0+bGVuID4gKHRwLT5kZXYtPm10dSArIEVUSF9ITEVOKSAmJgotCSAgICAobXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkgIT0gMCkgeworCSAgICAobXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkgIT0gMCkgewogCQlpbnQgdGNwX29wdF9sZW4sIGlwX3RjcF9sZW47CiAKIAkJaWYgKHNrYl9oZWFkZXJfY2xvbmVkKHNrYikgJiYKQEAgLTM5MDUsNyArMzkwNSw3IEBACiAjaWYgVEczX1RTT19TVVBQT1JUICE9IDAKIAltc3MgPSAwOwogCWlmIChza2ItPmxlbiA+ICh0cC0+ZGV2LT5tdHUgKyBFVEhfSExFTikgJiYKLQkgICAgKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpICE9IDApIHsKKwkgICAgKG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpICE9IDApIHsKIAkJaW50IHRjcF9vcHRfbGVuLCBpcF90Y3BfbGVuOwogCiAJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCkBAIC0xMDU0OSwxMSArMTA1NDksMTMgQEAKIAlzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwID0gcGRldi0+c3lzZGF0YTsKIAogCWlmIChwY3AgIT0gTlVMTCkgewotCQlpbnQgbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQl1bnNpZ25lZCBjaGFyICphZGRyOworCQlpbnQgbGVuOwogCi0JCWlmIChwcm9tX2dldHByb3BsZW4obm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgewotCQkJcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAibG9jYWwtbWFjLWFkZHJlc3MiLAotCQkJCQkgZGV2LT5kZXZfYWRkciwgNik7CisJCWFkZHIgPSBvZl9nZXRfcHJvcGVydHkocGNwLT5wcm9tX25vZGUsICJsb2NhbC1tYWMtYWRkcmVzcyIsCisJCQkJCSZsZW4pOworCQlpZiAoYWRkciAmJiBsZW4gPT0gNikgeworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHIsIDYpOwogCQkJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCA2KTsKIAkJCXJldHVybiAwOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jIGIvZHJpdmVycy9uZXQvdG9rZW5yaW5nL29seW1waWMuYwppbmRleCAyMzAzMmE3Li5jM2NiOGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90b2tlbnJpbmcvb2x5bXBpYy5jCisrKyBiL2RyaXZlcnMvbmV0L3Rva2VucmluZy9vbHltcGljLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogCWRldiA9IGFsbG9jX3RyZGV2KHNpemVvZihzdHJ1Y3Qgb2x5bXBpY19wcml2YXRlKSkgOyAKIAlpZiAoIWRldikgewogCQlpID0gLUVOT01FTTsgCi0JCWdvdG8gb3BfZnJlZV9kZXY7CisJCWdvdG8gb3BfcmVsZWFzZV9kZXY7CiAJfQogCiAJb2x5bXBpY19wcml2ID0gZGV2LT5wcml2IDsKQEAgLTI4Miw4ICsyODIsOCBAQAogCWlmIChvbHltcGljX3ByaXYtPm9seW1waWNfbGFwKQogCQlpb3VubWFwKG9seW1waWNfcHJpdi0+b2x5bXBpY19sYXApOwogCi1vcF9mcmVlX2RldjoKIAlmcmVlX25ldGRldihkZXYpOworb3BfcmVsZWFzZV9kZXY6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsgCiAKIG9wX2Rpc2FibGVfZGV2OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jIGIvZHJpdmVycy9uZXQvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IGNhYmRmODkuLmUwZGU2NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC90dWxpcC90dWxpcF9jb3JlLmMKQEAgLTE1NTAsMTAgKzE1NTAsMTQgQEAKIAkJCWRldi0+ZGV2X2FkZHJbaV0gPSBsYXN0X3BoeXNfYWRkcltpXTsKIAkJZGV2LT5kZXZfYWRkcltpXSA9IGxhc3RfcGh5c19hZGRyW2ldICsgMTsKICNpZiBkZWZpbmVkKF9fc3BhcmNfXykKLQkJaWYgKChwY3AgIT0gTlVMTCkgJiYgcHJvbV9nZXRwcm9wbGVuKHBjcC0+cHJvbV9ub2RlLAotCQkJImxvY2FsLW1hYy1hZGRyZXNzIikgPT0gNikgewotCQkJcHJvbV9nZXRwcm9wZXJ0eShwY3AtPnByb21fbm9kZSwgImxvY2FsLW1hYy1hZGRyZXNzIiwKLQkJCSAgICBkZXYtPmRldl9hZGRyLCA2KTsKKwkJaWYgKHBjcCkgeworCQkJdW5zaWduZWQgY2hhciAqYWRkcjsKKwkJCWludCBsZW47CisJCSAgCisJCQlhZGRyID0gb2ZfZ2V0X3Byb3BlcnR5KHBjcC0+cHJvbV9ub2RlLAorCQkJCQkgICAgICAgImxvY2FsLW1hYy1hZGRyZXNzIiwgJmxlbik7CisJCQlpZiAoYWRkciAmJiBsZW4gPT0gNikKKwkJCQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkciwgNik7CiAJCX0KICNlbmRpZgogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykJLyogUGF0Y2ggdXAgeDg2IEJJT1MgYnVnLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdHVuLmMgYi9kcml2ZXJzL25ldC90dW4uYwppbmRleCBhMWVkMmQ5Li42YzYyZDVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC90dW4uYworKysgYi9kcml2ZXJzL25ldC90dW4uYwpAQCAtNDkwLDYgKzQ5MCw5IEBACiAKIAkJZXJyID0gLUVJTlZBTDsKIAorCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCiAJCS8qIFNldCBkZXYgdHlwZSAqLwogCQlpZiAoaWZyLT5pZnJfZmxhZ3MgJiBJRkZfVFVOKSB7CiAJCQkvKiBUVU4gZGV2aWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90eXBob29uLmMgYi9kcml2ZXJzL25ldC90eXBob29uLmMKaW5kZXggZDkyNThkNC4uZTQ5ZThiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3R5cGhvb24uYwpAQCAtMzQwLDcgKzM0MCw3IEBACiAjZW5kaWYKIAogI2lmIGRlZmluZWQoTkVUSUZfRl9UU08pCi0jZGVmaW5lIHNrYl90c29fc2l6ZSh4KQkJKHNrYl9zaGluZm8oeCktPnRzb19zaXplKQorI2RlZmluZSBza2JfdHNvX3NpemUoeCkJCShza2Jfc2hpbmZvKHgpLT5nc29fc2l6ZSkKICNkZWZpbmUgVFNPX05VTV9ERVNDUklQVE9SUwkyCiAjZGVmaW5lIFRTT19PRkZMT0FEX09OCQlUWVBIT09OX09GRkxPQURfVENQX1NFR01FTlQKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtcmhpbmUuYyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCmluZGV4IGZkYzIxMDMuLmM4MGE0ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS1yaGluZS5jCkBAIC0xMjg0LDExICsxMjg0LDggQEAKIAkvKiBDYWxjdWxhdGUgdGhlIG5leHQgVHggZGVzY3JpcHRvciBlbnRyeS4gKi8KIAllbnRyeSA9IHJwLT5jdXJfdHggJSBUWF9SSU5HX1NJWkU7CiAKLQlpZiAoc2tiLT5sZW4gPCBFVEhfWkxFTikgewotCQlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0JCWlmIChza2IgPT0gTlVMTCkKLQkJCXJldHVybiAwOwotCX0KKwlpZiAoc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pKQorCQlyZXR1cm4gMDsKIAogCXJwLT50eF9za2J1ZmZbZW50cnldID0gc2tiOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC92aWEtdmVsb2NpdHkuYyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCmluZGV4IDJlYjZiNWYuLjA5ZTA1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCisrKyBiL2RyaXZlcnMvbmV0L3ZpYS12ZWxvY2l0eS5jCkBAIC0yNDgsNiArMjQ4LDcgQEAKIHN0YXRpYyB2b2lkIHZlbG9jaXR5X2ZyZWVfdHhfYnVmKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyLCBzdHJ1Y3QgdmVsb2NpdHlfdGRfaW5mbyAqKTsKIHN0YXRpYyBpbnQgdmVsb2NpdHlfc29mdF9yZXNldChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0cik7CiBzdGF0aWMgdm9pZCBtaWlfaW5pdChzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciwgdTMyIG1paV9zdGF0dXMpOworc3RhdGljIHUzMiB2ZWxvY2l0eV9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB1MzIgdmVsb2NpdHlfZ2V0X29wdF9tZWRpYV9tb2RlKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKIHN0YXRpYyB2b2lkIHZlbG9jaXR5X3ByaW50X2xpbmtfc3RhdHVzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKTsKIHN0YXRpYyB2b2lkIHNhZmVfZGlzYWJsZV9taWlfYXV0b3BvbGwoc3RydWN0IG1hY19yZWdzIF9faW9tZW0gKiByZWdzKTsKQEAgLTc5OCw2ICs3OTksOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGVycl9pb3VubWFwOwogCisJaWYgKHZlbG9jaXR5X2dldF9saW5rKGRldikpCisJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKIAl2ZWxvY2l0eV9wcmludF9pbmZvKHZwdHIpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwogCQpAQCAtMTY1Myw4ICsxNjU3LDEwIEBACiAKIAkJaWYgKGxpbmtlZCkgewogCQkJdnB0ci0+bWlpX3N0YXR1cyAmPSB+VkVMT0NJVFlfTElOS19GQUlMOworCQkJbmV0aWZfY2Fycmllcl9vbih2cHRyLT5kZXYpOwogCQl9IGVsc2UgewogCQkJdnB0ci0+bWlpX3N0YXR1cyB8PSBWRUxPQ0lUWV9MSU5LX0ZBSUw7CisJCQluZXRpZl9jYXJyaWVyX29mZih2cHRyLT5kZXYpOwogCQl9CiAKIAkJdmVsb2NpdHlfcHJpbnRfbGlua19zdGF0dXModnB0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vYzEwMS5jIGIvZHJpdmVycy9uZXQvd2FuL2MxMDEuYwppbmRleCA0M2Q4NTRhLi5iNjBlZjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93YW4vYzEwMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9jMTAxLmMKQEAgLTMyNiwyMSArMzI2LDIxIEBACiAJaWYgKHJlcXVlc3RfaXJxKGlycSwgc2NhX2ludHIsIDAsIGRldm5hbWUsIGNhcmQpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IGFsbG9jYXRlIElSUVxuIik7CiAJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOwotCQlyZXR1cm4oLUVCVVNZKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2FyZC0+aXJxID0gaXJxOwogCiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24od2luYmFzZSwgQzEwMV9NQVBQRURfUkFNX1NJWkUsIGRldm5hbWUpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYzEwMTogY291bGQgbm90IHJlcXVlc3QgUkFNIHdpbmRvd1xuIik7CiAJCWMxMDFfZGVzdHJveV9jYXJkKGNhcmQpOwotCQlyZXR1cm4oLUVCVVNZKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJY2FyZC0+cGh5X3dpbmJhc2UgPSB3aW5iYXNlOwogCWNhcmQtPndpbjBiYXNlID0gaW9yZW1hcCh3aW5iYXNlLCBDMTAxX01BUFBFRF9SQU1fU0laRSk7CiAJaWYgKCFjYXJkLT53aW4wYmFzZSkgewogCQlwcmludGsoS0VSTl9FUlIgImMxMDE6IGNvdWxkIG5vdCBtYXAgSS9PIGFkZHJlc3NcbiIpOwogCQljMTAxX2Rlc3Ryb3lfY2FyZChjYXJkKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJY2FyZC0+dHhfcmluZ19idWZmZXJzID0gVFhfUklOR19CVUZGRVJTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jIGIvZHJpdmVycy9uZXQvd2FuL2hkbGNfZ2VuZXJpYy5jCmluZGV4IDQ2Y2VmOGYuLjU3Zjk1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9oZGxjX2dlbmVyaWMuYworKysgYi9kcml2ZXJzL25ldC93YW4vaGRsY19nZW5lcmljLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgaGRsY19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBoZGxjX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJaGRsY19kZXZpY2UgKmhkbGMgPSBkZXZfdG9faGRsYyhkZXYpOwogCkBAIC0yODgsMjYgKzI4OCw2IEBACiAJcmV0dXJuIGRldjsKIH0KIAotaW50IHJlZ2lzdGVyX2hkbGNfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaW50IHJlc3VsdCA9IGRldl9hbGxvY19uYW1lKGRldiwgImhkbGMlZCIpOwotCWlmIChyZXN1bHQgPCAwKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci0JaWYgKHJlc3VsdCAhPSAwKQotCQlyZXR1cm4gLUVJTzsKLQotI2lmIDAKLQlpZiAobmV0aWZfY2Fycmllcl9vayhkZXYpKQotCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOyAvKiBubyBjYXJyaWVyIHVudGlsIERDRCBnb2VzIHVwICovCi0jZW5kaWYKLQotCXJldHVybiAwOwotfQotCi0KLQogdm9pZCB1bnJlZ2lzdGVyX2hkbGNfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJcnRubF9sb2NrKCk7CkBAIC0zMjYsOCArMzA2LDggQEAKIEVYUE9SVF9TWU1CT0woaGRsY19jbG9zZSk7CiBFWFBPUlRfU1lNQk9MKGhkbGNfc2V0X2NhcnJpZXIpOwogRVhQT1JUX1NZTUJPTChoZGxjX2lvY3RsKTsKK0VYUE9SVF9TWU1CT0woaGRsY19zZXR1cCk7CiBFWFBPUlRfU1lNQk9MKGFsbG9jX2hkbGNkZXYpOwotRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9oZGxjX2RldmljZSk7CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfaGRsY19kZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGhkbGNfcGFja2V0X3R5cGUgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vbjIuYyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCmluZGV4IGNkMzI3NTEuLmI3ZDg4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9uMi5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9uMi5jCkBAIC0zODcsNiArMzg3LDExIEBACiAJfQogCWNhcmQtPnBoeV93aW5iYXNlID0gd2luYmFzZTsKIAljYXJkLT53aW5iYXNlID0gaW9yZW1hcCh3aW5iYXNlLCBVU0VfV0lORE9XU0laRSk7CisJaWYgKCFjYXJkLT53aW5iYXNlKSB7CisJCXByaW50ayhLRVJOX0VSUiAibjI6IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworCQluMl9kZXN0cm95X2NhcmQoY2FyZCk7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogCW91dGIoMCwgaW8gKyBOMl9QQ1IpOwogCW91dGIod2luYmFzZSA+PiAxMiwgaW8gKyBOMl9CQVIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jIGIvZHJpdmVycy9uZXQvd2FuL3BjaTIwMHN5bi5jCmluZGV4IGY0ODVhOTcuLjY3MGU4YmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9wY2kyMDBzeW4uYworKysgYi9kcml2ZXJzL25ldC93YW4vcGNpMjAwc3luLmMKQEAgLTM1NCw2ICszNTQsNyBAQAogCSAgICBjYXJkLT5yYW1iYXNlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJwY2kyMDBzeW46IGlvcmVtYXAoKSBmYWlsZWRcbiIpOwogCQlwY2kyMDBfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCS8qIFJlc2V0IFBMWCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL3NkbGEuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZGxhLmMKaW5kZXggMjJlNzk0MC4uNzYyOGMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL3NkbGEuYworKysgYi9kcml2ZXJzL25ldC93YW4vc2RsYS5jCkBAIC02MCw5ICs2MCw5IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyKiB2ZXJzaW9uID0gIlNETEEgZHJpdmVyIHYwLjMwLCAxMiBTZXAgMTk5NiwgbWlrZS5tY2xhZ2FuQGxpbnV4Lm9yZyI7CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfcG9ydFtdIF9faW5pdGRhdGEgPSB7IDB4MjUwLCAweDI3MCwgMHgyODAsIDB4MzAwLCAweDM1MCwgMHgzNjAsIDB4MzgwLCAweDM5MH07CitzdGF0aWMgdW5zaWduZWQgaW50IHZhbGlkX3BvcnRbXSA9IHsgMHgyNTAsIDB4MjcwLCAweDI4MCwgMHgzMDAsIDB4MzUwLCAweDM2MCwgMHgzODAsIDB4MzkwfTsKIAotc3RhdGljIHVuc2lnbmVkIGludCB2YWxpZF9tZW1bXSAgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmFsaWRfbWVtW10gPSB7CiAJCQkJICAgIDB4QTAwMDAsIDB4QTIwMDAsIDB4QTQwMDAsIDB4QTYwMDAsIDB4QTgwMDAsIDB4QUEwMDAsIDB4QUMwMDAsIDB4QUUwMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCMDAwMCwgMHhCMjAwMCwgMHhCNDAwMCwgMHhCNjAwMCwgMHhCODAwMCwgMHhCQTAwMCwgMHhCQzAwMCwgMHhCRTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAsIDB4QzIwMDAsIDB4QzQwMDAsIDB4QzYwMDAsIDB4QzgwMDAsIDB4Q0EwMDAsIDB4Q0MwMDAsIDB4Q0UwMDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vd2FueGwuYyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCmluZGV4IDI5YTc1NmQuLjQzN2UwZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi93YW54bC5jCkBAIC02MzQsNyArNjM0LDEzIEBACiAKIAkvKiBzZXQgdXAgUExYIG1hcHBpbmcgKi8KIAlwbHhfcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCiAJY2FyZC0+cGx4ID0gaW9yZW1hcF9ub2NhY2hlKHBseF9waHksIDB4NzApOworCWlmICghY2FyZC0+cGx4KSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FueGw6IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOworCX0KIAogI2lmIFJFU0VUX1dISUxFX0xPQURJTkcKIAl3YW54bF9yZXNldChjYXJkKTsKQEAgLTcwMCw2ICs3MDYsMTIgQEAKIAl9CiAKIAltZW0gPSBpb3JlbWFwX25vY2FjaGUobWVtX3BoeSwgUERNX09GRlNFVCArIHNpemVvZihmaXJtd2FyZSkpOworCWlmICghbWVtKSB7CisJCXByaW50ayhLRVJOX0VSUiAid2FueGw6IGlvcmVtYXAoKSBmYWlsZWRcbiIpOworIAkJd2FueGxfcGNpX3JlbW92ZV9vbmUocGRldik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoZmlybXdhcmUpOyBpICs9IDQpCiAJCXdyaXRlbChodG9ubCgqKHUzMiopKGZpcm13YXJlICsgaSkpLCBtZW0gKyBQRE1fT0ZGU0VUICsgaSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKaW5kZXggZTY2ZmRiMS4uZDhmOTE3YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4LmgKQEAgLTYzNiw2ICs2MzYsMTcgQEAKIAl1OCBhbGdvcml0aG07CiB9OwogCisvKiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gc3RhdHVzLiAqLworZW51bSB7CisJQkNNNDN4eF9TVEFUX1VOSU5JVCwJCS8qIFVuaW5pdGlhbGl6ZWQuICovCisJQkNNNDN4eF9TVEFUX0lOSVRJQUxJWklORywJLyogaW5pdF9ib2FyZCgpIGluIHByb2dyZXNzLiAqLworCUJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCwJLyogRnVsbHkgb3BlcmF0aW9uYWwuICovCisJQkNNNDN4eF9TVEFUX1NIVVRUSU5HRE9XTiwJLyogZnJlZV9ib2FyZCgpIGluIHByb2dyZXNzLiAqLworCUJDTTQzeHhfU1RBVF9SRVNUQVJUSU5HLAkvKiBjb250cm9sbGVyX3Jlc3RhcnQoKSBjYWxsZWQuICovCit9OworI2RlZmluZSBiY200M3h4X3N0YXR1cyhiY20pCQlhdG9taWNfcmVhZCgmKGJjbSktPmluaXRfc3RhdHVzKQorI2RlZmluZSBiY200M3h4X3NldF9zdGF0dXMoYmNtLCBzdGF0KQlhdG9taWNfc2V0KCYoYmNtKS0+aW5pdF9zdGF0dXMsIChzdGF0KSkKKwogc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU7CiAJc3RydWN0IGllZWU4MDIxMXNvZnRtYWNfZGV2aWNlICpzb2Z0bWFjOwpAQCAtNjQ2LDE4ICs2NTcsMTcgQEAKIAogCXZvaWQgX19pb21lbSAqbW1pb19hZGRyOwogCi0JLyogRG8gbm90IHVzZSB0aGUgbG9jayBkaXJlY3RseS4gVXNlIHRoZSBiY200M3h4X2xvY2sqIGhlbHBlcgotCSAqIGZ1bmN0aW9ucywgdG8gYmUgTU1JTy1zYWZlLiAqLwotCXNwaW5sb2NrX3QgX2xvY2s7CisJLyogTG9ja2luZywgc2VlICJ0aGVvcnkgb2YgbG9ja2luZyIgdGV4dCBiZWxvdy4gKi8KKwlzcGlubG9ja190IGlycV9sb2NrOworCXN0cnVjdCBtdXRleCBtdXRleDsKIAotCS8qIERyaXZlciBzdGF0dXMgZmxhZ3MuICovCi0JdTMyIGluaXRpYWxpemVkOjEsCQkvKiBpbml0X2JvYXJkKCkgc3VjY2VlZCAqLwotCSAgICB3YXNfaW5pdGlhbGl6ZWQ6MSwJCS8qIGZvciBQQ0kgc3VzcGVuZC9yZXN1bWUuICovCi0JICAgIHNodXR0aW5nX2Rvd246MSwJCS8qIGZyZWVfYm9hcmQoKSBpbiBwcm9ncmVzcyAqLworCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiBzdGF0dXMgQkNNNDN4eF9TVEFUXyoqKiAqLworCWF0b21pY190IGluaXRfc3RhdHVzOworCisJdTE2IHdhc19pbml0aWFsaXplZDoxLAkJLyogZm9yIFBDSSBzdXNwZW5kL3Jlc3VtZS4gKi8KIAkgICAgX191c2luZ19waW86MSwJCS8qIEludGVybmFsLCB1c2UgYmNtNDN4eF91c2luZ19waW8oKS4gKi8KIAkgICAgYmFkX2ZyYW1lc19wcmVlbXB0OjEsCS8qIFVzZSAiQmFkIEZyYW1lcyBQcmVlbXB0aW9uIiAoZGVmYXVsdCBvZmYpICovCiAJICAgIHJlZzEyNF9zZXRfMHg0OjEsCQkvKiBTb21lIHZhcmlhYmxlIHRvIGtlZXAgdHJhY2sgb2YgSVJRIHN0dWZmLiAqLwotCSAgICBwb3dlcnNhdmluZzoxLAkJLyogVFJVRSBpZiB3ZSBhcmUgaW4gUG93ZXJTYXZpbmcgbW9kZS4gRkFMU0Ugb3RoZXJ3aXNlLiAqLwogCSAgICBzaG9ydF9wcmVhbWJsZToxLAkJLyogVFJVRSwgaWYgc2hvcnQgcHJlYW1ibGUgaXMgZW5hYmxlZC4gKi8KIAkgICAgZmlybXdhcmVfbm9yZWxlYXNlOjE7CS8qIERvIG5vdCByZWxlYXNlIHRoZSBmaXJtd2FyZS4gVXNlZCBvbiBzdXNwZW5kLiAqLwogCkBAIC03MjEsNyArNzMxLDcgQEAKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXNyX3Rhc2tsZXQ7CiAKIAkvKiBQZXJpb2RpYyB0YXNrcyAqLwotCXN0cnVjdCB0aW1lcl9saXN0IHBlcmlvZGljX3Rhc2tzOworCXN0cnVjdCB3b3JrX3N0cnVjdCBwZXJpb2RpY193b3JrOwogCXVuc2lnbmVkIGludCBwZXJpb2RpY19zdGF0ZTsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN0YXJ0X3dvcms7CkBAIC03NDYsMjEgKzc1Niw1NSBAQAogI2VuZGlmCiB9OwogCi0vKiBiY200M3h4Xyh1bilsb2NrKCkgcHJvdGVjdCBzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlLgotICogTm90ZSB0aGF0IF9OT18gTU1JTyB3cml0ZXMgYXJlIGFsbG93ZWQuIElmIHlvdSB3YW50IHRvCi0gKiB3cml0ZSB0byB0aGUgZGV2aWNlIHRocm91Z2ggTU1JTyBpbiB0aGUgY3JpdGljYWwgc2VjdGlvbiwgdXNlCi0gKiB0aGUgKl9tbWlvIGxvY2sgZnVuY3Rpb25zLgotICogTU1JTyByZWFkLWFjY2VzcyBpcyBhbGxvd2VkLCB0aG91Z2guCisKKy8qICAgICoqKiBUSEVPUlkgT0YgTE9DS0lORyAqKioKKyAqCisgKiBXZSBoYXZlIHR3byBkaWZmZXJlbnQgbG9ja3MgaW4gdGhlIGJjbTQzeHggZHJpdmVyLgorICogPT4gYmNtLT5tdXRleDogICAgR2VuZXJhbCBzbGVlcGluZyBtdXRleC4gUHJvdGVjdHMgc3RydWN0IGJjbTQzeHhfcHJpdmF0ZQorICogICAgICAgICAgICAgICAgICAgYW5kIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLgorICogPT4gYmNtLT5pcnFfbG9jazogSVJRIHNwaW5sb2NrLiBQcm90ZWN0cyBhZ2FpbnN0IElSUSBoYW5kbGVyIGNvbmN1cnJlbmN5LgorICoKKyAqIFdlIGhhdmUgdGhyZWUgdHlwZXMgb2YgaGVscGVyIGZ1bmN0aW9uIHBhaXJzIHRvIHV0aWxpemUgdGhlc2UgbG9ja3MuCisgKiAgICAgKEFsd2F5cyB1c2UgdGhlIGhlbHBlciBmdW5jdGlvbnMuKQorICogMSkgYmNtNDN4eF97dW59bG9ja19ub2lycSgpOgorICogICAgIFRha2VzIGJjbS0+bXV0ZXguIERvZXMgX25vdF8gcHJvdGVjdCBhZ2FpbnN0IElSUSBjb25jdXJyZW5jeSwKKyAqICAgICBzbyBpdCBpcyBhbG1vc3QgYWx3YXlzIHVuc2FmZSwgaWYgZGV2aWNlIElSUXMgYXJlIGVuYWJsZWQuCisgKiAgICAgU28gb25seSB1c2UgdGhpcywgaWYgZGV2aWNlIElSUXMgYXJlIG1hc2tlZC4KKyAqICAgICBMb2NraW5nIG1heSBzbGVlcC4KKyAqICAgICBZb3UgY2FuIHNsZWVwIHdpdGhpbiB0aGUgY3JpdGljYWwgc2VjdGlvbi4KKyAqIDIpIGJjbTQzeHhfe3VufWxvY2tfaXJxb25seSgpOgorICogICAgIFRha2VzIGJjbS0+aXJxX2xvY2suIERvZXMgX25vdF8gcHJvdGVjdCBhZ2FpbnN0CisgKiAgICAgYmNtNDN4eF9sb2NrX25vaXJxKCkgY3JpdGljYWwgc2VjdGlvbnMuCisgKiAgICAgRG9lcyBvbmx5IHByb3RlY3QgYWdhaW5zdCB0aGUgSVJRIGhhbmRsZXIgcGF0aCBhbmQgb3RoZXIKKyAqICAgICBpcnFvbmx5KCkgY3JpdGljYWwgc2VjdGlvbnMuCisgKiAgICAgTG9ja2luZyBkb2VzIG5vdCBzbGVlcC4KKyAqICAgICBZb3UgbXVzdCBub3Qgc2xlZXAgd2l0aGluIHRoZSBjcml0aWNhbCBzZWN0aW9uLgorICogMykgYmNtNDN4eF97dW59bG9ja19pcnFzYWZlKCk6CisgKiAgICAgVGhpcyBpcyB0aGUgY3VtbXVsYXRpdmUgbG9jayBhbmQgdGFrZXMgYm90aCwgbXV0ZXggYW5kIGlycV9sb2NrLgorICogICAgIFByb3RlY3RzIGFnYWluc3Qgbm9pcnEoKSBhbmQgaXJxb25seSgpIGNyaXRpY2FsIHNlY3Rpb25zIChhbmQKKyAqICAgICB0aGUgSVJRIGhhbmRsZXIgcGF0aCkuCisgKiAgICAgTG9ja2luZyBtYXkgc2xlZXAuCisgKiAgICAgWW91IG11c3Qgbm90IHNsZWVwIHdpdGhpbiB0aGUgY3JpdGljYWwgc2VjdGlvbi4KICAqLwotI2RlZmluZSBiY200M3h4X2xvY2soYmNtLCBmbGFncykJc3Bpbl9sb2NrX2lycXNhdmUoJihiY20pLT5fbG9jaywgZmxhZ3MpCi0jZGVmaW5lIGJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihiY20pLT5fbG9jaywgZmxhZ3MpCi0vKiBiY200M3h4Xyh1bilsb2NrX21taW8oKSBwcm90ZWN0IHN0cnVjdCBiY200M3h4X3ByaXZhdGUgYW5kIE1NSU8uCi0gKiBNTUlPIHdyaXRlLWFjY2VzcyB0byB0aGUgZGV2aWNlIGlzIGFsbG93ZWQuCi0gKiBBbGwgTU1JTyB3cml0ZXMgYXJlIGZsdXNoZWQgb24gdW5sb2NrLCBzbyBpdCBpcyBndWFyYW50ZWVkIHRvIG5vdAotICogaW50ZXJmZXJlIHdpdGggb3RoZXIgdGhyZWFkcyB3cml0aW5nIE1NSU8gcmVnaXN0ZXJzLgotICovCi0jZGVmaW5lIGJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKQotI2RlZmluZSBiY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpCWRvIHsgbW1pb3diKCk7IGJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOyB9IHdoaWxlICgwKQorCisvKiBMb2NrIHR5cGUgMSAqLworI2RlZmluZSBiY200M3h4X2xvY2tfbm9pcnEoYmNtKQkJbXV0ZXhfbG9jaygmKGJjbSktPm11dGV4KQorI2RlZmluZSBiY200M3h4X3VubG9ja19ub2lycShiY20pCW11dGV4X3VubG9jaygmKGJjbSktPm11dGV4KQorLyogTG9jayB0eXBlIDIgKi8KKyNkZWZpbmUgYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncykJXAorCXNwaW5fbG9ja19pcnFzYXZlKCYoYmNtKS0+aXJxX2xvY2ssIGZsYWdzKQorI2RlZmluZSBiY200M3h4X3VubG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpCVwKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoYmNtKS0+aXJxX2xvY2ssIGZsYWdzKQorLyogTG9jayB0eXBlIDMgKi8KKyNkZWZpbmUgYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncykgZG8gewlcCisJYmNtNDN4eF9sb2NrX25vaXJxKGJjbSk7CQlcCisJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CVwKKwkJfSB3aGlsZSAoMCkKKyNkZWZpbmUgYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKSBkbyB7CVwKKwliY200M3h4X3VubG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpOwlcCisJYmNtNDN4eF91bmxvY2tfbm9pcnEoYmNtKTsJCVwKKwkJfSB3aGlsZSAoMCkKKwogCiBzdGF0aWMgaW5saW5lCiBzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICogYmNtNDN4eF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC04NDMsMTYgKzg4Nyw2IEBACiAJcmV0dXJuICYoYmNtLT5jb3JlXzgwMjExX2V4dFtiY20tPmN1cnJlbnRfODAyMTFfY29yZV9pZHhdLnJhZGlvKTsKIH0KIAotLyogQXJlIHdlIHJ1bm5pbmcgaW4gaW5pdF9ib2FyZCgpIGNvbnRleHQ/ICovCi1zdGF0aWMgaW5saW5lCi1pbnQgYmNtNDN4eF9pc19pbml0aWFsaXppbmcoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKQotewotCWlmIChiY20tPmluaXRpYWxpemVkKQotCQlyZXR1cm4gMDsKLQlpZiAoYmNtLT5zaHV0dGluZ19kb3duKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KIAogc3RhdGljIGlubGluZQogc3RydWN0IGJjbTQzeHhfbG9wYWlyICogYmNtNDN4eF9nZXRfbG9wYWlyKHN0cnVjdCBiY200M3h4X3BoeWluZm8gKnBoeSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfZGVidWdmcy5jCmluZGV4IDc0OTdmYjEuLmNlMmU0MGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2RlYnVnZnMuYwpAQCAtNzcsOCArNzcsOCBAQAogCiAJZG93bigmYmlnX2J1ZmZlcl9zZW0pOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JaWYgKCFiY20tPmluaXRpYWxpemVkKSB7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CisJaWYgKGJjbTQzeHhfc3RhdHVzKGJjbSkgIT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKSB7CiAJCWZhcHBlbmQoIkJvYXJkIG5vdCBpbml0aWFsaXplZC5cbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjEsNyArMTIxLDcgQEAKIAlmYXBwZW5kKCJcbiIpOwogCiBvdXQ6Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiAJdXAoJmJpZ19idWZmZXJfc2VtKTsKIAlyZXR1cm4gcmVzOwpAQCAtMTU5LDggKzE1OSw4IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRvd24oJmJpZ19idWZmZXJfc2VtKTsKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKLQlpZiAoIWJjbS0+aW5pdGlhbGl6ZWQpIHsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKKwlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSAhPSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpIHsKIAkJZmFwcGVuZCgiQm9hcmQgbm90IGluaXRpYWxpemVkLlxuIik7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTE2OSw3ICsxNjksNyBAQAogCWZhcHBlbmQoImJvYXJkZmxhZ3M6IDB4JTA0eFxuIiwgYmNtLT5zcHJvbS5ib2FyZGZsYWdzKTsKIAogb3V0OgotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwogCXVwKCZiaWdfYnVmZmVyX3NlbSk7CiAJcmV0dXJuIHJlczsKQEAgLTE4OCw4ICsxODgsOCBAQAogCXU2NCB0c2Y7CiAKIAlkb3duKCZiaWdfYnVmZmVyX3NlbSk7Ci0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JaWYgKCFiY20tPmluaXRpYWxpemVkKSB7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CisJaWYgKGJjbTQzeHhfc3RhdHVzKGJjbSkgIT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKSB7CiAJCWZhcHBlbmQoIkJvYXJkIG5vdCBpbml0aWFsaXplZC5cbiIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xOTksNyArMTk5LDcgQEAKIAkJKHVuc2lnbmVkIGludCkodHNmICYgMHhGRkZGRkZGRlVMTCkpOwogCiBvdXQ6Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCXJlcyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJidWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiAJdXAoJmJpZ19idWZmZXJfc2VtKTsKIAlyZXR1cm4gcmVzOwpAQCAtMjIxLDggKzIyMSw4IEBACiAJICAgICAgICByZXMgPSAtRUZBVUxUOwogCQlnb3RvIG91dF91cDsKIAl9Ci0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JaWYgKCFiY20tPmluaXRpYWxpemVkKSB7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CisJaWYgKGJjbTQzeHhfc3RhdHVzKGJjbSkgIT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKSB7CiAJCXByaW50ayhLRVJOX0lORk8gUEZYICJkZWJ1Z2ZzOiBCb2FyZCBub3QgaW5pdGlhbGl6ZWQuXG4iKTsKIAkJcmVzID0gLUVGQVVMVDsKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtMjMzLDEwICsyMzMsMTEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAliY200M3h4X3RzZl93cml0ZShiY20sIHRzZik7CisJbW1pb3diKCk7CiAJcmVzID0gYnVmX3NpemU7CiAJCiBvdXRfdW5sb2NrOgotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIG91dF91cDoKIAl1cCgmYmlnX2J1ZmZlcl9zZW0pOwogCXJldHVybiByZXM7CkBAIC0yNTcsNyArMjU4LDcgQEAKIAlpbnQgaSwgY250LCBqID0gMDsKIAogCWRvd24oJmJpZ19idWZmZXJfc2VtKTsKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlmYXBwZW5kKCJMYXN0ICVkIGxvZ2dlZCB4bWl0c3RhdHVzIGJsb2JzIChMYXRlc3QgZmlyc3QpOlxuXG4iLAogCQlCQ000M3h4X05SX0xPR0dFRF9YTUlUU1RBVFVTKTsKQEAgLTI5MywxNCArMjk0LDE0IEBACiAJCQlpID0gQkNNNDN4eF9OUl9MT0dHRURfWE1JVFNUQVRVUyAtIDE7CiAJfQogCi0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlyZXMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlpZiAoKnBwb3MgPT0gcG9zKSB7CiAJCS8qIERvbmUuIERyb3AgdGhlIGNvcGllZCBkYXRhLiAqLwogCQllLT54bWl0c3RhdHVzX3ByaW50aW5nID0gMDsKIAl9Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAl1cCgmYmlnX2J1ZmZlcl9zZW0pOwogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYwppbmRleCA0YjJjMDJjMC4uZWM4MDY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X2xlZHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbGVkcy5jCkBAIC01MSwxMiArNTEsMTIgQEAKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBsZWQtPmJjbTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CiAJaWYgKGxlZC0+YmxpbmtfaW50ZXJ2YWwpIHsKIAkJYmNtNDN4eF9sZWRfY2hhbmdlc3RhdGUobGVkKTsKIAkJbW9kX3RpbWVyKCZsZWQtPmJsaW5rX3RpbWVyLCBqaWZmaWVzICsgbGVkLT5ibGlua19pbnRlcnZhbCk7CiAJfQotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgYmNtNDN4eF9sZWRfYmxpbmtfc3RhcnQoc3RydWN0IGJjbTQzeHhfbGVkICpsZWQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X21haW4uYwppbmRleCA3MzZkZGU5Li4wODVkNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9tYWluLmMKQEAgLTQ5OCwyMCArNDk4LDMxIEBACiAJcmV0dXJuIG9sZF9tYXNrOwogfQogCisvKiBTeW5jaHJvbml6ZSBJUlEgdG9wLSBhbmQgYm90dG9tLWhhbGYuCisgKiBJUlFzIG11c3QgYmUgbWFza2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgKiBUaGlzIG11c3Qgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBpcnFfbG9jayBoZWxkLgorICovCitzdGF0aWMgdm9pZCBiY200M3h4X3N5bmNocm9uaXplX2lycShzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCit7CisJc3luY2hyb25pemVfaXJxKGJjbS0+aXJxKTsKKwl0YXNrbGV0X2Rpc2FibGUoJmJjbS0+aXNyX3Rhc2tsZXQpOworfQorCiAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjZWl2ZSBtb3JlIGRhdGEgZnJvbSB0aGUgZGV2aWNlLiAqLwogc3RhdGljIGludCBiY200M3h4X2Rpc2FibGVfaW50ZXJydXB0c19zeW5jKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgdTMyICpvbGRzdGF0ZSkKIHsKLQl1MzIgb2xkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIG9sZDsKIAotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOwotCWlmIChiY200M3h4X2lzX2luaXRpYWxpemluZyhiY20pIHx8IGJjbS0+c2h1dHRpbmdfZG93bikgewotCQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpOworCWlmICh1bmxpa2VseShiY200M3h4X3N0YXR1cyhiY20pICE9IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCkpIHsKKwkJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJb2xkID0gYmNtNDN4eF9pbnRlcnJ1cHRfZGlzYWJsZShiY20sIEJDTTQzeHhfSVJRX0FMTCk7Ci0JdGFza2xldF9kaXNhYmxlKCZiY20tPmlzcl90YXNrbGV0KTsKLQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CisJYmNtNDN4eF9zeW5jaHJvbml6ZV9pcnEoYmNtKTsKKwogCWlmIChvbGRzdGF0ZSkKIAkJKm9sZHN0YXRlID0gb2xkOwogCkBAIC0xMzg5LDcgKzE0MDAsNyBAQAogCQkJYmNtNDN4eF9kbWFjb250cm9sbGVyX3J4X3Jlc2V0KGJjbSwgQkNNNDN4eF9NTUlPX0RNQTRfQkFTRSk7CiAjZW5kaWYKIAl9Ci0JaWYgKGJjbS0+c2h1dHRpbmdfZG93bikgeworCWlmIChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9TSFVUVElOR0RPV04pIHsKIAkJYmNtNDN4eF93cml0ZTMyKGJjbSwgQkNNNDN4eF9NTUlPX1NUQVRVU19CSVRGSUVMRCwKIAkJICAgICAgICAgICAgICAgIGJjbTQzeHhfcmVhZDMyKGJjbSwgQkNNNDN4eF9NTUlPX1NUQVRVU19CSVRGSUVMRCkKIAkJCQkmIH4oQkNNNDN4eF9TQkZfTUFDX0VOQUJMRUQgfCAweDAwMDAwMDAyKSk7CkBAIC0xNzA5LDcgKzE3MjAsNyBAQAogIyBkZWZpbmUgYmNtaXJxX2hhbmRsZWQoaXJxKQlkbyB7IC8qIG5vdGhpbmcgKi8gfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBDT05GSUdfQkNNNDNYWF9ERUJVRyovCiAKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X2xvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIAlyZWFzb24gPSBiY20tPmlycV9yZWFzb247CiAJZG1hX3JlYXNvblswXSA9IGJjbS0+ZG1hX3JlYXNvblswXTsKIAlkbWFfcmVhc29uWzFdID0gYmNtLT5kbWFfcmVhc29uWzFdOwpAQCAtMTczNCw3ICsxNzQ1LDggQEAKIAkJICAgICAgICBkbWFfcmVhc29uWzBdLCBkbWFfcmVhc29uWzFdLAogCQkJZG1hX3JlYXNvblsyXSwgZG1hX3JlYXNvblszXSk7CiAJCWJjbTQzeHhfY29udHJvbGxlcl9yZXN0YXJ0KGJjbSwgIkRNQSBlcnJvciIpOwotCQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCQltbWlvd2IoKTsKKwkJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAlpZiAodW5saWtlbHkoKGRtYV9yZWFzb25bMF0gJiBCQ000M3h4X0RNQUlSUV9OT05GQVRBTE1BU0spIHwKQEAgLTE4MjEsNyArMTgzMyw4IEBACiAJaWYgKCFtb2RwYXJhbV9ub2xlZHMpCiAJCWJjbTQzeHhfbGVkc191cGRhdGUoYmNtLCBhY3Rpdml0eSk7CiAJYmNtNDN4eF9pbnRlcnJ1cHRfZW5hYmxlKGJjbSwgYmNtLT5pcnFfc2F2ZWRzdGF0ZSk7Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwltbWlvd2IoKTsKKwliY200M3h4X3VubG9ja19pcnFvbmx5KGJjbSwgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBwaW9faXJxX3dvcmthcm91bmQoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtLApAQCAtMTg3MCw3ICsxODgzLDcgQEAKIAlpZiAoIWJjbSkKIAkJcmV0dXJuIElSUV9OT05FOwogCi0Jc3Bpbl9sb2NrKCZiY20tPl9sb2NrKTsKKwlzcGluX2xvY2soJmJjbS0+aXJxX2xvY2spOwogCiAJcmVhc29uID0gYmNtNDN4eF9yZWFkMzIoYmNtLCBCQ000M3h4X01NSU9fR0VOX0lSUV9SRUFTT04pOwogCWlmIChyZWFzb24gPT0gMHhmZmZmZmZmZikgewpAQCAtMTg5OSw3ICsxOTEyLDcgQEAKIAkgKiBjb21wbGV0ZWx5LCBidXQgc29tZSBjYXJlZnVsIHdvcmsgaXMgbmVlZGVkIHRvIGZpeCB0aGlzLiBJIHRoaW5rIGl0CiAJICogaXMgYmVzdCB0byBzdGF5IHdpdGggdGhpcyBjaGVhcCB3b3JrYXJvdW5kIGZvciBub3cuLi4gLgogCSAqLwotCWlmIChsaWtlbHkoYmNtLT5pbml0aWFsaXplZCkpIHsKKwlpZiAobGlrZWx5KGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKSkgewogCQkvKiBkaXNhYmxlIGFsbCBJUlFzLiBUaGV5IGFyZSBlbmFibGVkIGFnYWluIGluIHRoZSBib3R0b20gaGFsZi4gKi8KIAkJYmNtLT5pcnFfc2F2ZWRzdGF0ZSA9IGJjbTQzeHhfaW50ZXJydXB0X2Rpc2FibGUoYmNtLCBCQ000M3h4X0lSUV9BTEwpOwogCQkvKiBzYXZlIHRoZSByZWFzb24gY29kZSBhbmQgY2FsbCBvdXIgYm90dG9tIGhhbGYuICovCkBAIC0xOTA5LDcgKzE5MjIsNyBAQAogCiBvdXQ6CiAJbW1pb3diKCk7Ci0Jc3Bpbl91bmxvY2soJmJjbS0+X2xvY2spOworCXNwaW5fdW5sb2NrKCZiY20tPmlycV9sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMTMzLDYgKzIxNDYsMTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaWZkZWYgQ09ORklHX0JDTTk0N1hYCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYmNtNDN4eF80N3h4X2lkc1tdID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzMjQpIH0sCisJeyAwIH0KK307CisjZW5kaWYKKwogc3RhdGljIGludCBiY200M3h4X2luaXRpYWxpemVfaXJxKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKIAlpbnQgcmVzOwpAQCAtMjE0MiwxMSArMjE2MiwxNSBAQAogCWJjbS0+aXJxID0gYmNtLT5wY2lfZGV2LT5pcnE7CiAjaWZkZWYgQ09ORklHX0JDTTk0N1hYCiAJaWYgKGJjbS0+cGNpX2Rldi0+YnVzLT5udW1iZXIgPT0gMCkgewotCQlzdHJ1Y3QgcGNpX2RldiAqZCA9IE5VTEw7Ci0JCS8qIEZJWE1FOiB3ZSB3aWxsIHByb2JhYmx5IG5lZWQgbW9yZSBkZXZpY2UgSURzIGhlcmUuLi4gKi8KLQkJZCA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzMjQsIE5VTEwpOwotCQlpZiAoZCAhPSBOVUxMKSB7Ci0JCQliY20tPmlycSA9IGQtPmlycTsKKwkJc3RydWN0IHBjaV9kZXYgKmQ7CisJCXN0cnVjdCBwY2lfZGV2aWNlX2lkICppZDsKKwkJZm9yIChpZCA9IGJjbTQzeHhfNDd4eF9pZHM7IGlkLT52ZW5kb3I7IGlkKyspIHsKKwkJCWQgPSBwY2lfZ2V0X2RldmljZShpZC0+dmVuZG9yLCBpZC0+ZGV2aWNlLCBOVUxMKTsKKwkJCWlmIChkICE9IE5VTEwpIHsKKwkJCQliY20tPmlycSA9IGQtPmlycTsKKwkJCQlwY2lfZGV2X3B1dChkKTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KICNlbmRpZgpAQCAtMzEwNiwxNSArMzEzMCwxMCBAQAogCS8vVE9ETyBmb3IgQVBIWSAodGVtcGVyYXR1cmU/KQogfQogCi1zdGF0aWMgdm9pZCBiY200M3h4X3BlcmlvZGljX3Rhc2tfaGFuZGxlcih1bnNpZ25lZCBsb25nIGQpCitzdGF0aWMgdm9pZCBkb19wZXJpb2RpY193b3JrKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSAoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqKWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKLQotCWFzc2VydChiY20tPmluaXRpYWxpemVkKTsKIAlzdGF0ZSA9IGJjbS0+cGVyaW9kaWNfc3RhdGU7CiAJaWYgKHN0YXRlICUgOCA9PSAwKQogCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTIwc2VjKGJjbSk7CkBAIC0zMTIyLDI5ICszMTQxLDkzIEBACiAJCWJjbTQzeHhfcGVyaW9kaWNfZXZlcnk2MHNlYyhiY20pOwogCWlmIChzdGF0ZSAlIDIgPT0gMCkKIAkJYmNtNDN4eF9wZXJpb2RpY19ldmVyeTMwc2VjKGJjbSk7Ci0JYmNtNDN4eF9wZXJpb2RpY19ldmVyeTE1c2VjKGJjbSk7CisJaWYgKHN0YXRlICUgMSA9PSAwKQorCQliY200M3h4X3BlcmlvZGljX2V2ZXJ5MTVzZWMoYmNtKTsKIAliY20tPnBlcmlvZGljX3N0YXRlID0gc3RhdGUgKyAxOwogCi0JbW9kX3RpbWVyKCZiY20tPnBlcmlvZGljX3Rhc2tzLCBqaWZmaWVzICsgKEhaICogMTUpKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJjbS0+cGVyaW9kaWNfd29yaywgSFogKiAxNSk7Cit9CiAKLQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworLyogRXN0aW1hdGUgYSAiQmFkbmVzcyIgdmFsdWUgYmFzZWQgb24gdGhlIHBlcmlvZGljIHdvcmsKKyAqIHN0YXRlLW1hY2hpbmUgc3RhdGUuICJCYWRuZXNzIiBpcyB3b3JzZSAoYmlnZ2VyKSwgaWYgdGhlCisgKiBwZXJpb2RpYyB3b3JrIHdpbGwgdGFrZSBsb25nZXIuCisgKi8KK3N0YXRpYyBpbnQgZXN0aW1hdGVfcGVyaW9kaWNfd29ya19iYWRuZXNzKHVuc2lnbmVkIGludCBzdGF0ZSkKK3sKKwlpbnQgYmFkbmVzcyA9IDA7CisKKwlpZiAoc3RhdGUgJSA4ID09IDApIC8qIGV2ZXJ5IDEyMCBzZWMgKi8KKwkJYmFkbmVzcyArPSAxMDsKKwlpZiAoc3RhdGUgJSA0ID09IDApIC8qIGV2ZXJ5IDYwIHNlYyAqLworCQliYWRuZXNzICs9IDU7CisJaWYgKHN0YXRlICUgMiA9PSAwKSAvKiBldmVyeSAzMCBzZWMgKi8KKwkJYmFkbmVzcyArPSAxOworCWlmIChzdGF0ZSAlIDEgPT0gMCkgLyogZXZlcnkgMTUgc2VjICovCisJCWJhZG5lc3MgKz0gMTsKKworI2RlZmluZSBCQURORVNTX0xJTUlUCTQKKwlyZXR1cm4gYmFkbmVzczsKK30KKworc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIodm9pZCAqZCkKK3sKKwlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHNhdmVkaXJxcyA9IDA7CisJaW50IGJhZG5lc3M7CisKKwliYWRuZXNzID0gZXN0aW1hdGVfcGVyaW9kaWNfd29ya19iYWRuZXNzKGJjbS0+cGVyaW9kaWNfc3RhdGUpOworCWlmIChiYWRuZXNzID4gQkFETkVTU19MSU1JVCkgeworCQkvKiBQZXJpb2RpYyB3b3JrIHdpbGwgdGFrZSBhIGxvbmcgdGltZSwgc28gd2Ugd2FudCBpdCB0bworCQkgKiBiZSBwcmVlbXRpYmxlLgorCQkgKi8KKwkJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CisJCW5ldGlmX3N0b3BfcXVldWUoYmNtLT5uZXRfZGV2KTsKKwkJaWYgKGJjbTQzeHhfdXNpbmdfcGlvKGJjbSkpCisJCQliY200M3h4X3Bpb19mcmVlemVfdHhxdWV1ZXMoYmNtKTsKKwkJc2F2ZWRpcnFzID0gYmNtNDN4eF9pbnRlcnJ1cHRfZGlzYWJsZShiY20sIEJDTTQzeHhfSVJRX0FMTCk7CisJCWJjbTQzeHhfdW5sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CisJCWJjbTQzeHhfbG9ja19ub2lycShiY20pOworCQliY200M3h4X3N5bmNocm9uaXplX2lycShiY20pOworCX0gZWxzZSB7CisJCS8qIFBlcmlvZGljIHdvcmsgc2hvdWxkIHRha2Ugc2hvcnQgdGltZSwgc28gd2Ugd2FudCBsb3cKKwkJICogbG9ja2luZyBvdmVyaGVhZC4KKwkJICovCisJCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOworCX0KKworCWRvX3BlcmlvZGljX3dvcmsoYmNtKTsKKworCWlmIChiYWRuZXNzID4gQkFETkVTU19MSU1JVCkgeworCQliY200M3h4X2xvY2tfaXJxb25seShiY20sIGZsYWdzKTsKKwkJaWYgKGxpa2VseShiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCkpIHsKKwkJCXRhc2tsZXRfZW5hYmxlKCZiY20tPmlzcl90YXNrbGV0KTsKKwkJCWJjbTQzeHhfaW50ZXJydXB0X2VuYWJsZShiY20sIHNhdmVkaXJxcyk7CisJCQlpZiAoYmNtNDN4eF91c2luZ19waW8oYmNtKSkKKwkJCQliY200M3h4X3Bpb190aGF3X3R4cXVldWVzKGJjbSk7CisJCX0KKwkJbmV0aWZfd2FrZV9xdWV1ZShiY20tPm5ldF9kZXYpOworCQltbWlvd2IoKTsKKwkJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKKwkJYmNtNDN4eF91bmxvY2tfbm9pcnEoYmNtKTsKKwl9IGVsc2UgeworCQltbWlvd2IoKTsKKwkJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGJjbTQzeHhfcGVyaW9kaWNfdGFza3NfZGVsZXRlKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKLQlkZWxfdGltZXJfc3luYygmYmNtLT5wZXJpb2RpY190YXNrcyk7CisJY2FuY2VsX3JlYXJtaW5nX2RlbGF5ZWRfd29yaygmYmNtLT5wZXJpb2RpY193b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgYmNtNDN4eF9wZXJpb2RpY190YXNrc19zZXR1cChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyID0gJihiY20tPnBlcmlvZGljX3Rhc2tzKTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsgPSAmKGJjbS0+cGVyaW9kaWNfd29yayk7CiAKLQlhc3NlcnQoYmNtLT5pbml0aWFsaXplZCk7Ci0Jc2V0dXBfdGltZXIodGltZXIsCi0JCSAgICBiY200M3h4X3BlcmlvZGljX3Rhc2tfaGFuZGxlciwKLQkJICAgICh1bnNpZ25lZCBsb25nKWJjbSk7Ci0JdGltZXItPmV4cGlyZXMgPSBqaWZmaWVzOwotCWFkZF90aW1lcih0aW1lcik7CisJYXNzZXJ0KGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKTsKKwlJTklUX1dPUksod29yaywgYmNtNDN4eF9wZXJpb2RpY193b3JrX2hhbmRsZXIsIGJjbSk7CisJc2NoZWR1bGVfd29yayh3b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgYmNtNDN4eF9zZWN1cml0eV9pbml0KHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKQEAgLTMxNTgsMTYgKzMyNDEsMTIgQEAKIHN0YXRpYyB2b2lkIGJjbTQzeHhfZnJlZV9ib2FyZChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CiAJaW50IGksIGVycjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJYmNtNDN4eF9sb2NrX25vaXJxKGJjbSk7CiAJYmNtNDN4eF9zeXNmc191bnJlZ2lzdGVyKGJjbSk7Ci0KIAliY200M3h4X3BlcmlvZGljX3Rhc2tzX2RlbGV0ZShiY20pOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOwotCWJjbS0+aW5pdGlhbGl6ZWQgPSAwOwotCWJjbS0+c2h1dHRpbmdfZG93biA9IDE7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9zZXRfc3RhdHVzKGJjbSwgQkNNNDN4eF9TVEFUX1NIVVRUSU5HRE9XTik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQkNNNDN4eF9NQVhfODAyMTFfQ09SRVM7IGkrKykgewogCQlpZiAoIWJjbS0+Y29yZV84MDIxMVtpXS5hdmFpbGFibGUpCkBAIC0zMTgyLDIzICszMjYxLDE5IEBACiAKIAliY200M3h4X3BjdGxfc2V0X2NyeXN0YWwoYmNtLCAwKTsKIAotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKLQliY20tPnNodXR0aW5nX2Rvd24gPSAwOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfc2V0X3N0YXR1cyhiY20sIEJDTTQzeHhfU1RBVF9VTklOSVQpOworCWJjbTQzeHhfdW5sb2NrX25vaXJxKGJjbSk7CiB9CiAKIHN0YXRpYyBpbnQgYmNtNDN4eF9pbml0X2JvYXJkKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKIHsKIAlpbnQgaSwgZXJyOwogCWludCBjb25uZWN0X3BoeTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKLQliY20tPmluaXRpYWxpemVkID0gMDsKLQliY20tPnNodXR0aW5nX2Rvd24gPSAwOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19ub2lycShiY20pOworCWJjbTQzeHhfc2V0X3N0YXR1cyhiY20sIEJDTTQzeHhfU1RBVF9JTklUSUFMSVpJTkcpOwogCiAJZXJyID0gYmNtNDN4eF9wY3RsX3NldF9jcnlzdGFsKGJjbSwgMSk7CiAJaWYgKGVycikKQEAgLTMyNjUsOSArMzM0MCw3IEBACiAJfQogCiAJLyogSW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvYXJkIGlzIGRvbmUuIEZsYWcgaXQgYXMgc3VjaC4gKi8KLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7Ci0JYmNtLT5pbml0aWFsaXplZCA9IDE7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9zZXRfc3RhdHVzKGJjbSwgQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKTsKIAogCWJjbTQzeHhfcGVyaW9kaWNfdGFza3Nfc2V0dXAoYmNtKTsKIAliY200M3h4X3N5c2ZzX3JlZ2lzdGVyKGJjbSk7CkBAIC0zMjc4LDYgKzMzNTEsOCBAQAogCiAJYXNzZXJ0KGVyciA9PSAwKTsKIG91dDoKKwliY200M3h4X3VubG9ja19ub2lycShiY20pOworCiAJcmV0dXJuIGVycjsKIAogZXJyXzgwMjExX3Vud2luZDoKQEAgLTM1MzQsOCArMzYwOSw4IEBACiAJc3RydWN0IGJjbTQzeHhfcmFkaW9pbmZvICpyYWRpbzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JaWYgKGJjbS0+aW5pdGlhbGl6ZWQpIHsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKKwlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSA9PSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpIHsKIAkJYmNtNDN4eF9tYWNfc3VzcGVuZChiY20pOwogCQliY200M3h4X3JhZGlvX3NlbGVjdGNoYW5uZWwoYmNtLCBjaGFubmVsLCAwKTsKIAkJYmNtNDN4eF9tYWNfZW5hYmxlKGJjbSk7CkBAIC0zNTQzLDcgKzM2MTgsNyBAQAogCQlyYWRpbyA9IGJjbTQzeHhfY3VycmVudF9yYWRpbyhiY20pOwogCQlyYWRpby0+aW5pdGlhbF9jaGFubmVsID0gY2hhbm5lbDsKIAl9Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogfQogCiAvKiBzZXRfc2VjdXJpdHkoKSBjYWxsYmFjayBpbiBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqLwpAQCAtMzU1Nyw3ICszNjMyLDcgQEAKIAkKIAlkcHJpbnRrKEtFUk5fSU5GTyBQRlggInNldCBzZWN1cml0eSBjYWxsZWQiKTsKIAotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJZm9yIChrZXlpZHggPSAwOyBrZXlpZHg8V0VQX0tFWVM7IGtleWlkeCsrKQogCQlpZiAoc2VjLT5mbGFncyAmICgxPDxrZXlpZHgpKSB7CkBAIC0zNTg3LDcgKzM2NjIsOCBAQAogCQlkcHJpbnRrKCIsIC5lbmNyeXB0ID0gJWQiLCBzZWMtPmVuY3J5cHQpOwogCX0KIAlkcHJpbnRrKCJcbiIpOwotCWlmIChiY20tPmluaXRpYWxpemVkICYmICFiY20tPmllZWUtPmhvc3RfZW5jcnlwdCkgeworCWlmIChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCAmJgorCSAgICAhYmNtLT5pZWVlLT5ob3N0X2VuY3J5cHQpIHsKIAkJaWYgKHNlY2luZm8tPmVuYWJsZWQpIHsKIAkJCS8qIHVwbG9hZCBXRVAga2V5cyB0byBoYXJkd2FyZSAqLwogCQkJY2hhciBudWxsX2FkZHJlc3NbNl0gPSB7IDAgfTsKQEAgLTM2MjEsNyArMzY5Nyw3IEBACiAJCX0gZWxzZQogCQkJCWJjbTQzeHhfY2xlYXJfa2V5cyhiY20pOwogCX0KLQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiB9CiAKIC8qIGhhcmRfc3RhcnRfeG1pdCgpIGNhbGxiYWNrIGluIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICovCkBAIC0zNjMzLDEwICszNzA5LDEwIEBACiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOwotCWlmIChsaWtlbHkoYmNtLT5pbml0aWFsaXplZCkpCisJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CisJaWYgKGxpa2VseShiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCkpCiAJCWVyciA9IGJjbTQzeHhfdHgoYmNtLCB0eGIpOwotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0zNjUxLDkgKzM3MjcsOSBAQAogCXN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSA9IGJjbTQzeHhfcHJpdihuZXRfZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CiAJYmNtNDN4eF9jb250cm9sbGVyX3Jlc3RhcnQoYmNtLCAiVFggdGltZW91dCIpOwotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIH0KIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCkBAIC0zNjc4LDkgKzM3NTQsMTEgQEAKIHN0YXRpYyBpbnQgYmNtNDN4eF9uZXRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldikKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBiY200M3h4X3ByaXYobmV0X2Rldik7CisJaW50IGVycjsKIAogCWllZWU4MDIxMXNvZnRtYWNfc3RvcChuZXRfZGV2KTsKLQliY200M3h4X2Rpc2FibGVfaW50ZXJydXB0c19zeW5jKGJjbSwgTlVMTCk7CisJZXJyID0gYmNtNDN4eF9kaXNhYmxlX2ludGVycnVwdHNfc3luYyhiY20sIE5VTEwpOworCWFzc2VydCghZXJyKTsKIAliY200M3h4X2ZyZWVfYm9hcmQoYmNtKTsKIAogCXJldHVybiAwOwpAQCAtMzY5Miw2ICszNzcwLDcgQEAKIHsKIAlpbnQgZXJyOwogCisJYmNtNDN4eF9zZXRfc3RhdHVzKGJjbSwgQkNNNDN4eF9TVEFUX1VOSU5JVCk7CiAJYmNtLT5pZWVlID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAJYmNtLT5zb2Z0bWFjID0gaWVlZTgwMjExX3ByaXYobmV0X2Rldik7CiAJYmNtLT5zb2Z0bWFjLT5zZXRfY2hhbm5lbCA9IGJjbTQzeHhfaWVlZTgwMjExX3NldF9jaGFuOwpAQCAtMzcwMCw3ICszNzc5LDggQEAKIAliY20tPnBjaV9kZXYgPSBwY2lfZGV2OwogCWJjbS0+bmV0X2RldiA9IG5ldF9kZXY7CiAJYmNtLT5iYWRfZnJhbWVzX3ByZWVtcHQgPSBtb2RwYXJhbV9iYWRfZnJhbWVzX3ByZWVtcHQ7Ci0Jc3Bpbl9sb2NrX2luaXQoJmJjbS0+X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZiY20tPmlycV9sb2NrKTsKKwltdXRleF9pbml0KCZiY20tPm11dGV4KTsKIAl0YXNrbGV0X2luaXQoJmJjbS0+aXNyX3Rhc2tsZXQsCiAJCSAgICAgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWJjbTQzeHhfaW50ZXJydXB0X3Rhc2tsZXQsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcpYmNtKTsKQEAgLTM4MzEsNyArMzkxMSw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiY20tPm5ldF9kZXY7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBiY20tPnBjaV9kZXY7CiAJaW50IGVycjsKLQlpbnQgd2FzX2luaXRpYWxpemVkID0gYmNtLT5pbml0aWFsaXplZDsKKwlpbnQgd2FzX2luaXRpYWxpemVkID0gKGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKTsKIAogCW5ldGlmX3N0b3BfcXVldWUoYmNtLT5uZXRfZGV2KTsKIAl0YXNrbGV0X2Rpc2FibGUoJmJjbS0+aXNyX3Rhc2tsZXQpOwpAQCAtMzg2Niw2ICszOTQ2LDcgQEAKICovCiB2b2lkIGJjbTQzeHhfY29udHJvbGxlcl9yZXN0YXJ0KHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSwgY29uc3QgY2hhciAqcmVhc29uKQogeworCWJjbTQzeHhfc2V0X3N0YXR1cyhiY20sIEJDTTQzeHhfU1RBVF9SRVNUQVJUSU5HKTsKIAliY200M3h4X2ludGVycnVwdF9kaXNhYmxlKGJjbSwgQkNNNDN4eF9JUlFfQUxMKTsKIAliY200M3h4X3JlYWQzMihiY20sIEJDTTQzeHhfTU1JT19TVEFUVVNfQklURklFTEQpOyAvKiBkdW1teSByZWFkICovCiAJcHJpbnRrKEtFUk5fRVJSIFBGWCAiQ29udHJvbGxlciBSRVNFVCAoJXMpIC4uLlxuIiwgcmVhc29uKTsKQEAgLTM4ODQsMTEgKzM5NjUsMTEgQEAKIAogCWRwcmludGsoS0VSTl9JTkZPIFBGWCAiU3VzcGVuZGluZy4uLlxuIik7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7Ci0JYmNtLT53YXNfaW5pdGlhbGl6ZWQgPSBiY20tPmluaXRpYWxpemVkOwotCWlmIChiY20tPmluaXRpYWxpemVkKQorCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOworCWJjbS0+d2FzX2luaXRpYWxpemVkID0gKGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKTsKKwlpZiAoYmNtLT53YXNfaW5pdGlhbGl6ZWQpCiAJCXRyeV90b19zaHV0ZG93biA9IDE7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCW5ldGlmX2RldmljZV9kZXRhY2gobmV0X2Rldik7CiAJaWYgKHRyeV90b19zaHV0ZG93bikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3BoeS5jCmluZGV4IGIwYWJhYzUuLmY4MjAwZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGh5LmMKQEAgLTE0MTAsNyArMTQxMCwxMCBAQAogdTE2IGJjbTQzeHhfcGh5X2xvX2dfZGV2aWF0aW9uX3N1YnZhbChzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20sIHUxNiBjb250cm9sKQogewogCXN0cnVjdCBiY200M3h4X3BoeWluZm8gKnBoeSA9IGJjbTQzeHhfY3VycmVudF9waHkoYmNtKTsKKwl1MTYgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKHBoeS0+Y29ubmVjdGVkKSB7CiAJCWJjbTQzeHhfcGh5X3dyaXRlKGJjbSwgMHgxNSwgMHhFMzAwKTsKIAkJY29udHJvbCA8PD0gODsKQEAgLTE0MzAsOCArMTQzMywxMCBAQAogCQliY200M3h4X3BoeV93cml0ZShiY20sIDB4MDAxNSwgY29udHJvbCB8IDB4RkZFMCk7CiAJCXVkZWxheSg4KTsKIAl9CisJcmV0ID0gYmNtNDN4eF9waHlfcmVhZChiY20sIDB4MDAyRCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JcmV0dXJuIGJjbTQzeHhfcGh5X3JlYWQoYmNtLCAweDAwMkQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB1MzIgYmNtNDN4eF9waHlfbG9fZ19zaW5nbGVkZXZpYXRpb24oc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtLCB1MTYgY29udHJvbCkKQEAgLTE2NDgsNyArMTY1Myw3IEBACiB2b2lkIGJjbTQzeHhfcGh5X2xvX2dfbWVhc3VyZShzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCiB7CiAJc3RhdGljIGNvbnN0IHU4IHBhaXJvcmRlclsxMF0gPSB7IDMsIDEsIDUsIDcsIDksIDIsIDAsIDQsIDYsIDggfTsKLQljb25zdCBpbnQgaXNfaW5pdGlhbGl6aW5nID0gYmNtNDN4eF9pc19pbml0aWFsaXppbmcoYmNtKTsKKwljb25zdCBpbnQgaXNfaW5pdGlhbGl6aW5nID0gKGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWklORyk7CiAJc3RydWN0IGJjbTQzeHhfcGh5aW5mbyAqcGh5ID0gYmNtNDN4eF9jdXJyZW50X3BoeShiY20pOwogCXN0cnVjdCBiY200M3h4X3JhZGlvaW5mbyAqcmFkaW8gPSBiY200M3h4X2N1cnJlbnRfcmFkaW8oYmNtKTsKIAl1MTYgaCwgaSwgb2xkaSA9IDAsIGo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGlvLmMKaW5kZXggMGFhMWJkMi4uNTc0MDg1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waW8uYwpAQCAtMjYyLDggKzI2MiwxMCBAQAogCWludCBlcnI7CiAJdTE2IHR4Y3RsOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycW9ubHkoYmNtLCBmbGFncyk7CiAKKwlpZiAocXVldWUtPnR4X2Zyb3plbikKKwkJZ290byBvdXRfdW5sb2NrOwogCXR4Y3RsID0gYmNtNDN4eF9waW9fcmVhZChxdWV1ZSwgQkNNNDN4eF9QSU9fVFhDVEwpOwogCWlmICh0eGN0bCAmIEJDTTQzeHhfUElPX1RYQ1RMX1NVU1BFTkQpCiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTI5OCw3ICszMDAsNyBAQAogCQljb250aW51ZTsKIAl9CiBvdXRfdW5sb2NrOgotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxb25seShiY20sIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfdHhxdWV1ZXMoc3RydWN0IGJjbTQzeHhfcGlvcXVldWUgKnF1ZXVlKQpAQCAtMzc0LDcgKzM3Niw2IEBACiAJc3RydWN0IGJjbTQzeHhfcGlvX3R4cGFja2V0ICpwYWNrZXQsICp0bXBfcGFja2V0OwogCiAJbmV0aWZfdHhfZGlzYWJsZShxdWV1ZS0+YmNtLT5uZXRfZGV2KTsKLQlhc3NlcnQocXVldWUtPmJjbS0+c2h1dHRpbmdfZG93bik7CiAJdGFza2xldF9kaXNhYmxlKCZxdWV1ZS0+dHh0YXNrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHRtcF9wYWNrZXQsICZxdWV1ZS0+dHhydW5uaW5nLCBsaXN0KQpAQCAtNjM0LDUgKzYzNSw0MCBAQAogCQkJICBiY200M3h4X3Bpb19yZWFkKHF1ZXVlLCBCQ000M3h4X1BJT19UWENUTCkKIAkJCSAgJiB+QkNNNDN4eF9QSU9fVFhDVExfU1VTUEVORCk7CiAJYmNtNDN4eF9wb3dlcl9zYXZpbmdfY3RsX2JpdHMocXVldWUtPmJjbSwgLTEsIC0xKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZxdWV1ZS0+dHh0YXNrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnF1ZXVlLT50eHF1ZXVlKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmcXVldWUtPnR4dGFzayk7CiB9CisKK3ZvaWQgYmNtNDN4eF9waW9fZnJlZXplX3R4cXVldWVzKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKKwlzdHJ1Y3QgYmNtNDN4eF9waW8gKnBpbzsKKworCWFzc2VydChiY200M3h4X3VzaW5nX3BpbyhiY20pKTsKKwlwaW8gPSBiY200M3h4X2N1cnJlbnRfcGlvKGJjbSk7CisJcGlvLT5xdWV1ZTAtPnR4X2Zyb3plbiA9IDE7CisJcGlvLT5xdWV1ZTEtPnR4X2Zyb3plbiA9IDE7CisJcGlvLT5xdWV1ZTItPnR4X2Zyb3plbiA9IDE7CisJcGlvLT5xdWV1ZTMtPnR4X2Zyb3plbiA9IDE7Cit9CisKK3ZvaWQgYmNtNDN4eF9waW9fdGhhd190eHF1ZXVlcyhzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCit7CisJc3RydWN0IGJjbTQzeHhfcGlvICpwaW87CisKKwlhc3NlcnQoYmNtNDN4eF91c2luZ19waW8oYmNtKSk7CisJcGlvID0gYmNtNDN4eF9jdXJyZW50X3BpbyhiY20pOworCXBpby0+cXVldWUwLT50eF9mcm96ZW4gPSAwOworCXBpby0+cXVldWUxLT50eF9mcm96ZW4gPSAwOworCXBpby0+cXVldWUyLT50eF9mcm96ZW4gPSAwOworCXBpby0+cXVldWUzLT50eF9mcm96ZW4gPSAwOworCWlmICghbGlzdF9lbXB0eSgmcGlvLT5xdWV1ZTAtPnR4cXVldWUpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZwaW8tPnF1ZXVlMC0+dHh0YXNrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnBpby0+cXVldWUxLT50eHF1ZXVlKSkKKwkJdGFza2xldF9zY2hlZHVsZSgmcGlvLT5xdWV1ZTEtPnR4dGFzayk7CisJaWYgKCFsaXN0X2VtcHR5KCZwaW8tPnF1ZXVlMi0+dHhxdWV1ZSkpCisJCXRhc2tsZXRfc2NoZWR1bGUoJnBpby0+cXVldWUyLT50eHRhc2spOworCWlmICghbGlzdF9lbXB0eSgmcGlvLT5xdWV1ZTMtPnR4cXVldWUpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZwaW8tPnF1ZXVlMy0+dHh0YXNrKTsKK30KKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfcGlvLmgKaW5kZXggZGZjNzgyMC4uYmM3OGEzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3Bpby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF9waW8uaApAQCAtNTQsNiArNTQsNyBAQAogCXUxNiBtbWlvX2Jhc2U7CiAKIAl1OCB0eF9zdXNwZW5kZWQ6MSwKKwkgICB0eF9mcm96ZW46MSwKIAkgICBuZWVkX3dvcmthcm91bmRzOjE7IC8qIFdvcmthcm91bmRzIG5lZWRlZCBmb3IgY29yZS5yZXYgPCAzICovCiAKIAkvKiBBZGp1c3RlZCBzaXplIG9mIHRoZSBkZXZpY2UgaW50ZXJuYWwgVFggYnVmZmVyLiAqLwpAQCAtMTA4LDggKzEwOSwxMiBAQAogCQkJCSAgIHN0cnVjdCBiY200M3h4X3htaXRzdGF0dXMgKnN0YXR1cyk7CiB2b2lkIGJjbTQzeHhfcGlvX3J4KHN0cnVjdCBiY200M3h4X3Bpb3F1ZXVlICpxdWV1ZSk7CiAKKy8qIFN1c3BlbmQgYSBUWCBxdWV1ZSBvbiBoYXJkd2FyZSBsZXZlbC4gKi8KIHZvaWQgYmNtNDN4eF9waW9fdHhfc3VzcGVuZChzdHJ1Y3QgYmNtNDN4eF9waW9xdWV1ZSAqcXVldWUpOwogdm9pZCBiY200M3h4X3Bpb190eF9yZXN1bWUoc3RydWN0IGJjbTQzeHhfcGlvcXVldWUgKnF1ZXVlKTsKKy8qIFN1c3BlbmQgKGZyZWV6ZSkgdGhlIFRYIHRhc2tsZXQgKHNvZnR3YXJlIGxldmVsKS4gKi8KK3ZvaWQgYmNtNDN4eF9waW9fZnJlZXplX3R4cXVldWVzKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSk7Cit2b2lkIGJjbTQzeHhfcGlvX3RoYXdfdHhxdWV1ZXMoc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtKTsKIAogI2Vsc2UgLyogQ09ORklHX0JDTTQzWFhfUElPICovCiAKQEAgLTE0NSw2ICsxNTAsMTQgQEAKIHZvaWQgYmNtNDN4eF9waW9fdHhfcmVzdW1lKHN0cnVjdCBiY200M3h4X3Bpb3F1ZXVlICpxdWV1ZSkKIHsKIH0KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYmNtNDN4eF9waW9fZnJlZXplX3R4cXVldWVzKHN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSkKK3sKK30KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgYmNtNDN4eF9waW9fdGhhd190eHF1ZXVlcyhzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20pCit7Cit9CiAKICNlbmRpZiAvKiBDT05GSUdfQkNNNDNYWF9QSU8gKi8KICNlbmRpZiAvKiBCQ000M3h4X1BJT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYmNtNDN4eC9iY200M3h4X3N5c2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfc3lzZnMuYwppbmRleCBiNDM4ZjQ4Li42YTIzYmRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfc3lzZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfc3lzZnMuYwpAQCAtMTIwLDEyICsxMjAsMTIgQEAKIAkJCUdGUF9LRVJORUwpOwogCWlmICghc3Byb20pCiAJCXJldHVybiAtRU5PTUVNOwotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOwotCWFzc2VydChiY20tPmluaXRpYWxpemVkKTsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAllcnIgPSBiY200M3h4X3Nwcm9tX3JlYWQoYmNtLCBzcHJvbSk7CiAJaWYgKCFlcnIpCiAJCWVyciA9IHNwcm9tMmhleChzcHJvbSwgYnVmLCBQQUdFX1NJWkUpOwotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJbW1pb3diKCk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlrZnJlZShzcHJvbSk7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTUwLDEwICsxNTAsMTAgQEAKIAllcnIgPSBoZXgyc3Byb20oc3Byb20sIGJ1ZiwgY291bnQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2tmcmVlOwotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOwotCWFzc2VydChiY20tPmluaXRpYWxpemVkKTsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAllcnIgPSBiY200M3h4X3Nwcm9tX3dyaXRlKGJjbSwgc3Byb20pOwotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJbW1pb3diKCk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIG91dF9rZnJlZToKIAlrZnJlZShzcHJvbSk7CiAKQEAgLTE3MCwxNSArMTcwLDEzIEBACiAJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtID0gZGV2X3RvX2JjbShkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVycjsKIAlzc2l6ZV90IGNvdW50ID0gMDsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKLQlhc3NlcnQoYmNtLT5pbml0aWFsaXplZCk7CisJYmNtNDN4eF9sb2NrX25vaXJxKGJjbSk7CiAKIAlzd2l0Y2ggKGJjbTQzeHhfY3VycmVudF9yYWRpbyhiY20pLT5pbnRlcmZtb2RlKSB7CiAJY2FzZSBCQ000M3h4X1JBRElPX0lOVEVSRk1PREVfTk9ORToKQEAgLTE5NSw3ICsxOTMsNyBAQAogCX0KIAllcnIgPSAwOwogCi0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfbm9pcnEoYmNtKTsKIAogCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKIApAQCAtMjMxLDE2ICsyMjksMTUgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JYXNzZXJ0KGJjbS0+aW5pdGlhbGl6ZWQpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJZXJyID0gYmNtNDN4eF9yYWRpb19zZXRfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24oYmNtLCBtb2RlKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkludGVyZmVyZW5jZSBNaXRpZ2F0aW9uIG5vdCAiCiAJCQkJICAgICJzdXBwb3J0ZWQgYnkgZGV2aWNlXG4iKTsKIAl9Ci0KLQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCW1taW93YigpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlyZXR1cm4gZXJyID8gZXJyIDogY291bnQ7CiB9CkBAIC0yNTQsMTUgKzI1MSwxMyBAQAogCQkJCQkgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBkZXZfdG9fYmNtKGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgZXJyOwogCXNzaXplX3QgY291bnQ7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7Ci0JYXNzZXJ0KGJjbS0+aW5pdGlhbGl6ZWQpOworCWJjbTQzeHhfbG9ja19ub2lycShiY20pOwogCiAJaWYgKGJjbS0+c2hvcnRfcHJlYW1ibGUpCiAJCWNvdW50ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIxIChTaG9ydCBQcmVhbWJsZSBlbmFibGVkKVxuIik7CkBAIC0yNzAsNyArMjY1LDcgQEAKIAkJY291bnQgPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIjAgKFNob3J0IFByZWFtYmxlIGRpc2FibGVkKVxuIik7CiAKIAllcnIgPSAwOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX25vaXJxKGJjbSk7CiAKIAlyZXR1cm4gZXJyID8gZXJyIDogY291bnQ7CiB9CkBAIC0yOTAsMTMgKzI4NSwxMiBAQAogCXZhbHVlID0gZ2V0X2Jvb2xlYW4oYnVmLCBjb3VudCk7CiAJaWYgKHZhbHVlIDwgMCkKIAkJcmV0dXJuIHZhbHVlOwotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKLQlhc3NlcnQoYmNtLT5pbml0aWFsaXplZCk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAliY20tPnNob3J0X3ByZWFtYmxlID0gISF2YWx1ZTsKIAogCWVyciA9IDA7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKIH0KQEAgLTMxMCw3ICszMDQsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZiY20tPnBjaV9kZXYtPmRldjsKIAlpbnQgZXJyOwogCi0JYXNzZXJ0KGJjbS0+aW5pdGlhbGl6ZWQpOworCWFzc2VydChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCk7CiAKIAllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc3Byb20pOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iY200M3h4L2JjbTQzeHhfd3guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCmluZGV4IGI0NTA2MzkuLmMzNWNiM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JjbTQzeHgvYmNtNDN4eF93eC5jCkBAIC01NSwxMyArNTUsMTMgQEAKIAkJCSAgICAgICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBiY200M3h4X3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBiY200M3h4X3BoeWluZm8gKnBoeTsKIAljaGFyIHN1ZmZpeFs3XSA9IHsgMCB9OwogCWludCBoYXZlX2EgPSAwLCBoYXZlX2IgPSAwLCBoYXZlX2cgPSAwOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCWZvciAoaSA9IDA7IGkgPCBiY20tPm5yXzgwMjExX2F2YWlsYWJsZTsgaSsrKSB7CiAJCXBoeSA9ICYoYmNtLT5jb3JlXzgwMjExX2V4dFtpXS5waHkpOwogCQlzd2l0Y2ggKHBoeS0+dHlwZSkgewpAQCAtNzcsNyArNzcsNyBAQAogCQkJYXNzZXJ0KDApOwogCQl9CiAJfQotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlpID0gMDsKIAlpZiAoaGF2ZV9hKSB7CkBAIC0xMTEsNyArMTExLDcgQEAKIAlpbnQgZnJlcTsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAotCWJjbTQzeHhfbG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCWlmICgoZGF0YS0+ZnJlcS5tID49IDApICYmIChkYXRhLT5mcmVxLm0gPD0gMTAwMCkpIHsKIAkJY2hhbm5lbCA9IGRhdGEtPmZyZXEubTsKIAkJZnJlcSA9IGJjbTQzeHhfY2hhbm5lbF90b19mcmVxKGJjbSwgY2hhbm5lbCk7CkBAIC0xMjEsNyArMTIxLDcgQEAKIAl9CiAJaWYgKCFiY200M3h4X2lzX3ZhbGlkX2NoYW5uZWwoYmNtLCBjaGFubmVsKSkKIAkJZ290byBvdXRfdW5sb2NrOwotCWlmIChiY20tPmluaXRpYWxpemVkKSB7CisJaWYgKGJjbTQzeHhfc3RhdHVzKGJjbSkgPT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKSB7CiAJCS8vaWVlZTgwMjExc29mdG1hY19kaXNhc3NvYyhzb2Z0bWFjLCAkUkVBU09OKTsKIAkJYmNtNDN4eF9tYWNfc3VzcGVuZChiY20pOwogCQllcnIgPSBiY200M3h4X3JhZGlvX3NlbGVjdGNoYW5uZWwoYmNtLCBjaGFubmVsLCAwKTsKQEAgLTEzMSw3ICsxMzEsNyBAQAogCQllcnIgPSAwOwogCX0KIG91dF91bmxvY2s6Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE0NywxMSArMTQ3LDEwIEBACiAJaW50IGVyciA9IC1FTk9ERVY7CiAJdTE2IGNoYW5uZWw7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJcmFkaW8gPSBiY200M3h4X2N1cnJlbnRfcmFkaW8oYmNtKTsKIAljaGFubmVsID0gcmFkaW8tPmNoYW5uZWw7CiAJaWYgKGNoYW5uZWwgPT0gMHhGRikgewotCQlhc3NlcnQoIWJjbS0+aW5pdGlhbGl6ZWQpOwogCQljaGFubmVsID0gcmFkaW8tPmluaXRpYWxfY2hhbm5lbDsKIAkJaWYgKGNoYW5uZWwgPT0gMHhGRikKIAkJCWdvdG8gb3V0X3VubG9jazsKQEAgLTE2Myw3ICsxNjIsNyBAQAogCiAJZXJyID0gMDsKIG91dF91bmxvY2s6Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xODEsMTMgKzE4MCwxMyBAQAogCWlmIChtb2RlID09IElXX01PREVfQVVUTykKIAkJbW9kZSA9IEJDTTQzeHhfSU5JVElBTF9JV01PREU7CiAKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKLQlpZiAoYmNtLT5pbml0aWFsaXplZCkgeworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOworCWlmIChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCkgewogCQlpZiAoYmNtLT5pZWVlLT5pd19tb2RlICE9IG1vZGUpCiAJCQliY200M3h4X3NldF9pd21vZGUoYmNtLCBtb2RlKTsKIAl9IGVsc2UKIAkJYmNtLT5pZWVlLT5pd19tb2RlID0gbW9kZTsKLQliY200M3h4X3VubG9ja19tbWlvKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMCw5ICsxOTksOSBAQAogCXN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSA9IGJjbTQzeHhfcHJpdihuZXRfZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCWRhdGEtPm1vZGUgPSBiY20tPmllZWUtPml3X21vZGU7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjU1LDcgKzI1NCw3IEBACiAJCQkgIElXX0VOQ19DQVBBX0NJUEhFUl9US0lQIHwKIAkJCSAgSVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJcGh5ID0gYmNtNDN4eF9jdXJyZW50X3BoeShiY20pOwogCiAJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IDA7CkBAIC0zMDIsNyArMzAxLDcgQEAKIAl9CiAJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSBqOwogCi0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzEzLDE0ICszMTIsMTMgQEAKIAkJCSAgICAgICBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBiY200M3h4X3ByaXYobmV0X2Rldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzaXplX3QgbGVuOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19ub2lycShiY20pOwogCWxlbiA9ICBtaW4oKHNpemVfdClkYXRhLT5kYXRhLmxlbmd0aCwgKHNpemVfdClJV19FU1NJRF9NQVhfU0laRSk7CiAJbWVtY3B5KGJjbS0+bmljaywgZXh0cmEsIGxlbik7CiAJYmNtLT5uaWNrW2xlbl0gPSAnXDAnOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX25vaXJxKGJjbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMzMSwxNSArMzI5LDE0IEBACiAJCQkgICAgICAgY2hhciAqZXh0cmEpCiB7CiAJc3RydWN0IGJjbTQzeHhfcHJpdmF0ZSAqYmNtID0gYmNtNDN4eF9wcml2KG5ldF9kZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2l6ZV90IGxlbjsKIAotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKKwliY200M3h4X2xvY2tfbm9pcnEoYmNtKTsKIAlsZW4gPSBzdHJsZW4oYmNtLT5uaWNrKSArIDE7CiAJbWVtY3B5KGV4dHJhLCBiY20tPm5pY2ssIGxlbik7CiAJZGF0YS0+ZGF0YS5sZW5ndGggPSAoX191MTYpbGVuOwogCWRhdGEtPmRhdGEuZmxhZ3MgPSAxOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX25vaXJxKGJjbSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM1Myw3ICszNTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJaWYgKGRhdGEtPnJ0cy5kaXNhYmxlZCkgewogCQliY20tPnJ0c190aHJlc2hvbGQgPSBCQ000M3h4X01BWF9SVFNfVEhSRVNIT0xEOwogCQllcnIgPSAwOwpAQCAtMzY0LDcgKzM2MSw3IEBACiAJCQllcnIgPSAwOwogCQl9CiAJfQotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzc3LDExICszNzQsMTEgQEAKIAlzdHJ1Y3QgYmNtNDN4eF9wcml2YXRlICpiY20gPSBiY200M3h4X3ByaXYobmV0X2Rldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWJjbTQzeHhfbG9jayhiY20sIGZsYWdzKTsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlkYXRhLT5ydHMudmFsdWUgPSBiY20tPnJ0c190aHJlc2hvbGQ7CiAJZGF0YS0+cnRzLmZpeGVkID0gMDsKIAlkYXRhLT5ydHMuZGlzYWJsZWQgPSAoYmNtLT5ydHNfdGhyZXNob2xkID09IEJDTTQzeHhfTUFYX1JUU19USFJFU0hPTEQpOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM5NSw3ICszOTIsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJaWYgKGRhdGEtPmZyYWcuZGlzYWJsZWQpIHsKIAkJYmNtLT5pZWVlLT5mdHMgPSBNQVhfRlJBR19USFJFU0hPTEQ7CiAJCWVyciA9IDA7CkBAIC00MDYsNyArNDAzLDcgQEAKIAkJCWVyciA9IDA7CiAJCX0KIAl9Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00MTksMTEgKzQxNiwxMSBAQAogCXN0cnVjdCBiY200M3h4X3ByaXZhdGUgKmJjbSA9IGJjbTQzeHhfcHJpdihuZXRfZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCWRhdGEtPmZyYWcudmFsdWUgPSBiY20tPmllZWUtPmZ0czsKIAlkYXRhLT5mcmFnLmZpeGVkID0gMDsKIAlkYXRhLT5mcmFnLmRpc2FibGVkID0gKGJjbS0+aWVlZS0+ZnRzID09IE1BWF9GUkFHX1RIUkVTSE9MRCk7Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQ1LDggKzQ0Miw4IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKLQlpZiAoIWJjbS0+aW5pdGlhbGl6ZWQpCisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CisJaWYgKGJjbTQzeHhfc3RhdHVzKGJjbSkgIT0gQkNNNDN4eF9TVEFUX0lOSVRJQUxJWkVEKQogCQlnb3RvIG91dF91bmxvY2s7CiAJcmFkaW8gPSBiY200M3h4X2N1cnJlbnRfcmFkaW8oYmNtKTsKIAlwaHkgPSBiY200M3h4X2N1cnJlbnRfcGh5KGJjbSk7CkBAIC00NjksNyArNDY2LDcgQEAKIAllcnIgPSAwOwogCiBvdXRfdW5sb2NrOgotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00ODQsOCArNDgxLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAtRU5PREVWOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOwotCWlmICghYmNtLT5pbml0aWFsaXplZCkKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKKwlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSAhPSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpCiAJCWdvdG8gb3V0X3VubG9jazsKIAlyYWRpbyA9IGJjbTQzeHhfY3VycmVudF9yYWRpbyhiY20pOwogCS8qIGRlc2lyZWQgZEJtIHZhbHVlIGlzIGluIFE1LjIgKi8KQEAgLTQ5Niw3ICs0OTMsNyBAQAogCiAJZXJyID0gMDsKIG91dF91bmxvY2s6Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC01ODMsOCArNTgwLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7Ci0JaWYgKGJjbS0+aW5pdGlhbGl6ZWQpIHsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKKwlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSA9PSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpIHsKIAkJZXJyID0gYmNtNDN4eF9yYWRpb19zZXRfaW50ZXJmZXJlbmNlX21pdGlnYXRpb24oYmNtLCBtb2RlKTsKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW50ZXJmZXJlbmNlIE1pdGlnYXRpb24gbm90ICIKQEAgLTU5OCw3ICs1OTUsNyBAQAogCQl9IGVsc2UKIAkJCWJjbTQzeHhfY3VycmVudF9yYWRpbyhiY20pLT5pbnRlcmZtb2RlID0gbW9kZTsKIAl9Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTYxMiw5ICs2MDksOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG1vZGU7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJbW9kZSA9IGJjbTQzeHhfY3VycmVudF9yYWRpbyhiY20pLT5pbnRlcmZtb2RlOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEJDTTQzeHhfUkFESU9fSU5URVJGTU9ERV9OT05FOgpAQCAtNjQ0LDkgKzY0MSw5IEBACiAJaW50IG9uOwogCiAJb24gPSAqKChpbnQgKilleHRyYSk7Ci0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCWJjbS0+c2hvcnRfcHJlYW1ibGUgPSAhIW9uOwotCWJjbTQzeHhfdW5sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfdW5sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2MCw5ICs2NTcsOSBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG9uOwogCi0JYmNtNDN4eF9sb2NrKGJjbSwgZmxhZ3MpOworCWJjbTQzeHhfbG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCW9uID0gYmNtLT5zaG9ydF9wcmVhbWJsZTsKLQliY200M3h4X3VubG9jayhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJaWYgKG9uKQogCQlzdHJuY3B5KGV4dHJhLCAiMSAoU2hvcnQgUHJlYW1ibGUgZW5hYmxlZCkiLCBNQVhfV1hfU1RSSU5HKTsKQEAgLTY4NCwxMSArNjgxLDExIEBACiAJCiAJb24gPSAqKChpbnQgKilleHRyYSk7CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJYmNtLT5pZWVlLT5ob3N0X2VuY3J5cHQgPSAhIW9uOwogCWJjbS0+aWVlZS0+aG9zdF9kZWNyeXB0ID0gISFvbjsKIAliY20tPmllZWUtPmhvc3RfYnVpbGRfaXYgPSAhb247Ci0JYmNtNDN4eF91bmxvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzAyLDkgKzY5OSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgb247CiAKLQliY200M3h4X2xvY2soYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJb24gPSBiY20tPmllZWUtPmhvc3RfZW5jcnlwdDsKLQliY200M3h4X3VubG9jayhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogCiAJaWYgKG9uKQogCQlzdHJuY3B5KGV4dHJhLCAiMSAoU1cgZW5jcnlwdGlvbiBlbmFibGVkKSAiLCBNQVhfV1hfU1RSSU5HKTsKQEAgLTc2NywxMSArNzY0LDExIEBACiAJaWYgKCFzcHJvbSkKIAkJZ290byBvdXQ7CiAKLQliY200M3h4X2xvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X2xvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAllcnIgPSAtRU5PREVWOwotCWlmIChiY20tPmluaXRpYWxpemVkKQorCWlmIChiY200M3h4X3N0YXR1cyhiY20pID09IEJDTTQzeHhfU1RBVF9JTklUSUFMSVpFRCkKIAkJZXJyID0gYmNtNDN4eF9zcHJvbV9yZWFkKGJjbSwgc3Byb20pOwotCWJjbTQzeHhfdW5sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF91bmxvY2tfaXJxc2FmZShiY20sIGZsYWdzKTsKIAlpZiAoIWVycikKIAkJZGF0YS0+ZGF0YS5sZW5ndGggPSBzcHJvbTJoZXgoc3Byb20sIGV4dHJhKTsKIAlrZnJlZShzcHJvbSk7CkBAIC04MTIsMTEgKzgwOSwxMSBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2tmcmVlOwogCi0JYmNtNDN4eF9sb2NrX21taW8oYmNtLCBmbGFncyk7CisJYmNtNDN4eF9sb2NrX2lycXNhZmUoYmNtLCBmbGFncyk7CiAJZXJyID0gLUVOT0RFVjsKLQlpZiAoYmNtLT5pbml0aWFsaXplZCkKKwlpZiAoYmNtNDN4eF9zdGF0dXMoYmNtKSA9PSBCQ000M3h4X1NUQVRfSU5JVElBTElaRUQpCiAJCWVyciA9IGJjbTQzeHhfc3Byb21fd3JpdGUoYmNtLCBzcHJvbSk7Ci0JYmNtNDN4eF91bmxvY2tfbW1pbyhiY20sIGZsYWdzKTsKKwliY200M3h4X3VubG9ja19pcnFzYWZlKGJjbSwgZmxhZ3MpOwogb3V0X2tmcmVlOgogCWtmcmVlKHNwcm9tKTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuYwppbmRleCAzOWY4MmYyLi4wODFhODk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5jCkBAIC01MzMsNyArNTMzLDcgQEAKIAlpcHdfd3JpdGUzMihwcml2LCByZWcsIGlwd19yZWFkMzIocHJpdiwgcmVnKSAmIH5tYXNrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGlwd19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pcHdfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGlwd19wcml2ICpwcml2KQogewogCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5UX0VOQUJMRUQpCiAJCXJldHVybjsKQEAgLTU0MSw3ICs1NDEsNyBAQAogCWlwd193cml0ZTMyKHByaXYsIElQV19JTlRBX01BU0tfUiwgSVBXX0lOVEFfTUFTS19BTEwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXB3X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaXB3X3ByaXYgKnByaXYpCitzdGF0aWMgaW5saW5lIHZvaWQgX19pcHdfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKIHsKIAlpZiAoIShwcml2LT5zdGF0dXMgJiBTVEFUVVNfSU5UX0VOQUJMRUQpKQogCQlyZXR1cm47CkBAIC01NDksNiArNTQ5LDI0IEBACiAJaXB3X3dyaXRlMzIocHJpdiwgSVBXX0lOVEFfTUFTS19SLCB+SVBXX0lOVEFfTUFTS19BTEwpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaXB3X2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpcHdfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV9sb2NrLCBmbGFncyk7CisJX19pcHdfZW5hYmxlX2ludGVycnVwdHMocHJpdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwd19kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGlwd19wcml2ICpwcml2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKKwlfX2lwd19kaXNhYmxlX2ludGVycnVwdHMocHJpdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKwogI2lmZGVmIENPTkZJR19JUFcyMjAwX0RFQlVHCiBzdGF0aWMgY2hhciAqaXB3X2Vycm9yX2Rlc2ModTMyIHZhbCkKIHsKQEAgLTE4NTYsNyArMTg3NCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMgPSAwOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX2xvY2ssIGZsYWdzKTsKIAogCWludGEgPSBpcHdfcmVhZDMyKHByaXYsIElQV19JTlRBX1JXKTsKIAlpbnRhX21hc2sgPSBpcHdfcmVhZDMyKHByaXYsIElQV19JTlRBX01BU0tfUik7CkBAIC0xODY1LDYgKzE4ODMsMTAgQEAKIAkvKiBBZGQgYW55IGNhY2hlZCBJTlRBIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgaGFuZGxlZCAqLwogCWludGEgfD0gcHJpdi0+aXNyX2ludGE7CiAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCS8qIGhhbmRsZSBhbGwgdGhlIGp1c3RpZmljYXRpb25zIGZvciB0aGUgaW50ZXJydXB0ICovCiAJaWYgKGludGEgJiBJUFdfSU5UQV9CSVRfUlhfVFJBTlNGRVIpIHsKIAkJaXB3X3J4KHByaXYpOwpAQCAtMTk5MywxMCArMjAxNSwxMCBAQAogCQlJUFdfRVJST1IoIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKKwogCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLwogCWlwd19lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKIH0KIAogI2RlZmluZSBJUFdfQ01EKHgpIGNhc2UgSVBXX0NNRF8gIyMgeCA6IHJldHVybiAjeApAQCAtMTA0NjAsNyArMTA0ODIsNyBAQAogCWlmICghcHJpdikKIAkJcmV0dXJuIElSUV9OT05FOwogCi0Jc3Bpbl9sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX2xvY2soJnByaXYtPmlycV9sb2NrKTsKIAogCWlmICghKHByaXYtPnN0YXR1cyAmIFNUQVRVU19JTlRfRU5BQkxFRCkpIHsKIAkJLyogU2hhcmVkIElSUSAqLwpAQCAtMTA0ODIsNyArMTA1MDQsNyBAQAogCX0KIAogCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCWlwd19kaXNhYmxlX2ludGVycnVwdHMocHJpdik7CisJX19pcHdfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwogCiAJLyogYWNrIGN1cnJlbnQgaW50ZXJydXB0cyAqLwogCWludGEgJj0gKElQV19JTlRBX01BU0tfQUxMICYgaW50YV9tYXNrKTsKQEAgLTEwNDkzLDExICsxMDUxNSwxMSBAQAogCiAJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3Rhc2tsZXQpOwogCi0Jc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOworCXNwaW5fdW5sb2NrKCZwcml2LT5pcnFfbG9jayk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAgICAgICBub25lOgotCXNwaW5fdW5sb2NrKCZwcml2LT5sb2NrKTsKKwlzcGluX3VubG9jaygmcHJpdi0+aXJxX2xvY2spOwogCXJldHVybiBJUlFfTk9ORTsKIH0KIApAQCAtMTE0NzcsNiArMTE0OTksNyBAQAogI2lmZGVmIENPTkZJR19JUFcyMjAwX0RFQlVHCiAJaXB3X2RlYnVnX2xldmVsID0gZGVidWc7CiAjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgSVBXX0lCU1NfTUFDX0hBU0hfU0laRTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+aWJzc19tYWNfaGFzaFtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyMjAwLmgKaW5kZXggNjA0NGMwYi4uZWExMmFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MjIwMC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzIyMDAuaApAQCAtMTE3Myw2ICsxMTczLDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTsKIAogCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGlycV9sb2NrOwogCXN0cnVjdCBtdXRleCBtdXRleDsKIAogCS8qIGJhc2ljIHBjaS1uZXR3b3JrIGRyaXZlciBzdHVmZiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCA4NzllYjQyLi5hOTE1ZmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtOTI0LDggKzkyNCw3IEBACiAKICAgICBpZiAobGVuZ3RoIDwgRVRIX1pMRU4pCiAgICAgewotICAgIAlza2IgPSBza2JfcGFkdG8oc2tiLCBFVEhfWkxFTik7Ci0gICAgCWlmIChza2IgPT0gTlVMTCkKKyAgICAJaWYgKHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKSkKICAgICAJCXJldHVybiAwOwogICAgIAlsZW5ndGggPSBFVEhfWkxFTjsKICAgICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKaW5kZXggZGFkZTRiOS4uNWI2OWJlZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuLmMKQEAgLTE2OTUsOCArMTY5NSw4IEBACiAJCS8qIExvb2sgaW4gdGhlIHRhYmxlIGlmIHRoZSBmcmVxdWVuY3kgaXMgYWxsb3dlZCAqLwogCQlpZiAodGFibGVbOSAtIChmcmVxIC8gMTYpXSAmICgxIDw8IChmcmVxICUgMTYpKSkgewogCQkJLyogQ29tcHV0ZSBhcHByb3hpbWF0ZSBjaGFubmVsIG51bWJlciAqLwotCQkJd2hpbGUgKCgoKGNoYW5uZWxfYmFuZHNbY10gPj4gMSkgLSAyNCkgPCBmcmVxKSAmJgotCQkJICAgICAgIChjIDwgTkVMUyhjaGFubmVsX2JhbmRzKSkpCisJCQl3aGlsZSAoKGMgPCBORUxTKGNoYW5uZWxfYmFuZHMpKSAmJgorCQkJCSgoKGNoYW5uZWxfYmFuZHNbY10gPj4gMSkgLSAyNCkgPCBmcmVxKSkgCiAJCQkJYysrOwogCQkJbGlzdFtpXS5pID0gYzsJLyogU2V0IHRoZSBsaXN0IGluZGV4ICovCiAKQEAgLTI5MDMsNiArMjkwMyw3IEBACiB7CiAJbmV0X2xvY2FsICpscCA9IChuZXRfbG9jYWwgKikgZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBkYXRhW0VUSF9aTEVOXTsKIAogI2lmZGVmIERFQlVHX1RYX1RSQUNFCiAJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAtPndhdmVsYW5fcGFja2V0X3htaXQoMHglWClcbiIsIGRldi0+bmFtZSwKQEAgLTI5MzcsMTUgKzI5MzgsMTYgQEAKIAkgKiBhYmxlIHRvIGRldGVjdCBjb2xsaXNpb25zLCB0aGVyZWZvcmUgaW4gdGhlb3J5IHdlIGRvbid0IHJlYWxseQogCSAqIG5lZWQgdG8gcGFkLiBKZWFuIElJICovCiAJaWYgKHNrYi0+bGVuIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCi0JCQlyZXR1cm4gMDsKKwkJbWVtc2V0KGRhdGEsIDAsIEVUSF9aTEVOKTsKKwkJbWVtY3B5KGRhdGEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQkvKiBXcml0ZSBwYWNrZXQgb24gdGhlIGNhcmQgKi8KKwkJaWYod3ZfcGFja2V0X3dyaXRlKGRldiwgZGF0YSwgRVRIX1pMRU4pKQorCQkJcmV0dXJuIDE7CS8qIFdlIGZhaWxlZCAqLwogCX0KLQotCS8qIFdyaXRlIHBhY2tldCBvbiB0aGUgY2FyZCAqLwotCWlmKHd2X3BhY2tldF93cml0ZShkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pKQorCWVsc2UgaWYod3ZfcGFja2V0X3dyaXRlKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbikpCiAJCXJldHVybiAxOwkvKiBXZSBmYWlsZWQgKi8KIAorCiAJZGV2X2tmcmVlX3NrYihza2IpOwogCiAjaWZkZWYgREVCVUdfVFhfVFJBQ0UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dhdmVsYW5fY3MuYwppbmRleCBmNzcyNGViLi41NjEyNTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93YXZlbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2F2ZWxhbl9jcy5jCkBAIC0zMTk0LDExICszMTk0LDggQEAKIAkgKiBhbmQgd2UgZG9uJ3QgaGF2ZSB0aGUgRXRoZXJuZXQgc3BlY2lmaWMgcmVxdWlyZW1lbnQgb2YgYmVlaW5nCiAJICogYWJsZSB0byBkZXRlY3QgY29sbGlzaW9ucywgdGhlcmVmb3JlIGluIHRoZW9yeSB3ZSBkb24ndCByZWFsbHkKIAkgKiBuZWVkIHRvIHBhZC4gSmVhbiBJSSAqLwotCWlmIChza2ItPmxlbiA8IEVUSF9aTEVOKSB7Ci0JCXNrYiA9IHNrYl9wYWR0byhza2IsIEVUSF9aTEVOKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQotCQkJcmV0dXJuIDA7Ci0JfQorCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCisJCXJldHVybiAwOwogCiAgIHd2X3BhY2tldF93cml0ZShkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC95ZWxsb3dmaW4uYyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCmluZGV4IGZkMGY0M2IuLmVjZWM4ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3llbGxvd2Zpbi5jCkBAIC04NjIsMTMgKzg2MiwxMSBAQAogCQkvKiBGaXggR1ggY2hpcHNldCBlcnJhdGEuICovCiAJCWlmIChjYWNoZWxpbmVfZW5kID4gMjQgIHx8IGNhY2hlbGluZV9lbmQgPT0gMCkgewogCQkJbGVuID0gc2tiLT5sZW4gKyAzMiAtIGNhY2hlbGluZV9lbmQgKyAxOwotCQkJaWYgKGxlbiAhPSBza2ItPmxlbikKLQkJCQlza2IgPSBza2JfcGFkdG8oc2tiLCBsZW4pOwotCQl9Ci0JCWlmIChza2IgPT0gTlVMTCkgewotCQkJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOwotCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCQkJcmV0dXJuIDA7CisJCQlpZiAoc2tiX3BhZHRvKHNrYiwgbGVuKSkgeworCQkJCXlwLT50eF9za2J1ZmZbZW50cnldID0gTlVMTDsKKwkJCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAl9CiAJeXAtPnR4X3NrYnVmZltlbnRyeV0gPSBza2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC96bmV0LmMgYi9kcml2ZXJzL25ldC96bmV0LmMKaW5kZXggM2FjMDQ3Yi4uYTdjMDg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvem5ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3puZXQuYwpAQCAtNTQ0LDggKzU0NCw3IEBACiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogWk5ldF9zZW5kX3BhY2tldC5cbiIsIGRldi0+bmFtZSk7CiAKIAlpZiAobGVuZ3RoIDwgRVRIX1pMRU4pIHsKLQkJc2tiID0gc2tiX3BhZHRvKHNrYiwgRVRIX1pMRU4pOwotCQlpZiAoc2tiID09IE5VTEwpCisJCWlmIChza2JfcGFkdG8oc2tiLCBFVEhfWkxFTikpCiAJCQlyZXR1cm4gMDsKIAkJbGVuZ3RoID0gRVRIX1pMRU47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jIGIvZHJpdmVycy9vcHJvZmlsZS9idWZmZXJfc3luYy5jCmluZGV4IGIyZThlNDkuLjQzZTUyMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvYnVmZmVyX3N5bmMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL2J1ZmZlcl9zeW5jLmMKQEAgLTEwOCwxMCArMTA4LDEwIEBACiAJCXJldHVybiAwOwogCiAJLyogRklYTUU6IHNob3VsZCB3ZSBwcm9jZXNzIGFsbCBDUFUgYnVmZmVycyA/ICovCi0JZG93bigmYnVmZmVyX3NlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKIAlhZGRfZXZlbnRfZW50cnkoRVNDQVBFX0NPREUpOwogCWFkZF9ldmVudF9lbnRyeShNT0RVTEVfTE9BREVEX0NPREUpOwotCXVwKCZidWZmZXJfc2VtKTsKKwltdXRleF91bmxvY2soJmJ1ZmZlcl9tdXRleCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KQEAgLTUwMSw3ICs1MDEsNyBAQAogCXN5bmNfYnVmZmVyX3N0YXRlIHN0YXRlID0gc2JfYnVmZmVyX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgYXZhaWxhYmxlOwogCi0JZG93bigmYnVmZmVyX3NlbSk7CisJbXV0ZXhfbG9jaygmYnVmZmVyX211dGV4KTsKICAKIAlhZGRfY3B1X3N3aXRjaChjcHUpOwogCkBAIC01NTAsNSArNTUwLDUgQEAKIAogCW1hcmtfZG9uZShjcHUpOwogCi0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5jCmluZGV4IGI4MDMxOGYuLjA0ZDY0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuYwpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgImV2ZW50X2J1ZmZlci5oIgogI2luY2x1ZGUgIm9wcm9maWxlX3N0YXRzLmgiCiAKLURFQ0xBUkVfTVVURVgoYnVmZmVyX3NlbSk7CitERUZJTkVfTVVURVgoYnVmZmVyX211dGV4KTsKICAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9vcGVuZWQ7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYnVmZmVyX3dhaXQpOwpAQCAtMzIsNyArMzIsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYnVmZmVyX3NpemU7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBidWZmZXJfd2F0ZXJzaGVkOwogc3RhdGljIHNpemVfdCBidWZmZXJfcG9zOwotLyogYXRvbWljX3QgYmVjYXVzZSB3YWl0X2V2ZW50IGNoZWNrcyBpdCBvdXRzaWRlIG9mIGJ1ZmZlcl9zZW0gKi8KKy8qIGF0b21pY190IGJlY2F1c2Ugd2FpdF9ldmVudCBjaGVja3MgaXQgb3V0c2lkZSBvZiBidWZmZXJfbXV0ZXggKi8KIHN0YXRpYyBhdG9taWNfdCBidWZmZXJfcmVhZHkgPSBBVE9NSUNfSU5JVCgwKTsKIAogLyogQWRkIGFuIGVudHJ5IHRvIHRoZSBldmVudCBidWZmZXIuIFdoZW4gd2UKQEAgLTYwLDEwICs2MCwxMCBAQAogICovCiB2b2lkIHdha2VfdXBfYnVmZmVyX3dhaXRlcih2b2lkKQogewotCWRvd24oJmJ1ZmZlcl9zZW0pOworCW11dGV4X2xvY2soJmJ1ZmZlcl9tdXRleCk7CiAJYXRvbWljX3NldCgmYnVmZmVyX3JlYWR5LCAxKTsKIAl3YWtlX3VwKCZidWZmZXJfd2FpdCk7Ci0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIH0KIAogIApAQCAtMTYyLDcgKzE2Miw3IEBACiAJaWYgKCFhdG9taWNfcmVhZCgmYnVmZmVyX3JlYWR5KSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlkb3duKCZidWZmZXJfc2VtKTsKKwltdXRleF9sb2NrKCZidWZmZXJfbXV0ZXgpOwogCiAJYXRvbWljX3NldCgmYnVmZmVyX3JlYWR5LCAwKTsKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiAJYnVmZmVyX3BvcyA9IDA7CiAgCiBvdXQ6Ci0JdXAoJmJ1ZmZlcl9zZW0pOworCW11dGV4X3VubG9jaygmYnVmZmVyX211dGV4KTsKIAlyZXR1cm4gcmV0dmFsOwogfQogIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuaCBiL2RyaXZlcnMvb3Byb2ZpbGUvZXZlbnRfYnVmZmVyLmgKaW5kZXggMDE4MDIzNi4uOTI0MTYyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9ldmVudF9idWZmZXIuaAorKysgYi9kcml2ZXJzL29wcm9maWxlL2V2ZW50X2J1ZmZlci5oCkBAIC0xMSw3ICsxMSw3IEBACiAjZGVmaW5lIEVWRU5UX0JVRkZFUl9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAKLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL211dGV4Lmg+CiAgCiBpbnQgYWxsb2NfZXZlbnRfYnVmZmVyKHZvaWQpOwogCkBAIC00Niw2ICs0Niw2IEBACiAvKiBtdXRleCBiZXR3ZWVuIHN5bmNfY3B1X2J1ZmZlcnMoKSBhbmQgdGhlCiAgKiBmaWxlIHJlYWRpbmcgY29kZS4KICAqLwotZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgYnVmZmVyX3NlbTsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggYnVmZmVyX211dGV4OwogIAogI2VuZGlmIC8qIEVWRU5UX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMKaW5kZXggYjNmMWNkNi4uZTUxNjJhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuYwpAQCAtMTIsNyArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9tdXRleC5oPgogCiAjaW5jbHVkZSAib3Byb2YuaCIKICNpbmNsdWRlICJldmVudF9idWZmZXIuaCIKQEAgLTI1LDcgKzI1LDcgQEAKIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfc3RhcnRlZDsKIHVuc2lnbmVkIGxvbmcgYmFja3RyYWNlX2RlcHRoOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgaXNfc2V0dXA7Ci1zdGF0aWMgREVDTEFSRV9NVVRFWChzdGFydF9zZW0pOworc3RhdGljIERFRklORV9NVVRFWChzdGFydF9tdXRleCk7CiAKIC8qIHRpbWVyCiAgICAwIC0gdXNlIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgaGFyZHdhcmUgaWYgYXZhaWxhYmxlCkBAIC0zNyw3ICszNyw3IEBACiB7CiAJaW50IGVycjsKICAKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAogCWlmICgoZXJyID0gYWxsb2NfY3B1X2J1ZmZlcnMoKSkpCiAJCWdvdG8gb3V0OwpAQCAtNTcsNyArNTcsNyBAQAogCQlnb3RvIG91dDM7CiAKIAlpc19zZXR1cCA9IDE7Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiAJcmV0dXJuIDA7CiAgCiBvdXQzOgpAQCAtNjgsNyArNjgsNyBAQAogb3V0MToKIAlmcmVlX2NwdV9idWZmZXJzKCk7CiBvdXQ6Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzgsNyArNzgsNyBAQAogewogCWludCBlcnIgPSAtRUlOVkFMOwogIAotCWRvd24oJnN0YXJ0X3NlbSk7CisJbXV0ZXhfbG9jaygmc3RhcnRfbXV0ZXgpOwogIAogCWlmICghaXNfc2V0dXApCiAJCWdvdG8gb3V0OwpAQCAtOTUsNyArOTUsNyBAQAogCiAJb3Byb2ZpbGVfc3RhcnRlZCA9IDE7CiBvdXQ6Ci0JdXAoJnN0YXJ0X3NlbSk7IAorCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwMyw3ICsxMDMsNyBAQAogLyogZWNobyAwPi9kZXYvb3Byb2ZpbGUvZW5hYmxlICovCiB2b2lkIG9wcm9maWxlX3N0b3Aodm9pZCkKIHsKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAlpZiAoIW9wcm9maWxlX3N0YXJ0ZWQpCiAJCWdvdG8gb3V0OwogCW9wcm9maWxlX29wcy5zdG9wKCk7CkBAIC0xMTEsMjAgKzExMSwyMCBAQAogCS8qIHdha2UgdXAgdGhlIGRhZW1vbiB0byByZWFkIHdoYXQgcmVtYWlucyAqLwogCXdha2VfdXBfYnVmZmVyX3dhaXRlcigpOwogb3V0OgotCXVwKCZzdGFydF9zZW0pOworCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogfQogCiAKIHZvaWQgb3Byb2ZpbGVfc2h1dGRvd24odm9pZCkKIHsKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAlzeW5jX3N0b3AoKTsKIAlpZiAob3Byb2ZpbGVfb3BzLnNodXRkb3duKQogCQlvcHJvZmlsZV9vcHMuc2h1dGRvd24oKTsKIAlpc19zZXR1cCA9IDA7CiAJZnJlZV9ldmVudF9idWZmZXIoKTsKIAlmcmVlX2NwdV9idWZmZXJzKCk7Ci0JdXAoJnN0YXJ0X3NlbSk7CisJbXV0ZXhfdW5sb2NrKCZzdGFydF9tdXRleCk7CiB9CiAKIApAQCAtMTMyLDcgKzEzMiw3IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlkb3duKCZzdGFydF9zZW0pOworCW11dGV4X2xvY2soJnN0YXJ0X211dGV4KTsKIAogCWlmIChvcHJvZmlsZV9zdGFydGVkKSB7CiAJCWVyciA9IC1FQlVTWTsKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCWJhY2t0cmFjZV9kZXB0aCA9IHZhbDsKIAogb3V0OgotCXVwKCZzdGFydF9zZW0pOworCW11dGV4X3VubG9jaygmc3RhcnRfbXV0ZXgpOwogCXJldHVybiBlcnI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVmcy5jIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKaW5kZXggYjYyZGE5Yi4uNzFjMmRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMKQEAgLTI3MiwxMCArMjcyLDEwIEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqb3Byb2ZpbGVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgb3Byb2ZpbGVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG9wcm9maWxlZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG9wcm9maWxlZnNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvS2NvbmZpZyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCmluZGV4IDZjODQ1MmUuLmM3ZmEyOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGFycG9ydC9LY29uZmlnCkBAIC04NSwxMSArODUsNiBAQAogY29uZmlnIFBBUlBPUlRfTk9UX1BDCiAJYm9vbAogCi1jb25maWcgUEFSUE9SVF9BUkMKLQl0cmlzdGF0ZSAiQXJjaGltZWRlcyBoYXJkd2FyZSIKLQlkZXBlbmRzIG9uIEFSTSAmJiBQQVJQT1JUCi0Jc2VsZWN0IFBBUlBPUlRfTk9UX1BDCi0KIGNvbmZpZyBQQVJQT1JUX0lQMzIKIAl0cmlzdGF0ZSAiU0dJIElQMzIgYnVpbHRpbiBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gU0dJX0lQMzIgJiYgUEFSUE9SVCAmJiBFWFBFUklNRU5UQUwKQEAgLTE0MSw2ICsxMzYsMTggQEAKIAkgIGZvdW5kIG9uIG1hbnkgU3VuIG1hY2hpbmVzLiBOb3RlIHRoYXQgbWFueSBvZiB0aGUgbmV3ZXIgVWx0cmFzCiAJICBhY3R1YWxseSBoYXZlIHBjIHN0eWxlIGhhcmR3YXJlIGluc3RlYWQuCiAKK2NvbmZpZyBQQVJQT1JUX0FYODg3OTYKKwl0cmlzdGF0ZSAiQVg4ODc5NiBQYXJhbGxlbCBQb3J0IgorCWRlcGVuZHMgb24gUEFSUE9SVAorCXNlbGVjdCBQQVJQT1JUX05PVF9QQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgdGhlIHBhcmFsbGVsIHBvcnQgaGFyZHdhcmUgb24KKwkgIHRoZSBBWDg4Nzk2IG5ldHdvcmsgY29udHJvbGxlciBjaGlwLiBUaGlzIGNvZGUgaXMgYWxzbyBhdmFpbGFibGUKKwkgIGFzIGEgbW9kdWxlIChzYXkgTSksIGNhbGxlZCBwYXJwb3J0X2F4ODg3OTYuCisKKwkgIFRoZSBkcml2ZXIgaXMgbm90IGRlcGVuZGFudCBvbiB0aGUgQVg4ODc5NiBuZXR3b3JrIGRyaXZlciwgYW5kCisJICBzaG91bGQgbm90IGludGVyZmVyZSB3aXRoIHRoZSBuZXR3b3JraW5nIGZ1bmN0aW9ucyBvZiB0aGUgY2hpcC4KKwogY29uZmlnIFBBUlBPUlRfMTI4NAogCWJvb2wgIklFRUUgMTI4NCB0cmFuc2ZlciBtb2RlcyIKIAlkZXBlbmRzIG9uIFBBUlBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9NYWtlZmlsZSBiL2RyaXZlcnMvcGFycG9ydC9NYWtlZmlsZQppbmRleCBhMTlkZTM1Li42OTZiOGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wYXJwb3J0L01ha2VmaWxlCkBAIC0xNyw0ICsxNyw1IEBACiBvYmotJChDT05GSUdfUEFSUE9SVF9BVEFSSSkJKz0gcGFycG9ydF9hdGFyaS5vCiBvYmotJChDT05GSUdfUEFSUE9SVF9TVU5CUFApCSs9IHBhcnBvcnRfc3VuYnBwLm8KIG9iai0kKENPTkZJR19QQVJQT1JUX0dTQykJKz0gcGFycG9ydF9nc2Mubwotb2JqLSQoQ09ORklHX1BBUlBPUlRfSVAzMikJKz0gcGFycG9ydF9pcDMyLm8KK29iai0kKENPTkZJR19QQVJQT1JUX0FYODg3OTYpCSs9IHBhcnBvcnRfYXg4ODc5Ni5vCitvYmotJChDT05GSUdfUEFSUE9SVF9JUDMyKQkrPSBwYXJwb3J0X2lwMzIubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFycG9ydC9kYWlzeS5jIGIvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKaW5kZXggOWVlNjczMi4uZmQ0MWUyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKKysrIGIvZHJpdmVycy9wYXJwb3J0L2RhaXN5LmMKQEAgLTI4Myw3ICsyODMsNyBAQAogICoKICAqCVRoaXMgdHJpZXMgdG8gbG9jYXRlIGEgZGV2aWNlIG9uIHRoZSBnaXZlbiBwYXJhbGxlbCBwb3J0LAogICoJbXVsdGlwbGV4b3IgcG9ydCBhbmQgZGFpc3kgY2hhaW4gYWRkcmVzcywgYW5kIHJldHVybnMgaXRzCi0gKglkZXZpY2UgbnVtYmVyIG9yIC1OWElPIGlmIG5vIGRldmljZSB3aXRoIHRob3NlIGNvb3JkaW5hdGVzCisgKglkZXZpY2UgbnVtYmVyIG9yICUtRU5YSU8gaWYgbm8gZGV2aWNlIHdpdGggdGhvc2UgY29vcmRpbmF0ZXMKICAqCWV4aXN0cy4KICAqKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXJjLmMgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9hcmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1YmI0Zi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9hcmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKiBMb3ctbGV2ZWwgcGFyYWxsZWwgcG9ydCByb3V0aW5lcyBmb3IgQXJjaGltZWRlcyBvbmJvYXJkIGhhcmR3YXJlCi0gKgotICogQXV0aG9yOiBQaGlsIEJsdW5kZWxsIDxwaGlsYkBnbnUub3JnPgotICovCi0KLS8qIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgcGFyYWxsZWwgcG9ydCBoYXJkd2FyZSBmb3VuZCBvbiBBY29ybidzIG9sZAotICogcmFuZ2Ugb2YgQXJjaGltZWRlcyBtYWNoaW5lcy4gIFRoZSBBNTAwMCBhbmQgbmV3ZXIgc3lzdGVtcyBoYXZlIFBDLXN0eWxlCi0gKiBJL08gaGFyZHdhcmUgYW5kIHNob3VsZCB1c2UgdGhlIHBhcnBvcnRfcGMgZHJpdmVyIGluc3RlYWQuCi0gKgotICogVGhlIEFjb3JuIHByaW50ZXIgcG9ydCBoYXJkd2FyZSBpcyB2ZXJ5IHNpbXBsZS4gIFRoZXJlIGlzIGEgc2luZ2xlIDgtYml0Ci0gKiB3cml0ZS1vbmx5IGxhdGNoIGZvciB0aGUgZGF0YSBwb3J0IGFuZCBjb250cm9sL3N0YXR1cyBiaXRzIGFyZSBoYW5kbGVkCi0gKiB3aXRoIHZhcmlvdXMgYXV4aWxsaWFyeSBpbnB1dCBhbmQgb3V0cHV0IGxpbmVzLiAgVGhlIHBvcnQgaXMgbm90Ci0gKiBiaWRpcmVjdGlvbmFsLCBkb2VzIG5vdCBzdXBwb3J0IGFueSBtb2RlcyBvdGhlciB0aGFuIFNQUCwgYW5kIGhhcyBvbmx5Ci0gKiBhIHN1YnNldCBvZiB0aGUgc3RhbmRhcmQgcHJpbnRlciBjb250cm9sIGxpbmVzIGNvbm5lY3RlZC4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgotCi0jaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9hcmNoL29sZGxhdGNoZXMuaD4KLSNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+Ci0KLSNkZWZpbmUgREFUQV9BRERSRVNTICAgIDB4MzM1MDAxMAotCi0vKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGFuZCBvbmx5IHVzZWQgZm9yIHJlcXVlc3RfcmVnaW9uLiAqLwotI2RlZmluZSBQT1JUX0JBU0UgICAgICAgMHg4MDAwMDAwMCB8ICgoREFUQV9BRERSRVNTIC0gSU9fQkFTRSkgPj4gMikKLQotLyogVGhlIGhhcmR3YXJlIGNhbid0IHJlYWQgZnJvbSB0aGUgZGF0YSBsYXRjaCwgc28gd2UgbXVzdCB1c2UgYSBzb2Z0Ci0gICBjb3B5LiAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgZGF0YV9jb3B5OwotCi0vKiBUaGVzZSBhcmUgcHJldHR5IHNpbXBsZS4gV2Uga25vdyB0aGUgaXJxIGlzIG5ldmVyIHNoYXJlZCBhbmQgdGhlCi0gICBrZXJuZWwgZG9lcyBhbGwgdGhlIG1hZ2ljIHRoYXQncyByZXF1aXJlZC4gKi8KLXN0YXRpYyB2b2lkIGFyY19lbmFibGVfaXJxKHN0cnVjdCBwYXJwb3J0ICpwKQotewotCWVuYWJsZV9pcnEocC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgYXJjX2Rpc2FibGVfaXJxKHN0cnVjdCBwYXJwb3J0ICpwKQotewotCWRpc2FibGVfaXJxKHAtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlwYXJwb3J0X2dlbmVyaWNfaXJxKGlycSwgKHN0cnVjdCBwYXJwb3J0ICopIGRldl9pZCwgcmVncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFyY193cml0ZV9kYXRhKHN0cnVjdCBwYXJwb3J0ICpwLCB1bnNpZ25lZCBjaGFyIGRhdGEpCi17Ci0JZGF0YV9jb3B5ID0gZGF0YTsKLQlvdXRiX3QoZGF0YSwgREFUQV9MQVRDSCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIGFyY19yZWFkX2RhdGEoc3RydWN0IHBhcnBvcnQgKnApCi17Ci0JcmV0dXJuIGRhdGFfY29weTsKLX0KLQotc3RhdGljIHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMgcGFycG9ydF9hcmNfb3BzID0gCi17Ci0JLndyaXRlX2RhdGEJPSBhcmNfd3JpdGVfZGF0YSwKLQkucmVhZF9kYXRhCT0gYXJjX3JlYWRfZGF0YSwKLQotCS53cml0ZV9jb250cm9sCT0gYXJjX3dyaXRlX2NvbnRyb2wsCi0JLnJlYWRfY29udHJvbAk9IGFyY19yZWFkX2NvbnRyb2wsCi0JLmZyb2JfY29udHJvbAk9IGFyY19mcm9iX2NvbnRyb2wsCi0KLQkucmVhZF9zdGF0dXMJPSBhcmNfcmVhZF9zdGF0dXMsCi0KLQkuZW5hYmxlX2lycQk9IGFyY19lbmFibGVfaXJxLAotCS5kaXNhYmxlX2lycQk9IGFyY19kaXNhYmxlX2lycSwKLQotCS5kYXRhX2ZvcndhcmQJPSBhcmNfZGF0YV9mb3J3YXJkLAotCS5kYXRhX3JldmVyc2UJPSBhcmNfZGF0YV9yZXZlcnNlLAotCi0JLmluaXRfc3RhdGUJPSBhcmNfaW5pdF9zdGF0ZSwKLQkuc2F2ZV9zdGF0ZQk9IGFyY19zYXZlX3N0YXRlLAotCS5yZXN0b3JlX3N0YXRlCT0gYXJjX3Jlc3RvcmVfc3RhdGUsCi0KLQkuZXBwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF93cml0ZV9kYXRhLAotCS5lcHBfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lcHBfcmVhZF9kYXRhLAotCS5lcHBfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZXBwX3dyaXRlX2FkZHIsCi0JLmVwcF9yZWFkX2FkZHIJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF9yZWFkX2FkZHIsCi0KLQkuZWNwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VjcF93cml0ZV9kYXRhLAotCS5lY3BfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lY3BfcmVhZF9kYXRhLAotCS5lY3Bfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZWNwX3dyaXRlX2FkZHIsCi0JCi0JLmNvbXBhdF93cml0ZV9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF93cml0ZV9jb21wYXQsCi0JLm5pYmJsZV9yZWFkX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X3JlYWRfbmliYmxlLAotCS5ieXRlX3JlYWRfZGF0YQkJPSBwYXJwb3J0X2llZWUxMjg0X3JlYWRfYnl0ZSwKLQotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLX07Ci0KLS8qIC0tLSBJbml0aWFsaXNhdGlvbiBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyBpbnQgcGFycG9ydF9hcmNfaW5pdCh2b2lkKQotewotCS8qIEFyY2hpbWVkZXMgaGFyZHdhcmUgcHJvdmlkZXMgb25seSBvbmUgcG9ydCwgYXQgYSBmaXhlZCBhZGRyZXNzICovCi0Jc3RydWN0IHBhcnBvcnQgKnA7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKLQljaGFyICpmYWtlX25hbWUgPSAicGFycG9ydCBwcm9iZSIpOwotCi0JcmVzID0gcmVxdWVzdF9yZWdpb24oUE9SVF9CQVNFLCAxLCBmYWtlX25hbWUpOwotCWlmIChyZXMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlwID0gcGFycG9ydF9yZWdpc3Rlcl9wb3J0IChQT1JUX0JBU0UsIElSUV9QUklOVEVSQUNLLAotCQkJCSAgIFBBUlBPUlRfRE1BX05PTkUsICZwYXJwb3J0X2FyY19vcHMpOwotCi0JaWYgKCFwKSB7Ci0JCXJlbGVhc2VfcmVnaW9uKFBPUlRfQkFTRSwgMSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXAtPm1vZGVzID0gUEFSUE9SVF9NT0RFX0FSQ1NQUDsKLQlwLT5zaXplID0gMTsKLQlyZW5hbWVfcmVnaW9uKHJlcywgcC0+bmFtZSk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICIlczogQXJjaGltZWRlcyBvbi1ib2FyZCBwb3J0LCB1c2luZyBpcnEgJWRcbiIsCi0JICAgICAgIHAtPmlycSk7Ci0KLQkvKiBUZWxsIHRoZSBoaWdoLWxldmVsIGRyaXZlcnMgYWJvdXQgdGhlIHBvcnQuICovCi0JcGFycG9ydF9hbm5vdW5jZV9wb3J0IChwKTsKLQotCXJldHVybiAxOwotfQotCi1tb2R1bGVfaW5pdChwYXJwb3J0X2FyY19pbml0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jIGIvZHJpdmVycy9wYXJwb3J0L3BhcnBvcnRfYXg4ODc5Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9heDg4Nzk2LmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qIGxpbnV4L2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X2F4ODg3OTYuYworICoKKyAqIChjKSAyMDA1LDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzCisgKglCZW4gRG9va3MgPGJlbkBzaW10ZWMuY28udWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGFycG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisKKyNkZWZpbmUgQVhfU1BSX0JVU1kJCSgxPDw3KQorI2RlZmluZSBBWF9TUFJfQUNLCQkoMTw8NikKKyNkZWZpbmUgQVhfU1BSX1BFCQkoMTw8NSkKKyNkZWZpbmUgQVhfU1BSX1NMQ1QJCSgxPDw0KQorI2RlZmluZSBBWF9TUFJfRVJSCQkoMTw8MykKKworI2RlZmluZSBBWF9DUFJfbkRPRQkJKDE8PDUpCisjZGVmaW5lIEFYX0NQUl9TTENUSU4JCSgxPDwzKQorI2RlZmluZSBBWF9DUFJfbklOSVQJCSgxPDwyKQorI2RlZmluZSBBWF9DUFJfQVRGRAkJKDE8PDEpCisjZGVmaW5lIEFYX0NQUl9TVFJCCQkoMTw8MCkKKworc3RydWN0IGF4X2RydmRhdGEgeworCXN0cnVjdCBwYXJwb3J0CQkqcGFycG9ydDsKKwlzdHJ1Y3QgcGFycG9ydF9zdGF0ZQkgc3VzcGVuZDsKKworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IHJlc291cmNlCQkqaW87CisKKwl1bnNpZ25lZCBjaGFyCQkgaXJxX2VuYWJsZWQ7CisKKwl2b2lkIF9faW9tZW0JCSpiYXNlOworCXZvaWQgX19pb21lbQkJKnNwcF9kYXRhOworCXZvaWQgX19pb21lbQkJKnNwcF9zcHI7CisJdm9pZCBfX2lvbWVtCQkqc3BwX2NwcjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGF4X2RydmRhdGEgKnBwX3RvX2RydihzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlyZXR1cm4gcC0+cHJpdmF0ZV9kYXRhOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorcGFycG9ydF9heDg4Nzk2X3JlYWRfZGF0YShzdHJ1Y3QgcGFycG9ydCAqcCkKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisKKwlyZXR1cm4gcmVhZGIoZGQtPnNwcF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl93cml0ZV9kYXRhKHN0cnVjdCBwYXJwb3J0ICpwLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCisJd3JpdGViKGRhdGEsIGRkLT5zcHBfZGF0YSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitwYXJwb3J0X2F4ODg3OTZfcmVhZF9jb250cm9sKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKwl1bnNpZ25lZCBpbnQgY3ByID0gcmVhZGIoZGQtPnNwcF9jcHIpOworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKCEoY3ByICYgQVhfQ1BSX1NUUkIpKQorCQlyZXQgfD0gUEFSUE9SVF9DT05UUk9MX1NUUk9CRTsKKworCWlmICghKGNwciAmIEFYX0NQUl9BVEZEKSkKKwkJcmV0IHw9IFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQ7CisKKwlpZiAoY3ByICYgQVhfQ1BSX25JTklUKQorCQlyZXQgfD0gUEFSUE9SVF9DT05UUk9MX0lOSVQ7CisKKwlpZiAoIShjcHIgJiBBWF9DUFJfU0xDVElOKSkKKwkJcmV0IHw9IFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1Q7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X3dyaXRlX2NvbnRyb2woc3RydWN0IHBhcnBvcnQgKnAsIHVuc2lnbmVkIGNoYXIgY29udHJvbCkKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisJdW5zaWduZWQgaW50IGNwciA9IHJlYWRiKGRkLT5zcHBfY3ByKTsKKworCWNwciAmPSBBWF9DUFJfbkRPRTsKKworCWlmICghKGNvbnRyb2wgJiBQQVJQT1JUX0NPTlRST0xfU1RST0JFKSkKKwkJY3ByIHw9IEFYX0NQUl9TVFJCOworCisJaWYgKCEoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9BVVRPRkQpKQorCQljcHIgfD0gQVhfQ1BSX0FURkQ7CisKKwlpZiAoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9JTklUKQorCQljcHIgfD0gQVhfQ1BSX25JTklUOworCisJaWYgKCEoY29udHJvbCAmIFBBUlBPUlRfQ09OVFJPTF9TRUxFQ1QpKQorCQljcHIgfD0gQVhfQ1BSX1NMQ1RJTjsKKworCWRldl9kYmcoZGQtPmRldiwgIndyaXRlX2NvbnRyb2w6IGN0cmw9JTAyeCwgY3ByPSUwMnhcbiIsIGNvbnRyb2wsIGNwcik7CisJd3JpdGViKGNwciwgZGQtPnNwcF9jcHIpOworCisJaWYgKHBhcnBvcnRfYXg4ODc5Nl9yZWFkX2NvbnRyb2wocCkgIT0gY29udHJvbCkgeworCQlkZXZfZXJyKGRkLT5kZXYsICJ3cml0ZV9jb250cm9sOiByZWFkICE9IHNldCAoJTAyeCwgJTAyeClcbiIsCisJCQlwYXJwb3J0X2F4ODg3OTZfcmVhZF9jb250cm9sKHApLCBjb250cm9sKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitwYXJwb3J0X2F4ODg3OTZfcmVhZF9zdGF0dXMoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGludCBzdGF0dXMgPSByZWFkYihkZC0+c3BwX3Nwcik7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAoc3RhdHVzICYgQVhfU1BSX0JVU1kpCisJCXJldCB8PSBQQVJQT1JUX1NUQVRVU19CVVNZOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9BQ0spCisJCXJldCB8PSBQQVJQT1JUX1NUQVRVU19BQ0s7CisKKwlpZiAoc3RhdHVzICYgQVhfU1BSX0VSUikKKwkJcmV0IHw9IFBBUlBPUlRfU1RBVFVTX0VSUk9SOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9TTENUKQorCQlyZXQgfD0gUEFSUE9SVF9TVEFUVVNfU0VMRUNUOworCisJaWYgKHN0YXR1cyAmIEFYX1NQUl9QRSkKKwkJcmV0IHw9IFBBUlBPUlRfU1RBVFVTX1BBUEVST1VUOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3BhcnBvcnRfYXg4ODc5Nl9mcm9iX2NvbnRyb2woc3RydWN0IHBhcnBvcnQgKnAsIHVuc2lnbmVkIGNoYXIgbWFzaywKKwkJCSAgICAgdW5zaWduZWQgY2hhciB2YWwpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGNoYXIgb2xkID0gcGFycG9ydF9heDg4Nzk2X3JlYWRfY29udHJvbChwKTsKKworCWRldl9kYmcoZGQtPmRldiwgImZyb2I6IG1hc2s9JTAyeCwgdmFsPSUwMngsIG9sZD0lMDJ4XG4iLAorCQltYXNrLCB2YWwsIG9sZCk7CisKKwlwYXJwb3J0X2F4ODg3OTZfd3JpdGVfY29udHJvbChwLCAob2xkICYgfm1hc2spIHwgdmFsKTsKKwlyZXR1cm4gb2xkOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X2VuYWJsZV9pcnEoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKCFkZC0+aXJxX2VuYWJsZWQpIHsKKwkJZW5hYmxlX2lycShwLT5pcnEpOworCQlkZC0+aXJxX2VuYWJsZWQgPSAxOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJwb3J0X2F4ODg3OTZfZGlzYWJsZV9pcnEoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGRkLT5pcnFfZW5hYmxlZCkgeworCQlkaXNhYmxlX2lycShwLT5pcnEpOworCQlkZC0+aXJxX2VuYWJsZWQgPSAwOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwYXJwb3J0X2F4ODg3OTZfZGF0YV9mb3J3YXJkKHN0cnVjdCBwYXJwb3J0ICpwKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKwl2b2lkIF9faW9tZW0gKmNwciA9IGRkLT5zcHBfY3ByOworCisJd3JpdGViKChyZWFkYihjcHIpICYgfkFYX0NQUl9uRE9FKSwgY3ByKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl9kYXRhX3JldmVyc2Uoc3RydWN0IHBhcnBvcnQgKnApCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCXZvaWQgX19pb21lbSAqY3ByID0gZGQtPnNwcF9jcHI7CisKKwl3cml0ZWIocmVhZGIoY3ByKSB8IEFYX0NQUl9uRE9FLCBjcHIpOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X2luaXRfc3RhdGUoc3RydWN0IHBhcmRldmljZSAqZCwgc3RydWN0IHBhcnBvcnRfc3RhdGUgKnMpCit7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KGQtPnBvcnQpOworCisJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgcGFycG9ydF9zdGF0ZSkpOworCisJZGV2X2RiZyhkZC0+ZGV2LCAiaW5pdF9zdGF0ZTogJXA6IHN0YXRlPSVwXG4iLCBkLCBzKTsKKwlzLT51LmF4ODg3OTYuY3ByID0gcmVhZGIoZGQtPnNwcF9jcHIpOworfQorCitzdGF0aWMgdm9pZAorcGFycG9ydF9heDg4Nzk2X3NhdmVfc3RhdGUoc3RydWN0IHBhcnBvcnQgKnAsIHN0cnVjdCBwYXJwb3J0X3N0YXRlICpzKQoreworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCWRldl9kYmcoZGQtPmRldiwgInNhdmVfc3RhdGU6ICVwOiBzdGF0ZT0lcFxuIiwgcCwgcyk7CisJcy0+dS5heDg4Nzk2LmNwciA9IHJlYWRiKGRkLT5zcHBfY3ByKTsKK30KKworc3RhdGljIHZvaWQKK3BhcnBvcnRfYXg4ODc5Nl9yZXN0b3JlX3N0YXRlKHN0cnVjdCBwYXJwb3J0ICpwLCBzdHJ1Y3QgcGFycG9ydF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQgPSBwcF90b19kcnYocCk7CisKKwlkZXZfZGJnKGRkLT5kZXYsICJyZXN0b3JlX3N0YXRlOiAlcDogc3RhdGU9JXBcbiIsIHAsIHMpOworCXdyaXRlYihzLT51LmF4ODg3OTYuY3ByLCBkZC0+c3BwX2Nwcik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcGFycG9ydF9heDg4Nzk2X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBwYXJwb3J0X2dlbmVyaWNfaXJxKGlycSwgZGV2X2lkLCByZWdzKTsKKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGFycG9ydF9vcGVyYXRpb25zIHBhcnBvcnRfYXg4ODc5Nl9vcHMgPSB7CisJLndyaXRlX2RhdGEJPSBwYXJwb3J0X2F4ODg3OTZfd3JpdGVfZGF0YSwKKwkucmVhZF9kYXRhCT0gcGFycG9ydF9heDg4Nzk2X3JlYWRfZGF0YSwKKworCS53cml0ZV9jb250cm9sCT0gcGFycG9ydF9heDg4Nzk2X3dyaXRlX2NvbnRyb2wsCisJLnJlYWRfY29udHJvbAk9IHBhcnBvcnRfYXg4ODc5Nl9yZWFkX2NvbnRyb2wsCisJLmZyb2JfY29udHJvbAk9IHBhcnBvcnRfYXg4ODc5Nl9mcm9iX2NvbnRyb2wsCisKKwkucmVhZF9zdGF0dXMJPSBwYXJwb3J0X2F4ODg3OTZfcmVhZF9zdGF0dXMsCisKKwkuZW5hYmxlX2lycQk9IHBhcnBvcnRfYXg4ODc5Nl9lbmFibGVfaXJxLAorCS5kaXNhYmxlX2lycQk9IHBhcnBvcnRfYXg4ODc5Nl9kaXNhYmxlX2lycSwKKworCS5kYXRhX2ZvcndhcmQJPSBwYXJwb3J0X2F4ODg3OTZfZGF0YV9mb3J3YXJkLAorCS5kYXRhX3JldmVyc2UJPSBwYXJwb3J0X2F4ODg3OTZfZGF0YV9yZXZlcnNlLAorCisJLmluaXRfc3RhdGUJPSBwYXJwb3J0X2F4ODg3OTZfaW5pdF9zdGF0ZSwKKwkuc2F2ZV9zdGF0ZQk9IHBhcnBvcnRfYXg4ODc5Nl9zYXZlX3N0YXRlLAorCS5yZXN0b3JlX3N0YXRlCT0gcGFycG9ydF9heDg4Nzk2X3Jlc3RvcmVfc3RhdGUsCisKKwkuZXBwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF93cml0ZV9kYXRhLAorCS5lcHBfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lcHBfcmVhZF9kYXRhLAorCS5lcHBfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZXBwX3dyaXRlX2FkZHIsCisJLmVwcF9yZWFkX2FkZHIJPSBwYXJwb3J0X2llZWUxMjg0X2VwcF9yZWFkX2FkZHIsCisKKwkuZWNwX3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X2VjcF93cml0ZV9kYXRhLAorCS5lY3BfcmVhZF9kYXRhCT0gcGFycG9ydF9pZWVlMTI4NF9lY3BfcmVhZF9kYXRhLAorCS5lY3Bfd3JpdGVfYWRkcgk9IHBhcnBvcnRfaWVlZTEyODRfZWNwX3dyaXRlX2FkZHIsCisKKwkuY29tcGF0X3dyaXRlX2RhdGEJPSBwYXJwb3J0X2llZWUxMjg0X3dyaXRlX2NvbXBhdCwKKwkubmliYmxlX3JlYWRfZGF0YQk9IHBhcnBvcnRfaWVlZTEyODRfcmVhZF9uaWJibGUsCisJLmJ5dGVfcmVhZF9kYXRhCQk9IHBhcnBvcnRfaWVlZTEyODRfcmVhZF9ieXRlLAorCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBwYXJwb3J0X2F4ODg3OTZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpfZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgYXhfZHJ2ZGF0YSAqZGQ7CisJc3RydWN0IHBhcnBvcnQgKnBwID0gTlVMTDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJaW50IHNwYWNpbmc7CisJaW50IGlycTsKKwlpbnQgcmV0OworCisJZGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXhfZHJ2ZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChkZCA9PSBOVUxMKSB7CisJCWRldl9lcnIoX2RldiwgIm5vIG1lbW9yeSBmb3IgcHJpdmF0ZSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAibm8gTUVNIHNwZWNpZmllZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBleGl0X21lbTsKKwl9CisKKwlzaXplID0gKHJlcy0+ZW5kIC0gcmVzLT5zdGFydCkgKyAxOworCXNwYWNpbmcgPSBzaXplIC8gMzsKKworCWRkLT5pbyA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCBzaXplLCBwZGV2LT5uYW1lKTsKKwlpZiAoZGQtPmlvID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAiY2Fubm90IHJlc2VydmUgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGV4aXRfbWVtOworCX0KKworCWRkLT5iYXNlID0gaW9yZW1hcChyZXMtPnN0YXJ0LCBzaXplKTsKKwlpZiAoZGQtPmJhc2UgPT0gTlVMTCkgeworCQlkZXZfZXJyKF9kZXYsICJjYW5ub3QgaW9yZW1hcCByZWdpb25cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXhpdF9yZXM7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDw9IDApCisJCWlycSA9IFBBUlBPUlRfSVJRX05PTkU7CisKKwlwcCA9IHBhcnBvcnRfcmVnaXN0ZXJfcG9ydCgodW5zaWduZWQgbG9uZylkZC0+YmFzZSwgaXJxLAorCQkJCSAgIFBBUlBPUlRfRE1BX05PTkUsCisJCQkJICAgJnBhcnBvcnRfYXg4ODc5Nl9vcHMpOworCisJaWYgKHBwID09IE5VTEwpIHsKKwkJZGV2X2VycihfZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHBhcmFsbGVsIHBvcnRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfdW5tYXA7CisJfQorCisJcHAtPnByaXZhdGVfZGF0YSA9IGRkOworCWRkLT5wYXJwb3J0ID0gcHA7CisJZGQtPmRldiA9IF9kZXY7CisKKwlkZC0+c3BwX2RhdGEgPSBkZC0+YmFzZTsKKwlkZC0+c3BwX3NwciAgPSBkZC0+YmFzZSArIChzcGFjaW5nICogMSk7CisJZGQtPnNwcF9jcHIgID0gZGQtPmJhc2UgKyAoc3BhY2luZyAqIDIpOworCisJLyogaW5pdGlhbGlzZSB0aGUgcG9ydCBjb250cm9scyAqLworCXdyaXRlYihBWF9DUFJfU1RSQiwgZGQtPnNwcF9jcHIpOworCisJaWYgKGlycSA+PSAwKSB7CisJCS8qIHJlcXVlc3QgaXJxICovCisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgcGFycG9ydF9heDg4Nzk2X2ludGVycnVwdCwKKwkJCQkgIFNBX1RSSUdHRVJfRkFMTElORywgcGRldi0+bmFtZSwgcHApOworCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBleGl0X3BvcnQ7CisKKwkJZGQtPmlycV9lbmFibGVkID0gMTsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcCk7CisKKwlkZXZfaW5mbyhfZGV2LCAiYXR0YWNoZWQgcGFyYWxsZWwgcG9ydCBkcml2ZXJcbiIpOworCXBhcnBvcnRfYW5ub3VuY2VfcG9ydChwcCk7CisKKwlyZXR1cm4gMDsKKworIGV4aXRfcG9ydDoKKwlwYXJwb3J0X3JlbW92ZV9wb3J0KHBwKTsKKyBleGl0X3VubWFwOgorCWlvdW5tYXAoZGQtPmJhc2UpOworIGV4aXRfcmVzOgorCXJlbGVhc2VfcmVzb3VyY2UoZGQtPmlvKTsKKwlrZnJlZShkZC0+aW8pOworIGV4aXRfbWVtOgorCWtmcmVlKGRkKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnBvcnRfYXg4ODc5Nl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCWZyZWVfaXJxKHAtPmlycSwgcCk7CisJcGFycG9ydF9yZW1vdmVfcG9ydChwKTsKKwlpb3VubWFwKGRkLT5iYXNlKTsKKwlyZWxlYXNlX3Jlc291cmNlKGRkLT5pbyk7CisJa2ZyZWUoZGQtPmlvKTsKKwlrZnJlZShkZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IHBhcnBvcnRfYXg4ODc5Nl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwKKwkJCQkgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHBhcnBvcnQgKnAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBheF9kcnZkYXRhICpkZCA9IHBwX3RvX2RydihwKTsKKworCXBhcnBvcnRfYXg4ODc5Nl9zYXZlX3N0YXRlKHAsICZkZC0+c3VzcGVuZCk7CisJd3JpdGViKEFYX0NQUl9uRE9FIHwgQVhfQ1BSX1NUUkIsIGRkLT5zcHBfY3ByKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGFycG9ydCAqcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF4X2RydmRhdGEgKmRkID0gcHBfdG9fZHJ2KHApOworCisJcGFycG9ydF9heDg4Nzk2X3Jlc3RvcmVfc3RhdGUocCwgJmRkLT5zdXNwZW5kKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKyNkZWZpbmUgcGFycG9ydF9heDg4Nzk2X3N1c3BlbmQgTlVMTAorI2RlZmluZSBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lICBOVUxMCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhkcnYgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImF4ODg3OTYtcHAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBwYXJwb3J0X2F4ODg3OTZfcHJvYmUsCisJLnJlbW92ZQkJPSBwYXJwb3J0X2F4ODg3OTZfcmVtb3ZlLAorCS5zdXNwZW5kCT0gcGFycG9ydF9heDg4Nzk2X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBwYXJwb3J0X2F4ODg3OTZfcmVzdW1lLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcGFycG9ydF9heDg4Nzk2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZheGRydik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwYXJwb3J0X2F4ODg3OTZfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZheGRydik7Cit9CisKK21vZHVsZV9pbml0KHBhcnBvcnRfYXg4ODc5Nl9pbml0KQorbW9kdWxlX2V4aXQocGFycG9ydF9heDg4Nzk2X2V4aXQpCisKK01PRFVMRV9BVVRIT1IoIkJlbiBEb29rcyA8YmVuQHNpbXRlYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVg4ODc5NiBQYXJwb3J0IHBhcmFsbGVsIHBvcnQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvcGFycG9ydF9zdW5icHAuYyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCmluZGV4IDM2YTE1NTYuLjY5YTRiYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9wYXJwb3J0X3N1bmJwcC5jCkBAIC0xLDUgKzEsNCBAQAotLyogJElkOiBwYXJwb3J0X3N1bmJwcC5jLHYgMS4xMiAyMDAxLzA1LzI2IDAzOjAxOjQyIGRhdmVtIEV4cCAkCi0gKiBQYXJhbGxlbC1wb3J0IHJvdXRpbmVzIGZvciBTdW4gYXJjaGl0ZWN0dXJlCisvKiBwYXJwb3J0X3N1bmJwcC5jOiBQYXJhbGxlbC1wb3J0IHJvdXRpbmVzIGZvciBTQlVTCiAgKiAKICAqIEF1dGhvcjogRGVycmljayBKLiBCcmFzaGVhciA8c2hhZG93QGRlbWVudGlhLm9yZz4KICAqCkBAIC0xNCw2ICsxMyw5IEBACiAgKiAgICAgICAgICBHdXMgQmFsZGF1ZiAoZ2JhbGRhdWZAaXgubmV0Y29tLmNvbSkKICAqICAgICAgICAgIFBldGVyIFphaXRjZXYKICAqICAgICAgICAgIFRvbSBEeWFzCisgKgorICogVXBkYXRlZCB0byBuZXcgU0JVUyBkZXZpY2UgZnJhbWV3b3JrOiBEYXZpZCBTLiBNaWxsZXIgPGRhdmVtQGRhdmVtbG9mdC5uZXQ+CisgKiAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0yODcsMTQgKzI4OSw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgcGFycG9ydCAqcG9ydDsKLX0gTm9kZTsKLS8qIG5vIGxvY2tzLCBldmVyeXRoaW5nJ3Mgc2VyaWFsaXplZCAqLwotc3RhdGljIExJU1RfSEVBRChwb3J0X2xpc3QpOwotCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X29uZV9wb3J0KHN0cnVjdCBzYnVzX2RldiAqc2RldikKK3N0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfb25lX3BvcnQoc3RydWN0IHNidXNfZGV2ICpzZGV2KQogewogCXN0cnVjdCBwYXJwb3J0ICpwOwogCS8qIGF0IGxlYXN0IGluIHRoZW9yeSB0aGVyZSBtYXkgYmUgYSAid2UgZG9uJ3QgZG1hIiBjYXNlICovCkBAIC0zMDMsMTA5ICsyOTgsMTIwIEBACiAJaW50IGlycSwgZG1hLCBlcnIgPSAwLCBzaXplOwogCXN0cnVjdCBicHBfcmVncyBfX2lvbWVtICpyZWdzOwogCXVuc2lnbmVkIGNoYXIgdmFsdWVfdGNyOwotCU5vZGUgKm5vZGU7Ci0KLQlkcHJpbnRrKChLRVJOX0RFQlVHICJpbml0X29uZV9wb3J0KCVwKTogcmFuZ2VzLCBhbGxvY19pbywgIiwgc2RldikpOwotCW5vZGUgPSBrbWFsbG9jKHNpemVvZihOb2RlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFub2RlKQotCQlnb3RvIG91dDA7CiAKIAlpcnEgPSBzZGV2LT5pcnFzWzBdOwogCWJhc2UgPSBzYnVzX2lvcmVtYXAoJnNkZXYtPnJlc291cmNlWzBdLCAwLAogCQkJICAgIHNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZSwgCiAJCQkgICAgInN1bmJwcCIpOwogCWlmICghYmFzZSkKLQkJZ290byBvdXQxOworCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNpemUgPSBzZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemU7CiAJZG1hID0gUEFSUE9SVF9ETUFfTk9ORTsKIAotCWRwcmludGsoKCJhbGxvYyhwcG9wcyksICIpKTsKLQlvcHMgPSBrbWFsbG9jIChzaXplb2YgKHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlvcHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFycG9ydF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CiAgICAgICAgIGlmICghb3BzKQotCQlnb3RvIG91dDI7CisJCWdvdG8gb3V0X3VubWFwOwogCiAgICAgICAgIG1lbWNweSAob3BzLCAmcGFycG9ydF9zdW5icHBfb3BzLCBzaXplb2YgKHN0cnVjdCBwYXJwb3J0X29wZXJhdGlvbnMpKTsKIAogCWRwcmludGsoKCJyZWdpc3Rlcl9wb3J0XG4iKSk7CiAJaWYgKCEocCA9IHBhcnBvcnRfcmVnaXN0ZXJfcG9ydCgodW5zaWduZWQgbG9uZyliYXNlLCBpcnEsIGRtYSwgb3BzKSkpCi0JCWdvdG8gb3V0MzsKKwkJZ290byBvdXRfZnJlZV9vcHM7CiAKIAlwLT5zaXplID0gc2l6ZTsKIAotCWRwcmludGsoKEtFUk5fREVCVUcgImluaXRfb25lX3BvcnQ6IHJlcXVlc3RfaXJxKCUwOHg6JXA6JXg6JXM6JXApICIsCi0JCXAtPmlycSwgcGFycG9ydF9zdW5icHBfaW50ZXJydXB0LCBTQV9TSElSUSwgcC0+bmFtZSwgcCkpOwogCWlmICgoZXJyID0gcmVxdWVzdF9pcnEocC0+aXJxLCBwYXJwb3J0X3N1bmJwcF9pbnRlcnJ1cHQsCiAJCQkgICAgICAgU0FfU0hJUlEsIHAtPm5hbWUsIHApKSAhPSAwKSB7Ci0JCWRwcmludGsoKCJFUlJPUiAlZFxuIiwgZXJyKSk7Ci0JCWdvdG8gb3V0NDsKKwkJZ290byBvdXRfcHV0X3BvcnQ7CiAJfQotCWRwcmludGsoKCJPS1xuIikpOworCiAJcGFycG9ydF9zdW5icHBfZW5hYmxlX2lycShwKTsKIAogCXJlZ3MgPSAoc3RydWN0IGJwcF9yZWdzIF9faW9tZW0gKilwLT5iYXNlOwotCWRwcmludGsoKEtFUk5fREVCVUcgImZvcndhcmRcbiIpKTsKKwogCXZhbHVlX3RjciA9IHNidXNfcmVhZGIoJnJlZ3MtPnBfdGNyKTsKIAl2YWx1ZV90Y3IgJj0gflBfVENSX0RJUjsKIAlzYnVzX3dyaXRlYih2YWx1ZV90Y3IsICZyZWdzLT5wX3Rjcik7CiAKIAlwcmludGsoS0VSTl9JTkZPICIlczogc3VuYnBwIGF0IDB4JWx4XG4iLCBwLT5uYW1lLCBwLT5iYXNlKTsKLQlub2RlLT5wb3J0ID0gcDsKLQlsaXN0X2FkZCgmbm9kZS0+bGlzdCwgJnBvcnRfbGlzdCk7Ci0JcGFycG9ydF9hbm5vdW5jZV9wb3J0IChwKTsKIAotCXJldHVybiAxOworCWRldl9zZXRfZHJ2ZGF0YSgmc2Rldi0+b2ZkZXYuZGV2LCBwKTsKIAotb3V0NDoKKwlwYXJwb3J0X2Fubm91bmNlX3BvcnQocCk7CisKKwlyZXR1cm4gMDsKKworb3V0X3B1dF9wb3J0OgogCXBhcnBvcnRfcHV0X3BvcnQocCk7Ci1vdXQzOgorCitvdXRfZnJlZV9vcHM6CiAJa2ZyZWUob3BzKTsKLW91dDI6CisKK291dF91bm1hcDoKIAlzYnVzX2lvdW5tYXAoYmFzZSwgc2l6ZSk7Ci1vdXQxOgotCWtmcmVlKG5vZGUpOwotb3V0MDoKKwogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJwcF9wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7CisKKwlyZXR1cm4gaW5pdF9vbmVfcG9ydChzZGV2KTsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYnBwX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBhcnBvcnQgKnAgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2KTsKKwlzdHJ1Y3QgcGFycG9ydF9vcGVyYXRpb25zICpvcHMgPSBwLT5vcHM7CisKKwlwYXJwb3J0X3JlbW92ZV9wb3J0KHApOworCisJaWYgKHAtPmlycSAhPSBQQVJQT1JUX0lSUV9OT05FKSB7CisJCXBhcnBvcnRfc3VuYnBwX2Rpc2FibGVfaXJxKHApOworCQlmcmVlX2lycShwLT5pcnEsIHApOworCX0KKworCXNidXNfaW91bm1hcCgodm9pZCBfX2lvbWVtICopIHAtPmJhc2UsIHAtPnNpemUpOworCXBhcnBvcnRfcHV0X3BvcnQocCk7CisJa2ZyZWUob3BzKTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJwcF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiU1VOVyxicHAiLAorCX0sCisJe30sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBxZWNfc2J1c19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGJwcF9zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiYnBwIiwKKwkubWF0Y2hfdGFibGUJPSBicHBfbWF0Y2gsCisJLnByb2JlCQk9IGJwcF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJwcF9yZW1vdmUpLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgcGFycG9ydF9zdW5icHBfaW5pdCh2b2lkKQogewotICAgICAgICBzdHJ1Y3Qgc2J1c19idXMgKnNidXM7Ci0gICAgICAgIHN0cnVjdCBzYnVzX2RldiAqc2RldjsKLQlpbnQgY291bnQgPSAwOwotCi0JZm9yX2VhY2hfc2J1cyhzYnVzKSB7Ci0JCWZvcl9lYWNoX3NidXNkZXYoc2Rldiwgc2J1cykgewotCQkJaWYgKCFzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiU1VOVyxicHAiKSkKLQkJCQljb3VudCArPSBpbml0X29uZV9wb3J0KHNkZXYpOwotCQl9Ci0JfQotCXJldHVybiBjb3VudCA/IDAgOiAtRU5PREVWOworCXJldHVybiBvZl9yZWdpc3Rlcl9kcml2ZXIoJmJwcF9zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgcGFycG9ydF9zdW5icHBfZXhpdCh2b2lkKQogewotCXdoaWxlICghbGlzdF9lbXB0eSgmcG9ydF9saXN0KSkgewotCQlOb2RlICpub2RlID0gbGlzdF9lbnRyeShwb3J0X2xpc3QubmV4dCwgTm9kZSwgbGlzdCk7Ci0JCXN0cnVjdCBwYXJwb3J0ICpwID0gbm9kZS0+cG9ydDsKLQkJc3RydWN0IHBhcnBvcnRfb3BlcmF0aW9ucyAqb3BzID0gcC0+b3BzOwotCQlwYXJwb3J0X3JlbW92ZV9wb3J0KHApOwotCi0JCWlmIChwLT5pcnEgIT0gUEFSUE9SVF9JUlFfTk9ORSkgewotCQkJcGFycG9ydF9zdW5icHBfZGlzYWJsZV9pcnEocCk7Ci0JCQlmcmVlX2lycShwLT5pcnEsIHApOwotCQl9Ci0JCXNidXNfaW91bm1hcCgodm9pZCBfX2lvbWVtICopcC0+YmFzZSwgcC0+c2l6ZSk7Ci0JCXBhcnBvcnRfcHV0X3BvcnQocCk7Ci0JCWtmcmVlIChvcHMpOwotCQlsaXN0X2RlbCgmbm9kZS0+bGlzdCk7Ci0JCWtmcmVlIChub2RlKTsKLQl9CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmJwcF9zYnVzX2RyaXZlcik7CiB9CiAKIE1PRFVMRV9BVVRIT1IoIkRlcnJpY2sgSiBCcmFzaGVhciIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJQYXJwb3J0IERyaXZlciBmb3IgU3BhcmMgYmlkaXJlY3Rpb25hbCBQb3J0Iik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiU3BhcmMgQmlkaXJlY3Rpb25hbCBQYXJhbGxlbCBQb3J0Iik7CitNT0RVTEVfVkVSU0lPTigiMi4wIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIG1vZHVsZV9pbml0KHBhcnBvcnRfc3VuYnBwX2luaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcnBvcnQvc2hhcmUuYyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCmluZGV4IGJiYmZkNzkuLjJjYjIyYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCisrKyBiL2RyaXZlcnMvcGFycG9ydC9zaGFyZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKICAqCXBhcnBvcnRfZ2V0X3BvcnQgLSBpbmNyZW1lbnQgYSBwb3J0J3MgcmVmZXJlbmNlIGNvdW50CiAgKglAcG9ydDogdGhlIHBvcnQKICAqCi0gKglUaGlzIGVuc3VyZSdzIHRoYXQgYSBzdHJ1Y3QgcGFycG9ydCBwb2ludGVyIHJlbWFpbnMgdmFsaWQKKyAqCVRoaXMgZW5zdXJlcyB0aGF0IGEgc3RydWN0IHBhcnBvcnQgcG9pbnRlciByZW1haW5zIHZhbGlkCiAgKgl1bnRpbCB0aGUgbWF0Y2hpbmcgcGFycG9ydF9wdXRfcG9ydCgpIGNhbGwuCiAgKiovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL01ha2VmaWxlIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKaW5kZXggNjcwN2RmOS4uZjJkMTUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY2kvTWFrZWZpbGUKQEAgLTI2LDcgKzI2LDExIEBACiBvYmotJChDT05GSUdfUFBDNjQpICs9IHNldHVwLWJ1cy5vCiBvYmotJChDT05GSUdfTUlQUykgKz0gc2V0dXAtYnVzLm8gc2V0dXAtaXJxLm8KIG9iai0kKENPTkZJR19YODZfVklTV1MpICs9IHNldHVwLWlycS5vCi1vYmotJChDT05GSUdfUENJX01TSSkgKz0gbXNpLm8KKworbXNpb2JqLXkgOj0gbXNpLm8gbXNpLWFwaWMubworbXNpb2JqLSQoQ09ORklHX0lBNjRfR0VORVJJQykgKz0gbXNpLWFsdGl4Lm8KK21zaW9iai0kKENPTkZJR19JQTY0X1NHSV9TTjIpICs9IG1zaS1hbHRpeC5vCitvYmotJChDT05GSUdfUENJX01TSSkgKz0gJChtc2lvYmoteSkKIAogIwogIyBBQ1BJIFJlbGF0ZWQgUENJIEZXIEZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYnVzLmMgYi9kcml2ZXJzL3BjaS9idXMuYwppbmRleCBlZWQ2N2Q5Li43MjMwOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9idXMuYworKysgYi9kcml2ZXJzL3BjaS9idXMuYwpAQCAtODEsOSArODEsOSBAQAogewogCWRldmljZV9hZGQoJmRldi0+ZGV2KTsKIAotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnBjaV9kZXZpY2VzKTsKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF93cml0ZSgmcGNpX2J1c19zZW0pOwogCiAJcGNpX3Byb2NfYXR0YWNoX2RldmljZShkZXYpOwogCXBjaV9jcmVhdGVfc3lzZnNfZGV2X2ZpbGVzKGRldik7CkBAIC0xMjUsMTAgKzEyNSwxMCBAQAogCQkgKi8KIAkJaWYgKGRldi0+c3Vib3JkaW5hdGUpIHsKIAkJICAgICAgIGlmIChsaXN0X2VtcHR5KCZkZXYtPnN1Ym9yZGluYXRlLT5ub2RlKSkgewotCQkJICAgICAgIHNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwkJCSAgICAgICBkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJCQkgICAgICAgbGlzdF9hZGRfdGFpbCgmZGV2LT5zdWJvcmRpbmF0ZS0+bm9kZSwKIAkJCQkJICAgICAgICZkZXYtPmJ1cy0+Y2hpbGRyZW4pOwotCQkJICAgICAgIHNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCQkJICAgICAgIHVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJCSAgICAgICB9CiAJCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGRldi0+c3Vib3JkaW5hdGUpOwogCkBAIC0xNjgsNyArMTY4LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OwogCiAJYnVzID0gdG9wOwotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluZXh0ID0gdG9wLT5kZXZpY2VzLm5leHQ7CiAJZm9yICg7OykgewogCQlpZiAobmV4dCA9PSAmYnVzLT5kZXZpY2VzKSB7CkBAIC0xODAsMjIgKzE4MCwxOSBAQAogCQkJY29udGludWU7CiAJCX0KIAkJZGV2ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgcGNpX2RldiwgYnVzX2xpc3QpOwotCQlwY2lfZGV2X2dldChkZXYpOwogCQlpZiAoZGV2LT5zdWJvcmRpbmF0ZSkgewogCQkJLyogdGhpcyBpcyBhIHBjaS1wY2kgYnJpZGdlLCBkbyBpdHMgZGV2aWNlcyBuZXh0ICovCiAJCQluZXh0ID0gZGV2LT5zdWJvcmRpbmF0ZS0+ZGV2aWNlcy5uZXh0OwogCQkJYnVzID0gZGV2LT5zdWJvcmRpbmF0ZTsKIAkJfSBlbHNlCiAJCQluZXh0ID0gZGV2LT5idXNfbGlzdC5uZXh0OwotCQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKIAotCQkvKiBSdW4gZGV2aWNlIHJvdXRpbmVzIHdpdGggdGhlIGJ1cyB1bmxvY2tlZCAqLworCQkvKiBSdW4gZGV2aWNlIHJvdXRpbmVzIHdpdGggdGhlIGRldmljZSBsb2NrZWQgKi8KKwkJZG93bigmZGV2LT5kZXYuc2VtKTsKIAkJY2IoZGV2LCB1c2VyZGF0YSk7Ci0KLQkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOwotCQlwY2lfZGV2X3B1dChkZXYpOworCQl1cCgmZGV2LT5kZXYuc2VtKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJdXBfcmVhZCgmcGNpX2J1c19zZW0pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGNpX3dhbGtfYnVzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLWFsdGl4LmMgYi9kcml2ZXJzL3BjaS9tc2ktYWx0aXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQ0MTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wY2kvbXNpLWFsdGl4LmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisKKyNpbmNsdWRlIDxhc20vc24vYWRkcnMuaD4KKyNpbmNsdWRlIDxhc20vc24vaW50ci5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oPgorI2luY2x1ZGUgPGFzbS9zbi9wY2lkZXYuaD4KKyNpbmNsdWRlIDxhc20vc24vbm9kZXBkYS5oPgorCisjaW5jbHVkZSAibXNpLmgiCisKK3N0cnVjdCBzbl9tc2lfaW5mbyB7CisJdTY0IHBjaV9hZGRyOworCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm87Cit9OworCitzdGF0aWMgc3RydWN0IHNuX21zaV9pbmZvICpzbl9tc2lfaW5mbzsKKworc3RhdGljIHZvaWQKK3NuX21zaV90ZWFyZG93bih1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCW5hc2lkX3QgbmFzaWQ7CisJaW50IHdpZGdldDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnNuX3BkZXY7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKwlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmJ1c3NvZnQ7CisJc3RydWN0IHNuX3BjaWJ1c19wcm92aWRlciAqcHJvdmlkZXI7CisKKwlzbl9pcnFfaW5mbyA9IHNuX21zaV9pbmZvW3ZlY3Rvcl0uc25faXJxX2luZm87CisJaWYgKHNuX2lycV9pbmZvID09IE5VTEwgfHwgc25faXJxX2luZm8tPmlycV9pbnRfYml0ID49IDApCisJCXJldHVybjsKKworCXNuX3BkZXYgPSAoc3RydWN0IHBjaWRldl9pbmZvICopc25faXJxX2luZm8tPmlycV9wY2lpb2luZm87CisJcGRldiA9IHNuX3BkZXYtPnBkaV9saW51eF9wY2lkZXY7CisJcHJvdmlkZXIgPSBTTl9QQ0lERVZfQlVTUFJPVklERVIocGRldik7CisKKwkoKnByb3ZpZGVyLT5kbWFfdW5tYXApKHBkZXYsCisJCQkgICAgICAgc25fbXNpX2luZm9bdmVjdG9yXS5wY2lfYWRkciwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCXNuX21zaV9pbmZvW3ZlY3Rvcl0ucGNpX2FkZHIgPSAwOworCisJYnVzc29mdCA9IFNOX1BDSURFVl9CVVNTT0ZUKHBkZXYpOworCW5hc2lkID0gTkFTSURfR0VUKGJ1c3NvZnQtPmJzX2Jhc2UpOworCXdpZGdldCA9IChuYXNpZCAmIDEpID8KKwkJCVRJT19TV0lOX1dJREdFVE5VTShidXNzb2Z0LT5ic19iYXNlKSA6CisJCQlTV0lOX1dJREdFVE5VTShidXNzb2Z0LT5ic19iYXNlKTsKKworCXNuX2ludHJfZnJlZShuYXNpZCwgd2lkZ2V0LCBzbl9pcnFfaW5mbyk7CisJc25fbXNpX2luZm9bdmVjdG9yXS5zbl9pcnFfaW5mbyA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKK2ludAorc25fbXNpX3NldHVwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgdmVjdG9yLAorCSAgICAgdTMyICphZGRyX2hpLCB1MzIgKmFkZHJfbG8sIHUzMiAqZGF0YSkKK3sKKwlpbnQgd2lkZ2V0OworCWludCBzdGF0dXM7CisJbmFzaWRfdCBuYXNpZDsKKwl1NjQgYnVzX2FkZHI7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKwlzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKmJ1c3NvZnQgPSBTTl9QQ0lERVZfQlVTU09GVChwZGV2KTsKKwlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlciA9IFNOX1BDSURFVl9CVVNQUk9WSURFUihwZGV2KTsKKworCWlmIChidXNzb2Z0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHByb3ZpZGVyID09IE5VTEwgfHwgcHJvdmlkZXItPmRtYV9tYXBfY29uc2lzdGVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogU2V0IHVwIHRoZSB2ZWN0b3IgcGx1bWJpbmcuICBMZXQgdGhlIHByb20gKHZpYSBzbl9pbnRyX2FsbG9jKQorCSAqIGRlY2lkZSB3aGljaCBjcHUgdG8gZGlyZWN0IHRoaXMgbXNpIGF0IGJ5IGRlZmF1bHQuCisJICovCisKKwluYXNpZCA9IE5BU0lEX0dFVChidXNzb2Z0LT5ic19iYXNlKTsKKwl3aWRnZXQgPSAobmFzaWQgJiAxKSA/CisJCQlUSU9fU1dJTl9XSURHRVROVU0oYnVzc29mdC0+YnNfYmFzZSkgOgorCQkJU1dJTl9XSURHRVROVU0oYnVzc29mdC0+YnNfYmFzZSk7CisKKwlzbl9pcnFfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9pcnFfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghIHNuX2lycV9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXR1cyA9IHNuX2ludHJfYWxsb2MobmFzaWQsIHdpZGdldCwgc25faXJxX2luZm8sIHZlY3RvciwgLTEsIC0xKTsKKwlpZiAoc3RhdHVzKSB7CisJCWtmcmVlKHNuX2lycV9pbmZvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc25faXJxX2luZm8tPmlycV9pbnRfYml0ID0gLTE7CQkvKiBtYXJrIHRoaXMgYXMgYW4gTVNJIGlycSAqLworCXNuX2lycV9maXh1cChwZGV2LCBzbl9pcnFfaW5mbyk7CisKKwkvKiBQcm9tIHByb2JhYmx5IHNob3VsZCBmaWxsIHRoZXNlIGluLCBidXQgZG9lc24ndCAuLi4gKi8KKwlzbl9pcnFfaW5mby0+aXJxX2JyaWRnZV90eXBlID0gYnVzc29mdC0+YnNfYXNpY190eXBlOworCXNuX2lycV9pbmZvLT5pcnFfYnJpZGdlID0gKHZvaWQgKilidXNzb2Z0LT5ic19iYXNlOworCisJLyoKKwkgKiBNYXAgdGhlIHhpbyBhZGRyZXNzIGludG8gYnVzIHNwYWNlCisJICovCisJYnVzX2FkZHIgPSAoKnByb3ZpZGVyLT5kbWFfbWFwX2NvbnNpc3RlbnQpKHBkZXYsCisJCQkJCXNuX2lycV9pbmZvLT5pcnFfeHRhbGthZGRyLAorCQkJCQlzaXplb2Yoc25faXJxX2luZm8tPmlycV94dGFsa2FkZHIpLAorCQkJCQlTTl9ETUFfTVNJfFNOX0RNQV9BRERSX1hJTyk7CisJaWYgKCEgYnVzX2FkZHIpIHsKKwkJc25faW50cl9mcmVlKG5hc2lkLCB3aWRnZXQsIHNuX2lycV9pbmZvKTsKKwkJa2ZyZWUoc25faXJxX2luZm8pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbl9tc2lfaW5mb1t2ZWN0b3JdLnNuX2lycV9pbmZvID0gc25faXJxX2luZm87CisJc25fbXNpX2luZm9bdmVjdG9yXS5wY2lfYWRkciA9IGJ1c19hZGRyOworCisJKmFkZHJfaGkgPSAodTMyKShidXNfYWRkciA+PiAzMik7CisJKmFkZHJfbG8gPSAodTMyKShidXNfYWRkciAmIDB4MDAwMDAwMDBmZmZmZmZmZik7CisKKwkvKgorCSAqIEluIHRoZSBTTiBwbGF0Zm9ybSwgYml0IDE2IGlzIGEgInNlbmQgdmVjdG9yIiBiaXQgd2hpY2gKKwkgKiBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gbW92ZSB0aGUgdmVjdG9yIHRocm91Z2ggdGhlIHN5c3RlbS4KKwkgKi8KKwkqZGF0YSA9IDB4MTAwICsgKHVuc2lnbmVkIGludCl2ZWN0b3I7CisKKyNpZmRlZiBDT05GSUdfU01QCisJc2V0X2lycV9hZmZpbml0eV9pbmZvKCh2ZWN0b3IgJiAweGZmKSwgc25faXJxX2luZm8tPmlycV9jcHVpZCwgMCk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc25fbXNpX3RhcmdldCh1bnNpZ25lZCBpbnQgdmVjdG9yLCB1bnNpZ25lZCBpbnQgY3B1LAorCSAgICAgIHUzMiAqYWRkcl9oaSwgdTMyICphZGRyX2xvKQoreworCWludCBzbGljZTsKKwluYXNpZF90IG5hc2lkOworCXU2NCBidXNfYWRkcjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgcGNpZGV2X2luZm8gKnNuX3BkZXY7CisJc3RydWN0IHNuX2lycV9pbmZvICpzbl9pcnFfaW5mbzsKKwlzdHJ1Y3Qgc25faXJxX2luZm8gKm5ld19pcnFfaW5mbzsKKwlzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyICpwcm92aWRlcjsKKworCXNuX2lycV9pbmZvID0gc25fbXNpX2luZm9bdmVjdG9yXS5zbl9pcnFfaW5mbzsKKwlpZiAoc25faXJxX2luZm8gPT0gTlVMTCB8fCBzbl9pcnFfaW5mby0+aXJxX2ludF9iaXQgPj0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSZWxlYXNlIFhJTyByZXNvdXJjZXMgZm9yIHRoZSBvbGQgTVNJIFBDSSBhZGRyZXNzCisJICovCisKKyAgICAgICAgc25fcGRldiA9IChzdHJ1Y3QgcGNpZGV2X2luZm8gKilzbl9pcnFfaW5mby0+aXJxX3BjaWlvaW5mbzsKKwlwZGV2ID0gc25fcGRldi0+cGRpX2xpbnV4X3BjaWRldjsKKwlwcm92aWRlciA9IFNOX1BDSURFVl9CVVNQUk9WSURFUihwZGV2KTsKKworCWJ1c19hZGRyID0gKHU2NCkoKmFkZHJfaGkpIDw8IDMyIHwgKHU2NCkoKmFkZHJfbG8pOworCSgqcHJvdmlkZXItPmRtYV91bm1hcCkocGRldiwgYnVzX2FkZHIsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJc25fbXNpX2luZm9bdmVjdG9yXS5wY2lfYWRkciA9IDA7CisKKwluYXNpZCA9IGNwdWlkX3RvX25hc2lkKGNwdSk7CisJc2xpY2UgPSBjcHVpZF90b19zbGljZShjcHUpOworCisJbmV3X2lycV9pbmZvID0gc25fcmV0YXJnZXRfdmVjdG9yKHNuX2lycV9pbmZvLCBuYXNpZCwgc2xpY2UpOworCXNuX21zaV9pbmZvW3ZlY3Rvcl0uc25faXJxX2luZm8gPSBuZXdfaXJxX2luZm87CisJaWYgKG5ld19pcnFfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1hcCB0aGUgeGlvIGFkZHJlc3MgaW50byBidXMgc3BhY2UKKwkgKi8KKworCWJ1c19hZGRyID0gKCpwcm92aWRlci0+ZG1hX21hcF9jb25zaXN0ZW50KShwZGV2LAorCQkJCQluZXdfaXJxX2luZm8tPmlycV94dGFsa2FkZHIsCisJCQkJCXNpemVvZihuZXdfaXJxX2luZm8tPmlycV94dGFsa2FkZHIpLAorCQkJCQlTTl9ETUFfTVNJfFNOX0RNQV9BRERSX1hJTyk7CisKKwlzbl9tc2lfaW5mb1t2ZWN0b3JdLnBjaV9hZGRyID0gYnVzX2FkZHI7CisJKmFkZHJfaGkgPSAodTMyKShidXNfYWRkciA+PiAzMik7CisJKmFkZHJfbG8gPSAodTMyKShidXNfYWRkciAmIDB4MDAwMDAwMDBmZmZmZmZmZik7Cit9CisKK3N0cnVjdCBtc2lfb3BzIHNuX21zaV9vcHMgPSB7CisJLnNldHVwID0gc25fbXNpX3NldHVwLAorCS50ZWFyZG93biA9IHNuX21zaV90ZWFyZG93biwKKyNpZmRlZiBDT05GSUdfU01QCisJLnRhcmdldCA9IHNuX21zaV90YXJnZXQsCisjZW5kaWYKK307CisKK2ludAorc25fbXNpX2luaXQodm9pZCkKK3sKKwlzbl9tc2lfaW5mbyA9CisJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzbl9tc2lfaW5mbykgKiBOUl9WRUNUT1JTLCBHRlBfS0VSTkVMKTsKKwlpZiAoISBzbl9tc2lfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2lfcmVnaXN0ZXIoJnNuX21zaV9vcHMpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvbXNpLWFwaWMuYyBiL2RyaXZlcnMvcGNpL21zaS1hcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGViNWZlOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL21zaS1hcGljLmMKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBNU0kgaG9va3MgZm9yIHN0YW5kYXJkIHg4NiBhcGljCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaW5jbHVkZSAibXNpLmgiCisKKy8qCisgKiBTaGlmdHMgZm9yIEFQSUMtYmFzZWQgZGF0YQorICovCisKKyNkZWZpbmUgTVNJX0RBVEFfVkVDVE9SX1NISUZUCQkwCisjZGVmaW5lCSAgICBNU0lfREFUQV9WRUNUT1IodikJCSgoKHU4KXYpIDw8IE1TSV9EQVRBX1ZFQ1RPUl9TSElGVCkKKworI2RlZmluZSBNU0lfREFUQV9ERUxJVkVSWV9TSElGVAkJOAorI2RlZmluZSAgICAgTVNJX0RBVEFfREVMSVZFUllfRklYRUQJKDAgPDwgTVNJX0RBVEFfREVMSVZFUllfU0hJRlQpCisjZGVmaW5lICAgICBNU0lfREFUQV9ERUxJVkVSWV9MT1dQUkkJKDEgPDwgTVNJX0RBVEFfREVMSVZFUllfU0hJRlQpCisKKyNkZWZpbmUgTVNJX0RBVEFfTEVWRUxfU0hJRlQJCTE0CisjZGVmaW5lICAgICBNU0lfREFUQV9MRVZFTF9ERUFTU0VSVAkoMCA8PCBNU0lfREFUQV9MRVZFTF9TSElGVCkKKyNkZWZpbmUgICAgIE1TSV9EQVRBX0xFVkVMX0FTU0VSVAkoMSA8PCBNU0lfREFUQV9MRVZFTF9TSElGVCkKKworI2RlZmluZSBNU0lfREFUQV9UUklHR0VSX1NISUZUCQkxNQorI2RlZmluZSAgICAgTVNJX0RBVEFfVFJJR0dFUl9FREdFCSgwIDw8IE1TSV9EQVRBX1RSSUdHRVJfU0hJRlQpCisjZGVmaW5lICAgICBNU0lfREFUQV9UUklHR0VSX0xFVkVMCSgxIDw8IE1TSV9EQVRBX1RSSUdHRVJfU0hJRlQpCisKKy8qCisgKiBTaGlmdC9tYXNrIGZpZWxkcyBmb3IgQVBJQy1iYXNlZCBidXMgYWRkcmVzcworICovCisKKyNkZWZpbmUgTVNJX0FERFJfSEVBREVSCQkJMHhmZWUwMDAwMAorCisjZGVmaW5lIE1TSV9BRERSX0RFU1RJRF9NQVNLCQkweGZmZjAwMDBmCisjZGVmaW5lICAgICBNU0lfQUREUl9ERVNUSURfQ1BVKGNwdSkJKChjcHUpIDw8IE1TSV9UQVJHRVRfQ1BVX1NISUZUKQorCisjZGVmaW5lIE1TSV9BRERSX0RFU1RNT0RFX1NISUZUCQkyCisjZGVmaW5lICAgICBNU0lfQUREUl9ERVNUTU9ERV9QSFlTCSgwIDw8IE1TSV9BRERSX0RFU1RNT0RFX1NISUZUKQorI2RlZmluZQkgICAgTVNJX0FERFJfREVTVE1PREVfTE9HSUMJKDEgPDwgTVNJX0FERFJfREVTVE1PREVfU0hJRlQpCisKKyNkZWZpbmUgTVNJX0FERFJfUkVESVJFQ1RJT05fU0hJRlQJMworI2RlZmluZSAgICAgTVNJX0FERFJfUkVESVJFQ1RJT05fQ1BVCSgwIDw8IE1TSV9BRERSX1JFRElSRUNUSU9OX1NISUZUKQorI2RlZmluZSAgICAgTVNJX0FERFJfUkVESVJFQ1RJT05fTE9XUFJJCSgxIDw8IE1TSV9BRERSX1JFRElSRUNUSU9OX1NISUZUKQorCisKK3N0YXRpYyB2b2lkCittc2lfdGFyZ2V0X2FwaWModW5zaWduZWQgaW50IHZlY3RvciwKKwkJdW5zaWduZWQgaW50IGRlc3RfY3B1LAorCQl1MzIgKmFkZHJlc3NfaGksCS8qIGluL291dCAqLworCQl1MzIgKmFkZHJlc3NfbG8pCS8qIGluL291dCAqLworeworCXUzMiBhZGRyID0gKmFkZHJlc3NfbG87CisKKwlhZGRyICY9IE1TSV9BRERSX0RFU1RJRF9NQVNLOworCWFkZHIgfD0gTVNJX0FERFJfREVTVElEX0NQVShjcHVfcGh5c2ljYWxfaWQoZGVzdF9jcHUpKTsKKworCSphZGRyZXNzX2xvID0gYWRkcjsKK30KKworc3RhdGljIGludAorbXNpX3NldHVwX2FwaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCS8qIHVudXNlZCBpbiBnZW5lcmljICovCisJCXVuc2lnbmVkIGludCB2ZWN0b3IsCisJCXUzMiAqYWRkcmVzc19oaSwKKwkJdTMyICphZGRyZXNzX2xvLAorCQl1MzIgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZwlkZXN0X3BoeXNfaWQ7CisKKwlkZXN0X3BoeXNfaWQgPSBjcHVfcGh5c2ljYWxfaWQoZmlyc3RfY3B1KGNwdV9vbmxpbmVfbWFwKSk7CisKKwkqYWRkcmVzc19oaSA9IDA7CisJKmFkZHJlc3NfbG8gPQlNU0lfQUREUl9IRUFERVIgfAorCQkJTVNJX0FERFJfREVTVE1PREVfUEhZUyB8CisJCQlNU0lfQUREUl9SRURJUkVDVElPTl9DUFUgfAorCQkJTVNJX0FERFJfREVTVElEX0NQVShkZXN0X3BoeXNfaWQpOworCisJKmRhdGEgPSBNU0lfREFUQV9UUklHR0VSX0VER0UgfAorCQlNU0lfREFUQV9MRVZFTF9BU1NFUlQgfAorCQlNU0lfREFUQV9ERUxJVkVSWV9GSVhFRCB8CisJCU1TSV9EQVRBX1ZFQ1RPUih2ZWN0b3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCittc2lfdGVhcmRvd25fYXBpYyh1bnNpZ25lZCBpbnQgdmVjdG9yKQoreworCXJldHVybjsJCS8qIG5vLW9wICovCit9CisKKy8qCisgKiBHZW5lcmljIG9wcyB1c2VkIG9uIG1vc3QgSUEgYXJjaHMvcGxhdGZvcm1zLiAgU2V0IHdpdGggbXNpX3JlZ2lzdGVyKCkKKyAqLworCitzdHJ1Y3QgbXNpX29wcyBtc2lfYXBpY19vcHMgPSB7CisJLnNldHVwID0gbXNpX3NldHVwX2FwaWMsCisJLnRlYXJkb3duID0gbXNpX3RlYXJkb3duX2FwaWMsCisJLnRhcmdldCA9IG1zaV90YXJnZXRfYXBpYywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuYyBiL2RyaXZlcnMvcGNpL21zaS5jCmluZGV4IDk4NTVjNGMuLjdmODQyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5jCisrKyBiL2RyaXZlcnMvcGNpL21zaS5jCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSAicGNpLmgiCiAjaW5jbHVkZSAibXNpLmgiCiAKLSNkZWZpbmUgTVNJX1RBUkdFVF9DUFUJCWZpcnN0X2NwdShjcHVfb25saW5lX21hcCkKLQogc3RhdGljIERFRklORV9TUElOTE9DSyhtc2lfbG9jayk7CiBzdGF0aWMgc3RydWN0IG1zaV9kZXNjKiBtc2lfZGVzY1tOUl9JUlFTXSA9IHsgWzAgLi4uIE5SX0lSUVMtMV0gPSBOVUxMIH07CiBzdGF0aWMga21lbV9jYWNoZV90KiBtc2lfY2FjaGVwOwpAQCAtMzcsOSArMzUsMTcgQEAKIAogI2lmbmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIGludCB2ZWN0b3JfaXJxW05SX1ZFQ1RPUlNdID0geyBbMCAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTF9OwotdTggaXJxX3ZlY3RvcltOUl9JUlFfVkVDVE9SU10gPSB7IEZJUlNUX0RFVklDRV9WRUNUT1IgLCAwIH07CiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCBtc2lfb3BzICptc2lfb3BzOworCitpbnQKK21zaV9yZWdpc3RlcihzdHJ1Y3QgbXNpX29wcyAqb3BzKQoreworCW1zaV9vcHMgPSBvcHM7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIG1zaV9jYWNoZV9jdG9yKHZvaWQgKnAsIGttZW1fY2FjaGVfdCAqY2FjaGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJbWVtc2V0KHAsIDAsIE5SX0lSUVMgKiBzaXplb2Yoc3RydWN0IG1zaV9kZXNjKSk7CkBAIC05Miw3ICs5OCw3IEBACiBzdGF0aWMgdm9pZCBzZXRfbXNpX2FmZmluaXR5KHVuc2lnbmVkIGludCB2ZWN0b3IsIGNwdW1hc2tfdCBjcHVfbWFzaykKIHsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwotCXN0cnVjdCBtc2dfYWRkcmVzcyBhZGRyZXNzOworCXUzMiBhZGRyZXNzX2hpLCBhZGRyZXNzX2xvOwogCXVuc2lnbmVkIGludCBpcnEgPSB2ZWN0b3I7CiAJdW5zaWduZWQgaW50IGRlc3RfY3B1ID0gZmlyc3RfY3B1KGNwdV9tYXNrKTsKIApAQCAtMTA4LDI4ICsxMTQsMzYgQEAKIAkJaWYgKCFwb3MpCiAJCQlyZXR1cm47CiAKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGVudHJ5LT5kZXYsIG1zaV91cHBlcl9hZGRyZXNzX3JlZyhwb3MpLAorCQkJJmFkZHJlc3NfaGkpOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZW50cnktPmRldiwgbXNpX2xvd2VyX2FkZHJlc3NfcmVnKHBvcyksCi0JCQkmYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlKTsKLQkJYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlICY9IE1TSV9BRERSRVNTX0RFU1RfSURfTUFTSzsKLQkJYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlIHw9IChjcHVfcGh5c2ljYWxfaWQoZGVzdF9jcHUpIDw8Ci0JCQkJCQkJCQlNU0lfVEFSR0VUX0NQVV9TSElGVCk7Ci0JCWVudHJ5LT5tc2lfYXR0cmliLmN1cnJlbnRfY3B1ID0gY3B1X3BoeXNpY2FsX2lkKGRlc3RfY3B1KTsKKwkJCSZhZGRyZXNzX2xvKTsKKworCQltc2lfb3BzLT50YXJnZXQodmVjdG9yLCBkZXN0X2NwdSwgJmFkZHJlc3NfaGksICZhZGRyZXNzX2xvKTsKKworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGVudHJ5LT5kZXYsIG1zaV91cHBlcl9hZGRyZXNzX3JlZyhwb3MpLAorCQkJYWRkcmVzc19oaSk7CiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZW50cnktPmRldiwgbXNpX2xvd2VyX2FkZHJlc3NfcmVnKHBvcyksCi0JCQlhZGRyZXNzLmxvX2FkZHJlc3MudmFsdWUpOworCQkJYWRkcmVzc19sbyk7CiAJCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBjcHVfbWFzayk7CiAJCWJyZWFrOwogCX0KIAljYXNlIFBDSV9DQVBfSURfTVNJWDoKIAl7Ci0JCWludCBvZmZzZXQgPSBlbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9uciAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKwotCQkJUENJX01TSVhfRU5UUllfTE9XRVJfQUREUl9PRkZTRVQ7CisJCWludCBvZmZzZXRfaGkgPQorCQkJZW50cnktPm1zaV9hdHRyaWIuZW50cnlfbnIgKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKKwkJCQlQQ0lfTVNJWF9FTlRSWV9VUFBFUl9BRERSX09GRlNFVDsKKwkJaW50IG9mZnNldF9sbyA9CisJCQllbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9uciAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKworCQkJCVBDSV9NU0lYX0VOVFJZX0xPV0VSX0FERFJfT0ZGU0VUOwogCi0JCWFkZHJlc3MubG9fYWRkcmVzcy52YWx1ZSA9IHJlYWRsKGVudHJ5LT5tYXNrX2Jhc2UgKyBvZmZzZXQpOwotCQlhZGRyZXNzLmxvX2FkZHJlc3MudmFsdWUgJj0gTVNJX0FERFJFU1NfREVTVF9JRF9NQVNLOwotCQlhZGRyZXNzLmxvX2FkZHJlc3MudmFsdWUgfD0gKGNwdV9waHlzaWNhbF9pZChkZXN0X2NwdSkgPDwKLQkJCQkJCQkJCU1TSV9UQVJHRVRfQ1BVX1NISUZUKTsKLQkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSBjcHVfcGh5c2ljYWxfaWQoZGVzdF9jcHUpOwotCQl3cml0ZWwoYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlLCBlbnRyeS0+bWFza19iYXNlICsgb2Zmc2V0KTsKKwkJYWRkcmVzc19oaSA9IHJlYWRsKGVudHJ5LT5tYXNrX2Jhc2UgKyBvZmZzZXRfaGkpOworCQlhZGRyZXNzX2xvID0gcmVhZGwoZW50cnktPm1hc2tfYmFzZSArIG9mZnNldF9sbyk7CisKKwkJbXNpX29wcy0+dGFyZ2V0KHZlY3RvciwgZGVzdF9jcHUsICZhZGRyZXNzX2hpLCAmYWRkcmVzc19sbyk7CisKKwkJd3JpdGVsKGFkZHJlc3NfaGksIGVudHJ5LT5tYXNrX2Jhc2UgKyBvZmZzZXRfaGkpOworCQl3cml0ZWwoYWRkcmVzc19sbywgZW50cnktPm1hc2tfYmFzZSArIG9mZnNldF9sbyk7CiAJCXNldF9uYXRpdmVfaXJxX2luZm8oaXJxLCBjcHVfbWFzayk7CiAJCWJyZWFrOwogCX0KQEAgLTI1MSwzMCArMjY1LDYgQEAKIAkuc2V0X2FmZmluaXR5CT0gc2V0X21zaV9hZmZpbml0eQogfTsKIAotc3RhdGljIHZvaWQgbXNpX2RhdGFfaW5pdChzdHJ1Y3QgbXNnX2RhdGEgKm1zaV9kYXRhLAotCQkJICB1bnNpZ25lZCBpbnQgdmVjdG9yKQotewotCW1lbXNldChtc2lfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBtc2dfZGF0YSkpOwotCW1zaV9kYXRhLT52ZWN0b3IgPSAodTgpdmVjdG9yOwotCW1zaV9kYXRhLT5kZWxpdmVyeV9tb2RlID0gTVNJX0RFTElWRVJZX01PREU7Ci0JbXNpX2RhdGEtPmxldmVsID0gTVNJX0xFVkVMX01PREU7Ci0JbXNpX2RhdGEtPnRyaWdnZXIgPSBNU0lfVFJJR0dFUl9NT0RFOwotfQotCi1zdGF0aWMgdm9pZCBtc2lfYWRkcmVzc19pbml0KHN0cnVjdCBtc2dfYWRkcmVzcyAqbXNpX2FkZHJlc3MpCi17Ci0JdW5zaWduZWQgaW50CWRlc3RfaWQ7Ci0JdW5zaWduZWQgbG9uZwlkZXN0X3BoeXNfaWQgPSBjcHVfcGh5c2ljYWxfaWQoTVNJX1RBUkdFVF9DUFUpOwotCi0JbWVtc2V0KG1zaV9hZGRyZXNzLCAwLCBzaXplb2Yoc3RydWN0IG1zZ19hZGRyZXNzKSk7Ci0JbXNpX2FkZHJlc3MtPmhpX2FkZHJlc3MgPSAodTMyKTA7Ci0JZGVzdF9pZCA9IChNU0lfQUREUkVTU19IRUFERVIgPDwgTVNJX0FERFJFU1NfSEVBREVSX1NISUZUKTsKLQltc2lfYWRkcmVzcy0+bG9fYWRkcmVzcy51LmRlc3RfbW9kZSA9IE1TSV9QSFlTSUNBTF9NT0RFOwotCW1zaV9hZGRyZXNzLT5sb19hZGRyZXNzLnUucmVkaXJlY3Rpb25faGludCA9IE1TSV9SRURJUkVDVElPTl9ISU5UX01PREU7Ci0JbXNpX2FkZHJlc3MtPmxvX2FkZHJlc3MudS5kZXN0X2lkID0gZGVzdF9pZDsKLQltc2lfYWRkcmVzcy0+bG9fYWRkcmVzcy52YWx1ZSB8PSAoZGVzdF9waHlzX2lkIDw8IE1TSV9UQVJHRVRfQ1BVX1NISUZUKTsKLX0KLQogc3RhdGljIGludCBtc2lfZnJlZV92ZWN0b3Ioc3RydWN0IHBjaV9kZXYqIGRldiwgaW50IHZlY3RvciwgaW50IHJlYXNzaWduKTsKIHN0YXRpYyBpbnQgYXNzaWduX21zaV92ZWN0b3Iodm9pZCkKIHsKQEAgLTM2OSwxMyArMzU5LDI5IEBACiAJCXJldHVybiBzdGF0dXM7CiAJfQogCisJc3RhdHVzID0gbXNpX2FyY2hfaW5pdCgpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXBjaV9tc2lfZW5hYmxlID0gMDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlBDSTogTVNJIGFyY2ggaW5pdCBmYWlsZWQuICBNU0kgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlpZiAoISBtc2lfb3BzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJQQ0k6IE1TSSBvcHMgbm90IHJlZ2lzdGVyZWQuIE1TSSBkaXNhYmxlZC5cbiIpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCWxhc3RfYWxsb2NfdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOwogCXN0YXR1cyA9IG1zaV9jYWNoZV9pbml0KCk7CiAJaWYgKHN0YXR1cyA8IDApIHsKIAkJcGNpX21zaV9lbmFibGUgPSAwOwogCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0k6IE1TSSBjYWNoZSBpbml0IGZhaWxlZFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCWxhc3RfYWxsb2NfdmVjdG9yID0gYXNzaWduX2lycV92ZWN0b3IoQVVUT19BU1NJR04pOworCiAJaWYgKGxhc3RfYWxsb2NfdmVjdG9yIDwgMCkgewogCQlwY2lfbXNpX2VuYWJsZSA9IDA7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSTogTm8gaW50ZXJydXB0IHZlY3RvcnMgYXZhaWxhYmxlIGZvciBNU0lcbiIpOwpAQCAtNDQyLDkgKzQ0OCwxMSBAQAogCQkvKiBTZXQgZW5hYmxlZCBiaXRzIHRvIHNpbmdsZSBNU0kgJiBlbmFibGUgTVNJX2VuYWJsZSBiaXQgKi8KIAkJbXNpX2VuYWJsZShjb250cm9sLCAxKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbXNpX2NvbnRyb2xfcmVnKHBvcyksIGNvbnRyb2wpOworCQlkZXYtPm1zaV9lbmFibGVkID0gMTsKIAl9IGVsc2UgewogCQltc2l4X2VuYWJsZShjb250cm9sKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbXNpX2NvbnRyb2xfcmVnKHBvcyksIGNvbnRyb2wpOworCQlkZXYtPm1zaXhfZW5hYmxlZCA9IDE7CiAJfQogICAgIAlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKSkgewogCQkvKiBQQ0kgRXhwcmVzcyBFbmRwb2ludCBkZXZpY2UgZGV0ZWN0ZWQgKi8KQEAgLTQ2MSw5ICs0NjksMTEgQEAKIAkJLyogU2V0IGVuYWJsZWQgYml0cyB0byBzaW5nbGUgTVNJICYgZW5hYmxlIE1TSV9lbmFibGUgYml0ICovCiAJCW1zaV9kaXNhYmxlKGNvbnRyb2wpOwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBtc2lfY29udHJvbF9yZWcocG9zKSwgY29udHJvbCk7CisJCWRldi0+bXNpX2VuYWJsZWQgPSAwOwogCX0gZWxzZSB7CiAJCW1zaXhfZGlzYWJsZShjb250cm9sKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwgbXNpX2NvbnRyb2xfcmVnKHBvcyksIGNvbnRyb2wpOworCQlkZXYtPm1zaXhfZW5hYmxlZCA9IDA7CiAJfQogICAgIAlpZiAocGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfRVhQKSkgewogCQkvKiBQQ0kgRXhwcmVzcyBFbmRwb2ludCBkZXZpY2UgZGV0ZWN0ZWQgKi8KQEAgLTUzOCw3ICs1NDgsNiBAQAogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCBwb3MgKyBQQ0lfTVNJX0RBVEFfMzIsICZjYXBbaSsrXSk7CiAJaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX01BU0tCSVQpCiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHBvcyArIFBDSV9NU0lfTUFTS19CSVQsICZjYXBbaSsrXSk7Ci0JZGlzYWJsZV9tc2lfbW9kZShkZXYsIHBvcywgUENJX0NBUF9JRF9NU0kpOwogCXNhdmVfc3RhdGUtPmNhcF9uciA9IFBDSV9DQVBfSURfTVNJOwogCXBjaV9hZGRfc2F2ZWRfY2FwKGRldiwgc2F2ZV9zdGF0ZSk7CiAJcmV0dXJuIDA7CkBAIC01NzUsNiArNTg0LDggQEAKIGludCBwY2lfc2F2ZV9tc2l4X3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaW50IHBvczsKKwlpbnQgdGVtcDsKKwlpbnQgdmVjdG9yLCBoZWFkLCB0YWlsID0gMDsKIAl1MTYgY29udHJvbDsKIAlzdHJ1Y3QgcGNpX2NhcF9zYXZlZF9zdGF0ZSAqc2F2ZV9zdGF0ZTsKIApAQCAtNTgyLDYgKzU5Myw3IEBACiAJaWYgKHBvcyA8PSAwIHx8IGRldi0+bm9fbXNpKQogCQlyZXR1cm4gMDsKIAorCS8qIHNhdmUgdGhlIGNhcGFiaWxpdHkgKi8KIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1zaV9jb250cm9sX3JlZyhwb3MpLCAmY29udHJvbCk7CiAJaWYgKCEoY29udHJvbCAmIFBDSV9NU0lYX0ZMQUdTX0VOQUJMRSkpCiAJCXJldHVybiAwOwpAQCAtNTkzLDcgKzYwNSwzOCBAQAogCX0KIAkqKCh1MTYgKikmc2F2ZV9zdGF0ZS0+ZGF0YVswXSkgPSBjb250cm9sOwogCi0JZGlzYWJsZV9tc2lfbW9kZShkZXYsIHBvcywgUENJX0NBUF9JRF9NU0lYKTsKKwkvKiBzYXZlIHRoZSB0YWJsZSAqLworCXRlbXAgPSBkZXYtPmlycTsKKwlpZiAobXNpX2xvb2t1cF92ZWN0b3IoZGV2LCBQQ0lfQ0FQX0lEX01TSVgpKSB7CisJCWtmcmVlKHNhdmVfc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2ZWN0b3IgPSBoZWFkID0gZGV2LT5pcnE7CisJd2hpbGUgKGhlYWQgIT0gdGFpbCkgeworCQlpbnQgajsKKwkJdm9pZCBfX2lvbWVtICpiYXNlOworCQlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OworCisJCWVudHJ5ID0gbXNpX2Rlc2NbdmVjdG9yXTsKKwkJYmFzZSA9IGVudHJ5LT5tYXNrX2Jhc2U7CisJCWogPSBlbnRyeS0+bXNpX2F0dHJpYi5lbnRyeV9ucjsKKworCQllbnRyeS0+YWRkcmVzc19sb19zYXZlID0KKwkJCXJlYWRsKGJhc2UgKyBqICogUENJX01TSVhfRU5UUllfU0laRSArCisJCQkgICAgICBQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVCk7CisJCWVudHJ5LT5hZGRyZXNzX2hpX3NhdmUgPQorCQkJcmVhZGwoYmFzZSArIGogKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKKwkJCSAgICAgIFBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFJfT0ZGU0VUKTsKKwkJZW50cnktPmRhdGFfc2F2ZSA9CisJCQlyZWFkbChiYXNlICsgaiAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKworCQkJICAgICAgUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQpOworCisJCXRhaWwgPSBtc2lfZGVzY1t2ZWN0b3JdLT5saW5rLnRhaWw7CisJCXZlY3RvciA9IHRhaWw7CisJfQorCWRldi0+aXJxID0gdGVtcDsKKwogCXNhdmVfc3RhdGUtPmNhcF9uciA9IFBDSV9DQVBfSURfTVNJWDsKIAlwY2lfYWRkX3NhdmVkX2NhcChkZXYsIHNhdmVfc3RhdGUpOwogCXJldHVybiAwOwpAQCAtNjA2LDggKzY0OSw2IEBACiAJaW50IHZlY3RvciwgaGVhZCwgdGFpbCA9IDA7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCBqOwotCXN0cnVjdCBtc2dfYWRkcmVzcyBhZGRyZXNzOwotCXN0cnVjdCBtc2dfZGF0YSBkYXRhOwogCXN0cnVjdCBtc2lfZGVzYyAqZW50cnk7CiAJaW50IHRlbXA7CiAJc3RydWN0IHBjaV9jYXBfc2F2ZWRfc3RhdGUgKnNhdmVfc3RhdGU7CkBAIC02MzMsMjAgKzY3NCwxMyBAQAogCQliYXNlID0gZW50cnktPm1hc2tfYmFzZTsKIAkJaiA9IGVudHJ5LT5tc2lfYXR0cmliLmVudHJ5X25yOwogCi0JCW1zaV9hZGRyZXNzX2luaXQoJmFkZHJlc3MpOwotCQltc2lfZGF0YV9pbml0KCZkYXRhLCB2ZWN0b3IpOwotCi0JCWFkZHJlc3MubG9fYWRkcmVzcy52YWx1ZSAmPSBNU0lfQUREUkVTU19ERVNUX0lEX01BU0s7Ci0JCWFkZHJlc3MubG9fYWRkcmVzcy52YWx1ZSB8PSBlbnRyeS0+bXNpX2F0dHJpYi5jdXJyZW50X2NwdSA8PAotCQkJCQlNU0lfVEFSR0VUX0NQVV9TSElGVDsKLQotCQl3cml0ZWwoYWRkcmVzcy5sb19hZGRyZXNzLnZhbHVlLAorCQl3cml0ZWwoZW50cnktPmFkZHJlc3NfbG9fc2F2ZSwKIAkJCWJhc2UgKyBqICogUENJX01TSVhfRU5UUllfU0laRSArCiAJCQlQQ0lfTVNJWF9FTlRSWV9MT1dFUl9BRERSX09GRlNFVCk7Ci0JCXdyaXRlbChhZGRyZXNzLmhpX2FkZHJlc3MsCisJCXdyaXRlbChlbnRyeS0+YWRkcmVzc19oaV9zYXZlLAogCQkJYmFzZSArIGogKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKIAkJCVBDSV9NU0lYX0VOVFJZX1VQUEVSX0FERFJfT0ZGU0VUKTsKLQkJd3JpdGVsKCoodTMyKikmZGF0YSwKKwkJd3JpdGVsKGVudHJ5LT5kYXRhX3NhdmUsCiAJCQliYXNlICsgaiAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKwogCQkJUENJX01TSVhfRU5UUllfREFUQV9PRkZTRVQpOwogCkBAIC02NjAsMzAgKzY5NCwzMiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIG1zaV9yZWdpc3Rlcl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqZW50cnkpCitzdGF0aWMgaW50IG1zaV9yZWdpc3Rlcl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHN0cnVjdCBtc2lfZGVzYyAqZW50cnkpCiB7Ci0Jc3RydWN0IG1zZ19hZGRyZXNzIGFkZHJlc3M7Ci0Jc3RydWN0IG1zZ19kYXRhIGRhdGE7CisJaW50IHN0YXR1czsKKwl1MzIgYWRkcmVzc19oaTsKKwl1MzIgYWRkcmVzc19sbzsKKwl1MzIgZGF0YTsKIAlpbnQgcG9zLCB2ZWN0b3IgPSBkZXYtPmlycTsKIAl1MTYgY29udHJvbDsKIAogICAgCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSSk7CiAJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtc2lfY29udHJvbF9yZWcocG9zKSwgJmNvbnRyb2wpOworCiAJLyogQ29uZmlndXJlIE1TSSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwotCW1zaV9hZGRyZXNzX2luaXQoJmFkZHJlc3MpOwotCW1zaV9kYXRhX2luaXQoJmRhdGEsIHZlY3Rvcik7Ci0JZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPSAoKGFkZHJlc3MubG9fYWRkcmVzcy51LmRlc3RfaWQgPj4KLQkJCQlNU0lfVEFSR0VUX0NQVV9TSElGVCkgJiBNU0lfVEFSR0VUX0NQVV9NQVNLKTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgbXNpX2xvd2VyX2FkZHJlc3NfcmVnKHBvcyksCi0JCQlhZGRyZXNzLmxvX2FkZHJlc3MudmFsdWUpOworCXN0YXR1cyA9IG1zaV9vcHMtPnNldHVwKGRldiwgdmVjdG9yLCAmYWRkcmVzc19oaSwgJmFkZHJlc3NfbG8sICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBtc2lfbG93ZXJfYWRkcmVzc19yZWcocG9zKSwgYWRkcmVzc19sbyk7CiAJaWYgKGlzXzY0Yml0X2FkZHJlc3MoY29udHJvbCkpIHsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsCi0JCQltc2lfdXBwZXJfYWRkcmVzc19yZWcocG9zKSwgYWRkcmVzcy5oaV9hZGRyZXNzKTsKKwkJCW1zaV91cHBlcl9hZGRyZXNzX3JlZyhwb3MpLCBhZGRyZXNzX2hpKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGRldiwKLQkJCW1zaV9kYXRhX3JlZyhwb3MsIDEpLCAqKCh1MzIqKSZkYXRhKSk7CisJCQltc2lfZGF0YV9yZWcocG9zLCAxKSwgZGF0YSk7CiAJfSBlbHNlCiAJCXBjaV93cml0ZV9jb25maWdfd29yZChkZXYsCi0JCQltc2lfZGF0YV9yZWcocG9zLCAwKSwgKigodTMyKikmZGF0YSkpOworCQkJbXNpX2RhdGFfcmVnKHBvcywgMCksIGRhdGEpOwogCWlmIChlbnRyeS0+bXNpX2F0dHJpYi5tYXNrYml0KSB7CiAJCXVuc2lnbmVkIGludCBtYXNrYml0cywgdGVtcDsKIAkJLyogQWxsIE1TSXMgYXJlIHVubWFza2VkIGJ5IGRlZmF1bHQsIE1hc2sgdGhlbSBhbGwgKi8KQEAgLTY5Nyw2ICs3MzMsOCBAQAogCQkJbXNpX21hc2tfYml0c19yZWcocG9zLCBpc182NGJpdF9hZGRyZXNzKGNvbnRyb2wpKSwKIAkJCW1hc2tiaXRzKTsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC03MTAsNiArNzQ4LDcgQEAKICAqKi8KIHN0YXRpYyBpbnQgbXNpX2NhcGFiaWxpdHlfaW5pdChzdHJ1Y3QgcGNpX2RldiAqZGV2KQogeworCWludCBzdGF0dXM7CiAJc3RydWN0IG1zaV9kZXNjICplbnRyeTsKIAlpbnQgcG9zLCB2ZWN0b3I7CiAJdTE2IGNvbnRyb2w7CkBAIC03NDIsNyArNzgxLDEyIEBACiAJLyogUmVwbGFjZSB3aXRoIE1TSSBoYW5kbGVyICovCiAJaXJxX2hhbmRsZXJfaW5pdChQQ0lfQ0FQX0lEX01TSSwgdmVjdG9yLCBlbnRyeS0+bXNpX2F0dHJpYi5tYXNrYml0KTsKIAkvKiBDb25maWd1cmUgTVNJIGNhcGFiaWxpdHkgc3RydWN0dXJlICovCi0JbXNpX3JlZ2lzdGVyX2luaXQoZGV2LCBlbnRyeSk7CisJc3RhdHVzID0gbXNpX3JlZ2lzdGVyX2luaXQoZGV2LCBlbnRyeSk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldi0+aXJxID0gZW50cnktPm1zaV9hdHRyaWIuZGVmYXVsdF92ZWN0b3I7CisJCWttZW1fY2FjaGVfZnJlZShtc2lfY2FjaGVwLCBlbnRyeSk7CisJCXJldHVybiBzdGF0dXM7CisJfQogCiAJYXR0YWNoX21zaV9lbnRyeShlbnRyeSwgdmVjdG9yKTsKIAkvKiBTZXQgTVNJIGVuYWJsZWQgYml0cwkgKi8KQEAgLTc2NSw4ICs4MDksMTAgQEAKIAkJCQlzdHJ1Y3QgbXNpeF9lbnRyeSAqZW50cmllcywgaW50IG52ZWMpCiB7CiAJc3RydWN0IG1zaV9kZXNjICpoZWFkID0gTlVMTCwgKnRhaWwgPSBOVUxMLCAqZW50cnkgPSBOVUxMOwotCXN0cnVjdCBtc2dfYWRkcmVzcyBhZGRyZXNzOwotCXN0cnVjdCBtc2dfZGF0YSBkYXRhOworCXUzMiBhZGRyZXNzX2hpOworCXUzMiBhZGRyZXNzX2xvOworCXUzMiBkYXRhOworCWludCBzdGF0dXM7CiAJaW50IHZlY3RvciwgcG9zLCBpLCBqLCBucl9lbnRyaWVzLCB0ZW1wID0gMDsKIAl1bnNpZ25lZCBsb25nIHBoeXNfYWRkcjsKIAl1MzIgdGFibGVfb2Zmc2V0OwpAQCAtODIyLDE4ICs4NjgsMjAgQEAKIAkJLyogUmVwbGFjZSB3aXRoIE1TSS1YIGhhbmRsZXIgKi8KIAkJaXJxX2hhbmRsZXJfaW5pdChQQ0lfQ0FQX0lEX01TSVgsIHZlY3RvciwgMSk7CiAJCS8qIENvbmZpZ3VyZSBNU0ktWCBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwotCQltc2lfYWRkcmVzc19pbml0KCZhZGRyZXNzKTsKLQkJbXNpX2RhdGFfaW5pdCgmZGF0YSwgdmVjdG9yKTsKLQkJZW50cnktPm1zaV9hdHRyaWIuY3VycmVudF9jcHUgPQotCQkJKChhZGRyZXNzLmxvX2FkZHJlc3MudS5kZXN0X2lkID4+Ci0JCQlNU0lfVEFSR0VUX0NQVV9TSElGVCkgJiBNU0lfVEFSR0VUX0NQVV9NQVNLKTsKLQkJd3JpdGVsKGFkZHJlc3MubG9fYWRkcmVzcy52YWx1ZSwKKwkJc3RhdHVzID0gbXNpX29wcy0+c2V0dXAoZGV2LCB2ZWN0b3IsCisJCQkJCSZhZGRyZXNzX2hpLAorCQkJCQkmYWRkcmVzc19sbywKKwkJCQkJJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXdyaXRlbChhZGRyZXNzX2xvLAogCQkJYmFzZSArIGogKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKIAkJCVBDSV9NU0lYX0VOVFJZX0xPV0VSX0FERFJfT0ZGU0VUKTsKLQkJd3JpdGVsKGFkZHJlc3MuaGlfYWRkcmVzcywKKwkJd3JpdGVsKGFkZHJlc3NfaGksCiAJCQliYXNlICsgaiAqIFBDSV9NU0lYX0VOVFJZX1NJWkUgKwogCQkJUENJX01TSVhfRU5UUllfVVBQRVJfQUREUl9PRkZTRVQpOwotCQl3cml0ZWwoKih1MzIqKSZkYXRhLAorCQl3cml0ZWwoZGF0YSwKIAkJCWJhc2UgKyBqICogUENJX01TSVhfRU5UUllfU0laRSArCiAJCQlQQ0lfTVNJWF9FTlRSWV9EQVRBX09GRlNFVCk7CiAJCWF0dGFjaF9tc2lfZW50cnkoZW50cnksIHZlY3Rvcik7CkBAIC04NjUsNiArOTEzLDcgQEAKICAqKi8KIGludCBwY2lfZW5hYmxlX21zaShzdHJ1Y3QgcGNpX2RldiogZGV2KQogeworCXN0cnVjdCBwY2lfYnVzICpidXM7CiAJaW50IHBvcywgdGVtcCwgc3RhdHVzID0gLUVJTlZBTDsKIAl1MTYgY29udHJvbDsKIApAQCAtODc0LDggKzkyMyw5IEBACiAJaWYgKGRldi0+bm9fbXNpKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JaWYgKGRldi0+YnVzLT5idXNfZmxhZ3MgJiBQQ0lfQlVTX0ZMQUdTX05PX01TSSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJZm9yIChidXMgPSBkZXYtPmJ1czsgYnVzOyBidXMgPSBidXMtPnBhcmVudCkKKwkJaWYgKGJ1cy0+YnVzX2ZsYWdzICYgUENJX0JVU19GTEFHU19OT19NU0kpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAogCXRlbXAgPSBkZXYtPmlycTsKIApAQCAtODg3LDIzICs5MzcsMjMgQEAKIAlpZiAoIXBvcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1zaV9jb250cm9sX3JlZyhwb3MpLCAmY29udHJvbCk7Ci0JaWYgKGNvbnRyb2wgJiBQQ0lfTVNJX0ZMQUdTX0VOQUJMRSkKLQkJcmV0dXJuIDA7CQkJLyogQWxyZWFkeSBpbiBNU0kgbW9kZSAqLwotCiAJaWYgKCFtc2lfbG9va3VwX3ZlY3RvcihkZXYsIFBDSV9DQVBfSURfTVNJKSkgewogCQkvKiBMb29rdXAgU3VjZXNzICovCiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtc2lfY29udHJvbF9yZWcocG9zKSwgJmNvbnRyb2wpOworCQlpZiAoY29udHJvbCAmIFBDSV9NU0lfRkxBR1NfRU5BQkxFKQorCQkJcmV0dXJuIDA7CS8qIEFscmVhZHkgaW4gTVNJIG1vZGUgKi8KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm1zaV9sb2NrLCBmbGFncyk7CiAJCWlmICghdmVjdG9yX2lycVtkZXYtPmlycV0pIHsKIAkJCW1zaV9kZXNjW2Rldi0+aXJxXS0+bXNpX2F0dHJpYi5zdGF0ZSA9IDA7CiAJCQl2ZWN0b3JfaXJxW2Rldi0+aXJxXSA9IC0xOwogCQkJbnJfcmVsZWFzZWRfdmVjdG9ycy0tOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNpX2xvY2ssIGZsYWdzKTsKLQkJCW1zaV9yZWdpc3Rlcl9pbml0KGRldiwgbXNpX2Rlc2NbZGV2LT5pcnFdKTsKLQkJCWVuYWJsZV9tc2lfbW9kZShkZXYsIHBvcywgUENJX0NBUF9JRF9NU0kpOwotCQkJcmV0dXJuIDA7CisJCQlzdGF0dXMgPSBtc2lfcmVnaXN0ZXJfaW5pdChkZXYsIG1zaV9kZXNjW2Rldi0+aXJxXSk7CisJCQlpZiAoc3RhdHVzID09IDApCisJCQkJZW5hYmxlX21zaV9tb2RlKGRldiwgcG9zLCBQQ0lfQ0FQX0lEX01TSSk7CisJCQlyZXR1cm4gc3RhdHVzOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zaV9sb2NrLCBmbGFncyk7CiAJCWRldi0+aXJxID0gdGVtcDsKQEAgLTk4MCw2ICsxMDMwLDggQEAKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCW1zaV9vcHMtPnRlYXJkb3duKHZlY3Rvcik7CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXNpX2xvY2ssIGZsYWdzKTsKIAllbnRyeSA9IG1zaV9kZXNjW3ZlY3Rvcl07CiAJaWYgKCFlbnRyeSB8fCBlbnRyeS0+ZGV2ICE9IGRldikgewpAQCAtMTAwOCwzMyArMTA2MCw4IEBACiAJCQkJZW50cnlfbnIgKiBQQ0lfTVNJWF9FTlRSWV9TSVpFICsKIAkJCQlQQ0lfTVNJWF9FTlRSWV9WRUNUT1JfQ1RSTF9PRkZTRVQpOwogCi0JCWlmIChoZWFkID09IHZlY3RvcikgewotCQkJLyoKLQkJCSAqIERldGVjdCBsYXN0IE1TSS1YIHZlY3RvciB0byBiZSByZWxlYXNlZC4KLQkJCSAqIFJlbGVhc2UgdGhlIE1TSS1YIG1lbW9yeS1tYXBwZWQgdGFibGUuCi0JCQkgKi8KLSNpZiAwCi0JCQlpbnQgcG9zLCBucl9lbnRyaWVzOwotCQkJdW5zaWduZWQgbG9uZyBwaHlzX2FkZHI7Ci0JCQl1MzIgdGFibGVfb2Zmc2V0OwotCQkJdTE2IGNvbnRyb2w7Ci0JCQl1OCBiaXI7Ci0KLSAgIAkJCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSVgpOwotCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBtc2lfY29udHJvbF9yZWcocG9zKSwKLQkJCQkmY29udHJvbCk7Ci0JCQlucl9lbnRyaWVzID0gbXVsdGlfbXNpeF9jYXBhYmxlKGNvbnRyb2wpOwotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgbXNpeF90YWJsZV9vZmZzZXRfcmVnKHBvcyksCi0JCQkJJnRhYmxlX29mZnNldCk7Ci0JCQliaXIgPSAodTgpKHRhYmxlX29mZnNldCAmIFBDSV9NU0lYX0ZMQUdTX0JJUk1BU0spOwotCQkJdGFibGVfb2Zmc2V0ICY9IH5QQ0lfTVNJWF9GTEFHU19CSVJNQVNLOwotCQkJcGh5c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgYmlyKSArIHRhYmxlX29mZnNldDsKLS8qCi0gKiBGSVhNRSEgIGFuZCB3aGF0IGRpZCB5b3Ugd2FudCB0byBkbyB3aXRoIHBoeXNfYWRkcj8KLSAqLwotI2VuZGlmCisJCWlmIChoZWFkID09IHZlY3RvcikKIAkJCWlvdW5tYXAoYmFzZSk7Ci0JCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTExMDgsNiArMTEzNSw3IEBACiAgKiovCiBpbnQgcGNpX2VuYWJsZV9tc2l4KHN0cnVjdCBwY2lfZGV2KiBkZXYsIHN0cnVjdCBtc2l4X2VudHJ5ICplbnRyaWVzLCBpbnQgbnZlYykKIHsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCWludCBzdGF0dXMsIHBvcywgbnJfZW50cmllcywgZnJlZV92ZWN0b3JzOwogCWludCBpLCBqLCB0ZW1wOwogCXUxNiBjb250cm9sOwpAQCAtMTExNiw2ICsxMTQ0LDEzIEBACiAJaWYgKCFwY2lfbXNpX2VuYWJsZSB8fCAhZGV2IHx8ICFlbnRyaWVzKQogIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlpZiAoZGV2LT5ub19tc2kpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChidXMgPSBkZXYtPmJ1czsgYnVzOyBidXMgPSBidXMtPnBhcmVudCkKKwkJaWYgKGJ1cy0+YnVzX2ZsYWdzICYgUENJX0JVU19GTEFHU19OT19NU0kpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwogCXN0YXR1cyA9IG1zaV9pbml0KCk7CiAJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CkBAIC0xMzAwLDI0ICsxMzM1LDYgQEAKIAkJfQogCQltc2lfZnJlZV92ZWN0b3IoZGV2LCB2ZWN0b3IsIDApOwogCQlpZiAod2FybmluZykgewotCQkJLyogRm9yY2UgdG8gcmVsZWFzZSB0aGUgTVNJLVggbWVtb3J5LW1hcHBlZCB0YWJsZSAqLwotI2lmIDAKLQkJCXVuc2lnbmVkIGxvbmcgcGh5c19hZGRyOwotCQkJdTMyIHRhYmxlX29mZnNldDsKLQkJCXUxNiBjb250cm9sOwotCQkJdTggYmlyOwotCi0JCQlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIG1zaV9jb250cm9sX3JlZyhwb3MpLAotCQkJCSZjb250cm9sKTsKLQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIG1zaXhfdGFibGVfb2Zmc2V0X3JlZyhwb3MpLAotCQkJCSZ0YWJsZV9vZmZzZXQpOwotCQkJYmlyID0gKHU4KSh0YWJsZV9vZmZzZXQgJiBQQ0lfTVNJWF9GTEFHU19CSVJNQVNLKTsKLQkJCXRhYmxlX29mZnNldCAmPSB+UENJX01TSVhfRkxBR1NfQklSTUFTSzsKLQkJCXBoeXNfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJpcikgKyB0YWJsZV9vZmZzZXQ7Ci0vKgotICogRklYTUUhIGFuZCB3aGF0IGRpZCB5b3Ugd2FudCB0byBkbyB3aXRoIHBoeXNfYWRkcj8KLSAqLwotI2VuZGlmCiAJCQlpb3VubWFwKGJhc2UpOwogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiAlczogbXNpX3JlbW92ZV9wY2lfaXJxX3ZlY3RvcnMoKSAiCiAJCQkgICAgICAgImNhbGxlZCB3aXRob3V0IGZyZWVfaXJxKCkgb24gYWxsIE1TSS1YIHZlY3RvcnNcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9tc2kuaCBiL2RyaXZlcnMvcGNpL21zaS5oCmluZGV4IDRhYzUyZDQuLjU2OTUxYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL21zaS5oCisrKyBiL2RyaXZlcnMvcGNpL21zaS5oCkBAIC02LDYgKzYsNjggQEAKICNpZm5kZWYgTVNJX0gKICNkZWZpbmUgTVNJX0gKIAorLyoKKyAqIE1TSSBvcGVyYXRpb24gdmVjdG9yLiAgVXNlZCBieSB0aGUgbXNpIGNvcmUgY29kZSAoZHJpdmVycy9wY2kvbXNpLmMpCisgKiB0byBhYnN0cmFjdCBwbGF0Zm9ybS1zcGVjaWZpYyB0YXNrcyByZWxhdGluZyB0byBNU0kgYWRkcmVzcyBnZW5lcmF0aW9uCisgKiBhbmQgcmVzb3VyY2UgbWFuYWdlbWVudC4KKyAqLworc3RydWN0IG1zaV9vcHMgeworCS8qKgorCSAqIHNldHVwIC0gZ2VuZXJhdGUgYW4gTVNJIGJ1cyBhZGRyZXNzIGFuZCBkYXRhIGZvciBhIGdpdmVuIHZlY3RvcgorCSAqIEBwZGV2OiBQQ0kgZGV2aWNlIGNvbnRleHQgKGluKQorCSAqIEB2ZWN0b3I6IHZlY3RvciBhbGxvY2F0ZWQgYnkgdGhlIG1zaSBjb3JlIChpbikKKwkgKiBAYWRkcl9oaTogdXBwZXIgMzIgYml0cyBvZiBQQ0kgYnVzIE1TSSBhZGRyZXNzIChvdXQpCisJICogQGFkZHJfbG86IGxvd2VyIDMyIGJpdHMgb2YgUENJIGJ1cyBNU0kgYWRkcmVzcyAob3V0KQorCSAqIEBkYXRhOiBNU0kgZGF0YSBwYXlsb2FkIChvdXQpCisJICoKKwkgKiBEZXNjcmlwdGlvbjogVGhlIHNldHVwIG9wIGlzIHVzZWQgdG8gZ2VuZXJhdGUgYSBQQ0kgYnVzIGFkZHJlcyBhbmQKKwkgKiBkYXRhIHdoaWNoIHRoZSBtc2kgY29yZSB3aWxsIHByb2dyYW0gaW50byB0aGUgY2FyZCBNU0kgY2FwYWJpbGl0eQorCSAqIHJlZ2lzdGVycy4gIFRoZSBzZXR1cCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciBwaWNraW5nIGFuIGluaXRpYWwKKwkgKiBjcHUgdG8gdGFyZ2V0IHRoZSBNU0kgYXQuICBUaGUgc2V0dXAgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3IKKwkgKiBleGFtaW5pbmcgcGRldiB0byBkZXRlcm1pbmUgdGhlIE1TSSBjYXBhYmlsaXRpZXMgb2YgdGhlIGNhcmQgYW5kCisJICogZ2VuZXJhdGluZyBhIHN1aXRhYmxlIGFkZHJlc3MvZGF0YS4gIFRoZSBzZXR1cCByb3V0aW5lIGlzCisJICogcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgYW5kIHRyYWNraW5nIGFueSBzeXN0ZW0gcmVzb3VyY2VzIGl0CisJICogbmVlZHMgdG8gcm91dGUgdGhlIE1TSSB0byB0aGUgY3B1IGl0IHBpY2tzLCBhbmQgZm9yIGFzc29jaWF0aW5nCisJICogdGhvc2UgcmVzb3VyY2VzIHdpdGggdGhlIHBhc3NlZCBpbiB2ZWN0b3IuCisJICoKKwkgKiBSZXR1cm5zIDAgaWYgdGhlIE1TSSBhZGRyZXNzL2RhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzZXR1cC4KKwkgKiovCisKKwlpbnQJKCpzZXR1cCkgICAgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1bnNpZ25lZCBpbnQgdmVjdG9yLAorCQkJICAgICB1MzIgKmFkZHJfaGksIHUzMiAqYWRkcl9sbywgdTMyICpkYXRhKTsKKworCS8qKgorCSAqIHRlYXJkb3duIC0gcmVsZWFzZSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHNldHVwCisJICogQHZlY3RvcjogdmVjdG9yIGNvbnRleHQgZm9yIHJlc291cmNlcyAoaW4pCisJICoKKwkgKiBEZXNjcmlwdGlvbjogIFRoZSB0ZWFyZG93biBvcCBpcyB1c2VkIHRvIHJlbGVhc2UgYW55IHJlc291cmNlcworCSAqIHRoYXQgd2VyZSBhbGxvY2F0ZWQgaW4gdGhlIHNldHVwIHJvdXRpbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXNzZWQKKwkgKiBpbiB2ZWN0b3IuCisJICoqLworCisJdm9pZAkoKnRlYXJkb3duKSAodW5zaWduZWQgaW50IHZlY3Rvcik7CisKKwkvKioKKwkgKiB0YXJnZXQgLSByZXRhcmdldCBhbiBNU0kgYXQgYSBkaWZmZXJlbnQgY3B1CisJICogQHZlY3RvcjogdmVjdG9yIGNvbnRleHQgZm9yIHJlc291cmNlcyAoaW4pCisJICogQGNwdTogIG5ldyBjcHUgdG8gZGlyZWN0IHZlY3RvciBhdCAoaW4pCisJICogQGFkZHJfaGk6IG5ldyB2YWx1ZSBvZiBQQ0kgYnVzIHVwcGVyIDMyIGJpdHMgKGluL291dCkKKwkgKiBAYWRkcl9sbzogbmV3IHZhbHVlIG9mIFBDSSBidXMgbG93ZXIgMzIgYml0cyAoaW4vb3V0KQorCSAqCisJICogRGVzY3JpcHRpb246ICBUaGUgdGFyZ2V0IG9wIGlzIHVzZWQgdG8gcmVkaXJlY3QgYW4gTVNJIHZlY3RvcgorCSAqIGF0IGEgZGlmZmVyZW50IGNwdS4gIGFkZHJfaGkvYWRkcl9sbyBjb21pbmcgaW4gYXJlIHRoZSBleGlzdGluZworCSAqIHZhbHVlcyB0aGF0IHRoZSBNU0kgY29yZSBoYXMgcHJvZ3JhbW1lZCBpbnRvIHRoZSBjYXJkLiAgVGhlCisJICogdGFyZ2V0IGNvZGUgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgYW55IHJlc291cmNlcyAoaWYgYW55KQorCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgb2xkIGFkZHJlc3MsIGFuZCBnZW5lcmF0aW5nIGEgbmV3IFBDSSBidXMKKwkgKiBhZGRyX2hpL2FkZHJfbG8gdGhhdCB3aWxsIHJlZGlyZWN0IHRoZSB2ZWN0b3IgYXQgdGhlIGluZGljYXRlZCBjcHUuCisJICoqLworCisJdm9pZAkoKnRhcmdldCkgICAodW5zaWduZWQgaW50IHZlY3RvciwgdW5zaWduZWQgaW50IGNwdSwKKwkJCSAgICAgdTMyICphZGRyX2hpLCB1MzIgKmFkZHJfbG8pOworfTsKKworZXh0ZXJuIGludCBtc2lfcmVnaXN0ZXIoc3RydWN0IG1zaV9vcHMgKm9wcyk7CisKICNpbmNsdWRlIDxhc20vbXNpLmg+CiAKIC8qCkBAIC02Myw2NyArMTI1LDYgQEAKICNkZWZpbmUgbXNpeF9tYXNrKGFkZHJlc3MpCQkoYWRkcmVzcyB8IFBDSV9NU0lYX0ZMQUdTX0JJVE1BU0spCiAjZGVmaW5lIG1zaXhfaXNfcGVuZGluZyhhZGRyZXNzKSAJKGFkZHJlc3MgJiBQQ0lfTVNJWF9GTEFHU19QRU5ETUFTSykKIAotLyoKLSAqIE1TSSBEZWZpbmVkIERhdGEgU3RydWN0dXJlcwotICovCi0jZGVmaW5lIE1TSV9BRERSRVNTX0hFQURFUgkJMHhmZWUKLSNkZWZpbmUgTVNJX0FERFJFU1NfSEVBREVSX1NISUZUCTEyCi0jZGVmaW5lIE1TSV9BRERSRVNTX0hFQURFUl9NQVNLCQkweGZmZjAwMAotI2RlZmluZSBNU0lfQUREUkVTU19ERVNUX0lEX01BU0sJMHhmZmYwMDAwZgotI2RlZmluZSBNU0lfVEFSR0VUX0NQVV9NQVNLCQkweGZmCi0jZGVmaW5lIE1TSV9ERUxJVkVSWV9NT0RFCQkwCi0jZGVmaW5lIE1TSV9MRVZFTF9NT0RFCQkJMQkvKiBFZGdlIGFsd2F5cyBhc3NlcnQgKi8KLSNkZWZpbmUgTVNJX1RSSUdHRVJfTU9ERQkJMAkvKiBNU0kgaXMgZWRnZSBzZW5zaXRpdmUgKi8KLSNkZWZpbmUgTVNJX1BIWVNJQ0FMX01PREUJCTAKLSNkZWZpbmUgTVNJX0xPR0lDQUxfTU9ERQkJMQotI2RlZmluZSBNU0lfUkVESVJFQ1RJT05fSElOVF9NT0RFCTAKLQotc3RydWN0IG1zZ19kYXRhIHsKLSNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTl9CSVRGSUVMRCkKLQlfX3UzMgl2ZWN0b3IJCTogIDg7Ci0JX191MzIJZGVsaXZlcnlfbW9kZQk6ICAzOwkvKiAwMDBiOiBGSVhFRCB8IDAwMWI6IGxvd2VzdCBwcmlvciAqLwotCV9fdTMyCXJlc2VydmVkXzEJOiAgMzsKLQlfX3UzMglsZXZlbAkJOiAgMTsJLyogMDogZGVhc3NlcnQgfCAxOiBhc3NlcnQgKi8KLQlfX3UzMgl0cmlnZ2VyCQk6ICAxOwkvKiAwOiBlZGdlIHwgMTogbGV2ZWwgKi8KLQlfX3UzMglyZXNlcnZlZF8yCTogMTY7Ci0jZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTl9CSVRGSUVMRCkKLQlfX3UzMglyZXNlcnZlZF8yCTogMTY7Ci0JX191MzIJdHJpZ2dlcgkJOiAgMTsJLyogMDogZWRnZSB8IDE6IGxldmVsICovCi0JX191MzIJbGV2ZWwJCTogIDE7CS8qIDA6IGRlYXNzZXJ0IHwgMTogYXNzZXJ0ICovCi0JX191MzIJcmVzZXJ2ZWRfMQk6ICAzOwotCV9fdTMyCWRlbGl2ZXJ5X21vZGUJOiAgMzsJLyogMDAwYjogRklYRUQgfCAwMDFiOiBsb3dlc3QgcHJpb3IgKi8KLQlfX3UzMgl2ZWN0b3IJCTogIDg7Ci0jZWxzZQotI2Vycm9yICJCaXRmaWVsZCBlbmRpYW5uZXNzIG5vdCBkZWZpbmVkISBDaGVjayB5b3VyIGJ5dGVvcmRlci5oIgotI2VuZGlmCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IG1zZ19hZGRyZXNzIHsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0jaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fQklURklFTEQpCi0JCQlfX3UzMglyZXNlcnZlZF8xCTogIDI7Ci0JCQlfX3UzMglkZXN0X21vZGUJOiAgMTsJLyowOnBoeXNpYyB8IDE6bG9naWMgKi8KLQkJCV9fdTMyCXJlZGlyZWN0aW9uX2hpbnQ6ICAxOyAgCS8qMDogZGVkaWNhdGVkIENQVQotCQkJCQkJCSAgMTogbG93ZXN0IHByaW9yaXR5ICovCi0JCQlfX3UzMglyZXNlcnZlZF8yCTogIDQ7Ci0gCQkJX191MzIJZGVzdF9pZAkJOiAyNDsJLyogRGVzdGluYXRpb24gSUQgKi8KLSNlbGlmIGRlZmluZWQoX19CSUdfRU5ESUFOX0JJVEZJRUxEKQotIAkJCV9fdTMyCWRlc3RfaWQJCTogMjQ7CS8qIERlc3RpbmF0aW9uIElEICovCi0JCQlfX3UzMglyZXNlcnZlZF8yCTogIDQ7Ci0JCQlfX3UzMglyZWRpcmVjdGlvbl9oaW50OiAgMTsgIAkvKjA6IGRlZGljYXRlZCBDUFUKLQkJCQkJCQkgIDE6IGxvd2VzdCBwcmlvcml0eSAqLwotCQkJX191MzIJZGVzdF9tb2RlCTogIDE7CS8qMDpwaHlzaWMgfCAxOmxvZ2ljICovCi0JCQlfX3UzMglyZXNlcnZlZF8xCTogIDI7Ci0jZWxzZQotI2Vycm9yICJCaXRmaWVsZCBlbmRpYW5uZXNzIG5vdCBkZWZpbmVkISBDaGVjayB5b3VyIGJ5dGVvcmRlci5oIgotI2VuZGlmCi0gICAgICAJCX11OwotICAgICAgIAkJX191MzIgIHZhbHVlOwotCX1sb19hZGRyZXNzOwotCV9fdTMyIAloaV9hZGRyZXNzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KIHN0cnVjdCBtc2lfZGVzYyB7CiAJc3RydWN0IHsKIAkJX191OAl0eXBlCTogNTsgCS8qIHswOiB1bnVzZWQsIDVoOk1TSSwgMTFoOk1TSS1YfSAqLwpAQCAtMTMyLDcgKzEzMyw3IEBACiAJCV9fdTgJcmVzZXJ2ZWQ6IDE7IAkvKiByZXNlcnZlZAkJCSAgKi8KIAkJX191OAllbnRyeV9ucjsgICAgCS8qIHNwZWNpZmljIGVuYWJsZWQgZW50cnkgCSAgKi8KIAkJX191OAlkZWZhdWx0X3ZlY3RvcjsgLyogZGVmYXVsdCBwcmUtYXNzaWduZWQgdmVjdG9yICAgICovCi0JCV9fdTgJY3VycmVudF9jcHU7IAkvKiBjdXJyZW50IGRlc3RpbmF0aW9uIGNwdQkgICovCisJCV9fdTgJdW51c2VkOyAJLyogZm9ybWVybHkgdW51c2VkIGRlc3RpbmF0aW9uIGNwdSovCiAJfW1zaV9hdHRyaWI7CiAKIAlzdHJ1Y3QgewpAQCAtMTQyLDYgKzE0MywxNCBAQAogCiAJdm9pZCBfX2lvbWVtICptYXNrX2Jhc2U7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKKworI2lmZGVmIENPTkZJR19QTQorCS8qIFBNIHNhdmUgYXJlYSBmb3IgTVNJWCBhZGRyZXNzL2RhdGEgKi8KKworCXUzMglhZGRyZXNzX2hpX3NhdmU7CisJdTMyCWFkZHJlc3NfbG9fc2F2ZTsKKwl1MzIJZGF0YV9zYXZlOworI2VuZGlmCiB9OwogCiAjZW5kaWYgLyogTVNJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMgYi9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCmluZGV4IGMyZWNhZTUuLmJiNzQ1NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAKIAogLyogQUNQSSBidXMgdHlwZSAqLwotc3RhdGljIGludCBwY2lfYWNwaV9maW5kX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICpoYW5kbGUpCitzdGF0aWMgaW50IGFjcGlfcGNpX2ZpbmRfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKmhhbmRsZSkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqIHBjaV9kZXY7CiAJYWNwaV9pbnRlZ2VyCWFkZHI7CkBAIC0yODEsNyArMjgxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwY2lfYWNwaV9maW5kX3Jvb3RfYnJpZGdlKHN0cnVjdCBkZXZpY2UgKmRldiwgYWNwaV9oYW5kbGUgKmhhbmRsZSkKK3N0YXRpYyBpbnQgYWNwaV9wY2lfZmluZF9yb290X2JyaWRnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGFjcGlfaGFuZGxlICpoYW5kbGUpCiB7CiAJaW50IG51bTsKIAl1bnNpZ25lZCBpbnQgc2VnLCBidXM7CkBAIC0yOTksMjEgKzI5OSwyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGFjcGlfYnVzX3R5cGUgcGNpX2FjcGlfYnVzID0geworc3RhdGljIHN0cnVjdCBhY3BpX2J1c190eXBlIGFjcGlfcGNpX2J1cyA9IHsKIAkuYnVzID0gJnBjaV9idXNfdHlwZSwKLQkuZmluZF9kZXZpY2UgPSBwY2lfYWNwaV9maW5kX2RldmljZSwKLQkuZmluZF9icmlkZ2UgPSBwY2lfYWNwaV9maW5kX3Jvb3RfYnJpZGdlLAorCS5maW5kX2RldmljZSA9IGFjcGlfcGNpX2ZpbmRfZGV2aWNlLAorCS5maW5kX2JyaWRnZSA9IGFjcGlfcGNpX2ZpbmRfcm9vdF9icmlkZ2UsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwY2lfYWNwaV9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBhY3BpX3BjaV9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJlZ2lzdGVyX2FjcGlfYnVzX3R5cGUoJnBjaV9hY3BpX2J1cyk7CisJcmV0ID0gcmVnaXN0ZXJfYWNwaV9idXNfdHlwZSgmYWNwaV9wY2lfYnVzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gMDsKIAlwbGF0Zm9ybV9wY2lfY2hvb3NlX3N0YXRlID0gYWNwaV9wY2lfY2hvb3NlX3N0YXRlOwogCXBsYXRmb3JtX3BjaV9zZXRfcG93ZXJfc3RhdGUgPSBhY3BpX3BjaV9zZXRfcG93ZXJfc3RhdGU7CiAJcmV0dXJuIDA7CiB9Ci1hcmNoX2luaXRjYWxsKHBjaV9hY3BpX2luaXQpOworYXJjaF9pbml0Y2FsbChhY3BpX3BjaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1zeXNmcy5jIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKaW5kZXggNTZhYzJiYy4uYmM0MDVjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLXN5c2ZzLmMKQEAgLTQzLDYgKzQzLDI5IEBACiBwY2lfY29uZmlnX2F0dHIoc3Vic3lzdGVtX2RldmljZSwgIjB4JTA0eFxuIik7CiBwY2lfY29uZmlnX2F0dHIoY2xhc3MsICIweCUwNnhcbiIpOwogcGNpX2NvbmZpZ19hdHRyKGlycSwgIiV1XG4iKTsKK3BjaV9jb25maWdfYXR0cihpc19lbmFibGVkLCAiJXVcbiIpOworCitzdGF0aWMgc3NpemVfdCBicm9rZW5fcGFyaXR5X3N0YXR1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOworCXJldHVybiBzcHJpbnRmIChidWYsICIldVxuIiwgcGRldi0+YnJva2VuX3Bhcml0eV9zdGF0dXMpOworfQorCitzdGF0aWMgc3NpemVfdCBicm9rZW5fcGFyaXR5X3N0YXR1c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3NpemVfdCBjb25zdW1lZCA9IC1FSU5WQUw7CisKKwlpZiAoKGNvdW50ID4gMCkgJiYgKCpidWYgPT0gJzAnIHx8ICpidWYgPT0gJzEnKSkgeworCQlwZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cyA9ICpidWYgPT0gJzEnID8gMSA6IDA7CisJCWNvbnN1bWVkID0gY291bnQ7CisJfQorCXJldHVybiBjb25zdW1lZDsKK30KIAogc3RhdGljIHNzaXplX3QgbG9jYWxfY3B1c19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC05MCw2ICsxMTMsMjUgQEAKIAkJICAgICAgICh1OCkocGNpX2Rldi0+Y2xhc3MgPj4gMTYpLCAodTgpKHBjaV9kZXYtPmNsYXNzID4+IDgpLAogCQkgICAgICAgKHU4KShwY2lfZGV2LT5jbGFzcykpOwogfQorc3RhdGljIHNzaXplX3QKK2lzX2VuYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisKKwkvKiB0aGlzIGNhbiBjcmFzaCB0aGUgbWFjaGluZSB3aGVuIGRvbmUgb24gdGhlICJ3cm9uZyIgZGV2aWNlICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gY291bnQ7CisKKwlpZiAoKmJ1ZiA9PSAnMCcpCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKworCWlmICgqYnVmID09ICcxJykKKwkJcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIAogc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgcGNpX2Rldl9hdHRyc1tdID0gewogCV9fQVRUUl9STyhyZXNvdXJjZSksCkBAIC0xMDEsNiArMTQzLDkgQEAKIAlfX0FUVFJfUk8oaXJxKSwKIAlfX0FUVFJfUk8obG9jYWxfY3B1cyksCiAJX19BVFRSX1JPKG1vZGFsaWFzKSwKKwlfX0FUVFIoZW5hYmxlLCAwNjAwLCBpc19lbmFibGVkX3Nob3csIGlzX2VuYWJsZWRfc3RvcmUpLAorCV9fQVRUUihicm9rZW5fcGFyaXR5X3N0YXR1cywoU19JUlVHT3xTX0lXVVNSKSwKKwkJYnJva2VuX3Bhcml0eV9zdGF0dXNfc2hvdyxicm9rZW5fcGFyaXR5X3N0YXR1c19zdG9yZSksCiAJX19BVFRSX05VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IGZkZTQxY2MuLmQ0MDhhM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC01MTcsNyArNTE3LDEyIEBACiBpbnQKIHBjaV9lbmFibGVfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7Ci0JaW50IGVyciA9IHBjaV9lbmFibGVfZGV2aWNlX2JhcnMoZGV2LCAoMSA8PCBQQ0lfTlVNX1JFU09VUkNFUykgLSAxKTsKKwlpbnQgZXJyOworCisJaWYgKGRldi0+aXNfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwllcnIgPSBwY2lfZW5hYmxlX2RldmljZV9iYXJzKGRldiwgKDEgPDwgUENJX05VTV9SRVNPVVJDRVMpIC0gMSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlwY2lfZml4dXBfZGV2aWNlKHBjaV9maXh1cF9lbmFibGUsIGRldik7CkBAIC01NDYsNyArNTUxLDE0IEBACiBwY2lfZGlzYWJsZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1MTYgcGNpX2NvbW1hbmQ7Ci0JCisKKwlpZiAoZGV2LT5tc2lfZW5hYmxlZCkKKwkJZGlzYWJsZV9tc2lfbW9kZShkZXYsIHBjaV9maW5kX2NhcGFiaWxpdHkoZGV2LCBQQ0lfQ0FQX0lEX01TSSksCisJCQlQQ0lfQ0FQX0lEX01TSSk7CisJaWYgKGRldi0+bXNpeF9lbmFibGVkKQorCQlkaXNhYmxlX21zaV9tb2RlKGRldiwgcGNpX2ZpbmRfY2FwYWJpbGl0eShkZXYsIFBDSV9DQVBfSURfTVNJKSwKKwkJCVBDSV9DQVBfSURfTVNJWCk7CisKIAlwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NvbW1hbmQpOwogCWlmIChwY2lfY29tbWFuZCAmIFBDSV9DT01NQU5EX01BU1RFUikgewogCQlwY2lfY29tbWFuZCAmPSB+UENJX0NPTU1BTkRfTUFTVEVSOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmggYi9kcml2ZXJzL3BjaS9wY2kuaAppbmRleCAzMDYzMGNiLi4yOWJkZWNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuaAorKysgYi9kcml2ZXJzL3BjaS9wY2kuaApAQCAtNDAsNyArNDAsNyBAQAogZXh0ZXJuIHZvaWQgcGNpX3JlbW92ZV9sZWdhY3lfZmlsZXMoc3RydWN0IHBjaV9idXMgKmJ1cyk7CiAKIC8qIExvY2sgZm9yIHJlYWQvd3JpdGUgYWNjZXNzIHRvIHBjaSBkZXZpY2UgYW5kIGJ1cyBsaXN0cyAqLwotZXh0ZXJuIHNwaW5sb2NrX3QgcGNpX2J1c19sb2NrOworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgcGNpX2J1c19zZW07CiAKICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIGV4dGVybiBpbnQgcGNpX21zaV9xdWlyazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCmluZGV4IGExMGVkOWQuLmY4OWRiYzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3Byb2JlLmMKKysrIGIvZHJpdmVycy9wY2kvcHJvYmUuYwpAQCAtMTgwLDI1ICsxODAsMzEgQEAKIAkJcmVzLT5mbGFncyB8PSBwY2lfY2FsY19yZXNvdXJjZV9mbGFncyhsKTsKIAkJaWYgKChsICYgKFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UgfCBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spKQogCQkgICAgPT0gKFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfTUVNT1JZIHwgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkpIHsKLQkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZys0LCAmbCk7CisJCQl1MzIgc3poaSwgbGhpOworCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnKzQsICZsaGkpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZys0LCB+MCk7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCByZWcrNCwgJnN6aGkpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZys0LCBsaGkpOworCQkJc3poaSA9IHBjaV9zaXplKGxoaSwgc3poaSwgMHhmZmZmZmZmZik7CiAJCQluZXh0Kys7CiAjaWYgQklUU19QRVJfTE9ORyA9PSA2NAotCQkJcmVzLT5zdGFydCB8PSAoKHVuc2lnbmVkIGxvbmcpIGwpIDw8IDMyOworCQkJcmVzLT5zdGFydCB8PSAoKHVuc2lnbmVkIGxvbmcpIGxoaSkgPDwgMzI7CiAJCQlyZXMtPmVuZCA9IHJlcy0+c3RhcnQgKyBzejsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcrNCwgfjApOwotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgcmVnKzQsICZzeik7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcmVnKzQsIGwpOwotCQkJc3ogPSBwY2lfc2l6ZShsLCBzeiwgMHhmZmZmZmZmZik7Ci0JCQlpZiAoc3opIHsKKwkJCWlmIChzemhpKSB7CiAJCQkJLyogVGhpcyBCQVIgbmVlZHMgPiA0R0I/ICBXb3cuICovCi0JCQkJcmVzLT5lbmQgfD0gKHVuc2lnbmVkIGxvbmcpc3o8PDMyOworCQkJCXJlcy0+ZW5kIHw9ICh1bnNpZ25lZCBsb25nKXN6aGk8PDMyOwogCQkJfQogI2Vsc2UKLQkJCWlmIChsKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0k6IFVuYWJsZSB0byBoYW5kbGUgNjQtYml0IGFkZHJlc3MgZm9yIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CisJCQlpZiAoc3poaSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiUENJOiBVbmFibGUgdG8gaGFuZGxlIDY0LWJpdCBCQVIgZm9yIGRldmljZSAlc1xuIiwgcGNpX25hbWUoZGV2KSk7CiAJCQkJcmVzLT5zdGFydCA9IDA7CiAJCQkJcmVzLT5mbGFncyA9IDA7Ci0JCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGxoaSkgeworCQkJCS8qIDY0LWJpdCB3aWRlIGFkZHJlc3MsIHRyZWF0IGFzIGRpc2FibGVkICovCisJCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZywgbCAmIH4odTMyKVBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0spOworCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCByZWcrNCwgMCk7CisJCQkJcmVzLT5zdGFydCA9IDA7CisJCQkJcmVzLT5lbmQgPSBzejsKIAkJCX0KICNlbmRpZgogCQl9CkBAIC0zNzcsOSArMzgzLDkgQEAKIAogCWNoaWxkID0gcGNpX2FsbG9jX2NoaWxkX2J1cyhwYXJlbnQsIGRldiwgYnVzbnIpOwogCWlmIChjaGlsZCkgewotCQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJCWRvd25fd3JpdGUoJnBjaV9idXNfc2VtKTsKIAkJbGlzdF9hZGRfdGFpbCgmY2hpbGQtPm5vZGUsICZwYXJlbnQtPmNoaWxkcmVuKTsKLQkJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJfQogCXJldHVybiBjaGlsZDsKIH0KQEAgLTgzOCw5ICs4NDQsOSBAQAogCSAqIGFuZCB0aGUgYnVzIGxpc3QgZm9yIGZpeHVwIGZ1bmN0aW9ucywgZXRjLgogCSAqLwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmdsb2JhbF9saXN0KTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl93cml0ZSgmcGNpX2J1c19zZW0pOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+YnVzX2xpc3QsICZidXMtPmRldmljZXMpOwotCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiB9CiAKIHN0cnVjdCBwY2lfZGV2ICogX19kZXZpbml0CkBAIC05NzUsOSArOTgxLDEwIEBACiAJCXByX2RlYnVnKCJQQ0k6IEJ1cyAlMDR4OiUwMnggYWxyZWFkeSBrbm93blxuIiwgcGNpX2RvbWFpbl9ucihiKSwgYnVzKTsKIAkJZ290byBlcnJfb3V0OwogCX0KLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJbGlzdF9hZGRfdGFpbCgmYi0+bm9kZSwgJnBjaV9yb290X2J1c2VzKTsKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF93cml0ZSgmcGNpX2J1c19zZW0pOwogCiAJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKIAlkZXYtPnBhcmVudCA9IHBhcmVudDsKQEAgLTEwMTcsOSArMTAyNCw5IEBACiBjbGFzc19kZXZfcmVnX2VycjoKIAlkZXZpY2VfdW5yZWdpc3RlcihkZXYpOwogZGV2X3JlZ19lcnI6Ci0Jc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCWRvd25fd3JpdGUoJnBjaV9idXNfc2VtKTsKIAlsaXN0X2RlbCgmYi0+bm9kZSk7Ci0Jc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJdXBfd3JpdGUoJnBjaV9idXNfc2VtKTsKIGVycl9vdXQ6CiAJa2ZyZWUoZGV2KTsKIAlrZnJlZShiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggZDM3ODQ3OC4uNDM2NGQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcXVpcmtzLmMKKysrIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKQEAgLTI0LDYgKzI0LDE3IEBACiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgInBjaS5oIgogCisvKiBUaGUgTWVsbGFub3ggVGF2b3IgZGV2aWNlIGdpdmVzIGZhbHNlIHBvc2l0aXZlIHBhcml0eSBlcnJvcnMKKyAqIE1hcmsgdGhpcyBkZXZpY2Ugd2l0aCBhIGJyb2tlbl9wYXJpdHlfc3RhdHVzLCB0byBhbGxvdworICogUENJIHNjYW5uaW5nIGNvZGUgdG8gInNraXAiIHRoaXMgbm93IGJsYWNrbGlzdGVkIGRldmljZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHF1aXJrX21lbGxhbm94X3Rhdm9yKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJZGV2LT5icm9rZW5fcGFyaXR5X3N0YXR1cyA9IDE7CS8qIFRoaXMgZGV2aWNlIGdpdmVzIGZhbHNlIHBvc2l0aXZlcyAqLworfQorREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9NRUxMQU5PWCxQQ0lfREVWSUNFX0lEX01FTExBTk9YX1RBVk9SLHF1aXJrX21lbGxhbm94X3Rhdm9yKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfTUVMTEFOT1gsUENJX0RFVklDRV9JRF9NRUxMQU5PWF9UQVZPUl9CUklER0UscXVpcmtfbWVsbGFub3hfdGF2b3IpOworCiAvKiBEZWFsIHdpdGggYnJva2VuIEJJT1MnZXMgdGhhdCBuZWdsZWN0IHRvIGVuYWJsZSBwYXNzaXZlIHJlbGVhc2UsCiAgICB3aGljaCBjYW4gY2F1c2UgcHJvYmxlbXMgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgODI0NDFGWC9QUHJvIE1UUlJzICovCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcXVpcmtfcGFzc2l2ZV9yZWxlYXNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC04NzgsMjcgKzg4OSwzMCBAQAogICogd2hlbiBhIFBDSS1Tb3VuZGNhcmQgaXMgYWRkZWQuIFRoZSBCSU9TIG9ubHkgZ2l2ZXMgT3B0aW9ucwogICogIkRpc2FibGVkIiBhbmQgIkFVVE8iLiBUaGlzIFF1aXJrIFNldHMgdGhlIGNvcnJlc3BvbmRpbmcKICAqIFJlZ2lzdGVyLVZhbHVlIHRvIGVuYWJsZSB0aGUgU291bmRjYXJkLgorICoKKyAqIEZJWE1FOiBQcmVzZW50bHkgdGhpcyBxdWlyayB3aWxsIHJ1biBvbiBhbnl0aGluZyB0aGF0IGhhcyBhbiA4MjM3CisgKiB3aGljaCBpc24ndCBjb3JyZWN0LCB3ZSBuZWVkIHRvIGNoZWNrIERNSSB0YWJsZXMgb3Igc29tZXRoaW5nIGluCisgKiBvcmRlciB0byBtYWtlIHN1cmUgaXQgb25seSBydW5zIG9uIHRoZSBNU0ktSzhULU5lbzJGaXIuICBCZWNhdXNlIGl0CisgKiBydW5zIGV2ZXJ5d2hlcmUgYXQgcHJlc2VudCB3ZSBzdXBwcmVzcyB0aGUgcHJpbnRrIG91dHB1dCBpbiBtb3N0CisgKiBpcnJlbGV2YW50IGNhc2VzLgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgazh0X3NvdW5kX2hvc3RicmlkZ2Uoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIAotCXByaW50ayhLRVJOX0lORk8gIlBDSTogUXVpcmstTVNJLUs4VCBTb3VuZGNhcmQgT25cbiIpOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgJnZhbCk7CiAJaWYgKHZhbCA9PSAweDg4IHx8IHZhbCA9PSAweGM4KSB7CisJCS8qIEFzc3VtZSBpdCdzIHByb2JhYmx5IGEgTVNJLUs4VC1OZW8yRmlyICovCisJCXByaW50ayhLRVJOX0lORk8gIlBDSTogTVNJLUs4VC1OZW8yRmlyLCBhdHRlbXB0aW5nIHRvIHR1cm4gc291bmRjYXJkIE9OXG4iKTsKIAkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGRldiwgMHg1MCwgdmFsICYgKH4weDQwKSk7CiAKIAkJLyogVmVyaWZ5IHRoZSBDaGFuZ2UgZm9yIFN0YXR1cyBvdXRwdXQgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweDUwLCAmdmFsKTsKIAkJaWYgKHZhbCAmIDB4NDApCi0JCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IE1TSS1LOFQgc291bmRjYXJkIHN0aWxsIG9mZlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IE1TSS1LOFQtTmVvMkZpciwgc291bmRjYXJkIHN0aWxsIG9mZlxuIik7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX0lORk8gIlBDSTogTVNJLUs4VCBzb3VuZGNhcmQgb25cbiIpOwotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlBDSTogVW5leHBlY3RlZCBWYWx1ZSBpbiBQQ0ktUmVnaXN0ZXI6ICIKLQkJCQkJIm5vIENoYW5nZSFcbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiUENJOiBNU0ktSzhULU5lbzJGaXIsIHNvdW5kY2FyZCBvblxuIik7CiAJfQotCiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyMzcsIGs4dF9zb3VuZF9ob3N0YnJpZGdlKTsKIApAQCAtMTQ4NSw2ICsxNDk5LDI1IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9JTlRFTCwJMHgxNDYwLAkJcXVpcmtfcDY0aDJfMWtfaW8pOwogCisvKiBVbmRlciBzb21lIGNpcmN1bXN0YW5jZXMsIEFFUiBpcyBub3QgbGlua2VkIHdpdGggZXh0ZW5kZWQgY2FwYWJpbGl0aWVzLgorICogRm9yY2UgaXQgdG8gYmUgbGlua2VkIGJ5IHNldHRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbCBiaXQgaW4gdGhlCisgKiBjb25maWcgc3BhY2UuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19udmlkaWFfY2s4MDRfcGNpZV9hZXJfZXh0X2NhcChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXVpbnQ4X3QgYjsKKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGY0MSwgJmIpID09IDApIHsKKwkJaWYgKCEoYiAmIDB4MjApKSB7CisJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGY0MSwgYiB8IDB4MjApOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJQQ0k6IExpbmtpbmcgQUVSIGV4dGVuZGVkIGNhcGFiaWxpdHkgb24gJXNcbiIsCisJCQkgICAgICAgcGNpX25hbWUoZGV2KSk7CisJCX0KKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX05WSURJQSwgIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLODA0X1BDSUUsCisJCQlxdWlya19udmlkaWFfY2s4MDRfcGNpZV9hZXJfZXh0X2NhcCk7CisKIEVYUE9SVF9TWU1CT0wocGNpZV9tY2hfcXVpcmspOwogI2lmZGVmIENPTkZJR19IT1RQTFVHCiBFWFBPUlRfU1lNQk9MKHBjaV9maXh1cF9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCAxYTZiZjlkLi45OWZmYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yZW1vdmUuYworKysgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwpAQCAtMjIsMTggKzIyLDE4IEBACiAJCXBjaV9wcm9jX2RldGFjaF9kZXZpY2UoZGV2KTsKIAkJcGNpX3JlbW92ZV9zeXNmc19kZXZfZmlsZXMoZGV2KTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKLQkJc3Bpbl9sb2NrKCZwY2lfYnVzX2xvY2spOworCQlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKIAkJZGV2LT5nbG9iYWxfbGlzdC5uZXh0ID0gZGV2LT5nbG9iYWxfbGlzdC5wcmV2ID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJfQogCiAJLyogUmVtb3ZlIHRoZSBkZXZpY2UgZnJvbSB0aGUgZGV2aWNlIGxpc3RzLCBhbmQgcHJldmVudCBhbnkgZnVydGhlcgogCSAqIGxpc3QgYWNjZXNzZXMgZnJvbSB0aGlzIGRldmljZSAqLwotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJbGlzdF9kZWwoJmRldi0+YnVzX2xpc3QpOwogCWRldi0+YnVzX2xpc3QubmV4dCA9IGRldi0+YnVzX2xpc3QucHJldiA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJdXBfd3JpdGUoJnBjaV9idXNfc2VtKTsKIAogCXBjaV9mcmVlX3Jlc291cmNlcyhkZXYpOwogCXBjaV9kZXZfcHV0KGRldik7CkBAIC02Miw5ICs2Miw5IEBACiB7CiAJcGNpX3Byb2NfZGV0YWNoX2J1cyhwY2lfYnVzKTsKIAotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJbGlzdF9kZWwoJnBjaV9idXMtPm5vZGUpOwotCXNwaW5fdW5sb2NrKCZwY2lfYnVzX2xvY2spOworCXVwX3dyaXRlKCZwY2lfYnVzX3NlbSk7CiAJcGNpX3JlbW92ZV9sZWdhY3lfZmlsZXMocGNpX2J1cyk7CiAJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZwY2lfYnVzLT5jbGFzc19kZXYsCiAJCSZjbGFzc19kZXZpY2VfYXR0cl9jcHVhZmZpbml0eSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZWFyY2guYyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCmluZGV4IGNlN2RkNmUuLjYyMmIzZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NlYXJjaC5jCisrKyBiL2RyaXZlcnMvcGNpL3NlYXJjaC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKLURFRklORV9TUElOTE9DSyhwY2lfYnVzX2xvY2spOworREVDTEFSRV9SV1NFTShwY2lfYnVzX3NlbSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2J1cyAqIF9fZGV2aW5pdAogcGNpX2RvX2ZpbmRfYnVzKHN0cnVjdCBwY2lfYnVzKiBidXMsIHVuc2lnbmVkIGNoYXIgYnVzbnIpCkBAIC03MiwxMSArNzIsMTEgQEAKIAlzdHJ1Y3QgcGNpX2J1cyAqYiA9IE5VTEw7CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5ub2RlLm5leHQgOiBwY2lfcm9vdF9idXNlcy5uZXh0OwogCWlmIChuICE9ICZwY2lfcm9vdF9idXNlcykKIAkJYiA9IHBjaV9idXNfYihuKTsKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcmV0dXJuIGI7CiB9CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAKIAlsaXN0X2Zvcl9lYWNoKHRtcCwgJmJ1cy0+ZGV2aWNlcykgewogCQlkZXYgPSBwY2lfZGV2X2IodG1wKTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCWRldiA9IE5VTEw7CiAgb3V0OgogCXBjaV9kZXZfZ2V0KGRldik7Ci0Jc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CisJdXBfcmVhZCgmcGNpX2J1c19zZW0pOwogCXJldHVybiBkZXY7CiB9CiAKQEAgLTE2Nyw3ICsxNjcsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5nbG9iYWxfbGlzdC5uZXh0IDogcGNpX2RldmljZXMubmV4dDsKIAogCXdoaWxlIChuICYmIChuICE9ICZwY2lfZGV2aWNlcykpIHsKQEAgLTE4MSw3ICsxODEsNyBAQAogCX0KIAlkZXYgPSBOVUxMOwogZXhpdDoKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcmV0dXJuIGRldjsKIH0KIApAQCAtMjMyLDcgKzIzMiw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0Lm5leHQgOiBwY2lfZGV2aWNlcy5uZXh0OwogCiAJd2hpbGUgKG4gJiYgKG4gIT0gJnBjaV9kZXZpY2VzKSkgewpAQCAtMjQ3LDcgKzI0Nyw3IEBACiAJZGV2ID0gTlVMTDsKIGV4aXQ6CiAJZGV2ID0gcGNpX2Rldl9nZXQoZGV2KTsKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcGNpX2Rldl9wdXQoZnJvbSk7CiAJcmV0dXJuIGRldjsKIH0KQEAgLTI5Miw3ICsyOTIsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJbiA9IGZyb20gPyBmcm9tLT5nbG9iYWxfbGlzdC5wcmV2IDogcGNpX2RldmljZXMucHJldjsKIAogCXdoaWxlIChuICYmIChuICE9ICZwY2lfZGV2aWNlcykpIHsKQEAgLTMwNCw3ICszMDQsNyBAQAogCX0KIAlkZXYgPSBOVUxMOwogZXhpdDoKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcmV0dXJuIGRldjsKIH0KIApAQCAtMzI4LDcgKzMyOCw3IEBACiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAogCVdBUk5fT04oaW5faW50ZXJydXB0KCkpOwotCXNwaW5fbG9jaygmcGNpX2J1c19sb2NrKTsKKwlkb3duX3JlYWQoJnBjaV9idXNfc2VtKTsKIAluID0gZnJvbSA/IGZyb20tPmdsb2JhbF9saXN0Lm5leHQgOiBwY2lfZGV2aWNlcy5uZXh0OwogCiAJd2hpbGUgKG4gJiYgKG4gIT0gJnBjaV9kZXZpY2VzKSkgewpAQCAtMzQwLDcgKzM0MCw3IEBACiAJZGV2ID0gTlVMTDsKIGV4aXQ6CiAJZGV2ID0gcGNpX2Rldl9nZXQoZGV2KTsKLQlzcGluX3VubG9jaygmcGNpX2J1c19sb2NrKTsKKwl1cF9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJcGNpX2Rldl9wdXQoZnJvbSk7CiAJcmV0dXJuIGRldjsKIH0KQEAgLTM2Miw3ICszNjIsNyBAQAogCWludCBmb3VuZCA9IDA7CiAKIAlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKLQlzcGluX2xvY2soJnBjaV9idXNfbG9jayk7CisJZG93bl9yZWFkKCZwY2lfYnVzX3NlbSk7CiAJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnBjaV9kZXZpY2VzLCBnbG9iYWxfbGlzdCkgewogCQkJaWYgKHBjaV9tYXRjaF9vbmVfZGV2aWNlKGlkcywgZGV2KSkgewpAQCAtMzcyLDggKzM3Miw4IEBACiAJCX0KIAkJaWRzKys7CiAJfQotZXhpdDoJCQkJCi0Jc3Bpbl91bmxvY2soJnBjaV9idXNfbG9jayk7CitleGl0OgorCXVwX3JlYWQoJnBjaV9idXNfc2VtKTsKIAlyZXR1cm4gZm91bmQ7CiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kZXZfcHJlc2VudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IDI4Y2UzYTcuLjM1MDg2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC01NSw5ICs1NSwxMCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgewogCQl1MTYgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CiAKLQkJLyogRG9uJ3QgdG91Y2ggY2xhc3NsZXNzIGRldmljZXMgYW5kIGhvc3QgYnJpZGdlcy4gICovCisJCS8qIERvbid0IHRvdWNoIGNsYXNzbGVzcyBkZXZpY2VzIG9yIGhvc3QgYnJpZGdlcyBvciBpb2FwaWNzLiAgKi8KIAkJaWYgKGNsYXNzID09IFBDSV9DTEFTU19OT1RfREVGSU5FRCB8fAotCQkgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUKQorCQkgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9IT1NUIHx8CisJCSAgICBjbGFzcyA9PSBQQ0lfQ0xBU1NfU1lTVEVNX1BJQykKIAkJCWNvbnRpbnVlOwogCiAJCXBkZXZfc29ydF9yZXNvdXJjZXMoZGV2LCAmaGVhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCmluZGV4IGVhOTI3N2IuLjU3N2Y0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCkBAIC0xNTUsNiArMTU1LDQ2IEBACiAJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19FTUJFRERFRAoraW50IHBjaV9hc3NpZ25fcmVzb3VyY2VfZml4ZWQoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHJlc25vKQoreworCXN0cnVjdCBwY2lfYnVzICpidXMgPSBkZXYtPmJ1czsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IGRldi0+cmVzb3VyY2UgKyByZXNubzsKKwl1bnNpZ25lZCBpbnQgdHlwZV9tYXNrOworCWludCBpLCByZXQgPSAtRUJVU1k7CisKKwl0eXBlX21hc2sgPSBJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX1BSRUZFVENIOworCisJZm9yIChpID0gMDsgaSA8IFBDSV9CVVNfTlVNX1JFU09VUkNFUzsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IGJ1cy0+cmVzb3VyY2VbaV07CisJCWlmICghcikKKwkJCWNvbnRpbnVlOworCisJCS8qIHR5cGVfbWFzayBtdXN0IG1hdGNoICovCisJCWlmICgocmVzLT5mbGFncyBeIHItPmZsYWdzKSAmIHR5cGVfbWFzaykKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHJlcXVlc3RfcmVzb3VyY2UociwgcmVzKTsKKworCQlpZiAocmV0ID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiUENJOiBGYWlsZWQgdG8gYWxsb2NhdGUgJXMgcmVzb3VyY2UgIgorCQkJCSIjJWQ6JWxseEAlbGx4IGZvciAlc1xuIiwKKwkJCXJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPID8gIkkvTyIgOiAibWVtIiwKKwkJCXJlc25vLCAodW5zaWduZWQgbG9uZyBsb25nKShyZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5zdGFydCwgcGNpX25hbWUoZGV2KSk7CisJfSBlbHNlIGlmIChyZXNubyA8IFBDSV9CUklER0VfUkVTT1VSQ0VTKSB7CisJCXBjaV91cGRhdGVfcmVzb3VyY2UoZGV2LCByZXMsIHJlc25vKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2Fzc2lnbl9yZXNvdXJjZV9maXhlZCk7CisjZW5kaWYKKwogLyogU29ydCByZXNvdXJjZXMgYnkgYWxpZ25tZW50ICovCiB2b2lkIF9fZGV2aW5pdAogcGRldl9zb3J0X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdCAqaGVhZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2NhcmQuYyBiL2RyaXZlcnMvcG5wL2NhcmQuYwppbmRleCBiYjE5YzY0Li4wYjRhZGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9jYXJkLmMKKysrIGIvZHJpdmVycy9wbnAvY2FyZC5jCkBAIC02MCwzMCArNjAsMzQgQEAKIAljYXJkX3JlbW92ZShkZXYpOwogfQogCi1zdGF0aWMgaW50IGNhcmRfcHJvYmUoc3RydWN0IHBucF9jYXJkICogY2FyZCwgc3RydWN0IHBucF9jYXJkX2RyaXZlciAqIGRydikKK3N0YXRpYyBpbnQgY2FyZF9wcm9iZShzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsIHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydikKIHsKLQljb25zdCBzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICppZCA9IG1hdGNoX2NhcmQoZHJ2LGNhcmQpOwotCWlmIChpZCkgewotCQlzdHJ1Y3QgcG5wX2NhcmRfbGluayAqIGNsaW5rID0gcG5wX2FsbG9jKHNpemVvZihzdHJ1Y3QgcG5wX2NhcmRfbGluaykpOwotCQlpZiAoIWNsaW5rKQotCQkJcmV0dXJuIDA7Ci0JCWNsaW5rLT5jYXJkID0gY2FyZDsKLQkJY2xpbmstPmRyaXZlciA9IGRydjsKLQkJY2xpbmstPnBtX3N0YXRlID0gUE1TR19PTjsKLQkJaWYgKGRydi0+cHJvYmUpIHsKLQkJCWlmIChkcnYtPnByb2JlKGNsaW5rLCBpZCk+PTApCi0JCQkJcmV0dXJuIDE7Ci0JCQllbHNlIHsKLQkJCQlzdHJ1Y3QgcG5wX2RldiAqIGRldjsKLQkJCQljYXJkX2Zvcl9lYWNoX2RldihjYXJkLCBkZXYpIHsKLQkJCQkJaWYgKGRldi0+Y2FyZF9saW5rID09IGNsaW5rKQotCQkJCQkJcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2UoZGV2KTsKLQkJCQl9Ci0JCQkJa2ZyZWUoY2xpbmspOwotCQkJfQotCQl9IGVsc2UKLQkJCXJldHVybiAxOworCWNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBwbnBfY2FyZF9saW5rICpjbGluazsKKwlzdHJ1Y3QgcG5wX2RldiAqZGV2OworCisJaWYgKCFkcnYtPnByb2JlKQorCQlyZXR1cm4gMDsKKwlpZCA9IG1hdGNoX2NhcmQoZHJ2LGNhcmQpOworCWlmICghaWQpCisJCXJldHVybiAwOworCisJY2xpbmsgPSBwbnBfYWxsb2Moc2l6ZW9mKCpjbGluaykpOworCWlmICghY2xpbmspCisJCXJldHVybiAwOworCWNsaW5rLT5jYXJkID0gY2FyZDsKKwljbGluay0+ZHJpdmVyID0gZHJ2OworCWNsaW5rLT5wbV9zdGF0ZSA9IFBNU0dfT047CisKKwlpZiAoZHJ2LT5wcm9iZShjbGluaywgaWQpID49IDApCisJCXJldHVybiAxOworCisJLyogUmVjb3ZlcnkgKi8KKwljYXJkX2Zvcl9lYWNoX2RldihjYXJkLCBkZXYpIHsKKwkJaWYgKGRldi0+Y2FyZF9saW5rID09IGNsaW5rKQorCQkJcG5wX3JlbGVhc2VfY2FyZF9kZXZpY2UoZGV2KTsKIAl9CisJa2ZyZWUoY2xpbmspOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKaW5kZXggNDA3YjRlYS4uM2E0YTY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCisrKyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwpAQCAtMzYsMTMgKzM2LDEzIEBACiB7CiAJaW50IGZsYWc7CiAJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9MRVZFTF9TRU5TSVRJVkUpIHsKLQkJaWYocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQorCQlpZiAocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQogCQkJZmxhZyA9IElPUkVTT1VSQ0VfSVJRX0xPV0xFVkVMOwogCQllbHNlCiAJCQlmbGFnID0gSU9SRVNPVVJDRV9JUlFfSElHSExFVkVMOwogCX0KIAllbHNlIHsKLQkJaWYocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQorCQlpZiAocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfTE9XKQogCQkJZmxhZyA9IElPUkVTT1VSQ0VfSVJRX0xPV0VER0U7CiAJCWVsc2UKIAkJCWZsYWcgPSBJT1JFU09VUkNFX0lSUV9ISUdIRURHRTsKQEAgLTU3LDcgKzU3LDcgQEAKIAkJKnRyaWdnZXJpbmcgPSBBQ1BJX0xFVkVMX1NFTlNJVElWRTsKIAkJKnBvbGFyaXR5ID0gQUNQSV9BQ1RJVkVfTE9XOwogCQlicmVhazsKLQljYXNlIElPUkVTT1VSQ0VfSVJRX0hJR0hMRVZFTDoJCisJY2FzZSBJT1JFU09VUkNFX0lSUV9ISUdITEVWRUw6CiAJCSp0cmlnZ2VyaW5nID0gQUNQSV9MRVZFTF9TRU5TSVRJVkU7CiAJCSpwb2xhcml0eSA9IEFDUElfQUNUSVZFX0hJR0g7CiAJCWJyZWFrOwpAQCAtNzMsNyArNzMsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaXJxcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGdzaSwKK3BucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2lycXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywgdTMyIGdzaSwKIAlpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQogewogCWludCBpID0gMDsKQEAgLTEwMSw3ICsxMDEsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfZG1hcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlcywgdTMyIGRtYSkKK3BucGFjcGlfcGFyc2VfYWxsb2NhdGVkX2RtYXJlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlcywgdTMyIGRtYSkKIHsKIAlpbnQgaSA9IDA7CiAJd2hpbGUgKGkgPCBQTlBfTUFYX0RNQSAmJgpAQCAtMTE5LDggKzExOSw4IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pb3Jlc291cmNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKiByZXMsCi0JdTMyIGlvLCB1MzIgbGVuKQorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfaW9yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMsCisJdTY0IGlvLCB1NjQgbGVuKQogewogCWludCBpID0gMDsKIAl3aGlsZSAoIShyZXMtPnBvcnRfcmVzb3VyY2VbaV0uZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSAmJgpAQCAtMTM4LDcgKzEzOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzLAorcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2Uoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqcmVzLAogCXU2NCBtZW0sIHU2NCBsZW4pCiB7CiAJaW50IGkgPSAwOwpAQCAtMTU2LDExICsxNTYsMzIgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9hZGRyZXNzX3NwYWNlKHN0cnVjdCBwbnBfcmVzb3VyY2VfdGFibGUgKnJlc190YWJsZSwKKwlzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzKQoreworCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyLCAqcCA9ICZhZGRyOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCXN0YXR1cyA9IGFjcGlfcmVzb3VyY2VfdG9fYWRkcmVzczY0KHJlcywgcCk7CisJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgeworCQlwbnBfd2FybigiUG5QQUNQSTogZmFpbGVkIHRvIGNvbnZlcnQgcmVzb3VyY2UgdHlwZSAlZCIsCisJCQlyZXMtPnR5cGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKHAtPnJlc291cmNlX3R5cGUgPT0gQUNQSV9NRU1PUllfUkFOR0UpCisJCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKKwkJCQlwLT5taW5pbXVtLCBwLT5hZGRyZXNzX2xlbmd0aCk7CisJZWxzZSBpZiAocC0+cmVzb3VyY2VfdHlwZSA9PSBBQ1BJX0lPX1JBTkdFKQorCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9pb3Jlc291cmNlKHJlc190YWJsZSwKKwkJCQlwLT5taW5pbXVtLCBwLT5hZGRyZXNzX2xlbmd0aCk7Cit9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX2FsbG9jYXRlZF9yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLAogCXZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIHJlc190YWJsZSA9IChzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICopZGF0YTsKKwlzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXNfdGFibGUgPSAoc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqKWRhdGE7CiAJaW50IGk7CiAKIAlzd2l0Y2ggKHJlcy0+dHlwZSkgewpAQCAtMjIxLDE5ICsyNDIsOSBAQAogCQkJCXJlcy0+ZGF0YS5maXhlZF9tZW1vcnkzMi5hZGRyZXNzX2xlbmd0aCk7CiAJCWJyZWFrOwogCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MxNjoKLQkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfbWVtcmVzb3VyY2UocmVzX3RhYmxlLAotCQkJCXJlcy0+ZGF0YS5hZGRyZXNzMTYubWluaW11bSwKLQkJCQlyZXMtPmRhdGEuYWRkcmVzczE2LmFkZHJlc3NfbGVuZ3RoKTsKLQkJYnJlYWs7CiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgotCQlwbnBhY3BpX3BhcnNlX2FsbG9jYXRlZF9tZW1yZXNvdXJjZShyZXNfdGFibGUsCi0JCQkJcmVzLT5kYXRhLmFkZHJlc3MzMi5taW5pbXVtLAotCQkJCXJlcy0+ZGF0YS5hZGRyZXNzMzIuYWRkcmVzc19sZW5ndGgpOwotCQlicmVhazsKIAljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6Ci0JCXBucGFjcGlfcGFyc2VfYWxsb2NhdGVkX21lbXJlc291cmNlKHJlc190YWJsZSwKLQkJcmVzLT5kYXRhLmFkZHJlc3M2NC5taW5pbXVtLAotCQlyZXMtPmRhdGEuYWRkcmVzczY0LmFkZHJlc3NfbGVuZ3RoKTsKKwkJcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfYWRkcmVzc19zcGFjZShyZXNfdGFibGUsIHJlcyk7CiAJCWJyZWFrOwogCiAJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfQUREUkVTUzY0OgpAQCAtMjU1LDExICsyNjYsMTEgQEAKIAkJcG5wX3dhcm4oIlBuUEFDUEk6IHVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlcy0+dHlwZSk7CiAJCXJldHVybiBBRV9FUlJPUjsKIAl9Ci0JCQkKKwogCXJldHVybiBBRV9PSzsKIH0KIAotYWNwaV9zdGF0dXMgcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICogcmVzKQorYWNwaV9zdGF0dXMgcG5wYWNwaV9wYXJzZV9hbGxvY2F0ZWRfcmVzb3VyY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgcG5wX3Jlc291cmNlX3RhYmxlICpyZXMpCiB7CiAJLyogQmxhbmsgdGhlIHJlc291cmNlIHRhYmxlIHZhbHVlcyAqLwogCXBucF9pbml0X3Jlc291cmNlX3RhYmxlKHJlcyk7CkBAIC0zMTcsMTcgKzMyOCwxNyBAQAogCQlwbnBfZXJyKCJJbnZhbGlkIERNQSB0cmFuc2ZlciB0eXBlIik7CiAJfQogCi0JcG5wX3JlZ2lzdGVyX2RtYV9yZXNvdXJjZShvcHRpb24sZG1hKTsKKwlwbnBfcmVnaXN0ZXJfZG1hX3Jlc291cmNlKG9wdGlvbiwgZG1hKTsKIAlyZXR1cm47CiB9CiAKLQkKKwogc3RhdGljIHZvaWQgcG5wYWNwaV9wYXJzZV9pcnFfb3B0aW9uKHN0cnVjdCBwbnBfb3B0aW9uICpvcHRpb24sCiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfaXJxICpwKQogewogCWludCBpOwotCXN0cnVjdCBwbnBfaXJxICogaXJxOwotCQorCXN0cnVjdCBwbnBfaXJxICppcnE7CisKIAlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCiAJCXJldHVybjsKIAlpcnEgPSBrY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcG5wX2lycSksIEdGUF9LRVJORUwpOwpAQCAtMzQ3LDcgKzM1OCw3IEBACiAJc3RydWN0IGFjcGlfcmVzb3VyY2VfZXh0ZW5kZWRfaXJxICpwKQogewogCWludCBpOwotCXN0cnVjdCBwbnBfaXJxICogaXJxOworCXN0cnVjdCBwbnBfaXJxICppcnE7CiAKIAlpZiAocC0+aW50ZXJydXB0X2NvdW50ID09IDApCiAJCXJldHVybjsKQEAgLTM2OCw3ICszNzksNyBAQAogcG5wYWNwaV9wYXJzZV9wb3J0X29wdGlvbihzdHJ1Y3QgcG5wX29wdGlvbiAqb3B0aW9uLAogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2lvICppbykKIHsKLQlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OworCXN0cnVjdCBwbnBfcG9ydCAqcG9ydDsKIAogCWlmIChpby0+YWRkcmVzc19sZW5ndGggPT0gMCkKIAkJcmV0dXJuOwpAQCAtMzgxLDcgKzM5Miw3IEBACiAJcG9ydC0+c2l6ZSA9IGlvLT5hZGRyZXNzX2xlbmd0aDsKIAlwb3J0LT5mbGFncyA9IEFDUElfREVDT0RFXzE2ID09IGlvLT5pb19kZWNvZGUgPwogCQlQTlBfUE9SVF9GTEFHXzE2QklUQUREUiA6IDA7Ci0JcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOworCXBucF9yZWdpc3Rlcl9wb3J0X3Jlc291cmNlKG9wdGlvbiwgcG9ydCk7CiAJcmV0dXJuOwogfQogCkBAIC0zODksNyArNDAwLDcgQEAKIHBucGFjcGlfcGFyc2VfZml4ZWRfcG9ydF9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9pbyAqaW8pCiB7Ci0Jc3RydWN0IHBucF9wb3J0ICogcG9ydDsKKwlzdHJ1Y3QgcG5wX3BvcnQgKnBvcnQ7CiAKIAlpZiAoaW8tPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKQEAgLTQwMCw3ICs0MTEsNyBAQAogCXBvcnQtPnNpemUgPSBpby0+YWRkcmVzc19sZW5ndGg7CiAJcG9ydC0+YWxpZ24gPSAwOwogCXBvcnQtPmZsYWdzID0gUE5QX1BPUlRfRkxBR19GSVhFRDsKLQlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24scG9ydCk7CisJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLCBwb3J0KTsKIAlyZXR1cm47CiB9CiAKQEAgLTQwOCw3ICs0MTksNyBAQAogcG5wYWNwaV9wYXJzZV9tZW0yNF9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkyNCAqcCkKIHsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKKwlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCiAJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKQEAgLTQyMyw3ICs0MzQsNyBAQAogCW1lbS0+ZmxhZ3MgPSAoQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PSBwLT53cml0ZV9wcm90ZWN0KSA/CiAJCQlJT1JFU09VUkNFX01FTV9XUklURUFCTEUgOiAwOwogCi0JcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKKwlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIAlyZXR1cm47CiB9CiAKQEAgLTQzMSw3ICs0NDIsNyBAQAogcG5wYWNwaV9wYXJzZV9tZW0zMl9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9tZW1vcnkzMiAqcCkKIHsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKKwlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCiAJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKQEAgLTQ0Niw3ICs0NTcsNyBAQAogCW1lbS0+ZmxhZ3MgPSAoQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PSBwLT53cml0ZV9wcm90ZWN0KSA/CiAJCQlJT1JFU09VUkNFX01FTV9XUklURUFCTEUgOiAwOwogCi0JcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKKwlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIAlyZXR1cm47CiB9CiAKQEAgLTQ1NCw3ICs0NjUsNyBAQAogcG5wYWNwaV9wYXJzZV9maXhlZF9tZW0zMl9vcHRpb24oc3RydWN0IHBucF9vcHRpb24gKm9wdGlvbiwKIAlzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9maXhlZF9tZW1vcnkzMiAqcCkKIHsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKKwlzdHJ1Y3QgcG5wX21lbSAqbWVtOwogCiAJaWYgKHAtPmFkZHJlc3NfbGVuZ3RoID09IDApCiAJCXJldHVybjsKQEAgLTQ2OCw3ICs0NzksNyBAQAogCW1lbS0+ZmxhZ3MgPSAoQUNQSV9SRUFEX1dSSVRFX01FTU9SWSA9PSBwLT53cml0ZV9wcm90ZWN0KSA/CiAJCQlJT1JFU09VUkNFX01FTV9XUklURUFCTEUgOiAwOwogCi0JcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKKwlwbnBfcmVnaXN0ZXJfbWVtX3Jlc291cmNlKG9wdGlvbiwgbWVtKTsKIAlyZXR1cm47CiB9CiAKQEAgLTQ3Nyw4ICs0ODgsOCBAQAogewogCXN0cnVjdCBhY3BpX3Jlc291cmNlX2FkZHJlc3M2NCBhZGRyLCAqcCA9ICZhZGRyOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKLQlzdHJ1Y3QgcG5wX21lbSAqIG1lbTsKLQlzdHJ1Y3QgcG5wX3BvcnQgKiBwb3J0OworCXN0cnVjdCBwbnBfbWVtICptZW07CisJc3RydWN0IHBucF9wb3J0ICpwb3J0OwogCiAJc3RhdHVzID0gYWNwaV9yZXNvdXJjZV90b19hZGRyZXNzNjQociwgcCk7CiAJaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewpAQCAtNDk4LDcgKzUwOSw3IEBACiAJCW1lbS0+YWxpZ24gPSAwOwogCQltZW0tPmZsYWdzID0gKHAtPmluZm8ubWVtLndyaXRlX3Byb3RlY3QgPT0KIAkJICAgIEFDUElfUkVBRF9XUklURV9NRU1PUlkpID8gSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFIDogMDsKLQkJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sbWVtKTsKKwkJcG5wX3JlZ2lzdGVyX21lbV9yZXNvdXJjZShvcHRpb24sIG1lbSk7CiAJfSBlbHNlIGlmIChwLT5yZXNvdXJjZV90eXBlID09IEFDUElfSU9fUkFOR0UpIHsKIAkJcG9ydCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBwbnBfcG9ydCksIEdGUF9LRVJORUwpOwogCQlpZiAoIXBvcnQpCkBAIC01MDcsNyArNTE4LDcgQEAKIAkJcG9ydC0+c2l6ZSA9IHAtPmFkZHJlc3NfbGVuZ3RoOwogCQlwb3J0LT5hbGlnbiA9IDA7CiAJCXBvcnQtPmZsYWdzID0gUE5QX1BPUlRfRkxBR19GSVhFRDsKLQkJcG5wX3JlZ2lzdGVyX3BvcnRfcmVzb3VyY2Uob3B0aW9uLHBvcnQpOworCQlwbnBfcmVnaXN0ZXJfcG9ydF9yZXNvdXJjZShvcHRpb24sIHBvcnQpOwogCX0KIH0KIApAQCAtNTMxLDcgKzU0Miw3IEBACiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUE6Ci0JCQlwbnBhY3BpX3BhcnNlX2RtYV9vcHRpb24ob3B0aW9uLCAmcmVzLT5kYXRhLmRtYSk7CQorCQkJcG5wYWNwaV9wYXJzZV9kbWFfb3B0aW9uKG9wdGlvbiwgJnJlcy0+ZGF0YS5kbWEpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgpAQCAtNTM5LDcgKzU1MCw3IEBACiAJCQkJY2FzZSBBQ1BJX0dPT0RfQ09ORklHVVJBVElPTjoKIAkJCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX1BSRUZFUlJFRDsKIAkJCQkJYnJlYWs7Ci0JCQkJCQorCiAJCQkJY2FzZSBBQ1BJX0FDQ0VQVEFCTEVfQ09ORklHVVJBVElPTjoKIAkJCQkJcHJpb3JpdHkgPSBQTlBfUkVTX1BSSU9SSVRZX0FDQ0VQVEFCTEU7CiAJCQkJCWJyZWFrOwpAQCAtNTU1LDcgKzU2Niw3IEBACiAJCQlvcHRpb24gPSBwbnBfcmVnaXN0ZXJfZGVwZW5kZW50X29wdGlvbihkZXYsIHByaW9yaXR5KTsKIAkJCWlmICghb3B0aW9uKQogCQkJCXJldHVybiBBRV9FUlJPUjsKLQkJCXBhcnNlX2RhdGEtPm9wdGlvbiA9IG9wdGlvbjsJCisJCQlwYXJzZV9kYXRhLT5vcHRpb24gPSBvcHRpb247CiAJCQlicmVhazsKIAogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FTkRfREVQRU5ERU5UOgpAQCAtNjE1LDcgKzYyNiw3IEBACiAJCQlwbnBfd2FybigiUG5QQUNQSTogdW5rbm93biByZXNvdXJjZSB0eXBlICVkIiwgcmVzLT50eXBlKTsKIAkJCXJldHVybiBBRV9FUlJPUjsKIAl9Ci0JCQkKKwogCXJldHVybiBBRV9PSzsKIH0KIApAQCAtNjM2LDYgKzY0NywyNSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgcG5wYWNwaV9zdXBwb3J0ZWRfcmVzb3VyY2Uoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcykKK3sKKwlzd2l0Y2ggKHJlcy0+dHlwZSkgeworCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUE6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU86CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQ6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzI6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzI6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgorCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMjoKKwljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6CisJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBTZXQgcmVzb3VyY2UKICAqLwpAQCAtNjQzLDU1ICs2NzMsMjAgQEAKIAl2b2lkICpkYXRhKQogewogCWludCAqcmVzX2NudCA9IChpbnQgKilkYXRhOwotCXN3aXRjaCAocmVzLT50eXBlKSB7Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSVJROgotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0RNQToKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JTzoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9JTzoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTMTY6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzMyOgotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1M2NDoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9FWFRFTkRFRF9JUlE6Ci0JCSgqcmVzX2NudCkgKys7Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfU1RBUlRfREVQRU5ERU5UOgotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9ERVBFTkRFTlQ6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfVkVORE9SOgotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0VORF9UQUc6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfR0VORVJJQ19SRUdJU1RFUjoKLQlkZWZhdWx0OgotCQlyZXR1cm4gQUVfT0s7Ci0JfQorCisJaWYgKHBucGFjcGlfc3VwcG9ydGVkX3Jlc291cmNlKHJlcykpCisJCSgqcmVzX2NudCkrKzsKIAlyZXR1cm4gQUVfT0s7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX3R5cGVfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsCi0Jdm9pZCAqZGF0YSkKK3N0YXRpYyBhY3BpX3N0YXR1cyBwbnBhY3BpX3R5cGVfcmVzb3VyY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXMsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGFjcGlfcmVzb3VyY2UgKipyZXNvdXJjZSA9IChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqKilkYXRhOwkKLQlzd2l0Y2ggKHJlcy0+dHlwZSkgewotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0lSUToKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9ETUE6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfSU86Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfSU86Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQ6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMzI6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzI6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfQUREUkVTUzE2OgotCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0FERFJFU1MzMjoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9BRERSRVNTNjQ6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgorCXN0cnVjdCBhY3BpX3Jlc291cmNlICoqcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcmVzb3VyY2UgKiopZGF0YTsKKworCWlmIChwbnBhY3BpX3N1cHBvcnRlZF9yZXNvdXJjZShyZXMpKSB7CiAJCSgqcmVzb3VyY2UpLT50eXBlID0gcmVzLT50eXBlOworCQkoKnJlc291cmNlKS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAkJKCpyZXNvdXJjZSkrKzsKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9TVEFSVF9ERVBFTkRFTlQ6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX0RFUEVOREVOVDoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9WRU5ET1I6Ci0JY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRU5EX1RBRzoKLQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9HRU5FUklDX1JFR0lTVEVSOgotCWRlZmF1bHQ6Ci0JCXJldHVybiBBRV9PSzsKIAl9CiAKIAlyZXR1cm4gQUVfT0s7CkBAIC03MzUsMTEgKzczMCw4IEBACiAJc3RydWN0IHJlc291cmNlICpwKQogewogCWludCB0cmlnZ2VyaW5nLCBwb2xhcml0eTsKLQkKLQlkZWNvZGVfaXJxX2ZsYWdzKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTLCAmdHJpZ2dlcmluZywKLQkJJnBvbGFyaXR5KTsKLQlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JUlE7Ci0JcmVzb3VyY2UtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CisKKwlkZWNvZGVfaXJxX2ZsYWdzKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTLCAmdHJpZ2dlcmluZywgJnBvbGFyaXR5KTsKIAlyZXNvdXJjZS0+ZGF0YS5pcnEudHJpZ2dlcmluZyA9IHRyaWdnZXJpbmc7CiAJcmVzb3VyY2UtPmRhdGEuaXJxLnBvbGFyaXR5ID0gcG9sYXJpdHk7CiAJaWYgKHRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSkKQEAgLTc1NCwxMSArNzQ2LDggQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7CiAJaW50IHRyaWdnZXJpbmcsIHBvbGFyaXR5OwotCQotCWRlY29kZV9pcnFfZmxhZ3MocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMsICZ0cmlnZ2VyaW5nLAotCQkmcG9sYXJpdHkpOwotCXJlc291cmNlLT50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0VYVEVOREVEX0lSUTsKLQlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKKworCWRlY29kZV9pcnFfZmxhZ3MocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMsICZ0cmlnZ2VyaW5nLCAmcG9sYXJpdHkpOwogCXJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5wcm9kdWNlcl9jb25zdW1lciA9IEFDUElfQ09OU1VNRVI7CiAJcmVzb3VyY2UtPmRhdGEuZXh0ZW5kZWRfaXJxLnRyaWdnZXJpbmcgPSB0cmlnZ2VyaW5nOwogCXJlc291cmNlLT5kYXRhLmV4dGVuZGVkX2lycS5wb2xhcml0eSA9IHBvbGFyaXR5OwpAQCAtNzczLDggKzc2Miw2IEBACiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9kbWEoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9ETUE7Ci0JcmVzb3VyY2UtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CiAJLyogTm90ZTogcG5wX2Fzc2lnbl9kbWEgd2lsbCBjb3B5IHBucF9kbWEtPmZsYWdzIGludG8gcC0+ZmxhZ3MgKi8KIAlpZiAocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQV9DT01QQVRJQkxFKQogCQlyZXNvdXJjZS0+ZGF0YS5kbWEudHlwZSA9IEFDUElfQ09NUEFUSUJJTElUWTsKQEAgLTc5OCw4ICs3ODUsNiBAQAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfaW8oc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9JTzsKLQlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAkvKiBOb3RlOiBwbnBfYXNzaWduX3BvcnQgd2lsbCBjb3B5IHBucF9wb3J0LT5mbGFncyBpbnRvIHAtPmZsYWdzICovCiAJcmVzb3VyY2UtPmRhdGEuaW8uaW9fZGVjb2RlID0gKHAtPmZsYWdzICYgUE5QX1BPUlRfRkxBR18xNkJJVEFERFIpPwogCQlBQ1BJX0RFQ09ERV8xNiA6IEFDUElfREVDT0RFXzEwOwpAQCAtODEyLDggKzc5Nyw2IEBACiBzdGF0aWMgdm9pZCBwbnBhY3BpX2VuY29kZV9maXhlZF9pbyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCiAJc3RydWN0IHJlc291cmNlICpwKQogewotCXJlc291cmNlLT50eXBlID0gQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPOwotCXJlc291cmNlLT5sZW5ndGggPSBzaXplb2Yoc3RydWN0IGFjcGlfcmVzb3VyY2UpOwogCXJlc291cmNlLT5kYXRhLmZpeGVkX2lvLmFkZHJlc3MgPSBwLT5zdGFydDsKIAlyZXNvdXJjZS0+ZGF0YS5maXhlZF9pby5hZGRyZXNzX2xlbmd0aCA9IHAtPmVuZCAtIHAtPnN0YXJ0ICsgMTsKIH0KQEAgLTgyMSw4ICs4MDQsNiBAQAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfbWVtMjQoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkyNDsKLQlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAkvKiBOb3RlOiBwbnBfYXNzaWduX21lbSB3aWxsIGNvcHkgcG5wX21lbS0+ZmxhZ3MgaW50byBwLT5mbGFncyAqLwogCXJlc291cmNlLT5kYXRhLm1lbW9yeTI0LndyaXRlX3Byb3RlY3QgPQogCQkocC0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV9XUklURUFCTEUpID8KQEAgLTgzNiw4ICs4MTcsNiBAQAogc3RhdGljIHZvaWQgcG5wYWNwaV9lbmNvZGVfbWVtMzIoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlc291cmNlLAogCXN0cnVjdCByZXNvdXJjZSAqcCkKIHsKLQlyZXNvdXJjZS0+dHlwZSA9IEFDUElfUkVTT1VSQ0VfVFlQRV9NRU1PUlkzMjsKLQlyZXNvdXJjZS0+bGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBhY3BpX3Jlc291cmNlKTsKIAlyZXNvdXJjZS0+ZGF0YS5tZW1vcnkzMi53cml0ZV9wcm90ZWN0ID0KIAkJKHAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fV1JJVEVBQkxFKSA/CiAJCUFDUElfUkVBRF9XUklURV9NRU1PUlkgOiBBQ1BJX1JFQURfT05MWV9NRU1PUlk7CkBAIC04NTAsOCArODI5LDYgQEAKIHN0YXRpYyB2b2lkIHBucGFjcGlfZW5jb2RlX2ZpeGVkX21lbTMyKHN0cnVjdCBhY3BpX3Jlc291cmNlICpyZXNvdXJjZSwKIAlzdHJ1Y3QgcmVzb3VyY2UgKnApCiB7Ci0JcmVzb3VyY2UtPnR5cGUgPSBBQ1BJX1JFU09VUkNFX1RZUEVfRklYRURfTUVNT1JZMzI7Ci0JcmVzb3VyY2UtPmxlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWNwaV9yZXNvdXJjZSk7CiAJcmVzb3VyY2UtPmRhdGEuZml4ZWRfbWVtb3J5MzIud3JpdGVfcHJvdGVjdCA9CiAJCShwLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNX1dSSVRFQUJMRSkgPwogCQlBQ1BJX1JFQURfV1JJVEVfTUVNT1JZIDogQUNQSV9SRUFEX09OTFlfTUVNT1JZOwpAQCAtODgyLDM3ICs4NTksMzcgQEAKIAkJCXBucF9kYmcoIkVuY29kZSBkbWEiKTsKIAkJCXBucGFjcGlfZW5jb2RlX2RtYShyZXNvdXJjZSwKIAkJCQkmcmVzX3RhYmxlLT5kbWFfcmVzb3VyY2VbZG1hXSk7Ci0JCQlkbWEgKys7CisJCQlkbWErKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9JTzoKIAkJCXBucF9kYmcoIkVuY29kZSBpbyIpOwogCQkJcG5wYWNwaV9lbmNvZGVfaW8ocmVzb3VyY2UsCiAJCQkJJnJlc190YWJsZS0+cG9ydF9yZXNvdXJjZVtwb3J0XSk7Ci0JCQlwb3J0ICsrOworCQkJcG9ydCsrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX0ZJWEVEX0lPOgogCQkJcG5wX2RiZygiRW5jb2RlIGZpeGVkIGlvIik7CiAJCQlwbnBhY3BpX2VuY29kZV9maXhlZF9pbyhyZXNvdXJjZSwKIAkJCQkmcmVzX3RhYmxlLT5wb3J0X3Jlc291cmNlW3BvcnRdKTsKLQkJCXBvcnQgKys7CisJCQlwb3J0Kys7CiAJCQlicmVhazsKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfTUVNT1JZMjQ6CiAJCQlwbnBfZGJnKCJFbmNvZGUgbWVtMjQiKTsKIAkJCXBucGFjcGlfZW5jb2RlX21lbTI0KHJlc291cmNlLAogCQkJCSZyZXNfdGFibGUtPm1lbV9yZXNvdXJjZVttZW1dKTsKLQkJCW1lbSArKzsKKwkJCW1lbSsrOwogCQkJYnJlYWs7CiAJCWNhc2UgQUNQSV9SRVNPVVJDRV9UWVBFX01FTU9SWTMyOgogCQkJcG5wX2RiZygiRW5jb2RlIG1lbTMyIik7CiAJCQlwbnBhY3BpX2VuY29kZV9tZW0zMihyZXNvdXJjZSwKIAkJCQkmcmVzX3RhYmxlLT5tZW1fcmVzb3VyY2VbbWVtXSk7Ci0JCQltZW0gKys7CisJCQltZW0rKzsKIAkJCWJyZWFrOwogCQljYXNlIEFDUElfUkVTT1VSQ0VfVFlQRV9GSVhFRF9NRU1PUlkzMjoKIAkJCXBucF9kYmcoIkVuY29kZSBmaXhlZCBtZW0zMiIpOwogCQkJcG5wYWNwaV9lbmNvZGVfZml4ZWRfbWVtMzIocmVzb3VyY2UsCiAJCQkJJnJlc190YWJsZS0+bWVtX3Jlc291cmNlW21lbV0pOwotCQkJbWVtICsrOworCQkJbWVtKys7CiAJCQlicmVhazsKIAkJY2FzZSBBQ1BJX1JFU09VUkNFX1RZUEVfRVhURU5ERURfSVJROgogCQkJcG5wX2RiZygiRW5jb2RlIGV4dCBpcnEiKTsKQEAgLTkzMyw4ICs5MTAsOCBAQAogCQkJcG5wX3dhcm4oInVua25vd24gcmVzb3VyY2UgdHlwZSAlZCIsIHJlc291cmNlLT50eXBlKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCXJlc291cmNlICsrOwotCQlpICsrOworCQlyZXNvdXJjZSsrOworCQlpKys7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvS2NvbmZpZyBiL2RyaXZlcnMvcnRjL0tjb25maWcKaW5kZXggNjVkMDkwZC4uYmNjZmY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3J0Yy9LY29uZmlnCkBAIC03Myw2ICs3MywxMyBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtZGV2LgogCitjb25maWcgUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJYm9vbCAiUlRDIFVJRSBlbXVsYXRpb24gb24gZGV2IGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIFJUQ19JTlRGX0RFVgorCWhlbHAKKwkgIFByb3ZpZGVzIGFuIGVtdWxhdGlvbiBmb3IgUlRDX1VJRSBpZiB0aGUgdW5kZXJsYXlpbmcgcnRjIGNoaXAKKwkgIGRyaXZlciBkaWQgbm90IHByb3ZpZGUgUlRDX1VJRSBpb2N0bHMuCisKIGNvbW1lbnQgIlJUQyBkcml2ZXJzIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCiAKQEAgLTg2LDYgKzkzLDM0IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy14MTIwNS4KIAorY29uZmlnIFJUQ19EUlZfRFMxMzA3CisJdHJpc3RhdGUgIkRhbGxhcy9NYXhpbSBEUzEzMDcgYW5kIHNpbWlsYXIgSTJDIFJUQyBjaGlwcyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdmFyaW91cyBjb21wYXRpYmxlIFJUQworCSAgY2hpcHMgKG9mdGVuIHdpdGggYmF0dGVyeSBiYWNrdXApIGNvbm5lY3RlZCB3aXRoIEkyQy4gIFRoaXMgZHJpdmVyCisJICBzaG91bGQgaGFuZGxlIERTMTMwNywgRFMxMzM3LCBEUzEzMzgsIERTMTMzOSwgRFMxMzQwLCBTVCBNNDFUMDAsCisJICBhbmQgcHJvYmFibHkgb3RoZXIgY2hpcHMuICBJbiBzb21lIGNhc2VzIHRoZSBSVEMgbXVzdCBhbHJlYWR5CisJICBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgKGJ5IG1hbnVmYWN0dXJpbmcgb3IgYSBib290bG9hZGVyKS4KKworCSAgVGhlIGZpcnN0IHNldmVuIHJlZ2lzdGVycyBvbiB0aGVzZSBjaGlwcyBob2xkIGFuIFJUQywgYW5kIG90aGVyCisJICByZWdpc3RlcnMgbWF5IGFkZCBmZWF0dXJlcyBzdWNoIGFzIE5WUkFNLCBhIHRyaWNrbGUgY2hhcmdlciBmb3IKKwkgIHRoZSBSVEMvTlZSQU0gYmFja3VwIHBvd2VyLCBhbmQgYWxhcm1zLiAgVGhpcyBkcml2ZXIgbWF5IG5vdAorCSAgZXhwb3NlIGFsbCB0aG9zZSBhdmFpbGFibGUgY2hpcCBmZWF0dXJlcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxMzA3LgorCitjb25maWcgUlRDX0RSVl9EUzE1NTMKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTU1MyIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIERhbGxhcyBEUzE1NTMgdGltZWtlZXBpbmcgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxNTUzLgorCiBjb25maWcgUlRDX0RSVl9EUzE2NzIKIAl0cmlzdGF0ZSAiRGFsbGFzL01heGltIERTMTY3MiIKIAlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBJMkMKQEAgLTk2LDYgKzEzMSwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxNjcyLgogCitjb25maWcgUlRDX0RSVl9EUzE3NDIKKwl0cmlzdGF0ZSAiRGFsbGFzIERTMTc0MiIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUworCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUKKwkgIERhbGxhcyBEUzE3NDIgdGltZWtlZXBpbmcgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtZHMxNzQyLgorCiBjb25maWcgUlRDX0RSVl9QQ0Y4NTYzCiAJdHJpc3RhdGUgIlBoaWxpcHMgUENGODU2My9FcHNvbiBSVEM4NTY0IgogCWRlcGVuZHMgb24gUlRDX0NMQVNTICYmIEkyQwpAQCAtMTA3LDYgKzE1MiwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBydGMtcGNmODU2My4KIAorY29uZmlnIFJUQ19EUlZfUENGODU4MworCXRyaXN0YXRlICJQaGlsaXBzIFBDRjg1ODMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZQorCSAgUGhpbGlwcyBQQ0Y4NTgzIFJUQyBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy1wY2Y4NTgzLgorCiBjb25maWcgUlRDX0RSVl9SUzVDMzcyCiAJdHJpc3RhdGUgIlJpY29oIFJTNUMzNzJBL0IiCiAJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgSTJDCkBAIC0xNTcsNiArMjEyLDIyIEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtdnI0MXh4LgogCitjb25maWcgUlRDX0RSVl9QTDAzMQorCXRyaXN0YXRlICJBUk0gQU1CQSBQTDAzMSBSVEMiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgQVJNX0FNQkEKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB5b3Ugd2lsbCBnZXQgYWNjZXNzIHRvIEFSTSBBTUJBCisJICBQcmltZUNlbGwgUEwwMzEgVUFSVCBmb3VuZCBvbiBjZXJ0YWluIEFSTSBTT0NzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBydGMtcGwwMzEuCisKK2NvbmZpZyBSVENfRFJWX0FUOTEKKwl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCIKKwlkZXBlbmRzIG9uIFJUQ19DTEFTUyAmJiBBUkNIX0FUOTFSTTkyMDAKKwloZWxwCisJICBEcml2ZXIgZm9yIHRoZSBBdG1lbCBBVDkxUk05MjAwJ3MgaW50ZXJuYWwgUlRDIChSZWFsdGltZSBDbG9jaykuCisKIGNvbmZpZyBSVENfRFJWX1RFU1QKIAl0cmlzdGF0ZSAiVGVzdCBkcml2ZXIvZGV2aWNlIgogCWRlcGVuZHMgb24gUlRDX0NMQVNTCkBAIC0xNzIsNCArMjQzLDI0IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHJ0Yy10ZXN0LgogCitjb25maWcgUlRDX0RSVl9NQVg2OTAyCisJdHJpc3RhdGUgIk1heGltIDY5MDIiCisJZGVwZW5kcyBvbiBSVENfQ0xBU1MgJiYgU1BJCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBNYXhpbSBNQVg2OTAyIHNwaSBSVEMgY2hpcC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBydGMtbWF4NjkwMi4KKworY29uZmlnIFJUQ19EUlZfVjMwMjAKKwl0cmlzdGF0ZSAiRU0gTWljcm9lbGVjdHJvbmljIFYzMDIwIgorCWRlcGVuZHMgb24gUlRDX0NMQVNTCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdGhlCisJICBFTSBNaWNyb2VsZWN0cm9uaWMgdjMwMjAgUlRDIGNoaXAuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgcnRjLXYzMDIwLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9NYWtlZmlsZSBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCmluZGV4IGE5Y2EwZjEuLjkwMGQyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcnRjL01ha2VmaWxlCkBAIC0xMywxMCArMTMsMTggQEAKIAogb2JqLSQoQ09ORklHX1JUQ19EUlZfWDEyMDUpCSs9IHJ0Yy14MTIwNS5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9URVNUKQkrPSBydGMtdGVzdC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9EUzEzMDcpCSs9IHJ0Yy1kczEzMDcubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNjcyKQkrPSBydGMtZHMxNjcyLm8KK29iai0kKENPTkZJR19SVENfRFJWX0RTMTc0MikJKz0gcnRjLWRzMTc0Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTYzKQkrPSBydGMtcGNmODU2My5vCitvYmotJChDT05GSUdfUlRDX0RSVl9QQ0Y4NTgzKQkrPSBydGMtcGNmODU4My5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9SUzVDMzcyKQkrPSBydGMtcnM1YzM3Mi5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9NNDhUODYpCSs9IHJ0Yy1tNDh0ODYubworb2JqLSQoQ09ORklHX1JUQ19EUlZfRFMxNTUzKQkrPSBydGMtZHMxNTUzLm8KIG9iai0kKENPTkZJR19SVENfRFJWX0VQOTNYWCkJKz0gcnRjLWVwOTN4eC5vCiBvYmotJChDT05GSUdfUlRDX0RSVl9TQTExMDApCSs9IHJ0Yy1zYTExMDAubwogb2JqLSQoQ09ORklHX1JUQ19EUlZfVlI0MVhYKQkrPSBydGMtdnI0MXh4Lm8KK29iai0kKENPTkZJR19SVENfRFJWX1BMMDMxKQkrPSBydGMtcGwwMzEubworb2JqLSQoQ09ORklHX1JUQ19EUlZfTUFYNjkwMikJKz0gcnRjLW1heDY5MDIubworb2JqLSQoQ09ORklHX1JUQ19EUlZfVjMwMjApCSs9IHJ0Yy12MzAyMC5vCitvYmotJChDT05GSUdfUlRDX0RSVl9BVDkxKQkrPSBydGMtYXQ5MS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9jbGFzcy5jIGIvZHJpdmVycy9ydGMvY2xhc3MuYwppbmRleCA0MTNjN2Q1Li41Mzk2YmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9jbGFzcy5jCisrKyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKQEAgLTY5LDYgKzY5LDcgQEAKIAlydGMtPmlkID0gaWQ7CiAJcnRjLT5vcHMgPSBvcHM7CiAJcnRjLT5vd25lciA9IG93bmVyOworCXJ0Yy0+bWF4X3VzZXJfZnJlcSA9IDY0OwogCXJ0Yy0+Y2xhc3NfZGV2LmRldiA9IGRldjsKIAlydGMtPmNsYXNzX2Rldi5jbGFzcyA9IHJ0Y19jbGFzczsKIAlydGMtPmNsYXNzX2Rldi5yZWxlYXNlID0gcnRjX2RldmljZV9yZWxlYXNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCA1NmU0OTA3Li41NzljZDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtMjI5LDYgKzIyOSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gdG9fcnRjX2RldmljZShjbGFzc19kZXYpOwogCisJaWYgKHJ0Yy0+b3BzLT5pcnFfc2V0X3N0YXRlID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgIT0gdGFzaykKIAkJZXJyID0gLUVOWElPOwpAQCAtMjQzLDI1ICsyNDYsMTIgQEAKIAogaW50IHJ0Y19pcnFfc2V0X2ZyZXEoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2LCBzdHJ1Y3QgcnRjX3Rhc2sgKnRhc2ssIGludCBmcmVxKQogewotCWludCBlcnIgPSAwLCB0bXAgPSAwOworCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IHRvX3J0Y19kZXZpY2UoY2xhc3NfZGV2KTsKIAotCS8qIGFsbG93ZWQgcmFuZ2UgaXMgMi04MTkyICovCi0JaWYgKGZyZXEgPCAyIHx8IGZyZXEgPiA4MTkyKQotCQlyZXR1cm4gLUVJTlZBTDsKLS8qCi0JRklYTUU6IHRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUsIHdpbGwgbW92ZSB3aGVyZSBhcHByb3ByaWF0ZQotCWF0IGEgbGF0ZXIgc3RhZ2UuIEl0IGNhbm5vdCBodXJ0IHJpZ2h0IG5vdywgdHJ1c3QgbWUgOikKLQlpZiAoKGZyZXEgPiBydGNfbWF4X3VzZXJfZnJlcSkgJiYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0qLwotCS8qIGNoZWNrIGlmIGZyZXEgaXMgYSBwb3dlciBvZiAyICovCi0Jd2hpbGUgKGZyZXEgPiAoMSA8PCB0bXApKQotCQl0bXArKzsKLQotCWlmIChmcmVxICE9ICgxIDw8IHRtcCkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChydGMtPm9wcy0+aXJxX3NldF9mcmVxID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfdGFza19sb2NrLCBmbGFncyk7CiAJaWYgKHJ0Yy0+aXJxX3Rhc2sgIT0gdGFzaykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1hdDkxLmMgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzZmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MS5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICoJUmVhbCBUaW1lIENsb2NrIGludGVyZmFjZSBmb3IgTGludXggb24gQXRtZWwgQVQ5MVJNOTIwMAorICoKKyAqCUNvcHlyaWdodCAoQykgMjAwMiBSaWNrIEJyb25zb24KKyAqCisgKglDb252ZXJ0ZWQgdG8gUlRDIGNsYXNzIG1vZGVsIGJ5IEFuZHJldyBWaWN0b3IKKyAqCisgKglQb3J0ZWQgdG8gTGludXggMi42IGJ5IFN0ZXZlbiBTY2hvbHoKKyAqCUJhc2VkIG9uIHMzYzI0MTAtcnRjLmMgU2ltdGVjIEVsZWN0cm9uaWNzCisgKgorICoJQmFzZWQgb24gc2ExMTAwLXJ0Yy5jIGJ5IE5pbHMgRmFlcmJlcgorICoJQmFzZWQgb24gcnRjLmMgYnkgUGF1bCBHb3J0bWFrZXIKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaC90aW1lLmg+CisKKworI2RlZmluZSBBVDkxX1JUQ19GUkVRCQkxCisjZGVmaW5lIEFUOTFfUlRDX0VQT0NICQkxOTAwVUwJLyoganVzdCBsaWtlIGFyY2gvYXJtL2NvbW1vbi9ydGN0aW1lLmMgKi8KKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihhdDkxX3J0Y191cGRhdGVkKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXQ5MV9hbGFybV95ZWFyID0gQVQ5MV9SVENfRVBPQ0g7CisKKy8qCisgKiBEZWNvZGUgdGltZS9kYXRlIGludG8gcnRjX3RpbWUgc3RydWN0dXJlCisgKi8KK3N0YXRpYyB2b2lkIGF0OTFfcnRjX2RlY29kZXRpbWUodW5zaWduZWQgaW50IHRpbWVyZWcsIHVuc2lnbmVkIGludCBjYWxyZWcsCisJCQkJc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBpbnQgdGltZSwgZGF0ZTsKKworCS8qIG11c3QgcmVhZCB0d2ljZSBpbiBjYXNlIGl0IGNoYW5nZXMgKi8KKwlkbyB7CisJCXRpbWUgPSBhdDkxX3N5c19yZWFkKHRpbWVyZWcpOworCQlkYXRlID0gYXQ5MV9zeXNfcmVhZChjYWxyZWcpOworCX0gd2hpbGUgKCh0aW1lICE9IGF0OTFfc3lzX3JlYWQodGltZXJlZykpIHx8CisJCQkoZGF0ZSAhPSBhdDkxX3N5c19yZWFkKGNhbHJlZykpKTsKKworCXRtLT50bV9zZWMgID0gQkNEMkJJTigodGltZSAmIEFUOTFfUlRDX1NFQykgPj4gMCk7CisJdG0tPnRtX21pbiAgPSBCQ0QyQklOKCh0aW1lICYgQVQ5MV9SVENfTUlOKSA+PiA4KTsKKwl0bS0+dG1faG91ciA9IEJDRDJCSU4oKHRpbWUgJiBBVDkxX1JUQ19IT1VSKSA+PiAxNik7CisKKwkvKgorCSAqIFRoZSBDYWxlbmRhciBBbGFybSByZWdpc3RlciBkb2VzIG5vdCBoYXZlIGEgZmllbGQgZm9yCisJICogdGhlIHllYXIgLSBzbyB0aGVzZSB3aWxsIHJldHVybiBhbiBpbnZhbGlkIHZhbHVlLiAgV2hlbiBhbgorCSAqIGFsYXJtIGlzIHNldCwgYXQ5MV9hbGFybV95ZWFyIHdpbGxlIHN0b3JlIHRoZSBjdXJyZW50IHllYXIuCisJICovCisJdG0tPnRtX3llYXIgID0gQkNEMkJJTihkYXRlICYgQVQ5MV9SVENfQ0VOVCkgKiAxMDA7CS8qIGNlbnR1cnkgKi8KKwl0bS0+dG1feWVhciArPSBCQ0QyQklOKChkYXRlICYgQVQ5MV9SVENfWUVBUikgPj4gOCk7CS8qIHllYXIgKi8KKworCXRtLT50bV93ZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBWSkgPj4gMjEpIC0gMTsJLyogZGF5IG9mIHRoZSB3ZWVrIFswLTZdLCBTdW5kYXk9MCAqLworCXRtLT50bV9tb24gID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX01PTlRIKSA+PiAxNikgLSAxOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTigoZGF0ZSAmIEFUOTFfUlRDX0RBVEUpID4+IDI0KTsKK30KKworLyoKKyAqIFJlYWQgY3VycmVudCB0aW1lIGFuZCBkYXRlIGluIFJUQworICovCitzdGF0aWMgaW50IGF0OTFfcnRjX3JlYWR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTVIsIEFUOTFfUlRDX0NBTFIsIHRtKTsKKwl0bS0+dG1feWRheSA9IHJ0Y195ZWFyX2RheXModG0tPnRtX21kYXksIHRtLT50bV9tb24sIHRtLT50bV95ZWFyKTsKKwl0bS0+dG1feWVhciA9IHRtLT50bV95ZWFyIC0gMTkwMDsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGN1cnJlbnQgdGltZSBhbmQgZGF0ZSBpbiBSVEMKKyAqLworc3RhdGljIGludCBhdDkxX3J0Y19zZXR0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwl1bnNpZ25lZCBsb25nIGNyOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJMTkwMCArIHRtLT50bV95ZWFyLCB0bS0+dG1fbW9uLCB0bS0+dG1fbWRheSwKKwkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCisJLyogU3RvcCBUaW1lL0NhbGVuZGFyIGZyb20gY291bnRpbmcgKi8KKwljciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9SVENfQ1IpOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NSLCBjciB8IEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSk7CisKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRVIsIEFUOTFfUlRDX0FDS1VQRCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYXQ5MV9ydGNfdXBkYXRlZCk7CS8qIHdhaXQgZm9yIEFDS1VQRCBpbnRlcnJ1cHQgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCk7CisKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19USU1SLAorCQkJICBCSU4yQkNEKHRtLT50bV9zZWMpIDw8IDAKKwkJCXwgQklOMkJDRCh0bS0+dG1fbWluKSA8PCA4CisJCQl8IEJJTjJCQ0QodG0tPnRtX2hvdXIpIDw8IDE2KTsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NBTFIsCisJCQkgIEJJTjJCQ0QoKHRtLT50bV95ZWFyICsgMTkwMCkgLyAxMDApCS8qIGNlbnR1cnkgKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1feWVhciAlIDEwMCkgPDwgOAkvKiB5ZWFyICovCisJCQl8IEJJTjJCQ0QodG0tPnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1fd2RheSArIDEpIDw8IDIxCS8qIGRheSBvZiB0aGUgd2VlayBbMC02XSwgU3VuZGF5PTAgKi8KKwkJCXwgQklOMkJDRCh0bS0+dG1fbWRheSkgPDwgMjQpOworCisJLyogUmVzdGFydCBUaW1lL0NhbGVuZGFyICovCisJY3IgPSBhdDkxX3N5c19yZWFkKEFUOTFfUlRDX0NSKTsKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19DUiwgY3IgJiB+KEFUOTFfUlRDX1VQRENBTCB8IEFUOTFfUlRDX1VQRFRJTSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcmVhZGFsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFscm0pCit7CisJc3RydWN0IHJ0Y190aW1lICp0bSA9ICZhbHJtLT50aW1lOworCisJYXQ5MV9ydGNfZGVjb2RldGltZShBVDkxX1JUQ19USU1BTFIsIEFUOTFfUlRDX0NBTEFMUiwgdG0pOworCXRtLT50bV95ZGF5ID0gcnRjX3llYXJfZGF5cyh0bS0+dG1fbWRheSwgdG0tPnRtX21vbiwgdG0tPnRtX3llYXIpOworCXRtLT50bV95ZWFyID0gYXQ5MV9hbGFybV95ZWFyIC0gMTkwMDsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCisJCXRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGFsYXJtIHRpbWUgYW5kIGRhdGUgaW4gUlRDCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfc2V0YWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgdG07CisKKwlhdDkxX3J0Y19kZWNvZGV0aW1lKEFUOTFfUlRDX1RJTVIsIEFUOTFfUlRDX0NBTFIsICZ0bSk7CisKKwlhdDkxX2FsYXJtX3llYXIgPSB0bS50bV95ZWFyOworCisJdG0udG1faG91ciA9IGFscm0tPnRpbWUudG1faG91cjsKKwl0bS50bV9taW4gPSBhbHJtLT50aW1lLnRtX21pbjsKKwl0bS50bV9zZWMgPSBhbHJtLT50aW1lLnRtX3NlYzsKKworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX1RJTUFMUiwKKwkJICBCSU4yQkNEKHRtLnRtX3NlYykgPDwgMAorCQl8IEJJTjJCQ0QodG0udG1fbWluKSA8PCA4CisJCXwgQklOMkJDRCh0bS50bV9ob3VyKSA8PCAxNgorCQl8IEFUOTFfUlRDX0hPVVJFTiB8IEFUOTFfUlRDX01JTkVOIHwgQVQ5MV9SVENfU0VDRU4pOworCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0NBTEFMUiwKKwkJICBCSU4yQkNEKHRtLnRtX21vbiArIDEpIDw8IDE2CQkvKiB0bV9tb24gc3RhcnRzIGF0IHplcm8gKi8KKwkJfCBCSU4yQkNEKHRtLnRtX21kYXkpIDw8IDI0CisJCXwgQVQ5MV9SVENfREFURUVOIHwgQVQ5MV9SVENfTVRIRU4pOworCisJcHJfZGVidWcoIiVzKCk6ICU0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRcbiIsIF9fRlVOQ1RJT05fXywKKwkJYXQ5MV9hbGFybV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksIHRtLnRtX2hvdXIsCisJCXRtLnRtX21pbiwgdG0udG1fc2VjKTsKKworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGNvbW1hbmRzIGZyb20gdXNlci1zcGFjZQorICovCitzdGF0aWMgaW50IGF0OTFfcnRjX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQgPSAwOworCisJcHJfZGVidWcoIiVzKCk6IGNtZD0lMDh4LCBhcmc9JTA4bHguXG4iLCBfX0ZVTkNUSU9OX18sIGNtZCwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoJLyogYWxhcm0gb2ZmICovCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfQUxBUk0pOworCQlicmVhazsKKwljYXNlIFJUQ19BSUVfT046CS8qIGFsYXJtIG9uICovCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lFUiwgQVQ5MV9SVENfQUxBUk0pOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT0ZGOgkvKiB1cGRhdGUgb2ZmICovCisJY2FzZSBSVENfUElFX09GRjoJLyogcGVyaW9kaWMgb2ZmICovCisJCWF0OTFfc3lzX3dyaXRlKEFUOTFfUlRDX0lEUiwgQVQ5MV9SVENfU0VDRVYpOworCQlicmVhazsKKwljYXNlIFJUQ19VSUVfT046CS8qIHVwZGF0ZSBvbiAqLworCWNhc2UgUlRDX1BJRV9PTjoJLyogcGVyaW9kaWMgb24gKi8KKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSUVSLCBBVDkxX1JUQ19TRUNFVik7CisJCWJyZWFrOworCWNhc2UgUlRDX0lSUVBfUkVBRDoJLyogcmVhZCBwZXJpb2RpYyBhbGFybSBmcmVxdWVuY3kgKi8KKwkJcmV0ID0gcHV0X3VzZXIoQVQ5MV9SVENfRlJFUSwgKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfSVJRUF9TRVQ6CS8qIHNldCBwZXJpb2RpYyBhbGFybSBmcmVxdWVuY3kgKi8KKwkJaWYgKGFyZyAhPSBBVDkxX1JUQ19GUkVRKQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0lPQ1RMQ01EOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUHJvdmlkZSBhZGRpdGlvbmFsIFJUQyBpbmZvcm1hdGlvbiBpbiAvcHJvYy9kcml2ZXIvcnRjCisgKi8KK3N0YXRpYyBpbnQgYXQ5MV9ydGNfcHJvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzZXFfZmlsZSAqc2VxKQoreworCXVuc2lnbmVkIGxvbmcgaW1yID0gYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19JTVIpOworCisJc2VxX3ByaW50ZihzZXEsICJhbGFybV9JUlFcdDogJXNcbiIsCisJCQkoaW1yICYgQVQ5MV9SVENfQUxBUk0pID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInVwZGF0ZV9JUlFcdDogJXNcbiIsCisJCQkoaW1yICYgQVQ5MV9SVENfQUNLVVBEKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihzZXEsICJwZXJpb2RpY19JUlFcdDogJXNcbiIsCisJCQkoaW1yICYgQVQ5MV9SVENfU0VDRVYpID8gInllcyIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKHNlcSwgInBlcmlvZGljX2ZyZXFcdDogJWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIEFUOTFfUlRDX0ZSRVEpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJUlEgaGFuZGxlciBmb3IgdGhlIFJUQworICovCitzdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MV9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGRldl9pZDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgaW50IHJ0c3I7CisJdW5zaWduZWQgbG9uZyBldmVudHMgPSAwOworCisJcnRzciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9SVENfU1IpICYgYXQ5MV9zeXNfcmVhZChBVDkxX1JUQ19JTVIpOworCWlmIChydHNyKSB7CQkvKiB0aGlzIGludGVycnVwdCBpcyBzaGFyZWQhICBJcyBpdCBvdXJzPyAqLworCQlpZiAocnRzciAmIEFUOTFfUlRDX0FMQVJNKQorCQkJZXZlbnRzIHw9IChSVENfQUYgfCBSVENfSVJRRik7CisJCWlmIChydHNyICYgQVQ5MV9SVENfU0VDRVYpCisJCQlldmVudHMgfD0gKFJUQ19VRiB8IFJUQ19JUlFGKTsKKwkJaWYgKHJ0c3IgJiBBVDkxX1JUQ19BQ0tVUEQpCisJCQljb21wbGV0ZSgmYXQ5MV9ydGNfdXBkYXRlZCk7CisKKwkJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfU0NDUiwgcnRzcik7CS8qIGNsZWFyIHN0YXR1cyByZWcgKi8KKworCQlydGNfdXBkYXRlX2lycSgmcnRjLT5jbGFzc19kZXYsIDEsIGV2ZW50cyk7CisKKwkJcHJfZGVidWcoIiVzKCk6IG51bT0lbGQsIGV2ZW50cz0weCUwMmx4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQlldmVudHMgPj4gOCwgZXZlbnRzICYgMHgwMDAwMDBGRik7CisKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gSVJRX05PTkU7CQkvKiBub3QgaGFuZGxlZCAqLworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgYXQ5MV9ydGNfb3BzID0geworCS5pb2N0bAkJPSBhdDkxX3J0Y19pb2N0bCwKKwkucmVhZF90aW1lCT0gYXQ5MV9ydGNfcmVhZHRpbWUsCisJLnNldF90aW1lCT0gYXQ5MV9ydGNfc2V0dGltZSwKKwkucmVhZF9hbGFybQk9IGF0OTFfcnRjX3JlYWRhbGFybSwKKwkuc2V0X2FsYXJtCT0gYXQ5MV9ydGNfc2V0YWxhcm0sCisJLnByb2MJCT0gYXQ5MV9ydGNfcHJvYywKK307CisKKy8qCisgKiBJbml0aWFsaXplIGFuZCBpbnN0YWxsIFJUQyBkcml2ZXIKKyAqLworc3RhdGljIGludCBfX2luaXQgYXQ5MV9ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCWludCByZXQ7CisKKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19DUiwgMCk7CisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfTVIsIDApOwkJLyogMjQgaG91ciBtb2RlICovCisKKwkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovCisJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9SVENfSURSLCBBVDkxX1JUQ19BQ0tVUEQgfCBBVDkxX1JUQ19BTEFSTSB8CisJCQkJCUFUOTFfUlRDX1NFQ0VWIHwgQVQ5MV9SVENfVElNRVYgfAorCQkJCQlBVDkxX1JUQ19DQUxFVik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShBVDkxX0lEX1NZUywgYXQ5MV9ydGNfaW50ZXJydXB0LAorCQkJCVNBX1NISVJRLCAiYXQ5MV9ydGMiLCBwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiYXQ5MV9ydGM6IElSUSAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCisJCQkJQVQ5MV9JRF9TWVMpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGRldi0+bmFtZSwgJnBkZXYtPmRldiwKKwkJCQkmYXQ5MV9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKSB7CisJCWZyZWVfaXJxKEFUOTFfSURfU1lTLCBwZGV2KTsKKwkJcmV0dXJuIFBUUl9FUlIocnRjKTsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcnRjKTsKKworCXByaW50ayhLRVJOX0lORk8gIkFUOTEgUmVhbCBUaW1lIENsb2NrIGRyaXZlci5cbiIpOworCXJldHVybiAwOworfQorCisvKgorICogRGlzYWJsZSBhbmQgcmVtb3ZlIHRoZSBSVEMgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IGF0OTFfcnRjX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlhdDkxX3N5c193cml0ZShBVDkxX1JUQ19JRFIsIEFUOTFfUlRDX0FDS1VQRCB8IEFUOTFfUlRDX0FMQVJNIHwKKwkJCQkJQVQ5MV9SVENfU0VDRVYgfCBBVDkxX1JUQ19USU1FViB8CisJCQkJCUFUOTFfUlRDX0NBTEVWKTsKKwlmcmVlX2lycShBVDkxX0lEX1NZUywgcGRldik7CisKKwlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKKy8qIEFUOTFSTTkyMDAgUlRDIFBvd2VyIG1hbmFnZW1lbnQgY29udHJvbCAqLworCitzdGF0aWMgc3RydWN0IHRpbWVzcGVjIGF0OTFfcnRjX2RlbHRhOworCitzdGF0aWMgaW50IGF0OTFfcnRjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKworCXRpbWUudHZfbnNlYyA9IDA7CisKKwkvKiBjYWxjdWxhdGUgdGltZSBkZWx0YSBmb3Igc3VzcGVuZCAqLworCWF0OTFfcnRjX3JlYWR0aW1lKCZwZGV2LT5kZXYsICZ0bSk7CisJcnRjX3RtX3RvX3RpbWUoJnRtLCAmdGltZS50dl9zZWMpOworCXNhdmVfdGltZV9kZWx0YSgmYXQ5MV9ydGNfZGVsdGEsICZ0aW1lKTsKKworCXByX2RlYnVnKCIlcygpOiAlNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkXG4iLCBfX0ZVTkNUSU9OX18sCisJCTE5MDAgKyB0bS50bV95ZWFyLCB0bS50bV9tb24sIHRtLnRtX21kYXksCisJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0OTFfcnRjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKworCXRpbWUudHZfbnNlYyA9IDA7CisKKwlhdDkxX3J0Y19yZWFkdGltZSgmcGRldi0+ZGV2LCAmdG0pOworCXJ0Y190bV90b190aW1lKCZ0bSwgJnRpbWUudHZfc2VjKTsKKwlyZXN0b3JlX3RpbWVfZGVsdGEoJmF0OTFfcnRjX2RlbHRhLCAmdGltZSk7CisKKwlwcl9kZWJ1ZygiJXMoKTogJTRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwgX19GVU5DVElPTl9fLAorCQkxOTAwICsgdG0udG1feWVhciwgdG0udG1fbW9uLCB0bS50bV9tZGF5LAorCQl0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGF0OTFfcnRjX3N1c3BlbmQgTlVMTAorI2RlZmluZSBhdDkxX3J0Y19yZXN1bWUgIE5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdDkxX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGF0OTFfcnRjX3Byb2JlLAorCS5yZW1vdmUJCT0gYXQ5MV9ydGNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gYXQ5MV9ydGNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGF0OTFfcnRjX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiYXQ5MV9ydGMiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXQ5MV9ydGNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF0OTFfcnRjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhdDkxX3J0Y19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0OTFfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGF0OTFfcnRjX2luaXQpOworbW9kdWxlX2V4aXQoYXQ5MV9ydGNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlJpY2sgQnJvbnNvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSVEMgZHJpdmVyIGZvciBBdG1lbCBBVDkxUk05MjAwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMgYi9kcml2ZXJzL3J0Yy9ydGMtZGV2LmMKaW5kZXggMjAxMTU2Ny4uNjFhNTgyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWRldi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kZXYuYwpAQCAtNDgsNiArNDgsOTMgQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAorLyoKKyAqIFJvdXRpbmUgdG8gcG9sbCBSVEMgc2Vjb25kcyBmaWVsZCBmb3IgY2hhbmdlIGFzIG9mdGVuIGFzIHBvc3NpYmxlLAorICogYWZ0ZXIgZmlyc3QgUlRDX1VJRSB1c2UgdGltZXIgdG8gcmVkdWNlIHBvbGxpbmcKKyAqLworc3RhdGljIHZvaWQgcnRjX3VpZV90YXNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YyA9IGRhdGE7CisJc3RydWN0IHJ0Y190aW1lIHRtOworCWludCBudW0gPSAwOworCWludCBlcnI7CisKKwllcnIgPSBydGNfcmVhZF90aW1lKCZydGMtPmNsYXNzX2RldiwgJnRtKTsKKwlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlpZiAocnRjLT5zdG9wX3VpZV9wb2xsaW5nIHx8IGVycikgeworCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CisJfSBlbHNlIGlmIChydGMtPm9sZHNlY3MgIT0gdG0udG1fc2VjKSB7CisJCW51bSA9ICh0bS50bV9zZWMgKyA2MCAtIHJ0Yy0+b2xkc2VjcykgJSA2MDsKKwkJcnRjLT5vbGRzZWNzID0gdG0udG1fc2VjOworCQlydGMtPnVpZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIEhaIC0gKEhaLzEwKTsKKwkJcnRjLT51aWVfdGltZXJfYWN0aXZlID0gMTsKKwkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOworCQlhZGRfdGltZXIoJnJ0Yy0+dWllX3RpbWVyKTsKKwl9IGVsc2UgaWYgKHNjaGVkdWxlX3dvcmsoJnJ0Yy0+dWllX3Rhc2spID09IDApIHsKKwkJcnRjLT51aWVfdGFza19hY3RpdmUgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmIChudW0pCisJCXJ0Y191cGRhdGVfaXJxKCZydGMtPmNsYXNzX2RldiwgbnVtLCBSVENfVUYgfCBSVENfSVJRRik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0Y191aWVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSAoc3RydWN0IHJ0Y19kZXZpY2UgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnRjLT5pcnFfbG9jaywgZmxhZ3MpOworCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7CisJcnRjLT51aWVfdGFza19hY3RpdmUgPSAxOworCWlmICgoc2NoZWR1bGVfd29yaygmcnRjLT51aWVfdGFzaykgPT0gMCkpCisJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGMtPmlycV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3VpZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCWlmIChydGMtPmlycV9hY3RpdmUpIHsKKwkJcnRjLT5zdG9wX3VpZV9wb2xsaW5nID0gMTsKKwkJaWYgKHJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZydGMtPnVpZV90aW1lcik7CisJCQlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwkJCXJ0Yy0+dWllX3RpbWVyX2FjdGl2ZSA9IDA7CisJCX0KKwkJaWYgKHJ0Yy0+dWllX3Rhc2tfYWN0aXZlKSB7CisJCQlzcGluX3VubG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwkJCXNwaW5fbG9ja19pcnEoJnJ0Yy0+aXJxX2xvY2spOworCQl9CisJCXJ0Yy0+aXJxX2FjdGl2ZSA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3VpZShzdHJ1Y3QgcnRjX2RldmljZSAqcnRjKQoreworCXN0cnVjdCBydGNfdGltZSB0bTsKKwlpbnQgZXJyOworCisJZXJyID0gcnRjX3JlYWRfdGltZSgmcnRjLT5jbGFzc19kZXYsICZ0bSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlzcGluX2xvY2tfaXJxKCZydGMtPmlycV9sb2NrKTsKKwlpZiAoIXJ0Yy0+aXJxX2FjdGl2ZSkgeworCQlydGMtPmlycV9hY3RpdmUgPSAxOworCQlydGMtPnN0b3BfdWllX3BvbGxpbmcgPSAwOworCQlydGMtPm9sZHNlY3MgPSB0bS50bV9zZWM7CisJCXJ0Yy0+dWllX3Rhc2tfYWN0aXZlID0gMTsKKwkJaWYgKHNjaGVkdWxlX3dvcmsoJnJ0Yy0+dWllX3Rhc2spID09IDApCisJCQlydGMtPnVpZV90YXNrX2FjdGl2ZSA9IDA7CisJfQorCXJ0Yy0+aXJxX2RhdGEgPSAwOworCXNwaW5fdW5sb2NrX2lycSgmcnRjLT5pcnFfbG9jayk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTCAqLwogCiBzdGF0aWMgc3NpemVfdAogcnRjX2Rldl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTEyNyw2ICsyMTQsMjggQEAKIAlzdHJ1Y3QgcnRjX3drYWxybSBhbGFybTsKIAl2b2lkIF9fdXNlciAqdWFyZyA9ICh2b2lkIF9fdXNlciAqKSBhcmc7CiAKKwkvKiBjaGVjayB0aGF0IHRoZSBjYWxsZXMgaGFzIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zCisJICogZm9yIGNlcnRhaW4gaW9jdGxzLiBkb2luZyB0aGlzIGNoZWNrIGhlcmUgaXMgdXNlZnVsCisJICogdG8gYXZvaWQgZHVwbGljYXRlIGNvZGUgaW4gZWFjaCBkcml2ZXIuCisJICovCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19FUE9DSF9TRVQ6CisJY2FzZSBSVENfU0VUX1RJTUU6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCWJyZWFrOworCisJY2FzZSBSVENfSVJRUF9TRVQ6CisJCWlmIChhcmcgPiBydGMtPm1heF91c2VyX2ZyZXEgJiYgIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJYnJlYWs7CisKKwljYXNlIFJUQ19QSUVfT046CisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCQlicmVhazsKKwl9CisKIAkvKiBhdm9pZCBjb25mbGljdGluZyBJUlEgdXNlcnMgKi8KIAlpZiAoY21kID09IFJUQ19QSUVfT04gfHwgY21kID09IFJUQ19QSUVfT0ZGIHx8IGNtZCA9PSBSVENfSVJRUF9TRVQpIHsKIAkJc3Bpbl9sb2NrKCZydGMtPmlycV90YXNrX2xvY2spOwpAQCAtMTg1LDkgKzI5NCw2IEBACiAJCWJyZWFrOwogCiAJY2FzZSBSVENfU0VUX1RJTUU6Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKQotCQkJcmV0dXJuIC1FQUNDRVM7Ci0KIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bSwgdWFyZywgc2l6ZW9mKHRtKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMjAzLDEwICszMDksNiBAQAogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmICghY2FwYWJsZShDQVBfU1lTX1RJTUUpKSB7Ci0JCQllcnIgPSAtRUFDQ0VTOwotCQkJYnJlYWs7Ci0JCX0KIAkJcnRjX2Vwb2NoID0gYXJnOwogCQllcnIgPSAwOwogI2VuZGlmCkBAIC0yMzIsNiArMzM0LDE0IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJYnJlYWs7CiAKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJY2FzZSBSVENfVUlFX09GRjoKKwkJY2xlYXJfdWllKHJ0Yyk7CisJCXJldHVybiAwOworCisJY2FzZSBSVENfVUlFX09OOgorCQlyZXR1cm4gc2V0X3VpZShydGMpOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT1RUWTsKIAkJYnJlYWs7CkBAIC0yNDQsNiArMzU0LDkgQEAKIHsKIAlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gdG9fcnRjX2RldmljZShmaWxlLT5wcml2YXRlX2RhdGEpOwogCisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAorCWNsZWFyX3VpZShydGMpOworI2VuZGlmCiAJaWYgKHJ0Yy0+b3BzLT5yZWxlYXNlKQogCQlydGMtPm9wcy0+cmVsZWFzZShydGMtPmNsYXNzX2Rldi5kZXYpOwogCkBAIC0yODQsNiArMzk3LDEwIEBACiAJbXV0ZXhfaW5pdCgmcnRjLT5jaGFyX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGMtPmlycV9sb2NrKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydGMtPmlycV9xdWV1ZSk7CisjaWZkZWYgQ09ORklHX1JUQ19JTlRGX0RFVl9VSUVfRU1VTAorCUlOSVRfV09SSygmcnRjLT51aWVfdGFzaywgcnRjX3VpZV90YXNrLCBydGMpOworCXNldHVwX3RpbWVyKCZydGMtPnVpZV90aW1lciwgcnRjX3VpZV90aW1lciwgKHVuc2lnbmVkIGxvbmcpcnRjKTsKKyNlbmRpZgogCiAJY2Rldl9pbml0KCZydGMtPmNoYXJfZGV2LCAmcnRjX2Rldl9mb3BzKTsKIAlydGMtPmNoYXJfZGV2Lm93bmVyID0gcnRjLT5vd25lcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYyBiL2RyaXZlcnMvcnRjL3J0Yy1kczEzMDcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFmYjkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNy5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogcnRjLWRzMTMwNy5jIC0gUlRDIGRyaXZlciBmb3Igc29tZSBtb3N0bHktY29tcGF0aWJsZSBJMkMgY2hpcHMuCisgKgorICogIENvcHlyaWdodCAoQykgMjAwNSBKYW1lcyBDaGFwbWFuIChkczEzMzcgY29yZSkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorCisKKworLyogV2UgY2FuJ3QgZGV0ZXJtaW5lIHR5cGUgYnkgcHJvYmluZywgYnV0IGlmIHdlIGV4cGVjdCBwcmUtTGludXggY29kZQorICogdG8gaGF2ZSBzZXQgdGhlIGNoaXAgdXAgYXMgYSBjbG9jayAodHVybmluZyBvbiB0aGUgb3NjaWxsYXRvciBhbmQKKyAqIHNldHRpbmcgdGhlIGRhdGUgYW5kIHRpbWUpLCBMaW51eCBjYW4gaWdub3JlIHRoZSBub24tY2xvY2sgZmVhdHVyZXMuCisgKiBUaGF0J3MgYSBuYXR1cmFsIGpvYiBmb3IgYSBmYWN0b3J5IG9yIHJlcGFpciBiZW5jaC4KKyAqCisgKiBJZiB0aGUgSTJDICJmb3JjZSIgbWVjaGFuaXNtIGlzIHVzZWQsIHdlIGFzc3VtZSB0aGUgY2hpcCBpcyBhIGRzMTMzNy4KKyAqIChNdWNoIGJldHRlciB3b3VsZCBiZSBib2FyZC1zcGVjaWZpYyB0YWJsZXMgb2YgSTJDIGRldmljZXMsIGFsb25nIHdpdGgKKyAqIHRoZSBwbGF0Zm9ybV9kYXRhIGRyaXZlcnMgd291bGQgdXNlIHRvIHNvcnQgc3VjaCBpc3N1ZXMgb3V0LikKKyAqLworZW51bSBkc190eXBlIHsKKwl1bmtub3duID0gMCwKKwlkc18xMzA3LAkJLyogb3IgZHMxMzM4LCAuLi4gKi8KKwlkc18xMzM3LAkJLyogb3IgZHMxMzM5LCAuLi4gKi8KKwlkc18xMzQwLAkJLyogb3Igc3QgbTQxdDAwLCAuLi4gKi8KKwkvLyByczVjMzcyIHRvbz8gIGRpZmZlcmVudCBhZGRyZXNzLi4uCit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyAweDY4LCBJMkNfQ0xJRU5UX0VORCB9OworCitJMkNfQ0xJRU5UX0lOU01PRDsKKworCisKKy8qIFJUQyByZWdpc3RlcnMgZG9uJ3QgZGlmZmVyIG11Y2gsIGV4Y2VwdCBmb3IgdGhlIGNlbnR1cnkgZmxhZyAqLworI2RlZmluZSBEUzEzMDdfUkVHX1NFQ1MJCTB4MDAJLyogMDAtNTkgKi8KKyMJZGVmaW5lIERTMTMwN19CSVRfQ0gJCTB4ODAKKyNkZWZpbmUgRFMxMzA3X1JFR19NSU4JCTB4MDEJLyogMDAtNTkgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19IT1VSCQkweDAyCS8qIDAwLTIzLCBvciAxLTEye2FtLHBtfSAqLworIwlkZWZpbmUgRFMxMzQwX0JJVF9DRU5UVVJZX0VOCTB4ODAJLyogaW4gUkVHX0hPVVIgKi8KKyMJZGVmaW5lIERTMTM0MF9CSVRfQ0VOVFVSWQkweDQwCS8qIGluIFJFR19IT1VSICovCisjZGVmaW5lIERTMTMwN19SRUdfV0RBWQkJMHgwMwkvKiAwMS0wNyAqLworI2RlZmluZSBEUzEzMDdfUkVHX01EQVkJCTB4MDQJLyogMDEtMzEgKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19NT05USAkweDA1CS8qIDAxLTEyICovCisjCWRlZmluZSBEUzEzMzdfQklUX0NFTlRVUlkJMHg4MAkvKiBpbiBSRUdfTU9OVEggKi8KKyNkZWZpbmUgRFMxMzA3X1JFR19ZRUFSCQkweDA2CS8qIDAwLTk5ICovCisKKy8qIE90aGVyIHJlZ2lzdGVycyAoY29udHJvbCwgc3RhdHVzLCBhbGFybXMsIHRyaWNrbGUgY2hhcmdlLCBOVlJBTSwgZXRjKQorICogc3RhcnQgYXQgNywgYW5kIHRoZXkgZGlmZmVyIGEgbG90LiBPbmx5IGNvbnRyb2wgYW5kIHN0YXR1cyBtYXR0ZXIgZm9yIFJUQzsKKyAqIGJlIGNhcmVmdWwgdXNpbmcgdGhlbS4KKyAqLworI2RlZmluZSBEUzEzMDdfUkVHX0NPTlRST0wJMHgwNworIwlkZWZpbmUgRFMxMzA3X0JJVF9PVVQJCTB4ODAKKyMJZGVmaW5lIERTMTMwN19CSVRfU1FXRQkJMHgxMAorIwlkZWZpbmUgRFMxMzA3X0JJVF9SUzEJCTB4MDIKKyMJZGVmaW5lIERTMTMwN19CSVRfUlMwCQkweDAxCisjZGVmaW5lIERTMTMzN19SRUdfQ09OVFJPTAkweDBlCisjCWRlZmluZSBEUzEzMzdfQklUX25FT1NDCQkweDgwCisjCWRlZmluZSBEUzEzMzdfQklUX1JTMgkJMHgxMAorIwlkZWZpbmUgRFMxMzM3X0JJVF9SUzEJCTB4MDgKKyMJZGVmaW5lIERTMTMzN19CSVRfSU5UQ04JCTB4MDQKKyMJZGVmaW5lIERTMTMzN19CSVRfQTJJRQkJMHgwMgorIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUlFCQkweDAxCisjZGVmaW5lIERTMTMzN19SRUdfU1RBVFVTCTB4MGYKKyMJZGVmaW5lIERTMTMzN19CSVRfT1NGCQkweDgwCisjCWRlZmluZSBEUzEzMzdfQklUX0EySQkJMHgwMgorIwlkZWZpbmUgRFMxMzM3X0JJVF9BMUkJCTB4MDEKKyNkZWZpbmUgRFMxMzM5X1JFR19UUklDS0xFCTB4MTAKKworCisKK3N0cnVjdCBkczEzMDcgeworCXU4CQkJcmVnX2FkZHI7CisJdTgJCQlyZWdzWzhdOworCWVudW0gZHNfdHlwZQkJdHlwZTsKKwlzdHJ1Y3QgaTJjX21zZwkJbXNnWzJdOworCXN0cnVjdCBpMmNfY2xpZW50CWNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZQkqcnRjOworfTsKKworCitzdGF0aWMgaW50IGRzMTMwN19nZXRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdCkKK3sKKwlzdHJ1Y3QgZHMxMzA3CSpkczEzMDcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQJCXRtcDsKKworCS8qIHJlYWQgdGhlIFJUQyByZWdpc3RlcnMgYWxsIGF0IG9uY2UgKi8KKwlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDc7CisKKwl0bXAgPSBpMmNfdHJhbnNmZXIoZHMxMzA3LT5jbGllbnQuYWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCWlmICh0bXAgIT0gMikgeworCQlkZXZfZXJyKGRldiwgIiVzIGVycm9yICVkXG4iLCAicmVhZCIsIHRtcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWRldl9kYmcoZGV2LCAiJXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkicmVhZCIsCisJCQlkczEzMDctPnJlZ3NbMF0sIGRzMTMwNy0+cmVnc1sxXSwKKwkJCWRzMTMwNy0+cmVnc1syXSwgZHMxMzA3LT5yZWdzWzNdLAorCQkJZHMxMzA3LT5yZWdzWzRdLCBkczEzMDctPnJlZ3NbNV0sCisJCQlkczEzMDctPnJlZ3NbNl0pOworCisJdC0+dG1fc2VjID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19TRUNTXSAmIDB4N2YpOworCXQtPnRtX21pbiA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTUlOXSAmIDB4N2YpOworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdICYgMHgzZjsKKwl0LT50bV9ob3VyID0gQkNEMkJJTih0bXApOworCXQtPnRtX3dkYXkgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX1dEQVldICYgMHgwNykgLSAxOworCXQtPnRtX21kYXkgPSBCQ0QyQklOKGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX01EQVldICYgMHgzZik7CisJdG1wID0gZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTU9OVEhdICYgMHgxZjsKKwl0LT50bV9tb24gPSBCQ0QyQklOKHRtcCkgLSAxOworCisJLyogYXNzdW1lIDIwWVkgbm90IDE5WVksIGFuZCBpZ25vcmUgRFMxMzM3X0JJVF9DRU5UVVJZICovCisJdC0+dG1feWVhciA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfWUVBUl0pICsgMTAwOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkicmVhZCIsIHQtPnRtX3NlYywgdC0+dG1fbWluLAorCQl0LT50bV9ob3VyLCB0LT50bV9tZGF5LAorCQl0LT50bV9tb24sIHQtPnRtX3llYXIsIHQtPnRtX3dkYXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxMzA3X3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0KQoreworCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludAkJcmVzdWx0OworCWludAkJdG1wOworCXU4CQkqYnVmID0gZHMxMzA3LT5yZWdzOworCisJZGV2X2RiZyhkZXYsICIlcyBzZWNzPSVkLCBtaW5zPSVkLCAiCisJCSJob3Vycz0lZCwgbWRheT0lZCwgbW9uPSVkLCB5ZWFyPSVkLCB3ZGF5PSVkXG4iLAorCQkid3JpdGUiLCBkdC0+dG1fc2VjLCBkdC0+dG1fbWluLAorCQlkdC0+dG1faG91ciwgZHQtPnRtX21kYXksCisJCWR0LT50bV9tb24sIGR0LT50bV95ZWFyLCBkdC0+dG1fd2RheSk7CisKKwkqYnVmKysgPSAwOwkJLyogZmlyc3QgcmVnaXN0ZXIgYWRkciAqLworCWJ1ZltEUzEzMDdfUkVHX1NFQ1NdID0gQklOMkJDRCh0LT50bV9zZWMpOworCWJ1ZltEUzEzMDdfUkVHX01JTl0gPSBCSU4yQkNEKHQtPnRtX21pbik7CisJYnVmW0RTMTMwN19SRUdfSE9VUl0gPSBCSU4yQkNEKHQtPnRtX2hvdXIpOworCWJ1ZltEUzEzMDdfUkVHX1dEQVldID0gQklOMkJDRCh0LT50bV93ZGF5ICsgMSk7CisJYnVmW0RTMTMwN19SRUdfTURBWV0gPSBCSU4yQkNEKHQtPnRtX21kYXkpOworCWJ1ZltEUzEzMDdfUkVHX01PTlRIXSA9IEJJTjJCQ0QodC0+dG1fbW9uICsgMSk7CisKKwkvKiBhc3N1bWUgMjBZWSBub3QgMTlZWSAqLworCXRtcCA9IHQtPnRtX3llYXIgLSAxMDA7CisJYnVmW0RTMTMwN19SRUdfWUVBUl0gPSBCSU4yQkNEKHRtcCk7CisKKwlpZiAoZHMxMzA3LT50eXBlID09IGRzXzEzMzcpCisJCWJ1ZltEUzEzMDdfUkVHX01PTlRIXSB8PSBEUzEzMzdfQklUX0NFTlRVUlk7CisJZWxzZSBpZiAoZHMxMzA3LT50eXBlID09IGRzXzEzNDApCisJCWJ1ZltEUzEzMDdfUkVHX0hPVVJdIHw9IERTMTM0MF9CSVRfQ0VOVFVSWV9FTgorCQkJCXwgRFMxMzQwX0JJVF9DRU5UVVJZOworCisJZHMxMzA3LT5tc2dbMV0uZmxhZ3MgPSAwOworCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDg7CisKKwlkZXZfZGJnKGRldiwgIiVzOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkid3JpdGUiLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCWJ1Zls0XSwgYnVmWzVdLCBidWZbNl0pOworCisJcmVzdWx0ID0gaTJjX3RyYW5zZmVyKGRzMTMwNy0+Y2xpZW50LmFkYXB0ZXIsICZkczEzMDctPm1zZ1sxXSwgMSk7CisJaWYgKHJlc3VsdCAhPSAxKSB7CisJCWRldl9lcnIoZGV2LCAiJXMgZXJyb3IgJWRcbiIsICJ3cml0ZSIsIHRtcCk7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTN4eF9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczEzMDdfZ2V0X3RpbWUsCisJLnNldF90aW1lCT0gZHMxMzA3X3NldF90aW1lLAorfTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGRzMTMwN19kcml2ZXI7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0CitkczEzMDdfZGV0ZWN0KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MsIGludCBraW5kKQoreworCXN0cnVjdCBkczEzMDcJCSpkczEzMDc7CisJaW50CQkJZXJyID0gLUVOT0RFVjsKKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCWludAkJCXRtcDsKKworCWlmICghKGRzMTMwNyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkczEzMDcpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0OworCX0KKworCWNsaWVudCA9ICZkczEzMDctPmNsaWVudDsKKwljbGllbnQtPmFkZHIgPSBhZGRyZXNzOworCWNsaWVudC0+YWRhcHRlciA9IGFkYXB0ZXI7CisJY2xpZW50LT5kcml2ZXIgPSAmZHMxMzA3X2RyaXZlcjsKKwljbGllbnQtPmZsYWdzID0gMDsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRzMTMwNyk7CisKKwlkczEzMDctPm1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOworCWRzMTMwNy0+bXNnWzBdLmZsYWdzID0gMDsKKwlkczEzMDctPm1zZ1swXS5sZW4gPSAxOworCWRzMTMwNy0+bXNnWzBdLmJ1ZiA9ICZkczEzMDctPnJlZ19hZGRyOworCisJZHMxMzA3LT5tc2dbMV0uYWRkciA9IGNsaWVudC0+YWRkcjsKKwlkczEzMDctPm1zZ1sxXS5mbGFncyA9IEkyQ19NX1JEOworCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOworCWRzMTMwNy0+bXNnWzFdLmJ1ZiA9IGRzMTMwNy0+cmVnczsKKworCS8qIEhBQ0s6ICJmb3JjZSIgaW1wbGllcyAibmVlZHMgZHMxMzM3LXN0eWxlLW9zY2lsbGF0b3Igc2V0dXAiICovCisJaWYgKGtpbmQgPj0gMCkgeworCQlkczEzMDctPnR5cGUgPSBkc18xMzM3OworCisJCWRzMTMwNy0+cmVnX2FkZHIgPSBEUzEzMzdfUkVHX0NPTlRST0w7CisJCWRzMTMwNy0+bXNnWzFdLmxlbiA9IDI7CisKKwkJdG1wID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgZHMxMzA3LT5tc2csIDIpOworCQlpZiAodG1wICE9IDIpIHsKKwkJCXByX2RlYnVnKCJyZWFkIGVycm9yICVkXG4iLCB0bXApOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXhpdF9mcmVlOworCQl9CisKKwkJZHMxMzA3LT5yZWdfYWRkciA9IDA7CisJCWRzMTMwNy0+bXNnWzFdLmxlbiA9IHNpemVvZihkczEzMDctPnJlZ3MpOworCisJCS8qIG9zY2lsbGF0b3IgaXMgb2ZmOyBuZWVkIHRvIHR1cm4gaXQgb24gKi8KKwkJaWYgKChkczEzMDctPnJlZ3NbMF0gJiBEUzEzMzdfQklUX25FT1NDKQorCQkJCXx8IChkczEzMDctPnJlZ3NbMV0gJiBEUzEzMzdfQklUX09TRikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibm8gZHMxMzM3IG9zY2lsbGF0b3IgY29kZVxuIik7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCX0gZWxzZQorCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OworCityZWFkX3J0YzoKKwkvKiByZWFkIFJUQyByZWdpc3RlcnMgKi8KKworCXRtcCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIGRzMTMwNy0+bXNnLCAyKTsKKwlpZiAodG1wICE9IDIpIHsKKwkJcHJfZGVidWcoInJlYWQgZXJyb3IgJWRcbiIsIHRtcCk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXhpdF9mcmVlOworCX0KKworCS8qIG1pbmltYWwgc2FuaXR5IGNoZWNraW5nOyBzb21lIGNoaXBzIChsaWtlIERTMTM0MCkgZG9uJ3QKKwkgKiBzcGVjaWZ5IHRoZSBleHRyYSBiaXRzIGFzIG11c3QtYmUtemVybywgYnV0IHRoZXJlIGFyZQorCSAqIHN0aWxsIGEgZmV3IHZhbHVlcyB0aGF0IGFyZSBjbGVhcmx5IG91dC1vZi1yYW5nZS4KKwkgKi8KKwl0bXAgPSBkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19TRUNTXTsKKwlpZiAodG1wICYgRFMxMzA3X0JJVF9DSCkgeworCQlpZiAoZHMxMzA3LT50eXBlICYmIGRzMTMwNy0+dHlwZSAhPSBkc18xMzA3KSB7CisJCQlwcl9kZWJ1Zygibm90IGEgZHMxMzA3P1xuIik7CisJCQlnb3RvIGV4aXRfZnJlZTsKKwkJfQorCQlkczEzMDctPnR5cGUgPSBkc18xMzA3OworCisJCS8qIHRoaXMgcGFydGlhbCBpbml0aWFsaXphdGlvbiBzaG91bGQgd29yayBmb3IgZHMxMzA3LAorCQkgKiBkczEzMzgsIGRzMTM0MCwgc3QgbTQxdDAwLCBhbmQgbW9yZS4KKwkJICovCisJCWRldl93YXJuKCZjbGllbnQtPmRldiwgIm9zY2lsbGF0b3Igc3RhcnRlZDsgU0VUIFRJTUUhXG4iKTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIDAsIDApOworCQlnb3RvIHJlYWRfcnRjOworCX0KKwl0bXAgPSBCQ0QyQklOKHRtcCAmIDB4N2YpOworCWlmICh0bXAgPiA2MCkKKwkJZ290byBleGl0X2ZyZWU7CisJdG1wID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NSU5dICYgMHg3Zik7CisJaWYgKHRtcCA+IDYwKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCXRtcCA9IEJDRDJCSU4oZHMxMzA3LT5yZWdzW0RTMTMwN19SRUdfTURBWV0gJiAweDNmKTsKKwlpZiAodG1wID09IDAgfHwgdG1wID4gMzEpCisJCWdvdG8gZXhpdF9mcmVlOworCisJdG1wID0gQkNEMkJJTihkczEzMDctPnJlZ3NbRFMxMzA3X1JFR19NT05USF0gJiAweDFmKTsKKwlpZiAodG1wID09IDAgfHwgdG1wID4gMTIpCisJCWdvdG8gZXhpdF9mcmVlOworCisJLyogZm9yY2UgaW50byBpbiAyNCBob3VyIG1vZGUgKG1vc3QgY2hpcHMpIG9yCisJICogZGlzYWJsZSBjZW50dXJ5IGJpdCAoZHMxMzQwKQorCSAqLworCXRtcCA9IGRzMTMwNy0+cmVnc1tEUzEzMDdfUkVHX0hPVVJdOworCWlmICh0bXAgJiAoMSA8PCA2KSkgeworCQlpZiAodG1wICYgKDEgPDwgNSkpCisJCQl0bXAgPSBCQ0QyQklOKHRtcCAmIDB4MWYpICsgMTI7CisJCWVsc2UKKwkJCXRtcCA9IEJDRDJCSU4odG1wKTsKKwkJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJRFMxMzA3X1JFR19IT1VSLAorCQkJCUJJTjJCQ0QodG1wKSk7CisJfQorCisJLyogRklYTUUgY2hpcHMgbGlrZSAxMzM3IGNhbiBnZW5lcmF0ZSBhbGFybSBpcnFzIHRvbzsgdGhvc2UgYXJlCisJICogd29ydGggZXhwb3NpbmcgdGhyb3VnaCB0aGUgQVBJIChlc3BlY2lhbGx5IHdoZW4gdGhlIGlycSBpcworCSAqIHdha2V1cC1jYXBhYmxlKS4KKwkgKi8KKworCXN3aXRjaCAoZHMxMzA3LT50eXBlKSB7CisJY2FzZSB1bmtub3duOgorCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgInVua25vd24iLCBJMkNfTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisJY2FzZSBkc18xMzA3OgorCQlzdHJsY3B5KGNsaWVudC0+bmFtZSwgImRzMTMwNyIsIEkyQ19OQU1FX1NJWkUpOworCQlicmVhazsKKwljYXNlIGRzXzEzMzc6CisJCXN0cmxjcHkoY2xpZW50LT5uYW1lLCAiZHMxMzM3IiwgSTJDX05BTUVfU0laRSk7CisJCWJyZWFrOworCWNhc2UgZHNfMTM0MDoKKwkJc3RybGNweShjbGllbnQtPm5hbWUsICJkczEzNDAiLCBJMkNfTkFNRV9TSVpFKTsKKwkJYnJlYWs7CisJfQorCisJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KSkpCisJCWdvdG8gZXhpdF9mcmVlOworCisJZHMxMzA3LT5ydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKGNsaWVudC0+bmFtZSwgJmNsaWVudC0+ZGV2LAorCQkJCSZkczEzeHhfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIoZHMxMzA3LT5ydGMpKSB7CisJCWVyciA9IFBUUl9FUlIoZHMxMzA3LT5ydGMpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJ1bmFibGUgdG8gcmVnaXN0ZXIgdGhlIGNsYXNzIGRldmljZVxuIik7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCisJcmV0dXJuIDA7CisKK2V4aXRfZGV0YWNoOgorCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZHMxMzA3KTsKK2V4aXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQKK2RzMTMwN19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19JMkMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJjX3Byb2JlKGFkYXB0ZXIsICZhZGRyX2RhdGEsIGRzMTMwN19kZXRlY3QpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBkczEzMDdfZGV0YWNoX2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludAkJZXJyOworCXN0cnVjdCBkczEzMDcJKmRzMTMwNyA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJcnRjX2RldmljZV91bnJlZ2lzdGVyKGRzMTMwNy0+cnRjKTsKKwlpZiAoKGVyciA9IGkyY19kZXRhY2hfY2xpZW50KGNsaWVudCkpKQorCQlyZXR1cm4gZXJyOworCWtmcmVlKGRzMTMwNyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBkczEzMDdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gImRzMTMwNyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLmF0dGFjaF9hZGFwdGVyCT0gZHMxMzA3X2F0dGFjaF9hZGFwdGVyLAorCS5kZXRhY2hfY2xpZW50CT0gX19kZXZleGl0X3AoZHMxMzA3X2RldGFjaF9jbGllbnQpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxMzA3X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmRzMTMwN19kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZHMxMzA3X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZHMxMzA3X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZHMxMzA3X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkczEzMDdfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUlRDIGRyaXZlciBmb3IgRFMxMzA3IGFuZCBzaW1pbGFyIGNoaXBzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNTUzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhZmJhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1kczE1NTMuYwpAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIEFuIHJ0YyBkcml2ZXIgZm9yIHRoZSBEYWxsYXMgRFMxNTUzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEF0c3VzaGkgTmVtb3RvIDxhbmVtb0BtYmEub2NuLm5lLmpwPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEiCisKKyNkZWZpbmUgUlRDX1JFR19TSVpFCQkweDIwMDAKKyNkZWZpbmUgUlRDX09GRlNFVAkJMHgxZmYwCisKKyNkZWZpbmUgUlRDX0ZMQUdTCQkoUlRDX09GRlNFVCArIDApCisjZGVmaW5lIFJUQ19TRUNPTkRTX0FMQVJNCShSVENfT0ZGU0VUICsgMikKKyNkZWZpbmUgUlRDX01JTlVURVNfQUxBUk0JKFJUQ19PRkZTRVQgKyAzKQorI2RlZmluZSBSVENfSE9VUlNfQUxBUk0JCShSVENfT0ZGU0VUICsgNCkKKyNkZWZpbmUgUlRDX0RBVEVfQUxBUk0JCShSVENfT0ZGU0VUICsgNSkKKyNkZWZpbmUgUlRDX0lOVEVSUlVQVFMJCShSVENfT0ZGU0VUICsgNikKKyNkZWZpbmUgUlRDX1dBVENIRE9HCQkoUlRDX09GRlNFVCArIDcpCisjZGVmaW5lIFJUQ19DT05UUk9MCQkoUlRDX09GRlNFVCArIDgpCisjZGVmaW5lIFJUQ19DRU5UVVJZCQkoUlRDX09GRlNFVCArIDgpCisjZGVmaW5lIFJUQ19TRUNPTkRTCQkoUlRDX09GRlNFVCArIDkpCisjZGVmaW5lIFJUQ19NSU5VVEVTCQkoUlRDX09GRlNFVCArIDEwKQorI2RlZmluZSBSVENfSE9VUlMJCShSVENfT0ZGU0VUICsgMTEpCisjZGVmaW5lIFJUQ19EQVkJCQkoUlRDX09GRlNFVCArIDEyKQorI2RlZmluZSBSVENfREFURQkJKFJUQ19PRkZTRVQgKyAxMykKKyNkZWZpbmUgUlRDX01PTlRICQkoUlRDX09GRlNFVCArIDE0KQorI2RlZmluZSBSVENfWUVBUgkJKFJUQ19PRkZTRVQgKyAxNSkKKworI2RlZmluZSBSVENfQ0VOVFVSWV9NQVNLCTB4M2YKKyNkZWZpbmUgUlRDX1NFQ09ORFNfTUFTSwkweDdmCisjZGVmaW5lIFJUQ19EQVlfTUFTSwkJMHgwNworCisvKiBCaXRzIGluIHRoZSBDb250cm9sL0NlbnR1cnkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1dSSVRFCQkweDgwCisjZGVmaW5lIFJUQ19SRUFECQkweDQwCisKKy8qIEJpdHMgaW4gdGhlIFNlY29uZHMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX1NUT1AJCTB4ODAKKworLyogQml0cyBpbiB0aGUgRmxhZ3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUlRDX0ZMQUdTX0FGCQkweDQwCisjZGVmaW5lIFJUQ19GTEFHU19CTEYJCTB4MTAKKworLyogQml0cyBpbiB0aGUgSW50ZXJydXB0cyByZWdpc3RlciAqLworI2RlZmluZSBSVENfSU5UU19BRQkJMHg4MAorCitzdHJ1Y3QgcnRjX3BsYXRfZGF0YSB7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsKKwl1bnNpZ25lZCBsb25nIGJhc2VhZGRyOworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCWludCBpcnE7CisJdW5zaWduZWQgaW50IGlycWVuOworCWludCBhbHJtX3NlYzsKKwlpbnQgYWxybV9taW47CisJaW50IGFscm1faG91cjsKKwlpbnQgYWxybV9tZGF5OworfTsKKworc3RhdGljIGludCBkczE1NTNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXU4IGNlbnR1cnk7CisKKwljZW50dXJ5ID0gQklOMkJDRCgodG0tPnRtX3llYXIgKyAxOTAwKSAvIDEwMCk7CisKKwl3cml0ZWIoUlRDX1dSSVRFLCBwZGF0YS0+aW9hZGRyICsgUlRDX0NPTlRST0wpOworCisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3llYXIgJSAxMDApLCBpb2FkZHIgKyBSVENfWUVBUik7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21vbiArIDEpLCBpb2FkZHIgKyBSVENfTU9OVEgpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV93ZGF5KSAmIFJUQ19EQVlfTUFTSywgaW9hZGRyICsgUlRDX0RBWSk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX21kYXkpLCBpb2FkZHIgKyBSVENfREFURSk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX2hvdXIpLCBpb2FkZHIgKyBSVENfSE9VUlMpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9taW4pLCBpb2FkZHIgKyBSVENfTUlOVVRFUyk7CisJd3JpdGViKEJJTjJCQ0QodG0tPnRtX3NlYykgJiBSVENfU0VDT05EU19NQVNLLCBpb2FkZHIgKyBSVENfU0VDT05EUyk7CisKKwkvKiBSVENfQ0VOVFVSWSBhbmQgUlRDX0NPTlRST0wgc2hhcmUgc2FtZSByZWdpc3RlciAqLworCXdyaXRlYihSVENfV1JJVEUgfCAoY2VudHVyeSAmIFJUQ19DRU5UVVJZX01BU0spLCBpb2FkZHIgKyBSVENfQ0VOVFVSWSk7CisJd3JpdGViKGNlbnR1cnkgJiBSVENfQ0VOVFVSWV9NQVNLLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHMxNTUzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdW5zaWduZWQgaW50IHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB3ZWVrOworCXVuc2lnbmVkIGludCBjZW50dXJ5OworCisJLyogZ2l2ZSBlbm91Z2ggdGltZSB0byB1cGRhdGUgUlRDIGluIGNhc2Ugb2YgY29udGludW91cyByZWFkICovCisJaWYgKHBkYXRhLT5sYXN0X2ppZmZpZXMgPT0gamlmZmllcykKKwkJbXNsZWVwKDEpOworCXBkYXRhLT5sYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCXdyaXRlYihSVENfUkVBRCwgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXNlY29uZCA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKSAmIFJUQ19TRUNPTkRTX01BU0s7CisJbWludXRlID0gcmVhZGIoaW9hZGRyICsgUlRDX01JTlVURVMpOworCWhvdXIgPSByZWFkYihpb2FkZHIgKyBSVENfSE9VUlMpOworCWRheSA9IHJlYWRiKGlvYWRkciArIFJUQ19EQVRFKTsKKwl3ZWVrID0gcmVhZGIoaW9hZGRyICsgUlRDX0RBWSkgJiBSVENfREFZX01BU0s7CisJbW9udGggPSByZWFkYihpb2FkZHIgKyBSVENfTU9OVEgpOworCXllYXIgPSByZWFkYihpb2FkZHIgKyBSVENfWUVBUik7CisJY2VudHVyeSA9IHJlYWRiKGlvYWRkciArIFJUQ19DRU5UVVJZKSAmIFJUQ19DRU5UVVJZX01BU0s7CisJd3JpdGViKDAsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwl0bS0+dG1fc2VjID0gQkNEMkJJTihzZWNvbmQpOworCXRtLT50bV9taW4gPSBCQ0QyQklOKG1pbnV0ZSk7CisJdG0tPnRtX2hvdXIgPSBCQ0QyQklOKGhvdXIpOworCXRtLT50bV9tZGF5ID0gQkNEMkJJTihkYXkpOworCXRtLT50bV93ZGF5ID0gQkNEMkJJTih3ZWVrKTsKKwl0bS0+dG1fbW9uID0gQkNEMkJJTihtb250aCkgLSAxOworCS8qIHllYXIgaXMgMTkwMCArIHRtLT50bV95ZWFyICovCisJdG0tPnRtX3llYXIgPSBCQ0QyQklOKHllYXIpICsgQkNEMkJJTihjZW50dXJ5KSAqIDEwMCAtIDE5MDA7CisKKwlpZiAocnRjX3ZhbGlkX3RtKHRtKSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJyZXRyaWV2ZWQgZGF0ZS90aW1lIGlzIG5vdCB2YWxpZC5cbiIpOworCQlydGNfdGltZV90b190bSgwLCB0bSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEpCit7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKKwl3cml0ZWIocGRhdGEtPmFscm1fbWRheSA8IDAgfHwgKHBkYXRhLT5pcnFlbiAmIFJUQ19VRikgPworCSAgICAgICAweDgwIDogQklOMkJDRChwZGF0YS0+YWxybV9tZGF5KSwKKwkgICAgICAgaW9hZGRyICsgUlRDX0RBVEVfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9ob3VyIDwgMCB8fCAocGRhdGEtPmlycWVuICYgUlRDX1VGKSA/CisJICAgICAgIDB4ODAgOiBCSU4yQkNEKHBkYXRhLT5hbHJtX2hvdXIpLAorCSAgICAgICBpb2FkZHIgKyBSVENfSE9VUlNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9taW4gPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IEJJTjJCQ0QocGRhdGEtPmFscm1fbWluKSwKKwkgICAgICAgaW9hZGRyICsgUlRDX01JTlVURVNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+YWxybV9zZWMgPCAwIHx8IChwZGF0YS0+aXJxZW4gJiBSVENfVUYpID8KKwkgICAgICAgMHg4MCA6IEJJTjJCQ0QocGRhdGEtPmFscm1fc2VjKSwKKwkgICAgICAgaW9hZGRyICsgUlRDX1NFQ09ORFNfQUxBUk0pOworCXdyaXRlYihwZGF0YS0+aXJxZW4gPyBSVENfSU5UU19BRSA6IDAsIGlvYWRkciArIFJUQ19JTlRFUlJVUFRTKTsKKwlyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpOwkvKiBjbGVhciBpbnRlcnJ1cHRzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRhdGEtPnJ0Yy0+aXJxX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGF0YS0+aXJxIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcGRhdGEtPmFscm1fbWRheSA9IGFscm0tPnRpbWUudG1fbWRheTsKKwlwZGF0YS0+YWxybV9ob3VyID0gYWxybS0+dGltZS50bV9ob3VyOworCXBkYXRhLT5hbHJtX21pbiA9IGFscm0tPnRpbWUudG1fbWluOworCXBkYXRhLT5hbHJtX3NlYyA9IGFscm0tPnRpbWUudG1fc2VjOworCWlmIChhbHJtLT5lbmFibGVkKQorCQlwZGF0YS0+aXJxZW4gfD0gUlRDX0FGOworCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkczE1NTNfcnRjX3JlYWRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxybSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWFscm0tPnRpbWUudG1fbWRheSA9IHBkYXRhLT5hbHJtX21kYXkgPCAwID8gMCA6IHBkYXRhLT5hbHJtX21kYXk7CisJYWxybS0+dGltZS50bV9ob3VyID0gcGRhdGEtPmFscm1faG91ciA8IDAgPyAwIDogcGRhdGEtPmFscm1faG91cjsKKwlhbHJtLT50aW1lLnRtX21pbiA9IHBkYXRhLT5hbHJtX21pbiA8IDAgPyAwIDogcGRhdGEtPmFscm1fbWluOworCWFscm0tPnRpbWUudG1fc2VjID0gcGRhdGEtPmFscm1fc2VjIDwgMCA/IDAgOiBwZGF0YS0+YWxybV9zZWM7CisJYWxybS0+ZW5hYmxlZCA9IChwZGF0YS0+aXJxZW4gJiBSVENfQUYpID8gMSA6IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkczE1NTNfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkZXZfaWQ7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXVuc2lnbmVkIGxvbmcgZXZlbnRzID0gUlRDX0lSUUY7CisKKwkvKiByZWFkIGFuZCBjbGVhciBpbnRlcnJ1cHQgKi8KKwlpZiAoIShyZWFkYihpb2FkZHIgKyBSVENfRkxBR1MpICYgUlRDX0ZMQUdTX0FGKSkKKwkJcmV0dXJuIElSUV9OT05FOworCWlmIChyZWFkYihpb2FkZHIgKyBSVENfU0VDT05EU19BTEFSTSkgJiAweDgwKQorCQlldmVudHMgfD0gUlRDX1VGOworCWVsc2UKKwkJZXZlbnRzIHw9IFJUQ19BRjsKKwlydGNfdXBkYXRlX2lycSgmcGRhdGEtPnJ0Yy0+Y2xhc3NfZGV2LCAxLCBldmVudHMpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgZHMxNTUzX3J0Y19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJCXBkYXRhLT5pcnFlbiA9IDA7CisJCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHMxNTUzX3J0Y19pb2N0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHBkYXRhLT5pcnEgPCAwKQorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBSVENfQUlFX09GRjoKKwkJcGRhdGEtPmlycWVuICY9IH5SVENfQUY7CisJCWRzMTU1M19ydGNfdXBkYXRlX2FsYXJtKHBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBSVENfQUlFX09OOgorCQlwZGF0YS0+aXJxZW4gfD0gUlRDX0FGOworCQlkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PRkY6CisJCXBkYXRhLT5pcnFlbiAmPSB+UlRDX1VGOworCQlkczE1NTNfcnRjX3VwZGF0ZV9hbGFybShwZGF0YSk7CisJCWJyZWFrOworCWNhc2UgUlRDX1VJRV9PTjoKKwkJcGRhdGEtPmlycWVuIHw9IFJUQ19VRjsKKwkJZHMxNTUzX3J0Y191cGRhdGVfYWxhcm0ocGRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTU1M19ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczE1NTNfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczE1NTNfcnRjX3NldF90aW1lLAorCS5yZWFkX2FsYXJtCT0gZHMxNTUzX3J0Y19yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0JPSBkczE1NTNfcnRjX3NldF9hbGFybSwKKwkucmVsZWFzZQk9IGRzMTU1M19ydGNfcmVsZWFzZSwKKwkuaW9jdGwJCT0gZHMxNTUzX3J0Y19pb2N0bCwKK307CisKK3N0YXRpYyBzc2l6ZV90IGRzMTU1M19udnJhbV9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkJIGxvZmZfdCBwb3MsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPQorCQl0b19wbGF0Zm9ybV9kZXZpY2UoY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopKTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJc3NpemVfdCBjb3VudDsKKworCWZvciAoY291bnQgPSAwOyBzaXplID4gMCAmJiBwb3MgPCBSVENfT0ZGU0VUOyBjb3VudCsrLCBzaXplLS0pCisJCSpidWYrKyA9IHJlYWRiKGlvYWRkciArIHBvcysrKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRzMTU1M19udnJhbV93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLAorCQkJCSAgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CisJCXRvX3BsYXRmb3JtX2RldmljZShjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwlzc2l6ZV90IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJUQ19PRkZTRVQ7IGNvdW50KyssIHNpemUtLSkKKwkJd3JpdGViKCpidWYrKywgaW9hZGRyICsgcG9zKyspOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGRzMTU1M19udnJhbV9hdHRyID0geworCS5hdHRyID0geworCQkubmFtZSA9ICJudnJhbSIsCisJCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVR08sCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnNpemUgPSBSVENfT0ZGU0VULAorCS5yZWFkID0gZHMxNTUzX252cmFtX3JlYWQsCisJLndyaXRlID0gZHMxNTUzX252cmFtX3dyaXRlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZHMxNTUzX3J0Y19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgaW50IGNlbiwgc2VjOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IE5VTEw7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBOVUxMOworCWludCByZXQgPSAwOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGRhdGEgPSBremFsbG9jKHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwZGF0YS0+aXJxID0gLTE7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgUlRDX1JFR19TSVpFLCBwZGV2LT5uYW1lKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+YmFzZWFkZHIgPSByZXMtPnN0YXJ0OworCWlvYWRkciA9IGlvcmVtYXAocGRhdGEtPmJhc2VhZGRyLCBSVENfUkVHX1NJWkUpOworCWlmICghaW9hZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwZGF0YS0+aW9hZGRyID0gaW9hZGRyOworCXBkYXRhLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCisJLyogdHVybiBSVEMgb24gaWYgaXQgd2FzIG5vdCBvbiAqLworCXNlYyA9IHJlYWRiKGlvYWRkciArIFJUQ19TRUNPTkRTKTsKKwlpZiAoc2VjICYgUlRDX1NUT1ApIHsKKwkJc2VjICY9IFJUQ19TRUNPTkRTX01BU0s7CisJCWNlbiA9IHJlYWRiKGlvYWRkciArIFJUQ19DRU5UVVJZKSAmIFJUQ19DRU5UVVJZX01BU0s7CisJCXdyaXRlYihSVENfV1JJVEUsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwkJd3JpdGViKHNlYywgaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCQl3cml0ZWIoY2VuICYgUlRDX0NFTlRVUllfTUFTSywgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCX0KKwlpZiAocmVhZGIoaW9hZGRyICsgUlRDX0ZMQUdTKSAmIFJUQ19GTEFHU19CTEYpCisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJ2b2x0YWdlLWxvdyBkZXRlY3RlZC5cbiIpOworCisJaWYgKHBkYXRhLT5pcnEgPj0gMCkgeworCQl3cml0ZWIoMCwgaW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOworCQlpZiAocmVxdWVzdF9pcnEocGRhdGEtPmlycSwgZHMxNTUzX3J0Y19pbnRlcnJ1cHQsIFNBX1NISVJRLAorCQkJCXBkZXYtPm5hbWUsIHBkZXYpIDwgMCkgeworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImludGVycnVwdCBub3QgYXZhaWxhYmxlLlxuIik7CisJCQlwZGF0YS0+aXJxID0gLTE7CisJCX0KKwl9CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJICAmZHMxNTUzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIG91dDsKKwl9CisJcGRhdGEtPnJ0YyA9IHJ0YzsKKwlwZGF0YS0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTU1M19udnJhbV9hdHRyKTsKKwlyZXR1cm4gMDsKKyBvdXQ6CisJaWYgKHBkYXRhLT5pcnEgPj0gMCkKKwkJZnJlZV9pcnEocGRhdGEtPmlycSwgcGRldik7CisJaWYgKGlvYWRkcikKKwkJaW91bm1hcChpb2FkZHIpOworCWlmIChwZGF0YS0+YmFzZWFkZHIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJa2ZyZWUocGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTU1M19ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNTUzX252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlpZiAocGRhdGEtPmlycSA+PSAwKSB7CisJCXdyaXRlYigwLCBwZGF0YS0+aW9hZGRyICsgUlRDX0lOVEVSUlVQVFMpOworCQlmcmVlX2lycShwZGF0YS0+aXJxLCBwZGV2KTsKKwl9CisJaW91bm1hcChwZGF0YS0+aW9hZGRyKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGRhdGEtPmJhc2VhZGRyLCBSVENfUkVHX1NJWkUpOworCWtmcmVlKHBkYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHMxNTUzX3J0Y19kcml2ZXIgPSB7CisJLnByb2JlCQk9IGRzMTU1M19ydGNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkczE1NTNfcnRjX3JlbW92ZSksCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImRzMTU1MyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgX19pbml0IGludCBkczE1NTNfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzMTU1M19ydGNfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGRzMTU1M19leGl0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkczE1NTNfcnRjX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGRzMTU1M19pbml0KTsKK21vZHVsZV9leGl0KGRzMTU1M19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQXRzdXNoaSBOZW1vdG8gPGFuZW1vQG1iYS5vY24ubmUuanA+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRhbGxhcyBEUzE1NTMgUlRDIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTc0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDdlNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtZHMxNzQyLmMKQEAgLTAsMCArMSwyNTkgQEAKKy8qCisgKiBBbiBydGMgZHJpdmVyIGZvciB0aGUgRGFsbGFzIERTMTc0MgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBEUlZfVkVSU0lPTiAiMC4xIgorCisjZGVmaW5lIFJUQ19SRUdfU0laRQkJMHg4MDAKKyNkZWZpbmUgUlRDX09GRlNFVAkJMHg3ZjgKKworI2RlZmluZSBSVENfQ09OVFJPTAkJKFJUQ19PRkZTRVQgKyAwKQorI2RlZmluZSBSVENfQ0VOVFVSWQkJKFJUQ19PRkZTRVQgKyAwKQorI2RlZmluZSBSVENfU0VDT05EUwkJKFJUQ19PRkZTRVQgKyAxKQorI2RlZmluZSBSVENfTUlOVVRFUwkJKFJUQ19PRkZTRVQgKyAyKQorI2RlZmluZSBSVENfSE9VUlMJCShSVENfT0ZGU0VUICsgMykKKyNkZWZpbmUgUlRDX0RBWQkJCShSVENfT0ZGU0VUICsgNCkKKyNkZWZpbmUgUlRDX0RBVEUJCShSVENfT0ZGU0VUICsgNSkKKyNkZWZpbmUgUlRDX01PTlRICQkoUlRDX09GRlNFVCArIDYpCisjZGVmaW5lIFJUQ19ZRUFSCQkoUlRDX09GRlNFVCArIDcpCisKKyNkZWZpbmUgUlRDX0NFTlRVUllfTUFTSwkweDNmCisjZGVmaW5lIFJUQ19TRUNPTkRTX01BU0sJMHg3ZgorI2RlZmluZSBSVENfREFZX01BU0sJCTB4MDcKKworLyogQml0cyBpbiB0aGUgQ29udHJvbC9DZW50dXJ5IHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19XUklURQkJMHg4MAorI2RlZmluZSBSVENfUkVBRAkJMHg0MAorCisvKiBCaXRzIGluIHRoZSBTZWNvbmRzIHJlZ2lzdGVyICovCisjZGVmaW5lIFJUQ19TVE9QCQkweDgwCisKKy8qIEJpdHMgaW4gdGhlIERheSByZWdpc3RlciAqLworI2RlZmluZSBSVENfQkFUVF9GTEFHCQkweDgwCisKK3N0cnVjdCBydGNfcGxhdF9kYXRhIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXZvaWQgX19pb21lbSAqaW9hZGRyOworCXVuc2lnbmVkIGxvbmcgYmFzZWFkZHI7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ppZmZpZXM7Cit9OworCitzdGF0aWMgaW50IGRzMTc0Ml9ydGNfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CisJdTggY2VudHVyeTsKKworCWNlbnR1cnkgPSBCSU4yQkNEKCh0bS0+dG1feWVhciArIDE5MDApIC8gMTAwKTsKKworCXdyaXRlYihSVENfV1JJVEUsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKworCXdyaXRlYihCSU4yQkNEKHRtLT50bV95ZWFyICUgMTAwKSwgaW9hZGRyICsgUlRDX1lFQVIpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tb24gKyAxKSwgaW9hZGRyICsgUlRDX01PTlRIKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fd2RheSkgJiBSVENfREFZX01BU0ssIGlvYWRkciArIFJUQ19EQVkpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9tZGF5KSwgaW9hZGRyICsgUlRDX0RBVEUpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9ob3VyKSwgaW9hZGRyICsgUlRDX0hPVVJTKTsKKwl3cml0ZWIoQklOMkJDRCh0bS0+dG1fbWluKSwgaW9hZGRyICsgUlRDX01JTlVURVMpOworCXdyaXRlYihCSU4yQkNEKHRtLT50bV9zZWMpICYgUlRDX1NFQ09ORFNfTUFTSywgaW9hZGRyICsgUlRDX1NFQ09ORFMpOworCisJLyogUlRDX0NFTlRVUlkgYW5kIFJUQ19DT05UUk9MIHNoYXJlIHNhbWUgcmVnaXN0ZXIgKi8KKwl3cml0ZWIoUlRDX1dSSVRFIHwgKGNlbnR1cnkgJiBSVENfQ0VOVFVSWV9NQVNLKSwgaW9hZGRyICsgUlRDX0NFTlRVUlkpOworCXdyaXRlYihjZW50dXJ5ICYgUlRDX0NFTlRVUllfTUFTSywgaW9hZGRyICsgUlRDX0NPTlRST0wpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzMTc0Ml9ydGNfcmVhZF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXVuc2lnbmVkIGludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgd2VlazsKKwl1bnNpZ25lZCBpbnQgY2VudHVyeTsKKworCS8qIGdpdmUgZW5vdWdoIHRpbWUgdG8gdXBkYXRlIFJUQyBpbiBjYXNlIG9mIGNvbnRpbnVvdXMgcmVhZCAqLworCWlmIChwZGF0YS0+bGFzdF9qaWZmaWVzID09IGppZmZpZXMpCisJCW1zbGVlcCgxKTsKKwlwZGF0YS0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKwl3cml0ZWIoUlRDX1JFQUQsIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwlzZWNvbmQgPSByZWFkYihpb2FkZHIgKyBSVENfU0VDT05EUykgJiBSVENfU0VDT05EU19NQVNLOworCW1pbnV0ZSA9IHJlYWRiKGlvYWRkciArIFJUQ19NSU5VVEVTKTsKKwlob3VyID0gcmVhZGIoaW9hZGRyICsgUlRDX0hPVVJTKTsKKwlkYXkgPSByZWFkYihpb2FkZHIgKyBSVENfREFURSk7CisJd2VlayA9IHJlYWRiKGlvYWRkciArIFJUQ19EQVkpICYgUlRDX0RBWV9NQVNLOworCW1vbnRoID0gcmVhZGIoaW9hZGRyICsgUlRDX01PTlRIKTsKKwl5ZWFyID0gcmVhZGIoaW9hZGRyICsgUlRDX1lFQVIpOworCWNlbnR1cnkgPSByZWFkYihpb2FkZHIgKyBSVENfQ0VOVFVSWSkgJiBSVENfQ0VOVFVSWV9NQVNLOworCXdyaXRlYigwLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJdG0tPnRtX3NlYyA9IEJDRDJCSU4oc2Vjb25kKTsKKwl0bS0+dG1fbWluID0gQkNEMkJJTihtaW51dGUpOworCXRtLT50bV9ob3VyID0gQkNEMkJJTihob3VyKTsKKwl0bS0+dG1fbWRheSA9IEJDRDJCSU4oZGF5KTsKKwl0bS0+dG1fd2RheSA9IEJDRDJCSU4od2Vlayk7CisJdG0tPnRtX21vbiA9IEJDRDJCSU4obW9udGgpIC0gMTsKKwkvKiB5ZWFyIGlzIDE5MDAgKyB0bS0+dG1feWVhciAqLworCXRtLT50bV95ZWFyID0gQkNEMkJJTih5ZWFyKSArIEJDRDJCSU4oY2VudHVyeSkgKiAxMDAgLSAxOTAwOworCisJaWYgKHJ0Y192YWxpZF90bSh0bSkgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAicmV0cmlldmVkIGRhdGUvdGltZSBpcyBub3QgdmFsaWQuXG4iKTsKKwkJcnRjX3RpbWVfdG9fdG0oMCwgdG0pOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIGRzMTc0Ml9ydGNfb3BzID0geworCS5yZWFkX3RpbWUJPSBkczE3NDJfcnRjX3JlYWRfdGltZSwKKwkuc2V0X3RpbWUJPSBkczE3NDJfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIHNzaXplX3QgZHMxNzQyX252cmFtX3JlYWQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNoYXIgKmJ1ZiwKKwkJCQkgbG9mZl90IHBvcywgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9CisJCXRvX3BsYXRmb3JtX2RldmljZShjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaikpOworCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKKwlzc2l6ZV90IGNvdW50OworCisJZm9yIChjb3VudCA9IDA7IHNpemUgPiAwICYmIHBvcyA8IFJUQ19PRkZTRVQ7IGNvdW50KyssIHNpemUtLSkKKwkJKmJ1ZisrID0gcmVhZGIoaW9hZGRyICsgcG9zKyspOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZHMxNzQyX252cmFtX3dyaXRlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsCisJCQkJICBsb2ZmX3QgcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0KKwkJdG9fcGxhdGZvcm1fZGV2aWNlKGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKSk7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOworCXNzaXplX3QgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgc2l6ZSA+IDAgJiYgcG9zIDwgUlRDX09GRlNFVDsgY291bnQrKywgc2l6ZS0tKQorCQl3cml0ZWIoKmJ1ZisrLCBpb2FkZHIgKyBwb3MrKyk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgZHMxNzQyX252cmFtX2F0dHIgPSB7CisJLmF0dHIgPSB7CisJCS5uYW1lID0gIm52cmFtIiwKKwkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VHTywKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuc2l6ZSA9IFJUQ19PRkZTRVQsCisJLnJlYWQgPSBkczE3NDJfbnZyYW1fcmVhZCwKKwkud3JpdGUgPSBkczE3NDJfbnZyYW1fd3JpdGUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkczE3NDJfcnRjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBpbnQgY2VuLCBzZWM7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gTlVMTDsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlwZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIFJUQ19SRUdfU0laRSwgcGRldi0+bmFtZSkpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJcGRhdGEtPmJhc2VhZGRyID0gcmVzLT5zdGFydDsKKwlpb2FkZHIgPSBpb3JlbWFwKHBkYXRhLT5iYXNlYWRkciwgUlRDX1JFR19TSVpFKTsKKwlpZiAoIWlvYWRkcikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJcGRhdGEtPmlvYWRkciA9IGlvYWRkcjsKKworCS8qIHR1cm4gUlRDIG9uIGlmIGl0IHdhcyBub3Qgb24gKi8KKwlzZWMgPSByZWFkYihpb2FkZHIgKyBSVENfU0VDT05EUyk7CisJaWYgKHNlYyAmIFJUQ19TVE9QKSB7CisJCXNlYyAmPSBSVENfU0VDT05EU19NQVNLOworCQljZW4gPSByZWFkYihpb2FkZHIgKyBSVENfQ0VOVFVSWSkgJiBSVENfQ0VOVFVSWV9NQVNLOworCQl3cml0ZWIoUlRDX1dSSVRFLCBpb2FkZHIgKyBSVENfQ09OVFJPTCk7CisJCXdyaXRlYihzZWMsIGlvYWRkciArIFJUQ19TRUNPTkRTKTsKKwkJd3JpdGViKGNlbiAmIFJUQ19DRU5UVVJZX01BU0ssIGlvYWRkciArIFJUQ19DT05UUk9MKTsKKwl9CisJaWYgKHJlYWRiKGlvYWRkciArIFJUQ19EQVkpICYgUlRDX0JBVFRfRkxBRykKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInZvbHRhZ2UtbG93IGRldGVjdGVkLlxuIik7CisKKwlydGMgPSBydGNfZGV2aWNlX3JlZ2lzdGVyKHBkZXYtPm5hbWUsICZwZGV2LT5kZXYsCisJCQkJICAmZHMxNzQyX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKwlpZiAoSVNfRVJSKHJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihydGMpOworCQlnb3RvIG91dDsKKwl9CisJcGRhdGEtPnJ0YyA9IHJ0YzsKKwlwZGF0YS0+bGFzdF9qaWZmaWVzID0gamlmZmllczsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7CisJc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZwZGV2LT5kZXYua29iaiwgJmRzMTc0Ml9udnJhbV9hdHRyKTsKKwlyZXR1cm4gMDsKKyBvdXQ6CisJaWYgKGlvYWRkcikKKwkJaW91bm1hcChpb2FkZHIpOworCWlmIChwZGF0YS0+YmFzZWFkZHIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJa2ZyZWUocGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGRzMTc0Ml9ydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnBkZXYtPmRldi5rb2JqLCAmZHMxNzQyX252cmFtX2F0dHIpOworCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+cnRjKTsKKwlpb3VubWFwKHBkYXRhLT5pb2FkZHIpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwZGF0YS0+YmFzZWFkZHIsIFJUQ19SRUdfU0laRSk7CisJa2ZyZWUocGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkczE3NDJfcnRjX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZHMxNzQyX3J0Y19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGRzMTc0Ml9ydGNfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZHMxNzQyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGRzMTc0Ml9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHMxNzQyX3J0Y19kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgZHMxNzQyX2V4aXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRzMTc0Ml9ydGNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZHMxNzQyX2luaXQpOworbW9kdWxlX2V4aXQoZHMxNzQyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBdHN1c2hpIE5lbW90byA8YW5lbW9AbWJhLm9jbi5uZS5qcD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRGFsbGFzIERTMTc0MiBSVEMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbGliLmMgYi9kcml2ZXJzL3J0Yy9ydGMtbGliLmMKaW5kZXggY2ZlZGMxZC4uOTgxMjEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWxpYi5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1saWIuYwpAQCAtMTgsOSArMTgsMTkgQEAKIAkzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxCiB9OwogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgcnRjX3lkYXlzWzJdWzEzXSA9IHsKKwkvKiBOb3JtYWwgeWVhcnMgKi8KKwl7IDAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAzNjUgfSwKKwkvKiBMZWFwIHllYXJzICovCisJeyAwLCAzMSwgNjAsIDkxLCAxMjEsIDE1MiwgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNSwgMzY2IH0KK307CisKICNkZWZpbmUgTEVBUFNfVEhSVV9FTkRfT0YoeSkgKCh5KS80IC0gKHkpLzEwMCArICh5KS80MDApCiAjZGVmaW5lIExFQVBfWUVBUih5ZWFyKSAoKCEoeWVhciAlIDQpICYmICh5ZWFyICUgMTAwKSkgfHwgISh5ZWFyICUgNDAwKSkKIAorLyoKKyAqIFRoZSBudW1iZXIgb2YgZGF5cyBpbiB0aGUgbW9udGguCisgKi8KIGludCBydGNfbW9udGhfZGF5cyh1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKQogewogCXJldHVybiBydGNfZGF5c19pbl9tb250aFttb250aF0gKyAoTEVBUF9ZRUFSKHllYXIpICYmIG1vbnRoID09IDEpOwpAQCAtMjgsNiArMzgsMTUgQEAKIEVYUE9SVF9TWU1CT0wocnRjX21vbnRoX2RheXMpOwogCiAvKgorICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIEphbnVhcnkgMS4gKDAgdG8gMzY1KQorICovCitpbnQgcnRjX3llYXJfZGF5cyh1bnNpZ25lZCBpbnQgZGF5LCB1bnNpZ25lZCBpbnQgbW9udGgsIHVuc2lnbmVkIGludCB5ZWFyKQoreworCXJldHVybiBydGNfeWRheXNbTEVBUF9ZRUFSKHllYXIpXVttb250aF0gKyBkYXktMTsKK30KK0VYUE9SVF9TWU1CT0wocnRjX3llYXJfZGF5cyk7CisKKy8qCiAgKiBDb252ZXJ0IHNlY29uZHMgc2luY2UgMDEtMDEtMTk3MCAwMDowMDowMCB0byBHcmVnb3JpYW4gZGF0ZS4KICAqLwogdm9pZCBydGNfdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIHN0cnVjdCBydGNfdGltZSAqdG0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbWF4NjkwMi5jIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzk3Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ydGMvcnRjLW1heDY5MDIuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogZHJpdmVycy9jaGFyL21heDY5MDIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiA4RCBUZWNobm9sb2dpZXMgaW5jLgorICogQ29weXJpZ2h0IChDKSAyMDA0IENvbXB1bGFiIEx0ZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERyaXZlciBmb3IgTUFYNjkwMiBzcGkgUlRDCisgKgorICogQ2hhbmdlbG9nOgorICoKKyAqIDI0LU1heS0yMDA2OiBSYXBoYWVsIEFzc2VuYXQgPHJhcGhAOGQuY29tPgorICogICAgICAgICAgICAgICAgLSBNYWpvciByZXdvcmsKKyAqICAgCQkJCUNvbnZlcnRlZCB0byBydGNfZGV2aWNlIGFuZCB1c2VzIHRoZSBTUEkgbGF5ZXIuCisgKgorICogPz8tPz8/LTIwMDU6IFNvbWVvbmUgYXQgQ29tcHVsYWIKKyAqICAgICAgICAgICAgICAgIC0gSW5pdGlhbCBkcml2ZXIgY3JlYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2RlZmluZSBNQVg2OTAyX1JFR19TRUNPTkRTCQkweDAxCisjZGVmaW5lIE1BWDY5MDJfUkVHX01JTlVURVMJCTB4MDMKKyNkZWZpbmUgTUFYNjkwMl9SRUdfSE9VUlMJCTB4MDUKKyNkZWZpbmUgTUFYNjkwMl9SRUdfREFURQkJMHgwNworI2RlZmluZSBNQVg2OTAyX1JFR19NT05USAkJMHgwOQorI2RlZmluZSBNQVg2OTAyX1JFR19EQVkJCQkweDBCCisjZGVmaW5lIE1BWDY5MDJfUkVHX1lFQVIJCTB4MEQKKyNkZWZpbmUgTUFYNjkwMl9SRUdfQ09OVFJPTAkJMHgwRgorI2RlZmluZSBNQVg2OTAyX1JFR19DRU5UVVJZCQkweDEzCisKKyN1bmRlZiBNQVg2OTAyX0RFQlVHCisKK3N0cnVjdCBtYXg2OTAyIHsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXU4IGJ1Zls5XTsgLyogQnVyc3QgcmVhZCBjbWQgKyA4IHJlZ2lzdGVycyAqLworCXU4IHR4X2J1ZlsyXTsKKwl1OCByeF9idWZbMl07Cit9OworCitzdGF0aWMgdm9pZCBtYXg2OTAyX3NldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciBkYXRhKQoreworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSB0b19zcGlfZGV2aWNlKGRldik7CisJdW5zaWduZWQgY2hhciBidWZbMl07CisKKwkvKiBNU0IgbXVzdCBiZSAnMCcgdG8gd3JpdGUgKi8KKwlidWZbMF0gPSBhZGRyZXNzICYgMHg3ZjsKKwlidWZbMV0gPSBkYXRhOworCisJc3BpX3dyaXRlKHNwaSwgYnVmLCAyKTsKK30KKworc3RhdGljIGludCBtYXg2OTAyX2dldF9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQkJdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCBzdGF0dXM7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQnVpbGQgb3VyIHNwaSBtZXNzYWdlICovCisJc3BpX21lc3NhZ2VfaW5pdCgmbWVzc2FnZSk7CisJbWVtc2V0KCZ4ZmVyLCAwLCBzaXplb2YoeGZlcikpOworCXhmZXIubGVuID0gMjsKKwkvKiBDYW4gdHhfYnVmIGFuZCByeF9idWYgYmUgZXF1YWw/IFRoZSBkb2MgaW4gc3BpLmggaXMgbm90IHN1cmUuLi4gKi8KKwl4ZmVyLnR4X2J1ZiA9IGNoaXAtPnR4X2J1ZjsKKwl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPnJ4X2J1ZjsKKworCS8qIFNldCBNU0IgdG8gaW5kaWNhdGUgcmVhZCAqLworCWNoaXAtPnR4X2J1ZlswXSA9IGFkZHJlc3MgfCAweDgwOworCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKKworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOworCWVsc2UKKwkJcmV0dXJuIHN0YXR1czsKKworCSpkYXRhID0gY2hpcC0+cnhfYnVmWzFdOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBtYXg2OTAyX2dldF9kYXRldGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqZHQpCit7CisJdW5zaWduZWQgY2hhciB0bXA7CisJaW50IGNlbnR1cnk7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3BpX2RldmljZShkZXYpOworCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNwaV9tZXNzYWdlIG1lc3NhZ2U7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCWludCBzdGF0dXM7CisKKwllcnIgPSBtYXg2OTAyX2dldF9yZWcoZGV2LCBNQVg2OTAyX1JFR19DRU5UVVJZLCAmdG1wKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogYnVpbGQgdGhlIG1lc3NhZ2UgKi8KKwlzcGlfbWVzc2FnZV9pbml0KCZtZXNzYWdlKTsKKwltZW1zZXQoJnhmZXIsIDAsIHNpemVvZih4ZmVyKSk7CisJeGZlci5sZW4gPSAxICsgNzsJLyogQnVyc3QgcmVhZCBjb21tYW5kICsgNyByZWdpc3RlcnMgKi8KKwl4ZmVyLnR4X2J1ZiA9IGNoaXAtPmJ1ZjsKKwl4ZmVyLnJ4X2J1ZiA9IGNoaXAtPmJ1ZjsKKwljaGlwLT5idWZbMF0gPSAweGJmOwkvKiBCdXJzdCByZWFkICovCisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtZXNzYWdlKTsKKworCS8qIGRvIHRoZSBpL28gKi8KKwlzdGF0dXMgPSBzcGlfc3luYyhzcGksICZtZXNzYWdlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG1lc3NhZ2Uuc3RhdHVzOworCWVsc2UKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIFRoZSBjaGlwIHNlbmRzIGRhdGEgaW4gdGhpcyBvcmRlcjoKKwkgKiBTZWNvbmRzLCBNaW51dGVzLCBIb3VycywgRGF0ZSwgTW9udGgsIERheSwgWWVhciAqLworCWR0LT50bV9zZWMJPSBCQ0QyQklOKGNoaXAtPmJ1ZlsxXSk7CisJZHQtPnRtX21pbgk9IEJDRDJCSU4oY2hpcC0+YnVmWzJdKTsKKwlkdC0+dG1faG91cgk9IEJDRDJCSU4oY2hpcC0+YnVmWzNdKTsKKwlkdC0+dG1fbWRheQk9IEJDRDJCSU4oY2hpcC0+YnVmWzRdKTsKKwlkdC0+dG1fbW9uCT0gQkNEMkJJTihjaGlwLT5idWZbNV0gLSAxKTsKKwlkdC0+dG1fd2RheQk9IEJDRDJCSU4oY2hpcC0+YnVmWzZdKTsKKwlkdC0+dG1feWVhciA9IEJDRDJCSU4oY2hpcC0+YnVmWzddKTsKKworCWNlbnR1cnkgPSBCQ0QyQklOKHRtcCkgKiAxMDA7CisKKwlkdC0+dG1feWVhciArPSBjZW50dXJ5OworCWR0LT50bV95ZWFyIC09IDE5MDA7CisKKyNpZmRlZiBNQVg2OTAyX0RFQlVHCisJcHJpbnRrKCJcbiVzIDogUmVhZCBSVEMgdmFsdWVzXG4iLF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCJ0bV9ob3VyOiAlaVxuIixkdC0+dG1faG91cik7CisJcHJpbnRrKCJ0bV9taW4gOiAlaVxuIixkdC0+dG1fbWluKTsKKwlwcmludGsoInRtX3NlYyA6ICVpXG4iLGR0LT50bV9zZWMpOworCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOworCXByaW50aygidG1fbW9uIDogJWlcbiIsZHQtPnRtX21vbik7CisJcHJpbnRrKCJ0bV9tZGF5OiAlaVxuIixkdC0+dG1fbWRheSk7CisJcHJpbnRrKCJ0bV93ZGF5OiAlaVxuIixkdC0+dG1fd2RheSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDY5MDJfc2V0X2RhdGV0aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwlkdC0+dG1feWVhciA9IGR0LT50bV95ZWFyKzE5MDA7CisKKyNpZmRlZiBNQVg2OTAyX0RFQlVHCisJcHJpbnRrKCJcbiVzIDogU2V0dGluZyBSVEMgdmFsdWVzXG4iLF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKKwlwcmludGsoInRtX21pbiA6ICVpXG4iLGR0LT50bV9taW4pOworCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOworCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOworCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOworCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOworI2VuZGlmCisKKwkvKiBSZW1vdmUgd3JpdGUgcHJvdGVjdGlvbiAqLworCW1heDY5MDJfc2V0X3JlZyhkZXYsIDB4RiwgMCk7CisKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDAxLCBCSU4yQkNEKGR0LT50bV9zZWMpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDAzLCBCSU4yQkNEKGR0LT50bV9taW4pKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA1LCBCSU4yQkNEKGR0LT50bV9ob3VyKSk7CisKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDA3LCBCSU4yQkNEKGR0LT50bV9tZGF5KSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwOSwgQklOMkJDRChkdC0+dG1fbW9uKzEpKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDBCLCBCSU4yQkNEKGR0LT50bV93ZGF5KSk7CisJbWF4NjkwMl9zZXRfcmVnKGRldiwgMHgwRCwgQklOMkJDRChkdC0+dG1feWVhciUxMDApKTsKKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweDEzLCBCSU4yQkNEKGR0LT50bV95ZWFyLzEwMCkpOworCisJLyogQ29tcHVsYWIgdXNlZCBhIGRlbGF5IGhlcmUuIEhvd2V2ZXIsIHRoZSBkYXRhc2hlZXQKKwkgKiBkb2VzIG5vdCBtZW50aW9uIGEgZGVsYXkgYmVpbmcgcmVxdWlyZWQgYW55d2hlcmUuLi4gKi8KKwkvKiBkZWxheSgyMDAwKTsgKi8KKworCS8qIFdyaXRlIHByb3RlY3QgKi8KKwltYXg2OTAyX3NldF9yZWcoZGV2LCAweEYsIDB4ODApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4NjkwMl9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXJldHVybiBtYXg2OTAyX2dldF9kYXRldGltZShkZXYsIHRtKTsKK30KKworc3RhdGljIGludCBtYXg2OTAyX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlyZXR1cm4gbWF4NjkwMl9zZXRfZGF0ZXRpbWUoZGV2LCB0bSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBtYXg2OTAyX3J0Y19vcHMgPSB7CisJLnJlYWRfdGltZQk9IG1heDY5MDJfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IG1heDY5MDJfc2V0X3RpbWUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBtYXg2OTAyX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlzdHJ1Y3QgbWF4NjkwMiAqY2hpcDsKKwlpbnQgcmVzOworCisJcnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigibWF4NjkwMiIsCisJCQkJJnNwaS0+ZGV2LCAmbWF4NjkwMl9ydGNfb3BzLCBUSElTX01PRFVMRSk7CisJaWYgKElTX0VSUihydGMpKQorCQlyZXR1cm4gUFRSX0VSUihydGMpOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMzsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXNwaV9zZXR1cChzcGkpOworCisJY2hpcCA9IGt6YWxsb2Moc2l6ZW9mICpjaGlwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApIHsKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaGlwLT5ydGMgPSBydGM7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgY2hpcCk7CisKKwlyZXMgPSBtYXg2OTAyX2dldF9yZWcoJnNwaS0+ZGV2LCBNQVg2OTAyX1JFR19TRUNPTkRTLCAmdG1wKTsKKwlpZiAocmVzKSB7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBtYXg2OTAyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBtYXg2OTAyICpjaGlwID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjID0gY2hpcC0+cnRjOworCisJaWYgKHJ0YykKKwkJcnRjX2RldmljZV91bnJlZ2lzdGVyKHJ0Yyk7CisKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgbWF4NjkwMl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgCT0gIm1heDY5MDIiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgCT0gbWF4NjkwMl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4NjkwMl9yZW1vdmUpLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgbWF4NjkwMl9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJtYXg2OTAyIHNwaSBkcml2ZXJcbiIpOworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZtYXg2OTAyX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChtYXg2OTAyX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgbWF4NjkwMl9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZtYXg2OTAyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg2OTAyX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04gKCJtYXg2OTAyIHNwaSBSVEMgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SICgiUmFwaGFlbCBBc3NlbmF0Iik7CitNT0RVTEVfTElDRU5TRSAoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTgzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzNWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wY2Y4NTgzLmMKQEAgLTAsMCArMSwzOTQgQEAKKy8qCisgKiAgZHJpdmVycy9ydGMvcnRjLXBjZjg1ODMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgRHJpdmVyIGZvciBQQ0Y4NTgzIFJUQyAmIFJBTSBjaGlwCisgKgorICogIENvbnZlcnRlZCB0byB0aGUgZ2VuZXJpYyBSVEMgc3VzYnN5c3RlbSBieSBHLiBMaWFraG92ZXRza2kgKDIwMDYpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbWMxNDY4MThydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKworc3RydWN0IHJ0Y19tZW0geworCXVuc2lnbmVkIGludAlsb2M7CisJdW5zaWduZWQgaW50CW5yOworCXVuc2lnbmVkIGNoYXIJKmRhdGE7Cit9OworCitzdHJ1Y3QgcGNmODU4MyB7CisJc3RydWN0IGkyY19jbGllbnQgY2xpZW50OworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdW5zaWduZWQgY2hhciBjdHJsOworfTsKKworI2RlZmluZSBDVFJMX1NUT1AJMHg4MAorI2RlZmluZSBDVFJMX0hPTEQJMHg0MAorI2RlZmluZSBDVFJMXzMyS0haCTB4MDAKKyNkZWZpbmUgQ1RSTF9NQVNLCTB4MDgKKyNkZWZpbmUgQ1RSTF9BTEFSTUVOCTB4MDQKKyNkZWZpbmUgQ1RSTF9BTEFSTQkweDAyCisjZGVmaW5lIENUUkxfVElNRVIJMHgwMQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgbm9ybWFsX2kyY1tdID0geyBJMkNfQ0xJRU5UX0VORCB9OworCisvKiBNb2R1bGUgcGFyYW1ldGVycyAqLworSTJDX0NMSUVOVF9JTlNNT0Q7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y4NTgzX2RyaXZlcjsKKworI2RlZmluZSBnZXRfY3RybCh4KSAgICAoKHN0cnVjdCBwY2Y4NTgzICopaTJjX2dldF9jbGllbnRkYXRhKHgpKS0+Y3RybAorI2RlZmluZSBzZXRfY3RybCh4LCB2KSBnZXRfY3RybCh4KSA9IHYKKworI2RlZmluZSBDTU9TX1lFQVIJKDY0ICsgMTI4KQorI2RlZmluZSBDTU9TX0NIRUNLU1VNCSg2MykKKworc3RhdGljIGludCBwY2Y4NTgzX2dldF9kYXRldGltZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzhdLCBhZGRyWzFdID0geyAxIH07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYWRkciwKKwkJfSwgeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSA2LAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisJaW50IHJldDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKworCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpOworCWlmIChyZXQgPT0gMikgeworCQlkdC0+dG1feWVhciA9IGJ1Zls0XSA+PiA2OworCQlkdC0+dG1fd2RheSA9IGJ1Zls1XSA+PiA1OworCisJCWJ1Zls0XSAmPSAweDNmOworCQlidWZbNV0gJj0gMHgxZjsKKworCQlkdC0+dG1fc2VjID0gQkNEX1RPX0JJTihidWZbMV0pOworCQlkdC0+dG1fbWluID0gQkNEX1RPX0JJTihidWZbMl0pOworCQlkdC0+dG1faG91ciA9IEJDRF9UT19CSU4oYnVmWzNdKTsKKwkJZHQtPnRtX21kYXkgPSBCQ0RfVE9fQklOKGJ1Zls0XSk7CisJCWR0LT50bV9tb24gPSBCQ0RfVE9fQklOKGJ1Zls1XSk7CisJfQorCisJcmV0dXJuIHJldCA9PSAyID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M19zZXRfZGF0ZXRpbWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y190aW1lICpkdCwgaW50IGRhdGV0b28pCit7CisJdW5zaWduZWQgY2hhciBidWZbOF07CisJaW50IHJldCwgbGVuID0gNjsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gZ2V0X2N0cmwoY2xpZW50KSB8IDB4ODA7CisJYnVmWzJdID0gMDsKKwlidWZbM10gPSBCSU5fVE9fQkNEKGR0LT50bV9zZWMpOworCWJ1Zls0XSA9IEJJTl9UT19CQ0QoZHQtPnRtX21pbik7CisJYnVmWzVdID0gQklOX1RPX0JDRChkdC0+dG1faG91cik7CisKKwlpZiAoZGF0ZXRvbykgeworCQlsZW4gPSA4OworCQlidWZbNl0gPSBCSU5fVE9fQkNEKGR0LT50bV9tZGF5KSB8IChkdC0+dG1feWVhciA8PCA2KTsKKwkJYnVmWzddID0gQklOX1RPX0JDRChkdC0+dG1fbW9uKSAgfCAoZHQtPnRtX3dkYXkgPDwgNSk7CisJfQorCisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgKGNoYXIgKilidWYsIGxlbik7CisJaWYgKHJldCAhPSBsZW4pCisJCXJldHVybiAtRUlPOworCisJYnVmWzFdID0gZ2V0X2N0cmwoY2xpZW50KTsKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAoY2hhciAqKWJ1ZiwgMik7CisKKwlyZXR1cm4gcmV0ID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX2dldF9jdHJsKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGNoYXIgKmN0cmwpCit7CisJKmN0cmwgPSBnZXRfY3RybChjbGllbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfc2V0X2N0cmwoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdW5zaWduZWQgY2hhciAqY3RybCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKKworCWJ1ZlswXSA9IDA7CisJYnVmWzFdID0gKmN0cmw7CisJc2V0X2N0cmwoY2xpZW50LCAqY3RybCk7CisKKwlyZXR1cm4gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgKGNoYXIgKilidWYsIDIpOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfcmVhZF9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y19tZW0gKm1lbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFkZHJbMV07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYWRkciwKKwkJfSwgeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSBtZW0tPm5yLAorCQkJLmJ1ZiA9IG1lbS0+ZGF0YSwKKwkJfQorCX07CisKKwlpZiAobWVtLT5sb2MgPCA4KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFkZHJbMF0gPSBtZW0tPmxvYzsKKworCXJldHVybiBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCAyKSA9PSAyID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgcGNmODU4M193cml0ZV9tZW0oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHJ0Y19tZW0gKm1lbSkKK3sKKwl1bnNpZ25lZCBjaGFyIGFkZHJbMV07CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gYWRkciwKKwkJfSwgeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9OT1NUQVJULAorCQkJLmxlbiA9IG1lbS0+bnIsCisJCQkuYnVmID0gbWVtLT5kYXRhLAorCQl9CisJfTsKKworCWlmIChtZW0tPmxvYyA8IDgpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRkclswXSA9IG1lbS0+bG9jOworCisJcmV0dXJuIGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZ3MsIDIpID09IDIgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJdW5zaWduZWQgY2hhciBjdHJsLCB5ZWFyWzJdOworCXN0cnVjdCBydGNfbWVtIG1lbSA9IHsgQ01PU19ZRUFSLCBzaXplb2YoeWVhciksIHllYXIgfTsKKwlpbnQgcmVhbF95ZWFyLCB5ZWFyX29mZnNldCwgZXJyOworCisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0aGUgUlRDIGlzIHJ1bm5pbmcuCisJICovCisJcGNmODU4M19nZXRfY3RybChjbGllbnQsICZjdHJsKTsKKwlpZiAoY3RybCAmIChDVFJMX1NUT1AgfCBDVFJMX0hPTEQpKSB7CisJCXVuc2lnbmVkIGNoYXIgbmV3X2N0cmwgPSBjdHJsICYgfihDVFJMX1NUT1AgfCBDVFJMX0hPTEQpOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJUQzogcmVzZXR0aW5nIGNvbnRyb2wgJTAyeCAtPiAlMDJ4XG4iLAorCQkgICAgICAgY3RybCwgbmV3X2N0cmwpOworCisJCWlmICgoZXJyID0gcGNmODU4M19zZXRfY3RybChjbGllbnQsICZuZXdfY3RybCkpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHBjZjg1ODNfZ2V0X2RhdGV0aW1lKGNsaWVudCwgdG0pIHx8CisJICAgIHBjZjg1ODNfcmVhZF9tZW0oY2xpZW50LCAmbWVtKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZWFsX3llYXIgPSB5ZWFyWzBdOworCisJLyoKKwkgKiBUaGUgUlRDIHllYXIgaG9sZHMgdGhlIExTQiB0d28gYml0cyBvZiB0aGUgY3VycmVudAorCSAqIHllYXIsIHdoaWNoIHNob3VsZCByZWZsZWN0IHRoZSBMU0IgdHdvIGJpdHMgb2YgdGhlCisJICogQ01PUyBjb3B5IG9mIHRoZSB5ZWFyLiAgQW55IGRpZmZlcmVuY2UgaW5kaWNhdGVzCisJICogdGhhdCB3ZSBoYXZlIHRvIGNvcnJlY3QgdGhlIENNT1MgdmVyc2lvbi4KKwkgKi8KKwl5ZWFyX29mZnNldCA9IHRtLT50bV95ZWFyIC0gKHJlYWxfeWVhciAmIDMpOworCWlmICh5ZWFyX29mZnNldCA8IDApCisJCS8qCisJCSAqIFJUQyB5ZWFyIHdyYXBwZWQuICBBZGp1c3QgaXQgYXBwcm9wcmlhdGVseS4KKwkJICovCisJCXllYXJfb2Zmc2V0ICs9IDQ7CisKKwl0bS0+dG1feWVhciA9IHJlYWxfeWVhciArIHllYXJfb2Zmc2V0ICsgeWVhclsxXSAqIDEwMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjZjg1ODNfcnRjX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICp0bSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXVuc2lnbmVkIGNoYXIgeWVhclsyXSwgY2hrOworCXN0cnVjdCBydGNfbWVtIGNtb3NfeWVhciAgPSB7IENNT1NfWUVBUiwgc2l6ZW9mKHllYXIpLCB5ZWFyIH07CisJc3RydWN0IHJ0Y19tZW0gY21vc19jaGVjayA9IHsgQ01PU19DSEVDS1NVTSwgMSwgJmNoayB9OworCWludCByZXQ7CisKKwkvKgorCSAqIFRoZSBSVEMncyBvd24gMi1iaXQgeWVhciBtdXN0IHJlZmxlY3QgdGhlIGxlYXN0CisJICogc2lnbmlmaWNhbnQgdHdvIGJpdHMgb2YgdGhlIENNT1MgeWVhci4KKwkgKi8KKworCXJldCA9IHBjZjg1ODNfc2V0X2RhdGV0aW1lKGNsaWVudCwgdG0sIDEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwY2Y4NTgzX3JlYWRfbWVtKGNsaWVudCwgJmNtb3NfY2hlY2spOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBwY2Y4NTgzX3JlYWRfbWVtKGNsaWVudCwgJmNtb3NfeWVhcik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWNoayAtPSB5ZWFyWzFdICsgeWVhclswXTsKKworCXllYXJbMV0gPSB0bS0+dG1feWVhciAvIDEwMDsKKwl5ZWFyWzBdID0gdG0tPnRtX3llYXIgJSAxMDA7CisKKwljaGsgKz0geWVhclsxXSArIHllYXJbMF07CisKKwlyZXQgPSBwY2Y4NTgzX3dyaXRlX21lbShjbGllbnQsICZjbW9zX3llYXIpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHBjZjg1ODNfd3JpdGVfbWVtKGNsaWVudCwgJmNtb3NfY2hlY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBjZjg1ODNfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gcGNmODU4M19ydGNfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHBjZjg1ODNfcnRjX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBwY2Y4NTgzX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKTsKKworc3RhdGljIGludCBwY2Y4NTgzX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIGkyY19wcm9iZShhZGFwLCAmYWRkcl9kYXRhLCBwY2Y4NTgzX3Byb2JlKTsKK30KKworc3RhdGljIGludCBwY2Y4NTgzX2RldGFjaChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWludCBlcnI7CisJc3RydWN0IHBjZjg1ODMgKnBjZiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBwY2YtPnJ0YzsKKworCWlmIChydGMpCisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihydGMpOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKworCWtmcmVlKHBjZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBwY2Y4NTgzX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJwY2Y4NTgzIiwKKwl9LAorCS5pZAkJPSBJMkNfRFJJVkVSSURfUENGODU4MywKKwkuYXR0YWNoX2FkYXB0ZXIJPSBwY2Y4NTgzX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudAk9IHBjZjg1ODNfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBwY2Y4NTgzX3Byb2JlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IGFkZHIsIGludCBraW5kKQoreworCXN0cnVjdCBwY2Y4NTgzICpwY2Y7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgcnRjX2RldmljZSAqcnRjOworCXVuc2lnbmVkIGNoYXIgYnVmWzFdLCBhZFsxXSA9IHsgMCB9OworCWludCBlcnI7CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBhZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IGFkLAorCQl9LCB7CisJCQkuYWRkciA9IGFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9IGJ1ZiwKKwkJfQorCX07CisKKwlwY2YgPSBremFsbG9jKHNpemVvZigqcGNmKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY2YpCisJCXJldHVybiAtRU5PTUVNOworCisJY2xpZW50ID0gJnBjZi0+Y2xpZW50OworCisJY2xpZW50LT5hZGRyCQk9IGFkZHI7CisJY2xpZW50LT5hZGFwdGVyCT0gYWRhcDsKKwljbGllbnQtPmRyaXZlcgk9ICZwY2Y4NTgzX2RyaXZlcjsKKworCXN0cmxjcHkoY2xpZW50LT5uYW1lLCBwY2Y4NTgzX2RyaXZlci5kcml2ZXIubmFtZSwgSTJDX05BTUVfU0laRSk7CisKKwlpZiAoaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNncywgMikgIT0gMikgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGV4aXRfa2ZyZWU7CisJfQorCisJZXJyID0gaTJjX2F0dGFjaF9jbGllbnQoY2xpZW50KTsKKworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9rZnJlZTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIocGNmODU4M19kcml2ZXIuZHJpdmVyLm5hbWUsICZjbGllbnQtPmRldiwKKwkJCQkgICZwY2Y4NTgzX3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKKworCWlmIChJU19FUlIocnRjKSkgeworCQllcnIgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gZXhpdF9kZXRhY2g7CisJfQorCisJcGNmLT5ydGMgPSBydGM7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgcGNmKTsKKwlzZXRfY3RybChjbGllbnQsIGJ1ZlswXSk7CisKKwlyZXR1cm4gMDsKKworZXhpdF9kZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQoY2xpZW50KTsKKworZXhpdF9rZnJlZToKKwlrZnJlZShwY2YpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIF9faW5pdCBpbnQgcGNmODU4M19pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZwY2Y4NTgzX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBwY2Y4NTgzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmcGNmODU4M19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChwY2Y4NTgzX2luaXQpOworbW9kdWxlX2V4aXQocGNmODU4M19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLaW5nIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlBDRjg1ODMgSTJDIFJUQyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jIGIvZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1Mzg2MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1wbDAzMS5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogZHJpdmVycy9ydGMvcnRjLXBsMDMxLmMKKyAqCisgKiBSZWFsIFRpbWUgQ2xvY2sgaW50ZXJmYWNlIGZvciBBUk0gQU1CQSBQcmltZUNlbGwgMDMxIFJUQworICoKKyAqIEF1dGhvcjogRGVlcGFrIFNheGVuYSA8ZHNheGVuYUBwbGV4aXR5Lm5ldD4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiAoYykgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vcnRjLmg+CisKKy8qCisgKiBSZWdpc3RlciBkZWZpbml0aW9ucworICovCisjZGVmaW5lCVJUQ19EUgkJMHgwMAkvKiBEYXRhIHJlYWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX01SCQkweDA0CS8qIE1hdGNoIHJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19MUgkJMHgwOAkvKiBEYXRhIGxvYWQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0NSCQkweDBjCS8qIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX0lNU0MJMHgxMAkvKiBJbnRlcnJ1cHQgbWFzayBhbmQgc2V0IHJlZ2lzdGVyICovCisjZGVmaW5lCVJUQ19SSVMJCTB4MTQJLyogUmF3IGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJUlRDX01JUwkJMHgxOAkvKiBNYXNrZWQgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQlSVENfSUNSCQkweDFjCS8qIEludGVycnVwdCBjbGVhciByZWdpc3RlciAqLworCitzdHJ1Y3QgcGwwMzFfbG9jYWwgeworCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworc3RhdGljIGlycXJldHVybl90IHBsMDMxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBkZXZfaWQ7CisKKwlydGNfdXBkYXRlX2lycSgmcnRjLT5jbGFzc19kZXYsIDEsIFJUQ19BRik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzFfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJLyoKKwkgKiBXZSByZXF1ZXN0IElSUSBpbiBwbDAzMV9wcm9iZSwgc28gbm90aGluZyB0byBkbyBoZXJlLi4uCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBsMDMxX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworfQorCitzdGF0aWMgaW50IHBsMDMxX2lvY3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUQ19BSUVfT0ZGOgorCQlfX3Jhd193cml0ZWwoMSwgbGRhdGEtPmJhc2UgKyBSVENfTUlTKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBSVENfQUlFX09OOgorCQlfX3Jhd193cml0ZWwoMCwgbGRhdGEtPmJhc2UgKyBSVENfTUlTKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FTk9JT0NUTENNRDsKK30KKworc3RhdGljIGludCBwbDAzMV9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190aW1lX3RvX3RtKF9fcmF3X3JlYWRsKGxkYXRhLT5iYXNlICsgUlRDX0RSKSwgdG0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGwwMzFfc2V0X3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQoreworCXVuc2lnbmVkIGxvbmcgdGltZTsKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlydGNfdG1fdG9fdGltZSh0bSwgJnRpbWUpOworCV9fcmF3X3dyaXRlbCh0aW1lLCBsZGF0YS0+YmFzZSArIFJUQ19MUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDAzMV9yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFsYXJtKQoreworCXN0cnVjdCBwbDAzMV9sb2NhbCAqbGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJ0Y190aW1lX3RvX3RtKF9fcmF3X3JlYWRsKGxkYXRhLT5iYXNlICsgUlRDX01SKSwgJmFsYXJtLT50aW1lKTsKKwlhbGFybS0+cGVuZGluZyA9IF9fcmF3X3JlYWRsKGxkYXRhLT5iYXNlICsgUlRDX1JJUyk7CisJYWxhcm0tPmVuYWJsZWQgPSBfX3Jhd19yZWFkbChsZGF0YS0+YmFzZSArIFJUQ19JTVNDKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBsMDMxX3NldF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKK3sKKwlzdHJ1Y3QgcGwwMzFfbG9jYWwgKmxkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCisJcnRjX3RtX3RvX3RpbWUoJmFsYXJtLT50aW1lLCAmdGltZSk7CisKKwlfX3Jhd193cml0ZWwodGltZSwgbGRhdGEtPmJhc2UgKyBSVENfTVIpOworCV9fcmF3X3dyaXRlbCghYWxhcm0tPmVuYWJsZWQsIGxkYXRhLT5iYXNlICsgUlRDX01JUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBydGNfY2xhc3Nfb3BzIHBsMDMxX29wcyA9IHsKKwkub3BlbiA9IHBsMDMxX29wZW4sCisJLnJlbGVhc2UgPSBwbDAzMV9yZWxlYXNlLAorCS5pb2N0bCA9IHBsMDMxX2lvY3RsLAorCS5yZWFkX3RpbWUgPSBwbDAzMV9yZWFkX3RpbWUsCisJLnNldF90aW1lID0gcGwwMzFfc2V0X3RpbWUsCisJLnJlYWRfYWxhcm0gPSBwbDAzMV9yZWFkX2FsYXJtLAorCS5zZXRfYWxhcm0gPSBwbDAzMV9zZXRfYWxhcm0sCit9OworCitzdGF0aWMgaW50IHBsMDMxX3JlbW92ZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmYWRldi0+ZGV2KTsKKworCWlmIChsZGF0YSkgeworCQlkZXZfc2V0X2RydmRhdGEoJmFkZXYtPmRldiwgTlVMTCk7CisJCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgbGRhdGEtPnJ0Yyk7CisJCXJ0Y19kZXZpY2VfdW5yZWdpc3RlcihsZGF0YS0+cnRjKTsKKwkJaW91bm1hcChsZGF0YS0+YmFzZSk7CisJCWtmcmVlKGxkYXRhKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbDAzMV9wcm9iZShzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYsIHZvaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IHBsMDMxX2xvY2FsICpsZGF0YTsKKworCisJbGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGwwMzFfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlkZXZfc2V0X2RydmRhdGEoJmFkZXYtPmRldiwgbGRhdGEpOworCisJbGRhdGEtPmJhc2UgPSBpb3JlbWFwKGFkZXYtPnJlcy5zdGFydCwKKwkJCSAgICAgIGFkZXYtPnJlcy5lbmQgLSBhZGV2LT5yZXMuc3RhcnQgKyAxKTsKKwlpZiAoIWxkYXRhLT5iYXNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3JlbWFwOworCX0KKworCWlmIChyZXF1ZXN0X2lycShhZGV2LT5pcnFbMF0sIHBsMDMxX2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJInJ0Yy1wbDAzMSIsIGxkYXRhLT5ydGMpKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X25vX2lycTsKKwl9CisKKwlsZGF0YS0+cnRjID0gcnRjX2RldmljZV9yZWdpc3RlcigicGwwMzEiLCAmYWRldi0+ZGV2LCAmcGwwMzFfb3BzLAorCQkJCQkgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIobGRhdGEtPnJ0YykpIHsKKwkJcmV0ID0gUFRSX0VSUihsZGF0YS0+cnRjKTsKKwkJZ290byBvdXRfbm9fcnRjOworCX0KKworCXJldHVybiAwOworCitvdXRfbm9fcnRjOgorCWZyZWVfaXJxKGFkZXYtPmlycVswXSwgbGRhdGEtPnJ0Yyk7CitvdXRfbm9faXJxOgorCWlvdW5tYXAobGRhdGEtPmJhc2UpOworb3V0X25vX3JlbWFwOgorCWRldl9zZXRfZHJ2ZGF0YSgmYWRldi0+ZGV2LCBOVUxMKTsKKwlrZnJlZShsZGF0YSk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBhbWJhX2lkIHBsMDMxX2lkc1tdIF9faW5pdGRhdGEgPSB7CisJeworCQkgLmlkID0gMHgwMDA0MTAzMSwKKwkgCS5tYXNrID0gMHgwMDBmZmZmZiwgfSwKKwl7MCwgMH0sCit9OworCitzdGF0aWMgc3RydWN0IGFtYmFfZHJpdmVyIHBsMDMxX2RyaXZlciA9IHsKKwkuZHJ2ID0geworCQkubmFtZSA9ICJydGMtcGwwMzEiLAorCX0sCisJLmlkX3RhYmxlID0gcGwwMzFfaWRzLAorCS5wcm9iZSA9IHBsMDMxX3Byb2JlLAorCS5yZW1vdmUgPSBwbDAzMV9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwbDAzMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGFtYmFfZHJpdmVyX3JlZ2lzdGVyKCZwbDAzMV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcGwwMzFfZXhpdCh2b2lkKQoreworCWFtYmFfZHJpdmVyX3VucmVnaXN0ZXIoJnBsMDMxX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHBsMDMxX2luaXQpOworbW9kdWxlX2V4aXQocGwwMzFfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkRlZXBhayBTYXhlbmEgPGRzYXhlbmFAcGxleGl0eS5uZXQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQVJNIEFNQkEgUEwwMzEgUlRDIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jIGIvZHJpdmVycy9ydGMvcnRjLXNhMTEwMC5jCmluZGV4IGE5OTc1MjkuLmFiNDg2ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zYTExMDAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtc2ExMTAwLmMKQEAgLTIyOSw4ICsyMjksNiBAQAogCQlzcGluX3VubG9ja19pcnEoJnNhMTEwMF9ydGNfbG9jayk7CiAJCXJldHVybiAwOwogCWNhc2UgUlRDX1BJRV9PTjoKLQkJaWYgKChydGNfZnJlcSA+IDY0KSAmJiAhY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKLQkJCXJldHVybiAtRUFDQ0VTOwogCQlzcGluX2xvY2tfaXJxKCZzYTExMDBfcnRjX2xvY2spOwogCQlPU01SMSA9IFRJTUVSX0ZSRVEvcnRjX2ZyZXEgKyBPU0NSOwogCQlPSUVSIHw9IE9JRVJfRTE7CkBAIC0yNDIsOCArMjQwLDYgQEAKIAljYXNlIFJUQ19JUlFQX1NFVDoKIAkJaWYgKGFyZyA8IDEgfHwgYXJnID4gVElNRVJfRlJFUSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKGFyZyA+IDY0KSAmJiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpKQotCQkJcmV0dXJuIC1FQUNDRVM7CiAJCXJ0Y19mcmVxID0gYXJnOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYyBiL2RyaXZlcnMvcnRjL3J0Yy12MzAyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGY0MDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3J0Yy9ydGMtdjMwMjAuYwpAQCAtMCwwICsxLDI2NCBAQAorLyogZHJpdmVycy9ydGMvcnRjLXYzMDIwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgOEQgVGVjaG5vbG9naWVzIGluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBDb21wdWxhYiBMdGQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBEcml2ZXIgZm9yIHRoZSBWMzAyMCBSVEMKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKgorICogIDEwLU1heS0yMDA2OiBSYXBoYWVsIEFzc2VuYXQgPHJhcGhAOGQuY29tPgorICoJCQkJLSBDb252ZXJ0ZWQgdG8gcGxhdGZvcm0gZHJpdmVyCisgKgkJCQktIFVzZSB0aGUgZ2VuZXJpYyBydGMgY2xhc3MKKyAqCisgKiAgPz8tPz8/LTIwMDQ6IFNvbWVvbmUgYXQgQ29tcHVsYWIKKyAqICAJCQktIEluaXRpYWwgZHJpdmVyIGNyZWF0aW9uLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy12MzAyMC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyN1bmRlZiBERUJVRworCitzdHJ1Y3QgdjMwMjAgeworCXZvaWQgX19pb21lbSAqaW9hZGRyZXNzOworCWludCBsZWZ0c2hpZnQ7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKK307CisKK3N0YXRpYyB2b2lkIHYzMDIwX3NldF9yZWcoc3RydWN0IHYzMDIwICpjaGlwLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MsCisJCQl1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciB0bXA7CisKKwl0bXAgPSBhZGRyZXNzOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJd3JpdGVsKCh0bXAgJiAxKSA8PCBjaGlwLT5sZWZ0c2hpZnQsIGNoaXAtPmlvYWRkcmVzcyk7CisJCXRtcCA+Pj0gMTsKKwl9CisKKwkvKiBDb21tYW5kcyBkb250IGhhdmUgZGF0YSAqLworCWlmICghVjMwMjBfSVNfQ09NTUFORChhZGRyZXNzKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQl3cml0ZWwoKGRhdGEgJiAxKSA8PCBjaGlwLT5sZWZ0c2hpZnQsIGNoaXAtPmlvYWRkcmVzcyk7CisJCQlkYXRhID4+PSAxOworCQl9CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciB2MzAyMF9nZXRfcmVnKHN0cnVjdCB2MzAyMCAqY2hpcCwgdW5zaWduZWQgY2hhciBhZGRyZXNzKQoreworCXVuc2lnbmVkIGludCBkYXRhPTA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXdyaXRlbCgoYWRkcmVzcyAmIDEpIDw8IGNoaXAtPmxlZnRzaGlmdCwgY2hpcC0+aW9hZGRyZXNzKTsKKwkJYWRkcmVzcyA+Pj0gMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWRhdGEgPj49IDE7CisJCWlmIChyZWFkbChjaGlwLT5pb2FkZHJlc3MpICYgKDEgPDwgY2hpcC0+bGVmdHNoaWZ0KSkKKwkJCWRhdGEgfD0gMHg4MDsKKwl9CisKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIGludCB2MzAyMF9yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmR0KQoreworCXN0cnVjdCB2MzAyMCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB0bXA7CisKKwkvKiBDb3B5IHRoZSBjdXJyZW50IHRpbWUgdG8gcmFtLi4uICovCisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9DTURfQ0xPQ0syUkFNLCAwKTsKKworCS8qIC4uLmFuZCB0aGVuIHJlYWQgY29uc3RhbnQgdmFsdWVzLiAqLworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfU0VDT05EUyk7CisJZHQtPnRtX3NlYwk9IEJDRDJCSU4odG1wKTsKKwl0bXAgPSB2MzAyMF9nZXRfcmVnKGNoaXAsIFYzMDIwX01JTlVURVMpOworCWR0LT50bV9taW4JPSBCQ0QyQklOKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9IT1VSUyk7CisJZHQtPnRtX2hvdXIJPSBCQ0QyQklOKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USF9EQVkpOworCWR0LT50bV9tZGF5CT0gQkNEMkJJTih0bXApOworCXRtcCA9IHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfTU9OVEgpOworCWR0LT50bV9tb24JPSBCQ0QyQklOKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9XRUVLX0RBWSk7CisJZHQtPnRtX3dkYXkJPSBCQ0QyQklOKHRtcCk7CisJdG1wID0gdjMwMjBfZ2V0X3JlZyhjaGlwLCBWMzAyMF9ZRUFSKTsKKwlkdC0+dG1feWVhciA9IEJDRDJCSU4odG1wKSsxMDA7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiXG4lcyA6IFJlYWQgUlRDIHZhbHVlc1xuIixfX0ZVTkNUSU9OX18pOworCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOworCXByaW50aygidG1fbWluIDogJWlcbiIsZHQtPnRtX21pbik7CisJcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKKwlwcmludGsoInRtX3llYXI6ICVpXG4iLGR0LT50bV95ZWFyKTsKKwlwcmludGsoInRtX21vbiA6ICVpXG4iLGR0LT50bV9tb24pOworCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOworCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHYzMDIwX3NldF90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y190aW1lICpkdCkKK3sKKwlzdHJ1Y3QgdjMwMjAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJcbiVzIDogU2V0dGluZyBSVEMgdmFsdWVzXG4iLF9fRlVOQ1RJT05fXyk7CisJcHJpbnRrKCJ0bV9zZWMgOiAlaVxuIixkdC0+dG1fc2VjKTsKKwlwcmludGsoInRtX21pbiA6ICVpXG4iLGR0LT50bV9taW4pOworCXByaW50aygidG1faG91cjogJWlcbiIsZHQtPnRtX2hvdXIpOworCXByaW50aygidG1fbWRheTogJWlcbiIsZHQtPnRtX21kYXkpOworCXByaW50aygidG1fd2RheTogJWlcbiIsZHQtPnRtX3dkYXkpOworCXByaW50aygidG1feWVhcjogJWlcbiIsZHQtPnRtX3llYXIpOworI2VuZGlmCisKKwkvKiBXcml0ZSBhbGwgdGhlIHZhbHVlcyB0byByYW0uLi4gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NFQ09ORFMsIAlCSU4yQkNEKGR0LT50bV9zZWMpKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX01JTlVURVMsIAlCSU4yQkNEKGR0LT50bV9taW4pKTsKKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX0hPVVJTLCAJQklOMkJDRChkdC0+dG1faG91cikpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfTU9OVEhfREFZLAlCSU4yQkNEKGR0LT50bV9tZGF5KSk7CisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9NT05USCwgCUJJTjJCQ0QoZHQtPnRtX21vbikpOworCXYzMDIwX3NldF9yZWcoY2hpcCwgVjMwMjBfV0VFS19EQVksIAlCSU4yQkNEKGR0LT50bV93ZGF5KSk7CisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9ZRUFSLCAJQklOMkJDRChkdC0+dG1feWVhciAlIDEwMCkpOworCisJLyogLi4uYW5kIHNldCB0aGUgY2xvY2suICovCisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9DTURfUkFNMkNMT0NLLCAwKTsKKworCS8qIENvbXB1bGFiIHVzZWQgdGhpcyBkZWxheSBoZXJlLiBJIGRvbnQga25vdyB3aHksCisJICogdGhlIGRhdGFzaGVldCBkb2VzIG5vdCBzcGVjaWZ5IGEgZGVsYXkuICovCisJLyptZGVsYXkoNSk7Ki8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgdjMwMjBfcnRjX29wcyA9IHsKKwkucmVhZF90aW1lCT0gdjMwMjBfcmVhZF90aW1lLAorCS5zZXRfdGltZQk9IHYzMDIwX3NldF90aW1lLAorfTsKKworc3RhdGljIGludCBydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdjMwMjBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdjMwMjAgKmNoaXA7CisJc3RydWN0IHJ0Y19kZXZpY2UgKnJ0YzsKKwlpbnQgcmV0dmFsID0gLUVCVVNZOworCWludCBpOworCWludCB0ZW1wOworCisJaWYgKHBkZXYtPm51bV9yZXNvdXJjZXMgIT0gMSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwZGV2LT5yZXNvdXJjZVswXS5mbGFncyAhPSBJT1JFU09VUkNFX01FTSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChwZGV2ID09IE5VTEwpCisJCXJldHVybiAtRUJVU1k7CisKKwljaGlwID0ga3phbGxvYyhzaXplb2YgKmNoaXAsIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaGlwLT5sZWZ0c2hpZnQgPSBwZGF0YS0+bGVmdHNoaWZ0OworCWNoaXAtPmlvYWRkcmVzcyA9IGlvcmVtYXAocGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsIDEpOworCWlmIChjaGlwLT5pb2FkZHJlc3MgPT0gTlVMTCkKKwkJZ290byBlcnJfY2hpcDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgdjMwMjAgZXhwZWN0cyBhIGNvbW11bmljYXRpb24gY3ljbGUKKwkgKiBieSByZWFkaW5nIDggdGltZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQl0ZW1wID0gcmVhZGwoY2hpcC0+aW9hZGRyZXNzKTsKKworCS8qIFRlc3QgY2hpcCBieSBkb2luZyBhIHdyaXRlL3JlYWQgc2VxdWVuY2UKKwkgKiB0byB0aGUgY2hpcCByYW0gKi8KKwl2MzAyMF9zZXRfcmVnKGNoaXAsIFYzMDIwX1NFQ09ORFMsIDB4MzMpOworCWlmKHYzMDIwX2dldF9yZWcoY2hpcCwgVjMwMjBfU0VDT05EUykgIT0gMHgzMykgeworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGVycl9pbzsKKwl9CisKKwkvKiBNYWtlIHN1cmUgZnJlcXVlbmN5IG1lYXN1cm1lbnQgbW9kZSwgdGVzdCBtb2RlcywgYW5kIGxvY2sKKwkgKiBhcmUgYWxsIGRpc2FibGVkICovCisJdjMwMjBfc2V0X3JlZyhjaGlwLCBWMzAyMF9TVEFUVVNfMCwgMHgwKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJDaGlwIGF2YWlsYWJsZSBhdCBwaHlzaWNhbCBhZGRyZXNzIDB4JXAsIgorCQkiZGF0YSBjb25uZWN0ZWQgdG8gRCVkXG4iLAorCQkodm9pZCopcGRldi0+cmVzb3VyY2VbMF0uc3RhcnQsCisJCWNoaXAtPmxlZnRzaGlmdCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKKworCXJ0YyA9IHJ0Y19kZXZpY2VfcmVnaXN0ZXIoInYzMDIwIiwKKwkJCQkmcGRldi0+ZGV2LCAmdjMwMjBfcnRjX29wcywgVEhJU19NT0RVTEUpOworCWlmIChJU19FUlIocnRjKSkgeworCQlyZXR2YWwgPSBQVFJfRVJSKHJ0Yyk7CisJCWdvdG8gZXJyX2lvOworCX0KKwljaGlwLT5ydGMgPSBydGM7CisKKwlyZXR1cm4gMDsKKworZXJyX2lvOgorCWlvdW5tYXAoY2hpcC0+aW9hZGRyZXNzKTsKK2Vycl9jaGlwOgorCWtmcmVlKGNoaXApOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBydGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdjMwMjAgKmNoaXAgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBydGNfZGV2aWNlICpydGMgPSBjaGlwLT5ydGM7CisKKwlpZiAocnRjKQorCQlydGNfZGV2aWNlX3VucmVnaXN0ZXIocnRjKTsKKworCWlvdW5tYXAoY2hpcC0+aW9hZGRyZXNzKTsKKwlrZnJlZShjaGlwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBydGNfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJPSBydGNfcHJvYmUsCisJLnJlbW92ZSA9IHJ0Y19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAidjMwMjAiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgdjMwMjBfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJ0Y19kZXZpY2VfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHYzMDIwX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcnRjX2RldmljZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh2MzAyMF9pbml0KTsKK21vZHVsZV9leGl0KHYzMDIwX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlYzMDIwIFJUQyIpOworTU9EVUxFX0FVVEhPUigiUmFwaGFlbCBBc3NlbmF0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdnI0MXh4LmMKaW5kZXggMjc3NTk2Yy4uMzNlMDI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXZyNDF4eC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy12cjQxeHguYwpAQCAtODEsNyArODEsNiBAQAogCiAjZGVmaW5lIFJUQ19GUkVRVUVOQ1kJCTMyNzY4CiAjZGVmaW5lIE1BWF9QRVJJT0RJQ19SQVRFCTY1NTMKLSNkZWZpbmUgTUFYX1VTRVJfUEVSSU9ESUNfUkFURQk2NAogCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMxX2Jhc2U7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpydGMyX2Jhc2U7CkBAIC0yNDAsOSArMjM5LDYgQEAKIAkJaWYgKGFyZyA+IE1BWF9QRVJJT0RJQ19SQVRFKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaWYgKGFyZyA+IE1BWF9VU0VSX1BFUklPRElDX1JBVEUgJiYgY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSA9PSAwKQotCQkJcmV0dXJuIC1FQUNDRVM7Ci0KIAkJcGVyaW9kaWNfZnJlcXVlbmN5ID0gYXJnOwogCiAJCWNvdW50ID0gUlRDX0ZSRVFVRU5DWTsKQEAgLTI2MywxMCArMjU5LDYgQEAKIAkJLyogRG9lc24ndCBzdXBwb3J0IGJlZm9yZSAxOTAwICovCiAJCWlmIChhcmcgPCAxOTAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJaWYgKGNhcGFibGUoQ0FQX1NZU19USU1FKSA9PSAwKQotCQkJcmV0dXJuIC1FQUNDRVM7Ci0KIAkJZXBvY2ggPSBhcmc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3F1aWVzY2UuYyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCmluZGV4IDU2ZmE2OTEuLmE0YzUzYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfcXVpZXNjZS5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zaWdwLmg+CkBAIC02Niw4ICs2Nyw2IEBACiB9CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgY3RybF9hbHRfZGVsKHZvaWQpOwotCiAvKiBIYW5kbGVyIGZvciBxdWllc2NlIGV2ZW50LiBTdGFydCBzaHV0ZG93biBwcm9jZWR1cmUuICovCiBzdGF0aWMgdm9pZAogc2NscF9xdWllc2NlX2hhbmRsZXIoc3RydWN0IGV2YnVmX2hlYWRlciAqZXZidWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2VkZHAuYwppbmRleCAwYmFiNjBhLi4zOGFhZDgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfZWRkcC5jCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9lZGRwLmMKQEAgLTQyMCw3ICs0MjAsNyBAQAogICAgICAgIH0KIAl0Y3BoID0gZWRkcC0+c2tiLT5oLnRoOwogCXdoaWxlIChlZGRwLT5za2Jfb2Zmc2V0IDwgZWRkcC0+c2tiLT5sZW4pIHsKLQkJZGF0YV9sZW4gPSBtaW4oKGludClza2Jfc2hpbmZvKGVkZHAtPnNrYiktPnRzb19zaXplLAorCQlkYXRhX2xlbiA9IG1pbigoaW50KXNrYl9zaGluZm8oZWRkcC0+c2tiKS0+Z3NvX3NpemUsCiAJCQkgICAgICAgKGludCkoZWRkcC0+c2tiLT5sZW4gLSBlZGRwLT5za2Jfb2Zmc2V0KSk7CiAJCS8qIHByZXBhcmUgcWRpbyBoZHIgKi8KIAkJaWYgKGVkZHAtPnFoLmhkci5sMi5pZCA9PSBRRVRIX0hFQURFUl9UWVBFX0xBWUVSMil7CkBAIC01MTUsMjAgKzUxNSwyMCBAQAogCiAJUUVUSF9EQkZfVEVYVCh0cmFjZSwgNSwgImVkZHBjYW5wIik7CiAJLyogY2FuIHdlIHB1dCBtdWx0aXBsZSBza2JzIGluIG9uZSBwYWdlPyAqLwotCXNrYnNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSArIGhkcl9sZW4pOworCXNrYnNfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgLyAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSArIGhkcl9sZW4pOwogCWlmIChza2JzX3Blcl9wYWdlID4gMSl7Ci0JCWN0eC0+bnVtX3BhZ2VzID0gKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgKyAxKSAvCisJCWN0eC0+bnVtX3BhZ2VzID0gKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgKyAxKSAvCiAJCQkJIHNrYnNfcGVyX3BhZ2UgKyAxOwogCQljdHgtPmVsZW1lbnRzX3Blcl9za2IgPSAxOwogCX0gZWxzZSB7CiAJCS8qIG5vIC0+IGhvdyBtYW55IGVsZW1lbnRzIHBlciBza2I/ICovCi0JCWN0eC0+ZWxlbWVudHNfcGVyX3NrYiA9IChza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplICsgaGRyX2xlbiArCisJCWN0eC0+ZWxlbWVudHNfcGVyX3NrYiA9IChza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplICsgaGRyX2xlbiArCiAJCQkJICAgICBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CiAJCWN0eC0+bnVtX3BhZ2VzID0gY3R4LT5lbGVtZW50c19wZXJfc2tiICoKLQkJCQkgKHNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgKyAxKTsKKwkJCQkgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgKyAxKTsKIAl9CiAJY3R4LT5udW1fZWxlbWVudHMgPSBjdHgtPmVsZW1lbnRzX3Blcl9za2IgKgotCQkJICAgIChza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzICsgMSk7CisJCQkgICAgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgKyAxKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcWV0aF9lZGRwX2NvbnRleHQgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9tYWluLmMKaW5kZXggOWU2NzFhNC4uNTYwMDlkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbWFpbi5jCkBAIC00NDE3LDcgKzQ0MTcsNyBAQAogCXN0cnVjdCBxZXRoX2VkZHBfY29udGV4dCAqY3R4ID0gTlVMTDsKIAlpbnQgdHhfYnl0ZXMgPSBza2ItPmxlbjsKIAl1bnNpZ25lZCBzaG9ydCBucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0JdW5zaWduZWQgc2hvcnQgdHNvX3NpemUgPSBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplOworCXVuc2lnbmVkIHNob3J0IHRzb19zaXplID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAlpbnQgcmM7CiAKIAlRRVRIX0RCRl9URVhUKHRyYWNlLCA2LCAic2VuZHBrdCIpOwpAQCAtNDQ1Myw3ICs0NDUzLDcgQEAKIAlxdWV1ZSA9IGNhcmQtPnFkaW8ub3V0X3FzCiAJCVtxZXRoX2dldF9wcmlvcml0eV9xdWV1ZShjYXJkLCBza2IsIGlwdiwgY2FzdF90eXBlKV07CiAKLQlpZiAoc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkKKwlpZiAoc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKIAkJbGFyZ2Vfc2VuZCA9IGNhcmQtPm9wdGlvbnMubGFyZ2Vfc2VuZDsKIAogCS8qYXJlIHdlIGFibGUgdG8gZG8gVFNPID8gSWYgc28gLHByZXBhcmUgYW5kIHNlbmQgaXQgZnJvbSBoZXJlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmggYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfdHNvLmgKaW5kZXggMjRlZjQwYy4uNTkzZjI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX3Rzby5oCisrKyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF90c28uaApAQCAtNTEsNyArNTEsNyBAQAogCWhkci0+ZXh0Lmhkcl92ZXJzaW9uID0gMTsKIAloZHItPmV4dC5oZHJfbGVuICAgICA9IDI4OwogCS8qaW5zZXJ0IG5vbi1maXggdmFsdWVzICovCi0JaGRyLT5leHQubXNzID0gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwloZHItPmV4dC5tc3MgPSBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplOwogCWhkci0+ZXh0LmRnX2hkcl9sZW4gPSAoX191MTYpKGlwaC0+aWhsKjQgKyB0Y3BoLT5kb2ZmKjQpOwogCWhkci0+ZXh0LnBheWxvYWRfbGVuID0gKF9fdTE2KShza2ItPmxlbiAtIGhkci0+ZXh0LmRnX2hkcl9sZW4gLQogCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHFldGhfaGRyX3RzbykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKaW5kZXggZDg5ZjgzZi4uMWNjNzA2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCkBAIC01NzUsOSArNTc1LDkgQEAKIAlpbnQgZGV2aWR4ID0gMDsKIAogCXdoaWxlICgoZWNoaWxkID0gYmJjX2kyY19nZXRkZXYoZGV2aWR4KyspKSAhPSBOVUxMKSB7Ci0JCWlmICghc3RyY21wKGVjaGlsZC0+cHJvbV9uYW1lLCAidGVtcGVyYXR1cmUiKSkKKwkJaWYgKCFzdHJjbXAoZWNoaWxkLT5wcm9tX25vZGUtPm5hbWUsICJ0ZW1wZXJhdHVyZSIpKQogCQkJYXR0YWNoX29uZV90ZW1wKGVjaGlsZCwgdGVtcF9pbmRleCsrKTsKLQkJaWYgKCFzdHJjbXAoZWNoaWxkLT5wcm9tX25hbWUsICJmYW4tY29udHJvbCIpKQorCQlpZiAoIXN0cmNtcChlY2hpbGQtPnByb21fbm9kZS0+bmFtZSwgImZhbi1jb250cm9sIikpCiAJCQlhdHRhY2hfb25lX2ZhbihlY2hpbGQsIGZhbl9pbmRleCsrKTsKIAl9CiAJaWYgKHRlbXBfaW5kZXggIT0gMCAmJiBmYW5faW5kZXggIT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jCmluZGV4IDNlMTU2ZTAuLjczNjM0MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMKQEAgLTQyMyw3ICs0MjMsNyBAQAogCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCAiYmJjIikpCisJCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJiYmMiKSkKIAkJCQlyZXR1cm4gMTsKIAkJfQogCX0KQEAgLTQ0Niw3ICs0NDYsNyBAQAogCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCAiaTJjIikpIHsKKwkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImkyYyIpKSB7CiAJCQkJaWYgKCFhdHRhY2hfb25lX2kyYyhlZGV2LCBpbmRleCkpCiAJCQkJCWluZGV4Kys7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYwppbmRleCBjM2E1MWQxLi5kOTJiYzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCBEN1NfT0JQTkFNRSkpCisJCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsIEQ3U19PQlBOQU1FKSkKIAkJCQlnb3RvIGVidXNfZG9uZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwppbmRleCAxOWU4ZWRkLi5jZjk3ZTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCkBAIC03NjgsMTYgKzc2OCwxNCBAQAogICogICAgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIHRhYmxlcywgbW9uaXRvciB0eXBlLCBvcHRpb25hbCBwcm9wZXJ0aWVzLgogICogUmV0dXJuOiBOb25lLgogICovCi1zdGF0aWMgdm9pZCBlbnZjdHJsX2luaXRfYWRjKHN0cnVjdCBpMmNfY2hpbGRfdCAqcGNoaWxkLCBpbnQgbm9kZSkKK3N0YXRpYyB2b2lkIGVudmN0cmxfaW5pdF9hZGMoc3RydWN0IGkyY19jaGlsZF90ICpwY2hpbGQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHApCiB7Ci0JY2hhciBjaG5sc19kZXNjW0NIQU5ORUxfREVTQ19TWl07CiAJaW50IGkgPSAwLCBsZW47Ci0JY2hhciAqcG9zID0gY2hubHNfZGVzYzsKKwljaGFyICpwb3M7CisJdW5zaWduZWQgaW50ICpwdmFsOwogCiAJLyogRmlybXdhcmUgZGVzY3JpYmUgY2hhbm5lbHMgaW50byBhIHN0cmVhbSBzZXBhcmF0ZWQgYnkgYSAnXDAnLiAqLwotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgImNoYW5uZWxzLWRlc2NyaXB0aW9uIiwgY2hubHNfZGVzYywKLQkJCSAgICAgICBDSEFOTkVMX0RFU0NfU1opOwotCWNobmxzX2Rlc2NbQ0hBTk5FTF9ERVNDX1NaIC0gMV0gPSAnXDAnOworCXBvcyA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImNoYW5uZWxzLWRlc2NyaXB0aW9uIiwgJmxlbik7CiAKIAl3aGlsZSAobGVuID4gMCkgewogCQlpbnQgbCA9IHN0cmxlbihwb3MpICsgMTsKQEAgLTc4NywxMCArNzg1LDEzIEBACiAJfQogCiAJLyogR2V0IG9wdGlvbmFsIHByb3BlcnRpZXMuICovCi0gICAgICAgIGxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgIndhcm5pbmctdGVtcCIsIChjaGFyICopJndhcm5pbmdfdGVtcGVyYXR1cmUsCi0JCQkgICAgICAgc2l6ZW9mKHdhcm5pbmdfdGVtcGVyYXR1cmUpKTsKLSAgICAgICAgbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAic2h1dGRvd24tdGVtcCIsIChjaGFyICopJnNodXRkb3duX3RlbXBlcmF0dXJlLAotCQkJICAgICAgIHNpemVvZihzaHV0ZG93bl90ZW1wZXJhdHVyZSkpOworCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJ3YXJuaW5nLXRlbXAiLCBOVUxMKTsKKwlpZiAocHZhbCkKKwkJd2FybmluZ190ZW1wZXJhdHVyZSA9ICpwdmFsOworCisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInNodXRkb3duLXRlbXAiLCBOVUxMKTsKKwlpZiAocHZhbCkKKwkJc2h1dGRvd25fdGVtcGVyYXR1cmUgPSAqcHZhbDsKIH0KIAogLyogRnVuY3Rpb24gRGVzY3JpcHRpb246IEluaXRpYWxpemUgY2hpbGQgZGV2aWNlIG1vbml0b3JpbmcgZmFuIHN0YXR1cy4KQEAgLTg2NCwyMSArODY1LDE4IEBACiBzdGF0aWMgdm9pZCBlbnZjdHJsX2luaXRfaTJjX2NoaWxkKHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkICplZGV2X2NoaWxkLAogCQkJCSAgIHN0cnVjdCBpMmNfY2hpbGRfdCAqcGNoaWxkKQogewotCWludCBub2RlLCBsZW4sIGksIHRibHNfc2l6ZSA9IDA7Ci0KLQlub2RlID0gZWRldl9jaGlsZC0+cHJvbV9ub2RlOworCWludCBsZW4sIGksIHRibHNfc2l6ZSA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IGVkZXZfY2hpbGQtPnByb21fbm9kZTsKKwl2b2lkICpwdmFsOwogCiAJLyogR2V0IGRldmljZSBhZGRyZXNzLiAqLwotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInJlZyIsCi0JCQkgICAgICAgKGNoYXIgKikgJihwY2hpbGQtPmFkZHIpLAotCQkJICAgICAgIHNpemVvZihwY2hpbGQtPmFkZHIpKTsKKwlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7CisJbWVtY3B5KCZwY2hpbGQtPmFkZHIsIHB2YWwsIGxlbik7CiAKIAkvKiBHZXQgdGFibGVzIHByb3BlcnR5LiAgUmVhZCBmaXJtd2FyZSB0ZW1wZXJhdHVyZSB0YWJsZXMuICovCi0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAidHJhbnNsYXRpb24iLAotCQkJICAgICAgIChjaGFyICopIHBjaGlsZC0+dGJscHJvcF9hcnJheSwKLQkJCSAgICAgICAoUENGODU4NF9NQVhfQ0hBTk5FTFMgKgotCQkJCXNpemVvZihzdHJ1Y3QgcGNmODU4NF90Ymxwcm9wKSkpOwotCWlmIChsZW4gPiAwKSB7CisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInRyYW5zbGF0aW9uIiwgJmxlbik7CisJaWYgKHB2YWwgJiYgbGVuID4gMCkgeworCQltZW1jcHkocGNoaWxkLT50Ymxwcm9wX2FycmF5LCBwdmFsLCBsZW4pOwogICAgICAgICAgICAgICAgIHBjaGlsZC0+dG90YWxfdGJscyA9IGxlbiAvIHNpemVvZihzdHJ1Y3QgcGNmODU4NF90Ymxwcm9wKTsKIAkJZm9yIChpID0gMDsgaSA8IHBjaGlsZC0+dG90YWxfdGJsczsgaSsrKSB7CiAJCQlpZiAoKHBjaGlsZC0+dGJscHJvcF9hcnJheVtpXS5zaXplICsgcGNoaWxkLT50Ymxwcm9wX2FycmF5W2ldLm9mZnNldCkgPiB0YmxzX3NpemUpIHsKQEAgLTg5MSwxMiArODg5LDEyIEBACiAJCQlwcmludGsoImVudmN0cmw6IEZhaWxlZCB0byBhbGxvY2F0ZSB0YWJsZS5cbiIpOwogCQkJcmV0dXJuOwogCQl9Ci0gICAgICAgICAgICAgICAgbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAidGFibGVzIiwKLQkJCQkgICAgICAgKGNoYXIgKikgcGNoaWxkLT50YWJsZXMsIHRibHNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CisJCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJ0YWJsZXMiLCAmbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAoIXB2YWwgfHwgbGVuIDw9IDApIHsKIAkJCXByaW50aygiZW52Y3RybDogRmFpbGVkIHRvIGdldCB0YWJsZS5cbiIpOwogCQkJcmV0dXJuOwogCQl9CisJCW1lbWNweShwY2hpbGQtPnRhYmxlcywgcHZhbCwgbGVuKTsKIAl9CiAKIAkvKiBTUEFSQ2VuZ2luZSBBU00gUmVmZXJlbmNlIE1hbnVhbCAocmVmLiBTTUkgZG9jIDgwNS03NTgxLTA0KQpAQCAtOTA3LDEyICs5MDUsMTEgQEAKIAkgKiAnTlVMTCcgbW9uaXRvciB0eXBlLgogCSAqLwogCWlmIChFTlZDVFJMX0NQQ0lfSUdOT1JFRF9OT0RFID09IHBjaGlsZC0+YWRkcikgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Rfbm9kZTsKIAkJaW50IGxlbjsKLQkJY2hhciBwcm9wWzU2XTsKIAotCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHByb21fcm9vdF9ub2RlLCAibmFtZSIsIHByb3AsIHNpemVvZihwcm9wKSk7Ci0JCWlmICgwIDwgbGVuICYmICgwID09IHN0cm5jbXAocHJvcCwgIlNVTlcsVWx0cmFTUEFSQy1JSWktY0VuZ2luZSIsIGxlbikpKQotCQl7CisJCXJvb3Rfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJCWlmICghc3RyY21wKHJvb3Rfbm9kZS0+bmFtZSwgIlNVTlcsVWx0cmFTUEFSQy1JSWktY0VuZ2luZSIpKSB7CiAJCQlmb3IgKGxlbiA9IDA7IGxlbiA8IFBDRjg1ODRfTUFYX0NIQU5ORUxTOyArK2xlbikgewogCQkJCXBjaGlsZC0+bW9uX3R5cGVbbGVuXSA9IEVOVkNUUkxfTk9NT047CiAJCQl9CkBAIC05MjEsMTYgKzkxOCwxNCBAQAogCX0KIAogCS8qIEdldCB0aGUgbW9uaXRvciBjaGFubmVscy4gKi8KLQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJjaGFubmVscy1pbi11c2UiLAotCQkJICAgICAgIChjaGFyICopIHBjaGlsZC0+Y2hubF9hcnJheSwKLQkJCSAgICAgICAoUENGODU4NF9NQVhfQ0hBTk5FTFMgKgotCQkJCXNpemVvZihzdHJ1Y3QgcGNmODU4NF9jaGFubmVsKSkpOworCXB2YWwgPSBvZl9nZXRfcHJvcGVydHkoZHAsICJjaGFubmVscy1pbi11c2UiLCAmbGVuKTsKKwltZW1jcHkocGNoaWxkLT5jaG5sX2FycmF5LCBwdmFsLCBsZW4pOwogCXBjaGlsZC0+dG90YWxfY2hubHMgPSBsZW4gLyBzaXplb2Yoc3RydWN0IHBjZjg1ODRfY2hhbm5lbCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGNoaWxkLT50b3RhbF9jaG5sczsgaSsrKSB7CiAJCXN3aXRjaCAocGNoaWxkLT5jaG5sX2FycmF5W2ldLnR5cGUpIHsKIAkJY2FzZSBQQ0Y4NTg0X1RFTVBfVFlQRToKLQkJCWVudmN0cmxfaW5pdF9hZGMocGNoaWxkLCBub2RlKTsKKwkJCWVudmN0cmxfaW5pdF9hZGMocGNoaWxkLCBkcCk7CiAJCQlicmVhazsKIAogCQljYXNlIFBDRjg1ODRfR0xPQkFMQUREUl9UWVBFOgpAQCAtOTQ1LDcgKzk0MCw3IEBACiAKIAkJY2FzZSBQQ0Y4NTg0X1ZPTFRBR0VfVFlQRToKIAkJCWlmIChwY2hpbGQtPmkyY3R5cGUgPT0gSTJDX0FEQykgewotCQkJCWVudmN0cmxfaW5pdF9hZGMocGNoaWxkLG5vZGUpOworCQkJCWVudmN0cmxfaW5pdF9hZGMocGNoaWxkLGRwKTsKIAkJCX0gZWxzZSB7CiAJCQkJZW52Y3RybF9pbml0X3ZvbHRhZ2Vfc3RhdHVzKHBjaGlsZCk7CiAJCQl9CkBAIC0xMDQ2LDcgKzEwNDEsNyBAQAogCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9uYW1lLCAiYmJjIikpIHsKKwkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImJiYyIpKSB7CiAJCQkJLyogSWYgd2UgZmluZCBhIGJvb3QtYnVzIGNvbnRyb2xsZXIgbm9kZSwKIAkJCQkgKiB0aGVuIHRoaXMgZW52Y3RybCBkcml2ZXIgaXMgbm90IGZvciB1cy4KIAkJCQkgKi8KQEAgLTEwNjAsMTQgKzEwNTUsMTQgQEAKIAkgKi8KIAlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJpMmMiKSkgeworCQkJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiaTJjIikpIHsKIAkJCQlpMmMgPSBpb3JlbWFwKGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0LCAweDIpOwogCQkJCWZvcl9lYWNoX2VkZXZjaGlsZChlZGV2LCBlZGV2X2NoaWxkKSB7Ci0JCQkJCWlmICghc3RyY21wKCJncGlvIiwgZWRldl9jaGlsZC0+cHJvbV9uYW1lKSkgeworCQkJCQlpZiAoIXN0cmNtcCgiZ3BpbyIsIGVkZXZfY2hpbGQtPnByb21fbm9kZS0+bmFtZSkpIHsKIAkJCQkJCWkyY19jaGlsZGxpc3RbaV0uaTJjdHlwZSA9IEkyQ19HUElPOwogCQkJCQkJZW52Y3RybF9pbml0X2kyY19jaGlsZChlZGV2X2NoaWxkLCAmKGkyY19jaGlsZGxpc3RbaSsrXSkpOwogCQkJCQl9Ci0JCQkJCWlmICghc3RyY21wKCJhZGMiLCBlZGV2X2NoaWxkLT5wcm9tX25hbWUpKSB7CisJCQkJCWlmICghc3RyY21wKCJhZGMiLCBlZGV2X2NoaWxkLT5wcm9tX25vZGUtPm5hbWUpKSB7CiAJCQkJCQlpMmNfY2hpbGRsaXN0W2ldLmkyY3R5cGUgPSBJMkNfQURDOwogCQkJCQkJZW52Y3RybF9pbml0X2kyY19jaGlsZChlZGV2X2NoaWxkLCAmKGkyY19jaGlsZGxpc3RbaSsrXSkpOwogCQkJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCAyYmViM2RkLi4zMWI4YTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAlpZiAodm1hLT52bV9lbmQgLSAodm1hLT52bV9zdGFydCArICh2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpKSA+IHNpemUpCiAJCXNpemUgPSB2bWEtPnZtX2VuZCAtICh2bWEtPnZtX3N0YXJ0ICsgKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCkpOwogCi0Jdm1hLT52bV9mbGFncyB8PSAoVk1fU0hNIHwgVk1fTE9DS0VEKTsKIAl2bWEtPnZtX3BhZ2VfcHJvdCA9IHBncHJvdF9ub25jYWNoZWQodm1hLT52bV9wYWdlX3Byb3QpOwogCiAJaWYgKGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIGFkZHIsIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKQEAgLTE5Miw5ICsxOTEsMTEgQEAKIAl9CiAJaWYgKCFzZGV2KSB7CiAjaWZkZWYgQ09ORklHX1BDSQorCQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKmVidXNfcmVnczsKKwogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImZsYXNocHJvbSIpKQorCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImZsYXNocHJvbSIpKQogCQkJCQlnb3RvIGVidXNfZG9uZTsKIAkJCX0KIAkJfQpAQCAtMjAyLDIzICsyMDMsMjMgQEAKIAkJaWYgKCFlZGV2KQogCQkJcmV0dXJuIC1FTk9ERVY7CiAKLQkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsICJyZWciLCAodm9pZCAqKXJlZ3MsIHNpemVvZihyZWdzKSk7Ci0JCWlmICgobGVuICUgc2l6ZW9mKHJlZ3NbMF0pKSAhPSAwKSB7CisJCWVidXNfcmVncyA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsICJyZWciLCAmbGVuKTsKKwkJaWYgKCFlYnVzX3JlZ3MgfHwgKGxlbiAlIHNpemVvZihyZWdzWzBdKSkgIT0gMCkgewogCQkJcHJpbnRrKCJmbGFzaDogU3RyYW5nZSByZWcgcHJvcGVydHkgc2l6ZSAlZFxuIiwgbGVuKTsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CiAKLQkJbnJlZ3MgPSBsZW4gLyBzaXplb2YocmVnc1swXSk7CisJCW5yZWdzID0gbGVuIC8gc2l6ZW9mKGVidXNfcmVnc1swXSk7CiAKIAkJZmxhc2gucmVhZF9iYXNlID0gZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQ7Ci0JCWZsYXNoLnJlYWRfc2l6ZSA9IHJlZ3NbMF0ucmVnX3NpemU7CisJCWZsYXNoLnJlYWRfc2l6ZSA9IGVidXNfcmVnc1swXS5yZWdfc2l6ZTsKIAogCQlpZiAobnJlZ3MgPT0gMSkgewogCQkJZmxhc2gud3JpdGVfYmFzZSA9IGVkZXYtPnJlc291cmNlWzBdLnN0YXJ0OwotCQkJZmxhc2gud3JpdGVfc2l6ZSA9IHJlZ3NbMF0ucmVnX3NpemU7CisJCQlmbGFzaC53cml0ZV9zaXplID0gZWJ1c19yZWdzWzBdLnJlZ19zaXplOwogCQl9IGVsc2UgaWYgKG5yZWdzID09IDIpIHsKIAkJCWZsYXNoLndyaXRlX2Jhc2UgPSBlZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKLQkJCWZsYXNoLndyaXRlX3NpemUgPSByZWdzWzFdLnJlZ19zaXplOworCQkJZmxhc2gud3JpdGVfc2l6ZSA9IGVidXNfcmVnc1sxXS5yZWdfc2l6ZTsKIAkJfSBlbHNlIHsKIAkJCXByaW50aygiZmxhc2g6IFN0cmFuZ2UgbnVtYmVyIG9mIHJlZ3MgJWRcbiIsIG5yZWdzKTsKIAkJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYyBiL2RyaXZlcnMvc2J1cy9jaGFyL29wZW5wcm9tLmMKaW5kZXggMjM5ZTEwOC4uY2Y1YjQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvb3BlbnByb20uYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9vcGVucHJvbS5jCkBAIC0yNDMsOCArMjQzLDggQEAKIAkJCQkJICAgICAgKChpbnQgKikgb3BwLT5vcHJvbV9hcnJheSlbMV0pOwogCiAJCQlwY3AgPSBwZGV2LT5zeXNkYXRhOwotCQkJaWYgKHBjcCAhPSBOVUxMICYmIHBjcC0+cHJvbV9ub2RlICE9IC0xICYmIHBjcC0+cHJvbV9ub2RlKSB7Ci0JCQkJbm9kZSA9IHBjcC0+cHJvbV9ub2RlOworCQkJaWYgKHBjcCAhPSBOVUxMKSB7CisJCQkJbm9kZSA9IHBjcC0+cHJvbV9ub2RlLT5ub2RlOwogCQkJCWRhdGEtPmN1cnJlbnRfbm9kZSA9IG5vZGU7CiAJCQkJKigoaW50ICopb3BwLT5vcHJvbV9hcnJheSkgPSBub2RlOwogCQkJCW9wcC0+b3Byb21fc2l6ZSA9IHNpemVvZihpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jIGIvZHJpdmVycy9zYnVzL2NoYXIvdmZjX2Rldi5jCmluZGV4IGRmZGQ2YmUuLmRkY2QzMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3ZmY19kZXYuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci92ZmNfZGV2LmMKQEAgLTYyMyw3ICs2MjMsNyBAQAogCQltYXBfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmZjX3JlZ3MpOwogCiAJdm1hLT52bV9mbGFncyB8PQotCQkoVk1fU0hNIHwgVk1fTE9DS0VEIHwgVk1fSU8gfCBWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlTSEFSRSk7CisJCShWTV9NQVlSRUFEIHwgVk1fTUFZV1JJVEUgfCBWTV9NQVlTSEFSRSk7CiAJbWFwX29mZnNldCA9ICh1bnNpZ25lZCBpbnQpIChsb25nKWRldi0+cGh5c19yZWdzOwogCXJldCA9IGlvX3JlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCiAJCQkJICBNS19JT1NQQUNFX1BGTihkZXYtPndoaWNoX2lvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL3NidXMuYyBiL2RyaXZlcnMvc2J1cy9zYnVzLmMKaW5kZXggNWQzMGEzZS4uMzg3YTZhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL3NidXMuYworKysgYi9kcml2ZXJzL3NidXMvc2J1cy5jCkBAIC0xLDcgKzEsNiBAQAotLyogJElkOiBzYnVzLmMsdiAxLjEwMCAyMDAyLzAxLzI0IDE1OjM2OjI0IGRhdmVtIEV4cCAkCi0gKiBzYnVzLmM6ICBTQnVzIHN1cHBvcnQgcm91dGluZXMuCisvKiBzYnVzLmM6IFNCdXMgc3VwcG9ydCByb3V0aW5lcy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk1LCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNCwyMzcgKzEzLDc2IEBACiAjaW5jbHVkZSA8YXNtL3NidXMuaD4KICNpbmNsdWRlIDxhc20vZG1hLmg+CiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2JwcC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotc3RydWN0IHNidXNfYnVzICpzYnVzX3Jvb3QgPSBOVUxMOworc3RydWN0IHNidXNfYnVzICpzYnVzX3Jvb3Q7CiAKLXN0YXRpYyBzdHJ1Y3QgbGludXhfcHJvbV9pcnFzIGlycXNbUFJPTUlOVFJfTUFYXSBfX2luaXRkYXRhID0geyB7IDAgfSB9OwotI2lmZGVmIENPTkZJR19TUEFSQzMyCi1zdGF0aWMgaW50IGludGVycnVwdHNbUFJPTUlOVFJfTUFYXSBfX2luaXRkYXRhID0geyAwIH07Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19QQ0kKLWV4dGVybiBpbnQgcGNpY19wcmVzZW50KHZvaWQpOwotI2VuZGlmCi0KLS8qIFBlcmhhcHMgd2hlbiBJIGZpZ3VyZSBvdXQgbW9yZSBhYm91dCB0aGUgaW9tbXUgd2UnbGwgcHV0IGEKLSAqIGRldmljZSByZWdpc3RyYXRpb24gcm91dGluZSBoZXJlIHRoYXQgcHJvYmVfc2J1cygpIGNhbGxzIHRvCi0gKiBzZXR1cCB0aGUgaW9tbXUgZm9yIGVhY2ggU2J1cy4KLSAqLwotCi0vKiBXZSBjYWxsIHRoaXMgZm9yIGVhY2ggU0J1cyBkZXZpY2UsIGFuZCBmaWxsIHRoZSBzdHJ1Y3R1cmUgYmFzZWQKLSAqIHVwb24gdGhlIHByb20gZGV2aWNlIHRyZWUuICBXZSByZXR1cm4gdGhlIHN0YXJ0IG9mIG1lbW9yeSBhZnRlcgotICogdGhlIHRoaW5ncyB3ZSBoYXZlIGFsbG9jYXRlZC4KLSAqLwotCi0vKiAjZGVmaW5lIERFQlVHX0ZJTEwgKi8KLQotc3RhdGljIHZvaWQgX19pbml0IGZpbGxfc2J1c19kZXZpY2UoaW50IHByb21fbm9kZSwgc3RydWN0IHNidXNfZGV2ICpzZGV2KQorc3RhdGljIHZvaWQgX19pbml0IGZpbGxfc2J1c19kZXZpY2Uoc3RydWN0IGRldmljZV9ub2RlICpkcCwgc3RydWN0IHNidXNfZGV2ICpzZGV2KQogewotCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgYmFzZTsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJdm9pZCAqcHZhbDsKIAlpbnQgbGVuOwogCi0Jc2Rldi0+cHJvbV9ub2RlID0gcHJvbV9ub2RlOwotCXByb21fZ2V0c3RyaW5nKHByb21fbm9kZSwgIm5hbWUiLAotCQkgICAgICAgc2Rldi0+cHJvbV9uYW1lLCBzaXplb2Yoc2Rldi0+cHJvbV9uYW1lKSk7Ci0JYWRkcmVzcyA9IHByb21fZ2V0aW50KHByb21fbm9kZSwgImFkZHJlc3MiKTsKLQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KHByb21fbm9kZSwgInJlZyIsCi0JCQkgICAgICAgKGNoYXIgKikgc2Rldi0+cmVnX2FkZHJzLAotCQkJICAgICAgIHNpemVvZihzZGV2LT5yZWdfYWRkcnMpKTsKLQlpZiAobGVuID09IC0xKSB7Ci0JCXNkZXYtPm51bV9yZWdpc3RlcnMgPSAwOwotCQlnb3RvIG5vX3JlZ3M7CisJc2Rldi0+cHJvbV9ub2RlID0gZHAtPm5vZGU7CisJc3RyY3B5KHNkZXYtPnByb21fbmFtZSwgZHAtPm5hbWUpOworCisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJlZyIsICZsZW4pOworCXNkZXYtPm51bV9yZWdpc3RlcnMgPSAwOworCWlmIChwdmFsKSB7CisJCW1lbWNweShzZGV2LT5yZWdfYWRkcnMsIHB2YWwsIGxlbik7CisKKwkJc2Rldi0+bnVtX3JlZ2lzdGVycyA9CisJCQlsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmVnaXN0ZXJzKTsKKworCQliYXNlID0gKHVuc2lnbmVkIGxvbmcpIHNkZXYtPnJlZ19hZGRyc1swXS5waHlzX2FkZHI7CisKKwkJLyogQ29tcHV0ZSB0aGUgc2xvdCBudW1iZXIuICovCisJCWlmIChiYXNlID49IFNVTl9TQlVTX0JWQUREUiAmJiBzcGFyY19jcHVfbW9kZWwgPT0gc3VuNG0pCisJCQlzZGV2LT5zbG90ID0gc2J1c19kZXZfc2xvdChiYXNlKTsKKwkJZWxzZQorCQkJc2Rldi0+c2xvdCA9IHNkZXYtPnJlZ19hZGRyc1swXS53aGljaF9pbzsKIAl9CiAKLQlpZiAobGVuICUgc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykpIHsKLQkJcHJvbV9wcmludGYoImZpbGxfc2J1c19kZXZpY2U6IHByb3BsZW4gZm9yIHJlZ3Mgb2YgJXMgIgotCQkJICAgICIgd2FzICVkLCBuZWVkIG11bHRpcGxlIG9mICVkXG4iLAotCQkJICAgIHNkZXYtPnByb21fbmFtZSwgbGVuLAotCQkJICAgIChpbnQpIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCWlmIChsZW4gPiAoc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JlZ2lzdGVycykgKiBQUk9NUkVHX01BWCkpIHsKLQkJcHJvbV9wcmludGYoImZpbGxfc2J1c19kZXZpY2U6IFRvbyBtYW55IHJlZ2lzdGVyIHByb3BlcnRpZXMgIgotCQkJICAgICJmb3IgZGV2aWNlICVzLCBsZW49JWRcbiIsCi0JCQkgICAgc2Rldi0+cHJvbV9uYW1lLCBsZW4pOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0Jc2Rldi0+bnVtX3JlZ2lzdGVycyA9IGxlbiAvIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMpOwotCXNkZXYtPnJhbmdlc19hcHBsaWVkID0gMDsKLQotCWJhc2UgPSAodW5zaWduZWQgbG9uZykgc2Rldi0+cmVnX2FkZHJzWzBdLnBoeXNfYWRkcjsKLQotCS8qIENvbXB1dGUgdGhlIHNsb3QgbnVtYmVyLiAqLwotCWlmIChiYXNlID49IFNVTl9TQlVTX0JWQUREUiAmJiBzcGFyY19jcHVfbW9kZWwgPT0gc3VuNG0pIHsKLQkJc2Rldi0+c2xvdCA9IHNidXNfZGV2X3Nsb3QoYmFzZSk7Ci0JfSBlbHNlIHsKLQkJc2Rldi0+c2xvdCA9IHNkZXYtPnJlZ19hZGRyc1swXS53aGljaF9pbzsKKwlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmFuZ2VzIiwgJmxlbik7CisJc2Rldi0+bnVtX2RldmljZV9yYW5nZXMgPSAwOworCWlmIChwdmFsKSB7CisJCW1lbWNweShzZGV2LT5kZXZpY2VfcmFuZ2VzLCBwdmFsLCBsZW4pOworCQlzZGV2LT5udW1fZGV2aWNlX3JhbmdlcyA9CisJCQlsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKTsKIAl9CiAKLW5vX3JlZ3M6Ci0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJyYW5nZXMiLAotCQkJICAgICAgIChjaGFyICopc2Rldi0+ZGV2aWNlX3JhbmdlcywKLQkJCSAgICAgICBzaXplb2Yoc2Rldi0+ZGV2aWNlX3JhbmdlcykpOwotCWlmIChsZW4gPT0gLTEpIHsKLQkJc2Rldi0+bnVtX2RldmljZV9yYW5nZXMgPSAwOwotCQlnb3RvIG5vX3JhbmdlczsKLQl9Ci0JaWYgKGxlbiAlIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKSB7Ci0JCXByb21fcHJpbnRmKCJmaWxsX3NidXNfZGV2aWNlOiBwcm9wbGVuIGZvciByYW5nZXMgb2YgJXMgIgotCQkJICAgICIgd2FzICVkLCBuZWVkIG11bHRpcGxlIG9mICVkXG4iLAotCQkJICAgIHNkZXYtPnByb21fbmFtZSwgbGVuLAotCQkJICAgIChpbnQpIHNpemVvZihzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMpKTsKLQkJcHJvbV9oYWx0KCk7Ci0JfQotCWlmIChsZW4gPiAoc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykgKiBQUk9NUkVHX01BWCkpIHsKLQkJcHJvbV9wcmludGYoImZpbGxfc2J1c19kZXZpY2U6IFRvbyBtYW55IHJhbmdlIHByb3BlcnRpZXMgIgotCQkJICAgICJmb3IgZGV2aWNlICVzLCBsZW49JWRcbiIsCi0JCQkgICAgc2Rldi0+cHJvbV9uYW1lLCBsZW4pOwotCQlwcm9tX2hhbHQoKTsKLQl9Ci0Jc2Rldi0+bnVtX2RldmljZV9yYW5nZXMgPQotCQlsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKTsKKwlzYnVzX2ZpbGxfZGV2aWNlX2lycShzZGV2KTsKIAotbm9fcmFuZ2VzOgotCS8qIFhYWCBVbmZvcnR1bmF0ZWx5LCBJUlEgaXNzdWVzIGFyZSB2ZXJ5IGFyY2ggc3BlY2lmaWMuCi0JICogWFhYIFB1bGwgdGhpcyBjcnVkIG91dCBpbnRvIGFuIGFyY2ggc3BlY2lmaWMgYXJlYQotCSAqIFhYWCBhdCBzb21lIHBvaW50LiAtRGF2ZU0KLQkgKi8KLSNpZmRlZiBDT05GSUdfU1BBUkM2NAotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ZXJydXB0cyIsCi0JCQkgICAgICAgKGNoYXIgKikgaXJxcywgc2l6ZW9mKGlycXMpKTsKLQlpZiAobGVuID09IC0xIHx8IGxlbiA9PSAwKSB7Ci0JCXNkZXYtPmlycXNbMF0gPSAwOwotCQlzZGV2LT5udW1faXJxcyA9IDA7Ci0JfSBlbHNlIHsKLQkJdW5zaWduZWQgaW50IHByaSA9IGlycXNbMF0ucHJpOworCXNkZXYtPm9mZGV2Lm5vZGUgPSBkcDsKKwlpZiAoc2Rldi0+cGFyZW50KQorCQlzZGV2LT5vZmRldi5kZXYucGFyZW50ID0gJnNkZXYtPnBhcmVudC0+b2ZkZXYuZGV2OworCWVsc2UKKwkJc2Rldi0+b2ZkZXYuZGV2LnBhcmVudCA9ICZzZGV2LT5idXMtPm9mZGV2LmRldjsKKwlzZGV2LT5vZmRldi5kZXYuYnVzID0gJnNidXNfYnVzX3R5cGU7CisJc3RyY3B5KHNkZXYtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKIAotCQlzZGV2LT5udW1faXJxcyA9IDE7Ci0JCWlmIChwcmkgPCAweDIwKQotCQkJcHJpICs9IHNkZXYtPnNsb3QgKiA4OwotCi0JCXNkZXYtPmlycXNbMF0gPQlzYnVzX2J1aWxkX2lycShzZGV2LT5idXMsIHByaSk7Ci0JfQotI2VuZGlmIC8qIENPTkZJR19TUEFSQzY0ICovCi0KLSNpZmRlZiBDT05GSUdfU1BBUkMzMgotCWxlbiA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ciIsCi0JCQkgICAgICAgKGNoYXIgKilpcnFzLCBzaXplb2YoaXJxcykpOwotCWlmIChsZW4gIT0gLTEpIHsKLQkJc2Rldi0+bnVtX2lycXMgPSBsZW4gLyA4OwotCQlpZiAoc2Rldi0+bnVtX2lycXMgPT0gMCkgewotCQkJc2Rldi0+aXJxc1swXSA9IDA7Ci0JCX0gZWxzZSBpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKSB7Ci0JCQlleHRlcm4gdW5zaWduZWQgaW50IHN1bjRkX2J1aWxkX2lycShzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsIGludCBpcnEpOwotCi0JCQlmb3IgKGxlbiA9IDA7IGxlbiA8IHNkZXYtPm51bV9pcnFzOyBsZW4rKykKLQkJCQlzZGV2LT5pcnFzW2xlbl0gPSBzdW40ZF9idWlsZF9pcnEoc2RldiwgaXJxc1tsZW5dLnByaSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGxlbiA9IDA7IGxlbiA8IHNkZXYtPm51bV9pcnFzOyBsZW4rKykKLQkJCQlzZGV2LT5pcnFzW2xlbl0gPSBpcnFzW2xlbl0ucHJpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTm8gImludHIiIG5vZGUgZm91bmQtLSBjaGVjayBmb3IgImludGVycnVwdHMiIG5vZGUuCi0JCSAqIFRoaXMgbm9kZSBjb250YWlucyBTQnVzIGludGVycnVwdCBsZXZlbHMsIG5vdCBJUExzCi0JCSAqIGFzIGluICJpbnRyIiwgYW5kIG5vIHZlY3RvciB2YWx1ZXMuICBXZSBjb252ZXJ0IAotCQkgKiBTQnVzIGludGVycnVwdCBsZXZlbHMgdG8gUElMcyAocGxhdGZvcm0gc3BlY2lmaWMpLgotCQkgKi8KLQkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShwcm9tX25vZGUsICJpbnRlcnJ1cHRzIiwgCi0JCQkJCShjaGFyICopaW50ZXJydXB0cywgc2l6ZW9mKGludGVycnVwdHMpKTsKLQkJaWYgKGxlbiA9PSAtMSkgewotCQkJc2Rldi0+aXJxc1swXSA9IDA7Ci0JCQlzZGV2LT5udW1faXJxcyA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlzZGV2LT5udW1faXJxcyA9IGxlbiAvIHNpemVvZihpbnQpOwotCQkJZm9yIChsZW4gPSAwOyBsZW4gPCBzZGV2LT5udW1faXJxczsgbGVuKyspIHsKLQkJCQlzZGV2LT5pcnFzW2xlbl0gPSBzYmludF90b19pcnEoc2RldiwgaW50ZXJydXB0c1tsZW5dKTsKLQkJCX0KLQkJfQotCX0gCi0jZW5kaWYgLyogQ09ORklHX1NQQVJDMzIgKi8KKwlpZiAob2ZfZGV2aWNlX3JlZ2lzdGVyKCZzZGV2LT5vZmRldikgIT0gMCkKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IgZm9yICVzIVxuIiwKKwkJICAgICAgIHNkZXYtPm9mZGV2LmRldi5idXNfaWQpOwogfQogCi0vKiBUaGlzIHJvdXRpbmUgZ2V0cyBjYWxsZWQgZnJvbSB3aG9ldmVyIG5lZWRzIHRoZSBzYnVzIGZpcnN0LCB0byBzY2FuCi0gKiB0aGUgU0J1cyBkZXZpY2UgdHJlZS4gIEN1cnJlbnRseSBpdCBqdXN0IHByaW50cyBvdXQgdGhlIGRldmljZXMKLSAqIGZvdW5kIG9uIHRoZSBidXMgYW5kIGJ1aWxkcyB0cmVlcyBvZiBTQlVTIHN0cnVjdHMgYW5kIGF0dGFjaGVkCi0gKiBkZXZpY2VzLgotICovCi0KLWV4dGVybiB2b2lkIGlvbW11X2luaXQoaW50IGlvbW11X25vZGUsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cyk7Ci1leHRlcm4gdm9pZCBpb3VuaXRfaW5pdChpbnQgc2JpX25vZGUsIGludCBpb3VuaXRfbm9kZSwgc3RydWN0IHNidXNfYnVzICpzYnVzKTsKLXZvaWQgc3VuNF9pbml0KHZvaWQpOwotI2lmZGVmIENPTkZJR19TVU5fQVVYSU8KLWV4dGVybiB2b2lkIGF1eGlvX3Byb2JlKHZvaWQpOwotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBzYnVzX2RvX2NoaWxkX3NpYmxpbmdzKGludCBzdGFydF9ub2RlLAotCQkJCQkgIHN0cnVjdCBzYnVzX2RldiAqY2hpbGQsCi0JCQkJCSAgc3RydWN0IHNidXNfZGV2ICpwYXJlbnQsCi0JCQkJCSAgc3RydWN0IHNidXNfYnVzICpzYnVzKQorc3RhdGljIHZvaWQgX19pbml0IHNidXNfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cykKIHsKLQlzdHJ1Y3Qgc2J1c19kZXYgKnRoaXNfZGV2ID0gY2hpbGQ7Ci0JaW50IHRoaXNfbm9kZSA9IHN0YXJ0X25vZGU7Ci0KLQkvKiBDaGlsZCBhbHJlYWR5IGZpbGxlZCBpbiwganVzdCBuZWVkIHRvIHRyYXZlcnNlIHNpYmxpbmdzLiAqLwotCWNoaWxkLT5jaGlsZCA9IE5VTEw7Ci0JY2hpbGQtPnBhcmVudCA9IHBhcmVudDsKLQl3aGlsZSgodGhpc19ub2RlID0gcHJvbV9nZXRzaWJsaW5nKHRoaXNfbm9kZSkpICE9IDApIHsKLQkJdGhpc19kZXYtPm5leHQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2J1c19kZXYpLCBHRlBfQVRPTUlDKTsKLQkJdGhpc19kZXYgPSB0aGlzX2Rldi0+bmV4dDsKLQkJdGhpc19kZXYtPm5leHQgPSBOVUxMOwotCQl0aGlzX2Rldi0+cGFyZW50ID0gcGFyZW50OwotCi0JCXRoaXNfZGV2LT5idXMgPSBzYnVzOwotCQlmaWxsX3NidXNfZGV2aWNlKHRoaXNfbm9kZSwgdGhpc19kZXYpOwotCi0JCWlmKHByb21fZ2V0Y2hpbGQodGhpc19ub2RlKSkgewotCQkJdGhpc19kZXYtPmNoaWxkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfZGV2KSwKLQkJCQkJCSAgR0ZQX0FUT01JQyk7Ci0JCQl0aGlzX2Rldi0+Y2hpbGQtPmJ1cyA9IHNidXM7Ci0JCQl0aGlzX2Rldi0+Y2hpbGQtPm5leHQgPSBOVUxMOwotCQkJZmlsbF9zYnVzX2RldmljZShwcm9tX2dldGNoaWxkKHRoaXNfbm9kZSksIHRoaXNfZGV2LT5jaGlsZCk7Ci0JCQlzYnVzX2RvX2NoaWxkX3NpYmxpbmdzKHByb21fZ2V0Y2hpbGQodGhpc19ub2RlKSwKLQkJCQkJICAgICAgIHRoaXNfZGV2LT5jaGlsZCwgdGhpc19kZXYsIHNidXMpOwotCQl9IGVsc2UgewotCQkJdGhpc19kZXYtPmNoaWxkID0gTlVMTDsKLQkJfQotCX0KLX0KLQotLyoKLSAqIFhYWCBUaGlzIGZ1bmN0aW9ucyBhcHBlYXJzIHRvIGJlIGEgZGlzdG9ydGVkIHZlcnNpb24gb2YKLSAqIHByb21fc2J1c19yYW5nZXNfaW5pdCgpLCB3aXRoIGFsbCBzdW40ZCBzdHVmZiBjdXQgYXdheS4KLSAqIEFzayBEYXZlTSB3aGF0IGlzIGdvaW5nIG9uIGhlcmUsIGhvdyBpcyBzdW40ZCBzdXBwb3NlZCB0byB3b3JrLi4uIFhYWAotICovCi0vKiBhZGRlZCBiYWNrIHN1bjRkIHBhdGNoIGZyb20gVGhvbWFzIEJvZ2VuZG9lcmZlciAtIHNob3VsZCBiZSBPSyAoY3JuKSAqLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc2J1c19idXNfcmFuZ2VzX2luaXQoaW50IHBhcmVudF9ub2RlLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCi17CisJdm9pZCAqcHZhbDsKIAlpbnQgbGVuOwogCi0JbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShzYnVzLT5wcm9tX25vZGUsICJyYW5nZXMiLAotCQkJICAgICAgIChjaGFyICopIHNidXMtPnNidXNfcmFuZ2VzLAotCQkJICAgICAgIHNpemVvZihzYnVzLT5zYnVzX3JhbmdlcykpOwotCWlmIChsZW4gPT0gLTEgfHwgbGVuID09IDApIHsKLQkJc2J1cy0+bnVtX3NidXNfcmFuZ2VzID0gMDsKLQkJcmV0dXJuOwotCX0KLQlzYnVzLT5udW1fc2J1c19yYW5nZXMgPSBsZW4gLyBzaXplb2Yoc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzKTsKLSNpZmRlZiBDT05GSUdfU1BBUkMzMgotCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKLQkJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzIGlvdW5pdF9yYW5nZXNbUFJPTVJFR19NQVhdOwotCQlpbnQgbnVtX2lvdW5pdF9yYW5nZXM7CisJcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgInJhbmdlcyIsICZsZW4pOworCXNidXMtPm51bV9zYnVzX3JhbmdlcyA9IDA7CisJaWYgKHB2YWwpIHsKKwkJbWVtY3B5KHNidXMtPnNidXNfcmFuZ2VzLCBwdmFsLCBsZW4pOworCQlzYnVzLT5udW1fc2J1c19yYW5nZXMgPQorCQkJbGVuIC8gc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3Jhbmdlcyk7CiAKLQkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShwYXJlbnRfbm9kZSwgInJhbmdlcyIsCi0JCQkJICAgICAgIChjaGFyICopIGlvdW5pdF9yYW5nZXMsCi0JCQkJICAgICAgIHNpemVvZiAoaW91bml0X3JhbmdlcykpOwotCQlpZiAobGVuICE9IC0xKSB7Ci0JCQludW1faW91bml0X3JhbmdlcyA9IChsZW4vc2l6ZW9mKHN0cnVjdCBsaW51eF9wcm9tX3JhbmdlcykpOwotCQkJcHJvbV9hZGp1c3RfcmFuZ2VzIChzYnVzLT5zYnVzX3Jhbmdlcywgc2J1cy0+bnVtX3NidXNfcmFuZ2VzLCBpb3VuaXRfcmFuZ2VzLCBudW1faW91bml0X3Jhbmdlcyk7Ci0JCX0KKwkJc2J1c19hcmNoX2J1c19yYW5nZXNfaW5pdChkcC0+cGFyZW50LCBzYnVzKTsKIAl9Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IF9fYXBwbHlfcmFuZ2VzX3RvX3JlZ3Moc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzICpyYW5nZXMsCkBAIC0zMjIsMjQxICsxNjAsMTI3IEBACiAJfQogfQogCi1leHRlcm4gdm9pZCByZWdpc3Rlcl9wcm9jX3NwYXJjX2lvcG9ydCh2b2lkKTsKLWV4dGVybiB2b2lkIGZpcmV0cnVja19pbml0KHZvaWQpOworLyogV2UgcHJlc2VydmUgdGhlICJwcm9iZSBvcmRlciIgb2YgdGhlc2UgYnVzIGFuZCBkZXZpY2UgbGlzdHMgdG8gZ2l2ZQorICogdGhlIHNhbWUgb3JkZXJpbmcgYXMgdGhlIG9sZCBjb2RlLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2J1c19pbnNlcnQoc3RydWN0IHNidXNfYnVzICpzYnVzLCBzdHJ1Y3Qgc2J1c19idXMgKipyb290KQoreworCXdoaWxlICgqcm9vdCkKKwkJcm9vdCA9ICYoKnJvb3QpLT5uZXh0OworCSpyb290ID0gc2J1czsKKwlzYnVzLT5uZXh0ID0gTlVMTDsKK30KIAotI2lmZGVmIENPTkZJR19TVU40Ci1leHRlcm4gdm9pZCBzdW40X2R2bWFfaW5pdCh2b2lkKTsKLSNlbmRpZgorc3RhdGljIHZvaWQgX19pbml0IHNkZXZfaW5zZXJ0KHN0cnVjdCBzYnVzX2RldiAqc2Rldiwgc3RydWN0IHNidXNfZGV2ICoqcm9vdCkKK3sKKwl3aGlsZSAoKnJvb3QpCisJCXJvb3QgPSAmKCpyb290KS0+bmV4dDsKKwkqcm9vdCA9IHNkZXY7CisJc2Rldi0+bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB3YWxrX2NoaWxkcmVuKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIHN0cnVjdCBzYnVzX2RldiAqcGFyZW50LCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpCit7CisJZHAgPSBkcC0+Y2hpbGQ7CisJd2hpbGUgKGRwKSB7CisJCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKKworCQlzZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfZGV2KSwgR0ZQX0FUT01JQyk7CisJCWlmIChzZGV2KSB7CisJCQlzZGV2X2luc2VydChzZGV2LCAmcGFyZW50LT5jaGlsZCk7CisKKwkJCXNkZXYtPmJ1cyA9IHNidXM7CisJCQlzZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CisKKwkJCWZpbGxfc2J1c19kZXZpY2UoZHAsIHNkZXYpOworCisJCQl3YWxrX2NoaWxkcmVuKGRwLCBzZGV2LCBzYnVzKTsKKwkJfQorCQlkcCA9IGRwLT5zaWJsaW5nOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGJ1aWxkX29uZV9zYnVzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAsIGludCBudW1fc2J1cykKK3sKKwlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7CisJdW5zaWduZWQgaW50IHNidXNfY2xvY2s7CisJc3RydWN0IGRldmljZV9ub2RlICpkZXZfZHA7CisKKwlzYnVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfYnVzKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFzYnVzKQorCQlyZXR1cm47CisKKwlzYnVzX2luc2VydChzYnVzLCAmc2J1c19yb290KTsKKwlzYnVzLT5wcm9tX25vZGUgPSBkcC0+bm9kZTsKKworCXNidXNfc2V0dXBfaW9tbXUoc2J1cywgZHApOworCisJcHJpbnRrKCJzYnVzJWQ6ICIsIG51bV9zYnVzKTsKKworCXNidXNfY2xvY2sgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsICJjbG9jay1mcmVxdWVuY3kiLAorCQkJCQkgICAoMjUqMTAwMCoxMDAwKSk7CisJc2J1cy0+Y2xvY2tfZnJlcSA9IHNidXNfY2xvY2s7CisKKwlwcmludGsoIkNsb2NrICVkLiVkIE1IelxuIiwgKGludCkgKChzYnVzX2Nsb2NrLzEwMDApLzEwMDApLAorCSAgICAgICAoaW50KSAoKChzYnVzX2Nsb2NrLzEwMDApJTEwMDAgIT0gMCkgPyAKKwkJICAgICAgKCgoc2J1c19jbG9jay8xMDAwKSUxMDAwKSArIDEwMDApIDogMCkpOworCisJc3RyY3B5KHNidXMtPnByb21fbmFtZSwgZHAtPm5hbWUpOworCisJc2J1c19zZXR1cF9hcmNoX3Byb3BzKHNidXMsIGRwKTsKKworCXNidXNfYnVzX3Jhbmdlc19pbml0KGRwLCBzYnVzKTsKKworCXNidXMtPm9mZGV2Lm5vZGUgPSBkcDsKKwlzYnVzLT5vZmRldi5kZXYucGFyZW50ID0gTlVMTDsKKwlzYnVzLT5vZmRldi5kZXYuYnVzID0gJnNidXNfYnVzX3R5cGU7CisJc3RyY3B5KHNidXMtPm9mZGV2LmRldi5idXNfaWQsIGRwLT5wYXRoX2NvbXBvbmVudF9uYW1lKTsKKworCWlmIChvZl9kZXZpY2VfcmVnaXN0ZXIoJnNidXMtPm9mZGV2KSAhPSAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAic2J1czogZGV2aWNlIHJlZ2lzdHJhdGlvbiBlcnJvciBmb3IgJXMhXG4iLAorCQkgICAgICAgc2J1cy0+b2ZkZXYuZGV2LmJ1c19pZCk7CisKKwlkZXZfZHAgPSBkcC0+Y2hpbGQ7CisJd2hpbGUgKGRldl9kcCkgeworCQlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXY7CisKKwkJc2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzYnVzX2RldiksIEdGUF9BVE9NSUMpOworCQlpZiAoc2RldikgeworCQkJc2Rldl9pbnNlcnQoc2RldiwgJnNidXMtPmRldmljZXMpOworCisJCQlzZGV2LT5idXMgPSBzYnVzOworCQkJc2Rldi0+cGFyZW50ID0gTlVMTDsKKwkJCWZpbGxfc2J1c19kZXZpY2UoZGV2X2RwLCBzZGV2KTsKKworCQkJd2Fsa19jaGlsZHJlbihkZXZfZHAsIHNkZXYsIHNidXMpOworCQl9CisJCWRldl9kcCA9IGRldl9kcC0+c2libGluZzsKKwl9CisKKwlzYnVzX2ZpeHVwX2FsbF9yZWdzKHNidXMtPmRldmljZXMpOworCisJZHZtYV9pbml0KHNidXMpOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBzYnVzX2luaXQodm9pZCkKIHsKLQlpbnQgbmQsIHRoaXNfc2J1cywgc2J1c19kZXZzLCB0b3BuZCwgaW9tbXVuZDsKLQl1bnNpZ25lZCBpbnQgc2J1c19jbG9jazsKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7Ci0Jc3RydWN0IHNidXNfZGV2ICp0aGlzX2RldjsKLQlpbnQgbnVtX3NidXMgPSAwOyAgLyogSG93IG1hbnkgZGlkIHdlIGZpbmQ/ICovCisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKwljb25zdCBjaGFyICpzYnVzX25hbWUgPSAic2J1cyI7CisJaW50IG51bV9zYnVzID0gMDsKIAotI2lmZGVmIENPTkZJR19TUEFSQzMyCi0JcmVnaXN0ZXJfcHJvY19zcGFyY19pb3BvcnQoKTsKLSNlbmRpZgorCWlmIChzYnVzX2FyY2hfcHJlaW5pdCgpKQorCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19TVU40Ci0Jc3VuNF9kdm1hX2luaXQoKTsKLQlyZXR1cm4gMDsKLSNlbmRpZgorCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpCisJCXNidXNfbmFtZSA9ICJzYmkiOwogCi0JdG9wbmQgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKLQkKLQkvKiBGaW5kaW5nIHRoZSBmaXJzdCBzYnVzIGlzIGEgc3BlY2lhbCBjYXNlLi4uICovCi0JaW9tbXVuZCA9IDA7Ci0JaWYoc3BhcmNfY3B1X21vZGVsID09IHN1bjR1KSB7Ci0JCW5kID0gcHJvbV9zZWFyY2hzaWJsaW5ncyh0b3BuZCwgInNidXMiKTsKLQkJaWYobmQgPT0gMCkgewotI2lmZGVmIENPTkZJR19QQ0kKLQkJCWlmICghcGNpY19wcmVzZW50KCkpIHsKLQkJCQlwcm9tX3ByaW50ZigiTmVpdGhlciBTQlVTIG5vciBQQ0kgZm91bmQuXG4iKTsKLQkJCQlwcm9tX2hhbHQoKTsKLQkJCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQkJCQlmaXJldHJ1Y2tfaW5pdCgpOwotI2VuZGlmCi0JCQl9Ci0JCQlyZXR1cm4gMDsKLSNlbHNlCi0JCQlwcm9tX3ByaW50ZigiWUVFRSwgVWx0cmFTcGFyYyBzYnVzIG5vdCBmb3VuZFxuIik7Ci0JCQlwcm9tX2hhbHQoKTsKLSNlbmRpZgotCQl9Ci0JfSBlbHNlIGlmKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgewotCQlpZigoaW9tbXVuZCA9IHByb21fc2VhcmNoc2libGluZ3ModG9wbmQsICJpby11bml0IikpID09IDAgfHwKLQkJICAgKG5kID0gcHJvbV9nZXRjaGlsZChpb21tdW5kKSkgPT0gMCB8fAotCQkgICAobmQgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5kLCAic2JpIikpID09IDApIHsKLQkJICAgCXBhbmljKCJzYmkgbm90IGZvdW5kIik7Ci0JCX0KLQl9IGVsc2UgaWYoKG5kID0gcHJvbV9zZWFyY2hzaWJsaW5ncyh0b3BuZCwgInNidXMiKSkgPT0gMCkgewotCQlpZigoaW9tbXVuZCA9IHByb21fc2VhcmNoc2libGluZ3ModG9wbmQsICJpb21tdSIpKSA9PSAwIHx8Ci0JCSAgIChuZCA9IHByb21fZ2V0Y2hpbGQoaW9tbXVuZCkpID09IDAgfHwKLQkJICAgKG5kID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhuZCwgInNidXMiKSkgPT0gMCkgewotI2lmZGVmIENPTkZJR19QQ0kKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGNpY19wcmVzZW50KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbV9wcmludGYoIk5laXRoZXIgU0JVUyBub3IgUENJIGZvdW5kLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21faGFsdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0jZWxzZQotCQkJLyogTm8gcmVhc29uIHRvIHJ1biBmdXJ0aGVyIC0gdGhlIGRhdGEgYWNjZXNzIHRyYXAgd2lsbCBvY2N1ci4gKi8KLQkJCXBhbmljKCJzYnVzIG5vdCBmb3VuZCIpOwotI2VuZGlmCi0JCX0KLQl9Ci0KLQkvKiBPaywgd2UndmUgZm91bmQgdGhlIGZpcnN0IG9uZSwgYWxsb2NhdGUgZmlyc3QgU0J1cyBzdHJ1Y3QKLQkgKiBhbmQgcGxhY2UgaW4gY2hhaW4uCi0JICovCi0Jc2J1cyA9IHNidXNfcm9vdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYnVzX2J1cyksIEdGUF9BVE9NSUMpOwotCXNidXMtPm5leHQgPSBOVUxMOwotCXNidXMtPnByb21fbm9kZSA9IG5kOwotCXRoaXNfc2J1cyA9IG5kOwotCi0JaWYoaW9tbXVuZCAmJiBzcGFyY19jcHVfbW9kZWwgIT0gc3VuNHUgJiYgc3BhcmNfY3B1X21vZGVsICE9IHN1bjRkKQotCQlpb21tdV9pbml0KGlvbW11bmQsIHNidXMpOwotCi0JLyogTG9vcCB1bnRpbCB3ZSBmaW5kIG5vIG1vcmUgU0JVUydzICovCi0Jd2hpbGUodGhpc19zYnVzKSB7Ci0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQkJLyogSU9NTVUgaGlkZXMgaW5zaWRlIFNCVVMvU1lTSU8gcHJvbSBub2RlIG9uIFVsdHJhLiAqLwotCQlpZihzcGFyY19jcHVfbW9kZWwgPT0gc3VuNHUpIHsKLQkJCWV4dGVybiB2b2lkIHNidXNfaW9tbXVfaW5pdChpbnQgcHJvbV9ub2RlLCBzdHJ1Y3Qgc2J1c19idXMgKnNidXMpOwotCi0JCQlzYnVzX2lvbW11X2luaXQodGhpc19zYnVzLCBzYnVzKTsKLQkJfQotI2VuZGlmIC8qIENPTkZJR19TUEFSQzY0ICovCi0KLSNpZmRlZiBDT05GSUdfU1BBUkMzMgotCQlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjRkKQotCQkJaW91bml0X2luaXQodGhpc19zYnVzLCBpb21tdW5kLCBzYnVzKTsKLSNlbmRpZiAvKiBDT05GSUdfU1BBUkMzMiAqLwotCQlwcmludGsoInNidXMlZDogIiwgbnVtX3NidXMpOwotCQlzYnVzX2Nsb2NrID0gcHJvbV9nZXRpbnQodGhpc19zYnVzLCAiY2xvY2stZnJlcXVlbmN5Iik7Ci0JCWlmKHNidXNfY2xvY2sgPT0gLTEpCi0JCQlzYnVzX2Nsb2NrID0gKDI1KjEwMDAqMTAwMCk7Ci0JCXByaW50aygiQ2xvY2sgJWQuJWQgTUh6XG4iLCAoaW50KSAoKHNidXNfY2xvY2svMTAwMCkvMTAwMCksCi0JCSAgICAgICAoaW50KSAoKChzYnVzX2Nsb2NrLzEwMDApJTEwMDAgIT0gMCkgPyAKLQkJCSAgICAgICgoKHNidXNfY2xvY2svMTAwMCklMTAwMCkgKyAxMDAwKSA6IDApKTsKLQotCQlwcm9tX2dldHN0cmluZyh0aGlzX3NidXMsICJuYW1lIiwKLQkJCSAgICAgICBzYnVzLT5wcm9tX25hbWUsIHNpemVvZihzYnVzLT5wcm9tX25hbWUpKTsKLQkJc2J1cy0+Y2xvY2tfZnJlcSA9IHNidXNfY2xvY2s7Ci0jaWZkZWYgQ09ORklHX1NQQVJDMzIKLQkJaWYgKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40ZCkgewotCQkJc2J1cy0+ZGV2aWQgPSBwcm9tX2dldGludChpb21tdW5kLCAiZGV2aWNlLWlkIik7Ci0JCQlzYnVzLT5ib2FyZCA9IHByb21fZ2V0aW50KGlvbW11bmQsICJib2FyZCMiKTsKLQkJfQotI2VuZGlmCi0JCQotCQlzYnVzX2J1c19yYW5nZXNfaW5pdChpb21tdW5kLCBzYnVzKTsKLQotCQlzYnVzX2RldnMgPSBwcm9tX2dldGNoaWxkKHRoaXNfc2J1cyk7Ci0JCWlmICghc2J1c19kZXZzKSB7Ci0JCQlzYnVzLT5kZXZpY2VzID0gTlVMTDsKLQkJCWdvdG8gbmV4dF9idXM7Ci0JCX0KLQotCQlzYnVzLT5kZXZpY2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfZGV2KSwgR0ZQX0FUT01JQyk7Ci0KLQkJdGhpc19kZXYgPSBzYnVzLT5kZXZpY2VzOwotCQl0aGlzX2Rldi0+bmV4dCA9IE5VTEw7Ci0KLQkJdGhpc19kZXYtPmJ1cyA9IHNidXM7Ci0JCXRoaXNfZGV2LT5wYXJlbnQgPSBOVUxMOwotCQlmaWxsX3NidXNfZGV2aWNlKHNidXNfZGV2cywgdGhpc19kZXYpOwotCi0JCS8qIFNob3VsZCB3ZSB0cmF2ZXJzZSBmb3IgY2hpbGRyZW4/ICovCi0JCWlmKHByb21fZ2V0Y2hpbGQoc2J1c19kZXZzKSkgewotCQkJLyogQWxsb2NhdGUgZGV2aWNlIG5vZGUgKi8KLQkJCXRoaXNfZGV2LT5jaGlsZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYnVzX2RldiksCi0JCQkJCQkgIEdGUF9BVE9NSUMpOwotCQkJLyogRmlsbCBpdCAqLwotCQkJdGhpc19kZXYtPmNoaWxkLT5idXMgPSBzYnVzOwotCQkJdGhpc19kZXYtPmNoaWxkLT5uZXh0ID0gTlVMTDsKLQkJCWZpbGxfc2J1c19kZXZpY2UocHJvbV9nZXRjaGlsZChzYnVzX2RldnMpLAotCQkJCQkgdGhpc19kZXYtPmNoaWxkKTsKLQkJCXNidXNfZG9fY2hpbGRfc2libGluZ3MocHJvbV9nZXRjaGlsZChzYnVzX2RldnMpLAotCQkJCQkgICAgICAgdGhpc19kZXYtPmNoaWxkLAotCQkJCQkgICAgICAgdGhpc19kZXYsCi0JCQkJCSAgICAgICBzYnVzKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXNfZGV2LT5jaGlsZCA9IE5VTEw7Ci0JCX0KLQotCQl3aGlsZSgoc2J1c19kZXZzID0gcHJvbV9nZXRzaWJsaW5nKHNidXNfZGV2cykpICE9IDApIHsKLQkJCS8qIEFsbG9jYXRlIGRldmljZSBub2RlICovCi0JCQl0aGlzX2Rldi0+bmV4dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYnVzX2RldiksCi0JCQkJCQkgR0ZQX0FUT01JQyk7Ci0JCQl0aGlzX2RldiA9IHRoaXNfZGV2LT5uZXh0OwotCQkJdGhpc19kZXYtPm5leHQgPSBOVUxMOwotCi0JCQkvKiBGaWxsIGl0ICovCi0JCQl0aGlzX2Rldi0+YnVzID0gc2J1czsKLQkJCXRoaXNfZGV2LT5wYXJlbnQgPSBOVUxMOwotCQkJZmlsbF9zYnVzX2RldmljZShzYnVzX2RldnMsIHRoaXNfZGV2KTsKLQotCQkJLyogSXMgdGhlcmUgYSBjaGlsZCBub2RlIGhhbmdpbmcgb2ZmIG9mIHVzPyAqLwotCQkJaWYocHJvbV9nZXRjaGlsZChzYnVzX2RldnMpKSB7Ci0JCQkJLyogR2V0IG5ldyBkZXZpY2Ugc3RydWN0ICovCi0JCQkJdGhpc19kZXYtPmNoaWxkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfZGV2KSwKLQkJCQkJCQkgIEdGUF9BVE9NSUMpOwotCQkJCS8qIEZpbGwgaXQgKi8KLQkJCQl0aGlzX2Rldi0+Y2hpbGQtPmJ1cyA9IHNidXM7Ci0JCQkJdGhpc19kZXYtPmNoaWxkLT5uZXh0ID0gTlVMTDsKLQkJCQlmaWxsX3NidXNfZGV2aWNlKHByb21fZ2V0Y2hpbGQoc2J1c19kZXZzKSwKLQkJCQkJCSB0aGlzX2Rldi0+Y2hpbGQpOwotCQkJCXNidXNfZG9fY2hpbGRfc2libGluZ3MocHJvbV9nZXRjaGlsZChzYnVzX2RldnMpLAotCQkJCQkJICAgICAgIHRoaXNfZGV2LT5jaGlsZCwKLQkJCQkJCSAgICAgICB0aGlzX2RldiwKLQkJCQkJCSAgICAgICBzYnVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpc19kZXYtPmNoaWxkID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCS8qIFdhbGsgYWxsIGRldmljZXMgYW5kIGFwcGx5IHBhcmVudCByYW5nZXMuICovCi0JCXNidXNfZml4dXBfYWxsX3JlZ3Moc2J1cy0+ZGV2aWNlcyk7Ci0KLQkJZHZtYV9pbml0KHNidXMpOwotCW5leHRfYnVzOgorCWZvcl9lYWNoX25vZGVfYnlfbmFtZShkcCwgc2J1c19uYW1lKSB7CisJCWJ1aWxkX29uZV9zYnVzKGRwLCBudW1fc2J1cyk7CiAJCW51bV9zYnVzKys7Ci0JCWlmKHNwYXJjX2NwdV9tb2RlbCA9PSBzdW40dSkgewotCQkJdGhpc19zYnVzID0gcHJvbV9nZXRzaWJsaW5nKHRoaXNfc2J1cyk7Ci0JCQlpZighdGhpc19zYnVzKQotCQkJCWJyZWFrOwotCQkJdGhpc19zYnVzID0gcHJvbV9zZWFyY2hzaWJsaW5ncyh0aGlzX3NidXMsICJzYnVzIik7Ci0JCX0gZWxzZSBpZihzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKLQkJCWlvbW11bmQgPSBwcm9tX2dldHNpYmxpbmcoaW9tbXVuZCk7Ci0JCQlpZighaW9tbXVuZCkKLQkJCQlicmVhazsKLQkJCWlvbW11bmQgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKGlvbW11bmQsICJpby11bml0Iik7Ci0JCQlpZighaW9tbXVuZCkKLQkJCQlicmVhazsKLQkJCXRoaXNfc2J1cyA9IHByb21fc2VhcmNoc2libGluZ3MocHJvbV9nZXRjaGlsZChpb21tdW5kKSwgInNiaSIpOwotCQl9IGVsc2UgewotCQkJdGhpc19zYnVzID0gcHJvbV9nZXRzaWJsaW5nKHRoaXNfc2J1cyk7Ci0JCQlpZighdGhpc19zYnVzKQotCQkJCWJyZWFrOwotCQkJdGhpc19zYnVzID0gcHJvbV9zZWFyY2hzaWJsaW5ncyh0aGlzX3NidXMsICJzYnVzIik7Ci0JCX0KLQkJaWYodGhpc19zYnVzKSB7Ci0JCQlzYnVzLT5uZXh0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNidXNfYnVzKSwgR0ZQX0FUT01JQyk7Ci0JCQlzYnVzID0gc2J1cy0+bmV4dDsKLQkJCXNidXMtPm5leHQgPSBOVUxMOwotCQkJc2J1cy0+cHJvbV9ub2RlID0gdGhpc19zYnVzOwotCQl9IGVsc2UgewotCQkJYnJlYWs7Ci0JCX0KLQl9IC8qIHdoaWxlKHRoaXNfc2J1cykgKi8KIAotCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNGQpIHsKLQkJZXh0ZXJuIHZvaWQgc3VuNGRfaW5pdF9zYmlfaXJxKHZvaWQpOwotCQlzdW40ZF9pbml0X3NiaV9pcnEoKTsKIAl9Ci0JCi0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjR1KSB7Ci0JCWZpcmV0cnVja19pbml0KCk7Ci0JfQotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NVTl9BVVhJTwotCWlmIChzcGFyY19jcHVfbW9kZWwgPT0gc3VuNHUpCi0JCWF1eGlvX3Byb2JlICgpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NQQVJDNjQKLQlpZiAoc3BhcmNfY3B1X21vZGVsID09IHN1bjR1KSB7Ci0JCWV4dGVybiB2b2lkIGNsb2NrX3Byb2JlKHZvaWQpOwogCi0JCWNsb2NrX3Byb2JlKCk7Ci0JfQotI2VuZGlmCisJc2J1c19hcmNoX3Bvc3Rpbml0KCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS81M2M3MDAuaCBiL2RyaXZlcnMvc2NzaS81M2M3MDAuaAppbmRleCBkODA0MTk1Li43ZjIyYTA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvNTNjNzAwLmgKKysrIGIvZHJpdmVycy9zY3NpLzUzYzcwMC5oCkBAIC00NzQsOCArNDc0LDcgQEAKIAkJaW9yZWFkMzIoaG9zdGRhdGEtPmJhc2UgKyByZWcpOwogI2lmIDEKIAkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCi0JaWYoKHJlZyAmIDB4MykgIT0gMCkKLQkJQlVHKCk7CisJQlVHX09OKChyZWcgJiAweDMpICE9IDApOwogI2VuZGlmCiAKIAlyZXR1cm4gdmFsdWU7CkBAIC00OTgsOCArNDk3LDcgQEAKIAogI2lmIDEKIAkvKiBzYW5pdHkgY2hlY2sgdGhlIHJlZ2lzdGVyICovCi0JaWYoKHJlZyAmIDB4MykgIT0gMCkKLQkJQlVHKCk7CisJQlVHX09OKChyZWcgJiAweDMpICE9IDApOwogI2VuZGlmCiAKIAliRUJ1cyA/IGlvd3JpdGUzMmJlKHZhbHVlLCBob3N0ZGF0YS0+YmFzZSArIHJlZyk6IApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL01ha2VmaWxlIGIvZHJpdmVycy9zY3NpL01ha2VmaWxlCmluZGV4IGQ4ZTJmYzkuLmViZDBjZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Njc2kvTWFrZWZpbGUKQEAgLTE2Niw3ICsxNjYsNyBAQAogQ0ZMQUdTX25jcjUzYzh4eC5vCTo9ICQobmNyNTNjOHh4LWZsYWdzLXkpICQobmNyNTNjOHh4LWZsYWdzLW0pCiB6YWxvbjd4eC1vYmpzCTo9IHphbG9uLm8gbmNyNTNjOHh4Lm8KIE5DUl9RNzIwX21vZC1vYmpzCTo9IE5DUl9RNzIwLm8gbmNyNTNjOHh4Lm8KLWxpYmF0YS1vYmpzCTo9IGxpYmF0YS1jb3JlLm8gbGliYXRhLXNjc2kubyBsaWJhdGEtYm1kbWEubworbGliYXRhLW9ianMJOj0gbGliYXRhLWNvcmUubyBsaWJhdGEtc2NzaS5vIGxpYmF0YS1ibWRtYS5vIGxpYmF0YS1laC5vCiBva3RhZ29uX2VzcF9tb2Qtb2Jqcwk6PSBva3RhZ29uX2VzcC5vIG9rdGFnb25faW8ubwogCiAjIEZpbGVzIGdlbmVyYXRlZCB0aGF0IHNoYWxsIGJlIHJlbW92ZWQgdXBvbiBtYWtlIGNsZWFuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYWFjcmFpZC9hYWNoYmEuYyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCmluZGV4IGVhOWUwMzguLjgzYjVjN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCisrKyBiL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2FhY2hiYS5jCkBAIC0zOTYsOCArMzk2LDcgQEAKIAlzY3NpY21kLT5TQ3AucGhhc2UgPSBBQUNfT1dORVJfTUlETEVWRUw7CiAKIAlkcHJpbnRrKChLRVJOX0RFQlVHICJnZXRfY29udGFpbmVyX25hbWVfY2FsbGJhY2tbY3B1ICVkXTogdCA9ICVsZC5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSwgamlmZmllcykpOwotCWlmIChmaWJwdHIgPT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKGZpYnB0ciA9PSBOVUxMKTsKIAogCWdldF9uYW1lX3JlcGx5ID0gKHN0cnVjdCBhYWNfZ2V0X25hbWVfcmVzcCAqKSBmaWJfZGF0YShmaWJwdHIpOwogCS8qIEZhaWx1cmUgaXMgaXJyZWxldmFudCwgdXNpbmcgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkICovCkBAIC05NTYsOCArOTU1LDcgQEAKIAkJICBzbXBfcHJvY2Vzc29yX2lkKCksICh1bnNpZ25lZCBsb25nIGxvbmcpbGJhLCBqaWZmaWVzKTsKIAl9CiAKLQlpZiAoZmlicHRyID09IE5VTEwpCi0JCUJVRygpOworCUJVR19PTihmaWJwdHIgPT0gTlVMTCk7CiAJCQogCWlmKHNjc2ljbWQtPnVzZV9zZykKIAkJcGNpX3VubWFwX3NnKGRldi0+cGRldiwgCkBAIC0xMDkyLDggKzEwOTAsNyBAQAogCQkKIAkJYWFjX2J1aWxkX3NncmF3KHNjc2ljbWQsICZyZWFkY21kLT5zZyk7CiAJCWZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19yYXdfaW8pICsgKChsZTMyX3RvX2NwdShyZWFkY21kLT5zZy5jb3VudCkgLSAxKSAqIHNpemVvZiAoc3RydWN0IHNnZW50cnlyYXcpKTsKLQkJaWYgKGZpYnNpemUgPiAoZGV2LT5tYXhfZmliX3NpemUgLSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSkKLQkJCUJVRygpOworCQlCVUdfT04oZmlic2l6ZSA+IChkZXYtPm1heF9maWJfc2l6ZSAtIHNpemVvZihzdHJ1Y3QgYWFjX2ZpYmhkcikpKTsKIAkJLyoKIAkJICoJTm93IHNlbmQgdGhlIEZpYiB0byB0aGUgYWRhcHRlcgogCQkgKi8KQEAgLTEyNjEsOCArMTI1OCw3IEBACiAJCQogCQlhYWNfYnVpbGRfc2dyYXcoc2NzaWNtZCwgJndyaXRlY21kLT5zZyk7CiAJCWZpYnNpemUgPSBzaXplb2Yoc3RydWN0IGFhY19yYXdfaW8pICsgKChsZTMyX3RvX2NwdSh3cml0ZWNtZC0+c2cuY291bnQpIC0gMSkgKiBzaXplb2YgKHN0cnVjdCBzZ2VudHJ5cmF3KSk7Ci0JCWlmIChmaWJzaXplID4gKGRldi0+bWF4X2ZpYl9zaXplIC0gc2l6ZW9mKHN0cnVjdCBhYWNfZmliaGRyKSkpCi0JCQlCVUcoKTsKKwkJQlVHX09OKGZpYnNpemUgPiAoZGV2LT5tYXhfZmliX3NpemUgLSBzaXplb2Yoc3RydWN0IGFhY19maWJoZHIpKSk7CiAJCS8qCiAJCSAqCU5vdyBzZW5kIHRoZSBGaWIgdG8gdGhlIGFkYXB0ZXIKIAkJICovCkBAIC0xOTA0LDggKzE5MDAsNyBAQAogCXNjc2ljbWQtPlNDcC5waGFzZSA9IEFBQ19PV05FUl9NSURMRVZFTDsKIAlkZXYgPSAoc3RydWN0IGFhY19kZXYgKilzY3NpY21kLT5kZXZpY2UtPmhvc3QtPmhvc3RkYXRhOwogCi0JaWYgKGZpYnB0ciA9PSBOVUxMKQotCQlCVUcoKTsKKwlCVUdfT04oZmlicHRyID09IE5VTEwpOwogCiAJc3JicmVwbHkgPSAoc3RydWN0IGFhY19zcmJfcmVwbHkgKikgZmliX2RhdGEoZmlicHRyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jIGIvZHJpdmVycy9zY3NpL2FhY3JhaWQvY29tbXN1cC5jCmluZGV4IGQyZWYxN2UuLjNmMjc0MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9hYWNyYWlkL2NvbW1zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvYWFjcmFpZC9jb21tc3VwLmMKQEAgLTIyOSw4ICsyMjksNyBAQAogc3RhdGljIHZvaWQgZmliX2RlYWxsb2Moc3RydWN0IGZpYiAqIGZpYnB0cikKIHsKIAlzdHJ1Y3QgaHdfZmliICpod19maWIgPSBmaWJwdHItPmh3X2ZpYjsKLQlpZihod19maWItPmhlYWRlci5TdHJ1Y3RUeXBlICE9IEZJQl9NQUdJQykgCi0JCUJVRygpOworCUJVR19PTihod19maWItPmhlYWRlci5TdHJ1Y3RUeXBlICE9IEZJQl9NQUdJQyk7CiAJaHdfZmliLT5oZWFkZXIuWGZlclN0YXRlID0gMDsgICAgICAgIAogfQogCkBAIC01MzAsOCArNTI5LDcgQEAKIAkJCX0KIAkJfSBlbHNlCiAJCQlkb3duKCZmaWJwdHItPmV2ZW50X3dhaXQpOwotCQlpZihmaWJwdHItPmRvbmUgPT0gMCkKLQkJCUJVRygpOworCQlCVUdfT04oZmlicHRyLT5kb25lID09IDApOwogCQkJCiAJCWlmKChmaWJwdHItPmZsYWdzICYgRklCX0NPTlRFWFRfRkxBR19USU1FRF9PVVQpKXsKIAkJCXJldHVybiAtRVRJTUVET1VUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2FkdmFuc3lzLmMgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwppbmRleCAyYTQxOTYzLi41ZWU0NzU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYworKysgYi9kcml2ZXJzL3Njc2kvYWR2YW5zeXMuYwpAQCAtMTczMTYsNyArMTczMTYsNyBAQAogLyoKICAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCiAgKi8KLXZvaWQKK3ZvaWQgX19pbml0CiBBZHZTZXQzNTUwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLCBBRFZFRVBfMzU1MF9DT05GSUcgKmNmZ19idWYpCiB7CiAgICAgdXNob3J0ICp3YnVmOwpAQCAtMTczODMsNyArMTczODMsNyBAQAogLyoKICAqIFdyaXRlIHRoZSBFRVBST00gZnJvbSAnY2ZnX2J1ZicuCiAgKi8KLXZvaWQKK3ZvaWQgX19pbml0CiBBZHZTZXQzOEMwODAwRUVQQ29uZmlnKEFkdlBvcnRBZGRyIGlvcF9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICBBRFZFRVBfMzhDMDgwMF9DT05GSUcgKmNmZ19idWYpCiB7CkBAIC0xNzQ1MSw3ICsxNzQ1MSw3IEBACiAvKgogICogV3JpdGUgdGhlIEVFUFJPTSBmcm9tICdjZmdfYnVmJy4KICAqLwotdm9pZAordm9pZCBfX2luaXQKIEFkdlNldDM4QzE2MDBFRVBDb25maWcoQWR2UG9ydEFkZHIgaW9wX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIEFEVkVFUF8zOEMxNjAwX0NPTkZJRyAqY2ZnX2J1ZikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9haGNpLmMgYi9kcml2ZXJzL3Njc2kvYWhjaS5jCmluZGV4IGI0ZjhmYjEuLjRiYjc3ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9haGNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2FoY2kuYwpAQCAtNDgsNyArNDgsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJhaGNpIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4yIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4zIgogCiAKIGVudW0gewpAQCAtNTYsMTIgKzU2LDE1IEBACiAJQUhDSV9NQVhfU0cJCT0gMTY4LCAvKiBoYXJkd2FyZSBtYXggaXMgNjRLICovCiAJQUhDSV9ETUFfQk9VTkRBUlkJPSAweGZmZmZmZmZmLAogCUFIQ0lfVVNFX0NMVVNURVJJTkcJPSAwLAotCUFIQ0lfQ01EX1NMT1RfU1oJPSAzMiAqIDMyLAorCUFIQ0lfTUFYX0NNRFMJCT0gMzIsCisJQUhDSV9DTURfU1oJCT0gMzIsCisJQUhDSV9DTURfU0xPVF9TWgk9IEFIQ0lfTUFYX0NNRFMgKiBBSENJX0NNRF9TWiwKIAlBSENJX1JYX0ZJU19TWgkJPSAyNTYsCi0JQUhDSV9DTURfVEJMX0hEUgk9IDB4ODAsCiAJQUhDSV9DTURfVEJMX0NEQgk9IDB4NDAsCi0JQUhDSV9DTURfVEJMX1NaCQk9IEFIQ0lfQ01EX1RCTF9IRFIgKyAoQUhDSV9NQVhfU0cgKiAxNiksCi0JQUhDSV9QT1JUX1BSSVZfRE1BX1NaCT0gQUhDSV9DTURfU0xPVF9TWiArIEFIQ0lfQ01EX1RCTF9TWiArCisJQUhDSV9DTURfVEJMX0hEUl9TWgk9IDB4ODAsCisJQUhDSV9DTURfVEJMX1NaCQk9IEFIQ0lfQ01EX1RCTF9IRFJfU1ogKyAoQUhDSV9NQVhfU0cgKiAxNiksCisJQUhDSV9DTURfVEJMX0FSX1NaCT0gQUhDSV9DTURfVEJMX1NaICogQUhDSV9NQVhfQ01EUywKKwlBSENJX1BPUlRfUFJJVl9ETUFfU1oJPSBBSENJX0NNRF9TTE9UX1NaICsgQUhDSV9DTURfVEJMX0FSX1NaICsKIAkJCQkgIEFIQ0lfUlhfRklTX1NaLAogCUFIQ0lfSVJRX09OX1NHCQk9ICgxIDw8IDMxKSwKIAlBSENJX0NNRF9BVEFQSQkJPSAoMSA8PCA1KSwKQEAgLTcxLDggKzc0LDEwIEBACiAJQUhDSV9DTURfQ0xSX0JVU1kJPSAoMSA8PCAxMCksCiAKIAlSWF9GSVNfRDJIX1JFRwkJPSAweDQwLAkvKiBvZmZzZXQgb2YgRDJIIFJlZ2lzdGVyIEZJUyBkYXRhICovCisJUlhfRklTX1VOSwkJPSAweDYwLCAvKiBvZmZzZXQgb2YgVW5rbm93biBGSVMgZGF0YSAqLwogCiAJYm9hcmRfYWhjaQkJPSAwLAorCWJvYXJkX2FoY2lfdnQ4MjUxCT0gMSwKIAogCS8qIGdsb2JhbCBjb250cm9sbGVyIHJlZ2lzdGVycyAqLwogCUhPU1RfQ0FQCQk9IDB4MDAsIC8qIGhvc3QgY2FwYWJpbGl0aWVzICovCkBAIC04Nyw4ICs5Miw5IEBACiAJSE9TVF9BSENJX0VOCQk9ICgxIDw8IDMxKSwgLyogQUhDSSBlbmFibGVkICovCiAKIAkvKiBIT1NUX0NBUCBiaXRzICovCi0JSE9TVF9DQVBfNjQJCT0gKDEgPDwgMzEpLCAvKiBQQ0kgREFDICg2NC1iaXQgRE1BKSBzdXBwb3J0ICovCiAJSE9TVF9DQVBfQ0xPCQk9ICgxIDw8IDI0KSwgLyogQ29tbWFuZCBMaXN0IE92ZXJyaWRlIHN1cHBvcnQgKi8KKwlIT1NUX0NBUF9OQ1EJCT0gKDEgPDwgMzApLCAvKiBOYXRpdmUgQ29tbWFuZCBRdWV1ZWluZyAqLworCUhPU1RfQ0FQXzY0CQk9ICgxIDw8IDMxKSwgLyogUENJIERBQyAoNjQtYml0IERNQSkgc3VwcG9ydCAqLwogCiAJLyogcmVnaXN0ZXJzIGZvciBlYWNoIFNBVEEgcG9ydCAqLwogCVBPUlRfTFNUX0FERFIJCT0gMHgwMCwgLyogY29tbWFuZCBsaXN0IERNQSBhZGRyICovCkBAIC0xMjcsMTUgKzEzMywxNyBAQAogCVBPUlRfSVJRX1BJT1NfRklTCT0gKDEgPDwgMSksIC8qIFBJTyBTZXR1cCBGSVMgcngnZCAqLwogCVBPUlRfSVJRX0QySF9SRUdfRklTCT0gKDEgPDwgMCksIC8qIEQySCBSZWdpc3RlciBGSVMgcngnZCAqLwogCi0JUE9SVF9JUlFfRkFUQUwJCT0gUE9SVF9JUlFfVEZfRVJSIHwKLQkJCQkgIFBPUlRfSVJRX0hCVVNfRVJSIHwKLQkJCQkgIFBPUlRfSVJRX0hCVVNfREFUQV9FUlIgfAotCQkJCSAgUE9SVF9JUlFfSUZfRVJSLAotCURFRl9QT1JUX0lSUQkJPSBQT1JUX0lSUV9GQVRBTCB8IFBPUlRfSVJRX1BIWVJEWSB8Ci0JCQkJICBQT1JUX0lSUV9DT05ORUNUIHwgUE9SVF9JUlFfU0dfRE9ORSB8Ci0JCQkJICBQT1JUX0lSUV9VTktfRklTIHwgUE9SVF9JUlFfU0RCX0ZJUyB8Ci0JCQkJICBQT1JUX0lSUV9ETUFTX0ZJUyB8IFBPUlRfSVJRX1BJT1NfRklTIHwKLQkJCQkgIFBPUlRfSVJRX0QySF9SRUdfRklTLAorCVBPUlRfSVJRX0ZSRUVaRQkJPSBQT1JUX0lSUV9IQlVTX0VSUiB8CisJCQkJICBQT1JUX0lSUV9JRl9FUlIgfAorCQkJCSAgUE9SVF9JUlFfQ09OTkVDVCB8CisJCQkJICBQT1JUX0lSUV9QSFlSRFkgfAorCQkJCSAgUE9SVF9JUlFfVU5LX0ZJUywKKwlQT1JUX0lSUV9FUlJPUgkJPSBQT1JUX0lSUV9GUkVFWkUgfAorCQkJCSAgUE9SVF9JUlFfVEZfRVJSIHwKKwkJCQkgIFBPUlRfSVJRX0hCVVNfREFUQV9FUlIsCisJREVGX1BPUlRfSVJRCQk9IFBPUlRfSVJRX0VSUk9SIHwgUE9SVF9JUlFfU0dfRE9ORSB8CisJCQkJICBQT1JUX0lSUV9TREJfRklTIHwgUE9SVF9JUlFfRE1BU19GSVMgfAorCQkJCSAgUE9SVF9JUlFfUElPU19GSVMgfCBQT1JUX0lSUV9EMkhfUkVHX0ZJUywKIAogCS8qIFBPUlRfQ01EIGJpdHMgKi8KIAlQT1JUX0NNRF9BVEFQSQkJPSAoMSA8PCAyNCksIC8qIERldmljZSBpcyBBVEFQSSAqLwpAQCAtMTUzLDYgKzE2MSwxMCBAQAogCiAJLyogaHByaXYtPmZsYWdzIGJpdHMgKi8KIAlBSENJX0ZMQUdfTVNJCQk9ICgxIDw8IDApLAorCisJLyogYXAtPmZsYWdzIGJpdHMgKi8KKwlBSENJX0ZMQUdfUkVTRVRfTkVFRFNfQ0xPCT0gKDEgPDwgMjQpLAorCUFIQ0lfRkxBR19OT19OQ1EJCT0gKDEgPDwgMjUpLAogfTsKIAogc3RydWN0IGFoY2lfY21kX2hkciB7CkBAIC0xODEsNyArMTkzLDYgQEAKIAlkbWFfYWRkcl90CQljbWRfc2xvdF9kbWE7CiAJdm9pZAkJCSpjbWRfdGJsOwogCWRtYV9hZGRyX3QJCWNtZF90YmxfZG1hOwotCXN0cnVjdCBhaGNpX3NnCQkqY21kX3RibF9zZzsKIAl2b2lkCQkJKnJ4X2ZpczsKIAlkbWFfYWRkcl90CQlyeF9maXNfZG1hOwogfTsKQEAgLTE5MSwxNSArMjAyLDE2IEBACiBzdGF0aWMgaW50IGFoY2lfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWhjaV9xY19pc3N1ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBhaGNpX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci1zdGF0aWMgaW50IGFoY2lfcHJvYmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKIHN0YXRpYyB2b2lkIGFoY2lfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyBpbnQgYWhjaV9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgYWhjaV9wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBhaGNpX3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgYWhjaV9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotc3RhdGljIGlubGluZSBpbnQgYWhjaV9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitzdGF0aWMgdm9pZCBhaGNpX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGFoY2lfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGFoY2lfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGFoY2lfcG9zdF9pbnRlcm5hbF9jbWQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdm9pZCBhaGNpX3JlbW92ZV9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKIAogc3RhdGljIHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgYWhjaV9zaHQgPSB7CkBAIC0yMDcsNyArMjE5LDggQEAKIAkubmFtZQkJCT0gRFJWX05BTUUsCiAJLmlvY3RsCQkJPSBhdGFfc2NzaV9pb2N0bCwKIAkucXVldWVjb21tYW5kCQk9IGF0YV9zY3NpX3F1ZXVlY21kLAotCS5jYW5fcXVldWUJCT0gQVRBX0RFRl9RVUVVRSwKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoCT0gYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoLAorCS5jYW5fcXVldWUJCT0gQUhDSV9NQVhfQ01EUyAtIDEsCiAJLnRoaXNfaWQJCT0gQVRBX1NIVF9USElTX0lELAogCS5zZ190YWJsZXNpemUJCT0gQUhDSV9NQVhfU0csCiAJLmNtZF9wZXJfbHVuCQk9IEFUQV9TSFRfQ01EX1BFUl9MVU4sCkBAIC0yMTYsNiArMjI5LDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQUhDSV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTIyOCwxOSArMjQyLDIxIEBACiAKIAkudGZfcmVhZAkJPSBhaGNpX3RmX3JlYWQsCiAKLQkucHJvYmVfcmVzZXQJCT0gYWhjaV9wcm9iZV9yZXNldCwKLQogCS5xY19wcmVwCQk9IGFoY2lfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYWhjaV9xY19pc3N1ZSwKIAotCS5lbmdfdGltZW91dAkJPSBhaGNpX2VuZ190aW1lb3V0LAotCiAJLmlycV9oYW5kbGVyCQk9IGFoY2lfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYWhjaV9pcnFfY2xlYXIsCiAKIAkuc2NyX3JlYWQJCT0gYWhjaV9zY3JfcmVhZCwKIAkuc2NyX3dyaXRlCQk9IGFoY2lfc2NyX3dyaXRlLAogCisJLmZyZWV6ZQkJCT0gYWhjaV9mcmVlemUsCisJLnRoYXcJCQk9IGFoY2lfdGhhdywKKworCS5lcnJvcl9oYW5kbGVyCQk9IGFoY2lfZXJyb3JfaGFuZGxlciwKKwkucG9zdF9pbnRlcm5hbF9jbWQJPSBhaGNpX3Bvc3RfaW50ZXJuYWxfY21kLAorCiAJLnBvcnRfc3RhcnQJCT0gYWhjaV9wb3J0X3N0YXJ0LAogCS5wb3J0X3N0b3AJCT0gYWhjaV9wb3J0X3N0b3AsCiB9OwpAQCAtMjUwLDcgKzI2NiwxOSBAQAogCXsKIAkJLnNodAkJPSAmYWhjaV9zaHQsCiAJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19QSU9fRE1BIHwKKwkJCQkgIEFUQV9GTEFHX1NLSVBfRDJIX0JTWSwKKwkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCisJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KKwkJLnBvcnRfb3BzCT0gJmFoY2lfb3BzLAorCX0sCisJLyogYm9hcmRfYWhjaV92dDgyNTEgKi8KKwl7CisJCS5zaHQJCT0gJmFoY2lfc2h0LAorCQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAorCQkJCSAgQVRBX0ZMQUdfTU1JTyB8IEFUQV9GTEFHX1BJT19ETUEgfAorCQkJCSAgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZIHwKKwkJCQkgIEFIQ0lfRkxBR19SRVNFVF9ORUVEU19DTE8gfCBBSENJX0ZMQUdfTk9fTkNRLAogCQkucGlvX21hc2sJPSAweDFmLCAvKiBwaW8wLTQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwogCQkucG9ydF9vcHMJPSAmYWhjaV9vcHMsCkBAIC0yNTgsNiArMjg2LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhaGNpX3BjaV90YmxbXSA9IHsKKwkvKiBJbnRlbCAqLwogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyNjUyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g2ICovCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDI2NTMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCkBAIC0yODgsMTQgKzMxNywzOSBAQAogCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4TSAqLwogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgyODJhLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCSAgYm9hcmRfYWhjaSB9LCAvKiBJQ0g4TSAqLworCisJLyogSk1pY3JvbiAqLwogCXsgMHgxOTdiLCAweDIzNjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCiAJICBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzYwICovCisJeyAweDE5N2IsIDB4MjM2MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSk1pY3JvbiBKTUIzNjEgKi8KIAl7IDB4MTk3YiwgMHgyMzYzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCSAgYm9hcmRfYWhjaSB9LCAvKiBKTWljcm9uIEpNQjM2MyAqLworCXsgMHgxOTdiLCAweDIzNjUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sIC8qIEpNaWNyb24gSk1CMzY1ICovCisJeyAweDE5N2IsIDB4MjM2NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwgLyogSk1pY3JvbiBKTUIzNjYgKi8KKworCS8qIEFUSSAqLwogCXsgUENJX1ZFTkRPUl9JRF9BVEksIDB4NDM4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKIAkgIGJvYXJkX2FoY2kgfSwgLyogQVRJIFNCNjAwIG5vbi1yYWlkICovCiAJeyBQQ0lfVkVORE9SX0lEX0FUSSwgMHg0MzgxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAogCSAgYm9hcmRfYWhjaSB9LCAvKiBBVEkgU0I2MDAgcmFpZCAqLworCisJLyogVklBICovCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgMHgzMzQ5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaV92dDgyNTEgfSwgLyogVklBIFZUODI1MSAqLworCisJLyogTlZJRElBICovCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwNDRjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaSB9LAkJLyogTUNQNjUgKi8KKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDA0NGQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsCisJICBib2FyZF9haGNpIH0sCQkvKiBNQ1A2NSAqLworCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIDB4MDQ0ZSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwKKwkgIGJvYXJkX2FoY2kgfSwJCS8qIE1DUDY1ICovCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgMHgwNDRmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLAorCSAgYm9hcmRfYWhjaSB9LAkJLyogTUNQNjUgKi8KKwogCXsgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKIApAQCAtMzc0LDggKzQyOCw2IEBACiAJcHAtPmNtZF90YmwgPSBtZW07CiAJcHAtPmNtZF90YmxfZG1hID0gbWVtX2RtYTsKIAotCXBwLT5jbWRfdGJsX3NnID0gbWVtICsgQUhDSV9DTURfVEJMX0hEUjsKLQogCWFwLT5wcml2YXRlX2RhdGEgPSBwcDsKIAogCWlmIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfNjQpCkBAIC01MDgsNDYgKzU2MCw3MSBAQAogCXJldHVybiBhdGFfZGV2X2NsYXNzaWZ5KCZ0Zik7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1MzIgb3B0cykKK3N0YXRpYyB2b2lkIGFoY2lfZmlsbF9jbWRfc2xvdChzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJICAgICAgIHUzMiBvcHRzKQogewotCXBwLT5jbWRfc2xvdFswXS5vcHRzID0gY3B1X3RvX2xlMzIob3B0cyk7Ci0JcHAtPmNtZF9zbG90WzBdLnN0YXR1cyA9IDA7Ci0JcHAtPmNtZF9zbG90WzBdLnRibF9hZGRyID0gY3B1X3RvX2xlMzIocHAtPmNtZF90YmxfZG1hICYgMHhmZmZmZmZmZik7Ci0JcHAtPmNtZF9zbG90WzBdLnRibF9hZGRyX2hpID0gY3B1X3RvX2xlMzIoKHBwLT5jbWRfdGJsX2RtYSA+PiAxNikgPj4gMTYpOworCWRtYV9hZGRyX3QgY21kX3RibF9kbWE7CisKKwljbWRfdGJsX2RtYSA9IHBwLT5jbWRfdGJsX2RtYSArIHRhZyAqIEFIQ0lfQ01EX1RCTF9TWjsKKworCXBwLT5jbWRfc2xvdFt0YWddLm9wdHMgPSBjcHVfdG9fbGUzMihvcHRzKTsKKwlwcC0+Y21kX3Nsb3RbdGFnXS5zdGF0dXMgPSAwOworCXBwLT5jbWRfc2xvdFt0YWddLnRibF9hZGRyID0gY3B1X3RvX2xlMzIoY21kX3RibF9kbWEgJiAweGZmZmZmZmZmKTsKKwlwcC0+Y21kX3Nsb3RbdGFnXS50YmxfYWRkcl9oaSA9IGNwdV90b19sZTMyKChjbWRfdGJsX2RtYSA+PiAxNikgPj4gMTYpOwogfQogCi1zdGF0aWMgaW50IGFoY2lfcG9sbF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKnJlZywgdTMyIG1hc2ssIHUzMiB2YWwsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGludGVydmFsX21zZWMsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlYykKK3N0YXRpYyBpbnQgYWhjaV9jbG8oc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSAodm9pZCBfX2lvbWVtICopIGFwLT5pb2FkZHIuY21kX2FkZHI7CisJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwogCXUzMiB0bXA7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArICh0aW1lb3V0X21zZWMgKiBIWikgLyAxMDAwOwotCWRvIHsKLQkJdG1wID0gcmVhZGwocmVnKTsKLQkJaWYgKCh0bXAgJiBtYXNrKSA9PSB2YWwpCi0JCQlyZXR1cm4gMDsKLQkJbXNsZWVwKGludGVydmFsX21zZWMpOwotCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKKwlpZiAoIShocHJpdi0+Y2FwICYgSE9TVF9DQVBfQ0xPKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JcmV0dXJuIC0xOworCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKwl0bXAgfD0gUE9SVF9DTURfQ0xPOworCXdyaXRlbCh0bXAsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKKworCXRtcCA9IGF0YV93YWl0X3JlZ2lzdGVyKHBvcnRfbW1pbyArIFBPUlRfQ01ELAorCQkJCVBPUlRfQ01EX0NMTywgUE9SVF9DTURfQ0xPLCAxLCA1MDApOworCWlmICh0bXAgJiBQT1JUX0NNRF9DTE8pCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWhjaV9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHZlcmJvc2UsIHVuc2lnbmVkIGludCAqY2xhc3MpCitzdGF0aWMgaW50IGFoY2lfcHJlcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKLQlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2ID0gYXAtPmhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7CisJaWYgKChhcC0+ZmxhZ3MgJiBBSENJX0ZMQUdfUkVTRVRfTkVFRFNfQ0xPKSAmJgorCSAgICAoYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1ksIDEwMDApICYgQVRBX0JVU1kpKSB7CisJCS8qIEFUQV9CVVNZIGhhc24ndCBjbGVhcmVkLCBzbyBzZW5kIGEgQ0xPICovCisJCWFoY2lfY2xvKGFwKTsKKwl9CisKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CisKK3N0YXRpYyBpbnQgYWhjaV9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKK3sKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKIAl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKIAljb25zdCB1MzIgY21kX2Zpc19sZW4gPSA1OyAvKiBmaXZlIGR3b3JkcyAqLwogCWNvbnN0IGNoYXIgKnJlYXNvbiA9IE5VTEw7CiAJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwl1MzIgdG1wOwogCXU4ICpmaXM7CiAJaW50IHJjOwogCiAJRFBSSU5USygiRU5URVJcbiIpOwogCisJaWYgKGF0YV9wb3J0X29mZmxpbmUoYXApKSB7CisJCURQUklOVEsoIlBIWSByZXBvcnRzIG5vIGRldmljZVxuIik7CisJCSpjbGFzcyA9IEFUQV9ERVZfTk9ORTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogcHJlcGFyZSBmb3IgU1JTVCAoQUhDSS0xLjEgMTAuNC4xKSAqLwogCXJjID0gYWhjaV9zdG9wX2VuZ2luZShhcCk7CiAJaWYgKHJjKSB7CkBAIC01NTgsMjMgKzYzNSwxMyBAQAogCS8qIGNoZWNrIEJVU1kvRFJRLCBwZXJmb3JtIENvbW1hbmQgTGlzdCBPdmVycmlkZSBpZiBuZWNlc3NhcnkgKi8KIAlhaGNpX3RmX3JlYWQoYXAsICZ0Zik7CiAJaWYgKHRmLmNvbW1hbmQgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgewotCQl1MzIgdG1wOworCQlyYyA9IGFoY2lfY2xvKGFwKTsKIAotCQlpZiAoIShocHJpdi0+Y2FwICYgSE9TVF9DQVBfQ0xPKSkgewotCQkJcmMgPSAtRUlPOwotCQkJcmVhc29uID0gInBvcnQgYnVzeSBidXQgbm8gQ0xPIjsKKwkJaWYgKHJjID09IC1FT1BOT1RTVVBQKSB7CisJCQlyZWFzb24gPSAicG9ydCBidXN5IGJ1dCBDTE8gdW5hdmFpbGFibGUiOwogCQkJZ290byBmYWlsX3Jlc3RhcnQ7Ci0JCX0KLQotCQl0bXAgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRCk7Ci0JCXRtcCB8PSBQT1JUX0NNRF9DTE87Ci0JCXdyaXRlbCh0bXAsIHBvcnRfbW1pbyArIFBPUlRfQ01EKTsKLQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpOyAvKiBmbHVzaCAqLwotCi0JCWlmIChhaGNpX3BvbGxfcmVnaXN0ZXIocG9ydF9tbWlvICsgUE9SVF9DTUQsIFBPUlRfQ01EX0NMTywgMHgwLAotCQkJCSAgICAgICAxLCA1MDApKSB7Ci0JCQlyYyA9IC1FSU87Ci0JCQlyZWFzb24gPSAiQ0xPIGZhaWxlZCI7CisJCX0gZWxzZSBpZiAocmMpIHsKKwkJCXJlYXNvbiA9ICJwb3J0IGJ1c3kgYnV0IENMTyBmYWlsZWQiOwogCQkJZ290byBmYWlsX3Jlc3RhcnQ7CiAJCX0KIAl9CkBAIC01ODIsMjAgKzY0OSwyMSBAQAogCS8qIHJlc3RhcnQgZW5naW5lICovCiAJYWhjaV9zdGFydF9lbmdpbmUoYXApOwogCi0JYXRhX3RmX2luaXQoYXAsICZ0ZiwgMCk7CisJYXRhX3RmX2luaXQoYXAtPmRldmljZSwgJnRmKTsKIAlmaXMgPSBwcC0+Y21kX3RibDsKIAogCS8qIGlzc3VlIHRoZSBmaXJzdCBEMkggUmVnaXN0ZXIgRklTICovCi0JYWhjaV9maWxsX2NtZF9zbG90KHBwLCBjbWRfZmlzX2xlbiB8IEFIQ0lfQ01EX1JFU0VUIHwgQUhDSV9DTURfQ0xSX0JVU1kpOworCWFoY2lfZmlsbF9jbWRfc2xvdChwcCwgMCwKKwkJCSAgIGNtZF9maXNfbGVuIHwgQUhDSV9DTURfUkVTRVQgfCBBSENJX0NNRF9DTFJfQlVTWSk7CiAKIAl0Zi5jdGwgfD0gQVRBX1NSU1Q7CiAJYXRhX3RmX3RvX2ZpcygmdGYsIGZpcywgMCk7CiAJZmlzWzFdICY9IH4oMSA8PCA3KTsJLyogdHVybiBvZmYgQ29tbWFuZCBGSVMgYml0ICovCiAKIAl3cml0ZWwoMSwgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOwotCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EX0lTU1VFKTsJLyogZmx1c2ggKi8KIAotCWlmIChhaGNpX3BvbGxfcmVnaXN0ZXIocG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUsIDB4MSwgMHgwLCAxLCA1MDApKSB7CisJdG1wID0gYXRhX3dhaXRfcmVnaXN0ZXIocG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUsIDB4MSwgMHgxLCAxLCA1MDApOworCWlmICh0bXAgJiAweDEpIHsKIAkJcmMgPSAtRUlPOwogCQlyZWFzb24gPSAiMXN0IEZJUyBmYWlsZWQiOwogCQlnb3RvIGZhaWw7CkBAIC02MDUsNyArNjczLDcgQEAKIAltc2xlZXAoMSk7CiAKIAkvKiBpc3N1ZSB0aGUgc2Vjb25kIEQySCBSZWdpc3RlciBGSVMgKi8KLQlhaGNpX2ZpbGxfY21kX3Nsb3QocHAsIGNtZF9maXNfbGVuKTsKKwlhaGNpX2ZpbGxfY21kX3Nsb3QocHAsIDAsIGNtZF9maXNfbGVuKTsKIAogCXRmLmN0bCAmPSB+QVRBX1NSU1Q7CiAJYXRhX3RmX3RvX2ZpcygmdGYsIGZpcywgMCk7CkBAIC02MjUsNyArNjkzLDcgQEAKIAltc2xlZXAoMTUwKTsKIAogCSpjbGFzcyA9IEFUQV9ERVZfTk9ORTsKLQlpZiAoc2F0YV9kZXZfcHJlc2VudChhcCkpIHsKKwlpZiAoYXRhX3BvcnRfb25saW5lKGFwKSkgewogCQlpZiAoYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCkpIHsKIAkJCXJjID0gLUVJTzsKIAkJCXJlYXNvbiA9ICJkZXZpY2Ugbm90IHJlYWR5IjsKQEAgLTY0MCwyNSArNzA4LDMxIEBACiAgZmFpbF9yZXN0YXJ0OgogCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKICBmYWlsOgotCWlmICh2ZXJib3NlKQotCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBzb2Z0cmVzZXQgZmFpbGVkICglcylcbiIsCi0JCSAgICAgICBhcC0+aWQsIHJlYXNvbik7Ci0JZWxzZQotCQlEUFJJTlRLKCJFWElULCByYz0lZCByZWFzb249XCIlc1wiXG4iLCByYywgcmVhc29uKTsKKwlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAic29mdHJlc2V0IGZhaWxlZCAoJXMpXG4iLCByZWFzb24pOwogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBhaGNpX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgdmVyYm9zZSwgdW5zaWduZWQgaW50ICpjbGFzcykKK3N0YXRpYyBpbnQgYWhjaV9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKIHsKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwl1OCAqZDJoX2ZpcyA9IHBwLT5yeF9maXMgKyBSWF9GSVNfRDJIX1JFRzsKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCWludCByYzsKIAogCURQUklOVEsoIkVOVEVSXG4iKTsKIAogCWFoY2lfc3RvcF9lbmdpbmUoYXApOwotCXJjID0gc2F0YV9zdGRfaGFyZHJlc2V0KGFwLCB2ZXJib3NlLCBjbGFzcyk7CisKKwkvKiBjbGVhciBEMkggcmVjZXB0aW9uIGFyZWEgdG8gcHJvcGVybHkgd2FpdCBmb3IgRDJIIEZJUyAqLworCWF0YV90Zl9pbml0KGFwLT5kZXZpY2UsICZ0Zik7CisJdGYuY29tbWFuZCA9IDB4ZmY7CisJYXRhX3RmX3RvX2ZpcygmdGYsIGQyaF9maXMsIDApOworCisJcmMgPSBzYXRhX3N0ZF9oYXJkcmVzZXQoYXAsIGNsYXNzKTsKKwogCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKIAotCWlmIChyYyA9PSAwKQorCWlmIChyYyA9PSAwICYmIGF0YV9wb3J0X29ubGluZShhcCkpCiAJCSpjbGFzcyA9IGFoY2lfZGV2X2NsYXNzaWZ5KGFwKTsKIAlpZiAoKmNsYXNzID09IEFUQV9ERVZfVU5LTk9XTikKIAkJKmNsYXNzID0gQVRBX0RFVl9OT05FOwpAQCAtNjg2LDEzICs3NjAsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBhaGNpX3Byb2JlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3NlcykKLXsKLQlyZXR1cm4gYXRhX2RyaXZlX3Byb2JlX3Jlc2V0KGFwLCBhdGFfc3RkX3Byb2JlaW5pdCwKLQkJCQkgICAgIGFoY2lfc29mdHJlc2V0LCBhaGNpX2hhcmRyZXNldCwKLQkJCQkgICAgIGFoY2lfcG9zdHJlc2V0LCBjbGFzc2VzKTsKLX0KLQogc3RhdGljIHU4IGFoY2lfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJdm9pZCBfX2lvbWVtICptbWlvID0gKHZvaWQgX19pb21lbSAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyOwpAQCAtNzA4LDkgKzc3NSw4IEBACiAJYXRhX3RmX2Zyb21fZmlzKGQyaF9maXMsIHRmKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBhaGNpX2ZpbGxfc2coc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWhjaV9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsIHZvaWQgKmNtZF90YmwpCiB7Ci0Jc3RydWN0IGFoY2lfcG9ydF9wcml2ICpwcCA9IHFjLT5hcC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJc3RydWN0IGFoY2lfc2cgKmFoY2lfc2c7CiAJdW5zaWduZWQgaW50IG5fc2cgPSAwOwpAQCAtNzIwLDcgKzc4Niw3IEBACiAJLyoKIAkgKiBOZXh0LCB0aGUgUy9HIGxpc3QuCiAJICovCi0JYWhjaV9zZyA9IHBwLT5jbWRfdGJsX3NnOworCWFoY2lfc2cgPSBjbWRfdGJsICsgQUhDSV9DTURfVEJMX0hEUl9TWjsKIAlhdGFfZm9yX2VhY2hfc2coc2csIHFjKSB7CiAJCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKIAkJdTMyIHNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOwpAQCAtNzQxLDYgKzgwNyw3IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAlpbnQgaXNfYXRhcGkgPSBpc19hdGFwaV90YXNrZmlsZSgmcWMtPnRmKTsKKwl2b2lkICpjbWRfdGJsOwogCXUzMiBvcHRzOwogCWNvbnN0IHUzMiBjbWRfZmlzX2xlbiA9IDU7IC8qIGZpdmUgZHdvcmRzICovCiAJdW5zaWduZWQgaW50IG5fZWxlbTsKQEAgLTc0OSwxNiArODE2LDE3IEBACiAJICogRmlsbCBpbiBjb21tYW5kIHRhYmxlIGluZm9ybWF0aW9uLiAgRmlyc3QsIHRoZSBoZWFkZXIsCiAJICogYSBTQVRBIFJlZ2lzdGVyIC0gSG9zdCB0byBEZXZpY2UgY29tbWFuZCBGSVMuCiAJICovCi0JYXRhX3RmX3RvX2ZpcygmcWMtPnRmLCBwcC0+Y21kX3RibCwgMCk7CisJY21kX3RibCA9IHBwLT5jbWRfdGJsICsgcWMtPnRhZyAqIEFIQ0lfQ01EX1RCTF9TWjsKKworCWF0YV90Zl90b19maXMoJnFjLT50ZiwgY21kX3RibCwgMCk7CiAJaWYgKGlzX2F0YXBpKSB7Ci0JCW1lbXNldChwcC0+Y21kX3RibCArIEFIQ0lfQ01EX1RCTF9DREIsIDAsIDMyKTsKLQkJbWVtY3B5KHBwLT5jbWRfdGJsICsgQUhDSV9DTURfVEJMX0NEQiwgcWMtPmNkYiwKLQkJICAgICAgIHFjLT5kZXYtPmNkYl9sZW4pOworCQltZW1zZXQoY21kX3RibCArIEFIQ0lfQ01EX1RCTF9DREIsIDAsIDMyKTsKKwkJbWVtY3B5KGNtZF90YmwgKyBBSENJX0NNRF9UQkxfQ0RCLCBxYy0+Y2RiLCBxYy0+ZGV2LT5jZGJfbGVuKTsKIAl9CiAKIAluX2VsZW0gPSAwOwogCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkKLQkJbl9lbGVtID0gYWhjaV9maWxsX3NnKHFjKTsKKwkJbl9lbGVtID0gYWhjaV9maWxsX3NnKHFjLCBjbWRfdGJsKTsKIAogCS8qCiAJICogRmlsbCBpbiBjb21tYW5kIHNsb3QgaW5mb3JtYXRpb24uCkBAIC03NjksMTEyICs4MzcsMTIyIEBACiAJaWYgKGlzX2F0YXBpKQogCQlvcHRzIHw9IEFIQ0lfQ01EX0FUQVBJIHwgQUhDSV9DTURfUFJFRkVUQ0g7CiAKLQlhaGNpX2ZpbGxfY21kX3Nsb3QocHAsIG9wdHMpOworCWFoY2lfZmlsbF9jbWRfc2xvdChwcCwgcWMtPnRhZywgb3B0cyk7CiB9CiAKLXN0YXRpYyB2b2lkIGFoY2lfcmVzdGFydF9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHUzMiBpcnFfc3RhdCkKK3N0YXRpYyB2b2lkIGFoY2lfZXJyb3JfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgaXJxX3N0YXQpCiB7Ci0Jdm9pZCBfX2lvbWVtICptbWlvID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7Ci0JdTMyIHRtcDsKKwlzdHJ1Y3QgYWhjaV9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSAwLCBhY3Rpb24gPSAwOworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdTMyIHNlcnJvcjsKIAotCWlmICgoYXAtPmRldmljZVswXS5jbGFzcyAhPSBBVEFfREVWX0FUQVBJKSB8fAotCSAgICAoKGlycV9zdGF0ICYgUE9SVF9JUlFfVEZfRVJSKSA9PSAwKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IHBvcnQgcmVzZXQsICIKLQkJICAgICAgICJwX2lzICV4IGlzICV4IHBpcyAleCBjbWQgJXggdGYgJXggc3MgJXggc2UgJXhcbiIsCi0JCQlhcC0+aWQsCi0JCQlpcnFfc3RhdCwKLQkJCXJlYWRsKG1taW8gKyBIT1NUX0lSUV9TVEFUKSwKLQkJCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpLAotCQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTUQpLAotCQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9URkRBVEEpLAotCQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfU1RBVCksCi0JCQlyZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9FUlIpKTsKKwlhdGFfZWhpX2NsZWFyX2Rlc2MoZWhpKTsKIAotCS8qIHN0b3AgRE1BICovCi0JYWhjaV9zdG9wX2VuZ2luZShhcCk7CisJLyogQUhDSSBuZWVkcyBTRXJyb3IgY2xlYXJlZDsgb3RoZXJ3aXNlLCBpdCBtaWdodCBsb2NrIHVwICovCisJc2Vycm9yID0gYWhjaV9zY3JfcmVhZChhcCwgU0NSX0VSUk9SKTsKKwlhaGNpX3Njcl93cml0ZShhcCwgU0NSX0VSUk9SLCBzZXJyb3IpOwogCi0JLyogY2xlYXIgU0FUQSBwaHkgZXJyb3IsIGlmIGFueSAqLwotCXRtcCA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7Ci0Jd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfRVJSKTsKKwkvKiBhbmFseXplIEBpcnFfc3RhdCAqLworCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgImlycV9zdGF0IDB4JTA4eCIsIGlycV9zdGF0KTsKIAotCS8qIGlmIERSUS9CU1kgaXMgc2V0LCBkZXZpY2UgbmVlZHMgdG8gYmUgcmVzZXQuCi0JICogaWYgc28sIGlzc3VlIENPTVJFU0VUCi0JICovCi0JdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9URkRBVEEpOwotCWlmICh0bXAgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgewotCQl3cml0ZWwoMHgzMDEsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0NUTCk7Ci0JCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0NUTCk7IC8qIGZsdXNoICovCi0JCXVkZWxheSgxMCk7Ci0JCXdyaXRlbCgweDMwMCwgcG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsKLQkJcmVhZGwocG9ydF9tbWlvICsgUE9SVF9TQ1JfQ1RMKTsgLyogZmx1c2ggKi8KKwlpZiAoaXJxX3N0YXQgJiBQT1JUX0lSUV9URl9FUlIpCisJCWVycl9tYXNrIHw9IEFDX0VSUl9ERVY7CisKKwlpZiAoaXJxX3N0YXQgJiAoUE9SVF9JUlFfSEJVU19FUlIgfCBQT1JUX0lSUV9IQlVTX0RBVEFfRVJSKSkgeworCQllcnJfbWFzayB8PSBBQ19FUlJfSE9TVF9CVVM7CisJCWFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOwogCX0KIAotCS8qIHJlLXN0YXJ0IERNQSAqLwotCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKLX0KKwlpZiAoaXJxX3N0YXQgJiBQT1JUX0lSUV9JRl9FUlIpIHsKKwkJZXJyX21hc2sgfD0gQUNfRVJSX0FUQV9CVVM7CisJCWFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICIsIGludGVyZmFjZSBmYXRhbCBlcnJvciIpOworCX0KIAotc3RhdGljIHZvaWQgYWhjaV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OwotCXZvaWQgX19pb21lbSAqbW1pbyA9IGhvc3Rfc2V0LT5tbWlvX2Jhc2U7Ci0Jdm9pZCBfX2lvbWVtICpwb3J0X21taW8gPSBhaGNpX3BvcnRfYmFzZShtbWlvLCBhcC0+cG9ydF9ubyk7Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmIChpcnFfc3RhdCAmIChQT1JUX0lSUV9DT05ORUNUIHwgUE9SVF9JUlFfUEhZUkRZKSkgeworCQlhdGFfZWhpX2hvdHBsdWdnZWQoZWhpKTsKKwkJYXRhX2VoaV9wdXNoX2Rlc2MoZWhpLCAiLCAlcyIsIGlycV9zdGF0ICYgUE9SVF9JUlFfQ09OTkVDVCA/CisJCQkiY29ubmVjdGlvbiBzdGF0dXMgY2hhbmdlZCIgOiAiUEhZIFJEWSBjaGFuZ2VkIik7CisJfQogCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IGhhbmRsaW5nIGVycm9yL3RpbWVvdXRcbiIsIGFwLT5pZCk7CisJaWYgKGlycV9zdGF0ICYgUE9SVF9JUlFfVU5LX0ZJUykgeworCQl1MzIgKnVuayA9ICh1MzIgKikocHAtPnJ4X2ZpcyArIFJYX0ZJU19VTkspOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJCWVycl9tYXNrIHw9IEFDX0VSUl9IU007CisJCWFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICIsIHVua25vd24gRklTICUwOHggJTA4eCAlMDh4ICUwOHgiLAorCQkJCSAgdW5rWzBdLCB1bmtbMV0sIHVua1syXSwgdW5rWzNdKTsKKwl9CiAKLQlhaGNpX3Jlc3RhcnRfcG9ydChhcCwgcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCkpOworCS8qIG9rYXksIGxldCdzIGhhbmQgb3ZlciB0byBFSCAqLworCWVoaS0+c2Vycm9yIHw9IHNlcnJvcjsKKwllaGktPmFjdGlvbiB8PSBhY3Rpb247CisKIAlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfVElNRU9VVDsKKwlpZiAocWMpCisJCXFjLT5lcnJfbWFzayB8PSBlcnJfbWFzazsKKwllbHNlCisJCWVoaS0+ZXJyX21hc2sgfD0gZXJyX21hc2s7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCi0JYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKKwlpZiAoaXJxX3N0YXQgJiBQT1JUX0lSUV9GUkVFWkUpCisJCWF0YV9wb3J0X2ZyZWV6ZShhcCk7CisJZWxzZQorCQlhdGFfcG9ydF9hYm9ydChhcCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGFoY2lfaG9zdF9pbnRyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCitzdGF0aWMgdm9pZCBhaGNpX2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewogCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOwogCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOwotCXUzMiBzdGF0dXMsIHNlcnIsIGNpOwotCi0Jc2VyciA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7Ci0Jd3JpdGVsKHNlcnIsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0VSUik7CisJc3RydWN0IGF0YV9laF9pbmZvICplaGkgPSAmYXAtPmVoX2luZm87CisJdTMyIHN0YXR1cywgcWNfYWN0aXZlOworCWludCByYzsKIAogCXN0YXR1cyA9IHJlYWRsKHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOwogCXdyaXRlbChzdGF0dXMsIHBvcnRfbW1pbyArIFBPUlRfSVJRX1NUQVQpOwogCi0JY2kgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7Ci0JaWYgKGxpa2VseSgoY2kgJiAweDEpID09IDApKSB7Ci0JCWlmIChxYykgewotCQkJV0FSTl9PTihxYy0+ZXJyX21hc2spOwotCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKLQkJCXFjID0gTlVMTDsKLQkJfQorCWlmICh1bmxpa2VseShzdGF0dXMgJiBQT1JUX0lSUV9FUlJPUikpIHsKKwkJYWhjaV9lcnJvcl9pbnRyKGFwLCBzdGF0dXMpOworCQlyZXR1cm47CiAJfQogCi0JaWYgKHN0YXR1cyAmIFBPUlRfSVJRX0ZBVEFMKSB7Ci0JCXVuc2lnbmVkIGludCBlcnJfbWFzazsKLQkJaWYgKHN0YXR1cyAmIFBPUlRfSVJRX1RGX0VSUikKLQkJCWVycl9tYXNrID0gQUNfRVJSX0RFVjsKLQkJZWxzZSBpZiAoc3RhdHVzICYgUE9SVF9JUlFfSUZfRVJSKQotCQkJZXJyX21hc2sgPSBBQ19FUlJfQVRBX0JVUzsKLQkJZWxzZQotCQkJZXJyX21hc2sgPSBBQ19FUlJfSE9TVF9CVVM7CisJaWYgKGFwLT5zYWN0aXZlKQorCQlxY19hY3RpdmUgPSByZWFkbChwb3J0X21taW8gKyBQT1JUX1NDUl9BQ1QpOworCWVsc2UKKwkJcWNfYWN0aXZlID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOwogCi0JCS8qIGNvbW1hbmQgcHJvY2Vzc2luZyBoYXMgc3RvcHBlZCBkdWUgdG8gZXJyb3I7IHJlc3RhcnQgKi8KLQkJYWhjaV9yZXN0YXJ0X3BvcnQoYXAsIHN0YXR1cyk7Ci0KLQkJaWYgKHFjKSB7Ci0JCQlxYy0+ZXJyX21hc2sgfD0gZXJyX21hc2s7Ci0JCQlhdGFfcWNfY29tcGxldGUocWMpOwotCQl9CisJcmMgPSBhdGFfcWNfY29tcGxldGVfbXVsdGlwbGUoYXAsIHFjX2FjdGl2ZSwgTlVMTCk7CisJaWYgKHJjID4gMCkKKwkJcmV0dXJuOworCWlmIChyYyA8IDApIHsKKwkJZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQlhdGFfcG9ydF9mcmVlemUoYXApOworCQlyZXR1cm47CiAJfQogCi0JcmV0dXJuIDE7CisJLyogaG1tbS4uLiBhIHNwdXJpb3VzIGludGVydXB0ICovCisKKwkvKiBzb21lIGRldmljZXMgc2VuZCBEMkggcmVnIHdpdGggSSBiaXQgc2V0IGR1cmluZyBOQ1EgY29tbWFuZCBwaGFzZSAqLworCWlmIChhcC0+c2FjdGl2ZSAmJiBzdGF0dXMgJiBQT1JUX0lSUV9EMkhfUkVHX0ZJUykKKwkJcmV0dXJuOworCisJLyogaWdub3JlIGludGVyaW0gUElPIHNldHVwIGZpcyBpbnRlcnJ1cHRzICovCisJaWYgKGF0YV90YWdfdmFsaWQoYXAtPmFjdGl2ZV90YWcpKSB7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPQorCQkJYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisKKwkJaWYgKHFjICYmIHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9QSU8gJiYKKwkJICAgIChzdGF0dXMgJiBQT1JUX0lSUV9QSU9TX0ZJUykpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGF0YV9yYXRlbGltaXQoKSkKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJzcHVyaW91cyBpbnRlcnJ1cHQgIgorCQkJCSIoaXJxX3N0YXQgMHgleCBhY3RpdmVfdGFnICVkIHNhY3RpdmUgMHgleClcbiIsCisJCQkJc3RhdHVzLCBhcC0+YWN0aXZlX3RhZywgYXAtPnNhY3RpdmUpOwogfQogCiBzdGF0aWMgdm9pZCBhaGNpX2lycV9jbGVhcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpAQCAtODgyLDcgKzk2MCw3IEBACiAJLyogVE9ETyAqLwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWhjaV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCitzdGF0aWMgaXJxcmV0dXJuX3QgYWhjaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCA9IGRldl9pbnN0YW5jZTsKIAlzdHJ1Y3QgYWhjaV9ob3N0X3ByaXYgKmhwcml2OwpAQCAtOTExLDE0ICs5ODksNyBAQAogCiAJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOwogCQlpZiAoYXApIHsKLQkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7Ci0JCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCQkJaWYgKCFhaGNpX2hvc3RfaW50cihhcCwgcWMpKQotCQkJCWlmIChhdGFfcmF0ZWxpbWl0KCkpCi0JCQkJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCBob3N0X3NldC0+ZGV2LAotCQkJCQkgICJ1bmhhbmRsZWQgaW50ZXJydXB0IG9uIHBvcnQgJXVcbiIsCi0JCQkJCSAgaSk7Ci0KKwkJCWFoY2lfaG9zdF9pbnRyKGFwKTsKIAkJCVZQUklOVEsoInBvcnQgJXVcbiIsIGkpOwogCQl9IGVsc2UgewogCQkJVlBSSU5USygicG9ydCAldSAobm8gaXJxKVxuIiwgaSk7CkBAIC05MzUsNyArMTAwNiw3IEBACiAJCWhhbmRsZWQgPSAxOwogCX0KIAotICAgICAgICBzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCXNwaW5fdW5sb2NrKCZob3N0X3NldC0+bG9jayk7CiAKIAlWUFJJTlRLKCJFWElUXG4iKTsKIApAQCAtOTQ3LDEyICsxMDE4LDY1IEBACiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9ICh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5jbWRfYWRkcjsKIAotCXdyaXRlbCgxLCBwb3J0X21taW8gKyBQT1JUX0NNRF9JU1NVRSk7CisJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9OQ1EpCisJCXdyaXRlbCgxIDw8IHFjLT50YWcsIHBvcnRfbW1pbyArIFBPUlRfU0NSX0FDVCk7CisJd3JpdGVsKDEgPDwgcWMtPnRhZywgcG9ydF9tbWlvICsgUE9SVF9DTURfSVNTVUUpOwogCXJlYWRsKHBvcnRfbW1pbyArIFBPUlRfQ01EX0lTU1VFKTsJLyogZmx1c2ggKi8KIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBhaGNpX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pbyA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCXZvaWQgX19pb21lbSAqcG9ydF9tbWlvID0gYWhjaV9wb3J0X2Jhc2UobW1pbywgYXAtPnBvcnRfbm8pOworCisJLyogdHVybiBJUlEgb2ZmICovCisJd3JpdGVsKDAsIHBvcnRfbW1pbyArIFBPUlRfSVJRX01BU0spOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW8gPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl2b2lkIF9faW9tZW0gKnBvcnRfbW1pbyA9IGFoY2lfcG9ydF9iYXNlKG1taW8sIGFwLT5wb3J0X25vKTsKKwl1MzIgdG1wOworCisJLyogY2xlYXIgSVJRICovCisJdG1wID0gcmVhZGwocG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CisJd3JpdGVsKDEgPDwgYXAtPmlkLCBtbWlvICsgSE9TVF9JUlFfU1RBVCk7CisKKwkvKiB0dXJuIElSUSBiYWNrIG9uICovCisJd3JpdGVsKERFRl9QT1JUX0lSUSwgcG9ydF9tbWlvICsgUE9SVF9JUlFfTUFTSyk7Cit9CisKK3N0YXRpYyB2b2lkIGFoY2lfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWlmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX0ZST1pFTikpIHsKKwkJLyogcmVzdGFydCBlbmdpbmUgKi8KKwkJYWhjaV9zdG9wX2VuZ2luZShhcCk7CisJCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwl9CisKKwkvKiBwZXJmb3JtIHJlY292ZXJ5ICovCisJYXRhX2RvX2VoKGFwLCBhaGNpX3ByZXJlc2V0LCBhaGNpX3NvZnRyZXNldCwgYWhjaV9oYXJkcmVzZXQsCisJCSAgYWhjaV9wb3N0cmVzZXQpOworfQorCitzdGF0aWMgdm9pZCBhaGNpX3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKKwkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKKworCWlmIChxYy0+ZXJyX21hc2spIHsKKwkJLyogbWFrZSBETUEgZW5naW5lIGZvcmdldCBhYm91dCB0aGUgZmFpbGVkIGNvbW1hbmQgKi8KKwkJYWhjaV9zdG9wX2VuZ2luZShhcCk7CisJCWFoY2lfc3RhcnRfZW5naW5lKGFwKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGFoY2lfc2V0dXBfcG9ydChzdHJ1Y3QgYXRhX2lvcG9ydHMgKnBvcnQsIHVuc2lnbmVkIGxvbmcgYmFzZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcG9ydF9pZHgpCiB7CkBAIC0xMDk3LDkgKzEyMjEsNiBAQAogCQkJd3JpdGVsKHRtcCwgcG9ydF9tbWlvICsgUE9SVF9JUlFfU1RBVCk7CiAKIAkJd3JpdGVsKDEgPDwgaSwgbW1pbyArIEhPU1RfSVJRX1NUQVQpOwotCi0JCS8qIHNldCBpcnEgbWFzayAoZW5hYmxlcyBpbnRlcnJ1cHRzKSAqLwotCQl3cml0ZWwoREVGX1BPUlRfSVJRLCBwb3J0X21taW8gKyBQT1JUX0lSUV9NQVNLKTsKIAl9CiAKIAl0bXAgPSByZWFkbChtbWlvICsgSE9TVF9DVEwpOwpAQCAtMTE5Nyw2ICsxMzE4LDggQEAKIAogCVZQUklOVEsoIkVOVEVSXG4iKTsKIAorCVdBUk5fT04oQVRBX01BWF9RVUVVRSA+IEFIQ0lfTUFYX0NNRFMpOworCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCkBAIC0xMjY0LDYgKzEzODcsMTAgQEAKIAlpZiAocmMpCiAJCWdvdG8gZXJyX291dF9ocHJpdjsKIAorCWlmICghKHByb2JlX2VudC0+aG9zdF9mbGFncyAmIEFIQ0lfRkxBR19OT19OQ1EpICYmCisJICAgIChocHJpdi0+Y2FwICYgSE9TVF9DQVBfTkNRKSkKKwkJcHJvYmVfZW50LT5ob3N0X2ZsYWdzIHw9IEFUQV9GTEFHX05DUTsKKwogCWFoY2lfcHJpbnRfaW5mbyhwcm9iZV9lbnQpOwogCiAJLyogRklYTUU6IGNoZWNrIGF0YV9kZXZpY2VfYWRkIHJldHVybiB2YWx1ZSAqLwpAQCAtMTI5NSwyMSArMTQyMiwxNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwogCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFoY2lfaG9zdF9wcml2ICpocHJpdiA9IGhvc3Rfc2V0LT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcDsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgaGF2ZV9tc2k7CiAKLQlmb3IgKGkgPSAwOyBpIDwgaG9zdF9zZXQtPm5fcG9ydHM7IGkrKykgewotCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKLQotCQlzY3NpX3JlbW92ZV9ob3N0KGFwLT5ob3N0KTsKLQl9CisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspCisJCWF0YV9wb3J0X2RldGFjaChob3N0X3NldC0+cG9ydHNbaV0pOwogCiAJaGF2ZV9tc2kgPSBocHJpdi0+ZmxhZ3MgJiBBSENJX0ZMQUdfTVNJOwogCWZyZWVfaXJxKGhvc3Rfc2V0LT5pcnEsIGhvc3Rfc2V0KTsKIAogCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7Ci0JCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOworCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOwogCiAJCWF0YV9zY3NpX3JlbGVhc2UoYXAtPmhvc3QpOwogCQlzY3NpX2hvc3RfcHV0KGFwLT5ob3N0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9hcm0vcXVldWUuYyBiL2RyaXZlcnMvc2NzaS9hcm0vcXVldWUuYwppbmRleCBiMTA3NTBiLi44Y2FhNTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXJtL3F1ZXVlLmMKKysrIGIvZHJpdmVycy9zY3NpL2FybS9xdWV1ZS5jCkBAIC0xMTgsOCArMTE4LDcgQEAKIAlsaXN0X2RlbChsKTsKIAogCXEgPSBsaXN0X2VudHJ5KGwsIFFFX3QsIGxpc3QpOwotCWlmIChCQURfTUFHSUMocSwgUVVFVUVfTUFHSUNfRlJFRSkpCi0JCUJVRygpOworCUJVR19PTihCQURfTUFHSUMocSwgUVVFVUVfTUFHSUNfRlJFRSkpOwogCiAJU0VUX01BR0lDKHEsIFFVRVVFX01BR0lDX1VTRUQpOwogCXEtPlNDcG50ID0gU0NwbnQ7CkBAIC0xNDQsOCArMTQzLDcgQEAKIAkgKi8KIAlsaXN0X2RlbChlbnQpOwogCXEgPSBsaXN0X2VudHJ5KGVudCwgUUVfdCwgbGlzdCk7Ci0JaWYgKEJBRF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19VU0VEKSkKLQkJQlVHKCk7CisJQlVHX09OKEJBRF9NQUdJQyhxLCBRVUVVRV9NQUdJQ19VU0VEKSk7CiAKIAlTRVRfTUFHSUMocSwgUVVFVUVfTUFHSUNfRlJFRSk7CiAJbGlzdF9hZGQoZW50LCAmcXVldWUtPmZyZWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2F0YV9waWl4LmMgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwppbmRleCA2ZGM4ODE0Li41MjFiNzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYworKysgYi9kcml2ZXJzL3Njc2kvYXRhX3BpaXguYwpAQCAtOTMsNyArOTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJhdGFfcGlpeCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMDUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEwIgogCiBlbnVtIHsKIAlQSUlYX0lPQ0ZHCQk9IDB4NTQsIC8qIElERSBJL08gY29uZmlndXJhdGlvbiByZWdpc3RlciAqLwpAQCAtMTQ2LDExICsxNDYsMTAgQEAKIAogc3RhdGljIGludCBwaWl4X2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7Ci0KLXN0YXRpYyBpbnQgcGlpeF9wYXRhX3Byb2JlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7Ci1zdGF0aWMgaW50IHBpaXhfc2F0YV9wcm9iZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOwogc3RhdGljIHZvaWQgcGlpeF9zZXRfcGlvbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogc3RhdGljIHZvaWQgcGlpeF9zZXRfZG1hbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOworc3RhdGljIHZvaWQgcGlpeF9wYXRhX2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBwaWl4X3NhdGFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBpbl9tb2R1bGVfaW5pdCA9IDE7CiAKQEAgLTE1OSw2ICsxNTgsNyBAQAogCXsgMHg4MDg2LCAweDcxMTEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIHBpaXg0X3BhdGEgfSwKIAl7IDB4ODA4NiwgMHgyNGRiLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g1X3BhdGEgfSwKIAl7IDB4ODA4NiwgMHgyNWEyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g1X3BhdGEgfSwKKwl7IDB4ODA4NiwgMHgyN2RmLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBpY2g1X3BhdGEgfSwKICNlbmRpZgogCiAJLyogTk9URTogVGhlIGZvbGxvd2luZyBQQ0kgaWRzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlCkBAIC0yMTgsNiArMjE4LDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogCS5yZXN1bWUJCQk9IGF0YV9zY3NpX2RldmljZV9yZXN1bWUsCiAJLnN1c3BlbmQJCT0gYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQsCkBAIC0yMjcsNiArMjI4LDcgQEAKIAkucG9ydF9kaXNhYmxlCQk9IGF0YV9wb3J0X2Rpc2FibGUsCiAJLnNldF9waW9tb2RlCQk9IHBpaXhfc2V0X3Bpb21vZGUsCiAJLnNldF9kbWFtb2RlCQk9IHBpaXhfc2V0X2RtYW1vZGUsCisJLm1vZGVfZmlsdGVyCQk9IGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIsCiAKIAkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKIAkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKQEAgLTIzNCwxNiArMjM2LDE4IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKIAotCS5wcm9iZV9yZXNldAkJPSBwaWl4X3BhdGFfcHJvYmVfcmVzZXQsCi0KIAkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAogCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKwkuZnJlZXplCQkJPSBhdGFfYm1kbWFfZnJlZXplLAorCS50aGF3CQkJPSBhdGFfYm1kbWFfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBwaWl4X3BhdGFfZXJyb3JfaGFuZGxlciwKKwkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCiAKIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCkBAIC0yNjIsMTYgKzI2NiwxOCBAQAogCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKIAkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCiAKLQkucHJvYmVfcmVzZXQJCT0gcGlpeF9zYXRhX3Byb2JlX3Jlc2V0LAotCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LAogCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAogCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKIAkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKKwkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gcGlpeF9zYXRhX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAogCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLApAQCAtNDU1LDU5ICs0NjEsNTEgQEAKIH0KIAogLyoqCi0gKglwaWl4X3BhdGFfcHJvYmVpbml0IC0gcHJvYmVpbml0IGZvciBQQVRBIGhvc3QgY29udHJvbGxlcgorICoJcGlpeF9wYXRhX3ByZXJlc2V0IC0gcHJlcmVzZXQgZm9yIFBBVEEgaG9zdCBjb250cm9sbGVyCiAgKglAYXA6IFRhcmdldCBwb3J0CiAgKgotICoJUHJvYmVpbml0IGluY2x1ZGluZyBjYWJsZSBkZXRlY3Rpb24uCisgKglQcmVyZXNldCBpbmNsdWRpbmcgY2FibGUgZGV0ZWN0aW9uLgogICoKICAqCUxPQ0tJTkc6CiAgKglOb25lIChpbmhlcml0ZWQgZnJvbSBjYWxsZXIpLgogICovCi1zdGF0aWMgdm9pZCBwaWl4X3BhdGFfcHJvYmVpbml0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JcGlpeF9wYXRhX2NibF9kZXRlY3QoYXApOwotCWF0YV9zdGRfcHJvYmVpbml0KGFwKTsKLX0KLQotLyoqCi0gKglwaWl4X3BhdGFfcHJvYmVfcmVzZXQgLSBQZXJmb3JtIHJlc2V0IG9uIFBBVEEgcG9ydCBhbmQgY2xhc3NpZnkKLSAqCUBhcDogUG9ydCB0byByZXNldAotICoJQGNsYXNzZXM6IFJlc3VsdGluZyBjbGFzc2VzIG9mIGF0dGFjaGVkIGRldmljZXMKLSAqCi0gKglSZXNldCBQQVRBIHBoeSBhbmQgY2xhc3NpZnkgYXR0YWNoZWQgZGV2aWNlcy4KLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KLSAqLwotc3RhdGljIGludCBwaWl4X3BhdGFfcHJvYmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKQorc3RhdGljIGludCBwaWl4X3BhdGFfcHJlcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoYXAtPmhvc3Rfc2V0LT5kZXYpOwogCiAJaWYgKCFwY2lfdGVzdF9jb25maWdfYml0cyhwZGV2LCAmcGlpeF9lbmFibGVfYml0c1thcC0+aGFyZF9wb3J0X25vXSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IHBvcnQgZGlzYWJsZWQuIGlnbm9yaW5nLlxuIiwgYXAtPmlkKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJwb3J0IGRpc2FibGVkLiBpZ25vcmluZy5cbiIpOworCQlhcC0+ZWhfY29udGV4dC5pLmFjdGlvbiAmPSB+QVRBX0VIX1JFU0VUX01BU0s7CiAJCXJldHVybiAwOwogCX0KIAotCXJldHVybiBhdGFfZHJpdmVfcHJvYmVfcmVzZXQoYXAsIHBpaXhfcGF0YV9wcm9iZWluaXQsCi0JCQkJICAgICBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwKLQkJCQkgICAgIGF0YV9zdGRfcG9zdHJlc2V0LCBjbGFzc2VzKTsKKwlwaWl4X3BhdGFfY2JsX2RldGVjdChhcCk7CisKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBpaXhfcGF0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBwaWl4X3BhdGFfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLAorCQkJICAgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCiAvKioKLSAqCXBpaXhfc2F0YV9wcm9iZSAtIFByb2JlIFBDSSBkZXZpY2UgZm9yIHByZXNlbnQgU0FUQSBkZXZpY2VzCi0gKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBQQ0kgZGV2aWNlIHdlIHdpc2ggdG8gcHJvYmUKKyAqCXBpaXhfc2F0YV9wcmVyZXNldCAtIHByZXJlc2V0IGZvciBTQVRBIGhvc3QgY29udHJvbGxlcgorICoJQGFwOiBUYXJnZXQgcG9ydAogICoKICAqCVJlYWRzIGFuZCBjb25maWd1cmVzIFNBVEEgUENJIGRldmljZSdzIFBDSSBjb25maWcgcmVnaXN0ZXIKICAqCVBvcnQgQ29uZmlndXJhdGlvbiBhbmQgU3RhdHVzIChQQ1MpIHRvIGRldGVybWluZSBwb3J0IGFuZAotICoJZGV2aWNlIGF2YWlsYWJpbGl0eS4KKyAqCWRldmljZSBhdmFpbGFiaWxpdHkuICBSZXR1cm4gLUVOT0RFViB0byBza2lwIHJlc2V0IGlmIG5vCisgKglkZXZpY2UgaXMgcHJlc2VudC4KICAqCiAgKglMT0NLSU5HOgogICoJTm9uZSAoaW5oZXJpdGVkIGZyb20gY2FsbGVyKS4KICAqCiAgKglSRVRVUk5TOgotICoJTWFzayBvZiBhdmFsaWFibGUgZGV2aWNlcyBvbiB0aGUgcG9ydC4KKyAqCTAgaWYgZGV2aWNlIGlzIHByZXNlbnQsIC1FTk9ERVYgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHBpaXhfc2F0YV9wcm9iZSAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3N0YXRpYyBpbnQgcGlpeF9zYXRhX3ByZXJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGFwLT5ob3N0X3NldC0+ZGV2KTsKIAljb25zdCB1bnNpZ25lZCBpbnQgKm1hcCA9IGFwLT5ob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwpAQCAtNTQ5LDI5ICs1NDcsMTkgQEAKIAlEUFJJTlRLKCJhdGEldTogTEVBVkUsIHBjcz0weCV4IHByZXNlbnRfbWFzaz0weCV4XG4iLAogCQlhcC0+aWQsIHBjcywgcHJlc2VudF9tYXNrKTsKIAotCXJldHVybiBwcmVzZW50X21hc2s7Ci19Ci0KLS8qKgotICoJcGlpeF9zYXRhX3Byb2JlX3Jlc2V0IC0gUGVyZm9ybSByZXNldCBvbiBTQVRBIHBvcnQgYW5kIGNsYXNzaWZ5Ci0gKglAYXA6IFBvcnQgdG8gcmVzZXQKLSAqCUBjbGFzc2VzOiBSZXN1bHRpbmcgY2xhc3NlcyBvZiBhdHRhY2hlZCBkZXZpY2VzCi0gKgotICoJUmVzZXQgU0FUQSBwaHkgYW5kIGNsYXNzaWZ5IGF0dGFjaGVkIGRldmljZXMuCi0gKgotICoJTE9DS0lORzoKLSAqCU5vbmUgKGluaGVyaXRlZCBmcm9tIGNhbGxlcikuCi0gKi8KLXN0YXRpYyBpbnQgcGlpeF9zYXRhX3Byb2JlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3NlcykKLXsKLQlpZiAoIXBpaXhfc2F0YV9wcm9iZShhcCkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IFNBVEEgcG9ydCBoYXMgbm8gZGV2aWNlLlxuIiwgYXAtPmlkKTsKKwlpZiAoIXByZXNlbnRfbWFzaykgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIlNBVEEgcG9ydCBoYXMgbm8gZGV2aWNlLlxuIik7CisJCWFwLT5laF9jb250ZXh0LmkuYWN0aW9uICY9IH5BVEFfRUhfUkVTRVRfTUFTSzsKIAkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIGF0YV9kcml2ZV9wcm9iZV9yZXNldChhcCwgYXRhX3N0ZF9wcm9iZWluaXQsCi0JCQkJICAgICBhdGFfc3RkX3NvZnRyZXNldCwgTlVMTCwKLQkJCQkgICAgIGF0YV9zdGRfcG9zdHJlc2V0LCBjbGFzc2VzKTsKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHBpaXhfc2F0YV9lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBwaWl4X3NhdGFfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBOVUxMLAorCQkJICAgYXRhX3N0ZF9wb3N0cmVzZXQpOwogfQogCiAvKioKQEAgLTc2MCwxNSArNzQ4LDE1IEBACiAJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldik7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIDB4NDEsICZjZmcpOwogCQkvKiBPbmx5IG9uIHRoZSBvcmlnaW5hbCByZXZpc2lvbjogSURFIERNQSBjYW4gaGFuZyAqLwotCQlpZihyZXYgPT0gMHgwMCkKKwkJaWYgKHJldiA9PSAweDAwKQogCQkJbm9fcGlpeF9kbWEgPSAxOwogCQkvKiBPbiBhbGwgcmV2aXNpb25zIGJlbG93IDUgUFhCIGJ1cyBsb2NrIG11c3QgYmUgZGlzYWJsZWQgZm9yIElERSAqLwotCQllbHNlIGlmKGNmZyAmICgxPDwxNCkgJiYgcmV2IDwgNSkKKwkJZWxzZSBpZiAoY2ZnICYgKDE8PDE0KSAmJiByZXYgPCA1KQogCQkJbm9fcGlpeF9kbWEgPSAyOwogCX0KLQlpZihub19waWl4X2RtYSkKKwlpZiAobm9fcGlpeF9kbWEpCiAJCWRldl9wcmludGsoS0VSTl9XQVJOSU5HLCAmYXRhX2Rldi0+ZGV2LCAiNDUwTlggZXJyYXRhIHByZXNlbnQsIGRpc2FibGluZyBJREUgRE1BLlxuIik7Ci0JaWYobm9fcGlpeF9kbWEgPT0gMikKKwlpZiAobm9fcGlpeF9kbWEgPT0gMikKIAkJZGV2X3ByaW50ayhLRVJOX1dBUk5JTkcsICZhdGFfZGV2LT5kZXYsICJBIEJJT1MgdXBkYXRlIG1heSByZXNvbHZlIHRoaXMuXG4iKTsKIAlyZXR1cm4gbm9fcGlpeF9kbWE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZXNwLmMgYi9kcml2ZXJzL3Njc2kvZXNwLmMKaW5kZXggMGEzZTQ1ZC4uZGRiNTEyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9lc3AuYwpAQCAtMSw3ICsxLDYgQEAKLS8qICRJZDogZXNwLmMsdiAxLjEwMSAyMDAyLzAxLzE1IDA2OjQ4OjU1IGRhdmVtIEV4cCAkCi0gKiBlc3AuYzogIEVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4gU0NTSSBkcml2ZXIgY29kZS4KKy8qIGVzcC5jOiBFU1AgU3VuIFNDU0kgZHJpdmVyLgogICoKLSAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5OCBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTgsIDIwMDYgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KQogICovCiAKIC8qIFRPRE86CkBAIC0xODUsMTEgKzE4NCw2IEBACiAvKjUqLwlkb19pbnRyX2VuZAogfTsKIAotLyogVGhlIG1hc3RlciByaW5nIG9mIGFsbCBlc3AgaG9zdHMgd2UgYXJlIG1hbmFnaW5nIGluIHRoaXMgZHJpdmVyLiAqLwotc3RhdGljIHN0cnVjdCBlc3AgKmVzcGNoYWluOwotc3RhdGljIERFRklORV9TUElOTE9DSyhlc3BjaGFpbl9sb2NrKTsKLXN0YXRpYyBpbnQgZXNwc19ydW5uaW5nID0gMDsKLQogLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMuICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpOwogCkBAIC02OTQsMzYgKzY4OCw2IEBACiAJc2J1c19yZWFkYihlc3AtPmVyZWdzICsgRVNQX0lOVFJQVCk7CiB9CiAKLXN0YXRpYyB2b2lkIGVzcF9jaGFpbl9hZGQoc3RydWN0IGVzcCAqZXNwKQotewotCXNwaW5fbG9ja19pcnEoJmVzcGNoYWluX2xvY2spOwotCWlmIChlc3BjaGFpbikgewotCQlzdHJ1Y3QgZXNwICplbGluayA9IGVzcGNoYWluOwotCQl3aGlsZSAoZWxpbmstPm5leHQpCi0JCQllbGluayA9IGVsaW5rLT5uZXh0OwotCQllbGluay0+bmV4dCA9IGVzcDsKLQl9IGVsc2UgewotCQllc3BjaGFpbiA9IGVzcDsKLQl9Ci0JZXNwLT5uZXh0ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoJmVzcGNoYWluX2xvY2spOwotfQotCi1zdGF0aWMgdm9pZCBlc3BfY2hhaW5fZGVsKHN0cnVjdCBlc3AgKmVzcCkKLXsKLQlzcGluX2xvY2tfaXJxKCZlc3BjaGFpbl9sb2NrKTsKLQlpZiAoZXNwY2hhaW4gPT0gZXNwKSB7Ci0JCWVzcGNoYWluID0gZXNwLT5uZXh0OwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBlc3AgKmVsaW5rID0gZXNwY2hhaW47Ci0JCXdoaWxlIChlbGluay0+bmV4dCAhPSBlc3ApCi0JCQllbGluayA9IGVsaW5rLT5uZXh0OwotCQllbGluay0+bmV4dCA9IGVzcC0+bmV4dDsKLQl9Ci0JZXNwLT5uZXh0ID0gTlVMTDsKLQlzcGluX3VubG9ja19pcnEoJmVzcGNoYWluX2xvY2spOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBlc3BfZmluZF9kdm1hKHN0cnVjdCBlc3AgKmVzcCwgc3RydWN0IHNidXNfZGV2ICpkbWFfc2RldikKIHsKIAlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSBlc3AtPnNkZXY7CkBAIC04MzAsMTkgKzc5NCwyMCBAQAogc3RhdGljIHZvaWQgX19pbml0IGVzcF9nZXRfc2NzaV9pZChzdHJ1Y3QgZXNwICplc3ApCiB7CiAJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gZXNwLT5zZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBzZGV2LT5vZmRldi5ub2RlOwogCi0JZXNwLT5zY3NpX2lkID0gcHJvbV9nZXRpbnRkZWZhdWx0KGVzcC0+cHJvbV9ub2RlLAotCQkJCQkgICJpbml0aWF0b3ItaWQiLAotCQkJCQkgIC0xKTsKKwllc3AtPnNjc2lfaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsCisJCQkJCSAgICAgImluaXRpYXRvci1pZCIsCisJCQkJCSAgICAgLTEpOwogCWlmIChlc3AtPnNjc2lfaWQgPT0gLTEpCi0JCWVzcC0+c2NzaV9pZCA9IHByb21fZ2V0aW50ZGVmYXVsdChlc3AtPnByb21fbm9kZSwKLQkJCQkJCSAgInNjc2ktaW5pdGlhdG9yLWlkIiwKLQkJCQkJCSAgLTEpOworCQllc3AtPnNjc2lfaWQgPSBvZl9nZXRpbnRwcm9wX2RlZmF1bHQoZHAsCisJCQkJCQkgICAgICJzY3NpLWluaXRpYXRvci1pZCIsCisJCQkJCQkgICAgIC0xKTsKIAlpZiAoZXNwLT5zY3NpX2lkID09IC0xKQogCQllc3AtPnNjc2lfaWQgPSAoc2Rldi0+YnVzID09IE5VTEwpID8gNyA6Ci0JCQlwcm9tX2dldGludGRlZmF1bHQoc2Rldi0+YnVzLT5wcm9tX25vZGUsCi0JCQkJCSAgICJzY3NpLWluaXRpYXRvci1pZCIsCi0JCQkJCSAgIDcpOworCQkJb2ZfZ2V0aW50cHJvcF9kZWZhdWx0KHNkZXYtPmJ1cy0+b2ZkZXYubm9kZSwKKwkJCQkJICAgICAgInNjc2ktaW5pdGlhdG9yLWlkIiwKKwkJCQkJICAgICAgNyk7CiAJZXNwLT5laG9zdC0+dGhpc19pZCA9IGVzcC0+c2NzaV9pZDsKIAllc3AtPnNjc2lfaWRfbWFzayA9ICgxIDw8IGVzcC0+c2NzaV9pZCk7CiAKQEAgLTEwNjcsMjggKzEwMzIsMzAgQEAKIAllc3AtPnByZXZfaG1lX2RtYWNzciA9IDB4ZmZmZmZmZmY7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGRldGVjdF9vbmVfZXNwKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQsIHN0cnVjdCBzYnVzX2RldiAqZXNwX2RldiwKLQkJCQkgc3RydWN0IHNidXNfZGV2ICplc3BkbWEsIHN0cnVjdCBzYnVzX2J1cyAqc2J1cywKLQkJCQkgaW50IGlkLCBpbnQgaG1lKQorc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X29uZV9lc3Aoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCwKKwkJCQkgc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3Qgc2J1c19kZXYgKmVzcF9kZXYsCisJCQkJIHN0cnVjdCBzYnVzX2RldiAqZXNwZG1hLAorCQkJCSBzdHJ1Y3Qgc2J1c19idXMgKnNidXMsCisJCQkJIGludCBobWUpCiB7Ci0Jc3RydWN0IFNjc2lfSG9zdCAqZXNwX2hvc3QgPSBzY3NpX3JlZ2lzdGVyKHRwbnQsIHNpemVvZihzdHJ1Y3QgZXNwKSk7CisJc3RhdGljIGludCBpbnN0YW5jZTsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICplc3BfaG9zdCA9IHNjc2lfaG9zdF9hbGxvYyh0cG50LCBzaXplb2Yoc3RydWN0IGVzcCkpOwogCXN0cnVjdCBlc3AgKmVzcDsKIAkKLQlpZiAoIWVzcF9ob3N0KSB7Ci0JCXByaW50aygiRVNQOiBDYW5ub3QgcmVnaXN0ZXIgU0NTSSBob3N0XG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAoIWVzcF9ob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlmIChobWUpCiAJCWVzcF9ob3N0LT5tYXhfaWQgPSAxNjsKIAllc3AgPSAoc3RydWN0IGVzcCAqKSBlc3BfaG9zdC0+aG9zdGRhdGE7CiAJZXNwLT5laG9zdCA9IGVzcF9ob3N0OwogCWVzcC0+c2RldiA9IGVzcF9kZXY7Ci0JZXNwLT5lc3BfaWQgPSBpZDsKKwllc3AtPmVzcF9pZCA9IGluc3RhbmNlOwogCWVzcC0+cHJvbV9ub2RlID0gZXNwX2Rldi0+cHJvbV9ub2RlOwogCXByb21fZ2V0c3RyaW5nKGVzcC0+cHJvbV9ub2RlLCAibmFtZSIsIGVzcC0+cHJvbV9uYW1lLAogCQkgICAgICAgc2l6ZW9mKGVzcC0+cHJvbV9uYW1lKSk7CiAKLQllc3BfY2hhaW5fYWRkKGVzcCk7CiAJaWYgKGVzcF9maW5kX2R2bWEoZXNwLCBlc3BkbWEpIDwgMCkKIAkJZ290byBmYWlsX3VubGluazsKIAlpZiAoZXNwX21hcF9yZWdzKGVzcCwgaG1lKSA8IDApIHsKQEAgLTExMTUsOCArMTA4MiwxOSBAQAogCiAJZXNwX2Jvb3R1cF9yZXNldChlc3ApOwogCisJaWYgKHNjc2lfYWRkX2hvc3QoZXNwX2hvc3QsIGRldikpCisJCWdvdG8gZmFpbF9mcmVlX2lycTsKKworCWRldl9zZXRfZHJ2ZGF0YSgmZXNwX2Rldi0+b2ZkZXYuZGV2LCBlc3ApOworCisJc2NzaV9zY2FuX2hvc3QoZXNwX2hvc3QpOworCWluc3RhbmNlKys7CisKIAlyZXR1cm4gMDsKIAorZmFpbF9mcmVlX2lycToKKwlmcmVlX2lycShlc3AtPmVob3N0LT5pcnEsIGVzcCk7CisKIGZhaWxfdW5tYXBfY21kYXJlYToKIAlzYnVzX2ZyZWVfY29uc2lzdGVudChlc3AtPnNkZXYsIDE2LAogCQkJICAgICAodm9pZCAqKSBlc3AtPmVzcF9jb21tYW5kLApAQCAtMTEyOSwxMDIgKzExMDcsMTggQEAKIAllc3AtPmRtYS0+YWxsb2NhdGVkID0gMDsKIAogZmFpbF91bmxpbms6Ci0JZXNwX2NoYWluX2RlbChlc3ApOwotCXNjc2lfdW5yZWdpc3Rlcihlc3BfaG9zdCk7CisJc2NzaV9ob3N0X3B1dChlc3BfaG9zdCk7CiAJcmV0dXJuIC0xOwogfQogCiAvKiBEZXRlY3RpbmcgRVNQIGNoaXBzIG9uIHRoZSBtYWNoaW5lLiAgVGhpcyBpcyB0aGUgc2ltcGxlIGFuZCBlYXN5CiAgKiB2ZXJzaW9uLgogICovCi0KLSNpZmRlZiBDT05GSUdfU1VONAotCi0jaW5jbHVkZSA8YXNtL3N1bjRwYWRkci5oPgotCi1zdGF0aWMgaW50IF9faW5pdCBlc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBlc3BfcmVtb3ZlX2NvbW1vbihzdHJ1Y3QgZXNwICplc3ApCiB7Ci0Jc3RhdGljIHN0cnVjdCBzYnVzX2RldiBlc3BfZGV2OwotCWludCBlc3BzX2luX3VzZSA9IDA7CisJdW5zaWduZWQgaW50IGlycSA9IGVzcC0+ZWhvc3QtPmlycTsKIAotCWVzcGNoYWluID0gTlVMTDsKLQotCWlmIChzdW40X2VzcF9waHlzYWRkcikgewotCQltZW1zZXQgKCZlc3BfZGV2LCAwLCBzaXplb2YoZXNwX2RldikpOwotCQllc3BfZGV2LnJlZ19hZGRyc1swXS5waHlzX2FkZHIgPSBzdW40X2VzcF9waHlzYWRkcjsKLQkJZXNwX2Rldi5pcnFzWzBdID0gNDsKLQkJZXNwX2Rldi5yZXNvdXJjZVswXS5zdGFydCA9IHN1bjRfZXNwX3BoeXNhZGRyOwotCQllc3BfZGV2LnJlc291cmNlWzBdLmVuZCA9IHN1bjRfZXNwX3BoeXNhZGRyICsgRVNQX1JFR19TSVpFIC0gMTsKLQkJZXNwX2Rldi5yZXNvdXJjZVswXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87Ci0KLQkJaWYgKCFkZXRlY3Rfb25lX2VzcCh0cG50LCAmZXNwX2RldiwgTlVMTCwgTlVMTCwgMCwgMCkpCi0JCQllc3BzX2luX3VzZSsrOwotCQlwcmludGsoIkVTUDogVG90YWwgb2YgMSBFU1AgaG9zdHMgZm91bmQsICVkIGFjdHVhbGx5IGluIHVzZS5cbiIsIGVzcHNfaW5fdXNlKTsKLQkJZXNwc19ydW5uaW5nID0gIGVzcHNfaW5fdXNlOwotCX0KLQlyZXR1cm4gZXNwc19pbl91c2U7Ci19Ci0KLSNlbHNlIC8qICFDT05GSUdfU1VONCAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBlc3BfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzOwotCXN0cnVjdCBzYnVzX2RldiAqZXNwX2RldiwgKnNiZGV2X2l0ZXI7Ci0JaW50IG5lc3BzID0gMCwgZXNwc19pbl91c2UgPSAwOwotCi0JZXNwY2hhaW4gPSAwOwotCWlmICghc2J1c19yb290KSB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCQlyZXR1cm4gMDsKLSNlbHNlCi0JCXBhbmljKCJObyBTQlVTIGluIGVzcF9kZXRlY3QoKSIpOwotI2VuZGlmCi0JfQotCWZvcl9lYWNoX3NidXMoc2J1cykgewotCQlmb3JfZWFjaF9zYnVzZGV2KHNiZGV2X2l0ZXIsIHNidXMpIHsKLQkJCXN0cnVjdCBzYnVzX2RldiAqZXNwZG1hID0gTlVMTDsKLQkJCWludCBobWUgPSAwOwotCi0JCQkvKiBJcyBpdCBhbiBlc3Agc2J1cyBkZXZpY2U/ICovCi0JCQllc3BfZGV2ID0gc2JkZXZfaXRlcjsKLQkJCWlmIChzdHJjbXAoZXNwX2Rldi0+cHJvbV9uYW1lLCAiZXNwIikgJiYKLQkJCSAgICBzdHJjbXAoZXNwX2Rldi0+cHJvbV9uYW1lLCAiU1VOVyxlc3AiKSkgewotCQkJCWlmICghc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgIlNVTlcsZmFzIikpIHsKLQkJCQkJaG1lID0gMTsKLQkJCQkJZXNwZG1hID0gZXNwX2RldjsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWVzcF9kZXYtPmNoaWxkIHx8Ci0JCQkJCSAgICAoc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgImVzcGRtYSIpICYmCi0JCQkJCSAgICAgc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgImRtYSIpKSkKLQkJCQkJCWNvbnRpbnVlOyAvKiBub3BlLi4uICovCi0JCQkJCWVzcGRtYSA9IGVzcF9kZXY7Ci0JCQkJCWVzcF9kZXYgPSBlc3BfZGV2LT5jaGlsZDsKLQkJCQkJaWYgKHN0cmNtcChlc3BfZGV2LT5wcm9tX25hbWUsICJlc3AiKSAmJgotCQkJCQkgICAgc3RyY21wKGVzcF9kZXYtPnByb21fbmFtZSwgIlNVTlcsZXNwIikpCi0JCQkJCQljb250aW51ZTsgLyogaG93IGNhbiB0aGlzIGhhcHBlbj8gKi8KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmIChkZXRlY3Rfb25lX2VzcCh0cG50LCBlc3BfZGV2LCBlc3BkbWEsIHNidXMsIG5lc3BzKyssIGhtZSkgPCAwKQotCQkJCWNvbnRpbnVlOwotCQkJCQotCQkJZXNwc19pbl91c2UrKzsKLQkJfSAvKiBmb3IgZWFjaCBzYnVzZGV2ICovCi0JfSAvKiBmb3IgZWFjaCBzYnVzICovCi0JcHJpbnRrKCJFU1A6IFRvdGFsIG9mICVkIEVTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwgbmVzcHMsCi0JICAgICAgIGVzcHNfaW5fdXNlKTsKLQllc3BzX3J1bm5pbmcgPSBlc3BzX2luX3VzZTsKLQlyZXR1cm4gZXNwc19pbl91c2U7Ci19Ci0KLSNlbmRpZiAvKiAhQ09ORklHX1NVTjQgKi8KLQotLyoKLSAqLwotc3RhdGljIGludCBlc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQotewotCXN0cnVjdCBlc3AgKmVzcCA9IChzdHJ1Y3QgZXNwICopIGhvc3QtPmhvc3RkYXRhOworCXNjc2lfcmVtb3ZlX2hvc3QoZXNwLT5laG9zdCk7CiAKIAlFU1BfSU5UU09GRihlc3AtPmRyZWdzKTsKICNpZiAwCkBAIC0xMjMyLDE2ICsxMTI2LDc5IEBACiAJZXNwX3Jlc2V0X2VzcChlc3ApOwogI2VuZGlmCiAKLQlmcmVlX2lycShlc3AtPmVob3N0LT5pcnEsIGVzcCk7CisJZnJlZV9pcnEoaXJxLCBlc3ApOwogCXNidXNfZnJlZV9jb25zaXN0ZW50KGVzcC0+c2RldiwgMTYsCiAJCQkgICAgICh2b2lkICopIGVzcC0+ZXNwX2NvbW1hbmQsIGVzcC0+ZXNwX2NvbW1hbmRfZHZtYSk7CiAJc2J1c19pb3VubWFwKGVzcC0+ZXJlZ3MsIEVTUF9SRUdfU0laRSk7CiAJZXNwLT5kbWEtPmFsbG9jYXRlZCA9IDA7Ci0JZXNwX2NoYWluX2RlbChlc3ApOwogCi0gICAgICAgIHJldHVybiAwOworCXNjc2lfaG9zdF9wdXQoZXNwLT5laG9zdCk7CisKKwlyZXR1cm4gMDsKIH0KIAorCisjaWZkZWYgQ09ORklHX1NVTjQKKworI2luY2x1ZGUgPGFzbS9zdW40cGFkZHIuaD4KKworc3RhdGljIHN0cnVjdCBzYnVzX2RldiBzdW40X2VzcF9kZXY7CisKK3N0YXRpYyBpbnQgX19pbml0IGVzcF9zdW40X3Byb2JlKHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCit7CisJaWYgKHN1bjRfZXNwX3BoeXNhZGRyKSB7CisJCW1lbXNldCgmc3VuNF9lc3BfZGV2LCAwLCBzaXplb2YoZXNwX2RldikpOworCQlzdW40X2VzcF9kZXYucmVnX2FkZHJzWzBdLnBoeXNfYWRkciA9IHN1bjRfZXNwX3BoeXNhZGRyOworCQlzdW40X2VzcF9kZXYuaXJxc1swXSA9IDQ7CisJCXN1bjRfZXNwX2Rldi5yZXNvdXJjZVswXS5zdGFydCA9IHN1bjRfZXNwX3BoeXNhZGRyOworCQlzdW40X2VzcF9kZXYucmVzb3VyY2VbMF0uZW5kID0KKwkJCXN1bjRfZXNwX3BoeXNhZGRyICsgRVNQX1JFR19TSVpFIC0gMTsKKwkJc3VuNF9lc3BfZGV2LnJlc291cmNlWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JTzsKKworCQlyZXR1cm4gZGV0ZWN0X29uZV9lc3AodHBudCwgTlVMTCwKKwkJCQkgICAgICAmc3VuNF9lc3BfZGV2LCBOVUxMLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGVzcF9zdW40X3JlbW92ZSh2b2lkKQoreworCXN0cnVjdCBlc3AgKmVzcCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJcmV0dXJuIGVzcF9yZW1vdmVfY29tbW9uKGVzcCk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfU1VONCAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlc3Bfc2J1c19wcm9iZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQoreworCXN0cnVjdCBzYnVzX2RldiAqc2RldiA9IHRvX3NidXNfZGV2aWNlKCZkZXYtPmRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpkcCA9IGRldi0+bm9kZTsKKwlzdHJ1Y3Qgc2J1c19kZXYgKmRtYV9zZGV2ID0gTlVMTDsKKwlpbnQgaG1lID0gMDsKKworCWlmIChkcC0+cGFyZW50ICYmCisJICAgICghc3RyY21wKGRwLT5wYXJlbnQtPm5hbWUsICJlc3BkbWEiKSB8fAorCSAgICAgIXN0cmNtcChkcC0+cGFyZW50LT5uYW1lLCAiZG1hIikpKQorCQlkbWFfc2RldiA9IHNkZXYtPnBhcmVudDsKKwllbHNlIGlmICghc3RyY21wKGRwLT5uYW1lLCAiU1VOVyxmYXMiKSkgeworCQlkbWFfc2RldiA9IHNkZXY7CisJCWhtZSA9IDE7CisJfQorCisJcmV0dXJuIGRldGVjdF9vbmVfZXNwKG1hdGNoLT5kYXRhLCAmZGV2LT5kZXYsCisJCQkgICAgICBzZGV2LCBkbWFfc2Rldiwgc2Rldi0+YnVzLCBobWUpOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBlc3Bfc2J1c19yZW1vdmUoc3RydWN0IG9mX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBlc3AgKmVzcCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJcmV0dXJuIGVzcF9yZW1vdmVfY29tbW9uKGVzcCk7Cit9CisKKyNlbmRpZiAvKiAhQ09ORklHX1NVTjQgKi8KKwogLyogVGhlIGluZm8gZnVuY3Rpb24gd2lsbCByZXR1cm4gd2hhdGV2ZXIgdXNlZnVsCiAgKiBpbmZvcm1hdGlvbiB0aGUgZGV2ZWxvcGVyIHNlZXMgZml0LiAgSWYgbm90IHByb3ZpZGVkLCB0aGVuCiAgKiB0aGUgbmFtZSBmaWVsZCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KQEAgLTE0MTUsMTggKzEzNzIsMTEgQEAKIHN0YXRpYyBpbnQgZXNwX3Byb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAogCQkJIGludCBsZW5ndGgsIGludCBpbm91dCkKIHsKLQlzdHJ1Y3QgZXNwICplc3A7CisJc3RydWN0IGVzcCAqZXNwID0gKHN0cnVjdCBlc3AgKikgaG9zdC0+aG9zdGRhdGE7CiAKIAlpZiAoaW5vdXQpCiAJCXJldHVybiAtRUlOVkFMOyAvKiBub3QgeWV0ICovCiAKLQlmb3JfZWFjaF9lc3AoZXNwKSB7Ci0JCWlmIChlc3AtPmVob3N0ID09IGhvc3QpCi0JCQlicmVhazsKLQl9Ci0JaWYgKCFlc3ApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKHN0YXJ0KQogCQkqc3RhcnQgPSBidWZmZXI7CiAKQEAgLTQzNzcsMTUgKzQzMjcsMTIgQEAKIAlTRHB0ci0+aG9zdGRhdGEgPSBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLnByb2NfbmFtZQkJPSAiZXNwIiwKLQkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCi0JLm5hbWUJCQk9ICJTdW4gRVNQIDEwMC8xMDBhLzIwMCIsCi0JLmRldGVjdAkJCT0gZXNwX2RldGVjdCwKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIGVzcF90ZW1wbGF0ZSA9IHsKKwkubW9kdWxlCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gImVzcCIsCisJLmluZm8JCQk9IGVzcF9pbmZvLAogCS5zbGF2ZV9hbGxvYwkJPSBlc3Bfc2xhdmVfYWxsb2MsCiAJLnNsYXZlX2Rlc3Ryb3kJCT0gZXNwX3NsYXZlX2Rlc3Ryb3ksCi0JLnJlbGVhc2UJCT0gZXNwX3JlbGVhc2UsCi0JLmluZm8JCQk9IGVzcF9pbmZvLAogCS5xdWV1ZWNvbW1hbmQJCT0gZXNwX3F1ZXVlLAogCS5laF9hYm9ydF9oYW5kbGVyCT0gZXNwX2Fib3J0LAogCS5laF9idXNfcmVzZXRfaGFuZGxlcgk9IGVzcF9yZXNldCwKQEAgLTQzOTQsMTIgKzQzNDEsNTggQEAKIAkuc2dfdGFibGVzaXplCQk9IFNHX0FMTCwKIAkuY21kX3Blcl9sdW4JCT0gMSwKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCisJLnByb2NfbmFtZQkJPSAiZXNwIiwKKwkucHJvY19pbmZvCQk9IGVzcF9wcm9jX2luZm8sCiB9OwogCi0jaW5jbHVkZSAic2NzaV9tb2R1bGUuYyIKKyNpZm5kZWYgQ09ORklHX1NVTjQKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVzcF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiU1VOVyxlc3AiLAorCQkuZGF0YSA9ICZlc3BfdGVtcGxhdGUsCisJfSwKKwl7CisJCS5uYW1lID0gIlNVTlcsZmFzIiwKKwkJLmRhdGEgPSAmZXNwX3RlbXBsYXRlLAorCX0sCisJeworCQkubmFtZSA9ICJlc3AiLAorCQkuZGF0YSA9ICZlc3BfdGVtcGxhdGUsCisJfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBlc3BfbWF0Y2gpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIkVuaGFuY2VkU2NzaVByb2Nlc3NvciBTdW4gU0NTSSBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIkRhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkiKTsKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIGVzcF9zYnVzX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZXNwIiwKKwkubWF0Y2hfdGFibGUJPSBlc3BfbWF0Y2gsCisJLnByb2JlCQk9IGVzcF9zYnVzX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXNwX3NidXNfcmVtb3ZlKSwKK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgZXNwX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU1VONAorCXJldHVybiBlc3Bfc3VuNF9wcm9iZSgmZXNwX3RlbXBsYXRlKTsKKyNlbHNlCisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmZXNwX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVzcF9leGl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NVTjQKKwllc3Bfc3VuNF9yZW1vdmUoKTsKKyNlbHNlCisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJmVzcF9zYnVzX2RyaXZlcik7CisjZW5kaWYKK30KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1AgU3VuIFNDU0kgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGRhdmVtbG9mdC5uZXQpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CiAKK21vZHVsZV9pbml0KGVzcF9pbml0KTsKK21vZHVsZV9leGl0KGVzcF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9lc3AuaCBiL2RyaXZlcnMvc2NzaS9lc3AuaAppbmRleCA3M2Y3ZDY5Li5hOThjZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZXNwLmgKKysrIGIvZHJpdmVycy9zY3NpL2VzcC5oCkBAIC00MDMsOCArNDAzLDQgQEAKICNkZWZpbmUgRVNQX01IWl9UT19DWUNMRShtaGVydHopICAoKDEwMDAwMDAwMDApIC8gKChtaGVydHopIC8gMTAwMCkpCiAjZGVmaW5lIEVTUF9USUNLKGNjZiwgY3ljbGUpICAoKDc2ODIgKiAoY2NmKSAqIChjeWNsZSkgLyAxMDAwKSkKIAotLyogRm9yIG91ciBpbnRlcnJ1cHQgZW5naW5lLiAqLwotI2RlZmluZSBmb3JfZWFjaF9lc3AoZXNwKSBcCi0gICAgICAgIGZvcigoZXNwKSA9IGVzcGNoYWluOyAoZXNwKTsgKGVzcCkgPSAoZXNwKS0+bmV4dCkKLQogI2VuZGlmIC8qICEoX1NQQVJDX0VTUF9IKSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2libW1jYS5jIGIvZHJpdmVycy9zY3NpL2libW1jYS5jCmluZGV4IDBjNmRjMzEuLjExNWY1NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pYm1tY2EuYworKysgYi9kcml2ZXJzL3Njc2kvaWJtbWNhLmMKQEAgLTIyNDEsOCArMjI0MSw3IEBACiAJaW50IGhvc3RfaW5kZXg7CiAJdW5zaWduZWQgbG9uZyBpbW1fY29tbWFuZDsKIAotCWlmIChjbWQgPT0gTlVMTCkKLQkJQlVHKCk7CisJQlVHX09OKGNtZCA9PSBOVUxMKTsKIAogCXRpY2tzID0gSU1fUkVTRVRfREVMQVkgKiBIWjsKIAlzaHBudCA9IGNtZC0+ZGV2aWNlLT5ob3N0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lkZS1zY3NpLmMgYi9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwppbmRleCAzOWI3NjBhLi45ODhlNmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYworKysgYi9kcml2ZXJzL3Njc2kvaWRlLXNjc2kuYwpAQCAtNjAwLDggKzYwMCw3IEBACiAJCQkJImlzc3VpbmcgYSBwYWNrZXQgY29tbWFuZFxuIik7CiAJCXJldHVybiBpZGVfZG9fcmVzZXQgKGRyaXZlKTsKIAl9Ci0JaWYgKEhXR1JPVVAoZHJpdmUpLT5oYW5kbGVyICE9IE5VTEwpCi0JCUJVRygpOworCUJVR19PTihIV0dST1VQKGRyaXZlKS0+aGFuZGxlciAhPSBOVUxMKTsKIAkvKiBTZXQgdGhlIGludGVycnVwdCByb3V0aW5lICovCiAJaWRlX3NldF9oYW5kbGVyKGRyaXZlLCAmaWRlc2NzaV9wY19pbnRyLCBnZXRfdGltZW91dChwYyksIGlkZXNjc2lfZXhwaXJ5KTsKIAkvKiBTZW5kIHRoZSBhY3R1YWwgcGFja2V0ICovCkBAIC02OTEsOCArNjkwLDcgQEAKIAkJc2V0X2JpdChQQ19ETUFfT0ssICZwYy0+ZmxhZ3MpOwogCiAJaWYgKHRlc3RfYml0KElERVNDU0lfRFJRX0lOVEVSUlVQVCwgJnNjc2ktPmZsYWdzKSkgewotCQlpZiAoSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCkKLQkJCUJVRygpOworCQlCVUdfT04oSFdHUk9VUChkcml2ZSktPmhhbmRsZXIgIT0gTlVMTCk7CiAJCWlkZV9zZXRfaGFuZGxlcihkcml2ZSwgJmlkZXNjc2lfdHJhbnNmZXJfcGMsCiAJCQkJZ2V0X3RpbWVvdXQocGMpLCBpZGVzY3NpX2V4cGlyeSk7CiAJCS8qIElzc3VlIHRoZSBwYWNrZXQgY29tbWFuZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1ibWRtYS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1ibWRtYS5jCmluZGV4IDgzNWRmZjAuLjAwNGUxYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9saWJhdGEtYm1kbWEuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWJtZG1hLmMKQEAgLTY1Miw2ICs2NTIsMTUxIEBACiAJYXRhX2FsdHN0YXR1cyhhcCk7ICAgICAgICAvKiBkdW1teSByZWFkICovCiB9CiAKKy8qKgorICoJYXRhX2JtZG1hX2ZyZWV6ZSAtIEZyZWV6ZSBCTURNQSBjb250cm9sbGVyIHBvcnQKKyAqCUBhcDogcG9ydCB0byBmcmVlemUKKyAqCisgKglGcmVlemUgQk1ETUEgY29udHJvbGxlciBwb3J0LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KK3ZvaWQgYXRhX2JtZG1hX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfaW9wb3J0cyAqaW9hZGRyID0gJmFwLT5pb2FkZHI7CisKKwlhcC0+Y3RsIHw9IEFUQV9OSUVOOworCWFwLT5sYXN0X2N0bCA9IGFwLT5jdGw7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTU1JTykKKwkJd3JpdGViKGFwLT5jdGwsICh2b2lkIF9faW9tZW0gKilpb2FkZHItPmN0bF9hZGRyKTsKKwllbHNlCisJCW91dGIoYXAtPmN0bCwgaW9hZGRyLT5jdGxfYWRkcik7Cit9CisKKy8qKgorICoJYXRhX2JtZG1hX3RoYXcgLSBUaGF3IEJNRE1BIGNvbnRyb2xsZXIgcG9ydAorICoJQGFwOiBwb3J0IHRvIHRoYXcKKyAqCisgKglUaGF3IEJNRE1BIGNvbnRyb2xsZXIgcG9ydC4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCit2b2lkIGF0YV9ibWRtYV90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJLyogY2xlYXIgJiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworCWF0YV9jaGtfc3RhdHVzKGFwKTsKKwlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOworCWlmIChhcC0+aW9hZGRyLmN0bF9hZGRyKQkvKiBGSVhNRTogaGFjay4gY3JlYXRlIGEgaG9vayBpbnN0ZWFkICovCisJCWF0YV9pcnFfb24oYXApOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9kcml2ZV9laCAtIFBlcmZvcm0gRUggd2l0aCBnaXZlbiBtZXRob2RzIGZvciBCTURNQSBjb250cm9sbGVyCisgKglAYXA6IHBvcnQgdG8gaGFuZGxlIGVycm9yIGZvcgorICoJQHByZXJlc2V0OiBwcmVyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQorICoJQHNvZnRyZXNldDogc29mdHJlc2V0IG1ldGhvZCAoY2FuIGJlIE5VTEwpCisgKglAaGFyZHJlc2V0OiBoYXJkcmVzZXQgbWV0aG9kIChjYW4gYmUgTlVMTCkKKyAqCUBwb3N0cmVzZXQ6IHBvc3RyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQorICoKKyAqCUhhbmRsZSBlcnJvciBmb3IgQVRBIEJNRE1BIGNvbnRyb2xsZXIuICBJdCBjYW4gaGFuZGxlIGJvdGgKKyAqCVBBVEEgYW5kIFNBVEEgY29udHJvbGxlcnMuICBNYW55IGNvbnRyb2xsZXJzIHNob3VsZCBiZSBhYmxlIHRvCisgKgl1c2UgdGhpcyBFSCBhcy1pcyBvciB3aXRoIHNvbWUgYWRkZWQgaGFuZGxpbmcgYmVmb3JlIGFuZAorICoJYWZ0ZXIuCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBjb25zdHJ1Y3RpbmcKKyAqCS0+ZXJyb3JfaGFuZGxlciBjYWxsYmFjayBieSBsb3cgbGV2ZWwgZHJpdmVycy4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCisgKi8KK3ZvaWQgYXRhX2JtZG1hX2RyaXZlX2VoKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGF0YV9wcmVyZXNldF9mbl90IHByZXJlc2V0LAorCQkJYXRhX3Jlc2V0X2ZuX3Qgc29mdHJlc2V0LCBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQsCisJCQlhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0KQoreworCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OworCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGhhdyA9IDA7CisKKwlxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJaWYgKHFjICYmICEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKQorCQlxYyA9IE5VTEw7CisKKwkvKiByZXNldCBQSU8gSFNNIGFuZCBzdG9wIERNQSBlbmdpbmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7CisKKwlpZiAocWMgJiYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgfHwKKwkJICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkpIHsKKwkJdTggaG9zdF9zdGF0OworCisJCWhvc3Rfc3RhdCA9IGF0YV9ibWRtYV9zdGF0dXMoYXApOworCisJCWF0YV9laGlfcHVzaF9kZXNjKCZlaGMtPmksICJCTURNQSBzdGF0IDB4JXgiLCBob3N0X3N0YXQpOworCisJCS8qIEJNRE1BIGNvbnRyb2xsZXJzIGluZGljYXRlIGhvc3QgYnVzIGVycm9yIGJ5CisJCSAqIHNldHRpbmcgRE1BX0VSUiBiaXQgYW5kIHRpbWluZyBvdXQuICBBcyBpdCB3YXNuJ3QKKwkJICogcmVhbGx5IGEgdGltZW91dCBldmVudCwgYWRqdXN0IGVycm9yIG1hc2sgYW5kCisJCSAqIGNhbmNlbCBmcm96ZW4gc3RhdGUuCisJCSAqLworCQlpZiAocWMtPmVycl9tYXNrID09IEFDX0VSUl9USU1FT1VUICYmIGhvc3Rfc3RhdCAmIEFUQV9ETUFfRVJSKSB7CisJCQlxYy0+ZXJyX21hc2sgPSBBQ19FUlJfSE9TVF9CVVM7CisJCQl0aGF3ID0gMTsKKwkJfQorCisJCWFwLT5vcHMtPmJtZG1hX3N0b3AocWMpOworCX0KKworCWF0YV9hbHRzdGF0dXMoYXApOworCWF0YV9jaGtfc3RhdHVzKGFwKTsKKwlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHRoYXcpCisJCWF0YV9laF90aGF3X3BvcnQoYXApOworCisJLyogUElPIGFuZCBETUEgZW5naW5lcyBoYXZlIGJlZW4gc3RvcHBlZCwgcGVyZm9ybSByZWNvdmVyeSAqLworCWF0YV9kb19laChhcCwgcHJlcmVzZXQsIHNvZnRyZXNldCwgaGFyZHJlc2V0LCBwb3N0cmVzZXQpOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyIC0gU3RvY2sgZXJyb3IgaGFuZGxlciBmb3IgQk1ETUEgY29udHJvbGxlcgorICoJQGFwOiBwb3J0IHRvIGhhbmRsZSBlcnJvciBmb3IKKyAqCisgKglTdG9jayBlcnJvciBoYW5kbGVyIGZvciBCTURNQSBjb250cm9sbGVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkKKyAqLwordm9pZCBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWF0YV9yZXNldF9mbl90IGhhcmRyZXNldDsKKworCWhhcmRyZXNldCA9IE5VTEw7CisJaWYgKHNhdGFfc2NyX3ZhbGlkKGFwKSkKKwkJaGFyZHJlc2V0ID0gc2F0YV9zdGRfaGFyZHJlc2V0OworCisJYXRhX2JtZG1hX2RyaXZlX2VoKGFwLCBhdGFfc3RkX3ByZXJlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgaGFyZHJlc2V0LAorCQkJICAgYXRhX3N0ZF9wb3N0cmVzZXQpOworfQorCisvKioKKyAqCWF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCAtIFN0b2NrIHBvc3RfaW50ZXJuYWxfY21kIGZvcgorICoJCQkJICAgICAgQk1ETUEgY29udHJvbGxlcgorICoJQHFjOiBpbnRlcm5hbCBjb21tYW5kIHRvIGNsZWFuIHVwCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQorICovCit2b2lkIGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCWF0YV9ibWRtYV9zdG9wKHFjKTsKK30KKwogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqCiBhdGFfcHJvYmVfZW50X2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGF0YV9wb3J0X2luZm8gKnBvcnQpCkBAIC05MzAsMTAgKzEwNzUsMjEgQEAKIAogCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gKi8KIAlpZiAobGVnYWN5X21vZGUpIHsKLQkJaWYgKGxlZ2FjeV9tb2RlICYgKDEgPDwgMCkpCisJCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gTlVMTDsKKworCQlpZiAobGVnYWN5X21vZGUgJiAoMSA8PCAwKSkgewogCQkJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKLQkJaWYgKGxlZ2FjeV9tb2RlICYgKDEgPDwgMSkpCisJCQlob3N0X3NldCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQl9CisKKwkJaWYgKGxlZ2FjeV9tb2RlICYgKDEgPDwgMSkpIHsKIAkJCWF0YV9kZXZpY2VfYWRkKHByb2JlX2VudDIpOworCQkJaWYgKGhvc3Rfc2V0KSB7CisJCQkJaG9zdF9zZXQtPm5leHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwkJCQlkZXZfc2V0X2RydmRhdGEoZGV2LCBob3N0X3NldCk7CisJCQl9CisJCX0KIAl9IGVsc2UKIAkJYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwppbmRleCBkZTliYTc4Li42YzY2ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvbGliYXRhLWNvcmUuYwpAQCAtNjEsMjIgKzYxLDI5IEBACiAKICNpbmNsdWRlICJsaWJhdGEuaCIKIAotc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZGV2X2luaXRfcGFyYW1zKHN0cnVjdCBhdGFfcG9ydCAqYXAsCi0JCQkJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCi0JCQkJCXUxNiBoZWFkcywKLQkJCQkJdTE2IHNlY3RvcnMpOwotc3RhdGljIHZvaWQgYXRhX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZGV2X3NldF94ZmVybW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCQkgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBhdGFfZGV2X3hmZXJtYXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOworLyogZGVib3VuY2UgdGltaW5nIHBhcmFtZXRlcnMgaW4gbXNlY3MgeyBpbnRlcnZhbCwgZHVyYXRpb24sIHRpbWVvdXQgfSAqLworY29uc3QgdW5zaWduZWQgbG9uZyBzYXRhX2RlYl90aW1pbmdfYm9vdFtdCQk9IHsgICA1LCAgMTAwLCAyMDAwIH07Citjb25zdCB1bnNpZ25lZCBsb25nIHNhdGFfZGViX3RpbWluZ19laFtdCQk9IHsgIDI1LCAgNTAwLCAyMDAwIH07Citjb25zdCB1bnNpZ25lZCBsb25nIHNhdGFfZGViX3RpbWluZ19iZWZvcmVfZnNyc3RbXQk9IHsgMTAwLCAyMDAwLCA1MDAwIH07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2Rldl9pbml0X3BhcmFtcyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCQl1MTYgaGVhZHMsIHUxNiBzZWN0b3JzKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2Rldl9zZXRfeGZlcm1vZGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitzdGF0aWMgdm9pZCBhdGFfZGV2X3hmZXJtYXNrKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGF0YV91bmlxdWVfaWQgPSAxOwogc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphdGFfd3E7CiAKK3N0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphdGFfYXV4X3dxOworCiBpbnQgYXRhcGlfZW5hYmxlZCA9IDE7CiBtb2R1bGVfcGFyYW0oYXRhcGlfZW5hYmxlZCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYXRhcGlfZW5hYmxlZCwgIkVuYWJsZSBkaXNjb3Zlcnkgb2YgQVRBUEkgZGV2aWNlcyAoMD1vZmYsIDE9b24pIik7CiAKK2ludCBhdGFwaV9kbWFkaXIgPSAwOworbW9kdWxlX3BhcmFtKGF0YXBpX2RtYWRpciwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXRhcGlfZG1hZGlyLCAiRW5hYmxlIEFUQVBJIERNQURJUiBicmlkZ2Ugc3VwcG9ydCAoMD1vZmYsIDE9b24pIik7CisKIGludCBsaWJhdGFfZnVhID0gMDsKIG1vZHVsZV9wYXJhbV9uYW1lZChmdWEsIGxpYmF0YV9mdWEsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZ1YSwgIkZVQSBzdXBwb3J0ICgwPW9mZiwgMT1vbikiKTsKQEAgLTM5NywxMSArNDA0LDIyIEBACiAJcmV0dXJuICI8bi9hPiI7CiB9CiAKLXN0YXRpYyB2b2lkIGF0YV9kZXZfZGlzYWJsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQorc3RhdGljIGNvbnN0IGNoYXIgKnNhdGFfc3BkX3N0cmluZyh1bnNpZ25lZCBpbnQgc3BkKQogewotCWlmIChhdGFfZGV2X3ByZXNlbnQoZGV2KSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogZGV2ICV1IGRpc2FibGVkXG4iLAotCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwZF9zdHJbXSA9IHsKKwkJIjEuNSBHYnBzIiwKKwkJIjMuMCBHYnBzIiwKKwl9OworCisJaWYgKHNwZCA9PSAwIHx8IChzcGQgLSAxKSA+PSBBUlJBWV9TSVpFKHNwZF9zdHIpKQorCQlyZXR1cm4gIjx1bmtub3duPiI7CisJcmV0dXJuIHNwZF9zdHJbc3BkIC0gMV07Cit9CisKK3ZvaWQgYXRhX2Rldl9kaXNhYmxlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJaWYgKGF0YV9kZXZfZW5hYmxlZChkZXYpICYmIGF0YV9tc2dfZHJ2KGRldi0+YXApKSB7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAiZGlzYWJsZWRcbiIpOwogCQlkZXYtPmNsYXNzKys7CiAJfQogfQpAQCAtNzU5LDggKzc3NywxMSBAQAogdm9pZCBhdGFfZGV2X3NlbGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogCQkJICAgdW5zaWduZWQgaW50IHdhaXQsIHVuc2lnbmVkIGludCBjYW5fc2xlZXApCiB7Ci0JVlBSSU5USygiRU5URVIsIGF0YSV1OiBkZXZpY2UgJXUsIHdhaXQgJXVcbiIsCi0JCWFwLT5pZCwgZGV2aWNlLCB3YWl0KTsKKwlpZiAoYXRhX21zZ19wcm9iZShhcCkpIHsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJhdGFfZGV2X3NlbGVjdDogRU5URVIsIGF0YSV1OiAiCisJCQkJImRldmljZSAldSwgd2FpdCAldVxuIiwKKwkJCQlhcC0+aWQsIGRldmljZSwgd2FpdCk7CisJfQogCiAJaWYgKHdhaXQpCiAJCWF0YV93YWl0X2lkbGUoYXApOwpAQCAtOTE1LDkgKzkzNiw5IEBACiAKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfRkxVU0hfUE9SVF9UQVNLOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIAogCURQUklOVEsoImZsdXNoICMxXG4iKTsKIAlmbHVzaF93b3JrcXVldWUoYXRhX3dxKTsKQEAgLTkyOCwzMCArOTQ5LDMxIEBACiAJICogQ2FuY2VsIGFuZCBmbHVzaC4KIAkgKi8KIAlpZiAoIWNhbmNlbF9kZWxheWVkX3dvcmsoJmFwLT5wb3J0X3Rhc2spKSB7Ci0JCURQUklOVEsoImZsdXNoICMyXG4iKTsKKwkJaWYgKGF0YV9tc2dfY3RsKGFwKSkKKwkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9ERUJVRywgIiVzOiBmbHVzaCAjMlxuIiwgX19GVU5DVElPTl9fKTsKIAkJZmx1c2hfd29ya3F1ZXVlKGF0YV93cSk7CiAJfQogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAJYXAtPmZsYWdzICY9IH5BVEFfRkxBR19GTFVTSF9QT1JUX1RBU0s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOwogCi0JRFBSSU5USygiRVhJVFxuIik7CisJaWYgKGF0YV9tc2dfY3RsKGFwKSkKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0RFQlVHLCAiJXM6IEVYSVRcbiIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKIHZvaWQgYXRhX3FjX2NvbXBsZXRlX2ludGVybmFsKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmcgPSBxYy0+cHJpdmF0ZV9kYXRhOwogCi0JcWMtPmFwLT5vcHMtPnRmX3JlYWQocWMtPmFwLCAmcWMtPnRmKTsKIAljb21wbGV0ZSh3YWl0aW5nKTsKIH0KIAogLyoqCiAgKglhdGFfZXhlY19pbnRlcm5hbCAtIGV4ZWN1dGUgbGliYXRhIGludGVybmFsIGNvbW1hbmQKLSAqCUBhcDogUG9ydCB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBzZW50CiAgKglAZGV2OiBEZXZpY2UgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgc2VudAogICoJQHRmOiBUYXNrZmlsZSByZWdpc3RlcnMgZm9yIHRoZSBjb21tYW5kIGFuZCB0aGUgcmVzdWx0CisgKglAY2RiOiBDREIgZm9yIHBhY2tldCBjb21tYW5kCiAgKglAZG1hX2RpcjogRGF0YSB0cmFuZmVyIGRpcmVjdGlvbiBvZiB0aGUgY29tbWFuZAogICoJQGJ1ZjogRGF0YSBidWZmZXIgb2YgdGhlIGNvbW1hbmQKICAqCUBidWZsZW46IExlbmd0aCBvZiBkYXRhIGJ1ZmZlcgpAQCAtOTY0LDI1ICs5ODYsNjYgQEAKICAqCiAgKglMT0NLSU5HOgogICoJTm9uZS4gIFNob3VsZCBiZSBjYWxsZWQgd2l0aCBrZXJuZWwgY29udGV4dCwgbWlnaHQgc2xlZXAuCisgKgorICoJUkVUVVJOUzoKKyAqCVplcm8gb24gc3VjY2VzcywgQUNfRVJSXyogbWFzayBvbiBmYWlsdXJlCiAgKi8KLQotc3RhdGljIHVuc2lnbmVkCi1hdGFfZXhlY19pbnRlcm5hbChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkgIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLAotCQkgIGludCBkbWFfZGlyLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pCit1bnNpZ25lZCBhdGFfZXhlY19pbnRlcm5hbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIGNvbnN0IHU4ICpjZGIsCisJCQkgICBpbnQgZG1hX2Rpciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCXU4IGNvbW1hbmQgPSB0Zi0+Y29tbWFuZDsKIAlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXVuc2lnbmVkIGludCB0YWcsIHByZWVtcHRlZF90YWc7CisJdTMyIHByZWVtcHRlZF9zYWN0aXZlLCBwcmVlbXB0ZWRfcWNfYWN0aXZlOwogCURFQ0xBUkVfQ09NUExFVElPTih3YWl0KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCBlcnJfbWFzazsKKwlpbnQgcmM7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKIAotCXFjID0gYXRhX3FjX25ld19pbml0KGFwLCBkZXYpOwotCUJVR19PTihxYyA9PSBOVUxMKTsKKwkvKiBubyBpbnRlcm5hbCBjb21tYW5kIHdoaWxlIGZyb3plbiAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19GUk9aRU4pIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gQUNfRVJSX1NZU1RFTTsKKwl9CiAKKwkvKiBpbml0aWFsaXplIGludGVybmFsIHFjICovCisKKwkvKiBYWFg6IFRhZyAwIGlzIHVzZWQgZm9yIGRyaXZlcnMgd2l0aCBsZWdhY3kgRUggYXMgc29tZQorCSAqIGRyaXZlcnMgY2hva2UgaWYgYW55IG90aGVyIHRhZyBpcyBnaXZlbi4gIFRoaXMgYnJlYWtzCisJICogYXRhX3RhZ19pbnRlcm5hbCgpIHRlc3QgZm9yIHRob3NlIGRyaXZlcnMuICBEb24ndCB1c2UgbmV3CisJICogRUggc3R1ZmYgd2l0aG91dCBjb252ZXJ0aW5nIHRvIGl0LgorCSAqLworCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQorCQl0YWcgPSBBVEFfVEFHX0lOVEVSTkFMOworCWVsc2UKKwkJdGFnID0gMDsKKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHRhZywgJmFwLT5xY19hbGxvY2F0ZWQpKQorCQlCVUcoKTsKKwlxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCisJcWMtPnRhZyA9IHRhZzsKKwlxYy0+c2NzaWNtZCA9IE5VTEw7CisJcWMtPmFwID0gYXA7CisJcWMtPmRldiA9IGRldjsKKwlhdGFfcWNfcmVpbml0KHFjKTsKKworCXByZWVtcHRlZF90YWcgPSBhcC0+YWN0aXZlX3RhZzsKKwlwcmVlbXB0ZWRfc2FjdGl2ZSA9IGFwLT5zYWN0aXZlOworCXByZWVtcHRlZF9xY19hY3RpdmUgPSBhcC0+cWNfYWN0aXZlOworCWFwLT5hY3RpdmVfdGFnID0gQVRBX1RBR19QT0lTT047CisJYXAtPnNhY3RpdmUgPSAwOworCWFwLT5xY19hY3RpdmUgPSAwOworCisJLyogcHJlcGFyZSAmIGlzc3VlIHFjICovCiAJcWMtPnRmID0gKnRmOworCWlmIChjZGIpCisJCW1lbWNweShxYy0+Y2RiLCBjZGIsIEFUQVBJX0NEQl9MRU4pOworCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX1JFU1VMVF9URjsKIAlxYy0+ZG1hX2RpciA9IGRtYV9kaXI7CiAJaWYgKGRtYV9kaXIgIT0gRE1BX05PTkUpIHsKIAkJYXRhX3NnX2luaXRfb25lKHFjLCBidWYsIGJ1Zmxlbik7CkBAIC05OTQsMzMgKzEwNTcsNTggQEAKIAogCWF0YV9xY19pc3N1ZShxYyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2FpdCwgQVRBX1RNT1VUX0lOVEVSTkFMKSkgewotCQlhdGFfcG9ydF9mbHVzaF90YXNrKGFwKTsKKwlyYyA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd2FpdCwgQVRBX1RNT1VUX0lOVEVSTkFMKTsKIAotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJYXRhX3BvcnRfZmx1c2hfdGFzayhhcCk7CisKKwlpZiAoIXJjKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CiAKIAkJLyogV2UncmUgcmFjaW5nIHdpdGggaXJxIGhlcmUuICBJZiB3ZSBsb3NlLCB0aGUKIAkJICogZm9sbG93aW5nIHRlc3QgcHJldmVudHMgdXMgZnJvbSBjb21wbGV0aW5nIHRoZSBxYwotCQkgKiBhZ2Fpbi4gIElmIGNvbXBsZXRpb24gaXJxIG9jY3VycyBhZnRlciBoZXJlIGJ1dAotCQkgKiBiZWZvcmUgdGhlIGNhbGxlciBjbGVhbnMgdXAsIGl0IHdpbGwgcmVzdWx0IGluIGEKLQkJICogc3B1cmlvdXMgaW50ZXJydXB0LiAgV2UgY2FuIGxpdmUgd2l0aCB0aGF0LgorCQkgKiB0d2ljZS4gIElmIHdlIHdpbiwgdGhlIHBvcnQgaXMgZnJvemVuIGFuZCB3aWxsIGJlCisJCSAqIGNsZWFuZWQgdXAgYnkgLT5wb3N0X2ludGVybmFsX2NtZCgpLgogCQkgKi8KIAkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKSB7Ci0JCQlxYy0+ZXJyX21hc2sgPSBBQ19FUlJfVElNRU9VVDsKLQkJCWF0YV9xY19jb21wbGV0ZShxYyk7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogcWMgdGltZW91dCAoY21kIDB4JXgpXG4iLAotCQkJICAgICAgIGFwLT5pZCwgY29tbWFuZCk7CisJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX1RJTUVPVVQ7CisKKwkJCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQorCQkJCWF0YV9wb3J0X2ZyZWV6ZShhcCk7CisJCQllbHNlCisJCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKworCQkJaWYgKGF0YV9tc2dfd2FybihhcCkpCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJICAgICAgICJxYyB0aW1lb3V0IChjbWQgMHgleClcbiIsIGNvbW1hbmQpOwogCQl9CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKIAl9CiAKLQkqdGYgPSBxYy0+dGY7CisJLyogZG8gcG9zdF9pbnRlcm5hbF9jbWQgKi8KKwlpZiAoYXAtPm9wcy0+cG9zdF9pbnRlcm5hbF9jbWQpCisJCWFwLT5vcHMtPnBvc3RfaW50ZXJuYWxfY21kKHFjKTsKKworCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCAmJiAhcWMtPmVycl9tYXNrKSB7CisJCWlmIChhdGFfbXNnX3dhcm4oYXApKQorCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsIAorCQkJCSJ6ZXJvIGVycl9tYXNrIGZvciBmYWlsZWQgIgorCQkJICAgICAgICJpbnRlcm5hbCBjb21tYW5kLCBhc3N1bWluZyBBQ19FUlJfT1RIRVJcbiIpOworCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX09USEVSOworCX0KKworCS8qIGZpbmlzaCB1cCAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkqdGYgPSBxYy0+cmVzdWx0X3RmOwogCWVycl9tYXNrID0gcWMtPmVycl9tYXNrOwogCiAJYXRhX3FjX2ZyZWUocWMpOworCWFwLT5hY3RpdmVfdGFnID0gcHJlZW1wdGVkX3RhZzsKKwlhcC0+c2FjdGl2ZSA9IHByZWVtcHRlZF9zYWN0aXZlOworCWFwLT5xY19hY3RpdmUgPSBwcmVlbXB0ZWRfcWNfYWN0aXZlOwogCiAJLyogWFhYIC0gU29tZSBMTEREcyAoc2F0YV9tdikgZGlzYWJsZSBwb3J0IG9uIGNvbW1hbmQgZmFpbHVyZS4KIAkgKiBVbnRpbCB0aG9zZSBkcml2ZXJzIGFyZSBmaXhlZCwgd2UgZGV0ZWN0IHRoZSBjb25kaXRpb24KQEAgLTEwMzMsMTEgKzExMjEsMTMgQEAKIAkgKgogCSAqIEtpbGwgdGhlIGZvbGxvd2luZyBjb2RlIGFzIHNvb24gYXMgdGhvc2UgZHJpdmVycyBhcmUgZml4ZWQuCiAJICovCi0JaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpIHsKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpIHsKIAkJZXJyX21hc2sgfD0gQUNfRVJSX1NZU1RFTTsKIAkJYXRhX3BvcnRfcHJvYmUoYXApOwogCX0KIAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwogCXJldHVybiBlcnJfbWFzazsKIH0KIApAQCAtMTA3NiwxMSArMTE2NiwxMCBAQAogCiAvKioKICAqCWF0YV9kZXZfcmVhZF9pZCAtIFJlYWQgSUQgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlCi0gKglAYXA6IHBvcnQgb24gd2hpY2ggdGFyZ2V0IGRldmljZSByZXNpZGVzCiAgKglAZGV2OiB0YXJnZXQgZGV2aWNlCiAgKglAcF9jbGFzczogcG9pbnRlciB0byBjbGFzcyBvZiB0aGUgdGFyZ2V0IGRldmljZSAobWF5IGJlIGNoYW5nZWQpCiAgKglAcG9zdF9yZXNldDogaXMgdGhpcyByZWFkIElEIHBvc3QtcmVzZXQ/Ci0gKglAcF9pZDogcmVhZCBJREVOVElGWSBwYWdlIChuZXdseSBhbGxvY2F0ZWQpCisgKglAaWQ6IGJ1ZmZlciB0byByZWFkIElERU5USUZZIGRhdGEgaW50bwogICoKICAqCVJlYWQgSUQgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlLiAgQVRBX0NNRF9JRF9BVEEgaXMKICAqCXBlcmZvcm1lZCBvbiBBVEEgZGV2aWNlcyBhbmQgQVRBX0NNRF9JRF9BVEFQSSBvbiBBVEFQSQpAQCAtMTA5MywyOSArMTE4MiwyNCBAQAogICoJUkVUVVJOUzoKICAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KICAqLwotc3RhdGljIGludCBhdGFfZGV2X3JlYWRfaWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKLQkJCSAgIHVuc2lnbmVkIGludCAqcF9jbGFzcywgaW50IHBvc3RfcmVzZXQsIHUxNiAqKnBfaWQpCitpbnQgYXRhX2Rldl9yZWFkX2lkKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCAqcF9jbGFzcywKKwkJICAgIGludCBwb3N0X3Jlc2V0LCB1MTYgKmlkKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCXVuc2lnbmVkIGludCBjbGFzcyA9ICpwX2NsYXNzOwogCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CiAJdW5zaWduZWQgaW50IGVycl9tYXNrID0gMDsKLQl1MTYgKmlkOwogCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAlpbnQgcmM7CiAKLQlEUFJJTlRLKCJFTlRFUiwgaG9zdCAldSwgZGV2ICV1XG4iLCBhcC0+aWQsIGRldi0+ZGV2bm8pOworCWlmIChhdGFfbXNnX2N0bChhcCkpCisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUiwgaG9zdCAldSwgZGV2ICV1XG4iLCAKKwkJCQlfX0ZVTkNUSU9OX18sIGFwLT5pZCwgZGV2LT5kZXZubyk7CiAKIAlhdGFfZGV2X3NlbGVjdChhcCwgZGV2LT5kZXZubywgMSwgMSk7IC8qIHNlbGVjdCBkZXZpY2UgMC8xICovCiAKLQlpZCA9IGttYWxsb2Moc2l6ZW9mKGlkWzBdKSAqIEFUQV9JRF9XT1JEUywgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlkID09IE5VTEwpIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlyZWFzb24gPSAib3V0IG9mIG1lbW9yeSI7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KICByZXRyeToKLQlhdGFfdGZfaW5pdChhcCwgJnRmLCBkZXYtPmRldm5vKTsKKwlhdGFfdGZfaW5pdChkZXYsICZ0Zik7CiAKIAlzd2l0Y2ggKGNsYXNzKSB7CiAJY2FzZSBBVEFfREVWX0FUQToKQEAgLTExMzIsNyArMTIxNiw3IEBACiAKIAl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX1BJTzsKIAotCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoYXAsIGRldiwgJnRmLCBETUFfRlJPTV9ERVZJQ0UsCisJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX0ZST01fREVWSUNFLAogCQkJCSAgICAgaWQsIHNpemVvZihpZFswXSkgKiBBVEFfSURfV09SRFMpOwogCWlmIChlcnJfbWFzaykgewogCQlyYyA9IC1FSU87CkBAIC0xMTU5LDcgKzEyNDMsNyBAQAogCQkgKiBTb21lIGRyaXZlcyB3ZXJlIHZlcnkgc3BlY2lmaWMgYWJvdXQgdGhhdCBleGFjdCBzZXF1ZW5jZS4KIAkJICovCiAJCWlmIChhdGFfaWRfbWFqb3JfdmVyc2lvbihpZCkgPCA0IHx8ICFhdGFfaWRfaGFzX2xiYShpZCkpIHsKLQkJCWVycl9tYXNrID0gYXRhX2Rldl9pbml0X3BhcmFtcyhhcCwgZGV2LCBpZFszXSwgaWRbNl0pOworCQkJZXJyX21hc2sgPSBhdGFfZGV2X2luaXRfcGFyYW1zKGRldiwgaWRbM10sIGlkWzZdKTsKIAkJCWlmIChlcnJfbWFzaykgewogCQkJCXJjID0gLUVJTzsKIAkJCQlyZWFzb24gPSAiSU5JVF9ERVZfUEFSQU1TIGZhaWxlZCI7CkBAIC0xMTc1LDI1ICsxMjU5LDQ1IEBACiAJfQogCiAJKnBfY2xhc3MgPSBjbGFzczsKLQkqcF9pZCA9IGlkOworCiAJcmV0dXJuIDA7CiAKICBlcnJfb3V0OgotCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiBkZXYgJXUgZmFpbGVkIHRvIElERU5USUZZICglcylcbiIsCi0JICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywgcmVhc29uKTsKLQlrZnJlZShpZCk7CisJaWYgKGF0YV9tc2dfd2FybihhcCkpIAorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywgImZhaWxlZCB0byBJREVOVElGWSAiCisJCSAgICAgICAiKCVzLCBlcnJfbWFzaz0weCV4KVxuIiwgcmVhc29uLCBlcnJfbWFzayk7CiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IGF0YV9kZXZfa25vYmJsZShjb25zdCBzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCSBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB1OCBhdGFfZGV2X2tub2JibGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gKChhcC0+Y2JsID09IEFUQV9DQkxfU0FUQSkgJiYgKCFhdGFfaWRfaXNfc2F0YShkZXYtPmlkKSkpOworCXJldHVybiAoKGRldi0+YXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpICYmICghYXRhX2lkX2lzX3NhdGEoZGV2LT5pZCkpKTsKK30KKworc3RhdGljIHZvaWQgYXRhX2Rldl9jb25maWdfbmNxKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICAgY2hhciAqZGVzYywgc2l6ZV90IGRlc2Nfc3opCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CisJaW50IGhkZXB0aCA9IDAsIGRkZXB0aCA9IGF0YV9pZF9xdWV1ZV9kZXB0aChkZXYtPmlkKTsKKworCWlmICghYXRhX2lkX2hhc19uY3EoZGV2LT5pZCkpIHsKKwkJZGVzY1swXSA9ICdcMCc7CisJCXJldHVybjsKKwl9CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfTkNRKSB7CisJCWhkZXB0aCA9IG1pbihhcC0+aG9zdC0+Y2FuX3F1ZXVlLCBBVEFfTUFYX1FVRVVFIC0gMSk7CisJCWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05DUTsKKwl9CisKKwlpZiAoaGRlcHRoID49IGRkZXB0aCkKKwkJc25wcmludGYoZGVzYywgZGVzY19zeiwgIk5DUSAoZGVwdGggJWQpIiwgZGRlcHRoKTsKKwllbHNlCisJCXNucHJpbnRmKGRlc2MsIGRlc2Nfc3osICJOQ1EgKGRlcHRoICVkLyVkKSIsIGhkZXB0aCwgZGRlcHRoKTsKIH0KIAogLyoqCiAgKglhdGFfZGV2X2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIEFUQS9BVEFQSSBkZXZpY2UKLSAqCUBhcDogUG9ydCBvbiB3aGljaCB0YXJnZXQgZGV2aWNlIHJlc2lkZXMKICAqCUBkZXY6IFRhcmdldCBkZXZpY2UgdG8gY29uZmlndXJlCiAgKglAcHJpbnRfaW5mbzogRW5hYmxlIGRldmljZSBpbmZvIHByaW50b3V0CiAgKgpAQCAtMTIwNiwzMCArMTMxMCwzMyBAQAogICoJUkVUVVJOUzoKICAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCi0JCQkgICAgIGludCBwcmludF9pbmZvKQoraW50IGF0YV9kZXZfY29uZmlndXJlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwcmludF9pbmZvKQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCWNvbnN0IHUxNiAqaWQgPSBkZXYtPmlkOwogCXVuc2lnbmVkIGludCB4ZmVyX21hc2s7CiAJaW50IGksIHJjOwogCi0JaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkgewotCQlEUFJJTlRLKCJFTlRFUi9FWElUIChob3N0ICV1LCBkZXYgJXUpIC0tIG5vZGV2XG4iLAotCQkJYXAtPmlkLCBkZXYtPmRldm5vKTsKKwlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpICYmIGF0YV9tc2dfaW5mbyhhcCkpIHsKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICIlczogRU5URVIvRVhJVCAoaG9zdCAldSwgZGV2ICV1KSAtLSBub2RldlxuIiwKKwkJCV9fRlVOQ1RJT05fXywgYXAtPmlkLCBkZXYtPmRldm5vKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JRFBSSU5USygiRU5URVIsIGhvc3QgJXUsIGRldiAldVxuIiwgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwlpZiAoYXRhX21zZ19wcm9iZShhcCkpCisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9ERUJVRywgIiVzOiBFTlRFUiwgaG9zdCAldSwgZGV2ICV1XG4iLCAKKwkJCV9fRlVOQ1RJT05fXywgYXAtPmlkLCBkZXYtPmRldm5vKTsKIAogCS8qIHByaW50IGRldmljZSBjYXBhYmlsaXRpZXMgKi8KLQlpZiAocHJpbnRfaW5mbykKLQkJcHJpbnRrKEtFUk5fREVCVUcgImF0YSV1OiBkZXYgJXUgY2ZnIDQ5OiUwNHggODI6JTA0eCA4MzolMDR4ICIKLQkJICAgICAgICI4NDolMDR4IDg1OiUwNHggODY6JTA0eCA4NzolMDR4IDg4OiUwNHhcbiIsCi0JCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sIGlkWzQ5XSwgaWRbODJdLCBpZFs4M10sCi0JCSAgICAgICBpZFs4NF0sIGlkWzg1XSwgaWRbODZdLCBpZFs4N10sIGlkWzg4XSk7CisJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICIlczogY2ZnIDQ5OiUwNHggODI6JTA0eCA4MzolMDR4ICIKKwkJCSAgICAgICAiODQ6JTA0eCA4NTolMDR4IDg2OiUwNHggODc6JTA0eCA4ODolMDR4XG4iLAorCQkJICAgICAgIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgICBpZFs0OV0sIGlkWzgyXSwgaWRbODNdLCBpZFs4NF0sCisJCQkgICAgICAgaWRbODVdLCBpZFs4Nl0sIGlkWzg3XSwgaWRbODhdKTsKIAogCS8qIGluaXRpYWxpemUgdG8tYmUtY29uZmlndXJlZCBwYXJhbWV0ZXJzICovCi0JZGV2LT5mbGFncyA9IDA7CisJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX0NGR19NQVNLOwogCWRldi0+bWF4X3NlY3RvcnMgPSAwOwogCWRldi0+Y2RiX2xlbiA9IDA7CiAJZGV2LT5uX3NlY3RvcnMgPSAwOwpAQCAtMTI0NCw3ICsxMzUxLDggQEAKIAkvKiBmaW5kIG1heCB0cmFuc2ZlciBtb2RlOyBmb3IgcHJpbnRrIG9ubHkgKi8KIAl4ZmVyX21hc2sgPSBhdGFfaWRfeGZlcm1hc2soaWQpOwogCi0JYXRhX2R1bXBfaWQoaWQpOworCWlmIChhdGFfbXNnX3Byb2JlKGFwKSkKKwkJYXRhX2R1bXBfaWQoaWQpOwogCiAJLyogQVRBLXNwZWNpZmljIGZlYXR1cmUgdGVzdHMgKi8KIAlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgewpAQCAtMTI1Miw2ICsxMzYwLDcgQEAKIAogCQlpZiAoYXRhX2lkX2hhc19sYmEoaWQpKSB7CiAJCQljb25zdCBjaGFyICpsYmFfZGVzYzsKKwkJCWNoYXIgbmNxX2Rlc2NbMjBdOwogCiAJCQlsYmFfZGVzYyA9ICJMQkEiOwogCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfTEJBOwpAQCAtMTI2MCwxNSArMTM2OSwxNyBAQAogCQkJCWxiYV9kZXNjID0gIkxCQTQ4IjsKIAkJCX0KIAorCQkJLyogY29uZmlnIE5DUSAqLworCQkJYXRhX2Rldl9jb25maWdfbmNxKGRldiwgbmNxX2Rlc2MsIHNpemVvZihuY3FfZGVzYykpOworCiAJCQkvKiBwcmludCBkZXZpY2UgaW5mbyB0byBkbWVzZyAqLwotCQkJaWYgKHByaW50X2luZm8pCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6IGRldiAldSBBVEEtJWQsICIKLQkJCQkgICAgICAgIm1heCAlcywgJUx1IHNlY3RvcnM6ICVzXG4iLAotCQkJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sCi0JCQkJICAgICAgIGF0YV9pZF9tYWpvcl92ZXJzaW9uKGlkKSwKLQkJCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKHhmZXJfbWFzayksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5uX3NlY3RvcnMsCi0JCQkJICAgICAgIGxiYV9kZXNjKTsKKwkJCWlmIChhdGFfbXNnX2luZm8oYXApKQorCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiQVRBLSVkLCAiCisJCQkJCSJtYXggJXMsICVMdSBzZWN0b3JzOiAlcyAlc1xuIiwKKwkJCQkJYXRhX2lkX21ham9yX3ZlcnNpb24oaWQpLAorCQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycywKKwkJCQkJbGJhX2Rlc2MsIG5jcV9kZXNjKTsKIAkJfSBlbHNlIHsKIAkJCS8qIENIUyAqLwogCkBAIC0xMjg1LDE0ICsxMzk2LDIwIEBACiAJCQl9CiAKIAkJCS8qIHByaW50IGRldmljZSBpbmZvIHRvIGRtZXNnICovCi0JCQlpZiAocHJpbnRfaW5mbykKLQkJCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogZGV2ICV1IEFUQS0lZCwgIgotCQkJCSAgICAgICAibWF4ICVzLCAlTHUgc2VjdG9yczogQ0hTICV1LyV1LyV1XG4iLAotCQkJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sCi0JCQkJICAgICAgIGF0YV9pZF9tYWpvcl92ZXJzaW9uKGlkKSwKLQkJCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKHhmZXJfbWFzayksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5uX3NlY3RvcnMsCi0JCQkJICAgICAgIGRldi0+Y3lsaW5kZXJzLCBkZXYtPmhlYWRzLCBkZXYtPnNlY3RvcnMpOworCQkJaWYgKGF0YV9tc2dfaW5mbyhhcCkpCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJBVEEtJWQsICIKKwkJCQkJIm1heCAlcywgJUx1IHNlY3RvcnM6IENIUyAldS8ldS8ldVxuIiwKKwkJCQkJYXRhX2lkX21ham9yX3ZlcnNpb24oaWQpLAorCQkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZXYtPm5fc2VjdG9ycywKKwkJCQkJZGV2LT5jeWxpbmRlcnMsIGRldi0+aGVhZHMsIGRldi0+c2VjdG9ycyk7CisJCX0KKworCQlpZiAoZGV2LT5pZFs1OV0gJiAweDEwMCkgeworCQkJZGV2LT5tdWx0aV9jb3VudCA9IGRldi0+aWRbNTldICYgMHhmZjsKKwkJCWlmIChhdGFfbXNnX2luZm8oYXApKQorCQkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiYXRhJXU6IGRldiAldSBtdWx0aSBjb3VudCAldVxuIiwKKwkJCQlhcC0+aWQsIGRldi0+ZGV2bm8sIGRldi0+bXVsdGlfY291bnQpOwogCQl9CiAKIAkJZGV2LT5jZGJfbGVuID0gMTY7CkBAIC0xMzAwLDE4ICsxNDE3LDI4IEBACiAKIAkvKiBBVEFQSS1zcGVjaWZpYyBmZWF0dXJlIHRlc3RzICovCiAJZWxzZSBpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJKSB7CisJCWNoYXIgKmNkYl9pbnRyX3N0cmluZyA9ICIiOworCiAJCXJjID0gYXRhcGlfY2RiX2xlbihpZCk7CiAJCWlmICgocmMgPCAxMikgfHwgKHJjID4gQVRBUElfQ0RCX0xFTikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImF0YSV1OiB1bnN1cHBvcnRlZCBDREIgbGVuXG4iLCBhcC0+aWQpOworCQkJaWYgKGF0YV9tc2dfd2FybihhcCkpCisJCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsIAorCQkJCQkidW5zdXBwb3J0ZWQgQ0RCIGxlblxuIik7CiAJCQlyYyA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9vdXRfbm9zdXA7CiAJCX0KIAkJZGV2LT5jZGJfbGVuID0gKHVuc2lnbmVkIGludCkgcmM7CiAKKwkJaWYgKGF0YV9pZF9jZGJfaW50cihkZXYtPmlkKSkgeworCQkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfQ0RCX0lOVFI7CisJCQljZGJfaW50cl9zdHJpbmcgPSAiLCBDREIgaW50ciI7CisJCX0KKwogCQkvKiBwcmludCBkZXZpY2UgaW5mbyB0byBkbWVzZyAqLwotCQlpZiAocHJpbnRfaW5mbykKLQkJCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXUgQVRBUEksIG1heCAlc1xuIiwKLQkJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sIGF0YV9tb2RlX3N0cmluZyh4ZmVyX21hc2spKTsKKwkJaWYgKGF0YV9tc2dfaW5mbyhhcCkpCisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgIkFUQVBJLCBtYXggJXMlc1xuIiwKKwkJCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKHhmZXJfbWFzayksCisJCQkJICAgICAgIGNkYl9pbnRyX3N0cmluZyk7CiAJfQogCiAJYXAtPmhvc3QtPm1heF9jbWRfbGVuID0gMDsKQEAgLTEzMjEsMTAgKzE0NDgsMTAgQEAKIAkJCQkJICAgICAgYXAtPmRldmljZVtpXS5jZGJfbGVuKTsKIAogCS8qIGxpbWl0IGJyaWRnZSB0cmFuc2ZlcnMgdG8gdWRtYTUsIDIwMCBzZWN0b3JzICovCi0JaWYgKGF0YV9kZXZfa25vYmJsZShhcCwgZGV2KSkgewotCQlpZiAocHJpbnRfaW5mbykKLQkJCXByaW50ayhLRVJOX0lORk8gImF0YSV1KCV1KTogYXBwbHlpbmcgYnJpZGdlIGxpbWl0c1xuIiwKLQkJCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8pOworCWlmIChhdGFfZGV2X2tub2JibGUoZGV2KSkgeworCQlpZiAoYXRhX21zZ19pbmZvKGFwKSkKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLAorCQkJCSAgICAgICAiYXBwbHlpbmcgYnJpZGdlIGxpbWl0c1xuIik7CiAJCWRldi0+dWRtYV9tYXNrICY9IEFUQV9VRE1BNTsKIAkJZGV2LT5tYXhfc2VjdG9ycyA9IEFUQV9NQVhfU0VDVE9SUzsKIAl9CkBAIC0xMzMyLDExICsxNDU5LDE1IEBACiAJaWYgKGFwLT5vcHMtPmRldl9jb25maWcpCiAJCWFwLT5vcHMtPmRldl9jb25maWcoYXAsIGRldik7CiAKLQlEUFJJTlRLKCJFWElULCBkcnZfc3RhdCA9IDB4JXhcbiIsIGF0YV9jaGtfc3RhdHVzKGFwKSk7CisJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsICIlczogRVhJVCwgZHJ2X3N0YXQgPSAweCV4XG4iLAorCQkJX19GVU5DVElPTl9fLCBhdGFfY2hrX3N0YXR1cyhhcCkpOwogCXJldHVybiAwOwogCiBlcnJfb3V0X25vc3VwOgotCURQUklOVEsoIkVYSVQsIGVyclxuIik7CisJaWYgKGF0YV9tc2dfcHJvYmUoYXApKQorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fREVCVUcsIAorCQkJCSIlczogRVhJVCwgZXJyXG4iLCBfX0ZVTkNUSU9OX18pOwogCXJldHVybiByYzsKIH0KIApAQCAtMTM1Miw3OSArMTQ4MywxMDQgQEAKICAqCVBDSS9ldGMuIGJ1cyBwcm9iZSBzZW0uCiAgKgogICoJUkVUVVJOUzoKLSAqCVplcm8gb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZXJyb3IuCisgKglaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG90aGVyd2lzZS4KICAqLwogCiBzdGF0aWMgaW50IGF0YV9idXNfcHJvYmUoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAl1bnNpZ25lZCBpbnQgY2xhc3Nlc1tBVEFfTUFYX0RFVklDRVNdOwotCXVuc2lnbmVkIGludCBpLCByYywgZm91bmQgPSAwOworCWludCB0cmllc1tBVEFfTUFYX0RFVklDRVNdOworCWludCBpLCByYywgZG93bl94ZmVybWFzazsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwogCiAJYXRhX3BvcnRfcHJvYmUoYXApOwogCi0JLyogcmVzZXQgYW5kIGRldGVybWluZSBkZXZpY2UgY2xhc3NlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykKLQkJY2xhc3Nlc1tpXSA9IEFUQV9ERVZfVU5LTk9XTjsKKwkJdHJpZXNbaV0gPSBBVEFfUFJPQkVfTUFYX1RSSUVTOwogCi0JaWYgKGFwLT5vcHMtPnByb2JlX3Jlc2V0KSB7Ci0JCXJjID0gYXAtPm9wcy0+cHJvYmVfcmVzZXQoYXAsIGNsYXNzZXMpOwotCQlpZiAocmMpIHsKLQkJCXByaW50aygiYXRhJXU6IHJlc2V0IGZhaWxlZCAoZXJybm89JWQpXG4iLCBhcC0+aWQsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCX0gZWxzZSB7Ci0JCWFwLT5vcHMtPnBoeV9yZXNldChhcCk7CisgcmV0cnk6CisJZG93bl94ZmVybWFzayA9IDA7CiAKLQkJaWYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkpCi0JCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCi0JCQkJY2xhc3Nlc1tpXSA9IGFwLT5kZXZpY2VbaV0uY2xhc3M7CisJLyogcmVzZXQgYW5kIGRldGVybWluZSBkZXZpY2UgY2xhc3NlcyAqLworCWFwLT5vcHMtPnBoeV9yZXNldChhcCk7CiAKLQkJYXRhX3BvcnRfcHJvYmUoYXApOworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKKworCQlpZiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkgJiYKKwkJICAgIGRldi0+Y2xhc3MgIT0gQVRBX0RFVl9VTktOT1dOKQorCQkJY2xhc3Nlc1tkZXYtPmRldm5vXSA9IGRldi0+Y2xhc3M7CisJCWVsc2UKKwkJCWNsYXNzZXNbZGV2LT5kZXZub10gPSBBVEFfREVWX05PTkU7CisKKwkJZGV2LT5jbGFzcyA9IEFUQV9ERVZfVU5LTk9XTjsKIAl9CiAKKwlhdGFfcG9ydF9wcm9iZShhcCk7CisKKwkvKiBhZnRlciB0aGUgcmVzZXQgdGhlIGRldmljZSBzdGF0ZSBpcyBQSU8gMCBhbmQgdGhlIGNvbnRyb2xsZXIKKwkgICBzdGF0ZSBpcyB1bmRlZmluZWQuIFJlY29yZCB0aGUgbW9kZSAqLworCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQotCQlpZiAoY2xhc3Nlc1tpXSA9PSBBVEFfREVWX1VOS05PV04pCi0JCQljbGFzc2VzW2ldID0gQVRBX0RFVl9OT05FOworCQlhcC0+ZGV2aWNlW2ldLnBpb19tb2RlID0gWEZFUl9QSU9fMDsKIAogCS8qIHJlYWQgSURFTlRJRlkgcGFnZSBhbmQgY29uZmlndXJlIGRldmljZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKLQkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKIAotCQlkZXYtPmNsYXNzID0gY2xhc3Nlc1tpXTsKKwkJaWYgKHRyaWVzW2ldKQorCQkJZGV2LT5jbGFzcyA9IGNsYXNzZXNbaV07CiAKLQkJaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKIAkJCWNvbnRpbnVlOwogCi0JCVdBUk5fT04oZGV2LT5pZCAhPSBOVUxMKTsKLQkJaWYgKGF0YV9kZXZfcmVhZF9pZChhcCwgZGV2LCAmZGV2LT5jbGFzcywgMSwgJmRldi0+aWQpKSB7Ci0JCQlkZXYtPmNsYXNzID0gQVRBX0RFVl9OT05FOwotCQkJY29udGludWU7Ci0JCX0KKwkJcmMgPSBhdGFfZGV2X3JlYWRfaWQoZGV2LCAmZGV2LT5jbGFzcywgMSwgZGV2LT5pZCk7CisJCWlmIChyYykKKwkJCWdvdG8gZmFpbDsKIAotCQlpZiAoYXRhX2Rldl9jb25maWd1cmUoYXAsIGRldiwgMSkpIHsKLQkJCWF0YV9kZXZfZGlzYWJsZShhcCwgZGV2KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZm91bmQgPSAxOworCQlyYyA9IGF0YV9kZXZfY29uZmlndXJlKGRldiwgMSk7CisJCWlmIChyYykKKwkJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoIWZvdW5kKQotCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKwkvKiBjb25maWd1cmUgdHJhbnNmZXIgbW9kZSAqLworCXJjID0gYXRhX3NldF9tb2RlKGFwLCAmZGV2KTsKKwlpZiAocmMpIHsKKwkJZG93bl94ZmVybWFzayA9IDE7CisJCWdvdG8gZmFpbDsKKwl9CiAKLQlpZiAoYXAtPm9wcy0+c2V0X21vZGUpCi0JCWFwLT5vcHMtPnNldF9tb2RlKGFwKTsKLQllbHNlCi0JCWF0YV9zZXRfbW9kZShhcCk7CisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQorCQlpZiAoYXRhX2Rldl9lbmFibGVkKCZhcC0+ZGV2aWNlW2ldKSkKKwkJCXJldHVybiAwOwogCi0JaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpCi0JCWdvdG8gZXJyX291dF9kaXNhYmxlOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXRfZGlzYWJsZToKKwkvKiBubyBkZXZpY2UgcHJlc2VudCwgZGlzYWJsZSBwb3J0ICovCisJYXRhX3BvcnRfZGlzYWJsZShhcCk7CiAJYXAtPm9wcy0+cG9ydF9kaXNhYmxlKGFwKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FTk9ERVY7CisKKyBmYWlsOgorCXN3aXRjaCAocmMpIHsKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRU5PREVWOgorCQl0cmllc1tkZXYtPmRldm5vXSA9IDA7CisJCWJyZWFrOworCWNhc2UgLUVJTzoKKwkJc2F0YV9kb3duX3NwZF9saW1pdChhcCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXRyaWVzW2Rldi0+ZGV2bm9dLS07CisJCWlmIChkb3duX3hmZXJtYXNrICYmCisJCSAgICBhdGFfZG93bl94ZmVybWFza19saW1pdChkZXYsIHRyaWVzW2Rldi0+ZGV2bm9dID09IDEpKQorCQkJdHJpZXNbZGV2LT5kZXZub10gPSAwOworCX0KKworCWlmICghdHJpZXNbZGV2LT5kZXZub10pIHsKKwkJYXRhX2Rvd25feGZlcm1hc2tfbGltaXQoZGV2LCAxKTsKKwkJYXRhX2Rldl9kaXNhYmxlKGRldik7CisJfQorCisJZ290byByZXRyeTsKIH0KIAogLyoqCkBAIC0xNDQwLDcgKzE1OTYsNyBAQAogCiB2b2lkIGF0YV9wb3J0X3Byb2JlKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JYXAtPmZsYWdzICY9IH5BVEFfRkxBR19QT1JUX0RJU0FCTEVEOworCWFwLT5mbGFncyAmPSB+QVRBX0ZMQUdfRElTQUJMRUQ7CiB9CiAKIC8qKgpAQCAtMTQ1NCwyNyArMTYxMCwyMSBAQAogICovCiBzdGF0aWMgdm9pZCBzYXRhX3ByaW50X2xpbmtfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JdTMyIHNzdGF0dXMsIHRtcDsKLQljb25zdCBjaGFyICpzcGVlZDsKKwl1MzIgc3N0YXR1cywgc2NvbnRyb2wsIHRtcDsKIAotCWlmICghYXAtPm9wcy0+c2NyX3JlYWQpCisJaWYgKHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMsICZzc3RhdHVzKSkKIAkJcmV0dXJuOworCXNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpOwogCi0Jc3N0YXR1cyA9IHNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKTsKLQotCWlmIChzYXRhX2Rldl9wcmVzZW50KGFwKSkgeworCWlmIChhdGFfcG9ydF9vbmxpbmUoYXApKSB7CiAJCXRtcCA9IChzc3RhdHVzID4+IDQpICYgMHhmOwotCQlpZiAodG1wICYgKDEgPDwgMCkpCi0JCQlzcGVlZCA9ICIxLjUiOwotCQllbHNlIGlmICh0bXAgJiAoMSA8PCAxKSkKLQkJCXNwZWVkID0gIjMuMCI7Ci0JCWVsc2UKLQkJCXNwZWVkID0gIjx1bmtub3duPiI7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBTQVRBIGxpbmsgdXAgJXMgR2JwcyAoU1N0YXR1cyAlWClcbiIsCi0JCSAgICAgICBhcC0+aWQsIHNwZWVkLCBzc3RhdHVzKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sCisJCQkJIlNBVEEgbGluayB1cCAlcyAoU1N0YXR1cyAlWCBTQ29udHJvbCAlWClcbiIsCisJCQkJc2F0YV9zcGRfc3RyaW5nKHRtcCksIHNzdGF0dXMsIHNjb250cm9sKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogU0FUQSBsaW5rIGRvd24gKFNTdGF0dXMgJVgpXG4iLAotCQkgICAgICAgYXAtPmlkLCBzc3RhdHVzKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sCisJCQkJIlNBVEEgbGluayBkb3duIChTU3RhdHVzICVYIFNDb250cm9sICVYKVxuIiwKKwkJCQlzc3RhdHVzLCBzY29udHJvbCk7CiAJfQogfQogCkBAIC0xNDk3LDE3ICsxNjQ3LDE4IEBACiAKIAlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQV9SRVNFVCkgewogCQkvKiBpc3N1ZSBwaHkgd2FrZS9yZXNldCAqLwotCQlzY3Jfd3JpdGVfZmx1c2goYXAsIFNDUl9DT05UUk9MLCAweDMwMSk7CisJCXNhdGFfc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDEpOwogCQkvKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0CiAJCSAqIEFIQ0ktMS4xIDEwLjQuMiBzYXlzIGF0IGxlYXN0IDEgbXMuICovCiAJCW1kZWxheSgxKTsKIAl9Ci0Jc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOyAvKiBwaHkgd2FrZS9jbGVhciByZXNldCAqLworCS8qIHBoeSB3YWtlL2NsZWFyIHJlc2V0ICovCisJc2F0YV9zY3Jfd3JpdGVfZmx1c2goYXAsIFNDUl9DT05UUk9MLCAweDMwMCk7CiAKIAkvKiB3YWl0IGZvciBwaHkgdG8gYmVjb21lIHJlYWR5LCBpZiBuZWNlc3NhcnkgKi8KIAlkbyB7CiAJCW1zbGVlcCgyMDApOwotCQlzc3RhdHVzID0gc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpOworCQlzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cyk7CiAJCWlmICgoc3N0YXR1cyAmIDB4ZikgIT0gMSkKIAkJCWJyZWFrOwogCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKQEAgLTE1MTYsMTIgKzE2NjcsMTIgQEAKIAlzYXRhX3ByaW50X2xpbmtfc3RhdHVzKGFwKTsKIAogCS8qIFRPRE86IHBoeSBsYXllciB3aXRoIHBvbGxpbmcsIHRpbWVvdXRzLCBldGMuICovCi0JaWYgKHNhdGFfZGV2X3ByZXNlbnQoYXApKQorCWlmICghYXRhX3BvcnRfb2ZmbGluZShhcCkpCiAJCWF0YV9wb3J0X3Byb2JlKGFwKTsKIAllbHNlCiAJCWF0YV9wb3J0X2Rpc2FibGUoYXApOwogCi0JaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BPUlRfRElTQUJMRUQpCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKQogCQlyZXR1cm47CiAKIAlpZiAoYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCkpIHsKQEAgLTE1NDYsMjQgKzE2OTcsMjQgQEAKIHZvaWQgc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCkKIHsKIAlfX3NhdGFfcGh5X3Jlc2V0KGFwKTsKLQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCkKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpCiAJCXJldHVybjsKIAlhdGFfYnVzX3Jlc2V0KGFwKTsKIH0KIAogLyoqCiAgKglhdGFfZGV2X3BhaXIJCS0JcmV0dXJuIG90aGVyIGRldmljZSBvbiBjYWJsZQotICoJQGFwOiBwb3J0CiAgKglAYWRldjogZGV2aWNlCiAgKgogICoJT2J0YWluIHRoZSBvdGhlciBkZXZpY2Ugb24gdGhlIHNhbWUgY2FibGUsIG9yIGlmIG5vbmUgaXMKICAqCXByZXNlbnQgTlVMTCBpcyByZXR1cm5lZAogICovCiAKLXN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2X3BhaXIoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpCitzdHJ1Y3QgYXRhX2RldmljZSAqYXRhX2Rldl9wYWlyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2KQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhZGV2LT5hcDsKIAlzdHJ1Y3QgYXRhX2RldmljZSAqcGFpciA9ICZhcC0+ZGV2aWNlWzEgLSBhZGV2LT5kZXZub107Ci0JaWYgKCFhdGFfZGV2X3ByZXNlbnQocGFpcikpCisJaWYgKCFhdGFfZGV2X2VuYWJsZWQocGFpcikpCiAJCXJldHVybiBOVUxMOwogCXJldHVybiBwYWlyOwogfQpAQCAtMTU4NSw3ICsxNzM2LDEyMiBAQAogewogCWFwLT5kZXZpY2VbMF0uY2xhc3MgPSBBVEFfREVWX05PTkU7CiAJYXAtPmRldmljZVsxXS5jbGFzcyA9IEFUQV9ERVZfTk9ORTsKLQlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRDsKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfRElTQUJMRUQ7Cit9CisKKy8qKgorICoJc2F0YV9kb3duX3NwZF9saW1pdCAtIGFkanVzdCBTQVRBIHNwZCBsaW1pdCBkb3dud2FyZAorICoJQGFwOiBQb3J0IHRvIGFkanVzdCBTQVRBIHNwZCBsaW1pdCBmb3IKKyAqCisgKglBZGp1c3QgU0FUQSBzcGQgbGltaXQgb2YgQGFwIGRvd253YXJkLiAgTm90ZSB0aGF0IHRoaXMKKyAqCWZ1bmN0aW9uIG9ubHkgYWRqdXN0cyB0aGUgbGltaXQuICBUaGUgY2hhbmdlIG11c3QgYmUgYXBwbGllZAorICoJdXNpbmcgc2F0YV9zZXRfc3BkKCkuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCBzYXRhX2Rvd25fc3BkX2xpbWl0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHNzdGF0dXMsIHNwZCwgbWFzazsKKwlpbnQgcmMsIGhpZ2hiaXQ7CisKKwlyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMsICZzc3RhdHVzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCW1hc2sgPSBhcC0+c2F0YV9zcGRfbGltaXQ7CisJaWYgKG1hc2sgPD0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaGlnaGJpdCA9IGZscyhtYXNrKSAtIDE7CisJbWFzayAmPSB+KDEgPDwgaGlnaGJpdCk7CisKKwlzcGQgPSAoc3N0YXR1cyA+PiA0KSAmIDB4ZjsKKwlpZiAoc3BkIDw9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXNwZC0tOworCW1hc2sgJj0gKDEgPDwgc3BkKSAtIDE7CisJaWYgKCFtYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFwLT5zYXRhX3NwZF9saW1pdCA9IG1hc2s7CisKKwlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgImxpbWl0aW5nIFNBVEEgbGluayBzcGVlZCB0byAlc1xuIiwKKwkJCXNhdGFfc3BkX3N0cmluZyhmbHMobWFzaykpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fc2F0YV9zZXRfc3BkX25lZWRlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgKnNjb250cm9sKQoreworCXUzMiBzcGQsIGxpbWl0OworCisJaWYgKGFwLT5zYXRhX3NwZF9saW1pdCA9PSBVSU5UX01BWCkKKwkJbGltaXQgPSAwOworCWVsc2UKKwkJbGltaXQgPSBmbHMoYXAtPnNhdGFfc3BkX2xpbWl0KTsKKworCXNwZCA9ICgqc2NvbnRyb2wgPj4gNCkgJiAweGY7CisJKnNjb250cm9sID0gKCpzY29udHJvbCAmIH4weGYwKSB8ICgobGltaXQgJiAweGYpIDw8IDQpOworCisJcmV0dXJuIHNwZCAhPSBsaW1pdDsKK30KKworLyoqCisgKglzYXRhX3NldF9zcGRfbmVlZGVkIC0gaXMgU0FUQSBzcGQgY29uZmlndXJhdGlvbiBuZWVkZWQKKyAqCUBhcDogUG9ydCBpbiBxdWVzdGlvbgorICoKKyAqCVRlc3Qgd2hldGhlciB0aGUgc3BkIGxpbWl0IGluIFNDb250cm9sIG1hdGNoZXMKKyAqCUBhcC0+c2F0YV9zcGRfbGltaXQuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCisgKgl3aGV0aGVyIGhhcmRyZXNldCBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgU0FUQSBzcGQKKyAqCWNvbmZpZ3VyYXRpb24uCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqCisgKglSRVRVUk5TOgorICoJMSBpZiBTQVRBIHNwZCBjb25maWd1cmF0aW9uIGlzIG5lZWRlZCwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBzYXRhX3NldF9zcGRfbmVlZGVkKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHNjb250cm9sOworCisJaWYgKHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBfX3NhdGFfc2V0X3NwZF9uZWVkZWQoYXAsICZzY29udHJvbCk7Cit9CisKKy8qKgorICoJc2F0YV9zZXRfc3BkIC0gc2V0IFNBVEEgc3BkIGFjY29yZGluZyB0byBzcGQgbGltaXQKKyAqCUBhcDogUG9ydCB0byBzZXQgU0FUQSBzcGQgZm9yCisgKgorICoJU2V0IFNBVEEgc3BkIG9mIEBhcCBhY2NvcmRpbmcgdG8gc2F0YV9zcGRfbGltaXQuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqCisgKglSRVRVUk5TOgorICoJMCBpZiBzcGQgZG9lc24ndCBuZWVkIHRvIGJlIGNoYW5nZWQsIDEgaWYgc3BkIGhhcyBiZWVuCisgKgljaGFuZ2VkLiAgTmVnYXRpdmUgZXJybm8gaWYgU0NSIHJlZ2lzdGVycyBhcmUgaW5hY2Nlc3NpYmxlLgorICovCitpbnQgc2F0YV9zZXRfc3BkKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHNjb250cm9sOworCWludCByYzsKKworCWlmICgocmMgPSBzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfQ09OVFJPTCwgJnNjb250cm9sKSkpCisJCXJldHVybiByYzsKKworCWlmICghX19zYXRhX3NldF9zcGRfbmVlZGVkKGFwLCAmc2NvbnRyb2wpKQorCQlyZXR1cm4gMDsKKworCWlmICgocmMgPSBzYXRhX3Njcl93cml0ZShhcCwgU0NSX0NPTlRST0wsIHNjb250cm9sKSkpCisJCXJldHVybiByYzsKKworCXJldHVybiAxOwogfQogCiAvKgpAQCAtMTczNiw1MiArMjAwMiwxNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGFfZGV2X3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCisvKioKKyAqCWF0YV9kb3duX3hmZXJtYXNrX2xpbWl0IC0gYWRqdXN0IGRldiB4ZmVyIG1hc2tzIGRvd253YXJkCisgKglAZGV2OiBEZXZpY2UgdG8gYWRqdXN0IHhmZXIgbWFza3MKKyAqCUBmb3JjZV9waW8wOiBGb3JjZSBQSU8wCisgKgorICoJQWRqdXN0IHhmZXIgbWFza3Mgb2YgQGRldiBkb3dud2FyZC4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uCisgKglkb2VzIG5vdCBhcHBseSB0aGUgY2hhbmdlLiAgSW52b2tpbmcgYXRhX3NldF9tb2RlKCkgYWZ0ZXJ3YXJkcworICoJd2lsbCBhcHBseSB0aGUgbGltaXQuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlCisgKi8KK2ludCBhdGFfZG93bl94ZmVybWFza19saW1pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgZm9yY2VfcGlvMCkKK3sKKwl1bnNpZ25lZCBsb25nIHhmZXJfbWFzazsKKwlpbnQgaGlnaGJpdDsKKworCXhmZXJfbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKGRldi0+cGlvX21hc2ssIGRldi0+bXdkbWFfbWFzaywKKwkJCQkgICAgICBkZXYtPnVkbWFfbWFzayk7CisKKwlpZiAoIXhmZXJfbWFzaykKKwkJZ290byBmYWlsOworCS8qIGRvbid0IGdlYXIgZG93biB0byBNV0RNQSBmcm9tIFVETUEsIGdvIGRpcmVjdGx5IHRvIFBJTyAqLworCWlmICh4ZmVyX21hc2sgJiBBVEFfTUFTS19VRE1BKQorCQl4ZmVyX21hc2sgJj0gfkFUQV9NQVNLX01XRE1BOworCisJaGlnaGJpdCA9IGZscyh4ZmVyX21hc2spIC0gMTsKKwl4ZmVyX21hc2sgJj0gfigxIDw8IGhpZ2hiaXQpOworCWlmIChmb3JjZV9waW8wKQorCQl4ZmVyX21hc2sgJj0gMSA8PCBBVEFfU0hJRlRfUElPOworCWlmICgheGZlcl9tYXNrKQorCQlnb3RvIGZhaWw7CisKKwlhdGFfdW5wYWNrX3hmZXJtYXNrKHhmZXJfbWFzaywgJmRldi0+cGlvX21hc2ssICZkZXYtPm13ZG1hX21hc2ssCisJCQkgICAgJmRldi0+dWRtYV9tYXNrKTsKKworCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLCAibGltaXRpbmcgc3BlZWQgdG8gJXNcbiIsCisJCSAgICAgICBhdGFfbW9kZV9zdHJpbmcoeGZlcl9tYXNrKSk7CisKKwlyZXR1cm4gMDsKKworIGZhaWw6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYXRhX2Rldl9zZXRfbW9kZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGludCBlcnJfbWFzazsKIAlpbnQgcmM7CiAKKwlkZXYtPmZsYWdzICY9IH5BVEFfREZMQUdfUElPOwogCWlmIChkZXYtPnhmZXJfc2hpZnQgPT0gQVRBX1NISUZUX1BJTykKIAkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfUElPOwogCi0JZXJyX21hc2sgPSBhdGFfZGV2X3NldF94ZmVybW9kZShhcCwgZGV2KTsKKwllcnJfbWFzayA9IGF0YV9kZXZfc2V0X3hmZXJtb2RlKGRldik7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImF0YSV1OiBmYWlsZWQgdG8gc2V0IHhmZXJtb2RlIChlcnJfbWFzaz0weCV4KVxuIiwKLQkJICAgICAgIGFwLT5pZCwgZXJyX21hc2spOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHNldCB4ZmVybW9kZSAiCisJCQkgICAgICAgIihlcnJfbWFzaz0weCV4KVxuIiwgZXJyX21hc2spOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKLQlyYyA9IGF0YV9kZXZfcmV2YWxpZGF0ZShhcCwgZGV2LCAwKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiYXRhJXU6IGZhaWxlZCB0byByZXZhbGlkYXRlIGFmdGVyIHNldCB4ZmVybW9kZVxuIiwKLQkJICAgICAgIGFwLT5pZCk7CisJcmMgPSBhdGFfZGV2X3JldmFsaWRhdGUoZGV2LCAwKTsKKwlpZiAocmMpCiAJCXJldHVybiByYzsKLQl9CiAKIAlEUFJJTlRLKCJ4ZmVyX3NoaWZ0PSV1LCB4ZmVyX21vZGU9MHgleFxuIiwKIAkJZGV2LT54ZmVyX3NoaWZ0LCAoaW50KWRldi0+eGZlcl9tb2RlKTsKIAotCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXUgY29uZmlndXJlZCBmb3IgJXNcbiIsCi0JICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywKLQkgICAgICAgYXRhX21vZGVfc3RyaW5nKGF0YV94ZmVyX21vZGUybWFzayhkZXYtPnhmZXJfbW9kZSkpKTsKKwlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNvbmZpZ3VyZWQgZm9yICVzXG4iLAorCQkgICAgICAgYXRhX21vZGVfc3RyaW5nKGF0YV94ZmVyX21vZGUybWFzayhkZXYtPnhmZXJfbW9kZSkpKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGFfaG9zdF9zZXRfcGlvKHN0cnVjdCBhdGFfcG9ydCAqYXApCisvKioKKyAqCWF0YV9zZXRfbW9kZSAtIFByb2dyYW0gdGltaW5ncyBhbmQgaXNzdWUgU0VUIEZFQVRVUkVTIC0gWEZFUgorICoJQGFwOiBwb3J0IG9uIHdoaWNoIHRpbWluZ3Mgd2lsbCBiZSBwcm9ncmFtbWVkCisgKglAcl9mYWlsZWRfZGV2OiBvdXQgcGFyYW10ZXIgZm9yIGZhaWxlZCBkZXZpY2UKKyAqCisgKglTZXQgQVRBIGRldmljZSBkaXNrIHRyYW5zZmVyIG1vZGUgKFBJTzMsIFVETUE2LCBldGMuKS4gIElmCisgKglhdGFfc2V0X21vZGUoKSBmYWlscywgcG9pbnRlciB0byB0aGUgZmFpbGluZyBkZXZpY2UgaXMKKyAqCXJldHVybmVkIGluIEByX2ZhaWxlZF9kZXYuCisgKgorICoJTE9DS0lORzoKKyAqCVBDSS9ldGMuIGJ1cyBwcm9iZSBzZW0uCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlCisgKi8KK2ludCBhdGFfc2V0X21vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpCiB7Ci0JaW50IGk7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlpbnQgaSwgcmMgPSAwLCB1c2VkX2RtYSA9IDAsIGZvdW5kID0gMDsKIAorCS8qIGhhcyBwcml2YXRlIHNldF9tb2RlPyAqLworCWlmIChhcC0+b3BzLT5zZXRfbW9kZSkgeworCQkvKiBGSVhNRTogbWFrZSAtPnNldF9tb2RlIGhhbmRsZSBubyBkZXZpY2UgY2FzZSBhbmQKKwkJICogcmV0dXJuIGVycm9yIGNvZGUgYW5kIGZhaWxpbmcgZGV2aWNlIG9uIGZhaWx1cmUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJCWlmIChhdGFfZGV2X2VuYWJsZWQoJmFwLT5kZXZpY2VbaV0pKSB7CisJCQkJYXAtPm9wcy0+c2V0X21vZGUoYXApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIHN0ZXAgMTogY2FsY3VsYXRlIHhmZXJfbWFzayAqLwogCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewotCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gJmFwLT5kZXZpY2VbaV07CisJCXVuc2lnbmVkIGludCBwaW9fbWFzaywgZG1hX21hc2s7CiAKLQkJaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkKKwkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CisKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCWF0YV9kZXZfeGZlcm1hc2soZGV2KTsKKworCQlwaW9fbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKGRldi0+cGlvX21hc2ssIDAsIDApOworCQlkbWFfbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKDAsIGRldi0+bXdkbWFfbWFzaywgZGV2LT51ZG1hX21hc2spOworCQlkZXYtPnBpb19tb2RlID0gYXRhX3hmZXJfbWFzazJtb2RlKHBpb19tYXNrKTsKKwkJZGV2LT5kbWFfbW9kZSA9IGF0YV94ZmVyX21hc2sybW9kZShkbWFfbWFzayk7CisKKwkJZm91bmQgPSAxOworCQlpZiAoZGV2LT5kbWFfbW9kZSkKKwkJCXVzZWRfZG1hID0gMTsKKwl9CisJaWYgKCFmb3VuZCkKKwkJZ290byBvdXQ7CisKKwkvKiBzdGVwIDI6IGFsd2F5cyBzZXQgaG9zdCBQSU8gdGltaW5ncyAqLworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghZGV2LT5waW9fbW9kZSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IG5vIFBJTyBzdXBwb3J0IGZvciBkZXZpY2UgJWQuXG4iLCBhcC0+aWQsIGkpOwotCQkJcmV0dXJuIC0xOworCQkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsICJubyBQSU8gc3VwcG9ydFxuIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCWRldi0+eGZlcl9tb2RlID0gZGV2LT5waW9fbW9kZTsKQEAgLTE3OTAsMTcgKzIxNTMsMTEgQEAKIAkJCWFwLT5vcHMtPnNldF9waW9tb2RlKGFwLCBkZXYpOwogCX0KIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBhdGFfaG9zdF9zZXRfZG1hKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JaW50IGk7Ci0KKwkvKiBzdGVwIDM6IHNldCBob3N0IERNQSB0aW1pbmdzICovCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CiAKLQkJaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSB8fCAhZGV2LT5kbWFfbW9kZSkKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSB8fCAhZGV2LT5kbWFfbW9kZSkKIAkJCWNvbnRpbnVlOwogCiAJCWRldi0+eGZlcl9tb2RlID0gZGV2LT5kbWFfbW9kZTsKQEAgLTE4MDgsNzkgKzIxNjUsMzMgQEAKIAkJaWYgKGFwLT5vcHMtPnNldF9kbWFtb2RlKQogCQkJYXAtPm9wcy0+c2V0X2RtYW1vZGUoYXAsIGRldik7CiAJfQotfQotCi0vKioKLSAqCWF0YV9zZXRfbW9kZSAtIFByb2dyYW0gdGltaW5ncyBhbmQgaXNzdWUgU0VUIEZFQVRVUkVTIC0gWEZFUgotICoJQGFwOiBwb3J0IG9uIHdoaWNoIHRpbWluZ3Mgd2lsbCBiZSBwcm9ncmFtbWVkCi0gKgotICoJU2V0IEFUQSBkZXZpY2UgZGlzayB0cmFuc2ZlciBtb2RlIChQSU8zLCBVRE1BNiwgZXRjLikuCi0gKgotICoJTE9DS0lORzoKLSAqCVBDSS9ldGMuIGJ1cyBwcm9iZSBzZW0uCi0gKi8KLXN0YXRpYyB2b2lkIGF0YV9zZXRfbW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCWludCBpLCByYywgdXNlZF9kbWEgPSAwOwotCi0JLyogc3RlcCAxOiBjYWxjdWxhdGUgeGZlcl9tYXNrICovCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7Ci0JCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKLQkJdW5zaWduZWQgaW50IHBpb19tYXNrLCBkbWFfbWFzazsKLQotCQlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQotCQkJY29udGludWU7Ci0KLQkJYXRhX2Rldl94ZmVybWFzayhhcCwgZGV2KTsKLQotCQkvKiBUT0RPOiBsZXQgTExERCBmaWx0ZXIgZGV2LT4qX21hc2sgaGVyZSAqLwotCi0JCXBpb19tYXNrID0gYXRhX3BhY2tfeGZlcm1hc2soZGV2LT5waW9fbWFzaywgMCwgMCk7Ci0JCWRtYV9tYXNrID0gYXRhX3BhY2tfeGZlcm1hc2soMCwgZGV2LT5td2RtYV9tYXNrLCBkZXYtPnVkbWFfbWFzayk7Ci0JCWRldi0+cGlvX21vZGUgPSBhdGFfeGZlcl9tYXNrMm1vZGUocGlvX21hc2spOwotCQlkZXYtPmRtYV9tb2RlID0gYXRhX3hmZXJfbWFzazJtb2RlKGRtYV9tYXNrKTsKLQotCQlpZiAoZGV2LT5kbWFfbW9kZSkKLQkJCXVzZWRfZG1hID0gMTsKLQl9Ci0KLQkvKiBzdGVwIDI6IGFsd2F5cyBzZXQgaG9zdCBQSU8gdGltaW5ncyAqLwotCXJjID0gYXRhX2hvc3Rfc2V0X3BpbyhhcCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycl9vdXQ7Ci0KLQkvKiBzdGVwIDM6IHNldCBob3N0IERNQSB0aW1pbmdzICovCi0JYXRhX2hvc3Rfc2V0X2RtYShhcCk7CiAKIAkvKiBzdGVwIDQ6IHVwZGF0ZSBkZXZpY2VzJyB4ZmVyIG1vZGUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKLQkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKIAotCQlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQorCQlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKQogCQkJY29udGludWU7CiAKLQkJaWYgKGF0YV9kZXZfc2V0X21vZGUoYXAsIGRldikpCi0JCQlnb3RvIGVycl9vdXQ7CisJCXJjID0gYXRhX2Rldl9zZXRfbW9kZShkZXYpOworCQlpZiAocmMpCisJCQlnb3RvIG91dDsKIAl9CiAKLQkvKgotCSAqCVJlY29yZCBzaW1wbGV4IHN0YXR1cy4gSWYgd2Ugc2VsZWN0ZWQgRE1BIHRoZW4gdGhlIG90aGVyCi0JICoJaG9zdCBjaGFubmVscyBhcmUgbm90IHBlcm1pdHRlZCB0byBkbyBzby4KKwkvKiBSZWNvcmQgc2ltcGxleCBzdGF0dXMuIElmIHdlIHNlbGVjdGVkIERNQSB0aGVuIHRoZSBvdGhlcgorCSAqIGhvc3QgY2hhbm5lbHMgYXJlIG5vdCBwZXJtaXR0ZWQgdG8gZG8gc28uCiAJICovCi0KIAlpZiAodXNlZF9kbWEgJiYgKGFwLT5ob3N0X3NldC0+ZmxhZ3MgJiBBVEFfSE9TVF9TSU1QTEVYKSkKIAkJYXAtPmhvc3Rfc2V0LT5zaW1wbGV4X2NsYWltZWQgPSAxOwogCi0JLyoKLQkgKglDaGlwIHNwZWNpZmljIGZpbmFsaXNhdGlvbgotCSAqLworCS8qIHN0ZXA1OiBjaGlwIHNwZWNpZmljIGZpbmFsaXNhdGlvbiAqLwogCWlmIChhcC0+b3BzLT5wb3N0X3NldF9tb2RlKQogCQlhcC0+b3BzLT5wb3N0X3NldF9tb2RlKGFwKTsKIAotCXJldHVybjsKLQotZXJyX291dDoKLQlhdGFfcG9ydF9kaXNhYmxlKGFwKTsKKyBvdXQ6CisJaWYgKHJjKQorCQkqcl9mYWlsZWRfZGV2ID0gZGV2OworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0xOTMwLDggKzIyNDEsOCBAQAogCX0KIAogCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUgaXMgc2xvdyB0byByZXNwb25kLCAiCi0JCSAgICAgICAicGxlYXNlIGJlIHBhdGllbnRcbiIsIGFwLT5pZCk7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAorCQkJCSJwb3J0IGlzIHNsb3cgdG8gcmVzcG9uZCwgcGxlYXNlIGJlIHBhdGllbnRcbiIpOwogCiAJdGltZW91dCA9IHRpbWVyX3N0YXJ0ICsgdG1vdXQ7CiAJd2hpbGUgKChzdGF0dXMgJiBBVEFfQlVTWSkgJiYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSkgewpAQCAtMTk0MCw4ICsyMjUxLDggQEAKIAl9CiAKIAlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldSBmYWlsZWQgdG8gcmVzcG9uZCAoJWx1IHNlY3MpXG4iLAotCQkgICAgICAgYXAtPmlkLCB0bW91dCAvIEhaKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgInBvcnQgZmFpbGVkIHRvIHJlc3BvbmQgIgorCQkJCSIoJWx1IHNlY3MpXG4iLCB0bW91dCAvIEhaKTsKIAkJcmV0dXJuIDE7CiAJfQogCkBAIC0yMDMzLDggKzIzNDQsMTAgQEAKIAkgKiB0aGUgYnVzIHNob3dzIDB4RkYgYmVjYXVzZSB0aGUgb2RkIGNsb3duIGZvcmdldHMgdGhlIEQ3CiAJICogcHVsbGRvd24gcmVzaXN0b3IuCiAJICovCi0JaWYgKGF0YV9jaGVja19zdGF0dXMoYXApID09IDB4RkYpCisJaWYgKGF0YV9jaGVja19zdGF0dXMoYXApID09IDB4RkYpIHsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChzdGF0dXMgMHhGRilcbiIpOwogCQlyZXR1cm4gQUNfRVJSX09USEVSOworCX0KIAogCWF0YV9idXNfcG9zdF9yZXNldChhcCwgZGV2bWFzayk7CiAKQEAgLTIwNTgsNyArMjM3MSw3IEBACiAgKglPYnRhaW5zIGhvc3Rfc2V0IGxvY2suCiAgKgogICoJU0lERSBFRkZFQ1RTOgotICoJU2V0cyBBVEFfRkxBR19QT1JUX0RJU0FCTEVEIGlmIGJ1cyByZXNldCBmYWlscy4KKyAqCVNldHMgQVRBX0ZMQUdfRElTQUJMRUQgaWYgYnVzIHJlc2V0IGZhaWxzLgogICovCiAKIHZvaWQgYXRhX2J1c19yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQpAQCAtMjEyNiw2MCArMjQzOSwxMzkgQEAKIAlyZXR1cm47CiAKIGVycl9vdXQ6Ci0JcHJpbnRrKEtFUk5fRVJSICJhdGEldTogZGlzYWJsaW5nIHBvcnRcbiIsIGFwLT5pZCk7CisJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgImRpc2FibGluZyBwb3J0XG4iKTsKIAlhcC0+b3BzLT5wb3J0X2Rpc2FibGUoYXApOwogCiAJRFBSSU5USygiRVhJVFxuIik7CiB9CiAKLXN0YXRpYyBpbnQgc2F0YV9waHlfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIChIWiAqIDUpOwotCXUzMiBzc3RhdHVzOwotCi0Jc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOwotCi0JLyogV2FpdCBmb3IgcGh5IHRvIGJlY29tZSByZWFkeSwgaWYgbmVjZXNzYXJ5LiAqLwotCWRvIHsKLQkJbXNsZWVwKDIwMCk7Ci0JCXNzdGF0dXMgPSBzY3JfcmVhZChhcCwgU0NSX1NUQVRVUyk7Ci0JCWlmICgoc3N0YXR1cyAmIDB4ZikgIT0gMSkKLQkJCXJldHVybiAwOwotCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKLQotCXJldHVybiAtMTsKLX0KLQogLyoqCi0gKglhdGFfc3RkX3Byb2JlaW5pdCAtIGluaXRpYWxpemUgcHJvYmluZwotICoJQGFwOiBwb3J0IHRvIGJlIHByb2JlZAorICoJc2F0YV9waHlfZGVib3VuY2UgLSBkZWJvdW5jZSBTQVRBIHBoeSBzdGF0dXMKKyAqCUBhcDogQVRBIHBvcnQgdG8gZGVib3VuY2UgU0FUQSBwaHkgc3RhdHVzIGZvcgorICoJQHBhcmFtczogdGltaW5nIHBhcmFtZXRlcnMgeyBpbnRlcnZhbCwgZHVyYXRpbm9uLCB0aW1lb3V0IH0gaW4gbXNlYwogICoKLSAqCUBhcCBpcyBhYm91dCB0byBiZSBwcm9iZWQuICBJbml0aWFsaXplIGl0LiAgVGhpcyBmdW5jdGlvbiBpcwotICoJdG8gYmUgdXNlZCBhcyBzdGFuZGFyZCBjYWxsYmFjayBmb3IgYXRhX2RyaXZlX3Byb2JlX3Jlc2V0KCkuCisgKglNYWtlIHN1cmUgU1N0YXR1cyBvZiBAYXAgcmVhY2hlcyBzdGFibGUgc3RhdGUsIGRldGVybWluZWQgYnkKKyAqCWhvbGRpbmcgdGhlIHNhbWUgdmFsdWUgd2hlcmUgREVUIGlzIG5vdCAxIGZvciBAZHVyYXRpb24gcG9sbGVkCisgKglldmVyeSBAaW50ZXJ2YWwsIGJlZm9yZSBAdGltZW91dC4gIFRpbWVvdXQgY29uc3RyYWludHMgdGhlCisgKgliZWdpbm5pbmcgb2YgdGhlIHN0YWJsZSBzdGF0ZS4gIEJlY2F1c2UsIGFmdGVyIGhvdCB1bnBsdWdnaW5nLAorICoJREVUIGdldHMgc3R1Y2sgYXQgMSBvbiBzb21lIGNvbnRyb2xsZXJzLCB0aGlzIGZ1bmN0aW9ucyB3YWl0cworICoJdW50aWwgdGltZW91dCB0aGVuIHJldHVybnMgMCBpZiBERVQgaXMgc3RhYmxlIGF0IDEuCiAgKgotICoJTk9URSEhISBEbyBub3QgdXNlIHRoaXMgZnVuY3Rpb24gYXMgcHJvYmVpbml0IGlmIGEgbG93IGxldmVsCi0gKglkcml2ZXIgaW1wbGVtZW50cyBvbmx5IGhhcmRyZXNldC4gIEp1c3QgcGFzcyBOVUxMIGFzIHByb2JlaW5pdAotICoJaW4gdGhhdCBjYXNlLiAgVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSBva2F5IGJ1dCBkb2luZwotICoJc28gbWFrZXMgcmVzZXQgc2VxdWVuY2UgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsCi0gKgktPnBoeV9yZXNldCBpbXBsZW1lbnRhdGlvbiBhbmQgSmVmZiBuZXJ2b3VzLiAgOi1QCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCiAgKi8KLXZvaWQgYXRhX3N0ZF9wcm9iZWluaXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK2ludCBzYXRhX3BoeV9kZWJvdW5jZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCB1bnNpZ25lZCBsb25nICpwYXJhbXMpCiB7Ci0JaWYgKChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBKSAmJiBhcC0+b3BzLT5zY3JfcmVhZCkgewotCQlzYXRhX3BoeV9yZXN1bWUoYXApOwotCQlpZiAoc2F0YV9kZXZfcHJlc2VudChhcCkpCi0JCQlhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0JPT1RfUVVJQ0ssIEFUQV9UTU9VVF9CT09UKTsKKwl1bnNpZ25lZCBsb25nIGludGVydmFsX21zZWMgPSBwYXJhbXNbMF07CisJdW5zaWduZWQgbG9uZyBkdXJhdGlvbiA9IHBhcmFtc1sxXSAqIEhaIC8gMTAwMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgcGFyYW1zWzJdICogSFogLyAxMDAwOworCXVuc2lnbmVkIGxvbmcgbGFzdF9qaWZmaWVzOworCXUzMiBsYXN0LCBjdXI7CisJaW50IHJjOworCisJaWYgKChyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMsICZjdXIpKSkKKwkJcmV0dXJuIHJjOworCWN1ciAmPSAweGY7CisKKwlsYXN0ID0gY3VyOworCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisKKwl3aGlsZSAoMSkgeworCQltc2xlZXAoaW50ZXJ2YWxfbXNlYyk7CisJCWlmICgocmMgPSBzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfU1RBVFVTLCAmY3VyKSkpCisJCQlyZXR1cm4gcmM7CisJCWN1ciAmPSAweGY7CisKKwkJLyogREVUIHN0YWJsZT8gKi8KKwkJaWYgKGN1ciA9PSBsYXN0KSB7CisJCQlpZiAoY3VyID09IDEgJiYgdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCQkJY29udGludWU7CisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXN0X2ppZmZpZXMgKyBkdXJhdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHVuc3RhYmxlLCBzdGFydCBvdmVyICovCisJCWxhc3QgPSBjdXI7CisJCWxhc3RfamlmZmllcyA9IGppZmZpZXM7CisKKwkJLyogY2hlY2sgdGltZW91dCAqLworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJCXJldHVybiAtRUJVU1k7CiAJfQogfQogCiAvKioKLSAqCWF0YV9zdGRfc29mdHJlc2V0IC0gcmVzZXQgaG9zdCBwb3J0IHZpYSBBVEEgU1JTVAotICoJQGFwOiBwb3J0IHRvIHJlc2V0Ci0gKglAdmVyYm9zZTogZmFpbCB2ZXJib3NlbHkKLSAqCUBjbGFzc2VzOiByZXN1bHRpbmcgY2xhc3NlcyBvZiBhdHRhY2hlZCBkZXZpY2VzCisgKglzYXRhX3BoeV9yZXN1bWUgLSByZXN1bWUgU0FUQSBwaHkKKyAqCUBhcDogQVRBIHBvcnQgdG8gcmVzdW1lIFNBVEEgcGh5IGZvcgorICoJQHBhcmFtczogdGltaW5nIHBhcmFtZXRlcnMgeyBpbnRlcnZhbCwgZHVyYXRpbm9uLCB0aW1lb3V0IH0gaW4gbXNlYwogICoKLSAqCVJlc2V0IGhvc3QgcG9ydCB1c2luZyBBVEEgU1JTVC4gIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZAotICoJYXMgc3RhbmRhcmQgY2FsbGJhY2sgZm9yIGF0YV9kcml2ZV8qX3Jlc2V0KCkgZnVuY3Rpb25zLgorICoJUmVzdW1lIFNBVEEgcGh5IG9mIEBhcCBhbmQgZGVib3VuY2UgaXQuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgc2F0YV9waHlfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnBhcmFtcykKK3sKKwl1MzIgc2NvbnRyb2w7CisJaW50IHJjOworCisJaWYgKChyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpKSkKKwkJcmV0dXJuIHJjOworCisJc2NvbnRyb2wgPSAoc2NvbnRyb2wgJiAweDBmMCkgfCAweDMwMDsKKworCWlmICgocmMgPSBzYXRhX3Njcl93cml0ZShhcCwgU0NSX0NPTlRST0wsIHNjb250cm9sKSkpCisJCXJldHVybiByYzsKKworCS8qIFNvbWUgUEhZcyByZWFjdCBiYWRseSBpZiBTU3RhdHVzIGlzIHBvdW5kZWQgaW1tZWRpYXRlbHkKKwkgKiBhZnRlciByZXN1bWluZy4gIERlbGF5IDIwMG1zIGJlZm9yZSBkZWJvdW5jaW5nLgorCSAqLworCW1zbGVlcCgyMDApOworCisJcmV0dXJuIHNhdGFfcGh5X2RlYm91bmNlKGFwLCBwYXJhbXMpOworfQorCitzdGF0aWMgdm9pZCBhdGFfd2FpdF9zcGludXAoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZhcC0+ZWhfY29udGV4dDsKKwl1bnNpZ25lZCBsb25nIGVuZCwgc2VjczsKKwlpbnQgcmM7CisKKwkvKiBmaXJzdCwgZGVib3VuY2UgcGh5IGlmIFNBVEEgKi8KKwlpZiAoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpIHsKKwkJcmMgPSBzYXRhX3BoeV9kZWJvdW5jZShhcCwgc2F0YV9kZWJfdGltaW5nX2VoKTsKKworCQkvKiBpZiBkZWJvdW5jZWQgc3VjY2Vzc2Z1bGx5IGFuZCBvZmZsaW5lLCBubyBuZWVkIHRvIHdhaXQgKi8KKwkJaWYgKChyYyA9PSAwIHx8IHJjID09IC1FT1BOT1RTVVBQKSAmJiBhdGFfcG9ydF9vZmZsaW5lKGFwKSkKKwkJCXJldHVybjsKKwl9CisKKwkvKiBva2F5LCBsZXQncyBnaXZlIHRoZSBkcml2ZSB0aW1lIHRvIHNwaW4gdXAgKi8KKwllbmQgPSBlaGMtPmkuaG90cGx1Z190aW1lc3RhbXAgKyBBVEFfU1BJTlVQX1dBSVQgKiBIWiAvIDEwMDA7CisJc2VjcyA9ICgoZW5kIC0gamlmZmllcykgKyBIWiAtIDEpIC8gSFo7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbmQpKQorCQlyZXR1cm47CisKKwlpZiAoc2VjcyA+IDUpCisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9JTkZPLCAid2FpdGluZyBmb3IgZGV2aWNlIHRvIHNwaW4gdXAgIgorCQkJCSIoJWx1IHNlY3MpXG4iLCBzZWNzKTsKKworCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKGVuZCAtIGppZmZpZXMpOworfQorCisvKioKKyAqCWF0YV9zdGRfcHJlcmVzZXQgLSBwcmVwYXJlIGZvciByZXNldAorICoJQGFwOiBBVEEgcG9ydCB0byBiZSByZXNldAorICoKKyAqCUBhcCBpcyBhYm91dCB0byBiZSByZXNldC4gIEluaXRpYWxpemUgaXQuCiAgKgogICoJTE9DS0lORzoKICAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKQpAQCAtMjE4Nyw3ICsyNTc5LDYzIEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgogICovCi1pbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHZlcmJvc2UsIHVuc2lnbmVkIGludCAqY2xhc3NlcykKK2ludCBhdGFfc3RkX3ByZXJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmYXAtPmVoX2NvbnRleHQ7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqdGltaW5nOworCWludCByYzsKKworCS8qIGhvdHBsdWc/ICovCisJaWYgKGVoYy0+aS5mbGFncyAmIEFUQV9FSElfSE9UUExVR0dFRCkgeworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfSFJTVF9UT19SRVNVTUUpCisJCQllaGMtPmkuYWN0aW9uIHw9IEFUQV9FSF9IQVJEUkVTRVQ7CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TS0lQX0QySF9CU1kpCisJCQlhdGFfd2FpdF9zcGludXAoYXApOworCX0KKworCS8qIGlmIHdlJ3JlIGFib3V0IHRvIGRvIGhhcmRyZXNldCwgbm90aGluZyBtb3JlIHRvIGRvICovCisJaWYgKGVoYy0+aS5hY3Rpb24gJiBBVEFfRUhfSEFSRFJFU0VUKQorCQlyZXR1cm4gMDsKKworCS8qIGlmIFNBVEEsIHJlc3VtZSBwaHkgKi8KKwlpZiAoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpIHsKKwkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0xPQURJTkcpCisJCQl0aW1pbmcgPSBzYXRhX2RlYl90aW1pbmdfYm9vdDsKKwkJZWxzZQorCQkJdGltaW5nID0gc2F0YV9kZWJfdGltaW5nX2VoOworCisJCXJjID0gc2F0YV9waHlfcmVzdW1lKGFwLCB0aW1pbmcpOworCQlpZiAocmMgJiYgcmMgIT0gLUVPUE5PVFNVUFApIHsKKwkJCS8qIHBoeSByZXN1bWUgZmFpbGVkICovCisJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fV0FSTklORywgImZhaWxlZCB0byByZXN1bWUgIgorCQkJCQkibGluayBmb3IgcmVzZXQgKGVycm5vPSVkKVxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisJLyogV2FpdCBmb3IgIUJTWSBpZiB0aGUgY29udHJvbGxlciBjYW4gd2FpdCBmb3IgdGhlIGZpcnN0IEQySAorCSAqIFJlZyBGSVMgYW5kIHdlIGRvbid0IGtub3cgdGhhdCBubyBkZXZpY2UgaXMgYXR0YWNoZWQuCisJICovCisJaWYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0tJUF9EMkhfQlNZKSAmJiAhYXRhX3BvcnRfb2ZmbGluZShhcCkpCisJCWF0YV9idXN5X3NsZWVwKGFwLCBBVEFfVE1PVVRfQk9PVF9RVUlDSywgQVRBX1RNT1VUX0JPT1QpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3N0ZF9zb2Z0cmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIEFUQSBTUlNUCisgKglAYXA6IHBvcnQgdG8gcmVzZXQKKyAqCUBjbGFzc2VzOiByZXN1bHRpbmcgY2xhc3NlcyBvZiBhdHRhY2hlZCBkZXZpY2VzCisgKgorICoJUmVzZXQgaG9zdCBwb3J0IHVzaW5nIEFUQSBTUlNULgorICoKKyAqCUxPQ0tJTkc6CisgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkKKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgorICovCitpbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKQogewogCXVuc2lnbmVkIGludCBzbGF2ZV9wb3NzaWJsZSA9IGFwLT5mbGFncyAmIEFUQV9GTEFHX1NMQVZFX1BPU1M7CiAJdW5zaWduZWQgaW50IGRldm1hc2sgPSAwLCBlcnJfbWFzazsKQEAgLTIxOTUsNyArMjY0Myw3IEBACiAKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKLQlpZiAoYXAtPm9wcy0+c2NyX3JlYWQgJiYgIXNhdGFfZGV2X3ByZXNlbnQoYXApKSB7CisJaWYgKGF0YV9wb3J0X29mZmxpbmUoYXApKSB7CiAJCWNsYXNzZXNbMF0gPSBBVEFfREVWX05PTkU7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTIyMTMsMTEgKzI2NjEsNyBAQAogCURQUklOVEsoImFib3V0IHRvIHNvZnRyZXNldCwgZGV2bWFzaz0leFxuIiwgZGV2bWFzayk7CiAJZXJyX21hc2sgPSBhdGFfYnVzX3NvZnRyZXNldChhcCwgZGV2bWFzayk7CiAJaWYgKGVycl9tYXNrKSB7Ci0JCWlmICh2ZXJib3NlKQotCQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogU1JTVCBmYWlsZWQgKGVycl9tYXNrPTB4JXgpXG4iLAotCQkJICAgICAgIGFwLT5pZCwgZXJyX21hc2spOwotCQllbHNlCi0JCQlEUFJJTlRLKCJFWElULCBzb2Z0cmVzZXQgZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlNSU1QgZmFpbGVkIChlcnJfbWFzaz0weCV4KVxuIiwKIAkJCQllcnJfbWFzayk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTIyMzUsMTIgKzI2NzksOSBAQAogLyoqCiAgKglzYXRhX3N0ZF9oYXJkcmVzZXQgLSByZXNldCBob3N0IHBvcnQgdmlhIFNBVEEgcGh5IHJlc2V0CiAgKglAYXA6IHBvcnQgdG8gcmVzZXQKLSAqCUB2ZXJib3NlOiBmYWlsIHZlcmJvc2VseQogICoJQGNsYXNzOiByZXN1bHRpbmcgY2xhc3Mgb2YgYXR0YWNoZWQgZGV2aWNlCiAgKgogICoJU0FUQSBwaHktcmVzZXQgaG9zdCBwb3J0IHVzaW5nIERFVCBiaXRzIG9mIFNDb250cm9sIHJlZ2lzdGVyLgotICoJVGhpcyBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGFzIHN0YW5kYXJkIGNhbGxiYWNrIGZvcgotICoJYXRhX2RyaXZlXypfcmVzZXQoKS4KICAqCiAgKglMT0NLSU5HOgogICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCkBAIC0yMjQ4LDM1ICsyNjg5LDU3IEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgogICovCi1pbnQgc2F0YV9zdGRfaGFyZHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCB2ZXJib3NlLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQoraW50IHNhdGFfc3RkX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogeworCXUzMiBzY29udHJvbDsKKwlpbnQgcmM7CisKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKLQkvKiBJc3N1ZSBwaHkgd2FrZS9yZXNldCAqLwotCXNjcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIDB4MzAxKTsKKwlpZiAoc2F0YV9zZXRfc3BkX25lZWRlZChhcCkpIHsKKwkJLyogU0FUQSBzcGVjIHNheXMgbm90aGluZyBhYm91dCBob3cgdG8gcmVjb25maWd1cmUKKwkJICogc3BkLiAgVG8gYmUgb24gdGhlIHNhZmUgc2lkZSwgdHVybiBvZmYgcGh5IGR1cmluZworCQkgKiByZWNvbmZpZ3VyYXRpb24uICBUaGlzIHdvcmtzIGZvciBhdCBsZWFzdCBJQ0g3IEFIQ0kKKwkJICogYW5kIFNpbDMxMjQuCisJCSAqLworCQlpZiAoKHJjID0gc2F0YV9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wsICZzY29udHJvbCkpKQorCQkJcmV0dXJuIHJjOwogCi0JLyoKLQkgKiBDb3VsZG4ndCBmaW5kIGFueXRoaW5nIGluIFNBVEEgSS9JSSBzcGVjcywgYnV0IEFIQ0ktMS4xCisJCXNjb250cm9sID0gKHNjb250cm9sICYgMHgwZjApIHwgMHgzMDI7CisKKwkJaWYgKChyYyA9IHNhdGFfc2NyX3dyaXRlKGFwLCBTQ1JfQ09OVFJPTCwgc2NvbnRyb2wpKSkKKwkJCXJldHVybiByYzsKKworCQlzYXRhX3NldF9zcGQoYXApOworCX0KKworCS8qIGlzc3VlIHBoeSB3YWtlL3Jlc2V0ICovCisJaWYgKChyYyA9IHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9DT05UUk9MLCAmc2NvbnRyb2wpKSkKKwkJcmV0dXJuIHJjOworCisJc2NvbnRyb2wgPSAoc2NvbnRyb2wgJiAweDBmMCkgfCAweDMwMTsKKworCWlmICgocmMgPSBzYXRhX3Njcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIHNjb250cm9sKSkpCisJCXJldHVybiByYzsKKworCS8qIENvdWxkbid0IGZpbmQgYW55dGhpbmcgaW4gU0FUQSBJL0lJIHNwZWNzLCBidXQgQUhDSS0xLjEKIAkgKiAxMC40LjIgc2F5cyBhdCBsZWFzdCAxIG1zLgogCSAqLwogCW1zbGVlcCgxKTsKIAotCS8qIEJyaW5nIHBoeSBiYWNrICovCi0Jc2F0YV9waHlfcmVzdW1lKGFwKTsKKwkvKiBicmluZyBwaHkgYmFjayAqLworCXNhdGFfcGh5X3Jlc3VtZShhcCwgc2F0YV9kZWJfdGltaW5nX2VoKTsKIAogCS8qIFRPRE86IHBoeSBsYXllciB3aXRoIHBvbGxpbmcsIHRpbWVvdXRzLCBldGMuICovCi0JaWYgKCFzYXRhX2Rldl9wcmVzZW50KGFwKSkgeworCWlmIChhdGFfcG9ydF9vZmZsaW5lKGFwKSkgewogCQkqY2xhc3MgPSBBVEFfREVWX05PTkU7CiAJCURQUklOVEsoIkVYSVQsIGxpbmsgb2ZmbGluZVxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0JPT1RfUVVJQ0ssIEFUQV9UTU9VVF9CT09UKSkgewotCQlpZiAodmVyYm9zZSkKLQkJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IENPTVJFU0VUIGZhaWxlZCAiCi0JCQkgICAgICAgIihkZXZpY2Ugbm90IHJlYWR5KVxuIiwgYXAtPmlkKTsKLQkJZWxzZQotCQkJRFBSSU5USygiRVhJVCwgZGV2aWNlIG5vdCByZWFkeVxuIik7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCisJCQkJIkNPTVJFU0VUIGZhaWxlZCAoZGV2aWNlIG5vdCByZWFkeSlcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTIyOTcsMjcgKzI3NjAsMjggQEAKICAqCXRoZSBkZXZpY2UgbWlnaHQgaGF2ZSBiZWVuIHJlc2V0IG1vcmUgdGhhbiBvbmNlIHVzaW5nCiAgKglkaWZmZXJlbnQgcmVzZXQgbWV0aG9kcyBiZWZvcmUgcG9zdHJlc2V0IGlzIGludm9rZWQuCiAgKgotICoJVGhpcyBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGFzIHN0YW5kYXJkIGNhbGxiYWNrIGZvcgotICoJYXRhX2RyaXZlXypfcmVzZXQoKS4KLSAqCiAgKglMT0NLSU5HOgogICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCiAgKi8KIHZvaWQgYXRhX3N0ZF9wb3N0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKQogeworCXUzMiBzZXJyb3I7CisKIAlEUFJJTlRLKCJFTlRFUlxuIik7CiAKLQkvKiBzZXQgY2FibGUgdHlwZSBpZiBpdCBpc24ndCBhbHJlYWR5IHNldCAqLwotCWlmIChhcC0+Y2JsID09IEFUQV9DQkxfTk9ORSAmJiBhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBKQotCQlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOwotCiAJLyogcHJpbnQgbGluayBzdGF0dXMgKi8KLQlpZiAoYXAtPmNibCA9PSBBVEFfQ0JMX1NBVEEpCi0JCXNhdGFfcHJpbnRfbGlua19zdGF0dXMoYXApOworCXNhdGFfcHJpbnRfbGlua19zdGF0dXMoYXApOworCisJLyogY2xlYXIgU0Vycm9yICovCisJaWYgKHNhdGFfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUiwgJnNlcnJvcikgPT0gMCkKKwkJc2F0YV9zY3Jfd3JpdGUoYXAsIFNDUl9FUlJPUiwgc2Vycm9yKTsKIAogCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHRzICovCi0JaWYgKGFwLT5pb2FkZHIuY3RsX2FkZHIpCS8qIEZJWE1FOiBoYWNrLiBjcmVhdGUgYSBob29rIGluc3RlYWQgKi8KLQkJYXRhX2lycV9vbihhcCk7CisJaWYgKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7CisJCS8qIEZJWE1FOiBoYWNrLiBjcmVhdGUgYSBob29rIGluc3RlYWQgKi8KKwkJaWYgKGFwLT5pb2FkZHIuY3RsX2FkZHIpCisJCQlhdGFfaXJxX29uKGFwKTsKKwl9CiAKIAkvKiBpcyBkb3VibGUtc2VsZWN0IHJlYWxseSBuZWNlc3Nhcnk/ICovCiAJaWYgKGNsYXNzZXNbMF0gIT0gQVRBX0RFVl9OT05FKQpAQCAtMjM0MywxMjYgKzI4MDcsNyBAQAogfQogCiAvKioKLSAqCWF0YV9zdGRfcHJvYmVfcmVzZXQgLSBzdGFuZGFyZCBwcm9iZSByZXNldCBtZXRob2QKLSAqCUBhcDogcHJvdCB0byBwZXJmb3JtIHByb2JlLXJlc2V0Ci0gKglAY2xhc3NlczogcmVzdWx0aW5nIGNsYXNzZXMgb2YgYXR0YWNoZWQgZGV2aWNlcwotICoKLSAqCVRoZSBzdG9jayBvZmYtdGhlLXNoZWxmIC0+cHJvYmVfcmVzZXQgbWV0aG9kLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkKLSAqCi0gKglSRVRVUk5TOgotICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgotICovCi1pbnQgYXRhX3N0ZF9wcm9iZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCi17Ci0JYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0OwotCi0JaGFyZHJlc2V0ID0gTlVMTDsKLQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQSAmJiBhcC0+b3BzLT5zY3JfcmVhZCkKLQkJaGFyZHJlc2V0ID0gc2F0YV9zdGRfaGFyZHJlc2V0OwotCi0JcmV0dXJuIGF0YV9kcml2ZV9wcm9iZV9yZXNldChhcCwgYXRhX3N0ZF9wcm9iZWluaXQsCi0JCQkJICAgICBhdGFfc3RkX3NvZnRyZXNldCwgaGFyZHJlc2V0LAotCQkJCSAgICAgYXRhX3N0ZF9wb3N0cmVzZXQsIGNsYXNzZXMpOwotfQotCi1zdGF0aWMgaW50IGRvX3Byb2JlX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGF0YV9yZXNldF9mbl90IHJlc2V0LAotCQkJICBhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0LAotCQkJICB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCi17Ci0JaW50IGksIHJjOwotCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQotCQljbGFzc2VzW2ldID0gQVRBX0RFVl9VTktOT1dOOwotCi0JcmMgPSByZXNldChhcCwgMCwgY2xhc3Nlcyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBJZiBhbnkgY2xhc3MgaXNuJ3QgQVRBX0RFVl9VTktOT1dOLCBjb25zaWRlciBjbGFzc2lmaWNhdGlvbgotCSAqIGlzIGNvbXBsZXRlIGFuZCBjb252ZXJ0IGFsbCBBVEFfREVWX1VOS05PV04gdG8KLQkgKiBBVEFfREVWX05PTkUuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQotCQlpZiAoY2xhc3Nlc1tpXSAhPSBBVEFfREVWX1VOS05PV04pCi0JCQlicmVhazsKLQotCWlmIChpIDwgQVRBX01BWF9ERVZJQ0VTKQotCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCi0JCQlpZiAoY2xhc3Nlc1tpXSA9PSBBVEFfREVWX1VOS05PV04pCi0JCQkJY2xhc3Nlc1tpXSA9IEFUQV9ERVZfTk9ORTsKLQotCWlmIChwb3N0cmVzZXQpCi0JCXBvc3RyZXNldChhcCwgY2xhc3Nlcyk7Ci0KLQlyZXR1cm4gY2xhc3Nlc1swXSAhPSBBVEFfREVWX1VOS05PV04gPyAwIDogLUVOT0RFVjsKLX0KLQotLyoqCi0gKglhdGFfZHJpdmVfcHJvYmVfcmVzZXQgLSBQZXJmb3JtIHByb2JlIHJlc2V0IHdpdGggZ2l2ZW4gbWV0aG9kcwotICoJQGFwOiBwb3J0IHRvIHJlc2V0Ci0gKglAcHJvYmVpbml0OiBwcm9iZWluaXQgbWV0aG9kIChjYW4gYmUgTlVMTCkKLSAqCUBzb2Z0cmVzZXQ6IHNvZnRyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQotICoJQGhhcmRyZXNldDogaGFyZHJlc2V0IG1ldGhvZCAoY2FuIGJlIE5VTEwpCi0gKglAcG9zdHJlc2V0OiBwb3N0cmVzZXQgbWV0aG9kIChjYW4gYmUgTlVMTCkKLSAqCUBjbGFzc2VzOiByZXN1bHRpbmcgY2xhc3NlcyBvZiBhdHRhY2hlZCBkZXZpY2VzCi0gKgotICoJUmVzZXQgdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBjbGFzc2lmeSBhdHRhY2hlZCBkZXZpY2VzIHVzaW5nCi0gKglnaXZlbiBtZXRob2RzLiAgVGhpcyBmdW5jdGlvbiBwcmVmZXJzIHNvZnRyZXNldCBidXQgdHJpZXMgYWxsCi0gKglwb3NzaWJsZSByZXNldCBzZXF1ZW5jZXMgdG8gcmVzZXQgYW5kIGNsYXNzaWZ5IGRldmljZXMuICBUaGlzCi0gKglmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBjb25zdHJ1Y3RpbmcgLT5wcm9iZV9yZXNldAotICoJY2FsbGJhY2sgYnkgbG93IGxldmVsIGRyaXZlcnMuCi0gKgotICoJUmVzZXQgbWV0aG9kcyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgcnVsZXMuCi0gKgotICoJLSBSZXR1cm4gMCBvbiBzdWNlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgotICoJLSBJZiBjbGFzc2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQsIGZpbGwgY2xhc3Nlc1tdIHdpdGgKLSAqCSAgcmVjb2duaXplZCBjbGFzcyBjb2Rlcy4KLSAqCS0gSWYgY2xhc3NpZmljYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgbGVhdmUgY2xhc3Nlc1tdIGFsb25lLgotICoJLSBJZiB2ZXJib3NlIGlzIG5vbi16ZXJvLCBwcmludCBlcnJvciBtZXNzYWdlIG9uIGZhaWx1cmU7Ci0gKgkgIG90aGVyd2lzZSwgc2h1dCB1cC4KLSAqCi0gKglMT0NLSU5HOgotICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCi0gKgotICoJUkVUVVJOUzoKLSAqCTAgb24gc3VjY2VzcywgLUVJTlZBTCBpZiBubyByZXNldCBtZXRob2QgaXMgYXZhbGlhYmxlLCAtRU5PREVWCi0gKglpZiBjbGFzc2lmaWNhdGlvbiBmYWlscywgYW5kIGFueSBlcnJvciBjb2RlIGZyb20gcmVzZXQKLSAqCW1ldGhvZHMuCi0gKi8KLWludCBhdGFfZHJpdmVfcHJvYmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgYXRhX3Byb2JlaW5pdF9mbl90IHByb2JlaW5pdCwKLQkJCSAgYXRhX3Jlc2V0X2ZuX3Qgc29mdHJlc2V0LCBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQsCi0JCQkgIGF0YV9wb3N0cmVzZXRfZm5fdCBwb3N0cmVzZXQsIHVuc2lnbmVkIGludCAqY2xhc3NlcykKLXsKLQlpbnQgcmMgPSAtRUlOVkFMOwotCi0JaWYgKHByb2JlaW5pdCkKLQkJcHJvYmVpbml0KGFwKTsKLQotCWlmIChzb2Z0cmVzZXQpIHsKLQkJcmMgPSBkb19wcm9iZV9yZXNldChhcCwgc29mdHJlc2V0LCBwb3N0cmVzZXQsIGNsYXNzZXMpOwotCQlpZiAocmMgPT0gMCkKLQkJCXJldHVybiAwOwotCX0KLQotCWlmICghaGFyZHJlc2V0KQotCQlyZXR1cm4gcmM7Ci0KLQlyYyA9IGRvX3Byb2JlX3Jlc2V0KGFwLCBoYXJkcmVzZXQsIHBvc3RyZXNldCwgY2xhc3Nlcyk7Ci0JaWYgKHJjID09IDAgfHwgcmMgIT0gLUVOT0RFVikKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHNvZnRyZXNldCkKLQkJcmMgPSBkb19wcm9iZV9yZXNldChhcCwgc29mdHJlc2V0LCBwb3N0cmVzZXQsIGNsYXNzZXMpOwotCi0JcmV0dXJuIHJjOwotfQotCi0vKioKICAqCWF0YV9kZXZfc2FtZV9kZXZpY2UgLSBEZXRlcm1pbmUgd2hldGhlciBuZXcgSUQgbWF0Y2hlcyBjb25maWd1cmVkIGRldmljZQotICoJQGFwOiBwb3J0IG9uIHdoaWNoIHRoZSBkZXZpY2UgdG8gY29tcGFyZSBhZ2FpbnN0IHJlc2lkZXMKICAqCUBkZXY6IGRldmljZSB0byBjb21wYXJlIGFnYWluc3QKICAqCUBuZXdfY2xhc3M6IGNsYXNzIG9mIHRoZSBuZXcgZGV2aWNlCiAgKglAbmV3X2lkOiBJREVOVElGWSBwYWdlIG9mIHRoZSBuZXcgZGV2aWNlCkBAIC0yNDc3LDE3ICsyODIyLDE2IEBACiAgKglSRVRVUk5TOgogICoJMSBpZiBAZGV2IG1hdGNoZXMgQG5ld19jbGFzcyBhbmQgQG5ld19pZCwgMCBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgYXRhX2Rldl9zYW1lX2RldmljZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBuZXdfY2xhc3MsIGNvbnN0IHUxNiAqbmV3X2lkKQorc3RhdGljIGludCBhdGFfZGV2X3NhbWVfZGV2aWNlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBuZXdfY2xhc3MsCisJCQkgICAgICAgY29uc3QgdTE2ICpuZXdfaWQpCiB7CiAJY29uc3QgdTE2ICpvbGRfaWQgPSBkZXYtPmlkOwogCXVuc2lnbmVkIGNoYXIgbW9kZWxbMl1bNDFdLCBzZXJpYWxbMl1bMjFdOwogCXU2NCBuZXdfbl9zZWN0b3JzOwogCiAJaWYgKGRldi0+Y2xhc3MgIT0gbmV3X2NsYXNzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJhdGEldTogZGV2ICV1IGNsYXNzIG1pc21hdGNoICVkICE9ICVkXG4iLAotCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vLCBkZXYtPmNsYXNzLCBuZXdfY2xhc3MpOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgImNsYXNzIG1pc21hdGNoICVkICE9ICVkXG4iLAorCQkJICAgICAgIGRldi0+Y2xhc3MsIG5ld19jbGFzcyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjQ5OCwyNCArMjg0MiwyMiBAQAogCW5ld19uX3NlY3RvcnMgPSBhdGFfaWRfbl9zZWN0b3JzKG5ld19pZCk7CiAKIAlpZiAoc3RyY21wKG1vZGVsWzBdLCBtb2RlbFsxXSkpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgICAgImF0YSV1OiBkZXYgJXUgbW9kZWwgbnVtYmVyIG1pc21hdGNoICclcycgIT0gJyVzJ1xuIiwKLQkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywgbW9kZWxbMF0sIG1vZGVsWzFdKTsKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJtb2RlbCBudW1iZXIgbWlzbWF0Y2ggIgorCQkJICAgICAgICInJXMnICE9ICclcydcbiIsIG1vZGVsWzBdLCBtb2RlbFsxXSk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChzdHJjbXAoc2VyaWFsWzBdLCBzZXJpYWxbMV0pKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJhdGEldTogZGV2ICV1IHNlcmlhbCBudW1iZXIgbWlzbWF0Y2ggJyVzJyAhPSAnJXMnXG4iLAotCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vLCBzZXJpYWxbMF0sIHNlcmlhbFsxXSk7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAic2VyaWFsIG51bWJlciBtaXNtYXRjaCAiCisJCQkgICAgICAgIiclcycgIT0gJyVzJ1xuIiwgc2VyaWFsWzBdLCBzZXJpYWxbMV0pOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSAmJiBkZXYtPm5fc2VjdG9ycyAhPSBuZXdfbl9zZWN0b3JzKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJhdGEldTogZGV2ICV1IG5fc2VjdG9ycyBtaXNtYXRjaCAlbGx1ICE9ICVsbHVcbiIsCi0JCSAgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8sICh1bnNpZ25lZCBsb25nIGxvbmcpZGV2LT5uX3NlY3RvcnMsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19uX3NlY3RvcnMpOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywgIm5fc2VjdG9ycyBtaXNtYXRjaCAiCisJCQkgICAgICAgIiVsbHUgIT0gJWxsdVxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWRldi0+bl9zZWN0b3JzLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X25fc2VjdG9ycyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjUyNCw3ICsyODY2LDYgQEAKIAogLyoqCiAgKglhdGFfZGV2X3JldmFsaWRhdGUgLSBSZXZhbGlkYXRlIEFUQSBkZXZpY2UKLSAqCUBhcDogcG9ydCBvbiB3aGljaCB0aGUgZGV2aWNlIHRvIHJldmFsaWRhdGUgcmVzaWRlcwogICoJQGRldjogZGV2aWNlIHRvIHJldmFsaWRhdGUKICAqCUBwb3N0X3Jlc2V0OiBpcyB0aGlzIHJldmFsaWRhdGlvbiBhZnRlciByZXNldD8KICAqCkBAIC0yNTM3LDQwICsyODc4LDM3IEBACiAgKglSRVRVUk5TOgogICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UKICAqLwotaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkgICAgICAgaW50IHBvc3RfcmVzZXQpCitpbnQgYXRhX2Rldl9yZXZhbGlkYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBwb3N0X3Jlc2V0KQogewotCXVuc2lnbmVkIGludCBjbGFzczsKLQl1MTYgKmlkOworCXVuc2lnbmVkIGludCBjbGFzcyA9IGRldi0+Y2xhc3M7CisJdTE2ICppZCA9ICh2b2lkICopZGV2LT5hcC0+c2VjdG9yX2J1ZjsKIAlpbnQgcmM7CiAKLQlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWNsYXNzID0gZGV2LT5jbGFzczsKLQlpZCA9IE5VTEw7Ci0KLQkvKiBhbGxvY2F0ZSAmIHJlYWQgSUQgZGF0YSAqLwotCXJjID0gYXRhX2Rldl9yZWFkX2lkKGFwLCBkZXYsICZjbGFzcywgcG9zdF9yZXNldCwgJmlkKTsKLQlpZiAocmMpCi0JCWdvdG8gZmFpbDsKLQotCS8qIGlzIHRoZSBkZXZpY2Ugc3RpbGwgdGhlcmU/ICovCi0JaWYgKCFhdGFfZGV2X3NhbWVfZGV2aWNlKGFwLCBkZXYsIGNsYXNzLCBpZCkpIHsKKwlpZiAoIWF0YV9kZXZfZW5hYmxlZChkZXYpKSB7CiAJCXJjID0gLUVOT0RFVjsKIAkJZ290byBmYWlsOwogCX0KIAotCWtmcmVlKGRldi0+aWQpOwotCWRldi0+aWQgPSBpZDsKKwkvKiByZWFkIElEIGRhdGEgKi8KKwlyYyA9IGF0YV9kZXZfcmVhZF9pZChkZXYsICZjbGFzcywgcG9zdF9yZXNldCwgaWQpOworCWlmIChyYykKKwkJZ290byBmYWlsOworCisJLyogaXMgdGhlIGRldmljZSBzdGlsbCB0aGVyZT8gKi8KKwlpZiAoIWF0YV9kZXZfc2FtZV9kZXZpY2UoZGV2LCBjbGFzcywgaWQpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBmYWlsOworCX0KKworCW1lbWNweShkZXYtPmlkLCBpZCwgc2l6ZW9mKGlkWzBdKSAqIEFUQV9JRF9XT1JEUyk7CiAKIAkvKiBjb25maWd1cmUgZGV2aWNlIGFjY29yZGluZyB0byB0aGUgbmV3IElEICovCi0JcmV0dXJuIGF0YV9kZXZfY29uZmlndXJlKGFwLCBkZXYsIDApOworCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2LCAwKTsKKwlpZiAocmMgPT0gMCkKKwkJcmV0dXJuIDA7CiAKICBmYWlsOgotCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IGRldiAldSByZXZhbGlkYXRpb24gZmFpbGVkIChlcnJubz0lZClcbiIsCi0JICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywgcmMpOwotCWtmcmVlKGlkKTsKKwlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fRVJSLCAicmV2YWxpZGF0aW9uIGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yNjI2LDYgKzI5NjQsMTQgQEAKIAl1bnNpZ25lZCBpbnQgbmxlbiwgcmxlbjsKIAlpbnQgaTsKIAorCS8qIFdlIGRvbid0IHN1cHBvcnQgcG9sbGluZyBETUEuCisJICogRE1BIGJsYWNrbGlzdCB0aG9zZSBBVEFQSSBkZXZpY2VzIHdpdGggQ0RCLWludHIgKGFuZCB1c2UgUElPKQorCSAqIGlmIHRoZSBMTEREIGhhbmRsZXMgb25seSBpbnRlcnJ1cHRzIGluIHRoZSBIU01fU1RfTEFTVCBzdGF0ZS4KKwkgKi8KKwlpZiAoKGRldi0+YXAtPmZsYWdzICYgQVRBX0ZMQUdfUElPX1BPTExJTkcpICYmCisJICAgIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJcmV0dXJuIDE7CisKIAlhdGFfaWRfc3RyaW5nKGRldi0+aWQsIG1vZGVsX251bSwgQVRBX0lEX1BST0RfT0ZTLAogCQkJICBzaXplb2YobW9kZWxfbnVtKSk7CiAJYXRhX2lkX3N0cmluZyhkZXYtPmlkLCBtb2RlbF9yZXYsIEFUQV9JRF9GV19SRVZfT0ZTLApAQCAtMjY0Niw3ICsyOTkyLDYgQEAKIAogLyoqCiAgKglhdGFfZGV2X3hmZXJtYXNrIC0gQ29tcHV0ZSBzdXBwb3J0ZWQgeGZlcm1hc2sgb2YgdGhlIGdpdmVuIGRldmljZQotICoJQGFwOiBQb3J0IG9uIHdoaWNoIHRoZSBkZXZpY2UgdG8gY29tcHV0ZSB4ZmVybWFzayBmb3IgcmVzaWRlcwogICoJQGRldjogRGV2aWNlIHRvIGNvbXB1dGUgeGZlcm1hc2sgZm9yCiAgKgogICoJQ29tcHV0ZSBzdXBwb3J0ZWQgeGZlcm1hc2sgb2YgQGRldiBhbmQgc3RvcmUgaXQgaW4KQEAgLTI2NjEsNDkgKzMwMDYsNjEgQEAKICAqCUxPQ0tJTkc6CiAgKglOb25lLgogICovCi1zdGF0aWMgdm9pZCBhdGFfZGV2X3hmZXJtYXNrKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBhdGFfZGV2X3hmZXJtYXNrKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CiAJc3RydWN0IGF0YV9ob3N0X3NldCAqaHMgPSBhcC0+aG9zdF9zZXQ7CiAJdW5zaWduZWQgbG9uZyB4ZmVyX21hc2s7CiAJaW50IGk7CiAKLQl4ZmVyX21hc2sgPSBhdGFfcGFja194ZmVybWFzayhhcC0+cGlvX21hc2ssIGFwLT5td2RtYV9tYXNrLAotCQkJCSAgICAgIGFwLT51ZG1hX21hc2spOworCXhmZXJfbWFzayA9IGF0YV9wYWNrX3hmZXJtYXNrKGFwLT5waW9fbWFzaywKKwkJCQkgICAgICBhcC0+bXdkbWFfbWFzaywgYXAtPnVkbWFfbWFzayk7CisKKwkvKiBBcHBseSBjYWJsZSBydWxlIGhlcmUuICBEb24ndCBhcHBseSBpdCBlYXJseSBiZWNhdXNlIHdoZW4KKwkgKiB3ZSBoYW5kbGUgaG90IHBsdWcgdGhlIGNhYmxlIHR5cGUgY2FuIGl0c2VsZiBjaGFuZ2UuCisJICovCisJaWYgKGFwLT5jYmwgPT0gQVRBX0NCTF9QQVRBNDApCisJCXhmZXJfbWFzayAmPSB+KDB4RjggPDwgQVRBX1NISUZUX1VETUEpOwogCiAJLyogRklYTUU6IFVzZSBwb3J0LXdpZGUgeGZlcm1hc2sgZm9yIG5vdyAqLwogCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgewogCQlzdHJ1Y3QgYXRhX2RldmljZSAqZCA9ICZhcC0+ZGV2aWNlW2ldOwotCQlpZiAoIWF0YV9kZXZfcHJlc2VudChkKSkKKworCQlpZiAoYXRhX2Rldl9hYnNlbnQoZCkpCiAJCQljb250aW51ZTsKLQkJeGZlcl9tYXNrICY9IGF0YV9wYWNrX3hmZXJtYXNrKGQtPnBpb19tYXNrLCBkLT5td2RtYV9tYXNrLAotCQkJCQkgICAgICAgZC0+dWRtYV9tYXNrKTsKKworCQlpZiAoYXRhX2Rldl9kaXNhYmxlZChkKSkgeworCQkJLyogdG8gYXZvaWQgdmlvbGF0aW5nIGRldmljZSBzZWxlY3Rpb24gdGltaW5nICovCisJCQl4ZmVyX21hc2sgJj0gYXRhX3BhY2tfeGZlcm1hc2soZC0+cGlvX21hc2ssCisJCQkJCQkgICAgICAgVUlOVF9NQVgsIFVJTlRfTUFYKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJeGZlcl9tYXNrICY9IGF0YV9wYWNrX3hmZXJtYXNrKGQtPnBpb19tYXNrLAorCQkJCQkgICAgICAgZC0+bXdkbWFfbWFzaywgZC0+dWRtYV9tYXNrKTsKIAkJeGZlcl9tYXNrICY9IGF0YV9pZF94ZmVybWFzayhkLT5pZCk7CiAJCWlmIChhdGFfZG1hX2JsYWNrbGlzdGVkKGQpKQogCQkJeGZlcl9tYXNrICY9IH4oQVRBX01BU0tfTVdETUEgfCBBVEFfTUFTS19VRE1BKTsKLQkJLyogQXBwbHkgY2FibGUgcnVsZSBoZXJlLiBEb24ndCBhcHBseSBpdCBlYXJseSBiZWNhdXNlIHdoZW4KLQkJICAgd2UgaGFuZGxlIGhvdCBwbHVnIHRoZSBjYWJsZSB0eXBlIGNhbiBpdHNlbGYgY2hhbmdlICovCi0JCWlmIChhcC0+Y2JsID09IEFUQV9DQkxfUEFUQTQwKQotCQkJeGZlcl9tYXNrICY9IH4oMHhGOCA8PCBBVEFfU0hJRlRfVURNQSk7CiAJfQogCiAJaWYgKGF0YV9kbWFfYmxhY2tsaXN0ZWQoZGV2KSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IGRldiAldSBpcyBvbiBETUEgYmxhY2tsaXN0LCAiCi0JCSAgICAgICAiZGlzYWJsaW5nIERNQVxuIiwgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkgICAgICAgImRldmljZSBpcyBvbiBETUEgYmxhY2tsaXN0LCBkaXNhYmxpbmcgRE1BXG4iKTsKIAogCWlmIChocy0+ZmxhZ3MgJiBBVEFfSE9TVF9TSU1QTEVYKSB7CiAJCWlmIChocy0+c2ltcGxleF9jbGFpbWVkKQogCQkJeGZlcl9tYXNrICY9IH4oQVRBX01BU0tfTVdETUEgfCBBVEFfTUFTS19VRE1BKTsKIAl9CisKIAlpZiAoYXAtPm9wcy0+bW9kZV9maWx0ZXIpCiAJCXhmZXJfbWFzayA9IGFwLT5vcHMtPm1vZGVfZmlsdGVyKGFwLCBkZXYsIHhmZXJfbWFzayk7CiAKLQlhdGFfdW5wYWNrX3hmZXJtYXNrKHhmZXJfbWFzaywgJmRldi0+cGlvX21hc2ssICZkZXYtPm13ZG1hX21hc2ssCi0JCQkgICAgJmRldi0+dWRtYV9tYXNrKTsKKwlhdGFfdW5wYWNrX3hmZXJtYXNrKHhmZXJfbWFzaywgJmRldi0+cGlvX21hc2ssCisJCQkgICAgJmRldi0+bXdkbWFfbWFzaywgJmRldi0+dWRtYV9tYXNrKTsKIH0KIAogLyoqCiAgKglhdGFfZGV2X3NldF94ZmVybW9kZSAtIElzc3VlIFNFVCBGRUFUVVJFUyAtIFhGRVIgTU9ERSBjb21tYW5kCi0gKglAYXA6IFBvcnQgYXNzb2NpYXRlZCB3aXRoIGRldmljZSBAZGV2CiAgKglAZGV2OiBEZXZpY2UgdG8gd2hpY2ggY29tbWFuZCB3aWxsIGJlIHNlbnQKICAqCiAgKglJc3N1ZSBTRVQgRkVBVFVSRVMgLSBYRkVSIE1PREUgY29tbWFuZCB0byBkZXZpY2UgQGRldgpAQCAtMjcxNiw4ICszMDczLDcgQEAKICAqCTAgb24gc3VjY2VzcywgQUNfRVJSXyogbWFzayBvdGhlcndpc2UuCiAgKi8KIAotc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZGV2X3NldF94ZmVybW9kZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCQkgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2Rldl9zZXRfeGZlcm1vZGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOwogCXVuc2lnbmVkIGludCBlcnJfbWFzazsKQEAgLTI3MjUsMTQgKzMwODEsMTQgQEAKIAkvKiBzZXQgdXAgc2V0LWZlYXR1cmVzIHRhc2tmaWxlICovCiAJRFBSSU5USygic2V0IGZlYXR1cmVzIC0geGZlciBtb2RlXG4iKTsKIAotCWF0YV90Zl9pbml0KGFwLCAmdGYsIGRldi0+ZGV2bm8pOworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKIAl0Zi5jb21tYW5kID0gQVRBX0NNRF9TRVRfRkVBVFVSRVM7CiAJdGYuZmVhdHVyZSA9IFNFVEZFQVRVUkVTX1hGRVI7CiAJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CiAJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9OT0RBVEE7CiAJdGYubnNlY3QgPSBkZXYtPnhmZXJfbW9kZTsKIAotCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoYXAsIGRldiwgJnRmLCBETUFfTk9ORSwgTlVMTCwgMCk7CisJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX05PTkUsIE5VTEwsIDApOwogCiAJRFBSSU5USygiRVhJVCwgZXJyX21hc2s9JXhcbiIsIGVycl9tYXNrKTsKIAlyZXR1cm4gZXJyX21hc2s7CkBAIC0yNzQwLDcgKzMwOTYsNiBAQAogCiAvKioKICAqCWF0YV9kZXZfaW5pdF9wYXJhbXMgLSBJc3N1ZSBJTklUIERFViBQQVJBTVMgY29tbWFuZAotICoJQGFwOiBQb3J0IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UgQGRldgogICoJQGRldjogRGV2aWNlIHRvIHdoaWNoIGNvbW1hbmQgd2lsbCBiZSBzZW50CiAgKglAaGVhZHM6IE51bWJlciBvZiBoZWFkcyAodGFza2ZpbGUgcGFyYW1ldGVyKQogICoJQHNlY3RvcnM6IE51bWJlciBvZiBzZWN0b3JzICh0YXNrZmlsZSBwYXJhbWV0ZXIpCkBAIC0yNzUxLDExICszMTA2LDggQEAKICAqCVJFVFVSTlM6CiAgKgkwIG9uIHN1Y2Nlc3MsIEFDX0VSUl8qIG1hc2sgb3RoZXJ3aXNlLgogICovCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRhX2Rldl9pbml0X3BhcmFtcyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJCQl1MTYgaGVhZHMsCi0JCQkJCXUxNiBzZWN0b3JzKQorc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZGV2X2luaXRfcGFyYW1zKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkJCXUxNiBoZWFkcywgdTE2IHNlY3RvcnMpCiB7CiAJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKIAl1bnNpZ25lZCBpbnQgZXJyX21hc2s7CkBAIC0yNzY3LDE0ICszMTE5LDE0IEBACiAJLyogc2V0IHVwIGluaXQgZGV2IHBhcmFtcyB0YXNrZmlsZSAqLwogCURQUklOVEsoImluaXQgZGV2IHBhcmFtcyBcbiIpOwogCi0JYXRhX3RmX2luaXQoYXAsICZ0ZiwgZGV2LT5kZXZubyk7CisJYXRhX3RmX2luaXQoZGV2LCAmdGYpOwogCXRmLmNvbW1hbmQgPSBBVEFfQ01EX0lOSVRfREVWX1BBUkFNUzsKIAl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKIAl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKIAl0Zi5uc2VjdCA9IHNlY3RvcnM7CiAJdGYuZGV2aWNlIHw9IChoZWFkcyAtIDEpICYgMHgwZjsgLyogbWF4IGhlYWQgPSBudW0uIG9mIGhlYWRzIC0gMSAqLwogCi0JZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChhcCwgZGV2LCAmdGYsIERNQV9OT05FLCBOVUxMLCAwKTsKKwllcnJfbWFzayA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfTk9ORSwgTlVMTCwgMCk7CiAKIAlEUFJJTlRLKCJFWElULCBlcnJfbWFzaz0leFxuIiwgZXJyX21hc2spOwogCXJldHVybiBlcnJfbWFzazsKQEAgLTI5NTcsNiArMzMwOSw3IEBACiAJcWMtPm5fZWxlbSA9IDE7CiAJcWMtPm9yaWdfbl9lbGVtID0gMTsKIAlxYy0+YnVmX3ZpcnQgPSBidWY7CisJcWMtPm5ieXRlcyA9IGJ1ZmxlbjsKIAogCXNnID0gcWMtPl9fc2c7CiAJc2dfaW5pdF9vbmUoc2csIGJ1ZiwgYnVmbGVuKTsKQEAgLTMxNDAsMTM0ICszNDkzLDYgQEAKIH0KIAogLyoqCi0gKglhdGFfcG9sbF9xY19jb21wbGV0ZSAtIHR1cm4gaXJxIGJhY2sgb24gYW5kIGZpbmlzaCBxYwotICoJQHFjOiBDb21tYW5kIHRvIGNvbXBsZXRlCi0gKglAZXJyX21hc2s6IEFUQSBzdGF0dXMgcmVnaXN0ZXIgY29udGVudAotICoKLSAqCUxPQ0tJTkc6Ci0gKglOb25lLiAgKGdyYWJzIGhvc3QgbG9jaykKLSAqLwotCi12b2lkIGF0YV9wb2xsX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCi17Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCWFwLT5mbGFncyAmPSB+QVRBX0ZMQUdfTk9JTlRSOwotCWF0YV9pcnFfb24oYXApOwotCWF0YV9xY19jb21wbGV0ZShxYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICoJYXRhX3Bpb19wb2xsIC0gcG9sbCB1c2luZyBQSU8sIGRlcGVuZGluZyBvbiBjdXJyZW50IHN0YXRlCi0gKglAYXA6IHRoZSB0YXJnZXQgYXRhX3BvcnQKLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZS4gIChleGVjdXRpbmcgaW4ga2VybmVsIHRocmVhZCBjb250ZXh0KQotICoKLSAqCVJFVFVSTlM6Ci0gKgl0aW1lb3V0IHZhbHVlIHRvIHVzZQotICovCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGF0YV9waW9fcG9sbChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7Ci0JdTggc3RhdHVzOwotCXVuc2lnbmVkIGludCBwb2xsX3N0YXRlID0gSFNNX1NUX1VOS05PV047Ci0JdW5zaWduZWQgaW50IHJlZ19zdGF0ZSA9IEhTTV9TVF9VTktOT1dOOwotCi0JcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKLQlXQVJOX09OKHFjID09IE5VTEwpOwotCi0Jc3dpdGNoIChhcC0+aHNtX3Rhc2tfc3RhdGUpIHsKLQljYXNlIEhTTV9TVDoKLQljYXNlIEhTTV9TVF9QT0xMOgotCQlwb2xsX3N0YXRlID0gSFNNX1NUX1BPTEw7Ci0JCXJlZ19zdGF0ZSA9IEhTTV9TVDsKLQkJYnJlYWs7Ci0JY2FzZSBIU01fU1RfTEFTVDoKLQljYXNlIEhTTV9TVF9MQVNUX1BPTEw6Ci0JCXBvbGxfc3RhdGUgPSBIU01fU1RfTEFTVF9QT0xMOwotCQlyZWdfc3RhdGUgPSBIU01fU1RfTEFTVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKLQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgYXAtPnBpb190YXNrX3RpbWVvdXQpKSB7Ci0JCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX1RJTUVPVVQ7Ci0JCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfVE1PVVQ7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBwb2xsX3N0YXRlOwotCQlyZXR1cm4gQVRBX1NIT1JUX1BBVVNFOwotCX0KLQotCWFwLT5oc21fdGFza19zdGF0ZSA9IHJlZ19zdGF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKglhdGFfcGlvX2NvbXBsZXRlIC0gY2hlY2sgaWYgZHJpdmUgaXMgYnVzeSBvciBpZGxlCi0gKglAYXA6IHRoZSB0YXJnZXQgYXRhX3BvcnQKLSAqCi0gKglMT0NLSU5HOgotICoJTm9uZS4gIChleGVjdXRpbmcgaW4ga2VybmVsIHRocmVhZCBjb250ZXh0KQotICoKLSAqCVJFVFVSTlM6Ci0gKglOb24temVybyBpZiBxYyBjb21wbGV0ZWQsIHplcm8gb3RoZXJ3aXNlLgotICovCi0KLXN0YXRpYyBpbnQgYXRhX3Bpb19jb21wbGV0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwotCXU4IGRydl9zdGF0OwotCi0JLyoKLQkgKiBUaGlzIGlzIHB1cmVseSBoZXVyaXN0aWMuICBUaGlzIGlzIGEgZmFzdCBwYXRoLiAgU29tZXRpbWVzIHdoZW4KLQkgKiB3ZSBlbnRlciwgQlNZIHdpbGwgYmUgY2xlYXJlZCBpbiBhIGNoay1zdGF0dXMgb3IgdHdvLiAgSWYgbm90LAotCSAqIHRoZSBkcml2ZSBpcyBwcm9iYWJseSBzZWVraW5nIG9yIHNvbWV0aGluZy4gIFNub296ZSBmb3IgYSBjb3VwbGUKLQkgKiBtc2VjcywgdGhlbiBjaGstc3RhdHVzIGFnYWluLiAgSWYgc3RpbGwgYnVzeSwgZmFsbCBiYWNrIHRvCi0JICogSFNNX1NUX1BPTEwgc3RhdGUuCi0JICovCi0JZHJ2X3N0YXQgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTApOwotCWlmIChkcnZfc3RhdCAmIEFUQV9CVVNZKSB7Ci0JCW1zbGVlcCgyKTsKLQkJZHJ2X3N0YXQgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTApOwotCQlpZiAoZHJ2X3N0YXQgJiBBVEFfQlVTWSkgewotCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0xBU1RfUE9MTDsKLQkJCWFwLT5waW9fdGFza190aW1lb3V0ID0gamlmZmllcyArIEFUQV9UTU9VVF9QSU87Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JV0FSTl9PTihxYyA9PSBOVUxMKTsKLQotCWRydl9zdGF0ID0gYXRhX3dhaXRfaWRsZShhcCk7Ci0JaWYgKCFhdGFfb2soZHJ2X3N0YXQpKSB7Ci0JCXFjLT5lcnJfbWFzayB8PSBfX2FjX2Vycl9tYXNrKGRydl9zdGF0KTsKLQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7Ci0KLQlXQVJOX09OKHFjLT5lcnJfbWFzayk7Ci0JYXRhX3BvbGxfcWNfY29tcGxldGUocWMpOwotCi0JLyogYW5vdGhlciBjb21tYW5kIG1heSBzdGFydCBhdCB0aGlzIHBvaW50ICovCi0KLQlyZXR1cm4gMTsKLX0KLQotCi0vKioKICAqCXN3YXBfYnVmX2xlMTYgLSBzd2FwIGhhbHZlcyBvZiAxNi1iaXQgd29yZHMgaW4gcGxhY2UKICAqCUBidWY6ICBCdWZmZXIgdG8gc3dhcAogICoJQGJ1Zl93b3JkczogIE51bWJlciBvZiAxNi1iaXQgd29yZHMgaW4gYnVmZmVyLgpAQCAtMzI5MSw3ICszNTE2LDcgQEAKIAogLyoqCiAgKglhdGFfbW1pb19kYXRhX3hmZXIgLSBUcmFuc2ZlciBkYXRhIGJ5IE1NSU8KLSAqCUBhcDogcG9ydCB0byByZWFkL3dyaXRlCisgKglAYWRldjogZGV2aWNlIGZvciB0aGlzIEkvTwogICoJQGJ1ZjogZGF0YSBidWZmZXIKICAqCUBidWZsZW46IGJ1ZmZlciBsZW5ndGgKICAqCUB3cml0ZV9kYXRhOiByZWFkL3dyaXRlCkBAIC0zMzAyLDkgKzM1MjcsMTAgQEAKICAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwogCi1zdGF0aWMgdm9pZCBhdGFfbW1pb19kYXRhX3hmZXIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4sIGludCB3cml0ZV9kYXRhKQordm9pZCBhdGFfbW1pb19kYXRhX3hmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgCisJCQl1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSkKIHsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYWRldi0+YXA7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgaW50IHdvcmRzID0gYnVmbGVuID4+IDE7CiAJdTE2ICpidWYxNiA9ICh1MTYgKikgYnVmOwpAQCAtMzMzNiw3ICszNTYyLDcgQEAKIAogLyoqCiAgKglhdGFfcGlvX2RhdGFfeGZlciAtIFRyYW5zZmVyIGRhdGEgYnkgUElPCi0gKglAYXA6IHBvcnQgdG8gcmVhZC93cml0ZQorICoJQGFkZXY6IGRldmljZSB0byB0YXJnZXQKICAqCUBidWY6IGRhdGEgYnVmZmVyCiAgKglAYnVmbGVuOiBidWZmZXIgbGVuZ3RoCiAgKglAd3JpdGVfZGF0YTogcmVhZC93cml0ZQpAQCAtMzM0Nyw5ICszNTczLDEwIEBACiAgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCiAgKi8KIAotc3RhdGljIHZvaWQgYXRhX3Bpb19kYXRhX3hmZXIoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgY2hhciAqYnVmLAotCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHdyaXRlX2RhdGEpCit2b2lkIGF0YV9waW9fZGF0YV94ZmVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsIAorCQkgICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHdyaXRlX2RhdGEpCiB7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGFkZXYtPmFwOwogCXVuc2lnbmVkIGludCB3b3JkcyA9IGJ1ZmxlbiA+PiAxOwogCiAJLyogVHJhbnNmZXIgbXVsdGlwbGUgb2YgMiBieXRlcyAqLwpAQCAtMzM3NCwzOCArMzYwMSwyOSBAQAogfQogCiAvKioKLSAqCWF0YV9kYXRhX3hmZXIgLSBUcmFuc2ZlciBkYXRhIGZyb20vdG8gdGhlIGRhdGEgcmVnaXN0ZXIuCi0gKglAYXA6IHBvcnQgdG8gcmVhZC93cml0ZQorICoJYXRhX3Bpb19kYXRhX3hmZXJfbm9pcnEgLSBUcmFuc2ZlciBkYXRhIGJ5IFBJTworICoJQGFkZXY6IGRldmljZSB0byB0YXJnZXQKICAqCUBidWY6IGRhdGEgYnVmZmVyCiAgKglAYnVmbGVuOiBidWZmZXIgbGVuZ3RoCi0gKglAZG9fd3JpdGU6IHJlYWQvd3JpdGUKKyAqCUB3cml0ZV9kYXRhOiByZWFkL3dyaXRlCiAgKgotICoJVHJhbnNmZXIgZGF0YSBmcm9tL3RvIHRoZSBkZXZpY2UgZGF0YSByZWdpc3Rlci4KKyAqCVRyYW5zZmVyIGRhdGEgZnJvbS90byB0aGUgZGV2aWNlIGRhdGEgcmVnaXN0ZXIgYnkgUElPLiBEbyB0aGUgCisgKgl0cmFuc2ZlciB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKgogICoJTE9DS0lORzoKICAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwogCi1zdGF0aWMgdm9pZCBhdGFfZGF0YV94ZmVyKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKLQkJCSAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IGRvX3dyaXRlKQordm9pZCBhdGFfcGlvX2RhdGFfeGZlcl9ub2lycShzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSkKIHsKLQkvKiBNYWtlIHRoZSBjcmFwIGhhcmR3YXJlIHBheSB0aGUgY29zdHMgbm90IHRoZSBnb29kIHN0dWZmICovCi0JaWYgKHVubGlrZWx5KGFwLT5mbGFncyAmIEFUQV9GTEFHX0lSUV9NQVNLKSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQotCQkJYXRhX21taW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOwotCQllbHNlCi0JCQlhdGFfcGlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCX0gZWxzZSB7Ci0JCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19NTUlPKQotCQkJYXRhX21taW9fZGF0YV94ZmVyKGFwLCBidWYsIGJ1ZmxlbiwgZG9fd3JpdGUpOwotCQllbHNlCi0JCQlhdGFfcGlvX2RhdGFfeGZlcihhcCwgYnVmLCBidWZsZW4sIGRvX3dyaXRlKTsKLQl9CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYXRhX3Bpb19kYXRhX3hmZXIoYWRldiwgYnVmLCBidWZsZW4sIHdyaXRlX2RhdGEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAorCiAvKioKICAqCWF0YV9waW9fc2VjdG9yIC0gVHJhbnNmZXIgQVRBX1NFQ1RfU0laRSAoNTEyIGJ5dGVzKSBvZiBkYXRhLgogICoJQHFjOiBDb21tYW5kIG9uIGdvaW5nCkBAIC0zNDM1LDcgKzM2NTMsMjQgQEAKIAlwYWdlID0gbnRoX3BhZ2UocGFnZSwgKG9mZnNldCA+PiBQQUdFX1NISUZUKSk7CiAJb2Zmc2V0ICU9IFBBR0VfU0laRTsKIAotCWJ1ZiA9IGttYXAocGFnZSkgKyBvZmZzZXQ7CisJRFBSSU5USygiZGF0YSAlc1xuIiwgcWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFID8gIndyaXRlIiA6ICJyZWFkIik7CisKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQkvKiBGSVhNRTogdXNlIGEgYm91bmNlIGJ1ZmZlciAqLworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCWJ1ZiA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0lSUTApOworCisJCS8qIGRvIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciAqLworCQlhcC0+b3BzLT5kYXRhX3hmZXIocWMtPmRldiwgYnVmICsgb2Zmc2V0LCBBVEFfU0VDVF9TSVpFLCBkb193cml0ZSk7CisKKwkJa3VubWFwX2F0b21pYyhidWYsIEtNX0lSUTApOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfSBlbHNlIHsKKwkJYnVmID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlhcC0+b3BzLT5kYXRhX3hmZXIocWMtPmRldiwgYnVmICsgb2Zmc2V0LCBBVEFfU0VDVF9TSVpFLCBkb193cml0ZSk7CisJfQogCiAJcWMtPmN1cnNlY3QrKzsKIAlxYy0+Y3Vyc2dfb2ZzKys7CkBAIC0zNDQ0LDE0ICszNjc5LDY4IEBACiAJCXFjLT5jdXJzZysrOwogCQlxYy0+Y3Vyc2dfb2ZzID0gMDsKIAl9Cit9CiAKLQlEUFJJTlRLKCJkYXRhICVzXG4iLCBxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUgPyAid3JpdGUiIDogInJlYWQiKTsKKy8qKgorICoJYXRhX3Bpb19zZWN0b3JzIC0gVHJhbnNmZXIgb25lIG9yIG1hbnkgNTEyLWJ5dGUgc2VjdG9ycy4KKyAqCUBxYzogQ29tbWFuZCBvbiBnb2luZworICoKKyAqCVRyYW5zZmVyIG9uZSBvciBtYW55IEFUQV9TRUNUX1NJWkUgb2YgZGF0YSBmcm9tL3RvIHRoZQorICoJQVRBIGRldmljZSBmb3IgdGhlIERSUSByZXF1ZXN0LgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKi8KIAotCS8qIGRvIHRoZSBhY3R1YWwgZGF0YSB0cmFuc2ZlciAqLwotCWRvX3dyaXRlID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7Ci0JYXRhX2RhdGFfeGZlcihhcCwgYnVmLCBBVEFfU0VDVF9TSVpFLCBkb193cml0ZSk7CitzdGF0aWMgdm9pZCBhdGFfcGlvX3NlY3RvcnMoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlpZiAoaXNfbXVsdGlfdGFza2ZpbGUoJnFjLT50ZikpIHsKKwkJLyogUkVBRC9XUklURSBNVUxUSVBMRSAqLworCQl1bnNpZ25lZCBpbnQgbnNlY3Q7CiAKLQlrdW5tYXAocGFnZSk7CisJCVdBUk5fT04ocWMtPmRldi0+bXVsdGlfY291bnQgPT0gMCk7CisKKwkJbnNlY3QgPSBtaW4ocWMtPm5zZWN0IC0gcWMtPmN1cnNlY3QsIHFjLT5kZXYtPm11bHRpX2NvdW50KTsKKwkJd2hpbGUgKG5zZWN0LS0pCisJCQlhdGFfcGlvX3NlY3RvcihxYyk7CisJfSBlbHNlCisJCWF0YV9waW9fc2VjdG9yKHFjKTsKK30KKworLyoqCisgKglhdGFwaV9zZW5kX2NkYiAtIFdyaXRlIENEQiBieXRlcyB0byBoYXJkd2FyZQorICoJQGFwOiBQb3J0IHRvIHdoaWNoIEFUQVBJIGRldmljZSBpcyBhdHRhY2hlZC4KKyAqCUBxYzogVGFza2ZpbGUgY3VycmVudGx5IGFjdGl2ZQorICoKKyAqCVdoZW4gZGV2aWNlIGhhcyBpbmRpY2F0ZWQgaXRzIHJlYWRpbmVzcyB0byBhY2NlcHQKKyAqCWEgQ0RCLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIFNlbmQgdGhlIENEQi4KKyAqCisgKglMT0NLSU5HOgorICoJY2FsbGVyLgorICovCisKK3N0YXRpYyB2b2lkIGF0YXBpX3NlbmRfY2RiKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJLyogc2VuZCBTQ1NJIGNkYiAqLworCURQUklOVEsoInNlbmQgY2RiXG4iKTsKKwlXQVJOX09OKHFjLT5kZXYtPmNkYl9sZW4gPCAxMik7CisKKwlhcC0+b3BzLT5kYXRhX3hmZXIocWMtPmRldiwgcWMtPmNkYiwgcWMtPmRldi0+Y2RiX2xlbiwgMSk7CisJYXRhX2FsdHN0YXR1cyhhcCk7IC8qIGZsdXNoICovCisKKwlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCWNhc2UgQVRBX1BST1RfQVRBUEk6CisJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVDsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUFJPVF9BVEFQSV9OT0RBVEE6CisJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9MQVNUOworCQlicmVhazsKKwljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKKwkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0xBU1Q7CisJCS8qIGluaXRpYXRlIGJtZG1hICovCisJCWFwLT5vcHMtPmJtZG1hX3N0YXJ0KHFjKTsKKwkJYnJlYWs7CisJfQogfQogCiAvKioKQEAgLTM0OTIsMTEgKzM3ODEsMTEgQEAKIAkJdW5zaWduZWQgaW50IGk7CiAKIAkJaWYgKHdvcmRzKSAvKiB3YXJuaW5nIGlmIGJ5dGVzID4gMSAqLwotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6ICV1IGJ5dGVzIHRyYWlsaW5nIGRhdGFcbiIsCi0JCQkgICAgICAgYXAtPmlkLCBieXRlcyk7CisJCQlhdGFfZGV2X3ByaW50ayhxYy0+ZGV2LCBLRVJOX1dBUk5JTkcsCisJCQkJICAgICAgICIldSBieXRlcyB0cmFpbGluZyBkYXRhXG4iLCBieXRlcyk7CiAKIAkJZm9yIChpID0gMDsgaSA8IHdvcmRzOyBpKyspCi0JCQlhdGFfZGF0YV94ZmVyKGFwLCAodW5zaWduZWQgY2hhciopcGFkX2J1ZiwgMiwgZG9fd3JpdGUpOworCQkJYXAtPm9wcy0+ZGF0YV94ZmVyKHFjLT5kZXYsICh1bnNpZ25lZCBjaGFyKilwYWRfYnVmLCAyLCBkb193cml0ZSk7CiAKIAkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0xBU1Q7CiAJCXJldHVybjsKQEAgLTM1MTcsNyArMzgwNiwyNCBAQAogCS8qIGRvbid0IGNyb3NzIHBhZ2UgYm91bmRhcmllcyAqLwogCWNvdW50ID0gbWluKGNvdW50LCAodW5zaWduZWQgaW50KVBBR0VfU0laRSAtIG9mZnNldCk7CiAKLQlidWYgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OworCURQUklOVEsoImRhdGEgJXNcbiIsIHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSA/ICJ3cml0ZSIgOiAicmVhZCIpOworCisJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogRklYTUU6IHVzZSBib3VuY2UgYnVmZmVyICovCisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJYnVmID0ga21hcF9hdG9taWMocGFnZSwgS01fSVJRMCk7CisKKwkJLyogZG8gdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyICovCisJCWFwLT5vcHMtPmRhdGFfeGZlcihxYy0+ZGV2LCAgYnVmICsgb2Zmc2V0LCBjb3VudCwgZG9fd3JpdGUpOworCisJCWt1bm1hcF9hdG9taWMoYnVmLCBLTV9JUlEwKTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gZWxzZSB7CisJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJYXAtPm9wcy0+ZGF0YV94ZmVyKHFjLT5kZXYsICBidWYgKyBvZmZzZXQsIGNvdW50LCBkb193cml0ZSk7CisJfQogCiAJYnl0ZXMgLT0gY291bnQ7CiAJcWMtPmN1cmJ5dGVzICs9IGNvdW50OwpAQCAtMzUyOCwxMyArMzgzNCw2IEBACiAJCXFjLT5jdXJzZ19vZnMgPSAwOwogCX0KIAotCURQUklOVEsoImRhdGEgJXNcbiIsIHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSA/ICJ3cml0ZSIgOiAicmVhZCIpOwotCi0JLyogZG8gdGhlIGFjdHVhbCBkYXRhIHRyYW5zZmVyICovCi0JYXRhX2RhdGFfeGZlcihhcCwgYnVmLCBjb3VudCwgZG9fd3JpdGUpOwotCi0Ja3VubWFwKHBhZ2UpOwotCiAJaWYgKGJ5dGVzKQogCQlnb3RvIG5leHRfc2c7CiB9CkBAIC0zNTU2LDEwICszODU1LDE2IEBACiAJdW5zaWduZWQgaW50IGlyZWFzb24sIGJjX2xvLCBiY19oaSwgYnl0ZXM7CiAJaW50IGlfd3JpdGUsIGRvX3dyaXRlID0gKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkgPyAxIDogMDsKIAotCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZxYy0+dGYpOwotCWlyZWFzb24gPSBxYy0+dGYubnNlY3Q7Ci0JYmNfbG8gPSBxYy0+dGYubGJhbTsKLQliY19oaSA9IHFjLT50Zi5sYmFoOworCS8qIEFidXNlIHFjLT5yZXN1bHRfdGYgZm9yIHRlbXAgc3RvcmFnZSBvZiBpbnRlcm1lZGlhdGUgVEYKKwkgKiBoZXJlIHRvIHNhdmUgc29tZSBrZXJuZWwgc3RhY2sgdXNhZ2UuCisJICogRm9yIG5vcm1hbCBjb21wbGV0aW9uLCBxYy0+cmVzdWx0X3RmIGlzIG5vdCByZWxldmFudC4gRm9yCisJICogZXJyb3IsIHFjLT5yZXN1bHRfdGYgaXMgbGF0ZXIgb3ZlcndyaXR0ZW4gYnkgYXRhX3FjX2NvbXBsZXRlKCkuCisJICogU28sIHRoZSBjb3JyZWN0bmVzcyBvZiBxYy0+cmVzdWx0X3RmIGlzIG5vdCBhZmZlY3RlZC4KKwkgKi8KKwlhcC0+b3BzLT50Zl9yZWFkKGFwLCAmcWMtPnJlc3VsdF90Zik7CisJaXJlYXNvbiA9IHFjLT5yZXN1bHRfdGYubnNlY3Q7CisJYmNfbG8gPSBxYy0+cmVzdWx0X3RmLmxiYW07CisJYmNfaGkgPSBxYy0+cmVzdWx0X3RmLmxiYWg7CiAJYnl0ZXMgPSAoYmNfaGkgPDwgOCkgfCBiY19sbzsKIAogCS8qIHNoYWxsIGJlIGNsZWFyZWQgdG8gemVybywgaW5kaWNhdGluZyB4ZmVyIG9mIGRhdGEgKi8KQEAgLTM1NzEsMzEwICszODc2LDM2OCBAQAogCWlmIChkb193cml0ZSAhPSBpX3dyaXRlKQogCQlnb3RvIGVycl9vdXQ7CiAKKwlWUFJJTlRLKCJhdGEldTogeGZlcmluZyAlZCBieXRlc1xuIiwgYXAtPmlkLCBieXRlcyk7CisKIAlfX2F0YXBpX3Bpb19ieXRlcyhxYywgYnl0ZXMpOwogCiAJcmV0dXJuOwogCiBlcnJfb3V0OgotCXByaW50ayhLRVJOX0lORk8gImF0YSV1OiBkZXYgJXU6IEFUQVBJIGNoZWNrIGZhaWxlZFxuIiwKLQkgICAgICBhcC0+aWQsIGRldi0+ZGV2bm8pOworCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiQVRBUEkgY2hlY2sgZmFpbGVkXG4iKTsKIAlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKIAlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOwogfQogCiAvKioKLSAqCWF0YV9waW9fYmxvY2sgLSBzdGFydCBQSU8gb24gYSBibG9jaworICoJYXRhX2hzbV9va19pbl93cSAtIENoZWNrIGlmIHRoZSBxYyBjYW4gYmUgaGFuZGxlZCBpbiB0aGUgd29ya3F1ZXVlLgogICoJQGFwOiB0aGUgdGFyZ2V0IGF0YV9wb3J0CisgKglAcWM6IHFjIG9uIGdvaW5nCiAgKgotICoJTE9DS0lORzoKLSAqCU5vbmUuICAoZXhlY3V0aW5nIGluIGtlcm5lbCB0aHJlYWQgY29udGV4dCkKKyAqCVJFVFVSTlM6CisgKgkxIGlmIG9rIGluIHdvcmtxdWV1ZSwgMCBvdGhlcndpc2UuCiAgKi8KIAotc3RhdGljIHZvaWQgYXRhX3Bpb19ibG9jayhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQorc3RhdGljIGlubGluZSBpbnQgYXRhX2hzbV9va19pbl93cShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CisJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKQorCQlyZXR1cm4gMTsKKworCWlmIChhcC0+aHNtX3Rhc2tfc3RhdGUgPT0gSFNNX1NUX0ZJUlNUKSB7CisJCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfUElPICYmCisJCSAgICAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkKKwkJICAgIHJldHVybiAxOworCisJCWlmIChpc19hdGFwaV90YXNrZmlsZSgmcWMtPnRmKSAmJgorCQkgICAgIShxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19DREJfSU5UUikpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfaHNtX3FjX2NvbXBsZXRlIC0gZmluaXNoIGEgcWMgcnVubmluZyBvbiBzdGFuZGFyZCBIU00KKyAqCUBxYzogQ29tbWFuZCB0byBjb21wbGV0ZQorICoJQGluX3dxOiAxIGlmIGNhbGxlZCBmcm9tIHdvcmtxdWV1ZSwgMCBvdGhlcndpc2UKKyAqCisgKglGaW5pc2ggQHFjIHdoaWNoIGlzIHJ1bm5pbmcgb24gc3RhbmRhcmQgSFNNLgorICoKKyAqCUxPQ0tJTkc6CisgKglJZiBAaW5fd3EgaXMgemVybywgc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykuCisgKglPdGhlcndpc2UsIG5vbmUgb24gZW50cnkgYW5kIGdyYWJzIGhvc3QgbG9jay4KKyAqLworc3RhdGljIHZvaWQgYXRhX2hzbV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCBpbnQgaW5fd3EpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKKwkJaWYgKGluX3dxKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJCQkvKiBFSCBtaWdodCBoYXZlIGtpY2tlZCBpbiB3aGlsZSBob3N0X3NldCBsb2NrCisJCQkgKiBpcyByZWxlYXNlZC4KKwkJCSAqLworCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHFjLT50YWcpOworCQkJaWYgKHFjKSB7CisJCQkJaWYgKGxpa2VseSghKHFjLT5lcnJfbWFzayAmIEFDX0VSUl9IU00pKSkgeworCQkJCQlhdGFfaXJxX29uKGFwKTsKKwkJCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkJCQl9IGVsc2UKKwkJCQkJYXRhX3BvcnRfZnJlZXplKGFwKTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJaWYgKGxpa2VseSghKHFjLT5lcnJfbWFzayAmIEFDX0VSUl9IU00pKSkKKwkJCQlhdGFfcWNfY29tcGxldGUocWMpOworCQkJZWxzZQorCQkJCWF0YV9wb3J0X2ZyZWV6ZShhcCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoaW5fd3EpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisJCQlhdGFfaXJxX29uKGFwKTsKKwkJCWF0YV9xY19jb21wbGV0ZShxYyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZQorCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwl9CisKKwlhdGFfYWx0c3RhdHVzKGFwKTsgLyogZmx1c2ggKi8KK30KKworLyoqCisgKglhdGFfaHNtX21vdmUgLSBtb3ZlIHRoZSBIU00gdG8gdGhlIG5leHQgc3RhdGUuCisgKglAYXA6IHRoZSB0YXJnZXQgYXRhX3BvcnQKKyAqCUBxYzogcWMgb24gZ29pbmcKKyAqCUBzdGF0dXM6IGN1cnJlbnQgZGV2aWNlIHN0YXR1cworICoJQGluX3dxOiAxIGlmIGNhbGxlZCBmcm9tIHdvcmtxdWV1ZSwgMCBvdGhlcndpc2UKKyAqCisgKglSRVRVUk5TOgorICoJMSB3aGVuIHBvbGwgbmV4dCBzdGF0dXMgbmVlZGVkLCAwIG90aGVyd2lzZS4KKyAqLworaW50IGF0YV9oc21fbW92ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLAorCQkgdTggc3RhdHVzLCBpbnQgaW5fd3EpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHBvbGxfbmV4dDsKKworCVdBUk5fT04oKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKSA9PSAwKTsKKworCS8qIE1ha2Ugc3VyZSBhdGFfcWNfaXNzdWVfcHJvdCgpIGRvZXMgbm90IHRocm93IHRoaW5ncworCSAqIGxpa2UgRE1BIHBvbGxpbmcgaW50byB0aGUgd29ya3F1ZXVlLiBOb3RpY2UgdGhhdAorCSAqIGluX3dxIGlzIG5vdCBlcXVpdmFsZW50IHRvIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykuCisJICovCisJV0FSTl9PTihpbl93cSAhPSBhdGFfaHNtX29rX2luX3dxKGFwLCBxYykpOworCitmc21fc3RhcnQ6CisJRFBSSU5USygiYXRhJXU6IHByb3RvY29sICVkIHRhc2tfc3RhdGUgJWQgKGRldl9zdGF0IDB4JVgpXG4iLAorCQlhcC0+aWQsIHFjLT50Zi5wcm90b2NvbCwgYXAtPmhzbV90YXNrX3N0YXRlLCBzdGF0dXMpOworCisJc3dpdGNoIChhcC0+aHNtX3Rhc2tfc3RhdGUpIHsKKwljYXNlIEhTTV9TVF9GSVJTVDoKKwkJLyogU2VuZCBmaXJzdCBkYXRhIGJsb2NrIG9yIFBBQ0tFVCBDREIgKi8KKworCQkvKiBJZiBwb2xsaW5nLCB3ZSB3aWxsIHN0YXkgaW4gdGhlIHdvcmsgcXVldWUgYWZ0ZXIKKwkJICogc2VuZGluZyB0aGUgZGF0YS4gT3RoZXJ3aXNlLCBpbnRlcnJ1cHQgaGFuZGxlcgorCQkgKiB0YWtlcyBvdmVyIGFmdGVyIHNlbmRpbmcgdGhlIGRhdGEuCisJCSAqLworCQlwb2xsX25leHQgPSAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpOworCisJCS8qIGNoZWNrIGRldmljZSBzdGF0dXMgKi8KKwkJaWYgKHVubGlrZWx5KChzdGF0dXMgJiBBVEFfRFJRKSA9PSAwKSkgeworCQkJLyogaGFuZGxlIEJTWT0wLCBEUlE9MCBhcyBlcnJvciAqLworCQkJaWYgKGxpa2VseShzdGF0dXMgJiAoQVRBX0VSUiB8IEFUQV9ERikpKQorCQkJCS8qIGRldmljZSBzdG9wcyBIU00gZm9yIGFib3J0L2Vycm9yICovCisJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9ERVY7CisJCQllbHNlCisJCQkJLyogSFNNIHZpb2xhdGlvbi4gTGV0IEVIIGhhbmRsZSB0aGlzICovCisJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU007CisKKwkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9FUlI7CisJCQlnb3RvIGZzbV9zdGFydDsKKwkJfQorCisJCS8qIERldmljZSBzaG91bGQgbm90IGFzayBmb3IgZGF0YSB0cmFuc2ZlciAoRFJRPTEpCisJCSAqIHdoZW4gaXQgZmluZHMgc29tZXRoaW5nIHdyb25nLgorCQkgKiBXZSBpZ25vcmUgRFJRIGhlcmUgYW5kIHN0b3AgdGhlIEhTTSBieQorCQkgKiBjaGFuZ2luZyBoc21fdGFza19zdGF0ZSB0byBIU01fU1RfRVJSIGFuZAorCQkgKiBsZXQgdGhlIEVIIGFib3J0IHRoZSBjb21tYW5kIG9yIHJlc2V0IHRoZSBkZXZpY2UuCisJCSAqLworCQlpZiAodW5saWtlbHkoc3RhdHVzICYgKEFUQV9FUlIgfCBBVEFfREYpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJWQ6IERSUT0xIHdpdGggZGV2aWNlIGVycm9yLCBkZXZfc3RhdCAweCVYXG4iLAorCQkJICAgICAgIGFwLT5pZCwgc3RhdHVzKTsKKwkJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKKwkJCWdvdG8gZnNtX3N0YXJ0OworCQl9CisKKwkJLyogU2VuZCB0aGUgQ0RCIChhdGFwaSkgb3IgdGhlIGZpcnN0IGRhdGEgYmxvY2sgKGF0YSBwaW8gb3V0KS4KKwkJICogRHVyaW5nIHRoZSBzdGF0ZSB0cmFuc2l0aW9uLCBpbnRlcnJ1cHQgaGFuZGxlciBzaG91bGRuJ3QKKwkJICogYmUgaW52b2tlZCBiZWZvcmUgdGhlIGRhdGEgdHJhbnNmZXIgaXMgY29tcGxldGUgYW5kCisJCSAqIGhzbV90YXNrX3N0YXRlIGlzIGNoYW5nZWQuIEhlbmNlLCB0aGUgZm9sbG93aW5nIGxvY2tpbmcuCisJCSAqLworCQlpZiAoaW5fd3EpCisJCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfUElPKSB7CisJCQkvKiBQSU8gZGF0YSBvdXQgcHJvdG9jb2wuCisJCQkgKiBzZW5kIGZpcnN0IGRhdGEgYmxvY2suCisJCQkgKi8KKworCQkJLyogYXRhX3Bpb19zZWN0b3JzKCkgbWlnaHQgY2hhbmdlIHRoZSBzdGF0ZQorCQkJICogdG8gSFNNX1NUX0xBU1QuIHNvLCB0aGUgc3RhdGUgaXMgY2hhbmdlZCBoZXJlCisJCQkgKiBiZWZvcmUgYXRhX3Bpb19zZWN0b3JzKCkuCisJCQkgKi8KKwkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVDsKKwkJCWF0YV9waW9fc2VjdG9ycyhxYyk7CisJCQlhdGFfYWx0c3RhdHVzKGFwKTsgLyogZmx1c2ggKi8KKwkJfSBlbHNlCisJCQkvKiBzZW5kIENEQiAqLworCQkJYXRhcGlfc2VuZF9jZGIoYXAsIHFjKTsKKworCQlpZiAoaW5fd3EpCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogaWYgcG9sbGluZywgYXRhX3Bpb190YXNrKCkgaGFuZGxlcyB0aGUgcmVzdC4KKwkJICogb3RoZXJ3aXNlLCBpbnRlcnJ1cHQgaGFuZGxlciB0YWtlcyBvdmVyIGZyb20gaGVyZS4KKwkJICovCisJCWJyZWFrOworCisJY2FzZSBIU01fU1Q6CisJCS8qIGNvbXBsZXRlIGNvbW1hbmQgb3IgcmVhZC93cml0ZSB0aGUgZGF0YSByZWdpc3RlciAqLworCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJKSB7CisJCQkvKiBBVEFQSSBQSU8gcHJvdG9jb2wgKi8KKwkJCWlmICgoc3RhdHVzICYgQVRBX0RSUSkgPT0gMCkgeworCQkJCS8qIE5vIG1vcmUgZGF0YSB0byB0cmFuc2ZlciBvciBkZXZpY2UgZXJyb3IuCisJCQkJICogRGV2aWNlIGVycm9yIHdpbGwgYmUgdGFnZ2VkIGluIEhTTV9TVF9MQVNULgorCQkJCSAqLworCQkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9MQVNUOworCQkJCWdvdG8gZnNtX3N0YXJ0OworCQkJfQorCisJCQkvKiBEZXZpY2Ugc2hvdWxkIG5vdCBhc2sgZm9yIGRhdGEgdHJhbnNmZXIgKERSUT0xKQorCQkJICogd2hlbiBpdCBmaW5kcyBzb21ldGhpbmcgd3JvbmcuCisJCQkgKiBXZSBpZ25vcmUgRFJRIGhlcmUgYW5kIHN0b3AgdGhlIEhTTSBieQorCQkJICogY2hhbmdpbmcgaHNtX3Rhc2tfc3RhdGUgdG8gSFNNX1NUX0VSUiBhbmQKKwkJCSAqIGxldCB0aGUgRUggYWJvcnQgdGhlIGNvbW1hbmQgb3IgcmVzZXQgdGhlIGRldmljZS4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChBVEFfRVJSIHwgQVRBX0RGKSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGElZDogRFJRPTEgd2l0aCBkZXZpY2UgZXJyb3IsIGRldl9zdGF0IDB4JVhcbiIsCisJCQkJICAgICAgIGFwLT5pZCwgc3RhdHVzKTsKKwkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKKwkJCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOworCQkJCWdvdG8gZnNtX3N0YXJ0OworCQkJfQorCisJCQlhdGFwaV9waW9fYnl0ZXMocWMpOworCisJCQlpZiAodW5saWtlbHkoYXAtPmhzbV90YXNrX3N0YXRlID09IEhTTV9TVF9FUlIpKQorCQkJCS8qIGJhZCBpcmVhc29uIHJlcG9ydGVkIGJ5IGRldmljZSAqLworCQkJCWdvdG8gZnNtX3N0YXJ0OworCisJCX0gZWxzZSB7CisJCQkvKiBBVEEgUElPIHByb3RvY29sICovCisJCQlpZiAodW5saWtlbHkoKHN0YXR1cyAmIEFUQV9EUlEpID09IDApKSB7CisJCQkJLyogaGFuZGxlIEJTWT0wLCBEUlE9MCBhcyBlcnJvciAqLworCQkJCWlmIChsaWtlbHkoc3RhdHVzICYgKEFUQV9FUlIgfCBBVEFfREYpKSkKKwkJCQkJLyogZGV2aWNlIHN0b3BzIEhTTSBmb3IgYWJvcnQvZXJyb3IgKi8KKwkJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9ERVY7CisJCQkJZWxzZQorCQkJCQkvKiBIU00gdmlvbGF0aW9uLiBMZXQgRUggaGFuZGxlIHRoaXMgKi8KKwkJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU007CisKKwkJCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOworCQkJCWdvdG8gZnNtX3N0YXJ0OworCQkJfQorCisJCQkvKiBGb3IgUElPIHJlYWRzLCBzb21lIGRldmljZXMgbWF5IGFzayBmb3IKKwkJCSAqIGRhdGEgdHJhbnNmZXIgKERSUT0xKSBhbG9uZSB3aXRoIEVSUj0xLgorCQkJICogV2UgcmVzcGVjdCBEUlEgaGVyZSBhbmQgdHJhbnNmZXIgb25lCisJCQkgKiBibG9jayBvZiBqdW5rIGRhdGEgYmVmb3JlIGNoYW5naW5nIHRoZQorCQkJICogaHNtX3Rhc2tfc3RhdGUgdG8gSFNNX1NUX0VSUi4KKwkJCSAqCisJCQkgKiBGb3IgUElPIHdyaXRlcywgRVJSPTEgRFJRPTEgZG9lc24ndCBtYWtlCisJCQkgKiBzZW5zZSBzaW5jZSB0aGUgZGF0YSBibG9jayBoYXMgYmVlbgorCQkJICogdHJhbnNmZXJyZWQgdG8gdGhlIGRldmljZS4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChBVEFfRVJSIHwgQVRBX0RGKSkpIHsKKwkJCQkvKiBkYXRhIG1pZ2h0IGJlIGNvcnJwdXRlZCAqLworCQkJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfREVWOworCisJCQkJaWYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1dSSVRFKSkgeworCQkJCQlhdGFfcGlvX3NlY3RvcnMocWMpOworCQkJCQlhdGFfYWx0c3RhdHVzKGFwKTsKKwkJCQkJc3RhdHVzID0gYXRhX3dhaXRfaWRsZShhcCk7CisJCQkJfQorCisJCQkJaWYgKHN0YXR1cyAmIChBVEFfQlVTWSB8IEFUQV9EUlEpKQorCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKKworCQkJCS8qIGF0YV9waW9fc2VjdG9ycygpIG1pZ2h0IGNoYW5nZSB0aGUKKwkJCQkgKiBzdGF0ZSB0byBIU01fU1RfTEFTVC4gc28sIHRoZSBzdGF0ZQorCQkJCSAqIGlzIGNoYW5nZWQgYWZ0ZXIgYXRhX3Bpb19zZWN0b3JzKCkuCisJCQkJICovCisJCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKKwkJCQlnb3RvIGZzbV9zdGFydDsKKwkJCX0KKworCQkJYXRhX3Bpb19zZWN0b3JzKHFjKTsKKworCQkJaWYgKGFwLT5oc21fdGFza19zdGF0ZSA9PSBIU01fU1RfTEFTVCAmJgorCQkJICAgICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkpKSB7CisJCQkJLyogYWxsIGRhdGEgcmVhZCAqLworCQkJCWF0YV9hbHRzdGF0dXMoYXApOworCQkJCXN0YXR1cyA9IGF0YV93YWl0X2lkbGUoYXApOworCQkJCWdvdG8gZnNtX3N0YXJ0OworCQkJfQorCQl9CisKKwkJYXRhX2FsdHN0YXR1cyhhcCk7IC8qIGZsdXNoICovCisJCXBvbGxfbmV4dCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBIU01fU1RfTEFTVDoKKwkJaWYgKHVubGlrZWx5KCFhdGFfb2soc3RhdHVzKSkpIHsKKwkJCXFjLT5lcnJfbWFzayB8PSBfX2FjX2Vycl9tYXNrKHN0YXR1cyk7CisJCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOworCQkJZ290byBmc21fc3RhcnQ7CisJCX0KKworCQkvKiBubyBtb3JlIGRhdGEgdG8gdHJhbnNmZXIgKi8KKwkJRFBSSU5USygiYXRhJXU6IGRldiAldSBjb21tYW5kIGNvbXBsZXRlLCBkcnZfc3RhdCAweCV4XG4iLAorCQkJYXAtPmlkLCBxYy0+ZGV2LT5kZXZubywgc3RhdHVzKTsKKworCQlXQVJOX09OKHFjLT5lcnJfbWFzayk7CisKKwkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7CisKKwkJLyogY29tcGxldGUgdGFza2ZpbGUgdHJhbnNhY3Rpb24gKi8KKwkJYXRhX2hzbV9xY19jb21wbGV0ZShxYywgaW5fd3EpOworCisJCXBvbGxfbmV4dCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBIU01fU1RfRVJSOgorCQkvKiBtYWtlIHN1cmUgcWMtPmVycl9tYXNrIGlzIGF2YWlsYWJsZSB0bworCQkgKiBrbm93IHdoYXQncyB3cm9uZyBhbmQgcmVjb3ZlcgorCQkgKi8KKwkJV0FSTl9PTihxYy0+ZXJyX21hc2sgPT0gMCk7CisKKwkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7CisKKwkJLyogY29tcGxldGUgdGFza2ZpbGUgdHJhbnNhY3Rpb24gKi8KKwkJYXRhX2hzbV9xY19jb21wbGV0ZShxYywgaW5fd3EpOworCisJCXBvbGxfbmV4dCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBvbGxfbmV4dCA9IDA7CisJCUJVRygpOworCX0KKworCXJldHVybiBwb2xsX25leHQ7Cit9CisKK3N0YXRpYyB2b2lkIGF0YV9waW9fdGFzayh2b2lkICpfZGF0YSkKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjID0gX2RhdGE7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAl1OCBzdGF0dXM7CisJaW50IHBvbGxfbmV4dDsKKworZnNtX3N0YXJ0OgorCVdBUk5fT04oYXAtPmhzbV90YXNrX3N0YXRlID09IEhTTV9TVF9JRExFKTsKIAogCS8qCiAJICogVGhpcyBpcyBwdXJlbHkgaGV1cmlzdGljLiAgVGhpcyBpcyBhIGZhc3QgcGF0aC4KIAkgKiBTb21ldGltZXMgd2hlbiB3ZSBlbnRlciwgQlNZIHdpbGwgYmUgY2xlYXJlZCBpbgogCSAqIGEgY2hrLXN0YXR1cyBvciB0d28uICBJZiBub3QsIHRoZSBkcml2ZSBpcyBwcm9iYWJseSBzZWVraW5nCiAJICogb3Igc29tZXRoaW5nLiAgU25vb3plIGZvciBhIGNvdXBsZSBtc2VjcywgdGhlbgotCSAqIGNoay1zdGF0dXMgYWdhaW4uICBJZiBzdGlsbCBidXN5LCBmYWxsIGJhY2sgdG8KLQkgKiBIU01fU1RfUE9MTCBzdGF0ZS4KKwkgKiBjaGstc3RhdHVzIGFnYWluLiAgSWYgc3RpbGwgYnVzeSwgcXVldWUgZGVsYXllZCB3b3JrLgogCSAqLwogCXN0YXR1cyA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZLCA1KTsKIAlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKIAkJbXNsZWVwKDIpOwogCQlzdGF0dXMgPSBhdGFfYnVzeV93YWl0KGFwLCBBVEFfQlVTWSwgMTApOwogCQlpZiAoc3RhdHVzICYgQVRBX0JVU1kpIHsKLQkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9QT0xMOwotCQkJYXAtPnBpb190YXNrX3RpbWVvdXQgPSBqaWZmaWVzICsgQVRBX1RNT1VUX1BJTzsKKwkJCWF0YV9wb3J0X3F1ZXVlX3Rhc2soYXAsIGF0YV9waW9fdGFzaywgcWMsIEFUQV9TSE9SVF9QQVVTRSk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CiAKLQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCVdBUk5fT04ocWMgPT0gTlVMTCk7CisJLyogbW92ZSB0aGUgSFNNICovCisJcG9sbF9uZXh0ID0gYXRhX2hzbV9tb3ZlKGFwLCBxYywgc3RhdHVzLCAxKTsKIAotCS8qIGNoZWNrIGVycm9yICovCi0JaWYgKHN0YXR1cyAmIChBVEFfRVJSIHwgQVRBX0RGKSkgewotCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0RFVjsKLQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0VSUjsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHRyYW5zZmVyIGRhdGEgaWYgYW55ICovCi0JaWYgKGlzX2F0YXBpX3Rhc2tmaWxlKCZxYy0+dGYpKSB7Ci0JCS8qIERSUT0wIG1lYW5zIG5vIG1vcmUgZGF0YSB0byB0cmFuc2ZlciAqLwotCQlpZiAoKHN0YXR1cyAmIEFUQV9EUlEpID09IDApIHsKLQkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9MQVNUOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYXRhcGlfcGlvX2J5dGVzKHFjKTsKLQl9IGVsc2UgewotCQkvKiBoYW5kbGUgQlNZPTAsIERSUT0wIGFzIGVycm9yICovCi0JCWlmICgoc3RhdHVzICYgQVRBX0RSUSkgPT0gMCkgewotCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU007Ci0JCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJYXRhX3Bpb19zZWN0b3IocWMpOwotCX0KLQotCWF0YV9hbHRzdGF0dXMoYXApOyAvKiBmbHVzaCAqLwotfQotCi1zdGF0aWMgdm9pZCBhdGFfcGlvX2Vycm9yKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKLQotCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JV0FSTl9PTihxYyA9PSBOVUxMKTsKLQotCWlmIChxYy0+dGYuY29tbWFuZCAhPSBBVEFfQ01EX1BBQ0tFVCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IFBJTyBlcnJvclxuIiwgYXAtPmlkKTsKLQotCS8qIG1ha2Ugc3VyZSBxYy0+ZXJyX21hc2sgaXMgYXZhaWxhYmxlIHRvCi0JICoga25vdyB3aGF0J3Mgd3JvbmcgYW5kIHJlY292ZXIKKwkvKiBhbm90aGVyIGNvbW1hbmQgb3IgaW50ZXJydXB0IGhhbmRsZXIKKwkgKiBtYXkgYmUgcnVubmluZyBhdCB0aGlzIHBvaW50LgogCSAqLwotCVdBUk5fT04ocWMtPmVycl9tYXNrID09IDApOwotCi0JYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0lETEU7Ci0KLQlhdGFfcG9sbF9xY19jb21wbGV0ZShxYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0YV9waW9fdGFzayh2b2lkICpfZGF0YSkKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCBxY19jb21wbGV0ZWQ7Ci0KLWZzbV9zdGFydDoKLQl0aW1lb3V0ID0gMDsKLQlxY19jb21wbGV0ZWQgPSAwOwotCi0Jc3dpdGNoIChhcC0+aHNtX3Rhc2tfc3RhdGUpIHsKLQljYXNlIEhTTV9TVF9JRExFOgotCQlyZXR1cm47Ci0KLQljYXNlIEhTTV9TVDoKLQkJYXRhX3Bpb19ibG9jayhhcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBIU01fU1RfTEFTVDoKLQkJcWNfY29tcGxldGVkID0gYXRhX3Bpb19jb21wbGV0ZShhcCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBIU01fU1RfUE9MTDoKLQljYXNlIEhTTV9TVF9MQVNUX1BPTEw6Ci0JCXRpbWVvdXQgPSBhdGFfcGlvX3BvbGwoYXApOwotCQlicmVhazsKLQotCWNhc2UgSFNNX1NUX1RNT1VUOgotCWNhc2UgSFNNX1NUX0VSUjoKLQkJYXRhX3Bpb19lcnJvcihhcCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodGltZW91dCkKLQkJYXRhX3BvcnRfcXVldWVfdGFzayhhcCwgYXRhX3Bpb190YXNrLCBhcCwgdGltZW91dCk7Ci0JZWxzZSBpZiAoIXFjX2NvbXBsZXRlZCkKKwlpZiAocG9sbF9uZXh0KQogCQlnb3RvIGZzbV9zdGFydDsKIH0KIAogLyoqCi0gKglhdGFwaV9wYWNrZXRfdGFzayAtIFdyaXRlIENEQiBieXRlcyB0byBoYXJkd2FyZQotICoJQF9kYXRhOiBQb3J0IHRvIHdoaWNoIEFUQVBJIGRldmljZSBpcyBhdHRhY2hlZC4KLSAqCi0gKglXaGVuIGRldmljZSBoYXMgaW5kaWNhdGVkIGl0cyByZWFkaW5lc3MgdG8gYWNjZXB0Ci0gKglhIENEQiwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICBTZW5kIHRoZSBDREIuCi0gKglJZiBETUEgaXMgdG8gYmUgcGVyZm9ybWVkLCBleGl0IGltbWVkaWF0ZWx5LgotICoJT3RoZXJ3aXNlLCB3ZSBhcmUgaW4gcG9sbGluZyBtb2RlLCBzbyBwb2xsCi0gKglzdGF0dXMgdW5kZXIgb3BlcmF0aW9uIHN1Y2NlZWRzIG9yIGZhaWxzLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkKLSAqLwotCi1zdGF0aWMgdm9pZCBhdGFwaV9wYWNrZXRfdGFzayh2b2lkICpfZGF0YSkKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gX2RhdGE7Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKLQl1OCBzdGF0dXM7Ci0KLQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCVdBUk5fT04ocWMgPT0gTlVMTCk7Ci0JV0FSTl9PTighKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKSk7Ci0KLQkvKiBzbGVlcC13YWl0IGZvciBCU1kgdG8gY2xlYXIgKi8KLQlEUFJJTlRLKCJidXN5IHdhaXRcbiIpOwotCWlmIChhdGFfYnVzeV9zbGVlcChhcCwgQVRBX1RNT1VUX0NEQl9RVUlDSywgQVRBX1RNT1VUX0NEQikpIHsKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9USU1FT1VUOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCi0JLyogbWFrZSBzdXJlIERSUSBpcyBzZXQgKi8KLQlzdGF0dXMgPSBhdGFfY2hrX3N0YXR1cyhhcCk7Ci0JaWYgKChzdGF0dXMgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkgIT0gQVRBX0RSUSkgewotCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hTTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQotCS8qIHNlbmQgU0NTSSBjZGIgKi8KLQlEUFJJTlRLKCJzZW5kIGNkYlxuIik7Ci0JV0FSTl9PTihxYy0+ZGV2LT5jZGJfbGVuIDwgMTIpOwotCi0JaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9BVEFQSV9ETUEgfHwKLQkgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX05PREFUQSkgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCS8qIE9uY2Ugd2UncmUgZG9uZSBpc3N1aW5nIGNvbW1hbmQgYW5kIGtpY2tpbmcgYm1kbWEsCi0JCSAqIGlycSBoYW5kbGVyIHRha2VzIG92ZXIuICBUbyBub3QgbG9zZSBpcnEsIHdlIG5lZWQKLQkJICogdG8gY2xlYXIgTk9JTlRSIGZsYWcgYmVmb3JlIHNlbmRpbmcgY2RiLCBidXQKLQkJICogaW50ZXJydXB0IGhhbmRsZXIgc2hvdWxkbid0IGJlIGludm9rZWQgYmVmb3JlIHdlJ3JlCi0JCSAqIGZpbmlzaGVkLiAgSGVuY2UsIHRoZSBmb2xsb3dpbmcgbG9ja2luZy4KLQkJICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKLQkJYXAtPmZsYWdzICY9IH5BVEFfRkxBR19OT0lOVFI7Ci0JCWF0YV9kYXRhX3hmZXIoYXAsIHFjLT5jZGIsIHFjLT5kZXYtPmNkYl9sZW4sIDEpOwotCQlhdGFfYWx0c3RhdHVzKGFwKTsgLyogZmx1c2ggKi8KLQotCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkKLQkJCWFwLT5vcHMtPmJtZG1hX3N0YXJ0KHFjKTsJLyogaW5pdGlhdGUgYm1kbWEgKi8KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJYXRhX2RhdGFfeGZlcihhcCwgcWMtPmNkYiwgcWMtPmRldi0+Y2RiX2xlbiwgMSk7Ci0JCWF0YV9hbHRzdGF0dXMoYXApOyAvKiBmbHVzaCAqLwotCi0JCS8qIFBJTyBjb21tYW5kcyBhcmUgaGFuZGxlZCBieSBwb2xsaW5nICovCi0JCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVDsKLQkJYXRhX3BvcnRfcXVldWVfdGFzayhhcCwgYXRhX3Bpb190YXNrLCBhcCwgMCk7Ci0JfQotCi0JcmV0dXJuOwotCi1lcnJfb3V0OgotCWF0YV9wb2xsX3FjX2NvbXBsZXRlKHFjKTsKLX0KLQotLyoqCi0gKglhdGFfcWNfdGltZW91dCAtIEhhbmRsZSB0aW1lb3V0IG9mIHF1ZXVlZCBjb21tYW5kCi0gKglAcWM6IENvbW1hbmQgdGhhdCB0aW1lZCBvdXQKLSAqCi0gKglTb21lIHBhcnQgb2YgdGhlIGtlcm5lbCAoY3VycmVudGx5LCBvbmx5IHRoZSBTQ1NJIGxheWVyKQotICoJaGFzIG5vdGljZWQgdGhhdCB0aGUgYWN0aXZlIGNvbW1hbmQgb24gcG9ydCBAYXAgaGFzIG5vdAotICoJY29tcGxldGVkIGFmdGVyIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiB0aW1lLiAgSGFuZGxlIHRoaXMKLSAqCWNvbmRpdGlvbiBieSBkaXNhYmxpbmcgRE1BIChpZiBuZWNlc3NhcnkpIGFuZCBjb21wbGV0aW5nCi0gKgl0cmFuc2FjdGlvbnMsIHdpdGggZXJyb3IgaWYgbmVjZXNzYXJ5LgotICoKLSAqCVRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSAibG9zdCBpbnRlcnJ1cHQiLCB3aGVyZQotICoJZm9yIHNvbWUgcmVhc29uIChwb3NzaWJseSBoYXJkd2FyZSBidWcsIHBvc3NpYmx5IGRyaXZlciBidWcpCi0gKglhbiBpbnRlcnJ1cHQgd2FzIG5vdCBkZWxpdmVyZWQgdG8gdGhlIGRyaXZlciwgZXZlbiB0aG91Z2ggdGhlCi0gKgl0cmFuc2FjdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqCUxPQ0tJTkc6Ci0gKglJbmhlcml0ZWQgZnJvbSBTQ1NJIGxheWVyIChub25lLCBjYW4gc2xlZXApCi0gKi8KLQotc3RhdGljIHZvaWQgYXRhX3FjX3RpbWVvdXQoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gYXAtPmhvc3Rfc2V0OwotCXU4IGhvc3Rfc3RhdCA9IDAsIGRydl9zdGF0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUFJJTlRLKCJFTlRFUlxuIik7Ci0KLQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfSURMRTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCi0Jc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKLQotCWNhc2UgQVRBX1BST1RfRE1BOgotCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgotCQlob3N0X3N0YXQgPSBhcC0+b3BzLT5ibWRtYV9zdGF0dXMoYXApOwotCi0JCS8qIGJlZm9yZSB3ZSBkbyBhbnl0aGluZyBlbHNlLCBjbGVhciBETUEtU3RhcnQgYml0ICovCi0JCWFwLT5vcHMtPmJtZG1hX3N0b3AocWMpOwotCi0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCi0JZGVmYXVsdDoKLQkJYXRhX2FsdHN0YXR1cyhhcCk7Ci0JCWRydl9zdGF0ID0gYXRhX2Noa19zdGF0dXMoYXApOwotCi0JCS8qIGFjayBibWRtYSBpcnEgZXZlbnRzICovCi0JCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7Ci0KLQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogY29tbWFuZCAweCV4IHRpbWVvdXQsIHN0YXQgMHgleCBob3N0X3N0YXQgMHgleFxuIiwKLQkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0LCBob3N0X3N0YXQpOwotCi0JCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCi0JCXFjLT5lcnJfbWFzayB8PSBhY19lcnJfbWFzayhkcnZfc3RhdCk7Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Ci0KLQlhdGFfZWhfcWNfY29tcGxldGUocWMpOwotCi0JRFBSSU5USygiRVhJVFxuIik7Ci19Ci0KLS8qKgotICoJYXRhX2VuZ190aW1lb3V0IC0gSGFuZGxlIHRpbWVvdXQgb2YgcXVldWVkIGNvbW1hbmQKLSAqCUBhcDogUG9ydCBvbiB3aGljaCB0aW1lZC1vdXQgY29tbWFuZCBpcyBhY3RpdmUKLSAqCi0gKglTb21lIHBhcnQgb2YgdGhlIGtlcm5lbCAoY3VycmVudGx5LCBvbmx5IHRoZSBTQ1NJIGxheWVyKQotICoJaGFzIG5vdGljZWQgdGhhdCB0aGUgYWN0aXZlIGNvbW1hbmQgb24gcG9ydCBAYXAgaGFzIG5vdAotICoJY29tcGxldGVkIGFmdGVyIGEgc3BlY2lmaWVkIGxlbmd0aCBvZiB0aW1lLiAgSGFuZGxlIHRoaXMKLSAqCWNvbmRpdGlvbiBieSBkaXNhYmxpbmcgRE1BIChpZiBuZWNlc3NhcnkpIGFuZCBjb21wbGV0aW5nCi0gKgl0cmFuc2FjdGlvbnMsIHdpdGggZXJyb3IgaWYgbmVjZXNzYXJ5LgotICoKLSAqCVRoaXMgYWxzbyBoYW5kbGVzIHRoZSBjYXNlIG9mIHRoZSAibG9zdCBpbnRlcnJ1cHQiLCB3aGVyZQotICoJZm9yIHNvbWUgcmVhc29uIChwb3NzaWJseSBoYXJkd2FyZSBidWcsIHBvc3NpYmx5IGRyaXZlciBidWcpCi0gKglhbiBpbnRlcnJ1cHQgd2FzIG5vdCBkZWxpdmVyZWQgdG8gdGhlIGRyaXZlciwgZXZlbiB0aG91Z2ggdGhlCi0gKgl0cmFuc2FjdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgotICoKLSAqCUxPQ0tJTkc6Ci0gKglJbmhlcml0ZWQgZnJvbSBTQ1NJIGxheWVyIChub25lLCBjYW4gc2xlZXApCi0gKi8KLQotdm9pZCBhdGFfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCkKLXsKLQlEUFJJTlRLKCJFTlRFUlxuIik7Ci0KLQlhdGFfcWNfdGltZW91dChhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKSk7Ci0KLQlEUFJJTlRLKCJFWElUXG4iKTsKLX0KLQotLyoqCiAgKglhdGFfcWNfbmV3IC0gUmVxdWVzdCBhbiBhdmFpbGFibGUgQVRBIGNvbW1hbmQsIGZvciBxdWV1ZWluZwogICoJQGFwOiBQb3J0IGFzc29jaWF0ZWQgd2l0aCBkZXZpY2UgQGRldgogICoJQGRldjogRGV2aWNlIGZyb20gd2hvbSB3ZSByZXF1ZXN0IGFuIGF2YWlsYWJsZSBjb21tYW5kIHN0cnVjdHVyZQpAQCAtMzg4OCw5ICs0MjUxLDE0IEBACiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9RVUVVRTsgaSsrKQotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmFwLT5xYWN0aXZlKSkgewotCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGkpOworCS8qIG5vIGNvbW1hbmQgd2hpbGUgZnJvemVuICovCisJaWYgKHVubGlrZWx5KGFwLT5mbGFncyAmIEFUQV9GTEFHX0ZST1pFTikpCisJCXJldHVybiBOVUxMOworCisJLyogdGhlIGxhc3QgdGFnIGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCBjb21tYW5kLiAqLworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX1FVRVVFIC0gMTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmFwLT5xY19hbGxvY2F0ZWQpKSB7CisJCQlxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCBpKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTM5MDIsMTYgKzQyNzAsMTUgQEAKIAogLyoqCiAgKglhdGFfcWNfbmV3X2luaXQgLSBSZXF1ZXN0IGFuIGF2YWlsYWJsZSBBVEEgY29tbWFuZCwgYW5kIGluaXRpYWxpemUgaXQKLSAqCUBhcDogUG9ydCBhc3NvY2lhdGVkIHdpdGggZGV2aWNlIEBkZXYKICAqCUBkZXY6IERldmljZSBmcm9tIHdob20gd2UgcmVxdWVzdCBhbiBhdmFpbGFibGUgY29tbWFuZCBzdHJ1Y3R1cmUKICAqCiAgKglMT0NLSU5HOgogICoJTm9uZS4KICAqLwogCi1zdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCSAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogeworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOwogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAKIAlxYyA9IGF0YV9xY19uZXcoYXApOwpAQCAtMzk0NiwzNiArNDMxMywxNTMgQEAKIAlxYy0+ZmxhZ3MgPSAwOwogCXRhZyA9IHFjLT50YWc7CiAJaWYgKGxpa2VseShhdGFfdGFnX3ZhbGlkKHRhZykpKSB7Ci0JCWlmICh0YWcgPT0gYXAtPmFjdGl2ZV90YWcpCi0JCQlhcC0+YWN0aXZlX3RhZyA9IEFUQV9UQUdfUE9JU09OOwogCQlxYy0+dGFnID0gQVRBX1RBR19QT0lTT047Ci0JCWNsZWFyX2JpdCh0YWcsICZhcC0+cWFjdGl2ZSk7CisJCWNsZWFyX2JpdCh0YWcsICZhcC0+cWNfYWxsb2NhdGVkKTsKIAl9CiB9CiAKIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCiAJV0FSTl9PTihxYyA9PSBOVUxMKTsJLyogYXRhX3FjX2Zyb21fdGFnIF9taWdodF8gcmV0dXJuIE5VTEwgKi8KIAlXQVJOX09OKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19BQ1RJVkUpKTsKIAogCWlmIChsaWtlbHkocWMtPmZsYWdzICYgQVRBX1FDRkxBR19ETUFNQVApKQogCQlhdGFfc2dfY2xlYW4ocWMpOwogCisJLyogY29tbWFuZCBzaG91bGQgYmUgbWFya2VkIGluYWN0aXZlIGF0b21pY2FsbHkgd2l0aCBxYyBjb21wbGV0aW9uICovCisJaWYgKHFjLT50Zi5wcm90b2NvbCA9PSBBVEFfUFJPVF9OQ1EpCisJCWFwLT5zYWN0aXZlICY9IH4oMSA8PCBxYy0+dGFnKTsKKwllbHNlCisJCWFwLT5hY3RpdmVfdGFnID0gQVRBX1RBR19QT0lTT047CisKIAkvKiBhdGFwaTogbWFyayBxYyBhcyBpbmFjdGl2ZSB0byBwcmV2ZW50IHRoZSBpbnRlcnJ1cHQgaGFuZGxlcgogCSAqIGZyb20gY29tcGxldGluZyB0aGUgY29tbWFuZCB0d2ljZSBsYXRlciwgYmVmb3JlIHRoZSBlcnJvciBoYW5kbGVyCiAJICogaXMgY2FsbGVkLiAod2hlbiByYyAhPSAwIGFuZCBhdGFwaSByZXF1ZXN0IHNlbnNlIGlzIG5lZWRlZCkKIAkgKi8KIAlxYy0+ZmxhZ3MgJj0gfkFUQV9RQ0ZMQUdfQUNUSVZFOworCWFwLT5xY19hY3RpdmUgJj0gfigxIDw8IHFjLT50YWcpOwogCiAJLyogY2FsbCBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAJcWMtPmNvbXBsZXRlX2ZuKHFjKTsKIH0KIAorLyoqCisgKglhdGFfcWNfY29tcGxldGUgLSBDb21wbGV0ZSBhbiBhY3RpdmUgQVRBIGNvbW1hbmQKKyAqCUBxYzogQ29tbWFuZCB0byBjb21wbGV0ZQorICoJQGVycl9tYXNrOiBBVEEgU3RhdHVzIHJlZ2lzdGVyIGNvbnRlbnRzCisgKgorICoJSW5kaWNhdGUgdG8gdGhlIG1pZCBhbmQgdXBwZXIgbGF5ZXJzIHRoYXQgYW4gQVRBCisgKgljb21tYW5kIGhhcyBjb21wbGV0ZWQsIHdpdGggZWl0aGVyIGFuIG9rIG9yIG5vdC1vayBzdGF0dXMuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKi8KK3ZvaWQgYXRhX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCS8qIFhYWDogTmV3IEVIIGFuZCBvbGQgRUggdXNlIGRpZmZlcmVudCBtZWNoYW5pc21zIHRvCisJICogc3luY2hyb25pemUgRUggd2l0aCByZWd1bGFyIGV4ZWN1dGlvbiBwYXRoLgorCSAqCisJICogSW4gbmV3IEVILCBhIGZhaWxlZCBxYyBpcyBtYXJrZWQgd2l0aCBBVEFfUUNGTEFHX0ZBSUxFRC4KKwkgKiBOb3JtYWwgZXhlY3V0aW9uIHBhdGggaXMgcmVzcG9uc2libGUgZm9yIG5vdCBhY2Nlc3NpbmcgYQorCSAqIGZhaWxlZCBxYy4gIGxpYmF0YSBjb3JlIGVuZm9yY2VzIHRoZSBydWxlIGJ5IHJldHVybmluZyBOVUxMCisJICogZnJvbSBhdGFfcWNfZnJvbV90YWcoKSBmb3IgZmFpbGVkIHFjcy4KKwkgKgorCSAqIE9sZCBFSCBkZXBlbmRzIG9uIGF0YV9xY19jb21wbGV0ZSgpIG51bGxpZnlpbmcgY29tcGxldGlvbgorCSAqIHJlcXVlc3RzIGlmIEFUQV9RQ0ZMQUdfRUhfU0NIRURVTEVEIGlzIHNldC4gIE9sZCBFSCBkb2VzCisJICogbm90IHN5bmNocm9uaXplIHdpdGggaW50ZXJydXB0IGhhbmRsZXIuICBPbmx5IFBJTyB0YXNrIGlzCisJICogdGFrZW4gY2FyZSBvZi4KKwkgKi8KKwlpZiAoYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikgeworCQlXQVJOX09OKGFwLT5mbGFncyAmIEFUQV9GTEFHX0ZST1pFTik7CisKKwkJaWYgKHVubGlrZWx5KHFjLT5lcnJfbWFzaykpCisJCQlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19GQUlMRUQ7CisKKwkJaWYgKHVubGlrZWx5KHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSkgeworCQkJaWYgKCFhdGFfdGFnX2ludGVybmFsKHFjLT50YWcpKSB7CisJCQkJLyogYWx3YXlzIGZpbGwgcmVzdWx0IFRGIGZvciBmYWlsZWQgcWMgKi8KKwkJCQlhcC0+b3BzLT50Zl9yZWFkKGFwLCAmcWMtPnJlc3VsdF90Zik7CisJCQkJYXRhX3FjX3NjaGVkdWxlX2VoKHFjKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKworCQkvKiByZWFkIHJlc3VsdCBURiBpZiByZXF1ZXN0ZWQgKi8KKwkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfUkVTVUxUX1RGKQorCQkJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnFjLT5yZXN1bHRfdGYpOworCisJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwl9IGVsc2UgeworCQlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19FSF9TQ0hFRFVMRUQpCisJCQlyZXR1cm47CisKKwkJLyogcmVhZCByZXN1bHQgVEYgaWYgZmFpbGVkIG9yIHJlcXVlc3RlZCAqLworCQlpZiAocWMtPmVycl9tYXNrIHx8IHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfUkVTVUxUX1RGKQorCQkJYXAtPm9wcy0+dGZfcmVhZChhcCwgJnFjLT5yZXN1bHRfdGYpOworCisJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwl9Cit9CisKKy8qKgorICoJYXRhX3FjX2NvbXBsZXRlX211bHRpcGxlIC0gQ29tcGxldGUgbXVsdGlwbGUgcWNzIHN1Y2Nlc3NmdWxseQorICoJQGFwOiBwb3J0IGluIHF1ZXN0aW9uCisgKglAcWNfYWN0aXZlOiBuZXcgcWNfYWN0aXZlIG1hc2sKKyAqCUBmaW5pc2hfcWM6IExMREQgY2FsbGJhY2sgaW52b2tlZCBiZWZvcmUgY29tcGxldGluZyBhIHFjCisgKgorICoJQ29tcGxldGUgaW4tZmxpZ2h0IGNvbW1hbmRzLiAgVGhpcyBmdW5jdGlvbnMgaXMgbWVhbnQgdG8gYmUKKyAqCWNhbGxlZCBmcm9tIGxvdy1sZXZlbCBkcml2ZXIncyBpbnRlcnJ1cHQgcm91dGluZSB0byBjb21wbGV0ZQorICoJcmVxdWVzdHMgbm9ybWFsbHkuICBhcC0+cWNfYWN0aXZlIGFuZCBAcWNfYWN0aXZlIGlzIGNvbXBhcmVkCisgKglhbmQgY29tbWFuZHMgYXJlIGNvbXBsZXRlZCBhY2NvcmRpbmdseS4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJTnVtYmVyIG9mIGNvbXBsZXRlZCBjb21tYW5kcyBvbiBzdWNjZXNzLCAtZXJybm8gb3RoZXJ3aXNlLgorICovCitpbnQgYXRhX3FjX2NvbXBsZXRlX211bHRpcGxlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHUzMiBxY19hY3RpdmUsCisJCQkgICAgIHZvaWQgKCpmaW5pc2hfcWMpKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqKSkKK3sKKwlpbnQgbnJfZG9uZSA9IDA7CisJdTMyIGRvbmVfbWFzazsKKwlpbnQgaTsKKworCWRvbmVfbWFzayA9IGFwLT5xY19hY3RpdmUgXiBxY19hY3RpdmU7CisKKwlpZiAodW5saWtlbHkoZG9uZV9tYXNrICYgcWNfYWN0aXZlKSkgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiaWxsZWdhbCBxY19hY3RpdmUgdHJhbnNpdGlvbiAiCisJCQkJIiglMDh4LT4lMDh4KVxuIiwgYXAtPnFjX2FjdGl2ZSwgcWNfYWN0aXZlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfUVVFVUU7IGkrKykgeworCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCWlmICghKGRvbmVfbWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgocWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGkpKSkgeworCQkJaWYgKGZpbmlzaF9xYykKKwkJCQlmaW5pc2hfcWMocWMpOworCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkJCW5yX2RvbmUrKzsKKwkJfQorCX0KKworCXJldHVybiBucl9kb25lOworfQorCiBzdGF0aWMgaW5saW5lIGludCBhdGFfc2hvdWxkX2RtYV9tYXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCiAJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKKwljYXNlIEFUQV9QUk9UX05DUToKIAljYXNlIEFUQV9QUk9UX0RNQToKIAljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKIAkJcmV0dXJuIDE7CkBAIC00MDEwLDggKzQ0OTQsMjIgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCi0JcWMtPmFwLT5hY3RpdmVfdGFnID0gcWMtPnRhZzsKKwkvKiBNYWtlIHN1cmUgb25seSBvbmUgbm9uLU5DUSBjb21tYW5kIGlzIG91dHN0YW5kaW5nLiAgVGhlCisJICogY2hlY2sgaXMgc2tpcHBlZCBmb3Igb2xkIEVIIGJlY2F1c2UgaXQgcmV1c2VzIGFjdGl2ZSBxYyB0bworCSAqIHJlcXVlc3QgQVRBUEkgc2Vuc2UuCisJICovCisJV0FSTl9PTihhcC0+b3BzLT5lcnJvcl9oYW5kbGVyICYmIGF0YV90YWdfdmFsaWQoYXAtPmFjdGl2ZV90YWcpKTsKKworCWlmIChxYy0+dGYucHJvdG9jb2wgPT0gQVRBX1BST1RfTkNRKSB7CisJCVdBUk5fT04oYXAtPnNhY3RpdmUgJiAoMSA8PCBxYy0+dGFnKSk7CisJCWFwLT5zYWN0aXZlIHw9IDEgPDwgcWMtPnRhZzsKKwl9IGVsc2UgeworCQlXQVJOX09OKGFwLT5zYWN0aXZlKTsKKwkJYXAtPmFjdGl2ZV90YWcgPSBxYy0+dGFnOworCX0KKwogCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0FDVElWRTsKKwlhcC0+cWNfYWN0aXZlIHw9IDEgPDwgcWMtPnRhZzsKIAogCWlmIChhdGFfc2hvdWxkX2RtYV9tYXAocWMpKSB7CiAJCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NHKSB7CkBAIC00MDYxLDQzICs0NTU5LDEwNSBAQAogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CiAKKwkvKiBVc2UgcG9sbGluZyBwaW8gaWYgdGhlIExMRCBkb2Vzbid0IGhhbmRsZQorCSAqIGludGVycnVwdCBkcml2ZW4gcGlvIGFuZCBhdGFwaSBDREIgaW50ZXJydXB0LgorCSAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QSU9fUE9MTElORykgeworCQlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCQljYXNlIEFUQV9QUk9UX1BJTzoKKwkJY2FzZSBBVEFfUFJPVF9BVEFQSToKKwkJY2FzZSBBVEFfUFJPVF9BVEFQSV9OT0RBVEE6CisJCQlxYy0+dGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7CisJCQlicmVhazsKKwkJY2FzZSBBVEFfUFJPVF9BVEFQSV9ETUE6CisJCQlpZiAocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfQ0RCX0lOVFIpCisJCQkJLyogc2VlIGF0YV9kbWFfYmxhY2tsaXN0ZWQoKSAqLworCQkJCUJVRygpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIHNlbGVjdCB0aGUgZGV2aWNlICovCiAJYXRhX2Rldl9zZWxlY3QoYXAsIHFjLT5kZXYtPmRldm5vLCAxLCAwKTsKIAorCS8qIHN0YXJ0IHRoZSBjb21tYW5kICovCiAJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKIAljYXNlIEFUQV9QUk9UX05PREFUQToKKwkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKQorCQkJYXRhX3FjX3NldF9wb2xsaW5nKHFjKTsKKwogCQlhdGFfdGZfdG9faG9zdChhcCwgJnFjLT50Zik7CisJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9MQVNUOworCisJCWlmIChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykKKwkJCWF0YV9wb3J0X3F1ZXVlX3Rhc2soYXAsIGF0YV9waW9fdGFzaywgcWMsIDApOworCiAJCWJyZWFrOwogCiAJY2FzZSBBVEFfUFJPVF9ETUE6CisJCVdBUk5fT04ocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpOworCiAJCWFwLT5vcHMtPnRmX2xvYWQoYXAsICZxYy0+dGYpOwkgLyogbG9hZCB0ZiByZWdpc3RlcnMgKi8KIAkJYXAtPm9wcy0+Ym1kbWFfc2V0dXAocWMpOwkgICAgLyogc2V0IHVwIGJtZG1hICovCiAJCWFwLT5vcHMtPmJtZG1hX3N0YXJ0KHFjKTsJICAgIC8qIGluaXRpYXRlIGJtZG1hICovCisJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9MQVNUOwogCQlicmVhazsKIAotCWNhc2UgQVRBX1BST1RfUElPOiAvKiBsb2FkIHRmIHJlZ2lzdGVycywgaW5pdGlhdGUgcG9sbGluZyBwaW8gKi8KLQkJYXRhX3FjX3NldF9wb2xsaW5nKHFjKTsKKwljYXNlIEFUQV9QUk9UX1BJTzoKKwkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKQorCQkJYXRhX3FjX3NldF9wb2xsaW5nKHFjKTsKKwogCQlhdGFfdGZfdG9faG9zdChhcCwgJnFjLT50Zik7Ci0JCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVDsKLQkJYXRhX3BvcnRfcXVldWVfdGFzayhhcCwgYXRhX3Bpb190YXNrLCBhcCwgMCk7CisKKwkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkgeworCQkJLyogUElPIGRhdGEgb3V0IHByb3RvY29sICovCisJCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRklSU1Q7CisJCQlhdGFfcG9ydF9xdWV1ZV90YXNrKGFwLCBhdGFfcGlvX3Rhc2ssIHFjLCAwKTsKKworCQkJLyogYWx3YXlzIHNlbmQgZmlyc3QgZGF0YSBibG9jayB1c2luZworCQkJICogdGhlIGF0YV9waW9fdGFzaygpIGNvZGVwYXRoLgorCQkJICovCisJCX0gZWxzZSB7CisJCQkvKiBQSU8gZGF0YSBpbiBwcm90b2NvbCAqLworCQkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUOworCisJCQlpZiAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpCisJCQkJYXRhX3BvcnRfcXVldWVfdGFzayhhcCwgYXRhX3Bpb190YXNrLCBxYywgMCk7CisKKwkJCS8qIGlmIHBvbGxpbmcsIGF0YV9waW9fdGFzaygpIGhhbmRsZXMgdGhlIHJlc3QuCisJCQkgKiBvdGhlcndpc2UsIGludGVycnVwdCBoYW5kbGVyIHRha2VzIG92ZXIgZnJvbSBoZXJlLgorCQkJICovCisJCX0KKwogCQlicmVhazsKIAogCWNhc2UgQVRBX1BST1RfQVRBUEk6Ci0JCWF0YV9xY19zZXRfcG9sbGluZyhxYyk7Ci0JCWF0YV90Zl90b19ob3N0KGFwLCAmcWMtPnRmKTsKLQkJYXRhX3BvcnRfcXVldWVfdGFzayhhcCwgYXRhcGlfcGFja2V0X3Rhc2ssIGFwLCAwKTsKLQkJYnJlYWs7Ci0KIAljYXNlIEFUQV9QUk9UX0FUQVBJX05PREFUQToKLQkJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX05PSU5UUjsKKwkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKQorCQkJYXRhX3FjX3NldF9wb2xsaW5nKHFjKTsKKwogCQlhdGFfdGZfdG9faG9zdChhcCwgJnFjLT50Zik7Ci0JCWF0YV9wb3J0X3F1ZXVlX3Rhc2soYXAsIGF0YXBpX3BhY2tldF90YXNrLCBhcCwgMCk7CisKKwkJYXAtPmhzbV90YXNrX3N0YXRlID0gSFNNX1NUX0ZJUlNUOworCisJCS8qIHNlbmQgY2RiIGJ5IHBvbGxpbmcgaWYgbm8gY2RiIGludGVycnVwdCAqLworCQlpZiAoKCEocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfQ0RCX0lOVFIpKSB8fAorCQkgICAgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkKKwkJCWF0YV9wb3J0X3F1ZXVlX3Rhc2soYXAsIGF0YV9waW9fdGFzaywgcWMsIDApOwogCQlicmVhazsKIAogCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgotCQlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfTk9JTlRSOworCQlXQVJOX09OKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKTsKKwogCQlhcC0+b3BzLT50Zl9sb2FkKGFwLCAmcWMtPnRmKTsJIC8qIGxvYWQgdGYgcmVnaXN0ZXJzICovCiAJCWFwLT5vcHMtPmJtZG1hX3NldHVwKHFjKTsJICAgIC8qIHNldCB1cCBibWRtYSAqLwotCQlhdGFfcG9ydF9xdWV1ZV90YXNrKGFwLCBhdGFwaV9wYWNrZXRfdGFzaywgYXAsIDApOworCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRklSU1Q7CisKKwkJLyogc2VuZCBjZGIgYnkgcG9sbGluZyBpZiBubyBjZGIgaW50ZXJydXB0ICovCisJCWlmICghKHFjLT5kZXYtPmZsYWdzICYgQVRBX0RGTEFHX0NEQl9JTlRSKSkKKwkJCWF0YV9wb3J0X3F1ZXVlX3Rhc2soYXAsIGF0YV9waW9fdGFzaywgcWMsIDApOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MTI3LDUyICs0Njg3LDY2IEBACiBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9ob3N0X2ludHIgKHN0cnVjdCBhdGFfcG9ydCAqYXAsCiAJCQkJICAgc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKLQl1OCBzdGF0dXMsIGhvc3Rfc3RhdDsKKwl1OCBzdGF0dXMsIGhvc3Rfc3RhdCA9IDA7CiAKLQlzd2l0Y2ggKHFjLT50Zi5wcm90b2NvbCkgeworCVZQUklOVEsoImF0YSV1OiBwcm90b2NvbCAlZCB0YXNrX3N0YXRlICVkXG4iLAorCQlhcC0+aWQsIHFjLT50Zi5wcm90b2NvbCwgYXAtPmhzbV90YXNrX3N0YXRlKTsKIAotCWNhc2UgQVRBX1BST1RfRE1BOgotCWNhc2UgQVRBX1BST1RfQVRBUElfRE1BOgotCWNhc2UgQVRBX1BST1RfQVRBUEk6Ci0JCS8qIGNoZWNrIHN0YXR1cyBvZiBETUEgZW5naW5lICovCi0JCWhvc3Rfc3RhdCA9IGFwLT5vcHMtPmJtZG1hX3N0YXR1cyhhcCk7Ci0JCVZQUklOVEsoImF0YSV1OiBob3N0X3N0YXQgMHglWFxuIiwgYXAtPmlkLCBob3N0X3N0YXQpOworCS8qIENoZWNrIHdoZXRoZXIgd2UgYXJlIGV4cGVjdGluZyBpbnRlcnJ1cHQgaW4gdGhpcyBzdGF0ZSAqLworCXN3aXRjaCAoYXAtPmhzbV90YXNrX3N0YXRlKSB7CisJY2FzZSBIU01fU1RfRklSU1Q6CisJCS8qIFNvbWUgcHJlLUFUQVBJLTQgZGV2aWNlcyBhc3NlcnQgSU5UUlEKKwkJICogYXQgdGhpcyBzdGF0ZSB3aGVuIHJlYWR5IHRvIHJlY2VpdmUgQ0RCLgorCQkgKi8KIAotCQkvKiBpZiBpdCdzIG5vdCBvdXIgaXJxLi4uICovCi0JCWlmICghKGhvc3Rfc3RhdCAmIEFUQV9ETUFfSU5UUikpCisJCS8qIENoZWNrIHRoZSBBVEFfREZMQUdfQ0RCX0lOVFIgZmxhZyBpcyBlbm91Z2ggaGVyZS4KKwkJICogVGhlIGZsYWcgd2FzIHR1cm5lZCBvbiBvbmx5IGZvciBhdGFwaSBkZXZpY2VzLgorCQkgKiBObyBuZWVkIHRvIGNoZWNrIGlzX2F0YXBpX3Rhc2tmaWxlKCZxYy0+dGYpIGFnYWluLgorCQkgKi8KKwkJaWYgKCEocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfQ0RCX0lOVFIpKQogCQkJZ290byBpZGxlX2lycTsKLQotCQkvKiBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSwgY2xlYXIgRE1BLVN0YXJ0IGJpdCAqLwotCQlhcC0+b3BzLT5ibWRtYV9zdG9wKHFjKTsKLQotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQotCWNhc2UgQVRBX1BST1RfQVRBUElfTk9EQVRBOgotCWNhc2UgQVRBX1BST1RfTk9EQVRBOgotCQkvKiBjaGVjayBhbHRzdGF0dXMgKi8KLQkJc3RhdHVzID0gYXRhX2FsdHN0YXR1cyhhcCk7Ci0JCWlmIChzdGF0dXMgJiBBVEFfQlVTWSkKLQkJCWdvdG8gaWRsZV9pcnE7Ci0KLQkJLyogY2hlY2sgbWFpbiBzdGF0dXMsIGNsZWFyaW5nIElOVFJRICovCi0JCXN0YXR1cyA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKLQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIEFUQV9CVVNZKSkKLQkJCWdvdG8gaWRsZV9pcnE7Ci0JCURQUklOVEsoImF0YSV1OiBwcm90b2NvbCAlZCAoZGV2X3N0YXQgMHglWClcbiIsCi0JCQlhcC0+aWQsIHFjLT50Zi5wcm90b2NvbCwgc3RhdHVzKTsKLQotCQkvKiBhY2sgYm1kbWEgaXJxIGV2ZW50cyAqLwotCQlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOwotCi0JCS8qIGNvbXBsZXRlIHRhc2tmaWxlIHRyYW5zYWN0aW9uICovCi0JCXFjLT5lcnJfbWFzayB8PSBhY19lcnJfbWFzayhzdGF0dXMpOwotCQlhdGFfcWNfY29tcGxldGUocWMpOwogCQlicmVhazsKKwljYXNlIEhTTV9TVF9MQVNUOgorCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkgeworCQkJLyogY2hlY2sgc3RhdHVzIG9mIERNQSBlbmdpbmUgKi8KKwkJCWhvc3Rfc3RhdCA9IGFwLT5vcHMtPmJtZG1hX3N0YXR1cyhhcCk7CisJCQlWUFJJTlRLKCJhdGEldTogaG9zdF9zdGF0IDB4JVhcbiIsIGFwLT5pZCwgaG9zdF9zdGF0KTsKIAorCQkJLyogaWYgaXQncyBub3Qgb3VyIGlycS4uLiAqLworCQkJaWYgKCEoaG9zdF9zdGF0ICYgQVRBX0RNQV9JTlRSKSkKKwkJCQlnb3RvIGlkbGVfaXJxOworCisJCQkvKiBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSwgY2xlYXIgRE1BLVN0YXJ0IGJpdCAqLworCQkJYXAtPm9wcy0+Ym1kbWFfc3RvcChxYyk7CisKKwkJCWlmICh1bmxpa2VseShob3N0X3N0YXQgJiBBVEFfRE1BX0VSUikpIHsKKwkJCQkvKiBlcnJvciB3aGVuIHRyYW5zZmVyaW5nIGRhdGEgdG8vZnJvbSBtZW1vcnkgKi8KKwkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX0hPU1RfQlVTOworCQkJCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9FUlI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIU01fU1Q6CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWdvdG8gaWRsZV9pcnE7CiAJfQogCisJLyogY2hlY2sgYWx0c3RhdHVzICovCisJc3RhdHVzID0gYXRhX2FsdHN0YXR1cyhhcCk7CisJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQorCQlnb3RvIGlkbGVfaXJxOworCisJLyogY2hlY2sgbWFpbiBzdGF0dXMsIGNsZWFyaW5nIElOVFJRICovCisJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBBVEFfQlVTWSkpCisJCWdvdG8gaWRsZV9pcnE7CisKKwkvKiBhY2sgYm1kbWEgaXJxIGV2ZW50cyAqLworCWFwLT5vcHMtPmlycV9jbGVhcihhcCk7CisKKwlhdGFfaHNtX21vdmUoYXAsIHFjLCBzdGF0dXMsIDApOwogCXJldHVybiAxOwkvKiBpcnEgaGFuZGxlZCAqLwogCiBpZGxlX2lycToKQEAgLTQxODEsNyArNDc1NSw3IEBACiAjaWZkZWYgQVRBX0lSUV9UUkFQCiAJaWYgKChhcC0+c3RhdHMuaWRsZV9pcnEgJSAxMDAwKSA9PSAwKSB7CiAJCWF0YV9pcnFfYWNrKGFwLCAwKTsgLyogZGVidWcgdHJhcCAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGElZDogaXJxIHRyYXBcbiIsIGFwLT5pZCk7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLCAiaXJxIHRyYXBcbiIpOwogCQlyZXR1cm4gMTsKIAl9CiAjZW5kaWYKQEAgLTQyMTksMTEgKzQ3OTMsMTEgQEAKIAogCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKIAkJaWYgKGFwICYmCi0JCSAgICAhKGFwLT5mbGFncyAmIChBVEFfRkxBR19QT1JUX0RJU0FCTEVEIHwgQVRBX0ZMQUdfTk9JTlRSKSkpIHsKKwkJICAgICEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKSB7CiAJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCiAJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpICYmCisJCQlpZiAocWMgJiYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSAmJgogCQkJICAgIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0FDVElWRSkpCiAJCQkJaGFuZGxlZCB8PSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7CiAJCX0KQEAgLTQyMzQsMzIgKzQ4MDgsMTY4IEBACiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKKy8qKgorICoJc2F0YV9zY3JfdmFsaWQgLSB0ZXN0IHdoZXRoZXIgU0NScyBhcmUgYWNjZXNzaWJsZQorICoJQGFwOiBBVEEgcG9ydCB0byB0ZXN0IFNDUiBhY2Nlc3NpYmlsaXR5IGZvcgorICoKKyAqCVRlc3Qgd2hldGhlciBTQ1JzIGFyZSBhY2Nlc3NpYmxlIGZvciBAYXAuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCTEgaWYgU0NScyBhcmUgYWNjZXNzaWJsZSwgMCBvdGhlcndpc2UuCisgKi8KK2ludCBzYXRhX3Njcl92YWxpZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXJldHVybiBhcC0+Y2JsID09IEFUQV9DQkxfU0FUQSAmJiBhcC0+b3BzLT5zY3JfcmVhZDsKK30KKworLyoqCisgKglzYXRhX3Njcl9yZWFkIC0gcmVhZCBTQ1IgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKglAYXA6IEFUQSBwb3J0IHRvIHJlYWQgU0NSIGZvcgorICoJQHJlZzogU0NSIHRvIHJlYWQKKyAqCUB2YWw6IFBsYWNlIHRvIHN0b3JlIHJlYWQgdmFsdWUKKyAqCisgKglSZWFkIFNDUiByZWdpc3RlciBAcmVnIG9mIEBhcCBpbnRvICpAdmFsLiAgVGhpcyBmdW5jdGlvbiBpcworICoJZ3VhcmFudGVlZCB0byBzdWNjZWVkIGlmIHRoZSBjYWJsZSB0eXBlIG9mIHRoZSBwb3J0IGlzIFNBVEEKKyAqCWFuZCB0aGUgcG9ydCBpbXBsZW1lbnRzIC0+c2NyX3JlYWQuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IHNhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHJlZywgdTMyICp2YWwpCit7CisJaWYgKHNhdGFfc2NyX3ZhbGlkKGFwKSkgeworCQkqdmFsID0gYXAtPm9wcy0+c2NyX3JlYWQoYXAsIHJlZyk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qKgorICoJc2F0YV9zY3Jfd3JpdGUgLSB3cml0ZSBTQ1IgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCBwb3J0CisgKglAYXA6IEFUQSBwb3J0IHRvIHdyaXRlIFNDUiBmb3IKKyAqCUByZWc6IFNDUiB0byB3cml0ZQorICoJQHZhbDogdmFsdWUgdG8gd3JpdGUKKyAqCisgKglXcml0ZSBAdmFsIHRvIFNDUiByZWdpc3RlciBAcmVnIG9mIEBhcC4gIFRoaXMgZnVuY3Rpb24gaXMKKyAqCWd1YXJhbnRlZWQgdG8gc3VjY2VlZCBpZiB0aGUgY2FibGUgdHlwZSBvZiB0aGUgcG9ydCBpcyBTQVRBCisgKglhbmQgdGhlIHBvcnQgaW1wbGVtZW50cyAtPnNjcl9yZWFkLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBzYXRhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgcmVnLCB1MzIgdmFsKQoreworCWlmIChzYXRhX3Njcl92YWxpZChhcCkpIHsKKwkJYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCByZWcsIHZhbCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qKgorICoJc2F0YV9zY3Jfd3JpdGVfZmx1c2ggLSB3cml0ZSBTQ1IgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCBwb3J0IGFuZCBmbHVzaAorICoJQGFwOiBBVEEgcG9ydCB0byB3cml0ZSBTQ1IgZm9yCisgKglAcmVnOiBTQ1IgdG8gd3JpdGUKKyAqCUB2YWw6IHZhbHVlIHRvIHdyaXRlCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gc2F0YV9zY3Jfd3JpdGUoKSBleGNlcHQgdGhhdCB0aGlzCisgKglmdW5jdGlvbiBwZXJmb3JtcyBmbHVzaCBhZnRlciB3cml0aW5nIHRvIHRoZSByZWdpc3Rlci4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgc2F0YV9zY3Jfd3JpdGVfZmx1c2goc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHJlZywgdTMyIHZhbCkKK3sKKwlpZiAoc2F0YV9zY3JfdmFsaWQoYXApKSB7CisJCWFwLT5vcHMtPnNjcl93cml0ZShhcCwgcmVnLCB2YWwpOworCQlhcC0+b3BzLT5zY3JfcmVhZChhcCwgcmVnKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworLyoqCisgKglhdGFfcG9ydF9vbmxpbmUgLSB0ZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHBvcnQgaXMgb25saW5lCisgKglAYXA6IEFUQSBwb3J0IHRvIHRlc3QKKyAqCisgKglUZXN0IHdoZXRoZXIgQGFwIGlzIG9ubGluZS4gIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgMAorICoJaWYgb25saW5lIHN0YXR1cyBvZiBAYXAgY2Fubm90IGJlIG9idGFpbmVkLCBzbworICoJYXRhX3BvcnRfb25saW5lKGFwKSAhPSAhYXRhX3BvcnRfb2ZmbGluZShhcCkuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKgorICoJUkVUVVJOUzoKKyAqCTEgaWYgdGhlIHBvcnQgb25saW5lIHN0YXR1cyBpcyBhdmFpbGFibGUgYW5kIG9ubGluZS4KKyAqLworaW50IGF0YV9wb3J0X29ubGluZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXUzMiBzc3RhdHVzOworCisJaWYgKCFzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cykgJiYgKHNzdGF0dXMgJiAweGYpID09IDB4MykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3BvcnRfb2ZmbGluZSAtIHRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gcG9ydCBpcyBvZmZsaW5lCisgKglAYXA6IEFUQSBwb3J0IHRvIHRlc3QKKyAqCisgKglUZXN0IHdoZXRoZXIgQGFwIGlzIG9mZmxpbmUuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKgkwIGlmIG9mZmxpbmUgc3RhdHVzIG9mIEBhcCBjYW5ub3QgYmUgb2J0YWluZWQsIHNvCisgKglhdGFfcG9ydF9vbmxpbmUoYXApICE9ICFhdGFfcG9ydF9vZmZsaW5lKGFwKS4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglSRVRVUk5TOgorICoJMSBpZiB0aGUgcG9ydCBvZmZsaW5lIHN0YXR1cyBpcyBhdmFpbGFibGUgYW5kIG9mZmxpbmUuCisgKi8KK2ludCBhdGFfcG9ydF9vZmZsaW5lKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdTMyIHNzdGF0dXM7CisKKwlpZiAoIXNhdGFfc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMsICZzc3RhdHVzKSAmJiAoc3N0YXR1cyAmIDB4ZikgIT0gMHgzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIEV4ZWN1dGUgYSAnc2ltcGxlJyBjb21tYW5kLCB0aGF0IG9ubHkgY29uc2lzdHMgb2YgdGhlIG9wY29kZSAnY21kJyBpdHNlbGYsCiAgKiB3aXRob3V0IGZpbGxpbmcgYW55IG90aGVyIHJlZ2lzdGVycwogICovCi1zdGF0aWMgaW50IGF0YV9kb19zaW1wbGVfY21kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCi0JCQkgICAgIHU4IGNtZCkKK3N0YXRpYyBpbnQgYXRhX2RvX3NpbXBsZV9jbWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdTggY21kKQogewogCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CiAJaW50IGVycjsKIAotCWF0YV90Zl9pbml0KGFwLCAmdGYsIGRldi0+ZGV2bm8pOworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKIAogCXRmLmNvbW1hbmQgPSBjbWQ7CiAJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0RFVklDRTsKIAl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX05PREFUQTsKIAotCWVyciA9IGF0YV9leGVjX2ludGVybmFsKGFwLCBkZXYsICZ0ZiwgRE1BX05PTkUsIE5VTEwsIDApOworCWVyciA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfTk9ORSwgTlVMTCwgMCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogYXRhIGNvbW1hbmQgZmFpbGVkOiAlZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9FUlIsICIlczogYXRhIGNvbW1hbmQgZmFpbGVkOiAlZFxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGVycik7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGF0YV9mbHVzaF9jYWNoZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdGFfZmx1c2hfY2FjaGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKIAl1OCBjbWQ7CiAKQEAgLTQyNzEsMjIgKzQ5ODEsMjEgQEAKIAllbHNlCiAJCWNtZCA9IEFUQV9DTURfRkxVU0g7CiAKLQlyZXR1cm4gYXRhX2RvX3NpbXBsZV9jbWQoYXAsIGRldiwgY21kKTsKKwlyZXR1cm4gYXRhX2RvX3NpbXBsZV9jbWQoZGV2LCBjbWQpOwogfQogCi1zdGF0aWMgaW50IGF0YV9zdGFuZGJ5X2RyaXZlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGF0YV9zdGFuZGJ5X2RyaXZlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGF0YV9kb19zaW1wbGVfY21kKGFwLCBkZXYsIEFUQV9DTURfU1RBTkRCWU5PVzEpOworCXJldHVybiBhdGFfZG9fc2ltcGxlX2NtZChkZXYsIEFUQV9DTURfU1RBTkRCWU5PVzEpOwogfQogCi1zdGF0aWMgaW50IGF0YV9zdGFydF9kcml2ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdGFfc3RhcnRfZHJpdmUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gYXRhX2RvX3NpbXBsZV9jbWQoYXAsIGRldiwgQVRBX0NNRF9JRExFSU1NRURJQVRFKTsKKwlyZXR1cm4gYXRhX2RvX3NpbXBsZV9jbWQoZGV2LCBBVEFfQ01EX0lETEVJTU1FRElBVEUpOwogfQogCiAvKioKICAqCWF0YV9kZXZpY2VfcmVzdW1lIC0gd2FrZXVwIGEgcHJldmlvdXNseSBzdXNwZW5kZWQgZGV2aWNlcwotICoJQGFwOiBwb3J0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvCiAgKglAZGV2OiB0aGUgZGV2aWNlIHRvIHJlc3VtZQogICoKICAqCUtpY2sgdGhlIGRyaXZlIGJhY2sgaW50byBhY3Rpb24sIGJ5IHNlbmRpbmcgaXQgYW4gaWRsZSBpbW1lZGlhdGUKQEAgLTQyOTQsNDAgKzUwMDMsNDcgQEAKICAqCWFuZCBob3N0LgogICoKICAqLwotaW50IGF0YV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitpbnQgYXRhX2RldmljZV9yZXN1bWUoc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5hcDsKKwogCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TVVNQRU5ERUQpIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmZhaWxlZF9kZXY7CisKIAkJYXRhX2J1c3lfc2xlZXAoYXAsIEFUQV9UTU9VVF9CT09UX1FVSUNLLCBBVEFfVE1PVVRfQk9PVCk7CiAJCWF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMjAwMDAwKTsKKwogCQlhcC0+ZmxhZ3MgJj0gfkFUQV9GTEFHX1NVU1BFTkRFRDsKLQkJYXRhX3NldF9tb2RlKGFwKTsKKwkJd2hpbGUgKGF0YV9zZXRfbW9kZShhcCwgJmZhaWxlZF9kZXYpKQorCQkJYXRhX2Rldl9kaXNhYmxlKGZhaWxlZF9kZXYpOwogCX0KLQlpZiAoIWF0YV9kZXZfcHJlc2VudChkZXYpKQorCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCiAJCXJldHVybiAwOwogCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKQotCQlhdGFfc3RhcnRfZHJpdmUoYXAsIGRldik7CisJCWF0YV9zdGFydF9kcml2ZShkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qKgogICoJYXRhX2RldmljZV9zdXNwZW5kIC0gcHJlcGFyZSBhIGRldmljZSBmb3Igc3VzcGVuZAotICoJQGFwOiBwb3J0IHRoZSBkZXZpY2UgaXMgY29ubmVjdGVkIHRvCiAgKglAZGV2OiB0aGUgZGV2aWNlIHRvIHN1c3BlbmQKICAqCUBzdGF0ZTogdGFyZ2V0IHBvd2VyIG1hbmFnZW1lbnQgc3RhdGUKICAqCiAgKglGbHVzaCB0aGUgY2FjaGUgb24gdGhlIGRyaXZlLCBpZiBhcHByb3ByaWF0ZSwgdGhlbiBpc3N1ZSBhCiAgKglzdGFuZGJ5bm93IGNvbW1hbmQuCiAgKi8KLWludCBhdGFfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoraW50IGF0YV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0JaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gZGV2LT5hcDsKKworCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpCiAJCXJldHVybiAwOwogCWlmIChkZXYtPmNsYXNzID09IEFUQV9ERVZfQVRBKQotCQlhdGFfZmx1c2hfY2FjaGUoYXAsIGRldik7CisJCWF0YV9mbHVzaF9jYWNoZShkZXYpOwogCiAJaWYgKHN0YXRlLmV2ZW50ICE9IFBNX0VWRU5UX0ZSRUVaRSkKLQkJYXRhX3N0YW5kYnlfZHJpdmUoYXAsIGRldik7CisJCWF0YV9zdGFuZGJ5X2RyaXZlKGRldik7CiAJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX1NVU1BFTkRFRDsKIAlyZXR1cm4gMDsKIH0KQEAgLTQ0MTUsNiArNTEzMSwzOCBAQAogfQogCiAvKioKKyAqCWF0YV9kZXZfaW5pdCAtIEluaXRpYWxpemUgYW4gYXRhX2RldmljZSBzdHJ1Y3R1cmUKKyAqCUBkZXY6IERldmljZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQorICoKKyAqCUluaXRpYWxpemUgQGRldiBpbiBwcmVwYXJhdGlvbiBmb3IgcHJvYmluZy4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gY2FsbGVyLgorICovCit2b2lkIGF0YV9kZXZfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBTQVRBIHNwZCBsaW1pdCBpcyBib3VuZCB0byB0aGUgZmlyc3QgZGV2aWNlICovCisJYXAtPnNhdGFfc3BkX2xpbWl0ID0gYXAtPmh3X3NhdGFfc3BkX2xpbWl0OworCisJLyogSGlnaCBiaXRzIG9mIGRldi0+ZmxhZ3MgYXJlIHVzZWQgdG8gcmVjb3JkIHdhcm0gcGx1ZworCSAqIHJlcXVlc3RzIHdoaWNoIG9jY3VyIGFzeW5jaHJvbm91c2x5LiAgU3luY2hyb25pemUgdXNpbmcKKwkgKiBob3N0X3NldCBsb2NrLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX0lOSVRfTUFTSzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwltZW1zZXQoKHZvaWQgKilkZXYgKyBBVEFfREVWSUNFX0NMRUFSX09GRlNFVCwgMCwKKwkgICAgICAgc2l6ZW9mKCpkZXYpIC0gQVRBX0RFVklDRV9DTEVBUl9PRkZTRVQpOworCWRldi0+cGlvX21hc2sgPSBVSU5UX01BWDsKKwlkZXYtPm13ZG1hX21hc2sgPSBVSU5UX01BWDsKKwlkZXYtPnVkbWFfbWFzayA9IFVJTlRfTUFYOworfQorCisvKioKICAqCWF0YV9ob3N0X2luaXQgLSBJbml0aWFsaXplIGFuIGF0YV9wb3J0IHN0cnVjdHVyZQogICoJQGFwOiBTdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQogICoJQGhvc3Q6IGFzc29jaWF0ZWQgU0NTSSBtaWQtbGF5ZXIgc3RydWN0dXJlCkBAIC00NDI4LDcgKzUxNzYsNiBAQAogICoJTE9DS0lORzoKICAqCUluaGVyaXRlZCBmcm9tIGNhbGxlci4KICAqLwotCiBzdGF0aWMgdm9pZCBhdGFfaG9zdF9pbml0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsCiAJCQkgIHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0LAogCQkJICBjb25zdCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50LCB1bnNpZ25lZCBpbnQgcG9ydF9ubykKQEAgLTQ0NDEsNyArNTE4OCw4IEBACiAJaG9zdC0+dW5pcXVlX2lkID0gYXRhX3VuaXF1ZV9pZCsrOwogCWhvc3QtPm1heF9jbWRfbGVuID0gMTI7CiAKLQlhcC0+ZmxhZ3MgPSBBVEFfRkxBR19QT1JUX0RJU0FCTEVEOworCWFwLT5sb2NrID0gJmhvc3Rfc2V0LT5sb2NrOworCWFwLT5mbGFncyA9IEFUQV9GTEFHX0RJU0FCTEVEOwogCWFwLT5pZCA9IGhvc3QtPnVuaXF1ZV9pZDsKIAlhcC0+aG9zdCA9IGhvc3Q7CiAJYXAtPmN0bCA9IEFUQV9ERVZDVExfT0JTOwpAQCAtNDQ1NSwxOSArNTIwMywzNSBAQAogCWFwLT51ZG1hX21hc2sgPSBlbnQtPnVkbWFfbWFzazsKIAlhcC0+ZmxhZ3MgfD0gZW50LT5ob3N0X2ZsYWdzOwogCWFwLT5vcHMgPSBlbnQtPnBvcnRfb3BzOwotCWFwLT5jYmwgPSBBVEFfQ0JMX05PTkU7CisJYXAtPmh3X3NhdGFfc3BkX2xpbWl0ID0gVUlOVF9NQVg7CiAJYXAtPmFjdGl2ZV90YWcgPSBBVEFfVEFHX1BPSVNPTjsKIAlhcC0+bGFzdF9jdGwgPSAweEZGOwogCisjaWYgZGVmaW5lZChBVEFfVkVSQk9TRV9ERUJVRykKKwkvKiB0dXJuIG9uIGFsbCBkZWJ1Z2dpbmcgbGV2ZWxzICovCisJYXAtPm1zZ19lbmFibGUgPSAweDAwRkY7CisjZWxpZiBkZWZpbmVkKEFUQV9ERUJVRykKKwlhcC0+bXNnX2VuYWJsZSA9IEFUQV9NU0dfRFJWIHwgQVRBX01TR19JTkZPIHwgQVRBX01TR19DVEwgfCBBVEFfTVNHX1dBUk4gfCBBVEFfTVNHX0VSUjsKKyNlbHNlIAorCWFwLT5tc2dfZW5hYmxlID0gQVRBX01TR19EUlYgfCBBVEFfTVNHX0VSUiB8IEFUQV9NU0dfV0FSTjsKKyNlbmRpZgorCiAJSU5JVF9XT1JLKCZhcC0+cG9ydF90YXNrLCBOVUxMLCBOVUxMKTsKKwlJTklUX1dPUksoJmFwLT5ob3RwbHVnX3Rhc2ssIGF0YV9zY3NpX2hvdHBsdWcsIGFwKTsKKwlJTklUX1dPUksoJmFwLT5zY3NpX3Jlc2Nhbl90YXNrLCBhdGFfc2NzaV9kZXZfcmVzY2FuLCBhcCk7CiAJSU5JVF9MSVNUX0hFQUQoJmFwLT5laF9kb25lX3EpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmFwLT5laF93YWl0X3EpOworCisJLyogc2V0IGNhYmxlIHR5cGUgKi8KKwlhcC0+Y2JsID0gQVRBX0NCTF9OT05FOworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBKQorCQlhcC0+Y2JsID0gQVRBX0NCTF9TQVRBOwogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CiAJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJZGV2LT5hcCA9IGFwOwogCQlkZXYtPmRldm5vID0gaTsKLQkJZGV2LT5waW9fbWFzayA9IFVJTlRfTUFYOwotCQlkZXYtPm13ZG1hX21hc2sgPSBVSU5UX01BWDsKLQkJZGV2LT51ZG1hX21hc2sgPSBVSU5UX01BWDsKKwkJYXRhX2Rldl9pbml0KGRldik7CiAJfQogCiAjaWZkZWYgQVRBX0lSUV9UUkFQCkBAIC00NTAzLDcgKzUyNjcsNyBAQAogCiAJRFBSSU5USygiRU5URVJcbiIpOwogCi0JaWYgKCFlbnQtPnBvcnRfb3BzLT5wcm9iZV9yZXNldCAmJgorCWlmICghZW50LT5wb3J0X29wcy0+ZXJyb3JfaGFuZGxlciAmJgogCSAgICAhKGVudC0+aG9zdF9mbGFncyAmIChBVEFfRkxBR19TQVRBX1JFU0VUIHwgQVRBX0ZMQUdfU1JTVCkpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IG5vIHJlc2V0IG1lY2hhbmlzbSBhdmFpbGFibGVcbiIsCiAJCSAgICAgICBwb3J0X25vKTsKQEAgLTQ1MTYsNyArNTI4MCw3IEBACiAKIAlob3N0LT50cmFuc3BvcnR0ID0gJmF0YV9zY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAotCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmaG9zdC0+aG9zdGRhdGFbMF07CisJYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChob3N0KTsKIAogCWF0YV9ob3N0X2luaXQoYXAsIGhvc3QsIGhvc3Rfc2V0LCBlbnQsIHBvcnRfbm8pOwogCkBAIC00NTQ5LDEyICs1MzEzLDEyIEBACiAgKglSRVRVUk5TOgogICoJTnVtYmVyIG9mIHBvcnRzIHJlZ2lzdGVyZWQuICBaZXJvIG9uIGVycm9yIChubyBwb3J0cyByZWdpc3RlcmVkKS4KICAqLwotCiBpbnQgYXRhX2RldmljZV9hZGQoY29uc3Qgc3RydWN0IGF0YV9wcm9iZV9lbnQgKmVudCkKIHsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSAwLCBpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGVudC0+ZGV2OwogCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0OworCWludCByYzsKIAogCURQUklOVEsoIkVOVEVSXG4iKTsKIAkvKiBhbGxvYyBhIGNvbnRhaW5lciBmb3Igb3VyIGxpc3Qgb2YgQVRBIHBvcnRzIChidXNlcykgKi8KQEAgLTQ1ODcsMTggKzUzNTEsMTggQEAKIAkJCQkoYXAtPnBpb19tYXNrIDw8IEFUQV9TSElGVF9QSU8pOwogCiAJCS8qIHByaW50IHBlci1wb3J0IGluZm8gdG8gZG1lc2cgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiYXRhJXU6ICVjQVRBIG1heCAlcyBjbWQgMHglbFggY3RsIDB4JWxYICIKLQkJCQkgImJtZG1hIDB4JWxYIGlycSAlbHVcbiIsCi0JCQlhcC0+aWQsCi0JCQlhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVRBID8gJ1MnIDogJ1AnLAotCQkJYXRhX21vZGVfc3RyaW5nKHhmZXJfbW9kZV9tYXNrKSwKLQkgICAgICAgCQlhcC0+aW9hZGRyLmNtZF9hZGRyLAotCSAgICAgICAJCWFwLT5pb2FkZHIuY3RsX2FkZHIsCi0JICAgICAgIAkJYXAtPmlvYWRkci5ibWRtYV9hZGRyLAotCSAgICAgICAJCWVudC0+aXJxKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICIlY0FUQSBtYXggJXMgY21kIDB4JWxYICIKKwkJCQkiY3RsIDB4JWxYIGJtZG1hIDB4JWxYIGlycSAlbHVcbiIsCisJCQkJYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0FUQSA/ICdTJyA6ICdQJywKKwkJCQlhdGFfbW9kZV9zdHJpbmcoeGZlcl9tb2RlX21hc2spLAorCQkJCWFwLT5pb2FkZHIuY21kX2FkZHIsCisJCQkJYXAtPmlvYWRkci5jdGxfYWRkciwKKwkJCQlhcC0+aW9hZGRyLmJtZG1hX2FkZHIsCisJCQkJZW50LT5pcnEpOwogCiAJCWF0YV9jaGtfc3RhdHVzKGFwKTsKIAkJaG9zdF9zZXQtPm9wcy0+aXJxX2NsZWFyKGFwKTsKKwkJYXRhX2VoX2ZyZWV6ZV9wb3J0KGFwKTsJLyogZnJlZXplIHBvcnQgYmVmb3JlIHJlcXVlc3RpbmcgSVJRICovCiAJCWNvdW50Kys7CiAJfQogCkBAIC00NjA2LDQxICs1MzcwLDcyIEBACiAJCWdvdG8gZXJyX2ZyZWVfcmV0OwogCiAJLyogb2J0YWluIGlycSwgdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBjaGFubmVscyAqLwotCWlmIChyZXF1ZXN0X2lycShlbnQtPmlycSwgZW50LT5wb3J0X29wcy0+aXJxX2hhbmRsZXIsIGVudC0+aXJxX2ZsYWdzLAotCQkJRFJWX05BTUUsIGhvc3Rfc2V0KSkKKwlyYyA9IHJlcXVlc3RfaXJxKGVudC0+aXJxLCBlbnQtPnBvcnRfb3BzLT5pcnFfaGFuZGxlciwgZW50LT5pcnFfZmxhZ3MsCisJCQkgRFJWX05BTUUsIGhvc3Rfc2V0KTsKKwlpZiAocmMpIHsKKwkJZGV2X3ByaW50ayhLRVJOX0VSUiwgZGV2LCAiaXJxICVsdSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCisJCQkgICBlbnQtPmlycSwgcmMpOwogCQlnb3RvIGVycl9vdXQ7CisJfQogCiAJLyogcGVyZm9ybSBlYWNoIHByb2JlIHN5bmNocm9ub3VzbHkgKi8KIAlEUFJJTlRLKCJwcm9iZSBiZWdpblxuIik7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJc3RydWN0IGF0YV9wb3J0ICphcDsKKwkJdTMyIHNjb250cm9sOwogCQlpbnQgcmM7CiAKIAkJYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CiAKLQkJRFBSSU5USygiYXRhJXU6IGJ1cyBwcm9iZSBiZWdpblxuIiwgYXAtPmlkKTsKLQkJcmMgPSBhdGFfYnVzX3Byb2JlKGFwKTsKLQkJRFBSSU5USygiYXRhJXU6IGJ1cyBwcm9iZSBlbmRcbiIsIGFwLT5pZCk7Ci0KLQkJaWYgKHJjKSB7Ci0JCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlPwotCQkJICogQ3VycmVudCBsaWJhdGEgYmVoYXZpb3Igd2lsbAotCQkJICogdGVhciBkb3duIGV2ZXJ5dGhpbmcgd2hlbgotCQkJICogdGhlIG1vZHVsZSBpcyByZW1vdmVkCi0JCQkgKiBvciB0aGUgaC93IGlzIHVucGx1Z2dlZC4KLQkJCSAqLworCQkvKiBpbml0IHNhdGFfc3BkX2xpbWl0IHRvIHRoZSBjdXJyZW50IHZhbHVlICovCisJCWlmIChzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfQ09OVFJPTCwgJnNjb250cm9sKSA9PSAwKSB7CisJCQlpbnQgc3BkID0gKHNjb250cm9sID4+IDQpICYgMHhmOworCQkJYXAtPmh3X3NhdGFfc3BkX2xpbWl0ICY9ICgxIDw8IHNwZCkgLSAxOwogCQl9CisJCWFwLT5zYXRhX3NwZF9saW1pdCA9IGFwLT5od19zYXRhX3NwZF9saW1pdDsKIAogCQlyYyA9IHNjc2lfYWRkX2hvc3QoYXAtPmhvc3QsIGRldik7CiAJCWlmIChyYykgewotCQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogc2NzaV9hZGRfaG9zdCBmYWlsZWRcbiIsCi0JCQkgICAgICAgYXAtPmlkKTsKKwkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJzY3NpX2FkZF9ob3N0IGZhaWxlZFxuIik7CiAJCQkvKiBGSVhNRTogZG8gc29tZXRoaW5nIHVzZWZ1bCBoZXJlICovCiAJCQkvKiBGSVhNRTogaGFuZGxlIHVuY29uZGl0aW9uYWwgY2FsbHMgdG8KIAkJCSAqIHNjc2lfc2Nhbl9ob3N0IGFuZCBhdGFfaG9zdF9yZW1vdmUsIGJlbG93LAogCQkJICogYXQgdGhlIHZlcnkgbGVhc3QKIAkJCSAqLwogCQl9CisKKwkJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJCWF0YV9wb3J0X3Byb2JlKGFwKTsKKworCQkJLyoga2ljayBFSCBmb3IgYm9vdCBwcm9iaW5nICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCisJCQlhcC0+ZWhfaW5mby5wcm9iZV9tYXNrID0gKDEgPDwgQVRBX01BWF9ERVZJQ0VTKSAtIDE7CisJCQlhcC0+ZWhfaW5mby5hY3Rpb24gfD0gQVRBX0VIX1NPRlRSRVNFVDsKKworCQkJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX0xPQURJTkc7CisJCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCQkJLyogd2FpdCBmb3IgRUggdG8gZmluaXNoICovCisJCQlhdGFfcG9ydF93YWl0X2VoKGFwKTsKKwkJfSBlbHNlIHsKKwkJCURQUklOVEsoImF0YSV1OiBidXMgcHJvYmUgYmVnaW5cbiIsIGFwLT5pZCk7CisJCQlyYyA9IGF0YV9idXNfcHJvYmUoYXApOworCQkJRFBSSU5USygiYXRhJXU6IGJ1cyBwcm9iZSBlbmRcbiIsIGFwLT5pZCk7CisKKwkJCWlmIChyYykgeworCQkJCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgdXNlZnVsIGhlcmU/CisJCQkJICogQ3VycmVudCBsaWJhdGEgYmVoYXZpb3Igd2lsbAorCQkJCSAqIHRlYXIgZG93biBldmVyeXRoaW5nIHdoZW4KKwkJCQkgKiB0aGUgbW9kdWxlIGlzIHJlbW92ZWQKKwkJCQkgKiBvciB0aGUgaC93IGlzIHVucGx1Z2dlZC4KKwkJCQkgKi8KKwkJCX0KKwkJfQogCX0KIAogCS8qIHByb2JlcyBhcmUgZG9uZSwgbm93IHNjYW4gZWFjaCBwb3J0J3MgZGlzayhzKSAqLwpAQCAtNDY2OCw2ICs1NDYzLDYzIEBACiB9CiAKIC8qKgorICoJYXRhX3BvcnRfZGV0YWNoIC0gRGV0YWNoIEFUQSBwb3J0IGluIHByZXByYXRpb24gb2YgZGV2aWNlIHJlbW92YWwKKyAqCUBhcDogQVRBIHBvcnQgdG8gYmUgZGV0YWNoZWQKKyAqCisgKglEZXRhY2ggYWxsIEFUQSBkZXZpY2VzIGFuZCB0aGUgYXNzb2NpYXRlZCBTQ1NJIGRldmljZXMgb2YgQGFwOworICoJdGhlbiwgcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIFNDU0kgaG9zdC4gIEBhcCBpcyBndWFyYW50ZWVkIHRvCisgKgliZSBxdWllc2NlbnQgb24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICovCit2b2lkIGF0YV9wb3J0X2RldGFjaChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZiAoIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCXJldHVybjsKKworCS8qIHRlbGwgRUggd2UncmUgbGVhdmluZyAmIGZsdXNoIEVIICovCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfVU5MT0FESU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCWF0YV9wb3J0X3dhaXRfZWgoYXApOworCisJLyogRUggaXMgbm93IGd1YXJhbnRlZWQgdG8gc2VlIFVOTE9BRElORywgc28gbm8gbmV3IGRldmljZQorCSAqIHdpbGwgYmUgYXR0YWNoZWQuICBEaXNhYmxlIGFsbCBleGlzdGluZyBkZXZpY2VzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWF0YV9kZXZfZGlzYWJsZSgmYXAtPmRldmljZVtpXSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBGaW5hbCBmcmVlemUgJiBFSC4gIEFsbCBpbi1mbGlnaHQgY29tbWFuZHMgYXJlIGFib3J0ZWQuICBFSAorCSAqIHdpbGwgYmUgc2tpcHBlZCBhbmQgcmV0cmlhbHMgd2lsbCBiZSB0ZXJtaW5hdGVkIHdpdGggYmFkCisJICogdGFyZ2V0LgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisJYXRhX3BvcnRfZnJlZXplKGFwKTsJLyogd29uJ3QgYmUgdGhhd2VkICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCisJYXRhX3BvcnRfd2FpdF9laChhcCk7CisKKwkvKiBGbHVzaCBob3RwbHVnIHRhc2suICBUaGUgc2VxdWVuY2UgaXMgc2ltaWxhciB0bworCSAqIGF0YV9wb3J0X2ZsdXNoX3Rhc2soKS4KKwkgKi8KKwlmbHVzaF93b3JrcXVldWUoYXRhX2F1eF93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmYXAtPmhvdHBsdWdfdGFzayk7CisJZmx1c2hfd29ya3F1ZXVlKGF0YV9hdXhfd3EpOworCisJLyogcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIFNDU0kgaG9zdCAqLworCXNjc2lfcmVtb3ZlX2hvc3QoYXAtPmhvc3QpOworfQorCisvKioKICAqCWF0YV9ob3N0X3NldF9yZW1vdmUgLSBQQ0kgbGF5ZXIgY2FsbGJhY2sgZm9yIGRldmljZSByZW1vdmFsCiAgKglAaG9zdF9zZXQ6IEFUQSBob3N0IHNldCB0aGF0IHdhcyByZW1vdmVkCiAgKgpAQCAtNDY4MCwxOCArNTUzMiwxNSBAQAogCiB2b2lkIGF0YV9ob3N0X3NldF9yZW1vdmUoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcDsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7Ci0JCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOwotCQlzY3NpX3JlbW92ZV9ob3N0KGFwLT5ob3N0KTsKLQl9CisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspCisJCWF0YV9wb3J0X2RldGFjaChob3N0X3NldC0+cG9ydHNbaV0pOwogCiAJZnJlZV9pcnEoaG9zdF9zZXQtPmlycSwgaG9zdF9zZXQpOwogCiAJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKLQkJYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CiAKIAkJYXRhX3Njc2lfcmVsZWFzZShhcC0+aG9zdCk7CiAKQEAgLTQ3MjksMTUgKzU1NzgsMTIgQEAKIAogaW50IGF0YV9zY3NpX3JlbGVhc2Uoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKIHsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmaG9zdC0+aG9zdGRhdGFbMF07Ci0JaW50IGk7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KGhvc3QpOwogCiAJRFBSSU5USygiRU5URVJcbiIpOwogCiAJYXAtPm9wcy0+cG9ydF9kaXNhYmxlKGFwKTsKIAlhdGFfaG9zdF9yZW1vdmUoYXAsIDApOwotCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykKLQkJa2ZyZWUoYXAtPmRldmljZVtpXS5pZCk7CiAKIAlEUFJJTlRLKCJFWElUXG4iKTsKIAlyZXR1cm4gMTsKQEAgLTQ3OTcsOCArNTY0MywxMiBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjaV9kZXZfdG9fZGV2KHBkZXYpOwogCXN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQyID0gaG9zdF9zZXQtPm5leHQ7CiAKIAlhdGFfaG9zdF9zZXRfcmVtb3ZlKGhvc3Rfc2V0KTsKKwlpZiAoaG9zdF9zZXQyKQorCQlhdGFfaG9zdF9zZXRfcmVtb3ZlKGhvc3Rfc2V0Mik7CisKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKQEAgLTQ4NjMsNiArNTcxMywxMiBAQAogCWlmICghYXRhX3dxKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWF0YV9hdXhfd3EgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYXRhX2F1eCIpOworCWlmICghYXRhX2F1eF93cSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShhdGFfd3EpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlwcmludGsoS0VSTl9ERUJVRyAibGliYXRhIHZlcnNpb24gIiBEUlZfVkVSU0lPTiAiIGxvYWRlZC5cbiIpOwogCXJldHVybiAwOwogfQpAQCAtNDg3MCw2ICs1NzI2LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdGFfZXhpdCh2b2lkKQogewogCWRlc3Ryb3lfd29ya3F1ZXVlKGF0YV93cSk7CisJZGVzdHJveV93b3JrcXVldWUoYXRhX2F1eF93cSk7CiB9CiAKIG1vZHVsZV9pbml0KGF0YV9pbml0KTsKQEAgLTQ4OTYsNiArNTc1Myw1MiBAQAogCXJldHVybiByYzsKIH0KIAorLyoqCisgKglhdGFfd2FpdF9yZWdpc3RlciAtIHdhaXQgdW50aWwgcmVnaXN0ZXIgdmFsdWUgY2hhbmdlcworICoJQHJlZzogSU8tbWFwcGVkIHJlZ2lzdGVyCisgKglAbWFzazogTWFzayB0byBhcHBseSB0byByZWFkIHJlZ2lzdGVyIHZhbHVlCisgKglAdmFsOiBXYWl0IGNvbmRpdGlvbgorICoJQGludGVydmFsX21zZWM6IHBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzCisgKglAdGltZW91dF9tc2VjOiB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcworICoKKyAqCVdhaXRpbmcgZm9yIHNvbWUgYml0cyBvZiByZWdpc3RlciB0byBjaGFuZ2UgaXMgYSBjb21tb24KKyAqCW9wZXJhdGlvbiBmb3IgQVRBIGNvbnRyb2xsZXJzLiAgVGhpcyBmdW5jdGlvbiByZWFkcyAzMmJpdCBMRQorICoJSU8tbWFwcGVkIHJlZ2lzdGVyIEByZWcgYW5kIHRlc3RzIGZvciB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbi4KKyAqCisgKgkoKkByZWcgJiBtYXNrKSAhPSB2YWwKKyAqCisgKglJZiB0aGUgY29uZGl0aW9uIGlzIG1ldCwgaXQgcmV0dXJuczsgb3RoZXJ3aXNlLCB0aGUgcHJvY2VzcyBpcworICoJcmVwZWF0ZWQgYWZ0ZXIgQGludGVydmFsX21zZWMgdW50aWwgdGltZW91dC4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApCisgKgorICoJUkVUVVJOUzoKKyAqCVRoZSBmaW5hbCByZWdpc3RlciB2YWx1ZS4KKyAqLwordTMyIGF0YV93YWl0X3JlZ2lzdGVyKHZvaWQgX19pb21lbSAqcmVnLCB1MzIgbWFzaywgdTMyIHZhbCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBpbnRlcnZhbF9tc2VjLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXRfbXNlYykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdTMyIHRtcDsKKworCXRtcCA9IGlvcmVhZDMyKHJlZyk7CisKKwkvKiBDYWxjdWxhdGUgdGltZW91dCBfYWZ0ZXJfIHRoZSBmaXJzdCByZWFkIHRvIG1ha2Ugc3VyZQorCSAqIHByZWNlZGluZyB3cml0ZXMgcmVhY2ggdGhlIGNvbnRyb2xsZXIgYmVmb3JlIHN0YXJ0aW5nIHRvCisJICogZWF0IGF3YXkgdGhlIHRpbWVvdXQuCisJICovCisJdGltZW91dCA9IGppZmZpZXMgKyAodGltZW91dF9tc2VjICogSFopIC8gMTAwMDsKKworCXdoaWxlICgodG1wICYgbWFzaykgPT0gdmFsICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCW1zbGVlcChpbnRlcnZhbF9tc2VjKTsKKwkJdG1wID0gaW9yZWFkMzIocmVnKTsKKwl9CisKKwlyZXR1cm4gdG1wOworfQorCiAvKgogICogbGliYXRhIGlzIGVzc2VudGlhbGx5IGEgbGlicmFyeSBvZiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIGZvcgogICogbG93LWxldmVsIEFUQSBob3N0IGNvbnRyb2xsZXIgZHJpdmVycy4gIEFzIHN1Y2gsIHRoZSBBUEkvQUJJIGlzCkBAIC00OTAzLDE1ICs1ODA2LDIwIEBACiAgKiBEbyBub3QgZGVwZW5kIG9uIEFCSS9BUEkgc3RhYmlsaXR5LgogICovCiAKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfZGViX3RpbWluZ19ib290KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfZGViX3RpbWluZ19laCk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX2RlYl90aW1pbmdfYmVmb3JlX2ZzcnN0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zdGRfYmlvc19wYXJhbSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3BvcnRzKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZpY2VfYWRkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X2RldGFjaCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9zZXRfcmVtb3ZlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZ19pbml0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zZ19pbml0X29uZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChfX2F0YV9xY19jb21wbGV0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfaHNtX21vdmUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3FjX2NvbXBsZXRlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19jb21wbGV0ZV9tdWx0aXBsZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcWNfaXNzdWVfcHJvdCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZW5nX3RpbWVvdXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX2xvYWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3RmX3JlYWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX25vb3BfZGV2X3NlbGVjdCk7CkBAIC00OTI1LDYgKzU4MzMsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfc3RvcCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaG9zdF9zdG9wKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX21taW9fZGF0YV94ZmVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9waW9fZGF0YV94ZmVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9waW9fZGF0YV94ZmVyX25vaXJxKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9xY19wcmVwKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ub29wX3FjX3ByZXApOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3NldHVwKTsKQEAgLTQ5MzIsMzMgKzU4NDMsNDYgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9pcnFfY2xlYXIpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2JtZG1hX3N0YXR1cyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfc3RvcCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfZnJlZXplKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV90aGF3KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9ibWRtYV9kcml2ZV9laCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfZXJyb3JfaGFuZGxlcik7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfcHJvYmUpOworRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zZXRfc3BkKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfcGh5X2RlYm91bmNlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNhdGFfcGh5X3Jlc3VtZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3BoeV9yZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3NhdGFfcGh5X3Jlc2V0KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9idXNfcmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wcm9iZWluaXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wcmVyZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc3RkX3NvZnRyZXNldCk7CiBFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3N0ZF9oYXJkcmVzZXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wb3N0cmVzZXQpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3N0ZF9wcm9iZV9yZXNldCk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZHJpdmVfcHJvYmVfcmVzZXQpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl9yZXZhbGlkYXRlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZfY2xhc3NpZnkpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2Rldl9wYWlyKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9wb3J0X2Rpc2FibGUpOwogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3JhdGVsaW1pdCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfd2FpdF9yZWdpc3Rlcik7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfYnVzeV9zbGVlcCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfcG9ydF9xdWV1ZV90YXNrKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2lvY3RsKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3F1ZXVlY21kKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX3NsYXZlX2NvbmZpZyk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9zbGF2ZV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2NoYW5nZV9xdWV1ZV9kZXB0aCk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9yZWxlYXNlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9ob3N0X2ludHIpOworRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zY3JfdmFsaWQpOworRVhQT1JUX1NZTUJPTF9HUEwoc2F0YV9zY3JfcmVhZCk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3Njcl93cml0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChzYXRhX3Njcl93cml0ZV9mbHVzaCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfcG9ydF9vbmxpbmUpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfb2ZmbGluZSk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfaWRfc3RyaW5nKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9pZF9jX3N0cmluZyk7CiBFWFBPUlRfU1lNQk9MX0dQTChhdGFfc2NzaV9zaW11bGF0ZSk7Ci1FWFBPUlRfU1lNQk9MX0dQTChhdGFfZWhfcWNfY29tcGxldGUpOwotRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2VoX3FjX3JldHJ5KTsKIAogRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3Bpb19uZWVkX2lvcmR5KTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV90aW1pbmdfY29tcHV0ZSk7CkBAIC00OTgwLDMgKzU5MDQsMTMgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9kZXZpY2VfcmVzdW1lKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2RldmljZV9zdXNwZW5kKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGF0YV9zY3NpX2RldmljZV9yZXN1bWUpOworCitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZW5nX3RpbWVvdXQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfc2NoZWR1bGVfZWgpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfYWJvcnQpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX3BvcnRfZnJlZXplKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9laF9mcmVlemVfcG9ydCk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZWhfdGhhd19wb3J0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGF0YV9laF9xY19jb21wbGV0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhdGFfZWhfcWNfcmV0cnkpOworRVhQT1JUX1NZTUJPTF9HUEwoYXRhX2RvX2VoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtZWguYyBiL2RyaXZlcnMvc2NzaS9saWJhdGEtZWguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjMzODU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1laC5jCkBAIC0wLDAgKzEsMTkwNyBAQAorLyoKKyAqICBsaWJhdGEtZWguYyAtIGxpYmF0YSBlcnJvciBoYW5kbGluZworICoKKyAqICBNYWludGFpbmVkIGJ5OiAgSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICogICAgCQkgICAgUGxlYXNlIEFMV0FZUyBjb3B5IGxpbnV4LWlkZUB2Z2VyLmtlcm5lbC5vcmcKKyAqCQkgICAgb24gZW1haWxzLgorICoKKyAqICBDb3B5cmlnaHQgMjAwNiBUZWp1biBIZW8gPGh0ZWp1bkBnbWFpbC5jb20+CisgKgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgVVNBLgorICoKKyAqCisgKiAgbGliYXRhIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIHZpYSAnbWFrZSB7cHN8cGRmfWRvY3MnLAorICogIGFzIERvY3VtZW50YXRpb24vRG9jQm9vay9saWJhdGEuKgorICoKKyAqICBIYXJkd2FyZSBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBmcm9tIGh0dHA6Ly93d3cudDEzLm9yZy8gYW5kCisgKiAgaHR0cDovL3d3dy5zYXRhLWlvLm9yZy8KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSAic2NzaV90cmFuc3BvcnRfYXBpLmgiCisKKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKworI2luY2x1ZGUgImxpYmF0YS5oIgorCitzdGF0aWMgdm9pZCBfX2F0YV9wb3J0X2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIGF0YV9laF9maW5pc2goc3RydWN0IGF0YV9wb3J0ICphcCk7CisKK3N0YXRpYyB2b2lkIGF0YV9lcmluZ19yZWNvcmQoc3RydWN0IGF0YV9lcmluZyAqZXJpbmcsIGludCBpc19pbywKKwkJCSAgICAgdW5zaWduZWQgaW50IGVycl9tYXNrKQoreworCXN0cnVjdCBhdGFfZXJpbmdfZW50cnkgKmVudDsKKworCVdBUk5fT04oIWVycl9tYXNrKTsKKworCWVyaW5nLT5jdXJzb3IrKzsKKwllcmluZy0+Y3Vyc29yICU9IEFUQV9FUklOR19TSVpFOworCisJZW50ID0gJmVyaW5nLT5yaW5nW2VyaW5nLT5jdXJzb3JdOworCWVudC0+aXNfaW8gPSBpc19pbzsKKwllbnQtPmVycl9tYXNrID0gZXJyX21hc2s7CisJZW50LT50aW1lc3RhbXAgPSBnZXRfamlmZmllc182NCgpOworfQorCitzdGF0aWMgc3RydWN0IGF0YV9lcmluZ19lbnRyeSAqIGF0YV9lcmluZ190b3Aoc3RydWN0IGF0YV9lcmluZyAqZXJpbmcpCit7CisJc3RydWN0IGF0YV9lcmluZ19lbnRyeSAqZW50ID0gJmVyaW5nLT5yaW5nW2VyaW5nLT5jdXJzb3JdOworCWlmICghZW50LT5lcnJfbWFzaykKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGVudDsKK30KKworc3RhdGljIGludCBhdGFfZXJpbmdfbWFwKHN0cnVjdCBhdGFfZXJpbmcgKmVyaW5nLAorCQkJIGludCAoKm1hcF9mbikoc3RydWN0IGF0YV9lcmluZ19lbnRyeSAqLCB2b2lkICopLAorCQkJIHZvaWQgKmFyZykKK3sKKwlpbnQgaWR4LCByYyA9IDA7CisJc3RydWN0IGF0YV9lcmluZ19lbnRyeSAqZW50OworCisJaWR4ID0gZXJpbmctPmN1cnNvcjsKKwlkbyB7CisJCWVudCA9ICZlcmluZy0+cmluZ1tpZHhdOworCQlpZiAoIWVudC0+ZXJyX21hc2spCisJCQlicmVhazsKKwkJcmMgPSBtYXBfZm4oZW50LCBhcmcpOworCQlpZiAocmMpCisJCQlicmVhazsKKwkJaWR4ID0gKGlkeCAtIDEgKyBBVEFfRVJJTkdfU0laRSkgJSBBVEFfRVJJTkdfU0laRTsKKwl9IHdoaWxlIChpZHggIT0gZXJpbmctPmN1cnNvcik7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfdGltZWRfb3V0IC0gU0NTSSBsYXllciB0aW1lIG91dCBjYWxsYmFjaworICoJQGNtZDogdGltZWQgb3V0IFNDU0kgY29tbWFuZAorICoKKyAqCUhhbmRsZXMgU0NTSSBsYXllciB0aW1lb3V0LiAgV2UgcmFjZSB3aXRoIG5vcm1hbCBjb21wbGV0aW9uIG9mCisgKgl0aGUgcWMgZm9yIEBjbWQuICBJZiB0aGUgcWMgaXMgYWxyZWFkeSBnb25lLCB3ZSBsb3NlIGFuZCBsZXQKKyAqCXRoZSBzY3NpIGNvbW1hbmQgZmluaXNoIChFSF9IQU5ETEVEKS4gIE90aGVyd2lzZSwgdGhlIHFjIGhhcworICoJdGltZWQgb3V0IGFuZCBFSCBzaG91bGQgYmUgaW52b2tlZC4gIFByZXZlbnQgYXRhX3FjX2NvbXBsZXRlKCkKKyAqCWZyb20gZmluaXNoaW5nIGl0IGJ5IHNldHRpbmcgRUhfU0NIRURVTEVEIGFuZCByZXR1cm4KKyAqCUVIX05PVF9IQU5ETEVELgorICoKKyAqCVRPRE86IGtpbGwgdGhpcyBmdW5jdGlvbiBvbmNlIG9sZCBFSCBpcyBnb25lLgorICoKKyAqCUxPQ0tJTkc6CisgKglDYWxsZWQgZnJvbSB0aW1lciBjb250ZXh0CisgKgorICoJUkVUVVJOUzoKKyAqCUVIX0hBTkRMRUQgb3IgRUhfTk9UX0hBTkRMRUQKKyAqLworZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBhdGFfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoaG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCWVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gcmV0OworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJaWYgKGFwLT5vcHMtPmVycm9yX2hhbmRsZXIpIHsKKwkJcmV0ID0gRUhfTk9UX0hBTkRMRUQ7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IEVIX0hBTkRMRUQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWlmIChxYykgeworCQlXQVJOX09OKHFjLT5zY3NpY21kICE9IGNtZCk7CisJCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0VIX1NDSEVEVUxFRDsKKwkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9USU1FT1VUOworCQlyZXQgPSBFSF9OT1RfSEFORExFRDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworCisgb3V0OgorCURQUklOVEsoIkVYSVQsIHJldD0lZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqCWF0YV9zY3NpX2Vycm9yIC0gU0NTSSBsYXllciBlcnJvciBoYW5kbGVyIGNhbGxiYWNrCisgKglAaG9zdDogU0NTSSBob3N0IG9uIHdoaWNoIGVycm9yIG9jY3VycmVkCisgKgorICoJSGFuZGxlcyBTQ1NJLWxheWVyLXRocm93biBlcnJvciBldmVudHMuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFNDU0kgbGF5ZXIgKG5vbmUsIGNhbiBzbGVlcCkKKyAqCisgKglSRVRVUk5TOgorICoJWmVyby4KKyAqLwordm9pZCBhdGFfc2NzaV9lcnJvcihzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChob3N0KTsKKwlzcGlubG9ja190ICphcF9sb2NrID0gYXAtPmxvY2s7CisJaW50IGksIHJlcGVhdF9jbnQgPSBBVEFfRUhfTUFYX1JFUEVBVDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBSSU5USygiRU5URVJcbiIpOworCisJLyogc3luY2hyb25pemUgd2l0aCBwb3J0IHRhc2sgKi8KKwlhdGFfcG9ydF9mbHVzaF90YXNrKGFwKTsKKworCS8qIHN5bmNocm9uaXplIHdpdGggaG9zdF9zZXQgbG9jayBhbmQgc29ydCBvdXQgdGltZW91dHMgKi8KKworCS8qIEZvciBuZXcgRUgsIGFsbCBxY3MgYXJlIGZpbmlzaGVkIGluIG9uZSBvZiB0aHJlZSB3YXlzIC0KKwkgKiBub3JtYWwgY29tcGxldGlvbiwgZXJyb3IgY29tcGxldGlvbiwgYW5kIFNDU0kgdGltZW91dC4KKwkgKiBCb3RoIGNtcGxldGlvbnMgY2FuIHJhY2UgYWdhaW5zdCBTQ1NJIHRpbWVvdXQuICBXaGVuIG5vcm1hbAorCSAqIGNvbXBsZXRpb24gd2lucywgdGhlIHFjIG5ldmVyIHJlYWNoZXMgRUguICBXaGVuIGVycm9yCisJICogY29tcGxldGlvbiB3aW5zLCB0aGUgcWMgaGFzIEFUQV9RQ0ZMQUdfRkFJTEVEIHNldC4KKwkgKgorCSAqIFdoZW4gU0NTSSB0aW1lb3V0IHdpbnMsIHRoaW5ncyBhcmUgYSBiaXQgbW9yZSBjb21wbGV4LgorCSAqIE5vcm1hbCBvciBlcnJvciBjb21wbGV0aW9uIGNhbiBvY2N1ciBhZnRlciB0aGUgdGltZW91dCBidXQKKwkgKiBiZWZvcmUgdGhpcyBwb2ludC4gIEluIHN1Y2ggY2FzZXMsIGJvdGggdHlwZXMgb2YKKwkgKiBjb21wbGV0aW9ucyBhcmUgaG9ub3JlZC4gIEEgc2NtZCBpcyBkZXRlcm1pbmVkIHRvIGhhdmUKKwkgKiB0aW1lZCBvdXQgaWZmIGl0cyBhc3NvY2lhdGVkIHFjIGlzIGFjdGl2ZSBhbmQgbm90IGZhaWxlZC4KKwkgKi8KKwlpZiAoYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcikgeworCQlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kLCAqdG1wOworCQlpbnQgbnJfdGltZWRvdXQgPSAwOworCisJCXNwaW5fbG9ja19pcnFzYXZlKGFwX2xvY2ssIGZsYWdzKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2NtZCwgdG1wLCAmaG9zdC0+ZWhfY21kX3EsIGVoX2VudHJ5KSB7CisJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCisJCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9RVUVVRTsgaSsrKSB7CisJCQkJcWMgPSBfX2F0YV9xY19mcm9tX3RhZyhhcCwgaSk7CisJCQkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFICYmCisJCQkJICAgIHFjLT5zY3NpY21kID09IHNjbWQpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoaSA8IEFUQV9NQVhfUVVFVUUpIHsKKwkJCQkvKiB0aGUgc2NtZCBoYXMgYW4gYXNzb2NpYXRlZCBxYyAqLworCQkJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSkgeworCQkJCQkvKiB3aGljaCBoYXNuJ3QgZmFpbGVkIHlldCwgdGltZW91dCAqLworCQkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX1RJTUVPVVQ7CisJCQkJCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0ZBSUxFRDsKKwkJCQkJbnJfdGltZWRvdXQrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIE5vcm1hbCBjb21wbGV0aW9uIG9jY3VycmVkIGFmdGVyCisJCQkJICogU0NTSSB0aW1lb3V0IGJ1dCBiZWZvcmUgdGhpcyBwb2ludC4KKwkJCQkgKiBTdWNjZXNzZnVsbHkgY29tcGxldGUgaXQuCisJCQkJICovCisJCQkJc2NtZC0+cmV0cmllcyA9IHNjbWQtPmFsbG93ZWQ7CisJCQkJc2NzaV9laF9maW5pc2hfY21kKHNjbWQsICZhcC0+ZWhfZG9uZV9xKTsKKwkJCX0KKwkJfQorCisJCS8qIElmIHdlIGhhdmUgdGltZWQgb3V0IHFjcy4gIFRoZXkgYmVsb25nIHRvIEVIIGZyb20KKwkJICogdGhpcyBwb2ludCBidXQgdGhlIHN0YXRlIG9mIHRoZSBjb250cm9sbGVyIGlzCisJCSAqIHVua25vd24uICBGcmVlemUgdGhlIHBvcnQgdG8gbWFrZSBzdXJlIHRoZSBJUlEKKwkJICogaGFuZGxlciBkb2Vzbid0IGRpZGRsZSB3aXRoIHRob3NlIHFjcy4gIFRoaXMgbXVzdAorCQkgKiBiZSBkb25lIGF0b21pY2FsbHkgdy5yLnQuIHNldHRpbmcgUUNGTEFHX0ZBSUxFRC4KKwkJICovCisJCWlmIChucl90aW1lZG91dCkKKwkJCV9fYXRhX3BvcnRfZnJlZXplKGFwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UKKwkJc3Bpbl91bmxvY2tfd2FpdChhcF9sb2NrKTsKKworIHJlcGVhdDoKKwkvKiBpbnZva2UgZXJyb3IgaGFuZGxlciAqLworCWlmIChhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKSB7CisJCS8qIGZldGNoICYgY2xlYXIgRUggaW5mbyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShhcF9sb2NrLCBmbGFncyk7CisKKwkJbWVtc2V0KCZhcC0+ZWhfY29udGV4dCwgMCwgc2l6ZW9mKGFwLT5laF9jb250ZXh0KSk7CisJCWFwLT5laF9jb250ZXh0LmkgPSBhcC0+ZWhfaW5mbzsKKwkJbWVtc2V0KCZhcC0+ZWhfaW5mbywgMCwgc2l6ZW9mKGFwLT5laF9pbmZvKSk7CisKKwkJYXAtPmZsYWdzIHw9IEFUQV9GTEFHX0VIX0lOX1BST0dSRVNTOworCQlhcC0+ZmxhZ3MgJj0gfkFUQV9GTEFHX0VIX1BFTkRJTkc7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcF9sb2NrLCBmbGFncyk7CisKKwkJLyogaW52b2tlIEVILiAgaWYgdW5sb2FkaW5nLCBqdXN0IGZpbmlzaCBmYWlsZWQgcWNzICovCisJCWlmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX1VOTE9BRElORykpCisJCQlhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKGFwKTsKKwkJZWxzZQorCQkJYXRhX2VoX2ZpbmlzaChhcCk7CisKKwkJLyogRXhjZXB0aW9uIG1pZ2h0IGhhdmUgaGFwcGVuZCBhZnRlciAtPmVycm9yX2hhbmRsZXIKKwkJICogcmVjb3ZlcmVkIHRoZSBwb3J0IGJ1dCBiZWZvcmUgdGhpcyBwb2ludC4gIFJlcGVhdAorCQkgKiBFSCBpbiBzdWNoIGNhc2UuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZShhcF9sb2NrLCBmbGFncyk7CisKKwkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0VIX1BFTkRJTkcpIHsKKwkJCWlmICgtLXJlcGVhdF9jbnQpIHsKKwkJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywKKwkJCQkJIkVIIHBlbmRpbmcgYWZ0ZXIgY29tcGxldGlvbiwgIgorCQkJCQkicmVwZWF0aW5nIEVIIChjbnQ9JWQpXG4iLCByZXBlYXRfY250KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwX2xvY2ssIGZsYWdzKTsKKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJFSCBwZW5kaW5nIGFmdGVyICVkICIKKwkJCQkJInRyaWVzLCBnaXZpbmcgdXBcbiIsIEFUQV9FSF9NQVhfUkVQRUFUKTsKKwkJfQorCisJCS8qIHRoaXMgcnVuIGlzIGNvbXBsZXRlLCBtYWtlIHN1cmUgRUggaW5mbyBpcyBjbGVhciAqLworCQltZW1zZXQoJmFwLT5laF9pbmZvLCAwLCBzaXplb2YoYXAtPmVoX2luZm8pKTsKKworCQkvKiBDbGVhciBob3N0X2VoX3NjaGVkdWxlZCB3aGlsZSBob2xkaW5nIGFwX2xvY2sgc3VjaAorCQkgKiB0aGF0IGlmIGV4Y2VwdGlvbiBvY2N1cnMgYWZ0ZXIgdGhpcyBwb2ludCBidXQKKwkJICogYmVmb3JlIEVIIGNvbXBsZXRpb24sIFNDU0kgbWlkbGF5ZXIgd2lsbAorCQkgKiByZS1pbml0aWF0ZSBFSC4KKwkJICovCisJCWhvc3QtPmhvc3RfZWhfc2NoZWR1bGVkID0gMDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlXQVJOX09OKGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpID09IE5VTEwpOworCQlhcC0+b3BzLT5lbmdfdGltZW91dChhcCk7CisJfQorCisJLyogZmluaXNoIG9yIHJldHJ5IGhhbmRsZWQgc2NtZCdzIGFuZCBjbGVhbiB1cCAqLworCVdBUk5fT04oaG9zdC0+aG9zdF9mYWlsZWQgfHwgIWxpc3RfZW1wdHkoJmhvc3QtPmVoX2NtZF9xKSk7CisKKwlzY3NpX2VoX2ZsdXNoX2RvbmVfcSgmYXAtPmVoX2RvbmVfcSk7CisKKwkvKiBjbGVhbiB1cCAqLworCXNwaW5fbG9ja19pcnFzYXZlKGFwX2xvY2ssIGZsYWdzKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19MT0FESU5HKSB7CisJCWFwLT5mbGFncyAmPSB+QVRBX0ZMQUdfTE9BRElORzsKKwl9IGVsc2UgeworCQlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfU0NTSV9IT1RQTFVHKQorCQkJcXVldWVfd29yayhhdGFfYXV4X3dxLCAmYXAtPmhvdHBsdWdfdGFzayk7CisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19SRUNPVkVSRUQpCisJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywgIkVIIGNvbXBsZXRlXG4iKTsKKwl9CisKKwlhcC0+ZmxhZ3MgJj0gfihBVEFfRkxBR19TQ1NJX0hPVFBMVUcgfCBBVEFfRkxBR19SRUNPVkVSRUQpOworCisJLyogdGVsbCB3YWl0X2VoIHRoYXQgd2UncmUgZG9uZSAqLworCWFwLT5mbGFncyAmPSB+QVRBX0ZMQUdfRUhfSU5fUFJPR1JFU1M7CisJd2FrZV91cF9hbGwoJmFwLT5laF93YWl0X3EpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcF9sb2NrLCBmbGFncyk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfcG9ydF93YWl0X2VoIC0gV2FpdCBmb3IgdGhlIGN1cnJlbnRseSBwZW5kaW5nIEVIIHRvIGNvbXBsZXRlCisgKglAYXA6IFBvcnQgdG8gd2FpdCBFSCBmb3IKKyAqCisgKglXYWl0IHVudGlsIHRoZSBjdXJyZW50bHkgcGVuZGluZyBFSCBpcyBjb21wbGV0ZS4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICovCit2b2lkIGF0YV9wb3J0X3dhaXRfZWgoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCURFRklORV9XQUlUKHdhaXQpOworCisgcmV0cnk6CisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfRUhfUEVORElORyB8IEFUQV9GTEFHX0VIX0lOX1BST0dSRVNTKSkgeworCQlwcmVwYXJlX3RvX3dhaXQoJmFwLT5laF93YWl0X3EsICZ3YWl0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwl9CisJZmluaXNoX3dhaXQoJmFwLT5laF93YWl0X3EsICZ3YWl0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIG1ha2Ugc3VyZSBTQ1NJIEVIIGlzIGNvbXBsZXRlICovCisJaWYgKHNjc2lfaG9zdF9pbl9yZWNvdmVyeShhcC0+aG9zdCkpIHsKKwkJbXNsZWVwKDEwKTsKKwkJZ290byByZXRyeTsKKwl9Cit9CisKKy8qKgorICoJYXRhX3FjX3RpbWVvdXQgLSBIYW5kbGUgdGltZW91dCBvZiBxdWV1ZWQgY29tbWFuZAorICoJQHFjOiBDb21tYW5kIHRoYXQgdGltZWQgb3V0CisgKgorICoJU29tZSBwYXJ0IG9mIHRoZSBrZXJuZWwgKGN1cnJlbnRseSwgb25seSB0aGUgU0NTSSBsYXllcikKKyAqCWhhcyBub3RpY2VkIHRoYXQgdGhlIGFjdGl2ZSBjb21tYW5kIG9uIHBvcnQgQGFwIGhhcyBub3QKKyAqCWNvbXBsZXRlZCBhZnRlciBhIHNwZWNpZmllZCBsZW5ndGggb2YgdGltZS4gIEhhbmRsZSB0aGlzCisgKgljb25kaXRpb24gYnkgZGlzYWJsaW5nIERNQSAoaWYgbmVjZXNzYXJ5KSBhbmQgY29tcGxldGluZworICoJdHJhbnNhY3Rpb25zLCB3aXRoIGVycm9yIGlmIG5lY2Vzc2FyeS4KKyAqCisgKglUaGlzIGFsc28gaGFuZGxlcyB0aGUgY2FzZSBvZiB0aGUgImxvc3QgaW50ZXJydXB0Iiwgd2hlcmUKKyAqCWZvciBzb21lIHJlYXNvbiAocG9zc2libHkgaGFyZHdhcmUgYnVnLCBwb3NzaWJseSBkcml2ZXIgYnVnKQorICoJYW4gaW50ZXJydXB0IHdhcyBub3QgZGVsaXZlcmVkIHRvIHRoZSBkcml2ZXIsIGV2ZW4gdGhvdWdoIHRoZQorICoJdHJhbnNhY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqCisgKglUT0RPOiBraWxsIHRoaXMgZnVuY3Rpb24gb25jZSBvbGQgRUggaXMgZ29uZS4KKyAqCisgKglMT0NLSU5HOgorICoJSW5oZXJpdGVkIGZyb20gU0NTSSBsYXllciAobm9uZSwgY2FuIHNsZWVwKQorICovCitzdGF0aWMgdm9pZCBhdGFfcWNfdGltZW91dChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJdTggaG9zdF9zdGF0ID0gMCwgZHJ2X3N0YXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsoIkVOVEVSXG4iKTsKKworCWFwLT5oc21fdGFza19zdGF0ZSA9IEhTTV9TVF9JRExFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CisKKwljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX0FUQVBJX0RNQToKKwkJaG9zdF9zdGF0ID0gYXAtPm9wcy0+Ym1kbWFfc3RhdHVzKGFwKTsKKworCQkvKiBiZWZvcmUgd2UgZG8gYW55dGhpbmcgZWxzZSwgY2xlYXIgRE1BLVN0YXJ0IGJpdCAqLworCQlhcC0+b3BzLT5ibWRtYV9zdG9wKHFjKTsKKworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWRlZmF1bHQ6CisJCWF0YV9hbHRzdGF0dXMoYXApOworCQlkcnZfc3RhdCA9IGF0YV9jaGtfc3RhdHVzKGFwKTsKKworCQkvKiBhY2sgYm1kbWEgaXJxIGV2ZW50cyAqLworCQlhcC0+b3BzLT5pcnFfY2xlYXIoYXApOworCisJCWF0YV9kZXZfcHJpbnRrKHFjLT5kZXYsIEtFUk5fRVJSLCAiY29tbWFuZCAweCV4IHRpbWVvdXQsICIKKwkJCSAgICAgICAic3RhdCAweCV4IGhvc3Rfc3RhdCAweCV4XG4iLAorCQkJICAgICAgIHFjLT50Zi5jb21tYW5kLCBkcnZfc3RhdCwgaG9zdF9zdGF0KTsKKworCQkvKiBjb21wbGV0ZSB0YXNrZmlsZSB0cmFuc2FjdGlvbiAqLworCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX1RJTUVPVVQ7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCWF0YV9laF9xY19jb21wbGV0ZShxYyk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfZW5nX3RpbWVvdXQgLSBIYW5kbGUgdGltZW91dCBvZiBxdWV1ZWQgY29tbWFuZAorICoJQGFwOiBQb3J0IG9uIHdoaWNoIHRpbWVkLW91dCBjb21tYW5kIGlzIGFjdGl2ZQorICoKKyAqCVNvbWUgcGFydCBvZiB0aGUga2VybmVsIChjdXJyZW50bHksIG9ubHkgdGhlIFNDU0kgbGF5ZXIpCisgKgloYXMgbm90aWNlZCB0aGF0IHRoZSBhY3RpdmUgY29tbWFuZCBvbiBwb3J0IEBhcCBoYXMgbm90CisgKgljb21wbGV0ZWQgYWZ0ZXIgYSBzcGVjaWZpZWQgbGVuZ3RoIG9mIHRpbWUuICBIYW5kbGUgdGhpcworICoJY29uZGl0aW9uIGJ5IGRpc2FibGluZyBETUEgKGlmIG5lY2Vzc2FyeSkgYW5kIGNvbXBsZXRpbmcKKyAqCXRyYW5zYWN0aW9ucywgd2l0aCBlcnJvciBpZiBuZWNlc3NhcnkuCisgKgorICoJVGhpcyBhbHNvIGhhbmRsZXMgdGhlIGNhc2Ugb2YgdGhlICJsb3N0IGludGVycnVwdCIsIHdoZXJlCisgKglmb3Igc29tZSByZWFzb24gKHBvc3NpYmx5IGhhcmR3YXJlIGJ1ZywgcG9zc2libHkgZHJpdmVyIGJ1ZykKKyAqCWFuIGludGVycnVwdCB3YXMgbm90IGRlbGl2ZXJlZCB0byB0aGUgZHJpdmVyLCBldmVuIHRob3VnaCB0aGUKKyAqCXRyYW5zYWN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgKgorICoJVE9ETzoga2lsbCB0aGlzIGZ1bmN0aW9uIG9uY2Ugb2xkIEVIIGlzIGdvbmUuCisgKgorICoJTE9DS0lORzoKKyAqCUluaGVyaXRlZCBmcm9tIFNDU0kgbGF5ZXIgKG5vbmUsIGNhbiBzbGVlcCkKKyAqLwordm9pZCBhdGFfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlhdGFfcWNfdGltZW91dChhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKSk7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKK30KKworLyoqCisgKglhdGFfcWNfc2NoZWR1bGVfZWggLSBzY2hlZHVsZSBxYyBmb3IgZXJyb3IgaGFuZGxpbmcKKyAqCUBxYzogY29tbWFuZCB0byBzY2hlZHVsZSBlcnJvciBoYW5kbGluZyBmb3IKKyAqCisgKglTY2hlZHVsZSBlcnJvciBoYW5kbGluZyBmb3IgQHFjLiAgRUggd2lsbCBraWNrIGluIGFzIHNvb24gYXMKKyAqCW90aGVyIGNvbW1hbmRzIGFyZSBkcmFpbmVkLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCit2b2lkIGF0YV9xY19zY2hlZHVsZV9laChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisKKwlXQVJOX09OKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKTsKKworCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0ZBSUxFRDsKKwlxYy0+YXAtPmZsYWdzIHw9IEFUQV9GTEFHX0VIX1BFTkRJTkc7CisKKwkvKiBUaGUgZm9sbG93aW5nIHdpbGwgZmFpbCBpZiB0aW1lb3V0IGhhcyBhbHJlYWR5IGV4cGlyZWQuCisJICogYXRhX3Njc2lfZXJyb3IoKSB0YWtlcyBjYXJlIG9mIHN1Y2ggc2NtZHMgb24gRUggZW50cnkuCisJICogTm90ZSB0aGF0IEFUQV9RQ0ZMQUdfRkFJTEVEIGlzIHVuY29uZGl0aW9uYWxseSBzZXQgYWZ0ZXIKKwkgKiB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlcy4KKwkgKi8KKwlzY3NpX3JlcV9hYm9ydF9jbWQocWMtPnNjc2ljbWQpOworfQorCisvKioKKyAqCWF0YV9wb3J0X3NjaGVkdWxlX2VoIC0gc2NoZWR1bGUgZXJyb3IgaGFuZGxpbmcgd2l0aG91dCBhIHFjCisgKglAYXA6IEFUQSBwb3J0IHRvIHNjaGVkdWxlIEVIIGZvcgorICoKKyAqCVNjaGVkdWxlIGVycm9yIGhhbmRsaW5nIGZvciBAYXAuICBFSCB3aWxsIGtpY2sgaW4gYXMgc29vbiBhcworICoJYWxsIGNvbW1hbmRzIGFyZSBkcmFpbmVkLgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICovCit2b2lkIGF0YV9wb3J0X3NjaGVkdWxlX2VoKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJV0FSTl9PTighYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcik7CisKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfRUhfUEVORElORzsKKwlzY3NpX3NjaGVkdWxlX2VoKGFwLT5ob3N0KTsKKworCURQUklOVEsoInBvcnQgRUggc2NoZWR1bGVkXG4iKTsKK30KKworLyoqCisgKglhdGFfcG9ydF9hYm9ydCAtIGFib3J0IGFsbCBxYydzIG9uIHRoZSBwb3J0CisgKglAYXA6IEFUQSBwb3J0IHRvIGFib3J0IHFjJ3MgZm9yCisgKgorICoJQWJvcnQgYWxsIGFjdGl2ZSBxYydzIG9mIEBhcCBhbmQgc2NoZWR1bGUgRUguCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCU51bWJlciBvZiBhYm9ydGVkIHFjJ3MuCisgKi8KK2ludCBhdGFfcG9ydF9hYm9ydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCB0YWcsIG5yX2Fib3J0ZWQgPSAwOworCisJV0FSTl9PTighYXAtPm9wcy0+ZXJyb3JfaGFuZGxlcik7CisKKwlmb3IgKHRhZyA9IDA7IHRhZyA8IEFUQV9NQVhfUVVFVUU7IHRhZysrKSB7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisKKwkJaWYgKHFjKSB7CisJCQlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19GQUlMRUQ7CisJCQlhdGFfcWNfY29tcGxldGUocWMpOworCQkJbnJfYWJvcnRlZCsrOworCQl9CisJfQorCisJaWYgKCFucl9hYm9ydGVkKQorCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisKKwlyZXR1cm4gbnJfYWJvcnRlZDsKK30KKworLyoqCisgKglfX2F0YV9wb3J0X2ZyZWV6ZSAtIGZyZWV6ZSBwb3J0CisgKglAYXA6IEFUQSBwb3J0IHRvIGZyZWV6ZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gSFNNIHZpb2xhdGlvbiBvciBzb21lIG90aGVyCisgKgljb25kaXRpb24gZGlzcnVwdHMgbm9ybWFsIG9wZXJhdGlvbiBvZiB0aGUgcG9ydC4gIEZyb3plbiBwb3J0CisgKglpcyBub3QgYWxsb3dlZCB0byBwZXJmb3JtIGFueSBvcGVyYXRpb24gdW50aWwgdGhlIHBvcnQgaXMKKyAqCXRoYXdlZCwgd2hpY2ggdXN1YWxseSBmb2xsb3dzIGEgc3VjY2Vzc2Z1bCByZXNldC4KKyAqCisgKglhcC0+b3BzLT5mcmVlemUoKSBjYWxsYmFjayBjYW4gYmUgdXNlZCBmb3IgZnJlZXppbmcgdGhlIHBvcnQKKyAqCWhhcmR3YXJlLXdpc2UgKGUuZy4gbWFzayBpbnRlcnJ1cHQgYW5kIHN0b3AgRE1BIGVuZ2luZSkuICBJZiBhCisgKglwb3J0IGNhbm5vdCBiZSBmcm96ZW4gaGFyZHdhcmUtd2lzZSwgdGhlIGludGVycnVwdCBoYW5kbGVyCisgKgltdXN0IGFjayBhbmQgY2xlYXIgaW50ZXJydXB0cyB1bmNvbmRpdGlvbmFsbHkgd2hpbGUgdGhlIHBvcnQKKyAqCWlzIGZyb3plbi4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqLworc3RhdGljIHZvaWQgX19hdGFfcG9ydF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlXQVJOX09OKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKTsKKworCWlmIChhcC0+b3BzLT5mcmVlemUpCisJCWFwLT5vcHMtPmZyZWV6ZShhcCk7CisKKwlhcC0+ZmxhZ3MgfD0gQVRBX0ZMQUdfRlJPWkVOOworCisJRFBSSU5USygiYXRhJXUgcG9ydCBmcm96ZW5cbiIsIGFwLT5pZCk7Cit9CisKKy8qKgorICoJYXRhX3BvcnRfZnJlZXplIC0gYWJvcnQgJiBmcmVlemUgcG9ydAorICoJQGFwOiBBVEEgcG9ydCB0byBmcmVlemUKKyAqCisgKglBYm9ydCBhbmQgZnJlZXplIEBhcC4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJTnVtYmVyIG9mIGFib3J0ZWQgY29tbWFuZHMuCisgKi8KK2ludCBhdGFfcG9ydF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlpbnQgbnJfYWJvcnRlZDsKKworCVdBUk5fT04oIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpOworCisJbnJfYWJvcnRlZCA9IGF0YV9wb3J0X2Fib3J0KGFwKTsKKwlfX2F0YV9wb3J0X2ZyZWV6ZShhcCk7CisKKwlyZXR1cm4gbnJfYWJvcnRlZDsKK30KKworLyoqCisgKglhdGFfZWhfZnJlZXplX3BvcnQgLSBFSCBoZWxwZXIgdG8gZnJlZXplIHBvcnQKKyAqCUBhcDogQVRBIHBvcnQgdG8gZnJlZXplCisgKgorICoJRnJlZXplIEBhcC4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLwordm9pZCBhdGFfZWhfZnJlZXplX3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCV9fYXRhX3BvcnRfZnJlZXplKGFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICoJYXRhX3BvcnRfdGhhd19wb3J0IC0gRUggaGVscGVyIHRvIHRoYXcgcG9ydAorICoJQGFwOiBBVEEgcG9ydCB0byB0aGF3CisgKgorICoJVGhhdyBmcm96ZW4gcG9ydCBAYXAuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KK3ZvaWQgYXRhX2VoX3RoYXdfcG9ydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwlhcC0+ZmxhZ3MgJj0gfkFUQV9GTEFHX0ZST1pFTjsKKworCWlmIChhcC0+b3BzLT50aGF3KQorCQlhcC0+b3BzLT50aGF3KGFwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCURQUklOVEsoImF0YSV1IHBvcnQgdGhhd2VkXG4iLCBhcC0+aWQpOworfQorCitzdGF0aWMgdm9pZCBhdGFfZWhfc2NzaWRvbmUoc3RydWN0IHNjc2lfY21uZCAqc2NtZCkKK3sKKwkvKiBuYWRhICovCit9CisKK3N0YXRpYyB2b2lkIF9fYXRhX2VoX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gcWMtPnNjc2ljbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisJcWMtPnNjc2lkb25lID0gYXRhX2VoX3Njc2lkb25lOworCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwlXQVJOX09OKGF0YV90YWdfdmFsaWQocWMtPnRhZykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKworCXNjc2lfZWhfZmluaXNoX2NtZChzY21kLCAmYXAtPmVoX2RvbmVfcSk7Cit9CisKKy8qKgorICoJYXRhX2VoX3FjX2NvbXBsZXRlIC0gQ29tcGxldGUgYW4gYWN0aXZlIEFUQSBjb21tYW5kIGZyb20gRUgKKyAqCUBxYzogQ29tbWFuZCB0byBjb21wbGV0ZQorICoKKyAqCUluZGljYXRlIHRvIHRoZSBtaWQgYW5kIHVwcGVyIGxheWVycyB0aGF0IGFuIEFUQSBjb21tYW5kIGhhcworICoJY29tcGxldGVkLiAgVG8gYmUgdXNlZCBmcm9tIEVILgorICovCit2b2lkIGF0YV9laF9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKnNjbWQgPSBxYy0+c2NzaWNtZDsKKwlzY21kLT5yZXRyaWVzID0gc2NtZC0+YWxsb3dlZDsKKwlfX2F0YV9laF9xY19jb21wbGV0ZShxYyk7Cit9CisKKy8qKgorICoJYXRhX2VoX3FjX3JldHJ5IC0gVGVsbCBtaWRsYXllciB0byByZXRyeSBhbiBBVEEgY29tbWFuZCBhZnRlciBFSAorICoJQHFjOiBDb21tYW5kIHRvIHJldHJ5CisgKgorICoJSW5kaWNhdGUgdG8gdGhlIG1pZCBhbmQgdXBwZXIgbGF5ZXJzIHRoYXQgYW4gQVRBIGNvbW1hbmQKKyAqCXNob3VsZCBiZSByZXRyaWVkLiAgVG8gYmUgdXNlZCBmcm9tIEVILgorICoKKyAqCVNDU0kgbWlkbGF5ZXIgbGltaXRzIHRoZSBudW1iZXIgb2YgcmV0cmllcyB0byBzY21kLT5hbGxvd2VkLgorICoJc2NtZC0+cmV0cmllcyBpcyBkZWNyZW1lbnRlZCBmb3IgY29tbWFuZHMgd2hpY2ggZ2V0IHJldHJpZWQKKyAqCWR1ZSB0byB1bnJlbGF0ZWQgZmFpbHVyZXMgKHFjLT5lcnJfbWFzayBpcyB6ZXJvKS4KKyAqLwordm9pZCBhdGFfZWhfcWNfcmV0cnkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY21kID0gcWMtPnNjc2ljbWQ7CisJaWYgKCFxYy0+ZXJyX21hc2sgJiYgc2NtZC0+cmV0cmllcykKKwkJc2NtZC0+cmV0cmllcy0tOworCV9fYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKK30KKworLyoqCisgKglhdGFfZWhfZGV0YWNoX2RldiAtIGRldGFjaCBBVEEgZGV2aWNlCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIGRldGFjaAorICoKKyAqCURldGFjaCBAZGV2LgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBhdGFfZWhfZGV0YWNoX2RldihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhdGFfZGV2X2Rpc2FibGUoZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwlkZXYtPmZsYWdzICY9IH5BVEFfREZMQUdfREVUQUNIOworCisJaWYgKGF0YV9zY3NpX29mZmxpbmVfZGV2KGRldikpIHsKKwkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfREVUQUNIRUQ7CisJCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TQ1NJX0hPVFBMVUc7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhdGFfZWhfY2xlYXJfYWN0aW9uKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGF0YV9laF9pbmZvICplaGksIHVuc2lnbmVkIGludCBhY3Rpb24pCit7CisJaW50IGk7CisKKwlpZiAoIWRldikgeworCQllaGktPmFjdGlvbiAmPSB+YWN0aW9uOworCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCQllaGktPmRldl9hY3Rpb25baV0gJj0gfmFjdGlvbjsKKwl9IGVsc2UgeworCQkvKiBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHBvcnQtd2lkZSBFSCBhY3Rpb25zICovCisJCVdBUk5fT04oIShhY3Rpb24gJiBBVEFfRUhfUEVSREVWX01BU0spKTsKKworCQkvKiBicmVhayBlaGktPmFjdGlvbiBpbnRvIGVoaS0+ZGV2X2FjdGlvbiAqLworCQlpZiAoZWhpLT5hY3Rpb24gJiBhY3Rpb24pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykKKwkJCQllaGktPmRldl9hY3Rpb25baV0gfD0gZWhpLT5hY3Rpb24gJiBhY3Rpb247CisJCQllaGktPmFjdGlvbiAmPSB+YWN0aW9uOworCQl9CisKKwkJLyogdHVybiBvZmYgdGhlIHNwZWNpZmllZCBwZXItZGV2IGFjdGlvbiAqLworCQllaGktPmRldl9hY3Rpb25bZGV2LT5kZXZub10gJj0gfmFjdGlvbjsKKwl9Cit9CisKKy8qKgorICoJYXRhX2VoX2Fib3V0X3RvX2RvIC0gYWJvdXQgdG8gcGVyZm9ybSBlaF9hY3Rpb24KKyAqCUBhcDogdGFyZ2V0IEFUQSBwb3J0CisgKglAZGV2OiB0YXJnZXQgQVRBIGRldiBmb3IgcGVyLWRldiBhY3Rpb24gKGNhbiBiZSBOVUxMKQorICoJQGFjdGlvbjogYWN0aW9uIGFib3V0IHRvIGJlIHBlcmZvcm1lZAorICoKKyAqCUNhbGxlZCBqdXN0IGJlZm9yZSBwZXJmb3JtaW5nIEVIIGFjdGlvbnMgdG8gY2xlYXIgcmVsYXRlZCBiaXRzCisgKglpbiBAYXAtPmVoX2luZm8gc3VjaCB0aGF0IGVoIGFjdGlvbnMgYXJlIG5vdCB1bm5lY2Vzc2FyaWx5CisgKglyZXBlYXRlZC4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqLworc3RhdGljIHZvaWQgYXRhX2VoX2Fib3V0X3RvX2RvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGFjdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwlhdGFfZWhfY2xlYXJfYWN0aW9uKGRldiwgJmFwLT5laF9pbmZvLCBhY3Rpb24pOworCWFwLT5mbGFncyB8PSBBVEFfRkxBR19SRUNPVkVSRUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShhcC0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqCWF0YV9laF9kb25lIC0gRUggYWN0aW9uIGNvbXBsZXRlCisgKglAYXA6IHRhcmdldCBBVEEgcG9ydAorICoJQGRldjogdGFyZ2V0IEFUQSBkZXYgZm9yIHBlci1kZXYgYWN0aW9uIChjYW4gYmUgTlVMTCkKKyAqCUBhY3Rpb246IGFjdGlvbiBqdXN0IGNvbXBsZXRlZAorICoKKyAqCUNhbGxlZCByaWdodCBhZnRlciBwZXJmb3JtaW5nIEVIIGFjdGlvbnMgdG8gY2xlYXIgcmVsYXRlZCBiaXRzCisgKglpbiBAYXAtPmVoX2NvbnRleHQuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9laF9kb25lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQl1bnNpZ25lZCBpbnQgYWN0aW9uKQoreworCWF0YV9laF9jbGVhcl9hY3Rpb24oZGV2LCAmYXAtPmVoX2NvbnRleHQuaSwgYWN0aW9uKTsKK30KKworLyoqCisgKglhdGFfZXJyX3N0cmluZyAtIGNvbnZlcnQgZXJyX21hc2sgdG8gZGVzY3JpcHRpdmUgc3RyaW5nCisgKglAZXJyX21hc2s6IGVycm9yIG1hc2sgdG8gY29udmVydCB0byBzdHJpbmcKKyAqCisgKglDb252ZXJ0IEBlcnJfbWFzayB0byBkZXNjcmlwdGl2ZSBzdHJpbmcuICBFcnJvcnMgYXJlCisgKglwcmlvcml0aXplZCBhY2NvcmRpbmcgdG8gc2V2ZXJpdHkgYW5kIG9ubHkgdGhlIG1vc3Qgc2V2ZXJlCisgKgllcnJvciBpcyByZXBvcnRlZC4KKyAqCisgKglMT0NLSU5HOgorICoJTm9uZS4KKyAqCisgKglSRVRVUk5TOgorICoJRGVzY3JpcHRpdmUgc3RyaW5nIGZvciBAZXJyX21hc2sKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKiBhdGFfZXJyX3N0cmluZyh1bnNpZ25lZCBpbnQgZXJyX21hc2spCit7CisJaWYgKGVycl9tYXNrICYgQUNfRVJSX0hPU1RfQlVTKQorCQlyZXR1cm4gImhvc3QgYnVzIGVycm9yIjsKKwlpZiAoZXJyX21hc2sgJiBBQ19FUlJfQVRBX0JVUykKKwkJcmV0dXJuICJBVEEgYnVzIGVycm9yIjsKKwlpZiAoZXJyX21hc2sgJiBBQ19FUlJfVElNRU9VVCkKKwkJcmV0dXJuICJ0aW1lb3V0IjsKKwlpZiAoZXJyX21hc2sgJiBBQ19FUlJfSFNNKQorCQlyZXR1cm4gIkhTTSB2aW9sYXRpb24iOworCWlmIChlcnJfbWFzayAmIEFDX0VSUl9TWVNURU0pCisJCXJldHVybiAiaW50ZXJuYWwgZXJyb3IiOworCWlmIChlcnJfbWFzayAmIEFDX0VSUl9NRURJQSkKKwkJcmV0dXJuICJtZWRpYSBlcnJvciI7CisJaWYgKGVycl9tYXNrICYgQUNfRVJSX0lOVkFMSUQpCisJCXJldHVybiAiaW52YWxpZCBhcmd1bWVudCI7CisJaWYgKGVycl9tYXNrICYgQUNfRVJSX0RFVikKKwkJcmV0dXJuICJkZXZpY2UgZXJyb3IiOworCXJldHVybiAidW5rbm93biBlcnJvciI7Cit9CisKKy8qKgorICoJYXRhX3JlYWRfbG9nX3BhZ2UgLSByZWFkIGEgc3BlY2lmaWMgbG9nIHBhZ2UKKyAqCUBkZXY6IHRhcmdldCBkZXZpY2UKKyAqCUBwYWdlOiBwYWdlIHRvIHJlYWQKKyAqCUBidWY6IGJ1ZmZlciB0byBzdG9yZSByZWFkIHBhZ2UKKyAqCUBzZWN0b3JzOiBudW1iZXIgb2Ygc2VjdG9ycyB0byByZWFkCisgKgorICoJUmVhZCBsb2cgcGFnZSB1c2luZyBSRUFEX0xPR19FWFQgY29tbWFuZC4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIEFDX0VSUl8qIG1hc2sgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGF0YV9yZWFkX2xvZ19wYWdlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkJICAgICAgdTggcGFnZSwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc2VjdG9ycykKK3sKKwlzdHJ1Y3QgYXRhX3Rhc2tmaWxlIHRmOworCXVuc2lnbmVkIGludCBlcnJfbWFzazsKKworCURQUklOVEsoInJlYWQgbG9nIHBhZ2UgLSBwYWdlICVkXG4iLCBwYWdlKTsKKworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKKwl0Zi5jb21tYW5kID0gQVRBX0NNRF9SRUFEX0xPR19FWFQ7CisJdGYubGJhbCA9IHBhZ2U7CisJdGYubnNlY3QgPSBzZWN0b3JzOworCXRmLmhvYl9uc2VjdCA9IHNlY3RvcnMgPj4gODsKKwl0Zi5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0xCQTQ4IHwgQVRBX1RGTEFHX0RFVklDRTsKKwl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX1BJTzsKKworCWVycl9tYXNrID0gYXRhX2V4ZWNfaW50ZXJuYWwoZGV2LCAmdGYsIE5VTEwsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkgICAgIGJ1Ziwgc2VjdG9ycyAqIEFUQV9TRUNUX1NJWkUpOworCisJRFBSSU5USygiRVhJVCwgZXJyX21hc2s9JXhcbiIsIGVycl9tYXNrKTsKKwlyZXR1cm4gZXJyX21hc2s7Cit9CisKKy8qKgorICoJYXRhX2VoX3JlYWRfbG9nXzEwaCAtIFJlYWQgbG9nIHBhZ2UgMTBoIGZvciBOQ1EgZXJyb3IgZGV0YWlscworICoJQGRldjogRGV2aWNlIHRvIHJlYWQgbG9nIHBhZ2UgMTBoIGZyb20KKyAqCUB0YWc6IFJlc3VsdGluZyB0YWcgb2YgdGhlIGZhaWxlZCBjb21tYW5kCisgKglAdGY6IFJlc3VsdGluZyB0YXNrZmlsZSByZWdpc3RlcnMgb2YgdGhlIGZhaWxlZCBjb21tYW5kCisgKgorICoJUmVhZCBsb2cgcGFnZSAxMGggdG8gb2J0YWluIE5DUSBlcnJvciBkZXRhaWxzIGFuZCBjbGVhciBlcnJvcgorICoJY29uZGl0aW9uLgorICoKKyAqCUxPQ0tJTkc6CisgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgLWVycm5vIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBhdGFfZWhfcmVhZF9sb2dfMTBoKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkgICAgICAgaW50ICp0YWcsIHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXU4ICpidWYgPSBkZXYtPmFwLT5zZWN0b3JfYnVmOworCXVuc2lnbmVkIGludCBlcnJfbWFzazsKKwl1OCBjc3VtOworCWludCBpOworCisJZXJyX21hc2sgPSBhdGFfcmVhZF9sb2dfcGFnZShkZXYsIEFUQV9MT0dfU0FUQV9OQ1EsIGJ1ZiwgMSk7CisJaWYgKGVycl9tYXNrKQorCQlyZXR1cm4gLUVJTzsKKworCWNzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBBVEFfU0VDVF9TSVpFOyBpKyspCisJCWNzdW0gKz0gYnVmW2ldOworCWlmIChjc3VtKQorCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKKwkJCSAgICAgICAiaW52YWxpZCBjaGVja3N1bSAweCV4IG9uIGxvZyBwYWdlIDEwaFxuIiwgY3N1bSk7CisKKwlpZiAoYnVmWzBdICYgMHg4MCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwkqdGFnID0gYnVmWzBdICYgMHgxZjsKKworCXRmLT5jb21tYW5kID0gYnVmWzJdOworCXRmLT5mZWF0dXJlID0gYnVmWzNdOworCXRmLT5sYmFsID0gYnVmWzRdOworCXRmLT5sYmFtID0gYnVmWzVdOworCXRmLT5sYmFoID0gYnVmWzZdOworCXRmLT5kZXZpY2UgPSBidWZbN107CisJdGYtPmhvYl9sYmFsID0gYnVmWzhdOworCXRmLT5ob2JfbGJhbSA9IGJ1Zls5XTsKKwl0Zi0+aG9iX2xiYWggPSBidWZbMTBdOworCXRmLT5uc2VjdCA9IGJ1ZlsxMl07CisJdGYtPmhvYl9uc2VjdCA9IGJ1ZlsxM107CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFwaV9laF9yZXF1ZXN0X3NlbnNlIC0gcGVyZm9ybSBBVEFQSSBSRVFVRVNUX1NFTlNFCisgKglAZGV2OiBkZXZpY2UgdG8gcGVyZm9ybSBSRVFVRVNUX1NFTlNFIHRvCisgKglAc2Vuc2VfYnVmOiByZXN1bHQgc2Vuc2UgZGF0YSBidWZmZXIgKFNDU0lfU0VOU0VfQlVGRkVSU0laRSBieXRlcyBsb25nKQorICoKKyAqCVBlcmZvcm0gQVRBUEkgUkVRVUVTVF9TRU5TRSBhZnRlciB0aGUgZGV2aWNlIHJlcG9ydGVkIENIRUNLCisgKglTRU5TRS4gIFRoaXMgZnVuY3Rpb24gaXMgRUggaGVscGVyLgorICoKKyAqCUxPQ0tJTkc6CisgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCisgKgorICoJUkVUVVJOUzoKKyAqCTAgb24gc3VjY2VzcywgQUNfRVJSXyogbWFzayBvbiBmYWlsdXJlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXRhcGlfZWhfcmVxdWVzdF9zZW5zZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAorCQkJCQkgICB1bnNpZ25lZCBjaGFyICpzZW5zZV9idWYpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRldi0+YXA7CisJc3RydWN0IGF0YV90YXNrZmlsZSB0ZjsKKwl1OCBjZGJbQVRBUElfQ0RCX0xFTl07CisKKwlEUFJJTlRLKCJBVEFQSSByZXF1ZXN0IHNlbnNlXG4iKTsKKworCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKKworCS8qIEZJWE1FOiBpcyB0aGlzIG5lZWRlZD8gKi8KKwltZW1zZXQoc2Vuc2VfYnVmLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworCisJLyogWFhYOiB3aHkgdGZfcmVhZCBoZXJlPyAqLworCWFwLT5vcHMtPnRmX3JlYWQoYXAsICZ0Zik7CisKKwkvKiBmaWxsIHRoZXNlIGluLCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhleSBhcmUgLW5vdC0gb3ZlcndyaXR0ZW4gKi8KKwlzZW5zZV9idWZbMF0gPSAweDcwOworCXNlbnNlX2J1ZlsyXSA9IHRmLmZlYXR1cmUgPj4gNDsKKworCW1lbXNldChjZGIsIDAsIEFUQVBJX0NEQl9MRU4pOworCWNkYlswXSA9IFJFUVVFU1RfU0VOU0U7CisJY2RiWzRdID0gU0NTSV9TRU5TRV9CVUZGRVJTSVpFOworCisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisJdGYuY29tbWFuZCA9IEFUQV9DTURfUEFDS0VUOworCisJLyogaXMgaXQgcG9pbnRsZXNzIHRvIHByZWZlciBQSU8gZm9yICJzYWZldHkgcmVhc29ucyI/ICovCisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1BJT19ETUEpIHsKKwkJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9BVEFQSV9ETUE7CisJCXRmLmZlYXR1cmUgfD0gQVRBUElfUEtUX0RNQTsKKwl9IGVsc2UgeworCQl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX0FUQVBJOworCQl0Zi5sYmFtID0gKDggKiAxMDI0KSAmIDB4ZmY7CisJCXRmLmxiYWggPSAoOCAqIDEwMjQpID4+IDg7CisJfQorCisJcmV0dXJuIGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBjZGIsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkgc2Vuc2VfYnVmLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOworfQorCisvKioKKyAqCWF0YV9laF9hbmFseXplX3NlcnJvciAtIGFuYWx5emUgU0Vycm9yIGZvciBhIGZhaWxlZCBwb3J0CisgKglAYXA6IEFUQSBwb3J0IHRvIGFuYWx5emUgU0Vycm9yIGZvcgorICoKKyAqCUFuYWx5emUgU0Vycm9yIGlmIGF2YWlsYWJsZSBhbmQgZnVydGhlciBkZXRlcm1pbmUgY2F1c2Ugb2YKKyAqCWZhaWx1cmUuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9laF9hbmFseXplX3NlcnJvcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OworCXUzMiBzZXJyb3IgPSBlaGMtPmkuc2Vycm9yOworCXVuc2lnbmVkIGludCBlcnJfbWFzayA9IDAsIGFjdGlvbiA9IDA7CisKKwlpZiAoc2Vycm9yICYgU0VSUl9QRVJTSVNURU5UKSB7CisJCWVycl9tYXNrIHw9IEFDX0VSUl9BVEFfQlVTOworCQlhY3Rpb24gfD0gQVRBX0VIX0hBUkRSRVNFVDsKKwl9CisJaWYgKHNlcnJvciAmCisJICAgIChTRVJSX0RBVEFfUkVDT1ZFUkVEIHwgU0VSUl9DT01NX1JFQ09WRVJFRCB8IFNFUlJfREFUQSkpIHsKKwkJZXJyX21hc2sgfD0gQUNfRVJSX0FUQV9CVVM7CisJCWFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCX0KKwlpZiAoc2Vycm9yICYgU0VSUl9QUk9UT0NPTCkgeworCQllcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQlhY3Rpb24gfD0gQVRBX0VIX1NPRlRSRVNFVDsKKwl9CisJaWYgKHNlcnJvciAmIFNFUlJfSU5URVJOQUwpIHsKKwkJZXJyX21hc2sgfD0gQUNfRVJSX1NZU1RFTTsKKwkJYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJfQorCWlmIChzZXJyb3IgJiAoU0VSUl9QSFlSRFlfQ0hHIHwgU0VSUl9ERVZfWENIRykpCisJCWF0YV9laGlfaG90cGx1Z2dlZCgmZWhjLT5pKTsKKworCWVoYy0+aS5lcnJfbWFzayB8PSBlcnJfbWFzazsKKwllaGMtPmkuYWN0aW9uIHw9IGFjdGlvbjsKK30KKworLyoqCisgKglhdGFfZWhfYW5hbHl6ZV9uY3FfZXJyb3IgLSBhbmFseXplIE5DUSBlcnJvcgorICoJQGFwOiBBVEEgcG9ydCB0byBhbmFseXplIE5DUSBlcnJvciBmb3IKKyAqCisgKglSZWFkIGxvZyBwYWdlIDEwaCwgZGV0ZXJtaW5lIHRoZSBvZmZlbmRpbmcgcWMgYW5kIGFjcXVpcmUKKyAqCWVycm9yIHN0YXR1cyBURi4gIEZvciBOQ1EgZGV2aWNlIGVycm9ycywgYWxsIExMRERzIGhhdmUgdG8gZG8KKyAqCWlzIHNldHRpbmcgQUNfRVJSX0RFViBpbiBlaGktPmVycl9tYXNrLiAgVGhpcyBmdW5jdGlvbiB0YWtlcworICoJY2FyZSBvZiB0aGUgcmVzdC4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICovCitzdGF0aWMgdm9pZCBhdGFfZWhfYW5hbHl6ZV9uY3FfZXJyb3Ioc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZhcC0+ZWhfY29udGV4dDsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gYXAtPmRldmljZTsKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisJaW50IHRhZywgcmM7CisKKwkvKiBpZiBmcm96ZW4sIHdlIGNhbid0IGRvIG11Y2ggKi8KKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRlJPWkVOKQorCQlyZXR1cm47CisKKwkvKiBpcyBpdCBOQ1EgZGV2aWNlIGVycm9yPyAqLworCWlmICghYXAtPnNhY3RpdmUgfHwgIShlaGMtPmkuZXJyX21hc2sgJiBBQ19FUlJfREVWKSkKKwkJcmV0dXJuOworCisJLyogaGFzIExMREQgYW5hbHl6ZWQgYWxyZWFkeT8gKi8KKwlmb3IgKHRhZyA9IDA7IHRhZyA8IEFUQV9NQVhfUVVFVUU7IHRhZysrKSB7CisJCXFjID0gX19hdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisKKwkJaWYgKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHFjLT5lcnJfbWFzaykKKwkJCXJldHVybjsKKwl9CisKKwkvKiBva2F5LCB0aGlzIGVycm9yIGlzIG91cnMgKi8KKwlyYyA9IGF0YV9laF9yZWFkX2xvZ18xMGgoZGV2LCAmdGFnLCAmdGYpOworCWlmIChyYykgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiZmFpbGVkIHRvIHJlYWQgbG9nIHBhZ2UgMTBoICIKKwkJCQkiKGVycm5vPSVkKVxuIiwgcmMpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoYXAtPnNhY3RpdmUgJiAoMSA8PCB0YWcpKSkgeworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAibG9nIHBhZ2UgMTBoIHJlcG9ydGVkICIKKwkJCQkiaW5hY3RpdmUgdGFnICVkXG4iLCB0YWcpOworCQlyZXR1cm47CisJfQorCisJLyogd2UndmUgZ290IHRoZSBwZXJwZXRyYXRvciwgY29uZGVtbiBpdCAqLworCXFjID0gX19hdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisJbWVtY3B5KCZxYy0+cmVzdWx0X3RmLCAmdGYsIHNpemVvZih0ZikpOworCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfREVWOworCWVoYy0+aS5lcnJfbWFzayAmPSB+QUNfRVJSX0RFVjsKK30KKworLyoqCisgKglhdGFfZWhfYW5hbHl6ZV90ZiAtIGFuYWx5emUgdGFza2ZpbGUgb2YgYSBmYWlsZWQgcWMKKyAqCUBxYzogcWMgdG8gYW5hbHl6ZQorICoJQHRmOiBUYXNrZmlsZSByZWdpc3RlcnMgdG8gYW5hbHl6ZQorICoKKyAqCUFuYWx5emUgdGFza2ZpbGUgb2YgQHFjIGFuZCBmdXJ0aGVyIGRldGVybWluZSBjYXVzZSBvZgorICoJZmFpbHVyZS4gIFRoaXMgZnVuY3Rpb24gYWxzbyByZXF1ZXN0cyBBVEFQSSBzZW5zZSBkYXRhIGlmCisgKglhdmFsaWFibGUuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJRGV0ZXJtaW5lZCByZWNvdmVyeSBhY3Rpb24KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdGFfZWhfYW5hbHl6ZV90ZihzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXVuc2lnbmVkIGludCB0bXAsIGFjdGlvbiA9IDA7CisJdTggc3RhdCA9IHRmLT5jb21tYW5kLCBlcnIgPSB0Zi0+ZmVhdHVyZTsKKworCWlmICgoc3RhdCAmIChBVEFfQlVTWSB8IEFUQV9EUlEgfCBBVEFfRFJEWSkpICE9IEFUQV9EUkRZKSB7CisJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQlyZXR1cm4gQVRBX0VIX1NPRlRSRVNFVDsKKwl9CisKKwlpZiAoIShxYy0+ZXJyX21hc2sgJiBBQ19FUlJfREVWKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHFjLT5kZXYtPmNsYXNzKSB7CisJY2FzZSBBVEFfREVWX0FUQToKKwkJaWYgKGVyciAmIEFUQV9JQ1JDKQorCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9BVEFfQlVTOworCQlpZiAoZXJyICYgQVRBX1VOQykKKwkJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfTUVESUE7CisJCWlmIChlcnIgJiBBVEFfSURORikKKwkJCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfSU5WQUxJRDsKKwkJYnJlYWs7CisKKwljYXNlIEFUQV9ERVZfQVRBUEk6CisJCXRtcCA9IGF0YXBpX2VoX3JlcXVlc3Rfc2Vuc2UocWMtPmRldiwKKwkJCQkJICAgICBxYy0+c2NzaWNtZC0+c2Vuc2VfYnVmZmVyKTsKKwkJaWYgKCF0bXApIHsKKwkJCS8qIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQgaXMgdXNlZCB0byB0ZWxsCisJCQkgKiBhdGFwaV9xY19jb21wbGV0ZSgpIHRoYXQgc2Vuc2UgZGF0YSBpcworCQkJICogYWxyZWFkeSB2YWxpZC4KKwkJCSAqCisJCQkgKiBUT0RPOiBpbnRlcnByZXQgc2Vuc2UgZGF0YSBhbmQgc2V0CisJCQkgKiBhcHByb3ByaWF0ZSBlcnJfbWFzay4KKwkJCSAqLworCQkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7CisJCX0gZWxzZQorCQkJcWMtPmVycl9tYXNrIHw9IHRtcDsKKwl9CisKKwlpZiAocWMtPmVycl9tYXNrICYgKEFDX0VSUl9IU00gfCBBQ19FUlJfVElNRU9VVCB8IEFDX0VSUl9BVEFfQlVTKSkKKwkJYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgaW50IGF0YV9laF9jYXRlZ29yaXplX2VyaW5nX2VudHJ5KHN0cnVjdCBhdGFfZXJpbmdfZW50cnkgKmVudCkKK3sKKwlpZiAoZW50LT5lcnJfbWFzayAmIChBQ19FUlJfQVRBX0JVUyB8IEFDX0VSUl9USU1FT1VUKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZW50LT5pc19pbykgeworCQlpZiAoZW50LT5lcnJfbWFzayAmIEFDX0VSUl9IU00pCisJCQlyZXR1cm4gMTsKKwkJaWYgKChlbnQtPmVycl9tYXNrICYKKwkJICAgICAoQUNfRVJSX0RFVnxBQ19FUlJfTUVESUF8QUNfRVJSX0lOVkFMSUQpKSA9PSBBQ19FUlJfREVWKQorCQkJcmV0dXJuIDI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzcGVlZF9kb3duX25lZWRlZF9hcmcgeworCXU2NCBzaW5jZTsKKwlpbnQgbnJfZXJyb3JzWzNdOworfTsKKworc3RhdGljIGludCBzcGVlZF9kb3duX25lZWRlZF9jYihzdHJ1Y3QgYXRhX2VyaW5nX2VudHJ5ICplbnQsIHZvaWQgKnZvaWRfYXJnKQoreworCXN0cnVjdCBzcGVlZF9kb3duX25lZWRlZF9hcmcgKmFyZyA9IHZvaWRfYXJnOworCisJaWYgKGVudC0+dGltZXN0YW1wIDwgYXJnLT5zaW5jZSkKKwkJcmV0dXJuIC0xOworCisJYXJnLT5ucl9lcnJvcnNbYXRhX2VoX2NhdGVnb3JpemVfZXJpbmdfZW50cnkoZW50KV0rKzsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfZWhfc3BlZWRfZG93bl9uZWVkZWQgLSBEZXRlcm1pbmUgd2hldGVyIHNwZWVkIGRvd24gaXMgbmVjZXNzYXJ5CisgKglAZGV2OiBEZXZpY2Ugb2YgaW50ZXJlc3QKKyAqCisgKglUaGlzIGZ1bmN0aW9uIGV4YW1pbmVzIGVycm9yIHJpbmcgb2YgQGRldiBhbmQgZGV0ZXJtaW5lcworICoJd2hldGhlciBzcGVlZCBkb3duIGlzIG5lY2Vzc2FyeS4gIFNwZWVkIGRvd24gaXMgbmVjZXNzYXJ5IGlmCisgKgl0aGVyZSBoYXZlIGJlZW4gbW9yZSB0aGFuIDMgb2YgQ2F0LTEgZXJyb3JzIG9yIDEwIG9mIENhdC0yCisgKgllcnJvcnMgZHVyaW5nIGxhc3QgMTUgbWludXRlcy4KKyAqCisgKglDYXQtMSBlcnJvcnMgYXJlIEFUQV9CVVMsIFRJTUVPVVQgZm9yIGFueSBjb21tYW5kIGFuZCBIU00KKyAqCXZpb2xhdGlvbiBmb3Iga25vd24gc3VwcG9ydGVkIGNvbW1hbmRzLgorICoKKyAqCUNhdC0yIGVycm9ycyBhcmUgdW5jbGFzc2lmaWVkIERFViBlcnJvciBmb3Iga25vd24gc3VwcG9ydGVkCisgKgljb21tYW5kLgorICoKKyAqCUxPQ0tJTkc6CisgKglJbmhlcml0ZWQgZnJvbSBjYWxsZXIuCisgKgorICoJUkVUVVJOUzoKKyAqCTEgaWYgc3BlZWQgZG93biBpcyBuZWNlc3NhcnksIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgYXRhX2VoX3NwZWVkX2Rvd25fbmVlZGVkKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJY29uc3QgdTY0IGludGVydmFsID0gMTVMTFUgKiA2MCAqIEhaOworCXN0YXRpYyBjb25zdCBpbnQgZXJyX2xpbWl0c1szXSA9IHsgLTEsIDMsIDEwIH07CisJc3RydWN0IHNwZWVkX2Rvd25fbmVlZGVkX2FyZyBhcmc7CisJc3RydWN0IGF0YV9lcmluZ19lbnRyeSAqZW50OworCWludCBlcnJfY2F0OworCXU2NCBqNjQ7CisKKwllbnQgPSBhdGFfZXJpbmdfdG9wKCZkZXYtPmVyaW5nKTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuIDA7CisKKwllcnJfY2F0ID0gYXRhX2VoX2NhdGVnb3JpemVfZXJpbmdfZW50cnkoZW50KTsKKwlpZiAoZXJyX2NhdCA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisKKwlqNjQgPSBnZXRfamlmZmllc182NCgpOworCWlmIChqNjQgPj0gaW50ZXJ2YWwpCisJCWFyZy5zaW5jZSA9IGo2NCAtIGludGVydmFsOworCWVsc2UKKwkJYXJnLnNpbmNlID0gMDsKKworCWF0YV9lcmluZ19tYXAoJmRldi0+ZXJpbmcsIHNwZWVkX2Rvd25fbmVlZGVkX2NiLCAmYXJnKTsKKworCXJldHVybiBhcmcubnJfZXJyb3JzW2Vycl9jYXRdID4gZXJyX2xpbWl0c1tlcnJfY2F0XTsKK30KKworLyoqCisgKglhdGFfZWhfc3BlZWRfZG93biAtIHJlY29yZCBlcnJvciBhbmQgc3BlZWQgZG93biBpZiBuZWNlc3NhcnkKKyAqCUBkZXY6IEZhaWxlZCBkZXZpY2UKKyAqCUBpc19pbzogRGlkIHRoZSBkZXZpY2UgZmFpbCBkdXJpbmcgbm9ybWFsIElPPworICoJQGVycl9tYXNrOiBlcnJfbWFzayBvZiB0aGUgZXJyb3IKKyAqCisgKglSZWNvcmQgZXJyb3IgYW5kIGV4YW1pbmUgZXJyb3IgaGlzdG9yeSB0byBkZXRlcm1pbmUgd2hldGhlcgorICoJYWRqdXN0aW5nIHRyYW5zbWlzc2lvbiBzcGVlZCBpcyBuZWNlc3NhcnkuICBJdCBhbHNvIHNldHMKKyAqCXRyYW5zbWlzc2lvbiBsaW1pdHMgYXBwcm9wcmlhdGVseSBpZiBzdWNoIGFkanVzdG1lbnQgaXMKKyAqCW5lY2Vzc2FyeS4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBhdGFfZWhfc3BlZWRfZG93bihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgaXNfaW8sCisJCQkgICAgIHVuc2lnbmVkIGludCBlcnJfbWFzaykKK3sKKwlpZiAoIWVycl9tYXNrKQorCQlyZXR1cm4gMDsKKworCS8qIHJlY29yZCBlcnJvciBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgc3BlZWQgZG93biBpcyBuZWNlc3NhcnkgKi8KKwlhdGFfZXJpbmdfcmVjb3JkKCZkZXYtPmVyaW5nLCBpc19pbywgZXJyX21hc2spOworCisJaWYgKCFhdGFfZWhfc3BlZWRfZG93bl9uZWVkZWQoZGV2KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzcGVlZCBkb3duIFNBVEEgbGluayBzcGVlZCBpZiBwb3NzaWJsZSAqLworCWlmIChzYXRhX2Rvd25fc3BkX2xpbWl0KGRldi0+YXApID09IDApCisJCXJldHVybiBBVEFfRUhfSEFSRFJFU0VUOworCisJLyogbG93ZXIgdHJhbnNmZXIgbW9kZSAqLworCWlmIChhdGFfZG93bl94ZmVybWFza19saW1pdChkZXYsIDApID09IDApCisJCXJldHVybiBBVEFfRUhfU09GVFJFU0VUOworCisJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0VSUiwKKwkJICAgICAgICJzcGVlZCBkb3duIHJlcXVlc3RlZCBidXQgbm8gdHJhbnNmZXIgbW9kZSBsZWZ0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglhdGFfZWhfYXV0b3BzeSAtIGFuYWx5emUgZXJyb3IgYW5kIGRldGVybWluZSByZWNvdmVyeSBhY3Rpb24KKyAqCUBhcDogQVRBIHBvcnQgdG8gcGVyZm9ybSBhdXRvcHN5IG9uCisgKgorICoJQW5hbHl6ZSB3aHkgQGFwIGZhaWxlZCBhbmQgZGV0ZXJtaW5lIHdoaWNoIHJlY292ZXJ5IGFjdGlvbiBpcworICoJbmVlZGVkLiAgVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgbW9yZSBkZXRhaWxlZCBBQ19FUlJfKiB2YWx1ZXMKKyAqCWFuZCBmaWxscyBzZW5zZSBkYXRhIGZvciBBVEFQSSBDSEVDSyBTRU5TRS4KKyAqCisgKglMT0NLSU5HOgorICoJS2VybmVsIHRocmVhZCBjb250ZXh0IChtYXkgc2xlZXApLgorICovCitzdGF0aWMgdm9pZCBhdGFfZWhfYXV0b3BzeShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OworCXVuc2lnbmVkIGludCBhY3Rpb24gPSBlaGMtPmkuYWN0aW9uOworCXN0cnVjdCBhdGFfZGV2aWNlICpmYWlsZWRfZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYWxsX2Vycl9tYXNrID0gMDsKKwlpbnQgdGFnLCBpc19pbyA9IDA7CisJdTMyIHNlcnJvcjsKKwlpbnQgcmM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwkvKiBvYnRhaW4gYW5kIGFuYWx5emUgU0Vycm9yICovCisJcmMgPSBzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfRVJST1IsICZzZXJyb3IpOworCWlmIChyYyA9PSAwKSB7CisJCWVoYy0+aS5zZXJyb3IgfD0gc2Vycm9yOworCQlhdGFfZWhfYW5hbHl6ZV9zZXJyb3IoYXApOworCX0gZWxzZSBpZiAocmMgIT0gLUVPUE5PVFNVUFApCisJCWFjdGlvbiB8PSBBVEFfRUhfSEFSRFJFU0VUOworCisJLyogYW5hbHl6ZSBOQ1EgZmFpbHVyZSAqLworCWF0YV9laF9hbmFseXplX25jcV9lcnJvcihhcCk7CisKKwkvKiBhbnkgcmVhbCBlcnJvciB0cnVtcHMgQUNfRVJSX09USEVSICovCisJaWYgKGVoYy0+aS5lcnJfbWFzayAmIH5BQ19FUlJfT1RIRVIpCisJCWVoYy0+aS5lcnJfbWFzayAmPSB+QUNfRVJSX09USEVSOworCisJYWxsX2Vycl9tYXNrIHw9IGVoYy0+aS5lcnJfbWFzazsKKworCWZvciAodGFnID0gMDsgdGFnIDwgQVRBX01BWF9RVUVVRTsgdGFnKyspIHsKKwkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCisJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGluaGVyaXQgdXBwZXIgbGV2ZWwgZXJyX21hc2sgKi8KKwkJcWMtPmVycl9tYXNrIHw9IGVoYy0+aS5lcnJfbWFzazsKKworCQkvKiBhbmFseXplIFRGICovCisJCWFjdGlvbiB8PSBhdGFfZWhfYW5hbHl6ZV90ZihxYywgJnFjLT5yZXN1bHRfdGYpOworCisJCS8qIERFViBlcnJvcnMgYXJlIHByb2JhYmx5IHNwdXJpb3VzIGluIGNhc2Ugb2YgQVRBX0JVUyBlcnJvciAqLworCQlpZiAocWMtPmVycl9tYXNrICYgQUNfRVJSX0FUQV9CVVMpCisJCQlxYy0+ZXJyX21hc2sgJj0gfihBQ19FUlJfREVWIHwgQUNfRVJSX01FRElBIHwKKwkJCQkJICBBQ19FUlJfSU5WQUxJRCk7CisKKwkJLyogYW55IHJlYWwgZXJyb3IgdHJ1bXBzIHVua25vd24gZXJyb3IgKi8KKwkJaWYgKHFjLT5lcnJfbWFzayAmIH5BQ19FUlJfT1RIRVIpCisJCQlxYy0+ZXJyX21hc2sgJj0gfkFDX0VSUl9PVEhFUjsKKworCQkvKiBTRU5TRV9WQUxJRCB0cnVtcHMgZGV2L3Vua25vd24gZXJyb3IgYW5kIHJldmFsaWRhdGlvbiAqLworCQlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TRU5TRV9WQUxJRCkgeworCQkJcWMtPmVycl9tYXNrICY9IH4oQUNfRVJSX0RFViB8IEFDX0VSUl9PVEhFUik7CisJCQlhY3Rpb24gJj0gfkFUQV9FSF9SRVZBTElEQVRFOworCQl9CisKKwkJLyogYWNjdW11bGF0ZSBlcnJvciBpbmZvICovCisJCWZhaWxlZF9kZXYgPSBxYy0+ZGV2OworCQlhbGxfZXJyX21hc2sgfD0gcWMtPmVycl9tYXNrOworCQlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19JTykKKwkJCWlzX2lvID0gMTsKKwl9CisKKwkvKiBlbmZvcmNlIGRlZmF1bHQgRUggYWN0aW9ucyAqLworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19GUk9aRU4gfHwKKwkgICAgYWxsX2Vycl9tYXNrICYgKEFDX0VSUl9IU00gfCBBQ19FUlJfVElNRU9VVCkpCisJCWFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCWVsc2UgaWYgKGFsbF9lcnJfbWFzaykKKwkJYWN0aW9uIHw9IEFUQV9FSF9SRVZBTElEQVRFOworCisJLyogaWYgd2UgaGF2ZSBvZmZlbmRpbmcgcWNzIGFuZCB0aGUgYXNzb2NpYXRlZCBmYWlsZWQgZGV2aWNlICovCisJaWYgKGZhaWxlZF9kZXYpIHsKKwkJLyogc3BlZWQgZG93biAqLworCQlhY3Rpb24gfD0gYXRhX2VoX3NwZWVkX2Rvd24oZmFpbGVkX2RldiwgaXNfaW8sIGFsbF9lcnJfbWFzayk7CisKKwkJLyogcGVyZm9ybSBwZXItZGV2IEVIIGFjdGlvbiBvbmx5IG9uIHRoZSBvZmZlbmRpbmcgZGV2aWNlICovCisJCWVoYy0+aS5kZXZfYWN0aW9uW2ZhaWxlZF9kZXYtPmRldm5vXSB8PQorCQkJYWN0aW9uICYgQVRBX0VIX1BFUkRFVl9NQVNLOworCQlhY3Rpb24gJj0gfkFUQV9FSF9QRVJERVZfTUFTSzsKKwl9CisKKwkvKiByZWNvcmQgYXV0b3BzeSByZXN1bHQgKi8KKwllaGMtPmkuZGV2ID0gZmFpbGVkX2RldjsKKwllaGMtPmkuYWN0aW9uID0gYWN0aW9uOworCisJRFBSSU5USygiRVhJVFxuIik7Cit9CisKKy8qKgorICoJYXRhX2VoX3JlcG9ydCAtIHJlcG9ydCBlcnJvciBoYW5kbGluZyB0byB1c2VyCisgKglAYXA6IEFUQSBwb3J0IEVIIGlzIGdvaW5nIG9uCisgKgorICoJUmVwb3J0IEVIIHRvIHVzZXIuCisgKgorICoJTE9DS0lORzoKKyAqCU5vbmUuCisgKi8KK3N0YXRpYyB2b2lkIGF0YV9laF9yZXBvcnQoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZhcC0+ZWhfY29udGV4dDsKKwljb25zdCBjaGFyICpmcm96ZW4sICpkZXNjOworCWludCB0YWcsIG5yX2ZhaWxlZCA9IDA7CisKKwlkZXNjID0gTlVMTDsKKwlpZiAoZWhjLT5pLmRlc2NbMF0gIT0gJ1wwJykKKwkJZGVzYyA9IGVoYy0+aS5kZXNjOworCisJZm9yICh0YWcgPSAwOyB0YWcgPCBBVEFfTUFYX1FVRVVFOyB0YWcrKykgeworCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjID0gX19hdGFfcWNfZnJvbV90YWcoYXAsIHRhZyk7CisKKwkJaWYgKCEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19GQUlMRUQpKQorCQkJY29udGludWU7CisJCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NFTlNFX1ZBTElEICYmICFxYy0+ZXJyX21hc2spCisJCQljb250aW51ZTsKKworCQlucl9mYWlsZWQrKzsKKwl9CisKKwlpZiAoIW5yX2ZhaWxlZCAmJiAhZWhjLT5pLmVycl9tYXNrKQorCQlyZXR1cm47CisKKwlmcm96ZW4gPSAiIjsKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRlJPWkVOKQorCQlmcm96ZW4gPSAiIGZyb3plbiI7CisKKwlpZiAoZWhjLT5pLmRldikgeworCQlhdGFfZGV2X3ByaW50ayhlaGMtPmkuZGV2LCBLRVJOX0VSUiwgImV4Y2VwdGlvbiBFbWFzayAweCV4ICIKKwkJCSAgICAgICAiU0FjdCAweCV4IFNFcnIgMHgleCBhY3Rpb24gMHgleCVzXG4iLAorCQkJICAgICAgIGVoYy0+aS5lcnJfbWFzaywgYXAtPnNhY3RpdmUsIGVoYy0+aS5zZXJyb3IsCisJCQkgICAgICAgZWhjLT5pLmFjdGlvbiwgZnJvemVuKTsKKwkJaWYgKGRlc2MpCisJCQlhdGFfZGV2X3ByaW50ayhlaGMtPmkuZGV2LCBLRVJOX0VSUiwgIiglcylcbiIsIGRlc2MpOworCX0gZWxzZSB7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJleGNlcHRpb24gRW1hc2sgMHgleCAiCisJCQkJIlNBY3QgMHgleCBTRXJyIDB4JXggYWN0aW9uIDB4JXglc1xuIiwKKwkJCQllaGMtPmkuZXJyX21hc2ssIGFwLT5zYWN0aXZlLCBlaGMtPmkuc2Vycm9yLAorCQkJCWVoYy0+aS5hY3Rpb24sIGZyb3plbik7CisJCWlmIChkZXNjKQorCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIiglcylcbiIsIGRlc2MpOworCX0KKworCWZvciAodGFnID0gMDsgdGFnIDwgQVRBX01BWF9RVUVVRTsgdGFnKyspIHsKKwkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCisJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKSB8fCAhcWMtPmVycl9tYXNrKQorCQkJY29udGludWU7CisKKwkJYXRhX2Rldl9wcmludGsocWMtPmRldiwgS0VSTl9FUlIsICJ0YWcgJWQgY21kIDB4JXggIgorCQkJICAgICAgICJFbWFzayAweCV4IHN0YXQgMHgleCBlcnIgMHgleCAoJXMpXG4iLAorCQkJICAgICAgIHFjLT50YWcsIHFjLT50Zi5jb21tYW5kLCBxYy0+ZXJyX21hc2ssCisJCQkgICAgICAgcWMtPnJlc3VsdF90Zi5jb21tYW5kLCBxYy0+cmVzdWx0X3RmLmZlYXR1cmUsCisJCQkgICAgICAgYXRhX2Vycl9zdHJpbmcocWMtPmVycl9tYXNrKSk7CisJfQorfQorCitzdGF0aWMgaW50IGF0YV9kb19yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBhdGFfcmVzZXRfZm5fdCByZXNldCwKKwkJCXVuc2lnbmVkIGludCAqY2xhc3NlcykKK3sKKwlpbnQgaSwgcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWNsYXNzZXNbaV0gPSBBVEFfREVWX1VOS05PV047CisKKwlyYyA9IHJlc2V0KGFwLCBjbGFzc2VzKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIElmIGFueSBjbGFzcyBpc24ndCBBVEFfREVWX1VOS05PV04sIGNvbnNpZGVyIGNsYXNzaWZpY2F0aW9uCisJICogaXMgY29tcGxldGUgYW5kIGNvbnZlcnQgYWxsIEFUQV9ERVZfVU5LTk9XTiB0bworCSAqIEFUQV9ERVZfTk9ORS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWlmIChjbGFzc2VzW2ldICE9IEFUQV9ERVZfVU5LTk9XTikKKwkJCWJyZWFrOworCisJaWYgKGkgPCBBVEFfTUFYX0RFVklDRVMpCisJCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykKKwkJCWlmIChjbGFzc2VzW2ldID09IEFUQV9ERVZfVU5LTk9XTikKKwkJCQljbGFzc2VzW2ldID0gQVRBX0RFVl9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRhX2VoX2ZvbGxvd3VwX3Nyc3RfbmVlZGVkKGludCByYywgaW50IGNsYXNzaWZ5LAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCit7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCXJldHVybiAxOworCWlmIChyYyAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY2xhc3NpZnkgJiYgY2xhc3Nlc1swXSA9PSBBVEFfREVWX1VOS05PV04pCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0YV9laF9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgY2xhc3NpZnksCisJCQlhdGFfcHJlcmVzZXRfZm5fdCBwcmVyZXNldCwgYXRhX3Jlc2V0X2ZuX3Qgc29mdHJlc2V0LAorCQkJYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0LCBhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0KQoreworCXN0cnVjdCBhdGFfZWhfY29udGV4dCAqZWhjID0gJmFwLT5laF9jb250ZXh0OworCXVuc2lnbmVkIGludCAqY2xhc3NlcyA9IGVoYy0+Y2xhc3NlczsKKwlpbnQgdHJpZXMgPSBBVEFfRUhfUkVTRVRfVFJJRVM7CisJaW50IHZlcmJvc2UgPSAhKGFwLT5mbGFncyAmIEFUQV9GTEFHX0xPQURJTkcpOworCXVuc2lnbmVkIGludCBhY3Rpb247CisJYXRhX3Jlc2V0X2ZuX3QgcmVzZXQ7CisJaW50IGksIGRpZF9mb2xsb3d1cF9zcnN0LCByYzsKKworCS8qIERldGVybWluZSB3aGljaCByZXNldCB0byB1c2UgYW5kIHJlY29yZCBpbiBlaGMtPmkuYWN0aW9uLgorCSAqIHByZXJlc2V0KCkgbWF5IGV4YW1pbmUgYW5kIG1vZGlmeSBpdC4KKwkgKi8KKwlhY3Rpb24gPSBlaGMtPmkuYWN0aW9uOworCWVoYy0+aS5hY3Rpb24gJj0gfkFUQV9FSF9SRVNFVF9NQVNLOworCWlmIChzb2Z0cmVzZXQgJiYgKCFoYXJkcmVzZXQgfHwgKCFzYXRhX3NldF9zcGRfbmVlZGVkKGFwKSAmJgorCQkJCQkgIShhY3Rpb24gJiBBVEFfRUhfSEFSRFJFU0VUKSkpKQorCQllaGMtPmkuYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJZWxzZQorCQllaGMtPmkuYWN0aW9uIHw9IEFUQV9FSF9IQVJEUkVTRVQ7CisKKwlpZiAocHJlcmVzZXQpIHsKKwkJcmMgPSBwcmVyZXNldChhcCk7CisJCWlmIChyYykgeworCQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKKwkJCQkJInByZXJlc2V0IGZhaWxlZCAoZXJybm89JWQpXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKiBwcmVyZXNldCgpIG1pZ2h0IGhhdmUgbW9kaWZpZWQgZWhjLT5pLmFjdGlvbiAqLworCWlmIChlaGMtPmkuYWN0aW9uICYgQVRBX0VIX0hBUkRSRVNFVCkKKwkJcmVzZXQgPSBoYXJkcmVzZXQ7CisJZWxzZSBpZiAoZWhjLT5pLmFjdGlvbiAmIEFUQV9FSF9TT0ZUUkVTRVQpCisJCXJlc2V0ID0gc29mdHJlc2V0OworCWVsc2UgeworCQkvKiBwcmVyZXNldCB0b2xkIHVzIG5vdCB0byByZXNldCwgYmFuZyBjbGFzc2VzIGFuZCByZXR1cm4gKi8KKwkJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQorCQkJY2xhc3Nlc1tpXSA9IEFUQV9ERVZfTk9ORTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGlkIHByZXJlc2V0KCkgc2NyZXcgdXA/ICBpZiBzbywgZml4IHVwIHRvIGF2b2lkIG9vcHNpbmcgKi8KKwlpZiAoIXJlc2V0KSB7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJCVUc6IHByZXJlc2V0KCkgcmVxdWVzdGVkICIKKwkJCQkiaW52YWxpZCByZXNldCB0eXBlXG4iKTsKKwkJaWYgKHNvZnRyZXNldCkKKwkJCXJlc2V0ID0gc29mdHJlc2V0OworCQllbHNlCisJCQlyZXNldCA9IGhhcmRyZXNldDsKKwl9CisKKyByZXRyeToKKwkvKiBzaHV0IHVwIGR1cmluZyBib290IHByb2JpbmcgKi8KKwlpZiAodmVyYm9zZSkKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICIlcyByZXNldHRpbmcgcG9ydFxuIiwKKwkJCQlyZXNldCA9PSBzb2Z0cmVzZXQgPyAic29mdCIgOiAiaGFyZCIpOworCisJLyogcmVzZXQgKi8KKwlhdGFfZWhfYWJvdXRfdG9fZG8oYXAsIE5VTEwsIEFUQV9FSF9SRVNFVF9NQVNLKTsKKwllaGMtPmkuZmxhZ3MgfD0gQVRBX0VISV9ESURfUkVTRVQ7CisKKwlyYyA9IGF0YV9kb19yZXNldChhcCwgcmVzZXQsIGNsYXNzZXMpOworCisJZGlkX2ZvbGxvd3VwX3Nyc3QgPSAwOworCWlmIChyZXNldCA9PSBoYXJkcmVzZXQgJiYKKwkgICAgYXRhX2VoX2ZvbGxvd3VwX3Nyc3RfbmVlZGVkKHJjLCBjbGFzc2lmeSwgY2xhc3NlcykpIHsKKwkJLyogb2theSwgbGV0J3MgZG8gZm9sbG93LXVwIHNvZnRyZXNldCAqLworCQlkaWRfZm9sbG93dXBfc3JzdCA9IDE7CisJCXJlc2V0ID0gc29mdHJlc2V0OworCisJCWlmICghcmVzZXQpIHsKKwkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCisJCQkJCSJmb2xsb3ctdXAgc29mdHJlc2V0IHJlcXVpcmVkICIKKwkJCQkJImJ1dCBubyBzb2Z0cmVzZXQgYXZhbGlhYmxlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYXRhX2VoX2Fib3V0X3RvX2RvKGFwLCBOVUxMLCBBVEFfRUhfUkVTRVRfTUFTSyk7CisJCXJjID0gYXRhX2RvX3Jlc2V0KGFwLCByZXNldCwgY2xhc3Nlcyk7CisKKwkJaWYgKHJjID09IDAgJiYgY2xhc3NpZnkgJiYKKwkJICAgIGNsYXNzZXNbMF0gPT0gQVRBX0RFVl9VTktOT1dOKSB7CisJCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLAorCQkJCQkiY2xhc3NpZmljYXRpb24gZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKHJjICYmIC0tdHJpZXMpIHsKKwkJY29uc3QgY2hhciAqdHlwZTsKKworCQlpZiAocmVzZXQgPT0gc29mdHJlc2V0KSB7CisJCQlpZiAoZGlkX2ZvbGxvd3VwX3Nyc3QpCisJCQkJdHlwZSA9ICJmb2xsb3ctdXAgc29mdCI7CisJCQllbHNlCisJCQkJdHlwZSA9ICJzb2Z0IjsKKwkJfSBlbHNlCisJCQl0eXBlID0gImhhcmQiOworCisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9XQVJOSU5HLAorCQkJCSIlc3Jlc2V0IGZhaWxlZCwgcmV0cnlpbmcgaW4gNSBzZWNzXG4iLCB0eXBlKTsKKwkJc3NsZWVwKDUpOworCisJCWlmIChyZXNldCA9PSBoYXJkcmVzZXQpCisJCQlzYXRhX2Rvd25fc3BkX2xpbWl0KGFwKTsKKwkJaWYgKGhhcmRyZXNldCkKKwkJCXJlc2V0ID0gaGFyZHJlc2V0OworCQlnb3RvIHJldHJ5OworCX0KKworCWlmIChyYyA9PSAwKSB7CisJCS8qIEFmdGVyIHRoZSByZXNldCwgdGhlIGRldmljZSBzdGF0ZSBpcyBQSU8gMCBhbmQgdGhlCisJCSAqIGNvbnRyb2xsZXIgc3RhdGUgaXMgdW5kZWZpbmVkLiAgUmVjb3JkIHRoZSBtb2RlLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQorCQkJYXAtPmRldmljZVtpXS5waW9fbW9kZSA9IFhGRVJfUElPXzA7CisKKwkJaWYgKHBvc3RyZXNldCkKKwkJCXBvc3RyZXNldChhcCwgY2xhc3Nlcyk7CisKKwkJLyogcmVzZXQgc3VjY2Vzc2Z1bCwgc2NoZWR1bGUgcmV2YWxpZGF0aW9uICovCisJCWF0YV9laF9kb25lKGFwLCBOVUxMLCBBVEFfRUhfUkVTRVRfTUFTSyk7CisJCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX1JFVkFMSURBVEU7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGF0YV9laF9yZXZhbGlkYXRlX2FuZF9hdHRhY2goc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkJc3RydWN0IGF0YV9kZXZpY2UgKipyX2ZhaWxlZF9kZXYpCit7CisJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmYXAtPmVoX2NvbnRleHQ7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCByYyA9IDA7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJdW5zaWduZWQgaW50IGFjdGlvbjsKKworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJYWN0aW9uID0gZWhjLT5pLmFjdGlvbiB8IGVoYy0+aS5kZXZfYWN0aW9uW2Rldi0+ZGV2bm9dOworCisJCWlmIChhY3Rpb24gJiBBVEFfRUhfUkVWQUxJREFURSAmJiBhdGFfZGV2X2VuYWJsZWQoZGV2KSkgeworCQkJaWYgKGF0YV9wb3J0X29mZmxpbmUoYXApKSB7CisJCQkJcmMgPSAtRUlPOworCQkJCWJyZWFrOworCQkJfQorCisJCQlhdGFfZWhfYWJvdXRfdG9fZG8oYXAsIGRldiwgQVRBX0VIX1JFVkFMSURBVEUpOworCQkJcmMgPSBhdGFfZGV2X3JldmFsaWRhdGUoZGV2LAorCQkJCQllaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX0RJRF9SRVNFVCk7CisJCQlpZiAocmMpCisJCQkJYnJlYWs7CisKKwkJCWF0YV9laF9kb25lKGFwLCBkZXYsIEFUQV9FSF9SRVZBTElEQVRFKTsKKworCQkJLyogc2NoZWR1bGUgdGhlIHNjc2lfcmVzY2FuX2RldmljZSgpIGhlcmUgKi8KKwkJCXF1ZXVlX3dvcmsoYXRhX2F1eF93cSwgJihhcC0+c2NzaV9yZXNjYW5fdGFzaykpOworCQl9IGVsc2UgaWYgKGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9VTktOT1dOICYmCisJCQkgICBlaGMtPnRyaWVzW2Rldi0+ZGV2bm9dICYmCisJCQkgICBhdGFfY2xhc3NfZW5hYmxlZChlaGMtPmNsYXNzZXNbZGV2LT5kZXZub10pKSB7CisJCQlkZXYtPmNsYXNzID0gZWhjLT5jbGFzc2VzW2Rldi0+ZGV2bm9dOworCisJCQlyYyA9IGF0YV9kZXZfcmVhZF9pZChkZXYsICZkZXYtPmNsYXNzLCAxLCBkZXYtPmlkKTsKKwkJCWlmIChyYyA9PSAwKQorCQkJCXJjID0gYXRhX2Rldl9jb25maWd1cmUoZGV2LCAxKTsKKworCQkJaWYgKHJjKSB7CisJCQkJZGV2LT5jbGFzcyA9IEFUQV9ERVZfVU5LTk9XTjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJCWFwLT5mbGFncyB8PSBBVEFfRkxBR19TQ1NJX0hPVFBMVUc7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwlpZiAocmMpCisJCSpyX2ZhaWxlZF9kZXYgPSBkZXY7CisKKwlEUFJJTlRLKCJFWElUXG4iKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXRhX3BvcnRfbnJfZW5hYmxlZChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWludCBpLCBjbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKQorCQlpZiAoYXRhX2Rldl9lbmFibGVkKCZhcC0+ZGV2aWNlW2ldKSkKKwkJCWNudCsrOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgYXRhX3BvcnRfbnJfdmFjYW50KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaW50IGksIGNudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWlmIChhcC0+ZGV2aWNlW2ldLmNsYXNzID09IEFUQV9ERVZfVU5LTk9XTikKKwkJCWNudCsrOworCXJldHVybiBjbnQ7Cit9CisKK3N0YXRpYyBpbnQgYXRhX2VoX3NraXBfcmVjb3Zlcnkoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZhcC0+ZWhfY29udGV4dDsKKwlpbnQgaTsKKworCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19GUk9aRU4gfHwgYXRhX3BvcnRfbnJfZW5hYmxlZChhcCkpCisJCXJldHVybiAwOworCisJLyogc2tpcCBpZiBjbGFzcyBjb2RlcyBmb3IgYWxsIHZhY2FudCBzbG90cyBhcmUgQVRBX0RFVl9OT05FICovCisJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKworCQlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX1VOS05PV04gJiYKKwkJICAgIGVoYy0+Y2xhc3Nlc1tkZXYtPmRldm5vXSAhPSBBVEFfREVWX05PTkUpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglhdGFfZWhfcmVjb3ZlciAtIHJlY292ZXIgaG9zdCBwb3J0IGFmdGVyIGVycm9yCisgKglAYXA6IGhvc3QgcG9ydCB0byByZWNvdmVyCisgKglAcHJlcmVzZXQ6IHByZXJlc2V0IG1ldGhvZCAoY2FuIGJlIE5VTEwpCisgKglAc29mdHJlc2V0OiBzb2Z0cmVzZXQgbWV0aG9kIChjYW4gYmUgTlVMTCkKKyAqCUBoYXJkcmVzZXQ6IGhhcmRyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQorICoJQHBvc3RyZXNldDogcG9zdHJlc2V0IG1ldGhvZCAoY2FuIGJlIE5VTEwpCisgKgorICoJVGhpcyBpcyB0aGUgYWxwaGEgYW5kIG9tZWdhLCBldW0gYW5kIHlhbmcsIGhlYXJ0IGFuZCBzb3VsIG9mCisgKglsaWJhdGEgZXhjZXB0aW9uIGhhbmRsaW5nLiAgT24gZW50cnksIGFjdGlvbnMgcmVxdWlyZWQgdG8KKyAqCXJlY292ZXIgdGhlIHBvcnQgYW5kIGhvdHBsdWcgcmVxdWVzdHMgYXJlIHJlY29yZGVkIGluCisgKgllaF9jb250ZXh0LiAgVGhpcyBmdW5jdGlvbiBleGVjdXRlcyBhbGwgdGhlIG9wZXJhdGlvbnMgd2l0aAorICoJYXBwcm9wcmlhdGUgcmV0cmlhbHMgYW5kIGZhbGxiYWNrcyB0byByZXN1cnJlY3QgZmFpbGVkCisgKglkZXZpY2VzLCBkZXRhY2ggZ29uZXJzIGFuZCBncmVldCBuZXdjb21lcnMuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBhdGFfZWhfcmVjb3ZlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBhdGFfcHJlcmVzZXRfZm5fdCBwcmVyZXNldCwKKwkJCSAgYXRhX3Jlc2V0X2ZuX3Qgc29mdHJlc2V0LCBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQsCisJCQkgIGF0YV9wb3N0cmVzZXRfZm5fdCBwb3N0cmVzZXQpCit7CisJc3RydWN0IGF0YV9laF9jb250ZXh0ICplaGMgPSAmYXAtPmVoX2NvbnRleHQ7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlpbnQgZG93bl94ZmVybWFzaywgaSwgcmM7CisKKwlEUFJJTlRLKCJFTlRFUlxuIik7CisKKwkvKiBwcmVwIGZvciByZWNvdmVyeSAqLworCWZvciAoaSA9IDA7IGkgPCBBVEFfTUFYX0RFVklDRVM7IGkrKykgeworCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKKworCQllaGMtPnRyaWVzW2Rldi0+ZGV2bm9dID0gQVRBX0VIX0RFVl9UUklFUzsKKworCQkvKiBwcm9jZXNzIGhvdHBsdWcgcmVxdWVzdCAqLworCQlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19ERVRBQ0gpCisJCQlhdGFfZWhfZGV0YWNoX2RldihkZXYpOworCisJCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgJiYKKwkJICAgICgoZWhjLT5pLnByb2JlX21hc2sgJiAoMSA8PCBkZXYtPmRldm5vKSkgJiYKKwkJICAgICAhKGVoYy0+ZGlkX3Byb2JlX21hc2sgJiAoMSA8PCBkZXYtPmRldm5vKSkpKSB7CisJCQlhdGFfZWhfZGV0YWNoX2RldihkZXYpOworCQkJYXRhX2Rldl9pbml0KGRldik7CisJCQllaGMtPmRpZF9wcm9iZV9tYXNrIHw9ICgxIDw8IGRldi0+ZGV2bm8pOworCQkJZWhjLT5pLmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQl9CisJfQorCisgcmV0cnk6CisJZG93bl94ZmVybWFzayA9IDA7CisJcmMgPSAwOworCisJLyogaWYgVU5MT0FESU5HLCBmaW5pc2ggaW1tZWRpYXRlbHkgKi8KKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfVU5MT0FESU5HKQorCQlnb3RvIG91dDsKKworCS8qIHNraXAgRUggaWYgcG9zc2libGUuICovCisJaWYgKGF0YV9laF9za2lwX3JlY292ZXJ5KGFwKSkKKwkJZWhjLT5pLmFjdGlvbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCWVoYy0+Y2xhc3Nlc1tpXSA9IEFUQV9ERVZfVU5LTk9XTjsKKworCS8qIHJlc2V0ICovCisJaWYgKGVoYy0+aS5hY3Rpb24gJiBBVEFfRUhfUkVTRVRfTUFTSykgeworCQlhdGFfZWhfZnJlZXplX3BvcnQoYXApOworCisJCXJjID0gYXRhX2VoX3Jlc2V0KGFwLCBhdGFfcG9ydF9ucl92YWNhbnQoYXApLCBwcmVyZXNldCwKKwkJCQkgIHNvZnRyZXNldCwgaGFyZHJlc2V0LCBwb3N0cmVzZXQpOworCQlpZiAocmMpIHsKKwkJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCisJCQkJCSJyZXNldCBmYWlsZWQsIGdpdmluZyB1cFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWF0YV9laF90aGF3X3BvcnQoYXApOworCX0KKworCS8qIHJldmFsaWRhdGUgZXhpc3RpbmcgZGV2aWNlcyBhbmQgYXR0YWNoIG5ldyBvbmVzICovCisJcmMgPSBhdGFfZWhfcmV2YWxpZGF0ZV9hbmRfYXR0YWNoKGFwLCAmZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZGV2X2ZhaWw7CisKKwkvKiBjb25maWd1cmUgdHJhbnNmZXIgbW9kZSBpZiB0aGUgcG9ydCBoYXMgYmVlbiByZXNldCAqLworCWlmIChlaGMtPmkuZmxhZ3MgJiBBVEFfRUhJX0RJRF9SRVNFVCkgeworCQlyYyA9IGF0YV9zZXRfbW9kZShhcCwgJmRldik7CisJCWlmIChyYykgeworCQkJZG93bl94ZmVybWFzayA9IDE7CisJCQlnb3RvIGRldl9mYWlsOworCQl9CisJfQorCisJZ290byBvdXQ7CisKKyBkZXZfZmFpbDoKKwlzd2l0Y2ggKHJjKSB7CisJY2FzZSAtRU5PREVWOgorCQkvKiBkZXZpY2UgbWlzc2luZywgc2NoZWR1bGUgcHJvYmluZyAqLworCQllaGMtPmkucHJvYmVfbWFzayB8PSAoMSA8PCBkZXYtPmRldm5vKTsKKwljYXNlIC1FSU5WQUw6CisJCWVoYy0+dHJpZXNbZGV2LT5kZXZub10gPSAwOworCQlicmVhazsKKwljYXNlIC1FSU86CisJCXNhdGFfZG93bl9zcGRfbGltaXQoYXApOworCWRlZmF1bHQ6CisJCWVoYy0+dHJpZXNbZGV2LT5kZXZub10tLTsKKwkJaWYgKGRvd25feGZlcm1hc2sgJiYKKwkJICAgIGF0YV9kb3duX3hmZXJtYXNrX2xpbWl0KGRldiwgZWhjLT50cmllc1tkZXYtPmRldm5vXSA9PSAxKSkKKwkJCWVoYy0+dHJpZXNbZGV2LT5kZXZub10gPSAwOworCX0KKworCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiAhZWhjLT50cmllc1tkZXYtPmRldm5vXSkgeworCQkvKiBkaXNhYmxlIGRldmljZSBpZiBpdCBoYXMgdXNlZCB1cCBhbGwgaXRzIGNoYW5jZXMgKi8KKwkJYXRhX2Rldl9kaXNhYmxlKGRldik7CisKKwkJLyogZGV0YWNoIGlmIG9mZmxpbmUgKi8KKwkJaWYgKGF0YV9wb3J0X29mZmxpbmUoYXApKQorCQkJYXRhX2VoX2RldGFjaF9kZXYoZGV2KTsKKworCQkvKiBwcm9iZSBpZiByZXF1ZXN0ZWQgKi8KKwkJaWYgKChlaGMtPmkucHJvYmVfbWFzayAmICgxIDw8IGRldi0+ZGV2bm8pKSAmJgorCQkgICAgIShlaGMtPmRpZF9wcm9iZV9tYXNrICYgKDEgPDwgZGV2LT5kZXZubykpKSB7CisJCQlhdGFfZWhfZGV0YWNoX2RldihkZXYpOworCQkJYXRhX2Rldl9pbml0KGRldik7CisKKwkJCWVoYy0+dHJpZXNbZGV2LT5kZXZub10gPSBBVEFfRUhfREVWX1RSSUVTOworCQkJZWhjLT5kaWRfcHJvYmVfbWFzayB8PSAoMSA8PCBkZXYtPmRldm5vKTsKKwkJCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX1NPRlRSRVNFVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHNvZnQgZGlkbid0IHdvcms/ICBiZSBoYWFhYWFyZCAqLworCQlpZiAoZWhjLT5pLmZsYWdzICYgQVRBX0VISV9ESURfUkVTRVQpCisJCQllaGMtPmkuYWN0aW9uIHw9IEFUQV9FSF9IQVJEUkVTRVQ7CisJCWVsc2UKKwkJCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX1NPRlRSRVNFVDsKKwl9CisKKwlpZiAoYXRhX3BvcnRfbnJfZW5hYmxlZChhcCkpIHsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX1dBUk5JTkcsICJmYWlsZWQgdG8gcmVjb3ZlciBzb21lICIKKwkJCQkiZGV2aWNlcywgcmV0cnlpbmcgaW4gNSBzZWNzXG4iKTsKKwkJc3NsZWVwKDUpOworCX0gZWxzZSB7CisJCS8qIG5vIGRldmljZSBsZWZ0LCByZXBlYXQgZmFzdCAqLworCQltc2xlZXAoNTAwKTsKKwl9CisKKwlnb3RvIHJldHJ5OworCisgb3V0OgorCWlmIChyYykgeworCQlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspCisJCQlhdGFfZGV2X2Rpc2FibGUoJmFwLT5kZXZpY2VbaV0pOworCX0KKworCURQUklOVEsoIkVYSVQsIHJjPSVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqCWF0YV9laF9maW5pc2ggLSBmaW5pc2ggdXAgRUgKKyAqCUBhcDogaG9zdCBwb3J0IHRvIGZpbmlzaCBFSCBmb3IKKyAqCisgKglSZWNvdmVyeSBpcyBjb21wbGV0ZS4gIENsZWFuIHVwIEVIIHN0YXRlcyBhbmQgcmV0cnkgb3IgZmluaXNoCisgKglmYWlsZWQgcWNzLgorICoKKyAqCUxPQ0tJTkc6CisgKglOb25lLgorICovCitzdGF0aWMgdm9pZCBhdGFfZWhfZmluaXNoKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJaW50IHRhZzsKKworCS8qIHJldHJ5IG9yIGZpbmlzaCBxY3MgKi8KKwlmb3IgKHRhZyA9IDA7IHRhZyA8IEFUQV9NQVhfUVVFVUU7IHRhZysrKSB7CisJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBfX2F0YV9xY19mcm9tX3RhZyhhcCwgdGFnKTsKKworCQlpZiAoIShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkpCisJCQljb250aW51ZTsKKworCQlpZiAocWMtPmVycl9tYXNrKSB7CisJCQkvKiBGSVhNRTogT25jZSBFSCBtaWdyYXRpb24gaXMgY29tcGxldGUsCisJCQkgKiBnZW5lcmF0ZSBzZW5zZSBkYXRhIGluIHRoaXMgZnVuY3Rpb24sCisJCQkgKiBjb25zaWRlcmluZyBib3RoIGVycl9tYXNrIGFuZCB0Zi4KKwkJCSAqLworCQkJaWYgKHFjLT5lcnJfbWFzayAmIEFDX0VSUl9JTlZBTElEKQorCQkJCWF0YV9laF9xY19jb21wbGV0ZShxYyk7CisJCQllbHNlCisJCQkJYXRhX2VoX3FjX3JldHJ5KHFjKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX1NFTlNFX1ZBTElEKSB7CisJCQkJYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogZmVlZCB6ZXJvIFRGIHRvIHNlbnNlIGdlbmVyYXRpb24gKi8KKwkJCQltZW1zZXQoJnFjLT5yZXN1bHRfdGYsIDAsIHNpemVvZihxYy0+cmVzdWx0X3RmKSk7CisJCQkJYXRhX2VoX3FjX3JldHJ5KHFjKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoqCisgKglhdGFfZG9fZWggLSBkbyBzdGFuZGFyZCBlcnJvciBoYW5kbGluZworICoJQGFwOiBob3N0IHBvcnQgdG8gaGFuZGxlIGVycm9yIGZvcgorICoJQHByZXJlc2V0OiBwcmVyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQorICoJQHNvZnRyZXNldDogc29mdHJlc2V0IG1ldGhvZCAoY2FuIGJlIE5VTEwpCisgKglAaGFyZHJlc2V0OiBoYXJkcmVzZXQgbWV0aG9kIChjYW4gYmUgTlVMTCkKKyAqCUBwb3N0cmVzZXQ6IHBvc3RyZXNldCBtZXRob2QgKGNhbiBiZSBOVUxMKQorICoKKyAqCVBlcmZvcm0gc3RhbmRhcmQgZXJyb3IgaGFuZGxpbmcgc2VxdWVuY2UuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqLwordm9pZCBhdGFfZG9fZWgoc3RydWN0IGF0YV9wb3J0ICphcCwgYXRhX3ByZXJlc2V0X2ZuX3QgcHJlcmVzZXQsCisJICAgICAgIGF0YV9yZXNldF9mbl90IHNvZnRyZXNldCwgYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0LAorCSAgICAgICBhdGFfcG9zdHJlc2V0X2ZuX3QgcG9zdHJlc2V0KQoreworCWlmICghKGFwLT5mbGFncyAmIEFUQV9GTEFHX0xPQURJTkcpKSB7CisJCWF0YV9laF9hdXRvcHN5KGFwKTsKKwkJYXRhX2VoX3JlcG9ydChhcCk7CisJfQorCisJYXRhX2VoX3JlY292ZXIoYXAsIHByZXJlc2V0LCBzb2Z0cmVzZXQsIGhhcmRyZXNldCwgcG9zdHJlc2V0KTsKKwlhdGFfZWhfZmluaXNoKGFwKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJhdGEtc2NzaS5jIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKaW5kZXggZjFlMTI5Yi4uOTNkMThhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmF0YS1zY3NpLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfdGNxLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RyYW5zcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CkBAIC01MSwxMCArNTIsMTQgQEAKICNkZWZpbmUgU0VDVE9SX1NJWkUJNTEyCiAKIHR5cGVkZWYgdW5zaWduZWQgaW50ICgqYXRhX3hsYXRfZnVuY190KShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCBjb25zdCB1OCAqc2NzaWNtZCk7Ci1zdGF0aWMgc3RydWN0IGF0YV9kZXZpY2UgKgotYXRhX3Njc2lfZmluZF9kZXYoc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2KTsKLXN0YXRpYyB2b2lkIGF0YV9zY3NpX2Vycm9yKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOwotZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBhdGFfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKKworc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICogX19hdGFfc2NzaV9maW5kX2RldihzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpOworc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICogYXRhX3Njc2lfZmluZF9kZXYoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldik7CitzdGF0aWMgaW50IGF0YV9zY3NpX3VzZXJfc2NhbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBsdW4pOworCiAKICNkZWZpbmUgUldfUkVDT1ZFUllfTVBBR0UgMHgxCiAjZGVmaW5lIFJXX1JFQ09WRVJZX01QQUdFX0xFTiAxMgpAQCAtMTAyLDYgKzEwNyw3IEBACiBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgYXRhX3Njc2lfdHJhbnNwb3J0X3RlbXBsYXRlID0gewogCS5laF9zdHJhdGVneV9oYW5kbGVyCT0gYXRhX3Njc2lfZXJyb3IsCiAJLmVoX3RpbWVkX291dAkJPSBhdGFfc2NzaV90aW1lZF9vdXQsCisJLnVzZXJfc2NhbgkJPSBhdGFfc2NzaV91c2VyX3NjYW4sCiB9OwogCiAKQEAgLTMwNCw3ICszMTAsNiBAQAogCiAvKioKICAqCWF0YV9zY3NpX3FjX25ldyAtIGFjcXVpcmUgbmV3IGF0YV9xdWV1ZWRfY21kIHJlZmVyZW5jZQotICoJQGFwOiBBVEEgcG9ydCB0byB3aGljaCB0aGUgbmV3IGNvbW1hbmQgaXMgYXR0YWNoZWQKICAqCUBkZXY6IEFUQSBkZXZpY2UgdG8gd2hpY2ggdGhlIG5ldyBjb21tYW5kIGlzIGF0dGFjaGVkCiAgKglAY21kOiBTQ1NJIGNvbW1hbmQgdGhhdCBvcmlnaW5hdGVkIHRoaXMgQVRBIGNvbW1hbmQKICAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgpAQCAtMzIzLDE0ICszMjgsMTMgQEAKICAqCVJFVFVSTlM6CiAgKglDb21tYW5kIGFsbG9jYXRlZCwgb3IgJU5VTEwgaWYgbm9uZSBhdmFpbGFibGUuCiAgKi8KLXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3Njc2lfcWNfbmV3KHN0cnVjdCBhdGFfcG9ydCAqYXAsCi0JCQkJICAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCitzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9zY3NpX3FjX25ldyhzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJCSAgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCiAJCQkJICAgICAgIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKQogewogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAKLQlxYyA9IGF0YV9xY19uZXdfaW5pdChhcCwgZGV2KTsKKwlxYyA9IGF0YV9xY19uZXdfaW5pdChkZXYpOwogCWlmIChxYykgewogCQlxYy0+c2NzaWNtZCA9IGNtZDsKIAkJcWMtPnNjc2lkb25lID0gZG9uZTsKQEAgLTM5NywxOCArNDAxLDE4IEBACiAKIGludCBhdGFfc2NzaV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF07Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW3NkZXYtPmlkXTsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IF9fYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNkZXYpOwogCi0JcmV0dXJuIGF0YV9kZXZpY2VfcmVzdW1lKGFwLCBkZXYpOworCXJldHVybiBhdGFfZGV2aWNlX3Jlc3VtZShkZXYpOwogfQogCiBpbnQgYXRhX3Njc2lfZGV2aWNlX3N1c3BlbmQoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IGF0YV9wb3J0ICphcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJnNkZXYtPmhvc3QtPmhvc3RkYXRhWzBdOwotCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtzZGV2LT5pZF07CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBfX2F0YV9zY3NpX2ZpbmRfZGV2KGFwLCBzZGV2KTsKIAotCXJldHVybiBhdGFfZGV2aWNlX3N1c3BlbmQoYXAsIGRldiwgc3RhdGUpOworCXJldHVybiBhdGFfZGV2aWNlX3N1c3BlbmQoZGV2LCBzdGF0ZSk7CiB9CiAKIC8qKgpAQCAtNDE5LDYgKzQyMyw3IEBACiAgKglAc2s6IHRoZSBzZW5zZSBrZXkgd2UnbGwgZmlsbCBvdXQKICAqCUBhc2M6IHRoZSBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgd2UnbGwgZmlsbCBvdXQKICAqCUBhc2NxOiB0aGUgYWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllciB3ZSdsbCBmaWxsIG91dAorICoJQHZlcmJvc2U6IGJlIHZlcmJvc2UKICAqCiAgKglDb252ZXJ0cyBhbiBBVEEgZXJyb3IgaW50byBhIFNDU0kgZXJyb3IuICBGaWxsIG91dCBwb2ludGVycyB0bwogICoJU0ssIEFTQywgYW5kIEFTQ1EgYnl0ZXMgZm9yIGxhdGVyIHVzZSBpbiBmaXhlZCBvciBkZXNjcmlwdG9yCkBAIC00MjgsNyArNDMzLDcgQEAKICAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCiAgKi8KIHZvaWQgYXRhX3RvX3NlbnNlX2Vycm9yKHVuc2lnbmVkIGlkLCB1OCBkcnZfc3RhdCwgdTggZHJ2X2VyciwgdTggKnNrLCB1OCAqYXNjLAotCQkJdTggKmFzY3EpCisJCQl1OCAqYXNjcSwgaW50IHZlcmJvc2UpCiB7CiAJaW50IGk7CiAKQEAgLTQ5Myw4ICs0OTgsOSBAQAogCQkJfQogCQl9CiAJCS8qIE5vIGltbWVkaWF0ZSBtYXRjaCAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogbm8gc2Vuc2UgdHJhbnNsYXRpb24gZm9yICIKLQkJICAgICAgICJlcnJvciAweCUwMnhcbiIsIGlkLCBkcnZfZXJyKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdGEldTogbm8gc2Vuc2UgdHJhbnNsYXRpb24gZm9yICIKKwkJCSAgICAgICAiZXJyb3IgMHglMDJ4XG4iLCBpZCwgZHJ2X2Vycik7CiAJfQogCiAJLyogRmFsbCBiYWNrIHRvIGludGVycHJldGluZyBzdGF0dXMgYml0cyAqLwpAQCAtNTA3LDggKzUxMyw5IEBACiAJCX0KIAl9CiAJLyogTm8gZXJyb3I/ICBVbmRlY29kZWQ/ICovCi0JcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IG5vIHNlbnNlIHRyYW5zbGF0aW9uIGZvciBzdGF0dXM6IDB4JTAyeFxuIiwKLQkgICAgICAgaWQsIGRydl9zdGF0KTsKKwlpZiAodmVyYm9zZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IG5vIHNlbnNlIHRyYW5zbGF0aW9uIGZvciAiCisJCSAgICAgICAic3RhdHVzOiAweCUwMnhcbiIsIGlkLCBkcnZfc3RhdCk7CiAKIAkvKiBXZSBuZWVkIGEgc2Vuc2libGUgZXJyb3IgcmV0dXJuIGhlcmUsIHdoaWNoIGlzIHRyaWNreSwgYW5kIG9uZQogCSAgIHRoYXQgd29uJ3QgY2F1c2UgcGVvcGxlIHRvIGRvIHRoaW5ncyBsaWtlIHJldHVybiBhIGRpc2sgd3JvbmdseSAqLwpAQCAtNTE3LDkgKzUyNCwxMCBAQAogCSphc2NxID0gMHgwMDsKIAogIHRyYW5zbGF0ZV9kb25lOgotCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IHRyYW5zbGF0ZWQgQVRBIHN0YXQvZXJyIDB4JTAyeC8lMDJ4IHRvICIKLQkgICAgICAgIlNDU0kgU0svQVNDL0FTQ1EgMHgleC8lMDJ4LyUwMnhcbiIsIGlkLCBkcnZfc3RhdCwgZHJ2X2VyciwKLQkgICAgICAgKnNrLCAqYXNjLCAqYXNjcSk7CisJaWYgKHZlcmJvc2UpCisJCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IHRyYW5zbGF0ZWQgQVRBIHN0YXQvZXJyIDB4JTAyeC8lMDJ4ICIKKwkJICAgICAgICJ0byBTQ1NJIFNLL0FTQy9BU0NRIDB4JXgvJTAyeC8lMDJ4XG4iLAorCQkgICAgICAgaWQsIGRydl9zdGF0LCBkcnZfZXJyLCAqc2ssICphc2MsICphc2NxKTsKIAlyZXR1cm47CiB9CiAKQEAgLTUzOSwyNyArNTQ3LDIzIEBACiB2b2lkIGF0YV9nZW5fYXRhX2Rlc2Nfc2Vuc2Uoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBxYy0+c2NzaWNtZDsKLQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICZxYy0+dGY7CisJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnJlc3VsdF90ZjsKIAl1bnNpZ25lZCBjaGFyICpzYiA9IGNtZC0+c2Vuc2VfYnVmZmVyOwogCXVuc2lnbmVkIGNoYXIgKmRlc2MgPSBzYiArIDg7CisJaW50IHZlcmJvc2UgPSBxYy0+YXAtPm9wcy0+ZXJyb3JfaGFuZGxlciA9PSBOVUxMOwogCiAJbWVtc2V0KHNiLCAwLCBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUpOwogCiAJY21kLT5yZXN1bHQgPSAoRFJJVkVSX1NFTlNFIDw8IDI0KSB8IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKIAogCS8qCi0JICogUmVhZCB0aGUgY29udHJvbGxlciByZWdpc3RlcnMuCi0JICovCi0JV0FSTl9PTihxYy0+YXAtPm9wcy0+dGZfcmVhZCA9PSBOVUxMKTsKLQlxYy0+YXAtPm9wcy0+dGZfcmVhZChxYy0+YXAsIHRmKTsKLQotCS8qCiAJICogVXNlIGF0YV90b19zZW5zZV9lcnJvcigpIHRvIG1hcCBzdGF0dXMgcmVnaXN0ZXIgYml0cwogCSAqIG9udG8gc2Vuc2Uga2V5LCBhc2MgJiBhc2NxLgogCSAqLwotCWlmICh0Zi0+Y29tbWFuZCAmIChBVEFfQlVTWSB8IEFUQV9ERiB8IEFUQV9FUlIgfCBBVEFfRFJRKSkgeworCWlmIChxYy0+ZXJyX21hc2sgfHwKKwkgICAgdGYtPmNvbW1hbmQgJiAoQVRBX0JVU1kgfCBBVEFfREYgfCBBVEFfRVJSIHwgQVRBX0RSUSkpIHsKIAkJYXRhX3RvX3NlbnNlX2Vycm9yKHFjLT5hcC0+aWQsIHRmLT5jb21tYW5kLCB0Zi0+ZmVhdHVyZSwKLQkJCQkgICAmc2JbMV0sICZzYlsyXSwgJnNiWzNdKTsKKwkJCQkgICAmc2JbMV0sICZzYlsyXSwgJnNiWzNdLCB2ZXJib3NlKTsKIAkJc2JbMV0gJj0gMHgwZjsKIAl9CiAKQEAgLTYxNSwyNiArNjE5LDIyIEBACiB2b2lkIGF0YV9nZW5fZml4ZWRfc2Vuc2Uoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBxYy0+c2NzaWNtZDsKLQlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICZxYy0+dGY7CisJc3RydWN0IGF0YV90YXNrZmlsZSAqdGYgPSAmcWMtPnJlc3VsdF90ZjsKIAl1bnNpZ25lZCBjaGFyICpzYiA9IGNtZC0+c2Vuc2VfYnVmZmVyOworCWludCB2ZXJib3NlID0gcWMtPmFwLT5vcHMtPmVycm9yX2hhbmRsZXIgPT0gTlVMTDsKIAogCW1lbXNldChzYiwgMCwgU0NTSV9TRU5TRV9CVUZGRVJTSVpFKTsKIAogCWNtZC0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAKIAkvKgotCSAqIFJlYWQgdGhlIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLgotCSAqLwotCVdBUk5fT04ocWMtPmFwLT5vcHMtPnRmX3JlYWQgPT0gTlVMTCk7Ci0JcWMtPmFwLT5vcHMtPnRmX3JlYWQocWMtPmFwLCB0Zik7Ci0KLQkvKgogCSAqIFVzZSBhdGFfdG9fc2Vuc2VfZXJyb3IoKSB0byBtYXAgc3RhdHVzIHJlZ2lzdGVyIGJpdHMKIAkgKiBvbnRvIHNlbnNlIGtleSwgYXNjICYgYXNjcS4KIAkgKi8KLQlpZiAodGYtPmNvbW1hbmQgJiAoQVRBX0JVU1kgfCBBVEFfREYgfCBBVEFfRVJSIHwgQVRBX0RSUSkpIHsKKwlpZiAocWMtPmVycl9tYXNrIHx8CisJICAgIHRmLT5jb21tYW5kICYgKEFUQV9CVVNZIHwgQVRBX0RGIHwgQVRBX0VSUiB8IEFUQV9EUlEpKSB7CiAJCWF0YV90b19zZW5zZV9lcnJvcihxYy0+YXAtPmlkLCB0Zi0+Y29tbWFuZCwgdGYtPmZlYXR1cmUsCi0JCQkJICAgJnNiWzJdLCAmc2JbMTJdLCAmc2JbMTNdKTsKKwkJCQkgICAmc2JbMl0sICZzYlsxMl0sICZzYlsxM10sIHZlcmJvc2UpOwogCQlzYlsyXSAmPSAweDBmOwogCX0KIApAQCAtNjc3LDcgKzY3Nyw3IEBACiAJICovCiAJbWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlM7CiAJaWYgKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDgpCi0JCW1heF9zZWN0b3JzID0gMjA0ODsKKwkJbWF4X3NlY3RvcnMgPSBBVEFfTUFYX1NFQ1RPUlNfTEJBNDg7CiAJaWYgKGRldi0+bWF4X3NlY3RvcnMpCiAJCW1heF9zZWN0b3JzID0gZGV2LT5tYXhfc2VjdG9yczsKIApAQCAtNjkyLDYgKzY5MiwxNCBAQAogCQlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBzZGV2LT5yZXF1ZXN0X3F1ZXVlOwogCQlibGtfcXVldWVfbWF4X2h3X3NlZ21lbnRzKHEsIHEtPm1heF9od19zZWdtZW50cyAtIDEpOwogCX0KKworCWlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX05DUSkgeworCQlpbnQgZGVwdGg7CisKKwkJZGVwdGggPSBtaW4oc2Rldi0+aG9zdC0+Y2FuX3F1ZXVlLCBhdGFfaWRfcXVldWVfZGVwdGgoZGV2LT5pZCkpOworCQlkZXB0aCA9IG1pbihBVEFfTUFYX1FVRVVFIC0gMSwgZGVwdGgpOworCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgZGVwdGgpOworCX0KIH0KIAogLyoqCkBAIC03MDgsMTUyICs3MTYsODggQEAKIAogaW50IGF0YV9zY3NpX3NsYXZlX2NvbmZpZyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCiB7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KHNkZXYtPmhvc3QpOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBfX2F0YV9zY3NpX2ZpbmRfZGV2KGFwLCBzZGV2KTsKKwogCWF0YV9zY3NpX3NkZXZfY29uZmlnKHNkZXYpOwogCiAJYmxrX3F1ZXVlX21heF9waHlzX3NlZ21lbnRzKHNkZXYtPnJlcXVlc3RfcXVldWUsIExJQkFUQV9NQVhfUFJEKTsKIAotCWlmIChzZGV2LT5pZCA8IEFUQV9NQVhfREVWSUNFUykgewotCQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwotCQlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OwotCi0JCWFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmc2Rldi0+aG9zdC0+aG9zdGRhdGFbMF07Ci0JCWRldiA9ICZhcC0+ZGV2aWNlW3NkZXYtPmlkXTsKLQorCWlmIChkZXYpCiAJCWF0YV9zY3NpX2Rldl9jb25maWcoc2RldiwgZGV2KTsKLQl9CiAKIAlyZXR1cm4gMDsJLyogc2NzaSBsYXllciBkb2Vzbid0IGNoZWNrIHJldHVybiB2YWx1ZSwgc2lnaCAqLwogfQogCiAvKioKLSAqCWF0YV9zY3NpX3RpbWVkX291dCAtIFNDU0kgbGF5ZXIgdGltZSBvdXQgY2FsbGJhY2sKLSAqCUBjbWQ6IHRpbWVkIG91dCBTQ1NJIGNvbW1hbmQKKyAqCWF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3kgLSBTQ1NJIGRldmljZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQKKyAqCUBzZGV2OiBTQ1NJIGRldmljZSB0byBiZSBkZXN0cm95ZWQKICAqCi0gKglIYW5kbGVzIFNDU0kgbGF5ZXIgdGltZW91dC4gIFdlIHJhY2Ugd2l0aCBub3JtYWwgY29tcGxldGlvbiBvZgotICoJdGhlIHFjIGZvciBAY21kLiAgSWYgdGhlIHFjIGlzIGFscmVhZHkgZ29uZSwgd2UgbG9zZSBhbmQgbGV0Ci0gKgl0aGUgc2NzaSBjb21tYW5kIGZpbmlzaCAoRUhfSEFORExFRCkuICBPdGhlcndpc2UsIHRoZSBxYyBoYXMKLSAqCXRpbWVkIG91dCBhbmQgRUggc2hvdWxkIGJlIGludm9rZWQuICBQcmV2ZW50IGF0YV9xY19jb21wbGV0ZSgpCi0gKglmcm9tIGZpbmlzaGluZyBpdCBieSBzZXR0aW5nIEVIX1NDSEVEVUxFRCBhbmQgcmV0dXJuCi0gKglFSF9OT1RfSEFORExFRC4KKyAqCUBzZGV2IGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCBmb3IgaG90L3dhcm0gdW5wbHVnZ2luZy4gIElmCisgKgl0aGlzIHVucGx1Z2dpbmcgd2FzIGluaXRpYXRlZCBieSBsaWJhdGEgYXMgaW5kaWNhdGVkIGJ5IE5VTEwKKyAqCWRldi0+c2RldiwgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuCisgKglPdGhlcndpc2UsIFNDU0kgbGF5ZXIgaW5pdGlhdGVkIHdhcm0tdW5wbHVnIGlzIGluIHByb2dyZXNzLgorICoJQ2xlYXIgZGV2LT5zZGV2LCBzY2hlZHVsZSB0aGUgZGV2aWNlIGZvciBBVEEgZGV0YWNoIGFuZCBpbnZva2UKKyAqCUVILgogICoKICAqCUxPQ0tJTkc6Ci0gKglDYWxsZWQgZnJvbSB0aW1lciBjb250ZXh0CisgKglEZWZpbmVkIGJ5IFNDU0kgbGF5ZXIuICBXZSBkb24ndCByZWFsbHkgY2FyZS4KKyAqLwordm9pZCBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95KHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2OworCisJaWYgKCFhcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZShhcC0+bG9jaywgZmxhZ3MpOworCWRldiA9IF9fYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNkZXYpOworCWlmIChkZXYgJiYgZGV2LT5zZGV2KSB7CisJCS8qIFNDU0kgZGV2aWNlIGFscmVhZHkgaW4gQ0FOQ0VMIHN0YXRlLCBubyBuZWVkIHRvIG9mZmxpbmUgaXQgKi8KKwkJZGV2LT5zZGV2ID0gTlVMTDsKKwkJZGV2LT5mbGFncyB8PSBBVEFfREZMQUdfREVUQUNIOworCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKglhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGggLSBTQ1NJIGNhbGxiYWNrIGZvciBxdWV1ZSBkZXB0aCBjb25maWcKKyAqCUBzZGV2OiBTQ1NJIGRldmljZSB0byBjb25maWd1cmUgcXVldWUgZGVwdGggZm9yCisgKglAcXVldWVfZGVwdGg6IG5ldyBxdWV1ZSBkZXB0aAorICoKKyAqCVRoaXMgaXMgbGliYXRhIHN0YW5kYXJkIGhvc3R0LT5jaGFuZ2VfcXVldWVfZGVwdGggY2FsbGJhY2suCisgKglTQ1NJIHdpbGwgY2FsbCBpbnRvIHRoaXMgY2FsbGJhY2sgd2hlbiB1c2VyIHRyaWVzIHRvIHNldCBxdWV1ZQorICoJZGVwdGggdmlhIHN5c2ZzLgorICoKKyAqCUxPQ0tJTkc6CisgKglTQ1NJIGxheWVyICh3ZSBkb24ndCBjYXJlKQogICoKICAqCVJFVFVSTlM6Ci0gKglFSF9IQU5ETEVEIG9yIEVIX05PVF9IQU5ETEVECisgKglOZXdseSBjb25maWd1cmVkIHF1ZXVlIGRlcHRoLgogICovCi1lbnVtIHNjc2lfZWhfdGltZXJfcmV0dXJuIGF0YV9zY3NpX3RpbWVkX291dChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpCitpbnQgYXRhX3Njc2lfY2hhbmdlX3F1ZXVlX2RlcHRoKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldiwgaW50IHF1ZXVlX2RlcHRoKQogewotCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBjbWQtPmRldmljZS0+aG9zdDsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gKHN0cnVjdCBhdGFfcG9ydCAqKSAmaG9zdC0+aG9zdGRhdGFbMF07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwotCWVudW0gc2NzaV9laF90aW1lcl9yZXR1cm4gcmV0ID0gRUhfSEFORExFRDsKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gYXRhX3Nob3N0X3RvX3BvcnQoc2Rldi0+aG9zdCk7CisJc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlpbnQgbWF4X2RlcHRoOwogCi0JRFBSSU5USygiRU5URVJcbiIpOworCWlmIChxdWV1ZV9kZXB0aCA8IDEpCisJCXJldHVybiBzZGV2LT5xdWV1ZV9kZXB0aDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcC0+aG9zdF9zZXQtPmxvY2ssIGZsYWdzKTsKLQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCWlmIChxYykgewotCQlXQVJOX09OKHFjLT5zY3NpY21kICE9IGNtZCk7Ci0JCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0VIX1NDSEVEVUxFRDsKLQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9USU1FT1VUOwotCQlyZXQgPSBFSF9OT1RfSEFORExFRDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CisJZGV2ID0gYXRhX3Njc2lfZmluZF9kZXYoYXAsIHNkZXYpOworCWlmICghZGV2IHx8ICFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKKwkJcmV0dXJuIHNkZXYtPnF1ZXVlX2RlcHRoOwogCi0JRFBSSU5USygiRVhJVCwgcmV0PSVkXG4iLCByZXQpOwotCXJldHVybiByZXQ7Ci19CisJbWF4X2RlcHRoID0gbWluKHNkZXYtPmhvc3QtPmNhbl9xdWV1ZSwgYXRhX2lkX3F1ZXVlX2RlcHRoKGRldi0+aWQpKTsKKwltYXhfZGVwdGggPSBtaW4oQVRBX01BWF9RVUVVRSAtIDEsIG1heF9kZXB0aCk7CisJaWYgKHF1ZXVlX2RlcHRoID4gbWF4X2RlcHRoKQorCQlxdWV1ZV9kZXB0aCA9IG1heF9kZXB0aDsKIAotLyoqCi0gKglhdGFfc2NzaV9lcnJvciAtIFNDU0kgbGF5ZXIgZXJyb3IgaGFuZGxlciBjYWxsYmFjawotICoJQGhvc3Q6IFNDU0kgaG9zdCBvbiB3aGljaCBlcnJvciBvY2N1cnJlZAotICoKLSAqCUhhbmRsZXMgU0NTSS1sYXllci10aHJvd24gZXJyb3IgZXZlbnRzLgotICoKLSAqCUxPQ0tJTkc6Ci0gKglJbmhlcml0ZWQgZnJvbSBTQ1NJIGxheWVyIChub25lLCBjYW4gc2xlZXApCi0gKi8KLQotc3RhdGljIHZvaWQgYXRhX3Njc2lfZXJyb3Ioc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlEUFJJTlRLKCJFTlRFUlxuIik7Ci0KLQlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJmhvc3QtPmhvc3RkYXRhWzBdOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCVdBUk5fT04oYXAtPmZsYWdzICYgQVRBX0ZMQUdfSU5fRUgpOwotCWFwLT5mbGFncyB8PSBBVEFfRkxBR19JTl9FSDsKLQlXQVJOX09OKGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpID09IE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCi0JYXRhX3BvcnRfZmx1c2hfdGFzayhhcCk7Ci0KLQlhcC0+b3BzLT5lbmdfdGltZW91dChhcCk7Ci0KLQlXQVJOX09OKGhvc3QtPmhvc3RfZmFpbGVkIHx8ICFsaXN0X2VtcHR5KCZob3N0LT5laF9jbWRfcSkpOwotCi0Jc2NzaV9laF9mbHVzaF9kb25lX3EoJmFwLT5laF9kb25lX3EpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCWFwLT5mbGFncyAmPSB+QVRBX0ZMQUdfSU5fRUg7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Ci0KLQlEUFJJTlRLKCJFWElUXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgYXRhX2VoX3Njc2lkb25lKHN0cnVjdCBzY3NpX2NtbmQgKnNjbWQpCi17Ci0JLyogbmFkYSAqLwotfQotCi1zdGF0aWMgdm9pZCBfX2F0YV9laF9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQotewotCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IHFjLT5zY3NpY21kOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXAtPmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7Ci0JcWMtPnNjc2lkb25lID0gYXRhX2VoX3Njc2lkb25lOwotCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKLQlXQVJOX09OKGF0YV90YWdfdmFsaWQocWMtPnRhZykpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwLT5ob3N0X3NldC0+bG9jaywgZmxhZ3MpOwotCi0Jc2NzaV9laF9maW5pc2hfY21kKHNjbWQsICZhcC0+ZWhfZG9uZV9xKTsKLX0KLQotLyoqCi0gKglhdGFfZWhfcWNfY29tcGxldGUgLSBDb21wbGV0ZSBhbiBhY3RpdmUgQVRBIGNvbW1hbmQgZnJvbSBFSAotICoJQHFjOiBDb21tYW5kIHRvIGNvbXBsZXRlCi0gKgotICoJSW5kaWNhdGUgdG8gdGhlIG1pZCBhbmQgdXBwZXIgbGF5ZXJzIHRoYXQgYW4gQVRBIGNvbW1hbmQgaGFzCi0gKgljb21wbGV0ZWQuICBUbyBiZSB1c2VkIGZyb20gRUguCi0gKi8KLXZvaWQgYXRhX2VoX3FjX2NvbXBsZXRlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCi17Ci0Jc3RydWN0IHNjc2lfY21uZCAqc2NtZCA9IHFjLT5zY3NpY21kOwotCXNjbWQtPnJldHJpZXMgPSBzY21kLT5hbGxvd2VkOwotCV9fYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKLX0KLQotLyoqCi0gKglhdGFfZWhfcWNfcmV0cnkgLSBUZWxsIG1pZGxheWVyIHRvIHJldHJ5IGFuIEFUQSBjb21tYW5kIGFmdGVyIEVICi0gKglAcWM6IENvbW1hbmQgdG8gcmV0cnkKLSAqCi0gKglJbmRpY2F0ZSB0byB0aGUgbWlkIGFuZCB1cHBlciBsYXllcnMgdGhhdCBhbiBBVEEgY29tbWFuZAotICoJc2hvdWxkIGJlIHJldHJpZWQuICBUbyBiZSB1c2VkIGZyb20gRUguCi0gKgotICoJU0NTSSBtaWRsYXllciBsaW1pdHMgdGhlIG51bWJlciBvZiByZXRyaWVzIHRvIHNjbWQtPmFsbG93ZWQuCi0gKglUaGlzIGZ1bmN0aW9uIG1pZ2h0IG5lZWQgdG8gYWRqdXN0IHNjbWQtPnJldHJpZXMgZm9yIGNvbW1hbmRzCi0gKgl3aGljaCBnZXQgcmV0cmllZCBkdWUgdG8gdW5yZWxhdGVkIE5DUSBmYWlsdXJlcy4KLSAqLwotdm9pZCBhdGFfZWhfcWNfcmV0cnkoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKLXsKLQlfX2F0YV9laF9xY19jb21wbGV0ZShxYyk7CisJc2NzaV9hZGp1c3RfcXVldWVfZGVwdGgoc2RldiwgTVNHX1NJTVBMRV9UQUcsIHF1ZXVlX2RlcHRoKTsKKwlyZXR1cm4gcXVldWVfZGVwdGg7CiB9CiAKIC8qKgpAQCAtODkxLDcgKzgzNSw3IEBACiAJCXRmLT5uc2VjdCA9IDE7CS8qIDEgc2VjdG9yLCBsYmE9MCAqLwogCiAJCWlmIChxYy0+ZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkEpIHsKLQkJCXFjLT50Zi5mbGFncyB8PSBBVEFfVEZMQUdfTEJBOworCQkJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19MQkE7CiAKIAkJCXRmLT5sYmFoID0gMHgwOwogCQkJdGYtPmxiYW0gPSAweDA7CkBAIC0xMTk1LDYgKzExMzksNyBAQAogCXU2NCBibG9jazsKIAl1MzIgbl9ibG9jazsKIAorCXFjLT5mbGFncyB8PSBBVEFfUUNGTEFHX0lPOwogCXRmLT5mbGFncyB8PSBBVEFfVEZMQUdfSVNBRERSIHwgQVRBX1RGTEFHX0RFVklDRTsKIAogCWlmIChzY3NpY21kWzBdID09IFdSSVRFXzEwIHx8IHNjc2ljbWRbMF0gPT0gV1JJVEVfNiB8fApAQCAtMTI0MSw3ICsxMTg2LDM2IEBACiAJCSAqLwogCQlnb3RvIG5vdGhpbmdfdG9fZG87CiAKLQlpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19MQkEpIHsKKwlpZiAoKGRldi0+ZmxhZ3MgJiAoQVRBX0RGTEFHX1BJTyB8IEFUQV9ERkxBR19OQ1EpKSA9PSBBVEFfREZMQUdfTkNRKSB7CisJCS8qIHlheSwgTkNRICovCisJCWlmICghbGJhXzQ4X29rKGJsb2NrLCBuX2Jsb2NrKSkKKwkJCWdvdG8gb3V0X29mX3JhbmdlOworCisJCXRmLT5wcm90b2NvbCA9IEFUQV9QUk9UX05DUTsKKwkJdGYtPmZsYWdzIHw9IEFUQV9URkxBR19MQkEgfCBBVEFfVEZMQUdfTEJBNDg7CisKKwkJaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19XUklURSkKKwkJCXRmLT5jb21tYW5kID0gQVRBX0NNRF9GUERNQV9XUklURTsKKwkJZWxzZQorCQkJdGYtPmNvbW1hbmQgPSBBVEFfQ01EX0ZQRE1BX1JFQUQ7CisKKwkJcWMtPm5zZWN0ID0gbl9ibG9jazsKKworCQl0Zi0+bnNlY3QgPSBxYy0+dGFnIDw8IDM7CisJCXRmLT5ob2JfZmVhdHVyZSA9IChuX2Jsb2NrID4+IDgpICYgMHhmZjsKKwkJdGYtPmZlYXR1cmUgPSBuX2Jsb2NrICYgMHhmZjsKKworCQl0Zi0+aG9iX2xiYWggPSAoYmxvY2sgPj4gNDApICYgMHhmZjsKKwkJdGYtPmhvYl9sYmFtID0gKGJsb2NrID4+IDMyKSAmIDB4ZmY7CisJCXRmLT5ob2JfbGJhbCA9IChibG9jayA+PiAyNCkgJiAweGZmOworCQl0Zi0+bGJhaCA9IChibG9jayA+PiAxNikgJiAweGZmOworCQl0Zi0+bGJhbSA9IChibG9jayA+PiA4KSAmIDB4ZmY7CisJCXRmLT5sYmFsID0gYmxvY2sgJiAweGZmOworCisJCXRmLT5kZXZpY2UgPSAxIDw8IDY7CisJCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfRlVBKQorCQkJdGYtPmRldmljZSB8PSAxIDw8IDc7CisJfSBlbHNlIGlmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQSkgewogCQl0Zi0+ZmxhZ3MgfD0gQVRBX1RGTEFHX0xCQTsKIAogCQlpZiAobGJhXzI4X29rKGJsb2NrLCBuX2Jsb2NrKSkgewpAQCAtMTMzMiw2ICsxMzA2LDE3IEBACiAJdTggKmNkYiA9IGNtZC0+Y21uZDsKICAJaW50IG5lZWRfc2Vuc2UgPSAocWMtPmVycl9tYXNrICE9IDApOwogCisJLyogV2Ugc25vb3AgdGhlIFNFVF9GRUFUVVJFUyAtIFdyaXRlIENhY2hlIE9OL09GRiBjb21tYW5kLCBhbmQKKwkgKiBzY2hlZHVsZSBFSF9SRVZBTElEQVRFIG9wZXJhdGlvbiB0byB1cGRhdGUgdGhlIElERU5USUZZIERFVklDRQorCSAqIGNhY2hlCisJICovCisJaWYgKCFuZWVkX3NlbnNlICYmIChxYy0+dGYuY29tbWFuZCA9PSBBVEFfQ01EX1NFVF9GRUFUVVJFUykgJiYKKwkgICAgKChxYy0+dGYuZmVhdHVyZSA9PSBTRVRGRUFUVVJFU19XQ19PTikgfHwKKwkgICAgIChxYy0+dGYuZmVhdHVyZSA9PSBTRVRGRUFUVVJFU19XQ19PRkYpKSkgeworCQlxYy0+YXAtPmVoX2luZm8uYWN0aW9uIHw9IEFUQV9FSF9SRVZBTElEQVRFOworCQlhdGFfcG9ydF9zY2hlZHVsZV9laChxYy0+YXApOworCX0KKwogCS8qIEZvciBBVEEgcGFzcyB0aHJ1IChTQVQpIGNvbW1hbmRzLCBnZW5lcmF0ZSBhIHNlbnNlIGJsb2NrIGlmCiAJICogdXNlciBtYW5kYXRlZCBpdCBvciBpZiB0aGVyZSdzIGFuIGVycm9yLiAgTm90ZSB0aGF0IGlmIHdlCiAJICogZ2VuZXJhdGUgYmVjYXVzZSB0aGUgdXNlciBmb3JjZWQgdXMgdG8sIGEgY2hlY2sgY29uZGl0aW9uCkBAIC0xMzU2LDEwICsxMzQxLDggQEAKIAkJfQogCX0KIAotCWlmIChuZWVkX3NlbnNlKSB7Ci0JCS8qIFRoZSBhdGFfZ2VuXy4uLl9zZW5zZSByb3V0aW5lcyBmaWxsIGluIHRmICovCi0JCWF0YV9kdW1wX3N0YXR1cyhxYy0+YXAtPmlkLCAmcWMtPnRmKTsKLQl9CisJaWYgKG5lZWRfc2Vuc2UgJiYgIXFjLT5hcC0+b3BzLT5lcnJvcl9oYW5kbGVyKQorCQlhdGFfZHVtcF9zdGF0dXMocWMtPmFwLT5pZCwgJnFjLT5yZXN1bHRfdGYpOwogCiAJcWMtPnNjc2lkb25lKGNtZCk7CiAKQEAgLTEzNjcsOCArMTM1MCw0MCBAQAogfQogCiAvKioKKyAqCWF0YV9zY21kX25lZWRfZGVmZXIgLSBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gZGVmZXIgc2NtZAorICoJQGRldjogQVRBIGRldmljZSB0byB3aGljaCB0aGUgY29tbWFuZCBpcyBhZGRyZXNzZWQKKyAqCUBpc19pbzogSXMgdGhlIGNvbW1hbmQgSU8gKGFuZCB0aHVzIHBvc3NpYmx5IE5DUSk/CisgKgorICoJTkNRIGFuZCBub24tTkNRIGNvbW1hbmRzIGNhbm5vdCBydW4gdG9nZXRoZXIuICBBcyB1cHBlciBsYXllcgorICoJb25seSBrbm93cyB0aGUgcXVldWUgZGVwdGgsIHdlIGFyZSByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcKKyAqCWV4Y2x1c2lvbi4gIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgYSBuZXcgY29tbWFuZCBjYW4gYmUKKyAqCWlzc3VlZCB0byBAZGV2LgorICoKKyAqCUxPQ0tJTkc6CisgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKgkxIGlmIGRlZmVycmluZyBpcyBuZWVkZWQsIDAgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGF0YV9zY21kX25lZWRfZGVmZXIoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgaW50IGlzX2lvKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOworCisJaWYgKCEoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19OQ1EpKQorCQlyZXR1cm4gMDsKKworCWlmIChpc19pbykgeworCQlpZiAoIWF0YV90YWdfdmFsaWQoYXAtPmFjdGl2ZV90YWcpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKCFhdGFfdGFnX3ZhbGlkKGFwLT5hY3RpdmVfdGFnKSAmJiAhYXAtPnNhY3RpdmUpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKgogICoJYXRhX3Njc2lfdHJhbnNsYXRlIC0gVHJhbnNsYXRlIHRoZW4gaXNzdWUgU0NTSSBjb21tYW5kIHRvIEFUQSBkZXZpY2UKLSAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGNvbW1hbmQgaXMgYWRkcmVzc2VkCiAgKglAZGV2OiBBVEEgZGV2aWNlIHRvIHdoaWNoIHRoZSBjb21tYW5kIGlzIGFkZHJlc3NlZAogICoJQGNtZDogU0NTSSBjb21tYW5kIHRvIGV4ZWN1dGUKICAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbgpAQCAtMTM4OSwxOSArMTQwNCwyNSBAQAogICoKICAqCUxPQ0tJTkc6CiAgKglzcGluX2xvY2tfaXJxc2F2ZShob3N0X3NldCBsb2NrKQorICoKKyAqCVJFVFVSTlM6CisgKgkwIG9uIHN1Y2Nlc3MsIFNDU0lfTUxfUVVFVUVfREVWSUNFX0JVU1kgaWYgdGhlIGNvbW1hbmQKKyAqCW5lZWRzIHRvIGJlIGRlZmVycmVkLgogICovCi0KLXN0YXRpYyB2b2lkIGF0YV9zY3NpX3RyYW5zbGF0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorc3RhdGljIGludCBhdGFfc2NzaV90cmFuc2xhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kLAogCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCiAJCQkgICAgICBhdGFfeGxhdF9mdW5jX3QgeGxhdF9mdW5jKQogewogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAJdTggKnNjc2ljbWQgPSBjbWQtPmNtbmQ7CisJaW50IGlzX2lvID0geGxhdF9mdW5jID09IGF0YV9zY3NpX3J3X3hsYXQ7CiAKIAlWUFJJTlRLKCJFTlRFUlxuIik7CiAKLQlxYyA9IGF0YV9zY3NpX3FjX25ldyhhcCwgZGV2LCBjbWQsIGRvbmUpOworCWlmICh1bmxpa2VseShhdGFfc2NtZF9uZWVkX2RlZmVyKGRldiwgaXNfaW8pKSkKKwkJZ290byBkZWZlcjsKKworCXFjID0gYXRhX3Njc2lfcWNfbmV3KGRldiwgY21kLCBkb25lKTsKIAlpZiAoIXFjKQogCQlnb3RvIGVycl9tZW07CiAKQEAgLTE0MDksOCArMTQzMCw4IEBACiAJaWYgKGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFIHx8CiAJICAgIGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQlpZiAodW5saWtlbHkoY21kLT5yZXF1ZXN0X2J1ZmZsZW4gPCAxKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUoJXUpOiBXQVJOSU5HOiB6ZXJvIGxlbiByL3cgcmVxXG4iLAotCQkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubyk7CisJCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fV0FSTklORywKKwkJCQkgICAgICAgIldBUk5JTkc6IHplcm8gbGVuIHIvdyByZXFcbiIpOwogCQkJZ290byBlcnJfZGlkOwogCQl9CiAKQEAgLTE0MzIsMTMgKzE0NTMsMTMgQEAKIAlhdGFfcWNfaXNzdWUocWMpOwogCiAJVlBSSU5USygiRVhJVFxuIik7Ci0JcmV0dXJuOworCXJldHVybiAwOwogCiBlYXJseV9maW5pc2g6CiAgICAgICAgIGF0YV9xY19mcmVlKHFjKTsKIAlkb25lKGNtZCk7CiAJRFBSSU5USygiRVhJVCAtIGVhcmx5IGZpbmlzaCAoZ29vZCBvciBlcnJvcilcbiIpOwotCXJldHVybjsKKwlyZXR1cm4gMDsKIAogZXJyX2RpZDoKIAlhdGFfcWNfZnJlZShxYyk7CkBAIC0xNDQ2LDcgKzE0NjcsMTEgQEAKIAljbWQtPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCWRvbmUoY21kKTsKIAlEUFJJTlRLKCJFWElUIC0gaW50ZXJuYWxcbiIpOwotCXJldHVybjsKKwlyZXR1cm4gMDsKKworZGVmZXI6CisJRFBSSU5USygiRVhJVCAtIGRlZmVyXG4iKTsKKwlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwogfQogCiAvKioKQEAgLTE5NDQsNyArMTk2OSw3IEBACiAJCXJldHVybiAwOwogCiAJZHBvZnVhID0gMDsKLQlpZiAoYXRhX2Rldl9zdXBwb3J0c19mdWEoYXJncy0+aWQpICYmIGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfTEJBNDggJiYKKwlpZiAoYXRhX2Rldl9zdXBwb3J0c19mdWEoYXJncy0+aWQpICYmIChkZXYtPmZsYWdzICYgQVRBX0RGTEFHX0xCQTQ4KSAmJgogCSAgICAoIShkZXYtPmZsYWdzICYgQVRBX0RGTEFHX1BJTykgfHwgZGV2LT5tdWx0aV9jb3VudCkpCiAJCWRwb2Z1YSA9IDEgPDwgNDsKIApAQCAtMjEzNywxMyArMjE2MiwxNCBAQAogCiBzdGF0aWMgdm9pZCBhdGFwaV9zZW5zZV9jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewotCWlmIChxYy0+ZXJyX21hc2sgJiYgKChxYy0+ZXJyX21hc2sgJiBBQ19FUlJfREVWKSA9PSAwKSkKKwlpZiAocWMtPmVycl9tYXNrICYmICgocWMtPmVycl9tYXNrICYgQUNfRVJSX0RFVikgPT0gMCkpIHsKIAkJLyogRklYTUU6IG5vdCBxdWl0ZSByaWdodDsgd2UgZG9uJ3Qgd2FudCB0aGUKIAkJICogdHJhbnNsYXRpb24gb2YgdGFza2ZpbGUgcmVnaXN0ZXJzIGludG8KIAkJICogYSBzZW5zZSBkZXNjcmlwdG9ycywgc2luY2UgdGhhdCdzIG9ubHkKIAkJICogY29ycmVjdCBmb3IgQVRBLCBub3QgQVRBUEkKIAkJICovCiAJCWF0YV9nZW5fYXRhX2Rlc2Nfc2Vuc2UocWMpOworCX0KIAogCXFjLT5zY3NpZG9uZShxYy0+c2NzaWNtZCk7CiAJYXRhX3FjX2ZyZWUocWMpOwpAQCAtMjIwNywyMSArMjIzMywzOCBAQAogCiAJVlBSSU5USygiRU5URVIsIGVycl9tYXNrIDB4JVhcbiIsIGVycl9tYXNrKTsKIAorCS8qIGhhbmRsZSBjb21wbGV0aW9uIGZyb20gbmV3IEVIICovCisJaWYgKHVubGlrZWx5KHFjLT5hcC0+b3BzLT5lcnJvcl9oYW5kbGVyICYmCisJCSAgICAgKGVycl9tYXNrIHx8IHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQpKSkgeworCisJCWlmICghKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQpKSB7CisJCQkvKiBGSVhNRTogbm90IHF1aXRlIHJpZ2h0OyB3ZSBkb24ndCB3YW50IHRoZQorCQkJICogdHJhbnNsYXRpb24gb2YgdGFza2ZpbGUgcmVnaXN0ZXJzIGludG8gYQorCQkJICogc2Vuc2UgZGVzY3JpcHRvcnMsIHNpbmNlIHRoYXQncyBvbmx5CisJCQkgKiBjb3JyZWN0IGZvciBBVEEsIG5vdCBBVEFQSQorCQkJICovCisJCQlhdGFfZ2VuX2F0YV9kZXNjX3NlbnNlKHFjKTsKKwkJfQorCisJCXFjLT5zY3NpY21kLT5yZXN1bHQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCXFjLT5zY3NpZG9uZShjbWQpOworCQlhdGFfcWNfZnJlZShxYyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb3Igb2xkIEVIIGZhaWx1cmUgcGF0aCAqLwogCWlmICh1bmxpa2VseShlcnJfbWFzayAmIEFDX0VSUl9ERVYpKSB7CiAJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOwogCQlhdGFwaV9yZXF1ZXN0X3NlbnNlKHFjKTsKIAkJcmV0dXJuOwotCX0KLQotCWVsc2UgaWYgKHVubGlrZWx5KGVycl9tYXNrKSkKKwl9IGVsc2UgaWYgKHVubGlrZWx5KGVycl9tYXNrKSkgewogCQkvKiBGSVhNRTogbm90IHF1aXRlIHJpZ2h0OyB3ZSBkb24ndCB3YW50IHRoZQogCQkgKiB0cmFuc2xhdGlvbiBvZiB0YXNrZmlsZSByZWdpc3RlcnMgaW50bwogCQkgKiBhIHNlbnNlIGRlc2NyaXB0b3JzLCBzaW5jZSB0aGF0J3Mgb25seQogCQkgKiBjb3JyZWN0IGZvciBBVEEsIG5vdCBBVEFQSQogCQkgKi8KIAkJYXRhX2dlbl9hdGFfZGVzY19zZW5zZShxYyk7Ci0KLQllbHNlIHsKKwl9IGVsc2UgewogCQl1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKIAogCQlpZiAoKHNjc2ljbWRbMF0gPT0gSU5RVUlSWSkgJiYgKChzY3NpY21kWzFdICYgMHgwMykgPT0gMCkpIHsKQEAgLTIzMDMsMTEgKzIzNDYsOSBAQAogCQlxYy0+dGYucHJvdG9jb2wgPSBBVEFfUFJPVF9BVEFQSV9ETUE7CiAJCXFjLT50Zi5mZWF0dXJlIHw9IEFUQVBJX1BLVF9ETUE7CiAKLSNpZmRlZiBBVEFQSV9FTkFCTEVfRE1BRElSCi0JCS8qIHNvbWUgU0FUQSBicmlkZ2VzIG5lZWQgdXMgdG8gaW5kaWNhdGUgZGF0YSB4ZmVyIGRpcmVjdGlvbiAqLwotCQlpZiAoY21kLT5zY19kYXRhX2RpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQorCQlpZiAoYXRhcGlfZG1hZGlyICYmIChjbWQtPnNjX2RhdGFfZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpKQorCQkJLyogc29tZSBTQVRBIGJyaWRnZXMgbmVlZCB1cyB0byBpbmRpY2F0ZSBkYXRhIHhmZXIgZGlyZWN0aW9uICovCiAJCQlxYy0+dGYuZmVhdHVyZSB8PSBBVEFQSV9ETUFESVI7Ci0jZW5kaWYKIAl9CiAKIAlxYy0+bmJ5dGVzID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW47CkBAIC0yMzE1LDYgKzIzNTYsNTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICogYXRhX2ZpbmRfZGV2KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBpZCkKK3sKKwlpZiAobGlrZWx5KGlkIDwgQVRBX01BWF9ERVZJQ0VTKSkKKwkJcmV0dXJuICZhcC0+ZGV2aWNlW2lkXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBhdGFfZGV2aWNlICogX19hdGFfc2NzaV9maW5kX2RldihzdHJ1Y3QgYXRhX3BvcnQgKmFwLAorCQkJCQljb25zdCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCit7CisJLyogc2tpcCBjb21tYW5kcyBub3QgYWRkcmVzc2VkIHRvIHRhcmdldHMgd2Ugc2ltdWxhdGUgKi8KKwlpZiAodW5saWtlbHkoc2NzaWRldi0+Y2hhbm5lbCB8fCBzY3NpZGV2LT5sdW4pKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBhdGFfZmluZF9kZXYoYXAsIHNjc2lkZXYtPmlkKTsKK30KKworLyoqCisgKglhdGFfc2NzaV9kZXZfZW5hYmxlZCAtIGRldGVybWluZSBpZiBkZXZpY2UgaXMgZW5hYmxlZAorICoJQGRldjogQVRBIGRldmljZQorICoKKyAqCURldGVybWluZSBpZiBjb21tYW5kcyBzaG91bGQgYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIGRldmljZS4KKyAqCisgKglMT0NLSU5HOgorICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKKyAqCisgKglSRVRVUk5TOgorICoJMCBpZiBjb21tYW5kcyBhcmUgbm90IGFsbG93ZWQgLyAxIGlmIGNvbW1hbmRzIGFyZSBhbGxvd2VkCisgKi8KKworc3RhdGljIGludCBhdGFfc2NzaV9kZXZfZW5hYmxlZChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCWlmICh1bmxpa2VseSghYXRhX2Rldl9lbmFibGVkKGRldikpKQorCQlyZXR1cm4gMDsKKworCWlmICghYXRhcGlfZW5hYmxlZCB8fCAoZGV2LT5hcC0+ZmxhZ3MgJiBBVEFfRkxBR19OT19BVEFQSSkpIHsKKwkJaWYgKHVubGlrZWx5KGRldi0+Y2xhc3MgPT0gQVRBX0RFVl9BVEFQSSkpIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9XQVJOSU5HLAorCQkJCSAgICAgICAiV0FSTklORzogQVRBUEkgaXMgJXMsIGRldmljZSBpZ25vcmVkLlxuIiwKKwkJCQkgICAgICAgYXRhcGlfZW5hYmxlZCA/ICJub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBkcml2ZXIiIDogImRpc2FibGVkIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCiAvKioKICAqCWF0YV9zY3NpX2ZpbmRfZGV2IC0gbG9va3VwIGF0YV9kZXZpY2UgZnJvbSBzY3NpX2NtbmQKICAqCUBhcDogQVRBIHBvcnQgdG8gd2hpY2ggdGhlIGRldmljZSBpcyBhdHRhY2hlZApAQCAtMjMzMSwzMyArMjQxOSwxNCBAQAogICoJUkVUVVJOUzoKICAqCUFzc29jaWF0ZWQgQVRBIGRldmljZSwgb3IgJU5VTEwgaWYgbm90IGZvdW5kLgogICovCi0KIHN0YXRpYyBzdHJ1Y3QgYXRhX2RldmljZSAqCiBhdGFfc2NzaV9maW5kX2RldihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBjb25zdCBzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNjc2lkZXYpCiB7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gX19hdGFfc2NzaV9maW5kX2RldihhcCwgc2NzaWRldik7CiAKLQkvKiBza2lwIGNvbW1hbmRzIG5vdCBhZGRyZXNzZWQgdG8gdGFyZ2V0cyB3ZSBzaW11bGF0ZSAqLwotCWlmIChsaWtlbHkoc2NzaWRldi0+aWQgPCBBVEFfTUFYX0RFVklDRVMpKQotCQlkZXYgPSAmYXAtPmRldmljZVtzY3NpZGV2LT5pZF07Ci0JZWxzZQorCWlmICh1bmxpa2VseSghZGV2IHx8ICFhdGFfc2NzaV9kZXZfZW5hYmxlZChkZXYpKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAodW5saWtlbHkoKHNjc2lkZXYtPmNoYW5uZWwgIT0gMCkgfHwKLQkJICAgICAoc2NzaWRldi0+bHVuICE9IDApKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAodW5saWtlbHkoIWF0YV9kZXZfcHJlc2VudChkZXYpKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoIWF0YXBpX2VuYWJsZWQgfHwgKGFwLT5mbGFncyAmIEFUQV9GTEFHX05PX0FUQVBJKSkgewotCQlpZiAodW5saWtlbHkoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQVBJKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXUoJXUpOiBXQVJOSU5HOiBBVEFQSSBpcyAlcywgZGV2aWNlIGlnbm9yZWQuXG4iLAotCQkJICAgICAgIGFwLT5pZCwgZGV2LT5kZXZubywgYXRhcGlfZW5hYmxlZCA/ICJub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBkcml2ZXIiIDogImRpc2FibGVkIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCX0KLQogCXJldHVybiBkZXY7CiB9CiAKQEAgLTI0MTQsMTAgKzI0ODMsMTUgQEAKIHsKIAlzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiA9ICYocWMtPnRmKTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQgPSBxYy0+c2NzaWNtZDsKKwlzdHJ1Y3QgYXRhX2RldmljZSAqZGV2ID0gcWMtPmRldjsKIAogCWlmICgodGYtPnByb3RvY29sID0gYXRhX3Njc2lfbWFwX3Byb3RvKHNjc2ljbWRbMV0pKSA9PSBBVEFfUFJPVF9VTktOT1dOKQogCQlnb3RvIGludmFsaWRfZmxkOwogCisJLyogV2UgbWF5IG5vdCBpc3N1ZSBETUEgY29tbWFuZHMgaWYgbm8gRE1BIG1vZGUgaXMgc2V0ICovCisJaWYgKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9ETUEgJiYgZGV2LT5kbWFfbW9kZSA9PSAwKQorCQlnb3RvIGludmFsaWRfZmxkOworCiAJaWYgKHNjc2ljbWRbMV0gJiAweGUwKQogCQkvKiBQSU8gbXVsdGkgbm90IHN1cHBvcnRlZCB5ZXQgKi8KIAkJZ290byBpbnZhbGlkX2ZsZDsKQEAgLTI1MDIsNiArMjU3Niw5IEBACiAJICovCiAJcWMtPm5zZWN0ID0gY21kLT5yZXF1ZXN0X2J1ZmZsZW4gLyBBVEFfU0VDVF9TSVpFOwogCisJLyogcmVxdWVzdCByZXN1bHQgVEYgKi8KKwlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19SRVNVTFRfVEY7CisKIAlyZXR1cm4gMDsKIAogIGludmFsaWRfZmxkOgpAQCAtMjU3OCwxOSArMjY1NSwyNCBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2F0YV9zY3NpX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKiksCi0JCQkJICAgICAgIHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIGludCBfX2F0YV9zY3NpX3F1ZXVlY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgICAgICB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSwKKwkJCQkgICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogeworCWludCByYyA9IDA7CisKIAlpZiAoZGV2LT5jbGFzcyA9PSBBVEFfREVWX0FUQSkgewogCQlhdGFfeGxhdF9mdW5jX3QgeGxhdF9mdW5jID0gYXRhX2dldF94bGF0X2Z1bmMoZGV2LAogCQkJCQkJCSAgICAgIGNtZC0+Y21uZFswXSk7CiAKIAkJaWYgKHhsYXRfZnVuYykKLQkJCWF0YV9zY3NpX3RyYW5zbGF0ZShhcCwgZGV2LCBjbWQsIGRvbmUsIHhsYXRfZnVuYyk7CisJCQlyYyA9IGF0YV9zY3NpX3RyYW5zbGF0ZShkZXYsIGNtZCwgZG9uZSwgeGxhdF9mdW5jKTsKIAkJZWxzZQotCQkJYXRhX3Njc2lfc2ltdWxhdGUoYXAsIGRldiwgY21kLCBkb25lKTsKKwkJCWF0YV9zY3NpX3NpbXVsYXRlKGRldiwgY21kLCBkb25lKTsKIAl9IGVsc2UKLQkJYXRhX3Njc2lfdHJhbnNsYXRlKGFwLCBkZXYsIGNtZCwgZG9uZSwgYXRhcGlfeGxhdCk7CisJCXJjID0gYXRhX3Njc2lfdHJhbnNsYXRlKGRldiwgY21kLCBkb25lLCBhdGFwaV94bGF0KTsKKworCXJldHVybiByYzsKIH0KIAogLyoqCkBAIC0yNjA5LDM5ICsyNjkxLDM5IEBACiAgKglSZWxlYXNlcyBzY3NpLWxheWVyLWhlbGQgbG9jaywgYW5kIG9idGFpbnMgaG9zdF9zZXQgbG9jay4KICAqCiAgKglSRVRVUk5TOgotICoJWmVyby4KKyAqCVJldHVybiB2YWx1ZSBmcm9tIF9fYXRhX3Njc2lfcXVldWVjbWQoKSBpZiBAY21kIGNhbiBiZSBxdWV1ZWQsCisgKgkwIG90aGVyd2lzZS4KICAqLwotCiBpbnQgYXRhX3Njc2lfcXVldWVjbWQoc3RydWN0IHNjc2lfY21uZCAqY21kLCB2b2lkICgqZG9uZSkoc3RydWN0IHNjc2lfY21uZCAqKSkKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwOwogCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2ID0gY21kLT5kZXZpY2U7CiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBzY3NpZGV2LT5ob3N0OworCWludCByYyA9IDA7CiAKLQlhcCA9IChzdHJ1Y3QgYXRhX3BvcnQgKikgJnNob3N0LT5ob3N0ZGF0YVswXTsKKwlhcCA9IGF0YV9zaG9zdF90b19wb3J0KHNob3N0KTsKIAogCXNwaW5fdW5sb2NrKHNob3N0LT5ob3N0X2xvY2spOwotCXNwaW5fbG9jaygmYXAtPmhvc3Rfc2V0LT5sb2NrKTsKKwlzcGluX2xvY2soYXAtPmxvY2spOwogCiAJYXRhX3Njc2lfZHVtcF9jZGIoYXAsIGNtZCk7CiAKIAlkZXYgPSBhdGFfc2NzaV9maW5kX2RldihhcCwgc2NzaWRldik7CiAJaWYgKGxpa2VseShkZXYpKQotCQlfX2F0YV9zY3NpX3F1ZXVlY21kKGNtZCwgZG9uZSwgYXAsIGRldik7CisJCXJjID0gX19hdGFfc2NzaV9xdWV1ZWNtZChjbWQsIGRvbmUsIGRldik7CiAJZWxzZSB7CiAJCWNtZC0+cmVzdWx0ID0gKERJRF9CQURfVEFSR0VUIDw8IDE2KTsKIAkJZG9uZShjbWQpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZhcC0+aG9zdF9zZXQtPmxvY2spOworCXNwaW5fdW5sb2NrKGFwLT5sb2NrKTsKIAlzcGluX2xvY2soc2hvc3QtPmhvc3RfbG9jayk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiAvKioKICAqCWF0YV9zY3NpX3NpbXVsYXRlIC0gc2ltdWxhdGUgU0NTSSBjb21tYW5kIG9uIEFUQSBkZXZpY2UKLSAqCUBhcDogcG9ydCB0aGUgZGV2aWNlIGlzIGNvbm5lY3RlZCB0bwogICoJQGRldjogdGhlIHRhcmdldCBkZXZpY2UKICAqCUBjbWQ6IFNDU0kgY29tbWFuZCBiZWluZyBzZW50IHRvIGRldmljZS4KICAqCUBkb25lOiBTQ1NJIGNvbW1hbmQgY29tcGxldGlvbiBmdW5jdGlvbi4KQEAgLTI2NTMsMTQgKzI3MzUsMTIgQEAKICAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCiAgKi8KIAotdm9pZCBhdGFfc2NzaV9zaW11bGF0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkgICAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCit2b2lkIGF0YV9zY3NpX3NpbXVsYXRlKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKIAkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpCiB7CiAJc3RydWN0IGF0YV9zY3NpX2FyZ3MgYXJnczsKIAljb25zdCB1OCAqc2NzaWNtZCA9IGNtZC0+Y21uZDsKIAotCWFyZ3MuYXAgPSBhcDsKIAlhcmdzLmRldiA9IGRldjsKIAlhcmdzLmlkID0gZGV2LT5pZDsKIAlhcmdzLmNtZCA9IGNtZDsKQEAgLTI3MzIsMTcgKzI4MTIsMjQxIEBACiAKIHZvaWQgYXRhX3Njc2lfc2Nhbl9ob3N0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0Jc3RydWN0IGF0YV9kZXZpY2UgKmRldjsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKQorCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IEFUQV9NQVhfREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSAmYXAtPmRldmljZVtpXTsKKwkJc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2OworCisJCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikgfHwgZGV2LT5zZGV2KQorCQkJY29udGludWU7CisKKwkJc2RldiA9IF9fc2NzaV9hZGRfZGV2aWNlKGFwLT5ob3N0LCAwLCBpLCAwLCBOVUxMKTsKKwkJaWYgKCFJU19FUlIoc2RldikpIHsKKwkJCWRldi0+c2RldiA9IHNkZXY7CisJCQlzY3NpX2RldmljZV9wdXQoc2Rldik7CisJCX0KKwl9Cit9CisKKy8qKgorICoJYXRhX3Njc2lfb2ZmbGluZV9kZXYgLSBvZmZsaW5lIGF0dGFjaGVkIFNDU0kgZGV2aWNlCisgKglAZGV2OiBBVEEgZGV2aWNlIHRvIG9mZmxpbmUgYXR0YWNoZWQgU0NTSSBkZXZpY2UgZm9yCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhdGFfZWhfaG90cGx1ZygpIGFuZCByZXNwb25zaWJsZQorICoJZm9yIHRha2luZyB0aGUgU0NTSSBkZXZpY2UgYXR0YWNoZWQgdG8gQGRldiBvZmZsaW5lLiAgVGhpcworICoJZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggaG9zdF9zZXQgbG9jayB3aGljaCBwcm90ZWN0cyBkZXYtPnNkZXYKKyAqCWFnYWluc3QgY2xlYXJpbmcuCisgKgorICoJTE9DS0lORzoKKyAqCXNwaW5fbG9ja19pcnFzYXZlKGhvc3Rfc2V0IGxvY2spCisgKgorICoJUkVUVVJOUzoKKyAqCTEgaWYgYXR0YWNoZWQgU0NTSSBkZXZpY2UgZXhpc3RzLCAwIG90aGVyd2lzZS4KKyAqLworaW50IGF0YV9zY3NpX29mZmxpbmVfZGV2KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJaWYgKGRldi0+c2RldikgeworCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoZGV2LT5zZGV2LCBTREVWX09GRkxJTkUpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfcmVtb3ZlX2RldiAtIHJlbW92ZSBhdHRhY2hlZCBTQ1NJIGRldmljZQorICoJQGRldjogQVRBIGRldmljZSB0byByZW1vdmUgYXR0YWNoZWQgU0NTSSBkZXZpY2UgZm9yCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhdGFfZWhfc2NzaV9ob3RwbHVnKCkgYW5kCisgKglyZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlIFNDU0kgZGV2aWNlIGF0dGFjaGVkIHRvIEBkZXYuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqLworc3RhdGljIHZvaWQgYXRhX3Njc2lfcmVtb3ZlX2RldihzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPmFwOworCXN0cnVjdCBzY3NpX2RldmljZSAqc2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQWxhcywgd2UgbmVlZCB0byBncmFiIHNjYW5fbXV0ZXggdG8gZW5zdXJlIFNDU0kgZGV2aWNlCisJICogc3RhdGUgZG9lc24ndCBjaGFuZ2UgdW5kZXJuZWF0aCB1cyBhbmQgdGh1cworCSAqIHNjc2lfZGV2aWNlX2dldCgpIGFsd2F5cyBzdWNjZWVkcy4gIFRoZSBtdXRleCBsb2NraW5nIGNhbgorCSAqIGJlIHJlbW92ZWQgaWYgdGhlcmUgaXMgX19zY3NpX2RldmljZV9nZXQoKSBpbnRlcmZhY2Ugd2hpY2gKKwkgKiBpbmNyZW1lbnRzIHJlZmVyZW5jZSBjb3VudHMgcmVnYXJkbGVzcyBvZiBkZXZpY2Ugc3RhdGUuCisJICovCisJbXV0ZXhfbG9jaygmYXAtPmhvc3QtPnNjYW5fbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBjbGVhcmluZyBkZXYtPnNkZXYgaXMgcHJvdGVjdGVkIGJ5IGhvc3Rfc2V0IGxvY2sgKi8KKwlzZGV2ID0gZGV2LT5zZGV2OworCWRldi0+c2RldiA9IE5VTEw7CisKKwlpZiAoc2RldikgeworCQkvKiBJZiB1c2VyIGluaXRpYXRlZCB1bnBsdWcgcmFjZXMgd2l0aCB1cywgc2RldiBjYW4gZ28KKwkJICogYXdheSB1bmRlcm5lYXRoIHVzIGFmdGVyIHRoZSBob3N0X3NldCBsb2NrIGFuZAorCQkgKiBzY2FuX211dGV4IGFyZSByZWxlYXNlZC4gIEhvbGQgb250byBpdC4KKwkJICovCisJCWlmIChzY3NpX2RldmljZV9nZXQoc2RldikgPT0gMCkgeworCQkJLyogVGhlIGZvbGxvd2luZyBlbnN1cmVzIHRoZSBhdHRhY2hlZCBzZGV2IGlzCisJCQkgKiBvZmZsaW5lIG9uIHJldHVybiBmcm9tIGF0YV9zY3NpX29mZmxpbmVfZGV2KCkKKwkJCSAqIHJlZ2FyZGxlc3MgaXQgd2lucyBvciBsb3NlcyB0aGUgcmFjZQorCQkJICogYWdhaW5zdCB0aGlzIGZ1bmN0aW9uLgorCQkJICovCisJCQlzY3NpX2RldmljZV9zZXRfc3RhdGUoc2RldiwgU0RFVl9PRkZMSU5FKTsKKwkJfSBlbHNlIHsKKwkJCVdBUk5fT04oMSk7CisJCQlzZGV2ID0gTlVMTDsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoYXAtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmFwLT5ob3N0LT5zY2FuX211dGV4KTsKKworCWlmIChzZGV2KSB7CisJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiZGV0YWNoaW5nIChTQ1NJICVzKVxuIiwKKwkJCSAgICAgICBzZGV2LT5zZGV2X2dlbmRldi5idXNfaWQpOworCisJCXNjc2lfcmVtb3ZlX2RldmljZShzZGV2KTsKKwkJc2NzaV9kZXZpY2VfcHV0KHNkZXYpOworCX0KK30KKworLyoqCisgKglhdGFfc2NzaV9ob3RwbHVnIC0gU0NTSSBwYXJ0IG9mIGhvdHBsdWcKKyAqCUBkYXRhOiBQb2ludGVyIHRvIEFUQSBwb3J0IHRvIHBlcmZvcm0gU0NTSSBob3RwbHVnIG9uCisgKgorICoJUGVyZm9ybSBTQ1NJIHBhcnQgb2YgaG90cGx1Zy4gIEl0J3MgZXhlY3V0ZWQgZnJvbSBhIHNlcGFyYXRlCisgKgl3b3JrcXVldWUgYWZ0ZXIgRUggY29tcGxldGVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBTQ1NJCisgKglob3QgcGx1Z2dpbmcgcmVxdWlyZXMgd29ya2luZyBFSCBhbmQgaG90IHVucGx1Z2dpbmcgaXMKKyAqCXN5bmNocm9uaXplZCB3aXRoIGhvdCBwbHVnZ2luZyB3aXRoIGEgbXV0ZXguCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqLwordm9pZCBhdGFfc2NzaV9ob3RwbHVnKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGRhdGE7CisJaW50IGk7CisKKwlpZiAoYXAtPmZsYWdzICYgQVRBX0ZMQUdfVU5MT0FESU5HKSB7CisJCURQUklOVEsoIkVOVEVSL0VYSVQgLSB1bmxvYWRpbmdcbiIpOworCQlyZXR1cm47CisJfQorCisJRFBSSU5USygiRU5URVJcbiIpOworCisJLyogdW5wbHVnIGRldGFjaGVkIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWlmICghKGRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfREVUQUNIRUQpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoYXAtPmxvY2ssIGZsYWdzKTsKKwkJZGV2LT5mbGFncyAmPSB+QVRBX0RGTEFHX0RFVEFDSEVEOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwkJYXRhX3Njc2lfcmVtb3ZlX2RldihkZXYpOworCX0KKworCS8qIHNjYW4gZm9yIG5ldyBvbmVzICovCisJYXRhX3Njc2lfc2Nhbl9ob3N0KGFwKTsKKworCS8qIElmIHdlIHNjYW5uZWQgd2hpbGUgRUggd2FzIGluIHByb2dyZXNzLCBzY2FuIHdvdWxkIGhhdmUKKwkgKiBmYWlsZWQgc2lsZW50bHkuICBSZXF1ZXVlIGlmIHRoZXJlIGFyZSBlbmFibGVkIGJ1dAorCSAqIHVuYXR0YWNoZWQgZGV2aWNlcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOworCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikgJiYgIWRldi0+c2RldikgeworCQkJcXVldWVfZGVsYXllZF93b3JrKGF0YV9hdXhfd3EsICZhcC0+aG90cGx1Z190YXNrLCBIWik7CisJCQlicmVhazsKKwkJfQorCX0KKworCURQUklOVEsoIkVYSVRcbiIpOworfQorCisvKioKKyAqCWF0YV9zY3NpX3VzZXJfc2NhbiAtIGluZGljYXRpb24gZm9yIHVzZXItaW5pdGlhdGVkIGJ1cyBzY2FuCisgKglAc2hvc3Q6IFNDU0kgaG9zdCB0byBzY2FuCisgKglAY2hhbm5lbDogQ2hhbm5lbCB0byBzY2FuCisgKglAaWQ6IElEIHRvIHNjYW4KKyAqCUBsdW46IExVTiB0byBzY2FuCisgKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdHMgYnVzCisgKglzY2FuLiAgU2V0IHByb2JlIHBlbmRpbmcgZmxhZyBhbmQgaW52b2tlIEVILgorICoKKyAqCUxPQ0tJTkc6CisgKglTQ1NJIGxheWVyICh3ZSBkb24ndCBjYXJlKQorICoKKyAqCVJFVFVSTlM6CisgKglaZXJvLgorICovCitzdGF0aWMgaW50IGF0YV9zY3NpX3VzZXJfc2NhbihzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCwgdW5zaWduZWQgaW50IGNoYW5uZWwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBsdW4pCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IGF0YV9zaG9zdF90b19wb3J0KHNob3N0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlpZiAoIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICgoY2hhbm5lbCAhPSBTQ0FOX1dJTERfQ0FSRCAmJiBjaGFubmVsICE9IDApIHx8CisJICAgIChsdW4gIT0gU0NBTl9XSUxEX0NBUkQgJiYgbHVuICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKGFwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWQgPT0gU0NBTl9XSUxEX0NBUkQpIHsKKwkJYXAtPmVoX2luZm8ucHJvYmVfbWFzayB8PSAoMSA8PCBBVEFfTUFYX0RFVklDRVMpIC0gMTsKKwkJYXAtPmVoX2luZm8uYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9IGF0YV9maW5kX2RldihhcCwgaWQpOworCisJCWlmIChkZXYpIHsKKwkJCWFwLT5laF9pbmZvLnByb2JlX21hc2sgfD0gMSA8PCBkZXYtPmRldm5vOworCQkJYXAtPmVoX2luZm8uYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJCX0gZWxzZQorCQkJcmMgPSAtRUlOVkFMOworCX0KKworCWlmIChyYyA9PSAwKQorCQlhdGFfcG9ydF9zY2hlZHVsZV9laChhcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGFwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICoJYXRhX3Njc2lfZGV2X3Jlc2NhbiAtIGluaXRpYXRlIHNjc2lfcmVzY2FuX2RldmljZSgpCisgKglAZGF0YTogUG9pbnRlciB0byBBVEEgcG9ydCB0byBwZXJmb3JtIHNjc2lfcmVzY2FuX2RldmljZSgpCisgKgorICoJQWZ0ZXIgQVRBIHBhc3MgdGhydSAoU0FUKSBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LAorICoJbGliYXRhIG5lZWQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2VzIHRvIFNDU0kgbGF5ZXIuICBUaGlzCisgKglmdW5jdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIGZyb20gYXRhX2F1eF93cSBzdWNoIHRoYXQgc2RldgorICoJYXR0YWNoL2RldGFjaCBkb24ndCByYWNlIHdpdGggcmVzY2FuLgorICoKKyAqCUxPQ0tJTkc6CisgKglLZXJuZWwgdGhyZWFkIGNvbnRleHQgKG1heSBzbGVlcCkuCisgKi8KK3ZvaWQgYXRhX3Njc2lfZGV2X3Jlc2Nhbih2b2lkICpkYXRhKQoreworCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkYXRhOworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXY7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKIAkJZGV2ID0gJmFwLT5kZXZpY2VbaV07CiAKLQkJaWYgKGF0YV9kZXZfcHJlc2VudChkZXYpKQotCQkJc2NzaV9zY2FuX3RhcmdldCgmYXAtPmhvc3QtPnNob3N0X2dlbmRldiwgMCwgaSwgMCwgMCk7CisJCWlmIChhdGFfZGV2X2VuYWJsZWQoZGV2KSAmJiBkZXYtPnNkZXYpCisJCQlzY3NpX3Jlc2Nhbl9kZXZpY2UoJihkZXYtPnNkZXYtPnNkZXZfZ2VuZGV2KSk7CiAJfQogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGliYXRhLmggYi9kcml2ZXJzL3Njc2kvbGliYXRhLmgKaW5kZXggYmFjOGNiYS4uYmRkNDg4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmF0YS5oCisrKyBiL2RyaXZlcnMvc2NzaS9saWJhdGEuaApAQCAtMjksMTAgKzI5LDkgQEAKICNkZWZpbmUgX19MSUJBVEFfSF9fCiAKICNkZWZpbmUgRFJWX05BTUUJImxpYmF0YSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMjAiCS8qIG11c3QgYmUgZXhhY3RseSBmb3VyIGNoYXJzICovCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjMwIgkvKiBtdXN0IGJlIGV4YWN0bHkgZm91ciBjaGFycyAqLwogCiBzdHJ1Y3QgYXRhX3Njc2lfYXJncyB7Ci0Jc3RydWN0IGF0YV9wb3J0CQkqYXA7CiAJc3RydWN0IGF0YV9kZXZpY2UJKmRldjsKIAl1MTYJCQkqaWQ7CiAJc3RydWN0IHNjc2lfY21uZAkqY21kOwpAQCAtNDAsMTggKzM5LDMyIEBACiB9OwogCiAvKiBsaWJhdGEtY29yZS5jICovCitleHRlcm4gc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmF0YV9hdXhfd3E7CiBleHRlcm4gaW50IGF0YXBpX2VuYWJsZWQ7CitleHRlcm4gaW50IGF0YXBpX2RtYWRpcjsKIGV4dGVybiBpbnQgbGliYXRhX2Z1YTsKLWV4dGVybiBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19uZXdfaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAotCQkJCSAgICAgIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3FjX25ld19pbml0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBhdGFfcndjbWRfcHJvdG9jb2woc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitleHRlcm4gdm9pZCBhdGFfZGV2X2Rpc2FibGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9mbHVzaF90YXNrKHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIHVuc2lnbmVkIGF0YV9leGVjX2ludGVybmFsKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZiwgY29uc3QgdTggKmNkYiwKKwkJCQkgIGludCBkbWFfZGlyLCB2b2lkICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4pOworZXh0ZXJuIGludCBhdGFfZGV2X3JlYWRfaWQoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50ICpwX2NsYXNzLAorCQkJICAgaW50IHBvc3RfcmVzZXQsIHUxNiAqaWQpOworZXh0ZXJuIGludCBhdGFfZGV2X2NvbmZpZ3VyZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcHJpbnRfaW5mbyk7CitleHRlcm4gaW50IHNhdGFfZG93bl9zcGRfbGltaXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IHNhdGFfc2V0X3NwZF9uZWVkZWQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IGF0YV9kb3duX3hmZXJtYXNrX2xpbWl0KHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsIGludCBmb3JjZV9waW8wKTsKK2V4dGVybiBpbnQgYXRhX3NldF9tb2RlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICoqcl9mYWlsZWRfZGV2KTsKIGV4dGVybiB2b2lkIGF0YV9xY19mcmVlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHZvaWQgYXRhX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOworZXh0ZXJuIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gaW50IGF0YV9jaGVja19hdGFwaV9kbWEoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBhdGFfZGV2X3NlbGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHdhaXQsIHVuc2lnbmVkIGludCBjYW5fc2xlZXApOwogZXh0ZXJuIHZvaWQgc3dhcF9idWZfbGUxNih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1Zl93b3Jkcyk7CitleHRlcm4gdm9pZCBhdGFfZGV2X2luaXQoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IGF0YV90YXNrX2lvY3RsKHN0cnVjdCBzY3NpX2RldmljZSAqc2NzaWRldiwgdm9pZCBfX3VzZXIgKmFyZyk7CiBleHRlcm4gaW50IGF0YV9jbWRfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpzY3NpZGV2LCB2b2lkIF9fdXNlciAqYXJnKTsKIApAQCAtNjAsNiArNzMsOCBAQAogZXh0ZXJuIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSBhdGFfc2NzaV90cmFuc3BvcnRfdGVtcGxhdGU7CiAKIGV4dGVybiB2b2lkIGF0YV9zY3NpX3NjYW5faG9zdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiBpbnQgYXRhX3Njc2lfb2ZmbGluZV9kZXYoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBhdGFfc2NzaV9ob3RwbHVnKHZvaWQgKmRhdGEpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfc2NzaW9wX2lucV9zdGQoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsIHU4ICpyYnVmLAogCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4pOwogCkBAIC04OCw1ICsxMDMsMTMgQEAKIGV4dGVybiB2b2lkIGF0YV9zY3NpX3JidWZfZmlsbChzdHJ1Y3QgYXRhX3Njc2lfYXJncyAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAoKmFjdG9yKSAoc3RydWN0IGF0YV9zY3NpX2FyZ3MgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKnJidWYsIHVuc2lnbmVkIGludCBidWZsZW4pKTsKK2V4dGVybiB2b2lkIGF0YV9zY2hlZHVsZV9zY3NpX2VoKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX2Rldl9yZXNjYW4odm9pZCAqZGF0YSk7CisKKy8qIGxpYmF0YS1laC5jICovCitleHRlcm4gZW51bSBzY3NpX2VoX3RpbWVyX3JldHVybiBhdGFfc2NzaV90aW1lZF9vdXQoc3RydWN0IHNjc2lfY21uZCAqY21kKTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX2Vycm9yKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworZXh0ZXJuIHZvaWQgYXRhX3BvcnRfd2FpdF9laChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiB2b2lkIGF0YV9xY19zY2hlZHVsZV9laChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAogI2VuZGlmIC8qIF9fTElCQVRBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hY19lc3AuYyBiL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKaW5kZXggZTMxZmFkZDYuLjExODIwNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tYWNfZXNwLmMKKysrIGIvZHJpdmVycy9zY3NpL21hY19lc3AuYwpAQCAtNDMsOSArNDMsNiBAQAogCiAvKiAjZGVmaW5lIERFQlVHX01BQ19FU1AgKi8KIAotI2RlZmluZSBtYWNfdHVybm9uX2lycSh4KQltYWNfZW5hYmxlX2lycSh4KQotI2RlZmluZSBtYWNfdHVybm9mZl9pcnEoeCkJbWFjX2Rpc2FibGVfaXJxKHgpCi0KIGV4dGVybiB2b2lkIGVzcF9oYW5kbGUoc3RydWN0IE5DUl9FU1AgKmVzcCk7CiBleHRlcm4gdm9pZCBtYWNfZXNwX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcHJlZ3MpOwogCkBAIC02MzksMTMgKzYzNiwxMyBAQAogCiBzdGF0aWMgdm9pZCBkbWFfaW50c19vZmYoc3RydWN0IE5DUl9FU1AgKiBlc3ApCiB7Ci0JbWFjX3R1cm5vZmZfaXJxKGVzcC0+aXJxKTsKKwlkaXNhYmxlX2lycShlc3AtPmlycSk7CiB9CiAKIAogc3RhdGljIHZvaWQgZG1hX2ludHNfb24oc3RydWN0IE5DUl9FU1AgKiBlc3ApCiB7Ci0JbWFjX3R1cm5vbl9pcnEoZXNwLT5pcnEpOworCWVuYWJsZV9pcnEoZXNwLT5pcnEpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21hY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuYwppbmRleCA3NzdmOWJjLi5hOTQyYTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbWFjX3Njc2kuYwpAQCAtNjUsOSArNjUsNiBAQAogI2RlZmluZSBSRVNFVF9CT09UCiAjZGVmaW5lIERSSVZFUl9TRVRVUAogCi0jZGVmaW5lCUVOQUJMRV9JUlEoKQltYWNfZW5hYmxlX2lycSggSVJRX01BQ19TQ1NJICk7IAotI2RlZmluZQlESVNBQkxFX0lSUSgpCW1hY19kaXNhYmxlX2lycSggSVJRX01BQ19TQ1NJICk7Ci0KIGV4dGVybiB2b2lkIHZpYV9zY3NpX2NsZWFyKHZvaWQpOwogCiAjaWZkZWYgUkVTRVRfQk9PVApAQCAtMzUxLDcgKzM0OCw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiTWFjaW50b3NoIFNDU0k6IHJlc2V0dGluZyB0aGUgU0NTSSBidXMuLi4iICk7CiAKIAkvKiBzd2l0Y2ggb2ZmIFNDU0kgSVJRIC0gY2F0Y2ggYW4gaW50ZXJydXB0IHdpdGhvdXQgSVJRIGJpdCBzZXQgZWxzZSAqLwotCW1hY19kaXNhYmxlX2lycShJUlFfTUFDX1NDU0kpOworCWRpc2FibGVfaXJxKElSUV9NQUNfU0NTSSk7CiAKIAkvKiBnZXQgaW4gcGhhc2UgKi8KIAlOQ1I1MzgwX3dyaXRlKCBUQVJHRVRfQ09NTUFORF9SRUcsCkBAIC0zNjksNyArMzY2LDcgQEAKIAkJYmFycmllcigpOwogCiAJLyogc3dpdGNoIG9uIFNDU0kgSVJRIGFnYWluICovCi0JbWFjX2VuYWJsZV9pcnEoSVJRX01BQ19TQ1NJKTsKKwllbmFibGVfaXJxKElSUV9NQUNfU0NTSSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICIgZG9uZVxuIiApOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwppbmRleCBjMzM4NTdlLi41ZDJjZWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQuYwpAQCAtMTgyOCw3ICsxODI4LDcgQEAKIAogCXNjYi0+ZG1hX3R5cGUgPSBNRUdBX1NHTElTVDsKIAotCWlmKCBzZ2NudCA+IGFkYXB0ZXItPnNnbGVuICkgQlVHKCk7CisJQlVHX09OKHNnY250ID4gYWRhcHRlci0+c2dsZW4pOwogCiAJKmxlbiA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfbWJveC5jCmluZGV4IGJlYzE0MjQuLmI3Y2FmNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9tYm94LmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX21ib3guYwpAQCAtNzE0LDcgKzcxNCw3IEBACiAgKiAuIEFsbG9jYXRlIG1lbW9yeSByZXF1aXJlZCBmb3IgYWxsIHRoZSBjb21tYW5kcwogICogLiBVc2UgaW50ZXJuYWwgbGlicmFyeSBvZiBGVyByb3V0aW5lcywgYnVpbGQgdXAgY29tcGxldGUgc29mdCBzdGF0ZQogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIG1lZ2FyYWlkX2luaXRfbWJveChhZGFwdGVyX3QgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IHBjaV9kZXYJCSpwZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL29zc3QuYyBiL2RyaXZlcnMvc2NzaS9vc3N0LmMKaW5kZXggY2UwYmEzYS4uNGEyZmVkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL29zc3QuYworKysgYi9kcml2ZXJzL3Njc2kvb3NzdC5jCkBAIC00NzI0LDcgKzQ3MjQsNyBAQAogCiAKIC8qIEZsdXNoIHRoZSB0YXBlIGJ1ZmZlciBiZWZvcmUgY2xvc2UgKi8KLXN0YXRpYyBpbnQgb3Nfc2NzaV90YXBlX2ZsdXNoKHN0cnVjdCBmaWxlICogZmlscCkKK3N0YXRpYyBpbnQgb3Nfc2NzaV90YXBlX2ZsdXNoKHN0cnVjdCBmaWxlICogZmlscCwgZmxfb3duZXJfdCBpZCkKIHsKIAlpbnQJCSAgICAgIHJlc3VsdCA9IDAsIHJlc3VsdDI7CiAJc3RydWN0IG9zc3RfdGFwZSAgICAqIFNUcCAgICA9IGZpbHAtPnByaXZhdGVfZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wZGNfYWRtYS5jIGIvZHJpdmVycy9zY3NpL3BkY19hZG1hLmMKaW5kZXggNWNkYTE2Yy4uN2ViZThlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3BkY19hZG1hLmMKKysrIGIvZHJpdmVycy9zY3NpL3BkY19hZG1hLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkicGRjX2FkbWEiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjAzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4wNCIKIAogLyogbWFjcm8gdG8gY2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgQVRBIHJlZ3MgKi8KICNkZWZpbmUgQURNQV9BVEFfUkVHUyhiYXNlLHBvcnRfbm8pCSgoYmFzZSkgKyAoKHBvcnRfbm8pICogMHg0MCkpCkBAIC0xNTIsNiArMTUyLDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQURNQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTE2Nyw2ICsxNjgsNyBAQAogCS5xY19wcmVwCQk9IGFkbWFfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYWRtYV9xY19pc3N1ZSwKIAkuZW5nX3RpbWVvdXQJCT0gYWRtYV9lbmdfdGltZW91dCwKKwkuZGF0YV94ZmVyCQk9IGF0YV9tbWlvX2RhdGFfeGZlciwKIAkuaXJxX2hhbmRsZXIJCT0gYWRtYV9pbnRyLAogCS5pcnFfY2xlYXIJCT0gYWRtYV9pcnFfY2xlYXIsCiAJLnBvcnRfc3RhcnQJCT0gYWRtYV9wb3J0X3N0YXJ0LApAQCAtNDU1LDEzICs0NTcsMTMgQEAKIAkJCWNvbnRpbnVlOwogCQloYW5kbGVkID0gMTsKIAkJYWRtYV9lbnRlcl9yZWdfbW9kZShhcCk7Ci0JCWlmIChhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCB8IEFUQV9GTEFHX05PSU5UUikpCisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkKIAkJCWNvbnRpbnVlOwogCQlwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJCWlmICghcHAgfHwgcHAtPnN0YXRlICE9IGFkbWFfc3RhdGVfcGt0KQogCQkJY29udGludWU7CiAJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkgeworCQlpZiAocWMgJiYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkgewogCQkJaWYgKChzdGF0dXMgJiAoYVBFUlIgfCBhUFNEIHwgYVVJUlEpKSkKIAkJCQlxYy0+ZXJyX21hc2sgfD0gQUNfRVJSX09USEVSOwogCQkJZWxzZSBpZiAocHAtPnBrdFswXSAhPSBjRE9ORSkKQEAgLTQ4MCwxMyArNDgyLDEzIEBACiAJZm9yIChwb3J0X25vID0gMDsgcG9ydF9ubyA8IGhvc3Rfc2V0LT5uX3BvcnRzOyArK3BvcnRfbm8pIHsKIAkJc3RydWN0IGF0YV9wb3J0ICphcDsKIAkJYXAgPSBob3N0X3NldC0+cG9ydHNbcG9ydF9ub107Ci0JCWlmIChhcCAmJiAoIShhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCB8IEFUQV9GTEFHX05PSU5UUikpKSkgeworCQlpZiAoYXAgJiYgKCEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKSkgewogCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAkJCXN0cnVjdCBhZG1hX3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwogCQkJaWYgKCFwcCB8fCBwcC0+c3RhdGUgIT0gYWRtYV9zdGF0ZV9tbWlvKQogCQkJCWNvbnRpbnVlOwogCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKLQkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkgeworCQkJaWYgKHFjICYmICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpIHsKIAogCQkJCS8qIGNoZWNrIG1haW4gc3RhdHVzLCBjbGVhcmluZyBJTlRSUSAqLwogCQkJCXU4IHN0YXR1cyA9IGF0YV9jaGVja19zdGF0dXMoYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYyBiL2RyaXZlcnMvc2NzaS9xbGExMjgwLmMKaW5kZXggNzdiYjIzNS4uNjgwZjYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTEyODAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMTI4MC5jCkBAIC0zOTcsMzAgKzM5Nyw2IEBACiAjaW5jbHVkZSAicWwxMjgwX2Z3LmgiCiAjaW5jbHVkZSAicWwxMDQwX2Z3LmgiCiAKLQotLyoKLSAqIE1pc3NpbmcgUENJIElEJ3MKLSAqLwotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDgwCi0jZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwODAJMHgxMDgwCi0jZW5kaWYKLSNpZm5kZWYgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTI0MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjQwCTB4MTI0MAotI2VuZGlmCi0jaWZuZGVmIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyODAKLSNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTI4MAkweDEyODAKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDE2MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMDE2MAkweDEwMTYKLSNlbmRpZgotI2lmbmRlZiBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjE2MAotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjE2MAkweDEyMTYKLSNlbmRpZgotCi0jaWZuZGVmIFBDSV9WRU5ET1JfSURfQU1JCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfQU1JICAgICAgICAgICAgICAgMHgxMDFlCi0jZW5kaWYKLQogI2lmbmRlZiBCSVRTX1BFUl9MT05HCiAjZXJyb3IgIkJJVFNfUEVSX0xPTkcgbm90IGRlZmluZWQhIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMgYi9kcml2ZXJzL3Njc2kvcWxvZ2ljcHRpLmMKaW5kZXggMjIwMzEwMy4uMzI5ZWFkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Fsb2dpY3B0aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbG9naWNwdGkuYwpAQCAtMSw2ICsxLDYgQEAKIC8qIHFsb2dpY3B0aS5jOiBQZXJmb3JtYW5jZSBUZWNobm9sb2dpZXMgUWxvZ2ljSVNQIHNidXMgY2FyZCBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTk2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcGZzLnJ1dGdlcnMuZWR1KQorICogQ29weXJpZ2h0IChDKSAxOTk2LCAyMDA2IERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AZGF2ZW1sb2Z0Lm5ldCkKICAqCiAgKiBBIGxvdCBvZiB0aGlzIGRyaXZlciB3YXMgZGlyZWN0bHkgc3RvbGVuIGZyb20gRXJpayBILiBNb2UncyBQQ0kKICAqIFFsb2dpYyBJU1AgZHJpdmVyLiAgTXVjaG8ga3Vkb3MgdG8gaGltIGZvciB0aGlzIGNvZGUuCkBAIC00Niw4ICs0Niw2IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX3RjcS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CiAKLQotCiAjZGVmaW5lIE1BWF9UQVJHRVRTCTE2CiAjZGVmaW5lIE1BWF9MVU5TCTgJLyogMzIgZm9yIDEuMzEgRi9XICovCiAKQEAgLTU3LDcgKzU1LDYgQEAKIAogc3RhdGljIHN0cnVjdCBxbG9naWNwdGkgKnFwdGljaGFpbiA9IE5VTEw7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHFwdGljaGFpbl9sb2NrKTsKLXN0YXRpYyBpbnQgcXB0aXNfcnVubmluZyA9IDA7CiAKICNkZWZpbmUgUEFDS0IoYSwgYikJCQkoKChhKTw8NCl8KGIpKQogCkBAIC04MTUsMTczICs4MTIsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBEZXRlY3QgYWxsIFBUSSBRbG9naWMgSVNQJ3MgaW4gdGhlIG1hY2hpbmUuICovCi1zdGF0aWMgaW50IF9faW5pdCBxbG9naWNwdGlfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCi17Ci0Jc3RydWN0IHFsb2dpY3B0aSAqcXB0aTsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpxcHRpX2hvc3Q7Ci0Jc3RydWN0IHNidXNfYnVzICpzYnVzOwotCXN0cnVjdCBzYnVzX2RldiAqc2RldjsKLQlpbnQgbnFwdGlzID0gMCwgbnFwdGlzX2luX3VzZSA9IDA7Ci0KLQl0cG50LT5wcm9jX25hbWUgPSAicWxvZ2ljcHRpIjsKLQlmb3JfZWFjaF9zYnVzKHNidXMpIHsKLQkJZm9yX2VhY2hfc2J1c2RldihzZGV2LCBzYnVzKSB7Ci0JCQkvKiBJcyB0aGlzIGEgcmVkIHNuYXBwZXI/ICovCi0JCQlpZiAoc3RyY21wKHNkZXYtPnByb21fbmFtZSwgInB0aXNwIikgJiYKLQkJCSAgICBzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiUFRJLHB0aXNwIikgJiYKLQkJCSAgICBzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKSAmJgotCQkJICAgIHN0cmNtcChzZGV2LT5wcm9tX25hbWUsICJTVU5XLGlzcCIpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKiBTb21ldGltZXMgQW50YXJlcyBjYXJkcyBjb21lIHVwIG5vdCBjb21wbGV0ZWx5Ci0JCQkgKiBzZXR1cCwgYW5kIHdlIGdldCBhIHJlcG9ydCBvZiBhIHplcm8gSVJRLgotCQkJICogU2tpcCBvdmVyIHRoZW0gaW4gc3VjaCBjYXNlcyBzbyB3ZSBzdXJ2aXZlLgotCQkJICovCi0JCQlpZiAoc2Rldi0+aXJxc1swXSA9PSAwKSB7Ci0JCQkJcHJpbnRrKCJxcHRpJWQ6IEFkYXB0ZXIgcmVwb3J0cyBubyBpbnRlcnJ1cHQsICIKLQkJCQkgICAgICAgInNraXBwaW5nIG92ZXIgdGhpcyBjYXJkLiIsIG5xcHRpcyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFllcCwgcmVnaXN0ZXIgYW5kIGFsbG9jYXRlIHNvZnR3YXJlIHN0YXRlLiAqLwotCQkJcXB0aV9ob3N0ID0gc2NzaV9yZWdpc3Rlcih0cG50LCBzaXplb2Yoc3RydWN0IHFsb2dpY3B0aSkpOwotCQkJaWYgKCFxcHRpX2hvc3QpIHsKLQkJCQlwcmludGsoIlFQVEk6IENhbm5vdCByZWdpc3RlciBQVEkgUWxvZ2ljIElTUCBTQ1NJIGhvc3QiKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBxcHRpX2hvc3QtPmhvc3RkYXRhOwotCi0JCQkvKiBXZSBhcmUgd2lkZSBjYXBhYmxlLCAxNiB0YXJnZXRzLiAqLwotCQkJcXB0aV9ob3N0LT5tYXhfaWQgPSBNQVhfVEFSR0VUUzsKLQotCQkJLyogU2V0dXAgYmFjayBwb2ludGVycyBhbmQgbWlzYy4gc3RhdGUuICovCi0JCQlxcHRpLT5xaG9zdCA9IHFwdGlfaG9zdDsKLQkJCXFwdGktPnNkZXYgPSBzZGV2OwotCQkJcXB0aS0+cXB0aV9pZCA9IG5xcHRpcysrOwotCQkJcXB0aS0+cHJvbV9ub2RlID0gc2Rldi0+cHJvbV9ub2RlOwotCQkJcHJvbV9nZXRzdHJpbmcocXB0aS0+cHJvbV9ub2RlLCAibmFtZSIsCi0JCQkJICAgICAgIHFwdGktPnByb21fbmFtZSwKLQkJCQkgICAgICAgc2l6ZW9mKHFwdGktPnByb21fbmFtZSkpOwotCi0JCQkvKiBUaGlzIGlzIG5vdCBjb3JyZWN0LCBhY3R1YWxseS4gVGhlcmUncyBhIHN3aXRjaAotCQkJICogb24gdGhlIFBUSSBjYXJkcyB0aGF0IHB1dCB0aGVtIGludG8gImVtdWxhdGlvbiIKLQkJCSAqIG1vZGUtIGkuZS4sIHJlcG9ydCB0aGVtc2VsdmVzIGFzIFFMR0MsaXNwCi0JCQkgKiBpbnN0ZWFkIG9mIFBUSSxwdGlzcC4gVGhlIG9ubHkgcmVhbCBzdWJzdGFudGl2ZQotCQkJICogZGlmZmVyZW5jZSBiZXR3ZWVuIG5vbi1wdGkgYW5kIHB0aSBjYXJkcyBpcwotCQkJICogdGhlIHRtb24gcmVnaXN0ZXIuIFdoaWNoIGlzIHBvc3NpYmx5IGV2ZW4KLQkJCSAqIHRoZXJlIGZvciBRbG9naWMgY2FyZHMsIGJ1dCBub24tZnVuY3Rpb25hbC4KLQkJCSAqLwotCQkJcXB0aS0+aXNfcHRpID0gKHN0cmNtcCAocXB0aS0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKSAhPSAwKTsKLQotCQkJcXB0aV9jaGFpbl9hZGQocXB0aSk7Ci0JCQlpZiAocXB0aV9tYXBfcmVncyhxcHRpKSA8IDApCi0JCQkJZ290byBmYWlsX3VubGluazsKLQotCQkJaWYgKHFwdGlfcmVnaXN0ZXJfaXJxKHFwdGkpIDwgMCkKLQkJCQlnb3RvIGZhaWxfdW5tYXBfcmVnczsKLQotCQkJcXB0aV9nZXRfc2NzaV9pZChxcHRpKTsKLQkJCXFwdGlfZ2V0X2J1cnN0cyhxcHRpKTsKLQkJCXFwdGlfZ2V0X2Nsb2NrKHFwdGkpOwotCi0JCQkvKiBDbGVhciBvdXQgc2NzaV9jbW5kIGFycmF5LiAqLwotCQkJbWVtc2V0KHFwdGktPmNtZF9zbG90cywgMCwgc2l6ZW9mKHFwdGktPmNtZF9zbG90cykpOwotCi0JCQlpZiAocXB0aV9tYXBfcXVldWVzKHFwdGkpIDwgMCkKLQkJCQlnb3RvIGZhaWxfZnJlZV9pcnE7Ci0KLQkJCS8qIExvYWQgdGhlIGZpcm13YXJlLiAqLwotCQkJaWYgKHFsb2dpY3B0aV9sb2FkX2Zpcm13YXJlKHFwdGkpKQotCQkJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7Ci0JCQlpZiAocXB0aS0+aXNfcHRpKSB7Ci0JCQkJLyogQ2hlY2sgdGhlIFBUSSBzdGF0dXMgcmVnLiAqLwotCQkJCWlmIChxbG9naWNwdGlfdmVyaWZ5X3Rtb24ocXB0aSkpCi0JCQkJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7Ci0JCQl9Ci0KLQkJCS8qIFJlc2V0IHRoZSBJU1AgYW5kIGluaXQgcmVzL3JlcSBxdWV1ZXMuICovCi0JCQlpZiAocWxvZ2ljcHRpX3Jlc2V0X2hhcmR3YXJlKHFwdGlfaG9zdCkpCi0JCQkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKLQotCQkJcHJpbnRrKCIoRmlybXdhcmUgdiVkLiVkLiVkKSIsIHFwdGktPmZ3YXJlX21hanJldiwKLQkJCSAgICBxcHRpLT5md2FyZV9taW5yZXYsIHFwdGktPmZ3YXJlX21pY3Jldik7Ci0JCQl7Ci0JCQkJY2hhciBidWZmZXJbNjBdOwotCQkJCQotCQkJCXByb21fZ2V0c3RyaW5nIChxcHRpLT5wcm9tX25vZGUsCi0JCQkJCQkiaXNwLWZjb2RlIiwgYnVmZmVyLCA2MCk7Ci0JCQkJaWYgKGJ1ZmZlclswXSkKLQkJCQkJcHJpbnRrKCIoRmlybXdhcmUgJXMpIiwgYnVmZmVyKTsKLQkJCQlpZiAocHJvbV9nZXRib29sKHFwdGktPnByb21fbm9kZSwgImRpZmZlcmVudGlhbCIpKQotCQkJCQlxcHRpLT5kaWZmZXJlbnRpYWwgPSAxOwotCQkJfQotCQkJCi0JCQlwcmludGsgKCIgWyVzIFdpZGUsIHVzaW5nICVzIGludGVyZmFjZV1cbiIsCi0JCQkgICAgICAgKHFwdGktPnVsdHJhID8gIlVsdHJhIiA6ICJGYXN0IiksCi0JCQkgICAgICAgKHFwdGktPmRpZmZlcmVudGlhbCA/ICJkaWZmZXJlbnRpYWwiIDogInNpbmdsZSBlbmRlZCIpKTsKLQotCQkJbnFwdGlzX2luX3VzZSsrOwotCQkJY29udGludWU7Ci0KLQkJZmFpbF91bm1hcF9xdWV1ZXM6Ci0jZGVmaW5lIFFTSVpFKGVudHJpZXMpCSgoKGVudHJpZXMpICsgMSkgKiBRVUVVRV9FTlRSWV9MRU4pCi0JCQlzYnVzX2ZyZWVfY29uc2lzdGVudChxcHRpLT5zZGV2LAotCQkJCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAotCQkJCQkgICAgIHFwdGktPnJlc19jcHUsIHFwdGktPnJlc19kdm1hKTsKLQkJCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCi0JCQkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAotCQkJCQkgICAgIHFwdGktPnJlcV9jcHUsIHFwdGktPnJlcV9kdm1hKTsKLSN1bmRlZiBRU0laRQotCQlmYWlsX2ZyZWVfaXJxOgotCQkJZnJlZV9pcnEocXB0aS0+aXJxLCBxcHRpKTsKLQotCQlmYWlsX3VubWFwX3JlZ3M6Ci0JCQlzYnVzX2lvdW5tYXAocXB0aS0+cXJlZ3MsCi0JCQkJICAgICBxcHRpLT5zZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemUpOwotCQkJaWYgKHFwdGktPmlzX3B0aSkKLQkJCQlzYnVzX2lvdW5tYXAocXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKLQkJZmFpbF91bmxpbms6Ci0JCQlxcHRpX2NoYWluX2RlbChxcHRpKTsKLQkJCXNjc2lfdW5yZWdpc3RlcihxcHRpLT5xaG9zdCk7Ci0JCX0KLQl9Ci0JaWYgKG5xcHRpcykKLQkJcHJpbnRrKCJRUFRJOiBUb3RhbCBvZiAlZCBQVEkgUWxvZ2ljL0lTUCBob3N0cyBmb3VuZCwgJWQgYWN0dWFsbHkgaW4gdXNlLlxuIiwKLQkJICAgICAgIG5xcHRpcywgbnFwdGlzX2luX3VzZSk7Ci0JcXB0aXNfcnVubmluZyA9IG5xcHRpc19pbl91c2U7Ci0JcmV0dXJuIG5xcHRpczsKLX0KLQotc3RhdGljIGludCBxbG9naWNwdGlfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQotewotCXN0cnVjdCBxbG9naWNwdGkgKnFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKLQotCS8qIFJlbW92ZSB2aXNpYmlsaXR5IGZyb20gSVJRIGhhbmRsZXJzLiAqLwotCXFwdGlfY2hhaW5fZGVsKHFwdGkpOwotCi0JLyogU2h1dCB1cCB0aGUgY2FyZC4gKi8KLQlzYnVzX3dyaXRldygwLCBxcHRpLT5xcmVncyArIFNCVVNfQ1RSTCk7Ci0KLQkvKiBGcmVlIElSUSBoYW5kbGVyIGFuZCB1bm1hcCBRbG9naWMsSVNQIGFuZCBQVEkgc3RhdHVzIHJlZ3MuICovCi0JZnJlZV9pcnEocXB0aS0+aXJxLCBxcHRpKTsKLQotI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQotCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCi0JCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7Ci0Jc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKLQkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAotCQkJICAgICBxcHRpLT5yZXFfY3B1LCBxcHRpLT5yZXFfZHZtYSk7Ci0jdW5kZWYgUVNJWkUKLQotCXNidXNfaW91bm1hcChxcHRpLT5xcmVncywgcXB0aS0+c2Rldi0+cmVnX2FkZHJzWzBdLnJlZ19zaXplKTsKLQlpZiAocXB0aS0+aXNfcHRpKQotCQlzYnVzX2lvdW5tYXAocXB0aS0+c3JlZywgc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsKLQotCXJldHVybiAwOwotfQotCiBjb25zdCBjaGFyICpxbG9naWNwdGlfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KQogewogCXN0YXRpYyBjaGFyIGJ1Zls4MF07CkBAIC0xNTUxLDkgKzEzODEsOSBAQAogCXJldHVybiByZXR1cm5fc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBkcml2ZXJfdGVtcGxhdGUgPSB7Ci0JLmRldGVjdAkJCT0gcWxvZ2ljcHRpX2RldGVjdCwKLQkucmVsZWFzZQkJPSBxbG9naWNwdGlfcmVsZWFzZSwKK3N0YXRpYyBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHFwdGlfdGVtcGxhdGUgPSB7CisJLm1vZHVsZQkJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCQk9ICJxbG9naWNwdGkiLAogCS5pbmZvCQkJPSBxbG9naWNwdGlfaW5mbywKIAkucXVldWVjb21tYW5kCQk9IHFsb2dpY3B0aV9xdWV1ZWNvbW1hbmRfc2xvdywKIAkuZWhfYWJvcnRfaGFuZGxlcgk9IHFsb2dpY3B0aV9hYm9ydCwKQEAgLTE1NjUsOCArMTM5NSwxODkgQEAKIAkudXNlX2NsdXN0ZXJpbmcJCT0gRU5BQkxFX0NMVVNURVJJTkcsCiB9OwogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBxcHRpX3NidXNfcHJvYmUoc3RydWN0IG9mX2RldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdGF0aWMgaW50IG5xcHRpczsKKwlzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYgPSB0b19zYnVzX2RldmljZSgmZGV2LT5kZXYpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHAgPSBkZXYtPm5vZGU7CisJc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqdHBudCA9IG1hdGNoLT5kYXRhOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aTsKKwljaGFyICpmY29kZTsKIAotI2luY2x1ZGUgInNjc2lfbW9kdWxlLmMiCisJLyogU29tZXRpbWVzIEFudGFyZXMgY2FyZHMgY29tZSB1cCBub3QgY29tcGxldGVseQorCSAqIHNldHVwLCBhbmQgd2UgZ2V0IGEgcmVwb3J0IG9mIGEgemVybyBJUlEuCisJICovCisJaWYgKHNkZXYtPmlycXNbMF0gPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKKwlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKHRwbnQsIHNpemVvZihzdHJ1Y3QgcWxvZ2ljcHRpKSk7CisJaWYgKCFob3N0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXFwdGkgPSAoc3RydWN0IHFsb2dpY3B0aSAqKSBob3N0LT5ob3N0ZGF0YTsKKworCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTOworCXFwdGktPnFob3N0ID0gaG9zdDsKKwlxcHRpLT5zZGV2ID0gc2RldjsKKwlxcHRpLT5xcHRpX2lkID0gbnFwdGlzOworCXFwdGktPnByb21fbm9kZSA9IHNkZXYtPnByb21fbm9kZTsKKwlzdHJjcHkocXB0aS0+cHJvbV9uYW1lLCBzZGV2LT5vZmRldi5ub2RlLT5uYW1lKTsKKwlxcHRpLT5pc19wdGkgPSBzdHJjbXAocXB0aS0+cHJvbV9uYW1lLCAiUUxHQyxpc3AiKTsKKworCWlmIChxcHRpX21hcF9yZWdzKHFwdGkpIDwgMCkKKwkJZ290byBmYWlsX3VubGluazsKKworCWlmIChxcHRpX3JlZ2lzdGVyX2lycShxcHRpKSA8IDApCisJCWdvdG8gZmFpbF91bm1hcF9yZWdzOworCisJcXB0aV9nZXRfc2NzaV9pZChxcHRpKTsKKwlxcHRpX2dldF9idXJzdHMocXB0aSk7CisJcXB0aV9nZXRfY2xvY2socXB0aSk7CisKKwkvKiBDbGVhciBvdXQgc2NzaV9jbW5kIGFycmF5LiAqLworCW1lbXNldChxcHRpLT5jbWRfc2xvdHMsIDAsIHNpemVvZihxcHRpLT5jbWRfc2xvdHMpKTsKKworCWlmIChxcHRpX21hcF9xdWV1ZXMocXB0aSkgPCAwKQorCQlnb3RvIGZhaWxfZnJlZV9pcnE7CisKKwkvKiBMb2FkIHRoZSBmaXJtd2FyZS4gKi8KKwlpZiAocWxvZ2ljcHRpX2xvYWRfZmlybXdhcmUocXB0aSkpCisJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7CisJaWYgKHFwdGktPmlzX3B0aSkgeworCQkvKiBDaGVjayB0aGUgUFRJIHN0YXR1cyByZWcuICovCisJCWlmIChxbG9naWNwdGlfdmVyaWZ5X3Rtb24ocXB0aSkpCisJCQlnb3RvIGZhaWxfdW5tYXBfcXVldWVzOworCX0KKworCS8qIFJlc2V0IHRoZSBJU1AgYW5kIGluaXQgcmVzL3JlcSBxdWV1ZXMuICovCisJaWYgKHFsb2dpY3B0aV9yZXNldF9oYXJkd2FyZShob3N0KSkKKwkJZ290byBmYWlsX3VubWFwX3F1ZXVlczsKKworCWlmIChzY3NpX2FkZF9ob3N0KGhvc3QsICZkZXYtPmRldikpCisJCWdvdG8gZmFpbF91bm1hcF9xdWV1ZXM7CisKKwlwcmludGsoIihGaXJtd2FyZSB2JWQuJWQuJWQpIiwgcXB0aS0+ZndhcmVfbWFqcmV2LAorCSAgICAgICBxcHRpLT5md2FyZV9taW5yZXYsIHFwdGktPmZ3YXJlX21pY3Jldik7CisKKwlmY29kZSA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImlzcC1mY29kZSIsIE5VTEwpOworCWlmIChmY29kZSAmJiBmY29kZVswXSkKKwkJcHJpbnRrKCIoRmlybXdhcmUgJXMpIiwgZmNvZGUpOworCWlmIChvZl9maW5kX3Byb3BlcnR5KGRwLCAiZGlmZmVyZW50aWFsIiwgTlVMTCkgIT0gTlVMTCkKKwkJcXB0aS0+ZGlmZmVyZW50aWFsID0gMTsKKwkJCQorCXByaW50ayAoIiBbJXMgV2lkZSwgdXNpbmcgJXMgaW50ZXJmYWNlXVxuIiwKKwkJKHFwdGktPnVsdHJhID8gIlVsdHJhIiA6ICJGYXN0IiksCisJCShxcHRpLT5kaWZmZXJlbnRpYWwgPyAiZGlmZmVyZW50aWFsIiA6ICJzaW5nbGUgZW5kZWQiKSk7CisKKwlkZXZfc2V0X2RydmRhdGEoJnNkZXYtPm9mZGV2LmRldiwgcXB0aSk7CisKKwlxcHRpX2NoYWluX2FkZChxcHRpKTsKKworCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCW5xcHRpcysrOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdW5tYXBfcXVldWVzOgorI2RlZmluZSBRU0laRShlbnRyaWVzKQkoKChlbnRyaWVzKSArIDEpICogUVVFVUVfRU5UUllfTEVOKQorCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCisJCQkgICAgIFFTSVpFKFJFU19RVUVVRV9MRU4pLAorCQkJICAgICBxcHRpLT5yZXNfY3B1LCBxcHRpLT5yZXNfZHZtYSk7CisJc2J1c19mcmVlX2NvbnNpc3RlbnQocXB0aS0+c2RldiwKKwkJCSAgICAgUVNJWkUoUUxPR0lDUFRJX1JFUV9RVUVVRV9MRU4pLAorCQkJICAgICBxcHRpLT5yZXFfY3B1LCBxcHRpLT5yZXFfZHZtYSk7CisjdW5kZWYgUVNJWkUKKworZmFpbF91bm1hcF9yZWdzOgorCXNidXNfaW91bm1hcChxcHRpLT5xcmVncywKKwkJICAgICBxcHRpLT5zZGV2LT5yZWdfYWRkcnNbMF0ucmVnX3NpemUpOworCWlmIChxcHRpLT5pc19wdGkpCisJCXNidXNfaW91bm1hcChxcHRpLT5zcmVnLCBzaXplb2YodW5zaWduZWQgY2hhcikpOworCitmYWlsX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHFwdGktPmlycSwgcXB0aSk7CisKK2ZhaWxfdW5saW5rOgorCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgcXB0aV9zYnVzX3JlbW92ZShzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHFsb2dpY3B0aSAqcXB0aSA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJcXB0aV9jaGFpbl9kZWwocXB0aSk7CisKKwlzY3NpX3JlbW92ZV9ob3N0KHFwdGktPnFob3N0KTsKKworCS8qIFNodXQgdXAgdGhlIGNhcmQuICovCisJc2J1c193cml0ZXcoMCwgcXB0aS0+cXJlZ3MgKyBTQlVTX0NUUkwpOworCisJLyogRnJlZSBJUlEgaGFuZGxlciBhbmQgdW5tYXAgUWxvZ2ljLElTUCBhbmQgUFRJIHN0YXR1cyByZWdzLiAqLworCWZyZWVfaXJxKHFwdGktPmlycSwgcXB0aSk7CisKKyNkZWZpbmUgUVNJWkUoZW50cmllcykJKCgoZW50cmllcykgKyAxKSAqIFFVRVVFX0VOVFJZX0xFTikKKwlzYnVzX2ZyZWVfY29uc2lzdGVudChxcHRpLT5zZGV2LAorCQkJICAgICBRU0laRShSRVNfUVVFVUVfTEVOKSwKKwkJCSAgICAgcXB0aS0+cmVzX2NwdSwgcXB0aS0+cmVzX2R2bWEpOworCXNidXNfZnJlZV9jb25zaXN0ZW50KHFwdGktPnNkZXYsCisJCQkgICAgIFFTSVpFKFFMT0dJQ1BUSV9SRVFfUVVFVUVfTEVOKSwKKwkJCSAgICAgcXB0aS0+cmVxX2NwdSwgcXB0aS0+cmVxX2R2bWEpOworI3VuZGVmIFFTSVpFCisKKwlzYnVzX2lvdW5tYXAocXB0aS0+cXJlZ3MsIHFwdGktPnNkZXYtPnJlZ19hZGRyc1swXS5yZWdfc2l6ZSk7CisJaWYgKHFwdGktPmlzX3B0aSkKKwkJc2J1c19pb3VubWFwKHFwdGktPnNyZWcsIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7CisKKwlzY3NpX2hvc3RfcHV0KHFwdGktPnFob3N0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBxcHRpX21hdGNoW10gPSB7CisJeworCQkubmFtZSA9ICJwdGlzcCIsCisJCS5kYXRhID0gJnFwdGlfdGVtcGxhdGUsCisJfSwKKwl7CisJCS5uYW1lID0gIlBUSSxwdGlzcCIsCisJCS5kYXRhID0gJnFwdGlfdGVtcGxhdGUsCisJfSwKKwl7CisJCS5uYW1lID0gIlFMR0MsaXNwIiwKKwkJLmRhdGEgPSAmcXB0aV90ZW1wbGF0ZSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiU1VOVyxpc3AiLAorCQkuZGF0YSA9ICZxcHRpX3RlbXBsYXRlLAorCX0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcXB0aV9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyIHFwdGlfc2J1c19kcml2ZXIgPSB7CisJLm5hbWUJCT0gInFwdGkiLAorCS5tYXRjaF90YWJsZQk9IHFwdGlfbWF0Y2gsCisJLnByb2JlCQk9IHFwdGlfc2J1c19wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHFwdGlfc2J1c19yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcXB0aV9pbml0KHZvaWQpCit7CisJcmV0dXJuIG9mX3JlZ2lzdGVyX2RyaXZlcigmcXB0aV9zYnVzX2RyaXZlciwgJnNidXNfYnVzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcXB0aV9leGl0KHZvaWQpCit7CisJb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoJnFwdGlfc2J1c19kcml2ZXIpOworfQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlFsb2dpY0lTUCBTQlVTIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBkYXZlbWxvZnQubmV0KSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjIuMCIpOwogCittb2R1bGVfaW5pdChxcHRpX2luaXQpOworbW9kdWxlX2V4aXQocXB0aV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX212LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9tdi5jCmluZGV4IGYxNmY5MmEuLjRhNzE1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX212LmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfbXYuYwpAQCAtOTMsNyArOTMsNyBAQAogCU1WX0ZMQUdfSVJRX0NPQUxFU0NFCT0gKDEgPDwgMjkpLCAgLyogSVJRIGNvYWxlc2NpbmcgY2FwYWJpbGl0eSAqLwogCU1WX0NPTU1PTl9GTEFHUwkJPSAoQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CiAJCQkJICAgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8IEFUQV9GTEFHX01NSU8gfAotCQkJCSAgIEFUQV9GTEFHX05PX0FUQVBJKSwKKwkJCQkgICBBVEFfRkxBR19OT19BVEFQSSB8IEFUQV9GTEFHX1BJT19QT0xMSU5HKSwKIAlNVl82WFhYX0ZMQUdTCQk9IE1WX0ZMQUdfSVJRX0NPQUxFU0NFLAogCiAJQ1JRQl9GTEFHX1JFQUQJCT0gKDEgPDwgMCksCkBAIC0yNzIsMzMgKzI3MiwzMyBAQAogCiAvKiBDb21tYW5kIFJlUXVlc3QgQmxvY2s6IDMyQiAqLwogc3RydWN0IG12X2NycWIgewotCXUzMgkJCXNnX2FkZHI7Ci0JdTMyCQkJc2dfYWRkcl9oaTsKLQl1MTYJCQljdHJsX2ZsYWdzOwotCXUxNgkJCWF0YV9jbWRbMTFdOworCV9fbGUzMgkJCXNnX2FkZHI7CisJX19sZTMyCQkJc2dfYWRkcl9oaTsKKwlfX2xlMTYJCQljdHJsX2ZsYWdzOworCV9fbGUxNgkJCWF0YV9jbWRbMTFdOwogfTsKIAogc3RydWN0IG12X2NycWJfaWllIHsKLQl1MzIJCQlhZGRyOwotCXUzMgkJCWFkZHJfaGk7Ci0JdTMyCQkJZmxhZ3M7Ci0JdTMyCQkJbGVuOwotCXUzMgkJCWF0YV9jbWRbNF07CisJX19sZTMyCQkJYWRkcjsKKwlfX2xlMzIJCQlhZGRyX2hpOworCV9fbGUzMgkJCWZsYWdzOworCV9fbGUzMgkJCWxlbjsKKwlfX2xlMzIJCQlhdGFfY21kWzRdOwogfTsKIAogLyogQ29tbWFuZCBSZXNQb25zZSBCbG9jazogOEIgKi8KIHN0cnVjdCBtdl9jcnBiIHsKLQl1MTYJCQlpZDsKLQl1MTYJCQlmbGFnczsKLQl1MzIJCQl0bXN0bXA7CisJX19sZTE2CQkJaWQ7CisJX19sZTE2CQkJZmxhZ3M7CisJX19sZTMyCQkJdG1zdG1wOwogfTsKIAogLyogRURNQSBQaHlzaWNhbCBSZWdpb24gRGVzY3JpcHRvciAoZVBSRCk7IEEuSy5BLiBTRyAqLwogc3RydWN0IG12X3NnIHsKLQl1MzIJCQlhZGRyOwotCXUzMgkJCWZsYWdzX3NpemU7Ci0JdTMyCQkJYWRkcl9oaTsKLQl1MzIJCQlyZXNlcnZlZDsKKwlfX2xlMzIJCQlhZGRyOworCV9fbGUzMgkJCWZsYWdzX3NpemU7CisJX19sZTMyCQkJYWRkcl9oaTsKKwlfX2xlMzIJCQlyZXNlcnZlZDsKIH07CiAKIHN0cnVjdCBtdl9wb3J0X3ByaXYgewpAQCAtMzkwLDYgKzM5MCw3IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IE1WX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIApAQCAtNDA2LDYgKzQwNyw3IEBACiAKIAkucWNfcHJlcAkJPSBtdl9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBtdl9xY19pc3N1ZSwKKwkuZGF0YV94ZmVyCQk9IGF0YV9tbWlvX2RhdGFfeGZlciwKIAogCS5lbmdfdGltZW91dAkJPSBtdl9lbmdfdGltZW91dCwKIApAQCAtNDMzLDYgKzQzNSw3IEBACiAKIAkucWNfcHJlcAkJPSBtdl9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBtdl9xY19pc3N1ZSwKKwkuZGF0YV94ZmVyCQk9IGF0YV9tbWlvX2RhdGFfeGZlciwKIAogCS5lbmdfdGltZW91dAkJPSBtdl9lbmdfdGltZW91dCwKIApAQCAtNjgzLDcgKzY4Niw3IEBACiAJfQogCiAJaWYgKEVETUFfRU4gJiByZWcpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogVW5hYmxlIHRvIHN0b3AgZURNQVxuIiwgYXAtPmlkKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgIlVuYWJsZSB0byBzdG9wIGVETUFcbiIpOwogCQkvKiBGSVhNRTogQ29uc2lkZXIgZG9pbmcgYSByZXNldCBoZXJlIHRvIHJlY292ZXIgKi8KIAl9CiB9CkBAIC0xMDI4LDcgKzEwMzEsNyBAQAogCXJldHVybiAoaW5kZXggKyAxKSAmIE1WX01BWF9RX0RFUFRIX01BU0s7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtdl9jcnFiX3BhY2tfY21kKHUxNiAqY21kdywgdTggZGF0YSwgdTggYWRkciwgdW5zaWduZWQgbGFzdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtdl9jcnFiX3BhY2tfY21kKF9fbGUxNiAqY21kdywgdTggZGF0YSwgdTggYWRkciwgdW5zaWduZWQgbGFzdCkKIHsKIAl1MTYgdG1wID0gZGF0YSB8IChhZGRyIDw8IENSUUJfQ01EX0FERFJfU0hJRlQpIHwgQ1JRQl9DTURfQ1MgfAogCQkobGFzdCA/IENSUUJfQ01EX0xBU1QgOiAwKTsKQEAgLTEwNTEsNyArMTA1NCw3IEBACiB7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAlzdHJ1Y3QgbXZfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7Ci0JdTE2ICpjdzsKKwlfX2xlMTYgKmN3OwogCXN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmOwogCXUxNiBmbGFncyA9IDA7CiAJdW5zaWduZWQgaW5faW5kZXg7CkBAIC0xMzA3LDggKzEzMTAsOCBAQAogCWVkbWFfZXJyX2NhdXNlID0gcmVhZGwocG9ydF9tbWlvICsgRURNQV9FUlJfSVJRX0NBVVNFX09GUyk7CiAKIAlpZiAoRURNQV9FUlJfU0VSUiAmIGVkbWFfZXJyX2NhdXNlKSB7Ci0JCXNlcnIgPSBzY3JfcmVhZChhcCwgU0NSX0VSUk9SKTsKLQkJc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfRVJST1IsIHNlcnIpOworCQlzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfRVJST1IsICZzZXJyKTsKKwkJc2F0YV9zY3Jfd3JpdGVfZmx1c2goYXAsIFNDUl9FUlJPUiwgc2Vycik7CiAJfQogCWlmIChFRE1BX0VSUl9TRUxGX0RJUyAmIGVkbWFfZXJyX2NhdXNlKSB7CiAJCXN0cnVjdCBtdl9wb3J0X3ByaXYgKnBwCT0gYXAtPnByaXZhdGVfZGF0YTsKQEAgLTEzNzcsNyArMTM4MCw3IEBACiAJCS8qIE5vdGUgdGhhdCBERVZfSVJRIG1pZ2h0IGhhcHBlbiBzcHVyaW91c2x5IGR1cmluZyBFRE1BLAogCQkgKiBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgaW4gc3VjaCBjYXNlcy4KIAkJICogVGhlIGNhdXNlIG9mIHRoaXMgaXMgc3RpbGwgdW5kZXIgaW52ZXN0aWdhdGlvbi4KLQkJICovIAorCQkgKi8KIAkJaWYgKHBwLT5wcF9mbGFncyAmIE1WX1BQX0ZMQUdfRURNQV9FTikgewogCQkJLyogRURNQTogY2hlY2sgZm9yIHJlc3BvbnNlIHF1ZXVlIGludGVycnVwdCAqLwogCQkJaWYgKChDUlBCX0RNQV9ET05FIDw8IGhhcmRfcG9ydCkgJiBoY19pcnFfY2F1c2UpIHsKQEAgLTEzOTgsNyArMTQwMSw3IEBACiAJCQl9CiAJCX0KIAotCQlpZiAoYXAtPmZsYWdzICYgKEFUQV9GTEFHX1BPUlRfRElTQUJMRUQgfCBBVEFfRkxBR19OT0lOVFIpKQorCQlpZiAoYXAgJiYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKSkKIAkJCWNvbnRpbnVlOwogCiAJCWVycl9tYXNrID0gYWNfZXJyX21hc2soYXRhX3N0YXR1cyk7CkBAIC0xNDE5LDcgKzE0MjIsNyBAQAogCQkJCVZQUklOVEsoInBvcnQgJXUgSVJRIGZvdW5kIGZvciBxYywgIgogCQkJCQkiYXRhX3N0YXR1cyAweCV4XG4iLCBwb3J0LGF0YV9zdGF0dXMpOwogCQkJCS8qIG1hcmsgcWMgc3RhdHVzIGFwcHJvcHJpYXRlbHkgKi8KLQkJCQlpZiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSB7CisJCQkJaWYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSB7CiAJCQkJCXFjLT5lcnJfbWFzayB8PSBlcnJfbWFzazsKIAkJCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKIAkJCQl9CkBAIC0xOTQ5LDE1ICsxOTUyLDE2IEBACiAKIAkvKiBJc3N1ZSBDT01SRVNFVCB2aWEgU0NvbnRyb2wgKi8KIGNvbXJlc2V0X3JldHJ5OgotCXNjcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIDB4MzAxKTsKKwlzYXRhX3Njcl93cml0ZV9mbHVzaChhcCwgU0NSX0NPTlRST0wsIDB4MzAxKTsKIAlfX21zbGVlcCgxLCBjYW5fc2xlZXApOwogCi0Jc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOworCXNhdGFfc2NyX3dyaXRlX2ZsdXNoKGFwLCBTQ1JfQ09OVFJPTCwgMHgzMDApOwogCV9fbXNsZWVwKDIwLCBjYW5fc2xlZXApOwogCiAJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMCk7CiAJZG8gewotCQlzc3RhdHVzID0gc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpICYgMHgzOworCQlzYXRhX3Njcl9yZWFkKGFwLCBTQ1JfU1RBVFVTLCAmc3N0YXR1cyk7CisJCXNzdGF0dXMgJj0gMHgzOwogCQlpZiAoKHNzdGF0dXMgPT0gMykgfHwgKHNzdGF0dXMgPT0gMCkpCiAJCQlicmVhazsKIApAQCAtMTk3NCwxMSArMTk3OCwxMiBAQAogCQkiU0N0cmwgMHglMDh4XG4iLCBtdl9zY3JfcmVhZChhcCwgU0NSX1NUQVRVUyksCiAJCW12X3Njcl9yZWFkKGFwLCBTQ1JfRVJST1IpLCBtdl9zY3JfcmVhZChhcCwgU0NSX0NPTlRST0wpKTsKIAotCWlmIChzYXRhX2Rldl9wcmVzZW50KGFwKSkgeworCWlmIChhdGFfcG9ydF9vbmxpbmUoYXApKSB7CiAJCWF0YV9wb3J0X3Byb2JlKGFwKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldTogbm8gZGV2aWNlIGZvdW5kIChwaHkgc3RhdCAlMDh4KVxuIiwKLQkJICAgICAgIGFwLT5pZCwgc2NyX3JlYWQoYXAsIFNDUl9TVEFUVVMpKTsKKwkJc2F0YV9zY3JfcmVhZChhcCwgU0NSX1NUQVRVUywgJnNzdGF0dXMpOworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fSU5GTywKKwkJCQkibm8gZGV2aWNlIGZvdW5kIChwaHkgc3RhdCAlMDh4KVxuIiwgc3N0YXR1cyk7CiAJCWF0YV9wb3J0X2Rpc2FibGUoYXApOwogCQlyZXR1cm47CiAJfQpAQCAtMjAwNSw3ICsyMDEwLDcgQEAKIAl0Zi5uc2VjdCA9IHJlYWRiKCh2b2lkIF9faW9tZW0gKikgYXAtPmlvYWRkci5uc2VjdF9hZGRyKTsKIAogCWRldi0+Y2xhc3MgPSBhdGFfZGV2X2NsYXNzaWZ5KCZ0Zik7Ci0JaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkgeworCWlmICghYXRhX2Rldl9lbmFibGVkKGRldikpIHsKIAkJVlBSSU5USygiUG9ydCBkaXNhYmxlZCBwb3N0LXNpZzogTm8gZGV2aWNlIHByZXNlbnQuXG4iKTsKIAkJYXRhX3BvcnRfZGlzYWJsZShhcCk7CiAJfQpAQCAtMjAzNyw3ICsyMDQyLDcgQEAKIAlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBFbnRlcmluZyBtdl9lbmdfdGltZW91dFxuIixhcC0+aWQpOworCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJFbnRlcmluZyBtdl9lbmdfdGltZW91dFxuIik7CiAJRFBSSU5USygiQWxsIHJlZ3MgQCBzdGFydCBvZiBlbmdfdGltZW91dFxuIik7CiAJbXZfZHVtcF9hbGxfcmVncyhhcC0+aG9zdF9zZXQtPm1taW9fYmFzZSwgYXAtPnBvcnRfbm8sCiAJCQkgdG9fcGNpX2RldihhcC0+aG9zdF9zZXQtPmRldikpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfbnYuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX252LmMKaW5kZXggOWY1NTMwOC4uZDE4ZTdlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9udi5jCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJCQkic2F0YV9udiIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JCQkiMC44IgorI2RlZmluZSBEUlZfVkVSU0lPTgkJCSIwLjkiCiAKIGVudW0gewogCU5WX1BPUlRTCQkJPSAyLApAQCAtNTQsNDAgKzU0LDI1IEBACiAJTlZfUE9SVDBfU0NSX1JFR19PRkZTRVQJCT0gMHgwMCwKIAlOVl9QT1JUMV9TQ1JfUkVHX09GRlNFVAkJPSAweDQwLAogCisJLyogSU5UX1NUQVRVUy9FTkFCTEUgKi8KIAlOVl9JTlRfU1RBVFVTCQkJPSAweDEwLAotCU5WX0lOVF9TVEFUVVNfQ0s4MDQJCT0gMHg0NDAsCi0JTlZfSU5UX1NUQVRVU19QREVWX0lOVAkJPSAweDAxLAotCU5WX0lOVF9TVEFUVVNfUERFVl9QTQkJPSAweDAyLAotCU5WX0lOVF9TVEFUVVNfUERFVl9BRERFRAk9IDB4MDQsCi0JTlZfSU5UX1NUQVRVU19QREVWX1JFTU9WRUQJPSAweDA4LAotCU5WX0lOVF9TVEFUVVNfU0RFVl9JTlQJCT0gMHgxMCwKLQlOVl9JTlRfU1RBVFVTX1NERVZfUE0JCT0gMHgyMCwKLQlOVl9JTlRfU1RBVFVTX1NERVZfQURERUQJPSAweDQwLAotCU5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVECT0gMHg4MCwKLQlOVl9JTlRfU1RBVFVTX1BERVZfSE9UUExVRwk9IChOVl9JTlRfU1RBVFVTX1BERVZfQURERUQgfAotCQkJCQkgICBOVl9JTlRfU1RBVFVTX1BERVZfUkVNT1ZFRCksCi0JTlZfSU5UX1NUQVRVU19TREVWX0hPVFBMVUcJPSAoTlZfSU5UX1NUQVRVU19TREVWX0FEREVEIHwKLQkJCQkJICAgTlZfSU5UX1NUQVRVU19TREVWX1JFTU9WRUQpLAotCU5WX0lOVF9TVEFUVVNfSE9UUExVRwkJPSAoTlZfSU5UX1NUQVRVU19QREVWX0hPVFBMVUcgfAotCQkJCQkgICBOVl9JTlRfU1RBVFVTX1NERVZfSE9UUExVRyksCi0KIAlOVl9JTlRfRU5BQkxFCQkJPSAweDExLAorCU5WX0lOVF9TVEFUVVNfQ0s4MDQJCT0gMHg0NDAsCiAJTlZfSU5UX0VOQUJMRV9DSzgwNAkJPSAweDQ0MSwKLQlOVl9JTlRfRU5BQkxFX1BERVZfTUFTSwkJPSAweDAxLAotCU5WX0lOVF9FTkFCTEVfUERFVl9QTQkJPSAweDAyLAotCU5WX0lOVF9FTkFCTEVfUERFVl9BRERFRAk9IDB4MDQsCi0JTlZfSU5UX0VOQUJMRV9QREVWX1JFTU9WRUQJPSAweDA4LAotCU5WX0lOVF9FTkFCTEVfU0RFVl9NQVNLCQk9IDB4MTAsCi0JTlZfSU5UX0VOQUJMRV9TREVWX1BNCQk9IDB4MjAsCi0JTlZfSU5UX0VOQUJMRV9TREVWX0FEREVECT0gMHg0MCwKLQlOVl9JTlRfRU5BQkxFX1NERVZfUkVNT1ZFRAk9IDB4ODAsCi0JTlZfSU5UX0VOQUJMRV9QREVWX0hPVFBMVUcJPSAoTlZfSU5UX0VOQUJMRV9QREVWX0FEREVEIHwKLQkJCQkJICAgTlZfSU5UX0VOQUJMRV9QREVWX1JFTU9WRUQpLAotCU5WX0lOVF9FTkFCTEVfU0RFVl9IT1RQTFVHCT0gKE5WX0lOVF9FTkFCTEVfU0RFVl9BRERFRCB8Ci0JCQkJCSAgIE5WX0lOVF9FTkFCTEVfU0RFVl9SRU1PVkVEKSwKLQlOVl9JTlRfRU5BQkxFX0hPVFBMVUcJCT0gKE5WX0lOVF9FTkFCTEVfUERFVl9IT1RQTFVHIHwKLQkJCQkJICAgTlZfSU5UX0VOQUJMRV9TREVWX0hPVFBMVUcpLAogCisJLyogSU5UX1NUQVRVUy9FTkFCTEUgYml0cyAqLworCU5WX0lOVF9ERVYJCQk9IDB4MDEsCisJTlZfSU5UX1BNCQkJPSAweDAyLAorCU5WX0lOVF9BRERFRAkJCT0gMHgwNCwKKwlOVl9JTlRfUkVNT1ZFRAkJCT0gMHgwOCwKKworCU5WX0lOVF9QT1JUX1NISUZUCQk9IDQsCS8qIGVhY2ggcG9ydCBvY2N1cGllcyA0IGJpdHMgKi8KKworCU5WX0lOVF9BTEwJCQk9IDB4MGYsCisJTlZfSU5UX01BU0sJCQk9IE5WX0lOVF9ERVYgfAorCQkJCQkgIE5WX0lOVF9BRERFRCB8IE5WX0lOVF9SRU1PVkVELAorCisJLyogSU5UX0NPTkZJRyAqLwogCU5WX0lOVF9DT05GSUcJCQk9IDB4MTIsCiAJTlZfSU5UX0NPTkZJR19NRVRIRAkJPSAweDAxLCAvLyAwID0gSU5ULCAxID0gU01JCiAKQEAgLTk3LDIzICs4MiwyNyBAQAogfTsKIAogc3RhdGljIGludCBudl9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIGlycXJldHVybl90IG52X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAotCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBudl9jazgwNF9ob3N0X3N0b3Aoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworc3RhdGljIGlycXJldHVybl90IG52X2dlbmVyaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGlycXJldHVybl90IG52X25mMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLAorCQkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgbnZfY2s4MDRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBzdGF0aWMgdTMyIG52X3Njcl9yZWFkIChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgc2NfcmVnKTsKIHN0YXRpYyB2b2lkIG52X3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7Ci1zdGF0aWMgdm9pZCBudl9ob3N0X3N0b3AgKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKLXN0YXRpYyB2b2lkIG52X2VuYWJsZV9ob3RwbHVnKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpOwotc3RhdGljIHZvaWQgbnZfZGlzYWJsZV9ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKLXN0YXRpYyBpbnQgbnZfY2hlY2tfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7Ci1zdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKLXN0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCk7Ci1zdGF0aWMgaW50IG52X2NoZWNrX2hvdHBsdWdfY2s4MDQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOworCitzdGF0aWMgdm9pZCBudl9uZjJfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgbnZfbmYyX3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBudl9jazgwNF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBudl9jazgwNF90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgbnZfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAogZW51bSBudl9ob3N0X3R5cGUKIHsKIAlHRU5FUklDLAogCU5GT1JDRTIsCi0JTkZPUkNFMywKKwlORk9SQ0UzID0gTkZPUkNFMiwJLyogTkYyID09IE5GMyBhcyBmYXIgYXMgc2F0YV9udiBpcyBjb25jZXJuZWQgKi8KIAlDSzgwNAogfTsKIApAQCAtMTQwLDYgKzEyOSwxNiBAQAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBHRU5FUklDIH0sCiAJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X1NBVEEyLAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBHRU5FUklDIH0sCisJeyBQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDYxX1NBVEEsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQTIsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQTMsCisJCVBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDA0NWMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDA0NWQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDA0NWUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCAweDA0NWYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEdFTkVSSUMgfSwKIAl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELAogCQlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCQlQQ0lfQ0xBU1NfU1RPUkFHRV9JREU8PDgsIDB4ZmZmZjAwLCBHRU5FUklDIH0sCkBAIC0xNDksNDYgKzE0OCw2IEBACiAJeyAwLCB9IC8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwogCi1zdHJ1Y3QgbnZfaG9zdF9kZXNjCi17Ci0JZW51bSBudl9ob3N0X3R5cGUJaG9zdF90eXBlOwotCXZvaWQJCQkoKmVuYWJsZV9ob3RwbHVnKShzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KTsKLQl2b2lkCQkJKCpkaXNhYmxlX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKLQlpbnQJCQkoKmNoZWNrX2hvdHBsdWcpKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKLQotfTsKLXN0YXRpYyBzdHJ1Y3QgbnZfaG9zdF9kZXNjIG52X2RldmljZV90YmxbXSA9IHsKLQl7Ci0JCS5ob3N0X3R5cGUJPSBHRU5FUklDLAotCQkuZW5hYmxlX2hvdHBsdWcJPSBOVUxMLAotCQkuZGlzYWJsZV9ob3RwbHVnPSBOVUxMLAotCQkuY2hlY2tfaG90cGx1Zwk9IE5VTEwsCi0JfSwKLQl7Ci0JCS5ob3N0X3R5cGUJPSBORk9SQ0UyLAotCQkuZW5hYmxlX2hvdHBsdWcJPSBudl9lbmFibGVfaG90cGx1ZywKLQkJLmRpc2FibGVfaG90cGx1Zz0gbnZfZGlzYWJsZV9ob3RwbHVnLAotCQkuY2hlY2tfaG90cGx1Zwk9IG52X2NoZWNrX2hvdHBsdWcsCi0JfSwKLQl7Ci0JCS5ob3N0X3R5cGUJPSBORk9SQ0UzLAotCQkuZW5hYmxlX2hvdHBsdWcJPSBudl9lbmFibGVfaG90cGx1ZywKLQkJLmRpc2FibGVfaG90cGx1Zz0gbnZfZGlzYWJsZV9ob3RwbHVnLAotCQkuY2hlY2tfaG90cGx1Zwk9IG52X2NoZWNrX2hvdHBsdWcsCi0JfSwKLQl7CS5ob3N0X3R5cGUJPSBDSzgwNCwKLQkJLmVuYWJsZV9ob3RwbHVnCT0gbnZfZW5hYmxlX2hvdHBsdWdfY2s4MDQsCi0JCS5kaXNhYmxlX2hvdHBsdWc9IG52X2Rpc2FibGVfaG90cGx1Z19jazgwNCwKLQkJLmNoZWNrX2hvdHBsdWcJPSBudl9jaGVja19ob3RwbHVnX2NrODA0LAotCX0sCi19OwotCi1zdHJ1Y3QgbnZfaG9zdAotewotCXN0cnVjdCBudl9ob3N0X2Rlc2MJKmhvc3RfZGVzYzsKLQl1bnNpZ25lZCBsb25nCQlob3N0X2ZsYWdzOwotfTsKLQogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIG52X3BjaV9kcml2ZXIgPSB7CiAJLm5hbWUJCQk9IERSVl9OQU1FLAogCS5pZF90YWJsZQkJPSBudl9wY2lfdGJsLApAQCAtMjEwLDUxICsxNjksMTE5IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfZ2VuZXJpY19vcHMgPSB7CiAJLnBvcnRfZGlzYWJsZQkJPSBhdGFfcG9ydF9kaXNhYmxlLAogCS50Zl9sb2FkCQk9IGF0YV90Zl9sb2FkLAogCS50Zl9yZWFkCQk9IGF0YV90Zl9yZWFkLAogCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKIAkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAotCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCiAJLmJtZG1hX3NldHVwCQk9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQJCT0gYXRhX2JtZG1hX3N0YXJ0LAogCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAogCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKIAkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKLQkuaXJxX2hhbmRsZXIJCT0gbnZfaW50ZXJydXB0LAorCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCisJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAorCS5lcnJvcl9oYW5kbGVyCQk9IG52X2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCisJLmlycV9oYW5kbGVyCQk9IG52X2dlbmVyaWNfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuc2NyX3JlYWQJCT0gbnZfc2NyX3JlYWQsCiAJLnNjcl93cml0ZQkJPSBudl9zY3Jfd3JpdGUsCiAJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCiAJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAotCS5ob3N0X3N0b3AJCT0gbnZfaG9zdF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCiB9OwogCi0vKiBGSVhNRTogVGhlIGhhcmR3YXJlIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgU0FUQSBQSFkgY29udHJvbHMKLSAqIHRvIHN1cHBvcnQgQVRBX0ZMQUdfU0FUQV9SRVNFVC4gIEhvd2V2ZXIsIGl0IGlzIGN1cnJlbnRseQotICogbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhhdCBmbGFnLCB0byBzb2x2ZSBtaXNkZXRlY3Rpb24gcHJvYmxlbXMuCi0gKiBTZWUgaHR0cDovL2J1Z21lLm9zZGwub3JnL3Nob3dfYnVnLmNnaT9pZD0zMzUyIGZvciBtb3JlIGluZm8uCi0gKgotICogVGhpcyBwcm9ibGVtIHJlYWxseSBuZWVkcyB0byBiZSBpbnZlc3RpZ2F0ZWQgZnVydGhlci4gIEJ1dCBpbiB0aGUKLSAqIG1lYW50aW1lLCB3ZSBhdm9pZCBBVEFfRkxBR19TQVRBX1JFU0VUIHRvIGdldCBwZW9wbGUgd29ya2luZy4KLSAqLwotc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mbyA9IHsKLQkuc2h0CQk9ICZudl9zaHQsCi0JLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwKLQkJCSAgLyogQVRBX0ZMQUdfU0FUQV9SRVNFVCB8ICovCi0JCQkgIEFUQV9GTEFHX1NSU1QgfAotCQkJICBBVEFfRkxBR19OT19MRUdBQ1ksCi0JLnBpb19tYXNrCT0gTlZfUElPX01BU0ssCi0JLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAotCS51ZG1hX21hc2sJPSBOVl9VRE1BX01BU0ssCi0JLnBvcnRfb3BzCT0gJm52X29wcywKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyBudl9uZjJfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZnJlZXplCQkJPSBudl9uZjJfZnJlZXplLAorCS50aGF3CQkJPSBudl9uZjJfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBudl9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKKwkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAorCS5pcnFfaGFuZGxlcgkJPSBudl9uZjJfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0gbnZfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBudl9zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gYXRhX3BjaV9ob3N0X3N0b3AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0YV9wb3J0X29wZXJhdGlvbnMgbnZfY2s4MDRfb3BzID0geworCS5wb3J0X2Rpc2FibGUJCT0gYXRhX3BvcnRfZGlzYWJsZSwKKwkudGZfbG9hZAkJPSBhdGFfdGZfbG9hZCwKKwkudGZfcmVhZAkJPSBhdGFfdGZfcmVhZCwKKwkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCisJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAorCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKKwkuYm1kbWFfc2V0dXAJCT0gYXRhX2JtZG1hX3NldHVwLAorCS5ibWRtYV9zdGFydAkJPSBhdGFfYm1kbWFfc3RhcnQsCisJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAorCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAorCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKKwkuZnJlZXplCQkJPSBudl9jazgwNF9mcmVlemUsCisJLnRoYXcJCQk9IG52X2NrODA0X3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gbnZfZXJyb3JfaGFuZGxlciwKKwkucG9zdF9pbnRlcm5hbF9jbWQJPSBhdGFfYm1kbWFfcG9zdF9pbnRlcm5hbF9jbWQsCisJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKKwkuaXJxX2hhbmRsZXIJCT0gbnZfY2s4MDRfaW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKKwkuc2NyX3JlYWQJCT0gbnZfc2NyX3JlYWQsCisJLnNjcl93cml0ZQkJPSBudl9zY3Jfd3JpdGUsCisJLnBvcnRfc3RhcnQJCT0gYXRhX3BvcnRfc3RhcnQsCisJLnBvcnRfc3RvcAkJPSBhdGFfcG9ydF9zdG9wLAorCS5ob3N0X3N0b3AJCT0gbnZfY2s4MDRfaG9zdF9zdG9wLAorfTsKKworc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIG52X3BvcnRfaW5mb1tdID0geworCS8qIGdlbmVyaWMgKi8KKwl7CisJCS5zaHQJCT0gJm52X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKKwkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAorCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLAorCQkucG9ydF9vcHMJPSAmbnZfZ2VuZXJpY19vcHMsCisJfSwKKwkvKiBuZm9yY2UyLzMgKi8KKwl7CisJCS5zaHQJCT0gJm52X3NodCwKKwkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCQkucGlvX21hc2sJPSBOVl9QSU9fTUFTSywKKwkJLm13ZG1hX21hc2sJPSBOVl9NV0RNQV9NQVNLLAorCQkudWRtYV9tYXNrCT0gTlZfVURNQV9NQVNLLAorCQkucG9ydF9vcHMJPSAmbnZfbmYyX29wcywKKwl9LAorCS8qIGNrODA0ICovCisJeworCQkuc2h0CQk9ICZudl9zaHQsCisJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSwKKwkJLnBpb19tYXNrCT0gTlZfUElPX01BU0ssCisJCS5td2RtYV9tYXNrCT0gTlZfTVdETUFfTUFTSywKKwkJLnVkbWFfbWFzawk9IE5WX1VETUFfTUFTSywKKwkJLnBvcnRfb3BzCT0gJm52X2NrODA0X29wcywKKwl9LAogfTsKIAogTU9EVUxFX0FVVEhPUigiTlZJRElBIik7CkBAIC0yNjMsMTEgKzI5MCwxMCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG52X3BjaV90YmwpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCi1zdGF0aWMgaXJxcmV0dXJuX3QgbnZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCi0JCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQorc3RhdGljIGlycXJldHVybl90IG52X2dlbmVyaWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7Ci0Jc3RydWN0IG52X2hvc3QgKmhvc3QgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCBoYW5kbGVkID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjc5LDExICszMDUsMTEgQEAKIAogCQlhcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKIAkJaWYgKGFwICYmCi0JCSAgICAhKGFwLT5mbGFncyAmIChBVEFfRkxBR19QT1JUX0RJU0FCTEVEIHwgQVRBX0ZMQUdfTk9JTlRSKSkpIHsKKwkJICAgICEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKSB7CiAJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCiAJCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKQorCQkJaWYgKHFjICYmICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpCiAJCQkJaGFuZGxlZCArPSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7CiAJCQllbHNlCiAJCQkJLy8gTm8gcmVxdWVzdCBwZW5kaW5nPyAgQ2xlYXIgaW50ZXJydXB0IHN0YXR1cwpAQCAtMjkzLDE0ICszMTksODggQEAKIAogCX0KIAotCWlmIChob3N0LT5ob3N0X2Rlc2MtPmNoZWNrX2hvdHBsdWcpCi0JCWhhbmRsZWQgKz0gaG9zdC0+aG9zdF9kZXNjLT5jaGVja19ob3RwbHVnKGhvc3Rfc2V0KTsKLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3Rfc2V0LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAorc3RhdGljIGludCBudl9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdTggaXJxX3N0YXQpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCWludCBoYW5kbGVkOworCisJLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgKi8KKwlpZiAodW5saWtlbHkoaXJxX3N0YXQgJiAoTlZfSU5UX0FEREVEIHwgTlZfSU5UX1JFTU9WRUQpKSkgeworCQlhdGFfcG9ydF9mcmVlemUoYXApOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBiYWlsIG91dCBpZiBub3Qgb3VyIGludGVycnVwdCAqLworCWlmICghKGlycV9zdGF0ICYgTlZfSU5UX0RFVikpCisJCXJldHVybiAwOworCisJLyogREVWIGludGVycnVwdCB3LyBubyBhY3RpdmUgcWM/ICovCisJaWYgKHVubGlrZWx5KCFxYyB8fCAocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkgeworCQlhdGFfY2hlY2tfc3RhdHVzKGFwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogaGFuZGxlIGludGVycnVwdCAqLworCWhhbmRsZWQgPSBhdGFfaG9zdF9pbnRyKGFwLCBxYyk7CisJaWYgKHVubGlrZWx5KCFoYW5kbGVkKSkgeworCQkvKiBzcHVyaW91cywgY2xlYXIgaXQgKi8KKwkJYXRhX2NoZWNrX3N0YXR1cyhhcCk7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9kb19pbnRlcnJ1cHQoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQsIHU4IGlycV9zdGF0KQoreworCWludCBpLCBoYW5kbGVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0X3NldC0+cG9ydHNbaV07CisKKwkJaWYgKGFwICYmICEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKQorCQkJaGFuZGxlZCArPSBudl9ob3N0X2ludHIoYXAsIGlycV9zdGF0KTsKKworCQlpcnFfc3RhdCA+Pj0gTlZfSU5UX1BPUlRfU0hJRlQ7CisJfQorCisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBudl9uZjJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdTggaXJxX3N0YXQ7CisJaXJxcmV0dXJuX3QgcmV0OworCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisJaXJxX3N0YXQgPSBpbmIoaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfU1RBVFVTKTsKKwlyZXQgPSBudl9kb19pbnRlcnJ1cHQoaG9zdF9zZXQsIGlycV9zdGF0KTsKKwlzcGluX3VubG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IG52X2NrODA0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdTggaXJxX3N0YXQ7CisJaXJxcmV0dXJuX3QgcmV0OworCisJc3Bpbl9sb2NrKCZob3N0X3NldC0+bG9jayk7CisJaXJxX3N0YXQgPSByZWFkYihob3N0X3NldC0+bW1pb19iYXNlICsgTlZfSU5UX1NUQVRVU19DSzgwNCk7CisJcmV0ID0gbnZfZG9faW50ZXJydXB0KGhvc3Rfc2V0LCBpcnFfc3RhdCk7CisJc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB1MzIgbnZfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MKQpAQCAtMzE3LDIzICs0MTcsNzQgQEAKIAlpb3dyaXRlMzIodmFsLCAodm9pZCBfX2lvbWVtICopYXAtPmlvYWRkci5zY3JfYWRkciArIChzY19yZWcgKiA0KSk7CiB9CiAKLXN0YXRpYyB2b2lkIG52X2hvc3Rfc3RvcCAoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpCitzdGF0aWMgdm9pZCBudl9uZjJfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0Jc3RydWN0IG52X2hvc3QgKmhvc3QgPSBob3N0X3NldC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgc2NyX2FkZHIgPSBhcC0+aG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHI7CisJaW50IHNoaWZ0ID0gYXAtPnBvcnRfbm8gKiBOVl9JTlRfUE9SVF9TSElGVDsKKwl1OCBtYXNrOwogCi0JLy8gRGlzYWJsZSBob3RwbHVnIGV2ZW50IGludGVycnVwdHMuCi0JaWYgKGhvc3QtPmhvc3RfZGVzYy0+ZGlzYWJsZV9ob3RwbHVnKQotCQlob3N0LT5ob3N0X2Rlc2MtPmRpc2FibGVfaG90cGx1Zyhob3N0X3NldCk7CisJbWFzayA9IGluYihzY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOworCW1hc2sgJj0gfihOVl9JTlRfQUxMIDw8IHNoaWZ0KTsKKwlvdXRiKG1hc2ssIHNjcl9hZGRyICsgTlZfSU5UX0VOQUJMRSk7Cit9CiAKLQlrZnJlZShob3N0KTsKK3N0YXRpYyB2b2lkIG52X25mMl90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdW5zaWduZWQgbG9uZyBzY3JfYWRkciA9IGFwLT5ob3N0X3NldC0+cG9ydHNbMF0tPmlvYWRkci5zY3JfYWRkcjsKKwlpbnQgc2hpZnQgPSBhcC0+cG9ydF9ubyAqIE5WX0lOVF9QT1JUX1NISUZUOworCXU4IG1hc2s7CiAKLQlhdGFfcGNpX2hvc3Rfc3RvcChob3N0X3NldCk7CisJb3V0YihOVl9JTlRfQUxMIDw8IHNoaWZ0LCBzY3JfYWRkciArIE5WX0lOVF9TVEFUVVMpOworCisJbWFzayA9IGluYihzY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOworCW1hc2sgfD0gKE5WX0lOVF9NQVNLIDw8IHNoaWZ0KTsKKwlvdXRiKG1hc2ssIHNjcl9hZGRyICsgTlZfSU5UX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NrODA0X2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqbW1pb19iYXNlID0gYXAtPmhvc3Rfc2V0LT5tbWlvX2Jhc2U7CisJaW50IHNoaWZ0ID0gYXAtPnBvcnRfbm8gKiBOVl9JTlRfUE9SVF9TSElGVDsKKwl1OCBtYXNrOworCisJbWFzayA9IHJlYWRiKG1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOworCW1hc2sgJj0gfihOVl9JTlRfQUxMIDw8IHNoaWZ0KTsKKwl3cml0ZWIobWFzaywgbW1pb19iYXNlICsgTlZfSU5UX0VOQUJMRV9DSzgwNCk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2NrODA0X3RoYXcoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwl2b2lkIF9faW9tZW0gKm1taW9fYmFzZSA9IGFwLT5ob3N0X3NldC0+bW1pb19iYXNlOworCWludCBzaGlmdCA9IGFwLT5wb3J0X25vICogTlZfSU5UX1BPUlRfU0hJRlQ7CisJdTggbWFzazsKKworCXdyaXRlYihOVl9JTlRfQUxMIDw8IHNoaWZ0LCBtbWlvX2Jhc2UgKyBOVl9JTlRfU1RBVFVTX0NLODA0KTsKKworCW1hc2sgPSByZWFkYihtbWlvX2Jhc2UgKyBOVl9JTlRfRU5BQkxFX0NLODA0KTsKKwltYXNrIHw9IChOVl9JTlRfTUFTSyA8PCBzaGlmdCk7CisJd3JpdGViKG1hc2ssIG1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOworfQorCitzdGF0aWMgaW50IG52X2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQoreworCXVuc2lnbmVkIGludCBkdW1teTsKKworCS8qIFNBVEEgaGFyZHJlc2V0IGZhaWxzIHRvIHJldHJpZXZlIHByb3BlciBkZXZpY2Ugc2lnbmF0dXJlIG9uCisJICogc29tZSBjb250cm9sbGVycy4gIERvbid0IGNsYXNzaWZ5IG9uIGhhcmRyZXNldC4gIEZvciBtb3JlCisJICogaW5mbywgc2VlIGh0dHA6Ly9idWdtZS5vc2RsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzM1MgorCSAqLworCXJldHVybiBzYXRhX3N0ZF9oYXJkcmVzZXQoYXAsICZkdW1teSk7Cit9CisKK3N0YXRpYyB2b2lkIG52X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlhdGFfYm1kbWFfZHJpdmVfZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LAorCQkJICAgbnZfaGFyZHJlc2V0LCBhdGFfc3RkX3Bvc3RyZXNldCk7CiB9CiAKIHN0YXRpYyBpbnQgbnZfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewogCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uID0gMDsKLQlzdHJ1Y3QgbnZfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgYXRhX3BvcnRfaW5mbyAqcHBpOwogCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CiAJaW50IHBjaV9kZXZfYnVzeSA9IDA7CkBAIC0zNzAsMjQgKzUyMSwxNSBAQAogCiAJcmMgPSAtRU5PTUVNOwogCi0JcHBpID0gJm52X3BvcnRfaW5mbzsKKwlwcGkgPSAmbnZfcG9ydF9pbmZvW2VudC0+ZHJpdmVyX2RhdGFdOwogCXByb2JlX2VudCA9IGF0YV9wY2lfaW5pdF9uYXRpdmVfbW9kZShwZGV2LCAmcHBpLCBBVEFfUE9SVF9QUklNQVJZIHwgQVRBX1BPUlRfU0VDT05EQVJZKTsKIAlpZiAoIXByb2JlX2VudCkKIAkJZ290byBlcnJfb3V0X3JlZ2lvbnM7CiAKLQlob3N0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG52X2hvc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWhvc3QpCi0JCWdvdG8gZXJyX291dF9mcmVlX2VudDsKLQotCW1lbXNldChob3N0LCAwLCBzaXplb2Yoc3RydWN0IG52X2hvc3QpKTsKLQlob3N0LT5ob3N0X2Rlc2MgPSAmbnZfZGV2aWNlX3RibFtlbnQtPmRyaXZlcl9kYXRhXTsKLQotCXByb2JlX2VudC0+cHJpdmF0ZV9kYXRhID0gaG9zdDsKLQogCXByb2JlX2VudC0+bW1pb19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDUsIDApOwogCWlmICghcHJvYmVfZW50LT5tbWlvX2Jhc2UpIHsKIAkJcmMgPSAtRUlPOwotCQlnb3RvIGVycl9vdXRfZnJlZV9ob3N0OworCQlnb3RvIGVycl9vdXRfZnJlZV9lbnQ7CiAJfQogCiAJYmFzZSA9ICh1bnNpZ25lZCBsb25nKXByb2JlX2VudC0+bW1pb19iYXNlOwpAQCAtMzk1LDI0ICs1MzcsMjcgQEAKIAlwcm9iZV9lbnQtPnBvcnRbMF0uc2NyX2FkZHIgPSBiYXNlICsgTlZfUE9SVDBfU0NSX1JFR19PRkZTRVQ7CiAJcHJvYmVfZW50LT5wb3J0WzFdLnNjcl9hZGRyID0gYmFzZSArIE5WX1BPUlQxX1NDUl9SRUdfT0ZGU0VUOwogCisJLyogZW5hYmxlIFNBVEEgc3BhY2UgZm9yIENLODA0ICovCisJaWYgKGVudC0+ZHJpdmVyX2RhdGEgPT0gQ0s4MDQpIHsKKwkJdTggcmVndmFsOworCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgJnJlZ3ZhbCk7CisJCXJlZ3ZhbCB8PSBOVl9NQ1BfU0FUQV9DRkdfMjBfU0FUQV9TUEFDRV9FTjsKKwkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgcmVndmFsKTsKKwl9CisKIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCXJjID0gYXRhX2RldmljZV9hZGQocHJvYmVfZW50KTsKIAlpZiAocmMgIT0gTlZfUE9SVFMpCiAJCWdvdG8gZXJyX291dF9pb3VubWFwOwogCi0JLy8gRW5hYmxlIGhvdHBsdWcgZXZlbnQgaW50ZXJydXB0cy4KLQlpZiAoaG9zdC0+aG9zdF9kZXNjLT5lbmFibGVfaG90cGx1ZykKLQkJaG9zdC0+aG9zdF9kZXNjLT5lbmFibGVfaG90cGx1Zyhwcm9iZV9lbnQpOwotCiAJa2ZyZWUocHJvYmVfZW50KTsKIAogCXJldHVybiAwOwogCiBlcnJfb3V0X2lvdW5tYXA6CiAJcGNpX2lvdW5tYXAocGRldiwgcHJvYmVfZW50LT5tbWlvX2Jhc2UpOwotZXJyX291dF9mcmVlX2hvc3Q6Ci0Ja2ZyZWUoaG9zdCk7CiBlcnJfb3V0X2ZyZWVfZW50OgogCWtmcmVlKHByb2JlX2VudCk7CiBlcnJfb3V0X3JlZ2lvbnM6CkBAIC00MjQsMTI3ICs1NjksMTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIG52X2VuYWJsZV9ob3RwbHVnKHN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQpCi17Ci0JdTggaW50cl9tYXNrOwotCi0Jb3V0YihOVl9JTlRfU1RBVFVTX0hPVFBMVUcsCi0JCXByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciArIE5WX0lOVF9TVEFUVVMpOwotCi0JaW50cl9tYXNrID0gaW5iKHByb2JlX2VudC0+cG9ydFswXS5zY3JfYWRkciArIE5WX0lOVF9FTkFCTEUpOwotCWludHJfbWFzayB8PSBOVl9JTlRfRU5BQkxFX0hPVFBMVUc7Ci0KLQlvdXRiKGludHJfbWFzaywgcHJvYmVfZW50LT5wb3J0WzBdLnNjcl9hZGRyICsgTlZfSU5UX0VOQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG52X2Rpc2FibGVfaG90cGx1ZyhzdHJ1Y3QgYXRhX2hvc3Rfc2V0ICpob3N0X3NldCkKLXsKLQl1OCBpbnRyX21hc2s7Ci0KLQlpbnRyX21hc2sgPSBpbmIoaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKLQotCWludHJfbWFzayAmPSB+KE5WX0lOVF9FTkFCTEVfSE9UUExVRyk7Ci0KLQlvdXRiKGludHJfbWFzaywgaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfRU5BQkxFKTsKLX0KLQotc3RhdGljIGludCBudl9jaGVja19ob3RwbHVnKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQotewotCXU4IGludHJfc3RhdHVzOwotCi0JaW50cl9zdGF0dXMgPSBpbmIoaG9zdF9zZXQtPnBvcnRzWzBdLT5pb2FkZHIuc2NyX2FkZHIgKyBOVl9JTlRfU1RBVFVTKTsKLQotCS8vIENsZWFyIGludGVycnVwdCBzdGF0dXMuCi0Jb3V0YigweGZmLCBob3N0X3NldC0+cG9ydHNbMF0tPmlvYWRkci5zY3JfYWRkciArIE5WX0lOVF9TVEFUVVMpOwotCi0JaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19IT1RQTFVHKSB7Ci0JCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9BRERFRCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKLQkJCQkiUHJpbWFyeSBkZXZpY2UgYWRkZWRcbiIpOwotCi0JCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfUERFVl9SRU1PVkVEKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgotCQkJCSJQcmltYXJ5IGRldmljZSByZW1vdmVkXG4iKTsKLQotCQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX1NERVZfQURERUQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCi0JCQkJIlNlY29uZGFyeSBkZXZpY2UgYWRkZWRcbiIpOwotCi0JCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfU0RFVl9SRU1PVkVEKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgotCQkJCSJTZWNvbmRhcnkgZGV2aWNlIHJlbW92ZWRcbiIpOwotCi0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBudl9lbmFibGVfaG90cGx1Z19jazgwNChzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqcHJvYmVfZW50KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihwcm9iZV9lbnQtPmRldik7Ci0JdTggaW50cl9tYXNrOwotCXU4IHJlZ3ZhbDsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgJnJlZ3ZhbCk7Ci0JcmVndmFsIHw9IE5WX01DUF9TQVRBX0NGR18yMF9TQVRBX1NQQUNFX0VOOwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsIHJlZ3ZhbCk7Ci0KLQl3cml0ZWIoTlZfSU5UX1NUQVRVU19IT1RQTFVHLCBwcm9iZV9lbnQtPm1taW9fYmFzZSArIE5WX0lOVF9TVEFUVVNfQ0s4MDQpOwotCi0JaW50cl9tYXNrID0gcmVhZGIocHJvYmVfZW50LT5tbWlvX2Jhc2UgKyBOVl9JTlRfRU5BQkxFX0NLODA0KTsKLQlpbnRyX21hc2sgfD0gTlZfSU5UX0VOQUJMRV9IT1RQTFVHOwotCi0Jd3JpdGViKGludHJfbWFzaywgcHJvYmVfZW50LT5tbWlvX2Jhc2UgKyBOVl9JTlRfRU5BQkxFX0NLODA0KTsKLX0KLQotc3RhdGljIHZvaWQgbnZfZGlzYWJsZV9ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQorc3RhdGljIHZvaWQgbnZfY2s4MDRfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2Rldihob3N0X3NldC0+ZGV2KTsKLQl1OCBpbnRyX21hc2s7CiAJdTggcmVndmFsOwogCi0JaW50cl9tYXNrID0gcmVhZGIoaG9zdF9zZXQtPm1taW9fYmFzZSArIE5WX0lOVF9FTkFCTEVfQ0s4MDQpOwotCi0JaW50cl9tYXNrICY9IH4oTlZfSU5UX0VOQUJMRV9IT1RQTFVHKTsKLQotCXdyaXRlYihpbnRyX21hc2ssIGhvc3Rfc2V0LT5tbWlvX2Jhc2UgKyBOVl9JTlRfRU5BQkxFX0NLODA0KTsKLQorCS8qIGRpc2FibGUgU0FUQSBzcGFjZSBmb3IgQ0s4MDQgKi8KIAlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBOVl9NQ1BfU0FUQV9DRkdfMjAsICZyZWd2YWwpOwogCXJlZ3ZhbCAmPSB+TlZfTUNQX1NBVEFfQ0ZHXzIwX1NBVEFfU1BBQ0VfRU47CiAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIE5WX01DUF9TQVRBX0NGR18yMCwgcmVndmFsKTsKLX0KIAotc3RhdGljIGludCBudl9jaGVja19ob3RwbHVnX2NrODA0KHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KQotewotCXU4IGludHJfc3RhdHVzOwotCi0JaW50cl9zdGF0dXMgPSByZWFkYihob3N0X3NldC0+bW1pb19iYXNlICsgTlZfSU5UX1NUQVRVU19DSzgwNCk7Ci0KLQkvLyBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzLgotCXdyaXRlYigweGZmLCBob3N0X3NldC0+bW1pb19iYXNlICsgTlZfSU5UX1NUQVRVU19DSzgwNCk7Ci0KLQlpZiAoaW50cl9zdGF0dXMgJiBOVl9JTlRfU1RBVFVTX0hPVFBMVUcpIHsKLQkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19QREVWX0FEREVEKQotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibnZfc2F0YTogIgotCQkJCSJQcmltYXJ5IGRldmljZSBhZGRlZFxuIik7Ci0KLQkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19QREVWX1JFTU9WRUQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCi0JCQkJIlByaW1hcnkgZGV2aWNlIHJlbW92ZWRcbiIpOwotCi0JCWlmIChpbnRyX3N0YXR1cyAmIE5WX0lOVF9TVEFUVVNfU0RFVl9BRERFRCkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm52X3NhdGE6ICIKLQkJCQkiU2Vjb25kYXJ5IGRldmljZSBhZGRlZFxuIik7Ci0KLQkJaWYgKGludHJfc3RhdHVzICYgTlZfSU5UX1NUQVRVU19TREVWX1JFTU9WRUQpCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICJudl9zYXRhOiAiCi0JCQkJIlNlY29uZGFyeSBkZXZpY2UgcmVtb3ZlZFxuIik7Ci0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7CisJYXRhX3BjaV9ob3N0X3N0b3AoaG9zdF9zZXQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBudl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9wcm9taXNlLmMKaW5kZXggN2ViNjdhNi4uYjJiNmVkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfcHJvbWlzZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Byb21pc2UuYwpAQCAtNzYsNyArNzYsOCBAQAogCVBEQ19SRVNFVAkJPSAoMSA8PCAxMSksIC8qIEhETUEgcmVzZXQgKi8KIAogCVBEQ19DT01NT05fRkxBR1MJPSBBVEFfRkxBR19OT19MRUdBQ1kgfCBBVEFfRkxBR19TUlNUIHwKLQkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OT19BVEFQSSwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19OT19BVEFQSSB8CisJCQkJICBBVEFfRkxBR19QSU9fUE9MTElORywKIH07CiAKIApAQCAtMTIwLDYgKzEyMSw3IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTEzNiw2ICsxMzgsNyBAQAogCS5xY19wcmVwCQk9IHBkY19xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBwZGNfcWNfaXNzdWVfcHJvdCwKIAkuZW5nX3RpbWVvdXQJCT0gcGRjX2VuZ190aW1lb3V0LAorCS5kYXRhX3hmZXIJCT0gYXRhX21taW9fZGF0YV94ZmVyLAogCS5pcnFfaGFuZGxlcgkJPSBwZGNfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gcGRjX2lycV9jbGVhciwKIApAQCAtMTU4LDYgKzE2MSw3IEBACiAKIAkucWNfcHJlcAkJPSBwZGNfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gcGRjX3FjX2lzc3VlX3Byb3QsCisJLmRhdGFfeGZlcgkJPSBhdGFfbW1pb19kYXRhX3hmZXIsCiAJLmVuZ190aW1lb3V0CQk9IHBkY19lbmdfdGltZW91dCwKIAkuaXJxX2hhbmRsZXIJCT0gcGRjX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHBkY19pcnFfY2xlYXIsCkBAIC0zNjMsMTIgKzM2NywyMyBAQAogCXNhdGFfcGh5X3Jlc2V0KGFwKTsKIH0KIAorc3RhdGljIHZvaWQgcGRjX3BhdGFfY2JsX2RldGVjdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXU4IHRtcDsKKwl2b2lkIF9faW9tZW0gKm1taW8gPSAodm9pZCAqKSBhcC0+aW9hZGRyLmNtZF9hZGRyICsgUERDX0NUTFNUQVQgKyAweDAzOworCisJdG1wID0gcmVhZGIobW1pbyk7CisKKwlpZiAodG1wICYgMHgwMSkgeworCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBNDA7CisJCWFwLT51ZG1hX21hc2sgJj0gQVRBX1VETUFfTUFTS180MEM7CisJfSBlbHNlCisJCWFwLT5jYmwgPSBBVEFfQ0JMX1BBVEE4MDsKK30KKwogc3RhdGljIHZvaWQgcGRjX3BhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JLyogRklYTUU6IGFkZCBjYWJsZSBkZXRlY3QuICBEb24ndCBhc3N1bWUgNDAtcGluIGNhYmxlICovCi0JYXAtPmNibCA9IEFUQV9DQkxfUEFUQTQwOwotCWFwLT51ZG1hX21hc2sgJj0gQVRBX1VETUFfTUFTS180MEM7Ci0KKwlwZGNfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKIAlwZGNfcmVzZXRfcG9ydChhcCk7CiAJYXRhX3BvcnRfcHJvYmUoYXApOwogCWF0YV9idXNfcmVzZXQoYXApOwpAQCAtNDM1LDcgKzQ1MCw3IEBACiAJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKIAljYXNlIEFUQV9QUk9UX0RNQToKIAljYXNlIEFUQV9QUk9UX05PREFUQToKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogY29tbWFuZCB0aW1lb3V0XG4iLCBhcC0+aWQpOworCQlhdGFfcG9ydF9wcmludGsoYXAsIEtFUk5fRVJSLCAiY29tbWFuZCB0aW1lb3V0XG4iKTsKIAkJZHJ2X3N0YXQgPSBhdGFfd2FpdF9pZGxlKGFwKTsKIAkJcWMtPmVycl9tYXNrIHw9IF9fYWNfZXJyX21hc2soZHJ2X3N0YXQpOwogCQlicmVhazsKQEAgLTQ0Myw4ICs0NTgsOSBAQAogCWRlZmF1bHQ6CiAJCWRydl9zdGF0ID0gYXRhX2J1c3lfd2FpdChhcCwgQVRBX0JVU1kgfCBBVEFfRFJRLCAxMDAwKTsKIAotCQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiB1bmtub3duIHRpbWVvdXQsIGNtZCAweCV4IHN0YXQgMHgleFxuIiwKLQkJICAgICAgIGFwLT5pZCwgcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKKwkJCQkidW5rbm93biB0aW1lb3V0LCBjbWQgMHgleCBzdGF0IDB4JXhcbiIsCisJCQkJcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKIAogCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2soZHJ2X3N0YXQpOwogCQlicmVhazsKQEAgLTUzMywxMSArNTQ5LDExIEBACiAJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOwogCQl0bXAgPSBtYXNrICYgKDEgPDwgKGkgKyAxKSk7CiAJCWlmICh0bXAgJiYgYXAgJiYKLQkJICAgICEoYXAtPmZsYWdzICYgKEFUQV9GTEFHX1BPUlRfRElTQUJMRUQgfCBBVEFfRkxBR19OT0lOVFIpKSkgeworCQkgICAgIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpIHsKIAkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAKIAkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JCQlpZiAocWMgJiYgKCEocWMtPnRmLmN0bCAmIEFUQV9OSUVOKSkpCisJCQlpZiAocWMgJiYgKCEocWMtPnRmLmZsYWdzICYgQVRBX1RGTEFHX1BPTExJTkcpKSkKIAkJCQloYW5kbGVkICs9IHBkY19ob3N0X2ludHIoYXAsIHFjKTsKIAkJfQogCX0KQEAgLTY3NiwxMCArNjkyLDYgQEAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKLQkvKgotCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgotCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECi0JICovCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9xc3Rvci5jCmluZGV4IDg4NmYzNDQuLjk4ZGRjMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3FzdG9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfcXN0b3IuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3FzdG9yIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4wNSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMDYiCiAKIGVudW0gewogCVFTX1BPUlRTCQk9IDQsCkBAIC0xNDIsNiArMTQyLDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gUVNfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCkBAIC0xNTYsNiArMTU3LDcgQEAKIAkucGh5X3Jlc2V0CQk9IHFzX3BoeV9yZXNldCwKIAkucWNfcHJlcAkJPSBxc19xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBxc19xY19pc3N1ZSwKKwkuZGF0YV94ZmVyCQk9IGF0YV9tbWlvX2RhdGFfeGZlciwKIAkuZW5nX3RpbWVvdXQJCT0gcXNfZW5nX3RpbWVvdXQsCiAJLmlycV9oYW5kbGVyCQk9IHFzX2ludHIsCiAJLmlycV9jbGVhcgkJPSBxc19pcnFfY2xlYXIsCkBAIC0xNzUsNyArMTc3LDcgQEAKIAkJLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKIAkJCQkgIEFUQV9GTEFHX1NBVEFfUkVTRVQgfAogCQkJCSAgLy9GSVhNRSBBVEFfRkxBR19TUlNUIHwKLQkJCQkgIEFUQV9GTEFHX01NSU8sCisJCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX1BPTExJTkcsCiAJCS5waW9fbWFzawk9IDB4MTAsIC8qIHBpbzQgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgKi8KIAkJLnBvcnRfb3BzCT0gJnFzX2F0YV9vcHMsCkBAIC0zOTQsMTQgKzM5NiwxMyBAQAogCQkJRFBSSU5USygiU0ZGPSUwOHglMDh4OiBzQ0hBTj0ldSBzSFNUPSVkIHNEU1Q9JTAyeFxuIiwKIAkJCQkJc2ZmMSwgc2ZmMCwgcG9ydF9ubywgc0hTVCwgc0RTVCk7CiAJCQloYW5kbGVkID0gMTsKLQkJCWlmIChhcCAmJiAhKGFwLT5mbGFncyAmCi0JCQkJICAgIChBVEFfRkxBR19QT1JUX0RJU0FCTEVEfEFUQV9GTEFHX05PSU5UUikpKSB7CisJCQlpZiAoYXAgJiYgIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpIHsKIAkJCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOwogCQkJCXN0cnVjdCBxc19wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAkJCQlpZiAoIXBwIHx8IHBwLT5zdGF0ZSAhPSBxc19zdGF0ZV9wa3QpCiAJCQkJCWNvbnRpbnVlOwogCQkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKSB7CisJCQkJaWYgKHFjICYmICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpIHsKIAkJCQkJc3dpdGNoIChzSFNUKSB7CiAJCQkJCWNhc2UgMDogLyogc3VjY2Vzc2Z1bCBDUEIgKi8KIAkJCQkJY2FzZSAzOiAvKiBkZXZpY2UgZXJyb3IgKi8KQEAgLTQyOCwxMyArNDI5LDEzIEBACiAJCXN0cnVjdCBhdGFfcG9ydCAqYXA7CiAJCWFwID0gaG9zdF9zZXQtPnBvcnRzW3BvcnRfbm9dOwogCQlpZiAoYXAgJiYKLQkJICAgICEoYXAtPmZsYWdzICYgKEFUQV9GTEFHX1BPUlRfRElTQUJMRUQgfCBBVEFfRkxBR19OT0lOVFIpKSkgeworCQkgICAgIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19ESVNBQkxFRCkpIHsKIAkJCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAJCQlzdHJ1Y3QgcXNfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJCQlpZiAoIXBwIHx8IHBwLT5zdGF0ZSAhPSBxc19zdGF0ZV9tbWlvKQogCQkJCWNvbnRpbnVlOwogCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKLQkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkgeworCQkJaWYgKHFjICYmICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpIHsKIAogCQkJCS8qIGNoZWNrIG1haW4gc3RhdHVzLCBjbGVhcmluZyBJTlRSUSAqLwogCQkJCXU4IHN0YXR1cyA9IGF0YV9jaGVja19zdGF0dXMoYXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfc2lsLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwppbmRleCAxMDY2MjcyLi5iYzlmOTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwuYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3NpbCIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuOSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMCIKIAogZW51bSB7CiAJLyoKQEAgLTU0LDggKzU0LDkgQEAKIAkgKi8KIAlTSUxfRkxBR19SRVJSX09OX0RNQV9BQ1QgPSAoMSA8PCAyOSksCiAJU0lMX0ZMQUdfTU9EMTVXUklURQk9ICgxIDw8IDMwKSwKKwogCVNJTF9ERkxfSE9TVF9GTEFHUwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1kgfAotCQkJCSAgQVRBX0ZMQUdfTU1JTywKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19IUlNUX1RPX1JFU1VNRSwKIAogCS8qCiAJICogQ29udHJvbGxlciBJRHMKQEAgLTg0LDYgKzg1LDIwIEBACiAJLyogQk1ETUEvQk1ETUEyICovCiAJU0lMX0lOVFJfU1RFRVJJTkcJPSAoMSA8PCAxKSwKIAorCVNJTF9ETUFfRU5BQkxFCQk9ICgxIDw8IDApLCAgLyogRE1BIHJ1biBzd2l0Y2ggKi8KKwlTSUxfRE1BX1JEV1IJCT0gKDEgPDwgMyksICAvKiBETUEgUmQtV3IgKi8KKwlTSUxfRE1BX1NBVEFfSVJRCT0gKDEgPDwgNCksICAvKiBPUiBvZiBhbGwgU0FUQSBJUlFzICovCisJU0lMX0RNQV9BQ1RJVkUJCT0gKDEgPDwgMTYpLCAvKiBETUEgcnVubmluZyAqLworCVNJTF9ETUFfRVJST1IJCT0gKDEgPDwgMTcpLCAvKiBQQ0kgYnVzIGVycm9yICovCisJU0lMX0RNQV9DT01QTEVURQk9ICgxIDw8IDE4KSwgLyogY21kIGNvbXBsZXRlIC8gSVJRIHBlbmRpbmcgKi8KKwlTSUxfRE1BX05fU0FUQV9JUlEJPSAoMSA8PCA2KSwgIC8qIFNBVEFfSVJRIGZvciB0aGUgbmV4dCBjaGFubmVsICovCisJU0lMX0RNQV9OX0FDVElWRQk9ICgxIDw8IDI0KSwgLyogQUNUSVZFIGZvciB0aGUgbmV4dCBjaGFubmVsICovCisJU0lMX0RNQV9OX0VSUk9SCQk9ICgxIDw8IDI1KSwgLyogRVJST1IgZm9yIHRoZSBuZXh0IGNoYW5uZWwgKi8KKwlTSUxfRE1BX05fQ09NUExFVEUJPSAoMSA8PCAyNiksIC8qIENPTVBMRVRFIGZvciB0aGUgbmV4dCBjaGFubmVsICovCisKKwkvKiBTSUVOICovCisJU0lMX1NJRU5fTgkJPSAoMSA8PCAxNiksIC8qIHRyaWdnZXJlZCBieSBTRXJyb3IuTiAqLworCiAJLyoKIAkgKiBPdGhlcnMKIAkgKi8KQEAgLTk2LDYgKzExMSwxMCBAQAogc3RhdGljIHUzMiBzaWxfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpOwogc3RhdGljIHZvaWQgc2lsX3Njcl93cml0ZSAoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHNjX3JlZywgdTMyIHZhbCk7CiBzdGF0aWMgdm9pZCBzaWxfcG9zdF9zZXRfbW9kZSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgaXJxcmV0dXJuX3Qgc2lsX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsCisJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK3N0YXRpYyB2b2lkIHNpbF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBzaWxfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgc2lsX3BjaV90YmxbXSA9IHsKQEAgLTE1NSw2ICsxNzQsNyBAQAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCkBAIC0xNjYsNyArMTg2LDYgQEAKIAkuY2hlY2tfc3RhdHVzCQk9IGF0YV9jaGVja19zdGF0dXMsCiAJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKLQkucHJvYmVfcmVzZXQJCT0gYXRhX3N0ZF9wcm9iZV9yZXNldCwKIAkucG9zdF9zZXRfbW9kZQkJPSBzaWxfcG9zdF9zZXRfbW9kZSwKIAkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKQEAgLTE3NCw4ICsxOTMsMTIgQEAKIAkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCiAJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCi0JLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCisJLmRhdGFfeGZlcgkJPSBhdGFfbW1pb19kYXRhX3hmZXIsCisJLmZyZWV6ZQkJCT0gc2lsX2ZyZWV6ZSwKKwkudGhhdwkJCT0gc2lsX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAorCS5pcnFfaGFuZGxlcgkJPSBzaWxfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuc2NyX3JlYWQJCT0gc2lsX3Njcl9yZWFkLAogCS5zY3Jfd3JpdGUJCT0gc2lsX3Njcl93cml0ZSwKQEAgLTIyMCw2ICsyNDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgdGY7CS8qIEFUQSB0YXNrZmlsZSByZWdpc3RlciBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgY3RsOwkvKiBBVEEgY29udHJvbC9hbHRzdGF0dXMgcmVnaXN0ZXIgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIGJtZG1hOwkvKiBETUEgcmVnaXN0ZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nIGJtZG1hMjsJLyogRE1BIHJlZ2lzdGVyIGJsb2NrICMyICovCiAJdW5zaWduZWQgbG9uZyBmaWZvX2NmZzsJLyogRklGTyBWYWxpZCBCeXRlIENvdW50IGFuZCBDb250cm9sICovCiAJdW5zaWduZWQgbG9uZyBzY3I7CS8qIFNBVEEgY29udHJvbCByZWdpc3RlciBibG9jayAqLwogCXVuc2lnbmVkIGxvbmcgc2llbjsJLyogU0FUQSBJbnRlcnJ1cHQgRW5hYmxlIHJlZ2lzdGVyICovCkBAIC0yMjcsMTAgKzI1MSwxMCBAQAogCXVuc2lnbmVkIGxvbmcgc2Zpc19jZmc7CS8qIFNBVEEgRklTIHJlY2VwdGlvbiBjb25maWcgcmVnaXN0ZXIgKi8KIH0gc2lsX3BvcnRbXSA9IHsKIAkvKiBwb3J0IDAgLi4uICovCi0JeyAweDgwLCAweDhBLCAweDAwLCAweDQwLCAweDEwMCwgMHgxNDgsIDB4YjQsIDB4MTRjIH0sCi0JeyAweEMwLCAweENBLCAweDA4LCAweDQ0LCAweDE4MCwgMHgxYzgsIDB4ZjQsIDB4MWNjIH0sCi0JeyAweDI4MCwgMHgyOEEsIDB4MjAwLCAweDI0MCwgMHgzMDAsIDB4MzQ4LCAweDJiNCwgMHgzNGMgfSwKLQl7IDB4MkMwLCAweDJDQSwgMHgyMDgsIDB4MjQ0LCAweDM4MCwgMHgzYzgsIDB4MmY0LCAweDNjYyB9LAorCXsgMHg4MCwgMHg4QSwgMHgwMCwgMHgxMCwgMHg0MCwgMHgxMDAsIDB4MTQ4LCAweGI0LCAweDE0YyB9LAorCXsgMHhDMCwgMHhDQSwgMHgwOCwgMHgxOCwgMHg0NCwgMHgxODAsIDB4MWM4LCAweGY0LCAweDFjYyB9LAorCXsgMHgyODAsIDB4MjhBLCAweDIwMCwgMHgyMTAsIDB4MjQwLCAweDMwMCwgMHgzNDgsIDB4MmI0LCAweDM0YyB9LAorCXsgMHgyQzAsIDB4MkNBLCAweDIwOCwgMHgyMTgsIDB4MjQ0LCAweDM4MCwgMHgzYzgsIDB4MmY0LCAweDNjYyB9LAogCS8qIC4uLiBwb3J0IDMgKi8KIH07CiAKQEAgLTI2Myw3ICsyODcsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogCQlkZXYgPSAmYXAtPmRldmljZVtpXTsKLQkJaWYgKCFhdGFfZGV2X3ByZXNlbnQoZGV2KSkKKwkJaWYgKCFhdGFfZGV2X2VuYWJsZWQoZGV2KSkKIAkJCWRldl9tb2RlW2ldID0gMDsJLyogUElPMC8xLzIgKi8KIAkJZWxzZSBpZiAoZGV2LT5mbGFncyAmIEFUQV9ERkxBR19QSU8pCiAJCQlkZXZfbW9kZVtpXSA9IDE7CS8qIFBJTzMvNCAqLwpAQCAtMzE0LDYgKzMzOCwxNTEgQEAKIAkJd3JpdGVsKHZhbCwgbW1pbyk7CiB9CiAKK3N0YXRpYyB2b2lkIHNpbF9ob3N0X2ludHIoc3RydWN0IGF0YV9wb3J0ICphcCwgdTMyIGJtZG1hMikKK3sKKwlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7CisJdTggc3RhdHVzOworCisJaWYgKHVubGlrZWx5KGJtZG1hMiAmIFNJTF9ETUFfU0FUQV9JUlEpKSB7CisJCXUzMiBzZXJyb3I7CisKKwkJLyogU0lFTiBkb2Vzbid0IG1hc2sgU0FUQSBJUlFzIG9uIHNvbWUgMzExMnMuICBUaG9zZQorCQkgKiBjb250cm9sbGVycyBjb250aW51ZSB0byBhc3NlcnQgSVJRIGFzIGxvbmcgYXMKKwkJICogU0Vycm9yIGJpdHMgYXJlIHBlbmRpbmcuICBDbGVhciBTRXJyb3IgaW1tZWRpYXRlbHkuCisJCSAqLworCQlzZXJyb3IgPSBzaWxfc2NyX3JlYWQoYXAsIFNDUl9FUlJPUik7CisJCXNpbF9zY3Jfd3JpdGUoYXAsIFNDUl9FUlJPUiwgc2Vycm9yKTsKKworCQkvKiBUcmlnZ2VyIGhvdHBsdWcgYW5kIGFjY3VtdWxhdGUgU0Vycm9yIG9ubHkgaWYgdGhlCisJCSAqIHBvcnQgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uICBPdGhlcndpc2UsIFBIWSBldmVudHMKKwkJICogZHVyaW5nIGhhcmRyZXNldCBtYWtlcyBjb250cm9sbGVycyB3aXRoIGJyb2tlbiBTSUVOCisJCSAqIHJlcGVhdCBwcm9iaW5nIG5lZWRsZXNzbHkuCisJCSAqLworCQlpZiAoIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19GUk9aRU4pKSB7CisJCQlhdGFfZWhpX2hvdHBsdWdnZWQoJmFwLT5laF9pbmZvKTsKKwkJCWFwLT5laF9pbmZvLnNlcnJvciB8PSBzZXJyb3I7CisJCX0KKworCQlnb3RvIGZyZWV6ZTsKKwl9CisKKwlpZiAodW5saWtlbHkoIXFjIHx8IHFjLT50Zi5jdGwgJiBBVEFfTklFTikpCisJCWdvdG8gZnJlZXplOworCisJLyogQ2hlY2sgd2hldGhlciB3ZSBhcmUgZXhwZWN0aW5nIGludGVycnVwdCBpbiB0aGlzIHN0YXRlICovCisJc3dpdGNoIChhcC0+aHNtX3Rhc2tfc3RhdGUpIHsKKwljYXNlIEhTTV9TVF9GSVJTVDoKKwkJLyogU29tZSBwcmUtQVRBUEktNCBkZXZpY2VzIGFzc2VydCBJTlRSUQorCQkgKiBhdCB0aGlzIHN0YXRlIHdoZW4gcmVhZHkgdG8gcmVjZWl2ZSBDREIuCisJCSAqLworCisJCS8qIENoZWNrIHRoZSBBVEFfREZMQUdfQ0RCX0lOVFIgZmxhZyBpcyBlbm91Z2ggaGVyZS4KKwkJICogVGhlIGZsYWcgd2FzIHR1cm5lZCBvbiBvbmx5IGZvciBhdGFwaSBkZXZpY2VzLgorCQkgKiBObyBuZWVkIHRvIGNoZWNrIGlzX2F0YXBpX3Rhc2tmaWxlKCZxYy0+dGYpIGFnYWluLgorCQkgKi8KKwkJaWYgKCEocWMtPmRldi0+ZmxhZ3MgJiBBVEFfREZMQUdfQ0RCX0lOVFIpKQorCQkJZ290byBlcnJfaHNtOworCQlicmVhazsKKwljYXNlIEhTTV9TVF9MQVNUOgorCQlpZiAocWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0RNQSB8fAorCQkgICAgcWMtPnRmLnByb3RvY29sID09IEFUQV9QUk9UX0FUQVBJX0RNQSkgeworCQkJLyogY2xlYXIgRE1BLVN0YXJ0IGJpdCAqLworCQkJYXAtPm9wcy0+Ym1kbWFfc3RvcChxYyk7CisKKwkJCWlmIChibWRtYTIgJiBTSUxfRE1BX0VSUk9SKSB7CisJCQkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IT1NUX0JVUzsKKwkJCQlhcC0+aHNtX3Rhc2tfc3RhdGUgPSBIU01fU1RfRVJSOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgSFNNX1NUOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGVycl9oc207CisJfQorCisJLyogY2hlY2sgbWFpbiBzdGF0dXMsIGNsZWFyaW5nIElOVFJRICovCisJc3RhdHVzID0gYXRhX2Noa19zdGF0dXMoYXApOworCWlmICh1bmxpa2VseShzdGF0dXMgJiBBVEFfQlVTWSkpCisJCWdvdG8gZXJyX2hzbTsKKworCS8qIGFjayBibWRtYSBpcnEgZXZlbnRzICovCisJYXRhX2JtZG1hX2lycV9jbGVhcihhcCk7CisKKwkvKiBraWNrIEhTTSBpbiB0aGUgYXNzICovCisJYXRhX2hzbV9tb3ZlKGFwLCBxYywgc3RhdHVzLCAwKTsKKworCXJldHVybjsKKworIGVycl9oc206CisJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9IU007CisgZnJlZXplOgorCWF0YV9wb3J0X2ZyZWV6ZShhcCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzaWxfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSwKKwkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQgPSBkZXZfaW5zdGFuY2U7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBob3N0X3NldC0+bW1pb19iYXNlOworCWludCBoYW5kbGVkID0gMDsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmaG9zdF9zZXQtPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IGhvc3Rfc2V0LT5uX3BvcnRzOyBpKyspIHsKKwkJc3RydWN0IGF0YV9wb3J0ICphcCA9IGhvc3Rfc2V0LT5wb3J0c1tpXTsKKwkJdTMyIGJtZG1hMiA9IHJlYWRsKG1taW9fYmFzZSArIHNpbF9wb3J0W2FwLT5wb3J0X25vXS5ibWRtYTIpOworCisJCWlmICh1bmxpa2VseSghYXAgfHwgYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKQorCQkJY29udGludWU7CisKKwkJaWYgKGJtZG1hMiA9PSAweGZmZmZmZmZmIHx8CisJCSAgICAhKGJtZG1hMiAmIChTSUxfRE1BX0NPTVBMRVRFIHwgU0lMX0RNQV9TQVRBX0lSUSkpKQorCQkJY29udGludWU7CisKKwkJc2lsX2hvc3RfaW50cihhcCwgYm1kbWEyKTsKKwkJaGFuZGxlZCA9IDE7CisJfQorCisJc3Bpbl91bmxvY2soJmhvc3Rfc2V0LT5sb2NrKTsKKworCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCitzdGF0aWMgdm9pZCBzaWxfZnJlZXplKHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl1MzIgdG1wOworCisJLyogZ2xvYmFsIElSUSBtYXNrIGRvZXNuJ3QgYmxvY2sgU0FUQSBJUlEsIHR1cm4gb2ZmIGV4cGxpY2l0bHkgKi8KKwl3cml0ZWwoMCwgbW1pb19iYXNlICsgc2lsX3BvcnRbYXAtPnBvcnRfbm9dLnNpZW4pOworCisJLyogcGx1ZyBJUlEgKi8KKwl0bXAgPSByZWFkbChtbWlvX2Jhc2UgKyBTSUxfU1lTQ0ZHKTsKKwl0bXAgfD0gU0lMX01BU0tfSURFMF9JTlQgPDwgYXAtPnBvcnRfbm87CisJd3JpdGVsKHRtcCwgbW1pb19iYXNlICsgU0lMX1NZU0NGRyk7CisJcmVhZGwobW1pb19iYXNlICsgU0lMX1NZU0NGRyk7CS8qIGZsdXNoICovCit9CisKK3N0YXRpYyB2b2lkIHNpbF90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2UgPSBhcC0+aG9zdF9zZXQtPm1taW9fYmFzZTsKKwl1MzIgdG1wOworCisJLyogY2xlYXIgSVJRICovCisJYXRhX2Noa19zdGF0dXMoYXApOworCWF0YV9ibWRtYV9pcnFfY2xlYXIoYXApOworCisJLyogdHVybiBvbiBTQVRBIElSUSAqLworCXdyaXRlbChTSUxfU0lFTl9OLCBtbWlvX2Jhc2UgKyBzaWxfcG9ydFthcC0+cG9ydF9ub10uc2llbik7CisKKwkvKiB0dXJuIG9uIElSUSAqLworCXRtcCA9IHJlYWRsKG1taW9fYmFzZSArIFNJTF9TWVNDRkcpOworCXRtcCAmPSB+KFNJTF9NQVNLX0lERTBfSU5UIDw8IGFwLT5wb3J0X25vKTsKKwl3cml0ZWwodG1wLCBtbWlvX2Jhc2UgKyBTSUxfU1lTQ0ZHKTsKK30KKwogLyoqCiAgKglzaWxfZGV2X2NvbmZpZyAtIEFwcGx5IGRldmljZS9ob3N0LXNwZWNpZmljIGVycmF0YSBmaXh1cHMKICAqCUBhcDogUG9ydCBjb250YWluaW5nIGRldmljZSB0byBiZSBleGFtaW5lZApAQCAtMzYwLDE2ICs1MjksMTYgQEAKIAlpZiAoc2xvd19kb3duIHx8CiAJICAgICgoYXAtPmZsYWdzICYgU0lMX0ZMQUdfTU9EMTVXUklURSkgJiYKIAkgICAgIChxdWlya3MgJiBTSUxfUVVJUktfTU9EMTVXUklURSkpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImF0YSV1KCV1KTogYXBwbHlpbmcgU2VhZ2F0ZSBlcnJhdGEgZml4IChtb2QxNXdyaXRlIHdvcmthcm91bmQpXG4iLAotCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vKTsKKwkJYXRhX2Rldl9wcmludGsoZGV2LCBLRVJOX0lORk8sICJhcHBseWluZyBTZWFnYXRlIGVycmF0YSBmaXggIgorCQkJICAgICAgICIobW9kMTV3cml0ZSB3b3JrYXJvdW5kKVxuIik7CiAJCWRldi0+bWF4X3NlY3RvcnMgPSAxNTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGxpbWl0IHRvIHVkbWE1ICovCiAJaWYgKHF1aXJrcyAmIFNJTF9RVUlSS19VRE1BNU1BWCkgewotCQlwcmludGsoS0VSTl9JTkZPICJhdGEldSgldSk6IGFwcGx5aW5nIE1heHRvciBlcnJhdGEgZml4ICVzXG4iLAotCQkgICAgICAgYXAtPmlkLCBkZXYtPmRldm5vLCBtb2RlbF9udW0pOworCQlhdGFfZGV2X3ByaW50ayhkZXYsIEtFUk5fSU5GTywKKwkJCSAgICAgICAiYXBwbHlpbmcgTWF4dG9yIGVycmF0YSBmaXggJXNcbiIsIG1vZGVsX251bSk7CiAJCWRldi0+dWRtYV9tYXNrICY9IEFUQV9VRE1BNTsKIAkJcmV0dXJuOwogCX0KQEAgLTM4NCwxNiArNTUzLDEyIEBACiAJaW50IHJjOwogCXVuc2lnbmVkIGludCBpOwogCWludCBwY2lfZGV2X2J1c3kgPSAwOwotCXUzMiB0bXAsIGlycV9tYXNrOworCXUzMiB0bXA7CiAJdTggY2xzOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwogCi0JLyoKLQkgKiBJZiB0aGlzIGRyaXZlciBoYXBwZW5zIHRvIG9ubHkgYmUgdXNlZnVsIG9uIEFwcGxlJ3MgSzIsIHRoZW4KLQkgKiB3ZSBzaG91bGQgY2hlY2sgdGhhdCBoZXJlIGFzIGl0IGhhcyBhIG5vcm1hbCBTZXJ2ZXJ3b3JrcyBJRAotCSAqLwogCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC00NzgsMzEgKzY0MywxMyBAQAogCX0KIAogCWlmIChlbnQtPmRyaXZlcl9kYXRhID09IHNpbF8zMTE0KSB7Ci0JCWlycV9tYXNrID0gU0lMX01BU0tfNFBPUlQ7Ci0KIAkJLyogZmxpcCB0aGUgbWFnaWMgIm1ha2UgNCBwb3J0cyB3b3JrIiBiaXQgKi8KIAkJdG1wID0gcmVhZGwobW1pb19iYXNlICsgc2lsX3BvcnRbMl0uYm1kbWEpOwogCQlpZiAoKHRtcCAmIFNJTF9JTlRSX1NURUVSSU5HKSA9PSAwKQogCQkJd3JpdGVsKHRtcCB8IFNJTF9JTlRSX1NURUVSSU5HLAogCQkJICAgICAgIG1taW9fYmFzZSArIHNpbF9wb3J0WzJdLmJtZG1hKTsKLQotCX0gZWxzZSB7Ci0JCWlycV9tYXNrID0gU0lMX01BU0tfMlBPUlQ7CiAJfQogCi0JLyogbWFrZSBzdXJlIElERTAvMS8yLzMgaW50ZXJydXB0cyBhcmUgbm90IG1hc2tlZCAqLwotCXRtcCA9IHJlYWRsKG1taW9fYmFzZSArIFNJTF9TWVNDRkcpOwotCWlmICh0bXAgJiBpcnFfbWFzaykgewotCQl0bXAgJj0gfmlycV9tYXNrOwotCQl3cml0ZWwodG1wLCBtbWlvX2Jhc2UgKyBTSUxfU1lTQ0ZHKTsKLQkJcmVhZGwobW1pb19iYXNlICsgU0lMX1NZU0NGRyk7CS8qIGZsdXNoICovCi0JfQotCi0JLyogbWFzayBhbGwgU0FUQSBwaHktcmVsYXRlZCBpbnRlcnJ1cHRzICovCi0JLyogVE9ETzogdW5tYXNrIGJpdCA2IChTRXJyb3IgTiBiaXQpIGZvciBob3RwbHVnICovCi0JZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKQotCQl3cml0ZWwoMCwgbW1pb19iYXNlICsgc2lsX3BvcnRbaV0uc2llbik7Ci0KIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAogCS8qIEZJWE1FOiBjaGVjayBhdGFfZGV2aWNlX2FkZCByZXR1cm4gdmFsdWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3NpbDI0LmMgYi9kcml2ZXJzL3Njc2kvc2F0YV9zaWwyNC5jCmluZGV4IGNiOTA4MmYuLmM4YjQ3N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3NpbDI0LmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc2lsMjQuYwpAQCAtMzEsMTUgKzMxLDE1IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInNhdGFfc2lsMjQiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjIzIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4yNCIKIAogLyoKICAqIFBvcnQgcmVxdWVzdCBibG9jayAoUFJCKSAzMiBieXRlcwogICovCiBzdHJ1Y3Qgc2lsMjRfcHJiIHsKLQl1MTYJY3RybDsKLQl1MTYJcHJvdDsKLQl1MzIJcnhfY250OworCV9fbGUxNgljdHJsOworCV9fbGUxNglwcm90OworCV9fbGUzMglyeF9jbnQ7CiAJdTgJZmlzWzYgKiA0XTsKIH07CiAKQEAgLTQ3LDE3ICs0NywxNyBAQAogICogU2NhdHRlciBnYXRoZXIgZW50cnkgKFNHRSkgMTYgYnl0ZXMKICAqLwogc3RydWN0IHNpbDI0X3NnZSB7Ci0JdTY0CWFkZHI7Ci0JdTMyCWNudDsKLQl1MzIJZmxhZ3M7CisJX19sZTY0CWFkZHI7CisJX19sZTMyCWNudDsKKwlfX2xlMzIJZmxhZ3M7CiB9OwogCiAvKgogICogUG9ydCBtdWx0aXBsaWVyCiAgKi8KIHN0cnVjdCBzaWwyNF9wb3J0X211bHRpcGxpZXIgewotCXUzMglkaWFnOwotCXUzMglzYWN0aXZlOworCV9fbGUzMglkaWFnOworCV9fbGUzMglzYWN0aXZlOwogfTsKIAogZW51bSB7CkBAIC04NiwxMiArODYsMjEgQEAKIAkvKiBIT1NUX1NMT1RfU1RBVCBiaXRzICovCiAJSE9TVF9TU1RBVF9BVFROCQk9ICgxIDw8IDMxKSwKIAorCS8qIEhPU1RfQ1RSTCBiaXRzICovCisJSE9TVF9DVFJMX002NkVOCQk9ICgxIDw8IDE2KSwgLyogTTY2RU4gUENJIGJ1cyBzaWduYWwgKi8KKwlIT1NUX0NUUkxfVFJEWQkJPSAoMSA8PCAxNyksIC8qIGxhdGNoZWQgUENJIFRSRFkgKi8KKwlIT1NUX0NUUkxfU1RPUAkJPSAoMSA8PCAxOCksIC8qIGxhdGNoZWQgUENJIFNUT1AgKi8KKwlIT1NUX0NUUkxfREVWU0VMCT0gKDEgPDwgMTkpLCAvKiBsYXRjaGVkIFBDSSBERVZTRUwgKi8KKwlIT1NUX0NUUkxfUkVRNjQJCT0gKDEgPDwgMjApLCAvKiBsYXRjaGVkIFBDSSBSRVE2NCAqLworCiAJLyoKIAkgKiBQb3J0IHJlZ2lzdGVycwogCSAqICg4MTkyIGJ5dGVzIEAgKzB4MDAwMCwgKzB4MjAwMCwgKzB4NDAwMCBhbmQgKzB4NjAwMCBAIEJBUjIpCiAJICovCiAJUE9SVF9SRUdTX1NJWkUJCT0gMHgyMDAwLAotCVBPUlRfUFJCCQk9IDB4MDAwMCwgLyogKDMyIGJ5dGVzIFBSQiArIDE2IGJ5dGVzIFNHRXMgKiA2KSAqIDMxICgzOTY4IGJ5dGVzKSAqLworCisJUE9SVF9MUkFNCQk9IDB4MDAwMCwgLyogMzEgTFJBTSBzbG90cyBhbmQgUE0gcmVncyAqLworCVBPUlRfTFJBTV9TTE9UX1NaCT0gMHgwMDgwLCAvKiAzMiBieXRlcyBQUkIgKyAyIFNHRSwgQUNULi4uICovCiAKIAlQT1JUX1BNCQkJPSAweDBmODAsIC8qIDggYnl0ZXMgUE0gKiAxNiAoMTI4IGJ5dGVzKSAqLwogCQkvKiAzMiBiaXQgcmVncyAqLwpAQCAtMTQyLDggKzE1MSwxNiBAQAogCVBPUlRfSVJRX1BXUl9DSEcJPSAoMSA8PCAzKSwgLyogcG93ZXIgbWFuYWdlbWVudCBjaGFuZ2UgKi8KIAlQT1JUX0lSUV9QSFlSRFlfQ0hHCT0gKDEgPDwgNCksIC8qIFBIWSByZWFkeSBjaGFuZ2UgKi8KIAlQT1JUX0lSUV9DT01XQUtFCT0gKDEgPDwgNSksIC8qIENPTVdBS0UgcmVjZWl2ZWQgKi8KLQlQT1JUX0lSUV9VTktfRklTCT0gKDEgPDwgNiksIC8qIFVua25vd24gRklTIHJlY2VpdmVkICovCi0JUE9SVF9JUlFfU0RCX0ZJUwk9ICgxIDw8IDExKSwgLyogU0RCIEZJUyByZWNlaXZlZCAqLworCVBPUlRfSVJRX1VOS19GSVMJPSAoMSA8PCA2KSwgLyogdW5rbm93biBGSVMgcmVjZWl2ZWQgKi8KKwlQT1JUX0lSUV9ERVZfWENIRwk9ICgxIDw8IDcpLCAvKiBkZXZpY2UgZXhjaGFuZ2VkICovCisJUE9SVF9JUlFfOEIxMEIJCT0gKDEgPDwgOCksIC8qIDhiLzEwYiBkZWNvZGUgZXJyb3IgdGhyZXNob2xkICovCisJUE9SVF9JUlFfQ1JDCQk9ICgxIDw8IDkpLCAvKiBDUkMgZXJyb3IgdGhyZXNob2xkICovCisJUE9SVF9JUlFfSEFORFNIQUtFCT0gKDEgPDwgMTApLCAvKiBoYW5kc2hha2UgZXJyb3IgdGhyZXNob2xkICovCisJUE9SVF9JUlFfU0RCX05PVElGWQk9ICgxIDw8IDExKSwgLyogU0RCIG5vdGlmeSByZWNlaXZlZCAqLworCisJREVGX1BPUlRfSVJRCQk9IFBPUlRfSVJRX0NPTVBMRVRFIHwgUE9SVF9JUlFfRVJST1IgfAorCQkJCSAgUE9SVF9JUlFfUEhZUkRZX0NIRyB8IFBPUlRfSVJRX0RFVl9YQ0hHIHwKKwkJCQkgIFBPUlRfSVJRX1VOS19GSVMsCiAKIAkvKiBiaXRzWzI3OjE2XSBhcmUgdW5tYXNrZWQgKHJhdykgKi8KIAlQT1JUX0lSUV9SQVdfU0hJRlQJPSAxNiwKQEAgLTE3NCw3ICsxOTEsNyBAQAogCVBPUlRfQ0VSUl9DTURfUENJUEVSUgk9IDI3LCAvKiBjdHJsWzE1OjEzXSAxMTAgLSBQQ0kgcGFyaXR5IGVyciB3aGlsZSBmZXRjaGluZyBQUkIgKi8KIAlQT1JUX0NFUlJfWEZSX1VOREVGCT0gMzIsIC8qIFBTRCBlY29kZSAwMCAtIHVuZGVmaW5lZCAqLwogCVBPUlRfQ0VSUl9YRlJfVEdUQUJSVAk9IDMzLCAvKiBQU0QgZWNvZGUgMDEgLSB0YXJnZXQgYWJvcnQgKi8KLQlQT1JUX0NFUlJfWEZSX01TR0FCUlQJPSAzNCwgLyogUFNEIGVjb2RlIDEwIC0gbWFzdGVyIGFib3J0ICovCisJUE9SVF9DRVJSX1hGUl9NU1RBQlJUCT0gMzQsIC8qIFBTRCBlY29kZSAxMCAtIG1hc3RlciBhYm9ydCAqLwogCVBPUlRfQ0VSUl9YRlJfUENJUEVSUgk9IDM1LCAvKiBQU0QgZWNvZGUgMTEgLSBQQ0kgcHJpdHkgZXJyIGR1cmluZyB0cmFuc2ZlciAqLwogCVBPUlRfQ0VSUl9TRU5EU0VSVklDRQk9IDM2LCAvKiBGSVMgcmVjZWl2ZWQgd2hpbGUgc2VuZGluZyBzZXJ2aWNlICovCiAKQEAgLTIwMiwxMSArMjE5LDE5IEBACiAJU0dFX0RSRAkJCT0gKDEgPDwgMjkpLCAvKiBkaXNjYXJkIGRhdGEgcmVhZCAoL2Rldi9udWxsKQogCQkJCQkJZGF0YSBhZGRyZXNzIGlnbm9yZWQgKi8KIAorCVNJTDI0X01BWF9DTURTCQk9IDMxLAorCiAJLyogYm9hcmQgaWQgKi8KIAlCSURfU0lMMzEyNAkJPSAwLAogCUJJRF9TSUwzMTMyCQk9IDEsCiAJQklEX1NJTDMxMzEJCT0gMiwKIAorCS8qIGhvc3QgZmxhZ3MgKi8KKwlTSUwyNF9DT01NT05fRkxBR1MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKKwkJCQkgIEFUQV9GTEFHX01NSU8gfCBBVEFfRkxBR19QSU9fRE1BIHwKKwkJCQkgIEFUQV9GTEFHX05DUSB8IEFUQV9GTEFHX1NLSVBfRDJIX0JTWSwKKwlTSUwyNF9GTEFHX1BDSVhfSVJRX1dPQwk9ICgxIDw8IDI0KSwgLyogSVJRIGxvc3MgZXJyYXRhIG9uIFBDSS1YICovCisKIAlJUlFfU1RBVF80UE9SVFMJCT0gMHhmLAogfTsKIApAQCAtMjI2LDYgKzI1MSw1OCBAQAogCXN0cnVjdCBzaWwyNF9hdGFwaV9ibG9jayBhdGFwaTsKIH07CiAKK3N0YXRpYyBzdHJ1Y3Qgc2lsMjRfY2Vycl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgZXJyX21hc2ssIGFjdGlvbjsKKwljb25zdCBjaGFyICpkZXNjOworfSBzaWwyNF9jZXJyX2RiW10gPSB7CisJWzBdCQkJPSB7IEFDX0VSUl9ERVYsIEFUQV9FSF9SRVZBTElEQVRFLAorCQkJCSAgICAiZGV2aWNlIGVycm9yIiB9LAorCVtQT1JUX0NFUlJfREVWXQkJPSB7IEFDX0VSUl9ERVYsIEFUQV9FSF9SRVZBTElEQVRFLAorCQkJCSAgICAiZGV2aWNlIGVycm9yIHZpYSBEMkggRklTIiB9LAorCVtQT1JUX0NFUlJfU0RCXQkJPSB7IEFDX0VSUl9ERVYsIEFUQV9FSF9SRVZBTElEQVRFLAorCQkJCSAgICAiZGV2aWNlIGVycm9yIHZpYSBTREIgRklTIiB9LAorCVtQT1JUX0NFUlJfREFUQV0JPSB7IEFDX0VSUl9BVEFfQlVTLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAiZXJyb3IgaW4gZGF0YSBGSVMiIH0sCisJW1BPUlRfQ0VSUl9TRU5EXQk9IHsgQUNfRVJSX0FUQV9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJmYWlsZWQgdG8gdHJhbnNtaXQgY29tbWFuZCBGSVMiIH0sCisJW1BPUlRfQ0VSUl9JTkNPTlNJU1RFTlRdID0geyBBQ19FUlJfSFNNLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAgInByb3RvY29sIG1pc21hdGNoIiB9LAorCVtQT1JUX0NFUlJfRElSRUNUSU9OXQk9IHsgQUNfRVJSX0hTTSwgQVRBX0VIX1NPRlRSRVNFVCwKKwkJCQkgICAgImRhdGEgZGlyZWN0b24gbWlzbWF0Y2giIH0sCisJW1BPUlRfQ0VSUl9VTkRFUlJVTl0JPSB7IEFDX0VSUl9IU00sIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJyYW4gb3V0IG9mIFNHRXMgd2hpbGUgd3JpdGluZyIgfSwKKwlbUE9SVF9DRVJSX09WRVJSVU5dCT0geyBBQ19FUlJfSFNNLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAicmFuIG91dCBvZiBTR0VzIHdoaWxlIHJlYWRpbmciIH0sCisJW1BPUlRfQ0VSUl9QS1RfUFJPVF0JPSB7IEFDX0VSUl9IU00sIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJpbnZhbGlkIGRhdGEgZGlyZWN0b24gZm9yIEFUQVBJIENEQiIgfSwKKwlbUE9SVF9DRVJSX1NHVF9CT1VOREFSWV0gPSB7IEFDX0VSUl9TWVNURU0sIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICAiU0dUIG5vIG9uIHF3b3JkIGJvdW5kYXJ5IiB9LAorCVtQT1JUX0NFUlJfU0dUX1RHVEFCUlRdCT0geyBBQ19FUlJfSE9TVF9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJQQ0kgdGFyZ2V0IGFib3J0IHdoaWxlIGZldGNoaW5nIFNHVCIgfSwKKwlbUE9SVF9DRVJSX1NHVF9NU1RBQlJUXQk9IHsgQUNfRVJSX0hPU1RfQlVTLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAiUENJIG1hc3RlciBhYm9ydCB3aGlsZSBmZXRjaGluZyBTR1QiIH0sCisJW1BPUlRfQ0VSUl9TR1RfUENJUEVSUl0JPSB7IEFDX0VSUl9IT1NUX0JVUywgQVRBX0VIX1NPRlRSRVNFVCwKKwkJCQkgICAgIlBDSSBwYXJpdHkgZXJyb3Igd2hpbGUgZmV0Y2hpbmcgU0dUIiB9LAorCVtQT1JUX0NFUlJfQ01EX0JPVU5EQVJZXSA9IHsgQUNfRVJSX1NZU1RFTSwgQVRBX0VIX1NPRlRSRVNFVCwKKwkJCQkgICAgICJQUkIgbm90IG9uIHF3b3JkIGJvdW5kYXJ5IiB9LAorCVtQT1JUX0NFUlJfQ01EX1RHVEFCUlRdCT0geyBBQ19FUlJfSE9TVF9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJQQ0kgdGFyZ2V0IGFib3J0IHdoaWxlIGZldGNoaW5nIFBSQiIgfSwKKwlbUE9SVF9DRVJSX0NNRF9NU1RBQlJUXQk9IHsgQUNfRVJSX0hPU1RfQlVTLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAiUENJIG1hc3RlciBhYm9ydCB3aGlsZSBmZXRjaGluZyBQUkIiIH0sCisJW1BPUlRfQ0VSUl9DTURfUENJUEVSUl0JPSB7IEFDX0VSUl9IT1NUX0JVUywgQVRBX0VIX1NPRlRSRVNFVCwKKwkJCQkgICAgIlBDSSBwYXJpdHkgZXJyb3Igd2hpbGUgZmV0Y2hpbmcgUFJCIiB9LAorCVtQT1JUX0NFUlJfWEZSX1VOREVGXQk9IHsgQUNfRVJSX0hPU1RfQlVTLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAidW5kZWZpbmVkIGVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBkYXRhIiB9LAorCVtQT1JUX0NFUlJfWEZSX1RHVEFCUlRdCT0geyBBQ19FUlJfSE9TVF9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJQQ0kgdGFyZ2V0IGFib3J0IHdoaWxlIHRyYW5zZmVycmluZyBkYXRhIiB9LAorCVtQT1JUX0NFUlJfWEZSX01TVEFCUlRdCT0geyBBQ19FUlJfSE9TVF9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJQQ0kgbWFzdGVyIGFib3J0IHdoaWxlIHRyYW5zZmVycmluZyBkYXRhIiB9LAorCVtQT1JUX0NFUlJfWEZSX1BDSVBFUlJdCT0geyBBQ19FUlJfSE9TVF9CVVMsIEFUQV9FSF9TT0ZUUkVTRVQsCisJCQkJICAgICJQQ0kgcGFyaXR5IGVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBkYXRhIiB9LAorCVtQT1JUX0NFUlJfU0VORFNFUlZJQ0VdCT0geyBBQ19FUlJfSFNNLCBBVEFfRUhfU09GVFJFU0VULAorCQkJCSAgICAiRklTIHJlY2VpdmVkIHdoaWxlIHNlbmRpbmcgc2VydmljZSBGSVMiIH0sCit9OworCiAvKgogICogYXAtPnByaXZhdGVfZGF0YQogICoKQEAgLTI0OSwxMiArMzI2LDE0IEBACiBzdGF0aWMgdTMyIHNpbDI0X3Njcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIHNjX3JlZyk7CiBzdGF0aWMgdm9pZCBzaWwyNF9zY3Jfd3JpdGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgc2NfcmVnLCB1MzIgdmFsKTsKIHN0YXRpYyB2b2lkIHNpbDI0X3RmX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwotc3RhdGljIGludCBzaWwyNF9wcm9iZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOwogc3RhdGljIHZvaWQgc2lsMjRfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2lsMjRfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBzdGF0aWMgdm9pZCBzaWwyNF9pcnFfY2xlYXIoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgdm9pZCBzaWwyNF9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyBpcnFyZXR1cm5fdCBzaWwyNF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBzaWwyNF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CitzdGF0aWMgdm9pZCBzaWwyNF90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOworc3RhdGljIHZvaWQgc2lsMjRfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK3N0YXRpYyB2b2lkIHNpbDI0X3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogc3RhdGljIGludCBzaWwyNF9wb3J0X3N0YXJ0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgc2lsMjRfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogc3RhdGljIHZvaWQgc2lsMjRfaG9zdF9zdG9wKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKQEAgLTI4MSw3ICszNjAsOCBAQAogCS5uYW1lCQkJPSBEUlZfTkFNRSwKIAkuaW9jdGwJCQk9IGF0YV9zY3NpX2lvY3RsLAogCS5xdWV1ZWNvbW1hbmQJCT0gYXRhX3Njc2lfcXVldWVjbWQsCi0JLmNhbl9xdWV1ZQkJPSBBVEFfREVGX1FVRVVFLAorCS5jaGFuZ2VfcXVldWVfZGVwdGgJPSBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgsCisJLmNhbl9xdWV1ZQkJPSBTSUwyNF9NQVhfQ01EUywKIAkudGhpc19pZAkJPSBBVEFfU0hUX1RISVNfSUQsCiAJLnNnX3RhYmxlc2l6ZQkJPSBMSUJBVEFfTUFYX1BSRCwKIAkuY21kX3Blcl9sdW4JCT0gQVRBX1NIVF9DTURfUEVSX0xVTiwKQEAgLTI5MCw2ICszNzAsNyBAQAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCkBAIC0zMDQsMTkgKzM4NSwyMCBAQAogCiAJLnRmX3JlYWQJCT0gc2lsMjRfdGZfcmVhZCwKIAotCS5wcm9iZV9yZXNldAkJPSBzaWwyNF9wcm9iZV9yZXNldCwKLQogCS5xY19wcmVwCQk9IHNpbDI0X3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IHNpbDI0X3FjX2lzc3VlLAogCi0JLmVuZ190aW1lb3V0CQk9IHNpbDI0X2VuZ190aW1lb3V0LAotCiAJLmlycV9oYW5kbGVyCQk9IHNpbDI0X2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHNpbDI0X2lycV9jbGVhciwKIAogCS5zY3JfcmVhZAkJPSBzaWwyNF9zY3JfcmVhZCwKIAkuc2NyX3dyaXRlCQk9IHNpbDI0X3Njcl93cml0ZSwKIAorCS5mcmVlemUJCQk9IHNpbDI0X2ZyZWV6ZSwKKwkudGhhdwkJCT0gc2lsMjRfdGhhdywKKwkuZXJyb3JfaGFuZGxlcgkJPSBzaWwyNF9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IHNpbDI0X3Bvc3RfaW50ZXJuYWxfY21kLAorCiAJLnBvcnRfc3RhcnQJCT0gc2lsMjRfcG9ydF9zdGFydCwKIAkucG9ydF9zdG9wCQk9IHNpbDI0X3BvcnRfc3RvcCwKIAkuaG9zdF9zdG9wCQk9IHNpbDI0X2hvc3Rfc3RvcCwKQEAgLTMzMyw5ICs0MTUsOCBAQAogCS8qIHNpbF8zMTI0ICovCiAJewogCQkuc2h0CQk9ICZzaWwyNF9zaHQsCi0JCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8Ci0JCQkJICBTSUwyNF9OUE9SVFMyRkxBRyg0KSwKKwkJLmhvc3RfZmxhZ3MJPSBTSUwyNF9DT01NT05fRkxBR1MgfCBTSUwyNF9OUE9SVFMyRkxBRyg0KSB8CisJCQkJICBTSUwyNF9GTEFHX1BDSVhfSVJRX1dPQywKIAkJLnBpb19tYXNrCT0gMHgxZiwJCQkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LAkJCS8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDNmLAkJCS8qIHVkbWEwLTUgKi8KQEAgLTM0NCw5ICs0MjUsNyBAQAogCS8qIHNpbF8zMTMyICovCiAJewogCQkuc2h0CQk9ICZzaWwyNF9zaHQsCi0JCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8Ci0JCQkJICBTSUwyNF9OUE9SVFMyRkxBRygyKSwKKwkJLmhvc3RfZmxhZ3MJPSBTSUwyNF9DT01NT05fRkxBR1MgfCBTSUwyNF9OUE9SVFMyRkxBRygyKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJCQkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LAkJCS8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDNmLAkJCS8qIHVkbWEwLTUgKi8KQEAgLTM1NSw5ICs0MzQsNyBAQAogCS8qIHNpbF8zMTMxL3NpbF8zNTMxICovCiAJewogCQkuc2h0CQk9ICZzaWwyNF9zaHQsCi0JCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8Ci0JCQkJICBBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfUElPX0RNQSB8Ci0JCQkJICBTSUwyNF9OUE9SVFMyRkxBRygxKSwKKwkJLmhvc3RfZmxhZ3MJPSBTSUwyNF9DT01NT05fRkxBR1MgfCBTSUwyNF9OUE9SVFMyRkxBRygxKSwKIAkJLnBpb19tYXNrCT0gMHgxZiwJCQkvKiBwaW8wLTQgKi8KIAkJLm13ZG1hX21hc2sJPSAweDA3LAkJCS8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDNmLAkJCS8qIHVkbWEwLTUgKi8KQEAgLTM2NSw2ICs0NDIsMTMgQEAKIAl9LAogfTsKIAorc3RhdGljIGludCBzaWwyNF90YWcoaW50IHRhZykKK3sKKwlpZiAodW5saWtlbHkoYXRhX3RhZ19pbnRlcm5hbCh0YWcpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRhZzsKK30KKwogc3RhdGljIHZvaWQgc2lsMjRfZGV2X2NvbmZpZyhzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQogewogCXZvaWQgX19pb21lbSAqcG9ydCA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyOwpAQCAtNDI2LDU2ICs1MTAsNjUgQEAKIAkqdGYgPSBwcC0+dGY7CiB9CiAKLXN0YXRpYyBpbnQgc2lsMjRfc29mdHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCB2ZXJib3NlLAotCQkJICAgdW5zaWduZWQgaW50ICpjbGFzcykKK3N0YXRpYyBpbnQgc2lsMjRfaW5pdF9wb3J0KHN0cnVjdCBhdGFfcG9ydCAqYXApCit7CisJdm9pZCBfX2lvbWVtICpwb3J0ID0gKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuY21kX2FkZHI7CisJdTMyIHRtcDsKKworCXdyaXRlbChQT1JUX0NTX0lOSVQsIHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7CisJYXRhX3dhaXRfcmVnaXN0ZXIocG9ydCArIFBPUlRfQ1RSTF9TVEFULAorCQkJICBQT1JUX0NTX0lOSVQsIFBPUlRfQ1NfSU5JVCwgMTAsIDEwMCk7CisJdG1wID0gYXRhX3dhaXRfcmVnaXN0ZXIocG9ydCArIFBPUlRfQ1RSTF9TVEFULAorCQkJCVBPUlRfQ1NfUkRZLCAwLCAxMCwgMTAwKTsKKworCWlmICgodG1wICYgKFBPUlRfQ1NfSU5JVCB8IFBPUlRfQ1NfUkRZKSkgIT0gUE9SVF9DU19SRFkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNpbDI0X3NvZnRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzKQogewogCXZvaWQgX19pb21lbSAqcG9ydCA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyOwogCXN0cnVjdCBzaWwyNF9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3Qgc2lsMjRfcHJiICpwcmIgPSAmcHAtPmNtZF9ibG9ja1swXS5hdGEucHJiOwogCWRtYV9hZGRyX3QgcGFkZHIgPSBwcC0+Y21kX2Jsb2NrX2RtYTsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgQVRBX1RNT1VUX0JPT1QgKiBIWjsKLQl1MzIgaXJxX2VuYWJsZSwgaXJxX3N0YXQ7CisJdTMyIG1hc2ssIGlycV9zdGF0OworCWNvbnN0IGNoYXIgKnJlYXNvbjsKIAogCURQUklOVEsoIkVOVEVSXG4iKTsKIAotCWlmICghc2F0YV9kZXZfcHJlc2VudChhcCkpIHsKKwlpZiAoYXRhX3BvcnRfb2ZmbGluZShhcCkpIHsKIAkJRFBSSU5USygiUEhZIHJlcG9ydHMgbm8gZGV2aWNlXG4iKTsKIAkJKmNsYXNzID0gQVRBX0RFVl9OT05FOwogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiB0ZW1wb3JhcmlseSB0dXJuIG9mZiBJUlFzIGR1cmluZyBTUlNUICovCi0JaXJxX2VuYWJsZSA9IHJlYWRsKHBvcnQgKyBQT1JUX0lSUV9FTkFCTEVfU0VUKTsKLQl3cml0ZWwoaXJxX2VuYWJsZSwgcG9ydCArIFBPUlRfSVJRX0VOQUJMRV9DTFIpOworCS8qIHB1dCB0aGUgcG9ydCBpbnRvIGtub3duIHN0YXRlICovCisJaWYgKHNpbDI0X2luaXRfcG9ydChhcCkpIHsKKwkJcmVhc29uID0icG9ydCBub3QgcmVhZHkiOworCQlnb3RvIGVycjsKKwl9CiAKLQkvKgotCSAqIFhYWDogTm90IHN1cmUgd2hldGhlciB0aGUgZm9sbG93aW5nIHNsZWVwIGlzIG5lZWRlZCBvciBub3QuCi0JICogVGhlIG9yaWdpbmFsIGRyaXZlciBoYWQgaXQuICBTby4uLi4KLQkgKi8KLQltc2xlZXAoMTApOwotCisJLyogZG8gU1JTVCAqLwogCXByYi0+Y3RybCA9IGNwdV90b19sZTE2KFBSQl9DVFJMX1NSU1QpOwogCXByYi0+ZmlzWzFdID0gMDsgLyogbm8gUE0geWV0ICovCiAKIAl3cml0ZWwoKHUzMilwYWRkciwgcG9ydCArIFBPUlRfQ01EX0FDVElWQVRFKTsKKwl3cml0ZWwoKHU2NClwYWRkciA+PiAzMiwgcG9ydCArIFBPUlRfQ01EX0FDVElWQVRFICsgNCk7CiAKLQlkbyB7Ci0JCWlycV9zdGF0ID0gcmVhZGwocG9ydCArIFBPUlRfSVJRX1NUQVQpOwotCQl3cml0ZWwoaXJxX3N0YXQsIHBvcnQgKyBQT1JUX0lSUV9TVEFUKTsJCS8qIGNsZWFyIGlycSAqLworCW1hc2sgPSAoUE9SVF9JUlFfQ09NUExFVEUgfCBQT1JUX0lSUV9FUlJPUikgPDwgUE9SVF9JUlFfUkFXX1NISUZUOworCWlycV9zdGF0ID0gYXRhX3dhaXRfcmVnaXN0ZXIocG9ydCArIFBPUlRfSVJRX1NUQVQsIG1hc2ssIDB4MCwKKwkJCQkgICAgIDEwMCwgQVRBX1RNT1VUX0JPT1QgLyBIWiAqIDEwMDApOwogCi0JCWlycV9zdGF0ID4+PSBQT1JUX0lSUV9SQVdfU0hJRlQ7Ci0JCWlmIChpcnFfc3RhdCAmIChQT1JUX0lSUV9DT01QTEVURSB8IFBPUlRfSVJRX0VSUk9SKSkKLQkJCWJyZWFrOwotCi0JCW1zbGVlcCgxMDApOwotCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKTsKLQotCS8qIHJlc3RvcmUgSVJRcyAqLwotCXdyaXRlbChpcnFfZW5hYmxlLCBwb3J0ICsgUE9SVF9JUlFfRU5BQkxFX1NFVCk7CisJd3JpdGVsKGlycV9zdGF0LCBwb3J0ICsgUE9SVF9JUlFfU1RBVCk7IC8qIGNsZWFyIElSUXMgKi8KKwlpcnFfc3RhdCA+Pj0gUE9SVF9JUlFfUkFXX1NISUZUOwogCiAJaWYgKCEoaXJxX3N0YXQgJiBQT1JUX0lSUV9DT01QTEVURSkpIHsKLQkJRFBSSU5USygiRVhJVCwgc3JzdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGlycV9zdGF0ICYgUE9SVF9JUlFfRVJST1IpCisJCQlyZWFzb24gPSAiU1JTVCBjb21tYW5kIGVycm9yIjsKKwkJZWxzZQorCQkJcmVhc29uID0gInRpbWVvdXQiOworCQlnb3RvIGVycjsKIAl9CiAKIAlzaWwyNF91cGRhdGVfdGYoYXApOwpAQCAtNDg3LDIyICs1ODAsNTcgQEAKICBvdXQ6CiAJRFBSSU5USygiRVhJVCwgY2xhc3M9JXVcbiIsICpjbGFzcyk7CiAJcmV0dXJuIDA7CisKKyBlcnI6CisJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgInNvZnRyZXNldCBmYWlsZWQgKCVzKVxuIiwgcmVhc29uKTsKKwlyZXR1cm4gLUVJTzsKIH0KIAotc3RhdGljIGludCBzaWwyNF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHZlcmJvc2UsCi0JCQkgICB1bnNpZ25lZCBpbnQgKmNsYXNzKQorc3RhdGljIGludCBzaWwyNF9oYXJkcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzcykKIHsKLQl1bnNpZ25lZCBpbnQgZHVtbXlfY2xhc3M7CisJdm9pZCBfX2lvbWVtICpwb3J0ID0gKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuY21kX2FkZHI7CisJY29uc3QgY2hhciAqcmVhc29uOworCWludCB0b3V0X21zZWMsIHJjOworCXUzMiB0bXA7CiAKLQkvKiBzaWwyNCBkb2Vzbid0IHJlcG9ydCBkZXZpY2Ugc2lnbmF0dXJlIGFmdGVyIGhhcmQgcmVzZXQgKi8KLQlyZXR1cm4gc2F0YV9zdGRfaGFyZHJlc2V0KGFwLCB2ZXJib3NlLCAmZHVtbXlfY2xhc3MpOwotfQorCS8qIHNpbDI0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nKHRtKSB3aXRob3V0IGFueSBwcm90ZWN0aW9uICovCisJc2F0YV9zZXRfc3BkKGFwKTsKIAotc3RhdGljIGludCBzaWwyNF9wcm9iZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpCi17Ci0JcmV0dXJuIGF0YV9kcml2ZV9wcm9iZV9yZXNldChhcCwgYXRhX3N0ZF9wcm9iZWluaXQsCi0JCQkJICAgICBzaWwyNF9zb2Z0cmVzZXQsIHNpbDI0X2hhcmRyZXNldCwKLQkJCQkgICAgIGF0YV9zdGRfcG9zdHJlc2V0LCBjbGFzc2VzKTsKKwl0b3V0X21zZWMgPSAxMDA7CisJaWYgKGF0YV9wb3J0X29ubGluZShhcCkpCisJCXRvdXRfbXNlYyA9IDUwMDA7CisKKwl3cml0ZWwoUE9SVF9DU19ERVZfUlNULCBwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOworCXRtcCA9IGF0YV93YWl0X3JlZ2lzdGVyKHBvcnQgKyBQT1JUX0NUUkxfU1RBVCwKKwkJCQlQT1JUX0NTX0RFVl9SU1QsIFBPUlRfQ1NfREVWX1JTVCwgMTAsIHRvdXRfbXNlYyk7CisKKwkvKiBTU3RhdHVzIG9zY2lsbGF0ZXMgYmV0d2VlbiB6ZXJvIGFuZCB2YWxpZCBzdGF0dXMgYWZ0ZXIKKwkgKiBERVZfUlNULCBkZWJvdW5jZSBpdC4KKwkgKi8KKwlyYyA9IHNhdGFfcGh5X2RlYm91bmNlKGFwLCBzYXRhX2RlYl90aW1pbmdfYmVmb3JlX2ZzcnN0KTsKKwlpZiAocmMpIHsKKwkJcmVhc29uID0gIlBIWSBkZWJvdW5jaW5nIGZhaWxlZCI7CisJCWdvdG8gZXJyOworCX0KKworCWlmICh0bXAgJiBQT1JUX0NTX0RFVl9SU1QpIHsKKwkJaWYgKGF0YV9wb3J0X29mZmxpbmUoYXApKQorCQkJcmV0dXJuIDA7CisJCXJlYXNvbiA9ICJsaW5rIG5vdCByZWFkeSI7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNpbDI0IGRvZXNuJ3Qgc3RvcmUgc2lnbmF0dXJlIEZJUyBhZnRlciBoYXJkcmVzZXQsIHNvIHdlCisJICogY2FuJ3Qgd2FpdCBmb3IgQlNZIHRvIGNsZWFyLiAgU29tZSBkZXZpY2VzIHRha2UgYSBsb25nIHRpbWUKKwkgKiB0byBnZXQgcmVhZHkgYW5kIHRob3NlIGRldmljZXMgd2lsbCBjaG9rZSBpZiB3ZSBkb24ndCB3YWl0CisJICogZm9yIEJTWSBjbGVhcmFuY2UgaGVyZS4gIFRlbGwgbGliYXRhIHRvIHBlcmZvcm0gZm9sbG93LXVwCisJICogc29mdHJlc2V0LgorCSAqLworCXJldHVybiAtRUFHQUlOOworCisgZXJyOgorCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsICJoYXJkcmVzZXQgZmFpbGVkICglcylcbiIsIHJlYXNvbik7CisJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzaWwyNF9maWxsX3NnKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCkBAIC01MjgsMTcgKzY1NiwyMCBAQAogewogCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CiAJc3RydWN0IHNpbDI0X3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwotCXVuaW9uIHNpbDI0X2NtZF9ibG9jayAqY2IgPSBwcC0+Y21kX2Jsb2NrICsgcWMtPnRhZzsKKwl1bmlvbiBzaWwyNF9jbWRfYmxvY2sgKmNiOwogCXN0cnVjdCBzaWwyNF9wcmIgKnByYjsKIAlzdHJ1Y3Qgc2lsMjRfc2dlICpzZ2U7CisJdTE2IGN0cmwgPSAwOworCisJY2IgPSAmcHAtPmNtZF9ibG9ja1tzaWwyNF90YWcocWMtPnRhZyldOwogCiAJc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKIAljYXNlIEFUQV9QUk9UX1BJTzoKIAljYXNlIEFUQV9QUk9UX0RNQToKKwljYXNlIEFUQV9QUk9UX05DUToKIAljYXNlIEFUQV9QUk9UX05PREFUQToKIAkJcHJiID0gJmNiLT5hdGEucHJiOwogCQlzZ2UgPSBjYi0+YXRhLnNnZTsKLQkJcHJiLT5jdHJsID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIEFUQV9QUk9UX0FUQVBJOgpAQCAtNTUxLDEyICs2ODIsMTAgQEAKIAogCQlpZiAocWMtPnRmLnByb3RvY29sICE9IEFUQV9QUk9UX0FUQVBJX05PREFUQSkgewogCQkJaWYgKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSkKLQkJCQlwcmItPmN0cmwgPSBjcHVfdG9fbGUxNihQUkJfQ1RSTF9QQUNLRVRfV1JJVEUpOworCQkJCWN0cmwgPSBQUkJfQ1RSTF9QQUNLRVRfV1JJVEU7CiAJCQllbHNlCi0JCQkJcHJiLT5jdHJsID0gY3B1X3RvX2xlMTYoUFJCX0NUUkxfUEFDS0VUX1JFQUQpOwotCQl9IGVsc2UKLQkJCXByYi0+Y3RybCA9IDA7Ci0KKwkJCQljdHJsID0gUFJCX0NUUkxfUEFDS0VUX1JFQUQ7CisJCX0KIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNTY1LDYgKzY5NCw3IEBACiAJCUJVRygpOwogCX0KIAorCXByYi0+Y3RybCA9IGNwdV90b19sZTE2KGN0cmwpOwogCWF0YV90Zl90b19maXMoJnFjLT50ZiwgcHJiLT5maXMsIDApOwogCiAJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfRE1BTUFQKQpAQCAtNTc0LDExICs3MDQsMTggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2lsMjRfcWNfaXNzdWUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwotCXZvaWQgX19pb21lbSAqcG9ydCA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyOwogCXN0cnVjdCBzaWwyNF9wb3J0X3ByaXYgKnBwID0gYXAtPnByaXZhdGVfZGF0YTsKLQlkbWFfYWRkcl90IHBhZGRyID0gcHAtPmNtZF9ibG9ja19kbWEgKyBxYy0+dGFnICogc2l6ZW9mKCpwcC0+Y21kX2Jsb2NrKTsKKwl2b2lkIF9faW9tZW0gKnBvcnQgPSAodm9pZCBfX2lvbWVtICopYXAtPmlvYWRkci5jbWRfYWRkcjsKKwl1bnNpZ25lZCBpbnQgdGFnID0gc2lsMjRfdGFnKHFjLT50YWcpOworCWRtYV9hZGRyX3QgcGFkZHI7CisJdm9pZCBfX2lvbWVtICphY3RpdmF0ZTsKIAotCXdyaXRlbCgodTMyKXBhZGRyLCBwb3J0ICsgUE9SVF9DTURfQUNUSVZBVEUpOworCXBhZGRyID0gcHAtPmNtZF9ibG9ja19kbWEgKyB0YWcgKiBzaXplb2YoKnBwLT5jbWRfYmxvY2spOworCWFjdGl2YXRlID0gcG9ydCArIFBPUlRfQ01EX0FDVElWQVRFICsgdGFnICogODsKKworCXdyaXRlbCgodTMyKXBhZGRyLCBhY3RpdmF0ZSk7CisJd3JpdGVsKCh1NjQpcGFkZHIgPj4gMzIsIGFjdGl2YXRlICsgNCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTg3LDE2MiArNzI0LDEzOSBAQAogCS8qIHVudXNlZCAqLwogfQogCi1zdGF0aWMgaW50IF9fc2lsMjRfcmVzdGFydF9jb250cm9sbGVyKHZvaWQgX19pb21lbSAqcG9ydCkKK3N0YXRpYyB2b2lkIHNpbDI0X2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXUzMiB0bXA7Ci0JaW50IGNudDsKLQotCXdyaXRlbChQT1JUX0NTX0lOSVQsIHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7Ci0KLQkvKiBNYXggfjEwbXMgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDAwOyBjbnQrKykgewotCQl0bXAgPSByZWFkbChwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOwotCQlpZiAodG1wICYgUE9SVF9DU19SRFkpCi0JCQlyZXR1cm4gMDsKLQkJdWRlbGF5KDEpOwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgc2lsMjRfcmVzdGFydF9jb250cm9sbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0JaWYgKF9fc2lsMjRfcmVzdGFydF9jb250cm9sbGVyKCh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyKSkKLQkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FCi0JCSAgICAgICAiIGF0YSV1OiBmYWlsZWQgdG8gcmVzdGFydCBjb250cm9sbGVyXG4iLCBhcC0+aWQpOwotfQotCi1zdGF0aWMgaW50IF9fc2lsMjRfcmVzZXRfY29udHJvbGxlcih2b2lkIF9faW9tZW0gKnBvcnQpCi17Ci0JaW50IGNudDsKLQl1MzIgdG1wOwotCi0JLyogUmVzZXQgY29udHJvbGxlciBzdGF0ZS4gIElzIHRoaXMgY29ycmVjdD8gKi8KLQl3cml0ZWwoUE9SVF9DU19ERVZfUlNULCBwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOwotCXJlYWRsKHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7CS8qIHN5bmMgKi8KLQotCS8qIE1heCB+MTAwbXMgKi8KLQlmb3IgKGNudCA9IDA7IGNudCA8IDEwMDA7IGNudCsrKSB7Ci0JCXVkZWxheSgxMDApOwotCQl0bXAgPSByZWFkbChwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOwotCQlpZiAoISh0bXAgJiBQT1JUX0NTX0RFVl9SU1QpKQotCQkJYnJlYWs7Ci0JfQotCi0JaWYgKHRtcCAmIFBPUlRfQ1NfREVWX1JTVCkKLQkJcmV0dXJuIC0xOwotCi0JaWYgKHRtcCAmIFBPUlRfQ1NfUkRZKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBfX3NpbDI0X3Jlc3RhcnRfY29udHJvbGxlcihwb3J0KTsKLX0KLQotc3RhdGljIHZvaWQgc2lsMjRfcmVzZXRfY29udHJvbGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXByaW50ayhLRVJOX05PVElDRSBEUlZfTkFNRQotCSAgICAgICAiIGF0YSV1OiByZXNldHRpbmcgY29udHJvbGxlci4uLlxuIiwgYXAtPmlkKTsKLQlpZiAoX19zaWwyNF9yZXNldF9jb250cm9sbGVyKCh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyKSkKLSAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgRFJWX05BTUUKLSAgICAgICAgICAgICAgICAgICAgICAgIiBhdGEldTogZmFpbGVkIHRvIHJlc2V0IGNvbnRyb2xsZXJcbiIsIGFwLT5pZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpbDI0X2VuZ190aW1lb3V0KHN0cnVjdCBhdGFfcG9ydCAqYXApCi17Ci0Jc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKLQotCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0KLQlwcmludGsoS0VSTl9FUlIgImF0YSV1OiBjb21tYW5kIHRpbWVvdXRcbiIsIGFwLT5pZCk7Ci0JcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9USU1FT1VUOwotCWF0YV9laF9xY19jb21wbGV0ZShxYyk7Ci0KLQlzaWwyNF9yZXNldF9jb250cm9sbGVyKGFwKTsKLX0KLQotc3RhdGljIHZvaWQgc2lsMjRfZXJyb3JfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgc2xvdF9zdGF0KQotewotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKLQlzdHJ1Y3Qgc2lsMjRfcG9ydF9wcml2ICpwcCA9IGFwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX2lvbWVtICpwb3J0ID0gKHZvaWQgX19pb21lbSAqKWFwLT5pb2FkZHIuY21kX2FkZHI7Ci0JdTMyIGlycV9zdGF0LCBjbWRfZXJyLCBzc3RhdHVzLCBzZXJyb3I7Ci0JdW5zaWduZWQgaW50IGVycl9tYXNrOwogCi0JaXJxX3N0YXQgPSByZWFkbChwb3J0ICsgUE9SVF9JUlFfU1RBVCk7Ci0Jd3JpdGVsKGlycV9zdGF0LCBwb3J0ICsgUE9SVF9JUlFfU1RBVCk7CQkvKiBjbGVhciBpcnEgKi8KLQotCWlmICghKGlycV9zdGF0ICYgUE9SVF9JUlFfRVJST1IpKSB7Ci0JCS8qIGlnbm9yZSBub24tY29tcGxldGlvbiwgbm9uLWVycm9yIGlycXMgZm9yIG5vdyAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HIERSVl9OQU1FCi0JCSAgICAgICAiYXRhJXU6IG5vbi1lcnJvciBleGNlcHRpb24gaXJxIChpcnFfc3RhdCAleClcbiIsCi0JCSAgICAgICBhcC0+aWQsIGlycV9zdGF0KTsKLQkJcmV0dXJuOwotCX0KLQotCWNtZF9lcnIgPSByZWFkbChwb3J0ICsgUE9SVF9DTURfRVJSKTsKLQlzc3RhdHVzID0gcmVhZGwocG9ydCArIFBPUlRfU1NUQVRVUyk7Ci0Jc2Vycm9yID0gcmVhZGwocG9ydCArIFBPUlRfU0VSUk9SKTsKLQlpZiAoc2Vycm9yKQotCQl3cml0ZWwoc2Vycm9yLCBwb3J0ICsgUE9SVF9TRVJST1IpOwotCi0JLyoKLQkgKiBEb24ndCBsb2cgQVRBUEkgZGV2aWNlIGVycm9ycy4gIFRoZXkncmUgc3VwcG9zZWQgdG8gaGFwcGVuCi0JICogYW5kIGFueSBzZXJpb3VzIGVycm9ycyB3aWxsIGJlIGxvZ2dlZCB1c2luZyBzZW5zZSBkYXRhIGJ5Ci0JICogdGhlIFNDU0kgbGF5ZXIuCisJLyogUG9ydC13aWRlIElSUSBtYXNrIGluIEhPU1RfQ1RSTCBkb2Vzbid0IHJlYWxseSB3b3JrLCBjbGVhcgorCSAqIFBPUlRfSVJRX0VOQUJMRSBpbnN0ZWFkLgogCSAqLwotCWlmIChhcC0+ZGV2aWNlWzBdLmNsYXNzICE9IEFUQV9ERVZfQVRBUEkgfHwgY21kX2VyciA+IFBPUlRfQ0VSUl9TREIpCi0JCXByaW50aygiYXRhJXU6IGVycm9yIGludGVycnVwdCBvbiBwb3J0JWRcbiIKLQkJICAgICAgICIgIHN0YXQ9MHgleCBpcnE9MHgleCBjbWRfZXJyPSVkIHNzdGF0dXM9MHgleCBzZXJyb3I9MHgleFxuIiwKLQkJICAgICAgIGFwLT5pZCwgYXAtPnBvcnRfbm8sIHNsb3Rfc3RhdCwgaXJxX3N0YXQsIGNtZF9lcnIsIHNzdGF0dXMsIHNlcnJvcik7CisJd3JpdGVsKDB4ZmZmZiwgcG9ydCArIFBPUlRfSVJRX0VOQUJMRV9DTFIpOworfQogCi0JaWYgKGNtZF9lcnIgPT0gUE9SVF9DRVJSX0RFViB8fCBjbWRfZXJyID09IFBPUlRfQ0VSUl9TREIpIHsKLQkJLyoKLQkJICogRGV2aWNlIGlzIHJlcG9ydGluZyBlcnJvciwgdGYgcmVnaXN0ZXJzIGFyZSB2YWxpZC4KLQkJICovCi0JCXNpbDI0X3VwZGF0ZV90ZihhcCk7Ci0JCWVycl9tYXNrID0gYWNfZXJyX21hc2socHAtPnRmLmNvbW1hbmQpOwotCQlzaWwyNF9yZXN0YXJ0X2NvbnRyb2xsZXIoYXApOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIE90aGVyIGVycm9ycy4gIGxpYmF0YSBjdXJyZW50bHkgZG9lc24ndCBoYXZlIGFueQotCQkgKiBtZWNoYW5pc20gdG8gcmVwb3J0IHRoZXNlIGVycm9ycy4gIEp1c3QgdHVybiBvbgotCQkgKiBBVEFfRVJSLgotCQkgKi8KLQkJZXJyX21hc2sgPSBBQ19FUlJfT1RIRVI7Ci0JCXNpbDI0X3Jlc2V0X2NvbnRyb2xsZXIoYXApOworc3RhdGljIHZvaWQgc2lsMjRfdGhhdyhzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydCA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyOworCXUzMiB0bXA7CisKKwkvKiBjbGVhciBJUlEgKi8KKwl0bXAgPSByZWFkbChwb3J0ICsgUE9SVF9JUlFfU1RBVCk7CisJd3JpdGVsKHRtcCwgcG9ydCArIFBPUlRfSVJRX1NUQVQpOworCisJLyogdHVybiBJUlEgYmFjayBvbiAqLworCXdyaXRlbChERUZfUE9SVF9JUlEsIHBvcnQgKyBQT1JUX0lSUV9FTkFCTEVfU0VUKTsKK30KKworc3RhdGljIHZvaWQgc2lsMjRfZXJyb3JfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCXZvaWQgX19pb21lbSAqcG9ydCA9ICh2b2lkIF9faW9tZW0gKilhcC0+aW9hZGRyLmNtZF9hZGRyOworCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5laF9pbmZvOworCWludCBmcmVlemUgPSAwOworCXUzMiBpcnFfc3RhdDsKKworCS8qIG9uIGVycm9yLCB3ZSBuZWVkIHRvIGNsZWFyIElSUSBleHBsaWNpdGx5ICovCisJaXJxX3N0YXQgPSByZWFkbChwb3J0ICsgUE9SVF9JUlFfU1RBVCk7CisJd3JpdGVsKGlycV9zdGF0LCBwb3J0ICsgUE9SVF9JUlFfU1RBVCk7CisKKwkvKiBmaXJzdCwgYW5hbHl6ZSBhbmQgcmVjb3JkIGhvc3QgcG9ydCBldmVudHMgKi8KKwlhdGFfZWhpX2NsZWFyX2Rlc2MoZWhpKTsKKworCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgImlycV9zdGF0IDB4JTA4eCIsIGlycV9zdGF0KTsKKworCWlmIChpcnFfc3RhdCAmIChQT1JUX0lSUV9QSFlSRFlfQ0hHIHwgUE9SVF9JUlFfREVWX1hDSEcpKSB7CisJCWF0YV9laGlfaG90cGx1Z2dlZChlaGkpOworCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICIsICVzIiwKKwkJCSAgICAgICBpcnFfc3RhdCAmIFBPUlRfSVJRX1BIWVJEWV9DSEcgPworCQkJICAgICAgICJQSFkgUkRZIGNoYW5nZWQiIDogImRldmljZSBleGNoYW5nZWQiKTsKKwkJZnJlZXplID0gMTsKIAl9CiAKLQlpZiAocWMpIHsKLQkJcWMtPmVycl9tYXNrIHw9IGVycl9tYXNrOwotCQlhdGFfcWNfY29tcGxldGUocWMpOworCWlmIChpcnFfc3RhdCAmIFBPUlRfSVJRX1VOS19GSVMpIHsKKwkJZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGkgLCAiLCB1bmtub3duIEZJUyIpOworCQlmcmVlemUgPSAxOwogCX0KKworCS8qIGRlYWwgd2l0aCBjb21tYW5kIGVycm9yICovCisJaWYgKGlycV9zdGF0ICYgUE9SVF9JUlFfRVJST1IpIHsKKwkJc3RydWN0IHNpbDI0X2NlcnJfaW5mbyAqY2kgPSBOVUxMOworCQl1bnNpZ25lZCBpbnQgZXJyX21hc2sgPSAwLCBhY3Rpb24gPSAwOworCQlzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjOworCQl1MzIgY2VycjsKKworCQkvKiBhbmFseXplIENNRF9FUlIgKi8KKwkJY2VyciA9IHJlYWRsKHBvcnQgKyBQT1JUX0NNRF9FUlIpOworCQlpZiAoY2VyciA8IEFSUkFZX1NJWkUoc2lsMjRfY2Vycl9kYikpCisJCQljaSA9ICZzaWwyNF9jZXJyX2RiW2NlcnJdOworCisJCWlmIChjaSAmJiBjaS0+ZGVzYykgeworCQkJZXJyX21hc2sgfD0gY2ktPmVycl9tYXNrOworCQkJYWN0aW9uIHw9IGNpLT5hY3Rpb247CisJCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICIsICVzIiwgY2ktPmRlc2MpOworCQl9IGVsc2UgeworCQkJZXJyX21hc2sgfD0gQUNfRVJSX09USEVSOworCQkJYWN0aW9uIHw9IEFUQV9FSF9TT0ZUUkVTRVQ7CisJCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICIsIHVua25vd24gY29tbWFuZCBlcnJvciAlZCIsCisJCQkJCSAgY2Vycik7CisJCX0KKworCQkvKiByZWNvcmQgZXJyb3IgaW5mbyAqLworCQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOworCQlpZiAocWMpIHsKKwkJCXNpbDI0X3VwZGF0ZV90ZihhcCk7CisJCQlxYy0+ZXJyX21hc2sgfD0gZXJyX21hc2s7CisJCX0gZWxzZQorCQkJZWhpLT5lcnJfbWFzayB8PSBlcnJfbWFzazsKKworCQllaGktPmFjdGlvbiB8PSBhY3Rpb247CisJfQorCisJLyogZnJlZXplIG9yIGFib3J0ICovCisJaWYgKGZyZWV6ZSkKKwkJYXRhX3BvcnRfZnJlZXplKGFwKTsKKwllbHNlCisJCWF0YV9wb3J0X2Fib3J0KGFwKTsKK30KKworc3RhdGljIHZvaWQgc2lsMjRfZmluaXNoX3FjKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfUkVTVUxUX1RGKQorCQlzaWwyNF91cGRhdGVfdGYocWMtPmFwKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNpbDI0X2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwKQogewotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKIAl2b2lkIF9faW9tZW0gKnBvcnQgPSAodm9pZCBfX2lvbWVtICopYXAtPmlvYWRkci5jbWRfYWRkcjsKLQl1MzIgc2xvdF9zdGF0OworCXUzMiBzbG90X3N0YXQsIHFjX2FjdGl2ZTsKKwlpbnQgcmM7CiAKIAlzbG90X3N0YXQgPSByZWFkbChwb3J0ICsgUE9SVF9TTE9UX1NUQVQpOwotCWlmICghKHNsb3Rfc3RhdCAmIEhPU1RfU1NUQVRfQVRUTikpIHsKLQkJc3RydWN0IHNpbDI0X3BvcnRfcHJpdiAqcHAgPSBhcC0+cHJpdmF0ZV9kYXRhOwotCQkvKgotCQkgKiAhSE9TVF9TU0FUX0FUVE4gZ3VhcmFudGVlcyBzdWNjZXNzZnVsIGNvbXBsZXRpb24sCi0JCSAqIHNvIHJlYWRpbmcgYmFjayB0ZiByZWdpc3RlcnMgaXMgdW5uZWNlc3NhcnkgZm9yCi0JCSAqIG1vc3QgY29tbWFuZHMuICBUT0RPOiByZWFkIHRmIHJlZ2lzdGVycyBmb3IKLQkJICogY29tbWFuZHMgd2hpY2ggcmVxdWlyZSB0aGVzZSB2YWx1ZXMgb24gc3VjY2Vzc2Z1bAotCQkgKiBjb21wbGV0aW9uIChFWEVDVVRFIERFVklDRSBESUFHTk9TVElDLCBDSEVDSyBQT1dFUiwKLQkJICogREVWSUNFIFJFU0VUIGFuZCBSRUFEIFBPUlQgTVVMVElQTElFUiAoYW55IG1vcmU/KS4KLQkJICovCi0JCXNpbDI0X3VwZGF0ZV90ZihhcCk7CiAKLQkJaWYgKHFjKSB7Ci0JCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2socHAtPnRmLmNvbW1hbmQpOwotCQkJYXRhX3FjX2NvbXBsZXRlKHFjKTsKLQkJfQotCX0gZWxzZQotCQlzaWwyNF9lcnJvcl9pbnRyKGFwLCBzbG90X3N0YXQpOworCWlmICh1bmxpa2VseShzbG90X3N0YXQgJiBIT1NUX1NTVEFUX0FUVE4pKSB7CisJCXNpbDI0X2Vycm9yX2ludHIoYXApOworCQlyZXR1cm47CisJfQorCisJaWYgKGFwLT5mbGFncyAmIFNJTDI0X0ZMQUdfUENJWF9JUlFfV09DKQorCQl3cml0ZWwoUE9SVF9JUlFfQ09NUExFVEUsIHBvcnQgKyBQT1JUX0lSUV9TVEFUKTsKKworCXFjX2FjdGl2ZSA9IHNsb3Rfc3RhdCAmIH5IT1NUX1NTVEFUX0FUVE47CisJcmMgPSBhdGFfcWNfY29tcGxldGVfbXVsdGlwbGUoYXAsIHFjX2FjdGl2ZSwgc2lsMjRfZmluaXNoX3FjKTsKKwlpZiAocmMgPiAwKQorCQlyZXR1cm47CisJaWYgKHJjIDwgMCkgeworCQlzdHJ1Y3QgYXRhX2VoX2luZm8gKmVoaSA9ICZhcC0+ZWhfaW5mbzsKKwkJZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfSFNNOworCQllaGktPmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCQlhdGFfcG9ydF9mcmVlemUoYXApOworCQlyZXR1cm47CisJfQorCisJaWYgKGF0YV9yYXRlbGltaXQoKSkKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0lORk8sICJzcHVyaW91cyBpbnRlcnJ1cHQgIgorCQkJIihzbG90X3N0YXQgMHgleCBhY3RpdmVfdGFnICVkIHNhY3RpdmUgMHgleClcbiIsCisJCQlzbG90X3N0YXQsIGFwLT5hY3RpdmVfdGFnLCBhcC0+c2FjdGl2ZSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzaWwyNF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKQEAgLTc2OSw3ICs4ODMsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBob3N0X3NldC0+bl9wb3J0czsgaSsrKQogCQlpZiAoc3RhdHVzICYgKDEgPDwgaSkpIHsKIAkJCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBob3N0X3NldC0+cG9ydHNbaV07Ci0JCQlpZiAoYXAgJiYgIShhcC0+ZmxhZ3MgJiBBVEFfRkxBR19QT1JUX0RJU0FCTEVEKSkgeworCQkJaWYgKGFwICYmICEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKSB7CiAJCQkJc2lsMjRfaG9zdF9pbnRyKGhvc3Rfc2V0LT5wb3J0c1tpXSk7CiAJCQkJaGFuZGxlZCsrOwogCQkJfSBlbHNlCkBAIC03ODIsOSArODk2LDM1IEBACiAJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CiB9CiAKK3N0YXRpYyB2b2lkIHNpbDI0X2Vycm9yX2hhbmRsZXIoc3RydWN0IGF0YV9wb3J0ICphcCkKK3sKKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQgKmVoYyA9ICZhcC0+ZWhfY29udGV4dDsKKworCWlmIChzaWwyNF9pbml0X3BvcnQoYXApKSB7CisJCWF0YV9laF9mcmVlemVfcG9ydChhcCk7CisJCWVoYy0+aS5hY3Rpb24gfD0gQVRBX0VIX0hBUkRSRVNFVDsKKwl9CisKKwkvKiBwZXJmb3JtIHJlY292ZXJ5ICovCisJYXRhX2RvX2VoKGFwLCBhdGFfc3RkX3ByZXJlc2V0LCBzaWwyNF9zb2Z0cmVzZXQsIHNpbDI0X2hhcmRyZXNldCwKKwkJICBhdGFfc3RkX3Bvc3RyZXNldCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpbDI0X3Bvc3RfaW50ZXJuYWxfY21kKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKKworCWlmIChxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkKKwkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9PVEhFUjsKKworCS8qIG1ha2UgRE1BIGVuZ2luZSBmb3JnZXQgYWJvdXQgdGhlIGZhaWxlZCBjb21tYW5kICovCisJaWYgKHFjLT5lcnJfbWFzaykKKwkJc2lsMjRfaW5pdF9wb3J0KGFwKTsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIHNpbDI0X2NibGtfZnJlZShzdHJ1Y3Qgc2lsMjRfcG9ydF9wcml2ICpwcCwgc3RydWN0IGRldmljZSAqZGV2KQogewotCWNvbnN0IHNpemVfdCBjYl9zaXplID0gc2l6ZW9mKCpwcC0+Y21kX2Jsb2NrKTsKKwljb25zdCBzaXplX3QgY2Jfc2l6ZSA9IHNpemVvZigqcHAtPmNtZF9ibG9jaykgKiBTSUwyNF9NQVhfQ01EUzsKIAogCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgY2Jfc2l6ZSwgcHAtPmNtZF9ibG9jaywgcHAtPmNtZF9ibG9ja19kbWEpOwogfQpAQCAtNzk0LDcgKzkzNCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gYXAtPmhvc3Rfc2V0LT5kZXY7CiAJc3RydWN0IHNpbDI0X3BvcnRfcHJpdiAqcHA7CiAJdW5pb24gc2lsMjRfY21kX2Jsb2NrICpjYjsKLQlzaXplX3QgY2Jfc2l6ZSA9IHNpemVvZigqY2IpOworCXNpemVfdCBjYl9zaXplID0gc2l6ZW9mKCpjYikgKiBTSUwyNF9NQVhfQ01EUzsKIAlkbWFfYWRkcl90IGNiX2RtYTsKIAlpbnQgcmMgPSAtRU5PTUVNOwogCkBAIC04NTgsNiArOTk4LDcgQEAKIAl2b2lkIF9faW9tZW0gKmhvc3RfYmFzZSA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICpwb3J0X2Jhc2UgPSBOVUxMOwogCWludCBpLCByYzsKKwl1MzIgdG1wOwogCiAJaWYgKCFwcmludGVkX3ZlcnNpb24rKykKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmcGRldi0+ZGV2LCAidmVyc2lvbiAiIERSVl9WRVJTSU9OICJcbiIpOwpAQCAtOTEwLDM3ICsxMDUxLDUzIEBACiAJLyoKIAkgKiBDb25maWd1cmUgdGhlIGRldmljZQogCSAqLwotCS8qCi0JICogRklYTUU6IFRoaXMgZGV2aWNlIGlzIGNlcnRhaW5seSA2NC1iaXQgY2FwYWJsZS4gIFdlIGp1c3QKLQkgKiBkb24ndCBrbm93IGhvdyB0byB1c2UgaXQuICBBZnRlciBmaXhpbmcgMzJiaXQgYWN0aXZhdGlvbiBpbgotCSAqIHRoaXMgZnVuY3Rpb24sIGVuYWJsZSA2NGJpdCBtYXNrcyBoZXJlLgotCSAqLwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7Ci0JaWYgKHJjKSB7Ci0JCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BXzMyQklUX01BU0spOwotCWlmIChyYykgewotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAotCQkJICAgIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKKwlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BXzY0QklUX01BU0spKSB7CisJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV82NEJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCQlpZiAocmMpIHsKKwkJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCQkgICAiNjQtYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV8zMkJJVF9NQVNLKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCAmcGRldi0+ZGV2LAorCQkJCSAgICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfMzJCSVRfTUFTSyk7CisJCWlmIChyYykgeworCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKKwkJCQkgICAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQogCX0KIAogCS8qIEdQSU8gb2ZmICovCiAJd3JpdGVsKDAsIGhvc3RfYmFzZSArIEhPU1RfRkxBU0hfQ01EKTsKIAotCS8qIE1hc2sgaW50ZXJydXB0cyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KKwkvKiBBcHBseSB3b3JrYXJvdW5kIGZvciBjb21wbGV0aW9uIElSUSBsb3NzIG9uIFBDSS1YIGVycmF0YSAqLworCWlmIChwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgJiBTSUwyNF9GTEFHX1BDSVhfSVJRX1dPQykgeworCQl0bXAgPSByZWFkbChob3N0X2Jhc2UgKyBIT1NUX0NUUkwpOworCQlpZiAodG1wICYgKEhPU1RfQ1RSTF9UUkRZIHwgSE9TVF9DVFJMX1NUT1AgfCBIT1NUX0NUUkxfREVWU0VMKSkKKwkJCWRldl9wcmludGsoS0VSTl9JTkZPLCAmcGRldi0+ZGV2LAorCQkJCSAgICJBcHBseWluZyBjb21wbGV0aW9uIElSUSBsb3NzIG9uIFBDSS1YICIKKwkJCQkgICAiZXJyYXRhIGZpeFxuIik7CisJCWVsc2UKKwkJCXByb2JlX2VudC0+aG9zdF9mbGFncyAmPSB+U0lMMjRfRkxBR19QQ0lYX0lSUV9XT0M7CisJfQorCisJLyogY2xlYXIgZ2xvYmFsIHJlc2V0ICYgbWFzayBpbnRlcnJ1cHRzIGR1cmluZyBpbml0aWFsaXphdGlvbiAqLwogCXdyaXRlbCgwLCBob3N0X2Jhc2UgKyBIT1NUX0NUUkwpOwogCiAJZm9yIChpID0gMDsgaSA8IHByb2JlX2VudC0+bl9wb3J0czsgaSsrKSB7CiAJCXZvaWQgX19pb21lbSAqcG9ydCA9IHBvcnRfYmFzZSArIGkgKiBQT1JUX1JFR1NfU0laRTsKIAkJdW5zaWduZWQgbG9uZyBwb3J0dSA9ICh1bnNpZ25lZCBsb25nKXBvcnQ7Ci0JCXUzMiB0bXA7Ci0JCWludCBjbnQ7CiAKLQkJcHJvYmVfZW50LT5wb3J0W2ldLmNtZF9hZGRyID0gcG9ydHUgKyBQT1JUX1BSQjsKKwkJcHJvYmVfZW50LT5wb3J0W2ldLmNtZF9hZGRyID0gcG9ydHU7CiAJCXByb2JlX2VudC0+cG9ydFtpXS5zY3JfYWRkciA9IHBvcnR1ICsgUE9SVF9TQ09OVFJPTDsKIAogCQlhdGFfc3RkX3BvcnRzKCZwcm9iZV9lbnQtPnBvcnRbaV0pOwpAQCAtOTUyLDE4ICsxMTA5LDIwIEBACiAJCXRtcCA9IHJlYWRsKHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7CiAJCWlmICh0bXAgJiBQT1JUX0NTX1BPUlRfUlNUKSB7CiAJCQl3cml0ZWwoUE9SVF9DU19QT1JUX1JTVCwgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOwotCQkJcmVhZGwocG9ydCArIFBPUlRfQ1RSTF9TVEFUKTsJLyogc3luYyAqLwotCQkJZm9yIChjbnQgPSAwOyBjbnQgPCAxMDsgY250KyspIHsKLQkJCQltc2xlZXAoMTApOwotCQkJCXRtcCA9IHJlYWRsKHBvcnQgKyBQT1JUX0NUUkxfU1RBVCk7Ci0JCQkJaWYgKCEodG1wICYgUE9SVF9DU19QT1JUX1JTVCkpCi0JCQkJCWJyZWFrOwotCQkJfQorCQkJdG1wID0gYXRhX3dhaXRfcmVnaXN0ZXIocG9ydCArIFBPUlRfQ1RSTF9TVEFULAorCQkJCQkJUE9SVF9DU19QT1JUX1JTVCwKKwkJCQkJCVBPUlRfQ1NfUE9SVF9SU1QsIDEwLCAxMDApOwogCQkJaWYgKHRtcCAmIFBPUlRfQ1NfUE9SVF9SU1QpCiAJCQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJnBkZXYtPmRldiwKIAkJCQkgICAgICAgICAgICJmYWlsZWQgdG8gY2xlYXIgcG9ydCBSU1RcbiIpOwogCQl9CiAKKwkJLyogQ29uZmlndXJlIElSUSBXb0MgKi8KKwkJaWYgKHByb2JlX2VudC0+aG9zdF9mbGFncyAmIFNJTDI0X0ZMQUdfUENJWF9JUlFfV09DKQorCQkJd3JpdGVsKFBPUlRfQ1NfSVJRX1dPQywgcG9ydCArIFBPUlRfQ1RSTF9TVEFUKTsKKwkJZWxzZQorCQkJd3JpdGVsKFBPUlRfQ1NfSVJRX1dPQywgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOworCiAJCS8qIFplcm8gZXJyb3IgY291bnRlcnMuICovCiAJCXdyaXRlbCgweDgwMDAsIHBvcnQgKyBQT1JUX0RFQ09ERV9FUlJfVEhSRVNIKTsKIAkJd3JpdGVsKDB4ODAwMCwgcG9ydCArIFBPUlRfQ1JDX0VSUl9USFJFU0gpOwpAQCAtOTcyLDI2ICsxMTMxLDExIEBACiAJCXdyaXRlbCgweDAwMDAsIHBvcnQgKyBQT1JUX0NSQ19FUlJfQ05UKTsKIAkJd3JpdGVsKDB4MDAwMCwgcG9ydCArIFBPUlRfSFNIS19FUlJfQ05UKTsKIAotCQkvKiBGSVhNRTogMzJiaXQgYWN0aXZhdGlvbj8gKi8KLQkJd3JpdGVsKDAsIHBvcnQgKyBQT1JUX0FDVElWQVRFX1VQUEVSX0FERFIpOwotCQl3cml0ZWwoUE9SVF9DU18zMkJJVF9BQ1RWLCBwb3J0ICsgUE9SVF9DVFJMX1NUQVQpOwotCi0JCS8qIENvbmZpZ3VyZSBpbnRlcnJ1cHRzICovCi0JCXdyaXRlbCgweGZmZmYsIHBvcnQgKyBQT1JUX0lSUV9FTkFCTEVfQ0xSKTsKLQkJd3JpdGVsKFBPUlRfSVJRX0NPTVBMRVRFIHwgUE9SVF9JUlFfRVJST1IgfCBQT1JUX0lSUV9TREJfRklTLAotCQkgICAgICAgcG9ydCArIFBPUlRfSVJRX0VOQUJMRV9TRVQpOwotCi0JCS8qIENsZWFyIGludGVycnVwdHMgKi8KLQkJd3JpdGVsKDB4MGZmZjBmZmYsIHBvcnQgKyBQT1JUX0lSUV9TVEFUKTsKLQkJd3JpdGVsKFBPUlRfQ1NfSVJRX1dPQywgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOworCQkvKiBBbHdheXMgdXNlIDY0Yml0IGFjdGl2YXRpb24gKi8KKwkJd3JpdGVsKFBPUlRfQ1NfMzJCSVRfQUNUViwgcG9ydCArIFBPUlRfQ1RSTF9DTFIpOwogCiAJCS8qIENsZWFyIHBvcnQgbXVsdGlwbGllciBlbmFibGUgYW5kIHJlc3VtZSBiaXRzICovCiAJCXdyaXRlbChQT1JUX0NTX1BNX0VOIHwgUE9SVF9DU19SRVNVTUUsIHBvcnQgKyBQT1JUX0NUUkxfQ0xSKTsKLQotCQkvKiBSZXNldCBpdHNlbGYgKi8KLQkJaWYgKF9fc2lsMjRfcmVzZXRfY29udHJvbGxlcihwb3J0KSkKLQkJCWRldl9wcmludGsoS0VSTl9FUlIsICZwZGV2LT5kZXYsCi0JCQkgICAgICAgICAgICJmYWlsZWQgdG8gcmVzZXQgY29udHJvbGxlclxuIik7CiAJfQogCiAJLyogVHVybiBvbiBpbnRlcnJ1cHRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zaXMuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jCmluZGV4IDcyODUzMGQuLjgwOWQzMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3Npcy5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAKICNkZWZpbmUgRFJWX05BTUUJInNhdGFfc2lzIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC41IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC42IgogCiBlbnVtIHsKIAlzaXNfMTgwCQkJPSAwLApAQCAtOTYsNiArOTYsNyBAQAogCS5wcm9jX25hbWUJCT0gRFJWX05BTUUsCiAJLmRtYV9ib3VuZGFyeQkJPSBBVEFfRE1BX0JPVU5EQVJZLAogCS5zbGF2ZV9jb25maWd1cmUJPSBhdGFfc2NzaV9zbGF2ZV9jb25maWcsCisJLnNsYXZlX2Rlc3Ryb3kJCT0gYXRhX3Njc2lfc2xhdmVfZGVzdHJveSwKIAkuYmlvc19wYXJhbQkJPSBhdGFfc3RkX2Jpb3NfcGFyYW0sCiB9OwogCkBAIC0xMDYsMTQgKzEwNywxNyBAQAogCS5jaGVja19zdGF0dXMJCT0gYXRhX2NoZWNrX3N0YXR1cywKIAkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAotCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCiAJLmJtZG1hX3NldHVwICAgICAgICAgICAgPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0ICAgICAgICAgICAgPSBhdGFfYm1kbWFfc3RhcnQsCiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCisJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKKwkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuc2NyX3JlYWQJCT0gc2lzX3Njcl9yZWFkLApAQCAtMTI1LDggKzEyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzaXNfcG9ydF9pbmZvID0gewogCS5zaHQJCT0gJnNpc19zaHQsCi0JLmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8Ci0JCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKKwkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19OT19MRUdBQ1ksCiAJLnBpb19tYXNrCT0gMHgxZiwKIAkubXdkbWFfbWFzawk9IDB4NywKIAkudWRtYV9tYXNrCT0gMHg3ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3N2dy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMKaW5kZXggNTNiMGQ1Yy4uYzk0Yjg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfc3Z3LmMKQEAgLTU0LDcgKzU0LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfUFBDX09GICovCiAKICNkZWZpbmUgRFJWX05BTUUJInNhdGFfc3Z3IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wNyIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuOCIKIAogZW51bSB7CiAJLyogVGFza2ZpbGUgcmVnaXN0ZXJzIG9mZnNldHMgKi8KQEAgLTI1Nyw3ICsyNTcsNyBAQAogCWludCBsZW4sIGluZGV4OwogCiAJLyogRmluZCAgdGhlIGF0YV9wb3J0ICovCi0JYXAgPSAoc3RydWN0IGF0YV9wb3J0ICopICZzaG9zdC0+aG9zdGRhdGFbMF07CisJYXAgPSBhdGFfc2hvc3RfdG9fcG9ydChzaG9zdCk7CiAJaWYgKGFwID09IE5VTEwpCiAJCXJldHVybiAwOwogCkBAIC0yOTksNiArMjk5LDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAjaWZkZWYgQ09ORklHX1BQQ19PRgogCS5wcm9jX2luZm8JCT0gazJfc2F0YV9wcm9jX2luZm8sCiAjZW5kaWYKQEAgLTMxMywxNCArMzE0LDE3IEBACiAJLmNoZWNrX3N0YXR1cwkJPSBrMl9zdGF0X2NoZWNrX3N0YXR1cywKIAkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAotCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCiAJLmJtZG1hX3NldHVwCQk9IGsyX2JtZG1hX3NldHVwX21taW8sCiAJLmJtZG1hX3N0YXJ0CQk9IGsyX2JtZG1hX3N0YXJ0X21taW8sCiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCiAJLmJtZG1hX3N0YXR1cwkJPSBhdGFfYm1kbWFfc3RhdHVzLAogCS5xY19wcmVwCQk9IGF0YV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBhdGFfcWNfaXNzdWVfcHJvdCwKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5kYXRhX3hmZXIJCT0gYXRhX21taW9fZGF0YV94ZmVyLAorCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCisJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAorCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuaXJxX2hhbmRsZXIJCT0gYXRhX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IGF0YV9ibWRtYV9pcnFfY2xlYXIsCiAJLnNjcl9yZWFkCQk9IGsyX3NhdGFfc2NyX3JlYWQsCkBAIC00MjAsOCArNDI0LDggQEAKIAl3cml0ZWwoMHgwLCBtbWlvX2Jhc2UgKyBLMl9TQVRBX1NJTV9PRkZTRVQpOwogCiAJcHJvYmVfZW50LT5zaHQgPSAmazJfc2F0YV9zaHQ7Ci0JcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1NBVEFfUkVTRVQgfAotCQkJCUFUQV9GTEFHX05PX0xFR0FDWSB8IEFUQV9GTEFHX01NSU87CisJcHJvYmVfZW50LT5ob3N0X2ZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CisJCQkJQVRBX0ZMQUdfTU1JTzsKIAlwcm9iZV9lbnQtPnBvcnRfb3BzID0gJmsyX3NhdGFfb3BzOwogCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CiAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2F0YV9zeDQuYyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N4NC5jCmluZGV4IDQxMzlhZDQuLjdmODY0NDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zYXRhX3N4NC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zYXRhX3N4NC5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSAic2F0YV9wcm9taXNlLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJInNhdGFfc3g0IgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMC44IgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC45IgogCiAKIGVudW0gewpAQCAtMTkxLDYgKzE5MSw3IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTIwNCw2ICsyMDUsNyBAQAogCS5waHlfcmVzZXQJCT0gcGRjXzIwNjIxX3BoeV9yZXNldCwKIAkucWNfcHJlcAkJPSBwZGMyMDYyMV9xY19wcmVwLAogCS5xY19pc3N1ZQkJPSBwZGMyMDYyMV9xY19pc3N1ZV9wcm90LAorCS5kYXRhX3hmZXIJCT0gYXRhX21taW9fZGF0YV94ZmVyLAogCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCiAJLmlycV9oYW5kbGVyCQk9IHBkYzIwNjIxX2ludGVycnVwdCwKIAkuaXJxX2NsZWFyCQk9IHBkYzIwNjIxX2lycV9jbGVhciwKQEAgLTIxOCw3ICsyMjAsNyBAQAogCQkuc2h0CQk9ICZwZGNfc2F0YV9zaHQsCiAJCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSB8CiAJCQkJICBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTU1JTyB8Ci0JCQkJICBBVEFfRkxBR19OT19BVEFQSSwKKwkJCQkgIEFUQV9GTEFHX05PX0FUQVBJIHwgQVRBX0ZMQUdfUElPX1BPTExJTkcsCiAJCS5waW9fbWFzawk9IDB4MWYsIC8qIHBpbzAtNCAqLwogCQkubXdkbWFfbWFzawk9IDB4MDcsIC8qIG13ZG1hMC0yICovCiAJCS51ZG1hX21hc2sJPSAweDdmLCAvKiB1ZG1hMC02IDsgRklYTUUgKi8KQEAgLTgzMywxMSArODM1LDExIEBACiAJCXRtcCA9IG1hc2sgJiAoMSA8PCBpKTsKIAkJVlBSSU5USygic2VxICV1LCBwb3J0X25vICV1LCBhcCAlcCwgdG1wICV4XG4iLCBpLCBwb3J0X25vLCBhcCwgdG1wKTsKIAkJaWYgKHRtcCAmJiBhcCAmJgotCQkgICAgIShhcC0+ZmxhZ3MgJiAoQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRCB8IEFUQV9GTEFHX05PSU5UUikpKSB7CisJCSAgICAhKGFwLT5mbGFncyAmIEFUQV9GTEFHX0RJU0FCTEVEKSkgewogCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAogCQkJcWMgPSBhdGFfcWNfZnJvbV90YWcoYXAsIGFwLT5hY3RpdmVfdGFnKTsKLQkJCWlmIChxYyAmJiAoIShxYy0+dGYuY3RsICYgQVRBX05JRU4pKSkKKwkJCWlmIChxYyAmJiAoIShxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykpKQogCQkJCWhhbmRsZWQgKz0gcGRjMjA2MjFfaG9zdF9pbnRyKGFwLCBxYywgKGkgPiA0KSwKIAkJCQkJCQkgICAgICBtbWlvX2Jhc2UpOwogCQl9CkBAIC04NjgsMTUgKzg3MCwxNiBAQAogCXN3aXRjaCAocWMtPnRmLnByb3RvY29sKSB7CiAJY2FzZSBBVEFfUFJPVF9ETUE6CiAJY2FzZSBBVEFfUFJPVF9OT0RBVEE6Ci0JCXByaW50ayhLRVJOX0VSUiAiYXRhJXU6IGNvbW1hbmQgdGltZW91dFxuIiwgYXAtPmlkKTsKKwkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgImNvbW1hbmQgdGltZW91dFxuIik7CiAJCXFjLT5lcnJfbWFzayB8PSBfX2FjX2Vycl9tYXNrKGF0YV93YWl0X2lkbGUoYXApKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlkcnZfc3RhdCA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTAwMCk7CiAKLQkJcHJpbnRrKEtFUk5fRVJSICJhdGEldTogdW5rbm93biB0aW1lb3V0LCBjbWQgMHgleCBzdGF0IDB4JXhcbiIsCi0JCSAgICAgICBhcC0+aWQsIHFjLT50Zi5jb21tYW5kLCBkcnZfc3RhdCk7CisJCWF0YV9wb3J0X3ByaW50ayhhcCwgS0VSTl9FUlIsCisJCQkJInVua25vd24gdGltZW91dCwgY21kIDB4JXggc3RhdCAweCV4XG4iLAorCQkJCXFjLT50Zi5jb21tYW5kLCBkcnZfc3RhdCk7CiAKIAkJcWMtPmVycl9tYXNrIHw9IGFjX2Vycl9tYXNrKGRydl9zdGF0KTsKIAkJYnJlYWs7CkBAIC0xMzc1LDEwICsxMzc4LDYgQEAKIAlpZiAoIXByaW50ZWRfdmVyc2lvbisrKQogCQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsICZwZGV2LT5kZXYsICJ2ZXJzaW9uICIgRFJWX1ZFUlNJT04gIlxuIik7CiAKLQkvKgotCSAqIElmIHRoaXMgZHJpdmVyIGhhcHBlbnMgdG8gb25seSBiZSB1c2VmdWwgb24gQXBwbGUncyBLMiwgdGhlbgotCSAqIHdlIHNob3VsZCBjaGVjayB0aGF0IGhlcmUgYXMgaXQgaGFzIGEgbm9ybWFsIFNlcnZlcndvcmtzIElECi0JICovCiAJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3VsaS5jIGIvZHJpdmVycy9zY3NpL3NhdGFfdWxpLmMKaW5kZXggMzhiNTJiZC4uZjY2OGM5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfdWxpLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfdWxpLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkic2F0YV91bGkiCi0jZGVmaW5lIERSVl9WRVJTSU9OCSIwLjUiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjYiCiAKIGVudW0gewogCXVsaV81Mjg5CQk9IDAsCkBAIC05MCw2ICs5MCw3IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTEwMiwxNiArMTAzLDE4IEBACiAJLmV4ZWNfY29tbWFuZAkJPSBhdGFfZXhlY19jb21tYW5kLAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKIAotCS5waHlfcmVzZXQJCT0gc2F0YV9waHlfcmVzZXQsCi0KIAkuYm1kbWFfc2V0dXAgICAgICAgICAgICA9IGF0YV9ibWRtYV9zZXR1cCwKIAkuYm1kbWFfc3RhcnQgICAgICAgICAgICA9IGF0YV9ibWRtYV9zdGFydCwKIAkuYm1kbWFfc3RvcAkJPSBhdGFfYm1kbWFfc3RvcCwKIAkuYm1kbWFfc3RhdHVzCQk9IGF0YV9ibWRtYV9zdGF0dXMsCiAJLnFjX3ByZXAJCT0gYXRhX3FjX3ByZXAsCiAJLnFjX2lzc3VlCQk9IGF0YV9xY19pc3N1ZV9wcm90LAorCS5kYXRhX3hmZXIJCT0gYXRhX3Bpb19kYXRhX3hmZXIsCiAKLQkuZW5nX3RpbWVvdXQJCT0gYXRhX2VuZ190aW1lb3V0LAorCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCisJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAorCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAogCS5pcnFfaGFuZGxlcgkJPSBhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKQEAgLTEyNiw4ICsxMjksNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gdWxpX3BvcnRfaW5mbyA9IHsKIAkuc2h0ICAgICAgICAgICAgPSAmdWxpX3NodCwKLQkuaG9zdF9mbGFncyAgICAgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVCB8Ci0JCQkgIEFUQV9GTEFHX05PX0xFR0FDWSwKKwkuaG9zdF9mbGFncyAgICAgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAogCS5waW9fbWFzayAgICAgICA9IDB4MWYsCQkvKiBwaW8wLTQgKi8KIAkudWRtYV9tYXNrICAgICAgPSAweDdmLAkJLyogdWRtYTAtNiAqLwogCS5wb3J0X29wcyAgICAgICA9ICZ1bGlfb3BzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NhdGFfdmlhLmMgYi9kcml2ZXJzL3Njc2kvc2F0YV92aWEuYwppbmRleCA5ZTdhZTRlLi4zMjI4OTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2F0YV92aWEuYworKysgYi9kcml2ZXJzL3Njc2kvc2F0YV92aWEuYwpAQCAtNDcsNyArNDcsNyBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjZGVmaW5lIERSVl9OQU1FCSJzYXRhX3ZpYSIKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMiIKIAogZW51bSBib2FyZF9pZHNfZW51bSB7CiAJdnQ2NDIwLApAQCAtMTAzLDYgKzEwMyw3IEBACiAJLnByb2NfbmFtZQkJPSBEUlZfTkFNRSwKIAkuZG1hX2JvdW5kYXJ5CQk9IEFUQV9ETUFfQk9VTkRBUlksCiAJLnNsYXZlX2NvbmZpZ3VyZQk9IGF0YV9zY3NpX3NsYXZlX2NvbmZpZywKKwkuc2xhdmVfZGVzdHJveQkJPSBhdGFfc2NzaV9zbGF2ZV9kZXN0cm95LAogCS5iaW9zX3BhcmFtCQk9IGF0YV9zdGRfYmlvc19wYXJhbSwKIH07CiAKQEAgLTExNSw4ICsxMTYsNiBAQAogCS5leGVjX2NvbW1hbmQJCT0gYXRhX2V4ZWNfY29tbWFuZCwKIAkuZGV2X3NlbGVjdAkJPSBhdGFfc3RkX2Rldl9zZWxlY3QsCiAKLQkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAotCiAJLmJtZG1hX3NldHVwICAgICAgICAgICAgPSBhdGFfYm1kbWFfc2V0dXAsCiAJLmJtZG1hX3N0YXJ0ICAgICAgICAgICAgPSBhdGFfYm1kbWFfc3RhcnQsCiAJLmJtZG1hX3N0b3AJCT0gYXRhX2JtZG1hX3N0b3AsCkBAIC0xMjQsOCArMTIzLDEyIEBACiAKIAkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCisJLmRhdGFfeGZlcgkJPSBhdGFfcGlvX2RhdGFfeGZlciwKIAotCS5lbmdfdGltZW91dAkJPSBhdGFfZW5nX3RpbWVvdXQsCisJLmZyZWV6ZQkJCT0gYXRhX2JtZG1hX2ZyZWV6ZSwKKwkudGhhdwkJCT0gYXRhX2JtZG1hX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gYXRhX2JtZG1hX2Vycm9yX2hhbmRsZXIsCisJLnBvc3RfaW50ZXJuYWxfY21kCT0gYXRhX2JtZG1hX3Bvc3RfaW50ZXJuYWxfY21kLAogCiAJLmlycV9oYW5kbGVyCQk9IGF0YV9pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBhdGFfYm1kbWFfaXJxX2NsZWFyLApAQCAtMTQwLDcgKzE0Myw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXRhX3BvcnRfaW5mbyBzdmlhX3BvcnRfaW5mbyA9IHsKIAkuc2h0CQk9ICZzdmlhX3NodCwKLQkuaG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TUlNUIHwgQVRBX0ZMQUdfTk9fTEVHQUNZLAorCS5ob3N0X2ZsYWdzCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX05PX0xFR0FDWSwKIAkucGlvX21hc2sJPSAweDFmLAogCS5td2RtYV9tYXNrCT0gMHgwNywKIAkudWRtYV9tYXNrCT0gMHg3ZiwKQEAgLTIzNSw4ICsyMzgsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZwcm9iZV9lbnQtPm5vZGUpOwogCiAJcHJvYmVfZW50LT5zaHQJCT0gJnN2aWFfc2h0OwotCXByb2JlX2VudC0+aG9zdF9mbGFncwk9IEFUQV9GTEFHX1NBVEEgfCBBVEFfRkxBR19TQVRBX1JFU0VUIHwKLQkJCQkgIEFUQV9GTEFHX05PX0xFR0FDWTsKKwlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZOwogCXByb2JlX2VudC0+cG9ydF9vcHMJPSAmc3ZpYV9zYXRhX29wczsKIAlwcm9iZV9lbnQtPm5fcG9ydHMJPSBOX1BPUlRTOwogCXByb2JlX2VudC0+aXJxCQk9IHBkZXYtPmlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9zY3NpL3NhdGFfdnNjLmMKaW5kZXggOGEyOWNlMy4uNmQwYzRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3NhdGFfdnNjLmMKKysrIGIvZHJpdmVycy9zY3NpL3NhdGFfdnNjLmMKQEAgLTIyMSwxNCArMjIxLDIxIEBACiAKIAkJCWFwID0gaG9zdF9zZXQtPnBvcnRzW2ldOwogCi0JCQlpZiAoYXAgJiYgIShhcC0+ZmxhZ3MgJgotCQkJCSAgICAoQVRBX0ZMQUdfUE9SVF9ESVNBQkxFRHxBVEFfRkxBR19OT0lOVFIpKSkgeworCQkJaWYgKGlzX3ZzY19zYXRhX2ludF9lcnIoaSwgaW50X3N0YXR1cykpIHsKKwkJCQl1MzIgZXJyX3N0YXR1czsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGlnbm9yaW5nIGludGVycnVwdChzKVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCQllcnJfc3RhdHVzID0gYXAgPyB2c2Nfc2F0YV9zY3JfcmVhZChhcCwgU0NSX0VSUk9SKSA6IDA7CisJCQkJdnNjX3NhdGFfc2NyX3dyaXRlKGFwLCBTQ1JfRVJST1IsIGVycl9zdGF0dXMpOworCQkJCWhhbmRsZWQrKzsKKwkJCX0KKworCQkJaWYgKGFwICYmICEoYXAtPmZsYWdzICYgQVRBX0ZMQUdfRElTQUJMRUQpKSB7CiAJCQkJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYzsKIAogCQkJCXFjID0gYXRhX3FjX2Zyb21fdGFnKGFwLCBhcC0+YWN0aXZlX3RhZyk7Ci0JCQkJaWYgKHFjICYmICghKHFjLT50Zi5jdGwgJiBBVEFfTklFTikpKSB7CisJCQkJaWYgKHFjICYmICghKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19QT0xMSU5HKSkpCiAJCQkJCWhhbmRsZWQgKz0gYXRhX2hvc3RfaW50cihhcCwgcWMpOwotCQkJCX0gZWxzZSBpZiAoaXNfdnNjX3NhdGFfaW50X2VycihpLCBpbnRfc3RhdHVzKSkgeworCQkJCWVsc2UgaWYgKGlzX3ZzY19zYXRhX2ludF9lcnIoaSwgaW50X3N0YXR1cykpIHsKIAkJCQkJLyoKIAkJCQkJICogT24gc29tZSBjaGlwcyAoaS5lLiBJbnRlbCAzMTI0NCksIGFuIGVycm9yCiAJCQkJCSAqIGludGVycnVwdCB3aWxsIHNuZWFrIGluIGF0IGluaXRpYWxpemF0aW9uCkBAIC0yNzIsNiArMjc5LDcgQEAKIAkucHJvY19uYW1lCQk9IERSVl9OQU1FLAogCS5kbWFfYm91bmRhcnkJCT0gQVRBX0RNQV9CT1VOREFSWSwKIAkuc2xhdmVfY29uZmlndXJlCT0gYXRhX3Njc2lfc2xhdmVfY29uZmlnLAorCS5zbGF2ZV9kZXN0cm95CQk9IGF0YV9zY3NpX3NsYXZlX2Rlc3Ryb3ksCiAJLmJpb3NfcGFyYW0JCT0gYXRhX3N0ZF9iaW9zX3BhcmFtLAogfTsKIApAQCAtMjgzLDE0ICsyOTEsMTcgQEAKIAkuZXhlY19jb21tYW5kCQk9IGF0YV9leGVjX2NvbW1hbmQsCiAJLmNoZWNrX3N0YXR1cwkJPSBhdGFfY2hlY2tfc3RhdHVzLAogCS5kZXZfc2VsZWN0CQk9IGF0YV9zdGRfZGV2X3NlbGVjdCwKLQkucGh5X3Jlc2V0CQk9IHNhdGFfcGh5X3Jlc2V0LAogCS5ibWRtYV9zZXR1cCAgICAgICAgICAgID0gYXRhX2JtZG1hX3NldHVwLAogCS5ibWRtYV9zdGFydCAgICAgICAgICAgID0gYXRhX2JtZG1hX3N0YXJ0LAogCS5ibWRtYV9zdG9wCQk9IGF0YV9ibWRtYV9zdG9wLAogCS5ibWRtYV9zdGF0dXMJCT0gYXRhX2JtZG1hX3N0YXR1cywKIAkucWNfcHJlcAkJPSBhdGFfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gYXRhX3FjX2lzc3VlX3Byb3QsCi0JLmVuZ190aW1lb3V0CQk9IGF0YV9lbmdfdGltZW91dCwKKwkuZGF0YV94ZmVyCQk9IGF0YV9waW9fZGF0YV94ZmVyLAorCS5mcmVlemUJCQk9IGF0YV9ibWRtYV9mcmVlemUsCisJLnRoYXcJCQk9IGF0YV9ibWRtYV90aGF3LAorCS5lcnJvcl9oYW5kbGVyCQk9IGF0YV9ibWRtYV9lcnJvcl9oYW5kbGVyLAorCS5wb3N0X2ludGVybmFsX2NtZAk9IGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZCwKIAkuaXJxX2hhbmRsZXIJCT0gdnNjX3NhdGFfaW50ZXJydXB0LAogCS5pcnFfY2xlYXIJCT0gYXRhX2JtZG1hX2lycV9jbGVhciwKIAkuc2NyX3JlYWQJCT0gdnNjX3NhdGFfc2NyX3JlYWQsCkBAIC0zODUsNyArMzk2LDcgQEAKIAogCXByb2JlX2VudC0+c2h0ID0gJnZzY19zYXRhX3NodDsKIAlwcm9iZV9lbnQtPmhvc3RfZmxhZ3MgPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfTk9fTEVHQUNZIHwKLQkJCQlBVEFfRkxBR19NTUlPIHwgQVRBX0ZMQUdfU0FUQV9SRVNFVDsKKwkJCQlBVEFfRkxBR19NTUlPOwogCXByb2JlX2VudC0+cG9ydF9vcHMgPSAmdnNjX3NhdGFfb3BzOwogCXByb2JlX2VudC0+bl9wb3J0cyA9IDQ7CiAJcHJvYmVfZW50LT5pcnEgPSBwZGV2LT5pcnE7CkBAIC00MzMsMTMgKzQ0NCwxNCBAQAogCiAKIC8qCi0gKiAweDE3MjUvMHg3MTc0IGlzIHRoZSBWaXRlc3NlIFZTQy03MTc0Ci0gKiAweDgwODYvMHgzMjAwIGlzIHRoZSBJbnRlbCAzMTI0NCwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgaWRlbnRpY2FsCi0gKiBjb21wYXRpYmlsaXR5IGlzIHVudGVzdGVkIGFzIG9mIHlldAorICogSW50ZWwgMzEyNDQgaXMgc3VwcG9zZWQgdG8gYmUgaWRlbnRpY2FsLgorICogQ29tcGF0aWJpbGl0eSBpcyB1bnRlc3RlZCBhcyBvZiB5ZXQuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2c2Nfc2F0YV9wY2lfdGJsW10gPSB7Ci0JeyAweDE3MjUsIDB4NzE3NCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMHgxMDYwMCwgMHhGRkZGRkYsIDAgfSwKLQl7IDB4ODA4NiwgMHgzMjAwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAweDEwNjAwLCAweEZGRkZGRiwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9WSVRFU1NFLCBQQ0lfREVWSUNFX0lEX1ZJVEVTU0VfVlNDNzE3NCwKKwkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDB4MTA2MDAsIDB4RkZGRkZGLCAwIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0dEMzEyNDQsCisJICBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAweDEwNjAwLCAweEZGRkZGRiwgMCB9LAogCXsgfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2kuYyBiL2RyaXZlcnMvc2NzaS9zY3NpLmMKaW5kZXggM2U5MGJhNy4uMmFiN2RmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaS5jCkBAIC01NzksNiArNTc5LDI0IEBACiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGxpc3RfaGVhZCwgc2NzaV9kb25lX3EpOwogCiAvKioKKyAqIHNjc2lfcmVxX2Fib3J0X2NtZCAtLSBSZXF1ZXN0IGNvbW1hbmQgcmVjb3ZlcnkgZm9yIHRoZSBzcGVjaWZpZWQgY29tbWFuZAorICogY21kOiBwb2ludGVyIHRvIHRoZSBTQ1NJIGNvbW1hbmQgb2YgaW50ZXJlc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIHRoYXQgU0NTSSBDb3JlIHN0YXJ0IHJlY292ZXJ5IGZvciB0aGUKKyAqIGNvbW1hbmQgYnkgZGVsZXRpbmcgdGhlIHRpbWVyIGFuZCBhZGRpbmcgdGhlIGNvbW1hbmQgdG8gdGhlIGVoCisgKiBxdWV1ZS4gIEl0IGNhbiBiZSBjYWxsZWQgYnkgZWl0aGVyIExMRERzIG9yIFNDU0kgQ29yZS4gIExMRERzIHdobworICogaW1wbGVtZW50IHRoZWlyIG93biBlcnJvciByZWNvdmVyeSBNQVkgaWdub3JlIHRoZSB0aW1lb3V0IGV2ZW50IGlmCisgKiB0aGV5IGdlbmVyYXRlZCBzY3NpX3JlcV9hYm9ydF9jbWQuCisgKi8KK3ZvaWQgc2NzaV9yZXFfYWJvcnRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCkKK3sKKwlpZiAoIXNjc2lfZGVsZXRlX3RpbWVyKGNtZCkpCisJCXJldHVybjsKKwlzY3NpX3RpbWVzX291dChjbWQpOworfQorRVhQT1JUX1NZTUJPTChzY3NpX3JlcV9hYm9ydF9jbWQpOworCisvKioKICAqIHNjc2lfZG9uZSAtIEVucXVldWUgdGhlIGZpbmlzaGVkIFNDU0kgY29tbWFuZCBpbnRvIHRoZSBkb25lIHF1ZXVlLgogICogQGNtZDogVGhlIFNDU0kgQ29tbWFuZCBmb3Igd2hpY2ggYSBsb3ctbGV2ZWwgZGV2aWNlIGRyaXZlciAoTExERCkgZ2l2ZXMKICAqIG93bmVyc2hpcCBiYWNrIHRvIFNDU0kgQ29yZSAtLSBpLmUuIHRoZSBMTEREIGhhcyBmaW5pc2hlZCB3aXRoIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKaW5kZXggMWM3ZDk5My4uNmE3YTYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCkBAIC01OCw2ICs1OCwyOCBAQAogfQogCiAvKioKKyAqIHNjc2lfc2NoZWR1bGVfZWggLSBzY2hlZHVsZSBFSCBmb3IgU0NTSSBob3N0CisgKiBAc2hvc3Q6CVNDU0kgaG9zdCB0byBpbnZva2UgZXJyb3IgaGFuZGxpbmcgb24uCisgKgorICogU2NoZWR1bGUgU0NTSSBFSCB3aXRob3V0IHNjbWQuCisgKiovCit2b2lkIHNjc2lfc2NoZWR1bGVfZWgoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKKworCWlmIChzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9SRUNPVkVSWSkgPT0gMCB8fAorCSAgICBzY3NpX2hvc3Rfc2V0X3N0YXRlKHNob3N0LCBTSE9TVF9DQU5DRUxfUkVDT1ZFUlkpID09IDApIHsKKwkJc2hvc3QtPmhvc3RfZWhfc2NoZWR1bGVkKys7CisJCXNjc2lfZWhfd2FrZXVwKHNob3N0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKHNob3N0LT5ob3N0X2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNjc2lfc2NoZWR1bGVfZWgpOworCisvKioKICAqIHNjc2lfZWhfc2NtZF9hZGQgLSBhZGQgc2NzaSBjbWQgdG8gZXJyb3IgaGFuZGxpbmcuCiAgKiBAc2NtZDoJc2NtZCB0byBydW4gZWggb24uCiAgKiBAZWhfZmxhZzoJb3B0aW9uYWwgU0NTSV9FSCBmbGFnLgpAQCAtMTUxNSw3ICsxNTM3LDcgQEAKIAkgKi8KIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7Ci0JCWlmIChzaG9zdC0+aG9zdF9mYWlsZWQgPT0gMCB8fAorCQlpZiAoKHNob3N0LT5ob3N0X2ZhaWxlZCA9PSAwICYmIHNob3N0LT5ob3N0X2VoX3NjaGVkdWxlZCA9PSAwKSB8fAogCQkgICAgc2hvc3QtPmhvc3RfZmFpbGVkICE9IHNob3N0LT5ob3N0X2J1c3kpIHsKIAkJCVNDU0lfTE9HX0VSUk9SX1JFQ09WRVJZKDEsCiAJCQkJcHJpbnRrKCJFcnJvciBoYW5kbGVyIHNjc2lfZWhfJWQgc2xlZXBpbmdcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDMzMDJkODAuLjNkMDRhOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC01MDAsNyArNTAwLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZShzaG9zdC0+aG9zdF9sb2NrLCBmbGFncyk7CiAJc2hvc3QtPmhvc3RfYnVzeS0tOwogCWlmICh1bmxpa2VseShzY3NpX2hvc3RfaW5fcmVjb3Zlcnkoc2hvc3QpICYmCi0JCSAgICAgc2hvc3QtPmhvc3RfZmFpbGVkKSkKKwkJICAgICAoc2hvc3QtPmhvc3RfZmFpbGVkIHx8IHNob3N0LT5ob3N0X2VoX3NjaGVkdWxlZCkpKQogCQlzY3NpX2VoX3dha2V1cChzaG9zdCk7CiAJc3Bpbl91bmxvY2soc2hvc3QtPmhvc3RfbG9jayk7CiAJc3Bpbl9sb2NrKHNkZXYtPnJlcXVlc3RfcXVldWUtPnF1ZXVlX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2FwaS5oIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X2FwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNGYwZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfYXBpLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9TQ1NJX1RSQU5TUE9SVF9BUElfSAorI2RlZmluZSBfU0NTSV9UUkFOU1BPUlRfQVBJX0gKKwordm9pZCBzY3NpX3NjaGVkdWxlX2VoKHN0cnVjdCBTY3NpX0hvc3QgKnNob3N0KTsKKworI2VuZGlmIC8qIF9TQ1NJX1RSQU5TUE9SVF9BUElfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3N0LmMgYi9kcml2ZXJzL3Njc2kvc3QuYwppbmRleCBhZDg3ZDczLi4xMjcyZGQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc3QuYworKysgYi9kcml2ZXJzL3Njc2kvc3QuYwpAQCAtMTE5Myw3ICsxMTkzLDcgQEAKIAwKIAogLyogRmx1c2ggdGhlIHRhcGUgYnVmZmVyIGJlZm9yZSBjbG9zZSAqLwotc3RhdGljIGludCBzdF9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgc3RfZmx1c2goc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiB7CiAJaW50IHJlc3VsdCA9IDAsIHJlc3VsdDI7CiAJdW5zaWduZWQgY2hhciBjbWRbTUFYX0NPTU1BTkRfU0laRV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMgYi9kcml2ZXJzL3Njc2kvc3VuM3hfZXNwLmMKaW5kZXggY2M5OTBiZS4uMmUyYzFlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3N1bjN4X2VzcC5jCisrKyBiL2RyaXZlcnMvc2NzaS9zdW4zeF9lc3AuYwpAQCAtMzMyLDExICszMzIsMTEgQEAKICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc3AtPlNDcC5idWZmZXI7CiAKICAgICB3aGlsZSAoc3ogPj0gMCkgewotCSAgICBzZ1tzel0uZHZtYV9hZGRyZXNzID0gZHZtYV9tYXAoKHVuc2lnbmVkIGxvbmcpcGFnZV9hZGRyZXNzKHNnW3N6XS5wYWdlKSArCisJICAgIHNnW3N6XS5kbWFfYWRkcmVzcyA9IGR2bWFfbWFwKCh1bnNpZ25lZCBsb25nKXBhZ2VfYWRkcmVzcyhzZ1tzel0ucGFnZSkgKwogCQkJCQkgICBzZ1tzel0ub2Zmc2V0LCBzZ1tzel0ubGVuZ3RoKTsKIAkgICAgc3otLTsKICAgICB9Ci0gICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmR2bWFfYWRkcmVzcyk7CisgICAgc3AtPlNDcC5wdHI9KGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX21tdV9yZWxlYXNlX3Njc2lfb25lIChzdHJ1Y3QgTkNSX0VTUCAqZXNwLCBTY3NpX0NtbmQgKnNwKQpAQCAtMzUwLDE0ICszNTAsMTQgQEAKICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKHN0cnVjdCBzY2F0dGVybGlzdCAqKXNwLT5idWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICB3aGlsZShzeiA+PSAwKSB7Ci0gICAgICAgIGR2bWFfdW5tYXAoKGNoYXIgKilzZ1tzel0uZHZtYV9hZGRyZXNzKTsKKyAgICAgICAgZHZtYV91bm1hcCgoY2hhciAqKXNnW3N6XS5kbWFfYWRkcmVzcyk7CiAgICAgICAgIHN6LS07CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBkbWFfYWR2YW5jZV9zZyAoU2NzaV9DbW5kICpzcCkKIHsKLSAgICBzcC0+U0NwLnB0ciA9IChjaGFyICopKCh1bnNpZ25lZCBsb25nKXNwLT5TQ3AuYnVmZmVyLT5kdm1hX2FkZHJlc3MpOworICAgIHNwLT5TQ3AucHRyID0gKGNoYXIgKikoKHVuc2lnbmVkIGxvbmcpc3AtPlNDcC5idWZmZXItPmRtYV9hZGRyZXNzKTsKIH0KIAogc3RhdGljIGludCBzdW4zeF9lc3BfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICppbnN0YW5jZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmMgYi9kcml2ZXJzL3Njc2kvd2QzM2M5My5jCmluZGV4IDkzNDE3MDMuLjI3MzA3ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS93ZDMzYzkzLmMKKysrIGIvZHJpdmVycy9zY3NpL3dkMzNjOTMuYwpAQCAtOTM5LDYgKzkzOSw3IEBACiAJCURCKERCX0lOVFIsIHByaW50aygiJTAyeCIsIGNtZC0+U0NwLlN0YXR1cykpCiAJCSAgICBpZiAoaG9zdGRhdGEtPmxldmVsMiA+PSBMMl9CQVNJQykgewogCQkJc3IgPSByZWFkX3dkMzNjOTMocmVncywgV0RfU0NTSV9TVEFUVVMpOwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwkJCXVkZWxheSg3KTsKIAkJCWhvc3RkYXRhLT5zdGF0ZSA9IFNfUlVOTklOR19MRVZFTDI7CiAJCQl3cml0ZV93ZDMzYzkzKHJlZ3MsIFdEX0NPTU1BTkRfUEhBU0UsIDB4NTApOwogCQkJd3JpdGVfd2QzM2M5M19jbWQocmVncywgV0RfQ01EX1NFTF9BVE5fWEZFUik7CkBAIC05NTUsNiArOTU2LDcgQEAKIAogCQltc2cgPSByZWFkXzFfYnl0ZShyZWdzKTsKIAkJc3IgPSByZWFkX3dkMzNjOTMocmVncywgV0RfU0NTSV9TVEFUVVMpOwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwkJdWRlbGF5KDcpOwogCiAJCWhvc3RkYXRhLT5pbmNvbWluZ19tc2dbaG9zdGRhdGEtPmluY29taW5nX3B0cl0gPSBtc2c7CiAJCWlmIChob3N0ZGF0YS0+aW5jb21pbmdfbXNnWzBdID09IEVYVEVOREVEX01FU1NBR0UpCkBAIC0xMzU4LDYgKzEzNjAsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQkvKiBWZXJpZnkgdGhpcyBpcyBhIGNoYW5nZSB0byBNU0dfSU4gYW5kIHJlYWQgdGhlIG1lc3NhZ2UgKi8KIAkJCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisJCQkJdWRlbGF5KDcpOwogCQkJCWlmIChzciA9PSAoQ1NSX0FCT1JUIHwgUEhTX01FU1NfSU4pIHx8CiAJCQkJICAgIHNyID09IChDU1JfVU5FWFAgfCBQSFNfTUVTU19JTikgfHwKIAkJCQkgICAgc3IgPT0gKENTUl9TUlZfUkVRIHwgUEhTX01FU1NfSU4pKSB7CkBAIC0xMzc0LDYgKzEzNzcsNyBAQAogCQkJCQkJCSAgICAgYXNyKTsKIAkJCQkJfQogCQkJCQlzciA9IHJlYWRfd2QzM2M5MyhyZWdzLCBXRF9TQ1NJX1NUQVRVUyk7CisJCQkJCXVkZWxheSg3KTsKIAkJCQkJaWYgKHNyICE9IENTUl9NU0dJTikKIAkJCQkJCXByaW50awogCQkJCQkJICAgICgid2QzM2M5MzogTm90IHBhdXNlZCB3aXRoIEFDSyBvbiBSRVNFTCAoJTAyeClcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMgYi9kcml2ZXJzL3Njc2kvd2Q3MDAwLmMKaW5kZXggZTU1ZjBlZS4uNTc0OTU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3dkNzAwMC5jCisrKyBiL2RyaXZlcnMvc2NzaS93ZDcwMDAuYwpAQCAtMTM5MSw3ICsxMzkxLDcgQEAKICAqCiAgKi8KIAotc3RhdGljIGludCB3ZDcwMDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCitzdGF0aWMgX19pbml0IGludCB3ZDcwMDBfZGV0ZWN0KHN0cnVjdCBzY3NpX2hvc3RfdGVtcGxhdGUgKnRwbnQpCiB7CiAJc2hvcnQgcHJlc2VudCA9IDAsIGJpb3NhZGRyX3B0ciwgc2lnX3B0ciwgaSwgcGFzczsKIAlzaG9ydCBiaW9zcHRyW05VTV9DT05GSUdTXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcgYi9kcml2ZXJzL3NlcmlhbC9LY29uZmlnCmluZGV4IDVlYTc3OGYuLjViNDhhYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL0tjb25maWcKKysrIGIvZHJpdmVycy9zZXJpYWwvS2NvbmZpZwpAQCAtMzU0LDIxICszNTQsMjQgQEAKIAkgIGtlcm5lbCBhdCBib290IHRpbWUuKQogCiBjb25maWcgU0VSSUFMX1MzQzI0MTAKLQl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0MyNDEwIFNlcmlhbCBwb3J0IHN1cHBvcnQiCisJdHJpc3RhdGUgIlNhbXN1bmcgUzNDMjQxMC9TM0MyNDQwL1MzQzI0NDIvUzNDMjQxMiBTZXJpYWwgcG9ydCBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJNICYmIEFSQ0hfUzNDMjQxMAogCXNlbGVjdCBTRVJJQUxfQ09SRQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIFVBUlRzIG9uIHRoZSBTYW1zdW5nIFMzQzI0MTBYIENQVSwKKwkgIFN1cHBvcnQgZm9yIHRoZSBvbi1jaGlwIFVBUlRzIG9uIHRoZSBTYW1zdW5nIFMzQzI0WFggc2VyaWVzIENQVXMsCiAJICBwcm92aWRpbmcgL2Rldi90dHlTQUMwLCAxIGFuZCAyIChub3RlLCBzb21lIG1hY2hpbmVzIG1heSBub3QKIAkgIHByb3ZpZGUgYWxsIG9mIHRoZXNlIHBvcnRzLCBkZXBlbmRpbmcgb24gaG93IHRoZSBzZXJpYWwgcG9ydAogCSAgcGlucyBhcmUgY29uZmlndXJlZC4KIAorCSAgQ3VycmVudGx5IHRoaXMgZHJpdmVyIHN1cHBvcnRzIHRoZSBVQVJUUyBvbiB0aGUgUzNDMjQxMCwgUzNDMjQ0MCwKKwkgIFMzQzI0NDIsIFMzQzI0MTIgYW5kIFMzQzI0MTMgQ1BVcy4KKwogY29uZmlnIFNFUklBTF9TM0MyNDEwX0NPTlNPTEUKIAlib29sICJTdXBwb3J0IGZvciBjb25zb2xlIG9uIFMzQzI0MTAgc2VyaWFsIHBvcnQiCiAJZGVwZW5kcyBvbiBTRVJJQUxfUzNDMjQxMD15CiAJc2VsZWN0IFNFUklBTF9DT1JFX0NPTlNPTEUKIAloZWxwCi0JICBBbGxvdyBzZWxlY3Rpb24gb2YgdGhlIFMzQzI0MTAgb24tYm9hcmQgc2VyaWFsIHBvcnRzIGZvciB1c2UgYXMKKwkgIEFsbG93IHNlbGVjdGlvbiBvZiB0aGUgUzNDMjRYWCBvbi1ib2FyZCBzZXJpYWwgcG9ydHMgZm9yIHVzZSBhcwogCSAgYW4gdmlydHVhbCBjb25zb2xlLgogCiAJICBFdmVuIGlmIHlvdSBzYXkgWSBoZXJlLCB0aGUgY3VycmVudGx5IHZpc2libGUgdmlydHVhbCBjb25zb2xlCkBAIC05MzcsNCArOTQwLDIzIEBACiAJICBJZiB5b3UgaGF2ZSBhbiBTR0kgQWx0aXggd2l0aCBhbiBJT0MzIHNlcmlhbCBjYXJkLAogCSAgc2F5IFkgb3IgTS4gIE90aGVyd2lzZSwgc2F5IE4uCiAKK2NvbmZpZyBTRVJJQUxfTkVUWAorCWJvb2wgIk5ldFggc2VyaWFsIHBvcnQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSTSAmJiBBUkNIX05FVFgKKwlzZWxlY3QgU0VSSUFMX0NPUkUKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIG1hY2hpbmUgYmFzZWQgb24gYSBIaWxzY2hlciBOZXRYIFNvQyB5b3UKKwkgIGNhbiBlbmFibGUgaXRzIG9uYm9hcmQgc2VyaWFsIHBvcnQgYnkgZW5hYmxpbmcgdGhpcyBvcHRpb24uCisKKyAgICAgICAgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKyAgICAgICAgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbmV0eC1zZXJpYWwuCisKK2NvbmZpZyBTRVJJQUxfTkVUWF9DT05TT0xFCisJYm9vbCAiQ29uc29sZSBvbiBOZXRYIHNlcmlhbCBwb3J0IgorCWRlcGVuZHMgb24gU0VSSUFMX05FVFgKKwlzZWxlY3QgU0VSSUFMX0NPUkVfQ09OU09MRQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIGVuYWJsZWQgdGhlIHNlcmlhbCBwb3J0IG9uIHRoZSBNb3Rvcm9sYSBJTVgKKwkgIENQVSB5b3UgY2FuIG1ha2UgaXQgdGhlIGNvbnNvbGUgYnkgYW5zd2VyaW5nIFkgdG8gdGhpcyBvcHRpb24uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL01ha2VmaWxlIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKaW5kZXggMGE3MWJmNi4uOTI3ZmFlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zZXJpYWwvTWFrZWZpbGUKQEAgLTU1LDMgKzU1LDQgQEAKIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzQpICs9IGlvYzRfc2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfU0dJX0lPQzMpICs9IGlvYzNfc2VyaWFsLm8KIG9iai0kKENPTkZJR19TRVJJQUxfQVQ5MSkgKz0gYXQ5MV9zZXJpYWwubworb2JqLSQoQ09ORklHX1NFUklBTF9ORVRYKSArPSBuZXR4LXNlcmlhbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMgYi9kcml2ZXJzL3NlcmlhbC9hbWJhLXBsMDEwLmMKaW5kZXggMTYzMTQxNC4uZTkyMGQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvYW1iYS1wbDAxMC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2FtYmEtcGwwMTAuYwpAQCAtNTIsNyArNTIsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLSNkZWZpbmUgVUFSVF9OUgkJMgorI2RlZmluZSBVQVJUX05SCQk4CiAKICNkZWZpbmUgU0VSSUFMX0FNQkFfTUFKT1IJMjA0CiAjZGVmaW5lIFNFUklBTF9BTUJBX01JTk9SCTE2CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jIGIvZHJpdmVycy9zZXJpYWwvaW9jNF9zZXJpYWwuYwppbmRleCBjNjIwMjA5Li43MTdlNDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9pb2M0X3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL2lvYzRfc2VyaWFsLmMKQEAgLTI2NDYsNyArMjY0NiwxMCBAQAogCXN0cnVjdCBpb2M0X3BvcnQgKnBvcnQ7CiAJc3RydWN0IGlvYzRfc29mdCAqc29mdDsKIAorCS8qIElmIHNlcmlhbCBkcml2ZXIgZGlkIG5vdCBhdHRhY2gsIGRvbid0IHRyeSB0byBkZXRhY2ggKi8KIAljb250cm9sID0gaWRkLT5pZGRfc2VyaWFsX2RhdGE7CisJaWYgKCFjb250cm9sKQorCQlyZXR1cm4gMDsKIAogCWZvciAocG9ydF9udW0gPSAwOyBwb3J0X251bSA8IElPQzRfTlVNX1NFUklBTF9QT1JUUzsgcG9ydF9udW0rKykgewogCQlmb3IgKHBvcnRfdHlwZSA9IFVBUlRfUE9SVF9NSU47CkBAIC0yNzc4LDYgKzI3ODEsMTIgQEAKIAlEUFJJTlRfQ09ORklHKCgiJXMgKDB4JXAsIDB4JXApXG4iLCBfX0ZVTkNUSU9OX18sIGlkZC0+aWRkX3BkZXYsCiAJCQkJCQkJaWRkLT5pZGRfcGNpX2lkKSk7CiAKKwkvKiBQQ0ktUlQgZG9lcyBub3QgYnJpbmcgb3V0IHNlcmlhbCBjb25uZWN0aW9ucy4KKwkgKiBEbyBub3QgYXR0YWNoIHRvIHRoaXMgcGFydGljdWxhciBJT0M0LgorCSAqLworCWlmIChpZGQtPmlkZF92YXJpYW50ID09IElPQzRfVkFSSUFOVF9QQ0lfUlQpCisJCXJldHVybiAwOworCiAJLyogcmVxdWVzdCBzZXJpYWwgcmVnaXN0ZXJzICovCiAJdG1wX2FkZHIxID0gaWRkLT5pZGRfYmFyMCArIElPQzRfU0VSSUFMX09GRlNFVDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvbmV0eC1zZXJpYWwuYyBiL2RyaXZlcnMvc2VyaWFsL25ldHgtc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhZGM5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc2VyaWFsL25ldHgtc2VyaWFsLmMKQEAgLTAsMCArMSw3NDkgQEAKKy8qCisgKiBkcml2ZXJzL3NlcmlhbC9uZXR4LXNlcmlhbC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX1NFUklBTF9ORVRYX0NPTlNPTEUpICYmIGRlZmluZWQoQ09ORklHX01BR0lDX1NZU1JRKQorI2RlZmluZSBTVVBQT1JUX1NZU1JRCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2FyY2gvbmV0eC1yZWdzLmg+CisKKy8qIFdlJ3ZlIGJlZW4gYXNzaWduZWQgYSByYW5nZSBvbiB0aGUgIkxvdy1kZW5zaXR5IHNlcmlhbCBwb3J0cyIgbWFqb3IgKi8KKyNkZWZpbmUgU0VSSUFMX05YX01BSk9SCTIwNAorI2RlZmluZSBNSU5PUl9TVEFSVAkxNzAKKworI2lmZGVmIENPTkZJR19TRVJJQUxfTkVUWF9DT05TT0xFCisKK2VudW0gdWFydF9yZWdzIHsKKwlVQVJUX0RSICAgICAgICAgICAgICA9IDB4MDAsCisJVUFSVF9TUiAgICAgICAgICAgICAgPSAweDA0LAorCVVBUlRfTElORV9DUiAgICAgICAgID0gMHgwOCwKKwlVQVJUX0JBVURESVZfTVNCICAgICA9IDB4MGMsCisJVUFSVF9CQVVERElWX0xTQiAgICAgPSAweDEwLAorCVVBUlRfQ1IgICAgICAgICAgICAgID0gMHgxNCwKKwlVQVJUX0ZSICAgICAgICAgICAgICA9IDB4MTgsCisJVUFSVF9JSVIgICAgICAgICAgICAgPSAweDFjLAorCVVBUlRfSUxQUiAgICAgICAgICAgID0gMHgyMCwKKwlVQVJUX1JUU19DUiAgICAgICAgICA9IDB4MjQsCisJVUFSVF9SVFNfTEVBRCAgICAgICAgPSAweDI4LAorCVVBUlRfUlRTX1RSQUlMICAgICAgID0gMHgyYywKKwlVQVJUX0RSVl9FTkFCTEUgICAgICA9IDB4MzAsCisJVUFSVF9CUk1fQ1IgICAgICAgICAgPSAweDM0LAorCVVBUlRfUlhGSUZPX0lSUUxFVkVMID0gMHgzOCwKKwlVQVJUX1RYRklGT19JUlFMRVZFTCA9IDB4M2MsCit9OworCisjZGVmaW5lIFNSX0ZFICgxPDwwKQorI2RlZmluZSBTUl9QRSAoMTw8MSkKKyNkZWZpbmUgU1JfQkUgKDE8PDIpCisjZGVmaW5lIFNSX09FICgxPDwzKQorCisjZGVmaW5lIExJTkVfQ1JfQlJLICAgICAgICgxPDwwKQorI2RlZmluZSBMSU5FX0NSX1BFTiAgICAgICAoMTw8MSkKKyNkZWZpbmUgTElORV9DUl9FUFMgICAgICAgKDE8PDIpCisjZGVmaW5lIExJTkVfQ1JfU1RQMiAgICAgICgxPDwzKQorI2RlZmluZSBMSU5FX0NSX0ZFTiAgICAgICAoMTw8NCkKKyNkZWZpbmUgTElORV9DUl81QklUICAgICAgKDA8PDUpCisjZGVmaW5lIExJTkVfQ1JfNkJJVCAgICAgICgxPDw1KQorI2RlZmluZSBMSU5FX0NSXzdCSVQgICAgICAoMjw8NSkKKyNkZWZpbmUgTElORV9DUl84QklUICAgICAgKDM8PDUpCisjZGVmaW5lIExJTkVfQ1JfQklUU19NQVNLICgzPDw1KQorCisjZGVmaW5lIENSX1VBUlRfRU4gKDE8PDApCisjZGVmaW5lIENSX1NJUkVOICAgKDE8PDEpCisjZGVmaW5lIENSX1NJUkxQICAgKDE8PDIpCisjZGVmaW5lIENSX01TSUUgICAgKDE8PDMpCisjZGVmaW5lIENSX1JJRSAgICAgKDE8PDQpCisjZGVmaW5lIENSX1RJRSAgICAgKDE8PDUpCisjZGVmaW5lIENSX1JUSUUgICAgKDE8PDYpCisjZGVmaW5lIENSX0xCRSAgICAgKDE8PDcpCisKKyNkZWZpbmUgRlJfQ1RTICAoMTw8MCkKKyNkZWZpbmUgRlJfRFNSICAoMTw8MSkKKyNkZWZpbmUgRlJfRENEICAoMTw8MikKKyNkZWZpbmUgRlJfQlVTWSAoMTw8MykKKyNkZWZpbmUgRlJfUlhGRSAoMTw8NCkKKyNkZWZpbmUgRlJfVFhGRiAoMTw8NSkKKyNkZWZpbmUgRlJfUlhGRiAoMTw8NikKKyNkZWZpbmUgRlJfVFhGRSAoMTw8NykKKworI2RlZmluZSBJSVJfTUlTICgxPDwwKQorI2RlZmluZSBJSVJfUklTICgxPDwxKQorI2RlZmluZSBJSVJfVElTICgxPDwyKQorI2RlZmluZSBJSVJfUlRJUyAoMTw8MykKKyNkZWZpbmUgSUlSX01BU0sgMHhmCisKKyNkZWZpbmUgUlRTX0NSX0FVVE8gKDE8PDApCisjZGVmaW5lIFJUU19DUl9SVFMgICgxPDwxKQorI2RlZmluZSBSVFNfQ1JfQ09VTlQgKDE8PDIpCisjZGVmaW5lIFJUU19DUl9NT0QyICAoMTw8MykKKyNkZWZpbmUgUlRTX0NSX1JUU19QT0wgKDE8PDQpCisjZGVmaW5lIFJUU19DUl9DVFNfQ1RSICgxPDw1KQorI2RlZmluZSBSVFNfQ1JfQ1RTX1BPTCAoMTw8NikKKyNkZWZpbmUgUlRTX0NSX1NUSUNLICAgKDE8PDcpCisKKyNkZWZpbmUgVUFSVF9QT1JUX1NJWkUgMHg0MAorI2RlZmluZSBEUklWRVJfTkFNRSAibmV0eC11YXJ0IgorCitzdHJ1Y3QgbmV0eF9wb3J0IHsKKwlzdHJ1Y3QgdWFydF9wb3J0CXBvcnQ7Cit9OworCitzdGF0aWMgdm9pZCBuZXR4X3N0b3BfdHgoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXZhbCA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKKwl3cml0ZWwodmFsICYgfkNSX1RJRSwgIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKK30KKworc3RhdGljIHZvaWQgbmV0eF9zdG9wX3J4KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl2YWwgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisJd3JpdGVsKHZhbCAmIH5DUl9SSUUsICBwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7Cit9CisKK3N0YXRpYyB2b2lkIG5ldHhfZW5hYmxlX21zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl2YWwgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisJd3JpdGVsKHZhbCB8IENSX01TSUUsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldHhfdHJhbnNtaXRfYnVmZmVyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGNpcmNfYnVmICp4bWl0ID0gJnBvcnQtPmluZm8tPnhtaXQ7CisKKwlpZiAocG9ydC0+eF9jaGFyKSB7CisJCXdyaXRlbChwb3J0LT54X2NoYXIsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0RSKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJCXBvcnQtPnhfY2hhciA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAodWFydF90eF9zdG9wcGVkKHBvcnQpIHx8IHVhcnRfY2lyY19lbXB0eSh4bWl0KSkgeworCQluZXR4X3N0b3BfdHgocG9ydCk7CisJCXJldHVybjsKKwl9CisKKwlkbyB7CisJCS8qIHNlbmQgeG1pdC0+YnVmW3htaXQtPnRhaWxdCisJCSAqIG91dCB0aGUgcG9ydCBoZXJlICovCisJCXdyaXRlbCh4bWl0LT5idWZbeG1pdC0+dGFpbF0sIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0RSKTsKKwkJeG1pdC0+dGFpbCA9ICh4bWl0LT50YWlsICsgMSkgJgorCQkgICAgICAgICAoVUFSVF9YTUlUX1NJWkUgLSAxKTsKKwkJcG9ydC0+aWNvdW50LnR4Kys7CisJCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCQlicmVhazsKKwl9IHdoaWxlICghKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0ZSKSAmIEZSX1RYRkYpKTsKKworCWlmICh1YXJ0X2NpcmNfZW1wdHkoeG1pdCkpCisJCW5ldHhfc3RvcF90eChwb3J0KTsKK30KKworc3RhdGljIHZvaWQgbmV0eF9zdGFydF90eChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXdyaXRlbCgKKwkgICAgcmVhZGwocG9ydC0+bWVtYmFzZSArIFVBUlRfQ1IpIHwgQ1JfVElFLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisKKwlpZiAoIShyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9GUikgJiBGUl9UWEZGKSkKKwkJbmV0eF90cmFuc21pdF9idWZmZXIocG9ydCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbmV0eF90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXJldHVybiByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9GUikgJiBGUl9CVVNZID8gMCA6IFRJT0NTRVJfVEVNVDsKK30KKworc3RhdGljIHZvaWQgbmV0eF90eGludChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQoreworCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZwb3J0LT5pbmZvLT54bWl0OworCisJaWYgKHVhcnRfY2lyY19lbXB0eSh4bWl0KSB8fCB1YXJ0X3R4X3N0b3BwZWQocG9ydCkpIHsKKwkJbmV0eF9zdG9wX3R4KHBvcnQpOworCQlyZXR1cm47CisJfQorCisJbmV0eF90cmFuc21pdF9idWZmZXIocG9ydCk7CisKKwlpZiAodWFydF9jaXJjX2NoYXJzX3BlbmRpbmcoeG1pdCkgPCBXQUtFVVBfQ0hBUlMpCisJCXVhcnRfd3JpdGVfd2FrZXVwKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBuZXR4X3J4aW50KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGNoYXIgcngsIGZsZywgc3RhdHVzOworCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBwb3J0LT5pbmZvLT50dHk7CisKKwl3aGlsZSAoIShyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9GUikgJiBGUl9SWEZFKSkgeworCQlyeCA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0RSKTsKKwkJZmxnID0gVFRZX05PUk1BTDsKKwkJcG9ydC0+aWNvdW50LnJ4Kys7CisJCXN0YXR1cyA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX1NSKTsKKwkJaWYgKHN0YXR1cyAmIFNSX0JFKSB7CisJCQl3cml0ZWwoMCwgcG9ydC0+bWVtYmFzZSArIFVBUlRfU1IpOworCQkJaWYgKHVhcnRfaGFuZGxlX2JyZWFrKHBvcnQpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChTUl9GRSB8IFNSX1BFIHwgU1JfT0UpKSkgeworCisJCQlpZiAoc3RhdHVzICYgU1JfUEUpCisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJZWxzZSBpZiAoc3RhdHVzICYgU1JfRkUpCisJCQkJcG9ydC0+aWNvdW50LmZyYW1lKys7CisJCQlpZiAoc3RhdHVzICYgU1JfT0UpCisJCQkJcG9ydC0+aWNvdW50Lm92ZXJydW4rKzsKKworCQkJc3RhdHVzICY9IHBvcnQtPnJlYWRfc3RhdHVzX21hc2s7CisKKwkJCWlmIChzdGF0dXMgJiBTUl9CRSkKKwkJCQlmbGcgPSBUVFlfQlJFQUs7CisJCQllbHNlIGlmIChzdGF0dXMgJiBTUl9QRSkKKwkJCQlmbGcgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAoc3RhdHVzICYgU1JfRkUpCisJCQkJZmxnID0gVFRZX0ZSQU1FOworCQl9CisKKwkJaWYgKHVhcnRfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgcngsIHJlZ3MpKQorCQkJY29udGludWU7CisKKwkJdWFydF9pbnNlcnRfY2hhcihwb3J0LCBzdGF0dXMsIFNSX09FLCByeCwgZmxnKTsKKwl9CisKKwl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOworCXJldHVybjsKK30KKworc3RhdGljIGlycXJldHVybl90IG5ldHhfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9IChzdHJ1Y3QgdWFydF9wb3J0ICopZGV2X2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jayxmbGFncyk7CisKKwlzdGF0dXMgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9JSVIpICYgSUlSX01BU0s7CisJd2hpbGUgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzICYgSUlSX1JJUykKKwkJCW5ldHhfcnhpbnQocG9ydCwgcmVncyk7CisJCWlmIChzdGF0dXMgJiBJSVJfVElTKQorCQkJbmV0eF90eGludChwb3J0KTsKKwkJaWYgKHN0YXR1cyAmIElJUl9NSVMpIHsKKwkJCWlmIChyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9GUikgJiBGUl9DVFMpCisJCQkJdWFydF9oYW5kbGVfY3RzX2NoYW5nZShwb3J0LCAxKTsKKwkJCWVsc2UKKwkJCQl1YXJ0X2hhbmRsZV9jdHNfY2hhbmdlKHBvcnQsIDApOworCQl9CisJCXdyaXRlbCgwLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9JSVIpOworCQlzdGF0dXMgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9JSVIpICYgSUlSX01BU0s7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jayxmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG5ldHhfZ2V0X21jdHJsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJdW5zaWduZWQgaW50IHJldCA9IFRJT0NNX0RTUiB8IFRJT0NNX0NBUjsKKworCWlmIChyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9GUikgJiBGUl9DVFMpCisJCXJldCB8PSBUSU9DTV9DVFM7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuZXR4X3NldF9tY3RybChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgbWN0cmwpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChtY3RybCAmIFRJT0NNX1JUUykgeworCQl2YWwgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9SVFNfQ1IpOworCQl3cml0ZWwodmFsIHwgUlRTX0NSX1JUUywgcG9ydC0+bWVtYmFzZSArIFVBUlRfUlRTX0NSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ldHhfYnJlYWtfY3RsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBicmVha19zdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbGluZV9jcjsKKwlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKworCWxpbmVfY3IgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9MSU5FX0NSKTsKKwlpZiAoYnJlYWtfc3RhdGUgIT0gMCkKKwkJbGluZV9jciB8PSBMSU5FX0NSX0JSSzsKKwllbHNlCisJCWxpbmVfY3IgJj0gfkxJTkVfQ1JfQlJLOworCXdyaXRlbChsaW5lX2NyLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9MSU5FX0NSKTsKKworCXNwaW5fdW5sb2NrX2lycSgmcG9ydC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgbmV0eF9zdGFydHVwKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlcXVlc3RfaXJxKHBvcnQtPmlycSwgbmV0eF9pbnQsIDAsCisJCQkgICAgIERSSVZFUl9OQU1FLCBwb3J0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocG9ydC0+ZGV2LCAidW5hYmxlIHRvIGdyYWIgaXJxJWRcbiIscG9ydC0+aXJxKTsKKwkJZ290byBleGl0OworCX0KKworCXdyaXRlbChyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9MSU5FX0NSKSB8IExJTkVfQ1JfRkVOLAorCQlwb3J0LT5tZW1iYXNlICsgVUFSVF9MSU5FX0NSKTsKKworCXdyaXRlbChDUl9NU0lFIHwgQ1JfUklFIHwgQ1JfVElFIHwgQ1JfUlRJRSB8IENSX1VBUlRfRU4sCisJCXBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKKworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBuZXR4X3NodXRkb3duKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJd3JpdGVsKDAsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKSA7CisKKwlmcmVlX2lycShwb3J0LT5pcnEsIHBvcnQpOworfQorCitzdGF0aWMgdm9pZAorbmV0eF9zZXRfdGVybWlvcyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvcywKKwkJICAgc3RydWN0IHRlcm1pb3MgKm9sZCkKK3sKKwl1bnNpZ25lZCBpbnQgYmF1ZCwgcXVvdDsKKwl1bnNpZ25lZCBjaGFyIG9sZF9jcjsKKwl1bnNpZ25lZCBjaGFyIGxpbmVfY3IgPSBMSU5FX0NSX0ZFTjsKKwl1bnNpZ25lZCBjaGFyIHJ0c19jciA9IDA7CisKKwlzd2l0Y2ggKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU0laRSkgeworCWNhc2UgQ1M1OgorCQlsaW5lX2NyIHw9IExJTkVfQ1JfNUJJVDsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCWxpbmVfY3IgfD0gTElORV9DUl82QklUOworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbGluZV9jciB8PSBMSU5FX0NSXzdCSVQ7CisJCWJyZWFrOworCWNhc2UgQ1M4OgorCQlsaW5lX2NyIHw9IExJTkVfQ1JfOEJJVDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBDU1RPUEIpCisJCWxpbmVfY3IgfD0gTElORV9DUl9TVFAyOworCisJaWYgKHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIpIHsKKwkJbGluZV9jciB8PSBMSU5FX0NSX1BFTjsKKwkJaWYgKCEodGVybWlvcy0+Y19jZmxhZyAmIFBBUk9ERCkpCisJCQlsaW5lX2NyIHw9IExJTkVfQ1JfRVBTOworCX0KKworCWlmICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1JUU0NUUykKKwkJcnRzX2NyID0gUlRTX0NSX0FVVE8gfCBSVFNfQ1JfQ1RTX0NUUiB8IFJUU19DUl9SVFNfUE9MOworCisJYmF1ZCA9IHVhcnRfZ2V0X2JhdWRfcmF0ZShwb3J0LCB0ZXJtaW9zLCBvbGQsIDAsIHBvcnQtPnVhcnRjbGsvMTYpOworCXF1b3QgPSBiYXVkICogNDA5NjsKKwlxdW90IC89IDEwMDA7CisJcXVvdCAqPSAyNTY7CisJcXVvdCAvPSAxMDAwMDA7CisKKwlzcGluX2xvY2tfaXJxKCZwb3J0LT5sb2NrKTsKKworCXVhcnRfdXBkYXRlX3RpbWVvdXQocG9ydCwgdGVybWlvcy0+Y19jZmxhZywgYmF1ZCk7CisKKwlvbGRfY3IgPSByZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKwl3cml0ZWwob2xkX2NyICYgfihDUl9NU0lFIHwgQ1JfUklFIHwgQ1JfVElFIHwgQ1JfUlRJRSksCisJCXBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKKworCS8qIGRyYWluIHRyYW5zbWl0dGVyICovCisJd2hpbGUgKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0ZSKSAmIEZSX0JVU1kpOworCisJLyogZGlzYWJsZSBVQVJUICovCisJd3JpdGVsKG9sZF9jciAmIH5DUl9VQVJUX0VOLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisKKwkvKiBtb2RlbSBzdGF0dXMgaW50ZXJydXB0cyAqLworCW9sZF9jciAmPSB+Q1JfTVNJRTsKKwlpZiAoVUFSVF9FTkFCTEVfTVMocG9ydCwgdGVybWlvcy0+Y19jZmxhZykpCisJCW9sZF9jciB8PSBDUl9NU0lFOworCisJd3JpdGVsKChxdW90Pj44KSAmIDB4ZmYsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0JBVURESVZfTVNCKTsKKwl3cml0ZWwocXVvdCAmIDB4ZmYsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0JBVURESVZfTFNCKTsKKwl3cml0ZWwobGluZV9jciwgcG9ydC0+bWVtYmFzZSArIFVBUlRfTElORV9DUik7CisKKwl3cml0ZWwocnRzX2NyLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9SVFNfQ1IpOworCisJLyoKKwkgKiBDaGFyYWN0ZXJzIHRvIGlnbm9yZQorCSAqLworCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayA9IDA7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCXBvcnQtPmlnbm9yZV9zdGF0dXNfbWFzayB8PSBTUl9QRTsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElHTkJSSykgeworCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gU1JfQkU7CisJCS8qCisJCSAqIElmIHdlJ3JlIGlnbm9yaW5nIHBhcml0eSBhbmQgYnJlYWsgaW5kaWNhdG9ycywKKwkJICogaWdub3JlIG92ZXJydW5zIHRvbyAoZm9yIHJlYWwgcmF3IHN1cHBvcnQpLgorCQkgKi8KKwkJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiBJR05QQVIpCisJCQlwb3J0LT5pZ25vcmVfc3RhdHVzX21hc2sgfD0gU1JfUEU7CisJfQorCisJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayA9IDA7CisJaWYgKHRlcm1pb3MtPmNfaWZsYWcgJiAoQlJLSU5UIHwgUEFSTVJLKSkKKwkJcG9ydC0+cmVhZF9zdGF0dXNfbWFzayB8PSBTUl9CRTsKKwlpZiAodGVybWlvcy0+Y19pZmxhZyAmIElOUENLKQorCQlwb3J0LT5yZWFkX3N0YXR1c19tYXNrIHw9IFNSX1BFIHwgU1JfRkU7CisKKwl3cml0ZWwob2xkX2NyLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9DUik7CisKKwlzcGluX3VubG9ja19pcnEoJnBvcnQtPmxvY2spOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbmV0eF90eXBlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHBvcnQtPnR5cGUgPT0gUE9SVF9ORVRYID8gIk5FVFgiIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgbmV0eF9yZWxlYXNlX3BvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKK3sKKwlyZWxlYXNlX21lbV9yZWdpb24ocG9ydC0+bWFwYmFzZSwgVUFSVF9QT1JUX1NJWkUpOworfQorCitzdGF0aWMgaW50IG5ldHhfcmVxdWVzdF9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIHJlcXVlc3RfbWVtX3JlZ2lvbihwb3J0LT5tYXBiYXNlLCBVQVJUX1BPUlRfU0laRSwKKwkJCURSSVZFUl9OQU1FKSAhPSBOVUxMID8gMCA6IC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgbmV0eF9jb25maWdfcG9ydChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgVUFSVF9DT05GSUdfVFlQRSAmJiBuZXR4X3JlcXVlc3RfcG9ydChwb3J0KSA9PSAwKQorCQlwb3J0LT50eXBlID0gUE9SVF9ORVRYOworfQorCitzdGF0aWMgaW50CituZXR4X3ZlcmlmeV9wb3J0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHN0cnVjdCBzZXJpYWxfc3RydWN0ICpzZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoc2VyLT50eXBlICE9IFBPUlRfVU5LTk9XTiAmJiBzZXItPnR5cGUgIT0gUE9SVF9ORVRYKQorCQlyZXQgPSAtRUlOVkFMOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1YXJ0X29wcyBuZXR4X3BvcHMgPSB7CisJLnR4X2VtcHR5CT0gbmV0eF90eF9lbXB0eSwKKwkuc2V0X21jdHJsCT0gbmV0eF9zZXRfbWN0cmwsCisJLmdldF9tY3RybAk9IG5ldHhfZ2V0X21jdHJsLAorCS5zdG9wX3R4CT0gbmV0eF9zdG9wX3R4LAorCS5zdGFydF90eAk9IG5ldHhfc3RhcnRfdHgsCisJLnN0b3BfcngJPSBuZXR4X3N0b3BfcngsCisJLmVuYWJsZV9tcwk9IG5ldHhfZW5hYmxlX21zLAorCS5icmVha19jdGwJPSBuZXR4X2JyZWFrX2N0bCwKKwkuc3RhcnR1cAk9IG5ldHhfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBuZXR4X3NodXRkb3duLAorCS5zZXRfdGVybWlvcwk9IG5ldHhfc2V0X3Rlcm1pb3MsCisJLnR5cGUJCT0gbmV0eF90eXBlLAorCS5yZWxlYXNlX3BvcnQJPSBuZXR4X3JlbGVhc2VfcG9ydCwKKwkucmVxdWVzdF9wb3J0CT0gbmV0eF9yZXF1ZXN0X3BvcnQsCisJLmNvbmZpZ19wb3J0CT0gbmV0eF9jb25maWdfcG9ydCwKKwkudmVyaWZ5X3BvcnQJPSBuZXR4X3ZlcmlmeV9wb3J0LAorfTsKKworc3RhdGljIHN0cnVjdCBuZXR4X3BvcnQgbmV0eF9wb3J0c1tdID0geworCXsKKwkucG9ydCA9IHsKKwkJLnR5cGUgPSBQT1JUX05FVFgsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLm1lbWJhc2UgPSAoY2hhciBfX2lvbWVtICopaW9fcDJ2KE5FVFhfUEFfVUFSVDApLAorCQkubWFwYmFzZSA9IE5FVFhfUEFfVUFSVDAsCisJCS5pcnEgPSBORVRYX0lSUV9VQVJUMCwKKwkJLnVhcnRjbGsgPSAxMDAwMDAwMDAsCisJCS5maWZvc2l6ZSA9IDE2LAorCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLm9wcyA9ICZuZXR4X3BvcHMsCisJCS5saW5lID0gMCwKKwl9LAorCX0sIHsKKwkucG9ydCA9IHsKKwkJLnR5cGUgPSBQT1JUX05FVFgsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLm1lbWJhc2UgPSAoY2hhciBfX2lvbWVtICopaW9fcDJ2KE5FVFhfUEFfVUFSVDEpLAorCQkubWFwYmFzZSA9IE5FVFhfUEFfVUFSVDEsCisJCS5pcnEgPSBORVRYX0lSUV9VQVJUMSwKKwkJLnVhcnRjbGsgPSAxMDAwMDAwMDAsCisJCS5maWZvc2l6ZSA9IDE2LAorCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLm9wcyA9ICZuZXR4X3BvcHMsCisJCS5saW5lID0gMSwKKwl9LAorCX0sIHsKKwkucG9ydCA9IHsKKwkJLnR5cGUgPSBQT1JUX05FVFgsCisJCS5pb3R5cGUgPSBVUElPX01FTSwKKwkJLm1lbWJhc2UgPSAoY2hhciBfX2lvbWVtICopaW9fcDJ2KE5FVFhfUEFfVUFSVDIpLAorCQkubWFwYmFzZSA9IE5FVFhfUEFfVUFSVDIsCisJCS5pcnEgPSBORVRYX0lSUV9VQVJUMiwKKwkJLnVhcnRjbGsgPSAxMDAwMDAwMDAsCisJCS5maWZvc2l6ZSA9IDE2LAorCQkuZmxhZ3MgPSBVUEZfQk9PVF9BVVRPQ09ORiwKKwkJLm9wcyA9ICZuZXR4X3BvcHMsCisJCS5saW5lID0gMiwKKwl9LAorCX0KK307CisKK3N0YXRpYyB2b2lkIG5ldHhfY29uc29sZV9wdXRjaGFyKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIGludCBjaCkKK3sKKwl3aGlsZSAocmVhZGwocG9ydC0+bWVtYmFzZSArIFVBUlRfRlIpICYgRlJfQlVTWSk7CisJd3JpdGVsKGNoLCBwb3J0LT5tZW1iYXNlICsgVUFSVF9EUik7Cit9CisKK3N0YXRpYyB2b2lkCituZXR4X2NvbnNvbGVfd3JpdGUoc3RydWN0IGNvbnNvbGUgKmNvLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZuZXR4X3BvcnRzW2NvLT5pbmRleF0ucG9ydDsKKwl1bnNpZ25lZCBjaGFyIGNyX3NhdmU7CisKKwljcl9zYXZlID0gcmVhZGwocG9ydC0+bWVtYmFzZSArIFVBUlRfQ1IpOworCXdyaXRlbChjcl9zYXZlIHwgQ1JfVUFSVF9FTiwgcG9ydC0+bWVtYmFzZSArIFVBUlRfQ1IpOworCisJdWFydF9jb25zb2xlX3dyaXRlKHBvcnQsIHMsIGNvdW50LCBuZXR4X2NvbnNvbGVfcHV0Y2hhcik7CisKKwl3aGlsZSAocmVhZGwocG9ydC0+bWVtYmFzZSArIFVBUlRfRlIpICYgRlJfQlVTWSk7CisJd3JpdGVsKGNyX3NhdmUsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX0NSKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CituZXR4X2NvbnNvbGVfZ2V0X29wdGlvbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgaW50ICpiYXVkLAorCQkJaW50ICpwYXJpdHksIGludCAqYml0cywgaW50ICpmbG93KQoreworCXVuc2lnbmVkIGNoYXIgbGluZV9jcjsKKworCSpiYXVkID0gKHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0JBVURESVZfTVNCKSA8PCA4KSB8CisJCXJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0JBVURESVZfTFNCKTsKKwkqYmF1ZCAqPSAxMDAwOworCSpiYXVkIC89IDQwOTY7CisJKmJhdWQgKj0gMTAwMDsKKwkqYmF1ZCAvPSAyNTY7CisJKmJhdWQgKj0gMTAwOworCisJbGluZV9jciA9IHJlYWRsKHBvcnQtPm1lbWJhc2UgKyBVQVJUX0xJTkVfQ1IpOworCSpwYXJpdHkgPSAnbic7CisJaWYgKGxpbmVfY3IgJiBMSU5FX0NSX1BFTikgeworCQlpZiAobGluZV9jciAmIExJTkVfQ1JfRVBTKQorCQkJKnBhcml0eSA9ICdlJzsKKwkJZWxzZQorCQkJKnBhcml0eSA9ICdvJzsKKwl9CisKKwlzd2l0Y2ggKGxpbmVfY3IgJiBMSU5FX0NSX0JJVFNfTUFTSykgeworCWNhc2UgTElORV9DUl84QklUOgorCQkqYml0cyA9IDg7CisJCWJyZWFrOworCWNhc2UgTElORV9DUl83QklUOgorCQkqYml0cyA9IDc7CisJCWJyZWFrOworCWNhc2UgTElORV9DUl82QklUOgorCQkqYml0cyA9IDY7CisJCWJyZWFrOworCWNhc2UgTElORV9DUl81QklUOgorCQkqYml0cyA9IDU7CisJCWJyZWFrOworCX0KKworCWlmIChyZWFkbChwb3J0LT5tZW1iYXNlICsgVUFSVF9SVFNfQ1IpICYgUlRTX0NSX0FVVE8pCisJCSpmbG93ID0gJ3InOworfQorCitzdGF0aWMgaW50IF9faW5pdAorbmV0eF9jb25zb2xlX3NldHVwKHN0cnVjdCBjb25zb2xlICpjbywgY2hhciAqb3B0aW9ucykKK3sKKwlzdHJ1Y3QgbmV0eF9wb3J0ICpzcG9ydDsKKwlpbnQgYmF1ZCA9IDk2MDA7CisJaW50IGJpdHMgPSA4OworCWludCBwYXJpdHkgPSAnbic7CisJaW50IGZsb3cgPSAnbic7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgYW4gaW52YWxpZCB1YXJ0IG51bWJlciBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAorCSAqIGlmIHNvLCBzZWFyY2ggZm9yIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9ydCB0aGF0IGRvZXMgaGF2ZQorCSAqIGNvbnNvbGUgc3VwcG9ydC4KKwkgKi8KKwlpZiAoY28tPmluZGV4ID09IC0xIHx8IGNvLT5pbmRleCA+PSBBUlJBWV9TSVpFKG5ldHhfcG9ydHMpKQorCQljby0+aW5kZXggPSAwOworCXNwb3J0ID0gJm5ldHhfcG9ydHNbY28tPmluZGV4XTsKKworCWlmIChvcHRpb25zKSB7CisJCXVhcnRfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmYmF1ZCwgJnBhcml0eSwgJmJpdHMsICZmbG93KTsKKwl9IGVsc2UgeworCQkvKiBpZiB0aGUgVUFSVCBpcyBlbmFibGVkLCBhc3N1bWUgaXQgaGFzIGJlZW4gY29ycmVjdGx5IHNldHVwCisJCSAqIGJ5IHRoZSBib290bG9hZGVyIGFuZCBnZXQgdGhlIG9wdGlvbnMKKwkJICovCisJCWlmIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVF9DUikgJiBDUl9VQVJUX0VOKSB7CisJCQluZXR4X2NvbnNvbGVfZ2V0X29wdGlvbnMoJnNwb3J0LT5wb3J0LCAmYmF1ZCwKKwkJCSZwYXJpdHksICZiaXRzLCAmZmxvdyk7CisJCX0KKworCX0KKworCXJldHVybiB1YXJ0X3NldF9vcHRpb25zKCZzcG9ydC0+cG9ydCwgY28sIGJhdWQsIHBhcml0eSwgYml0cywgZmxvdyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWFydF9kcml2ZXIgbmV0eF9yZWc7CitzdGF0aWMgc3RydWN0IGNvbnNvbGUgbmV0eF9jb25zb2xlID0geworCS5uYW1lCQk9ICJ0dHlOWCIsCisJLndyaXRlCQk9IG5ldHhfY29uc29sZV93cml0ZSwKKwkuZGV2aWNlCQk9IHVhcnRfY29uc29sZV9kZXZpY2UsCisJLnNldHVwCQk9IG5ldHhfY29uc29sZV9zZXR1cCwKKwkuZmxhZ3MJCT0gQ09OX1BSSU5UQlVGRkVSLAorCS5pbmRleAkJPSAtMSwKKwkuZGF0YQkJPSAmbmV0eF9yZWcsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZXR4X2NvbnNvbGVfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX2NvbnNvbGUoJm5ldHhfY29uc29sZSk7CisJcmV0dXJuIDA7Cit9Citjb25zb2xlX2luaXRjYWxsKG5ldHhfY29uc29sZV9pbml0KTsKKworI2RlZmluZSBORVRYX0NPTlNPTEUJJm5ldHhfY29uc29sZQorI2Vsc2UKKyNkZWZpbmUgTkVUWF9DT05TT0xFCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIG5ldHhfcmVnID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5kcml2ZXJfbmFtZSAgICA9IERSSVZFUl9OQU1FLAorCS5kZXZfbmFtZSAgICAgICA9ICJ0dHlOWCIsCisJLm1ham9yICAgICAgICAgID0gU0VSSUFMX05YX01BSk9SLAorCS5taW5vciAgICAgICAgICA9IE1JTk9SX1NUQVJULAorCS5uciAgICAgICAgICAgICA9IEFSUkFZX1NJWkUobmV0eF9wb3J0cyksCisJLmNvbnMgICAgICAgICAgID0gTkVUWF9DT05TT0xFLAorfTsKKworc3RhdGljIGludCBzZXJpYWxfbmV0eF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0eF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHNwb3J0KQorCQl1YXJ0X3N1c3BlbmRfcG9ydCgmbmV0eF9yZWcsICZzcG9ydC0+cG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJpYWxfbmV0eF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0eF9wb3J0ICpzcG9ydCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKHNwb3J0KQorCQl1YXJ0X3Jlc3VtZV9wb3J0KCZuZXR4X3JlZywgJnNwb3J0LT5wb3J0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcmlhbF9uZXR4X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZuZXR4X3BvcnRzW3BkZXYtPmlkXS5wb3J0OworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRpYWxpc2luZ1xuIik7CisKKwlwb3J0LT5kZXYgPSAmcGRldi0+ZGV2OworCisJd3JpdGVsKDEsIHBvcnQtPm1lbWJhc2UgKyBVQVJUX1JYRklGT19JUlFMRVZFTCk7CisJdWFydF9hZGRfb25lX3BvcnQoJm5ldHhfcmVnLCAmbmV0eF9wb3J0c1twZGV2LT5pZF0ucG9ydCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJm5ldHhfcG9ydHNbcGRldi0+aWRdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlcmlhbF9uZXR4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXR4X3BvcnQgKnNwb3J0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlmIChzcG9ydCkKKwkJdWFydF9yZW1vdmVfb25lX3BvcnQoJm5ldHhfcmVnLCAmc3BvcnQtPnBvcnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNlcmlhbF9uZXR4X2RyaXZlciA9IHsKKwkucHJvYmUgICAgICAgICAgPSBzZXJpYWxfbmV0eF9wcm9iZSwKKwkucmVtb3ZlICAgICAgICAgPSBzZXJpYWxfbmV0eF9yZW1vdmUsCisKKwkuc3VzcGVuZAk9IHNlcmlhbF9uZXR4X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzZXJpYWxfbmV0eF9yZXN1bWUsCisKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUgICA9IERSSVZFUl9OQU1FLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBuZXR4X3NlcmlhbF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIlNlcmlhbDogTmV0WCBkcml2ZXJcbiIpOworCisJcmV0ID0gdWFydF9yZWdpc3Rlcl9kcml2ZXIoJm5ldHhfcmVnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZXJpYWxfbmV0eF9kcml2ZXIpOworCWlmIChyZXQgIT0gMCkKKwkJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbmV0eF9yZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBuZXR4X3NlcmlhbF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNlcmlhbF9uZXR4X2RyaXZlcik7CisJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmbmV0eF9yZWcpOworfQorCittb2R1bGVfaW5pdChuZXR4X3NlcmlhbF9pbml0KTsKK21vZHVsZV9leGl0KG5ldHhfc2VyaWFsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTmV0WCBzZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3B4YS5jIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKaW5kZXggNzdkNDU2OC4uYWUzNjQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvcHhhLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvcHhhLmMKQEAgLTI2OSw3ICsyNjksNiBAQAogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLXJldHVybiBUSU9DTV9DVFMgfCBUSU9DTV9EU1IgfCBUSU9DTV9DQVI7CiAJc3RhdHVzID0gc2VyaWFsX2luKHVwLCBVQVJUX01TUik7CiAKIAlyZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jIGIvZHJpdmVycy9zZXJpYWwvczNjMjQxMC5jCmluZGV4IDUzYzI0NjUuLjgzN2I2ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3MzYzI0MTAuYworKysgYi9kcml2ZXJzL3NlcmlhbC9zM2MyNDEwLmMKQEAgLTg3Miw2ICs4NzIsOCBAQAogCQlyZXR1cm4gIlMzQzI0MTAiOwogCWNhc2UgUE9SVF9TM0MyNDQwOgogCQlyZXR1cm4gIlMzQzI0NDAiOworCWNhc2UgUE9SVF9TM0MyNDEyOgorCQlyZXR1cm4gIlMzQzI0MTIiOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE1MjgsNiArMTUzMCwxNDEgQEAKICNkZWZpbmUgczNjMjQ0MF91YXJ0X2luZl9hdCBOVUxMCiAjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMikgfHwgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTMpCisKK3N0YXRpYyBpbnQgczNjMjQxMl9zZXJpYWxfc2V0c291cmNlKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsCisJCQkJICAgICBzdHJ1Y3QgczNjMjR4eF91YXJ0X2Nsa3NyYyAqY2xrKQoreworCXVuc2lnbmVkIGxvbmcgdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKKworCXVjb24gJj0gflMzQzI0MTJfVUNPTl9DTEtNQVNLOworCisJaWYgKHN0cmNtcChjbGstPm5hbWUsICJ1Y2xrIikgPT0gMCkKKwkJdWNvbiB8PSBTM0MyNDQwX1VDT05fVUNMSzsKKwllbHNlIGlmIChzdHJjbXAoY2xrLT5uYW1lLCAicGNsayIpID09IDApCisJCXVjb24gfD0gUzNDMjQ0MF9VQ09OX1BDTEs7CisJZWxzZSBpZiAoc3RyY21wKGNsay0+bmFtZSwgInVzeXNjbGsiKSA9PSAwKQorCQl1Y29uIHw9IFMzQzI0MTJfVUNPTl9VU1lTQ0xLOworCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgInVua25vd24gY2xvY2sgc291cmNlICVzXG4iLCBjbGstPm5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTiwgdWNvbik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzM2MyNDEyX3NlcmlhbF9nZXRzb3VyY2Uoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkgICAgc3RydWN0IHMzYzI0eHhfdWFydF9jbGtzcmMgKmNsaykKK3sKKwl1bnNpZ25lZCBsb25nIHVjb24gPSByZF9yZWdsKHBvcnQsIFMzQzI0MTBfVUNPTik7CisKKwlzd2l0Y2ggKHVjb24gJiBTM0MyNDEyX1VDT05fQ0xLTUFTSykgeworCWNhc2UgUzNDMjQxMl9VQ09OX1VDTEs6CisJCWNsay0+ZGl2aXNvciA9IDE7CisJCWNsay0+bmFtZSA9ICJ1Y2xrIjsKKwkJYnJlYWs7CisKKwljYXNlIFMzQzI0MTJfVUNPTl9QQ0xLOgorCWNhc2UgUzNDMjQxMl9VQ09OX1BDTEsyOgorCQljbGstPmRpdmlzb3IgPSAxOworCQljbGstPm5hbWUgPSAicGNsayI7CisJCWJyZWFrOworCisJY2FzZSBTM0MyNDEyX1VDT05fVVNZU0NMSzoKKwkJY2xrLT5kaXZpc29yID0gMTsKKwkJY2xrLT5uYW1lID0gInVzeXNjbGsiOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzM2MyNDEyX3NlcmlhbF9yZXNldHBvcnQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwKKwkJCQkgICAgc3RydWN0IHMzYzI0MTBfdWFydGNmZyAqY2ZnKQoreworCXVuc2lnbmVkIGxvbmcgdWNvbiA9IHJkX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OKTsKKworCWRiZygiJXM6IHBvcnQ9JXAgKCUwOGx4KSwgY2ZnPSVwXG4iLAorCSAgICBfX0ZVTkNUSU9OX18sIHBvcnQsIHBvcnQtPm1hcGJhc2UsIGNmZyk7CisKKwkvKiBlbnN1cmUgd2UgZG9uJ3QgY2hhbmdlIHRoZSBjbG9jayBzZXR0aW5ncy4uLiAqLworCisJdWNvbiAmPSBTM0MyNDEyX1VDT05fQ0xLTUFTSzsKKworCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VQ09OLCAgdWNvbiB8IGNmZy0+dWNvbik7CisJd3JfcmVnbChwb3J0LCBTM0MyNDEwX1VMQ09OLCBjZmctPnVsY29uKTsKKworCS8qIHJlc2V0IGJvdGggZmlmb3MgKi8KKworCXdyX3JlZ2wocG9ydCwgUzNDMjQxMF9VRkNPTiwgY2ZnLT51ZmNvbiB8IFMzQzI0MTBfVUZDT05fUkVTRVRCT1RIKTsKKwl3cl9yZWdsKHBvcnQsIFMzQzI0MTBfVUZDT04sIGNmZy0+dWZjb24pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczNjMjR4eF91YXJ0X2luZm8gczNjMjQxMl91YXJ0X2luZiA9IHsKKwkubmFtZQkJPSAiU2Ftc3VuZyBTM0MyNDEyIFVBUlQiLAorCS50eXBlCQk9IFBPUlRfUzNDMjQxMiwKKwkuZmlmb3NpemUJPSA2NCwKKwkucnhfZmlmb21hc2sJPSBTM0MyNDQwX1VGU1RBVF9SWE1BU0ssCisJLnJ4X2ZpZm9zaGlmdAk9IFMzQzI0NDBfVUZTVEFUX1JYU0hJRlQsCisJLnJ4X2ZpZm9mdWxsCT0gUzNDMjQ0MF9VRlNUQVRfUlhGVUxMLAorCS50eF9maWZvZnVsbAk9IFMzQzI0NDBfVUZTVEFUX1RYRlVMTCwKKwkudHhfZmlmb21hc2sJPSBTM0MyNDQwX1VGU1RBVF9UWE1BU0ssCisJLnR4X2ZpZm9zaGlmdAk9IFMzQzI0NDBfVUZTVEFUX1RYU0hJRlQsCisJLmdldF9jbGtzcmMJPSBzM2MyNDEyX3NlcmlhbF9nZXRzb3VyY2UsCisJLnNldF9jbGtzcmMJPSBzM2MyNDEyX3NlcmlhbF9zZXRzb3VyY2UsCisJLnJlc2V0X3BvcnQJPSBzM2MyNDEyX3NlcmlhbF9yZXNldHBvcnQsCit9OworCisvKiBkZXZpY2UgbWFuYWdlbWVudCAqLworCitzdGF0aWMgaW50IHMzYzI0MTJfc2VyaWFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlkYmcoInMzYzI0NDBfc2VyaWFsX3Byb2JlOiBkZXY9JXBcbiIsIGRldik7CisJcmV0dXJuIHMzYzI0eHhfc2VyaWFsX3Byb2JlKGRldiwgJnMzYzI0NDBfdWFydF9pbmYpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNDEyX3NlcmlhbF9kcnYgPSB7CisJLnByb2JlCQk9IHMzYzI0MTJfc2VyaWFsX3Byb2JlLAorCS5yZW1vdmUJCT0gczNjMjR4eF9zZXJpYWxfcmVtb3ZlLAorCS5zdXNwZW5kCT0gczNjMjR4eF9zZXJpYWxfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHMzYzI0eHhfc2VyaWFsX3Jlc3VtZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiczNjMjQxMi11YXJ0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKKworc3RhdGljIGlubGluZSBpbnQgczNjMjQxMl9zZXJpYWxfaW5pdCh2b2lkKQoreworCXJldHVybiBzM2MyNHh4X3NlcmlhbF9pbml0KCZzM2MyNDEyX3NlcmlhbF9kcnYsICZzM2MyNDEyX3VhcnRfaW5mKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHMzYzI0MTJfc2VyaWFsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmczNjMjQxMl9zZXJpYWxfZHJ2KTsKK30KKworI2RlZmluZSBzM2MyNDEyX3VhcnRfaW5mX2F0ICZzM2MyNDEyX3VhcnRfaW5mCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBzM2MyNDEyX3NlcmlhbF9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzM2MyNDEyX3NlcmlhbF9leGl0KHZvaWQpCit7Cit9CisKKyNkZWZpbmUgczNjMjQxMl91YXJ0X2luZl9hdCBOVUxMCisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwICovCisKKwogLyogbW9kdWxlIGluaXRpYWxpc2F0aW9uIGNvZGUgKi8KIAogc3RhdGljIGludCBfX2luaXQgczNjMjR4eF9zZXJpYWxfbW9kaW5pdCh2b2lkKQpAQCAtMTU0Miw2ICsxNjc5LDcgQEAKIAogCXMzYzI0MDBfc2VyaWFsX2luaXQoKTsKIAlzM2MyNDEwX3NlcmlhbF9pbml0KCk7CisJczNjMjQxMl9zZXJpYWxfaW5pdCgpOwogCXMzYzI0NDBfc2VyaWFsX2luaXQoKTsKIAogCXJldHVybiAwOwpAQCAtMTU1MSw2ICsxNjg5LDcgQEAKIHsKIAlzM2MyNDAwX3NlcmlhbF9leGl0KCk7CiAJczNjMjQxMF9zZXJpYWxfZXhpdCgpOworCXMzYzI0MTJfc2VyaWFsX2V4aXQoKTsKIAlzM2MyNDQwX3NlcmlhbF9leGl0KCk7CiAKIAl1YXJ0X3VucmVnaXN0ZXJfZHJpdmVyKCZzM2MyNHh4X3VhcnRfZHJ2KTsKQEAgLTE3NzMsNiArMTkxMiw4IEBACiAJCWluZm8gPSBzM2MyNDEwX3VhcnRfaW5mX2F0OwogCX0gZWxzZSBpZiAoc3RyY21wKGRldi0+bmFtZSwgInMzYzI0NDAtdWFydCIpID09IDApIHsKIAkJaW5mbyA9IHMzYzI0NDBfdWFydF9pbmZfYXQ7CisJfSBlbHNlIGlmIChzdHJjbXAoZGV2LT5uYW1lLCAiczNjMjQxMi11YXJ0IikgPT0gMCkgeworCQlpbmZvID0gczNjMjQxMl91YXJ0X2luZl9hdDsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9FUlIgInMzYzI0eHg6IG5vIGRyaXZlciBmb3IgJXNcbiIsIGRldi0+bmFtZSk7CiAJCXJldHVybiAwOwpAQCAtMTc5Niw0ICsxOTM3LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiQmVuIERvb2tzIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFMzQzI0MTAvUzNDMjQ0MCBTZXJpYWwgcG9ydCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTM0MyNDEwL1MzQzI0NDAvUzNDMjQxMiBTZXJpYWwgcG9ydCBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMgYi9kcml2ZXJzL3NlcmlhbC9zdW5odi5jCmluZGV4IGYxMzc4MDQuLmJhMjJlMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bmh2LmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3VuaHYuYwpAQCAtNDI3LDMxICs0MjcsMzIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgZ2V0X2ludGVycnVwdCh2b2lkKQogewotCWNvbnN0IGNoYXIgKmNvbnNfc3RyID0gImNvbnNvbGUiOwotCWNvbnN0IGNoYXIgKmNvbXBhdF9zdHIgPSAiY29tcGF0aWJsZSI7Ci0JaW50IG5vZGUgPSBwcm9tX2dldGNoaWxkKHN1bjR2X3ZkZXZfcm9vdCk7Ci0JY2hhciBidWZbNjRdOwotCWludCBlcnIsIGxlbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9ub2RlOwogCi0Jbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgY29uc19zdHIpOwotCWlmICghbm9kZSkKLQkJcmV0dXJuIDA7CisJZGV2X25vZGUgPSBzdW40dl92ZGV2X3Jvb3QtPmNoaWxkOworCXdoaWxlIChkZXZfbm9kZSAhPSBOVUxMKSB7CisJCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIAotCWxlbiA9IHByb21fZ2V0cHJvcGxlbihub2RlLCBjb21wYXRfc3RyKTsKLQlpZiAobGVuID09IDAgfHwgbGVuID09IC0xKQotCQlyZXR1cm4gMDsKKwkJaWYgKHN0cmNtcChkZXZfbm9kZS0+bmFtZSwgImNvbnNvbGUiKSkKKwkJCWdvdG8gbmV4dF9zaWJsaW5nOwogCi0JZXJyID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCBjb21wYXRfc3RyLCBidWYsIDY0KTsKLQlpZiAoZXJyID09IC0xKQotCQlyZXR1cm4gMDsKKwkJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkoZGV2X25vZGUsICJjb21wYXRpYmxlIiwgTlVMTCk7CisJCWlmICghcHJvcCkKKwkJCWdvdG8gbmV4dF9zaWJsaW5nOwogCi0JaWYgKCFodl9jb25zb2xlX2NvbXBhdGlibGUoYnVmLCBsZW4pKQorCQlpZiAoaHZfY29uc29sZV9jb21wYXRpYmxlKHByb3AtPnZhbHVlLCBwcm9wLT5sZW5ndGgpKQorCQkJYnJlYWs7CisKKwluZXh0X3NpYmxpbmc6CisJCWRldl9ub2RlID0gZGV2X25vZGUtPnNpYmxpbmc7CisJfQorCWlmICghZGV2X25vZGUpCiAJCXJldHVybiAwOwogCiAJLyogT2ssIHRoZSB0aGlzIGlzIHRoZSBPQlAgbm9kZSBmb3IgdGhlIHN1bjR2IGh5cGVydmlzb3IKIAkgKiBjb25zb2xlIGRldmljZS4gIERlY29kZSB0aGUgaW50ZXJydXB0LgogCSAqLwotCXJldHVybiBzdW40dl92ZGV2X2RldmljZV9pbnRlcnJ1cHQobm9kZSk7CisJcmV0dXJuIHN1bjR2X3ZkZXZfZGV2aWNlX2ludGVycnVwdChkZXZfbm9kZSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHN1bmh2X2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnNhYi5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKaW5kZXggYmZiZTlkYy4uZTRjMGZkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuc2FiLmMKQEAgLTk4NCwxOSArOTg0LDE5IEBACiAKIAlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7Ci0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJzZSIpKSB7CisJCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJzZSIpKSB7CiAJCQkJY2FsbGJhY2soZWRldiwgYXJnKTsKIAkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJzZXJpYWwiKSkgewotCQkJCWNoYXIgY29tcGF0WzMyXTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJzZXJpYWwiKSkgeworCQkJCWNoYXIgKmNvbXBhdDsKIAkJCQlpbnQgY2xlbjsKIAogCQkJCS8qIE9uIFJJTyB0aGlzIGNhbiBiZSBhbiBTRSwgY2hlY2sgaXQuICBXZSBjb3VsZAogCQkJCSAqIGp1c3QgY2hlY2sgZWJ1cy0+aXNfcmlvLCBidXQgdGhpcyBpcyBtb3JlIHBvcnRhYmxlLgogCQkJCSAqLwotCQkJCWNsZW4gPSBwcm9tX2dldHByb3BlcnR5KGVkZXYtPnByb21fbm9kZSwgImNvbXBhdGlibGUiLAotCQkJCQkJCWNvbXBhdCwgc2l6ZW9mKGNvbXBhdCkpOwotCQkJCWlmIChjbGVuID4gMCkgeworCQkJCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCisJCQkJCQkJICJjb21wYXRpYmxlIiwgJmNsZW4pOworCQkJCWlmIChjb21wYXQgJiYgY2xlbiA+IDApIHsKIAkJCQkJaWYgKHN0cm5jbXAoY29tcGF0LCAic2FiODI1MzIiLCA4KSA9PSAwKSB7CiAJCQkJCQljYWxsYmFjayhlZGV2LCBhcmcpOwogCQkJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jIGIvZHJpdmVycy9zZXJpYWwvc3Vuc3UuYwppbmRleCA0Y2RiNjEwLi4wMjY4YjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NlcmlhbC9zdW5zdS5jCisrKyBiL2RyaXZlcnMvc2VyaWFsL3N1bnN1LmMKQEAgLTEwNTMsNyArMTA1Myw3IEBACiAJICovCiAJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CiAJCWZvcl9lYWNoX2VidXNkZXYoZGV2LCBlYnVzKSB7Ci0JCQlpZiAoZGV2LT5wcm9tX25vZGUgPT0gdXAtPnBvcnRfbm9kZSkgeworCQkJaWYgKGRldi0+cHJvbV9ub2RlLT5ub2RlID09IHVwLT5wb3J0X25vZGUpIHsKIAkJCQkvKgogCQkJCSAqIFRoZSBFQnVzIGlzIGJyb2tlbiBvbiBzcGFyYzsgaXQgZGVsaXZlcnMKIAkJCQkgKiB2aXJ0dWFsIGFkZHJlc3NlcyBpbiByZXNvdXJjZXMuIE9oIHdlbGwuLi4KQEAgLTEwNzMsNyArMTA3Myw3IEBACiAjaWZkZWYgQ09ORklHX1NQQVJDNjQKIAlmb3JfZWFjaF9pc2EoaXNhX2JyKSB7CiAJCWZvcl9lYWNoX2lzYWRldihpc2FfZGV2LCBpc2FfYnIpIHsKLQkJCWlmIChpc2FfZGV2LT5wcm9tX25vZGUgPT0gdXAtPnBvcnRfbm9kZSkgeworCQkJaWYgKGlzYV9kZXYtPnByb21fbm9kZS0+bm9kZSA9PSB1cC0+cG9ydF9ub2RlKSB7CiAJCQkJLyogU2FtZSBvbiBzcGFyYzY0LiBDb29sIGFyY2hpdGVjdXJlLi4uICovCiAJCQkJdXAtPnBvcnQubWVtYmFzZSA9IChjaGFyICopIGlzYV9kZXYtPnJlc291cmNlLnN0YXJ0OwogCQkJCXVwLT5wb3J0Lm1hcGJhc2UgPSBpc2FfZGV2LT5yZXNvdXJjZS5zdGFydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMgYi9kcml2ZXJzL3NlcmlhbC9zdW56aWxvZy5jCmluZGV4IDViNjU2OTcuLjc2YzliYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2VyaWFsL3N1bnppbG9nLmMKKysrIGIvZHJpdmVycy9zZXJpYWwvc3Vuemlsb2cuYwpAQCAtMTEwNiw3ICsxMTA2LDcgQEAKIAkJCQkrIEZIQ19VUkVHU19JQ0xSOwogCQkJaW1hcCA9IGNlbnRyYWxfYnVzLT5jaGlsZC0+ZmhjX3JlZ3MudXJlZ3MKIAkJCQkrIEZIQ19VUkVHU19JTUFQOwotCQkJemlsb2dfaXJxID0gYnVpbGRfaXJxKDEyLCAwLCBpY2xyLCBpbWFwKTsKKwkJCXppbG9nX2lycSA9IGJ1aWxkX2lycSgwLCBpY2xyLCBpbWFwKTsKIAkJfSBlbHNlIHsKIAkJCWVyciA9IHByb21fZ2V0cHJvcGVydHkoenNub2RlLCAiaW50ZXJydXB0cyIsCiAJCQkJCSAgICAgICAoY2hhciAqKSAmc3VuNHVfaW5vLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zbi9pb2M0LmMgYi9kcml2ZXJzL3NuL2lvYzQuYwppbmRleCBjZGVmZjkwLi44MjU2YTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NuL2lvYzQuYworKysgYi9kcml2ZXJzL3NuL2lvYzQuYwpAQCAtMTYwLDkgKzE2MCw2IEBACiAJd3JpdGVsKDAsICZpZGQtPmlkZF9taXNjX3JlZ3MtPmludF9vdXQucmF3KTsKIAltbWlvd2IoKTsKIAotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIiVzOiBDYWxpYnJhdGluZyBQQ0kgYnVzIHNwZWVkICIKLQkgICAgICAgImZvciBwY2lfZGV2ICVzIC4uLiAiLCBfX0ZVTkNUSU9OX18sIHBjaV9uYW1lKGlkZC0+aWRkX3BkZXYpKTsKIAkvKiBTZXQgdXAgc3F1YXJlIHdhdmUgKi8KIAlpbnRfb3V0LnJhdyA9IDA7CiAJaW50X291dC5maWVsZHMuY291bnQgPSBJT0M0X0NBTElCUkFURV9DT1VOVDsKQEAgLTIwNiwxMSArMjAzLDE2IEBACiAJLyogQm91bmRzIGNoZWNrIHRoZSByZXN1bHQuICovCiAJaWYgKHBlcmlvZCA+IElPQzRfQ0FMSUJSQVRFX0xPV19MSU1JVCB8fAogCSAgICBwZXJpb2QgPCBJT0M0X0NBTElCUkFURV9ISUdIX0xJTUlUKSB7Ci0JCXByaW50aygiZmFpbGVkLiBBc3N1bWluZyBQQ0kgY2xvY2sgdGlja3MgYXJlICVkIG5zLlxuIiwKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIklPQzQgJXM6IENsb2NrIGNhbGlicmF0aW9uIGZhaWxlZC4gIEFzc3VtaW5nIgorCQkgICAgICAgIlBDSSBjbG9jayBpcyAlZCBucy5cbiIsCisJCSAgICAgICBwY2lfbmFtZShpZGQtPmlkZF9wZGV2KSwKIAkJICAgICAgIElPQzRfQ0FMSUJSQVRFX0RFRkFVTFQgLyBJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SKTsKIAkJcGVyaW9kID0gSU9DNF9DQUxJQlJBVEVfREVGQVVMVDsKIAl9IGVsc2UgewotCQlwcmludGsoInN1Y2NlZWRlZC4gUENJIGNsb2NrIHRpY2tzIGFyZSAlbGQgbnMuXG4iLAorCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgIklPQzQgJXM6IFBDSSBjbG9jayBpcyAlbGQgbnMuXG4iLAorCQkgICAgICAgcGNpX25hbWUoaWRkLT5pZGRfcGRldiksCiAJCSAgICAgICBwZXJpb2QgLyBJT0M0X0VYVElOVF9DT1VOVF9ESVZJU09SKTsKIAl9CiAKQEAgLTIyMiw2ICsyMjQsNTEgQEAKIAlpZGQtPmNvdW50X3BlcmlvZCA9IHBlcmlvZDsKIH0KIAorLyogVGhlcmUgYXJlIHRocmVlIHZhcmlhbnRzIG9mIElPQzQgY2FyZHM6IElPOSwgSU8xMCwgYW5kIFBDSS1SVC4KKyAqIEVhY2ggYnJpbmdzIG91dCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIElPQzQgc2lnbmFscywgdGh1cy4KKyAqIHRoZSBJT0M0IHN1YmRyaXZlcnMgbmVlZCB0byBrbm93IHRvIHdoaWNoIHdlJ3JlIGF0dGFjaGVkLgorICoKKyAqIFdlIGxvb2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIFNDU0kgKElPOSkgb3IgU0FUQSAoSU8xMCkgY29udHJvbGxlcgorICogb24gdGhlIHNhbWUgUENJIGJ1cyBhdCBzbG90IG51bWJlciAzIHRvIGRpZmZlcmVudGlhdGUgSU85IGZyb20gSU8xMC4KKyAqIElmIG5laXRoZXIgaXMgcHJlc2VudCwgaXQncyBhIFBDSS1SVC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAoraW9jNF92YXJpYW50KHN0cnVjdCBpb2M0X2RyaXZlcl9kYXRhICppZGQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCWludCBmb3VuZCA9IDA7CisKKwkvKiBJTzk6IExvb2sgZm9yIGEgUUxvZ2ljIElTUCAxMjE2MCBhdCB0aGUgc2FtZSBidXMgYW5kIHNsb3QgMy4gKi8KKwlkbyB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1FMT0dJQywKKwkJCQkgICAgICBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjE2MCwgcGRldik7CisJCWlmIChwZGV2ICYmCisJCSAgICBpZGQtPmlkZF9wZGV2LT5idXMtPm51bWJlciA9PSBwZGV2LT5idXMtPm51bWJlciAmJgorCQkgICAgMyA9PSBQQ0lfU0xPVChwZGV2LT5kZXZmbikpCisJCQlmb3VuZCA9IDE7CisJCXBjaV9kZXZfcHV0KHBkZXYpOworCX0gd2hpbGUgKHBkZXYgJiYgIWZvdW5kKTsKKwlpZiAoTlVMTCAhPSBwZGV2KQorCQlyZXR1cm4gSU9DNF9WQVJJQU5UX0lPOTsKKworCS8qIElPMTA6IExvb2sgZm9yIGEgVml0ZXNzZSBWU0MgNzE3NCBhdCB0aGUgc2FtZSBidXMgYW5kIHNsb3QgMy4gKi8KKwlwZGV2ID0gTlVMTDsKKwlkbyB7CisJCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1ZJVEVTU0UsCisJCQkJICAgICAgUENJX0RFVklDRV9JRF9WSVRFU1NFX1ZTQzcxNzQsIHBkZXYpOworCQlpZiAocGRldiAmJgorCQkgICAgaWRkLT5pZGRfcGRldi0+YnVzLT5udW1iZXIgPT0gcGRldi0+YnVzLT5udW1iZXIgJiYKKwkJICAgIDMgPT0gUENJX1NMT1QocGRldi0+ZGV2Zm4pKQorCQkJZm91bmQgPSAxOworCQlwY2lfZGV2X3B1dChwZGV2KTsKKwl9IHdoaWxlIChwZGV2ICYmICFmb3VuZCk7CisJaWYgKE5VTEwgIT0gcGRldikKKwkJcmV0dXJuIElPQzRfVkFSSUFOVF9JTzEwOworCisJLyogUENJLVJUOiBObyBTQ1NJL1NBVEEgY29udHJvbGxlciB3aWxsIGJlIHByZXNlbnQgKi8KKwlyZXR1cm4gSU9DNF9WQVJJQU5UX1BDSV9SVDsKK30KKwogLyogQWRkcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBJT0M0IGNhcmQgKi8KIHN0YXRpYyBpbnQKIGlvYzRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCkBAIC0yODYsNiArMzMzLDEzIEBACiAKIAkvKiBGYWlsc2FmZSBwb3J0aW9uIG9mIHBlci1JT0M0IGluaXRpYWxpemF0aW9uICovCiAKKwkvKiBEZXRlY3QgY2FyZCB2YXJpYW50ICovCisJaWRkLT5pZGRfdmFyaWFudCA9IGlvYzRfdmFyaWFudChpZGQpOworCXByaW50ayhLRVJOX0lORk8gIklPQzQgJXM6ICVzIGNhcmQgZGV0ZWN0ZWQuXG4iLCBwY2lfbmFtZShwZGV2KSwKKwkgICAgICAgaWRkLT5pZGRfdmFyaWFudCA9PSBJT0M0X1ZBUklBTlRfSU85ID8gIklPOSIgOgorCSAgICAgICBpZGQtPmlkZF92YXJpYW50ID09IElPQzRfVkFSSUFOVF9QQ0lfUlQgPyAiUENJLVJUIiA6CisJICAgICAgIGlkZC0+aWRkX3ZhcmlhbnQgPT0gSU9DNF9WQVJJQU5UX0lPMTAgPyAiSU8xMCIgOiAidW5rbm93biIpOworCiAJLyogSW5pdGlhbGl6ZSBJT0M0ICovCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGlkZC0+aWRkX3BkZXYsIFBDSV9DT01NQU5ELCAmcGNtZCk7CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChpZGQtPmlkZF9wZGV2LCBQQ0lfQ09NTUFORCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYyBiL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYwppbmRleCAzZjhlMDYyLi5iY2JlYWY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCkBAIC0xMDc4LDkgKzEwNzgsNyBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmdXVyYiwgYXJnLCBzaXplb2YodXVyYikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXJldHVybiBwcm9jX2RvX3N1Ym1pdHVyYihwcywgJnV1cmIsCi0JCShzdHJ1Y3QgdXNiZGV2ZnNfaXNvX3BhY2tldF9kZXNjIF9fdXNlciAqKXV1cmIuaXNvX2ZyYW1lX2Rlc2MsCi0JCWFyZyk7CisJcmV0dXJuIHByb2NfZG9fc3VibWl0dXJiKHBzLCAmdXVyYiwgKCgoc3RydWN0IHVzYmRldmZzX3VyYiBfX3VzZXIgKilhcmcpLT5pc29fZnJhbWVfZGVzYyksIGFyZyk7CiB9CiAKIHN0YXRpYyBpbnQgcHJvY191bmxpbmt1cmIoc3RydWN0IGRldl9zdGF0ZSAqcHMsIHZvaWQgX191c2VyICphcmcpCkBAIC0xMjA1LDkgKzEyMDMsNyBAQAogCWlmIChnZXRfdXJiMzIoJnV1cmIsKHN0cnVjdCB1c2JkZXZmc191cmIzMiAqKWFyZykpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIHByb2NfZG9fc3VibWl0dXJiKHBzLCAmdXVyYiwKLQkJKHN0cnVjdCB1c2JkZXZmc19pc29fcGFja2V0X2Rlc2MgX191c2VyICopdXVyYi5pc29fZnJhbWVfZGVzYywKLQkJYXJnKTsKKwlyZXR1cm4gcHJvY19kb19zdWJtaXR1cmIocHMsICZ1dXJiLCAoKHN0cnVjdCB1c2JkZXZmc191cmIzMiBfX3VzZXIgKilhcmcpLT5pc29fZnJhbWVfZGVzYywgYXJnKTsKIH0KIAogc3RhdGljIGludCBwcm9jZXNzY29tcGxfY29tcGF0KHN0cnVjdCBhc3luYyAqYXMsIHZvaWQgX191c2VyICogX191c2VyICphcmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2lub2RlLmMKaW5kZXggM2NmOTQ1Yy4uYmZjOWIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS9pbm9kZS5jCisrKyBiL2RyaXZlcnMvdXNiL2NvcmUvaW5vZGUuYwpAQCAtNTQzLDEwICs1NDMsMTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnVzYl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdXNiX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgdXNiZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHVzYmZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1c2JfZnNfdHlwZSA9IHsKQEAgLTU2OSw3ICs1NjksNyBAQAogCWlnbm9yZV9tb3VudCA9IDE7CiAKIAkvKiBjcmVhdGUgdGhlIGRldmljZXMgc3BlY2lhbCBmaWxlICovCi0JcmV0dmFsID0gc2ltcGxlX3Bpbl9mcygidXNiZnMiLCAmdXNiZnNfbW91bnQsICZ1c2Jmc19tb3VudF9jb3VudCk7CisJcmV0dmFsID0gc2ltcGxlX3Bpbl9mcygmdXNiX2ZzX3R5cGUsICZ1c2Jmc19tb3VudCwgJnVzYmZzX21vdW50X2NvdW50KTsKIAlpZiAocmV0dmFsKSB7CiAJCWVyciAoIlVuYWJsZSB0byBnZXQgdXNiZnMgbW91bnQiKTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS91c2IuYyBiL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKaW5kZXggNTE1MzEwNy4uZmI0ODhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29yZS91c2IuYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCkBAIC05OTEsNiArOTkxLDggQEAKIAogc3RhdGljIGludCB2ZXJpZnlfc3VzcGVuZGVkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqdW51c2VkKQogeworCWlmIChkZXYtPmRyaXZlciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gKGRldi0+cG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pID8gLUVCVVNZIDogMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZpbGVfc3RvcmFnZS5jCmluZGV4IDZmODg3NDcuLmE0M2RjOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9maWxlX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZmlsZV9zdG9yYWdlLmMKQEAgLTE5MDYsNyArMTkwNiw2IEBACiAKIAlpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOwogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQljdXJyZW50LT5mbGFncyB8PSBQRl9TWU5DV1JJVEU7CiAJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CiAJZXJyID0gZmlscC0+Zl9vcC0+ZnN5bmMoZmlscCwgZmlscC0+Zl9kZW50cnksIDEpOwogCWlmICghcmMpCkBAIC0xOTE0LDcgKzE5MTMsNiBAQAogCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOwogCWlmICghcmMpCiAJCXJjID0gZXJyOwotCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CiAJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJVkxEQkcoY3VybHVuLCAiZmRhdGFzeW5jIC0+ICVkXG4iLCByYyk7CiAJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2lub2RlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwppbmRleCBhZWYwNzIyLi4zYmRjNWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvaW5vZGUuYwpAQCAtMjA3MCwxMSArMjA3MCwxMSBAQAogfQogCiAvKiAibW91bnQgLXQgZ2FkZ2V0ZnMgcGF0aCAvZGV2L2dhZGdldCIgZW5kcyB1cCBoZXJlICovCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK3N0YXRpYyBpbnQKIGdhZGdldGZzX2dldF9zYiAoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnQsIGludCBmbGFncywKLQkJY29uc3QgY2hhciAqcGF0aCwgdm9pZCAqb3B0cykKKwkJY29uc3QgY2hhciAqcGF0aCwgdm9pZCAqb3B0cywgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUgKHQsIGZsYWdzLCBvcHRzLCBnYWRnZXRmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZSAodCwgZmxhZ3MsIG9wdHMsIGdhZGdldGZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcgYi9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKaW5kZXggYzA2MGViOS4uYjkzZDcxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwpAQCAtNzAsNyArNzAsNiBAQAogY29uZmlnIFVTQl9JU1AxMTZYX0hDRAogCXRyaXN0YXRlICJJU1AxMTZYIEhDRCBzdXBwb3J0IgogCWRlcGVuZHMgb24gVVNCCi0JZGVmYXVsdCBOCiAJLS0taGVscC0tLQogCSAgVGhlIElTUDExNjAgYW5kIElTUDExNjEgY2hpcHMgYXJlIFVTQiBob3N0IGNvbnRyb2xsZXJzLiBFbmFibGUgdGhpcwogCSAgb3B0aW9uIGlmIHlvdXIgYm9hcmQgaGFzIHRoaXMgY2hpcC4gSWYgdW5zdXJlLCBzYXkgTi4KQEAgLTE0NSw3ICsxNDQsNiBAQAogY29uZmlnIFVTQl9TTDgxMV9IQ0QKIAl0cmlzdGF0ZSAiU0w4MTFIUyBIQ0Qgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFVTQgotCWRlZmF1bHQgTgogCWhlbHAKIAkgIFRoZSBTTDgxMUhTIGlzIGEgc2luZ2xlLXBvcnQgVVNCIGNvbnRyb2xsZXIgdGhhdCBzdXBwb3J0cyBlaXRoZXIKIAkgIGhvc3Qgc2lkZSBvciBwZXJpcGhlcmFsIHNpZGUgcm9sZXMuICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91cgpAQCAtMTU4LDcgKzE1Niw2IEBACiBjb25maWcgVVNCX1NMODExX0NTCiAJdHJpc3RhdGUgIkNGL1BDTUNJQSBzdXBwb3J0IGZvciBTTDgxMUhTIEhDRCIKIAlkZXBlbmRzIG9uIFVTQl9TTDgxMV9IQ0QgJiYgUENNQ0lBCi0JZGVmYXVsdCBOCiAJaGVscAogCSAgV3JhcHMgYSBQQ01DSUEgZHJpdmVyIGFyb3VuZCB0aGUgU0w4MTFIUyBIQ0QsIHN1cHBvcnRpbmcgdGhlIFJBVE9DCiAJICBSRVgtQ0ZVMVUgQ0YgY2FyZCAob2Z0ZW4gdXNlZCB3aXRoIFBEQXMpLiAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vS2NvbmZpZwppbmRleCA1YTI4NDBhLi4xNjhlZGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9LY29uZmlnCkBAIC04Niw2ICs4NiwxMSBAQAogCSBjb21iaW5hdGlvbiB3aXRoIGNlcnRhaW4gbW90aGVyYm9hcmRzIGFuZCBtb25pdG9ycyBhcmUga25vd24gdG8KIAkgc3VmZmVyIGZyb20gdGhpcyBwcm9ibGVtLgogCitjb25maWcgRkJfQkFDS0xJR0hUCisgICAgICAgYm9vbAorICAgICAgIGRlcGVuZHMgb24gRkIKKyAgICAgICBkZWZhdWx0IG4KKwogY29uZmlnIEZCX01PREVfSEVMUEVSUwogICAgICAgICBib29sICJFbmFibGUgVmlkZW8gTW9kZSBIYW5kbGluZyBIZWxwZXJzIgogICAgICAgICBkZXBlbmRzIG9uIEZCCkBAIC03MTcsNiArNzIyLDE2IEBACiAJICBpbmRlcGVuZGVudGx5IHZhbGlkYXRlIHZpZGVvIG1vZGUgcGFyYW1ldGVycywgeW91IHNob3VsZCBzYXkgWQogCSAgaGVyZS4KIAorY29uZmlnIEZCX05WSURJQV9CQUNLTElHSFQKKwlib29sICJTdXBwb3J0IGZvciBiYWNrbGlnaHQgY29udHJvbCIKKwlkZXBlbmRzIG9uIEZCX05WSURJQSAmJiBQUENfUE1BQworCXNlbGVjdCBGQl9CQUNLTElHSFQKKwlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgdGhlIGJhY2tsaWdodCBvZiB5b3VyIGRpc3BsYXkuCisKIGNvbmZpZyBGQl9SSVZBCiAJdHJpc3RhdGUgIm5WaWRpYSBSaXZhIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKQEAgLTc1NSw2ICs3NzAsMTYgQEAKIAkgIG9mIGRlYnVnZ2luZyBpbmZvcm1hdGlvbnMgdG8gcHJvdmlkZSB0byB0aGUgbWFpbnRhaW5lciB3aGVuCiAJICBzb21ldGhpbmcgZ29lcyB3cm9uZy4KIAorY29uZmlnIEZCX1JJVkFfQkFDS0xJR0hUCisJYm9vbCAiU3VwcG9ydCBmb3IgYmFja2xpZ2h0IGNvbnRyb2wiCisJZGVwZW5kcyBvbiBGQl9SSVZBICYmIFBQQ19QTUFDCisJc2VsZWN0IEZCX0JBQ0tMSUdIVAorCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgYmFja2xpZ2h0IG9mIHlvdXIgZGlzcGxheS4KKwogY29uZmlnIEZCX0k4MTAKIAl0cmlzdGF0ZSAiSW50ZWwgODEwLzgxNSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgogCWRlcGVuZHMgb24gRkIgJiYgRVhQRVJJTUVOVEFMICYmIFBDSSAmJiBYODZfMzIKQEAgLTk5Myw2ICsxMDE4LDcgQEAKIAogCSAgVGhlcmUgaXMgYSBwcm9kdWN0IHBhZ2UgYXQKIAkgIGh0dHA6Ly9hcHBzLmF0aS5jb20vQVRJY29tcGFyZS8KKwogY29uZmlnIEZCX1JBREVPTl9JMkMKIAlib29sICJEREMvSTJDIGZvciBBVEkgUmFkZW9uIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBGQl9SQURFT04KQEAgLTEwMDAsNiArMTAyNiwxNiBAQAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgRERDL0kyQyBzdXBwb3J0IGZvciB5b3VyIFJhZGVvbiBib2FyZC4gCiAKK2NvbmZpZyBGQl9SQURFT05fQkFDS0xJR0hUCisJYm9vbCAiU3VwcG9ydCBmb3IgYmFja2xpZ2h0IGNvbnRyb2wiCisJZGVwZW5kcyBvbiBGQl9SQURFT04gJiYgUFBDX1BNQUMKKwlzZWxlY3QgRkJfQkFDS0xJR0hUCisJc2VsZWN0IEJBQ0tMSUdIVF9MQ0RfU1VQUE9SVAorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb250cm9sIHRoZSBiYWNrbGlnaHQgb2YgeW91ciBkaXNwbGF5LgorCiBjb25maWcgRkJfUkFERU9OX0RFQlVHCiAJYm9vbCAiTG90cyBvZiBkZWJ1ZyBvdXRwdXQgZnJvbSBSYWRlb24gZHJpdmVyIgogCWRlcGVuZHMgb24gRkJfUkFERU9OCkBAIC0xMDI0LDYgKzEwNjAsMTYgQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGF0eTEyOGZiLgogCitjb25maWcgRkJfQVRZMTI4X0JBQ0tMSUdIVAorCWJvb2wgIlN1cHBvcnQgZm9yIGJhY2tsaWdodCBjb250cm9sIgorCWRlcGVuZHMgb24gRkJfQVRZMTI4ICYmIFBQQ19QTUFDCisJc2VsZWN0IEZCX0JBQ0tMSUdIVAorCXNlbGVjdCBCQUNLTElHSFRfTENEX1NVUFBPUlQKKwlzZWxlY3QgQkFDS0xJR0hUX0NMQVNTX0RFVklDRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgYmFja2xpZ2h0IG9mIHlvdXIgZGlzcGxheS4KKwogY29uZmlnIEZCX0FUWQogCXRyaXN0YXRlICJBVEkgTWFjaDY0IGRpc3BsYXkgc3VwcG9ydCIgaWYgUENJIHx8IEFUQVJJCiAJZGVwZW5kcyBvbiBGQiAmJiAhU1BBUkMzMgpAQCAtMTA2Niw2ICsxMTEyLDE2IEBACiAJICBpcyBhdAogCSAgPGh0dHA6Ly9zdXBwb3J0LmF0aS5jb20vcHJvZHVjdHMvcGMvbWFjaDY0L2dyYXBoaWNzX3hwcmVzc2lvbi5odG1sPi4KIAorY29uZmlnIEZCX0FUWV9CQUNLTElHSFQKKwlib29sICJTdXBwb3J0IGZvciBiYWNrbGlnaHQgY29udHJvbCIKKwlkZXBlbmRzIG9uIEZCX0FUWSAmJiBQUENfUE1BQworCXNlbGVjdCBGQl9CQUNLTElHSFQKKwlzZWxlY3QgQkFDS0xJR0hUX0xDRF9TVVBQT1JUCisJc2VsZWN0IEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgdGhlIGJhY2tsaWdodCBvZiB5b3VyIGRpc3BsYXkuCisKIGNvbmZpZyBGQl9TM1RSSU8KIAlib29sICJTMyBUcmlvIGRpc3BsYXkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIChGQiA9IHkpICYmIFBQQyAmJiBCUk9LRU4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKaW5kZXggMTg1MjEzOS4uYTZjYzBlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9hdHkvTWFrZWZpbGUKQEAgLTEwLDUgKzEwLDYgQEAKIAogcmFkZW9uZmIteQkJCTo9IHJhZGVvbl9iYXNlLm8gcmFkZW9uX3BtLm8gcmFkZW9uX21vbml0b3IubyByYWRlb25fYWNjZWwubwogcmFkZW9uZmItJChDT05GSUdfRkJfUkFERU9OX0kyQykJKz0gcmFkZW9uX2kyYy5vCityYWRlb25mYi0kKENPTkZJR19GQl9SQURFT05fQkFDS0xJR0hUKQkrPSByYWRlb25fYmFja2xpZ2h0Lm8KIHJhZGVvbmZiLW9ianMJCQk6PSAkKHJhZGVvbmZiLXkpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHkxMjhmYi5jCmluZGV4IGY3YmJmZjQuLmRiODc4ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eTEyOGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvYXR5MTI4ZmIuYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwpAQCAtNDgwLDE2ICs0ODEsNiBAQAogCS5mYl9pbWFnZWJsaXQJPSBjZmJfaW1hZ2VibGl0LAogfTsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotc3RhdGljIGludCBhdHkxMjhfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwotc3RhdGljIGludCBhdHkxMjhfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpOwotCi1zdGF0aWMgc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyIGF0eTEyOF9iYWNrbGlnaHRfY29udHJvbGxlciA9IHsKLQlhdHkxMjhfc2V0X2JhY2tsaWdodF9lbmFibGUsCi0JYXR5MTI4X3NldF9iYWNrbGlnaHRfbGV2ZWwKLX07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KICAgICAvKgogICAgICAqIEZ1bmN0aW9ucyB0byByZWFkIGZyb20vd3JpdGUgdG8gdGhlIG1taW8gcmVnaXN0ZXJzCiAgICAgICoJLSBlbmRpYW4gY29udmVyc2lvbnMgbWF5IHBvc3NpYmx5IGJlIGF2b2lkZWQgYnkKQEAgLTEyNTgsMTkgKzEyNDksMzUgQEAKIHN0YXRpYyB2b2lkIGF0eTEyOF9zZXRfbGNkX2VuYWJsZShzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsIGludCBvbikKIHsKIAl1MzIgcmVnOworI2lmZGVmIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUCisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKKyNlbmRpZgogCiAJaWYgKG9uKSB7CiAJCXJlZyA9IGF0eV9sZF9sZTMyKExWRFNfR0VOX0NOVEwpOwogCQlyZWcgfD0gTFZEU19PTiB8IExWRFNfRU4gfCBMVkRTX0JMT04gfCBMVkRTX0RJR0lPTjsKIAkJcmVnICY9IH5MVkRTX0RJU1BMQVlfRElTOwogCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCQlhdHkxMjhfc2V0X2JhY2tsaWdodF9lbmFibGUoZ2V0X2JhY2tsaWdodF9lbmFibGUoKSwKLQkJCQkJICAgIGdldF9iYWNrbGlnaHRfbGV2ZWwoKSwgcGFyKTsKKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorCQltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJCWlmIChpbmZvLT5ibF9kZXYpIHsKKwkJCWRvd24oJmluZm8tPmJsX2Rldi0+c2VtKTsKKwkJCWluZm8tPmJsX2Rldi0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoaW5mby0+YmxfZGV2KTsKKwkJCXVwKCZpbmZvLT5ibF9kZXYtPnNlbSk7CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CiAjZW5kaWYJCiAJfSBlbHNlIHsKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkJYXR5MTI4X3NldF9iYWNrbGlnaHRfZW5hYmxlKDAsIDAsIHBhcik7CisjaWZkZWYgQ09ORklHX0ZCX0FUWTEyOF9CQUNLTElHSFQKKwkJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCQlpZiAoaW5mby0+YmxfZGV2KSB7CisJCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CisJCQlpbmZvLT5ibF9kZXYtPnByb3BzLT5icmlnaHRuZXNzID0gMDsKKwkJCWluZm8tPmJsX2Rldi0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhpbmZvLT5ibF9kZXYpOworCQkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKKwkJfQorCQltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKICNlbmRpZgkKIAkJcmVnID0gYXR5X2xkX2xlMzIoTFZEU19HRU5fQ05UTCk7CiAJCXJlZyB8PSBMVkRTX0RJU1BMQVlfRElTOwpAQCAtMTY5MSw2ICsxNjk4LDE4NCBAQAogfQogI2VuZGlmICAvKiAgTU9EVUxFICAqLwogCisvKiBCYWNrbGlnaHQgKi8KKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorI2RlZmluZSBNQVhfTEVWRUwgMHhGRgorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eTEyOF9ibF9kYXRhOworCitzdGF0aWMgaW50IGF0eTEyOF9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIsCisJCWludCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCWludCBhdHlsZXZlbDsKKworCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJYXR5bGV2ZWwgPSBNQVhfTEVWRUwgLQorCQkoaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAoYXR5bGV2ZWwgPCAwKQorCQlhdHlsZXZlbCA9IDA7CisJZWxzZSBpZiAoYXR5bGV2ZWwgPiBNQVhfTEVWRUwpCisJCWF0eWxldmVsID0gTUFYX0xFVkVMOworCisJcmV0dXJuIGF0eWxldmVsOworfQorCisvKiBXZSB0dXJuIG9mZiB0aGUgTENEIGNvbXBsZXRlbHkgaW5zdGVhZCBvZiBqdXN0IGRpbW1pbmcgdGhlIGJhY2tsaWdodC4KKyAqIFRoaXMgcHJvdmlkZXMgZ3JlYXRlciBwb3dlciBzYXZpbmcgYW5kIHRoZSBkaXNwbGF5IGlzIHVzZWxlc3Mgd2l0aG91dAorICogYmFja2xpZ2h0IGFueXdheQorICovCisjZGVmaW5lIEJBQ0tMSUdIVF9MVkRTX09GRgorLyogVGhhdCBvbmUgcHJldmVudHMgcHJvcGVyIENSVCBvdXRwdXQgd2l0aCBMQ0Qgb2ZmICovCisjdW5kZWYgQkFDS0xJR0hUX0RBQ19PRkYKKworc3RhdGljIGludCBhdHkxMjhfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCXVuc2lnbmVkIGludCByZWcgPSBhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKKwlpbnQgbGV2ZWw7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICAhcGFyLT5sY2Rfb24pCisJCWxldmVsID0gMDsKKwllbHNlCisJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCisJcmVnIHw9IExWRFNfQkxfTU9EX0VOIHwgTFZEU19CTE9OOworCWlmIChsZXZlbCA+IDApIHsKKwkJcmVnIHw9IExWRFNfRElHSU9OOworCQlpZiAoIShyZWcgJiBMVkRTX09OKSkgeworCQkJcmVnICY9IH5MVkRTX0JMT047CisJCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOworCQkJYXR5X2xkX2xlMzIoTFZEU19HRU5fQ05UTCk7CisJCQltZGVsYXkoMTApOworCQkJcmVnIHw9IExWRFNfQkxPTjsKKwkJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7CisJCX0KKwkJcmVnICY9IH5MVkRTX0JMX01PRF9MRVZFTF9NQVNLOworCQlyZWcgfD0gKGF0eTEyOF9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIGxldmVsKSA8PCBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisjaWZkZWYgQkFDS0xJR0hUX0xWRFNfT0ZGCisJCXJlZyB8PSBMVkRTX09OIHwgTFZEU19FTjsKKwkJcmVnICY9IH5MVkRTX0RJU1BMQVlfRElTOworI2VuZGlmCisJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7CisjaWZkZWYgQkFDS0xJR0hUX0RBQ19PRkYKKwkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIGF0eV9sZF9sZTMyKERBQ19DTlRMKSAmICh+REFDX1BEV04pKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXJlZyAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKKwkJcmVnIHw9IChhdHkxMjhfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCAwKSA8PCBMVkRTX0JMX01PRF9MRVZFTF9TSElGVCk7CisjaWZkZWYgQkFDS0xJR0hUX0xWRFNfT0ZGCisJCXJlZyB8PSBMVkRTX0RJU1BMQVlfRElTOworCQlhdHlfc3RfbGUzMihMVkRTX0dFTl9DTlRMLCByZWcpOworCQlhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKKwkJdWRlbGF5KDEwKTsKKwkJcmVnICY9IH4oTFZEU19PTiB8IExWRFNfRU4gfCBMVkRTX0JMT04gfCBMVkRTX0RJR0lPTik7CisjZW5kaWYKKwkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKKyNpZmRlZiBCQUNLTElHSFRfREFDX09GRgorCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgYXR5X2xkX2xlMzIoREFDX0NOVEwpIHwgREFDX1BEV04pOworI2VuZGlmCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXR5MTI4X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eTEyOF9ibF9kYXRhID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MJPSBhdHkxMjhfYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSBhdHkxMjhfYmxfdXBkYXRlX3N0YXR1cywKKwkubWF4X2JyaWdodG5lc3MJPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAorfTsKKworc3RhdGljIHZvaWQgYXR5MTI4X2JsX2luaXQoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCWNoYXIgbmFtZVsxMl07CisKKwkvKiBDb3VsZCBiZSBleHRlbmRlZCB0byBSYWdlMTI4UHJvIExWRFMgb3V0cHV0IHRvbyAqLworCWlmIChwYXItPmNoaXBfZ2VuICE9IHJhZ2VfTTMpCisJCXJldHVybjsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCWlmICghcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoImF0aSIpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF0eTEyOGJsJWQiLCBpbmZvLT5ub2RlKTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZhdHkxMjhfYmxfZGF0YSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJaW5mby0+YmxfZGV2ID0gTlVMTDsKKwkJcHJpbnRrKCJhdHkxMjg6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaW5mby0+YmxfZGV2ID0gYmQ7CisJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAorCQkgNjMgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAorCQkyMTkgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKKwltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSBhdHkxMjhfYmxfZGF0YS5tYXhfYnJpZ2h0bmVzczsKKwliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOworCWRvd24oJmJkLT5zZW0pOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmICghcG1hY19iYWNrbGlnaHQpCisJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCXByaW50aygiYXR5MTI4OiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgYXR5MTI4X2JsX2V4aXQoc3RydWN0IGF0eTEyOGZiX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpZiAoaW5mby0+YmxfZGV2KSB7CisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJCWlmIChwbWFjX2JhY2tsaWdodCA9PSBpbmZvLT5ibF9kZXYpCisJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CisjZW5kaWYKKworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKKwkJaW5mby0+YmxfZGV2ID0gTlVMTDsKKworCQlwcmludGsoImF0eTEyODogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUICovCiAKIC8qCiAgKiAgSW5pdGlhbGlzYXRpb24KQEAgLTE4MzUsMTcgKzIwMjAsMTUgQEAKIAlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCS8qIENvdWxkIGJlIGV4dGVuZGVkIHRvIFJhZ2UxMjhQcm8gTFZEUyBvdXRwdXQgdG9vICovCi0JaWYgKHBhci0+Y2hpcF9nZW4gPT0gcmFnZV9NMykKLQkJcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoJmF0eTEyOF9iYWNrbGlnaHRfY29udHJvbGxlciwgcGFyLCAiYXRpIik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KIAlwYXItPnBtX3JlZyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CiAJcGFyLT5wZGV2ID0gcGRldjsKIAlwYXItPmFzbGVlcCA9IDA7CiAJcGFyLT5sb2NrX2JsYW5rID0gMDsKLQkKKworI2lmZGVmIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUCisJYXR5MTI4X2JsX2luaXQocGFyKTsKKyNlbmRpZgorCiAJcHJpbnRrKEtFUk5fSU5GTyAiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBvbiAlc1xuIiwKIAkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCB2aWRlb19jYXJkKTsKIApAQCAtMTk4MSw2ICsyMTY0LDEwIEBACiAKIAlwYXIgPSBpbmZvLT5wYXI7CiAKKyNpZmRlZiBDT05GSUdfRkJfQVRZMTI4X0JBQ0tMSUdIVAorCWF0eTEyOF9ibF9leGl0KHBhcik7CisjZW5kaWYKKwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAjaWZkZWYgQ09ORklHX01UUlIKIAlpZiAocGFyLT5tdHJyLnZyYW1fdmFsaWQpCkBAIC0yMDExLDEwICsyMTk4LDE0IEBACiAJaWYgKHBhci0+bG9ja19ibGFuayB8fCBwYXItPmFzbGVlcCkKIAkJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmspCi0JCXNldF9iYWNrbGlnaHRfZW5hYmxlKDApOwotI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLworI2lmZGVmIENPTkZJR19GQl9BVFkxMjhfQkFDS0xJR0hUCisJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJsYW5rKSB7CisJCWRvd24oJmZiLT5ibF9kZXYtPnNlbSk7CisJCWZiLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1BPV0VSRE9XTjsKKwkJZmItPmJsX2Rldi0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoZmItPmJsX2Rldik7CisJCXVwKCZmYi0+YmxfZGV2LT5zZW0pOworCX0KKyNlbmRpZgogCiAJaWYgKGJsYW5rICYgRkJfQkxBTktfVlNZTkNfU1VTUEVORCkKIAkJc3RhdGUgfD0gMjsKQEAgLTIwMjksMTAgKzIyMjAsMTQgQEAKIAkJYXR5MTI4X3NldF9jcnRfZW5hYmxlKHBhciwgcGFyLT5jcnRfb24gJiYgIWJsYW5rKTsKIAkJYXR5MTI4X3NldF9sY2RfZW5hYmxlKHBhciwgcGFyLT5sY2Rfb24gJiYgIWJsYW5rKTsKIAl9Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmICFibGFuaykKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoMSk7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCisjaWZkZWYgQ09ORklHX0ZCX0FUWTEyOF9CQUNLTElHSFQKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgIWJsYW5rKSB7CisJCWRvd24oJmZiLT5ibF9kZXYtPnNlbSk7CisJCWZiLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJCWZiLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGZiLT5ibF9kZXYpOworCQl1cCgmZmItPmJsX2Rldi0+c2VtKTsKKwl9CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEzOCw3MyArMjMzMyw2IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBpbnQgYmFja2xpZ2h0X2NvbnZbXSA9IHsKLQkweGZmLCAweGMwLCAweGI1LCAweGFhLCAweDlmLCAweDk0LCAweDg5LCAweDdlLAotCTB4NzMsIDB4NjgsIDB4NWQsIDB4NTIsIDB4NDcsIDB4M2MsIDB4MzEsIDB4MjQKLX07Ci0KLS8qIFdlIHR1cm4gb2ZmIHRoZSBMQ0QgY29tcGxldGVseSBpbnN0ZWFkIG9mIGp1c3QgZGltbWluZyB0aGUgYmFja2xpZ2h0LgotICogVGhpcyBwcm92aWRlcyBncmVhdGVyIHBvd2VyIHNhdmluZyBhbmQgdGhlIGRpc3BsYXkgaXMgdXNlbGVzcyB3aXRob3V0Ci0gKiBiYWNrbGlnaHQgYW55d2F5Ci0gKi8KLSNkZWZpbmUgQkFDS0xJR0hUX0xWRFNfT0ZGCi0vKiBUaGF0IG9uZSBwcmV2ZW50cyBwcm9wZXIgQ1JUIG91dHB1dCB3aXRoIExDRCBvZmYgKi8KLSN1bmRlZiBCQUNLTElHSFRfREFDX09GRgotCi1zdGF0aWMgaW50IGF0eTEyOF9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYXR5MTI4ZmJfcGFyICpwYXIgPSBkYXRhOwotCXVuc2lnbmVkIGludCByZWcgPSBhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKLQotCWlmICghcGFyLT5sY2Rfb24pCi0JCW9uID0gMDsKLQlyZWcgfD0gTFZEU19CTF9NT0RfRU4gfCBMVkRTX0JMT047Ci0JaWYgKG9uICYmIGxldmVsID4gQkFDS0xJR0hUX09GRikgewotCQlyZWcgfD0gTFZEU19ESUdJT047Ci0JCWlmICghKHJlZyAmIExWRFNfT04pKSB7Ci0JCQlyZWcgJj0gfkxWRFNfQkxPTjsKLQkJCWF0eV9zdF9sZTMyKExWRFNfR0VOX0NOVEwsIHJlZyk7Ci0JCQkodm9pZClhdHlfbGRfbGUzMihMVkRTX0dFTl9DTlRMKTsKLQkJCW1kZWxheSgxMCk7Ci0JCQlyZWcgfD0gTFZEU19CTE9OOwotCQkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLQkJfQotCQlyZWcgJj0gfkxWRFNfQkxfTU9EX0xFVkVMX01BU0s7Ci0JCXJlZyB8PSAoYmFja2xpZ2h0X2NvbnZbbGV2ZWxdIDw8IExWRFNfQkxfTU9EX0xFVkVMX1NISUZUKTsKLSNpZmRlZiBCQUNLTElHSFRfTFZEU19PRkYKLQkJcmVnIHw9IExWRFNfT04gfCBMVkRTX0VOOwotCQlyZWcgJj0gfkxWRFNfRElTUExBWV9ESVM7Ci0jZW5kaWYKLQkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLSNpZmRlZiBCQUNLTElHSFRfREFDX09GRgotCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgYXR5X2xkX2xlMzIoREFDX0NOVEwpICYgKH5EQUNfUERXTikpOwotI2VuZGlmCQkKLQl9IGVsc2UgewotCQlyZWcgJj0gfkxWRFNfQkxfTU9EX0xFVkVMX01BU0s7Ci0JCXJlZyB8PSAoYmFja2xpZ2h0X2NvbnZbMF0gPDwgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOwotI2lmZGVmIEJBQ0tMSUdIVF9MVkRTX09GRgotCQlyZWcgfD0gTFZEU19ESVNQTEFZX0RJUzsKLQkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLQkJKHZvaWQpYXR5X2xkX2xlMzIoTFZEU19HRU5fQ05UTCk7Ci0JCXVkZWxheSgxMCk7Ci0JCXJlZyAmPSB+KExWRFNfT04gfCBMVkRTX0VOIHwgTFZEU19CTE9OIHwgTFZEU19ESUdJT04pOwotI2VuZGlmCQkKLQkJYXR5X3N0X2xlMzIoTFZEU19HRU5fQ05UTCwgcmVnKTsKLSNpZmRlZiBCQUNLTElHSFRfREFDX09GRgotCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgYXR5X2xkX2xlMzIoREFDX0NOVEwpIHwgREFDX1BEV04pOwotI2VuZGlmCQkKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdHkxMjhfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQqIGRhdGEpCi17Ci0JcmV0dXJuIGF0eTEyOF9zZXRfYmFja2xpZ2h0X2VuYWJsZSgxLCBsZXZlbCwgZGF0YSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KICNpZiAwCiAgICAgLyoKICAgICAgKiAgQWNjZWxlcmF0ZWQgZnVuY3Rpb25zCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmIuaAppbmRleCBlOWI3YTY0Li40M2QyY2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYi5oCisrKyBiL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiLmgKQEAgLTE1MSw2ICsxNTEsNyBAQAogCWludCBsb2NrX2JsYW5rOwogCXVuc2lnbmVkIGxvbmcgcmVzX3N0YXJ0OwogCXVuc2lnbmVkIGxvbmcgcmVzX3NpemU7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CiAjaWZkZWYgX19zcGFyY19fCiAJc3RydWN0IHBjaV9tbWFwX21hcCAqbW1hcF9tYXA7CiAJdTggbW1hcGVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jIGIvZHJpdmVycy92aWRlby9hdHkvYXR5ZmJfYmFzZS5jCmluZGV4IGQ5ZDdkM2MuLmM1MTg1ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L2F0eWZiX2Jhc2UuYworKysgYi9kcml2ZXJzL3ZpZGVvL2F0eS9hdHlmYl9iYXNlLmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0yMTE1LDQ1ICsyMTE2LDE0MiBAQAogCiAjZW5kaWYgLyogIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpICovCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKy8qIEJhY2tsaWdodCAqLworI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCisjZGVmaW5lIE1BWF9MRVZFTCAweEZGCiAKLSAgICAvKgotICAgICAqICAgTENEIGJhY2tsaWdodCBjb250cm9sCi0gICAgICovCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eV9ibF9kYXRhOwogCi1zdGF0aWMgaW50IGJhY2tsaWdodF9jb252W10gPSB7Ci0JMHgwMCwgMHgzZiwgMHg0YywgMHg1OSwgMHg2NiwgMHg3MywgMHg4MCwgMHg4ZCwKLQkweDlhLCAweGE3LCAweGI0LCAweGMxLCAweGNmLCAweGRjLCAweGU5LCAweGZmCi19OwotCi1zdGF0aWMgaW50IGF0eV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IGxldmVsKQogewotCXN0cnVjdCBmYl9pbmZvICppbmZvID0gKHN0cnVjdCBmYl9pbmZvICopIGRhdGE7Ci0Jc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisJaW50IGF0eWxldmVsOworCisJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlhdHlsZXZlbCA9IGluZm8tPmJsX2N1cnZlW2xldmVsXSAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfTEVWRUw7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwlpZiAoYXR5bGV2ZWwgPCAwKQorCQlhdHlsZXZlbCA9IDA7CisJZWxzZSBpZiAoYXR5bGV2ZWwgPiBNQVhfTEVWRUwpCisJCWF0eWxldmVsID0gTUFYX0xFVkVMOworCisJcmV0dXJuIGF0eWxldmVsOworfQorCitzdGF0aWMgaW50IGF0eV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CiAJdW5zaWduZWQgaW50IHJlZyA9IGF0eV9sZF9sY2QoTENEX01JU0NfQ05UTCwgcGFyKTsKKwlpbnQgbGV2ZWw7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJbGV2ZWwgPSAwOworCWVsc2UKKwkJbGV2ZWwgPSBiZC0+cHJvcHMtPmJyaWdodG5lc3M7CiAKIAlyZWcgfD0gKEJMTU9EX0VOIHwgQklBU01PRF9FTik7Ci0JaWYgKG9uICYmIGxldmVsID4gQkFDS0xJR0hUX09GRikgeworCWlmIChsZXZlbCA+IDApIHsKIAkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwotCQlyZWcgfD0gKGJhY2tsaWdodF9jb252W2xldmVsXSA8PCBCSUFTX01PRF9MRVZFTF9TSElGVCk7CisJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKIAl9IGVsc2UgewogCQlyZWcgJj0gfkJJQVNfTU9EX0xFVkVMX01BU0s7Ci0JCXJlZyB8PSAoYmFja2xpZ2h0X2NvbnZbMF0gPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOworCQlyZWcgfD0gKGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIDApIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKIAl9CiAJYXR5X3N0X2xjZChMQ0RfTUlTQ19DTlRMLCByZWcsIHBhcik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdHlfc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGF0eV9ibF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCiB7Ci0JcmV0dXJuIGF0eV9zZXRfYmFja2xpZ2h0X2VuYWJsZSgxLCBsZXZlbCwgZGF0YSk7CisJcmV0dXJuIGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKIH0KIAotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciBhdHlfYmFja2xpZ2h0X2NvbnRyb2xsZXIgPSB7Ci0JYXR5X3NldF9iYWNrbGlnaHRfZW5hYmxlLAotCWF0eV9zZXRfYmFja2xpZ2h0X2xldmVsCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eV9ibF9kYXRhID0geworCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCisJLmdldF9icmlnaHRuZXNzID0gYXR5X2JsX2dldF9icmlnaHRuZXNzLAorCS51cGRhdGVfc3RhdHVzCT0gYXR5X2JsX3VwZGF0ZV9zdGF0dXMsCisJLm1heF9icmlnaHRuZXNzID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKIH07Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCisKK3N0YXRpYyB2b2lkIGF0eV9ibF9pbml0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwljaGFyIG5hbWVbMTJdOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJaWYgKCFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgiYXRpIikpCisJCXJldHVybjsKKyNlbmRpZgorCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiYXR5YmwlZCIsIGluZm8tPm5vZGUpOworCisJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIHBhciwgJmF0eV9ibF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlpbmZvLT5ibF9kZXYgPSBOVUxMOworCQlwcmludGsoImF0eTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKGluZm8sIDAsCisJCTB4M0YgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAorCQkweEZGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwl1cCgmYmQtPnNlbSk7CisJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gYXR5X2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CisJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwlkb3duKCZiZC0+c2VtKTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAoIXBtYWNfYmFja2xpZ2h0KQorCQlwbWFjX2JhY2tsaWdodCA9IGJkOworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwlwcmludGsoImF0eTogQmFja2xpZ2h0IGluaXRpYWxpemVkICglcylcbiIsIG5hbWUpOworCisJcmV0dXJuOworCitlcnJvcjoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGF0eV9ibF9leGl0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaWYgKGluZm8tPmJsX2RldikgeworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gaW5mby0+YmxfZGV2KQorCQkJcG1hY19iYWNrbGlnaHQgPSBOVUxMOworI2VuZGlmCisKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmJsX2Rldik7CisKKwkJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKK30KKworI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdHlfY2FsY19tZW1fcmVmcmVzaChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCB4Y2xrKQogewpAQCAtMjUxMyw5ICsyNjExLDEzIEBACiAJCS8qIHRoZXNlIGJpdHMgbGV0IHRoZSAxMDEgcG93ZXJib29rIHdha2UgdXAgZnJvbSBzbGVlcCAtLSBwYXVsdXMgKi8KIAkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcikKIAkJCSAgIHwgKFVTRV9GMzJLSFogfCBUUklTVEFURV9NRU1fRU4pLCBwYXIpOwotCX0gZWxzZSBpZiAoTTY0X0hBUyhNT0JJTF9CVVMpKQotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmYXR5X2JhY2tsaWdodF9jb250cm9sbGVyLCBpbmZvLCAiYXRpIik7Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCisJfSBlbHNlCisjZW5kaWYKKwlpZiAoTTY0X0hBUyhNT0JJTF9CVVMpKSB7CisjaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKKwkJYXR5X2JsX2luaXQgKHBhcik7CisjZW5kaWYKKwl9CiAKIAltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHZhcikpOwogI2lmZGVmIENPTkZJR19QUEMKQEAgLTI2NzQsOCArMjc3NiwxNiBAQAogCQlyZXR1cm4gMDsKIAogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBibGFuayA+IEZCX0JMQU5LX05PUk1BTCkKLQkJc2V0X2JhY2tsaWdodF9lbmFibGUoMCk7CisJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJsYW5rID4gRkJfQkxBTktfTk9STUFMKSB7CisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJaWYgKGluZm8tPmJsX2RldikgeworCQkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJCQlpbmZvLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CisJCQl1cCgmaW5mby0+YmxfZGV2LT5zZW0pOworCQl9CisJCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCX0KICNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKIAlpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwgJiYKIAkgICAgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewpAQCAtMjcwNiw4ICsyODE2LDE2IEBACiAJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgZ2VuX2NudGwsIHBhcik7CiAKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKQotCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSgxKTsKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKSB7CisJCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwkJaWYgKGluZm8tPmJsX2RldikgeworCQkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCQkJaW5mby0+YmxfZGV2LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhpbmZvLT5ibF9kZXYpOworCQkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKKwkJfQorCQltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKKwl9CiAjZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCiAJaWYgKHBhci0+bGNkX3RhYmxlICYmIGJsYW5rIDw9IEZCX0JMQU5LX05PUk1BTCAmJgogCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CkBAIC0yOTY2LDcgKzMwODQsNyBAQAogCX0KIAogCXBjcCA9IHBkZXYtPnN5c2RhdGE7Ci0JaWYgKG5vZGUgPT0gcGNwLT5wcm9tX25vZGUpIHsKKwlpZiAobm9kZSA9PSBwY3AtPnByb21fbm9kZS0+bm9kZSkgewogCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZkZWZhdWx0X3ZhcjsKIAkJdW5zaWduZWQgaW50IE4sIFAsIFEsIE0sIFQsIFI7CiAJCXUzMiB2X3RvdGFsLCBoX3RvdGFsOwpAQCAtMzQ0MCw2ICszNTU4LDcgQEAKIAlwYXItPnJlc19zdGFydCA9IHJlc19zdGFydDsKIAlwYXItPnJlc19zaXplID0gcmVzX3NpemU7CiAJcGFyLT5pcnEgPSBwZGV2LT5pcnE7CisJcGFyLT5wZGV2ID0gcGRldjsKIAogCS8qIFNldHVwICJpbmZvIiBzdHJ1Y3R1cmUgKi8KICNpZmRlZiBfX3NwYXJjX18KQEAgLTM1NzEsNiArMzY5MCwxMSBAQAogCWF0eV9zZXRfY3J0YyhwYXIsICZzYXZlZF9jcnRjKTsKIAlwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnNhdmVkX3BsbCk7CiAKKyNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAorCWlmIChNNjRfSEFTKE1PQklMX0JVUykpCisJCWF0eV9ibF9leGl0KHBhcik7CisjZW5kaWYKKwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CiAKICNpZmRlZiBDT05GSUdfTVRSUgpAQCAtMzcyMiw3ICszODQ2LDkgQEAKICAgICBhdHlmYl9zZXR1cChvcHRpb24pOwogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfUENJCiAgICAgcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKKyNlbmRpZgogI2lmZGVmIENPTkZJR19BVEFSSQogICAgIGF0eWZiX2F0YXJpX3Byb2JlKCk7CiAjZW5kaWYKQEAgLTM3MzEsNyArMzg1Nyw5IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdHlmYl9leGl0KHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX1BDSQogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKKyNlbmRpZgogfQogCiBtb2R1bGVfaW5pdChhdHlmYl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYWNrbGlnaHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU2NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2JhY2tsaWdodC5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQmFja2xpZ2h0IGNvZGUgZm9yIEFUSSBSYWRlb24gYmFzZWQgZ3JhcGhpYyBjYXJkcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBBbmkgSm9zaGkgPGFqb3NoaUBrZXJuZWwuY3Jhc2hpbmcub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAzIEJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqIENvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIEhhbnNlbG1hbm4gPGxpbnV4LWtlcm5lbEBoYW5zbWkuY2g+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAicmFkZW9uZmIuaCIKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1BWF9SQURFT05fTEVWRUwgMHhGRgorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHJhZGVvbl9ibF9kYXRhOworCitzdHJ1Y3QgcmFkZW9uX2JsX3ByaXZkYXRhIHsKKwlzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm87CisJdWludDhfdCBuZWdhdGl2ZTsKK307CisKK3N0YXRpYyBpbnQgcmFkZW9uX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCByYWRlb25fYmxfcHJpdmRhdGEgKnBkYXRhLAorCQlpbnQgbGV2ZWwpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwZGF0YS0+cmluZm8tPmluZm87CisJaW50IHJsZXZlbDsKKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKworCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KKwlybGV2ZWwgPSBwZGF0YS0+cmluZm8tPmluZm8tPmJsX2N1cnZlW2xldmVsXSAqCisJCSBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX1JBREVPTl9MRVZFTDsKKworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJaWYgKHBkYXRhLT5uZWdhdGl2ZSkKKwkJcmxldmVsID0gTUFYX1JBREVPTl9MRVZFTCAtIHJsZXZlbDsKKworCWlmIChybGV2ZWwgPCAwKQorCQlybGV2ZWwgPSAwOworCWVsc2UgaWYgKHJsZXZlbCA+IE1BWF9SQURFT05fTEVWRUwpCisJCXJsZXZlbCA9IE1BWF9SQURFT05fTEVWRUw7CisKKwlyZXR1cm4gcmxldmVsOworfQorCitzdGF0aWMgaW50IHJhZGVvbl9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgcmFkZW9uX2JsX3ByaXZkYXRhICpwZGF0YSA9IGNsYXNzX2dldF9kZXZkYXRhKCZiZC0+Y2xhc3NfZGV2KTsKKwlzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSBwZGF0YS0+cmluZm87CisJdTMyIGx2ZHNfZ2VuX2NudGwsIHRtcFBpeGNsa3NDbnRsOworCWludCBsZXZlbDsKKworCWlmIChyaW5mby0+bW9uMV90eXBlICE9IE1UX0xDRCkKKwkJcmV0dXJuIDA7CisKKwkvKiBXZSB0dXJuIG9mZiB0aGUgTENEIGNvbXBsZXRlbHkgaW5zdGVhZCBvZiBqdXN0IGRpbW1pbmcgdGhlCisJICogYmFja2xpZ2h0LiBUaGlzIHByb3ZpZGVzIHNvbWUgZ3JlYXRlciBwb3dlciBzYXZpbmcgYW5kIHRoZSBkaXNwbGF5CisJICogaXMgdXNlbGVzcyB3aXRob3V0IGJhY2tsaWdodCBhbnl3YXkuCisJICovCisgICAgICAgIGlmIChiZC0+cHJvcHMtPnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTksgfHwKKwkgICAgYmQtPnByb3BzLT5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQorCQlsZXZlbCA9IDA7CisJZWxzZQorCQlsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKKworCWRlbF90aW1lcl9zeW5jKCZyaW5mby0+bHZkc190aW1lcik7CisJcmFkZW9uX2VuZ2luZV9pZGxlKCk7CisKKwlsdmRzX2dlbl9jbnRsID0gSU5SRUcoTFZEU19HRU5fQ05UTCk7CisJaWYgKGxldmVsID4gMCkgeworCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0RJU1BMQVlfRElTOworCQlpZiAoIShsdmRzX2dlbl9jbnRsICYgTFZEU19CTE9OKSB8fCAhKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX09OKSkgeworCQkJbHZkc19nZW5fY250bCB8PSAocmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmIExWRFNfRElHT04pOworCQkJbHZkc19nZW5fY250bCB8PSBMVkRTX0JMT04gfCBMVkRTX0VOOworCQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOworCQkJbHZkc19nZW5fY250bCAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKKwkJCWx2ZHNfZ2VuX2NudGwgfD0KKwkJCQkocmFkZW9uX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBkYXRhLCBsZXZlbCkgPDwKKwkJCQkgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOworCQkJbHZkc19nZW5fY250bCB8PSBMVkRTX09OOworCQkJbHZkc19nZW5fY250bCB8PSAocmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmIExWRFNfQkxfTU9EX0VOKTsKKwkJCXJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwgPSBsdmRzX2dlbl9jbnRsOworCQkJbW9kX3RpbWVyKCZyaW5mby0+bHZkc190aW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHJpbmZvLT5wYW5lbF9pbmZvLnB3cl9kZWxheSkpOworCQl9IGVsc2UgeworCQkJbHZkc19nZW5fY250bCAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKKwkJCWx2ZHNfZ2VuX2NudGwgfD0KKwkJCQkocmFkZW9uX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBkYXRhLCBsZXZlbCkgPDwKKwkJCQkgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOworCQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOworCQl9CisJCXJpbmZvLT5pbml0X3N0YXRlLmx2ZHNfZ2VuX2NudGwgJj0gfkxWRFNfU1RBVEVfTUFTSzsKKwkJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCB8PSByaW5mby0+cGVuZGluZ19sdmRzX2dlbl9jbnRsCisJCQkmIExWRFNfU1RBVEVfTUFTSzsKKwl9IGVsc2UgeworCQkvKiBBc2ljIGJ1Zywgd2hlbiB0dXJuaW5nIG9mZiBMVkRTX09OLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQorCQkgICBSQURFT05fUElYQ0xLX0xWRFNfQUxXQVlTX09OIGJpdCBpcyBvZmYKKwkJKi8KKwkJdG1wUGl4Y2xrc0NudGwgPSBJTlBMTChQSVhDTEtTX0NOVEwpOworCQlpZiAocmluZm8tPmlzX21vYmlsaXR5IHx8IHJpbmZvLT5pc19JR1ApCisJCQlPVVRQTExQKFBJWENMS1NfQ05UTCwgMCwgflBJWENMS19MVkRTX0FMV0FZU19PTmIpOworCQlsdmRzX2dlbl9jbnRsICY9IH4oTFZEU19CTF9NT0RfTEVWRUxfTUFTSyB8IExWRFNfQkxfTU9EX0VOKTsKKwkJbHZkc19nZW5fY250bCB8PSAocmFkZW9uX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBkYXRhLCAwKSA8PAorCQkJCSAgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOworCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfRElTUExBWV9ESVM7CisJCU9VVFJFRyhMVkRTX0dFTl9DTlRMLCBsdmRzX2dlbl9jbnRsKTsKKwkJdWRlbGF5KDEwMCk7CisJCWx2ZHNfZ2VuX2NudGwgJj0gfihMVkRTX09OIHwgTFZEU19FTik7CisJCU9VVFJFRyhMVkRTX0dFTl9DTlRMLCBsdmRzX2dlbl9jbnRsKTsKKwkJbHZkc19nZW5fY250bCAmPSB+KExWRFNfRElHT04pOworCQlyaW5mby0+cGVuZGluZ19sdmRzX2dlbl9jbnRsID0gbHZkc19nZW5fY250bDsKKwkJbW9kX3RpbWVyKCZyaW5mby0+bHZkc190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmluZm8tPnBhbmVsX2luZm8ucHdyX2RlbGF5KSk7CisJCWlmIChyaW5mby0+aXNfbW9iaWxpdHkgfHwgcmluZm8tPmlzX0lHUCkKKwkJCU9VVFBMTChQSVhDTEtTX0NOVEwsIHRtcFBpeGNsa3NDbnRsKTsKKwl9CisJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmPSB+TFZEU19TVEFURV9NQVNLOworCXJpbmZvLT5pbml0X3N0YXRlLmx2ZHNfZ2VuX2NudGwgfD0gKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX1NUQVRFX01BU0spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmFkZW9uX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHJhZGVvbl9ibF9kYXRhID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSByYWRlb25fYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSByYWRlb25fYmxfdXBkYXRlX3N0YXR1cywKKwkubWF4X2JyaWdodG5lc3MgPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAorfTsKKwordm9pZCByYWRlb25mYl9ibF9pbml0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJc3RydWN0IHJhZGVvbl9ibF9wcml2ZGF0YSAqcGRhdGE7CisJY2hhciBuYW1lWzEyXTsKKworCWlmIChyaW5mby0+bW9uMV90eXBlICE9IE1UX0xDRCkKKwkJcmV0dXJuOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJaWYgKCFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgiYXRpIikgJiYKKwkgICAgIXBtYWNfaGFzX2JhY2tsaWdodF90eXBlKCJtbmNhIikpCisJCXJldHVybjsKKyNlbmRpZgorCisJcGRhdGEgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFkZW9uX2JsX3ByaXZkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkgeworCQlwcmludGsoInJhZGVvbmZiOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yOworCX0KKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInJhZGVvbmJsJWQiLCByaW5mby0+aW5mby0+bm9kZSk7CisKKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIobmFtZSwgcGRhdGEsICZyYWRlb25fYmxfZGF0YSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJcmluZm8tPmluZm8tPmJsX2RldiA9IE5VTEw7CisJCXByaW50aygicmFkZW9uZmI6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlwZGF0YS0+cmluZm8gPSByaW5mbzsKKworCS8qIFBhcmRvbiBtZSBmb3IgdGhhdCBoYWNrLi4uIG1heWJlIHNvbWUgZGF5IHdlIGNhbiBmaWd1cmUgb3V0IGluIHdoYXQKKwkgKiBkaXJlY3Rpb24gYmFja2xpZ2h0IHNob3VsZCB3b3JrIG9uIGEgZ2l2ZW4gcGFuZWw/CisJICovCisJcGRhdGEtPm5lZ2F0aXZlID0KKwkJKHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUlYyMDAgJiYKKwkJIHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUlYyNTAgJiYKKwkJIHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUlYyODAgJiYKKwkJIHJpbmZvLT5mYW1pbHkgIT0gQ0hJUF9GQU1JTFlfUlYzNTApOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJcGRhdGEtPm5lZ2F0aXZlID0gcGRhdGEtPm5lZ2F0aXZlIHx8CisJCW1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rNCwzIikgfHwKKwkJbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2s2LDMiKSB8fAorCQltYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazYsNSIpOworI2VuZGlmCisKKwltdXRleF9sb2NrKCZyaW5mby0+aW5mby0+YmxfbXV0ZXgpOworCXJpbmZvLT5pbmZvLT5ibF9kZXYgPSBiZDsKKwlmYl9ibF9kZWZhdWx0X2N1cnZlKHJpbmZvLT5pbmZvLCAwLAorCQkgNjMgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX1JBREVPTl9MRVZFTCwKKwkJMjE3ICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9SQURFT05fTEVWRUwpOworCW11dGV4X3VubG9jaygmcmluZm8tPmluZm8tPmJsX211dGV4KTsKKworCXVwKCZiZC0+c2VtKTsKKwliZC0+cHJvcHMtPmJyaWdodG5lc3MgPSByYWRlb25fYmxfZGF0YS5tYXhfYnJpZ2h0bmVzczsKKwliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOworCWRvd24oJmJkLT5zZW0pOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmICghcG1hY19iYWNrbGlnaHQpCisJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCXByaW50aygicmFkZW9uZmI6IEJhY2tsaWdodCBpbml0aWFsaXplZCAoJXMpXG4iLCBuYW1lKTsKKworCXJldHVybjsKKworZXJyb3I6CisJa2ZyZWUocGRhdGEpOworCXJldHVybjsKK30KKwordm9pZCByYWRlb25mYl9ibF9leGl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykKK3sKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCW11dGV4X2xvY2soJnJpbmZvLT5pbmZvLT5ibF9tdXRleCk7CisJaWYgKHJpbmZvLT5pbmZvLT5ibF9kZXYpIHsKKwkJc3RydWN0IHJhZGVvbl9ibF9wcml2ZGF0YSAqcGRhdGE7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwkJaWYgKHBtYWNfYmFja2xpZ2h0ID09IHJpbmZvLT5pbmZvLT5ibF9kZXYpCisJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CisjZW5kaWYKKworCQlwZGF0YSA9IGNsYXNzX2dldF9kZXZkYXRhKCZyaW5mby0+aW5mby0+YmxfZGV2LT5jbGFzc19kZXYpOworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIocmluZm8tPmluZm8tPmJsX2Rldik7CisJCWtmcmVlKHBkYXRhKTsKKwkJcmluZm8tPmluZm8tPmJsX2RldiA9IE5VTEw7CisKKwkJcHJpbnRrKCJyYWRlb25mYjogQmFja2xpZ2h0IHVubG9hZGVkXG4iKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZyaW5mby0+aW5mby0+YmxfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMgYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25fYmFzZS5jCmluZGV4IDM4N2ExOGEuLmM1ZWNiYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uX2Jhc2UuYwpAQCAtNzgsMTAgKzc4LDYgQEAKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgogI2luY2x1ZGUgIi4uL21hY21vZGVzLmgiCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLSNpbmNsdWRlIDxhc20vYmFja2xpZ2h0Lmg+Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiAjaW5jbHVkZSA8YXNtL2J0ZXh0Lmg+CiAjZW5kaWYKQEAgLTI3NywyMCArMjczLDYgQEAKICAqIHByb3RvdHlwZXMKICAqLwogCi0KLSNpZmRlZiBDT05GSUdfUFBDX09GCi0KLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBpbnQgcmFkZW9uX3NldF9iYWNrbGlnaHRfZW5hYmxlKGludCBvbiwgaW50IGxldmVsLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBpbnQgcmFkZW9uX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgcmFkZW9uX2JhY2tsaWdodF9jb250cm9sbGVyID0gewotCXJhZGVvbl9zZXRfYmFja2xpZ2h0X2VuYWJsZSwKLQlyYWRlb25fc2V0X2JhY2tsaWdodF9sZXZlbAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KLQotI2VuZGlmIC8qIENPTkZJR19QUENfT0YgKi8KLQogc3RhdGljIHZvaWQgcmFkZW9uX3VubWFwX1JPTShzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8sIHN0cnVjdCBwY2lfZGV2ICpkZXYpCiB7CiAJaWYgKCFyaW5mby0+Ymlvc19zZWcpCkBAIC0xOTEzLDExNiArMTg5NSw2IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi0KLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQotLyogVE9ETzogRGJsIGNoZWNrIHRoZXNlIHRhYmxlcywgd2UgZG9uJ3QgZ28gdXAgdG8gZnVsbCBPTiBiYWNrbGlnaHQKLSAqIGluIHRoZXNlLCBwb3NzaWJseSBiZWNhdXNlIHdlIG5vdGljZWQgTWFjT1MgZG9lc24ndCwgYnV0IEknZCBwcmVmZXIKLSAqIGhhdmluZyBzb21lIG1vcmUgb2ZmaWNpYWwgbnVtYmVycyBmcm9tIEFUSQotICovCi1zdGF0aWMgaW50IGJhY2tsaWdodF9jb252X202W10gPSB7Ci0JMHhmZiwgMHhjMCwgMHhiNSwgMHhhYSwgMHg5ZiwgMHg5NCwgMHg4OSwgMHg3ZSwKLQkweDczLCAweDY4LCAweDVkLCAweDUyLCAweDQ3LCAweDNjLCAweDMxLCAweDI0Ci19Owotc3RhdGljIGludCBiYWNrbGlnaHRfY29udl9tN1tdID0gewotCTB4MDAsIDB4M2YsIDB4NGEsIDB4NTUsIDB4NjAsIDB4NmIsIDB4NzYsIDB4ODEsCi0JMHg4YywgMHg5NywgMHhhMiwgMHhhZCwgMHhiOCwgMHhjMywgMHhjZSwgMHhkOQotfTsKLQotI2RlZmluZSBCQUNLTElHSFRfTFZEU19PRkYKLSN1bmRlZiBCQUNLTElHSFRfREFDX09GRgotCi0vKiBXZSB0dXJuIG9mZiB0aGUgTENEIGNvbXBsZXRlbHkgaW5zdGVhZCBvZiBqdXN0IGRpbW1pbmcgdGhlIGJhY2tsaWdodC4KLSAqIFRoaXMgcHJvdmlkZXMgc29tZSBncmVhdGVyIHBvd2VyIHNhdmluZyBhbmQgdGhlIGRpc3BsYXkgaXMgdXNlbGVzcwotICogd2l0aG91dCBiYWNrbGlnaHQgYW55d2F5LgotICovCi1zdGF0aWMgaW50IHJhZGVvbl9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8gPSAoc3RydWN0IHJhZGVvbmZiX2luZm8gKilkYXRhOwotCXUzMiBsdmRzX2dlbl9jbnRsLCB0bXBQaXhjbGtzQ250bDsKLQlpbnQqIGNvbnZfdGFibGU7Ci0KLQlpZiAocmluZm8tPm1vbjFfdHlwZSAhPSBNVF9MQ0QpCi0JCXJldHVybiAwOwotCi0JLyogUGFyZG9uIG1lIGZvciB0aGF0IGhhY2suLi4gbWF5YmUgc29tZSBkYXkgd2UgY2FuIGZpZ3VyZQotCSAqIG91dCBpbiB3aGF0IGRpcmVjdGlvbiBiYWNrbGlnaHQgc2hvdWxkIHdvcmsgb24gYSBnaXZlbgotCSAqIHBhbmVsID8KLQkgKi8KLQlpZiAoKHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyMDAgfHwKLQkgICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyNTAgfHwKLQkgICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYyODAgfHwKLQkgICAgIHJpbmZvLT5mYW1pbHkgPT0gQ0hJUF9GQU1JTFlfUlYzNTApICYmCi0JICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazQsMyIpICYmCi0JICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazYsMyIpICYmCi0JICAgICFtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazYsNSIpKQotCQljb252X3RhYmxlID0gYmFja2xpZ2h0X2NvbnZfbTc7Ci0JZWxzZQotCQljb252X3RhYmxlID0gYmFja2xpZ2h0X2NvbnZfbTY7Ci0KLQlkZWxfdGltZXJfc3luYygmcmluZm8tPmx2ZHNfdGltZXIpOwotCXJhZGVvbl9lbmdpbmVfaWRsZSgpOwotCi0JbHZkc19nZW5fY250bCA9IElOUkVHKExWRFNfR0VOX0NOVEwpOwotCWlmIChvbiAmJiAobGV2ZWwgPiBCQUNLTElHSFRfT0ZGKSkgewotCQlsdmRzX2dlbl9jbnRsICY9IH5MVkRTX0RJU1BMQVlfRElTOwotCQlpZiAoIShsdmRzX2dlbl9jbnRsICYgTFZEU19CTE9OKSB8fCAhKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX09OKSkgewotCQkJbHZkc19nZW5fY250bCB8PSAocmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmIExWRFNfRElHT04pOwotCQkJbHZkc19nZW5fY250bCB8PSBMVkRTX0JMT04gfCBMVkRTX0VOOwotCQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOwotCQkJbHZkc19nZW5fY250bCAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKLQkJCWx2ZHNfZ2VuX2NudGwgfD0gKGNvbnZfdGFibGVbbGV2ZWxdIDw8Ci0JCQkJCSAgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOwotCQkJbHZkc19nZW5fY250bCB8PSBMVkRTX09OOwotCQkJbHZkc19nZW5fY250bCB8PSAocmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmIExWRFNfQkxfTU9EX0VOKTsKLQkJCXJpbmZvLT5wZW5kaW5nX2x2ZHNfZ2VuX2NudGwgPSBsdmRzX2dlbl9jbnRsOwotCQkJbW9kX3RpbWVyKCZyaW5mby0+bHZkc190aW1lciwKLQkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHJpbmZvLT5wYW5lbF9pbmZvLnB3cl9kZWxheSkpOwotCQl9IGVsc2UgewotCQkJbHZkc19nZW5fY250bCAmPSB+TFZEU19CTF9NT0RfTEVWRUxfTUFTSzsKLQkJCWx2ZHNfZ2VuX2NudGwgfD0gKGNvbnZfdGFibGVbbGV2ZWxdIDw8Ci0JCQkJCSAgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOwotCQkJT1VUUkVHKExWRFNfR0VOX0NOVEwsIGx2ZHNfZ2VuX2NudGwpOwotCQl9Ci0JCXJpbmZvLT5pbml0X3N0YXRlLmx2ZHNfZ2VuX2NudGwgJj0gfkxWRFNfU1RBVEVfTUFTSzsKLQkJcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCB8PSByaW5mby0+cGVuZGluZ19sdmRzX2dlbl9jbnRsCi0JCQkmIExWRFNfU1RBVEVfTUFTSzsKLQl9IGVsc2UgewotCQkvKiBBc2ljIGJ1Zywgd2hlbiB0dXJuaW5nIG9mZiBMVkRTX09OLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZQotCQkgICBSQURFT05fUElYQ0xLX0xWRFNfQUxXQVlTX09OIGJpdCBpcyBvZmYKLQkJKi8KLQkJdG1wUGl4Y2xrc0NudGwgPSBJTlBMTChQSVhDTEtTX0NOVEwpOwotCQlpZiAocmluZm8tPmlzX21vYmlsaXR5IHx8IHJpbmZvLT5pc19JR1ApCi0JCQlPVVRQTExQKFBJWENMS1NfQ05UTCwgMCwgflBJWENMS19MVkRTX0FMV0FZU19PTmIpOwotCQlsdmRzX2dlbl9jbnRsICY9IH4oTFZEU19CTF9NT0RfTEVWRUxfTUFTSyB8IExWRFNfQkxfTU9EX0VOKTsKLQkJbHZkc19nZW5fY250bCB8PSAoY29udl90YWJsZVswXSA8PAotCQkJCSAgTFZEU19CTF9NT0RfTEVWRUxfU0hJRlQpOwotCQlsdmRzX2dlbl9jbnRsIHw9IExWRFNfRElTUExBWV9ESVM7Ci0JCU9VVFJFRyhMVkRTX0dFTl9DTlRMLCBsdmRzX2dlbl9jbnRsKTsKLQkJdWRlbGF5KDEwMCk7Ci0JCWx2ZHNfZ2VuX2NudGwgJj0gfihMVkRTX09OIHwgTFZEU19FTik7Ci0JCU9VVFJFRyhMVkRTX0dFTl9DTlRMLCBsdmRzX2dlbl9jbnRsKTsKLQkJbHZkc19nZW5fY250bCAmPSB+KExWRFNfRElHT04pOwotCQlyaW5mby0+cGVuZGluZ19sdmRzX2dlbl9jbnRsID0gbHZkc19nZW5fY250bDsKLQkJbW9kX3RpbWVyKCZyaW5mby0+bHZkc190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMocmluZm8tPnBhbmVsX2luZm8ucHdyX2RlbGF5KSk7Ci0JCWlmIChyaW5mby0+aXNfbW9iaWxpdHkgfHwgcmluZm8tPmlzX0lHUCkKLQkJCU9VVFBMTChQSVhDTEtTX0NOVEwsIHRtcFBpeGNsa3NDbnRsKTsKLQl9Ci0JcmluZm8tPmluaXRfc3RhdGUubHZkc19nZW5fY250bCAmPSB+TFZEU19TVEFURV9NQVNLOwotCXJpbmZvLT5pbml0X3N0YXRlLmx2ZHNfZ2VuX2NudGwgfD0gKGx2ZHNfZ2VuX2NudGwgJiBMVkRTX1NUQVRFX01BU0spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCByYWRlb25fc2V0X2JhY2tsaWdodF9sZXZlbChpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHJhZGVvbl9zZXRfYmFja2xpZ2h0X2VuYWJsZSgxLCBsZXZlbCwgZGF0YSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KLQogLyoKICAqIFRoaXMgcmVjb25maWd1cmUgdGhlIGNhcmQncyBpbnRlcm5hbCBtZW1vcnkgbWFwLiBJbiB0aGVvcnksIHdlJ2QgbGlrZQogICogdG8gc2V0dXAgdGhlIGNhcmQncyBtZW1vcnkgYXQgdGhlIHNhbWUgYWRkcmVzcyBhcyBpdCdzIFBDSSBidXMgYWRkcmVzcywKQEAgLTI0NzcsMTQgKzIzNDksNyBAQAogCQkJCQkJIE1UUlJfVFlQRV9XUkNPTUIsIDEpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAocmluZm8tPm1vbjFfdHlwZSA9PSBNVF9MQ0QpIHsKLQkJcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoJnJhZGVvbl9iYWNrbGlnaHRfY29udHJvbGxlciwKLQkJCQkJICAgICAgcmluZm8sICJhdGkiKTsKLQkJcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoJnJhZGVvbl9iYWNrbGlnaHRfY29udHJvbGxlciwKLQkJCQkJICAgICAgcmluZm8sICJtbmNhIik7Ci0JfQotI2VuZGlmCisJcmFkZW9uZmJfYmxfaW5pdChyaW5mbyk7CiAKIAlwcmludGsgKCJyYWRlb25mYiAoJXMpOiAlc1xuIiwgcGNpX25hbWUocmluZm8tPnBkZXYpLCByaW5mby0+bmFtZSk7CiAKQEAgLTI1MjgsNyArMjM5Myw4IEBACiAgCiAgICAgICAgIGlmICghcmluZm8pCiAgICAgICAgICAgICAgICAgcmV0dXJuOwotIAorCisJcmFkZW9uZmJfYmxfZXhpdChyaW5mbyk7CiAJcmFkZW9uZmJfcG1fZXhpdChyaW5mbyk7CiAKIAlpZiAocmluZm8tPm1vbjFfRURJRCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmggYi9kcml2ZXJzL3ZpZGVvL2F0eS9yYWRlb25mYi5oCmluZGV4IDIxN2UwMGEuLjE2NDU5NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYXR5L3JhZGVvbmZiLmgKKysrIGIvZHJpdmVycy92aWRlby9hdHkvcmFkZW9uZmIuaApAQCAtNjI1LDQgKzYyNSwxMyBAQAogZXh0ZXJuIHZvaWQgcmFkZW9uX3dyaXRlX21vZGUgKHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbywgc3RydWN0IHJhZGVvbl9yZWdzICptb2RlLAogCQkJICAgICAgIGludCByZWdfb25seSk7CiAKKy8qIEJhY2tsaWdodCBmdW5jdGlvbnMgKi8KKyNpZmRlZiBDT05GSUdfRkJfUkFERU9OX0JBQ0tMSUdIVAorZXh0ZXJuIHZvaWQgcmFkZW9uZmJfYmxfaW5pdChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pOworZXh0ZXJuIHZvaWQgcmFkZW9uZmJfYmxfZXhpdChzdHJ1Y3QgcmFkZW9uZmJfaW5mbyAqcmluZm8pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25mYl9ibF9pbml0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCByYWRlb25mYl9ibF9leGl0KHN0cnVjdCByYWRlb25mYl9pbmZvICpyaW5mbykge30KKyNlbmRpZgorCiAjZW5kaWYgLyogX19SQURFT05GQl9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jIGIvZHJpdmVycy92aWRlby9jaGlwc2ZiLmMKaW5kZXggNzJmZjZiZi4uZDc2YmJmYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY2hpcHNmYi5jCkBAIC0xNDgsOSArMTQ4LDI0IEBACiBzdGF0aWMgaW50IGNoaXBzZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKICNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQkvLyB1c2VkIHRvIGRpc2FibGUgYmFja2xpZ2h0IG9ubHkgZm9yIGJsYW5rID4gMSwgYnV0IGl0IHNlZW1zCi0JLy8gdXNlZnVsIGF0IGJsYW5rID0gMSB0b28gKHNhdmVzIGJhdHRlcnksIGV4dGVuZHMgYmFja2xpZ2h0IGxpZmUpCi0Jc2V0X2JhY2tsaWdodF9lbmFibGUoIWJsYW5rKTsKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisKKwlpZiAocG1hY19iYWNrbGlnaHQpIHsKKwkJZG93bigmcG1hY19iYWNrbGlnaHQtPnNlbSk7CisKKwkJLyogdXNlZCB0byBkaXNhYmxlIGJhY2tsaWdodCBvbmx5IGZvciBibGFuayA+IDEsIGJ1dCBpdCBzZWVtcworCQkgKiB1c2VmdWwgYXQgYmxhbmsgPSAxIHRvbyAoc2F2ZXMgYmF0dGVyeSwgZXh0ZW5kcyBiYWNrbGlnaHQKKwkJICogbGlmZSkKKwkgCSAqLworCQlpZiAoYmxhbmspCisJCQlwbWFjX2JhY2tsaWdodC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfUE9XRVJET1dOOworCQllbHNlCisJCQlwbWFjX2JhY2tsaWdodC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwkJcG1hY19iYWNrbGlnaHQtPnByb3BzLT51cGRhdGVfc3RhdHVzKHBtYWNfYmFja2xpZ2h0KTsKKwkJdXAoJnBtYWNfYmFja2xpZ2h0LT5zZW0pOworCX0KKworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwogI2VuZGlmIC8qIENPTkZJR19QTUFDX0JBQ0tMSUdIVCAqLwogCiAJcmV0dXJuIDE7CS8qIGdldCBmYl9ibGFuayB0byBzZXQgdGhlIGNvbG9ybWFwIHRvIGFsbCBibGFjayAqLwpAQCAtNDAxLDcgKzQxNiwxNCBAQAogCiAjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCiAJLyogdHVybiBvbiB0aGUgYmFja2xpZ2h0ICovCi0Jc2V0X2JhY2tsaWdodF9lbmFibGUoMSk7CisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworCWlmIChwbWFjX2JhY2tsaWdodCkgeworCQlkb3duKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwkJcG1hY19iYWNrbGlnaHQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJCXBtYWNfYmFja2xpZ2h0LT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhwbWFjX2JhY2tsaWdodCk7CisJCXVwKCZwbWFjX2JhY2tsaWdodC0+c2VtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CiAjZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCiAKICNpZmRlZiBDT05GSUdfUFBDCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbWRhY29uLmMgYi9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvbWRhY29uLmMKaW5kZXggOTg5ZTRkNC4uN2Y5MzlkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9jb25zb2xlL21kYWNvbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS9tZGFjb24uYwpAQCAtMzEzLDggKzMxMyw4IEBACiAJbWRhX251bV9jb2x1bW5zID0gODA7CiAJbWRhX251bV9saW5lcyAgID0gMjU7CiAKLQltZGFfdnJhbV9iYXNlID0gVkdBX01BUF9NRU0oMHhiMDAwMCk7CiAJbWRhX3ZyYW1fbGVuICA9IDB4MDEwMDA7CisJbWRhX3ZyYW1fYmFzZSA9IFZHQV9NQVBfTUVNKDB4YjAwMDAsIG1kYV92cmFtX2xlbik7CiAKIAltZGFfaW5kZXhfcG9ydCAgPSAweDNiNDsKIAltZGFfdmFsdWVfcG9ydCAgPSAweDNiNTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYyBiL2RyaXZlcnMvdmlkZW8vY29uc29sZS92Z2Fjb24uYwppbmRleCBkNWEwNGI2Li5lNjRkNDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2NvbnNvbGUvdmdhY29uLmMKKysrIGIvZHJpdmVycy92aWRlby9jb25zb2xlL3ZnYWNvbi5jCkBAIC0zOTEsNyArMzkxLDcgQEAKIAkJCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWdhX2NvbnNvbGVfcmVzb3VyY2UgPQogCQkJICAgIHsgImVnYSIsIDB4M0IwLCAweDNCRiB9OwogCQkJdmdhX3ZpZGVvX3R5cGUgPSBWSURFT19UWVBFX0VHQU07Ci0JCQl2Z2FfdnJhbV9lbmQgPSAweGI4MDAwOworCQkJdmdhX3ZyYW1fc2l6ZSA9IDB4ODAwMDsKIAkJCWRpc3BsYXlfZGVzYyA9ICJFR0ErIjsKIAkJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwKIAkJCQkJICZlZ2FfY29uc29sZV9yZXNvdXJjZSk7CkBAIC00MDEsNyArNDAxLDcgQEAKIAkJCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgbWRhMl9jb25zb2xlX3Jlc291cmNlID0KIAkJCSAgICB7ICJtZGEiLCAweDNCRiwgMHgzQkYgfTsKIAkJCXZnYV92aWRlb190eXBlID0gVklERU9fVFlQRV9NREE7Ci0JCQl2Z2FfdnJhbV9lbmQgPSAweGIyMDAwOworCQkJdmdhX3ZyYW1fc2l6ZSA9IDB4MjAwMDsKIAkJCWRpc3BsYXlfZGVzYyA9ICIqTURBIjsKIAkJCXJlcXVlc3RfcmVzb3VyY2UoJmlvcG9ydF9yZXNvdXJjZSwKIAkJCQkJICZtZGExX2NvbnNvbGVfcmVzb3VyY2UpOwpAQCAtNDE4LDcgKzQxOCw3IEBACiAJCWlmICgoT1JJR19WSURFT19FR0FfQlggJiAweGZmKSAhPSAweDEwKSB7CiAJCQlpbnQgaTsKIAotCQkJdmdhX3ZyYW1fZW5kID0gMHhjMDAwMDsKKwkJCXZnYV92cmFtX3NpemUgPSAweDgwMDA7CiAKIAkJCWlmICghT1JJR19WSURFT19JU1ZHQSkgewogCQkJCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgZWdhX2NvbnNvbGVfcmVzb3VyY2UKQEAgLTQ0Myw3ICs0NDMsNyBAQAogCQkJCSAqIGFuZCBDT0U9MSBpc24ndCBuZWNlc3NhcmlseSBhIGdvb2QgaWRlYSkKIAkJCQkgKi8KIAkJCQl2Z2FfdnJhbV9iYXNlID0gMHhhMDAwMDsKLQkJCQl2Z2FfdnJhbV9lbmQgPSAweGIwMDAwOworCQkJCXZnYV92cmFtX3NpemUgPSAweDEwMDAwOwogCQkJCW91dGJfcCg2LCBWR0FfR0ZYX0kpOwogCQkJCW91dGJfcCg2LCBWR0FfR0ZYX0QpOwogI2VuZGlmCkBAIC00NzUsNyArNDc1LDcgQEAKIAkJCXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgY2dhX2NvbnNvbGVfcmVzb3VyY2UgPQogCQkJICAgIHsgImNnYSIsIDB4M0Q0LCAweDNENSB9OwogCQkJdmdhX3ZpZGVvX3R5cGUgPSBWSURFT19UWVBFX0NHQTsKLQkJCXZnYV92cmFtX2VuZCA9IDB4YmEwMDA7CisJCQl2Z2FfdnJhbV9zaXplID0gMHgyMDAwOwogCQkJZGlzcGxheV9kZXNjID0gIipDR0EiOwogCQkJcmVxdWVzdF9yZXNvdXJjZSgmaW9wb3J0X3Jlc291cmNlLAogCQkJCQkgJmNnYV9jb25zb2xlX3Jlc291cmNlKTsKQEAgLTQ4Myw5ICs0ODMsOCBAQAogCQl9CiAJfQogCi0JdmdhX3ZyYW1fYmFzZSA9IFZHQV9NQVBfTUVNKHZnYV92cmFtX2Jhc2UpOwotCXZnYV92cmFtX2VuZCA9IFZHQV9NQVBfTUVNKHZnYV92cmFtX2VuZCk7Ci0JdmdhX3ZyYW1fc2l6ZSA9IHZnYV92cmFtX2VuZCAtIHZnYV92cmFtX2Jhc2U7CisJdmdhX3ZyYW1fYmFzZSA9IFZHQV9NQVBfTUVNKHZnYV92cmFtX2Jhc2UsIHZnYV92cmFtX3NpemUpOworCXZnYV92cmFtX2VuZCA9IHZnYV92cmFtX2Jhc2UgKyB2Z2FfdnJhbV9zaXplOwogCiAJLyoKIAkgKiAgICAgIEZpbmQgb3V0IGlmIHRoZXJlIGlzIGEgZ3JhcGhpY3MgY2FyZCBwcmVzZW50LgpAQCAtMTAyMCwxNCArMTAxOSwxNCBAQAogCWNoYXIgKmNoYXJtYXA7CiAJCiAJaWYgKHZnYV92aWRlb190eXBlICE9IFZJREVPX1RZUEVfRUdBTSkgewotCQljaGFybWFwID0gKGNoYXIgKikgVkdBX01BUF9NRU0oY29sb3VybWFwKTsKKwkJY2hhcm1hcCA9IChjaGFyICopIFZHQV9NQVBfTUVNKGNvbG91cm1hcCwgMCk7CiAJCWJlZyA9IDB4MGU7CiAjaWZkZWYgVkdBX0NBTl9ET182NEtCCiAJCWlmICh2Z2FfdmlkZW9fdHlwZSA9PSBWSURFT19UWVBFX1ZHQUMpCiAJCQliZWcgPSAweDA2OwogI2VuZGlmCiAJfSBlbHNlIHsKLQkJY2hhcm1hcCA9IChjaGFyICopIFZHQV9NQVBfTUVNKGJsYWNrd21hcCk7CisJCWNoYXJtYXAgPSAoY2hhciAqKSBWR0FfTUFQX01FTShibGFja3dtYXAsIDApOwogCQliZWcgPSAweDBhOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9mYnN5c2ZzLmMgYi9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYwppbmRleCAzNGUwNzM5Li4zY2ViOGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL2Zic3lzZnMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKioKICAqIGZyYW1lYnVmZmVyX2FsbG9jIC0gY3JlYXRlcyBhIG5ldyBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3R1cmUKQEAgLTU1LDYgKzU2LDEwIEBACiAKIAlpbmZvLT5kZXZpY2UgPSBkZXY7CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisJbXV0ZXhfaW5pdCgmaW5mby0+YmxfbXV0ZXgpOworI2VuZGlmCisKIAlyZXR1cm4gaW5mbzsKICN1bmRlZiBQQURESU5HCiAjdW5kZWYgQllURVNfUEVSX0xPTkcKQEAgLTQxNCw2ICs0MTksNjUgQEAKIAlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgZmJfaW5mby0+c3RhdGUpOwogfQogCisjaWZkZWYgQ09ORklHX0ZCX0JBQ0tMSUdIVAorc3RhdGljIHNzaXplX3Qgc3RvcmVfYmxfY3VydmUoc3RydWN0IGNsYXNzX2RldmljZSAqY2xhc3NfZGV2aWNlLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJdTggdG1wX2N1cnZlW0ZCX0JBQ0tMSUdIVF9MRVZFTFNdOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKGNvdW50ICE9IChGQl9CQUNLTElHSFRfTEVWRUxTIC8gOCAqIDI0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLyA4KTsgKytpKQorCQlpZiAoc3NjYW5mKCZidWZbaSAqIDI0XSwKKwkJCSIlMmhoeCAlMmhoeCAlMmhoeCAlMmhoeCAlMmhoeCAlMmhoeCAlMmhoeCAlMmhoeFxuIiwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyAwXSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyAxXSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyAyXSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyAzXSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyA0XSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyA1XSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyA2XSwKKwkJCSZ0bXBfY3VydmVbaSAqIDggKyA3XSkgIT0gOCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJLyogSWYgdGhlcmUgaGFzIGJlZW4gYW4gZXJyb3IgaW4gdGhlIGlucHV0IGRhdGEsIHdlIHdvbid0CisJICogcmVhY2ggdGhpcyBsb29wLgorCSAqLworCW11dGV4X2xvY2soJmZiX2luZm8tPmJsX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgRkJfQkFDS0xJR0hUX0xFVkVMUzsgKytpKQorCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpXSA9IHRtcF9jdXJ2ZVtpXTsKKwltdXRleF91bmxvY2soJmZiX2luZm8tPmJsX211dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19ibF9jdXJ2ZShzdHJ1Y3QgY2xhc3NfZGV2aWNlICpjbGFzc19kZXZpY2UsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbyA9IGNsYXNzX2dldF9kZXZkYXRhKGNsYXNzX2RldmljZSk7CisJc3NpemVfdCBsZW4gPSAwOworCXVuc2lnbmVkIGludCBpOworCisJbXV0ZXhfbG9jaygmZmJfaW5mby0+YmxfbXV0ZXgpOworCWZvciAoaSA9IDA7IGkgPCBGQl9CQUNLTElHSFRfTEVWRUxTOyBpICs9IDgpCisJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sIFBBR0VfU0laRSwKKwkJCQkiJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyAwXSwKKwkJCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpICsgMV0sCisJCQkJZmJfaW5mby0+YmxfY3VydmVbaSArIDJdLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyAzXSwKKwkJCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpICsgNF0sCisJCQkJZmJfaW5mby0+YmxfY3VydmVbaSArIDVdLAorCQkJCWZiX2luZm8tPmJsX2N1cnZlW2kgKyA2XSwKKwkJCQlmYl9pbmZvLT5ibF9jdXJ2ZVtpICsgN10pOworCW11dGV4X3VubG9jaygmZmJfaW5mby0+YmxfbXV0ZXgpOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCiAvKiBXaGVuIGNtYXAgaXMgYWRkZWQgYmFjayBpbiBpdCBzaG91bGQgYmUgYSBiaW5hcnkgYXR0cmlidXRlCiAgKiBub3QgYSB0ZXh0IG9uZS4gQ29uc2lkZXJhdGlvbiBzaG91bGQgYWxzbyBiZSBnaXZlbiB0byBjb252ZXJ0aW5nCiAgKiBmYmRldiB0byB1c2UgY29uZmlnZnMgaW5zdGVhZCBvZiBzeXNmcyAqLwpAQCAtNDMyLDYgKzQ5Niw5IEBACiAJX19BVFRSKGNvbl9yb3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19jb25fcm90YXRlLCBzdG9yZV9jb25fcm90YXRlKSwKIAlfX0FUVFIoY29uX3JvdGF0ZV9hbGwsIFNfSVdVU1IsIE5VTEwsIHN0b3JlX2Nvbl9yb3RhdGVfYWxsKSwKIAlfX0FUVFIoc3RhdGUsIFNfSVJVR098U19JV1VTUiwgc2hvd19mYnN0YXRlLCBzdG9yZV9mYnN0YXRlKSwKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisJX19BVFRSKGJsX2N1cnZlLCBTX0lSVUdPfFNfSVdVU1IsIHNob3dfYmxfY3VydmUsIHN0b3JlX2JsX2N1cnZlKSwKKyNlbmRpZgogfTsKIAogaW50IGZiX2luaXRfY2xhc3NfZGV2aWNlKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKQpAQCAtNDU0LDQgKzUyMSwyNSBAQAogCQkJCQkgJmNsYXNzX2RldmljZV9hdHRyc1tpXSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisvKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGxpbmVhciBiYWNrbGlnaHQgY3VydmUKKyAqCisgKiAgICAgMDogb2ZmCisgKiAgIDEtNzogbWluCisgKiA4LTEyNzogbGluZWFyIGZyb20gbWluIHRvIG1heAorICovCit2b2lkIGZiX2JsX2RlZmF1bHRfY3VydmUoc3RydWN0IGZiX2luZm8gKmZiX2luZm8sIHU4IG9mZiwgdTggbWluLCB1OCBtYXgpCit7CisJdW5zaWduZWQgaW50IGksIGZsYXQsIGNvdW50LCByYW5nZSA9IChtYXggLSBtaW4pOwogCisJZmJfaW5mby0+YmxfY3VydmVbMF0gPSBvZmY7CisKKwlmb3IgKGZsYXQgPSAxOyBmbGF0IDwgKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLyAxNik7ICsrZmxhdCkKKwkJZmJfaW5mby0+YmxfY3VydmVbZmxhdF0gPSBtaW47CisKKwljb3VudCA9IEZCX0JBQ0tMSUdIVF9MRVZFTFMgKiAxNSAvIDE2OworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQorCQlmYl9pbmZvLT5ibF9jdXJ2ZVtmbGF0ICsgaV0gPSBtaW4gKyAocmFuZ2UgKiAoaSArIDEpIC8gY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmJfYmxfZGVmYXVsdF9jdXJ2ZSk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaWdhZmIuYyBiL2RyaXZlcnMvdmlkZW8vaWdhZmIuYwppbmRleCA2Yjg4MDUwLi44YTBjMmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2lnYWZiLmMKKysrIGIvZHJpdmVycy92aWRlby9pZ2FmYi5jCkBAIC0yMzIsOSArMjMyLDYgQEAKIAogCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CiAKLQkvKiBUbyBzdG9wIHRoZSBzd2FwcGVyIGZyb20gZXZlbiBjb25zaWRlcmluZyB0aGVzZSBwYWdlcy4gKi8KLQl2bWEtPnZtX2ZsYWdzIHw9IChWTV9TSE0gfCBWTV9MT0NLRUQpOwotCiAJLyogRWFjaCBwYWdlLCBzZWUgd2hpY2ggbWFwIGFwcGxpZXMgKi8KIAlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgc2l6ZTsgKSB7CiAJCW1hcF9zaXplID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmggYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYi5oCmluZGV4IDQ2OWIwNmMuLmUyOTBkNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiLmgKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmIuaApAQCAtMjM3LDcgKzIzNyw3IEBACiAJdTMyIGZiX3N0YXJ0OwogCiAJLyogcmluZyBidWZmZXIgKi8KLQl1OCBfX2lvbWVtICpyaW5nX2hlYWQ7CisJdTMyIHJpbmdfaGVhZDsKIAl1MzIgcmluZ190YWlsOwogCXUzMiByaW5nX3RhaWxfbWFzazsKIAl1MzIgcmluZ19zcGFjZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmRydi5jCmluZGV4IDA3NmZhNTYuLjBhMGE4YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiZHJ2LmMKKysrIGIvZHJpdmVycy92aWRlby9pbnRlbGZiL2ludGVsZmJkcnYuYwpAQCAtNzA3LDcgKzcwNyw3IEBACiAJCQkrIChkaW5mby0+cmluZy5vZmZzZXQgPDwgMTIpOwogCQlkaW5mby0+cmluZy52aXJ0dWFsICA9IGRpbmZvLT5hcGVydHVyZS52aXJ0dWFsCiAJCQkrIChkaW5mby0+cmluZy5vZmZzZXQgPDwgMTIpOwotCQlkaW5mby0+cmluZ19oZWFkID0gZGluZm8tPnJpbmcudmlydHVhbDsKKwkJZGluZm8tPnJpbmdfaGVhZCA9IDA7CiAJfQogCWlmIChkaW5mby0+aHdjdXJzb3IpIHsKIAkJYWdwX21lbXR5cGUgPSBkaW5mby0+bW9iaWxlID8gQUdQX1BIWVNJQ0FMX01FTU9SWQpAQCAtNzY2LDE4ICs3NjYsMTggQEAKIAlpZiAobXRycikKIAkJc2V0X210cnIoZGluZm8pOwogCi0JREJHX01TRygiZmI6IDB4JXgoKyAweCV4KS8weCV4ICgweCV4KVxuIiwKKwlEQkdfTVNHKCJmYjogMHgleCgrIDB4JXgpLzB4JXggKDB4JXApXG4iLAogCQlkaW5mby0+ZmIucGh5c2ljYWwsIGRpbmZvLT5mYi5vZmZzZXQsIGRpbmZvLT5mYi5zaXplLAotCQkodTMyIF9faW9tZW0gKSBkaW5mby0+ZmIudmlydHVhbCk7Ci0JREJHX01TRygiTU1JTzogMHgleC8weCV4ICgweCV4KVxuIiwKKwkJZGluZm8tPmZiLnZpcnR1YWwpOworCURCR19NU0coIk1NSU86IDB4JXgvMHgleCAoMHglcClcbiIsCiAJCWRpbmZvLT5tbWlvX2Jhc2VfcGh5cywgSU5URUxfUkVHX1NJWkUsCi0JCSh1MzIgX19pb21lbSkgZGluZm8tPm1taW9fYmFzZSk7Ci0JREJHX01TRygicmluZyBidWZmZXI6IDB4JXgvMHgleCAoMHgleClcbiIsCisJCWRpbmZvLT5tbWlvX2Jhc2UpOworCURCR19NU0coInJpbmcgYnVmZmVyOiAweCV4LzB4JXggKDB4JXApXG4iLAogCQlkaW5mby0+cmluZy5waHlzaWNhbCwgZGluZm8tPnJpbmcuc2l6ZSwKLQkJKHUzMiBfX2lvbWVtICkgZGluZm8tPnJpbmcudmlydHVhbCk7Ci0JREJHX01TRygiSFcgY3Vyc29yOiAweCV4LzB4JXggKDB4JXgpIChvZmZzZXQgMHgleCkgKHBoeXMgMHgleClcbiIsCisJCWRpbmZvLT5yaW5nLnZpcnR1YWwpOworCURCR19NU0coIkhXIGN1cnNvcjogMHgleC8weCV4ICgweCVwKSAob2Zmc2V0IDB4JXgpIChwaHlzIDB4JXgpXG4iLAogCQlkaW5mby0+Y3Vyc29yLnBoeXNpY2FsLCBkaW5mby0+Y3Vyc29yLnNpemUsCi0JCSh1MzIgX19pb21lbSApIGRpbmZvLT5jdXJzb3IudmlydHVhbCwgZGluZm8tPmN1cnNvci5vZmZzZXQsCisJCWRpbmZvLT5jdXJzb3IudmlydHVhbCwgZGluZm8tPmN1cnNvci5vZmZzZXQsCiAJCWRpbmZvLT5jdXJzb3IucGh5c2ljYWwpOwogCiAJREJHX01TRygib3B0aW9uczogdnJhbSA9ICVkLCBhY2NlbCA9ICVkLCBod2N1cnNvciA9ICVkLCBmaXhlZCA9ICVkLCAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKaW5kZXggNDI2Yjc0MzAuLjc1MzNiM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vaW50ZWxmYi9pbnRlbGZiaHcuYworKysgYi9kcml2ZXJzL3ZpZGVvL2ludGVsZmIvaW50ZWxmYmh3LmMKQEAgLTE0MjMsMTkgKzE0MjMsMTcgQEAKIAogCWVuZCA9IGppZmZpZXMgKyAoSFogKiAzKTsKIAl3aGlsZSAoZGluZm8tPnJpbmdfc3BhY2UgPCBuKSB7Ci0JCWRpbmZvLT5yaW5nX2hlYWQgPSAodTggX19pb21lbSAqKShJTlJFRyhQUklfUklOR19IRUFEKSAmCi0JCQkJCQkgICBSSU5HX0hFQURfTUFTSyk7Ci0JCWlmIChkaW5mby0+cmluZ190YWlsICsgUklOR19NSU5fRlJFRSA8Ci0JCSAgICAodTMyIF9faW9tZW0pIGRpbmZvLT5yaW5nX2hlYWQpCi0JCQlkaW5mby0+cmluZ19zcGFjZSA9ICh1MzIgX19pb21lbSkgZGluZm8tPnJpbmdfaGVhZAorCQlkaW5mby0+cmluZ19oZWFkID0gSU5SRUcoUFJJX1JJTkdfSEVBRCkgJiBSSU5HX0hFQURfTUFTSzsKKwkJaWYgKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFIDwgZGluZm8tPnJpbmdfaGVhZCkKKwkJCWRpbmZvLT5yaW5nX3NwYWNlID0gZGluZm8tPnJpbmdfaGVhZAogCQkJCS0gKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFKTsKIAkJZWxzZQogCQkJZGluZm8tPnJpbmdfc3BhY2UgPSAoZGluZm8tPnJpbmcuc2l6ZSArCi0JCQkJCSAgICAgKHUzMiBfX2lvbWVtKSBkaW5mby0+cmluZ19oZWFkKQorCQkJCQkgICAgIGRpbmZvLT5yaW5nX2hlYWQpCiAJCQkJLSAoZGluZm8tPnJpbmdfdGFpbCArIFJJTkdfTUlOX0ZSRUUpOwotCQlpZiAoKHUzMiBfX2lvbWVtKSBkaW5mby0+cmluZ19oZWFkICE9IGxhc3RfaGVhZCkgeworCQlpZiAoZGluZm8tPnJpbmdfaGVhZCAhPSBsYXN0X2hlYWQpIHsKIAkJCWVuZCA9IGppZmZpZXMgKyAoSFogKiAzKTsKLQkJCWxhc3RfaGVhZCA9ICh1MzIgX19pb21lbSkgZGluZm8tPnJpbmdfaGVhZDsKKwkJCWxhc3RfaGVhZCA9IGRpbmZvLT5yaW5nX2hlYWQ7CiAJCX0KIAkJaSsrOwogCQlpZiAodGltZV9iZWZvcmUoZW5kLCBqaWZmaWVzKSkgewpAQCAtMTQ5NSwxNSArMTQ5MywxMyBAQAogCURCR19NU0coInJlZnJlc2hfcmluZ1xuIik7CiAjZW5kaWYKIAotCWRpbmZvLT5yaW5nX2hlYWQgPSAodTggX19pb21lbSAqKSAoSU5SRUcoUFJJX1JJTkdfSEVBRCkgJgotCQkJCQkgICBSSU5HX0hFQURfTUFTSyk7CisJZGluZm8tPnJpbmdfaGVhZCA9IElOUkVHKFBSSV9SSU5HX0hFQUQpICYgUklOR19IRUFEX01BU0s7CiAJZGluZm8tPnJpbmdfdGFpbCA9IElOUkVHKFBSSV9SSU5HX1RBSUwpICYgUklOR19UQUlMX01BU0s7Ci0JaWYgKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFIDwgKHUzMiBfX2lvbWVtKWRpbmZvLT5yaW5nX2hlYWQpCi0JCWRpbmZvLT5yaW5nX3NwYWNlID0gKHUzMiBfX2lvbWVtKSBkaW5mby0+cmluZ19oZWFkCisJaWYgKGRpbmZvLT5yaW5nX3RhaWwgKyBSSU5HX01JTl9GUkVFIDwgZGluZm8tPnJpbmdfaGVhZCkKKwkJZGluZm8tPnJpbmdfc3BhY2UgPSBkaW5mby0+cmluZ19oZWFkCiAJCQktIChkaW5mby0+cmluZ190YWlsICsgUklOR19NSU5fRlJFRSk7CiAJZWxzZQotCQlkaW5mby0+cmluZ19zcGFjZSA9IChkaW5mby0+cmluZy5zaXplICsKLQkJCQkgICAgICh1MzIgX19pb21lbSkgZGluZm8tPnJpbmdfaGVhZCkKKwkJZGluZm8tPnJpbmdfc3BhY2UgPSAoZGluZm8tPnJpbmcuc2l6ZSArIGRpbmZvLT5yaW5nX2hlYWQpCiAJCQktIChkaW5mby0+cmluZ190YWlsICsgUklOR19NSU5fRlJFRSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYyBiL2RyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiX2Jhc2UuYwppbmRleCAyM2MxODI3Li5mNGRkZDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL21hdHJveC9tYXRyb3hmYl9iYXNlLmMKKysrIGIvZHJpdmVycy92aWRlby9tYXRyb3gvbWF0cm94ZmJfYmFzZS5jCkBAIC0xMDIsNiArMTAyLDggQEAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKKyNkZWZpbmUgX19PTERfVklESU9DXworCiAjaW5jbHVkZSAibWF0cm94ZmJfYmFzZS5oIgogI2luY2x1ZGUgIm1hdHJveGZiX21pc2MuaCIKICNpbmNsdWRlICJtYXRyb3hmYl9hY2NlbC5oIgpAQCAtMTU4LDkgKzE2MCw5IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhhdCBkaXNwbGF5cyBhcmUgY29tcGF0aWJsZSAqLwogCWlmIChpbmZvICYmIChpbmZvLT5mYmNvbi52YXIuYml0c19wZXJfcGl4ZWwgPT0gQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmJpdHNfcGVyX3BpeGVsKQotCSAgICAgICAgICYmIChpbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsID09IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci54cmVzX3ZpcnR1YWwpCi0JICAgICAgICAgJiYgKGluZm8tPmZiY29uLnZhci5ncmVlbi5sZW5ndGggPT0gQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmdyZWVuLmxlbmd0aCkKLQkgICAgICAgICApIHsKKwkJICYmIChpbmZvLT5mYmNvbi52YXIueHJlc192aXJ0dWFsID09IEFDQ0VTU19GQklORk8oZmJjb24pLnZhci54cmVzX3ZpcnR1YWwpCisJCSAmJiAoaW5mby0+ZmJjb24udmFyLmdyZWVuLmxlbmd0aCA9PSBBQ0NFU1NfRkJJTkZPKGZiY29uKS52YXIuZ3JlZW4ubGVuZ3RoKQorCQkgKSB7CiAJCXN3aXRjaCAoQUNDRVNTX0ZCSU5GTyhmYmNvbikudmFyLmJpdHNfcGVyX3BpeGVsKSB7CiAJCQljYXNlIDE2OgogCQkJY2FzZSAzMjoKQEAgLTIyNCw3ICsyMjYsNyBAQAogCiBpbnQgbWF0cm94ZmJfZW5hYmxlX2lycShXUE1JTkZPIGludCByZWVuYWJsZSkgewogCXVfaW50MzJfdCBibTsKLQkKKwogCWlmIChBQ0NFU1NfRkJJTkZPKGRldmZsYWdzLmFjY2VsZXJhdG9yKSA9PSBGQl9BQ0NFTF9NQVRST1hfTUdBRzQwMCkKIAkJYm0gPSAweDIyMDsKIAllbHNlCkBAIC0yNDEsNyArMjQzLDcgQEAKIAkJbWdhX291dGwoTV9JRU4sIG1nYV9pbmwoTV9JRU4pIHwgYm0pOwogCX0gZWxzZSBpZiAocmVlbmFibGUpIHsKIAkJdV9pbnQzMl90IGllbjsKLQkJCisKIAkJaWVuID0gbWdhX2lubChNX0lFTik7CiAJCWlmICgoaWVuICYgYm0pICE9IGJtKSB7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAibWF0cm94ZmI6IHNvbWVvbmUgZGlzYWJsZWQgSVJRIFslMDhYXVxuIiwgaWVuKTsKQEAgLTM0Nyw3ICszNDksNyBAQAogCQltZ2Ffc2V0cihNX0VYVFZHQV9JTkRFWCwgMHgwMCwgcDIpOwogCX0KIAltYXRyb3hmYl9EQUNfdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MpOwotCQorCiAJdXBkYXRlX2NydGMyKFBNSU5GTyBwb3MpOwogCiAJQ1JJVEVORApAQCAtMzkwLDcgKzM5Miw3IEBACiBzdGF0aWMgaW50IG1hdHJveGZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQogewogCU1JTkZPX0ZST01fSU5GTyhpbmZvKTsKLQkKKwogCURCR19MT09QKF9fRlVOQ1RJT05fXykKIAogCWlmIChBQ0NFU1NfRkJJTkZPKGRlYWQpKSB7CkBAIC00MDYsNyArNDA4LDcgQEAKIHN0YXRpYyBpbnQgbWF0cm94ZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCiB7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwotCQorCiAJREJHX0xPT1AoX19GVU5DVElPTl9fKQogCiAJaWYgKHVzZXIpIHsKQEAgLTg1NCw3ICs4NTYsNyBAQAogCQl2YmxhbmstPmZsYWdzIHw9IEZCX1ZCTEFOS19WQkxBTktJTkc7CiAJaWYgKHRlc3RfYml0KDAsICZBQ0NFU1NfRkJJTkZPKGlycV9mbGFncykpKSB7CiAJCXZibGFuay0+ZmxhZ3MgfD0gRkJfVkJMQU5LX0hBVkVfQ09VTlQ7Ci0JCS8qIE9ubHkgb25lIHdyaXRlciwgYWxpZ25lZCBpbnQgdmFsdWUuLi4gCisJCS8qIE9ubHkgb25lIHdyaXRlciwgYWxpZ25lZCBpbnQgdmFsdWUuLi4KIAkJICAgaXQgc2hvdWxkIHdvcmsgd2l0aG91dCBsb2NrIGFuZCB3aXRob3V0IGF0b21pY190ICovCiAJCXZibGFuay0+Y291bnQgPSBBQ0NFU1NfRkJJTkZPKGNydGMxKS52c3luYy5jbnQ7CiAJfQpAQCAtODcwLDcgKzg3Miw3IEBACiB7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJTUlORk9fRlJPTV9JTkZPKGluZm8pOwotCQorCiAJREJHKF9fRlVOQ1RJT05fXykKIAogCWlmIChBQ0NFU1NfRkJJTkZPKGRlYWQpKSB7CkBAIC0xMDgxLDcgKzEwODMsNyBAQAogCQljYXNlIFZJRElPQ19RVUVSWUNBUDoKIAkJCXsKIAkJCQlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IHI7Ci0JCQkJCisKIAkJCQltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CiAJCQkJc3RyY3B5KHIuZHJpdmVyLCAibWF0cm94ZmIiKTsKIAkJCQlzdHJjcHkoci5jYXJkLCAiTWF0cm94Iik7CkBAIC0xMDkxLDcgKzEwOTMsNyBAQAogCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnIsIHNpemVvZihyKSkpCiAJCQkJCXJldHVybiAtRUZBVUxUOwogCQkJCXJldHVybiAwOwotCQkJCQorCiAJCQl9CiAJCWNhc2UgVklESU9DX1FVRVJZQ1RSTDoKIAkJCXsKQEAgLTE2OTAsOCArMTY5Miw4IEBACiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChBQ0NFU1NfRkJJTkZPKHBjaWRldiksIFBDSV9DT01NQU5ELCAmY21kKTsKIAkJbWdhX29wdGlvbiAmPSAweDdGRkZGRkZGOyAvKiBjbGVhciBCSUdfRU5ESUFOICovCiAJCW1nYV9vcHRpb24gfD0gTVhfT1BUSU9OX0JTV0FQOwotICAgICAgICAgICAgICAgIC8qIGRpc2FibGUgcGFsZXR0ZSBzbm9vcGluZyAqLwotICAgICAgICAgICAgICAgIGNtZCAmPSB+UENJX0NPTU1BTkRfVkdBX1BBTEVUVEU7CisJCS8qIGRpc2FibGUgcGFsZXR0ZSBzbm9vcGluZyAqLworCQljbWQgJj0gflBDSV9DT01NQU5EX1ZHQV9QQUxFVFRFOwogCQlpZiAocGNpX2Rldl9wcmVzZW50KGludGVsXzgyNDM3KSkgewogCQkJaWYgKCEobWdhX29wdGlvbiAmIDB4MjAwMDAwMDApICYmICFBQ0NFU1NfRkJJTkZPKGRldmZsYWdzLm5vcGNpcmV0cnkpKSB7CiAJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibWF0cm94ZmI6IERpc2FibGluZyBQQ0kgcmV0cmllcyBkdWUgdG8gaTgyNDM3IHByZXNlbnRcbiIpOwpAQCAtMTgwOSwxMiArMTgxMSwxMiBAQAogCiAJCWlmIChmdikgewogCQkJdG1wID0gZnYgKiAodmVzYWZiX2RlZmluZWQudXBwZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQueXJlcwotCQkJICAgICAgICAgICsgdmVzYWZiX2RlZmluZWQubG93ZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQudnN5bmNfbGVuKTsKKwkJCQkgICsgdmVzYWZiX2RlZmluZWQubG93ZXJfbWFyZ2luICsgdmVzYWZiX2RlZmluZWQudnN5bmNfbGVuKTsKIAkJCWlmICgodG1wIDwgZmgpIHx8IChmaCA9PSAwKSkgZmggPSB0bXA7CiAJCX0KIAkJaWYgKGZoKSB7CiAJCQl0bXAgPSBmaCAqICh2ZXNhZmJfZGVmaW5lZC5sZWZ0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLnhyZXMKLQkJCSAgICAgICAgICArIHZlc2FmYl9kZWZpbmVkLnJpZ2h0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLmhzeW5jX2xlbik7CisJCQkJICArIHZlc2FmYl9kZWZpbmVkLnJpZ2h0X21hcmdpbiArIHZlc2FmYl9kZWZpbmVkLmhzeW5jX2xlbik7CiAJCQlpZiAoKHRtcCA8IG1heGNsaykgfHwgKG1heGNsayA9PSAwKSkgbWF4Y2xrID0gdG1wOwogCQl9CiAJCXRtcCA9IChtYXhjbGsgKyA0OTkpIC8gNTAwOwpAQCAtMTg5MCwxNCArMTg5MiwxNCBAQAogCiAJLyogdGhlcmUgaXMgbm8gY29uc29sZSBvbiB0aGlzIGZiLi4uIGJ1dCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgaGFyZHdhcmUKIAkgKiB1bnRpbCBzb21lb25lIHRlbGxzIG1lIHdoYXQgaXMgcHJvcGVyIHRoaW5nIHRvIGRvICovCi0gCWlmICghQUNDRVNTX0ZCSU5GTyhpbml0aWFsaXplZCkpIHsKLSAJCXByaW50ayhLRVJOX0lORk8gImZiJWQ6IGluaXRpYWxpemluZyBoYXJkd2FyZVxuIiwKLSAJCSAgICAgICBBQ0NFU1NfRkJJTkZPKGZiY29uLm5vZGUpKTsKLSAJCS8qIFdlIGhhdmUgdG8gdXNlIEZCX0FDVElWQVRFX0ZPUkNFLCBhcyB3ZSBoYWQgdG8gcHV0IHZlc2FmYl9kZWZpbmVkIHRvIHRoZSBmYmNvbi52YXIKLSAJCSAqIGFscmVhZHkgYmVmb3JlLCBzbyByZWdpc3Rlcl9mcmFtZWJ1ZmZlciB3b3JrcyBjb3JyZWN0bHkuICovCi0gCQl2ZXNhZmJfZGVmaW5lZC5hY3RpdmF0ZSB8PSBGQl9BQ1RJVkFURV9GT1JDRTsKLSAJCWZiX3NldF92YXIoJkFDQ0VTU19GQklORk8oZmJjb24pLCAmdmVzYWZiX2RlZmluZWQpOwotIAl9CisJaWYgKCFBQ0NFU1NfRkJJTkZPKGluaXRpYWxpemVkKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJmYiVkOiBpbml0aWFsaXppbmcgaGFyZHdhcmVcbiIsCisJCSAgICAgICBBQ0NFU1NfRkJJTkZPKGZiY29uLm5vZGUpKTsKKwkJLyogV2UgaGF2ZSB0byB1c2UgRkJfQUNUSVZBVEVfRk9SQ0UsIGFzIHdlIGhhZCB0byBwdXQgdmVzYWZiX2RlZmluZWQgdG8gdGhlIGZiY29uLnZhcgorCQkgKiBhbHJlYWR5IGJlZm9yZSwgc28gcmVnaXN0ZXJfZnJhbWVidWZmZXIgd29ya3MgY29ycmVjdGx5LiAqLworCQl2ZXNhZmJfZGVmaW5lZC5hY3RpdmF0ZSB8PSBGQl9BQ1RJVkFURV9GT1JDRTsKKwkJZmJfc2V0X3ZhcigmQUNDRVNTX0ZCSU5GTyhmYmNvbiksICZ2ZXNhZmJfZGVmaW5lZCk7CisJfQogCiAJcmV0dXJuIDA7CiBmYWlsVmlkZW9JTzo7CkBAIC0yMzU2LDcgKzIzNTgsNyBAQAogCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImRmcDoiLCA0KSkgewogCQkJZGZwX3R5cGUgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs0LCBOVUxMLCAwKTsKIAkJCWRmcCA9IDE7Ci0JCX0JCisJCX0KICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2bW9kZToiLCA2KSkgewogCQkJdW5zaWduZWQgaW50IHZtb2RlID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNiwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL01ha2VmaWxlCmluZGV4IDY5MGQzN2UuLmNhNDc0MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL01ha2VmaWxlCkBAIC03LDYgKzcsNyBAQAogbnZpZGlhZmIteSAgICAgICAgICAgICAgICAgICAgICAgOj0gbnZpZGlhLm8gbnZfaHcubyBudl9zZXR1cC5vIFwKIAkJCSAgICAgICAgICAgIG52X2FjY2VsLm8KIG52aWRpYWZiLSQoQ09ORklHX0ZCX05WSURJQV9JMkMpICs9IG52X2kyYy5vCitudmlkaWFmYi0kKENPTkZJR19GQl9OVklESUFfQkFDS0xJR0hUKSAgKz0gbnZfYmFja2xpZ2h0Lm8KIG52aWRpYWZiLSQoQ09ORklHX1BQQ19PRikJICs9IG52X29mLm8KIAotbnZpZGlhZmItb2JqcyAgICAgICAgICAgICAgICAgICAgOj0gJChudmlkaWFmYi15KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK252aWRpYWZiLW9ianMgICAgICAgICAgICAgICAgICAgIDo9ICQobnZpZGlhZmIteSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2JhY2tsaWdodC5jIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfYmFja2xpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxYzEwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X2JhY2tsaWdodC5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQmFja2xpZ2h0IGNvZGUgZm9yIG5WaWRpYSBiYXNlZCBncmFwaGljIGNhcmRzCisgKgorICogQ29weXJpZ2h0IDIwMDQgQW50b25pbm8gRGFwbGFzIDxhZGFwbGFzQHBvbC5uZXQ+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBIYW5zZWxtYW5uIDxsaW51eC1rZXJuZWxAaGFuc21pLmNoPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSAibnZfbG9jYWwuaCIKKyNpbmNsdWRlICJudl90eXBlLmgiCisjaW5jbHVkZSAibnZfcHJvdG8uaCIKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2VuZGlmCisKKy8qIFdlIGRvIG5vdCBoYXZlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB2YWx1ZXMgYXJlIGFsbG93ZWQsIHRodXMKKyAqIHdlIHVzZWQgc2FmZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgTUlOX0xFVkVMIDB4MTU4CisjZGVmaW5lIE1BWF9MRVZFTCAweDUzNAorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIG52aWRpYV9ibF9kYXRhOworCitzdGF0aWMgaW50IG52aWRpYV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyLAorCQlpbnQgbGV2ZWwpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wY2lfZGV2KTsKKwlpbnQgbmxldmVsOworCisJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlubGV2ZWwgPSBpbmZvLT5ibF9jdXJ2ZVtsZXZlbF0gKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMOworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJaWYgKG5sZXZlbCA8IDApCisJCW5sZXZlbCA9IDA7CisJZWxzZSBpZiAobmxldmVsIDwgTUlOX0xFVkVMKQorCQlubGV2ZWwgPSBNSU5fTEVWRUw7CisJZWxzZSBpZiAobmxldmVsID4gTUFYX0xFVkVMKQorCQlubGV2ZWwgPSBNQVhfTEVWRUw7CisKKwlyZXR1cm4gbmxldmVsOworfQorCitzdGF0aWMgaW50IG52aWRpYV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOworCXUzMiB0bXBfcGNydCwgdG1wX3BtYywgZnBjb250cm9sOworCWludCBsZXZlbDsKKworCWlmICghcGFyLT5GbGF0UGFuZWwpCisJCXJldHVybiAwOworCisJaWYgKGJkLT5wcm9wcy0+cG93ZXIgIT0gRkJfQkxBTktfVU5CTEFOSyB8fAorCSAgICBiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCisJCWxldmVsID0gMDsKKwllbHNlCisJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOworCisJdG1wX3BtYyA9IE5WX1JEMzIocGFyLT5QTUMsIDB4MTBGMCkgJiAweDAwMDBGRkZGOworCXRtcF9wY3J0ID0gTlZfUkQzMihwYXItPlBDUlRDMCwgMHgwODFDKSAmIDB4RkZGRkZGRkM7CisJZnBjb250cm9sID0gTlZfUkQzMihwYXItPlBSQU1EQUMsIDB4MDg0OCkgJiAweENGRkZGRkNDOworCisJaWYgKGxldmVsID4gMCkgeworCQl0bXBfcGNydCB8PSAweDE7CisJCXRtcF9wbWMgfD0gKDEgPDwgMzEpOyAvKiBiYWNrbGlnaHQgYml0ICovCisJCXRtcF9wbWMgfD0gbnZpZGlhX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IDE2OworCQlmcGNvbnRyb2wgfD0gcGFyLT5mcFN5bmNzOworCX0gZWxzZQorCQlmcGNvbnRyb2wgfD0gMHgyMDAwMDAyMjsKKworCU5WX1dSMzIocGFyLT5QQ1JUQzAsIDB4MDgxQywgdG1wX3BjcnQpOworCU5WX1dSMzIocGFyLT5QTUMsIDB4MTBGMCwgdG1wX3BtYyk7CisJTlZfV1IzMihwYXItPlBSQU1EQUMsIDB4ODQ4LCBmcGNvbnRyb2wpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZpZGlhX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIG52aWRpYV9ibF9kYXRhID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSBudmlkaWFfYmxfZ2V0X2JyaWdodG5lc3MsCisJLnVwZGF0ZV9zdGF0dXMJPSBudmlkaWFfYmxfdXBkYXRlX3N0YXR1cywKKwkubWF4X2JyaWdodG5lc3MgPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAorfTsKKwordm9pZCBudmlkaWFfYmxfaW5pdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGNpX2Rldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOworCWNoYXIgbmFtZVsxMl07CisKKwlpZiAoIXBhci0+RmxhdFBhbmVsKQorCQlyZXR1cm47CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwlpZiAoIW1hY2hpbmVfaXMocG93ZXJtYWMpIHx8CisJICAgICFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgibW5jYSIpKQorCQlyZXR1cm47CisjZW5kaWYKKworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIm52aWRpYWJsJWQiLCBpbmZvLT5ub2RlKTsKKworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZudmlkaWFfYmxfZGF0YSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJaW5mby0+YmxfZGV2ID0gTlVMTDsKKwkJcHJpbnRrKCJudmlkaWE6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaW5mby0+YmxfZGV2ID0gYmQ7CisJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAorCQkweDE1OCAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfTEVWRUwsCisJCTB4NTM0ICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwl1cCgmYmQtPnNlbSk7CisJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gbnZpZGlhX2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CisJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CisJYmQtPnByb3BzLT51cGRhdGVfc3RhdHVzKGJkKTsKKwlkb3duKCZiZC0+c2VtKTsKKworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKwlpZiAoIXBtYWNfYmFja2xpZ2h0KQorCQlwbWFjX2JhY2tsaWdodCA9IGJkOworCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwlwcmludGsoIm52aWRpYTogQmFja2xpZ2h0IGluaXRpYWxpemVkICglcylcbiIsIG5hbWUpOworCisJcmV0dXJuOworCitlcnJvcjoKKwlyZXR1cm47Cit9CisKK3ZvaWQgbnZpZGlhX2JsX2V4aXQoc3RydWN0IG52aWRpYV9wYXIgKnBhcikKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBjaV9kZXYpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOworI2VuZGlmCisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaWYgKGluZm8tPmJsX2RldikgeworI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gaW5mby0+YmxfZGV2KQorCQkJcG1hY19iYWNrbGlnaHQgPSBOVUxMOworI2VuZGlmCisKKwkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmJsX2Rldik7CisKKwkJcHJpbnRrKCJudmlkaWE6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmggYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udl9wcm90by5oCmluZGV4IGIxNDlhNjkuLjZmYmE2NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vbnZpZGlhL252X3Byb3RvLmgKKysrIGIvZHJpdmVycy92aWRlby9udmlkaWEvbnZfcHJvdG8uaApAQCAtNjMsNCArNjMsMTQgQEAKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmJfaW1hZ2UgKmltYWdlKTsKIGV4dGVybiBpbnQgbnZpZGlhZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiBleHRlcm4gdTggYnl0ZV9yZXZbMjU2XTsKKworLyogaW4gbnZfYmFja2xpZ2h0LmggKi8KKyNpZmRlZiBDT05GSUdfRkJfTlZJRElBX0JBQ0tMSUdIVAorZXh0ZXJuIHZvaWQgbnZpZGlhX2JsX2luaXQoc3RydWN0IG52aWRpYV9wYXIgKnBhcik7CitleHRlcm4gdm9pZCBudmlkaWFfYmxfZXhpdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbnZpZGlhX2JsX2luaXQoc3RydWN0IG52aWRpYV9wYXIgKnBhcikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBudmlkaWFfYmxfZXhpdChzdHJ1Y3QgbnZpZGlhX3BhciAqcGFyKSB7fQorI2VuZGlmCisKICNlbmRpZgkJCQkvKiBfX05WX1BST1RPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9udmlkaWEvbnZpZGlhLmMgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwppbmRleCAwOTNhYjk5Li4wM2E3YzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYworKysgYi9kcml2ZXJzL3ZpZGVvL252aWRpYS9udmlkaWEuYwpAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2xpZ2h0Lmg+CiAjaWZkZWYgQ09ORklHX01UUlIKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2VuZGlmCkBAIC0yOSwxMCArMzAsNiBAQAogI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL3BjaS1icmlkZ2UuaD4KICNlbmRpZgotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL2JhY2tsaWdodC5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJudl9sb2NhbC5oIgogI2luY2x1ZGUgIm52X3R5cGUuaCIKQEAgLTQ3MCw3NSArNDY3LDYgQEAKIAkudm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECiB9OwogCi0vKgotICogQmFja2xpZ2h0IGNvbnRyb2wKLSAqLwotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCi1zdGF0aWMgaW50IG52aWRpYV9iYWNrbGlnaHRfbGV2ZWxzW10gPSB7Ci0JMHgxNTgsCi0JMHgxOTIsCi0JMHgxYzYsCi0JMHgyMDAsCi0JMHgyMzQsCi0JMHgyNjgsCi0JMHgyYTIsCi0JMHgyZDYsCi0JMHgzMTAsCi0JMHgzNDQsCi0JMHgzNzgsCi0JMHgzYjIsCi0JMHgzZTYsCi0JMHg0MWEsCi0JMHg0NTQsCi0JMHg1MzQsCi19OwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKLSAqCi0gKiBCYWNrbGlnaHQgb3BlcmF0aW9ucwotICoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotc3RhdGljIGludCBudmlkaWFfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG52aWRpYV9wYXIgKnBhciA9IGRhdGE7Ci0JdTMyIHRtcF9wY3J0LCB0bXBfcG1jLCBmcGNvbnRyb2w7Ci0KLQl0bXBfcG1jID0gTlZfUkQzMihwYXItPlBNQywgMHgxMEYwKSAmIDB4MDAwMEZGRkY7Ci0JdG1wX3BjcnQgPSBOVl9SRDMyKHBhci0+UENSVEMwLCAweDA4MUMpICYgMHhGRkZGRkZGQzsKLQlmcGNvbnRyb2wgPSBOVl9SRDMyKHBhci0+UFJBTURBQywgMHgwODQ4KSAmIDB4Q0ZGRkZGQ0M7Ci0KLQlpZiAob24gJiYgKGxldmVsID4gQkFDS0xJR0hUX09GRikpIHsKLQkJdG1wX3BjcnQgfD0gMHgxOwotCQl0bXBfcG1jIHw9ICgxIDw8IDMxKTsJLy8gYmFja2xpZ2h0IGJpdAotCQl0bXBfcG1jIHw9IG52aWRpYV9iYWNrbGlnaHRfbGV2ZWxzW2xldmVsIC0gMV0gPDwgMTY7Ci0JfQotCi0JaWYgKG9uKQotCQlmcGNvbnRyb2wgfD0gcGFyLT5mcFN5bmNzOwotCWVsc2UKLQkJZnBjb250cm9sIHw9IDB4MjAwMDAwMjI7Ci0KLQlOVl9XUjMyKHBhci0+UENSVEMwLCAweDA4MUMsIHRtcF9wY3J0KTsKLQlOVl9XUjMyKHBhci0+UE1DLCAweDEwRjAsIHRtcF9wbWMpOwotCU5WX1dSMzIocGFyLT5QUkFNREFDLCAweDg0OCwgZnBjb250cm9sKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG52aWRpYV9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gbnZpZGlhX3NldF9iYWNrbGlnaHRfZW5hYmxlKDEsIGxldmVsLCBkYXRhKTsKLX0KLQotc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciBudmlkaWFfYmFja2xpZ2h0X2NvbnRyb2xsZXIgPSB7Ci0JbnZpZGlhX3NldF9iYWNrbGlnaHRfZW5hYmxlLAotCW52aWRpYV9zZXRfYmFja2xpZ2h0X2xldmVsCi19OwotCi0jZW5kaWYJCQkJLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KIHN0YXRpYyB2b2lkIG52aWRpYWZiX2xvYWRfY3Vyc29yX2ltYWdlKHN0cnVjdCBudmlkaWFfcGFyICpwYXIsIHU4ICogZGF0YTgsCiAJCQkJICAgICAgIHUxNiBiZywgdTE2IGZnLCB1MzIgdywgdTMyIGgpCiB7CkBAIC0xMzU1LDEwICsxMjgzLDE1IEBACiAJTlZXcml0ZVNlcShwYXIsIDB4MDEsIHRtcCk7CiAJTlZXcml0ZUNydGMocGFyLCAweDFhLCB2ZXNhKTsKIAotI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAotCWlmIChwYXItPkZsYXRQYW5lbCAmJiBtYWNoaW5lX2lzKHBvd2VybWFjKSkgewotCQlzZXRfYmFja2xpZ2h0X2VuYWJsZSghYmxhbmspOworI2lmZGVmIENPTkZJR19GQl9OVklESUFfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCWlmIChpbmZvLT5ibF9kZXYpIHsKKwkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQlpbmZvLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IGJsYW5rOworCQlpbmZvLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CisJCXVwKCZpbmZvLT5ibF9kZXYtPnNlbSk7CiAJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwogI2VuZGlmCiAKIAlOVlRSQUNFX0xFQVZFKCk7CkBAIC0xNzQxLDExICsxNjc0LDkgQEAKIAkgICAgICAgIlBDSSBuVmlkaWEgJXMgZnJhbWVidWZmZXIgKCVkTUIgQCAweCVsWClcbiIsCiAJICAgICAgIGluZm8tPmZpeC5pZCwKIAkgICAgICAgcGFyLT5GYk1hcFNpemUgLyAoMTAyNCAqIDEwMjQpLCBpbmZvLT5maXguc21lbV9zdGFydCk7Ci0jaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCi0JaWYgKHBhci0+RmxhdFBhbmVsICYmIG1hY2hpbmVfaXMocG93ZXJtYWMpKQotCQlyZWdpc3Rlcl9iYWNrbGlnaHRfY29udHJvbGxlcigmbnZpZGlhX2JhY2tsaWdodF9jb250cm9sbGVyLAotCQkJCQkgICAgICBwYXIsICJtbmNhIik7Ci0jZW5kaWYKKworCW52aWRpYV9ibF9pbml0KHBhcik7CisKIAlOVlRSQUNFX0xFQVZFKCk7CiAJcmV0dXJuIDA7CiAKQEAgLTE3NzUsNiArMTcwNiw4IEBACiAKIAlOVlRSQUNFX0VOVEVSKCk7CiAKKwludmlkaWFfYmxfZXhpdChwYXIpOworCiAJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKICNpZmRlZiBDT05GSUdfTVRSUgogCWlmIChwYXItPm10cnIudnJhbV92YWxpZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vcml2YS9mYmRldi5jIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKaW5kZXggM2U5MzA4Zi4uZDQzODRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKKysrIGIvZHJpdmVycy92aWRlby9yaXZhL2ZiZGV2LmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9mYi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpZmRlZiBDT05GSUdfTVRSUgogI2luY2x1ZGUgPGFzbS9tdHJyLmg+CiAjZW5kaWYKQEAgLTI3MiwzNCArMjczLDE1NCBAQAogLyoKICAqIEJhY2tsaWdodCBjb250cm9sCiAgKi8KKyNpZmRlZiBDT05GSUdfRkJfUklWQV9CQUNLTElHSFQKKy8qIFdlIGRvIG5vdCBoYXZlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB3aGljaCB2YWx1ZXMgYXJlIGFsbG93ZWQsIHRodXMKKyAqIHdlIHVzZWQgc2FmZSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgTUlOX0xFVkVMIDB4MTU4CisjZGVmaW5lIE1BWF9MRVZFTCAweDUzNAorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHJpdmFfYmxfZGF0YTsKKworc3RhdGljIGludCByaXZhX2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCByaXZhX3BhciAqcGFyLAorCQlpbnQgbGV2ZWwpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKKwlpbnQgbmxldmVsOworCisJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlubGV2ZWwgPSBpbmZvLT5ibF9jdXJ2ZVtsZXZlbF0gKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMOworCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisJaWYgKG5sZXZlbCA8IDApCisJCW5sZXZlbCA9IDA7CisJZWxzZSBpZiAobmxldmVsIDwgTUlOX0xFVkVMKQorCQlubGV2ZWwgPSBNSU5fTEVWRUw7CisJZWxzZSBpZiAobmxldmVsID4gTUFYX0xFVkVMKQorCQlubGV2ZWwgPSBNQVhfTEVWRUw7CisKKwlyZXR1cm4gbmxldmVsOworfQorCitzdGF0aWMgaW50IHJpdmFfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJc3RydWN0IHJpdmFfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CisJVTAzMiB0bXBfcGNydCwgdG1wX3BtYzsKKwlpbnQgbGV2ZWw7CisKKwlpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CisJICAgIGJkLT5wcm9wcy0+ZmJfYmxhbmsgIT0gRkJfQkxBTktfVU5CTEFOSykKKwkJbGV2ZWwgPSAwOworCWVsc2UKKwkJbGV2ZWwgPSBiZC0+cHJvcHMtPmJyaWdodG5lc3M7CisKKwl0bXBfcG1jID0gcGFyLT5yaXZhLlBNQ1sweDEwRjAvNF0gJiAweDAwMDBGRkZGOworCXRtcF9wY3J0ID0gcGFyLT5yaXZhLlBDUlRDMFsweDA4MUMvNF0gJiAweEZGRkZGRkZDOworCWlmKGxldmVsID4gMCkgeworCQl0bXBfcGNydCB8PSAweDE7CisJCXRtcF9wbWMgfD0gKDEgPDwgMzEpOyAvKiBiYWNrbGlnaHQgYml0ICovCisJCXRtcF9wbWMgfD0gcml2YV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIGxldmVsKSA8PCAxNjsgLyogbGV2ZWwgKi8KKwl9CisJcGFyLT5yaXZhLlBDUlRDMFsweDA4MUMvNF0gPSB0bXBfcGNydDsKKwlwYXItPnJpdmEuUE1DWzB4MTBGMC80XSA9IHRtcF9wbWM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByaXZhX2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwlyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHJpdmFfYmxfZGF0YSA9IHsKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkuZ2V0X2JyaWdodG5lc3MgPSByaXZhX2JsX2dldF9icmlnaHRuZXNzLAorCS51cGRhdGVfc3RhdHVzCT0gcml2YV9ibF91cGRhdGVfc3RhdHVzLAorCS5tYXhfYnJpZ2h0bmVzcyA9IChGQl9CQUNLTElHSFRfTEVWRUxTIC0gMSksCit9OworCitzdGF0aWMgdm9pZCByaXZhX2JsX2luaXQoc3RydWN0IHJpdmFfcGFyICpwYXIpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJY2hhciBuYW1lWzEyXTsKKworCWlmICghcGFyLT5GbGF0UGFuZWwpCisJCXJldHVybjsKKwogI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAorCWlmICghbWFjaGluZV9pcyhwb3dlcm1hYykgfHwKKwkgICAgIXBtYWNfaGFzX2JhY2tsaWdodF90eXBlKCJtbmNhIikpCisJCXJldHVybjsKKyNlbmRpZgogCi1zdGF0aWMgaW50IHJpdmFfYmFja2xpZ2h0X2xldmVsc1tdID0gewotICAgIDB4MTU4LAotICAgIDB4MTkyLAotICAgIDB4MWM2LAotICAgIDB4MjAwLAotICAgIDB4MjM0LAotICAgIDB4MjY4LAotICAgIDB4MmEyLAotICAgIDB4MmQ2LAotICAgIDB4MzEwLAotICAgIDB4MzQ0LAotICAgIDB4Mzc4LAotICAgIDB4M2IyLAotICAgIDB4M2U2LAotICAgIDB4NDFhLAotICAgIDB4NDU0LAotICAgIDB4NTM0LAotfTsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJyaXZhYmwlZCIsIGluZm8tPm5vZGUpOwogCi1zdGF0aWMgaW50IHJpdmFfc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IG9uLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotc3RhdGljIGludCByaXZhX3NldF9iYWNrbGlnaHRfbGV2ZWwoaW50IGxldmVsLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X2NvbnRyb2xsZXIgcml2YV9iYWNrbGlnaHRfY29udHJvbGxlciA9IHsKLQlyaXZhX3NldF9iYWNrbGlnaHRfZW5hYmxlLAotCXJpdmFfc2V0X2JhY2tsaWdodF9sZXZlbAotfTsKLSNlbmRpZiAvKiBDT05GSUdfUE1BQ19CQUNLTElHSFQgKi8KKwliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIobmFtZSwgcGFyLCAmcml2YV9ibF9kYXRhKTsKKwlpZiAoSVNfRVJSKGJkKSkgeworCQlpbmZvLT5ibF9kZXYgPSBOVUxMOworCQlwcmludGsoInJpdmE6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisJaW5mby0+YmxfZGV2ID0gYmQ7CisJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAorCQkweDE1OCAqIEZCX0JBQ0tMSUdIVF9NQVggLyBNQVhfTEVWRUwsCisJCTB4NTM0ICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CisKKwl1cCgmYmQtPnNlbSk7CisJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gcml2YV9ibF9kYXRhLm1heF9icmlnaHRuZXNzOworCWJkLT5wcm9wcy0+cG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7CisJZG93bigmYmQtPnNlbSk7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisJaWYgKCFwbWFjX2JhY2tsaWdodCkKKwkJcG1hY19iYWNrbGlnaHQgPSBiZDsKKwltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKKyNlbmRpZgorCisJcHJpbnRrKCJyaXZhOiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CisKKwlyZXR1cm47CisKK2Vycm9yOgorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcml2YV9ibF9leGl0KHN0cnVjdCByaXZhX3BhciAqcGFyKQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKKwltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKKworCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKKwlpZiAoaW5mby0+YmxfZGV2KSB7CisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJCWlmIChwbWFjX2JhY2tsaWdodCA9PSBpbmZvLT5ibF9kZXYpCisJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CisjZW5kaWYKKworCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKKworCQlwcmludGsoInJpdmE6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7CisJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCisJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CisjZW5kaWYKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcml2YV9ibF9pbml0KHN0cnVjdCByaXZhX3BhciAqcGFyKSB7fQorc3RhdGljIGlubGluZSB2b2lkIHJpdmFfYmxfZXhpdChzdHJ1Y3Qgcml2YV9wYXIgKnBhcikge30KKyNlbmRpZiAvKiBDT05GSUdfRkJfUklWQV9CQUNLTElHSFQgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAgKgpAQCAtOTczLDM2ICsxMDk0LDYgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAgKgotICogQmFja2xpZ2h0IG9wZXJhdGlvbnMKLSAqCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLXN0YXRpYyBpbnQgcml2YV9zZXRfYmFja2xpZ2h0X2VuYWJsZShpbnQgb24sIGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgcml2YV9wYXIgKnBhciA9IGRhdGE7Ci0JVTAzMiB0bXBfcGNydCwgdG1wX3BtYzsKLQotCXRtcF9wbWMgPSBwYXItPnJpdmEuUE1DWzB4MTBGMC80XSAmIDB4MDAwMEZGRkY7Ci0JdG1wX3BjcnQgPSBwYXItPnJpdmEuUENSVEMwWzB4MDgxQy80XSAmIDB4RkZGRkZGRkM7Ci0JaWYob24gJiYgKGxldmVsID4gQkFDS0xJR0hUX09GRikpIHsKLQkJdG1wX3BjcnQgfD0gMHgxOwotCQl0bXBfcG1jIHw9ICgxIDw8IDMxKTsgLy8gYmFja2xpZ2h0IGJpdAotCQl0bXBfcG1jIHw9IHJpdmFfYmFja2xpZ2h0X2xldmVsc1tsZXZlbC0xXSA8PCAxNjsgLy8gbGV2ZWwKLQl9Ci0JcGFyLT5yaXZhLlBDUlRDMFsweDA4MUMvNF0gPSB0bXBfcGNydDsKLQlwYXItPnJpdmEuUE1DWzB4MTBGMC80XSA9IHRtcF9wbWM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcml2YV9zZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gcml2YV9zZXRfYmFja2xpZ2h0X2VuYWJsZSgxLCBsZXZlbCwgZGF0YSk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1BNQUNfQkFDS0xJR0hUICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgotICoKICAqIGZyYW1lYnVmZmVyIG9wZXJhdGlvbnMKICAqCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMjQ3LDEwICsxMzM4LDE1IEBACiAJU0VRb3V0KHBhciwgMHgwMSwgdG1wKTsKIAlDUlRDb3V0KHBhciwgMHgxYSwgdmVzYSk7CiAKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAoIHBhci0+RmxhdFBhbmVsICYmIG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7Ci0JCXNldF9iYWNrbGlnaHRfZW5hYmxlKCFibGFuayk7CisjaWZkZWYgQ09ORklHX0ZCX1JJVkFfQkFDS0xJR0hUCisJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOworCWlmIChpbmZvLT5ibF9kZXYpIHsKKwkJZG93bigmaW5mby0+YmxfZGV2LT5zZW0pOworCQlpbmZvLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IGJsYW5rOworCQlpbmZvLT5ibF9kZXYtPnByb3BzLT51cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CisJCXVwKCZpbmZvLT5ibF9kZXYtPnNlbSk7CiAJfQorCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwogI2VuZGlmCiAKIAlOVlRSQUNFX0xFQVZFKCk7CkBAIC0yMDM3LDExICsyMTMzLDkgQEAKIAkJUklWQUZCX1ZFUlNJT04sCiAJCWluZm8tPmZpeC5zbWVtX2xlbiAvICgxMDI0ICogMTAyNCksCiAJCWluZm8tPmZpeC5zbWVtX3N0YXJ0KTsKLSNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKLQlpZiAoZGVmYXVsdF9wYXItPkZsYXRQYW5lbCAmJiBtYWNoaW5lX2lzKHBvd2VybWFjKSkKLQkJcmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoJnJpdmFfYmFja2xpZ2h0X2NvbnRyb2xsZXIsCi0JCQkJCSAgICAgIGRlZmF1bHRfcGFyLCAibW5jYSIpOwotI2VuZGlmCisKKwlyaXZhX2JsX2luaXQoaW5mby0+cGFyKTsKKwogCU5WVFJBQ0VfTEVBVkUoKTsKIAlyZXR1cm4gMDsKIApAQCAtMjA3NCw2ICsyMTY4LDggQEAKIAkKIAlOVlRSQUNFX0VOVEVSKCk7CiAKKwlyaXZhX2JsX2V4aXQocGFyKTsKKwogI2lmZGVmIENPTkZJR19GQl9SSVZBX0kyQwogCXJpdmFfZGVsZXRlX2kyY19idXNzZXMocGFyKTsKIAlrZnJlZShwYXItPkVESUQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdHJpZGVudGZiLmMKaW5kZXggOWFjMmQzMS4uNDFmOGMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby90cmlkZW50ZmIuYworKysgYi9kcml2ZXJzL3ZpZGVvL3RyaWRlbnRmYi5jCkBAIC01NTEsNyArNTUxLDcgQEAKICNkZWZpbmUgY3J0Y191bmxvY2soKQl3cml0ZTNYNChDUlRWU3luY0VuZCwgcmVhZDNYNChDUlRWU3luY0VuZCkgJiAweDdGKQogCiAvKiAgUmV0dXJuIGZsYXQgcGFuZWwncyBtYXhpbXVtIHggcmVzb2x1dGlvbiAqLwotc3RhdGljIGludCBfX2luaXQgZ2V0X25hdGl2ZXgodm9pZCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGdldF9uYXRpdmV4KHZvaWQpCiB7CiAJaW50IHgseSx0bXA7CiAKQEAgLTY1OCw3ICs2NTgsNyBAQAogICogSWYgd2Ugc2VlIHRoYXQgRlAgaXMgYWN0aXZlIHdlIGFzc3VtZSB3ZSBoYXZlIG9uZS4KICAqIE90aGVyd2lzZSB3ZSBoYXZlIGEgQ1JUIGRpc3BsYXkuVXNlciBjYW4gb3ZlcnJpZGUuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGdldF9kaXNwbGF5dHlwZSh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBfX2RldmluaXQgZ2V0X2Rpc3BsYXl0eXBlKHZvaWQpCiB7CiAJaWYgKGZwKQogCQlyZXR1cm4gRElTUExBWV9GUDsKQEAgLTY2OCw3ICs2NjgsNyBAQAogfQogCiAvKiBUcnkgZGV0ZWN0aW5nIHRoZSB2aWRlbyBtZW1vcnkgc2l6ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBfX2luaXQgZ2V0X21lbXNpemUodm9pZCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF9tZW1zaXplKHZvaWQpCiB7CiAJdW5zaWduZWQgY2hhciB0bXAsIHRtcDI7CiAJdW5zaWduZWQgaW50IGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL3ZnYTE2ZmIuYyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCmluZGV4IGYzZjE2ZmQuLjRmZDJhMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vdmdhMTZmYi5jCkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCX0KIAogCS8qIFhYWCBzaGFyZSBWR0FfRkJfUEhZUyBhbmQgSS9PIHJlZ2lvbiB3aXRoIHZnYWNvbiBhbmQgb3RoZXJzICovCi0JaW5mby0+c2NyZWVuX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopVkdBX01BUF9NRU0oVkdBX0ZCX1BIWVMpOworCWluZm8tPnNjcmVlbl9iYXNlID0gKHZvaWQgX19pb21lbSAqKVZHQV9NQVBfTUVNKFZHQV9GQl9QSFlTLCAwKTsKIAogCWlmICghaW5mby0+c2NyZWVuX2Jhc2UpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJ2Z2ExNmZiOiB1bmFibGUgdG8gbWFwIGRldmljZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL0tjb25maWcgYi9kcml2ZXJzL3cxL0tjb25maWcKaW5kZXggNWU2MWVkNS4uOGIzZDBmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdzEvS2NvbmZpZwpAQCAtMiw4ICsyLDkgQEAKIAogY29uZmlnIFcxCiAJdHJpc3RhdGUgIkRhbGxhcydzIDEtd2lyZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gQ09OTkVDVE9SCiAJLS0taGVscC0tLQotCSAgRGFsbGFzJ3MgMS13aXJlIGJ1cyBpcyB1c2VmdWwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKKwkgIERhbGxhcycgMS13aXJlIGJ1cyBpcyB1c2VmdWwgdG8gY29ubmVjdCBzbG93IDEtcGluIGRldmljZXMKIAkgIHN1Y2ggYXMgaUJ1dHRvbnMgYW5kIHRoZXJtYWwgc2Vuc29ycy4KIAogCSAgSWYgeW91IHdhbnQgVzEgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBoZXJlLgpAQCAtMTEsNiArMTIsMTggQEAKIAkgIFRoaXMgVzEgc3VwcG9ydCBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCB3aXJlLmtvLgogCitjb25maWcgVzFfQ09OCisJZGVwZW5kcyBvbiBDT05ORUNUT1IgJiYgVzEKKwlib29sICJVc2Vyc3BhY2UgY29tbXVuaWNhdGlvbiBvdmVyIGNvbm5lY3RvciIKKwlkZWZhdWx0IHkKKwktLS0gaGVscCAtLS0KKwkgIFRoaXMgYWxsb3dzIHRvIGNvbW11bmljYXRlIHdpdGggdXNlcnNwYWNlIHVzaW5nIGNvbm5lY3RvciBbRG9jdW1lbnRhdGlvbi9jb25uZWN0b3JdLgorCSAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIG1lc3NhZ2VzIGJldHdlZW4gdzEgY29yZSBhbmQgdXNlcnNwYWNlOgorCSAgMS4gRXZlbnRzLiBUaGV5IGFyZSBnZW5lcmF0ZWQgZWFjaCB0aW1lIG5ldyBtYXN0ZXIgb3Igc2xhdmUgZGV2aWNlIGZvdW5kCisJCWVpdGhlciBkdWUgdG8gYXV0b21hdGljIG9yIHJlcXVlc3RlZCBzZWFyY2guCisJICAyLiBVc2Vyc3BhY2UgY29tbWFuZHMuIEluY2x1ZGVzIHJlYWQvd3JpdGUgYW5kIHNlYXJjaC9hbGFybSBzZWFyY2ggY29tYW1uZHMuCisJICAzLiBSZXBsaWVzIHRvIHVzZXJzcGFjZSBjb21tYW5kcy4KKwogc291cmNlIGRyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnCiBzb3VyY2UgZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL01ha2VmaWxlIGIvZHJpdmVycy93MS9NYWtlZmlsZQppbmRleCAwYzJhYTIyLi45Mzg0NWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdzEvTWFrZWZpbGUKQEAgLTIsMTAgKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIERhbGxhcydzIDEtd2lyZSBidXMuCiAjCiAKLWlmbmVxICgkKENPTkZJR19ORVQpLCB5KQotRVhUUkFfQ0ZMQUdTCSs9IC1ETkVUTElOS19ESVNBQkxFRAotZW5kaWYKLQogaWZlcSAoJChDT05GSUdfVzFfRFMyNDMzX0NSQyksIHkpCiBFWFRSQV9DRkxBR1MJKz0gLURDT05GSUdfVzFfRjIzX0NSQwogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9LY29uZmlnIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKaW5kZXggYzZiYWQ0ZC4uMmZiNDI1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL0tjb25maWcKQEAgLTE1LDI0ICsxNSwxNSBAQAogCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIG1hdHJveF93MS5rby4KIAotY29uZmlnIFcxX01BU1RFUl9EUzk0OTAKLQl0cmlzdGF0ZSAiRFM5NDkwUiB0cmFuc3BvcnQgbGF5ZXIgZHJpdmVyIgotCWRlcGVuZHMgb24gVzEgJiYgVVNCCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZHJpdmVyIGZvciBEUzk0OTBSIFVXQiA8LT4gVzEgYnJpZGdlLgorY29uZmlnIFcxX01BU1RFUl9EUzI0OTAKKwl0cmlzdGF0ZSAiRFMyNDkwIFVTQiA8LT4gVzEgdHJhbnNwb3J0IGxheWVyIGZvciAxLXdpcmUiCisgIAlkZXBlbmRzIG9uIFcxICYmIFVTQgorICAJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIGEgZHJpdmVyIGZvciBEUzI0OTAgYmFzZWQgVVNCIDwtPiBXMSBicmlkZ2VzLAorCSAgZm9yIGV4YW1wbGUgRFM5NDkwKi4KIAotCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGRzOTQ5MHIua28uCi0KLWNvbmZpZyBXMV9NQVNURVJfRFM5NDkwX0JSSURHRQotCXRyaXN0YXRlICJEUzk0OTBSIFVTQiA8LT4gVzEgdHJhbnNwb3J0IGxheWVyIGZvciAxLXdpcmUiCi0JZGVwZW5kcyBvbiBXMV9NQVNURVJfRFM5NDkwCi0JaGVscAotCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgMS13aXJlIGRldmljZXMKLQkgIHVzaW5nIERTOTQ5MFIgVVNCIGJyaWRnZS4KLQotCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKLQkgIHdpbGwgYmUgY2FsbGVkIGRzX3cxX2JyaWRnZS5rby4KKyAgCSAgVGhpcyBzdXBwb3J0IGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGRzMjQ5MC5rby4KIAogY29uZmlnIFcxX01BU1RFUl9EUzI0ODIKIAl0cmlzdGF0ZSAiTWF4aW0gRFMyNDgyIEkyQyB0byAxLVdpcmUgYnJpZGdlIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlIGIvZHJpdmVycy93MS9tYXN0ZXJzL01ha2VmaWxlCmluZGV4IDFmM2M4YjkuLjRjZWUyNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvTWFrZWZpbGUKQEAgLTMsMTEgKzMsNiBAQAogIwogCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX01BVFJPWCkJCSs9IG1hdHJveF93MS5vCi0KLW9iai0kKENPTkZJR19XMV9NQVNURVJfRFM5NDkwKQkJKz0gZHM5NDkwci5vCi1kczk0OTByLW9ianMgICAgOj0gZHNjb3JlLm8KLQotb2JqLSQoQ09ORklHX1cxX01BU1RFUl9EUzk0OTBfQlJJREdFKQkrPSBkc193MV9icmlkZ2UubwotCitvYmotJChDT05GSUdfVzFfTUFTVEVSX0RTMjQ5MCkJCSs9IGRzMjQ5MC5vCiBvYmotJChDT05GSUdfVzFfTUFTVEVSX0RTMjQ4MikJCSs9IGRzMjQ4Mi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0ODIuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kczI0ODIuYwppbmRleCBkMWNhY2QyLi5hZjQ5MmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDgyLmMKKysrIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ4Mi5jCkBAIC0xMjUsNyArMTI1LDcgQEAKIAogc3RydWN0IGRzMjQ4Ml9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAljbGllbnQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQlhY2Nlc3NfbG9jazsKKwlzdHJ1Y3QgbXV0ZXgJCWFjY2Vzc19sb2NrOwogCiAJLyogMS13aXJlIGludGVyZmFjZShzKSAqLwogCWludAkJCXcxX2NvdW50OwkvKiAxIG9yIDggKi8KQEAgLTI2NSw3ICsyNjUsNyBAQAogCXN0cnVjdCBkczI0ODJfZGF0YSAgICAqcGRldiA9IHBjaGFuLT5wZGV2OwogCWludCBzdGF0dXMgPSAtMTsKIAotCWRvd24oJnBkZXYtPmFjY2Vzc19sb2NrKTsKKwltdXRleF9sb2NrKCZwZGV2LT5hY2Nlc3NfbG9jayk7CiAKIAkvKiBTZWxlY3QgdGhlIGNoYW5uZWwgKi8KIAlkczI0ODJfd2FpdF8xd2lyZV9pZGxlKHBkZXYpOwpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCQkJICBiaXQgPyAweEZGIDogMCkpCiAJCXN0YXR1cyA9IGRzMjQ4Ml93YWl0XzF3aXJlX2lkbGUocGRldik7CiAKLQl1cCgmcGRldi0+YWNjZXNzX2xvY2spOworCW11dGV4X3VubG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogCiAJcmV0dXJuIChzdGF0dXMgJiBEUzI0ODJfUkVHX1NUU19TQlIpID8gMSA6IDA7CiB9CkBAIC0yOTcsNyArMjk3LDcgQEAKIAlzdHJ1Y3QgZHMyNDgyX2RhdGEgICAgKnBkZXYgPSBwY2hhbi0+cGRldjsKIAlpbnQgc3RhdHVzID0gKDMgPDwgNSk7CiAKLQlkb3duKCZwZGV2LT5hY2Nlc3NfbG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogCiAJLyogU2VsZWN0IHRoZSBjaGFubmVsICovCiAJZHMyNDgyX3dhaXRfMXdpcmVfaWRsZShwZGV2KTsKQEAgLTMwOSw3ICszMDksNyBAQAogCQkJCSAgZGJpdCA/IDB4RkYgOiAwKSkKIAkJc3RhdHVzID0gZHMyNDgyX3dhaXRfMXdpcmVfaWRsZShwZGV2KTsKIAotCXVwKCZwZGV2LT5hY2Nlc3NfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwZGV2LT5hY2Nlc3NfbG9jayk7CiAKIAkvKiBEZWNvZGUgdGhlIHN0YXR1cyAqLwogCXJldHVybiAoc3RhdHVzID4+IDUpOwpAQCAtMzI2LDcgKzMyNiw3IEBACiAJc3RydWN0IGRzMjQ4Ml93MV9jaGFuICpwY2hhbiA9IGRhdGE7CiAJc3RydWN0IGRzMjQ4Ml9kYXRhICAgICpwZGV2ID0gcGNoYW4tPnBkZXY7CiAKLQlkb3duKCZwZGV2LT5hY2Nlc3NfbG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogCiAJLyogU2VsZWN0IHRoZSBjaGFubmVsICovCiAJZHMyNDgyX3dhaXRfMXdpcmVfaWRsZShwZGV2KTsKQEAgLTMzNiw3ICszMzYsNyBAQAogCS8qIFNlbmQgdGhlIHdyaXRlIGJ5dGUgY29tbWFuZCAqLwogCWRzMjQ4Ml9zZW5kX2NtZF9kYXRhKHBkZXYsIERTMjQ4Ml9DTURfMVdJUkVfV1JJVEVfQllURSwgYnl0ZSk7CiAKLQl1cCgmcGRldi0+YWNjZXNzX2xvY2spOworCW11dGV4X3VubG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogfQogCiAvKioKQEAgLTM1MSw3ICszNTEsNyBAQAogCXN0cnVjdCBkczI0ODJfZGF0YSAgICAqcGRldiA9IHBjaGFuLT5wZGV2OwogCWludCByZXN1bHQ7CiAKLQlkb3duKCZwZGV2LT5hY2Nlc3NfbG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogCiAJLyogU2VsZWN0IHRoZSBjaGFubmVsICovCiAJZHMyNDgyX3dhaXRfMXdpcmVfaWRsZShwZGV2KTsKQEAgLTM3MCw3ICszNzAsNyBAQAogCS8qIFJlYWQgdGhlIGRhdGEgYnl0ZSAqLwogCXJlc3VsdCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoJnBkZXYtPmNsaWVudCk7CiAKLQl1cCgmcGRldi0+YWNjZXNzX2xvY2spOworCW11dGV4X3VubG9jaygmcGRldi0+YWNjZXNzX2xvY2spOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTM4OSw3ICszODksNyBAQAogCWludCBlcnI7CiAJdTggcmV0dmFsID0gMTsKIAotCWRvd24oJnBkZXYtPmFjY2Vzc19sb2NrKTsKKwltdXRleF9sb2NrKCZwZGV2LT5hY2Nlc3NfbG9jayk7CiAKIAkvKiBTZWxlY3QgdGhlIGNoYW5uZWwgKi8KIAlkczI0ODJfd2FpdF8xd2lyZV9pZGxlKHBkZXYpOwpAQCAtNDA5LDcgKzQwOSw3IEBACiAJCQkJCSAgICAgMHhGMCk7CiAJfQogCi0JdXAoJnBkZXYtPmFjY2Vzc19sb2NrKTsKKwltdXRleF91bmxvY2soJnBkZXYtPmFjY2Vzc19sb2NrKTsKIAogCXJldHVybiByZXR2YWw7CiB9CkBAIC00ODIsNyArNDgyLDcgQEAKIAlzbnByaW50ZihuZXdfY2xpZW50LT5uYW1lLCBzaXplb2YobmV3X2NsaWVudC0+bmFtZSksICJkczI0ODItJWQwMCIsCiAJCSBkYXRhLT53MV9jb3VudCk7CiAKLQlpbml0X01VVEVYKCZkYXRhLT5hY2Nlc3NfbG9jayk7CisJbXV0ZXhfaW5pdCgmZGF0YS0+YWNjZXNzX2xvY2spOwogCiAJLyogVGVsbCB0aGUgSTJDIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLwogCWlmICgoZXJyID0gaTJjX2F0dGFjaF9jbGllbnQobmV3X2NsaWVudCkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzY29yZS5jIGIvZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGRyaXZlcnMvdzEvbWFzdGVycy9kc2NvcmUuYwpyZW5hbWUgdG8gZHJpdmVycy93MS9tYXN0ZXJzL2RzMjQ5MC5jCmluZGV4IDJjZjc3NzYuLjI5OWUyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvbWFzdGVycy9kc2NvcmUuYworKysgYi9kcml2ZXJzL3cxL21hc3RlcnMvZHMyNDkwLmMKQEAgLTI0LDcgKzI0LDEzNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCi0jaW5jbHVkZSAiZHNjb3JlLmgiCisjaW5jbHVkZSAiLi4vdzFfaW50LmgiCisjaW5jbHVkZSAiLi4vdzEuaCIKKworLyogQ09NTUFORCBUWVBFIENPREVTICovCisjZGVmaW5lIENPTlRST0xfQ01ECQkJMHgwMAorI2RlZmluZSBDT01NX0NNRAkJCTB4MDEKKyNkZWZpbmUgTU9ERV9DTUQJCQkweDAyCisKKy8qIENPTlRST0wgQ09NTUFORCBDT0RFUyAqLworI2RlZmluZSBDVExfUkVTRVRfREVWSUNFCQkweDAwMDAKKyNkZWZpbmUgQ1RMX1NUQVJUX0VYRQkJCTB4MDAwMQorI2RlZmluZSBDVExfUkVTVU1FX0VYRQkJCTB4MDAwMgorI2RlZmluZSBDVExfSEFMVF9FWEVfSURMRQkJMHgwMDAzCisjZGVmaW5lIENUTF9IQUxUX0VYRV9ET05FCQkweDAwMDQKKyNkZWZpbmUgQ1RMX0ZMVVNIX0NPTU1fQ01EUwkJMHgwMDA3CisjZGVmaW5lIENUTF9GTFVTSF9SQ1ZfQlVGRkVSCQkweDAwMDgKKyNkZWZpbmUgQ1RMX0ZMVVNIX1hNVF9CVUZGRVIJCTB4MDAwOQorI2RlZmluZSBDVExfR0VUX0NPTU1fQ01EUwkJMHgwMDBBCisKKy8qIE1PREUgQ09NTUFORCBDT0RFUyAqLworI2RlZmluZSBNT0RfUFVMU0VfRU4JCQkweDAwMDAKKyNkZWZpbmUgTU9EX1NQRUVEX0NIQU5HRV9FTgkJMHgwMDAxCisjZGVmaW5lIE1PRF8xV0lSRV9TUEVFRAkJCTB4MDAwMgorI2RlZmluZSBNT0RfU1RST05HX1BVX0RVUkFUSU9OCQkweDAwMDMKKyNkZWZpbmUgTU9EX1BVTExET1dOX1NMRVdSQVRFCQkweDAwMDQKKyNkZWZpbmUgTU9EX1BST0dfUFVMU0VfRFVSQVRJT04JCTB4MDAwNQorI2RlZmluZSBNT0RfV1JJVEUxX0xPV1RJTUUJCTB4MDAwNgorI2RlZmluZSBNT0RfRFNPVzBfVFJFQwkJCTB4MDAwNworCisvKiBDT01NVU5JQ0FUSU9OIENPTU1BTkQgQ09ERVMgKi8KKyNkZWZpbmUgQ09NTV9FUlJPUl9FU0NBUEUJCTB4MDYwMQorI2RlZmluZSBDT01NX1NFVF9EVVJBVElPTgkJMHgwMDEyCisjZGVmaW5lIENPTU1fQklUX0lPCQkJMHgwMDIwCisjZGVmaW5lIENPTU1fUFVMU0UJCQkweDAwMzAKKyNkZWZpbmUgQ09NTV8xX1dJUkVfUkVTRVQJCTB4MDA0MgorI2RlZmluZSBDT01NX0JZVEVfSU8JCQkweDAwNTIKKyNkZWZpbmUgQ09NTV9NQVRDSF9BQ0NFU1MJCTB4MDA2NAorI2RlZmluZSBDT01NX0JMT0NLX0lPCQkJMHgwMDc0CisjZGVmaW5lIENPTU1fUkVBRF9TVFJBSUdIVAkJMHgwMDgwCisjZGVmaW5lIENPTU1fRE9fUkVMRUFTRQkJCTB4NjA5MgorI2RlZmluZSBDT01NX1NFVF9QQVRICQkJMHgwMEEyCisjZGVmaW5lIENPTU1fV1JJVEVfU1JBTV9QQUdFCQkweDAwQjIKKyNkZWZpbmUgQ09NTV9XUklURV9FUFJPTQkJMHgwMEM0CisjZGVmaW5lIENPTU1fUkVBRF9DUkNfUFJPVF9QQUdFCQkweDAwRDQKKyNkZWZpbmUgQ09NTV9SRUFEX1JFRElSRUNUX1BBR0VfQ1JDCTB4MjFFNAorI2RlZmluZSBDT01NX1NFQVJDSF9BQ0NFU1MJCTB4MDBGNAorCisvKiBDb21tdW5pY2F0aW9uIGNvbW1hbmQgYml0cyAqLworI2RlZmluZSBDT01NX1RZUEUJCQkweDAwMDgKKyNkZWZpbmUgQ09NTV9TRQkJCQkweDAwMDgKKyNkZWZpbmUgQ09NTV9ECQkJCTB4MDAwOAorI2RlZmluZSBDT01NX1oJCQkJMHgwMDA4CisjZGVmaW5lIENPTU1fQ0gJCQkJMHgwMDA4CisjZGVmaW5lIENPTU1fU00JCQkJMHgwMDA4CisjZGVmaW5lIENPTU1fUgkJCQkweDAwMDgKKyNkZWZpbmUgQ09NTV9JTQkJCQkweDAwMDEKKworI2RlZmluZSBDT01NX1BTCQkJCTB4NDAwMAorI2RlZmluZSBDT01NX1BTVAkJCTB4NDAwMAorI2RlZmluZSBDT01NX0NJQgkJCTB4NDAwMAorI2RlZmluZSBDT01NX1JUUwkJCTB4NDAwMAorI2RlZmluZSBDT01NX0RUCQkJCTB4MjAwMAorI2RlZmluZSBDT01NX1NQVQkJCTB4MTAwMAorI2RlZmluZSBDT01NX0YJCQkJMHgwODAwCisjZGVmaW5lIENPTU1fTlRQCQkJMHgwNDAwCisjZGVmaW5lIENPTU1fSUNQCQkJMHgwMjAwCisjZGVmaW5lIENPTU1fUlNUCQkJMHgwMTAwCisKKyNkZWZpbmUgUFVMU0VfUFJPRwkJCTB4MDEKKyNkZWZpbmUgUFVMU0VfU1BVRQkJCTB4MDIKKworI2RlZmluZSBCUkFOQ0hfTUFJTgkJCTB4Q0MKKyNkZWZpbmUgQlJBTkNIX0FVWAkJCTB4MzMKKworLyoKKyAqIER1cmF0aW9uIG9mIHRoZSBzdHJvbmcgcHVsbC11cCBwdWxzZSBpbiBtaWxsaXNlY29uZHMuCisgKi8KKyNkZWZpbmUgUFVMTFVQX1BVTFNFX0RVUkFUSU9OCQk3NTAKKworLyogU3RhdHVzIGZsYWdzICovCisjZGVmaW5lIFNUX1NQVUEJCQkJMHgwMSAgLyogU3Ryb25nIFB1bGwtdXAgaXMgYWN0aXZlICovCisjZGVmaW5lIFNUX1BSR0EJCQkJMHgwMiAgLyogMTJWIHByb2dyYW1taW5nIHB1bHNlIGlzIGJlaW5nIGdlbmVyYXRlZCAqLworI2RlZmluZSBTVF8xMlZQCQkJCTB4MDQgIC8qIGV4dGVybmFsIDEyViBwcm9ncmFtbWluZyB2b2x0YWdlIGlzIHByZXNlbnQgKi8KKyNkZWZpbmUgU1RfUE1PRAkJCQkweDA4ICAvKiBEUzI0OTAgcG93ZXJlZCBmcm9tIFVTQiBhbmQgZXh0ZXJuYWwgc291cmNlcyAqLworI2RlZmluZSBTVF9IQUxUCQkJCTB4MTAgIC8qIERTMjQ5MCBpcyBjdXJyZW50bHkgaGFsdGVkICovCisjZGVmaW5lIFNUX0lETEUJCQkJMHgyMCAgLyogRFMyNDkwIGlzIGN1cnJlbnRseSBpZGxlICovCisjZGVmaW5lIFNUX0VQT0YJCQkJMHg4MAorCisjZGVmaW5lIFNQRUVEX05PUk1BTAkJCTB4MDAKKyNkZWZpbmUgU1BFRURfRkxFWElCTEUJCQkweDAxCisjZGVmaW5lIFNQRUVEX09WRVJEUklWRQkJCTB4MDIKKworI2RlZmluZSBOVU1fRVAJCQkJNAorI2RlZmluZSBFUF9DT05UUk9MCQkJMAorI2RlZmluZSBFUF9TVEFUVVMJCQkxCisjZGVmaW5lIEVQX0RBVEFfT1VUCQkJMgorI2RlZmluZSBFUF9EQVRBX0lOCQkJMworCitzdHJ1Y3QgZHNfZGV2aWNlCit7CisJc3RydWN0IGxpc3RfaGVhZAlkc19lbnRyeTsKKworCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOworCisJaW50CQkJZXBbTlVNX0VQXTsKKworCXN0cnVjdCB3MV9idXNfbWFzdGVyCW1hc3RlcjsKK307CisKK3N0cnVjdCBkc19zdGF0dXMKK3sKKwl1OAkJCWVuYWJsZTsKKwl1OAkJCXNwZWVkOworCXU4CQkJcHVsbHVwX2R1cjsKKwl1OAkJCXBwdWxzX2R1cjsKKwl1OAkJCXB1bGxkb3duX3NsZXc7CisJdTgJCQl3cml0ZTFfdGltZTsKKwl1OAkJCXdyaXRlMF90aW1lOworCXU4CQkJcmVzZXJ2ZWQwOworCXU4CQkJc3RhdHVzOworCXU4CQkJY29tbWFuZDA7CisJdTgJCQljb21tYW5kMTsKKwl1OAkJCWNvbW1hbmRfYnVmZmVyX3N0YXR1czsKKwl1OAkJCWRhdGFfb3V0X2J1ZmZlcl9zdGF0dXM7CisJdTgJCQlkYXRhX2luX2J1ZmZlcl9zdGF0dXM7CisJdTgJCQlyZXNlcnZlZDE7CisJdTgJCQlyZXNlcnZlZDI7CisKK307CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkc19pZF90YWJsZSBbXSA9IHsKIAl7IFVTQl9ERVZJQ0UoMHgwNGZhLCAweDI0OTApIH0sCkBAIC0zNSwyMSArMTY0LDEyIEBACiBzdGF0aWMgaW50IGRzX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICosIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICopOwogc3RhdGljIHZvaWQgZHNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqKTsKIAotaW50IGRzX3RvdWNoX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICosIHU4LCB1OCAqKTsKLWludCBkc19yZWFkX2J5dGUoc3RydWN0IGRzX2RldmljZSAqLCB1OCAqKTsKLWludCBkc19yZWFkX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICosIHU4ICopOwotaW50IGRzX3dyaXRlX2J5dGUoc3RydWN0IGRzX2RldmljZSAqLCB1OCk7Ci1pbnQgZHNfd3JpdGVfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTgpOwotc3RhdGljIGludCBkc19zdGFydF9wdWxzZShzdHJ1Y3QgZHNfZGV2aWNlICosIGludCk7Ci1pbnQgZHNfcmVzZXQoc3RydWN0IGRzX2RldmljZSAqLCBzdHJ1Y3QgZHNfc3RhdHVzICopOwotc3RydWN0IGRzX2RldmljZSAqIGRzX2dldF9kZXZpY2Uodm9pZCk7Ci12b2lkIGRzX3B1dF9kZXZpY2Uoc3RydWN0IGRzX2RldmljZSAqKTsKLQogc3RhdGljIGlubGluZSB2b2lkIGRzX2R1bXBfc3RhdHVzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqLCBpbnQpOwogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2woc3RydWN0IGRzX2RldmljZSAqLCB1MTYsIHUxNik7Ci1zdGF0aWMgaW50IGRzX3NlbmRfY29udHJvbF9tb2RlKHN0cnVjdCBkc19kZXZpY2UgKiwgdTE2LCB1MTYpOwogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfY21kKHN0cnVjdCBkc19kZXZpY2UgKiwgdTE2LCB1MTYpOwogCitzdGF0aWMgTElTVF9IRUFEKGRzX2RldmljZXMpOworc3RhdGljIERFRklORV9NVVRFWChkc19tdXRleCk7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBkc19kcml2ZXIgPSB7CiAJLm5hbWUgPQkJIkRTOTQ5MFIiLApAQCAtNTgsMjAgKzE3OCw2IEBACiAJLmlkX3RhYmxlID0JZHNfaWRfdGFibGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGRzX2RldmljZSAqZHNfZGV2OwotCi1zdHJ1Y3QgZHNfZGV2aWNlICogZHNfZ2V0X2RldmljZSh2b2lkKQotewotCWlmIChkc19kZXYpCi0JCWF0b21pY19pbmMoJmRzX2Rldi0+cmVmY250KTsKLQlyZXR1cm4gZHNfZGV2OwotfQotCi12b2lkIGRzX3B1dF9kZXZpY2Uoc3RydWN0IGRzX2RldmljZSAqZGV2KQotewotCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKLX0KLQogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfY21kKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTE2IHZhbHVlLCB1MTYgaW5kZXgpCiB7CiAJaW50IGVycjsKQEAgLTg2LDcgKzE5Miw3IEBACiAKIAlyZXR1cm4gZXJyOwogfQotCisjaWYgMAogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2xfbW9kZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHUxNiB2YWx1ZSwgdTE2IGluZGV4KQogewogCWludCBlcnI7CkBAIC0xMDEsNyArMjA3LDcgQEAKIAogCXJldHVybiBlcnI7CiB9Ci0KKyNlbmRpZgogc3RhdGljIGludCBkc19zZW5kX2NvbnRyb2woc3RydWN0IGRzX2RldmljZSAqZGV2LCB1MTYgdmFsdWUsIHUxNiBpbmRleCkKIHsKIAlpbnQgZXJyOwpAQCAtMzI0LDcgKzQzMCw3IEBACiAJCXJldHVybiAwOwogfQogCi1pbnQgZHNfcmVzZXQoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCkKK3N0YXRpYyBpbnQgZHNfcmVzZXQoc3RydWN0IGRzX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHNfc3RhdHVzICpzdCkKIHsKIAlpbnQgZXJyOwogCkBAIC0zNDUsNyArNDUxLDcgQEAKIH0KIAogI2lmIDAKLWludCBkc19zZXRfc3BlZWQoc3RydWN0IGRzX2RldmljZSAqZGV2LCBpbnQgc3BlZWQpCitzdGF0aWMgaW50IGRzX3NldF9zcGVlZChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIGludCBzcGVlZCkKIHsKIAlpbnQgZXJyOwogCkBAIC0zOTUsNyArNTAxLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgZHNfdG91Y2hfYml0KHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTggYml0LCB1OCAqdGJpdCkKK3N0YXRpYyBpbnQgZHNfdG91Y2hfYml0KHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTggYml0LCB1OCAqdGJpdCkKIHsKIAlpbnQgZXJyLCBjb3VudDsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwpAQCAtNDI3LDcgKzUzMyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBkc193cml0ZV9iaXQoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCBiaXQpCitzdGF0aWMgaW50IGRzX3dyaXRlX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU4IGJpdCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CkBAIC00NDEsNyArNTQ3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRzX3dyaXRlX2J5dGUoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCBieXRlKQorc3RhdGljIGludCBkc193cml0ZV9ieXRlKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTggYnl0ZSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CkBAIC00NjQsMjYgKzU3MCw3IEBACiAJcmV0dXJuICEoYnl0ZSA9PSByYnl0ZSk7CiB9CiAKLWludCBkc19yZWFkX2JpdChzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU4ICpiaXQpCi17Ci0JaW50IGVycjsKLQotCWVyciA9IGRzX3NlbmRfY29udHJvbF9tb2RlKGRldiwgTU9EX1BVTFNFX0VOLCBQVUxTRV9TUFVFKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gZHNfc2VuZF9jb250cm9sKGRldiwgQ09NTV9CSVRfSU8gfCBDT01NX0lNIHwgQ09NTV9TUFUgfCBDT01NX0QsIDApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBkc19yZWN2X2RhdGEoZGV2LCBiaXQsIHNpemVvZigqYml0KSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGRzX3JlYWRfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU4ICpieXRlKQorc3RhdGljIGludCBkc19yZWFkX2J5dGUoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCAqYnl0ZSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CkBAIC01MDEsNyArNTg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRzX3JlYWRfYmxvY2soc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGludCBkc19yZWFkX2Jsb2NrKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTggKmJ1ZiwgaW50IGxlbikKIHsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwogCWludCBlcnI7CkBAIC01MjcsNyArNjE0LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgZHNfd3JpdGVfYmxvY2soc3RydWN0IGRzX2RldmljZSAqZGV2LCB1OCAqYnVmLCBpbnQgbGVuKQorc3RhdGljIGludCBkc193cml0ZV9ibG9jayhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU4ICpidWYsIGludCBsZW4pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwpAQCAtNTU1LDcgKzY0Miw3IEBACiAKICNpZiAwCiAKLWludCBkc19zZWFyY2goc3RydWN0IGRzX2RldmljZSAqZGV2LCB1NjQgaW5pdCwgdTY0ICpidWYsIHU4IGlkX251bWJlciwgaW50IGNvbmRpdGlvbmFsX3NlYXJjaCkKK3N0YXRpYyBpbnQgZHNfc2VhcmNoKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQsIHU2NCAqYnVmLCB1OCBpZF9udW1iZXIsIGludCBjb25kaXRpb25hbF9zZWFyY2gpCiB7CiAJaW50IGVycjsKIAl1MTYgdmFsdWUsIGluZGV4OwpAQCAtNTg0LDcgKzY3MSw3IEBACiAJcmV0dXJuIGVyci84OwogfQogCi1pbnQgZHNfbWF0Y2hfYWNjZXNzKHN0cnVjdCBkc19kZXZpY2UgKmRldiwgdTY0IGluaXQpCitzdGF0aWMgaW50IGRzX21hdGNoX2FjY2VzcyhzdHJ1Y3QgZHNfZGV2aWNlICpkZXYsIHU2NCBpbml0KQogewogCWludCBlcnI7CiAJc3RydWN0IGRzX3N0YXR1cyBzdDsKQEAgLTYwNCw3ICs2OTEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZHNfc2V0X3BhdGgoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1NjQgaW5pdCkKK3N0YXRpYyBpbnQgZHNfc2V0X3BhdGgoc3RydWN0IGRzX2RldmljZSAqZGV2LCB1NjQgaW5pdCkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBkc19zdGF0dXMgc3Q7CkBAIC02MzAsNDUgKzcxNywxNTYgQEAKIAogI2VuZGlmICAvKiAgMCAgKi8KIAorc3RhdGljIHU4IGRzOTQ5MHJfdG91Y2hfYml0KHZvaWQgKmRhdGEsIHU4IGJpdCkKK3sKKwl1OCByZXQ7CisJc3RydWN0IGRzX2RldmljZSAqZGV2ID0gZGF0YTsKKworCWlmIChkc190b3VjaF9iaXQoZGV2LCBiaXQsICZyZXQpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRzOTQ5MHJfd3JpdGVfYml0KHZvaWQgKmRhdGEsIHU4IGJpdCkKK3sKKwlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOworCisJZHNfd3JpdGVfYml0KGRldiwgYml0KTsKK30KKworc3RhdGljIHZvaWQgZHM5NDkwcl93cml0ZV9ieXRlKHZvaWQgKmRhdGEsIHU4IGJ5dGUpCit7CisJc3RydWN0IGRzX2RldmljZSAqZGV2ID0gZGF0YTsKKworCWRzX3dyaXRlX2J5dGUoZGV2LCBieXRlKTsKK30KKworc3RhdGljIHU4IGRzOTQ5MHJfcmVhZF9iaXQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOworCWludCBlcnI7CisJdTggYml0ID0gMDsKKworCWVyciA9IGRzX3RvdWNoX2JpdChkZXYsIDEsICZiaXQpOworCWlmIChlcnIpCisJCXJldHVybiAwOworCisJcmV0dXJuIGJpdCAmIDE7Cit9CisKK3N0YXRpYyB1OCBkczk0OTByX3JlYWRfYnl0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7CisJaW50IGVycjsKKwl1OCBieXRlID0gMDsKKworCWVyciA9IGRzX3JlYWRfYnl0ZShkZXYsICZieXRlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBieXRlOworfQorCitzdGF0aWMgdm9pZCBkczk0OTByX3dyaXRlX2Jsb2NrKHZvaWQgKmRhdGEsIGNvbnN0IHU4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RldmljZSAqZGV2ID0gZGF0YTsKKworCWRzX3dyaXRlX2Jsb2NrKGRldiwgKHU4ICopYnVmLCBsZW4pOworfQorCitzdGF0aWMgdTggZHM5NDkwcl9yZWFkX2Jsb2NrKHZvaWQgKmRhdGEsIHU4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGRzX2RldmljZSAqZGV2ID0gZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gZHNfcmVhZF9ibG9jayhkZXYsIGJ1ZiwgbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdTggZHM5NDkwcl9yZXNldCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IGRzX3N0YXR1cyBzdDsKKwlpbnQgZXJyOworCisJbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CisKKwllcnIgPSBkc19yZXNldChkZXYsICZzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc193MV9pbml0KHN0cnVjdCBkc19kZXZpY2UgKmRldikKK3sKKwltZW1zZXQoJmRldi0+bWFzdGVyLCAwLCBzaXplb2Yoc3RydWN0IHcxX2J1c19tYXN0ZXIpKTsKKworCWRldi0+bWFzdGVyLmRhdGEJPSBkZXY7CisJZGV2LT5tYXN0ZXIudG91Y2hfYml0CT0gJmRzOTQ5MHJfdG91Y2hfYml0OworCWRldi0+bWFzdGVyLnJlYWRfYml0CT0gJmRzOTQ5MHJfcmVhZF9iaXQ7CisJZGV2LT5tYXN0ZXIud3JpdGVfYml0CT0gJmRzOTQ5MHJfd3JpdGVfYml0OworCWRldi0+bWFzdGVyLnJlYWRfYnl0ZQk9ICZkczk0OTByX3JlYWRfYnl0ZTsKKwlkZXYtPm1hc3Rlci53cml0ZV9ieXRlCT0gJmRzOTQ5MHJfd3JpdGVfYnl0ZTsKKwlkZXYtPm1hc3Rlci5yZWFkX2Jsb2NrCT0gJmRzOTQ5MHJfcmVhZF9ibG9jazsKKwlkZXYtPm1hc3Rlci53cml0ZV9ibG9jawk9ICZkczk0OTByX3dyaXRlX2Jsb2NrOworCWRldi0+bWFzdGVyLnJlc2V0X2J1cwk9ICZkczk0OTByX3Jlc2V0OworCisJcmV0dXJuIHcxX2FkZF9tYXN0ZXJfZGV2aWNlKCZkZXYtPm1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIGRzX3cxX2Zpbmkoc3RydWN0IGRzX2RldmljZSAqZGV2KQoreworCXcxX3JlbW92ZV9tYXN0ZXJfZGV2aWNlKCZkZXYtPm1hc3Rlcik7Cit9CisKIHN0YXRpYyBpbnQgZHNfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCSAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqdWRldl9pZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZmFjZV9kZXNjOworCXN0cnVjdCBkc19kZXZpY2UgKmRldjsKIAlpbnQgaSwgZXJyOwogCi0JZHNfZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzX2RldmljZSksIEdGUF9LRVJORUwpOwotCWlmICghZHNfZGV2KSB7CisJZGV2ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGRzX2RldmljZSksIEdGUF9LRVJORUwpOworCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX0lORk8gIkZhaWxlZCB0byBhbGxvY2F0ZSBuZXcgRFM5NDkwUiBzdHJ1Y3R1cmUuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCWRldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOworCWlmICghZGV2LT51ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dF9mcmVlOworCX0KKwltZW1zZXQoZGV2LT5lcCwgMCwgc2l6ZW9mKGRldi0+ZXApKTsKIAotCWRzX2Rldi0+dWRldiA9IHVzYl9nZXRfZGV2KHVkZXYpOwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgZHNfZGV2KTsKKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIGRldik7CiAKLQllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShkc19kZXYtPnVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAzKTsKKwllcnIgPSB1c2Jfc2V0X2ludGVyZmFjZShkZXYtPnVkZXYsIGludGYtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlTnVtYmVyLCAzKTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHNldCBhbHRlcm5hdGl2ZSBzZXR0aW5nIDMgZm9yICVkIGludGVyZmFjZTogZXJyPSVkLlxuIiwKIAkJCQlpbnRmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZU51bWJlciwgZXJyKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfb3V0X2NsZWFyOwogCX0KIAotCWVyciA9IHVzYl9yZXNldF9jb25maWd1cmF0aW9uKGRzX2Rldi0+dWRldik7CisJZXJyID0gdXNiX3Jlc2V0X2NvbmZpZ3VyYXRpb24oZGV2LT51ZGV2KTsKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlc2V0IGNvbmZpZ3VyYXRpb246IGVycj0lZC5cbiIsIGVycik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZXJyX291dF9jbGVhcjsKIAl9CiAKIAlpZmFjZV9kZXNjID0gJmludGYtPmFsdHNldHRpbmdbMF07CiAJaWYgKGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyAhPSBOVU1fRVAtMSkgewogCQlwcmludGsoS0VSTl9JTkZPICJOdW0gZW5kcG9pbnRzPSVkLiBJdCBpcyBub3QgRFM5NDkwUi5cbiIsIGlmYWNlX2Rlc2MtPmRlc2MuYk51bUVuZHBvaW50cyk7Ci0JCXJldHVybiAtRU5PREVWOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXRfY2xlYXI7CiAJfQogCi0JYXRvbWljX3NldCgmZHNfZGV2LT5yZWZjbnQsIDApOwotCW1lbXNldChkc19kZXYtPmVwLCAwLCBzaXplb2YoZHNfZGV2LT5lcCkpOwotCiAJLyoKIAkgKiBUaGlzIGxvb3AgZG9lc24nZCBzaG93IGNvbnRyb2wgMCBlbmRwb2ludCwKIAkgKiBzbyB3ZSB3aWxsIGZpbGwgb25seSAxLTMgZW5kcG9pbnRzIGVudHJ5LgpAQCAtNjc2LDU0ICs4NzQsMzEgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaWZhY2VfZGVzYy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyArK2kpIHsKIAkJZW5kcG9pbnQgPSAmaWZhY2VfZGVzYy0+ZW5kcG9pbnRbaV0uZGVzYzsKIAotCQlkc19kZXYtPmVwW2krMV0gPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKLQorCQlkZXYtPmVwW2krMV0gPSBlbmRwb2ludC0+YkVuZHBvaW50QWRkcmVzczsKKyNpZiAwCiAJCXByaW50aygiJWQ6IGFkZHI9JXgsIHNpemU9JWQsIGRpcj0lcywgdHlwZT0leFxuIiwKIAkJCWksIGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzLCBsZTE2X3RvX2NwdShlbmRwb2ludC0+d01heFBhY2tldFNpemUpLAogCQkJKGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTik/IklOIjoiT1VUIiwKIAkJCWVuZHBvaW50LT5ibUF0dHJpYnV0ZXMgJiBVU0JfRU5EUE9JTlRfWEZFUlRZUEVfTUFTSyk7Ci0JfQotCi0jaWYgMAotCXsKLQkJaW50IGVyciwgaTsKLQkJdTY0IGJ1ZlszXTsKLQkJdTY0IGluaXQ9MHhiMzAwMDAwMDIwNzhlZTgxdWxsOwotCQlzdHJ1Y3QgZHNfc3RhdHVzIHN0OwotCi0JCWRzX3Jlc2V0KGRzX2RldiwgJnN0KTsKLQkJZXJyID0gZHNfc2VhcmNoKGRzX2RldiwgaW5pdCwgYnVmLCAzLCAwKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQlmb3IgKGk9MDsgaTxlcnI7ICsraSkKLQkJCXByaW50aygiJWQ6ICVsbHhcbiIsIGksIGJ1ZltpXSk7Ci0KLQkJcHJpbnRrKCJSZXNldHRpbmcuLi5cbiIpOwotCQlkc19yZXNldChkc19kZXYsICZzdCk7Ci0JCXByaW50aygiU2V0dGluZyBwYXRoIGZvciAlbGx4LlxuIiwgaW5pdCk7Ci0JCWVyciA9IGRzX3NldF9wYXRoKGRzX2RldiwgaW5pdCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlwcmludGsoIkNhbGxpbmcgTUFUQ0hfQUNDRVNTLlxuIik7Ci0JCWVyciA9IGRzX21hdGNoX2FjY2Vzcyhkc19kZXYsIGluaXQpOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQotCQlwcmludGsoIlNlYXJjaGluZyB0aGUgYnVzLi4uXG4iKTsKLQkJZXJyID0gZHNfc2VhcmNoKGRzX2RldiwgaW5pdCwgYnVmLCAzLCAwKTsKLQotCQlwcmludGsoImRzX3NlYXJjaCgpIHJldHVybmVkICVkXG4iLCBlcnIpOwotCi0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJZm9yIChpPTA7IGk8ZXJyOyArK2kpCi0JCQlwcmludGsoIiVkOiAlbGx4XG4iLCBpLCBidWZbaV0pOwotCi0JCXJldHVybiAwOwotCX0KICNlbmRpZgorCX0KKworCWVyciA9IGRzX3cxX2luaXQoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXRfY2xlYXI7CisKKwltdXRleF9sb2NrKCZkc19tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmZGV2LT5kc19lbnRyeSwgJmRzX2RldmljZXMpOworCW11dGV4X3VubG9jaygmZHNfbXV0ZXgpOwogCiAJcmV0dXJuIDA7CisKK2Vycl9vdXRfY2xlYXI6CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwl1c2JfcHV0X2RldihkZXYtPnVkZXYpOworZXJyX291dF9mcmVlOgorCWtmcmVlKGRldik7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgZHNfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKQEAgLTczMSwxOSArOTA2LDE5IEBACiAJc3RydWN0IGRzX2RldmljZSAqZGV2OwogCiAJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZHNfbXV0ZXgpOworCWxpc3RfZGVsKCZkZXYtPmRzX2VudHJ5KTsKKwltdXRleF91bmxvY2soJmRzX211dGV4KTsKKworCWRzX3cxX2ZpbmkoZGV2KTsKKwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAKLQl3aGlsZSAoYXRvbWljX3JlYWQoJmRldi0+cmVmY250KSkgewotCQlwcmludGsoS0VSTl9JTkZPICJXYWl0aW5nIGZvciBEUyB0byBiZWNvbWUgZnJlZTogcmVmY250PSVkLlxuIiwKLQkJCQlhdG9taWNfcmVhZCgmZGV2LT5yZWZjbnQpKTsKLQotCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCi0JCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwotCX0KLQogCXVzYl9wdXRfZGV2KGRldi0+dWRldik7CiAJa2ZyZWUoZGV2KTsKLQlkc19kZXYgPSBOVUxMOwogfQogCiBzdGF0aWMgaW50IGRzX2luaXQodm9pZCkKQEAgLTc2OSwyNyArOTQ0LDQgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiRXZnZW5peSBQb2x5YWtvdiA8am9obnBvbEAya2EubWlwdC5ydT4iKTsKLQotRVhQT1JUX1NZTUJPTChkc190b3VjaF9iaXQpOwotRVhQT1JUX1NZTUJPTChkc19yZWFkX2J5dGUpOwotRVhQT1JUX1NZTUJPTChkc19yZWFkX2JpdCk7Ci1FWFBPUlRfU1lNQk9MKGRzX3JlYWRfYmxvY2spOwotRVhQT1JUX1NZTUJPTChkc193cml0ZV9ieXRlKTsKLUVYUE9SVF9TWU1CT0woZHNfd3JpdGVfYml0KTsKLUVYUE9SVF9TWU1CT0woZHNfd3JpdGVfYmxvY2spOwotRVhQT1JUX1NZTUJPTChkc19yZXNldCk7Ci1FWFBPUlRfU1lNQk9MKGRzX2dldF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChkc19wdXRfZGV2aWNlKTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGZvciBFRVBST00gcHJvZ3JhbW1pbmcsCi0gKiB3aGVuIGRyaXZlciB3aWxsIGJlIGluY2x1ZGVkIGludG8gbWFpbmxpbmUgdGhpcyB3aWxsCi0gKiByZXF1aXJlIHVuY29tbWVudGluZy4KLSAqLwotI2lmIDAKLUVYUE9SVF9TWU1CT0woZHNfc3RhcnRfcHVsc2UpOwotRVhQT1JUX1NZTUJPTChkc19zZXRfc3BlZWQpOwotRVhQT1JUX1NZTUJPTChkc19kZXRlY3QpOwotRVhQT1JUX1NZTUJPTChkc19zdG9wX3B1bHNlKTsKLUVYUE9SVF9TWU1CT0woZHNfc2VhcmNoKTsKLSNlbmRpZgorTU9EVUxFX0RFU0NSSVBUSU9OKCJEUzI0OTAgVVNCIDwtPiBXMSBidXMgbWFzdGVyIGRyaXZlciAoRFM5NDkwKikiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvbWFzdGVycy9kc193MV9icmlkZ2UuYyBiL2RyaXZlcnMvdzEvbWFzdGVycy9kc193MV9icmlkZ2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQzMDc4My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3cxL21hc3RlcnMvZHNfdzFfYnJpZGdlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqCWRzX3cxX2JyaWRnZS5jCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Ci0gKgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlICIuLi93MS5oIgotI2luY2x1ZGUgIi4uL3cxX2ludC5oIgotI2luY2x1ZGUgImRzY29yZS5oIgotCi1zdGF0aWMgc3RydWN0IGRzX2RldmljZSAqZHNfZGV2Owotc3RhdGljIHN0cnVjdCB3MV9idXNfbWFzdGVyICpkc19idXNfbWFzdGVyOwotCi1zdGF0aWMgdTggZHM5NDkwcl90b3VjaF9iaXQodm9pZCAqZGF0YSwgdTggYml0KQotewotCXU4IHJldDsKLQlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwotCi0JaWYgKGRzX3RvdWNoX2JpdChkZXYsIGJpdCwgJnJldCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZHM5NDkwcl93cml0ZV9iaXQodm9pZCAqZGF0YSwgdTggYml0KQotewotCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7Ci0KLQlkc193cml0ZV9iaXQoZGV2LCBiaXQpOwotfQotCi1zdGF0aWMgdm9pZCBkczk0OTByX3dyaXRlX2J5dGUodm9pZCAqZGF0YSwgdTggYnl0ZSkKLXsKLQlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwotCi0JZHNfd3JpdGVfYnl0ZShkZXYsIGJ5dGUpOwotfQotCi1zdGF0aWMgdTggZHM5NDkwcl9yZWFkX2JpdCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7Ci0JaW50IGVycjsKLQl1OCBiaXQgPSAwOwotCi0JZXJyID0gZHNfdG91Y2hfYml0KGRldiwgMSwgJmJpdCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIDA7Ci0JLy9lcnIgPSBkc19yZWFkX2JpdChkZXYsICZiaXQpOwotCS8vaWYgKGVycikKLQkvLwlyZXR1cm4gMDsKLQotCXJldHVybiBiaXQgJiAxOwotfQotCi1zdGF0aWMgdTggZHM5NDkwcl9yZWFkX2J5dGUodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwotCWludCBlcnI7Ci0JdTggYnl0ZSA9IDA7Ci0KLQllcnIgPSBkc19yZWFkX2J5dGUoZGV2LCAmYnl0ZSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYnl0ZTsKLX0KLQotc3RhdGljIHZvaWQgZHM5NDkwcl93cml0ZV9ibG9jayh2b2lkICpkYXRhLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7Ci0KLQlkc193cml0ZV9ibG9jayhkZXYsICh1OCAqKWJ1ZiwgbGVuKTsKLX0KLQotc3RhdGljIHU4IGRzOTQ5MHJfcmVhZF9ibG9jayh2b2lkICpkYXRhLCB1OCAqYnVmLCBpbnQgbGVuKQotewotCXN0cnVjdCBkc19kZXZpY2UgKmRldiA9IGRhdGE7Ci0JaW50IGVycjsKLQotCWVyciA9IGRzX3JlYWRfYmxvY2soZGV2LCBidWYsIGxlbik7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHU4IGRzOTQ5MHJfcmVzZXQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZHNfZGV2aWNlICpkZXYgPSBkYXRhOwotCXN0cnVjdCBkc19zdGF0dXMgc3Q7Ci0JaW50IGVycjsKLQotCW1lbXNldCgmc3QsIDAsIHNpemVvZihzdCkpOwotCi0JZXJyID0gZHNfcmVzZXQoZGV2LCAmc3QpOwotCWlmIChlcnIpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGRzX3cxX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZHNfYnVzX21hc3RlciA9IGttYWxsb2Moc2l6ZW9mKCpkc19idXNfbWFzdGVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkc19idXNfbWFzdGVyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGFsbG9jYXRlIERTOTQ5MFIgVVNCPC0+VzEgYnVzX21hc3RlciBzdHJ1Y3R1cmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZHNfZGV2ID0gZHNfZ2V0X2RldmljZSgpOwotCWlmICghZHNfZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRFM5NDkwUiBpcyBub3QgcmVnaXN0ZXJlZC5cbiIpOwotCQllcnIgPSAgLUVOT0RFVjsKLQkJZ290byBlcnJfb3V0X2ZyZWVfYnVzX21hc3RlcjsKLQl9Ci0KLQltZW1zZXQoZHNfYnVzX21hc3RlciwgMCwgc2l6ZW9mKCpkc19idXNfbWFzdGVyKSk7Ci0KLQlkc19idXNfbWFzdGVyLT5kYXRhCQk9IGRzX2RldjsKLQlkc19idXNfbWFzdGVyLT50b3VjaF9iaXQJPSAmZHM5NDkwcl90b3VjaF9iaXQ7Ci0JZHNfYnVzX21hc3Rlci0+cmVhZF9iaXQJCT0gJmRzOTQ5MHJfcmVhZF9iaXQ7Ci0JZHNfYnVzX21hc3Rlci0+d3JpdGVfYml0CT0gJmRzOTQ5MHJfd3JpdGVfYml0OwotCWRzX2J1c19tYXN0ZXItPnJlYWRfYnl0ZQk9ICZkczk0OTByX3JlYWRfYnl0ZTsKLQlkc19idXNfbWFzdGVyLT53cml0ZV9ieXRlCT0gJmRzOTQ5MHJfd3JpdGVfYnl0ZTsKLQlkc19idXNfbWFzdGVyLT5yZWFkX2Jsb2NrCT0gJmRzOTQ5MHJfcmVhZF9ibG9jazsKLQlkc19idXNfbWFzdGVyLT53cml0ZV9ibG9jawk9ICZkczk0OTByX3dyaXRlX2Jsb2NrOwotCWRzX2J1c19tYXN0ZXItPnJlc2V0X2J1cwk9ICZkczk0OTByX3Jlc2V0OwotCi0JZXJyID0gdzFfYWRkX21hc3Rlcl9kZXZpY2UoZHNfYnVzX21hc3Rlcik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X3B1dF9kZXZpY2U7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX291dF9wdXRfZGV2aWNlOgotCWRzX3B1dF9kZXZpY2UoZHNfZGV2KTsKLWVycl9vdXRfZnJlZV9idXNfbWFzdGVyOgotCWtmcmVlKGRzX2J1c19tYXN0ZXIpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGRzX3cxX2Zpbmkodm9pZCkKLXsKLQl3MV9yZW1vdmVfbWFzdGVyX2RldmljZShkc19idXNfbWFzdGVyKTsKLQlkc19wdXRfZGV2aWNlKGRzX2Rldik7Ci0Ja2ZyZWUoZHNfYnVzX21hc3Rlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGRzX3cxX2luaXQpOwotbW9kdWxlX2V4aXQoZHNfdzFfZmluaSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIkV2Z2VuaXkgUG9seWFrb3YgPGpvaG5wb2xAMmthLm1pcHQucnU+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL21hc3RlcnMvZHNjb3JlLmggYi9kcml2ZXJzL3cxL21hc3RlcnMvZHNjb3JlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjU2NzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy93MS9tYXN0ZXJzL2RzY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKglkc2NvcmUuaAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBFdmdlbml5IFBvbHlha292IDxqb2hucG9sQDJrYS5taXB0LnJ1PgotICoKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpZm5kZWYgX19EU0NPUkVfSAotI2RlZmluZSBfX0RTQ09SRV9ICi0KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+Ci0KLS8qIENPTU1BTkQgVFlQRSBDT0RFUyAqLwotI2RlZmluZSBDT05UUk9MX0NNRAkJCTB4MDAKLSNkZWZpbmUgQ09NTV9DTUQJCQkweDAxCi0jZGVmaW5lIE1PREVfQ01ECQkJMHgwMgotCi0vKiBDT05UUk9MIENPTU1BTkQgQ09ERVMgKi8KLSNkZWZpbmUgQ1RMX1JFU0VUX0RFVklDRQkJMHgwMDAwCi0jZGVmaW5lIENUTF9TVEFSVF9FWEUJCQkweDAwMDEKLSNkZWZpbmUgQ1RMX1JFU1VNRV9FWEUJCQkweDAwMDIKLSNkZWZpbmUgQ1RMX0hBTFRfRVhFX0lETEUJCTB4MDAwMwotI2RlZmluZSBDVExfSEFMVF9FWEVfRE9ORQkJMHgwMDA0Ci0jZGVmaW5lIENUTF9GTFVTSF9DT01NX0NNRFMJCTB4MDAwNwotI2RlZmluZSBDVExfRkxVU0hfUkNWX0JVRkZFUgkJMHgwMDA4Ci0jZGVmaW5lIENUTF9GTFVTSF9YTVRfQlVGRkVSCQkweDAwMDkKLSNkZWZpbmUgQ1RMX0dFVF9DT01NX0NNRFMJCTB4MDAwQQotCi0vKiBNT0RFIENPTU1BTkQgQ09ERVMgKi8KLSNkZWZpbmUgTU9EX1BVTFNFX0VOCQkJMHgwMDAwCi0jZGVmaW5lIE1PRF9TUEVFRF9DSEFOR0VfRU4JCTB4MDAwMQotI2RlZmluZSBNT0RfMVdJUkVfU1BFRUQJCQkweDAwMDIKLSNkZWZpbmUgTU9EX1NUUk9OR19QVV9EVVJBVElPTgkJMHgwMDAzCi0jZGVmaW5lIE1PRF9QVUxMRE9XTl9TTEVXUkFURQkJMHgwMDA0Ci0jZGVmaW5lIE1PRF9QUk9HX1BVTFNFX0RVUkFUSU9OCQkweDAwMDUKLSNkZWZpbmUgTU9EX1dSSVRFMV9MT1dUSU1FCQkweDAwMDYKLSNkZWZpbmUgTU9EX0RTT1cwX1RSRUMJCQkweDAwMDcKLQotLyogQ09NTVVOSUNBVElPTiBDT01NQU5EIENPREVTICovCi0jZGVmaW5lIENPTU1fRVJST1JfRVNDQVBFCQkweDA2MDEKLSNkZWZpbmUgQ09NTV9TRVRfRFVSQVRJT04JCTB4MDAxMgotI2RlZmluZSBDT01NX0JJVF9JTwkJCTB4MDAyMAotI2RlZmluZSBDT01NX1BVTFNFCQkJMHgwMDMwCi0jZGVmaW5lIENPTU1fMV9XSVJFX1JFU0VUCQkweDAwNDIKLSNkZWZpbmUgQ09NTV9CWVRFX0lPCQkJMHgwMDUyCi0jZGVmaW5lIENPTU1fTUFUQ0hfQUNDRVNTCQkweDAwNjQKLSNkZWZpbmUgQ09NTV9CTE9DS19JTwkJCTB4MDA3NAotI2RlZmluZSBDT01NX1JFQURfU1RSQUlHSFQJCTB4MDA4MAotI2RlZmluZSBDT01NX0RPX1JFTEVBU0UJCQkweDYwOTIKLSNkZWZpbmUgQ09NTV9TRVRfUEFUSAkJCTB4MDBBMgotI2RlZmluZSBDT01NX1dSSVRFX1NSQU1fUEFHRQkJMHgwMEIyCi0jZGVmaW5lIENPTU1fV1JJVEVfRVBST00JCTB4MDBDNAotI2RlZmluZSBDT01NX1JFQURfQ1JDX1BST1RfUEFHRQkJMHgwMEQ0Ci0jZGVmaW5lIENPTU1fUkVBRF9SRURJUkVDVF9QQUdFX0NSQwkweDIxRTQKLSNkZWZpbmUgQ09NTV9TRUFSQ0hfQUNDRVNTCQkweDAwRjQKLQotLyogQ29tbXVuaWNhdGlvbiBjb21tYW5kIGJpdHMgKi8KLSNkZWZpbmUgQ09NTV9UWVBFCQkJMHgwMDA4Ci0jZGVmaW5lIENPTU1fU0UJCQkJMHgwMDA4Ci0jZGVmaW5lIENPTU1fRAkJCQkweDAwMDgKLSNkZWZpbmUgQ09NTV9aCQkJCTB4MDAwOAotI2RlZmluZSBDT01NX0NICQkJCTB4MDAwOAotI2RlZmluZSBDT01NX1NNCQkJCTB4MDAwOAotI2RlZmluZSBDT01NX1IJCQkJMHgwMDA4Ci0jZGVmaW5lIENPTU1fSU0JCQkJMHgwMDAxCi0KLSNkZWZpbmUgQ09NTV9QUwkJCQkweDQwMDAKLSNkZWZpbmUgQ09NTV9QU1QJCQkweDQwMDAKLSNkZWZpbmUgQ09NTV9DSUIJCQkweDQwMDAKLSNkZWZpbmUgQ09NTV9SVFMJCQkweDQwMDAKLSNkZWZpbmUgQ09NTV9EVAkJCQkweDIwMDAKLSNkZWZpbmUgQ09NTV9TUFUJCQkweDEwMDAKLSNkZWZpbmUgQ09NTV9GCQkJCTB4MDgwMAotI2RlZmluZSBDT01NX05UUAkJCTB4MDQwMAotI2RlZmluZSBDT01NX0lDUAkJCTB4MDIwMAotI2RlZmluZSBDT01NX1JTVAkJCTB4MDEwMAotCi0jZGVmaW5lIFBVTFNFX1BST0cJCQkweDAxCi0jZGVmaW5lIFBVTFNFX1NQVUUJCQkweDAyCi0KLSNkZWZpbmUgQlJBTkNIX01BSU4JCQkweENDCi0jZGVmaW5lIEJSQU5DSF9BVVgJCQkweDMzCi0KLS8qCi0gKiBEdXJhdGlvbiBvZiB0aGUgc3Ryb25nIHB1bGwtdXAgcHVsc2UgaW4gbWlsbGlzZWNvbmRzLgotICovCi0jZGVmaW5lIFBVTExVUF9QVUxTRV9EVVJBVElPTgkJNzUwCi0KLS8qIFN0YXR1cyBmbGFncyAqLwotI2RlZmluZSBTVF9TUFVBCQkJCTB4MDEgIC8qIFN0cm9uZyBQdWxsLXVwIGlzIGFjdGl2ZSAqLwotI2RlZmluZSBTVF9QUkdBCQkJCTB4MDIgIC8qIDEyViBwcm9ncmFtbWluZyBwdWxzZSBpcyBiZWluZyBnZW5lcmF0ZWQgKi8KLSNkZWZpbmUgU1RfMTJWUAkJCQkweDA0ICAvKiBleHRlcm5hbCAxMlYgcHJvZ3JhbW1pbmcgdm9sdGFnZSBpcyBwcmVzZW50ICovCi0jZGVmaW5lIFNUX1BNT0QJCQkJMHgwOCAgLyogRFMyNDkwIHBvd2VyZWQgZnJvbSBVU0IgYW5kIGV4dGVybmFsIHNvdXJjZXMgKi8KLSNkZWZpbmUgU1RfSEFMVAkJCQkweDEwICAvKiBEUzI0OTAgaXMgY3VycmVudGx5IGhhbHRlZCAqLwotI2RlZmluZSBTVF9JRExFCQkJCTB4MjAgIC8qIERTMjQ5MCBpcyBjdXJyZW50bHkgaWRsZSAqLwotI2RlZmluZSBTVF9FUE9GCQkJCTB4ODAKLQotI2RlZmluZSBTUEVFRF9OT1JNQUwJCQkweDAwCi0jZGVmaW5lIFNQRUVEX0ZMRVhJQkxFCQkJMHgwMQotI2RlZmluZSBTUEVFRF9PVkVSRFJJVkUJCQkweDAyCi0KLSNkZWZpbmUgTlVNX0VQCQkJCTQKLSNkZWZpbmUgRVBfQ09OVFJPTAkJCTAKLSNkZWZpbmUgRVBfU1RBVFVTCQkJMQotI2RlZmluZSBFUF9EQVRBX09VVAkJCTIKLSNkZWZpbmUgRVBfREFUQV9JTgkJCTMKLQotc3RydWN0IGRzX2RldmljZQotewotCXN0cnVjdCB1c2JfZGV2aWNlCSp1ZGV2OwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlCSppbnRmOwotCi0JaW50CQkJZXBbTlVNX0VQXTsKLQotCWF0b21pY190CQlyZWZjbnQ7Ci19OwotCi1zdHJ1Y3QgZHNfc3RhdHVzCi17Ci0JdTgJCQllbmFibGU7Ci0JdTgJCQlzcGVlZDsKLQl1OAkJCXB1bGx1cF9kdXI7Ci0JdTgJCQlwcHVsc19kdXI7Ci0JdTgJCQlwdWxsZG93bl9zbGV3OwotCXU4CQkJd3JpdGUxX3RpbWU7Ci0JdTgJCQl3cml0ZTBfdGltZTsKLQl1OAkJCXJlc2VydmVkMDsKLQl1OAkJCXN0YXR1czsKLQl1OAkJCWNvbW1hbmQwOwotCXU4CQkJY29tbWFuZDE7Ci0JdTgJCQljb21tYW5kX2J1ZmZlcl9zdGF0dXM7Ci0JdTgJCQlkYXRhX291dF9idWZmZXJfc3RhdHVzOwotCXU4CQkJZGF0YV9pbl9idWZmZXJfc3RhdHVzOwotCXU4CQkJcmVzZXJ2ZWQxOwotCXU4CQkJcmVzZXJ2ZWQyOwotCi19OwotCi1pbnQgZHNfdG91Y2hfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTgsIHU4ICopOwotaW50IGRzX3JlYWRfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICosIHU4ICopOwotaW50IGRzX3JlYWRfYml0KHN0cnVjdCBkc19kZXZpY2UgKiwgdTggKik7Ci1pbnQgZHNfd3JpdGVfYnl0ZShzdHJ1Y3QgZHNfZGV2aWNlICosIHU4KTsKLWludCBkc193cml0ZV9iaXQoc3RydWN0IGRzX2RldmljZSAqLCB1OCk7Ci1pbnQgZHNfcmVzZXQoc3RydWN0IGRzX2RldmljZSAqLCBzdHJ1Y3QgZHNfc3RhdHVzICopOwotc3RydWN0IGRzX2RldmljZSAqIGRzX2dldF9kZXZpY2Uodm9pZCk7Ci12b2lkIGRzX3B1dF9kZXZpY2Uoc3RydWN0IGRzX2RldmljZSAqKTsKLWludCBkc193cml0ZV9ibG9jayhzdHJ1Y3QgZHNfZGV2aWNlICosIHU4ICosIGludCk7Ci1pbnQgZHNfcmVhZF9ibG9jayhzdHJ1Y3QgZHNfZGV2aWNlICosIHU4ICosIGludCk7Ci0KLSNlbmRpZiAvKiBfX0RTQ09SRV9IICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcgYi9kcml2ZXJzL3cxL3NsYXZlcy9LY29uZmlnCmluZGV4IGY5ZDRjOTEuLmQxOGQ2NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL0tjb25maWcKKysrIGIvZHJpdmVycy93MS9zbGF2ZXMvS2NvbmZpZwpAQCAtMjgsNyArMjgsNyBAQAogCiBjb25maWcgVzFfU0xBVkVfRFMyNDMzX0NSQwogCWJvb2wgIlByb3RlY3QgRFMyNDMzIGRhdGEgd2l0aCBhIENSQzE2IgotCWRlcGVuZHMgb24gVzFfRFMyNDMzCisJZGVwZW5kcyBvbiBXMV9TTEFWRV9EUzI0MzMKIAlzZWxlY3QgQ1JDMTYKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIHByb3RlY3QgRFMyNDMzIGRhdGEgd2l0aCBhIENSQzE2LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfZHMyNDMzLmMgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MzMuYwppbmRleCBmYjExOGJlLi4yYWMyMzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MzMuYworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9kczI0MzMuYwpAQCAtMjIsNyArMjIsNiBAQAogI2VuZGlmCiAKICNpbmNsdWRlICIuLi93MS5oIgotI2luY2x1ZGUgIi4uL3cxX2lvLmgiCiAjaW5jbHVkZSAiLi4vdzFfaW50LmgiCiAjaW5jbHVkZSAiLi4vdzFfZmFtaWx5LmgiCiAKQEAgLTEwNiwxMSArMTA1LDcgQEAKIAlpZiAoKGNvdW50ID0gdzFfZjIzX2ZpeF9jb3VudChvZmYsIGNvdW50LCBXMV9FRVBST01fU0laRSkpID09IDApCiAJCXJldHVybiAwOwogCi0JYXRvbWljX2luYygmc2wtPnJlZmNudCk7Ci0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmc2wtPm1hc3Rlci0+bXV0ZXgpKSB7Ci0JCWNvdW50ID0gMDsKLQkJZ290byBvdXRfZGVjOwotCX0KKwltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CiAKICNpZmRlZiBDT05GSUdfVzFfRjIzX0NSQwogCkBAIC0xNDEsOSArMTM2LDcgQEAKICNlbmRpZgkvKiBDT05GSUdfVzFfRjIzX0NSQyAqLwogCiBvdXRfdXA6Ci0JdXAoJnNsLT5tYXN0ZXItPm11dGV4KTsKLW91dF9kZWM6Ci0JYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisJbXV0ZXhfdW5sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yMzIsMTEgKzIyNSw3IEBACiAJfQogI2VuZGlmCS8qIENPTkZJR19XMV9GMjNfQ1JDICovCiAKLQlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzbC0+bWFzdGVyLT5tdXRleCkpIHsKLQkJY291bnQgPSAwOwotCQlnb3RvIG91dF9kZWM7Ci0JfQorCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKIAogCS8qIENhbiBvbmx5IHdyaXRlIGRhdGEgdG8gb25lIHBhZ2UgYXQgYSB0aW1lICovCiAJaWR4ID0gMDsKQEAgLTI1NCw5ICsyNDMsNyBAQAogCX0KIAogb3V0X3VwOgotCXVwKCZzbC0+bWFzdGVyLT5tdXRleCk7Ci1vdXRfZGVjOgotCWF0b21pY19kZWMoJnNsLT5yZWZjbnQpOworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOwogCiAJcmV0dXJuIGNvdW50OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS9zbGF2ZXMvdzFfc21lbS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfc21lbS5jCmluZGV4IGM2ZDNiZTUuLmNjOGMwMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3NtZW0uYworKysgYi9kcml2ZXJzL3cxL3NsYXZlcy93MV9zbWVtLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAjaW5jbHVkZSAiLi4vdzEuaCIKLSNpbmNsdWRlICIuLi93MV9pby5oIgogI2luY2x1ZGUgIi4uL3cxX2ludC5oIgogI2luY2x1ZGUgIi4uL3cxX2ZhbWlseS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jIGIvZHJpdmVycy93MS9zbGF2ZXMvdzFfdGhlcm0uYwppbmRleCA1MzZkMTZkLi41MzcyY2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3NsYXZlcy93MV90aGVybS5jCisrKyBiL2RyaXZlcnMvdzEvc2xhdmVzL3cxX3RoZXJtLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSAiLi4vdzEuaCIKLSNpbmNsdWRlICIuLi93MV9pby5oIgogI2luY2x1ZGUgIi4uL3cxX2ludC5oIgogI2luY2x1ZGUgIi4uL3cxX2ZhbWlseS5oIgogCkBAIC0xNjYsMTIgKzE2NSw3IEBACiAJdTggcm9tWzldLCBjcmMsIHZlcmRpY3Q7CiAJaW50IGksIG1heF90cnlpbmcgPSAxMDsKIAotCWF0b21pY19pbmMoJnNsLT5yZWZjbnQpOwotCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwotCWlmIChkb3duX2ludGVycnVwdGlibGUoJnNsLT5tYXN0ZXItPm11dGV4KSkgewotCQljb3VudCA9IDA7Ci0JCWdvdG8gb3V0X2RlYzsKLQl9CisJbXV0ZXhfbG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOwogCiAJaWYgKG9mZiA+IFcxX1NMQVZFX0RBVEFfU0laRSkgewogCQljb3VudCA9IDA7CkBAIC0yMzQsMTAgKzIyOCw3IEBACiAKIAljb3VudCArPSBzcHJpbnRmKGJ1ZiArIGNvdW50LCAidD0lZFxuIiwgdzFfY29udmVydF90ZW1wKHJvbSwgc2wtPmZhbWlseS0+ZmlkKSk7CiBvdXQ6Ci0JdXAoJmRldi0+bXV0ZXgpOwotb3V0X2RlYzoKLQlzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCk7Ci0JYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAogCXJldHVybiBjb3VudDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzEuYyBiL2RyaXZlcnMvdzEvdzEuYwppbmRleCBhNjk4YjUxLi5kZTNlOTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxLmMKKysrIGIvZHJpdmVycy93MS93MS5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAjaW5jbHVkZSAidzEuaCIKLSNpbmNsdWRlICJ3MV9pby5oIgogI2luY2x1ZGUgIncxX2xvZy5oIgogI2luY2x1ZGUgIncxX2ludC5oIgogI2luY2x1ZGUgIncxX2ZhbWlseS5oIgpAQCAtNTUsNyArNTQsNyBAQAogbW9kdWxlX3BhcmFtX25hbWVkKG1heF9zbGF2ZV9jb3VudCwgdzFfbWF4X3NsYXZlX2NvdW50LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtX25hbWVkKHNsYXZlX3R0bCwgdzFfbWF4X3NsYXZlX3R0bCwgaW50LCAwKTsKIAotREVGSU5FX1NQSU5MT0NLKHcxX21sb2NrKTsKK0RFRklORV9NVVRFWCh3MV9tbG9jayk7CiBMSVNUX0hFQUQodzFfbWFzdGVycyk7CiAKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKncxX2NvbnRyb2xfdGhyZWFkOwpAQCAtNzUsOCArNzQsNiBAQAogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCiAJZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIG1kLT5uYW1lKTsKLQotCWRldl9maW5pX25ldGxpbmsobWQpOwogCW1lbXNldChtZCwgMCwgc2l6ZW9mKHN0cnVjdCB3MV9tYXN0ZXIpICsgc2l6ZW9mKHN0cnVjdCB3MV9idXNfbWFzdGVyKSk7CiAJa2ZyZWUobWQpOwogfQpAQCAtODUsMTAgKzgyLDEwIEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGRldl90b193MV9zbGF2ZShkZXYpOwogCi0JZGV2X2RiZyhkZXYsICIlczogUmVsZWFzaW5nICVzLlxuIiwgX19mdW5jX18sIHNsLT5uYW1lKTsKKwlwcmludGsoIiVzOiBSZWxlYXNpbmcgJXMuXG4iLCBfX2Z1bmNfXywgc2wtPm5hbWUpOwogCiAJd2hpbGUgKGF0b21pY19yZWFkKCZzbC0+cmVmY250KSkgewotCQlkZXZfZGJnKGRldiwgIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAorCQlwcmludGsoIldhaXRpbmcgZm9yICVzIHRvIGJlY29tZSBmcmVlOiByZWZjbnQ9JWQuXG4iLAogCQkJCXNsLT5uYW1lLCBhdG9taWNfcmVhZCgmc2wtPnJlZmNudCkpOwogCQlpZiAobXNsZWVwX2ludGVycnVwdGlibGUoMTAwMCkpCiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwpAQCAtMTExLDcgKzEwOCw2IEBACiB7CiAJc3RydWN0IHcxX3NsYXZlICpzbCA9IGtvYmpfdG9fdzFfc2xhdmUoa29iaik7CiAKLQlhdG9taWNfaW5jKCZzbC0+cmVmY250KTsKIAlpZiAob2ZmID4gOCkgewogCQljb3VudCA9IDA7CiAJfSBlbHNlIHsKQEAgLTEyMCw3ICsxMTYsNiBAQAogCiAJCW1lbWNweShidWYsICh1OCAqKSZzbC0+cmVnX251bSwgY291bnQpOwogCX0KLQlhdG9taWNfZGVjKCZzbC0+cmVmY250KTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTEzOSw3ICsxMzQsNjMgQEAKIH07CiAKIC8qIERlZmF1bHQgZmFtaWx5ICovCi1zdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9kZWZhdWx0X2ZhbWlseTsKKworc3RhdGljIHNzaXplX3QgdzFfZGVmYXVsdF93cml0ZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHcxX3NsYXZlICpzbCA9IGtvYmpfdG9fdzFfc2xhdmUoa29iaik7CisKKwltdXRleF9sb2NrKCZzbC0+bWFzdGVyLT5tdXRleCk7CisJaWYgKHcxX3Jlc2V0X3NlbGVjdF9zbGF2ZShzbCkpIHsKKwkJY291bnQgPSAwOworCQlnb3RvIG91dF91cDsKKwl9CisKKwl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBidWYsIGNvdW50KTsKKworb3V0X3VwOgorCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgdzFfZGVmYXVsdF9yZWFkKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsID0ga29ial90b193MV9zbGF2ZShrb2JqKTsKKworCW11dGV4X2xvY2soJnNsLT5tYXN0ZXItPm11dGV4KTsKKwl3MV9yZWFkX2Jsb2NrKHNsLT5tYXN0ZXIsIGJ1ZiwgY291bnQpOworCW11dGV4X3VubG9jaygmc2wtPm1hc3Rlci0+bXV0ZXgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHcxX2RlZmF1bHRfYXR0ciA9IHsKKyAgICAgIC5hdHRyID0geworICAgICAgICAgICAgICAubmFtZSA9ICJydyIsCisgICAgICAgICAgICAgIC5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IsCisgICAgICAgICAgICAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorICAgICAgfSwKKyAgICAgIC5zaXplID0gUEFHRV9TSVpFLAorICAgICAgLnJlYWQgPSB3MV9kZWZhdWx0X3JlYWQsCisgICAgICAud3JpdGUgPSB3MV9kZWZhdWx0X3dyaXRlLAorfTsKKworc3RhdGljIGludCB3MV9kZWZhdWx0X2FkZF9zbGF2ZShzdHJ1Y3QgdzFfc2xhdmUgKnNsKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNsLT5kZXYua29iaiwgJncxX2RlZmF1bHRfYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHcxX2RlZmF1bHRfcmVtb3ZlX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wpCit7CisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZzbC0+ZGV2LmtvYmosICZ3MV9kZWZhdWx0X2F0dHIpOworfQorCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseV9vcHMgdzFfZGVmYXVsdF9mb3BzID0geworCS5hZGRfc2xhdmUJPSB3MV9kZWZhdWx0X2FkZF9zbGF2ZSwKKwkucmVtb3ZlX3NsYXZlCT0gdzFfZGVmYXVsdF9yZW1vdmVfc2xhdmUsCit9OworCitzdGF0aWMgc3RydWN0IHcxX2ZhbWlseSB3MV9kZWZhdWx0X2ZhbWlseSA9IHsKKwkuZm9wcyA9ICZ3MV9kZWZhdWx0X2ZvcHMsCit9OwogCiBzdGF0aWMgaW50IHcxX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKTsKIApAQCAtMTgzLDEyICsyMzQsOSBAQAogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCXNzaXplX3QgY291bnQ7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbWQtPm11dGV4KSkKLQkJcmV0dXJuIC1FQlVTWTsKLQorCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJY291bnQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBtZC0+bmFtZSk7Ci0KLQl1cCgmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xOTksMTIgKzI0Nyw5IEBACiB7CiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAKLQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmbWQtPm11dGV4KSkKLQkJcmV0dXJuIC1FQlVTWTsKLQorCW11dGV4X2xvY2soJm1kLT5tdXRleCk7CiAJbWQtPnNlYXJjaF9jb3VudCA9IHNpbXBsZV9zdHJ0b2woYnVmLCBOVUxMLCAwKTsKLQotCXVwKCZtZC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKIAogCXJldHVybiBjb3VudDsKIH0KQEAgLTIxNiwxMiArMjYxLDkgQEAKIAlzdHJ1Y3QgdzFfbWFzdGVyICptZCA9IGRldl90b193MV9tYXN0ZXIoZGV2KTsKIAlzc2l6ZV90IGNvdW50OwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJm1kLT5tdXRleCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwgbWQtPnNlYXJjaF9jb3VudCk7Ci0KLQl1cCgmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yMzEsMTIgKzI3Myw5IEBACiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCWNvdW50ID0gc3ByaW50ZihidWYsICIweCVwXG4iLCBtZC0+YnVzX21hc3Rlcik7Ci0KLQl1cCgmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yNTIsMTIgKzI5MSw5IEBACiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwgbWQtPm1heF9zbGF2ZV9jb3VudCk7Ci0KLQl1cCgmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yNjYsMTIgKzMwMiw5IEBACiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCWNvdW50ID0gc3ByaW50ZihidWYsICIlbHVcbiIsIG1kLT5hdHRlbXB0cyk7Ci0KLQl1cCgmbWQtPm11dGV4KTsKKwltdXRleF91bmxvY2soJm1kLT5tdXRleCk7CiAJcmV0dXJuIGNvdW50OwogfQogCkBAIC0yODAsMTIgKzMxMyw5IEBACiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBkZXZfdG9fdzFfbWFzdGVyKGRldik7CiAJc3NpemVfdCBjb3VudDsKIAotCWlmIChkb3duX2ludGVycnVwdGlibGUoJm1kLT5tdXRleCkpCi0JCXJldHVybiAtRUJVU1k7Ci0KKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCWNvdW50ID0gc3ByaW50ZihidWYsICIlZFxuIiwgbWQtPnNsYXZlX2NvdW50KTsKLQotCXVwKCZtZC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmbWQtPm11dGV4KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTI5NCw4ICszMjQsNyBAQAogCXN0cnVjdCB3MV9tYXN0ZXIgKm1kID0gZGV2X3RvX3cxX21hc3RlcihkZXYpOwogCWludCBjID0gUEFHRV9TSVpFOwogCi0JaWYgKGRvd25faW50ZXJydXB0aWJsZSgmbWQtPm11dGV4KSkKLQkJcmV0dXJuIC1FQlVTWTsKKwltdXRleF9sb2NrKCZtZC0+bXV0ZXgpOwogCiAJaWYgKG1kLT5zbGF2ZV9jb3VudCA9PSAwKQogCQljIC09IHNucHJpbnRmKGJ1ZiArIFBBR0VfU0laRSAtIGMsIGMsICJub3QgZm91bmQuXG4iKTsKQEAgLTMxMCw3ICszMzksNyBAQAogCQl9CiAJfQogCi0JdXAoJm1kLT5tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZtZC0+bXV0ZXgpOwogCiAJcmV0dXJuIFBBR0VfU0laRSAtIGM7CiB9CkBAIC0zNjIsNyArMzkxLDggQEAKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHCi1zdGF0aWMgaW50IHcxX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplKQorc3RhdGljIGludCB3MV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICoqZW52cCwgaW50IG51bV9lbnZwLAorCQkJY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqbWQgPSBOVUxMOwogCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBOVUxMOwpAQCAtMzgyLDcgKzQxMiw4IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRldl9kYmcoZGV2LCAiSG90cGx1ZyBldmVudCBmb3IgJXMgJXMsIGJ1c19pZD0lcy5cbiIsIGV2ZW50X293bmVyLCBuYW1lLCBkZXYtPmJ1c19pZCk7CisJZGV2X2RiZyhkZXYsICJIb3RwbHVnIGV2ZW50IGZvciAlcyAlcywgYnVzX2lkPSVzLlxuIiwKKwkJCWV2ZW50X293bmVyLCBuYW1lLCBkZXYtPmJ1c19pZCk7CiAKIAlpZiAoZGV2LT5kcml2ZXIgIT0gJncxX3NsYXZlX2RyaXZlciB8fCAhc2wpCiAJCXJldHVybiAwOwpAQCAtNDAxLDcgKzQzMiw4IEBACiAJcmV0dXJuIDA7CiB9OwogI2Vsc2UKLXN0YXRpYyBpbnQgdzFfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqKmVudnAsIGludCBudW1fZW52cCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpCitzdGF0aWMgaW50IHcxX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQljaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNSw3ICs0NTcsOCBAQAogCQkgKHVuc2lnbmVkIGludCkgc2wtPnJlZ19udW0uZmFtaWx5LAogCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2wtPnJlZ19udW0uaWQpOwogCi0JZGV2X2RiZygmc2wtPmRldiwgIiVzOiByZWdpc3RlcmluZyAlcyBhcyAlcC5cbiIsIF9fZnVuY19fLCAmc2wtPmRldi5idXNfaWRbMF0pOworCWRldl9kYmcoJnNsLT5kZXYsICIlczogcmVnaXN0ZXJpbmcgJXMgYXMgJXAuXG4iLCBfX2Z1bmNfXywKKwkJJnNsLT5kZXYuYnVzX2lkWzBdKTsKIAogCWVyciA9IGRldmljZV9yZWdpc3Rlcigmc2wtPmRldik7CiAJaWYgKGVyciA8IDApIHsKQEAgLTQ5Niw2ICs1MjksNyBAQAogCXNsLT5tYXN0ZXIgPSBkZXY7CiAJc2V0X2JpdChXMV9TTEFWRV9BQ1RJVkUsIChsb25nICopJnNsLT5mbGFncyk7CiAKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1lbWNweSgmc2wtPnJlZ19udW0sIHJuLCBzaXplb2Yoc2wtPnJlZ19udW0pKTsKIAlhdG9taWNfc2V0KCZzbC0+cmVmY250LCAwKTsKIAlpbml0X2NvbXBsZXRpb24oJnNsLT5yZWxlYXNlZCk7CkBAIC01MjYsNyArNTYwLDcgQEAKIAlzbC0+dHRsID0gZGV2LT5zbGF2ZV90dGw7CiAJZGV2LT5zbGF2ZV9jb3VudCsrOwogCi0JbWVtY3B5KCZtc2cuaWQuaWQsIHJuLCBzaXplb2YobXNnLmlkLmlkKSk7CisJbWVtY3B5KG1zZy5pZC5pZCwgcm4sIHNpemVvZihtc2cuaWQpKTsKIAltc2cudHlwZSA9IFcxX1NMQVZFX0FERDsKIAl3MV9uZXRsaW5rX3NlbmQoZGV2LCAmbXNnKTsKIApAQCAtNTQ0LDcgKzU3OCw4IEBACiAJaWYgKHNsLT5mYW1pbHktPmZvcHMgJiYgc2wtPmZhbWlseS0+Zm9wcy0+cmVtb3ZlX3NsYXZlKQogCQlzbC0+ZmFtaWx5LT5mb3BzLT5yZW1vdmVfc2xhdmUoc2wpOwogCi0JbWVtY3B5KCZtc2cuaWQuaWQsICZzbC0+cmVnX251bSwgc2l6ZW9mKG1zZy5pZC5pZCkpOworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbWVtY3B5KG1zZy5pZC5pZCwgJnNsLT5yZWdfbnVtLCBzaXplb2YobXNnLmlkKSk7CiAJbXNnLnR5cGUgPSBXMV9TTEFWRV9SRU1PVkU7CiAJdzFfbmV0bGlua19zZW5kKHNsLT5tYXN0ZXIsICZtc2cpOwogCkBAIC01NjEsNyArNTk2LDcgQEAKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXY7CiAJaW50IGZvdW5kID0gMDsKIAotCXNwaW5fbG9ja19iaCgmdzFfbWxvY2spOworCW11dGV4X2xvY2soJncxX21sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJncxX21hc3RlcnMsIHcxX21hc3Rlcl9lbnRyeSkgewogCQlpZiAoZGV2LT5idXNfbWFzdGVyLT5kYXRhID09IGRhdGEpIHsKIAkJCWZvdW5kID0gMTsKQEAgLTU2OSwyMiArNjA0LDY5IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlzcGluX3VubG9ja19iaCgmdzFfbWxvY2spOworCW11dGV4X3VubG9jaygmdzFfbWxvY2spOwogCiAJcmV0dXJuIChmb3VuZCk/ZGV2Ok5VTEw7CiB9CiAKK3N0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKQoreworCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwlpbnQgZm91bmQgPSAwOworCisJbXV0ZXhfbG9jaygmdzFfbWxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmdzFfbWFzdGVycywgdzFfbWFzdGVyX2VudHJ5KSB7CisJCWlmIChkZXYtPmlkID09IGlkKSB7CisJCQlmb3VuZCA9IDE7CisJCQlhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7CisJCQlicmVhazsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJncxX21sb2NrKTsKKworCXJldHVybiAoZm91bmQpP2RldjpOVUxMOworfQorCitzdHJ1Y3QgdzFfc2xhdmUgKncxX3NlYXJjaF9zbGF2ZShzdHJ1Y3QgdzFfcmVnX251bSAqaWQpCit7CisJc3RydWN0IHcxX21hc3RlciAqZGV2OworCXN0cnVjdCB3MV9zbGF2ZSAqc2wgPSBOVUxMOworCWludCBmb3VuZCA9IDA7CisKKwltdXRleF9sb2NrKCZ3MV9tbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2wsICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQkJaWYgKHNsLT5yZWdfbnVtLmZhbWlseSA9PSBpZC0+ZmFtaWx5ICYmCisJCQkJCXNsLT5yZWdfbnVtLmlkID09IGlkLT5pZCAmJgorCQkJCQlzbC0+cmVnX251bS5jcmMgPT0gaWQtPmNyYykgeworCQkJCWZvdW5kID0gMTsKKwkJCQlhdG9taWNfaW5jKCZkZXYtPnJlZmNudCk7CisJCQkJYXRvbWljX2luYygmc2wtPnJlZmNudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKKworCQlpZiAoZm91bmQpCisJCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CisKKwlyZXR1cm4gKGZvdW5kKT9zbDpOVUxMOworfQorCiB2b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZikKIHsKIAlzdHJ1Y3QgdzFfbWFzdGVyICpkZXY7CiAKLQlzcGluX2xvY2tfYmgoJncxX21sb2NrKTsKKwltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZ3MV9tYXN0ZXJzLCB3MV9tYXN0ZXJfZW50cnkpIHsKIAkJZGV2X2RiZygmZGV2LT5kZXYsICJSZWNvbm5lY3Rpbmcgc2xhdmVzIGluICVzIGludG8gbmV3IGZhbWlseSAlMDJ4LlxuIiwKIAkJCQlkZXYtPm5hbWUsIGYtPmZpZCk7CiAJCXNldF9iaXQoVzFfTUFTVEVSX05FRURfUkVDT05ORUNULCAmZGV2LT5mbGFncyk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZ3MV9tbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIHcxX3NsYXZlX2ZvdW5kKHZvaWQgKmRhdGEsIHU2NCBybikKQEAgLTY0Niw3ICs3MjgsNyBAQAogICogQGRldiAgICAgICAgVGhlIG1hc3RlciBkZXZpY2UgdG8gc2VhcmNoCiAgKiBAY2IgICAgICAgICBGdW5jdGlvbiB0byBjYWxsIHdoZW4gYSBkZXZpY2UgaXMgZm91bmQKICAqLwotdm9pZCB3MV9zZWFyY2goc3RydWN0IHcxX21hc3RlciAqZGV2LCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYikKK3ZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdTggc2VhcmNoX3R5cGUsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKQogewogCXU2NCBsYXN0X3JuLCBybiwgdG1wNjQ7CiAJaW50IGksIHNsYXZlX2NvdW50ID0gMDsKQEAgLTY3Nyw3ICs3NTksNyBAQAogCQl9CiAKIAkJLyogU3RhcnQgdGhlIHNlYXJjaCAqLwotCQl3MV93cml0ZV84KGRldiwgVzFfU0VBUkNIKTsKKwkJdzFfd3JpdGVfOChkZXYsIHNlYXJjaF90eXBlKTsKIAkJZm9yIChpID0gMDsgaSA8IDY0OyArK2kpIHsKIAkJCS8qIERldGVybWluZSB0aGUgZGlyZWN0aW9uL3NlYXJjaCBiaXQgKi8KIAkJCWlmIChpID09IGRlc2NfYml0KQpAQCAtNzM5LDIzICs4MjEsMjMgQEAKIAkJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkgfHwgdGVzdF9iaXQoVzFfTUFTVEVSX05FRURfRVhJVCwgJmRldi0+ZmxhZ3MpKSB7CiAJCQkJc2V0X2JpdChXMV9NQVNURVJfTkVFRF9FWElULCAmZGV2LT5mbGFncyk7CiAKLQkJCQlzcGluX2xvY2soJncxX21sb2NrKTsKKwkJCQltdXRleF9sb2NrKCZ3MV9tbG9jayk7CiAJCQkJbGlzdF9kZWwoJmRldi0+dzFfbWFzdGVyX2VudHJ5KTsKLQkJCQlzcGluX3VubG9jaygmdzFfbWxvY2spOworCQkJCW11dGV4X3VubG9jaygmdzFfbWxvY2spOwogCi0JCQkJZG93bigmZGV2LT5tdXRleCk7CisJCQkJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CiAJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgewogCQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwogCQkJCX0KIAkJCQl3MV9kZXN0cm95X21hc3Rlcl9hdHRyaWJ1dGVzKGRldik7Ci0JCQkJdXAoJmRldi0+bXV0ZXgpOworCQkJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CiAJCQkJYXRvbWljX2RlYygmZGV2LT5yZWZjbnQpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlpZiAodGVzdF9iaXQoVzFfTUFTVEVSX05FRURfUkVDT05ORUNULCAmZGV2LT5mbGFncykpIHsKIAkJCQlkZXZfZGJnKCZkZXYtPmRldiwgIlJlY29ubmVjdGluZyBzbGF2ZXMgaW4gZGV2aWNlICVzLlxuIiwgZGV2LT5uYW1lKTsKLQkJCQlkb3duKCZkZXYtPm11dGV4KTsKKwkJCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKIAkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2wsIHNsbiwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KSB7CiAJCQkJCWlmIChzbC0+ZmFtaWx5LT5maWQgPT0gVzFfRkFNSUxZX0RFRkFVTFQpIHsKIAkJCQkJCXN0cnVjdCB3MV9yZWdfbnVtIHJuOwpAQCAtNzY4LDcgKzg1MCw3IEBACiAJCQkJfQogCQkJCWRldl9kYmcoJmRldi0+ZGV2LCAiUmVjb25uZWN0aW5nIHNsYXZlcyBpbiBkZXZpY2UgJXMgaGFzIGJlZW4gZmluaXNoZWQuXG4iLCBkZXYtPm5hbWUpOwogCQkJCWNsZWFyX2JpdChXMV9NQVNURVJfTkVFRF9SRUNPTk5FQ1QsICZkZXYtPmZsYWdzKTsKLQkJCQl1cCgmZGV2LT5tdXRleCk7CisJCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPm11dGV4KTsKIAkJCX0KIAkJfQogCX0KQEAgLTc3NiwxMCArODU4LDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgdzFfc2VhcmNoX3Byb2Nlc3Moc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSkKK3sKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsLCAqc2xuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzbCwgJmRldi0+c2xpc3QsIHcxX3NsYXZlX2VudHJ5KQorCQljbGVhcl9iaXQoVzFfU0xBVkVfQUNUSVZFLCAobG9uZyAqKSZzbC0+ZmxhZ3MpOworCisJdzFfc2VhcmNoX2RldmljZXMoZGV2LCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNsLCBzbG4sICZkZXYtPnNsaXN0LCB3MV9zbGF2ZV9lbnRyeSkgeworCQlpZiAoIXRlc3RfYml0KFcxX1NMQVZFX0FDVElWRSwgKHVuc2lnbmVkIGxvbmcgKikmc2wtPmZsYWdzKSAmJiAhLS1zbC0+dHRsKSB7CisJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOworCisJCQlkZXYtPnNsYXZlX2NvdW50LS07CisJCX0gZWxzZSBpZiAodGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAodW5zaWduZWQgbG9uZyAqKSZzbC0+ZmxhZ3MpKQorCQkJc2wtPnR0bCA9IGRldi0+c2xhdmVfdHRsOworCX0KKworCWlmIChkZXYtPnNlYXJjaF9jb3VudCA+IDApCisJCWRldi0+c2VhcmNoX2NvdW50LS07Cit9CisKIGludCB3MV9wcm9jZXNzKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHcxX21hc3RlciAqZGV2ID0gKHN0cnVjdCB3MV9tYXN0ZXIgKikgZGF0YTsKLQlzdHJ1Y3QgdzFfc2xhdmUgKnNsLCAqc2xuOwogCiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkgJiYgIXRlc3RfYml0KFcxX01BU1RFUl9ORUVEX0VYSVQsICZkZXYtPmZsYWdzKSkgewogCQl0cnlfdG9fZnJlZXplKCk7CkBAIC03OTQsMjcgKzg5Nyw5IEBACiAJCWlmIChkZXYtPnNlYXJjaF9jb3VudCA9PSAwKQogCQkJY29udGludWU7CiAKLQkJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGV2LT5tdXRleCkpCi0JCQljb250aW51ZTsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpCi0JCQljbGVhcl9iaXQoVzFfU0xBVkVfQUNUSVZFLCAobG9uZyAqKSZzbC0+ZmxhZ3MpOwotCi0JCXcxX3NlYXJjaF9kZXZpY2VzKGRldiwgdzFfc2xhdmVfZm91bmQpOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzbCwgc2xuLCAmZGV2LT5zbGlzdCwgdzFfc2xhdmVfZW50cnkpIHsKLQkJCWlmICghdGVzdF9iaXQoVzFfU0xBVkVfQUNUSVZFLCAodW5zaWduZWQgbG9uZyAqKSZzbC0+ZmxhZ3MpICYmICEtLXNsLT50dGwpIHsKLQkJCQl3MV9zbGF2ZV9kZXRhY2goc2wpOwotCi0JCQkJZGV2LT5zbGF2ZV9jb3VudC0tOwotCQkJfSBlbHNlIGlmICh0ZXN0X2JpdChXMV9TTEFWRV9BQ1RJVkUsICh1bnNpZ25lZCBsb25nICopJnNsLT5mbGFncykpCi0JCQkJc2wtPnR0bCA9IGRldi0+c2xhdmVfdHRsOwotCQl9Ci0KLQkJaWYgKGRldi0+c2VhcmNoX2NvdW50ID4gMCkKLQkJCWRldi0+c2VhcmNoX2NvdW50LS07Ci0KLQkJdXAoJmRldi0+bXV0ZXgpOworCQltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKKwkJdzFfc2VhcmNoX3Byb2Nlc3MoZGV2LCBXMV9TRUFSQ0gpOworCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCX0KIAogCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKQEAgLTgyOCw2ICs5MTMsOCBAQAogCiAJcHJpbnRrKEtFUk5fSU5GTyAiRHJpdmVyIGZvciAxLXdpcmUgRGFsbGFzIG5ldHdvcmsgcHJvdG9jb2wuXG4iKTsKIAorCXcxX2luaXRfbmV0bGluaygpOworCiAJcmV0dmFsID0gYnVzX3JlZ2lzdGVyKCZ3MV9idXNfdHlwZSk7CiAJaWYgKHJldHZhbCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciBidXMuIGVycj0lZC5cbiIsIHJldHZhbCk7CkBAIC04ODAsNiArOTY3LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJncxX21hc3RlcnMsIHcxX21hc3Rlcl9lbnRyeSkKIAkJX193MV9yZW1vdmVfbWFzdGVyX2RldmljZShkZXYpOwogCisJdzFfZmluaV9uZXRsaW5rKCk7CisKIAlrdGhyZWFkX3N0b3AodzFfY29udHJvbF90aHJlYWQpOwogCiAJZHJpdmVyX3VucmVnaXN0ZXIoJncxX3NsYXZlX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxLmggYi9kcml2ZXJzL3cxL3cxLmgKaW5kZXggNTY5ODA1MC4uZjFkZjUzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MS5oCisrKyBiL2RyaXZlcnMvdzEvdzEuaApAQCAtNDEsMTAgKzQxLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLQotI2luY2x1ZGUgPG5ldC9zb2NrLmg+Ci0KLSNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAogI2luY2x1ZGUgIncxX2ZhbWlseS5oIgogCkBAIC01Miw3ICs0OSw3IEBACiAjZGVmaW5lIFcxX1NMQVZFX0RBVEFfU0laRQkxMjgKIAogI2RlZmluZSBXMV9TRUFSQ0gJCTB4RjAKLSNkZWZpbmUgVzFfQ09ORElUSU9OQUxfU0VBUkNICTB4RUMKKyNkZWZpbmUgVzFfQUxBUk1fU0VBUkNICQkweEVDCiAjZGVmaW5lIFcxX0NPTlZFUlRfVEVNUAkJMHg0NAogI2RlZmluZSBXMV9TS0lQX1JPTQkJMHhDQwogI2RlZmluZSBXMV9SRUFEX1NDUkFUQ0hQQUQJMHhCRQpAQCAtNjAsNyArNTcsNyBAQAogI2RlZmluZSBXMV9SRUFEX1BTVVBQTFkJCTB4QjQKICNkZWZpbmUgVzFfTUFUQ0hfUk9NCQkweDU1CiAKLSNkZWZpbmUgVzFfU0xBVkVfQUNUSVZFCQkoMTw8MCkKKyNkZWZpbmUgVzFfU0xBVkVfQUNUSVZFCQkwCiAKIHN0cnVjdCB3MV9zbGF2ZQogewpAQCAtMTQ1LDggKzE0Miw4IEBACiAJICovCiAJdTgJCSgqcmVzZXRfYnVzKSh2b2lkICopOwogCi0JLyoqIFJlYWxseSBuaWNlIGhhcmR3YXJlIGNhbiBoYW5kbGVzIHRoZSBST00gc2VhcmNoZXMgKi8KLQl2b2lkCQkoKnNlYXJjaCkodm9pZCAqLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayk7CisJLyoqIFJlYWxseSBuaWNlIGhhcmR3YXJlIGNhbiBoYW5kbGVzIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgUk9NIHNlYXJjaCAqLworCXZvaWQJCSgqc2VhcmNoKSh2b2lkICosIHU4LCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayk7CiB9OwogCiAjZGVmaW5lIFcxX01BU1RFUl9ORUVEX0VYSVQJCTAKQEAgLTE3MywxOSArMTcwLDMwIEBACiAJbG9uZwkJCWZsYWdzOwogCiAJc3RydWN0IHRhc2tfc3RydWN0CSp0aHJlYWQ7Ci0Jc3RydWN0IHNlbWFwaG9yZQltdXRleDsKKwlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwogCiAJc3RydWN0IGRldmljZV9kcml2ZXIJKmRyaXZlcjsKIAlzdHJ1Y3QgZGV2aWNlCQlkZXY7CiAKIAlzdHJ1Y3QgdzFfYnVzX21hc3RlcgkqYnVzX21hc3RlcjsKIAotCXUzMgkJCXNlcSwgZ3JvdXBzOwotCXN0cnVjdCBzb2NrCQkqbmxzOworCXUzMgkJCXNlcTsKIH07CiAKIGludCB3MV9jcmVhdGVfbWFzdGVyX2F0dHJpYnV0ZXMoc3RydWN0IHcxX21hc3RlciAqKTsKLXZvaWQgdzFfc2VhcmNoKHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOwordm9pZCB3MV9zZWFyY2goc3RydWN0IHcxX21hc3RlciAqZGV2LCB1OCBzZWFyY2hfdHlwZSwgdzFfc2xhdmVfZm91bmRfY2FsbGJhY2sgY2IpOwordm9pZCB3MV9zZWFyY2hfZGV2aWNlcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYik7CitzdHJ1Y3QgdzFfc2xhdmUgKncxX3NlYXJjaF9zbGF2ZShzdHJ1Y3QgdzFfcmVnX251bSAqaWQpOwordm9pZCB3MV9zZWFyY2hfcHJvY2VzcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlKTsKK3N0cnVjdCB3MV9tYXN0ZXIgKncxX3NlYXJjaF9tYXN0ZXJfaWQodTMyIGlkKTsKKwordTggdzFfdHJpcGxldChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiZGlyKTsKK3ZvaWQgdzFfd3JpdGVfOChzdHJ1Y3QgdzFfbWFzdGVyICosIHU4KTsKK2ludCB3MV9yZXNldF9idXMoc3RydWN0IHcxX21hc3RlciAqKTsKK3U4IHcxX2NhbGNfY3JjOCh1OCAqLCBpbnQpOwordm9pZCB3MV93cml0ZV9ibG9jayhzdHJ1Y3QgdzFfbWFzdGVyICosIGNvbnN0IHU4ICosIGludCk7Cit1OCB3MV9yZWFkX2Jsb2NrKHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTggKiwgaW50KTsKK2ludCB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc3RydWN0IHcxX3NsYXZlICpzbCk7CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHcxX3NsYXZlKiBkZXZfdG9fdzFfc2xhdmUoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMjAyLDE1ICsyMTAsMTQgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHcxX21hc3RlciwgZGV2KTsKIH0KIAotZXh0ZXJuIGludCB3MV9tYXhfc2xhdmVfY291bnQ7Ci1leHRlcm4gaW50IHcxX21heF9zbGF2ZV90dGw7Ci1leHRlcm4gc3BpbmxvY2tfdCB3MV9tbG9jazsKLWV4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHcxX21hc3RlcnM7CiBleHRlcm4gc3RydWN0IGRldmljZV9kcml2ZXIgdzFfbWFzdGVyX2RyaXZlcjsKIGV4dGVybiBzdHJ1Y3QgZGV2aWNlIHcxX21hc3Rlcl9kZXZpY2U7CitleHRlcm4gaW50IHcxX21heF9zbGF2ZV9jb3VudDsKK2V4dGVybiBpbnQgdzFfbWF4X3NsYXZlX3R0bDsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIHcxX21hc3RlcnM7CitleHRlcm4gc3RydWN0IG11dGV4IHcxX21sb2NrOwogCi1pbnQgdzFfcHJvY2Vzcyh2b2lkICpkYXRhKTsKLXZvaWQgdzFfcmVjb25uZWN0X3NsYXZlcyhzdHJ1Y3QgdzFfZmFtaWx5ICpmKTsKK2V4dGVybiBpbnQgdzFfcHJvY2Vzcyh2b2lkICopOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jIGIvZHJpdmVycy93MS93MV9mYW1pbHkuYwppbmRleCAwZTMyYzExLi5hM2M5NWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ZhbWlseS5jCisrKyBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmMKQEAgLTEwNyw2ICsxMDcsMTIgQEAKIAlyZXR1cm4gKHJldCkgPyBmIDogTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgX193MV9mYW1pbHlfcHV0KHN0cnVjdCB3MV9mYW1pbHkgKmYpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmYtPnJlZmNudCkpCisJCWYtPm5lZWRfZXhpdCA9IDE7Cit9CisKIHZvaWQgdzFfZmFtaWx5X3B1dChzdHJ1Y3QgdzFfZmFtaWx5ICpmKQogewogCXNwaW5fbG9jaygmdzFfZmxvY2spOwpAQCAtMTE0LDE5ICsxMjAsMTQgQEAKIAlzcGluX3VubG9jaygmdzFfZmxvY2spOwogfQogCi12b2lkIF9fdzFfZmFtaWx5X3B1dChzdHJ1Y3QgdzFfZmFtaWx5ICpmKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZmLT5yZWZjbnQpKQotCQlmLT5uZWVkX2V4aXQgPSAxOwotfQotCisjaWYgMAogdm9pZCB3MV9mYW1pbHlfZ2V0KHN0cnVjdCB3MV9mYW1pbHkgKmYpCiB7CiAJc3Bpbl9sb2NrKCZ3MV9mbG9jayk7CiAJX193MV9mYW1pbHlfZ2V0KGYpOwogCXNwaW5fdW5sb2NrKCZ3MV9mbG9jayk7Ci0KIH0KKyNlbmRpZiAgLyogIDAgICovCiAKIHZvaWQgX193MV9mYW1pbHlfZ2V0KHN0cnVjdCB3MV9mYW1pbHkgKmYpCiB7CkBAIC0xMzUsOCArMTM2LDUgQEAKIAlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsKIH0KIAotRVhQT1JUX1NZTUJPTCh3MV9mYW1pbHlfZ2V0KTsKLUVYUE9SVF9TWU1CT0wodzFfZmFtaWx5X3B1dCk7Ci1FWFBPUlRfU1lNQk9MKHcxX2ZhbWlseV9yZWdpc3RlcmVkKTsKIEVYUE9SVF9TWU1CT0wodzFfdW5yZWdpc3Rlcl9mYW1pbHkpOwogRVhQT1JUX1NZTUJPTCh3MV9yZWdpc3Rlcl9mYW1pbHkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9mYW1pbHkuaCBiL2RyaXZlcnMvdzEvdzFfZmFtaWx5LmgKaW5kZXggMmNhMDQ4OS4uMWUyYWM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9mYW1pbHkuaAorKysgYi9kcml2ZXJzL3cxL3cxX2ZhbWlseS5oCkBAIC01NywxMiArNTcsMTEgQEAKIAogZXh0ZXJuIHNwaW5sb2NrX3QgdzFfZmxvY2s7CiAKLXZvaWQgdzFfZmFtaWx5X2dldChzdHJ1Y3QgdzFfZmFtaWx5ICopOwogdm9pZCB3MV9mYW1pbHlfcHV0KHN0cnVjdCB3MV9mYW1pbHkgKik7CiB2b2lkIF9fdzFfZmFtaWx5X2dldChzdHJ1Y3QgdzFfZmFtaWx5ICopOwotdm9pZCBfX3cxX2ZhbWlseV9wdXQoc3RydWN0IHcxX2ZhbWlseSAqKTsKIHN0cnVjdCB3MV9mYW1pbHkgKiB3MV9mYW1pbHlfcmVnaXN0ZXJlZCh1OCk7CiB2b2lkIHcxX3VucmVnaXN0ZXJfZmFtaWx5KHN0cnVjdCB3MV9mYW1pbHkgKik7CiBpbnQgdzFfcmVnaXN0ZXJfZmFtaWx5KHN0cnVjdCB3MV9mYW1pbHkgKik7Cit2b2lkIHcxX3JlY29ubmVjdF9zbGF2ZXMoc3RydWN0IHcxX2ZhbWlseSAqZik7CiAKICNlbmRpZiAvKiBfX1cxX0ZBTUlMWV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2ludC5jIGIvZHJpdmVycy93MS93MV9pbnQuYwppbmRleCA2ODU2NWFhLi4zNTdhMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2ludC5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW50LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlhdG9taWNfc2V0KCZkZXYtPnJlZmNudCwgMik7CiAKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5zbGlzdCk7Ci0JaW5pdF9NVVRFWCgmZGV2LT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmZGV2LT5tdXRleCk7CiAKIAltZW1jcHkoJmRldi0+ZGV2LCBkZXZpY2UsIHNpemVvZihzdHJ1Y3QgZGV2aWNlKSk7CiAJc25wcmludGYoZGV2LT5kZXYuYnVzX2lkLCBzaXplb2YoZGV2LT5kZXYuYnVzX2lkKSwKQEAgLTc0LDE2ICs3NCwxMSBAQAogCiAJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CiAKLQlkZXYtPmdyb3VwcyA9IDE7CiAJZGV2LT5zZXEgPSAxOwotCWRldl9pbml0X25ldGxpbmsoZGV2KTsKIAogCWVyciA9IGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gcmVnaXN0ZXIgbWFzdGVyIGRldmljZS4gZXJyPSVkXG4iLCBlcnIpOwotCi0JCWRldl9maW5pX25ldGxpbmsoZGV2KTsKLQogCQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHcxX21hc3RlcikpOwogCQlrZnJlZShkZXYpOwogCQlkZXYgPSBOVUxMOwpAQCAtMTMxLDEyICsxMjYsMTIgQEAKIAogCWRldi0+aW5pdGlhbGl6ZWQgPSAxOwogCi0Jc3Bpbl9sb2NrKCZ3MV9tbG9jayk7CisJbXV0ZXhfbG9jaygmdzFfbWxvY2spOwogCWxpc3RfYWRkKCZkZXYtPncxX21hc3Rlcl9lbnRyeSwgJncxX21hc3RlcnMpOwotCXNwaW5fdW5sb2NrKCZ3MV9tbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZ3MV9tbG9jayk7CiAKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOwogCW1zZy5pZC5tc3QuaWQgPSBkZXYtPmlkOwotCW1zZy5pZC5tc3QucGlkID0gZGV2LT50aHJlYWQtPnBpZDsKIAltc2cudHlwZSA9IFcxX01BU1RFUl9BREQ7CiAJdzFfbmV0bGlua19zZW5kKGRldiwgJm1zZyk7CiAKQEAgLTE1Myw3ICsxNDgsNiBAQAogdm9pZCBfX3cxX3JlbW92ZV9tYXN0ZXJfZGV2aWNlKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKIHsKIAlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgbXNnOwotCXBpZF90IHBpZCA9IGRldi0+dGhyZWFkLT5waWQ7CiAKIAlzZXRfYml0KFcxX01BU1RFUl9ORUVEX0VYSVQsICZkZXYtPmZsYWdzKTsKIAlrdGhyZWFkX3N0b3AoZGV2LT50aHJlYWQpOwpAQCAtMTY2LDggKzE2MCw4IEBACiAJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOwogCX0KIAorCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAJbXNnLmlkLm1zdC5pZCA9IGRldi0+aWQ7Ci0JbXNnLmlkLm1zdC5waWQgPSBwaWQ7CiAJbXNnLnR5cGUgPSBXMV9NQVNURVJfUkVNT1ZFOwogCXcxX25ldGxpbmtfc2VuZChkZXYsICZtc2cpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX2lvLmMgYi9kcml2ZXJzL3cxL3cxX2lvLmMKaW5kZXggZjdmN2U4Yi4uMzBiNmZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93MS93MV9pby5jCisrKyBiL2RyaXZlcnMvdzEvdzFfaW8uYwpAQCAtMjMsMTAgKzIzLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJ3MS5oIgogI2luY2x1ZGUgIncxX2xvZy5oIgotI2luY2x1ZGUgIncxX2lvLmgiCiAKIHN0YXRpYyBpbnQgdzFfZGVsYXlfcGFybSA9IDE7CiBtb2R1bGVfcGFyYW1fbmFtZWQoZGVsYXlfY29lZiwgdzFfZGVsYXlfcGFybSwgaW50LCAwKTsKQEAgLTUwLDcgKzUwLDcgQEAKIAkxMTYsIDQyLCAyMDAsIDE1MCwgMjEsIDc1LCAxNjksIDI0NywgMTgyLCAyMzIsIDEwLCA4NCwgMjE1LCAxMzcsIDEwNywgNTMKIH07CiAKLXZvaWQgdzFfZGVsYXkodW5zaWduZWQgbG9uZyB0bSkKK3N0YXRpYyB2b2lkIHcxX2RlbGF5KHVuc2lnbmVkIGxvbmcgdG0pCiB7CiAJdWRlbGF5KHRtICogdzFfZGVsYXlfcGFybSk7CiB9CkBAIC02MSw3ICs2MSw3IEBACiAvKioKICAqIEdlbmVyYXRlcyBhIHdyaXRlLTAgb3Igd3JpdGUtMSBjeWNsZSBhbmQgc2FtcGxlcyB0aGUgbGV2ZWwuCiAgKi8KLXU4IHcxX3RvdWNoX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIGludCBiaXQpCitzdGF0aWMgdTggdzFfdG91Y2hfYml0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGJpdCkKIHsKIAlpZiAoZGV2LT5idXNfbWFzdGVyLT50b3VjaF9iaXQpCiAJCXJldHVybiBkZXYtPmJ1c19tYXN0ZXItPnRvdWNoX2JpdChkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIGJpdCk7CkBAIC0xMDgsNiArMTA4LDcgQEAKIAkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkKIAkJCXcxX3RvdWNoX2JpdChkZXYsIChieXRlID4+IGkpICYgMHgxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHcxX3dyaXRlXzgpOwogCiAKIC8qKgpAQCAtMTc2LDcgKzE3Nyw3IEBACiAgKiBAcGFyYW0gZGV2ICAgICB0aGUgbWFzdGVyIGRldmljZQogICogQHJldHVybiAgICAgICAgdGhlIGJ5dGUgcmVhZAogICovCi11OCB3MV9yZWFkXzgoc3RydWN0IHcxX21hc3RlciAqIGRldikKK3N0YXRpYyB1OCB3MV9yZWFkXzgoc3RydWN0IHcxX21hc3RlciAqIGRldikKIHsKIAlpbnQgaTsKIAl1OCByZXMgPSAwOwpAQCAtMjA4LDYgKzIwOSw3IEBACiAJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkKIAkJCXcxX3dyaXRlXzgoZGV2LCBidWZbaV0pOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodzFfd3JpdGVfYmxvY2spOwogCiAvKioKICAqIFJlYWRzIGEgc2VyaWVzIG9mIGJ5dGVzLgpAQCAtMjMyLDYgKzIzNCw3IEBACiAKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVhZF9ibG9jayk7CiAKIC8qKgogICogSXNzdWVzIGEgcmVzZXQgYnVzIHNlcXVlbmNlLgpAQCAtMjU3LDYgKzI2MCw3IEBACiAKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVzZXRfYnVzKTsKIAogdTggdzFfY2FsY19jcmM4KHU4ICogZGF0YSwgaW50IGxlbikKIHsKQEAgLTI2NywxNCArMjcxLDE1IEBACiAKIAlyZXR1cm4gY3JjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodzFfY2FsY19jcmM4KTsKIAotdm9pZCB3MV9zZWFyY2hfZGV2aWNlcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHcxX3NsYXZlX2ZvdW5kX2NhbGxiYWNrIGNiKQordm9pZCB3MV9zZWFyY2hfZGV2aWNlcyhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHU4IHNlYXJjaF90eXBlLCB3MV9zbGF2ZV9mb3VuZF9jYWxsYmFjayBjYikKIHsKIAlkZXYtPmF0dGVtcHRzKys7CiAJaWYgKGRldi0+YnVzX21hc3Rlci0+c2VhcmNoKQotCQlkZXYtPmJ1c19tYXN0ZXItPnNlYXJjaChkZXYtPmJ1c19tYXN0ZXItPmRhdGEsIGNiKTsKKwkJZGV2LT5idXNfbWFzdGVyLT5zZWFyY2goZGV2LT5idXNfbWFzdGVyLT5kYXRhLCBzZWFyY2hfdHlwZSwgY2IpOwogCWVsc2UKLQkJdzFfc2VhcmNoKGRldiwgY2IpOworCQl3MV9zZWFyY2goZGV2LCBzZWFyY2hfdHlwZSwgY2IpOwogfQogCiAvKioKQEAgLTI5OSwxNCArMzA0LDQgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0KLUVYUE9SVF9TWU1CT0wodzFfdG91Y2hfYml0KTsKLUVYUE9SVF9TWU1CT0wodzFfd3JpdGVfOCk7Ci1FWFBPUlRfU1lNQk9MKHcxX3JlYWRfOCk7Ci1FWFBPUlRfU1lNQk9MKHcxX3Jlc2V0X2J1cyk7Ci1FWFBPUlRfU1lNQk9MKHcxX2NhbGNfY3JjOCk7Ci1FWFBPUlRfU1lNQk9MKHcxX2RlbGF5KTsKLUVYUE9SVF9TWU1CT0wodzFfcmVhZF9ibG9jayk7Ci1FWFBPUlRfU1lNQk9MKHcxX3dyaXRlX2Jsb2NrKTsKLUVYUE9SVF9TWU1CT0wodzFfc2VhcmNoX2RldmljZXMpOwotRVhQT1JUX1NZTUJPTCh3MV9yZXNldF9zZWxlY3Rfc2xhdmUpOworRVhQT1JUX1NZTUJPTF9HUEwodzFfcmVzZXRfc2VsZWN0X3NsYXZlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdzEvdzFfaW8uaCBiL2RyaXZlcnMvdzEvdzFfaW8uaAppbmRleCAyMzI4NjAxLi45YTc2ZDJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX2lvLmgKKysrIGIvZHJpdmVycy93MS93MV9pby5oCkBAIC0yNCwxMSArMjQsOCBAQAogCiAjaW5jbHVkZSAidzEuaCIKIAotdm9pZCB3MV9kZWxheSh1bnNpZ25lZCBsb25nKTsKLXU4IHcxX3RvdWNoX2JpdChzdHJ1Y3QgdzFfbWFzdGVyICosIGludCk7CiB1OCB3MV90cmlwbGV0KHN0cnVjdCB3MV9tYXN0ZXIgKmRldiwgaW50IGJkaXIpOwogdm9pZCB3MV93cml0ZV84KHN0cnVjdCB3MV9tYXN0ZXIgKiwgdTgpOwotdTggdzFfcmVhZF84KHN0cnVjdCB3MV9tYXN0ZXIgKik7CiBpbnQgdzFfcmVzZXRfYnVzKHN0cnVjdCB3MV9tYXN0ZXIgKik7CiB1OCB3MV9jYWxjX2NyYzgodTggKiwgaW50KTsKIHZvaWQgdzFfd3JpdGVfYmxvY2soc3RydWN0IHcxX21hc3RlciAqLCBjb25zdCB1OCAqLCBpbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93MS93MV9uZXRsaW5rLmMgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwppbmRleCAzMjg2NDVkLi42NWM1ZWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYworKysgYi9kcml2ZXJzL3cxL3cxX25ldGxpbmsuYwpAQCAtMjEsNzIgKzIxLDIyNSBAQAogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nvbm5lY3Rvci5oPgogCiAjaW5jbHVkZSAidzEuaCIKICNpbmNsdWRlICJ3MV9sb2cuaCIKICNpbmNsdWRlICJ3MV9uZXRsaW5rLmgiCiAKLSNpZm5kZWYgTkVUTElOS19ESVNBQkxFRAorI2lmIGRlZmluZWQoQ09ORklHX1cxX0NPTikgJiYgKGRlZmluZWQoQ09ORklHX0NPTk5FQ1RPUikgfHwgKGRlZmluZWQoQ09ORklHX0NPTk5FQ1RPUl9NT0RVTEUpICYmIGRlZmluZWQoQ09ORklHX1cxX01PRFVMRSkpKQogdm9pZCB3MV9uZXRsaW5rX3NlbmQoc3RydWN0IHcxX21hc3RlciAqZGV2LCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKm1zZykKIHsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqZGF0YTsKLQlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwljaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGNuX21zZykgKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKV07CisJc3RydWN0IGNuX21zZyAqbSA9IChzdHJ1Y3QgY25fbXNnICopYnVmOworCXN0cnVjdCB3MV9uZXRsaW5rX21zZyAqdyA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKikobSsxKTsKIAotCWlmICghZGV2LT5ubHMpCi0JCXJldHVybjsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CiAKLQlzaXplID0gTkxNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykpOworCW0tPmlkLmlkeCA9IENOX1cxX0lEWDsKKwltLT5pZC52YWwgPSBDTl9XMV9WQUw7CiAKLQlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFza2IpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJza2JfYWxsb2MoKSBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuOwotCX0KKwltLT5zZXEgPSBkZXYtPnNlcSsrOworCW0tPmxlbiA9IHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpOwogCi0JbmxoID0gTkxNU0dfUFVUKHNrYiwgMCwgZGV2LT5zZXErKywgTkxNU0dfRE9ORSwgc2l6ZSAtIHNpemVvZigqbmxoKSk7CisJbWVtY3B5KHcsIG1zZywgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykpOwogCi0JZGF0YSA9IChzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKilOTE1TR19EQVRBKG5saCk7Ci0KLQltZW1jcHkoZGF0YSwgbXNnLCBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSk7Ci0KLQlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gZGV2LT5ncm91cHM7Ci0JbmV0bGlua19icm9hZGNhc3QoZGV2LT5ubHMsIHNrYiwgMCwgZGV2LT5ncm91cHMsIEdGUF9BVE9NSUMpOwotCi1ubG1zZ19mYWlsdXJlOgotCXJldHVybjsKKwljbl9uZXRsaW5rX3NlbmQobSwgMCwgR0ZQX0tFUk5FTCk7CiB9CiAKLWludCBkZXZfaW5pdF9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX21hc3RlcihzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCBjbl9tc2cgKm1zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQogewotCWRldi0+bmxzID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKE5FVExJTktfVzEsIDEsIE5VTEwsIFRISVNfTU9EVUxFKTsKLQlpZiAoIWRldi0+bmxzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIGNyZWF0ZSBuZXcgbmV0bGluayBzb2NrZXQoJXUpIGZvciB3MSBtYXN0ZXIgJXMuXG4iLAotCQkJTkVUTElOS19XMSwgZGV2LT5kZXYuYnVzX2lkKTsKLQl9CisJZGV2X2RiZygmZGV2LT5kZXYsICIlczogJXM6IGNtZD0lMDJ4LCBsZW49JXUuXG4iLAorCQlfX2Z1bmNfXywgZGV2LT5uYW1lLCBjbWQtPmNtZCwgY21kLT5sZW4pOwogCisJaWYgKGNtZC0+Y21kICE9IFcxX0NNRF9TRUFSQ0ggJiYgY21kLT5jbWQgIT0gVzFfQ01EX0FMQVJNX1NFQVJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3MV9zZWFyY2hfcHJvY2VzcyhkZXYsIChjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIKTsKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBkZXZfZmluaV9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldikKK3N0YXRpYyBpbnQgdzFfc2VuZF9yZWFkX3JlcGx5KHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCBjbl9tc2cgKm1zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQogewotCWlmIChkZXYtPm5scyAmJiBkZXYtPm5scy0+c2tfc29ja2V0KQotCQlzb2NrX3JlbGVhc2UoZGV2LT5ubHMtPnNrX3NvY2tldCk7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKmg7CisJc3RydWN0IHcxX25ldGxpbmtfY21kICpjOworCXN0cnVjdCBjbl9tc2cgKmNtOworCWludCBlcnI7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNuX21zZykgKworCQkJc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKworCQkJc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCkgKworCQkJY21kLT5sZW4sIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljbSA9IChzdHJ1Y3QgY25fbXNnICopKGRhdGEpOworCWggPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKGNtICsgMSk7CisJYyA9IChzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKikoaCArIDEpOworCisJbWVtY3B5KGNtLCBtc2csIHNpemVvZihzdHJ1Y3QgY25fbXNnKSk7CisJbWVtY3B5KGgsIGhkciwgc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykpOworCW1lbWNweShjLCBjbWQsIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpKTsKKworCWNtLT5hY2sgPSBtc2ctPnNlcSsxOworCWNtLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfbXNnKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpICsgY21kLT5sZW47CisKKwloLT5sZW4gPSBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSArIGNtZC0+bGVuOworCisJbWVtY3B5KGMtPmRhdGEsIGNtZC0+ZGF0YSwgYy0+bGVuKTsKKworCWVyciA9IGNuX25ldGxpbmtfc2VuZChjbSwgMCwgR0ZQX0tFUk5FTCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdzFfcHJvY2Vzc19jb21tYW5kX3NsYXZlKHN0cnVjdCB3MV9zbGF2ZSAqc2wsIHN0cnVjdCBjbl9tc2cgKm1zZywKKwkJc3RydWN0IHcxX25ldGxpbmtfbXNnICpoZHIsIHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwOworCisJZGV2X2RiZygmc2wtPm1hc3Rlci0+ZGV2LCAiJXM6ICUwMnguJTAxMmxseC4lMDJ4OiBjbWQ9JTAyeCwgbGVuPSV1LlxuIiwKKwkJX19mdW5jX18sIHNsLT5yZWdfbnVtLmZhbWlseSwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbC0+cmVnX251bS5pZCwgc2wtPnJlZ19udW0uY3JjLAorCQljbWQtPmNtZCwgY21kLT5sZW4pOworCisJc3dpdGNoIChjbWQtPmNtZCkgeworCQljYXNlIFcxX0NNRF9SRUFEOgorCQkJdzFfcmVhZF9ibG9jayhzbC0+bWFzdGVyLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKwkJCXcxX3NlbmRfcmVhZF9yZXBseShzbCwgbXNnLCBoZHIsIGNtZCk7CisJCQlicmVhazsKKwkJY2FzZSBXMV9DTURfV1JJVEU6CisJCQl3MV93cml0ZV9ibG9jayhzbC0+bWFzdGVyLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKwkJCWJyZWFrOworCQljYXNlIFcxX0NNRF9TRUFSQ0g6CisJCWNhc2UgVzFfQ01EX0FMQVJNX1NFQVJDSDoKKwkJCXcxX3NlYXJjaF9wcm9jZXNzKHNsLT5tYXN0ZXIsCisJCQkJCShjbWQtPmNtZCA9PSBXMV9DTURfQUxBUk1fU0VBUkNIKT9XMV9BTEFSTV9TRUFSQ0g6VzFfU0VBUkNIKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gLTE7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB3MV9jbl9jYWxsYmFjayh2b2lkICpkYXRhKQoreworCXN0cnVjdCBjbl9tc2cgKm1zZyA9IGRhdGE7CisJc3RydWN0IHcxX25ldGxpbmtfbXNnICptID0gKHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqKShtc2cgKyAxKTsKKwlzdHJ1Y3QgdzFfbmV0bGlua19jbWQgKmNtZDsKKwlzdHJ1Y3QgdzFfc2xhdmUgKnNsOworCXN0cnVjdCB3MV9tYXN0ZXIgKmRldjsKKwlpbnQgZXJyID0gMDsKKworCXdoaWxlIChtc2ctPmxlbiAmJiAhZXJyKSB7CisJCXN0cnVjdCB3MV9yZWdfbnVtIGlkOworCQl1MTYgbWxlbiA9IG0tPmxlbjsKKwkJdTggKmNtZF9kYXRhID0gbS0+ZGF0YTsKKworCQlkZXYgPSBOVUxMOworCQlzbCA9IE5VTEw7CisKKwkJbWVtY3B5KCZpZCwgbS0+aWQuaWQsIHNpemVvZihpZCkpOworI2lmIDAKKwkJcHJpbnRrKCIlczogJTAyeC4lMDEybGx4LiUwMng6IHR5cGU9JTAyeCwgbGVuPSV1LlxuIiwKKwkJCQlfX2Z1bmNfXywgaWQuZmFtaWx5LCAodW5zaWduZWQgbG9uZyBsb25nKWlkLmlkLCBpZC5jcmMsIG0tPnR5cGUsIG0tPmxlbik7CisjZW5kaWYKKwkJaWYgKG0tPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpID4gbXNnLT5sZW4pIHsKKwkJCWVyciA9IC1FMkJJRzsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFtbGVuKQorCQkJZ290byBvdXRfY29udDsKKworCQlpZiAobS0+dHlwZSA9PSBXMV9NQVNURVJfQ01EKSB7CisJCQlkZXYgPSB3MV9zZWFyY2hfbWFzdGVyX2lkKG0tPmlkLm1zdC5pZCk7CisJCX0gZWxzZSBpZiAobS0+dHlwZSA9PSBXMV9TTEFWRV9DTUQpIHsKKwkJCXNsID0gdzFfc2VhcmNoX3NsYXZlKCZpZCk7CisJCQlpZiAoc2wpCisJCQkJZGV2ID0gc2wtPm1hc3RlcjsKKwkJfQorCisJCWlmICghZGV2KSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXRfY29udDsKKwkJfQorCisJCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOworCisJCWlmIChzbCAmJiB3MV9yZXNldF9zZWxlY3Rfc2xhdmUoc2wpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBvdXRfdXA7CisJCX0KKworCQl3aGlsZSAobWxlbikgeworCQkJY21kID0gKHN0cnVjdCB3MV9uZXRsaW5rX2NtZCAqKWNtZF9kYXRhOworCisJCQlpZiAoY21kLT5sZW4gKyBzaXplb2Yoc3RydWN0IHcxX25ldGxpbmtfY21kKSA+IG1sZW4pIHsKKwkJCQllcnIgPSAtRTJCSUc7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChzbCkKKwkJCQl3MV9wcm9jZXNzX2NvbW1hbmRfc2xhdmUoc2wsIG1zZywgbSwgY21kKTsKKwkJCWVsc2UKKwkJCQl3MV9wcm9jZXNzX2NvbW1hbmRfbWFzdGVyKGRldiwgbXNnLCBtLCBjbWQpOworCisJCQljbWRfZGF0YSArPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCQkJbWxlbiAtPSBjbWQtPmxlbiArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19jbWQpOworCQl9CitvdXRfdXA6CisJCWF0b21pY19kZWMoJmRldi0+cmVmY250KTsKKwkJaWYgKHNsKQorCQkJYXRvbWljX2RlYygmc2wtPnJlZmNudCk7CisJCW11dGV4X3VubG9jaygmZGV2LT5tdXRleCk7CitvdXRfY29udDoKKwkJbXNnLT5sZW4gLT0gc2l6ZW9mKHN0cnVjdCB3MV9uZXRsaW5rX21zZykgKyBtLT5sZW47CisJCW0gPSAoc3RydWN0IHcxX25ldGxpbmtfbXNnICopKCgodTggKiltKSArIHNpemVvZihzdHJ1Y3QgdzFfbmV0bGlua19tc2cpICsgbS0+bGVuKTsKKworCQkvKgorCQkgKiBMZXQncyBhbGxvdyByZXF1ZXN0cyBmb3Igbm9uZXhpc3RpbmcgZGV2aWNlcy4KKwkJICovCisJCWlmIChlcnIgPT0gLUVOT0RFVikKKwkJCWVyciA9IDA7CisJfQorI2lmIDAKKwlpZiAoZXJyKSB7CisJCXByaW50aygiJXM6IG1hbGZvcm1lZCBtZXNzYWdlLiBEcm9wcGluZy5cbiIsIF9fZnVuY19fKTsKKwl9CisjZW5kaWYKK30KKworaW50IHcxX2luaXRfbmV0bGluayh2b2lkKQoreworCXN0cnVjdCBjYl9pZCB3MV9pZCA9IHsuaWR4ID0gQ05fVzFfSURYLCAudmFsID0gQ05fVzFfVkFMfTsKKworCXJldHVybiBjbl9hZGRfY2FsbGJhY2soJncxX2lkLCAidzEiLCAmdzFfY25fY2FsbGJhY2spOworfQorCit2b2lkIHcxX2ZpbmlfbmV0bGluayh2b2lkKQoreworCXN0cnVjdCBjYl9pZCB3MV9pZCA9IHsuaWR4ID0gQ05fVzFfSURYLCAudmFsID0gQ05fVzFfVkFMfTsKKworCWNuX2RlbF9jYWxsYmFjaygmdzFfaWQpOwogfQogI2Vsc2UKLSN3YXJuaW5nIE5ldGxpbmsgc3VwcG9ydCBpcyBkaXNhYmxlZC4gUGxlYXNlIGNvbXBpbGUgd2l0aCBORVQgc3VwcG9ydCBlbmFibGVkLgotCiB2b2lkIHcxX25ldGxpbmtfc2VuZChzdHJ1Y3QgdzFfbWFzdGVyICpkZXYsIHN0cnVjdCB3MV9uZXRsaW5rX21zZyAqbXNnKQogewogfQogCi1pbnQgZGV2X2luaXRfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCitpbnQgdzFfaW5pdF9uZXRsaW5rKHZvaWQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgZGV2X2ZpbmlfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpCit2b2lkIHcxX2ZpbmlfbmV0bGluayh2b2lkKQogewogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3cxL3cxX25ldGxpbmsuaCBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCmluZGV4IGViMGM4YjMuLjU2MTIyYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCisrKyBiL2RyaXZlcnMvdzEvdzFfbmV0bGluay5oCkBAIC0yMyw2ICsyMyw3IEBACiAjZGVmaW5lIF9fVzFfTkVUTElOS19ICiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25uZWN0b3IuaD4KIAogI2luY2x1ZGUgIncxLmgiCiAKQEAgLTMxLDI5ICszMiw0MyBAQAogCVcxX1NMQVZFX1JFTU9WRSwKIAlXMV9NQVNURVJfQURELAogCVcxX01BU1RFUl9SRU1PVkUsCisJVzFfTUFTVEVSX0NNRCwKKwlXMV9TTEFWRV9DTUQsCiB9OwogCiBzdHJ1Y3QgdzFfbmV0bGlua19tc2cKIHsKIAlfX3U4CQkJCXR5cGU7Ci0JX191OAkJCQlyZXNlcnZlZFszXTsKLQl1bmlvbgotCXsKLQkJc3RydWN0IHcxX3JlZ19udW0JaWQ7Ci0JCV9fdTY0CQkJdzFfaWQ7Ci0JCXN0cnVjdAotCQl7CisJX191OAkJCQlyZXNlcnZlZDsKKwlfX3UxNgkJCQlsZW47CisJdW5pb24geworCQlfX3U4CQkJaWRbOF07CisJCXN0cnVjdCB3MV9tc3QgewogCQkJX191MzIJCWlkOwotCQkJX191MzIJCXBpZDsKKwkJCV9fdTMyCQlyZXM7CiAJCX0gbXN0OwogCX0gaWQ7CisJX191OAkJCQlkYXRhWzBdOworfTsKKworI2RlZmluZSBXMV9DTURfUkVBRAkJMHgwCisjZGVmaW5lIFcxX0NNRF9XUklURQkJMHgxCisjZGVmaW5lIFcxX0NNRF9TRUFSQ0gJCTB4MgorI2RlZmluZSBXMV9DTURfQUxBUk1fU0VBUkNICTB4MworCitzdHJ1Y3QgdzFfbmV0bGlua19jbWQKK3sKKwlfX3U4CQkJCWNtZDsKKwlfX3U4CQkJCXJlczsKKwlfX3UxNgkJCQlsZW47CisJX191OAkJCQlkYXRhWzBdOwogfTsKIAogI2lmZGVmIF9fS0VSTkVMX18KIAogdm9pZCB3MV9uZXRsaW5rX3NlbmQoc3RydWN0IHcxX21hc3RlciAqLCBzdHJ1Y3QgdzFfbmV0bGlua19tc2cgKik7Ci1pbnQgZGV2X2luaXRfbmV0bGluayhzdHJ1Y3QgdzFfbWFzdGVyICpkZXYpOwotdm9pZCBkZXZfZmluaV9uZXRsaW5rKHN0cnVjdCB3MV9tYXN0ZXIgKmRldik7CitpbnQgdzFfaW5pdF9uZXRsaW5rKHZvaWQpOwordm9pZCB3MV9maW5pX25ldGxpbmsodm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19XMV9ORVRMSU5LX0ggKi8KZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19pbm9kZS5jIGIvZnMvOXAvdmZzX2lub2RlLmMKaW5kZXggMmNiODdiYS4uNWM2YmRmOCAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2lub2RlLmMKKysrIGIvZnMvOXAvdmZzX2lub2RlLmMKQEAgLTUzMCw5ICs1MzAsNiBAQAogCWlmICh2ZmlkKQogCQl2OWZzX2ZpZF9kZXN0cm95KHZmaWQpOwogCi0JaWYgKGlub2RlKQotCQlpcHV0KGlub2RlKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTEwNTQsNiArMTA1MSw5IEBACiAJaW50IHJldDsKIAljaGFyICpsaW5rID0gX19nZXRuYW1lKCk7CiAKKwlpZiAodW5saWtlbHkoIWxpbmspKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWlmIChidWZsZW4gPiBQQVRIX01BWCkKIAkJYnVmbGVuID0gUEFUSF9NQVg7CiAKQEAgLTExNzEsOSArMTE3MSw2IEBACiAJaWYgKHZmaWQpCiAJCXY5ZnNfZmlkX2Rlc3Ryb3kodmZpZCk7CiAKLQlpZiAoaW5vZGUpCi0JCWlwdXQoaW5vZGUpOwotCiAJcmV0dXJuIGVycjsKIAogfQpAQCAtMTIyNyw2ICsxMjI0LDkgQEAKIAl9CiAKIAluYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKHVubGlrZWx5KCFuYW1lKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlzcHJpbnRmKG5hbWUsICIlZFxuIiwgb2xkZmlkLT5maWQpOwogCXJldHZhbCA9IHY5ZnNfdmZzX21rc3BlY2lhbChkaXIsIGRlbnRyeSwgVjlGU19ETUxJTkssIG5hbWUpOwogCV9fcHV0bmFtZShuYW1lKTsKZGlmZiAtLWdpdCBhL2ZzLzlwL3Zmc19zdXBlci5jIGIvZnMvOXAvdmZzX3N1cGVyLmMKaW5kZXggNjFjNTk5Yi4uOGIxNWJiMiAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX3N1cGVyLmMKKysrIGIvZnMvOXAvdmZzX3N1cGVyLmMKQEAgLTk5LDEyICs5OSwxMyBAQAogICogQGZsYWdzOiBtb3VudCBmbGFncwogICogQGRldl9uYW1lOiBkZXZpY2UgbmFtZSB0aGF0IHdhcyBtb3VudGVkCiAgKiBAZGF0YTogbW91bnQgb3B0aW9ucworICogQG1udDogbW91bnRwb2ludCByZWNvcmQgdG8gYmUgaW5zdGFudGlhdGVkCiAgKgogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnY5ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlCi0JCQkJICAgICAgICpmc190eXBlLCBpbnQgZmxhZ3MsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCB2OWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCisJCSAgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gTlVMTDsKIAlzdHJ1Y3Qgdjlmc19mY2FsbCAqZmNhbGwgPSBOVUxMOwpAQCAtMTIzLDE3ICsxMjQsMTkgQEAKIAogCXY5c2VzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF2OXNlcykKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKChuZXdmaWQgPSB2OWZzX3Nlc3Npb25faW5pdCh2OXNlcywgZGV2X25hbWUsIGRhdGEpKSA8IDApIHsKIAkJZHByaW50ayhERUJVR19FUlJPUiwgInByb2JsZW0gaW5pdGlhdGluZyBzZXNzaW9uXG4iKTsKLQkJc2IgPSBFUlJfUFRSKG5ld2ZpZCk7CisJCXJldHZhbCA9IG5ld2ZpZDsKIAkJZ290byBvdXRfZnJlZV9zZXNzaW9uOwogCX0KIAogCXNiID0gc2dldChmc190eXBlLCBOVUxMLCB2OWZzX3NldF9zdXBlciwgdjlzZXMpOwotCWlmIChJU19FUlIoc2IpKQorCWlmIChJU19FUlIoc2IpKSB7CisJCXJldHZhbCA9IFBUUl9FUlIoc2IpOwogCQlnb3RvIG91dF9jbG9zZV9zZXNzaW9uOworCX0KIAl2OWZzX2ZpbGxfc3VwZXIoc2IsIHY5c2VzLCBmbGFncyk7CiAKIAlpbm9kZSA9IHY5ZnNfZ2V0X2lub2RlKHNiLCBTX0lGRElSIHwgbW9kZSk7CkBAIC0xODQsMTkgKzE4NywxOSBAQAogCQlnb3RvIHB1dF9iYWNrX3NiOwogCX0KIAotCXJldHVybiBzYjsKKwlyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBzYik7CiAKIG91dF9jbG9zZV9zZXNzaW9uOgogCXY5ZnNfc2Vzc2lvbl9jbG9zZSh2OXNlcyk7CiBvdXRfZnJlZV9zZXNzaW9uOgogCWtmcmVlKHY5c2VzKTsKLQlyZXR1cm4gc2I7CisJcmV0dXJuIHJldHZhbDsKIAogcHV0X2JhY2tfc2I6CiAJLyogZGVhY3RpdmF0ZV9zdXBlciBjYWxscyB2OWZzX2tpbGxfc3VwZXIgd2hpY2ggd2lsbCBmcmVlcyB0aGUgcmVzdCAqLwogCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOwogCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwotCXJldHVybiBFUlJfUFRSKHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogLyoqCkBAIC0yNTMsMTEgKzI1NiwxMiBAQAogfQogCiBzdGF0aWMgdm9pZAotdjlmc191bW91bnRfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3Y5ZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHNiLT5zX2ZzX2luZm87CisJc3RydWN0IHY5ZnNfc2Vzc2lvbl9pbmZvICp2OXNlcyA9IHZmc21udC0+bW50X3NiLT5zX2ZzX2luZm87CiAKLQl2OWZzX3Nlc3Npb25fY2FuY2VsKHY5c2VzKTsKKwlpZiAoZmxhZ3MgJiBNTlRfRk9SQ0UpCisJCXY5ZnNfc2Vzc2lvbl9jYW5jZWwodjlzZXMpOwogfQogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdjlmc19zdXBlcl9vcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9LY29uZmlnIGIvZnMvS2NvbmZpZwppbmRleCAyMGY5YjU1Li4xY2RjMDQzIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnCisrKyBiL2ZzL0tjb25maWcKQEAgLTUzLDcgKzUzLDcgQEAKIAogY29uZmlnIEVYVDJfRlNfWElQCiAJYm9vbCAiRXh0MiBleGVjdXRlIGluIHBsYWNlIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBFWFQyX0ZTCisJZGVwZW5kcyBvbiBFWFQyX0ZTICYmIE1NVQogCWhlbHAKIAkgIEV4ZWN1dGUgaW4gcGxhY2UgY2FuIGJlIHVzZWQgb24gbWVtb3J5LWJhY2tlZCBibG9jayBkZXZpY2VzLiBJZiB5b3UKIAkgIGVuYWJsZSB0aGlzIG9wdGlvbiwgeW91IGNhbiBzZWxlY3QgdG8gbW91bnQgYmxvY2sgZGV2aWNlcyB3aGljaCBhcmUKQEAgLTc3Niw3ICs3NzYsOCBAQAogbWVudSAiUHNldWRvIGZpbGVzeXN0ZW1zIgogCiBjb25maWcgUFJPQ19GUwotCWJvb2wgIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJYm9vbCAiL3Byb2MgZmlsZSBzeXN0ZW0gc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIGlzIGEgdmlydHVhbCBmaWxlIHN5c3RlbSBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cwogCSAgb2YgdGhlIHN5c3RlbS4gIlZpcnR1YWwiIG1lYW5zIHRoYXQgaXQgZG9lc24ndCB0YWtlIHVwIGFueSBzcGFjZSBvbgpAQCAtMTM3MCwxMSArMTM3MSwxOSBAQAogCiBjb25maWcgVUZTX0ZTX1dSSVRFCiAJYm9vbCAiVUZTIGZpbGUgc3lzdGVtIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCi0JZGVwZW5kcyBvbiBVRlNfRlMgJiYgRVhQRVJJTUVOVEFMICYmIEJST0tFTgorCWRlcGVuZHMgb24gVUZTX0ZTICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdHJ5IHdyaXRpbmcgdG8gVUZTIHBhcnRpdGlvbnMuIFRoaXMgaXMKIAkgIGV4cGVyaW1lbnRhbCwgc28geW91IHNob3VsZCBiYWNrIHVwIHlvdXIgVUZTIHBhcnRpdGlvbnMgYmVmb3JlaGFuZC4KIAorY29uZmlnIFVGU19ERUJVRworCWJvb2wgIlVGUyBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBVRlNfRlMKKwloZWxwCisJICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgVUZTIGZpbGVzeXN0ZW0sIHNheQorCSAgWSBoZXJlLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBfbWFueV8gYWRkaXRpb25hbCBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8gYmUKKwkgIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBsb2cuCisKIGVuZG1lbnUKIAogbWVudSAiTmV0d29yayBGaWxlIFN5c3RlbXMiCmRpZmYgLS1naXQgYS9mcy9hZGZzL3N1cGVyLmMgYi9mcy9hZGZzL3N1cGVyLmMKaW5kZXggMjUyYWJkYS4uYmExYzg4YSAxMDA2NDQKLS0tIGEvZnMvYWRmcy9zdXBlci5jCisrKyBiL2ZzL2FkZnMvc3VwZXIuYwpAQCAtMTk2LDE3ICsxOTYsMTcgQEAKIAlyZXR1cm4gcGFyc2Vfb3B0aW9ucyhzYiwgZGF0YSk7CiB9CiAKLXN0YXRpYyBpbnQgYWRmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgYWRmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewotCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0IoZGVudHJ5LT5kX3NiKTsKIAogCWJ1Zi0+Zl90eXBlICAgID0gQURGU19TVVBFUl9NQUdJQzsKIAlidWYtPmZfbmFtZWxlbiA9IGFzYi0+c19uYW1lbGVuOwotCWJ1Zi0+Zl9ic2l6ZSAgID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ic2l6ZSAgID0gZGVudHJ5LT5kX3NiLT5zX2Jsb2Nrc2l6ZTsKIAlidWYtPmZfYmxvY2tzICA9IGFzYi0+c19zaXplOwogCWJ1Zi0+Zl9maWxlcyAgID0gYXNiLT5zX2lkc19wZXJfem9uZSAqIGFzYi0+c19tYXBfc2l6ZTsKIAlidWYtPmZfYmF2YWlsICA9Ci0JYnVmLT5mX2JmcmVlICAgPSBhZGZzX21hcF9mcmVlKHNiKTsKKwlidWYtPmZfYmZyZWUgICA9IGFkZnNfbWFwX2ZyZWUoZGVudHJ5LT5kX3NiKTsKIAlidWYtPmZfZmZyZWUgICA9IChsb25nKShidWYtPmZfYmZyZWUgKiBidWYtPmZfZmlsZXMpIC8gKGxvbmcpYnVmLT5mX2Jsb2NrczsKIAogCXJldHVybiAwOwpAQCAtNDcwLDEwICs0NzAsMTEgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWRmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYWRmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYWRmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBhZGZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYWRmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9zdXBlci5jIGIvZnMvYWZmcy9zdXBlci5jCmluZGV4IDRkN2U1YjEuLjUyMDBmNDkgMTAwNjQ0Ci0tLSBhL2ZzL2FmZnMvc3VwZXIuYworKysgYi9mcy9hZmZzL3N1cGVyLmMKQEAgLTE4LDcgKzE4LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CiAKLXN0YXRpYyBpbnQgYWZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CitzdGF0aWMgaW50IGFmZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CiBzdGF0aWMgaW50IGFmZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CiAKIHN0YXRpYyB2b2lkCkBAIC0yNzEsNiArMjcxLDcgQEAKIAlpbnQJCQkgcmVzZXJ2ZWQ7CiAJdW5zaWduZWQgbG9uZwkJIG1vdW50X2ZsYWdzOwogCWludAkJCSB0bXBfZmxhZ3M7CS8qIGZpeCByZW1vdW50IHByb3RvdHlwZS4uLiAqLworCXU4CQkJIHNpZ1s0XTsKIAogCXByX2RlYnVnKCJBRkZTOiByZWFkX3N1cGVyKCVzKVxuIixkYXRhID8gKGNvbnN0IGNoYXIgKilkYXRhIDogIm5vIG9wdGlvbnMiKTsKIApAQCAtMzcwLDggKzM3MSw5IEBACiAJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYm9vdCBibG9ja1xuIik7CiAJCWdvdG8gb3V0X2Vycm9yOwogCX0KLQljaGtzdW0gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWJvb3RfYmgtPmJfZGF0YSk7CisJbWVtY3B5KHNpZywgYm9vdF9iaC0+Yl9kYXRhLCA0KTsKIAlicmVsc2UoYm9vdF9iaCk7CisJY2hrc3VtID0gYmUzMl90b19jcHUoKihfX2JlMzIgKilzaWcpOwogCiAJLyogRGlyY2FjaGUgZmlsZXN5c3RlbXMgYXJlIGNvbXBhdGlibGUgd2l0aCBub24tZGlyY2FjaGUgb25lcwogCSAqIHdoZW4gcmVhZGluZy4gQXMgbG9uZyBhcyB0aGV5IGFyZW4ndCBzdXBwb3J0ZWQsIHdyaXRpbmcgaXMKQEAgLTQyMCwxMSArNDIyLDExIEBACiAJfQogCiAJaWYgKG1vdW50X2ZsYWdzICYgU0ZfVkVSQk9TRSkgewotCQljaGtzdW0gPSBjcHVfdG9fYmUzMihjaGtzdW0pOwotCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFGRlM6IE1vdW50aW5nIHZvbHVtZSBcIiUqc1wiOiBUeXBlPSUuM3NcXCVjLCBCbG9ja3NpemU9JWRcbiIsCi0JCQlBRkZTX1JPT1RfVEFJTChzYiwgcm9vdF9iaCktPmRpc2tfbmFtZVswXSwKKwkJdTggbGVuID0gQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWVbMF07CisJCXByaW50ayhLRVJOX05PVElDRSAiQUZGUzogTW91bnRpbmcgdm9sdW1lIFwiJS4qc1wiOiBUeXBlPSUuM3NcXCVjLCBCbG9ja3NpemU9JWRcbiIsCisJCQlsZW4gPiAzMSA/IDMxIDogbGVuLAogCQkJQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWUgKyAxLAotCQkJKGNoYXIgKikmY2hrc3VtLCgoY2hhciAqKSZjaGtzdW0pWzNdICsgJzAnLGJsb2Nrc2l6ZSk7CisJCQlzaWcsIHNpZ1szXSArICcwJywgYmxvY2tzaXplKTsKIAl9CiAKIAlzYi0+c19mbGFncyB8PSBNU19OT0RFViB8IE1TX05PU1VJRDsKQEAgLTUwOCw4ICs1MTAsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1hZmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQorYWZmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJaW50CQkgZnJlZTsKIAogCXByX2RlYnVnKCJBRkZTOiBzdGF0ZnMoKSBwYXJ0c2l6ZT0lZCwgcmVzZXJ2ZWQ9JWRcbiIsQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUsCkBAIC01MjQsMTAgKzUyNywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBhZmZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGFmZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZmZzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9hZnMvZGlyLmMgYi9mcy9hZnMvZGlyLmMKaW5kZXggYTZkZmY2YS4uMmZjOTk4NyAxMDA2NDQKLS0tIGEvZnMvYWZzL2Rpci5jCisrKyBiL2ZzL2Fmcy9kaXIuYwpAQCAtMTg1LDkgKzE4NSw3IEBACiAKIAlfZW50ZXIoInslbHV9LCVsdSIsIGRpci0+aV9pbm8sIGluZGV4KTsKIAotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoZGlyLT5pX21hcHBpbmcsaW5kZXgsCi0JCQkgICAgICAgKGZpbGxlcl90ICopIGRpci0+aV9tYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCi0JCQkgICAgICAgTlVMTCk7CisJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKGRpci0+aV9tYXBwaW5nLCBpbmRleCwgTlVMTCk7CiAJaWYgKCFJU19FUlIocGFnZSkpIHsKIAkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKIAkJa21hcChwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tbnRwdC5jIGIvZnMvYWZzL21udHB0LmMKaW5kZXggNGU2ZWViNS4uOTk3ODVhNyAxMDA2NDQKLS0tIGEvZnMvYWZzL21udHB0LmMKKysrIGIvZnMvYWZzL21udHB0LmMKQEAgLTYzLDcgKzYzLDYgQEAKIGludCBhZnNfbW50cHRfY2hlY2tfc3ltbGluayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlmaWxsZXJfdCAqZmlsbGVyOwogCXNpemVfdCBzaXplOwogCWNoYXIgKmJ1ZjsKIAlpbnQgcmV0OwpAQCAtNzEsMTAgKzcwLDcgQEAKIAlfZW50ZXIoInsldSwldX0iLCB2bm9kZS0+ZmlkLnZub2RlLCB2bm9kZS0+ZmlkLnVuaXF1ZSk7CiAKIAkvKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc3ltbGluayBpbnRvIHRoZSBwYWdlY2FjaGUgKi8KLQlmaWxsZXIgPSAoZmlsbGVyX3QgKikgQUZTX1ZOT0RFX1RPX0kodm5vZGUpLT5pX21hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKLQotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoQUZTX1ZOT0RFX1RPX0kodm5vZGUpLT5pX21hcHBpbmcsIDAsCi0JCQkgICAgICAgZmlsbGVyLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UoQUZTX1ZOT0RFX1RPX0kodm5vZGUpLT5pX21hcHBpbmcsIDAsIE5VTEwpOwogCWlmIChJU19FUlIocGFnZSkpIHsKIAkJcmV0ID0gUFRSX0VSUihwYWdlKTsKIAkJZ290byBvdXQ7CkBAIC0xNjAsNyArMTU2LDYgQEAKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CiAJc2l6ZV90IHNpemU7CiAJY2hhciAqYnVmLCAqZGV2bmFtZSA9IE5VTEwsICpvcHRpb25zID0gTlVMTDsKLQlmaWxsZXJfdCAqZmlsbGVyOwogCWludCByZXQ7CiAKIAlrZW50ZXIoInslc30iLCBtbnRwdC0+ZF9uYW1lLm5hbWUpOwpAQCAtMTgyLDkgKzE3Nyw3IEBACiAJCWdvdG8gZXJyb3I7CiAKIAkvKiByZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgQUZTIHNwZWNpYWwgc3ltbGluayAqLwotCWZpbGxlciA9IChmaWxsZXJfdCAqKW1udHB0LT5kX2lub2RlLT5pX21hcHBpbmctPmFfb3BzLT5yZWFkcGFnZTsKLQotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobW50cHQtPmRfaW5vZGUtPmlfbWFwcGluZywgMCwgZmlsbGVyLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobW50cHQtPmRfaW5vZGUtPmlfbWFwcGluZywgMCwgTlVMTCk7CiAJaWYgKElTX0VSUihwYWdlKSkgewogCQlyZXQgPSBQVFJfRVJSKHBhZ2UpOwogCQlnb3RvIGVycm9yOwpAQCAtMjEwLDcgKzIwMyw3IEBACiAKIAkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLwogCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7Ci0JbW50ID0gZG9fa2Vybl9tb3VudCgiYWZzIiwgMCwgZGV2bmFtZSwgb3B0aW9ucyk7CisJbW50ID0gdmZzX2tlcm5fbW91bnQoJmFmc19mc190eXBlLCAwLCBkZXZuYW1lLCBvcHRpb25zKTsKIAlrZGVidWcoIi0tLSBtb3VudCByZXN1bHQgJXAgLS0tIiwgbW50KTsKIAogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CmRpZmYgLS1naXQgYS9mcy9hZnMvc3VwZXIuYyBiL2ZzL2Fmcy9zdXBlci5jCmluZGV4IDUzYzU2ZTcuLjY3ZDFmNWMgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9zdXBlci5jCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0zOCw5ICszOCw5IEBACiBzdGF0aWMgdm9pZCBhZnNfaV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKIAkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCSAgICAgIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBhZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCk7CiAKIHN0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0aWMgdm9pZCBhZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGFmc19mc190eXBlID0geworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYWZzX2ZzX3R5cGUgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJhZnMiLAogCS5nZXRfc2IJCT0gYWZzX2dldF9zYiwKQEAgLTI5NCwxMCArMjk0LDExIEBACiAgKiBnZXQgYW4gQUZTIHN1cGVyYmxvY2sKICAqIC0gVE9ETzogZG9uJ3QgdXNlIGdldF9zYl9ub2RldigpLCBidXQgcmF0aGVyIGNhbGwgc2dldCgpIGRpcmVjdGx5CiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmFmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgaW50IGZsYWdzLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCSAgICAgIHZvaWQgKm9wdGlvbnMpCitzdGF0aWMgaW50IGFmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCSAgICAgIGludCBmbGFncywKKwkJICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCSAgICAgIHZvaWQgKm9wdGlvbnMsCisJCSAgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zIHBhcmFtczsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwpAQCAtMzExLDcgKzMxMiw3IEBACiAJcmV0ID0gYWZzY21fc3RhcnQoKTsKIAlpZiAocmV0IDwgMCkgewogCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBwYXJzZSB0aGUgb3B0aW9ucyAqLwpAQCAtMzQ4LDE4ICszNDksMTkgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCXNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCiAJYWZzX3B1dF92b2x1bWUocGFyYW1zLnZvbHVtZSk7CiAJYWZzX3B1dF9jZWxsKHBhcmFtcy5kZWZhdWx0X2NlbGwpOwotCV9sZWF2ZSgiID0gJXAiLCBzYik7Ci0JcmV0dXJuIHNiOworCV9sZWF2ZSgiID0gMCBbJXBdIiwgMCwgc2IpOworCXJldHVybiAwOwogCiAgZXJyb3I6CiAJYWZzX3B1dF92b2x1bWUocGFyYW1zLnZvbHVtZSk7CiAJYWZzX3B1dF9jZWxsKHBhcmFtcy5kZWZhdWx0X2NlbGwpOwogCWFmc2NtX3N0b3AoKTsKIAlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKLQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldHVybiByZXQ7CiB9IC8qIGVuZCBhZnNfZ2V0X3NiKCkgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaAppbmRleCBhYzExMzYyLi4zMmRlOGNjIDEwMDY0NAotLS0gYS9mcy9hZnMvc3VwZXIuaAorKysgYi9mcy9hZnMvc3VwZXIuaApAQCAtMzgsNiArMzgsOCBAQAogCXJldHVybiBzYi0+c19mc19pbmZvOwogfQogCitleHRlcm4gc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYWZzX2ZzX3R5cGU7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfTElOVVhfQUZTX1NVUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggZTQxZTkzMi4uOGMzNGE2MiAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTc3NywxMSArNzc3LDExIEBACiBzdGF0aWMgaW50IF9fYWlvX3J1bl9pb2NicyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCiB7CiAJc3RydWN0IGtpb2NiICppb2NiOwotCUxJU1RfSEVBRChydW5fbGlzdCk7CisJc3RydWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKIAogCWFzc2VydF9zcGluX2xvY2tlZCgmY3R4LT5jdHhfbG9jayk7CiAKLQlsaXN0X3NwbGljZV9pbml0KCZjdHgtPnJ1bl9saXN0LCAmcnVuX2xpc3QpOworCWxpc3RfcmVwbGFjZV9pbml0KCZjdHgtPnJ1bl9saXN0LCAmcnVuX2xpc3QpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmcnVuX2xpc3QpKSB7CiAJCWlvY2IgPSBsaXN0X2VudHJ5KHJ1bl9saXN0Lm5leHQsIHN0cnVjdCBraW9jYiwKIAkJCWtpX3J1bl9saXN0KTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbml0LmMgYi9mcy9hdXRvZnMvaW5pdC5jCmluZGV4IGI5NzdlY2UuLmFjYTEyMzcgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mcy9pbml0LmMKKysrIGIvZnMvYXV0b2ZzL2luaXQuYwpAQCAtMTQsMTAgKzE0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgImF1dG9mc19pLmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmF1dG9mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgYXV0b2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBhdXRvZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhdXRvZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvZXhwaXJlLmMgYi9mcy9hdXRvZnM0L2V4cGlyZS5jCmluZGV4IGI4Y2UwMjYuLjQ0NTZkMWQgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvZXhwaXJlLmMKKysrIGIvZnMvYXV0b2ZzNC9leHBpcmUuYwpAQCAtMTc0LDYgKzE3NCwxMiBAQAogCQkJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8ocCk7CiAJCQl1bnNpZ25lZCBpbnQgaW5vX2NvdW50ID0gYXRvbWljX3JlYWQoJmluby0+Y291bnQpOwogCisJCQkvKgorCQkJICogQ2xlYW4gc3RhbGUgZGVudHJpZXMgYmVsb3cgdGhhdCBoYXZlIG5vdCBiZWVuCisJCQkgKiBpbnZhbGlkYXRlZCBhZnRlciBhIG1vdW50IGZhaWwgZHVyaW5nIGxvb2t1cAorCQkJICovCisJCQlkX2ludmFsaWRhdGUocCk7CisKIAkJCS8qIGFsbG93IGZvciBkZ2V0IGFib3ZlIGFuZCB0b3AgaXMgYWxyZWFkeSBkZ290ICovCiAJCQlpZiAocCA9PSB0b3ApCiAJCQkJaW5vX2NvdW50ICs9IDI7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2luaXQuYyBiL2ZzL2F1dG9mczQvaW5pdC5jCmluZGV4IGFjZWNlYzguLjVkOTE5MzMgMTAwNjQ0Ci0tLSBhL2ZzL2F1dG9mczQvaW5pdC5jCisrKyBiL2ZzL2F1dG9mczQvaW5pdC5jCkBAIC0xNCwxMCArMTQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSAiYXV0b2ZzX2kuaCIKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYXV0b2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBhdXRvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGF1dG9mczRfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzNF9maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYXV0b2ZzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKaW5kZXggNjhlYmQxMC4uMDgyMDFmYSAxMDA2NDQKLS0tIGEvZnMvYmVmcy9saW51eHZmcy5jCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtNDksNyArNDksNyBAQAogCQkJY2hhciAqKm91dCwgaW50ICpvdXRfbGVuKTsKIHN0YXRpYyB2b2lkIGJlZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIHN0YXRpYyBpbnQgYmVmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKLXN0YXRpYyBpbnQgYmVmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworc3RhdGljIGludCBiZWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKiwgYmVmc19tb3VudF9vcHRpb25zICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYmVmc19zb3BzID0gewpAQCAtODgwLDggKzg4MCw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitiZWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAogCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfc3RhdGZzKCkiKTsKIApAQCAtODk5LDExICs5MDAsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitzdGF0aWMgaW50CiBiZWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkgICAgdm9pZCAqZGF0YSkKKwkgICAgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYmVmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBiZWZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYmVmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvYmZzL2lub2RlLmMgYi9mcy9iZnMvaW5vZGUuYwppbmRleCA1NWE3YTc4Li5jZjc0ZjNkIDEwMDY0NAotLS0gYS9mcy9iZnMvaW5vZGUuYworKysgYi9mcy9iZnMvaW5vZGUuYwpAQCAtMjAzLDggKzIwMyw5IEBACiAJcy0+c19mc19pbmZvID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBiZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgYmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gZGVudHJ5LT5kX3NiOwogCXN0cnVjdCBiZnNfc2JfaW5mbyAqaW5mbyA9IEJGU19TQihzKTsKIAl1NjQgaWQgPSBodWdlX2VuY29kZV9kZXYocy0+c19iZGV2LT5iZF9kZXYpOwogCWJ1Zi0+Zl90eXBlID0gQkZTX01BR0lDOwpAQCAtNDEwLDEwICs0MTEsMTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBiZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGJmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBiZnNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IDUzNzg5M2EuLmQwNDM0NDAgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTM4LDE1ICszOCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLQorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAotI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgotCi1zdGF0aWMgaW50IGxvYWRfZWxmX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKLXN0YXRpYyBpbnQgbG9hZF9lbGZfbGlicmFyeShzdHJ1Y3QgZmlsZSopOworc3RhdGljIGludCBsb2FkX2VsZl9iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworc3RhdGljIGludCBsb2FkX2VsZl9saWJyYXJ5KHN0cnVjdCBmaWxlICopOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcCAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgbG9uZywgc3RydWN0IGVsZl9waGRyICosIGludCwgaW50KTsKIGV4dGVybiBpbnQgZHVtcF9mcHUgKHN0cnVjdCBwdF9yZWdzICosIGVsZl9mcHJlZ3NldF90ICopOwogCkBAIC01OSwxNSArNTcsMTUgQEAKICAqIGRvbid0IGV2ZW4gdHJ5LgogICovCiAjaWYgZGVmaW5lZChVU0VfRUxGX0NPUkVfRFVNUCkgJiYgZGVmaW5lZChDT05GSUdfRUxGX0NPUkUpCi1zdGF0aWMgaW50IGVsZl9jb3JlX2R1bXAobG9uZyBzaWduciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOworc3RhdGljIGludCBlbGZfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAjZWxzZQogI2RlZmluZSBlbGZfY29yZV9kdW1wCU5VTEwKICNlbmRpZgogCiAjaWYgRUxGX0VYRUNfUEFHRVNJWkUgPiBQQUdFX1NJWkUKLSMgZGVmaW5lIEVMRl9NSU5fQUxJR04JRUxGX0VYRUNfUEFHRVNJWkUKKyNkZWZpbmUgRUxGX01JTl9BTElHTglFTEZfRVhFQ19QQUdFU0laRQogI2Vsc2UKLSMgZGVmaW5lIEVMRl9NSU5fQUxJR04JUEFHRV9TSVpFCisjZGVmaW5lIEVMRl9NSU5fQUxJR04JUEFHRV9TSVpFCiAjZW5kaWYKIAogI2lmbmRlZiBFTEZfQ09SRV9FRkxBR1MKQEAgLTg2LDcgKzg0LDcgQEAKIAkJLm1pbl9jb3JlZHVtcAk9IEVMRl9FWEVDX1BBR0VTSVpFCiB9OwogCi0jZGVmaW5lIEJBRF9BRERSKHgpCSgodW5zaWduZWQgbG9uZykoeCkgPiBUQVNLX1NJWkUpCisjZGVmaW5lIEJBRF9BRERSKHgpICgodW5zaWduZWQgbG9uZykoeCkgPiBUQVNLX1NJWkUpCiAKIHN0YXRpYyBpbnQgc2V0X2Jyayh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKQEAgLTEwNCwxMyArMTAyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLQogLyogV2UgbmVlZCB0byBleHBsaWNpdGx5IHplcm8gYW55IGZyYWN0aW9uYWwgcGFnZXMKICAgIGFmdGVyIHRoZSBkYXRhIHNlY3Rpb24gKGkuZS4gYnNzKS4gIFRoaXMgd291bGQKICAgIGNvbnRhaW4gdGhlIGp1bmsgZnJvbSB0aGUgZmlsZSB0aGF0IHNob3VsZCBub3QKLSAgIGJlIGluIG1lbW9yeSAqLwotCi0KKyAgIGJlIGluIG1lbW9yeQorICovCiBzdGF0aWMgaW50IHBhZHplcm8odW5zaWduZWQgbG9uZyBlbGZfYnNzKQogewogCXVuc2lnbmVkIGxvbmcgbmJ5dGU7CkBAIC0xMjksNyArMTI1LDkgQEAKICNkZWZpbmUgU1RBQ0tfQUREKHNwLCBpdGVtcykgKChlbGZfYWRkcl90IF9fdXNlciAqKShzcCkgKyAoaXRlbXMpKQogI2RlZmluZSBTVEFDS19ST1VORChzcCwgaXRlbXMpIFwKIAkoKDE1ICsgKHVuc2lnbmVkIGxvbmcpICgoc3ApICsgKGl0ZW1zKSkpICZ+IDE1VUwpCi0jZGVmaW5lIFNUQUNLX0FMTE9DKHNwLCBsZW4pICh7IGVsZl9hZGRyX3QgX191c2VyICpvbGRfc3AgPSAoZWxmX2FkZHJfdCBfX3VzZXIgKilzcDsgc3AgKz0gbGVuOyBvbGRfc3A7IH0pCisjZGVmaW5lIFNUQUNLX0FMTE9DKHNwLCBsZW4pICh7IFwKKwllbGZfYWRkcl90IF9fdXNlciAqb2xkX3NwID0gKGVsZl9hZGRyX3QgX191c2VyICopc3A7IHNwICs9IGxlbjsgXAorCW9sZF9zcDsgfSkKICNlbHNlCiAjZGVmaW5lIFNUQUNLX0FERChzcCwgaXRlbXMpICgoZWxmX2FkZHJfdCBfX3VzZXIgKikoc3ApIC0gKGl0ZW1zKSkKICNkZWZpbmUgU1RBQ0tfUk9VTkQoc3AsIGl0ZW1zKSBcCkBAIC0xMzgsNyArMTM2LDcgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50Ci1jcmVhdGVfZWxmX3RhYmxlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgZWxmaGRyICogZXhlYywKK2NyZWF0ZV9lbGZfdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBlbGZoZHIgKmV4ZWMsCiAJCWludCBpbnRlcnBfYW91dCwgdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIsCiAJCXVuc2lnbmVkIGxvbmcgaW50ZXJwX2xvYWRfYWRkcikKIHsKQEAgLTE2MSw3ICsxNTksNiBAQAogCSAqIGZvciB1c2Vyc3BhY2UgdG8gZ2V0IGFueSBvdGhlciB3YXksIGluIG90aGVycyAoaTM4NikgaXQgaXMKIAkgKiBtZXJlbHkgZGlmZmljdWx0LgogCSAqLwotCiAJdV9wbGF0Zm9ybSA9IE5VTEw7CiAJaWYgKGtfcGxhdGZvcm0pIHsKIAkJc2l6ZV90IGxlbiA9IHN0cmxlbihrX3BsYXRmb3JtKSArIDE7CkBAIC0xNzEsNyArMTY4LDcgQEAKIAkJICogZXZpY3Rpb25zIGJ5IHRoZSBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGUgc2FtZSBwYWNrYWdlLiBPbmUKIAkJICogdGhpbmcgd2UgY2FuIGRvIGlzIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCiAJCSAqLwotCSAKKwogCQlwID0gYXJjaF9hbGlnbl9zdGFjayhwKTsKIAogCQl1X3BsYXRmb3JtID0gKGVsZl9hZGRyX3QgX191c2VyICopU1RBQ0tfQUxMT0MocCwgbGVuKTsKQEAgLTE4MCw5ICsxNzcsMTIgQEAKIAl9CiAKIAkvKiBDcmVhdGUgdGhlIEVMRiBpbnRlcnByZXRlciBpbmZvICovCi0JZWxmX2luZm8gPSAoZWxmX2FkZHJfdCAqKSBjdXJyZW50LT5tbS0+c2F2ZWRfYXV4djsKKwllbGZfaW5mbyA9IChlbGZfYWRkcl90ICopY3VycmVudC0+bW0tPnNhdmVkX2F1eHY7CiAjZGVmaW5lIE5FV19BVVhfRU5UKGlkLCB2YWwpIFwKLQlkbyB7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gaWQ7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gdmFsOyB9IHdoaWxlICgwKQorCWRvIHsgXAorCQllbGZfaW5mb1tlaV9pbmRleCsrXSA9IGlkOyBcCisJCWVsZl9pbmZvW2VpX2luZGV4KytdID0gdmFsOyBcCisJfSB3aGlsZSAoMCkKIAogI2lmZGVmIEFSQ0hfRExJTkZPCiAJLyogCkBAIC0xOTUsMjEgKzE5NSwyMiBAQAogCU5FV19BVVhfRU5UKEFUX1BBR0VTWiwgRUxGX0VYRUNfUEFHRVNJWkUpOwogCU5FV19BVVhfRU5UKEFUX0NMS1RDSywgQ0xPQ0tTX1BFUl9TRUMpOwogCU5FV19BVVhfRU5UKEFUX1BIRFIsIGxvYWRfYWRkciArIGV4ZWMtPmVfcGhvZmYpOwotCU5FV19BVVhfRU5UKEFUX1BIRU5ULCBzaXplb2YgKHN0cnVjdCBlbGZfcGhkcikpOworCU5FV19BVVhfRU5UKEFUX1BIRU5ULCBzaXplb2Yoc3RydWN0IGVsZl9waGRyKSk7CiAJTkVXX0FVWF9FTlQoQVRfUEhOVU0sIGV4ZWMtPmVfcGhudW0pOwogCU5FV19BVVhfRU5UKEFUX0JBU0UsIGludGVycF9sb2FkX2FkZHIpOwogCU5FV19BVVhfRU5UKEFUX0ZMQUdTLCAwKTsKIAlORVdfQVVYX0VOVChBVF9FTlRSWSwgZXhlYy0+ZV9lbnRyeSk7Ci0JTkVXX0FVWF9FTlQoQVRfVUlELCAoZWxmX2FkZHJfdCkgdHNrLT51aWQpOwotCU5FV19BVVhfRU5UKEFUX0VVSUQsIChlbGZfYWRkcl90KSB0c2stPmV1aWQpOwotCU5FV19BVVhfRU5UKEFUX0dJRCwgKGVsZl9hZGRyX3QpIHRzay0+Z2lkKTsKLQlORVdfQVVYX0VOVChBVF9FR0lELCAoZWxmX2FkZHJfdCkgdHNrLT5lZ2lkKTsKLSAJTkVXX0FVWF9FTlQoQVRfU0VDVVJFLCAoZWxmX2FkZHJfdCkgc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKKwlORVdfQVVYX0VOVChBVF9VSUQsIHRzay0+dWlkKTsKKwlORVdfQVVYX0VOVChBVF9FVUlELCB0c2stPmV1aWQpOworCU5FV19BVVhfRU5UKEFUX0dJRCwgdHNrLT5naWQpOworCU5FV19BVVhfRU5UKEFUX0VHSUQsIHRzay0+ZWdpZCk7CisgCU5FV19BVVhfRU5UKEFUX1NFQ1VSRSwgc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKIAlpZiAoa19wbGF0Zm9ybSkgewotCQlORVdfQVVYX0VOVChBVF9QTEFURk9STSwgKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpdV9wbGF0Zm9ybSk7CisJCU5FV19BVVhfRU5UKEFUX1BMQVRGT1JNLAorCQkJICAgIChlbGZfYWRkcl90KSh1bnNpZ25lZCBsb25nKXVfcGxhdGZvcm0pOwogCX0KIAlpZiAoYnBybS0+aW50ZXJwX2ZsYWdzICYgQklOUFJNX0ZMQUdTX0VYRUNGRCkgewotCQlORVdfQVVYX0VOVChBVF9FWEVDRkQsIChlbGZfYWRkcl90KSBicHJtLT5pbnRlcnBfZGF0YSk7CisJCU5FV19BVVhfRU5UKEFUX0VYRUNGRCwgYnBybS0+aW50ZXJwX2RhdGEpOwogCX0KICN1bmRlZiBORVdfQVVYX0VOVAogCS8qIEFUX05VTEwgaXMgemVybzsgY2xlYXIgdGhlIHJlc3QgdG9vICovCkBAIC0yMzIsNyArMjMzLDcgQEAKIAkvKiBQb2ludCBzcCBhdCB0aGUgbG93ZXN0IGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCiAjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKIAlzcCA9IChlbGZfYWRkcl90IF9fdXNlciAqKWJwcm0tPnAgLSBpdGVtcyAtIGVpX2luZGV4OwotCWJwcm0tPmV4ZWMgPSAodW5zaWduZWQgbG9uZykgc3A7IC8qIFhYWDogUEFSSVNDIEhBQ0sgKi8KKwlicHJtLT5leGVjID0gKHVuc2lnbmVkIGxvbmcpc3A7IC8qIFhYWDogUEFSSVNDIEhBQ0sgKi8KICNlbHNlCiAJc3AgPSAoZWxmX2FkZHJfdCBfX3VzZXIgKilicHJtLT5wOwogI2VuZGlmCkBAIC0yODUsNyArMjg2LDcgQEAKICNpZm5kZWYgZWxmX21hcAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBlbGZfbWFwKHN0cnVjdCBmaWxlICpmaWxlcCwgdW5zaWduZWQgbG9uZyBhZGRyLAotCQkJc3RydWN0IGVsZl9waGRyICplcHBudCwgaW50IHByb3QsIGludCB0eXBlKQorCQlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50LCBpbnQgcHJvdCwgaW50IHR5cGUpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXBfYWRkcjsKIAl1bnNpZ25lZCBsb25nIHBhZ2VvZmZzZXQgPSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcik7CkBAIC0zMTAsOSArMzExLDggQEAKICAgIGlzIG9ubHkgcHJvdmlkZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBhLm91dCBsaWJyYXJpZXMgdGhhdCBoYXZlCiAgICBhbiBFTEYgaGVhZGVyICovCiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfZWxmX2ludGVycChzdHJ1Y3QgZWxmaGRyICogaW50ZXJwX2VsZl9leCwKLQkJCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nICppbnRlcnBfbG9hZF9hZGRyKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9hZF9lbGZfaW50ZXJwKHN0cnVjdCBlbGZoZHIgKmludGVycF9lbGZfZXgsCisJCXN0cnVjdCBmaWxlICppbnRlcnByZXRlciwgdW5zaWduZWQgbG9uZyAqaW50ZXJwX2xvYWRfYWRkcikKIHsKIAlzdHJ1Y3QgZWxmX3BoZHIgKmVsZl9waGRhdGE7CiAJc3RydWN0IGVsZl9waGRyICplcHBudDsKQEAgLTM0MiwxNSArMzQyLDE1IEBACiAJCWdvdG8gb3V0OwogCiAJLyogTm93IHJlYWQgaW4gYWxsIG9mIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KLQogCXNpemUgPSBzaXplb2Yoc3RydWN0IGVsZl9waGRyKSAqIGludGVycF9lbGZfZXgtPmVfcGhudW07CiAJaWYgKHNpemUgPiBFTEZfTUlOX0FMSUdOKQogCQlnb3RvIG91dDsKLQllbGZfcGhkYXRhID0gKHN0cnVjdCBlbGZfcGhkciAqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWVsZl9waGRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZWxmX3BoZGF0YSkKIAkJZ290byBvdXQ7CiAKLQlyZXR2YWwgPSBrZXJuZWxfcmVhZChpbnRlcnByZXRlcixpbnRlcnBfZWxmX2V4LT5lX3Bob2ZmLChjaGFyICopZWxmX3BoZGF0YSxzaXplKTsKKwlyZXR2YWwgPSBrZXJuZWxfcmVhZChpbnRlcnByZXRlciwgaW50ZXJwX2VsZl9leC0+ZV9waG9mZiwKKwkJCSAgICAgKGNoYXIgKillbGZfcGhkYXRhLHNpemUpOwogCWVycm9yID0gLUVJTzsKIAlpZiAocmV0dmFsICE9IHNpemUpIHsKIAkJaWYgKHJldHZhbCA8IDApCkBAIC0zNTksNTggKzM1OSw2NSBAQAogCX0KIAogCWVwcG50ID0gZWxmX3BoZGF0YTsKLQlmb3IgKGk9MDsgaTxpbnRlcnBfZWxmX2V4LT5lX3BobnVtOyBpKyssIGVwcG50KyspIHsKLQkgIGlmIChlcHBudC0+cF90eXBlID09IFBUX0xPQUQpIHsKLQkgICAgaW50IGVsZl90eXBlID0gTUFQX1BSSVZBVEUgfCBNQVBfREVOWVdSSVRFOwotCSAgICBpbnQgZWxmX3Byb3QgPSAwOwotCSAgICB1bnNpZ25lZCBsb25nIHZhZGRyID0gMDsKLQkgICAgdW5zaWduZWQgbG9uZyBrLCBtYXBfYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgaW50ZXJwX2VsZl9leC0+ZV9waG51bTsgaSsrLCBlcHBudCsrKSB7CisJCWlmIChlcHBudC0+cF90eXBlID09IFBUX0xPQUQpIHsKKwkJCWludCBlbGZfdHlwZSA9IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURTsKKwkJCWludCBlbGZfcHJvdCA9IDA7CisJCQl1bnNpZ25lZCBsb25nIHZhZGRyID0gMDsKKwkJCXVuc2lnbmVkIGxvbmcgaywgbWFwX2FkZHI7CiAKLQkgICAgaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfUikgZWxmX3Byb3QgPSAgUFJPVF9SRUFEOwotCSAgICBpZiAoZXBwbnQtPnBfZmxhZ3MgJiBQRl9XKSBlbGZfcHJvdCB8PSBQUk9UX1dSSVRFOwotCSAgICBpZiAoZXBwbnQtPnBfZmxhZ3MgJiBQRl9YKSBlbGZfcHJvdCB8PSBQUk9UX0VYRUM7Ci0JICAgIHZhZGRyID0gZXBwbnQtPnBfdmFkZHI7Ci0JICAgIGlmIChpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRVhFQyB8fCBsb2FkX2FkZHJfc2V0KQotCSAgICAJZWxmX3R5cGUgfD0gTUFQX0ZJWEVEOworCQkJaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfUikKKwkJICAgIAkJZWxmX3Byb3QgPSBQUk9UX1JFQUQ7CisJCQlpZiAoZXBwbnQtPnBfZmxhZ3MgJiBQRl9XKQorCQkJCWVsZl9wcm90IHw9IFBST1RfV1JJVEU7CisJCQlpZiAoZXBwbnQtPnBfZmxhZ3MgJiBQRl9YKQorCQkJCWVsZl9wcm90IHw9IFBST1RfRVhFQzsKKwkJCXZhZGRyID0gZXBwbnQtPnBfdmFkZHI7CisJCQlpZiAoaW50ZXJwX2VsZl9leC0+ZV90eXBlID09IEVUX0VYRUMgfHwgbG9hZF9hZGRyX3NldCkKKwkJCQllbGZfdHlwZSB8PSBNQVBfRklYRUQ7CiAKLQkgICAgbWFwX2FkZHIgPSBlbGZfbWFwKGludGVycHJldGVyLCBsb2FkX2FkZHIgKyB2YWRkciwgZXBwbnQsIGVsZl9wcm90LCBlbGZfdHlwZSk7Ci0JICAgIGVycm9yID0gbWFwX2FkZHI7Ci0JICAgIGlmIChCQURfQUREUihtYXBfYWRkcikpCi0JICAgIAlnb3RvIG91dF9jbG9zZTsKKwkJCW1hcF9hZGRyID0gZWxmX21hcChpbnRlcnByZXRlciwgbG9hZF9hZGRyICsgdmFkZHIsCisJCQkJCSAgIGVwcG50LCBlbGZfcHJvdCwgZWxmX3R5cGUpOworCQkJZXJyb3IgPSBtYXBfYWRkcjsKKwkJCWlmIChCQURfQUREUihtYXBfYWRkcikpCisJCQkJZ290byBvdXRfY2xvc2U7CiAKLQkgICAgaWYgKCFsb2FkX2FkZHJfc2V0ICYmIGludGVycF9lbGZfZXgtPmVfdHlwZSA9PSBFVF9EWU4pIHsKLQkJbG9hZF9hZGRyID0gbWFwX2FkZHIgLSBFTEZfUEFHRVNUQVJUKHZhZGRyKTsKLQkJbG9hZF9hZGRyX3NldCA9IDE7Ci0JICAgIH0KKwkJCWlmICghbG9hZF9hZGRyX3NldCAmJgorCQkJICAgIGludGVycF9lbGZfZXgtPmVfdHlwZSA9PSBFVF9EWU4pIHsKKwkJCQlsb2FkX2FkZHIgPSBtYXBfYWRkciAtIEVMRl9QQUdFU1RBUlQodmFkZHIpOworCQkJCWxvYWRfYWRkcl9zZXQgPSAxOworCQkJfQogCi0JICAgIC8qCi0JICAgICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VjdGlvbidzIHNpemUgd2lsbCBvdmVyZmxvdyB0aGUKLQkgICAgICogYWxsb3dlZCB0YXNrIHNpemUuIE5vdGUgdGhhdCBwX2ZpbGVzeiBtdXN0IGFsd2F5cyBiZQotCSAgICAgKiA8PSBwX21lbXNpemUgc28gaXQgaXMgb25seSBuZWNlc3NhcnkgdG8gY2hlY2sgcF9tZW1zei4KLQkgICAgICovCi0JICAgIGsgPSBsb2FkX2FkZHIgKyBlcHBudC0+cF92YWRkcjsKLQkgICAgaWYgKGsgPiBUQVNLX1NJWkUgfHwgZXBwbnQtPnBfZmlsZXN6ID4gZXBwbnQtPnBfbWVtc3ogfHwKLQkJZXBwbnQtPnBfbWVtc3ogPiBUQVNLX1NJWkUgfHwgVEFTS19TSVpFIC0gZXBwbnQtPnBfbWVtc3ogPCBrKSB7Ci0JICAgICAgICBlcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2Nsb3NlOwotCSAgICB9CisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWN0aW9uJ3Mgc2l6ZSB3aWxsIG92ZXJmbG93IHRoZQorCQkJICogYWxsb3dlZCB0YXNrIHNpemUuIE5vdGUgdGhhdCBwX2ZpbGVzeiBtdXN0IGFsd2F5cyBiZQorCQkJICogPD0gcF9tZW1zaXplIHNvIGl0J3Mgb25seSBuZWNlc3NhcnkgdG8gY2hlY2sgcF9tZW1zei4KKwkJCSAqLworCQkJayA9IGxvYWRfYWRkciArIGVwcG50LT5wX3ZhZGRyOworCQkJaWYgKGsgPiBUQVNLX1NJWkUgfHwKKwkJCSAgICBlcHBudC0+cF9maWxlc3ogPiBlcHBudC0+cF9tZW1zeiB8fAorCQkJICAgIGVwcG50LT5wX21lbXN6ID4gVEFTS19TSVpFIHx8CisJCQkgICAgVEFTS19TSVpFIC0gZXBwbnQtPnBfbWVtc3ogPCBrKSB7CisJCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0X2Nsb3NlOworCQkJfQogCi0JICAgIC8qCi0JICAgICAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSBtYXBwaW5nIGZvciB0aGlzIHBoZHIsIGFuZCBrZWVwCi0JICAgICAqIHRyYWNrIG9mIHRoZSBsYXJnZXN0IGFkZHJlc3Mgd2Ugc2VlIGZvciB0aGlzLgotCSAgICAgKi8KLQkgICAgayA9IGxvYWRfYWRkciArIGVwcG50LT5wX3ZhZGRyICsgZXBwbnQtPnBfZmlsZXN6OwotCSAgICBpZiAoayA+IGVsZl9ic3MpCi0JCWVsZl9ic3MgPSBrOworCQkJLyoKKwkJCSAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSBtYXBwaW5nIGZvciB0aGlzIHBoZHIsIGFuZAorCQkJICoga2VlcCB0cmFjayBvZiB0aGUgbGFyZ2VzdCBhZGRyZXNzIHdlIHNlZSBmb3IgdGhpcy4KKwkJCSAqLworCQkJayA9IGxvYWRfYWRkciArIGVwcG50LT5wX3ZhZGRyICsgZXBwbnQtPnBfZmlsZXN6OworCQkJaWYgKGsgPiBlbGZfYnNzKQorCQkJCWVsZl9ic3MgPSBrOwogCi0JICAgIC8qCi0JICAgICAqIERvIHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgbWVtb3J5IG1hcHBpbmcgLSBiZXR3ZWVuCi0JICAgICAqIGVsZl9ic3MgYW5kIGxhc3RfYnNzIGlzIHRoZSBic3Mgc2VjdGlvbi4KLQkgICAgICovCi0JICAgIGsgPSBsb2FkX2FkZHIgKyBlcHBudC0+cF9tZW1zeiArIGVwcG50LT5wX3ZhZGRyOwotCSAgICBpZiAoayA+IGxhc3RfYnNzKQotCQlsYXN0X2JzcyA9IGs7Ci0JICB9CisJCQkvKgorCQkJICogRG8gdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBtZW1vcnkgbWFwcGluZyAtIGJldHdlZW4KKwkJCSAqIGVsZl9ic3MgYW5kIGxhc3RfYnNzIGlzIHRoZSBic3Mgc2VjdGlvbi4KKwkJCSAqLworCQkJayA9IGxvYWRfYWRkciArIGVwcG50LT5wX21lbXN6ICsgZXBwbnQtPnBfdmFkZHI7CisJCQlpZiAoayA+IGxhc3RfYnNzKQorCQkJCWxhc3RfYnNzID0gazsKKwkJfQogCX0KIAogCS8qCkBAIC00MjQsNyArNDMxLDggQEAKIAkJZ290byBvdXRfY2xvc2U7CiAJfQogCi0JZWxmX2JzcyA9IEVMRl9QQUdFU1RBUlQoZWxmX2JzcyArIEVMRl9NSU5fQUxJR04gLSAxKTsJLyogV2hhdCB3ZSBoYXZlIG1hcHBlZCBzbyBmYXIgKi8KKwkvKiBXaGF0IHdlIGhhdmUgbWFwcGVkIHNvIGZhciAqLworCWVsZl9ic3MgPSBFTEZfUEFHRVNUQVJUKGVsZl9ic3MgKyBFTEZfTUlOX0FMSUdOIC0gMSk7CiAKIAkvKiBNYXAgdGhlIGxhc3Qgb2YgdGhlIGJzcyBzZWdtZW50ICovCiAJaWYgKGxhc3RfYnNzID4gZWxmX2JzcykgewpAQCAtNDM2LDcgKzQ0NCw3IEBACiAJfQogCiAJKmludGVycF9sb2FkX2FkZHIgPSBsb2FkX2FkZHI7Ci0JZXJyb3IgPSAoKHVuc2lnbmVkIGxvbmcpIGludGVycF9lbGZfZXgtPmVfZW50cnkpICsgbG9hZF9hZGRyOworCWVycm9yID0gKCh1bnNpZ25lZCBsb25nKWludGVycF9lbGZfZXgtPmVfZW50cnkpICsgbG9hZF9hZGRyOwogCiBvdXRfY2xvc2U6CiAJa2ZyZWUoZWxmX3BoZGF0YSk7CkBAIC00NDQsOCArNDUyLDggQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfYW91dF9pbnRlcnAoc3RydWN0IGV4ZWMgKiBpbnRlcnBfZXgsCi0JCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb2FkX2FvdXRfaW50ZXJwKHN0cnVjdCBleGVjICppbnRlcnBfZXgsCisJCXN0cnVjdCBmaWxlICppbnRlcnByZXRlcikKIHsKIAl1bnNpZ25lZCBsb25nIHRleHRfZGF0YSwgZWxmX2VudHJ5ID0gfjBVTDsKIAljaGFyIF9fdXNlciAqIGFkZHI7CkBAIC00NjQsNyArNDcyLDcgQEAKIAljYXNlIFpNQUdJQzoKIAljYXNlIFFNQUdJQzoKIAkJb2Zmc2V0ID0gTl9UWFRPRkYoKmludGVycF9leCk7Ci0JCWFkZHIgPSAoY2hhciBfX3VzZXIgKikgTl9UWFRBRERSKCppbnRlcnBfZXgpOworCQlhZGRyID0gKGNoYXIgX191c2VyICopTl9UWFRBRERSKCppbnRlcnBfZXgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlnb3RvIG91dDsKQEAgLTQ4MCw3ICs0ODgsNiBAQAogCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZylhZGRyLAogCSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylhZGRyICsgdGV4dF9kYXRhKTsKIAotCiAJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsJCiAJZG9fYnJrKEVMRl9QQUdFU1RBUlQodGV4dF9kYXRhICsgRUxGX01JTl9BTElHTiAtIDEpLAogCQlpbnRlcnBfZXgtPmFfYnNzKTsKQEAgLTUxOSw3ICs1MjYsNyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbnQgbG9hZF9lbGZfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCitzdGF0aWMgaW50IGxvYWRfZWxmX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIgPSBOVUxMOyAvKiB0byBzaHV0IGdjYyB1cCAqLwogIAl1bnNpZ25lZCBsb25nIGxvYWRfYWRkciA9IDAsIGxvYWRfYmlhcyA9IDA7CkBAIC01MjgsNyArNTM1LDcgQEAKIAl1bnNpZ25lZCBpbnQgaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX05PTkU7CiAJdW5zaWduZWQgY2hhciBpYmNzMl9pbnRlcnByZXRlciA9IDA7CiAJdW5zaWduZWQgbG9uZyBlcnJvcjsKLQlzdHJ1Y3QgZWxmX3BoZHIgKiBlbGZfcHBudCwgKmVsZl9waGRhdGE7CisJc3RydWN0IGVsZl9waGRyICplbGZfcHBudCwgKmVsZl9waGRhdGE7CiAJdW5zaWduZWQgbG9uZyBlbGZfYnNzLCBlbGZfYnJrOwogCWludCBlbGZfZXhlY19maWxlbm87CiAJaW50IHJldHZhbCwgaTsKQEAgLTU1Myw3ICs1NjAsNyBAQAogCX0KIAkKIAkvKiBHZXQgdGhlIGV4ZWMtaGVhZGVyICovCi0JbG9jLT5lbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopIGJwcm0tPmJ1Zik7CisJbG9jLT5lbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopYnBybS0+YnVmKTsKIAogCXJldHZhbCA9IC1FTk9FWEVDOwogCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCkBAIC01NjgsNyArNTc1LDYgQEAKIAkJZ290byBvdXQ7CiAKIAkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotCiAJaWYgKGxvYy0+ZWxmX2V4LmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQogCQlnb3RvIG91dDsKIAlpZiAobG9jLT5lbGZfZXguZV9waG51bSA8IDEgfHwKQEAgLTU3NiwxOCArNTgyLDE5IEBACiAJCWdvdG8gb3V0OwogCXNpemUgPSBsb2MtPmVsZl9leC5lX3BobnVtICogc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CiAJcmV0dmFsID0gLUVOT01FTTsKLQllbGZfcGhkYXRhID0gKHN0cnVjdCBlbGZfcGhkciAqKSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWVsZl9waGRhdGEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghZWxmX3BoZGF0YSkKIAkJZ290byBvdXQ7CiAKLQlyZXR2YWwgPSBrZXJuZWxfcmVhZChicHJtLT5maWxlLCBsb2MtPmVsZl9leC5lX3Bob2ZmLCAoY2hhciAqKSBlbGZfcGhkYXRhLCBzaXplKTsKKwlyZXR2YWwgPSBrZXJuZWxfcmVhZChicHJtLT5maWxlLCBsb2MtPmVsZl9leC5lX3Bob2ZmLAorCQkJICAgICAoY2hhciAqKWVsZl9waGRhdGEsIHNpemUpOwogCWlmIChyZXR2YWwgIT0gc2l6ZSkgewogCQlpZiAocmV0dmFsID49IDApCiAJCQlyZXR2YWwgPSAtRUlPOwogCQlnb3RvIG91dF9mcmVlX3BoOwogCX0KIAotCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CQkvKiBSZWZjb3VudGVkIHNvIG9rICovCisJZmlsZXMgPSBjdXJyZW50LT5maWxlczsJLyogUmVmY291bnRlZCBzbyBvayAqLwogCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXRfZnJlZV9waDsKQEAgLTU5OCw3ICs2MDUsNiBAQAogCiAJLyogZXhlYyB3aWxsIG1ha2Ugb3VyIGZpbGVzIHByaXZhdGUgYW55d2F5LCBidXQgZm9yIHRoZSBhLm91dAogCSAgIGxvYWRlciBzdHVmZiB3ZSBuZWVkIHRvIGRvIGl0IGVhcmxpZXIgKi8KLQogCXJldHZhbCA9IGdldF91bnVzZWRfZmQoKTsKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBvdXRfZnJlZV9maDsKQEAgLTYyMCw3ICs2MjYsNiBAQAogCQkJICogc2hhcmVkIGxpYnJhcmllcyAtIGZvciBub3cgYXNzdW1lIHRoYXQgdGhpcwogCQkJICogaXMgYW4gYS5vdXQgZm9ybWF0IGJpbmFyeQogCQkJICovCi0KIAkJCXJldHZhbCA9IC1FTk9FWEVDOwogCQkJaWYgKGVsZl9wcG50LT5wX2ZpbGVzeiA+IFBBVEhfTUFYIHx8IAogCQkJICAgIGVsZl9wcG50LT5wX2ZpbGVzeiA8IDIpCkBAIC02MjgsMTMgKzYzMywxMyBAQAogCiAJCQlyZXR2YWwgPSAtRU5PTUVNOwogCQkJZWxmX2ludGVycHJldGVyID0ga21hbGxvYyhlbGZfcHBudC0+cF9maWxlc3osCi0JCQkJCQkJICAgR0ZQX0tFUk5FTCk7CisJCQkJCQkgIEdGUF9LRVJORUwpOwogCQkJaWYgKCFlbGZfaW50ZXJwcmV0ZXIpCiAJCQkJZ290byBvdXRfZnJlZV9maWxlOwogCiAJCQlyZXR2YWwgPSBrZXJuZWxfcmVhZChicHJtLT5maWxlLCBlbGZfcHBudC0+cF9vZmZzZXQsCi0JCQkJCSAgIGVsZl9pbnRlcnByZXRlciwKLQkJCQkJICAgZWxmX3BwbnQtPnBfZmlsZXN6KTsKKwkJCQkJICAgICBlbGZfaW50ZXJwcmV0ZXIsCisJCQkJCSAgICAgZWxmX3BwbnQtPnBfZmlsZXN6KTsKIAkJCWlmIChyZXR2YWwgIT0gZWxmX3BwbnQtPnBfZmlsZXN6KSB7CiAJCQkJaWYgKHJldHZhbCA+PSAwKQogCQkJCQlyZXR2YWwgPSAtRUlPOwpAQCAtNjc4LDcgKzY4Myw4IEBACiAJCQlyZXR2YWwgPSBQVFJfRVJSKGludGVycHJldGVyKTsKIAkJCWlmIChJU19FUlIoaW50ZXJwcmV0ZXIpKQogCQkJCWdvdG8gb3V0X2ZyZWVfaW50ZXJwOwotCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoaW50ZXJwcmV0ZXIsIDAsIGJwcm0tPmJ1ZiwgQklOUFJNX0JVRl9TSVpFKTsKKwkJCXJldHZhbCA9IGtlcm5lbF9yZWFkKGludGVycHJldGVyLCAwLCBicHJtLT5idWYsCisJCQkJCSAgICAgQklOUFJNX0JVRl9TSVpFKTsKIAkJCWlmIChyZXR2YWwgIT0gQklOUFJNX0JVRl9TSVpFKSB7CiAJCQkJaWYgKHJldHZhbCA+PSAwKQogCQkJCQlyZXR2YWwgPSAtRUlPOwpAQCAtNjg2LDggKzY5Miw4IEBACiAJCQl9CiAKIAkJCS8qIEdldCB0aGUgZXhlYyBoZWFkZXJzICovCi0JCQlsb2MtPmludGVycF9leCA9ICooKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1Zik7Ci0JCQlsb2MtPmludGVycF9lbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopIGJwcm0tPmJ1Zik7CisJCQlsb2MtPmludGVycF9leCA9ICooKHN0cnVjdCBleGVjICopYnBybS0+YnVmKTsKKwkJCWxvYy0+aW50ZXJwX2VsZl9leCA9ICooKHN0cnVjdCBlbGZoZHIgKilicHJtLT5idWYpOwogCQkJYnJlYWs7CiAJCX0KIAkJZWxmX3BwbnQrKzsKQEAgLTczOSw3ICs3NDUsNiBAQAogCiAJLyogT0ssIHdlIGFyZSBkb25lIHdpdGggdGhhdCwgbm93IHNldCB1cCB0aGUgYXJnIHN0dWZmLAogCSAgIGFuZCB0aGVuIHN0YXJ0IHRoaXMgc3Vja2VyIHVwICovCi0KIAlpZiAoKCFicHJtLT5zaF9iYW5nKSAmJiAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKSkgewogCQljaGFyICpwYXNzZWRfcCA9IHBhc3NlZF9maWxlbm87CiAJCXNwcmludGYocGFzc2VkX2ZpbGVubywgIiVkIiwgZWxmX2V4ZWNfZmlsZW5vKTsKQEAgLTc1OSw3ICs3NjQsNiBAQAogCiAJLyogRGlzY2FyZCBvdXIgdW5uZWVkZWQgb2xkIGZpbGVzIHN0cnVjdCAqLwogCWlmIChmaWxlcykgewotCQlzdGVhbF9sb2NrcyhmaWxlcyk7CiAJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOwogCQlmaWxlcyA9IE5VTEw7CiAJfQpAQCAtNzc4LDcgKzc4Miw3IEBACiAJaWYgKGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhsb2MtPmVsZl9leCwgZXhlY3V0YWJsZV9zdGFjaykpCiAJCWN1cnJlbnQtPnBlcnNvbmFsaXR5IHw9IFJFQURfSU1QTElFU19FWEVDOwogCi0JaWYgKCAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKKwlpZiAoIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfTk9fUkFORE9NSVpFKSAmJiByYW5kb21pemVfdmFfc3BhY2UpCiAJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1JBTkRPTUlaRTsKIAlhcmNoX3BpY2tfbW1hcF9sYXlvdXQoY3VycmVudC0+bW0pOwogCkBAIC03OTksOCArODAzLDggQEAKIAkgICB0aGUgY29ycmVjdCBsb2NhdGlvbiBpbiBtZW1vcnkuICBBdCB0aGlzIHBvaW50LCB3ZSBhc3N1bWUgdGhhdAogCSAgIHRoZSBpbWFnZSBzaG91bGQgYmUgbG9hZGVkIGF0IGZpeGVkIGFkZHJlc3MsIG5vdCBhdCBhIHZhcmlhYmxlCiAJICAgYWRkcmVzcy4gKi8KLQotCWZvcihpID0gMCwgZWxmX3BwbnQgPSBlbGZfcGhkYXRhOyBpIDwgbG9jLT5lbGZfZXguZV9waG51bTsgaSsrLCBlbGZfcHBudCsrKSB7CisJZm9yKGkgPSAwLCBlbGZfcHBudCA9IGVsZl9waGRhdGE7CisJICAgIGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKIAkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOwogCQl1bnNpZ25lZCBsb25nIGssIHZhZGRyOwogCkBAIC04MjgsMzAgKzgzMiwzNSBAQAogCQkJCQkJCWxvYWRfYmlhcywgbmJ5dGUpKSB7CiAJCQkJCS8qCiAJCQkJCSAqIFRoaXMgYnNzLXplcm9pbmcgY2FuIGZhaWwgaWYgdGhlIEVMRgotCQkJCQkgKiBmaWxlIHNwZWNpZmllcyBvZGQgcHJvdGVjdGlvbnMuICBTbworCQkJCQkgKiBmaWxlIHNwZWNpZmllcyBvZGQgcHJvdGVjdGlvbnMuIFNvCiAJCQkJCSAqIHdlIGRvbid0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKIAkJCQkJICovCiAJCQkJfQogCQkJfQogCQl9CiAKLQkJaWYgKGVsZl9wcG50LT5wX2ZsYWdzICYgUEZfUikgZWxmX3Byb3QgfD0gUFJPVF9SRUFEOwotCQlpZiAoZWxmX3BwbnQtPnBfZmxhZ3MgJiBQRl9XKSBlbGZfcHJvdCB8PSBQUk9UX1dSSVRFOwotCQlpZiAoZWxmX3BwbnQtPnBfZmxhZ3MgJiBQRl9YKSBlbGZfcHJvdCB8PSBQUk9UX0VYRUM7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1IpCisJCQllbGZfcHJvdCB8PSBQUk9UX1JFQUQ7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1cpCisJCQllbGZfcHJvdCB8PSBQUk9UX1dSSVRFOworCQlpZiAoZWxmX3BwbnQtPnBfZmxhZ3MgJiBQRl9YKQorCQkJZWxmX3Byb3QgfD0gUFJPVF9FWEVDOwogCi0JCWVsZl9mbGFncyA9IE1BUF9QUklWQVRFfE1BUF9ERU5ZV1JJVEV8TUFQX0VYRUNVVEFCTEU7CisJCWVsZl9mbGFncyA9IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSB8IE1BUF9FWEVDVVRBQkxFOwogCiAJCXZhZGRyID0gZWxmX3BwbnQtPnBfdmFkZHI7CiAJCWlmIChsb2MtPmVsZl9leC5lX3R5cGUgPT0gRVRfRVhFQyB8fCBsb2FkX2FkZHJfc2V0KSB7CiAJCQllbGZfZmxhZ3MgfD0gTUFQX0ZJWEVEOwogCQl9IGVsc2UgaWYgKGxvYy0+ZWxmX2V4LmVfdHlwZSA9PSBFVF9EWU4pIHsKLQkJCS8qIFRyeSBhbmQgZ2V0IGR5bmFtaWMgcHJvZ3JhbXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIGRlZmF1bHQgbW1hcAotCQkJICAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkgbWlnaHQgdHJ5IHRvIGV4ZWMuICBUaGlzCi0JCQkgICBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbCBmb2xsb3cgdGhlIGxvYWRlciwgYW5kIGlzIG5vdCBtb3ZhYmxlLiAgKi8KKwkJCS8qIFRyeSBhbmQgZ2V0IGR5bmFtaWMgcHJvZ3JhbXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlCisJCQkgKiBkZWZhdWx0IG1tYXAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkKKwkJCSAqIG1pZ2h0IHRyeSB0byBleGVjLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbAorCQkJICogZm9sbG93IHRoZSBsb2FkZXIsIGFuZCBpcyBub3QgbW92YWJsZS4gICovCiAJCQlsb2FkX2JpYXMgPSBFTEZfUEFHRVNUQVJUKEVMRl9FVF9EWU5fQkFTRSAtIHZhZGRyKTsKIAkJfQogCi0JCWVycm9yID0gZWxmX21hcChicHJtLT5maWxlLCBsb2FkX2JpYXMgKyB2YWRkciwgZWxmX3BwbnQsIGVsZl9wcm90LCBlbGZfZmxhZ3MpOworCQllcnJvciA9IGVsZl9tYXAoYnBybS0+ZmlsZSwgbG9hZF9iaWFzICsgdmFkZHIsIGVsZl9wcG50LAorCQkJCWVsZl9wcm90LCBlbGZfZmxhZ3MpOwogCQlpZiAoQkFEX0FERFIoZXJyb3IpKSB7CiAJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKIAkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OwpAQCAtODY4LDggKzg3NywxMCBAQAogCQkJfQogCQl9CiAJCWsgPSBlbGZfcHBudC0+cF92YWRkcjsKLQkJaWYgKGsgPCBzdGFydF9jb2RlKSBzdGFydF9jb2RlID0gazsKLQkJaWYgKHN0YXJ0X2RhdGEgPCBrKSBzdGFydF9kYXRhID0gazsKKwkJaWYgKGsgPCBzdGFydF9jb2RlKQorCQkJc3RhcnRfY29kZSA9IGs7CisJCWlmIChzdGFydF9kYXRhIDwgaykKKwkJCXN0YXJ0X2RhdGEgPSBrOwogCiAJCS8qCiAJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VjdGlvbidzIHNpemUgd2lsbCBvdmVyZmxvdyB0aGUKQEAgLTg3OSw3ICs4OTAsNyBAQAogCQlpZiAoayA+IFRBU0tfU0laRSB8fCBlbGZfcHBudC0+cF9maWxlc3ogPiBlbGZfcHBudC0+cF9tZW1zeiB8fAogCQkgICAgZWxmX3BwbnQtPnBfbWVtc3ogPiBUQVNLX1NJWkUgfHwKIAkJICAgIFRBU0tfU0laRSAtIGVsZl9wcG50LT5wX21lbXN6IDwgaykgewotCQkJLyogc2V0X2JyayBjYW4gbmV2ZXIgd29yay4gIEF2b2lkIG92ZXJmbG93cy4gICovCisJCQkvKiBzZXRfYnJrIGNhbiBuZXZlciB3b3JrLiBBdm9pZCBvdmVyZmxvd3MuICovCiAJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKIAkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OwogCQl9CkBAIC05NjcsOCArOTc4LDkgQEAKIAogCWNvbXB1dGVfY3JlZHMoYnBybSk7CiAJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7Ci0JY3JlYXRlX2VsZl90YWJsZXMoYnBybSwgJmxvYy0+ZWxmX2V4LCAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKSwKLQkJCWxvYWRfYWRkciwgaW50ZXJwX2xvYWRfYWRkcik7CisJY3JlYXRlX2VsZl90YWJsZXMoYnBybSwgJmxvYy0+ZWxmX2V4LAorCQkJICAoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9BT1VUKSwKKwkJCSAgbG9hZF9hZGRyLCBpbnRlcnBfbG9hZF9hZGRyKTsKIAkvKiBOLkIuIHBhc3NlZF9maWxlbm8gbWlnaHQgbm90IGJlIGluaXRpYWxpemVkPyAqLwogCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpCiAJCWN1cnJlbnQtPm1tLT5hcmdfc3RhcnQgKz0gc3RybGVuKHBhc3NlZF9maWxlbm8pICsgMTsKQEAgLTk4Miw3ICs5OTQsNyBAQAogCQkvKiBXaHkgdGhpcywgeW91IGFzaz8/PyAgV2VsbCBTVnI0IG1hcHMgcGFnZSAwIGFzIHJlYWQtb25seSwKIAkJICAgYW5kIHNvbWUgYXBwbGljYXRpb25zICJkZXBlbmQiIHVwb24gdGhpcyBiZWhhdmlvci4KIAkJICAgU2luY2Ugd2UgZG8gbm90IGhhdmUgdGhlIHBvd2VyIHRvIHJlY29tcGlsZSB0aGVzZSwgd2UKLQkJICAgZW11bGF0ZSB0aGUgU1ZyNCBiZWhhdmlvci4gIFNpZ2guICAqLworCQkgICBlbXVsYXRlIHRoZSBTVnI0IGJlaGF2aW9yLiBTaWdoLiAqLwogCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwogCQllcnJvciA9IGRvX21tYXAoTlVMTCwgMCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX0VYRUMsCiAJCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIDApOwpAQCAtMTAzNyw3ICsxMDQ5LDYgQEAKIAogLyogVGhpcyBpcyByZWFsbHkgc2ltcGxlbWluZGVkIGFuZCBzcGVjaWFsaXplZCAtIHdlIGFyZSBsb2FkaW5nIGFuCiAgICBhLm91dCBsaWJyYXJ5IHRoYXQgaXMgZ2l2ZW4gYW4gRUxGIGhlYWRlci4gKi8KLQogc3RhdGljIGludCBsb2FkX2VsZl9saWJyYXJ5KHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCBlbGZfcGhkciAqZWxmX3BoZGF0YTsKQEAgLTEwNDcsNyArMTA1OCw3IEBACiAJc3RydWN0IGVsZmhkciBlbGZfZXg7CiAKIAllcnJvciA9IC1FTk9FWEVDOwotCXJldHZhbCA9IGtlcm5lbF9yZWFkKGZpbGUsIDAsIChjaGFyICopICZlbGZfZXgsIHNpemVvZihlbGZfZXgpKTsKKwlyZXR2YWwgPSBrZXJuZWxfcmVhZChmaWxlLCAwLCAoY2hhciAqKSZlbGZfZXgsIHNpemVvZihlbGZfZXgpKTsKIAlpZiAocmV0dmFsICE9IHNpemVvZihlbGZfZXgpKQogCQlnb3RvIG91dDsKIApAQCAtMTA1Niw3ICsxMDY3LDcgQEAKIAogCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCiAJaWYgKGVsZl9leC5lX3R5cGUgIT0gRVRfRVhFQyB8fCBlbGZfZXguZV9waG51bSA+IDIgfHwKLQkgICAhZWxmX2NoZWNrX2FyY2goJmVsZl9leCkgfHwgIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCisJICAgICFlbGZfY2hlY2tfYXJjaCgmZWxmX2V4KSB8fCAhZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+bW1hcCkKIAkJZ290byBvdXQ7CiAKIAkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLwpAQCAtMTEwNCw3ICsxMTE1LDggQEAKIAkJZ290byBvdXRfZnJlZV9waDsKIAl9CiAKLQlsZW4gPSBFTEZfUEFHRVNUQVJUKGVwcG50LT5wX2ZpbGVzeiArIGVwcG50LT5wX3ZhZGRyICsgRUxGX01JTl9BTElHTiAtIDEpOworCWxlbiA9IEVMRl9QQUdFU1RBUlQoZXBwbnQtPnBfZmlsZXN6ICsgZXBwbnQtPnBfdmFkZHIgKworCQkJICAgIEVMRl9NSU5fQUxJR04gLSAxKTsKIAlic3MgPSBlcHBudC0+cF9tZW1zeiArIGVwcG50LT5wX3ZhZGRyOwogCWlmIChic3MgPiBsZW4pIHsKIAkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKQEAgLTExNjMsNyArMTE3NSw3IEBACiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9SRVNFUlZFRCkpCiAJCXJldHVybiAwOwogCi0JLyogRHVtcCBzaGFyZWQgbWVtb3J5IG9ubHkgaWYgbWFwcGVkIGZyb20gYW4gYW5vbnltb3VzIGZpbGUuICAqLworCS8qIER1bXAgc2hhcmVkIG1lbW9yeSBvbmx5IGlmIG1hcHBlZCBmcm9tIGFuIGFub255bW91cyBmaWxlLiAqLwogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQogCQlyZXR1cm4gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9PSAwOwogCkBAIC0xMTc0LDcgKzExODYsNyBAQAogCXJldHVybiAxOwogfQogCi0jZGVmaW5lIHJvdW5kdXAoeCwgeSkgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKyNkZWZpbmUgcm91bmR1cCh4LCB5KSAoKCgoeCkgKyAoKHkpIC0gMSkpIC8gKHkpKSAqICh5KSkKIAogLyogQW4gRUxGIG5vdGUgaW4gbWVtb3J5ICovCiBzdHJ1Y3QgbWVtZWxmbm90ZQpAQCAtMTI3NywxMSArMTI4OSwxMSBAQAogfQogCiAvKgotICogZmlsbCB1cCBhbGwgdGhlIGZpZWxkcyBpbiBwcnN0YXR1cyBmcm9tIHRoZSBnaXZlbiB0YXNrIHN0cnVjdCwgZXhjZXB0IHJlZ2lzdGVycwotICogd2hpY2ggbmVlZCB0byBiZSBmaWxsZWQgdXAgc2VwYXJhdGVseS4KKyAqIGZpbGwgdXAgYWxsIHRoZSBmaWVsZHMgaW4gcHJzdGF0dXMgZnJvbSB0aGUgZ2l2ZW4gdGFzayBzdHJ1Y3QsIGV4Y2VwdAorICogcmVnaXN0ZXJzIHdoaWNoIG5lZWQgdG8gYmUgZmlsbGVkIHVwIHNlcGFyYXRlbHkuCiAgKi8KIHN0YXRpYyB2b2lkIGZpbGxfcHJzdGF0dXMoc3RydWN0IGVsZl9wcnN0YXR1cyAqcHJzdGF0dXMsCi0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgc2lnbnIpIAorCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgc2lnbnIpCiB7CiAJcHJzdGF0dXMtPnByX2luZm8uc2lfc2lnbm8gPSBwcnN0YXR1cy0+cHJfY3Vyc2lnID0gc2lnbnI7CiAJcHJzdGF0dXMtPnByX3NpZ3BlbmQgPSBwLT5wZW5kaW5nLnNpZ25hbC5zaWdbMF07CkBAIC0xMzY2LDggKzEzNzgsOCBAQAogCiAvKgogICogSW4gb3JkZXIgdG8gYWRkIHRoZSBzcGVjaWZpYyB0aHJlYWQgaW5mb3JtYXRpb24gZm9yIHRoZSBlbGYgZmlsZSBmb3JtYXQsCi0gKiB3ZSBuZWVkIHRvIGtlZXAgYSBsaW5rZWQgbGlzdCBvZiBldmVyeSB0aHJlYWRzIHByX3N0YXR1cyBhbmQgdGhlbgotICogY3JlYXRlIGEgc2luZ2xlIHNlY3Rpb24gZm9yIHRoZW0gaW4gdGhlIGZpbmFsIGNvcmUgZmlsZS4KKyAqIHdlIG5lZWQgdG8ga2VlcCBhIGxpbmtlZCBsaXN0IG9mIGV2ZXJ5IHRocmVhZHMgcHJfc3RhdHVzIGFuZCB0aGVuIGNyZWF0ZQorICogYSBzaW5nbGUgc2VjdGlvbiBmb3IgdGhlbSBpbiB0aGUgZmluYWwgY29yZSBmaWxlLgogICovCiBzdGF0aWMgaW50IGVsZl9kdW1wX3RocmVhZF9zdGF0dXMobG9uZyBzaWduciwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0KQogewpAQCAtMTM3OCwxOSArMTM5MCwyMyBAQAogCWZpbGxfcHJzdGF0dXMoJnQtPnByc3RhdHVzLCBwLCBzaWducik7CiAJZWxmX2NvcmVfY29weV90YXNrX3JlZ3MocCwgJnQtPnByc3RhdHVzLnByX3JlZyk7CQogCQotCWZpbGxfbm90ZSgmdC0+bm90ZXNbMF0sICJDT1JFIiwgTlRfUFJTVEFUVVMsIHNpemVvZih0LT5wcnN0YXR1cyksICYodC0+cHJzdGF0dXMpKTsKKwlmaWxsX25vdGUoJnQtPm5vdGVzWzBdLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCBzaXplb2YodC0+cHJzdGF0dXMpLAorCQkgICYodC0+cHJzdGF0dXMpKTsKIAl0LT5udW1fbm90ZXMrKzsKIAlzeiArPSBub3Rlc2l6ZSgmdC0+bm90ZXNbMF0pOwogCi0JaWYgKCh0LT5wcnN0YXR1cy5wcl9mcHZhbGlkID0gZWxmX2NvcmVfY29weV90YXNrX2ZwcmVncyhwLCBOVUxMLCAmdC0+ZnB1KSkpIHsKLQkJZmlsbF9ub3RlKCZ0LT5ub3Rlc1sxXSwgIkNPUkUiLCBOVF9QUkZQUkVHLCBzaXplb2YodC0+ZnB1KSwgJih0LT5mcHUpKTsKKwlpZiAoKHQtPnByc3RhdHVzLnByX2ZwdmFsaWQgPSBlbGZfY29yZV9jb3B5X3Rhc2tfZnByZWdzKHAsIE5VTEwsCisJCQkJCQkJCSZ0LT5mcHUpKSkgeworCQlmaWxsX25vdGUoJnQtPm5vdGVzWzFdLCAiQ09SRSIsIE5UX1BSRlBSRUcsIHNpemVvZih0LT5mcHUpLAorCQkJICAmKHQtPmZwdSkpOwogCQl0LT5udW1fbm90ZXMrKzsKIAkJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzFdKTsKIAl9CiAKICNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKIAlpZiAoZWxmX2NvcmVfY29weV90YXNrX3hmcHJlZ3MocCwgJnQtPnhmcHUpKSB7Ci0JCWZpbGxfbm90ZSgmdC0+bm90ZXNbMl0sICJMSU5VWCIsIE5UX1BSWEZQUkVHLCBzaXplb2YodC0+eGZwdSksICZ0LT54ZnB1KTsKKwkJZmlsbF9ub3RlKCZ0LT5ub3Rlc1syXSwgIkxJTlVYIiwgTlRfUFJYRlBSRUcsIHNpemVvZih0LT54ZnB1KSwKKwkJCSAgJnQtPnhmcHUpOwogCQl0LT5udW1fbm90ZXMrKzsKIAkJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzJdKTsKIAl9CkBAIC0xNDA1LDcgKzE0MjEsNyBAQAogICogYW5kIHRoZW4gdGhleSBhcmUgYWN0dWFsbHkgd3JpdHRlbiBvdXQuICBJZiB3ZSBydW4gb3V0IG9mIGNvcmUgbGltaXQKICAqIHdlIGp1c3QgdHJ1bmNhdGUuCiAgKi8KLXN0YXRpYyBpbnQgZWxmX2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICogZmlsZSkKK3N0YXRpYyBpbnQgZWxmX2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAjZGVmaW5lCU5VTV9OT1RFUwk2CiAJaW50IGhhc19kdW1wZWQgPSAwOwpAQCAtMTQzNCwxMiArMTQ1MCwxMiBAQAogCS8qCiAJICogV2Ugbm8gbG9uZ2VyIHN0b3AgYWxsIFZNIG9wZXJhdGlvbnMuCiAJICogCi0JICogVGhpcyBpcyBiZWNhdXNlIHRob3NlIHByb2Nlc2VzIHRoYXQgY291bGQgcG9zc2libHkgY2hhbmdlIG1hcF9jb3VudCBvcgotCSAqIHRoZSBtbWFwIC8gdm1hIHBhZ2VzIGFyZSBub3cgYmxvY2tlZCBpbiBkb19leGl0IG9uIGN1cnJlbnQgZmluaXNoaW5nCi0JICogdGhpcyBjb3JlIGR1bXAuCisJICogVGhpcyBpcyBiZWNhdXNlIHRob3NlIHByb2Nlc2VzIHRoYXQgY291bGQgcG9zc2libHkgY2hhbmdlIG1hcF9jb3VudAorCSAqIG9yIHRoZSBtbWFwIC8gdm1hIHBhZ2VzIGFyZSBub3cgYmxvY2tlZCBpbiBkb19leGl0IG9uIGN1cnJlbnQKKwkgKiBmaW5pc2hpbmcgdGhpcyBjb3JlIGR1bXAuCiAJICoKIAkgKiBPbmx5IHB0cmFjZSBjYW4gdG91Y2ggdGhlc2UgbWVtb3J5IGFkZHJlc3NlcywgYnV0IGl0IGRvZXNuJ3QgY2hhbmdlCi0JICogdGhlIG1hcF9jb3VudCBvciB0aGUgcGFnZXMgYWxsb2NhdGVkLiAgU28gbm8gcG9zc2liaWxpdHkgb2YgY3Jhc2hpbmcKKwkgKiB0aGUgbWFwX2NvdW50IG9yIHRoZSBwYWdlcyBhbGxvY2F0ZWQuIFNvIG5vIHBvc3NpYmlsaXR5IG9mIGNyYXNoaW5nCiAJICogZXhpc3RzIHdoaWxlIGR1bXBpbmcgdGhlIG1tLT52bV9uZXh0IGFyZWFzIHRvIHRoZSBjb3JlIGZpbGUuCiAJICovCiAgIApAQCAtMTUwMSw3ICsxNTE3LDcgQEAKICNlbmRpZgogCiAJLyogU2V0IHVwIGhlYWRlciAqLwotCWZpbGxfZWxmX2hlYWRlcihlbGYsIHNlZ3MrMSk7CS8qIGluY2x1ZGluZyBub3RlcyBzZWN0aW9uICovCisJZmlsbF9lbGZfaGVhZGVyKGVsZiwgc2VncyArIDEpOwkvKiBpbmNsdWRpbmcgbm90ZXMgc2VjdGlvbiAqLwogCiAJaGFzX2R1bXBlZCA9IDE7CiAJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRFVNUENPUkU7CkBAIC0xNTExLDI0ICsxNTI3LDI0IEBACiAJICogd2l0aCBpbmZvIGZyb20gdGhlaXIgL3Byb2MuCiAJICovCiAKLQlmaWxsX25vdGUobm90ZXMgKzAsICJDT1JFIiwgTlRfUFJTVEFUVVMsIHNpemVvZigqcHJzdGF0dXMpLCBwcnN0YXR1cyk7Ci0JCisJZmlsbF9ub3RlKG5vdGVzICsgMCwgIkNPUkUiLCBOVF9QUlNUQVRVUywgc2l6ZW9mKCpwcnN0YXR1cyksIHByc3RhdHVzKTsKIAlmaWxsX3BzaW5mbyhwc2luZm8sIGN1cnJlbnQtPmdyb3VwX2xlYWRlciwgY3VycmVudC0+bW0pOwotCWZpbGxfbm90ZShub3RlcyArMSwgIkNPUkUiLCBOVF9QUlBTSU5GTywgc2l6ZW9mKCpwc2luZm8pLCBwc2luZm8pOworCWZpbGxfbm90ZShub3RlcyArIDEsICJDT1JFIiwgTlRfUFJQU0lORk8sIHNpemVvZigqcHNpbmZvKSwgcHNpbmZvKTsKIAkKIAludW1ub3RlID0gMjsKIAotCWF1eHYgPSAoZWxmX2FkZHJfdCAqKSBjdXJyZW50LT5tbS0+c2F2ZWRfYXV4djsKKwlhdXh2ID0gKGVsZl9hZGRyX3QgKiljdXJyZW50LT5tbS0+c2F2ZWRfYXV4djsKIAogCWkgPSAwOwogCWRvCiAJCWkgKz0gMjsKIAl3aGlsZSAoYXV4dltpIC0gMl0gIT0gQVRfTlVMTCk7CiAJZmlsbF9ub3RlKCZub3Rlc1tudW1ub3RlKytdLCAiQ09SRSIsIE5UX0FVWFYsCi0JCSAgaSAqIHNpemVvZiAoZWxmX2FkZHJfdCksIGF1eHYpOworCQkgIGkgKiBzaXplb2YoZWxmX2FkZHJfdCksIGF1eHYpOwogCiAgIAkvKiBUcnkgdG8gZHVtcCB0aGUgRlBVLiAqLwotCWlmICgocHJzdGF0dXMtPnByX2ZwdmFsaWQgPSBlbGZfY29yZV9jb3B5X3Rhc2tfZnByZWdzKGN1cnJlbnQsIHJlZ3MsIGZwdSkpKQorCWlmICgocHJzdGF0dXMtPnByX2ZwdmFsaWQgPQorCSAgICAgZWxmX2NvcmVfY29weV90YXNrX2ZwcmVncyhjdXJyZW50LCByZWdzLCBmcHUpKSkKIAkJZmlsbF9ub3RlKG5vdGVzICsgbnVtbm90ZSsrLAogCQkJICAiQ09SRSIsIE5UX1BSRlBSRUcsIHNpemVvZigqZnB1KSwgZnB1KTsKICNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKQEAgLTE1NzcsOCArMTU5MywxMCBAQAogCQlwaGRyLnBfbWVtc3ogPSBzejsKIAkJb2Zmc2V0ICs9IHBoZHIucF9maWxlc3o7CiAJCXBoZHIucF9mbGFncyA9IHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEID8gUEZfUiA6IDA7Ci0JCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHBoZHIucF9mbGFncyB8PSBQRl9XOwotCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpIHBoZHIucF9mbGFncyB8PSBQRl9YOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQkJcGhkci5wX2ZsYWdzIHw9IFBGX1c7CisJCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykKKwkJCXBoZHIucF9mbGFncyB8PSBQRl9YOwogCQlwaGRyLnBfYWxpZ24gPSBFTEZfRVhFQ19QQUdFU0laRTsKIAogCQlEVU1QX1dSSVRFKCZwaGRyLCBzaXplb2YocGhkcikpOwpAQCAtMTU5NSw3ICsxNjEzLDkgQEAKIAogCS8qIHdyaXRlIG91dCB0aGUgdGhyZWFkIHN0YXR1cyBub3RlcyBzZWN0aW9uICovCiAJbGlzdF9mb3JfZWFjaCh0LCAmdGhyZWFkX2xpc3QpIHsKLQkJc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0bXAgPSBsaXN0X2VudHJ5KHQsIHN0cnVjdCBlbGZfdGhyZWFkX3N0YXR1cywgbGlzdCk7CisJCXN0cnVjdCBlbGZfdGhyZWFkX3N0YXR1cyAqdG1wID0KKwkJCQlsaXN0X2VudHJ5KHQsIHN0cnVjdCBlbGZfdGhyZWFkX3N0YXR1cywgbGlzdCk7CisKIAkJZm9yIChpID0gMDsgaSA8IHRtcC0+bnVtX25vdGVzOyBpKyspCiAJCQlpZiAoIXdyaXRlbm90ZSgmdG1wLT5ub3Rlc1tpXSwgZmlsZSkpCiAJCQkJZ290byBlbmRfY29yZWR1bXA7CkBAIC0xNjEyLDE4ICsxNjMyLDE5IEBACiAJCWZvciAoYWRkciA9IHZtYS0+dm1fc3RhcnQ7CiAJCSAgICAgYWRkciA8IHZtYS0+dm1fZW5kOwogCQkgICAgIGFkZHIgKz0gUEFHRV9TSVpFKSB7Ci0JCQlzdHJ1Y3QgcGFnZSogcGFnZTsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOwogCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAKIAkJCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgYWRkciwgMSwgMCwgMSwKIAkJCQkJCSZwYWdlLCAmdm1hKSA8PSAwKSB7Ci0JCQkJRFVNUF9TRUVLIChmaWxlLT5mX3BvcyArIFBBR0VfU0laRSk7CisJCQkJRFVNUF9TRUVLKGZpbGUtPmZfcG9zICsgUEFHRV9TSVpFKTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKHBhZ2UgPT0gWkVST19QQUdFKGFkZHIpKSB7Ci0JCQkJCURVTVBfU0VFSyAoZmlsZS0+Zl9wb3MgKyBQQUdFX1NJWkUpOworCQkJCQlEVU1QX1NFRUsoZmlsZS0+Zl9wb3MgKyBQQUdFX1NJWkUpOwogCQkJCX0gZWxzZSB7CiAJCQkJCXZvaWQgKmthZGRyOwotCQkJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwgcGFnZV90b19wZm4ocGFnZSkpOworCQkJCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkciwKKwkJCQkJCQkgcGFnZV90b19wZm4ocGFnZSkpOwogCQkJCQlrYWRkciA9IGttYXAocGFnZSk7CiAJCQkJCWlmICgoc2l6ZSArPSBQQUdFX1NJWkUpID4gbGltaXQgfHwKIAkJCQkJICAgICFkdW1wX3dyaXRlKGZpbGUsIGthZGRyLApAQCAtMTY0NSw3ICsxNjY2LDggQEAKIAogCWlmICgob2ZmX3QpZmlsZS0+Zl9wb3MgIT0gb2Zmc2V0KSB7CiAJCS8qIFNhbml0eSBjaGVjayAqLwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbGZfY29yZV9kdW1wOiBmaWxlLT5mX3BvcyAoJWxkKSAhPSBvZmZzZXQgKCVsZClcbiIsCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJlbGZfY29yZV9kdW1wOiBmaWxlLT5mX3BvcyAoJWxkKSAhPSBvZmZzZXQgKCVsZClcbiIsCiAJCSAgICAgICAob2ZmX3QpZmlsZS0+Zl9wb3MsIG9mZnNldCk7CiAJfQogCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKaW5kZXggYTJlNDhjOS4uZWJhNGUyMyAxMDA2NDQKLS0tIGEvZnMvYmluZm10X2VsZl9mZHBpYy5jCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtNDM1LDkgKzQzNSwxMCBAQAogCQkJCSAgIHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICppbnRlcnBfcGFyYW1zKQogewogCXVuc2lnbmVkIGxvbmcgc3AsIGNzcCwgbml0ZW1zOwotCWVsZl9jYWRkcl90ICphcmd2LCAqZW52cDsKKwllbGZfY2FkZHJfdCBfX3VzZXIgKmFyZ3YsICplbnZwOwogCXNpemVfdCBwbGF0Zm9ybV9sZW4gPSAwLCBsZW47Ci0JY2hhciAqa19wbGF0Zm9ybSwgKnVfcGxhdGZvcm0sICpwOworCWNoYXIgKmtfcGxhdGZvcm07CisJY2hhciBfX3VzZXIgKnVfcGxhdGZvcm0sICpwOwogCWxvbmcgaHdjYXA7CiAJaW50IGxvb3A7CiAKQEAgLTQ2MiwxMiArNDYzLDExIEBACiAJaWYgKGtfcGxhdGZvcm0pIHsKIAkJcGxhdGZvcm1fbGVuID0gc3RybGVuKGtfcGxhdGZvcm0pICsgMTsKIAkJc3AgLT0gcGxhdGZvcm1fbGVuOworCQl1X3BsYXRmb3JtID0gKGNoYXIgX191c2VyICopIHNwOwogCQlpZiAoX19jb3B5X3RvX3VzZXIodV9wbGF0Zm9ybSwga19wbGF0Zm9ybSwgcGxhdGZvcm1fbGVuKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0JdV9wbGF0Zm9ybSA9IChjaGFyICopIHNwOwotCiAjaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCS8qIGluIHNvbWUgY2FzZXMgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSwgd2Ugd2FudCB0byBhdm9pZCBMMSBldmljdGlvbnMKIAkgKiBieSB0aGUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFja2FnZS4gT25lIHRoaW5nIHdlIGNhbiBkbwpAQCAtNDkwLDcgKzQ5MCw3IEBACiAJc3AgPSAoc3AgLSBsZW4pICYgfjdVTDsKIAlleGVjX3BhcmFtcy0+bWFwX2FkZHIgPSBzcDsKIAotCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgc3AsIGV4ZWNfcGFyYW1zLT5sb2FkbWFwLCBsZW4pICE9IDApCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikgc3AsIGV4ZWNfcGFyYW1zLT5sb2FkbWFwLCBsZW4pICE9IDApCiAJCXJldHVybiAtRUZBVUxUOwogCiAJY3VycmVudC0+bW0tPmNvbnRleHQuZXhlY19mZHBpY19sb2FkbWFwID0gKHVuc2lnbmVkIGxvbmcpIHNwOwpAQCAtNTAxLDcgKzUwMSw3IEBACiAJCXNwID0gKHNwIC0gbGVuKSAmIH43VUw7CiAJCWludGVycF9wYXJhbXMtPm1hcF9hZGRyID0gc3A7CiAKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBzcCwgaW50ZXJwX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQorCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBzcCwgaW50ZXJwX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKIAkJY3VycmVudC0+bW0tPmNvbnRleHQuaW50ZXJwX2ZkcGljX2xvYWRtYXAgPSAodW5zaWduZWQgbG9uZykgc3A7CkBAIC01MjcsNyArNTI3LDcgQEAKIAkvKiBwdXQgdGhlIEVMRiBpbnRlcnByZXRlciBpbmZvIG9uIHRoZSBzdGFjayAqLwogI2RlZmluZSBORVdfQVVYX0VOVChuciwgaWQsIHZhbCkJCQkJCQlcCiAJZG8gewkJCQkJCQkJCVwKLQkJc3RydWN0IHsgdW5zaWduZWQgbG9uZyBfaWQsIF92YWw7IH0gKmVudCA9ICh2b2lkICopIGNzcDsJXAorCQlzdHJ1Y3QgeyB1bnNpZ25lZCBsb25nIF9pZCwgX3ZhbDsgfSBfX3VzZXIgKmVudCA9ICh2b2lkIF9fdXNlciAqKSBjc3A7CVwKIAkJX19wdXRfdXNlcigoaWQpLCAmZW50W25yXS5faWQpOwkJCQkJXAogCQlfX3B1dF91c2VyKCh2YWwpLCAmZW50W25yXS5fdmFsKTsJCQkJXAogCX0gd2hpbGUgKDApCkBAIC01NjQsMTMgKzU2NCwxMyBAQAogCiAJLyogYWxsb2NhdGUgcm9vbSBmb3IgYXJndltdIGFuZCBlbnZ2W10gKi8KIAljc3AgLT0gKGJwcm0tPmVudmMgKyAxKSAqIHNpemVvZihlbGZfY2FkZHJfdCk7Ci0JZW52cCA9IChlbGZfY2FkZHJfdCAqKSBjc3A7CisJZW52cCA9IChlbGZfY2FkZHJfdCBfX3VzZXIgKikgY3NwOwogCWNzcCAtPSAoYnBybS0+YXJnYyArIDEpICogc2l6ZW9mKGVsZl9jYWRkcl90KTsKLQlhcmd2ID0gKGVsZl9jYWRkcl90ICopIGNzcDsKKwlhcmd2ID0gKGVsZl9jYWRkcl90IF9fdXNlciAqKSBjc3A7CiAKIAkvKiBzdGFjayBhcmdjICovCiAJY3NwIC09IHNpemVvZih1bnNpZ25lZCBsb25nKTsKLQlfX3B1dF91c2VyKGJwcm0tPmFyZ2MsICh1bnNpZ25lZCBsb25nICopIGNzcCk7CisJX19wdXRfdXNlcihicHJtLT5hcmdjLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgY3NwKTsKIAogCUJVR19PTihjc3AgIT0gc3ApOwogCkBAIC01ODEsNyArNTgxLDcgQEAKIAljdXJyZW50LT5tbS0+YXJnX3N0YXJ0ID0gY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrIC0gKE1BWF9BUkdfUEFHRVMgKiBQQUdFX1NJWkUgLSBicHJtLT5wKTsKICNlbmRpZgogCi0JcCA9IChjaGFyICopIGN1cnJlbnQtPm1tLT5hcmdfc3RhcnQ7CisJcCA9IChjaGFyIF9fdXNlciAqKSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OwogCWZvciAobG9vcCA9IGJwcm0tPmFyZ2M7IGxvb3AgPiAwOyBsb29wLS0pIHsKIAkJX19wdXRfdXNlcigoZWxmX2NhZGRyX3QpIHAsIGFyZ3YrKyk7CiAJCWxlbiA9IHN0cm5sZW5fdXNlcihwLCBQQUdFX1NJWkUgKiBNQVhfQVJHX1BBR0VTKTsKQEAgLTEwMjUsNyArMTAyNSw3IEBACiAJCS8qIGNsZWFyIHRoZSBiaXQgYmV0d2VlbiBiZWdpbm5pbmcgb2YgbWFwcGluZyBhbmQgYmVnaW5uaW5nIG9mIFBUX0xPQUQgKi8KIAkJaWYgKHByb3QgJiBQUk9UX1dSSVRFICYmIGRpc3AgPiAwKSB7CiAJCQlrZGVidWcoImNsZWFyWyVkXSBhZD0lbHggc3o9JWx4IiwgbG9vcCwgbWFkZHIsIGRpc3ApOwotCQkJY2xlYXJfdXNlcigodm9pZCAqKSBtYWRkciwgZGlzcCk7CisJCQljbGVhcl91c2VyKCh2b2lkIF9fdXNlciAqKSBtYWRkciwgZGlzcCk7CiAJCQltYWRkciArPSBkaXNwOwogCQl9CiAKQEAgLTEwNTksNyArMTA1OSw3IEBACiAJCWlmIChwcm90ICYgUFJPVF9XUklURSAmJiBleGNlc3MxID4gMCkgewogCQkJa2RlYnVnKCJjbGVhclslZF0gYWQ9JWx4IHN6PSVseCIsCiAJCQkgICAgICAgbG9vcCwgbWFkZHIgKyBwaGRyLT5wX2ZpbGVzeiwgZXhjZXNzMSk7Ci0JCQljbGVhcl91c2VyKCh2b2lkICopIG1hZGRyICsgcGhkci0+cF9maWxlc3osIGV4Y2VzczEpOworCQkJY2xlYXJfdXNlcigodm9pZCBfX3VzZXIgKikgbWFkZHIgKyBwaGRyLT5wX2ZpbGVzeiwgZXhjZXNzMSk7CiAJCX0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9taXNjLmMgYi9mcy9iaW5mbXRfbWlzYy5jCmluZGV4IGQ3M2Q3NTUuLjM0ZWJiYzEgMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9taXNjLmMKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtNTUsNiArNTUsNyBAQAogfSBOb2RlOwogCiBzdGF0aWMgREVGSU5FX1JXTE9DSyhlbnRyaWVzX2xvY2spOworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJtX2ZzX3R5cGU7CiBzdGF0aWMgc3RydWN0IHZmc21vdW50ICpibV9tbnQ7CiBzdGF0aWMgaW50IGVudHJ5X2NvdW50OwogCkBAIC0yMDMsNyArMjA0LDYgQEAKIAkJZ290byBfZXJyb3I7CiAKIAlpZiAoZmlsZXMpIHsKLQkJc3RlYWxfbG9ja3MoZmlsZXMpOwogCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKIAkJZmlsZXMgPSBOVUxMOwogCX0KQEAgLTYzOCw3ICs2MzgsNyBAQAogCWlmICghaW5vZGUpCiAJCWdvdG8gb3V0MjsKIAotCWVyciA9IHNpbXBsZV9waW5fZnMoImJpbmZtdF9taXNjIiwgJmJtX21udCwgJmVudHJ5X2NvdW50KTsKKwllcnIgPSBzaW1wbGVfcGluX2ZzKCZibV9mc190eXBlLCAmYm1fbW50LCAmZW50cnlfY291bnQpOwogCWlmIChlcnIpIHsKIAkJaXB1dChpbm9kZSk7CiAJCWlub2RlID0gTlVMTDsKQEAgLTc0MCwxMCArNzQwLDEwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYm1fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGJtX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgYm1fZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGJtX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IG1pc2NfZm9ybWF0ID0gewpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCBmNTk1OGY0Li4wMjhkOWZiIDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMzAwLDEwICszMDAsMTAgQEAKIAkuY2xlYXJfaW5vZGUgPSBiZGV2X2NsZWFyX2lub2RlLAogfTsKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYmRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGJkX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCAweDYyNjQ2NTc2KTsKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCAweDYyNjQ2NTc2LCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYmRfdHlwZSA9IHsKQEAgLTQxNCwyMSArNDE0LDMxIEBACiBzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZSAqYmRfYWNxdWlyZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKIAlzcGluX2xvY2soJmJkZXZfbG9jayk7CiAJYmRldiA9IGlub2RlLT5pX2JkZXY7Ci0JaWYgKGJkZXYgJiYgaWdyYWIoYmRldi0+YmRfaW5vZGUpKSB7CisJaWYgKGJkZXYpIHsKKwkJYXRvbWljX2luYygmYmRldi0+YmRfaW5vZGUtPmlfY291bnQpOwogCQlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKIAkJcmV0dXJuIGJkZXY7CiAJfQogCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOworCiAJYmRldiA9IGJkZ2V0KGlub2RlLT5pX3JkZXYpOwogCWlmIChiZGV2KSB7CiAJCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKLQkJaWYgKGlub2RlLT5pX2JkZXYpCi0JCQlfX2JkX2ZvcmdldChpbm9kZSk7Ci0JCWlub2RlLT5pX2JkZXYgPSBiZGV2OwotCQlpbm9kZS0+aV9tYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKLQkJbGlzdF9hZGQoJmlub2RlLT5pX2RldmljZXMsICZiZGV2LT5iZF9pbm9kZXMpOworCQlpZiAoIWlub2RlLT5pX2JkZXYpIHsKKwkJCS8qCisJCQkgKiBXZSB0YWtlIGFuIGFkZGl0aW9uYWwgYmRfaW5vZGUtPmlfY291bnQgZm9yIGlub2RlLAorCQkJICogYW5kIGl0J3MgcmVsZWFzZWQgaW4gY2xlYXJfaW5vZGUoKSBvZiBpbm9kZS4KKwkJCSAqIFNvLCB3ZSBjYW4gYWNjZXNzIGl0IHZpYSAtPmlfbWFwcGluZyBhbHdheXMKKwkJCSAqIHdpdGhvdXQgaWdyYWIoKS4KKwkJCSAqLworCQkJYXRvbWljX2luYygmYmRldi0+YmRfaW5vZGUtPmlfY291bnQpOworCQkJaW5vZGUtPmlfYmRldiA9IGJkZXY7CisJCQlpbm9kZS0+aV9tYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwkJCWxpc3RfYWRkKCZpbm9kZS0+aV9kZXZpY2VzLCAmYmRldi0+YmRfaW5vZGVzKTsKKwkJfQogCQlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKIAl9CiAJcmV0dXJuIGJkZXY7CkBAIC00MzgsMTAgKzQ0OCwxOCBAQAogCiB2b2lkIGJkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSBOVUxMOworCiAJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOwotCWlmIChpbm9kZS0+aV9iZGV2KQorCWlmIChpbm9kZS0+aV9iZGV2KSB7CisJCWlmIChpbm9kZS0+aV9zYiAhPSBibG9ja2Rldl9zdXBlcmJsb2NrKQorCQkJYmRldiA9IGlub2RlLT5pX2JkZXY7CiAJCV9fYmRfZm9yZ2V0KGlub2RlKTsKKwl9CiAJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7CisKKwlpZiAoYmRldikKKwkJaXB1dChiZGV2LT5iZF9pbm9kZSk7CiB9CiAKIGludCBiZF9jbGFpbShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB2b2lkICpob2xkZXIpCmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCmluZGV4IDIzZjFmM2EuLjM3M2JiNjIgMTAwNjQ0Ci0tLSBhL2ZzL2J1ZmZlci5jCisrKyBiL2ZzL2J1ZmZlci5jCkBAIC0zMzEsNyArMzMxLDYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1lOQ1dSSVRFOwogCXJldCA9IGZpbGVtYXBfZmRhdGF3cml0ZShtYXBwaW5nKTsKIAogCS8qCkBAIC0zNDYsNyArMzQ1LDYgQEAKIAllcnIgPSBmaWxlbWFwX2ZkYXRhd2FpdChtYXBwaW5nKTsKIAlpZiAoIXJldCkKIAkJcmV0ID0gZXJyOwotCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCmluZGV4IGMyNjJkODguLjhiNGRlNmUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmMKKysrIGIvZnMvY2lmcy9jaWZzZnMuYwpAQCAtMTY2LDggKzE2Niw5IEBACiB9CiAKIHN0YXRpYyBpbnQKLWNpZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitjaWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlpbnQgeGlkOyAKIAlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwpAQCAtNDAyLDEyICs0MDMsMTQgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCi1zdGF0aWMgdm9pZCBjaWZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYmxvY2spCitzdGF0aWMgdm9pZCBjaWZzX3Vtb3VudF9iZWdpbihzdHJ1Y3QgdmZzbW91bnQgKiB2ZnNtbnQsIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOwogCXN0cnVjdCBjaWZzVGNvbkluZm8gKiB0Y29uOwogCi0JY2lmc19zYiA9IENJRlNfU0Ioc2Jsb2NrKTsKKwlpZiAoIShmbGFncyAmIE1OVF9GT1JDRSkpCisJCXJldHVybjsKKwljaWZzX3NiID0gQ0lGU19TQih2ZnNtbnQtPm1udF9zYik7CiAJaWYoY2lmc19zYiA9PSBOVUxMKQogCQlyZXR1cm47CiAKQEAgLTQ2MCw5ICs0NjMsOSBAQAogCS5yZW1vdW50X2ZzID0gY2lmc19yZW1vdW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitzdGF0aWMgaW50CiBjaWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKKwkgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJaW50IHJjOwogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKQEAgLTQ3MCw3ICs0NzMsNyBAQAogCWNGWUkoMSwgKCJEZXZuYW1lOiAlcyBmbGFnczogJWQgIiwgZGV2X25hbWUsIGZsYWdzKSk7CiAKIAlpZiAoSVNfRVJSKHNiKSkKLQkJcmV0dXJuIHNiOworCQlyZXR1cm4gUFRSX0VSUihzYik7CiAKIAlzYi0+c19mbGFncyA9IGZsYWdzOwogCkBAIC00NzgsMTAgKzQ4MSwxMCBAQAogCWlmIChyYykgewogCQl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKIAkJZGVhY3RpdmF0ZV9zdXBlcihzYik7Ci0JCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7Ci0JcmV0dXJuIHNiOworCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHNiKTsKIH0KIAogc3RhdGljIHNzaXplX3QgY2lmc19maWxlX3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaAppbmRleCBjOTg3NTVkLi5kNTZjMDU3IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5oCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmgKQEAgLTc0LDcgKzc0LDcgQEAKIAkJCSBzaXplX3Qgd3JpdGVfc2l6ZSwgbG9mZl90ICogcG9mZnNldCk7CiBleHRlcm4gaW50IGNpZnNfbG9jayhzdHJ1Y3QgZmlsZSAqLCBpbnQsIHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gaW50IGNpZnNfZnN5bmMoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOwotZXh0ZXJuIGludCBjaWZzX2ZsdXNoKHN0cnVjdCBmaWxlICopOworZXh0ZXJuIGludCBjaWZzX2ZsdXNoKHN0cnVjdCBmaWxlICosIGZsX293bmVyX3QgaWQpOwogZXh0ZXJuIGludCBjaWZzX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqICwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19kaXJfb3BzOwogZXh0ZXJuIGludCBjaWZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKaW5kZXggZTJiNGNlMS4uYjRhMThjMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9maWxlLmMKKysrIGIvZnMvY2lmcy9maWxlLmMKQEAgLTEwNzksOSArMTA3OSw5IEBACiAJdW5zaWduZWQgaW50IGJ5dGVzX3dyaXR0ZW47CiAJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKIAlpbnQgZG9uZSA9IDA7Ci0JcGdvZmZfdCBlbmQgPSAtMTsKKwlwZ29mZl90IGVuZDsKIAlwZ29mZl90IGluZGV4OwotCWludCBpc19yYW5nZSA9IDA7CisgCWludCByYW5nZV93aG9sZSA9IDA7CiAJc3RydWN0IGt2ZWMgaW92WzMyXTsKIAlpbnQgbGVuOwogCWludCBuX2lvdiA9IDA7CkBAIC0xMTIyLDE2ICsxMTIyLDE0IEBACiAJeGlkID0gR2V0WGlkKCk7CiAKIAlwYWdldmVjX2luaXQoJnB2ZWMsIDApOwotCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUpCisJaWYgKHdiYy0+cmFuZ2VfY3ljbGljKSB7CiAJCWluZGV4ID0gbWFwcGluZy0+d3JpdGViYWNrX2luZGV4OyAvKiBTdGFydCBmcm9tIHByZXYgb2Zmc2V0ICovCi0JZWxzZSB7Ci0JCWluZGV4ID0gMDsKLQkJc2Nhbm5lZCA9IDE7Ci0JfQotCWlmICh3YmMtPnN0YXJ0IHx8IHdiYy0+ZW5kKSB7Ci0JCWluZGV4ID0gd2JjLT5zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQllbmQgPSB3YmMtPmVuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCQlpc19yYW5nZSA9IDE7CisJCWVuZCA9IC0xOworCX0gZWxzZSB7CisJCWluZGV4ID0gd2JjLT5yYW5nZV9zdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQllbmQgPSB3YmMtPnJhbmdlX2VuZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlpZiAod2JjLT5yYW5nZV9zdGFydCA9PSAwICYmIHdiYy0+cmFuZ2VfZW5kID09IExMT05HX01BWCkKKwkJCXJhbmdlX3dob2xlID0gMTsKIAkJc2Nhbm5lZCA9IDE7CiAJfQogcmV0cnk6CkBAIC0xMTY3LDcgKzExNjUsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCi0JCQlpZiAodW5saWtlbHkoaXNfcmFuZ2UpICYmIChwYWdlLT5pbmRleCA+IGVuZCkpIHsKKwkJCWlmICghd2JjLT5yYW5nZV9jeWNsaWMgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKIAkJCQlkb25lID0gMTsKIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQlicmVhazsKQEAgLTEyNzEsNyArMTI2OSw3IEBACiAJCWluZGV4ID0gMDsKIAkJZ290byByZXRyeTsKIAl9Ci0JaWYgKCFpc19yYW5nZSkKKwlpZiAod2JjLT5yYW5nZV9jeWNsaWMgfHwgKHJhbmdlX3dob2xlICYmIHdiYy0+bnJfdG9fd3JpdGUgPiAwKSkKIAkJbWFwcGluZy0+d3JpdGViYWNrX2luZGV4ID0gaW5kZXg7CiAKIAlGcmVlWGlkKHhpZCk7CkBAIC0xNDE5LDcgKzE0MTcsNyBAQAogICogQXMgZmlsZSBjbG9zZXMsIGZsdXNoIGFsbCBjYWNoZWQgd3JpdGUgZGF0YSBmb3IgdGhpcyBpbm9kZSBjaGVja2luZwogICogZm9yIHdyaXRlIGJlaGluZCBlcnJvcnMuCiAgKi8KLWludCBjaWZzX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQoraW50IGNpZnNfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwppbmRleCA3YzI2NDI0Li5jYzY2YzY4IDEwMDY0NAotLS0gYS9mcy9jb2RhL2ZpbGUuYworKysgYi9mcy9jb2RhL2ZpbGUuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjb2RhX2ZsdXNoKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUpCitpbnQgY29kYV9mbHVzaChzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBmbF9vd25lcl90IGlkKQogewogCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gY29kYV9maWxlLT5mX2ZsYWdzICYgfk9fRVhDTDsKIAl1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzID0gY29kYV9mbGFnc190b19jZmxhZ3MoZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9pbm9kZS5jIGIvZnMvY29kYS9pbm9kZS5jCmluZGV4IGFkYTFhODEuLjg3ZjFkYzggMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvaW5vZGUuYworKysgYi9mcy9jb2RhL2lub2RlLmMKQEAgLTM2LDcgKzM2LDcgQEAKIC8qIFZGUyBzdXBlcl9ibG9jayBvcHMgKi8KIHN0YXRpYyB2b2lkIGNvZGFfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIHZvaWQgY29kYV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKK3N0YXRpYyBpbnQgY29kYV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqIGNvZGFfaW5vZGVfY2FjaGVwOwogCkBAIC0yNzgsMTMgKzI3OCwxMyBAQAogCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAogfTsKIAotc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQorc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CiAJaW50IGVycm9yOwogCQogCWxvY2tfa2VybmVsKCk7CiAKLQllcnJvciA9IHZlbnVzX3N0YXRmcyhzYiwgYnVmKTsKKwllcnJvciA9IHZlbnVzX3N0YXRmcyhkZW50cnksIGJ1Zik7CiAKIAl1bmxvY2tfa2VybmVsKCk7CiAKQEAgLTMwNywxMCArMzA3LDEwIEBACiAKIC8qIGluaXRfY29kYTogdXNlZCBieSBmaWxlc3lzdGVtcy5jIHRvIHJlZ2lzdGVyIGNvZGEgKi8KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqY29kYV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgY29kYV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgY29kYV9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBjb2RhX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGNvZGFfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvdXBjYWxsLmMgYi9mcy9jb2RhL3VwY2FsbC5jCmluZGV4IDFiYWU5OTYuLmIwNDBlYmEgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvdXBjYWxsLmMKKysrIGIvZnMvY29kYS91cGNhbGwuYwpAQCAtNjExLDcgKzYxMSw3IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1pbnQgdmVudXNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpIAoraW50IHZlbnVzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzZnMpCiB7IAogICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKICAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKQEAgLTYyMCw3ICs2MjAsNyBAQAogCWluc2l6ZSA9IG1heF90KHVuc2lnbmVkIGludCwgSU5TSVpFKHN0YXRmcyksIE9VVFNJWkUoc3RhdGZzKSk7CiAJVVBBUkcoQ09EQV9TVEFURlMpOwogCi0gICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKGRlbnRyeS0+ZF9zYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CiAJCiAgICAgICAgIGlmICghZXJyb3IpIHsKIAkJc2ZzLT5mX2Jsb2NrcyA9IG91dHAtPmNvZGFfc3RhdGZzLnN0YXQuZl9ibG9ja3M7CmRpZmYgLS1naXQgYS9mcy9jb21wYXQuYyBiL2ZzL2NvbXBhdC5jCmluZGV4IGIxZjY0NzguLjdlN2U1YmMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbXBhdC5jCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIAllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CiAJaWYgKCFlcnJvcikgewogCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7Ci0JCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQllcnJvciA9IHZmc19zdGF0ZnMobmQuZGVudHJ5LCAmdG1wKTsKIAkJaWYgKCFlcnJvcikKIAkJCWVycm9yID0gcHV0X2NvbXBhdF9zdGF0ZnMoYnVmLCAmdG1wKTsKIAkJcGF0aF9yZWxlYXNlKCZuZCk7CkBAIC0yMTUsNyArMjE1LDcgQEAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnMoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJnRtcCk7CiAJaWYgKCFlcnJvcikKIAkJZXJyb3IgPSBwdXRfY29tcGF0X3N0YXRmcyhidWYsICZ0bXApOwogCWZwdXQoZmlsZSk7CkBAIC0yNjUsNyArMjY1LDcgQEAKIAllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CiAJaWYgKCFlcnJvcikgewogCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7Ci0JCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQllcnJvciA9IHZmc19zdGF0ZnMobmQuZGVudHJ5LCAmdG1wKTsKIAkJaWYgKCFlcnJvcikKIAkJCWVycm9yID0gcHV0X2NvbXBhdF9zdGF0ZnM2NChidWYsICZ0bXApOwogCQlwYXRoX3JlbGVhc2UoJm5kKTsKQEAgLTI4Niw3ICsyODYsNyBAQAogCWZpbGUgPSBmZ2V0KGZkKTsKIAlpZiAoIWZpbGUpCiAJCWdvdG8gb3V0OwotCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LCAmdG1wKTsKIAlpZiAoIWVycm9yKQogCQllcnJvciA9IHB1dF9jb21wYXRfc3RhdGZzNjQoYnVmLCAmdG1wKTsKIAlmcHV0KGZpbGUpOwpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCBkMmMzODg3Li45ZWI5ODI0IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMjA1LDM4ICsyMDUsNiBAQAogCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKIH0KIAotc3RydWN0IGNvbXBhdF9kbXhfZXZlbnQgewotCWRteF9ldmVudF90CWV2ZW50OwotCWNvbXBhdF90aW1lX3QJdGltZVN0YW1wOwotCXVuaW9uCi0JewotCQlkbXhfc2NyYW1ibGluZ19zdGF0dXNfdCBzY3JhbWJsaW5nOwotCX0gdTsKLX07Ci0KLXN0YXRpYyBpbnQgZG9fZG14X2dldF9ldmVudCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBkbXhfZXZlbnQga2V2ZW50OwotCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKLQlpbnQgZXJyOwotCi0Jc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSAma2V2ZW50KTsKLQlzZXRfZnMob2xkX2ZzKTsKLQotCWlmICghZXJyKSB7Ci0JCXN0cnVjdCBjb21wYXRfZG14X2V2ZW50IF9fdXNlciAqdXAgPSBjb21wYXRfcHRyKGFyZyk7Ci0KLQkJZXJyICA9IHB1dF91c2VyKGtldmVudC5ldmVudCwgJnVwLT5ldmVudCk7Ci0JCWVyciB8PSBwdXRfdXNlcihrZXZlbnQudGltZVN0YW1wLCAmdXAtPnRpbWVTdGFtcCk7Ci0JCWVyciB8PSBwdXRfdXNlcihrZXZlbnQudS5zY3JhbWJsaW5nLCAmdXAtPnUuc2NyYW1ibGluZyk7Ci0JCWlmIChlcnIpCi0JCQllcnIgPSAtRUZBVUxUOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KIHN0cnVjdCBjb21wYXRfdmlkZW9fZXZlbnQgewogCWludDMyX3QJCXR5cGU7CiAJY29tcGF0X3RpbWVfdAl0aW1lc3RhbXA7CkBAIC0yOTY0LDcgKzI5MzIsNiBAQAogI2VuZGlmCiAKIC8qIGR2YiAqLwotSEFORExFX0lPQ1RMKERNWF9HRVRfRVZFTlQsIGRvX2RteF9nZXRfZXZlbnQpCiBIQU5ETEVfSU9DVEwoVklERU9fR0VUX0VWRU5ULCBkb192aWRlb19nZXRfZXZlbnQpCiBIQU5ETEVfSU9DVEwoVklERU9fU1RJTExQSUNUVVJFLCBkb192aWRlb19zdGlsbHBpY3R1cmUpCiBIQU5ETEVfSU9DVEwoVklERU9fU0VUX1NQVV9QQUxFVFRFLCBkb192aWRlb19zZXRfc3B1X3BhbGV0dGUpCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9tb3VudC5jIGIvZnMvY29uZmlnZnMvbW91bnQuYwppbmRleCBmOTIwZDMwLi4zZTVmZTg0IDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9tb3VudC5jCisrKyBiL2ZzL2NvbmZpZ2ZzL21vdW50LmMKQEAgLTEwMywxMCArMTAzLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvbmZpZ2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBjb25maWdmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGNvbmZpZ2ZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBjb25maWdmc19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgY29uZmlnZnNfZnNfdHlwZSA9IHsKQEAgLTExOCw3ICsxMTgsNyBAQAogCiBpbnQgY29uZmlnZnNfcGluX2ZzKHZvaWQpCiB7Ci0JcmV0dXJuIHNpbXBsZV9waW5fZnMoImNvbmZpZ2ZzIiwgJmNvbmZpZ2ZzX21vdW50LAorCXJldHVybiBzaW1wbGVfcGluX2ZzKCZjb25maWdmc19mc190eXBlLCAmY29uZmlnZnNfbW91bnQsCiAJCQkgICAgICZjb25maWdmc19tbnRfY291bnQpOwogfQogCmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCmluZGV4IDllZmNjM2EuLmM0NWQ3MzggMTAwNjQ0Ci0tLSBhL2ZzL2NyYW1mcy9pbm9kZS5jCisrKyBiL2ZzL2NyYW1mcy9pbm9kZS5jCkBAIC0xODEsOSArMTgxLDcgQEAKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCiAJCWlmIChibG9ja25yICsgaSA8IGRldnNpemUpIHsKLQkJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgYmxvY2tuciArIGksCi0JCQkJKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLAotCQkJCU5VTEwpOworCQkJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGJsb2NrbnIgKyBpLCBOVUxMKTsKIAkJCS8qIHN5bmNocm9ub3VzIGVycm9yPyAqLwogCQkJaWYgKElTX0VSUihwYWdlKSkKIAkJCQlwYWdlID0gTlVMTDsKQEAgLTMyMiw4ICszMjAsMTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBjcmFtZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IGNyYW1mc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisKIAlidWYtPmZfdHlwZSA9IENSQU1GU19NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CiAJYnVmLT5mX2Jsb2NrcyA9IENSQU1GU19TQihzYiktPmJsb2NrczsKQEAgLTUyOCwxMCArNTI4LDExIEBACiAJLnN0YXRmcwkJPSBjcmFtZnNfc3RhdGZzLAogfTsKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqY3JhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBjcmFtZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGNyYW1mc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBjcmFtZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjcmFtZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKaW5kZXggOTQwZDE4OC4uYjg1ZmRhMyAxMDA2NDQKLS0tIGEvZnMvZGNhY2hlLmMKKysrIGIvZnMvZGNhY2hlLmMKQEAgLTM1OSwxMiArMzU5LDEzIEBACiB9CiAKIC8qCi0gKiBUaHJvdyBhd2F5IGEgZGVudHJ5IC0gZnJlZSB0aGUgaW5vZGUsIGRwdXQgdGhlIHBhcmVudC4KLSAqIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgTFJVIGxpc3QgaGFzIGFscmVhZHkgYmVlbgotICogcmVtb3ZlZC4KKyAqIFRocm93IGF3YXkgYSBkZW50cnkgLSBmcmVlIHRoZSBpbm9kZSwgZHB1dCB0aGUgcGFyZW50LiAgVGhpcyByZXF1aXJlcyB0aGF0CisgKiB0aGUgTFJVIGxpc3QgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkLgorICoKICAqIENhbGxlZCB3aXRoIGRjYWNoZV9sb2NrLCBkcm9wcyBpdCBhbmQgdGhlbiByZWdhaW5zLgorICogQ2FsbGVkIHdpdGggZGVudHJ5LT5kX2xvY2sgaGVsZCwgZHJvcHMgaXQuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBwcnVuZV9vbmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCitzdGF0aWMgdm9pZCBwcnVuZV9vbmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCiB7CiAJc3RydWN0IGRlbnRyeSAqIHBhcmVudDsKIApAQCAtMzgyLDYgKzM4Myw4IEBACiAvKioKICAqIHBydW5lX2RjYWNoZSAtIHNocmluayB0aGUgZGNhY2hlCiAgKiBAY291bnQ6IG51bWJlciBvZiBlbnRyaWVzIHRvIHRyeSBhbmQgZnJlZQorICogQHNiOiBpZiBnaXZlbiwgaWdub3JlIGRlbnRyaWVzIGZvciBvdGhlciBzdXBlcmJsb2NrcworICogICAgICAgICB3aGljaCBhcmUgYmVpbmcgdW5tb3VudGVkLgogICoKICAqIFNocmluayB0aGUgZGNhY2hlLiBUaGlzIGlzIGRvbmUgd2hlbiB3ZSBuZWVkCiAgKiBtb3JlIG1lbW9yeSwgb3Igc2ltcGx5IHdoZW4gd2UgbmVlZCB0byB1bm1vdW50CkBAIC0zOTIsMTYgKzM5NSwyOSBAQAogICogYWxsIHRoZSBkZW50cmllcyBhcmUgaW4gdXNlLgogICovCiAgCi1zdGF0aWMgdm9pZCBwcnVuZV9kY2FjaGUoaW50IGNvdW50KQorc3RhdGljIHZvaWQgcHJ1bmVfZGNhY2hlKGludCBjb3VudCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKIAlmb3IgKDsgY291bnQgOyBjb3VudC0tKSB7CiAJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKIAkJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCQlzdHJ1Y3Qgcndfc2VtYXBob3JlICpzX3Vtb3VudDsKIAogCQljb25kX3Jlc2NoZWRfbG9jaygmZGNhY2hlX2xvY2spOwogCiAJCXRtcCA9IGRlbnRyeV91bnVzZWQucHJldjsKKwkJaWYgKHNiKSB7CisJCQkvKiBUcnkgdG8gZmluZCBhIGRlbnRyeSBmb3IgdGhpcyBzYiwgYnV0IGRvbid0IHRyeQorCQkJICogdG9vIGhhcmQsIGlmIHRoZXkgYXJlbid0IG5lYXIgdGhlIHRhaWwgdGhleSB3aWxsCisJCQkgKiBiZSBtb3ZlZCBkb3duIGFnYWluIHNvb24KKwkJCSAqLworCQkJaW50IHNraXAgPSBjb3VudDsKKwkJCXdoaWxlIChza2lwICYmIHRtcCAhPSAmZGVudHJ5X3VudXNlZCAmJgorCQkJICAgIGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2xydSktPmRfc2IgIT0gc2IpIHsKKwkJCQlza2lwLS07CisJCQkJdG1wID0gdG1wLT5wcmV2OworCQkJfQorCQl9CiAJCWlmICh0bXAgPT0gJmRlbnRyeV91bnVzZWQpCiAJCQlicmVhazsKIAkJbGlzdF9kZWxfaW5pdCh0bXApOwpAQCAtNDI3LDcgKzQ0Myw0NSBAQAogIAkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQotCQlwcnVuZV9vbmVfZGVudHJ5KGRlbnRyeSk7CisJCS8qCisJCSAqIElmIHRoZSBkZW50cnkgaXMgbm90IERDQUNIRURfUkVGRVJFTkNFRCwgaXQgaXMgdGltZQorCQkgKiB0byByZW1vdmUgaXQgZnJvbSB0aGUgZGNhY2hlLCBwcm92aWRlZCB0aGUgc3VwZXIgYmxvY2sgaXMKKwkJICogTlVMTCAod2hpY2ggbWVhbnMgd2UgYXJlIHRyeWluZyB0byByZWNsYWltIG1lbW9yeSkKKwkJICogb3IgdGhpcyBkZW50cnkgYmVsb25ncyB0byB0aGUgc2FtZSBzdXBlciBibG9jayB0aGF0CisJCSAqIHdlIHdhbnQgdG8gc2hyaW5rLgorCQkgKi8KKwkJLyoKKwkJICogSWYgdGhpcyBkZW50cnkgaXMgZm9yICJteSIgZmlsZXN5c3RlbSwgdGhlbiBJIGNhbiBwcnVuZSBpdAorCQkgKiB3aXRob3V0IHRha2luZyB0aGUgc191bW91bnQgbG9jayAoSSBhbHJlYWR5IGhvbGQgaXQpLgorCQkgKi8KKwkJaWYgKHNiICYmIGRlbnRyeS0+ZF9zYiA9PSBzYikgeworCQkJcHJ1bmVfb25lX2RlbnRyeShkZW50cnkpOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogLi4ub3RoZXJ3aXNlIHdlIG5lZWQgdG8gYmUgc3VyZSB0aGlzIGZpbGVzeXN0ZW0gaXNuJ3QgYmVpbmcKKwkJICogdW5tb3VudGVkLCBvdGhlcndpc2Ugd2UgY291bGQgcmFjZSB3aXRoCisJCSAqIGdlbmVyaWNfc2h1dGRvd25fc3VwZXIoKSwgYW5kIGVuZCB1cCBob2xkaW5nIGEgcmVmZXJlbmNlIHRvCisJCSAqIGFuIGlub2RlIHdoaWxlIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KKwkJICogU28gd2UgdHJ5IHRvIGdldCBzX3Vtb3VudCwgYW5kIG1ha2Ugc3VyZSBzX3Jvb3QgaXNuJ3QgTlVMTC4KKwkJICogKFRha2UgYSBsb2NhbCBjb3B5IG9mIHNfdW1vdW50IHRvIGF2b2lkIGEgdXNlLWFmdGVyLWZyZWUgb2YKKwkJICogYGRlbnRyeScpLgorCQkgKi8KKwkJc191bW91bnQgPSAmZGVudHJ5LT5kX3NiLT5zX3Vtb3VudDsKKwkJaWYgKGRvd25fcmVhZF90cnlsb2NrKHNfdW1vdW50KSkgeworCQkJaWYgKGRlbnRyeS0+ZF9zYi0+c19yb290ICE9IE5VTEwpIHsKKwkJCQlwcnVuZV9vbmVfZGVudHJ5KGRlbnRyeSk7CisJCQkJdXBfcmVhZChzX3Vtb3VudCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQl1cF9yZWFkKHNfdW1vdW50KTsKKwkJfQorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkvKiBDYW5ub3QgcmVtb3ZlIHRoZSBmaXJzdCBkZW50cnksIGFuZCBpdCBpc24ndCBhcHByb3ByaWF0ZQorCQkgKiB0byBtb3ZlIGl0IHRvIHRoZSBoZWFkIG9mIHRoZSBsaXN0LCBzbyBnaXZlIHVwLCBhbmQgdHJ5CisJCSAqIGxhdGVyCisJCSAqLworCQlicmVhazsKIAl9CiAJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKIH0KQEAgLTYzMCw0NiArNjg0LDcgQEAKIAlpbnQgZm91bmQ7CiAKIAl3aGlsZSAoKGZvdW5kID0gc2VsZWN0X3BhcmVudChwYXJlbnQpKSAhPSAwKQotCQlwcnVuZV9kY2FjaGUoZm91bmQpOwotfQotCi0vKioKLSAqIHNocmlua19kY2FjaGVfYW5vbiAtIGZ1cnRoZXIgcHJ1bmUgdGhlIGNhY2hlCi0gKiBAaGVhZDogaGVhZCBvZiBkX2hhc2ggbGlzdCBvZiBkZW50cmllcyB0byBwcnVuZQotICoKLSAqIFBydW5lIHRoZSBkZW50cmllcyB0aGF0IGFyZSBhbm9ueW1vdXMKLSAqCi0gKiBwYXJzaW5nIGRfaGFzaCBsaXN0IGRvZXMgbm90IGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSgpIGFzIGl0Ci0gKiBkb25lIHVuZGVyIGRjYWNoZV9sb2NrLgotICoKLSAqLwotdm9pZCBzaHJpbmtfZGNhY2hlX2Fub24oc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGhsaXN0X25vZGUgKmxwOwotCWludCBmb3VuZDsKLQlkbyB7Ci0JCWZvdW5kID0gMDsKLQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCWhsaXN0X2Zvcl9lYWNoKGxwLCBoZWFkKSB7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICp0aGlzID0gaGxpc3RfZW50cnkobHAsIHN0cnVjdCBkZW50cnksIGRfaGFzaCk7Ci0JCQlpZiAoIWxpc3RfZW1wdHkoJnRoaXMtPmRfbHJ1KSkgewotCQkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOwotCQkJCWxpc3RfZGVsX2luaXQoJnRoaXMtPmRfbHJ1KTsKLQkJCX0KLQotCQkJLyogCi0JCQkgKiBtb3ZlIG9ubHkgemVybyByZWYgY291bnQgZGVudHJpZXMgdG8gdGhlIGVuZCAKLQkJCSAqIG9mIHRoZSB1bnVzZWQgbGlzdCBmb3IgcHJ1bmVfZGNhY2hlCi0JCQkgKi8KLQkJCWlmICghYXRvbWljX3JlYWQoJnRoaXMtPmRfY291bnQpKSB7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmdGhpcy0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKLQkJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKLQkJCQlmb3VuZCsrOwotCQkJfQotCQl9Ci0JCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Ci0JCXBydW5lX2RjYWNoZShmb3VuZCk7Ci0JfSB3aGlsZShmb3VuZCk7CisJCXBydW5lX2RjYWNoZShmb3VuZCwgcGFyZW50LT5kX3NiKTsKIH0KIAogLyoKQEAgLTY4OSw3ICs3MDQsNyBAQAogCWlmIChucikgewogCQlpZiAoIShnZnBfbWFzayAmIF9fR0ZQX0ZTKSkKIAkJCXJldHVybiAtMTsKLQkJcHJ1bmVfZGNhY2hlKG5yKTsKKwkJcHJ1bmVfZGNhY2hlKG5yLCBOVUxMKTsKIAl9CiAJcmV0dXJuIChkZW50cnlfc3RhdC5ucl91bnVzZWQgLyAxMDApICogc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCBiNTViNGVhLi42ZmExZTA0IDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0xMTEsMTEgKzExMSwxMSBAQAogCXJldHVybiBzaW1wbGVfZmlsbF9zdXBlcihzYiwgREVCVUdGU19NQUdJQywgZGVidWdfZmlsZXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpkZWJ1Z19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCQl2b2lkICpkYXRhKQorc3RhdGljIGludCBkZWJ1Z19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRlYnVnX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBkZWJ1Z19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZGVidWdfZnNfdHlwZSA9IHsKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAJcHJfZGVidWcoImRlYnVnZnM6IGNyZWF0aW5nIGZpbGUgJyVzJ1xuIixuYW1lKTsKIAotCWVycm9yID0gc2ltcGxlX3Bpbl9mcygiZGVidWdmcyIsICZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CisJZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCZkZWJ1Z19mc190eXBlLCAmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOwogCWlmIChlcnJvcikKIAkJZ290byBleGl0OwogCmRpZmYgLS1naXQgYS9mcy9kZXZmcy9iYXNlLmMgYi9mcy9kZXZmcy9iYXNlLmMKaW5kZXggNTJmNTA1OS4uNTFhOTdmMSAxMDA2NDQKLS0tIGEvZnMvZGV2ZnMvYmFzZS5jCisrKyBiL2ZzL2RldmZzL2Jhc2UuYwpAQCAtMjU0OSwxMSArMjU0OSwxMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2ZpbGxfc3VwZXIgICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmRldmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQkJdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZGV2ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBkZXZmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgZGV2ZnNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGRldmZzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvaW5vZGUuYyBiL2ZzL2RldnB0cy9pbm9kZS5jCmluZGV4IDE0YzU2MjAuLmY3YWVmNWIgMTAwNjQ0Ci0tLSBhL2ZzL2RldnB0cy9pbm9kZS5jCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0xMzAsMTAgKzEzMCwxMCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpkZXZwdHNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGRldnB0c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRldnB0c19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgZGV2cHRzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBkZXZwdHNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggYjA1ZDFiMi4uNTM4ZmIwNCAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogCQlOVUxMKTsJCQkJLyogdm1hcyAqLwogCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAKLQlpZiAocmV0IDwgMCAmJiBkaW8tPmJsb2Nrc19hdmFpbGFibGUgJiYgKGRpby0+cncgPT0gV1JJVEUpKSB7CisJaWYgKHJldCA8IDAgJiYgZGlvLT5ibG9ja3NfYXZhaWxhYmxlICYmIChkaW8tPnJ3ICYgV1JJVEUpKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gWkVST19QQUdFKGRpby0+Y3Vycl91c2VyX2FkZHJlc3MpOwogCQkvKgogCQkgKiBBIG1lbW9yeSBmYXVsdCwgYnV0IHRoZSBmaWxlc3lzdGVtIGhhcyBzb21lIG91dHN0YW5kaW5nCkBAIC01MzUsNyArNTM1LDcgQEAKIAkJbWFwX2JoLT5iX3N0YXRlID0gMDsKIAkJbWFwX2JoLT5iX3NpemUgPSBmc19jb3VudCA8PCBkaW8tPmlub2RlLT5pX2Jsa2JpdHM7CiAKLQkJY3JlYXRlID0gZGlvLT5ydyA9PSBXUklURTsKKwkJY3JlYXRlID0gZGlvLT5ydyAmIFdSSVRFOwogCQlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpIHsKIAkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPCAoaV9zaXplX3JlYWQoZGlvLT5pbm9kZSkgPj4KIAkJCQkJCQlkaW8tPmJsa2JpdHMpKQpAQCAtODY3LDcgKzg2Nyw3IEBACiAJCQkJbG9mZl90IGlfc2l6ZV9hbGlnbmVkOwogCiAJCQkJLyogQUtQTTogZWFyZ2gsIC1FTk9UQkxLIGlzIGEgaGFjayAqLwotCQkJCWlmIChkaW8tPnJ3ID09IFdSSVRFKSB7CisJCQkJaWYgKGRpby0+cncgJiBXUklURSkgewogCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCQkJCXJldHVybiAtRU5PVEJMSzsKIAkJCQl9CkBAIC0xMDQ1LDcgKzEwNDUsNyBAQAogCQl9CiAJfSAvKiBlbmQgaW92ZWMgbG9vcCAqLwogCi0JaWYgKHJldCA9PSAtRU5PVEJMSyAmJiBydyA9PSBXUklURSkgeworCWlmIChyZXQgPT0gLUVOT1RCTEsgJiYgKHJ3ICYgV1JJVEUpKSB7CiAJCS8qCiAJCSAqIFRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgcmVxdWVzdCB3aWxsIGJlCiAJCSAqIGJlIGhhbmRsZWQgYnkgYnVmZmVyZWQgSS9PIHdoZW4gd2UgcmV0dXJuCkBAIC0xMDg5LDcgKzEwODksNyBAQAogCWlmIChkaW8tPmlzX2FzeW5jKSB7CiAJCWludCBzaG91bGRfd2FpdCA9IDA7CiAKLQkJaWYgKGRpby0+cmVzdWx0IDwgZGlvLT5zaXplICYmIHJ3ID09IFdSSVRFKSB7CisJCWlmIChkaW8tPnJlc3VsdCA8IGRpby0+c2l6ZSAmJiAocncgJiBXUklURSkpIHsKIAkJCWRpby0+d2FpdGVyID0gY3VycmVudDsKIAkJCXNob3VsZF93YWl0ID0gMTsKIAkJfQpAQCAtMTE0Miw3ICsxMTQyLDcgQEAKIAkJCXJldCA9IHRyYW5zZmVycmVkOwogCiAJCS8qIFdlIGNvdWxkIGhhdmUgYWxzbyBjb21lIGhlcmUgb24gYW4gQUlPIGZpbGUgZXh0ZW5kICovCi0JCWlmICghaXNfc3luY19raW9jYihpb2NiKSAmJiBydyA9PSBXUklURSAmJgorCQlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikgJiYgKHJ3ICYgV1JJVEUpICYmCiAJCSAgICByZXQgPj0gMCAmJiBkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpCiAJCQkvKgogCQkJICogRm9yIEFJTyB3cml0ZXMgd2hlcmUgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlCkBAIC0xMTk0LDcgKzExOTQsNyBAQAogCWludCBhY3F1aXJlX2lfbXV0ZXggPSAwOwogCiAJaWYgKHJ3ICYgV1JJVEUpCi0JCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKKwkJcncgPSBXUklURV9TWU5DOwogCiAJaWYgKGJkZXYpCiAJCWJkZXZfYmxrYml0cyA9IGJsa3NpemVfYml0cyhiZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOwpAQCAtMTI3MCw3ICsxMjcwLDcgQEAKIAkgKiBldmVuIGZvciBBSU8sIHdlIG5lZWQgdG8gd2FpdCBmb3IgaS9vIHRvIGNvbXBsZXRlIGJlZm9yZQogCSAqIHJldHVybmluZyBpbiB0aGlzIGNhc2UuCiAJICovCi0JZGlvLT5pc19hc3luYyA9ICFpc19zeW5jX2tpb2NiKGlvY2IpICYmICEoKHJ3ID09IFdSSVRFKSAmJgorCWRpby0+aXNfYXN5bmMgPSAhaXNfc3luY19raW9jYihpb2NiKSAmJiAhKChydyAmIFdSSVRFKSAmJgogCQkoZW5kID4gaV9zaXplX3JlYWQoaW5vZGUpKSk7CiAKIAlyZXR2YWwgPSBkaXJlY3RfaW9fd29ya2VyKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsCkBAIC0xMjg0LDggKzEyODQsNiBAQAogCQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAllbHNlIGlmIChhY3F1aXJlX2lfbXV0ZXgpCiAJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlpZiAocncgJiBXUklURSkKLQkJY3VycmVudC0+ZmxhZ3MgJj0gflBGX1NZTkNXUklURTsKIAlyZXR1cm4gcmV0dmFsOwogfQogRVhQT1JUX1NZTUJPTChfX2Jsb2NrZGV2X2RpcmVjdF9JTyk7CmRpZmYgLS1naXQgYS9mcy9lZnMvc3VwZXIuYyBiL2ZzL2Vmcy9zdXBlci5jCmluZGV4IGRmZjYyM2UuLjhhYzI0NjIgMTAwNjQ0Ci0tLSBhL2ZzL2Vmcy9zdXBlci5jCisrKyBiL2ZzL2Vmcy9zdXBlci5jCkBAIC0xNSwxMyArMTUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgogCi1zdGF0aWMgaW50IGVmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKK3N0YXRpYyBpbnQgZWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpOwogc3RhdGljIGludCBlZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmQsIGludCBzaWxlbnQpOwogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICplZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZWZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGVmc19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZWZzX2ZzX3R5cGUgPSB7CkBAIC0zMjIsOCArMzIyLDggQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGtzdGF0ZnMgKmJ1ZikgewotCXN0cnVjdCBlZnNfc2JfaW5mbyAqc2IgPSBTVVBFUl9JTkZPKHMpOworc3RhdGljIGludCBlZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikgeworCXN0cnVjdCBlZnNfc2JfaW5mbyAqc2IgPSBTVVBFUl9JTkZPKGRlbnRyeS0+ZF9zYik7CiAKIAlidWYtPmZfdHlwZSAgICA9IEVGU19TVVBFUl9NQUdJQzsJLyogZWZzIG1hZ2ljIG51bWJlciAqLwogCWJ1Zi0+Zl9ic2l6ZSAgID0gRUZTX0JMT0NLU0laRTsJCS8qIGJsb2Nrc2l6ZSAqLwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwppbmRleCAyNjk1MzM3Li45YzY3N2JiIDEwMDY0NAotLS0gYS9mcy9ldmVudHBvbGwuYworKysgYi9mcy9ldmVudHBvbGwuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgZnMvZXZlbnRwb2xsLmMgKCBFZmZpY2VudCBldmVudCBwb2xsaW5nIGltcGxlbWVudGF0aW9uICkKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDEsLi4uLDIwMDMJIERhdmlkZSBMaWJlbnppCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLC4uLiwyMDA2CSBEYXZpZGUgTGliZW56aQogICoKICAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNjgsOSArMjY4LDkgQEAKIAkJICAgaW50IG1heGV2ZW50cywgbG9uZyB0aW1lb3V0KTsKIHN0YXRpYyBpbnQgZXZlbnRwb2xsZnNfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogc3RhdGljIHN0cnVjdCBpbm9kZSAqZXBfZXZlbnRwb2xsX2lub2RlKHZvaWQpOwotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZXZlbnRwb2xsZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCQkJCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCQkgICAgICB2b2lkICpkYXRhKTsKK3N0YXRpYyBpbnQgZXZlbnRwb2xsZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIAogLyoKICAqIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gc2VyaWFsaXplIGVwX2ZyZWUoKSBhbmQgZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpLgpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKIAogCQkvKiBOb3RpZnkgd2FpdGluZyB0YXNrcyB0aGF0IGV2ZW50cyBhcmUgYXZhaWxhYmxlICovCiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+d3EpKQotCQkJd2FrZV91cCgmZXAtPndxKTsKKwkJCV9fd2FrZV91cF9sb2NrZWQoJmVwLT53cSwgVEFTS19VTklOVEVSUlVQVElCTEUgfCBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCiAJCQlwd2FrZSsrOwogCX0KQEAgLTEwODMsNyArMTA4Myw4IEBACiAKIAkJCQkvKiBOb3RpZnkgd2FpdGluZyB0YXNrcyB0aGF0IGV2ZW50cyBhcmUgYXZhaWxhYmxlICovCiAJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT53cSkpCi0JCQkJCXdha2VfdXAoJmVwLT53cSk7CisJCQkJCV9fd2FrZV91cF9sb2NrZWQoJmVwLT53cSwgVEFTS19VTklOVEVSUlVQVElCTEUgfAorCQkJCQkJCSBUQVNLX0lOVEVSUlVQVElCTEUpOwogCQkJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKIAkJCQkJcHdha2UrKzsKIAkJCX0KQEAgLTEyNjAsNyArMTI2MSw4IEBACiAJICogd2FpdCBsaXN0LgogCSAqLwogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+d3EpKQotCQl3YWtlX3VwKCZlcC0+d3EpOworCQlfX3dha2VfdXBfbG9ja2VkKCZlcC0+d3EsIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHwKKwkJCQkgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCiAJCXB3YWtlKys7CiAKQEAgLTE0NDQsNyArMTQ0Niw4IEBACiAJCSAqIHdhaXQgbGlzdC4KIAkJICovCiAJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+d3EpKQotCQkJd2FrZV91cCgmZXAtPndxKTsKKwkJCV9fd2FrZV91cF9sb2NrZWQoJmVwLT53cSwgVEFTS19VTklOVEVSUlVQVElCTEUgfAorCQkJCQkgVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT5wb2xsX3dhaXQpKQogCQkJcHdha2UrKzsKIAl9CkBAIC0xNTE2LDcgKzE1MTksNyBAQAogCQkgKiBlcF9wb2xsX2NhbGxiYWNrKCkgd2hlbiBldmVudHMgd2lsbCBiZWNvbWUgYXZhaWxhYmxlLgogCQkgKi8KIAkJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwotCQlhZGRfd2FpdF9xdWV1ZSgmZXAtPndxLCAmd2FpdCk7CisJCV9fYWRkX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOwogCiAJCWZvciAoOzspIHsKIAkJCS8qCkBAIC0xNTM2LDcgKzE1MzksNyBAQAogCQkJanRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KGp0aW1lb3V0KTsKIAkJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKIAkJfQotCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZXAtPndxLCAmd2FpdCk7CisJCV9fcmVtb3ZlX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOwogCiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAJfQpAQCAtMTU5NSwxMSArMTU5OCwxMiBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorc3RhdGljIGludAogZXZlbnRwb2xsZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCi0JCSAgIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorCQkgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImV2ZW50cG9sbDoiLCBOVUxMLCBFVkVOVFBPTExGU19NQUdJQyk7CisJcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgImV2ZW50cG9sbDoiLCBOVUxMLCBFVkVOVFBPTExGU19NQUdJQywKKwkJCSAgICAgbW50KTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy9leGVjLmMgYi9mcy9leGVjLmMKaW5kZXggZDA3ODU4Yy4uMGI4OGJmNiAxMDA2NDQKLS0tIGEvZnMvZXhlYy5jCisrKyBiL2ZzL2V4ZWMuYwpAQCAtODY2LDcgKzg2Niw2IEBACiAJYnBybS0+bW0gPSBOVUxMOwkJLyogV2UncmUgdXNpbmcgaXQgbm93ICovCiAKIAkvKiBUaGlzIGlzIHRoZSBwb2ludCBvZiBubyByZXR1cm4gKi8KLQlzdGVhbF9sb2NrcyhmaWxlcyk7CiAJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CiAKIAljdXJyZW50LT5zYXNfc3Nfc3AgPSBjdXJyZW50LT5zYXNfc3Nfc2l6ZSA9IDA7CmRpZmYgLS1naXQgYS9mcy9leHQyL01ha2VmaWxlIGIvZnMvZXh0Mi9NYWtlZmlsZQppbmRleCBjNWQwMmRhLi5lMGIyYjQzIDEwMDY0NAotLS0gYS9mcy9leHQyL01ha2VmaWxlCisrKyBiL2ZzL2V4dDIvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiAKIG9iai0kKENPTkZJR19FWFQyX0ZTKSArPSBleHQyLm8KIAotZXh0Mi15IDo9IGJhbGxvYy5vIGJpdG1hcC5vIGRpci5vIGZpbGUubyBmc3luYy5vIGlhbGxvYy5vIGlub2RlLm8gXAorZXh0Mi15IDo9IGJhbGxvYy5vIGRpci5vIGZpbGUubyBmc3luYy5vIGlhbGxvYy5vIGlub2RlLm8gXAogCSAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vCiAKIGV4dDItJChDT05GSUdfRVhUMl9GU19YQVRUUikJICs9IHhhdHRyLm8geGF0dHJfdXNlci5vIHhhdHRyX3RydXN0ZWQubwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9iYWxsb2MuYyBiL2ZzL2V4dDIvYmFsbG9jLmMKaW5kZXggMmMwMDk1My4uNDMzYTIxMyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9iYWxsb2MuYworKysgYi9mcy9leHQyL2JhbGxvYy5jCkBAIC01MjEsNiArNTIxLDI2IEBACiAJZ290byBvdXRfcmVsZWFzZTsKIH0KIAorI2lmZGVmIEVYVDJGU19ERUJVRworCitzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OworCit1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBzdW0gPSAwOworCisJaWYgKCFtYXApCisJCXJldHVybiAoMCk7CisJZm9yIChpID0gMDsgaSA8IG51bWNoYXJzOyBpKyspCisJCXN1bSArPSBuaWJibGVtYXBbbWFwLT5iX2RhdGFbaV0gJiAweGZdICsKKwkJCW5pYmJsZW1hcFsobWFwLT5iX2RhdGFbaV0gPj4gNCkgJiAweGZdOworCXJldHVybiAoc3VtKTsKK30KKworI2VuZGlmICAvKiAgRVhUMkZTX0RFQlVHICAqLworCisvKiBTdXBlcmJsb2NrIG11c3QgYmUgbG9ja2VkICovCiB1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQogewogCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBkZXNjOwpAQCAtNTMwLDcgKzU1MCw2IEBACiAJdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQsIHg7CiAJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzOwogCi0JbG9ja19zdXBlciAoc2IpOwogCWVzID0gRVhUMl9TQihzYiktPnNfZXM7CiAJZGVzY19jb3VudCA9IDA7CiAJYml0bWFwX2NvdW50ID0gMDsKQEAgLTU1NCw3ICs1NzMsNiBAQAogCXByaW50aygiZXh0Ml9jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gJWx1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAogCQkobG9uZylsZTMyX3RvX2NwdShlcy0+c19mcmVlX2Jsb2Nrc19jb3VudCksCiAJCWRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7Ci0JdW5sb2NrX3N1cGVyIChzYik7CiAJcmV0dXJuIGJpdG1hcF9jb3VudDsKICNlbHNlCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgewpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9iaXRtYXAuYyBiL2ZzL2V4dDIvYml0bWFwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTgzYTAuLjAwMDAwMDAKLS0tIGEvZnMvZXh0Mi9iaXRtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiAgbGludXgvZnMvZXh0Mi9iaXRtYXAuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQotICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQotICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKLSAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKLSAqLwotCi0jaWZkZWYgRVhUMkZTX0RFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgotCi0jaW5jbHVkZSAiZXh0Mi5oIgotCi1zdGF0aWMgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OwotCi11bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCi17Ci0JdW5zaWduZWQgaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBzdW0gPSAwOwotCQotCWlmICghbWFwKSAKLQkJcmV0dXJuICgwKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtY2hhcnM7IGkrKykKLQkJc3VtICs9IG5pYmJsZW1hcFttYXAtPmJfZGF0YVtpXSAmIDB4Zl0gKwotCQkJbmliYmxlbWFwWyhtYXAtPmJfZGF0YVtpXSA+PiA0KSAmIDB4Zl07Ci0JcmV0dXJuIChzdW0pOwotfQotCi0jZW5kaWYgIC8qICBFWFQyRlNfREVCVUcgICovCi0KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGlyLmMgYi9mcy9leHQyL2Rpci5jCmluZGV4IGQ2NzJhYTkuLjkyZWE4MjYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvZGlyLmMKKysrIGIvZnMvZXh0Mi9kaXIuYwpAQCAtMTU5LDggKzE1OSw3IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKiBleHQyX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAotCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG4sIE5VTEwpOwogCWlmICghSVNfRVJSKHBhZ2UpKSB7CiAJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CiAJCWttYXAocGFnZSk7CkBAIC00MDAsOCArMzk5LDcgQEAKIAlkZSA9IGV4dDJfZmluZF9lbnRyeSAoZGlyLCBkZW50cnksICZwYWdlKTsKIAlpZiAoZGUpIHsKIAkJcmVzID0gbGUzMl90b19jcHUoZGUtPmlub2RlKTsKLQkJa3VubWFwKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWV4dDJfcHV0X3BhZ2UocGFnZSk7CiAJfQogCXJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZzeW5jLmMgYi9mcy9leHQyL2ZzeW5jLmMKaW5kZXggYzljMmU1Zi4uNzgwNmI5ZSAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9mc3luYy5jCisrKyBiL2ZzL2V4dDIvZnN5bmMuYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjaW5jbHVkZSAiZXh0Mi5oIgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBmc3luY19pbm9kZV9idWZmZXJzKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIHN5bmNfbWFwcGluZ19idWZmZXJzKCkgKi8KIAogCiAvKgpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9pYWxsb2MuYyBiL2ZzL2V4dDIvaWFsbG9jLmMKaW5kZXggZTUyNzY1Mi4uMzA4YzI1MiAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9pYWxsb2MuYworKysgYi9mcy9leHQyL2lhbGxvYy5jCkBAIC02MzgsNiArNjM4LDcgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCisvKiBTdXBlcmJsb2NrIG11c3QgYmUgbG9ja2VkICovCiB1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZV9pbm9kZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQogewogCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2M7CkBAIC02NDksNyArNjUwLDYgQEAKIAl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCA9IDA7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCi0JbG9ja19zdXBlciAoc2IpOwogCWVzID0gRVhUMl9TQihzYiktPnNfZXM7CiAJZm9yIChpID0gMDsgaSA8IEVYVDJfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CiAJCXVuc2lnbmVkIHg7CkBAIC02NzIsNyArNjcyLDYgQEAKIAlwcmludGsoImV4dDJfY291bnRfZnJlZV9pbm9kZXM6IHN0b3JlZCA9ICVsdSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKIAkJcGVyY3B1X2NvdW50ZXJfcmVhZCgmRVhUMl9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSwKIAkJZGVzY19jb3VudCwgYml0bWFwX2NvdW50KTsKLQl1bmxvY2tfc3VwZXIoc2IpOwogCXJldHVybiBkZXNjX2NvdW50OwogI2Vsc2UKIAlmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvc3VwZXIuYyBiL2ZzL2V4dDIvc3VwZXIuYwppbmRleCA3ZTMwYmFlLi5kNDIzM2IyIDEwMDY0NAotLS0gYS9mcy9leHQyL3N1cGVyLmMKKysrIGIvZnMvZXh0Mi9zdXBlci5jCkBAIC0zOSw3ICszOSw3IEBACiBzdGF0aWMgdm9pZCBleHQyX3N5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMpOwogc3RhdGljIGludCBleHQyX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOwotc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKK3N0YXRpYyBpbnQgZXh0Ml9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKIAogdm9pZCBleHQyX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAogCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQpAQCAtODM0LDkgKzgzNCw2IEBACiAJCXByaW50ayAoIkVYVDItZnM6IG5vdCBlbm91Z2ggbWVtb3J5XG4iKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQotCXBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOwotCXBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOwotCXBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19kaXJzX2NvdW50ZXIpOwogCWJnbF9sb2NrX2luaXQoJnNiaS0+c19ibG9ja2dyb3VwX2xvY2spOwogCXNiaS0+c19kZWJ0cyA9IGttYWxsb2Moc2JpLT5zX2dyb3Vwc19jb3VudCAqIHNpemVvZigqc2JpLT5zX2RlYnRzKSwKIAkJCSAgICAgICBHRlBfS0VSTkVMKTsKQEAgLTg1NywxMiArODU0LDE4IEBACiAJfQogCWlmICghZXh0Ml9jaGVja19kZXNjcmlwdG9ycyAoc2IpKSB7CiAJCXByaW50ayAoIkVYVDItZnM6IGdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCFcbiIpOwotCQlkYl9jb3VudCA9IGk7CiAJCWdvdG8gZmFpbGVkX21vdW50MjsKIAl9CiAJc2JpLT5zX2dkYl9jb3VudCA9IGRiX2NvdW50OwogCWdldF9yYW5kb21fYnl0ZXMoJnNiaS0+c19uZXh0X2dlbmVyYXRpb24sIHNpemVvZih1MzIpKTsKIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX25leHRfZ2VuX2xvY2spOworCisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJCQlleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJCQlleHQyX2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2RpcnNfY291bnRlciwKKwkJCQlleHQyX2NvdW50X2RpcnMoc2IpKTsKIAkvKgogCSAqIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZQogCSAqLwpAQCAtODc0LDI0ICs4NzcsMTggQEAKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKIAkJaXB1dChyb290KTsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJCWdvdG8gZmFpbGVkX21vdW50MzsKIAl9CiAJaWYgKCFTX0lTRElSKHJvb3QtPmlfbW9kZSkgfHwgIXJvb3QtPmlfYmxvY2tzIHx8ICFyb290LT5pX3NpemUpIHsKIAkJZHB1dChzYi0+c19yb290KTsKIAkJc2ItPnNfcm9vdCA9IE5VTEw7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrXG4iKTsKLQkJZ290byBmYWlsZWRfbW91bnQyOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCiAJCWV4dDJfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJIm1vdW50aW5nIGV4dDMgZmlsZXN5c3RlbSBhcyBleHQyIik7CiAJZXh0Ml9zZXR1cF9zdXBlciAoc2IsIGVzLCBzYi0+c19mbGFncyAmIE1TX1JET05MWSk7Ci0JcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLAotCQkJCWV4dDJfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKLQlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIsCi0JCQkJZXh0Ml9jb3VudF9mcmVlX2lub2RlcyhzYikpOwotCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2RpcnNfY291bnRlciwKLQkJCQlleHQyX2NvdW50X2RpcnMoc2IpKTsKIAlyZXR1cm4gMDsKIAogY2FudGZpbmRfZXh0MjoKQEAgLTg5OSw3ICs4OTYsMTAgQEAKIAkJcHJpbnRrKCJWRlM6IENhbid0IGZpbmQgYW4gZXh0MiBmaWxlc3lzdGVtIG9uIGRldiAlcy5cbiIsCiAJCSAgICAgICBzYi0+c19pZCk7CiAJZ290byBmYWlsZWRfbW91bnQ7Ci0KK2ZhaWxlZF9tb3VudDM6CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CiBmYWlsZWRfbW91bnQyOgogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQogCQlicmVsc2Uoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pOwpAQCAtMTAzOCwxMiArMTAzOCwxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZXh0Ml9zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1ZikKK3N0YXRpYyBpbnQgZXh0Ml9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBrc3RhdGZzICogYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CiAJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKIAlpbnQgaTsKIAorCWxvY2tfc3VwZXIoc2IpOwogCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKIAkJb3ZlcmhlYWQgPSAwOwogCWVsc2UgewpAQCAtMTA4NCwxMyArMTA4NiwxNCBAQAogCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19pbm9kZXNfY291bnQpOwogCWJ1Zi0+Zl9mZnJlZSA9IGV4dDJfY291bnRfZnJlZV9pbm9kZXMgKHNiKTsKIAlidWYtPmZfbmFtZWxlbiA9IEVYVDJfTkFNRV9MRU47CisJdW5sb2NrX3N1cGVyKHNiKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZXh0Ml9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZXh0Ml9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0Ml9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQyX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKICNpZmRlZiBDT05GSUdfUVVPVEEKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYmFsbG9jLmMgYi9mcy9leHQzL2JhbGxvYy5jCmluZGV4IDc3OTI3ZDYuLjk2MTcyZTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvYmFsbG9jLmMKKysrIGIvZnMvZXh0My9iYWxsb2MuYwpAQCAtMTYzLDIwICsxNjMsMTkgQEAKICNlbmRpZgogCiBzdGF0aWMgaW50Ci1nb2FsX2luX215X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpyc3YsIGludCBnb2FsLAorZ29hbF9pbl9teV9yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyAqcnN2LCBleHQzX2dycGJsa190IGdycF9nb2FsLAogCQkJdW5zaWduZWQgaW50IGdyb3VwLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKIHsKLQl1bnNpZ25lZCBsb25nIGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9sYXN0X2Jsb2NrOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKIAotCWdyb3VwX2ZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKwotCQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9maXJzdF9ibG9jayA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKIAlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKIAogCWlmICgocnN2LT5fcnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKIAkgICAgKHJzdi0+X3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCiAJCXJldHVybiAwOwotCWlmICgoZ29hbCA+PSAwKSAmJiAoKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKLQkJfHwgKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA+IHJzdi0+X3Jzdl9lbmQpKSkKKwlpZiAoKGdycF9nb2FsID49IDApICYmICgoZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKKwkJfHwgKGdycF9nb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2sgPiByc3YtPl9yc3ZfZW5kKSkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpAQCAtMTg3LDcgKzE4Niw3IEBACiAgKiBSZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHdpbmRvd3Mgb3IgaWYgYWxsIHdpbmRvd3Mgc3RhcnQgYWZ0ZXIgdGhlIGdvYWwuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICoKLXNlYXJjaF9yZXNlcnZlX3dpbmRvdyhzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBnb2FsKQorc2VhcmNoX3Jlc2VydmVfd2luZG93KHN0cnVjdCByYl9yb290ICpyb290LCBleHQzX2ZzYmxrX3QgZ29hbCkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CiAJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OwpAQCAtMjIzLDcgKzIyMiw3IEBACiB7CiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290OwogCXN0cnVjdCByYl9ub2RlICpub2RlID0gJnJzdi0+cnN2X25vZGU7Ci0JdW5zaWduZWQgaW50IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CisJZXh0M19mc2Jsa190IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CiAKIAlzdHJ1Y3QgcmJfbm9kZSAqKiBwID0gJnJvb3QtPnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOwpAQCAtMzEwLDIwICszMDksMjAgQEAKIAogLyogRnJlZSBnaXZlbiBibG9ja3MsIHVwZGF0ZSBxdW90YSBhbmQgaV9ibG9ja3MgZmllbGQgKi8KIHZvaWQgZXh0M19mcmVlX2Jsb2Nrc19zYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJIHVuc2lnbmVkIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCi0JCQkgaW50ICpwZHF1b3RfZnJlZWRfYmxvY2tzKQorCQkJIGV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSB1bnNpZ25lZCBsb25nICpwZHF1b3RfZnJlZWRfYmxvY2tzKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmdkX2JoOwogCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7Ci0JdW5zaWduZWQgbG9uZyBiaXQ7CisJZXh0M19ncnBibGtfdCBiaXQ7CiAJdW5zaWduZWQgbG9uZyBpOwogCXVuc2lnbmVkIGxvbmcgb3ZlcmZsb3c7CiAJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqIGRlc2M7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CiAJaW50IGVyciA9IDAsIHJldDsKLQl1bnNpZ25lZCBncm91cF9mcmVlZDsKKwlleHQzX2dycGJsa190IGdyb3VwX2ZyZWVkOwogCiAJKnBkcXVvdF9mcmVlZF9ibG9ja3MgPSAwOwogCXNiaSA9IEVYVDNfU0Ioc2IpOwpAQCAtMzMzLDcgKzMzMiw3IEBACiAJICAgIGJsb2NrICsgY291bnQgPiBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CiAJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2Jsb2NrcyIsCiAJCQkgICAgIkZyZWVpbmcgYmxvY2tzIG5vdCBpbiBkYXRhem9uZSAtICIKLQkJCSAgICAiYmxvY2sgPSAlbHUsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKKwkJCSAgICAiYmxvY2sgPSAiRTNGU0JMSyIsIGNvdW50ID0gJWx1IiwgYmxvY2ssIGNvdW50KTsKIAkJZ290byBlcnJvcl9yZXR1cm47CiAJfQogCkBAIC0zNjksNyArMzY4LDcgQEAKIAkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQogCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAogCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCi0JCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgIkJsb2NrID0gIkUzRlNCTEsiLCBjb3VudCA9ICVsdSIsCiAJCQkgICAgYmxvY2ssIGNvdW50KTsKIAogCS8qCkBAIC00NTMsNyArNDUyLDggQEAKIAkJCQkJCWJpdCArIGksIGJpdG1hcF9iaC0+Yl9kYXRhKSkgewogCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaXRtYXBfYmgpOwogCQkJZXh0M19lcnJvcihzYiwgX19GVU5DVElPTl9fLAotCQkJCSJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAlbHUiLCBibG9jayArIGkpOworCQkJCSJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAiRTNGU0JMSywKKwkJCQkgYmxvY2sgKyBpKTsKIAkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CiAJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOwogCQl9IGVsc2UgewpAQCAtNDkzLDEwICs0OTMsMTAgQEAKIAogLyogRnJlZSBnaXZlbiBibG9ja3MsIHVwZGF0ZSBxdW90YSBhbmQgaV9ibG9ja3MgZmllbGQgKi8KIHZvaWQgZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKKwkJCWV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLQlpbnQgZHF1b3RfZnJlZWRfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgZHF1b3RfZnJlZWRfYmxvY2tzOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAlpZiAoIXNiKSB7CkBAIC01MjUsNyArNTI1LDcgQEAKICAqIGRhdGEtd3JpdGVzIGF0IHNvbWUgcG9pbnQsIGFuZCBkaXNhYmxlIGl0IGZvciBtZXRhZGF0YSBhbGxvY2F0aW9ucyBvcgogICogc3luYy1kYXRhIGlub2Rlcy4KICAqLwotc3RhdGljIGludCBleHQzX3Rlc3RfYWxsb2NhdGFibGUoaW50IG5yLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBleHQzX3Rlc3RfYWxsb2NhdGFibGUoZXh0M19ncnBibGtfdCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOwpAQCAtNTQyLDExICs1NDIsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50Ci1iaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGludCBzdGFydCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKLQkJCQkJaW50IG1heGJsb2NrcykKK3N0YXRpYyBleHQzX2dycGJsa190CitiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKGV4dDNfZ3JwYmxrX3Qgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCWV4dDNfZ3JwYmxrX3QgbWF4YmxvY2tzKQogewotCWludCBuZXh0OworCWV4dDNfZ3JwYmxrX3QgbmV4dDsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAogCS8qCkBAIC01NzYsMTAgKzU3NiwxMSBAQAogICogdGhlIGluaXRpYWwgZ29hbDsgdGhlbiBmb3IgYSBmcmVlIGJ5dGUgc29tZXdoZXJlIGluIHRoZSBiaXRtYXA7IHRoZW4KICAqIGZvciBhbnkgZnJlZSBiaXQgaW4gdGhlIGJpdG1hcC4KICAqLwotc3RhdGljIGludAotZmluZF9uZXh0X3VzYWJsZV9ibG9jayhpbnQgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBtYXhibG9ja3MpCitzdGF0aWMgZXh0M19ncnBibGtfdAorZmluZF9uZXh0X3VzYWJsZV9ibG9jayhleHQzX2dycGJsa190IHN0YXJ0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJZXh0M19ncnBibGtfdCBtYXhibG9ja3MpCiB7Ci0JaW50IGhlcmUsIG5leHQ7CisJZXh0M19ncnBibGtfdCBoZXJlLCBuZXh0OwogCWNoYXIgKnAsICpyOwogCiAJaWYgKHN0YXJ0ID4gMCkgewpAQCAtNTkxLDcgKzU5Miw3IEBACiAJCSAqIGxlc3MgdGhhbiBFWFQzX0JMT0NLU19QRVJfR1JPVVAuIEFsaWduaW5nIHVwIHRvIHRoZQogCQkgKiBuZXh0IDY0LWJpdCBib3VuZGFyeSBpcyBzaW1wbGUuLgogCQkgKi8KLQkJaW50IGVuZF9nb2FsID0gKHN0YXJ0ICsgNjMpICYgfjYzOworCQlleHQzX2dycGJsa190IGVuZF9nb2FsID0gKHN0YXJ0ICsgNjMpICYgfjYzOwogCQlpZiAoZW5kX2dvYWwgPiBtYXhibG9ja3MpCiAJCQllbmRfZ29hbCA9IG1heGJsb2NrczsKIAkJaGVyZSA9IGV4dDNfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIGVuZF9nb2FsLCBzdGFydCk7CkBAIC02MjgsNyArNjI5LDcgQEAKICAqIHplcm8gKGZhaWx1cmUpLgogICovCiBzdGF0aWMgaW5saW5lIGludAotY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgaW50IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgZXh0M19ncnBibGtfdCBibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKIHsKIAlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKIAlpbnQgcmV0OwpAQCAtNjUxLDE5ICs2NTIsMTggQEAKICAqIG5ldyBiaXRtYXAuICBJbiB0aGF0IGNhc2Ugd2UgbXVzdCByZWxlYXNlIHdyaXRlIGFjY2VzcyB0byB0aGUgb2xkIG9uZSB2aWEKICAqIGV4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcigpLCBlbHNlIHdlJ2xsIHJ1biBvdXQgb2YgY3JlZGl0cy4KICAqLwotc3RhdGljIGludAorc3RhdGljIGV4dDNfZ3JwYmxrX3QKIGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsIGludCBncm91cCwKLQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLCBpbnQgZ29hbCwKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLCBleHQzX2dycGJsa190IGdycF9nb2FsLAogCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpteV9yc3YpCiB7Ci0JaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBzdGFydCwgZW5kOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jazsKKwlleHQzX2dycGJsa190IHN0YXJ0LCBlbmQ7CiAJdW5zaWduZWQgbG9uZyBudW0gPSAwOwogCiAJLyogd2UgZG8gYWxsb2NhdGlvbiB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpZiB3ZSBoYXZlIGEgd2luZG93ICovCiAJaWYgKG15X3JzdikgewotCQlncm91cF9maXJzdF9ibG9jayA9Ci0JCQlsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCi0JCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWdyb3VwX2ZpcnN0X2Jsb2NrID0gZXh0M19ncm91cF9maXJzdF9ibG9ja19ubyhzYiwgZ3JvdXApOwogCQlpZiAobXlfcnN2LT5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrKQogCQkJc3RhcnQgPSBteV9yc3YtPl9yc3Zfc3RhcnQgLSBncm91cF9maXJzdF9ibG9jazsKIAkJZWxzZQpAQCAtNjczLDEzICs2NzMsMTMgQEAKIAkJaWYgKGVuZCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCiAJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3NlcyBncm91cCBib3VuZGFyeSAqLwogCQkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQkJaWYgKChzdGFydCA8PSBnb2FsKSAmJiAoZ29hbCA8IGVuZCkpCi0JCQlzdGFydCA9IGdvYWw7CisJCWlmICgoc3RhcnQgPD0gZ3JwX2dvYWwpICYmIChncnBfZ29hbCA8IGVuZCkpCisJCQlzdGFydCA9IGdycF9nb2FsOwogCQllbHNlCi0JCQlnb2FsID0gLTE7CisJCQlncnBfZ29hbCA9IC0xOwogCX0gZWxzZSB7Ci0JCWlmIChnb2FsID4gMCkKLQkJCXN0YXJ0ID0gZ29hbDsKKwkJaWYgKGdycF9nb2FsID4gMCkKKwkJCXN0YXJ0ID0gZ3JwX2dvYWw7CiAJCWVsc2UKIAkJCXN0YXJ0ID0gMDsKIAkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKQEAgLTY4OCw0MyArNjg4LDQzIEBACiAJQlVHX09OKHN0YXJ0ID4gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CiAKIHJlcGVhdDoKLQlpZiAoZ29hbCA8IDAgfHwgIWV4dDNfdGVzdF9hbGxvY2F0YWJsZShnb2FsLCBiaXRtYXBfYmgpKSB7Ci0JCWdvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7Ci0JCWlmIChnb2FsIDwgMCkKKwlpZiAoZ3JwX2dvYWwgPCAwIHx8ICFleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKKwkJZ3JwX2dvYWwgPSBmaW5kX25leHRfdXNhYmxlX2Jsb2NrKHN0YXJ0LCBiaXRtYXBfYmgsIGVuZCk7CisJCWlmIChncnBfZ29hbCA8IDApCiAJCQlnb3RvIGZhaWxfYWNjZXNzOwogCQlpZiAoIW15X3JzdikgewogCQkJaW50IGk7CiAKLQkJCWZvciAoaSA9IDA7IGkgPCA3ICYmIGdvYWwgPiBzdGFydCAmJgotCQkJCQlleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ29hbCAtIDEsCisJCQlmb3IgKGkgPSAwOyBpIDwgNyAmJiBncnBfZ29hbCA+IHN0YXJ0ICYmCisJCQkJCWV4dDNfdGVzdF9hbGxvY2F0YWJsZShncnBfZ29hbCAtIDEsCiAJCQkJCQkJCWJpdG1hcF9iaCk7Ci0JCQkJCWkrKywgZ29hbC0tKQorCQkJCQlpKyssIGdycF9nb2FsLS0pCiAJCQkJOwogCQl9CiAJfQotCXN0YXJ0ID0gZ29hbDsKKwlzdGFydCA9IGdycF9nb2FsOwogCi0JaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBnb2FsLCBiaXRtYXBfYmgpKSB7CisJaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBncnBfZ29hbCwgYml0bWFwX2JoKSkgewogCQkvKgogCQkgKiBUaGUgYmxvY2sgd2FzIGFsbG9jYXRlZCBieSBhbm90aGVyIHRocmVhZCwgb3IgaXQgd2FzCiAJCSAqIGFsbG9jYXRlZCBhbmQgdGhlbiBmcmVlZCBieSBhbm90aGVyIHRocmVhZAogCQkgKi8KIAkJc3RhcnQrKzsKLQkJZ29hbCsrOworCQlncnBfZ29hbCsrOwogCQlpZiAoc3RhcnQgPj0gZW5kKQogCQkJZ290byBmYWlsX2FjY2VzczsKIAkJZ290byByZXBlYXQ7CiAJfQogCW51bSsrOwotCWdvYWwrKzsKLQl3aGlsZSAobnVtIDwgKmNvdW50ICYmIGdvYWwgPCBlbmQKLQkJJiYgZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwsIGJpdG1hcF9iaCkKLQkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwgZ29hbCwgYml0bWFwX2JoKSkgeworCWdycF9nb2FsKys7CisJd2hpbGUgKG51bSA8ICpjb3VudCAmJiBncnBfZ29hbCA8IGVuZAorCQkmJiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoZ3JwX2dvYWwsIGJpdG1hcF9iaCkKKwkJJiYgY2xhaW1fYmxvY2soc2JfYmdsX2xvY2soRVhUM19TQihzYiksIGdyb3VwKSwgZ3JwX2dvYWwsIGJpdG1hcF9iaCkpIHsKIAkJbnVtKys7Ci0JCWdvYWwrKzsKKwkJZ3JwX2dvYWwrKzsKIAl9CiAJKmNvdW50ID0gbnVtOwotCXJldHVybiBnb2FsIC0gbnVtOworCXJldHVybiBncnBfZ29hbCAtIG51bTsKIGZhaWxfYWNjZXNzOgogCSpjb3VudCA9IG51bTsKIAlyZXR1cm4gLTE7CkBAIC03NjYsMTIgKzc2NiwxMyBAQAogc3RhdGljIGludCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coCiAJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQsCiAJCQkJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAotCQkJCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgc3RhcnRfYmxvY2ssCi0JCQkJaW50IGxhc3RfYmxvY2spCisJCQkJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkJZXh0M19mc2Jsa190IHN0YXJ0X2Jsb2NrLAorCQkJCWV4dDNfZnNibGtfdCBsYXN0X2Jsb2NrKQogewogCXN0cnVjdCByYl9ub2RlICpuZXh0OwogCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiwgKnByZXY7Ci0JaW50IGN1cjsKKwlleHQzX2ZzYmxrX3QgY3VyOwogCWludCBzaXplID0gbXlfcnN2LT5yc3ZfZ29hbF9zaXplOwogCiAJLyogVE9ETzogbWFrZSB0aGUgc3RhcnQgb2YgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBieXRlLWFsaWduZWQgKi8KQEAgLTg3MywxMCArODc0LDEwIEBACiAgKgogICoJQHJzdjogdGhlIHJlc2VydmF0aW9uCiAgKgotICoJQGdvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCisgKglAZ3JwX2dvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCiAgKgkJZnJlZSByZXNlcnZhYmxlIHNwYWNlIHNob3VsZCBzdGFydCBmcm9tLgotICoJCWlmIHdlIGhhdmUgYSBnb2FsKGdvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAotICoJCW5vIGdvYWwoZ29hbCA9IC0xKSwgd2Ugc3RhcnQgZnJvbSB0aGUgZmlyc3QgYmxvY2sKKyAqCQlpZiB3ZSBoYXZlIGEgZ3JwX2dvYWwoZ3JwX2dvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAorICoJCW5vIGdycF9nb2FsKGdycF9nb2FsID0gLTEpLCB3ZSBzdGFydCBmcm9tIHRoZSBmaXJzdCBibG9jawogICoJCW9mIHRoZSBncm91cC4KICAqCiAgKglAc2I6IHRoZSBzdXBlciBibG9jawpAQCAtODg1LDI1ICs4ODYsMjQgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQgYWxsb2NfbmV3X3Jlc2VydmF0aW9uKHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKm15X3JzdiwKLQkJaW50IGdvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWV4dDNfZ3JwYmxrX3QgZ3JwX2dvYWwsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgpCiB7CiAJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqc2VhcmNoX2hlYWQ7Ci0JaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2ssIHN0YXJ0X2Jsb2NrOwotCWludCBmaXJzdF9mcmVlX2Jsb2NrOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrLCBzdGFydF9ibG9jazsKKwlleHQzX2dycGJsa190IGZpcnN0X2ZyZWVfYmxvY2s7CiAJc3RydWN0IHJiX3Jvb3QgKmZzX3Jzdl9yb290ID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJaW50IHJldDsKIAlzcGlubG9ja190ICpyc3ZfbG9jayA9ICZFWFQzX1NCKHNiKS0+c19yc3Zfd2luZG93X2xvY2s7CiAKLQlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZ3JvdXBfZmlyc3RfYmxvY2sgPSBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKHNiLCBncm91cCk7CiAJZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKIAotCWlmIChnb2FsIDwgMCkKKwlpZiAoZ3JwX2dvYWwgPCAwKQogCQlzdGFydF9ibG9jayA9IGdyb3VwX2ZpcnN0X2Jsb2NrOwogCWVsc2UKLQkJc3RhcnRfYmxvY2sgPSBnb2FsICsgZ3JvdXBfZmlyc3RfYmxvY2s7CisJCXN0YXJ0X2Jsb2NrID0gZ3JwX2dvYWwgKyBncm91cF9maXJzdF9ibG9jazsKIAogCXNpemUgPSBteV9yc3YtPnJzdl9nb2FsX3NpemU7CiAKQEAgLTEwNTcsMTQgKzEwNTcsMTUgQEAKICAqIHNvcnRlZCBkb3VibGUgbGlua2VkIGxpc3Qgc2hvdWxkIGJlIGZhc3QuCiAgKgogICovCi1zdGF0aWMgaW50CitzdGF0aWMgZXh0M19ncnBibGtfdAogZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaGFuZGxlX3QgKmhhbmRsZSwKIAkJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmgsCi0JCQlpbnQgZ29hbCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqIG15X3JzdiwKKwkJCWV4dDNfZ3JwYmxrX3QgZ3JwX2dvYWwsCisJCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICogbXlfcnN2LAogCQkJdW5zaWduZWQgbG9uZyAqY291bnQsIGludCAqZXJycCkKIHsKLQl1bnNpZ25lZCBsb25nIGdyb3VwX2ZpcnN0X2Jsb2NrOwotCWludCByZXQgPSAwOworCWV4dDNfZnNibGtfdCBncm91cF9maXJzdF9ibG9jazsKKwlleHQzX2dycGJsa190IHJldCA9IDA7CiAJaW50IGZhdGFsOwogCXVuc2lnbmVkIGxvbmcgbnVtID0gKmNvdW50OwogCkBAIC0xMDkwLDE3ICsxMDkxLDE2IEBACiAJICovCiAJaWYgKG15X3JzdiA9PSBOVUxMICkgewogCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLAotCQkJCQkJZ29hbCwgY291bnQsIE5VTEwpOworCQkJCQkJZ3JwX2dvYWwsIGNvdW50LCBOVUxMKTsKIAkJZ290byBvdXQ7CiAJfQogCS8qCi0JICogZ29hbCBpcyBhIGdyb3VwIHJlbGF0aXZlIGJsb2NrIG51bWJlciAoaWYgdGhlcmUgaXMgYSBnb2FsKQotCSAqIDAgPCBnb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQorCSAqIGdycF9nb2FsIGlzIGEgZ3JvdXAgcmVsYXRpdmUgYmxvY2sgbnVtYmVyIChpZiB0aGVyZSBpcyBhIGdvYWwpCisJICogMCA8IGdycF9nb2FsIDwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQogCSAqIGZpcnN0IGJsb2NrIGlzIGEgZmlsZXN5c3RlbSB3aWRlIGJsb2NrIG51bWJlcgogCSAqIGZpcnN0IGJsb2NrIGlzIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoaXMgZ3JvdXAKIAkgKi8KLQlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKLQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9maXJzdF9ibG9jayA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwKTsKIAogCS8qCiAJICogQmFzaWNhbGx5IHdlIHdpbGwgYWxsb2NhdGUgYSBuZXcgYmxvY2sgZnJvbSBpbm9kZSdzIHJlc2VydmF0aW9uCkBAIC0xMTE5LDI0ICsxMTE5LDI0IEBACiAJICovCiAJd2hpbGUgKDEpIHsKIAkJaWYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSB8fCAocmV0IDwgMCkgfHwKLQkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdvYWwsIGdyb3VwLCBzYikpIHsKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZteV9yc3YtPnJzdl93aW5kb3csIGdycF9nb2FsLCBncm91cCwgc2IpKSB7CiAJCQlpZiAobXlfcnN2LT5yc3ZfZ29hbF9zaXplIDwgKmNvdW50KQogCQkJCW15X3Jzdi0+cnN2X2dvYWxfc2l6ZSA9ICpjb3VudDsKLQkJCXJldCA9IGFsbG9jX25ld19yZXNlcnZhdGlvbihteV9yc3YsIGdvYWwsIHNiLAorCQkJcmV0ID0gYWxsb2NfbmV3X3Jlc2VydmF0aW9uKG15X3JzdiwgZ3JwX2dvYWwsIHNiLAogCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJYnJlYWs7CQkJLyogZmFpbGVkICovCiAKLQkJCWlmICghZ29hbF9pbl9teV9yZXNlcnZhdGlvbigmbXlfcnN2LT5yc3Zfd2luZG93LCBnb2FsLCBncm91cCwgc2IpKQotCQkJCWdvYWwgPSAtMTsKLQkJfSBlbHNlIGlmIChnb2FsID4gMCAmJiAobXlfcnN2LT5yc3ZfZW5kLWdvYWwrMSkgPCAqY291bnQpCisJCQlpZiAoIWdvYWxfaW5fbXlfcmVzZXJ2YXRpb24oJm15X3Jzdi0+cnN2X3dpbmRvdywgZ3JwX2dvYWwsIGdyb3VwLCBzYikpCisJCQkJZ3JwX2dvYWwgPSAtMTsKKwkJfSBlbHNlIGlmIChncnBfZ29hbCA+IDAgJiYgKG15X3Jzdi0+cnN2X2VuZC1ncnBfZ29hbCsxKSA8ICpjb3VudCkKIAkJCXRyeV90b19leHRlbmRfcmVzZXJ2YXRpb24obXlfcnN2LCBzYiwKLQkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdvYWwgLSAxKTsKKwkJCQkJKmNvdW50LW15X3Jzdi0+cnN2X2VuZCArIGdycF9nb2FsIC0gMSk7CiAKIAkJaWYgKChteV9yc3YtPnJzdl9zdGFydCA+PSBncm91cF9maXJzdF9ibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCiAJCSAgICB8fCAobXlfcnN2LT5yc3ZfZW5kIDwgZ3JvdXBfZmlyc3RfYmxvY2spKQogCQkJQlVHKCk7Ci0JCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsIGdvYWwsCisJCXJldCA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlKHNiLCBoYW5kbGUsIGdyb3VwLCBiaXRtYXBfYmgsIGdycF9nb2FsLAogCQkJCQkgICAmbnVtLCAmbXlfcnN2LT5yc3Zfd2luZG93KTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQlteV9yc3YtPnJzdl9hbGxvY19oaXQgKz0gbnVtOwpAQCAtMTE2NCw3ICsxMTY0LDcgQEAKIAogc3RhdGljIGludCBleHQzX2hhc19mcmVlX2Jsb2NrcyhzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCiB7Ci0JaW50IGZyZWVfYmxvY2tzLCByb290X2Jsb2NrczsKKwlleHQzX2ZzYmxrX3QgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOwogCiAJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CkBAIC0xMjAwLDE5ICsxMjAwLDIwIEBACiAgKiBiaXRtYXAsIGFuZCB0aGVuIGZvciBhbnkgZnJlZSBiaXQgaWYgdGhhdCBmYWlscy4KICAqIFRoaXMgZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZC4KICAqLwotaW50IGV4dDNfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBnb2FsLCB1bnNpZ25lZCBsb25nICpjb3VudCwgaW50ICplcnJwKQorZXh0M19mc2Jsa190IGV4dDNfbmV3X2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0M19mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOwogCWludCBncm91cF9ubzsKIAlpbnQgZ29hbF9ncm91cDsKLQlpbnQgcmV0X2Jsb2NrOworCWV4dDNfZ3JwYmxrX3QgZ3JwX3RhcmdldF9ibGs7CS8qIGJsb2NrZ3JvdXAgcmVsYXRpdmUgZ29hbCBibG9jayAqLworCWV4dDNfZ3JwYmxrX3QgZ3JwX2FsbG9jX2JsazsJLyogYmxvY2tncm91cC1yZWxhdGl2ZSBhbGxvY2F0ZWQgYmxvY2sqLworCWV4dDNfZnNibGtfdCByZXRfYmxvY2s7CQkvKiBmaWxlc3lldGVtLXdpZGUgYWxsb2NhdGVkIGJsb2NrICovCiAJaW50IGJnaTsJCQkvKiBibG9ja2dyb3VwIGl0ZXJhdGlvbiBpbmRleCAqLwotCWludCB0YXJnZXRfYmxvY2s7CiAJaW50IGZhdGFsID0gMCwgZXJyOwogCWludCBwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDA7Ci0JaW50IGZyZWVfYmxvY2tzOworCWV4dDNfZ3JwYmxrX3QgZnJlZV9ibG9ja3M7CS8qIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiBhIGdyb3VwICovCiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzOwpAQCAtMTI4NSwxNiArMTI4NiwxNyBAQAogCQlteV9yc3YgPSBOVUxMOwogCiAJaWYgKGZyZWVfYmxvY2tzID4gMCkgewotCQlyZXRfYmxvY2sgPSAoKGdvYWwgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQlncnBfdGFyZ2V0X2JsayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCiAJCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CiAJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CiAJCWlmICghYml0bWFwX2JoKQogCQkJZ290byBpb19lcnJvcjsKLQkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCi0JCQkJCWJpdG1hcF9iaCwgcmV0X2Jsb2NrLCBteV9yc3YsICZudW0sICZmYXRhbCk7CisJCWdycF9hbGxvY19ibGsgPSBleHQzX3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdihzYiwgaGFuZGxlLAorCQkJCQlncm91cF9ubywgYml0bWFwX2JoLCBncnBfdGFyZ2V0X2JsaywKKwkJCQkJbXlfcnN2LAkmbnVtLCAmZmF0YWwpOwogCQlpZiAoZmF0YWwpCiAJCQlnb3RvIG91dDsKLQkJaWYgKHJldF9ibG9jayA+PSAwKQorCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQogCQkJZ290byBhbGxvY2F0ZWQ7CiAJfQogCkBAIC0xMzI3LDExICsxMzI5LDE1IEBACiAJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CiAJCWlmICghYml0bWFwX2JoKQogCQkJZ290byBpb19lcnJvcjsKLQkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCi0JCQkJCWJpdG1hcF9iaCwgLTEsIG15X3JzdiwgJm51bSwgJmZhdGFsKTsKKwkJLyoKKwkJICogdHJ5IHRvIGFsbG9jYXRlIGJsb2NrKHMpIGZyb20gdGhpcyBncm91cCwgd2l0aG91dCBhIGdvYWwoLTEpLgorCQkgKi8KKwkJZ3JwX2FsbG9jX2JsayA9IGV4dDNfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHNiLCBoYW5kbGUsCisJCQkJCWdyb3VwX25vLCBiaXRtYXBfYmgsIC0xLCBteV9yc3YsCisJCQkJCSZudW0sICZmYXRhbCk7CiAJCWlmIChmYXRhbCkKIAkJCWdvdG8gb3V0OwotCQlpZiAocmV0X2Jsb2NrID49IDApIAorCQlpZiAoZ3JwX2FsbG9jX2JsayA+PSAwKQogCQkJZ290byBhbGxvY2F0ZWQ7CiAJfQogCS8qCkBAIC0xMzYwLDE4ICsxMzY2LDE4IEBACiAJaWYgKGZhdGFsKQogCQlnb3RvIG91dDsKIAotCXRhcmdldF9ibG9jayA9IHJldF9ibG9jayArIGdyb3VwX25vICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQotCQkJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJcmV0X2Jsb2NrID0gZ3JwX2FsbG9jX2JsayArIGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGdyb3VwX25vKTsKIAotCWlmIChpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCksIHRhcmdldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCksIHRhcmdldF9ibG9jaywgbnVtKSB8fAotCSAgICBpbl9yYW5nZSh0YXJnZXRfYmxvY2ssIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpLAorCWlmIChpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCksIHJldF9ibG9jaywgbnVtKSB8fAorCSAgICBpbl9yYW5nZShyZXRfYmxvY2ssIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpLAogCQkgICAgICBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSB8fAotCSAgICBpbl9yYW5nZSh0YXJnZXRfYmxvY2sgKyBudW0gLSAxLCBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSwKKwkgICAgaW5fcmFuZ2UocmV0X2Jsb2NrICsgbnVtIC0gMSwgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSksCiAJCSAgICAgIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKQogCQlleHQzX2Vycm9yKHNiLCAiZXh0M19uZXdfYmxvY2siLAogCQkJICAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gIgotCQkJICAgICJibG9ja3MgZnJvbSAldSwgbGVuZ3RoICVsdSIsIHRhcmdldF9ibG9jaywgbnVtKTsKKwkJCSAgICAiYmxvY2tzIGZyb20gIkUzRlNCTEsiLCBsZW5ndGggJWx1IiwKKwkJCSAgICAgcmV0X2Jsb2NrLCBudW0pOwogCiAJcGVyZm9ybWVkX2FsbG9jYXRpb24gPSAxOwogCkBAIC0xMzgwLDcgKzEzODYsNyBAQAogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRlYnVnX2JoOwogCiAJCS8qIFJlY29yZCBiaXRtYXAgYnVmZmVyIHN0YXRlIGluIHRoZSBuZXdseSBhbGxvY2F0ZWQgYmxvY2sgKi8KLQkJZGVidWdfYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgdGFyZ2V0X2Jsb2NrKTsKKwkJZGVidWdfYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgcmV0X2Jsb2NrKTsKIAkJaWYgKGRlYnVnX2JoKSB7CiAJCQlCVUZGRVJfVFJBQ0UoZGVidWdfYmgsICJzdGF0ZSB3aGVuIGFsbG9jYXRlZCIpOwogCQkJQlVGRkVSX1RSQUNFMihkZWJ1Z19iaCwgYml0bWFwX2JoLCAiYml0bWFwIHN0YXRlIik7CkBAIC0xMzkzLDI0ICsxMzk5LDIxIEBACiAJCWludCBpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJaWYgKGV4dDNfdGVzdF9iaXQocmV0X2Jsb2NrLAorCQkJaWYgKGV4dDNfdGVzdF9iaXQoZ3JwX2FsbG9jX2JsaytpLAogCQkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhKSkgewogCQkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKIAkJCQkJImJfY29tbWl0dGVkX2RhdGFcbiIsIF9fRlVOQ1RJT05fXyk7CiAJCQl9CiAJCX0KIAl9Ci0JZXh0M19kZWJ1ZygiZm91bmQgYml0ICVkXG4iLCByZXRfYmxvY2spOworCWV4dDNfZGVidWcoImZvdW5kIGJpdCAlZFxuIiwgZ3JwX2FsbG9jX2Jsayk7CiAJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOwogCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKICNlbmRpZgogCi0JLyogcmV0X2Jsb2NrIHdhcyBibG9ja2dyb3VwLXJlbGF0aXZlLiAgTm93IGl0IGJlY29tZXMgZnMtcmVsYXRpdmUgKi8KLQlyZXRfYmxvY2sgPSB0YXJnZXRfYmxvY2s7Ci0KIAlpZiAocmV0X2Jsb2NrICsgbnVtIC0gMSA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CiAJCWV4dDNfZXJyb3Ioc2IsICJleHQzX25ld19ibG9jayIsCi0JCQkgICAgImJsb2NrKCVkKSA+PSBibG9ja3MgY291bnQoJWQpIC0gIgorCQkJICAgICJibG9jaygiRTNGU0JMSyIpID49IGJsb2NrcyBjb3VudCglZCkgLSAiCiAJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGVzID09ICVwICIsIHJldF9ibG9jaywKIAkJCWxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCksIGdyb3VwX25vLCBlcyk7CiAJCWdvdG8gb3V0OwpAQCAtMTQyMSw3ICsxNDI0LDcgQEAKIAkgKiBsaXN0IG9mIHNvbWUgZGVzY3JpcHRpb24uICBXZSBkb24ndCBrbm93IGluIGFkdmFuY2Ugd2hldGhlcgogCSAqIHRoZSBjYWxsZXIgd2FudHMgdG8gdXNlIGl0IGFzIG1ldGFkYXRhIG9yIGRhdGEuCiAJICovCi0JZXh0M19kZWJ1ZygiYWxsb2NhdGluZyBibG9jayAlZC4gR29hbCBoaXRzICVkIG9mICVkLlxuIiwKKwlleHQzX2RlYnVnKCJhbGxvY2F0aW5nIGJsb2NrICVsdS4gR29hbCBoaXRzICVkIG9mICVkLlxuIiwKIAkJCXJldF9ibG9jaywgZ29hbF9oaXRzLCBnb2FsX2F0dGVtcHRzKTsKIAogCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CkBAIC0xNDYxLDIzICsxNDY0LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBleHQzX25ld19ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJdW5zaWduZWQgbG9uZyBnb2FsLCBpbnQgKmVycnApCitleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2soaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDNfZnNibGtfdCBnb2FsLCBpbnQgKmVycnApCiB7CiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDE7CiAKIAlyZXR1cm4gZXh0M19uZXdfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZjb3VudCwgZXJycCk7CiB9CiAKLXVuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorZXh0M19mc2Jsa190IGV4dDNfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQl1bnNpZ25lZCBsb25nIGRlc2NfY291bnQ7CisJZXh0M19mc2Jsa190IGRlc2NfY291bnQ7CiAJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbmdyb3VwcyA9IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsKICNpZmRlZiBFWFQzRlNfREVCVUcKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7Ci0JdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQsIHg7CisJZXh0M19mc2Jsa190IGJpdG1hcF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwogCiAJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKQEAgLTE1MDIsOCArMTUwNiwxMCBAQAogCQliaXRtYXBfY291bnQgKz0geDsKIAl9CiAJYnJlbHNlKGJpdG1hcF9iaCk7Ci0JcHJpbnRrKCJleHQzX2NvdW50X2ZyZWVfYmxvY2tzOiBzdG9yZWQgPSAldSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKLQkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLCBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXByaW50aygiZXh0M19jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gIkUzRlNCTEsKKwkJIiwgY29tcHV0ZWQgPSAiRTNGU0JMSyIsICJFM0ZTQkxLIlxuIiwKKwkgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOwogCXJldHVybiBiaXRtYXBfY291bnQ7CiAjZWxzZQogCWRlc2NfY291bnQgPSAwOwpAQCAtMTUyMCw3ICsxNTI2LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWJsb2NrX2luX3VzZSh1bnNpZ25lZCBsb25nIGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCitibG9ja19pbl91c2UoZXh0M19mc2Jsa190IGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCiB7CiAJcmV0dXJuIGV4dDNfdGVzdF9iaXQgKChibG9jayAtCiAJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCmRpZmYgLS1naXQgYS9mcy9leHQzL2lhbGxvYy5jIGIvZnMvZXh0My9pYWxsb2MuYwppbmRleCBkYzgyNjQ2Li4zNjU0NmVkIDEwMDY0NAotLS0gYS9mcy9leHQzL2lhbGxvYy5jCisrKyBiL2ZzL2V4dDMvaWFsbG9jLmMKQEAgLTI2Miw5ICsyNjIsMTEgQEAKIAlpbnQgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CiAJaW50IGlub2Rlc19wZXJfZ3JvdXAgPSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOwogCWludCBmcmVlaSwgYXZlZnJlZWk7Ci0JaW50IGZyZWViLCBhdmVmcmVlYjsKLQlpbnQgYmxvY2tzX3Blcl9kaXIsIG5kaXJzOwotCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9ibG9ja3MsIG1pbl9pbm9kZXM7CisJZXh0M19mc2Jsa190IGZyZWViLCBhdmVmcmVlYjsKKwlleHQzX2ZzYmxrX3QgYmxvY2tzX3Blcl9kaXI7CisJaW50IG5kaXJzOworCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9pbm9kZXM7CisJZXh0M19ncnBibGtfdCBtaW5fYmxvY2tzOwogCWludCBncm91cCA9IC0xLCBpOwogCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKmRlc2M7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKQEAgLTMwNyw3ICszMDksNyBAQAogCW1pbl9pbm9kZXMgPSBhdmVmcmVlaSAtIGlub2Rlc19wZXJfZ3JvdXAgLyA0OwogCW1pbl9ibG9ja3MgPSBhdmVmcmVlYiAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyA0OwogCi0JbWF4X2RlYnQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC8gbWF4KGJsb2Nrc19wZXJfZGlyLCBCTE9DS19DT1NUKTsKKwltYXhfZGVidCA9IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyBtYXgoYmxvY2tzX3Blcl9kaXIsIChleHQzX2ZzYmxrX3QpQkxPQ0tfQ09TVCk7CiAJaWYgKG1heF9kZWJ0ICogSU5PREVfQ09TVCA+IGlub2Rlc19wZXJfZ3JvdXApCiAJCW1heF9kZWJ0ID0gaW5vZGVzX3Blcl9ncm91cCAvIElOT0RFX0NPU1Q7CiAJaWYgKG1heF9kZWJ0ID4gMjU1KQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pbm9kZS5jIGIvZnMvZXh0My9pbm9kZS5jCmluZGV4IDJlZGQ3ZWUuLjAzMjFlMWIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW5vZGUuYworKysgYi9mcy9leHQzL2lub2RlLmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqIHN0aWxsIG5lZWRzIHRvIGJlIHJldm9rZWQuCiAgKi8KIGludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgYmxvY2tucikKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDNfZnNibGtfdCBibG9ja25yKQogewogCWludCBlcnI7CiAKQEAgLTQwNywxMyArNDA3LDEzIEBACiAgKgogICoJQ2FsbGVyIG11c3QgbWFrZSBzdXJlIHRoYXQgQGluZCBpcyB2YWxpZCBhbmQgd2lsbCBzdGF5IHRoYXQgd2F5LgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQogewogCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKIAlfX2xlMzIgKnN0YXJ0ID0gaW5kLT5iaCA/IChfX2xlMzIqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOwogCV9fbGUzMiAqcDsKLQl1bnNpZ25lZCBsb25nIGJnX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgY29sb3VyOworCWV4dDNfZnNibGtfdCBiZ19zdGFydDsKKwlleHQzX2dycGJsa190IGNvbG91cjsKIAogCS8qIFRyeSB0byBmaW5kIHByZXZpb3VzIGJsb2NrICovCiAJZm9yIChwID0gaW5kLT5wIC0gMTsgcCA+PSBzdGFydDsgcC0tKSB7CkBAIC00MjksOCArNDI5LDcgQEAKIAkgKiBJdCBpcyBnb2luZyB0byBiZSByZWZlcnJlZCB0byBmcm9tIHRoZSBpbm9kZSBpdHNlbGY/IE9LLCBqdXN0IHB1dCBpdAogCSAqIGludG8gdGhlIHNhbWUgY3lsaW5kZXIgZ3JvdXAgdGhlbi4KIAkgKi8KLQliZ19zdGFydCA9IChlaS0+aV9ibG9ja19ncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikpICsKLQkJbGUzMl90b19jcHUoRVhUM19TQihpbm9kZS0+aV9zYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJYmdfc3RhcnQgPSBleHQzX2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBlaS0+aV9ibG9ja19ncm91cCk7CiAJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCiAJCQkoRVhUM19CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKIAlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXI7CkBAIC00NDgsNyArNDQ3LDcgQEAKICAqCXN0b3JlcyBpdCBpbiAqQGdvYWwgYW5kIHJldHVybnMgemVyby4KICAqLwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2ZpbmRfZ29hbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAogCQlJbmRpcmVjdCBjaGFpbls0XSwgSW5kaXJlY3QgKnBhcnRpYWwpCiB7CiAJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKQEAgLTUxNiwxMyArNTE1LDEzIEBACiAgKgkJZGlyZWN0IGJsb2NrcwogICovCiBzdGF0aWMgaW50IGV4dDNfYWxsb2NfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQl1bnNpZ25lZCBsb25nIGdvYWwsIGludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKLQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKKwkJCWV4dDNfZnNibGtfdCBnb2FsLCBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCisJCQlleHQzX2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XSwgaW50ICplcnIpCiB7CiAJaW50IHRhcmdldCwgaTsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKIAlpbnQgaW5kZXggPSAwOwotCXVuc2lnbmVkIGxvbmcgY3VycmVudF9ibG9jayA9IDA7CisJZXh0M19mc2Jsa190IGN1cnJlbnRfYmxvY2sgPSAwOwogCWludCByZXQgPSAwOwogCiAJLyoKQEAgLTU5Miw3ICs1OTEsNyBAQAogICoJYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCByZXR1cm4gMC4KICAqLwogc3RhdGljIGludCBleHQzX2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJaW50IGluZGlyZWN0X2Jsa3MsIGludCAqYmxrcywgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJaW50IGluZGlyZWN0X2Jsa3MsIGludCAqYmxrcywgZXh0M19mc2Jsa190IGdvYWwsCiAJCQlpbnQgKm9mZnNldHMsIEluZGlyZWN0ICpicmFuY2gpCiB7CiAJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKQEAgLTYwMCw4ICs1OTksOCBAQAogCWludCBlcnIgPSAwOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IG51bTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbmV3X2Jsb2Nrc1s0XTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgY3VycmVudF9ibG9jazsKKwlleHQzX2ZzYmxrX3QgbmV3X2Jsb2Nrc1s0XTsKKwlleHQzX2ZzYmxrX3QgY3VycmVudF9ibG9jazsKIAogCW51bSA9IGV4dDNfYWxsb2NfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsIGluZGlyZWN0X2Jsa3MsCiAJCQkJKmJsa3MsIG5ld19ibG9ja3MsICZlcnIpOwpAQCAtNjg4LDcgKzY4Nyw3IEBACiAJaW50IGk7CiAJaW50IGVyciA9IDA7CiAJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaTsKLQl1bnNpZ25lZCBsb25nIGN1cnJlbnRfYmxvY2s7CisJZXh0M19mc2Jsa190IGN1cnJlbnRfYmxvY2s7CiAKIAlibG9ja19pID0gRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOwogCS8qCkBAIC03OTUsMTMgKzc5NCwxMyBAQAogCWludCBvZmZzZXRzWzRdOwogCUluZGlyZWN0IGNoYWluWzRdOwogCUluZGlyZWN0ICpwYXJ0aWFsOwotCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwlleHQzX2ZzYmxrX3QgZ29hbDsKIAlpbnQgaW5kaXJlY3RfYmxrczsKIAlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5ID0gMDsKIAlpbnQgZGVwdGg7CiAJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOwogCWludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmaXJzdF9ibG9jayA9IDA7CisJZXh0M19mc2Jsa190IGZpcnN0X2Jsb2NrID0gMDsKIAogCiAJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOwpAQCAtODE5LDcgKzgxOCw3IEBACiAJCWNvdW50Kys7CiAJCS8qbWFwIG1vcmUgYmxvY2tzKi8KIAkJd2hpbGUgKGNvdW50IDwgbWF4YmxvY2tzICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSkgewotCQkJdW5zaWduZWQgbG9uZyBibGs7CisJCQlleHQzX2ZzYmxrX3QgYmxrOwogCiAJCQlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKIAkJCQkvKgpAQCAtMTc1OSw3ICsxNzU4LDcgQEAKIHN0YXRpYyBpbnQgZXh0M19ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAogCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCiB7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlleHQzX2ZzYmxrX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJdW5zaWduZWQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CiAJdW5zaWduZWQgYmxvY2tzaXplLCBpYmxvY2ssIGxlbmd0aCwgcG9zOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwpAQCAtMTk2MCw3ICsxOTU5LDcgQEAKICAqIHRoYW4gYGNvdW50JyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBob2xlcyBpbiB0aGVyZS4KICAqLwogc3RhdGljIHZvaWQgZXh0M19jbGVhcl9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgbG9uZyBibG9ja190b19mcmVlLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBleHQzX2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSwKIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQogewogCV9fbGUzMiAqcDsKQEAgLTIwMjIsMTIgKzIwMjEsMTIgQEAKIAkJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdGhpc19iaCwKIAkJCSAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCkKIHsKLQl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCisJZXh0M19mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8gCiAJX19sZTMyICpibG9ja190b19mcmVlX3AgPSBOVUxMOwkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAogCQkJCQkgICAgICAgY29ycmVzcG9uZGluZyB0bwogCQkJCQkgICAgICAgYmxvY2tfdG9fZnJlZSAqLwotCXVuc2lnbmVkIGxvbmcgbnI7CQkgICAgLyogQ3VycmVudCBibG9jayAjICovCisJZXh0M19mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLwogCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAogCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KIAlpbnQgZXJyOwpAQCAtMjA4OSw3ICsyMDg4LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKIAkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKIHsKLQl1bnNpZ25lZCBsb25nIG5yOworCWV4dDNfZnNibGtfdCBucjsKIAlfX2xlMzIgKnA7CiAKIAlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKQEAgLTIxMTMsNyArMjExMiw3IEBACiAJCQkgKi8KIAkJCWlmICghYmgpIHsKIAkJCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0M19mcmVlX2JyYW5jaGVzIiwKLQkJCQkJICAgIlJlYWQgZmFpbHVyZSwgaW5vZGU9JWxkLCBibG9jaz0lbGQiLAorCQkJCQkgICAiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbGQsIGJsb2NrPSJFM0ZTQkxLLAogCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTIzOTQsMTEgKzIzOTMsMTIgQEAKIAlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2dldF9pbm9kZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorc3RhdGljIGV4dDNfZnNibGtfdCBleHQzX2dldF9pbm9kZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQl1bnNpZ25lZCBsb25nIGlubywgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKIHsKIAl1bnNpZ25lZCBsb25nIGRlc2MsIGdyb3VwX2Rlc2MsIGJsb2NrX2dyb3VwOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBibG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlleHQzX2ZzYmxrX3QgYmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOwogCkBAIC0yNDQ4LDcgKzI0NDgsNyBAQAogc3RhdGljIGludCBfX2V4dDNfZ2V0X2lub2RlX2xvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCXN0cnVjdCBleHQzX2lsb2MgKmlsb2MsIGludCBpbl9tZW0pCiB7Ci0JdW5zaWduZWQgbG9uZyBibG9jazsKKwlleHQzX2ZzYmxrX3QgYmxvY2s7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKIAogCWJsb2NrID0gZXh0M19nZXRfaW5vZGVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgaWxvYyk7CkBAIC0yNDU5LDcgKzI0NTksOCBAQAogCWlmICghYmgpIHsKIAkJZXh0M19lcnJvciAoaW5vZGUtPmlfc2IsICJleHQzX2dldF9pbm9kZV9sb2MiLAogCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKLQkJCQkiaW5vZGU9JWx1LCBibG9jaz0lbHUiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJCQkiaW5vZGU9JWx1LCBibG9jaz0iRTNGU0JMSywKKwkJCQkgaW5vZGUtPmlfaW5vLCBibG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KIAlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKQEAgLTI1NDAsNyArMjU0MSw3IEBACiAJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgewogCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgImV4dDNfZ2V0X2lub2RlX2xvYyIsCiAJCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKLQkJCQkJImlub2RlPSVsdSwgYmxvY2s9JWx1IiwKKwkJCQkJImlub2RlPSVsdSwgYmxvY2s9IkUzRlNCTEssCiAJCQkJCWlub2RlLT5pX2lubywgYmxvY2spOwogCQkJYnJlbHNlKGJoKTsKIAkJCXJldHVybiAtRUlPOwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9pb2N0bC5jIGIvZnMvZXh0My9pb2N0bC5jCmluZGV4IDhjMjJhYTkuLjNhNmIwMTIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvaW9jdGwuYworKysgYi9mcy9leHQzL2lvY3RsLmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAJY2FzZSBFWFQzX0lPQ19HUk9VUF9FWFRFTkQ6IHsKLQkJdW5zaWduZWQgbG9uZyBuX2Jsb2Nrc19jb3VudDsKKwkJZXh0M19mc2Jsa190IG5fYmxvY2tzX2NvdW50OwogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnI7CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvbmFtZWkuYyBiL2ZzL2V4dDMvbmFtZWkuYwppbmRleCBiOGY1Y2QxLi5kOTE3NmRiIDEwMDY0NAotLS0gYS9mcy9leHQzL25hbWVpLmMKKysrIGIvZnMvZXh0My9uYW1laS5jCkBAIC0xMzc5LDcgKzEzNzksNiBAQAogCWludAlkeF9mYWxsYmFjaz0wOwogI2VuZGlmCiAJdW5zaWduZWQgYmxvY2tzaXplOwotCXVuc2lnbmVkIG5sZW4sIHJsZW47CiAJdTMyIGJsb2NrLCBibG9ja3M7CiAKIAlzYiA9IGRpci0+aV9zYjsKQEAgLTE0MTcsOCArMTQxNiw3IEBACiAJCXJldHVybiByZXR2YWw7CiAJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKIAlkZS0+aW5vZGUgPSAwOwotCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmxlbiA9IGJsb2Nrc2l6ZSk7Ci0JbmxlbiA9IDA7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihibG9ja3NpemUpOwogCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvcmVzaXplLmMgYi9mcy9leHQzL3Jlc2l6ZS5jCmluZGV4IDM0YjM5ZTkuLmRmZDgxMTggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvcmVzaXplLmMKKysrIGIvZnMvZXh0My9yZXNpemUuYwpAQCAtMjgsMTYgKzI4LDE2IEBACiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCXVuc2lnbmVkIHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKLQl1bnNpZ25lZCBlbmQgPSBzdGFydCArIGlucHV0LT5ibG9ja3NfY291bnQ7CisJZXh0M19mc2Jsa190IHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKKwlleHQzX2ZzYmxrX3QgZW5kID0gc3RhcnQgKyBpbnB1dC0+YmxvY2tzX2NvdW50OwogCXVuc2lnbmVkIGdyb3VwID0gaW5wdXQtPmdyb3VwOwotCXVuc2lnbmVkIGl0ZW5kID0gaW5wdXQtPmlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7CisJZXh0M19mc2Jsa190IGl0ZW5kID0gaW5wdXQtPmlub2RlX3RhYmxlICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXA7CiAJdW5zaWduZWQgb3ZlcmhlYWQgPSBleHQzX2JnX2hhc19zdXBlcihzYiwgZ3JvdXApID8KIAkJKDEgKyBleHQzX2JnX251bV9nZGIoc2IsIGdyb3VwKSArCiAJCSBsZTE2X3RvX2NwdShlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSkgOiAwOwotCXVuc2lnbmVkIG1ldGFlbmQgPSBzdGFydCArIG92ZXJoZWFkOworCWV4dDNfZnNibGtfdCBtZXRhZW5kID0gc3RhcnQgKyBvdmVyaGVhZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKLQlpbnQgZnJlZV9ibG9ja3NfY291bnQ7CisJZXh0M19ncnBibGtfdCBmcmVlX2Jsb2Nrc19jb3VudDsKIAlpbnQgZXJyID0gLUVJTlZBTDsKIAogCWlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCA9IGZyZWVfYmxvY2tzX2NvdW50ID0KQEAgLTY0LDcgKzY0LDggQEAKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJCYWQgYmxvY2tzIGNvdW50ICV1IiwKIAkJCSAgICAgaW5wdXQtPmJsb2Nrc19jb3VudCk7CiAJZWxzZSBpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBlbmQgLSAxKSkpCi0JCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiQ2Fubm90IHJlYWQgbGFzdCBibG9jayAoJXUpIiwKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJDYW5ub3QgcmVhZCBsYXN0IGJsb2NrICgiRTNGU0JMSyIpIiwKIAkJCSAgICAgZW5kIC0gMSk7CiAJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+YmxvY2tfYml0bWFwLCBzdGFydCwgZW5kKSkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCkBAIC03Nyw3ICs3OCw3IEBACiAJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+aW5vZGVfdGFibGUsIHN0YXJ0LCBlbmQpIHx8CiAJICAgICAgICAgb3V0c2lkZShpdGVuZCAtIDEsIHN0YXJ0LCBlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIklub2RlIHRhYmxlIG5vdCBpbiBncm91cCAoYmxvY2tzICV1LSV1KSIsCisJCQkgICAgICJJbm9kZSB0YWJsZSBub3QgaW4gZ3JvdXAgKGJsb2NrcyAldS0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOwogCWVsc2UgaWYgKGlucHV0LT5pbm9kZV9iaXRtYXAgPT0gaW5wdXQtPmJsb2NrX2JpdG1hcCkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCkBAIC04NSwyNCArODYsMjcgQEAKIAkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIGlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIGlub2RlIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiQmxvY2sgYml0bWFwICgldSkgaW4gaW5vZGUgdGFibGUgKCV1LSJFM0ZTQkxLIikiLAogCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kLTEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKIAkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAgICJJbm9kZSBiaXRtYXAgKCV1KSBpbiBpbm9kZSB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgIklub2RlIGJpdG1hcCAoJXUpIGluIGlub2RlIHRhYmxlICgldS0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZC0xKTsKIAllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIEdEVCB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgIkJsb2NrIGJpdG1hcCAoJXUpIGluIEdEVCB0YWJsZSIKKwkJCSAgICAgIiAoIkUzRlNCTEsiLSJFM0ZTQkxLIikiLAogCQkJICAgICBpbnB1dC0+YmxvY2tfYml0bWFwLCBzdGFydCwgbWV0YWVuZCAtIDEpOwogCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgbWV0YWVuZCkpCiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gR0RUIHRhYmxlIgorCQkJICAgICAiICgiRTNGU0JMSyItIkUzRlNCTEsiKSIsCiAJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIG1ldGFlbmQpIHx8CiAJICAgICAgICAgaW5zaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQpKQogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIklub2RlIHRhYmxlICgldS0ldSkgb3ZlcmxhcHMgR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICAiSW5vZGUgdGFibGUgKCV1LSJFM0ZTQkxLIikgb3ZlcmxhcHMiCisJCQkgICAgICJHRFQgdGFibGUgKCJFM0ZTQkxLIi0iRTNGU0JMSyIpIiwKIAkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CiAJZWxzZQogCQllcnIgPSAwOwpAQCAtMTEyLDcgKzExNiw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJjbGVhbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCSAgdW5zaWduZWQgbG9uZyBibGspCisJCQkJICBleHQzX2ZzYmxrX3QgYmxrKQogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaW50IGVycjsKQEAgLTE2MywxNSArMTY3LDE0IEBACiAJCQkJICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7Ci0JdW5zaWduZWQgbG9uZyBzdGFydCA9IGlucHV0LT5ncm91cCAqIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwICsKLQkJbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWV4dDNfZnNibGtfdCBzdGFydCA9IGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGlucHV0LT5ncm91cCk7CiAJaW50IHJlc2VydmVkX2dkYiA9IGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpbnB1dC0+Z3JvdXApID8KIAkJbGUxNl90b19jcHUoc2JpLT5zX2VzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIDogMDsKIAl1bnNpZ25lZCBsb25nIGdkYmxvY2tzID0gZXh0M19iZ19udW1fZ2RiKHNiLCBpbnB1dC0+Z3JvdXApOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQl1bnNpZ25lZCBsb25nIGJsb2NrOwotCWludCBiaXQ7CisJZXh0M19mc2Jsa190IGJsb2NrOworCWV4dDNfZ3JwYmxrX3QgYml0OwogCWludCBpOwogCWludCBlcnIgPSAwLCBlcnIyOwogCkBAIC0zMjgsNyArMzMxLDcgQEAKIHN0YXRpYyBpbnQgdmVyaWZ5X3Jlc2VydmVkX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcHJpbWFyeSkKIHsKLQljb25zdCB1bnNpZ25lZCBsb25nIGJsayA9IHByaW1hcnktPmJfYmxvY2tucjsKKwljb25zdCBleHQzX2ZzYmxrX3QgYmxrID0gcHJpbWFyeS0+Yl9ibG9ja25yOwogCWNvbnN0IHVuc2lnbmVkIGxvbmcgZW5kID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OwogCXVuc2lnbmVkIHRocmVlID0gMTsKIAl1bnNpZ25lZCBmaXZlID0gNTsKQEAgLTM0MCw3ICszNDMsOCBAQAogCXdoaWxlICgoZ3JwID0gZXh0M19saXN0X2JhY2t1cHMoc2IsICZ0aHJlZSwgJmZpdmUsICZzZXZlbikpIDwgZW5kKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqcCsrKSAhPSBncnAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpICsgYmxrKXsKIAkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJCSAgICAgInJlc2VydmVkIEdEVCAlbGQgbWlzc2luZyBncnAgJWQgKCVsZCkiLAorCQkJCSAgICAgInJlc2VydmVkIEdEVCAiRTNGU0JMSworCQkJCSAgICAgIiBtaXNzaW5nIGdycCAlZCAoIkUzRlNCTEsiKSIsCiAJCQkJICAgICBibGssIGdycCwKIAkJCQkgICAgIGdycCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgKyBibGspOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zNzIsNyArMzc2LDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CiAJdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUM19ERVNDX1BFUl9CTE9DSyhzYik7Ci0JdW5zaWduZWQgbG9uZyBnZGJsb2NrID0gRVhUM19TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIgKyAxICsgZ2RiX251bTsKKwlleHQzX2ZzYmxrX3QgZ2RibG9jayA9IEVYVDNfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIGdkYl9udW07CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb19ncm91cF9kZXNjLCAqKm5fZ3JvdXBfZGVzYzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CiAJaW50IGdkYmFja3VwczsKQEAgLTQxNyw3ICs0MjEsNyBAQAogCWRhdGEgPSAoX191MzIgKilkaW5kLT5iX2RhdGE7CiAJaWYgKGxlMzJfdG9fY3B1KGRhdGFbZ2RiX251bSAlIEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpXSkgIT0gZ2RibG9jaykgewogCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICAgIm5ldyBncm91cCAldSBHRFQgYmxvY2sgJWx1IG5vdCByZXNlcnZlZCIsCisJCQkgICAgICJuZXcgZ3JvdXAgJXUgR0RUIGJsb2NrICJFM0ZTQkxLIiBub3QgcmVzZXJ2ZWQiLAogCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGV4aXRfZGluZDsKQEAgLTUxNSw3ICs1MTksNyBAQAogCXN0cnVjdCBidWZmZXJfaGVhZCAqKnByaW1hcnk7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOwogCXN0cnVjdCBleHQzX2lsb2MgaWxvYzsKLQl1bnNpZ25lZCBsb25nIGJsazsKKwlleHQzX2ZzYmxrX3QgYmxrOwogCV9fdTMyICpkYXRhLCAqZW5kOwogCWludCBnZGJhY2t1cHMgPSAwOwogCWludCByZXMsIGk7CkBAIC01NDAsNyArNTQ0LDggQEAKIAlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CiAJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CiAJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKLQkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbHUgbm90IGF0IG9mZnNldCAlbGQiLAorCQkJCSAgICAgInJlc2VydmVkIGJsb2NrICJFM0ZTQkxLCisJCQkJICAgICAiIG5vdCBhdCBvZmZzZXQgJWxkIiwKIAkJCQkgICAgIGJsaywgKGxvbmcpKGRhdGEgLSAoX191MzIgKilkaW5kLT5iX2RhdGEpKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXRfYmg7CkBAIC05MDIsMTUgKzkwNywxNiBAQAogICogR0RUIGJsb2NrcyBhcmUgcmVzZXJ2ZWQgdG8gZ3JvdyB0byB0aGUgZGVzaXJlZCBzaXplLgogICovCiBpbnQgZXh0M19ncm91cF9leHRlbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzLAotCQkgICAgICB1bnNpZ25lZCBsb25nIG5fYmxvY2tzX2NvdW50KQorCQkgICAgICBleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvX2Jsb2Nrc19jb3VudDsKKwlleHQzX2ZzYmxrX3Qgb19ibG9ja3NfY291bnQ7CiAJdW5zaWduZWQgbG9uZyBvX2dyb3Vwc19jb3VudDsKLQl1bnNpZ25lZCBsb25nIGxhc3Q7Ci0JaW50IGFkZDsKKwlleHQzX2dycGJsa190IGxhc3Q7CisJZXh0M19ncnBibGtfdCBhZGQ7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAJaGFuZGxlX3QgKmhhbmRsZTsKLQlpbnQgZXJyLCBmcmVlZF9ibG9ja3M7CisJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZyZWVkX2Jsb2NrczsKIAogCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAogCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKQEAgLTkxOSwxMiArOTI1LDIyIEBACiAJb19ncm91cHNfY291bnQgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDMtZnM6IGV4dGVuZGluZyBsYXN0IGdyb3VwIGZyb20gJWx1IHRvICVsdSBibG9ja3NcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQzLWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICJFM0ZTQkxLIiB1dG8gIkUzRlNCTEsiIGJsb2Nrc1xuIiwKIAkJICAgICAgIG9fYmxvY2tzX2NvdW50LCBuX2Jsb2Nrc19jb3VudCk7CiAKIAlpZiAobl9ibG9ja3NfY291bnQgPT0gMCB8fCBuX2Jsb2Nrc19jb3VudCA9PSBvX2Jsb2Nrc19jb3VudCkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobl9ibG9ja3NfY291bnQgPiAoc2VjdG9yX3QpKH4wVUxMKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZpbGVzeXN0ZW0gb24gJXM6IgorCQkJIiB0b28gbGFyZ2UgdG8gcmVzaXplIHRvICVsdSBibG9ja3Mgc2FmZWx5XG4iLAorCQkJc2ItPnNfaWQsIG5fYmxvY2tzX2NvdW50KTsKKwkJaWYgKHNpemVvZihzZWN0b3JfdCkgPCA4KQorCQkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkiQ09ORklHX0xCRCBub3QgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWlmIChuX2Jsb2Nrc19jb3VudCA8IG9fYmxvY2tzX2NvdW50KSB7CiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAogCQkJICAgICAiY2FuJ3Qgc2hyaW5rIEZTIC0gcmVzaXplIGFib3J0ZWQiKTsKQEAgLTk0OCw3ICs5NjQsOCBAQAogCiAJaWYgKG9fYmxvY2tzX2NvdW50ICsgYWRkIDwgbl9ibG9ja3NfY291bnQpCiAJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAotCQkJICAgICAid2lsbCBvbmx5IGZpbmlzaCBncm91cCAoJWx1IGJsb2NrcywgJXUgbmV3KSIsCisJCQkgICAgICJ3aWxsIG9ubHkgZmluaXNoIGdyb3VwICgiRTNGU0JMSworCQkJICAgICAiIGJsb2NrcywgJXUgbmV3KSIsCiAJCQkgICAgIG9fYmxvY2tzX2NvdW50ICsgYWRkLCBhZGQpOwogCiAJLyogU2VlIGlmIHRoZSBkZXZpY2UgaXMgYWN0dWFsbHkgYXMgYmlnIGFzIHdoYXQgd2FzIHJlcXVlc3RlZCAqLwpAQCAtOTkxLDEwICsxMDA4LDEwIEBACiAJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKIAlzYi0+c19kaXJ0ID0gMTsKIAl1bmxvY2tfc3VwZXIoc2IpOwotCWV4dDNfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJZXh0M19kZWJ1ZygiZnJlZWluZyBibG9ja3MgJWx1IHRocm91Z2ggIkUzRlNCTEsiXG4iLCBvX2Jsb2Nrc19jb3VudCwKIAkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOwogCWV4dDNfZnJlZV9ibG9ja3Nfc2IoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCwgJmZyZWVkX2Jsb2Nrcyk7Ci0JZXh0M19kZWJ1ZygiZnJlZWQgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJZXh0M19kZWJ1ZygiZnJlZWQgYmxvY2tzICJFM0ZTQkxLIiB0aHJvdWdoICJFM0ZTQkxLIlxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSkpKQogCQlnb3RvIGV4aXRfcHV0OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9zdXBlci5jIGIvZnMvZXh0My9zdXBlci5jCmluZGV4IGY4YTUyNjYuLmIyODkxY2MgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDMvc3VwZXIuYworKysgYi9mcy9leHQzL3N1cGVyLmMKQEAgLTU4LDcgKzU4LDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICpleHQzX2RlY29kZV9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50IGVycm5vLAogCQkJCSAgICAgY2hhciBuYnVmWzE2XSk7CiBzdGF0aWMgaW50IGV4dDNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7Ci1zdGF0aWMgaW50IGV4dDNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGtzdGF0ZnMgKiBidWYpOworc3RhdGljIGludCBleHQzX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKiBidWYpOwogc3RhdGljIHZvaWQgZXh0M191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHN0YXRpYyB2b2lkIGV4dDNfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKTsKIHN0YXRpYyB2b2lkIGV4dDNfd3JpdGVfc3VwZXJfbG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtNDk5LDIwICs0OTksMjEgQEAKIHsKIAlzdHJ1Y3QgZXh0M19ibG9ja19hbGxvY19pbmZvICpyc3YgPSBFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm87CiAjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCi0gICAgICAgaWYgKEVYVDNfSShpbm9kZSktPmlfYWNsICYmCi0gICAgICAgICAgIEVYVDNfSShpbm9kZSktPmlfYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpIHsKLSAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlKEVYVDNfSShpbm9kZSktPmlfYWNsKTsKLSAgICAgICAgICAgICAgIEVYVDNfSShpbm9kZSktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKLSAgICAgICB9Ci0gICAgICAgaWYgKEVYVDNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wgJiYKLSAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCAhPSBFWFQzX0FDTF9OT1RfQ0FDSEVEKSB7Ci0gICAgICAgICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShFWFQzX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsKTsKLSAgICAgICAgICAgICAgIEVYVDNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wgPSBFWFQzX0FDTF9OT1RfQ0FDSEVEOwotICAgICAgIH0KKwlpZiAoRVhUM19JKGlub2RlKS0+aV9hY2wgJiYKKwkJCUVYVDNfSShpbm9kZSktPmlfYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoRVhUM19JKGlub2RlKS0+aV9hY2wpOworCQlFWFQzX0koaW5vZGUpLT5pX2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisJfQorCWlmIChFWFQzX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICYmCisJCQlFWFQzX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCk7CisJCUVYVDNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wgPSBFWFQzX0FDTF9OT1RfQ0FDSEVEOworCX0KICNlbmRpZgogCWV4dDNfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CiAJRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKLQlrZnJlZShyc3YpOworCWlmICh1bmxpa2VseShyc3YpKQorCQlrZnJlZShyc3YpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZXh0M19zaG93X3F1b3RhX29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC02ODgsMTQgKzY4OSwxNSBAQAogCXtPcHRfcmVzaXplLCAicmVzaXplIn0sCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2JfYmxvY2sodm9pZCAqKmRhdGEpCitzdGF0aWMgZXh0M19mc2Jsa190IGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKIHsKLQl1bnNpZ25lZCBsb25nIAlzYl9ibG9jazsKKwlleHQzX2ZzYmxrX3QgCXNiX2Jsb2NrOwogCWNoYXIgCQkqb3B0aW9ucyA9IChjaGFyICopICpkYXRhOwogCiAJaWYgKCFvcHRpb25zIHx8IHN0cm5jbXAob3B0aW9ucywgInNiPSIsIDMpICE9IDApCiAJCXJldHVybiAxOwkvKiBEZWZhdWx0IGxvY2F0aW9uICovCiAJb3B0aW9ucyArPSAzOworCS8qdG9kbzogdXNlIHNpbXBsZV9zdHJ0b2xsIHdpdGggPjMyYml0IGV4dDMgKi8KIAlzYl9ibG9jayA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMsICZvcHRpb25zLCAwKTsKIAlpZiAoKm9wdGlvbnMgJiYgKm9wdGlvbnMgIT0gJywnKSB7CiAJCXByaW50aygiRVhUMy1mczogSW52YWxpZCBzYiBzcGVjaWZpY2F0aW9uOiAlc1xuIiwKQEAgLTcxMCw3ICs3MTIsNyBAQAogCiBzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMgKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgIHVuc2lnbmVkIGxvbmcgKmludW0sIHVuc2lnbmVkIGxvbmcgKmpvdXJuYWxfZGV2bnVtLAotCQkJICB1bnNpZ25lZCBsb25nICpuX2Jsb2Nrc19jb3VudCwgaW50IGlzX3JlbW91bnQpCisJCQkgIGV4dDNfZnNibGtfdCAqbl9ibG9ja3NfY291bnQsIGludCBpc19yZW1vdW50KQogewogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwogCWNoYXIgKiBwOwpAQCAtMTEyNyw3ICsxMTI5LDcgQEAKIHN0YXRpYyBpbnQgZXh0M19jaGVja19kZXNjcmlwdG9ycyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCiB7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7Ci0JdW5zaWduZWQgbG9uZyBibG9jayA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlleHQzX2ZzYmxrX3QgYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CiAJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqIGdkcCA9IE5VTEw7CiAJaW50IGRlc2NfYmxvY2sgPSAwOwogCWludCBpOwpAQCAtMTMxNCwxNSArMTMxNiwxNCBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9naWNfc2JfYmxvY2ssCitzdGF0aWMgZXh0M19mc2Jsa190IGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIGV4dDNfZnNibGtfdCBsb2dpY19zYl9ibG9jaywKIAkJCQkgICAgaW50IG5yKQogewogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgYmcsIGZpcnN0X2RhdGFfYmxvY2ssIGZpcnN0X21ldGFfYmc7CisJdW5zaWduZWQgbG9uZyBiZywgZmlyc3RfbWV0YV9iZzsKIAlpbnQgaGFzX3N1cGVyID0gMDsKIAotCWZpcnN0X2RhdGFfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CiAJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKIAogCWlmICghRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CkBAIC0xMzMxLDcgKzEzMzIsNyBAQAogCWJnID0gc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrICogbnI7CiAJaWYgKGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBiZykpCiAJCWhhc19zdXBlciA9IDE7Ci0JcmV0dXJuIChmaXJzdF9kYXRhX2Jsb2NrICsgaGFzX3N1cGVyICsgKGJnICogc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApKTsKKwlyZXR1cm4gKGhhc19zdXBlciArIGV4dDNfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oc2IsIGJnKSk7CiB9CiAKIApAQCAtMTM0MCw5ICsxMzQxLDkgQEAKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBOVUxMOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaTsKLQl1bnNpZ25lZCBsb25nIGJsb2NrOwotCXVuc2lnbmVkIGxvbmcgc2JfYmxvY2sgPSBnZXRfc2JfYmxvY2soJmRhdGEpOwotCXVuc2lnbmVkIGxvbmcgbG9naWNfc2JfYmxvY2s7CisJZXh0M19mc2Jsa190IGJsb2NrOworCWV4dDNfZnNibGtfdCBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSk7CisJZXh0M19mc2Jsa190IGxvZ2ljX3NiX2Jsb2NrOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKIAl1bnNpZ25lZCBsb25nIGpvdXJuYWxfaW51bSA9IDA7CiAJdW5zaWduZWQgbG9uZyBqb3VybmFsX2Rldm51bSA9IDA7CkBAIC0xNTY0LDYgKzE1NjUsMTYgQEAKIAkJZ290byBmYWlsZWRfbW91bnQ7CiAJfQogCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgPgorCQkgICAgKHNlY3Rvcl90KSh+MFVMTCkgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBmaWxlc3lzdGVtIG9uICVzOiIKKwkJCSIgdG9vIGxhcmdlIHRvIG1vdW50IHNhZmVseVxuIiwgc2ItPnNfaWQpOworCQlpZiAoc2l6ZW9mKHNlY3Rvcl90KSA8IDgpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzOiBDT05GSUdfTEJEIG5vdCAiCisJCQkJCSJlbmFibGVkXG4iKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCiAJaWYgKEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgPT0gMCkKIAkJZ290byBjYW50ZmluZF9leHQzOwogCXNiaS0+c19ncm91cHNfY291bnQgPSAobGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtCkBAIC0xNTc5LDkgKzE1OTAsNiBAQAogCQlnb3RvIGZhaWxlZF9tb3VudDsKIAl9CiAKLQlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKLQlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyKTsKIAliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKSB7CkBAIC0xNTk1LDEyICsxNjAzLDIwIEBACiAJCX0KIAl9CiAJaWYgKCFleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKLQkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkICFcbiIpOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGdyb3VwIGRlc2NyaXB0b3JzIGNvcnJ1cHRlZCFcbiIpOwogCQlnb3RvIGZhaWxlZF9tb3VudDI7CiAJfQogCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKIAlnZXRfcmFuZG9tX2J5dGVzKCZzYmktPnNfbmV4dF9nZW5lcmF0aW9uLCBzaXplb2YodTMyKSk7CiAJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKworCXBlcmNwdV9jb3VudGVyX2luaXQoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCisJCWV4dDNfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyLAorCQlleHQzX2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmc2JpLT5zX2RpcnNfY291bnRlciwKKwkJZXh0M19jb3VudF9kaXJzKHNiKSk7CisKIAkvKiBwZXIgZmlsZXlzdGVtIHJlc2VydmF0aW9uIGxpc3QgaGVhZCAmIGxvY2sgKi8KIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX3Jzdl93aW5kb3dfbG9jayk7CiAJc2JpLT5zX3Jzdl93aW5kb3dfcm9vdCA9IFJCX1JPT1Q7CkBAIC0xNjM5LDE2ICsxNjU1LDE2IEBACiAJaWYgKCF0ZXN0X29wdChzYiwgTk9MT0FEKSAmJgogCSAgICBFWFQzX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKIAkJaWYgKGV4dDNfbG9hZF9qb3VybmFsKHNiLCBlcywgam91cm5hbF9kZXZudW0pKQotCQkJZ290byBmYWlsZWRfbW91bnQyOworCQkJZ290byBmYWlsZWRfbW91bnQzOwogCX0gZWxzZSBpZiAoam91cm5hbF9pbnVtKSB7CiAJCWlmIChleHQzX2NyZWF0ZV9qb3VybmFsKHNiLCBlcywgam91cm5hbF9pbnVtKSkKLQkJCWdvdG8gZmFpbGVkX21vdW50MjsKKwkJCWdvdG8gZmFpbGVkX21vdW50MzsKIAl9IGVsc2UgewogCQlpZiAoIXNpbGVudCkKIAkJCXByaW50ayAoS0VSTl9FUlIKIAkJCQkiZXh0MzogTm8gam91cm5hbCBvbiBmaWxlc3lzdGVtIG9uICVzXG4iLAogCQkJCXNiLT5zX2lkKTsKLQkJZ290byBmYWlsZWRfbW91bnQyOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CiAJfQogCiAJLyogV2UgaGF2ZSBub3cgdXBkYXRlZCB0aGUgam91cm5hbCBpZiByZXF1aXJlZCwgc28gd2UgY2FuCkBAIC0xNjcxLDcgKzE2ODcsNyBAQAogCQkgICAgKHNiaS0+c19qb3VybmFsLCAwLCAwLCBKRlNfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UpKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IEpvdXJuYWwgZG9lcyBub3Qgc3VwcG9ydCAiCiAJCQkgICAgICAgInJlcXVlc3RlZCBkYXRhIGpvdXJuYWxpbmcgbW9kZVxuIik7Ci0JCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJCX0KIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTE2OTQsMTMgKzE3MTAsMTMgQEAKIAlpZiAoIXNiLT5zX3Jvb3QpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOwogCQlpcHV0KHJvb3QpOwotCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJCWdvdG8gZmFpbGVkX21vdW50NDsKIAl9CiAJaWYgKCFTX0lTRElSKHJvb3QtPmlfbW9kZSkgfHwgIXJvb3QtPmlfYmxvY2tzIHx8ICFyb290LT5pX3NpemUpIHsKIAkJZHB1dChzYi0+c19yb290KTsKIAkJc2ItPnNfcm9vdCA9IE5VTEw7CiAJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY29ycnVwdCByb290IGlub2RlLCBydW4gZTJmc2NrXG4iKTsKLQkJZ290byBmYWlsZWRfbW91bnQzOworCQlnb3RvIGZhaWxlZF9tb3VudDQ7CiAJfQogCiAJZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCBzYi0+c19mbGFncyAmIE1TX1JET05MWSk7CkBAIC0xNzIzLDEzICsxNzM5LDYgQEAKIAkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CiAJCSJ3cml0ZWJhY2siKTsKIAotCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKLQkJZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzYikpOwotCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKLQkJZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOwotCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2RpcnNfY291bnRlciwKLQkJZXh0M19jb3VudF9kaXJzKHNiKSk7Ci0KIAlsb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogCkBAIC0xNzM5LDggKzE3NDgsMTIgQEAKIAkJICAgICAgIHNiLT5zX2lkKTsKIAlnb3RvIGZhaWxlZF9tb3VudDsKIAotZmFpbGVkX21vdW50MzoKK2ZhaWxlZF9tb3VudDQ6CiAJam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKK2ZhaWxlZF9tb3VudDM6CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CiBmYWlsZWRfbW91bnQyOgogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQogCQlicmVsc2Uoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pOwpAQCAtMTgyNywxMCArMTg0MCwxMCBAQAogewogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwogCWpvdXJuYWxfdCAqam91cm5hbDsKLQlpbnQgc3RhcnQ7Ci0JaW50IGxlbjsKKwlleHQzX2ZzYmxrX3Qgc3RhcnQ7CisJZXh0M19mc2Jsa190IGxlbjsKIAlpbnQgaGJsb2NrLCBibG9ja3NpemU7Ci0JdW5zaWduZWQgbG9uZyBzYl9ibG9jazsKKwlleHQzX2ZzYmxrX3Qgc2JfYmxvY2s7CiAJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwpAQCAtMjIwMyw3ICsyMjE2LDcgQEAKIHsKIAlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOwogCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOwotCXVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQgPSAwOworCWV4dDNfZnNibGtfdCBuX2Jsb2Nrc19jb3VudCA9IDA7CiAJdW5zaWduZWQgbG9uZyBvbGRfc2JfZmxhZ3M7CiAJc3RydWN0IGV4dDNfbW91bnRfb3B0aW9ucyBvbGRfb3B0czsKIAlpbnQgZXJyOwpAQCAtMjMxOCwxMSArMjMzMSwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZXh0M19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1ZikKK3N0YXRpYyBpbnQgZXh0M19zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBrc3RhdGZzICogYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CiAJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOwotCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7CisJZXh0M19mc2Jsa190IG92ZXJoZWFkOwogCWludCBpOwogCiAJaWYgKHRlc3Rfb3B0IChzYiwgTUlOSVhfREYpKQpAQCAtMjY0NiwxMCArMjY2MCwxMCBAQAogCiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZXh0M19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZXh0M19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0M19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBleHQzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyLmMgYi9mcy9leHQzL3hhdHRyLmMKaW5kZXggZThkNjBiZi4uYTQ0YTA1NiAxMDA2NDQKLS0tIGEvZnMvZXh0My94YXR0ci5jCisrKyBiL2ZzL2V4dDMveGF0dHIuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiAJZXJyb3IgPSAtRU5PREFUQTsKIAlpZiAoIUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpCiAJCWdvdG8gY2xlYW51cDsKLQllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICVkIiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZWFfaWRlYnVnKGlub2RlLCAicmVhZGluZyBibG9jayAldSIsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOwogCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOwogCWlmICghYmgpCiAJCWdvdG8gY2xlYW51cDsKQEAgLTIzMyw3ICsyMzMsNyBAQAogCQlhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSksIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSk7CiAJaWYgKGV4dDNfeGF0dHJfY2hlY2tfYmxvY2soYmgpKSB7CiBiYWRfYmxvY2s6CWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCSAgICJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAogCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJCWVycm9yID0gLUVJTzsKIAkJZ290byBjbGVhbnVwOwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJZXJyb3IgPSAwOwogCWlmICghRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCkKIAkJZ290byBjbGVhbnVwOwotCWVhX2lkZWJ1Zyhpbm9kZSwgInJlYWRpbmcgYmxvY2sgJWQiLCBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICV1IiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJZXJyb3IgPSAtRUlPOwogCWlmICghYmgpCkBAIC0zNzUsNyArMzc1LDcgQEAKIAkJYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpLCBsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCkpOwogCWlmIChleHQzX3hhdHRyX2NoZWNrX2Jsb2NrKGJoKSkgewogCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCi0JCQkgICAiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQkgICAiaW5vZGUgJWxkOiBiYWQgYmxvY2sgIkUzRlNCTEssIGlub2RlLT5pX2lubywKIAkJCSAgIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOwogCQllcnJvciA9IC1FSU87CiAJCWdvdG8gY2xlYW51cDsKQEAgLTY0Nyw3ICs2NDcsNyBAQAogCQkJbGUzMl90b19jcHUoQkhEUihicy0+YmgpLT5oX3JlZmNvdW50KSk7CiAJCWlmIChleHQzX3hhdHRyX2NoZWNrX2Jsb2NrKGJzLT5iaCkpIHsKIAkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKLQkJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQkJImlub2RlICVsZDogYmFkIGJsb2NrICJFM0ZTQkxLLCBpbm9kZS0+aV9pbm8sCiAJCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJCQllcnJvciA9IC1FSU87CiAJCQlnb3RvIGNsZWFudXA7CkBAIC03OTIsMTEgKzc5MiwxMiBAQAogCQkJZ2V0X2JoKG5ld19iaCk7CiAJCX0gZWxzZSB7CiAJCQkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrICovCi0JCQlpbnQgZ29hbCA9IGxlMzJfdG9fY3B1KAorCQkJZXh0M19mc2Jsa190IGdvYWwgPSBsZTMyX3RvX2NwdSgKIAkJCQkJRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKwotCQkJCUVYVDNfSShpbm9kZSktPmlfYmxvY2tfZ3JvdXAgKgorCQkJCShleHQzX2ZzYmxrX3QpRVhUM19JKGlub2RlKS0+aV9ibG9ja19ncm91cCAqCiAJCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKLQkJCWludCBibG9jayA9IGV4dDNfbmV3X2Jsb2NrKGhhbmRsZSwgaW5vZGUsIGdvYWwsICZlcnJvcik7CisJCQlleHQzX2ZzYmxrX3QgYmxvY2sgPSBleHQzX25ld19ibG9jayhoYW5kbGUsIGlub2RlLAorCQkJCQkJCWdvYWwsICZlcnJvcik7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQkJZWFfaWRlYnVnKGlub2RlLCAiY3JlYXRpbmcgYmxvY2sgJWQiLCBibG9jayk7CkBAIC04NDcsNyArODQ4LDcgQEAKIAogYmFkX2Jsb2NrOgogCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkgICAiaW5vZGUgJWxkOiBiYWQgYmxvY2sgIkUzRlNCTEssIGlub2RlLT5pX2lubywKIAkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJZ290byBjbGVhbnVwOwogCkBAIC0xMDc2LDE0ICsxMDc3LDE0IEBACiAJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJaWYgKCFiaCkgewogCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCi0JCQkiaW5vZGUgJWxkOiBibG9jayAlZCByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJImlub2RlICVsZDogYmxvY2sgIkUzRlNCTEsiIHJlYWQgZXJyb3IiLCBpbm9kZS0+aV9pbm8sCiAJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAlpZiAoQkhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykgfHwKIAkgICAgQkhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKSB7CiAJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKLQkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAiRTNGU0JMSywgaW5vZGUtPmlfaW5vLAogCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CiAJCWdvdG8gY2xlYW51cDsKIAl9CkBAIC0xMjEwLDExICsxMjExLDExIEBACiAJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGNlLT5lX2Jsb2NrKTsKIAkJaWYgKCFiaCkgewogCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAotCQkJCSJpbm9kZSAlbGQ6IGJsb2NrICVsZCByZWFkIGVycm9yIiwKKwkJCQkiaW5vZGUgJWxkOiBibG9jayAlbHUgcmVhZCBlcnJvciIsCiAJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOwogCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSA+PQogCQkJCUVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYKSB7Ci0JCQllYV9pZGVidWcoaW5vZGUsICJibG9jayAlbGQgcmVmY291bnQgJWQ+PSVkIiwKKwkJCWVhX2lkZWJ1Zyhpbm9kZSwgImJsb2NrICVsdSByZWZjb3VudCAlZD49JWQiLAogCQkJCSAgKHVuc2lnbmVkIGxvbmcpIGNlLT5lX2Jsb2NrLAogCQkJCSAgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpLAogCQkJCQkgIEVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYKTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9pbm9kZS5jIGIvZnMvZmF0L2lub2RlLmMKaW5kZXggYzFjZTI4NC4uN2MzNWQ1OCAxMDA2NDQKLS0tIGEvZnMvZmF0L2lub2RlLmMKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTUzOSwxOCArNTM5LDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmF0X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQorc3RhdGljIGludCBmYXRfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihkZW50cnktPmRfc2IpOwogCiAJLyogSWYgdGhlIGNvdW50IG9mIGZyZWUgY2x1c3RlciBpcyBzdGlsbCB1bmtub3duLCBjb3VudHMgaXQgaGVyZS4gKi8KIAlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzID09IC0xKSB7Ci0JCWludCBlcnIgPSBmYXRfY291bnRfZnJlZV9jbHVzdGVycyhzYik7CisJCWludCBlcnIgPSBmYXRfY291bnRfZnJlZV9jbHVzdGVycyhkZW50cnktPmRfc2IpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlidWYtPmZfdHlwZSA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl90eXBlID0gZGVudHJ5LT5kX3NiLT5zX21hZ2ljOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOwogCWJ1Zi0+Zl9ibG9ja3MgPSBzYmktPm1heF9jbHVzdGVyIC0gRkFUX1NUQVJUX0VOVDsKIAlidWYtPmZfYmZyZWUgPSBzYmktPmZyZWVfY2x1c3RlcnM7CmRpZmYgLS1naXQgYS9mcy9mYXQvbWlzYy5jIGIvZnMvZmF0L21pc2MuYwppbmRleCA5NDQ2NTJlLi4zMDhmMmI2IDEwMDY0NAotLS0gYS9mcy9mYXQvbWlzYy5jCisrKyBiL2ZzL2ZhdC9taXNjLmMKQEAgLTIxMCw0ICsyMTAsMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGZhdF9zeW5jX2Jocyk7CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggYmNlYTE5OS4uNTA2ZDUzMCAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtMzAwLDUgKzMwMCw1IEBACiAJaWYgKGZpbGVzX3N0YXQubWF4X2ZpbGVzIDwgTlJfRklMRSkKIAkJZmlsZXNfc3RhdC5tYXhfZmlsZXMgPSBOUl9GSUxFOwogCWZpbGVzX2RlZmVyX2luaXQoKTsKLQlwZXJjcHVfY291bnRlcl9pbml0KCZucl9maWxlcyk7CisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmbnJfZmlsZXMsIDApOwogfSAKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnMuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnMuaAppbmRleCA1ODNiZDc4Li5kMzU5NzlhIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzLmgKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmcy5oCkBAIC0xNTksMTEgKzE1OSwxMSBAQAogICogSW4gY29yZSBzdXBlcmJsb2NrIGZpbGVzeXN0ZW0gcHJpdmF0ZSBkYXRhIGZvciBWeEZTLgogICovCiBzdHJ1Y3Qgdnhmc19zYl9pbmZvIHsKLQlzdHJ1Y3Qgdnhmc19zYgkJKnZzaV9yYXc7CS8qIHJhdyAob24gZGlzaykgc3VwZWJsb2NrICovCisJc3RydWN0IHZ4ZnNfc2IJCSp2c2lfcmF3OwkvKiByYXcgKG9uIGRpc2spIHN1cGVyYmxvY2sgKi8KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQJKnZzaV9icDsJLyogYnVmZmVyIGZvciByYXcgc3VwZXJibG9jayovCiAJc3RydWN0IGlub2RlCQkqdnNpX2ZzaGlwOwkvKiBmaWxlc2V0IGhlYWRlciBpbm9kZSAqLwogCXN0cnVjdCBpbm9kZQkJKnZzaV9pbGlzdDsJLyogaW5vZGUgbGlzdCBpbm9kZSAqLwotCXN0cnVjdCBpbm9kZQkJKnZzaV9zdGlsaXN0OwkvKiBzdHJ1Y3R1YWwgaW5vZGUgbGlzdCBpbm9kZSAqLworCXN0cnVjdCBpbm9kZQkJKnZzaV9zdGlsaXN0OwkvKiBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QgaW5vZGUgKi8KIAl1X2xvbmcJCQl2c2lfaWV4dDsJLyogaW5pdGlhbCBpbm9kZSBsaXN0ICovCiAJaW5vX3QJCQl2c2lfZnNoaW5vOwkvKiBmaWxlc2V0IGhlYWRlciBpbm9kZSAqLwogCWRhZGRyX3QJCQl2c2lfb2x0ZXh0OwkvKiBPTFQgZXh0ZW50ICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19mc2hlYWQuYwppbmRleCA2ZGVlMTA5Li43ODk0OGI0IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAJdmlwID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0+dnNpX2lleHQsIGluZnAtPnZzaV9mc2hpbm8pOwogCWlmICghdmlwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byByZWFkIGZzaCBpbm9kZVxuIik7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlIHRvIHJlYWQgZnNoIGlub2RlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmICghVlhGU19JU0ZTSCh2aXApKSB7CkBAIC0xMjksMTMgKzEyOSwxMyBAQAogCiAJaW5mcC0+dnNpX2ZzaGlwID0gdnhmc19nZXRfZmFrZV9pbm9kZShzYnAsIHZpcCk7CiAJaWYgKCFpbmZwLT52c2lfZnNoaXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBmc2ggaW5vZGVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZSB0byBnZXQgZnNoIGlub2RlXG4iKTsKIAkJZ290byBvdXRfZnJlZV9mc2hpcDsKIAl9CiAKIAlzZnAgPSB2eGZzX2dldGZzaChpbmZwLT52c2lfZnNoaXAsIDApOwogCWlmICghc2ZwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgc3RydWN0dXJhbCBmc2hcbiIpOworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZSB0byBnZXQgc3RydWN0dXJhbCBmc2hcbiIpOwogCQlnb3RvIG91dF9pcHV0X2ZzaGlwOwogCX0gCiAKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAJcGZwID0gdnhmc19nZXRmc2goaW5mcC0+dnNpX2ZzaGlwLCAxKTsKIAlpZiAoIXBmcCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZWQgdG8gZ2V0IHByaW1hcnkgZnNoXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGUgdG8gZ2V0IHByaW1hcnkgZnNoXG4iKTsKIAkJZ290byBvdXRfZnJlZV9zZnA7CiAJfQogCkBAIC0xNTksNyArMTU5LDcgQEAKIAogCWluZnAtPnZzaV9zdGlsaXN0ID0gdnhmc19nZXRfZmFrZV9pbm9kZShzYnAsIHRpcCk7CiAJaWYgKCFpbmZwLT52c2lfc3RpbGlzdCkgewotCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHVuYWJsZWQgdG8gZ2V0IHN0cnVjdHVhbCBsaXN0IGlub2RlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGUgdG8gZ2V0IHN0cnVjdHVyYWwgbGlzdCBpbm9kZVxuIik7CiAJCWtmcmVlKHRpcCk7CiAJCWdvdG8gb3V0X2ZyZWVfcGZwOwogCX0KQEAgLTE3NCw3ICsxNzQsNyBAQAogCQlnb3RvIG91dF9pcHV0X3N0aWxpc3Q7CiAJaW5mcC0+dnNpX2lsaXN0ID0gdnhmc19nZXRfZmFrZV9pbm9kZShzYnAsIHRpcCk7CiAJaWYgKCFpbmZwLT52c2lfaWxpc3QpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBpbm9kZSBsaXN0IGlub2RlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGUgdG8gZ2V0IGlub2RlIGxpc3QgaW5vZGVcbiIpOwogCQlrZnJlZSh0aXApOwogCQlnb3RvIG91dF9pcHV0X3N0aWxpc3Q7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuYwppbmRleCA1MGFhZTc3Li5jMWJlMTE4IDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1YnIuYworKysgYi9mcy9mcmVldnhmcy92eGZzX3N1YnIuYwpAQCAtNzEsOCArNzEsNyBAQAogewogCXN0cnVjdCBwYWdlICoJCQlwcDsKIAotCXBwID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCi0JCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJcHAgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBuLCBOVUxMKTsKIAogCWlmICghSVNfRVJSKHBwKSkgewogCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBwKTsKZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwppbmRleCBiNDRjOTE2Li5iNzRiNzkxIDEwMDY0NAotLS0gYS9mcy9mcmVldnhmcy92eGZzX3N1cGVyLmMKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogCiAjaW5jbHVkZSAidnhmcy5oIgogI2luY2x1ZGUgInZ4ZnNfZXh0ZXJuLmgiCkBAIC01NSw3ICs1Niw3IEBACiAKIAogc3RhdGljIHZvaWQJCXZ4ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLXN0YXRpYyBpbnQJCXZ4ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQJCXZ4ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBzdGF0aWMgaW50CQl2eGZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdnhmc19zdXBlcl9vcHMgPSB7CkBAIC05MCwxMiArOTEsMTIgQEAKIAogLyoqCiAgKiB2eGZzX3N0YXRmcyAtIGdldCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uCi0gKiBAc2JwOglWRlMgc3VwZXJibG9jaworICogQGRlbnRyeToJVkZTIGRlbnRyeSB0byBsb2NhdGUgc3VwZXJibG9jawogICogQGJ1ZnA6CW91dHB1dCBidWZmZXIKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvbgotICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicC4KKyAqICAgYWJvdXQgdGhlIGZpbGVzeXN0ZW0gZGVzY3JpYmVkIGJ5IEBkZW50cnkuCiAgKgogICogUmV0dXJuczoKICAqICAgWmVyby4KQEAgLTEwNywxMiArMTA4LDEyIEBACiAgKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi4KICAqLwogc3RhdGljIGludAotdnhmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBrc3RhdGZzICpidWZwKQordnhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmcCkKIHsKLQlzdHJ1Y3Qgdnhmc19zYl9pbmZvCQkqaW5mcCA9IFZYRlNfU0JJKHNicCk7CisJc3RydWN0IHZ4ZnNfc2JfaW5mbwkJKmluZnAgPSBWWEZTX1NCSShkZW50cnktPmRfc2IpOwogCiAJYnVmcC0+Zl90eXBlID0gVlhGU19TVVBFUl9NQUdJQzsKLQlidWZwLT5mX2JzaXplID0gc2JwLT5zX2Jsb2Nrc2l6ZTsKKwlidWZwLT5mX2JzaXplID0gZGVudHJ5LT5kX3NiLT5zX2Jsb2Nrc2l6ZTsKIAlidWZwLT5mX2Jsb2NrcyA9IGluZnAtPnZzaV9yYXctPnZzX2RzaXplOwogCWJ1ZnAtPmZfYmZyZWUgPSBpbmZwLT52c2lfcmF3LT52c19mcmVlOwogCWJ1ZnAtPmZfYmF2YWlsID0gMDsKQEAgLTI0MSwxMCArMjQyLDExIEBACiAvKgogICogVGhlIHVzdWFsIG1vZHVsZSBibHVyYi4KICAqLwotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdnhmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdnhmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgdnhmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB2eGZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdnhmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvZnMtd3JpdGViYWNrLmMgYi9mcy9mcy13cml0ZWJhY2suYwppbmRleCBmM2ZiZTJkLi4wMzFiMjdhIDEwMDY0NAotLS0gYS9mcy9mcy13cml0ZWJhY2suYworKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtNDYxLDYgKzQ2MSw4IEBACiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKIAkJLnN5bmNfbW9kZQk9IHdhaXQgPyBXQl9TWU5DX0FMTCA6IFdCX1NZTkNfSE9MRCwKKwkJLnJhbmdlX3N0YXJ0CT0gMCwKKwkJLnJhbmdlX2VuZAk9IExMT05HX01BWCwKIAl9OwogCXVuc2lnbmVkIGxvbmcgbnJfZGlydHkgPSByZWFkX3BhZ2Vfc3RhdGUobnJfZGlydHkpOwogCXVuc2lnbmVkIGxvbmcgbnJfdW5zdGFibGUgPSByZWFkX3BhZ2Vfc3RhdGUobnJfdW5zdGFibGUpOwpAQCAtNTU5LDYgKzU2MSw4IEBACiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKIAkJLm5yX3RvX3dyaXRlID0gTE9OR19NQVgsCiAJCS5zeW5jX21vZGUgPSBXQl9TWU5DX0FMTCwKKwkJLnJhbmdlX3N0YXJ0ID0gMCwKKwkJLnJhbmdlX2VuZCA9IExMT05HX01BWCwKIAl9OwogCiAJaWYgKCFtYXBwaW5nX2NhcF93cml0ZWJhY2tfZGlydHkoaW5vZGUtPmlfbWFwcGluZykpCkBAIC02MTksNyArNjIzLDYgQEAKIAlpbnQgbmVlZF93cml0ZV9pbm9kZV9ub3cgPSAwOwogCWludCBlcnIyOwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1lOQ1dSSVRFOwogCWlmICh3aGF0ICYgT1NZTkNfREFUQSkKIAkJZXJyID0gZmlsZW1hcF9mZGF0YXdyaXRlKG1hcHBpbmcpOwogCWlmICh3aGF0ICYgKE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpKSB7CkBAIC02MzIsNyArNjM1LDYgQEAKIAkJaWYgKCFlcnIpCiAJCQllcnIgPSBlcnIyOwogCX0KLQljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOwogCiAJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKIAlpZiAoKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgJiYKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvTWFrZWZpbGUgYi9mcy9mdXNlL01ha2VmaWxlCmluZGV4IGMzZTFmNzYuLjcyNDM3MDYgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvTWFrZWZpbGUKKysrIGIvZnMvZnVzZS9NYWtlZmlsZQpAQCAtNCw0ICs0LDQgQEAKIAogb2JqLSQoQ09ORklHX0ZVU0VfRlMpICs9IGZ1c2UubwogCi1mdXNlLW9ianMgOj0gZGV2Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8KK2Z1c2Utb2JqcyA6PSBkZXYubyBkaXIubyBmaWxlLm8gaW5vZGUubyBjb250cm9sLm8KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY29udHJvbC5jIGIvZnMvZnVzZS9jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiY2UzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Z1c2UvY29udHJvbC5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICBGVVNFOiBGaWxlc3lzdGVtIGluIFVzZXJzcGFjZQorICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgorCisgIFRoaXMgcHJvZ3JhbSBjYW4gYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMLgorICBTZWUgdGhlIGZpbGUgQ09QWUlORy4KKyovCisKKyNpbmNsdWRlICJmdXNlX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2RlZmluZSBGVVNFX0NUTF9TVVBFUl9NQUdJQyAweDY1NzM1NTQzCisKKy8qCisgKiBUaGlzIGlzIG5vbi1OVUxMIHdoZW4gdGhlIHNpbmdsZSBpbnN0YW5jZSBvZiB0aGUgY29udHJvbCBmaWxlc3lzdGVtCisgKiBleGlzdHMuICBQcm90ZWN0ZWQgYnkgZnVzZV9tdXRleAorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpmdXNlX2NvbnRyb2xfc2I7CisKK3N0YXRpYyBzdHJ1Y3QgZnVzZV9jb25uICpmdXNlX2N0bF9maWxlX2Nvbm5fZ2V0KHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjOworCW11dGV4X2xvY2soJmZ1c2VfbXV0ZXgpOworCWZjID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlpZiAoZmMpCisJCWZjID0gZnVzZV9jb25uX2dldChmYyk7CisJbXV0ZXhfdW5sb2NrKCZmdXNlX211dGV4KTsKKwlyZXR1cm4gZmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl9hYm9ydF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZnVzZV9jdGxfZmlsZV9jb25uX2dldChmaWxlKTsKKwlpZiAoZmMpIHsKKwkJZnVzZV9hYm9ydF9jb25uKGZjKTsKKwkJZnVzZV9jb25uX3B1dChmYyk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgZnVzZV9jb25uX3dhaXRpbmdfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciB0bXBbMzJdOworCXNpemVfdCBzaXplOworCisJaWYgKCEqcHBvcykgeworCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGZ1c2VfY3RsX2ZpbGVfY29ubl9nZXQoZmlsZSk7CisJCWlmICghZmMpCisJCQlyZXR1cm4gMDsKKworCQlmaWxlLT5wcml2YXRlX2RhdGE9KHZvaWQgKikobG9uZylhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKTsKKwkJZnVzZV9jb25uX3B1dChmYyk7CisJfQorCXNpemUgPSBzcHJpbnRmKHRtcCwgIiVsZFxuIiwgKGxvbmcpZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBsZW4sIHBwb3MsIHRtcCwgc2l6ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfY3RsX2Fib3J0X29wcyA9IHsKKwkub3BlbiA9IG5vbnNlZWthYmxlX29wZW4sCisJLndyaXRlID0gZnVzZV9jb25uX2Fib3J0X3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnVzZV9jdGxfd2FpdGluZ19vcHMgPSB7CisJLm9wZW4gPSBub25zZWVrYWJsZV9vcGVuLAorCS5yZWFkID0gZnVzZV9jb25uX3dhaXRpbmdfcmVhZCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpmdXNlX2N0bF9hZGRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICBzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIGludCBtb2RlLCBpbnQgbmxpbmssCisJCQkJCSAgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgKmlvcCwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3ApCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlCVUdfT04oZmMtPmN0bF9uZGVudHMgPj0gRlVTRV9DVExfTlVNX0RFTlRSSUVTKTsKKwlkZW50cnkgPSBkX2FsbG9jX25hbWUocGFyZW50LCBuYW1lKTsKKwlpZiAoIWRlbnRyeSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmYy0+Y3RsX2RlbnRyeVtmYy0+Y3RsX25kZW50cysrXSA9IGRlbnRyeTsKKwlpbm9kZSA9IG5ld19pbm9kZShmdXNlX2NvbnRyb2xfc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gZmMtPnVzZXJfaWQ7CisJaW5vZGUtPmlfZ2lkID0gZmMtPmdyb3VwX2lkOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkvKiBzZXR0aW5nIC0+aV9vcCB0byBOVUxMIGlzIG5vdCBhbGxvd2VkICovCisJaWYgKGlvcCkKKwkJaW5vZGUtPmlfb3AgPSBpb3A7CisJaW5vZGUtPmlfZm9wID0gZm9wOworCWlub2RlLT5pX25saW5rID0gbmxpbms7CisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGZjOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBkZW50cnk7Cit9CisKKy8qCisgKiBBZGQgYSBjb25uZWN0aW9uIHRvIHRoZSBjb250cm9sIGZpbGVzeXN0ZW0gKGlmIGl0IGV4aXN0cykuICBDYWxsZXIKKyAqIG11c3QgaG9zdCBmdXNlX211dGV4CisgKi8KK2ludCBmdXNlX2N0bF9hZGRfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJY2hhciBuYW1lWzMyXTsKKworCWlmICghZnVzZV9jb250cm9sX3NiKQorCQlyZXR1cm4gMDsKKworCXBhcmVudCA9IGZ1c2VfY29udHJvbF9zYi0+c19yb290OworCXBhcmVudC0+ZF9pbm9kZS0+aV9ubGluaysrOworCXNwcmludGYobmFtZSwgIiVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKSBmYy0+aWQpOworCXBhcmVudCA9IGZ1c2VfY3RsX2FkZF9kZW50cnkocGFyZW50LCBmYywgbmFtZSwgU19JRkRJUiB8IDA1MDAsIDIsCisJCQkJICAgICAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zLAorCQkJCSAgICAgJnNpbXBsZV9kaXJfb3BlcmF0aW9ucyk7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gZXJyOworCisJaWYgKCFmdXNlX2N0bF9hZGRfZGVudHJ5KHBhcmVudCwgZmMsICJ3YWl0aW5nIiwgU19JRlJFRyB8IDA0MDAsIDEsCisJCQkJTlVMTCwgJmZ1c2VfY3RsX3dhaXRpbmdfb3BzKSB8fAorCSAgICAhZnVzZV9jdGxfYWRkX2RlbnRyeShwYXJlbnQsIGZjLCAiYWJvcnQiLCBTX0lGUkVHIHwgMDIwMCwgMSwKKwkJCQkgTlVMTCwgJmZ1c2VfY3RsX2Fib3J0X29wcykpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKKyBlcnI6CisJZnVzZV9jdGxfcmVtb3ZlX2Nvbm4oZmMpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogUmVtb3ZlIGEgY29ubmVjdGlvbiBmcm9tIHRoZSBjb250cm9sIGZpbGVzeXN0ZW0gKGlmIGl0IGV4aXN0cykuCisgKiBDYWxsZXIgbXVzdCBob3N0IGZ1c2VfbXV0ZXgKKyAqLwordm9pZCBmdXNlX2N0bF9yZW1vdmVfY29ubihzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlpbnQgaTsKKworCWlmICghZnVzZV9jb250cm9sX3NiKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBmYy0+Y3RsX25kZW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZjLT5jdGxfZGVudHJ5W2ldOworCQlkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IE5VTEw7CisJCWRfZHJvcChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJfQorCWZ1c2VfY29udHJvbF9zYi0+c19yb290LT5kX2lub2RlLT5pX25saW5rLS07Cit9CisKK3N0YXRpYyBpbnQgZnVzZV9jdGxfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCB0cmVlX2Rlc2NyIGVtcHR5X2Rlc2NyID0geyIifTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYzsKKwlpbnQgZXJyOworCisJZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIEZVU0VfQ1RMX1NVUEVSX01BR0lDLCAmZW1wdHlfZGVzY3IpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltdXRleF9sb2NrKCZmdXNlX211dGV4KTsKKwlCVUdfT04oZnVzZV9jb250cm9sX3NiKTsKKwlmdXNlX2NvbnRyb2xfc2IgPSBzYjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjLCAmZnVzZV9jb25uX2xpc3QsIGVudHJ5KSB7CisJCWVyciA9IGZ1c2VfY3RsX2FkZF9jb25uKGZjKTsKKwkJaWYgKGVycikgeworCQkJZnVzZV9jb250cm9sX3NiID0gTlVMTDsKKwkJCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZnVzZV9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmdXNlX2N0bF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywKKwkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwKKwkJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCByYXdfZGF0YSwKKwkJCQlmdXNlX2N0bF9maWxsX3N1cGVyLCBtbnQpOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2N0bF9raWxsX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbXV0ZXhfbG9jaygmZnVzZV9tdXRleCk7CisJZnVzZV9jb250cm9sX3NiID0gTlVMTDsKKwltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOworCisJa2lsbF9saXR0ZXJfc3VwZXIoc2IpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZnVzZV9jdGxfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImZ1c2VjdGwiLAorCS5nZXRfc2IJCT0gZnVzZV9jdGxfZ2V0X3NiLAorCS5raWxsX3NiCT0gZnVzZV9jdGxfa2lsbF9zYiwKK307CisKK2ludCBfX2luaXQgZnVzZV9jdGxfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXNlX2N0bF9mc190eXBlKTsKK30KKwordm9pZCBmdXNlX2N0bF9jbGVhbnVwKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZmdXNlX2N0bF9mc190eXBlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGV2LmMgYi9mcy9mdXNlL2Rldi5jCmluZGV4IDEwNGE2MmQuLjFlMjAwNmMgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGV2LmMKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMzQsNiArMzQsNyBAQAogewogCW1lbXNldChyZXEsIDAsIHNpemVvZigqcmVxKSk7CiAJSU5JVF9MSVNUX0hFQUQoJnJlcS0+bGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+aW50cl9lbnRyeSk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmcmVxLT53YWl0cSk7CiAJYXRvbWljX3NldCgmcmVxLT5jb3VudCwgMSk7CiB9CkBAIC02NCwxOCArNjUsNiBAQAogCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBvbGRzZXQsIE5VTEwpOwogfQogCi0vKgotICogUmVzZXQgcmVxdWVzdCwgc28gdGhhdCBpdCBjYW4gYmUgcmV1c2VkCi0gKgotICogVGhlIGNhbGxlciBtdXN0IGJlIF92ZXJ5XyBjYXJlZnVsIHRvIG1ha2Ugc3VyZSwgdGhhdCBpdCBpcyBob2xkaW5nCi0gKiB0aGUgb25seSByZWZlcmVuY2UgdG8gcmVxCi0gKi8KLXZvaWQgZnVzZV9yZXNldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQotewotCUJVR19PTihhdG9taWNfcmVhZCgmcmVxLT5jb3VudCkgIT0gMSk7Ci0JZnVzZV9yZXF1ZXN0X2luaXQocmVxKTsKLX0KLQogc3RhdGljIHZvaWQgX19mdXNlX2dldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCWF0b21pY19pbmMoJnJlcS0+Y291bnQpOwpAQCAtODgsNiArNzcsMTMgQEAKIAlhdG9taWNfZGVjKCZyZXEtPmNvdW50KTsKIH0KIAorc3RhdGljIHZvaWQgZnVzZV9yZXFfaW5pdF9jb250ZXh0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXJlcS0+aW4uaC51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyZXEtPmluLmguZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJcmVxLT5pbi5oLnBpZCA9IGN1cnJlbnQtPnBpZDsKK30KKwogc3RydWN0IGZ1c2VfcmVxICpmdXNlX2dldF9yZXEoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJc3RydWN0IGZ1c2VfcmVxICpyZXE7CkBAIC0xMDMsMTQgKzk5LDE2IEBACiAJaWYgKGludHIpCiAJCWdvdG8gb3V0OwogCisJZXJyID0gLUVOT1RDT05OOworCWlmICghZmMtPmNvbm5lY3RlZCkKKwkJZ290byBvdXQ7CisKIAlyZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKIAllcnIgPSAtRU5PTUVNOwogCWlmICghcmVxKQogCQlnb3RvIG91dDsKIAotCXJlcS0+aW4uaC51aWQgPSBjdXJyZW50LT5mc3VpZDsKLQlyZXEtPmluLmguZ2lkID0gY3VycmVudC0+ZnNnaWQ7Ci0JcmVxLT5pbi5oLnBpZCA9IGN1cnJlbnQtPnBpZDsKKwlmdXNlX3JlcV9pbml0X2NvbnRleHQocmVxKTsKIAlyZXEtPndhaXRpbmcgPSAxOwogCXJldHVybiByZXE7CiAKQEAgLTExOSwxNDIgKzExNywxODMgQEAKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQogCisvKgorICogUmV0dXJuIHJlcXVlc3QgaW4gZnVzZV9maWxlLT5yZXNlcnZlZF9yZXEuICBIb3dldmVyIHRoYXQgbWF5CisgKiBjdXJyZW50bHkgYmUgaW4gdXNlLiAgSWYgdGhhdCBpcyB0aGUgY2FzZSwgd2FpdCBmb3IgaXQgdG8gYmVjb21lCisgKiBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZnVzZV9yZXEgKmdldF9yZXNlcnZlZF9yZXEoc3RydWN0IGZ1c2VfY29ubiAqZmMsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcSA9IE5VTEw7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkbyB7CisJCXdhaXRfZXZlbnQoZmMtPmJsb2NrZWRfd2FpdHEsIGZmLT5yZXNlcnZlZF9yZXEpOworCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwkJaWYgKGZmLT5yZXNlcnZlZF9yZXEpIHsKKwkJCXJlcSA9IGZmLT5yZXNlcnZlZF9yZXE7CisJCQlmZi0+cmVzZXJ2ZWRfcmVxID0gTlVMTDsKKwkJCWdldF9maWxlKGZpbGUpOworCQkJcmVxLT5zdG9sZW5fZmlsZSA9IGZpbGU7CisJCX0KKwkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwl9IHdoaWxlICghcmVxKTsKKworCXJldHVybiByZXE7Cit9CisKKy8qCisgKiBQdXQgc3RvbGVuIHJlcXVlc3QgYmFjayBpbnRvIGZ1c2VfZmlsZS0+cmVzZXJ2ZWRfcmVxCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9yZXNlcnZlZF9yZXEoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gcmVxLT5zdG9sZW5fZmlsZTsKKwlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9jaygmZmMtPmxvY2spOworCWZ1c2VfcmVxdWVzdF9pbml0KHJlcSk7CisJQlVHX09OKGZmLT5yZXNlcnZlZF9yZXEpOworCWZmLT5yZXNlcnZlZF9yZXEgPSByZXE7CisJd2FrZV91cCgmZmMtPmJsb2NrZWRfd2FpdHEpOworCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJZnB1dChmaWxlKTsKK30KKworLyoKKyAqIEdldHMgYSByZXF1ZXN0cyBmb3IgYSBmaWxlIG9wZXJhdGlvbiwgYWx3YXlzIHN1Y2NlZWRzCisgKgorICogVGhpcyBpcyB1c2VkIGZvciBzZW5kaW5nIHRoZSBGTFVTSCByZXF1ZXN0LCB3aGljaCBtdXN0IGdldCB0bworICogdXNlcnNwYWNlLCBkdWUgdG8gUE9TSVggbG9ja3Mgd2hpY2ggbWF5IG5lZWQgdG8gYmUgdW5sb2NrZWQuCisgKgorICogSWYgYWxsb2NhdGlvbiBmYWlscyBkdWUgdG8gT09NLCB1c2UgdGhlIHJlc2VydmVkIHJlcXVlc3QgaW4KKyAqIGZ1c2VfZmlsZS4KKyAqCisgKiBUaGlzIGlzIHZlcnkgdW5saWtlbHkgdG8gZGVhZGxvY2sgYWNjaWRlbnRhbGx5LCBzaW5jZSB0aGUKKyAqIGZpbGVzeXN0ZW0gc2hvdWxkIG5vdCBoYXZlIGl0J3Mgb3duIGZpbGUgb3Blbi4gIElmIGRlYWRsb2NrIGlzCisgKiBpbnRlbnRpb25hbCwgaXQgY2FuIHN0aWxsIGJlIGJyb2tlbiBieSAiYWJvcnRpbmciIHRoZSBmaWxlc3lzdGVtLgorICovCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfZ2V0X3JlcV9ub2ZhaWwoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCisJYXRvbWljX2luYygmZmMtPm51bV93YWl0aW5nKTsKKwl3YWl0X2V2ZW50KGZjLT5ibG9ja2VkX3dhaXRxLCAhZmMtPmJsb2NrZWQpOworCXJlcSA9IGZ1c2VfcmVxdWVzdF9hbGxvYygpOworCWlmICghcmVxKQorCQlyZXEgPSBnZXRfcmVzZXJ2ZWRfcmVxKGZjLCBmaWxlKTsKKworCWZ1c2VfcmVxX2luaXRfY29udGV4dChyZXEpOworCXJlcS0+d2FpdGluZyA9IDE7CisJcmV0dXJuIHJlcTsKK30KKwogdm9pZCBmdXNlX3B1dF9yZXF1ZXN0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT5jb3VudCkpIHsKIAkJaWYgKHJlcS0+d2FpdGluZykKIAkJCWF0b21pY19kZWMoJmZjLT5udW1fd2FpdGluZyk7Ci0JCWZ1c2VfcmVxdWVzdF9mcmVlKHJlcSk7Ci0JfQotfQogCi0vKgotICogQ2FsbGVkIHdpdGggc2JwdXRfc2VtIGhlbGQgZm9yIHJlYWQgKHJlcXVlc3RfZW5kKSBvciB3cml0ZQotICogKGZ1c2VfcHV0X3N1cGVyKS4gIEJ5IHRoZSB0aW1lIGZ1c2VfcHV0X3N1cGVyKCkgaXMgZmluaXNoZWQsIGFsbAotICogaW5vZGVzIGJlbG9uZ2luZyB0byBiYWNrZ3JvdW5kIHJlcXVlc3RzIG11c3QgYmUgcmVsZWFzZWQsIHNvIHRoZQotICogaXB1dHMgaGF2ZSB0byBiZSBkb25lIHdpdGhpbiB0aGUgbG9ja2VkIHJlZ2lvbi4KLSAqLwotdm9pZCBmdXNlX3JlbGVhc2VfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCi17Ci0JaXB1dChyZXEtPmlub2RlKTsKLQlpcHV0KHJlcS0+aW5vZGUyKTsKLQlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQlsaXN0X2RlbCgmcmVxLT5iZ19lbnRyeSk7Ci0JaWYgKGZjLT5udW1fYmFja2dyb3VuZCA9PSBGVVNFX01BWF9CQUNLR1JPVU5EKSB7Ci0JCWZjLT5ibG9ja2VkID0gMDsKLQkJd2FrZV91cF9hbGwoJmZjLT5ibG9ja2VkX3dhaXRxKTsKKwkJaWYgKHJlcS0+c3RvbGVuX2ZpbGUpCisJCQlwdXRfcmVzZXJ2ZWRfcmVxKGZjLCByZXEpOworCQllbHNlCisJCQlmdXNlX3JlcXVlc3RfZnJlZShyZXEpOwogCX0KLQlmYy0+bnVtX2JhY2tncm91bmQtLTsKLQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogfQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJlcXVlc3QgaXMgZmluaXNoZWQuICBFaXRoZXIgYSByZXBseQotICogaGFzIGFycml2ZWQgb3IgaXQgd2FzIGludGVycnVwdGVkIChhbmQgbm90IHlldCBzZW50KSBvciBzb21lIGVycm9yCisgKiBoYXMgYXJyaXZlZCBvciBpdCB3YXMgYWJvcnRlZCAoYW5kIG5vdCB5ZXQgc2VudCkgb3Igc29tZSBlcnJvcgogICogb2NjdXJyZWQgZHVyaW5nIGNvbW11bmljYXRpb24gd2l0aCB1c2Vyc3BhY2UsIG9yIHRoZSBkZXZpY2UgZmlsZQotICogd2FzIGNsb3NlZC4gIEluIGNhc2Ugb2YgYSBiYWNrZ3JvdW5kIHJlcXVlc3QgdGhlIHJlZmVyZW5jZSB0byB0aGUKLSAqIHN0b3JlZCBvYmplY3RzIGFyZSByZWxlYXNlZC4gIFRoZSByZXF1ZXN0ZXIgdGhyZWFkIGlzIHdva2VuIHVwIChpZgotICogc3RpbGwgd2FpdGluZyksIHRoZSAnZW5kJyBjYWxsYmFjayBpcyBjYWxsZWQgaWYgZ2l2ZW4sIGVsc2UgdGhlCi0gKiByZWZlcmVuY2UgdG8gdGhlIHJlcXVlc3QgaXMgcmVsZWFzZWQKLSAqCi0gKiBSZWxlYXNpbmcgZXh0cmEgcmVmZXJlbmNlIGZvciBmb3JlZ3JvdW5kIHJlcXVlc3RzIG11c3QgYmUgZG9uZQotICogd2l0aGluIHRoZSBzYW1lIGxvY2tlZCByZWdpb24gYXMgc2V0dGluZyBzdGF0ZSB0byBmaW5pc2hlZC4gIFRoaXMKLSAqIGlzIGJlY2F1c2UgZnVzZV9yZXNldF9yZXF1ZXN0KCkgbWF5IGJlIGNhbGxlZCBhZnRlciByZXF1ZXN0IGlzCi0gKiBmaW5pc2hlZCBhbmQgaXQgbXVzdCBiZSB0aGUgc29sZSBwb3NzZXNzb3IuICBJZiByZXF1ZXN0IGlzCi0gKiBpbnRlcnJ1cHRlZCBhbmQgcHV0IGluIHRoZSBiYWNrZ3JvdW5kLCBpdCB3aWxsIHJldHVybiB3aXRoIGFuIGVycm9yCi0gKiBhbmQgaGVuY2UgbmV2ZXIgYmUgcmVzZXQgYW5kIHJldXNlZC4KKyAqIHdhcyBjbG9zZWQuICBUaGUgcmVxdWVzdGVyIHRocmVhZCBpcyB3b2tlbiB1cCAoaWYgc3RpbGwgd2FpdGluZyksCisgKiB0aGUgJ2VuZCcgY2FsbGJhY2sgaXMgY2FsbGVkIGlmIGdpdmVuLCBlbHNlIHRoZSByZWZlcmVuY2UgdG8gdGhlCisgKiByZXF1ZXN0IGlzIHJlbGVhc2VkCiAgKgogICogQ2FsbGVkIHdpdGggZmMtPmxvY2ssIHVubG9ja3MgaXQKICAqLwogc3RhdGljIHZvaWQgcmVxdWVzdF9lbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogeworCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOworCXJlcS0+ZW5kID0gTlVMTDsKIAlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwlsaXN0X2RlbCgmcmVxLT5pbnRyX2VudHJ5KTsKIAlyZXEtPnN0YXRlID0gRlVTRV9SRVFfRklOSVNIRUQ7Ci0JaWYgKCFyZXEtPmJhY2tncm91bmQpIHsKLQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKLQkJd2FrZV91cCgmcmVxLT53YWl0cSk7Ci0JCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Ci0JfSBlbHNlIHsKLQkJdm9pZCAoKmVuZCkgKHN0cnVjdCBmdXNlX2Nvbm4gKiwgc3RydWN0IGZ1c2VfcmVxICopID0gcmVxLT5lbmQ7Ci0JCXJlcS0+ZW5kID0gTlVMTDsKLQkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKLQkJZG93bl9yZWFkKCZmYy0+c2JwdXRfc2VtKTsKLQkJaWYgKGZjLT5tb3VudGVkKQotCQkJZnVzZV9yZWxlYXNlX2JhY2tncm91bmQoZmMsIHJlcSk7Ci0JCXVwX3JlYWQoJmZjLT5zYnB1dF9zZW0pOwotCi0JCS8qIGZwdXQgbXVzdCBnbyBvdXRzaWRlIHNicHV0X3NlbSwgb3RoZXJ3aXNlIGl0IGNhbiBkZWFkbG9jayAqLwotCQlpZiAocmVxLT5maWxlKQotCQkJZnB1dChyZXEtPmZpbGUpOwotCi0JCWlmIChlbmQpCi0JCQllbmQoZmMsIHJlcSk7Ci0JCWVsc2UKLQkJCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKHJlcS0+YmFja2dyb3VuZCkgeworCQlpZiAoZmMtPm51bV9iYWNrZ3JvdW5kID09IEZVU0VfTUFYX0JBQ0tHUk9VTkQpIHsKKwkJCWZjLT5ibG9ja2VkID0gMDsKKwkJCXdha2VfdXBfYWxsKCZmYy0+YmxvY2tlZF93YWl0cSk7CisJCX0KKwkJZmMtPm51bV9iYWNrZ3JvdW5kLS07CiAJfQorCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CisJZHB1dChyZXEtPmRlbnRyeSk7CisJbW50cHV0KHJlcS0+dmZzbW91bnQpOworCWlmIChyZXEtPmZpbGUpCisJCWZwdXQocmVxLT5maWxlKTsKKwl3YWtlX3VwKCZyZXEtPndhaXRxKTsKKwlpZiAoZW5kKQorCQllbmQoZmMsIHJlcSk7CisJZWxzZQorCQlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogfQogCi0vKgotICogVW5mb3J0dW5hdGVseSByZXF1ZXN0IGludGVycnVwdGlvbiBub3QganVzdCBzb2x2ZXMgdGhlIGRlYWRsb2NrCi0gKiBwcm9ibGVtLCBpdCBjYXVzZXMgcHJvYmxlbXMgdG9vLiAgVGhlc2Ugc3RlbSBmcm9tIHRoZSBmYWN0LCB0aGF0IGFuCi0gKiBpbnRlcnJ1cHRlZCByZXF1ZXN0IGlzIGNvbnRpbnVlZCB0byBiZSBwcm9jZXNzZWQgaW4gdXNlcnNwYWNlLAotICogd2hpbGUgYWxsIHRoZSBsb2NrcyBhbmQgb2JqZWN0IHJlZmVyZW5jZXMgKGlub2RlIGFuZCBmaWxlKSBoZWxkCi0gKiBkdXJpbmcgdGhlIG9wZXJhdGlvbiBhcmUgcmVsZWFzZWQuCi0gKgotICogVG8gcmVsZWFzZSB0aGUgbG9ja3MgaXMgZXhhY3RseSB3aHkgdGhlcmUncyBhIG5lZWQgdG8gaW50ZXJydXB0IHRoZQotICogcmVxdWVzdCwgc28gdGhlcmUncyBub3QgYSBsb3QgdGhhdCBjYW4gYmUgZG9uZSBhYm91dCB0aGlzLCBleGNlcHQKLSAqIGludHJvZHVjZSBhZGRpdGlvbmFsIGxvY2tpbmcgaW4gdXNlcnNwYWNlLgotICoKLSAqIE1vcmUgaW1wb3J0YW50IGlzIHRvIGtlZXAgaW5vZGUgYW5kIGZpbGUgcmVmZXJlbmNlcyB1bnRpbCB1c2Vyc3BhY2UKLSAqIGhhcyByZXBsaWVkLCBvdGhlcndpc2UgRk9SR0VUIGFuZCBSRUxFQVNFIGNvdWxkIGJlIHNlbnQgd2hpbGUgdGhlCi0gKiBpbm9kZS9maWxlIGlzIHN0aWxsIHVzZWQgYnkgdGhlIGZpbGVzeXN0ZW0uCi0gKgotICogRm9yIHRoaXMgcmVhc29uIHRoZSBjb25jZXB0IG9mICJiYWNrZ3JvdW5kIiByZXF1ZXN0IGlzIGludHJvZHVjZWQuCi0gKiBBbiBpbnRlcnJ1cHRlZCByZXF1ZXN0IGlzIGJhY2tncm91bmRlZCBpZiBpdCBoYXMgYmVlbiBhbHJlYWR5IHNlbnQKLSAqIHRvIHVzZXJzcGFjZS4gIEJhY2tncm91bmRpbmcgaW52b2x2ZXMgZ2V0dGluZyBhbiBleHRyYSByZWZlcmVuY2UgdG8KLSAqIGlub2RlKHMpIG9yIGZpbGUgdXNlZCBpbiB0aGUgcmVxdWVzdCwgYW5kIGFkZGluZyB0aGUgcmVxdWVzdCB0bwotICogZmMtPmJhY2tncm91bmQgbGlzdC4gIFdoZW4gYSByZXBseSBpcyByZWNlaXZlZCBmb3IgYSBiYWNrZ3JvdW5kCi0gKiByZXF1ZXN0LCB0aGUgb2JqZWN0IHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLCBhbmQgdGhlIHJlcXVlc3QgaXMKLSAqIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gIElmIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZCB3aGlsZSB0aGVyZQotICogYXJlIHN0aWxsIGJhY2tncm91bmQgcmVxdWVzdHMsIHRoZSBsaXN0IGlzIHdhbGtlZCBhbmQgcmVmZXJlbmNlcwotICogYXJlIHJlbGVhc2VkIGFzIGlmIGEgcmVwbHkgd2FzIHJlY2VpdmVkLgotICoKLSAqIFRoZXJlJ3Mgb25lIG1vcmUgdXNlIGZvciBhIGJhY2tncm91bmQgcmVxdWVzdC4gIFRoZSBSRUxFQVNFIG1lc3NhZ2UgaXMKLSAqIGFsd2F5cyBzZW50IGFzIGJhY2tncm91bmQsIHNpbmNlIGl0IGRvZXNuJ3QgcmV0dXJuIGFuIGVycm9yIG9yCi0gKiBkYXRhLgotICovCi1zdGF0aWMgdm9pZCBiYWNrZ3JvdW5kX3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQorc3RhdGljIHZvaWQgd2FpdF9hbnN3ZXJfaW50ZXJydXB0aWJsZShzdHJ1Y3QgZnVzZV9jb25uICpmYywKKwkJCQkgICAgICBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKLQlyZXEtPmJhY2tncm91bmQgPSAxOwotCWxpc3RfYWRkKCZyZXEtPmJnX2VudHJ5LCAmZmMtPmJhY2tncm91bmQpOwotCWZjLT5udW1fYmFja2dyb3VuZCsrOwotCWlmIChmYy0+bnVtX2JhY2tncm91bmQgPT0gRlVTRV9NQVhfQkFDS0dST1VORCkKLQkJZmMtPmJsb2NrZWQgPSAxOwotCWlmIChyZXEtPmlub2RlKQotCQlyZXEtPmlub2RlID0gaWdyYWIocmVxLT5pbm9kZSk7Ci0JaWYgKHJlcS0+aW5vZGUyKQotCQlyZXEtPmlub2RlMiA9IGlncmFiKHJlcS0+aW5vZGUyKTsKLQlpZiAocmVxLT5maWxlKQotCQlnZXRfZmlsZShyZXEtPmZpbGUpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuOworCisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmVxLT53YWl0cSwgcmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9GSU5JU0hFRCk7CisJc3Bpbl9sb2NrKCZmYy0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXVlX2ludGVycnVwdChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCit7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5pbnRyX2VudHJ5LCAmZmMtPmludGVycnVwdHMpOworCXdha2VfdXAoJmZjLT53YWl0cSk7CisJa2lsbF9mYXN5bmMoJmZjLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIH0KIAogLyogQ2FsbGVkIHdpdGggZmMtPmxvY2sgaGVsZC4gIFJlbGVhc2VzLCBhbmQgdGhlbiByZWFjcXVpcmVzIGl0LiAqLwogc3RhdGljIHZvaWQgcmVxdWVzdF93YWl0X2Fuc3dlcihzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpCiB7Ci0Jc2lnc2V0X3Qgb2xkc2V0OworCWlmICghZmMtPm5vX2ludGVycnVwdCkgeworCQkvKiBBbnkgc2lnbmFsIG1heSBpbnRlcnJ1cHQgdGhpcyAqLworCQl3YWl0X2Fuc3dlcl9pbnRlcnJ1cHRpYmxlKGZjLCByZXEpOwogCi0Jc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKLQlibG9ja19zaWdzKCZvbGRzZXQpOwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyZXEtPndhaXRxLCByZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEKTsKLQlyZXN0b3JlX3NpZ3MoJm9sZHNldCk7Ci0Jc3Bpbl9sb2NrKCZmYy0+bG9jayk7Ci0JaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfRklOSVNIRUQgJiYgIXJlcS0+aW50ZXJydXB0ZWQpCi0JCXJldHVybjsKKwkJaWYgKHJlcS0+YWJvcnRlZCkKKwkJCWdvdG8gYWJvcnRlZDsKKwkJaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfRklOSVNIRUQpCisJCQlyZXR1cm47CiAKLQlpZiAoIXJlcS0+aW50ZXJydXB0ZWQpIHsKLQkJcmVxLT5vdXQuaC5lcnJvciA9IC1FSU5UUjsKIAkJcmVxLT5pbnRlcnJ1cHRlZCA9IDE7CisJCWlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX1NFTlQpCisJCQlxdWV1ZV9pbnRlcnJ1cHQoZmMsIHJlcSk7CiAJfQorCisJaWYgKHJlcS0+Zm9yY2UpIHsKKwkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwkJd2FpdF9ldmVudChyZXEtPndhaXRxLCByZXEtPnN0YXRlID09IEZVU0VfUkVRX0ZJTklTSEVEKTsKKwkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CisJfSBlbHNlIHsKKwkJc2lnc2V0X3Qgb2xkc2V0OworCisJCS8qIE9ubHkgZmF0YWwgc2lnbmFscyBtYXkgaW50ZXJydXB0IHRoaXMgKi8KKwkJYmxvY2tfc2lncygmb2xkc2V0KTsKKwkJd2FpdF9hbnN3ZXJfaW50ZXJydXB0aWJsZShmYywgcmVxKTsKKwkJcmVzdG9yZV9zaWdzKCZvbGRzZXQpOworCX0KKworCWlmIChyZXEtPmFib3J0ZWQpCisJCWdvdG8gYWJvcnRlZDsKKwlpZiAocmVxLT5zdGF0ZSA9PSBGVVNFX1JFUV9GSU5JU0hFRCkKKyAJCXJldHVybjsKKworCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlOVFI7CisJcmVxLT5hYm9ydGVkID0gMTsKKworIGFib3J0ZWQ6CiAJaWYgKHJlcS0+bG9ja2VkKSB7CiAJCS8qIFRoaXMgaXMgdW5pbnRlcnJ1cHRpYmxlIHNsZWVwLCBiZWNhdXNlIGRhdGEgaXMKIAkJICAgYmVpbmcgY29waWVkIHRvL2Zyb20gdGhlIGJ1ZmZlcnMgb2YgcmVxLiAgRHVyaW5nCkBAIC0yNjgsOCArMzA3LDExIEBACiAJaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfUEVORElORykgewogCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKIAkJX19mdXNlX3B1dF9yZXF1ZXN0KHJlcSk7Ci0JfSBlbHNlIGlmIChyZXEtPnN0YXRlID09IEZVU0VfUkVRX1NFTlQpCi0JCWJhY2tncm91bmRfcmVxdWVzdChmYywgcmVxKTsKKwl9IGVsc2UgaWYgKHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfU0VOVCkgeworCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCQl3YWl0X2V2ZW50KHJlcS0+d2FpdHEsIHJlcS0+c3RhdGUgPT0gRlVTRV9SRVFfRklOSVNIRUQpOworCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwl9CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsZW5fYXJncyh1bnNpZ25lZCBudW1hcmdzLCBzdHJ1Y3QgZnVzZV9hcmcgKmFyZ3MpCkBAIC0yODMsMTMgKzMyNSwxOSBAQAogCXJldHVybiBuYnl0ZXM7CiB9CiAKK3N0YXRpYyB1NjQgZnVzZV9nZXRfdW5pcXVlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQorIHsKKyAJZmMtPnJlcWN0cisrOworIAkvKiB6ZXJvIGlzIHNwZWNpYWwgKi8KKyAJaWYgKGZjLT5yZXFjdHIgPT0gMCkKKyAJCWZjLT5yZXFjdHIgPSAxOworCisJcmV0dXJuIGZjLT5yZXFjdHI7Cit9CisKIHN0YXRpYyB2b2lkIHF1ZXVlX3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewotCWZjLT5yZXFjdHIrKzsKLQkvKiB6ZXJvIGlzIHNwZWNpYWwgKi8KLQlpZiAoZmMtPnJlcWN0ciA9PSAwKQotCQlmYy0+cmVxY3RyID0gMTsKLQlyZXEtPmluLmgudW5pcXVlID0gZmMtPnJlcWN0cjsKKwlyZXEtPmluLmgudW5pcXVlID0gZnVzZV9nZXRfdW5pcXVlKGZjKTsKIAlyZXEtPmluLmgubGVuID0gc2l6ZW9mKHN0cnVjdCBmdXNlX2luX2hlYWRlcikgKwogCQlsZW5fYXJncyhyZXEtPmluLm51bWFyZ3MsIChzdHJ1Y3QgZnVzZV9hcmcgKikgcmVxLT5pbi5hcmdzKTsKIAlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZmYy0+cGVuZGluZyk7CkBAIC0zMDIsOSArMzUwLDYgQEAKIAlraWxsX2Zhc3luYygmZmMtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogfQogCi0vKgotICogVGhpcyBjYW4gb25seSBiZSBpbnRlcnJ1cHRlZCBieSBhIFNJR0tJTEwKLSAqLwogdm9pZCByZXF1ZXN0X3NlbmQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCXJlcS0+aXNyZXBseSA9IDE7CkBAIC0zMjcsOCArMzcyLDEyIEBACiBzdGF0aWMgdm9pZCByZXF1ZXN0X3NlbmRfbm93YWl0KHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKIHsKIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQliYWNrZ3JvdW5kX3JlcXVlc3QoZmMsIHJlcSk7CiAJaWYgKGZjLT5jb25uZWN0ZWQpIHsKKwkJcmVxLT5iYWNrZ3JvdW5kID0gMTsKKwkJZmMtPm51bV9iYWNrZ3JvdW5kKys7CisJCWlmIChmYy0+bnVtX2JhY2tncm91bmQgPT0gRlVTRV9NQVhfQkFDS0dST1VORCkKKwkJCWZjLT5ibG9ja2VkID0gMTsKKwogCQlxdWV1ZV9yZXF1ZXN0KGZjLCByZXEpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCX0gZWxzZSB7CkBAIC0zNTIsMTQgKzQwMSwxNCBAQAogLyoKICAqIExvY2sgdGhlIHJlcXVlc3QuICBVcCB0byB0aGUgbmV4dCB1bmxvY2tfcmVxdWVzdCgpIHRoZXJlIG11c3RuJ3QgYmUKICAqIGFueXRoaW5nIHRoYXQgY291bGQgY2F1c2UgYSBwYWdlLWZhdWx0LiAgSWYgdGhlIHJlcXVlc3Qgd2FzIGFscmVhZHkKLSAqIGludGVycnVwdGVkIGJhaWwgb3V0LgorICogYWJvcnRlZCBiYWlsIG91dC4KICAqLwogc3RhdGljIGludCBsb2NrX3JlcXVlc3Qoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxKQogewogCWludCBlcnIgPSAwOwogCWlmIChyZXEpIHsKIAkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7Ci0JCWlmIChyZXEtPmludGVycnVwdGVkKQorCQlpZiAocmVxLT5hYm9ydGVkKQogCQkJZXJyID0gLUVOT0VOVDsKIAkJZWxzZQogCQkJcmVxLT5sb2NrZWQgPSAxOwpAQCAtMzY5LDcgKzQxOCw3IEBACiB9CiAKIC8qCi0gKiBVbmxvY2sgcmVxdWVzdC4gIElmIGl0IHdhcyBpbnRlcnJ1cHRlZCBkdXJpbmcgYmVpbmcgbG9ja2VkLCB0aGUKKyAqIFVubG9jayByZXF1ZXN0LiAgSWYgaXQgd2FzIGFib3J0ZWQgZHVyaW5nIGJlaW5nIGxvY2tlZCwgdGhlCiAgKiByZXF1ZXN0ZXIgdGhyZWFkIGlzIGN1cnJlbnRseSB3YWl0aW5nIGZvciBpdCB0byBiZSB1bmxvY2tlZCwgc28KICAqIHdha2UgaXQgdXAuCiAgKi8KQEAgLTM3OCw3ICs0MjcsNyBAQAogCWlmIChyZXEpIHsKIAkJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJCXJlcS0+bG9ja2VkID0gMDsKLQkJaWYgKHJlcS0+aW50ZXJydXB0ZWQpCisJCWlmIChyZXEtPmFib3J0ZWQpCiAJCQl3YWtlX3VwKCZyZXEtPndhaXRxKTsKIAkJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKIAl9CkBAIC01NTcsMTMgKzYwNiwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgcmVxdWVzdF9wZW5kaW5nKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpIHx8ICFsaXN0X2VtcHR5KCZmYy0+aW50ZXJydXB0cyk7Cit9CisKIC8qIFdhaXQgdW50aWwgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSBvbiB0aGUgcGVuZGluZyBsaXN0ICovCiBzdGF0aWMgdm9pZCByZXF1ZXN0X3dhaXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAKIAlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJmZjLT53YWl0cSwgJndhaXQpOwotCXdoaWxlIChmYy0+Y29ubmVjdGVkICYmIGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkgeworCXdoaWxlIChmYy0+Y29ubmVjdGVkICYmICFyZXF1ZXN0X3BlbmRpbmcoZmMpKSB7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCWJyZWFrOwpAQCAtNTc3LDExICs2MzEsNTAgQEAKIH0KIAogLyoKKyAqIFRyYW5zZmVyIGFuIGludGVycnVwdCByZXF1ZXN0IHRvIHVzZXJzcGFjZQorICoKKyAqIFVubGlrZSBvdGhlciByZXF1ZXN0cyB0aGlzIGlzIGFzc2VtYmxlZCBvbiBkZW1hbmQsIHdpdGhvdXQgYSBuZWVkCisgKiB0byBhbGxvY2F0ZSBhIHNlcGFyYXRlIGZ1c2VfcmVxIHN0cnVjdHVyZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBmYy0+bG9jayBoZWxkLCByZWxlYXNlcyBpdAorICovCitzdGF0aWMgaW50IGZ1c2VfcmVhZF9pbnRlcnJ1cHQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX3JlcSAqcmVxLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZ1c2VfY29weV9zdGF0ZSBjczsKKwlzdHJ1Y3QgZnVzZV9pbl9oZWFkZXIgaWg7CisJc3RydWN0IGZ1c2VfaW50ZXJydXB0X2luIGFyZzsKKwl1bnNpZ25lZCByZXFzaXplID0gc2l6ZW9mKGloKSArIHNpemVvZihhcmcpOworCWludCBlcnI7CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPmludHJfZW50cnkpOworCXJlcS0+aW50cl91bmlxdWUgPSBmdXNlX2dldF91bmlxdWUoZmMpOworCW1lbXNldCgmaWgsIDAsIHNpemVvZihpaCkpOworCW1lbXNldCgmYXJnLCAwLCBzaXplb2YoYXJnKSk7CisJaWgubGVuID0gcmVxc2l6ZTsKKwlpaC5vcGNvZGUgPSBGVVNFX0lOVEVSUlVQVDsKKwlpaC51bmlxdWUgPSByZXEtPmludHJfdW5pcXVlOworCWFyZy51bmlxdWUgPSByZXEtPmluLmgudW5pcXVlOworCisJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKKwlpZiAoaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpIDwgcmVxc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmdXNlX2NvcHlfaW5pdCgmY3MsIGZjLCAxLCBOVUxMLCBpb3YsIG5yX3NlZ3MpOworCWVyciA9IGZ1c2VfY29weV9vbmUoJmNzLCAmaWgsIHNpemVvZihpaCkpOworCWlmICghZXJyKQorCQllcnIgPSBmdXNlX2NvcHlfb25lKCZjcywgJmFyZywgc2l6ZW9mKGFyZykpOworCWZ1c2VfY29weV9maW5pc2goJmNzKTsKKworCXJldHVybiBlcnIgPyBlcnIgOiByZXFzaXplOworfQorCisvKgogICogUmVhZCBhIHNpbmdsZSByZXF1ZXN0IGludG8gdGhlIHVzZXJzcGFjZSBmaWxlc3lzdGVtJ3MgYnVmZmVyLiAgVGhpcwogICogZnVuY3Rpb24gd2FpdHMgdW50aWwgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSwgdGhlbiByZW1vdmVzIGl0IGZyb20KICAqIHRoZSBwZW5kaW5nIGxpc3QgYW5kIGNvcGllcyByZXF1ZXN0IGRhdGEgdG8gdXNlcnNwYWNlIGJ1ZmZlci4gIElmCi0gKiBubyByZXBseSBpcyBuZWVkZWQgKEZPUkdFVCkgb3IgcmVxdWVzdCBoYXMgYmVlbiBpbnRlcnJ1cHRlZCBvcgotICogdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgY29weWluZyB0aGVuIGl0J3MgZmluaXNoZWQgYnkgY2FsbGluZworICogbm8gcmVwbHkgaXMgbmVlZGVkIChGT1JHRVQpIG9yIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCBvciB0aGVyZQorICogd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgY29weWluZyB0aGVuIGl0J3MgZmluaXNoZWQgYnkgY2FsbGluZwogICogcmVxdWVzdF9lbmQoKS4gIE90aGVyd2lzZSBhZGQgaXQgdG8gdGhlIHByb2Nlc3NpbmcgbGlzdCwgYW5kIHNldAogICogdGhlICdzZW50JyBmbGFnLgogICovCkBAIC02MDEsNyArNjk0LDcgQEAKIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAllcnIgPSAtRUFHQUlOOwogCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICYmIGZjLT5jb25uZWN0ZWQgJiYKLQkgICAgbGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpKQorCSAgICAhcmVxdWVzdF9wZW5kaW5nKGZjKSkKIAkJZ290byBlcnJfdW5sb2NrOwogCiAJcmVxdWVzdF93YWl0KGZjKTsKQEAgLTYwOSw5ICs3MDIsMTUgQEAKIAlpZiAoIWZjLT5jb25uZWN0ZWQpCiAJCWdvdG8gZXJyX3VubG9jazsKIAllcnIgPSAtRVJFU1RBUlRTWVM7Ci0JaWYgKGxpc3RfZW1wdHkoJmZjLT5wZW5kaW5nKSkKKwlpZiAoIXJlcXVlc3RfcGVuZGluZyhmYykpCiAJCWdvdG8gZXJyX3VubG9jazsKIAorCWlmICghbGlzdF9lbXB0eSgmZmMtPmludGVycnVwdHMpKSB7CisJCXJlcSA9IGxpc3RfZW50cnkoZmMtPmludGVycnVwdHMubmV4dCwgc3RydWN0IGZ1c2VfcmVxLAorCQkJCSBpbnRyX2VudHJ5KTsKKwkJcmV0dXJuIGZ1c2VfcmVhZF9pbnRlcnJ1cHQoZmMsIHJlcSwgaW92LCBucl9zZWdzKTsKKwl9CisKIAlyZXEgPSBsaXN0X2VudHJ5KGZjLT5wZW5kaW5nLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CiAJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1JFQURJTkc7CiAJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwpAQCAtNjM2LDEwICs3MzUsMTAgQEAKIAlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJcmVxLT5sb2NrZWQgPSAwOwotCWlmICghZXJyICYmIHJlcS0+aW50ZXJydXB0ZWQpCisJaWYgKCFlcnIgJiYgcmVxLT5hYm9ydGVkKQogCQllcnIgPSAtRU5PRU5UOwogCWlmIChlcnIpIHsKLQkJaWYgKCFyZXEtPmludGVycnVwdGVkKQorCQlpZiAoIXJlcS0+YWJvcnRlZCkKIAkJCXJlcS0+b3V0LmguZXJyb3IgPSAtRUlPOwogCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKIAkJcmV0dXJuIGVycjsKQEAgLTY0OSw2ICs3NDgsOCBAQAogCWVsc2UgewogCQlyZXEtPnN0YXRlID0gRlVTRV9SRVFfU0VOVDsKIAkJbGlzdF9tb3ZlX3RhaWwoJnJlcS0+bGlzdCwgJmZjLT5wcm9jZXNzaW5nKTsKKwkJaWYgKHJlcS0+aW50ZXJydXB0ZWQpCisJCQlxdWV1ZV9pbnRlcnJ1cHQoZmMsIHJlcSk7CiAJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7CiAJfQogCXJldHVybiByZXFzaXplOwpAQCAtNjc1LDcgKzc3Niw3IEBACiAJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmZjLT5wcm9jZXNzaW5nKSB7CiAJCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwogCQlyZXEgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZnVzZV9yZXEsIGxpc3QpOwotCQlpZiAocmVxLT5pbi5oLnVuaXF1ZSA9PSB1bmlxdWUpCisJCWlmIChyZXEtPmluLmgudW5pcXVlID09IHVuaXF1ZSB8fCByZXEtPmludHJfdW5pcXVlID09IHVuaXF1ZSkKIAkJCXJldHVybiByZXE7CiAJfQogCXJldHVybiBOVUxMOwpAQCAtNzQxLDE3ICs4NDIsMzMgQEAKIAkJZ290byBlcnJfdW5sb2NrOwogCiAJcmVxID0gcmVxdWVzdF9maW5kKGZjLCBvaC51bmlxdWUpOwotCWVyciA9IC1FSU5WQUw7CiAJaWYgKCFyZXEpCiAJCWdvdG8gZXJyX3VubG9jazsKIAotCWlmIChyZXEtPmludGVycnVwdGVkKSB7CisJaWYgKHJlcS0+YWJvcnRlZCkgewogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CiAJCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCQlyZXF1ZXN0X2VuZChmYywgcmVxKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQorCS8qIElzIGl0IGFuIGludGVycnVwdCByZXBseT8gKi8KKwlpZiAocmVxLT5pbnRyX3VuaXF1ZSA9PSBvaC51bmlxdWUpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJaWYgKG5ieXRlcyAhPSBzaXplb2Yoc3RydWN0IGZ1c2Vfb3V0X2hlYWRlcikpCisJCQlnb3RvIGVycl91bmxvY2s7CisKKwkJaWYgKG9oLmVycm9yID09IC1FTk9TWVMpCisJCQlmYy0+bm9faW50ZXJydXB0ID0gMTsKKwkJZWxzZSBpZiAob2guZXJyb3IgPT0gLUVBR0FJTikKKwkJCXF1ZXVlX2ludGVycnVwdChmYywgcmVxKTsKKworCQlzcGluX3VubG9jaygmZmMtPmxvY2spOworCQlmdXNlX2NvcHlfZmluaXNoKCZjcyk7CisJCXJldHVybiBuYnl0ZXM7CisJfQorCisJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX1dSSVRJTkc7CiAJbGlzdF9tb3ZlKCZyZXEtPmxpc3QsICZmYy0+aW8pOwogCXJlcS0+b3V0LmggPSBvaDsKIAlyZXEtPmxvY2tlZCA9IDE7CkBAIC03NjQsOSArODgxLDkgQEAKIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKIAlyZXEtPmxvY2tlZCA9IDA7CiAJaWYgKCFlcnIpIHsKLQkJaWYgKHJlcS0+aW50ZXJydXB0ZWQpCisJCWlmIChyZXEtPmFib3J0ZWQpCiAJCQllcnIgPSAtRU5PRU5UOwotCX0gZWxzZSBpZiAoIXJlcS0+aW50ZXJydXB0ZWQpCisJfSBlbHNlIGlmICghcmVxLT5hYm9ydGVkKQogCQlyZXEtPm91dC5oLmVycm9yID0gLUVJTzsKIAlyZXF1ZXN0X2VuZChmYywgcmVxKTsKIApAQCAtODAwLDcgKzkxNyw3IEBACiAJc3Bpbl9sb2NrKCZmYy0+bG9jayk7CiAJaWYgKCFmYy0+Y29ubmVjdGVkKQogCQltYXNrID0gUE9MTEVSUjsKLQllbHNlIGlmICghbGlzdF9lbXB0eSgmZmMtPnBlbmRpbmcpKQorCWVsc2UgaWYgKHJlcXVlc3RfcGVuZGluZyhmYykpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCkBAIC04MjYsNyArOTQzLDcgQEAKIC8qCiAgKiBBYm9ydCByZXF1ZXN0cyB1bmRlciBJL08KICAqCi0gKiBUaGUgcmVxdWVzdHMgYXJlIHNldCB0byBpbnRlcnJ1cHRlZCBhbmQgZmluaXNoZWQsIGFuZCB0aGUgcmVxdWVzdAorICogVGhlIHJlcXVlc3RzIGFyZSBzZXQgdG8gYWJvcnRlZCBhbmQgZmluaXNoZWQsIGFuZCB0aGUgcmVxdWVzdAogICogd2FpdGVyIGlzIHdva2VuIHVwLiAgVGhpcyB3aWxsIG1ha2UgcmVxdWVzdF93YWl0X2Fuc3dlcigpIHdhaXQKICAqIHVudGlsIHRoZSByZXF1ZXN0IGlzIHVubG9ja2VkIGFuZCB0aGVuIHJldHVybi4KICAqCkBAIC04NDEsNyArOTU4LDcgQEAKIAkJCWxpc3RfZW50cnkoZmMtPmlvLm5leHQsIHN0cnVjdCBmdXNlX3JlcSwgbGlzdCk7CiAJCXZvaWQgKCplbmQpIChzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKSA9IHJlcS0+ZW5kOwogCi0JCXJlcS0+aW50ZXJydXB0ZWQgPSAxOworCQlyZXEtPmFib3J0ZWQgPSAxOwogCQlyZXEtPm91dC5oLmVycm9yID0gLUVDT05OQUJPUlRFRDsKIAkJcmVxLT5zdGF0ZSA9IEZVU0VfUkVRX0ZJTklTSEVEOwogCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOwpAQCAtODc0LDE5ICs5OTEsMjAgQEAKICAqIG9udG8gdGhlIHBlbmRpbmcgbGlzdCBpcyBwcmV2ZW50ZWQgYnkgcmVxLT5jb25uZWN0ZWQgYmVpbmcgZmFsc2UuCiAgKgogICogUHJvZ3Jlc3Npb24gb2YgcmVxdWVzdHMgdW5kZXIgSS9PIHRvIHRoZSBwcm9jZXNzaW5nIGxpc3QgaXMKLSAqIHByZXZlbnRlZCBieSB0aGUgcmVxLT5pbnRlcnJ1cHRlZCBmbGFnIGJlaW5nIHRydWUgZm9yIHRoZXNlCi0gKiByZXF1ZXN0cy4gIEZvciB0aGlzIHJlYXNvbiByZXF1ZXN0cyBvbiB0aGUgaW8gbGlzdCBtdXN0IGJlIGFib3J0ZWQKLSAqIGZpcnN0LgorICogcHJldmVudGVkIGJ5IHRoZSByZXEtPmFib3J0ZWQgZmxhZyBiZWluZyB0cnVlIGZvciB0aGVzZSByZXF1ZXN0cy4KKyAqIEZvciB0aGlzIHJlYXNvbiByZXF1ZXN0cyBvbiB0aGUgaW8gbGlzdCBtdXN0IGJlIGFib3J0ZWQgZmlyc3QuCiAgKi8KIHZvaWQgZnVzZV9hYm9ydF9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKQogewogCXNwaW5fbG9jaygmZmMtPmxvY2spOwogCWlmIChmYy0+Y29ubmVjdGVkKSB7CiAJCWZjLT5jb25uZWN0ZWQgPSAwOworCQlmYy0+YmxvY2tlZCA9IDA7CiAJCWVuZF9pb19yZXF1ZXN0cyhmYyk7CiAJCWVuZF9yZXF1ZXN0cyhmYywgJmZjLT5wZW5kaW5nKTsKIAkJZW5kX3JlcXVlc3RzKGZjLCAmZmMtPnByb2Nlc3NpbmcpOwogCQl3YWtlX3VwX2FsbCgmZmMtPndhaXRxKTsKKwkJd2FrZV91cF9hbGwoJmZjLT5ibG9ja2VkX3dhaXRxKTsKIAkJa2lsbF9mYXN5bmMoJmZjLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIAl9CiAJc3Bpbl91bmxvY2soJmZjLT5sb2NrKTsKQEAgLTkwMiw3ICsxMDIwLDcgQEAKIAkJZW5kX3JlcXVlc3RzKGZjLCAmZmMtPnByb2Nlc3NpbmcpOwogCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQlmYXN5bmNfaGVscGVyKC0xLCBmaWxlLCAwLCAmZmMtPmZhc3luYyk7Ci0JCWtvYmplY3RfcHV0KCZmYy0+a29iaik7CisJCWZ1c2VfY29ubl9wdXQoZmMpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9kaXIuYyBiL2ZzL2Z1c2UvZGlyLmMKaW5kZXggOGQ3NTQ2ZS4uNzJhNzRjZCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9kaXIuYworKysgYi9mcy9mdXNlL2Rpci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAgRlVTRTogRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UKLSAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KIAogICBUaGlzIHByb2dyYW0gY2FuIGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTC4KICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC03OSw3ICs3OSw2IEBACiB7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfTE9PS1VQOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChkaXIpOwotCXJlcS0+aW5vZGUgPSBkaXI7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7CkBAIC0yMjUsNiArMjI0LDIwIEBACiB9CiAKIC8qCisgKiBTeW5jaHJvbm91cyByZWxlYXNlIGZvciB0aGUgY2FzZSB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIGluIENSRUFURV9PUEVOCisgKi8KK3N0YXRpYyB2b2lkIGZ1c2Vfc3luY19yZWxlYXNlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9maWxlICpmZiwKKwkJCSAgICAgIHU2NCBub2RlaWQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKworCXJlcSA9IGZ1c2VfcmVsZWFzZV9maWxsKGZmLCBub2RlaWQsIGZsYWdzLCBGVVNFX1JFTEVBU0UpOworCXJlcS0+Zm9yY2UgPSAxOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworfQorCisvKgogICogQXRvbWljIGNyZWF0ZStvcGVuIG9wZXJhdGlvbgogICoKICAqIElmIHRoZSBmaWxlc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCB0aGVuIGZhbGwgYmFjayB0byBzZXBhcmF0ZQpAQCAtMjM3LDYgKzI1MCw3IEBACiAJc3RydWN0IGlub2RlICppbm9kZTsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oZGlyKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKmZvcmdldF9yZXE7CiAJc3RydWN0IGZ1c2Vfb3Blbl9pbiBpbmFyZzsKIAlzdHJ1Y3QgZnVzZV9vcGVuX291dCBvdXRvcGVuOwogCXN0cnVjdCBmdXNlX2VudHJ5X291dCBvdXRlbnRyeTsKQEAgLTI0Nyw5ICsyNjEsMTQgQEAKIAlpZiAoZmMtPm5vX2NyZWF0ZSkKIAkJcmV0dXJuIC1FTk9TWVM7CiAKKwlmb3JnZXRfcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKKwlpZiAoSVNfRVJSKGZvcmdldF9yZXEpKQorCQlyZXR1cm4gUFRSX0VSUihmb3JnZXRfcmVxKTsKKwogCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJZXJyID0gUFRSX0VSUihyZXEpOwogCWlmIChJU19FUlIocmVxKSkKLQkJcmV0dXJuIFBUUl9FUlIocmVxKTsKKwkJZ290byBvdXRfcHV0X2ZvcmdldF9yZXE7CiAKIAllcnIgPSAtRU5PTUVNOwogCWZmID0gZnVzZV9maWxlX2FsbG9jKCk7CkBAIC0yNjIsNyArMjgxLDYgQEAKIAlpbmFyZy5tb2RlID0gbW9kZTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9DUkVBVEU7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7Ci0JcmVxLT5pbm9kZSA9IGRpcjsKIAlyZXEtPmluLm51bWFyZ3MgPSAyOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CkBAIC0yODUsMjUgKzMwMywyMyBAQAogCWlmICghU19JU1JFRyhvdXRlbnRyeS5hdHRyLm1vZGUpIHx8IGludmFsaWRfbm9kZWlkKG91dGVudHJ5Lm5vZGVpZCkpCiAJCWdvdG8gb3V0X2ZyZWVfZmY7CiAKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOwogCWlub2RlID0gZnVzZV9pZ2V0KGRpci0+aV9zYiwgb3V0ZW50cnkubm9kZWlkLCBvdXRlbnRyeS5nZW5lcmF0aW9uLAogCQkJICAmb3V0ZW50cnkuYXR0cik7Ci0JZXJyID0gLUVOT01FTTsKIAlpZiAoIWlub2RlKSB7CiAJCWZsYWdzICY9IH4oT19DUkVBVCB8IE9fRVhDTCB8IE9fVFJVTkMpOwogCQlmZi0+ZmggPSBvdXRvcGVuLmZoOwotCQkvKiBTcGVjaWFsIHJlbGVhc2UsIHdpdGggaW5vZGUgPSBOVUxMLCB0aGlzIHdpbGwKLQkJICAgdHJpZ2dlciBhICdmb3JnZXQnIHJlcXVlc3Qgd2hlbiB0aGUgcmVsZWFzZSBpcwotCQkgICBjb21wbGV0ZSAqLwotCQlmdXNlX3NlbmRfcmVsZWFzZShmYywgZmYsIG91dGVudHJ5Lm5vZGVpZCwgTlVMTCwgZmxhZ3MsIDApOwotCQlnb3RvIG91dF9wdXRfcmVxdWVzdDsKKwkJZnVzZV9zeW5jX3JlbGVhc2UoZmMsIGZmLCBvdXRlbnRyeS5ub2RlaWQsIGZsYWdzKTsKKwkJZnVzZV9zZW5kX2ZvcmdldChmYywgZm9yZ2V0X3JlcSwgb3V0ZW50cnkubm9kZWlkLCAxKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJZnVzZV9wdXRfcmVxdWVzdChmYywgZm9yZ2V0X3JlcSk7CiAJZF9pbnN0YW50aWF0ZShlbnRyeSwgaW5vZGUpOwogCWZ1c2VfY2hhbmdlX3RpbWVvdXQoZW50cnksICZvdXRlbnRyeSk7CiAJZmlsZSA9IGxvb2t1cF9pbnN0YW50aWF0ZV9maWxwKG5kLCBlbnRyeSwgZ2VuZXJpY19maWxlX29wZW4pOwogCWlmIChJU19FUlIoZmlsZSkpIHsKIAkJZmYtPmZoID0gb3V0b3Blbi5maDsKLQkJZnVzZV9zZW5kX3JlbGVhc2UoZmMsIGZmLCBvdXRlbnRyeS5ub2RlaWQsIGlub2RlLCBmbGFncywgMCk7CisJCWZ1c2Vfc3luY19yZWxlYXNlKGZjLCBmZiwgb3V0ZW50cnkubm9kZWlkLCBmbGFncyk7CiAJCXJldHVybiBQVFJfRVJSKGZpbGUpOwogCX0KIAlmdXNlX2ZpbmlzaF9vcGVuKGlub2RlLCBmaWxlLCBmZiwgJm91dG9wZW4pOwpAQCAtMzEzLDYgKzMyOSw4IEBACiAJZnVzZV9maWxlX2ZyZWUoZmYpOwogIG91dF9wdXRfcmVxdWVzdDoKIAlmdXNlX3B1dF9yZXF1ZXN0KGZjLCByZXEpOworIG91dF9wdXRfZm9yZ2V0X3JlcToKKwlmdXNlX3B1dF9yZXF1ZXN0KGZjLCBmb3JnZXRfcmVxKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zMjgsNyArMzQ2LDYgQEAKIAlpbnQgZXJyOwogCiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGRpcik7Ci0JcmVxLT5pbm9kZSA9IGRpcjsKIAlyZXEtPm91dC5udW1hcmdzID0gMTsKIAlyZXEtPm91dC5hcmdzWzBdLnNpemUgPSBzaXplb2Yob3V0YXJnKTsKIAlyZXEtPm91dC5hcmdzWzBdLnZhbHVlID0gJm91dGFyZzsKQEAgLTQ0OCw3ICs0NjUsNiBAQAogCiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfVU5MSU5LOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChkaXIpOwotCXJlcS0+aW5vZGUgPSBkaXI7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7CkBAIC00ODAsNyArNDk2LDYgQEAKIAogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1JNRElSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChkaXIpOwotCXJlcS0+aW5vZGUgPSBkaXI7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IGVudHJ5LT5kX25hbWUubGVuICsgMTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSBlbnRyeS0+ZF9uYW1lLm5hbWU7CkBAIC01MTAsOCArNTI1LDYgQEAKIAlpbmFyZy5uZXdkaXIgPSBnZXRfbm9kZV9pZChuZXdkaXIpOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1JFTkFNRTsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQob2xkZGlyKTsKLQlyZXEtPmlub2RlID0gb2xkZGlyOwotCXJlcS0+aW5vZGUyID0gbmV3ZGlyOwogCXJlcS0+aW4ubnVtYXJncyA9IDM7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTU1OCw3ICs1NzEsNiBAQAogCW1lbXNldCgmaW5hcmcsIDAsIHNpemVvZihpbmFyZykpOwogCWluYXJnLm9sZG5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9MSU5LOwotCXJlcS0+aW5vZGUyID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMjsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtNTg3LDcgKzU5OSw2IEBACiAKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9HRVRBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihhcmcpOwogCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmYXJnOwpAQCAtNjc5LDcgKzY5MCw2IEBACiAJaW5hcmcubWFzayA9IG1hc2s7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfQUNDRVNTOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTgyMCw3ICs4MzAsNiBAQAogCX0KIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9SRUFETElOSzsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPm91dC5hcmd2YXIgPSAxOwogCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOwogCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IFBBR0VfU0laRSAtIDE7CkBAIC05MzksNyArOTQ4LDYgQEAKIAlpYXR0cl90b19mYXR0cihhdHRyLCAmaW5hcmcpOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1NFVEFUVFI7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtMTAwMiw3ICsxMDEwLDYgQEAKIAlpbmFyZy5mbGFncyA9IGZsYWdzOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1NFVFhBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDM7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTEwNDEsNyArMTA0OCw2IEBACiAJaW5hcmcuc2l6ZSA9IHNpemU7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfR0VUWEFUVFI7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMjsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtMTA5MSw3ICsxMDk3LDYgQEAKIAlpbmFyZy5zaXplID0gc2l6ZTsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9MSVNUWEFUVFI7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtMTEzNSw3ICsxMTQwLDYgQEAKIAogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX1JFTU9WRVhBVFRSOwogCXJlcS0+aW4uaC5ub2RlaWQgPSBnZXRfbm9kZV9pZChpbm9kZSk7Ci0JcmVxLT5pbm9kZSA9IGlub2RlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzdHJsZW4obmFtZSkgKyAxOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IG5hbWU7CmRpZmYgLS1naXQgYS9mcy9mdXNlL2ZpbGUuYyBiL2ZzL2Z1c2UvZmlsZS5jCmluZGV4IGZjMzQyY2YuLjI4YWE4MWUgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZmlsZS5jCisrKyBiL2ZzL2Z1c2UvZmlsZS5jCkBAIC0zMCw3ICszMCw2IEBACiAJaW5hcmcuZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzICYgfihPX0NSRUFUIHwgT19FWENMIHwgT19OT0NUVFkgfCBPX1RSVU5DKTsKIAlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX09QRU5ESVIgOiBGVVNFX09QRU47CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihpbmFyZyk7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gJmluYXJnOwpAQCAtNDksOCArNDgsOCBAQAogCXN0cnVjdCBmdXNlX2ZpbGUgKmZmOwogCWZmID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1c2VfZmlsZSksIEdGUF9LRVJORUwpOwogCWlmIChmZikgewotCQlmZi0+cmVsZWFzZV9yZXEgPSBmdXNlX3JlcXVlc3RfYWxsb2MoKTsKLQkJaWYgKCFmZi0+cmVsZWFzZV9yZXEpIHsKKwkJZmYtPnJlc2VydmVkX3JlcSA9IGZ1c2VfcmVxdWVzdF9hbGxvYygpOworCQlpZiAoIWZmLT5yZXNlcnZlZF9yZXEpIHsKIAkJCWtmcmVlKGZmKTsKIAkJCWZmID0gTlVMTDsKIAkJfQpAQCAtNjAsNyArNTksNyBAQAogCiB2b2lkIGZ1c2VfZmlsZV9mcmVlKHN0cnVjdCBmdXNlX2ZpbGUgKmZmKQogewotCWZ1c2VfcmVxdWVzdF9mcmVlKGZmLT5yZWxlYXNlX3JlcSk7CisJZnVzZV9yZXF1ZXN0X2ZyZWUoZmYtPnJlc2VydmVkX3JlcSk7CiAJa2ZyZWUoZmYpOwogfQogCkBAIC0xMTMsMzcgKzExMiwyMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFNwZWNpYWwgY2FzZSBmb3IgZmFpbGVkIGlnZXQgaW4gQ1JFQVRFICovCi1zdGF0aWMgdm9pZCBmdXNlX3JlbGVhc2VfZW5kKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9yZXEgKnJlcSkKK3N0cnVjdCBmdXNlX3JlcSAqZnVzZV9yZWxlYXNlX2ZpbGwoc3RydWN0IGZ1c2VfZmlsZSAqZmYsIHU2NCBub2RlaWQsIGludCBmbGFncywKKwkJCQkgICBpbnQgb3Bjb2RlKQogewotCS8qIElmIGNhbGxlZCBmcm9tIGVuZF9pb19yZXF1ZXN0cygpLCByZXEgaGFzIG1vcmUgdGhhbiBvbmUKLQkgICByZWZlcmVuY2UgYW5kIGZ1c2VfcmVzZXRfcmVxdWVzdCgpIGNhbm5vdCB3b3JrICovCi0JaWYgKGZjLT5jb25uZWN0ZWQpIHsKLQkJdTY0IG5vZGVpZCA9IHJlcS0+aW4uaC5ub2RlaWQ7Ci0JCWZ1c2VfcmVzZXRfcmVxdWVzdChyZXEpOwotCQlmdXNlX3NlbmRfZm9yZ2V0KGZjLCByZXEsIG5vZGVpZCwgMSk7Ci0JfSBlbHNlCi0JCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7Ci19Ci0KLXZvaWQgZnVzZV9zZW5kX3JlbGVhc2Uoc3RydWN0IGZ1c2VfY29ubiAqZmMsIHN0cnVjdCBmdXNlX2ZpbGUgKmZmLAotCQkgICAgICAgdTY0IG5vZGVpZCwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzLCBpbnQgaXNkaXIpCi17Ci0Jc3RydWN0IGZ1c2VfcmVxICogcmVxID0gZmYtPnJlbGVhc2VfcmVxOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxID0gZmYtPnJlc2VydmVkX3JlcTsKIAlzdHJ1Y3QgZnVzZV9yZWxlYXNlX2luICppbmFyZyA9ICZyZXEtPm1pc2MucmVsZWFzZV9pbjsKIAogCWluYXJnLT5maCA9IGZmLT5maDsKIAlpbmFyZy0+ZmxhZ3MgPSBmbGFnczsKLQlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX1JFTEVBU0VESVIgOiBGVVNFX1JFTEVBU0U7CisJcmVxLT5pbi5oLm9wY29kZSA9IG9wY29kZTsKIAlyZXEtPmluLmgubm9kZWlkID0gbm9kZWlkOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKHN0cnVjdCBmdXNlX3JlbGVhc2VfaW4pOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9IGluYXJnOwotCXJlcXVlc3Rfc2VuZF9iYWNrZ3JvdW5kKGZjLCByZXEpOwotCWlmICghaW5vZGUpCi0JCXJlcS0+ZW5kID0gZnVzZV9yZWxlYXNlX2VuZDsKIAlrZnJlZShmZik7CisKKwlyZXR1cm4gcmVxOwogfQogCiBpbnQgZnVzZV9yZWxlYXNlX2NvbW1vbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGlzZGlyKQpAQCAtMTUxLDggKzEzNSwxNSBAQAogCXN0cnVjdCBmdXNlX2ZpbGUgKmZmID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWlmIChmZikgewogCQlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOwotCQl1NjQgbm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCQlmdXNlX3NlbmRfcmVsZWFzZShmYywgZmYsIG5vZGVpZCwgaW5vZGUsIGZpbGUtPmZfZmxhZ3MsIGlzZGlyKTsKKwkJc3RydWN0IGZ1c2VfcmVxICpyZXE7CisKKwkJcmVxID0gZnVzZV9yZWxlYXNlX2ZpbGwoZmYsIGdldF9ub2RlX2lkKGlub2RlKSwgZmlsZS0+Zl9mbGFncywKKwkJCQkJaXNkaXIgPyBGVVNFX1JFTEVBU0VESVIgOiBGVVNFX1JFTEVBU0UpOworCisJCS8qIEhvbGQgdmZzbW91bnQgYW5kIGRlbnRyeSB1bnRpbCByZWxlYXNlIGlzIGZpbmlzaGVkICovCisJCXJlcS0+dmZzbW91bnQgPSBtbnRnZXQoZmlsZS0+Zl92ZnNtbnQpOworCQlyZXEtPmRlbnRyeSA9IGRnZXQoZmlsZS0+Zl9kZW50cnkpOworCQlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKIAl9CiAKIAkvKiBSZXR1cm4gdmFsdWUgaXMgaWdub3JlZCBieSBWRlMgKi8KQEAgLTE2OSw3ICsxNjAsMjkgQEAKIAlyZXR1cm4gZnVzZV9yZWxlYXNlX2NvbW1vbihpbm9kZSwgZmlsZSwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9mbHVzaChzdHJ1Y3QgZmlsZSAqZmlsZSkKKy8qCisgKiBTY3JhbWJsZSB0aGUgSUQgc3BhY2Ugd2l0aCBYVEVBLCBzbyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgZmlsZXNfc3RydWN0CisgKiBwb2ludGVyIGlzIG5vdCBleHBvc2VkIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIHU2NCBmdXNlX2xvY2tfb3duZXJfaWQoc3RydWN0IGZ1c2VfY29ubiAqZmMsIGZsX293bmVyX3QgaWQpCit7CisJdTMyICprID0gZmMtPnNjcmFtYmxlX2tleTsKKwl1NjQgdiA9ICh1bnNpZ25lZCBsb25nKSBpZDsKKwl1MzIgdjAgPSB2OworCXUzMiB2MSA9IHYgPj4gMzI7CisJdTMyIHN1bSA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQl2MCArPSAoKHYxIDw8IDQgXiB2MSA+PiA1KSArIHYxKSBeIChzdW0gKyBrW3N1bSAmIDNdKTsKKwkJc3VtICs9IDB4OUUzNzc5Qjk7CisJCXYxICs9ICgodjAgPDwgNCBeIHYwID4+IDUpICsgdjApIF4gKHN1bSArIGtbc3VtPj4xMSAmIDNdKTsKKwl9CisKKwlyZXR1cm4gKHU2NCkgdjAgKyAoKHU2NCkgdjEgPDwgMzIpOworfQorCitzdGF0aWMgaW50IGZ1c2VfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CkBAIC0xODQsMTkgKzE5NywxNiBAQAogCWlmIChmYy0+bm9fZmx1c2gpCiAJCXJldHVybiAwOwogCi0JcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKLQlpZiAoSVNfRVJSKHJlcSkpCi0JCXJldHVybiBQVFJfRVJSKHJlcSk7Ci0KKwlyZXEgPSBmdXNlX2dldF9yZXFfbm9mYWlsKGZjLCBmaWxlKTsKIAltZW1zZXQoJmluYXJnLCAwLCBzaXplb2YoaW5hcmcpKTsKIAlpbmFyZy5maCA9IGZmLT5maDsKKwlpbmFyZy5sb2NrX293bmVyID0gZnVzZV9sb2NrX293bmVyX2lkKGZjLCBpZCk7CiAJcmVxLT5pbi5oLm9wY29kZSA9IEZVU0VfRkxVU0g7CiAJcmVxLT5pbi5oLm5vZGVpZCA9IGdldF9ub2RlX2lkKGlub2RlKTsKLQlyZXEtPmlub2RlID0gaW5vZGU7Ci0JcmVxLT5maWxlID0gZmlsZTsKIAlyZXEtPmluLm51bWFyZ3MgPSAxOwogCXJlcS0+aW4uYXJnc1swXS5zaXplID0gc2l6ZW9mKGluYXJnKTsKIAlyZXEtPmluLmFyZ3NbMF0udmFsdWUgPSAmaW5hcmc7CisJcmVxLT5mb3JjZSA9IDE7CiAJcmVxdWVzdF9zZW5kKGZjLCByZXEpOwogCWVyciA9IHJlcS0+b3V0LmguZXJyb3I7CiAJZnVzZV9wdXRfcmVxdWVzdChmYywgcmVxKTsKQEAgLTIzMiw4ICsyNDIsNiBAQAogCWluYXJnLmZzeW5jX2ZsYWdzID0gZGF0YXN5bmMgPyAxIDogMDsKIAlyZXEtPmluLmgub3Bjb2RlID0gaXNkaXIgPyBGVVNFX0ZTWU5DRElSIDogRlVTRV9GU1lOQzsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKLQlyZXEtPmZpbGUgPSBmaWxlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoaW5hcmcpOwogCXJlcS0+aW4uYXJnc1swXS52YWx1ZSA9ICZpbmFyZzsKQEAgLTI2Niw4ICsyNzQsNiBAQAogCWluYXJnLT5zaXplID0gY291bnQ7CiAJcmVxLT5pbi5oLm9wY29kZSA9IG9wY29kZTsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKLQlyZXEtPmZpbGUgPSBmaWxlOwogCXJlcS0+aW4ubnVtYXJncyA9IDE7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2VfcmVhZF9pbik7CiAJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gaW5hcmc7CkBAIC0zNDIsNiArMzQ4LDggQEAKIAlyZXEtPm91dC5wYWdlX3plcm9pbmcgPSAxOwogCWZ1c2VfcmVhZF9maWxsKHJlcSwgZmlsZSwgaW5vZGUsIHBvcywgY291bnQsIEZVU0VfUkVBRCk7CiAJaWYgKGZjLT5hc3luY19yZWFkKSB7CisJCWdldF9maWxlKGZpbGUpOworCQlyZXEtPmZpbGUgPSBmaWxlOwogCQlyZXEtPmVuZCA9IGZ1c2VfcmVhZHBhZ2VzX2VuZDsKIAkJcmVxdWVzdF9zZW5kX2JhY2tncm91bmQoZmMsIHJlcSk7CiAJfSBlbHNlIHsKQEAgLTQyMCw4ICs0MjgsNiBAQAogCWluYXJnLnNpemUgPSBjb3VudDsKIAlyZXEtPmluLmgub3Bjb2RlID0gRlVTRV9XUklURTsKIAlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOwotCXJlcS0+aW5vZGUgPSBpbm9kZTsKLQlyZXEtPmZpbGUgPSBmaWxlOwogCXJlcS0+aW4uYXJncGFnZXMgPSAxOwogCXJlcS0+aW4ubnVtYXJncyA9IDI7CiAJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2Yoc3RydWN0IGZ1c2Vfd3JpdGVfaW4pOwpAQCAtNjE5LDYgKzYyNSwxMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjb252ZXJ0X2Z1c2VfZmlsZV9sb2NrKGNvbnN0IHN0cnVjdCBmdXNlX2ZpbGVfbG9jayAqZmZsLAorCQkJCSAgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3dpdGNoIChmZmwtPnR5cGUpIHsKKwljYXNlIEZfVU5MQ0s6CisJCWJyZWFrOworCisJY2FzZSBGX1JETENLOgorCWNhc2UgRl9XUkxDSzoKKwkJaWYgKGZmbC0+c3RhcnQgPiBPRkZTRVRfTUFYIHx8IGZmbC0+ZW5kID4gT0ZGU0VUX01BWCB8fAorCQkgICAgZmZsLT5lbmQgPCBmZmwtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZmwtPmZsX3N0YXJ0ID0gZmZsLT5zdGFydDsKKwkJZmwtPmZsX2VuZCA9IGZmbC0+ZW5kOworCQlmbC0+ZmxfcGlkID0gZmZsLT5waWQ7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU87CisJfQorCWZsLT5mbF90eXBlID0gZmZsLT50eXBlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmdXNlX2xrX2ZpbGwoc3RydWN0IGZ1c2VfcmVxICpyZXEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBpbnQgb3Bjb2RlLCBwaWRfdCBwaWQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJc3RydWN0IGZ1c2VfZmlsZSAqZmYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZ1c2VfbGtfaW4gKmFyZyA9ICZyZXEtPm1pc2MubGtfaW47CisKKwlhcmctPmZoID0gZmYtPmZoOworCWFyZy0+b3duZXIgPSBmdXNlX2xvY2tfb3duZXJfaWQoZmMsIGZsLT5mbF9vd25lcik7CisJYXJnLT5say5zdGFydCA9IGZsLT5mbF9zdGFydDsKKwlhcmctPmxrLmVuZCA9IGZsLT5mbF9lbmQ7CisJYXJnLT5say50eXBlID0gZmwtPmZsX3R5cGU7CisJYXJnLT5say5waWQgPSBwaWQ7CisJcmVxLT5pbi5oLm9wY29kZSA9IG9wY29kZTsKKwlyZXEtPmluLmgubm9kZWlkID0gZ2V0X25vZGVfaWQoaW5vZGUpOworCXJlcS0+aW4ubnVtYXJncyA9IDE7CisJcmVxLT5pbi5hcmdzWzBdLnNpemUgPSBzaXplb2YoKmFyZyk7CisJcmVxLT5pbi5hcmdzWzBdLnZhbHVlID0gYXJnOworfQorCitzdGF0aWMgaW50IGZ1c2VfZ2V0bGsoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm4oaW5vZGUpOworCXN0cnVjdCBmdXNlX3JlcSAqcmVxOworCXN0cnVjdCBmdXNlX2xrX291dCBvdXRhcmc7CisJaW50IGVycjsKKworCXJlcSA9IGZ1c2VfZ2V0X3JlcShmYyk7CisJaWYgKElTX0VSUihyZXEpKQorCQlyZXR1cm4gUFRSX0VSUihyZXEpOworCisJZnVzZV9sa19maWxsKHJlcSwgZmlsZSwgZmwsIEZVU0VfR0VUTEssIDApOworCXJlcS0+b3V0Lm51bWFyZ3MgPSAxOworCXJlcS0+b3V0LmFyZ3NbMF0uc2l6ZSA9IHNpemVvZihvdXRhcmcpOworCXJlcS0+b3V0LmFyZ3NbMF0udmFsdWUgPSAmb3V0YXJnOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGNvbnZlcnRfZnVzZV9maWxlX2xvY2soJm91dGFyZy5saywgZmwpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmdXNlX3NldGxrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKKwlpbnQgb3Bjb2RlID0gKGZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSA/IEZVU0VfU0VUTEtXIDogRlVTRV9TRVRMSzsKKwlwaWRfdCBwaWQgPSBmbC0+ZmxfdHlwZSAhPSBGX1VOTENLID8gY3VycmVudC0+dGdpZCA6IDA7CisJaW50IGVycjsKKworCS8qIFVubG9jayBvbiBjbG9zZSBpcyBoYW5kbGVkIGJ5IHRoZSBmbHVzaCBtZXRob2QgKi8KKwlpZiAoZmwtPmZsX2ZsYWdzICYgRkxfQ0xPU0UpCisJCXJldHVybiAwOworCisJcmVxID0gZnVzZV9nZXRfcmVxKGZjKTsKKwlpZiAoSVNfRVJSKHJlcSkpCisJCXJldHVybiBQVFJfRVJSKHJlcSk7CisKKwlmdXNlX2xrX2ZpbGwocmVxLCBmaWxlLCBmbCwgb3Bjb2RlLCBwaWQpOworCXJlcXVlc3Rfc2VuZChmYywgcmVxKTsKKwllcnIgPSByZXEtPm91dC5oLmVycm9yOworCS8qIGxvY2tpbmcgaXMgcmVzdGFydGFibGUgKi8KKwlpZiAoZXJyID09IC1FSU5UUikKKwkJZXJyID0gLUVSRVNUQVJUU1lTOworCWZ1c2VfcHV0X3JlcXVlc3QoZmMsIHJlcSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmdXNlX2ZpbGVfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJaW50IGVycjsKKworCWlmIChjbWQgPT0gRl9HRVRMSykgeworCQlpZiAoZmMtPm5vX2xvY2spIHsKKwkJCWlmICghcG9zaXhfdGVzdF9sb2NrKGZpbGUsIGZsLCBmbCkpCisJCQkJZmwtPmZsX3R5cGUgPSBGX1VOTENLOworCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQllcnIgPSBmdXNlX2dldGxrKGZpbGUsIGZsKTsKKwl9IGVsc2UgeworCQlpZiAoZmMtPm5vX2xvY2spCisJCQllcnIgPSBwb3NpeF9sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbCk7CisJCWVsc2UKKwkJCWVyciA9IGZ1c2Vfc2V0bGsoZmlsZSwgZmwpOworCX0KKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdXNlX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCkBAIC02MjgsNiArNzU0LDcgQEAKIAkuZmx1c2gJCT0gZnVzZV9mbHVzaCwKIAkucmVsZWFzZQk9IGZ1c2VfcmVsZWFzZSwKIAkuZnN5bmMJCT0gZnVzZV9mc3luYywKKwkubG9jawkJPSBmdXNlX2ZpbGVfbG9jaywKIAkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCiB9OwogCkBAIC02MzksNiArNzY2LDcgQEAKIAkuZmx1c2gJCT0gZnVzZV9mbHVzaCwKIAkucmVsZWFzZQk9IGZ1c2VfcmVsZWFzZSwKIAkuZnN5bmMJCT0gZnVzZV9mc3luYywKKwkubG9jawkJPSBmdXNlX2ZpbGVfbG9jaywKIAkvKiBubyBtbWFwIGFuZCBzZW5kZmlsZSAqLwogfTsKIApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggMDQ3NDIwMi4uMGRiZjk2NiAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC04LDEyICs4LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9mdXNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+Ci0jaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKIC8qKiBNYXggbnVtYmVyIG9mIHBhZ2VzIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzaW5nbGUgcmVhZCByZXF1ZXN0ICovCiAjZGVmaW5lIEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEgMzIKQEAgLTI0LDYgKzI1LDkgQEAKIC8qKiBJdCBjb3VsZCBiZSBhcyBsYXJnZSBhcyBQQVRIX01BWCwgYnV0IHdvdWxkIHRoYXQgaGF2ZSBhbnkgdXNlcz8gKi8KICNkZWZpbmUgRlVTRV9OQU1FX01BWCAxMDI0CiAKKy8qKiBOdW1iZXIgb2YgZGVudHJpZXMgZm9yIGVhY2ggY29ubmVjdGlvbiBpbiB0aGUgY29udHJvbCBmaWxlc3lzdGVtICovCisjZGVmaW5lIEZVU0VfQ1RMX05VTV9ERU5UUklFUyAzCisKIC8qKiBJZiB0aGUgRlVTRV9ERUZBVUxUX1BFUk1JU1NJT05TIGZsYWcgaXMgZ2l2ZW4sIHRoZSBmaWxlc3lzdGVtCiAgICAgbW9kdWxlIHdpbGwgY2hlY2sgcGVybWlzc2lvbnMgYmFzZWQgb24gdGhlIGZpbGUgbW9kZS4gIE90aGVyd2lzZSBubwogICAgIHBlcm1pc3Npb24gY2hlY2tpbmcgaXMgZG9uZSBpbiB0aGUga2VybmVsICovCkBAIC0zMyw2ICszNywxMSBAQAogICAgIGRvaW5nIHRoZSBtb3VudCB3aWxsIGJlIGFsbG93ZWQgdG8gYWNjZXNzIHRoZSBmaWxlc3lzdGVtICovCiAjZGVmaW5lIEZVU0VfQUxMT1dfT1RIRVIgICAgICAgICAoMSA8PCAxKQogCisvKiogTGlzdCBvZiBhY3RpdmUgY29ubmVjdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGZ1c2VfY29ubl9saXN0OworCisvKiogR2xvYmFsIG11dGV4IHByb3RlY3RpbmcgZnVzZV9jb25uX2xpc3QgYW5kIHRoZSBjb250cm9sIGZpbGVzeXN0ZW0gKi8KK2V4dGVybiBzdHJ1Y3QgbXV0ZXggZnVzZV9tdXRleDsKIAogLyoqIEZVU0UgaW5vZGUgKi8KIHN0cnVjdCBmdXNlX2lub2RlIHsKQEAgLTU2LDcgKzY1LDcgQEAKIC8qKiBGVVNFIHNwZWNpZmljIGZpbGUgZGF0YSAqLwogc3RydWN0IGZ1c2VfZmlsZSB7CiAJLyoqIFJlcXVlc3QgcmVzZXJ2ZWQgZm9yIGZsdXNoIGFuZCByZWxlYXNlICovCi0Jc3RydWN0IGZ1c2VfcmVxICpyZWxlYXNlX3JlcTsKKwlzdHJ1Y3QgZnVzZV9yZXEgKnJlc2VydmVkX3JlcTsKIAogCS8qKiBGaWxlIGhhbmRsZSB1c2VkIGJ5IHVzZXJzcGFjZSAqLwogCXU2NCBmaDsKQEAgLTEyMiw2ICsxMzEsNyBAQAogCUZVU0VfUkVRX1BFTkRJTkcsCiAJRlVTRV9SRVFfUkVBRElORywKIAlGVVNFX1JFUV9TRU5ULAorCUZVU0VfUkVRX1dSSVRJTkcsCiAJRlVTRV9SRVFfRklOSVNIRUQKIH07CiAKQEAgLTEzNSwxMiArMTQ1LDE1IEBACiAJICAgIGZ1c2VfY29ubiAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAotCS8qKiBFbnRyeSBvbiB0aGUgYmFja2dyb3VuZCBsaXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBiZ19lbnRyeTsKKwkvKiogRW50cnkgb24gdGhlIGludGVycnVwdHMgbGlzdCAgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGludHJfZW50cnk7CiAKIAkvKiogcmVmY291bnQgKi8KIAlhdG9taWNfdCBjb3VudDsKIAorCS8qKiBVbmlxdWUgSUQgZm9yIHRoZSBpbnRlcnJ1cHQgcmVxdWVzdCAqLworCXU2NCBpbnRyX3VuaXF1ZTsKKwogCS8qCiAJICogVGhlIGZvbGxvd2luZyBiaXRmaWVsZHMgYXJlIGVpdGhlciBzZXQgb25jZSBiZWZvcmUgdGhlCiAJICogcmVxdWVzdCBpcyBxdWV1ZWQgb3Igc2V0dGluZy9jbGVhcmluZyB0aGVtIGlzIHByb3RlY3RlZCBieQpAQCAtMTUwLDEyICsxNjMsMTggQEAKIAkvKiogVHJ1ZSBpZiB0aGUgcmVxdWVzdCBoYXMgcmVwbHkgKi8KIAl1bnNpZ25lZCBpc3JlcGx5OjE7CiAKLQkvKiogVGhlIHJlcXVlc3Qgd2FzIGludGVycnVwdGVkICovCi0JdW5zaWduZWQgaW50ZXJydXB0ZWQ6MTsKKwkvKiogRm9yY2Ugc2VuZGluZyBvZiB0aGUgcmVxdWVzdCBldmVuIGlmIGludGVycnVwdGVkICovCisJdW5zaWduZWQgZm9yY2U6MTsKKworCS8qKiBUaGUgcmVxdWVzdCB3YXMgYWJvcnRlZCAqLworCXVuc2lnbmVkIGFib3J0ZWQ6MTsKIAogCS8qKiBSZXF1ZXN0IGlzIHNlbnQgaW4gdGhlIGJhY2tncm91bmQgKi8KIAl1bnNpZ25lZCBiYWNrZ3JvdW5kOjE7CiAKKwkvKiogVGhlIHJlcXVlc3QgaGFzIGJlZW4gaW50ZXJydXB0ZWQgKi8KKwl1bnNpZ25lZCBpbnRlcnJ1cHRlZDoxOworCiAJLyoqIERhdGEgaXMgYmVpbmcgY29waWVkIHRvL2Zyb20gdGhlIHJlcXVlc3QgKi8KIAl1bnNpZ25lZCBsb2NrZWQ6MTsKIApAQCAtMTgxLDYgKzIwMCw3IEBACiAJCXN0cnVjdCBmdXNlX2luaXRfaW4gaW5pdF9pbjsKIAkJc3RydWN0IGZ1c2VfaW5pdF9vdXQgaW5pdF9vdXQ7CiAJCXN0cnVjdCBmdXNlX3JlYWRfaW4gcmVhZF9pbjsKKwkJc3RydWN0IGZ1c2VfbGtfaW4gbGtfaW47CiAJfSBtaXNjOwogCiAJLyoqIHBhZ2UgdmVjdG9yICovCkBAIC0xOTIsMTcgKzIxMiwyMCBAQAogCS8qKiBvZmZzZXQgb2YgZGF0YSBvbiBmaXJzdCBwYWdlICovCiAJdW5zaWduZWQgcGFnZV9vZmZzZXQ7CiAKLQkvKiogSW5vZGUgdXNlZCBpbiB0aGUgcmVxdWVzdCAqLwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0KLQkvKiogU2Vjb25kIGlub2RlIHVzZWQgaW4gdGhlIHJlcXVlc3QgKG9yIE5VTEwpICovCi0Jc3RydWN0IGlub2RlICppbm9kZTI7Ci0KIAkvKiogRmlsZSB1c2VkIGluIHRoZSByZXF1ZXN0IChvciBOVUxMKSAqLwogCXN0cnVjdCBmaWxlICpmaWxlOwogCisJLyoqIHZmc21vdW50IHVzZWQgaW4gcmVsZWFzZSAqLworCXN0cnVjdCB2ZnNtb3VudCAqdmZzbW91bnQ7CisKKwkvKiogZGVudHJ5IHVzZWQgaW4gcmVsZWFzZSAqLworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwogCS8qKiBSZXF1ZXN0IGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KIAl2b2lkICgqZW5kKShzdHJ1Y3QgZnVzZV9jb25uICosIHN0cnVjdCBmdXNlX3JlcSAqKTsKKworCS8qKiBSZXF1ZXN0IGlzIHN0b2xlbiBmcm9tIGZ1c2VfZmlsZS0+cmVzZXJ2ZWRfcmVxICovCisJc3RydWN0IGZpbGUgKnN0b2xlbl9maWxlOwogfTsKIAogLyoqCkBAIC0yMTYsNiArMjM5LDkgQEAKIAkvKiogTG9jayBwcm90ZWN0aW5nIGFjY2Vzc2VzcyB0byAgbWVtYmVycyBvZiB0aGlzIHN0cnVjdHVyZSAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAorCS8qKiBSZWZjb3VudCAqLworCWF0b21pY190IGNvdW50OworCiAJLyoqIFRoZSB1c2VyIGlkIGZvciB0aGlzIG1vdW50ICovCiAJdWlkX3QgdXNlcl9pZDsKIApAQCAtMjQzLDEzICsyNjksMTIgQEAKIAkvKiogVGhlIGxpc3Qgb2YgcmVxdWVzdHMgdW5kZXIgSS9PICovCiAJc3RydWN0IGxpc3RfaGVhZCBpbzsKIAotCS8qKiBSZXF1ZXN0cyBwdXQgaW4gdGhlIGJhY2tncm91bmQgKFJFTEVBU0Ugb3IgYW55IG90aGVyCi0JICAgIGludGVycnVwdGVkIHJlcXVlc3QpICovCi0Jc3RydWN0IGxpc3RfaGVhZCBiYWNrZ3JvdW5kOwotCiAJLyoqIE51bWJlciBvZiByZXF1ZXN0cyBjdXJyZW50bHkgaW4gdGhlIGJhY2tncm91bmQgKi8KIAl1bnNpZ25lZCBudW1fYmFja2dyb3VuZDsKIAorCS8qKiBQZW5kaW5nIGludGVycnVwdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGludGVycnVwdHM7CisKIAkvKiogRmxhZyBpbmRpY2F0aW5nIGlmIGNvbm5lY3Rpb24gaXMgYmxvY2tlZC4gIFRoaXMgd2lsbCBiZQogCSAgICB0aGUgY2FzZSBiZWZvcmUgdGhlIElOSVQgcmVwbHkgaXMgcmVjZWl2ZWQsIGFuZCBpZiB0aGVyZQogCSAgICBhcmUgdG9vIG1hbnkgb3V0c3RhZGluZyBiYWNrZ3JvdW5kcyByZXF1ZXN0cyAqLwpAQCAtMjU4LDE1ICsyODMsOSBAQAogCS8qKiB3YWl0cSBmb3IgYmxvY2tlZCBjb25uZWN0aW9uICovCiAJd2FpdF9xdWV1ZV9oZWFkX3QgYmxvY2tlZF93YWl0cTsKIAotCS8qKiBSVyBzZW1hcGhvcmUgZm9yIGV4Y2x1c2lvbiB3aXRoIGZ1c2VfcHV0X3N1cGVyKCkgKi8KLQlzdHJ1Y3Qgcndfc2VtYXBob3JlIHNicHV0X3NlbTsKLQogCS8qKiBUaGUgbmV4dCB1bmlxdWUgcmVxdWVzdCBpZCAqLwogCXU2NCByZXFjdHI7CiAKLQkvKiogTW91bnQgaXMgYWN0aXZlICovCi0JdW5zaWduZWQgbW91bnRlZDsKLQogCS8qKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkLCBjbGVhcmVkIG9uIHVtb3VudCwgY29ubmVjdGlvbgogCSAgICBhYm9ydCBhbmQgZGV2aWNlIHJlbGVhc2UgKi8KIAl1bnNpZ25lZCBjb25uZWN0ZWQ7CkBAIC0zMDUsMTIgKzMyNCwxOCBAQAogCS8qKiBJcyByZW1vdmV4YXR0ciBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCiAJdW5zaWduZWQgbm9fcmVtb3ZleGF0dHIgOiAxOwogCisJLyoqIEFyZSBmaWxlIGxvY2tpbmcgcHJpbWl0aXZlcyBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCisJdW5zaWduZWQgbm9fbG9jayA6IDE7CisKIAkvKiogSXMgYWNjZXNzIG5vdCBpbXBsZW1lbnRlZCBieSBmcz8gKi8KIAl1bnNpZ25lZCBub19hY2Nlc3MgOiAxOwogCiAJLyoqIElzIGNyZWF0ZSBub3QgaW1wbGVtZW50ZWQgYnkgZnM/ICovCiAJdW5zaWduZWQgbm9fY3JlYXRlIDogMTsKIAorCS8qKiBJcyBpbnRlcnJ1cHQgbm90IGltcGxlbWVudGVkIGJ5IGZzPyAqLworCXVuc2lnbmVkIG5vX2ludGVycnVwdCA6IDE7CisKIAkvKiogVGhlIG51bWJlciBvZiByZXF1ZXN0cyB3YWl0aW5nIGZvciBjb21wbGV0aW9uICovCiAJYXRvbWljX3QgbnVtX3dhaXRpbmc7CiAKQEAgLTMyMCwxMSArMzQ1LDIzIEBACiAJLyoqIEJhY2tpbmcgZGV2IGluZm8gKi8KIAlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyBiZGk7CiAKLQkvKioga29iamVjdCAqLwotCXN0cnVjdCBrb2JqZWN0IGtvYmo7CisJLyoqIEVudHJ5IG9uIHRoZSBmdXNlX2Nvbm5fbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisKKwkvKiogVW5pcXVlIElEICovCisJdTY0IGlkOworCisJLyoqIERlbnRyaWVzIGluIHRoZSBjb250cm9sIGZpbGVzeXN0ZW0gKi8KKwlzdHJ1Y3QgZGVudHJ5ICpjdGxfZGVudHJ5W0ZVU0VfQ1RMX05VTV9ERU5UUklFU107CisKKwkvKiogbnVtYmVyIG9mIGRlbnRyaWVzIHVzZWQgaW4gdGhlIGFib3ZlIGFycmF5ICovCisJaW50IGN0bF9uZGVudHM7CiAKIAkvKiogT19BU1lOQyByZXF1ZXN0cyAqLwogCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmM7CisKKwkvKiogS2V5IGZvciBsb2NrIG93bmVyIElEIHNjcmFtYmxpbmcgKi8KKwl1MzIgc2NyYW1ibGVfa2V5WzRdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9jb25uICpnZXRfZnVzZV9jb25uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCkBAIC0zMzcsMTEgKzM3NCw2IEBACiAJcmV0dXJuIGdldF9mdXNlX2Nvbm5fc3VwZXIoaW5vZGUtPmlfc2IpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBmdXNlX2Nvbm4gKmdldF9mdXNlX2Nvbm5fa29iaihzdHJ1Y3Qga29iamVjdCAqb2JqKQotewotCXJldHVybiBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZnVzZV9jb25uLCBrb2JqKTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgZnVzZV9pbm9kZSAqZ2V0X2Z1c2VfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlyZXR1cm4gY29udGFpbmVyX29mKGlub2RlLCBzdHJ1Y3QgZnVzZV9pbm9kZSwgaW5vZGUpOwpAQCAtMzgzLDEyICs0MTUsOSBAQAogdm9pZCBmdXNlX2ZpbmlzaF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAogCQkgICAgICBzdHJ1Y3QgZnVzZV9maWxlICpmZiwgc3RydWN0IGZ1c2Vfb3Blbl9vdXQgKm91dGFyZyk7CiAKLS8qKgotICogU2VuZCBhIFJFTEVBU0UgcmVxdWVzdAotICovCi12b2lkIGZ1c2Vfc2VuZF9yZWxlYXNlKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZnVzZV9maWxlICpmZiwKLQkJICAgICAgIHU2NCBub2RlaWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncywgaW50IGlzZGlyKTsKLQorLyoqICovCitzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfcmVsZWFzZV9maWxsKHN0cnVjdCBmdXNlX2ZpbGUgKmZmLCB1NjQgbm9kZWlkLCBpbnQgZmxhZ3MsCisJCQkJICAgaW50IG9wY29kZSk7CiAvKioKICAqIFNlbmQgUkVMRUFTRSBvciBSRUxFQVNFRElSIHJlcXVlc3QKICAqLwpAQCAtNDM1LDYgKzQ2NCw5IEBACiAgKi8KIHZvaWQgZnVzZV9kZXZfY2xlYW51cCh2b2lkKTsKIAoraW50IGZ1c2VfY3RsX2luaXQodm9pZCk7Cit2b2lkIGZ1c2VfY3RsX2NsZWFudXAodm9pZCk7CisKIC8qKgogICogQWxsb2NhdGUgYSByZXF1ZXN0CiAgKi8KQEAgLTQ0NiwxNiArNDc4LDE2IEBACiB2b2lkIGZ1c2VfcmVxdWVzdF9mcmVlKHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKIAogLyoqCi0gKiBSZWluaXRpYWxpemUgYSByZXF1ZXN0LCB0aGUgcHJlYWxsb2NhdGVkIGZsYWcgaXMgbGVmdCB1bm1vZGlmaWVkCi0gKi8KLXZvaWQgZnVzZV9yZXNldF9yZXF1ZXN0KHN0cnVjdCBmdXNlX3JlcSAqcmVxKTsKLQotLyoqCi0gKiBSZXNlcnZlIGEgcHJlYWxsb2NhdGVkIHJlcXVlc3QKKyAqIEdldCBhIHJlcXVlc3QsIG1heSBmYWlsIHdpdGggLUVOT01FTQogICovCiBzdHJ1Y3QgZnVzZV9yZXEgKmZ1c2VfZ2V0X3JlcShzdHJ1Y3QgZnVzZV9jb25uICpmYyk7CiAKIC8qKgorICogR2V0cyBhIHJlcXVlc3RzIGZvciBhIGZpbGUgb3BlcmF0aW9uLCBhbHdheXMgc3VjY2VlZHMKKyAqLworc3RydWN0IGZ1c2VfcmVxICpmdXNlX2dldF9yZXFfbm9mYWlsKHN0cnVjdCBmdXNlX2Nvbm4gKmZjLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisKKy8qKgogICogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvZiBhIHJlcXVlc3QuICBJZiBjb3VudCBnb2VzIHRvIHplcm8gZnJlZQogICogdGhlIHJlcXVlc3QuCiAgKi8KQEAgLTQ3NiwxMSArNTA4LDYgQEAKICAqLwogdm9pZCByZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwogCi0vKioKLSAqIFJlbGVhc2UgaW5vZGVzIGFuZCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBiYWNrZ3JvdW5kIHJlcXVlc3QKLSAqLwotdm9pZCBmdXNlX3JlbGVhc2VfYmFja2dyb3VuZChzdHJ1Y3QgZnVzZV9jb25uICpmYywgc3RydWN0IGZ1c2VfcmVxICpyZXEpOwotCiAvKiBBYm9ydCBhbGwgcmVxdWVzdHMgKi8KIHZvaWQgZnVzZV9hYm9ydF9jb25uKHN0cnVjdCBmdXNlX2Nvbm4gKmZjKTsKIApAQCAtNDkzLDMgKzUyMCwyMyBAQAogICogSW52YWxpZGF0ZSBpbm9kZSBhdHRyaWJ1dGVzCiAgKi8KIHZvaWQgZnVzZV9pbnZhbGlkYXRlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSk7CisKKy8qKgorICogQWNxdWlyZSByZWZlcmVuY2UgdG8gZnVzZV9jb25uCisgKi8KK3N0cnVjdCBmdXNlX2Nvbm4gKmZ1c2VfY29ubl9nZXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOworCisvKioKKyAqIFJlbGVhc2UgcmVmZXJlbmNlIHRvIGZ1c2VfY29ubgorICovCit2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpOworCisvKioKKyAqIEFkZCBjb25uZWN0aW9uIHRvIGNvbnRyb2wgZmlsZXN5c3RlbQorICovCitpbnQgZnVzZV9jdGxfYWRkX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpOworCisvKioKKyAqIFJlbW92ZSBjb25uZWN0aW9uIGZyb20gY29udHJvbCBmaWxlc3lzdGVtCisgKi8KK3ZvaWQgZnVzZV9jdGxfcmVtb3ZlX2Nvbm4oc3RydWN0IGZ1c2VfY29ubiAqZmMpOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9pbm9kZS5jIGIvZnMvZnVzZS9pbm9kZS5jCmluZGV4IDc2MjcwMjIuLmRjYWFhYmQgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvaW5vZGUuYworKysgYi9mcy9mdXNlL2lub2RlLmMKQEAgLTExLDI1ICsxMSwyMCBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAKIE1PRFVMRV9BVVRIT1IoIk1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRmlsZXN5c3RlbSBpbiBVc2Vyc3BhY2UiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqZnVzZV9pbm9kZV9jYWNoZXA7Ci1zdGF0aWMgc3RydWN0IHN1YnN5c3RlbSBjb25uZWN0aW9uc19zdWJzeXM7Ci0KLXN0cnVjdCBmdXNlX2Nvbm5fYXR0ciB7Ci0Jc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwotCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgZnVzZV9jb25uICosIGNoYXIgKik7Ci0Jc3NpemVfdCAoKnN0b3JlKShzdHJ1Y3QgZnVzZV9jb25uICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKLX07CitzdHJ1Y3QgbGlzdF9oZWFkIGZ1c2VfY29ubl9saXN0OworREVGSU5FX01VVEVYKGZ1c2VfbXV0ZXgpOwogCiAjZGVmaW5lIEZVU0VfU1VQRVJfTUFHSUMgMHg2NTczNTU0NgogCkBAIC0xMDQsNiArOTksMTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgZnVzZV9yZW1vdW50X2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJaWYgKCpmbGFncyAmIE1TX01BTkRMT0NLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCiB2b2lkIGZ1c2VfY2hhbmdlX2F0dHJpYnV0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZ1c2VfYXR0ciAqYXR0cikKIHsKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBpX3NpemVfcmVhZChpbm9kZSkgIT0gYXR0ci0+c2l6ZSkKQEAgLTE5NSwzMSArMTk4LDI5IEBACiAJcmV0dXJuIGlub2RlOwogfQogCi1zdGF0aWMgdm9pZCBmdXNlX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgZnVzZV91bW91bnRfYmVnaW4oc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsIGludCBmbGFncykKIHsKLQlmdXNlX2Fib3J0X2Nvbm4oZ2V0X2Z1c2VfY29ubl9zdXBlcihzYikpOworCWlmIChmbGFncyAmIE1OVF9GT1JDRSkKKwkJZnVzZV9hYm9ydF9jb25uKGdldF9mdXNlX2Nvbm5fc3VwZXIodmZzbW50LT5tbnRfc2IpKTsKIH0KIAogc3RhdGljIHZvaWQgZnVzZV9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgZnVzZV9jb25uICpmYyA9IGdldF9mdXNlX2Nvbm5fc3VwZXIoc2IpOwogCi0JZG93bl93cml0ZSgmZmMtPnNicHV0X3NlbSk7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZmYy0+YmFja2dyb3VuZCkpCi0JCWZ1c2VfcmVsZWFzZV9iYWNrZ3JvdW5kKGZjLAotCQkJCQlsaXN0X2VudHJ5KGZjLT5iYWNrZ3JvdW5kLm5leHQsCi0JCQkJCQkgICBzdHJ1Y3QgZnVzZV9yZXEsIGJnX2VudHJ5KSk7Ci0KIAlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQlmYy0+bW91bnRlZCA9IDA7CiAJZmMtPmNvbm5lY3RlZCA9IDA7CisJZmMtPmJsb2NrZWQgPSAwOwogCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Ci0JdXBfd3JpdGUoJmZjLT5zYnB1dF9zZW0pOwogCS8qIEZsdXNoIGFsbCByZWFkZXJzIG9uIHRoaXMgZnMgKi8KIAlraWxsX2Zhc3luYygmZmMtPmZhc3luYywgU0lHSU8sIFBPTExfSU4pOwogCXdha2VfdXBfYWxsKCZmYy0+d2FpdHEpOwotCWtvYmplY3RfZGVsKCZmYy0+a29iaik7Ci0Ja29iamVjdF9wdXQoJmZjLT5rb2JqKTsKKwl3YWtlX3VwX2FsbCgmZmMtPmJsb2NrZWRfd2FpdHEpOworCW11dGV4X2xvY2soJmZ1c2VfbXV0ZXgpOworCWxpc3RfZGVsKCZmYy0+ZW50cnkpOworCWZ1c2VfY3RsX3JlbW92ZV9jb25uKGZjKTsKKwltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOworCWZ1c2VfY29ubl9wdXQoZmMpOwogfQogCiBzdGF0aWMgdm9pZCBjb252ZXJ0X2Z1c2Vfc3RhdGZzKHN0cnVjdCBrc3RhdGZzICpzdGJ1Ziwgc3RydWN0IGZ1c2Vfa3N0YXRmcyAqYXR0cikKQEAgLTIzNiw4ICsyMzcsOSBAQAogCS8qIGZzaWQgaXMgbGVmdCB6ZXJvICovCiB9CiAKLXN0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgZnVzZV9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uX3N1cGVyKHNiKTsKIAlzdHJ1Y3QgZnVzZV9yZXEgKnJlcTsKIAlzdHJ1Y3QgZnVzZV9zdGF0ZnNfb3V0IG91dGFyZzsKQEAgLTM2OCwxMSArMzcwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZnVzZV9jb25uX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCi17Ci0Ja2ZyZWUoZ2V0X2Z1c2VfY29ubl9rb2JqKGtvYmopKTsKLX0KLQogc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm4gKm5ld19jb25uKHZvaWQpCiB7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmM7CkBAIC0zODAsMjQgKzM3NywzNSBAQAogCWZjID0ga3phbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZjKSB7CiAJCXNwaW5fbG9ja19pbml0KCZmYy0+bG9jayk7CisJCWF0b21pY19zZXQoJmZjLT5jb3VudCwgMSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT53YWl0cSk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZjLT5ibG9ja2VkX3dhaXRxKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wZW5kaW5nKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZjLT5wcm9jZXNzaW5nKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmZjLT5pbyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZmYy0+YmFja2dyb3VuZCk7Ci0JCWluaXRfcndzZW0oJmZjLT5zYnB1dF9zZW0pOwotCQlrb2JqX3NldF9rc2V0X3MoZmMsIGNvbm5lY3Rpb25zX3N1YnN5cyk7Ci0JCWtvYmplY3RfaW5pdCgmZmMtPmtvYmopOworCQlJTklUX0xJU1RfSEVBRCgmZmMtPmludGVycnVwdHMpOwogCQlhdG9taWNfc2V0KCZmYy0+bnVtX3dhaXRpbmcsIDApOwogCQlmYy0+YmRpLnJhX3BhZ2VzID0gKFZNX01BWF9SRUFEQUhFQUQgKiAxMDI0KSAvIFBBR0VfQ0FDSEVfU0laRTsKIAkJZmMtPmJkaS51bnBsdWdfaW9fZm4gPSBkZWZhdWx0X3VucGx1Z19pb19mbjsKIAkJZmMtPnJlcWN0ciA9IDA7CiAJCWZjLT5ibG9ja2VkID0gMTsKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZmMtPnNjcmFtYmxlX2tleSwgc2l6ZW9mKGZjLT5zY3JhbWJsZV9rZXkpKTsKIAl9CiAJcmV0dXJuIGZjOwogfQogCit2b2lkIGZ1c2VfY29ubl9wdXQoc3RydWN0IGZ1c2VfY29ubiAqZmMpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZjLT5jb3VudCkpCisJCWtmcmVlKGZjKTsKK30KKworc3RydWN0IGZ1c2VfY29ubiAqZnVzZV9jb25uX2dldChzdHJ1Y3QgZnVzZV9jb25uICpmYykKK3sKKwlhdG9taWNfaW5jKCZmYy0+Y291bnQpOworCXJldHVybiBmYzsKK30KKwogc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X3Jvb3RfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbW9kZSkKIHsKIAlzdHJ1Y3QgZnVzZV9hdHRyIGF0dHI7CkBAIC00MTMsNiArNDIxLDcgQEAKIAkuZGVzdHJveV9pbm9kZSAgPSBmdXNlX2Rlc3Ryb3lfaW5vZGUsCiAJLnJlYWRfaW5vZGUJPSBmdXNlX3JlYWRfaW5vZGUsCiAJLmNsZWFyX2lub2RlCT0gZnVzZV9jbGVhcl9pbm9kZSwKKwkucmVtb3VudF9mcwk9IGZ1c2VfcmVtb3VudF9mcywKIAkucHV0X3N1cGVyCT0gZnVzZV9wdXRfc3VwZXIsCiAJLnVtb3VudF9iZWdpbgk9IGZ1c2VfdW1vdW50X2JlZ2luLAogCS5zdGF0ZnMJCT0gZnVzZV9zdGF0ZnMsCkBAIC00MzIsOCArNDQxLDEyIEBACiAJCQlyYV9wYWdlcyA9IGFyZy0+bWF4X3JlYWRhaGVhZCAvIFBBR0VfQ0FDSEVfU0laRTsKIAkJCWlmIChhcmctPmZsYWdzICYgRlVTRV9BU1lOQ19SRUFEKQogCQkJCWZjLT5hc3luY19yZWFkID0gMTsKLQkJfSBlbHNlCisJCQlpZiAoIShhcmctPmZsYWdzICYgRlVTRV9QT1NJWF9MT0NLUykpCisJCQkJZmMtPm5vX2xvY2sgPSAxOworCQl9IGVsc2UgewogCQkJcmFfcGFnZXMgPSBmYy0+bWF4X3JlYWQgLyBQQUdFX0NBQ0hFX1NJWkU7CisJCQlmYy0+bm9fbG9jayA9IDE7CisJCX0KIAogCQlmYy0+YmRpLnJhX3BhZ2VzID0gbWluKGZjLT5iZGkucmFfcGFnZXMsIHJhX3BhZ2VzKTsKIAkJZmMtPm1pbm9yID0gYXJnLT5taW5vcjsKQEAgLTQ1MSw3ICs0NjQsNyBAQAogCWFyZy0+bWFqb3IgPSBGVVNFX0tFUk5FTF9WRVJTSU9OOwogCWFyZy0+bWlub3IgPSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OOwogCWFyZy0+bWF4X3JlYWRhaGVhZCA9IGZjLT5iZGkucmFfcGFnZXMgKiBQQUdFX0NBQ0hFX1NJWkU7Ci0JYXJnLT5mbGFncyB8PSBGVVNFX0FTWU5DX1JFQUQ7CisJYXJnLT5mbGFncyB8PSBGVVNFX0FTWU5DX1JFQUQgfCBGVVNFX1BPU0lYX0xPQ0tTOwogCXJlcS0+aW4uaC5vcGNvZGUgPSBGVVNFX0lOSVQ7CiAJcmVxLT5pbi5udW1hcmdzID0gMTsKIAlyZXEtPmluLmFyZ3NbMF0uc2l6ZSA9IHNpemVvZigqYXJnKTsKQEAgLTQ2NywxMCArNDgwLDkgQEAKIAlyZXF1ZXN0X3NlbmRfYmFja2dyb3VuZChmYywgcmVxKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBjb25uX2lkKHZvaWQpCitzdGF0aWMgdTY0IGNvbm5faWQodm9pZCkKIHsKLQkvKiBCS0wgaXMgaGVsZCBmb3IgLT5nZXRfc2IoKSAqLwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgY3RyID0gMTsKKwlzdGF0aWMgdTY0IGN0ciA9IDE7CiAJcmV0dXJuIGN0cisrOwogfQogCkBAIC00ODQsNiArNDk2LDkgQEAKIAlzdHJ1Y3QgZnVzZV9yZXEgKmluaXRfcmVxOwogCWludCBlcnI7CiAKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19NQU5ETE9DSykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoIXBhcnNlX2Z1c2Vfb3B0KChjaGFyICopIGRhdGEsICZkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTUyNywyNSArNTQyLDIxIEBACiAJaWYgKCFpbml0X3JlcSkKIAkJZ290byBlcnJfcHV0X3Jvb3Q7CiAKLQllcnIgPSBrb2JqZWN0X3NldF9uYW1lKCZmYy0+a29iaiwgIiVsbHUiLCBjb25uX2lkKCkpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2ZyZWVfcmVxOwotCi0JZXJyID0ga29iamVjdF9hZGQoJmZjLT5rb2JqKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9mcmVlX3JlcTsKLQotCS8qIFNldHRpbmcgZmlsZS0+cHJpdmF0ZV9kYXRhIGNhbid0IHJhY2Ugd2l0aCBvdGhlciBtb3VudCgpCi0JICAgaW5zdGFuY2VzLCBzaW5jZSBCS0wgaXMgaGVsZCBmb3IgLT5nZXRfc2IoKSAqLworCW11dGV4X2xvY2soJmZ1c2VfbXV0ZXgpOwogCWVyciA9IC1FSU5WQUw7CiAJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSkKLQkJZ290byBlcnJfa29iamVjdF9kZWw7CisJCWdvdG8gZXJyX3VubG9jazsKIAorCWZjLT5pZCA9IGNvbm5faWQoKTsKKwllcnIgPSBmdXNlX2N0bF9hZGRfY29ubihmYyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfdW5sb2NrOworCisJbGlzdF9hZGRfdGFpbCgmZmMtPmVudHJ5LCAmZnVzZV9jb25uX2xpc3QpOwogCXNiLT5zX3Jvb3QgPSByb290X2RlbnRyeTsKLQlmYy0+bW91bnRlZCA9IDE7CiAJZmMtPmNvbm5lY3RlZCA9IDE7Ci0Ja29iamVjdF9nZXQoJmZjLT5rb2JqKTsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmYzsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmdXNlX2Nvbm5fZ2V0KGZjKTsKKwltdXRleF91bmxvY2soJmZ1c2VfbXV0ZXgpOwogCS8qCiAJICogYXRvbWljX2RlY19hbmRfdGVzdCgpIGluIGZwdXQoKSBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5CiAJICogbWVtb3J5IGJhcnJpZXIgZm9yIGZpbGUtPnByaXZhdGVfZGF0YSB0byBiZSB2aXNpYmxlIG9uIGFsbApAQCAtNTU3LDIzICs1NjgsMjIgQEAKIAogCXJldHVybiAwOwogCi0gZXJyX2tvYmplY3RfZGVsOgotCWtvYmplY3RfZGVsKCZmYy0+a29iaik7Ci0gZXJyX2ZyZWVfcmVxOgorIGVycl91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZmdXNlX211dGV4KTsKIAlmdXNlX3JlcXVlc3RfZnJlZShpbml0X3JlcSk7CiAgZXJyX3B1dF9yb290OgogCWRwdXQocm9vdF9kZW50cnkpOwogIGVycjoKIAlmcHV0KGZpbGUpOwotCWtvYmplY3RfcHV0KCZmYy0+a29iaik7CisJZnVzZV9jb25uX3B1dChmYyk7CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZnVzZV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJICAgICAgIHZvaWQgKnJhd19kYXRhKQorc3RhdGljIGludCBmdXNlX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCSAgICAgICB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgcmF3X2RhdGEsIGZ1c2VfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgcmF3X2RhdGEsIGZ1c2VfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGZ1c2VfZnNfdHlwZSA9IHsKQEAgLTU4Myw2OCArNTkzLDggQEAKIAkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKIH07CiAKLXN0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl93YWl0aW5nX3Nob3coc3RydWN0IGZ1c2VfY29ubiAqZmMsIGNoYXIgKnBhZ2UpCi17Ci0JcmV0dXJuIHNwcmludGYocGFnZSwgIiVpXG4iLCBhdG9taWNfcmVhZCgmZmMtPm51bV93YWl0aW5nKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZ1c2VfY29ubl9hYm9ydF9zdG9yZShzdHJ1Y3QgZnVzZV9jb25uICpmYywgY29uc3QgY2hhciAqcGFnZSwKLQkJCQkgICAgIHNpemVfdCBjb3VudCkKLXsKLQlmdXNlX2Fib3J0X2Nvbm4oZmMpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciBmdXNlX2Nvbm5fd2FpdGluZyA9Ci0JX19BVFRSKHdhaXRpbmcsIDA0MDAsIGZ1c2VfY29ubl93YWl0aW5nX3Nob3csIE5VTEwpOwotc3RhdGljIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciBmdXNlX2Nvbm5fYWJvcnQgPQotCV9fQVRUUihhYm9ydCwgMDYwMCwgTlVMTCwgZnVzZV9jb25uX2Fib3J0X3N0b3JlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZ1c2VfY29ubl9hdHRyc1tdID0gewotCSZmdXNlX2Nvbm5fd2FpdGluZy5hdHRyLAotCSZmdXNlX2Nvbm5fYWJvcnQuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIHNzaXplX3QgZnVzZV9jb25uX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNoYXIgKnBhZ2UpCi17Ci0Jc3RydWN0IGZ1c2VfY29ubl9hdHRyICpmY2EgPQotCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGZ1c2VfY29ubl9hdHRyLCBhdHRyKTsKLQotCWlmIChmY2EtPnNob3cpCi0JCXJldHVybiBmY2EtPnNob3coZ2V0X2Z1c2VfY29ubl9rb2JqKGtvYmopLCBwYWdlKTsKLQllbHNlCi0JCXJldHVybiAtRUFDQ0VTOwotfQotCi1zdGF0aWMgc3NpemVfdCBmdXNlX2Nvbm5fYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBmdXNlX2Nvbm5fYXR0ciAqZmNhID0KLQkJY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBmdXNlX2Nvbm5fYXR0ciwgYXR0cik7Ci0KLQlpZiAoZmNhLT5zdG9yZSkKLQkJcmV0dXJuIGZjYS0+c3RvcmUoZ2V0X2Z1c2VfY29ubl9rb2JqKGtvYmopLCBwYWdlLCBjb3VudCk7Ci0JZWxzZQotCQlyZXR1cm4gLUVBQ0NFUzsKLX0KLQotc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgZnVzZV9jb25uX3N5c2ZzX29wcyA9IHsKLQkuc2hvdwk9ICZmdXNlX2Nvbm5fYXR0cl9zaG93LAotCS5zdG9yZQk9ICZmdXNlX2Nvbm5fYXR0cl9zdG9yZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2Z1c2VfY29ubiA9IHsKLQkucmVsZWFzZQk9IGZ1c2VfY29ubl9yZWxlYXNlLAotCS5zeXNmc19vcHMJPSAmZnVzZV9jb25uX3N5c2ZzX29wcywKLQkuZGVmYXVsdF9hdHRycwk9IGZ1c2VfY29ubl9hdHRycywKLX07Ci0KIHN0YXRpYyBkZWNsX3N1YnN5cyhmdXNlLCBOVUxMLCBOVUxMKTsKLXN0YXRpYyBkZWNsX3N1YnN5cyhjb25uZWN0aW9ucywgJmt0eXBlX2Z1c2VfY29ubiwgTlVMTCk7CitzdGF0aWMgZGVjbF9zdWJzeXMoY29ubmVjdGlvbnMsIE5VTEwsIE5VTEwpOwogCiBzdGF0aWMgdm9pZCBmdXNlX2lub2RlX2luaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLAogCQkJCSB1bnNpZ25lZCBsb25nIGZsYWdzKQpAQCAtNzE4LDYgKzY2OCw3IEBACiAJcHJpbnRrKCJmdXNlIGluaXQgKEFQSSB2ZXJzaW9uICVpLiVpKVxuIiwKIAkgICAgICAgRlVTRV9LRVJORUxfVkVSU0lPTiwgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTik7CiAKKwlJTklUX0xJU1RfSEVBRCgmZnVzZV9jb25uX2xpc3QpOwogCXJlcyA9IGZ1c2VfZnNfaW5pdCgpOwogCWlmIChyZXMpCiAJCWdvdG8gZXJyOwpAQCAtNzMwLDggKzY4MSwxNCBAQAogCWlmIChyZXMpCiAJCWdvdG8gZXJyX2Rldl9jbGVhbnVwOwogCisJcmVzID0gZnVzZV9jdGxfaW5pdCgpOworCWlmIChyZXMpCisJCWdvdG8gZXJyX3N5c2ZzX2NsZWFudXA7CisKIAlyZXR1cm4gMDsKIAorIGVycl9zeXNmc19jbGVhbnVwOgorCWZ1c2Vfc3lzZnNfY2xlYW51cCgpOwogIGVycl9kZXZfY2xlYW51cDoKIAlmdXNlX2Rldl9jbGVhbnVwKCk7CiAgZXJyX2ZzX2NsZWFudXA6CkBAIC03NDQsNiArNzAxLDcgQEAKIHsKIAlwcmludGsoS0VSTl9ERUJVRyAiZnVzZSBleGl0XG4iKTsKIAorCWZ1c2VfY3RsX2NsZWFudXAoKTsKIAlmdXNlX3N5c2ZzX2NsZWFudXAoKTsKIAlmdXNlX2ZzX2NsZWFudXAoKTsKIAlmdXNlX2Rldl9jbGVhbnVwKCk7CmRpZmYgLS1naXQgYS9mcy9oZnMvYm5vZGUuYyBiL2ZzL2hmcy9ibm9kZS5jCmluZGV4IDFlNDRkY2YuLjEzMjMxZGQgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9ibm9kZS5jCisrKyBiL2ZzL2hmcy9ibm9kZS5jCkBAIC0yODAsNyArMjgwLDcgQEAKIAlibG9jayA9IG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCW5vZGUtPnBhZ2Vfb2Zmc2V0ID0gb2ZmICYgflBBR0VfQ0FDSEVfTUFTSzsKIAlmb3IgKGkgPSAwOyBpIDwgdHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspIHsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBibG9jaysrLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgYmxvY2srKywgTlVMTCk7CiAJCWlmIChJU19FUlIocGFnZSkpCiAJCQlnb3RvIGZhaWw7CiAJCWlmIChQYWdlRXJyb3IocGFnZSkpIHsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5jIGIvZnMvaGZzL2J0cmVlLmMKaW5kZXggZDIwMTMxYy4uNDAwMzU3OSAxMDA2NDQKLS0tIGEvZnMvaGZzL2J0cmVlLmMKKysrIGIvZnMvaGZzL2J0cmVlLmMKQEAgLTU5LDcgKzU5LDcgQEAKIAl1bmxvY2tfbmV3X2lub2RlKHRyZWUtPmlub2RlKTsKIAogCW1hcHBpbmcgPSB0cmVlLT5pbm9kZS0+aV9tYXBwaW5nOwotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgMCwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgMCwgTlVMTCk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJZ290byBmcmVlX3RyZWU7CiAKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zdXBlci5jIGIvZnMvaGZzL3N1cGVyLmMKaW5kZXggMTE4MWQxMS4uZDkyMjdiZiAxMDA2NDQKLS0tIGEvZnMvaGZzL3N1cGVyLmMKKysrIGIvZnMvaGZzL3N1cGVyLmMKQEAgLTgwLDggKzgwLDEwIEBACiAgKgogICogY2hhbmdlZCBmX2ZpbGVzL2ZfZmZyZWUgdG8gcmVmbGVjdCB0aGUgZnNfYWJsb2NrL2ZyZWVfYWJsb2Nrcy4KICAqLwotc3RhdGljIGludCBoZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IGhmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisKIAlidWYtPmZfdHlwZSA9IEhGU19TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9ICh1MzIpSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyAqIEhGU19TQihzYiktPmZzX2RpdjsKQEAgLTQxMywxMCArNDE1LDExIEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBoZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAorCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBoZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaGZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBoZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYml0bWFwLmMgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCmluZGV4IDlmYjUxNjMuLmQxMjhhMjViIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL2JpdG1hcC5jCisrKyBiL2ZzL2hmc3BsdXMvYml0bWFwLmMKQEAgLTMxLDggKzMxLDcgQEAKIAlkcHJpbnQoREJHX0JJVE1BUCwgImJsb2NrX2FsbG9jYXRlOiAldSwldSwldVxuIiwgc2l6ZSwgb2Zmc2V0LCBsZW4pOwogCW11dGV4X2xvY2soJkhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfbXV0ZXgpOwogCW1hcHBpbmcgPSBIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX21hcHBpbmc7Ci0JcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFMsCi0JCQkgICAgICAgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLCBOVUxMKTsKIAlwcHRyID0ga21hcChwYWdlKTsKIAljdXJyID0gcHB0ciArIChvZmZzZXQgJiAoUEFHRV9DQUNIRV9CSVRTIC0gMSkpIC8gMzI7CiAJaSA9IG9mZnNldCAlIDMyOwpAQCAtNzIsOCArNzEsOCBAQAogCQlvZmZzZXQgKz0gUEFHRV9DQUNIRV9CSVRTOwogCQlpZiAob2Zmc2V0ID49IHNpemUpCiAJCQlicmVhazsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFMsCi0JCQkJICAgICAgIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFMsCisJCQkJCSBOVUxMKTsKIAkJY3VyciA9IHBwdHIgPSBrbWFwKHBhZ2UpOwogCQlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQogCQkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOwpAQCAtMTE5LDggKzExOCw4IEBACiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCQlrdW5tYXAocGFnZSk7CiAJCW9mZnNldCArPSBQQUdFX0NBQ0hFX0JJVFM7Ci0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAotCQkJCSAgICAgICAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAorCQkJCQkgTlVMTCk7CiAJCXBwdHIgPSBrbWFwKHBhZ2UpOwogCQljdXJyID0gcHB0cjsKIAkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOwpAQCAtMTY3LDcgKzE2Niw3IEBACiAJbXV0ZXhfbG9jaygmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tdXRleCk7CiAJbWFwcGluZyA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfbWFwcGluZzsKIAlwbnIgPSBvZmZzZXQgLyBQQUdFX0NBQ0hFX0JJVFM7Ci0JcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBwbnIsIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIHBuciwgTlVMTCk7CiAJcHB0ciA9IGttYXAocGFnZSk7CiAJY3VyciA9IHBwdHIgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOwogCWVuZCA9IHBwdHIgKyBQQUdFX0NBQ0hFX0JJVFMgLyAzMjsKQEAgLTE5OSw3ICsxOTgsNyBAQAogCQkJYnJlYWs7CiAJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwogCQlrdW5tYXAocGFnZSk7Ci0JCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgKytwbnIsIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCArK3BuciwgTlVMTCk7CiAJCXBwdHIgPSBrbWFwKHBhZ2UpOwogCQljdXJyID0gcHB0cjsKIAkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9ibm9kZS5jIGIvZnMvaGZzcGx1cy9ibm9kZS5jCmluZGV4IDc0NmFiYzkuLjc3YmY0MzQgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYm5vZGUuYworKysgYi9mcy9oZnNwbHVzL2Jub2RlLmMKQEAgLTQ0MCw3ICs0NDAsNyBAQAogCWJsb2NrID0gb2ZmID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJbm9kZS0+cGFnZV9vZmZzZXQgPSBvZmYgJiB+UEFHRV9DQUNIRV9NQVNLOwogCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGJsb2NrKyssIGkrKykgewotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGJsb2NrLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgYmxvY2ssIE5VTEwpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKQogCQkJZ290byBmYWlsOwogCQlpZiAoUGFnZUVycm9yKHBhZ2UpKSB7CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2J0cmVlLmMgYi9mcy9oZnNwbHVzL2J0cmVlLmMKaW5kZXggZWZmYTg5OS4uY2ZjODUyZiAxMDA2NDQKLS0tIGEvZnMvaGZzcGx1cy9idHJlZS5jCisrKyBiL2ZzL2hmc3BsdXMvYnRyZWUuYwpAQCAtMzgsNyArMzgsNyBAQAogCQlnb3RvIGZyZWVfdHJlZTsKIAogCW1hcHBpbmcgPSB0cmVlLT5pbm9kZS0+aV9tYXBwaW5nOwotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgMCwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgMCwgTlVMTCk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJZ290byBmcmVlX3RyZWU7CiAKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvc3VwZXIuYyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwppbmRleCA3ODQzZjc5Li4wYTkyZmEyIDEwMDY0NAotLS0gYS9mcy9oZnNwbHVzL3N1cGVyLmMKKysrIGIvZnMvaGZzcGx1cy9zdXBlci5jCkBAIC0yMTIsOCArMjEyLDEwIEBACiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgaGZzcGx1c19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgaGZzcGx1c19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisKIAlidWYtPmZfdHlwZSA9IEhGU1BMVVNfU1VQRVJfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOwogCWJ1Zi0+Zl9ibG9ja3MgPSBIRlNQTFVTX1NCKHNiKS50b3RhbF9ibG9ja3MgPDwgSEZTUExVU19TQihzYikuZnNfc2hpZnQ7CkBAIC00NTAsMTAgKzQ1MiwxMiBAQAogCiAjZGVmaW5lIEhGU1BMVVNfSU5PREVfU0laRQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbykKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaGZzcGx1c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJCSAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaGZzcGx1c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCisJCQkgIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGhmc3BsdXNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaGZzcGx1c19maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhmc3BsdXNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKaW5kZXggYmYwZjhlMS4uOGUwZDM3NyAxMDA2NDQKLS0tIGEvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKKysrIGIvZnMvaG9zdGZzL2hvc3Rmc19rZXJuLmMKQEAgLTIzOSw3ICsyMzksNyBAQAogCXJldHVybihlcnIpOwogfQogCi1pbnQgaG9zdGZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqc2YpCitpbnQgaG9zdGZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzZikKIHsKIAkvKiBkb19zdGF0ZnMgdXNlcyBzdHJ1Y3Qgc3RhdGZzNjQgaW50ZXJuYWxseSwgYnV0IHRoZSBsaW51eCBrZXJuZWwKIAkgKiBzdHJ1Y3Qgc3RhdGZzIHN0aWxsIGhhcyAzMi1iaXQgdmVyc2lvbnMgZm9yIG1vc3Qgb2YgdGhlc2UgZmllbGRzLApAQCAtMjUyLDcgKzI1Miw3IEBACiAJbG9uZyBsb25nIGZfZmlsZXM7CiAJbG9uZyBsb25nIGZfZmZyZWU7CiAKLQllcnIgPSBkb19zdGF0ZnMoSE9TVEZTX0koc2ItPnNfcm9vdC0+ZF9pbm9kZSktPmhvc3RfZmlsZW5hbWUsCisJZXJyID0gZG9fc3RhdGZzKEhPU1RGU19JKGRlbnRyeS0+ZF9zYi0+c19yb290LT5kX2lub2RlKS0+aG9zdF9maWxlbmFtZSwKIAkJCSZzZi0+Zl9ic2l6ZSwgJmZfYmxvY2tzLCAmZl9iZnJlZSwgJmZfYmF2YWlsLCAmZl9maWxlcywKIAkJCSZmX2ZmcmVlLCAmc2YtPmZfZnNpZCwgc2l6ZW9mKHNmLT5mX2ZzaWQpLAogCQkJJnNmLT5mX25hbWVsZW4sIHNmLT5mX3NwYXJlKTsKQEAgLTk5MywxMSArOTkzLDExIEBACiAJcmV0dXJuKGVycik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhvc3Rmc19yZWFkX3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLAotCQkJCQkgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCSAgICAgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaG9zdGZzX3JlYWRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCisJCQkgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybihnZXRfc2Jfbm9kZXYodHlwZSwgZmxhZ3MsIGRhdGEsIGhvc3Rmc19maWxsX3NiX2NvbW1vbikpOworCXJldHVybiBnZXRfc2Jfbm9kZXYodHlwZSwgZmxhZ3MsIGRhdGEsIGhvc3Rmc19maWxsX3NiX2NvbW1vbiwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhvc3Rmc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9zdXBlci5jIGIvZnMvaHBmcy9zdXBlci5jCmluZGV4IGQ3MmQ4YzguLmY3OTg0ODAgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvc3VwZXIuYworKysgYi9mcy9ocGZzL3N1cGVyLmMKQEAgLTEzNSw4ICsxMzUsOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGludCBocGZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IGhwZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZW50cnktPmRfc2I7CiAJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKIAlsb2NrX2tlcm5lbCgpOwogCkBAIC02NjIsMTAgKzY2MywxMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpocGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBocGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBocGZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGhwZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBocGZzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKaW5kZXggNWU2MzYzYi4uM2E5YmRmNSAxMDA2NDQKLS0tIGEvZnMvaHBwZnMvaHBwZnNfa2Vybi5jCisrKyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwpAQCAtNjE2LDcgKzYxNiw3IEBACiAJLmZzeW5jCQk9IGhwcGZzX2ZzeW5jLAogfTsKIAotc3RhdGljIGludCBocHBmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKnNmKQorc3RhdGljIGludCBocHBmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqc2YpCiB7CiAJc2YtPmZfYmxvY2tzID0gMDsKIAlzZi0+Zl9iZnJlZSA9IDA7CkBAIC03NjksMTEgKzc2OSwxMSBAQAogCXJldHVybihlcnIpOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpocHBmc19yZWFkX3N1cGVyKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLAotCQkJCQkgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCSAgICAgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaHBwZnNfcmVhZF9zdXBlcihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwKKwkJCSAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybihnZXRfc2Jfbm9kZXYodHlwZSwgZmxhZ3MsIGRhdGEsIGhwcGZzX2ZpbGxfc3VwZXIpKTsKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KHR5cGUsIGZsYWdzLCBkYXRhLCBocHBmc19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaHBwZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggM2E1YjRlOS4uZTY0MTBkOCAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTU5LDcgKzU5LDYgQEAKIHN0YXRpYyBpbnQgaHVnZXRsYmZzX2ZpbGVfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqaW5mbyA9IEhVR0VUTEJGU19JKGlub2RlKTsKIAlsb2ZmX3QgbGVuLCB2bWFfbGVuOwogCWludCByZXQ7CiAKQEAgLTg3LDkgKzg2LDEwIEBACiAJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSAmJiBsZW4gPiBpbm9kZS0+aV9zaXplKQogCQlnb3RvIG91dDsKIAotCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fTUFZU0hBUkUpCi0JCWlmIChodWdldGxiX2V4dGVuZF9yZXNlcnZhdGlvbihpbmZvLCBsZW4gPj4gSFBBR0VfU0hJRlQpICE9IDApCi0JCQlnb3RvIG91dDsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFICYmCisJICAgIGh1Z2V0bGJfcmVzZXJ2ZV9wYWdlcyhpbm9kZSwgdm1hLT52bV9wZ29mZiA+PiAoSFBBR0VfU0hJRlQtUEFHRV9TSElGVCksCisJCQkJICBsZW4gPj4gSFBBR0VfU0hJRlQpKQorCQlnb3RvIG91dDsKIAogCXJldCA9IDA7CiAJaHVnZXRsYl9wcmVmYXVsdF9hcmNoX2hvb2sodm1hLT52bV9tbSk7CkBAIC0xOTUsMTIgKzE5NSw4IEBACiAJY29uc3QgcGdvZmZfdCBzdGFydCA9IGxzdGFydCA+PiBIUEFHRV9TSElGVDsKIAlzdHJ1Y3QgcGFnZXZlYyBwdmVjOwogCXBnb2ZmX3QgbmV4dDsKLQlpbnQgaTsKKwlpbnQgaSwgZnJlZWQgPSAwOwogCi0JaHVnZXRsYl90cnVuY2F0ZV9yZXNlcnZhdGlvbihIVUdFVExCRlNfSShpbm9kZSksCi0JCQkJICAgICBsc3RhcnQgPj4gSFBBR0VfU0hJRlQpOwotCWlmICghbWFwcGluZy0+bnJwYWdlcykKLQkJcmV0dXJuOwogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CiAJbmV4dCA9IHN0YXJ0OwogCXdoaWxlICgxKSB7CkBAIC0yMjEsMTAgKzIxNywxMiBAQAogCQkJdHJ1bmNhdGVfaHVnZV9wYWdlKHBhZ2UpOwogCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCQlodWdldGxiX3B1dF9xdW90YShtYXBwaW5nKTsKKwkJCWZyZWVkKys7CiAJCX0KIAkJaHVnZV9wYWdldmVjX3JlbGVhc2UoJnB2ZWMpOwogCX0KIAlCVUdfT04oIWxzdGFydCAmJiBtYXBwaW5nLT5ucnBhZ2VzKTsKKwlodWdldGxiX3VucmVzZXJ2ZV9wYWdlcyhpbm9kZSwgc3RhcnQsIGZyZWVkKTsKIH0KIAogc3RhdGljIHZvaWQgaHVnZXRsYmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMzY2LDYgKzM2NCw3IEBACiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmh1Z2V0bGJmc19hb3BzOwogCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0maHVnZXRsYmZzX2JhY2tpbmdfZGV2X2luZm87CiAJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJSU5JVF9MSVNUX0hFQUQoJmlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbGlzdCk7CiAJCWluZm8gPSBIVUdFVExCRlNfSShpbm9kZSk7CiAJCW1wb2xfc2hhcmVkX3BvbGljeV9pbml0KCZpbmZvLT5wb2xpY3ksIE1QT0xfREVGQVVMVCwgTlVMTCk7CiAJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgewpAQCAtNDY3LDkgKzQ2Niw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaHVnZXRsYmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQorc3RhdGljIGludCBodWdldGxiZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihzYik7CisJc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvICpzYmluZm8gPSBIVUdFVExCRlNfU0IoZGVudHJ5LT5kX3NiKTsKIAogCWJ1Zi0+Zl90eXBlID0gSFVHRVRMQkZTX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IEhQQUdFX1NJWkU7CkBAIC01MzgsNyArNTM3LDYgQEAKIAkJaHVnZXRsYmZzX2luY19mcmVlX2lub2RlcyhzYmluZm8pOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JcC0+cHJlcmVzZXJ2ZWRfaHBhZ2VzID0gMDsKIAlyZXR1cm4gJnAtPnZmc19pbm9kZTsKIH0KIApAQCAtNzIzLDEwICs3MjEsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmh1Z2V0bGJmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgaHVnZXRsYmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBodWdldGxiZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgaHVnZXRsYmZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBodWdldGxiZnNfZnNfdHlwZSA9IHsKQEAgLTc4MSw4ICs3NzksNyBAQAogCQlnb3RvIG91dF9maWxlOwogCiAJZXJyb3IgPSAtRU5PTUVNOwotCWlmIChodWdldGxiX2V4dGVuZF9yZXNlcnZhdGlvbihIVUdFVExCRlNfSShpbm9kZSksCi0JCQkJICAgICAgIHNpemUgPj4gSFBBR0VfU0hJRlQpICE9IDApCisJaWYgKGh1Z2V0bGJfcmVzZXJ2ZV9wYWdlcyhpbm9kZSwgMCwgc2l6ZSA+PiBIUEFHRV9TSElGVCkpCiAJCWdvdG8gb3V0X2lub2RlOwogCiAJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2lub3RpZnlfdXNlci5jIGIvZnMvaW5vdGlmeV91c2VyLmMKaW5kZXggOWU5OTMxZS4uZjIzODY0NCAxMDA2NDQKLS0tIGEvZnMvaW5vdGlmeV91c2VyLmMKKysrIGIvZnMvaW5vdGlmeV91c2VyLmMKQEAgLTY3MiwxMSArNjcyLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitzdGF0aWMgaW50CiBpbm90aWZ5X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAotCSAgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKKwkgICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotICAgIHJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJpbm90aWZ5IiwgTlVMTCwgMHhCQUQxREVBKTsKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiaW5vdGlmeSIsIE5VTEwsIDB4QkFEMURFQSwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGlub3RpZnlfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL2lvcHJpby5jIGIvZnMvaW9wcmlvLmMKaW5kZXggY2E3NzAwOC4uN2ZhNzZlZCAxMDA2NDQKLS0tIGEvZnMvaW9wcmlvLmMKKysrIGIvZnMvaW9wcmlvLmMKQEAgLTI0LDE1ICsyNCwyMSBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKIHN0YXRpYyBpbnQgc2V0X3Rhc2tfaW9wcmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGlvcHJpbykKIHsKKwlpbnQgZXJyOwogCXN0cnVjdCBpb19jb250ZXh0ICppb2M7CiAKIAlpZiAodGFzay0+dWlkICE9IGN1cnJlbnQtPmV1aWQgJiYKIAkgICAgdGFzay0+dWlkICE9IGN1cnJlbnQtPnVpZCAmJiAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKQogCQlyZXR1cm4gLUVQRVJNOwogCisJZXJyID0gc2VjdXJpdHlfdGFza19zZXRpb3ByaW8odGFzaywgaW9wcmlvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJdGFza19sb2NrKHRhc2spOwogCiAJdGFzay0+aW9wcmlvID0gaW9wcmlvOwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKaW5kZXggNzBhZGJiOS4uM2Y5YzhiYSAxMDA2NDQKLS0tIGEvZnMvaXNvZnMvaW5vZGUuYworKysgYi9mcy9pc29mcy9pbm9kZS5jCkBAIC01Niw3ICs1Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGlzb2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOwotc3RhdGljIGludCBpc29mc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgaXNvZnNfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogCiBzdGF0aWMga21lbV9jYWNoZV90ICppc29mc19pbm9kZV9jYWNoZXA7CiAKQEAgLTkwMSw4ICs5MDEsMTAgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpc29mc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisKIAlidWYtPmZfdHlwZSA9IElTT0ZTX1NVUEVSX01BR0lDOwogCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKIAlidWYtPmZfYmxvY2tzID0gKElTT0ZTX1NCKHNiKS0+c19uem9uZXMKQEAgLTEzOTksMTAgKzE0MDEsMTEgQEAKIAlyZXR1cm4gaW5vZGU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmlzb2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBpc29mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaXNvZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaXNvZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpc285NjYwX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9qYmQvY2hlY2twb2ludC5jIGIvZnMvamJkL2NoZWNrcG9pbnQuYwppbmRleCAzZjUxMDJiLi40NzY3OGEyIDEwMDY0NAotLS0gYS9mcy9qYmQvY2hlY2twb2ludC5jCisrKyBiL2ZzL2piZC9jaGVja3BvaW50LmMKQEAgLTI0LDI5ICsyNCw2NyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogLyoKLSAqIFVubGluayBhIGJ1ZmZlciBmcm9tIGEgdHJhbnNhY3Rpb24uCisgKiBVbmxpbmsgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uIGNoZWNrcG9pbnQgbGlzdC4KICAqCiAgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgogICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2J1ZmZlcl91bmxpbmsoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfdW5saW5rX2ZpcnN0KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQogewotCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOwotCi0JdHJhbnNhY3Rpb24gPSBqaC0+Yl9jcF90cmFuc2FjdGlvbjsKLQlqaC0+Yl9jcF90cmFuc2FjdGlvbiA9IE5VTEw7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBqaC0+Yl9jcF90cmFuc2FjdGlvbjsKIAogCWpoLT5iX2NwbmV4dC0+Yl9jcHByZXYgPSBqaC0+Yl9jcHByZXY7CiAJamgtPmJfY3BwcmV2LT5iX2NwbmV4dCA9IGpoLT5iX2NwbmV4dDsKLQlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IGpoKQorCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gamgpIHsKIAkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID0gamgtPmJfY3BuZXh0OwotCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gamgpCi0JCXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9IE5VTEw7CisJCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gamgpCisJCQl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBOVUxMOworCX0KK30KKworLyoKKyAqIFVubGluayBhIGJ1ZmZlciBmcm9tIGEgdHJhbnNhY3Rpb24gY2hlY2twb2ludChpbykgbGlzdC4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfdW5saW5rKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb247CisKKwlfX2J1ZmZlcl91bmxpbmtfZmlyc3QoamgpOworCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgPT0gamgpIHsKKwkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gamgtPmJfY3BuZXh0OworCQlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID09IGpoKQorCQkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBNb3ZlIGEgYnVmZmVyIGZyb20gdGhlIGNoZWNrcG9pbnQgbGlzdCB0byB0aGUgY2hlY2twb2ludCBpbyBsaXN0CisgKgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19idWZmZXJfcmVsaW5rX2lvKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb247CisKKwlfX2J1ZmZlcl91bmxpbmtfZmlyc3QoamgpOworCisJaWYgKCF0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QpIHsKKwkJamgtPmJfY3BuZXh0ID0gamgtPmJfY3BwcmV2ID0gamg7CisJfSBlbHNlIHsKKwkJamgtPmJfY3BuZXh0ID0gdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0OworCQlqaC0+Yl9jcHByZXYgPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QtPmJfY3BwcmV2OworCQlqaC0+Yl9jcHByZXYtPmJfY3BuZXh0ID0gamg7CisJCWpoLT5iX2NwbmV4dC0+Yl9jcHByZXYgPSBqaDsKKwl9CisJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9pb19saXN0ID0gamg7CiB9CiAKIC8qCiAgKiBUcnkgdG8gcmVsZWFzZSBhIGNoZWNrcG9pbnRlZCBidWZmZXIgZnJvbSBpdHMgdHJhbnNhY3Rpb24uCi0gKiBSZXR1cm5zIDEgaWYgd2UgcmVsZWFzZWQgaXQuCisgKiBSZXR1cm5zIDEgaWYgd2UgcmVsZWFzZWQgaXQgYW5kIDIgaWYgd2UgYWxzbyByZWxlYXNlZCB0aGUKKyAqIHdob2xlIHRyYW5zYWN0aW9uLgorICoKICAqIFJlcXVpcmVzIGpfbGlzdF9sb2NrCiAgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CiAgKi8KQEAgLTU3LDEyICs5NSwxMSBAQAogCiAJaWYgKGpoLT5iX2psaXN0ID09IEJKX05vbmUgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpICYmICFidWZmZXJfZGlydHkoYmgpKSB7CiAJCUpCVUZGRVJfVFJBQ0UoamgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50IGxpc3QiKTsKLQkJX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKTsKKwkJcmV0ID0gX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KGpoKSArIDE7CiAJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwogCQlCVUZGRVJfVFJBQ0UoYmgsICJyZWxlYXNlIik7CiAJCV9fYnJlbHNlKGJoKTsKLQkJcmV0ID0gMTsKIAl9IGVsc2UgewogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAl9CkBAIC0xMTcsODMgKzE1NCw1NCBAQAogfQogCiAvKgotICogQ2xlYW4gdXAgYSB0cmFuc2FjdGlvbidzIGNoZWNrcG9pbnQgbGlzdC4KLSAqCi0gKiBXZSB3YWl0IGZvciBhbnkgcGVuZGluZyBJTyB0byBjb21wbGV0ZSBhbmQgbWFrZSBzdXJlIGFueSBjbGVhbgotICogYnVmZmVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLSAqCi0gKiBSZXR1cm4gMSBpZiB3ZSBwZXJmb3JtZWQgYW55IGFjdGlvbnMgd2hpY2ggbWlnaHQgaGF2ZSBkZXN0cm95ZWQgdGhlCi0gKiBjaGVja3BvaW50LiAgKGpvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoKSBkZWxldGVzIHRoZSB0cmFuc2FjdGlvbiB3aGVuCi0gKiB0aGUgbGFzdCBjaGVja3BvaW50IGJ1ZmZlciBpcyBjbGVhbnNlZCkKKyAqIENsZWFuIHVwIHRyYW5zYWN0aW9uJ3MgbGlzdCBvZiBidWZmZXJzIHN1Ym1pdHRlZCBmb3IgaW8uCisgKiBXZSB3YWl0IGZvciBhbnkgcGVuZGluZyBJTyB0byBjb21wbGV0ZSBhbmQgcmVtb3ZlIGFueSBjbGVhbgorICogYnVmZmVycy4gTm90ZSB0aGF0IHdlIHRha2UgdGhlIGJ1ZmZlcnMgaW4gdGhlIG9wcG9zaXRlIG9yZGVyaW5nCisgKiBmcm9tIHRoZSBvbmUgaW4gd2hpY2ggdGhleSB3ZXJlIHN1Ym1pdHRlZCBmb3IgSU8uCiAgKgogICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KICAqLwotc3RhdGljIGludCBfX2NsZWFudXBfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3N0YXRpYyB2b2lkIF9fd2FpdF9jcF9pbyhqb3VybmFsX3QgKmpvdXJuYWwsIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uKQogewotCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCAqbmV4dF9qaCwgKmxhc3Rfamg7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQlpbnQgcmV0ID0gMDsKKwl0aWRfdCB0aGlzX3RpZDsKKwlpbnQgcmVsZWFzZWQgPSAwOwogCi0JYXNzZXJ0X3NwaW5fbG9ja2VkKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7Ci0JamggPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7Ci0JaWYgKCFqaCkKLQkJcmV0dXJuIDA7Ci0KLQlsYXN0X2poID0gamgtPmJfY3BwcmV2OwotCW5leHRfamggPSBqaDsKLQlkbyB7Ci0JCWpoID0gbmV4dF9qaDsKKwl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKK3Jlc3RhcnQ6CisJLyogRGlkIHNvbWVib2R5IGNsZWFuIHVwIHRoZSB0cmFuc2FjdGlvbiBpbiB0aGUgbWVhbndoaWxlPyAqLworCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IHRyYW5zYWN0aW9uIHx8CisJCQl0cmFuc2FjdGlvbi0+dF90aWQgIT0gdGhpc190aWQpCisJCXJldHVybjsKKwl3aGlsZSAoIXJlbGVhc2VkICYmIHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCkgeworCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdDsKIAkJYmggPSBqaDJiaChqaCk7CisJCWlmICghamJkX3RyeWxvY2tfYmhfc3RhdGUoYmgpKSB7CisJCQlqYmRfc3luY19iaChqb3VybmFsLCBiaCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQogCQlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKIAkJCWF0b21pY19pbmMoJmJoLT5iX2NvdW50KTsKIAkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAkJCXdhaXRfb25fYnVmZmVyKGJoKTsKIAkJCS8qIHRoZSBqb3VybmFsX2hlYWQgbWF5IGhhdmUgZ29uZSBieSBub3cgKi8KIAkJCUJVRkZFUl9UUkFDRShiaCwgImJyZWxzZSIpOwogCQkJX19icmVsc2UoYmgpOwotCQkJZ290byBvdXRfcmV0dXJuXzE7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCWdvdG8gcmVzdGFydDsKIAkJfQotCiAJCS8qCi0JCSAqIFRoaXMgaXMgZm91bAorCQkgKiBOb3cgaW4gd2hhdGV2ZXIgc3RhdGUgdGhlIGJ1ZmZlciBjdXJyZW50bHkgaXMsIHdlIGtub3cgdGhhdAorCQkgKiBpdCBoYXMgYmVlbiB3cml0dGVuIG91dCBhbmQgc28gd2UgY2FuIGRyb3AgaXQgZnJvbSB0aGUgbGlzdAogCQkgKi8KLQkJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKLQkJCWpiZF9zeW5jX2JoKGpvdXJuYWwsIGJoKTsKLQkJCWdvdG8gb3V0X3JldHVybl8xOwotCQl9Ci0KLQkJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IE5VTEwpIHsKLQkJCXRyYW5zYWN0aW9uX3QgKnQgPSBqaC0+Yl90cmFuc2FjdGlvbjsKLQkJCXRpZF90IHRpZCA9IHQtPnRfdGlkOwotCi0JCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCQlsb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRpZCk7Ci0JCQlsb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKLQkJCWdvdG8gb3V0X3JldHVybl8xOwotCQl9Ci0KLQkJLyoKLQkJICogQUtQTTogSSB0aGluayB0aGUgYnVmZmVyX2piZGRpcnR5IHRlc3QgaXMgcmVkdW5kYW50IC0gaXQKLQkJICogc2hvdWxkbid0IGhhdmUgTlVMTCBiX3RyYW5zYWN0aW9uPwotCQkgKi8KLQkJbmV4dF9qaCA9IGpoLT5iX2NwbmV4dDsKLQkJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfamJkZGlydHkoYmgpKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50Iik7Ci0JCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOwotCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7Ci0JCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOwotCQkJX19icmVsc2UoYmgpOwotCQkJcmV0ID0gMTsKLQkJfSBlbHNlIHsKLQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwotCQl9Ci0JfSB3aGlsZSAoamggIT0gbGFzdF9qaCk7Ci0KLQlyZXR1cm4gcmV0Owotb3V0X3JldHVybl8xOgotCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCXJldHVybiAxOworCQlyZWxlYXNlZCA9IF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQogfQogCiAjZGVmaW5lIE5SX0JBVENICTY0CkBAIC0yMDMsOSArMjExLDcgQEAKIHsKIAlpbnQgaTsKIAotCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJbGxfcndfYmxvY2soU1dSSVRFLCAqYmF0Y2hfY291bnQsIGJocyk7Ci0Jc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8ICpiYXRjaF9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CiAJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOwpAQCAtMjIxLDE5ICsyMjcsNDMgQEAKICAqIFJldHVybiAxIGlmIHNvbWV0aGluZyBoYXBwZW5lZCB3aGljaCByZXF1aXJlcyB1cyB0byBhYm9ydCB0aGUgY3VycmVudAogICogc2NhbiBvZiB0aGUgY2hlY2twb2ludCBsaXN0LiAgCiAgKgotICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQgYW5kIGRyb3BzIGl0IGlmIDEgaXMgcmV0dXJuZWQKICAqIENhbGxlZCB1bmRlciBqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpLCBhbmQgZHJvcHMgaXQKICAqLwotc3RhdGljIGludCBfX2ZsdXNoX2J1ZmZlcihqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAotCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgKmJhdGNoX2NvdW50LAotCQkJaW50ICpkcm9wX2NvdW50KQorc3RhdGljIGludCBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiBqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKSB7Ci0JCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlpZiAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJYXRvbWljX2luYygmYmgtPmJfY291bnQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkvKiB0aGUgam91cm5hbF9oZWFkIG1heSBoYXZlIGdvbmUgYnkgbm93ICovCisJCUJVRkZFUl9UUkFDRShiaCwgImJyZWxzZSIpOworCQlfX2JyZWxzZShiaCk7CisJCXJldCA9IDE7CisJfSBlbHNlIGlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSBOVUxMKSB7CisJCXRyYW5zYWN0aW9uX3QgKnQgPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwkJdGlkX3QgdGlkID0gdC0+dF90aWQ7CiAKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCWxvZ19zdGFydF9jb21taXQoam91cm5hbCwgdGlkKTsKKwkJbG9nX3dhaXRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJCXJldCA9IDE7CisJfSBlbHNlIGlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQlKX0FTU0VSVF9KSChqaCwgIWJ1ZmZlcl9qYmRkaXJ0eShiaCkpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50Iik7CisJCV9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlfX2JyZWxzZShiaCk7CisJCXJldCA9IDE7CisJfSBlbHNlIHsKIAkJLyoKIAkJICogSW1wb3J0YW50OiB3ZSBhcmUgYWJvdXQgdG8gd3JpdGUgdGhlIGJ1ZmZlciwgYW5kCiAJCSAqIHBvc3NpYmx5IGJsb2NrLCB3aGlsZSBzdGlsbCBob2xkaW5nIHRoZSBqb3VybmFsIGxvY2suCkBAIC0yNDYsNDUgKzI3NiwzMCBAQAogCQlKX0FTU0VSVF9CSChiaCwgIWJ1ZmZlcl9qd3JpdGUoYmgpKTsKIAkJc2V0X2J1ZmZlcl9qd3JpdGUoYmgpOwogCQliaHNbKmJhdGNoX2NvdW50XSA9IGJoOworCQlfX2J1ZmZlcl9yZWxpbmtfaW8oamgpOwogCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKIAkJKCpiYXRjaF9jb3VudCkrKzsKIAkJaWYgKCpiYXRjaF9jb3VudCA9PSBOUl9CQVRDSCkgeworCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgYmhzLCBiYXRjaF9jb3VudCk7CiAJCQlyZXQgPSAxOwogCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGxhc3RfYnVmZmVyID0gMDsKLQkJaWYgKGpoLT5iX2NwbmV4dCA9PSBqaCkgewotCQkJLyogV2UgbWF5IGJlIGFib3V0IHRvIGRyb3AgdGhlIHRyYW5zYWN0aW9uLiAgVGVsbCB0aGUKLQkJCSAqIGNhbGxlciB0aGF0IHRoZSBsaXN0cyBoYXZlIGNoYW5nZWQuCi0JCQkgKi8KLQkJCWxhc3RfYnVmZmVyID0gMTsKLQkJfQotCQlpZiAoX190cnlfdG9fZnJlZV9jcF9idWYoamgpKSB7Ci0JCQkoKmRyb3BfY291bnQpKys7Ci0JCQlyZXQgPSBsYXN0X2J1ZmZlcjsKLQkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQogCiAvKgotICogUGVyZm9ybSBhbiBhY3R1YWwgY2hlY2twb2ludC4gIFdlIGRvbid0IHdyaXRlIG91dCBvbmx5IGVub3VnaCB0bwotICogc2F0aXNmeSB0aGUgY3VycmVudCBibG9ja2VkIHJlcXVlc3RzOiByYXRoZXIgd2Ugc3VibWl0IGEgcmVhc29uYWJseQotICogc2l6ZWQgY2h1bmsgb2YgdGhlIG91dHN0YW5kaW5nIGRhdGEgdG8gZGlzayBhdCBvbmNlIGZvcgotICogZWZmaWNpZW5jeS4gIF9fbG9nX3dhaXRfZm9yX3NwYWNlKCkgd2lsbCByZXRyeSBpZiB3ZSBkaWRuJ3QgZnJlZSBlbm91Z2guCisgKiBQZXJmb3JtIGFuIGFjdHVhbCBjaGVja3BvaW50LiBXZSB0YWtlIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBvbiB0aGUKKyAqIGxpc3Qgb2YgdHJhbnNhY3Rpb25zIHRvIGJlIGNoZWNrcG9pbnRlZCBhbmQgc2VuZCBhbGwgaXRzIGJ1ZmZlcnMKKyAqIHRvIGRpc2suIFdlIHN1Ym1pdCBsYXJnZXIgY2h1bmtzIG9mIGRhdGEgYXQgb25jZS4KICAqIAotICogSG93ZXZlciwgd2UgX2RvXyB0YWtlIGludG8gYWNjb3VudCB0aGUgYW1vdW50IHJlcXVlc3RlZCBzbyB0aGF0IG9uY2UKLSAqIHRoZSBJTyBoYXMgYmVlbiBxdWV1ZWQsIHdlIGNhbiByZXR1cm4gYXMgc29vbiBhcyBlbm91Z2ggb2YgaXQgaGFzCi0gKiBjb21wbGV0ZWQgdG8gZGlzay4KLSAqCiAgKiBUaGUgam91cm5hbCBzaG91bGQgYmUgbG9ja2VkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KIGludCBsb2dfZG9fY2hlY2twb2ludChqb3VybmFsX3QgKmpvdXJuYWwpCiB7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJdGlkX3QgdGhpc190aWQ7CiAJaW50IHJlc3VsdDsKLQlpbnQgYmF0Y2hfY291bnQgPSAwOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW05SX0JBVENIXTsKIAogCWpiZF9kZWJ1ZygxLCAiU3RhcnQgY2hlY2twb2ludFxuIik7CiAKQEAgLTI5OSw3OSArMzE0LDY4IEBACiAJCXJldHVybiByZXN1bHQ7CiAKIAkvKgotCSAqIE9LLCB3ZSBuZWVkIHRvIHN0YXJ0IHdyaXRpbmcgZGlzayBibG9ja3MuICBUcnkgdG8gZnJlZSB1cCBhCi0JICogcXVhcnRlciBvZiB0aGUgbG9nIGluIGEgc2luZ2xlIGNoZWNrcG9pbnQgaWYgd2UgY2FuLgotCSAqLwotCS8qCi0JICogQUtQTTogY2hlY2sgdGhpcyBjb2RlLiAgSSBoYWQgYSBmZWVsaW5nIGEgd2hpbGUgYmFjayB0aGF0IGl0Ci0JICogZGVnZW5lcmF0ZXMgaW50byBhIGJ1c3kgbG9vcCBhdCB1bm1vdW50IHRpbWUuCisJICogT0ssIHdlIG5lZWQgdG8gc3RhcnQgd3JpdGluZyBkaXNrIGJsb2Nrcy4gIFRha2Ugb25lIHRyYW5zYWN0aW9uCisJICogYW5kIHdyaXRlIGl0LgogCSAqLwogCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwotCXdoaWxlIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zKSB7Ci0JCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOwotCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwgKmxhc3RfamgsICpuZXh0X2poOwotCQlpbnQgZHJvcF9jb3VudCA9IDA7Ci0JCWludCBjbGVhbnVwX3JldCwgcmV0cnkgPSAwOwotCQl0aWRfdCB0aGlzX3RpZDsKKwlpZiAoIWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMpCisJCWdvdG8gb3V0OworCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9uczsKKwl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKK3Jlc3RhcnQ6CisJLyoKKwkgKiBJZiBzb21lb25lIGNsZWFuZWQgdXAgdGhpcyB0cmFuc2FjdGlvbiB3aGlsZSB3ZSBzbGVwdCwgd2UncmUKKwkgKiBkb25lIChtYXliZSBpdCdzIGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgaXQgZmVsbCBhdCB0aGUgc2FtZQorCSAqIGFkZHJlc3MpLgorCSAqLworCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uICYmCisJCQl0cmFuc2FjdGlvbi0+dF90aWQgPT0gdGhpc190aWQpIHsKKwkJaW50IGJhdGNoX2NvdW50ID0gMDsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbTlJfQkFUQ0hdOworCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwkJaW50IHJldHJ5ID0gMDsKIAotCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnM7Ci0JCXRoaXNfdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOwotCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKLQkJbGFzdF9qaCA9IGpoLT5iX2NwcHJldjsKLQkJbmV4dF9qaCA9IGpoOwotCQlkbyB7CisJCXdoaWxlICghcmV0cnkgJiYgdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0KSB7CiAJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCi0JCQlqaCA9IG5leHRfamg7Ci0JCQluZXh0X2poID0gamgtPmJfY3BuZXh0OworCQkJamggPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CiAJCQliaCA9IGpoMmJoKGpoKTsKIAkJCWlmICghamJkX3RyeWxvY2tfYmhfc3RhdGUoYmgpKSB7CiAJCQkJamJkX3N5bmNfYmgoam91cm5hbCwgYmgpOwotCQkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOwogCQkJCXJldHJ5ID0gMTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCXJldHJ5ID0gX19mbHVzaF9idWZmZXIoam91cm5hbCwgamgsIGJocywgJmJhdGNoX2NvdW50LCAmZHJvcF9jb3VudCk7Ci0JCQlpZiAoY29uZF9yZXNjaGVkX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSkgeworCQkJcmV0cnkgPSBfX3Byb2Nlc3NfYnVmZmVyKGpvdXJuYWwsIGpoLCBiaHMsJmJhdGNoX2NvdW50KTsKKwkJCWlmICghcmV0cnkgJiYgbG9ja19uZWVkX3Jlc2NoZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSl7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAkJCQlyZXRyeSA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCX0gd2hpbGUgKGpoICE9IGxhc3RfamggJiYgIXJldHJ5KTsKLQotCQlpZiAoYmF0Y2hfY291bnQpIHsKLQkJCV9fZmx1c2hfYmF0Y2goam91cm5hbCwgYmhzLCAmYmF0Y2hfY291bnQpOwotCQkJcmV0cnkgPSAxOwogCQl9CiAKKwkJaWYgKGJhdGNoX2NvdW50KSB7CisJCQlpZiAoIXJldHJ5KSB7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlyZXRyeSA9IDE7CisJCQl9CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgJmJhdGNoX2NvdW50KTsKKwkJfQorCisJCWlmIChyZXRyeSkgeworCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAkJLyoKLQkJICogSWYgc29tZW9uZSBjbGVhbmVkIHVwIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugc2xlcHQsIHdlJ3JlCi0JCSAqIGRvbmUKKwkJICogTm93IHdlIGhhdmUgY2xlYW5lZCB1cCB0aGUgZmlyc3QgdHJhbnNhY3Rpb24ncyBjaGVja3BvaW50CisJCSAqIGxpc3QuIExldCdzIGNsZWFuIHVwIHRoZSBzZWNvbmQgb25lCiAJCSAqLwotCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyAhPSB0cmFuc2FjdGlvbikKLQkJCWJyZWFrOwotCQlpZiAocmV0cnkpCi0JCQljb250aW51ZTsKLQkJLyoKLQkJICogTWF5YmUgaXQncyBhIG5ldyB0cmFuc2FjdGlvbiwgYnV0IGl0IGZlbGwgYXQgdGhlIHNhbWUKLQkJICogYWRkcmVzcwotCQkgKi8KLQkJaWYgKHRyYW5zYWN0aW9uLT50X3RpZCAhPSB0aGlzX3RpZCkKLQkJCWNvbnRpbnVlOwotCQkvKgotCQkgKiBXZSBoYXZlIHdhbGtlZCB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gbGlzdCB3aXRob3V0Ci0JCSAqIGZpbmRpbmcgYW55dGhpbmcgdG8gd3JpdGUgdG8gZGlzay4gIFdlIGhhZCBiZXR0ZXIgYmUKLQkJICogYWJsZSB0byBtYWtlIHNvbWUgcHJvZ3Jlc3Mgb3Igd2UgYXJlIGluIHRyb3VibGUuCi0JCSAqLwotCQljbGVhbnVwX3JldCA9IF9fY2xlYW51cF90cmFuc2FjdGlvbihqb3VybmFsLCB0cmFuc2FjdGlvbik7Ci0JCUpfQVNTRVJUKGRyb3BfY291bnQgIT0gMCB8fCBjbGVhbnVwX3JldCAhPSAwKTsKLQkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gdHJhbnNhY3Rpb24pCi0JCQlicmVhazsKKwkJX193YWl0X2NwX2lvKGpvdXJuYWwsIHRyYW5zYWN0aW9uKTsKIAl9CitvdXQ6CiAJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKIAlyZXN1bHQgPSBjbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJcmV0dXJuIHJlc3VsdDsKLQogCXJldHVybiAwOwogfQogCkBAIC00NTYsNTIgKzQ2MCw5OCBAQAogLyogQ2hlY2twb2ludCBsaXN0IG1hbmFnZW1lbnQgKi8KIAogLyoKLSAqIGpvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0CisgKiBqb3VybmFsX2NsZWFuX29uZV9jcF9saXN0CiAgKgotICogRmluZCBhbGwgdGhlIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50IGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgYW5kIHJlbGVhc2UgdGhlbS4KKyAqIEZpbmQgYWxsIHRoZSB3cml0dGVuLWJhY2sgY2hlY2twb2ludCBidWZmZXJzIGluIHRoZSBnaXZlbiBsaXN0IGFuZCByZWxlYXNlIHRoZW0uCiAgKgogICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9ja2VkLgogICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KICAqIFJldHVybnMgbnVtYmVyIG9mIGJ1ZmVycyByZWFwZWQgKGZvciBkZWJ1ZykKICAqLwogCitzdGF0aWMgaW50IGpvdXJuYWxfY2xlYW5fb25lX2NwX2xpc3Qoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsIGludCAqcmVsZWFzZWQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqbGFzdF9qaDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpuZXh0X2poID0gamg7CisJaW50IHJldCwgZnJlZWQgPSAwOworCisJKnJlbGVhc2VkID0gMDsKKwlpZiAoIWpoKQorCQlyZXR1cm4gMDsKKworIAlsYXN0X2poID0gamgtPmJfY3BwcmV2OworCWRvIHsKKwkJamggPSBuZXh0X2poOworCQluZXh0X2poID0gamgtPmJfY3BuZXh0OworCQkvKiBVc2UgdHJ5bG9jayBiZWNhdXNlIG9mIHRoZSByYW5raW5nICovCisJCWlmIChqYmRfdHJ5bG9ja19iaF9zdGF0ZShqaDJiaChqaCkpKSB7CisJCQlyZXQgPSBfX3RyeV90b19mcmVlX2NwX2J1ZihqaCk7CisJCQlpZiAocmV0KSB7CisJCQkJZnJlZWQrKzsKKwkJCQlpZiAocmV0ID09IDIpIHsKKwkJCQkJKnJlbGVhc2VkID0gMTsKKwkJCQkJcmV0dXJuIGZyZWVkOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZnJlZXMgdXAgc29tZSBtZW1vcnkKKwkJICogaWYgcG9zc2libGUgc28gd2UgZG9udCBoYXZlIGFuIG9ibGlnYXRpb24KKwkJICogdG8gZmluaXNoIHByb2Nlc3NpbmcuIEJhaWwgb3V0IGlmIHByZWVtcHRpb24KKwkJICogcmVxdWVzdGVkOgorCQkgKi8KKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJcmV0dXJuIGZyZWVkOworCX0gd2hpbGUgKGpoICE9IGxhc3RfamgpOworCisJcmV0dXJuIGZyZWVkOworfQorCisvKgorICogam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3QKKyAqCisgKiBGaW5kIGFsbCB0aGUgd3JpdHRlbi1iYWNrIGNoZWNrcG9pbnQgYnVmZmVycyBpbiB0aGUgam91cm5hbCBhbmQgcmVsZWFzZSB0aGVtLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKiBSZXR1cm5zIG51bWJlciBvZiBidWZmZXJzIHJlYXBlZCAoZm9yIGRlYnVnKQorICovCisKIGludCBfX2pvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0KGpvdXJuYWxfdCAqam91cm5hbCkKIHsKIAl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwgKmxhc3RfdHJhbnNhY3Rpb24sICpuZXh0X3RyYW5zYWN0aW9uOwogCWludCByZXQgPSAwOworCWludCByZWxlYXNlZDsKIAogCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9uczsKLQlpZiAodHJhbnNhY3Rpb24gPT0gMCkKKwlpZiAoIXRyYW5zYWN0aW9uKQogCQlnb3RvIG91dDsKIAogCWxhc3RfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CiAJbmV4dF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOwogCWRvIHsKLQkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7Ci0KIAkJdHJhbnNhY3Rpb24gPSBuZXh0X3RyYW5zYWN0aW9uOwogCQluZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24tPnRfY3BuZXh0OwotCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKLQkJaWYgKGpoKSB7Ci0JCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpsYXN0X2poID0gamgtPmJfY3BwcmV2OwotCQkJc3RydWN0IGpvdXJuYWxfaGVhZCAqbmV4dF9qaCA9IGpoOwotCi0JCQlkbyB7Ci0JCQkJamggPSBuZXh0X2poOwotCQkJCW5leHRfamggPSBqaC0+Yl9jcG5leHQ7Ci0JCQkJLyogVXNlIHRyeWxvY2sgYmVjYXVzZSBvZiB0aGUgcmFua25pZyAqLwotCQkJCWlmIChqYmRfdHJ5bG9ja19iaF9zdGF0ZShqaDJiaChqaCkpKQotCQkJCQlyZXQgKz0gX190cnlfdG9fZnJlZV9jcF9idWYoamgpOwotCQkJCS8qCi0JCQkJICogVGhpcyBmdW5jdGlvbiBvbmx5IGZyZWVzIHVwIHNvbWUgbWVtb3J5Ci0JCQkJICogaWYgcG9zc2libGUgc28gd2UgZG9udCBoYXZlIGFuIG9ibGlnYXRpb24KLQkJCQkgKiB0byBmaW5pc2ggcHJvY2Vzc2luZy4gQmFpbCBvdXQgaWYgcHJlZW1wdGlvbgotCQkJCSAqIHJlcXVlc3RlZDoKLQkJCQkgKi8KLQkJCQlpZiAobmVlZF9yZXNjaGVkKCkpCi0JCQkJCWdvdG8gb3V0OwotCQkJfSB3aGlsZSAoamggIT0gbGFzdF9qaCk7Ci0JCX0KKwkJcmV0ICs9IGpvdXJuYWxfY2xlYW5fb25lX2NwX2xpc3QodHJhbnNhY3Rpb24tPgorCQkJCXRfY2hlY2twb2ludF9saXN0LCAmcmVsZWFzZWQpOworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgZnJlZXMgdXAgc29tZSBtZW1vcnkgaWYgcG9zc2libGUgc28gd2UKKwkJICogZG9udCBoYXZlIGFuIG9ibGlnYXRpb24gdG8gZmluaXNoIHByb2Nlc3NpbmcuIEJhaWwgb3V0IGlmCisJCSAqIHByZWVtcHRpb24gcmVxdWVzdGVkOgorCQkgKi8KKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJZ290byBvdXQ7CisJCWlmIChyZWxlYXNlZCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJdCBpcyBlc3NlbnRpYWwgdGhhdCB3ZSBhcmUgYXMgY2FyZWZ1bCBhcyBpbiB0aGUgY2FzZSBvZgorCQkgKiB0X2NoZWNrcG9pbnRfbGlzdCB3aXRoIHJlbW92aW5nIHRoZSBidWZmZXIgZnJvbSB0aGUgbGlzdCBhcworCQkgKiB3ZSBjYW4gcG9zc2libHkgc2VlIG5vdCB5ZXQgc3VibWl0dGVkIGJ1ZmZlcnMgb24gaW9fbGlzdAorCQkgKi8KKwkJcmV0ICs9IGpvdXJuYWxfY2xlYW5fb25lX2NwX2xpc3QodHJhbnNhY3Rpb24tPgorCQkJCXRfY2hlY2twb2ludF9pb19saXN0LCAmcmVsZWFzZWQpOworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlnb3RvIG91dDsKIAl9IHdoaWxlICh0cmFuc2FjdGlvbiAhPSBsYXN0X3RyYW5zYWN0aW9uKTsKIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtNTE2LDE4ICs1NjYsMjIgQEAKICAqIGJ1ZmZlciB1cGRhdGVzIGNvbW1pdHRlZCBpbiB0aGF0IHRyYW5zYWN0aW9uIGhhdmUgc2FmZWx5IGJlZW4gc3RvcmVkCiAgKiBlbHNld2hlcmUgb24gZGlzay4gIFRvIGFjaGlldmUgdGhpcywgYWxsIG9mIHRoZSBidWZmZXJzIGluIGEKICAqIHRyYW5zYWN0aW9uIG5lZWQgdG8gYmUgbWFpbnRhaW5lZCBvbiB0aGUgdHJhbnNhY3Rpb24ncyBjaGVja3BvaW50Ci0gKiBsaXN0IHVudGlsIHRoZXkgaGF2ZSBiZWVuIHJld3JpdHRlbiwgYXQgd2hpY2ggcG9pbnQgdGhpcyBmdW5jdGlvbiBpcworICogbGlzdHMgdW50aWwgdGhleSBoYXZlIGJlZW4gcmV3cml0dGVuLCBhdCB3aGljaCBwb2ludCB0aGlzIGZ1bmN0aW9uIGlzCiAgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgZXhpc3RpbmcgdHJhbnNhY3Rpb24ncwotICogY2hlY2twb2ludCBsaXN0LgorICogY2hlY2twb2ludCBsaXN0cy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyAxIGlmIGl0IGZyZWVzIHRoZSB0cmFuc2FjdGlvbiwgMCBvdGhlcndpc2UuCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKICAqLwogCi12b2lkIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK2ludCBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCiB7CiAJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CiAJam91cm5hbF90ICpqb3VybmFsOworCWludCByZXQgPSAwOwogCiAJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CiAKQEAgLTUzOCw4ICs1OTIsMTAgQEAKIAlqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKIAogCV9fYnVmZmVyX3VubGluayhqaCk7CisJamgtPmJfY3BfdHJhbnNhY3Rpb24gPSBOVUxMOwogCi0JaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCAhPSBOVUxMKQorCWlmICh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgIT0gTlVMTCB8fAorCSAgICB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2lvX2xpc3QgIT0gTlVMTCkKIAkJZ290byBvdXQ7CiAJSkJVRkZFUl9UUkFDRShqaCwgInRyYW5zYWN0aW9uIGhhcyBubyBtb3JlIGJ1ZmZlcnMiKTsKIApAQCAtNTY1LDggKzYyMSwxMCBAQAogCS8qIEp1c3QgaW4gY2FzZSBhbnlib2R5IHdhcyB3YWl0aW5nIGZvciBtb3JlIHRyYW5zYWN0aW9ucyB0byBiZQogICAgICAgICAgICBjaGVja3BvaW50ZWQuLi4gKi8KIAl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfbG9nc3BhY2UpOworCXJldCA9IDE7CiBvdXQ6CiAJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtNjI4LDYgKzY4Niw3IEBACiAJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QgPT0gTlVMTCk7CiAJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfbG9nX2xpc3QgPT0gTlVMTCk7CiAJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpOworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfaW9fbGlzdCA9PSBOVUxMKTsKIAlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF91cGRhdGVzID09IDApOwogCUpfQVNTRVJUKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbik7CiAJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKTsKZGlmZiAtLWdpdCBhL2ZzL2piZC9jb21taXQuYyBiL2ZzL2piZC9jb21taXQuYwppbmRleCAwMDJhZDJiLi4wOTcxODE0IDEwMDY0NAotLS0gYS9mcy9qYmQvY29tbWl0LmMKKysrIGIvZnMvamJkL2NvbW1pdC5jCkBAIC03OTAsMTEgKzc5MCwyMiBAQAogCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CiAJCX0gZWxzZSB7CiAJCQlKX0FTU0VSVF9CSChiaCwgIWJ1ZmZlcl9kaXJ0eShiaCkpOwotCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCk7Ci0JCQlfX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7Ci0JCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKLQkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7ICAvKiBuZWVkcyBhIGJyZWxzZSAqLwotCQkJcmVsZWFzZV9idWZmZXJfcGFnZShiaCk7CisJCQkvKiBUaGUgYnVmZmVyIG9uIEJKX0ZvcmdldCBsaXN0IGFuZCBub3QgamJkZGlydHkgbWVhbnMKKwkJCSAqIGl0IGhhcyBiZWVuIGZyZWVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gYW5kIGhlbmNlIGl0CisJCQkgKiBjb3VsZCBub3QgaGF2ZSBiZWVuIHJlYWxsb2NhdGVkIHVudGlsIHRoaXMKKwkJCSAqIHRyYW5zYWN0aW9uIGhhcyBjb21taXR0ZWQuICpCVVQqIGl0IGNvdWxkIGJlCisJCQkgKiByZWFsbG9jYXRlZCBvbmNlIHdlIGhhdmUgd3JpdHRlbiBhbGwgdGhlIGRhdGEgdG8KKwkJCSAqIGRpc2sgYW5kIGJlZm9yZSB3ZSBwcm9jZXNzIHRoZSBidWZmZXIgb24gQkpfRm9yZ2V0CisJCQkgKiBsaXN0LiAqLworCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlZmlsZSBvciB1bmZpbGUgZnJlZWQgYnVmZmVyIik7CisJCQlfX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCQlpZiAoIWpoLT5iX3RyYW5zYWN0aW9uKSB7CisJCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQkJIC8qIG5lZWRzIGEgYnJlbHNlICovCisJCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsKKwkJCX0gZWxzZQorCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogCQl9CiAJCWNvbmRfcmVzY2hlZF9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvamJkL3JlY292ZXJ5LmMgYi9mcy9qYmQvcmVjb3ZlcnkuYwppbmRleCA4MGQ3ZjUzLi5kZTViYWZiIDEwMDY0NAotLS0gYS9mcy9qYmQvcmVjb3ZlcnkuYworKysgYi9mcy9qYmQvcmVjb3ZlcnkuYwpAQCAtNTMxLDYgKzUzMSw3IEBACiAJCWRlZmF1bHQ6CiAJCQlqYmRfZGVidWcoMywgIlVucmVjb2duaXNlZCBtYWdpYyAlZCwgZW5kIG9mIHNjYW4uXG4iLAogCQkJCSAgYmxvY2t0eXBlKTsKKwkJCWJyZWxzZShiaCk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9qYmQvdHJhbnNhY3Rpb24uYyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCmluZGV4IGM2MDlmNTAuLjUwOGIyZWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZC90cmFuc2FjdGlvbi5jCisrKyBiL2ZzL2piZC90cmFuc2FjdGlvbi5jCkBAIC0yMjcsNyArMjI3LDggQEAKIAlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOwogCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOwogb3V0OgotCWtmcmVlKG5ld190cmFuc2FjdGlvbik7CisJaWYgKHVubGlrZWx5KG5ld190cmFuc2FjdGlvbikpCQkvKiBJdCdzIHVzdWFsbHkgTlVMTCAqLworCQlrZnJlZShuZXdfdHJhbnNhY3Rpb24pOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTcyNCw3ICs3MjUsOCBAQAogCWpvdXJuYWxfY2FuY2VsX3Jldm9rZShoYW5kbGUsIGpoKTsKIAogb3V0OgotCWtmcmVlKGZyb3plbl9idWZmZXIpOworCWlmICh1bmxpa2VseShmcm96ZW5fYnVmZmVyKSkJLyogSXQncyB1c3VhbGx5IE5VTEwgKi8KKwkJa2ZyZWUoZnJvemVuX2J1ZmZlcik7CiAKIAlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOwogCXJldHVybiBlcnJvcjsKQEAgLTkwMyw3ICs5MDUsOCBAQAogCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOwogb3V0OgogCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7Ci0Ja2ZyZWUoY29tbWl0dGVkX2RhdGEpOworCWlmICh1bmxpa2VseShjb21taXR0ZWRfZGF0YSkpCisJCWtmcmVlKGNvbW1pdHRlZF9kYXRhKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMDM4LDcgKzIwNDEsOCBAQAogCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOwogCWpoLT5iX3RyYW5zYWN0aW9uID0gamgtPmJfbmV4dF90cmFuc2FjdGlvbjsKIAlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gTlVMTDsKLQlfX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGpoLT5iX3RyYW5zYWN0aW9uLCBCSl9NZXRhZGF0YSk7CisJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiwKKwkJCQl3YXNfZGlydHkgPyBCSl9NZXRhZGF0YSA6IEJKX1Jlc2VydmVkKTsKIAlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKIAogCWlmICh3YXNfZGlydHkpCmRpZmYgLS1naXQgYS9mcy9qZmZzL2lub2RlLXYyMy5jIGIvZnMvamZmcy9pbm9kZS12MjMuYwppbmRleCAwMjBjYzA5Li45ZTQ2ZWE2IDEwMDY0NAotLS0gYS9mcy9qZmZzL2lub2RlLXYyMy5jCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTM3Nyw5ICszNzcsOSBAQAogCiAvKiBHZXQgc3RhdGlzdGljcyBvZiB0aGUgZmlsZSBzeXN0ZW0uICAqLwogc3RhdGljIGludAotamZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK2pmZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgZGVudHJ5LT5kX3NiLT5zX2ZzX2luZm87CiAJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWM7CiAKIAlsb2NrX2tlcm5lbCgpOwpAQCAtMTc4NSwxMCArMTc4NSwxMSBAQAogCS5yZW1vdW50X2ZzCT0gamZmc19yZW1vdW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqamZmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgamZmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgamZmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBqZmZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgamZmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKaW5kZXggN2I2YzI0Yi4uMjkwMGVjMyAxMDA2NDQKLS0tIGEvZnMvamZmczIvZnMuYworKysgYi9mcy9qZmZzMi9mcy5jCkBAIC0xOTIsOSArMTkyLDkgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBqZmZzMl9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK2ludCBqZmZzMl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewotCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGRlbnRyeS0+ZF9zYik7CiAJdW5zaWduZWQgbG9uZyBhdmFpbDsKIAogCWJ1Zi0+Zl90eXBlID0gSkZGUzJfU1VQRVJfTUFHSUM7CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9vcy1saW51eC5oIGIvZnMvamZmczIvb3MtbGludXguaAppbmRleCBjZDQwMjFiLi42YjUyMjM1IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9vcy1saW51eC5oCisrKyBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKQEAgLTE3NSw3ICsxNzUsNyBAQAogdm9pZCBqZmZzMl9kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHN0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBpbnQgbW9kZSwKIAkJCSAgICAgICBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSk7Ci1pbnQgamZmczJfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitpbnQgamZmczJfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogdm9pZCBqZmZzMl93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKIGludCBqZmZzMl9kb19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKaW5kZXggOWQwNTIxNC4uMjM3OGE2NiAxMDA2NDQKLS0tIGEvZnMvamZmczIvc3VwZXIuYworKysgYi9mcy9qZmZzMi9zdXBlci5jCkBAIC0xMTEsOSArMTExLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmZnMyX2dldF9zYl9tdGQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCSAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCBtdGRfaW5mbyAqbXRkKQorc3RhdGljIGludCBqZmZzMl9nZXRfc2JfbXRkKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkgICAgdm9pZCAqZGF0YSwgc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkgICAgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKIAlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKQEAgLTEyMSwxOSArMTIyLDIwIEBACiAKIAljID0ga21hbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWMpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAltZW1zZXQoYywgMCwgc2l6ZW9mKCpjKSk7CiAJYy0+bXRkID0gbXRkOwogCiAJc2IgPSBzZ2V0KGZzX3R5cGUsIGpmZnMyX3NiX2NvbXBhcmUsIGpmZnMyX3NiX3NldCwgYyk7CiAKIAlpZiAoSVNfRVJSKHNiKSkKLQkJZ290byBvdXRfcHV0OworCQlnb3RvIG91dF9lcnJvcjsKIAogCWlmIChzYi0+c19yb290KSB7CiAJCS8qIE5ldyBtb3VudHBvaW50IGZvciBKRkZTMiB3aGljaCBpcyBhbHJlYWR5IG1vdW50ZWQgKi8KIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYl9tdGQoKTogRGV2aWNlICVkIChcIiVzXCIpIGlzIGFscmVhZHkgbW91bnRlZFxuIiwKIAkJCSAgbXRkLT5pbmRleCwgbXRkLT5uYW1lKSk7CisJCXJldCA9IHNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCQlnb3RvIG91dF9wdXQ7CiAJfQogCkBAIC0xNjEsNDQgKzE2Myw0NyBAQAogCQkvKiBGYWlsdXJlIGNhc2UuLi4gKi8KIAkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CiAJCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwotCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLQlyZXR1cm4gc2I7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgc2IpOwogCitvdXRfZXJyb3I6CisJcmV0ID0gUFRSX0VSUihzYik7CiAgb3V0X3B1dDoKIAlrZnJlZShjKTsKIAlwdXRfbXRkX2RldmljZShtdGQpOwogCi0JcmV0dXJuIHNiOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmZnMyX2dldF9zYl9tdGRucihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQkJICAgICAgdm9pZCAqZGF0YSwgaW50IG10ZG5yKQorc3RhdGljIGludCBqZmZzMl9nZXRfc2JfbXRkbnIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJICAgICAgdm9pZCAqZGF0YSwgaW50IG10ZG5yLAorCQkJICAgICAgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJc3RydWN0IG10ZF9pbmZvICptdGQ7CiAKIAltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRucik7CiAJaWYgKCFtdGQpIHsKIAkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBNVEQgZGV2aWNlICMldSBkb2Vzbid0IGFwcGVhciB0byBleGlzdFxuIiwgbXRkbnIpKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBqZmZzMl9nZXRfc2JfbXRkKGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXRkKTsKKwlyZXR1cm4gamZmczJfZ2V0X3NiX210ZChmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZCwgbW50KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqamZmczJfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCQkJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCQl2b2lkICpkYXRhKQorc3RhdGljIGludCBqZmZzMl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwogCWludCBtdGRucjsKIAogCWlmICghZGV2X25hbWUpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlyZXR1cm4gLUVJTlZBTDsKIAogCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2IoKTogZGV2X25hbWUgXCIlc1wiXG4iLCBkZXZfbmFtZSkpOwogCkBAIC0yMjAsNyArMjI1LDcgQEAKIAkJCQltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRucik7CiAJCQkJaWYgKG10ZCkgewogCQkJCQlpZiAoIXN0cmNtcChtdGQtPm5hbWUsIGRldl9uYW1lKzQpKQotCQkJCQkJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGQoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtdGQpOworCQkJCQkJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGQoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtdGQsIG1udCk7CiAJCQkJCXB1dF9tdGRfZGV2aWNlKG10ZCk7CiAJCQkJfQogCQkJfQpAQCAtMjMzLDcgKzIzOCw3IEBACiAJCQlpZiAoISplbmRwdHIpIHsKIAkJCQkvKiBJdCB3YXMgYSB2YWxpZCBudW1iZXIgKi8KIAkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2V0X3NiKCk6IG10ZCUlZCwgbXRkbnIgJWRcbiIsIG10ZG5yKSk7Ci0JCQkJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGRucihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZG5yKTsKKwkJCQlyZXR1cm4gamZmczJfZ2V0X3NiX210ZG5yKGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXRkbnIsIG1udCk7CiAJCQl9CiAJCX0KIAl9CkBAIC0yNDcsNyArMjUyLDcgQEAKIAkJICBlcnIsIG5kLmRlbnRyeS0+ZF9pbm9kZSkpOwogCiAJaWYgKGVycikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IC1FSU5WQUw7CiAKQEAgLTI2OSwxMSArMjc0LDExIEBACiAJbXRkbnIgPSBpbWlub3IobmQuZGVudHJ5LT5kX2lub2RlKTsKIAlwYXRoX3JlbGVhc2UoJm5kKTsKIAotCXJldHVybiBqZmZzMl9nZXRfc2JfbXRkbnIoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtdGRucik7CisJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGRucihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZG5yLCBtbnQpOwogCiBvdXQ6CiAJcGF0aF9yZWxlYXNlKCZuZCk7Ci0JcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBqZmZzMl9wdXRfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX21ldGFwYWdlLmMgYi9mcy9qZnMvamZzX21ldGFwYWdlLmMKaW5kZXggMmIyMjBkZC4uN2Y2ZTg4MCAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19tZXRhcGFnZS5jCisrKyBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYwpAQCAtNjMyLDEwICs2MzIsOSBAQAogCQl9CiAJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAl9IGVsc2UgewotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2VfaW5kZXgsCi0JCQkgICAgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIHBhZ2VfaW5kZXgsIE5VTEwpOwogCQlpZiAoSVNfRVJSKHBhZ2UpIHx8ICFQYWdlVXB0b2RhdGUocGFnZSkpIHsKLQkJCWpmc19lcnIoInJlYWRfY2FjaGVfcGFnZSBmYWlsZWQhIik7CisJCQlqZnNfZXJyKCJyZWFkX21hcHBpbmdfcGFnZSBmYWlsZWQhIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlsb2NrX3BhZ2UocGFnZSk7CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IGRiNmY0MWQuLjczZDJhYmEgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0xMzksOSArMTM5LDkgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoamZzX2lub2RlX2NhY2hlcCwgamkpOwogfQogCi1zdGF0aWMgaW50IGpmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgamZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7Ci0Jc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoZGVudHJ5LT5kX3NiKTsKIAlzNjQgbWF4aW5vZGVzOwogCXN0cnVjdCBpbm9tYXAgKmltYXAgPSBKRlNfSVAoc2JpLT5pcGltYXApLT5pX2ltYXA7CiAKQEAgLTU2NSwxMCArNTY1LDExIEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCAKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBqZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGpmc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBqZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIHN0YXRpYyBpbnQgamZzX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpCmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwppbmRleCA3MTQ1YmE3Li5mYzc4NWQ4IDEwMDY0NAotLS0gYS9mcy9saWJmcy5jCisrKyBiL2ZzL2xpYmZzLmMKQEAgLTIwLDkgKzIwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNpbXBsZV9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK2ludCBzaW1wbGVfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlidWYtPmZfdHlwZSA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl90eXBlID0gZGVudHJ5LT5kX3NiLT5zX21hZ2ljOwogCWJ1Zi0+Zl9ic2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlidWYtPmZfbmFtZWxlbiA9IE5BTUVfTUFYOwogCXJldHVybiAwOwpAQCAtMTk2LDkgKzE5Niw5IEBACiAgKiBDb21tb24gaGVscGVyIGZvciBwc2V1ZG8tZmlsZXN5c3RlbXMgKHNvY2tmcywgcGlwZWZzLCBiZGV2IC0gc3R1ZmYgdGhhdAogICogd2lsbCBuZXZlciBiZSBtb3VudGFibGUpCiAgKi8KLXN0cnVjdCBzdXBlcl9ibG9jayAqCi1nZXRfc2JfcHNldWRvKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBjaGFyICpuYW1lLAotCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpvcHMsIHVuc2lnbmVkIGxvbmcgbWFnaWMpCitpbnQgZ2V0X3NiX3BzZXVkbyhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgY2hhciAqbmFtZSwKKwlzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3BzLCB1bnNpZ25lZCBsb25nIG1hZ2ljLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHNnZXQoZnNfdHlwZSwgTlVMTCwgc2V0X2Fub25fc3VwZXIsIE5VTEwpOwogCXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZWZhdWx0X29wcyA9IHsuc3RhdGZzID0gc2ltcGxlX3N0YXRmc307CkBAIC0yMDcsNyArMjA3LDcgQEAKIAlzdHJ1Y3QgcXN0ciBkX25hbWUgPSB7Lm5hbWUgPSBuYW1lLCAubGVuID0gc3RybGVuKG5hbWUpfTsKIAogCWlmIChJU19FUlIocykpCi0JCXJldHVybiBzOworCQlyZXR1cm4gUFRSX0VSUihzKTsKIAogCXMtPnNfZmxhZ3MgPSBNU19OT1VTRVI7CiAJcy0+c19tYXhieXRlcyA9IH4wVUxMOwpAQCAtMjMyLDEyICsyMzIsMTIgQEAKIAlkX2luc3RhbnRpYXRlKGRlbnRyeSwgcm9vdCk7CiAJcy0+c19yb290ID0gZGVudHJ5OwogCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCXJldHVybiBzOworCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHMpOwogCiBFbm9tZW06CiAJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKIAlkZWFjdGl2YXRlX3N1cGVyKHMpOwotCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldHVybiAtRU5PTUVNOwogfQogCiBpbnQgc2ltcGxlX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKQEAgLTQyNCwxMyArNDI0LDEzIEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socGluX2ZzX2xvY2spOwogCi1pbnQgc2ltcGxlX3Bpbl9mcyhjaGFyICpuYW1lLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCkKK2ludCBzaW1wbGVfcGluX2ZzKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCkKIHsKIAlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IE5VTEw7CiAJc3Bpbl9sb2NrKCZwaW5fZnNfbG9jayk7CiAJaWYgKHVubGlrZWx5KCEqbW91bnQpKSB7CiAJCXNwaW5fdW5sb2NrKCZwaW5fZnNfbG9jayk7Ci0JCW1udCA9IGRvX2tlcm5fbW91bnQobmFtZSwgMCwgbmFtZSwgTlVMTCk7CisJCW1udCA9IHZmc19rZXJuX21vdW50KHR5cGUsIDAsIHR5cGUtPm5hbWUsIE5VTEwpOwogCQlpZiAoSVNfRVJSKG1udCkpCiAJCQlyZXR1cm4gUFRSX0VSUihtbnQpOwogCQlzcGluX2xvY2soJnBpbl9mc19sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRsb2NrLmMgYi9mcy9sb2NrZC9jbG50bG9jay5jCmluZGV4IGJjZTc0NDQuLjUyNzc0ZmUgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRsb2NrLmMKKysrIGIvZnMvbG9ja2QvY2xudGxvY2suYwpAQCAtMTQ3LDExICsxNDcsMTAgQEAKICAqIFNvbWVvbmUgaGFzIHNlbnQgdXMgYW4gU01fTk9USUZZLiBFbnN1cmUgd2UgYmluZCB0byB0aGUgbmV3IHBvcnQgbnVtYmVyLAogICogdGhhdCB3ZSBtYXJrIGxvY2tzIGZvciByZWNsYWltaW5nLCBhbmQgdGhhdCB3ZSBidW1wIHRoZSBwc2V1ZG8gTlNNIHN0YXRlLgogICovCi1zdGF0aWMgaW5saW5lCi12b2lkIG5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgdTMyIG5ld3N0YXRlKQorc3RhdGljIHZvaWQgbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0KQogeworCWRvd25fd3JpdGUoJmhvc3QtPmhfcndzZW0pOwogCWhvc3QtPmhfbW9uaXRvcmVkID0gMDsKLQlob3N0LT5oX25zbXN0YXRlID0gbmV3c3RhdGU7CiAJaG9zdC0+aF9zdGF0ZSsrOwogCWhvc3QtPmhfbmV4dHJlYmluZCA9IDA7CiAJbmxtX3JlYmluZF9ob3N0KGhvc3QpOwpAQCAtMTY0LDYgKzE2MywxMyBAQAogCWRwcmludGsoIk5MTTogcmVjbGFpbWluZyBsb2NrcyBmb3IgaG9zdCAlcyIsIGhvc3QtPmhfbmFtZSk7CiB9CiAKK3N0YXRpYyB2b2lkIG5sbWNsbnRfZmluaXNoX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCWhvc3QtPmhfcmVjbGFpbWluZyA9IDA7CisJdXBfd3JpdGUoJmhvc3QtPmhfcndzZW0pOworCWRwcmludGsoIk5MTTogZG9uZSByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzIiwgaG9zdC0+aF9uYW1lKTsKK30KKwogLyoKICAqIFJlY2xhaW0gYWxsIGxvY2tzIG9uIHNlcnZlciBob3N0LiBXZSBkbyB0aGlzIGJ5IHNwYXduaW5nIGEgc2VwYXJhdGUKICAqIHJlY2xhaW1lciB0aHJlYWQuCkBAIC0xNzEsMTIgKzE3NywxMCBAQAogdm9pZAogbmxtY2xudF9yZWNvdmVyeShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHUzMiBuZXdzdGF0ZSkKIHsKLQlpZiAoaG9zdC0+aF9yZWNsYWltaW5nKyspIHsKLQkJaWYgKGhvc3QtPmhfbnNtc3RhdGUgPT0gbmV3c3RhdGUpCi0JCQlyZXR1cm47Ci0JCW5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKGhvc3QsIG5ld3N0YXRlKTsKLQl9IGVsc2UgewotCQlubG1jbG50X3ByZXBhcmVfcmVjbGFpbShob3N0LCBuZXdzdGF0ZSk7CisJaWYgKGhvc3QtPmhfbnNtc3RhdGUgPT0gbmV3c3RhdGUpCisJCXJldHVybjsKKwlob3N0LT5oX25zbXN0YXRlID0gbmV3c3RhdGU7CisJaWYgKCFob3N0LT5oX3JlY2xhaW1pbmcrKykgewogCQlubG1fZ2V0X2hvc3QoaG9zdCk7CiAJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgaG9zdCwgQ0xPTkVfS0VSTkVMKSA8IDApCkBAIC0xOTAsNiArMTk0LDcgQEAKIAlzdHJ1Y3QgbmxtX2hvc3QJICAqaG9zdCA9IChzdHJ1Y3QgbmxtX2hvc3QgKikgcHRyOwogCXN0cnVjdCBubG1fd2FpdAkgICpibG9jazsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgKm5leHQ7CisJdTMyIG5zbXN0YXRlOwogCiAJZGFlbW9uaXplKCIlcy1yZWNsYWltIiwgaG9zdC0+aF9uYW1lKTsKIAlhbGxvd19zaWduYWwoU0lHS0lMTCk7CkBAIC0xOTksMTkgKzIwNCwyNSBAQAogCWxvY2tfa2VybmVsKCk7CiAJbG9ja2RfdXAoKTsKIAorCW5sbWNsbnRfcHJlcGFyZV9yZWNsYWltKGhvc3QpOwogCS8qIEZpcnN0LCByZWNsYWltIGFsbCBsb2NrcyB0aGF0IGhhdmUgYmVlbiBtYXJrZWQuICovCiByZXN0YXJ0OgorCW5zbXN0YXRlID0gaG9zdC0+aF9uc21zdGF0ZTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmwsIG5leHQsICZob3N0LT5oX3JlY2xhaW0sIGZsX3UubmZzX2ZsLmxpc3QpIHsKIAkJbGlzdF9kZWxfaW5pdCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QpOwogCiAJCWlmIChzaWduYWxsZWQoKSkKIAkJCWNvbnRpbnVlOwotCQlpZiAobmxtY2xudF9yZWNsYWltKGhvc3QsIGZsKSA9PSAwKQotCQkJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QsICZob3N0LT5oX2dyYW50ZWQpOwotCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChubG1jbG50X3JlY2xhaW0oaG9zdCwgZmwpICE9IDApCisJCQljb250aW51ZTsKKwkJbGlzdF9hZGRfdGFpbCgmZmwtPmZsX3UubmZzX2ZsLmxpc3QsICZob3N0LT5oX2dyYW50ZWQpOworCQlpZiAoaG9zdC0+aF9uc21zdGF0ZSAhPSBuc21zdGF0ZSkgeworCQkJLyogQXJnaCEgVGhlIHNlcnZlciByZWJvb3RlZCBhZ2FpbiEgKi8KKwkJCWxpc3Rfc3BsaWNlX2luaXQoJmhvc3QtPmhfZ3JhbnRlZCwgJmhvc3QtPmhfcmVjbGFpbSk7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KIAl9Ci0KLQlob3N0LT5oX3JlY2xhaW1pbmcgPSAwOworCW5sbWNsbnRfZmluaXNoX3JlY2xhaW0oaG9zdCk7CiAKIAkvKiBOb3csIHdha2UgdXAgYWxsIHByb2Nlc3NlcyB0aGF0IHNsZWVwIG9uIGEgYmxvY2tlZCBsb2NrICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJm5sbV9ibG9ja2VkLCBiX2xpc3QpIHsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMgYi9mcy9sb2NrZC9jbG50cHJvYy5jCmluZGV4IGY5NmUzODEuLjRkYjYyMDkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tkL2NsbnRwcm9jLmMKKysrIGIvZnMvbG9ja2QvY2xudHByb2MuYwpAQCAtNTA4LDcgKzUwOCwxMCBAQAogCX0KIAogCWJsb2NrID0gbmxtY2xudF9wcmVwYXJlX2Jsb2NrKGhvc3QsIGZsKTsKK2FnYWluOgogCWZvcig7OykgeworCQkvKiBSZWJvb3QgcHJvdGVjdGlvbiAqLworCQlmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgPSBob3N0LT5oX3N0YXRlOwogCQlzdGF0dXMgPSBubG1jbG50X2NhbGwocmVxLCBOTE1QUk9DX0xPQ0spOwogCQlpZiAoc3RhdHVzIDwgMCkKIAkJCWdvdG8gb3V0X3VuYmxvY2s7CkBAIC01MzEsMTAgKzUzNCwxNiBAQAogCX0KIAogCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7Ci0JCWZsLT5mbF91Lm5mc19mbC5zdGF0ZSA9IGhvc3QtPmhfc3RhdGU7CisJCWRvd25fcmVhZCgmaG9zdC0+aF9yd3NlbSk7CisJCS8qIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkICovCisJCWlmIChmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgIT0gaG9zdC0+aF9zdGF0ZSkgeworCQkJdXBfcmVhZCgmaG9zdC0+aF9yd3NlbSk7CisJCQlnb3RvIGFnYWluOworCQl9CiAJCWZsLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKIAkJLyogRW5zdXJlIHRoZSByZXN1bHRpbmcgbG9jayB3aWxsIGdldCBhZGRlZCB0byBncmFudGVkIGxpc3QgKi8KIAkJZG9fdmZzX2xvY2soZmwpOworCQl1cF9yZWFkKCZob3N0LT5oX3J3c2VtKTsKIAl9CiAJc3RhdHVzID0gbmxtX3N0YXRfdG9fZXJybm8ocmVzcC0+c3RhdHVzKTsKIG91dF91bmJsb2NrOgpAQCAtNTk2LDYgKzYwNSw3IEBACiBzdGF0aWMgaW50CiBubG1jbG50X3VubG9jayhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCiB7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CiAJc3RydWN0IG5sbV9yZXMJKnJlc3AgPSAmcmVxLT5hX3JlczsKIAlpbnQJCXN0YXR1czsKIApAQCAtNjA0LDcgKzYxNCw5IEBACiAJICogcmVxdWVzdCwgb3IgdG8gZGVueSBpdCB3aXRoIE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRC4gSW4gZWl0aGVyCiAJICogY2FzZSwgd2Ugd2FudCB0byB1bmxvY2suCiAJICovCisJZG93bl9yZWFkKCZob3N0LT5oX3J3c2VtKTsKIAlkb192ZnNfbG9jayhmbCk7CisJdXBfcmVhZCgmaG9zdC0+aF9yd3NlbSk7CiAKIAlpZiAocmVxLT5hX2ZsYWdzICYgUlBDX1RBU0tfQVNZTkMpCiAJCXJldHVybiBubG1fYXN5bmNfY2FsbChyZXEsIE5MTVBST0NfVU5MT0NLLCAmbmxtY2xudF91bmxvY2tfb3BzKTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL2hvc3QuYyBiL2ZzL2xvY2tkL2hvc3QuYwppbmRleCA3MjlhYzQyLi4zOGIwZThhIDEwMDY0NAotLS0gYS9mcy9sb2NrZC9ob3N0LmMKKysrIGIvZnMvbG9ja2QvaG9zdC5jCkBAIC0xMTIsMTEgKzExMiwxMiBAQAogCWhvc3QtPmhfdmVyc2lvbiAgICA9IHZlcnNpb247CiAJaG9zdC0+aF9wcm90byAgICAgID0gcHJvdG87CiAJaG9zdC0+aF9ycGNjbG50ICAgID0gTlVMTDsKLQlpbml0X01VVEVYKCZob3N0LT5oX3NlbWEpOworCW11dGV4X2luaXQoJmhvc3QtPmhfbXV0ZXgpOwogCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CiAJaG9zdC0+aF9leHBpcmVzICAgID0gamlmZmllcyArIE5MTV9IT1NUX0VYUElSRTsKIAlhdG9taWNfc2V0KCZob3N0LT5oX2NvdW50LCAxKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZob3N0LT5oX2dyYWNld2FpdCk7CisJaW5pdF9yd3NlbSgmaG9zdC0+aF9yd3NlbSk7CiAJaG9zdC0+aF9zdGF0ZSAgICAgID0gMDsJCQkvKiBwc2V1ZG8gTlNNIHN0YXRlICovCiAJaG9zdC0+aF9uc21zdGF0ZSAgID0gMDsJCQkvKiByZWFsIE5TTSBzdGF0ZSAqLwogCWhvc3QtPmhfc2VydmVyCSAgID0gc2VydmVyOwpAQCAtMTcyLDcgKzE3Myw3IEBACiAJCQkodW5zaWduZWQpbnRvaGwoaG9zdC0+aF9hZGRyLnNpbl9hZGRyLnNfYWRkcikpOwogCiAJLyogTG9jayBob3N0IGhhbmRsZSAqLwotCWRvd24oJmhvc3QtPmhfc2VtYSk7CisJbXV0ZXhfbG9jaygmaG9zdC0+aF9tdXRleCk7CiAKIAkvKiBJZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYW4gUlBDIGNsaWVudCwgY2hlY2sgd2hldGhlcgogCSAqIFJQQyByZWJpbmQgaXMgcmVxdWlyZWQKQEAgLTIwNCwxMiArMjA1LDEyIEBACiAJCWhvc3QtPmhfcnBjY2xudCA9IGNsbnQ7CiAJfQogCi0JdXAoJmhvc3QtPmhfc2VtYSk7CisJbXV0ZXhfdW5sb2NrKCZob3N0LT5oX211dGV4KTsKIAlyZXR1cm4gY2xudDsKIAogZm9yZ2V0aXQ6CiAJcHJpbnRrKCJsb2NrZDogY291bGRuJ3QgY3JlYXRlIFJQQyBoYW5kbGUgZm9yICVzXG4iLCBob3N0LT5oX25hbWUpOwotCXVwKCZob3N0LT5oX3NlbWEpOworCW11dGV4X3VubG9jaygmaG9zdC0+aF9tdXRleCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2xvY2tzLmMgYi9mcy9sb2Nrcy5jCmluZGV4IGFiNjFhOGIuLjFhZDI5YzkgMTAwNjQ0Ci0tLSBhL2ZzL2xvY2tzLmMKKysrIGIvZnMvbG9ja3MuYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAgKiBmcm9tIGEgYnJva2VuIE5GUyBjbGllbnQuIEJ1dCBicm9rZW4gTkZTIGNsaWVudHMgaGF2ZSBhIGxvdCBtb3JlIHRvCiAgKiB3b3JyeSBhYm91dCB0aGFuIHByb3BlciBkZWFkbG9jayBkZXRlY3Rpb24gYW55d2F5Li4uIC0tb2tpcgogICovCi1pbnQgcG9zaXhfbG9ja3NfZGVhZGxvY2soc3RydWN0IGZpbGVfbG9jayAqY2FsbGVyX2ZsLAorc3RhdGljIGludCBwb3NpeF9sb2Nrc19kZWFkbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpjYWxsZXJfZmwsCiAJCQkJc3RydWN0IGZpbGVfbG9jayAqYmxvY2tfZmwpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwpAQCAtNzIyLDggKzcyMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0wocG9zaXhfbG9ja3NfZGVhZGxvY2spOwotCiAvKiBUcnkgdG8gY3JlYXRlIGEgRkxPQ0sgbG9jayBvbiBmaWxwLiBXZSBhbHdheXMgaW5zZXJ0IG5ldyBGTE9DSyBsb2NrcwogICogYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIGJ1dCB0aGF0J3Mgc2VjcmV0IGtub3dsZWRnZSBrbm93biBvbmx5IHRvCiAgKiBmbG9ja19sb2NrX2ZpbGUgYW5kIHBvc2l4X2xvY2tfZmlsZS4KQEAgLTc5NCw3ICs3OTIsOCBAQAogc3RhdGljIGludCBfX3Bvc2l4X2xvY2tfZmlsZV9jb25mKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QsIHN0cnVjdCBmaWxlX2xvY2sgKmNvbmZsb2NrKQogewogCXN0cnVjdCBmaWxlX2xvY2sgKmZsOwotCXN0cnVjdCBmaWxlX2xvY2sgKm5ld19mbCwgKm5ld19mbDI7CisJc3RydWN0IGZpbGVfbG9jayAqbmV3X2ZsID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpuZXdfZmwyID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpsZWZ0ID0gTlVMTDsKIAlzdHJ1Y3QgZmlsZV9sb2NrICpyaWdodCA9IE5VTEw7CiAJc3RydWN0IGZpbGVfbG9jayAqKmJlZm9yZTsKQEAgLTgwMyw5ICs4MDIsMTUgQEAKIAkvKgogCSAqIFdlIG1heSBuZWVkIHR3byBmaWxlX2xvY2sgc3RydWN0dXJlcyBmb3IgdGhpcyBvcGVyYXRpb24sCiAJICogc28gd2UgZ2V0IHRoZW0gaW4gYWR2YW5jZSB0byBhdm9pZCByYWNlcy4KKwkgKgorCSAqIEluIHNvbWUgY2FzZXMgd2UgY2FuIGJlIHN1cmUsIHRoYXQgbm8gbmV3IGxvY2tzIHdpbGwgYmUgbmVlZGVkCiAJICovCi0JbmV3X2ZsID0gbG9ja3NfYWxsb2NfbG9jaygpOwotCW5ld19mbDIgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisJaWYgKCEocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpICYmCisJICAgIChyZXF1ZXN0LT5mbF90eXBlICE9IEZfVU5MQ0sgfHwKKwkgICAgIHJlcXVlc3QtPmZsX3N0YXJ0ICE9IDAgfHwgcmVxdWVzdC0+ZmxfZW5kICE9IE9GRlNFVF9NQVgpKSB7CisJCW5ld19mbCA9IGxvY2tzX2FsbG9jX2xvY2soKTsKKwkJbmV3X2ZsMiA9IGxvY2tzX2FsbG9jX2xvY2soKTsKKwl9CiAKIAlsb2NrX2tlcm5lbCgpOwogCWlmIChyZXF1ZXN0LT5mbF90eXBlICE9IEZfVU5MQ0spIHsKQEAgLTgzNCwxNCArODM5LDcgQEAKIAlpZiAocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpCiAJCWdvdG8gb3V0OwogCi0JZXJyb3IgPSAtRU5PTENLOyAvKiAibm8gbHVjayIgKi8KLQlpZiAoIShuZXdfZmwgJiYgbmV3X2ZsMikpCi0JCWdvdG8gb3V0OwotCiAJLyoKLQkgKiBXZSd2ZSBhbGxvY2F0ZWQgdGhlIG5ldyBsb2NrcyBpbiBhZHZhbmNlLCBzbyB0aGVyZSBhcmUgbm8KLQkgKiBlcnJvcnMgcG9zc2libGUgKGFuZCBubyBibG9ja2luZyBvcGVyYXRpb25zKSBmcm9tIGhlcmUgb24uCi0JICogCiAJICogRmluZCB0aGUgZmlyc3Qgb2xkIGxvY2sgd2l0aCB0aGUgc2FtZSBvd25lciBhcyB0aGUgbmV3IGxvY2suCiAJICovCiAJCkBAIC05MzgsMTAgKzkzNiwyNSBAQAogCQliZWZvcmUgPSAmZmwtPmZsX25leHQ7CiAJfQogCisJLyoKKwkgKiBUaGUgYWJvdmUgY29kZSBvbmx5IG1vZGlmaWVzIGV4aXN0aW5nIGxvY2tzIGluIGNhc2Ugb2YKKwkgKiBtZXJnaW5nIG9yIHJlcGxhY2luZy4gIElmIG5ldyBsb2NrKHMpIG5lZWQgdG8gYmUgaW5zZXJ0ZWQKKwkgKiBhbGwgbW9kaWZpY2F0aW9ucyBhcmUgZG9uZSBiZWxsb3cgdGhpcywgc28gaXQncyBzYWZlIHlldCB0bworCSAqIGJhaWwgb3V0LgorCSAqLworCWVycm9yID0gLUVOT0xDSzsgLyogIm5vIGx1Y2siICovCisJaWYgKHJpZ2h0ICYmIGxlZnQgPT0gcmlnaHQgJiYgIW5ld19mbDIpCisJCWdvdG8gb3V0OworCiAJZXJyb3IgPSAwOwogCWlmICghYWRkZWQpIHsKIAkJaWYgKHJlcXVlc3QtPmZsX3R5cGUgPT0gRl9VTkxDSykKIAkJCWdvdG8gb3V0OworCisJCWlmICghbmV3X2ZsKSB7CisJCQllcnJvciA9IC1FTk9MQ0s7CisJCQlnb3RvIG91dDsKKwkJfQogCQlsb2Nrc19jb3B5X2xvY2sobmV3X2ZsLCByZXF1ZXN0KTsKIAkJbG9ja3NfaW5zZXJ0X2xvY2soYmVmb3JlLCBuZXdfZmwpOwogCQluZXdfZmwgPSBOVUxMOwpAQCAtMTg4MSwxOSArMTg5NCwxOCBAQAogICovCiB2b2lkIGxvY2tzX3JlbW92ZV9wb3NpeChzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBvd25lcikKIHsKLQlzdHJ1Y3QgZmlsZV9sb2NrIGxvY2ssICoqYmVmb3JlOworCXN0cnVjdCBmaWxlX2xvY2sgbG9jazsKIAogCS8qCiAJICogSWYgdGhlcmUgYXJlIG5vIGxvY2tzIGhlbGQgb24gdGhpcyBmaWxlLCB3ZSBkb24ndCBuZWVkIHRvIGNhbGwKIAkgKiBwb3NpeF9sb2NrX2ZpbGUoKS4gIEFub3RoZXIgcHJvY2VzcyBjb3VsZCBiZSBzZXR0aW5nIGEgbG9jayBvbiB0aGlzCiAJICogZmlsZSBhdCB0aGUgc2FtZSB0aW1lLCBidXQgd2Ugd291bGRuJ3QgcmVtb3ZlIHRoYXQgbG9jayBhbnl3YXkuCiAJICovCi0JYmVmb3JlID0gJmZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrOwotCWlmICgqYmVmb3JlID09IE5VTEwpCisJaWYgKCFmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jaykKIAkJcmV0dXJuOwogCiAJbG9jay5mbF90eXBlID0gRl9VTkxDSzsKLQlsb2NrLmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJbG9jay5mbF9mbGFncyA9IEZMX1BPU0lYIHwgRkxfQ0xPU0U7CiAJbG9jay5mbF9zdGFydCA9IDA7CiAJbG9jay5mbF9lbmQgPSBPRkZTRVRfTUFYOwogCWxvY2suZmxfb3duZXIgPSBvd25lcjsKQEAgLTE5MDIsMjUgKzE5MTQsMTEgQEAKIAlsb2NrLmZsX29wcyA9IE5VTEw7CiAJbG9jay5mbF9sbW9wcyA9IE5VTEw7CiAKLQlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrICE9IE5VTEwpIHsKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrICE9IE5VTEwpCiAJCWZpbHAtPmZfb3AtPmxvY2soZmlscCwgRl9TRVRMSywgJmxvY2spOwotCQlnb3RvIG91dDsKLQl9CisJZWxzZQorCQlwb3NpeF9sb2NrX2ZpbGUoZmlscCwgJmxvY2spOwogCi0JLyogQ2FuJ3QgdXNlIHBvc2l4X2xvY2tfZmlsZSBoZXJlOyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBubyBtYXR0ZXIKLQkgKiB3aGljaCBwaWQgd2UgaGF2ZS4KLQkgKi8KLQlsb2NrX2tlcm5lbCgpOwotCXdoaWxlICgqYmVmb3JlICE9IE5VTEwpIHsKLQkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOwotCQlpZiAoSVNfUE9TSVgoZmwpICYmIHBvc2l4X3NhbWVfb3duZXIoZmwsICZsb2NrKSkgewotCQkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKLQl9Ci0JdW5sb2NrX2tlcm5lbCgpOwotb3V0OgogCWlmIChsb2NrLmZsX29wcyAmJiBsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQogCQlsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKCZsb2NrKTsKIH0KQEAgLTIyMDYsNjMgKzIyMDQsNiBAQAogCiBFWFBPUlRfU1lNQk9MKGxvY2tfbWF5X3dyaXRlKTsKIAotc3RhdGljIGlubGluZSB2b2lkIF9fc3RlYWxfbG9ja3Moc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgZnJvbSkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IGZpbGVfbG9jayAqZmwgPSBpbm9kZS0+aV9mbG9jazsKLQotCXdoaWxlIChmbCkgewotCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlsZSAmJiBmbC0+Zmxfb3duZXIgPT0gZnJvbSkKLQkJCWZsLT5mbF9vd25lciA9IGN1cnJlbnQtPmZpbGVzOwotCQlmbCA9IGZsLT5mbF9uZXh0OwotCX0KLX0KLQotLyogV2hlbiBnZXR0aW5nIHJlYWR5IGZvciBleGVjdXRpbmcgYSBiaW5hcnksIHdlIG1ha2Ugc3VyZSB0aGF0IGN1cnJlbnQKLSAqIGhhcyBhIGZpbGVzX3N0cnVjdCBvbiBpdHMgb3duLiBCZWZvcmUgZHJvcHBpbmcgdGhlIG9sZCBmaWxlc19zdHJ1Y3QsCi0gKiB3ZSB0YWtlIG92ZXIgb3duZXJzaGlwIG9mIGFsbCBsb2NrcyBmb3IgYWxsIGZpbGUgZGVzY3JpcHRvcnMgd2Ugb3duLgotICogTm90ZSB0aGF0IHdlIG1heSBhY2NpZGVudGFsbHkgc3RlYWwgYSBsb2NrIGZvciBhIGZpbGUgdGhhdCBhIHNpYmxpbmcKLSAqIGhhcyBjcmVhdGVkIHNpbmNlIHRoZSB1bnNoYXJlX2ZpbGVzKCkgY2FsbC4KLSAqLwotdm9pZCBzdGVhbF9sb2NrcyhmbF9vd25lcl90IGZyb20pCi17Ci0Jc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgZmR0YWJsZSAqZmR0OwotCi0JaWYgKGZyb20gPT0gZmlsZXMpCi0JCXJldHVybjsKLQotCWxvY2tfa2VybmVsKCk7Ci0JaiA9IDA7Ci0KLQkvKgotCSAqIFdlIGFyZSBub3QgdGFraW5nIGEgcmVmIHRvIHRoZSBmaWxlIHN0cnVjdHVyZXMsIHNvCi0JICogd2UgbmVlZCB0byBhY3F1aXJlIC0+ZmlsZV9sb2NrLgotCSAqLwotCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7Ci0JZmR0ID0gZmlsZXNfZmR0YWJsZShmaWxlcyk7Ci0JZm9yICg7OykgewotCQl1bnNpZ25lZCBsb25nIHNldDsKLQkJaSA9IGogKiBfX05GREJJVFM7Ci0JCWlmIChpID49IGZkdC0+bWF4X2Zkc2V0IHx8IGkgPj0gZmR0LT5tYXhfZmRzKQotCQkJYnJlYWs7Ci0JCXNldCA9IGZkdC0+b3Blbl9mZHMtPmZkc19iaXRzW2orK107Ci0JCXdoaWxlIChzZXQpIHsKLQkJCWlmIChzZXQgJiAxKSB7Ci0JCQkJc3RydWN0IGZpbGUgKmZpbGUgPSBmZHQtPmZkW2ldOwotCQkJCWlmIChmaWxlKQotCQkJCQlfX3N0ZWFsX2xvY2tzKGZpbGUsIGZyb20pOwotCQkJfQotCQkJaSsrOwotCQkJc2V0ID4+PSAxOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKLQl1bmxvY2tfa2VybmVsKCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHN0ZWFsX2xvY2tzKTsKLQogc3RhdGljIGludCBfX2luaXQgZmlsZWxvY2tfaW5pdCh2b2lkKQogewogCWZpbGVsb2NrX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZpbGVfbG9ja19jYWNoZSIsCmRpZmYgLS1naXQgYS9mcy9taW5peC9kaXIuYyBiL2ZzL21pbml4L2Rpci5jCmluZGV4IDY5MjI0ZDEuLjJiMGEzODkgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2Rpci5jCisrKyBiL2ZzL21pbml4L2Rpci5jCkBAIC02MCw4ICs2MCw3IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKiBkaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOwotCXN0cnVjdCBwYWdlICpwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCi0JCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCXN0cnVjdCBwYWdlICpwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7CiAJaWYgKCFJU19FUlIocGFnZSkpIHsKIAkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKIAkJa21hcChwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL21pbml4L2lub2RlLmMgYi9mcy9taW5peC9pbm9kZS5jCmluZGV4IDJkY2NjZjEuLmE2ZmI1MDkgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2lub2RlLmMKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtMTksNyArMTksNyBAQAogCiBzdGF0aWMgdm9pZCBtaW5peF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKTsKIHN0YXRpYyBpbnQgbWluaXhfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB3YWl0KTsKLXN0YXRpYyBpbnQgbWluaXhfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpOworc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIHN0YXRpYyBpbnQgbWluaXhfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7CiAKIHN0YXRpYyB2b2lkIG1pbml4X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtMjk2LDExICsyOTYsMTEgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgbWluaXhfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2Ioc2IpOwotCWJ1Zi0+Zl90eXBlID0gc2ItPnNfbWFnaWM7Ci0JYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihkZW50cnktPmRfc2IpOworCWJ1Zi0+Zl90eXBlID0gZGVudHJ5LT5kX3NiLT5zX21hZ2ljOworCWJ1Zi0+Zl9ic2l6ZSA9IGRlbnRyeS0+ZF9zYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IChzYmktPnNfbnpvbmVzIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmUpIDw8IHNiaS0+c19sb2dfem9uZV9zaXplOwogCWJ1Zi0+Zl9iZnJlZSA9IG1pbml4X2NvdW50X2ZyZWVfYmxvY2tzKHNiaSk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKQEAgLTU1OSwxMCArNTU5LDExIEBACiAJCVYyX21pbml4X3RydW5jYXRlKGlub2RlKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbWluaXhfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG1pbml4X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtaW5peF9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtaW5peF9maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG1pbml4X2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9tcGFnZS5jIGIvZnMvbXBhZ2UuYwppbmRleCA5YmYyZWIzLi4xZTQ1OTgyIDEwMDY0NAotLS0gYS9mcy9tcGFnZS5jCisrKyBiL2ZzL21wYWdlLmMKQEAgLTcwNyw5ICs3MDcsOSBAQAogCXN0cnVjdCBwYWdldmVjIHB2ZWM7CiAJaW50IG5yX3BhZ2VzOwogCXBnb2ZmX3QgaW5kZXg7Ci0JcGdvZmZfdCBlbmQgPSAtMTsJCS8qIEluY2x1c2l2ZSAqLworCXBnb2ZmX3QgZW5kOwkJLyogSW5jbHVzaXZlICovCiAJaW50IHNjYW5uZWQgPSAwOwotCWludCBpc19yYW5nZSA9IDA7CisJaW50IHJhbmdlX3dob2xlID0gMDsKIAogCWlmICh3YmMtPm5vbmJsb2NraW5nICYmIGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkgewogCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOwpAQCAtNzIxLDE2ICs3MjEsMTQgQEAKIAkJd3JpdGVwYWdlID0gbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZTsKIAogCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7Ci0JaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgeworCWlmICh3YmMtPnJhbmdlX2N5Y2xpYykgewogCQlpbmRleCA9IG1hcHBpbmctPndyaXRlYmFja19pbmRleDsgLyogU3RhcnQgZnJvbSBwcmV2IG9mZnNldCAqLworCQllbmQgPSAtMTsKIAl9IGVsc2UgewotCQlpbmRleCA9IDA7CQkJICAvKiB3aG9sZS1maWxlIHN3ZWVwICovCi0JCXNjYW5uZWQgPSAxOwotCX0KLQlpZiAod2JjLT5zdGFydCB8fCB3YmMtPmVuZCkgewotCQlpbmRleCA9IHdiYy0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJZW5kID0gd2JjLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJaXNfcmFuZ2UgPSAxOworCQlpbmRleCA9IHdiYy0+cmFuZ2Vfc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJZW5kID0gd2JjLT5yYW5nZV9lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaWYgKHdiYy0+cmFuZ2Vfc3RhcnQgPT0gMCAmJiB3YmMtPnJhbmdlX2VuZCA9PSBMTE9OR19NQVgpCisJCQlyYW5nZV93aG9sZSA9IDE7CiAJCXNjYW5uZWQgPSAxOwogCX0KIHJldHJ5OgpAQCAtNzU5LDcgKzc1Nyw3IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWlmICh1bmxpa2VseShpc19yYW5nZSkgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKKwkJCWlmICghd2JjLT5yYW5nZV9jeWNsaWMgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKIAkJCQlkb25lID0gMTsKIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQljb250aW51ZTsKQEAgLTgxMCw3ICs4MDgsNyBAQAogCQlpbmRleCA9IDA7CiAJCWdvdG8gcmV0cnk7CiAJfQotCWlmICghaXNfcmFuZ2UpCisJaWYgKHdiYy0+cmFuZ2VfY3ljbGljIHx8IChyYW5nZV93aG9sZSAmJiB3YmMtPm5yX3RvX3dyaXRlID4gMCkpCiAJCW1hcHBpbmctPndyaXRlYmFja19pbmRleCA9IGluZGV4OwogCWlmIChiaW8pCiAJCW1wYWdlX2Jpb19zdWJtaXQoV1JJVEUsIGJpbyk7CmRpZmYgLS1naXQgYS9mcy9tc2Rvcy9uYW1laS5jIGIvZnMvbXNkb3MvbmFtZWkuYwppbmRleCA1Yjc2Y2NkLi45ZTQ0MTU4IDEwMDY0NAotLS0gYS9mcy9tc2Rvcy9uYW1laS5jCisrKyBiL2ZzL21zZG9zL25hbWVpLmMKQEAgLTY2MSwxMSArNjYxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm1zZG9zX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQkJdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgbXNkb3NfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCXZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG1zZG9zX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG1zZG9zX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbXNkb3NfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IDE4NGZlNGFjLi5jNzg0ZThiIDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTIyNDMsMTQgKzIyNDMsMTYgQEAKIAlpbnQgZXJyb3I7CiAJY2hhciAqIHRvOwogCi0JaWYgKGZsYWdzICE9IDApCisJaWYgKChmbGFncyAmIH5BVF9TWU1MSU5LX0ZPTExPVykgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAl0byA9IGdldG5hbWUobmV3bmFtZSk7CiAJaWYgKElTX0VSUih0bykpCiAJCXJldHVybiBQVFJfRVJSKHRvKTsKIAotCWVycm9yID0gX191c2VyX3dhbGtfZmQob2xkZGZkLCBvbGRuYW1lLCAwLCAmb2xkX25kKTsKKwllcnJvciA9IF9fdXNlcl93YWxrX2ZkKG9sZGRmZCwgb2xkbmFtZSwKKwkJCSAgICAgICBmbGFncyAmIEFUX1NZTUxJTktfRk9MTE9XID8gTE9PS1VQX0ZPTExPVyA6IDAsCisJCQkgICAgICAgJm9sZF9uZCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIGV4aXQ7CiAJZXJyb3IgPSBkb19wYXRoX2xvb2t1cChuZXdkZmQsIHRvLCBMT09LVVBfUEFSRU5ULCAmbmQpOwpAQCAtMjU3Nyw4ICsyNTc5LDcgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZzsKLQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIDAsIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwKLQkJCQlOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgMCwgTlVMTCk7CiAJaWYgKElTX0VSUihwYWdlKSkKIAkJZ290byBzeW5jX2ZhaWw7CiAJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKaW5kZXggYmY0NzhhZC4uODY2NDMwYiAxMDA2NDQKLS0tIGEvZnMvbmFtZXNwYWNlLmMKKysrIGIvZnMvbmFtZXNwYWNlLmMKQEAgLTg2LDYgKzg2LDE1IEBACiAJcmV0dXJuIG1udDsKIH0KIAoraW50IHNpbXBsZV9zZXRfbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW1udC0+bW50X3NiID0gc2I7CisJbW50LT5tbnRfcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3NldF9tbnQpOworCiB2b2lkIGZyZWVfdmZzbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCWtmcmVlKG1udC0+bW50X2Rldm5hbWUpOwpAQCAtNTc2LDggKzU4NSw4IEBACiAJICovCiAKIAlsb2NrX2tlcm5lbCgpOwotCWlmICgoZmxhZ3MgJiBNTlRfRk9SQ0UpICYmIHNiLT5zX29wLT51bW91bnRfYmVnaW4pCi0JCXNiLT5zX29wLT51bW91bnRfYmVnaW4oc2IpOworCWlmIChzYi0+c19vcC0+dW1vdW50X2JlZ2luKQorCQlzYi0+c19vcC0+dW1vdW50X2JlZ2luKG1udCwgZmxhZ3MpOwogCXVubG9ja19rZXJuZWwoKTsKIAogCS8qCkBAIC0xMTYzLDEzICsxMTcyLDQ2IEBACiB9CiAKIC8qCisgKiBnbyB0aHJvdWdoIHRoZSB2ZnNtb3VudHMgd2UndmUganVzdCBjb25zaWduZWQgdG8gdGhlIGdyYXZleWFyZCB0bworICogLSBjaGVjayB0aGF0IHRoZXkncmUgc3RpbGwgZGVhZAorICogLSBkZWxldGUgdGhlIHZmc21vdW50IGZyb20gdGhlIGFwcHJvcHJpYXRlIG5hbWVzcGFjZSB1bmRlciBsb2NrCisgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQorICovCitzdGF0aWMgdm9pZCBleHBpcmVfbW91bnRfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpncmF2ZXlhcmQsIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cykKK3sKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoZ3JhdmV5YXJkKSkgeworCQlMSVNUX0hFQUQodW1vdW50cyk7CisJCW1udCA9IGxpc3RfZW50cnkoZ3JhdmV5YXJkLT5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9leHBpcmUpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9leHBpcmUpOworCisJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKKwkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCisJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKKwkJaWYgKCFuYW1lc3BhY2UgfHwgIW5hbWVzcGFjZS0+cm9vdCkKKwkJCWNvbnRpbnVlOworCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQlkb3duX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKKwkJZXhwaXJlX21vdW50KG1udCwgbW91bnRzLCAmdW1vdW50cyk7CisJCXVwX3dyaXRlKCZuYW1lc3BhY2Vfc2VtKTsKKwkJcmVsZWFzZV9tb3VudHMoJnVtb3VudHMpOworCQltbnRwdXQobW50KTsKKwkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCX0KK30KKworLyoKICAqIHByb2Nlc3MgYSBsaXN0IG9mIGV4cGlyYWJsZSBtb3VudHBvaW50cyB3aXRoIHRoZSBpbnRlbnQgb2YgZGlzY2FyZGluZyBhbnkKICAqIG1vdW50cG9pbnRzIHRoYXQgYXJlbid0IGluIHVzZSBhbmQgaGF2ZW4ndCBiZWVuIHRvdWNoZWQgc2luY2UgbGFzdCB3ZSBjYW1lCiAgKiBoZXJlCiAgKi8KIHZvaWQgbWFya19tb3VudHNfZm9yX2V4cGlyeShzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpCiB7Ci0Jc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlOwogCXN0cnVjdCB2ZnNtb3VudCAqbW50LCAqbmV4dDsKIAlMSVNUX0hFQUQoZ3JhdmV5YXJkKTsKIApAQCAtMTE5MywzMyArMTIzNSw3IEBACiAJCWxpc3RfbW92ZSgmbW50LT5tbnRfZXhwaXJlLCAmZ3JhdmV5YXJkKTsKIAl9CiAKLQkvKgotCSAqIGdvIHRocm91Z2ggdGhlIHZmc21vdW50cyB3ZSd2ZSBqdXN0IGNvbnNpZ25lZCB0byB0aGUgZ3JhdmV5YXJkIHRvCi0JICogLSBjaGVjayB0aGF0IHRoZXkncmUgc3RpbGwgZGVhZAotCSAqIC0gZGVsZXRlIHRoZSB2ZnNtb3VudCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBuYW1lc3BhY2UgdW5kZXIgbG9jawotCSAqIC0gZGlzcG9zZSBvZiB0aGUgY29ycHNlCi0JICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZncmF2ZXlhcmQpKSB7Ci0JCUxJU1RfSEVBRCh1bW91bnRzKTsKLQkJbW50ID0gbGlzdF9lbnRyeShncmF2ZXlhcmQubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfZXhwaXJlKTsKLQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZXhwaXJlKTsKLQotCQkvKiBkb24ndCBkbyBhbnl0aGluZyBpZiB0aGUgbmFtZXNwYWNlIGlzIGRlYWQgLSBhbGwgdGhlCi0JCSAqIHZmc21vdW50cyBmcm9tIGl0IGFyZSBnb2luZyBhd2F5IGFueXdheSAqLwotCQluYW1lc3BhY2UgPSBtbnQtPm1udF9uYW1lc3BhY2U7Ci0JCWlmICghbmFtZXNwYWNlIHx8ICFuYW1lc3BhY2UtPnJvb3QpCi0JCQljb250aW51ZTsKLQkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOwotCi0JCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQkJZG93bl93cml0ZSgmbmFtZXNwYWNlX3NlbSk7Ci0JCWV4cGlyZV9tb3VudChtbnQsIG1vdW50cywgJnVtb3VudHMpOwotCQl1cF93cml0ZSgmbmFtZXNwYWNlX3NlbSk7Ci0JCXJlbGVhc2VfbW91bnRzKCZ1bW91bnRzKTsKLQkJbW50cHV0KG1udCk7Ci0JCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKLQl9CisJZXhwaXJlX21vdW50X2xpc3QoJmdyYXZleWFyZCwgbW91bnRzKTsKIAogCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKIH0KQEAgLTEyMjcsNiArMTI0Myw3MyBAQAogRVhQT1JUX1NZTUJPTF9HUEwobWFya19tb3VudHNfZm9yX2V4cGlyeSk7CiAKIC8qCisgKiBSaXBvZmYgb2YgJ3NlbGVjdF9wYXJlbnQoKScKKyAqCisgKiBzZWFyY2ggdGhlIGxpc3Qgb2Ygc3VibW91bnRzIGZvciBhIGdpdmVuIG1vdW50cG9pbnQsIGFuZCBtb3ZlIGFueQorICogc2hyaW5rYWJsZSBzdWJtb3VudHMgdG8gdGhlICdncmF2ZXlhcmQnIGxpc3QuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X3N1Ym1vdW50cyhzdHJ1Y3QgdmZzbW91bnQgKnBhcmVudCwgc3RydWN0IGxpc3RfaGVhZCAqZ3JhdmV5YXJkKQoreworCXN0cnVjdCB2ZnNtb3VudCAqdGhpc19wYXJlbnQgPSBwYXJlbnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlpbnQgZm91bmQgPSAwOworCityZXBlYXQ6CisJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfbW91bnRzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5tbnRfbW91bnRzKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IG5leHQ7CisJCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2NoaWxkKTsKKworCQluZXh0ID0gdG1wLT5uZXh0OworCQlpZiAoIShtbnQtPm1udF9mbGFncyAmIE1OVF9TSFJJTktBQkxFKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBEZXNjZW5kIGEgbGV2ZWwgaWYgdGhlIGRfbW91bnRzIGxpc3QgaXMgbm9uLWVtcHR5LgorCQkgKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZtbnQtPm1udF9tb3VudHMpKSB7CisJCQl0aGlzX3BhcmVudCA9IG1udDsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJaWYgKCFwcm9wYWdhdGVfbW91bnRfYnVzeShtbnQsIDEpKSB7CisJCQltbnRnZXQobW50KTsKKwkJCWxpc3RfbW92ZV90YWlsKCZtbnQtPm1udF9leHBpcmUsIGdyYXZleWFyZCk7CisJCQlmb3VuZCsrOworCQl9CisJfQorCS8qCisJICogQWxsIGRvbmUgYXQgdGhpcyBsZXZlbCAuLi4gYXNjZW5kIGFuZCByZXN1bWUgdGhlIHNlYXJjaAorCSAqLworCWlmICh0aGlzX3BhcmVudCAhPSBwYXJlbnQpIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfY2hpbGQubmV4dDsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+bW50X3BhcmVudDsKKwkJZ290byByZXN1bWU7CisJfQorCXJldHVybiBmb3VuZDsKK30KKworLyoKKyAqIHByb2Nlc3MgYSBsaXN0IG9mIGV4cGlyYWJsZSBtb3VudHBvaW50cyB3aXRoIHRoZSBpbnRlbnQgb2YgZGlzY2FyZGluZyBhbnkKKyAqIHN1Ym1vdW50cyBvZiBhIHNwZWNpZmljIHBhcmVudCBtb3VudHBvaW50CisgKi8KK3ZvaWQgc2hyaW5rX3N1Ym1vdW50cyhzdHJ1Y3QgdmZzbW91bnQgKm1vdW50cG9pbnQsIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cykKK3sKKwlMSVNUX0hFQUQoZ3JhdmV5YXJkKTsKKwlpbnQgZm91bmQ7CisKKwlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCisJLyogZXh0cmFjdCBzdWJtb3VudHMgb2YgJ21vdW50cG9pbnQnIGZyb20gdGhlIGV4cGlyYXRpb24gbGlzdCAqLworCXdoaWxlICgoZm91bmQgPSBzZWxlY3Rfc3VibW91bnRzKG1vdW50cG9pbnQsICZncmF2ZXlhcmQpKSAhPSAwKQorCQlleHBpcmVfbW91bnRfbGlzdCgmZ3JhdmV5YXJkLCBtb3VudHMpOworCisJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChzaHJpbmtfc3VibW91bnRzKTsKKworLyoKICAqIFNvbWUgY29weV9mcm9tX3VzZXIoKSBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IHJldHVybiB0aGUgZXhhY3QgbnVtYmVyIG9mCiAgKiBieXRlcyByZW1haW5pbmcgdG8gY29weSBvbiBhIGZhdWx0LiAgQnV0IGNvcHlfbW91bnRfb3B0aW9ucygpIHJlcXVpcmVzIHRoYXQuCiAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkaWZmZXJzIGZyb20gY29weV9mcm9tX3VzZXIoKSBpbiB0aGF0IGl0IHdpbGwgb29wcwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW5vZGUuYyBiL2ZzL25jcGZzL2lub2RlLmMKaW5kZXggYTFmM2U5Ny4uOTBkMmVhMiAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvaW5vZGUuYworKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC0zOSw3ICszOSw3IEBACiAKIHN0YXRpYyB2b2lkIG5jcF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIHZvaWQgbmNwX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1zdGF0aWMgaW50ICBuY3Bfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgIG5jcF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqIG5jcF9pbm9kZV9jYWNoZXA7CiAKQEAgLTcyNCwxMyArNzI0LDE0IEBACiAJa2ZyZWUoc2VydmVyKTsKIH0KIAotc3RhdGljIGludCBuY3Bfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IG5jcF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCXN0cnVjdCBkZW50cnkqIGQ7CiAJc3RydWN0IGlub2RlKiBpOwogCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyogbmk7CiAJc3RydWN0IG5jcF9zZXJ2ZXIqIHM7CiAJc3RydWN0IG5jcF92b2x1bWVfaW5mbyB2aTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCWludCBlcnI7CiAJX191OCBkaDsKIAkKQEAgLTk1NywxMCArOTU4LDEwIEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmNwX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBuY3BfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG5jcF9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBuY3BfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5jcF9mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvbmZzL01ha2VmaWxlIGIvZnMvbmZzL01ha2VmaWxlCmluZGV4IGVjNjFmZDUuLjBiNTcyYTAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9NYWtlZmlsZQorKysgYi9mcy9uZnMvTWFrZWZpbGUKQEAgLTQsMTQgKzQsMTYgQEAKIAogb2JqLSQoQ09ORklHX05GU19GUykgKz0gbmZzLm8KIAotbmZzLXkgCQkJOj0gZGlyLm8gZmlsZS5vIGlub2RlLm8gbmZzMnhkci5vIHBhZ2VsaXN0Lm8gXAotCQkJICAgcHJvYy5vIHJlYWQubyBzeW1saW5rLm8gdW5saW5rLm8gd3JpdGUubworbmZzLXkgCQkJOj0gZGlyLm8gZmlsZS5vIGlub2RlLm8gc3VwZXIubyBuZnMyeGRyLm8gcGFnZWxpc3QubyBcCisJCQkgICBwcm9jLm8gcmVhZC5vIHN5bWxpbmsubyB1bmxpbmsubyB3cml0ZS5vIFwKKwkJCSAgIG5hbWVzcGFjZS5vCiBuZnMtJChDT05GSUdfUk9PVF9ORlMpCSs9IG5mc3Jvb3QubyBtb3VudF9jbG50Lm8gICAgICAKIG5mcy0kKENPTkZJR19ORlNfVjMpCSs9IG5mczNwcm9jLm8gbmZzM3hkci5vCiBuZnMtJChDT05GSUdfTkZTX1YzX0FDTCkJKz0gbmZzM2FjbC5vCiBuZnMtJChDT05GSUdfTkZTX1Y0KQkrPSBuZnM0cHJvYy5vIG5mczR4ZHIubyBuZnM0c3RhdGUubyBuZnM0cmVuZXdkLm8gXAogCQkJICAgZGVsZWdhdGlvbi5vIGlkbWFwLm8gXAotCQkJICAgY2FsbGJhY2subyBjYWxsYmFja194ZHIubyBjYWxsYmFja19wcm9jLm8KKwkJCSAgIGNhbGxiYWNrLm8gY2FsbGJhY2tfeGRyLm8gY2FsbGJhY2tfcHJvYy5vIFwKKwkJCSAgIG5mczRuYW1lc3BhY2UubwogbmZzLSQoQ09ORklHX05GU19ESVJFQ1RJTykgKz0gZGlyZWN0Lm8KIG5mcy0kKENPTkZJR19TWVNDVEwpICs9IHN5c2N0bC5vCiBuZnMtb2JqcwkJOj0gJChuZnMteSkKZGlmZiAtLWdpdCBhL2ZzL25mcy9jYWxsYmFjay5jIGIvZnMvbmZzL2NhbGxiYWNrLmMKaW5kZXggOTBjOTVhZC4uZDUzZjhjNiAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrLmMKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTE4Miw4ICsxODIsNiBAQAogLyoKICAqIERlZmluZSBORlM0IGNhbGxiYWNrIHByb2dyYW0KICAqLwotZXh0ZXJuIHN0cnVjdCBzdmNfdmVyc2lvbiBuZnM0X2NhbGxiYWNrX3ZlcnNpb24xOwotCiBzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICpuZnM0X2NhbGxiYWNrX3ZlcnNpb25bXSA9IHsKIAlbMV0gPSAmbmZzNF9jYWxsYmFja192ZXJzaW9uMSwKIH07CmRpZmYgLS1naXQgYS9mcy9uZnMvY2FsbGJhY2tfeGRyLmMgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKaW5kZXggMDVjMzhjZi4uYzkyOTkxMyAxMDA2NDQKLS0tIGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jCisrKyBiL2ZzL25mcy9jYWxsYmFja194ZHIuYwpAQCAtMjAyLDcgKzIwMiw3IEBACiAJc3RhdHVzID0gZGVjb2RlX2ZoKHhkciwgJmFyZ3MtPmZoKTsKIG91dDoKIAlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGVuY29kZV9zdHJpbmcoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbiwgY29uc3QgY2hhciAqc3RyKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Rpci5jIGIvZnMvbmZzL2Rpci5jCmluZGV4IGNhZTc0ZGQuLjNkZGRhNmYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXIuYworKysgYi9mcy9uZnMvZGlyLmMKQEAgLTUyOCw3ICs1MjgsNyBAQAogCiAJbG9ja19rZXJuZWwoKTsKIAotCXJlcyA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJcmVzID0gbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgZmlscC0+Zl9tYXBwaW5nKTsKIAlpZiAocmVzIDwgMCkgewogCQl1bmxvY2tfa2VybmVsKCk7CiAJCXJldHVybiByZXM7CkBAIC04NjgsNiArODY4LDE3IEBACiAJcmV0dXJuIChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0VYQ0wpICE9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5mc19yZXZhbF9mc2lkKHN0cnVjdCBpbm9kZSAqZGlyLAorCQlzdHJ1Y3QgbmZzX2ZoICpmaCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKKworCWlmICghbmZzX2ZzaWRfZXF1YWwoJnNlcnZlci0+ZnNpZCwgJmZhdHRyLT5mc2lkKSkKKwkJLyogUmV2YWxpZGF0ZSBmc2lkIG9uIHJvb3QgZGlyICovCisJCXJldHVybiBfX25mc19yZXZhbGlkYXRlX2lub2RlKHNlcnZlciwgZGlyLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJc3RydWN0IGRlbnRyeSAqcmVzOwpAQCAtOTAwLDYgKzkxMSwxMSBAQAogCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KKwllcnJvciA9IG5mc19yZXZhbF9mc2lkKGRpciwgJmZoYW5kbGUsICZmYXR0cik7CisJaWYgKGVycm9yIDwgMCkgeworCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KIAlpbm9kZSA9IG5mc19maGdldChkZW50cnktPmRfc2IsICZmaGFuZGxlLCAmZmF0dHIpOwogCXJlcyA9IChzdHJ1Y3QgZGVudHJ5ICopaW5vZGU7CiAJaWYgKElTX0VSUihyZXMpKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2RpcmVjdC5jIGIvZnMvbmZzL2RpcmVjdC5jCmluZGV4IDNjNzJiMGMuLjQwMjAwNWMgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9kaXJlY3QuYworKysgYi9mcy9uZnMvZGlyZWN0LmMKQEAgLTg5Miw3ICs4OTIsNyBAQAogICogbmZzX2luaXRfZGlyZWN0Y2FjaGUgLSBjcmVhdGUgYSBzbGFiIGNhY2hlIGZvciBuZnNfZGlyZWN0X3JlcSBzdHJ1Y3R1cmVzCiAgKgogICovCi1pbnQgbmZzX2luaXRfZGlyZWN0Y2FjaGUodm9pZCkKK2ludCBfX2luaXQgbmZzX2luaXRfZGlyZWN0Y2FjaGUodm9pZCkKIHsKIAluZnNfZGlyZWN0X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNfZGlyZWN0X2NhY2hlIiwKIAkJCQkJCXNpemVvZihzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEpLApAQCAtOTA2LDEwICs5MDYsMTAgQEAKIH0KIAogLyoqCi0gKiBuZnNfaW5pdF9kaXJlY3RjYWNoZSAtIGRlc3Ryb3kgdGhlIHNsYWIgY2FjaGUgZm9yIG5mc19kaXJlY3RfcmVxIHN0cnVjdHVyZXMKKyAqIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlIC0gZGVzdHJveSB0aGUgc2xhYiBjYWNoZSBmb3IgbmZzX2RpcmVjdF9yZXEgc3RydWN0dXJlcwogICoKICAqLwotdm9pZCBuZnNfZGVzdHJveV9kaXJlY3RjYWNoZSh2b2lkKQordm9pZCBfX2V4aXQgbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUodm9pZCkKIHsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19kaXJlY3RfY2FjaGVwKSkKIAkJcHJpbnRrKEtFUk5fSU5GTyAibmZzX2RpcmVjdF9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggZmFkZTAyYy4uYWRkMjg5MSAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgc3NpemVfdCBuZnNfZmlsZV9zZW5kZmlsZShzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QgKiwgc2l6ZV90LCByZWFkX2FjdG9yX3QsIHZvaWQgKik7CiBzdGF0aWMgc3NpemVfdCBuZnNfZmlsZV9yZWFkKHN0cnVjdCBraW9jYiAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCk7CiBzdGF0aWMgc3NpemVfdCBuZnNfZmlsZV93cml0ZShzdHJ1Y3Qga2lvY2IgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QpOwotc3RhdGljIGludCAgbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKik7CitzdGF0aWMgaW50ICBuZnNfZmlsZV9mbHVzaChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKIHN0YXRpYyBpbnQgIG5mc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYyk7CiBzdGF0aWMgaW50IG5mc19jaGVja19mbGFncyhpbnQgZmxhZ3MpOwogc3RhdGljIGludCBuZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOwpAQCAtMTI3LDIzICsxMjcsNiBAQAogfQogCiAvKioKLSAqIG5mc19yZXZhbGlkYXRlX2ZpbGUgLSBSZXZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlICYgcmVsYXRlZCBtZXRhZGF0YQotICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZSBzdHJ1Y3QKLSAqIEBmaWxlIC0gcG9pbnRlciB0byBmaWxlCi0gKi8KLXN0YXRpYyBpbnQgbmZzX3JldmFsaWRhdGVfZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX1JFVkFMX1BBR0VDQUNIRXxORlNfSU5PX0lOVkFMSURfQVRUUikpCi0JCQl8fCBuZnNfYXR0cmlidXRlX3RpbWVvdXQoaW5vZGUpKQotCQlyZXR2YWwgPSBfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7Ci0JbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgZmlscC0+Zl9tYXBwaW5nKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiBuZnNfcmV2YWxpZGF0ZV9zaXplIC0gUmV2YWxpZGF0ZSB0aGUgZmlsZSBzaXplCiAgKiBAaW5vZGUgLSBwb2ludGVyIHRvIGlub2RlIHN0cnVjdAogICogQGZpbGUgLSBwb2ludGVyIHRvIHN0cnVjdCBmaWxlCkBAIC0xODgsNyArMTcxLDcgQEAKICAqCiAgKi8KIHN0YXRpYyBpbnQKLW5mc19maWxlX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQorbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CkBAIC0yMjgsNyArMjExLDcgQEAKIAkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcpIHBvcyk7CiAKLQlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9maWxlKGlub2RlLCBpb2NiLT5raV9maWxwKTsKKwlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKGlub2RlLCBpb2NiLT5raV9maWxwLT5mX21hcHBpbmcpOwogCW5mc19hZGRfc3RhdHMoaW5vZGUsIE5GU0lPU19OT1JNQUxSRUFEQllURVMsIGNvdW50KTsKIAlpZiAoIXJlc3VsdCkKIAkJcmVzdWx0ID0gZ2VuZXJpY19maWxlX2Fpb19yZWFkKGlvY2IsIGJ1ZiwgY291bnQsIHBvcyk7CkBAIC0yNDcsNyArMjMwLDcgQEAKIAkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnBwb3MpOwogCi0JcmVzID0gbmZzX3JldmFsaWRhdGVfZmlsZShpbm9kZSwgZmlscCk7CisJcmVzID0gbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgZmlscC0+Zl9tYXBwaW5nKTsKIAlpZiAoIXJlcykKIAkJcmVzID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlKGZpbHAsIHBwb3MsIGNvdW50LCBhY3RvciwgdGFyZ2V0KTsKIAlyZXR1cm4gcmVzOwpAQCAtMjYzLDcgKzI0Niw3IEBACiAJZGZwcmludGsoVkZTLCAibmZzOiBtbWFwKCVzLyVzKVxuIiwKIAkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOwogCi0Jc3RhdHVzID0gbmZzX3JldmFsaWRhdGVfZmlsZShpbm9kZSwgZmlsZSk7CisJc3RhdHVzID0gbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgZmlsZS0+Zl9tYXBwaW5nKTsKIAlpZiAoIXN0YXR1cykKIAkJc3RhdHVzID0gZ2VuZXJpY19maWxlX21tYXAoZmlsZSwgdm1hKTsKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMzIwLDcgKzMwMywxMSBAQAogCiBzdGF0aWMgdm9pZCBuZnNfaW52YWxpZGF0ZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLQkvKiBGSVhNRTogd2UgcmVhbGx5IHNob3VsZCBjYW5jZWwgYW55IHVuc3RhcnRlZCB3cml0ZXMgb24gdGhpcyBwYWdlICovCisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisKKwkvKiBDYW5jZWwgYW55IHVuc3RhcnRlZCB3cml0ZXMgb24gdGhpcyBwYWdlICovCisJaWYgKG9mZnNldCA9PSAwKQorCQluZnNfc3luY19pbm9kZV93YWl0KGlub2RlLCBwYWdlLT5pbmRleCwgMSwgRkxVU0hfSU5WQUxJREFURSk7CiB9CiAKIHN0YXRpYyBpbnQgbmZzX3JlbGVhc2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2ZwX3QgZ2ZwKQpAQCAtMzczLDcgKzM2MCw2IEBACiAJCWlmIChyZXN1bHQpCiAJCQlnb3RvIG91dDsKIAl9Ci0JbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgaW9jYi0+a2lfZmlscC0+Zl9tYXBwaW5nKTsKIAogCXJlc3VsdCA9IGNvdW50OwogCWlmICghY291bnQpCmRpZmYgLS1naXQgYS9mcy9uZnMvaWRtYXAuYyBiL2ZzL25mcy9pZG1hcC5jCmluZGV4IDNmYWI1YjAuLmI4MWU3ZWQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9pZG1hcC5jCisrKyBiL2ZzL25mcy9pZG1hcC5jCkBAIC00Nyw3ICs0Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL3JwY19waXBlX2ZzLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KICNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgpkaWZmIC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYwppbmRleCBkMGI5OTFhLi41MWJjODhiIDEwMDY0NAotLS0gYS9mcy9uZnMvaW5vZGUuYworKysgYi9mcy9uZnMvaW5vZGUuYwpAQCAtMzYsNiArMzYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2lkbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc194ZHIuaD4KIAogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDQsODkgKzQ2LDE3IEBACiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCiAjaW5jbHVkZSAiaW9zdGF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19WRlMKICNkZWZpbmUgTkZTX1BBUkFOT0lBIDEKIAotLyogTWF4aW11bSBudW1iZXIgb2YgcmVhZGFoZWFkIHJlcXVlc3RzCi0gKiBGSVhNRTogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgc3lzY3RsIHNvIHRoYXQgdXNlcnMgbWF5IHR1bmUgaXQgdG8gc3VpdAotICogICAgICAgIHRoZWlyIG5lZWRzLiBQZW9wbGUgdGhhdCBkbyBORlMgb3ZlciBhIHNsb3cgbmV0d29yaywgbWlnaHQgZm9yCi0gKiAgICAgICAgaW5zdGFuY2Ugd2FudCB0byByZWR1Y2UgaXQgdG8gc29tZXRoaW5nIGNsb3NlciB0byAxIGZvciBpbXByb3ZlZAotICogICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlLgotICovCi0jZGVmaW5lIE5GU19NQVhfUkVBREFIRUFECShSUENfREVGX1NMT1RfVEFCTEUgLSAxKQotCiBzdGF0aWMgdm9pZCBuZnNfaW52YWxpZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CiBzdGF0aWMgaW50IG5mc191cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBuZnNfZmF0dHIgKik7CiAKLXN0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLXN0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKLXN0YXRpYyBpbnQgbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLGludCk7Ci1zdGF0aWMgdm9pZCBuZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKLXN0YXRpYyB2b2lkIG5mc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci1zdGF0aWMgdm9pZCBuZnNfdW1vdW50X2JlZ2luKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKLXN0YXRpYyBpbnQgIG5mc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOwotc3RhdGljIGludCAgbmZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwotc3RhdGljIGludCAgbmZzX3Nob3dfc3RhdHMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIHN0YXRpYyB2b2lkIG5mc196YXBfYWNsX2NhY2hlKHN0cnVjdCBpbm9kZSAqKTsKIAotc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQluZnNfcHJvZ3JhbTsKLQotc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG5mc19zb3BzID0geyAKLQkuYWxsb2NfaW5vZGUJPSBuZnNfYWxsb2NfaW5vZGUsCi0JLmRlc3Ryb3lfaW5vZGUJPSBuZnNfZGVzdHJveV9pbm9kZSwKLQkud3JpdGVfaW5vZGUJPSBuZnNfd3JpdGVfaW5vZGUsCi0JLmRlbGV0ZV9pbm9kZQk9IG5mc19kZWxldGVfaW5vZGUsCi0JLnN0YXRmcwkJPSBuZnNfc3RhdGZzLAotCS5jbGVhcl9pbm9kZQk9IG5mc19jbGVhcl9pbm9kZSwKLQkudW1vdW50X2JlZ2luCT0gbmZzX3Vtb3VudF9iZWdpbiwKLQkuc2hvd19vcHRpb25zCT0gbmZzX3Nob3dfb3B0aW9ucywKLQkuc2hvd19zdGF0cwk9IG5mc19zaG93X3N0YXRzLAotfTsKLQotLyoKLSAqIFJQQyBjcnVmdCBmb3IgTkZTCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgcnBjX3N0YXQJCW5mc19ycGNzdGF0ID0gewotCS5wcm9ncmFtCQk9ICZuZnNfcHJvZ3JhbQotfTsKLXN0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgluZnNfdmVyc2lvbltdID0gewotCU5VTEwsCi0JTlVMTCwKLQkmbmZzX3ZlcnNpb24yLAotI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykKLQkmbmZzX3ZlcnNpb24zLAotI2VsaWYgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQotCU5VTEwsCi0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCi0JJm5mc192ZXJzaW9uNCwKLSNlbmRpZgotfTsKLQotc3RhdGljIHN0cnVjdCBycGNfcHJvZ3JhbQluZnNfcHJvZ3JhbSA9IHsKLQkubmFtZQkJCT0gIm5mcyIsCi0JLm51bWJlcgkJCT0gTkZTX1BST0dSQU0sCi0JLm5ydmVycwkJCT0gQVJSQVlfU0laRShuZnNfdmVyc2lvbiksCi0JLnZlcnNpb24JCT0gbmZzX3ZlcnNpb24sCi0JLnN0YXRzCQkJPSAmbmZzX3JwY3N0YXQsCi0JLnBpcGVfZGlyX25hbWUJCT0gIi9uZnMiLAotfTsKLQotI2lmZGVmIENPTkZJR19ORlNfVjNfQUNMCi1zdGF0aWMgc3RydWN0IHJwY19zdGF0CQluZnNhY2xfcnBjc3RhdCA9IHsgJm5mc2FjbF9wcm9ncmFtIH07Ci1zdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbmZzYWNsX3ZlcnNpb25bXSA9IHsKLQlbM10JCQk9ICZuZnNhY2xfdmVyc2lvbjMsCi19OwotCi1zdHJ1Y3QgcnBjX3Byb2dyYW0JCW5mc2FjbF9wcm9ncmFtID0gewotCS5uYW1lID0JCQkibmZzYWNsIiwKLQkubnVtYmVyID0JCU5GU19BQ0xfUFJPR1JBTSwKLQkubnJ2ZXJzID0JCUFSUkFZX1NJWkUobmZzYWNsX3ZlcnNpb24pLAotCS52ZXJzaW9uID0JCW5mc2FjbF92ZXJzaW9uLAotCS5zdGF0cyA9CQkmbmZzYWNsX3JwY3N0YXQsCi19OwotI2VuZGlmICAvKiBDT05GSUdfTkZTX1YzX0FDTCAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqIG5mc19pbm9kZV9jYWNoZXA7CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogbmZzX2ZhdHRyX3RvX2lub190KHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQpAQCAtMTM0LDggKzY0LDcgQEAKIAlyZXR1cm4gbmZzX2ZpbGVpZF90b19pbm9fdChmYXR0ci0+ZmlsZWlkKTsKIH0KIAotc3RhdGljIGludAotbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzeW5jKQoraW50IG5mc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc3luYykKIHsKIAlpbnQgZmxhZ3MgPSBzeW5jID8gRkxVU0hfU1lOQyA6IDA7CiAJaW50IHJldDsKQEAgLTE0NiwzMSArNzUsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKLW5mc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCi17Ci0JZHByaW50aygiTkZTOiBkZWxldGVfaW5vZGUoJXMvJWxkKVxuIiwgaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0KLQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7Ci0KLQluZnNfd2JfYWxsKGlub2RlKTsKLQkvKgotCSAqIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLgotCSAqLwotCWlmIChuZnNfaGF2ZV93cml0ZWJhY2tzKGlub2RlKSkgewotCQlwcmludGsoS0VSTl9FUlIgIm5mc19kZWxldGVfaW5vZGU6IGlub2RlICVsZCBoYXMgcGVuZGluZyBSUEMgcmVxdWVzdHNcbiIsIGlub2RlLT5pX2lubyk7Ci0JfQotCi0JY2xlYXJfaW5vZGUoaW5vZGUpOwotfQotCi1zdGF0aWMgdm9pZAotbmZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIG5mc19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAJc3RydWN0IHJwY19jcmVkICpjcmVkOwogCi0JbmZzX3diX2FsbChpbm9kZSk7CisJLyoKKwkgKiBUaGUgZm9sbG93aW5nIHNob3VsZCBuZXZlciBoYXBwZW4uLi4KKwkgKi8KKwlCVUdfT04obmZzX2hhdmVfd3JpdGViYWNrcyhpbm9kZSkpOwogCUJVR19PTiAoIWxpc3RfZW1wdHkoJm5mc2ktPm9wZW5fZmlsZXMpKTsKIAluZnNfemFwX2FjbF9jYWNoZShpbm9kZSk7CiAJY3JlZCA9IG5mc2ktPmNhY2hlX2FjY2Vzcy5jcmVkOwpAQCAtMTc5LDU1NCArOTIsNiBAQAogCUJVR19PTihhdG9taWNfcmVhZCgmbmZzaS0+ZGF0YV91cGRhdGVzKSAhPSAwKTsKIH0KIAotdm9pZAotbmZzX3Vtb3VudF9iZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQotewotCXN0cnVjdCBycGNfY2xudAkqcnBjID0gTkZTX1NCKHNiKS0+Y2xpZW50OwotCi0JLyogLUVJTyBhbGwgcGVuZGluZyBJL08gKi8KLQlpZiAoIUlTX0VSUihycGMpKQotCQlycGNfa2lsbGFsbF90YXNrcyhycGMpOwotCXJwYyA9IE5GU19TQihzYiktPmNsaWVudF9hY2w7Ci0JaWYgKCFJU19FUlIocnBjKSkKLQkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKLX0KLQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLW5mc19ibG9ja19iaXRzKHVuc2lnbmVkIGxvbmcgYnNpemUsIHVuc2lnbmVkIGNoYXIgKm5yYml0c3ApCi17Ci0JLyogbWFrZSBzdXJlIGJsb2Nrc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLwotCWlmICgoYnNpemUgJiAoYnNpemUgLSAxKSkgfHwgbnJiaXRzcCkgewotCQl1bnNpZ25lZCBjaGFyCW5yYml0czsKLQotCQlmb3IgKG5yYml0cyA9IDMxOyBucmJpdHMgJiYgIShic2l6ZSAmICgxIDw8IG5yYml0cykpOyBucmJpdHMtLSkKLQkJCTsKLQkJYnNpemUgPSAxIDw8IG5yYml0czsKLQkJaWYgKG5yYml0c3ApCi0JCQkqbnJiaXRzcCA9IG5yYml0czsKLQl9Ci0KLQlyZXR1cm4gYnNpemU7Ci19Ci0KLS8qCi0gKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiA1MTJieXRlIGJsb2NrcyB1c2VkLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLW5mc19jYWxjX2Jsb2NrX3NpemUodTY0IHRzaXplKQotewotCWxvZmZfdCB1c2VkID0gKHRzaXplICsgNTExKSA+PiA5OwotCXJldHVybiAodXNlZCA+IFVMT05HX01BWCkgPyBVTE9OR19NQVggOiB1c2VkOwotfQotCi0vKgotICogQ29tcHV0ZSBhbmQgc2V0IE5GUyBzZXJ2ZXIgYmxvY2tzaXplCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotbmZzX2Jsb2NrX3NpemUodW5zaWduZWQgbG9uZyBic2l6ZSwgdW5zaWduZWQgY2hhciAqbnJiaXRzcCkKLXsKLQlpZiAoYnNpemUgPCBORlNfTUlOX0ZJTEVfSU9fU0laRSkKLQkJYnNpemUgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKLQllbHNlIGlmIChic2l6ZSA+PSBORlNfTUFYX0ZJTEVfSU9fU0laRSkKLQkJYnNpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKLQotCXJldHVybiBuZnNfYmxvY2tfYml0cyhic2l6ZSwgbnJiaXRzcCk7Ci19Ci0KLS8qCi0gKiBPYnRhaW4gdGhlIHJvb3QgaW5vZGUgb2YgdGhlIGZpbGUgc3lzdGVtLgotICovCi1zdGF0aWMgc3RydWN0IGlub2RlICoKLW5mc19nZXRfcm9vdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX2ZoICpyb290ZmgsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCi17Ci0Jc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlciA9IE5GU19TQihzYik7Ci0JaW50CQkJZXJyb3I7Ci0KLQllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+Z2V0cm9vdChzZXJ2ZXIsIHJvb3RmaCwgZnNpbmZvKTsKLQlpZiAoZXJyb3IgPCAwKSB7Ci0JCWRwcmludGsoIm5mc19nZXRfcm9vdDogZ2V0YXR0ciBlcnJvciA9ICVkXG4iLCAtZXJyb3IpOwotCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JfQotCi0JcmV0dXJuIG5mc19maGdldChzYiwgcm9vdGZoLCBmc2luZm8tPmZhdHRyKTsKLX0KLQotLyoKLSAqIERvIE5GUyB2ZXJzaW9uLWluZGVwZW5kZW50IG1vdW50IHByb2Nlc3NpbmcsIGFuZCBzYW5pdHkgY2hlY2tpbmcKLSAqLwotc3RhdGljIGludAotbmZzX3NiX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgcnBjX2F1dGhmbGF2b3JfdCBhdXRoZmxhdm9yKQotewotCXN0cnVjdCBuZnNfc2VydmVyCSpzZXJ2ZXI7Ci0Jc3RydWN0IGlub2RlCQkqcm9vdF9pbm9kZTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyCWZhdHRyOwotCXN0cnVjdCBuZnNfZnNpbmZvCWZzaW5mbyA9IHsKLQkJCQkJLmZhdHRyID0gJmZhdHRyLAotCQkJCX07Ci0Jc3RydWN0IG5mc19wYXRoY29uZiBwYXRoaW5mbyA9IHsKLQkJCS5mYXR0ciA9ICZmYXR0ciwKLQl9OwotCWludCBub19yb290X2Vycm9yID0gMDsKLQl1bnNpZ25lZCBsb25nIG1heF9ycGNfcGF5bG9hZDsKLQotCS8qIFdlIHByb2JhYmx5IHdhbnQgc29tZXRoaW5nIG1vcmUgaW5mb3JtYXRpdmUgaGVyZSAqLwotCXNucHJpbnRmKHNiLT5zX2lkLCBzaXplb2Yoc2ItPnNfaWQpLCAiJXg6JXgiLCBNQUpPUihzYi0+c19kZXYpLCBNSU5PUihzYi0+c19kZXYpKTsKLQotCXNlcnZlciA9IE5GU19TQihzYik7Ci0KLQlzYi0+c19tYWdpYyAgICAgID0gTkZTX1NVUEVSX01BR0lDOwotCi0Jc2VydmVyLT5pb19zdGF0cyA9IG5mc19hbGxvY19pb3N0YXRzKCk7Ci0JaWYgKHNlcnZlci0+aW9fc3RhdHMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyb290X2lub2RlID0gbmZzX2dldF9yb290KHNiLCAmc2VydmVyLT5maCwgJmZzaW5mbyk7Ci0JLyogRGlkIGdldHRpbmcgdGhlIHJvb3QgaW5vZGUgZmFpbD8gKi8KLQlpZiAoSVNfRVJSKHJvb3RfaW5vZGUpKSB7Ci0JCW5vX3Jvb3RfZXJyb3IgPSBQVFJfRVJSKHJvb3RfaW5vZGUpOwotCQlnb3RvIG91dF9ub19yb290OwotCX0KLQlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOwotCWlmICghc2ItPnNfcm9vdCkgewotCQlub19yb290X2Vycm9yID0gLUVOT01FTTsKLQkJZ290byBvdXRfbm9fcm9vdDsKLQl9Ci0Jc2ItPnNfcm9vdC0+ZF9vcCA9IHNlcnZlci0+cnBjX29wcy0+ZGVudHJ5X29wczsKLQotCS8qIG1vdW50IHRpbWUgc3RhbXAsIGluIHNlY29uZHMgKi8KLQlzZXJ2ZXItPm1vdW50X3RpbWUgPSBqaWZmaWVzOwotCi0JLyogR2V0IHNvbWUgZ2VuZXJhbCBmaWxlIHN5c3RlbSBpbmZvICovCi0JaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwICYmCi0JICAgIHNlcnZlci0+cnBjX29wcy0+cGF0aGNvbmYoc2VydmVyLCAmc2VydmVyLT5maCwgJnBhdGhpbmZvKSA+PSAwKQotCQlzZXJ2ZXItPm5hbWVsZW4gPSBwYXRoaW5mby5tYXhfbmFtZWxlbjsKLQkvKiBXb3JrIG91dCBhIGxvdCBvZiBwYXJhbWV0ZXJzICovCi0JaWYgKHNlcnZlci0+cnNpemUgPT0gMCkKLQkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby5ydHByZWYsIE5VTEwpOwotCWlmIChzZXJ2ZXItPndzaXplID09IDApCi0JCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ud3RwcmVmLCBOVUxMKTsKLQotCWlmIChmc2luZm8ucnRtYXggPj0gNTEyICYmIHNlcnZlci0+cnNpemUgPiBmc2luZm8ucnRtYXgpCi0JCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ucnRtYXgsIE5VTEwpOwotCWlmIChmc2luZm8ud3RtYXggPj0gNTEyICYmIHNlcnZlci0+d3NpemUgPiBmc2luZm8ud3RtYXgpCi0JCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ud3RtYXgsIE5VTEwpOwotCi0JbWF4X3JwY19wYXlsb2FkID0gbmZzX2Jsb2NrX3NpemUocnBjX21heF9wYXlsb2FkKHNlcnZlci0+Y2xpZW50KSwgTlVMTCk7Ci0JaWYgKHNlcnZlci0+cnNpemUgPiBtYXhfcnBjX3BheWxvYWQpCi0JCXNlcnZlci0+cnNpemUgPSBtYXhfcnBjX3BheWxvYWQ7Ci0JaWYgKHNlcnZlci0+cnNpemUgPiBORlNfTUFYX0ZJTEVfSU9fU0laRSkKLQkJc2VydmVyLT5yc2l6ZSA9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCXNlcnZlci0+cnBhZ2VzID0gKHNlcnZlci0+cnNpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCi0JaWYgKHNlcnZlci0+d3NpemUgPiBtYXhfcnBjX3BheWxvYWQpCi0JCXNlcnZlci0+d3NpemUgPSBtYXhfcnBjX3BheWxvYWQ7Ci0JaWYgKHNlcnZlci0+d3NpemUgPiBORlNfTUFYX0ZJTEVfSU9fU0laRSkKLQkJc2VydmVyLT53c2l6ZSA9IE5GU19NQVhfRklMRV9JT19TSVpFOwotCXNlcnZlci0+d3BhZ2VzID0gKHNlcnZlci0+d3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCi0JaWYgKHNiLT5zX2Jsb2Nrc2l6ZSA9PSAwKQotCQlzYi0+c19ibG9ja3NpemUgPSBuZnNfYmxvY2tfYml0cyhzZXJ2ZXItPndzaXplLAotCQkJCQkJCSAmc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCXNlcnZlci0+d3RtdWx0ID0gbmZzX2Jsb2NrX2JpdHMoZnNpbmZvLnd0bXVsdCwgTlVMTCk7Ci0KLQlzZXJ2ZXItPmR0c2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby5kdHByZWYsIE5VTEwpOwotCWlmIChzZXJ2ZXItPmR0c2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkKLQkJc2VydmVyLT5kdHNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JaWYgKHNlcnZlci0+ZHRzaXplID4gc2VydmVyLT5yc2l6ZSkKLQkJc2VydmVyLT5kdHNpemUgPSBzZXJ2ZXItPnJzaXplOwotCi0JaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9BQykgewotCQlzZXJ2ZXItPmFjcmVnbWluID0gc2VydmVyLT5hY3JlZ21heCA9IDA7Ci0JCXNlcnZlci0+YWNkaXJtaW4gPSBzZXJ2ZXItPmFjZGlybWF4ID0gMDsKLQkJc2ItPnNfZmxhZ3MgfD0gTVNfU1lOQ0hST05PVVM7Ci0JfQotCXNlcnZlci0+YmFja2luZ19kZXZfaW5mby5yYV9wYWdlcyA9IHNlcnZlci0+cnBhZ2VzICogTkZTX01BWF9SRUFEQUhFQUQ7Ci0KLQlzYi0+c19tYXhieXRlcyA9IGZzaW5mby5tYXhmaWxlc2l6ZTsKLQlpZiAoc2ItPnNfbWF4Ynl0ZXMgPiBNQVhfTEZTX0ZJTEVTSVpFKSAKLQkJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOyAKLQotCXNlcnZlci0+Y2xpZW50LT5jbF9pbnRyID0gKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikgPyAxIDogMDsKLQlzZXJ2ZXItPmNsaWVudC0+Y2xfc29mdHJ0cnkgPSAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSA/IDEgOiAwOwotCi0JLyogV2UncmUgYWlyYm9ybmUgU2V0IHNvY2tldCBidWZmZXJzaXplICovCi0JcnBjX3NldGJ1ZnNpemUoc2VydmVyLT5jbGllbnQsIHNlcnZlci0+d3NpemUgKyAxMDAsIHNlcnZlci0+cnNpemUgKyAxMDApOwotCXJldHVybiAwOwotCS8qIFlhcmdzLiBJdCBkaWRuJ3Qgd29yayBvdXQuICovCi1vdXRfbm9fcm9vdDoKLQlkcHJpbnRrKCJuZnNfc2JfaW5pdDogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkOiBlcnJubyAlZFxuIiwgLW5vX3Jvb3RfZXJyb3IpOwotCWlmICghSVNfRVJSKHJvb3RfaW5vZGUpKQotCQlpcHV0KHJvb3RfaW5vZGUpOwotCXJldHVybiBub19yb290X2Vycm9yOwotfQotCi1zdGF0aWMgdm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvLCBpbnQgcHJvdG8sIHVuc2lnbmVkIGludCB0aW1lbywgdW5zaWduZWQgaW50IHJldHJhbnMpCi17Ci0JdG8tPnRvX2luaXR2YWwgPSB0aW1lbyAqIEhaIC8gMTA7Ci0JdG8tPnRvX3JldHJpZXMgPSByZXRyYW5zOwotCWlmICghdG8tPnRvX3JldHJpZXMpCi0JCXRvLT50b19yZXRyaWVzID0gMjsKLQotCXN3aXRjaCAocHJvdG8pIHsKLQljYXNlIElQUFJPVE9fVENQOgotCQlpZiAoIXRvLT50b19pbml0dmFsKQotCQkJdG8tPnRvX2luaXR2YWwgPSA2MCAqIEhaOwotCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1RDUF9USU1FT1VUKQotCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1RDUF9USU1FT1VUOwotCQl0by0+dG9faW5jcmVtZW50ID0gdG8tPnRvX2luaXR2YWw7Ci0JCXRvLT50b19tYXh2YWwgPSB0by0+dG9faW5pdHZhbCArICh0by0+dG9faW5jcmVtZW50ICogdG8tPnRvX3JldHJpZXMpOwotCQl0by0+dG9fZXhwb25lbnRpYWwgPSAwOwotCQlicmVhazsKLQljYXNlIElQUFJPVE9fVURQOgotCWRlZmF1bHQ6Ci0JCWlmICghdG8tPnRvX2luaXR2YWwpCi0JCQl0by0+dG9faW5pdHZhbCA9IDExICogSFogLyAxMDsKLQkJaWYgKHRvLT50b19pbml0dmFsID4gTkZTX01BWF9VRFBfVElNRU9VVCkKLQkJCXRvLT50b19pbml0dmFsID0gTkZTX01BWF9VRFBfVElNRU9VVDsKLQkJdG8tPnRvX21heHZhbCA9IE5GU19NQVhfVURQX1RJTUVPVVQ7Ci0JCXRvLT50b19leHBvbmVudGlhbCA9IDE7Ci0JCWJyZWFrOwotCX0KLX0KLQotLyoKLSAqIENyZWF0ZSBhbiBSUEMgY2xpZW50IGhhbmRsZS4KLSAqLwotc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCi1uZnNfY3JlYXRlX2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtczsKLQlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0ID0gTlVMTDsKLQlzdHJ1Y3QgcnBjX2NsbnQJCSpjbG50ID0gTlVMTDsKLQlpbnQJCQlwcm90byA9IChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKLQotCW5mc19pbml0X3RpbWVvdXRfdmFsdWVzKCZ0aW1lcGFybXMsIHByb3RvLCBkYXRhLT50aW1lbywgZGF0YS0+cmV0cmFucyk7Ci0KLQlzZXJ2ZXItPnJldHJhbnNfdGltZW8gPSB0aW1lcGFybXMudG9faW5pdHZhbDsKLQlzZXJ2ZXItPnJldHJhbnNfY291bnQgPSB0aW1lcGFybXMudG9fcmV0cmllczsKLQotCS8qIGNyZWF0ZSB0cmFuc3BvcnQgYW5kIGNsaWVudCAqLwotCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhwcm90bywgJnNlcnZlci0+YWRkciwgJnRpbWVwYXJtcyk7Ci0JaWYgKElTX0VSUih4cHJ0KSkgewotCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVsZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIFBUUl9FUlIoeHBydCkpOwotCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7Ci0JfQotCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCi0JCQkJIHNlcnZlci0+cnBjX29wcy0+dmVyc2lvbiwgZGF0YS0+cHNldWRvZmxhdm9yKTsKLQlpZiAoSVNfRVJSKGNsbnQpKSB7Ci0JCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWxkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgUFRSX0VSUih4cHJ0KSk7Ci0JCWdvdG8gb3V0X2ZhaWw7Ci0JfQotCi0JY2xudC0+Y2xfaW50ciAgICAgPSAxOwotCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKLQotCXJldHVybiBjbG50OwotCi1vdXRfZmFpbDoKLQlyZXR1cm4gY2xudDsKLX0KLQotLyoKLSAqIFRoZSB3YXkgdGhpcyB3b3JrcyBpcyB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyBhIHN0cnVjdHVyZQotICogaW4gdGhlIGRhdGEgYXJndW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MKLSAqIGFuZCB0aGUgcm9vdCBmaWxlIGhhbmRsZSBvYnRhaW5lZCBmcm9tIHRoZSBzZXJ2ZXIncyBtb3VudAotICogZGFlbW9uLiBXZSBzdGFzaCB0aGVzZSBhd2F5IGluIHRoZSBwcml2YXRlIHN1cGVyYmxvY2sgZmllbGRzLgotICovCi1zdGF0aWMgaW50Ci1uZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEsIGludCBzaWxlbnQpCi17Ci0Jc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlcjsKLQlycGNfYXV0aGZsYXZvcl90CWF1dGhmbGF2b3I7Ci0KLQlzZXJ2ZXIgICAgICAgICAgID0gTkZTX1NCKHNiKTsKLQlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7Ci0Jc2ItPnNfYmxvY2tzaXplID0gMDsKLQlpZiAoZGF0YS0+YnNpemUpCi0JCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPmJzaXplLCAmc2ItPnNfYmxvY2tzaXplX2JpdHMpOwotCWlmIChkYXRhLT5yc2l6ZSkKLQkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKLQlpZiAoZGF0YS0+d3NpemUpCi0JCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT53c2l6ZSwgTlVMTCk7Ci0Jc2VydmVyLT5mbGFncyAgICA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOwotCi0Jc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOwotCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKLQlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7Ci0Jc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOwotCi0JLyogU3RhcnQgbG9ja2QgaGVyZSwgYmVmb3JlIHdlIG1pZ2h0IGVycm9yIG91dCAqLwotCWlmICghKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKQotCQlsb2NrZF91cCgpOwotCi0Jc2VydmVyLT5uYW1lbGVuICA9IGRhdGEtPm5hbWxlbjsKLQlzZXJ2ZXItPmhvc3RuYW1lID0ga21hbGxvYyhzdHJsZW4oZGF0YS0+aG9zdG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXJ2ZXItPmhvc3RuYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzdHJjcHkoc2VydmVyLT5ob3N0bmFtZSwgZGF0YS0+aG9zdG5hbWUpOwotCi0JLyogQ2hlY2sgTkZTIHByb3RvY29sIHJldmlzaW9uIGFuZCBpbml0aWFsaXplIFJQQyBvcCB2ZWN0b3IKLQkgKiBhbmQgZmlsZSBoYW5kbGUgcG9vbC4gKi8KLSNpZmRlZiBDT05GSUdfTkZTX1YzCi0JaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgewotCQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YzX2NsaWVudG9wczsKLQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfUkVBRERJUlBMVVM7Ci0JfSBlbHNlIHsKLQkJc2VydmVyLT5ycGNfb3BzID0gJm5mc192Ml9jbGllbnRvcHM7Ci0JfQotI2Vsc2UKLQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YyX2NsaWVudG9wczsKLSNlbmRpZgotCi0JLyogRmlsbCBpbiBwc2V1ZG9mbGF2b3IgZm9yIG1vdW50IHZlcnNpb24gPCA1ICovCi0JaWYgKCEoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfU0VDRkxBVk9VUikpCi0JCWRhdGEtPnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7Ci0JYXV0aGZsYXZvciA9IGRhdGEtPnBzZXVkb2ZsYXZvcjsJLyogc2F2ZSBmb3Igc2JfaW5pdCgpICovCi0JLyogWFhYIG1heWJlIHdlIHdhbnQgdG8gYWRkIGEgc2VydmVyLT5wc2V1ZG9mbGF2b3IgZmllbGQgKi8KLQotCS8qIENyZWF0ZSBSUEMgY2xpZW50IGhhbmRsZXMgKi8KLQlzZXJ2ZXItPmNsaWVudCA9IG5mc19jcmVhdGVfY2xpZW50KHNlcnZlciwgZGF0YSk7Ci0JaWYgKElTX0VSUihzZXJ2ZXItPmNsaWVudCkpCi0JCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50KTsKLQkvKiBSRkMgMjYyMywgc2VjIDIuMy4yICovCi0JaWYgKGF1dGhmbGF2b3IgIT0gUlBDX0FVVEhfVU5JWCkgewotCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7Ci0KLQkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7Ci0JCWlmIChJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKLQkJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50X3N5cyk7Ci0JCWF1dGggPSBycGNhdXRoX2NyZWF0ZShSUENfQVVUSF9VTklYLCBzZXJ2ZXItPmNsaWVudF9zeXMpOwotCQlpZiAoSVNfRVJSKGF1dGgpKQotCQkJcmV0dXJuIFBUUl9FUlIoYXV0aCk7Ci0JfSBlbHNlIHsKLQkJYXRvbWljX2luYygmc2VydmVyLT5jbGllbnQtPmNsX2NvdW50KTsKLQkJc2VydmVyLT5jbGllbnRfc3lzID0gc2VydmVyLT5jbGllbnQ7Ci0JfQotCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKLSNpZmRlZiBDT05GSUdfTkZTX1YzX0FDTAotCQlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUNMKSkgewotCQkJc2VydmVyLT5jbGllbnRfYWNsID0gcnBjX2JpbmRfbmV3X3Byb2dyYW0oc2VydmVyLT5jbGllbnQsICZuZnNhY2xfcHJvZ3JhbSwgMyk7Ci0JCQkvKiBObyBlcnJvcnMhIEFzc3VtZSB0aGF0IFN1biBuZnNhY2xzIGFyZSBzdXBwb3J0ZWQgKi8KLQkJCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X2FjbCkpCi0JCQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfQUNMUzsKLQkJfQotI2Vsc2UKLQkJc2VydmVyLT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOwotI2VuZGlmIC8qIENPTkZJR19ORlNfVjNfQUNMICovCi0JCS8qCi0JCSAqIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwKLQkJICogZG8gc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgotCQkgKi8KLQkJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7Ci0JCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMzX01BWE5BTUxFTikKLQkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzNfTUFYTkFNTEVOOwotCQlzYi0+c190aW1lX2dyYW4gPSAxOwotCX0gZWxzZSB7Ci0JCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMyX01BWE5BTUxFTikKLQkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzJfTUFYTkFNTEVOOwotCX0KLQotCXNiLT5zX29wID0gJm5mc19zb3BzOwotCXJldHVybiBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvcik7Ci19Ci0KLXN0YXRpYyBpbnQKLW5mc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKLQl1bnNpZ25lZCBjaGFyIGJsb2NrYml0czsKLQl1bnNpZ25lZCBsb25nIGJsb2NrcmVzOwotCXN0cnVjdCBuZnNfZmggKnJvb3RmaCA9IE5GU19GSChzYi0+c19yb290LT5kX2lub2RlKTsKLQlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOwotCXN0cnVjdCBuZnNfZnNzdGF0IHJlcyA9IHsKLQkJCS5mYXR0ciA9ICZmYXR0ciwKLQl9OwotCWludCBlcnJvcjsKLQotCWxvY2tfa2VybmVsKCk7Ci0KLQllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+c3RhdGZzKHNlcnZlciwgcm9vdGZoLCAmcmVzKTsKLQlidWYtPmZfdHlwZSA9IE5GU19TVVBFUl9NQUdJQzsKLQlpZiAoZXJyb3IgPCAwKQotCQlnb3RvIG91dF9lcnI7Ci0KLQkvKgotCSAqIEN1cnJlbnQgdmVyc2lvbnMgb2YgZ2xpYmMgZG8gbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlCi0JICogY2FzZSB3aGVyZSBmX2Zyc2l6ZSAhPSBmX2JzaXplLiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvCi0JICogcmVwb3J0IHRoZSB2YWx1ZSBvZiB3dG11bHQgaW4gdGhpcyBmaWVsZC4KLQkgKi8KLQlidWYtPmZfZnJzaXplID0gc2ItPnNfYmxvY2tzaXplOwotCi0JLyoKLQkgKiBPbiBtb3N0ICpuaXggc3lzdGVtcywgZl9ibG9ja3MsIGZfYmZyZWUsIGFuZCBmX2JhdmFpbAotCSAqIGFyZSByZXBvcnRlZCBpbiB1bml0cyBvZiBmX2Zyc2l6ZS4gIExpbnV4IGhhc24ndCBoYWQKLQkgKiBhbiBmX2Zyc2l6ZSBmaWVsZCBpbiBpdHMgc3RhdGZzIHN0cnVjdCB1bnRpbCByZWNlbnRseSwKLQkgKiB0aHVzIGhpc3RvcmljYWxseSBMaW51eCdzIHN5c19zdGF0ZnMgcmVwb3J0cyB0aGVzZQotCSAqIGZpZWxkcyBpbiB1bml0cyBvZiBmX2JzaXplLgotCSAqLwotCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKLQlibG9ja2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKLQlibG9ja3JlcyA9ICgxIDw8IGJsb2NrYml0cykgLSAxOwotCWJ1Zi0+Zl9ibG9ja3MgPSAocmVzLnRieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7Ci0JYnVmLT5mX2JmcmVlID0gKHJlcy5mYnl0ZXMgKyBibG9ja3JlcykgPj4gYmxvY2tiaXRzOwotCWJ1Zi0+Zl9iYXZhaWwgPSAocmVzLmFieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7Ci0KLQlidWYtPmZfZmlsZXMgPSByZXMudGZpbGVzOwotCWJ1Zi0+Zl9mZnJlZSA9IHJlcy5hZmlsZXM7Ci0KLQlidWYtPmZfbmFtZWxlbiA9IHNlcnZlci0+bmFtZWxlbjsKLSBvdXQ6Ci0JdW5sb2NrX2tlcm5lbCgpOwotCXJldHVybiAwOwotCi0gb3V0X2VycjoKLQlkcHJpbnRrKCIlczogc3RhdGZzIGVycm9yID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgLWVycm9yKTsKLQlidWYtPmZfYnNpemUgPSBidWYtPmZfYmxvY2tzID0gYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IC0xOwotCWdvdG8gb3V0OwotCi19Ci0KLXN0YXRpYyB2b2lkIG5mc19zaG93X21vdW50X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcywgaW50IHNob3dkZWZhdWx0cykKLXsKLQlzdGF0aWMgc3RydWN0IHByb2NfbmZzX2luZm8gewotCQlpbnQgZmxhZzsKLQkJY2hhciAqc3RyOwotCQljaGFyICpub3N0cjsKLQl9IG5mc19pbmZvW10gPSB7Ci0JCXsgTkZTX01PVU5UX1NPRlQsICIsc29mdCIsICIsaGFyZCIgfSwKLQkJeyBORlNfTU9VTlRfSU5UUiwgIixpbnRyIiwgIiIgfSwKLQkJeyBORlNfTU9VTlRfTk9DVE8sICIsbm9jdG8iLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT0FDLCAiLG5vYWMiLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT05MTSwgIixub2xvY2siLCAiIiB9LAotCQl7IE5GU19NT1VOVF9OT0FDTCwgIixub2FjbCIsICIiIH0sCi0JCXsgMCwgTlVMTCwgTlVMTCB9Ci0JfTsKLQlzdHJ1Y3QgcHJvY19uZnNfaW5mbyAqbmZzX2luZm9wOwotCWNoYXIgYnVmWzEyXTsKLQljaGFyICpwcm90bzsKLQotCXNlcV9wcmludGYobSwgIix2ZXJzPSVkIiwgbmZzcy0+cnBjX29wcy0+dmVyc2lvbik7Ci0Jc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgbmZzcy0+cnNpemUpOwotCXNlcV9wcmludGYobSwgIix3c2l6ZT0lZCIsIG5mc3MtPndzaXplKTsKLQlpZiAobmZzcy0+YWNyZWdtaW4gIT0gMypIWiB8fCBzaG93ZGVmYXVsdHMpCi0JCXNlcV9wcmludGYobSwgIixhY3JlZ21pbj0lZCIsIG5mc3MtPmFjcmVnbWluL0haKTsKLQlpZiAobmZzcy0+YWNyZWdtYXggIT0gNjAqSFogfHwgc2hvd2RlZmF1bHRzKQotCQlzZXFfcHJpbnRmKG0sICIsYWNyZWdtYXg9JWQiLCBuZnNzLT5hY3JlZ21heC9IWik7Ci0JaWYgKG5mc3MtPmFjZGlybWluICE9IDMwKkhaIHx8IHNob3dkZWZhdWx0cykKLQkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWluPSVkIiwgbmZzcy0+YWNkaXJtaW4vSFopOwotCWlmIChuZnNzLT5hY2Rpcm1heCAhPSA2MCpIWiB8fCBzaG93ZGVmYXVsdHMpCi0JCXNlcV9wcmludGYobSwgIixhY2Rpcm1heD0lZCIsIG5mc3MtPmFjZGlybWF4L0haKTsKLQlmb3IgKG5mc19pbmZvcCA9IG5mc19pbmZvOyBuZnNfaW5mb3AtPmZsYWc7IG5mc19pbmZvcCsrKSB7Ci0JCWlmIChuZnNzLT5mbGFncyAmIG5mc19pbmZvcC0+ZmxhZykKLQkJCXNlcV9wdXRzKG0sIG5mc19pbmZvcC0+c3RyKTsKLQkJZWxzZQotCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7Ci0JfQotCXN3aXRjaCAobmZzcy0+Y2xpZW50LT5jbF94cHJ0LT5wcm90KSB7Ci0JCWNhc2UgSVBQUk9UT19UQ1A6Ci0JCQlwcm90byA9ICJ0Y3AiOwotCQkJYnJlYWs7Ci0JCWNhc2UgSVBQUk9UT19VRFA6Ci0JCQlwcm90byA9ICJ1ZHAiOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCBuZnNzLT5jbGllbnQtPmNsX3hwcnQtPnByb3QpOwotCQkJcHJvdG8gPSBidWY7Ci0JfQotCXNlcV9wcmludGYobSwgIixwcm90bz0lcyIsIHByb3RvKTsKLQlzZXFfcHJpbnRmKG0sICIsdGltZW89JWx1IiwgMTBVICogbmZzcy0+cmV0cmFuc190aW1lbyAvIEhaKTsKLQlzZXFfcHJpbnRmKG0sICIscmV0cmFucz0ldSIsIG5mc3MtPnJldHJhbnNfY291bnQpOwotfQotCi1zdGF0aWMgaW50IG5mc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcyA9IE5GU19TQihtbnQtPm1udF9zYik7Ci0KLQluZnNfc2hvd19tb3VudF9vcHRpb25zKG0sIG5mc3MsIDApOwotCi0Jc2VxX3B1dHMobSwgIixhZGRyPSIpOwotCXNlcV9lc2NhcGUobSwgbmZzcy0+aG9zdG5hbWUsICIgXHRcblxcIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBuZnNfc2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQotewotCWludCBpLCBjcHU7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKm5mc3MgPSBORlNfU0IobW50LT5tbnRfc2IpOwotCXN0cnVjdCBycGNfYXV0aCAqYXV0aCA9IG5mc3MtPmNsaWVudC0+Y2xfYXV0aDsKLQlzdHJ1Y3QgbmZzX2lvc3RhdHMgdG90YWxzID0geyB9OwotCi0Jc2VxX3ByaW50ZihtLCAic3RhdHZlcnM9JXMiLCBORlNfSU9TVEFUX1ZFUlMpOwotCi0JLyoKLQkgKiBEaXNwbGF5IGFsbCBtb3VudCBvcHRpb24gc2V0dGluZ3MKLQkgKi8KLQlzZXFfcHJpbnRmKG0sICJcblx0b3B0czpcdCIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8gInJvIiA6ICJydyIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMgPyAiLHN5bmMiIDogIiIpOwotCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfTk9BVElNRSA/ICIsbm9hdGltZSIgOiAiIik7Ci0Jc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19OT0RJUkFUSU1FID8gIixub2RpcmF0aW1lIiA6ICIiKTsKLQluZnNfc2hvd19tb3VudF9vcHRpb25zKG0sIG5mc3MsIDEpOwotCi0Jc2VxX3ByaW50ZihtLCAiXG5cdGFnZTpcdCVsdSIsIChqaWZmaWVzIC0gbmZzcy0+bW91bnRfdGltZSkgLyBIWik7Ci0KLQlzZXFfcHJpbnRmKG0sICJcblx0Y2FwczpcdCIpOwotCXNlcV9wcmludGYobSwgImNhcHM9MHgleCIsIG5mc3MtPmNhcHMpOwotCXNlcV9wcmludGYobSwgIix3dG11bHQ9JWQiLCBuZnNzLT53dG11bHQpOwotCXNlcV9wcmludGYobSwgIixkdHNpemU9JWQiLCBuZnNzLT5kdHNpemUpOwotCXNlcV9wcmludGYobSwgIixic2l6ZT0lZCIsIG5mc3MtPmJzaXplKTsKLQlzZXFfcHJpbnRmKG0sICIsbmFtZWxlbj0lZCIsIG5mc3MtPm5hbWVsZW4pOwotCi0jaWZkZWYgQ09ORklHX05GU19WNAotCWlmIChuZnNzLT5ycGNfb3BzLT52ZXJzaW9uID09IDQpIHsKLQkJc2VxX3ByaW50ZihtLCAiXG5cdG5mc3Y0Olx0Iik7Ci0JCXNlcV9wcmludGYobSwgImJtMD0weCV4IiwgbmZzcy0+YXR0cl9iaXRtYXNrWzBdKTsKLQkJc2VxX3ByaW50ZihtLCAiLGJtMT0weCV4IiwgbmZzcy0+YXR0cl9iaXRtYXNrWzFdKTsKLQkJc2VxX3ByaW50ZihtLCAiLGFjbD0weCV4IiwgbmZzcy0+YWNsX2JpdG1hc2spOwotCX0KLSNlbmRpZgotCi0JLyoKLQkgKiBEaXNwbGF5IHNlY3VyaXR5IGZsYXZvciBpbiBlZmZlY3QgZm9yIHRoaXMgbW91bnQKLQkgKi8KLQlzZXFfcHJpbnRmKG0sICJcblx0c2VjOlx0Zmxhdm9yPSVkIiwgYXV0aC0+YXVfb3BzLT5hdV9mbGF2b3IpOwotCWlmIChhdXRoLT5hdV9mbGF2b3IpCi0JCXNlcV9wcmludGYobSwgIixwc2V1ZG9mbGF2b3I9JWQiLCBhdXRoLT5hdV9mbGF2b3IpOwotCi0JLyoKLQkgKiBEaXNwbGF5IHN1cGVyYmxvY2sgSS9PIGNvdW50ZXJzCi0JICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgbmZzX2lvc3RhdHMgKnN0YXRzOwotCi0JCXByZWVtcHRfZGlzYWJsZSgpOwotCQlzdGF0cyA9IHBlcl9jcHVfcHRyKG5mc3MtPmlvX3N0YXRzLCBjcHUpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19DT1VOVFNNQVg7IGkrKykKLQkJCXRvdGFscy5ldmVudHNbaV0gKz0gc3RhdHMtPmV2ZW50c1tpXTsKLQkJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0JZVEVTTUFYOyBpKyspCi0JCQl0b3RhbHMuYnl0ZXNbaV0gKz0gc3RhdHMtPmJ5dGVzW2ldOwotCi0JCXByZWVtcHRfZW5hYmxlKCk7Ci0JfQotCi0Jc2VxX3ByaW50ZihtLCAiXG5cdGV2ZW50czpcdCIpOwotCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19DT1VOVFNNQVg7IGkrKykKLQkJc2VxX3ByaW50ZihtLCAiJWx1ICIsIHRvdGFscy5ldmVudHNbaV0pOwotCXNlcV9wcmludGYobSwgIlxuXHRieXRlczpcdCIpOwotCWZvciAoaSA9IDA7IGkgPCBfX05GU0lPU19CWVRFU01BWDsgaSsrKQotCQlzZXFfcHJpbnRmKG0sICIlTHUgIiwgdG90YWxzLmJ5dGVzW2ldKTsKLQlzZXFfcHJpbnRmKG0sICJcbiIpOwotCi0JcnBjX3ByaW50X2lvc3RhdHMobSwgbmZzcy0+Y2xpZW50KTsKLQotCXJldHVybiAwOwotfQotCiAvKioKICAqIG5mc19zeW5jX21hcHBpbmcgLSBoZWxwZXIgdG8gZmx1c2ggYWxsIG1tYXBwZWQgZGlydHkgZGF0YSB0byBkaXNrCiAgKi8KQEAgLTg4OSw2ICsyNTQsMTQgQEAKIAkJCWlmIChuZnNfc2VydmVyX2NhcGFibGUoaW5vZGUsIE5GU19DQVBfUkVBRERJUlBMVVMpCiAJCQkgICAgJiYgZmF0dHItPnNpemUgPD0gTkZTX0xJTUlUX1JFQURESVJQTFVTKQogCQkJCXNldF9iaXQoTkZTX0lOT19BRFZJU0VfUkRQTFVTLCAmTkZTX0ZMQUdTKGlub2RlKSk7CisJCQkvKiBEZWFsIHdpdGggY3Jvc3NpbmcgbW91bnRwb2ludHMgKi8KKwkJCWlmICghbmZzX2ZzaWRfZXF1YWwoJk5GU19TQihzYiktPmZzaWQsICZmYXR0ci0+ZnNpZCkpIHsKKwkJCQlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpCisJCQkJCWlub2RlLT5pX29wID0gJm5mc19yZWZlcnJhbF9pbm9kZV9vcGVyYXRpb25zOworCQkJCWVsc2UKKwkJCQkJaW5vZGUtPmlfb3AgPSAmbmZzX21vdW50cG9pbnRfaW5vZGVfb3BlcmF0aW9uczsKKwkJCQlpbm9kZS0+aV9mb3AgPSBOVUxMOworCQkJfQogCQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCiAJCQlpbm9kZS0+aV9vcCA9ICZuZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwogCQllbHNlCkBAIC0xMjA3LDYgKzU4MCw3IEBACiAJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiByZXZhbGlkYXRpbmcgKCVzLyVMZClcbiIsCiAJCWlub2RlLT5pX3NiLT5zX2lkLCAobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAorCW5mc19pbmNfc3RhdHMoaW5vZGUsIE5GU0lPU19JTk9ERVJFVkFMSURBVEUpOwogCWxvY2tfa2VybmVsKCk7CiAJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQogIAkJZ290byBvdXRfbm93YWl0OwpAQCAtMTIyMCw3ICs1OTQsNyBAQAogCQlzdGF0dXMgPSAtRVNUQUxFOwogCQkvKiBEbyB3ZSB0cnVzdCB0aGUgY2FjaGVkIEVTVEFMRT8gKi8KIAkJaWYgKE5GU19BVFRSVElNRU8oaW5vZGUpICE9IDApIHsKLQkJCWlmIChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX0lOVkFMSURfQVRJTUUpKSB7CisJCQlpZiAobmZzaS0+Y2FjaGVfdmFsaWRpdHkgJiAoTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0FUSU1FKSkgewogCQkJCS8qIG5vICovCiAJCQl9IGVsc2UKIAkJCQlnb3RvIG91dDsKQEAgLTEyNTEsOCArNjI1LDYgQEAKIAl9CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCi0JbmZzX3JldmFsaWRhdGVfbWFwcGluZyhpbm9kZSwgaW5vZGUtPmlfbWFwcGluZyk7Ci0KIAlpZiAobmZzaS0+Y2FjaGVfdmFsaWRpdHkgJiBORlNfSU5PX0lOVkFMSURfQUNMKQogCQluZnNfemFwX2FjbF9jYWNoZShpbm9kZSk7CiAKQEAgLTEyODYsOCArNjU4LDcgQEAKICAqLwogaW50IG5mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0JbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0lOT0RFUkVWQUxJREFURSk7Ci0JaWYgKCEoTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQSkpCisJaWYgKCEoTkZTX0koaW5vZGUpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fSU5WQUxJRF9BVFRSKQogCQkJJiYgIW5mc19hdHRyaWJ1dGVfdGltZW91dChpbm9kZSkpCiAJCXJldHVybiBORlNfU1RBTEUoaW5vZGUpID8gLUVTVEFMRSA6IDA7CiAJcmV0dXJuIF9fbmZzX3JldmFsaWRhdGVfaW5vZGUoc2VydmVyLCBpbm9kZSk7CkBAIC0xMjk4LDkgKzY2OSwxNiBAQAogICogQGlub2RlIC0gcG9pbnRlciB0byBob3N0IGlub2RlCiAgKiBAbWFwcGluZyAtIHBvaW50ZXIgdG8gbWFwcGluZwogICovCi12b2lkIG5mc19yZXZhbGlkYXRlX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCitpbnQgbmZzX3JldmFsaWRhdGVfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCWludCByZXQgPSAwOworCisJaWYgKE5GU19TVEFMRShpbm9kZSkpCisJCXJldCA9IC1FU1RBTEU7CisJaWYgKChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFKQorCQkJfHwgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGlub2RlKSkKKwkJcmV0ID0gX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOwogCiAJaWYgKG5mc2ktPmNhY2hlX3ZhbGlkaXR5ICYgTkZTX0lOT19JTlZBTElEX0RBVEEpIHsKIAkJbmZzX2luY19zdGF0cyhpbm9kZSwgTkZTSU9TX0RBVEFJTlZBTElEQVRFKTsKQEAgLTEzMjEsNiArNjk5LDcgQEAKIAkJCQlpbm9kZS0+aV9zYi0+c19pZCwKIAkJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKIAl9CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMzYwLDEyICs3MzksNiBAQAogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX1BSRV9DSEFOR0UpICE9IDAKLQkJCSYmIG5mc2ktPmNoYW5nZV9hdHRyID09IGZhdHRyLT5wcmVfY2hhbmdlX2F0dHIpIHsKLQkJbmZzaS0+Y2hhbmdlX2F0dHIgPSBmYXR0ci0+Y2hhbmdlX2F0dHI7Ci0JCW5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUgPSBqaWZmaWVzOwotCX0KLQogCS8qIElmIHdlIGhhdmUgYXRvbWljIFdDQyBkYXRhLCB3ZSBtYXkgdXBkYXRlIHNvbWUgYXR0cmlidXRlcyAqLwogCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfV0NDKSAhPSAwKSB7CiAJCWlmICh0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZmYXR0ci0+cHJlX2N0aW1lKSkgewpAQCAtMTM5OSw5ICs3NzIsNiBAQAogCWludCBkYXRhX3Vuc3RhYmxlOwogCiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSA9PSAwKQotCQlyZXR1cm4gMDsKLQogCS8qIEhhcyB0aGUgaW5vZGUgZ29uZSBhbmQgY2hhbmdlZCBiZWhpbmQgb3VyIGJhY2s/ICovCiAJaWYgKG5mc2ktPmZpbGVpZCAhPSBmYXR0ci0+ZmlsZWlkCiAJCQl8fCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgIT0gKGZhdHRyLT5tb2RlICYgU19JRk1UKSkgewpAQCAtMTQxNCwyMCArNzg0LDEzIEBACiAJLyogRG8gYXRvbWljIHdlYWsgY2FjaGUgY29uc2lzdGVuY3kgdXBkYXRlcyAqLwogCW5mc193Y2NfdXBkYXRlX2lub2RlKGlub2RlLCBmYXR0cik7CiAKLQlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwKSB7Ci0JCWlmIChuZnNpLT5jaGFuZ2VfYXR0ciA9PSBmYXR0ci0+Y2hhbmdlX2F0dHIpCi0JCQlnb3RvIG91dDsKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUVFI7Ci0JCWlmICghZGF0YV91bnN0YWJsZSkKLQkJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwotCX0KKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwICYmCisJCQluZnNpLT5jaGFuZ2VfYXR0ciAhPSBmYXR0ci0+Y2hhbmdlX2F0dHIpCisJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCiAJLyogVmVyaWZ5IGEgZmV3IG9mIHRoZSBtb3JlIGltcG9ydGFudCBhdHRyaWJ1dGVzICovCi0JaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+bXRpbWUpKSB7Ci0JCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwotCQlpZiAoIWRhdGFfdW5zdGFibGUpCi0JCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKLQl9CisJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZmYXR0ci0+bXRpbWUpKQorCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKIAogCWN1cl9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwogIAluZXdfaXNpemUgPSBuZnNfc2l6ZV90b19sb2ZmX3QoZmF0dHItPnNpemUpOwpAQCAtMTQ0NCw3ICs4MDcsNiBAQAogCWlmIChpbm9kZS0+aV9ubGluayAhPSBmYXR0ci0+bmxpbmspCiAJCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOwogCi1vdXQ6CiAJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZmYXR0ci0+YXRpbWUpKQogCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRJTUU7CiAKQEAgLTE0NzAsNyArODMyLDYgQEAKIAlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSA9PSAwKQogCQlyZXR1cm4gMDsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCW5mc2ktPmNhY2hlX3ZhbGlkaXR5ICY9IH5ORlNfSU5PX1JFVkFMX1BBR0VDQUNIRTsKIAlpZiAodGltZV9hZnRlcihmYXR0ci0+dGltZV9zdGFydCwgbmZzaS0+bGFzdF91cGRhdGVkKSkKIAkJc3RhdHVzID0gbmZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwogCWVsc2UKQEAgLTE0OTUsNyArODU2LDcgQEAKIAogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKHVubGlrZWx5KChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkpIHsKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUVFIgfCBORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQUNDRVNTfE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFOwogCQlnb3RvIG91dDsKIAl9CiAJc3RhdHVzID0gbmZzX3VwZGF0ZV9pbm9kZShpbm9kZSwgZmF0dHIpOwpAQCAtMTUxOCw2ICs4NzksNyBAQAogICovCiBzdGF0aWMgaW50IG5mc191cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwogCWxvZmZfdCBjdXJfaXNpemUsIG5ld19pc2l6ZTsKIAl1bnNpZ25lZCBpbnQJaW52YWxpZCA9IDA7CkBAIC0xNTI3LDkgKzg4OSw2IEBACiAJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCiAJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLCBmYXR0ci0+dmFsaWQpOwogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KIAlpZiAobmZzaS0+ZmlsZWlkICE9IGZhdHRyLT5maWxlaWQpCiAJCWdvdG8gb3V0X2ZpbGVpZDsKIApAQCAtMTUzOSw2ICs4OTgsMTIgQEAKIAlpZiAoKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpICE9IChmYXR0ci0+bW9kZSAmIFNfSUZNVCkpCiAJCWdvdG8gb3V0X2NoYW5nZWQ7CiAKKwlzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwkvKiBVcGRhdGUgdGhlIGZzaWQgaWYgYW5kIG9ubHkgaWYgdGhpcyBpcyB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwlpZiAoaW5vZGUgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZQorCQkJJiYgIW5mc19mc2lkX2VxdWFsKCZzZXJ2ZXItPmZzaWQsICZmYXR0ci0+ZnNpZCkpCisJCXNlcnZlci0+ZnNpZCA9IGZhdHRyLT5mc2lkOworCiAJLyoKIAkgKiBVcGRhdGUgdGhlIHJlYWQgdGltZSBzbyB3ZSBkb24ndCByZXZhbGlkYXRlIHRvbyBvZnRlbi4KIAkgKi8KQEAgLTE1NDgsNyArOTEzLDcgQEAKIAkvKiBBcmUgd2UgcmFjaW5nIHdpdGgga25vd24gdXBkYXRlcyBvZiB0aGUgbWV0YWRhdGEgb24gdGhlIHNlcnZlcj8gKi8KIAlkYXRhX3N0YWJsZSA9IG5mc192ZXJpZnlfY2hhbmdlX2F0dHJpYnV0ZShpbm9kZSwgZmF0dHItPnRpbWVfc3RhcnQpOwogCWlmIChkYXRhX3N0YWJsZSkKLQkJbmZzaS0+Y2FjaGVfdmFsaWRpdHkgJj0gfihORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQVRJTUUpOworCQluZnNpLT5jYWNoZV92YWxpZGl0eSAmPSB+KE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9BVElNRSk7CiAKIAkvKiBEbyBhdG9taWMgd2VhayBjYWNoZSBjb25zaXN0ZW5jeSB1cGRhdGVzICovCiAJbmZzX3djY191cGRhdGVfaW5vZGUoaW5vZGUsIGZhdHRyKTsKQEAgLTE2MTIsMTUgKzk3NywxMyBAQAogIAkJaW5vZGUtPmlfYmxrc2l6ZSA9IGZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZTsKICAJfQogCi0JaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNCkpIHsKLQkJaWYgKG5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikgewotCQkJZHByaW50aygiTkZTOiBjaGFuZ2VfYXR0ciBjaGFuZ2Ugb24gc2VydmVyIGZvciBmaWxlICVzLyVsZFxuIiwKLQkJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0JCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGZhdHRyLT5jaGFuZ2VfYXR0cjsKLQkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOwotCQkJbmZzaS0+Y2FjaGVfY2hhbmdlX2F0dHJpYnV0ZSA9IGppZmZpZXM7Ci0JCX0gZWxzZQotCQkJaW52YWxpZCAmPSB+KE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBKTsKKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSX1Y0KSAhPSAwICYmCisJCQluZnNpLT5jaGFuZ2VfYXR0ciAhPSBmYXR0ci0+Y2hhbmdlX2F0dHIpIHsKKwkJZHByaW50aygiTkZTOiBjaGFuZ2VfYXR0ciBjaGFuZ2Ugb24gc2VydmVyIGZvciBmaWxlICVzLyVsZFxuIiwKKwkJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKwkJbmZzaS0+Y2hhbmdlX2F0dHIgPSBmYXR0ci0+Y2hhbmdlX2F0dHI7CisJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEF8TkZTX0lOT19JTlZBTElEX0FDQ0VTU3xORlNfSU5PX0lOVkFMSURfQUNMOworCQluZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlID0gamlmZmllczsKIAl9CiAKIAkvKiBVcGRhdGUgYXR0cnRpbWVvIHZhbHVlIGlmIHdlJ3JlIG91dCBvZiB0aGUgdW5zdGFibGUgcGVyaW9kICovCkBAIC0xNjY4LDE5MCArMTAzMSwxNSBAQAogCWdvdG8gb3V0X2VycjsKIH0KIAotLyoKLSAqIEZpbGUgc3lzdGVtIGluZm9ybWF0aW9uCi0gKi8KLQotc3RhdGljIGludCBuZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKLXsKLQlzLT5zX2ZzX2luZm8gPSBkYXRhOwotCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKLX0KLSAKLXN0YXRpYyBpbnQgbmZzX2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKLQotCWlmIChvbGQtPmFkZHIuc2luX2FkZHIuc19hZGRyICE9IHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIpCi0JCXJldHVybiAwOwotCWlmIChvbGQtPmFkZHIuc2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNpbl9wb3J0KQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gIW5mc19jb21wYXJlX2ZoKCZvbGQtPmZoLCAmc2VydmVyLT5maCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEpCi17Ci0JaW50IGVycm9yOwotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKLQlzdHJ1Y3QgbmZzX2ZoICpyb290OwotCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOwotCi0JcyA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0JaWYgKGRhdGEgPT0gTlVMTCkgewotCQlkcHJpbnRrKCIlczogbWlzc2luZyBkYXRhIGFyZ3VtZW50XG4iLCBfX0ZVTkNUSU9OX18pOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCWlmIChkYXRhLT52ZXJzaW9uIDw9IDAgfHwgZGF0YS0+dmVyc2lvbiA+IE5GU19NT1VOVF9WRVJTSU9OKSB7Ci0JCWRwcmludGsoIiVzOiBiYWQgbW91bnQgdmVyc2lvblxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQlzd2l0Y2ggKGRhdGEtPnZlcnNpb24pIHsKLQkJY2FzZSAxOgotCQkJZGF0YS0+bmFtbGVuID0gMDsKLQkJY2FzZSAyOgotCQkJZGF0YS0+YnNpemUgID0gMDsKLQkJY2FzZSAzOgotCQkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKLQkJCQlkcHJpbnRrKCIlczogbW91bnQgc3RydWN0dXJlIHZlcnNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBORlN2M1xuIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywKLQkJCQkJCWRhdGEtPnZlcnNpb24pOwotCQkJCWdvdG8gb3V0X2VycjsKLQkJCX0KLQkJCWRhdGEtPnJvb3Quc2l6ZSA9IE5GUzJfRkhTSVpFOwotCQkJbWVtY3B5KGRhdGEtPnJvb3QuZGF0YSwgZGF0YS0+b2xkX3Jvb3QuZGF0YSwgTkZTMl9GSFNJWkUpOwotCQljYXNlIDQ6Ci0JCQlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfU0VDRkxBVk9VUikgewotCQkJCWRwcmludGsoIiVzOiBtb3VudCBzdHJ1Y3R1cmUgdmVyc2lvbiAlZCBkb2VzIG5vdCBzdXBwb3J0IHN0cm9uZyBzZWN1cml0eVxuIiwKLQkJCQkJCV9fRlVOQ1RJT05fXywKLQkJCQkJCWRhdGEtPnZlcnNpb24pOwotCQkJCWdvdG8gb3V0X2VycjsKLQkJCX0KLQkJY2FzZSA1OgotCQkJbWVtc2V0KGRhdGEtPmNvbnRleHQsIDAsIHNpemVvZihkYXRhLT5jb250ZXh0KSk7Ci0JfQotI2lmbmRlZiBDT05GSUdfTkZTX1YzCi0JLyogSWYgTkZTdjMgaXMgbm90IGNvbXBpbGVkIGluLCByZXR1cm4gLUVQUk9UT05PU1VQUE9SVCAqLwotCXMgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOwotCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7Ci0JCWRwcmludGsoIiVzOiBORlN2MyBub3QgY29tcGlsZWQgaW50byBrZXJuZWxcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX05GU19WMyAqLwotCi0JcyA9IEVSUl9QVFIoLUVOT01FTSk7Ci0Jc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNlcnZlcikKLQkJZ290byBvdXRfZXJyOwotCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KLQlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7Ci0Jc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jcm9vdCA9ICZzZXJ2ZXItPmZoOwotCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQotCQlyb290LT5zaXplID0gZGF0YS0+cm9vdC5zaXplOwotCWVsc2UKLQkJcm9vdC0+c2l6ZSA9IE5GUzJfRkhTSVpFOwotCXMgPSBFUlJfUFRSKC1FSU5WQUwpOwotCWlmIChyb290LT5zaXplID4gc2l6ZW9mKHJvb3QtPmRhdGEpKSB7Ci0JCWRwcmludGsoIiVzOiBpbnZhbGlkIHJvb3QgZmlsZWhhbmRsZVxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQltZW1jcHkocm9vdC0+ZGF0YSwgZGF0YS0+cm9vdC5kYXRhLCByb290LT5zaXplKTsKLQotCS8qIFdlIG5vdyByZXF1aXJlIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIHRoZSByZW1vdGUgYWRkcmVzcyAqLwotCW1lbWNweSgmc2VydmVyLT5hZGRyLCAmZGF0YS0+YWRkciwgc2l6ZW9mKHNlcnZlci0+YWRkcikpOwotCWlmIChzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyID09IElOQUREUl9BTlkpIHsKLQkJZHByaW50aygiJXM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlIGFkZHJlc3MhXG4iLAotCQkJCV9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQkvKiBGaXJlIHVwIHJwY2lvZCBpZiBub3QgeWV0IHJ1bm5pbmcgKi8KLQlzID0gRVJSX1BUUihycGNpb2RfdXAoKSk7Ci0JaWYgKElTX0VSUihzKSkgewotCQlkcHJpbnRrKCIlczogY291bGRuJ3Qgc3RhcnQgcnBjaW9kISBFcnJvciA9ICVsZFxuIiwKLQkJCQlfX0ZVTkNUSU9OX18sIFBUUl9FUlIocykpOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JcyA9IHNnZXQoZnNfdHlwZSwgbmZzX2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7Ci0JaWYgKElTX0VSUihzKSB8fCBzLT5zX3Jvb3QpCi0JCWdvdG8gb3V0X3JwY2lvZF9kb3duOwotCi0Jcy0+c19mbGFncyA9IGZsYWdzOwotCi0JZXJyb3IgPSBuZnNfZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1NJTEVOVCA/IDEgOiAwKTsKLQlpZiAoZXJyb3IpIHsKLQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKLQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwotCX0KLQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKLQlyZXR1cm4gczsKLW91dF9ycGNpb2RfZG93bjoKLQlycGNpb2RfZG93bigpOwotb3V0X2VycjoKLQlrZnJlZShzZXJ2ZXIpOwotCXJldHVybiBzOwotfQotCi1zdGF0aWMgdm9pZCBuZnNfa2lsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCi17Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzKTsKLQotCWtpbGxfYW5vbl9zdXBlcihzKTsKLQotCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkKLQkJcnBjX3NodXRkb3duX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7Ci0JaWYgKCFJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKLQkJcnBjX3NodXRkb3duX2NsaWVudChzZXJ2ZXItPmNsaWVudF9zeXMpOwotCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X2FjbCkpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnRfYWNsKTsKLQotCWlmICghKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKQotCQlsb2NrZF9kb3duKCk7CS8qIHJlbGVhc2UgcnBjLmxvY2tkICovCi0KLQlycGNpb2RfZG93bigpOwkJLyogcmVsZWFzZSBycGNpb2QgKi8KLQotCW5mc19mcmVlX2lvc3RhdHMoc2VydmVyLT5pb19zdGF0cyk7Ci0Ja2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7Ci0Ja2ZyZWUoc2VydmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mc19mc190eXBlID0gewotCS5vd25lcgkJPSBUSElTX01PRFVMRSwKLQkubmFtZQkJPSAibmZzIiwKLQkuZ2V0X3NiCQk9IG5mc19nZXRfc2IsCi0JLmtpbGxfc2IJPSBuZnNfa2lsbF9zdXBlciwKLQkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAotfTsKIAogI2lmZGVmIENPTkZJR19ORlNfVjQKIAotc3RhdGljIHZvaWQgbmZzNF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Ci0KLQotc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG5mczRfc29wcyA9IHsgCi0JLmFsbG9jX2lub2RlCT0gbmZzX2FsbG9jX2lub2RlLAotCS5kZXN0cm95X2lub2RlCT0gbmZzX2Rlc3Ryb3lfaW5vZGUsCi0JLndyaXRlX2lub2RlCT0gbmZzX3dyaXRlX2lub2RlLAotCS5kZWxldGVfaW5vZGUJPSBuZnNfZGVsZXRlX2lub2RlLAotCS5zdGF0ZnMJCT0gbmZzX3N0YXRmcywKLQkuY2xlYXJfaW5vZGUJPSBuZnM0X2NsZWFyX2lub2RlLAotCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAotCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAotCS5zaG93X3N0YXRzCT0gbmZzX3Nob3dfc3RhdHMsCi19OwotCiAvKgogICogQ2xlYW4gb3V0IGFueSByZW1haW5pbmcgTkZTdjQgc3RhdGUgdGhhdCBtaWdodCBiZSBsZWZ0IG92ZXIgZHVlCiAgKiB0byBvcGVuKCkgY2FsbHMgdGhhdCBwYXNzZWQgbmZzX2F0b21pY19sb29rdXAsIGJ1dCBmYWlsZWQgdG8gY2FsbAogICogbmZzX29wZW4oKS4KICAqLwotc3RhdGljIHZvaWQgbmZzNF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCBuZnM0X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKIApAQCAtMTg3NSwzNTcgKzEwNjMsOSBAQAogCQluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBzdGF0ZS0+c3RhdGUpOwogCX0KIH0KLQotCi1zdGF0aWMgaW50IG5mczRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhICpkYXRhLCBpbnQgc2lsZW50KQotewotCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7Ci0Jc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBOVUxMOwotCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IE5VTEw7Ci0Jc3RydWN0IHJwY19jbG50ICpjbG50ID0gTlVMTDsKLQlzdHJ1Y3QgcnBjX3RpbWVvdXQgdGltZXBhcm1zOwotCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXI7Ci0JaW50IGVyciA9IC1FSU87Ci0KLQlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7Ci0Jc2ItPnNfYmxvY2tzaXplID0gMDsKLQlzZXJ2ZXIgPSBORlNfU0Ioc2IpOwotCWlmIChkYXRhLT5yc2l6ZSAhPSAwKQotCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOwotCWlmIChkYXRhLT53c2l6ZSAhPSAwKQotCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+d3NpemUsIE5VTEwpOwotCXNlcnZlci0+ZmxhZ3MgPSBkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9GTEFHTUFTSzsKLQlzZXJ2ZXItPmNhcHMgPSBORlNfQ0FQX0FUT01JQ19PUEVOOwotCi0Jc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOwotCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKLQlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7Ci0Jc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOwotCi0Jc2VydmVyLT5ycGNfb3BzID0gJm5mc192NF9jbGllbnRvcHM7Ci0KLQluZnNfaW5pdF90aW1lb3V0X3ZhbHVlcygmdGltZXBhcm1zLCBkYXRhLT5wcm90bywgZGF0YS0+dGltZW8sIGRhdGEtPnJldHJhbnMpOwotCi0Jc2VydmVyLT5yZXRyYW5zX3RpbWVvID0gdGltZXBhcm1zLnRvX2luaXR2YWw7Ci0Jc2VydmVyLT5yZXRyYW5zX2NvdW50ID0gdGltZXBhcm1zLnRvX3JldHJpZXM7Ci0KLQljbHAgPSBuZnM0X2dldF9jbGllbnQoJnNlcnZlci0+YWRkci5zaW5fYWRkcik7Ci0JaWYgKCFjbHApIHsKLQkJZHByaW50aygiJXM6IGZhaWxlZCB0byBjcmVhdGUgTkZTNCBjbGllbnQuXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCi0JYXV0aGZsYXZvdXIgPSBSUENfQVVUSF9VTklYOwotCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4gIT0gMCkgewotCQlpZiAoZGF0YS0+YXV0aF9mbGF2b3VybGVuICE9IDEpIHsKLQkJCWRwcmludGsoIiVzOiBJbnZhbGlkIG51bWJlciBvZiBSUEMgYXV0aCBmbGF2b3VycyAlZC5cbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZGF0YS0+YXV0aF9mbGF2b3VybGVuKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dF9mYWlsOwotCQl9Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aGZsYXZvdXIsIGRhdGEtPmF1dGhfZmxhdm91cnMsIHNpemVvZihhdXRoZmxhdm91cikpKSB7Ci0JCQllcnIgPSAtRUZBVUxUOwotCQkJZ290byBvdXRfZmFpbDsKLQkJfQotCX0KLQotCWRvd25fd3JpdGUoJmNscC0+Y2xfc2VtKTsKLQlpZiAoSVNfRVJSKGNscC0+Y2xfcnBjY2xpZW50KSkgewotCQl4cHJ0ID0geHBydF9jcmVhdGVfcHJvdG8oZGF0YS0+cHJvdG8sICZzZXJ2ZXItPmFkZHIsICZ0aW1lcGFybXMpOwotCQlpZiAoSVNfRVJSKHhwcnQpKSB7Ci0JCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOwotCQkJZXJyID0gUFRSX0VSUih4cHJ0KTsKLQkJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyB0cmFuc3BvcnQuIEVycm9yID0gJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKLQkJCWdvdG8gb3V0X2ZhaWw7Ci0JCX0KLQkJY2xudCA9IHJwY19jcmVhdGVfY2xpZW50KHhwcnQsIHNlcnZlci0+aG9zdG5hbWUsICZuZnNfcHJvZ3JhbSwKLQkJCQlzZXJ2ZXItPnJwY19vcHMtPnZlcnNpb24sIGF1dGhmbGF2b3VyKTsKLQkJaWYgKElTX0VSUihjbG50KSkgewotCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKLQkJCWVyciA9IFBUUl9FUlIoY2xudCk7Ci0JCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgY2xpZW50LiBFcnJvciA9ICVkXG4iLAotCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7Ci0JCQlnb3RvIG91dF9mYWlsOwotCQl9Ci0JCWNsbnQtPmNsX2ludHIgICAgID0gMTsKLQkJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOwotCQljbHAtPmNsX3JwY2NsaWVudCA9IGNsbnQ7Ci0JCW1lbWNweShjbHAtPmNsX2lwYWRkciwgc2VydmVyLT5pcF9hZGRyLCBzaXplb2YoY2xwLT5jbF9pcGFkZHIpKTsKLQkJbmZzX2lkbWFwX25ldyhjbHApOwotCX0KLQlsaXN0X2FkZF90YWlsKCZzZXJ2ZXItPm5mczRfc2libGluZ3MsICZjbHAtPmNsX3N1cGVyYmxvY2tzKTsKLQljbG50ID0gcnBjX2Nsb25lX2NsaWVudChjbHAtPmNsX3JwY2NsaWVudCk7Ci0JaWYgKCFJU19FUlIoY2xudCkpCi0JCQlzZXJ2ZXItPm5mczRfc3RhdGUgPSBjbHA7Ci0JdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKLQljbHAgPSBOVUxMOwotCi0JaWYgKElTX0VSUihjbG50KSkgewotCQllcnIgPSBQVFJfRVJSKGNsbnQpOwotCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgY2xpZW50LiBFcnJvciA9ICVkXG4iLAotCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlzZXJ2ZXItPmNsaWVudCAgICA9IGNsbnQ7Ci0KLQlpZiAoc2VydmVyLT5uZnM0X3N0YXRlLT5jbF9pZG1hcCA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGlkbWFwcGVyLlxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKGNsbnQtPmNsX2F1dGgtPmF1X2ZsYXZvciAhPSBhdXRoZmxhdm91cikgewotCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7Ci0KLQkJYXV0aCA9IHJwY2F1dGhfY3JlYXRlKGF1dGhmbGF2b3VyLCBjbG50KTsKLQkJaWYgKElTX0VSUihhdXRoKSkgewotCQkJZHByaW50aygiJXM6IGNvdWxkbid0IGNyZWF0ZSBjcmVkY2FjaGUhXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIFBUUl9FUlIoYXV0aCk7Ci0JCX0KLQl9Ci0KLQlzYi0+c190aW1lX2dyYW4gPSAxOwotCi0Jc2ItPnNfb3AgPSAmbmZzNF9zb3BzOwotCWVyciA9IG5mc19zYl9pbml0KHNiLCBhdXRoZmxhdm91cik7Ci0JaWYgKGVyciA9PSAwKQotCQlyZXR1cm4gMDsKLW91dF9mYWlsOgotCWlmIChjbHApCi0JCW5mczRfcHV0X2NsaWVudChjbHApOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbmZzNF9jb21wYXJlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IGRhdGE7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKm9sZCA9IE5GU19TQihzYik7Ci0KLQlpZiAoc3RyY21wKHNlcnZlci0+aG9zdG5hbWUsIG9sZC0+aG9zdG5hbWUpICE9IDApCi0JCXJldHVybiAwOwotCWlmIChzdHJjbXAoc2VydmVyLT5tbnRfcGF0aCwgb2xkLT5tbnRfcGF0aCkgIT0gMCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkICoKLW5mc19jb3B5X3VzZXJfc3RyaW5nKGNoYXIgKmRzdCwgc3RydWN0IG5mc19zdHJpbmcgKnNyYywgaW50IG1heGxlbikKLXsKLQl2b2lkICpwID0gTlVMTDsKLQotCWlmICghc3JjLT5sZW4pCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCWlmIChzcmMtPmxlbiA8IG1heGxlbikKLQkJbWF4bGVuID0gc3JjLT5sZW47Ci0JaWYgKGRzdCA9PSBOVUxMKSB7Ci0JCXAgPSBkc3QgPSBrbWFsbG9jKG1heGxlbiArIDEsIEdGUF9LRVJORUwpOwotCQlpZiAocCA9PSBOVUxMKQotCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCWlmIChjb3B5X2Zyb21fdXNlcihkc3QsIHNyYy0+ZGF0YSwgbWF4bGVuKSkgewotCQlrZnJlZShwKTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci0JfQotCWRzdFttYXhsZW5dID0gJ1wwJzsKLQlyZXR1cm4gZHN0OwotfQotCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpuZnM0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSkKLXsKLQlpbnQgZXJyb3I7Ci0Jc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7Ci0Jc3RydWN0IG5mczRfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOwotCXZvaWQgKnA7Ci0KLQlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCWRwcmludGsoIiVzOiBtaXNzaW5nIGRhdGEgYXJndW1lbnRcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCX0KLQlpZiAoZGF0YS0+dmVyc2lvbiA8PSAwIHx8IGRhdGEtPnZlcnNpb24gPiBORlM0X01PVU5UX1ZFUlNJT04pIHsKLQkJZHByaW50aygiJXM6IGJhZCBtb3VudCB2ZXJzaW9uXG4iLCBfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKLQl9Ci0KLQlzZXJ2ZXIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzX3NlcnZlciksIEdGUF9LRVJORUwpOwotCWlmICghc2VydmVyKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQkvKiBaZXJvIG91dCB0aGUgTkZTIHN0YXRlIHN0dWZmICovCi0JaW5pdF9uZnN2NF9zdGF0ZShzZXJ2ZXIpOwotCXNlcnZlci0+Y2xpZW50ID0gc2VydmVyLT5jbGllbnRfc3lzID0gc2VydmVyLT5jbGllbnRfYWNsID0gRVJSX1BUUigtRUlOVkFMKTsKLQotCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhOVUxMLCAmZGF0YS0+aG9zdG5hbWUsIDI1Nik7Ci0JaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyOwotCXNlcnZlci0+aG9zdG5hbWUgPSBwOwotCi0JcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKE5VTEwsICZkYXRhLT5tbnRfcGF0aCwgMTAyNCk7Ci0JaWYgKElTX0VSUihwKSkKLQkJZ290byBvdXRfZXJyOwotCXNlcnZlci0+bW50X3BhdGggPSBwOwotCi0JcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKHNlcnZlci0+aXBfYWRkciwgJmRhdGEtPmNsaWVudF9hZGRyLAotCQkJc2l6ZW9mKHNlcnZlci0+aXBfYWRkcikgLSAxKTsKLQlpZiAoSVNfRVJSKHApKQotCQlnb3RvIG91dF9lcnI7Ci0KLQkvKiBXZSBub3cgcmVxdWlyZSB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KLQlpZiAoZGF0YS0+aG9zdF9hZGRybGVuICE9IHNpemVvZihzZXJ2ZXItPmFkZHIpKSB7Ci0JCXMgPSBFUlJfUFRSKC1FSU5WQUwpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIoJnNlcnZlci0+YWRkciwgZGF0YS0+aG9zdF9hZGRyLCBzaXplb2Yoc2VydmVyLT5hZGRyKSkpIHsKLQkJcyA9IEVSUl9QVFIoLUVGQVVMVCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCWlmIChzZXJ2ZXItPmFkZHIuc2luX2ZhbWlseSAhPSBBRl9JTkVUIHx8Ci0JICAgIHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgewotCQlkcHJpbnRrKCIlczogbW91bnQgcHJvZ3JhbSBkaWRuJ3QgcGFzcyByZW1vdGUgSVAgYWRkcmVzcyFcbiIsCi0JCQkJX19GVU5DVElPTl9fKTsKLQkJcyA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JLyogRmlyZSB1cCBycGNpb2QgaWYgbm90IHlldCBydW5uaW5nICovCi0JcyA9IEVSUl9QVFIocnBjaW9kX3VwKCkpOwotCWlmIChJU19FUlIocykpIHsKLQkJZHByaW50aygiJXM6IGNvdWxkbid0IHN0YXJ0IHJwY2lvZCEgRXJyb3IgPSAlbGRcbiIsCi0JCQkJX19GVU5DVElPTl9fLCBQVFJfRVJSKHMpKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlzID0gc2dldChmc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7Ci0KLQlpZiAoSVNfRVJSKHMpIHx8IHMtPnNfcm9vdCkKLQkJZ290byBvdXRfZnJlZTsKLQotCXMtPnNfZmxhZ3MgPSBmbGFnczsKLQotCWVycm9yID0gbmZzNF9maWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfU0lMRU5UID8gMSA6IDApOwotCWlmIChlcnJvcikgewotCQl1cF93cml0ZSgmcy0+c191bW91bnQpOwotCQlkZWFjdGl2YXRlX3N1cGVyKHMpOwotCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7Ci0JfQotCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCXJldHVybiBzOwotb3V0X2VycjoKLQlzID0gKHN0cnVjdCBzdXBlcl9ibG9jayAqKXA7Ci1vdXRfZnJlZToKLQlrZnJlZShzZXJ2ZXItPm1udF9wYXRoKTsKLQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKLQlrZnJlZShzZXJ2ZXIpOwotCXJldHVybiBzOwotfQotCi1zdGF0aWMgdm9pZCBuZnM0X2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKLQotCW5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKLQlraWxsX2Fub25fc3VwZXIoc2IpOwotCi0JbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOwotCi0JaWYgKHNlcnZlci0+Y2xpZW50ICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCi0JCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOwotCi0JZGVzdHJveV9uZnN2NF9zdGF0ZShzZXJ2ZXIpOwotCi0JcnBjaW9kX2Rvd24oKTsKLQotCW5mc19mcmVlX2lvc3RhdHMoc2VydmVyLT5pb19zdGF0cyk7Ci0Ja2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7Ci0Ja2ZyZWUoc2VydmVyKTsKLX0KLQotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mczRfZnNfdHlwZSA9IHsKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi0JLm5hbWUJCT0gIm5mczQiLAotCS5nZXRfc2IJCT0gbmZzNF9nZXRfc2IsCi0JLmtpbGxfc2IJPSBuZnM0X2tpbGxfc3VwZXIsCi0JLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbmZzX3NldF9wb3J0X21pbiA9IDA7Ci1zdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9tYXggPSA2NTUzNTsKLXN0YXRpYyBpbnQgcGFyYW1fc2V0X3BvcnQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKLXsKLQljaGFyICplbmRwOwotCWludCBudW0gPSBzaW1wbGVfc3RydG9sKHZhbCwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IHZhbCB8fCAqZW5kcCB8fCBudW0gPCBuZnNfc2V0X3BvcnRfbWluIHx8IG51bSA+IG5mc19zZXRfcG9ydF9tYXgpCi0JCXJldHVybiAtRUlOVkFMOwotCSooKGludCAqKWtwLT5hcmcpID0gbnVtOwotCXJldHVybiAwOwotfQotCi1tb2R1bGVfcGFyYW1fY2FsbChjYWxsYmFja190Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKLQkJICZuZnNfY2FsbGJhY2tfc2V0X3RjcHBvcnQsIDA2NDQpOwotCi1zdGF0aWMgaW50IHBhcmFtX3NldF9pZG1hcF90aW1lb3V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCi17Ci0JY2hhciAqZW5kcDsKLQlpbnQgbnVtID0gc2ltcGxlX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsKLQlpbnQgamlmID0gbnVtICogSFo7Ci0JaWYgKGVuZHAgPT0gdmFsIHx8ICplbmRwIHx8IG51bSA8IDAgfHwgamlmIDwgbnVtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkqKChpbnQgKilrcC0+YXJnKSA9IGppZjsKLQlyZXR1cm4gMDsKLX0KLQotbW9kdWxlX3BhcmFtX2NhbGwoaWRtYXBfY2FjaGVfdGltZW91dCwgcGFyYW1fc2V0X2lkbWFwX3RpbWVvdXQsIHBhcmFtX2dldF9pbnQsCi0JCSAmbmZzX2lkbWFwX2NhY2hlX3RpbWVvdXQsIDA2NDQpOwotCi0jZGVmaW5lIG5mczRfaW5pdF9vbmNlKG5mc2kpIFwKLQlkbyB7IFwKLQkJSU5JVF9MSVNUX0hFQUQoJihuZnNpKS0+b3Blbl9zdGF0ZXMpOyBcCi0JCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOyBcCi0JCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOyBcCi0JCWluaXRfcndzZW0oJm5mc2ktPnJ3c2VtKTsgXAotCX0gd2hpbGUoMCkKLQotc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfbmZzNGZzKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IG5mc19yZWdpc3Rlcl9zeXNjdGwoKTsKLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKTsKLQlpZiAocmV0ICE9IDApCi0JCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1bnJlZ2lzdGVyX25mczRmcyh2b2lkKQotewotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzNF9mc190eXBlKTsKLQluZnNfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKLX0KLSNlbHNlCi0jZGVmaW5lIG5mczRfaW5pdF9vbmNlKG5mc2kpIFwKLQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHJlZ2lzdGVyX25mczRmcygpICgwKQotI2RlZmluZSB1bnJlZ2lzdGVyX25mczRmcygpCiAjZW5kaWYKIAotZXh0ZXJuIGludCBuZnNfaW5pdF9uZnNwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gaW50IG5mc19pbml0X3JlYWRwYWdlY2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9yZWFkcGFnZWNhY2hlKHZvaWQpOwotZXh0ZXJuIGludCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKLWV4dGVybiB2b2lkIG5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKHZvaWQpOwotI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KLWV4dGVybiBpbnQgbmZzX2luaXRfZGlyZWN0Y2FjaGUodm9pZCk7Ci1leHRlcm4gdm9pZCBuZnNfZGVzdHJveV9kaXJlY3RjYWNoZSh2b2lkKTsKLSNlbmRpZgotCi1zdGF0aWMga21lbV9jYWNoZV90ICogbmZzX2lub2RlX2NhY2hlcDsKLQotc3RhdGljIHN0cnVjdCBpbm9kZSAqbmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2k7CiAJbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhuZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CkBAIC0yMjQ0LDExICsxMDg0LDIxIEBACiAJcmV0dXJuICZuZnNpLT52ZnNfaW5vZGU7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJa21lbV9jYWNoZV9mcmVlKG5mc19pbm9kZV9jYWNoZXAsIE5GU19JKGlub2RlKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnM0X2luaXRfb25jZShzdHJ1Y3QgbmZzX2lub2RlICpuZnNpKQoreworI2lmZGVmIENPTkZJR19ORlNfVjQKKwlJTklUX0xJU1RfSEVBRCgmbmZzaS0+b3Blbl9zdGF0ZXMpOworCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOworCW5mc2ktPmRlbGVnYXRpb25fc3RhdGUgPSAwOworCWluaXRfcndzZW0oJm5mc2ktPnJ3c2VtKTsKKyNlbmRpZgorfQorCiBzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewogCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSAoc3RydWN0IG5mc19pbm9kZSAqKSBmb287CkBAIC0yMjY5LDcgKzExMTksNyBAQAogCX0KIH0KICAKLXN0YXRpYyBpbnQgbmZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQorc3RhdGljIGludCBfX2luaXQgbmZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQogewogCW5mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX2lub2RlX2NhY2hlIiwKIAkJCQkJICAgICBzaXplb2Yoc3RydWN0IG5mc19pbm9kZSksCkBAIC0yMjgyLDcgKzExMzIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBuZnNfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQogewogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2lub2RlX2NhY2hlcCkpCiAJCXByaW50ayhLRVJOX0lORk8gIm5mc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOwpAQCAtMjMxMSwyOSArMTE2MSwyMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0MTsKIAotI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KIAllcnIgPSBuZnNfaW5pdF9kaXJlY3RjYWNoZSgpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0MDsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlycGNfcHJvY19yZWdpc3RlcigmbmZzX3JwY3N0YXQpOwogI2VuZGlmCi0gICAgICAgIGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mc19mc190eXBlKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQlpZiAoKGVyciA9IHJlZ2lzdGVyX25mczRmcygpKSAhPSAwKQorCWlmICgoZXJyID0gcmVnaXN0ZXJfbmZzX2ZzKCkpICE9IDApCiAJCWdvdG8gb3V0OwogCXJldHVybiAwOwogb3V0OgogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJcnBjX3Byb2NfdW5yZWdpc3RlcigibmZzIik7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCiAJbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKTsKIG91dDA6Ci0jZW5kaWYKIAluZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSgpOwogb3V0MToKIAluZnNfZGVzdHJveV9yZWFkcGFnZWNhY2hlKCk7CkBAIC0yMzQ3LDkgKzExOTAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZnNfZnModm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCiAJbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKTsKLSNlbmRpZgogCW5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKCk7CiAJbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSgpOwogCW5mc19kZXN0cm95X2lub2RlY2FjaGUoKTsKQEAgLTIzNTcsOCArMTE5OCw3IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlycGNfcHJvY191bnJlZ2lzdGVyKCJuZnMiKTsKICNlbmRpZgotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOwotCXVucmVnaXN0ZXJfbmZzNGZzKCk7CisJdW5yZWdpc3Rlcl9uZnNfZnMoKTsKIH0KIAogLyogTm90IHF1aXRlIHRydWU7IEkganVzdCBtYWludGFpbiBpdCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDI4MTVlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2ludGVybmFsLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBORlMgaW50ZXJuYWwgZGVmaW5pdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKworc3RydWN0IG5mc19jbG9uZV9tb3VudCB7CisJY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwljb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IG5mc19maCAqZmg7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHI7CisJY2hhciAqaG9zdG5hbWU7CisJY2hhciAqbW50X3BhdGg7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvcjsKK307CisKKy8qIG5hbWVzcGFjZS1uZnM0LmMgKi8KKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitleHRlcm4gc3RydWN0IHZmc21vdW50ICpuZnNfZG9fcmVmbW91bnQoY29uc3Qgc3RydWN0IHZmc21vdW50ICptbnRfcGFyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX3JlZm1vdW50KGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorI2VuZGlmCisKKy8qIGNhbGxiYWNrX3hkci5jICovCitleHRlcm4gc3RydWN0IHN2Y192ZXJzaW9uIG5mczRfY2FsbGJhY2tfdmVyc2lvbjE7CisKKy8qIHBhZ2VsaXN0LmMgKi8KK2V4dGVybiBpbnQgX19pbml0IG5mc19pbml0X25mc3BhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBuZnNfaW5pdF9yZWFkcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gaW50IF9faW5pdCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKKworI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KK2V4dGVybiBpbnQgX19pbml0IG5mc19pbml0X2RpcmVjdGNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgbmZzX2luaXRfZGlyZWN0Y2FjaGUoKSAoMCkKKyNkZWZpbmUgbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKSBkbyB7fSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIG5mczJ4ZHIuYyAqLworZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzX3Byb2NlZHVyZXNbXTsKK2V4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworCisvKiBuZnMzeGRyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczNfcHJvY2VkdXJlc1tdOworZXh0ZXJuIHUzMiAqbmZzM19kZWNvZGVfZGlyZW50KHUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CisKKy8qIG5mczR4ZHIuYyAqLworZXh0ZXJuIGludCBuZnNfc3RhdF90b19lcnJubyhpbnQpOworZXh0ZXJuIHUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKKworLyogbmZzNHByb2MuYyAqLworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOworCitleHRlcm4gaW50IG5mczRfcHJvY19mc19sb2NhdGlvbnMoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLAorCQkJCSAgc3RydWN0IHBhZ2UgKnBhZ2UpOworI2VuZGlmCisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLGludCk7CitleHRlcm4gdm9pZCBuZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiB2b2lkIG5mczRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworI2VuZGlmCisKKy8qIHN1cGVyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNfcmVmZXJyYWxfbmZzNF9mc190eXBlOworZXh0ZXJuIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGNsb25lX25mc19mc190eXBlOworI2lmZGVmIENPTkZJR19ORlNfVjQKK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjbG9uZV9uZnM0X2ZzX3R5cGU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworZXh0ZXJuIHN0cnVjdCBycGNfc3RhdCBuZnNfcnBjc3RhdDsKKyNlbmRpZgorZXh0ZXJuIGludCBfX2luaXQgcmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOworZXh0ZXJuIHZvaWQgX19leGl0IHVucmVnaXN0ZXJfbmZzX2ZzKHZvaWQpOworCisvKiBuYW1lc3BhY2UuYyAqLworZXh0ZXJuIGNoYXIgKm5mc19wYXRoKGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1Zmxlbik7CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG1vdW50IHBhdGggYXMgYSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSBjaGFyICoKK25mczRfcGF0aChjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc3NpemVfdCBidWZsZW4pCit7CisjaWZkZWYgQ09ORklHX05GU19WNAorCXJldHVybiBuZnNfcGF0aChORlNfU0IoZGVudHJ5LT5kX3NiKS0+bW50X3BhdGgsIGRlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBkZXZpY2UgbmFtZSBhcyBhIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIGNoYXIgKm5mc19kZXZuYW1lKGNvbnN0IHN0cnVjdCB2ZnNtb3VudCAqbW50X3BhcmVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1ZmxlbikKK3sKKwlyZXR1cm4gbmZzX3BhdGgobW50X3BhcmVudC0+bW50X2Rldm5hbWUsIGRlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworfQorCisvKgorICogRGV0ZXJtaW5lIHRoZSBhY3R1YWwgYmxvY2sgc2l6ZSAoYW5kIGxvZzIgdGhlcmVvZikKKyAqLworc3RhdGljIGlubGluZQordW5zaWduZWQgbG9uZyBuZnNfYmxvY2tfYml0cyh1bnNpZ25lZCBsb25nIGJzaXplLCB1bnNpZ25lZCBjaGFyICpucmJpdHNwKQoreworCS8qIG1ha2Ugc3VyZSBibG9ja3NpemUgaXMgYSBwb3dlciBvZiB0d28gKi8KKwlpZiAoKGJzaXplICYgKGJzaXplIC0gMSkpIHx8IG5yYml0c3ApIHsKKwkJdW5zaWduZWQgY2hhcglucmJpdHM7CisKKwkJZm9yIChucmJpdHMgPSAzMTsgbnJiaXRzICYmICEoYnNpemUgJiAoMSA8PCBucmJpdHMpKTsgbnJiaXRzLS0pCisJCQk7CisJCWJzaXplID0gMSA8PCBucmJpdHM7CisJCWlmIChucmJpdHNwKQorCQkJKm5yYml0c3AgPSBucmJpdHM7CisJfQorCisJcmV0dXJuIGJzaXplOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgNTEyYnl0ZSBibG9ja3MgdXNlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5mc19jYWxjX2Jsb2NrX3NpemUodTY0IHRzaXplKQoreworCWxvZmZfdCB1c2VkID0gKHRzaXplICsgNTExKSA+PiA5OworCXJldHVybiAodXNlZCA+IFVMT05HX01BWCkgPyBVTE9OR19NQVggOiB1c2VkOworfQorCisvKgorICogQ29tcHV0ZSBhbmQgc2V0IE5GUyBzZXJ2ZXIgYmxvY2tzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUKK3Vuc2lnbmVkIGxvbmcgbmZzX2Jsb2NrX3NpemUodW5zaWduZWQgbG9uZyBic2l6ZSwgdW5zaWduZWQgY2hhciAqbnJiaXRzcCkKK3sKKwlpZiAoYnNpemUgPCBORlNfTUlOX0ZJTEVfSU9fU0laRSkKKwkJYnNpemUgPSBORlNfREVGX0ZJTEVfSU9fU0laRTsKKwllbHNlIGlmIChic2l6ZSA+PSBORlNfTUFYX0ZJTEVfSU9fU0laRSkKKwkJYnNpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKworCXJldHVybiBuZnNfYmxvY2tfYml0cyhic2l6ZSwgbnJiaXRzcCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gZmlsZSBzaXplIGZvciBhIHN1cGVyYmxvY2sKKyAqLworc3RhdGljIGlubGluZQordm9pZCBuZnNfc3VwZXJfc2V0X21heGJ5dGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTY0IG1heGZpbGVzaXplKQoreworCXNiLT5zX21heGJ5dGVzID0gKGxvZmZfdCltYXhmaWxlc2l6ZTsKKwlpZiAoc2ItPnNfbWF4Ynl0ZXMgPiBNQVhfTEZTX0ZJTEVTSVpFIHx8IHNiLT5zX21heGJ5dGVzIDw9IDApCisJCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSBzdHJpbmcgcmVwcmVzZW50cyBhICJ2YWxpZCIgSVB2NCBhZGRyZXNzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2lwYWRkcjQoY29uc3QgY2hhciAqYnVmKQoreworCWludCByYywgY291bnQsIGluWzRdOworCisJcmMgPSBzc2NhbmYoYnVmLCAiJWQuJWQuJWQuJWQiLCAmaW5bMF0sICZpblsxXSwgJmluWzJdLCAmaW5bM10pOworCWlmIChyYyAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCA0OyBjb3VudCsrKSB7CisJCWlmIChpbltjb3VudF0gPiAyNTUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvbmFtZXNwYWNlLmMgYi9mcy9uZnMvbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliOThjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uYW1lc3BhY2UuYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9uYW1lc3BhY2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15a2xlYnVzdEBuZXRhcHAuY29tPgorICoKKyAqIE5GUyBuYW1lc3BhY2UKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1ZGUworCitzdGF0aWMgdm9pZCBuZnNfZXhwaXJlX2F1dG9tb3VudHModm9pZCAqbGlzdCk7CisKK0xJU1RfSEVBRChuZnNfYXV0b21vdW50X2xpc3QpOworc3RhdGljIERFQ0xBUkVfV09SSyhuZnNfYXV0b21vdW50X3Rhc2ssIG5mc19leHBpcmVfYXV0b21vdW50cywgJm5mc19hdXRvbW91bnRfbGlzdCk7CitpbnQgbmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQgPSA1MDAgKiBIWjsKKworLyoKKyAqIG5mc19wYXRoIC0gcmVjb25zdHJ1Y3QgdGhlIHBhdGggZ2l2ZW4gYW4gYXJiaXRyYXJ5IGRlbnRyeQorICogQGJhc2UgLSBhcmJpdHJhcnkgc3RyaW5nIHRvIHByZXBlbmQgdG8gdGhlIHBhdGgKKyAqIEBkZW50cnkgLSBwb2ludGVyIHRvIGRlbnRyeQorICogQGJ1ZmZlciAtIHJlc3VsdCBidWZmZXIKKyAqIEBidWZsZW4gLSBsZW5ndGggb2YgYnVmZmVyCisgKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgdGhlIHBhdGggZnJvbSB0aGUKKyAqIHJvb3QgZGVudHJ5IHRvIGFuIGFyYml0cmFyeSBoYXNoZWQgZGVudHJ5LgorICoKKyAqIFRoaXMgaXMgbWFpbmx5IGZvciB1c2UgaW4gZmlndXJpbmcgb3V0IHRoZSBwYXRoIG9uIHRoZQorICogc2VydmVyIHNpZGUgd2hlbiBhdXRvbW91bnRpbmcgb24gdG9wIG9mIGFuIGV4aXN0aW5nIHBhcnRpdGlvbi4KKyAqLworY2hhciAqbmZzX3BhdGgoY29uc3QgY2hhciAqYmFzZSwgY29uc3Qgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgICAgICBjaGFyICpidWZmZXIsIHNzaXplX3QgYnVmbGVuKQoreworCWNoYXIgKmVuZCA9IGJ1ZmZlcitidWZsZW47CisJaW50IG5hbWVsZW47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXdoaWxlICghSVNfUk9PVChkZW50cnkpKSB7CisJCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJCWJ1ZmxlbiAtPSBuYW1lbGVuICsgMTsKKwkJaWYgKGJ1ZmxlbiA8IDApCisJCQlnb3RvIEVsb25nOworCQllbmQgLT0gbmFtZWxlbjsKKwkJbWVtY3B5KGVuZCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbik7CisJCSotLWVuZCA9ICcvJzsKKwkJZGVudHJ5ID0gZGVudHJ5LT5kX3BhcmVudDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwluYW1lbGVuID0gc3RybGVuKGJhc2UpOworCS8qIFN0cmlwIG9mZiBleGNlc3Mgc2xhc2hlcyBpbiBiYXNlIHN0cmluZyAqLworCXdoaWxlIChuYW1lbGVuID4gMCAmJiBiYXNlW25hbWVsZW4gLSAxXSA9PSAnLycpCisJCW5hbWVsZW4tLTsKKwlidWZsZW4gLT0gbmFtZWxlbjsKKwlpZiAoYnVmbGVuIDwgMCkKKwkJZ290byBFbG9uZzsKKwllbmQgLT0gbmFtZWxlbjsKKwltZW1jcHkoZW5kLCBiYXNlLCBuYW1lbGVuKTsKKwlyZXR1cm4gZW5kOworRWxvbmc6CisJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Cit9CisKKy8qCisgKiBuZnNfZm9sbG93X21vdW50cG9pbnQgLSBoYW5kbGUgY3Jvc3NpbmcgYSBtb3VudHBvaW50IG9uIHRoZSBzZXJ2ZXIKKyAqIEBkZW50cnkgLSBkZW50cnkgb2YgbW91bnRwb2ludAorICogQG5kIC0gbmFtZWlkYXRhIGluZm8KKyAqCisgKiBXaGVuIHdlIGVuY291bnRlciBhIG1vdW50cG9pbnQgb24gdGhlIHNlcnZlciwgd2Ugd2FudCB0byBzZXQgdXAKKyAqIGEgbW91bnRwb2ludCBvbiB0aGUgY2xpZW50IHRvbywgdG8gcHJldmVudCBpbm9kZSBudW1iZXJzIGZyb20KKyAqIGNvbGxpZGluZywgYW5kIHRvIGFsbG93ICJkZiIgdG8gd29yayBwcm9wZXJseS4KKyAqIE9uIE5GU3Y0LCB3ZSBhbHNvIHdhbnQgdG8gYWxsb3cgZm9yIHRoZSBmYWN0IHRoYXQgZGlmZmVyZW50CisgKiBmaWxlc3lzdGVtcyBtYXkgYmUgbWlncmF0ZWQgdG8gZGlmZmVyZW50IHNlcnZlcnMgaW4gYSBmYWlsb3ZlcgorICogc2l0dWF0aW9uLCBhbmQgdGhhdCBkaWZmZXJlbnQgZmlsZXN5c3RlbXMgbWF5IHdhbnQgdG8gdXNlCisgKiBkaWZmZXJlbnQgc2VjdXJpdHkgZmxhdm91cnMuCisgKi8KK3N0YXRpYyB2b2lkICogbmZzX2ZvbGxvd19tb3VudHBvaW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJc3RydWN0IG5mc19maCBmaDsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCWludCBlcnI7CisKKwlCVUdfT04oSVNfUk9PVChkZW50cnkpKTsKKwlkcHJpbnRrKCIlczogZW50ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWlmIChkX21vdW50cG9pbnQobmQtPmRlbnRyeSkpCisJCWdvdG8gb3V0X2ZvbGxvdzsKKwkvKiBMb29rIGl0IHVwIGFnYWluICovCisJcGFyZW50ID0gZGdldF9wYXJlbnQobmQtPmRlbnRyeSk7CisJZXJyID0gc2VydmVyLT5ycGNfb3BzLT5sb29rdXAocGFyZW50LT5kX2lub2RlLCAmbmQtPmRlbnRyeS0+ZF9uYW1lLCAmZmgsICZmYXR0cik7CisJZHB1dChwYXJlbnQpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKGZhdHRyLnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwpCisJCW1udCA9IG5mc19kb19yZWZtb3VudChuZC0+bW50LCBuZC0+ZGVudHJ5KTsKKwllbHNlCisJCW1udCA9IG5mc19kb19zdWJtb3VudChuZC0+bW50LCBuZC0+ZGVudHJ5LCAmZmgsICZmYXR0cik7CisJZXJyID0gUFRSX0VSUihtbnQpOworCWlmIChJU19FUlIobW50KSkKKwkJZ290byBvdXRfZXJyOworCisJbW50Z2V0KG1udCk7CisJZXJyID0gZG9fYWRkX21vdW50KG1udCwgbmQsIG5kLT5tbnQtPm1udF9mbGFnc3xNTlRfU0hSSU5LQUJMRSwgJm5mc19hdXRvbW91bnRfbGlzdCk7CisJaWYgKGVyciA8IDApIHsKKwkJbW50cHV0KG1udCk7CisJCWlmIChlcnIgPT0gLUVCVVNZKQorCQkJZ290byBvdXRfZm9sbG93OworCQlnb3RvIG91dF9lcnI7CisJfQorCW1udHB1dChuZC0+bW50KTsKKwlkcHV0KG5kLT5kZW50cnkpOworCW5kLT5tbnQgPSBtbnQ7CisJbmQtPmRlbnRyeSA9IGRnZXQobW50LT5tbnRfcm9vdCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZuZnNfYXV0b21vdW50X3Rhc2ssIG5mc19tb3VudHBvaW50X2V4cGlyeV90aW1lb3V0KTsKK291dDoKKwlkcHJpbnRrKCIlczogZG9uZSwgcmV0dXJuZWQgJWRcbiIsIF9fRlVOQ1RJT05fXywgZXJyKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworb3V0X2VycjoKKwlwYXRoX3JlbGVhc2UobmQpOworCWdvdG8gb3V0Oworb3V0X2ZvbGxvdzoKKwl3aGlsZShkX21vdW50cG9pbnQobmQtPmRlbnRyeSkgJiYgZm9sbG93X2Rvd24oJm5kLT5tbnQsICZuZC0+ZGVudHJ5KSkKKwkJOworCWVyciA9IDA7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19tb3VudHBvaW50X2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmZvbGxvd19saW5rCT0gbmZzX2ZvbGxvd19tb3VudHBvaW50LAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnNfcmVmZXJyYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZm9sbG93X2xpbmsJPSBuZnNfZm9sbG93X21vdW50cG9pbnQsCit9OworCitzdGF0aWMgdm9pZCBuZnNfZXhwaXJlX2F1dG9tb3VudHModm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gKHN0cnVjdCBsaXN0X2hlYWQgKilkYXRhOworCisJbWFya19tb3VudHNfZm9yX2V4cGlyeShsaXN0KTsKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmZzX2F1dG9tb3VudF90YXNrLCBuZnNfbW91bnRwb2ludF9leHBpcnlfdGltZW91dCk7Cit9CisKK3ZvaWQgbmZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKHZvaWQpCit7CisJaWYgKGxpc3RfZW1wdHkoJm5mc19hdXRvbW91bnRfbGlzdCkpIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmbmZzX2F1dG9tb3VudF90YXNrKTsKKwkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwl9Cit9CisKKy8qCisgKiBDbG9uZSBhIG1vdW50cG9pbnQgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2RvX2Nsb25lX21vdW50KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGNoYXIgKmRldm5hbWUsCisJCQkJCSAgIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKm1vdW50ZGF0YSkKK3sKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOworCXN3aXRjaCAoc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uKSB7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQkJbW50ID0gdmZzX2tlcm5fbW91bnQoJmNsb25lX25mc19mc190eXBlLCAwLCBkZXZuYW1lLCBtb3VudGRhdGEpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCW1udCA9IHZmc19rZXJuX21vdW50KCZjbG9uZV9uZnM0X2ZzX3R5cGUsIDAsIGRldm5hbWUsIG1vdW50ZGF0YSk7CisJfQorCXJldHVybiBtbnQ7CisjZWxzZQorCXJldHVybiB2ZnNfa2Vybl9tb3VudCgmY2xvbmVfbmZzX2ZzX3R5cGUsIDAsIGRldm5hbWUsIG1vdW50ZGF0YSk7CisjZW5kaWYKK30KKworLyoqCisgKiBuZnNfZG9fc3VibW91bnQgLSBzZXQgdXAgbW91bnRwb2ludCB3aGVuIGNyb3NzaW5nIGEgZmlsZXN5c3RlbSBib3VuZGFyeQorICogQG1udF9wYXJlbnQgLSBtb3VudHBvaW50IG9mIHBhcmVudCBkaXJlY3RvcnkKKyAqIEBkZW50cnkgLSBwYXJlbnQgZGlyZWN0b3J5CisgKiBAZmggLSBmaWxlaGFuZGxlIGZvciBuZXcgcm9vdCBkZW50cnkKKyAqIEBmYXR0ciAtIGF0dHJpYnV0ZXMgZm9yIG5ldyByb290IGlub2RlCisgKgorICovCitzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc19maCAqZmgsCisJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgbW91bnRkYXRhID0geworCQkuc2IgPSBtbnRfcGFyZW50LT5tbnRfc2IsCisJCS5kZW50cnkgPSBkZW50cnksCisJCS5maCA9IGZoLAorCQkuZmF0dHIgPSBmYXR0ciwKKwl9OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gRVJSX1BUUigtRU5PTUVNKTsKKwljaGFyICpwYWdlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwljaGFyICpkZXZuYW1lOworCisJZHByaW50aygiJXM6IHN1Ym1vdW50aW5nIG9uICVzLyVzXG4iLCBfX0ZVTkNUSU9OX18sCisJCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWlmIChwYWdlID09IE5VTEwpCisJCWdvdG8gb3V0OworCWRldm5hbWUgPSBuZnNfZGV2bmFtZShtbnRfcGFyZW50LCBkZW50cnksIHBhZ2UsIFBBR0VfU0laRSk7CisJbW50ID0gKHN0cnVjdCB2ZnNtb3VudCAqKWRldm5hbWU7CisJaWYgKElTX0VSUihkZXZuYW1lKSkKKwkJZ290byBmcmVlX3BhZ2U7CisJbW50ID0gbmZzX2RvX2Nsb25lX21vdW50KE5GU19TQihtbnRfcGFyZW50LT5tbnRfc2IpLCBkZXZuYW1lLCAmbW91bnRkYXRhKTsKK2ZyZWVfcGFnZToKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CitvdXQ6CisJZHByaW50aygiJXM6IGRvbmVcbiIsIF9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIG1udDsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCmluZGV4IGYwMDE1ZmEuLjY3MzkxZWUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnMyeGRyLmMKKysrIGIvZnMvbmZzL25mczJ4ZHIuYwpAQCAtMjMsMTIgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgvbmZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzMi5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfWERSCiAvKiAjZGVmaW5lIE5GU19QQVJBTk9JQSAxICovCiAKLWV4dGVybiBpbnQJCQluZnNfc3RhdF90b19lcnJubyhpbnQgc3RhdCk7Ci0KIC8qIE1hcHBpbmcgZnJvbSBORlMgZXJyb3IgY29kZSB0byAiZXJybm8iIGVycm9yIGNvZGUuICovCiAjZGVmaW5lIGVycm5vX05GU0VSUl9JTwkJRUlPCiAKQEAgLTEzMSw3ICsxMzAsOCBAQAogCWZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZSA9IG50b2hsKCpwKyspOwogCXJkZXYgPSBudG9obCgqcCsrKTsKIAlmYXR0ci0+ZHUubmZzMi5ibG9ja3MgPSBudG9obCgqcCsrKTsKLQlmYXR0ci0+ZnNpZF91Lm5mczMgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+ZnNpZC5tYWpvciA9IG50b2hsKCpwKyspOworCWZhdHRyLT5mc2lkLm1pbm9yID0gMDsKIAlmYXR0ci0+ZmlsZWlkID0gbnRvaGwoKnArKyk7CiAJcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPmF0aW1lKTsKIAlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+bXRpbWUpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNhY2wuYyBiL2ZzL25mcy9uZnMzYWNsLmMKaW5kZXggMzMyODc4Ny4uNzMyMmRhNCAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNhY2wuYworKysgYi9mcy9uZnMvbmZzM2FjbC5jCkBAIC0xNzIsOCArMTcyLDEwIEBACiAJCWlub2RlLT5pX2lubywgYWNsLCBkZmFjbCk7CiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAlfX25mczNfZm9yZ2V0X2NhY2hlZF9hY2xzKE5GU19JKGlub2RlKSk7Ci0JbmZzaS0+YWNsX2FjY2VzcyA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKLQluZnNpLT5hY2xfZGVmYXVsdCA9IHBvc2l4X2FjbF9kdXAoZGZhY2wpOworCWlmICghSVNfRVJSKGFjbCkpCisJCW5mc2ktPmFjbF9hY2Nlc3MgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJaWYgKCFJU19FUlIoZGZhY2wpKQorCQluZnNpLT5hY2xfZGVmYXVsdCA9IHBvc2l4X2FjbF9kdXAoZGZhY2wpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIH0KIApAQCAtMjU0LDcgKzI1Niw5IEBACiAJCQlyZXMuYWNsX2FjY2VzcyA9IE5VTEw7CiAJCX0KIAl9Ci0JbmZzM19jYWNoZV9hY2xzKGlub2RlLCByZXMuYWNsX2FjY2VzcywgcmVzLmFjbF9kZWZhdWx0KTsKKwluZnMzX2NhY2hlX2FjbHMoaW5vZGUsCisJCShyZXMubWFzayAmIE5GU19BQ0wpICAgPyByZXMuYWNsX2FjY2VzcyAgOiBFUlJfUFRSKC1FSU5WQUwpLAorCQkocmVzLm1hc2sgJiBORlNfREZBQ0wpID8gcmVzLmFjbF9kZWZhdWx0IDogRVJSX1BUUigtRUlOVkFMKSk7CiAKIAlzd2l0Y2godHlwZSkgewogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKQEAgLTMyOSw2ICszMzMsNyBAQAogCXN3aXRjaCAoc3RhdHVzKSB7CiAJCWNhc2UgMDoKIAkJCXN0YXR1cyA9IG5mc19yZWZyZXNoX2lub2RlKGlub2RlLCAmZmF0dHIpOworCQkJbmZzM19jYWNoZV9hY2xzKGlub2RlLCBhY2wsIGRmYWNsKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FUEZOT1NVUFBPUlQ6CiAJCWNhc2UgLUVQUk9UT05PU1VQUE9SVDoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMzcHJvYy5jIGIvZnMvbmZzL25mczNwcm9jLmMKaW5kZXggY2YxODZmMC4uNzE0M2IxZiAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczNwcm9jLmMKKysrIGIvZnMvbmZzL25mczNwcm9jLmMKQEAgLTIwLDExICsyMCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgogCiAjaW5jbHVkZSAiaW9zdGF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QUk9DCiAKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczNfcHJvY2VkdXJlc1tdOwotCiAvKiBBIHdyYXBwZXIgdG8gaGFuZGxlIHRoZSBFSlVLRUJPWCBlcnJvciBtZXNzYWdlICovCiBzdGF0aWMgaW50CiBuZnMzX3JwY193cmFwcGVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IHJwY19tZXNzYWdlICptc2csIGludCBmbGFncykKQEAgLTgwOSw4ICs4MDgsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLWV4dGVybiB1MzIgKm5mczNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwotCiBzdGF0aWMgaW50IG5mczNfcmVhZF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCiB7CiAJaWYgKG5mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3godGFzaywgZGF0YS0+aW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczN4ZHIuYyBiL2ZzL25mcy9uZnMzeGRyLmMKaW5kZXggZWMyMzM2MS4uMDI1MDI2OSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczN4ZHIuYworKysgYi9mcy9uZnMvbmZzM3hkci5jCkBAIC0yMiwxNCArMjIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzYWNsLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19YRFIKIAogLyogTWFwcGluZyBmcm9tIE5GUyBlcnJvciBjb2RlIHRvICJlcnJubyIgZXJyb3IgY29kZS4gKi8KICNkZWZpbmUgZXJybm9fTkZTRVJSX0lPCQlFSU8KIAotZXh0ZXJuIGludAkJCW5mc19zdGF0X3RvX2Vycm5vKGludCk7Ci0KIC8qCiAgKiBEZWNsYXJlIHRoZSBzcGFjZSByZXF1aXJlbWVudHMgZm9yIE5GUyBhcmd1bWVudHMgYW5kIHJlcGxpZXMgYXMKICAqIG51bWJlciBvZiAzMmJpdC13b3JkcwpAQCAtMTY2LDcgKzE2NSw4IEBACiAJaWYgKE1BSk9SKGZhdHRyLT5yZGV2KSAhPSBtYWpvciB8fCBNSU5PUihmYXR0ci0+cmRldikgIT0gbWlub3IpCiAJCWZhdHRyLT5yZGV2ID0gMDsKIAotCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZnNpZF91Lm5mczMpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZnNpZC5tYWpvcik7CisJZmF0dHItPmZzaWQubWlub3IgPSAwOwogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZmlsZWlkKTsKIAlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPmF0aW1lKTsKIAlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPm10aW1lKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0X2ZzLmggYi9mcy9uZnMvbmZzNF9mcy5oCmluZGV4IDBmNWU0ZTcuLjlhMTAyODYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0X2ZzLmgKKysrIGIvZnMvbmZzL25mczRfZnMuaApAQCAtMjE3LDYgKzIxNyw5IEBACiBleHRlcm4gaW50IG5mczRfZG9fY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKTsKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpuZnM0X2F0b21pY19vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CiBleHRlcm4gaW50IG5mczRfb3Blbl9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpOworZXh0ZXJuIGludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKIGV4dGVybiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzOwogZXh0ZXJuIHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X25ldHdvcmtfcGFydGl0aW9uX3JlY292ZXJ5X29wczsKQEAgLTIyNSw2ICsyMjgsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X3N0YXRmc19iaXRtYXBbMl07CiBleHRlcm4gY29uc3QgdTMyIG5mczRfcGF0aGNvbmZfYml0bWFwWzJdOwogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZzaW5mb19iaXRtYXBbMl07CitleHRlcm4gY29uc3QgdTMyIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsyXTsKIAogLyogbmZzNHJlbmV3ZC5jICovCiBleHRlcm4gdm9pZCBuZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoc3RydWN0IG5mczRfY2xpZW50ICopOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRuYW1lc3BhY2UuYyBiL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzOGQyNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnM0bmFtZXNwYWNlLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvbmZzNG5hbWVzcGFjZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20+CisgKgorICogTkZTdjQgbmFtZXNwYWNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5ldC5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfVkZTCisKKy8qCisgKiBDaGVjayBpZiBmc19yb290IGlzIHZhbGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqbmZzNF9wYXRobmFtZV9zdHJpbmcoc3RydWN0IG5mczRfcGF0aG5hbWUgKnBhdGhuYW1lLAorCQkJCQkgY2hhciAqYnVmZmVyLCBzc2l6ZV90IGJ1ZmxlbikKK3sKKwljaGFyICplbmQgPSBidWZmZXIgKyBidWZsZW47CisJaW50IG47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCisJbiA9IHBhdGhuYW1lLT5uY29tcG9uZW50czsKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJc3RydWN0IG5mczRfc3RyaW5nICpjb21wb25lbnQgPSAmcGF0aG5hbWUtPmNvbXBvbmVudHNbbl07CisJCWJ1ZmxlbiAtPSBjb21wb25lbnQtPmxlbiArIDE7CisJCWlmIChidWZsZW4gPCAwKQorCQkJZ290byBFbG9uZzsKKwkJZW5kIC09IGNvbXBvbmVudC0+bGVuOworCQltZW1jcHkoZW5kLCBjb21wb25lbnQtPmRhdGEsIGNvbXBvbmVudC0+bGVuKTsKKwkJKi0tZW5kID0gJy8nOworCX0KKwlyZXR1cm4gZW5kOworRWxvbmc6CisJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Cit9CisKKworLyoqCisgKiBuZnNfZm9sbG93X3JlZmVycmFsIC0gc2V0IHVwIG1vdW50cG9pbnQgd2hlbiBoaXR0aW5nIGEgcmVmZXJyYWwgb24gbW92ZWQgZXJyb3IKKyAqIEBtbnRfcGFyZW50IC0gbW91bnRwb2ludCBvZiBwYXJlbnQgZGlyZWN0b3J5CisgKiBAZGVudHJ5IC0gcGFyZW50IGRpcmVjdG9yeQorICogQGZzcGF0aCAtIGZzIHBhdGggcmV0dXJuZWQgaW4gZnNfbG9jYXRpb25zCisgKiBAbW50cGF0aCAtIG1vdW50IHBhdGggdG8gbmV3IHNlcnZlcgorICogQGhvc3RuYW1lIC0gaG9zdG5hbWUgb2YgbmV3IHNlcnZlcgorICogQGFkZHIgLSBob3N0IGFkZHIgb2YgbmV3IHNlcnZlcgorICoKKyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqbmZzX2ZvbGxvd19yZWZlcnJhbChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCSAgICBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKmxvY2F0aW9ucykKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJc3RydWN0IG5mc19jbG9uZV9tb3VudCBtb3VudGRhdGEgPSB7CisJCS5zYiA9IG1udF9wYXJlbnQtPm1udF9zYiwKKwkJLmRlbnRyeSA9IGRlbnRyeSwKKwkJLmF1dGhmbGF2b3IgPSBORlNfU0IobW50X3BhcmVudC0+bW50X3NiKS0+Y2xpZW50LT5jbF9hdXRoLT5hdV9mbGF2b3IsCisJfTsKKwljaGFyICpwYWdlLCAqcGFnZTI7CisJY2hhciAqcGF0aCwgKmZzX3BhdGg7CisJY2hhciAqZGV2bmFtZTsKKwlpbnQgbG9jLCBzOworCisJaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGxvY2F0aW9ucy0+bmxvY2F0aW9ucyA8PSAwKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoIiVzOiByZWZlcnJhbCBhdCAlcy8lc1xuIiwgX19GVU5DVElPTl9fLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBFbnN1cmUgZnMgcGF0aCBpcyBhIHByZWZpeCBvZiBjdXJyZW50IGRlbnRyeSBwYXRoICovCisJcGFnZSA9IChjaGFyICopIF9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJcGFnZTIgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOworCWlmIChwYWdlMiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXBhdGggPSBuZnM0X3BhdGgoZGVudHJ5LCBwYWdlLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIocGF0aCkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlmc19wYXRoID0gbmZzNF9wYXRobmFtZV9zdHJpbmcoJmxvY2F0aW9ucy0+ZnNfcGF0aCwgcGFnZTIsIFBBR0VfU0laRSk7CisJaWYgKElTX0VSUihmc19wYXRoKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChzdHJuY21wKHBhdGgsIGZzX3BhdGgsIHN0cmxlbihmc19wYXRoKSkgIT0gMCkgeworCQlkcHJpbnRrKCIlczogcGF0aCAlcyBkb2VzIG5vdCBiZWdpbiB3aXRoIGZzcm9vdCAlc1xuIiwgX19GVU5DVElPTl9fLCBwYXRoLCBmc19wYXRoKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlkZXZuYW1lID0gbmZzX2Rldm5hbWUobW50X3BhcmVudCwgZGVudHJ5LCBwYWdlLCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIoZGV2bmFtZSkpIHsKKwkJbW50ID0gKHN0cnVjdCB2ZnNtb3VudCAqKWRldm5hbWU7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJbG9jID0gMDsKKwl3aGlsZSAobG9jIDwgbG9jYXRpb25zLT5ubG9jYXRpb25zICYmIElTX0VSUihtbnQpKSB7CisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uICpsb2NhdGlvbiA9ICZsb2NhdGlvbnMtPmxvY2F0aW9uc1tsb2NdOworCQljaGFyICptbnRfcGF0aDsKKworCQlpZiAobG9jYXRpb24gPT0gTlVMTCB8fCBsb2NhdGlvbi0+bnNlcnZlcnMgPD0gMCB8fAorCQkgICAgbG9jYXRpb24tPnJvb3RwYXRoLm5jb21wb25lbnRzID09IDApIHsKKwkJCWxvYysrOworCQkJY29udGludWU7CisJCX0KKworCQltbnRfcGF0aCA9IG5mczRfcGF0aG5hbWVfc3RyaW5nKCZsb2NhdGlvbi0+cm9vdHBhdGgsIHBhZ2UyLCBQQUdFX1NJWkUpOworCQlpZiAoSVNfRVJSKG1udF9wYXRoKSkgeworCQkJbG9jKys7CisJCQljb250aW51ZTsKKwkJfQorCQltb3VudGRhdGEubW50X3BhdGggPSBtbnRfcGF0aDsKKworCQlzID0gMDsKKwkJd2hpbGUgKHMgPCBsb2NhdGlvbi0+bnNlcnZlcnMpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyID0ge307CisKKwkJCWlmIChsb2NhdGlvbi0+c2VydmVyc1tzXS5sZW4gPD0gMCB8fAorCQkJICAgIHZhbGlkX2lwYWRkcjQobG9jYXRpb24tPnNlcnZlcnNbc10uZGF0YSkgPCAwKSB7CisJCQkJcysrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQltb3VudGRhdGEuaG9zdG5hbWUgPSBsb2NhdGlvbi0+c2VydmVyc1tzXS5kYXRhOworCQkJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbl9hdG9uKG1vdW50ZGF0YS5ob3N0bmFtZSk7CisJCQlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJYWRkci5zaW5fcG9ydCA9IGh0b25zKE5GU19QT1JUKTsKKwkJCW1vdW50ZGF0YS5hZGRyID0gJmFkZHI7CisKKwkJCW1udCA9IHZmc19rZXJuX21vdW50KCZuZnNfcmVmZXJyYWxfbmZzNF9mc190eXBlLCAwLCBkZXZuYW1lLCAmbW91bnRkYXRhKTsKKwkJCWlmICghSVNfRVJSKG1udCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXMrKzsKKwkJfQorCQlsb2MrKzsKKwl9CisKK291dF9mcmVlOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZTIpOworb3V0OgorCWRwcmludGsoIiVzOiBkb25lXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiBtbnQ7Cit9CisKKy8qCisgKiBuZnNfZG9fcmVmbW91bnQgLSBoYW5kbGUgY3Jvc3NpbmcgYSByZWZlcnJhbCBvbiBzZXJ2ZXIKKyAqIEBkZW50cnkgLSBkZW50cnkgb2YgcmVmZXJyYWwKKyAqIEBuZCAtIG5hbWVpZGF0YSBpbmZvCisgKgorICovCitzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19yZWZtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZXJyOworCisJLyogQlVHX09OKElTX1JPT1QoZGVudHJ5KSk7ICovCisJZHByaW50aygiJXM6IGVudGVyXG4iLCBfX0ZVTkNUSU9OX18pOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlmc19sb2NhdGlvbnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZnNfbG9jYXRpb25zID09IE5VTEwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBHZXQgbG9jYXRpb25zICovCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlkcHJpbnRrKCIlczogZ2V0dGluZyBsb2NhdGlvbnMgZm9yICVzLyVzXG4iLCBfX0ZVTkNUSU9OX18sIHBhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWVyciA9IG5mczRfcHJvY19mc19sb2NhdGlvbnMocGFyZW50LT5kX2lub2RlLCBkZW50cnksIGZzX2xvY2F0aW9ucywgcGFnZSk7CisJZHB1dChwYXJlbnQpOworCWlmIChlcnIgIT0gMCB8fCBmc19sb2NhdGlvbnMtPm5sb2NhdGlvbnMgPD0gMCB8fAorCSAgICBmc19sb2NhdGlvbnMtPmZzX3BhdGgubmNvbXBvbmVudHMgPD0gMCkKKwkJZ290byBvdXRfZnJlZTsKKworCW1udCA9IG5mc19mb2xsb3dfcmVmZXJyYWwobW50X3BhcmVudCwgZGVudHJ5LCBmc19sb2NhdGlvbnMpOworb3V0X2ZyZWU6CisJX19mcmVlX3BhZ2UocGFnZSk7CisJa2ZyZWUoZnNfbG9jYXRpb25zKTsKK291dDoKKwlkcHJpbnRrKCIlczogZG9uZVxuIiwgX19GVU5DVElPTl9fKTsKKwlyZXR1cm4gbW50OworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBkODZjMGRiLi5iNDkxNmIwIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtNjUsOCArNjUsNiBAQAogc3RhdGljIGludCBfbmZzNF9wcm9jX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqZW50cnkpOwogc3RhdGljIGludCBuZnM0X2hhbmRsZV9leGNlcHRpb24oY29uc3Qgc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgaW50IGVycm9yY29kZSwgc3RydWN0IG5mczRfZXhjZXB0aW9uICpleGNlcHRpb24pOwogc3RhdGljIGludCBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mczRfY2xpZW50ICpjbHApOwotZXh0ZXJuIHUzMiAqbmZzNF9kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKTsKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mczRfcHJvY2VkdXJlc1tdOwogCiAvKiBQcmV2ZW50IGxlYWtzIG9mIE5GU3Y0IGVycm9ycyBpbnRvIHVzZXJsYW5kICovCiBpbnQgbmZzNF9tYXBfZXJyb3JzKGludCBlcnIpCkBAIC0xMjEsNiArMTE5LDI1IEBACiAJCQkwCiB9OwogCitjb25zdCB1MzIgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzJdID0geworCUZBVFRSNF9XT1JEMF9UWVBFCisJfCBGQVRUUjRfV09SRDBfQ0hBTkdFCisJfCBGQVRUUjRfV09SRDBfU0laRQorCXwgRkFUVFI0X1dPUkQwX0ZTSUQKKwl8IEZBVFRSNF9XT1JEMF9GSUxFSUQKKwl8IEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMsCisJRkFUVFI0X1dPUkQxX01PREUKKwl8IEZBVFRSNF9XT1JEMV9OVU1MSU5LUworCXwgRkFUVFI0X1dPUkQxX09XTkVSCisJfCBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVAKKwl8IEZBVFRSNF9XT1JEMV9SQVdERVYKKwl8IEZBVFRSNF9XT1JEMV9TUEFDRV9VU0VECisJfCBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1MKKwl8IEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBCisJfCBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkKKwl8IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRAorfTsKKwogc3RhdGljIHZvaWQgbmZzNF9zZXR1cF9yZWFkZGlyKHU2NCBjb29raWUsIHUzMiAqdmVyaWZpZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKIAkJc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIpCiB7CkBAIC0xODUsMTUgKzIwMiwxNSBAQAogCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCitzdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQogewotCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGRpcik7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCXNwaW5fbG9jaygmZGlyLT5pX2xvY2spOworCW5mc2ktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fUkVWQUxfUEFHRUNBQ0hFfE5GU19JTk9fSU5WQUxJRF9EQVRBOwogCWlmIChjaW5mby0+YmVmb3JlID09IG5mc2ktPmNoYW5nZV9hdHRyICYmIGNpbmZvLT5hdG9taWMpCiAJCW5mc2ktPmNoYW5nZV9hdHRyID0gY2luZm8tPmFmdGVyOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmZGlyLT5pX2xvY2spOwogfQogCiBzdHJ1Y3QgbmZzNF9vcGVuZGF0YSB7CkBAIC0xMzMxLDcgKzEzNDgsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCitpbnQgbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCiB7CiAJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKIAlpbnQgZXJyOwpAQCAtMTQ0Myw2ICsxNDYwLDUwIEBACiAJcmV0dXJuIG5mczRfbWFwX2Vycm9ycyhzdGF0dXMpOwogfQogCisvKgorICogR2V0IGxvY2F0aW9ucyBhbmQgKG1heWJlKSBvdGhlciBhdHRyaWJ1dGVzIG9mIGEgcmVmZXJyYWwuCisgKiBOb3RlIHRoYXQgd2UnbGwgYWN0dWFsbHkgZm9sbG93IHRoZSByZWZlcnJhbCBsYXRlciB3aGVuCisgKiB3ZSBkZXRlY3QgZnNpZCBtaXNtYXRjaCBpbiBpbm9kZSByZXZhbGlkYXRpb24KKyAqLworc3RhdGljIGludCBuZnM0X2dldF9yZWZlcnJhbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCWludCBzdGF0dXMgPSAtRU5PTUVNOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnMgKmxvY2F0aW9ucyA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSBkZW50cnkgPSB7fTsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYWdlID09IE5VTEwpCisJCWdvdG8gb3V0OworCWxvY2F0aW9ucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyksIEdGUF9LRVJORUwpOworCWlmIChsb2NhdGlvbnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlkZW50cnkuZF9uYW1lLm5hbWUgPSBuYW1lLT5uYW1lOworCWRlbnRyeS5kX25hbWUubGVuID0gbmFtZS0+bGVuOworCXN0YXR1cyA9IG5mczRfcHJvY19mc19sb2NhdGlvbnMoZGlyLCAmZGVudHJ5LCBsb2NhdGlvbnMsIHBhZ2UpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJLyogTWFrZSBzdXJlIHNlcnZlciByZXR1cm5lZCBhIGRpZmZlcmVudCBmc2lkIGZvciB0aGUgcmVmZXJyYWwgKi8KKwlpZiAobmZzX2ZzaWRfZXF1YWwoJk5GU19TRVJWRVIoZGlyKS0+ZnNpZCwgJmxvY2F0aW9ucy0+ZmF0dHIuZnNpZCkpIHsKKwkJZHByaW50aygiJXM6IHNlcnZlciBkaWQgbm90IHJldHVybiBhIGRpZmZlcmVudCBmc2lkIGZvciBhIHJlZmVycmFsIGF0ICVzXG4iLCBfX0ZVTkNUSU9OX18sIG5hbWUtPm5hbWUpOworCQlzdGF0dXMgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoZmF0dHIsICZsb2NhdGlvbnMtPmZhdHRyLCBzaXplb2Yoc3RydWN0IG5mc19mYXR0cikpOworCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUl9WNF9SRUZFUlJBTDsKKwlpZiAoIWZhdHRyLT5tb2RlKQorCQlmYXR0ci0+bW9kZSA9IFNfSUZESVI7CisJbWVtc2V0KGZoYW5kbGUsIDAsIHNpemVvZihzdHJ1Y3QgbmZzX2ZoKSk7CitvdXQ6CisJaWYgKHBhZ2UpCisJCV9fZnJlZV9wYWdlKHBhZ2UpOworCWlmIChsb2NhdGlvbnMpCisJCWtmcmVlKGxvY2F0aW9ucyk7CisJcmV0dXJuIHN0YXR1czsKK30KKwogc3RhdGljIGludCBfbmZzNF9wcm9jX2dldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCiB7CiAJc3RydWN0IG5mczRfZ2V0YXR0cl9hcmcgYXJncyA9IHsKQEAgLTE1NDcsNiArMTYwOCw4IEBACiAJCiAJZHByaW50aygiTkZTIGNhbGwgIGxvb2t1cCAlc1xuIiwgbmFtZS0+bmFtZSk7CiAJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfTU9WRUQpCisJCXN0YXR1cyA9IG5mczRfZ2V0X3JlZmVycmFsKGRpciwgbmFtZSwgZmF0dHIsIGZoYW5kbGUpOwogCWRwcmludGsoIk5GUyByZXBseSBsb29rdXA6ICVkXG4iLCBzdGF0dXMpOwogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0yMDA4LDcgKzIwNzEsNyBAQAogCWlmICghc3RhdHVzKSB7CiAJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJnJlcy5jaW5mbyk7CiAJCW5mc19wb3N0X29wX3VwZGF0ZV9pbm9kZShkaXIsIHJlcy5kaXJfYXR0cik7Ci0JCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCByZXMuZmF0dHIpOworCQluZnNfcG9zdF9vcF91cGRhdGVfaW5vZGUoaW5vZGUsIHJlcy5mYXR0cik7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1NzAsNiArMzYzMywzNiBAQAogCXJldHVybiBsZW47CiB9CiAKK2ludCBuZnM0X3Byb2NfZnNfbG9jYXRpb25zKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyAqZnNfbG9jYXRpb25zLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXUzMiBiaXRtYXNrWzJdID0geworCQlbMF0gPSBGQVRUUjRfV09SRDBfRlNJRCB8IEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMsCisJCVsxXSA9IEZBVFRSNF9XT1JEMV9NT1VOVEVEX09OX0ZJTEVJRCwKKwl9OworCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9uc19hcmcgYXJncyA9IHsKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkubmFtZSA9ICZkZW50cnktPmRfbmFtZSwKKwkJLnBhZ2UgPSBwYWdlLAorCQkuYml0bWFzayA9IGJpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfRlNfTE9DQVRJT05TXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9IGZzX2xvY2F0aW9ucywKKwl9OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlczogc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CisJZnNfbG9jYXRpb25zLT5mYXR0ci52YWxpZCA9IDA7CisJZnNfbG9jYXRpb25zLT5zZXJ2ZXIgPSBzZXJ2ZXI7CisJZnNfbG9jYXRpb25zLT5ubG9jYXRpb25zID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwlkcHJpbnRrKCIlczogcmV0dXJuZWQgc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgbmZzNF9yZWJvb3RfcmVjb3Zlcnlfb3BzID0gewogCS5yZWNvdmVyX29wZW4JPSBuZnM0X29wZW5fcmVjbGFpbSwKIAkucmVjb3Zlcl9sb2NrCT0gbmZzNF9sb2NrX3JlY2xhaW0sCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCA3YzVkNzBlLi4xNzUwZDk5IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTQxMSw2ICs0MTEsMTUgQEAKICNkZWZpbmUgTkZTNF9kZWNfc2V0YWNsX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAogCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKIAkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2ZzX2xvY2F0aW9uc19zeiBcCisJCQkJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQkgZW5jb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2ZzX2xvY2F0aW9uc19zeiBcCisJCQkJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJIGRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQkgb3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCiAKIHN0YXRpYyBzdHJ1Y3QgewogCXVuc2lnbmVkIGludAltb2RlOwpAQCAtNzIyLDYgKzczMSwxMyBAQAogCQkJYml0bWFza1sxXSAmIG5mczRfZnNpbmZvX2JpdG1hcFsxXSk7CiB9CiAKK3N0YXRpYyBpbnQgZW5jb2RlX2ZzX2xvY2F0aW9ucyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1MzIqIGJpdG1hc2spCit7CisJcmV0dXJuIGVuY29kZV9nZXRhdHRyX3R3byh4ZHIsCisJCQkJICBiaXRtYXNrWzBdICYgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzBdLAorCQkJCSAgYml0bWFza1sxXSAmIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsxXSk7Cit9CisKIHN0YXRpYyBpbnQgZW5jb2RlX2dldGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCiB7CiAJdWludDMyX3QgKnA7CkBAIC0yMDAzLDYgKzIwMTksMzggQEAKIH0KIAogLyoKKyAqIEVuY29kZSBGU19MT0NBVElPTlMgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19mc19sb2NhdGlvbnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbnNfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAzLAorCX07CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCWludCByZXBsZW47CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCkpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX2xvb2t1cCgmeGRyLCBhcmdzLT5uYW1lKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfZnNfbG9jYXRpb25zKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spKSAhPSAwKQorCQlnb3RvIG91dDsKKwkvKiBzZXQgdXAgcmVwbHkKKwkgKiAgIHRvcGxldmVsX3N0YXR1cyArIE9QX1BVVEZIICsgc3RhdHVzCisJICogICArIE9QX0xPT0tVUCArIHN0YXR1cyArIE9QX0dFVEFUVFIgKyBzdGF0dXMgPSA3CisJICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgNykgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgJmFyZ3MtPnBhZ2UsCisJCQkwLCBQQUdFX1NJWkUpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCiAgKiBTVEFSVCBPRiAiR0VORVJJQyIgREVDT0RFIFJPVVRJTkVTLgogICogICBUaGVzZSBtYXkgbG9vayBhIGxpdHRsZSB1Z2x5IHNpbmNlIHRoZXkgYXJlIGltcG9ydGVkIGZyb20gYSAiZ2VuZXJpYyIKICAqIHNldCBvZiBYRFIgZW5jb2RlL2RlY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CkBAIC0yMDM2LDcgKzIwODQsNyBAQAogCX0gXAogfSB3aGlsZSAoMCkKIAotc3RhdGljIGludCBkZWNvZGVfb3BhcXVlX2lubGluZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqbGVuLCBjaGFyICoqc3RyaW5nKQorc3RhdGljIGludCBkZWNvZGVfb3BhcXVlX2lubGluZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgKmxlbiwgY2hhciAqKnN0cmluZykKIHsKIAl1aW50MzJfdCAqcDsKIApAQCAtMjA4Nyw3ICsyMTM1LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX2FjZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB2b2lkICphY2UsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQogewogCXVpbnQzMl90ICpwOwotCXVpbnQzMl90IHN0cmxlbjsKKwl1bnNpZ25lZCBpbnQgc3RybGVuOwogCWNoYXIgKnN0cjsKIAogCVJFQURfQlVGKDEyKTsKQEAgLTIyMTcsNyArMjI2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZnNpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgbmZzNF9mc2lkICpmc2lkKQorc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnNfZnNpZCAqZnNpZCkKIHsKIAl1aW50MzJfdCAqcDsKIApAQCAtMjI4NSw2ICsyMzMzLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbW91bnRlZF9vbl9maWxlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmZpbGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCSpmaWxlaWQgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKmZpbGVpZCk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEOworCX0KKwlkcHJpbnRrKCIlczogZmlsZWlkPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpmaWxlaWQpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVzX2F2YWlsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCiB7CiAJdWludDMyX3QgKnA7CkBAIC0yMzM2LDYgKzI0MDAsMTE2IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfcGF0aG5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfcGF0aG5hbWUgKnBhdGgpCit7CisJaW50IG47CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIobik7CisJaWYgKG4gPCAwKQorCQlnb3RvIG91dF9laW87CisJaWYgKG4gPT0gMCkKKwkJZ290byByb290X3BhdGg7CisJZHByaW50aygicGF0aCAiKTsKKwlwYXRoLT5uY29tcG9uZW50cyA9IDA7CisJd2hpbGUgKHBhdGgtPm5jb21wb25lbnRzIDwgbikgeworCQlzdHJ1Y3QgbmZzNF9zdHJpbmcgKmNvbXBvbmVudCA9ICZwYXRoLT5jb21wb25lbnRzW3BhdGgtPm5jb21wb25lbnRzXTsKKwkJc3RhdHVzID0gZGVjb2RlX29wYXF1ZV9pbmxpbmUoeGRyLCAmY29tcG9uZW50LT5sZW4sICZjb21wb25lbnQtPmRhdGEpOworCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJZ290byBvdXRfZWlvOworCQlpZiAocGF0aC0+bmNvbXBvbmVudHMgIT0gbikKKwkJCWRwcmludGsoIi8iKTsKKwkJZHByaW50aygiJXMiLCBjb21wb25lbnQtPmRhdGEpOworCQlpZiAocGF0aC0+bmNvbXBvbmVudHMgPCBORlM0X1BBVEhOQU1FX01BWENPTVBPTkVOVFMpCisJCQlwYXRoLT5uY29tcG9uZW50cysrOworCQllbHNlIHsKKwkJCWRwcmludGsoImNhbm5vdCBwYXJzZSAlZCBjb21wb25lbnRzIGluIHBhdGhcbiIsIG4pOworCQkJZ290byBvdXRfZWlvOworCQl9CisJfQorb3V0OgorCWRwcmludGsoIlxuIik7CisJcmV0dXJuIHN0YXR1czsKK3Jvb3RfcGF0aDoKKy8qIGEgcm9vdCBwYXRobmFtZSBpcyBzZW50IGFzIGEgemVybyBjb21wb25lbnQ0ICovCisJcGF0aC0+bmNvbXBvbmVudHMgPSAxOworCXBhdGgtPmNvbXBvbmVudHNbMF0ubGVuPTA7CisJcGF0aC0+Y29tcG9uZW50c1swXS5kYXRhPU5VTEw7CisJZHByaW50aygicGF0aCAvXG4iKTsKKwlnb3RvIG91dDsKK291dF9laW86CisJZHByaW50aygiIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisJc3RhdHVzID0gLUVJTzsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc19sb2NhdGlvbnMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpyZXMpCit7CisJaW50IG47CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IC1FSU87CisKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GU19MT0NBVElPTlMgLTFVKSkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IDA7CisJaWYgKHVubGlrZWx5KCEoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0ZTX0xPQ0FUSU9OUykpKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCIlczogZnNyb290ICIsIF9fRlVOQ1RJT05fXyk7CisJc3RhdHVzID0gZGVjb2RlX3BhdGhuYW1lKHhkciwgJnJlcy0+ZnNfcGF0aCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKG4pOworCWlmIChuIDw9IDApCisJCWdvdG8gb3V0X2VpbzsKKwlyZXMtPm5sb2NhdGlvbnMgPSAwOworCXdoaWxlIChyZXMtPm5sb2NhdGlvbnMgPCBuKSB7CisJCWludCBtOworCQlzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbiAqbG9jID0gJnJlcy0+bG9jYXRpb25zW3Jlcy0+bmxvY2F0aW9uc107CisKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihtKTsKKwkJaWYgKG0gPD0gMCkKKwkJCWdvdG8gb3V0X2VpbzsKKworCQlsb2MtPm5zZXJ2ZXJzID0gMDsKKwkJZHByaW50aygiJXM6IHNlcnZlcnMgIiwgX19GVU5DVElPTl9fKTsKKwkJd2hpbGUgKGxvYy0+bnNlcnZlcnMgPCBtKSB7CisJCQlzdHJ1Y3QgbmZzNF9zdHJpbmcgKnNlcnZlciA9ICZsb2MtPnNlcnZlcnNbbG9jLT5uc2VydmVyc107CisJCQlzdGF0dXMgPSBkZWNvZGVfb3BhcXVlX2lubGluZSh4ZHIsICZzZXJ2ZXItPmxlbiwgJnNlcnZlci0+ZGF0YSk7CisJCQlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQkJCWdvdG8gb3V0X2VpbzsKKwkJCWRwcmludGsoIiVzICIsIHNlcnZlci0+ZGF0YSk7CisJCQlpZiAobG9jLT5uc2VydmVycyA8IE5GUzRfRlNfTE9DQVRJT05fTUFYU0VSVkVSUykKKwkJCQlsb2MtPm5zZXJ2ZXJzKys7CisJCQllbHNlIHsKKwkJCQlpbnQgaTsKKwkJCQlkcHJpbnRrKCIlczogdXNpbmcgZmlyc3QgJWQgb2YgJWQgc2VydmVycyByZXR1cm5lZCBmb3IgbG9jYXRpb24gJWRcbiIsIF9fRlVOQ1RJT05fXywgTkZTNF9GU19MT0NBVElPTl9NQVhTRVJWRVJTLCBtLCByZXMtPm5sb2NhdGlvbnMpOworCQkJCWZvciAoaSA9IGxvYy0+bnNlcnZlcnM7IGkgPCBtOyBpKyspIHsKKwkJCQkJaW50IGxlbjsKKwkJCQkJY2hhciAqZGF0YTsKKwkJCQkJc3RhdHVzID0gZGVjb2RlX29wYXF1ZV9pbmxpbmUoeGRyLCAmbGVuLCAmZGF0YSk7CisJCQkJCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCQkJCQlnb3RvIG91dF9laW87CisJCQkJfQorCQkJfQorCQl9CisJCXN0YXR1cyA9IGRlY29kZV9wYXRobmFtZSh4ZHIsICZsb2MtPnJvb3RwYXRoKTsKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJCWdvdG8gb3V0X2VpbzsKKwkJaWYgKHJlcy0+bmxvY2F0aW9ucyA8IE5GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVMpCisJCQlyZXMtPm5sb2NhdGlvbnMrKzsKKwl9CitvdXQ6CisJZHByaW50aygiJXM6IGZzX2xvY2F0aW9ucyBkb25lLCBlcnJvciA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK291dF9laW86CisJc3RhdHVzID0gLUVJTzsKKwlnb3RvIG91dDsKK30KKwogc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhmaWxlc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQogewogCXVpbnQzMl90ICpwOwpAQCAtMjg0MSw2ICszMDE1LDcgQEAKIAkJIGJpdG1hcFsyXSA9IHswfSwKIAkJIHR5cGU7CiAJaW50IHN0YXR1cywgZm1vZGUgPSAwOworCXVpbnQ2NF90IGZpbGVpZDsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKQEAgLTI4NjMsMTAgKzMwMzgsMTQgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zaXplKHhkciwgYml0bWFwLCAmZmF0dHItPnNpemUpKSAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKLQlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZzaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZnNpZF91Lm5mczQpKSAhPSAwKQorCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfZnNpZCh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5mc2lkKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9maWxlaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZmlsZWlkKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9mc19sb2NhdGlvbnMoeGRyLCBiaXRtYXAsIGNvbnRhaW5lcl9vZihmYXR0ciwKKwkJCQkJCXN0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucywKKwkJCQkJCWZhdHRyKSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOwogCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbW9kZSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5tb2RlKSkgIT0gMCkKIAkJZ290byB4ZHJfZXJyb3I7CiAJZmF0dHItPm1vZGUgfD0gZm1vZGU7CkBAIC0yODg2LDYgKzMwNjUsMTAgQEAKIAkJZ290byB4ZHJfZXJyb3I7CiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl90aW1lX21vZGlmeSh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5tdGltZSkpICE9IDApCiAJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbW91bnRlZF9vbl9maWxlaWQoeGRyLCBiaXRtYXAsICZmaWxlaWQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoZmF0dHItPmZpbGVpZCA9PSAwICYmIGZpbGVpZCAhPSAwKQorCQlmYXR0ci0+ZmlsZWlkID0gZmlsZWlkOwogCWlmICgoc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pKSA9PSAwKQogCQlmYXR0ci0+dmFsaWQgPSBORlNfQVRUUl9GQVRUUiB8IE5GU19BVFRSX0ZBVFRSX1YzIHwgTkZTX0FUVFJfRkFUVFJfVjQ7CiB4ZHJfZXJyb3I6CkBAIC0zMzUwLDggKzM1MzMsNyBAQAogCQkJCQlhdHRybGVuLCByZWN2ZCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoYXR0cmxlbiA8PSAqYWNsX2xlbikKLQkJCXhkcl9yZWFkX3BhZ2VzKHhkciwgYXR0cmxlbik7CisJCXhkcl9yZWFkX3BhZ2VzKHhkciwgYXR0cmxlbik7CiAJCSphY2xfbGVuID0gYXR0cmxlbjsKIAl9IGVsc2UKIAkJc3RhdHVzID0gLUVPUE5PVFNVUFA7CkBAIC00MjExLDYgKzQzOTMsMjkgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKgorICogRlNfTE9DQVRJT05TIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNfbG9jYXRpb25zKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfZnNfbG9jYXRpb25zICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9sb29rdXAoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCXhkcl9lbnRlcl9wYWdlKCZ4ZHIsIFBBR0VfU0laRSk7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsICZyZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKwogdWludDMyX3QgKm5mczRfZGVjb2RlX2RpcmVudCh1aW50MzJfdCAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQogewogCXVpbnQzMl90IGJpdG1hcFsyXSA9IHswfTsKQEAgLTQzODIsNiArNDU4Nyw3IEBACiAgIFBST0MoREVMRUdSRVRVUk4sCWVuY19kZWxlZ3JldHVybiwgZGVjX2RlbGVncmV0dXJuKSwKICAgUFJPQyhHRVRBQ0wsCQllbmNfZ2V0YWNsLAlkZWNfZ2V0YWNsKSwKICAgUFJPQyhTRVRBQ0wsCQllbmNfc2V0YWNsLAlkZWNfc2V0YWNsKSwKKyAgUFJPQyhGU19MT0NBVElPTlMsCWVuY19mc19sb2NhdGlvbnMsIGRlY19mc19sb2NhdGlvbnMpLAogfTsKIAogc3RydWN0IHJwY192ZXJzaW9uCQluZnNfdmVyc2lvbjQgPSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvcGFnZWxpc3QuYyBiL2ZzL25mcy9wYWdlbGlzdC5jCmluZGV4IDEwNmFjYTMuLmVmOTQyOTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wYWdlbGlzdC5jCisrKyBiL2ZzL25mcy9wYWdlbGlzdC5jCkBAIC0zMjUsNiArMzI1LDcgQEAKIAogLyoqCiAgKiBuZnNfc2Nhbl9saXN0IC0gU2NhbiBhIGxpc3QgZm9yIG1hdGNoaW5nIHJlcXVlc3RzCisgKiBAbmZzaTogTkZTIGlub2RlCiAgKiBAaGVhZDogT25lIG9mIHRoZSBORlMgaW5vZGUgcmVxdWVzdCBsaXN0cwogICogQGRzdDogRGVzdGluYXRpb24gbGlzdAogICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2NhbgpAQCAtMzM2LDE0ICszMzcsMTUgQEAKICAqIFRoZSByZXF1ZXN0cyBhcmUgKm5vdCogY2hlY2tlZCB0byBlbnN1cmUgdGhhdCB0aGV5IGZvcm0gYSBjb250aWd1b3VzIHNldC4KICAqIFlvdSBtdXN0IGJlIGhvbGRpbmcgdGhlIGlub2RlJ3MgcmVxX2xvY2sgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KICAqLwotaW50Ci1uZnNfc2Nhbl9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKLQkgICAgICB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK2ludCBuZnNfc2Nhbl9saXN0KHN0cnVjdCBuZnNfaW5vZGUgKm5mc2ksIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBsaXN0X2hlYWQgKmRzdCwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsCisJCXVuc2lnbmVkIGludCBucGFnZXMpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkqcG9zLCAqdG1wOwotCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKLQl1bnNpZ25lZCBsb25nCQlpZHhfZW5kOwotCWludAkJCXJlczsKKwlzdHJ1Y3QgbmZzX3BhZ2UgKnBndmVjW05GU19TQ0FOX01BWEVOVFJJRVNdOworCXN0cnVjdCBuZnNfcGFnZSAqcmVxOworCXVuc2lnbmVkIGxvbmcgaWR4X2VuZDsKKwlpbnQgZm91bmQsIGk7CisJaW50IHJlczsKIAogCXJlcyA9IDA7CiAJaWYgKG5wYWdlcyA9PSAwKQpAQCAtMzUxLDI1ICszNTMsMzIgQEAKIAllbHNlCiAJCWlkeF9lbmQgPSBpZHhfc3RhcnQgKyBucGFnZXMgLSAxOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCBoZWFkKSB7Ci0KLQkJcmVxID0gbmZzX2xpc3RfZW50cnkocG9zKTsKLQotCQlpZiAocmVxLT53Yl9pbmRleCA8IGlkeF9zdGFydCkKLQkJCWNvbnRpbnVlOwotCQlpZiAocmVxLT53Yl9pbmRleCA+IGlkeF9lbmQpCisJZm9yICg7OykgeworCQlmb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJm5mc2ktPm5mc19wYWdlX3RyZWUsCisJCQkJKHZvaWQgKiopJnBndmVjWzBdLCBpZHhfc3RhcnQsCisJCQkJTkZTX1NDQU5fTUFYRU5UUklFUyk7CisJCWlmIChmb3VuZCA8PSAwKQogCQkJYnJlYWs7CisJCWZvciAoaSA9IDA7IGkgPCBmb3VuZDsgaSsrKSB7CisJCQlyZXEgPSBwZ3ZlY1tpXTsKKwkJCWlmIChyZXEtPndiX2luZGV4ID4gaWR4X2VuZCkKKwkJCQlnb3RvIG91dDsKKwkJCWlkeF9zdGFydCA9IHJlcS0+d2JfaW5kZXggKyAxOworCQkJaWYgKHJlcS0+d2JfbGlzdF9oZWFkICE9IGhlYWQpCisJCQkJY29udGludWU7CisJCQlpZiAobmZzX3NldF9wYWdlX3dyaXRlYmFja19sb2NrZWQocmVxKSkgeworCQkJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCQkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCBkc3QpOworCQkJCXJlcysrOworCQkJfQorCQl9CiAKLQkJaWYgKCFuZnNfc2V0X3BhZ2Vfd3JpdGViYWNrX2xvY2tlZChyZXEpKQotCQkJY29udGludWU7Ci0JCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7Ci0JCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgZHN0KTsKLQkJcmVzKys7CiAJfQorb3V0OgogCXJldHVybiByZXM7CiB9CiAKLWludCBuZnNfaW5pdF9uZnNwYWdlY2FjaGUodm9pZCkKK2ludCBfX2luaXQgbmZzX2luaXRfbmZzcGFnZWNhY2hlKHZvaWQpCiB7CiAJbmZzX3BhZ2VfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19wYWdlIiwKIAkJCQkJICAgIHNpemVvZihzdHJ1Y3QgbmZzX3BhZ2UpLApAQCAtMzgxLDcgKzM5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgbmZzX2Rlc3Ryb3lfbmZzcGFnZWNhY2hlKHZvaWQpCit2b2lkIF9fZXhpdCBuZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUodm9pZCkKIHsKIAlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19wYWdlX2NhY2hlcCkpCiAJCXByaW50ayhLRVJOX0lORk8gIm5mc19wYWdlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwppbmRleCA5ZGQ4NWNhLi5iMzg5OWVhIDEwMDY0NAotLS0gYS9mcy9uZnMvcHJvYy5jCisrKyBiL2ZzL25mcy9wcm9jLmMKQEAgLTQ0LDExICs0NCwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QUk9DCiAKLWV4dGVybiBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG5mc19wcm9jZWR1cmVzW107Ci0KIC8qCiAgKiBCYXJlLWJvbmVzIGFjY2VzcyB0byBnZXRhdHRyOiB0aGlzIGlzIGZvciBuZnNfcmVhZF9zdXBlci4KICAqLwpAQCAtNjExLDggKzYxMCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWV4dGVybiB1MzIgKiBuZnNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwotCiBzdGF0aWMgaW50IG5mc19yZWFkX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrLCBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSkKIHsKIAlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKZGlmZiAtLWdpdCBhL2ZzL25mcy9yZWFkLmMgYi9mcy9uZnMvcmVhZC5jCmluZGV4IDYyNGNhNzEuLjQxYzJmZmUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9yZWFkLmMKKysrIGIvZnMvbmZzL3JlYWQuYwpAQCAtNTEsMTQgKzUxLDExIEBACiAJaWYgKHApIHsKIAkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOwogCQlJTklUX0xJU1RfSEVBRCgmcC0+cGFnZXMpOwotCQlpZiAocGFnZWNvdW50IDwgTkZTX1BBR0VWRUNfU0laRSkKLQkJCXAtPnBhZ2V2ZWMgPSAmcC0+cGFnZV9hcnJheVswXTsKKwkJaWYgKHBhZ2Vjb3VudCA8PSBBUlJBWV9TSVpFKHAtPnBhZ2VfYXJyYXkpKQorCQkJcC0+cGFnZXZlYyA9IHAtPnBhZ2VfYXJyYXk7CiAJCWVsc2UgewotCQkJc2l6ZV90IHNpemUgPSArK3BhZ2Vjb3VudCAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKLQkJCXAtPnBhZ2V2ZWMgPSBrbWFsbG9jKHNpemUsIEdGUF9OT0ZTKTsKLQkJCWlmIChwLT5wYWdldmVjKSB7Ci0JCQkJbWVtc2V0KHAtPnBhZ2V2ZWMsIDAsIHNpemUpOwotCQkJfSBlbHNlIHsKKwkJCXAtPnBhZ2V2ZWMgPSBrY2FsbG9jKHBhZ2Vjb3VudCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfTk9GUyk7CisJCQlpZiAoIXAtPnBhZ2V2ZWMpIHsKIAkJCQltZW1wb29sX2ZyZWUocCwgbmZzX3JkYXRhX21lbXBvb2wpOwogCQkJCXAgPSBOVUxMOwogCQkJfQpAQCAtMTA0LDYgKzEwMSwyOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCByZW1haW5kZXIgPSBkYXRhLT5hcmdzLmNvdW50IC0gZGF0YS0+cmVzLmNvdW50OworCXVuc2lnbmVkIGludCBiYXNlID0gZGF0YS0+YXJncy5wZ2Jhc2UgKyBkYXRhLT5yZXMuY291bnQ7CisJdW5zaWduZWQgaW50IHBnbGVuOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlpZiAoZGF0YS0+cmVzLmVvZiA9PSAwIHx8IHJlbWFpbmRlciA9PSAwKQorCQlyZXR1cm47CisJLyoKKwkgKiBOb3RlOiAicmVtYWluZGVyIiBjYW4gbmV2ZXIgYmUgbmVnYXRpdmUsIHNpbmNlIHdlIGNoZWNrIGZvcgorCSAqIAl0aGlzIGluIHRoZSBYRFIgY29kZS4KKwkgKi8KKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCXBnbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gYmFzZTsKKwlpZiAocGdsZW4gPCByZW1haW5kZXIpCisJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKCpwYWdlcywgYmFzZSwgcGdsZW4pOworCWVsc2UKKwkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2goKnBhZ2VzLCBiYXNlLCByZW1haW5kZXIpOworfQorCiAvKgogICogUmVhZCBhIHBhZ2Ugc3luY2hyb25vdXNseS4KICAqLwpAQCAtMTc3LDExICsxOTYsOSBAQAogCU5GU19JKGlub2RlKS0+Y2FjaGVfdmFsaWRpdHkgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAotCWlmIChjb3VudCkKLQkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgcmRhdGEtPmFyZ3MucGdiYXNlLCBjb3VudCk7Ci0JU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwotCWlmIChQYWdlRXJyb3IocGFnZSkpCi0JCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCW5mc19yZWFkcGFnZV90cnVuY2F0ZV91bmluaXRpYWxpc2VkX3BhZ2UocmRhdGEpOworCWlmIChyZGF0YS0+cmVzLmVvZiB8fCByZGF0YS0+cmVzLmNvdW50ID09IHJkYXRhLT5hcmdzLmNvdW50KQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAJcmVzdWx0ID0gMDsKIAogaW9fZXJyb3I6CkBAIC00MzYsMjAgKzQ1MywxMiBAQAogCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gZGF0YS0+cmVxOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcmVxLT53Yl9wYWdlOwogIAorCWlmIChsaWtlbHkodGFzay0+dGtfc3RhdHVzID49IDApKQorCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOworCWVsc2UKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOwogCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCiAJCXJldHVybjsKLQlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKLQkJdW5zaWduZWQgaW50IHJlcXVlc3QgPSBkYXRhLT5hcmdzLmNvdW50OwotCQl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZGF0YS0+cmVzLmNvdW50OwotCi0JCWlmIChyZXN1bHQgPCByZXF1ZXN0KSB7Ci0JCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLAotCQkJCQkJZGF0YS0+YXJncy5wZ2Jhc2UgKyByZXN1bHQsCi0JCQkJCQlyZXF1ZXN0IC0gcmVzdWx0KTsKLQkJfQotCX0gZWxzZQotCQlTZXRQYWdlRXJyb3IocGFnZSk7Ci0KIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT53Yl9jb21wbGV0ZSkpIHsKIAkJaWYgKCFQYWdlRXJyb3IocGFnZSkpCiAJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CkBAIC00NjIsNiArNDcxLDQwIEBACiAJLnJwY19yZWxlYXNlID0gbmZzX3JlYWRkYXRhX3JlbGVhc2UsCiB9OwogCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGludCBjb3VudCA9IGRhdGEtPnJlcy5jb3VudDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IGRhdGEtPmFyZ3MucGdiYXNlOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlpZiAodW5saWtlbHkoY291bnQgPT0gMCkpCisJCXJldHVybjsKKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWNvdW50ICs9IGJhc2U7CisJZm9yICg7Y291bnQgPj0gUEFHRV9DQUNIRV9TSVpFOyBjb3VudCAtPSBQQUdFX0NBQ0hFX1NJWkUsIHBhZ2VzKyspCisJCVNldFBhZ2VVcHRvZGF0ZSgqcGFnZXMpOworCS8qCisJICogV2FzIHRoaXMgYW4gZW9mIG9yIGEgc2hvcnQgcmVhZD8gSWYgdGhlIGxhdHRlciwgZG9uJ3QgbWFyayB0aGUgcGFnZQorCSAqIGFzIHVwdG9kYXRlIHlldC4KKwkgKi8KKwlpZiAoY291bnQgPiAwICYmIChkYXRhLT5yZXMuZW9mIHx8IGRhdGEtPmFyZ3MuY291bnQgPT0gZGF0YS0+cmVzLmNvdW50KSkKKwkJU2V0UGFnZVVwdG9kYXRlKCpwYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19yZWFkcGFnZV9zZXRfcGFnZXNfZXJyb3Ioc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gZGF0YS0+YXJncy5jb3VudDsKKwl1bnNpZ25lZCBpbnQgYmFzZSA9IGRhdGEtPmFyZ3MucGdiYXNlOworCXN0cnVjdCBwYWdlICoqcGFnZXM7CisKKwlwYWdlcyA9ICZkYXRhLT5hcmdzLnBhZ2VzW2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJYmFzZSAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWNvdW50ICs9IGJhc2U7CisJZm9yICg7Y291bnQgPj0gUEFHRV9DQUNIRV9TSVpFOyBjb3VudCAtPSBQQUdFX0NBQ0hFX1NJWkUsIHBhZ2VzKyspCisJCVNldFBhZ2VFcnJvcigqcGFnZXMpOworfQorCiAvKgogICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnJvbSBSUEMgdGVsbGluZyB1cyB3aGV0aGVyIGEgcmVwbHkgd2FzCiAgKiByZWNlaXZlZCBvciBzb21lIGVycm9yIG9jY3VycmVkICh0aW1lb3V0IG9yIHNvY2tldCBzaHV0ZG93bikuCkBAIC00NjksMjcgKzUxMiwyNCBAQAogc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3Jlc3VsdF9mdWxsKHN0cnVjdCBycGNfdGFzayAqdGFzaywgdm9pZCAqY2FsbGRhdGEpCiB7CiAJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEgPSBjYWxsZGF0YTsKLQl1bnNpZ25lZCBpbnQgY291bnQgPSBkYXRhLT5yZXMuY291bnQ7CiAKKwkvKgorCSAqIE5vdGU6IG5mc19yZWFkcGFnZV9yZXN1bHQgbWF5IGNoYW5nZSB0aGUgdmFsdWVzIG9mCisJICogZGF0YS0+YXJncy4gSW4gdGhlIG11bHRpLXBhZ2UgY2FzZSwgd2UgdGhlcmVmb3JlIG5lZWQKKwkgKiB0byBlbnN1cmUgdGhhdCB3ZSBjYWxsIHRoZSBuZXh0IG5mc19yZWFkcGFnZV9zZXRfcGFnZV91cHRvZGF0ZSgpCisJICogZmlyc3QgaW4gdGhlIG11bHRpLXBhZ2UgY2FzZS4KKwkgKi8KKwlpZiAobGlrZWx5KHRhc2stPnRrX3N0YXR1cyA+PSAwKSkgeworCQluZnNfcmVhZHBhZ2VfdHJ1bmNhdGVfdW5pbml0aWFsaXNlZF9wYWdlKGRhdGEpOworCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX3VwdG9kYXRlKGRhdGEpOworCX0gZWxzZQorCQluZnNfcmVhZHBhZ2Vfc2V0X3BhZ2VzX2Vycm9yKGRhdGEpOwogCWlmIChuZnNfcmVhZHBhZ2VfcmVzdWx0KHRhc2ssIGRhdGEpICE9IDApCiAJCXJldHVybjsKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmRhdGEtPnBhZ2VzKSkgewogCQlzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOwotCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+d2JfcGFnZTsKLQkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKIAotCQlpZiAodGFzay0+dGtfc3RhdHVzID49IDApIHsKLQkJCWlmIChjb3VudCA8IFBBR0VfQ0FDSEVfU0laRSkgewotCQkJCWlmIChjb3VudCA8IHJlcS0+d2JfYnl0ZXMpCi0JCQkJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsCi0JCQkJCQkJcmVxLT53Yl9wZ2Jhc2UgKyBjb3VudCwKLQkJCQkJCQlyZXEtPndiX2J5dGVzIC0gY291bnQpOwotCQkJCWNvdW50ID0gMDsKLQkJCX0gZWxzZQotCQkJCWNvdW50IC09IFBBR0VfQ0FDSEVfU0laRTsKLQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQkJfSBlbHNlCi0JCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CiAJCW5mc19yZWFkcGFnZV9yZWxlYXNlKHJlcSk7CiAJfQogfQpAQCAtNjU0LDcgKzY5NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IG5mc19pbml0X3JlYWRwYWdlY2FjaGUodm9pZCkKK2ludCBfX2luaXQgbmZzX2luaXRfcmVhZHBhZ2VjYWNoZSh2b2lkKQogewogCW5mc19yZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3JlYWRfZGF0YSIsCiAJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuZnNfcmVhZF9kYXRhKSwKQEAgLTY3MSw3ICs3MTEsNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCkKK3ZvaWQgX19leGl0IG5mc19kZXN0cm95X3JlYWRwYWdlY2FjaGUodm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX3JkYXRhX21lbXBvb2wpOwogCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX3JkYXRhX2NhY2hlcCkpCmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTliZWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvc3VwZXIuYwpAQCAtMCwwICsxLDE1MzcgQEAKKy8qCisgKiAgbGludXgvZnMvbmZzL3N1cGVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgbmZzIHN1cGVyYmxvY2sgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIE1vZHVsYXJpc2VkIGJ5IEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+LCB3aGlsZSBoYWNraW5nIHNvbWUKKyAqICBleHBlcmltZW50YWwgTkZTIGNoYW5nZXMuIE1vZHVsYXJpc2F0aW9uIHRha2VuIHN0cmFpZ2h0IGZyb20gU1lTNSBmcy4KKyAqCisgKiAgQ2hhbmdlIHRvIG5mc19yZWFkX3N1cGVyKCkgdG8gcGVybWl0IE5GUyBtb3VudHMgdG8gbXVsdGktaG9tZWQgaG9zdHMuCisgKiAgSi5TLlBlYXRmaWVsZEBkYW10cC5jYW0uYWMudWsKKyAqCisgKiAgU3BsaXQgZnJvbSBpbm9kZS5jIGJ5IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9tZXRyaWNzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3hkci5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJuZnM0X2ZzLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisjaW5jbHVkZSAiaW9zdGF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19WRlMKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVhZGFoZWFkIHJlcXVlc3RzCisgKiBGSVhNRTogdGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgc3lzY3RsIHNvIHRoYXQgdXNlcnMgbWF5IHR1bmUgaXQgdG8gc3VpdAorICogICAgICAgIHRoZWlyIG5lZWRzLiBQZW9wbGUgdGhhdCBkbyBORlMgb3ZlciBhIHNsb3cgbmV0d29yaywgbWlnaHQgZm9yCisgKiAgICAgICAgaW5zdGFuY2Ugd2FudCB0byByZWR1Y2UgaXQgdG8gc29tZXRoaW5nIGNsb3NlciB0byAxIGZvciBpbXByb3ZlZAorICogICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlLgorICovCisjZGVmaW5lIE5GU19NQVhfUkVBREFIRUFECShSUENfREVGX1NMT1RfVEFCTEUgLSAxKQorCisvKgorICogUlBDIGNydWZ0IGZvciBORlMKKyAqLworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqIG5mc192ZXJzaW9uW10gPSB7CisJTlVMTCwKKwlOVUxMLAorCSZuZnNfdmVyc2lvbjIsCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKQorCSZuZnNfdmVyc2lvbjMsCisjZWxpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJTlVMTCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkmbmZzX3ZlcnNpb240LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtIG5mc19wcm9ncmFtID0geworCS5uYW1lCQkJPSAibmZzIiwKKwkubnVtYmVyCQkJPSBORlNfUFJPR1JBTSwKKwkubnJ2ZXJzCQkJPSBBUlJBWV9TSVpFKG5mc192ZXJzaW9uKSwKKwkudmVyc2lvbgkJPSBuZnNfdmVyc2lvbiwKKwkuc3RhdHMJCQk9ICZuZnNfcnBjc3RhdCwKKwkucGlwZV9kaXJfbmFtZQkJPSAiL25mcyIsCit9OworCitzdHJ1Y3QgcnBjX3N0YXQgbmZzX3JwY3N0YXQgPSB7CisJLnByb2dyYW0JCT0gJm5mc19wcm9ncmFtCit9OworCisKKyNpZmRlZiBDT05GSUdfTkZTX1YzX0FDTAorc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmZzYWNsX3JwY3N0YXQgPSB7ICZuZnNhY2xfcHJvZ3JhbSB9Oworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5mc2FjbF92ZXJzaW9uW10gPSB7CisJWzNdCQkJPSAmbmZzYWNsX3ZlcnNpb24zLAorfTsKKworc3RydWN0IHJwY19wcm9ncmFtCQluZnNhY2xfcHJvZ3JhbSA9IHsKKwkubmFtZSA9CQkJIm5mc2FjbCIsCisJLm51bWJlciA9CQlORlNfQUNMX1BST0dSQU0sCisJLm5ydmVycyA9CQlBUlJBWV9TSVpFKG5mc2FjbF92ZXJzaW9uKSwKKwkudmVyc2lvbiA9CQluZnNhY2xfdmVyc2lvbiwKKwkuc3RhdHMgPQkJJm5mc2FjbF9ycGNzdGF0LAorfTsKKyNlbmRpZiAgLyogQ09ORklHX05GU19WM19BQ0wgKi8KKworc3RhdGljIHZvaWQgbmZzX3Vtb3VudF9iZWdpbihzdHJ1Y3QgdmZzbW91bnQgKiwgaW50KTsKK3N0YXRpYyBpbnQgIG5mc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgIG5mc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKK3N0YXRpYyBpbnQgIG5mc19zaG93X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CitzdGF0aWMgaW50IG5mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgaW50LCBjb25zdCBjaGFyICosIHZvaWQgKiwgc3RydWN0IHZmc21vdW50ICopOworc3RhdGljIGludCBuZnNfY2xvbmVfbmZzX3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJuZnMiLAorCS5nZXRfc2IJCT0gbmZzX2dldF9zYiwKKwkua2lsbF9zYgk9IG5mc19raWxsX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX09ERF9SRU5BTUV8RlNfUkVWQUxfRE9UfEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjbG9uZV9uZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mcyIsCisJLmdldF9zYgkJPSBuZnNfY2xvbmVfbmZzX3NiLAorCS5raWxsX3NiCT0gbmZzX2tpbGxfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBuZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBuZnNfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBuZnNfd3JpdGVfaW5vZGUsCisJLnN0YXRmcwkJPSBuZnNfc3RhdGZzLAorCS5jbGVhcl9pbm9kZQk9IG5mc19jbGVhcl9pbm9kZSwKKwkudW1vdW50X2JlZ2luCT0gbmZzX3Vtb3VudF9iZWdpbiwKKwkuc2hvd19vcHRpb25zCT0gbmZzX3Nob3dfb3B0aW9ucywKKwkuc2hvd19zdGF0cwk9IG5mc19zaG93X3N0YXRzLAorfTsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKK3N0YXRpYyBpbnQgbmZzNF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK3N0YXRpYyBpbnQgbmZzX2Nsb25lX25mczRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCk7CitzdGF0aWMgaW50IG5mc19yZWZlcnJhbF9uZnM0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHZvaWQgbmZzNF9raWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzNF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmZzNCIsCisJLmdldF9zYgkJPSBuZnM0X2dldF9zYiwKKwkua2lsbF9zYgk9IG5mczRfa2lsbF9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgY2xvbmVfbmZzNF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmZzNCIsCisJLmdldF9zYgkJPSBuZnNfY2xvbmVfbmZzNF9zYiwKKwkua2lsbF9zYgk9IG5mczRfa2lsbF9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19PRERfUkVOQU1FfEZTX1JFVkFMX0RPVHxGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX3JlZmVycmFsX25mczRfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mczQiLAorCS5nZXRfc2IJCT0gbmZzX3JlZmVycmFsX25mczRfc2IsCisJLmtpbGxfc2IJPSBuZnM0X2tpbGxfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnM0X3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gbmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbmZzX3dyaXRlX2lub2RlLAorCS5zdGF0ZnMJCT0gbmZzX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBuZnM0X2NsZWFyX2lub2RlLAorCS51bW91bnRfYmVnaW4JPSBuZnNfdW1vdW50X2JlZ2luLAorCS5zaG93X29wdGlvbnMJPSBuZnNfc2hvd19vcHRpb25zLAorCS5zaG93X3N0YXRzCT0gbmZzX3Nob3dfc3RhdHMsCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgY29uc3QgaW50IG5mc19zZXRfcG9ydF9taW4gPSAwOworc3RhdGljIGNvbnN0IGludCBuZnNfc2V0X3BvcnRfbWF4ID0gNjU1MzU7CisKK3N0YXRpYyBpbnQgcGFyYW1fc2V0X3BvcnQoY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3sKKwljaGFyICplbmRwOworCWludCBudW0gPSBzaW1wbGVfc3RydG9sKHZhbCwgJmVuZHAsIDApOworCWlmIChlbmRwID09IHZhbCB8fCAqZW5kcCB8fCBudW0gPCBuZnNfc2V0X3BvcnRfbWluIHx8IG51bSA+IG5mc19zZXRfcG9ydF9tYXgpCisJCXJldHVybiAtRUlOVkFMOworCSooKGludCAqKWtwLT5hcmcpID0gbnVtOworCXJldHVybiAwOworfQorCittb2R1bGVfcGFyYW1fY2FsbChjYWxsYmFja190Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKKwkJICZuZnNfY2FsbGJhY2tfc2V0X3RjcHBvcnQsIDA2NDQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CitzdGF0aWMgaW50IHBhcmFtX3NldF9pZG1hcF90aW1lb3V0KGNvbnN0IGNoYXIgKnZhbCwgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCit7CisJY2hhciAqZW5kcDsKKwlpbnQgbnVtID0gc2ltcGxlX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsKKwlpbnQgamlmID0gbnVtICogSFo7CisJaWYgKGVuZHAgPT0gdmFsIHx8ICplbmRwIHx8IG51bSA8IDAgfHwgamlmIDwgbnVtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqKChpbnQgKilrcC0+YXJnKSA9IGppZjsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX3BhcmFtX2NhbGwoaWRtYXBfY2FjaGVfdGltZW91dCwgcGFyYW1fc2V0X2lkbWFwX3RpbWVvdXQsIHBhcmFtX2dldF9pbnQsCisJCSAmbmZzX2lkbWFwX2NhY2hlX3RpbWVvdXQsIDA2NDQpOworI2VuZGlmCisKKy8qCisgKiBSZWdpc3RlciB0aGUgTkZTIGZpbGVzeXN0ZW1zCisgKi8KK2ludCBfX2luaXQgcmVnaXN0ZXJfbmZzX2ZzKHZvaWQpCit7CisJaW50IHJldDsKKworICAgICAgICByZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfMDsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKKwlyZXQgPSBuZnNfcmVnaXN0ZXJfc3lzY3RsKCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfMTsKKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yXzI7CisjZW5kaWYKKwlyZXR1cm4gMDsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKK2Vycm9yXzI6CisJbmZzX3VucmVnaXN0ZXJfc3lzY3RsKCk7CitlcnJvcl8xOgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmZzX2ZzX3R5cGUpOworI2VuZGlmCitlcnJvcl8wOgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBVbnJlZ2lzdGVyIHRoZSBORlMgZmlsZXN5c3RlbXMKKyAqLwordm9pZCBfX2V4aXQgdW5yZWdpc3Rlcl9uZnNfZnModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpOworCW5mc191bnJlZ2lzdGVyX3N5c2N0bCgpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7Cit9CisKKy8qCisgKiBEZWxpdmVyIGZpbGUgc3lzdGVtIHN0YXRpc3RpY3MgdG8gdXNlcnNwYWNlCisgKi8KK3N0YXRpYyBpbnQgbmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrYml0czsKKwl1bnNpZ25lZCBsb25nIGJsb2NrcmVzOworCXN0cnVjdCBuZnNfZmggKnJvb3RmaCA9IE5GU19GSChzYi0+c19yb290LT5kX2lub2RlKTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnNfZnNzdGF0IHJlcyA9IHsKKwkJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHNlcnZlci0+cnBjX29wcy0+c3RhdGZzKHNlcnZlciwgcm9vdGZoLCAmcmVzKTsKKwlidWYtPmZfdHlwZSA9IE5GU19TVVBFUl9NQUdJQzsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKgorCSAqIEN1cnJlbnQgdmVyc2lvbnMgb2YgZ2xpYmMgZG8gbm90IGNvcnJlY3RseSBoYW5kbGUgdGhlCisJICogY2FzZSB3aGVyZSBmX2Zyc2l6ZSAhPSBmX2JzaXplLiAgRXZlbnR1YWxseSB3ZSB3YW50IHRvCisJICogcmVwb3J0IHRoZSB2YWx1ZSBvZiB3dG11bHQgaW4gdGhpcyBmaWVsZC4KKwkgKi8KKwlidWYtPmZfZnJzaXplID0gc2ItPnNfYmxvY2tzaXplOworCisJLyoKKwkgKiBPbiBtb3N0ICpuaXggc3lzdGVtcywgZl9ibG9ja3MsIGZfYmZyZWUsIGFuZCBmX2JhdmFpbAorCSAqIGFyZSByZXBvcnRlZCBpbiB1bml0cyBvZiBmX2Zyc2l6ZS4gIExpbnV4IGhhc24ndCBoYWQKKwkgKiBhbiBmX2Zyc2l6ZSBmaWVsZCBpbiBpdHMgc3RhdGZzIHN0cnVjdCB1bnRpbCByZWNlbnRseSwKKwkgKiB0aHVzIGhpc3RvcmljYWxseSBMaW51eCdzIHN5c19zdGF0ZnMgcmVwb3J0cyB0aGVzZQorCSAqIGZpZWxkcyBpbiB1bml0cyBvZiBmX2JzaXplLgorCSAqLworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlibG9ja2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlibG9ja3JlcyA9ICgxIDw8IGJsb2NrYml0cykgLSAxOworCWJ1Zi0+Zl9ibG9ja3MgPSAocmVzLnRieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisJYnVmLT5mX2JmcmVlID0gKHJlcy5mYnl0ZXMgKyBibG9ja3JlcykgPj4gYmxvY2tiaXRzOworCWJ1Zi0+Zl9iYXZhaWwgPSAocmVzLmFieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisKKwlidWYtPmZfZmlsZXMgPSByZXMudGZpbGVzOworCWJ1Zi0+Zl9mZnJlZSA9IHJlcy5hZmlsZXM7CisKKwlidWYtPmZfbmFtZWxlbiA9IHNlcnZlci0+bmFtZWxlbjsKKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlkcHJpbnRrKCIlczogc3RhdGZzIGVycm9yID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgLWVycm9yKTsKKwlidWYtPmZfYnNpemUgPSBidWYtPmZfYmxvY2tzID0gYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IC0xOworCWdvdG8gb3V0OworCit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZnNfcHNldWRvZmxhdm91cl90b19uYW1lKHJwY19hdXRoZmxhdm9yX3QgZmxhdm91cikKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3VyOworCQljb25zdCBjaGFyICpzdHI7CisJfSBzZWNfZmxhdm91cnNbXSA9IHsKKwkJeyBSUENfQVVUSF9OVUxMLCAibnVsbCIgfSwKKwkJeyBSUENfQVVUSF9VTklYLCAic3lzIiB9LAorCQl7IFJQQ19BVVRIX0dTU19LUkI1LCAia3JiNSIgfSwKKwkJeyBSUENfQVVUSF9HU1NfS1JCNUksICJrcmI1aSIgfSwKKwkJeyBSUENfQVVUSF9HU1NfS1JCNVAsICJrcmI1cCIgfSwKKwkJeyBSUENfQVVUSF9HU1NfTEtFWSwgImxrZXkiIH0sCisJCXsgUlBDX0FVVEhfR1NTX0xLRVlJLCAibGtleWkiIH0sCisJCXsgUlBDX0FVVEhfR1NTX0xLRVlQLCAibGtleXAiIH0sCisJCXsgUlBDX0FVVEhfR1NTX1NQS00sICJzcGttIiB9LAorCQl7IFJQQ19BVVRIX0dTU19TUEtNSSwgInNwa21pIiB9LAorCQl7IFJQQ19BVVRIX0dTU19TUEtNUCwgInNwa21wIiB9LAorCQl7IC0xLCAidW5rbm93biIgfQorCX07CisJaW50IGk7CisKKwlmb3IgKGk9MDsgc2VjX2ZsYXZvdXJzW2ldLmZsYXZvdXIgIT0gLTE7IGkrKykgeworCQlpZiAoc2VjX2ZsYXZvdXJzW2ldLmZsYXZvdXIgPT0gZmxhdm91cikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gc2VjX2ZsYXZvdXJzW2ldLnN0cjsKK30KKworLyoKKyAqIERlc2NyaWJlIHRoZSBtb3VudCBvcHRpb25zIGluIGZvcmNlIG9uIHRoaXMgc2VydmVyIHJlcHJlc2VudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG5mc19zaG93X21vdW50X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcywgaW50IHNob3dkZWZhdWx0cykKK3sKKwlzdGF0aWMgc3RydWN0IHByb2NfbmZzX2luZm8geworCQlpbnQgZmxhZzsKKwkJY2hhciAqc3RyOworCQljaGFyICpub3N0cjsKKwl9IG5mc19pbmZvW10gPSB7CisJCXsgTkZTX01PVU5UX1NPRlQsICIsc29mdCIsICIsaGFyZCIgfSwKKwkJeyBORlNfTU9VTlRfSU5UUiwgIixpbnRyIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfTk9DVE8sICIsbm9jdG8iLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT0FDLCAiLG5vYWMiLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT05MTSwgIixub2xvY2siLCAiIiB9LAorCQl7IE5GU19NT1VOVF9OT0FDTCwgIixub2FjbCIsICIiIH0sCisJCXsgMCwgTlVMTCwgTlVMTCB9CisJfTsKKwlzdHJ1Y3QgcHJvY19uZnNfaW5mbyAqbmZzX2luZm9wOworCWNoYXIgYnVmWzEyXTsKKwljaGFyICpwcm90bzsKKworCXNlcV9wcmludGYobSwgIix2ZXJzPSVkIiwgbmZzcy0+cnBjX29wcy0+dmVyc2lvbik7CisJc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgbmZzcy0+cnNpemUpOworCXNlcV9wcmludGYobSwgIix3c2l6ZT0lZCIsIG5mc3MtPndzaXplKTsKKwlpZiAobmZzcy0+YWNyZWdtaW4gIT0gMypIWiB8fCBzaG93ZGVmYXVsdHMpCisJCXNlcV9wcmludGYobSwgIixhY3JlZ21pbj0lZCIsIG5mc3MtPmFjcmVnbWluL0haKTsKKwlpZiAobmZzcy0+YWNyZWdtYXggIT0gNjAqSFogfHwgc2hvd2RlZmF1bHRzKQorCQlzZXFfcHJpbnRmKG0sICIsYWNyZWdtYXg9JWQiLCBuZnNzLT5hY3JlZ21heC9IWik7CisJaWYgKG5mc3MtPmFjZGlybWluICE9IDMwKkhaIHx8IHNob3dkZWZhdWx0cykKKwkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWluPSVkIiwgbmZzcy0+YWNkaXJtaW4vSFopOworCWlmIChuZnNzLT5hY2Rpcm1heCAhPSA2MCpIWiB8fCBzaG93ZGVmYXVsdHMpCisJCXNlcV9wcmludGYobSwgIixhY2Rpcm1heD0lZCIsIG5mc3MtPmFjZGlybWF4L0haKTsKKwlmb3IgKG5mc19pbmZvcCA9IG5mc19pbmZvOyBuZnNfaW5mb3AtPmZsYWc7IG5mc19pbmZvcCsrKSB7CisJCWlmIChuZnNzLT5mbGFncyAmIG5mc19pbmZvcC0+ZmxhZykKKwkJCXNlcV9wdXRzKG0sIG5mc19pbmZvcC0+c3RyKTsKKwkJZWxzZQorCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5ub3N0cik7CisJfQorCXN3aXRjaCAobmZzcy0+Y2xpZW50LT5jbF94cHJ0LT5wcm90KSB7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQlwcm90byA9ICJ0Y3AiOworCQkJYnJlYWs7CisJCWNhc2UgSVBQUk9UT19VRFA6CisJCQlwcm90byA9ICJ1ZHAiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXUiLCBuZnNzLT5jbGllbnQtPmNsX3hwcnQtPnByb3QpOworCQkJcHJvdG8gPSBidWY7CisJfQorCXNlcV9wcmludGYobSwgIixwcm90bz0lcyIsIHByb3RvKTsKKwlzZXFfcHJpbnRmKG0sICIsdGltZW89JWx1IiwgMTBVICogbmZzcy0+cmV0cmFuc190aW1lbyAvIEhaKTsKKwlzZXFfcHJpbnRmKG0sICIscmV0cmFucz0ldSIsIG5mc3MtPnJldHJhbnNfY291bnQpOworCXNlcV9wcmludGYobSwgIixzZWM9JXMiLCBuZnNfcHNldWRvZmxhdm91cl90b19uYW1lKG5mc3MtPmNsaWVudC0+Y2xfYXV0aC0+YXVfZmxhdm9yKSk7Cit9CisKKy8qCisgKiBEZXNjcmliZSB0aGUgbW91bnQgb3B0aW9ucyBvbiB0aGlzIFZGUyBtb3VudHBvaW50CisgKi8KK3N0YXRpYyBpbnQgbmZzX3Nob3dfb3B0aW9ucyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NCKG1udC0+bW50X3NiKTsKKworCW5mc19zaG93X21vdW50X29wdGlvbnMobSwgbmZzcywgMCk7CisKKwlzZXFfcHV0cyhtLCAiLGFkZHI9Iik7CisJc2VxX2VzY2FwZShtLCBuZnNzLT5ob3N0bmFtZSwgIiBcdFxuXFwiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUHJlc2VudCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBWRlMgbW91bnRwb2ludAorICovCitzdGF0aWMgaW50IG5mc19zaG93X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJaW50IGksIGNwdTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcyA9IE5GU19TQihtbnQtPm1udF9zYik7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gbmZzcy0+Y2xpZW50LT5jbF9hdXRoOworCXN0cnVjdCBuZnNfaW9zdGF0cyB0b3RhbHMgPSB7IH07CisKKwlzZXFfcHJpbnRmKG0sICJzdGF0dmVycz0lcyIsIE5GU19JT1NUQVRfVkVSUyk7CisKKwkvKgorCSAqIERpc3BsYXkgYWxsIG1vdW50IG9wdGlvbiBzZXR0aW5ncworCSAqLworCXNlcV9wcmludGYobSwgIlxuXHRvcHRzOlx0Iik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkgPyAicm8iIDogInJ3Iik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUyA/ICIsc3luYyIgOiAiIik7CisJc2VxX3B1dHMobSwgbW50LT5tbnRfc2ItPnNfZmxhZ3MgJiBNU19OT0FUSU1FID8gIixub2F0aW1lIiA6ICIiKTsKKwlzZXFfcHV0cyhtLCBtbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX05PRElSQVRJTUUgPyAiLG5vZGlyYXRpbWUiIDogIiIpOworCW5mc19zaG93X21vdW50X29wdGlvbnMobSwgbmZzcywgMSk7CisKKwlzZXFfcHJpbnRmKG0sICJcblx0YWdlOlx0JWx1IiwgKGppZmZpZXMgLSBuZnNzLT5tb3VudF90aW1lKSAvIEhaKTsKKworCXNlcV9wcmludGYobSwgIlxuXHRjYXBzOlx0Iik7CisJc2VxX3ByaW50ZihtLCAiY2Fwcz0weCV4IiwgbmZzcy0+Y2Fwcyk7CisJc2VxX3ByaW50ZihtLCAiLHd0bXVsdD0lZCIsIG5mc3MtPnd0bXVsdCk7CisJc2VxX3ByaW50ZihtLCAiLGR0c2l6ZT0lZCIsIG5mc3MtPmR0c2l6ZSk7CisJc2VxX3ByaW50ZihtLCAiLGJzaXplPSVkIiwgbmZzcy0+YnNpemUpOworCXNlcV9wcmludGYobSwgIixuYW1lbGVuPSVkIiwgbmZzcy0+bmFtZWxlbik7CisKKyNpZmRlZiBDT05GSUdfTkZTX1Y0CisJaWYgKG5mc3MtPnJwY19vcHMtPnZlcnNpb24gPT0gNCkgeworCQlzZXFfcHJpbnRmKG0sICJcblx0bmZzdjQ6XHQiKTsKKwkJc2VxX3ByaW50ZihtLCAiYm0wPTB4JXgiLCBuZnNzLT5hdHRyX2JpdG1hc2tbMF0pOworCQlzZXFfcHJpbnRmKG0sICIsYm0xPTB4JXgiLCBuZnNzLT5hdHRyX2JpdG1hc2tbMV0pOworCQlzZXFfcHJpbnRmKG0sICIsYWNsPTB4JXgiLCBuZnNzLT5hY2xfYml0bWFzayk7CisJfQorI2VuZGlmCisKKwkvKgorCSAqIERpc3BsYXkgc2VjdXJpdHkgZmxhdm9yIGluIGVmZmVjdCBmb3IgdGhpcyBtb3VudAorCSAqLworCXNlcV9wcmludGYobSwgIlxuXHRzZWM6XHRmbGF2b3I9JWQiLCBhdXRoLT5hdV9vcHMtPmF1X2ZsYXZvcik7CisJaWYgKGF1dGgtPmF1X2ZsYXZvcikKKwkJc2VxX3ByaW50ZihtLCAiLHBzZXVkb2ZsYXZvcj0lZCIsIGF1dGgtPmF1X2ZsYXZvcik7CisKKwkvKgorCSAqIERpc3BsYXkgc3VwZXJibG9jayBJL08gY291bnRlcnMKKwkgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBuZnNfaW9zdGF0cyAqc3RhdHM7CisKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCXN0YXRzID0gcGVyX2NwdV9wdHIobmZzcy0+aW9fc3RhdHMsIGNwdSk7CisKKwkJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0NPVU5UU01BWDsgaSsrKQorCQkJdG90YWxzLmV2ZW50c1tpXSArPSBzdGF0cy0+ZXZlbnRzW2ldOworCQlmb3IgKGkgPSAwOyBpIDwgX19ORlNJT1NfQllURVNNQVg7IGkrKykKKwkJCXRvdGFscy5ieXRlc1tpXSArPSBzdGF0cy0+Ynl0ZXNbaV07CisKKwkJcHJlZW1wdF9lbmFibGUoKTsKKwl9CisKKwlzZXFfcHJpbnRmKG0sICJcblx0ZXZlbnRzOlx0Iik7CisJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0NPVU5UU01BWDsgaSsrKQorCQlzZXFfcHJpbnRmKG0sICIlbHUgIiwgdG90YWxzLmV2ZW50c1tpXSk7CisJc2VxX3ByaW50ZihtLCAiXG5cdGJ5dGVzOlx0Iik7CisJZm9yIChpID0gMDsgaSA8IF9fTkZTSU9TX0JZVEVTTUFYOyBpKyspCisJCXNlcV9wcmludGYobSwgIiVMdSAiLCB0b3RhbHMuYnl0ZXNbaV0pOworCXNlcV9wcmludGYobSwgIlxuIik7CisKKwlycGNfcHJpbnRfaW9zdGF0cyhtLCBuZnNzLT5jbGllbnQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBCZWdpbiB1bm1vdW50IGJ5IGF0dGVtcHRpbmcgdG8gcmVtb3ZlIGFsbCBhdXRvbW91bnRlZCBtb3VudHBvaW50cyB3ZSBhZGRlZAorICogaW4gcmVzcG9uc2UgdG8gdHJhdmVyc2FscworICovCitzdGF0aWMgdm9pZCBuZnNfdW1vdW50X2JlZ2luKHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgcnBjX2NsbnQJKnJwYzsKKworCXNocmlua19zdWJtb3VudHModmZzbW50LCAmbmZzX2F1dG9tb3VudF9saXN0KTsKKwlpZiAoIShmbGFncyAmIE1OVF9GT1JDRSkpCisJCXJldHVybjsKKwkvKiAtRUlPIGFsbCBwZW5kaW5nIEkvTyAqLworCXNlcnZlciA9IE5GU19TQih2ZnNtbnQtPm1udF9zYik7CisJcnBjID0gc2VydmVyLT5jbGllbnQ7CisJaWYgKCFJU19FUlIocnBjKSkKKwkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKKwlycGMgPSBzZXJ2ZXItPmNsaWVudF9hY2w7CisJaWYgKCFJU19FUlIocnBjKSkKKwkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgcm9vdCBpbm9kZSBvZiB0aGUgZmlsZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorbmZzX2dldF9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfZmggKnJvb3RmaCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5nZXRyb290KHNlcnZlciwgcm9vdGZoLCBmc2luZm8pOworCWlmIChlcnJvciA8IDApIHsKKwkJZHByaW50aygibmZzX2dldF9yb290OiBnZXRhdHRyIGVycm9yID0gJWRcbiIsIC1lcnJvcik7CisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwl9CisKKwlzZXJ2ZXItPmZzaWQgPSBmc2luZm8tPmZhdHRyLT5mc2lkOworCXJldHVybiBuZnNfZmhnZXQoc2IsIHJvb3RmaCwgZnNpbmZvLT5mYXR0cik7Cit9CisKKy8qCisgKiBEbyBORlMgdmVyc2lvbi1pbmRlcGVuZGVudCBtb3VudCBwcm9jZXNzaW5nLCBhbmQgc2FuaXR5IGNoZWNraW5nCisgKi8KK3N0YXRpYyBpbnQKK25mc19zYl9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvcikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyOworCXN0cnVjdCBpbm9kZQkJKnJvb3RfaW5vZGU7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzX2ZzaW5mbwlmc2luZm8gPSB7CisJCQkJCS5mYXR0ciA9ICZmYXR0ciwKKwkJCQl9OworCXN0cnVjdCBuZnNfcGF0aGNvbmYgcGF0aGluZm8gPSB7CisJCQkuZmF0dHIgPSAmZmF0dHIsCisJfTsKKwlpbnQgbm9fcm9vdF9lcnJvciA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXhfcnBjX3BheWxvYWQ7CisKKwkvKiBXZSBwcm9iYWJseSB3YW50IHNvbWV0aGluZyBtb3JlIGluZm9ybWF0aXZlIGhlcmUgKi8KKwlzbnByaW50ZihzYi0+c19pZCwgc2l6ZW9mKHNiLT5zX2lkKSwgIiV4OiV4IiwgTUFKT1Ioc2ItPnNfZGV2KSwgTUlOT1Ioc2ItPnNfZGV2KSk7CisKKwlzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCisJc2ItPnNfbWFnaWMgICAgICA9IE5GU19TVVBFUl9NQUdJQzsKKworCXNlcnZlci0+aW9fc3RhdHMgPSBuZnNfYWxsb2NfaW9zdGF0cygpOworCWlmIChzZXJ2ZXItPmlvX3N0YXRzID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcm9vdF9pbm9kZSA9IG5mc19nZXRfcm9vdChzYiwgJnNlcnZlci0+ZmgsICZmc2luZm8pOworCS8qIERpZCBnZXR0aW5nIHRoZSByb290IGlub2RlIGZhaWw/ICovCisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQlub19yb290X2Vycm9yID0gUFRSX0VSUihyb290X2lub2RlKTsKKwkJZ290byBvdXRfbm9fcm9vdDsKKwl9CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJbm9fcm9vdF9lcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSBzZXJ2ZXItPnJwY19vcHMtPmRlbnRyeV9vcHM7CisKKwkvKiBtb3VudCB0aW1lIHN0YW1wLCBpbiBzZWNvbmRzICovCisJc2VydmVyLT5tb3VudF90aW1lID0gamlmZmllczsKKworCS8qIEdldCBzb21lIGdlbmVyYWwgZmlsZSBzeXN0ZW0gaW5mbyAqLworCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCAmJgorCSAgICBzZXJ2ZXItPnJwY19vcHMtPnBhdGhjb25mKHNlcnZlciwgJnNlcnZlci0+ZmgsICZwYXRoaW5mbykgPj0gMCkKKwkJc2VydmVyLT5uYW1lbGVuID0gcGF0aGluZm8ubWF4X25hbWVsZW47CisJLyogV29yayBvdXQgYSBsb3Qgb2YgcGFyYW1ldGVycyAqLworCWlmIChzZXJ2ZXItPnJzaXplID09IDApCisJCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8ucnRwcmVmLCBOVUxMKTsKKwlpZiAoc2VydmVyLT53c2l6ZSA9PSAwKQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnd0cHJlZiwgTlVMTCk7CisKKwlpZiAoZnNpbmZvLnJ0bWF4ID49IDUxMiAmJiBzZXJ2ZXItPnJzaXplID4gZnNpbmZvLnJ0bWF4KQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnJ0bWF4LCBOVUxMKTsKKwlpZiAoZnNpbmZvLnd0bWF4ID49IDUxMiAmJiBzZXJ2ZXItPndzaXplID4gZnNpbmZvLnd0bWF4KQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnd0bWF4LCBOVUxMKTsKKworCW1heF9ycGNfcGF5bG9hZCA9IG5mc19ibG9ja19zaXplKHJwY19tYXhfcGF5bG9hZChzZXJ2ZXItPmNsaWVudCksIE5VTEwpOworCWlmIChzZXJ2ZXItPnJzaXplID4gbWF4X3JwY19wYXlsb2FkKQorCQlzZXJ2ZXItPnJzaXplID0gbWF4X3JwY19wYXlsb2FkOworCWlmIChzZXJ2ZXItPnJzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCisJCXNlcnZlci0+cnNpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKwlzZXJ2ZXItPnJwYWdlcyA9IChzZXJ2ZXItPnJzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChzZXJ2ZXItPndzaXplID4gbWF4X3JwY19wYXlsb2FkKQorCQlzZXJ2ZXItPndzaXplID0gbWF4X3JwY19wYXlsb2FkOworCWlmIChzZXJ2ZXItPndzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCisJCXNlcnZlci0+d3NpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKKwlzZXJ2ZXItPndwYWdlcyA9IChzZXJ2ZXItPndzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChzYi0+c19ibG9ja3NpemUgPT0gMCkKKwkJc2ItPnNfYmxvY2tzaXplID0gbmZzX2Jsb2NrX2JpdHMoc2VydmVyLT53c2l6ZSwKKwkJCQkJCQkgJnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzZXJ2ZXItPnd0bXVsdCA9IG5mc19ibG9ja19iaXRzKGZzaW5mby53dG11bHQsIE5VTEwpOworCisJc2VydmVyLT5kdHNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8uZHRwcmVmLCBOVUxMKTsKKwlpZiAoc2VydmVyLT5kdHNpemUgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCXNlcnZlci0+ZHRzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlmIChzZXJ2ZXItPmR0c2l6ZSA+IHNlcnZlci0+cnNpemUpCisJCXNlcnZlci0+ZHRzaXplID0gc2VydmVyLT5yc2l6ZTsKKworCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUMpIHsKKwkJc2VydmVyLT5hY3JlZ21pbiA9IHNlcnZlci0+YWNyZWdtYXggPSAwOworCQlzZXJ2ZXItPmFjZGlybWluID0gc2VydmVyLT5hY2Rpcm1heCA9IDA7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1NZTkNIUk9OT1VTOworCX0KKwlzZXJ2ZXItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPSBzZXJ2ZXItPnJwYWdlcyAqIE5GU19NQVhfUkVBREFIRUFEOworCisJbmZzX3N1cGVyX3NldF9tYXhieXRlcyhzYiwgZnNpbmZvLm1heGZpbGVzaXplKTsKKworCXNlcnZlci0+Y2xpZW50LT5jbF9pbnRyID0gKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikgPyAxIDogMDsKKwlzZXJ2ZXItPmNsaWVudC0+Y2xfc29mdHJ0cnkgPSAoc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSA/IDEgOiAwOworCisJLyogV2UncmUgYWlyYm9ybmUgU2V0IHNvY2tldCBidWZmZXJzaXplICovCisJcnBjX3NldGJ1ZnNpemUoc2VydmVyLT5jbGllbnQsIHNlcnZlci0+d3NpemUgKyAxMDAsIHNlcnZlci0+cnNpemUgKyAxMDApOworCXJldHVybiAwOworCS8qIFlhcmdzLiBJdCBkaWRuJ3Qgd29yayBvdXQuICovCitvdXRfbm9fcm9vdDoKKwlkcHJpbnRrKCJuZnNfc2JfaW5pdDogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkOiBlcnJubyAlZFxuIiwgLW5vX3Jvb3RfZXJyb3IpOworCWlmICghSVNfRVJSKHJvb3RfaW5vZGUpKQorCQlpcHV0KHJvb3RfaW5vZGUpOworCXJldHVybiBub19yb290X2Vycm9yOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgdGltZW91dCB2YWx1ZXMgZm9yIGEgY29ubmVjdGlvbgorICovCitzdGF0aWMgdm9pZCBuZnNfaW5pdF90aW1lb3V0X3ZhbHVlcyhzdHJ1Y3QgcnBjX3RpbWVvdXQgKnRvLCBpbnQgcHJvdG8sIHVuc2lnbmVkIGludCB0aW1lbywgdW5zaWduZWQgaW50IHJldHJhbnMpCit7CisJdG8tPnRvX2luaXR2YWwgPSB0aW1lbyAqIEhaIC8gMTA7CisJdG8tPnRvX3JldHJpZXMgPSByZXRyYW5zOworCWlmICghdG8tPnRvX3JldHJpZXMpCisJCXRvLT50b19yZXRyaWVzID0gMjsKKworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIElQUFJPVE9fVENQOgorCQlpZiAoIXRvLT50b19pbml0dmFsKQorCQkJdG8tPnRvX2luaXR2YWwgPSA2MCAqIEhaOworCQlpZiAodG8tPnRvX2luaXR2YWwgPiBORlNfTUFYX1RDUF9USU1FT1VUKQorCQkJdG8tPnRvX2luaXR2YWwgPSBORlNfTUFYX1RDUF9USU1FT1VUOworCQl0by0+dG9faW5jcmVtZW50ID0gdG8tPnRvX2luaXR2YWw7CisJCXRvLT50b19tYXh2YWwgPSB0by0+dG9faW5pdHZhbCArICh0by0+dG9faW5jcmVtZW50ICogdG8tPnRvX3JldHJpZXMpOworCQl0by0+dG9fZXhwb25lbnRpYWwgPSAwOworCQlicmVhazsKKwljYXNlIElQUFJPVE9fVURQOgorCWRlZmF1bHQ6CisJCWlmICghdG8tPnRvX2luaXR2YWwpCisJCQl0by0+dG9faW5pdHZhbCA9IDExICogSFogLyAxMDsKKwkJaWYgKHRvLT50b19pbml0dmFsID4gTkZTX01BWF9VRFBfVElNRU9VVCkKKwkJCXRvLT50b19pbml0dmFsID0gTkZTX01BWF9VRFBfVElNRU9VVDsKKwkJdG8tPnRvX21heHZhbCA9IE5GU19NQVhfVURQX1RJTUVPVVQ7CisJCXRvLT50b19leHBvbmVudGlhbCA9IDE7CisJCWJyZWFrOworCX0KK30KKworLyoKKyAqIENyZWF0ZSBhbiBSUEMgY2xpZW50IGhhbmRsZS4KKyAqLworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCituZnNfY3JlYXRlX2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtczsKKwlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NsbnQJCSpjbG50ID0gTlVMTDsKKwlpbnQJCQlwcm90byA9IChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8gSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKKworCW5mc19pbml0X3RpbWVvdXRfdmFsdWVzKCZ0aW1lcGFybXMsIHByb3RvLCBkYXRhLT50aW1lbywgZGF0YS0+cmV0cmFucyk7CisKKwlzZXJ2ZXItPnJldHJhbnNfdGltZW8gPSB0aW1lcGFybXMudG9faW5pdHZhbDsKKwlzZXJ2ZXItPnJldHJhbnNfY291bnQgPSB0aW1lcGFybXMudG9fcmV0cmllczsKKworCS8qIGNyZWF0ZSB0cmFuc3BvcnQgYW5kIGNsaWVudCAqLworCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhwcm90bywgJnNlcnZlci0+YWRkciwgJnRpbWVwYXJtcyk7CisJaWYgKElTX0VSUih4cHJ0KSkgeworCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVsZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIFBUUl9FUlIoeHBydCkpOworCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisJfQorCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJIHNlcnZlci0+cnBjX29wcy0+dmVyc2lvbiwgZGF0YS0+cHNldWRvZmxhdm9yKTsKKwlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWxkXG4iLAorCQkJCV9fRlVOQ1RJT05fXywgUFRSX0VSUih4cHJ0KSk7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCWNsbnQtPmNsX3NvZnRydHJ5ID0gMTsKKworCXJldHVybiBjbG50OworCitvdXRfZmFpbDoKKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIENsb25lIGEgc2VydmVyIHJlY29yZAorICovCitzdGF0aWMgc3RydWN0IG5mc19zZXJ2ZXIgKm5mc19jbG9uZV9zZXJ2ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG5mc19jbG9uZV9tb3VudCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqcGFyZW50ID0gTkZTX1NCKGRhdGEtPnNiKTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IG5mc19mc2luZm8gZnNpbmZvOworCXZvaWQgKmVyciA9IEVSUl9QVFIoLUVOT01FTSk7CisKKwlzYi0+c19vcCA9IGRhdGEtPnNiLT5zX29wOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IGRhdGEtPnNiLT5zX2Jsb2Nrc2l6ZTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IGRhdGEtPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCXNiLT5zX21heGJ5dGVzID0gZGF0YS0+c2ItPnNfbWF4Ynl0ZXM7CisKKwlzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCXNlcnZlci0+aW9fc3RhdHMgPSBuZnNfYWxsb2NfaW9zdGF0cygpOworCWlmIChzZXJ2ZXItPmlvX3N0YXRzID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2VydmVyLT5jbGllbnQgPSBycGNfY2xvbmVfY2xpZW50KHBhcmVudC0+Y2xpZW50KTsKKwlpZiAoSVNfRVJSKChlcnIgPSBzZXJ2ZXItPmNsaWVudCkpKQorCQlnb3RvIG91dDsKKworCWlmICghSVNfRVJSKHBhcmVudC0+Y2xpZW50X3N5cykpIHsKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChwYXJlbnQtPmNsaWVudF9zeXMpOworCQlpZiAoSVNfRVJSKChlcnIgPSBzZXJ2ZXItPmNsaWVudF9zeXMpKSkKKwkJCWdvdG8gb3V0OworCX0KKwlpZiAoIUlTX0VSUihwYXJlbnQtPmNsaWVudF9hY2wpKSB7CisJCXNlcnZlci0+Y2xpZW50X2FjbCA9IHJwY19jbG9uZV9jbGllbnQocGFyZW50LT5jbGllbnRfYWNsKTsKKwkJaWYgKElTX0VSUigoZXJyID0gc2VydmVyLT5jbGllbnRfYWNsKSkpCisJCQlnb3RvIG91dDsKKwl9CisJcm9vdF9pbm9kZSA9IG5mc19maGdldChzYiwgZGF0YS0+ZmgsIGRhdGEtPmZhdHRyKTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0OworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KQorCQlnb3RvIG91dF9wdXRfcm9vdDsKKwlmc2luZm8uZmF0dHIgPSBkYXRhLT5mYXR0cjsKKwlpZiAoTkZTX1BST1RPKHJvb3RfaW5vZGUpLT5mc2luZm8oc2VydmVyLCBkYXRhLT5maCwgJmZzaW5mbykgPT0gMCkKKwkJbmZzX3N1cGVyX3NldF9tYXhieXRlcyhzYiwgZnNpbmZvLm1heGZpbGVzaXplKTsKKwlzYi0+c19yb290LT5kX29wID0gc2VydmVyLT5ycGNfb3BzLT5kZW50cnlfb3BzOworCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gc2VydmVyOworb3V0X3B1dF9yb290OgorCWlwdXQocm9vdF9pbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENvcHkgYW4gZXhpc3Rpbmcgc3VwZXJibG9jayBhbmQgYXR0YWNoIHJldmlzZWQgZGF0YQorICovCitzdGF0aWMgaW50IG5mc19jbG9uZV9nZW5lcmljX3NiKHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEsCisJCXN0cnVjdCBzdXBlcl9ibG9jayAqKCpmaWxsX3NiKShzdHJ1Y3QgbmZzX3NlcnZlciAqLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICopLAorCQlzdHJ1Y3QgbmZzX3NlcnZlciAqKCpmaWxsX3NlcnZlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKiksCisJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnBhcmVudCA9IE5GU19TQihkYXRhLT5zYik7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IEVSUl9QVFIoLUVJTlZBTCk7CisJY2hhciAqaG9zdG5hbWU7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwlpbnQgbGVuOworCisJc2VydmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VydmVyID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwltZW1jcHkoc2VydmVyLCBwYXJlbnQsIHNpemVvZigqc2VydmVyKSk7CisJaG9zdG5hbWUgPSAoZGF0YS0+aG9zdG5hbWUgIT0gTlVMTCkgPyBkYXRhLT5ob3N0bmFtZSA6IHBhcmVudC0+aG9zdG5hbWU7CisJbGVuID0gc3RybGVuKGhvc3RuYW1lKSArIDE7CisJc2VydmVyLT5ob3N0bmFtZSA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2VydmVyLT5ob3N0bmFtZSA9PSBOVUxMKQorCQlnb3RvIGZyZWVfc2VydmVyOworCW1lbWNweShzZXJ2ZXItPmhvc3RuYW1lLCBob3N0bmFtZSwgbGVuKTsKKwllcnJvciA9IHJwY2lvZF91cCgpOworCWlmIChlcnJvciAhPSAwKQorCQlnb3RvIGZyZWVfaG9zdG5hbWU7CisKKwlzYiA9IGZpbGxfc2Ioc2VydmVyLCBkYXRhKTsKKwlpZiAoSVNfRVJSKHNiKSkgeworCQllcnJvciA9IFBUUl9FUlIoc2IpOworCQlnb3RvIGtpbGxfcnBjaW9kOworCX0KKwkJCisJaWYgKHNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X3JwY2lvZF9kb3duOworCisJc2VydmVyID0gZmlsbF9zZXJ2ZXIoc2IsIGRhdGEpOworCWlmIChJU19FUlIoc2VydmVyKSkgeworCQllcnJvciA9IFBUUl9FUlIoc2VydmVyKTsKKwkJZ290byBvdXRfZGVhY3RpdmF0ZTsKKwl9CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgc2IpOworb3V0X2RlYWN0aXZhdGU6CisJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJZGVhY3RpdmF0ZV9zdXBlcihzYik7CisJcmV0dXJuIGVycm9yOworb3V0X3JwY2lvZF9kb3duOgorCXJwY2lvZF9kb3duKCk7CisJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKKwlyZXR1cm4gc2ltcGxlX3NldF9tbnQobW50LCBzYik7CitraWxsX3JwY2lvZDoKKwlycGNpb2RfZG93bigpOworZnJlZV9ob3N0bmFtZToKKwlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKK2ZyZWVfc2VydmVyOgorCWtmcmVlKHNlcnZlcik7CitvdXRfZXJyOgorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFNldCB1cCBhbiBORlMyLzMgc3VwZXJibG9jaworICoKKyAqIFRoZSB3YXkgdGhpcyB3b3JrcyBpcyB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyBhIHN0cnVjdHVyZQorICogaW4gdGhlIGRhdGEgYXJndW1lbnQgd2hpY2ggY29udGFpbnMgdGhlIHNlcnZlcidzIElQIGFkZHJlc3MKKyAqIGFuZCB0aGUgcm9vdCBmaWxlIGhhbmRsZSBvYnRhaW5lZCBmcm9tIHRoZSBzZXJ2ZXIncyBtb3VudAorICogZGFlbW9uLiBXZSBzdGFzaCB0aGVzZSBhd2F5IGluIHRoZSBwcml2YXRlIHN1cGVyYmxvY2sgZmllbGRzLgorICovCitzdGF0aWMgaW50CituZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIJKnNlcnZlcjsKKwlycGNfYXV0aGZsYXZvcl90CWF1dGhmbGF2b3I7CisKKwlzZXJ2ZXIgICAgICAgICAgID0gTkZTX1NCKHNiKTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7CisJc2ItPnNfYmxvY2tzaXplID0gMDsKKwlpZiAoZGF0YS0+YnNpemUpCisJCXNiLT5zX2Jsb2Nrc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPmJzaXplLCAmc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmIChkYXRhLT5yc2l6ZSkKKwkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKKwlpZiAoZGF0YS0+d3NpemUpCisJCXNlcnZlci0+d3NpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT53c2l6ZSwgTlVMTCk7CisJc2VydmVyLT5mbGFncyAgICA9IGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX0ZMQUdNQVNLOworCisJc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOworCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKKwlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7CisJc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOworCisJLyogU3RhcnQgbG9ja2QgaGVyZSwgYmVmb3JlIHdlIG1pZ2h0IGVycm9yIG91dCAqLworCWlmICghKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKQorCQlsb2NrZF91cCgpOworCisJc2VydmVyLT5uYW1lbGVuICA9IGRhdGEtPm5hbWxlbjsKKwlzZXJ2ZXItPmhvc3RuYW1lID0ga21hbGxvYyhzdHJsZW4oZGF0YS0+aG9zdG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXItPmhvc3RuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJjcHkoc2VydmVyLT5ob3N0bmFtZSwgZGF0YS0+aG9zdG5hbWUpOworCisJLyogQ2hlY2sgTkZTIHByb3RvY29sIHJldmlzaW9uIGFuZCBpbml0aWFsaXplIFJQQyBvcCB2ZWN0b3IKKwkgKiBhbmQgZmlsZSBoYW5kbGUgcG9vbC4gKi8KKyNpZmRlZiBDT05GSUdfTkZTX1YzCisJaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworCQlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YzX2NsaWVudG9wczsKKwkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfUkVBRERJUlBMVVM7CisJfSBlbHNlIHsKKwkJc2VydmVyLT5ycGNfb3BzID0gJm5mc192Ml9jbGllbnRvcHM7CisJfQorI2Vsc2UKKwlzZXJ2ZXItPnJwY19vcHMgPSAmbmZzX3YyX2NsaWVudG9wczsKKyNlbmRpZgorCisJLyogRmlsbCBpbiBwc2V1ZG9mbGF2b3IgZm9yIG1vdW50IHZlcnNpb24gPCA1ICovCisJaWYgKCEoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfU0VDRkxBVk9VUikpCisJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IFJQQ19BVVRIX1VOSVg7CisJYXV0aGZsYXZvciA9IGRhdGEtPnBzZXVkb2ZsYXZvcjsJLyogc2F2ZSBmb3Igc2JfaW5pdCgpICovCisJLyogWFhYIG1heWJlIHdlIHdhbnQgdG8gYWRkIGEgc2VydmVyLT5wc2V1ZG9mbGF2b3IgZmllbGQgKi8KKworCS8qIENyZWF0ZSBSUEMgY2xpZW50IGhhbmRsZXMgKi8KKwlzZXJ2ZXItPmNsaWVudCA9IG5mc19jcmVhdGVfY2xpZW50KHNlcnZlciwgZGF0YSk7CisJaWYgKElTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50KTsKKwkvKiBSRkMgMjYyMywgc2VjIDIuMy4yICovCisJaWYgKGF1dGhmbGF2b3IgIT0gUlBDX0FVVEhfVU5JWCkgeworCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7CisKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7CisJCWlmIChJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKKwkJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50X3N5cyk7CisJCWF1dGggPSBycGNhdXRoX2NyZWF0ZShSUENfQVVUSF9VTklYLCBzZXJ2ZXItPmNsaWVudF9zeXMpOworCQlpZiAoSVNfRVJSKGF1dGgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYXV0aCk7CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmc2VydmVyLT5jbGllbnQtPmNsX2NvdW50KTsKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gc2VydmVyLT5jbGllbnQ7CisJfQorCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKyNpZmRlZiBDT05GSUdfTkZTX1YzX0FDTAorCQlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUNMKSkgeworCQkJc2VydmVyLT5jbGllbnRfYWNsID0gcnBjX2JpbmRfbmV3X3Byb2dyYW0oc2VydmVyLT5jbGllbnQsICZuZnNhY2xfcHJvZ3JhbSwgMyk7CisJCQkvKiBObyBlcnJvcnMhIEFzc3VtZSB0aGF0IFN1biBuZnNhY2xzIGFyZSBzdXBwb3J0ZWQgKi8KKwkJCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X2FjbCkpCisJCQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfQUNMUzsKKwkJfQorI2Vsc2UKKwkJc2VydmVyLT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUNMOworI2VuZGlmIC8qIENPTkZJR19ORlNfVjNfQUNMICovCisJCS8qCisJCSAqIFRoZSBWRlMgc2hvdWxkbid0IGFwcGx5IHRoZSB1bWFzayB0byBtb2RlIGJpdHMuIFdlIHdpbGwKKwkJICogZG8gc28gb3Vyc2VsdmVzIHdoZW4gbmVjZXNzYXJ5LgorCQkgKi8KKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMzX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzNfTUFYTkFNTEVOOworCQlzYi0+c190aW1lX2dyYW4gPSAxOworCX0gZWxzZSB7CisJCWlmIChzZXJ2ZXItPm5hbWVsZW4gPT0gMCB8fCBzZXJ2ZXItPm5hbWVsZW4gPiBORlMyX01BWE5BTUxFTikKKwkJCXNlcnZlci0+bmFtZWxlbiA9IE5GUzJfTUFYTkFNTEVOOworCX0KKworCXNiLT5zX29wID0gJm5mc19zb3BzOworCXJldHVybiBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvcik7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3NldF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEpCit7CisJcy0+c19mc19pbmZvID0gZGF0YTsKKwlyZXR1cm4gc2V0X2Fub25fc3VwZXIocywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChvbGQtPmFkZHIuc2luX2FkZHIuc19hZGRyICE9IHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIpCisJCXJldHVybiAwOworCWlmIChvbGQtPmFkZHIuc2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNpbl9wb3J0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW5mc19jb21wYXJlX2ZoKCZvbGQtPmZoLCAmc2VydmVyLT5maCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpyYXdfZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzX2ZoICpyb290OworCXN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSA9IHJhd19kYXRhOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCX0KKwlpZiAoZGF0YS0+dmVyc2lvbiA8PSAwIHx8IGRhdGEtPnZlcnNpb24gPiBORlNfTU9VTlRfVkVSU0lPTikgeworCQlkcHJpbnRrKCIlczogYmFkIG1vdW50IHZlcnNpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2Vycl9ub3NlcnZlcjsKKwl9CisJc3dpdGNoIChkYXRhLT52ZXJzaW9uKSB7CisJCWNhc2UgMToKKwkJCWRhdGEtPm5hbWxlbiA9IDA7CisJCWNhc2UgMjoKKwkJCWRhdGEtPmJzaXplICA9IDA7CisJCWNhc2UgMzoKKwkJCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJCQkJZHByaW50aygiJXM6IG1vdW50IHN0cnVjdHVyZSB2ZXJzaW9uICVkIGRvZXMgbm90IHN1cHBvcnQgTkZTdjNcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJCQlkYXRhLT52ZXJzaW9uKTsKKwkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7CisJCQl9CisJCQlkYXRhLT5yb290LnNpemUgPSBORlMyX0ZIU0laRTsKKwkJCW1lbWNweShkYXRhLT5yb290LmRhdGEsIGRhdGEtPm9sZF9yb290LmRhdGEsIE5GUzJfRkhTSVpFKTsKKwkJY2FzZSA0OgorCQkJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpIHsKKwkJCQlkcHJpbnRrKCIlczogbW91bnQgc3RydWN0dXJlIHZlcnNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBzdHJvbmcgc2VjdXJpdHlcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sCisJCQkJCQlkYXRhLT52ZXJzaW9uKTsKKwkJCQlnb3RvIG91dF9lcnJfbm9zZXJ2ZXI7CisJCQl9CisJCWNhc2UgNToKKwkJCW1lbXNldChkYXRhLT5jb250ZXh0LCAwLCBzaXplb2YoZGF0YS0+Y29udGV4dCkpOworCX0KKyNpZm5kZWYgQ09ORklHX05GU19WMworCS8qIElmIE5GU3YzIGlzIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQgKi8KKwllcnJvciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJZHByaW50aygiJXM6IE5GU3YzIG5vdCBjb21waWxlZCBpbnRvIGtlcm5lbFxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCX0KKyNlbmRpZiAvKiBDT05GSUdfTkZTX1YzICovCisKKwllcnJvciA9IC1FTk9NRU07CisJc2VydmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcnZlcikKKwkJZ290byBvdXRfZXJyX25vc2VydmVyOworCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KKwlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7CisJc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCisJcm9vdCA9ICZzZXJ2ZXItPmZoOworCWlmIChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9WRVIzKQorCQlyb290LT5zaXplID0gZGF0YS0+cm9vdC5zaXplOworCWVsc2UKKwkJcm9vdC0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAocm9vdC0+c2l6ZSA+IHNpemVvZihyb290LT5kYXRhKSkgeworCQlkcHJpbnRrKCIlczogaW52YWxpZCByb290IGZpbGVoYW5kbGVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJbWVtY3B5KHJvb3QtPmRhdGEsIGRhdGEtPnJvb3QuZGF0YSwgcm9vdC0+c2l6ZSk7CisKKwkvKiBXZSBub3cgcmVxdWlyZSB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KKwltZW1jcHkoJnNlcnZlci0+YWRkciwgJmRhdGEtPmFkZHIsIHNpemVvZihzZXJ2ZXItPmFkZHIpKTsKKwlpZiAoc2VydmVyLT5hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfQU5ZKSB7CisJCWRwcmludGsoIiVzOiBtb3VudCBwcm9ncmFtIGRpZG4ndCBwYXNzIHJlbW90ZSBhZGRyZXNzIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJLyogRmlyZSB1cCBycGNpb2QgaWYgbm90IHlldCBydW5uaW5nICovCisJZXJyb3IgPSBycGNpb2RfdXAoKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRwcmludGsoIiVzOiBjb3VsZG4ndCBzdGFydCBycGNpb2QhIEVycm9yID0gJWRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBlcnJvcik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnNfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKKwlpZiAoSVNfRVJSKHMpKSB7CisJCWVycm9yID0gUFRSX0VSUihzKTsKKwkJZ290byBvdXRfZXJyX3JwY2lvZDsKKwl9CisKKwlpZiAocy0+c19yb290KQorCQlnb3RvIG91dF9ycGNpb2RfZG93bjsKKworCXMtPnNfZmxhZ3MgPSBmbGFnczsKKworCWVycm9yID0gbmZzX2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CisJaWYgKGVycm9yKSB7CisJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisKK291dF9ycGNpb2RfZG93bjoKKwlycGNpb2RfZG93bigpOworCWtmcmVlKHNlcnZlcik7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisKK291dF9lcnJfcnBjaW9kOgorCXJwY2lvZF9kb3duKCk7CitvdXRfZXJyOgorCWtmcmVlKHNlcnZlcik7CitvdXRfZXJyX25vc2VydmVyOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgbmZzX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Iocyk7CisKKwlraWxsX2Fub25fc3VwZXIocyk7CisKKwlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCWlmICghSVNfRVJSKHNlcnZlci0+Y2xpZW50X3N5cykpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnRfc3lzKTsKKwlpZiAoIUlTX0VSUihzZXJ2ZXItPmNsaWVudF9hY2wpKQorCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50X2FjbCk7CisKKwlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfZG93bigpOwkvKiByZWxlYXNlIHJwYy5sb2NrZCAqLworCisJcnBjaW9kX2Rvd24oKTsJCS8qIHJlbGVhc2UgcnBjaW9kICovCisKKwluZnNfZnJlZV9pb3N0YXRzKHNlcnZlci0+aW9fc3RhdHMpOworCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOworCWtmcmVlKHNlcnZlcik7CisJbmZzX3JlbGVhc2VfYXV0b21vdW50X3RpbWVyKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc19jbG9uZV9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzZXJ2ZXItPmZzaWQgPSBkYXRhLT5mYXR0ci0+ZnNpZDsKKwluZnNfY29weV9maCgmc2VydmVyLT5maCwgZGF0YS0+ZmgpOworCXNiID0gc2dldCgmbmZzX2ZzX3R5cGUsIG5mc19jb21wYXJlX3N1cGVyLCBuZnNfc2V0X3N1cGVyLCBzZXJ2ZXIpOworCWlmICghSVNfRVJSKHNiKSAmJiBzYi0+c19yb290ID09IE5VTEwgJiYgIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfdXAoKTsKKwlyZXR1cm4gc2I7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2Nsb25lX25mc19zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEgPSByYXdfZGF0YTsKKwlyZXR1cm4gbmZzX2Nsb25lX2dlbmVyaWNfc2IoZGF0YSwgbmZzX2Nsb25lX3NiLCBuZnNfY2xvbmVfc2VydmVyLCBtbnQpOworfQorCisjaWZkZWYgQ09ORklHX05GU19WNAorc3RhdGljIHN0cnVjdCBycGNfY2xudCAqbmZzNF9jcmVhdGVfY2xpZW50KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJc3RydWN0IHJwY190aW1lb3V0ICp0aW1lcGFybXMsIGludCBwcm90bywgcnBjX2F1dGhmbGF2b3JfdCBmbGF2b3IpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IHJwY194cHJ0ICp4cHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBOVUxMOworCWludCBlcnIgPSAtRUlPOworCisJY2xwID0gbmZzNF9nZXRfY2xpZW50KCZzZXJ2ZXItPmFkZHIuc2luX2FkZHIpOworCWlmICghY2xwKSB7CisJCWRwcmludGsoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIE5GUzQgY2xpZW50LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCisJZG93bl93cml0ZSgmY2xwLT5jbF9zZW0pOworCWlmIChJU19FUlIoY2xwLT5jbF9ycGNjbGllbnQpKSB7CisJCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byhwcm90bywgJnNlcnZlci0+YWRkciwgdGltZXBhcm1zKTsKKwkJaWYgKElTX0VSUih4cHJ0KSkgeworCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwkJCWVyciA9IFBUUl9FUlIoeHBydCk7CisJCQlkcHJpbnRrKCIlczogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LiBFcnJvciA9ICVkXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCS8qIEJpbmQgdG8gYSByZXNlcnZlZCBwb3J0ISAqLworCQl4cHJ0LT5yZXN2cG9ydCA9IDE7CisJCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBmbGF2b3IpOworCQlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCQkJZXJyID0gUFRSX0VSUihjbG50KTsKKwkJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCQljbG50LT5jbF9zb2Z0cnRyeSA9IDE7CisJCWNscC0+Y2xfcnBjY2xpZW50ID0gY2xudDsKKwkJbWVtY3B5KGNscC0+Y2xfaXBhZGRyLCBzZXJ2ZXItPmlwX2FkZHIsIHNpemVvZihjbHAtPmNsX2lwYWRkcikpOworCQluZnNfaWRtYXBfbmV3KGNscCk7CisJfQorCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bmZzNF9zaWJsaW5ncywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCWNsbnQgPSBycGNfY2xvbmVfY2xpZW50KGNscC0+Y2xfcnBjY2xpZW50KTsKKwlpZiAoIUlTX0VSUihjbG50KSkKKwkJc2VydmVyLT5uZnM0X3N0YXRlID0gY2xwOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJY2xwID0gTlVMTDsKKworCWlmIChJU19FUlIoY2xudCkpIHsKKwkJZHByaW50aygiJXM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC4gRXJyb3IgPSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGVycik7CisJCXJldHVybiBjbG50OworCX0KKworCWlmIChzZXJ2ZXItPm5mczRfc3RhdGUtPmNsX2lkbWFwID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IGZhaWxlZCB0byBjcmVhdGUgaWRtYXBwZXIuXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlpZiAoY2xudC0+Y2xfYXV0aC0+YXVfZmxhdm9yICE9IGZsYXZvcikgeworCQlzdHJ1Y3QgcnBjX2F1dGggKmF1dGg7CisKKwkJYXV0aCA9IHJwY2F1dGhfY3JlYXRlKGZsYXZvciwgY2xudCk7CisJCWlmIChJU19FUlIoYXV0aCkpIHsKKwkJCWRwcmludGsoIiVzOiBjb3VsZG4ndCBjcmVhdGUgY3JlZGNhY2hlIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopYXV0aDsKKwkJfQorCX0KKwlyZXR1cm4gY2xudDsKKworIG91dF9mYWlsOgorCWlmIChjbHApCisJCW5mczRfcHV0X2NsaWVudChjbHApOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qCisgKiBTZXQgdXAgYW4gTkZTNCBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyBpbnQgbmZzNF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnM0X21vdW50X2RhdGEgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcjsKKwlzdHJ1Y3QgcnBjX3RpbWVvdXQgdGltZXBhcm1zOworCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXI7CisJaW50IGVyciA9IC1FSU87CisKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDA7CisJc2ItPnNfYmxvY2tzaXplID0gMDsKKwlzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCWlmIChkYXRhLT5yc2l6ZSAhPSAwKQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+cnNpemUsIE5VTEwpOworCWlmIChkYXRhLT53c2l6ZSAhPSAwKQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+d3NpemUsIE5VTEwpOworCXNlcnZlci0+ZmxhZ3MgPSBkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9GTEFHTUFTSzsKKwlzZXJ2ZXItPmNhcHMgPSBORlNfQ0FQX0FUT01JQ19PUEVOOworCisJc2VydmVyLT5hY3JlZ21pbiA9IGRhdGEtPmFjcmVnbWluKkhaOworCXNlcnZlci0+YWNyZWdtYXggPSBkYXRhLT5hY3JlZ21heCpIWjsKKwlzZXJ2ZXItPmFjZGlybWluID0gZGF0YS0+YWNkaXJtaW4qSFo7CisJc2VydmVyLT5hY2Rpcm1heCA9IGRhdGEtPmFjZGlybWF4KkhaOworCisJc2VydmVyLT5ycGNfb3BzID0gJm5mc192NF9jbGllbnRvcHM7CisKKwluZnNfaW5pdF90aW1lb3V0X3ZhbHVlcygmdGltZXBhcm1zLCBkYXRhLT5wcm90bywgZGF0YS0+dGltZW8sIGRhdGEtPnJldHJhbnMpOworCisJc2VydmVyLT5yZXRyYW5zX3RpbWVvID0gdGltZXBhcm1zLnRvX2luaXR2YWw7CisJc2VydmVyLT5yZXRyYW5zX2NvdW50ID0gdGltZXBhcm1zLnRvX3JldHJpZXM7CisKKwkvKiBOb3cgY3JlYXRlIHRyYW5zcG9ydCBhbmQgY2xpZW50ICovCisJYXV0aGZsYXZvdXIgPSBSUENfQVVUSF9VTklYOworCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4gIT0gMCkgeworCQlpZiAoZGF0YS0+YXV0aF9mbGF2b3VybGVuICE9IDEpIHsKKwkJCWRwcmludGsoIiVzOiBJbnZhbGlkIG51bWJlciBvZiBSUEMgYXV0aCBmbGF2b3VycyAlZC5cbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZGF0YS0+YXV0aF9mbGF2b3VybGVuKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aGZsYXZvdXIsIGRhdGEtPmF1dGhfZmxhdm91cnMsIHNpemVvZihhdXRoZmxhdm91cikpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKworCXNlcnZlci0+Y2xpZW50ID0gbmZzNF9jcmVhdGVfY2xpZW50KHNlcnZlciwgJnRpbWVwYXJtcywgZGF0YS0+cHJvdG8sIGF1dGhmbGF2b3VyKTsKKwlpZiAoSVNfRVJSKHNlcnZlci0+Y2xpZW50KSkgeworCQllcnIgPSBQVFJfRVJSKHNlcnZlci0+Y2xpZW50KTsKKwkJCWRwcmludGsoIiVzOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuIEVycm9yID0gJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgZXJyKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKworCXNiLT5zX29wID0gJm5mczRfc29wczsKKwllcnIgPSBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvdXIpOworCisgb3V0X2ZhaWw6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnM0X2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChzdHJjbXAoc2VydmVyLT5ob3N0bmFtZSwgb2xkLT5ob3N0bmFtZSkgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0cmNtcChzZXJ2ZXItPm1udF9wYXRoLCBvbGQtPm1udF9wYXRoKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgKgorbmZzX2NvcHlfdXNlcl9zdHJpbmcoY2hhciAqZHN0LCBzdHJ1Y3QgbmZzX3N0cmluZyAqc3JjLCBpbnQgbWF4bGVuKQoreworCXZvaWQgKnAgPSBOVUxMOworCisJaWYgKCFzcmMtPmxlbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKHNyYy0+bGVuIDwgbWF4bGVuKQorCQltYXhsZW4gPSBzcmMtPmxlbjsKKwlpZiAoZHN0ID09IE5VTEwpIHsKKwkJcCA9IGRzdCA9IGttYWxsb2MobWF4bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKGRzdCwgc3JjLT5kYXRhLCBtYXhsZW4pKSB7CisJCWtmcmVlKHApOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisJZHN0W21heGxlbl0gPSAnXDAnOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhICpkYXRhID0gcmF3X2RhdGE7CisJdm9pZCAqcDsKKworCWlmIChkYXRhID09IE5VTEwpIHsKKwkJZHByaW50aygiJXM6IG1pc3NpbmcgZGF0YSBhcmd1bWVudFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChkYXRhLT52ZXJzaW9uIDw9IDAgfHwgZGF0YS0+dmVyc2lvbiA+IE5GUzRfTU9VTlRfVkVSU0lPTikgeworCQlkcHJpbnRrKCIlczogYmFkIG1vdW50IHZlcnNpb25cbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlcnZlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCS8qIFplcm8gb3V0IHRoZSBORlMgc3RhdGUgc3R1ZmYgKi8KKwlpbml0X25mc3Y0X3N0YXRlKHNlcnZlcik7CisJc2VydmVyLT5jbGllbnQgPSBzZXJ2ZXItPmNsaWVudF9zeXMgPSBzZXJ2ZXItPmNsaWVudF9hY2wgPSBFUlJfUFRSKC1FSU5WQUwpOworCisJcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKE5VTEwsICZkYXRhLT5ob3N0bmFtZSwgMjU2KTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJc2VydmVyLT5ob3N0bmFtZSA9IHA7CisKKwlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoTlVMTCwgJmRhdGEtPm1udF9wYXRoLCAxMDI0KTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisJc2VydmVyLT5tbnRfcGF0aCA9IHA7CisKKwlwID0gbmZzX2NvcHlfdXNlcl9zdHJpbmcoc2VydmVyLT5pcF9hZGRyLCAmZGF0YS0+Y2xpZW50X2FkZHIsCisJCQlzaXplb2Yoc2VydmVyLT5pcF9hZGRyKSAtIDEpOworCWlmIChJU19FUlIocCkpCisJCWdvdG8gb3V0X2VycjsKKworCS8qIFdlIG5vdyByZXF1aXJlIHRoYXQgdGhlIG1vdW50IHByb2Nlc3MgcGFzc2VzIHRoZSByZW1vdGUgYWRkcmVzcyAqLworCWlmIChkYXRhLT5ob3N0X2FkZHJsZW4gIT0gc2l6ZW9mKHNlcnZlci0+YWRkcikpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNlcnZlci0+YWRkciwgZGF0YS0+aG9zdF9hZGRyLCBzaXplb2Yoc2VydmVyLT5hZGRyKSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoc2VydmVyLT5hZGRyLnNpbl9mYW1pbHkgIT0gQUZfSU5FVCB8fAorCSAgICBzZXJ2ZXItPmFkZHIuc2luX2FkZHIuc19hZGRyID09IElOQUREUl9BTlkpIHsKKwkJZHByaW50aygiJXM6IG1vdW50IHByb2dyYW0gZGlkbid0IHBhc3MgcmVtb3RlIElQIGFkZHJlc3MhXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKiBGaXJlIHVwIHJwY2lvZCBpZiBub3QgeWV0IHJ1bm5pbmcgKi8KKwllcnJvciA9IHJwY2lvZF91cCgpOworCWlmIChlcnJvciA8IDApIHsKKwkJZHByaW50aygiJXM6IGNvdWxkbid0IHN0YXJ0IHJwY2lvZCEgRXJyb3IgPSAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGVycm9yKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisKKwlpZiAoSVNfRVJSKHMpKSB7CisJCWVycm9yID0gUFRSX0VSUihzKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlpZiAocy0+c19yb290KSB7CisJCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworCQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKKwkJa2ZyZWUoc2VydmVyKTsKKwkJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CisJfQorCisJcy0+c19mbGFncyA9IGZsYWdzOworCisJZXJyb3IgPSBuZnM0X2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CisJaWYgKGVycm9yKSB7CisJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNpbXBsZV9zZXRfbW50KG1udCwgcyk7CitvdXRfZXJyOgorCWVycm9yID0gUFRSX0VSUihwKTsKK291dF9mcmVlOgorCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOworCWtmcmVlKHNlcnZlcik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBuZnM0X2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKworCW5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKKwlraWxsX2Fub25fc3VwZXIoc2IpOworCisJbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOworCisJaWYgKHNlcnZlci0+Y2xpZW50ICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCisJZGVzdHJveV9uZnN2NF9zdGF0ZShzZXJ2ZXIpOworCisJcnBjaW9kX2Rvd24oKTsKKworCW5mc19mcmVlX2lvc3RhdHMoc2VydmVyLT5pb19zdGF0cyk7CisJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKKwluZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIoKTsKK30KKworLyoKKyAqIENvbnN0cnVjdHMgdGhlIFNFUlZFUi1zaWRlIHBhdGgKKyAqLworc3RhdGljIGlubGluZSBjaGFyICpuZnM0X2R1cF9wYXRoKGNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljaGFyICpwYWdlID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwljaGFyICpwYXRoOworCisJcGF0aCA9IG5mczRfcGF0aChkZW50cnksIHBhZ2UsIFBBR0VfU0laRSk7CisJaWYgKCFJU19FUlIocGF0aCkpIHsKKwkJaW50IGxlbiA9IFBBR0VfU0laRSArIHBhZ2UgLSBwYXRoOworCQljaGFyICp0bXAgPSBwYXRoOworCisJCXBhdGggPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChwYXRoKQorCQkJbWVtY3B5KHBhdGgsIHRtcCwgbGVuKTsKKwkJZWxzZQorCQkJcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwlyZXR1cm4gcGF0aDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmZzNF9jbG9uZV9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRhdGEtPmRlbnRyeTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCisJc2VydmVyLT5mc2lkID0gZGF0YS0+ZmF0dHItPmZzaWQ7CisJbmZzX2NvcHlfZmgoJnNlcnZlci0+ZmgsIGRhdGEtPmZoKTsKKwlzZXJ2ZXItPm1udF9wYXRoID0gbmZzNF9kdXBfcGF0aChkZW50cnkpOworCWlmIChJU19FUlIoc2VydmVyLT5tbnRfcGF0aCkpIHsKKwkJc2IgPSAoc3RydWN0IHN1cGVyX2Jsb2NrICopc2VydmVyLT5tbnRfcGF0aDsKKwkJZ290byBlcnI7CisJfQorCXNiID0gc2dldCgmbmZzNF9mc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisJaWYgKElTX0VSUihzYikgfHwgc2ItPnNfcm9vdCkKKwkJZ290byBmcmVlX3BhdGg7CisJbmZzNF9zZXJ2ZXJfY2FwYWJpbGl0aWVzKHNlcnZlciwgJnNlcnZlci0+ZmgpOworCisJZG93bl93cml0ZSgmY2xwLT5jbF9zZW0pOworCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bmZzNF9zaWJsaW5ncywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJcmV0dXJuIHNiOworZnJlZV9wYXRoOgorCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworZXJyOgorCXNlcnZlci0+bW50X3BhdGggPSBOVUxMOworCXJldHVybiBzYjsKK30KKworc3RhdGljIGludCBuZnNfY2xvbmVfbmZzNF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEgPSByYXdfZGF0YTsKKwlyZXR1cm4gbmZzX2Nsb25lX2dlbmVyaWNfc2IoZGF0YSwgbmZzNF9jbG9uZV9zYiwgbmZzX2Nsb25lX3NlcnZlciwgbW50KTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmZzNF9yZWZlcnJhbF9zYihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4oZGF0YS0+bW50X3BhdGgpICsgMTsKKwlzZXJ2ZXItPm1udF9wYXRoID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmIChzZXJ2ZXItPm1udF9wYXRoID09IE5VTEwpCisJCWdvdG8gZXJyOworCW1lbWNweShzZXJ2ZXItPm1udF9wYXRoLCBkYXRhLT5tbnRfcGF0aCwgbGVuKTsKKwltZW1jcHkoJnNlcnZlci0+YWRkciwgZGF0YS0+YWRkciwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworCisJc2IgPSBzZ2V0KCZuZnM0X2ZzX3R5cGUsIG5mczRfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKKwlpZiAoSVNfRVJSKHNiKSB8fCBzYi0+c19yb290KQorCQlnb3RvIGZyZWVfcGF0aDsKKwlyZXR1cm4gc2I7CitmcmVlX3BhdGg6CisJa2ZyZWUoc2VydmVyLT5tbnRfcGF0aCk7CitlcnI6CisJc2VydmVyLT5tbnRfcGF0aCA9IE5VTEw7CisJcmV0dXJuIHNiOworfQorCitzdGF0aWMgc3RydWN0IG5mc19zZXJ2ZXIgKm5mczRfcmVmZXJyYWxfc2VydmVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfY2xvbmVfbW91bnQgKmRhdGEpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzYik7CisJc3RydWN0IHJwY190aW1lb3V0IHRpbWVwYXJtczsKKwlpbnQgcHJvdG8sIHRpbWVvLCByZXRyYW5zOworCXZvaWQgKmVycjsKKworCXByb3RvID0gSVBQUk9UT19UQ1A7CisJLyogU2luY2Ugd2UgYXJlIGZvbGxvd2luZyBhIHJlZmVycmFsIGFuZCB0aGVyZSBtYXkgYmUgYWx0ZXJuYXRpdmVzLAorCSAgIHNldCB0aGUgdGltZW91dHMgYW5kIHJldHJpZXMgdG8gbG93IHZhbHVlcyAqLworCXRpbWVvID0gMjsKKwlyZXRyYW5zID0gMTsKKwluZnNfaW5pdF90aW1lb3V0X3ZhbHVlcygmdGltZXBhcm1zLCBwcm90bywgdGltZW8sIHJldHJhbnMpOworCisJc2VydmVyLT5jbGllbnQgPSBuZnM0X2NyZWF0ZV9jbGllbnQoc2VydmVyLCAmdGltZXBhcm1zLCBwcm90bywgZGF0YS0+YXV0aGZsYXZvcik7CisJaWYgKElTX0VSUigoZXJyID0gc2VydmVyLT5jbGllbnQpKSkKKwkJZ290byBvdXRfZXJyOworCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlzYi0+c19vcCA9ICZuZnM0X3NvcHM7CisJZXJyID0gRVJSX1BUUihuZnNfc2JfaW5pdChzYiwgZGF0YS0+YXV0aGZsYXZvcikpOworCWlmICghSVNfRVJSKGVycikpCisJCXJldHVybiBzZXJ2ZXI7CitvdXRfZXJyOgorCXJldHVybiAoc3RydWN0IG5mc19zZXJ2ZXIgKillcnI7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JlZmVycmFsX25mczRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgbmZzX2Nsb25lX21vdW50ICpkYXRhID0gcmF3X2RhdGE7CisJcmV0dXJuIG5mc19jbG9uZV9nZW5lcmljX3NiKGRhdGEsIG5mczRfcmVmZXJyYWxfc2IsIG5mczRfcmVmZXJyYWxfc2VydmVyLCBtbnQpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL25mcy9zeW1saW5rLmMgYi9mcy9uZnMvc3ltbGluay5jCmluZGV4IDE4ZGM5NWIuLjYwMGJiZTYgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9zeW1saW5rLmMKKysrIGIvZnMvbmZzL3N5bWxpbmsuYwpAQCAtNTIsNyArNTIsNyBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jdm9pZCAqZXJyID0gRVJSX1BUUihuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpKTsKKwl2b2lkICplcnIgPSBFUlJfUFRSKG5mc19yZXZhbGlkYXRlX21hcHBpbmcoaW5vZGUsIGlub2RlLT5pX21hcHBpbmcpKTsKIAlpZiAoZXJyKQogCQlnb3RvIHJlYWRfZmFpbGVkOwogCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIDAsCkBAIC03NSwyMiArNzUsMTMgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgbmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQsIHZvaWQgKmNvb2tpZSkKLXsKLQlpZiAoY29va2llKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlID0gY29va2llOwotCQlrdW5tYXAocGFnZSk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQl9Ci19Ci0KIC8qCiAgKiBzeW1saW5rcyBjYW4ndCBkbyBtdWNoLi4uCiAgKi8KIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKIAkuZm9sbG93X2xpbmsJPSBuZnNfZm9sbG93X2xpbmssCi0JLnB1dF9saW5rCT0gbmZzX3B1dF9saW5rLAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCiAJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKIAkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAogfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9zeXNjdGwuYyBiL2ZzL25mcy9zeXNjdGwuYwppbmRleCA0YzQ4NmViLi5kYjYxZTUxIDEwMDY0NAotLS0gYS9mcy9uZnMvc3lzY3RsLmMKKysrIGIvZnMvbmZzL3N5c2N0bC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzNC5oPgogI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgogCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKIApAQCAtNDYsNiArNDcsMTUgQEAKIAkJLnN0cmF0ZWd5ID0gJnN5c2N0bF9qaWZmaWVzLAogCX0sCiAjZW5kaWYKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibmZzX21vdW50cG9pbnRfdGltZW91dCIsCisJCS5kYXRhCQk9ICZuZnNfbW91bnRwb2ludF9leHBpcnlfdGltZW91dCwKKwkJLm1heGxlbgkJPSBzaXplb2YobmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfamlmZmllcywKKwkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9qaWZmaWVzLAorCX0sCiAJeyAuY3RsX25hbWUgPSAwIH0KIH07CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy93cml0ZS5jIGIvZnMvbmZzL3dyaXRlLmMKaW5kZXggNGNmYWRhMi4uYjM4M2ZkZCAxMDA2NDQKLS0tIGEvZnMvbmZzL3dyaXRlLmMKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTk4LDExICs5OCwxMCBAQAogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnAtPnBhZ2VzKTsKLQkJaWYgKHBhZ2Vjb3VudCA8IE5GU19QQUdFVkVDX1NJWkUpCi0JCQlwLT5wYWdldmVjID0gJnAtPnBhZ2VfYXJyYXlbMF07CisJCWlmIChwYWdlY291bnQgPD0gQVJSQVlfU0laRShwLT5wYWdlX2FycmF5KSkKKwkJCXAtPnBhZ2V2ZWMgPSBwLT5wYWdlX2FycmF5OwogCQllbHNlIHsKLQkJCXNpemVfdCBzaXplID0gKytwYWdlY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0JCQlwLT5wYWdldmVjID0ga3phbGxvYyhzaXplLCBHRlBfTk9GUyk7CisJCQlwLT5wYWdldmVjID0ga2NhbGxvYyhwYWdlY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX05PRlMpOwogCQkJaWYgKCFwLT5wYWdldmVjKSB7CiAJCQkJbWVtcG9vbF9mcmVlKHAsIG5mc19jb21taXRfbWVtcG9vbCk7CiAJCQkJcCA9IE5VTEw7CkBAIC0xMjYsMTQgKzEyNSwxMSBAQAogCWlmIChwKSB7CiAJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKIAkJSU5JVF9MSVNUX0hFQUQoJnAtPnBhZ2VzKTsKLQkJaWYgKHBhZ2Vjb3VudCA8IE5GU19QQUdFVkVDX1NJWkUpCi0JCQlwLT5wYWdldmVjID0gJnAtPnBhZ2VfYXJyYXlbMF07CisJCWlmIChwYWdlY291bnQgPD0gQVJSQVlfU0laRShwLT5wYWdlX2FycmF5KSkKKwkJCXAtPnBhZ2V2ZWMgPSBwLT5wYWdlX2FycmF5OwogCQllbHNlIHsKLQkJCXNpemVfdCBzaXplID0gKytwYWdlY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKik7Ci0JCQlwLT5wYWdldmVjID0ga21hbGxvYyhzaXplLCBHRlBfTk9GUyk7Ci0JCQlpZiAocC0+cGFnZXZlYykgewotCQkJCW1lbXNldChwLT5wYWdldmVjLCAwLCBzaXplKTsKLQkJCX0gZWxzZSB7CisJCQlwLT5wYWdldmVjID0ga2NhbGxvYyhwYWdlY291bnQsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwgR0ZQX05PRlMpOworCQkJaWYgKCFwLT5wYWdldmVjKSB7CiAJCQkJbWVtcG9vbF9mcmVlKHAsIG5mc193ZGF0YV9tZW1wb29sKTsKIAkJCQlwID0gTlVMTDsKIAkJCX0KQEAgLTU4Myw2ICs1NzksMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBuZnNfY2FuY2VsX3JlcXVlc3RzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXE7CisJd2hpbGUoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfY2xlYXJfcGFnZV93cml0ZWJhY2socmVxKTsKKwl9Cit9CisKIC8qCiAgKiBuZnNfc2Nhbl9kaXJ0eSAtIFNjYW4gYW4gaW5vZGUgZm9yIGRpcnR5IHJlcXVlc3RzCiAgKiBAaW5vZGU6IE5GUyBpbm9kZSB0byBzY2FuCkBAIC02MjcsNyArNjM0LDcgQEAKIAlpbnQgcmVzID0gMDsKIAogCWlmIChuZnNpLT5uY29tbWl0ICE9IDApIHsKLQkJcmVzID0gbmZzX3NjYW5fbGlzdCgmbmZzaS0+Y29tbWl0LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwkJcmVzID0gbmZzX3NjYW5fbGlzdChuZnNpLCAmbmZzaS0+Y29tbWl0LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKIAkJbmZzaS0+bmNvbW1pdCAtPSByZXM7CiAJCWlmICgobmZzaS0+bmNvbW1pdCA9PSAwKSAhPSBsaXN0X2VtcHR5KCZuZnNpLT5jb21taXQpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJORlM6IGRlc3luY2hyb25pemVkIHZhbHVlIG9mIG5mc19pLm5jb21taXQuXG4iKTsKQEAgLTE0OTUsMTUgKzE1MDIsMjUgQEAKIAkJcGFnZXMgPSBuZnNfc2Nhbl9kaXJ0eShpbm9kZSwgJmhlYWQsIGlkeF9zdGFydCwgbnBhZ2VzKTsKIAkJaWYgKHBhZ2VzICE9IDApIHsKIAkJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7Ci0JCQlyZXQgPSBuZnNfZmx1c2hfbGlzdChpbm9kZSwgJmhlYWQsIHBhZ2VzLCBob3cpOworCQkJaWYgKGhvdyAmIEZMVVNIX0lOVkFMSURBVEUpCisJCQkJbmZzX2NhbmNlbF9yZXF1ZXN0cygmaGVhZCk7CisJCQllbHNlCisJCQkJcmV0ID0gbmZzX2ZsdXNoX2xpc3QoaW5vZGUsICZoZWFkLCBwYWdlcywgaG93KTsKIAkJCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKG5vY29tbWl0KQogCQkJYnJlYWs7Ci0JCXBhZ2VzID0gbmZzX3NjYW5fY29tbWl0KGlub2RlLCAmaGVhZCwgMCwgMCk7CisJCXBhZ2VzID0gbmZzX3NjYW5fY29tbWl0KGlub2RlLCAmaGVhZCwgaWR4X3N0YXJ0LCBucGFnZXMpOwogCQlpZiAocGFnZXMgPT0gMCkKIAkJCWJyZWFrOworCQlpZiAoaG93ICYgRkxVU0hfSU5WQUxJREFURSkgeworCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCW5mc19jYW5jZWxfcmVxdWVzdHMoJmhlYWQpOworCQkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlwYWdlcyArPSBuZnNfc2Nhbl9jb21taXQoaW5vZGUsICZoZWFkLCAwLCAwKTsKIAkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKIAkJcmV0ID0gbmZzX2NvbW1pdF9saXN0KGlub2RlLCAmaGVhZCwgaG93KTsKIAkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CkBAIC0xNTEyLDcgKzE1MjksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQoraW50IF9faW5pdCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQogewogCW5mc193ZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3dyaXRlX2RhdGEiLAogCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEpLApAQCAtMTUzNCw3ICsxNTUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKQordm9pZCBfX2V4aXQgbmZzX2Rlc3Ryb3lfd3JpdGVwYWdlY2FjaGUodm9pZCkKIHsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX2NvbW1pdF9tZW1wb29sKTsKIAltZW1wb29sX2Rlc3Ryb3kobmZzX3dkYXRhX21lbXBvb2wpOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCBkZTM5OThmLi41NDQ2YTA4IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMTMxMCw3ICsxMzEwLDcgQEAKIAlpZiAoKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfRklMRVNfRlJFRSB8IEZBVFRSNF9XT1JEMF9GSUxFU19UT1RBTCkpIHx8CiAJICAgIChibXZhbDEgJiAoRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMIHwgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUgfAogCQkgICAgICAgRkFUVFI0X1dPUkQxX1NQQUNFX1RPVEFMKSkpIHsKLQkJc3RhdHVzID0gdmZzX3N0YXRmcyhkZW50cnktPmRfaW5vZGUtPmlfc2IsICZzdGF0ZnMpOworCQlzdGF0dXMgPSB2ZnNfc3RhdGZzKGRlbnRyeSwgJnN0YXRmcyk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnNjdGwuYyBiL2ZzL25mc2QvbmZzY3RsLmMKaW5kZXggM2VmMDE3Yi4uYTE4MTBlNiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjdGwuYworKysgYi9mcy9uZnNkL25mc2N0bC5jCkBAIC00OTQsMTAgKzQ5NCwxMCBAQAogCXJldHVybiBzaW1wbGVfZmlsbF9zdXBlcihzYiwgMHg2ZTY2NzM2NCwgbmZzZF9maWxlcyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc2RfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG5mc2RfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBuZnNkX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBuZnNkX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBuZnNkX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9uZnNkL3Zmcy5jIGIvZnMvbmZzZC92ZnMuYwppbmRleCAxZDY1ZjEzLi4yNDVlYWExIDEwMDY0NAotLS0gYS9mcy9uZnNkL3Zmcy5jCisrKyBiL2ZzL25mc2QvdmZzLmMKQEAgLTE3MzcsNyArMTczNyw3IEBACiBuZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBrc3RhdGZzICpzdGF0KQogewogCWludCBlcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTUFZX05PUCk7Ci0JaWYgKCFlcnIgJiYgdmZzX3N0YXRmcyhmaHAtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYixzdGF0KSkKKwlpZiAoIWVyciAmJiB2ZnNfc3RhdGZzKGZocC0+ZmhfZGVudHJ5LHN0YXQpKQogCQllcnIgPSBuZnNlcnJfaW87CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYW9wcy5oIGIvZnMvbnRmcy9hb3BzLmgKaW5kZXggM2I3NGU2Ni4uMzI1Y2UyNiAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hb3BzLmgKKysrIGIvZnMvbnRmcy9hb3BzLmgKQEAgLTg2LDggKzg2LDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKm50ZnNfbWFwX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCiAJCXVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsCi0JCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBpbmRleCwgTlVMTCk7CiAKIAlpZiAoIUlTX0VSUihwYWdlKSkgewogCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9hdHRyaWIuYyBiL2ZzL250ZnMvYXR0cmliLmMKaW5kZXggMTY2M2Y1Yy4uNjcwOGUxZCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9hdHRyaWIuYworKysgYi9mcy9udGZzL2F0dHJpYi5jCkBAIC0yNTI5LDggKzI1MjksNyBAQAogCWVuZCA+Pj0gUEFHRV9DQUNIRV9TSElGVDsKIAkvKiBJZiB0aGVyZSBpcyBhIGZpcnN0IHBhcnRpYWwgcGFnZSwgbmVlZCB0byBkbyBpdCB0aGUgc2xvdyB3YXkuICovCiAJaWYgKHN0YXJ0X29mcykgewotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGlkeCwKLQkJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCBpZHgsIE5VTEwpOwogCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CiAJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmaXJzdCBwYXJ0aWFsICIKIAkJCQkJInBhZ2UgKHN5bmMgZXJyb3IsIGluZGV4IDB4JWx4KS4iLCBpZHgpOwpAQCAtMjYwMCw4ICsyNTk5LDcgQEAKIAl9CiAJLyogSWYgdGhlcmUgaXMgYSBsYXN0IHBhcnRpYWwgcGFnZSwgbmVlZCB0byBkbyBpdCB0aGUgc2xvdyB3YXkuICovCiAJaWYgKGVuZF9vZnMpIHsKLQkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpZHgsCi0JCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgaWR4LCBOVUxMKTsKIAkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgbGFzdCBwYXJ0aWFsIHBhZ2UgIgogCQkJCQkiKHN5bmMgZXJyb3IsIGluZGV4IDB4JWx4KS4iLCBpZHgpOwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCBjNjNhODNlLi4yZTQyYzJkIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMjMxLDggKzIzMSw3IEBACiAJCSAqIFJlYWQgdGhlIHBhZ2UuICBJZiB0aGUgcGFnZSBpcyBub3QgcHJlc2VudCwgdGhpcyB3aWxsIHplcm8KIAkJICogdGhlIHVuaW5pdGlhbGl6ZWQgcmVnaW9ucyBmb3IgdXMuCiAJCSAqLwotCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LAotCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIGluZGV4LCBOVUxMKTsKIAkJaWYgKElTX0VSUihwYWdlKSkgewogCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKIAkJCWdvdG8gaW5pdF9lcnJfb3V0OwpAQCAtMTM1OSw3ICsxMzU4LDcgQEAKIAlnb3RvIG91dDsKIH0KIAotc3RhdGljIHNpemVfdCBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWMoY2hhciAqdmFkZHIsCitzdGF0aWMgc2l6ZV90IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhjaGFyICp2YWRkciwKIAkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHNpemVfdCBpb3Zfb2ZzLCBzaXplX3QgYnl0ZXMpCiB7CiAJc2l6ZV90IHRvdGFsID0gMDsKQEAgLTEzNzcsMTAgKzEzNzYsNiBAQAogCQlieXRlcyAtPSBsZW47CiAJCXZhZGRyICs9IGxlbjsKIAkJaWYgKHVubGlrZWx5KGxlZnQpKSB7Ci0JCQkvKgotCQkJICogWmVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlcigpLgotCQkJICovCi0JCQltZW1zZXQodmFkZHIsIDAsIGJ5dGVzKTsKIAkJCXRvdGFsIC09IGxlZnQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMTQyMSwxMSArMTQxNiwxMyBAQAogICogcGFnZXMgKG91dCB0byBvZmZzZXQgKyBieXRlcyksIHRvIGVtdWxhdGUgbnRmc19jb3B5X2Zyb21fdXNlcigpJ3MKICAqIHNpbmdsZS1zZWdtZW50IGJlaGF2aW91ci4KICAqCi0gKiBXZSBjYWxsIHRoZSBzYW1lIGhlbHBlciAoX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKCkpIGJvdGggd2hlbiBhdG9taWMgYW5kCi0gKiB3aGVuIG5vdCBhdG9taWMuICBUaGlzIGlzIG9rIGJlY2F1c2UgX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKCkgY2FsbHMKLSAqIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBhbmQgaXQgaXMgb2sgdG8gY2FsbCB0aGlzIHdoZW4gbm9uLWF0b21pYy4gIEluCi0gKiBmYWN0LCB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpIGFuZAotICogX19jb3B5X2Zyb21fdXNlcigpIGlzIHRoYXQgdGhlIGxhdHRlciBjYWxscyBtaWdodF9zbGVlcCgpLiAgQW5kIG9uIG1hbnkKKyAqIFdlIGNhbGwgdGhlIHNhbWUgaGVscGVyIChfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoKSkgYm90aAorICogd2hlbiBhdG9taWMgYW5kIHdoZW4gbm90IGF0b21pYy4gIFRoaXMgaXMgb2sgYmVjYXVzZQorICogX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKCkgY2FsbHMgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYygpCisgKiBhbmQgaXQgaXMgb2sgdG8gY2FsbCB0aGlzIHdoZW4gbm9uLWF0b21pYy4KKyAqIEluZmFjdCwgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBhbmQKKyAqIF9fY29weV9mcm9tX3VzZXIoKSBpcyB0aGF0IHRoZSBsYXR0ZXIgY2FsbHMgbWlnaHRfc2xlZXAoKSBhbmQgdGhlIGZvcm1lcgorICogc2hvdWxkIG5vdCB6ZXJvIHRoZSB0YWlsIG9mIHRoZSBidWZmZXIgb24gZXJyb3IuICBBbmQgb24gbWFueQogICogYXJjaGl0ZWN0dXJlcyBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgaXMganVzdCBkZWZpbmVkIHRvCiAgKiBfX2NvcHlfZnJvbV91c2VyKCkgc28gaXQgbWFrZXMgbm8gZGlmZmVyZW5jZSBhdCBhbGwgb24gdGhvc2UgYXJjaGl0ZWN0dXJlcy4KICAqLwpAQCAtMTQ0MiwxNCArMTQzOSwxOCBAQAogCQlpZiAobGVuID4gYnl0ZXMpCiAJCQlsZW4gPSBieXRlczsKIAkJa2FkZHIgPSBrbWFwX2F0b21pYygqcGFnZXMsIEtNX1VTRVIwKTsKLQkJY29waWVkID0gX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKGthZGRyICsgb2ZzLAorCQljb3BpZWQgPSBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoa2FkZHIgKyBvZnMsCiAJCQkJKmlvdiwgKmlvdl9vZnMsIGxlbik7CiAJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKIAkJaWYgKHVubGlrZWx5KGNvcGllZCAhPSBsZW4pKSB7CiAJCQkvKiBEbyBpdCB0aGUgc2xvdyB3YXkuICovCiAJCQlrYWRkciA9IGttYXAoKnBhZ2VzKTsKLQkJCWNvcGllZCA9IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlYyhrYWRkciArIG9mcywKKwkJCWNvcGllZCA9IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhrYWRkciArIG9mcywKIAkJCQkJKmlvdiwgKmlvdl9vZnMsIGxlbik7CisJCQkvKgorCQkJICogWmVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlcigpLgorCQkJICovCisJCQltZW1zZXQoa2FkZHIgKyBvZnMgKyBjb3BpZWQsIDAsIGxlbiAtIGNvcGllZCk7CiAJCQlrdW5tYXAoKnBhZ2VzKTsKIAkJCWlmICh1bmxpa2VseShjb3BpZWQgIT0gbGVuKSkKIAkJCQlnb3RvIGVycl9vdXQ7CkBAIC0xNDg0LDE0ICsxNDg1LDE1IEBACiAJCXVuc2lnbmVkIG5yX3BhZ2VzKQogewogCUJVR19PTighbnJfcGFnZXMpOworCS8qCisJICogV2FybmluZzogRG8gbm90IGRvIHRoZSBkZWNyZW1lbnQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgY2FsbCB0bworCSAqIGZsdXNoX2RjYWNoZV9wYWdlKCkgYmVjYXVzZSBpdCBpcyBhIE5VTEwgbWFjcm8gb24gaTM4NiBhbmQgaGVuY2UgdGhlCisJICogZGVjcmVtZW50IG5ldmVyIGhhcHBlbnMgc28gdGhlIGxvb3AgbmV2ZXIgdGVybWluYXRlcy4KKwkgKi8KIAlkbyB7Ci0JCS8qCi0JCSAqIFdhcm5pbmc6IERvIG5vdCBkbyB0aGUgZGVjcmVtZW50IGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlCi0JCSAqIGNhbGwgYmVjYXVzZSBmbHVzaF9kY2FjaGVfcGFnZSgpIGlzIGEgTlVMTCBtYWNybyBvbiBpMzg2Ci0JCSAqIGFuZCBoZW5jZSB0aGUgZGVjcmVtZW50IG5ldmVyIGhhcHBlbnMuCi0JCSAqLworCQktLW5yX3BhZ2VzOwogCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlc1tucl9wYWdlc10pOwotCX0gd2hpbGUgKC0tbnJfcGFnZXMgPiAwKTsKKwl9IHdoaWxlIChucl9wYWdlcyA+IDApOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3VwZXIuYyBiL2ZzL250ZnMvc3VwZXIuYwppbmRleCAyNzgzM2Y2Li4wZTE0YWNlIDEwMDY0NAotLS0gYS9mcy9udGZzL3N1cGVyLmMKKysrIGIvZnMvbnRmcy9zdXBlci5jCkBAIC0yNjAxLDEwICsyNjAxLDEwIEBACiAKIC8qKgogICogbnRmc19zdGF0ZnMgLSByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgbW91bnRlZCBOVEZTIHZvbHVtZQotICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBkZW50cnk6CWRlbnRyeSBmcm9tIG1vdW50ZWQgdm9sdW1lCiAgKiBAc2ZzOglzdGF0ZnMgc3RydWN0dXJlIGluIHdoaWNoIHRvIHJldHVybiB0aGUgaW5mb3JtYXRpb24KICAqCi0gKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdW50ZWQgTlRGUyB2b2x1bWUgQHNiIGluIHRoZSBzdGF0ZnMgc3RydWN0dXJlCisgKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vdW50ZWQgTlRGUyB2b2x1bWUgQGRlbnRyeSBpbiB0aGUgc3RhdGZzIHN0cnVjdHVyZQogICogcG9pbnRlZCB0byBieSBAc2ZzICh0aGlzIGlzIGluaXRpYWxpemVkIHdpdGggemVyb3MgYmVmb3JlIG50ZnNfc3RhdGZzIGlzCiAgKiBjYWxsZWQpLiBXZSBpbnRlcnByZXQgdGhlIHZhbHVlcyB0byBiZSBjb3JyZWN0IG9mIHRoZSBtb21lbnQgaW4gdGltZSBhdAogICogd2hpY2ggd2UgYXJlIGNhbGxlZC4gTW9zdCB2YWx1ZXMgYXJlIHZhcmlhYmxlIG90aGVyd2lzZSBhbmQgdGhpcyBpc24ndCBqdXN0CkBAIC0yNjE3LDggKzI2MTcsOSBAQAogICoKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLWVycm5vIG9uIGVycm9yLgogICovCi1zdGF0aWMgaW50IG50ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpCitzdGF0aWMgaW50IG50ZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKnNmcykKIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOwogCXM2NCBzaXplOwogCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKIAludGZzX2lub2RlICptZnRfbmkgPSBOVEZTX0kodm9sLT5tZnRfaW5vKTsKQEAgLTMwOTMsMTAgKzMwOTQsMTEgQEAKIC8qIERyaXZlciB3aWRlIG11dGV4LiAqLwogREVGSU5FX01VVEVYKG50ZnNfbG9jayk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm50ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG50ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG50ZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbnRmc19maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG50ZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbS9kbG1mcy5jIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKaW5kZXggN2U4OGUyNC4uNzI3M2Q5ZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGxtL2RsbWZzLmMKKysrIGIvZnMvb2NmczIvZGxtL2RsbWZzLmMKQEAgLTU3NCwxMCArNTc0LDEwIEBACiAJLmdldGF0dHIJPSBzaW1wbGVfZ2V0YXR0ciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmRsbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBkbG1mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgZGxtZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgZGxtZnNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGRsbWZzX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zdXBlci5jIGIvZnMvb2NmczIvc3VwZXIuYwppbmRleCA5NDliM2RhLi5jZGY3MzM5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9zdXBlci5jCisrKyBiL2ZzL29jZnMyL3N1cGVyLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogc3RhdGljIHZvaWQgb2NmczJfZnJlZV9tZW1fY2FjaGVzKHZvaWQpOwogc3RhdGljIHZvaWQgb2NmczJfZGVsZXRlX29zYihzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYik7CiAKLXN0YXRpYyBpbnQgb2NmczJfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpOworc3RhdGljIGludCBvY2ZzMl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKIAogc3RhdGljIGludCBvY2ZzMl9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KTsKIApAQCAtNjcyLDEyICs2NzIsMTQgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpvY2ZzMl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJCWludCBmbGFncywKLQkJCQkJY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IG9jZnMyX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCWludCBmbGFncywKKwkJCWNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAqZGF0YSwKKwkJCXN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG9jZnMyX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG9jZnMyX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgb2NmczJfZnNfdHlwZSA9IHsKQEAgLTg1NSw3ICs4NTcsNyBAQAogCW1sb2dfZXhpdF92b2lkKCk7CiB9CiAKLXN0YXRpYyBpbnQgb2NmczJfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IG9jZnMyX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CiAJc3RydWN0IG9jZnMyX3N1cGVyICpvc2I7CiAJdTMyIG51bWJpdHMsIGZyZWViaXRzOwpAQCAtODY0LDkgKzg2Niw5IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CiAKLQltbG9nX2VudHJ5KCIoJXAsICVwKVxuIiwgc2IsIGJ1Zik7CisJbWxvZ19lbnRyeSgiKCVwLCAlcClcbiIsIGRlbnRyeS0+ZF9zYiwgYnVmKTsKIAotCW9zYiA9IE9DRlMyX1NCKHNiKTsKKwlvc2IgPSBPQ0ZTMl9TQihkZW50cnktPmRfc2IpOwogCiAJaW5vZGUgPSBvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLAogCQkJCQkgICAgR0xPQkFMX0JJVE1BUF9TWVNURU1fSU5PREUsCkBAIC04ODksNyArODkxLDcgQEAKIAlmcmVlYml0cyA9IG51bWJpdHMgLSBsZTMyX3RvX2NwdShibV9sb2NrLT5pZDEuYml0bWFwMS5pX3VzZWQpOwogCiAJYnVmLT5mX3R5cGUgPSBPQ0ZTMl9TVVBFUl9NQUdJQzsKLQlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2JzaXplID0gZGVudHJ5LT5kX3NiLT5zX2Jsb2Nrc2l6ZTsKIAlidWYtPmZfbmFtZWxlbiA9IE9DRlMyX01BWF9GSUxFTkFNRV9MRU47CiAJYnVmLT5mX2Jsb2NrcyA9ICgoc2VjdG9yX3QpIG51bWJpdHMpICoKIAkJCShvc2ItPnNfY2x1c3RlcnNpemUgPj4gb3NiLT5zYi0+c19ibG9ja3NpemVfYml0cyk7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9zeW1saW5rLmMgYi9mcy9vY2ZzMi9zeW1saW5rLmMKaW5kZXggZjY5ODZiZC4uMGM4YTEyOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ltbGluay5jCisrKyBiL2ZzL29jZnMyL3N5bWxpbmsuYwpAQCAtNjQsOCArNjQsNyBAQAogewogCXN0cnVjdCBwYWdlICogcGFnZTsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgMCwKLQkJCSAgICAgICAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCXBhZ2UgPSByZWFkX21hcHBpbmdfcGFnZShtYXBwaW5nLCAwLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHBhZ2UpKQogCQlnb3RvIHN5bmNfZmFpbDsKIAl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDRmMTc4YWMuLjMwM2YwNmQgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTMxLDE4ICszMSwxOCBAQAogCiAjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgogCi1pbnQgdmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoraW50IHZmc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCWludCByZXR2YWwgPSAtRU5PREVWOwogCi0JaWYgKHNiKSB7CisJaWYgKGRlbnRyeSkgewogCQlyZXR2YWwgPSAtRU5PU1lTOwotCQlpZiAoc2ItPnNfb3AtPnN0YXRmcykgeworCQlpZiAoZGVudHJ5LT5kX3NiLT5zX29wLT5zdGF0ZnMpIHsKIAkJCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7Ci0JCQlyZXR2YWwgPSBzZWN1cml0eV9zYl9zdGF0ZnMoc2IpOworCQkJcmV0dmFsID0gc2VjdXJpdHlfc2Jfc3RhdGZzKGRlbnRyeSk7CiAJCQlpZiAocmV0dmFsKQogCQkJCXJldHVybiByZXR2YWw7Ci0JCQlyZXR2YWwgPSBzYi0+c19vcC0+c3RhdGZzKHNiLCBidWYpOworCQkJcmV0dmFsID0gZGVudHJ5LT5kX3NiLT5zX29wLT5zdGF0ZnMoZGVudHJ5LCBidWYpOwogCQkJaWYgKHJldHZhbCA9PSAwICYmIGJ1Zi0+Zl9mcnNpemUgPT0gMCkKIAkJCQlidWYtPmZfZnJzaXplID0gYnVmLT5mX2JzaXplOwogCQl9CkBAIC01MiwxMiArNTIsMTIgQEAKIAogRVhQT1JUX1NZTUJPTCh2ZnNfc3RhdGZzKTsKIAotc3RhdGljIGludCB2ZnNfc3RhdGZzX25hdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc3RhdGZzICpidWYpCitzdGF0aWMgaW50IHZmc19zdGF0ZnNfbmF0aXZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN0YXRmcyAqYnVmKQogewogCXN0cnVjdCBrc3RhdGZzIHN0OwogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSB2ZnNfc3RhdGZzKHNiLCAmc3QpOworCXJldHZhbCA9IHZmc19zdGF0ZnMoZGVudHJ5LCAmc3QpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKQEAgLTk1LDEyICs5NSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZmc19zdGF0ZnM2NChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc3RhdGZzNjQgKmJ1ZikKK3N0YXRpYyBpbnQgdmZzX3N0YXRmczY0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHN0YXRmczY0ICpidWYpCiB7CiAJc3RydWN0IGtzdGF0ZnMgc3Q7CiAJaW50IHJldHZhbDsKIAotCXJldHZhbCA9IHZmc19zdGF0ZnMoc2IsICZzdCk7CisJcmV0dmFsID0gdmZzX3N0YXRmcyhkZW50cnksICZzdCk7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKIApAQCAtMTMwLDcgKzEzMCw3IEBACiAJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOwogCWlmICghZXJyb3IpIHsKIAkJc3RydWN0IHN0YXRmcyB0bXA7Ci0JCWVycm9yID0gdmZzX3N0YXRmc19uYXRpdmUobmQuZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwkJZXJyb3IgPSB2ZnNfc3RhdGZzX25hdGl2ZShuZC5kZW50cnksICZ0bXApOwogCQlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJCWVycm9yID0gLUVGQVVMVDsKIAkJcGF0aF9yZWxlYXNlKCZuZCk7CkBAIC0xNDksNyArMTQ5LDcgQEAKIAllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CiAJaWYgKCFlcnJvcikgewogCQlzdHJ1Y3Qgc3RhdGZzNjQgdG1wOwotCQllcnJvciA9IHZmc19zdGF0ZnM2NChuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQllcnJvciA9IHZmc19zdGF0ZnM2NChuZC5kZW50cnksICZ0bXApOwogCQlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJCWVycm9yID0gLUVGQVVMVDsKIAkJcGF0aF9yZWxlYXNlKCZuZCk7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnNfbmF0aXZlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwllcnJvciA9IHZmc19zdGF0ZnNfbmF0aXZlKGZpbGUtPmZfZGVudHJ5LCAmdG1wKTsKIAlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKIAkJZXJyb3IgPSAtRUZBVUxUOwogCWZwdXQoZmlsZSk7CkBAIC0xODksNyArMTg5LDcgQEAKIAlmaWxlID0gZmdldChmZCk7CiAJaWYgKCFmaWxlKQogCQlnb3RvIG91dDsKLQllcnJvciA9IHZmc19zdGF0ZnM2NChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJZXJyb3IgPSB2ZnNfc3RhdGZzNjQoZmlsZS0+Zl9kZW50cnksICZ0bXApOwogCWlmICghZXJyb3IgJiYgY29weV90b191c2VyKGJ1ZiwgJnRtcCwgc2l6ZW9mKHRtcCkpKQogCQllcnJvciA9IC1FRkFVTFQ7CiAJZnB1dChmaWxlKTsKQEAgLTMyMiw3ICszMjIsNyBAQAogCiAJZXJyb3IgPSBsb2Nrc192ZXJpZnlfdHJ1bmNhdGUoaW5vZGUsIGZpbGUsIGxlbmd0aCk7CiAJaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBkb190cnVuY2F0ZShkZW50cnksIGxlbmd0aCwgMCwgZmlsZSk7CisJCWVycm9yID0gZG9fdHJ1bmNhdGUoZGVudHJ5LCBsZW5ndGgsIEFUVFJfTVRJTUV8QVRUUl9DVElNRSwgZmlsZSk7CiBvdXRfcHV0ZjoKIAlmcHV0KGZpbGUpOwogb3V0OgpAQCAtMTE1Miw3ICsxMTUyLDcgQEAKIAl9CiAKIAlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5mbHVzaCkKLQkJcmV0dmFsID0gZmlscC0+Zl9vcC0+Zmx1c2goZmlscCk7CisJCXJldHZhbCA9IGZpbHAtPmZfb3AtPmZsdXNoKGZpbHAsIGlkKTsKIAogCWRub3RpZnlfZmx1c2goZmlscCwgaWQpOwogCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CmRpZmYgLS1naXQgYS9mcy9vcGVucHJvbWZzL2lub2RlLmMgYi9mcy9vcGVucHJvbWZzL2lub2RlLmMKaW5kZXggMGYxNDI3Ni4uZWZjN2M5MTEgMTAwNjQ0Ci0tLSBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYworKysgYi9mcy9vcGVucHJvbWZzL2lub2RlLmMKQEAgLTY0LDYgKzY0LDExIEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqb3BlbnByb21mc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogc3RhdGljIGludCBvcGVucHJvbWZzX3VubGluayAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CiAKK3N0YXRpYyBpbmxpbmUgdTE2IHB0cl9ub2Qodm9pZCAqcCkKK3sKKyAgICByZXR1cm4gKGxvbmcpcCAmIDB4RkZGRjsKK30KKwogc3RhdGljIHNzaXplX3Qgbm9kZW51bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewpAQCAtNzIsNyArNzcsNyBAQAogCQogCWlmIChjb3VudCA8IDAgfHwgIWlub2RlLT51LmdlbmVyaWNfaXApCiAJCXJldHVybiAtRUlOVkFMOwotCXNwcmludGYgKGJ1ZmZlciwgIiU4Ljh4XG4iLCAodTMyKShsb25nKShpbm9kZS0+dS5nZW5lcmljX2lwKSk7CisJc3ByaW50ZiAoYnVmZmVyLCAiJTguOGx4XG4iLCAobG9uZylpbm9kZS0+dS5nZW5lcmljX2lwKTsKIAlpZiAoZmlsZS0+Zl9wb3MgPj0gOSkKIAkJcmV0dXJuIDA7CiAJaWYgKGNvdW50ID4gOSAtIGZpbGUtPmZfcG9zKQpAQCAtOTUsOSArMTAwLDkgQEAKIAljaGFyIGJ1ZmZlcls2NF07CiAJCiAJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpIHsKLQkJbm9kZSA9IG5vZGVzWyh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApXS5ub2RlOworCQlub2RlID0gbm9kZXNbcHRyX25vZChpbm9kZS0+dS5nZW5lcmljX2lwKV0ubm9kZTsKIAkJaSA9ICgodTMyKShsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID4+IDE2OwotCQlpZiAoKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCkgPT0gYWxpYXNlcykgeworCQlpZiAocHRyX25vZChpbm9kZS0+dS5nZW5lcmljX2lwKSA9PSBhbGlhc2VzKSB7CiAJCQlpZiAoaSA+PSBhbGlhc2VzX25vZGVzKQogCQkJCXAgPSBOVUxMOwogCQkJZWxzZQpAQCAtMTExLDcgKzExNiw3IEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJaSA9IHByb21fZ2V0cHJvcGxlbiAobm9kZSwgcCk7CiAJCWlmIChpIDwgMCkgewotCQkJaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpCisJCQlpZiAocHRyX25vZChpbm9kZS0+dS5nZW5lcmljX2lwKSA9PSBhbGlhc2VzKQogCQkJCWkgPSAwOwogCQkJZWxzZQogCQkJCXJldHVybiAtRUlPOwpAQCAtMTIzLDcgKzEyOCw3IEBACiAJCQkJCSAgICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwkJb3AgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJCW9wLT5mbGFnID0gMDsKIAkJb3AtPmFsbG9jbGVuID0gMiAqIGk7CiAJCXN0cmNweSAob3AtPm5hbWUsIHApOwpAQCAtMTYzLDcgKzE2OCw3IEBACiAJCQkJb3AtPmxlbi0tOwogCQl9CiAJfSBlbHNlCi0JCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCQlvcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlpZiAoIWNvdW50IHx8ICEob3AtPmxlbiB8fCAob3AtPmZsYWcgJiBPUFBfQVNDSUlaKSkpCiAJCXJldHVybiAwOwogCWlmICgqcHBvcyA+PSAweGZmZmZmZiB8fCBjb3VudCA+PSAweGZmZmZmZikKQEAgLTMzNSw3ICszNDAsNyBAQAogCQkJcmV0dXJuIGk7CiAJfQogCWsgPSAqcHBvczsKLQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlvcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlpZiAoIShvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpKSB7CiAJCXUzMiAqZmlyc3QsICpsYXN0OwogCQlpbnQgZmlyc3Rfb2ZmLCBsYXN0X2NudDsKQEAgLTM4OCwxMyArMzkzLDEzIEBACiAJCQltZW1jcHkgKGIsIGZpbHAtPnByaXZhdGVfZGF0YSwKIAkJCQlzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQogCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4pOwotCQkJbWVtc2V0ICgoKGNoYXIgKiliKSArIHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCisJCQltZW1zZXQgKGIgKyBzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQogCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4sIAogCQkJCTAsIDIgKiBpIC0gb3AtPmFsbG9jbGVuKTsKLQkJCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopYjsKKwkJCW9wID0gYjsKIAkJCW9wLT5hbGxvY2xlbiA9IDIqaTsKIAkJCWIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JCQlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKW9wOworCQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gb3A7CiAJCQlrZnJlZSAoYik7CiAJCX0KIAkJZmlyc3QgPSAoKHUzMiAqKW9wLT52YWx1ZSkgKyAoayAvIDkpOwpAQCAtNDQ4LDEwICs0NTMsMTEgQEAKIAkJCQkJKnEgfD0gc2ltcGxlX3N0cnRvdWwgKHRtcCwgTlVMTCwgMTYpOwogCQkJCQlidWYgKz0gbGFzdF9jbnQ7CiAJCQkJfSBlbHNlIHsKLQkJCQkJY2hhciB0Y2hhcnNbMTddOyAvKiBYWFggeXVjay4uLiAqLworCQkJCQljaGFyIHRjaGFyc1syICogc2l6ZW9mKGxvbmcpICsgMV07CiAKLQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRjaGFycywgYnVmLCAxNikpCisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0Y2hhcnMsIGJ1Ziwgc2l6ZW9mKHRjaGFycykgLSAxKSkKIAkJCQkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjaGFyc1tzaXplb2YodGNoYXJzKSAtIDFdID0gJ1wwJzsKIAkJCQkJKnEgPSBzaW1wbGVfc3RydG91bCAodGNoYXJzLCBOVUxMLCAxNik7CiAJCQkJCWJ1ZiArPSA5OwogCQkJCX0KQEAgLTQ5NywxMyArNTAzLDEzIEBACiAJCQltZW1jcHkgKGIsIGZpbHAtPnByaXZhdGVfZGF0YSwKIAkJCQlzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQogCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4pOwotCQkJbWVtc2V0ICgoKGNoYXIgKiliKSArIHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCisJCQltZW1zZXQgKGIgKyBzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQogCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4sIAogCQkJCTAsIDIqKGNvdW50IC0gKnBwb3MpIC0gb3AtPmFsbG9jbGVuKTsKLQkJCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopYjsKKwkJCW9wID0gYjsKIAkJCW9wLT5hbGxvY2xlbiA9IDIqKGNvdW50ICsgKnBwb3MpOwogCQkJYiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQkJCWZpbHAtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopb3A7CisJCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBvcDsKIAkJCWtmcmVlIChiKTsKIAkJfQogCQlwID0gb3AtPnZhbHVlICsgKnBwb3MgLSAoKG9wLT5mbGFnICYgT1BQX1FVT1RFRCkgPyAxIDogMCk7CkBAIC01MzIsMTUgKzUzOCwxNSBAQAogCiBpbnQgcHJvcGVydHlfcmVsZWFzZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCiB7Ci0Jb3BlbnByb21fcHJvcGVydHkgKm9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCW9wZW5wcm9tX3Byb3BlcnR5ICpvcCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlpbnQgZXJyb3I7CiAJdTMyIG5vZGU7CiAJCiAJaWYgKCFvcCkKIAkJcmV0dXJuIDA7CiAJbG9ja19rZXJuZWwoKTsKLQlub2RlID0gbm9kZXNbKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCldLm5vZGU7Ci0JaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpIHsKKwlub2RlID0gbm9kZXNbcHRyX25vZChpbm9kZS0+dS5nZW5lcmljX2lwKV0ubm9kZTsKKwlpZiAocHRyX25vZChpbm9kZS0+dS5nZW5lcmljX2lwKSA9PSBhbGlhc2VzKSB7CiAJCWlmICgob3AtPmZsYWcgJiBPUFBfRElSVFkpICYmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpKSB7CiAJCQljaGFyICpwID0gb3AtPm5hbWU7CiAJCQlpbnQgaSA9IChvcC0+dmFsdWUgLSBvcC0+bmFtZSkgLSBzdHJsZW4gKG9wLT5uYW1lKSAtIDE7CkBAIC05MzEsNyArOTM3LDcgQEAKIAkJCXJldHVybiAtMTsKIAogCQlpZiAobm9kZXMpIHsKLQkJCW1lbWNweSAoKGNoYXIgKilwYWdlcywgKGNoYXIgKilub2RlcywKKwkJCW1lbWNweSAoKGNoYXIgKilwYWdlcywgbm9kZXMsCiAJCQkJKDEgPDwgYWxsb2NlZCkgKiBQQUdFX1NJWkUpOwogCQkJZnJlZV9wYWdlcyAoKHVuc2lnbmVkIGxvbmcpbm9kZXMsIGFsbG9jZWQpOwogCQl9CkBAIC0xMDU0LDEwICsxMDYwLDEwIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm9wZW5wcm9tX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBvcGVucHJvbV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG9wZW5wcm9tX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBvcGVucHJvbV9maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgb3BlbnByb21fZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvY2hlY2suYyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwppbmRleCA4ODUxYjgxLi4yZWYzMTNhIDEwMDY0NAotLS0gYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKKysrIGIvZnMvcGFydGl0aW9ucy9jaGVjay5jCkBAIC00ODQsNiArNDg0LDEwIEBACiAJCXNlY3Rvcl90IGZyb20gPSBzdGF0ZS0+cGFydHNbcF0uZnJvbTsKIAkJaWYgKCFzaXplKQogCQkJY29udGludWU7CisJCWlmIChmcm9tICsgc2l6ZSA+IGdldF9jYXBhY2l0eShkaXNrKSkgeworCQkJcHJpbnRrKCIgJXM6IHAlZCBleGNlZWRzIGRldmljZSBjYXBhY2l0eVxuIiwKKwkJCQlkaXNrLT5kaXNrX25hbWUsIHApOworCQl9CiAJCWFkZF9wYXJ0aXRpb24oZGlzaywgcCwgZnJvbSwgc2l6ZSk7CiAjaWZkZWYgQ09ORklHX0JMS19ERVZfTUQKIAkJaWYgKHN0YXRlLT5wYXJ0c1twXS5mbGFncykKQEAgLTQ5OSw4ICs1MDMsOCBAQAogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgKHBnb2ZmX3QpKG4gPj4gKFBBR0VfQ0FDSEVfU0hJRlQtOSkpLAotCQkJKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgKHBnb2ZmX3QpKG4gPj4gKFBBR0VfQ0FDSEVfU0hJRlQtOSkpLAorCQkJCSBOVUxMKTsKIAlpZiAoIUlTX0VSUihwYWdlKSkgewogCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwogCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCA1YWNkODk1Li4yMDM1MjU3IDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC05NzksMTIgKzk3OSwxMSBAQAogICogYW55IG9wZXJhdGlvbnMgb24gdGhlIHJvb3QgZGlyZWN0b3J5LiBIb3dldmVyLCB3ZSBuZWVkIGEgbm9uLXRyaXZpYWwKICAqIGRfbmFtZSAtIHBpcGU6IHdpbGwgZ28gbmljZWx5IGFuZCBraWxsIHRoZSBzcGVjaWFsLWNhc2luZyBpbiBwcm9jZnMuCiAgKi8KLQotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCi1waXBlZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCi0JICAgICAgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHBpcGVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwKKwkJCSBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAicGlwZToiLCBOVUxMLCBQSVBFRlNfTUFHSUMpOworCXJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJwaXBlOiIsIE5VTEwsIFBJUEVGU19NQUdJQywgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHBpcGVfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvcm9vdC5jIGIvZnMvcHJvYy9yb290LmMKaW5kZXggYzNmZDM2MS4uOTk5NTM1NiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9yb290LmMKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTI2LDEwICsyNiwxMCBAQAogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3N5c19yb290OwogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnByb2NfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHByb2NfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBwcm9jX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBwcm9jX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBwcm9jX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9xbng0L2lub2RlLmMgYi9mcy9xbng0L2lub2RlLmMKaW5kZXggMmVjZDQ2Zi4uMmYyNGM0NiAxMDA2NDQKLS0tIGEvZnMvcW54NC9pbm9kZS5jCisrKyBiL2ZzL3FueDQvaW5vZGUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiBzdGF0aWMgdm9pZCBxbng0X2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBzdGF0aWMgdm9pZCBxbng0X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIGludCBxbng0X3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7Ci1zdGF0aWMgaW50IHFueDRfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgcW54NF9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIAogc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHFueDRfc29wcyA9CiB7CkBAIC0yODIsOCArMjgyLDEwIEBACiAJcmV0dXJuIGJsb2NrOwogfQogCi1zdGF0aWMgaW50IHFueDRfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IHFueDRfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCiAJbG9ja19rZXJuZWwoKTsKIAogCWJ1Zi0+Zl90eXBlICAgID0gc2ItPnNfbWFnaWM7CkBAIC01NjEsMTAgKzU2MywxMSBAQAogCQkgICAgICAgInFueDRfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqcW54NF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcW54NF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgcW54NF9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBxbng0X2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcW54NF9mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvaW5vZGUuYyBiL2ZzL3JhbWZzL2lub2RlLmMKaW5kZXggMTRiZDIyNC4uYjk2NzczMyAxMDA2NDQKLS0tIGEvZnMvcmFtZnMvaW5vZGUuYworKysgYi9mcy9yYW1mcy9pbm9kZS5jCkBAIC0xODUsMTYgKzE4NSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc3VwZXJfYmxvY2sgKnJhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoraW50IHJhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCByYW1mc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCByYW1mc19maWxsX3N1cGVyLCBtbnQpOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpyb290ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHJvb3Rmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFnc3xNU19OT1VTRVIsIGRhdGEsIHJhbWZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3N8TVNfTk9VU0VSLCBkYXRhLCByYW1mc19maWxsX3N1cGVyLAorCQkJICAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByYW1mc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvc3VwZXIuYyBiL2ZzL3JlaXNlcmZzL3N1cGVyLmMKaW5kZXggY2FlMmFiYi4uMDBmMTMyMSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvc3VwZXIuYworKysgYi9mcy9yZWlzZXJmcy9zdXBlci5jCkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOwotc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CiAKIHN0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCB3YWl0KQogewpAQCAtMTkzOCwxNSArMTkzOCwxNSBAQAogCXJldHVybiBlcnJ2YWw7CiB9CiAKLXN0YXRpYyBpbnQgcmVpc2VyZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKIHsKLQlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhzKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhkZW50cnktPmRfc2IpOwogCiAJYnVmLT5mX25hbWVsZW4gPSAoUkVJU0VSRlNfTUFYX05BTUUocy0+c19ibG9ja3NpemUpKTsKIAlidWYtPmZfYmZyZWUgPSBzYl9mcmVlX2Jsb2Nrcyhycyk7CiAJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKIAlidWYtPmZfYmxvY2tzID0gc2JfYmxvY2tfY291bnQocnMpIC0gc2JfYm1hcF9ucihycykgLSAxOwotCWJ1Zi0+Zl9ic2l6ZSA9IHMtPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ic2l6ZSA9IGRlbnRyeS0+ZF9zYi0+c19ibG9ja3NpemU7CiAJLyogY2hhbmdlZCB0byBhY2NvbW1vZGF0ZSBnY2MgZm9sa3MuICovCiAJYnVmLT5mX3R5cGUgPSBSRUlTRVJGU19TVVBFUl9NQUdJQzsKIAlyZXR1cm4gMDsKQEAgLTIyNDksMTEgKzIyNDksMTIgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zdXBlcl9ibG9jayhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCQkJICAgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgZ2V0X3N1cGVyX2Jsb2NrKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCSAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHJlaXNlcmZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHJlaXNlcmZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X3JlaXNlcmZzX2ZzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0ci5jIGIvZnMvcmVpc2VyZnMveGF0dHIuYwppbmRleCBmZmI3OWM0Li4zOWZlZGFhIDEwMDY0NAotLS0gYS9mcy9yZWlzZXJmcy94YXR0ci5jCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKQEAgLTQ1Miw4ICs0NTIsNyBAQAogCS8qIFdlIGNhbiBkZWFkbG9jayBpZiB3ZSB0cnkgdG8gZnJlZSBkZW50cmllcywKIAkgICBhbmQgYW4gdW5saW5rL3JtZGlyIGhhcyBqdXN0IG9jY3VyZWQgLSBHRlBfTk9GUyBhdm9pZHMgdGhpcyAqLwogCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9OT0ZTKTsKLQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCi0JCQkgICAgICAgKGZpbGxlcl90ICopIG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIG4sIE5VTEwpOwogCWlmICghSVNfRVJSKHBhZ2UpKSB7CiAJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CiAJCWttYXAocGFnZSk7CmRpZmYgLS1naXQgYS9mcy9yb21mcy9pbm9kZS5jIGIvZnMvcm9tZnMvaW5vZGUuYwppbmRleCA5YjllZGE3Li4yODNmYmM2IDEwMDY0NAotLS0gYS9mcy9yb21mcy9pbm9kZS5jCisrKyBiL2ZzL3JvbWZzL2lub2RlLmMKQEAgLTE3OSwxMiArMTc5LDEyIEBACiAvKiBUaGF0J3Mgc2ltcGxlIHRvby4gKi8KIAogc3RhdGljIGludAotcm9tZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCityb21mc19zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCWJ1Zi0+Zl90eXBlID0gUk9NRlNfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gUk9NQlNJWkU7CiAJYnVmLT5mX2JmcmVlID0gYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9mZnJlZTsKLQlidWYtPmZfYmxvY2tzID0gKHJvbWZzX21heHNpemUoc2IpK1JPTUJTSVpFLTEpPj5ST01CU0JJVFM7CisJYnVmLT5mX2Jsb2NrcyA9IChyb21mc19tYXhzaXplKGRlbnRyeS0+ZF9zYikrUk9NQlNJWkUtMSk+PlJPTUJTQklUUzsKIAlidWYtPmZfbmFtZWxlbiA9IFJPTUZTX01BWEZOOwogCXJldHVybiAwOwogfQpAQCAtNjA3LDEwICs2MDcsMTEgQEAKIAkucmVtb3VudF9mcwk9IHJvbWZzX3JlbW91bnQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpyb21mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgcm9tZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHJvbWZzX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHJvbWZzX2ZpbGxfc3VwZXIsCisJCQkgICBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcm9tZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKaW5kZXggYTgxMDliYS4uMzNiNzJiYSAxMDA2NDQKLS0tIGEvZnMvc2VsZWN0LmMKKysrIGIvZnMvc2VsZWN0LmMKQEAgLTU0NiwzNyArNTQ2LDM4IEBACiAKICNkZWZpbmUgUE9MTEZEX1BFUl9QQUdFICAoKFBBR0VfU0laRS1zaXplb2Yoc3RydWN0IHBvbGxfbGlzdCkpIC8gc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKQogCi1zdGF0aWMgdm9pZCBkb19wb2xsZmQodW5zaWduZWQgaW50IG51bSwgc3RydWN0IHBvbGxmZCAqIGZkcGFnZSwKLQlwb2xsX3RhYmxlICoqIHB3YWl0LCBpbnQgKmNvdW50KQorLyoKKyAqIEZpc2ggZm9yIHBvbGxhYmxlIGV2ZW50cyBvbiB0aGUgcG9sbGZkLT5mZCBmaWxlIGRlc2NyaXB0b3IuIFdlJ3JlIG9ubHkKKyAqIGludGVyZXN0ZWQgaW4gZXZlbnRzIG1hdGNoaW5nIHRoZSBwb2xsZmQtPmV2ZW50cyBtYXNrLCBhbmQgdGhlIHJlc3VsdAorICogbWF0Y2hpbmcgdGhhdCBtYXNrIGlzIGJvdGggcmVjb3JkZWQgaW4gcG9sbGZkLT5yZXZlbnRzIGFuZCByZXR1cm5lZC4gVGhlCisgKiBwd2FpdCBwb2xsX3RhYmxlIHdpbGwgYmUgdXNlZCBieSB0aGUgZmQtcHJvdmlkZWQgcG9sbCBoYW5kbGVyIGZvciB3YWl0aW5nLAorICogaWYgbm9uLU5VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRvX3BvbGxmZChzdHJ1Y3QgcG9sbGZkICpwb2xsZmQsIHBvbGxfdGFibGUgKnB3YWl0KQogewotCWludCBpOworCXVuc2lnbmVkIGludCBtYXNrOworCWludCBmZDsKIAotCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewotCQlpbnQgZmQ7Ci0JCXVuc2lnbmVkIGludCBtYXNrOwotCQlzdHJ1Y3QgcG9sbGZkICpmZHA7CisJbWFzayA9IDA7CisJZmQgPSBwb2xsZmQtPmZkOworCWlmIChmZCA+PSAwKSB7CisJCWludCBmcHV0X25lZWRlZDsKKwkJc3RydWN0IGZpbGUgKiBmaWxlOwogCi0JCW1hc2sgPSAwOwotCQlmZHAgPSBmZHBhZ2UraTsKLQkJZmQgPSBmZHAtPmZkOwotCQlpZiAoZmQgPj0gMCkgewotCQkJaW50IGZwdXRfbmVlZGVkOwotCQkJc3RydWN0IGZpbGUgKiBmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKLQkJCW1hc2sgPSBQT0xMTlZBTDsKLQkJCWlmIChmaWxlICE9IE5VTEwpIHsKLQkJCQltYXNrID0gREVGQVVMVF9QT0xMTUFTSzsKLQkJCQlpZiAoZmlsZS0+Zl9vcCAmJiBmaWxlLT5mX29wLT5wb2xsKQotCQkJCQltYXNrID0gZmlsZS0+Zl9vcC0+cG9sbChmaWxlLCAqcHdhaXQpOwotCQkJCW1hc2sgJj0gZmRwLT5ldmVudHMgfCBQT0xMRVJSIHwgUE9MTEhVUDsKLQkJCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKLQkJCX0KLQkJCWlmIChtYXNrKSB7Ci0JCQkJKnB3YWl0ID0gTlVMTDsKLQkJCQkoKmNvdW50KSsrOwotCQkJfQorCQlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwkJbWFzayA9IFBPTExOVkFMOworCQlpZiAoZmlsZSAhPSBOVUxMKSB7CisJCQltYXNrID0gREVGQVVMVF9QT0xMTUFTSzsKKwkJCWlmIChmaWxlLT5mX29wICYmIGZpbGUtPmZfb3AtPnBvbGwpCisJCQkJbWFzayA9IGZpbGUtPmZfb3AtPnBvbGwoZmlsZSwgcHdhaXQpOworCQkJLyogTWFzayBvdXQgdW5uZWVkZWQgZXZlbnRzLiAqLworCQkJbWFzayAmPSBwb2xsZmQtPmV2ZW50cyB8IFBPTExFUlIgfCBQT0xMSFVQOworCQkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CiAJCX0KLQkJZmRwLT5yZXZlbnRzID0gbWFzazsKIAl9CisJcG9sbGZkLT5yZXZlbnRzID0gbWFzazsKKworCXJldHVybiBtYXNrOwogfQogCiBzdGF0aWMgaW50IGRvX3BvbGwodW5zaWduZWQgaW50IG5mZHMsICBzdHJ1Y3QgcG9sbF9saXN0ICpsaXN0LApAQCAtNTk0LDExICs1OTUsMjkgQEAKIAkJbG9uZyBfX3RpbWVvdXQ7CiAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkJd2FsayA9IGxpc3Q7Ci0JCXdoaWxlKHdhbGsgIT0gTlVMTCkgewotCQkJZG9fcG9sbGZkKCB3YWxrLT5sZW4sIHdhbGstPmVudHJpZXMsICZwdCwgJmNvdW50KTsKLQkJCXdhbGsgPSB3YWxrLT5uZXh0OworCQlmb3IgKHdhbGsgPSBsaXN0OyB3YWxrICE9IE5VTEw7IHdhbGsgPSB3YWxrLT5uZXh0KSB7CisJCQlzdHJ1Y3QgcG9sbGZkICogcGZkLCAqIHBmZF9lbmQ7CisKKwkJCXBmZCA9IHdhbGstPmVudHJpZXM7CisJCQlwZmRfZW5kID0gcGZkICsgd2Fsay0+bGVuOworCQkJZm9yICg7IHBmZCAhPSBwZmRfZW5kOyBwZmQrKykgeworCQkJCS8qCisJCQkJICogRmlzaCBmb3IgZXZlbnRzLiBJZiB3ZSBmb3VuZCBvbmUsIHJlY29yZCBpdAorCQkJCSAqIGFuZCBraWxsIHRoZSBwb2xsX3RhYmxlLCBzbyB3ZSBkb24ndAorCQkJCSAqIG5lZWRsZXNzbHkgcmVnaXN0ZXIgYW55IG90aGVyIHdhaXRlcnMgYWZ0ZXIKKwkJCQkgKiB0aGlzLiBUaGV5J2xsIGdldCBpbW1lZGlhdGVseSBkZXJlZ2lzdGVyZWQKKwkJCQkgKiB3aGVuIHdlIGJyZWFrIG91dCBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCWlmIChkb19wb2xsZmQocGZkLCBwdCkpIHsKKwkJCQkJY291bnQrKzsKKwkJCQkJcHQgPSBOVUxMOworCQkJCX0KKwkJCX0KIAkJfQorCQkvKgorCQkgKiBBbGwgd2FpdGVycyBoYXZlIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLCBzbyBkb24ndCBwcm92aWRlCisJCSAqIGEgcG9sbF90YWJsZSB0byB0aGVtIG9uIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uLgorCQkgKi8KIAkJcHQgPSBOVUxMOwogCQlpZiAoY291bnQgfHwgISp0aW1lb3V0IHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CkBAIC03MjcsOSArNzQ2LDkgQEAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfcG9sbChzdHJ1Y3QgcG9sbGZkIF9fdXNlciAqdWZkcywgdW5zaWduZWQgaW50IG5mZHMsCiAJCQlsb25nIHRpbWVvdXRfbXNlY3MpCiB7Ci0JczY0IHRpbWVvdXRfamlmZmllcyA9IDA7CisJczY0IHRpbWVvdXRfamlmZmllczsKIAotCWlmICh0aW1lb3V0X21zZWNzKSB7CisJaWYgKHRpbWVvdXRfbXNlY3MgPiAwKSB7CiAjaWYgSFogPiAxMDAwCiAJCS8qIFdlIGNhbiBvbmx5IG92ZXJmbG93IGlmIEhaID4gMTAwMCAqLwogCQlpZiAodGltZW91dF9tc2VjcyAvIDEwMDAgPiAoczY0KTB4N2ZmZmZmZmZmZmZmZmZmZlVMTCAvIChzNjQpSFopCkBAIC03MzcsNiArNzU2LDkgQEAKIAkJZWxzZQogI2VuZGlmCiAJCQl0aW1lb3V0X2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXNlY3MpOworCX0gZWxzZSB7CisJCS8qIEluZmluaXRlICg8IDApIG9yIG5vICgwKSB0aW1lb3V0ICovCisJCXRpbWVvdXRfamlmZmllcyA9IHRpbWVvdXRfbXNlY3M7CiAJfQogCiAJcmV0dXJuIGRvX3N5c19wb2xsKHVmZHMsIG5mZHMsICZ0aW1lb3V0X2ppZmZpZXMpOwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvaW5vZGUuYyBiL2ZzL3NtYmZzL2lub2RlLmMKaW5kZXggZmRlYWJjMC4uNTA2ZmY4NyAxMDA2NDQKLS0tIGEvZnMvc21iZnMvaW5vZGUuYworKysgYi9mcy9zbWJmcy9pbm9kZS5jCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXRpYyB2b2lkIHNtYl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOwogc3RhdGljIHZvaWQgc21iX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Ci1zdGF0aWMgaW50ICBzbWJfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgIHNtYl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIHN0YXRpYyBpbnQgIHNtYl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAogc3RhdGljIGttZW1fY2FjaGVfdCAqc21iX2lub2RlX2NhY2hlcDsKQEAgLTY0MSwxMyArNjQxLDEzIEBACiB9CiAKIHN0YXRpYyBpbnQKLXNtYl9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3NtYl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogewogCWludCByZXN1bHQ7CiAJCiAJbG9ja19rZXJuZWwoKTsKIAotCXJlc3VsdCA9IHNtYl9wcm9jX2Rza2F0dHIoc2IsIGJ1Zik7CisJcmVzdWx0ID0gc21iX3Byb2NfZHNrYXR0cihkZW50cnksIGJ1Zik7CiAKIAl1bmxvY2tfa2VybmVsKCk7CiAKQEAgLTc4MiwxMCArNzgyLDEwIEBACiAJcmV0dXJuIGVycm9yOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpzbWJfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHNtYl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgc21iX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNtYl9maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc21iX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm9jLmMgYi9mcy9zbWJmcy9wcm9jLmMKaW5kZXggYjFiODc4Yi4uYzM0OTUwNSAxMDA2NDQKLS0tIGEvZnMvc21iZnMvcHJvYy5jCisrKyBiL2ZzL3NtYmZzL3Byb2MuYwpAQCAtMzIyNiw5ICszMjI2LDkgQEAKIH0KIAogaW50Ci1zbWJfcHJvY19kc2thdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICphdHRyKQorc21iX3Byb2NfZHNrYXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICphdHRyKQogewotCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gU01CX1NCKHNiKTsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IFNNQl9TQihkZW50cnktPmRfc2IpOwogCWludCByZXN1bHQ7CiAJY2hhciAqcDsKIAlsb25nIHVuaXQ7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9wcm90by5oIGIvZnMvc21iZnMvcHJvdG8uaAppbmRleCA0NzY2NDU5Li45NzJlZDdkIDEwMDY0NAotLS0gYS9mcy9zbWJmcy9wcm90by5oCisrKyBiL2ZzL3NtYmZzL3Byb3RvLmgKQEAgLTI5LDcgKzI5LDcgQEAKIGV4dGVybiBpbnQgc21iX3Byb2Nfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKIGV4dGVybiBpbnQgc21iX3Byb2Nfc2V0YXR0cl91bml4KHN0cnVjdCBkZW50cnkgKmQsIHN0cnVjdCBpYXR0ciAqYXR0ciwgdW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgbWlub3IpOwogZXh0ZXJuIGludCBzbWJfcHJvY19zZXR0aW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOwotZXh0ZXJuIGludCBzbWJfcHJvY19kc2thdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICphdHRyKTsKK2V4dGVybiBpbnQgc21iX3Byb2NfZHNrYXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICphdHRyKTsKIGV4dGVybiBpbnQgc21iX3Byb2NfcmVhZF9saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkLCBjaGFyICpidWZmZXIsIGludCBsZW4pOwogZXh0ZXJuIGludCBzbWJfcHJvY19zeW1saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkLCBjb25zdCBjaGFyICpvbGRwYXRoKTsKIGV4dGVybiBpbnQgc21iX3Byb2NfbGluayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NtYmlvZC5jIGIvZnMvc21iZnMvc21iaW9kLmMKaW5kZXggNDgxYTk3YS4uM2Y3MTM4NCAxMDA2NDQKLS0tIGEvZnMvc21iZnMvc21iaW9kLmMKKysrIGIvZnMvc21iZnMvc21iaW9kLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgpAQCAtNDAsNyArNDEsNyBAQAogfTsKIAogc3RhdGljIGVudW0gc21iaW9kX3N0YXRlIHNtYmlvZF9zdGF0ZSA9IFNNQklPRF9ERUFEOwotc3RhdGljIHBpZF90IHNtYmlvZF9waWQ7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzbWJpb2RfdGhyZWFkOwogc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKHNtYmlvZF93YWl0KTsKIHN0YXRpYyBMSVNUX0hFQUQoc21iX3NlcnZlcnMpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhzZXJ2ZXJzX2xvY2spOwpAQCAtNjcsMjAgKzY4LDI5IEBACiAgKi8KIHN0YXRpYyBpbnQgc21iaW9kX3N0YXJ0KHZvaWQpCiB7Ci0JcGlkX3QgcGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOworCWludCBlcnIgPSAwOworCiAJaWYgKHNtYmlvZF9zdGF0ZSAhPSBTTUJJT0RfREVBRCkKIAkJcmV0dXJuIDA7CiAJc21iaW9kX3N0YXRlID0gU01CSU9EX1NUQVJUSU5HOwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7Ci0JcGlkID0ga2VybmVsX3RocmVhZChzbWJpb2QsIE5VTEwsIDApOwotCWlmIChwaWQgPCAwKQorCXRzayA9IGt0aHJlYWRfcnVuKHNtYmlvZCwgTlVMTCwgInNtYmlvZCIpOworCWlmIChJU19FUlIodHNrKSkgeworCQllcnIgPSBQVFJfRVJSKHRzayk7CiAJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCX0KIAogCXNwaW5fbG9jaygmc2VydmVyc19sb2NrKTsKLQlzbWJpb2Rfc3RhdGUgPSBwaWQgPCAwID8gU01CSU9EX0RFQUQgOiBTTUJJT0RfUlVOTklORzsKLQlzbWJpb2RfcGlkID0gcGlkOwotCXJldHVybiBwaWQ7CisJaWYgKGVyciA8IDApIHsKKwkJc21iaW9kX3N0YXRlID0gU01CSU9EX0RFQUQ7CisJCXNtYmlvZF90aHJlYWQgPSBOVUxMOworCX0gZWxzZSB7CisJCXNtYmlvZF9zdGF0ZSA9IFNNQklPRF9SVU5OSU5HOworCQlzbWJpb2RfdGhyZWFkID0gdHNrOworCX0KKwlyZXR1cm4gZXJyOwogfQogCiAvKgpAQCAtMjkwLDggKzMwMCw2IEBACiAgKi8KIHN0YXRpYyBpbnQgc21iaW9kKHZvaWQgKnVudXNlZCkKIHsKLQlkYWVtb25pemUoInNtYmlvZCIpOwotCiAJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOwogCiAJVkVSQk9TRSgiU01CIEtlcm5lbCB0aHJlYWQgc3RhcnRpbmcgKCVkKSAuLi5cbiIsIGN1cnJlbnQtPnBpZCk7CmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IGEyODVmZDcuLjA1ZmQyNzggMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC01NSwzMSArNTUsNDMgQEAKIAkJCQkgICAgIHN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gYnVmLT5wYWdlOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwogCiAJbG9ja19wYWdlKHBhZ2UpOwogCi0JV0FSTl9PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCWlmIChtYXBwaW5nKSB7CisJCVdBUk5fT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CiAKLQkvKgotCSAqIEF0IGxlYXN0IGZvciBleHQyIHdpdGggbm9iaCBvcHRpb24sIHdlIG5lZWQgdG8gd2FpdCBvbiB3cml0ZWJhY2sKLQkgKiBjb21wbGV0aW5nIG9uIHRoaXMgcGFnZSwgc2luY2Ugd2UnbGwgcmVtb3ZlIGl0IGZyb20gdGhlIHBhZ2VjYWNoZS4KLQkgKiBPdGhlcndpc2UgdHJ1bmNhdGUgd29udCB3YWl0IG9uIHRoZSBwYWdlLCBhbGxvd2luZyB0aGUgZGlzawotCSAqIGJsb2NrcyB0byBiZSByZXVzZWQgYnkgc29tZW9uZSBlbHNlIGJlZm9yZSB3ZSBhY3R1YWxseSB3cm90ZSBvdXIKLQkgKiBkYXRhIHRvIHRoZW0uIGZzIGNvcnJ1cHRpb24gZW5zdWVzLgotCSAqLwotCXdhaXRfb25fcGFnZV93cml0ZWJhY2socGFnZSk7CisJCS8qCisJCSAqIEF0IGxlYXN0IGZvciBleHQyIHdpdGggbm9iaCBvcHRpb24sIHdlIG5lZWQgdG8gd2FpdCBvbgorCQkgKiB3cml0ZWJhY2sgY29tcGxldGluZyBvbiB0aGlzIHBhZ2UsIHNpbmNlIHdlJ2xsIHJlbW92ZSBpdAorCQkgKiBmcm9tIHRoZSBwYWdlY2FjaGUuICBPdGhlcndpc2UgdHJ1bmNhdGUgd29udCB3YWl0IG9uIHRoZQorCQkgKiBwYWdlLCBhbGxvd2luZyB0aGUgZGlzayBibG9ja3MgdG8gYmUgcmV1c2VkIGJ5IHNvbWVvbmUgZWxzZQorCQkgKiBiZWZvcmUgd2UgYWN0dWFsbHkgd3JvdGUgb3VyIGRhdGEgdG8gdGhlbS4gZnMgY29ycnVwdGlvbgorCQkgKiBlbnN1ZXMuCisJCSAqLworCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCi0JaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKQotCQl0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOworCQlpZiAoUGFnZVByaXZhdGUocGFnZSkpCisJCQl0cnlfdG9fcmVsZWFzZV9wYWdlKHBhZ2UsIG1hcHBpbmdfZ2ZwX21hc2sobWFwcGluZykpOwogCi0JaWYgKCFyZW1vdmVfbWFwcGluZyhtYXBwaW5nLCBwYWdlKSkgewotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcmV0dXJuIDE7CisJCS8qCisJCSAqIElmIHdlIHN1Y2NlZWRlZCBpbiByZW1vdmluZyB0aGUgbWFwcGluZywgc2V0IExSVSBmbGFnCisJCSAqIGFuZCByZXR1cm4gZ29vZC4KKwkJICovCisJCWlmIChyZW1vdmVfbWFwcGluZyhtYXBwaW5nLCBwYWdlKSkgeworCQkJYnVmLT5mbGFncyB8PSBQSVBFX0JVRl9GTEFHX0xSVTsKKwkJCXJldHVybiAwOworCQl9CiAJfQogCi0JYnVmLT5mbGFncyB8PSBQSVBFX0JVRl9GTEFHX0xSVTsKLQlyZXR1cm4gMDsKKwkvKgorCSAqIFJhY2VkIHdpdGggdHJ1bmNhdGUgb3IgZmFpbGVkIHRvIHJlbW92ZSBwYWdlIGZyb20gY3VycmVudAorCSAqIGFkZHJlc3Mgc3BhY2UsIHVubG9jayBhbmQgcmV0dXJuIGZhaWx1cmUuCisJICovCisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkIHBhZ2VfY2FjaGVfcGlwZV9idWZfcmVsZWFzZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLApkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggYTY2ZjY2Yi4uOGE2NjlmNiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC0yMzEsNyArMjMxLDcgQEAKIAlpZiAocm9vdCkgewogCQlzYi0+c19yb290ID0gTlVMTDsKIAkJc2hyaW5rX2RjYWNoZV9wYXJlbnQocm9vdCk7Ci0JCXNocmlua19kY2FjaGVfYW5vbigmc2ItPnNfYW5vbik7CisJCXNocmlua19kY2FjaGVfc2Ioc2IpOwogCQlkcHV0KHJvb3QpOwogCQlmc3luY19zdXBlcihzYik7CiAJCWxvY2tfc3VwZXIoc2IpOwpAQCAtNDg2LDcgKzQ4Niw3IEBACiAgICAgICAgIHMgPSB1c2VyX2dldF9zdXBlcihuZXdfZGVjb2RlX2RldihkZXYpKTsKICAgICAgICAgaWYgKHMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICBnb3RvIG91dDsKLQllcnIgPSB2ZnNfc3RhdGZzKHMsICZzYnVmKTsKKwllcnIgPSB2ZnNfc3RhdGZzKHMtPnNfcm9vdCwgJnNidWYpOwogCWRyb3Bfc3VwZXIocyk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CkBAIC02NzYsOSArNjc2LDEwIEBACiAJfQogfQogCi1zdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zYl9iZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAoraW50IGdldF9zYl9iZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsCi0JaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSkKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzOwpAQCAtNjg2LDcgKzY4Nyw3IEBACiAKIAliZGV2ID0gb3Blbl9iZGV2X2V4Y2woZGV2X25hbWUsIGZsYWdzLCBmc190eXBlKTsKIAlpZiAoSVNfRVJSKGJkZXYpKQotCQlyZXR1cm4gKHN0cnVjdCBzdXBlcl9ibG9jayAqKWJkZXY7CisJCXJldHVybiBQVFJfRVJSKGJkZXYpOwogCiAJLyoKIAkgKiBvbmNlIHRoZSBzdXBlciBpcyBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0IGJ5IHNnZXQsIHNfdW1vdW50CkBAIC02OTcsMTUgKzY5OCwxNyBAQAogCXMgPSBzZ2V0KGZzX3R5cGUsIHRlc3RfYmRldl9zdXBlciwgc2V0X2JkZXZfc3VwZXIsIGJkZXYpOwogCW11dGV4X3VubG9jaygmYmRldi0+YmRfbW91bnRfbXV0ZXgpOwogCWlmIChJU19FUlIocykpCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycm9yX3M7CiAKIAlpZiAocy0+c19yb290KSB7CiAJCWlmICgoZmxhZ3MgXiBzLT5zX2ZsYWdzKSAmIE1TX1JET05MWSkgewogCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKIAkJCWRlYWN0aXZhdGVfc3VwZXIocyk7Ci0JCQlzID0gRVJSX1BUUigtRUJVU1kpOworCQkJZXJyb3IgPSAtRUJVU1k7CisJCQlnb3RvIGVycm9yX2JkZXY7CiAJCX0KLQkJZ290byBvdXQ7CisKKwkJY2xvc2VfYmRldl9leGNsKGJkZXYpOwogCX0gZWxzZSB7CiAJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKIApAQCAtNzE2LDE4ICs3MTksMjEgQEAKIAkJaWYgKGVycm9yKSB7CiAJCQl1cF93cml0ZSgmcy0+c191bW91bnQpOwogCQkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKLQkJCXMgPSBFUlJfUFRSKGVycm9yKTsKLQkJfSBlbHNlIHsKLQkJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCQkJYmRldl91ZXZlbnQoYmRldiwgS09CSl9NT1VOVCk7CisJCQlnb3RvIGVycm9yOwogCQl9CisKKwkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJCWJkZXZfdWV2ZW50KGJkZXYsIEtPQkpfTU9VTlQpOwogCX0KIAotCXJldHVybiBzOworCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHMpOwogCi1vdXQ6CitlcnJvcl9zOgorCWVycm9yID0gUFRSX0VSUihzKTsKK2Vycm9yX2JkZXY6CiAJY2xvc2VfYmRldl9leGNsKGJkZXYpOwotCXJldHVybiBzOworZXJyb3I6CisJcmV0dXJuIGVycm9yOwogfQogCiBFWFBPUlRfU1lNQk9MKGdldF9zYl9iZGV2KTsKQEAgLTc0NCwxNSArNzUwLDE2IEBACiAKIEVYUE9SVF9TWU1CT0woa2lsbF9ibG9ja19zdXBlcik7CiAKLXN0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X3NiX25vZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAoraW50IGdldF9zYl9ub2RldihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsCi0JaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSkKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KQogewogCWludCBlcnJvcjsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKIAogCWlmIChJU19FUlIocykpCi0JCXJldHVybiBzOworCQlyZXR1cm4gUFRSX0VSUihzKTsKIAogCXMtPnNfZmxhZ3MgPSBmbGFnczsKIApAQCAtNzYwLDEwICs3NjcsMTAgQEAKIAlpZiAoZXJyb3IpIHsKIAkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKIAkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOwotCXJldHVybiBzOworCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHMpOwogfQogCiBFWFBPUlRfU1lNQk9MKGdldF9zYl9ub2Rldik7CkBAIC03NzMsOTQgKzc4MCwxMDAgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc2Jfc2luZ2xlKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAoraW50IGdldF9zYl9zaW5nbGUoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJaW50IGZsYWdzLCB2b2lkICpkYXRhLAotCWludCAoKmZpbGxfc3VwZXIpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCkpCisJaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSwKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7CiAJaW50IGVycm9yOwogCiAJcyA9IHNnZXQoZnNfdHlwZSwgY29tcGFyZV9zaW5nbGUsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHMpKQotCQlyZXR1cm4gczsKKwkJcmV0dXJuIFBUUl9FUlIocyk7CiAJaWYgKCFzLT5zX3Jvb3QpIHsKIAkJcy0+c19mbGFncyA9IGZsYWdzOwogCQllcnJvciA9IGZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19TSUxFTlQgPyAxIDogMCk7CiAJCWlmIChlcnJvcikgewogCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKIAkJCWRlYWN0aXZhdGVfc3VwZXIocyk7Ci0JCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJCQlyZXR1cm4gZXJyb3I7CiAJCX0KIAkJcy0+c19mbGFncyB8PSBNU19BQ1RJVkU7CiAJfQogCWRvX3JlbW91bnRfc2IocywgZmxhZ3MsIGRhdGEsIDApOwotCXJldHVybiBzOworCXJldHVybiBzaW1wbGVfc2V0X21udChtbnQsIHMpOwogfQogCiBFWFBPUlRfU1lNQk9MKGdldF9zYl9zaW5nbGUpOwogCiBzdHJ1Y3QgdmZzbW91bnQgKgotZG9fa2Vybl9tb3VudChjb25zdCBjaGFyICpmc3R5cGUsIGludCBmbGFncywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3Zmc19rZXJuX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUgPSBnZXRfZnNfdHlwZShmc3R5cGUpOwotCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBFUlJfUFRSKC1FTk9NRU0pOwogCXN0cnVjdCB2ZnNtb3VudCAqbW50OwotCWludCBlcnJvcjsKIAljaGFyICpzZWNkYXRhID0gTlVMTDsKKwlpbnQgZXJyb3I7CiAKIAlpZiAoIXR5cGUpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCisJZXJyb3IgPSAtRU5PTUVNOwogCW1udCA9IGFsbG9jX3Zmc21udChuYW1lKTsKIAlpZiAoIW1udCkKIAkJZ290byBvdXQ7CiAKIAlpZiAoZGF0YSkgewogCQlzZWNkYXRhID0gYWxsb2Nfc2VjZGF0YSgpOwotCQlpZiAoIXNlY2RhdGEpIHsKLQkJCXNiID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJaWYgKCFzZWNkYXRhKQogCQkJZ290byBvdXRfbW50OwotCQl9CiAKIAkJZXJyb3IgPSBzZWN1cml0eV9zYl9jb3B5X2RhdGEodHlwZSwgZGF0YSwgc2VjZGF0YSk7Ci0JCWlmIChlcnJvcikgewotCQkJc2IgPSBFUlJfUFRSKGVycm9yKTsKKwkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfZnJlZV9zZWNkYXRhOwotCQl9CiAJfQogCi0Jc2IgPSB0eXBlLT5nZXRfc2IodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEpOwotCWlmIChJU19FUlIoc2IpKQorCWVycm9yID0gdHlwZS0+Z2V0X3NiKHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhLCBtbnQpOworCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfc2VjZGF0YTsKLSAJZXJyb3IgPSBzZWN1cml0eV9zYl9rZXJuX21vdW50KHNiLCBzZWNkYXRhKTsKKworIAllcnJvciA9IHNlY3VyaXR5X3NiX2tlcm5fbW91bnQobW50LT5tbnRfc2IsIHNlY2RhdGEpOwogIAlpZiAoZXJyb3IpCiAgCQlnb3RvIG91dF9zYjsKLQltbnQtPm1udF9zYiA9IHNiOwotCW1udC0+bW50X3Jvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOwotCW1udC0+bW50X21vdW50cG9pbnQgPSBzYi0+c19yb290OworCisJbW50LT5tbnRfbW91bnRwb2ludCA9IG1udC0+bW50X3Jvb3Q7CiAJbW50LT5tbnRfcGFyZW50ID0gbW50OwotCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCXVwX3dyaXRlKCZtbnQtPm1udF9zYi0+c191bW91bnQpOwogCWZyZWVfc2VjZGF0YShzZWNkYXRhKTsKLQlwdXRfZmlsZXN5c3RlbSh0eXBlKTsKIAlyZXR1cm4gbW50Owogb3V0X3NiOgotCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOwotCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwotCXNiID0gRVJSX1BUUihlcnJvcik7CisJZHB1dChtbnQtPm1udF9yb290KTsKKwl1cF93cml0ZSgmbW50LT5tbnRfc2ItPnNfdW1vdW50KTsKKwlkZWFjdGl2YXRlX3N1cGVyKG1udC0+bW50X3NiKTsKIG91dF9mcmVlX3NlY2RhdGE6CiAJZnJlZV9zZWNkYXRhKHNlY2RhdGEpOwogb3V0X21udDoKIAlmcmVlX3Zmc21udChtbnQpOwogb3V0OgotCXB1dF9maWxlc3lzdGVtKHR5cGUpOwotCXJldHVybiAoc3RydWN0IHZmc21vdW50ICopc2I7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCi1FWFBPUlRfU1lNQk9MX0dQTChkb19rZXJuX21vdW50KTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZmc19rZXJuX21vdW50KTsKKworc3RydWN0IHZmc21vdW50ICoKK2RvX2tlcm5fbW91bnQoY29uc3QgY2hhciAqZnN0eXBlLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUgPSBnZXRfZnNfdHlwZShmc3R5cGUpOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCWlmICghdHlwZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisJbW50ID0gdmZzX2tlcm5fbW91bnQodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEpOworCXB1dF9maWxlc3lzdGVtKHR5cGUpOworCXJldHVybiBtbnQ7Cit9CiAKIHN0cnVjdCB2ZnNtb3VudCAqa2Vybl9tb3VudChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSkKIHsKLQlyZXR1cm4gZG9fa2Vybl9tb3VudCh0eXBlLT5uYW1lLCAwLCB0eXBlLT5uYW1lLCBOVUxMKTsKKwlyZXR1cm4gdmZzX2tlcm5fbW91bnQodHlwZSwgMCwgdHlwZS0+bmFtZSwgTlVMTCk7CiB9CiAKIEVYUE9SVF9TWU1CT0woa2Vybl9tb3VudCk7CmRpZmYgLS1naXQgYS9mcy9zeW5jLmMgYi9mcy9zeW5jLmMKaW5kZXggYWFiNWZmZS4uOTU1YWVmMCAxMDA2NDQKLS0tIGEvZnMvc3luYy5jCisrKyBiL2ZzL3N5bmMuYwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJfQogCiAJaWYgKG5ieXRlcyA9PSAwKQotCQllbmRieXRlID0gLTE7CisJCWVuZGJ5dGUgPSBMTE9OR19NQVg7CiAJZWxzZQogCQllbmRieXRlLS07CQkvKiBpbmNsdXNpdmUgKi8KIApkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvbW91bnQuYyBiL2ZzL3N5c2ZzL21vdW50LmMKaW5kZXggZjExMTdlOC4uNDAxOTBjNCAxMDA2NDQKLS0tIGEvZnMvc3lzZnMvbW91bnQuYworKysgYi9mcy9zeXNmcy9tb3VudC5jCkBAIC02NiwxMCArNjYsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqc3lzZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHN5c2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgc3lzZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHN5c2ZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzeXNmc19mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9kaXIuYyBiL2ZzL3N5c3YvZGlyLmMKaW5kZXggZDcwNzQzNC4uZjJiZWY5NiAxMDA2NDQKLS0tIGEvZnMvc3lzdi9kaXIuYworKysgYi9mcy9zeXN2L2Rpci5jCkBAIC01Myw4ICs1Myw3IEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKiBkaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOwotCXN0cnVjdCBwYWdlICpwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCi0JCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCXN0cnVjdCBwYWdlICpwYWdlID0gcmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgbiwgTlVMTCk7CiAJaWYgKCFJU19FUlIocGFnZSkpIHsKIAkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKIAkJa21hcChwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaW5vZGUuYyBiL2ZzL3N5c3YvaW5vZGUuYwppbmRleCAzZmY4OWNjLi41OGIyZDIyIDEwMDY0NAotLS0gYS9mcy9zeXN2L2lub2RlLmMKKysrIGIvZnMvc3lzdi9pbm9kZS5jCkBAIC04NSw4ICs4NSw5IEBACiAJa2ZyZWUoc2JpKTsKIH0KIAotc3RhdGljIGludCBzeXN2X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQorc3RhdGljIGludCBzeXN2X3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKIAlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKIAogCWJ1Zi0+Zl90eXBlID0gc2ItPnNfbWFnaWM7CmRpZmYgLS1naXQgYS9mcy9zeXN2L3N1cGVyLmMgYi9mcy9zeXN2L3N1cGVyLmMKaW5kZXggZTkyYjk5MS4uODc2NjM5YiAxMDA2NDQKLS0tIGEvZnMvc3lzdi9zdXBlci5jCisrKyBiL2ZzL3N5c3Yvc3VwZXIuYwpAQCAtNTA2LDE2ICs1MDYsMTcgQEAKIAogLyogRXZlcnkga2VybmVsIG1vZHVsZSBjb250YWlucyBzdHVmZiBsaWtlIHRoaXMuICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN5c3ZfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHN5c3ZfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHN5c3ZfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgc3lzdl9maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdjdfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHY3X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB2N19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB2N19maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3lzdl9mc190eXBlID0gewpkaWZmIC0tZ2l0IGEvZnMvdWRmL3N1cGVyLmMgYi9mcy91ZGYvc3VwZXIuYwppbmRleCBlNDU3ODlmLi40NGZlMmNiIDEwMDY0NAotLS0gYS9mcy91ZGYvc3VwZXIuYworKysgYi9mcy91ZGYvc3VwZXIuYwpAQCAtOTEsMTMgKzkxLDEzIEBACiBzdGF0aWMgdm9pZCB1ZGZfb3Blbl9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIHN0YXRpYyB2b2lkIHVkZl9jbG9zZV9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotc3RhdGljIGludCB1ZGZfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgdWRmX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogCiAvKiBVREYgZmlsZXN5c3RlbSB0eXBlICovCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp1ZGZfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHVkZl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgdWRmX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHVkZl9maWxsX3N1cGVyLCBtbnQpOwogfQogCiBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdWRmX2ZzdHlwZSA9IHsKQEAgLTE3NzksOCArMTc3OSwxMCBAQAogICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCiAgKi8KIHN0YXRpYyBpbnQKLXVkZl9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3VkZl9zdGF0ZnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQogeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkZW50cnktPmRfc2I7CisKIAlidWYtPmZfdHlwZSA9IFVERl9TVVBFUl9NQUdJQzsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2Jsb2NrcyA9IFVERl9TQl9QQVJUTEVOKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSk7CmRpZmYgLS1naXQgYS9mcy91ZnMvYmFsbG9jLmMgYi9mcy91ZnMvYmFsbG9jLmMKaW5kZXggM2FkYTlkYy4uOTViODc4ZSAxMDA2NDQKLS0tIGEvZnMvdWZzL2JhbGxvYy5jCisrKyBiL2ZzL3Vmcy9iYWxsb2MuYwpAQCAtMjEsMTQgKzIxLDYgQEAKICNpbmNsdWRlICJzd2FiLmgiCiAjaW5jbHVkZSAidXRpbC5oIgogCi0jdW5kZWYgVUZTX0JBTExPQ19ERUJVRwotCi0jaWZkZWYgVUZTX0JBTExPQ19ERUJVRwotI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQogc3RhdGljIHVuc2lnbmVkIHVmc19hZGRfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgaW50ICopOwogc3RhdGljIHVuc2lnbmVkIHVmc19hbGxvY19mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBpbnQgKik7CiBzdGF0aWMgdW5zaWduZWQgdWZzX2FsbG9jY2dfYmxvY2sgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqLCB1bnNpZ25lZCwgaW50ICopOwpAQCAtMzksNyArMzEsOCBAQAogLyoKICAqIEZyZWUgJ2NvdW50JyBmcmFnbWVudHMgZnJvbSBmcmFnbWVudCBudW1iZXIgJ2ZyYWdtZW50JwogICovCi12b2lkIHVmc19mcmVlX2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LCB1bnNpZ25lZCBjb3VudCkgewordm9pZCB1ZnNfZnJlZV9mcmFnbWVudHMoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgZnJhZ21lbnQsIHVuc2lnbmVkIGNvdW50KQorewogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKQEAgLTUxLDcgKzQ0LDcgQEAKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAkKLQlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KSkKKwlVRlNEKCJFTlRFUiwgZnJhZ21lbnQgJXUsIGNvdW50ICV1XG4iLCBmcmFnbWVudCwgY291bnQpOwogCQogCWlmICh1ZnNfZnJhZ251bShmcmFnbWVudCkgKyBjb3VudCA+IHVzcGktPnNfZnBnKQogCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yIik7CkBAIC02OCw3ICs2MSw3IEBACiAJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2dubyk7CiAJaWYgKCF1Y3BpKSAKIAkJZ290byBmYWlsZWQ7Ci0JdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgodWNwaSkpOwogCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSB7CiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBtYWdpYyBudW1iZXIgb24gY2cgJXUiLCBjZ25vKTsKIAkJZ290byBmYWlsZWQ7CkBAIC03NiwxMSArNjksMTEgQEAKIAogCWVuZF9iaXQgPSBiaXQgKyBjb3VudDsKIAliYmFzZSA9IHVmc19ibGtudW0gKGJpdCk7Ci0JYmxrbWFwID0gdWJoX2Jsa21hcCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmJhc2UpOworCWJsa21hcCA9IHViaF9ibGttYXAgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGJiYXNlKTsKIAl1ZnNfZnJhZ2FjY3QgKHNiLCBibGttYXAsIHVjZy0+Y2dfZnJzdW0sIC0xKTsKIAlmb3IgKGkgPSBiaXQ7IGkgPCBlbmRfYml0OyBpKyspIHsKLQkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSkpCi0JCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBpKTsKKwkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfZnJlZW9mZiwgaSkpCisJCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBpKTsKIAkJZWxzZSAKIAkJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLAogCQkJCSAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBmcmFnbWVudCAldSIsIGkpOwpAQCAtOTAsNTEgKzgzLDUyIEBACiAKIAkKIAlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBjb3VudCk7Ci0JZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgY291bnQpOworCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSArPSBjb3VudDsKIAlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgY291bnQpOwotCWJsa21hcCA9IHViaF9ibGttYXAgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJiYXNlKTsKKwlibGttYXAgPSB1YmhfYmxrbWFwIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBiYmFzZSk7CiAJdWZzX2ZyYWdhY2N0KHNiLCBibGttYXAsIHVjZy0+Y2dfZnJzdW0sIDEpOwogCiAJLyoKIAkgKiBUcnlpbmcgdG8gcmVhc3NlbWJsZSBmcmVlIGZyYWdtZW50cyBpbnRvIGJsb2NrCiAJICovCiAJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MgKGJiYXNlKTsKLQlpZiAodWJoX2lzYmxvY2tzZXQoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pKSB7CisJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKSkgewogCQlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCB1c3BpLT5zX2ZwYik7Ci0JCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIHVzcGktPnNfZnBiKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlIC09IHVzcGktPnNfZnBiOwogCQlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgdXNwaS0+c19mcGIpOwogCQlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQogCQkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIDEpOwogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmJmcmVlLCAxKTsKLQkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25iZnJlZSsrOwogCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25iZnJlZSwgMSk7CiAJCWN5bG5vID0gdWZzX2NidG9jeWxubyAoYmJhc2UpOwogCQlmczE2X2FkZChzYiwgJnViaF9jZ19ibGtzKHVjcGksIGN5bG5vLCB1ZnNfY2J0b3Jwb3MoYmJhc2UpKSwgMSk7CiAJCWZzMzJfYWRkKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOwogCX0KIAkKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgVUNQSV9VQkgodWNwaSkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKHVjcGkpKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CiAJCiAJdW5sb2NrX3N1cGVyIChzYik7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybjsKIAogZmFpbGVkOgogCXVubG9ja19zdXBlciAoc2IpOwotCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlVRlNEKCJFWElUIChGQUlMRUQpXG4iKTsKIAlyZXR1cm47CiB9CiAKIC8qCiAgKiBGcmVlICdjb3VudCcgZnJhZ21lbnRzIGZyb20gZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudCcgKGZyZWUgd2hvbGUgYmxvY2tzKQogICovCi12b2lkIHVmc19mcmVlX2Jsb2NrcyAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LCB1bnNpZ25lZCBjb3VudCkgewordm9pZCB1ZnNfZnJlZV9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgZnJhZ21lbnQsIHVuc2lnbmVkIGNvdW50KQorewogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKQEAgLTE0Niw3ICsxNDAsNyBAQAogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CiAJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwogCi0JVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCisJVUZTRCgiRU5URVIsIGZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KTsKIAkKIAlpZiAoKGZyYWdtZW50ICYgdXNwaS0+c19mcGJtYXNrKSB8fCAoY291bnQgJiB1c3BpLT5zX2ZwYm1hc2spKSB7CiAJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9ibG9ja3MiLCAiaW50ZXJuYWwgZXJyb3IsICIKQEAgLTE2Miw3ICsxNTYsNyBAQAogCWJpdCA9IHVmc19kdG9nZCAoZnJhZ21lbnQpOwogCWlmIChjZ25vID49IHVzcGktPnNfbmNnKSB7CiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9ibG9ja3MiLCAiZnJlZWluZyBibG9ja3MgYXJlIG91dHNpZGUgZGV2aWNlIik7Ci0JCWdvdG8gZmFpbGVkOworCQlnb3RvIGZhaWxlZF91bmxvY2s7CiAJfQogCWVuZF9iaXQgPSBiaXQgKyBjb3VudDsKIAlpZiAoZW5kX2JpdCA+IHVzcGktPnNfZnBnKSB7CkBAIC0xNzMsMzYgKzE2NywzNiBAQAogCiAJdWNwaSA9IHVmc19sb2FkX2N5bGluZGVyIChzYiwgY2dubyk7CiAJaWYgKCF1Y3BpKSAKLQkJZ290byBmYWlsZWQ7Ci0JdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwkJZ290byBmYWlsZWRfdW5sb2NrOworCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIHsKIAkJdWZzX3BhbmljIChzYiwgInVmc19mcmVlX2Jsb2NrcyIsICJpbnRlcm5hbCBlcnJvciwgYmFkIG1hZ2ljIG51bWJlciBvbiBjZyAldSIsIGNnbm8pOwotCQlnb3RvIGZhaWxlZDsKKwkJZ290byBmYWlsZWRfdW5sb2NrOwogCX0KIAogCWZvciAoaSA9IGJpdDsgaSA8IGVuZF9iaXQ7IGkgKz0gdXNwaS0+c19mcGIpIHsKIAkJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MoaSk7Ci0JCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubykpIHsKKwkJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKSkgewogCQkJdWZzX2Vycm9yKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImZyZWVpbmcgZnJlZSBmcmFnbWVudCIpOwogCQl9Ci0JCXViaF9zZXRibG9jayhVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CisJCXViaF9zZXRibG9jayhVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CiAJCWlmICgoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19DR19NQVNLKSA9PSBVRlNfQ0dfNDRCU0QpCiAJCQl1ZnNfY2x1c3RlcmFjY3QgKHNiLCB1Y3BpLCBibGtubywgMSk7CiAJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIHVzcGktPnNfZnBiKTsKIAogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmJmcmVlLCAxKTsKLQkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJCXVzcGktPmNzX3RvdGFsLmNzX25iZnJlZSsrOwogCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25iZnJlZSwgMSk7CiAJCWN5bG5vID0gdWZzX2NidG9jeWxubyhpKTsKIAkJZnMxNl9hZGQoc2IsICZ1YmhfY2dfYmxrcyh1Y3BpLCBjeWxubywgdWZzX2NidG9ycG9zKGkpKSwgMSk7CiAJCWZzMzJfYWRkKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOwogCX0KIAotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOwotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgodXNwaSkpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgodWNwaSkpOwogCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7Ci0JCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikmdWNwaSk7Ci0JCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2soU1dSSVRFLCBVQ1BJX1VCSCh1Y3BpKSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgodWNwaSkpOwogCX0KIAogCWlmIChvdmVyZmxvdykgewpAQCAtMjEzLDM4ICsyMDcsMTI3IEBACiAKIAlzYi0+c19kaXJ0ID0gMTsKIAl1bmxvY2tfc3VwZXIgKHNiKTsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuOwogCi1mYWlsZWQ6CitmYWlsZWRfdW5sb2NrOgogCXVubG9ja19zdXBlciAoc2IpOwotCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKK2ZhaWxlZDoKKwlVRlNEKCJFWElUIChGQUlMRUQpXG4iKTsKIAlyZXR1cm47CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdWZzX2dldF9sb2NrZWRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKK3RyeV9hZ2FpbjoKKwlwYWdlID0gZmluZF9sb2NrX3BhZ2UobWFwcGluZywgaW5kZXgpOworCWlmICghcGFnZSkgeworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LAorCQkJCSAgICAgICAoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwKKwkJCQkgICAgICAgTlVMTCk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidWZzX2NoYW5nZV9ibG9ja25yOiAiCisJCQkgICAgICAgInJlYWRfY2FjaGVfcGFnZSBlcnJvcjogaW5vICVsdSwgaW5kZXg6ICVsdVxuIiwKKwkJCSAgICAgICBtYXBwaW5nLT5ob3N0LT5pX2lubywgaW5kZXgpOworCQkJZ290byBvdXQ7CisJCX0KIAotI2RlZmluZSBOVUxMSUZZX0ZSQUdNRU5UUyBcCi0JZm9yIChpID0gb2xkY291bnQ7IGkgPCBuZXdjb3VudDsgaSsrKSB7IFwKLQkJYmggPSBzYl9nZXRibGsoc2IsIHJlc3VsdCArIGkpOyBcCi0JCW1lbXNldCAoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsgXAotCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsgXAotCQltYXJrX2J1ZmZlcl9kaXJ0eSAoYmgpOyBcCi0JCWlmIChJU19TWU5DKGlub2RlKSkgXAotCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOyBcCi0JCWJyZWxzZSAoYmgpOyBcCisJCWxvY2tfcGFnZShwYWdlKTsKKworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBQYWdlRXJyb3IocGFnZSkpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCisJCQlwcmludGsoS0VSTl9FUlIgInVmc19jaGFuZ2VfYmxvY2tucjogIgorCQkJICAgICAgICJjYW4gbm90IHJlYWQgcGFnZTogaW5vICVsdSwgaW5kZXg6ICVsdVxuIiwKKwkJCSAgICAgICBtYXBwaW5nLT5ob3N0LT5pX2lubywgaW5kZXgpOworCisJCQlwYWdlID0gRVJSX1BUUigtRUlPKTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCi11bnNpZ25lZCB1ZnNfbmV3X2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICogaW5vZGUsIF9fZnMzMiAqIHAsIHVuc2lnbmVkIGZyYWdtZW50LAotCXVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50LCBpbnQgKiBlcnIgKQorCWlmICh1bmxpa2VseSghcGFnZS0+bWFwcGluZyB8fCAhcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJZ290byB0cnlfYWdhaW47Lyp3ZSByZWFsbHkgbmVlZCB0aGVzZSBidWZmZXJzKi8KKwl9CitvdXQ6CisJcmV0dXJuIHBhZ2U7Cit9CisKKy8qCisgKiBNb2RpZnkgaW5vZGUgcGFnZSBjYWNoZSBpbiBzdWNoIHdheToKKyAqIGhhdmUgLSBibG9ja3Mgd2l0aCBiX2Jsb2NrbnIgZXF1YWwgdG8gb2xkYi4uLm9sZGIrY291bnQtMQorICogZ2V0IC0gYmxvY2tzIHdpdGggYl9ibG9ja25yIGVxdWFsIHRvIG5ld2IuLi5uZXdiK2NvdW50LTEKKyAqIGFsc28gd2Ugc3VwcG9zZSB0aGF0IG9sZGIuLi5vbGRiK2NvdW50LTEgYmxvY2tzCisgKiBzaXR1YXRlZCBhdCB0aGUgZW5kIG9mIGZpbGUuCisgKgorICogV2UgY2FuIGNvbWUgaGVyZSBmcm9tIHVmc193cml0ZXBhZ2Ugb3IgdWZzX3ByZXBhcmVfd3JpdGUsCisgKiBsb2NrZWRfcGFnZSBpcyBhcmd1bWVudCBvZiB0aGVzZSBmdW5jdGlvbnMsIHNvIHdlIGFscmVhZHkgbG9jayBpdC4KKyAqLworc3RhdGljIHZvaWQgdWZzX2NoYW5nZV9ibG9ja25yKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBiYXNlYmxrLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IG9sZGIsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG5ld2IsIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSkKK3sKKwl1bnNpZ25lZCBpbnQgYmxrX3Blcl9wYWdlID0gMSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlwZ29mZl90IGluZGV4LCBjdXJfaW5kZXggPSBsb2NrZWRfcGFnZS0+aW5kZXg7CisJdW5zaWduZWQgaW50IGksIGo7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CisKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgY291bnQgJXUsIG9sZGIgJXUsIG5ld2IgJXVcbiIsCisJICAgICAgaW5vZGUtPmlfaW5vLCBjb3VudCwgb2xkYiwgbmV3Yik7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQobG9ja2VkX3BhZ2UpKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSArPSBibGtfcGVyX3BhZ2UpIHsKKwkJaW5kZXggPSAoYmFzZWJsaytpKSA+PiAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCisJCWlmIChsaWtlbHkoY3VyX2luZGV4ICE9IGluZGV4KSkgeworCQkJcGFnZSA9IHVmc19nZXRfbG9ja2VkX3BhZ2UobWFwcGluZywgaW5kZXgpOworCQkJaWYgKElTX0VSUihwYWdlKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQlwYWdlID0gbG9ja2VkX3BhZ2U7CisKKwkJaiA9IGk7CisJCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWJoID0gaGVhZDsKKwkJZG8geworCQkJaWYgKGxpa2VseShiaC0+Yl9ibG9ja25yID09IGogKyBvbGRiICYmIGogPCBjb3VudCkpIHsKKwkJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsCisJCQkJCQkJICBiaC0+Yl9ibG9ja25yKTsKKwkJCQliaC0+Yl9ibG9ja25yID0gbmV3YiArIGorKzsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQl9CisKKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKworCQlpZiAobGlrZWx5KGN1cl9pbmRleCAhPSBpbmRleCkpIHsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisgCX0KKwlVRlNEKCJFWElUXG4iKTsKK30KKwordW5zaWduZWQgdWZzX25ld19mcmFnbWVudHMoc3RydWN0IGlub2RlICogaW5vZGUsIF9fZnMzMiAqIHAsIHVuc2lnbmVkIGZyYWdtZW50LAorCQkJICAgdW5zaWduZWQgZ29hbCwgdW5zaWduZWQgY291bnQsIGludCAqIGVyciwgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlKQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLQl1bnNpZ25lZCBjZ25vLCBvbGRjb3VudCwgbmV3Y291bnQsIHRtcCwgcmVxdWVzdCwgaSwgcmVzdWx0OworCXVuc2lnbmVkIGNnbm8sIG9sZGNvdW50LCBuZXdjb3VudCwgdG1wLCByZXF1ZXN0LCByZXN1bHQ7CiAJCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQsIGdvYWwsIGNvdW50KSkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBnb2FsLCBjb3VudCk7CiAJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMjczLDE0ICszNTYsMTQgQEAKIAkJCXJldHVybiAodW5zaWduZWQpLTE7CiAJCX0KIAkJaWYgKGZyYWdtZW50IDwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnKSB7Ci0JCQlVRlNEKCgiRVhJVCAoQUxSRUFEWSBBTExPQ0FURUQpXG4iKSkKKwkJCVVGU0QoIkVYSVQgKEFMUkVBRFkgQUxMT0NBVEVEKVxuIik7CiAJCQl1bmxvY2tfc3VwZXIgKHNiKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCWVsc2UgewogCQlpZiAodG1wKSB7Ci0JCQlVRlNEKCgiRVhJVCAoQUxSRUFEWSBBTExPQ0FURUQpXG4iKSkKKwkJCVVGU0QoIkVYSVQgKEFMUkVBRFkgQUxMT0NBVEVEKVxuIik7CiAJCQl1bmxvY2tfc3VwZXIoc2IpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTI4OSw5ICszNzIsOSBAQAogCS8qCiAJICogVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBmb3IgdXNlciBvbiB0aGUgZGV2aWNlCiAJICovCi0JaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmIHVmc19mcmVlc3BhY2UodXNiMSwgVUZTX01JTkZSRUUpIDw9IDApIHsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYgdWZzX2ZyZWVzcGFjZSh1c3BpLCBVRlNfTUlORlJFRSkgPD0gMCkgewogCQl1bmxvY2tfc3VwZXIgKHNiKTsKLQkJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCQlVRlNEKCJFWElUIChGQUlMRUQpXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMTAsMTIgKzM5MywxMCBAQAogCQlpZiAocmVzdWx0KSB7CiAJCQkqcCA9IGNwdV90b19mczMyKHNiLCByZXN1bHQpOwogCQkJKmVyciA9IDA7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgKz0gY291bnQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CiAJCQlVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcgPSBtYXhfdCh1MzIsIFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZywgZnJhZ21lbnQgKyBjb3VudCk7Ci0JCQlOVUxMSUZZX0ZSQUdNRU5UUwogCQl9CiAJCXVubG9ja19zdXBlcihzYik7Ci0JCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCVVGU0QoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTMyNSwxMSArNDA2LDkgQEAKIAlyZXN1bHQgPSB1ZnNfYWRkX2ZyYWdtZW50cyAoaW5vZGUsIHRtcCwgb2xkY291bnQsIG5ld2NvdW50LCBlcnIpOwogCWlmIChyZXN1bHQpIHsKIAkJKmVyciA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyArPSBjb3VudCA8PCB1c3BpLT5zX25zcGZzaGlmdDsKIAkJVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnID0gbWF4X3QodTMyLCBVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcsIGZyYWdtZW50ICsgY291bnQpOwotCQlOVUxMSUZZX0ZSQUdNRU5UUwogCQl1bmxvY2tfc3VwZXIoc2IpOwotCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCQlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCkBAIC0zMzksOCArNDE4LDggQEAKIAlzd2l0Y2ggKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19vcHRpbSkpIHsKIAkgICAgY2FzZSBVRlNfT1BUU1BBQ0U6CiAJCXJlcXVlc3QgPSBuZXdjb3VudDsKLQkJaWYgKHVzcGktPnNfbWluZnJlZSA8IDUgfHwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlKSAKLQkJICAgID4gdXNwaS0+c19kc2l6ZSAqIHVzcGktPnNfbWluZnJlZSAvICgyICogMTAwKSApCisJCWlmICh1c3BpLT5zX21pbmZyZWUgPCA1IHx8IHVzcGktPmNzX3RvdGFsLmNzX25mZnJlZQorCQkgICAgPiB1c3BpLT5zX2RzaXplICogdXNwaS0+c19taW5mcmVlIC8gKDIgKiAxMDApKQogCQkJYnJlYWs7CiAJCXVzYjEtPmZzX29wdGltID0gY3B1X3RvX2ZzMzIoc2IsIFVGU19PUFRUSU1FKTsKIAkJYnJlYWs7CkBAIC0zNDksNyArNDI4LDcgQEAKIAkKIAkgICAgY2FzZSBVRlNfT1BUVElNRToKIAkJcmVxdWVzdCA9IHVzcGktPnNfZnBiOwotCQlpZiAoZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlKSA8IHVzcGktPnNfZHNpemUgKgorCQlpZiAodXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlIDwgdXNwaS0+c19kc2l6ZSAqCiAJCSAgICAodXNwaS0+c19taW5mcmVlIC0gMikgLyAxMDApCiAJCQlicmVhazsKIAkJdXNiMS0+ZnNfb3B0aW0gPSBjcHVfdG9fZnMzMihzYiwgVUZTX09QVFRJTUUpOwpAQCAtMzU3LDM5ICs0MzYsMjIgQEAKIAl9CiAJcmVzdWx0ID0gdWZzX2FsbG9jX2ZyYWdtZW50cyAoaW5vZGUsIGNnbm8sIGdvYWwsIHJlcXVlc3QsIGVycik7CiAJaWYgKHJlc3VsdCkgewotCQlmb3IgKGkgPSAwOyBpIDwgb2xkY291bnQ7IGkrKykgewotCQkJYmggPSBzYl9icmVhZChzYiwgdG1wICsgaSk7Ci0JCQlpZihiaCkKLQkJCXsKLQkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOwotCQkJCWJoLT5iX2Jsb2NrbnIgPSByZXN1bHQgKyBpOwotCQkJCW1hcmtfYnVmZmVyX2RpcnR5IChiaCk7Ci0JCQkJaWYgKElTX1NZTkMoaW5vZGUpKQotCQkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7Ci0JCQkJYnJlbHNlIChiaCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfbmV3X2ZyYWdtZW50czogYnJlYWQgZmFpbFxuIik7Ci0JCQkJdW5sb2NrX3N1cGVyKHNiKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQorCQl1ZnNfY2hhbmdlX2Jsb2NrbnIoaW5vZGUsIGZyYWdtZW50IC0gb2xkY291bnQsIG9sZGNvdW50LCB0bXAsCisJCQkJICAgcmVzdWx0LCBsb2NrZWRfcGFnZSk7CisKIAkJKnAgPSBjcHVfdG9fZnMzMihzYiwgcmVzdWx0KTsKIAkJKmVyciA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyArPSBjb3VudCA8PCB1c3BpLT5zX25zcGZzaGlmdDsKIAkJVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnID0gbWF4X3QodTMyLCBVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcsIGZyYWdtZW50ICsgY291bnQpOwotCQlOVUxMSUZZX0ZSQUdNRU5UUwogCQl1bmxvY2tfc3VwZXIoc2IpOwogCQlpZiAobmV3Y291bnQgPCByZXF1ZXN0KQogCQkJdWZzX2ZyZWVfZnJhZ21lbnRzIChpbm9kZSwgcmVzdWx0ICsgbmV3Y291bnQsIHJlcXVlc3QgLSBuZXdjb3VudCk7CiAJCXVmc19mcmVlX2ZyYWdtZW50cyAoaW5vZGUsIHRtcCwgb2xkY291bnQpOwotCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCQlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJdW5sb2NrX3N1cGVyKHNiKTsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuIDA7CiB9CQkKIApAQCAtNDA0LDcgKzQ2Niw3IEBACiAJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKIAl1bnNpZ25lZCBjZ25vLCBmcmFnbm8sIGZyYWdvZmYsIGNvdW50LCBmcmFnc2l6ZSwgaTsKIAkKLQlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBvbGRjb3VudCAldSwgbmV3Y291bnQgJXVcbiIsIGZyYWdtZW50LCBvbGRjb3VudCwgbmV3Y291bnQpKQorCVVGU0QoIkVOVEVSLCBmcmFnbWVudCAldSwgb2xkY291bnQgJXUsIG5ld2NvdW50ICV1XG4iLCBmcmFnbWVudCwgb2xkY291bnQsIG5ld2NvdW50KTsKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC00MTksNyArNDgxLDcgQEAKIAl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKIAlpZiAoIXVjcGkpCiAJCXJldHVybiAwOwotCXVjZyA9IHViaF9nZXRfdWNnIChVQ1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgewogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2FkZF9mcmFnbWVudHMiLAogCQkJImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CkBAIC00MjksMTQgKzQ5MSwxNCBAQAogCWZyYWdubyA9IHVmc19kdG9nZCAoZnJhZ21lbnQpOwogCWZyYWdvZmYgPSB1ZnNfZnJhZ251bSAoZnJhZ25vKTsKIAlmb3IgKGkgPSBvbGRjb3VudDsgaSA8IG5ld2NvdW50OyBpKyspCi0JCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpKQorCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKSkKIAkJCXJldHVybiAwOwogCS8qCiAJICogQmxvY2sgY2FuIGJlIGV4dGVuZGVkCiAJICovCiAJdWNnLT5jZ190aW1lID0gY3B1X3RvX2ZzMzIoc2IsIGdldF9zZWNvbmRzKCkpOwogCWZvciAoaSA9IG5ld2NvdW50OyBpIDwgKHVzcGktPnNfZnBiIC0gZnJhZ29mZik7IGkrKykKLQkJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgZnJhZ25vICsgaSkpCisJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpKQogCQkJYnJlYWs7CiAJZnJhZ3NpemUgPSBpIC0gb2xkY291bnQ7CiAJaWYgKCFmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19mcnN1bVtmcmFnc2l6ZV0pKQpAQCAtNDQ2LDcgKzUwOCw3IEBACiAJaWYgKGZyYWdzaXplICE9IGNvdW50KQogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfZnJzdW1bZnJhZ3NpemUgLSBjb3VudF0sIDEpOwogCWZvciAoaSA9IG9sZGNvdW50OyBpIDwgbmV3Y291bnQ7IGkrKykKLQkJdWJoX2NscmJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgZnJhZ25vICsgaSk7CisJCXViaF9jbHJiaXQgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpOwogCWlmKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCBjb3VudCkpIHsKIAkJKmVyciA9IC1FRFFVT1Q7CiAJCXJldHVybiAwOwpAQCAtNDU0LDE3ICs1MTYsMTcgQEAKIAogCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIGNvdW50KTsKIAlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgY291bnQpOwotCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGNvdW50KTsKKwl1c3BpLT5jc190b3RhbC5jc19uZmZyZWUgLT0gY291bnQ7CiAJCi0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7Ci0JdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCh1c3BpKSk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIFVDUElfVUJIKHVjcGkpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCh1Y3BpKSk7CiAJfQogCXNiLT5zX2RpcnQgPSAxOwogCi0JVUZTRCgoIkVYSVQsIGZyYWdtZW50ICV1XG4iLCBmcmFnbWVudCkpCisJVUZTRCgiRVhJVCwgZnJhZ21lbnQgJXVcbiIsIGZyYWdtZW50KTsKIAkKIAlyZXR1cm4gZnJhZ21lbnQ7CiB9CkBAIC00ODcsNyArNTQ5LDcgQEAKIAlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOwogCXVuc2lnbmVkIG9sZGNnLCBpLCBqLCBrLCByZXN1bHQsIGFsbG9jc2l6ZTsKIAkKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGNnbm8gJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGNnbm8sIGdvYWwsIGNvdW50KSkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgY2dubyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIGlub2RlLT5pX2lubywgY2dubywgZ29hbCwgY291bnQpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtNTIxLDE0ICs1ODMsMTQgQEAKIAkJVUZTX1RFU1RfRlJFRV9TUEFDRV9DRwogCX0KIAkKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuIDA7CiAKIGNnX2ZvdW5kOgogCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnbm8pOwogCWlmICghdWNwaSkKIAkJcmV0dXJuIDA7Ci0JdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgodWNwaSkpOwogCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSAKIAkJdWZzX3BhbmljIChzYiwgInVmc19hbGxvY19mcmFnbWVudHMiLAogCQkJImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CkBAIC01NTEsMTIgKzYxMywxMiBAQAogCQkJcmV0dXJuIDA7CiAJCWdvYWwgPSB1ZnNfZHRvZ2QgKHJlc3VsdCk7CiAJCWZvciAoaSA9IGNvdW50OyBpIDwgdXNwaS0+c19mcGI7IGkrKykKLQkJCXViaF9zZXRiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGdvYWwgKyBpKTsKKwkJCXViaF9zZXRiaXQgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGdvYWwgKyBpKTsKIAkJaSA9IHVzcGktPnNfZnBiIC0gY291bnQ7CiAJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGkpOwogCiAJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIGkpOwotCQlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlLCBpKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlICs9IGk7CiAJCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmZmcmVlLCBpKTsKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2Zyc3VtW2ldLCAxKTsKIAkJZ290byBzdWNjZWQ7CkBAIC01NzAsMTAgKzYzMiwxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXViaF9jbHJiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIHJlc3VsdCArIGkpOworCQl1YmhfY2xyYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCByZXN1bHQgKyBpKTsKIAkKIAlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBjb3VudCk7Ci0JZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgY291bnQpOworCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSAtPSBjb3VudDsKIAlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgY291bnQpOwogCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19mcnN1bVthbGxvY3NpemVdLCAxKTsKIApAQCAtNTgxLDE2ICs2NDMsMTYgQEAKIAkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2Zyc3VtW2FsbG9jc2l6ZSAtIGNvdW50XSwgMSk7CiAKIHN1Y2NlZDoKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOwotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgVUNQSV9VQkgodWNwaSkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKHVjcGkpKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CiAKIAlyZXN1bHQgKz0gY2dubyAqIHVzcGktPnNfZnBnOwotCVVGU0QoKCJFWElUMywgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCVVGU0QoIkVYSVQzLCByZXN1bHQgJXVcbiIsIHJlc3VsdCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtNjAzLDEyICs2NjUsMTIgQEAKIAlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOwogCXVuc2lnbmVkIHJlc3VsdCwgY3lsbm8sIGJsa25vOwogCi0JVUZTRCgoIkVOVEVSLCBnb2FsICV1XG4iLCBnb2FsKSkKKwlVRlNEKCJFTlRFUiwgZ29hbCAldVxuIiwgZ29hbCk7CiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CiAJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwotCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCh1Y3BpKSk7CiAKIAlpZiAoZ29hbCA9PSAwKSB7CiAJCWdvYWwgPSB1Y3BpLT5jX3JvdG9yOwpAQCAtNjIwLDcgKzY4Miw3IEBACiAJLyoKIAkgKiBJZiB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzIGF2YWlsYWJsZSwgdXNlIGl0LgogCSAqLwotCWlmICh1YmhfaXNibG9ja3NldChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCB1ZnNfZnJhZ3N0b2Jsa3MoZ29hbCkpKSB7CisJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIHVmc19mcmFnc3RvYmxrcyhnb2FsKSkpIHsKIAkJcmVzdWx0ID0gZ29hbDsKIAkJZ290byBnb3RpdDsKIAl9CkBAIC02MzIsNyArNjk0LDcgQEAKIAl1Y3BpLT5jX3JvdG9yID0gcmVzdWx0OwogZ290aXQ6CiAJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MocmVzdWx0KTsKLQl1YmhfY2xyYmxvY2sgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKTsKKwl1YmhfY2xyYmxvY2sgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKTsKIAlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQogCQl1ZnNfY2x1c3RlcmFjY3QgKHNiLCB1Y3BpLCBibGtubywgLTEpOwogCWlmKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCB1c3BpLT5zX2ZwYikpIHsKQEAgLTY0MSwzMSArNzAzLDc2IEBACiAJfQogCiAJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7Ci0JZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJdXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlLS07CiAJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyh1Y3BpLT5jX2NneCkuY3NfbmJmcmVlLCAxKTsKIAljeWxubyA9IHVmc19jYnRvY3lsbm8ocmVzdWx0KTsKIAlmczE2X3N1YihzYiwgJnViaF9jZ19ibGtzKHVjcGksIGN5bG5vLCB1ZnNfY2J0b3Jwb3MocmVzdWx0KSksIDEpOwogCWZzMzJfc3ViKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOwogCQotCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJVUZTRCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpOwogCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIHVmc19iaXRtYXBfc2VhcmNoIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKLQlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGksIHVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50KQorc3RhdGljIHVuc2lnbmVkIHViaF9zY2FuYyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSwKKwkJCSAgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqdWJoLAorCQkJICB1bnNpZ25lZCBiZWdpbiwgdW5zaWduZWQgc2l6ZSwKKwkJCSAgdW5zaWduZWQgY2hhciAqdGFibGUsIHVuc2lnbmVkIGNoYXIgbWFzaykKIHsKLQlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7Ci0Jc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7Ci0Jc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKLQl1bnNpZ25lZCBzdGFydCwgbGVuZ3RoLCBsb2NhdGlvbiwgcmVzdWx0OwotCXVuc2lnbmVkIHBvc3NpdGlvbiwgZnJhZ3NpemUsIGJsb2NrbWFwLCBtYXNrOworCXVuc2lnbmVkIHJlc3QsIG9mZnNldDsKKwl1bnNpZ25lZCBjaGFyICpjcDsKIAkKLQlVRlNEKCgiRU5URVIsIGNnICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgdWNwaS0+Y19jZ3gsIGdvYWwsIGNvdW50KSkKIAotCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJb2Zmc2V0ID0gYmVnaW4gJiB+dXNwaS0+c19mbWFzazsKKwliZWdpbiA+Pj0gdXNwaS0+c19mc2hpZnQ7CisJZm9yICg7OykgeworCQlpZiAoKG9mZnNldCArIHNpemUpIDwgdXNwaS0+c19mc2l6ZSkKKwkJCXJlc3QgPSBzaXplOworCQllbHNlCisJCQlyZXN0ID0gdXNwaS0+c19mc2l6ZSAtIG9mZnNldDsKKwkJc2l6ZSAtPSByZXN0OworCQljcCA9IHViaC0+YmhbYmVnaW5dLT5iX2RhdGEgKyBvZmZzZXQ7CisJCXdoaWxlICgodGFibGVbKmNwKytdICYgbWFzaykgPT0gMCAmJiAtLXJlc3QpCisJCQk7CisJCWlmIChyZXN0IHx8ICFzaXplKQorCQkJYnJlYWs7CisJCWJlZ2luKys7CisJCW9mZnNldCA9IDA7CisJfQorCXJldHVybiAoc2l6ZSArIHJlc3QpOworfQorCisvKgorICogRmluZCBhIGJsb2NrIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBpbiB0aGUgc3BlY2lmaWVkIGN5bGluZGVyIGdyb3VwLgorICogQHNwOiBwb2ludGVyIHRvIHN1cGVyIGJsb2NrCisgKiBAdWNwaTogcG9pbnRlciB0byBjeWxpbmRlciBncm91cCBpbmZvCisgKiBAZ29hbDogbmVhciB3aGljaCBibG9jayB3ZSB3YW50IGZpbmQgbmV3IG9uZQorICogQGNvdW50OiBzcGVjaWZpZWQgc2l6ZQorICovCitzdGF0aWMgdW5zaWduZWQgdWZzX2JpdG1hcF9zZWFyY2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgIHN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICp1Y3BpLAorCQkJCSAgdW5zaWduZWQgZ29hbCwgdW5zaWduZWQgY291bnQpCit7CisJLyoKKwkgKiBCaXQgcGF0dGVybnMgZm9yIGlkZW50aWZ5aW5nIGZyYWdtZW50cyBpbiB0aGUgYmxvY2sgbWFwCisJICogdXNlZCBhcyAoKG1hcCAmIG1hc2tfYXJyKSA9PSB3YW50X2FycikKKwkgKi8KKwlzdGF0aWMgY29uc3QgaW50IG1hc2tfYXJyWzldID0geworCQkweDMsIDB4NywgMHhmLCAweDFmLCAweDNmLCAweDdmLCAweGZmLCAweDFmZiwgMHgzZmYKKwl9OworCXN0YXRpYyBjb25zdCBpbnQgd2FudF9hcnJbOV0gPSB7CisJCTB4MCwgMHgyLCAweDYsIDB4ZSwgMHgxZSwgMHgzZSwgMHg3ZSwgMHhmZSwgMHgxZmUKKwl9OworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKnVzYjE7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqdWNnOworCXVuc2lnbmVkIHN0YXJ0LCBsZW5ndGgsIGxvYywgcmVzdWx0OworCXVuc2lnbmVkIHBvcywgd2FudCwgYmxvY2ttYXAsIG1hc2ssIGVuZDsKKworCVVGU0QoIkVOVEVSLCBjZyAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIHVjcGktPmNfY2d4LCBnb2FsLCBjb3VudCk7CisKIAl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwotCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCh1Y3BpKSk7CiAKIAlpZiAoZ29hbCkKIAkJc3RhcnQgPSB1ZnNfZHRvZ2QoZ29hbCkgPj4gMzsKQEAgLTY3Myw1MyArNzgwLDUwIEBACiAJCXN0YXJ0ID0gdWNwaS0+Y19mcm90b3IgPj4gMzsKIAkJCiAJbGVuZ3RoID0gKCh1c3BpLT5zX2ZwZyArIDcpID4+IDMpIC0gc3RhcnQ7Ci0JbG9jYXRpb24gPSB1Ymhfc2NhbmMoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiArIHN0YXJ0LCBsZW5ndGgsCisJbG9jID0gdWJoX3NjYW5jKHVzcGksIFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYgKyBzdGFydCwgbGVuZ3RoLAogCQkodXNwaS0+c19mcGIgPT0gOCkgPyB1ZnNfZnJhZ3RhYmxlXzhmcGIgOiB1ZnNfZnJhZ3RhYmxlX290aGVyLAogCQkxIDw8IChjb3VudCAtIDEgKyAodXNwaS0+c19mcGIgJiA3KSkpOyAKLQlpZiAobG9jYXRpb24gPT0gMCkgeworCWlmIChsb2MgPT0gMCkgewogCQlsZW5ndGggPSBzdGFydCArIDE7Ci0JCWxvY2F0aW9uID0gdWJoX3NjYW5jKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGxlbmd0aCwgCi0JCQkodXNwaS0+c19mcGIgPT0gOCkgPyB1ZnNfZnJhZ3RhYmxlXzhmcGIgOiB1ZnNfZnJhZ3RhYmxlX290aGVyLAotCQkJMSA8PCAoY291bnQgLSAxICsgKHVzcGktPnNfZnBiICYgNykpKTsKLQkJaWYgKGxvY2F0aW9uID09IDApIHsKLQkJCXVmc19lcnJvciAoc2IsICJ1ZnNfYml0bWFwX3NlYXJjaCIsCi0JCQkiYml0bWFwIGNvcnJ1cHRlZCBvbiBjZyAldSwgc3RhcnQgJXUsIGxlbmd0aCAldSwgY291bnQgJXUsIGZyZWVvZmYgJXVcbiIsCi0JCQl1Y3BpLT5jX2NneCwgc3RhcnQsIGxlbmd0aCwgY291bnQsIHVjcGktPmNfZnJlZW9mZik7CisJCWxvYyA9IHViaF9zY2FuYyh1c3BpLCBVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19mcmVlb2ZmLCBsZW5ndGgsCisJCQkJKHVzcGktPnNfZnBiID09IDgpID8gdWZzX2ZyYWd0YWJsZV84ZnBiIDoKKwkJCQl1ZnNfZnJhZ3RhYmxlX290aGVyLAorCQkJCTEgPDwgKGNvdW50IC0gMSArICh1c3BpLT5zX2ZwYiAmIDcpKSk7CisJCWlmIChsb2MgPT0gMCkgeworCQkJdWZzX2Vycm9yKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLAorCQkJCSAgImJpdG1hcCBjb3JydXB0ZWQgb24gY2cgJXUsIHN0YXJ0ICV1LCIKKwkJCQkgICIgbGVuZ3RoICV1LCBjb3VudCAldSwgZnJlZW9mZiAldVxuIiwKKwkJCQkgIHVjcGktPmNfY2d4LCBzdGFydCwgbGVuZ3RoLCBjb3VudCwKKwkJCQkgIHVjcGktPmNfZnJlZW9mZik7CiAJCQlyZXR1cm4gKHVuc2lnbmVkKS0xOwogCQl9CiAJCXN0YXJ0ID0gMDsKIAl9Ci0JcmVzdWx0ID0gKHN0YXJ0ICsgbGVuZ3RoIC0gbG9jYXRpb24pIDw8IDM7CisJcmVzdWx0ID0gKHN0YXJ0ICsgbGVuZ3RoIC0gbG9jKSA8PCAzOwogCXVjcGktPmNfZnJvdG9yID0gcmVzdWx0OwogCiAJLyoKIAkgKiBmb3VuZCB0aGUgYnl0ZSBpbiB0aGUgbWFwCiAJICovCi0JYmxvY2ttYXAgPSB1YmhfYmxrbWFwKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIHJlc3VsdCk7Ci0JZnJhZ3NpemUgPSAwOwotCWZvciAocG9zc2l0aW9uID0gMCwgbWFzayA9IDE7IHBvc3NpdGlvbiA8IDg7IHBvc3NpdGlvbisrLCBtYXNrIDw8PSAxKSB7Ci0JCWlmIChibG9ja21hcCAmIG1hc2spIHsKLQkJCWlmICghKHBvc3NpdGlvbiAmIHVzcGktPnNfZnBibWFzaykpCi0JCQkJZnJhZ3NpemUgPSAxOwotCQkJZWxzZSAKLQkJCQlmcmFnc2l6ZSsrOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGZyYWdzaXplID09IGNvdW50KSB7Ci0JCQkJcmVzdWx0ICs9IHBvc3NpdGlvbiAtIGNvdW50OwotCQkJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWZyYWdzaXplID0gMDsKLQkJfQotCX0KLQlpZiAoZnJhZ3NpemUgPT0gY291bnQpIHsKLQkJcmVzdWx0ICs9IHBvc3NpdGlvbiAtIGNvdW50OwotCQlVRlNEKCgiRVhJVCwgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQl1ZnNfZXJyb3IgKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLCAiYmxvY2sgbm90IGluIG1hcCBvbiBjZyAldVxuIiwgdWNwaS0+Y19jZ3gpOwotCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKworCWZvciAoZW5kID0gcmVzdWx0ICsgODsgcmVzdWx0IDwgZW5kOyByZXN1bHQgKz0gdXNwaS0+c19mcGIpIHsKKwkJYmxvY2ttYXAgPSB1YmhfYmxrbWFwKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2ZyZWVvZmYsIHJlc3VsdCk7CisJCWJsb2NrbWFwIDw8PSAxOworCQltYXNrID0gbWFza19hcnJbY291bnRdOworCQl3YW50ID0gd2FudF9hcnJbY291bnRdOworCQlmb3IgKHBvcyA9IDA7IHBvcyA8PSB1c3BpLT5zX2ZwYiAtIGNvdW50OyBwb3MrKykgeworCQkJaWYgKChibG9ja21hcCAmIG1hc2spID09IHdhbnQpIHsKKwkJCQlVRlNEKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCk7CisJCQkJcmV0dXJuIHJlc3VsdCArIHBvczsKKyAJCQl9CisJCQltYXNrIDw8PSAxOworCQkJd2FudCA8PD0gMTsKKyAJCX0KKyAJfQorCisJdWZzX2Vycm9yKHNiLCAidWZzX2JpdG1hcF9zZWFyY2giLCAiYmxvY2sgbm90IGluIG1hcCBvbiBjZyAldVxuIiwKKwkJICB1Y3BpLT5jX2NneCk7CisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuICh1bnNpZ25lZCktMTsKIH0KIApAQCAtNzM0LDkgKzgzOCw5IEBACiAJCXJldHVybjsKIAogCWlmIChjbnQgPiAwKQotCQl1Ymhfc2V0Yml0KFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGJsa25vKTsKKwkJdWJoX3NldGJpdChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBibGtubyk7CiAJZWxzZQotCQl1YmhfY2xyYml0KFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGJsa25vKTsKKwkJdWJoX2NscmJpdChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBibGtubyk7CiAKIAkvKgogCSAqIEZpbmQgdGhlIHNpemUgb2YgdGhlIGNsdXN0ZXIgZ29pbmcgZm9yd2FyZC4KQEAgLTc0NSw3ICs4NDksNyBAQAogCWVuZCA9IHN0YXJ0ICsgdXNwaS0+c19jb250aWdzdW1zaXplOwogCWlmICggZW5kID49IHVjcGktPmNfbmNsdXN0ZXJibGtzKQogCQllbmQgPSB1Y3BpLT5jX25jbHVzdGVyYmxrczsKLQlpID0gdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdCAoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3Rlcm9mZiwgZW5kLCBzdGFydCk7CisJaSA9IHViaF9maW5kX25leHRfemVyb19iaXQgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGVuZCwgc3RhcnQpOwogCWlmIChpID4gZW5kKQogCQlpID0gZW5kOwogCWZvcncgPSBpIC0gc3RhcnQ7CkBAIC03NTcsNyArODYxLDcgQEAKIAllbmQgPSBzdGFydCAtIHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKIAlpZiAoZW5kIDwgMCApIAogCQllbmQgPSAtMTsKLQlpID0gdWJoX2ZpbmRfbGFzdF96ZXJvX2JpdCAoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3Rlcm9mZiwgc3RhcnQsIGVuZCk7CisJaSA9IHViaF9maW5kX2xhc3RfemVyb19iaXQgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIHN0YXJ0LCBlbmQpOwogCWlmICggaSA8IGVuZCkgCiAJCWkgPSBlbmQ7CiAJYmFjayA9IHN0YXJ0IC0gaTsKQEAgLTc2OSwxMSArODczLDExIEBACiAJaSA9IGJhY2sgKyBmb3J3ICsgMTsKIAlpZiAoaSA+IHVzcGktPnNfY29udGlnc3Vtc2l6ZSkKIAkJaSA9IHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKLQlmczMyX2FkZChzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoaSA8PCAyKSksIGNudCk7CisJZnMzMl9hZGQoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGkgPDwgMikpLCBjbnQpOwogCWlmIChiYWNrID4gMCkKLQkJZnMzMl9zdWIoc2IsIChfX2ZzMzIqKXViaF9nZXRfYWRkcihVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmICsgKGJhY2sgPDwgMikpLCBjbnQpOworCQlmczMyX3N1YihzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoYmFjayA8PCAyKSksIGNudCk7CiAJaWYgKGZvcncgPiAwKQotCQlmczMyX3N1YihzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoZm9ydyA8PCAyKSksIGNudCk7CisJCWZzMzJfc3ViKHNiLCAoX19mczMyKil1YmhfZ2V0X2FkZHIoVUNQSV9VQkgodWNwaSksIHVjcGktPmNfY2x1c3RlcnN1bW9mZiArIChmb3J3IDw8IDIpKSwgY250KTsKIH0KIAogCmRpZmYgLS1naXQgYS9mcy91ZnMvY3lsaW5kZXIuYyBiL2ZzL3Vmcy9jeWxpbmRlci5jCmluZGV4IDE0YWJiOGIuLjA5YzM5ZTUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9jeWxpbmRlci5jCisrKyBiL2ZzL3Vmcy9jeWxpbmRlci5jCkBAIC0yMCwxNSArMjAsNiBAQAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSN1bmRlZiBVRlNfQ1lMSU5ERVJfREVCVUcKLQotI2lmZGVmIFVGU19DWUxJTkRFUl9ERUJVRwotI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQotCiAvKgogICogUmVhZCBjeWxpbmRlciBncm91cCBpbnRvIGNhY2hlLiBUaGUgbWVtb3J5IHNwYWNlIGZvciB1ZnNfY2dfcHJpdmF0ZV9pbmZvCiAgKiBzdHJ1Y3R1cmUgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgZHVyaW5nIHVmc19yZWFkX3N1cGVyLgpAQCAtNDIsMTkgKzMzLDE5IEBACiAJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKIAl1bnNpZ25lZCBpLCBqOwogCi0JVUZTRCgoIkVOVEVSLCBjZ25vICV1LCBiaXRtYXBfbnIgJXVcbiIsIGNnbm8sIGJpdG1hcF9ucikpCisJVUZTRCgiRU5URVIsIGNnbm8gJXUsIGJpdG1hcF9uciAldVxuIiwgY2dubywgYml0bWFwX25yKTsKIAl1c3BpID0gc2JpLT5zX3VzcGk7CiAJdWNwaSA9IHNiaS0+c191Y3BpW2JpdG1hcF9ucl07CiAJdWNnID0gKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKilzYmktPnNfdWNnW2Nnbm9dLT5iX2RhdGE7CiAKLQlVQ1BJX1VCSC0+ZnJhZ21lbnQgPSB1ZnNfY2djbWluKGNnbm8pOwotCVVDUElfVUJILT5jb3VudCA9IHVzcGktPnNfY2dzaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCVVDUElfVUJIKHVjcGkpLT5mcmFnbWVudCA9IHVmc19jZ2NtaW4oY2dubyk7CisJVUNQSV9VQkgodWNwaSktPmNvdW50ID0gdXNwaS0+c19jZ3NpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CiAJLyoKIAkgKiBXZSBoYXZlIGFscmVhZHkgdGhlIGZpcnN0IGZyYWdtZW50IG9mIGN5bGluZGVyIGdyb3VwIGJsb2NrIGluIGJ1ZmZlcgogCSAqLwotCVVDUElfVUJILT5iaFswXSA9IHNiaS0+c191Y2dbY2dub107Ci0JZm9yIChpID0gMTsgaSA8IFVDUElfVUJILT5jb3VudDsgaSsrKQotCQlpZiAoIShVQ1BJX1VCSC0+YmhbaV0gPSBzYl9icmVhZChzYiwgVUNQSV9VQkgtPmZyYWdtZW50ICsgaSkpKQorCVVDUElfVUJIKHVjcGkpLT5iaFswXSA9IHNiaS0+c191Y2dbY2dub107CisJZm9yIChpID0gMTsgaSA8IFVDUElfVUJIKHVjcGkpLT5jb3VudDsgaSsrKQorCQlpZiAoIShVQ1BJX1VCSCh1Y3BpKS0+YmhbaV0gPSBzYl9icmVhZChzYiwgVUNQSV9VQkgodWNwaSktPmZyYWdtZW50ICsgaSkpKQogCQkJZ290byBmYWlsZWQ7CiAJc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9IGNnbm87CiAJCQkKQEAgLTczLDcgKzY0LDcgQEAKIAl1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJzdW1vZmYpOwogCXVjcGktPmNfY2x1c3Rlcm9mZiA9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX3UuY2dfNDQuY2dfY2x1c3Rlcm9mZik7CiAJdWNwaS0+Y19uY2x1c3RlcmJsa3MgPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ191LmNnXzQ0LmNnX25jbHVzdGVyYmxrcyk7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybjsJCiAJCiBmYWlsZWQ6CkBAIC05NSwxNSArODYsMTUgQEAKIAlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOwogCXVuc2lnbmVkIGk7CiAKLQlVRlNEKCgiRU5URVIsIGJpdG1hcF9uciAldVxuIiwgYml0bWFwX25yKSkKKwlVRlNEKCJFTlRFUiwgYml0bWFwX25yICV1XG4iLCBiaXRtYXBfbnIpOwogCiAJdXNwaSA9IHNiaS0+c191c3BpOwogCWlmIChzYmktPnNfY2dub1tiaXRtYXBfbnJdID09IFVGU19DR05PX0VNUFRZKSB7Ci0JCVVGU0QoKCJFWElUXG4iKSkKKwkJVUZTRCgiRVhJVFxuIik7CiAJCXJldHVybjsKIAl9CiAJdWNwaSA9IHNiaS0+c191Y3BpW2JpdG1hcF9ucl07Ci0JdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKHVjcGkpKTsKIAogCWlmICh1c3BpLT5zX25jZyA+IFVGU19NQVhfR1JPVVBfTE9BREVEICYmIGJpdG1hcF9uciA+PSBzYmktPnNfY2dfbG9hZGVkKSB7CiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfcHV0X2N5bGluZGVyIiwgImludGVybmFsIGVycm9yIik7CkBAIC0xMTYsMTMgKzEwNywxMyBAQAogCXVjZy0+Y2dfcm90b3IgPSBjcHVfdG9fZnMzMihzYiwgdWNwaS0+Y19yb3Rvcik7CiAJdWNnLT5jZ19mcm90b3IgPSBjcHVfdG9fZnMzMihzYiwgdWNwaS0+Y19mcm90b3IpOwogCXVjZy0+Y2dfaXJvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfaXJvdG9yKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKLQlmb3IgKGkgPSAxOyBpIDwgVUNQSV9VQkgtPmNvdW50OyBpKyspIHsKLQkJYnJlbHNlIChVQ1BJX1VCSC0+YmhbaV0pOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgodWNwaSkpOworCWZvciAoaSA9IDE7IGkgPCBVQ1BJX1VCSCh1Y3BpKS0+Y291bnQ7IGkrKykgeworCQlicmVsc2UgKFVDUElfVUJIKHVjcGkpLT5iaFtpXSk7CiAJfQogCiAJc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9IFVGU19DR05PX0VNUFRZOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIH0KIAogLyoKQEAgLTEzOSw3ICsxMzAsNyBAQAogCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKIAl1bnNpZ25lZCBjZywgaSwgajsKIAotCVVGU0QoKCJFTlRFUiwgY2dubyAldVxuIiwgY2dubykpCisJVUZTRCgiRU5URVIsIGNnbm8gJXVcbiIsIGNnbm8pOwogCiAJdXNwaSA9IHNiaS0+c191c3BpOwogCWlmIChjZ25vID49IHVzcGktPnNfbmNnKSB7CkBAIC0xNTAsNyArMTQxLDcgQEAKIAkgKiBDeWxpbmRlciBncm91cCBudW1iZXIgY2cgaXQgaW4gY2FjaGUgYW5kIGl0IHdhcyBsYXN0IHVzZWQKIAkgKi8KIAlpZiAoc2JpLT5zX2Nnbm9bMF0gPT0gY2dubykgewotCQlVRlNEKCgiRVhJVFxuIikpCisJCVVGU0QoIkVYSVRcbiIpOwogCQlyZXR1cm4gc2JpLT5zX3VjcGlbMF07CiAJfQogCS8qCkBAIC0xNjAsMTYgKzE1MSwxNiBAQAogCQlpZiAoc2JpLT5zX2Nnbm9bY2dub10gIT0gVUZTX0NHTk9fRU1QVFkpIHsKIAkJCWlmIChzYmktPnNfY2dub1tjZ25vXSAhPSBjZ25vKSB7CiAJCQkJdWZzX3BhbmljIChzYiwgInVmc19sb2FkX2N5bGluZGVyIiwgImludGVybmFsIGVycm9yLCB3cm9uZyBudW1iZXIgb2YgY2cgaW4gY2FjaGUiKTsKLQkJCQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJCQkJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCQllbHNlIHsKLQkJCQlVRlNEKCgiRVhJVFxuIikpCisJCQkJVUZTRCgiRVhJVFxuIik7CiAJCQkJcmV0dXJuIHNiaS0+c191Y3BpW2Nnbm9dOwogCQkJfQogCQl9IGVsc2UgewogCQkJdWZzX3JlYWRfY3lsaW5kZXIgKHNiLCBjZ25vLCBjZ25vKTsKLQkJCVVGU0QoKCJFWElUXG4iKSkKKwkJCVVGU0QoIkVYSVRcbiIpOwogCQkJcmV0dXJuIHNiaS0+c191Y3BpW2Nnbm9dOwogCQl9CiAJfQpAQCAtMjA0LDYgKzE5NSw2IEBACiAJCXNiaS0+c191Y3BpWzBdID0gdWNwaTsKIAkJdWZzX3JlYWRfY3lsaW5kZXIgKHNiLCBjZ25vLCAwKTsKIAl9Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXJldHVybiBzYmktPnNfdWNwaVswXTsKIH0KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9kaXIuYyBiL2ZzL3Vmcy9kaXIuYwppbmRleCAxYTU2MTIwLi43ZjBhMGFhIDEwMDY0NAotLS0gYS9mcy91ZnMvZGlyLmMKKysrIGIvZnMvdWZzL2Rpci5jCkBAIC0xMSwzMSArMTEsMjAgQEAKICAqIDQuNEJTRCAoRnJlZUJTRCkgc3VwcG9ydCBhZGRlZCBvbiBGZWJydWFyeSAxc3QgMTk5OCBieQogICogTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+IHBhcnRpYWxseSBiYXNlZAogICogb24gY29kZSBieSBNYXJ0aW4gdm9uIExvZXdpcyA8bWFydGluQG1pcmEuaXNkbi5jcy50dS1iZXJsaW4uZGU+LgorICoKKyAqIE1pZ3JhdGlvbiB0byB1c2FnZSBvZiAicGFnZSBjYWNoZSIgb24gTWF5IDIwMDYgYnkKKyAqIEV2Z2VuaXkgRHVzaGlzdG92IDxkdXNoaXN0b3ZAbWFpbC5ydT4gYmFzZWQgb24gZXh0MiBjb2RlIGJhc2UuCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19ESVJfREVCVUcKLQotI2lmZGVmIFVGU19ESVJfREVCVUcKLSNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKLSNlbHNlCi0jZGVmaW5lIFVGU0QoeCkKLSNlbmRpZgotCi1zdGF0aWMgaW50Ci11ZnNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqLAotCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBsb25nKTsKLQotCiAvKgogICogTk9URSEgdW5saWtlIHN0cm5jbXAsIHVmc19tYXRjaCByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuCiAgKgpAQCAtNTEsNDk1ICs0MCw1NDEgQEAKIAlyZXR1cm4gIW1lbWNtcChuYW1lLCBkZS0+ZF9uYW1lLCBsZW4pOwogfQogCi0vKgotICogVGhpcyBpcyBibGF0YW50bHkgc3RvbGVuIGZyb20gZXh0MmZzCi0gKi8KLXN0YXRpYyBpbnQKLXVmc19yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQorc3RhdGljIGludCB1ZnNfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7Ci0JaW50IGVycm9yID0gMDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGJsazsKLQlpbnQgaSwgc3RvcmVkOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0JaW50IGRlX3JlY2xlbjsKLQl1bnNpZ25lZCBmbGFnczsKLQl1NjQgICAgIGJsaz0gMEw7CisJc3RydWN0IGlub2RlICpkaXIgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCBlcnIgPSAwOworCWRpci0+aV92ZXJzaW9uKys7CisJcGFnZS0+bWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJZXJyID0gd3JpdGVfb25lX3BhZ2UocGFnZSwgMSk7CisJZWxzZQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQogCi0JbG9ja19rZXJuZWwoKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZnNfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK30KIAotCXNiID0gaW5vZGUtPmlfc2I7Ci0JZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHVmc19kaXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX3NpemUrUEFHRV9DQUNIRV9TSVpFLTEpPj5QQUdFX0NBQ0hFX1NISUZUOworfQogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1ICBmX3BvcyAlbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKSkKLQotCXN0b3JlZCA9IDA7Ci0JYmggPSBOVUxMOwotCW9mZnNldCA9IGZpbHAtPmZfcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOwotCi0Jd2hpbGUgKCFlcnJvciAmJiAhc3RvcmVkICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgewotCQlsYmxrID0gKGZpbHAtPmZfcG9zKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKLQkJYmxrID0gdWZzX2ZyYWdfbWFwKGlub2RlLCBsYmxrKTsKLQkJaWYgKCFibGsgfHwgIShiaCA9IHNiX2JyZWFkKHNiLCBibGspKSkgewotCQkJLyogWFhYIC0gZXJyb3IgLSBza2lwIHRvIHRoZSBuZXh0IGJsb2NrICovCi0JCQlwcmludGsoInVmc19yZWFkZGlyOiAiCi0JCQkgICAgICAgImRpciBpbm9kZSAlbHUgaGFzIGEgaG9sZSBhdCBvZmZzZXQgJWx1XG4iLAotCQkJICAgICAgIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgaW50KWZpbHAtPmZfcG9zKTsKLQkJCWZpbHAtPmZfcG9zICs9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLXJldmFsaWRhdGU6Ci0JCS8qIElmIHRoZSBkaXIgYmxvY2sgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bwotCQkgKiByZWFkZGlyKDIpLCB0aGVuIHdlIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGFuIGludmFsaWQKLQkJICogZGlyZW50IHJpZ2h0IG5vdy4gIFNjYW4gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCi0JCSAqIHRvIG1ha2Ugc3VyZS4gKi8KLQkJaWYgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc2ItPnNfYmxvY2tzaXplICYmIGkgPCBvZmZzZXQ7ICkgewotCQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGJoLT5iX2RhdGEgKyBpKTsKLQkJCQkvKiBJdCdzIHRvbyBleHBlbnNpdmUgdG8gZG8gYSBmdWxsCi0JCQkJICogZGlyZW50IHRlc3QgZWFjaCB0aW1lIHJvdW5kIHRoaXMKLQkJCQkgKiBsb29wLCBidXQgd2UgZG8gaGF2ZSB0byB0ZXN0IGF0Ci0JCQkJICogbGVhc3QgdGhhdCBpdCBpcyBub24temVyby4gIEEKLQkJCQkgKiBmYWlsdXJlIHdpbGwgYmUgZGV0ZWN0ZWQgaW4gdGhlCi0JCQkJICogZGlyZW50IHRlc3QgYmVsb3cuICovCi0JCQkJZGVfcmVjbGVuID0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCQkJaWYgKGRlX3JlY2xlbiA8IDEpCi0JCQkJCWJyZWFrOwotCQkJCWkgKz0gZGVfcmVjbGVuOwotCQkJfQotCQkJb2Zmc2V0ID0gaTsKLQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYgfihzYi0+c19ibG9ja3NpemUgLSAxKSkKLQkJCQl8IG9mZnNldDsKLQkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247Ci0JCX0KLQotCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZQotCQkgICAgICAgJiYgb2Zmc2V0IDwgc2ItPnNfYmxvY2tzaXplKSB7Ci0JCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7Ci0JCQkvKiBYWFggLSBwdXQgaW4gYSByZWFsIHVmc19jaGVja19kaXJfZW50cnkoKSAqLwotCQkJaWYgKChkZS0+ZF9yZWNsZW4gPT0gMCkgfHwgKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkgPT0gMCkpIHsKLQkJCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyAmCi0JCQkJICAgICAgICAgICAgICAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsKLQkJCQkgICAgICAgICAgICAgICBzYi0+c19ibG9ja3NpemU7Ci0JCQkJYnJlbHNlKGJoKTsKLQkJCQl1bmxvY2tfa2VybmVsKCk7Ci0JCQkJcmV0dXJuIHN0b3JlZDsKLQkJCX0KLQkJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19yZWFkZGlyIiwgaW5vZGUsIGRlLAotCQkJCQkJICAgYmgsIG9mZnNldCkpIHsKLQkJCQkvKiBPbiBlcnJvciwgc2tpcCB0aGUgZl9wb3MgdG8gdGhlCi0JCQkJICAgbmV4dCBibG9jay4gKi8KLQkJCQlmaWxwLT5mX3BvcyA9IChmaWxwLT5mX3BvcyB8Ci0JCQkJICAgICAgICAgICAgICAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsKLQkJCQkJICAgICAgIDE7Ci0JCQkJYnJlbHNlIChiaCk7Ci0JCQkJdW5sb2NrX2tlcm5lbCgpOwotCQkJCXJldHVybiBzdG9yZWQ7Ci0JCQl9Ci0JCQlvZmZzZXQgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCQlpZiAoZGUtPmRfaW5vKSB7Ci0JCQkJLyogV2UgbWlnaHQgYmxvY2sgaW4gdGhlIG5leHQgc2VjdGlvbgotCQkJCSAqIGlmIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGlzCi0JCQkJICogY3VycmVudGx5IHN3YXBwZWQgb3V0LiAgU28sIHVzZSBhCi0JCQkJICogdmVyc2lvbiBzdGFtcCB0byBkZXRlY3Qgd2hldGhlciBvcgotCQkJCSAqIG5vdCB0aGUgZGlyZWN0b3J5IGhhcyBiZWVuIG1vZGlmaWVkCi0JCQkJICogZHVyaW5nIHRoZSBjb3B5IG9wZXJhdGlvbi4gKi8KLQkJCQl1bnNpZ25lZCBsb25nIHZlcnNpb24gPSBmaWxwLT5mX3ZlcnNpb247Ci0JCQkJdW5zaWduZWQgY2hhciBkX3R5cGUgPSBEVF9VTktOT1dOOwotCi0JCQkJVUZTRCgoImZpbGxkaXIoJXMsJXUpXG4iLCBkZS0+ZF9uYW1lLAotCQkJCQkJCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pKSkKLQkJCQlVRlNEKCgibmFtbGVuICV1XG4iLCB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSkKLQotCQkJCWlmICgoZmxhZ3MgJiBVRlNfREVfTUFTSykgPT0gVUZTX0RFXzQ0QlNEKQotCQkJCQlkX3R5cGUgPSBkZS0+ZF91LmRfNDQuZF90eXBlOwotCQkJCWVycm9yID0gZmlsbGRpcihkaXJlbnQsIGRlLT5kX25hbWUsCi0JCQkJCQl1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpLCBmaWxwLT5mX3BvcywKLQkJCQkJCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLCBkX3R5cGUpOwotCQkJCWlmIChlcnJvcikKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHZlcnNpb24gIT0gZmlscC0+Zl92ZXJzaW9uKQotCQkJCQlnb3RvIHJldmFsaWRhdGU7Ci0JCQkJc3RvcmVkICsrOwotCQkJfQotCQkJZmlscC0+Zl9wb3MgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCX0KLQkJb2Zmc2V0ID0gMDsKLQkJYnJlbHNlIChiaCk7Citpbm9fdCB1ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlub190IHJlcyA9IDA7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBwYWdlICpwYWdlOworCQorCWRlID0gdWZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnksICZwYWdlKTsKKwlpZiAoZGUpIHsKKwkJcmVzID0gZnMzMl90b19jcHUoZGlyLT5pX3NiLCBkZS0+ZF9pbm8pOworCQl1ZnNfcHV0X3BhZ2UocGFnZSk7CiAJfQotCXVubG9ja19rZXJuZWwoKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qIFJlbGVhc2VzIHRoZSBwYWdlICovCit2b2lkIHVmc19zZXRfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLAorCQkgIHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVuc2lnbmVkIGZyb20gPSAoY2hhciAqKSBkZSAtIChjaGFyICopIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCB0byA9IGZyb20gKyBmczE2X3RvX2NwdShkaXItPmlfc2IsIGRlLT5kX3JlY2xlbik7CisJaW50IGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJQlVHX09OKGVycik7CisJZGUtPmRfaW5vID0gY3B1X3RvX2ZzMzIoZGlyLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCXVmc19zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBpbm9kZS0+aV9tb2RlKTsKKwllcnIgPSB1ZnNfY29tbWl0X2NodW5rKHBhZ2UsIGZyb20sIHRvKTsKKwl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7Cit9CisKKworc3RhdGljIHZvaWQgdWZzX2NoZWNrX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJY2hhciAqa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgb2ZmcywgcmVjX2xlbjsKKwl1bnNpZ25lZCBsaW1pdCA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqcDsKKwljaGFyICplcnJvcjsKKworCWlmICgoZGlyLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkgPT0gcGFnZS0+aW5kZXgpIHsKKwkJbGltaXQgPSBkaXItPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmIChsaW1pdCAmIChVRlNfU0VDVE9SX1NJWkUgLSAxKSkKKwkJCWdvdG8gRWJhZHNpemU7CisJCWlmICghbGltaXQpCisJCQlnb3RvIG91dDsKKwl9CisJZm9yIChvZmZzID0gMDsgb2ZmcyA8PSBsaW1pdCAtIFVGU19ESVJfUkVDX0xFTigxKTsgb2ZmcyArPSByZWNfbGVuKSB7CisJCXAgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikoa2FkZHIgKyBvZmZzKTsKKwkJcmVjX2xlbiA9IGZzMTZfdG9fY3B1KHNiLCBwLT5kX3JlY2xlbik7CisKKwkJaWYgKHJlY19sZW4gPCBVRlNfRElSX1JFQ19MRU4oMSkpCisJCQlnb3RvIEVzaG9ydDsKKwkJaWYgKHJlY19sZW4gJiAzKQorCQkJZ290byBFYWxpZ247CisJCWlmIChyZWNfbGVuIDwgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBwKSkpCisJCQlnb3RvIEVuYW1lbGVuOworCQlpZiAoKChvZmZzICsgcmVjX2xlbiAtIDEpIF4gb2ZmcykgJiB+KFVGU19TRUNUT1JfU0laRS0xKSkKKwkJCWdvdG8gRXNwYW47CisJCWlmIChmczMyX3RvX2NwdShzYiwgcC0+ZF9pbm8pID4gKFVGU19TQihzYiktPnNfdXNwaS0+c19pcGcgKgorCQkJCQkJICBVRlNfU0Ioc2IpLT5zX3VzcGktPnNfbmNnKSkKKwkJCWdvdG8gRWludW1iZXI7CisJfQorCWlmIChvZmZzICE9IGxpbWl0KQorCQlnb3RvIEVlbmQ7CitvdXQ6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuOworCisJLyogVG9vIGJhZCwgd2UgaGFkIGFuIGVycm9yICovCisKK0ViYWRzaXplOgorCXVmc19lcnJvcihzYiwgInVmc19jaGVja19wYWdlIiwKKwkJICAic2l6ZSBvZiBkaXJlY3RvcnkgIyVsdSBpcyBub3QgYSBtdWx0aXBsZSBvZiBjaHVuayBzaXplIiwKKwkJICBkaXItPmlfaW5vCisJKTsKKwlnb3RvIGZhaWw7CitFc2hvcnQ6CisJZXJyb3IgPSAicmVjX2xlbiBpcyBzbWFsbGVyIHRoYW4gbWluaW1hbCI7CisJZ290byBiYWRfZW50cnk7CitFYWxpZ246CisJZXJyb3IgPSAidW5hbGlnbmVkIGRpcmVjdG9yeSBlbnRyeSI7CisJZ290byBiYWRfZW50cnk7CitFbmFtZWxlbjoKKwllcnJvciA9ICJyZWNfbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtZV9sZW4iOworCWdvdG8gYmFkX2VudHJ5OworRXNwYW46CisJZXJyb3IgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOworCWdvdG8gYmFkX2VudHJ5OworRWludW1iZXI6CisJZXJyb3IgPSAiaW5vZGUgb3V0IG9mIGJvdW5kcyI7CitiYWRfZW50cnk6CisJdWZzX2Vycm9yIChzYiwgInVmc19jaGVja19wYWdlIiwgImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCisJCSAgICJvZmZzZXQ9JWx1LCByZWNfbGVuPSVkLCBuYW1lX2xlbj0lZCIsCisJCSAgIGRpci0+aV9pbm8sIGVycm9yLCAocGFnZS0+aW5kZXg8PFBBR0VfQ0FDSEVfU0hJRlQpK29mZnMsCisJCSAgIHJlY19sZW4sIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBwKSk7CisJZ290byBmYWlsOworRWVuZDoKKwlwID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKGthZGRyICsgb2Zmcyk7CisJdWZzX2Vycm9yIChzYiwgImV4dDJfY2hlY2tfcGFnZSIsCisJCSAgICJlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdSBzcGFucyB0aGUgcGFnZSBib3VuZGFyeSIKKwkJICAgIm9mZnNldD0lbHUiLAorCQkgICBkaXItPmlfaW5vLCAocGFnZS0+aW5kZXg8PFBBR0VfQ0FDSEVfU0hJRlQpK29mZnMpOworZmFpbDoKKwlTZXRQYWdlQ2hlY2tlZChwYWdlKTsKKwlTZXRQYWdlRXJyb3IocGFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqdWZzX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCFQYWdlQ2hlY2tlZChwYWdlKSkKKwkJCXVmc19jaGVja19wYWdlKHBhZ2UpOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gcGFnZTsKKworZmFpbDoKKwl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CiB9CiAKIC8qCi0gKiBkZWZpbmUgaG93IGZhciBhaGVhZCB0byByZWFkIGRpcmVjdG9yaWVzIHdoaWxlIHNlYXJjaGluZyB0aGVtLgorICogUmV0dXJuIHRoZSBvZmZzZXQgaW50byBwYWdlIGBwYWdlX25yJyBvZiB0aGUgbGFzdCB2YWxpZAorICogYnl0ZSBpbiB0aGF0IHBhZ2UsIHBsdXMgb25lLgogICovCi0jZGVmaW5lIE5BTUVJX1JBX0NIVU5LUyAgMgotI2RlZmluZSBOQU1FSV9SQV9CTE9DS1MgIDQKLSNkZWZpbmUgTkFNRUlfUkFfU0laRSAgICAgICAgKE5BTUVJX1JBX0NIVU5LUyAqIE5BTUVJX1JBX0JMT0NLUykKLSNkZWZpbmUgTkFNRUlfUkFfSU5ERVgoYyxiKSAgKCgoYykgKiBOQU1FSV9SQV9CTE9DS1MpICsgKGIpKQorc3RhdGljIHVuc2lnbmVkCit1ZnNfbGFzdF9ieXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgcGFnZV9ucikKK3sKKwl1bnNpZ25lZCBsYXN0X2J5dGUgPSBpbm9kZS0+aV9zaXplOworCisJbGFzdF9ieXRlIC09IHBhZ2VfbnIgPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAobGFzdF9ieXRlID4gUEFHRV9DQUNIRV9TSVpFKQorCQlsYXN0X2J5dGUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJcmV0dXJuIGxhc3RfYnl0ZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqCit1ZnNfbmV4dF9lbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqcCkKK3sKKwlyZXR1cm4gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKChjaGFyICopcCArCisJCQkJCWZzMTZfdG9fY3B1KHNiLCBwLT5kX3JlY2xlbikpOworfQorCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqdWZzX2RvdGRvdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhZ2UgKipwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gdWZzX2dldF9wYWdlKGRpciwgMCk7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlID0gTlVMTDsKKworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCWRlID0gdWZzX25leHRfZW50cnkoZGlyLT5pX3NiLAorCQkJCSAgICAoc3RydWN0IHVmc19kaXJfZW50cnkgKilwYWdlX2FkZHJlc3MocGFnZSkpOworCQkqcCA9IHBhZ2U7CisJfQorCXJldHVybiBkZTsKK30KIAogLyoKICAqCXVmc19maW5kX2VudHJ5KCkKICAqCiAgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKLSAqIHJldHVybnMgdGhlIGNhY2hlIGJ1ZmZlciBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5Ci0gKiBpdHNlbGYgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2JoKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCi0gKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKiByZXR1cm5zIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQsIGFuZCB0aGUgZW50cnkgaXRzZWxmCisgKiAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfZGlyKS4gUGFnZSBpcyByZXR1cm5lZCBtYXBwZWQgYW5kIHVubG9ja2VkLgorICogRW50cnkgaXMgZ3VhcmFudGVlZCB0byBiZSB2YWxpZC4KICAqLwotc3RydWN0IHVmc19kaXJfZW50cnkgKiB1ZnNfZmluZF9lbnRyeSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAotCXN0cnVjdCBidWZmZXJfaGVhZCAqKiByZXNfYmgpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfdXNlW05BTUVJX1JBX1NJWkVdOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3JlYWRbTkFNRUlfUkFfU0laRV07Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7Ci0JaW50IGJsb2NrLCB0b3JlYWQsIGksIGVycjsKLQlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7Ci0JY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7Ci0JaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47Ci0KLQlVRlNEKCgiRU5URVIsIGRpcl9pbm8gJWx1LCBuYW1lICVzLCBuYW1sZW4gJXVcbiIsIGRpci0+aV9pbm8sIG5hbWUsIG5hbWVsZW4pKQotCQotCSpyZXNfYmggPSBOVUxMOwotCQotCXNiID0gZGlyLT5pX3NiOwotCQotCWlmIChuYW1lbGVuID4gVUZTX01BWE5BTUxFTikKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQgKGJoX3VzZSwgMCwgc2l6ZW9mIChiaF91c2UpKTsKLQl0b3JlYWQgPSAwOwotCWZvciAoYmxvY2sgPSAwOyBibG9jayA8IE5BTUVJX1JBX1NJWkU7ICsrYmxvY2spIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0KLQkJaWYgKChibG9jayA8PCBzYi0+c19ibG9ja3NpemVfYml0cykgPj0gZGlyLT5pX3NpemUpCi0JCQlicmVhazsKLQkJYmggPSB1ZnNfZ2V0ZnJhZyAoZGlyLCBibG9jaywgMCwgJmVycik7Ci0JCWJoX3VzZVtibG9ja10gPSBiaDsKLQkJaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQotCQkJYmhfcmVhZFt0b3JlYWQrK10gPSBiaDsKLQl9Ci0KLQlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IGJsb2NrKyspIHsKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7Ci0JCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7Ci0JCWNoYXIgKiBkbGltaXQ7Ci0KLQkJaWYgKChibG9jayAlIE5BTUVJX1JBX0JMT0NLUykgPT0gMCAmJiB0b3JlYWQpIHsKLQkJCWxsX3J3X2Jsb2NrIChSRUFELCB0b3JlYWQsIGJoX3JlYWQpOwotCQkJdG9yZWFkID0gMDsKLQkJfQotCQliaCA9IGJoX3VzZVtibG9jayAlIE5BTUVJX1JBX1NJWkVdOwotCQlpZiAoIWJoKSB7Ci0JCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2ZpbmRfZW50cnkiLCAKLQkJCQkiZGlyZWN0b3J5ICMlbHUgY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlbHUiLAotCQkJCWRpci0+aV9pbm8sIG9mZnNldCk7Ci0JCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOwotCQkJY29udGludWU7Ci0JCX0KLQkJd2FpdF9vbl9idWZmZXIgKGJoKTsKLQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7Ci0JCQkvKgotCQkJICogcmVhZCBlcnJvcjogYWxsIGJldHMgYXJlIG9mZgotCQkJICovCi0JCQlicmVhazsKLQkJfQotCi0JCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7Ci0JCWRsaW1pdCA9IGJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemU7Ci0JCXdoaWxlICgoY2hhciAqKSBkZSA8IGRsaW1pdCAmJiBvZmZzZXQgPCBkaXItPmlfc2l6ZSkgewotCQkJLyogdGhpcyBjb2RlIGlzIGV4ZWN1dGVkIHF1YWRyYXRpY2FsbHkgb2Z0ZW4gKi8KLQkJCS8qIGRvIG1pbmltYWwgY2hlY2tpbmcgYnkgaGFuZCAqLwotCQkJaW50IGRlX2xlbjsKLQotCQkJaWYgKChjaGFyICopIGRlICsgbmFtZWxlbiA8PSBkbGltaXQgJiYKLQkJCSAgICB1ZnNfbWF0Y2goc2IsIG5hbWVsZW4sIG5hbWUsIGRlKSkgewotCQkJCS8qIGZvdW5kIGEgbWF0Y2ggLQotCQkJCWp1c3QgdG8gYmUgc3VyZSwgZG8gYSBmdWxsIGNoZWNrICovCi0JCQkJaWYgKCF1ZnNfY2hlY2tfZGlyX2VudHJ5KCJ1ZnNfZmluZF9lbnRyeSIsCi0JCQkJICAgIGRpciwgZGUsIGJoLCBvZmZzZXQpKQotCQkJCQlnb3RvIGZhaWxlZDsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgTkFNRUlfUkFfU0laRTsgKytpKSB7Ci0JCQkJCWlmIChiaF91c2VbaV0gIT0gYmgpCi0JCQkJCQlicmVsc2UgKGJoX3VzZVtpXSk7Ci0JCQkJfQotCQkJCSpyZXNfYmggPSBiaDsKLQkJCQlyZXR1cm4gZGU7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IGxvb3Bpbmcgb24gYSBiYWQgYmxvY2sgKi8KLQkJCWRlX2xlbiA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOwotCQkJaWYgKGRlX2xlbiA8PSAwKQotCQkJCWdvdG8gZmFpbGVkOwotCQkJb2Zmc2V0ICs9IGRlX2xlbjsKLQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArIGRlX2xlbik7Ci0JCX0KLQotCQlicmVsc2UgKGJoKTsKLQkJaWYgKCgoYmxvY2sgKyBOQU1FSV9SQV9TSVpFKSA8PCBzYi0+c19ibG9ja3NpemVfYml0cyApID49Ci0JCSAgICBkaXItPmlfc2l6ZSkKLQkJCWJoID0gTlVMTDsKLQkJZWxzZQotCQkJYmggPSB1ZnNfZ2V0ZnJhZyAoZGlyLCBibG9jayArIE5BTUVJX1JBX1NJWkUsIDAsICZlcnIpOwotCQliaF91c2VbYmxvY2sgJSBOQU1FSV9SQV9TSVpFXSA9IGJoOwotCQlpZiAoYmggJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCi0JCQliaF9yZWFkW3RvcmVhZCsrXSA9IGJoOwotCX0KLQotZmFpbGVkOgotCWZvciAoaSA9IDA7IGkgPCBOQU1FSV9SQV9TSVpFOyArK2kpIGJyZWxzZSAoYmhfdXNlW2ldKTsKLQlVRlNEKCgiRVhJVFxuIikpCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQKLXVmc19jaGVja19kaXJfZW50cnkgKGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBzdHJ1Y3QgaW5vZGUgKmRpciwKLQkJICAgICBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCi0JCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCitzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqdWZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgIHN0cnVjdCBwYWdlICoqcmVzX3BhZ2UpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKLQljb25zdCBjaGFyICplcnJvcl9tc2cgPSBOVUxMOwotCWludCBybGVuID0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJdW5zaWduZWQgcmVjbGVuID0gVUZTX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG47CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSB1ZnNfZGlyX3BhZ2VzKGRpcik7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWkgPSBVRlNfSShkaXIpOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTsKIAotCWlmIChybGVuIDwgVUZTX0RJUl9SRUNfTEVOKDEpKQotCQllcnJvcl9tc2cgPSAicmVjbGVuIGlzIHNtYWxsZXIgdGhhbiBtaW5pbWFsIjsKLQllbHNlIGlmIChybGVuICUgNCAhPSAwKQotCQllcnJvcl9tc2cgPSAicmVjbGVuICUgNCAhPSAwIjsKLQllbHNlIGlmIChybGVuIDwgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKQotCQllcnJvcl9tc2cgPSAicmVjbGVuIGlzIHRvbyBzbWFsbCBmb3IgbmFtbGVuIjsKLQllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQotCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOwotCWVsc2UgaWYgKGZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pID4gKFVGU19TQihzYiktPnNfdXNwaS0+c19pcGcgKgotCQkJCSAgICAgIFVGU19TQihzYiktPnNfdXNwaS0+c19uY2cpKQotCQllcnJvcl9tc2cgPSAiaW5vZGUgb3V0IG9mIGJvdW5kcyI7CisJVUZTRCgiRU5URVIsIGRpcl9pbm8gJWx1LCBuYW1lICVzLCBuYW1sZW4gJXVcbiIsIGRpci0+aV9pbm8sIG5hbWUsIG5hbWVsZW4pOwogCi0JaWYgKGVycm9yX21zZyAhPSBOVUxMKQotCQl1ZnNfZXJyb3IgKHNiLCBmdW5jdGlvbiwgImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdSwgc2l6ZSAlTHU6ICVzIC0gIgotCQkJICAgICJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUsIHJlY2xlbj0lZCwgbmFtbGVuPSVkIiwKLQkJCSAgICBkaXItPmlfaW5vLCBkaXItPmlfc2l6ZSwgZXJyb3JfbXNnLCBvZmZzZXQsCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubyksCi0JCQkgICAgcmxlbiwgdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSk7Ci0JCi0JcmV0dXJuIChlcnJvcl9tc2cgPT0gTlVMTCA/IDEgOiAwKTsKLX0KKwlpZiAobnBhZ2VzID09IDAgfHwgbmFtZWxlbiA+IFVGU19NQVhOQU1MRU4pCisJCWdvdG8gb3V0OwogCi1zdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqdWZzX2RvdGRvdChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcCkKLXsKLQlpbnQgZXJyOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSB1ZnNfYnJlYWQgKGRpciwgMCwgMCwgJmVycik7Ci0Jc3RydWN0IHVmc19kaXJfZW50cnkgKnJlcyA9IE5VTEw7CisJLyogT0ZGU0VUX0NBQ0hFICovCisJKnJlc19wYWdlID0gTlVMTDsKIAotCWlmIChiaCkgewotCQlyZXMgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKLQkJcmVzID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKChjaGFyICopcmVzICsKLQkJCWZzMTZfdG9fY3B1KGRpci0+aV9zYiwgcmVzLT5kX3JlY2xlbikpOwotCX0KLQkqcCA9IGJoOwotCXJldHVybiByZXM7Ci19Ci1pbm9fdCB1ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKLXsKLQlpbm9fdCByZXMgPSAwOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdGFydCA9IHVpLT5pX2Rpcl9zdGFydF9sb29rdXA7CiAKLQlkZSA9IHVmc19maW5kX2VudHJ5IChkZW50cnksICZiaCk7Ci0JaWYgKGRlKSB7Ci0JCXJlcyA9IGZzMzJfdG9fY3B1KGRpci0+aV9zYiwgZGUtPmRfaW5vKTsKLQkJYnJlbHNlKGJoKTsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KKwlpZiAoc3RhcnQgPj0gbnBhZ2VzKQorCQlzdGFydCA9IDA7CisJbiA9IHN0YXJ0OworCWRvIHsKKwkJY2hhciAqa2FkZHI7CisJCXBhZ2UgPSB1ZnNfZ2V0X3BhZ2UoZGlyLCBuKTsKKwkJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJCWthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikga2FkZHI7CisJCQlrYWRkciArPSB1ZnNfbGFzdF9ieXRlKGRpciwgbikgLSByZWNsZW47CisJCQl3aGlsZSAoKGNoYXIgKikgZGUgPD0ga2FkZHIpIHsKKwkJCQlpZiAoZGUtPmRfcmVjbGVuID09IDApIHsKKwkJCQkJdWZzX2Vycm9yKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkJICAiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJCXVmc19wdXRfcGFnZShwYWdlKTsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmICh1ZnNfbWF0Y2goc2IsIG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCQlkZSA9IHVmc19uZXh0X2VudHJ5KHNiLCBkZSk7CisJCQl9CisJCQl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJCX0KKwkJaWYgKCsrbiA+PSBucGFnZXMpCisJCQluID0gMDsKKwl9IHdoaWxlIChuICE9IHN0YXJ0KTsKK291dDoKKwlyZXR1cm4gTlVMTDsKIAotdm9pZCB1ZnNfc2V0X2xpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwKLQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlkaXItPmlfdmVyc2lvbisrOwotCWRlLT5kX2lubyA9IGNwdV90b19mczMyKGRpci0+aV9zYiwgaW5vZGUtPmlfaW5vKTsKLQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7Ci0JaWYgKElTX0RJUlNZTkMoZGlyKSkKLQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwotCWJyZWxzZSAoYmgpOworZm91bmQ6CisJKnJlc19wYWdlID0gcGFnZTsKKwl1aS0+aV9kaXJfc3RhcnRfbG9va3VwID0gbjsKKwlyZXR1cm4gZGU7CiB9CiAKIC8qCi0gKgl1ZnNfYWRkX2VudHJ5KCkKLSAqCi0gKiBhZGRzIGEgZmlsZSBlbnRyeSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUKLSAqIHNlbWFudGljcyBhcyB1ZnNfZmluZF9lbnRyeSgpLiBJdCByZXR1cm5zIE5VTEwgaWYgaXQgZmFpbGVkLgorICoJUGFyZW50IGlzIGxvY2tlZC4KICAqLwogaW50IHVmc19hZGRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXVuc2lnbmVkIGZyYWdvZmY7Ci0JdW5zaWduZWQgc2hvcnQgcmVjX2xlbjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKLQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlLCAqIGRlMTsKIAlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CiAJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CiAJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwl1bnNpZ25lZCByZWNsZW4gPSBVRlNfRElSX1JFQ19MRU4obmFtZWxlbik7CisJdW5zaWduZWQgc2hvcnQgcmVjX2xlbiwgbmFtZV9sZW47CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZTsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IHVmc19kaXJfcGFnZXMoZGlyKTsKKwl1bnNpZ25lZCBsb25nIG47CisJY2hhciAqa2FkZHI7CisJdW5zaWduZWQgZnJvbSwgdG87CiAJaW50IGVycjsKIAotCVVGU0QoKCJFTlRFUiwgbmFtZSAlcywgbmFtZWxlbiAldVxuIiwgbmFtZSwgbmFtZWxlbikpCi0JCi0Jc2IgPSBkaXItPmlfc2I7Ci0JdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlVRlNEKCJFTlRFUiwgbmFtZSAlcywgbmFtZWxlbiAldVxuIiwgbmFtZSwgbmFtZWxlbik7CiAKLQlpZiAoIW5hbWVsZW4pCi0JCXJldHVybiAtRUlOVkFMOwotCWJoID0gdWZzX2JyZWFkIChkaXIsIDAsIDAsICZlcnIpOwotCWlmICghYmgpCi0JCXJldHVybiBlcnI7Ci0JcmVjX2xlbiA9IFVGU19ESVJfUkVDX0xFTihuYW1lbGVuKTsKLQlvZmZzZXQgPSAwOwotCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7Ci0Jd2hpbGUgKDEpIHsKLQkJaWYgKChjaGFyICopZGUgPj0gVUZTX1NFQ1RPUl9TSVpFICsgYmgtPmJfZGF0YSkgewotCQkJZnJhZ29mZiA9IG9mZnNldCAmIH51c3BpLT5zX2ZtYXNrOwotCQkJaWYgKGZyYWdvZmYgIT0gMCAmJiBmcmFnb2ZmICE9IFVGU19TRUNUT1JfU0laRSkKLQkJCQl1ZnNfZXJyb3IgKHNiLCAidWZzX2FkZF9lbnRyeSIsICJpbnRlcm5hbCBlcnJvciIKLQkJCQkJIiBmcmFnb2ZmICV1IiwgZnJhZ29mZik7Ci0JCQlpZiAoIWZyYWdvZmYpIHsKLQkJCQlicmVsc2UgKGJoKTsKLQkJCQliaCA9IHVmc19icmVhZCAoZGlyLCBvZmZzZXQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMsIDEsICZlcnIpOwotCQkJCWlmICghYmgpCi0JCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCQlpZiAoZGlyLT5pX3NpemUgPD0gb2Zmc2V0KSB7Ci0JCQkJaWYgKGRpci0+aV9zaXplID09IDApIHsKLQkJCQkJYnJlbHNlKGJoKTsKLQkJCQkJcmV0dXJuIC1FTk9FTlQ7Ci0JCQkJfQotCQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIChiaC0+Yl9kYXRhICsgZnJhZ29mZik7Ci0JCQkJZGUtPmRfaW5vID0gMDsKKwkvKgorCSAqIFdlIHRha2UgY2FyZSBvZiBkaXJlY3RvcnkgZXhwYW5zaW9uIGluIHRoZSBzYW1lIGxvb3AuCisJICogVGhpcyBjb2RlIHBsYXlzIG91dHNpZGUgaV9zaXplLCBzbyBpdCBsb2NrcyB0aGUgcGFnZQorCSAqIHRvIHByb3RlY3QgdGhhdCByZWdpb24uCisJICovCisJZm9yIChuID0gMDsgbiA8PSBucGFnZXM7IG4rKykgeworCQljaGFyICpkaXJfZW5kOworCisJCXBhZ2UgPSB1ZnNfZ2V0X3BhZ2UoZGlyLCBuKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gb3V0OworCQlsb2NrX3BhZ2UocGFnZSk7CisJCWthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlkaXJfZW5kID0ga2FkZHIgKyB1ZnNfbGFzdF9ieXRlKGRpciwgbik7CisJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopa2FkZHI7CisJCWthZGRyICs9IFBBR0VfQ0FDSEVfU0laRSAtIHJlY2xlbjsKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmICgoY2hhciAqKWRlID09IGRpcl9lbmQpIHsKKwkJCQkvKiBXZSBoaXQgaV9zaXplICovCisJCQkJbmFtZV9sZW4gPSAwOworCQkJCXJlY19sZW4gPSBVRlNfU0VDVE9SX1NJWkU7CiAJCQkJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIFVGU19TRUNUT1JfU0laRSk7Ci0JCQkJdWZzX3NldF9kZV9uYW1sZW4oc2IsIGRlLCAwKTsKLQkJCQlkaXItPmlfc2l6ZSA9IG9mZnNldCArIFVGU19TRUNUT1JfU0laRTsKLQkJCQltYXJrX2lub2RlX2RpcnR5KGRpcik7Ci0JCQl9IGVsc2UgewotCQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7CisJCQkJZGUtPmRfaW5vID0gMDsKKwkJCQlnb3RvIGdvdF9pdDsKIAkJCX0KKwkJCWlmIChkZS0+ZF9yZWNsZW4gPT0gMCkgeworCQkJCXVmc19lcnJvcihkaXItPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJICAiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCQllcnIgPSAtRUVYSVNUOworCQkJaWYgKHVmc19tYXRjaChzYiwgbmFtZWxlbiwgbmFtZSwgZGUpKQorCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCW5hbWVfbGVuID0gVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpOworCQkJcmVjX2xlbiA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOworCQkJaWYgKCFkZS0+ZF9pbm8gJiYgcmVjX2xlbiA+PSByZWNsZW4pCisJCQkJZ290byBnb3RfaXQ7CisJCQlpZiAocmVjX2xlbiA+PSBuYW1lX2xlbiArIHJlY2xlbikKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopICgoY2hhciAqKSBkZSArIHJlY19sZW4pOwogCQl9Ci0JCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19hZGRfZW50cnkiLCBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkgewotCQkJYnJlbHNlIChiaCk7Ci0JCQlyZXR1cm4gLUVOT0VOVDsKLQkJfQotCQlpZiAodWZzX21hdGNoKHNiLCBuYW1lbGVuLCBuYW1lLCBkZSkpIHsKLQkJCWJyZWxzZSAoYmgpOwotCQkJcmV0dXJuIC1FRVhJU1Q7Ci0JCX0KLQkJaWYgKGRlLT5kX2lubyA9PSAwICYmIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pID49IHJlY19sZW4pCi0JCQlicmVhazsKLQkJCQotCQlpZiAoZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikgPj0KLQkJICAgICBVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkgKyByZWNfbGVuKQotCQkJYnJlYWs7Ci0JCW9mZnNldCArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKLQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJdWZzX3B1dF9wYWdlKHBhZ2UpOwogCX0KKwlCVUcoKTsKKwlyZXR1cm4gLUVJTlZBTDsKIAorZ290X2l0OgorCWZyb20gPSAoY2hhciopZGUgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXRvID0gZnJvbSArIHJlY19sZW47CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VubG9jazsKIAlpZiAoZGUtPmRfaW5vKSB7Ci0JCWRlMSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKwotCQkJVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKTsKLQkJZGUxLT5kX3JlY2xlbiA9Ci0JCQljcHVfdG9fZnMxNihzYiwgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikgLQotCQkJCVVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSk7Ci0JCWRlLT5kX3JlY2xlbiA9Ci0JCQljcHVfdG9fZnMxNihzYiwgVUZTX0RJUl9SRUNfTEVOKHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKTsKKwkJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlMSA9CisJCQkoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsgbmFtZV9sZW4pOworCQlkZTEtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIHJlY19sZW4gLSBuYW1lX2xlbik7CisJCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBuYW1lX2xlbik7CisKIAkJZGUgPSBkZTE7CiAJfQotCWRlLT5kX2lubyA9IDA7CisKIAl1ZnNfc2V0X2RlX25hbWxlbihzYiwgZGUsIG5hbWVsZW4pOwotCW1lbWNweSAoZGUtPmRfbmFtZSwgbmFtZSwgbmFtZWxlbiArIDEpOworCW1lbWNweShkZS0+ZF9uYW1lLCBuYW1lLCBuYW1lbGVuICsgMSk7CiAJZGUtPmRfaW5vID0gY3B1X3RvX2ZzMzIoc2IsIGlub2RlLT5pX2lubyk7CiAJdWZzX3NldF9kZV90eXBlKHNiLCBkZSwgaW5vZGUtPmlfbW9kZSk7Ci0JbWFya19idWZmZXJfZGlydHkoYmgpOwotCWlmIChJU19ESVJTWU5DKGRpcikpCi0JCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKLQlicmVsc2UgKGJoKTsKLQlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwotCWRpci0+aV92ZXJzaW9uKys7Ci0JbWFya19pbm9kZV9kaXJ0eShkaXIpOwogCi0JVUZTRCgoIkVYSVRcbiIpKQorCWVyciA9IHVmc19jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJLyogT0ZGU0VUX0NBQ0hFICovCitvdXRfcHV0OgorCXVmc19wdXRfcGFnZShwYWdlKTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlnb3RvIG91dF9wdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQKK3Vmc192YWxpZGF0ZV9lbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpiYXNlLAorCQkgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG1hc2spCit7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5KikoYmFzZSArIG9mZnNldCk7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKnAgPSAoc3RydWN0IHVmc19kaXJfZW50cnkqKShiYXNlICsgKG9mZnNldCZtYXNrKSk7CisJd2hpbGUgKChjaGFyKilwIDwgKGNoYXIqKWRlKSB7CisJCWlmIChwLT5kX3JlY2xlbiA9PSAwKQorCQkJYnJlYWs7CisJCXAgPSB1ZnNfbmV4dF9lbnRyeShzYiwgcCk7CisJfQorCXJldHVybiAoY2hhciAqKXAgLSBiYXNlOworfQorCisKKy8qCisgKiBUaGlzIGlzIGJsYXRhbnRseSBzdG9sZW4gZnJvbSBleHQyZnMKKyAqLworc3RhdGljIGludAordWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJbG9mZl90IHBvcyA9IGZpbHAtPmZfcG9zOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IHBvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJdW5zaWduZWQgbG9uZyBuID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSB1ZnNfZGlyX3BhZ2VzKGlub2RlKTsKKwl1bnNpZ25lZCBjaHVua19tYXNrID0gfihVRlNfU0VDVE9SX1NJWkUgLSAxKTsKKwlpbnQgbmVlZF9yZXZhbGlkYXRlID0gZmlscC0+Zl92ZXJzaW9uICE9IGlub2RlLT5pX3ZlcnNpb247CisJdW5zaWduZWQgZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCisJVUZTRCgiQkVHSU5cbiIpOworCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUgLSBVRlNfRElSX1JFQ19MRU4oMSkpCisJCXJldHVybiAwOworCisJZm9yICggOyBuIDwgbnBhZ2VzOyBuKyssIG9mZnNldCA9IDApIHsKKwkJY2hhciAqa2FkZHIsICpsaW1pdDsKKwkJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlOworCisJCXN0cnVjdCBwYWdlICpwYWdlID0gdWZzX2dldF9wYWdlKGlub2RlLCBuKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQl1ZnNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICJiYWQgcGFnZSBpbiAjJWx1IiwKKwkJCQkgIGlub2RlLT5pX2lubyk7CisJCQlmaWxwLT5mX3BvcyArPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJaWYgKHVubGlrZWx5KG5lZWRfcmV2YWxpZGF0ZSkpIHsKKwkJCWlmIChvZmZzZXQpIHsKKwkJCQlvZmZzZXQgPSB1ZnNfdmFsaWRhdGVfZW50cnkoc2IsIGthZGRyLCBvZmZzZXQsIGNodW5rX21hc2spOworCQkJCWZpbHAtPmZfcG9zID0gKG48PFBBR0VfQ0FDSEVfU0hJRlQpICsgb2Zmc2V0OworCQkJfQorCQkJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwkJCW5lZWRfcmV2YWxpZGF0ZSA9IDA7CisJCX0KKwkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikoa2FkZHIrb2Zmc2V0KTsKKwkJbGltaXQgPSBrYWRkciArIHVmc19sYXN0X2J5dGUoaW5vZGUsIG4pIC0gVUZTX0RJUl9SRUNfTEVOKDEpOworCQlmb3IgKCA7KGNoYXIqKWRlIDw9IGxpbWl0OyBkZSA9IHVmc19uZXh0X2VudHJ5KHNiLCBkZSkpIHsKKwkJCWlmIChkZS0+ZF9yZWNsZW4gPT0gMCkgeworCQkJCXVmc19lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJdWZzX3B1dF9wYWdlKHBhZ2UpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKGRlLT5kX2lubykgeworCQkJCWludCBvdmVyOworCQkJCXVuc2lnbmVkIGNoYXIgZF90eXBlID0gRFRfVU5LTk9XTjsKKworCQkJCW9mZnNldCA9IChjaGFyICopZGUgLSBrYWRkcjsKKworCQkJCVVGU0QoImZpbGxkaXIoJXMsJXUpXG4iLCBkZS0+ZF9uYW1lLAorCQkJCSAgICAgIGZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pKTsKKwkJCQlVRlNEKCJuYW1sZW4gJXVcbiIsIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpOworCisJCQkJaWYgKChmbGFncyAmIFVGU19ERV9NQVNLKSA9PSBVRlNfREVfNDRCU0QpCisJCQkJCWRfdHlwZSA9IGRlLT5kX3UuZF80NC5kX3R5cGU7CisKKwkJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIGRlLT5kX25hbWUsCisJCQkJCSAgICAgICB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpLAorCQkJCQkJKG48PFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0LAorCQkJCQkgICAgICAgZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubyksIGRfdHlwZSk7CisJCQkJaWYgKG92ZXIpIHsKKwkJCQkJdWZzX3B1dF9wYWdlKHBhZ2UpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCQlmaWxwLT5mX3BvcyArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJfQorCQl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJfQogCXJldHVybiAwOwogfQogCisKIC8qCiAgKiB1ZnNfZGVsZXRlX2VudHJ5IGRlbGV0ZXMgYSBkaXJlY3RvcnkgZW50cnkgYnkgbWVyZ2luZyBpdCB3aXRoIHRoZQogICogcHJldmlvdXMgZW50cnkuCiAgKi8KLWludCB1ZnNfZGVsZXRlX2VudHJ5IChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHVmc19kaXJfZW50cnkgKiBkaXIsCi0Jc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggKQotCQoraW50IHVmc19kZWxldGVfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHVmc19kaXJfZW50cnkgKmRpciwKKwkJICAgICBzdHJ1Y3QgcGFnZSAqIHBhZ2UpCiB7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7Ci0Jc3RydWN0IHVmc19kaXJfZW50cnkgKiBkZSwgKiBwZGU7Ci0JdW5zaWduZWQgaTsKLQkKLQlVRlNEKCgiRU5URVJcbiIpKQorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJY2hhciAqa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgZnJvbSA9ICgoY2hhciopZGlyIC0ga2FkZHIpICYgfihVRlNfU0VDVE9SX1NJWkUgLSAxKTsKKwl1bnNpZ25lZCB0byA9ICgoY2hhciopZGlyIC0ga2FkZHIpICsgZnMxNl90b19jcHUoc2IsIGRpci0+ZF9yZWNsZW4pOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpwZGUgPSBOVUxMOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoa2FkZHIgKyBmcm9tKTsKKwlpbnQgZXJyOwogCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQlpID0gMDsKLQlwZGUgPSBOVUxMOwotCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7Ci0JCi0JVUZTRCgoImlubyAldSwgcmVjbGVuICV1LCBuYW1sZW4gJXUsIG5hbWUgJXNcbiIsCi0JCWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLAotCQlmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSwKLQkJdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSwgZGUtPmRfbmFtZSkpCisJVUZTRCgiRU5URVJcbiIpOwogCi0Jd2hpbGUgKGkgPCBiaC0+Yl9zaXplKSB7Ci0JCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19kZWxldGVfZW50cnkiLCBpbm9kZSwgZGUsIGJoLCBpKSkgewotCQkJYnJlbHNlKGJoKTsKLQkJCXJldHVybiAtRUlPOworCVVGU0QoImlubyAldSwgcmVjbGVuICV1LCBuYW1sZW4gJXUsIG5hbWUgJXNcbiIsCisJICAgICAgZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubyksCisJICAgICAgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbiksCisJICAgICAgdWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSwgZGUtPmRfbmFtZSk7CisKKwl3aGlsZSAoKGNoYXIqKWRlIDwgKGNoYXIqKWRpcikgeworCQlpZiAoZGUtPmRfcmVjbGVuID09IDApIHsKKwkJCXVmc19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCSAgInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OwogCQl9Ci0JCWlmIChkZSA9PSBkaXIpICB7Ci0JCQlpZiAocGRlKQotCQkJCWZzMTZfYWRkKHNiLCAmcGRlLT5kX3JlY2xlbiwKLQkJCQkJZnMxNl90b19jcHUoc2IsIGRpci0+ZF9yZWNsZW4pKTsKLQkJCWRpci0+ZF9pbm8gPSAwOwotCQkJaW5vZGUtPmlfdmVyc2lvbisrOwotCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7Ci0JCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKLQkJCWlmIChJU19ESVJTWU5DKGlub2RlKSkKLQkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7Ci0JCQlicmVsc2UoYmgpOwotCQkJVUZTRCgoIkVYSVRcbiIpKQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaSArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKLQkJaWYgKGkgPT0gVUZTX1NFQ1RPUl9TSVpFKSBwZGUgPSBOVUxMOwotCQllbHNlIHBkZSA9IGRlOwotCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQotCQkgICAgKChjaGFyICopIGRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOwotCQlpZiAoaSA9PSBVRlNfU0VDVE9SX1NJWkUgJiYgZGUtPmRfcmVjbGVuID09IDApCi0JCQlicmVhazsKKwkJcGRlID0gZGU7CisJCWRlID0gdWZzX25leHRfZW50cnkoc2IsIGRlKTsKIAl9Ci0JVUZTRCgoIkVYSVRcbiIpKQotCWJyZWxzZShiaCk7Ci0JcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHBkZSkKKwkJZnJvbSA9IChjaGFyKilwZGUgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJQlVHX09OKGVycik7CisJaWYgKHBkZSkKKwkJcGRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCB0by1mcm9tKTsKKwlkaXItPmRfaW5vID0gMDsKKwllcnIgPSB1ZnNfY29tbWl0X2NodW5rKHBhZ2UsIGZyb20sIHRvKTsKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK291dDoKKwl1ZnNfcHV0X3BhZ2UocGFnZSk7CisJVUZTRCgiRVhJVFxuIik7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IHVmc19tYWtlX2VtcHR5KHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGRpci0+aV9zYjsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkaXJfYmxvY2s7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIDApOwogCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CisJY2hhciAqYmFzZTsKIAlpbnQgZXJyOwogCi0JZGlyX2Jsb2NrID0gdWZzX2JyZWFkIChpbm9kZSwgMCwgMSwgJmVycik7Ci0JaWYgKCFkaXJfYmxvY2spCi0JCXJldHVybiBlcnI7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrbWFwKHBhZ2UpOworCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIDAsIFVGU19TRUNUT1JfU0laRSk7CisJaWYgKGVycikgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZ290byBmYWlsOworCX0KIAotCWlub2RlLT5pX2Jsb2NrcyA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIFVGU19TRUNUT1JfU0laRTsKLQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBkaXJfYmxvY2stPmJfZGF0YTsKKworCWJhc2UgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1lbXNldChiYXNlLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCisJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmFzZTsKKwogCWRlLT5kX2lubyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9pbm8pOwogCXVmc19zZXRfZGVfdHlwZShzYiwgZGUsIGlub2RlLT5pX21vZGUpOwogCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMSk7CkBAIC01NTIsNzIgKzU4Nyw2NSBAQAogCWRlLT5kX3JlY2xlbiA9IGNwdV90b19mczE2KHNiLCBVRlNfU0VDVE9SX1NJWkUgLSBVRlNfRElSX1JFQ19MRU4oMSkpOwogCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMik7CiAJc3RyY3B5IChkZS0+ZF9uYW1lLCAiLi4iKTsKLQltYXJrX2J1ZmZlcl9kaXJ0eShkaXJfYmxvY2spOwotCWJyZWxzZSAoZGlyX2Jsb2NrKTsKLQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlyZXR1cm4gMDsKKworCWVyciA9IHVmc19jb21taXRfY2h1bmsocGFnZSwgMCwgVUZTX1NFQ1RPUl9TSVpFKTsKK2ZhaWw6CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKgogICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCiAgKi8KLWludCB1ZnNfZW1wdHlfZGlyIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK2ludCB1ZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqIGlub2RlKQogewotCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGUsICogZGUxOwotCWludCBlcnI7Ci0JCi0Jc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzID0gdWZzX2Rpcl9wYWdlcyhpbm9kZSk7CiAKLQlpZiAoaW5vZGUtPmlfc2l6ZSA8IFVGU19ESVJfUkVDX0xFTigxKSArIFVGU19ESVJfUkVDX0xFTigyKSB8fAotCSAgICAhKGJoID0gdWZzX2JyZWFkIChpbm9kZSwgMCwgMCwgJmVycikpKSB7Ci0JICAgIAl1ZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAotCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGRhdGEgYmxvY2siLAotCQkJICAgICAgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIDE7Ci0JfQotCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7Ci0JZGUxID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCi0JCSgoY2hhciAqKWRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOwotCWlmIChmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSAhPSBpbm9kZS0+aV9pbm8gfHwgZGUxLT5kX2lubyA9PSAwIHx8Ci0JICAgICBzdHJjbXAgKCIuIiwgZGUtPmRfbmFtZSkgfHwgc3RyY21wICgiLi4iLCBkZTEtPmRfbmFtZSkpIHsKLQkgICAgCXVmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgImVtcHR5X2RpciIsCi0JCQkgICAgICAiYmFkIGRpcmVjdG9yeSAoZGlyICMlbHUpIC0gbm8gYC4nIG9yIGAuLiciLAotCQkJICAgICAgaW5vZGUtPmlfaW5vKTsKLQkJcmV0dXJuIDE7Ci0JfQotCW9mZnNldCA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pICsgZnMxNl90b19jcHUoc2IsIGRlMS0+ZF9yZWNsZW4pOwotCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCi0JCSgoY2hhciAqKWRlMSArIGZzMTZfdG9fY3B1KHNiLCBkZTEtPmRfcmVjbGVuKSk7Ci0Jd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUgKSB7Ci0JCWlmICghYmggfHwgKHZvaWQgKikgZGUgPj0gKHZvaWQgKikgKGJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7Ci0JCQlicmVsc2UgKGJoKTsKLQkJCWJoID0gdWZzX2JyZWFkIChpbm9kZSwgb2Zmc2V0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAxLCAmZXJyKTsKLQkgCQlpZiAoIWJoKSB7Ci0JCQkJdWZzX2Vycm9yIChzYiwgImVtcHR5X2RpciIsCi0JCQkJCSAgICAiZGlyZWN0b3J5ICMlbHUgY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlbHUiLAotCQkJCQkgICAgaW5vZGUtPmlfaW5vLCBvZmZzZXQpOwotCQkJCW9mZnNldCArPSBzYi0+c19ibG9ja3NpemU7Ci0JCQkJY29udGludWU7CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWNoYXIgKmthZGRyOworCQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqZGU7CisJCXBhZ2UgPSB1ZnNfZ2V0X3BhZ2UoaW5vZGUsIGkpOworCisJCWlmIChJU19FUlIocGFnZSkpCisJCQljb250aW51ZTsKKworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKilrYWRkcjsKKwkJa2FkZHIgKz0gdWZzX2xhc3RfYnl0ZShpbm9kZSwgaSkgLSBVRlNfRElSX1JFQ19MRU4oMSk7CisKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmIChkZS0+ZF9yZWNsZW4gPT0gMCkgeworCQkJCXVmc19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5OiAiCisJCQkJCSJrYWRkcj0lcCwgZGU9JXBcbiIsIGthZGRyLCBkZSk7CisJCQkJZ290byBub3RfZW1wdHk7CiAJCQl9Ci0JCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCQkJaWYgKGRlLT5kX2lubykgeworCQkJCXUxNiBuYW1lbGVuPXVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSk7CisJCQkJLyogY2hlY2sgZm9yIC4gYW5kIC4uICovCisJCQkJaWYgKGRlLT5kX25hbWVbMF0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQlpZiAobmFtZWxlbiA+IDIpCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCWlmIChuYW1lbGVuIDwgMikgeworCQkJCQlpZiAoaW5vZGUtPmlfaW5vICE9CisJCQkJCSAgICBmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSkKKwkJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCX0gZWxzZSBpZiAoZGUtPmRfbmFtZVsxXSAhPSAnLicpCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJfQorCQkJZGUgPSB1ZnNfbmV4dF9lbnRyeShzYiwgZGUpOwogCQl9Ci0JCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoImVtcHR5X2RpciIsIGlub2RlLCBkZSwgYmgsIG9mZnNldCkpIHsKLQkJCWJyZWxzZSAoYmgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaWYgKGRlLT5kX2lubykgewotCQkJYnJlbHNlIChiaCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlvZmZzZXQgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7Ci0JCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCi0JCQkoKGNoYXIgKilkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwkJdWZzX3B1dF9wYWdlKHBhZ2UpOwogCX0KLQlicmVsc2UgKGJoKTsKIAlyZXR1cm4gMTsKKworbm90X2VtcHR5OgorCXVmc19wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZnNfZGlyX29wZXJhdGlvbnMgPSB7CmRpZmYgLS1naXQgYS9mcy91ZnMvZmlsZS5jIGIvZnMvdWZzL2ZpbGUuYwppbmRleCAzMTJmZDNmLi4wZTUwMDE1IDEwMDY0NAotLS0gYS9mcy91ZnMvZmlsZS5jCisrKyBiL2ZzL3Vmcy9maWxlLmMKQEAgLTI1LDYgKzI1LDI2IEBACiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CS8qIGZvciBzeW5jX21hcHBpbmdfYnVmZmVycygpICovCisKK3N0YXRpYyBpbnQgdWZzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCWludCByZXQ7CisKKwlyZXQgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQlyZXR1cm4gcmV0OworCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCisJCXJldHVybiByZXQ7CisKKwllcnIgPSB1ZnNfc3luY19pbm9kZShpbm9kZSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKwogCiAvKgogICogV2UgaGF2ZSBtb3N0bHkgTlVMTCdzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBvayBmb3IKQEAgLTM3LDYgKzU3LDcgQEAKIAkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5vcGVuICAgICAgICAgICA9IGdlbmVyaWNfZmlsZV9vcGVuLAorCS5mc3luYwkJPSB1ZnNfc3luY19maWxlLAogCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9pYWxsb2MuYyBiL2ZzL3Vmcy9pYWxsb2MuYwppbmRleCBjN2E0N2VkLi45NTAxZGNkIDEwMDY0NAotLS0gYS9mcy91ZnMvaWFsbG9jLmMKKysrIGIvZnMvdWZzL2lhbGxvYy5jCkBAIC0zNCwxNCArMzQsNiBAQAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSN1bmRlZiBVRlNfSUFMTE9DX0RFQlVHCi0KLSNpZmRlZiBVRlNfSUFMTE9DX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQogLyoKICAqIE5PVEUhIFdoZW4gd2UgZ2V0IHRoZSBpbm9kZSwgd2UncmUgdGhlIG9ubHkgcGVvcGxlCiAgKiB0aGF0IGhhdmUgYWNjZXNzIHRvIGl0LCBhbmQgYXMgc3VjaCB0aGVyZSBhcmUgbm8KQEAgLTY4LDcgKzYwLDcgQEAKIAlpbnQgaXNfZGlyZWN0b3J5OwogCXVuc2lnbmVkIGlubywgY2csIGJpdDsKIAkKLQlVRlNEKCgiRU5URVIsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisJVUZTRCgiRU5URVIsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubyk7CiAKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC05MSw3ICs4Myw3IEBACiAJCXVubG9ja19zdXBlciAoc2IpOwogCQlyZXR1cm47CiAJfQotCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpCiAJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBjZyBtYWdpYyBudW1iZXIiKTsKIApAQCAtMTA0LDMzICs5NiwzMyBAQAogCiAJY2xlYXJfaW5vZGUgKGlub2RlKTsKIAotCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpKQorCWlmICh1YmhfaXNjbHIgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpKQogCQl1ZnNfZXJyb3Ioc2IsICJ1ZnNfZnJlZV9pbm9kZSIsICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAldSIsIGlubyk7CiAJZWxzZSB7Ci0JCXViaF9jbHJiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpOworCQl1YmhfY2xyYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KTsKIAkJaWYgKGlubyA8IHVjcGktPmNfaXJvdG9yKQogCQkJdWNwaS0+Y19pcm90b3IgPSBpbm87CiAJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19jcy5jc19uaWZyZWUsIDEpOwotCQlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlLCAxKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmlmcmVlKys7CiAJCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2cpLmNzX25pZnJlZSwgMSk7CiAKIAkJaWYgKGlzX2RpcmVjdG9yeSkgewogCQkJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25kaXIsIDEpOwotCQkJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIsIDEpOworCQkJdXNwaS0+Y3NfdG90YWwuY3NfbmRpci0tOwogCQkJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZykuY3NfbmRpciwgMSk7CiAJCX0KIAl9CiAKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKLQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKHVjcGkpKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopICZ1Y3BpKTsKLQkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIFVDUElfVUJIKHVjcGkpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCh1Y3BpKSk7CiAJfQogCQogCXNiLT5zX2RpcnQgPSAxOwogCXVubG9ja19zdXBlciAoc2IpOwotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIH0KIAogLyoKQEAgLTE1NSw3ICsxNDcsNyBAQAogCXVuc2lnbmVkIGNnLCBiaXQsIGksIGosIHN0YXJ0OwogCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaTsKIAotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCQogCS8qIENhbm5vdCBjcmVhdGUgZmlsZXMgaW4gYSBkZWxldGVkIGRpcmVjdG9yeSAqLwogCWlmICghZGlyIHx8ICFkaXItPmlfbmxpbmspCkBAIC0yMTMsNDMgKzIwNSw0MyBAQAogCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnKTsKIAlpZiAoIXVjcGkpCiAJCWdvdG8gZmFpbGVkOwotCXVjZyA9IHViaF9nZXRfdWNnKFVDUElfVUJIKTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCh1Y3BpKSk7CiAJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIAogCQl1ZnNfcGFuaWMgKHNiLCAidWZzX25ld19pbm9kZSIsICJpbnRlcm5hbCBlcnJvciwgYmFkIGNnIG1hZ2ljIG51bWJlciIpOwogCiAJc3RhcnQgPSB1Y3BpLT5jX2lyb3RvcjsKLQliaXQgPSB1YmhfZmluZF9uZXh0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgdXNwaS0+c19pcGcsIHN0YXJ0KTsKKwliaXQgPSB1YmhfZmluZF9uZXh0X3plcm9fYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgdXNwaS0+c19pcGcsIHN0YXJ0KTsKIAlpZiAoIShiaXQgPCB1c3BpLT5zX2lwZykpIHsKLQkJYml0ID0gdWJoX2ZpbmRfZmlyc3RfemVyb19iaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBzdGFydCk7CisJCWJpdCA9IHViaF9maW5kX2ZpcnN0X3plcm9fYml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgc3RhcnQpOwogCQlpZiAoIShiaXQgPCBzdGFydCkpIHsKIAkJCXVmc19lcnJvciAoc2IsICJ1ZnNfbmV3X2lub2RlIiwKIAkJCSAgICAiY3lsaW5kZXIgZ3JvdXAgJXUgY29ycnVwdGVkIC0gZXJyb3IgaW4gaW5vZGUgYml0bWFwXG4iLCBjZyk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KLQlVRlNEKCgic3RhcnQgPSAldSwgYml0ID0gJXUsIGlwZyA9ICV1XG4iLCBzdGFydCwgYml0LCB1c3BpLT5zX2lwZykpCi0JaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIGJpdCkpCi0JCXViaF9zZXRiaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpOworCVVGU0QoInN0YXJ0ID0gJXUsIGJpdCA9ICV1LCBpcGcgPSAldVxuIiwgc3RhcnQsIGJpdCwgdXNwaS0+c19pcGcpOworCWlmICh1YmhfaXNjbHIgKFVDUElfVUJIKHVjcGkpLCB1Y3BpLT5jX2l1c2Vkb2ZmLCBiaXQpKQorCQl1Ymhfc2V0Yml0IChVQ1BJX1VCSCh1Y3BpKSwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KTsKIAllbHNlIHsKIAkJdWZzX3BhbmljIChzYiwgInVmc19uZXdfaW5vZGUiLCAiaW50ZXJuYWwgZXJyb3IiKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCQogCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uaWZyZWUsIDEpOwotCWZzMzJfc3ViKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUsIDEpOworCXVzcGktPmNzX3RvdGFsLmNzX25pZnJlZS0tOwogCWZzMzJfc3ViKHNiLCAmc2JpLT5mc19jcyhjZykuY3NfbmlmcmVlLCAxKTsKIAkKIAlpZiAoU19JU0RJUihtb2RlKSkgewogCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmRpciwgMSk7Ci0JCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyLCAxKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmRpcisrOwogCQlmczMyX2FkZChzYiwgJnNiaS0+ZnNfY3MoY2cpLmNzX25kaXIsIDEpOwogCX0KIAotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOwotCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgodXNwaSkpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgodWNwaSkpOwogCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7Ci0JCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikgJnVjcGkpOwotCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgVUNQSV9VQkgodWNwaSkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKHVjcGkpKTsKIAl9CiAJc2ItPnNfZGlydCA9IDE7CiAKQEAgLTI3Miw2ICsyNjQsNyBAQAogCXVmc2ktPmlfc2hhZG93ID0gMDsKIAl1ZnNpLT5pX29zeW5jID0gMDsKIAl1ZnNpLT5pX29lZnRmbGFnID0gMDsKKwl1ZnNpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOwogCW1lbXNldCgmdWZzaS0+aV91MSwgMCwgc2l6ZW9mKHVmc2ktPmlfdTEpKTsKIAogCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKQEAgLTI4NywxNCArMjgwLDE0IEBACiAJCXJldHVybiBFUlJfUFRSKC1FRFFVT1QpOwogCX0KIAotCVVGU0QoKCJhbGxvY2F0aW5nIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiYWxsb2NhdGluZyBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIGlub2RlOwogCiBmYWlsZWQ6CiAJdW5sb2NrX3N1cGVyIChzYik7CiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCWlwdXQgKGlub2RlKTsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CiB9CmRpZmYgLS1naXQgYS9mcy91ZnMvaW5vZGUuYyBiL2ZzL3Vmcy9pbm9kZS5jCmluZGV4IDNjM2Y2MmMuLmYyZGJkZjUgMTAwNjQ0Ci0tLSBhL2ZzL3Vmcy9pbm9kZS5jCisrKyBiL2ZzL3Vmcy9pbm9kZS5jCkBAIC00MSwxNCArNDEsNyBAQAogI2luY2x1ZGUgInN3YWIuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAKLSN1bmRlZiBVRlNfSU5PREVfREVCVUcKLSN1bmRlZiBVRlNfSU5PREVfREVCVUdfTU9SRQotCi0jaWZkZWYgVUZTX0lOT0RFX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKK3N0YXRpYyB1NjQgdWZzX2ZyYWdfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWcpOwogCiBzdGF0aWMgaW50IHVmc19ibG9ja190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlfYmxvY2ssIHNlY3Rvcl90IG9mZnNldHNbNF0pCiB7CkBAIC02MSw3ICs1NCw3IEBACiAJaW50IG4gPSAwOwogCiAKLQlVRlNEKCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWxkIFxuIixwdHJzLGRvdWJsZV9ibG9ja3MpKTsKKwlVRlNEKCJwdHJzPXVzcGktPnNfYXBiID0gJWQsZG91YmxlX2Jsb2Nrcz0lbGQgXG4iLHB0cnMsZG91YmxlX2Jsb2Nrcyk7CiAJaWYgKGlfYmxvY2sgPCAwKSB7CiAJCXVmc193YXJuaW5nKGlub2RlLT5pX3NiLCAidWZzX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPCAwIik7CiAJfSBlbHNlIGlmIChpX2Jsb2NrIDwgZGlyZWN0X2Jsb2NrcykgewpAQCAtODksNyArODIsNyBAQAogICogdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlc3lzdGVtLgogICovCiAKLXU2NCAgdWZzX2ZyYWdfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWcpCitzdGF0aWMgdTY0IHVmc19mcmFnX21hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnKQogewogCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CkBAIC0xMDQsOCArOTcsOCBAQAogCXVuc2lnbmVkIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAl1NjQgdGVtcCA9IDBMOwogCi0JVUZTRCgoIjogZnJhZyA9ICVsbHUgIGRlcHRoID0gJWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhZywgZGVwdGgpKTsKLQlVRlNEKCgiOiB1c3BpLT5zX2ZwYnNoaWZ0ID0gJWQgLHVzcGktPnNfYXBibWFzayA9ICV4LCBtYXNrPSVsbHhcbiIsdXNwaS0+c19mcGJzaGlmdCx1c3BpLT5zX2FwYm1hc2ssbWFzaykpOworCVVGU0QoIjogZnJhZyA9ICVsbHUgIGRlcHRoID0gJWRcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhZywgZGVwdGgpOworCVVGU0QoIjogdXNwaS0+c19mcGJzaGlmdCA9ICVkICx1c3BpLT5zX2FwYm1hc2sgPSAleCwgbWFzaz0lbGx4XG4iLHVzcGktPnNfZnBic2hpZnQsdXNwaS0+c19hcGJtYXNrLG1hc2spOwogCiAJaWYgKGRlcHRoID09IDApCiAJCXJldHVybiAwOwpAQCAtMTYxLDI2ICsxNTQsNjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogdWZzX2lub2RlX2dldGZyYWcgKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JdW5zaWduZWQgaW50IGZyYWdtZW50LCB1bnNpZ25lZCBpbnQgbmV3X2ZyYWdtZW50LAotCXVuc2lnbmVkIGludCByZXF1aXJlZCwgaW50ICplcnIsIGludCBtZXRhZGF0YSwgbG9uZyAqcGh5cywgaW50ICpuZXcpCitzdGF0aWMgdm9pZCB1ZnNfY2xlYXJfZnJhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWxvY2tfYnVmZmVyKGJoKTsKKwltZW1zZXQoYmgtPmJfZGF0YSwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWZzX2NsZWFyX2ZyYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJlZywKKwkJdW5zaWduZWQgaW50IG4pCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpyZXMsICpiaDsKKwlzZWN0b3JfdCBlbmQgPSBiZWcgKyBuOworCisJcmVzID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBiZWcpOworCXVmc19jbGVhcl9mcmFnKGlub2RlLCByZXMpOworCWZvciAoKytiZWc7IGJlZyA8IGVuZDsgKytiZWcpIHsKKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGJlZyk7CisJCXVmc19jbGVhcl9mcmFnKGlub2RlLCBiaCk7CisJCWJyZWxzZShiaCk7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qKgorICogdWZzX2lub2RlX2dldGZyYWcoKSAtIGFsbG9jYXRlIG5ldyBmcmFnbWVudChzKQorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogQGZyYWdtZW50IC0gbnVtYmVyIG9mIGBmcmFnbWVudCcgd2hpY2ggaG9sZCBwb2ludGVyCisgKiAgIHRvIG5ldyBhbGxvY2F0ZWQgZnJhZ21lbnQocykKKyAqIEBuZXdfZnJhZ21lbnQgLSBudW1iZXIgb2YgbmV3IGFsbG9jYXRlZCBmcmFnbWVudChzKQorICogQHJlcXVpcmVkIC0gaG93IG1hbnkgZnJhZ21lbnQocykgd2UgcmVxdWlyZQorICogQGVyciAtIHdlIHNldCBpdCBpZiBzb21ldGhpbmcgd3JvbmcKKyAqIEBwaHlzIC0gcG9pbnRlciB0byB3aGVyZSB3ZSBzYXZlIHBoeXNpY2FsIG51bWJlciBvZiBuZXcgYWxsb2NhdGVkIGZyYWdtZW50cywKKyAqICAgTlVMTCBpZiB3ZSBhbGxvY2F0ZSBub3QgZGF0YShpbmRpcmVjdCBibG9ja3MgZm9yIGV4YW1wbGUpLgorICogQG5ldyAtIHdlIHNldCBpdCBpZiB3ZSBhbGxvY2F0ZSBuZXcgYmxvY2sKKyAqIEBsb2NrZWRfcGFnZSAtIGZvciB1ZnNfbmV3X2ZyYWdtZW50cygpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWZzX2lub2RlX2dldGZyYWcoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZyYWdtZW50LAorCQkgIHNlY3Rvcl90IG5ld19mcmFnbWVudCwgdW5zaWduZWQgaW50IHJlcXVpcmVkLCBpbnQgKmVyciwKKwkJICBsb25nICpwaHlzLCBpbnQgKm5ldywgc3RydWN0IHBhZ2UgKmxvY2tlZF9wYWdlKQogewogCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLQlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHJlc3VsdDsKIAl1bnNpZ25lZCBibG9jaywgYmxvY2tvZmYsIGxhc3RmcmFnLCBsYXN0YmxvY2ssIGxhc3RibG9ja29mZjsKIAl1bnNpZ25lZCB0bXAsIGdvYWw7CiAJX19mczMyICogcCwgKiBwMjsKLQl1bnNpZ25lZCBmbGFncyA9IDA7CiAKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1LCBuZXdfZnJhZ21lbnQgJXUsIHJlcXVpcmVkICV1XG4iLAotCQlpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBuZXdfZnJhZ21lbnQsIHJlcXVpcmVkKSkgICAgICAgICAKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIG5ld19mcmFnbWVudCAlbGx1LCByZXF1aXJlZCAldSwgIgorCSAgICAgIm1ldGFkYXRhICVkXG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyluZXdfZnJhZ21lbnQsIHJlcXVpcmVkLCAhcGh5cyk7CiAKLQlzYiA9IGlub2RlLT5pX3NiOwotCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7Ci0KLQlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CiAgICAgICAgIC8qIFRPRE8gOiB0byBiZSBkb25lIGZvciB3cml0ZSBzdXBwb3J0CiAgICAgICAgIGlmICggKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKICAgICAgICAgICAgICBnb3RvIHVmczI7CkBAIC0xOTUsMTYgKzIyNiwxNiBAQAogCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CiAJbGFzdGZyYWcgPSB1ZnNpLT5pX2xhc3RmcmFnOwogCWlmICh0bXAgJiYgZnJhZ21lbnQgPCBsYXN0ZnJhZykgewotCQlpZiAobWV0YWRhdGEpIHsKKwkJaWYgKCFwaHlzKSB7CiAJCQlyZXN1bHQgPSBzYl9nZXRibGsoc2IsIHVzcGktPnNfc2JiYXNlICsgdG1wICsgYmxvY2tvZmYpOwogCQkJaWYgKHRtcCA9PSBmczMyX3RvX2NwdShzYiwgKnApKSB7Ci0JCQkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCQkJCVVGU0QoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpOwogCQkJCXJldHVybiByZXN1bHQ7CiAJCQl9CiAJCQlicmVsc2UgKHJlc3VsdCk7CiAJCQlnb3RvIHJlcGVhdDsKIAkJfSBlbHNlIHsKLQkJCSpwaHlzID0gdG1wOworCQkJKnBoeXMgPSB0bXAgKyBibG9ja29mZjsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQpAQCAtMjIxLDcgKzI1Miw4IEBACiAJCWlmIChsYXN0YmxvY2tvZmYpIHsKIAkJCXAyID0gdWZzaS0+aV91MS5pX2RhdGEgKyBsYXN0YmxvY2s7CiAJCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAyLCBsYXN0ZnJhZywgCi0JCQkJZnMzMl90b19jcHUoc2IsICpwMiksIHVzcGktPnNfZnBiIC0gbGFzdGJsb2Nrb2ZmLCBlcnIpOworCQkJCQkJIGZzMzJfdG9fY3B1KHNiLCAqcDIpLCB1c3BpLT5zX2ZwYiAtIGxhc3RibG9ja29mZiwKKwkJCQkJCSBlcnIsIGxvY2tlZF9wYWdlKTsKIAkJCWlmICghdG1wKSB7CiAJCQkJaWYgKGxhc3RmcmFnICE9IHVmc2ktPmlfbGFzdGZyYWcpCiAJCQkJCWdvdG8gcmVwZWF0OwpAQCAtMjMzLDE0ICsyNjUsMTYgQEAKIAkJfQogCQlnb2FsID0gZnMzMl90b19jcHUoc2IsIHVmc2ktPmlfdTEuaV9kYXRhW2xhc3RibG9ja10pICsgdXNwaS0+c19mcGI7CiAJCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcCwgZnJhZ21lbnQgLSBibG9ja29mZiwgCi0JCQlnb2FsLCByZXF1aXJlZCArIGJsb2Nrb2ZmLCBlcnIpOworCQkJCQkgZ29hbCwgcmVxdWlyZWQgKyBibG9ja29mZiwKKwkJCQkJIGVyciwgbG9ja2VkX3BhZ2UpOwogCX0KIAkvKgogCSAqIFdlIHdpbGwgZXh0ZW5kIGxhc3QgYWxsb2NhdGVkIGJsb2NrCiAJICovCiAJZWxzZSBpZiAobGFzdGJsb2NrID09IGJsb2NrKSB7Ci0JCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcCwgZnJhZ21lbnQgLSAoYmxvY2tvZmYgLSBsYXN0YmxvY2tvZmYpLAotCQkJZnMzMl90b19jcHUoc2IsICpwKSwgcmVxdWlyZWQgKyAgKGJsb2Nrb2ZmIC0gbGFzdGJsb2Nrb2ZmKSwgZXJyKTsKKwkJdG1wID0gdWZzX25ld19mcmFnbWVudHMoaW5vZGUsIHAsIGZyYWdtZW50IC0gKGJsb2Nrb2ZmIC0gbGFzdGJsb2Nrb2ZmKSwKKwkJCQkJZnMzMl90b19jcHUoc2IsICpwKSwgcmVxdWlyZWQgKyAgKGJsb2Nrb2ZmIC0gbGFzdGJsb2Nrb2ZmKSwKKwkJCQkJZXJyLCBsb2NrZWRfcGFnZSk7CiAJfQogCS8qCiAJICogV2Ugd2lsbCBhbGxvY2F0ZSBuZXcgYmxvY2sgYmVmb3JlIGxhc3QgYWxsb2NhdGVkIGJsb2NrCkBAIC0yNDgsOCArMjgyLDggQEAKIAllbHNlIC8qIChsYXN0YmxvY2sgPiBibG9jaykgKi8gewogCQlpZiAobGFzdGJsb2NrICYmICh0bXAgPSBmczMyX3RvX2NwdShzYiwgdWZzaS0+aV91MS5pX2RhdGFbbGFzdGJsb2NrLTFdKSkpCiAJCQlnb2FsID0gdG1wICsgdXNwaS0+c19mcGI7Ci0JCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcCwgZnJhZ21lbnQgLSBibG9ja29mZiwgCi0JCQlnb2FsLCB1c3BpLT5zX2ZwYiwgZXJyKTsKKwkJdG1wID0gdWZzX25ld19mcmFnbWVudHMoaW5vZGUsIHAsIGZyYWdtZW50IC0gYmxvY2tvZmYsCisJCQkJCWdvYWwsIHVzcGktPnNfZnBiLCBlcnIsIGxvY2tlZF9wYWdlKTsKIAl9CiAJaWYgKCF0bXApIHsKIAkJaWYgKCghYmxvY2tvZmYgJiYgKnApIHx8IApAQCAtMjU5LDE0ICsyOTMsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JLyogVGhlIG51bGxpZmljYXRpb24gb2YgZnJhbWdlbnRzIGRvbmUgaW4gdWZzL2JhbGxvYy5jIGlzCi0JICogc29tZXRoaW5nIEkgZG9uJ3QgaGF2ZSB0aGUgc3RvbWFjaGUgdG8gbW92ZSBpbnRvIGhlcmUgcmlnaHQKLQkgKiBub3cuIC1EYXZlTQotCSAqLwotCWlmIChtZXRhZGF0YSkgewotCQlyZXN1bHQgPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHRtcCArIGJsb2Nrb2ZmKTsKKwlpZiAoIXBoeXMpIHsKKwkJcmVzdWx0ID0gdWZzX2NsZWFyX2ZyYWdzKGlub2RlLCB0bXAgKyBibG9ja29mZiwgcmVxdWlyZWQpOwogCX0gZWxzZSB7Ci0JCSpwaHlzID0gdG1wOworCQkqcGh5cyA9IHRtcCArIGJsb2Nrb2ZmOwogCQlyZXN1bHQgPSBOVUxMOwogCQkqZXJyID0gMDsKIAkJKm5ldyA9IDE7CkBAIC0yNzYsNyArMzA2LDcgQEAKIAlpZiAoSVNfU1lOQyhpbm9kZSkpCiAJCXVmc19zeW5jX2lub2RlIChpbm9kZSk7CiAJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCVVGU0QoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpOwogCXJldHVybiByZXN1bHQ7CiAKICAgICAgLyogVGhpcyBwYXJ0IDogVG8gYmUgaW1wbGVtZW50ZWQgLi4uLgpAQCAtMjk1LDIyICszMjUsMzUgQEAKICAgICAgKi8KIH0KIAotc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19ibG9ja19nZXRmcmFnIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHVuc2lnbmVkIGludCBmcmFnbWVudCwgdW5zaWduZWQgaW50IG5ld19mcmFnbWVudCwgCi0JdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwgaW50ICogZXJyLCBpbnQgbWV0YWRhdGEsIGxvbmcgKnBoeXMsIGludCAqbmV3KQorLyoqCisgKiB1ZnNfaW5vZGVfZ2V0YmxvY2soKSAtIGFsbG9jYXRlIG5ldyBibG9jaworICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogQGJoIC0gcG9pbnRlciB0byBibG9jayB3aGljaCBob2xkICJwb2ludGVyIiB0byBuZXcgYWxsb2NhdGVkIGJsb2NrCisgKiBAZnJhZ21lbnQgLSBudW1iZXIgb2YgYGZyYWdtZW50JyB3aGljaCBob2xkIHBvaW50ZXIKKyAqICAgdG8gbmV3IGFsbG9jYXRlZCBibG9jaworICogQG5ld19mcmFnbWVudCAtIG51bWJlciBvZiBuZXcgYWxsb2NhdGVkIGZyYWdtZW50CisgKiAgKGJsb2NrIHdpbGwgaG9sZCB0aGlzIGZyYWdtZW50IGFuZCBhbHNvIHVzcGktPnNfZnBiLTEpCisgKiBAZXJyIC0gc2VlIHVmc19pbm9kZV9nZXRmcmFnKCkKKyAqIEBwaHlzIC0gc2VlIHVmc19pbm9kZV9nZXRmcmFnKCkKKyAqIEBuZXcgLSBzZWUgdWZzX2lub2RlX2dldGZyYWcoKQorICogQGxvY2tlZF9wYWdlIC0gc2VlIHVmc19pbm9kZV9nZXRmcmFnKCkKKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqCit1ZnNfaW5vZGVfZ2V0YmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJICB1bnNpZ25lZCBpbnQgZnJhZ21lbnQsIHNlY3Rvcl90IG5ld19mcmFnbWVudCwgaW50ICplcnIsCisJCSAgbG9uZyAqcGh5cywgaW50ICpuZXcsIHN0cnVjdCBwYWdlICpsb2NrZWRfcGFnZSkKIHsKLQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKLQlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCXN0cnVjdCBidWZmZXJfaGVhZCAqIHJlc3VsdDsKIAl1bnNpZ25lZCB0bXAsIGdvYWwsIGJsb2NrLCBibG9ja29mZjsKIAlfX2ZzMzIgKiBwOwogCi0Jc2IgPSBpbm9kZS0+aV9zYjsKLQl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCWJsb2NrID0gdWZzX2ZyYWdzdG9ibGtzIChmcmFnbWVudCk7CiAJYmxvY2tvZmYgPSB1ZnNfZnJhZ251bSAoZnJhZ21lbnQpOwogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAldSwgbmV3X2ZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50LCBuZXdfZnJhZ21lbnQpKQkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIG5ld19mcmFnbWVudCAlbGx1LCBtZXRhZGF0YSAlZFxuIiwKKwkgICAgIGlub2RlLT5pX2lubywgZnJhZ21lbnQsICh1bnNpZ25lZCBsb25nIGxvbmcpbmV3X2ZyYWdtZW50LCAhcGh5cyk7CiAKIAlyZXN1bHQgPSBOVUxMOwogCWlmICghYmgpCkBAIC0zMjYsMTQgKzM2OSwxNCBAQAogcmVwZWF0OgogCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CiAJaWYgKHRtcCkgewotCQlpZiAobWV0YWRhdGEpIHsKKwkJaWYgKCFwaHlzKSB7CiAJCQlyZXN1bHQgPSBzYl9nZXRibGsoc2IsIHVzcGktPnNfc2JiYXNlICsgdG1wICsgYmxvY2tvZmYpOwogCQkJaWYgKHRtcCA9PSBmczMyX3RvX2NwdShzYiwgKnApKQogCQkJCWdvdG8gb3V0OwogCQkJYnJlbHNlIChyZXN1bHQpOwogCQkJZ290byByZXBlYXQ7CiAJCX0gZWxzZSB7Ci0JCQkqcGh5cyA9IHRtcDsKKwkJCSpwaHlzID0gdG1wICsgYmxvY2tvZmY7CiAJCQlnb3RvIG91dDsKIAkJfQogCX0KQEAgLTM0MiwyMSArMzg1LDE5IEBACiAJCWdvYWwgPSB0bXAgKyB1c3BpLT5zX2ZwYjsKIAllbHNlCiAJCWdvYWwgPSBiaC0+Yl9ibG9ja25yICsgdXNwaS0+c19mcGI7Ci0JdG1wID0gdWZzX25ld19mcmFnbWVudHMgKGlub2RlLCBwLCB1ZnNfYmxrbnVtKG5ld19mcmFnbWVudCksIGdvYWwsIHVzcGktPnNfZnBiLCBlcnIpOworCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzKGlub2RlLCBwLCB1ZnNfYmxrbnVtKG5ld19mcmFnbWVudCksIGdvYWwsCisJCQkJdXNwaS0+c19mcGIsIGVyciwgbG9ja2VkX3BhZ2UpOwogCWlmICghdG1wKSB7CiAJCWlmIChmczMyX3RvX2NwdShzYiwgKnApKQogCQkJZ290byByZXBlYXQ7CiAJCWdvdG8gb3V0OwogCX0JCQogCi0JLyogVGhlIG51bGxpZmljYXRpb24gb2YgZnJhbWdlbnRzIGRvbmUgaW4gdWZzL2JhbGxvYy5jIGlzCi0JICogc29tZXRoaW5nIEkgZG9uJ3QgaGF2ZSB0aGUgc3RvbWFjaGUgdG8gbW92ZSBpbnRvIGhlcmUgcmlnaHQKLQkgKiBub3cuIC1EYXZlTQotCSAqLwotCWlmIChtZXRhZGF0YSkgewotCQlyZXN1bHQgPSBzYl9nZXRibGsoc2IsIHRtcCArIGJsb2Nrb2ZmKTsKKworCWlmICghcGh5cykgeworCQlyZXN1bHQgPSB1ZnNfY2xlYXJfZnJhZ3MoaW5vZGUsIHRtcCArIGJsb2Nrb2ZmLCB1c3BpLT5zX2ZwYik7CiAJfSBlbHNlIHsKLQkJKnBoeXMgPSB0bXA7CisJCSpwaHlzID0gdG1wICsgYmxvY2tvZmY7CiAJCSpuZXcgPSAxOwogCX0KIApAQCAtMzY1LDE4ICs0MDYsMTkgQEAKIAkJc3luY19kaXJ0eV9idWZmZXIoYmgpOwogCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlVRlNEKCgicmVzdWx0ICV1XG4iLCB0bXAgKyBibG9ja29mZikpOworCVVGU0QoInJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpOwogb3V0OgogCWJyZWxzZSAoYmgpOwotCVVGU0QoKCJFWElUXG4iKSk7CisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgYmxvY2sgd2hpY2ggY29udGFpbnMgdGhlIGZyYWdtZW50LgorLyoqCisgKiB1ZnNfZ2V0ZnJhZ19ibG9jKCkgLSBgZ2V0X2Jsb2NrX3QnIGZ1bmN0aW9uLCBpbnRlcmZhY2UgYmV0d2VlbiBVRlMgYW5kCisgKiByZWFkcGFnZSwgd3JpdGVwYWdlIGFuZCBzbyBvbgogICovCiAKLWludCB1ZnNfZ2V0ZnJhZ19ibG9jayAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgZnJhZ21lbnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoraW50IHVmc19nZXRmcmFnX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWdtZW50LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOwogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKQEAgLTM4Nyw3ICs0MjksNyBAQAogCQogCWlmICghY3JlYXRlKSB7CiAJCXBoeXM2NCA9IHVmc19mcmFnX21hcChpbm9kZSwgZnJhZ21lbnQpOwotCQlVRlNEKCgicGh5czY0ID0gJWxsdSBcbiIscGh5czY0KSk7CisJCVVGU0QoInBoeXM2NCA9ICVsbHUgXG4iLHBoeXM2NCk7CiAJCWlmIChwaHlzNjQpCiAJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5czY0KTsKIAkJcmV0dXJuIDA7CkBAIC00MDIsNyArNDQ0LDcgQEAKIAogCWxvY2tfa2VybmVsKCk7CiAKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICVsbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFnbWVudCkpCisJVUZTRCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICVsbHVcbiIsIGlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFnbWVudCk7CiAJaWYgKGZyYWdtZW50IDwgMCkKIAkJZ290byBhYm9ydF9uZWdhdGl2ZTsKIAlpZiAoZnJhZ21lbnQgPgpAQCAtNDE4LDE1ICs0NjAsMTUgQEAKIAkgKiBpdCBtdWNoIG1vcmUgcmVhZGFibGU6CiAJICovCiAjZGVmaW5lIEdFVF9JTk9ERV9EQVRBQkxPQ0soeCkgXAotCQl1ZnNfaW5vZGVfZ2V0ZnJhZyhpbm9kZSwgeCwgZnJhZ21lbnQsIDEsICZlcnIsIDAsICZwaHlzLCAmbmV3KQorCXVmc19pbm9kZV9nZXRmcmFnKGlub2RlLCB4LCBmcmFnbWVudCwgMSwgJmVyciwgJnBoeXMsICZuZXcsIGJoX3Jlc3VsdC0+Yl9wYWdlKQogI2RlZmluZSBHRVRfSU5PREVfUFRSKHgpIFwKLQkJdWZzX2lub2RlX2dldGZyYWcoaW5vZGUsIHgsIGZyYWdtZW50LCB1c3BpLT5zX2ZwYiwgJmVyciwgMSwgTlVMTCwgTlVMTCkKKwl1ZnNfaW5vZGVfZ2V0ZnJhZyhpbm9kZSwgeCwgZnJhZ21lbnQsIHVzcGktPnNfZnBiLCAmZXJyLCBOVUxMLCBOVUxMLCBiaF9yZXN1bHQtPmJfcGFnZSkKICNkZWZpbmUgR0VUX0lORElSRUNUX0RBVEFCTE9DSyh4KSBcCi0JCXVmc19ibG9ja19nZXRmcmFnKGlub2RlLCBiaCwgeCwgZnJhZ21lbnQsIHNiLT5zX2Jsb2Nrc2l6ZSwgXAotCQkJCSAgJmVyciwgMCwgJnBoeXMsICZuZXcpOworCXVmc19pbm9kZV9nZXRibG9jayhpbm9kZSwgYmgsIHgsIGZyYWdtZW50LAlcCisJCQkgICZlcnIsICZwaHlzLCAmbmV3LCBiaF9yZXN1bHQtPmJfcGFnZSk7CiAjZGVmaW5lIEdFVF9JTkRJUkVDVF9QVFIoeCkgXAotCQl1ZnNfYmxvY2tfZ2V0ZnJhZyhpbm9kZSwgYmgsIHgsIGZyYWdtZW50LCBzYi0+c19ibG9ja3NpemUsIFwKLQkJCQkgICZlcnIsIDEsIE5VTEwsIE5VTEwpOworCXVmc19pbm9kZV9nZXRibG9jayhpbm9kZSwgYmgsIHgsIGZyYWdtZW50LAlcCisJCQkgICZlcnIsIE5VTEwsIE5VTEwsIGJoX3Jlc3VsdC0+Yl9wYWdlKTsKIAogCWlmIChwdHIgPCBVRlNfTkRJUl9GUkFHTUVOVCkgewogCQliaCA9IEdFVF9JTk9ERV9EQVRBQkxPQ0socHRyKTsKQEAgLTQ3NCw4ICs1MTYsOSBAQAogCWdvdG8gYWJvcnQ7CiB9CiAKLXN0cnVjdCBidWZmZXJfaGVhZCAqdWZzX2dldGZyYWcoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZyYWdtZW50LAotCQkJCWludCBjcmVhdGUsIGludCAqZXJyKQorc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqdWZzX2dldGZyYWcoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGZyYWdtZW50LAorCQkJCSAgICAgICBpbnQgY3JlYXRlLCBpbnQgKmVycikKIHsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgZHVtbXk7CiAJaW50IGVycm9yOwpAQCAtNTAyLDcgKzU0NSw3IEBACiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CiAKLQlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGZyYWdtZW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGZyYWdtZW50KSkKKwlVRlNEKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQpOwogCWJoID0gdWZzX2dldGZyYWcgKGlub2RlLCBmcmFnbWVudCwgY3JlYXRlLCBlcnIpOwogCWlmICghYmggfHwgYnVmZmVyX3VwdG9kYXRlKGJoKSkgCQkKIAkJcmV0dXJuIGJoOwpAQCAtNTQwLDYgKzU4MywyOCBAQAogCS5ibWFwID0gdWZzX2JtYXAKIH07CiAKK3N0YXRpYyB2b2lkIHVmc19zZXRfaW5vZGVfb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoIWlub2RlLT5pX2Jsb2NrcykKKwkJCWlub2RlLT5pX29wID0gJnVmc19mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCQl9CisJfSBlbHNlCisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkgICB1ZnNfZ2V0X2lub2RlX2Rldihpbm9kZS0+aV9zYiwgVUZTX0koaW5vZGUpKSk7Cit9CisKIHZvaWQgdWZzX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQogewogCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKQEAgLTU1Miw3ICs2MTcsNyBAQAogCXVuc2lnbmVkIGk7CiAJdW5zaWduZWQgZmxhZ3M7CiAJCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pKQorCVVGU0QoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCQogCXNiID0gaW5vZGUtPmlfc2I7CiAJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKQEAgLTYwMywzOCArNjY4LDIyIEBACiAJdWZzaS0+aV9zaGFkb3cgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfc2hhZG93KTsKIAl1ZnNpLT5pX29lZnRmbGFnID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX29lZnRmbGFnKTsKIAl1ZnNpLT5pX2xhc3RmcmFnID0gKGlub2RlLT5pX3NpemUgKyB1c3BpLT5zX2ZzaXplIC0gMSkgPj4gdXNwaS0+c19mc2hpZnQ7CisJdWZzaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKIAkKIAlpZiAoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpIHx8IGlub2RlLT5pX2Jsb2NrcykgewogCQlmb3IgKGkgPSAwOyBpIDwgKFVGU19OREFERFIgKyBVRlNfTklORElSKTsgaSsrKQogCQkJdWZzaS0+aV91MS5pX2RhdGFbaV0gPSB1ZnNfaW5vZGUtPnVpX3UyLnVpX2FkZHIudWlfZGJbaV07Ci0JfQotCWVsc2UgeworCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpICogNDsgaSsrKQogCQkJdWZzaS0+aV91MS5pX3N5bWxpbmtbaV0gPSB1ZnNfaW5vZGUtPnVpX3UyLnVpX3N5bWxpbmtbaV07CiAJfQogCXVmc2ktPmlfb3N5bmMgPSAwOwogCi0JaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKLQkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOwotCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewotCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZGlyX29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlmICghaW5vZGUtPmlfYmxvY2tzKQotCQkJaW5vZGUtPmlfb3AgPSAmdWZzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQllbHNlIHsKLQkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7Ci0JCX0KLQl9IGVsc2UKLQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAotCQkJdWZzX2dldF9pbm9kZV9kZXYoc2IsIHVmc2kpKTsKKwl1ZnNfc2V0X2lub2RlX29wcyhpbm9kZSk7CiAKIAlicmVsc2UgKGJoKTsKIAotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm47CiAKIGJhZF9pbm9kZToKQEAgLTY0Miw3ICs2OTEsNyBAQAogCXJldHVybjsKIAogdWZzMl9pbm9kZSA6Ci0JVUZTRCgoIlJlYWRpbmcgdWZzMiBpbm9kZSwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKwlVRlNEKCJSZWFkaW5nIHVmczIgaW5vZGUsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubyk7CiAKIAl1ZnMyX2lub2RlID0gKHN0cnVjdCB1ZnMyX2lub2RlICopKGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IHVmczJfaW5vZGUpICogdWZzX2lub3RvZnNibyhpbm9kZS0+aV9pbm8pKTsKIApAQCAtNjkwLDI3ICs3MzksMTEgQEAKIAl9CiAJdWZzaS0+aV9vc3luYyA9IDA7CiAKLQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewotCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2ZpbGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7Ci0JfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7Ci0JCWlub2RlLT5pX29wID0gJnVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKLQkJaW5vZGUtPmlfZm9wID0gJnVmc19kaXJfb3BlcmF0aW9uczsKLQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKLQkJaWYgKCFpbm9kZS0+aV9ibG9ja3MpCi0JCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCWVsc2UgewotCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Ci0JCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKLQkJfQotCX0gZWxzZSAgIC8qIFRPRE8gIDogaGVyZSAuLi4qLwotCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCi0JCQl1ZnNfZ2V0X2lub2RlX2RldihzYiwgdWZzaSkpOworCXVmc19zZXRfaW5vZGVfb3BzKGlub2RlKTsKIAogCWJyZWxzZShiaCk7CiAKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuOwogfQogCkBAIC03MjQsNyArNzU3LDcgQEAKIAl1bnNpZ25lZCBpOwogCXVuc2lnbmVkIGZsYWdzOwogCi0JVUZTRCgoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pKQorCVVGU0QoIkVOVEVSLCBpbm8gJWx1XG4iLCBpbm9kZS0+aV9pbm8pOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtNzg1LDcgKzgxOCw3IEBACiAJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKIAlicmVsc2UgKGJoKTsKIAkKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL3Vmcy9uYW1laS5jIGIvZnMvdWZzL25hbWVpLmMKaW5kZXggOGQ1Zjk4YS4uYWJkNWYyMyAxMDA2NDQKLS0tIGEvZnMvdWZzL25hbWVpLmMKKysrIGIvZnMvdWZzL25hbWVpLmMKQEAgLTEsNiArMSw5IEBACiAvKgogICogbGludXgvZnMvdWZzL25hbWVpLmMKICAqCisgKiBNaWdyYXRpb24gdG8gdXNhZ2Ugb2YgInBhZ2UgY2FjaGUiIG9uIE1heSAyMDA2IGJ5CisgKiBFdmdlbml5IER1c2hpc3RvdiA8ZHVzaGlzdG92QG1haWwucnU+IGJhc2VkIG9uIGV4dDIgY29kZSBiYXNlLgorICoKICAqIENvcHlyaWdodCAoQykgMTk5OAogICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CiAgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKQEAgLTI4LDIxICszMSw5IEBACiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSAic3dhYi5oIgkvKiB3aWxsIGdvIGF3YXkgLSBzZWUgY29tbWVudCBpbiBta25vZCgpICovCiAjaW5jbHVkZSAidXRpbC5oIgogCi0vKgotI3VuZGVmIFVGU19OQU1FSV9ERUJVRwotKi8KLSNkZWZpbmUgVUZTX05BTUVJX0RFQlVHCi0KLSNpZmRlZiBVRlNfTkFNRUlfREVCVUcKLSNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKLSNlbHNlCi0jZGVmaW5lIFVGU0QoeCkKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIGludCB1ZnNfYWRkX25vbmRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJaW50IGVyciA9IHVmc19hZGRfbGluayhkZW50cnksIGlub2RlKTsKQEAgLTg4LDggKzc5LDEzIEBACiBzdGF0aWMgaW50IHVmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsCiAJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gdWZzX25ld19pbm9kZShkaXIsIG1vZGUpOwotCWludCBlcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnI7CisKKwlVRlNEKCJCRUdJTlxuIik7CisJaW5vZGUgPSB1ZnNfbmV3X2lub2RlKGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIAkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7CkBAIC05OSw2ICs5NSw3IEBACiAJCWVyciA9IHVmc19hZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOwogCQl1bmxvY2tfa2VybmVsKCk7CiAJfQorCVVGU0QoIkVORDogZXJyPSVkXG4iLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTIwNSw2ICsyMDIsNyBAQAogCiAJaW5vZGUtPmlfb3AgPSAmdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOwogCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZGlyX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7CiAKIAlpbm9kZV9pbmNfbGlua19jb3VudChpbm9kZSk7CiAKQEAgLTIzMSwxOSArMjI5LDE4IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgdWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgdWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBlcnIgPSAtRU5PRU5UOwogCi0JbG9ja19rZXJuZWwoKTsKLQlkZSA9IHVmc19maW5kX2VudHJ5IChkZW50cnksICZiaCk7CisJZGUgPSB1ZnNfZmluZF9lbnRyeShkaXIsIGRlbnRyeSwgJnBhZ2UpOwogCWlmICghZGUpCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gdWZzX2RlbGV0ZV9lbnRyeSAoZGlyLCBkZSwgYmgpOworCWVyciA9IHVmc19kZWxldGVfZW50cnkoZGlyLCBkZSwgcGFnZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTI1MSw3ICsyNDgsNiBAQAogCWlub2RlX2RlY19saW5rX2NvdW50KGlub2RlKTsKIAllcnIgPSAwOwogb3V0OgotCXVubG9ja19rZXJuZWwoKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNzMsNDIgKzI2OSw0MiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdWZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksCi0Jc3RydWN0IGlub2RlICogbmV3X2RpciwJc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnkgKQorc3RhdGljIGludCB1ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQogewogCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKIAlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmggPSBOVUxMOwotCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkaXJfZGUgPSBOVUxMOwotCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoOworCXN0cnVjdCBwYWdlICpkaXJfcGFnZSA9IE5VTEw7CisJc3RydWN0IHVmc19kaXJfZW50cnkgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICpvbGRfcGFnZTsKIAlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqb2xkX2RlOwogCWludCBlcnIgPSAtRU5PRU5UOwogCi0JbG9ja19rZXJuZWwoKTsKLQlvbGRfZGUgPSB1ZnNfZmluZF9lbnRyeSAob2xkX2RlbnRyeSwgJm9sZF9iaCk7CisJb2xkX2RlID0gdWZzX2ZpbmRfZW50cnkob2xkX2Rpciwgb2xkX2RlbnRyeSwgJm9sZF9wYWdlKTsKIAlpZiAoIW9sZF9kZSkKIAkJZ290byBvdXQ7CiAKIAlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKIAkJZXJyID0gLUVJTzsKLQkJZGlyX2RlID0gdWZzX2RvdGRvdChvbGRfaW5vZGUsICZkaXJfYmgpOworCQlkaXJfZGUgPSB1ZnNfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKIAkJaWYgKCFkaXJfZGUpCiAJCQlnb3RvIG91dF9vbGQ7CiAJfQogCiAJaWYgKG5ld19pbm9kZSkgewotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaDsKKwkJc3RydWN0IHBhZ2UgKm5ld19wYWdlOwogCQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqbmV3X2RlOwogCiAJCWVyciA9IC1FTk9URU1QVFk7Ci0JCWlmIChkaXJfZGUgJiYgIXVmc19lbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCWlmIChkaXJfZGUgJiYgIXVmc19lbXB0eV9kaXIobmV3X2lub2RlKSkKIAkJCWdvdG8gb3V0X2RpcjsKKwogCQllcnIgPSAtRU5PRU5UOwotCQluZXdfZGUgPSB1ZnNfZmluZF9lbnRyeSAobmV3X2RlbnRyeSwgJm5ld19iaCk7CisJCW5ld19kZSA9IHVmc19maW5kX2VudHJ5KG5ld19kaXIsIG5ld19kZW50cnksICZuZXdfcGFnZSk7CiAJCWlmICghbmV3X2RlKQogCQkJZ290byBvdXRfZGlyOwogCQlpbm9kZV9pbmNfbGlua19jb3VudChvbGRfaW5vZGUpOwotCQl1ZnNfc2V0X2xpbmsobmV3X2RpciwgbmV3X2RlLCBuZXdfYmgsIG9sZF9pbm9kZSk7CisJCXVmc19zZXRfbGluayhuZXdfZGlyLCBuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOwogCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCQlpZiAoZGlyX2RlKQogCQkJbmV3X2lub2RlLT5pX25saW5rLS07CkBAIC0zMjksMjQgKzMyNSwzMiBAQAogCQkJaW5vZGVfaW5jX2xpbmtfY291bnQobmV3X2Rpcik7CiAJfQogCi0JdWZzX2RlbGV0ZV9lbnRyeSAob2xkX2Rpciwgb2xkX2RlLCBvbGRfYmgpOworCS8qCisJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKKyAJICogcmVuYW1lLgorCSAqIGlub2RlX2RlY19saW5rX2NvdW50KCkgd2lsbCBtYXJrIHRoZSBpbm9kZSBkaXJ0eS4KKwkgKi8KKwlvbGRfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCisJdWZzX2RlbGV0ZV9lbnRyeShvbGRfZGlyLCBvbGRfZGUsIG9sZF9wYWdlKTsKIAlpbm9kZV9kZWNfbGlua19jb3VudChvbGRfaW5vZGUpOwogCiAJaWYgKGRpcl9kZSkgewotCQl1ZnNfc2V0X2xpbmsob2xkX2lub2RlLCBkaXJfZGUsIGRpcl9iaCwgbmV3X2Rpcik7CisJCXVmc19zZXRfbGluayhvbGRfaW5vZGUsIGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOwogCQlpbm9kZV9kZWNfbGlua19jb3VudChvbGRfZGlyKTsKIAl9Ci0JdW5sb2NrX2tlcm5lbCgpOwogCXJldHVybiAwOwogCisKIG91dF9kaXI6Ci0JaWYgKGRpcl9kZSkKLQkJYnJlbHNlKGRpcl9iaCk7CisJaWYgKGRpcl9kZSkgeworCQlrdW5tYXAoZGlyX3BhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlyX3BhZ2UpOworCX0KIG91dF9vbGQ6Ci0JYnJlbHNlIChvbGRfYmgpOworCWt1bm1hcChvbGRfcGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKIG91dDoKLQl1bmxvY2tfa2VybmVsKCk7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwppbmRleCBkYjk4YTRjLi43NGVmNWU5IDEwMDY0NAotLS0gYS9mcy91ZnMvc3VwZXIuYworKysgYi9mcy91ZnMvc3VwZXIuYwpAQCAtOTAsOTUgKzkwLDg0IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19TVVBFUl9ERUJVRwotI3VuZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCi0KLQotI3VuZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCi0jaWZkZWYgVUZTX1NVUEVSX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQotI2lmZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCisjaWZkZWYgQ09ORklHX1VGU19ERUJVRwogLyoKICAqIFByaW50IGNvbnRlbnRzIG9mIHVmc19zdXBlcl9ibG9jaywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKICAqLwotdm9pZCB1ZnNfcHJpbnRfc3VwZXJfc3R1ZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKLQlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMSwKLQlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqIHVzYjIsIAotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKiB1c2IzKQorc3RhdGljIHZvaWQgdWZzX3ByaW50X3N1cGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGZsYWdzLAorCQkJCSAgc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqdXNiMSwKKwkJCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICp1c2IyLAorCQkJCSAgc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqdXNiMykKIHsKIAlwcmludGsoInVmc19wcmludF9zdXBlcl9zdHVmZlxuIik7Ci0JcHJpbnRrKCJzaXplIG9mIHVzYjogICAgICV1XG4iLCBzaXplb2Yoc3RydWN0IHVmc19zdXBlcl9ibG9jaykpOwotCXByaW50aygiICBtYWdpYzogICAgICAgICAweCV4XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbWFnaWMpKTsKLQlwcmludGsoIiAgc2Jsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zYmxrbm8pKTsKLQlwcmludGsoIiAgY2Jsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jYmxrbm8pKTsKLQlwcmludGsoIiAgaWJsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pYmxrbm8pKTsKLQlwcmludGsoIiAgZGJsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kYmxrbm8pKTsKLQlwcmludGsoIiAgY2dvZmZzZXQ6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ29mZnNldCkpOwotCXByaW50aygiICB+Y2dtYXNrOiAgICAgICAweCV4XG4iLCB+ZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NnbWFzaykpOwotCXByaW50aygiICBzaXplOiAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NpemUpKTsKLQlwcmludGsoIiAgZHNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kc2l6ZSkpOwotCXByaW50aygiICBuY2c6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX25jZykpOwotCXByaW50aygiICBic2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaXplKSk7Ci0JcHJpbnRrKCIgIGZzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNpemUpKTsKLQlwcmludGsoIiAgZnJhZzogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcmFnKSk7Ci0JcHJpbnRrKCIgIGZyYWdzaGlmdDogICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZ3NoaWZ0KSk7Ci0JcHJpbnRrKCIgIH5mbWFzazogICAgICAgICV1XG4iLCB+ZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKSk7Ci0JcHJpbnRrKCIgIGZzaGlmdDogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KSk7Ci0JcHJpbnRrKCIgIHNic2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2JzaXplKSk7Ci0JcHJpbnRrKCIgIHNwYzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc3BjKSk7Ci0JcHJpbnRrKCIgIGNwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3BnKSk7Ci0JcHJpbnRrKCIgIGlwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaXBnKSk7Ci0JcHJpbnRrKCIgIGZwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnBnKSk7Ci0JcHJpbnRrKCIgIGNzYWRkcjogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NhZGRyKSk7Ci0JcHJpbnRrKCIgIGNzc2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NzaXplKSk7Ci0JcHJpbnRrKCIgIGNnc2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dzaXplKSk7Ci0JcHJpbnRrKCIgIGZzdG9kYjogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNidG9kYikpOwotCXByaW50aygiICBjb250aWdzdW1zaXplOiAlZFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzXzQ0LmZzX2NvbnRpZ3N1bXNpemUpKTsKLQlwcmludGsoIiAgcG9zdGJsZm9ybWF0OiAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19wb3N0Ymxmb3JtYXQpKTsKLQlwcmludGsoIiAgbnJwb3M6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19ucnBvcykpOwotCXByaW50aygiICBuZGlyICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmRpcikpOwotCXByaW50aygiICBuaWZyZWUgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlKSk7Ci0JcHJpbnRrKCIgIG5iZnJlZSAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpKTsKLQlwcmludGsoIiAgbmZmcmVlICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkpOwotCXByaW50aygiXG4iKTsKLX0KLQotLyoKLSAqIFByaW50IGNvbnRlbnRzIG9mIHVmczIgdWZzX3N1cGVyX2Jsb2NrLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICovCi12b2lkIHVmczJfcHJpbnRfc3VwZXJfc3R1ZmYoCi0gICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0gICAgICBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICp1c2IpCi17Ci0JcHJpbnRrKCJ1ZnNfcHJpbnRfc3VwZXJfc3R1ZmZcbiIpOwotCXByaW50aygic2l6ZSBvZiB1c2I6ICAgICAldVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2spKTsKLQlwcmludGsoIiAgbWFnaWM6ICAgICAgICAgMHgleFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYi0+ZnNfbWFnaWMpKTsKLQlwcmludGsoIiAgZnNfc2l6ZTogICAldVxuIixmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfc2l6ZSkpOwotCXByaW50aygiICBmc19kc2l6ZTogICV1XG4iLGZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19kc2l6ZSkpOwotCXByaW50aygiICBic2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUodXNiLCB1c2ItPmZzX2JzaXplKSk7Ci0JcHJpbnRrKCIgIGZzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdSh1c2IsIHVzYi0+ZnNfZnNpemUpKTsKLQlwcmludGsoIiAgZnNfdm9sbmFtZTogICVzXG4iLCB1c2ItPmZzX3UxMS5mc191Mi5mc192b2xuYW1lKTsKLQlwcmludGsoIiAgZnNfZnNtbnQ6ICAlc1xuIiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZnNtbnQpOwotCXByaW50aygiICBmc19zYmxvY2tsb2M6ICV1XG4iLGZzNjRfdG9fY3B1KHNiLAotCQkJdXNiLT5mc191MTEuZnNfdTIuZnNfc2Jsb2NrbG9jKSk7Ci0JcHJpbnRrKCIgIGNzX25kaXIoTm8gb2YgZGlycyk6ICAldVxuIixmczY0X3RvX2NwdShzYiwKLQkJCXVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmRpcikpOwotCXByaW50aygiICBjc19uYmZyZWUoTm8gb2YgZnJlZSBibG9ja3MpOiAgJXVcbiIsZnM2NF90b19jcHUoc2IsCi0JCQl1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25iZnJlZSkpOworCXByaW50aygiICBtYWdpYzogICAgIDB4JXhcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19tYWdpYykpOworCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCXByaW50aygiICBmc19zaXplOiAgICVsbHVcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpCisJCSAgICAgICBmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmZzX3NpemUpKTsKKwkJcHJpbnRrKCIgIGZzX2RzaXplOiAgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuZnNfZHNpemUpKTsKKwkJcHJpbnRrKCIgIGJzaXplOiAgICAgICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaXplKSk7CisJCXByaW50aygiICBmc2l6ZTogICAgICAgICAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2l6ZSkpOworCQlwcmludGsoIiAgZnNfdm9sbmFtZTogICVzXG4iLCB1c2IyLT5mc191bi5mc191Mi5mc192b2xuYW1lKTsKKwkJcHJpbnRrKCIgIGZzX3NibG9ja2xvYzogJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIGZzNjRfdG9fY3B1KHNiLCB1c2IyLT5mc191bi5mc191Mi5mc19zYmxvY2tsb2MpKTsKKwkJcHJpbnRrKCIgIGNzX25kaXIoTm8gb2YgZGlycyk6ICAlbGx1XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkgICAgICAgZnM2NF90b19jcHUoc2IsIHVzYjItPmZzX3VuLmZzX3UyLmNzX25kaXIpKTsKKwkJcHJpbnRrKCIgIGNzX25iZnJlZShObyBvZiBmcmVlIGJsb2Nrcyk6ICAlbGx1XG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJICAgICAgIGZzNjRfdG9fY3B1KHNiLCB1c2IyLT5mc191bi5mc191Mi5jc19uYmZyZWUpKTsKKwl9IGVsc2UgeworCQlwcmludGsoIiBzYmxrbm86ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zYmxrbm8pKTsKKwkJcHJpbnRrKCIgY2Jsa25vOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2Jsa25vKSk7CisJCXByaW50aygiIGlibGtubzogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2libGtubykpOworCQlwcmludGsoIiBkYmxrbm86ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kYmxrbm8pKTsKKwkJcHJpbnRrKCIgY2dvZmZzZXQ6ICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nnb2Zmc2V0KSk7CisJCXByaW50aygiIH5jZ21hc2s6ICAgICAweCV4XG4iLAorCQkgICAgICAgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ21hc2spKTsKKwkJcHJpbnRrKCIgc2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2l6ZSkpOworCQlwcmludGsoIiBkc2l6ZTogICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kc2l6ZSkpOworCQlwcmludGsoIiBuY2c6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uY2cpKTsKKwkJcHJpbnRrKCIgYnNpemU6ICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfYnNpemUpKTsKKwkJcHJpbnRrKCIgZnNpemU6ICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNpemUpKTsKKwkJcHJpbnRrKCIgZnJhZzogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZykpOworCQlwcmludGsoIiBmcmFnc2hpZnQ6ICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZ3NoaWZ0KSk7CisJCXByaW50aygiIH5mbWFzazogICAgICAldVxuIiwgfmZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mbWFzaykpOworCQlwcmludGsoIiBmc2hpZnQ6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2hpZnQpKTsKKwkJcHJpbnRrKCIgc2JzaXplOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2JzaXplKSk7CisJCXByaW50aygiIHNwYzogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NwYykpOworCQlwcmludGsoIiBjcGc6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jcGcpKTsKKwkJcHJpbnRrKCIgaXBnOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaXBnKSk7CisJCXByaW50aygiIGZwZzogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZwZykpOworCQlwcmludGsoIiBjc2FkZHI6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc2FkZHIpKTsKKwkJcHJpbnRrKCIgY3NzaXplOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NzaXplKSk7CisJCXByaW50aygiIGNnc2l6ZTogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nnc2l6ZSkpOworCQlwcmludGsoIiBmc3RvZGI6ICAgICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNidG9kYikpOworCQlwcmludGsoIiBucnBvczogICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19ucnBvcykpOworCQlwcmludGsoIiBuZGlyICAgICAgICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZGlyKSk7CisJCXByaW50aygiIG5pZnJlZSAgICAgICAldVxuIiwKKwkJICAgICAgIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSkpOworCQlwcmludGsoIiBuYmZyZWUgICAgICAgJXVcbiIsCisJCSAgICAgICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpKTsKKwkJcHJpbnRrKCIgbmZmcmVlICAgICAgICV1XG4iLAorCQkgICAgICAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlKSk7CisJfQogCXByaW50aygiXG4iKTsKIH0KIAogLyoKICAqIFByaW50IGNvbnRlbnRzIG9mIHVmc19jeWxpbmRlcl9ncm91cCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKICAqLwotdm9pZCB1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqY2cpCitzdGF0aWMgdm9pZCB1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgIHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKmNnKQogewogCXByaW50aygiXG51ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmZcbiIpOwotCXByaW50aygic2l6ZSBvZiB1Y2c6ICV1XG4iLCBzaXplb2Yoc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCkpOworCXByaW50aygic2l6ZSBvZiB1Y2c6ICV6dVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXApKTsKIAlwcmludGsoIiAgbWFnaWM6ICAgICAgICAleFxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19tYWdpYykpOwogCXByaW50aygiICB0aW1lOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3RpbWUpKTsKIAlwcmludGsoIiAgY2d4OiAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19jZ3gpKTsKQEAgLTIwMiwxMiArMTkxLDE4IEBACiAJcHJpbnRrKCIgIGl1c2VvZmY6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfaXVzZWRvZmYpKTsKIAlwcmludGsoIiAgZnJlZW9mZjogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcmVlb2ZmKSk7CiAJcHJpbnRrKCIgIG5leHRmcmVlb2ZmOiAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfbmV4dGZyZWVvZmYpKTsKLQlwcmludGsoIiAgY2x1c3RlcnN1bW9mZiAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJzdW1vZmYpKTsKLQlwcmludGsoIiAgY2x1c3Rlcm9mZiAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJvZmYpKTsKLQlwcmludGsoIiAgbmNsdXN0ZXJibGtzICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ191LmNnXzQ0LmNnX25jbHVzdGVyYmxrcykpOworCXByaW50aygiICBjbHVzdGVyc3Vtb2ZmICV1XG4iLAorCSAgICAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfY2x1c3RlcnN1bW9mZikpOworCXByaW50aygiICBjbHVzdGVyb2ZmICAgICV1XG4iLAorCSAgICAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfY2x1c3Rlcm9mZikpOworCXByaW50aygiICBuY2x1c3RlcmJsa3MgICV1XG4iLAorCSAgICAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfbmNsdXN0ZXJibGtzKSk7CiAJcHJpbnRrKCJcbiIpOwogfQotI2VuZGlmIC8qIFVGU19TVVBFUl9ERUJVR19NT1JFICovCisjZWxzZQorIyAgZGVmaW5lIHVmc19wcmludF9zdXBlcl9zdHVmZihzYiwgZmxhZ3MsIHVzYjEsIHVzYjIsIHVzYjMpIC8qKi8KKyMgIGRlZmluZSB1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc2IsIGNnKSAvKiovCisjZW5kaWYgLyogQ09ORklHX1VGU19ERUJVRyAqLwogCiBzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdWZzX3N1cGVyX29wczsKIApAQCAtMjI1LDcgKzIyMCw3IEBACiAJCiAJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CiAJCXVzYjEtPmZzX2NsZWFuID0gVUZTX0ZTQkFEOwotCQl1YmhfbWFya19idWZmZXJfZGlydHkoVVNQSV9VQkgpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkoVVNQSV9VQkgodXNwaSkpOwogCQlzYi0+c19kaXJ0ID0gMTsKIAkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCX0KQEAgLTI1Nyw3ICsyNTIsNyBAQAogCQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewogCQl1c2IxLT5mc19jbGVhbiA9IFVGU19GU0JBRDsKLQkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKHVzcGkpKTsKIAkJc2ItPnNfZGlydCA9IDE7CiAJfQogCXZhX3N0YXJ0IChhcmdzLCBmbXQpOwpAQCAtMzA5LDcgKzMwNCw3IEBACiB7CiAJY2hhciAqIHA7CiAJCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlVRlNEKCJFTlRFUlxuIik7CiAJCiAJaWYgKCFvcHRpb25zKQogCQlyZXR1cm4gMTsKQEAgLTM4NiwyNyArMzgxLDU3IEBACiB9CiAKIC8qCisgKiBEaWZmcmVudCB0eXBlcyBvZiBVRlMgaG9sZCBmc19jc3RvdGFsIGluIGRpZmZlcmVudAorICogcGxhY2VzLCBhbmQgdXNlIGRpZmZyZW50IGRhdGEgc3RydWN0dXJlIGZvciBpdC4KKyAqIFRvIG1ha2UgdGhpbmdzIHNpbXBsaWVyIHdlIGp1c3QgY29weSBmc19jc3RvdGFsIHRvIHVmc19zYl9wcml2YXRlX2luZm8KKyAqLworc3RhdGljIHZvaWQgdWZzX3NldHVwX2NzdG90YWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKnNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGkgPSBzYmktPnNfdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICp1c2IyOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjM7CisJdW5zaWduZWQgbXR5cGUgPSBzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEU7CisKKwlVRlNEKCJFTlRFUiwgbXR5cGU9JXVcbiIsIG10eXBlKTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QodXNwaSk7CisJdXNiMiA9IHViaF9nZXRfdXNiX3NlY29uZCh1c3BpKTsKKwl1c2IzID0gdWJoX2dldF91c2JfdGhpcmQodXNwaSk7CisKKwlpZiAoKG10eXBlID09IFVGU19NT1VOVF9VRlNUWVBFXzQ0QlNEICYmCisJICAgICAodXNiMS0+ZnNfZmxhZ3MgJiBVRlNfRkxBR1NfVVBEQVRFRCkpIHx8CisJICAgIG10eXBlID09IFVGU19NT1VOVF9VRlNUWVBFX1VGUzIpIHsKKwkJLyp3ZSBoYXZlIHN0YXRpc3RpYyBpbiBkaWZmZXJlbnQgcGxhY2UsIHRoZW4gdXN1YWwqLworCQl1c3BpLT5jc190b3RhbC5jc19uZGlyID0gZnM2NF90b19jcHUoc2IsIHVzYjItPmZzX3VuLmZzX3UyLmNzX25kaXIpOworCQl1c3BpLT5jc190b3RhbC5jc19uYmZyZWUgPSBmczY0X3RvX2NwdShzYiwgdXNiMi0+ZnNfdW4uZnNfdTIuY3NfbmJmcmVlKTsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmlmcmVlID0gZnM2NF90b19jcHUoc2IsIHVzYjMtPmZzX3VuMS5mc191Mi5jc19uaWZyZWUpOworCQl1c3BpLT5jc190b3RhbC5jc19uZmZyZWUgPSBmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmNzX25mZnJlZSk7CisJfSBlbHNlIHsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmRpciA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIpOworCQl1c3BpLT5jc190b3RhbC5jc19uYmZyZWUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpOworCQl1c3BpLT5jc190b3RhbC5jc19uaWZyZWUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUpOworCQl1c3BpLT5jc190b3RhbC5jc19uZmZyZWUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpOworCX0KKwlVRlNEKCJFWElUXG4iKTsKK30KKworLyoKICAqIFJlYWQgb24tZGlzayBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBjeWxpbmRlciBncm91cHMKICAqLwotc3RhdGljIGludCB1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGludCB1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0Jc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKLQlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7Ci0Jc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiOworCXN0cnVjdCB1ZnNfc2JfaW5mbyAqc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IHNiaS0+c191c3BpOworCXVuc2lnbmVkIGZsYWdzID0gc2JpLT5zX2ZsYWdzOwogCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1Ymg7CiAJdW5zaWduZWQgY2hhciAqIGJhc2UsICogc3BhY2U7CiAJdW5zaWduZWQgc2l6ZSwgYmxrcywgaTsKLQl1bnNpZ25lZCBmbGFncyA9IDA7Ci0JCi0JVUZTRCgoIkVOVEVSXG4iKSkKLQkKLQl1c3BpID0gc2JpLT5zX3VzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqdXNiMzsKIAotCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQotCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YTsKKwlVRlNEKCJFTlRFUlxuIik7CiAKLSAgICAgICAgZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwotCQorCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZCh1c3BpKTsKIAkvKgogCSAqIFJlYWQgY3Mgc3RydWN0dXJlcyBmcm9tICh1c3VhbGx5KSBmaXJzdCBkYXRhIGJsb2NrCiAJICogb24gdGhlIGRldmljZS4gCkBAIC00MjQsNyArNDQ5LDcgQEAKIAogCQlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgCiAJCQl1YmggPSB1YmhfYnJlYWQoc2IsCi0JCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzYWRkcikgKyBpLCBzaXplKTsKKwkJCQlmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmZzX2NzYWRkcikgKyBpLCBzaXplKTsKIAkJZWxzZSAKIAkJCXViaCA9IHViaF9icmVhZChzYiwgdXNwaS0+c19jc2FkZHIgKyBpLCBzaXplKTsKIAkJCkBAIC00NTEsMTQgKzQ3NiwxMyBAQAogCQlzYmktPnNfY2dub1tpXSA9IFVGU19DR05PX0VNUFRZOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19uY2c7IGkrKykgewotCQlVRlNEKCgicmVhZCBjZyAldVxuIiwgaSkpCisJCVVGU0QoInJlYWQgY2cgJXVcbiIsIGkpOwogCQlpZiAoIShzYmktPnNfdWNnW2ldID0gc2JfYnJlYWQoc2IsIHVmc19jZ2NtaW4oaSkpKSkKIAkJCWdvdG8gZmFpbGVkOwogCQlpZiAoIXVmc19jZ19jaGttYWdpYyAoc2IsIChzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICopIHNiaS0+c191Y2dbaV0tPmJfZGF0YSkpCiAJCQlnb3RvIGZhaWxlZDsKLSNpZmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQorCiAJCXVmc19wcmludF9jeWxpbmRlcl9zdHVmZihzYiwgKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikgc2JpLT5zX3VjZ1tpXS0+Yl9kYXRhKTsKLSNlbmRpZgogCX0KIAlmb3IgKGkgPSAwOyBpIDwgVUZTX01BWF9HUk9VUF9MT0FERUQ7IGkrKykgewogCQlpZiAoIShzYmktPnNfdWNwaVtpXSA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyksIEdGUF9LRVJORUwpKSkKQEAgLTQ2Niw3ICs0OTAsNyBAQAogCQlzYmktPnNfY2dub1tpXSA9IFVGU19DR05PX0VNUFRZOwogCX0KIAlzYmktPnNfY2dfbG9hZGVkID0gMDsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIDE7CiAKIGZhaWxlZDoKQEAgLTQ3OSwyNiArNTAzLDY5IEBACiAJCWZvciAoaSA9IDA7IGkgPCBVRlNfTUFYX0dST1VQX0xPQURFRDsgaSsrKQogCQkJa2ZyZWUgKHNiaS0+c191Y3BpW2ldKTsKIAl9Ci0JVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCVVGU0QoIkVYSVQgKEZBSUxFRClcbiIpOwogCXJldHVybiAwOwogfQogCiAvKgotICogUHV0IG9uLWRpc2sgc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggY3lsaW5kZXIgZ3JvdXBzIGFuZCAKLSAqIHdyaXRlIHRoZW0gYmFjayB0byBkaXNrCisgKiBTeW5jIG91ciBpbnRlcm5hbCBjb3B5IG9mIGZzX2NzdG90YWwgd2l0aCBkaXNrCiAgKi8KLXN0YXRpYyB2b2lkIHVmc19wdXRfY3lsaW5kZXJfc3RydWN0dXJlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIHVmc19wdXRfY3N0b3RhbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCXN0cnVjdCB1ZnNfc2JfaW5mbyAqIHNiaSA9IFVGU19TQihzYik7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXVuc2lnbmVkIG10eXBlID0gVUZTX1NCKHNiKS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICp1c2IyOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjM7CisKKwlVRlNEKCJFTlRFUlxuIik7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOworCXVzYjIgPSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOworCisJaWYgKChtdHlwZSA9PSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRCAmJgorCSAgICAgKHVzYjEtPmZzX2ZsYWdzICYgVUZTX0ZMQUdTX1VQREFURUQpKSB8fAorCSAgICBtdHlwZSA9PSBVRlNfTU9VTlRfVUZTVFlQRV9VRlMyKSB7CisJCS8qd2UgaGF2ZSBzdGF0aXN0aWMgaW4gZGlmZmVyZW50IHBsYWNlLCB0aGVuIHVzdWFsKi8KKwkJdXNiMi0+ZnNfdW4uZnNfdTIuY3NfbmRpciA9CisJCQljcHVfdG9fZnM2NChzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmRpcik7CisJCXVzYjItPmZzX3VuLmZzX3UyLmNzX25iZnJlZSA9CisJCQljcHVfdG9fZnM2NChzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlKTsKKwkJdXNiMy0+ZnNfdW4xLmZzX3UyLmNzX25pZnJlZSA9CisJCQljcHVfdG9fZnM2NChzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmlmcmVlKTsKKwkJdXNiMy0+ZnNfdW4xLmZzX3UyLmNzX25mZnJlZSA9CisJCQljcHVfdG9fZnM2NChzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlKTsKKwl9IGVsc2UgeworCQl1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIgPQorCQkJY3B1X3RvX2ZzMzIoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25kaXIpOworCQl1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSA9CisJCQljcHVfdG9fZnMzMihzYiwgdXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlKTsKKwkJdXNiMS0+ZnNfY3N0b3RhbC5jc19uaWZyZWUgPQorCQkJY3B1X3RvX2ZzMzIoc2IsIHVzcGktPmNzX3RvdGFsLmNzX25pZnJlZSk7CisJCXVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlID0KKwkJCWNwdV90b19mczMyKHNiLCB1c3BpLT5jc190b3RhbC5jc19uZmZyZWUpOworCX0KKwl1YmhfbWFya19idWZmZXJfZGlydHkoVVNQSV9VQkgodXNwaSkpOworCVVGU0QoIkVYSVRcbiIpOworfQorCisvKioKKyAqIHVmc19wdXRfc3VwZXJfaW50ZXJuYWwoKSAtIHB1dCBvbi1kaXNrIGludHJlbmFsIHN0cnVjdHVyZXMKKyAqIEBzYjogcG9pbnRlciB0byBzdXBlcl9ibG9jayBzdHJ1Y3R1cmUKKyAqIFB1dCBvbi1kaXNrIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGN5bGluZGVyIGdyb3VwcworICogYW5kIHdyaXRlIHRoZW0gYmFjayB0byBkaXNrLCBhbHNvIHVwZGF0ZSBjc190b3RhbCBvbiBkaXNrCisgKi8KK3N0YXRpYyB2b2lkIHVmc19wdXRfc3VwZXJfaW50ZXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKnNiaSA9IFVGU19TQihzYik7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnVzcGkgPSBzYmktPnNfdXNwaTsKIAlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoOwogCXVuc2lnbmVkIGNoYXIgKiBiYXNlLCAqIHNwYWNlOwogCXVuc2lnbmVkIGJsa3MsIHNpemUsIGk7Ci0JCi0JVUZTRCgoIkVOVEVSXG4iKSkKLQkKLQl1c3BpID0gc2JpLT5zX3VzcGk7CiAKKwkKKwlVRlNEKCJFTlRFUlxuIik7CisJdWZzX3B1dF9jc3RvdGFsKHNiKTsKIAlzaXplID0gdXNwaS0+c19jc3NpemU7CiAJYmxrcyA9IChzaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OwogCWJhc2UgPSBzcGFjZSA9IChjaGFyKikgc2JpLT5zX2NzcDsKQEAgLTUyMyw3ICs1OTAsNyBAQAogCQlicmVsc2UgKHNiaS0+c191Y2dbaV0pOwogCWtmcmVlIChzYmktPnNfdWNnKTsKIAlrZnJlZSAoYmFzZSk7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogfQogCiBzdGF0aWMgaW50IHVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCkBAIC01MzMsNyArNjAwLDYgQEAKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqIHVzYjI7CiAJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjM7Ci0Jc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiOwogCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1Ymg7CQogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJdW5zaWduZWQgYmxvY2tfc2l6ZSwgc3VwZXJfYmxvY2tfc2l6ZTsKQEAgLTU0NCw3ICs2MTAsNyBAQAogCXViaCA9IE5VTEw7CiAJZmxhZ3MgPSAwOwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCQkKIAlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNiaSkKQEAgLTU1Miw3ICs2MTgsNyBAQAogCXNiLT5zX2ZzX2luZm8gPSBzYmk7CiAJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfaW5mbykpOwogCi0JVUZTRCgoImZsYWcgJXVcbiIsIChpbnQpKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkpCisJVUZTRCgiZmxhZyAldVxuIiwgKGludCkoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKTsKIAkKICNpZm5kZWYgQ09ORklHX1VGU19GU19XUklURQogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgewpAQCAtNTkzLDcgKzY1OSw3IEBACiAJICAgdGhlIHJ1bGVzICovCiAJc3dpdGNoIChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpIHsKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFXzQ0QlNEOgotCQlVRlNEKCgidWZzdHlwZT00NGJzZFxuIikpCisJCVVGU0QoInVmc3R5cGU9NDRic2RcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDUxMjsKIAkJdXNwaS0+c19mbWFzayA9IH4oNTEyIC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gOTsKQEAgLTYwMiw3ICs2NjgsNyBAQAogCQlmbGFncyB8PSBVRlNfREVfNDRCU0QgfCBVRlNfVUlEXzQ0QlNEIHwgVUZTX1NUXzQ0QlNEIHwgVUZTX0NHXzQ0QlNEOwogCQlicmVhazsKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1VGUzI6Ci0JCVVGU0QoKCJ1ZnN0eXBlPXVmczJcbiIpKTsKKwkJVUZTRCgidWZzdHlwZT11ZnMyXG4iKTsKIAkJc3VwZXJfYmxvY2tfb2Zmc2V0PVNCTE9DS19VRlMyOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDUxMjsKIAkJdXNwaS0+c19mbWFzayA9IH4oNTEyIC0gMSk7CkBAIC02MTcsNyArNjgzLDcgQEAKIAkJYnJlYWs7CiAJCQogCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfU1VOOgotCQlVRlNEKCgidWZzdHlwZT1zdW5cbiIpKQorCQlVRlNEKCJ1ZnN0eXBlPXN1blxuIik7CiAJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKIAkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOwogCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOwpAQCAtNjI4LDcgKzY5NCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9TVU54ODY6Ci0JCVVGU0QoKCJ1ZnN0eXBlPXN1bng4NlxuIikpCisJCVVGU0QoInVmc3R5cGU9c3VueDg2XG4iKTsKIAkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OwogCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CiAJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CkBAIC02MzksNyArNzA1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX09MRDoKLQkJVUZTRCgoInVmc3R5cGU9b2xkXG4iKSkKKwkJVUZTRCgidWZzdHlwZT1vbGRcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMDsKQEAgLTY1NCw3ICs3MjAsNyBAQAogCQlicmVhazsKIAkKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX05FWFRTVEVQOgotCQlVRlNEKCgidWZzdHlwZT1uZXh0c3RlcFxuIikpCisJCVVGU0QoInVmc3R5cGU9bmV4dHN0ZXBcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMDsKQEAgLTY2OSw3ICs3MzUsNyBAQAogCQlicmVhazsKIAkKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX05FWFRTVEVQX0NEOgotCQlVRlNEKCgidWZzdHlwZT1uZXh0c3RlcC1jZFxuIikpCisJCVVGU0QoInVmc3R5cGU9bmV4dHN0ZXAtY2RcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDIwNDg7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDIwNDggLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMTsKQEAgLTY4NCw3ICs3NTAsNyBAQAogCQlicmVhazsKIAkKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX09QRU5TVEVQOgotCQlVRlNEKCgidWZzdHlwZT1vcGVuc3RlcFxuIikpCisJCVVGU0QoInVmc3R5cGU9b3BlbnN0ZXBcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMDsKQEAgLTY5OSw3ICs3NjUsNyBAQAogCQlicmVhazsKIAkKIAljYXNlIFVGU19NT1VOVF9VRlNUWVBFX0hQOgotCQlVRlNEKCgidWZzdHlwZT1ocFxuIikpCisJCVVGU0QoInVmc3R5cGU9aHBcbiIpOwogCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CiAJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKIAkJdXNwaS0+c19mc2hpZnQgPSAxMDsKQEAgLTczNyw4ICs4MDMsNiBAQAogCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdCh1c3BpKTsKIAl1c2IyID0gdWJoX2dldF91c2Jfc2Vjb25kKHVzcGkpOwogCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZCh1c3BpKTsKLQl1c2IgID0gKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikKLQkJKChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopdXNwaSktPmJoWzBdLT5iX2RhdGEgOwogCiAJLyoKIAkgKiBDaGVjayB1ZnMgbWFnaWMgbnVtYmVyCkBAIC04MjAsMTYgKzg4NCwxMiBAQAogCQl1YmggPSBOVUxMOwogCQlibG9ja19zaXplID0gdXNwaS0+c19mc2l6ZTsKIAkJc3VwZXJfYmxvY2tfc2l6ZSA9IHVzcGktPnNfc2JzaXplOwotCQlVRlNEKCgiYW5vdGhlciB2YWx1ZSBvZiBibG9ja19zaXplIG9yIHN1cGVyX2Jsb2NrX3NpemUgJXUsICV1XG4iLCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKSkKKwkJVUZTRCgiYW5vdGhlciB2YWx1ZSBvZiBibG9ja19zaXplIG9yIHN1cGVyX2Jsb2NrX3NpemUgJXUsICV1XG4iLCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKIAkJZ290byBhZ2FpbjsKIAl9CiAKLSNpZmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQotICAgICAgICBpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKLQkJdWZzMl9wcmludF9zdXBlcl9zdHVmZihzYix1c2IpOwotICAgICAgICBlbHNlCi0JCXVmc19wcmludF9zdXBlcl9zdHVmZihzYiwgdXNiMSwgdXNiMiwgdXNiMyk7Ci0jZW5kaWYKKworCXVmc19wcmludF9zdXBlcl9zdHVmZihzYiwgZmxhZ3MsIHVzYjEsIHVzYjIsIHVzYjMpOwogCiAJLyoKIAkgKiBDaGVjaywgaWYgZmlsZSBzeXN0ZW0gd2FzIGNvcnJlY3RseSB1bm1vdW50ZWQuCkBAIC04NDIsMTMgKzkwMiwxMyBAQAogCSAgKHVmc19nZXRfZnNfc3RhdGUoc2IsIHVzYjEsIHVzYjMpID09IChVRlNfRlNPSyAtIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc190aW1lKSkpKSkgewogCQlzd2l0Y2godXNiMS0+ZnNfY2xlYW4pIHsKIAkJY2FzZSBVRlNfRlNDTEVBTjoKLQkJCVVGU0QoKCJmcyBpcyBjbGVhblxuIikpCisJCQlVRlNEKCJmcyBpcyBjbGVhblxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBVRlNfRlNTVEFCTEU6Ci0JCQlVRlNEKCgiZnMgaXMgc3RhYmxlXG4iKSkKKwkJCVVGU0QoImZzIGlzIHN0YWJsZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSBVRlNfRlNPU0YxOgotCQkJVUZTRCgoImZzIGlzIERFQyBPU0YvMVxuIikpCisJCQlVRlNEKCJmcyBpcyBERUMgT1NGLzFcbiIpOwogCQkJYnJlYWs7CiAJCWNhc2UgVUZTX0ZTQUNUSVZFOgogCQkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogZnMgaXMgYWN0aXZlXG4iKTsKQEAgLTg2Myw4ICs5MjMsNyBAQAogCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOwogCQkJYnJlYWs7CiAJCX0KLQl9Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogZnMgbmVlZHMgZnNja1xuIik7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKIAl9CkBAIC04ODQsMTAgKzk0Myw5IEBACiAJdXNwaS0+c19jZ21hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dtYXNrKTsKIAogCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7Ci0JCXVzcGktPnNfdTJfc2l6ZSAgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfc2l6ZSk7Ci0JCXVzcGktPnNfdTJfZHNpemUgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpOwotCX0KLQllbHNlIHsKKwkJdXNwaS0+c191Ml9zaXplICA9IGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuZnNfc2l6ZSk7CisJCXVzcGktPnNfdTJfZHNpemUgPSBmczY0X3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4xLmZzX3UyLmZzX2RzaXplKTsKKwl9IGVsc2UgewogCQl1c3BpLT5zX3NpemUgID0gIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zaXplKTsKIAkJdXNwaS0+c19kc2l6ZSA9ICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZHNpemUpOwogCX0KQEAgLTkwMSw4ICs5NTksOCBAQAogCXVzcGktPnNfZm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spOwogCXVzcGktPnNfYnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaGlmdCk7CiAJdXNwaS0+c19mc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KTsKLQlVRlNEKCgidXNwaS0+c19ic2hpZnQgPSAlZCx1c3BpLT5zX2ZzaGlmdCA9ICVkIiwgdXNwaS0+c19ic2hpZnQsCi0JCXVzcGktPnNfZnNoaWZ0KSk7CisJVUZTRCgidXNwaS0+c19ic2hpZnQgPSAlZCx1c3BpLT5zX2ZzaGlmdCA9ICVkIiwgdXNwaS0+c19ic2hpZnQsCisJCXVzcGktPnNfZnNoaWZ0KTsKIAl1c3BpLT5zX2ZwYnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZyYWdzaGlmdCk7CiAJdXNwaS0+c19mc2J0b2RiID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZzYnRvZGIpOwogCS8qIHNfc2JzaXplIGFscmVhZHkgc2V0ICovCkBAIC05MjIsOCArOTgwLDggQEAKIAl1c3BpLT5zX3NwYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zcGMpOwogCXVzcGktPnNfaXBnID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2lwZyk7CiAJdXNwaS0+c19mcGcgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnBnKTsKLQl1c3BpLT5zX2NwYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IyLT5mc19jcGMpOwotCXVzcGktPnNfY29udGlnc3Vtc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc180NC5mc19jb250aWdzdW1zaXplKTsKKwl1c3BpLT5zX2NwYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IyLT5mc191bi5mc191MS5mc19jcGMpOworCXVzcGktPnNfY29udGlnc3Vtc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191bjIuZnNfNDQuZnNfY29udGlnc3Vtc2l6ZSk7CiAJdXNwaS0+c19xYm1hc2sgPSB1ZnNfZ2V0X2ZzX3FibWFzayhzYiwgdXNiMyk7CiAJdXNwaS0+c19xZm1hc2sgPSB1ZnNfZ2V0X2ZzX3FmbWFzayhzYiwgdXNiMyk7CiAJdXNwaS0+c19wb3N0Ymxmb3JtYXQgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfcG9zdGJsZm9ybWF0KTsKQEAgLTkzNSwxMiArOTkzLDExIEBACiAJICogQ29tcHV0ZSBhbm90aGVyIGZyZXF1ZW50bHkgdXNlZCB2YWx1ZXMKIAkgKi8KIAl1c3BpLT5zX2ZwYm1hc2sgPSB1c3BpLT5zX2ZwYiAtIDE7Ci0JaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIHsKKwlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKIAkJdXNwaS0+c19hcGJzaGlmdCA9IHVzcGktPnNfYnNoaWZ0IC0gMzsKLQl9Ci0JZWxzZSB7CisJZWxzZQogCQl1c3BpLT5zX2FwYnNoaWZ0ID0gdXNwaS0+c19ic2hpZnQgLSAyOwotCX0KKwogCXVzcGktPnNfMmFwYnNoaWZ0ID0gdXNwaS0+c19hcGJzaGlmdCAqIDI7CiAJdXNwaS0+c18zYXBic2hpZnQgPSB1c3BpLT5zX2FwYnNoaWZ0ICogMzsKIAl1c3BpLT5zX2FwYiA9IDEgPDwgdXNwaS0+c19hcGJzaGlmdDsKQEAgLTk1Niw3ICsxMDEzLDcgQEAKIAlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgPT0KIAkgICAgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0QpCiAJCXVzcGktPnNfbWF4c3ltbGlua2xlbiA9Ci0JCSAgICBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfbWF4c3ltbGlua2xlbik7CisJCSAgICBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX21heHN5bWxpbmtsZW4pOwogCQogCXNiaS0+c19mbGFncyA9IGZsYWdzOwogCkBAIC05NjcsNyArMTAyNCw3IEBACiAJaWYgKCFzYi0+c19yb290KQogCQlnb3RvIGRhbGxvY19mYWlsZWQ7CiAKLQorCXVmc19zZXR1cF9jc3RvdGFsKHNiKTsKIAkvKgogCSAqIFJlYWQgY3lsaW5kZXIgZ3JvdXAgc3RydWN0dXJlcwogCSAqLwpAQCAtOTc1LDcgKzEwMzIsNyBAQAogCQlpZiAoIXVmc19yZWFkX2N5bGluZGVyX3N0cnVjdHVyZXMoc2IpKQogCQkJZ290byBmYWlsZWQ7CiAKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIDA7CiAKIGRhbGxvY19mYWlsZWQ6CkBAIC05ODYsMTUgKzEwNDMsMTYgQEAKIAlrZnJlZSAodXNwaSk7CiAJa2ZyZWUoc2JpKTsKIAlzYi0+c19mc19pbmZvID0gTlVMTDsKLQlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJVUZTRCgiRVhJVCAoRkFJTEVEKVxuIik7CiAJcmV0dXJuIC1FSU5WQUw7CiAKIGZhaWxlZF9ub21lbToKLQlVRlNEKCgiRVhJVCAoTk9NRU0pXG4iKSkKKwlVRlNEKCJFWElUIChOT01FTSlcbiIpOwogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgdm9pZCB1ZnNfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpIHsKK3N0YXRpYyB2b2lkIHVmc193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorewogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKIAlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICogdXNiMzsKQEAgLTEwMDIsNyArMTA2MCw3IEBACiAKIAlsb2NrX2tlcm5lbCgpOwogCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlVRlNEKCJFTlRFUlxuIik7CiAJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CiAJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOwpAQCAtMTAxNCwyNiArMTA3MiwyNyBAQAogCQkgIHx8IChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KQogCQkJdWZzX3NldF9mc19zdGF0ZShzYiwgdXNiMSwgdXNiMywKIAkJCQkJVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpOwotCQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwkJdWZzX3B1dF9jc3RvdGFsKHNiKTsKIAl9CiAJc2ItPnNfZGlydCA9IDA7Ci0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCXVubG9ja19rZXJuZWwoKTsKIH0KIAotc3RhdGljIHZvaWQgdWZzX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3N0YXRpYyB2b2lkIHVmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmkgPSBVRlNfU0Ioc2IpOwogCQkKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAogCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKLQkJdWZzX3B1dF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzYik7CisJCXVmc19wdXRfc3VwZXJfaW50ZXJuYWwoc2IpOwogCQogCXViaF9icmVsc2VfdXNwaSAoc2JpLT5zX3VzcGkpOwogCWtmcmVlIChzYmktPnNfdXNwaSk7CiAJa2ZyZWUgKHNiaSk7CiAJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuOwogfQogCkBAIC0xMDYyLDggKzExMjEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoIShuZXdfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpKSB7CiAJCW5ld19tb3VudF9vcHQgfD0gdWZzdHlwZTsKLQl9Ci0JZWxzZSBpZiAoKG5ld19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgIT0gdWZzdHlwZSkgeworCX0gZWxzZSBpZiAoKG5ld19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgIT0gdWZzdHlwZSkgewogCQlwcmludGsoInVmc3R5cGUgY2FuJ3QgYmUgY2hhbmdlZCBkdXJpbmcgcmVtb3VudFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNzcsMjAgKzExMzUsMTkgQEAKIAkgKiBmcyB3YXMgbW91dGVkIGFzIHJ3LCByZW1vdW50aW5nIHJvCiAJICovCiAJaWYgKCptb3VudF9mbGFncyAmIE1TX1JET05MWSkgewotCQl1ZnNfcHV0X2N5bGluZGVyX3N0cnVjdHVyZXMoc2IpOworCQl1ZnNfcHV0X3N1cGVyX2ludGVybmFsKHNiKTsKIAkJdXNiMS0+ZnNfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKIAkJaWYgKChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOCiAJCSAgfHwgKGZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpIAogCQkJdWZzX3NldF9mc19zdGF0ZShzYiwgdXNiMSwgdXNiMywKIAkJCQlVRlNfRlNPSyAtIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc190aW1lKSk7Ci0JCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKHVzcGkpKTsKIAkJc2ItPnNfZGlydCA9IDA7CiAJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKLQl9CisJfSBlbHNlIHsKIAkvKgogCSAqIGZzIHdhcyBtb3VudGVkIGFzIHJvLCByZW1vdW50aW5nIHJ3CiAJICovCi0JZWxzZSB7CiAjaWZuZGVmIENPTkZJR19VRlNfRlNfV1JJVEUKIAkJcHJpbnRrKCJ1ZnMgd2FzIGNvbXBpbGVkIHdpdGggcmVhZC1vbmx5IHN1cHBvcnQsICIKIAkJImNhbid0IGJlIG1vdW50ZWQgYXMgcmVhZC13cml0ZVxuIik7CkBAIC0xMTAyLDcgKzExNTksNyBAQAogCQkJcHJpbnRrKCJ0aGlzIHVmc3R5cGUgaXMgcmVhZC1vbmx5IHN1cHBvcnRlZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoIXVmc19yZWFkX2N5bGluZGVyX3N0cnVjdHVyZXMgKHNiKSkgeworCQlpZiAoIXVmc19yZWFkX2N5bGluZGVyX3N0cnVjdHVyZXMoc2IpKSB7CiAJCQlwcmludGsoImZhaWxlZCBkdXJpbmcgcmVtb3VudGluZ1xuIik7CiAJCQlyZXR1cm4gLUVQRVJNOwogCQl9CkBAIC0xMTEzLDM2ICsxMTcwLDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdWZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3N0YXRpYyBpbnQgdWZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7Ci0Jc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOwotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOwotCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKiB1c2I7Ci0JdW5zaWduZWQgIGZsYWdzID0gMDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGVudHJ5LT5kX3NiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdW5zaWduZWQgIGZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICp1c2IyOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjM7CiAKIAlsb2NrX2tlcm5lbCgpOwogCi0JdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKLQl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKHVzcGkpOwotCXVzYiAgPSAoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKQotCQkoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKS0+YmhbMF0tPmJfZGF0YSA7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KHVzcGkpOworCXVzYjIgPSB1YmhfZ2V0X3VzYl9zZWNvbmQodXNwaSk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKHVzcGkpOwogCQotCWZsYWdzID0gVUZTX1NCKHNiKS0+c19mbGFnczsKIAlpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikgewogCQlidWYtPmZfdHlwZSA9IFVGUzJfTUFHSUM7Ci0JCWJ1Zi0+Zl9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpOwotCQlidWYtPmZfYmZyZWUgPSB1ZnNfYmxrc3RvZnJhZ3MoZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmJmcmVlKSkgKwotCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmZmcmVlKTsKLQkJYnVmLT5mX2ZmcmVlID0gZnM2NF90b19jcHUoc2IsCi0gICAgICAgIAkJdXNiLT5mc191MTEuZnNfdTIuZnNfY3N0b3RhbC5jc19uaWZyZWUpOwotCX0KLQllbHNlIHsKKwkJYnVmLT5mX2Jsb2NrcyA9IGZzNjRfdG9fY3B1KHNiLCB1c2IzLT5mc191bjEuZnNfdTIuZnNfZHNpemUpOworCX0gZWxzZSB7CiAJCWJ1Zi0+Zl90eXBlID0gVUZTX01BR0lDOwogCQlidWYtPmZfYmxvY2tzID0gdXNwaS0+c19kc2l6ZTsKLQkJYnVmLT5mX2JmcmVlID0gdWZzX2Jsa3N0b2ZyYWdzKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSkpICsKLQkJCWZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSk7Ci0JCWJ1Zi0+Zl9mZnJlZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSk7CiAJfQorCWJ1Zi0+Zl9iZnJlZSA9IHVmc19ibGtzdG9mcmFncyh1c3BpLT5jc190b3RhbC5jc19uYmZyZWUpICsKKwkJdXNwaS0+Y3NfdG90YWwuY3NfbmZmcmVlOworCWJ1Zi0+Zl9mZnJlZSA9IHVzcGktPmNzX3RvdGFsLmNzX25pZnJlZTsKIAlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CiAJYnVmLT5mX2JhdmFpbCA9IChidWYtPmZfYmZyZWUgPiAoKChsb25nKWJ1Zi0+Zl9ibG9ja3MgLyAxMDApICogdXNwaS0+c19taW5mcmVlKSkKIAkJPyAoYnVmLT5mX2JmcmVlIC0gKCgobG9uZylidWYtPmZfYmxvY2tzIC8gMTAwKSAqIHVzcGktPnNfbWluZnJlZSkpIDogMDsKQEAgLTEzMTEsMTAgKzEzNjMsMTAgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB1ZnNfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgdWZzX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB1ZnNfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3Vmcy90cnVuY2F0ZS5jIGIvZnMvdWZzL3RydW5jYXRlLmMKaW5kZXggMDJlODYyOS4uM2MzYjMwMSAxMDA2NDQKLS0tIGEvZnMvdWZzL3RydW5jYXRlLmMKKysrIGIvZnMvdWZzL3RydW5jYXRlLmMKQEAgLTQ5LDE0ICs0OSw2IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19UUlVOQ0FURV9ERUJVRwotCi0jaWZkZWYgVUZTX1RSVU5DQVRFX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLSAKIC8qCiAgKiBTZWN1cmUgZGVsZXRpb24gY3VycmVudGx5IGRvZXNuJ3Qgd29yay4gSXQgaW50ZXJhY3RzIHZlcnkgYmFkbHkKICAqIHdpdGggYnVmZmVycyBzaGFyZWQgd2l0aCBtZW1vcnkgbWFwcGluZ3MsIGFuZCBmb3IgdGhhdCByZWFzb24KQEAgLTgyLDcgKzc0LDcgQEAKIAl1bnNpZ25lZCBpLCB0bXA7CiAJaW50IHJldHJ5OwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMTA1LDcgKzk3LDcgQEAKIAkJYmxvY2syID0gdWZzX2ZyYWdzdG9ibGtzIChmcmFnMyk7CiAJfQogCi0JVUZTRCgoImZyYWcxICV1LCBmcmFnMiAldSwgYmxvY2sxICV1LCBibG9jazIgJXUsIGZyYWczICV1LCBmcmFnNCAldVxuIiwgZnJhZzEsIGZyYWcyLCBibG9jazEsIGJsb2NrMiwgZnJhZzMsIGZyYWc0KSkKKwlVRlNEKCJmcmFnMSAldSwgZnJhZzIgJXUsIGJsb2NrMSAldSwgYmxvY2syICV1LCBmcmFnMyAldSwgZnJhZzQgJXVcbiIsIGZyYWcxLCBmcmFnMiwgYmxvY2sxLCBibG9jazIsIGZyYWczLCBmcmFnNCk7CiAKIAlpZiAoZnJhZzEgPj0gZnJhZzIpCiAJCWdvdG8gbmV4dDE7CQkKQEAgLTEyMCw5ICsxMTIsOCBAQAogCWZyYWcxID0gdWZzX2ZyYWdudW0gKGZyYWcxKTsKIAlmcmFnMiA9IHVmc19mcmFnbnVtIChmcmFnMik7CiAKLQlpbm9kZS0+aV9ibG9ja3MgLT0gKGZyYWcyLWZyYWcxKSA8PCB1c3BpLT5zX25zcGZzaGlmdDsKLQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAgKyBmcmFnMSwgZnJhZzIgLSBmcmFnMSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJZnJhZ190b19mcmVlID0gdG1wICsgZnJhZzE7CiAKIG5leHQxOgpAQCAtMTM2LDggKzEyNyw3IEBACiAJCQljb250aW51ZTsKIAogCQkqcCA9IDA7Ci0JCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7Ci0JCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCiAJCWlmIChmcmVlX2NvdW50ID09IDApIHsKIAkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKIAkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKQEAgLTE0OCw2ICsxMzgsNyBAQAogCQkJZnJhZ190b19mcmVlID0gdG1wOwogCQkJZnJlZV9jb3VudCA9IHVzcGktPnNfZnBiOwogCQl9CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCX0KIAkKIAlpZiAoZnJlZV9jb3VudCA+IDApCkBAIC0xNjYsMTIgKzE1NywxMiBAQAogCWZyYWc0ID0gdWZzX2ZyYWdudW0gKGZyYWc0KTsKIAogCSpwID0gMDsKLQlpbm9kZS0+aV9ibG9ja3MgLT0gZnJhZzQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7Ci0JbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKIAl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAsIGZyYWc0KTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKICBuZXh0MzoKIAotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAlyZXR1cm4gcmV0cnk7CiB9CiAKQEAgLTE4Niw3ICsxNzcsNyBAQAogCXVuc2lnbmVkIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudDsKIAlpbnQgcmV0cnk7CiAKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkJCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMjI3LDcgKzIxOCw3IEBACiAJCQlmcmFnX3RvX2ZyZWUgPSB0bXA7CiAJCQlmcmVlX2NvdW50ID0gdXNwaS0+c19mcGI7CiAJCX0KLQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKKwogCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKIAl9CiAKQEAgLTIzOCwyNiArMjI5LDIxIEBACiAJCWlmICgqdWJoX2dldF9hZGRyMzIoaW5kX3ViaCxpKSkKIAkJCWJyZWFrOwogCWlmIChpID49IHVzcGktPnNfYXBiKSB7Ci0JCWlmICh1YmhfbWF4X2Jjb3VudChpbmRfdWJoKSAhPSAxKSB7Ci0JCQlyZXRyeSA9IDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwotCQkJKnAgPSAwOwotCQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKLQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7Ci0JCQl1YmhfYmZvcmdldChpbmRfdWJoKTsKLQkJCWluZF91YmggPSBOVUxMOwotCQl9CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCSpwID0gMDsKKworCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXViaF9iZm9yZ2V0KGluZF91YmgpOworCQlpbmRfdWJoID0gTlVMTDsKIAl9CiAJaWYgKElTX1NZTkMoaW5vZGUpICYmIGluZF91YmggJiYgdWJoX2J1ZmZlcl9kaXJ0eShpbmRfdWJoKSkgewotCQl1YmhfbGxfcndfYmxvY2sgKFNXUklURSwgMSwgJmluZF91YmgpOworCQl1YmhfbGxfcndfYmxvY2soU1dSSVRFLCBpbmRfdWJoKTsKIAkJdWJoX3dhaXRfb25fYnVmZmVyIChpbmRfdWJoKTsKIAl9CiAJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CiAJCi0JVUZTRCgoIkVYSVRcbiIpKQorCVVGU0QoIkVYSVRcbiIpOwogCQogCXJldHVybiByZXRyeTsKIH0KQEAgLTI3MSw3ICsyNTcsNyBAQAogCV9fZnMzMiAqIGRpbmQ7CiAJaW50IHJldHJ5ID0gMDsKIAkKLQlVRlNEKCgiRU5URVJcbiIpKQorCVVGU0QoIkVOVEVSXG4iKTsKIAkKIAlzYiA9IGlub2RlLT5pX3NiOwogCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CkBAIC0zMDYsMjUgKzI5MiwyMSBAQAogCQlpZiAoKnViaF9nZXRfYWRkcjMyIChkaW5kX2JoLCBpKSkKIAkJCWJyZWFrOwogCWlmIChpID49IHVzcGktPnNfYXBiKSB7Ci0JCWlmICh1YmhfbWF4X2Jjb3VudChkaW5kX2JoKSAhPSAxKQotCQkJcmV0cnkgPSAxOwotCQllbHNlIHsKLQkJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7Ci0JCQkqcCA9IDA7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOwotCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Ci0JCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKLQkJCXViaF9iZm9yZ2V0KGRpbmRfYmgpOwotCQkJZGluZF9iaCA9IE5VTEw7Ci0JCX0KKwkJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwkJKnAgPSAwOworCisJCXVmc19mcmVlX2Jsb2Nrcyhpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl1YmhfYmZvcmdldChkaW5kX2JoKTsKKwkJZGluZF9iaCA9IE5VTEw7CiAJfQogCWlmIChJU19TWU5DKGlub2RlKSAmJiBkaW5kX2JoICYmIHViaF9idWZmZXJfZGlydHkoZGluZF9iaCkpIHsKLQkJdWJoX2xsX3J3X2Jsb2NrIChTV1JJVEUsIDEsICZkaW5kX2JoKTsKKwkJdWJoX2xsX3J3X2Jsb2NrKFNXUklURSwgZGluZF9iaCk7CiAJCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7CiAJfQogCXViaF9icmVsc2UgKGRpbmRfYmgpOwogCQotCVVGU0QoKCJFWElUXG4iKSkKKwlVRlNEKCJFWElUXG4iKTsKIAkKIAlyZXR1cm4gcmV0cnk7CiB9CkBAIC0zMzksNyArMzIxLDcgQEAKIAlfX2ZzMzIgKiB0aW5kLCAqIHA7CiAJaW50IHJldHJ5OwogCQotCVVGU0QoKCJFTlRFUlxuIikpCisJVUZTRCgiRU5URVJcbiIpOwogCiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwpAQCAtMzcwLDI1ICszNTIsMjEgQEAKIAkJaWYgKCp1YmhfZ2V0X2FkZHIzMiAodGluZF9iaCwgaSkpCiAJCQlicmVhazsKIAlpZiAoaSA+PSB1c3BpLT5zX2FwYikgewotCQlpZiAodWJoX21heF9iY291bnQodGluZF9iaCkgIT0gMSkKLQkJCXJldHJ5ID0gMTsKLQkJZWxzZSB7Ci0JCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOwotCQkJKnAgPSAwOwotCQkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKLQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwotCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgdG1wLCB1c3BpLT5zX2ZwYik7Ci0JCQl1YmhfYmZvcmdldCh0aW5kX2JoKTsKLQkJCXRpbmRfYmggPSBOVUxMOwotCQl9CisJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCSpwID0gMDsKKworCQl1ZnNfZnJlZV9ibG9ja3MoaW5vZGUsIHRtcCwgdXNwaS0+c19mcGIpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJdWJoX2Jmb3JnZXQodGluZF9iaCk7CisJCXRpbmRfYmggPSBOVUxMOwogCX0KIAlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgdGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KHRpbmRfYmgpKSB7Ci0JCXViaF9sbF9yd19ibG9jayAoU1dSSVRFLCAxLCAmdGluZF9iaCk7CisJCXViaF9sbF9yd19ibG9jayhTV1JJVEUsIHRpbmRfYmgpOwogCQl1Ymhfd2FpdF9vbl9idWZmZXIgKHRpbmRfYmgpOwogCX0KIAl1YmhfYnJlbHNlICh0aW5kX2JoKTsKIAkKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiAJcmV0dXJuIHJldHJ5OwogfQogCQkKQEAgLTM5OSw3ICszNzcsNyBAQAogCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKIAlpbnQgcmV0cnk7CiAJCi0JVUZTRCgoIkVOVEVSXG4iKSkKKwlVRlNEKCJFTlRFUlxuIik7CiAJc2IgPSBpbm9kZS0+aV9zYjsKIAl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOwogCkBAIC00MzAsNSArNDA4LDUgQEAKIAl1ZnNpLT5pX2xhc3RmcmFnID0gRElSRUNUX0ZSQUdNRU5UOwogCXVubG9ja19rZXJuZWwoKTsKIAltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKLQlVRlNEKCgiRVhJVFxuIikpCisJVUZTRCgiRVhJVFxuIik7CiB9CmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5jIGIvZnMvdWZzL3V0aWwuYwppbmRleCA1OWFjYzhmLi5hMmYxM2Y0IDEwMDY0NAotLS0gYS9mcy91ZnMvdXRpbC5jCisrKyBiL2ZzL3Vmcy91dGlsLmMKQEAgLTE0LDE1ICsxNCw2IEBACiAjaW5jbHVkZSAic3dhYi5oIgogI2luY2x1ZGUgInV0aWwuaCIKIAotI3VuZGVmIFVGU19VVElMU19ERUJVRwotCi0jaWZkZWYgVUZTX1VUSUxTX0RFQlVHCi0jZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7Ci0jZWxzZQotI2RlZmluZSBVRlNEKHgpCi0jZW5kaWYKLQotCiBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogX3ViaF9icmVhZF8gKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgZnJhZ21lbnQsIHU2NCBzaXplKQogewpAQCAtNjMsMTcgKzU0LDE3IEBACiAJY291bnQgPSBzaXplID4+IHVzcGktPnNfZnNoaWZ0OwogCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gVUZTX01BWEZSQUcpCiAJCXJldHVybiBOVUxMOwotCVVTUElfVUJILT5mcmFnbWVudCA9IGZyYWdtZW50OwotCVVTUElfVUJILT5jb3VudCA9IGNvdW50OworCVVTUElfVUJIKHVzcGkpLT5mcmFnbWVudCA9IGZyYWdtZW50OworCVVTUElfVUJIKHVzcGkpLT5jb3VudCA9IGNvdW50OwogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotCQlpZiAoIShVU1BJX1VCSC0+YmhbaV0gPSBzYl9icmVhZChzYiwgZnJhZ21lbnQgKyBpKSkpCisJCWlmICghKFVTUElfVUJIKHVzcGkpLT5iaFtpXSA9IHNiX2JyZWFkKHNiLCBmcmFnbWVudCArIGkpKSkKIAkJCWdvdG8gZmFpbGVkOwogCWZvciAoOyBpIDwgVUZTX01BWEZSQUc7IGkrKykKLQkJVVNQSV9VQkgtPmJoW2ldID0gTlVMTDsKLQlyZXR1cm4gVVNQSV9VQkg7CisJCVVTUElfVUJIKHVzcGkpLT5iaFtpXSA9IE5VTEw7CisJcmV0dXJuIFVTUElfVUJIKHVzcGkpOwogZmFpbGVkOgogCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0JCWJyZWxzZSAoVVNQSV9VQkgtPmJoW2pdKTsKKwkJYnJlbHNlIChVU1BJX1VCSCh1c3BpKS0+Ymhbal0pOwogCXJldHVybiBOVUxMOwogfQogCkBAIC05MCwxMSArODEsMTEgQEAKIHZvaWQgdWJoX2JyZWxzZV91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGkpCiB7CiAJdW5zaWduZWQgaTsKLQlpZiAoIVVTUElfVUJIKQorCWlmICghVVNQSV9VQkgodXNwaSkpCiAJCXJldHVybjsKLQlmb3IgKCBpID0gMDsgaSA8IFVTUElfVUJILT5jb3VudDsgaSsrICkgewotCQlicmVsc2UgKFVTUElfVUJILT5iaFtpXSk7Ci0JCVVTUElfVUJILT5iaFtpXSA9IE5VTEw7CisJZm9yICggaSA9IDA7IGkgPCBVU1BJX1VCSCh1c3BpKS0+Y291bnQ7IGkrKyApIHsKKwkJYnJlbHNlIChVU1BJX1VCSCh1c3BpKS0+YmhbaV0pOworCQlVU1BJX1VCSCh1c3BpKS0+YmhbaV0gPSBOVUxMOwogCX0KIH0KIApAQCAtMTIxLDEzICsxMTIsMTIgQEAKIAl9CiB9CiAKLXZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQgcncsIHVuc2lnbmVkIG5yLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoW10pCit2b2lkIHViaF9sbF9yd19ibG9jayhpbnQgcncsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKnViaCkKIHsKLQl1bnNpZ25lZCBpOwogCWlmICghdWJoKQogCQlyZXR1cm47Ci0JZm9yICggaSA9IDA7IGkgPCBucjsgaSsrICkKLQkJbGxfcndfYmxvY2sgKHJ3LCB1YmhbaV0tPmNvdW50LCB1YmhbaV0tPmJoKTsKKworCWxsX3J3X2Jsb2NrKHJ3LCB1YmgtPmNvdW50LCB1YmgtPmJoKTsKIH0KIAogdm9pZCB1Ymhfd2FpdF9vbl9idWZmZXIgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCkBAIC0xMzksMTggKzEyOSw2IEBACiAJCXdhaXRfb25fYnVmZmVyICh1YmgtPmJoW2ldKTsKIH0KIAotdW5zaWduZWQgdWJoX21heF9iY291bnQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCi17Ci0JdW5zaWduZWQgaTsKLQl1bnNpZ25lZCBtYXggPSAwOwotCWlmICghdWJoKQotCQlyZXR1cm4gMDsKLQlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApIAotCQlpZiAoIGF0b21pY19yZWFkKCZ1YmgtPmJoW2ldLT5iX2NvdW50KSA+IG1heCApCi0JCQltYXggPSBhdG9taWNfcmVhZCgmdWJoLT5iaFtpXS0+Yl9jb3VudCk7Ci0JcmV0dXJuIG1heDsKLX0KLQogdm9pZCB1YmhfYmZvcmdldCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKIHsKIAl1bnNpZ25lZCBpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3V0aWwuaCBiL2ZzL3Vmcy91dGlsLmgKaW5kZXggNDhkNmQ5Yi4uNDA2OTgxZiAxMDA2NDQKLS0tIGEvZnMvdWZzL3V0aWwuaAorKysgYi9mcy91ZnMvdXRpbC5oCkBAIC0xNywxMCArMTcsMTYgQEAKICNkZWZpbmUgaW5fcmFuZ2UoYixmaXJzdCxsZW4pCSgoYik+PShmaXJzdCkmJihiKTwoZmlyc3QpKyhsZW4pKQogCiAvKgotICogbWFjcm9zIHVzZWQgZm9yIHJldHlwaW5nCisgKiBmdW5jdGlvbnMgdXNlZCBmb3IgcmV0eXBpbmcKICAqLwotI2RlZmluZSBVQ1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1Y3BpKQotI2RlZmluZSBVU1BJX1VCSCAoKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKil1c3BpKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICpVQ1BJX1VCSChzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqY3BpKQoreworCXJldHVybiAmY3BpLT5jX3ViaDsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqVVNQSV9VQkgoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKnNwaSkKK3sKKwlyZXR1cm4gJnNwaS0+c191Ymg7Cit9CiAKIAogCkBAIC0zMywxMiArMzksMTIgQEAKIHsKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc19zdW4uZnNfc3RhdGUpOworCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3VuMi5mc19zdW4uZnNfc3RhdGUpOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKIAkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW54ODYuZnNfc3RhdGUpOwogCWNhc2UgVUZTX1NUXzQ0QlNEOgogCWRlZmF1bHQ6Ci0JCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfc3RhdGUpOworCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3VuMi5mc180NC5mc19zdGF0ZSk7CiAJfQogfQogCkBAIC00OCwxMyArNTQsMTMgQEAKIHsKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19zdGF0ZSA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKIAkJdXNiMS0+ZnNfdTEuZnNfc3VueDg2LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfNDRCU0Q6Ci0JCXVzYjMtPmZzX3UyLmZzXzQ0LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKIAkJYnJlYWs7CiAJfQogfQpAQCAtNjQsNyArNzAsNyBAQAogCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMpCiB7CiAJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpCi0JCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX25wc2VjdCk7CisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdW4yLmZzX3N1bng4Ni5mc19ucHNlY3QpOwogCWVsc2UKIAkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc191MS5mc19zdW4uZnNfbnBzZWN0KTsKIH0KQEAgLTc2LDE2ICs4MiwxNiBAQAogCiAJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKIAljYXNlIFVGU19TVF9TVU46Ci0JCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWJtYXNrWzBdOwotCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3FibWFza1sxXTsKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3VuMi5mc19zdW4uZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19xYm1hc2tbMV07CiAJCWJyZWFrOwogCWNhc2UgVUZTX1NUX1NVTng4NjoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xYm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW54ODYuZnNfcWJtYXNrWzFdOworCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bng4Ni5mc19xYm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfc3VueDg2LmZzX3FibWFza1sxXTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfNDRCU0Q6Ci0JCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xYm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xYm1hc2tbMV07CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191bjIuZnNfNDQuZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdW4yLmZzXzQ0LmZzX3FibWFza1sxXTsKIAkJYnJlYWs7CiAJfQogCkBAIC05OSwxNiArMTA1LDE2IEBACiAKIAlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgewogCWNhc2UgVUZTX1NUX1NVTjoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bi5mc19xZm1hc2tbMF07Ci0JCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWZtYXNrWzFdOworCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdW4yLmZzX3N1bi5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfc3VuLmZzX3FmbWFza1sxXTsKIAkJYnJlYWs7CiAJY2FzZSBVRlNfU1RfU1VOeDg2OgotCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX3FmbWFza1swXTsKLQkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xZm1hc2tbMV07CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191bjIuZnNfc3VueDg2LmZzX3FmbWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3VuMi5mc19zdW54ODYuZnNfcWZtYXNrWzFdOwogCQlicmVhazsKIAljYXNlIFVGU19TVF80NEJTRDoKLQkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FmbWFza1swXTsKLQkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzXzQ0LmZzX3FmbWFza1sxXTsKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3VuMi5mc180NC5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191bjIuZnNfNDQuZnNfcWZtYXNrWzFdOwogCQlicmVhazsKIAl9CiAKQEAgLTIzNiw5ICsyNDIsOCBAQAogZXh0ZXJuIHZvaWQgdWJoX2JyZWxzZV91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqKTsKIGV4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKIGV4dGVybiB2b2lkIHViaF9tYXJrX2J1ZmZlcl91cHRvZGF0ZSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqLCBpbnQpOwotZXh0ZXJuIHZvaWQgdWJoX2xsX3J3X2Jsb2NrIChpbnQsIHVuc2lnbmVkLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKTsKK2V4dGVybiB2b2lkIHViaF9sbF9yd19ibG9jayhpbnQsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiBleHRlcm4gdm9pZCB1Ymhfd2FpdF9vbl9idWZmZXIgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7Ci1leHRlcm4gdW5zaWduZWQgdWJoX21heF9iY291bnQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiBleHRlcm4gdm9pZCB1YmhfYmZvcmdldCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKTsKIGV4dGVybiBpbnQgIHViaF9idWZmZXJfZGlydHkgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CiAjZGVmaW5lIHViaF91YmhjcHltZW0obWVtLHViaCxzaXplKSBfdWJoX3ViaGNweW1lbV8odXNwaSxtZW0sdWJoLHNpemUpCkBAIC0yOTcsNDAgKzMwMiwyNiBAQAogI2RlZmluZSB1YmhfYmxrbWFwKHViaCxiZWdpbixiaXQpIFwKIAkoKCp1YmhfZ2V0X2FkZHIodWJoLCAoYmVnaW4pICsgKChiaXQpID4+IDMpKSA+PiAoKGJpdCkgJiA3KSkgJiAoMHhmZiA+PiAoVUZTX01BWEZSQUcgLSB1c3BpLT5zX2ZwYikpKQogCi0KLS8qCi0gKiBNYWNyb3MgZm9yIGFjY2VzcyB0byBzdXBlcmJsb2NrIGFycmF5IHN0cnVjdHVyZXMKLSAqLwotI2RlZmluZSB1YmhfcG9zdGJsKHViaCxjeWxubyxpKSBcCi0JKCh1c3BpLT5zX3Bvc3RibGZvcm1hdCAhPSBVRlNfRFlOQU1JQ1BPU1RCTEZNVCkgXAotCT8gKCooX19zMTYqKSh1YmhfZ2V0X2FkZHIodWJoLCBcCi0JKHVuc2lnbmVkKSgmKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopMCktPmZzX29wb3N0YmwpIFwKLQkrICgoKGN5bG5vKSAqIDE2ICsgKGkpKSA8PCAxKSApICkpIFwKLQk6ICgqKF9fczE2KikodWJoX2dldF9hZGRyKHViaCwgXAotCXVzcGktPnNfcG9zdGJsb2ZmICsgKCgoY3lsbm8pICogdXNwaS0+c19ucnBvcyArIChpKSkgPDwgMSkgKSkpKQotCi0jZGVmaW5lIHViaF9yb3RibCh1YmgsaSkgXAotCSgodXNwaS0+c19wb3N0Ymxmb3JtYXQgIT0gVUZTX0RZTkFNSUNQT1NUQkxGTVQpIFwKLQk/ICgqKF9fdTgqKSh1YmhfZ2V0X2FkZHIodWJoLCBcCi0JKHVuc2lnbmVkKSgmKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopMCktPmZzX3NwYWNlKSArIChpKSkpKSBcCi0JOiAoKihfX3U4KikodWJoX2dldF9hZGRyKHViaCwgdXNwaS0+c19yb3RibG9mZiArIChpKSkpKSkKLQogLyoKICAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBmcmFncyBnaXZlbiBhCiAgKiBwZXJjZW50YWdlIHRvIGhvbGQgaW4gcmVzZXJ2ZS4KICAqLwotI2RlZmluZSB1ZnNfZnJlZXNwYWNlKHVzYiwgcGVyY2VudHJlc2VydmVkKSBcCi0JKHVmc19ibGtzdG9mcmFncyhmczMyX3RvX2NwdShzYiwgKHVzYiktPmZzX2NzdG90YWwuY3NfbmJmcmVlKSkgKyBcCi0JZnMzMl90b19jcHUoc2IsICh1c2IpLT5mc19jc3RvdGFsLmNzX25mZnJlZSkgLSAodXNwaS0+c19kc2l6ZSAqIChwZXJjZW50cmVzZXJ2ZWQpIC8gMTAwKSkKK3N0YXRpYyBpbmxpbmUgdTY0Cit1ZnNfZnJlZXNwYWNlKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpLCBpbnQgcGVyY2VudHJlc2VydmVkKQoreworCXJldHVybiB1ZnNfYmxrc3RvZnJhZ3ModXNwaS0+Y3NfdG90YWwuY3NfbmJmcmVlKSArCisJCXVzcGktPmNzX3RvdGFsLmNzX25mZnJlZSAtCisJCSh1c3BpLT5zX2RzaXplICogKHBlcmNlbnRyZXNlcnZlZCkgLyAxMDApOworfQogCiAvKgogICogTWFjcm9zIHRvIGFjY2VzcyBjeWxpbmRlciBncm91cCBhcnJheSBzdHJ1Y3R1cmVzCiAgKi8KICNkZWZpbmUgdWJoX2NnX2Jsa3RvdCh1Y3BpLGN5bG5vKSBcCi0JKCooKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCAodWNwaSktPmNfYnRvdG9mZiArICgoY3lsbm8pIDw8IDIpKSkpCisJKCooKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCAodWNwaSktPmNfYnRvdG9mZiArICgoY3lsbm8pIDw8IDIpKSkpCiAKICNkZWZpbmUgdWJoX2NnX2Jsa3ModWNwaSxjeWxubyxycG9zKSBcCi0JKCooKF9fZnMxNiopdWJoX2dldF9hZGRyKFVDUElfVUJILCBcCisJKCooKF9fZnMxNiopdWJoX2dldF9hZGRyKFVDUElfVUJIKHVjcGkpLCBcCiAJKHVjcGkpLT5jX2JvZmYgKyAoKChjeWxubykgKiB1c3BpLT5zX25ycG9zICsgKHJwb3MpKSA8PCAxICkpKSkKIAogLyoKQEAgLTUwOCwyOSArNDk5LDMgQEAKIAlpZiAoZnJhZ3NpemUgPiAwICYmIGZyYWdzaXplIDwgdXNwaS0+c19mcGIpCiAJCWZzMzJfYWRkKHNiLCAmZnJhZ2xpc3RbZnJhZ3NpemVdLCBjbnQpOwogfQotCi0jZGVmaW5lIHViaF9zY2FuYyh1YmgsYmVnaW4sc2l6ZSx0YWJsZSxtYXNrKSBfdWJoX3NjYW5jXyh1c3BpLHViaCxiZWdpbixzaXplLHRhYmxlLG1hc2spCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIF91Ymhfc2NhbmNfKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwgCi0JdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNoYXIgKiB0YWJsZSwgdW5zaWduZWQgY2hhciBtYXNrKQotewotCXVuc2lnbmVkIHJlc3QsIG9mZnNldDsKLQl1bnNpZ25lZCBjaGFyICogY3A7Ci0JCi0KLQlvZmZzZXQgPSBiZWdpbiAmIH51c3BpLT5zX2ZtYXNrOwotCWJlZ2luID4+PSB1c3BpLT5zX2ZzaGlmdDsKLQlmb3IgKDs7KSB7Ci0JCWlmICgob2Zmc2V0ICsgc2l6ZSkgPCB1c3BpLT5zX2ZzaXplKQotCQkJcmVzdCA9IHNpemU7Ci0JCWVsc2UKLQkJCXJlc3QgPSB1c3BpLT5zX2ZzaXplIC0gb2Zmc2V0OwotCQlzaXplIC09IHJlc3Q7Ci0JCWNwID0gdWJoLT5iaFtiZWdpbl0tPmJfZGF0YSArIG9mZnNldDsKLQkJd2hpbGUgKCh0YWJsZVsqY3ArK10gJiBtYXNrKSA9PSAwICYmIC0tcmVzdCk7Ci0JCWlmIChyZXN0IHx8ICFzaXplKQotCQkJYnJlYWs7Ci0JCWJlZ2luKys7Ci0JCW9mZnNldCA9IDA7Ci0JfQotCXJldHVybiAoc2l6ZSArIHJlc3QpOwotfQpkaWZmIC0tZ2l0IGEvZnMvdmZhdC9uYW1laS5jIGIvZnMvdmZhdC9uYW1laS5jCmluZGV4IGE1NmNlYzMuLjlhOGY0OGIgMTAwNjQ0Ci0tLSBhL2ZzL3ZmYXQvbmFtZWkuYworKysgYi9mcy92ZmF0L25hbWVpLmMKQEAgLTEwMjMsMTEgKzEwMjMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdmZhdF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJICAgICAgIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHZmYXRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkgICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICAgICAgIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHZmYXRfZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgdmZhdF9maWxsX3N1cGVyLAorCQkJICAgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZmYXRfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCmluZGV4IDFmMDU4OWEuLmU0ODBiNjEgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3RhdHMuYwpAQCAtNjIsNyArNjIsNyBAQAogCQl3aGlsZSAoaiA8IHhzdGF0c1tpXS5lbmRwb2ludCkgewogCQkJdmFsID0gMDsKIAkJCS8qIHN1bSBvdmVyIGFsbCBjcHVzICovCi0JCQlmb3JfZWFjaF9jcHUoYykKKwkJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjKQogCQkJCXZhbCArPSAqKCgoX191MzIqKSZwZXJfY3B1KHhmc3N0YXRzLCBjKSArIGopKTsKIAkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAldSIsIHZhbCk7CiAJCQlqKys7CkBAIC03MCw3ICs3MCw3IEBACiAJCWJ1ZmZlcltsZW4rK10gPSAnXG4nOwogCX0KIAkvKiBleHRyYSBwcmVjaXNpb24gY291bnRlcnMgKi8KLQlmb3JfZWFjaF9jcHUoaSkgeworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXhzX3hzdHJhdF9ieXRlcyArPSBwZXJfY3B1KHhmc3N0YXRzLCBpKS54c194c3RyYXRfYnl0ZXM7CiAJCXhzX3dyaXRlX2J5dGVzICs9IHBlcl9jcHUoeGZzc3RhdHMsIGkpLnhzX3dyaXRlX2J5dGVzOwogCQl4c19yZWFkX2J5dGVzICs9IHBlcl9jcHUoeGZzc3RhdHMsIGkpLnhzX3JlYWRfYnl0ZXM7CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYwppbmRleCBmMmEwNzc4Li45YmRlZjlkIDEwMDY0NAotLS0gYS9mcy94ZnMvbGludXgtMi42L3hmc19zdXBlci5jCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTY4NCwxMCArNjg0LDExIEBACiAKIFNUQVRJQyBpbnQKIHhmc19mc19zdGF0ZnMoCi0Jc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5LAogCXN0cnVjdCBrc3RhdGZzCQkqc3RhdHApCiB7Ci0JcmV0dXJuIC1iaHZfdmZzX3N0YXR2ZnModmZzX2Zyb21fc2Ioc2IpLCBzdGF0cCwgTlVMTCk7CisJcmV0dXJuIC1iaHZfdmZzX3N0YXR2ZnModmZzX2Zyb21fc2IoZGVudHJ5LT5kX3NiKSwgc3RhdHAsCisJCQkJdm5fZnJvbV9pbm9kZShkZW50cnktPmRfaW5vZGUpKTsKIH0KIAogU1RBVElDIGludApAQCAtODUzLDE0ICs4NTQsMTYgQEAKIAlyZXR1cm4gLWVycm9yOwogfQogCi1TVEFUSUMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK1NUQVRJQyBpbnQKIHhmc19mc19nZXRfc2IoCiAJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUJKmZzX3R5cGUsCiAJaW50CQkJZmxhZ3MsCiAJY29uc3QgY2hhcgkJKmRldl9uYW1lLAotCXZvaWQJCQkqZGF0YSkKKwl2b2lkCQkJKmRhdGEsCisJc3RydWN0IHZmc21vdW50CQkqbW50KQogewotCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHhmc19mc19maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCB4ZnNfZnNfZmlsbF9zdXBlciwKKwkJCSAgIG1udCk7CiB9CiAKIFNUQVRJQyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB4ZnNfc3VwZXJfb3BlcmF0aW9ucyA9IHsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMKaW5kZXggNGFmOTc2OC4uYWYyNDY1MyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3lzY3RsLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogCWlmICghcmV0ICYmIHdyaXRlICYmICp2YWxwKSB7CiAJCXByaW50aygiWEZTIENsZWFyaW5nIHhmc3N0YXRzXG4iKTsKLQkJZm9yX2VhY2hfY3B1KGMpIHsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGMpIHsKIAkJCXByZWVtcHRfZGlzYWJsZSgpOwogCQkJLyogc2F2ZSB2bl9hY3RpdmUsIGl0J3MgYSB1bml2ZXJzYWwgdHJ1dGghICovCiAJCQl2bl9hY3RpdmUgPSBwZXJfY3B1KHhmc3N0YXRzLCBjKS52bl9hY3RpdmU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNjb25maWcuaCBiL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCmluZGV4IGUyN2RjOGYuLmI5YmVjZWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2NvbmZpZy5oCkBAIC02Myw3ICs2Myw3IEBACiAKIC8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDA2MDEyNworI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAwNjA2MDgKIAogLyoKICAqIE9TIG5hbWUsIHVzZWQgZm9yIHRoZSBfT1Mgb2JqZWN0LiAgVGhlIF9PUyBvYmplY3QgaXMgZXNzZW50aWFsbHkgb2Jzb2xldGUsCkBAIC04MSw2ICs4MSw3IEBACiAjZGVmaW5lIEFDUElfTUFYX1BBUlNFX0NBQ0hFX0RFUFRIICAgICAgOTYJLyogUGFyc2UgdHJlZSBvYmplY3RzICovCiAjZGVmaW5lIEFDUElfTUFYX0VYVFBBUlNFX0NBQ0hFX0RFUFRIICAgOTYJLyogUGFyc2UgdHJlZSBvYmplY3RzICovCiAjZGVmaW5lIEFDUElfTUFYX09CSkVDVF9DQUNIRV9ERVBUSCAgICAgOTYJLyogSW50ZXJwcmV0ZXIgb3BlcmFuZCBvYmplY3RzICovCisjZGVmaW5lIEFDUElfTUFYX05BTUVTUEFDRV9DQUNIRV9ERVBUSCAgOTYJLyogTmFtZXNwYWNlIG9iamVjdHMgKi8KIAogLyoKICAqIFNob3VsZCB0aGUgc3Vic3lzdGVtIGFib3J0IHRoZSBsb2FkaW5nIG9mIGFuIEFDUEkgdGFibGUgaWYgdGhlCkBAIC0xMDIsOSArMTAzLDkgQEAKIAogI2RlZmluZSBBQ1BJX01BWF9TRU1BUEhPUkVfQ09VTlQgICAgICAgIDI1NgogCi0vKiBNYXggcmVmZXJlbmNlIGNvdW50IChmb3IgZGVidWcgb25seSkgKi8KKy8qIE1heGltdW0gb2JqZWN0IHJlZmVyZW5jZSBjb3VudCAoZGV0ZWN0cyBvYmplY3QgZGVsZXRpb24gaXNzdWVzKSAqLwogCi0jZGVmaW5lIEFDUElfTUFYX1JFRkVSRU5DRV9DT1VOVCAgICAgICAgMHg0MDAKKyNkZWZpbmUgQUNQSV9NQVhfUkVGRVJFTkNFX0NPVU5UICAgICAgICAweDgwMAogCiAvKiBTaXplIG9mIGNhY2hlZCBtZW1vcnkgbWFwcGluZyBmb3Igc3lzdGVtIG1lbW9yeSBvcGVyYXRpb24gcmVnaW9uICovCiAKQEAgLTE3MSwxMiArMTcyLDcgQEAKIAogLyogQXJyYXkgc2l6ZXMuICBVc2VkIGZvciByYW5nZSBjaGVja2luZyBhbHNvICovCiAKLSNkZWZpbmUgQUNQSV9OVU1fQUNDRVNTX1RZUEVTICAgICAgICAgICA2Ci0jZGVmaW5lIEFDUElfTlVNX1VQREFURV9SVUxFUyAgICAgICAgICAgMwotI2RlZmluZSBBQ1BJX05VTV9MT0NLX1JVTEVTICAgICAgICAgICAgIDIKLSNkZWZpbmUgQUNQSV9OVU1fTUFUQ0hfT1BTICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEFDUElfTlVNX09QQ09ERVMgICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIEFDUElfTlVNX0ZJRUxEX05BTUVTICAgICAgICAgICAgMgorI2RlZmluZSBBQ1BJX01BWF9NQVRDSF9PUENPREUgICAgICAgICAgIDUKIAogLyogUlNEUCBjaGVja3N1bXMgKi8KIApAQCAtMTg3LDEwICsxODMsNiBAQAogCiAjZGVmaW5lIEFDUElfU01CVVNfQlVGRkVSX1NJWkUgICAgICAgICAgMzQKIAotLyogTnVtYmVyIG9mIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBfT1NJIHJlc2VydmVkIG1ldGhvZCAqLwotCi0jZGVmaW5lIEFDUElfTlVNX09TSV9TVFJJTkdTICAgICAgICAgICAgMTAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEFDUEkgQU1MIERlYnVnZ2VyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNhc20uaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCmluZGV4IDExYThmZTMuLjlhN2Q2OTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc2FzbS5oCkBAIC01MCwyNiArNTAsNzIgQEAKICNkZWZpbmUgQkxPQ0tfUEFSRU4gICAgICAgICAgICAgMQogI2RlZmluZSBCTE9DS19CUkFDRSAgICAgICAgICAgICAyCiAjZGVmaW5lIEJMT0NLX0NPTU1BX0xJU1QgICAgICAgIDQKKyNkZWZpbmUgQUNQSV9ERUZBVUxUX1JFU05BTUUgICAgKih1MzIgKikgIl9fUkQiCiAKIHN0cnVjdCBhY3BpX2V4dGVybmFsX2xpc3QgewogCWNoYXIgKnBhdGg7CisJY2hhciAqaW50ZXJuYWxfcGF0aDsKIAlzdHJ1Y3QgYWNwaV9leHRlcm5hbF9saXN0ICpuZXh0OworCXUzMiB2YWx1ZTsKKwl1MTYgbGVuZ3RoOworCXU4IHR5cGU7CiB9OwogCiBleHRlcm4gc3RydWN0IGFjcGlfZXh0ZXJuYWxfbGlzdCAqYWNwaV9nYmxfZXh0ZXJuYWxfbGlzdDsKIAotLyogU3RyaW5ncyB1c2VkIGZvciBkZWNvZGluZyBmbGFncyB0byBBU0wga2V5d29yZHMgKi8KK3R5cGVkZWYgY29uc3Qgc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIHsKKwl1OCBvcGNvZGU7CisJdTggb2Zmc2V0OworCWNoYXIgKm5hbWU7CiAKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF93b3JkX2RlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pcnFfZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2xvY2tfcnVsZVtBQ1BJX05VTV9MT0NLX1JVTEVTXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9hY2Nlc3NfdHlwZXNbQUNQSV9OVU1fQUNDRVNTX1RZUEVTXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF91cGRhdGVfcnVsZXNbQUNQSV9OVU1fVVBEQVRFX1JVTEVTXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9tYXRjaF9vcHNbQUNQSV9OVU1fTUFUQ0hfT1BTXTsKK30gYWNwaV9kbXRhYmxlX2luZm87CisKKy8qCisgKiBWYWx1ZXMgZm9yIE9wY29kZSBhYm92ZS4KKyAqIE5vdGU6IDAtNyBtdXN0IG5vdCBjaGFuZ2UsIHVzZWQgYXMgYSBmbGFnIHNoaWZ0IHZhbHVlCisgKi8KKyNkZWZpbmUgQUNQSV9ETVRfRkxBRzAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfRE1UX0ZMQUcxICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX0RNVF9GTEFHMiAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQUNQSV9ETVRfRkxBRzMgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFDUElfRE1UX0ZMQUc0ICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBQ1BJX0RNVF9GTEFHNSAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQUNQSV9ETVRfRkxBRzYgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIEFDUElfRE1UX0ZMQUc3ICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBBQ1BJX0RNVF9GTEFHUzAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQUNQSV9ETVRfRkxBR1MyICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFDUElfRE1UX1VJTlQ4ICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQUNQSV9ETVRfVUlOVDE2ICAgICAgICAgICAgICAgICAxMQorI2RlZmluZSBBQ1BJX0RNVF9VSU5UMjQgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIEFDUElfRE1UX1VJTlQzMiAgICAgICAgICAgICAgICAgMTMKKyNkZWZpbmUgQUNQSV9ETVRfVUlOVDU2ICAgICAgICAgICAgICAgICAxNAorI2RlZmluZSBBQ1BJX0RNVF9VSU5UNjQgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIEFDUElfRE1UX1NUUklORyAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgQUNQSV9ETVRfTkFNRTQgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBBQ1BJX0RNVF9OQU1FNiAgICAgICAgICAgICAgICAgIDE4CisjZGVmaW5lIEFDUElfRE1UX05BTUU4ICAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQUNQSV9ETVRfQ0hLU1VNICAgICAgICAgICAgICAgICAyMAorI2RlZmluZSBBQ1BJX0RNVF9TUEFDRUlEICAgICAgICAgICAgICAgIDIxCisjZGVmaW5lIEFDUElfRE1UX0dBUyAgICAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQUNQSV9ETVRfTUFEVCAgICAgICAgICAgICAgICAgICAyMworI2RlZmluZSBBQ1BJX0RNVF9TUkFUICAgICAgICAgICAgICAgICAgIDI0CisjZGVmaW5lIEFDUElfRE1UX0VYSVQgICAgICAgICAgICAgICAgICAgMjUKKwordHlwZWRlZgordm9pZCAoKkFDUElfVEFCTEVfSEFORExFUikgKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqIHRhYmxlKTsKKworc3RydWN0IGFjcGlfZG10YWJsZV9kYXRhIHsKKwljaGFyICpzaWduYXR1cmU7CisJc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvICp0YWJsZV9pbmZvOworCUFDUElfVEFCTEVfSEFORExFUiB0YWJsZV9oYW5kbGVyOworfTsKIAogc3RydWN0IGFjcGlfb3Bfd2Fsa19pbmZvIHsKIAl1MzIgbGV2ZWw7CisJdTMyIGxhc3RfbGV2ZWw7CisJdTMyIGNvdW50OwogCXUzMiBiaXRfb2Zmc2V0OworCXUzMiBmbGFnczsKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOwogfTsKIApAQCAtNzcsNiArMTIzLDEwMCBAQAogYWNwaV9zdGF0dXMoKmFzbF93YWxrX2NhbGxiYWNrKSAodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKiBvcCwKIAkJCQkgdTMyIGxldmVsLCB2b2lkICpjb250ZXh0KTsKIAorc3RydWN0IGFjcGlfcmVzb3VyY2VfdGFnIHsKKwl1MzIgYml0X2luZGV4OworCWNoYXIgKnRhZzsKK307CisKKy8qIFN0cmluZ3MgdXNlZCBmb3IgZGVjb2RpbmcgZmxhZ3MgdG8gQVNMIGtleXdvcmRzICovCisKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF93b3JkX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2lycV9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9sb2NrX3J1bGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9hY2Nlc3NfdHlwZXNbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF91cGRhdGVfcnVsZXNbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9tYXRjaF9vcHNbXTsKKworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmMFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmMVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmMltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmM1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmNFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYXNmX2hkcltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fYm9vdFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fY3BlcFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fY3BlcDBbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2RiZ3BbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2VjZHRbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2ZhY3NbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2ZhZHQxW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19mYWR0MltdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fZ2FzW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19oZWFkZXJbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX2hwZXRbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHRbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQwW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0MVtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDJbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQzW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0NFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDVbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHQ2W107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tYWR0N1tdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fbWFkdDhbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX21hZHRfaGRyW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tY2ZnW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19tY2ZnMFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fcnNkcDFbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3JzZHAyW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zYnN0W107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zbGl0W107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zcGNyW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zcG1pW107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zcmF0W107CitleHRlcm4gc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvIGFjcGlfZG1fdGFibGVfaW5mb19zcmF0MFtdOworZXh0ZXJuIHN0cnVjdCBhY3BpX2RtdGFibGVfaW5mbyBhY3BpX2RtX3RhYmxlX2luZm9fc3JhdDFbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3RjcGFbXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV9kbXRhYmxlX2luZm8gYWNwaV9kbV90YWJsZV9pbmZvX3dkcnRbXTsKKworLyoKKyAqIGRtdGFibGUKKyAqLwordm9pZCBhY3BpX2RtX2R1bXBfZGF0YV90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKKwordm9pZAorYWNwaV9kbV9kdW1wX3RhYmxlKHUzMiB0YWJsZV9sZW5ndGgsCisJCSAgIHUzMiB0YWJsZV9vZmZzZXQsCisJCSAgIHZvaWQgKnRhYmxlLAorCQkgICB1MzIgc3ViX3RhYmxlX2xlbmd0aCwgc3RydWN0IGFjcGlfZG10YWJsZV9pbmZvICppbmZvKTsKKwordm9pZCBhY3BpX2RtX2xpbmVfaGVhZGVyKHUzMiBvZmZzZXQsIHUzMiBieXRlX2xlbmd0aCwgY2hhciAqbmFtZSk7CisKK3ZvaWQgYWNwaV9kbV9saW5lX2hlYWRlcjIodTMyIG9mZnNldCwgdTMyIGJ5dGVfbGVuZ3RoLCBjaGFyICpuYW1lLCB1MzIgdmFsdWUpOworCisvKgorICogZG10YmR1bXAKKyAqLwordm9pZCBhY3BpX2RtX2R1bXBfYXNmKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9jcGVwKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9mYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9zcmF0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9tY2ZnKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit2b2lkIGFjcGlfZG1fZHVtcF9tYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpOworCit1MzIgYWNwaV9kbV9kdW1wX3JzZHAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CisKK3ZvaWQgYWNwaV9kbV9kdW1wX3JzZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CisKK3ZvaWQgYWNwaV9kbV9kdW1wX3NsaXQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CisKK3ZvaWQgYWNwaV9kbV9kdW1wX3hzZHQoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CisKIC8qCiAgKiBkbXdhbGsKICAqLwpAQCAtODQsNiArMjI0LDExIEBACiBhY3BpX2RtX2Rpc2Fzc2VtYmxlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUsCiAJCSAgICB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3JpZ2luLCB1MzIgbnVtX29wY29kZXMpOwogCit2b2lkCithY3BpX2RtX3dhbGtfcGFyc2VfdHJlZSh1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3AsCisJCQlhc2xfd2Fsa19jYWxsYmFjayBkZXNjZW5kaW5nX2NhbGxiYWNrLAorCQkJYXNsX3dhbGtfY2FsbGJhY2sgYXNjZW5kaW5nX2NhbGxiYWNrLCB2b2lkICpjb250ZXh0KTsKKwogLyoKICAqIGRtb3Bjb2RlCiAgKi8KQEAgLTE2Niw2ICszMTEsNyBAQAogCiB2b2lkCiBhY3BpX2RtX3Jlc291cmNlX3RlbXBsYXRlKHN0cnVjdCBhY3BpX29wX3dhbGtfaW5mbyAqaW5mbywKKwkJCSAgdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAogCQkJICB1OCAqIGJ5dGVfZGF0YSwgdTMyIGJ5dGVfY291bnQpOwogCiB1OCBhY3BpX2RtX2lzX3Jlc291cmNlX3RlbXBsYXRlKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcCk7CkBAIC0xNzYsNiArMzIyLDggQEAKIAogdm9pZCBhY3BpX2RtX2RlY29kZV9hdHRyaWJ1dGUodTggYXR0cmlidXRlKTsKIAordm9pZCBhY3BpX2RtX2Rlc2NyaXB0b3JfbmFtZSh2b2lkKTsKKwogLyoKICAqIGRtcmVzcmNsCiAgKi8KQEAgLTI0OCw2ICszOTYsMTUgQEAKIC8qCiAgKiBkbXV0aWxzCiAgKi8KLXZvaWQgYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdChjaGFyICpwYXRoKTsKK3ZvaWQgYWNwaV9kbV9hZGRfdG9fZXh0ZXJuYWxfbGlzdChjaGFyICpwYXRoLCB1OCB0eXBlLCB1MzIgdmFsdWUpOworCisvKgorICogZG1yZXN0YWcKKyAqLwordm9pZCBhY3BpX2RtX2ZpbmRfcmVzb3VyY2VzKHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpyb290KTsKKwordm9pZAorYWNwaV9kbV9jaGVja19yZXNvdXJjZV9yZWZlcmVuY2UodW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wLAorCQkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogI2VuZGlmCQkJCS8qIF9fQUNESVNBU01fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNkaXNwYXQuaCBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCmluZGV4IGM0MWE5MjYuLjI4OGY4NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY2Rpc3BhdC5oCkBAIC0xOTQsNyArMTk0LDkgQEAKIGFjcGlfZHNfcmVzdGFydF9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLAogCQkJICAgICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjKTsKIAotdm9pZCBhY3BpX2RzX3Rlcm1pbmF0ZV9jb250cm9sX21ldGhvZChzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKK3ZvaWQKK2FjcGlfZHNfdGVybWluYXRlX2NvbnRyb2xfbWV0aG9kKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm1ldGhvZF9kZXNjLAorCQkJCSBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfYmVnaW5fbWV0aG9kX2V4ZWN1dGlvbihzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX25vZGUsCkBAIC0zMDIsNyArMzA0LDcgQEAKIAkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm1ldGhvZF9ub2RlLAogCQkgICAgICB1OCAqIGFtbF9zdGFydCwKIAkJICAgICAgdTMyIGFtbF9sZW5ndGgsCi0JCSAgICAgIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvLCB1OCBwYXNzX251bWJlcik7CisJCSAgICAgIHN0cnVjdCBhY3BpX2V2YWx1YXRlX2luZm8gKmluZm8sIHU4IHBhc3NfbnVtYmVyKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfZHNfb2JqX3N0YWNrX3BvcF9hbmRfZGVsZXRlKHUzMiBwb3BfY291bnQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNldmVudHMuaCBiL2luY2x1ZGUvYWNwaS9hY2V2ZW50cy5oCmluZGV4IGYyNzE3YmUuLjIzNDE0MjgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNldmVudHMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNldmVudHMuaApAQCAtOTMsNyArOTMsNyBAQAogICovCiB1OCBhY3BpX2V2X3ZhbGlkX2dwZV9ldmVudChzdHJ1Y3QgYWNwaV9ncGVfZXZlbnRfaW5mbyAqZ3BlX2V2ZW50X2luZm8pOwogCi1hY3BpX3N0YXR1cyBhY3BpX2V2X3dhbGtfZ3BlX2xpc3QoQUNQSV9HUEVfQ0FMTEJBQ0sgZ3BlX3dhbGtfY2FsbGJhY2spOworYWNwaV9zdGF0dXMgYWNwaV9ldl93YWxrX2dwZV9saXN0KGFjcGlfZ3BlX2NhbGxiYWNrIGdwZV93YWxrX2NhbGxiYWNrKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfZXZfZGVsZXRlX2dwZV9oYW5kbGVycyhzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqZ3BlX3hydXB0X2luZm8sCkBAIC0xMzgsNyArMTM4LDcgQEAKIGFjcGlfZXZfYWRkcmVzc19zcGFjZV9kaXNwYXRjaCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZWdpb25fb2JqLAogCQkJICAgICAgIHUzMiBmdW5jdGlvbiwKIAkJCSAgICAgICBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywKLQkJCSAgICAgICB1MzIgYml0X3dpZHRoLCB2b2lkICp2YWx1ZSk7CisJCQkgICAgICAgdTMyIGJpdF93aWR0aCwgYWNwaV9pbnRlZ2VyICogdmFsdWUpOwogCiBhY3BpX3N0YXR1cwogYWNwaV9ldl9hdHRhY2hfcmVnaW9uKHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXJfb2JqLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaCBiL2luY2x1ZGUvYWNwaS9hY2V4Y2VwLmgKaW5kZXggZGM3NjhhYS4uNzk3Y2ExZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjZXhjZXAuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNleGNlcC5oCkBAIC0xNjAsOCArMTYwLDkgQEAKICNkZWZpbmUgQUVfQU1MX0JBRF9SRVNPVVJDRV9WQUxVRSAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMUYgfCBBRV9DT0RFX0FNTCkKICNkZWZpbmUgQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMjAgfCBBRV9DT0RFX0FNTCkKICNkZWZpbmUgQUVfQU1MX0JBRF9SRVNPVVJDRV9MRU5HVEggICAgICAoYWNwaV9zdGF0dXMpICgweDAwMjEgfCBBRV9DT0RFX0FNTCkKKyNkZWZpbmUgQUVfQU1MX0lMTEVHQUxfQUREUkVTUyAgICAgICAgICAoYWNwaV9zdGF0dXMpICgweDAwMjIgfCBBRV9DT0RFX0FNTCkKIAotI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMQorI2RlZmluZSBBRV9DT0RFX0FNTF9NQVggICAgICAgICAgICAgICAgIDB4MDAyMgogCiAvKgogICogSW50ZXJuYWwgZXhjZXB0aW9ucyB1c2VkIGZvciBjb250cm9sCkBAIC0yNzUsNyArMjc2LDggQEAKIAkiQUVfQU1MX05PX1JFU09VUkNFX0VORF9UQUciLAogCSJBRV9BTUxfQkFEX1JFU09VUkNFX1ZBTFVFIiwKIAkiQUVfQU1MX0NJUkNVTEFSX1JFRkVSRU5DRSIsCi0JIkFFX0FNTF9CQURfUkVTT1VSQ0VfTEVOR1RIIgorCSJBRV9BTUxfQkFEX1JFU09VUkNFX0xFTkdUSCIsCisJIkFFX0FNTF9JTExFR0FMX0FERFJFU1MiCiB9OwogCiBjaGFyIGNvbnN0ICphY3BpX2dibF9leGNlcHRpb25fbmFtZXNfY3RybFtdID0gewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjZ2xvYmFsLmggYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAppbmRleCA3MzRjYzc3Li4xNDUzMWQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNnbG9iYWwuaApAQCAtMTA3LDYgKzEwNyw3IEBACiAgKiAzKSBBbGxvdyBhY2Nlc3MgdG8gdW5pbml0aWFsaXplZCBsb2NhbHMvYXJncyAoYXV0by1pbml0IHRvIGludGVnZXIgMCkKICAqIDQpIEFsbG93IEFOWSBvYmplY3QgdHlwZSB0byBiZSBhIHNvdXJjZSBvcGVyYW5kIGZvciB0aGUgU3RvcmUoKSBvcGVyYXRvcgogICogNSkgQWxsb3cgdW5yZXNvbHZlZCByZWZlcmVuY2VzIChpbnZhbGlkIHRhcmdldCBuYW1lKSBpbiBwYWNrYWdlIG9iamVjdHMKKyAqIDYpIEVuYWJsZSB3YXJuaW5nIG1lc3NhZ2VzIGZvciBiZWhhdmlvciB0aGF0IGlzIG5vdCBBQ1BJIHNwZWMgY29tcGxpYW50CiAgKi8KIEFDUElfRVhURVJOIHU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfZW5hYmxlX2ludGVycHJldGVyX3NsYWNrLCBGQUxTRSk7CiAKQEAgLTExNCw3ICsxMTUsNyBAQAogICogQXV0b21hdGljYWxseSBzZXJpYWxpemUgQUxMIGNvbnRyb2wgbWV0aG9kcz8gRGVmYXVsdCBpcyBGQUxTRSwgbWVhbmluZwogICogdG8gdXNlIHRoZSBTZXJpYWxpemVkL25vdF9zZXJpYWxpemVkIG1ldGhvZCBmbGFncyBvbiBhIHBlciBtZXRob2QgYmFzaXMuCiAgKiBPbmx5IGNoYW5nZSB0aGlzIGlmIHRoZSBBU0wgY29kZSBpcyBwb29ybHkgd3JpdHRlbiBhbmQgY2Fubm90IGhhbmRsZQotICogcmVlbnRyYW5jeSBldmVuIHRob3VnaCBtZXRob2RzIGFyZSBtYXJrZWQgIm5vdF9zZXJpYWxpemVkIi4KKyAqIHJlZW50cmFuY3kgZXZlbiB0aG91Z2ggbWV0aG9kcyBhcmUgbWFya2VkICJOb3RTZXJpYWxpemVkIi4KICAqLwogQUNQSV9FWFRFUk4gdTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9hbGxfbWV0aG9kc19zZXJpYWxpemVkLCBGQUxTRSk7CiAKQEAgLTE0OSwxMCArMTUwLDEwIEBACiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfdGFibGVfZmxhZ3M7CiBBQ1BJX0VYVEVSTiB1MzIgYWNwaV9nYmxfcnNkdF90YWJsZV9jb3VudDsKIEFDUElfRVhURVJOIHN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgKmFjcGlfZ2JsX1JTRFA7Ci1BQ1BJX0VYVEVSTiBYU0RUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX1hTRFQ7Ci1BQ1BJX0VYVEVSTiBGQURUX0RFU0NSSVBUT1IgKmFjcGlfZ2JsX0ZBRFQ7CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgeHNkdF9kZXNjcmlwdG9yICphY3BpX2dibF9YU0RUOworQUNQSV9FWFRFUk4gc3RydWN0IGZhZHRfZGVzY3JpcHRvciAqYWNwaV9nYmxfRkFEVDsKIEFDUElfRVhURVJOIHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqYWNwaV9nYmxfRFNEVDsKLUFDUElfRVhURVJOIEZBQ1NfREVTQ1JJUFRPUiAqYWNwaV9nYmxfRkFDUzsKK0FDUElfRVhURVJOIHN0cnVjdCBmYWNzX2Rlc2NyaXB0b3IgKmFjcGlfZ2JsX0ZBQ1M7CiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9jb21tb25fZmFjcyBhY3BpX2dibF9jb21tb25fZkFDUzsKIC8qCiAgKiBTaW5jZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgU1NEVHMgYW5kIFBTRFRzLCBhIHNpbmdsZSBwb2ludGVyIGlzIG5vdApAQCAtMTc3LDE1ICsxNzgsMTUgQEAKIC8qCiAgKiBBQ1BJIFRhYmxlIGluZm8gYXJyYXlzCiAgKi8KLWV4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9saXN0IGFjcGlfZ2JsX3RhYmxlX2xpc3RzW05VTV9BQ1BJX1RBQkxFX1RZUEVTXTsKLWV4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbTlVNX0FDUElfVEFCTEVfVFlQRVNdOworZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX2xpc3QgYWNwaV9nYmxfdGFibGVfbGlzdHNbQUNQSV9UQUJMRV9JRF9NQVggKyAxXTsKK2V4dGVybiBzdHJ1Y3QgYWNwaV90YWJsZV9zdXBwb3J0IGFjcGlfZ2JsX3RhYmxlX2RhdGFbQUNQSV9UQUJMRV9JRF9NQVggKyAxXTsKIAogLyoKICAqIFByZWRlZmluZWQgbXV0ZXggb2JqZWN0cy4gIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlCiAgKiBhY3R1YWwgT1MgbXV0ZXggaGFuZGxlcywgaW5kZXhlZCBieSB0aGUgbG9jYWwgQUNQSV9NVVRFWF9IQU5ETEVzLgogICogKFRoZSB0YWJsZSBtYXBzIGxvY2FsIGhhbmRsZXMgdG8gdGhlIHJlYWwgT1MgaGFuZGxlcykKICAqLwotQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfbXV0ZXhfaW5mbyBhY3BpX2dibF9tdXRleF9pbmZvW05VTV9NVVRFWF07CitBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvIGFjcGlfZ2JsX211dGV4X2luZm9bQUNQSV9OVU1fTVVURVhdOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC0yMDMsNiArMjA0LDcgQEAKIAogLyogT2JqZWN0IGNhY2hlcyAqLwogCitBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX25hbWVzcGFjZV9jYWNoZTsKIEFDUElfRVhURVJOIGFjcGlfY2FjaGVfdCAqYWNwaV9nYmxfc3RhdGVfY2FjaGU7CiBBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfY2FjaGU7CiBBQ1BJX0VYVEVSTiBhY3BpX2NhY2hlX3QgKmFjcGlfZ2JsX3BzX25vZGVfZXh0X2NhY2hlOwpAQCAtMjQ0LDcgKzI0Niw2IEBACiBleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaGlnaGVzdF9kc3RhdGVfbmFtZXNbNF07CiBleHRlcm4gY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gYWNwaV9nYmxfYW1sX29wX2luZm9bQU1MX05VTV9PUENPREVTXTsKIGV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9yZWdpb25fdHlwZXNbQUNQSV9OVU1fUFJFREVGSU5FRF9SRUdJT05TXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF92YWxpZF9vc2lfc3RyaW5nc1tBQ1BJX05VTV9PU0lfU1RSSU5HU107CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI5MSwxNCArMjkyLDYgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogUGFyc2VyIGdsb2JhbHMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotQUNQSV9FWFRFUk4gdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKmFjcGlfZ2JsX3BhcnNlZF9uYW1lc3BhY2Vfcm9vdDsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICogSGFyZHdhcmUgZ2xvYmFscwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzIxLDcgKzMxNCwxMSBAQAogQUNQSV9FWFRFUk4gc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKmFjcGlfZ2JsX2dwZV94cnVwdF9saXN0X2hlYWQ7CiBBQ1BJX0VYVEVSTiBzdHJ1Y3QgYWNwaV9ncGVfYmxvY2tfaW5mbwogICAgICphY3BpX2dibF9ncGVfZmFkdF9ibG9ja3NbQUNQSV9NQVhfR1BFX0JMT0NLU107CisKKy8qIFNwaW5sb2NrcyAqLworCiBBQ1BJX0VYVEVSTiBhY3BpX2hhbmRsZSBhY3BpX2dibF9ncGVfbG9jazsKK0FDUElfRVhURVJOIGFjcGlfaGFuZGxlIGFjcGlfZ2JsX2hhcmR3YXJlX2xvY2s7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmggYi9pbmNsdWRlL2FjcGkvYWNsb2NhbC5oCmluZGV4IDgzNjE4MjAuLjFlZWNhN2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY2xvY2FsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjbG9jYWwuaApAQCAtNDQsNyArNDQsMTAgQEAKICNpZm5kZWYgX19BQ0xPQ0FMX0hfXwogI2RlZmluZSBfX0FDTE9DQUxfSF9fCiAKKy8qIGFjcGlzcmM6c3RydWN0X2RlZnMgLS0gZm9yIGFjcGlzcmMgY29udmVyc2lvbiAqLworCiAjZGVmaW5lIEFDUElfV0FJVF9GT1JFVkVSICAgICAgICAgICAgICAgMHhGRkZGCS8qIHUxNiwgYXMgcGVyIEFDUEkgc3BlYyAqLworI2RlZmluZSBBQ1BJX0lORklOSVRFX0NPTkNVUlJFTkNZICAgICAgIDB4RkYKIAogdHlwZWRlZiB2b2lkICphY3BpX211dGV4OwogdHlwZWRlZiB1MzIgYWNwaV9tdXRleF9oYW5kbGU7CkBAIC02OSw1MiArNzIsNTUgQEAKICAqIFByZWRlZmluZWQgaGFuZGxlcyBmb3IgdGhlIG11dGV4IG9iamVjdHMgdXNlZCB3aXRoaW4gdGhlIHN1YnN5c3RlbQogICogQWxsIG11dGV4IG9iamVjdHMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBhY3BpX3V0X211dGV4X2luaXRpYWxpemUuCiAgKgotICogVGhlIGFjcXVpcmUvcmVsZWFzZSBvcmRlcmluZyBwcm90b2NvbCBpcyBpbXBsaWVkIHZpYSB0aGlzIGxpc3QuICBNdXRleGVzCisgKiBUaGUgYWNxdWlyZS9yZWxlYXNlIG9yZGVyaW5nIHByb3RvY29sIGlzIGltcGxpZWQgdmlhIHRoaXMgbGlzdC4gTXV0ZXhlcwogICogd2l0aCBhIGxvd2VyIHZhbHVlIG11c3QgYmUgYWNxdWlyZWQgYmVmb3JlIG11dGV4ZXMgd2l0aCBhIGhpZ2hlciB2YWx1ZS4KICAqCi0gKiBOT1RFOiBhbnkgY2hhbmdlcyBoZXJlIG11c3QgYmUgcmVmbGVjdGVkIGluIHRoZSBhY3BpX2dibF9tdXRleF9uYW1lcyB0YWJsZSBhbHNvIQorICogTk9URTogYW55IGNoYW5nZXMgaGVyZSBtdXN0IGJlIHJlZmxlY3RlZCBpbiB0aGUgYWNwaV9nYmxfbXV0ZXhfbmFtZXMKKyAqIHRhYmxlIGJlbG93IGFsc28hCiAgKi8KLSNkZWZpbmUgQUNQSV9NVFhfRVhFQ1VURSAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFDUElfTVRYX0lOVEVSUFJFVEVSICAgICAgICAgICAgMQotI2RlZmluZSBBQ1BJX01UWF9QQVJTRVIgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgQUNQSV9NVFhfRElTUEFUQ0hFUiAgICAgICAgICAgICAzCi0jZGVmaW5lIEFDUElfTVRYX1RBQkxFUyAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBBQ1BJX01UWF9PUF9SRUdJT05TICAgICAgICAgICAgIDUKLSNkZWZpbmUgQUNQSV9NVFhfTkFNRVNQQUNFICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEFDUElfTVRYX0VWRU5UUyAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBBQ1BJX01UWF9IQVJEV0FSRSAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgQUNQSV9NVFhfQ0FDSEVTICAgICAgICAgICAgICAgICA5Ci0jZGVmaW5lIEFDUElfTVRYX01FTU9SWSAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgQUNQSV9NVFhfREVCVUdfQ01EX0NPTVBMRVRFICAgICAxMQotI2RlZmluZSBBQ1BJX01UWF9ERUJVR19DTURfUkVBRFkgICAgICAgIDEyCisjZGVmaW5lIEFDUElfTVRYX0lOVEVSUFJFVEVSICAgICAgICAgICAgMAkvKiBBTUwgSW50ZXJwcmV0ZXIsIG1haW4gbG9jayAqLworI2RlZmluZSBBQ1BJX01UWF9DT05UUk9MX01FVEhPRCAgICAgICAgIDEJLyogQ29udHJvbCBtZXRob2QgdGVybWluYXRpb24gW1RCRDogbWF5IG5vIGxvbmdlciBiZSBuZWNlc3NhcnldICovCisjZGVmaW5lIEFDUElfTVRYX1RBQkxFUyAgICAgICAgICAgICAgICAgMgkvKiBEYXRhIGZvciBBQ1BJIHRhYmxlcyAqLworI2RlZmluZSBBQ1BJX01UWF9OQU1FU1BBQ0UgICAgICAgICAgICAgIDMJLyogQUNQSSBOYW1lc3BhY2UgKi8KKyNkZWZpbmUgQUNQSV9NVFhfRVZFTlRTICAgICAgICAgICAgICAgICA0CS8qIERhdGEgZm9yIEFDUEkgZXZlbnRzICovCisjZGVmaW5lIEFDUElfTVRYX0NBQ0hFUyAgICAgICAgICAgICAgICAgNQkvKiBJbnRlcm5hbCBjYWNoZXMsIGdlbmVyYWwgcHVycG9zZXMgKi8KKyNkZWZpbmUgQUNQSV9NVFhfTUVNT1JZICAgICAgICAgICAgICAgICA2CS8qIERlYnVnIG1lbW9yeSB0cmFja2luZyBsaXN0cyAqLworI2RlZmluZSBBQ1BJX01UWF9ERUJVR19DTURfQ09NUExFVEUgICAgIDcJLyogQU1MIGRlYnVnZ2VyICovCisjZGVmaW5lIEFDUElfTVRYX0RFQlVHX0NNRF9SRUFEWSAgICAgICAgOAkvKiBBTUwgZGVidWdnZXIgKi8KIAotI2RlZmluZSBNQVhfTVVURVggICAgICAgICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIE5VTV9NVVRFWCAgICAgICAgICAgICAgICAgICAgICAgTUFYX01VVEVYKzEKKyNkZWZpbmUgQUNQSV9NQVhfTVVURVggICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFDUElfTlVNX01VVEVYICAgICAgICAgICAgICAgICAgQUNQSV9NQVhfTVVURVgrMQogCiAjaWYgZGVmaW5lZChBQ1BJX0RFQlVHX09VVFBVVCkgfHwgZGVmaW5lZChBQ1BJX0RFQlVHR0VSKQogI2lmZGVmIERFRklORV9BQ1BJX0dMT0JBTFMKIAotLyogTmFtZXMgZm9yIHRoZSBtdXRleGVzIHVzZWQgaW4gdGhlIHN1YnN5c3RlbSAqLworLyogRGVidWcgbmFtZXMgZm9yIHRoZSBtdXRleGVzIGFib3ZlICovCiAKLXN0YXRpYyBjaGFyICphY3BpX2dibF9tdXRleF9uYW1lc1tdID0gewotCSJBQ1BJX01UWF9FeGVjdXRlIiwKK3N0YXRpYyBjaGFyICphY3BpX2dibF9tdXRleF9uYW1lc1tBQ1BJX05VTV9NVVRFWF0gPSB7CiAJIkFDUElfTVRYX0ludGVycHJldGVyIiwKLQkiQUNQSV9NVFhfUGFyc2VyIiwKLQkiQUNQSV9NVFhfRGlzcGF0Y2hlciIsCisJIkFDUElfTVRYX01ldGhvZCIsCiAJIkFDUElfTVRYX1RhYmxlcyIsCi0JIkFDUElfTVRYX29wX3JlZ2lvbnMiLAogCSJBQ1BJX01UWF9OYW1lc3BhY2UiLAogCSJBQ1BJX01UWF9FdmVudHMiLAotCSJBQ1BJX01UWF9IYXJkd2FyZSIsCiAJIkFDUElfTVRYX0NhY2hlcyIsCiAJIkFDUElfTVRYX01lbW9yeSIsCi0JIkFDUElfTVRYX2RlYnVnX2NtZF9jb21wbGV0ZSIsCi0JIkFDUElfTVRYX2RlYnVnX2NtZF9yZWFkeSIsCisJIkFDUElfTVRYX0RlYnVnQ21kQ29tcGxldGUiLAorCSJBQ1BJX01UWF9EZWJ1Z0NtZFJlYWR5IgogfTsKIAogI2VuZGlmCiAjZW5kaWYKIAorLyoKKyAqIFByZWRlZmluZWQgaGFuZGxlcyBmb3Igc3BpbmxvY2tzIHVzZWQgd2l0aGluIHRoZSBzdWJzeXN0ZW0uCisgKiBUaGVzZSBzcGlubG9ja3MgYXJlIGNyZWF0ZWQgYnkgYWNwaV91dF9tdXRleF9pbml0aWFsaXplCisgKi8KKyNkZWZpbmUgQUNQSV9MT0NLX0dQRVMgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFDUElfTE9DS19IQVJEV0FSRSAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFDUElfTUFYX0xPQ0sgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBQ1BJX05VTV9MT0NLICAgICAgICAgICAgICAgICAgIEFDUElfTUFYX0xPQ0srMQorCiAvKiBPd25lciBJRHMgYXJlIHVzZWQgdG8gdHJhY2sgbmFtZXNwYWNlIG5vZGVzIGZvciBzZWxlY3RpdmUgZGVsZXRpb24gKi8KIAogdHlwZWRlZiB1OCBhY3BpX293bmVyX2lkOwpAQCAtMTI5LDcgKzEzNSw3IEBACiBzdHJ1Y3QgYWNwaV9tdXRleF9pbmZvIHsKIAlhY3BpX211dGV4IG11dGV4OwogCXUzMiB1c2VfY291bnQ7Ci0JdTMyIHRocmVhZF9pZDsKKwlhY3BpX3RocmVhZF9pZCB0aHJlYWRfaWQ7CiB9OwogCiAvKiBMb2NrIGZsYWcgcGFyYW1ldGVyIGZvciB2YXJpb3VzIGludGVyZmFjZXMgKi8KQEAgLTE0NCw2ICsxNTAsOCBAQAogI2RlZmluZSBBQ1BJX0ZJRUxEX0RXT1JEX0dSQU5VTEFSSVRZICAgIDQKICNkZWZpbmUgQUNQSV9GSUVMRF9RV09SRF9HUkFOVUxBUklUWSAgICA4CiAKKyNkZWZpbmUgQUNQSV9FTlRSWV9OT1RfRk9VTkQgICAgICAgICAgICBOVUxMCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIE5hbWVzcGFjZSB0eXBlZGVmcyBhbmQgc3RydWN0cwpAQCAtMTU4LDQ5ICsxNjYsNTUgQEAKIAlBQ1BJX0lNT0RFX0VYRUNVVEUgPSAweDBFCiB9IGFjcGlfaW50ZXJwcmV0ZXJfbW9kZTsKIAotLyoKLSAqIFRoZSBOb2RlIGRlc2NyaWJlcyBhIG5hbWVkIG9iamVjdCB0aGF0IGFwcGVhcnMgaW4gdGhlIEFNTAotICogQW4gYWNwaV9ub2RlIGlzIHVzZWQgdG8gc3RvcmUgTm9kZXMuCi0gKgotICogZGF0YV90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLCBhbmQgTVVTVAotICogYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhpcyBzdHJ1Y3R1cmUuCi0gKi8KIHVuaW9uIGFjcGlfbmFtZV91bmlvbiB7CiAJdTMyIGludGVnZXI7CiAJY2hhciBhc2NpaVs0XTsKIH07CiAKKy8qCisgKiBUaGUgTmFtZXNwYWNlIE5vZGUgZGVzY3JpYmVzIGEgbmFtZWQgb2JqZWN0IHRoYXQgYXBwZWFycyBpbiB0aGUgQU1MLgorICogZGVzY3JpcHRvcl90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLgorICoKKyAqIFRoZSBub2RlIGlzIG9wdGltaXplZCBmb3IgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBwbGF0Zm9ybXM6CisgKiAyMCBieXRlcyBmb3IgdGhlIDMyLWJpdCBjYXNlLCAzMiBieXRlcyBmb3IgdGhlIDY0LWJpdCBjYXNlLgorICoKKyAqIE5vdGU6IFRoZSBkZXNjcmlwdG9yX3R5cGUgYW5kIFR5cGUgZmllbGRzIG11c3QgYXBwZWFyIGluIHRoZSBpZGVudGljYWwKKyAqIHBvc2l0aW9uIGluIGJvdGggdGhlIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlIGFuZCB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0CisgKiBzdHJ1Y3R1cmVzLgorICovCiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSB7Ci0JdTggZGVzY3JpcHRvcjsJCS8qIFVzZWQgdG8gZGlmZmVyZW50aWF0ZSBvYmplY3QgZGVzY3JpcHRvciB0eXBlcyAqLwotCXU4IHR5cGU7CQkvKiBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KLQl1MTYgcmVmZXJlbmNlX2NvdW50OwkvKiBDdXJyZW50IGNvdW50IG9mIHJlZmVyZW5jZXMgYW5kIGNoaWxkcmVuICovCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwkvKiBJbnRlcnByZXRlciBvYmplY3QgKi8KKwl1OCBkZXNjcmlwdG9yX3R5cGU7CS8qIERpZmZlcmVudGlhdGUgb2JqZWN0IGRlc2NyaXB0b3IgdHlwZXMgKi8KKwl1OCB0eXBlOwkJLyogQUNQSSBUeXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5hbWUgKi8KKwl1OCBmbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgZmxhZ3MgKi8KKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOwkvKiBOb2RlIGNyZWF0b3IgKi8KIAl1bmlvbiBhY3BpX25hbWVfdW5pb24gbmFtZTsJLyogQUNQSSBOYW1lLCBhbHdheXMgNCBjaGFycyBwZXIgQUNQSSBzcGVjICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqZWN0OwkvKiBQb2ludGVyIHRvIGF0dGFjaGVkIEFDUEkgb2JqZWN0IChvcHRpb25hbCkgKi8KIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqY2hpbGQ7CS8qIEZpcnN0IGNoaWxkICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBlZXI7CS8qIE5leHQgcGVlciAqLwotCXU4IG93bmVyX2lkOwkJLyogV2hvIGNyZWF0ZWQgdGhpcyBub2RlICovCi0JdTggZmxhZ3M7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnBlZXI7CS8qIFBlZXIuIFBhcmVudCBpZiBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUIHNldCAqLwogCi0JLyogRmllbGRzIHVzZWQgYnkgdGhlIEFTTCBjb21waWxlciBvbmx5ICovCi0KLSNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgotCXUzMiB2YWx1ZTsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSB1c2VkIGJ5IHRoZSBBU0wgY29tcGlsZXIgYW5kIGRpc2Fzc2VtYmxlciBvbmx5CisJICovCisjaWZkZWYgQUNQSV9MQVJHRV9OQU1FU1BBQ0VfTk9ERQogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsKKwl1MzIgdmFsdWU7CisJdTMyIGxlbmd0aDsKICNlbmRpZgogfTsKIAotI2RlZmluZSBBQ1BJX0VOVFJZX05PVF9GT1VORCAgICAgICAgICAgIE5VTEwKKy8qIE5hbWVzcGFjZSBOb2RlIGZsYWdzICovCiAKLS8qIE5vZGUgZmxhZ3MgKi8KKyNkZWZpbmUgQU5PQkpfRU5EX09GX1BFRVJfTElTVCAgICAgICAgICAweDAxCS8qIEVuZC1vZi1saXN0LCBQZWVyIGZpZWxkIHBvaW50cyB0byBwYXJlbnQgKi8KKyNkZWZpbmUgQU5PQkpfREFUQV9XSURUSF8zMiAgICAgICAgICAgICAweDAyCS8qIFBhcmVudCB0YWJsZSB1c2VzIDMyLWJpdCBtYXRoICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9BUkcgICAgICAgICAgICAgICAgMHgwNAkvKiBOb2RlIGlzIGEgbWV0aG9kIGFyZ3VtZW50ICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9MT0NBTCAgICAgICAgICAgICAgMHgwOAkvKiBOb2RlIGlzIGEgbWV0aG9kIGxvY2FsICovCisjZGVmaW5lIEFOT0JKX1NVQlRSRUVfSEFTX0lOSSAgICAgICAgICAgMHgxMAkvKiBVc2VkIHRvIG9wdGltaXplIGRldmljZSBpbml0aWFsaXphdGlvbiAqLwogCi0jZGVmaW5lIEFOT0JKX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBTk9CSl9FTkRfT0ZfUEVFUl9MSVNUICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQU5PQkpfREFUQV9XSURUSF8zMiAgICAgICAgICAgICAweDA0CS8qIFBhcmVudCB0YWJsZSBpcyA2NC1iaXRzICovCi0jZGVmaW5lIEFOT0JKX01FVEhPRF9BUkcgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBBTk9CSl9NRVRIT0RfTE9DQUwgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQU5PQkpfTUVUSE9EX05PX1JFVFZBTCAgICAgICAgICAweDIwCi0jZGVmaW5lIEFOT0JKX01FVEhPRF9TT01FX05PX1JFVFZBTCAgICAgMHg0MAotI2RlZmluZSBBTk9CSl9JU19CSVRfT0ZGU0VUICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQU5PQkpfSVNfRVhURVJOQUwgICAgICAgICAgICAgICAweDA4CS8qIGlfYVNMIG9ubHk6IFRoaXMgb2JqZWN0IGNyZWF0ZWQgdmlhIEV4dGVybmFsKCkgKi8KKyNkZWZpbmUgQU5PQkpfTUVUSE9EX05PX1JFVFZBTCAgICAgICAgICAweDEwCS8qIGlfYVNMIG9ubHk6IE1ldGhvZCBoYXMgbm8gcmV0dXJuIHZhbHVlICovCisjZGVmaW5lIEFOT0JKX01FVEhPRF9TT01FX05PX1JFVFZBTCAgICAgMHgyMAkvKiBpX2FTTCBvbmx5OiBNZXRob2QgaGFzIGF0IGxlYXN0IG9uZSByZXR1cm4gdmFsdWUgKi8KKyNkZWZpbmUgQU5PQkpfSVNfQklUX09GRlNFVCAgICAgICAgICAgICAweDQwCS8qIGlfYVNMIG9ubHk6IFJlZmVyZW5jZSBpcyBhIGJpdCBvZmZzZXQgKi8KKyNkZWZpbmUgQU5PQkpfSVNfUkVGRVJFTkNFRCAgICAgICAgICAgICAweDgwCS8qIGlfYVNMIG9ubHk6IE9iamVjdCB3YXMgcmVmZXJlbmNlZCAqLwogCiAvKgogICogQUNQSSBUYWJsZSBEZXNjcmlwdG9yLiAgT25lIHBlciBBQ1BJIHRhYmxlCkBAIC0yMTIsOCArMjI2LDggQEAKIAlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnBvaW50ZXI7CiAJdTggKmFtbF9zdGFydDsKIAl1NjQgcGh5c2ljYWxfYWRkcmVzczsKLQl1MzIgYW1sX2xlbmd0aDsKIAlhY3BpX3NpemUgbGVuZ3RoOworCXUzMiBhbWxfbGVuZ3RoOwogCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CiAJdTggdHlwZTsKIAl1OCBhbGxvY2F0aW9uOwpAQCAtMjc2LDYgKzI5MCw5IEBACiAJdTggZmllbGRfdHlwZTsKIH07CiAKK3R5cGVkZWYKK2FjcGlfc3RhdHVzKCpBQ1BJX0lOVEVSTkFMX01FVEhPRCkgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKTsKKwogLyoKICAqIEJpdG1hcHBlZCBBQ1BJIHR5cGVzLiAgVXNlZCBpbnRlcm5hbGx5IG9ubHkKICAqLwpAQCAtMzc3LDcgKzM5NCw3IEBACiAJc3RydWN0IGFjcGlfZ3BlX2Jsb2NrX2luZm8gKmdwZV9ibG9jazsKIH07CiAKLXR5cGVkZWYgYWNwaV9zdGF0dXMoKkFDUElfR1BFX0NBTExCQUNLKSAoc3RydWN0IGFjcGlfZ3BlX3hydXB0X2luZm8gKgordHlwZWRlZiBhY3BpX3N0YXR1cygqYWNwaV9ncGVfY2FsbGJhY2spIChzdHJ1Y3QgYWNwaV9ncGVfeHJ1cHRfaW5mbyAqCiAJCQkJCSBncGVfeHJ1cHRfaW5mbywKIAkJCQkJIHN0cnVjdCBhY3BpX2dwZV9ibG9ja19pbmZvICoKIAkJCQkJIGdwZV9ibG9jayk7CkBAIC00MTYsMTMgKzQzMywxNCBAQAogI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX0ZBTFNFICAgICAgICAgMHhDMwogI2RlZmluZSBBQ1BJX0NPTlRST0xfUFJFRElDQVRFX1RSVUUgICAgICAgICAgMHhDNAogCi0jZGVmaW5lIEFDUElfU1RBVEVfQ09NTU9OICAgLyogVHdvIDMyLWJpdCBmaWVsZHMgYW5kIGEgcG9pbnRlciAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3R5cGU7ICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7ICAgICAgXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOyAgICAgIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgICBcCi0Jdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5leHQ7CisjZGVmaW5lIEFDUElfU1RBVEVfQ09NTU9OIFwKKwl2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0OyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7IC8qIFRvIGRpZmZlcmVudGlhdGUgdmFyaW91cyBpbnRlcm5hbCBvYmpzICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7IFwKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyBcCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZTsKKworCS8qIFRoZXJlIGFyZSAyIGJ5dGVzIGF2YWlsYWJsZSBoZXJlIHVudGlsIHRoZSBuZXh0IG5hdHVyYWwgYWxpZ25tZW50IGJvdW5kYXJ5ICovCiAKIHN0cnVjdCBhY3BpX2NvbW1vbl9zdGF0ZSB7CiBBQ1BJX1NUQVRFX0NPTU1PTn07CkBAIC00MzgsMTIgKzQ1NiwxMiBAQAogICogUGtnIHN0YXRlIC0gdXNlZCB0byB0cmF2ZXJzZSBuZXN0ZWQgcGFja2FnZSBzdHJ1Y3R1cmVzCiAgKi8KIHN0cnVjdCBhY3BpX3BrZ19zdGF0ZSB7Ci0JQUNQSV9TVEFURV9DT01NT04gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdDsKKwlBQ1BJX1NUQVRFX0NPTU1PTiB1MTYgaW5kZXg7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqc291cmNlX29iamVjdDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpkZXN0X29iamVjdDsKIAlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlOwogCXZvaWQgKnRoaXNfdGFyZ2V0X29iajsKIAl1MzIgbnVtX3BhY2thZ2VzOwotCXUxNiBpbmRleDsKIH07CiAKIC8qCkBAIC00NTEsMTAgKzQ2OSwxMCBAQAogICogQWxsb3dzIG5lc3Rpbmcgb2YgdGhlc2UgY29uc3RydWN0cwogICovCiBzdHJ1Y3QgYWNwaV9jb250cm9sX3N0YXRlIHsKLQlBQ1BJX1NUQVRFX0NPTU1PTiB1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqcHJlZGljYXRlX29wOworCUFDUElfU1RBVEVfQ09NTU9OIHUxNiBvcGNvZGU7CisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnByZWRpY2F0ZV9vcDsKIAl1OCAqYW1sX3ByZWRpY2F0ZV9zdGFydDsJLyogU3RhcnQgb2YgaWYvd2hpbGUgcHJlZGljYXRlICovCiAJdTggKnBhY2thZ2VfZW5kOwkvKiBFbmQgb2YgaWYvd2hpbGUgYmxvY2sgKi8KLQl1MTYgb3Bjb2RlOwogfTsKIAogLyoKQEAgLTQ2NSwxMSArNDgzLDExIEBACiB9OwogCiBzdHJ1Y3QgYWNwaV9wc2NvcGVfc3RhdGUgewotCUFDUElfU1RBVEVfQ09NTU9OIHVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpvcDsJLyogQ3VycmVudCBvcCBiZWluZyBwYXJzZWQgKi8KKwlBQ1BJX1NUQVRFX0NPTU1PTiB1MzIgYXJnX2NvdW50OwkvKiBOdW1iZXIgb2YgZml4ZWQgYXJndW1lbnRzICovCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKm9wOwkvKiBDdXJyZW50IG9wIGJlaW5nIHBhcnNlZCAqLwogCXU4ICphcmdfZW5kOwkJLyogQ3VycmVudCBhcmd1bWVudCBlbmQgKi8KIAl1OCAqcGtnX2VuZDsJCS8qIEN1cnJlbnQgcGFja2FnZSBlbmQgKi8KIAl1MzIgYXJnX2xpc3Q7CQkvKiBOZXh0IGFyZ3VtZW50IHRvIHBhcnNlICovCi0JdTMyIGFyZ19jb3VudDsJCS8qIE51bWJlciBvZiBmaXhlZCBhcmd1bWVudHMgKi8KIH07CiAKIC8qCkBAIC00NzcsMTAgKzQ5NSwxMCBAQAogICogc3RhdGVzIGFyZSBjcmVhdGVkIHdoZW4gdGhlcmUgYXJlIG5lc3RlZCBjb250cm9sIG1ldGhvZHMgZXhlY3V0aW5nLgogICovCiBzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgewotCUFDUElfU1RBVEVfQ09NTU9OIHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGVfbGlzdDsJLyogSGVhZCBvZiBsaXN0IG9mIHdhbGtfc3RhdGVzIGZvciB0aGlzIHRocmVhZCAqLworCUFDUElfU1RBVEVfQ09NTU9OIHU4IGN1cnJlbnRfc3luY19sZXZlbDsJLyogTXV0ZXggU3luYyAobmVzdGVkIGFjcXVpcmUpIGxldmVsICovCisJc3RydWN0IGFjcGlfd2Fsa19zdGF0ZSAqd2Fsa19zdGF0ZV9saXN0OwkvKiBIZWFkIG9mIGxpc3Qgb2Ygd2Fsa19zdGF0ZXMgZm9yIHRoaXMgdGhyZWFkICovCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqYWNxdWlyZWRfbXV0ZXhfbGlzdDsJLyogTGlzdCBvZiBhbGwgY3VycmVudGx5IGFjcXVpcmVkIG11dGV4ZXMgKi8KLQl1MzIgdGhyZWFkX2lkOwkJLyogUnVubmluZyB0aHJlYWQgSUQgKi8KLQl1OCBjdXJyZW50X3N5bmNfbGV2ZWw7CS8qIE11dGV4IFN5bmMgKG5lc3RlZCBhY3F1aXJlKSBsZXZlbCAqLworCWFjcGlfdGhyZWFkX2lkIHRocmVhZF9pZDsJLyogUnVubmluZyB0aHJlYWQgSUQgKi8KIH07CiAKIC8qCkBAIC00ODgsMTAgKzUwNiw5IEBACiAgKiBBTUwgYXJndW1lbnRzCiAgKi8KIHN0cnVjdCBhY3BpX3Jlc3VsdF92YWx1ZXMgewotCUFDUElfU1RBVEVfQ09NTU9OCi0JICAgIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjW0FDUElfT0JKX05VTV9PUEVSQU5EU107Ci0JdTggbnVtX3Jlc3VsdHM7CisJQUNQSV9TVEFURV9DT01NT04gdTggbnVtX3Jlc3VsdHM7CiAJdTggbGFzdF9pbnNlcnQ7CisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2NbQUNQSV9PQkpfTlVNX09QRVJBTkRTXTsKIH07CiAKIHR5cGVkZWYKQEAgLTU0Niw3ICs1NjMsNyBAQAogI2VuZGlmCiAJdTMyIHBhcnNlX2FyZ3M7CQkvKiBHcmFtbWFyL1BhcnNlIHRpbWUgYXJndW1lbnRzICovCiAJdTMyIHJ1bnRpbWVfYXJnczsJLyogSW50ZXJwcmV0IHRpbWUgYXJndW1lbnRzICovCi0JdTMyIGZsYWdzOwkJLyogTWlzYyBmbGFncyAqLworCXUxNiBmbGFnczsJCS8qIE1pc2MgZmxhZ3MgKi8KIAl1OCBvYmplY3RfdHlwZTsJCS8qIENvcnJlc3BvbmRpbmcgaW50ZXJuYWwgb2JqZWN0IHR5cGUgKi8KIAl1OCBjbGFzczsJCS8qIE9wY29kZSBjbGFzcyAqLwogCXU4IHR5cGU7CQkvKiBPcGNvZGUgdHlwZSAqLwpAQCAtNTYzLDI5ICs1ODAsMzEgQEAKIH07CiAKICNkZWZpbmUgQUNQSV9QQVJTRV9DT01NT04gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTsgICAgICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3Bjb2RlOyAgICAgLyogQU1MIG9wY29kZSAqL1wKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb2Zmc2V0OyAgICAgLyogT2Zmc2V0IG9mIGRlY2xhcmF0aW9uIGluIEFNTCAqL1wKLQl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAgICAgICAgICAgICAqcGFyZW50OyAgICAgICAgLyogUGFyZW50IG9wICovXAotCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgICAgICpuZXh0OyAgICAgICAgICAvKiBOZXh0IG9wICovXAorCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICAgICAgICAgKnBhcmVudDsgICAgICAgIC8qIFBhcmVudCBvcCAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLyogVHlwZSBvZiBPcCAqL1wKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtbF9vcGNvZGU7ICAgICAvKiBBTUwgb3Bjb2RlICovXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1sX29mZnNldDsgICAgIC8qIE9mZnNldCBvZiBkZWNsYXJhdGlvbiBpbiBBTUwgKi9cCisJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgICAgICAgICAqbmV4dDsgICAgICAgICAgLyogTmV4dCBvcCAqL1wKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICpub2RlOyAgICAgICAgICAvKiBGb3IgdXNlIGJ5IGludGVycHJldGVyICovXAorCXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUgICAgICAgICAgdmFsdWU7ICAgICAgICAgIC8qIFZhbHVlIG9yIGFyZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcGNvZGUgKi9cCiAJQUNQSV9ESVNBU01fT05MWV9NRU1CRVJTIChcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNtX2ZsYWdzOyAgIC8qIFVzZWQgZHVyaW5nIEFNTCBkaXNhc3NlbWJseSAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc21fb3Bjb2RlOyAgLyogU3VidHlwZSB1c2VkIGZvciBkaXNhc3NlbWJseSAqL1wKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3BfbmFtZVsxNl0pIC8qIE9wIG5hbWUgKGRlYnVnIG9ubHkpICovXAotCQkJICAgLyogTk9OLURFQlVHIG1lbWJlcnMgYmVsb3c6ICovXAotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICAgICAgICAgICpub2RlOyAgICAgICAgICAvKiBGb3IgdXNlIGJ5IGludGVycHJldGVyICovXAotCXVuaW9uIGFjcGlfcGFyc2VfdmFsdWUgICAgICAgICAgICAgIHZhbHVlOwkvKiBWYWx1ZSBvciBhcmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3Bjb2RlICovCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc21fZmxhZ3M7ICAgLyogVXNlZCBkdXJpbmcgQU1MIGRpc2Fzc2VtYmx5ICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYXNtX29wY29kZTsgIC8qIFN1YnR5cGUgdXNlZCBmb3IgZGlzYXNzZW1ibHkgKi9cCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWxfb3BfbmFtZVsxNl0pCS8qIE9wIG5hbWUgKGRlYnVnIG9ubHkpICovCiAKLSNkZWZpbmUgQUNQSV9EQVNNX0JVRkZFUiAgICAgICAgMHgwMAotI2RlZmluZSBBQ1BJX0RBU01fUkVTT1VSQ0UgICAgICAweDAxCi0jZGVmaW5lIEFDUElfREFTTV9TVFJJTkcgICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9EQVNNX1VOSUNPREUgICAgICAgMHgwMwotI2RlZmluZSBBQ1BJX0RBU01fRUlTQUlEICAgICAgICAweDA0Ci0jZGVmaW5lIEFDUElfREFTTV9NQVRDSE9QICAgICAgIDB4MDUKKyNkZWZpbmUgQUNQSV9EQVNNX0JVRkZFUiAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFDUElfREFTTV9SRVNPVVJDRSAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX0RBU01fU1RSSU5HICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9EQVNNX1VOSUNPREUgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFDUElfREFTTV9FSVNBSUQgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBQ1BJX0RBU01fTUFUQ0hPUCAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQUNQSV9EQVNNX0xOT1RfUFJFRklYICAgICAgICAgICAweDA2CisjZGVmaW5lIEFDUElfREFTTV9MTk9UX1NVRkZJWCAgICAgICAgICAgMHgwNworI2RlZmluZSBBQ1BJX0RBU01fSUdOT1JFICAgICAgICAgICAgICAgIDB4MDgKIAogLyoKLSAqIGdlbmVyaWMgb3BlcmF0aW9uIChmb3IgZXhhbXBsZTogIElmLCBXaGlsZSwgU3RvcmUpCisgKiBHZW5lcmljIG9wZXJhdGlvbiAoZm9yIGV4YW1wbGU6ICBJZiwgV2hpbGUsIFN0b3JlKQogICovCiBzdHJ1Y3QgYWNwaV9wYXJzZV9vYmpfY29tbW9uIHsKIEFDUElfUEFSU0VfQ09NTU9OfTsKQEAgLTYwMSw3ICs2MjAsNyBAQAogCXUzMiBuYW1lOwkJLyogNC1ieXRlIG5hbWUgb3IgemVybyBpZiBubyBuYW1lICovCiB9OwogCi0vKiBUaGUgcGFyc2Ugbm9kZSBpcyB0aGUgZnVuZGFtZW50YWwgZWxlbWVudCBvZiB0aGUgcGFyc2UgdHJlZSAqLworLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgYnkgdGhlIGlfYVNMIGNvbXBpbGVyIG9ubHkgKi8KIAogI2RlZmluZSBBQ1BJX01BWF9QQVJTRU9QX05BTUUgICAyMAogCkBAIC02NDMsNyArNjYyLDYgQEAKICAqIG1ldGhvZC4KICAqLwogc3RydWN0IGFjcGlfcGFyc2Vfc3RhdGUgewotCXUzMiBhbWxfc2l6ZTsKIAl1OCAqYW1sX3N0YXJ0OwkJLyogRmlyc3QgQU1MIGJ5dGUgKi8KIAl1OCAqYW1sOwkJLyogTmV4dCBBTUwgYnl0ZSAqLwogCXU4ICphbWxfZW5kOwkJLyogKGxhc3QgKyAxKSBBTUwgYnl0ZSAqLwpAQCAtNjUzLDIyICs2NzEsMjMgQEAKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqc3RhcnRfbm9kZTsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlOwkvKiBDdXJyZW50IHNjb3BlICovCiAJdW5pb24gYWNwaV9wYXJzZV9vYmplY3QgKnN0YXJ0X3Njb3BlOworCXUzMiBhbWxfc2l6ZTsKIH07CiAKIC8qIFBhcnNlIG9iamVjdCBmbGFncyAqLwogCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9HRU5FUklDICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9OQU1FRCAgICAgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9ERUZFUlJFRCAgICAgICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEFDUElfUEFSU0VPUF9CWVRFTElTVCAgICAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEFDUElfUEFSU0VPUF9JTl9DQUNIRSAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIEFDUElfUEFSU0VPUF9HRU5FUklDICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX1BBUlNFT1BfTkFNRUQgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9QQVJTRU9QX0RFRkVSUkVEICAgICAgICAgICAweDA0CisjZGVmaW5lIEFDUElfUEFSU0VPUF9CWVRFTElTVCAgICAgICAgICAgMHgwOAorI2RlZmluZSBBQ1BJX1BBUlNFT1BfSU5fQ0FDSEUgICAgICAgICAgIDB4ODAKIAogLyogUGFyc2Ugb2JqZWN0IGRpc2FzbV9mbGFncyAqLwogCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9JR05PUkUgICAgICAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9QQVJBTUxJU1QgICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFDUElfUEFSU0VPUF9FTVBUWV9URVJNTElTVCAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEFDUElfUEFSU0VPUF9TUEVDSUFMICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lIEFDUElfUEFSU0VPUF9JR05PUkUgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBQ1BJX1BBUlNFT1BfUEFSQU1MSVNUICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9QQVJTRU9QX0VNUFRZX1RFUk1MSVNUICAgICAweDA0CisjZGVmaW5lIEFDUElfUEFSU0VPUF9TUEVDSUFMICAgICAgICAgICAgMHgxMAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCkBAIC02NzYsOCArNjk1LDggQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBQQ0lfUk9PVF9ISURfU1RSSU5HICAgICAgICAgIlBOUDBBMDMiCi0jZGVmaW5lIFBDSV9FWFBSRVNTX1JPT1RfSElEX1NUUklORyAiUE5QMEEwOCIKKyNkZWZpbmUgUENJX1JPT1RfSElEX1NUUklORyAgICAgICAgICAgICAiUE5QMEEwMyIKKyNkZWZpbmUgUENJX0VYUFJFU1NfUk9PVF9ISURfU1RSSU5HICAgICAiUE5QMEEwOCIKIAogc3RydWN0IGFjcGlfYml0X3JlZ2lzdGVyX2luZm8gewogCXU4IHBhcmVudF9yZWdpc3RlcjsKQEAgLTcxMCwxMyArNzI5LDE0IEBACiAjZGVmaW5lIEFDUElfQklUTUFTS19QQ0lFWFBfV0FLRV9TVEFUVVMgICAgICAgICAweDQwMDAJLyogQUNQSSAzLjAgKi8KICNkZWZpbmUgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTICAgICAgICAgICAgICAgIDB4ODAwMAogCi0jZGVmaW5lIEFDUElfQklUTUFTS19BTExfRklYRURfU1RBVFVTICAgICAgICAgICAoQUNQSV9CSVRNQVNLX1RJTUVSX1NUQVRVUyAgICAgICAgICB8IFwKLQkJCSBBQ1BJX0JJVE1BU0tfQlVTX01BU1RFUl9TVEFUVVMgICAgIHwgXAotCQkJIEFDUElfQklUTUFTS19HTE9CQUxfTE9DS19TVEFUVVMgICAgfCBcCi0JCQkgQUNQSV9CSVRNQVNLX1BPV0VSX0JVVFRPTl9TVEFUVVMgICB8IFwKLQkJCSBBQ1BJX0JJVE1BU0tfU0xFRVBfQlVUVE9OX1NUQVRVUyAgIHwgXAotCQkJIEFDUElfQklUTUFTS19SVF9DTE9DS19TVEFUVVMgICAgICAgfCBcCi0JCQkgQUNQSV9CSVRNQVNLX1dBS0VfU1RBVFVTKQorI2RlZmluZSBBQ1BJX0JJVE1BU0tfQUxMX0ZJWEVEX1NUQVRVUyAgICAgICAgICAgKFwKKwlBQ1BJX0JJVE1BU0tfVElNRVJfU1RBVFVTICAgICAgICAgIHwgXAorCUFDUElfQklUTUFTS19CVVNfTUFTVEVSX1NUQVRVUyAgICAgfCBcCisJQUNQSV9CSVRNQVNLX0dMT0JBTF9MT0NLX1NUQVRVUyAgICB8IFwKKwlBQ1BJX0JJVE1BU0tfUE9XRVJfQlVUVE9OX1NUQVRVUyAgIHwgXAorCUFDUElfQklUTUFTS19TTEVFUF9CVVRUT05fU1RBVFVTICAgfCBcCisJQUNQSV9CSVRNQVNLX1JUX0NMT0NLX1NUQVRVUyAgICAgICB8IFwKKwlBQ1BJX0JJVE1BU0tfV0FLRV9TVEFUVVMpCiAKICNkZWZpbmUgQUNQSV9CSVRNQVNLX1RJTUVSX0VOQUJMRSAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBBQ1BJX0JJVE1BU0tfR0xPQkFMX0xPQ0tfRU5BQkxFICAgICAgICAgMHgwMDIwCkBAIC04MjAsNyArODQwLDcgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBBQ1BJX0FTQ0lJX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgMHgzMAorI2RlZmluZSBBQ1BJX0FTQ0lJX1pFUk8gICAgICAgICAgICAgICAgIDB4MzAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtODQyLDkgKzg2Miw5IEBACiAJdTMyIG9iamVjdHM7CiB9OwogCi0jZGVmaW5lIEFDUElfREJfUkVESVJFQ1RBQkxFX09VVFBVVCAgMHgwMQotI2RlZmluZSBBQ1BJX0RCX0NPTlNPTEVfT1VUUFVUICAgICAgIDB4MDIKLSNkZWZpbmUgQUNQSV9EQl9EVVBMSUNBVEVfT1VUUFVUICAgICAweDAzCisjZGVmaW5lIEFDUElfREJfUkVESVJFQ1RBQkxFX09VVFBVVCAgICAgMHgwMQorI2RlZmluZSBBQ1BJX0RCX0NPTlNPTEVfT1VUUFVUICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUNQSV9EQl9EVVBMSUNBVEVfT1VUUFVUICAgICAgICAweDAzCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTg1NCwxOCArODc0LDE4IEBACiAKIC8qIEVudHJ5IGZvciBhIG1lbW9yeSBhbGxvY2F0aW9uIChkZWJ1ZyBvbmx5KSAqLwogCi0jZGVmaW5lIEFDUElfTUVNX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEFDUElfTUVNX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEFDUElfTUFYX01PRFVMRV9OQU1FICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBBQ1BJX01FTV9NQUxMT0MgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFDUElfTUFYX01PRFVMRV9OQU1FICAgICAgICAgICAgMTYKIAogI2RlZmluZSBBQ1BJX0NPTU1PTl9ERUJVR19NRU1fSEVBREVSIFwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICAgICAqcHJldmlvdXM7IFwKLQlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICAgICAqbmV4dDsgXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU7IFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ7IFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOyBcCi0JY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlW0FDUElfTUFYX01PRFVMRV9OQU1FXTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGU7CisJc3RydWN0IGFjcGlfZGVidWdfbWVtX2Jsb2NrICAgICAqcHJldmlvdXM7IFwKKwlzdHJ1Y3QgYWNwaV9kZWJ1Z19tZW1fYmxvY2sgICAgICpuZXh0OyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplOyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ7IFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU7IFwKKwljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVtBQ1BJX01BWF9NT0RVTEVfTkFNRV07IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3R5cGU7CiAKIHN0cnVjdCBhY3BpX2RlYnVnX21lbV9oZWFkZXIgewogQUNQSV9DT01NT05fREVCVUdfTUVNX0hFQURFUn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNtYWNyb3MuaCBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCmluZGV4IGYyYmUyYTguLjM4ZjlhYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY21hY3Jvcy5oCkBAIC01Niw2ICs1NiwxMCBAQAogI2RlZmluZSBBQ1BJX0NMRUFSX0JJVCh0YXJnZXQsYml0KSAgICAgICgodGFyZ2V0KSAmPSB+KGJpdCkpCiAjZGVmaW5lIEFDUElfTUlOKGEsYikgICAgICAgICAgICAgICAgICAgKCgoYSk8KGIpKT8oYSk6KGIpKQogCisvKiBTaXplIGNhbGN1bGF0aW9uICovCisKKyNkZWZpbmUgQUNQSV9BUlJBWV9MRU5HVEgoeCkgICAgICAgICAgICAoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpCisKICNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggPT0gMTYKIAogLyoKQEAgLTk5LDcgKzEwMyw3IEBACiAgKiBwcmludGYoKSBmb3JtYXQgaGVscGVycwogICovCiAKLS8qIFNwbGl0IDY0LWJpdCBpbnRlZ2VyIGludG8gdHdvIDMyLWJpdCB2YWx1ZXMuIFVzZSB3aXRoICU4LjhYJTguOFggKi8KKy8qIFNwbGl0IDY0LWJpdCBpbnRlZ2VyIGludG8gdHdvIDMyLWJpdCB2YWx1ZXMuIFVzZSB3aXRoICU4LjhfeCU4LjhfeCAqLwogCiAjZGVmaW5lIEFDUElfRk9STUFUX1VJTlQ2NChpKSAgICAgICAgICAgQUNQSV9ISURXT1JEKGkpLEFDUElfTE9EV09SRChpKQogCkBAIC0xMzAsNyArMTM0LDYgQEAKICNkZWZpbmUgQUNQSV9UT19QT0lOVEVSKGkpICAgICAgICAgICAgICBBQ1BJX0FERF9QVFIgKHZvaWQsKHZvaWQgKikgTlVMTCwoYWNwaV9uYXRpdmVfdWludCkgaSkKICNkZWZpbmUgQUNQSV9UT19JTlRFR0VSKHApICAgICAgICAgICAgICBBQ1BJX1BUUl9ESUZGIChwLCh2b2lkICopIE5VTEwpCiAjZGVmaW5lIEFDUElfT0ZGU0VUKGQsZikgICAgICAgICAgICAgICAgKGFjcGlfc2l6ZSkgQUNQSV9QVFJfRElGRiAoJigoKGQgKikwKS0+ZiksKHZvaWQgKikgTlVMTCkKLSNkZWZpbmUgQUNQSV9GQURUX09GRlNFVChmKSAgICAgICAgICAgICBBQ1BJX09GRlNFVCAoRkFEVF9ERVNDUklQVE9SLCBmKQogCiAjaWYgQUNQSV9NQUNISU5FX1dJRFRIID09IDE2CiAjZGVmaW5lIEFDUElfU1RPUkVfUE9JTlRFUihkLHMpICAgICAgICAgQUNQSV9NT1ZFXzMyX1RPXzMyKGQscykKQEAgLTE0MSw2ICsxNDQsMTIgQEAKICNkZWZpbmUgQUNQSV9QVFJfVE9fUEhZU0FERFIoaSkgICAgICAgICBBQ1BJX1RPX0lOVEVHRVIoaSkKICNlbmRpZgogCisjaWZuZGVmIEFDUElfTUlTQUxJR05NRU5UX05PVF9TVVBQT1JURUQKKyNkZWZpbmUgQUNQSV9DT01QQVJFX05BTUUoYSxiKSAgICAgICAgICAoKkFDUElfQ0FTVF9QVFIgKHUzMiwoYSkpID09ICpBQ1BJX0NBU1RfUFRSICh1MzIsKGIpKSkKKyNlbHNlCisjZGVmaW5lIEFDUElfQ09NUEFSRV9OQU1FKGEsYikgICAgICAgICAgKCFBQ1BJX1NUUk5DTVAgKEFDUElfQ0FTVF9QVFIgKGNoYXIsKGEpKSwgQUNQSV9DQVNUX1BUUiAoY2hhciwoYikpLCBBQ1BJX05BTUVfU0laRSkpCisjZW5kaWYKKwogLyoKICAqIE1hY3JvcyBmb3IgbW92aW5nIGRhdGEgYXJvdW5kIHRvL2Zyb20gYnVmZmVycyB0aGF0IGFyZSBwb3NzaWJseSB1bmFsaWduZWQuCiAgKiBJZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgdGhlIHRyYW5zZmVyIG9mIHVuYWxpZ25lZCBkYXRhLCBqdXN0IGRvIHRoZSBzdG9yZS4KQEAgLTM0MSwyOSArMzUwLDMzIEBACiAvKgogICogUm91bmRpbmcgbWFjcm9zIChQb3dlciBvZiB0d28gYm91bmRhcmllcyBvbmx5KQogICovCi0jZGVmaW5lIEFDUElfUk9VTkRfRE9XTih2YWx1ZSxib3VuZGFyeSkgICAgICAoKChhY3BpX25hdGl2ZV91aW50KSh2YWx1ZSkpICYgXAorI2RlZmluZSBBQ1BJX1JPVU5EX0RPV04odmFsdWUsYm91bmRhcnkpICAgICAoKChhY3BpX25hdGl2ZV91aW50KSh2YWx1ZSkpICYgXAogCQkJCQkJCQkJCQkJKH4oKChhY3BpX25hdGl2ZV91aW50KSBib3VuZGFyeSktMSkpKQogCi0jZGVmaW5lIEFDUElfUk9VTkRfVVAodmFsdWUsYm91bmRhcnkpICAgICAgICAoKCgoYWNwaV9uYXRpdmVfdWludCkodmFsdWUpKSArIFwKKyNkZWZpbmUgQUNQSV9ST1VORF9VUCh2YWx1ZSxib3VuZGFyeSkgICAgICAgKCgoKGFjcGlfbmF0aXZlX3VpbnQpKHZhbHVlKSkgKyBcCiAJCQkJCQkJCQkJCQkoKChhY3BpX25hdGl2ZV91aW50KSBib3VuZGFyeSktMSkpICYgXAogCQkJCQkJCQkJCQkJKH4oKChhY3BpX25hdGl2ZV91aW50KSBib3VuZGFyeSktMSkpKQogCi0jZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT18zMl9CSVRTKGEpICAgICAgICBBQ1BJX1JPVU5EX0RPV04oYSw0KQotI2RlZmluZSBBQ1BJX1JPVU5EX0RPV05fVE9fNjRfQklUUyhhKSAgICAgICAgQUNQSV9ST1VORF9ET1dOKGEsOCkKLSNkZWZpbmUgQUNQSV9ST1VORF9ET1dOX1RPX05BVElWRV9XT1JEKGEpICAgIEFDUElfUk9VTkRfRE9XTihhLEFMSUdORURfQUREUkVTU19CT1VOREFSWSkKKy8qIE5vdGU6IHNpemVvZihhY3BpX25hdGl2ZV91aW50KSBldmFsdWF0ZXMgdG8gZWl0aGVyIDIsIDQsIG9yIDggKi8KIAotI2RlZmluZSBBQ1BJX1JPVU5EX1VQX3RvXzMyX2JJVFMoYSkgICAgICAgICAgQUNQSV9ST1VORF9VUChhLDQpCi0jZGVmaW5lIEFDUElfUk9VTkRfVVBfdG9fNjRfYklUUyhhKSAgICAgICAgICBBQ1BJX1JPVU5EX1VQKGEsOCkKLSNkZWZpbmUgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChhKSAgICAgIEFDUElfUk9VTkRfVVAoYSxBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkpCisjZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT18zMkJJVChhKSAgICAgICAgIEFDUElfUk9VTkRfRE9XTihhLDQpCisjZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT182NEJJVChhKSAgICAgICAgIEFDUElfUk9VTkRfRE9XTihhLDgpCisjZGVmaW5lIEFDUElfUk9VTkRfRE9XTl9UT19OQVRJVkVfV09SRChhKSAgIEFDUElfUk9VTkRfRE9XTihhLHNpemVvZihhY3BpX25hdGl2ZV91aW50KSkKIAotI2RlZmluZSBBQ1BJX1JPVU5EX0JJVFNfVVBfVE9fQllURVMoYSkgICAgICAgQUNQSV9ESVZfOCgoYSkgKyA3KQotI2RlZmluZSBBQ1BJX1JPVU5EX0JJVFNfRE9XTl9UT19CWVRFUyhhKSAgICAgQUNQSV9ESVZfOCgoYSkpCisjZGVmaW5lIEFDUElfUk9VTkRfVVBfVE9fMzJCSVQoYSkgICAgICAgICAgIEFDUElfUk9VTkRfVVAoYSw0KQorI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPXzY0QklUKGEpICAgICAgICAgICBBQ1BJX1JPVU5EX1VQKGEsOCkKKyNkZWZpbmUgQUNQSV9ST1VORF9VUF9UT19OQVRJVkVfV09SRChhKSAgICAgQUNQSV9ST1VORF9VUChhLHNpemVvZihhY3BpX25hdGl2ZV91aW50KSkKIAotI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPXzFLKGEpICAgICAgICAgICAgICAgKCgoYSkgKyAxMDIzKSA+PiAxMCkKKyNkZWZpbmUgQUNQSV9ST1VORF9CSVRTX1VQX1RPX0JZVEVTKGEpICAgICAgQUNQSV9ESVZfOCgoYSkgKyA3KQorI2RlZmluZSBBQ1BJX1JPVU5EX0JJVFNfRE9XTl9UT19CWVRFUyhhKSAgICBBQ1BJX0RJVl84KChhKSkKKworI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPXzFLKGEpICAgICAgICAgICAgICAoKChhKSArIDEwMjMpID4+IDEwKQogCiAvKiBHZW5lcmljIChub24tcG93ZXItb2YtdHdvKSByb3VuZGluZyAqLwogCi0jZGVmaW5lIEFDUElfUk9VTkRfVVBfVE8odmFsdWUsYm91bmRhcnkpICAgICAoKCh2YWx1ZSkgKyAoKGJvdW5kYXJ5KS0xKSkgLyAoYm91bmRhcnkpKQorI2RlZmluZSBBQ1BJX1JPVU5EX1VQX1RPKHZhbHVlLGJvdW5kYXJ5KSAgICAoKCh2YWx1ZSkgKyAoKGJvdW5kYXJ5KS0xKSkgLyAoYm91bmRhcnkpKQorCisjZGVmaW5lIEFDUElfSVNfTUlTQUxJR05FRCh2YWx1ZSkgICAgICAgICAgICgoKGFjcGlfbmF0aXZlX3VpbnQpdmFsdWUpICYgKHNpemVvZihhY3BpX25hdGl2ZV91aW50KS0xKSkKIAogLyoKICAqIEJpdG1hc2sgY3JlYXRpb24KQEAgLTM3MSwxMCArMzg0LDEwIEBACiAgKiBNQVNLX0JJVFNfQUJPVkUgY3JlYXRlcyBhIG1hc2sgc3RhcnRpbmcgQVQgdGhlIHBvc2l0aW9uIGFuZCBhYm92ZQogICogTUFTS19CSVRTX0JFTE9XIGNyZWF0ZXMgYSBtYXNrIHN0YXJ0aW5nIG9uZSBiaXQgQkVMT1cgdGhlIHBvc2l0aW9uCiAgKi8KLSNkZWZpbmUgQUNQSV9NQVNLX0JJVFNfQUJPVkUocG9zaXRpb24pICAgICAgICh+KChBQ1BJX0lOVEVHRVJfTUFYKSA8PCAoKHUzMikgKHBvc2l0aW9uKSkpKQotI2RlZmluZSBBQ1BJX01BU0tfQklUU19CRUxPVyhwb3NpdGlvbikgICAgICAgKChBQ1BJX0lOVEVHRVJfTUFYKSA8PCAoKHUzMikgKHBvc2l0aW9uKSkpCisjZGVmaW5lIEFDUElfTUFTS19CSVRTX0FCT1ZFKHBvc2l0aW9uKSAgICAgICh+KChBQ1BJX0lOVEVHRVJfTUFYKSA8PCAoKHUzMikgKHBvc2l0aW9uKSkpKQorI2RlZmluZSBBQ1BJX01BU0tfQklUU19CRUxPVyhwb3NpdGlvbikgICAgICAoKEFDUElfSU5URUdFUl9NQVgpIDw8ICgodTMyKSAocG9zaXRpb24pKSkKIAotI2RlZmluZSBBQ1BJX0lTX09DVEFMX0RJR0lUKGQpICAgICAgICAgICAgICAgKCgoY2hhcikoZCkgPj0gJzAnKSAmJiAoKGNoYXIpKGQpIDw9ICc3JykpCisjZGVmaW5lIEFDUElfSVNfT0NUQUxfRElHSVQoZCkgICAgICAgICAgICAgICgoKGNoYXIpKGQpID49ICcwJykgJiYgKChjaGFyKShkKSA8PSAnNycpKQogCiAvKiBCaXRmaWVsZHMgd2l0aGluIEFDUEkgcmVnaXN0ZXJzICovCiAKQEAgLTM5Niw4ICs0MDksOCBAQAogICoKICAqIFRoZSAiRGVzY3JpcHRvciIgZmllbGQgaXMgdGhlIGZpcnN0IGZpZWxkIGluIGJvdGggc3RydWN0dXJlcy4KICAqLwotI2RlZmluZSBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZCkgICAgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+ZGVzY3JpcHRvcl9pZCkKLSNkZWZpbmUgQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKGQsdCkgICAoKCh1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgKikodm9pZCAqKShkKSktPmRlc2NyaXB0b3JfaWQgPSB0KQorI2RlZmluZSBBQ1BJX0dFVF9ERVNDUklQVE9SX1RZUEUoZCkgICAgICgoKHVuaW9uIGFjcGlfZGVzY3JpcHRvciAqKSh2b2lkICopKGQpKS0+Y29tbW9uLmRlc2NyaXB0b3JfdHlwZSkKKyNkZWZpbmUgQUNQSV9TRVRfREVTQ1JJUFRPUl9UWVBFKGQsdCkgICAoKCh1bmlvbiBhY3BpX2Rlc2NyaXB0b3IgKikodm9pZCAqKShkKSktPmNvbW1vbi5kZXNjcmlwdG9yX3R5cGUgPSB0KQogCiAvKiBNYWNybyB0byB0ZXN0IHRoZSBvYmplY3QgdHlwZSAqLwogCkBAIC00ODYsNyArNDk5LDYgQEAKICNkZWZpbmUgQUNQSV9FUlJPUihwbGlzdCkKICNkZWZpbmUgQUNQSV9FUlJPUl9OQU1FU1BBQ0UocyxlKQogI2RlZmluZSBBQ1BJX0VSUk9SX01FVEhPRChzLG4scCxlKQotCiAjZW5kaWYKIAogLyoKQEAgLTUxNCwxMiArNTI2LDEyIEBACiAjZGVmaW5lIEFDUElfR0VUX0ZVTkNUSU9OX05BTUUgICAgICAgICAgX2FjcGlfZnVuY3Rpb25fbmFtZQogLyoKICAqIFRoZSBOYW1lIHBhcmFtZXRlciBzaG91bGQgYmUgdGhlIHByb2NlZHVyZSBuYW1lIGFzIGEgcXVvdGVkIHN0cmluZy4KLSAqIFRoaXMgaXMgZGVjbGFyZWQgYXMgYSBsb2NhbCBzdHJpbmcgKCJteV9mdW5jdGlvbl9uYW1lIikgc28gdGhhdCBpdCBjYW4KKyAqIFRoaXMgaXMgZGVjbGFyZWQgYXMgYSBsb2NhbCBzdHJpbmcgKCJNeUZ1bmN0aW9uTmFtZSIpIHNvIHRoYXQgaXQgY2FuCiAgKiBiZSBhbHNvIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIGV4aXQgbWFjcm9zIGJlbG93LgogICogTm90ZTogKGNvbnN0IGNoYXIpIGlzIHVzZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSBkZWJ1ZyBpbnRlcmZhY2VzCiAgKiBhbmQgbWFjcm9zIHN1Y2ggYXMgX19GVU5DVElPTl9fLgogICovCi0jZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShuYW1lKSAgICAgICAgY29uc3QgY2hhciAqX2FjcGlfZnVuY3Rpb25fbmFtZSA9IG5hbWU7CisjZGVmaW5lIEFDUElfRlVOQ1RJT05fTkFNRShuYW1lKSAgICAgICAgY29uc3QgY2hhciAqX2FjcGlfZnVuY3Rpb25fbmFtZSA9ICNuYW1lOwogCiAjZWxzZQogLyogQ29tcGlsZXIgc3VwcG9ydHMgX19GVU5DVElPTl9fIChvciBlcXVpdmFsZW50KSAtLSBJZ25vcmUgdGhpcyBtYWNybyAqLwpAQCAtNTI4LDEzICs1NDAsMTMgQEAKICNlbmRpZgogCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0UoYSkgICAgICAgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkJCSAgYWNwaV91dF90cmFjZShBQ1BJX0RFQlVHX1BBUkFNRVRFUlMpCisJCQkgIGFjcGlfdXRfdHJhY2UoQUNQSV9ERUJVR19QQVJBTUVURVJTKQogI2RlZmluZSBBQ1BJX0ZVTkNUSU9OX1RSQUNFX1BUUihhLGIpICAgIEFDUElfRlVOQ1RJT05fTkFNRShhKSBcCi0JCQkJCQkJCQkJCWFjcGlfdXRfdHJhY2VfcHRyKEFDUElfREVCVUdfUEFSQU1FVEVSUywodm9pZCAqKWIpCisJCQkJCSAgIGFjcGlfdXRfdHJhY2VfcHRyKEFDUElfREVCVUdfUEFSQU1FVEVSUywodm9pZCAqKWIpCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fVFJBQ0VfVTMyKGEsYikgICAgQUNQSV9GVU5DVElPTl9OQU1FKGEpIFwKLQkJCQkJCQkJCQkJYWNwaV91dF90cmFjZV91MzIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCh1MzIpYikKKwkJCQkJCQkgYWNwaV91dF90cmFjZV91MzIoQUNQSV9ERUJVR19QQVJBTUVURVJTLCh1MzIpYikKICNkZWZpbmUgQUNQSV9GVU5DVElPTl9UUkFDRV9TVFIoYSxiKSAgICBBQ1BJX0ZVTkNUSU9OX05BTUUoYSkgXAotCQkJCQkJCQkJCQlhY3BpX3V0X3RyYWNlX3N0cihBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKGNoYXIgKiliKQorCQkJCQkJCQkJICBhY3BpX3V0X3RyYWNlX3N0cihBQ1BJX0RFQlVHX1BBUkFNRVRFUlMsKGNoYXIgKiliKQogCiAjZGVmaW5lIEFDUElfRlVOQ1RJT05fRU5UUlkoKSAgICAgICAgICAgYWNwaV91dF90cmFja19zdGFja19wdHIoKQogCkBAIC01NDMsNyArNTU1LDcgQEAKICAqIFdBUk5JTkc6IFRoZXNlIG1hY3JvcyBpbmNsdWRlIGEgcmV0dXJuIHN0YXRlbWVudC4gIFRoaXMgaXMgdXN1YWxseSBjb25zaWRlcmVkCiAgKiBiYWQgZm9ybSwgYnV0IGhhdmluZyBhIHNlcGFyYXRlIGV4aXQgbWFjcm8gaXMgdmVyeSB1Z2x5IGFuZCBkaWZmaWN1bHQgdG8gbWFpbnRhaW4uCiAgKiBPbmUgb2YgdGhlIEZVTkNUSU9OX1RSQUNFIG1hY3JvcyBhYm92ZSBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVzZSBtYWNyb3MKLSAqIHNvIHRoYXQgIl9hY3BpX2Z1bmN0aW9uX25hbWUiIGlzIGRlZmluZWQuCisgKiBzbyB0aGF0ICJfQWNwaUZ1bmN0aW9uTmFtZSIgaXMgZGVmaW5lZC4KICAqCiAgKiBOb3RlOiB0aGUgRE9fV0hJTEUwIG1hY3JvIGlzIHVzZWQgdG8gcHJldmVudCBzb21lIGNvbXBpbGVycyBmcm9tIGNvbXBsYWluaW5nCiAgKiBhYm91dCB0aGVzZSBjb25zdHJ1Y3RzLgpAQCAtNjU0LDYgKzY2Niw3IEBACiAjZGVmaW5lIEFDUElfRFVNUF9TVEFDS19FTlRSWShhKQogI2RlZmluZSBBQ1BJX0RVTVBfT1BFUkFORFMoYSxiLGMsZCxlKQogI2RlZmluZSBBQ1BJX0RVTVBfRU5UUlkoYSxiKQorI2RlZmluZSBBQ1BJX0RVTVBfVEFCTEVTKGEsYikKICNkZWZpbmUgQUNQSV9EVU1QX1BBVEhOQU1FKGEsYixjLGQpCiAjZGVmaW5lIEFDUElfRFVNUF9SRVNPVVJDRV9MSVNUKGEpCiAjZGVmaW5lIEFDUElfRFVNUF9CVUZGRVIoYSxiKQpAQCAtNzA5LDE5ICs3MjIsMTkgQEAKIAogLyogTWVtb3J5IGFsbG9jYXRpb24gKi8KIAotI2RlZmluZSBBQ1BJX01FTV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fQ0FMTE9DQVRFKGEpICAgICAgICAgICBhY3BpX3V0X2NhbGxvY2F0ZSgoYWNwaV9zaXplKShhKSwgX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX29zX2ZyZWUoYSkKKyNkZWZpbmUgQUNQSV9BTExPQ0FURShhKSAgICAgICAgICAgIGFjcGlfdXRfYWxsb2NhdGUoKGFjcGlfc2l6ZSkoYSksX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKKyNkZWZpbmUgQUNQSV9BTExPQ0FURV9aRVJPRUQoYSkgICAgIGFjcGlfdXRfYWxsb2NhdGVfemVyb2VkKChhY3BpX3NpemUpKGEpLCBfQ09NUE9ORU5ULF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQorI2RlZmluZSBBQ1BJX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaV9vc19mcmVlKGEpCiAjZGVmaW5lIEFDUElfTUVNX1RSQUNLSU5HKGEpCiAKICNlbHNlCiAKIC8qIE1lbW9yeSBhbGxvY2F0aW9uICovCiAKLSNkZWZpbmUgQUNQSV9NRU1fQUxMT0NBVEUoYSkgICAgICAgICAgICBhY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjaygoYWNwaV9zaXplKShhKSxfQ09NUE9ORU5ULF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQotI2RlZmluZSBBQ1BJX01FTV9DQUxMT0NBVEUoYSkgICAgICAgICAgIGFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjaygoYWNwaV9zaXplKShhKSwgX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fRlJFRShhKSAgICAgICAgICAgICAgICBhY3BpX3V0X2ZyZWVfYW5kX3RyYWNrKGEsX0NPTVBPTkVOVCxfYWNwaV9tb2R1bGVfbmFtZSxfX0xJTkVfXykKLSNkZWZpbmUgQUNQSV9NRU1fVFJBQ0tJTkcoYSkgICAgICAgICAgICBhCisjZGVmaW5lIEFDUElfQUxMT0NBVEUoYSkgICAgICAgICAgICBhY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjaygoYWNwaV9zaXplKShhKSxfQ09NUE9ORU5ULF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQorI2RlZmluZSBBQ1BJX0FMTE9DQVRFX1pFUk9FRChhKSAgICAgYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWRfYW5kX3RyYWNrKChhY3BpX3NpemUpKGEpLCBfQ09NUE9ORU5ULF9hY3BpX21vZHVsZV9uYW1lLF9fTElORV9fKQorI2RlZmluZSBBQ1BJX0ZSRUUoYSkgICAgICAgICAgICAgICAgYWNwaV91dF9mcmVlX2FuZF90cmFjayhhLF9DT01QT05FTlQsX2FjcGlfbW9kdWxlX25hbWUsX19MSU5FX18pCisjZGVmaW5lIEFDUElfTUVNX1RSQUNLSU5HKGEpICAgICAgICBhCiAKICNlbmRpZgkJCQkvKiBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNuYW1lc3AuaCBiL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCmluZGV4IGI2NjdhODAuLjgzYjUyZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY25hbWVzcC5oCkBAIC02Myw2ICs2Myw4IEBACiAjZGVmaW5lIEFDUElfTlNfRE9OVF9PUEVOX1NDT1BFICAgICAweDAyCiAjZGVmaW5lIEFDUElfTlNfTk9fUEVFUl9TRUFSQ0ggICAgICAweDA0CiAjZGVmaW5lIEFDUElfTlNfRVJST1JfSUZfRk9VTkQgICAgICAweDA4CisjZGVmaW5lIEFDUElfTlNfUFJFRklYX0lTX1NDT1BFICAgICAweDEwCisjZGVmaW5lIEFDUElfTlNfRVhURVJOQUwgICAgICAgICAgICAweDIwCiAKICNkZWZpbmUgQUNQSV9OU19XQUxLX1VOTE9DSyAgICAgICAgIFRSVUUKICNkZWZpbmUgQUNQSV9OU19XQUxLX05PX1VOTE9DSyAgICAgIEZBTFNFCkBAIC0xNzEsMTkgKzE3MywxNyBAQAogLyoKICAqIG5zZXZhbCAtIE5hbWVzcGFjZSBldmFsdWF0aW9uIGZ1bmN0aW9ucwogICovCi1hY3BpX3N0YXR1cyBhY3BpX25zX2V2YWx1YXRlX2J5X2hhbmRsZShzdHJ1Y3QgYWNwaV9wYXJhbWV0ZXJfaW5mbyAqaW5mbyk7Ci0KLWFjcGlfc3RhdHVzCi1hY3BpX25zX2V2YWx1YXRlX2J5X25hbWUoY2hhciAqcGF0aG5hbWUsIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKLQotYWNwaV9zdGF0dXMKLWFjcGlfbnNfZXZhbHVhdGVfcmVsYXRpdmUoY2hhciAqcGF0aG5hbWUsIHN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvICppbmZvKTsKK2FjcGlfc3RhdHVzIGFjcGlfbnNfZXZhbHVhdGUoc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqaW5mbyk7CiAKIC8qCiAgKiBuc25hbWVzIC0gTmFtZSBhbmQgU2NvcGUgbWFuaXB1bGF0aW9uCiAgKi8KIHUzMiBhY3BpX25zX29wZW5zX3Njb3BlKGFjcGlfb2JqZWN0X3R5cGUgdHlwZSk7CiAKK3ZvaWQKK2FjcGlfbnNfYnVpbGRfZXh0ZXJuYWxfcGF0aChzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBhY3BpX3NpemUgc2l6ZSwgY2hhciAqbmFtZV9idWZmZXIpOworCiBjaGFyICphY3BpX25zX2dldF9leHRlcm5hbF9wYXRobmFtZShzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZSk7CiAKIGNoYXIgKmFjcGlfbnNfbmFtZV9vZl9jdXJyZW50X3Njb3BlKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKndhbGtfc3RhdGUpOwpAQCAtMTk2LDkgKzE5Niw5IEBACiBhY3BpX25zX3BhdHRlcm5fbWF0Y2goc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9ub2RlLCBjaGFyICpzZWFyY2hfZm9yKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfbnNfZ2V0X25vZGVfYnlfcGF0aChjaGFyICpleHRlcm5hbF9wYXRobmFtZSwKLQkJCSBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqaW5fcHJlZml4X25vZGUsCi0JCQkgdTMyIGZsYWdzLCBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqKm91dF9ub2RlKTsKK2FjcGlfbnNfZ2V0X25vZGUoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnByZWZpeF9ub2RlLAorCQkgY2hhciAqZXh0ZXJuYWxfcGF0aG5hbWUsCisJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqb3V0X25vZGUpOwogCiBhY3BpX3NpemUgYWNwaV9uc19nZXRfcGF0aG5hbWVfbGVuZ3RoKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlKTsKIApAQCAtMjQxLDEwICsyNDEsMTAgQEAKIAkJCSB1MzIgZmxhZ3MsIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0X25vZGUpOwogCiBhY3BpX3N0YXR1cwotYWNwaV9uc19zZWFyY2hfbm9kZSh1MzIgZW50cnlfbmFtZSwKLQkJICAgIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAotCQkgICAgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAotCQkgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKipyZXRfbm9kZSk7CithY3BpX25zX3NlYXJjaF9vbmVfc2NvcGUodTMyIGVudHJ5X25hbWUsCisJCQkgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgYWNwaV9vYmplY3RfdHlwZSB0eXBlLAorCQkJIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICoqcmV0X25vZGUpOwogCiB2b2lkCiBhY3BpX25zX2luc3RhbGxfbm9kZShzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICp3YWxrX3N0YXRlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmggYi9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaAppbmRleCBkMTMwY2ZlLi4xNzQ3ZDk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNvYmplY3QuaApAQCAtMSw3ICsxLDcgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIE5hbWU6IGFjb2JqZWN0LmggLSBEZWZpbml0aW9uIG9mIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgKEludGVybmFsIG9iamVjdCBvbmx5KQorICogTmFtZTogYWNvYmplY3QuaCAtIERlZmluaXRpb24gb2YgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgKEludGVybmFsIG9iamVjdCBvbmx5KQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtNDUsMTAgKzQ1LDEyIEBACiAjaWZuZGVmIF9BQ09CSkVDVF9ICiAjZGVmaW5lIF9BQ09CSkVDVF9ICiAKKy8qIGFjcGlzcmM6c3RydWN0X2RlZnMgLS0gZm9yIGFjcGlzcmMgY29udmVyc2lvbiAqLworCiAvKgotICogVGhlIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgaXMgdXNlZCB0byBwYXNzIEFNTCBvcGVyYW5kcyBmcm9tIHRoZSBkaXNwYXRjaGVyCisgKiBUaGUgdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCBpcyB1c2VkIHRvIHBhc3MgQU1MIG9wZXJhbmRzIGZyb20gdGhlIGRpc3BhdGNoZXIKICAqIHRvIHRoZSBpbnRlcnByZXRlciwgYW5kIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHZhcmlvdXMgaGFuZGxlcnMgc3VjaCBhcwotICogYWRkcmVzcyBzcGFjZSBoYW5kbGVycyBhbmQgbm90aWZ5IGhhbmRsZXJzLiAgVGhlIG9iamVjdCBpcyBhIGNvbnN0YW50CisgKiBhZGRyZXNzIHNwYWNlIGhhbmRsZXJzIGFuZCBub3RpZnkgaGFuZGxlcnMuIFRoZSBvYmplY3QgaXMgYSBjb25zdGFudAogICogc2l6ZSBpbiBvcmRlciB0byBhbGxvdyBpdCB0byBiZSBjYWNoZWQgYW5kIHJldXNlZC4KICAqLwogCkBAIC02MSwxNyArNjMsMjUgQEAKIC8qCiAgKiBDb21tb24gYXJlYSBmb3IgYWxsIG9iamVjdHMuCiAgKgotICogZGF0YV90eXBlIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGludGVybmFsIGRlc2NyaXB0b3JzLCBhbmQgTVVTVAotICogYmUgdGhlIGZpcnN0IGJ5dGUgaW4gdGhpcyBzdHJ1Y3R1cmUuCisgKiBkZXNjcmlwdG9yX3R5cGUgaXMgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW50ZXJuYWwgZGVzY3JpcHRvcnMsIGFuZAorICogbXVzdCBiZSBpbiB0aGUgc2FtZSBwbGFjZSBhY3Jvc3MgYWxsIGRlc2NyaXB0b3JzCisgKgorICogTm90ZTogVGhlIGRlc2NyaXB0b3JfdHlwZSBhbmQgVHlwZSBmaWVsZHMgbXVzdCBhcHBlYXIgaW4gdGhlIGlkZW50aWNhbAorICogcG9zaXRpb24gaW4gYm90aCB0aGUgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYW5kIHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QKKyAqIHN0cnVjdHVyZXMuCiAgKi8KLSNkZWZpbmUgQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiAgIC8qIFNJWkUvQUxJR05NRU5UOiAzMiBiaXRzLCBvbmUgcHRyIHBsdXMgdHJhaWxpbmcgOC1iaXQgZmxhZyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcjsgICAgICAgICAvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgICAgICAvKiBhY3BpX29iamVjdF90eXBlICovXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfY291bnQ7ICAgIC8qIEZvciBvYmplY3QgZGVsZXRpb24gbWFuYWdlbWVudCAqL1wKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKm5leHRfb2JqZWN0OyAgICAgICAvKiBPYmplY3RzIGxpbmtlZCB0byBwYXJlbnQgTlMgbm9kZSAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7CisjZGVmaW5lIEFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgXAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKm5leHRfb2JqZWN0OyAgICAgICAvKiBPYmplY3RzIGxpbmtlZCB0byBwYXJlbnQgTlMgbm9kZSAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsgICAgLyogVG8gZGlmZmVyZW50aWF0ZSB2YXJpb3VzIGludGVybmFsIG9ianMgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgICAgIC8qIGFjcGlfb2JqZWN0X3R5cGUgKi9cCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VfY291bnQ7ICAgIC8qIEZvciBvYmplY3QgZGVsZXRpb24gbWFuYWdlbWVudCAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOworCS8qCisJICogTm90ZTogVGhlcmUgYXJlIDMgYnl0ZXMgYXZhaWxhYmxlIGhlcmUgYmVmb3JlIHRoZQorCSAqIG5leHQgbmF0dXJhbCBhbGlnbm1lbnQgYm91bmRhcnkgKGZvciBib3RoIDMyLzY0IGNhc2VzKQorCSAqLwogCi0vKiBWYWx1ZXMgZm9yIGZsYWcgYnl0ZSBhYm92ZSAqLworLyogVmFsdWVzIGZvciBGbGFnIGJ5dGUgYWJvdmUgKi8KIAogI2RlZmluZSBBT1BPQkpfQU1MX0NPTlNUQU5UICAgICAgICAgMHgwMQogI2RlZmluZSBBT1BPQkpfU1RBVElDX1BPSU5URVIgICAgICAgMHgwMgpAQCAtNzksMzYgKzg5LDcgQEAKICNkZWZpbmUgQU9QT0JKX09CSkVDVF9JTklUSUFMSVpFRCAgIDB4MDgKICNkZWZpbmUgQU9QT0JKX1NFVFVQX0NPTVBMRVRFICAgICAgIDB4MTAKICNkZWZpbmUgQU9QT0JKX1NJTkdMRV9EQVRVTSAgICAgICAgIDB4MjAKLQotLyoKLSAqIENvbW1vbiBiaXRmaWVsZCBmb3IgdGhlIGZpZWxkIG9iamVjdHMKLSAqICJGaWVsZCBEYXR1bSIgIC0tIGEgZGF0dW0gZnJvbSB0aGUgYWN0dWFsIGZpZWxkIG9iamVjdAotICogIkJ1ZmZlciBEYXR1bSIgLS0gYSBkYXR1bSBmcm9tIGEgdXNlciBidWZmZXIsIHJlYWQgZnJvbSBvciB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWVsZAotICovCi0jZGVmaW5lIEFDUElfQ09NTU9OX0ZJRUxEX0lORk8gICAgICAvKiBTSVpFL0FMSUdOTUVOVDogMjQgYml0cyArIHRocmVlIDMyLWJpdCB2YWx1ZXMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2ZsYWdzOyAgICAgICAgLyogQWNjZXNzLCB1cGRhdGUsIGFuZCBsb2NrIGJpdHMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZTsgICAgICAgICAgLyogRnJvbSBhY2Nlc3NfYXMga2V5d29yZCAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2J5dGVfd2lkdGg7ICAvKiBSZWFkL1dyaXRlIHNpemUgaW4gYnl0ZXMgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9sZW5ndGg7ICAgICAgICAgLyogTGVuZ3RoIG9mIGZpZWxkIGluIGJpdHMgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfYnl0ZV9vZmZzZXQ7ICAgLyogQnl0ZSBvZmZzZXQgd2l0aGluIGNvbnRhaW5pbmcgb2JqZWN0ICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9maWVsZF9iaXRfb2Zmc2V0Oy8qIEJpdCBvZmZzZXQgd2l0aGluIGZpcnN0IGZpZWxkIGRhdHVtICgwLTYzKSAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF93aWR0aDsgICAvKiBSZWFkL1dyaXRlIHNpemUgaW4gYml0cyAoOC02NCkgKi9cCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAgICAgICAgICAgICAgLyogVmFsdWUgdG8gc3RvcmUgaW50byB0aGUgQmFuayBvciBJbmRleCByZWdpc3RlciAqL1wKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAgICAgICAgICAgICAgKm5vZGU7CS8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqLwotCi0vKgotICogRmllbGRzIGNvbW1vbiB0byBib3RoIFN0cmluZ3MgYW5kIEJ1ZmZlcnMKLSAqLwotI2RlZmluZSBBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLQotLyoKLSAqIENvbW1vbiBmaWVsZHMgZm9yIG9iamVjdHMgdGhhdCBzdXBwb3J0IEFTTCBub3RpZmljYXRpb25zCi0gKi8KLSNkZWZpbmUgQUNQSV9DT01NT05fTk9USUZZX0lORk8gXAotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgICAgICAgICAqc3lzdGVtX25vdGlmeTsgICAgIC8qIEhhbmRsZXIgZm9yIHN5c3RlbSBub3RpZmllcyAqL1wKLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICAgICAgICAgKmRldmljZV9ub3RpZnk7ICAgICAvKiBIYW5kbGVyIGZvciBkcml2ZXIgbm90aWZpZXMgKi9cCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAgICAgICAgICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciBBZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIEFPUE9CSl9JTlZBTElEICAgICAgICAgICAgICAweDQwCS8qIFVzZWQgaWYgaG9zdCBPUyB3b24ndCBhbGxvdyBhbiBvcF9yZWdpb24gYWRkcmVzcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgpAQCAtMTI1LDI1ICsxMDYsMzEgQEAKIAogLyoKICAqIE5vdGU6IFRoZSBTdHJpbmcgYW5kIEJ1ZmZlciBvYmplY3QgbXVzdCBiZSBpZGVudGljYWwgdGhyb3VnaCB0aGUgUG9pbnRlcgotICogZWxlbWVudC4gIFRoZXJlIGlzIGNvZGUgdGhhdCBkZXBlbmRzIG9uIHRoaXMuCisgKiBhbmQgbGVuZ3RoIGVsZW1lbnRzLiAgVGhlcmUgaXMgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhpcy4KKyAqCisgKiBGaWVsZHMgY29tbW9uIHRvIGJvdGggU3RyaW5ncyBhbmQgQnVmZmVycwogICovCisjZGVmaW5lIEFDUElfQ09NTU9OX0JVRkZFUl9JTkZPKF90eXBlKSBcCisJX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9pbnRlcjsgXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworCiBzdHJ1Y3QgYWNwaV9vYmplY3Rfc3RyaW5nIHsJLyogTnVsbCB0ZXJtaW5hdGVkLCBBU0NJSSBjaGFyYWN0ZXJzIG9ubHkgKi8KLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0JVRkZFUl9JTkZPIGNoYXIgKnBvaW50ZXI7CS8qIFN0cmluZyBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBzdHJpbmcgKi8KKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0JVRkZFUl9JTkZPKGNoYXIpCS8qIFN0cmluZyBpbiBBTUwgc3RyZWFtIG9yIGFsbG9jYXRlZCBzdHJpbmcgKi8KIH07CiAKIHN0cnVjdCBhY3BpX29iamVjdF9idWZmZXIgewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fQlVGRkVSX0lORk8gdTggKiBwb2ludGVyOwkvKiBCdWZmZXIgaW4gQU1MIHN0cmVhbSBvciBhbGxvY2F0ZWQgYnVmZmVyICovCi0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqLwotCXU4ICphbWxfc3RhcnQ7CisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9CVUZGRVJfSU5GTyh1OCkJLyogQnVmZmVyIGluIEFNTCBzdHJlYW0gb3IgYWxsb2NhdGVkIGJ1ZmZlciAqLwogCXUzMiBhbWxfbGVuZ3RoOworCXU4ICphbWxfc3RhcnQ7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqLwogfTsKIAogc3RydWN0IGFjcGlfb2JqZWN0X3BhY2thZ2UgewotCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgdTMyIGNvdW50OwkvKiAjIG9mIGVsZW1lbnRzIGluIHBhY2thZ2UgKi8KLQl1MzIgYW1sX2xlbmd0aDsKLQl1OCAqYW1sX3N0YXJ0OwotCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwkvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOwkvKiBMaW5rIGJhY2sgdG8gcGFyZW50IG5vZGUgKi8KIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqZWxlbWVudHM7CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIGFjcGlfb2JqZWN0cyAqLworCXU4ICphbWxfc3RhcnQ7CisJdTMyIGFtbF9sZW5ndGg7CisJdTMyIGNvdW50OwkJLyogIyBvZiBlbGVtZW50cyBpbiBwYWNrYWdlICovCiB9OwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNTYsMjMgKzE0Myw2IEBACiAJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB2b2lkICpzZW1hcGhvcmU7CiB9OwogCi0jZGVmaW5lIEFDUElfSU5GSU5JVEVfQ09OQ1VSUkVOQ1kgICAweEZGCi0KLXR5cGVkZWYKLWFjcGlfc3RhdHVzKCpBQ1BJX0lOVEVSTkFMX01FVEhPRCkgKHN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKiB3YWxrX3N0YXRlKTsKLQotc3RydWN0IGFjcGlfb2JqZWN0X21ldGhvZCB7Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiB1OCBtZXRob2RfZmxhZ3M7Ci0JdTggcGFyYW1fY291bnQ7Ci0JdTMyIGFtbF9sZW5ndGg7Ci0Jdm9pZCAqc2VtYXBob3JlOwotCXU4ICphbWxfc3RhcnQ7Ci0JQUNQSV9JTlRFUk5BTF9NRVRIT0QgaW1wbGVtZW50YXRpb247Ci0JdTggY29uY3VycmVuY3k7Ci0JdTggdGhyZWFkX2NvdW50OwotCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7Ci19OwotCiBzdHJ1Y3QgYWNwaV9vYmplY3RfbXV0ZXggewogCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgdTggc3luY19sZXZlbDsJLyogMC0xNSwgc3BlY2lmaWVkIGluIE11dGV4KCkgY2FsbCAqLwogCXUxNiBhY3F1aXNpdGlvbl9kZXB0aDsJLyogQWxsb3cgbXVsdGlwbGUgQWNxdWlyZXMsIHNhbWUgdGhyZWFkICovCkBAIC0xODYsMTEgKzE1NiwyMyBAQAogCiBzdHJ1Y3QgYWNwaV9vYmplY3RfcmVnaW9uIHsKIAlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHNwYWNlX2lkOwotCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXI7CS8qIEhhbmRsZXIgZm9yIHJlZ2lvbiBhY2Nlc3MgKi8KIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsJLyogQ29udGFpbmluZyBuYW1lc3BhY2Ugbm9kZSAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKmhhbmRsZXI7CS8qIEhhbmRsZXIgZm9yIHJlZ2lvbiBhY2Nlc3MgKi8KIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpuZXh0OwotCXUzMiBsZW5ndGg7CiAJYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3M7CisJdTMyIGxlbmd0aDsKK307CisKK3N0cnVjdCBhY3BpX29iamVjdF9tZXRob2QgeworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgdTggbWV0aG9kX2ZsYWdzOworCXU4IHBhcmFtX2NvdW50OworCXU4IGNvbmN1cnJlbmN5OworCXZvaWQgKnNlbWFwaG9yZTsKKwl1OCAqYW1sX3N0YXJ0OworCUFDUElfSU5URVJOQUxfTUVUSE9EIGltcGxlbWVudGF0aW9uOworCXUzMiBhbWxfbGVuZ3RoOworCXU4IHRocmVhZF9jb3VudDsKKwlhY3BpX293bmVyX2lkIG93bmVyX2lkOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTk5LDYgKzE4MSwxNCBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorLyoKKyAqIENvbW1vbiBmaWVsZHMgZm9yIG9iamVjdHMgdGhhdCBzdXBwb3J0IEFTTCBub3RpZmljYXRpb25zCisgKi8KKyNkZWZpbmUgQUNQSV9DT01NT05fTk9USUZZX0lORk8gXAorCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgICAgICAgKnN5c3RlbV9ub3RpZnk7ICAgICAvKiBIYW5kbGVyIGZvciBzeXN0ZW0gbm90aWZpZXMgKi9cCisJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAgICAgICAqZGV2aWNlX25vdGlmeTsgICAgIC8qIEhhbmRsZXIgZm9yIGRyaXZlciBub3RpZmllcyAqL1wKKwl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAgICAgICpoYW5kbGVyOwkvKiBIYW5kbGVyIGZvciBBZGRyZXNzIHNwYWNlICovCisKIHN0cnVjdCBhY3BpX29iamVjdF9ub3RpZnlfY29tbW9uIHsJLyogQ09NTU9OIE5PVElGWSBmb3IgUE9XRVIsIFBST0NFU1NPUiwgREVWSUNFLCBhbmQgVEhFUk1BTCAqLwogQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GT307CiAKQEAgLTIxMyw5ICsyMDMsOSBAQAogfTsKIAogc3RydWN0IGFjcGlfb2JqZWN0X3Byb2Nlc3NvciB7Ci0JQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBBQ1BJX0NPTU1PTl9OT1RJRllfSU5GTyB1MzIgcHJvY19pZDsKLQl1MzIgbGVuZ3RoOwotCWFjcGlfaW9fYWRkcmVzcyBhZGRyZXNzOworCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgdTggcHJvY19pZDsKKwl1OCBsZW5ndGg7CisJIEFDUElfQ09NTU9OX05PVElGWV9JTkZPIGFjcGlfaW9fYWRkcmVzcyBhZGRyZXNzOwogfTsKIAogc3RydWN0IGFjcGlfb2JqZWN0X3RoZXJtYWxfem9uZSB7CkBAIC0yMjcsOSArMjE3LDI0IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICogQ29tbW9uIGJpdGZpZWxkIGZvciB0aGUgZmllbGQgb2JqZWN0cworICogIkZpZWxkIERhdHVtIiAgLS0gYSBkYXR1bSBmcm9tIHRoZSBhY3R1YWwgZmllbGQgb2JqZWN0CisgKiAiQnVmZmVyIERhdHVtIiAtLSBhIGRhdHVtIGZyb20gYSB1c2VyIGJ1ZmZlciwgcmVhZCBmcm9tIG9yIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpZWxkCisgKi8KKyNkZWZpbmUgQUNQSV9DT01NT05fRklFTERfSU5GTyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9mbGFnczsgICAgICAgIC8qIEFjY2VzcywgdXBkYXRlLCBhbmQgbG9jayBiaXRzICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlOyAgICAgICAgICAvKiBGcm9tIGFjY2Vzc19hcyBrZXl3b3JkICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2J5dGVfd2lkdGg7ICAvKiBSZWFkL1dyaXRlIHNpemUgaW4gYnl0ZXMgKi9cCisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgICAgICAqbm9kZTsgICAgICAgICAgICAgIC8qIExpbmsgYmFjayB0byBwYXJlbnQgbm9kZSAqL1wKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9sZW5ndGg7ICAgICAgICAgLyogTGVuZ3RoIG9mIGZpZWxkIGluIGJpdHMgKi9cCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX2J5dGVfb2Zmc2V0OyAgIC8qIEJ5dGUgb2Zmc2V0IHdpdGhpbiBjb250YWluaW5nIG9iamVjdCAqL1wKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOyAgICAgICAgICAgICAgLyogVmFsdWUgdG8gc3RvcmUgaW50byB0aGUgQmFuayBvciBJbmRleCByZWdpc3RlciAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZpZWxkX2JpdF9vZmZzZXQ7LyogQml0IG9mZnNldCB3aXRoaW4gZmlyc3QgZmllbGQgZGF0dW0gKDAtNjMpICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzX2JpdF93aWR0aDsJLyogUmVhZC9Xcml0ZSBzaXplIGluIGJpdHMgKDgtNjQpICovCisKIHN0cnVjdCBhY3BpX29iamVjdF9maWVsZF9jb21tb24gewkvKiBDT01NT04gRklFTEQgKGZvciBCVUZGRVIsIFJFR0lPTiwgQkFOSywgYW5kIElOREVYIGZpZWxkcykgKi8KLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0ZJRUxEX0lORk8gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajsJLyogQ29udGFpbmluZyBPcGVyYXRpb24gUmVnaW9uIG9iamVjdCAqLwotCS8qIChSRUdJT04vQkFOSyBmaWVsZHMgb25seSkgKi8KKwlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIEFDUElfQ09NTU9OX0ZJRUxEX0lORk8gdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmVnaW9uX29iajsJLyogUGFyZW50IE9wZXJhdGlvbiBSZWdpb24gb2JqZWN0IChSRUdJT04vQkFOSyBmaWVsZHMgb25seSkgKi8KIH07CiAKIHN0cnVjdCBhY3BpX29iamVjdF9yZWdpb25fZmllbGQgewpAQCAtMjQ0LDcgKzI0OSw3IEBACiBzdHJ1Y3QgYWNwaV9vYmplY3RfaW5kZXhfZmllbGQgewogCUFDUElfT0JKRUNUX0NPTU1PTl9IRUFERVIgQUNQSV9DT01NT05fRklFTERfSU5GTwogCSAgICAvKgotCSAgICAgKiBObyAicmVnaW9uX29iaiIgcG9pbnRlciBuZWVkZWQgc2luY2UgdGhlIEluZGV4IGFuZCBEYXRhIHJlZ2lzdGVycworCSAgICAgKiBObyAiUmVnaW9uT2JqIiBwb2ludGVyIG5lZWRlZCBzaW5jZSB0aGUgSW5kZXggYW5kIERhdGEgcmVnaXN0ZXJzCiAJICAgICAqIGFyZSBlYWNoIGZpZWxkIGRlZmluaXRpb25zIHVudG8gdGhlbXNlbHZlcy4KIAkgICAgICovCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW5kZXhfb2JqOwkvKiBJbmRleCByZWdpc3RlciAqLwpAQCAtMjY5LDEzICsyNzQsOSBAQAogCXZvaWQgKmNvbnRleHQ7CiB9OwogCi0vKiBGbGFncyBmb3IgYWRkcmVzcyBoYW5kbGVyICovCi0KLSNkZWZpbmUgQUNQSV9BRERSX0hBTkRMRVJfREVGQVVMVF9JTlNUQUxMRUQgIDB4MQotCiBzdHJ1Y3QgYWNwaV9vYmplY3RfYWRkcl9oYW5kbGVyIHsKIAlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHNwYWNlX2lkOwotCXUxNiBoZmxhZ3M7CisJdTggaGFuZGxlcl9mbGFnczsKIAlhY3BpX2Fkcl9zcGFjZV9oYW5kbGVyIGhhbmRsZXI7CiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CS8qIFBhcmVudCBkZXZpY2UgKi8KIAl2b2lkICpjb250ZXh0OwpAQCAtMjg0LDYgKzI4NSwxMCBAQAogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQ7CiB9OwogCisvKiBGbGFncyBmb3IgYWRkcmVzcyBoYW5kbGVyIChoYW5kbGVyX2ZsYWdzKSAqLworCisjZGVmaW5lIEFDUElfQUREUl9IQU5ETEVSX0RFRkFVTFRfSU5TVEFMTEVEICAweDAxCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBTcGVjaWFsIGludGVybmFsIG9iamVjdHMKQEAgLTI5NywxMCArMzAyLDEwIEBACiBzdHJ1Y3QgYWNwaV9vYmplY3RfcmVmZXJlbmNlIHsKIAlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHRhcmdldF90eXBlOwkvKiBVc2VkIGZvciBpbmRleF9vcCAqLwogCXUxNiBvcGNvZGU7Ci0JdTMyIG9mZnNldDsJCS8qIFVzZWQgZm9yIGFyZ19vcCwgbG9jYWxfb3AsIGFuZCBpbmRleF9vcCAqLwotCXZvaWQgKm9iamVjdDsJCS8qIG5hbWVfb3A9PkhBTkRMRSB0byBvYmosIGluZGV4X29wPT51bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICAqLworCXZvaWQgKm9iamVjdDsJCS8qIG5hbWVfb3A9PkhBTkRMRSB0byBvYmosIGluZGV4X29wPT51bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICovCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGU7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKndoZXJlOworCXUzMiBvZmZzZXQ7CQkvKiBVc2VkIGZvciBhcmdfb3AsIGxvY2FsX29wLCBhbmQgaW5kZXhfb3AgKi8KIH07CiAKIC8qCkBAIC0zMTEsMTIgKzMxNiwxMCBAQAogICogQ3VycmVudGx5OiBSZWdpb24gYW5kIGZpZWxkX3VuaXQgdHlwZXMKICAqLwogc3RydWN0IGFjcGlfb2JqZWN0X2V4dHJhIHsKLQlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IGJ5dGVfZmlsbDE7Ci0JdTE2IHdvcmRfZmlsbDE7Ci0JdTMyIGFtbF9sZW5ndGg7Ci0JdTggKmFtbF9zdGFydDsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX1JFRzsJLyogX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uIChpZiBhbnkpICovCisJQUNQSV9PQkpFQ1RfQ09NTU9OX0hFQURFUiBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbWV0aG9kX1JFRzsJLyogX1JFRyBtZXRob2QgZm9yIHRoaXMgcmVnaW9uIChpZiBhbnkpICovCiAJdm9pZCAqcmVnaW9uX2NvbnRleHQ7CS8qIFJlZ2lvbi1zcGVjaWZpYyBkYXRhICovCisJdTggKmFtbF9zdGFydDsKKwl1MzIgYW1sX2xlbmd0aDsKIH07CiAKIC8qIEFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byBuYW1lc3BhY2Ugbm9kZXMgKi8KQEAgLTM5MSw4ICszOTQsMTMgQEAKICNkZWZpbmUgQUNQSV9ERVNDX1RZUEVfTkFNRUQgICAgICAgICAgICAweDBGCiAjZGVmaW5lIEFDUElfREVTQ19UWVBFX01BWCAgICAgICAgICAgICAgMHgwRgogCitzdHJ1Y3QgYWNwaV9jb21tb25fZGVzY3JpcHRvciB7CisJdm9pZCAqY29tbW9uX3BvaW50ZXI7CisJdTggZGVzY3JpcHRvcl90eXBlOwkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqLworfTsKKwogdW5pb24gYWNwaV9kZXNjcmlwdG9yIHsKLQl1OCBkZXNjcmlwdG9yX2lkOwkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqLworCXN0cnVjdCBhY3BpX2NvbW1vbl9kZXNjcmlwdG9yIGNvbW1vbjsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0IG9iamVjdDsKIAlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBub2RlOwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0IG9wOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2Fjb3Bjb2RlLmggYi9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaAppbmRleCBlNmQ3OGJkLi43NjU5YTQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNvcGNvZGUuaApAQCAtOTQsNyArOTQsNyBAQAogI2RlZmluZSBBUkdQX0NPTkNBVF9SRVNfT1AgICAgICAgICAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX1RBUkdFVCkKICNkZWZpbmUgQVJHUF9DT05EX1JFRl9PRl9PUCAgICAgICAgICAgICBBUkdQX0xJU1QyIChBUkdQX1NVUEVSTkFNRSwgIEFSR1BfU1VQRVJOQU1FKQogI2RlZmluZSBBUkdQX0NPTlRJTlVFX09QICAgICAgICAgICAgICAgIEFSR19OT05FCi0jZGVmaW5lIEFSR1BfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9TVVBFUk5BTUUsICBBUkdQX1NJTVBMRU5BTUUpCisjZGVmaW5lIEFSR1BfQ09QWV9PUCAgICAgICAgICAgICAgICAgICAgQVJHUF9MSVNUMiAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1NJTVBMRU5BTUUpCiAjZGVmaW5lIEFSR1BfQ1JFQVRFX0JJVF9GSUVMRF9PUCAgICAgICAgQVJHUF9MSVNUMyAoQVJHUF9URVJNQVJHLCAgICBBUkdQX1RFUk1BUkcsICAgICAgIEFSR1BfTkFNRSkKICNkZWZpbmUgQVJHUF9DUkVBVEVfQllURV9GSUVMRF9PUCAgICAgICBBUkdQX0xJU1QzIChBUkdQX1RFUk1BUkcsICAgIEFSR1BfVEVSTUFSRywgICAgICAgQVJHUF9OQU1FKQogI2RlZmluZSBBUkdQX0NSRUFURV9EV09SRF9GSUVMRF9PUCAgICAgIEFSR1BfTElTVDMgKEFSR1BfVEVSTUFSRywgICAgQVJHUF9URVJNQVJHLCAgICAgICBBUkdQX05BTUUpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNvdXRwdXQuaCBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCmluZGV4IDc3ODVkNDguLjhkNTAzOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY291dHB1dC5oCkBAIC01MCw3ICs1MCw3IEBACiAgKiBjb21wb25lbnQgYmFzaXMgYW5kIGEgcGVyLWV4Y2VwdGlvbi10eXBlIGJhc2lzLgogICovCiAKLS8qIENvbXBvbmVudCBJRHMgYXJlIHVzZWQgaW4gdGhlIGdsb2JhbCAiZGVidWdfbGF5ZXIiICovCisvKiBDb21wb25lbnQgSURzIGFyZSB1c2VkIGluIHRoZSBnbG9iYWwgIkRlYnVnTGF5ZXIiICovCiAKICNkZWZpbmUgQUNQSV9VVElMSVRJRVMgICAgICAgICAgICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgQUNQSV9IQVJEV0FSRSAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKQEAgLTEyMSw3ICsxMjEsNyBAQAogI2RlZmluZSBBQ1BJX0xWX0lOVEVSUlVQVFMgICAgICAgICAgMHgwODAwMDAwMAogI2RlZmluZSBBQ1BJX0xWX1ZFUkJPU0lUWTMgICAgICAgICAgMHgwRjAwMDAwMCB8IEFDUElfTFZfVkVSQk9TSVRZMgogCi0vKiBFeGNlcHRpb25hbGx5IHZlcmJvc2Ugb3V0cHV0IC0tIGFsc28gdXNlZCBpbiB0aGUgZ2xvYmFsICJkZWJ1Z19sZXZlbCIgKi8KKy8qIEV4Y2VwdGlvbmFsbHkgdmVyYm9zZSBvdXRwdXQgLS0gYWxzbyB1c2VkIGluIHRoZSBnbG9iYWwgIkRlYnVnTGV2ZWwiICAqLwogCiAjZGVmaW5lIEFDUElfTFZfQU1MX0RJU0FTU0VNQkxFICAgICAweDEwMDAwMDAwCiAjZGVmaW5lIEFDUElfTFZfVkVSQk9TRV9JTkZPICAgICAgICAweDIwMDAwMDAwCkBAIC0xMzUsNyArMTM1LDcgQEAKICAqLwogI2RlZmluZSBBQ1BJX0RFQlVHX0xFVkVMKGRsKSAgICAgICAgKHUzMikgZGwsQUNQSV9ERUJVR19QQVJBTUVURVJTCiAKLS8qIEV4Y2VwdGlvbiBsZXZlbCAtLSB1c2VkIGluIHRoZSBnbG9iYWwgImRlYnVnX2xldmVsIiAqLworLyogRXhjZXB0aW9uIGxldmVsIC0tIHVzZWQgaW4gdGhlIGdsb2JhbCAiRGVidWdMZXZlbCIgKi8KIAogI2RlZmluZSBBQ1BJX0RCX0lOSVQgICAgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9JTklUKQogI2RlZmluZSBBQ1BJX0RCX0RFQlVHX09CSkVDVCAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9ERUJVR19PQkpFQ1QpCkBAIC0xNDQsMTMgKzE0NCwxMyBAQAogCiAvKgogICogVGhlc2UgdHdvIGxldmVscyBhcmUgZXNzZW50aWFsbHkgb2Jzb2xldGUsIGFsbCBpbnN0YW5jZXMgaW4gdGhlCi0gKiBBQ1BJQ0EgY29yZSBjb2RlIGhhdmUgYmVlbiByZXBsYWNlZCBieSBSRVBPUlRfRVJST1IgYW5kIFJFUE9SVF9XQVJOSU5HCisgKiBBQ1BJQ0EgY29yZSBjb2RlIGhhdmUgYmVlbiByZXBsYWNlZCBieSBBQ1BJX0VSUk9SIGFuZCBBQ1BJX1dBUk5JTkcKICAqIChLZXB0IGhlcmUgYmVjYXVzZSBzb21lIGRyaXZlcnMgbWF5IHN0aWxsIHVzZSB0aGVtKQogICovCiAjZGVmaW5lIEFDUElfREJfRVJST1IgICAgICAgICAgICAgICBBQ1BJX0RFQlVHX0xFVkVMIChBQ1BJX0xWX0VSUk9SKQogI2RlZmluZSBBQ1BJX0RCX1dBUk4gICAgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9XQVJOKQogCi0vKiBUcmFjZSBsZXZlbCAtLSBhbHNvIHVzZWQgaW4gdGhlIGdsb2JhbCAiZGVidWdfbGV2ZWwiICovCisvKiBUcmFjZSBsZXZlbCAtLSBhbHNvIHVzZWQgaW4gdGhlIGdsb2JhbCAiRGVidWdMZXZlbCIgKi8KIAogI2RlZmluZSBBQ1BJX0RCX0lOSVRfTkFNRVMgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9JTklUX05BTUVTKQogI2RlZmluZSBBQ1BJX0RCX1RIUkVBRFMgICAgICAgICAgICAgQUNQSV9ERUJVR19MRVZFTCAoQUNQSV9MVl9USFJFQURTKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGFyc2VyLmggYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAppbmRleCA1YTFmZjQ4Li45ZDQ5ZDNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwYXJzZXIuaApAQCAtNDYsNyArNDYsNyBAQAogCiAjZGVmaW5lIE9QX0hBU19SRVRVUk5fVkFMVUUgICAgICAgICAgICAgMQogCi0vKiB2YXJpYWJsZSAjIGFyZ3VtZW50cyAqLworLyogVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4gVGhpcyBmaWVsZCBtdXN0IGJlIDMyIGJpdHMgKi8KIAogI2RlZmluZSBBQ1BJX1ZBUl9BUkdTICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWAogCkBAIC03MSw3ICs3MSw3IEBACiAvKgogICogcHN4ZmFjZSAtIFBhcnNlciBleHRlcm5hbCBpbnRlcmZhY2VzCiAgKi8KLWFjcGlfc3RhdHVzIGFjcGlfcHNfZXhlY3V0ZV9tZXRob2Qoc3RydWN0IGFjcGlfcGFyYW1ldGVyX2luZm8gKmluZm8pOworYWNwaV9zdGF0dXMgYWNwaV9wc19leGVjdXRlX21ldGhvZChzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvICppbmZvKTsKIAogLyoKICAqIHBzYXJncyAtIFBhcnNlIEFNTCBvcGNvZGUgYXJndW1lbnRzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9idXMuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCmluZGV4IDZkY2EzZDUuLmEyYjNlMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oCkBAIC0yNiw3ICsyNiw3IEBACiAjaWZuZGVmIF9fQUNQSV9CVVNfSF9fCiAjZGVmaW5lIF9fQUNQSV9CVVNfSF9fCiAKLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KIApAQCAtNTksNyArNTksNyBAQAogCiAjZGVmaW5lIEFDUElfQlVTX0ZJTEVfUk9PVAkiYWNwaSIKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfcm9vdF9kaXI7Ci1leHRlcm4gRkFEVF9ERVNDUklQVE9SIGFjcGlfZmFkdDsKK2V4dGVybiBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yIGFjcGlfZmFkdDsKIAogZW51bSBhY3BpX2J1c19yZW1vdmFsX3R5cGUgewogCUFDUElfQlVTX1JFTU9WQUxfTk9STUFMID0gMCwKQEAgLTE2OSw3ICsxNjksOCBAQAogCXUzMiBwb3dlcl9tYW5hZ2VhYmxlOjE7CiAJdTMyIHBlcmZvcm1hbmNlX21hbmFnZWFibGU6MTsKIAl1MzIgd2FrZV9jYXBhYmxlOjE7CS8qIFdha2V1cChfUFJXKSBzdXBwb3J0ZWQ/ICovCi0JdTMyIHJlc2VydmVkOjIwOworCXUzMiBmb3JjZV9wb3dlcl9zdGF0ZToxOworCXUzMiByZXNlcnZlZDoxOTsKIH07CiAKIC8qIEZpbGUgU3lzdGVtICovCkBAIC0yOTYsNiArMjk3LDcgQEAKIAlzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcjsKIAl2b2lkICpkcml2ZXJfZGF0YTsKIAlzdHJ1Y3Qga29iamVjdCBrb2JqOworCXN0cnVjdCBkZXZpY2UgZGV2OwogfTsKIAogI2RlZmluZSBhY3BpX2RyaXZlcl9kYXRhKGQpCSgoZCktPmRyaXZlcl9kYXRhKQpAQCAtMzI3LDcgKzMyOSw3IEBACiBpbnQgYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHU4IHR5cGUsIGludCBkYXRhKTsKIGludCBhY3BpX2J1c19yZWNlaXZlX2V2ZW50KHN0cnVjdCBhY3BpX2J1c19ldmVudCAqZXZlbnQpOwogaW50IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7Ci1pbnQgYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGFjcGlfZHJpdmVyICpkcml2ZXIpOwordm9pZCBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWNwaV9kcml2ZXIgKmRyaXZlcik7CiBpbnQgYWNwaV9idXNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqKmNoaWxkLCBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnBhcmVudCwKIAkJIGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOwogaW50IGFjcGlfYnVzX3RyaW0oc3RydWN0IGFjcGlfZGV2aWNlICpzdGFydCwgaW50IHJtZGV2aWNlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaCBiL2luY2x1ZGUvYWNwaS9hY3BpX251bWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ5ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfbnVtYS5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19BQ1BJX05VTUFfSAorI2RlZmluZSBfX0FDUElfTlVNQV9ICisKKyNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKy8qIFByb3hpbWl0eSBiaXRtYXAgbGVuZ3RoICovCisjaWYgTUFYX05VTU5PREVTID4gMjU2CisjZGVmaW5lIE1BWF9QWE1fRE9NQUlOUyBNQVhfTlVNTk9ERVMKKyNlbHNlCisjZGVmaW5lIE1BWF9QWE1fRE9NQUlOUyAoMjU2KSAvKiBPbGQgcHhtIHNwZWMgaXMgZGVmaW5lZCA4IGJpdCAqLworI2VuZGlmCisKK2V4dGVybiBpbnQgX19jcHVpbml0ZGF0YSBweG1fdG9fbm9kZV9tYXBbTUFYX1BYTV9ET01BSU5TXTsKK2V4dGVybiBpbnQgX19jcHVpbml0ZGF0YSBub2RlX3RvX3B4bV9tYXBbTUFYX05VTU5PREVTXTsKKworZXh0ZXJuIGludCBfX2NwdWluaXQgcHhtX3RvX25vZGUoaW50KTsKK2V4dGVybiBpbnQgX19jcHVpbml0IG5vZGVfdG9fcHhtKGludCk7CitleHRlcm4gaW50IF9fY3B1aW5pdCBhY3BpX21hcF9weG1fdG9fbm9kZShpbnQpOworZXh0ZXJuIHZvaWQgX19jcHVpbml0IGFjcGlfdW5tYXBfcHhtX3RvX25vZGUoaW50KTsKKworI2VuZGlmCQkJCS8qIENPTkZJR19BQ1BJX05VTUEgKi8KKyNlbmRpZgkJCQkvKiBfX0FDUF9OVU1BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKaW5kZXggOTcwZTlhNi4uOGY0NzNjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlvc3hmLmgKQEAgLTUwLDEyICs1MCwxNiBAQAogI2luY2x1ZGUgInBsYXRmb3JtL2FjZW52LmgiCiAjaW5jbHVkZSAiYWN0eXBlcy5oIgogCi0vKiBQcmlvcml0aWVzIGZvciBhY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24gKi8KKy8qIFR5cGVzIGZvciBhY3BpX29zX2V4ZWN1dGUgKi8KIAotI2RlZmluZSBPU0RfUFJJT1JJVFlfR1BFICAgICAgICAgICAgMQotI2RlZmluZSBPU0RfUFJJT1JJVFlfSElHSCAgICAgICAgICAgMgotI2RlZmluZSBPU0RfUFJJT1JJVFlfTUVEICAgICAgICAgICAgMwotI2RlZmluZSBPU0RfUFJJT1JJVFlfTE8gICAgICAgICAgICAgNAordHlwZWRlZiBlbnVtIHsKKwlPU0xfR0xPQkFMX0xPQ0tfSEFORExFUiwKKwlPU0xfTk9USUZZX0hBTkRMRVIsCisJT1NMX0dQRV9IQU5ETEVSLAorCU9TTF9ERUJVR0dFUl9USFJFQUQsCisJT1NMX0VDX1BPTExfSEFORExFUiwKKwlPU0xfRUNfQlVSU1RfSEFORExFUgorfSBhY3BpX2V4ZWN1dGVfdHlwZTsKIAogI2RlZmluZSBBQ1BJX05PX1VOSVRfTElNSVQgICAgICAgICAgKCh1MzIpIC0xKQogI2RlZmluZSBBQ1BJX01VVEVYX1NFTSAgICAgICAgICAgICAgMQpAQCAtMTYxLDEzICsxNjUsMTEgQEAKIC8qCiAgKiBUaHJlYWRzIGFuZCBTY2hlZHVsaW5nCiAgKi8KLXUzMiBhY3BpX29zX2dldF90aHJlYWRfaWQodm9pZCk7CithY3BpX3RocmVhZF9pZCBhY3BpX29zX2dldF90aHJlYWRfaWQodm9pZCk7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX29zX3F1ZXVlX2Zvcl9leGVjdXRpb24odTMyIHByaW9yaXR5LAotCQkJICAgIGFjcGlfb3NkX2V4ZWNfY2FsbGJhY2sgZnVuY3Rpb24sIHZvaWQgKmNvbnRleHQpOwotCi12b2lkIGFjcGlfb3Nfd2FpdF9ldmVudHNfY29tcGxldGUodm9pZCAqY29udGV4dCk7CithY3BpX29zX2V4ZWN1dGUoYWNwaV9leGVjdXRlX3R5cGUgdHlwZSwKKwkJYWNwaV9vc2RfZXhlY19jYWxsYmFjayBmdW5jdGlvbiwgdm9pZCAqY29udGV4dCk7CiAKIHZvaWQgYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSh2b2lkICpjb250ZXh0KTsKIApAQCAtMjE0LDYgKzIxNiwxMiBAQAogLyoKICAqIE1pc2NlbGxhbmVvdXMKICAqLworYWNwaV9zdGF0dXMgYWNwaV9vc192YWxpZGF0ZV9pbnRlcmZhY2UoY2hhciAqaW50ZXJmYWNlKTsKKworYWNwaV9zdGF0dXMKK2FjcGlfb3NfdmFsaWRhdGVfYWRkcmVzcyh1OCBzcGFjZV9pZCwKKwkJCSBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgYWRkcmVzcywgYWNwaV9zaXplIGxlbmd0aCk7CisKIHU4IGFjcGlfb3NfcmVhZGFibGUodm9pZCAqcG9pbnRlciwgYWNwaV9zaXplIGxlbmd0aCk7CiAKICNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQpAQCAtMjU1LDExICsyNjMsNCBAQAogCiB2b2lkIGFjcGlfb3NfY2xvc2VfZGlyZWN0b3J5KHZvaWQgKmRpcl9oYW5kbGUpOwogCi0vKgotICogRGVidWcKLSAqLwotdm9pZAotYWNwaV9vc19kYmdfYXNzZXJ0KHZvaWQgKmZhaWxlZF9hc3NlcnRpb24sCi0JCSAgIHZvaWQgKmZpbGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyLCBjaGFyICptZXNzYWdlKTsKLQogI2VuZGlmCQkJCS8qIF9fQUNQSU9TWEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmggYi9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKaW5kZXggNjZjZjJlYy4uMDQ5ZTlhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaApAQCAtMjY4LDcgKzI2OCw3IEBACiAgKiBSZXNvdXJjZSBpbnRlcmZhY2VzCiAgKi8KIHR5cGVkZWYKLWFjcGlfc3RhdHVzKCpBQ1BJX1dBTEtfUkVTT1VSQ0VfQ0FMTEJBQ0spIChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqIHJlc291cmNlLAorYWNwaV9zdGF0dXMoKmFjcGlfd2Fsa19yZXNvdXJjZV9jYWxsYmFjaykgKHN0cnVjdCBhY3BpX3Jlc291cmNlICogcmVzb3VyY2UsCiAJCQkJCSAgIHZvaWQgKmNvbnRleHQpOwogCiBhY3BpX3N0YXR1cwpAQCAtMjkwLDcgKzI5MCw3IEBACiBhY3BpX3N0YXR1cwogYWNwaV93YWxrX3Jlc291cmNlcyhhY3BpX2hhbmRsZSBkZXZpY2VfaGFuZGxlLAogCQkgICAgY2hhciAqbmFtZSwKLQkJICAgIEFDUElfV0FMS19SRVNPVVJDRV9DQUxMQkFDSyB1c2VyX2Z1bmN0aW9uLCB2b2lkICpjb250ZXh0KTsKKwkJICAgIGFjcGlfd2Fsa19yZXNvdXJjZV9jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLCB2b2lkICpjb250ZXh0KTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfc2V0X2N1cnJlbnRfcmVzb3VyY2VzKGFjcGlfaGFuZGxlIGRldmljZV9oYW5kbGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oIGIvaW5jbHVkZS9hY3BpL2FjcmVzcmMuaAppbmRleCBmYTAyZTgwLi5hZDExZmMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNyZXNyYy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Jlc3JjLmgKQEAgLTE2NCwyMyArMTY0LDI2IEBACiAvKgogICogcnN1dGlscwogICovCi1hY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJ0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfZ2V0X2Nyc19tZXRob2RfZGF0YShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CithY3BpX3JzX2dldF9wcnRfbWV0aG9kX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAotI2lmZGVmCUFDUElfRlVUVVJFX1VTQUdFCiBhY3BpX3N0YXR1cwotYWNwaV9yc19nZXRfcHJzX21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKLSNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLworYWNwaV9yc19nZXRfY3JzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CisKK2FjcGlfc3RhdHVzCithY3BpX3JzX2dldF9wcnNfbWV0aG9kX2RhdGEoc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IGFjcGlfYnVmZmVyICpyZXRfYnVmZmVyKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfcnNfZ2V0X21ldGhvZF9kYXRhKGFjcGlfaGFuZGxlIGhhbmRsZSwKIAkJCWNoYXIgKnBhdGgsIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIGFjcGlfc3RhdHVzCi1hY3BpX3JzX3NldF9zcnNfbWV0aG9kX2RhdGEoYWNwaV9oYW5kbGUgaGFuZGxlLCBzdHJ1Y3QgYWNwaV9idWZmZXIgKnJldF9idWZmZXIpOworYWNwaV9yc19zZXRfc3JzX21ldGhvZF9kYXRhKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlLAorCQkJICAgIHN0cnVjdCBhY3BpX2J1ZmZlciAqcmV0X2J1ZmZlcik7CiAKIC8qCiAgKiByc2NhbGMKQEAgLTE5OCw4ICsyMDEsOSBAQAogCQkJCSAgICAgYWNwaV9zaXplICogYnVmZmVyX3NpemVfbmVlZGVkKTsKIAogYWNwaV9zdGF0dXMKLWFjcGlfcnNfY29udmVydF9hbWxfdG9fcmVzb3VyY2VzKHU4ICogYW1sX2J1ZmZlciwKLQkJCQkgdTMyIGFtbF9idWZmZXJfbGVuZ3RoLCB1OCAqIG91dHB1dF9idWZmZXIpOworYWNwaV9yc19jb252ZXJ0X2FtbF90b19yZXNvdXJjZXModTggKiBhbWwsCisJCQkJIHUzMiBsZW5ndGgsCisJCQkJIHUzMiBvZmZzZXQsIHU4IHJlc291cmNlX2luZGV4LCB2b2lkICoqY29udGV4dCk7CiAKIGFjcGlfc3RhdHVzCiBhY3BpX3JzX2NvbnZlcnRfcmVzb3VyY2VzX3RvX2FtbChzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzb3VyY2UsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNzdHJ1Y3QuaCBiL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCmluZGV4IGQ4YzFjMmMuLjVlODA5NWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3N0cnVjdC5oCkBAIC00NCw2ICs0NCw4IEBACiAjaWZuZGVmIF9fQUNTVFJVQ1RfSF9fCiAjZGVmaW5lIF9fQUNTVFJVQ1RfSF9fCiAKKy8qIGFjcGlzcmM6c3RydWN0X2RlZnMgLS0gZm9yIGFjcGlzcmMgY29udmVyc2lvbiAqLworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUcmVlIHdhbGtpbmcgdHlwZWRlZnMgYW5kIHN0cnVjdHMKQEAgLTUxLDY3ICs1Myw3NiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBXYWxrIHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiBhIHBhcnNlIHRyZWUgd2Fsay4gIFVzZWQgZm9yIGJvdGggYSBsZWlzdXJlbHkgc3Ryb2xsIHRocm91Z2gKLSAqIHRoZSB0cmVlIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgYW5kIGZvciBjb250cm9sIG1ldGhvZCBleGVjdXRpb24uCisgKiBXYWxrIHN0YXRlIC0gY3VycmVudCBzdGF0ZSBvZiBhIHBhcnNlIHRyZWUgd2Fsay4gIFVzZWQgZm9yIGJvdGggYSBsZWlzdXJlbHkKKyAqIHN0cm9sbCB0aHJvdWdoIHRoZSB0cmVlIChmb3Igd2hhdGV2ZXIgcmVhc29uKSwgYW5kIGZvciBjb250cm9sIG1ldGhvZAorICogZXhlY3V0aW9uLgogICovCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9ET1dOV0FSRCAgICAgICAxCiAjZGVmaW5lIEFDUElfTkVYVF9PUF9VUFdBUkQgICAgICAgICAyCiAKKy8qCisgKiBHcm91cHMgb2YgZGVmaW5pdGlvbnMgZm9yIHdhbGtfdHlwZSB1c2VkIGZvciBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mCisgKiB3YWxrZXJzIChuZXZlciBzaW11bHRhbmVvdXNseSkgLSBmbGFncyBmb3IgaW50ZXJwcmV0ZXI6CisgKi8KICNkZWZpbmUgQUNQSV9XQUxLX05PTl9NRVRIT0QgICAgICAgIDAKLSNkZWZpbmUgQUNQSV9XQUxLX01FVEhPRCAgICAgICAgICAgIDEKLSNkZWZpbmUgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUICAgIDIKLSNkZWZpbmUgQUNQSV9XQUxLX0NPTlNUX1JFUVVJUkVEICAgIDMKLSNkZWZpbmUgQUNQSV9XQUxLX0NPTlNUX09QVElPTkFMICAgIDQKKyNkZWZpbmUgQUNQSV9XQUxLX01FVEhPRCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQUNQSV9XQUxLX01FVEhPRF9SRVNUQVJUICAgIDB4MDIKKworLyogRmxhZ3MgZm9yIGlfYVNMIGNvbXBpbGVyIG9ubHkgKi8KKworI2RlZmluZSBBQ1BJX1dBTEtfQ09OU1RfUkVRVUlSRUQgICAgMHgxMAorI2RlZmluZSBBQ1BJX1dBTEtfQ09OU1RfT1BUSU9OQUwgICAgMHgyMAogCiBzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlIHsKLQl1OCBkYXRhX3R5cGU7CQkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyBNVVNUIEJFIEZJUlNUISAqLworCXN0cnVjdCBhY3BpX3dhbGtfc3RhdGUgKm5leHQ7CS8qIE5leHQgd2Fsa19zdGF0ZSBpbiBsaXN0ICovCisJdTggZGVzY3JpcHRvcl90eXBlOwkvKiBUbyBkaWZmZXJlbnRpYXRlIHZhcmlvdXMgaW50ZXJuYWwgb2JqcyAqLwogCXU4IHdhbGtfdHlwZTsKLQlhY3BpX293bmVyX2lkIG93bmVyX2lkOwkvKiBPd25lciBvZiBvYmplY3RzIGNyZWF0ZWQgZHVyaW5nIHRoZSB3YWxrICovCi0JdTggbGFzdF9wcmVkaWNhdGU7CS8qIFJlc3VsdCBvZiBsYXN0IHByZWRpY2F0ZSAqLwotCXU4IGN1cnJlbnRfcmVzdWx0OwkvKiAqLworCXUxNiBvcGNvZGU7CQkvKiBDdXJyZW50IEFNTCBvcGNvZGUgKi8KIAl1OCBuZXh0X29wX2luZm87CS8qIEluZm8gYWJvdXQgbmV4dF9vcCAqLwogCXU4IG51bV9vcGVyYW5kczsJLyogU3RhY2sgcG9pbnRlciBmb3IgT3BlcmFuZHNbXSBhcnJheSAqLworCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7CS8qIE93bmVyIG9mIG9iamVjdHMgY3JlYXRlZCBkdXJpbmcgdGhlIHdhbGsgKi8KKwl1OCBsYXN0X3ByZWRpY2F0ZTsJLyogUmVzdWx0IG9mIGxhc3QgcHJlZGljYXRlICovCisJdTggY3VycmVudF9yZXN1bHQ7CiAJdTggcmV0dXJuX3VzZWQ7Ci0JdTE2IG9wY29kZTsJCS8qIEN1cnJlbnQgQU1MIG9wY29kZSAqLwogCXU4IHNjb3BlX2RlcHRoOwogCXU4IHBhc3NfbnVtYmVyOwkJLyogUGFyc2UgcGFzcyBkdXJpbmcgdGFibGUgbG9hZCAqLwotCXUzMiBhcmdfY291bnQ7CQkvKiBwdXNoIGZvciBmaXhlZCBvciB2YXIgYXJncyAqLwogCXUzMiBhbWxfb2Zmc2V0OwogCXUzMiBhcmdfdHlwZXM7CiAJdTMyIG1ldGhvZF9icmVha3BvaW50OwkvKiBGb3Igc2luZ2xlIHN0ZXBwaW5nICovCiAJdTMyIHVzZXJfYnJlYWtwb2ludDsJLyogVXNlciBBTUwgYnJlYWtwb2ludCAqLwogCXUzMiBwYXJzZV9mbGFnczsKKworCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlIHBhcnNlcl9zdGF0ZTsJLyogQ3VycmVudCBzdGF0ZSBvZiBwYXJzZXIgKi8KIAl1MzIgcHJldl9hcmdfdHlwZXM7CisJdTMyIGFyZ19jb3VudDsJCS8qIHB1c2ggZm9yIGZpeGVkIG9yIHZhciBhcmdzICovCisKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBhcmd1bWVudHNbQUNQSV9NRVRIT0RfTlVNX0FSR1NdOwkvKiBDb250cm9sIG1ldGhvZCBhcmd1bWVudHMgKi8KKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBsb2NhbF92YXJpYWJsZXNbQUNQSV9NRVRIT0RfTlVNX0xPQ0FMU107CS8qIENvbnRyb2wgbWV0aG9kIGxvY2FscyAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmRzW0FDUElfT0JKX05VTV9PUEVSQU5EUyArIDFdOwkvKiBPcGVyYW5kcyBwYXNzZWQgdG8gdGhlIGludGVycHJldGVyICgrMSBmb3IgTlVMTCB0ZXJtaW5hdG9yKSAqLworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKipwYXJhbXM7CiAKIAl1OCAqYW1sX2xhc3Rfd2hpbGU7Ci0Jc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgYXJndW1lbnRzW0FDUElfTUVUSE9EX05VTV9BUkdTXTsJLyogQ29udHJvbCBtZXRob2QgYXJndW1lbnRzICovCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKmNhbGxlcl9yZXR1cm5fZGVzYzsKIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKmNvbnRyb2xfc3RhdGU7CS8qIExpc3Qgb2YgY29udHJvbCBzdGF0ZXMgKG5lc3RlZCBJRnMpICovCiAJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKmRlZmVycmVkX25vZGU7CS8qIFVzZWQgd2hlbiBleGVjdXRpbmcgZGVmZXJyZWQgb3Bjb2RlcyAqLwogCXN0cnVjdCBhY3BpX2dwZV9ldmVudF9pbmZvICpncGVfZXZlbnRfaW5mbzsJLyogSW5mbyBmb3IgR1BFIChfTHh4L19FeHggbWV0aG9kcyBvbmx5ICovCiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqaW1wbGljaXRfcmV0dXJuX29iajsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSBsb2NhbF92YXJpYWJsZXNbQUNQSV9NRVRIT0RfTlVNX0xPQ0FMU107CS8qIENvbnRyb2wgbWV0aG9kIGxvY2FscyAqLwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2RfY2FsbF9ub2RlOwkvKiBDYWxsZWQgbWV0aG9kIE5vZGUgKi8KIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqbWV0aG9kX2NhbGxfb3A7CS8qIG1ldGhvZF9jYWxsIE9wIGlmIHJ1bm5pbmcgYSBtZXRob2QgKi8KIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICptZXRob2RfZGVzYzsJLyogTWV0aG9kIGRlc2NyaXB0b3IgaWYgcnVubmluZyBhIG1ldGhvZCAqLwogCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICptZXRob2Rfbm9kZTsJLyogTWV0aG9kIG5vZGUgaWYgcnVubmluZyBhIG1ldGhvZC4gKi8KIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3A7CS8qIEN1cnJlbnQgcGFyc2VyIG9wICovCi0JdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb3BlcmFuZHNbQUNQSV9PQkpfTlVNX09QRVJBTkRTICsgMV07CS8qIE9wZXJhbmRzIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgKCsxIGZvciBOVUxMIHRlcm1pbmF0b3IpICovCiAJY29uc3Qgc3RydWN0IGFjcGlfb3Bjb2RlX2luZm8gKm9wX2luZm87CS8qIEluZm8gb24gY3VycmVudCBvcGNvZGUgKi8KIAl1bmlvbiBhY3BpX3BhcnNlX29iamVjdCAqb3JpZ2luOwkvKiBTdGFydCBvZiB3YWxrIFtPYnNvbGV0ZV0gKi8KLQl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICoqcGFyYW1zOwotCXN0cnVjdCBhY3BpX3BhcnNlX3N0YXRlIHBhcnNlcl9zdGF0ZTsJLyogQ3VycmVudCBzdGF0ZSBvZiBwYXJzZXIgKi8KIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpyZXN1bHRfb2JqOwogCXVuaW9uIGFjcGlfZ2VuZXJpY19zdGF0ZSAqcmVzdWx0czsJLyogU3RhY2sgb2YgYWNjdW11bGF0ZWQgcmVzdWx0cyAqLwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9kZXNjOwkvKiBSZXR1cm4gb2JqZWN0LCBpZiBhbnkgKi8KIAl1bmlvbiBhY3BpX2dlbmVyaWNfc3RhdGUgKnNjb3BlX2luZm87CS8qIFN0YWNrIG9mIG5lc3RlZCBzY29wZXMgKi8KLQogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpwcmV2X29wOwkvKiBMYXN0IG9wIHRoYXQgd2FzIHByb2Nlc3NlZCAqLwogCXVuaW9uIGFjcGlfcGFyc2Vfb2JqZWN0ICpuZXh0X29wOwkvKiBuZXh0IG9wIHRvIGJlIHByb2Nlc3NlZCAqLworCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqdGhyZWFkOwogCWFjcGlfcGFyc2VfZG93bndhcmRzIGRlc2NlbmRpbmdfY2FsbGJhY2s7CiAJYWNwaV9wYXJzZV91cHdhcmRzIGFzY2VuZGluZ19jYWxsYmFjazsKLQlzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZDsKLQlzdHJ1Y3QgYWNwaV93YWxrX3N0YXRlICpuZXh0OwkvKiBOZXh0IHdhbGtfc3RhdGUgaW4gbGlzdCAqLwogfTsKIAogLyogSW5mbyB1c2VkIGJ5IGFjcGlfcHNfaW5pdF9vYmplY3RzICovCkBAIC0xMzEsMzIgKzE0Miw2IEBACiAJc3RydWN0IGFjcGlfdGFibGVfZGVzYyAqdGFibGVfZGVzYzsKIH07CiAKLS8qIEluZm8gdXNlZCBieSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAqLwotCi1zdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvIHsKLQl1MTYgZGV2aWNlX2NvdW50OwotCXUxNiBudW1fU1RBOwotCXUxNiBudW1fSU5JOwotCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7Ci19OwotCi0vKiBUQkQ6IFtSZXN0cnVjdHVyZV0gTWVyZ2Ugd2l0aCBzdHJ1Y3QgYWJvdmUgKi8KLQotc3RydWN0IGFjcGlfd2Fsa19pbmZvIHsKLQl1MzIgZGVidWdfbGV2ZWw7Ci0JdTMyIGNvdW50OwotCWFjcGlfb3duZXJfaWQgb3duZXJfaWQ7Ci0JdTggZGlzcGxheV90eXBlOwotfTsKLQotLyogRGlzcGxheSBUeXBlcyAqLwotCi0jZGVmaW5lIEFDUElfRElTUExBWV9TVU1NQVJZICAgICh1OCkgMAotI2RlZmluZSBBQ1BJX0RJU1BMQVlfT0JKRUNUUyAgICAodTgpIDEKLSNkZWZpbmUgQUNQSV9ESVNQTEFZX01BU0sgICAgICAgKHU4KSAxCi0KLSNkZWZpbmUgQUNQSV9ESVNQTEFZX1NIT1JUICAgICAgKHU4KSAyCi0KIHN0cnVjdCBhY3BpX2dldF9kZXZpY2VzX2luZm8gewogCWFjcGlfd2Fsa19jYWxsYmFjayB1c2VyX2Z1bmN0aW9uOwogCXZvaWQgKmNvbnRleHQ7CkBAIC0xODksMTYgKzE3NCwyMSBAQAogCX0gbWlkOwogfTsKIAotLyogSW50ZXJuYWwgbWV0aG9kIHBhcmFtZXRlciBsaXN0ICovCi0KLXN0cnVjdCBhY3BpX3BhcmFtZXRlcl9pbmZvIHsKLQlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKKy8qCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBwYXNzIG9iamVjdCBldmFsdWF0aW9uIHBhcmFtZXRlcnMuCisgKiBQdXJwb3NlIGlzIHRvIHJlZHVjZSBDUFUgc3RhY2sgdXNlLgorICovCitzdHJ1Y3QgYWNwaV9ldmFsdWF0ZV9pbmZvIHsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqcHJlZml4X25vZGU7CisJY2hhciAqcGF0aG5hbWU7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2M7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKnBhcmFtZXRlcnM7CisJc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKnJlc29sdmVkX25vZGU7CiAJdW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqcmV0dXJuX29iamVjdDsKIAl1OCBwYXNzX251bWJlcjsKIAl1OCBwYXJhbWV0ZXJfdHlwZTsKIAl1OCByZXR1cm5fb2JqZWN0X3R5cGU7CisJdTggZmxhZ3M7CiB9OwogCiAvKiBUeXBlcyBmb3IgcGFyYW1ldGVyX3R5cGUgYWJvdmUgKi8KQEAgLTIwNiw0ICsxOTYsMzUgQEAKICNkZWZpbmUgQUNQSV9QQVJBTV9BUkdTICAgICAgICAgICAgICAgICAwCiAjZGVmaW5lIEFDUElfUEFSQU1fR1BFICAgICAgICAgICAgICAgICAgMQogCisvKiBWYWx1ZXMgZm9yIEZsYWdzIGFib3ZlICovCisKKyNkZWZpbmUgQUNQSV9JR05PUkVfUkVUVVJOX1ZBTFVFICAgICAgICAxCisKKy8qIEluZm8gdXNlZCBieSBhY3BpX25zX2luaXRpYWxpemVfZGV2aWNlcyAqLworCitzdHJ1Y3QgYWNwaV9kZXZpY2Vfd2Fsa19pbmZvIHsKKwl1MTYgZGV2aWNlX2NvdW50OworCXUxNiBudW1fU1RBOworCXUxNiBudW1fSU5JOworCXN0cnVjdCBhY3BpX3RhYmxlX2Rlc2MgKnRhYmxlX2Rlc2M7CisJc3RydWN0IGFjcGlfZXZhbHVhdGVfaW5mbyAqZXZhbHVhdGVfaW5mbzsKK307CisKKy8qIFRCRDogW1Jlc3RydWN0dXJlXSBNZXJnZSB3aXRoIHN0cnVjdCBhYm92ZSAqLworCitzdHJ1Y3QgYWNwaV93YWxrX2luZm8geworCXUzMiBkZWJ1Z19sZXZlbDsKKwl1MzIgY291bnQ7CisJYWNwaV9vd25lcl9pZCBvd25lcl9pZDsKKwl1OCBkaXNwbGF5X3R5cGU7Cit9OworCisvKiBEaXNwbGF5IFR5cGVzICovCisKKyNkZWZpbmUgQUNQSV9ESVNQTEFZX1NVTU1BUlkgICAgICAgICh1OCkgMAorI2RlZmluZSBBQ1BJX0RJU1BMQVlfT0JKRUNUUyAgICAgICAgKHU4KSAxCisjZGVmaW5lIEFDUElfRElTUExBWV9NQVNLICAgICAgICAgICAodTgpIDEKKworI2RlZmluZSBBQ1BJX0RJU1BMQVlfU0hPUlQgICAgICAgICAgKHU4KSAyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGFibGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaAppbmRleCAzMGE0NzU0Li40ZGJhZjAyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YWJsZXMuaApAQCAtMTM2LDcgKzEzNiwxMSBAQAogYWNwaV9zdGF0dXMKIGFjcGlfdGJfdmVyaWZ5X3RhYmxlX2NoZWNrc3VtKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKTsKIAotdTggYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bSh2b2lkICpidWZmZXIsIHUzMiBsZW5ndGgpOwordTggYWNwaV90Yl9zdW1fdGFibGUodm9pZCAqYnVmZmVyLCB1MzIgbGVuZ3RoKTsKKwordTggYWNwaV90Yl9nZW5lcmF0ZV9jaGVja3N1bShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKKwordm9pZCBhY3BpX3RiX3NldF9jaGVja3N1bShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfdGJfdmFsaWRhdGVfdGFibGVfaGVhZGVyKHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibC5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKaW5kZXggZWQ1M2Y4NC4uYjEyNWNlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjdGJsLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsLmgKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTmFtZTogYWN0YmwuaCAtIFRhYmxlIGRhdGEgc3RydWN0dXJlcyBkZWZpbmVkIGluIEFDUEkgc3BlY2lmaWNhdGlvbgorICogTmFtZTogYWN0YmwuaCAtIEJhc2ljIEFDUEkgVGFibGUgRGVmaW5pdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTQ1LDY2ICs0NSw0NSBAQAogI2RlZmluZSBfX0FDVEJMX0hfXwogCiAvKgorICogVmFsdWVzIGZvciBkZXNjcmlwdGlvbiB0YWJsZSBoZWFkZXIgc2lnbmF0dXJlcy4gVXNlZnVsIGJlY2F1c2UgdGhleSBtYWtlCisgKiBpdCBtb3JlIGRpZmZpY3VsdCB0byBpbmFkdmVydGVudGx5IHR5cGUgaW4gdGhlIHdyb25nIHNpZ25hdHVyZS4KKyAqLworI2RlZmluZSBEU0RUX1NJRyAgICAgICAgICAgICAgICAiRFNEVCIJLyogRGlmZmVyZW50aWF0ZWQgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIEZBRFRfU0lHICAgICAgICAgICAgICAgICJGQUNQIgkvKiBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIEZBQ1NfU0lHICAgICAgICAgICAgICAgICJGQUNTIgkvKiBGaXJtd2FyZSBBQ1BJIENvbnRyb2wgU3RydWN0dXJlICovCisjZGVmaW5lIFBTRFRfU0lHICAgICAgICAgICAgICAgICJQU0RUIgkvKiBQZXJzaXN0ZW50IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBSU0RQX1NJRyAgICAgICAgICAgICAgICAiUlNEIFBUUiAiCS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFBvaW50ZXIgKi8KKyNkZWZpbmUgUlNEVF9TSUcgICAgICAgICAgICAgICAgIlJTRFQiCS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIFhTRFRfU0lHICAgICAgICAgICAgICAgICJYU0RUIgkvKiBFeHRlbmRlZCAgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIFNTRFRfU0lHICAgICAgICAgICAgICAgICJTU0RUIgkvKiBTZWNvbmRhcnkgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIFJTRFBfTkFNRSAgICAgICAgICAgICAgICJSU0RQIgorCisvKgorICogQWxsIHRhYmxlcyBhbmQgc3RydWN0dXJlcyBtdXN0IGJlIGJ5dGUtcGFja2VkIHRvIG1hdGNoIHRoZSBBQ1BJCisgKiBzcGVjaWZpY2F0aW9uLCBzaW5jZSB0aGUgdGFibGVzIGFyZSBwcm92aWRlZCBieSB0aGUgc3lzdGVtIEJJT1MKKyAqLworI3ByYWdtYSBwYWNrKDEpCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIEFDUEkgdGFibGVzIHRoYXQgYXJlIGRpcmVjdGx5IGNvbnN1bWVkIGJ5IHRoZSBzdWJzeXN0ZW0uCisgKgorICogVGhlIFJTRFAgYW5kIEZBQ1MgZG8gbm90IHVzZSB0aGUgY29tbW9uIEFDUEkgdGFibGUgaGVhZGVyLiBBbGwgb3RoZXIgQUNQSQorICogdGFibGVzIHVzZSB0aGUgaGVhZGVyLgorICoKICAqIE5vdGUgYWJvdXQgYml0ZmllbGRzOiBUaGUgdTggdHlwZSBpcyB1c2VkIGZvciBiaXRmaWVsZHMgaW4gQUNQSSB0YWJsZXMuCiAgKiBUaGlzIGlzIHRoZSBvbmx5IHR5cGUgdGhhdCBpcyBldmVuIHJlbW90ZWx5IHBvcnRhYmxlLiBBbnl0aGluZyBlbHNlIGlzIG5vdAogICogcG9ydGFibGUsIHNvIGRvIG5vdCB1c2UgYW55IG90aGVyIGJpdGZpZWxkIHR5cGVzLgogICovCiAKLS8qCi0gKiAgVmFsdWVzIGZvciBkZXNjcmlwdGlvbiB0YWJsZSBoZWFkZXIgc2lnbmF0dXJlcwotICovCi0jZGVmaW5lIFJTRFBfTkFNRSAgICAgICAgICAgICAgICJSU0RQIgotI2RlZmluZSBSU0RQX1NJRyAgICAgICAgICAgICAgICAiUlNEIFBUUiAiCS8qIFJTRFQgUG9pbnRlciBzaWduYXR1cmUgKi8KLSNkZWZpbmUgQVBJQ19TSUcgICAgICAgICAgICAgICAgIkFQSUMiCS8qIE11bHRpcGxlIEFQSUMgRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgRFNEVF9TSUcgICAgICAgICAgICAgICAgIkRTRFQiCS8qIERpZmZlcmVudGlhdGVkIFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQURUX1NJRyAgICAgICAgICAgICAgICAiRkFDUCIJLyogRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAqLwotI2RlZmluZSBGQUNTX1NJRyAgICAgICAgICAgICAgICAiRkFDUyIJLyogRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAqLwotI2RlZmluZSBQU0RUX1NJRyAgICAgICAgICAgICAgICAiUFNEVCIJLyogUGVyc2lzdGVudCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKi8KLSNkZWZpbmUgUlNEVF9TSUcgICAgICAgICAgICAgICAgIlJTRFQiCS8qIFJvb3QgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFhTRFRfU0lHICAgICAgICAgICAgICAgICJYU0RUIgkvKiBFeHRlbmRlZCAgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFNTRFRfU0lHICAgICAgICAgICAgICAgICJTU0RUIgkvKiBTZWNvbmRhcnkgU3lzdGVtIERlc2NyaXB0aW9uIFRhYmxlICovCi0jZGVmaW5lIFNCU1RfU0lHICAgICAgICAgICAgICAgICJTQlNUIgkvKiBTbWFydCBCYXR0ZXJ5IFNwZWNpZmljYXRpb24gVGFibGUgKi8KLSNkZWZpbmUgU1BJQ19TSUcgICAgICAgICAgICAgICAgIlNQSUMiCS8qIElPU0FQSUMgdGFibGUgKi8KLSNkZWZpbmUgQk9PVF9TSUcgICAgICAgICAgICAgICAgIkJPT1QiCS8qIEJvb3QgdGFibGUgKi8KLQotI2RlZmluZSBHTF9PV05FRCAgICAgICAgICAgICAgICAweDAyCS8qIE93bmVyc2hpcCBvZiBnbG9iYWwgbG9jayBpcyBiaXQgMSAqLwotCi0vKgotICogQ29tbW9uIHRhYmxlIHR5cGVzLiAgVGhlIGJhc2UgY29kZSBjYW4gcmVtYWluCi0gKiBjb25zdGFudCBpZiB0aGUgdW5kZXJseWluZyB0YWJsZXMgYXJlIGNoYW5nZWQKLSAqLwotI2RlZmluZSBSU0RUX0RFU0NSSVBUT1IgICAgICAgICBzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjIKLSNkZWZpbmUgWFNEVF9ERVNDUklQVE9SICAgICAgICAgc3RydWN0IHhzZHRfZGVzY3JpcHRvcl9yZXYyCi0jZGVmaW5lIEZBQ1NfREVTQ1JJUFRPUiAgICAgICAgIHN0cnVjdCBmYWNzX2Rlc2NyaXB0b3JfcmV2MgotI2RlZmluZSBGQURUX0RFU0NSSVBUT1IgICAgICAgICBzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjIKLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qCi0gKiBBQ1BJIFZlcnNpb24taW5kZXBlbmRlbnQgdGFibGVzCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKLSAqIE5PVEU6IFRoZSB0YWJsZXMgdGhhdCBhcmUgc3BlY2lmaWMgdG8gQUNQSSB2ZXJzaW9ucyAoMS4wLCAyLjAsIGV0Yy4pCi0gKiBhcmUgaW4gc2VwYXJhdGUgZmlsZXMuCi0gKi8KLXN0cnVjdCByc2RwX2Rlc2NyaXB0b3IgewkvKiBSb290IFN5c3RlbSBEZXNjcmlwdG9yIFBvaW50ZXIgKi8KLQljaGFyIHNpZ25hdHVyZVs4XTsJLyogQUNQSSBzaWduYXR1cmUsIGNvbnRhaW5zICJSU0QgUFRSICIgKi8KLQl1OCBjaGVja3N1bTsJCS8qIEFDUEkgMS4wIGNoZWNrc3VtICovCi0JY2hhciBvZW1faWRbNl07CQkvKiBPRU0gaWRlbnRpZmljYXRpb24gKi8KLQl1OCByZXZpc2lvbjsJCS8qIE11c3QgYmUgKDApIGZvciBBQ1BJIDEuMCBvciAoMikgZm9yIEFDUEkgMi4wKyAqLwotCXUzMiByc2R0X3BoeXNpY2FsX2FkZHJlc3M7CS8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBSU0RUICovCi0JdTMyIGxlbmd0aDsJCS8qIFhTRFQgTGVuZ3RoIGluIGJ5dGVzLCBpbmNsdWRpbmcgaGVhZGVyICovCi0JdTY0IHhzZHRfcGh5c2ljYWxfYWRkcmVzczsJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIFhTRFQgKi8KLQl1OCBleHRlbmRlZF9jaGVja3N1bTsJLyogQ2hlY2tzdW0gb2YgZW50aXJlIHRhYmxlIChBQ1BJIDIuMCkgKi8KLQljaGFyIHJlc2VydmVkWzNdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi19OworICogQUNQSSBUYWJsZSBIZWFkZXIuIFRoaXMgY29tbW9uIGhlYWRlciBpcyB1c2VkIGJ5IGFsbCB0YWJsZXMgZXhjZXB0IHRoZQorICogUlNEUCBhbmQgRkFDUy4gVGhlIGRlZmluZSBpcyB1c2VkIGZvciBkaXJlY3QgaW5jbHVzaW9uIG9mIGhlYWRlciBpbnRvCisgKiBvdGhlciBBQ1BJIHRhYmxlcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBhY3BpX2NvbW1vbl9mYWNzIHsJLyogQ29tbW9uIEZBQ1MgZm9yIGludGVybmFsIHVzZSAqLwotCXUzMiAqZ2xvYmFsX2xvY2s7Ci0JdTY0ICpmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwotCXU4IHZlY3Rvcl93aWR0aDsKLX07Ci0KLSNkZWZpbmUgQUNQSV9UQUJMRV9IRUFERVJfREVGICAgLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovIFwKKyNkZWZpbmUgQUNQSV9UQUJMRV9IRUFERVJfREVGIFwKIAljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZVs0XTsgICAgICAgICAgIC8qIEFTQ0lJIHRhYmxlIHNpZ25hdHVyZSAqL1wKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsgICAgICAgICAgICAgICAgIC8qIExlbmd0aCBvZiB0YWJsZSBpbiBieXRlcywgaW5jbHVkaW5nIHRoaXMgaGVhZGVyICovXAogCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2aXNpb247ICAgICAgICAgICAgICAgLyogQUNQSSBTcGVjaWZpY2F0aW9uIG1pbm9yIHZlcnNpb24gIyAqL1wKQEAgLTExMiwxNTQgKzkxLDIzOSBAQAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX2lkWzZdOyAgICAgICAgICAgICAgLyogQVNDSUkgT0VNIGlkZW50aWZpY2F0aW9uICovXAogCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX3RhYmxlX2lkWzhdOyAgICAgICAgLyogQVNDSUkgT0VNIHRhYmxlIGlkZW50aWZpY2F0aW9uICovXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2VtX3JldmlzaW9uOyAgICAgICAgICAgLyogT0VNIHJldmlzaW9uIG51bWJlciAqL1wKLQljaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzbF9jb21waWxlcl9pZCBbNF07ICAgIC8qIEFTQ0lJIEFTTCBjb21waWxlciB2ZW5kb3IgSUQgKi9cCisJY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xfY29tcGlsZXJfaWRbNF07ICAgICAvKiBBU0NJSSBBU0wgY29tcGlsZXIgdmVuZG9yIElEICovXAogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNsX2NvbXBpbGVyX3JldmlzaW9uOwkvKiBBU0wgY29tcGlsZXIgdmVyc2lvbiAqLwogCi1zdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgewkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KK3N0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciB7CiBBQ1BJX1RBQkxFX0hFQURFUl9ERUZ9OwogCiAvKgotICogTUFEVCB2YWx1ZXMgYW5kIHN0cnVjdHVyZXMKKyAqIEdBUyAtIEdlbmVyaWMgQWRkcmVzcyBTdHJ1Y3R1cmUgKEFDUEkgMi4wKykKICAqLworc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHsKKwl1OCBhZGRyZXNzX3NwYWNlX2lkOwkvKiBBZGRyZXNzIHNwYWNlIHdoZXJlIHN0cnVjdCBvciByZWdpc3RlciBleGlzdHMgKi8KKwl1OCByZWdpc3Rlcl9iaXRfd2lkdGg7CS8qIFNpemUgaW4gYml0cyBvZiBnaXZlbiByZWdpc3RlciAqLworCXU4IHJlZ2lzdGVyX2JpdF9vZmZzZXQ7CS8qIEJpdCBvZmZzZXQgd2l0aGluIHRoZSByZWdpc3RlciAqLworCXU4IGFjY2Vzc193aWR0aDsJLyogTWluaW11bSBBY2Nlc3Mgc2l6ZSAoQUNQSSAzLjApICovCisJdTY0IGFkZHJlc3M7CQkvKiA2NC1iaXQgYWRkcmVzcyBvZiBzdHJ1Y3Qgb3IgcmVnaXN0ZXIgKi8KK307CiAKLS8qIFZhbHVlcyBmb3IgTUFEVCBQQ0FUQ29tcGF0ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFJTRFAgLSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBQb2ludGVyIChTaWduYXR1cmUgaXMgIlJTRCBQVFIgIikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIERVQUxfUElDICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTVVMVElQTEVfQVBJQyAgICAgICAgICAgMQorc3RydWN0IHJzZHBfZGVzY3JpcHRvciB7CisJY2hhciBzaWduYXR1cmVbOF07CS8qIEFDUEkgc2lnbmF0dXJlLCBjb250YWlucyAiUlNEIFBUUiAiICovCisJdTggY2hlY2tzdW07CQkvKiBBQ1BJIDEuMCBjaGVja3N1bSAqLworCWNoYXIgb2VtX2lkWzZdOwkJLyogT0VNIGlkZW50aWZpY2F0aW9uICovCisJdTggcmV2aXNpb247CQkvKiBNdXN0IGJlICgwKSBmb3IgQUNQSSAxLjAgb3IgKDIpIGZvciBBQ1BJIDIuMCsgKi8KKwl1MzIgcnNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUlNEVCAqLworCXUzMiBsZW5ndGg7CQkvKiBUYWJsZSBsZW5ndGggaW4gYnl0ZXMsIGluY2x1ZGluZyBoZWFkZXIgKEFDUEkgMi4wKykgKi8KKwl1NjQgeHNkdF9waHlzaWNhbF9hZGRyZXNzOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgWFNEVCAoQUNQSSAyLjArKSAqLworCXU4IGV4dGVuZGVkX2NoZWNrc3VtOwkvKiBDaGVja3N1bSBvZiBlbnRpcmUgdGFibGUgKEFDUEkgMi4wKykgKi8KKwl1OCByZXNlcnZlZFszXTsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KK307CiAKLS8qIE1hc3RlciBNQURUICovCisjZGVmaW5lIEFDUElfUlNEUF9SRVYwX1NJWkUgICAgIDIwCS8qIFNpemUgb2Ygb3JpZ2luYWwgQUNQSSAxLjAgUlNEUCAqLwogCi1zdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCXUzMiBsb2NhbF9hcGljX2FkZHJlc3M7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgbG9jYWwgQVBJQyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBSU0RUL1hTRFQgLSBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIHRhYmxlX29mZnNldF9lbnRyeVsxXTsJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gQUNQSSB0YWJsZXMgKi8KK307CisKK3N0cnVjdCB4c2R0X2Rlc2NyaXB0b3IgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1NjQgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGQUNTIC0gRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAoRkFDUykKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yIHsKKwljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCisJdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCisJdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KKwl1MzIgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IgKi8KKwl1MzIgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrIGZvciBzaGFyZWQgaGFyZHdhcmUgcmVzb3VyY2VzICovCiAKIAkvKiBGbGFncyAoMzIgYml0cykgKi8KIAotCXU4IFBDQVRjb21wYXQ6MTsJLyogMDA6ICAgIFN5c3RlbSBhbHNvIGhhcyBkdWFsIDgyNTlzICovCisJdTggUzRiaW9zX2Y6MTsJCS8qIDAwOiAgICBTNEJJT1Mgc3VwcG9ydCBpcyBwcmVzZW50ICovCiAJIHU4Ojc7CQkJLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIAl1OCByZXNlcnZlZDFbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisKKwl1NjQgeGZpcm13YXJlX3dha2luZ192ZWN0b3I7CS8qIDY0LWJpdCB2ZXJzaW9uIG9mIHRoZSBGaXJtd2FyZSBXYWtpbmcgVmVjdG9yIChBQ1BJIDIuMCspICovCisJdTggdmVyc2lvbjsJCS8qIFZlcnNpb24gb2YgdGhpcyB0YWJsZSAoQUNQSSAyLjArKSAqLworCXU4IHJlc2VydmVkWzMxXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogfTsKIAotLyogVmFsdWVzIGZvciBUeXBlIGluIEFQSUNfSEVBREVSX0RFRiAqLwotCi0jZGVmaW5lIEFQSUNfUFJPQ0VTU09SICAgICAgICAgIDAKLSNkZWZpbmUgQVBJQ19JTyAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBBUElDX1hSVVBUX09WRVJSSURFICAgICAyCi0jZGVmaW5lIEFQSUNfTk1JICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgQVBJQ19MT0NBTF9OTUkgICAgICAgICAgNAotI2RlZmluZSBBUElDX0FERFJFU1NfT1ZFUlJJREUgICA1Ci0jZGVmaW5lIEFQSUNfSU9fU0FQSUMgICAgICAgICAgIDYKLSNkZWZpbmUgQVBJQ19MT0NBTF9TQVBJQyAgICAgICAgNwotI2RlZmluZSBBUElDX1hSVVBUX1NPVVJDRSAgICAgICA4Ci0jZGVmaW5lIEFQSUNfUkVTRVJWRUQgICAgICAgICAgIDkJLyogOSBhbmQgZ3JlYXRlciBhcmUgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgQUNQSV9HTE9DS19QRU5ESU5HICAgICAgMHgwMQkvKiAwMDogUGVuZGluZyBnbG9iYWwgbG9jayBvd25lcnNoaXAgKi8KKyNkZWZpbmUgQUNQSV9HTE9DS19PV05FRCAgICAgICAgMHgwMgkvKiAwMTogR2xvYmFsIGxvY2sgaXMgb3duZWQgKi8KIAogLyoKLSAqIE1BRFQgc3ViLXN0cnVjdHVyZXMgKEZvbGxvdyBNVUxUSVBMRV9BUElDX0RFU0NSSVBUSU9OX1RBQkxFKQorICogQ29tbW9uIEZBQ1MgLSBUaGlzIGlzIGEgdmVyc2lvbi1pbmRlcGVuZGVudCBGQUNTIHN0cnVjdHVyZSB1c2VkIGZvciBpbnRlcm5hbCB1c2Ugb25seQogICovCi0jZGVmaW5lIEFQSUNfSEVBREVSX0RFRiAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBBUElDIHN1Yi1zdHJ1Y3R1cmUgaGVhZGVyICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOwotCi1zdHJ1Y3QgYXBpY19oZWFkZXIgewotQVBJQ19IRUFERVJfREVGfTsKLQotLyogVmFsdWVzIGZvciBNUFMgSU5USSBmbGFncyAqLwotCi0jZGVmaW5lIFBPTEFSSVRZX0NPTkZPUk1TICAgICAgIDAKLSNkZWZpbmUgUE9MQVJJVFlfQUNUSVZFX0hJR0ggICAgMQotI2RlZmluZSBQT0xBUklUWV9SRVNFUlZFRCAgICAgICAyCi0jZGVmaW5lIFBPTEFSSVRZX0FDVElWRV9MT1cgICAgIDMKLQotI2RlZmluZSBUUklHR0VSX0NPTkZPUk1TICAgICAgICAwCi0jZGVmaW5lIFRSSUdHRVJfRURHRSAgICAgICAgICAgIDEKLSNkZWZpbmUgVFJJR0dFUl9SRVNFUlZFRCAgICAgICAgMgotI2RlZmluZSBUUklHR0VSX0xFVkVMICAgICAgICAgICAzCi0KLS8qIENvbW1vbiBmbGFnIGRlZmluaXRpb25zICgxNiBiaXRzIGVhY2gpICovCi0KLSNkZWZpbmUgTVBTX0lOVElfRkxBR1MgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgICAgIDogMjsgICAgLyogMDAtMDE6IFBvbGFyaXR5IG9mIEFQSUMgSS9PIGlucHV0IHNpZ25hbHMgKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX21vZGUgICAgOiAyOyAgICAvKiAwMi0wMzogVHJpZ2dlciBtb2RlIG9mIEFQSUMgaW5wdXQgc2lnbmFscyAqL1wKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7ICAgIC8qIDA0LTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwkvKiAwOC0xNTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0jZGVmaW5lIExPQ0FMX0FQSUNfRkxBR1MgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc29yX2VuYWJsZWQ6IDE7ICAgLyogMDA6ICAgIFByb2Nlc3NvciBpcyB1c2FibGUgaWYgc2V0ICovXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogNzsgICAgLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi9cCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDI7CS8qIDA4LTE1OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0KLS8qIFN1Yi1zdHJ1Y3R1cmVzIGZvciBNQURUICovCi0KLXN0cnVjdCBtYWR0X3Byb2Nlc3Nvcl9hcGljIHsKLQlBUElDX0hFQURFUl9ERUYgdTggcHJvY2Vzc29yX2lkOwkvKiBBQ1BJIHByb2Nlc3NvciBpZCAqLwotCXU4IGxvY2FsX2FwaWNfaWQ7CS8qIFByb2Nlc3NvcidzIGxvY2FsIEFQSUMgaWQgKi8KLSBMT0NBTF9BUElDX0ZMQUdTfTsKLQotc3RydWN0IG1hZHRfaW9fYXBpYyB7Ci0JQVBJQ19IRUFERVJfREVGIHU4IGlvX2FwaWNfaWQ7CS8qIEkvTyBBUElDIElEICovCi0JdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLwotCXUzMiBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCi0JdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0IHdoZXJlIElOVEkKLQkJCQkgKiBsaW5lcyBzdGFydCAqLworc3RydWN0IGFjcGlfY29tbW9uX2ZhY3MgeworCXUzMiAqZ2xvYmFsX2xvY2s7CisJdTY0ICpmaXJtd2FyZV93YWtpbmdfdmVjdG9yOworCXU4IHZlY3Rvcl93aWR0aDsKIH07CiAKLXN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSB7Ci0JQVBJQ19IRUFERVJfREVGIHU4IGJ1czsJLyogMCAtIElTQSAqLwotCXU4IHNvdXJjZTsJCS8qIEludGVycnVwdCBzb3VyY2UgKElSUSkgKi8KLQl1MzIgaW50ZXJydXB0OwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KLSBNUFNfSU5USV9GTEFHU307CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZBRFQgLSBGaXhlZCBBQ1BJIERlc2NyaXB0aW9uIFRhYmxlIChTaWduYXR1cmUgIkZBQ1AiKQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0cnVjdCBtYWR0X25taV9zb3VyY2UgewotCUFQSUNfSEVBREVSX0RFRiBNUFNfSU5USV9GTEFHUyB1MzIgaW50ZXJydXB0OwkvKiBHbG9iYWwgc3lzdGVtIGludGVycnVwdCAqLwotfTsKKy8qIEZpZWxkcyBjb21tb24gdG8gYWxsIHZlcnNpb25zIG9mIHRoZSBGQURUICovCiAKLXN0cnVjdCBtYWR0X2xvY2FsX2FwaWNfbm1pIHsKLQlBUElDX0hFQURFUl9ERUYgdTggcHJvY2Vzc29yX2lkOwkvKiBBQ1BJIHByb2Nlc3NvciBpZCAqLwotCU1QU19JTlRJX0ZMQUdTIHU4IGxpbnQ7CS8qIExJTlRuIHRvIHdoaWNoIE5NSSBpcyBjb25uZWN0ZWQgKi8KLX07CisjZGVmaW5lIEFDUElfRkFEVF9DT01NT04gXAorCUFDUElfVEFCTEVfSEVBREVSX0RFRiBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9maXJtd2FyZV9jdHJsOyAgIC8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8gXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfZHNkdDsgICAgICAgICAgICAvKiAzMi1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMTsgICAgICAgICAgLyogU3lzdGVtIEludGVycnVwdCBNb2RlbCBpc24ndCB1c2VkIGluIEFDUEkgMi4wKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVyX1BNX3Byb2ZpbGU7ICAvKiBDb252ZXlzIHByZWZlcnJlZCBwb3dlciBtYW5hZ2VtZW50IHByb2ZpbGUgdG8gT1NQTS4gKi8gXAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NpX2ludDsgICAgICAgICAgICAvKiBTeXN0ZW0gdmVjdG9yIG9mIFNDSSBpbnRlcnJ1cHQgKi8gXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21pX2NtZDsgICAgICAgICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2VuYWJsZTsgICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZW5hYmxlIEFDUEkgKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNwaV9kaXNhYmxlOyAgICAgICAvKiBWYWx1ZSB0byB3cml0ZSB0byBzbWlfY21kIHRvIGRpc2FibGUgQUNQSSAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTNGJpb3NfcmVxOyAgICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIFNNSSBDTUQgdG8gZW50ZXIgUzRCSU9TIHN0YXRlICovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzdGF0ZV9jbnQ7ICAgICAgICAgLyogUHJvY2Vzc29yIHBlcmZvcm1hbmNlIHN0YXRlIGNvbnRyb2wqLyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbTFhX2V2dF9ibGs7ICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgRXZlbnQgUmVnIEJsayAqLyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbTFiX2V2dF9ibGs7ICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWIgRXZlbnQgUmVnIEJsayAqLyBcCisJdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbTFhX2NudF9ibGs7ICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovIFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtMWJfY250X2JsazsgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8gXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0yX2NudF9ibGs7ICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovIFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtX3Rtcl9ibGs7ICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8gXAorCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfZ3BlMF9ibGs7ICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovIFwKKwl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2dwZTFfYmxrOyAgICAgICAgLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfZXZ0X2xlbjsgICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xX2NudF9sZW47ICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9jbnRfYmxrICovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9jbnRfbGVuOyAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1fbGVuOyAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMF9ibGtfbGVuOyAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2Jsa19sZW47ICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxrICovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmFzZTsgICAgICAgICAgLyogT2Zmc2V0IGluIGdwZSBtb2RlbCB3aGVyZSBncGUxIGV2ZW50cyBzdGFydCAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RfY250OyAgICAgICAgICAgIC8qIFN1cHBvcnQgZm9yIHRoZSBfQ1NUIG9iamVjdCBhbmQgQyBTdGF0ZXMgY2hhbmdlIG5vdGlmaWNhdGlvbi4qLyBcCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsMl9sYXQ7ICAgICAgICAgIC8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovIFwKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwzX2xhdDsgICAgICAgICAgLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8gXAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfc2l6ZTsgICAgICAgICAvKiBQcm9jZXNzb3IncyBtZW1vcnkgY2FjaGUgbGluZSB3aWR0aCwgaW4gYnl0ZXMgKi8gXAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfc3RyaWRlOyAgICAgICAvKiBOdW1iZXIgb2YgZmx1c2ggc3RyaWRlcyB0aGF0IG5lZWQgdG8gYmUgcmVhZCAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXR5X29mZnNldDsgICAgICAgIC8qIFByb2Nlc3NvcidzIGR1dHkgY3ljbGUgaW5kZXggaW4gcHJvY2Vzc29yJ3MgUF9DTlQgcmVnKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0eV93aWR0aDsgICAgICAgICAvKiBQcm9jZXNzb3IncyBkdXR5IGN5Y2xlIHZhbHVlIGJpdCB3aWR0aCBpbiBQX0NOVCByZWdpc3Rlci4qLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfYWxybTsgICAgICAgICAgIC8qIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uX2Fscm07ICAgICAgICAgICAvKiBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50dXJ5OyAgICAgICAgICAgIC8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovIFwKKwl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhcGNfYm9vdF9hcmNoOyAgICAgLyogSUEtUEMgQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MuIFNlZSBUYWJsZSA1LTEwIGZvciBkZXNjcmlwdGlvbiovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkMjsgICAgICAgICAgLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCi1zdHJ1Y3QgbWFkdF9hZGRyZXNzX292ZXJyaWRlIHsKLQlBUElDX0hFQURFUl9ERUYgdTE2IHJlc2VydmVkOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTY0IGFkZHJlc3M7CQkvKiBBUElDIHBoeXNpY2FsIGFkZHJlc3MgKi8KLX07CisvKgorICogQUNQSSAyLjArIEZBRFQKKyAqLworc3RydWN0IGZhZHRfZGVzY3JpcHRvciB7CisJQUNQSV9GQURUX0NPTU1PTgorCSAgICAvKiBGbGFncyAoMzIgYml0cykgKi8KKwl1OCB3Yl9pbnZkOjE7CQkvKiAwMDogICAgVGhlIHdiaW52ZCBpbnN0cnVjdGlvbiB3b3JrcyBwcm9wZXJseSAqLworCXU4IHdiX2ludmRfZmx1c2g6MTsJLyogMDE6ICAgIFRoZSB3YmludmQgZmx1c2hlcyBidXQgZG9lcyBub3QgaW52YWxpZGF0ZSAqLworCXU4IHByb2NfYzE6MTsJCS8qIDAyOiAgICBBbGwgcHJvY2Vzc29ycyBzdXBwb3J0IEMxIHN0YXRlICovCisJdTggcGx2bDJfdXA6MTsJCS8qIDAzOiAgICBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KKwl1OCBwd3JfYnV0dG9uOjE7CS8qIDA0OiAgICBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLworCXU4IHNsZWVwX2J1dHRvbjoxOwkvKiAwNTogICAgU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCisJdTggZml4ZWRfclRDOjE7CQkvKiAwNjogICAgUlRDIHdha2V1cCBzdGF0IG5vdCBpbiBmaXhlZCByZWdpc3RlciBzcGFjZSAqLworCXU4IHJ0Y3M0OjE7CQkvKiAwNzogICAgUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCisJdTggdG1yX3ZhbF9leHQ6MTsJLyogMDg6ICAgIHRtcl92YWwgaXMgMzIgYml0cyAwPTI0LWJpdHMgKi8KKwl1OCBkb2NrX2NhcDoxOwkJLyogMDk6ICAgIERvY2tpbmcgc3VwcG9ydGVkICovCisJdTggcmVzZXRfcmVnX3N1cDoxOwkvKiAxMDogICAgU3lzdGVtIHJlc2V0IHZpYSB0aGUgRkFEVCBSRVNFVF9SRUcgc3VwcG9ydGVkICovCisJdTggc2VhbGVkX2Nhc2U6MTsJLyogMTE6ICAgIE5vIGludGVybmFsIGV4cGFuc2lvbiBjYXBhYmlsaXRpZXMgYW5kIGNhc2UgaXMgc2VhbGVkICovCisJdTggaGVhZGxlc3M6MTsJCS8qIDEyOiAgICBObyBsb2NhbCB2aWRlbyBjYXBhYmlsaXRpZXMgb3IgbG9jYWwgaW5wdXQgZGV2aWNlcyAqLworCXU4IGNwdV9zd19zbGVlcDoxOwkvKiAxMzogICAgTXVzdCBleGVjdXRlIG5hdGl2ZSBpbnN0cnVjdGlvbiBhZnRlciB3cml0aW5nIFNMUF9UWVB4IHJlZ2lzdGVyICovCiAKLXN0cnVjdCBtYWR0X2lvX3NhcGljIHsKLQlBUElDX0hFQURFUl9ERUYgdTggaW9fc2FwaWNfaWQ7CS8qIEkvTyBTQVBJQyBJRCAqLwotCXU4IHJlc2VydmVkOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXUzMiBpbnRlcnJ1cHRfYmFzZTsJLyogR2xvY2FsIGludGVycnVwdCBmb3IgU0FQSUMgc3RhcnQgKi8KLQl1NjQgYWRkcmVzczsJCS8qIFNBUElDIHBoeXNpY2FsIGFkZHJlc3MgKi8KLX07CisJdTggcGNpX2V4cF93YWs6MTsJLyogMTQ6ICAgIFN5c3RlbSBzdXBwb3J0cyBQQ0lFWFBfV0FLRSAoU1RTL0VOKSBiaXRzIChBQ1BJIDMuMCkgKi8KKwl1OCB1c2VfcGxhdGZvcm1fY2xvY2s6MTsJLyogMTU6ICAgIE9TUE0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1wcm92aWRlZCB0aW1lciAoQUNQSSAzLjApICovCisJdTggUzRydGNfc3RzX3ZhbGlkOjE7CS8qIDE2OiAgICBDb250ZW50cyBvZiBSVENfU1RTIHZhbGlkIGFmdGVyIFM0IHdha2UgKEFDUEkgMy4wKSAqLworCXU4IHJlbW90ZV9wb3dlcl9vbl9jYXBhYmxlOjE7CS8qIDE3OiAgICBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAoQUNQSSAzLjApICovCisJdTggZm9yY2VfYXBpY19jbHVzdGVyX21vZGVsOjE7CS8qIDE4OiAgICBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAoQUNQSSAzLjApICovCisJdTggZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlOjE7CS8qIDE5OiAgIEFsbCBsb2NhbCB4X2FQSUNzIG11c3QgdXNlIHBoeXNpY2FsIGRlc3QgbW9kZSAoQUNQSSAzLjApICovCisJIHU4OjQ7CQkJLyogMjAtMjM6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDM7CQkvKiAyNC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwogCi1zdHJ1Y3QgbWFkdF9sb2NhbF9zYXBpYyB7Ci0JQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KLQl1OCBsb2NhbF9zYXBpY19pZDsJLyogU0FQSUMgSUQgKi8KLQl1OCBsb2NhbF9zYXBpY19laWQ7CS8qIFNBUElDIEVJRCAqLwotCXU4IHJlc2VydmVkWzNdOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCSBMT0NBTF9BUElDX0ZMQUdTIHUzMiBwcm9jZXNzb3JfdUlEOwkvKiBOdW1lcmljIFVJRCAtIEFDUEkgMy4wICovCi0JY2hhciBwcm9jZXNzb3JfdUlEc3RyaW5nWzFdOwkvKiBTdHJpbmcgVUlEICAtIEFDUEkgMy4wICovCi19OwotCi1zdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfc291cmNlIHsKLQlBUElDX0hFQURFUl9ERUYgTVBTX0lOVElfRkxBR1MgdTggaW50ZXJydXB0X3R5cGU7CS8qIDE9UE1JLCAyPUlOSVQsIDM9Y29ycmVjdGVkICovCi0JdTggcHJvY2Vzc29yX2lkOwkvKiBQcm9jZXNzb3IgSUQgKi8KLQl1OCBwcm9jZXNzb3JfZWlkOwkvKiBQcm9jZXNzb3IgRUlEICovCi0JdTggaW9fc2FwaWNfdmVjdG9yOwkvKiBWZWN0b3IgdmFsdWUgZm9yIFBNSSBpbnRlcnJ1cHRzICovCi0JdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCi0JdTMyIGZsYWdzOwkJLyogSW50ZXJydXB0IFNvdXJjZSBGbGFncyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCisJdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtICovCisJdTggcmVzZXJ2ZWQ0WzNdOwkvKiBUaGVzZSB0aHJlZSBieXRlcyBtdXN0IGJlIHplcm8gKi8KKwl1NjQgeGZpcm13YXJlX2N0cmw7CS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIEZBQ1MgKi8KKwl1NjQgWGRzZHQ7CQkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFhX2V2dF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYl9ldnRfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWIgYWNwaV9ldmVudCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2NudF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0yX2NudF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAyIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbV90bXJfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeGdwZTBfYmxrOwkvKiBFeHRlbmRlZCBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAwIFJlZyBCbGsgYWRkcmVzcyAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMV9ibGs7CS8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayBhZGRyZXNzICovCiB9OwogCiAvKgotICogU21hcnQgQmF0dGVyeQorICogIkRvd24tcmV2dmVkIiBBQ1BJIDIuMCBGQURUIGRlc2NyaXB0b3IKKyAqIERlZmluZWQgaGVyZSB0byBhbGxvdyBjb21waWxlciB0byBnZW5lcmF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJ1Y3QKICAqLwotc3RydWN0IHNtYXJ0X2JhdHRlcnlfdGFibGUgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgd2FybmluZ19sZXZlbDsKLQl1MzIgbG93X2xldmVsOwotCXUzMiBjcml0aWNhbF9sZXZlbDsKK3N0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cyB7CisJQUNQSV9GQURUX0NPTU1PTiB1MzIgZmxhZ3M7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBSZXNldCByZWdpc3RlciBhZGRyZXNzIGluIEdBUyBmb3JtYXQgKi8KKwl1OCByZXNldF92YWx1ZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0uICovCisJdTggcmVzZXJ2ZWQ3WzNdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCisvKgorICogQUNQSSAxLjAgRkFEVAorICogRGVmaW5lZCBoZXJlIHRvIGFsbG93IGNvbXBpbGVyIHRvIGdlbmVyYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cnVjdAorICovCitzdHJ1Y3QgZmFkdF9kZXNjcmlwdG9yX3JldjEgeworCUFDUElfRkFEVF9DT01NT04gdTMyIGZsYWdzOworfTsKKworLyogRkFEVDogUHJlZmVyZWQgUG93ZXIgTWFuYWdlbWVudCBQcm9maWxlcyAqLworCisjZGVmaW5lIFBNX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQTV9ERVNLVE9QICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUE1fTU9CSUxFICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBNX1dPUktTVEFUSU9OICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBQTV9FTlRFUlBSSVNFX1NFUlZFUiAgICAgICAgICAgIDQKKyNkZWZpbmUgUE1fU09IT19TRVJWRVIgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBNX0FQUExJQU5DRV9QQyAgICAgICAgICAgICAgICAgNgorCisvKiBGQURUOiBCb290IEFyY2ggRmxhZ3MgKi8KKworI2RlZmluZSBCQUZfTEVHQUNZX0RFVklDRVMgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBCQUZfODA0Ml9LRVlCT0FSRF9DT05UUk9MTEVSICAgIDB4MDAwMgorCisjZGVmaW5lIEZBRFQyX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgMworI2RlZmluZSBGQURUMl9NSU5VU19SRVZJU0lPTl9JRCAgICAgICAgIDIKKworLyogUmVzZXQgdG8gZGVmYXVsdCBwYWNraW5nICovCisKICNwcmFnbWEgcGFjaygpCiAKIC8qCisgKiBUaGlzIG1hY3JvIGlzIHRlbXBvcmFyeSB1bnRpbCB0aGUgdGFibGUgYml0ZmllbGQgZmxhZyBkZWZpbml0aW9ucworICogYXJlIHJlbW92ZWQgYW5kIHJlcGxhY2VkIGJ5IGEgRmxhZ3MgZmllbGQuCisgKi8KKyNkZWZpbmUgQUNQSV9GTEFHX09GRlNFVChkLGYsbykgICAgICAgICAodTgpIChBQ1BJX09GRlNFVCAoZCxmKSArIFwKKwkJCSAgc2l6ZW9mKCgoZCAqKTApLT5mKSArIG8pCisvKgorICogR2V0IHRoZSByZW1haW5pbmcgQUNQSSB0YWJsZXMKKyAqLworI2luY2x1ZGUgImFjdGJsMS5oIgorCisvKgogICogQUNQSSBUYWJsZSBpbmZvcm1hdGlvbi4gIFdlIHNhdmUgdGhlIHRhYmxlIGFkZHJlc3MsIGxlbmd0aCwKICAqIGFuZCB0eXBlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIChtYXBwZWQgb3IgYWxsb2NhdGVkKSBmb3IgZWFjaAogICogdGFibGUgZm9yIDEpIHdoZW4gd2UgZXhpdCwgYW5kIDIpIGlmIGEgbmV3IHRhYmxlIGlzIGluc3RhbGxlZApAQCAtMjkwLDI3ICszNTQsMTcgQEAKIAl1OCBmbGFnczsKIH07CiAKLS8qCi0gKiBHZXQgdGhlIEFDUEkgdmVyc2lvbi1zcGVjaWZpYyB0YWJsZXMKLSAqLwotI2luY2x1ZGUgImFjdGJsMS5oIgkJLyogQWNwaSAxLjAgdGFibGUgZGVmaW5pdGlvbnMgKi8KLSNpbmNsdWRlICJhY3RibDIuaCIJCS8qIEFjcGkgMi4wIHRhYmxlIGRlZmluaXRpb25zICovCi0KIGV4dGVybiB1OCBhY3BpX2ZhZHRfaXNfdjE7CS8qIGlzIHNldCB0byAxIGlmIEZBRFQgaXMgcmV2aXNpb24gMSwKIAkJCQkgKiBuZWVkZWQgZm9yIGNlcnRhaW4gd29ya2Fyb3VuZHMgKi8KKy8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIG9mZnNldHMgdG8gc3BlY2lmaWMgdGFibGUgZmllbGRzICovCiAKLSNwcmFnbWEgcGFjaygxKQotLyoKLSAqIEhpZ2ggcGVyZm9ybWFuY2UgdGltZXIKLSAqLwotc3RydWN0IGhwZXRfdGFibGUgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgaGFyZHdhcmVfaWQ7Ci0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGJhc2VfYWRkcmVzczsKLQl1OCBocGV0X251bWJlcjsKLQl1MTYgY2xvY2tfdGljazsKLQl1OCBhdHRyaWJ1dGVzOwotfTsKKyNkZWZpbmUgQUNQSV9GQUNTX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgZmFjc19kZXNjcmlwdG9yLGYpCisjZGVmaW5lIEFDUElfRkFEVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGZhZHRfZGVzY3JpcHRvciwgZikKKyNkZWZpbmUgQUNQSV9HQVNfT0ZGU0VUKGYpICAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MsZikKKyNkZWZpbmUgQUNQSV9IRFJfT0ZGU0VUKGYpICAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIsZikKKyNkZWZpbmUgQUNQSV9SU0RQX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgcnNkcF9kZXNjcmlwdG9yLGYpCiAKLSNwcmFnbWEgcGFjaygpCisjZGVmaW5lIEFDUElfRkFEVF9GTEFHX09GRlNFVChmLG8pICAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IGZhZHRfZGVzY3JpcHRvcixmLG8pCisjZGVmaW5lIEFDUElfRkFDU19GTEFHX09GRlNFVChmLG8pICAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IGZhY3NfZGVzY3JpcHRvcixmLG8pCiAKICNlbmRpZgkJCQkvKiBfX0FDVEJMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjdGJsMS5oIGIvaW5jbHVkZS9hY3BpL2FjdGJsMS5oCmluZGV4IGNkNDI4ZDUuLjc0NWE2NDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3RibDEuaAorKysgYi9pbmNsdWRlL2FjcGkvYWN0YmwxLmgKQEAgLTEsNiArMSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICogTmFtZTogYWN0YmwxLmggLSBBQ1BJIDEuMCB0YWJsZXMKKyAqIE5hbWU6IGFjdGJsMS5oIC0gQWRkaXRpb25hbCBBQ1BJIHRhYmxlIGRlZmluaXRpb25zCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC00NCw5MiArNDQsNTk5IEBACiAjaWZuZGVmIF9fQUNUQkwxX0hfXwogI2RlZmluZSBfX0FDVEJMMV9IX18KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBZGRpdGlvbmFsIEFDUEkgVGFibGVzCisgKgorICogVGhlc2UgdGFibGVzIGFyZSBub3QgY29uc3VtZWQgZGlyZWN0bHkgYnkgdGhlIEFDUElDQSBzdWJzeXN0ZW0sIGJ1dCBhcmUKKyAqIGluY2x1ZGVkIGhlcmUgdG8gc3VwcG9ydCBkZXZpY2UgZHJpdmVycyBhbmQgdGhlIEFNTCBkaXNhc3NlbWJsZXIuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgZGVzY3JpcHRpb24gdGFibGUgaGVhZGVyIHNpZ25hdHVyZXMuIFVzZWZ1bCBiZWNhdXNlIHRoZXkgbWFrZQorICogaXQgbW9yZSBkaWZmaWN1bHQgdG8gaW5hZHZlcnRlbnRseSB0eXBlIGluIHRoZSB3cm9uZyBzaWduYXR1cmUuCisgKi8KKyNkZWZpbmUgQUNQSV9TSUdfQVNGICAgICAgICAgICAgIkFTRiEiCS8qIEFsZXJ0IFN0YW5kYXJkIEZvcm1hdCB0YWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19CT09UICAgICAgICAgICAiQk9PVCIJLyogU2ltcGxlIEJvb3QgRmxhZyBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19DUEVQICAgICAgICAgICAiQ1BFUCIJLyogQ29ycmVjdGVkIFBsYXRmb3JtIEVycm9yIFBvbGxpbmcgdGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfREJHUCAgICAgICAgICAgIkRCR1AiCS8qIERlYnVnIFBvcnQgdGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfRUNEVCAgICAgICAgICAgIkVDRFQiCS8qIEVtYmVkZGVkIENvbnRyb2xsZXIgQm9vdCBSZXNvdXJjZXMgVGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfSFBFVCAgICAgICAgICAgIkhQRVQiCS8qIEhpZ2ggUHJlY2lzaW9uIEV2ZW50IFRpbWVyIHRhYmxlICovCisjZGVmaW5lIEFDUElfU0lHX01BRFQgICAgICAgICAgICJBUElDIgkvKiBNdWx0aXBsZSBBUElDIERlc2NyaXB0aW9uIFRhYmxlICovCisjZGVmaW5lIEFDUElfU0lHX01DRkcgICAgICAgICAgICJNQ0ZHIgkvKiBQQ0kgTWVtb3J5IE1hcHBlZCBDb25maWd1cmF0aW9uIHRhYmxlICovCisjZGVmaW5lIEFDUElfU0lHX1NCU1QgICAgICAgICAgICJTQlNUIgkvKiBTbWFydCBCYXR0ZXJ5IFNwZWNpZmljYXRpb24gVGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfU0xJVCAgICAgICAgICAgIlNMSVQiCS8qIFN5c3RlbSBMb2NhbGl0eSBEaXN0YW5jZSBJbmZvcm1hdGlvbiBUYWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19TUENSICAgICAgICAgICAiU1BDUiIJLyogU2VyaWFsIFBvcnQgQ29uc29sZSBSZWRpcmVjdGlvbiB0YWJsZSAqLworI2RlZmluZSBBQ1BJX1NJR19TUE1JICAgICAgICAgICAiU1BNSSIJLyogU2VydmVyIFBsYXRmb3JtIE1hbmFnZW1lbnQgSW50ZXJmYWNlIHRhYmxlICovCisjZGVmaW5lIEFDUElfU0lHX1NSQVQgICAgICAgICAgICJTUkFUIgkvKiBTeXN0ZW0gUmVzb3VyY2UgQWZmaW5pdHkgVGFibGUgKi8KKyNkZWZpbmUgQUNQSV9TSUdfVENQQSAgICAgICAgICAgIlRDUEEiCS8qIFRydXN0ZWQgQ29tcHV0aW5nIFBsYXRmb3JtIEFsbGlhbmNlIHRhYmxlICovCisjZGVmaW5lIEFDUElfU0lHX1dEUlQgICAgICAgICAgICJXRFJUIgkvKiBXYXRjaGRvZyBSZXNvdXJjZSBUYWJsZSAqLworCisvKiBMZWdhY3kgbmFtZXMgKi8KKworI2RlZmluZSBBUElDX1NJRyAgICAgICAgICAgICAgICAiQVBJQyIJLyogTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZSAqLworI2RlZmluZSBCT09UX1NJRyAgICAgICAgICAgICAgICAiQk9PVCIJLyogU2ltcGxlIEJvb3QgRmxhZyBUYWJsZSAqLworI2RlZmluZSBTQlNUX1NJRyAgICAgICAgICAgICAgICAiU0JTVCIJLyogU21hcnQgQmF0dGVyeSBTcGVjaWZpY2F0aW9uIFRhYmxlICovCisKKy8qCisgKiBBbGwgdGFibGVzIG11c3QgYmUgYnl0ZS1wYWNrZWQgdG8gbWF0Y2ggdGhlIEFDUEkgc3BlY2lmaWNhdGlvbiwgc2luY2UKKyAqIHRoZSB0YWJsZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBzeXN0ZW0gQklPUy4KKyAqLwogI3ByYWdtYSBwYWNrKDEpCiAKIC8qCi0gKiBBQ1BJIDEuMCBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEVCkKKyAqIE5vdGUgYWJvdXQgYml0ZmllbGRzOiBUaGUgdTggdHlwZSBpcyB1c2VkIGZvciBiaXRmaWVsZHMgaW4gQUNQSSB0YWJsZXMuCisgKiBUaGlzIGlzIHRoZSBvbmx5IHR5cGUgdGhhdCBpcyBldmVuIHJlbW90ZWx5IHBvcnRhYmxlLiBBbnl0aGluZyBlbHNlIGlzIG5vdAorICogcG9ydGFibGUsIHNvIGRvIG5vdCB1c2UgYW55IG90aGVyIGJpdGZpZWxkIHR5cGVzLgogICovCi1zdHJ1Y3QgcnNkdF9kZXNjcmlwdG9yX3JldjEgewotCUFDUElfVEFCTEVfSEVBREVSX0RFRgkvKiBBQ1BJIGNvbW1vbiB0YWJsZSBoZWFkZXIgKi8KLQl1MzIgdGFibGVfb2Zmc2V0X2VudHJ5WzFdOwkvKiBBcnJheSBvZiBwb2ludGVycyB0byBBQ1BJIHRhYmxlcyAqLwotfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBBU0YgLSBBbGVydCBTdGFuZGFyZCBGb3JtYXQgdGFibGUgKFNpZ25hdHVyZSAiQVNGISIpCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfdGFibGVfYXNmIHsKK0FDUElfVEFCTEVfSEVBREVSX0RFRn07CisKKyNkZWZpbmUgQUNQSV9BU0ZfSEVBREVSX0RFRiBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOyBcCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZDsgXAorCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworCitzdHJ1Y3QgYWNwaV9hc2ZfaGVhZGVyIHsKK0FDUElfQVNGX0hFQURFUl9ERUZ9OworCisvKiBWYWx1ZXMgZm9yIFR5cGUgZmllbGQgKi8KKworI2RlZmluZSBBU0ZfSU5GTyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTRl9BTEVSVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVNGX0NPTlRST0wgICAgICAgICAgICAgMgorI2RlZmluZSBBU0ZfQk9PVCAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFTRl9BRERSRVNTICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVNGX1JFU0VSVkVEICAgICAgICAgICAgNQogCiAvKgotICogQUNQSSAxLjAgRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAoRkFDUykKKyAqIEFTRiBzdWJ0YWJsZXMKICAqLwotc3RydWN0IGZhY3NfZGVzY3JpcHRvcl9yZXYxIHsKLQljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCi0JdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KLQl1MzIgaGFyZHdhcmVfc2lnbmF0dXJlOwkvKiBIYXJkd2FyZSBjb25maWd1cmF0aW9uIHNpZ25hdHVyZSAqLwotCXUzMiBmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiBBQ1BJIE9TIHdha2luZyB2ZWN0b3IgKi8KLQl1MzIgZ2xvYmFsX2xvY2s7CS8qIEdsb2JhbCBMb2NrICovCisKKy8qIDA6IEFTRiBJbmZvcm1hdGlvbiAqLworCitzdHJ1Y3QgYWNwaV9hc2ZfaW5mbyB7CisJQUNQSV9BU0ZfSEVBREVSX0RFRiB1OCBtaW5fcmVzZXRfdmFsdWU7CisJdTggbWluX3BvbGxfaW50ZXJ2YWw7CisJdTE2IHN5c3RlbV9pZDsKKwl1MzIgbWZnX2lkOworCXU4IGZsYWdzOworCXU4IHJlc2VydmVkMlszXTsKK307CisKKy8qIDE6IEFTRiBBbGVydHMgKi8KKworc3RydWN0IGFjcGlfYXNmX2FsZXJ0IHsKKwlBQ1BJX0FTRl9IRUFERVJfREVGIHU4IGFzc2VydF9tYXNrOworCXU4IGRlYXNzZXJ0X21hc2s7CisJdTggYWxlcnRzOworCXU4IGRhdGFfbGVuZ3RoOworCXU4IGFycmF5WzFdOworfTsKKworLyogMjogQVNGIFJlbW90ZSBDb250cm9sICovCisKK3N0cnVjdCBhY3BpX2FzZl9yZW1vdGUgeworCUFDUElfQVNGX0hFQURFUl9ERUYgdTggY29udHJvbHM7CisJdTggZGF0YV9sZW5ndGg7CisJdTE2IHJlc2VydmVkMjsKKwl1OCBhcnJheVsxXTsKK307CisKKy8qIDM6IEFTRiBSTUNQIEJvb3QgT3B0aW9ucyAqLworCitzdHJ1Y3QgYWNwaV9hc2Zfcm1jcCB7CisJQUNQSV9BU0ZfSEVBREVSX0RFRiB1OCBjYXBhYmlsaXRpZXNbN107CisJdTggY29tcGxldGlvbl9jb2RlOworCXUzMiBlbnRlcnByaXNlX2lkOworCXU4IGNvbW1hbmQ7CisJdTE2IHBhcmFtZXRlcjsKKwl1MTYgYm9vdF9vcHRpb25zOworCXUxNiBvZW1fcGFyYW1ldGVyczsKK307CisKKy8qIDQ6IEFTRiBBZGRyZXNzICovCisKK3N0cnVjdCBhY3BpX2FzZl9hZGRyZXNzIHsKKwlBQ1BJX0FTRl9IRUFERVJfREVGIHU4IGVwcm9tX2FkZHJlc3M7CisJdTggZGV2aWNlczsKKwl1OCBzbWJ1c19hZGRyZXNzZXNbMV07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEJPT1QgLSBTaW1wbGUgQm9vdCBGbGFnIFRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfdGFibGVfYm9vdCB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHU4IGNtb3NfaW5kZXg7CS8qIEluZGV4IGluIENNT1MgUkFNIGZvciB0aGUgYm9vdCByZWdpc3RlciAqLworCXU4IHJlc2VydmVkWzNdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDUEVQIC0gQ29ycmVjdGVkIFBsYXRmb3JtIEVycm9yIFBvbGxpbmcgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90YWJsZV9jcGVwIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTY0IHJlc2VydmVkOworfTsKKworLyogU3VidGFibGUgKi8KKworc3RydWN0IGFjcGlfY3BlcF9wb2xsaW5nIHsKKwl1OCB0eXBlOworCXU4IGxlbmd0aDsKKwl1OCBwcm9jZXNzb3JfaWQ7CS8qIFByb2Nlc3NvciBJRCAqLworCXU4IHByb2Nlc3Nvcl9laWQ7CS8qIFByb2Nlc3NvciBFSUQgKi8KKwl1MzIgcG9sbGluZ19pbnRlcnZhbDsJLyogUG9sbGluZyBpbnRlcnZhbCAobXNlYykgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogREJHUCAtIERlYnVnIFBvcnQgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90YWJsZV9kYmdwIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTggaW50ZXJmYWNlX3R5cGU7CS8qIDA9ZnVsbCAxNjU1MCwgMT1zdWJzZXQgb2YgMTY1NTAgKi8KKwl1OCByZXNlcnZlZFszXTsKKwlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZGVidWdfcG9ydDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRUNEVCAtIEVtYmVkZGVkIENvbnRyb2xsZXIgQm9vdCBSZXNvdXJjZXMgVGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZWNfYm9vdF9yZXNvdXJjZXMgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiBzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZWNfY29udHJvbDsJLyogQWRkcmVzcyBvZiBFQyBjb21tYW5kL3N0YXR1cyByZWdpc3RlciAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBlY19kYXRhOwkvKiBBZGRyZXNzIG9mIEVDIGRhdGEgcmVnaXN0ZXIgKi8KKwl1MzIgdWlkOwkJLyogVW5pcXVlIElEIC0gbXVzdCBiZSBzYW1lIGFzIHRoZSBFQyBfVUlEIG1ldGhvZCAqLworCXU4IGdwZV9iaXQ7CQkvKiBUaGUgR1BFIGZvciB0aGUgRUMgKi8KKwl1OCBlY19pZFsxXTsJCS8qIEZ1bGwgbmFtZXBhdGggb2YgdGhlIEVDIGluIHRoZSBBQ1BJIG5hbWVzcGFjZSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBIUEVUIC0gSGlnaCBQcmVjaXNpb24gRXZlbnQgVGltZXIgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV9ocGV0X3RhYmxlIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIGhhcmR3YXJlX2lkOwkvKiBIYXJkd2FyZSBJRCBvZiBldmVudCB0aW1lciBibG9jayAqLworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBiYXNlX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgZXZlbnQgdGltZXIgYmxvY2sgKi8KKwl1OCBocGV0X251bWJlcjsJCS8qIEhQRVQgc2VxdWVuY2UgbnVtYmVyICovCisJdTE2IGNsb2NrX3RpY2s7CQkvKiBNYWluIGNvdW50ZXIgbWluIHRpY2ssIHBlcmlvZGljIG1vZGUgKi8KKwl1OCBhdHRyaWJ1dGVzOworfTsKKworI2lmIDAJCQkJLyogSFBFVCBmbGFncyB0byBiZSBjb252ZXJ0ZWQgdG8gbWFjcm9zICovCitzdHJ1Y3QgewkJCS8qIEZsYWdzICg4IGJpdHMpICovCisJdTggcGFnZV9wcm90ZWN0OjE7CS8qIDAwOiAgICBObyBwYWdlIHByb3RlY3Rpb24gKi8KKwl1OCBwYWdlX3Byb3RlY3Q0OjE7CS8qIDAxOiAgICA0X2tCIHBhZ2UgcHJvdGVjdGVkICovCisJdTggcGFnZV9wcm90ZWN0NjQ6MTsJLyogMDI6ICAgIDY0X2tCIHBhZ2UgcHJvdGVjdGVkICovCisJIHU4OjU7CQkJLyogMDMtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KK30gZmxhZ3M7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNQURUIC0gTXVsdGlwbGUgQVBJQyBEZXNjcmlwdGlvbiBUYWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBtdWx0aXBsZV9hcGljX3RhYmxlIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIGxvY2FsX2FwaWNfYWRkcmVzczsJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBsb2NhbCBBUElDICovCiAKIAkvKiBGbGFncyAoMzIgYml0cykgKi8KIAotCXU4IFM0Ymlvc19mOjE7CQkvKiAwMDogICAgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLworCXU4IFBDQVRjb21wYXQ6MTsJLyogMDA6ICAgIFN5c3RlbSBhbHNvIGhhcyBkdWFsIDgyNTlzICovCiAJIHU4Ojc7CQkJLyogMDEtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KIAl1OCByZXNlcnZlZDFbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0KLQl1OCByZXNlcnZlZDJbNDBdOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCisvKiBWYWx1ZXMgZm9yIE1BRFQgUENBVENvbXBhdCAqLworCisjZGVmaW5lIERVQUxfUElDICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVVMVElQTEVfQVBJQyAgICAgICAgICAgMQorCisvKiBDb21tb24gTUFEVCBTdWItdGFibGUgaGVhZGVyICovCisKKyNkZWZpbmUgQVBJQ19IRUFERVJfREVGIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKKworc3RydWN0IGFwaWNfaGVhZGVyIHsKK0FQSUNfSEVBREVSX0RFRn07CisKKy8qIFZhbHVlcyBmb3IgVHlwZSBpbiBzdHJ1Y3QgYXBpY19oZWFkZXIgKi8KKworI2RlZmluZSBBUElDX1BST0NFU1NPUiAgICAgICAgICAwCisjZGVmaW5lIEFQSUNfSU8gICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVBJQ19YUlVQVF9PVkVSUklERSAgICAgMgorI2RlZmluZSBBUElDX05NSSAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFQSUNfTE9DQUxfTk1JICAgICAgICAgIDQKKyNkZWZpbmUgQVBJQ19BRERSRVNTX09WRVJSSURFICAgNQorI2RlZmluZSBBUElDX0lPX1NBUElDICAgICAgICAgICA2CisjZGVmaW5lIEFQSUNfTE9DQUxfU0FQSUMgICAgICAgIDcKKyNkZWZpbmUgQVBJQ19YUlVQVF9TT1VSQ0UgICAgICAgOAorI2RlZmluZSBBUElDX1JFU0VSVkVEICAgICAgICAgICA5CS8qIDkgYW5kIGdyZWF0ZXIgYXJlIHJlc2VydmVkICovCisKKy8qIEZsYWcgZGVmaW5pdGlvbnMgZm9yIE1BRFQgc3ViLXRhYmxlcyAqLworCisjZGVmaW5lIEFDUElfTUFEVF9JRkxBR1MgLyogSU5USSBmbGFncyAoMTYgYml0cykgKi8gXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9sYXJpdHkgICAgICAgIDogMjsgICAgLyogMDAtMDE6IFBvbGFyaXR5IG9mIEFQSUMgSS9PIGlucHV0IHNpZ25hbHMgKi9cCisJdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX21vZGUgICAgOiAyOyAgICAvKiAwMi0wMzogVHJpZ2dlciBtb2RlIG9mIEFQSUMgaW5wdXQgc2lnbmFscyAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDQ7ICAgIC8qIDA0LTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOwkvKiAwOC0xNTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisjZGVmaW5lIEFDUElfTUFEVF9MRkxBR1MgLyogTG9jYWwgU2FwaWMgZmxhZ3MgKDMyIGJpdHMpICovIFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Nvcl9lbmFibGVkOiAxOyAgIC8qIDAwOiAgICBQcm9jZXNzb3IgaXMgdXNhYmxlIGlmIHNldCAqL1wKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDc7ICAgIC8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQyWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisvKiBWYWx1ZXMgZm9yIE1QUyBJTlRJIGZsYWdzICovCisKKyNkZWZpbmUgUE9MQVJJVFlfQ09ORk9STVMgICAgICAgMAorI2RlZmluZSBQT0xBUklUWV9BQ1RJVkVfSElHSCAgICAxCisjZGVmaW5lIFBPTEFSSVRZX1JFU0VSVkVEICAgICAgIDIKKyNkZWZpbmUgUE9MQVJJVFlfQUNUSVZFX0xPVyAgICAgMworCisjZGVmaW5lIFRSSUdHRVJfQ09ORk9STVMgICAgICAgIDAKKyNkZWZpbmUgVFJJR0dFUl9FREdFICAgICAgICAgICAgMQorI2RlZmluZSBUUklHR0VSX1JFU0VSVkVEICAgICAgICAyCisjZGVmaW5lIFRSSUdHRVJfTEVWRUwgICAgICAgICAgIDMKKwogLyoKLSAqIEFDUEkgMS4wIEZpeGVkIEFDUEkgRGVzY3JpcHRpb24gVGFibGUgKEZBRFQpCisgKiBNQURUIFN1Yi10YWJsZXMsIGNvcnJlc3BvbmQgdG8gVHlwZSBpbiBzdHJ1Y3QgYXBpY19oZWFkZXIKICAqLwotc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYxIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JdTMyIGZpcm13YXJlX2N0cmw7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXUzMiBkc2R0OwkJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiBEU0RUICovCi0JdTggbW9kZWw7CQkvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsICovCi0JdTggcmVzZXJ2ZWQxOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXUxNiBzY2lfaW50OwkJLyogU3lzdGVtIHZlY3RvciBvZiBTQ0kgaW50ZXJydXB0ICovCi0JdTMyIHNtaV9jbWQ7CQkvKiBQb3J0IGFkZHJlc3Mgb2YgU01JIGNvbW1hbmQgcG9ydCAqLwotCXU4IGFjcGlfZW5hYmxlOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLwotCXU4IGFjcGlfZGlzYWJsZTsJLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBkaXNhYmxlIEFDUEkgKi8KLQl1OCBTNGJpb3NfcmVxOwkJLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8KLQl1OCByZXNlcnZlZDI7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTMyIHBtMWFfZXZ0X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgKi8KLQl1MzIgcG0xYl9ldnRfYmxrOwkvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIGFjcGlfZXZlbnQgUmVnIEJsayAqLwotCXUzMiBwbTFhX2NudF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovCi0JdTMyIHBtMWJfY250X2JsazsJLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgcG0yX2NudF9ibGs7CS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMiBDb250cm9sIFJlZyBCbGsgKi8KLQl1MzIgcG1fdG1yX2JsazsJCS8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgVGltZXIgQ3RybCBSZWcgQmxrICovCi0JdTMyIGdwZTBfYmxrOwkJLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayAqLwotCXUzMiBncGUxX2JsazsJCS8qIFBvcnQgYWRkciBvZiBHZW5lcmFsIFB1cnBvc2UgYWNwaV9ldmVudCAxIFJlZyBCbGsgKi8KLQl1OCBwbTFfZXZ0X2xlbjsJCS8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8KLQl1OCBwbTFfY250X2xlbjsJCS8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2NudF9ibGsgKi8KLQl1OCBwbTJfY250X2xlbjsJCS8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IHBtMl9jbnRfYmxrICovCi0JdTggcG1fdG1fbGVuOwkJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG1fdG1fYmxrICovCi0JdTggZ3BlMF9ibGtfbGVuOwkvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLwotCXU4IGdwZTFfYmxrX2xlbjsJLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgZ3BlMV9ibGsgKi8KLQl1OCBncGUxX2Jhc2U7CQkvKiBPZmZzZXQgaW4gZ3BlIG1vZGVsIHdoZXJlIGdwZTEgZXZlbnRzIHN0YXJ0ICovCi0JdTggcmVzZXJ2ZWQzOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXUxNiBwbHZsMl9sYXQ7CQkvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMiBzdGF0ZSAqLwotCXUxNiBwbHZsM19sYXQ7CQkvKiBXb3JzdCBjYXNlIEhXIGxhdGVuY3kgdG8gZW50ZXIvZXhpdCBDMyBzdGF0ZSAqLwotCXUxNiBmbHVzaF9zaXplOwkJLyogU2l6ZSBvZiBhcmVhIHJlYWQgdG8gZmx1c2ggY2FjaGVzICovCi0JdTE2IGZsdXNoX3N0cmlkZTsJLyogU3RyaWRlIHVzZWQgaW4gZmx1c2hpbmcgY2FjaGVzICovCi0JdTggZHV0eV9vZmZzZXQ7CQkvKiBCaXQgbG9jYXRpb24gb2YgZHV0eSBjeWNsZSBmaWVsZCBpbiBwX2NudCByZWcgKi8KLQl1OCBkdXR5X3dpZHRoOwkJLyogQml0IHdpZHRoIG9mIGR1dHkgY3ljbGUgZmllbGQgaW4gcF9jbnQgcmVnICovCi0JdTggZGF5X2Fscm07CQkvKiBJbmRleCB0byBkYXktb2YtbW9udGggYWxhcm0gaW4gUlRDIENNT1MgUkFNICovCi0JdTggbW9uX2Fscm07CQkvKiBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLwotCXU4IGNlbnR1cnk7CQkvKiBJbmRleCB0byBjZW50dXJ5IGluIFJUQyBDTU9TIFJBTSAqLwotCXU4IHJlc2VydmVkNFszXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCisvKiAwOiBwcm9jZXNzb3IgQVBJQyAqLworCitzdHJ1Y3QgbWFkdF9wcm9jZXNzb3JfYXBpYyB7CisJQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwl1OCBsb2NhbF9hcGljX2lkOwkvKiBQcm9jZXNzb3IncyBsb2NhbCBBUElDIGlkICovCisgQUNQSV9NQURUX0xGTEFHU307CisKKy8qIDE6IElPIEFQSUMgKi8KKworc3RydWN0IG1hZHRfaW9fYXBpYyB7CisJQVBJQ19IRUFERVJfREVGIHU4IGlvX2FwaWNfaWQ7CS8qIEkvTyBBUElDIElEICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCAtIG11c3QgYmUgemVybyAqLworCXUzMiBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCisJdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0IHdoZXJlIElOVEkgbGluZXMgc3RhcnQgKi8KK307CisKKy8qIDI6IEludGVycnVwdCBPdmVycmlkZSAqLworCitzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfb3ZlcnJpZGUgeworCUFQSUNfSEVBREVSX0RFRiB1OCBidXM7CS8qIDAgLSBJU0EgKi8KKwl1OCBzb3VyY2U7CQkvKiBJbnRlcnJ1cHQgc291cmNlIChJUlEpICovCisJdTMyIGludGVycnVwdDsJCS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCisgQUNQSV9NQURUX0lGTEFHU307CisKKy8qIDM6IE5NSSBTb3VyY2VzICovCisKK3N0cnVjdCBtYWR0X25taV9zb3VyY2UgeworCUFQSUNfSEVBREVSX0RFRiBBQ1BJX01BRFRfSUZMQUdTIHUzMiBpbnRlcnJ1cHQ7CS8qIEdsb2JhbCBzeXN0ZW0gaW50ZXJydXB0ICovCit9OworCisvKiA0OiBMb2NhbCBBUElDIE5NSSAqLworCitzdHJ1Y3QgbWFkdF9sb2NhbF9hcGljX25taSB7CisJQVBJQ19IRUFERVJfREVGIHU4IHByb2Nlc3Nvcl9pZDsJLyogQUNQSSBwcm9jZXNzb3IgaWQgKi8KKwlBQ1BJX01BRFRfSUZMQUdTIHU4IGxpbnQ7CS8qIExJTlRuIHRvIHdoaWNoIE5NSSBpcyBjb25uZWN0ZWQgKi8KK307CisKKy8qIDU6IEFkZHJlc3MgT3ZlcnJpZGUgKi8KKworc3RydWN0IG1hZHRfYWRkcmVzc19vdmVycmlkZSB7CisJQVBJQ19IRUFERVJfREVGIHUxNiByZXNlcnZlZDsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU2NCBhZGRyZXNzOwkJLyogQVBJQyBwaHlzaWNhbCBhZGRyZXNzICovCit9OworCisvKiA2OiBJL08gU2FwaWMgKi8KKworc3RydWN0IG1hZHRfaW9fc2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBpb19zYXBpY19pZDsJLyogSS9PIFNBUElDIElEICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTMyIGludGVycnVwdF9iYXNlOwkvKiBHbG9jYWwgaW50ZXJydXB0IGZvciBTQVBJQyBzdGFydCAqLworCXU2NCBhZGRyZXNzOwkJLyogU0FQSUMgcGh5c2ljYWwgYWRkcmVzcyAqLworfTsKKworLyogNzogTG9jYWwgU2FwaWMgKi8KKworc3RydWN0IG1hZHRfbG9jYWxfc2FwaWMgeworCUFQSUNfSEVBREVSX0RFRiB1OCBwcm9jZXNzb3JfaWQ7CS8qIEFDUEkgcHJvY2Vzc29yIGlkICovCisJdTggbG9jYWxfc2FwaWNfaWQ7CS8qIFNBUElDIElEICovCisJdTggbG9jYWxfc2FwaWNfZWlkOwkvKiBTQVBJQyBFSUQgKi8KKwl1OCByZXNlcnZlZFszXTsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwkgQUNQSV9NQURUX0xGTEFHUyB1MzIgcHJvY2Vzc29yX3VJRDsJLyogTnVtZXJpYyBVSUQgLSBBQ1BJIDMuMCAqLworCWNoYXIgcHJvY2Vzc29yX3VJRHN0cmluZ1sxXTsJLyogU3RyaW5nIFVJRCAgLSBBQ1BJIDMuMCAqLworfTsKKworLyogODogUGxhdGZvcm0gSW50ZXJydXB0IFNvdXJjZSAqLworCitzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfc291cmNlIHsKKwlBUElDX0hFQURFUl9ERUYgQUNQSV9NQURUX0lGTEFHUyB1OCBpbnRlcnJ1cHRfdHlwZTsJLyogMT1QTUksIDI9SU5JVCwgMz1jb3JyZWN0ZWQgKi8KKwl1OCBwcm9jZXNzb3JfaWQ7CS8qIFByb2Nlc3NvciBJRCAqLworCXU4IHByb2Nlc3Nvcl9laWQ7CS8qIFByb2Nlc3NvciBFSUQgKi8KKwl1OCBpb19zYXBpY192ZWN0b3I7CS8qIFZlY3RvciB2YWx1ZSBmb3IgUE1JIGludGVycnVwdHMgKi8KKwl1MzIgaW50ZXJydXB0OwkJLyogR2xvYmFsIHN5c3RlbSBpbnRlcnJ1cHQgKi8KKwl1MzIgZmxhZ3M7CQkvKiBJbnRlcnJ1cHQgU291cmNlIEZsYWdzICovCit9OworCisjaWZkZWYgRFVQTElDQVRFX0RFRklOSVRJT05fV0lUSF9MSU5VWF9BQ1BJX0gKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTUNGRyAtIFBDSSBNZW1vcnkgTWFwcGVkIENvbmZpZ3VyYXRpb24gdGFibGUgYW5kIHN1Yi10YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3RhYmxlX21jZmcgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1OCByZXNlcnZlZFs4XTsKK307CisKK3N0cnVjdCBhY3BpX21jZmdfYWxsb2NhdGlvbiB7CisJdTY0IGJhc2VfYWRkcmVzczsJLyogQmFzZSBhZGRyZXNzLCBwcm9jZXNzb3ItcmVsYXRpdmUgKi8KKwl1MTYgcGNpX3NlZ21lbnQ7CS8qIFBDSSBzZWdtZW50IGdyb3VwIG51bWJlciAqLworCXU4IHN0YXJ0X2J1c19udW1iZXI7CS8qIFN0YXJ0aW5nIFBDSSBCdXMgbnVtYmVyICovCisJdTggZW5kX2J1c19udW1iZXI7CS8qIEZpbmFsIFBDSSBCdXMgbnVtYmVyICovCisJdTMyIHJlc2VydmVkOworfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNCU1QgLSBTbWFydCBCYXR0ZXJ5IFNwZWNpZmljYXRpb24gVGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3Qgc21hcnRfYmF0dGVyeV90YWJsZSB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiB3YXJuaW5nX2xldmVsOworCXUzMiBsb3dfbGV2ZWw7CisJdTMyIGNyaXRpY2FsX2xldmVsOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTTElUIC0gU3lzdGVtIExvY2FsaXR5IERpc3RhbmNlIEluZm9ybWF0aW9uIFRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHN5c3RlbV9sb2NhbGl0eV9pbmZvIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTY0IGxvY2FsaXR5X2NvdW50OworCXU4IGVudHJ5WzFdWzFdOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBTUENSIC0gU2VyaWFsIFBvcnQgQ29uc29sZSBSZWRpcmVjdGlvbiB0YWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBhY3BpX3RhYmxlX3NwY3IgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1OCBpbnRlcmZhY2VfdHlwZTsJLyogMD1mdWxsIDE2NTUwLCAxPXN1YnNldCBvZiAxNjU1MCAqLworCXU4IHJlc2VydmVkWzNdOworCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyBzZXJpYWxfcG9ydDsKKwl1OCBpbnRlcnJ1cHRfdHlwZTsKKwl1OCBwY19pbnRlcnJ1cHQ7CisJdTMyIGludGVycnVwdDsKKwl1OCBiYXVkX3JhdGU7CisJdTggcGFyaXR5OworCXU4IHN0b3BfYml0czsKKwl1OCBmbG93X2NvbnRyb2w7CisJdTggdGVybWluYWxfdHlwZTsKKwl1OCByZXNlcnZlZDI7CisJdTE2IHBjaV9kZXZpY2VfaWQ7CisJdTE2IHBjaV92ZW5kb3JfaWQ7CisJdTggcGNpX2J1czsKKwl1OCBwY2lfZGV2aWNlOworCXU4IHBjaV9mdW5jdGlvbjsKKwl1MzIgcGNpX2ZsYWdzOworCXU4IHBjaV9zZWdtZW50OworCXUzMiByZXNlcnZlZDM7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFNQTUkgLSBTZXJ2ZXIgUGxhdGZvcm0gTWFuYWdlbWVudCBJbnRlcmZhY2UgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90YWJsZV9zcG1pIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTggcmVzZXJ2ZWQ7CisJdTggaW50ZXJmYWNlX3R5cGU7CisJdTE2IHNwZWNfcmV2aXNpb247CS8qIFZlcnNpb24gb2YgSVBNSSAqLworCXU4IGludGVycnVwdF90eXBlOworCXU4IGdwZV9udW1iZXI7CQkvKiBHUEUgYXNzaWduZWQgKi8KKwl1OCByZXNlcnZlZDI7CisJdTggcGNpX2RldmljZV9mbGFnOworCXUzMiBpbnRlcnJ1cHQ7CisJc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGlwbWlfcmVnaXN0ZXI7CisJdTggcGNpX3NlZ21lbnQ7CisJdTggcGNpX2J1czsKKwl1OCBwY2lfZGV2aWNlOworCXU4IHBjaV9mdW5jdGlvbjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogU1JBVCAtIFN5c3RlbSBSZXNvdXJjZSBBZmZpbml0eSBUYWJsZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBzeXN0ZW1fcmVzb3VyY2VfYWZmaW5pdHkgeworCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1MzIgcmVzZXJ2ZWQxOwkvKiBNdXN0IGJlIHZhbHVlICcxJyAqLworCXU2NCByZXNlcnZlZDI7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCit9OworCisvKiBTUkFUIGNvbW1vbiBzdWItdGFibGUgaGVhZGVyICovCisKKyNkZWZpbmUgU1JBVF9TVUJUQUJMRV9IRUFERVIgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOworCisvKiBWYWx1ZXMgZm9yIFR5cGUgYWJvdmUgKi8KKworI2RlZmluZSBTUkFUX0NQVV9BRkZJTklUWSAgICAgICAwCisjZGVmaW5lIFNSQVRfTUVNT1JZX0FGRklOSVRZICAgIDEKKyNkZWZpbmUgU1JBVF9SRVNFUlZFRCAgICAgICAgICAgMgorCisvKiBTUkFUIHN1Yi10YWJsZXMgKi8KKworc3RydWN0IHN0YXRpY19yZXNvdXJjZV9hbGxvYyB7CisJU1JBVF9TVUJUQUJMRV9IRUFERVIgdTggcHJveGltaXR5X2RvbWFpbl9sbzsKKwl1OCBhcGljX2lkOwogCiAJLyogRmxhZ3MgKDMyIGJpdHMpICovCiAKLQl1OCB3Yl9pbnZkOjE7CQkvKiAwMDogICAgVGhlIHdiaW52ZCBpbnN0cnVjdGlvbiB3b3JrcyBwcm9wZXJseSAqLwotCXU4IHdiX2ludmRfZmx1c2g6MTsJLyogMDE6ICAgIFRoZSB3YmludmQgZmx1c2hlcyBidXQgZG9lcyBub3QgaW52YWxpZGF0ZSAqLwotCXU4IHByb2NfYzE6MTsJCS8qIDAyOiAgICBBbGwgcHJvY2Vzc29ycyBzdXBwb3J0IEMxIHN0YXRlICovCi0JdTggcGx2bDJfdXA6MTsJCS8qIDAzOiAgICBDMiBzdGF0ZSB3b3JrcyBvbiBNUCBzeXN0ZW0gKi8KLQl1OCBwd3JfYnV0dG9uOjE7CS8qIDA0OiAgICBQb3dlciBidXR0b24gaXMgaGFuZGxlZCBhcyBhIGdlbmVyaWMgZmVhdHVyZSAqLwotCXU4IHNsZWVwX2J1dHRvbjoxOwkvKiAwNTogICAgU2xlZXAgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUsIG9yIG5vdCBwcmVzZW50ICovCi0JdTggZml4ZWRfclRDOjE7CQkvKiAwNjogICAgUlRDIHdha2V1cCBzdGF0IG5vdCBpbiBmaXhlZCByZWdpc3RlciBzcGFjZSAqLwotCXU4IHJ0Y3M0OjE7CQkvKiAwNzogICAgUlRDIHdha2V1cCBzdGF0IG5vdCBwb3NzaWJsZSBmcm9tIFM0ICovCi0JdTggdG1yX3ZhbF9leHQ6MTsJLyogMDg6ICAgIHRtcl92YWwgd2lkdGggaXMgMzIgYml0cyAoMCA9IDI0IGJpdHMpICovCi0JIHU4Ojc7CQkJLyogMDktMTU6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQl1OCByZXNlcnZlZDVbMl07CS8qIDE2LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisJdTggZW5hYmxlZDoxOwkJLyogMDA6ICAgIFVzZSBhZmZpbml0eSBzdHJ1Y3R1cmUgKi8KKwkgdTg6NzsJCQkvKiAwMS0wNzogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworCXU4IHJlc2VydmVkM1szXTsJLyogMDgtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKworCXU4IGxvY2FsX3NhcGljX2VpZDsKKwl1OCBwcm94aW1pdHlfZG9tYWluX2hpWzNdOworCXUzMiByZXNlcnZlZDQ7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCiB9OwogCitzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5IHsKKwlTUkFUX1NVQlRBQkxFX0hFQURFUiB1MzIgcHJveGltaXR5X2RvbWFpbjsKKwl1MTYgcmVzZXJ2ZWQzOworCXU2NCBiYXNlX2FkZHJlc3M7CisJdTY0IGFkZHJlc3NfbGVuZ3RoOworCXUzMiByZXNlcnZlZDQ7CisKKwkvKiBGbGFncyAoMzIgYml0cykgKi8KKworCXU4IGVuYWJsZWQ6MTsJCS8qIDAwOiAgICBVc2UgYWZmaW5pdHkgc3RydWN0dXJlICovCisJdTggaG90X3BsdWdnYWJsZToxOwkvKiAwMTogICAgTWVtb3J5IHJlZ2lvbiBpcyBob3QgcGx1Z2dhYmxlICovCisJdTggbm9uX3ZvbGF0aWxlOjE7CS8qIDAyOiAgICBNZW1vcnkgaXMgbm9uLXZvbGF0aWxlICovCisJIHU4OjU7CQkJLyogMDMtMDc6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KKwl1OCByZXNlcnZlZDVbM107CS8qIDA4LTMxOiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCisKKwl1NjQgcmVzZXJ2ZWQ2OwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUQ1BBIC0gVHJ1c3RlZCBDb21wdXRpbmcgUGxhdGZvcm0gQWxsaWFuY2UgdGFibGUKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYWNwaV90YWJsZV90Y3BhIHsKKwlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTE2IHJlc2VydmVkOworCXUzMiBtYXhfbG9nX2xlbmd0aDsJLyogTWF4aW11bSBsZW5ndGggZm9yIHRoZSBldmVudCBsb2cgYXJlYSAqLworCXU2NCBsb2dfYWRkcmVzczsJLyogQWRkcmVzcyBvZiB0aGUgZXZlbnQgbG9nIGFyZWEgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV0RSVCAtIFdhdGNoZG9nIFJlc291cmNlIFRhYmxlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGFjcGlfdGFibGVfd2RydCB7CisJQUNQSV9UQUJMRV9IRUFERVJfREVGIHUzMiBoZWFkZXJfbGVuZ3RoOwkvKiBXYXRjaGRvZyBIZWFkZXIgTGVuZ3RoICovCisJdTggcGNpX3NlZ21lbnQ7CQkvKiBQQ0kgU2VnbWVudCBudW1iZXIgKi8KKwl1OCBwY2lfYnVzOwkJLyogUENJIEJ1cyBudW1iZXIgKi8KKwl1OCBwY2lfZGV2aWNlOwkJLyogUENJIERldmljZSBudW1iZXIgKi8KKwl1OCBwY2lfZnVuY3Rpb247CS8qIFBDSSBGdW5jdGlvbiBudW1iZXIgKi8KKwl1MzIgdGltZXJfcGVyaW9kOwkvKiBQZXJpb2Qgb2Ygb25lIHRpbWVyIGNvdW50IChtc2VjKSAqLworCXUzMiBtYXhfY291bnQ7CQkvKiBNYXhpbXVtIGNvdW50ZXIgdmFsdWUgc3VwcG9ydGVkICovCisJdTMyIG1pbl9jb3VudDsJCS8qIE1pbmltdW0gY291bnRlciB2YWx1ZSAqLworCXU4IGZsYWdzOworCXU4IHJlc2VydmVkWzNdOworCXUzMiBlbnRyaWVzOwkJLyogTnVtYmVyIG9mIHdhdGNoZG9nIGVudHJpZXMgdGhhdCBmb2xsb3cgKi8KK307CisKKyNpZiAwCQkJCS8qIEZsYWdzLCB3aWxsIGJlIGNvbnZlcnRlZCB0byBtYWNyb3MgKi8KK3U4IGVuYWJsZWQ6MTsJCQkvKiAwMDogICAgVGltZXIgZW5hYmxlZCAqLwordTg6NjsJCQkJLyogMDEtMDY6IFJlc2VydmVkICovCit1OCBzbGVlcF9zdG9wOjE7CQkvKiAwNzogICAgVGltZXIgc3RvcHBlZCBpbiBzbGVlcCBzdGF0ZSAqLworI2VuZGlmCisKKy8qIE1hY3JvcyB1c2VkIHRvIGdlbmVyYXRlIG9mZnNldHMgdG8gc3BlY2lmaWMgdGFibGUgZmllbGRzICovCisKKyNkZWZpbmUgQUNQSV9BU0YwX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9hc2ZfaW5mbyxmKQorI2RlZmluZSBBQ1BJX0FTRjFfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9hbGVydCxmKQorI2RlZmluZSBBQ1BJX0FTRjJfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9yZW1vdGUsZikKKyNkZWZpbmUgQUNQSV9BU0YzX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9hc2Zfcm1jcCxmKQorI2RlZmluZSBBQ1BJX0FTRjRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX2FzZl9hZGRyZXNzLGYpCisjZGVmaW5lIEFDUElfQk9PVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfdGFibGVfYm9vdCxmKQorI2RlZmluZSBBQ1BJX0NQRVBfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX2NwZXAsZikKKyNkZWZpbmUgQUNQSV9DUEVQMF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9jcGVwX3BvbGxpbmcsZikKKyNkZWZpbmUgQUNQSV9EQkdQX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9kYmdwLGYpCisjZGVmaW5lIEFDUElfRUNEVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGVjX2Jvb3RfcmVzb3VyY2VzLGYpCisjZGVmaW5lIEFDUElfSFBFVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGhwZXRfdGFibGUsZikKKyNkZWZpbmUgQUNQSV9NQURUX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSxmKQorI2RlZmluZSBBQ1BJX01BRFQwX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X3Byb2Nlc3Nvcl9hcGljLGYpCisjZGVmaW5lIEFDUElfTUFEVDFfT0ZGU0VUKGYpICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IG1hZHRfaW9fYXBpYyxmKQorI2RlZmluZSBBQ1BJX01BRFQyX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSxmKQorI2RlZmluZSBBQ1BJX01BRFQzX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X25taV9zb3VyY2UsZikKKyNkZWZpbmUgQUNQSV9NQURUNF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9sb2NhbF9hcGljX25taSxmKQorI2RlZmluZSBBQ1BJX01BRFQ1X09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2FkZHJlc3Nfb3ZlcnJpZGUsZikKKyNkZWZpbmUgQUNQSV9NQURUNl9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9pb19zYXBpYyxmKQorI2RlZmluZSBBQ1BJX01BRFQ3X09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBtYWR0X2xvY2FsX3NhcGljLGYpCisjZGVmaW5lIEFDUElfTUFEVDhfT0ZGU0VUKGYpICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IG1hZHRfaW50ZXJydXB0X3NvdXJjZSxmKQorI2RlZmluZSBBQ1BJX01BRFRIX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhcGljX2hlYWRlcixmKQorI2RlZmluZSBBQ1BJX01DRkdfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX21jZmcsZikKKyNkZWZpbmUgQUNQSV9NQ0ZHMF9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV9tY2ZnX2FsbG9jYXRpb24sZikKKyNkZWZpbmUgQUNQSV9TQlNUX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3Qgc21hcnRfYmF0dGVyeV90YWJsZSxmKQorI2RlZmluZSBBQ1BJX1NMSVRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBzeXN0ZW1fbG9jYWxpdHlfaW5mbyxmKQorI2RlZmluZSBBQ1BJX1NQQ1JfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX3NwY3IsZikKKyNkZWZpbmUgQUNQSV9TUE1JX09GRlNFVChmKSAgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgYWNwaV90YWJsZV9zcG1pLGYpCisjZGVmaW5lIEFDUElfU1JBVF9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IHN5c3RlbV9yZXNvdXJjZV9hZmZpbml0eSxmKQorI2RlZmluZSBBQ1BJX1NSQVQwX09GRlNFVChmKSAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBzdGF0aWNfcmVzb3VyY2VfYWxsb2MsZikKKyNkZWZpbmUgQUNQSV9TUkFUMV9PRkZTRVQoZikgICAgICAgICAgICAodTgpIEFDUElfT0ZGU0VUIChzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5LGYpCisjZGVmaW5lIEFDUElfVENQQV9PRkZTRVQoZikgICAgICAgICAgICAgKHU4KSBBQ1BJX09GRlNFVCAoc3RydWN0IGFjcGlfdGFibGVfdGNwYSxmKQorI2RlZmluZSBBQ1BJX1dEUlRfT0ZGU0VUKGYpICAgICAgICAgICAgICh1OCkgQUNQSV9PRkZTRVQgKHN0cnVjdCBhY3BpX3RhYmxlX3dkcnQsZikKKworI2RlZmluZSBBQ1BJX0hQRVRfRkxBR19PRkZTRVQoZixvKSAgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBocGV0X3RhYmxlLGYsbykKKyNkZWZpbmUgQUNQSV9TUkFUMF9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3Qgc3RhdGljX3Jlc291cmNlX2FsbG9jLGYsbykKKyNkZWZpbmUgQUNQSV9TUkFUMV9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbWVtb3J5X2FmZmluaXR5LGYsbykKKyNkZWZpbmUgQUNQSV9NQURUX0ZMQUdfT0ZGU0VUKGYsbykgICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbXVsdGlwbGVfYXBpY190YWJsZSxmLG8pCisjZGVmaW5lIEFDUElfTUFEVDBfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfcHJvY2Vzc29yX2FwaWMsZixvKQorI2RlZmluZSBBQ1BJX01BRFQyX0ZMQUdfT0ZGU0VUKGYsbykgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBtYWR0X2ludGVycnVwdF9vdmVycmlkZSxmLG8pCisjZGVmaW5lIEFDUElfTUFEVDNfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfbm1pX3NvdXJjZSxmLG8pCisjZGVmaW5lIEFDUElfTUFEVDRfRkxBR19PRkZTRVQoZixvKSAgICAgQUNQSV9GTEFHX09GRlNFVCAoc3RydWN0IG1hZHRfbG9jYWxfYXBpY19ubWksZixvKQorI2RlZmluZSBBQ1BJX01BRFQ3X0ZMQUdfT0ZGU0VUKGYsbykgICAgIEFDUElfRkxBR19PRkZTRVQgKHN0cnVjdCBtYWR0X2xvY2FsX3NhcGljLGYsbykKKyNkZWZpbmUgQUNQSV9NQURUOF9GTEFHX09GRlNFVChmLG8pICAgICBBQ1BJX0ZMQUdfT0ZGU0VUIChzdHJ1Y3QgbWFkdF9pbnRlcnJ1cHRfc291cmNlLGYsbykKKworLyogUmVzZXQgdG8gZGVmYXVsdCBwYWNraW5nICovCisKICNwcmFnbWEgcGFjaygpCiAKICNlbmRpZgkJCQkvKiBfX0FDVEJMMV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3RibDIuaCBiL2luY2x1ZGUvYWNwaS9hY3RibDIuaAppbmRleCBkZmM3YWMxLi42N2VmZTZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWN0YmwyLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdGJsMi5oCkBAIC00NCwyMzQgKzQ0LDYgQEAKICNpZm5kZWYgX19BQ1RCTDJfSF9fCiAjZGVmaW5lIF9fQUNUQkwyX0hfXwogCi0vKgotICogUHJlZmVyZWQgUG93ZXIgTWFuYWdlbWVudCBQcm9maWxlcwotICovCi0jZGVmaW5lIFBNX1VOU1BFQ0lGSUVEICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBQTV9ERVNLVE9QICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUE1fTU9CSUxFICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFBNX1dPUktTVEFUSU9OICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBQTV9FTlRFUlBSSVNFX1NFUlZFUiAgICAgICAgICAgIDQKLSNkZWZpbmUgUE1fU09IT19TRVJWRVIgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFBNX0FQUExJQU5DRV9QQyAgICAgICAgICAgICAgICAgNgotCi0vKgotICogQUNQSSBCb290IEFyY2ggRmxhZ3MKLSAqLwotI2RlZmluZSBCQUZfTEVHQUNZX0RFVklDRVMgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBCQUZfODA0Ml9LRVlCT0FSRF9DT05UUk9MTEVSICAgIDB4MDAwMgotCi0jZGVmaW5lIEZBRFQyX1JFVklTSU9OX0lEICAgICAgICAgICAgICAgMwotI2RlZmluZSBGQURUMl9NSU5VU19SRVZJU0lPTl9JRCAgICAgICAgIDIKLQotI3ByYWdtYSBwYWNrKDEpCi0KLS8qCi0gKiBBQ1BJIDIuMCBSb290IFN5c3RlbSBEZXNjcmlwdGlvbiBUYWJsZSAoUlNEVCkKLSAqLwotc3RydWN0IHJzZHRfZGVzY3JpcHRvcl9yZXYyIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JdTMyIHRhYmxlX29mZnNldF9lbnRyeVsxXTsJLyogQXJyYXkgb2YgcG9pbnRlcnMgdG8gQUNQSSB0YWJsZXMgKi8KLX07Ci0KLS8qCi0gKiBBQ1BJIDIuMCBFeHRlbmRlZCBTeXN0ZW0gRGVzY3JpcHRpb24gVGFibGUgKFhTRFQpCi0gKi8KLXN0cnVjdCB4c2R0X2Rlc2NyaXB0b3JfcmV2MiB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCXU2NCB0YWJsZV9vZmZzZXRfZW50cnlbMV07CS8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIEFDUEkgdGFibGVzICovCi19OwotCi0vKgotICogQUNQSSAyLjAgRmlybXdhcmUgQUNQSSBDb250cm9sIFN0cnVjdHVyZSAoRkFDUykKLSAqLwotc3RydWN0IGZhY3NfZGVzY3JpcHRvcl9yZXYyIHsKLQljaGFyIHNpZ25hdHVyZVs0XTsJLyogQVNDSUkgdGFibGUgc2lnbmF0dXJlICovCi0JdTMyIGxlbmd0aDsJCS8qIExlbmd0aCBvZiBzdHJ1Y3R1cmUsIGluIGJ5dGVzICovCi0JdTMyIGhhcmR3YXJlX3NpZ25hdHVyZTsJLyogSGFyZHdhcmUgY29uZmlndXJhdGlvbiBzaWduYXR1cmUgKi8KLQl1MzIgZmlybXdhcmVfd2FraW5nX3ZlY3RvcjsJLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIEZpcm13YXJlIFdha2luZyBWZWN0b3IuICovCi0JdTMyIGdsb2JhbF9sb2NrOwkvKiBHbG9iYWwgTG9jayB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byBzaGFyZWQgaGFyZHdhcmUgcmVzb3VyY2VzICovCi0KLQkvKiBGbGFncyAoMzIgYml0cykgKi8KLQotCXU4IFM0Ymlvc19mOjE7CQkvKiAwMDogICAgUzRCSU9TIHN1cHBvcnQgaXMgcHJlc2VudCAqLwotCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTggcmVzZXJ2ZWQxWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0JdTY0IHhmaXJtd2FyZV93YWtpbmdfdmVjdG9yOwkvKiA2NC1iaXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgRmlybXdhcmUgV2FraW5nIFZlY3Rvci4gKi8KLQl1OCB2ZXJzaW9uOwkJLyogVmVyc2lvbiBvZiB0aGlzIHRhYmxlICovCi0JdTggcmVzZXJ2ZWQzWzMxXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotfTsKLQotLyoKLSAqIEFDUEkgMi4wKyBHZW5lcmljIEFkZHJlc3MgU3RydWN0dXJlIChHQVMpCi0gKi8KLXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB7Ci0JdTggYWRkcmVzc19zcGFjZV9pZDsJLyogQWRkcmVzcyBzcGFjZSB3aGVyZSBzdHJ1Y3Qgb3IgcmVnaXN0ZXIgZXhpc3RzLiAqLwotCXU4IHJlZ2lzdGVyX2JpdF93aWR0aDsJLyogU2l6ZSBpbiBiaXRzIG9mIGdpdmVuIHJlZ2lzdGVyICovCi0JdTggcmVnaXN0ZXJfYml0X29mZnNldDsJLyogQml0IG9mZnNldCB3aXRoaW4gdGhlIHJlZ2lzdGVyICovCi0JdTggYWNjZXNzX3dpZHRoOwkvKiBNaW5pbXVtIEFjY2VzcyBzaXplIChBQ1BJIDMuMCkgKi8KLQl1NjQgYWRkcmVzczsJCS8qIDY0LWJpdCBhZGRyZXNzIG9mIHN0cnVjdCBvciByZWdpc3RlciAqLwotfTsKLQotI2RlZmluZSBGQURUX1JFVjJfQ09NTU9OIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2Zpcm13YXJlX2N0cmw7ICAgLyogMzItYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9kc2R0OyAgICAgICAgICAgIC8qIDMyLWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWQxOyAgICAgICAgICAvKiBTeXN0ZW0gSW50ZXJydXB0IE1vZGVsIGlzbid0IHVzZWQgaW4gQUNQSSAyLjAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJfUE1fcHJvZmlsZTsgIC8qIENvbnZleXMgcHJlZmVycmVkIHBvd2VyIG1hbmFnZW1lbnQgcHJvZmlsZSB0byBPU1BNLiAqLyBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2lfaW50OyAgICAgICAgICAgIC8qIFN5c3RlbSB2ZWN0b3Igb2YgU0NJIGludGVycnVwdCAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWlfY21kOyAgICAgICAgICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBTTUkgY29tbWFuZCBwb3J0ICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfZW5hYmxlOyAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gc21pX2NtZCB0byBlbmFibGUgQUNQSSAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3BpX2Rpc2FibGU7ICAgICAgIC8qIFZhbHVlIHRvIHdyaXRlIHRvIHNtaV9jbWQgdG8gZGlzYWJsZSBBQ1BJICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFM0Ymlvc19yZXE7ICAgICAgICAgLyogVmFsdWUgdG8gd3JpdGUgdG8gU01JIENNRCB0byBlbnRlciBTNEJJT1Mgc3RhdGUgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN0YXRlX2NudDsgICAgICAgICAvKiBQcm9jZXNzb3IgcGVyZm9ybWFuY2Ugc3RhdGUgY29udHJvbCovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtMWFfZXZ0X2JsazsgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYSBhY3BpX2V2ZW50IFJlZyBCbGsgKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0xYl9ldnRfYmxrOyAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDFiIGFjcGlfZXZlbnQgUmVnIEJsayAqLyBcCi0JdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMV9wbTFhX2NudF9ibGs7ICAgIC8qIFBvcnQgYWRkcmVzcyBvZiBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtMWJfY250X2JsazsgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCAxYiBDb250cm9sIFJlZyBCbGsgKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfcG0yX2NudF9ibGs7ICAgICAvKiBQb3J0IGFkZHJlc3Mgb2YgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX3BtX3Rtcl9ibGs7ICAgICAgLyogUG9ydCBhZGRyZXNzIG9mIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgKi8gXAotCXUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjFfZ3BlMF9ibGs7ICAgICAgICAvKiBQb3J0IGFkZHIgb2YgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMCBSZWcgQmxrICovIFwKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYxX2dwZTFfYmxrOyAgICAgICAgLyogUG9ydCBhZGRyIG9mIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDEgUmVnIEJsayAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbTFfZXZ0X2xlbjsgICAgICAgIC8qIEJ5dGUgbGVuZ3RoIG9mIHBvcnRzIGF0IHBtMV94X2V2dF9ibGsgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG0xX2NudF9sZW47ICAgICAgICAvKiBCeXRlIGxlbmd0aCBvZiBwb3J0cyBhdCBwbTFfeF9jbnRfYmxrICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtMl9jbnRfbGVuOyAgICAgICAgLyogQnl0ZSBMZW5ndGggb2YgcG9ydHMgYXQgcG0yX2NudF9ibGsgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1fdG1fbGVuOyAgICAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBwbV90bV9ibGsgKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3BlMF9ibGtfbGVuOyAgICAgICAvKiBCeXRlIExlbmd0aCBvZiBwb3J0cyBhdCBncGUwX2JsayAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncGUxX2Jsa19sZW47ICAgICAgIC8qIEJ5dGUgTGVuZ3RoIG9mIHBvcnRzIGF0IGdwZTFfYmxrICovIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwZTFfYmFzZTsgICAgICAgICAgLyogT2Zmc2V0IGluIGdwZSBtb2RlbCB3aGVyZSBncGUxIGV2ZW50cyBzdGFydCAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RfY250OyAgICAgICAgICAgIC8qIFN1cHBvcnQgZm9yIHRoZSBfQ1NUIG9iamVjdCBhbmQgQyBTdGF0ZXMgY2hhbmdlIG5vdGlmaWNhdGlvbi4qLyBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHZsMl9sYXQ7ICAgICAgICAgIC8qIFdvcnN0IGNhc2UgSFcgbGF0ZW5jeSB0byBlbnRlci9leGl0IEMyIHN0YXRlICovIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdmwzX2xhdDsgICAgICAgICAgLyogV29yc3QgY2FzZSBIVyBsYXRlbmN5IHRvIGVudGVyL2V4aXQgQzMgc3RhdGUgKi8gXAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfc2l6ZTsgICAgICAgICAvKiBOdW1iZXIgb2YgZmx1c2ggc3RyaWRlcyB0aGF0IG5lZWQgdG8gYmUgcmVhZCAqLyBcCi0JdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaF9zdHJpZGU7ICAgICAgIC8qIFByb2Nlc3NvcidzIG1lbW9yeSBjYWNoZSBsaW5lIHdpZHRoLCBpbiBieXRlcyAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXR5X29mZnNldDsgICAgICAgIC8qIFByb2Nlc3NvcidzIGR1dHkgY3ljbGUgaW5kZXggaW4gcHJvY2Vzc29yJ3MgUF9DTlQgcmVnKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHV0eV93aWR0aDsgICAgICAgICAvKiBQcm9jZXNzb3IncyBkdXR5IGN5Y2xlIHZhbHVlIGJpdCB3aWR0aCBpbiBQX0NOVCByZWdpc3Rlci4qLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfYWxybTsgICAgICAgICAgIC8qIEluZGV4IHRvIGRheS1vZi1tb250aCBhbGFybSBpbiBSVEMgQ01PUyBSQU0gKi8gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9uX2Fscm07ICAgICAgICAgICAvKiBJbmRleCB0byBtb250aC1vZi15ZWFyIGFsYXJtIGluIFJUQyBDTU9TIFJBTSAqLyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50dXJ5OyAgICAgICAgICAgIC8qIEluZGV4IHRvIGNlbnR1cnkgaW4gUlRDIENNT1MgUkFNICovIFwKLQl1MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhcGNfYm9vdF9hcmNoOyAgICAgLyogSUEtUEMgQm9vdCBBcmNoaXRlY3R1cmUgRmxhZ3MuIFNlZSBUYWJsZSA1LTEwIGZvciBkZXNjcmlwdGlvbiovCi0KLS8qCi0gKiBBQ1BJIDIuMCsgRml4ZWQgQUNQSSBEZXNjcmlwdGlvbiBUYWJsZSAoRkFEVCkKLSAqLwotc3RydWN0IGZhZHRfZGVzY3JpcHRvcl9yZXYyIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYJLyogQUNQSSBjb21tb24gdGFibGUgaGVhZGVyICovCi0JRkFEVF9SRVYyX0NPTU1PTiB1OCByZXNlcnZlZDI7CS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQotCS8qIEZsYWdzICgzMiBiaXRzKSAqLwotCi0JdTggd2JfaW52ZDoxOwkJLyogMDA6ICAgIFRoZSB3YmludmQgaW5zdHJ1Y3Rpb24gd29ya3MgcHJvcGVybHkgKi8KLQl1OCB3Yl9pbnZkX2ZsdXNoOjE7CS8qIDAxOiAgICBUaGUgd2JpbnZkIGZsdXNoZXMgYnV0IGRvZXMgbm90IGludmFsaWRhdGUgKi8KLQl1OCBwcm9jX2MxOjE7CQkvKiAwMjogICAgQWxsIHByb2Nlc3NvcnMgc3VwcG9ydCBDMSBzdGF0ZSAqLwotCXU4IHBsdmwyX3VwOjE7CQkvKiAwMzogICAgQzIgc3RhdGUgd29ya3Mgb24gTVAgc3lzdGVtICovCi0JdTggcHdyX2J1dHRvbjoxOwkvKiAwNDogICAgUG93ZXIgYnV0dG9uIGlzIGhhbmRsZWQgYXMgYSBnZW5lcmljIGZlYXR1cmUgKi8KLQl1OCBzbGVlcF9idXR0b246MTsJLyogMDU6ICAgIFNsZWVwIGJ1dHRvbiBpcyBoYW5kbGVkIGFzIGEgZ2VuZXJpYyBmZWF0dXJlLCBvciBub3QgcHJlc2VudCAqLwotCXU4IGZpeGVkX3JUQzoxOwkJLyogMDY6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgaW4gZml4ZWQgcmVnaXN0ZXIgc3BhY2UgKi8KLQl1OCBydGNzNDoxOwkJLyogMDc6ICAgIFJUQyB3YWtldXAgc3RhdCBub3QgcG9zc2libGUgZnJvbSBTNCAqLwotCXU4IHRtcl92YWxfZXh0OjE7CS8qIDA4OiAgICB0bXJfdmFsIGlzIDMyIGJpdHMgMD0yNC1iaXRzICovCi0JdTggZG9ja19jYXA6MTsJCS8qIDA5OiAgICBEb2NraW5nIHN1cHBvcnRlZCAqLwotCXU4IHJlc2V0X3JlZ19zdXA6MTsJLyogMTA6ICAgIFN5c3RlbSByZXNldCB2aWEgdGhlIEZBRFQgUkVTRVRfUkVHIHN1cHBvcnRlZCAqLwotCXU4IHNlYWxlZF9jYXNlOjE7CS8qIDExOiAgICBObyBpbnRlcm5hbCBleHBhbnNpb24gY2FwYWJpbGl0aWVzIGFuZCBjYXNlIGlzIHNlYWxlZCAqLwotCXU4IGhlYWRsZXNzOjE7CQkvKiAxMjogICAgTm8gbG9jYWwgdmlkZW8gY2FwYWJpbGl0aWVzIG9yIGxvY2FsIGlucHV0IGRldmljZXMgKi8KLQl1OCBjcHVfc3dfc2xlZXA6MTsJLyogMTM6ICAgIE11c3QgZXhlY3V0ZSBuYXRpdmUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgd3JpdGluZyBTTFBfVFlQeCByZWdpc3RlciAqLwotCi0JdTggcGNpX2V4cF93YWs6MTsJLyogMTQ6ICAgIFN5c3RlbSBzdXBwb3J0cyBQQ0lFWFBfV0FLRSAoU1RTL0VOKSBiaXRzIChBQ1BJIDMuMCkgKi8KLQl1OCB1c2VfcGxhdGZvcm1fY2xvY2s6MTsJLyogMTU6ICAgIE9TUE0gc2hvdWxkIHVzZSBwbGF0Zm9ybS1wcm92aWRlZCB0aW1lciAoQUNQSSAzLjApICovCi0JdTggUzRydGNfc3RzX3ZhbGlkOjE7CS8qIDE2OiAgICBDb250ZW50cyBvZiBSVENfU1RTIHZhbGlkIGFmdGVyIFM0IHdha2UgKEFDUEkgMy4wKSAqLwotCXU4IHJlbW90ZV9wb3dlcl9vbl9jYXBhYmxlOjE7CS8qIDE3OiAgICBTeXN0ZW0gaXMgY29tcGF0aWJsZSB3aXRoIHJlbW90ZSBwb3dlciBvbiAoQUNQSSAzLjApICovCi0JdTggZm9yY2VfYXBpY19jbHVzdGVyX21vZGVsOjE7CS8qIDE4OiAgICBBbGwgbG9jYWwgQVBJQ3MgbXVzdCB1c2UgY2x1c3RlciBtb2RlbCAoQUNQSSAzLjApICovCi0JdTggZm9yY2VfYXBpY19waHlzaWNhbF9kZXN0aW5hdGlvbl9tb2RlOjE7CS8qIDE5OiAgIGFsbCBsb2NhbCB4X2FQSUNzIG11c3QgdXNlIHBoeXNpY2FsIGRlc3QgbW9kZSAoQUNQSSAzLjApICovCi0JIHU4OjQ7CQkJLyogMjAtMjM6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQl1OCByZXNlcnZlZDM7CQkvKiAyNC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHJlc2V0X3JlZ2lzdGVyOwkvKiBSZXNldCByZWdpc3RlciBhZGRyZXNzIGluIEdBUyBmb3JtYXQgKi8KLQl1OCByZXNldF92YWx1ZTsJCS8qIFZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZXNldF9yZWdpc3RlciBwb3J0IHRvIHJlc2V0IHRoZSBzeXN0ZW0gKi8KLQl1OCByZXNlcnZlZDRbM107CS8qIFRoZXNlIHRocmVlIGJ5dGVzIG11c3QgYmUgemVybyAqLwotCXU2NCB4ZmlybXdhcmVfY3RybDsJLyogNjQtYml0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgRkFDUyAqLwotCXU2NCBYZHNkdDsJCS8qIDY0LWJpdCBwaHlzaWNhbCBhZGRyZXNzIG9mIERTRFQgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWFfZXZ0X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFhIGFjcGlfZXZlbnQgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTFiX2V2dF9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCAxYiBhY3BpX2V2ZW50IFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4cG0xYV9jbnRfYmxrOwkvKiBFeHRlbmRlZCBQb3dlciBNZ3QgMWEgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtMWJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDFiIENvbnRyb2wgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhwbTJfY250X2JsazsJLyogRXh0ZW5kZWQgUG93ZXIgTWd0IDIgQ29udHJvbCBSZWcgQmxrIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgeHBtX3Rtcl9ibGs7CS8qIEV4dGVuZGVkIFBvd2VyIE1ndCBUaW1lciBDdHJsIFJlZyBCbGsgYWRkcmVzcyAqLwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyB4Z3BlMF9ibGs7CS8qIEV4dGVuZGVkIEdlbmVyYWwgUHVycG9zZSBhY3BpX2V2ZW50IDAgUmVnIEJsayBhZGRyZXNzICovCi0Jc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIHhncGUxX2JsazsJLyogRXh0ZW5kZWQgR2VuZXJhbCBQdXJwb3NlIGFjcGlfZXZlbnQgMSBSZWcgQmxrIGFkZHJlc3MgKi8KLX07Ci0KLS8qICJEb3duLXJldnZlZCIgQUNQSSAyLjAgRkFEVCBkZXNjcmlwdG9yICovCi0KLXN0cnVjdCBmYWR0X2Rlc2NyaXB0b3JfcmV2Ml9taW51cyB7Ci0JQUNQSV9UQUJMRV9IRUFERVJfREVGCS8qIEFDUEkgY29tbW9uIHRhYmxlIGhlYWRlciAqLwotCUZBRFRfUkVWMl9DT01NT04gdTggcmVzZXJ2ZWQyOwkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTMyIGZsYWdzOwotCXN0cnVjdCBhY3BpX2dlbmVyaWNfYWRkcmVzcyByZXNldF9yZWdpc3RlcjsJLyogUmVzZXQgcmVnaXN0ZXIgYWRkcmVzcyBpbiBHQVMgZm9ybWF0ICovCi0JdTggcmVzZXRfdmFsdWU7CQkvKiBWYWx1ZSB0byB3cml0ZSB0byB0aGUgcmVzZXRfcmVnaXN0ZXIgcG9ydCB0byByZXNldCB0aGUgc3lzdGVtLiAqLwotCXU4IHJlc2VydmVkN1szXTsJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotfTsKLQotLyogRUNEVCAtIEVtYmVkZGVkIENvbnRyb2xsZXIgQm9vdCBSZXNvdXJjZXMgVGFibGUgKi8KLQotc3RydWN0IGVjX2Jvb3RfcmVzb3VyY2VzIHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgc3RydWN0IGFjcGlfZ2VuZXJpY19hZGRyZXNzIGVjX2NvbnRyb2w7CS8qIEFkZHJlc3Mgb2YgRUMgY29tbWFuZC9zdGF0dXMgcmVnaXN0ZXIgKi8KLQlzdHJ1Y3QgYWNwaV9nZW5lcmljX2FkZHJlc3MgZWNfZGF0YTsJLyogQWRkcmVzcyBvZiBFQyBkYXRhIHJlZ2lzdGVyICovCi0JdTMyIHVpZDsJCS8qIFVuaXF1ZSBJRCAtIG11c3QgYmUgc2FtZSBhcyB0aGUgRUMgX1VJRCBtZXRob2QgKi8KLQl1OCBncGVfYml0OwkJLyogVGhlIEdQRSBmb3IgdGhlIEVDICovCi0JdTggZWNfaWRbMV07CQkvKiBGdWxsIG5hbWVwYXRoIG9mIHRoZSBFQyBpbiB0aGUgQUNQSSBuYW1lc3BhY2UgKi8KLX07Ci0KLS8qIFNSQVQgLSBTeXN0ZW0gUmVzb3VyY2UgQWZmaW5pdHkgVGFibGUgKi8KLQotc3RydWN0IHN0YXRpY19yZXNvdXJjZV9hbGxvYyB7Ci0JdTggdHlwZTsKLQl1OCBsZW5ndGg7Ci0JdTggcHJveGltaXR5X2RvbWFpbl9sbzsKLQl1OCBhcGljX2lkOwotCi0JLyogRmxhZ3MgKDMyIGJpdHMpICovCi0KLQl1OCBlbmFibGVkOjE7CQkvKiAwMDogICAgVXNlIGFmZmluaXR5IHN0cnVjdHVyZSAqLwotCSB1ODo3OwkJCS8qIDAxLTA3OiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi0JdTggcmVzZXJ2ZWQzWzNdOwkvKiAwOC0zMTogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCi0JdTggbG9jYWxfc2FwaWNfZWlkOwotCXU4IHByb3hpbWl0eV9kb21haW5faGlbM107Ci0JdTMyIHJlc2VydmVkNDsJCS8qIFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLX07Ci0KLXN0cnVjdCBtZW1vcnlfYWZmaW5pdHkgewotCXU4IHR5cGU7Ci0JdTggbGVuZ3RoOwotCXUzMiBwcm94aW1pdHlfZG9tYWluOwotCXUxNiByZXNlcnZlZDM7Ci0JdTY0IGJhc2VfYWRkcmVzczsKLQl1NjQgYWRkcmVzc19sZW5ndGg7Ci0JdTMyIHJlc2VydmVkNDsKLQotCS8qIEZsYWdzICgzMiBiaXRzKSAqLwotCi0JdTggZW5hYmxlZDoxOwkJLyogMDA6ICAgIFVzZSBhZmZpbml0eSBzdHJ1Y3R1cmUgKi8KLQl1OCBob3RfcGx1Z2dhYmxlOjE7CS8qIDAxOiAgICBNZW1vcnkgcmVnaW9uIGlzIGhvdCBwbHVnZ2FibGUgKi8KLQl1OCBub25fdm9sYXRpbGU6MTsJLyogMDI6ICAgIE1lbW9yeSBpcyBub24tdm9sYXRpbGUgKi8KLQkgdTg6NTsJCQkvKiAwMy0wNzogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotCXU4IHJlc2VydmVkNVszXTsJLyogMDgtMzE6IFJlc2VydmVkLCBtdXN0IGJlIHplcm8gKi8KLQotCXU2NCByZXNlcnZlZDY7CQkvKiBSZXNlcnZlZCwgbXVzdCBiZSB6ZXJvICovCi19OwotCi1zdHJ1Y3Qgc3lzdGVtX3Jlc291cmNlX2FmZmluaXR5IHsKLQlBQ1BJX1RBQkxFX0hFQURFUl9ERUYgdTMyIHJlc2VydmVkMTsJLyogTXVzdCBiZSB2YWx1ZSAnMScgKi8KLQl1NjQgcmVzZXJ2ZWQyOwkJLyogUmVzZXJ2ZWQsIG11c3QgYmUgemVybyAqLwotfTsKLQotLyogU0xJVCAtIFN5c3RlbSBMb2NhbGl0eSBEaXN0YW5jZSBJbmZvcm1hdGlvbiBUYWJsZSAqLwotCi1zdHJ1Y3Qgc3lzdGVtX2xvY2FsaXR5X2luZm8gewotCUFDUElfVEFCTEVfSEVBREVSX0RFRiB1NjQgbG9jYWxpdHlfY291bnQ7Ci0JdTggZW50cnlbMV1bMV07Ci19OwotCi0jcHJhZ21hIHBhY2soKQorLyogQ29kZSBtb3ZlZCB0byBib3RoIGFjdGJsLmggYW5kIGFjdGJsMS5oICovCiAKICNlbmRpZgkJCQkvKiBfX0FDVEJMMl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmggYi9pbmNsdWRlL2FjcGkvYWN0eXBlcy5oCmluZGV4IDdjYTg5Y2QuLjc3Y2YxMjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3R5cGVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdHlwZXMuaApAQCAtNDQsNiArNDQsOCBAQAogI2lmbmRlZiBfX0FDVFlQRVNfSF9fCiAjZGVmaW5lIF9fQUNUWVBFU19IX18KIAorLyogYWNwaXNyYzpzdHJ1Y3RfZGVmcyAtLSBmb3IgYWNwaXNyYyBjb252ZXJzaW9uICovCisKIC8qCiAgKiBBQ1BJX01BQ0hJTkVfV0lEVEggbXVzdCBiZSBzcGVjaWZpZWQgaW4gYW4gT1MtIG9yIGNvbXBpbGVyLWRlcGVuZGVudCBoZWFkZXIKICAqIGFuZCBtdXN0IGJlIGVpdGhlciAxNiwgMzIsIG9yIDY0CkBAIC0xNTQsNyArMTU2LDYgQEAKICNkZWZpbmUgQUNQSV9NQVhfUFRSICAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQ2NF9NQVgKICNkZWZpbmUgQUNQSV9TSVpFX01BWCAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQ2NF9NQVgKIAotI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDgKICNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBIYXMgbmF0aXZlIDY0LWJpdCBpbnRlZ2VyIHN1cHBvcnQgKi8KIAogLyoKQEAgLTE5NSw4ICsxOTYsNiBAQAogI2RlZmluZSBBQ1BJX01BWF9QVFIgICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWAogI2RlZmluZSBBQ1BJX1NJWkVfTUFYICAgICAgICAgICAgICAgICAgIEFDUElfVUlOVDMyX01BWAogCi0jZGVmaW5lIEFMSUdORURfQUREUkVTU19CT1VOREFSWSAgICAgICAgMHgwMDAwMDAwNAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFR5cGVzIHNwZWNpZmljIHRvIDE2LWJpdCB0YXJnZXRzCkBAIC0yMjMsNyArMjIyLDYgQEAKICNkZWZpbmUgQUNQSV9NQVhfUFRSICAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQxNl9NQVgKICNkZWZpbmUgQUNQSV9TSVpFX01BWCAgICAgICAgICAgICAgICAgICBBQ1BJX1VJTlQxNl9NQVgKIAotI2RlZmluZSBBTElHTkVEX0FERFJFU1NfQk9VTkRBUlkgICAgICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgQUNQSV9VU0VfTkFUSVZFX0RJVklERQkvKiBObyA2NC1iaXQgaW50ZWdlcnMsIG9rIHRvIHVzZSBuYXRpdmUgZGl2aWRlICovCiAKIC8qIDY0LWJpdCBpbnRlZ2VycyBjYW5ub3QgYmUgc3VwcG9ydGVkICovCkBAIC0yNTQsNyArMjUyLDcgQEAKIC8qIFVzZSBDOTkgdWludHB0cl90IGZvciBwb2ludGVyIGNhc3RpbmcgaWYgYXZhaWxhYmxlLCAidm9pZCAqIiBvdGhlcndpc2UgKi8KIAogI2lmbmRlZiBhY3BpX3VpbnRwdHJfdAotI2RlZmluZSBhY3BpX3VpbnRwdHJfdCAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqCisjZGVmaW5lIGFjcGlfdWludHB0cl90ICAgICAgICAgICAgICAgICAgdm9pZCAqCiAjZW5kaWYKIAogLyoKQEAgLTI2Myw3ICsyNjEsNyBAQAogICogbWFuYWdlciBpbXBsZW1lbnRhdGlvbiBpcyB0byBiZSB1c2VkIChBQ1BJX1VTRV9MT0NBTF9DQUNIRSkKICAqLwogI2lmbmRlZiBhY3BpX2NhY2hlX3QKLSNkZWZpbmUgYWNwaV9jYWNoZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0CisjZGVmaW5lIGFjcGlfY2FjaGVfdCAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFjcGlfbWVtb3J5X2xpc3QKICNlbmRpZgogCiAvKgpAQCAtMjcxLDcgKzI2OSw3IEBACiAgKiBsb2NrIGFuZCB1bmxvY2sgT1NMIGludGVyZmFjZXMuCiAgKi8KICNpZm5kZWYgYWNwaV9jcHVfZmxhZ3MKLSNkZWZpbmUgYWNwaV9jcHVfZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgIGFjcGlfbmF0aXZlX3VpbnQKKyNkZWZpbmUgYWNwaV9jcHVfZmxhZ3MgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV91aW50CiAjZW5kaWYKIAogLyoKQEAgLTI5Miw2ICsyOTAsMjEgQEAKICNkZWZpbmUgQUNQSV9VTlVTRURfVkFSCiAjZW5kaWYKIAorLyoKKyAqIEFsbCBBQ1BJQ0EgZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSB0byB0aGUgcmVzdCBvZiB0aGUga2VybmVsIGFyZQorICogdGFnZ2VkIHdpdGggdGhpcyBtYWNybyB3aGljaCBjYW4gYmUgZGVmaW5lZCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIGhvc3QuCisgKi8KKyNpZm5kZWYgQUNQSV9FWFBPUlRfU1lNQk9MCisjZGVmaW5lIEFDUElfRVhQT1JUX1NZTUJPTChzeW1ib2wpCisjZW5kaWYKKworLyoKKyAqIHRocmVhZF9pZCBpcyByZXR1cm5lZCBieSBhY3BpX29zX2dldF90aHJlYWRfaWQuCisgKi8KKyNpZm5kZWYgYWNwaV90aHJlYWRfaWQKKyNkZWZpbmUgYWNwaV90aHJlYWRfaWQgICAgICAgICAgICAgICAgICBhY3BpX25hdGl2ZV91aW50CisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbmRlcGVuZGVudCB0eXBlcwpAQCAtNDc3LDE1ICs0OTAsMTUgQEAKICAqLwogdHlwZWRlZiB1MzIgYWNwaV90YWJsZV90eXBlOwogCi0jZGVmaW5lIEFDUElfVEFCTEVfUlNEUCAgICAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMAotI2RlZmluZSBBQ1BJX1RBQkxFX0RTRFQgICAgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDEKLSNkZWZpbmUgQUNQSV9UQUJMRV9GQURUICAgICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSAyCi0jZGVmaW5lIEFDUElfVEFCTEVfRkFDUyAgICAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMwotI2RlZmluZSBBQ1BJX1RBQkxFX1BTRFQgICAgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDQKLSNkZWZpbmUgQUNQSV9UQUJMRV9TU0RUICAgICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSA1Ci0jZGVmaW5lIEFDUElfVEFCTEVfWFNEVCAgICAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgNgotI2RlZmluZSBBQ1BJX1RBQkxFX01BWCAgICAgICAgICAgICAgICAgIDYKLSNkZWZpbmUgTlVNX0FDUElfVEFCTEVfVFlQRVMgICAgICAgICAgICAoQUNQSV9UQUJMRV9NQVgrMSkKKyNkZWZpbmUgQUNQSV9UQUJMRV9JRF9SU0RQICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSAwCisjZGVmaW5lIEFDUElfVEFCTEVfSURfRFNEVCAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgMQorI2RlZmluZSBBQ1BJX1RBQkxFX0lEX0ZBRFQgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDIKKyNkZWZpbmUgQUNQSV9UQUJMRV9JRF9GQUNTICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSAzCisjZGVmaW5lIEFDUElfVEFCTEVfSURfUFNEVCAgICAgICAgICAgICAgKGFjcGlfdGFibGVfdHlwZSkgNAorI2RlZmluZSBBQ1BJX1RBQkxFX0lEX1NTRFQgICAgICAgICAgICAgIChhY3BpX3RhYmxlX3R5cGUpIDUKKyNkZWZpbmUgQUNQSV9UQUJMRV9JRF9YU0RUICAgICAgICAgICAgICAoYWNwaV90YWJsZV90eXBlKSA2CisjZGVmaW5lIEFDUElfVEFCTEVfSURfTUFYICAgICAgICAgICAgICAgNgorI2RlZmluZSBBQ1BJX05VTV9UQUJMRV9UWVBFUyAgICAgICAgICAgIChBQ1BJX1RBQkxFX0lEX01BWCsxKQogCiAvKgogICogVHlwZXMgYXNzb2NpYXRlZCB3aXRoIEFDUEkgbmFtZXMgYW5kIG9iamVjdHMuICBUaGUgZmlyc3QgZ3JvdXAgb2YKQEAgLTgxNiw3ICs4MjksNyBAQAogCXUzMiBkZWJ1Z19sZXZlbDsKIAl1MzIgZGVidWdfbGF5ZXI7CiAJdTMyIG51bV90YWJsZV90eXBlczsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9pbmZvIHRhYmxlX2luZm9bTlVNX0FDUElfVEFCTEVfVFlQRVNdOworCXN0cnVjdCBhY3BpX3RhYmxlX2luZm8gdGFibGVfaW5mb1tBQ1BJX1RBQkxFX0lEX01BWCArIDFdOwogfTsKIAogLyoKQEAgLTg1OCw3ICs4NzEsNyBAQAogCQkJCSAgICAgIHZvaWQgKmhhbmRsZXJfY29udGV4dCwKIAkJCQkgICAgICB2b2lkICpyZWdpb25fY29udGV4dCk7CiAKLSNkZWZpbmUgQUNQSV9ERUZBVUxUX0hBTkRMRVIgICAgICAgIE5VTEwKKyNkZWZpbmUgQUNQSV9ERUZBVUxUX0hBTkRMRVIgICAgICAgICAgICBOVUxMCiAKIHR5cGVkZWYKIGFjcGlfc3RhdHVzKCphY3BpX2Fkcl9zcGFjZV9zZXR1cCkgKGFjcGlfaGFuZGxlIHJlZ2lvbl9oYW5kbGUsCkBAIC05MTEsMTIgKzkyNCwxMyBAQAogI2RlZmluZSBBQ1BJX1NUQV9ERVZJQ0VfUFJFU0VOVCAgICAgICAgIDB4MDEKICNkZWZpbmUgQUNQSV9TVEFfREVWSUNFX0VOQUJMRUQgICAgICAgICAweDAyCiAjZGVmaW5lIEFDUElfU1RBX0RFVklDRV9VSSAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBBQ1BJX1NUQV9ERVZJQ0VfT0sgICAgICAgICAgICAgIDB4MDgKKyNkZWZpbmUgQUNQSV9TVEFfREVWSUNFX0ZVTkNUSU9OSU5HICAgICAweDA4CisjZGVmaW5lIEFDUElfU1RBX0RFVklDRV9PSyAgICAgICAgICAgICAgMHgwOAkvKiBTeW5vbnltICovCiAjZGVmaW5lIEFDUElfU1RBX0JBVFRFUllfUFJFU0VOVCAgICAgICAgMHgxMAogCiAjZGVmaW5lIEFDUElfQ09NTU9OX09CSl9JTkZPIFwKLQlhY3BpX29iamVjdF90eXBlICAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogQUNQSSBvYmplY3QgdHlwZSAqLyBcCi0JYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZQkvKiBBQ1BJIG9iamVjdCBOYW1lICovCisJYWNwaV9vYmplY3RfdHlwZSAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogQUNQSSBvYmplY3QgdHlwZSAqLyBcCisJYWNwaV9uYW1lICAgICAgICAgICAgICAgICAgICAgICBuYW1lCS8qIEFDUEkgb2JqZWN0IE5hbWUgKi8KIAogc3RydWN0IGFjcGlfb2JqX2luZm9faGVhZGVyIHsKIAlBQ1BJX0NPTU1PTl9PQkpfSU5GTzsKQEAgLTk1Nyw3ICs5NzEsNyBAQAogICogRGVmaW5pdGlvbnMgZm9yIFJlc291cmNlIEF0dHJpYnV0ZXMKICAqLwogdHlwZWRlZiB1MTYgYWNwaV9yc19sZW5ndGg7CS8qIFJlc291cmNlIExlbmd0aCBmaWVsZCBpcyBmaXhlZCBhdCAxNiBiaXRzICovCi10eXBlZGVmIHUzMiBhY3BpX3JzZGVzY19zaXplOwkvKiBNYXggUmVzb3VyY2UgRGVzY3JpcHRvciBzaXplIGlzIChsZW5ndGgrMykgPSAoNjRfay0xKSszICovCit0eXBlZGVmIHUzMiBhY3BpX3JzZGVzY19zaXplOwkvKiBNYXggUmVzb3VyY2UgRGVzY3JpcHRvciBzaXplIGlzIChMZW5ndGgrMykgPSAoNjRfay0xKSszICovCiAKIC8qCiAgKiAgTWVtb3J5IEF0dHJpYnV0ZXMKQEAgLTk3Miw4ICs5ODYsOCBAQAogCiAvKgogICogIElPIEF0dHJpYnV0ZXMKLSAqICBUaGUgSVNBIElvIHJhbmdlcyBhcmU6ICAgICBuMDAwLW4wX2ZmaCwgbjQwMC1uNF9mZmgsIG44MDAtbjhfZmZoLCBuX2MwMC1uX2NGRmguCi0gKiAgVGhlIG5vbi1JU0EgSW8gcmFuZ2VzIGFyZTogbjEwMC1uM19mZmgsIG41MDAtbjdfZmZoLCBuOTAwLW5fYkZmaCwgbl9jZDAtbl9mRkZoLgorICogIFRoZSBJU0EgSU8gcmFuZ2VzIGFyZTogICAgIG4wMDAtbjBfZkZoLCBuNDAwLW40X2ZGaCwgbjgwMC1uOF9mRmgsIG5fYzAwLW5fY0ZGaC4KKyAqICBUaGUgbm9uLUlTQSBJTyByYW5nZXMgYXJlOiBuMTAwLW4zX2ZGaCwgbjUwMC1uN19mRmgsIG45MDAtbl9iRkZoLCBuX2NkMC1uX2ZGRmguCiAgKi8KICNkZWZpbmUgQUNQSV9OT05fSVNBX09OTFlfUkFOR0VTICAgICAgICAodTgpIDB4MDEKICNkZWZpbmUgQUNQSV9JU0FfT05MWV9SQU5HRVMgICAgICAgICAgICAodTgpIDB4MDIKQEAgLTExNzEsMTIgKzExODUsMTIgQEAKIC8qIEZpZWxkcyBjb21tb24gdG8gYWxsIGFkZHJlc3MgZGVzY3JpcHRvcnMsIDE2LzMyLzY0IGJpdCAqLwogCiAjZGVmaW5lIEFDUElfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7IFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWNlcl9jb25zdW1lcjsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9hZGRyZXNzX2ZpeGVkOyBcCi0JdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FkZHJlc3NfZml4ZWQ7IFwKLQl1bmlvbiBhY3BpX3Jlc291cmNlX2F0dHJpYnV0ZSAgICAgICBpbmZvOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJfY29uc3VtZXI7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZTsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2FkZHJlc3NfZml4ZWQ7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hZGRyZXNzX2ZpeGVkOyBcCisJdW5pb24gYWNwaV9yZXNvdXJjZV9hdHRyaWJ1dGUgICBpbmZvOwogCiBzdHJ1Y3QgYWNwaV9yZXNvdXJjZV9hZGRyZXNzIHsKIEFDUElfUkVTT1VSQ0VfQUREUkVTU19DT01NT059OwpAQCAtMTI5NywxNiArMTMxMSw2IEBACiAKICNkZWZpbmUgQUNQSV9ORVhUX1JFU09VUkNFKHJlcykgICAgICAgICAgICAgKHN0cnVjdCBhY3BpX3Jlc291cmNlICopKCh1OCAqKSByZXMgKyByZXMtPmxlbmd0aCkKIAotI2lmbmRlZiBBQ1BJX01JU0FMSUdOTUVOVF9OT1RfU1VQUE9SVEVECi0jZGVmaW5lIEFDUElfQUxJR05fUkVTT1VSQ0VfU0laRShsZW5ndGgpICAgIChsZW5ndGgpCi0jZWxzZQotI2RlZmluZSBBQ1BJX0FMSUdOX1JFU09VUkNFX1NJWkUobGVuZ3RoKSAgICBBQ1BJX1JPVU5EX1VQX1RPX05BVElWRV9XT1JEKGxlbmd0aCkKLSNlbmRpZgotCi0vKgotICogRU5EOiBvZiBkZWZpbml0aW9ucyBmb3IgUmVzb3VyY2UgQXR0cmlidXRlcwotICovCi0KIHN0cnVjdCBhY3BpX3BjaV9yb3V0aW5nX3RhYmxlIHsKIAl1MzIgbGVuZ3RoOwogCXUzMiBwaW47CkBAIC0xMzE1LDggKzEzMTksNCBAQAogCWNoYXIgc291cmNlWzRdOwkJLyogcGFkIHRvIDY0IGJpdHMgc28gc2l6ZW9mKCkgd29ya3MgaW4gYWxsIGNhc2VzICovCiB9OwogCi0vKgotICogRU5EOiBvZiBkZWZpbml0aW9ucyBmb3IgUENJIFJvdXRpbmcgdGFibGVzCi0gKi8KLQogI2VuZGlmCQkJCS8qIF9fQUNUWVBFU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmggYi9pbmNsdWRlL2FjcGkvYWN1dGlscy5oCmluZGV4IDA5Mjc3NjUuLmJhMDM5ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3V0aWxzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjdXRpbHMuaApAQCAtNTAsMjQgKzUwLDI0IEBACiAKICNpZiBkZWZpbmVkKEFDUElfRElTQVNTRU1CTEVSKSB8fCBkZWZpbmVkIChBQ1BJX0RFQlVHR0VSKQogCi1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfQk1kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfY29uZmlnX2RlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9jb25zdW1lX2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9ERUNkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfSEVkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfaW9fZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX0xMZGVjb2RlWzJdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21heF9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTUVNZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfTVRQZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1JOR2RlY29kZVs0XTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9SV2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9TSFJkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfU0laZGVjb2RlWzRdOwotZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX1RSU2RlY29kZVsyXTsKLWV4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9UVFBkZWNvZGVbMl07Ci1leHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfVFlQZGVjb2RlWzRdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2JtX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2NvbmZpZ19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9jb25zdW1lX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX2RlY19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9oZV9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9pb19kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9sbF9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9tYXhfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfbWVtX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX21pbl9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9tdHBfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfcm5nX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3J3X2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3Nocl9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF9zaXpfZGVjb2RlW107CitleHRlcm4gY29uc3QgY2hhciAqYWNwaV9nYmxfdHJzX2RlY29kZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgKmFjcGlfZ2JsX3R0cF9kZWNvZGVbXTsKK2V4dGVybiBjb25zdCBjaGFyICphY3BpX2dibF90eXBfZGVjb2RlW107CiAjZW5kaWYKIAogLyogVHlwZXMgZm9yIFJlc291cmNlIGRlc2NyaXB0b3IgZW50cmllcyAqLwpAQCAtNzgsNiArNzgsMTIgQEAKICNkZWZpbmUgQUNQSV9TTUFMTF9WQVJJQUJMRV9MRU5HVEggICAgICAzCiAKIHR5cGVkZWYKK2FjcGlfc3RhdHVzKCphY3BpX3dhbGtfYW1sX2NhbGxiYWNrKSAodTggKiBhbWwsCisJCQkJICAgICAgdTMyIGxlbmd0aCwKKwkJCQkgICAgICB1MzIgb2Zmc2V0LAorCQkJCSAgICAgIHU4IHJlc291cmNlX2luZGV4LCB2b2lkICoqY29udGV4dCk7CisKK3R5cGVkZWYKIGFjcGlfc3RhdHVzKCphY3BpX3BrZ19jYWxsYmFjaykgKHU4IG9iamVjdF90eXBlLAogCQkJCSB1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICogc291cmNlX29iamVjdCwKIAkJCQkgdW5pb24gYWNwaV9nZW5lcmljX3N0YXRlICogc3RhdGUsCkBAIC0yNzcsNiArMjgzLDggQEAKIAogdm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyKHU4ICogYnVmZmVyLCB1MzIgY291bnQsIHUzMiBkaXNwbGF5LCB1MzIgY29tcG9uZW50X2lkKTsKIAordm9pZCBhY3BpX3V0X2R1bXBfYnVmZmVyMih1OCAqIGJ1ZmZlciwgdTMyIGNvdW50LCB1MzIgZGlzcGxheSk7CisKIHZvaWQgYWNwaV91dF9yZXBvcnRfZXJyb3IoY2hhciAqbW9kdWxlX25hbWUsIHUzMiBsaW5lX251bWJlcik7CiAKIHZvaWQgYWNwaV91dF9yZXBvcnRfaW5mbyhjaGFyICptb2R1bGVfbmFtZSwgdTMyIGxpbmVfbnVtYmVyKTsKQEAgLTQ0NSw2ICs0NTMsOCBAQAogLyoKICAqIHV0bWlzYwogICovCit1OCBhY3BpX3V0X2lzX2FtbF90YWJsZShzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKnRhYmxlKTsKKwogYWNwaV9zdGF0dXMgYWNwaV91dF9hbGxvY2F0ZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwogCiB2b2lkIGFjcGlfdXRfcmVsZWFzZV9vd25lcl9pZChhY3BpX293bmVyX2lkICogb3duZXJfaWQpOwpAQCAtNDYwLDcgKzQ3MCw5IEBACiAKIHU4IGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKHUzMiBuYW1lKTsKIAotdTggYWNwaV91dF92YWxpZF9hY3BpX2NoYXJhY3RlcihjaGFyIGNoYXJhY3Rlcik7CithY3BpX25hbWUgYWNwaV91dF9yZXBhaXJfbmFtZShhY3BpX25hbWUgbmFtZSk7CisKK3U4IGFjcGlfdXRfdmFsaWRfYWNwaV9jaGFyKGNoYXIgY2hhcmFjdGVyLCBhY3BpX25hdGl2ZV91aW50IHBvc2l0aW9uKTsKIAogYWNwaV9zdGF0dXMKIGFjcGlfdXRfc3RydG91bDY0KGNoYXIgKnN0cmluZywgdTMyIGJhc2UsIGFjcGlfaW50ZWdlciAqIHJldF9pbnRlZ2VyKTsKQEAgLTQ2OSw2ICs0ODEsMjUgQEAKIAogI2RlZmluZSBBQ1BJX0FOWV9CQVNFICAgICAgICAwCiAKK3UzMiBhY3BpX3V0X2R3b3JkX2J5dGVfc3dhcCh1MzIgdmFsdWUpOworCit2b2lkIGFjcGlfdXRfc2V0X2ludGVnZXJfd2lkdGgodTggcmV2aXNpb24pOworCisjaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKK3ZvaWQKK2FjcGlfdXRfZGlzcGxheV9pbml0X3BhdGhuYW1lKHU4IHR5cGUsCisJCQkgICAgICBzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqb2JqX2hhbmRsZSwKKwkJCSAgICAgIGNoYXIgKnBhdGgpOworI2VuZGlmCisKKy8qCisgKiB1dHJlc3JjCisgKi8KK2FjcGlfc3RhdHVzCithY3BpX3V0X3dhbGtfYW1sX3Jlc291cmNlcyh1OCAqIGFtbCwKKwkJCSAgIGFjcGlfc2l6ZSBhbWxfbGVuZ3RoLAorCQkJICAgYWNwaV93YWxrX2FtbF9jYWxsYmFjayB1c2VyX2Z1bmN0aW9uLCB2b2lkICoqY29udGV4dCk7CisKIGFjcGlfc3RhdHVzIGFjcGlfdXRfdmFsaWRhdGVfcmVzb3VyY2Uodm9pZCAqYW1sLCB1OCAqIHJldHVybl9pbmRleCk7CiAKIHUzMiBhY3BpX3V0X2dldF9kZXNjcmlwdG9yX2xlbmd0aCh2b2lkICphbWwpOwpAQCAtNDgzLDIwICs1MTQsNiBAQAogYWNwaV91dF9nZXRfcmVzb3VyY2VfZW5kX3RhZyh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKIAkJCSAgICAgdTggKiogZW5kX3RhZyk7CiAKLXU4IGFjcGlfdXRfZ2VuZXJhdGVfY2hlY2tzdW0odTggKiBidWZmZXIsIHUzMiBsZW5ndGgpOwotCi11MzIgYWNwaV91dF9kd29yZF9ieXRlX3N3YXAodTMyIHZhbHVlKTsKLQotdm9pZCBhY3BpX3V0X3NldF9pbnRlZ2VyX3dpZHRoKHU4IHJldmlzaW9uKTsKLQotI2lmZGVmIEFDUElfREVCVUdfT1VUUFVUCi12b2lkCi1hY3BpX3V0X2Rpc3BsYXlfaW5pdF9wYXRobmFtZSh1OCB0eXBlLAotCQkJICAgICAgc3RydWN0IGFjcGlfbmFtZXNwYWNlX25vZGUgKm9ial9oYW5kbGUsCi0JCQkgICAgICBjaGFyICpwYXRoKTsKLQotI2VuZGlmCi0KIC8qCiAgKiB1dG11dGV4IC0gbXV0ZXggc3VwcG9ydAogICovCkBAIC01MjMsMTQgKzU0MCwxNSBAQAogCiB2b2lkICphY3BpX3V0X2FsbG9jYXRlKGFjcGlfc2l6ZSBzaXplLCB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKIAotdm9pZCAqYWNwaV91dF9jYWxsb2NhdGUoYWNwaV9zaXplIHNpemUsIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWQoYWNwaV9zaXplIHNpemUsCisJCQkgICAgICB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKIAogI2lmZGVmIEFDUElfREJHX1RSQUNLX0FMTE9DQVRJT05TCiB2b2lkICphY3BpX3V0X2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKIAkJCQkgdTMyIGNvbXBvbmVudCwgY2hhciAqbW9kdWxlLCB1MzIgbGluZSk7CiAKLXZvaWQgKmFjcGlfdXRfY2FsbG9jYXRlX2FuZF90cmFjayhhY3BpX3NpemUgc2l6ZSwKLQkJCQkgIHUzMiBjb21wb25lbnQsIGNoYXIgKm1vZHVsZSwgdTMyIGxpbmUpOwordm9pZCAqYWNwaV91dF9hbGxvY2F0ZV96ZXJvZWRfYW5kX3RyYWNrKGFjcGlfc2l6ZSBzaXplLAorCQkJCQl1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKIAogdm9pZAogYWNwaV91dF9mcmVlX2FuZF90cmFjayh2b2lkICphZGRyZXNzLCB1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUsIHUzMiBsaW5lKTsKQEAgLTU0MCw2ICs1NTgsMTEgQEAKICNlbmRpZgkJCQkvKiBBQ1BJX0ZVVFVSRV9VU0FHRSAqLwogCiB2b2lkIGFjcGlfdXRfZHVtcF9hbGxvY2F0aW9ucyh1MzIgY29tcG9uZW50LCBjaGFyICptb2R1bGUpOworCithY3BpX3N0YXR1cworYWNwaV91dF9jcmVhdGVfbGlzdChjaGFyICpsaXN0X25hbWUsCisJCSAgICB1MTYgb2JqZWN0X3NpemUsIHN0cnVjdCBhY3BpX21lbW9yeV9saXN0ICoqcmV0dXJuX2NhY2hlKTsKKwogI2VuZGlmCiAKICNlbmRpZgkJCQkvKiBfQUNVVElMU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oIGIvaW5jbHVkZS9hY3BpL2FtbGNvZGUuaAppbmRleCAzNzk2NGE1Li5jZjE4NDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYW1sY29kZS5oCisrKyBiL2luY2x1ZGUvYWNwaS9hbWxjb2RlLmgKQEAgLTE4MCw4ICsxODAsMTAgQEAKICNkZWZpbmUgQU1MX0JBTktfRklFTERfT1AgICAgICAgICAgICh1MTYpIDB4NWI4NwogI2RlZmluZSBBTUxfREFUQV9SRUdJT05fT1AgICAgICAgICAgKHUxNikgMHg1Yjg4CS8qIEFDUEkgMi4wICovCiAKLS8qIEJvZ3VzIG9wY29kZXMgKHRoZXkgYXJlIGFjdHVhbGx5IHR3byBzZXBhcmF0ZSBvcGNvZGVzKSAqLwotCisvKgorICogQ29tYmluYXRpb24gb3Bjb2RlcyAoYWN0dWFsbHkgdHdvIG9uZS1ieXRlIG9wY29kZXMpCisgKiBVc2VkIGJ5IHRoZSBkaXNhc3NlbWJsZXIgYW5kIGlfYVNMIGNvbXBpbGVyCisgKi8KICNkZWZpbmUgQU1MX0xHUkVBVEVSRVFVQUxfT1AgICAgICAgICh1MTYpIDB4OTI5NQogI2RlZmluZSBBTUxfTExFU1NFUVVBTF9PUCAgICAgICAgICAgKHUxNikgMHg5Mjk0CiAjZGVmaW5lIEFNTF9MTk9URVFVQUxfT1AgICAgICAgICAgICAodTE2KSAweDkyOTMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hbWxyZXNyYy5oIGIvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKaW5kZXggZmI0NzM1My4uYmUwMzgxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FtbHJlc3JjLmgKQEAgLTQyLDM5ICs0Miw0NSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgogICovCiAKKy8qIGFjcGlzcmM6c3RydWN0X2RlZnMgLS0gZm9yIGFjcGlzcmMgY29udmVyc2lvbiAqLworCiAjaWZuZGVmIF9fQU1MUkVTUkNfSAogI2RlZmluZSBfX0FNTFJFU1JDX0gKIAotI2RlZmluZSBBU0xfUkVTTkFNRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIl9BRFIiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAiX0FMTiIKLSNkZWZpbmUgQVNMX1JFU05BTUVfQUREUkVTU1NQQUNFICAgICAgICAgICAgICAgICJfQVNJIgotI2RlZmluZSBBU0xfUkVTTkFNRV9BQ0NFU1NTSVpFICAgICAgICAgICAgICAgICAgIl9BU1oiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1RZUEVTUEVDSUZJQ0FUVFJJQlVURVMgICAgICAiX0FUVCIKLSNkZWZpbmUgQVNMX1JFU05BTUVfQkFTRUFERFJFU1MgICAgICAgICAgICAgICAgICJfQkFTIgotI2RlZmluZSBBU0xfUkVTTkFNRV9CVVNNQVNURVIgICAgICAgICAgICAgICAgICAgIl9CTV8iCS8qIE1hc3RlcigxKSwgU2xhdmUoMCkgKi8KLSNkZWZpbmUgQVNMX1JFU05BTUVfREVDT0RFICAgICAgICAgICAgICAgICAgICAgICJfREVDIgotI2RlZmluZSBBU0xfUkVTTkFNRV9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgIl9ETUEiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0RNQVRZUEUgICAgICAgICAgICAgICAgICAgICAiX1RZUCIJLyogQ29tcGF0aWJsZSgwKSwgQSgxKSwgQigyKSwgRigzKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgIl9HUkEiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAiX0lOVCIKLSNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUTEVWRUwgICAgICAgICAgICAgICJfTExfIgkvKiBhY3RpdmVfbG8oMSksIGFjdGl2ZV9oaSgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9JTlRFUlJVUFRTSEFSRSAgICAgICAgICAgICAgIl9TSFIiCS8qIFNoYXJlYWJsZSgxKSwgbm9fc2hhcmUoMCkgKi8KLSNkZWZpbmUgQVNMX1JFU05BTUVfSU5URVJSVVBUVFlQRSAgICAgICAgICAgICAgICJfSEVfIgkvKiBFZGdlKDEpLCBMZXZlbCgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgIl9MRU4iCi0jZGVmaW5lIEFTTF9SRVNOQU1FX01FTUFUVFJJQlVURVMgICAgICAgICAgICAgICAiX01UUCIJLyogTWVtb3J5KDApLCBSZXNlcnZlZCgxKSwgQUNQSSgyKSwgTlZTKDMpICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX01FTVRZUEUgICAgICAgICAgICAgICAgICAgICAiX01FTSIJLyogbm9uX2NhY2hlKDApLCBDYWNoZWFibGUoMSkgQ2FjaGUrY29tYmluZSgyKSwgQ2FjaGUrcHJlZmV0Y2goMykgKi8KLSNkZWZpbmUgQVNMX1JFU05BTUVfTUFYQUREUiAgICAgICAgICAgICAgICAgICAgICJfTUFYIgotI2RlZmluZSBBU0xfUkVTTkFNRV9NSU5BRERSICAgICAgICAgICAgICAgICAgICAgIl9NSU4iCi0jZGVmaW5lIEFTTF9SRVNOQU1FX01BWFRZUEUgICAgICAgICAgICAgICAgICAgICAiX01BRiIKLSNkZWZpbmUgQVNMX1JFU05BTUVfTUlOVFlQRSAgICAgICAgICAgICAgICAgICAgICJfTUlGIgotI2RlZmluZSBBU0xfUkVTTkFNRV9SRUdJU1RFUkJJVE9GRlNFVCAgICAgICAgICAgIl9SQk8iCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1JFR0lTVEVSQklUV0lEVEggICAgICAgICAgICAiX1JCVyIKLSNkZWZpbmUgQVNMX1JFU05BTUVfUkFOR0VUWVBFICAgICAgICAgICAgICAgICAgICJfUk5HIgotI2RlZmluZSBBU0xfUkVTTkFNRV9SRUFEV1JJVEVUWVBFICAgICAgICAgICAgICAgIl9SV18iCS8qIHJlYWRfb25seSgwKSwgV3JpdGVhYmxlICgxKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9UUkFOU0xBVElPTiAgICAgICAgICAgICAgICAgIl9UUkEiCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1RSQU5TVFlQRSAgICAgICAgICAgICAgICAgICAiX1RSUyIJLyogU3BhcnNlKDEpLCBEZW5zZSgwKSAqLwotI2RlZmluZSBBU0xfUkVTTkFNRV9UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIl9UVFAiCS8qIFRyYW5zbGF0aW9uKDEpLCBTdGF0aWMgKDApICovCi0jZGVmaW5lIEFTTF9SRVNOQU1FX1hGRVJUWVBFICAgICAgICAgICAgICAgICAgICAiX1NJeiIJLyogOCgwKSwgOF9hbmQxNigxKSwgMTYoMikgKi8KKy8qCisgKiBSZXNvdXJjZSBkZXNjcmlwdG9yIHRhZ3MsIGFzIGRlZmluZWQgaW4gdGhlIEFDUEkgc3BlY2lmaWNhdGlvbi4KKyAqIFVzZWQgdG8gc3ltYm9saWNhbGx5IHJlZmVyZW5jZSBmaWVsZHMgd2l0aGluIGEgZGVzY3JpcHRvci4KKyAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgIl9BRFIiCisjZGVmaW5lIEFDUElfUkVTVEFHX0FMSUdOTUVOVCAgICAgICAgICAgICAgICAgICAiX0FMTiIKKyNkZWZpbmUgQUNQSV9SRVNUQUdfQUREUkVTU1NQQUNFICAgICAgICAgICAgICAgICJfQVNJIgorI2RlZmluZSBBQ1BJX1JFU1RBR19BQ0NFU1NTSVpFICAgICAgICAgICAgICAgICAgIl9BU1oiCisjZGVmaW5lIEFDUElfUkVTVEFHX1RZUEVTUEVDSUZJQ0FUVFJJQlVURVMgICAgICAiX0FUVCIKKyNkZWZpbmUgQUNQSV9SRVNUQUdfQkFTRUFERFJFU1MgICAgICAgICAgICAgICAgICJfQkFTIgorI2RlZmluZSBBQ1BJX1JFU1RBR19CVVNNQVNURVIgICAgICAgICAgICAgICAgICAgIl9CTV8iCS8qIE1hc3RlcigxKSwgU2xhdmUoMCkgKi8KKyNkZWZpbmUgQUNQSV9SRVNUQUdfREVDT0RFICAgICAgICAgICAgICAgICAgICAgICJfREVDIgorI2RlZmluZSBBQ1BJX1JFU1RBR19ETUEgICAgICAgICAgICAgICAgICAgICAgICAgIl9ETUEiCisjZGVmaW5lIEFDUElfUkVTVEFHX0RNQVRZUEUgICAgICAgICAgICAgICAgICAgICAiX1RZUCIJLyogQ29tcGF0aWJsZSgwKSwgQSgxKSwgQigyKSwgRigzKSAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19HUkFOVUxBUklUWSAgICAgICAgICAgICAgICAgIl9HUkEiCisjZGVmaW5lIEFDUElfUkVTVEFHX0lOVEVSUlVQVCAgICAgICAgICAgICAgICAgICAiX0lOVCIKKyNkZWZpbmUgQUNQSV9SRVNUQUdfSU5URVJSVVBUTEVWRUwgICAgICAgICAgICAgICJfTExfIgkvKiBhY3RpdmVfbG8oMSksIGFjdGl2ZV9oaSgwKSAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19JTlRFUlJVUFRTSEFSRSAgICAgICAgICAgICAgIl9TSFIiCS8qIFNoYXJlYWJsZSgxKSwgbm9fc2hhcmUoMCkgKi8KKyNkZWZpbmUgQUNQSV9SRVNUQUdfSU5URVJSVVBUVFlQRSAgICAgICAgICAgICAgICJfSEVfIgkvKiBFZGdlKDEpLCBMZXZlbCgwKSAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19MRU5HVEggICAgICAgICAgICAgICAgICAgICAgIl9MRU4iCisjZGVmaW5lIEFDUElfUkVTVEFHX01FTUFUVFJJQlVURVMgICAgICAgICAgICAgICAiX01UUCIJLyogTWVtb3J5KDApLCBSZXNlcnZlZCgxKSwgQUNQSSgyKSwgTlZTKDMpICovCisjZGVmaW5lIEFDUElfUkVTVEFHX01FTVRZUEUgICAgICAgICAgICAgICAgICAgICAiX01FTSIJLyogbm9uX2NhY2hlKDApLCBDYWNoZWFibGUoMSkgQ2FjaGUrY29tYmluZSgyKSwgQ2FjaGUrcHJlZmV0Y2goMykgKi8KKyNkZWZpbmUgQUNQSV9SRVNUQUdfTUFYQUREUiAgICAgICAgICAgICAgICAgICAgICJfTUFYIgorI2RlZmluZSBBQ1BJX1JFU1RBR19NSU5BRERSICAgICAgICAgICAgICAgICAgICAgIl9NSU4iCisjZGVmaW5lIEFDUElfUkVTVEFHX01BWFRZUEUgICAgICAgICAgICAgICAgICAgICAiX01BRiIKKyNkZWZpbmUgQUNQSV9SRVNUQUdfTUlOVFlQRSAgICAgICAgICAgICAgICAgICAgICJfTUlGIgorI2RlZmluZSBBQ1BJX1JFU1RBR19SRUdJU1RFUkJJVE9GRlNFVCAgICAgICAgICAgIl9SQk8iCisjZGVmaW5lIEFDUElfUkVTVEFHX1JFR0lTVEVSQklUV0lEVEggICAgICAgICAgICAiX1JCVyIKKyNkZWZpbmUgQUNQSV9SRVNUQUdfUkFOR0VUWVBFICAgICAgICAgICAgICAgICAgICJfUk5HIgorI2RlZmluZSBBQ1BJX1JFU1RBR19SRUFEV1JJVEVUWVBFICAgICAgICAgICAgICAgIl9SV18iCS8qIHJlYWRfb25seSgwKSwgV3JpdGVhYmxlICgxKSAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19UUkFOU0xBVElPTiAgICAgICAgICAgICAgICAgIl9UUkEiCisjZGVmaW5lIEFDUElfUkVTVEFHX1RSQU5TVFlQRSAgICAgICAgICAgICAgICAgICAiX1RSUyIJLyogU3BhcnNlKDEpLCBEZW5zZSgwKSAqLworI2RlZmluZSBBQ1BJX1JFU1RBR19UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIl9UVFAiCS8qIFRyYW5zbGF0aW9uKDEpLCBTdGF0aWMgKDApICovCisjZGVmaW5lIEFDUElfUkVTVEFHX1hGRVJUWVBFICAgICAgICAgICAgICAgICAgICAiX1NJWiIJLyogOCgwKSwgOF9hbmQxNigxKSwgMTYoMikgKi8KIAogLyogRGVmYXVsdCBzaXplcyBmb3IgInNtYWxsIiByZXNvdXJjZSBkZXNjcmlwdG9ycyAqLwogCkBAIC0xMDksNyArMTE1LDcgQEAKICAqIFNNQUxMIGRlc2NyaXB0b3JzCiAgKi8KICNkZWZpbmUgQU1MX1JFU09VUkNFX1NNQUxMX0hFQURFUl9DT01NT04gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTsKIAogc3RydWN0IGFtbF9yZXNvdXJjZV9zbWFsbF9oZWFkZXIgewogQU1MX1JFU09VUkNFX1NNQUxMX0hFQURFUl9DT01NT059OwpAQCAtMTYyLDggKzE2OCw4IEBACiAgKiBMQVJHRSBkZXNjcmlwdG9ycwogICovCiAjZGVmaW5lIEFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OIFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3R5cGU7XAotCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX2xlbmd0aDsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfdHlwZTtcCisJdTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9sZW5ndGg7CiAKIHN0cnVjdCBhbWxfcmVzb3VyY2VfbGFyZ2VfaGVhZGVyIHsKIEFNTF9SRVNPVVJDRV9MQVJHRV9IRUFERVJfQ09NTU9OfTsKQEAgLTE5NCw5ICsyMDAsOSBAQAogfTsKIAogI2RlZmluZSBBTUxfUkVTT1VSQ0VfQUREUkVTU19DT01NT04gXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3R5cGU7IFwKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczsgXAotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2ZsYWdzOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfdHlwZTsgXAorCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7IFwKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljX2ZsYWdzOwogCiBzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MgewogQU1MX1JFU09VUkNFX0xBUkdFX0hFQURFUl9DT01NT04gQU1MX1JFU09VUkNFX0FERFJFU1NfQ09NTU9OfTsKQEAgLTI2Niw2ICsyNzIsNyBAQAogdW5pb24gYW1sX3Jlc291cmNlIHsKIAkvKiBEZXNjcmlwdG9yIGhlYWRlcnMgKi8KIAorCXU4IGRlc2NyaXB0b3JfdHlwZTsKIAlzdHJ1Y3QgYW1sX3Jlc291cmNlX3NtYWxsX2hlYWRlciBzbWFsbF9oZWFkZXI7CiAJc3RydWN0IGFtbF9yZXNvdXJjZV9sYXJnZV9oZWFkZXIgbGFyZ2VfaGVhZGVyOwogCkBAIC0yOTYsOSArMzAzLDkgQEAKIAkvKiBVdGlsaXR5IG92ZXJsYXlzICovCiAKIAlzdHJ1Y3QgYW1sX3Jlc291cmNlX2FkZHJlc3MgYWRkcmVzczsKLQl1MzIgdTMyX2l0ZW07Ci0JdTE2IHUxNl9pdGVtOwotCXU4IFU4aXRlbTsKKwl1MzIgZHdvcmRfaXRlbTsKKwl1MTYgd29yZF9pdGVtOworCXU4IGJ5dGVfaXRlbTsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oIGIvaW5jbHVkZS9hY3BpL3BkY19pbnRlbC5oCmluZGV4IDNmYTgxZDUuLmM1NDcyYmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wZGNfaW50ZWwuaAorKysgYi9pbmNsdWRlL2FjcGkvcGRjX2ludGVsLmgKQEAgLTE4LDYgKzE4LDExIEBACiAJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQgfCBcCiAJCQkJCSBBQ1BJX1BEQ19QX0ZGSCkKIAorI2RlZmluZSBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TV1NNUAkoQUNQSV9QRENfU01QX0MxUFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19DX0MxX0hBTFQgfCBcCisJCQkJCSBBQ1BJX1BEQ19TTVBfUF9TV0NPT1JEIHwgXAorCQkJCQkgQUNQSV9QRENfUF9GRkgpCisKICNkZWZpbmUgQUNQSV9QRENfQ19DQVBBQklMSVRZX1NNUAkoQUNQSV9QRENfU01QX0MyQzMgfCBcCiAJCQkJCSBBQ1BJX1BEQ19TTVBfQzFQVCB8IFwKIAkJCQkJIEFDUElfUERDX0NfQzFfSEFMVCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2Vudi5oIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKaW5kZXggMjIzZWM2NC4uNDUzYTQ2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKKysrIGIvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjZW52LmgKQEAgLTQ5LDMzICs0OSw0MSBAQAogICovCiAKICNpZmRlZiBBQ1BJX0xJQlJBUlkKKy8qCisgKiBOb3RlOiBUaGUgbm9uLWRlYnVnIHZlcnNpb24gb2YgdGhlIGFjcGlfbGlicmFyeSBkb2VzIG5vdCBjb250YWluIGFueQorICogZGVidWcgc3VwcG9ydCwgZm9yIG1pbmltaW1hbCBzaXplLiBUaGUgZGVidWcgdmVyc2lvbiB1c2VzIEFDUElfRlVMTF9ERUJVRworICovCiAjZGVmaW5lIEFDUElfVVNFX0xPQ0FMX0NBQ0hFCiAjZW5kaWYKIAotI2lmZGVmIEFDUElfRFVNUF9BUFAKLSNpZm5kZWYgTVNET1MKLSNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKLSNlbmRpZgotI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCi0jZGVmaW5lIEFDUElfRElTQVNTRU1CTEVSCi0jZGVmaW5lIEFDUElfTk9fTUVUSE9EX0VYRUNVVElPTgotI2VuZGlmCi0KLSNpZmRlZiBBQ1BJX0VYRUNfQVBQCi0jdW5kZWYgREVCVUdHRVJfVEhSRUFESU5HCi0jZGVmaW5lIERFQlVHR0VSX1RIUkVBRElORyAgICAgIERFQlVHR0VSX1NJTkdMRV9USFJFQURFRAotI2RlZmluZSBBQ1BJX0RFQlVHX09VVFBVVAotI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCi0jZGVmaW5lIEFDUElfREVCVUdHRVIKLSNkZWZpbmUgQUNQSV9ESVNBU1NFTUJMRVIKLSNkZWZpbmUgQUNQSV9NVVRFWF9ERUJVRwotI2VuZGlmCi0KICNpZmRlZiBBQ1BJX0FTTF9DT01QSUxFUgogI2RlZmluZSBBQ1BJX0RFQlVHX09VVFBVVAogI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCiAjZGVmaW5lIEFDUElfRElTQVNTRU1CTEVSCiAjZGVmaW5lIEFDUElfQ09OU1RBTlRfRVZBTF9PTkxZCisjZGVmaW5lIEFDUElfTEFSR0VfTkFNRVNQQUNFX05PREUKKyNkZWZpbmUgQUNQSV9EQVRBX1RBQkxFX0RJU0FTU0VNQkxZCisjZW5kaWYKKworI2lmZGVmIEFDUElfRVhFQ19BUFAKKyN1bmRlZiBERUJVR0dFUl9USFJFQURJTkcKKyNkZWZpbmUgREVCVUdHRVJfVEhSRUFESU5HICAgICAgREVCVUdHRVJfU0lOR0xFX1RIUkVBREVECisjZGVmaW5lIEFDUElfRlVMTF9ERUJVRworI2RlZmluZSBBQ1BJX0FQUExJQ0FUSU9OCisjZGVmaW5lIEFDUElfREVCVUdHRVIKKyNkZWZpbmUgQUNQSV9NVVRFWF9ERUJVRworI2RlZmluZSBBQ1BJX0RCR19UUkFDS19BTExPQ0FUSU9OUworI2VuZGlmCisKKyNpZmRlZiBBQ1BJX0RBU01fQVBQCisjaWZuZGVmIE1TRE9TCisjZGVmaW5lIEFDUElfREVCVUdfT1VUUFVUCisjZW5kaWYKKyNkZWZpbmUgQUNQSV9BUFBMSUNBVElPTgorI2RlZmluZSBBQ1BJX0RJU0FTU0VNQkxFUgorI2RlZmluZSBBQ1BJX05PX01FVEhPRF9FWEVDVVRJT04KKyNkZWZpbmUgQUNQSV9MQVJHRV9OQU1FU1BBQ0VfTk9ERQorI2RlZmluZSBBQ1BJX0RBVEFfVEFCTEVfRElTQVNTRU1CTFkKICNlbmRpZgogCiAjaWZkZWYgQUNQSV9BUFBMSUNBVElPTgpAQCAtODMsNiArOTEsMTIgQEAKICNkZWZpbmUgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKICNlbmRpZgogCisjaWZkZWYgQUNQSV9GVUxMX0RFQlVHCisjZGVmaW5lIEFDUElfREVCVUdHRVIKKyNkZWZpbmUgQUNQSV9ERUJVR19PVVRQVVQKKyNkZWZpbmUgQUNQSV9ESVNBU1NFTUJMRVIKKyNlbmRpZgorCiAvKgogICogRW52aXJvbm1lbnQgY29uZmlndXJhdGlvbi4gIFRoZSBwdXJwb3NlIG9mIHRoaXMgZmlsZSBpcyB0byBpbnRlcmZhY2UgdG8gdGhlCiAgKiBsb2NhbCBnZW5lcmF0aW9uIGVudmlyb25tZW50LgpAQCAtMTM3LDcgKzE1MSw3IEBACiAjZWxpZiBkZWZpbmVkKE1TRE9TKQkJLyogTXVzdCBhcHBlYXIgYWZ0ZXIgV0lOMzIgYW5kIFdJTjY0IGNoZWNrICovCiAjaW5jbHVkZSAiYWNkb3MxNi5oIgogCi0jZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0Rfa2VybmVsX18pCiAjaW5jbHVkZSAiYWNmcmVlYnNkLmgiCiAKICNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKQEAgLTE2MywxNyArMTc3LDYgQEAKIAogI2VuZGlmCiAKLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiB0cmFja2luZy4gIFVzZWQgb25seSBpZgotICogMSkgVGhpcyBpcyB0aGUgZGVidWcgdmVyc2lvbgotICogMikgVGhpcyBpcyBOT1QgYSAxNi1iaXQgdmVyc2lvbiBvZiB0aGUgY29kZSAobm90IGVub3VnaCByZWFsLW1vZGUgbWVtb3J5KQotICovCi0jaWZkZWYgQUNQSV9ERUJVR19PVVRQVVQKLSNpZiBBQ1BJX01BQ0hJTkVfV0lEVEggIT0gMTYKLSNkZWZpbmUgQUNQSV9EQkdfVFJBQ0tfQUxMT0NBVElPTlMKLSNlbmRpZgotI2VuZGlmCi0KIC8qISBbRW5kXSBubyBzb3VyY2UgY29kZSB0cmFuc2xhdGlvbiAhKi8KIAogLyoKQEAgLTI3MSw4ICsyNzQsOCBAQAogLyoKICAqIFN0b3JhZ2UgYWxpZ25tZW50IHByb3BlcnRpZXMKICAqLwotI2RlZmluZSAgX0FVUEJORCAgICAgICAgICAgICAgICAoc2l6ZW9mIChhY3BpX25hdGl2ZV91aW50KSAtIDEpCi0jZGVmaW5lICBfQUROQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX3VpbnQpIC0gMSkKKyNkZWZpbmUgIF9BVVBCTkQgICAgICAgICAgICAgICAgKHNpemVvZiAoYWNwaV9uYXRpdmVfaW50KSAtIDEpCisjZGVmaW5lICBfQUROQk5EICAgICAgICAgICAgICAgIChzaXplb2YgKGFjcGlfbmF0aXZlX2ludCkgLSAxKQogCiAvKgogICogVmFyaWFibGUgYXJndW1lbnQgbGlzdCBtYWNybyBkZWZpbml0aW9ucwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaCBiL2luY2x1ZGUvYWNwaS9wbGF0Zm9ybS9hY2xpbnV4LmgKaW5kZXggM2M2YTYyMC4uMjc3ZDM1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3BsYXRmb3JtL2FjbGludXguaAorKysgYi9pbmNsdWRlL2FjcGkvcGxhdGZvcm0vYWNsaW51eC5oCkBAIC01MSwyNyArNTEsMjIgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vYWNwaS5oPgotCi0jZGVmaW5lIHN0cnRvdWwgc2ltcGxlX3N0cnRvdWwKLQotI2RlZmluZSBBQ1BJX01BQ0hJTkVfV0lEVEggIEJJVFNfUEVSX0xPTkcKLQotLyogVHlwZShzKSBmb3IgdGhlIE9TTCAqLwotCi0jaWZkZWYgQUNQSV9VU0VfTE9DQUxfQ0FDSEUKLSNkZWZpbmUgYWNwaV9jYWNoZV90CXN0cnVjdCBhY3BpX21lbW9yeV9saXN0Ci0jZWxzZQogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNkZWZpbmUgYWNwaV9jYWNoZV90CWttZW1fY2FjaGVfdAotI2VuZGlmCisKKy8qIEhvc3QtZGVwZW5kZW50IHR5cGVzIGFuZCBkZWZpbmVzICovCisKKyNkZWZpbmUgQUNQSV9NQUNISU5FX1dJRFRIICAgICAgICAgIEJJVFNfUEVSX0xPTkcKKyNkZWZpbmUgYWNwaV9jYWNoZV90ICAgICAgICAgICAgICAgICAgICAgICAga21lbV9jYWNoZV90CisjZGVmaW5lIEFDUElfRVhQT1JUX1NZTUJPTChzeW1ib2wpICBFWFBPUlRfU1lNQk9MKHN5bWJvbCk7CisjZGVmaW5lIHN0cnRvdWwgICAgICAgICAgICAgICAgICAgICBzaW1wbGVfc3RydG91bAogCiAvKiBGdWxsIG5hbWVzcGFjZSBwYXRobmFtZSBsZW5ndGggbGltaXQgLSBhcmJpdHJhcnkgKi8KLQogI2RlZmluZSBBQ1BJX1BBVEhOQU1FX01BWCAgICAgICAgICAgICAgMjU2CiAKICNlbHNlCQkJCS8qICFfX0tFUk5FTF9fICovCkBAIC0xMDMsNCArOTgsOCBAQAogCiAjZGVmaW5lIGFjcGlfY3B1X2ZsYWdzIHVuc2lnbmVkIGxvbmcKIAorI2RlZmluZSBhY3BpX3RocmVhZF9pZCB1MzIKKworc3RhdGljIGlubGluZSBhY3BpX3RocmVhZF9pZCBhY3BpX29zX2dldF90aHJlYWRfaWQodm9pZCkgeyByZXR1cm4gMDsgfQorCiAjZW5kaWYJCQkJLyogX19BQ0xJTlVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IGVmN2Q4M2EuLjc3MzcxYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTIsNiArMiw3IEBACiAjZGVmaW5lIF9fQUNQSV9QUk9DRVNTT1JfSAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAKICNpbmNsdWRlIDxhc20vYWNwaS5oPgogCkBAIC0xNyw2ICsxOCwxNyBAQAogCiAjZGVmaW5lIEFDUElfUERDX1JFVklTSU9OX0lECQkweDEKIAorI2RlZmluZSBBQ1BJX1BTRF9SRVYwX1JFVklTSU9OCQkwIC8qIFN1cHBvcnQgZm9yIF9QU0QgYXMgaW4gQUNQSSAzLjAgKi8KKyNkZWZpbmUgQUNQSV9QU0RfUkVWMF9FTlRSSUVTCQk1CisKKy8qCisgKiBUeXBlcyBvZiBjb29yZGluYXRpb24gZGVmaW5lZCBpbiBBQ1BJIDMuMC4gU2FtZSBtYWNyb3MgY2FuIGJlIHVzZWQgYWNyb3NzCisgKiBQLCBDIGFuZCBUIHN0YXRlcworICovCisjZGVmaW5lIERPTUFJTl9DT09SRF9UWVBFX1NXX0FMTAkweGZjCisjZGVmaW5lIERPTUFJTl9DT09SRF9UWVBFX1NXX0FOWQkweGZkCisjZGVmaW5lIERPTUFJTl9DT09SRF9UWVBFX0hXX0FMTAkweGZlCisKIC8qIFBvd2VyIE1hbmFnZW1lbnQgKi8KIAogc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4OwpAQCAtNjUsNiArNzcsMTQgQEAKIAogLyogUGVyZm9ybWFuY2UgTWFuYWdlbWVudCAqLwogCitzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSB7CisJYWNwaV9pbnRlZ2VyIG51bV9lbnRyaWVzOworCWFjcGlfaW50ZWdlciByZXZpc2lvbjsKKwlhY3BpX2ludGVnZXIgZG9tYWluOworCWFjcGlfaW50ZWdlciBjb29yZF90eXBlOworCWFjcGlfaW50ZWdlciBudW1fcHJvY2Vzc29yczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCiBzdHJ1Y3QgYWNwaV9wY3RfcmVnaXN0ZXIgewogCXU4IGRlc2NyaXB0b3I7CiAJdTE2IGxlbmd0aDsKQEAgLTkxLDcgKzExMSw5IEBACiAJc3RydWN0IGFjcGlfcGN0X3JlZ2lzdGVyIHN0YXR1c19yZWdpc3RlcjsKIAl1bnNpZ25lZCBpbnQgc3RhdGVfY291bnQ7CiAJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3B4ICpzdGF0ZXM7Ci0KKwlzdHJ1Y3QgYWNwaV9wc2RfcGFja2FnZSBkb21haW5faW5mbzsKKwljcHVtYXNrX3Qgc2hhcmVkX2NwdV9tYXA7CisJdW5zaWduZWQgaW50IHNoYXJlZF90eXBlOwogfTsKIAogLyogVGhyb3R0bGluZyBDb250cm9sICovCkBAIC0xNjAsNiArMTgyLDkgQEAKIAl9IHBpaXg0OwogfTsKIAorZXh0ZXJuIGludCBhY3BpX3Byb2Nlc3Nvcl9wcmVyZWdpc3Rlcl9wZXJmb3JtYW5jZSgKKwkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX3BlcmZvcm1hbmNlICoqcGVyZm9ybWFuY2UpOworCiBleHRlcm4gaW50IGFjcGlfcHJvY2Vzc29yX3JlZ2lzdGVyX3BlcmZvcm1hbmNlKHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wZXJmb3JtYW5jZQogCQkJCQkgICAgICAgKnBlcmZvcm1hbmNlLCB1bnNpZ25lZCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIGFjcGlfcHJvY2Vzc29yX3VucmVnaXN0ZXJfcGVyZm9ybWFuY2Uoc3RydWN0CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hbHBoYS9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLWFscGhhL2Zsb3BweS5oCmluZGV4IGUxNzdkNDEuLjIxODE2ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFscGhhL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLWFscGhhL2Zsb3BweS5oCkBAIC0yNSw5ICsyNSw4IEBACiAjZGVmaW5lIGZkX2VuYWJsZV9pcnEoKSAgICAgICAgIGVuYWJsZV9pcnEoRkxPUFBZX0lSUSkKICNkZWZpbmUgZmRfZGlzYWJsZV9pcnEoKSAgICAgICAgZGlzYWJsZV9pcnEoRkxPUFBZX0lSUSkKICNkZWZpbmUgZmRfY2FjaGVmbHVzaChhZGRyLHNpemUpIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgZmRfcmVxdWVzdF9pcnEoKSAgICAgICAgcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwgXAotCQkJCQkgICAgU0FfSU5URVJSVVBUfFNBX1NBTVBMRV9SQU5ET00sIFwKLQkJCQkgICAgICAgICAgICAiZmxvcHB5IiwgTlVMTCkKKyNkZWZpbmUgZmRfcmVxdWVzdF9pcnEoKSAgICAgICAgcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCxcCisJCQkJCSAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKQogI2RlZmluZSBmZF9mcmVlX2lycSgpICAgICAgICAgICBmcmVlX2lycShGTE9QUFlfSVJRLCBOVUxMKTsKIAogI2lmZGVmIENPTkZJR19QQ0kKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFscGhhL2lycS5oIGIvaW5jbHVkZS9hc20tYWxwaGEvaXJxLmgKaW5kZXggZjZkZTAzMy4uOTE3YjlmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYWxwaGEvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tYWxwaGEvaXJxLmgKQEAgLTkyLDggKzkyLDQgQEAKIHN0cnVjdCBwdF9yZWdzOwogZXh0ZXJuIHZvaWQgKCpwZXJmX2lycSkodW5zaWduZWQgbG9uZywgc3RydWN0IHB0X3JlZ3MgKik7CiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1pbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCBpcnFhY3Rpb24gKik7Ci0KLQogI2VuZGlmIC8qIF9BTFBIQV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYWxwaGEvdmdhLmggYi9pbmNsdWRlL2FzbS1hbHBoYS92Z2EuaAppbmRleCA4Y2E0ZjZiLi5lZDA2ZjU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hbHBoYS92Z2EuaAorKysgYi9pbmNsdWRlL2FzbS1hbHBoYS92Z2EuaApAQCAtNDYsNiArNDYsNiBAQAogI2RlZmluZSB2Z2FfcmVhZGIoYSkJcmVhZGIoKHU4IF9faW9tZW0gKikoYSkpCiAjZGVmaW5lIHZnYV93cml0ZWIodixhKQl3cml0ZWIodiwgKHU4IF9faW9tZW0gKikoYSkpCiAKLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkJKCh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKHgsIDApKQorI2RlZmluZSBWR0FfTUFQX01FTSh4LHMpCSgodW5zaWduZWQgbG9uZykgaW9yZW1hcCh4LCBzKSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtYWFlYzIwMDAvaW8uaAppbmRleCA4ZDY3OTA3Li5kNzEwMjA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1hYWVjMjAwMC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWFhZWMyMDAwL2lvLmgKQEAgLTE2LDYgKzE2LDUgQEAKICAqLwogI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWNscHM3MTF4L2lvLmgKaW5kZXggNjI2MTNiMC4uNTNkNzkwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtY2xwczcxMXgvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1jbHBzNzExeC9pby5oCkBAIC0yNiw3ICsyNiw2IEBACiAKICNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQogI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCShhKQogCiAvKgogICogV2UgZG9uJ3Qgc3VwcG9ydCBpbnNbbGJdL291dHNbbGJdLiAgTWFrZSB0aGVtIGZhdWx0LgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTI4NS9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZWJzYTI4NS9pby5oCmluZGV4IDc3NmY5ZDMuLmY5YzcyOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVic2EyODUvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lYnNhMjg1L2lvLmgKQEAgLTI0LDcgKzI0LDYgQEAKICNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKFBDSU9fQkFTRSArIChhKSkpCiAjaWYgMQogI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCSgoYSkgKyBQQ0lNRU1fQkFTRSkKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX19tZW1fcGNpKHZvaWQgX19pb21lbSAqcCkKQEAgLTM0LDE0ICszMyw3IEBACiAJcmV0dXJuIHA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lvbWVtICpfX19tZW1faXNhKHZvaWQgX19pb21lbSAqcCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylwOwotCUJVR19PTihhID49IDE2KjEwNDg1NzYpOwotCXJldHVybiBwICsgUENJTUVNX0JBU0U7Ci19CiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJX19fbWVtX3BjaShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCV9fX21lbV9pc2EoYSkKICNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWVwOTN4eC9lcDkzeHgtcmVncy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXA5M3h4L2VwOTN4eC1yZWdzLmgKaW5kZXggNzFjZWEwYi4uOGMzMjI5NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXA5M3h4L2VwOTN4eC1yZWdzLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXA5M3h4L2VwOTN4eC1yZWdzLmgKQEAgLTExNSw2ICsxMTUsOCBAQAogI2RlZmluZSBFUDkzWFhfU1lTQ09OX0NMT0NLX1VTSF9FTgkweDEwMDAwMDAwCiAjZGVmaW5lIEVQOTNYWF9TWVNDT05fSEFMVAkJRVA5M1hYX1NZU0NPTl9SRUcoMHgwOCkKICNkZWZpbmUgRVA5M1hYX1NZU0NPTl9TVEFOREJZCQlFUDkzWFhfU1lTQ09OX1JFRygweDBjKQorI2RlZmluZSBFUDkzWFhfU1lTQ09OX0NMT0NLX1NFVDEJRVA5M1hYX1NZU0NPTl9SRUcoMHgyMCkKKyNkZWZpbmUgRVA5M1hYX1NZU0NPTl9DTE9DS19TRVQyCUVQOTNYWF9TWVNDT05fUkVHKDB4MjQpCiAjZGVmaW5lIEVQOTNYWF9TWVNDT05fREVWSUNFX0NPTkZJRwlFUDkzWFhfU1lTQ09OX1JFRygweDgwKQogI2RlZmluZSBFUDkzWFhfU1lTQ09OX0RFVklDRV9DT05GSUdfQ1JVTkNIX0VOQUJMRQkweDAwODAwMDAwCiAjZGVmaW5lIEVQOTNYWF9TWVNDT05fU1dMT0NLCQlFUDkzWFhfU1lTQ09OX1JFRygweGMwKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtZXA5M3h4L3BsYXRmb3JtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcDkzeHgvcGxhdGZvcm0uaAppbmRleCBkZjljYmI2Li5kN2EzNGNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcDkzeHgvcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1lcDkzeHgvcGxhdGZvcm0uaApAQCAtOCw2ICs4LDcgQEAKIHZvaWQgZXA5M3h4X2luaXRfaXJxKHZvaWQpOwogdm9pZCBlcDkzeHhfaW5pdF90aW1lKHVuc2lnbmVkIGxvbmcpOwogdm9pZCBlcDkzeHhfaW5pdF9kZXZpY2VzKHZvaWQpOwordm9pZCBlcDkzeHhfY2xvY2tfaW5pdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3Qgc3lzX3RpbWVyIGVwOTN4eF90aW1lcjsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvaW14LWRtYS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW14L2lteC1kbWEuaAppbmRleCBmMjA2M2MxLi41OTlmMDNlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbXgvaW14LWRtYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlteC9pbXgtZG1hLmgKQEAgLTQ2LDcgKzQ2LDcgQEAKIHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAJdm9pZCAoKmlycV9oYW5kbGVyKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKKwl2b2lkICgqZXJyX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiwgaW50IGVycmNvZGUpOwogCXZvaWQgKmRhdGE7CiAJZG1hbW9kZV90ICBkbWFfbW9kZTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwpAQCAtNTgsNiArNTgsMTAgQEAKIAogZXh0ZXJuIHN0cnVjdCBpbXhfZG1hX2NoYW5uZWwgaW14X2RtYV9jaGFubmVsc1tJTVhfRE1BX0NIQU5ORUxTXTsKIAorI2RlZmluZSBJTVhfRE1BX0VSUl9CVVJTVCAgICAgMQorI2RlZmluZSBJTVhfRE1BX0VSUl9SRVFVRVNUICAgMgorI2RlZmluZSBJTVhfRE1BX0VSUl9UUkFOU0ZFUiAgNAorI2RlZmluZSBJTVhfRE1BX0VSUl9CVUZGRVIgICAgOAogCiAvKiBUaGUgdHlwZSB0byBkaXN0aW5ndWlzaCBjaGFubmVsIG51bWJlcnMgcGFyYW1ldGVyIGZyb20gb3JkaW5hbCBpbnQgdHlwZSAqLwogdHlwZWRlZiBpbnQgaW14X2RtYWNoX3Q7CkBAIC03NCw3ICs3OCw3IEBACiBpbnQKIGlteF9kbWFfc2V0dXBfaGFuZGxlcnMoaW14X2RtYWNoX3QgZG1hX2NoLAogCQl2b2lkICgqaXJxX2hhbmRsZXIpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKSwgdm9pZCAqZGF0YSk7CisJCXZvaWQgKCplcnJfaGFuZGxlcikgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBpbnQpLCB2b2lkICpkYXRhKTsKIAogdm9pZCBpbXhfZG1hX2VuYWJsZShpbXhfZG1hY2hfdCBkbWFfY2gpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1pbnRlZ3JhdG9yL2lvLmgKaW5kZXggMzFmMmRlYS4uYzhmMjE3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW50ZWdyYXRvci9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWludGVncmF0b3IvaW8uaApAQCAtMzIsNiArMzIsNSBAQAogCiAjZGVmaW5lIF9faW8oYSkJCQkoKHZvaWQgX19pb21lbSAqKShQQ0lfSU9fVkFERFIgKyAoYSkpKQogI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCSgoYSkgKyBQQ0lfTUVNT1JZX1ZBRERSKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWlvcDN4eC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wM3h4L2lvLmgKaW5kZXggZjM5MDQ2YS4uMzZhZGJkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wM3h4L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaW9wM3h4L2lvLmgKQEAgLTE3LDYgKzE3LDUgQEAKIAogI2RlZmluZSBfX2lvKHApCQkJKCh2b2lkIF9faW9tZW0gKikocCkpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjN4eC9peHAyM3h4LmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyM3h4L2l4cDIzeHguaAppbmRleCAwMWVmZGJkLi5kMGE3MjIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyM3h4L2l4cDIzeHguaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyM3h4L2l4cDIzeHguaApAQCAtMTI0LDYgKzEyNCw3IEBACiAKICNkZWZpbmUgSVhQMjNYWF9FWFBfVU5JVF9GVVNFCQlJWFAyM1hYX0VYUF9DRkdfUkVHKDB4MjgpCiAjZGVmaW5lIElYUDIzWFhfRVhQX01TRl9NVVgJCUlYUDIzWFhfRVhQX0NGR19SRUcoMHgzMCkKKyNkZWZpbmUgSVhQMjNYWF9FWFBfQ0ZHX0ZVU0UJCUlYUDIzWFhfRVhQX0NGR19SRUcoMHgzNCkKIAogI2RlZmluZSBJWFAyM1hYX0VYUF9CVVNfUEhZUwkJMHg5MDAwMDAwMAogI2RlZmluZSBJWFAyM1hYX0VYUF9CVVNfV0lORE9XX1NJWkUJMHgwMTAwMDAwMApAQCAtMjY1LDYgKzI2Niw4IEBACiAjZGVmaW5lIElYUDIzWFhfUENJX1VOSVRfUkVTRVQJCSgxIDw8IDEpCiAjZGVmaW5lIElYUDIzWFhfWFNDQUxFX1JFU0VUCQkoMSA8PCAwKQogCisjZGVmaW5lIElYUDIzWFhfVUVOR0lORV9DU1JfVklSVF9CQVNFCShJWFAyM1hYX0NBUF9DU1JfVklSVCArIDB4MTgwMDApCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFBDSSBDU1JzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjN4eC9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtaXhwMjN4eC9wbGF0Zm9ybS5oCmluZGV4IGU0ZDk5MDYuLjE5YTczYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLWl4cDIzeHgvcGxhdGZvcm0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1peHAyM3h4L3BsYXRmb3JtLmgKQEAgLTE0LDYgKzE0LDIxIEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKK2V4dGVybiBpbmxpbmUgdW5zaWduZWQgbG9uZyBpeHAyMDAwX3JlZ19yZWFkKHZvbGF0aWxlIHZvaWQgKnJlZykKK3sKKwlyZXR1cm4gKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXJlZyk7Cit9CisKK2V4dGVybiBpbmxpbmUgdm9pZCBpeHAyMDAwX3JlZ193cml0ZSh2b2xhdGlsZSB2b2lkICpyZWcsIHVuc2lnbmVkIGxvbmcgdmFsKQoreworCSooKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilyZWcpID0gdmFsOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgaXhwMjAwMF9yZWdfd3JiKHZvbGF0aWxlIHZvaWQgKnJlZywgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJKigodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXJlZykgPSB2YWw7Cit9CisKIHN0cnVjdCBwY2lfc3lzX2RhdGE7CiAKIHZvaWQgaXhwMjN4eF9tYXBfaW8odm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1sNzIwMC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbDcyMDAvaW8uaAppbmRleCBjYWI4YWQwLi5jZDA4MGQ4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1sNzIwMC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWw3MjAwL2lvLmgKQEAgLTE5LDcgKzE5LDYgQEAKICAqLwogI2RlZmluZSBfX2lvX3BjaShhKQkJKCh2b2lkIF9faW9tZW0gKikoUENJT19CQVNFICsgKGEpKSkKICNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKLSNkZWZpbmUgX19tZW1faXNhKGEpCQkoYSkKIAogI2RlZmluZSBfX2lvYWRkcihwKSAgICAgICAgICAgICBfX2lvX3BjaShwKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1saDdhNDB4L2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1saDdhNDB4L2lvLmgKaW5kZXggYmJjZDQzMy4uMTdiYzk0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtbGg3YTQweC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLWxoN2E0MHgvaW8uaApAQCAtMTgsNiArMTgsNSBAQAogLyogTm8gSVNBIG9yIFBDSSBidXMgb24gdGhpcyBtYWNoaW5lLiAqLwogI2RlZmluZSBfX2lvKGEpCQkJKCh2b2lkIF9faW9tZW0gKikoYSkpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0lPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW5ldHgvZXRoLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1uZXR4L2V0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0M2M5MGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1uZXR4L2V0aC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBpbmNsdWRlL2FzbS1hcm0vYXJjaC1uZXR4L2V0aC5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA1IFNhc2NoYSBIYXVlciA8cy5oYXVlckBwZW5ndXRyb25peC5kZT4sIFBlbmd1dHJvbml4CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgQVNNQVJNX0FSQ0hfRVRIX0gKKyNkZWZpbmUgQVNNQVJNX0FSQ0hfRVRIX0gKKworc3RydWN0IG5ldHhldGhfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgaW50IHhjbm87CS8qIG51bWJlciBvZiB4bWFjL3hwZWMgZW5naW5lIHRoaXMgZXRoIHVzZXMgKi8KK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtbmV0eC9pby5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtbmV0eC9pby5oCmluZGV4IDgxYjdiYzQuLmE3YTUzZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLW5ldHgvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1uZXR4L2lvLmgKQEAgLTI0LDYgKzI0LDUgQEAKIAogI2RlZmluZSBfX2lvKGEpICAgICAgICAgKCh2b2lkIF9faW9tZW0gKikoYSkpCiAjZGVmaW5lIF9fbWVtX3BjaShhKSAgICAgICAgICAgIChhKQotI2RlZmluZSBfX21lbV9pc2EoYSkgICAgICAgICAgICAoYSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1vbWFwL2lvLmgKaW5kZXggYjcyNmFjZi4uNzhmNjhlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtb21hcC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLW9tYXAvaW8uaApAQCAtNDQsNyArNDQsNiBAQAogICovCiAjZGVmaW5lIF9faW8oYSkJCQkoKHZvaWQgX19pb21lbSAqKShQQ0lPX0JBU0UgKyAoYSkpKQogI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCShhKQogCiAvKgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtcG54NDAwOC9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcG54NDAwOC9kZWJ1Zy1tYWNyby5TCmluZGV4IGViMzgzOWQuLjY3ZDE4YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L2RlYnVnLW1hY3JvLlMKQEAgLTE5LDkgKzE5LDUgQEAKIAkJYWRkbmUJXHJ4LCBccngsICMweGY0MDAwMDAwCiAJCS5lbmRtCiAKLQkJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4Ci0JCXN0cmIJXHJkLCBbXHJ4LCAjMHgwXQotCQkuZW5kbQotCiAjZGVmaW5lIFVBUlRfU0hJRlQJMgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9kZWJ1Zy04MjUwLlM+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L2dwaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvZ3Bpby5oCmluZGV4IDFmYTVhNzcuLmQwMWJmODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvZ3Bpby5oCkBAIC0xMjcsNiArMTI3LDc5IEBACiAjZGVmaW5lIEdQSU9fSVNPVVQoSykgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX09VVCkgJiYgKEdQSU9fQklUKEspICYgR1BJT19PVVRfTUFTSykpCiAjZGVmaW5lIEdQSU9fSVNJTihLKSAgKChHUElPX1RZUEVfTUFTSyhLKSA9PSBHUElPX0lOKSAmJiAoR1BJT19CSVQoSykgJiBHUElPX0lOX01BU0spKQogCisvKiBTdGFydCBFbmFibGUgUGluIEludGVycnVwdHMgLSB0YWJsZSA1OCBwYWdlIDY2ICovCisKKyNkZWZpbmUgU0VfUElOX0JBU0VfSU5UICAgMzIKKworI2RlZmluZSBTRV9VN19SWF9JTlQgICAgICAgICAgICA2MworI2RlZmluZSBTRV9VN19IQ1RTX0lOVCAgICAgICAgICA2MgorI2RlZmluZSBTRV9CVF9DTEtSRVFfSU5UICAgICAgICA2MQorI2RlZmluZSBTRV9VNl9JUlJYX0lOVCAgICAgICAgICA2MAorLyo1OSB1bnVzZWQqLworI2RlZmluZSBTRV9VNV9SWF9JTlQgICAgICAgICAgICA1OAorI2RlZmluZSBTRV9HUElfMTFfSU5UICAgICAgICAgICA1NworI2RlZmluZSBTRV9VM19SWF9JTlQgICAgICAgICAgICA1NgorI2RlZmluZSBTRV9VMl9IQ1RTX0lOVCAgICAgICAgICA1NQorI2RlZmluZSBTRV9VMl9SWF9JTlQgICAgICAgICAgICA1NAorI2RlZmluZSBTRV9VMV9SWF9JTlQgICAgICAgICAgICA1MworI2RlZmluZSBTRV9ESVNQX1NZTkNfSU5UICAgICAgICA1MgorLyo1MSB1bnVzZWQqLworI2RlZmluZSBTRV9TRElPX0lOVF9OICAgICAgICAgICA1MAorI2RlZmluZSBTRV9NU0RJT19TVEFSVF9JTlQgICAgICA0OQorI2RlZmluZSBTRV9HUElfMDZfSU5UICAgICAgICAgICA0OAorI2RlZmluZSBTRV9HUElfMDVfSU5UICAgICAgICAgICA0NworI2RlZmluZSBTRV9HUElfMDRfSU5UICAgICAgICAgICA0NgorI2RlZmluZSBTRV9HUElfMDNfSU5UICAgICAgICAgICA0NQorI2RlZmluZSBTRV9HUElfMDJfSU5UICAgICAgICAgICA0NAorI2RlZmluZSBTRV9HUElfMDFfSU5UICAgICAgICAgICA0MworI2RlZmluZSBTRV9HUElfMDBfSU5UICAgICAgICAgICA0MgorI2RlZmluZSBTRV9TWVNDTEtFTl9QSU5fSU5UICAgICA0MQorI2RlZmluZSBTRV9TUEkxX0RBVEFJTl9JTlQgICAgICA0MAorI2RlZmluZSBTRV9HUElfMDdfSU5UICAgICAgICAgICAzOQorI2RlZmluZSBTRV9TUEkyX0RBVEFJTl9JTlQgICAgICAzOAorI2RlZmluZSBTRV9HUElfMTBfSU5UICAgICAgICAgICAzNworI2RlZmluZSBTRV9HUElfMDlfSU5UICAgICAgICAgICAzNgorI2RlZmluZSBTRV9HUElfMDhfSU5UICAgICAgICAgICAzNQorLyozNC0zMiB1bnVzZWQqLworCisvKiBTdGFydCBFbmFibGUgSW50ZXJuYWwgSW50ZXJydXB0cyAtIHRhYmxlIDU3IHBhZ2UgNjUgKi8KKworI2RlZmluZSBTRV9JTlRfQkFTRV9JTlQgICAwCisKKyNkZWZpbmUgU0VfVFNfSVJRICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgU0VfVFNfUF9JTlQgICAgICAgICAgICAgMzAKKyNkZWZpbmUgU0VfVFNfQVVYX0lOVCAgICAgICAgICAgMjkKKy8qMjctMjggdW51c2VkKi8KKyNkZWZpbmUgU0VfVVNCX0FIQl9ORUVEX0NMS19JTlQgMjYKKyNkZWZpbmUgU0VfTVNUSU1FUl9JTlQgICAgICAgICAgMjUKKyNkZWZpbmUgU0VfUlRDX0lOVCAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgU0VfVVNCX05FRURfQ0xLX0lOVCAgICAgMjMKKyNkZWZpbmUgU0VfVVNCX0lOVCAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgU0VfVVNCX0kyQ19JTlQgICAgICAgICAgMjEKKyNkZWZpbmUgU0VfVVNCX09UR19USU1FUl9JTlQgICAgMjAKKyNkZWZpbmUgU0VfVVNCX09UR19BVFhfSU5UX04gICAgMTkKKy8qMTggdW51c2VkKi8KKyNkZWZpbmUgU0VfRFNQX0dQSU80X0lOVCAgICAgICAgMTcKKyNkZWZpbmUgU0VfS0VZX0lSUSAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU0VfRFNQX1NMQVZFUE9SVF9JTlQgICAgMTUKKyNkZWZpbmUgU0VfRFNQX0dQSU8xX0lOVCAgICAgICAgMTQKKyNkZWZpbmUgU0VfRFNQX0dQSU8wX0lOVCAgICAgICAgMTMKKyNkZWZpbmUgU0VfRFNQX0FIQl9JTlQgICAgICAgICAgMTIKKy8qMTEtNiB1bnVzZWQqLworI2RlZmluZSBTRV9HUElPXzA1X0lOVCAgICAgICAgICA1CisjZGVmaW5lIFNFX0dQSU9fMDRfSU5UICAgICAgICAgIDQKKyNkZWZpbmUgU0VfR1BJT18wM19JTlQgICAgICAgICAgMworI2RlZmluZSBTRV9HUElPXzAyX0lOVCAgICAgICAgICAyCisjZGVmaW5lIFNFX0dQSU9fMDFfSU5UICAgICAgICAgIDEKKyNkZWZpbmUgU0VfR1BJT18wMF9JTlQgICAgICAgICAgMAorCisjZGVmaW5lIFNUQVJUX0lOVF9SRUdfQklUKGlycSkgKDE8PCgoaXJxKSYweDFGKSkKKworI2RlZmluZSBTVEFSVF9JTlRfRVJfUkVHKGlycSkgICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDIwICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKKyNkZWZpbmUgU1RBUlRfSU5UX1JTUl9SRUcoaXJxKSAgICBJT19BRERSRVNTKChQTlg0MDA4X1BXUk1BTl9CQVNFICsgMHgyNCArICgoKGlycSkmKDB4MTw8NSkpPj4xKSkpCisjZGVmaW5lIFNUQVJUX0lOVF9TUl9SRUcoaXJxKSAgICAgSU9fQUREUkVTUygoUE5YNDAwOF9QV1JNQU5fQkFTRSArIDB4MjggKyAoKChpcnEpJigweDE8PDUpKT4+MSkpKQorI2RlZmluZSBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpICAgIElPX0FERFJFU1MoKFBOWDQwMDhfUFdSTUFOX0JBU0UgKyAweDJDICsgKCgoaXJxKSYoMHgxPDw1KSk+PjEpKSkKKwogZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fcmVnaXN0ZXJfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7CiBleHRlcm4gaW50IHBueDQwMDhfZ3Bpb191bnJlZ2lzdGVyX3Bpbih1bnNpZ25lZCBzaG9ydCBwaW4pOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcG54NDAwOF9ncGlvX3JlYWRfcGluKHVuc2lnbmVkIHNob3J0IHBpbik7CkBAIC0xMzYsNCArMjA5LDMzIEBACiBleHRlcm4gaW50IHBueDQwMDhfZ3Bpb19zZXRfcGluX211eCh1bnNpZ25lZCBzaG9ydCBwaW4sIGludCBvdXRwdXQpOwogZXh0ZXJuIGludCBwbng0MDA4X2dwaW9fcmVhZF9waW5fbXV4KHVuc2lnbmVkIHNob3J0IHBpbik7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfdW1hc2sodTggaXJxKQoreworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfRVJfUkVHKGlycSkpIHwKKwkJICAgICBTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfRVJfUkVHKGlycSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X21hc2sodTggaXJxKQoreworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfRVJfUkVHKGlycSkpICYKKwkJICAgICB+U1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0VSX1JFRyhpcnEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9hY2sodTggaXJxKQoreworCV9fcmF3X3dyaXRlbChTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfUlNSX1JFRyhpcnEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9zZXRfZmFsbGluZ19lZGdlKHU4IGlycSkKK3sKKwlfX3Jhd193cml0ZWwoX19yYXdfcmVhZGwoU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSkgJgorCQkgICAgIH5TVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF9zZXRfcmlzaW5nX2VkZ2UodTggaXJxKQoreworCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKSB8CisJCSAgICAgU1RBUlRfSU5UX1JFR19CSVQoaXJxKSwgU1RBUlRfSU5UX0FQUl9SRUcoaXJxKSk7Cit9CisKICNlbmRpZgkJCQkvKiBfUE5YNDAwOF9HUElPX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L3BtLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L3BtLmgKaW5kZXggYzY2MDQ4Ni4uYmFjMTYzNGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXBueDQwMDgvcG0uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1wbng0MDA4L3BtLmgKQEAgLTI5LDM0ICsyOSw1IEBACiBleHRlcm4gaW50IHBueDQwMDhfc3RhcnR1cF9wbGwoc3RydWN0IGNsayAqKTsKIGV4dGVybiBpbnQgcG54NDAwOF9zaHV0ZG93bl9wbGwoc3RydWN0IGNsayAqKTsKIAotc3RhdGljIGlubGluZSB2b2lkIHN0YXJ0X2ludF91bWFzayh1OCBpcnEpCi17Ci0JX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9FUl9SRUcoaXJxKSkgfAotCQkgICAgIFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9FUl9SRUcoaXJxKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdGFydF9pbnRfbWFzayh1OCBpcnEpCi17Ci0JX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9FUl9SRUcoaXJxKSkgJgotCQkgICAgIH5TVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfRVJfUkVHKGlycSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X2Fjayh1OCBpcnEpCi17Ci0JX19yYXdfd3JpdGVsKFNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9SU1JfUkVHKGlycSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3NldF9mYWxsaW5nX2VkZ2UodTggaXJxKQotewotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKSAmCi0JCSAgICAgflNUQVJUX0lOVF9SRUdfQklUKGlycSksIFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfaW50X3NldF9yaXNpbmdfZWRnZSh1OCBpcnEpCi17Ci0JX19yYXdfd3JpdGVsKF9fcmF3X3JlYWRsKFNUQVJUX0lOVF9BUFJfUkVHKGlycSkpIHwKLQkJICAgICBTVEFSVF9JTlRfUkVHX0JJVChpcnEpLCBTVEFSVF9JTlRfQVBSX1JFRyhpcnEpKTsKLX0KLQogI2VuZGlmCQkJCS8qIEFTU0VNQkxFUiAqLwogI2VuZGlmCQkJCS8qIF9fQVNNX0FSQ0hfUE5YNDAwOF9QTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1weGEvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pby5oCmluZGV4IGViMmRkNTguLjdmOGQ4MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXB4YS9pby5oCkBAIC0xNiw2ICsxNiw1IEBACiAgKi8KICNkZWZpbmUgX19pbyhhKQkJCSgodm9pZCBfX2lvbWVtICopKGEpKQogI2RlZmluZSBfX21lbV9wY2koYSkJCShhKQotI2RlZmluZSBfX21lbV9pc2EoYSkJCShhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXJlYWx2aWV3L2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1yZWFsdmlldy9pby5oCmluZGV4IGQ0NDRhNjguLmM3MGYxZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXJlYWx2aWV3L2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtcmVhbHZpZXcvaW8uaApAQCAtMjksNiArMjksNSBAQAogCiAjZGVmaW5lIF9faW8oYSkJCQlfX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9kZWJ1Zy1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9kZWJ1Zy1tYWNyby5TCmluZGV4IDVmODIyM2UuLmI3ZDE1ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZGVidWctbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2RlYnVnLW1hY3JvLlMKQEAgLTMzLDcgKzMzLDcgQEAKIAkJLmVuZG0KIAogCQkubWFjcm8Jc2VuZHVhcnQscmQscngKLQkJc3RyCVxyZCwgW1xyeCwgIyBTM0MyNDEwX1VUWEggXQorCQlzdHJiIAlccmQsIFtccngsICMgUzNDMjQxMF9VVFhIIF0KIAkJLmVuZG0KIAogCQkubWFjcm8JYnVzeXVhcnQsIHJkLCByeApAQCAtNDIsNiArNDIsMTIgQEAKIAkJYmVxCTEwMDFmCQkJCUAKIAkJQCBGSUZPIGVuYWJsZWQuLi4KIDEwMDM6CisJCUAgY2hlY2sgZm9yIGFybTkyMCB2cyBhcm05MjYuIGN1cnJlbnRseSBhc3N1bWUgYWxsIGFybTkyNgorCQlAIGRldmljZXMgaGF2ZSBhbiA2NCBieXRlIEZJRk8gaWRlbnRpY2FsIHRvIHRoZSBzM2MyNDQwCisJCW1yYwlwMTUsIDAsIFxyZCwgYzAsIGMwCisJCWFuZAlccmQsIFxyZCwgIzB4ZmYwCisJCXRlcQlccmQsICMweDI2MAorCQliZXEJMTAwNGYKIAkJbXJjCXAxNSwgMCwgXHJkLCBjMSwgYzAKIAkJdHN0CVxyZCwgIzEKIAkJYWRkZXEJXHJkLCBccngsICMoUzNDMjRYWF9QQV9HUElPIC0gUzNDMjRYWF9QQV9VQVJUKQpAQCAtNTAsNyArNTYsNyBAQAogCQlsZHIJXHJkLCBbIFxyZCwgIyBTM0MyNDEwX0dTVEFUVVMxIC0gUzNDMjQxMF9HUElPUkVHKDApIF0KIAkJYW5kCVxyZCwgXHJkLCAjMHgwMGZmMDAwMAogCQl0ZXEJXHJkLCAjMHgwMDQ0MDAwMAkJQCBpcyBpdCAyNDQwPwotCisxMDA0OgogCQlsZHIJXHJkLCBbIFxyeCwgIyBTM0MyNDEwX1VGU1RBVCBdCiAJCW1vdmVxCVxyZCwgXHJkLCBsc3IgI1NISUZUXzI0NDBUWEYKIAkJdHN0CVxyZCwgI1MzQzI0MTBfVUZTVEFUX1RYRlVMTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9lbnRyeS1tYWNyby5TIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9lbnRyeS1tYWNyby5TCmluZGV4IDg5NGMzNWMuLmUwOWE2YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvZW50cnktbWFjcm8uUworKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL2VudHJ5LW1hY3JvLlMKQEAgLTE4LDggKzE4LDYgQEAKIAogI2RlZmluZSBJTlRQTkQJCSgweDEwKQogI2RlZmluZSBJTlRPRkZTRVQJKDB4MTQpCi0jZGVmaW5lIEVYVElOVFBFTkQJKDB4YTgpCi0jZGVmaW5lIEVYVElOVE1BU0sJKDB4YTQpCiAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vYXJjaC9pcnFzLmg+CkBAIC0yOCwzNyArMjYsMjMgQEAKIAogCQltb3YJXGJhc2UsICNTM0MyNFhYX1ZBX0lSUQogCi0JCWxkcglcaXJxc3RhdCwgWyBcYmFzZSwgI0lOVFBORF0KLQkJYmljcwlcaXJxbnIsIFxpcnFzdGF0LCAjMzw8NAkJQEAgb25seSBhbiBHUElPIElSUQotCQliZXEJMjAwMGYKLQogCQlAQCB0cnkgdGhlIGludGVycnVwdCBvZmZzZXQgcmVnaXN0ZXIsIHNpbmNlIGl0IGlzIHRoZXJlCiAKKwkJbGRyCVxpcnFzdGF0LCBbIFxiYXNlLCAjSU5UUE5EIF0KKwkJdGVxCVxpcnFzdGF0LCAjMAorCQliZXEJMTAwMmYKIAkJbGRyCVxpcnFuciwgWyBcYmFzZSwgI0lOVE9GRlNFVCBdCiAJCW1vdglcdG1wLCAjMQogCQl0c3QJXGlycXN0YXQsIFx0bXAsIGxzbCBcaXJxbnIKLQkJYWRkbmUJXGlycW5yLCBcaXJxbnIsICNJUlFfRUlOVDAKIAkJYm5lCTEwMDFmCiAKIAkJQEAgdGhlIG51bWJlciBzcGVjaWZpZWQgaXMgbm90IGEgdmFsaWQgaXJxLCBzbyB0cnkKIAkJQEAgYW5kIHdvcmsgaXQgb3V0IGZvciBvdXJzZWx2ZXMKIAotCQltb3YJXGlycW5yLCAjSVJRX0VJTlQwCQlAQCBzdGFydCBoZXJlCi0JCWIJMzAwMGYKLQotMjAwMDoKLQkJQEAgbG9hZCB0aGUgR1BJTyBpbnRlcnJ1cHQgcmVnaXN0ZXIsIGFuZCBjaGVjayBpdAotCi0JCWFkZAlcdG1wLCBcYmFzZSwgI1MzQzI0WFhfVkFfR1BJTyAtIFMzQzI0WFhfVkFfSVJRCi0JCWxkcglcaXJxc3RhdCwgWyBcdG1wLCAjIEVYVElOVFBFTkQgXQotCQlsZHIJXGlycW5yLCAgIFsgXHRtcCwgIyBFWFRJTlRNQVNLIF0KLQkJYmljcwlcaXJxc3RhdCwgXGlycXN0YXQsIFxpcnFucgotCQliZXEJMTAwMWYKLQotCQltb3YJXGlycW5yLCAjKElSUV9FSU5UNCAtIDQpCisJCW1vdglcaXJxbnIsICMwCQlAQCBzdGFydCBoZXJlCiAKIAkJQEAgd29yayBvdXQgd2hpY2ggaXJxIChpZiBhbnkpIHdlIGdvdAotMzAwMDoKKwogCQltb3ZzCVx0bXAsIFxpcnFzdGF0LCBsc2wjMTYKIAkJYWRkZXEJXGlycW5yLCBcaXJxbnIsICMxNgogCQltb3ZlcQlcaXJxc3RhdCwgXGlycXN0YXQsIGxzciMxNgpAQCAtNzUsOSArNTksOSBAQAogCQlhZGRlcQlcaXJxbnIsIFxpcnFuciwgIzEKIAogCQlAQCB3ZSBoYXZlIHRoZSB2YWx1ZQotCQltb3ZzCVxpcnFuciwgXGlycW5yCi0KIDEwMDE6CisJCWFkZHMJXGlycW5yLCBcaXJxbnIsICNJUlFfRUlOVDAKKzEwMDI6CiAJCUBAIGV4aXQgaGVyZSwgWiBmbGFnIHVuc2V0IGlmIElSUQogCiAJLmVuZG0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWFwLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL21hcC5oCmluZGV4IDVlNGM4YzMuLmZhZTI3NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvbWFwLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9tYXAuaApAQCAtMjM2LDQgKzIzNiwyMCBAQAogI2RlZmluZSBTM0MyNFhYX1BBX1NQSSAgICAgIFMzQzI0MTBfUEFfU1BJCiAjZW5kaWYKIAorLyogZGVhbCB3aXRoIHRoZSByZWdpc3RlcnMgdGhhdCBtb3ZlIHVuZGVyIHRoZSAyNDEyLzI0MTMgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEyKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfUzNDMjQxMykKKyNpZm5kZWYgX19BU1NFTUJMWV9fCitleHRlcm4gdm9pZCBfX2lvbWVtICpzM2MyNHh4X3ZhX2dwaW8yOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVV9TM0MyNDEyX09OTFkKKyNkZWZpbmUgUzNDMjRYWF9WQV9HUElPMiAoUzNDMjRYWF9WQV9HUElPICsgMHgxMCkKKyNlbHNlCisjZGVmaW5lIFMzQzI0WFhfVkFfR1BJTzIgczNjMjR4eF92YV9ncGlvMgorI2VuZGlmCisjZWxzZQorI2RlZmluZSBzM2MyNHh4X3ZhX2dwaW8yIFMzQzI0WFhfVkFfR1BJTworI2RlZmluZSBTM0MyNFhYX1ZBX0dQSU8yIFMzQzI0WFhfVkFfR1BJTworI2VuZGlmCisKICNlbmRpZiAvKiBfX0FTTV9BUkNIX01BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtY2xvY2suaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCmluZGV4IDZjOTJmYWYuLmE3YzYxZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1jbG9jay5oCkBAIC0xLDYgKzEsNiBAQAogLyogbGludXgvaW5jbHVkZS9hc20vYXJjaC1zM2MyNDEwL3JlZ3MtY2xvY2suaAogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMywyMDA0LDIwMDUgU2ltdGVjIEVsZWN0cm9uaWNzIDxsaW51eEBzaW10ZWMuY28udWs+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCwyMDA1LDIwMDYgU2ltdGVjIEVsZWN0cm9uaWNzIDxsaW51eEBzaW10ZWMuY28udWs+CiAgKgkJICAgICAgaHR0cDovL2FybWxpbnV4LnNpbXRlYy5jby51ay8KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQpAQCAtMTQwLDUgKzE0MCw2NiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDQwIG9yIENPTkZJR19DUFVfUzNDMjQ0MiAqLwogCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1MzQzI0MTIpIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TM0MyNDEzKQorCisjZGVmaW5lIFMzQzI0MTJfT1NDU0VUCQlTM0MyNDEwX0NMS1JFRygweDE4KQorI2RlZmluZSBTM0MyNDEyX0NMS1NSQwkJUzNDMjQxMF9DTEtSRUcoMHgxQykKKworI2RlZmluZSBTM0MyNDEyX1BMTENPTl9PRkYJCSgxPDwyMCkKKworI2RlZmluZSBTM0MyNDEyX0NMS0RJVk5fUERJVk4JCSgxPDwyKQorI2RlZmluZSBTM0MyNDEyX0NMS0RJVk5fSERJVk5fTUFTSwkoMzw8MCkKKyNkZWZpbmUgUzNDMjQyMV9DTEtESVZOX0FSTURJVk4JCSgxPDwzKQorI2RlZmluZSBTM0MyNDEyX0NMS0RJVk5fVVNCNDhESVYJKDE8PDYpCisjZGVmaW5lIFMzQzI0MTJfQ0xLRElWTl9VQVJURElWX01BU0sJKDE1PDw4KQorI2RlZmluZSBTM0MyNDEyX0NMS0RJVk5fVUFSVERJVl9TSElGVAkoOCkKKyNkZWZpbmUgUzNDMjQxMl9DTEtESVZOX0kyU0RJVl9NQVNLCSgxNTw8MTIpCisjZGVmaW5lIFMzQzI0MTJfQ0xLRElWTl9JMlNESVZfU0hJRlQJKDEyKQorI2RlZmluZSBTM0MyNDEyX0NMS0RJVk5fQ0FNRElWX01BU0sJKDE1PDwxNikKKyNkZWZpbmUgUzNDMjQxMl9DTEtESVZOX0NBTURJVl9TSElGVAkoMTYpCisKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fV0RUCQkoMTw8MjgpCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX1NQSQkJKDE8PDI3KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9JSVMJCSgxPDwyNikKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fSUlDCQkoMTw8MjUpCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX0FEQwkJKDE8PDI0KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9SVEMJCSgxPDwyMykKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fR1BJTwkJKDE8PDIyKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VQVJUMgkJKDE8PDIxKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VQVJUMQkJKDE8PDIwKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VQVJUMAkJKDE8PDE5KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9TREkJCSgxPDwxOCkKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fUFdNVAkJKDE8PDE3KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VU0JECQkoMTw8MTYpCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX0NBTUNMSwkJKDE8PDE1KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VQVJUQ0xLCQkoMTw8MTQpCisvKiBtaXNzaW5nIDEzICovCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX1VTQl9IT1NUNDgJKDE8PDEyKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9VU0JfREVWNDgJKDE8PDExKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9IQ0xLZGl2MgkJKDE8PDEwKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9IQ0xLeDIJCSgxPDw5KQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9TRFJBTQkJKDE8PDgpCisvKiBtaXNzaW5nIDcgKi8KKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fVVNCSAkJUzNDMjQxMF9DTEtDT05fVVNCSAorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9MQ0RDCQlTM0MyNDEwX0NMS0NPTl9MQ0RDCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX05BTkQJCVMzQzI0MTBfQ0xLQ09OX05BTkQKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fRE1BMwkJKDE8PDMpCisjZGVmaW5lIFMzQzI0MTJfQ0xLQ09OX0RNQTIJCSgxPDwyKQorI2RlZmluZSBTM0MyNDEyX0NMS0NPTl9ETUExCQkoMTw8MSkKKyNkZWZpbmUgUzNDMjQxMl9DTEtDT05fRE1BMAkJKDE8PDApCisKKy8qIGNsb2NrIHNvdXJlYyBjb250cm9scyAqLworCisjZGVmaW5lIFMzQzI0MTJfQ0xLU1JDX0VYVENMS0RJVl9NQVNLCQkoNyA8PCAwKQorI2RlZmluZSBTM0MyNDEyX0NMS1NSQ19FWFRDTEtESVZfU0hJRlQJCSgwKQorI2RlZmluZSBTM0MyNDEyX0NMS1NSQ19NRElWQ0xLX0VYVENMS0RJVgkoMTw8MykKKyNkZWZpbmUgUzNDMjQxMl9DTEtTUkNfTVNZU0NMS19NUExMCQkoMTw8NCkKKyNkZWZpbmUgUzNDMjQxMl9DTEtTUkNfVVNZU0NMS19VUExMCQkoMTw8NSkKKyNkZWZpbmUgUzNDMjQxMl9DTEtTUkNfVUFSVENMS19NUExMCQkoMTw8OCkKKyNkZWZpbmUgUzNDMjQxMl9DTEtTUkNfSTJTQ0xLX01QTEwJCSgxPDw5KQorI2RlZmluZSBTM0MyNDEyX0NMS1NSQ19VU0JDTEtfSENMSwkJKDE8PDEwKQorI2RlZmluZSBTM0MyNDEyX0NMS1NSQ19DQU1DTEtfSENMSwkJKDE8PDExKQorCisjZW5kaWYgLyogQ09ORklHX0NQVV9TM0MyNDEyIHwgQ09ORklHX0NQVV9TM0MyNDEzICovCiAKICNlbmRpZiAvKiBfX0FTTV9BUk1fUkVHU19DTE9DSyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWRzYy5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWRzYy5oCmluZGV4IGEwMjNiMDQuLjg0YWNhNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1kc2MuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZHNjLmgKQEAgLTIzLDYgKzIzLDkgQEAKICNkZWZpbmUgUzNDMjQ0MF9EU0MwCSAgIFMzQzI0MTBfR1BJT1JFRygweGM0KQogI2RlZmluZSBTM0MyNDQwX0RTQzEJICAgUzNDMjQxMF9HUElPUkVHKDB4YzgpCiAKKyNkZWZpbmUgUzNDMjQxMl9EU0MwCSAgIFMzQzI0MTBfR1BJT1JFRygweGRjKQorI2RlZmluZSBTM0MyNDEyX0RTQzEJICAgUzNDMjQxMF9HUElPUkVHKDB4ZTApCisKICNkZWZpbmUgUzNDMjQ0MF9TRUxFQ1RfRFNDMCAoMCkKICNkZWZpbmUgUzNDMjQ0MF9TRUxFQ1RfRFNDMSAoMTw8MzEpCiAKQEAgLTE3MCw3ICsxNzMsNyBAQAogI2RlZmluZSBTM0MyNDQwX0RTQzFfQ1MxXzRtQSAgICAoMzw8MikKICNkZWZpbmUgUzNDMjQ0MF9EU0MxX0NTMV9NQVNLICAgKDM8PDIpCiAKLSNkZWZpbmUgUzNDMjQ0MF9EU0MxX0NTMCAgICAgICAgKFMzQzI0NDBfU0VMRUNUX0RTQzEgfCAwCisjZGVmaW5lIFMzQzI0NDBfRFNDMV9DUzAgICAgICAgIChTM0MyNDQwX1NFTEVDVF9EU0MxIHwgMCkKICNkZWZpbmUgUzNDMjQ0MF9EU0MxX0NTMF8xMG1BICAgKDA8PDApCiAjZGVmaW5lIFMzQzI0NDBfRFNDMV9DUzBfOG1BICAgICgxPDwwKQogI2RlZmluZSBTM0MyNDQwX0RTQzFfQ1MwXzZtQSAgICAoMjw8MCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpby5oCmluZGV4IDVmMTAzMzQuLjZkZDE3ZjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1ncGlvLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNkZWZpbmUgUzNDMjRYWF9NSVNDQ1IgICAgICAgIFMzQzI0MDBfTUlTQ0NSCiAjZWxzZQogI2RlZmluZSBTM0MyNFhYX0dQSU9fQkFTRSh4KSAgUzNDMjQxMF9HUElPX0JBU0UoeCkKLSNkZWZpbmUgUzNDMjRYWF9NSVNDQ1IgICAgICAgIFMzQzI0MTBfTUlTQ0NSCisjZGVmaW5lIFMzQzI0WFhfTUlTQ0NSCSAgICAgIFMzQzI0WFhfR1BJT1JFRzIoMHg4MCkKICNlbmRpZiAvKiBDT05GSUdfQ1BVX1MzQzI0MDAgKi8KIAogCkBAIC03Myw5ICs3MywxNSBAQAogI2RlZmluZSBTM0MyNDEwX0dQSU9fU0ZOMiAgICAoMHhGRkZGRkZGMikJLyogbm90IGF2YWlsYWJsZSBvbiBBICovCiAjZGVmaW5lIFMzQzI0MTBfR1BJT19TRk4zICAgICgweEZGRkZGRkYzKQkvKiBub3QgYXZhaWxhYmxlIG9uIEEgKi8KIAotLyogY29uZmlndXJlIEdQSU8gcG9ydHMgQS4uRyAqLworLyogcmVnaXN0ZXIgYWRkcmVzcyBmb3IgdGhlIEdQSU8gcmVnaXN0ZXJzLgorICogUzNDMjRYWF9HUElPUkVHMiBpcyBmb3IgdGhlIHNlY29uZCBzZXQgb2YgcmVnaXN0ZXJzIGluIHRoZQorICogR1BJTyB3aGljaCBtb3ZlIGJldHdlZW4gczNjMjQxMCBhbmQgczNjMjQxMiB0eXBlIHN5c3RlbXMgKi8KIAogI2RlZmluZSBTM0MyNDEwX0dQSU9SRUcoeCkgKCh4KSArIFMzQzI0WFhfVkFfR1BJTykKKyNkZWZpbmUgUzNDMjRYWF9HUElPUkVHMih4KSAoKHgpICsgUzNDMjRYWF9WQV9HUElPMikKKworCisvKiBjb25maWd1cmUgR1BJTyBwb3J0cyBBLi5HICovCiAKIC8qIHBvcnQgQSAtIFMzQzI0MTA6IDIyYml0cywgemVybyBpbiBiaXQgWCBtYWtlcyBwaW4gWCBvdXRwdXQKICAqICAgICAgICAgIFMzQzI0MDA6IDE4Yml0cywgemVybyBpbiBiaXQgWCBtYWtlcyBwaW4gWCBvdXRwdXQKQEAgLTk1MywxMSArOTU5LDE4IEBACiAjZGVmaW5lIFMzQzI0MTBfR1BIMTBfT1VUUCAgICAoMHgwMSA8PCAyMCkKICNkZWZpbmUgUzNDMjQxMF9HUEgxMF9DTEtPVVQxICgweDAyIDw8IDIwKQogCisvKiBUaGUgUzNDMjQxMiBhbmQgUzNDMjQxMyBtb3ZlIHRoZSBHUEogcmVnaXN0ZXIgc2V0IHRvIGFmdGVyCisgKiBHUEgsIHdoaWNoIG1lYW5zIGFsbCByZWdpc3RlcnMgYWZ0ZXIgMHg4MCBhcmUgbm93IG9mZnNldCBieSAweDEwCisgKiBmb3IgdGhlIDI0MTIvMjQxMyBmcm9tIHRoZSAyNDEwLzI0NDAvMjQ0MgorKi8KKwogLyogbWlzY2VsbGFuZW91cyBjb250cm9sICovCiAjZGVmaW5lIFMzQzI0MDBfTUlTQ0NSCSAgIFMzQzI0MTBfR1BJT1JFRygweDU0KQogI2RlZmluZSBTM0MyNDEwX01JU0NDUgkgICBTM0MyNDEwX0dQSU9SRUcoMHg4MCkKICNkZWZpbmUgUzNDMjQxMF9EQ0xLQ09OCSAgIFMzQzI0MTBfR1BJT1JFRygweDg0KQogCisjZGVmaW5lIFMzQzI0WFhfRENMS0NPTgkgICBTM0MyNFhYX0dQSU9SRUcyKDB4ODQpCisKIC8qIHNlZSBjbG9jay5oIGZvciBkY2xrIGRlZmluaXRpb25zICovCiAKIC8qIHB1bGx1cCBjb250cm9sIG9uIGRhdGFidXMgKi8KQEAgLTk4NSw2ICs5OTgsOCBAQAogI2RlZmluZSBTM0MyNDEwX01JU0NDUl9DTEswX0RDTEswICAgKDU8PDQpCiAjZGVmaW5lIFMzQzI0MTBfTUlTQ0NSX0NMSzBfTUFTSyAgICAoNzw8NCkKIAorI2RlZmluZSBTM0MyNDEyX01JU0NDUl9DTEswX1JUQwkgICAgKDI8PDQpCisKICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfQ0xLMV9NUExMICAgICgwPDw4KQogI2RlZmluZSBTM0MyNDEwX01JU0NDUl9DTEsxX1VQTEwgICAgKDE8PDgpCiAjZGVmaW5lIFMzQzI0MTBfTUlTQ0NSX0NMSzFfRkNMSyAgICAoMjw8OCkKQEAgLTk5Myw2ICsxMDA4LDggQEAKICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfQ0xLMV9EQ0xLMSAgICg1PDw4KQogI2RlZmluZSBTM0MyNDEwX01JU0NDUl9DTEsxX01BU0sgICAgKDc8PDgpCiAKKyNkZWZpbmUgUzNDMjQxMl9NSVNDQ1JfQ0xLMV9DTEtzcmMgICgwPDw4KQorCiAjZGVmaW5lIFMzQzI0MTBfTUlTQ0NSX1VTQlNVU1BORDAgICAoMTw8MTIpCiAjZGVmaW5lIFMzQzI0MTBfTUlTQ0NSX1VTQlNVU1BORDEgICAoMTw8MTMpCiAKQEAgLTEwMDAsNyArMTAxNyw3IEBACiAKICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfbkVOX1NDTEswICAgICgxPDwxNykKICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfbkVOX1NDTEsxICAgICgxPDwxOCkKLSNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfbkVOX1NDTEtFICAgICgxPDwxOSkKKyNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfbkVOX1NDTEtFICAgICgxPDwxOSkJLyogbm90IDI0MTIgKi8KICNkZWZpbmUgUzNDMjQxMF9NSVNDQ1JfU0RTTEVFUAkgICAgKDc8PDE3KQogCiAvKiBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbC4uLiAqLwpAQCAtMTAxNyw2ICsxMDM0LDEwIEBACiAjZGVmaW5lIFMzQzI0MTBfRVhUSU5UMQkgICBTM0MyNDEwX0dQSU9SRUcoMHg4QykKICNkZWZpbmUgUzNDMjQxMF9FWFRJTlQyCSAgIFMzQzI0MTBfR1BJT1JFRygweDkwKQogCisjZGVmaW5lIFMzQzI0WFhfRVhUSU5UMAkgICBTM0MyNFhYX0dQSU9SRUcyKDB4ODgpCisjZGVmaW5lIFMzQzI0WFhfRVhUSU5UMQkgICBTM0MyNFhYX0dQSU9SRUcyKDB4OEMpCisjZGVmaW5lIFMzQzI0WFhfRVhUSU5UMgkgICBTM0MyNFhYX0dQSU9SRUcyKDB4OTApCisKIC8qIHZhbHVlcyBmb3IgUzNDMjQxMF9FWFRJTlQwLzEvMiAqLwogI2RlZmluZSBTM0MyNDEwX0VYVElOVF9MT1dMRVYJICgweDAwKQogI2RlZmluZSBTM0MyNDEwX0VYVElOVF9ISUxFVgkgKDB4MDEpCkBAIC0xMDMwLDYgKzEwNTEsMTEgQEAKICNkZWZpbmUgUzNDMjQxMF9FSU5GTFQyCSAgIFMzQzI0MTBfR1BJT1JFRygweDlDKQogI2RlZmluZSBTM0MyNDEwX0VJTkZMVDMJICAgUzNDMjQxMF9HUElPUkVHKDB4QTApCiAKKyNkZWZpbmUgUzNDMjRYWF9FSU5GTFQwCSAgIFMzQzI0WFhfR1BJT1JFRzIoMHg5NCkKKyNkZWZpbmUgUzNDMjRYWF9FSU5GTFQxCSAgIFMzQzI0WFhfR1BJT1JFRzIoMHg5OCkKKyNkZWZpbmUgUzNDMjRYWF9FSU5GTFQyCSAgIFMzQzI0WFhfR1BJT1JFRzIoMHg5QykKKyNkZWZpbmUgUzNDMjRYWF9FSU5GTFQzCSAgIFMzQzI0WFhfR1BJT1JFRzIoMHhBMCkKKwogLyogdmFsdWVzIGZvciBpbnRlcnJ1cHQgZmlsdGVyaW5nICovCiAjZGVmaW5lIFMzQzI0MTBfRUlOVEZMVF9QQ0xLCQkoMHgwMCkKICNkZWZpbmUgUzNDMjQxMF9FSU5URkxUX0VYVENMSwkJKDE8PDcpCkBAIC0xMDM5LDYgKzEwNjUsNyBAQAogCiAvKiBHU1RBVFVTIGhhdmUgbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbiBpbiB0aGVtCiAgKgorICogVGhlc2UgbW92ZSBiZXR3ZWVuIHMzYzI0MTAgYW5kIHMzYzI0MTIgc3R5bGUgc3lzdGVtcy4KICAqLwogCiAjZGVmaW5lIFMzQzI0MTBfR1NUQVRVUzAgICBTM0MyNDEwX0dQSU9SRUcoMHgwQUMpCkBAIC0xMDQ3LDYgKzEwNzQsMTggQEAKICNkZWZpbmUgUzNDMjQxMF9HU1RBVFVTMyAgIFMzQzI0MTBfR1BJT1JFRygweDBCOCkKICNkZWZpbmUgUzNDMjQxMF9HU1RBVFVTNCAgIFMzQzI0MTBfR1BJT1JFRygweDBCQykKIAorI2RlZmluZSBTM0MyNDEyX0dTVEFUVVMwICAgUzNDMjQxMF9HUElPUkVHKDB4MEJDKQorI2RlZmluZSBTM0MyNDEyX0dTVEFUVVMxICAgUzNDMjQxMF9HUElPUkVHKDB4MEMwKQorI2RlZmluZSBTM0MyNDEyX0dTVEFUVVMyICAgUzNDMjQxMF9HUElPUkVHKDB4MEM0KQorI2RlZmluZSBTM0MyNDEyX0dTVEFUVVMzICAgUzNDMjQxMF9HUElPUkVHKDB4MEM4KQorI2RlZmluZSBTM0MyNDEyX0dTVEFUVVM0ICAgUzNDMjQxMF9HUElPUkVHKDB4MENDKQorCisjZGVmaW5lIFMzQzI0WFhfR1NUQVRVUzAgICBTM0MyNFhYX0dQSU9SRUcyKDB4MEFDKQorI2RlZmluZSBTM0MyNFhYX0dTVEFUVVMxICAgUzNDMjRYWF9HUElPUkVHMigweDBCMCkKKyNkZWZpbmUgUzNDMjRYWF9HU1RBVFVTMiAgIFMzQzI0WFhfR1BJT1JFRzIoMHgwQjQpCisjZGVmaW5lIFMzQzI0WFhfR1NUQVRVUzMgICBTM0MyNFhYX0dQSU9SRUcyKDB4MEI4KQorI2RlZmluZSBTM0MyNFhYX0dTVEFUVVM0ICAgUzNDMjRYWF9HUElPUkVHMigweDBCQykKKwogI2RlZmluZSBTM0MyNDEwX0dTVEFUVVMwX25XQUlUCSAgICgxPDwzKQogI2RlZmluZSBTM0MyNDEwX0dTVEFUVVMwX05DT04JICAgKDE8PDIpCiAjZGVmaW5lIFMzQzI0MTBfR1NUQVRVUzBfUm5CCSAgICgxPDwxKQpAQCAtMTA1NCw2ICsxMDkzLDcgQEAKIAogI2RlZmluZSBTM0MyNDEwX0dTVEFUVVMxX0lETUFTSwkgICAoMHhmZmZmMDAwMCkKICNkZWZpbmUgUzNDMjQxMF9HU1RBVFVTMV8yNDEwCSAgICgweDMyNDEwMDAwKQorI2RlZmluZSBTM0MyNDEwX0dTVEFUVVMxXzI0MTIJICAgKDB4MzI0MTIwMDEpCiAjZGVmaW5lIFMzQzI0MTBfR1NUQVRVUzFfMjQ0MAkgICAoMHgzMjQ0MDAwMCkKICNkZWZpbmUgUzNDMjQxMF9HU1RBVFVTMV8yNDQyCSAgICgweDMyNDQwYWFhKQogCkBAIC0xMDc3LDUgKzExMTcsMjIgQEAKICNkZWZpbmUgUzNDMjQwMF9PUEVOQ1JfT1BDX01PU0lESVMgICgwPDw1KQogI2RlZmluZSBTM0MyNDAwX09QRU5DUl9PUENfTU9TSUVOICAgKDE8PDUpCiAKKy8qIDI0MTIvMjQxMyBzbGVlcCBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFMzQzI0MTJfR1BCU0xQQ09OCVMzQzI0MTBfR1BJT1JFRygweDFDKQorI2RlZmluZSBTM0MyNDEyX0dQQ1NMUENPTglTM0MyNDEwX0dQSU9SRUcoMHgyQykKKyNkZWZpbmUgUzNDMjQxMl9HUERTTFBDT04JUzNDMjQxMF9HUElPUkVHKDB4M0MpCisjZGVmaW5lIFMzQzI0MTJfR1BFU0xQQ09OCVMzQzI0MTBfR1BJT1JFRygweDRDKQorI2RlZmluZSBTM0MyNDEyX0dQRlNMUENPTglTM0MyNDEwX0dQSU9SRUcoMHg1QykKKyNkZWZpbmUgUzNDMjQxMl9HUEdTTFBDT04JUzNDMjQxMF9HUElPUkVHKDB4NkMpCisjZGVmaW5lIFMzQzI0MTJfR1BIU0xQQ09OCVMzQzI0MTBfR1BJT1JFRygweDdDKQorCisvKiBkZWZpbml0aW9ucyBmb3IgZWFjaCBwaW4gYml0ICovCisjZGVmaW5lIFMzQzI0MTJfU0xQQ09OX0xPVyh4KQkoIDB4MDAgPDwgKCh4KSAqIDIpKQorI2RlZmluZSBTM0MyNDEyX1NMUENPTl9ISSh4KQkoIDB4MDEgPDwgKCh4KSAqIDIpKQorI2RlZmluZSBTM0MyNDEyX1NMUENPTl9JTih4KQkoIDB4MDIgPDwgKCh4KSAqIDIpKQorI2RlZmluZSBTM0MyNDEyX1NMUENPTl9QRFdOKHgpCSggMHgwMyA8PCAoKHgpICogMikpCisjZGVmaW5lIFMzQzI0MTJfU0xQQ09OX01BU0soeCkJKCAweDAzIDw8ICgoeCkgKiAyKSkKKwogI2VuZGlmCS8qIF9fQVNNX0FSQ0hfUkVHU19HUElPX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWdwaW9qLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpb2ouaAppbmRleCAzYWQyMzI0Li4xOGVkYWU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpb2ouaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtZ3Bpb2ouaApAQCAtMzIsNiArMzIsMTEgQEAKICNkZWZpbmUgUzNDMjQ0MF9HUEpEQVQJICAgIFMzQzI0MTBfR1BJT1JFRygweGQ0KQogI2RlZmluZSBTM0MyNDQwX0dQSlVQCSAgICBTM0MyNDEwX0dQSU9SRUcoMHhkOCkKIAorI2RlZmluZSBTM0MyNDEzX0dQSkNPTgkJUzNDMjQxMF9HUElPUkVHKDB4ODApCisjZGVmaW5lIFMzQzI0MTNfR1BKREFUCQlTM0MyNDEwX0dQSU9SRUcoMHg4NCkKKyNkZWZpbmUgUzNDMjQxM19HUEpVUAkJUzNDMjQxMF9HUElPUkVHKDB4ODgpCisjZGVmaW5lIFMzQzI0MTNfR1BKU0xQQ09OCVMzQzI0MTBfR1BJT1JFRygweDhDKQorCiAjZGVmaW5lIFMzQzI0NDBfR1BKMCAgICAgICAgICAgIFMzQzI0MTBfR1BJT05PKFMzQzI0NDBfR1BJT19CQU5LSiwgMCkKICNkZWZpbmUgUzNDMjQ0MF9HUEowX0lOUCAgICAgICAgKDB4MDAgPDwgMCkKICNkZWZpbmUgUzNDMjQ0MF9HUEowX09VVFAgICAgICAgKDB4MDEgPDwgMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1pcnEuaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1pcnEuaAppbmRleCAyNGI3MjkyLi41NzJmY2E1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3MtaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLWlycS5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNkZWZpbmUgUzNDMjQxMF9JUlFSRUcoeCkgICAoKHgpICsgUzNDMjRYWF9WQV9JUlEpCiAjZGVmaW5lIFMzQzI0MTBfRUlOVFJFRyh4KSAgKCh4KSArIFMzQzI0WFhfVkFfR1BJTykKKyNkZWZpbmUgUzNDMjRYWF9FSU5UUkVHKHgpICAoKHgpICsgUzNDMjRYWF9WQV9HUElPMikKIAogI2RlZmluZSBTM0MyNDEwX1NSQ1BORAkgICAgICAgUzNDMjQxMF9JUlFSRUcoMHgwMDApCiAjZGVmaW5lIFMzQzI0MTBfSU5UTU9ECSAgICAgICBTM0MyNDEwX0lSUVJFRygweDAwNCkKQEAgLTQwLDUgKzQxLDEwIEBACiAKICNkZWZpbmUgUzNDMjQxMF9FSU5UTUFTSyAgICAgICBTM0MyNDEwX0VJTlRSRUcoMHgwQTQpCiAjZGVmaW5lIFMzQzI0MTBfRUlOVFBFTkQgICAgICAgUzNDMjQxMF9FSU5UUkVHKDBYMEE4KQorI2RlZmluZSBTM0MyNDEyX0VJTlRNQVNLICAgICAgIFMzQzI0MTBfRUlOVFJFRygweDBCNCkKKyNkZWZpbmUgUzNDMjQxMl9FSU5UUEVORCAgICAgICBTM0MyNDEwX0VJTlRSRUcoMFgwQjgpCisKKyNkZWZpbmUgUzNDMjRYWF9FSU5UTUFTSyAgICAgICBTM0MyNFhYX0VJTlRSRUcoMHgwQTQpCisjZGVmaW5lIFMzQzI0WFhfRUlOVFBFTkQgICAgICAgUzNDMjRYWF9FSU5UUkVHKDBYMEE4KQogCiAjZW5kaWYgLyogX19fQVNNX0FSQ0hfUkVHU19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNlcmlhbC5oIGIvaW5jbHVkZS9hc20tYXJtL2FyY2gtczNjMjQxMC9yZWdzLXNlcmlhbC5oCmluZGV4IDgzYjAxMjUuLjkzZjY1MWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXMzYzI0MTAvcmVncy1zZXJpYWwuaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zM2MyNDEwL3JlZ3Mtc2VyaWFsLmgKQEAgLTgyLDYgKzgyLDEyIEBACiAjZGVmaW5lIFMzQzI0NDBfVUNPTjJfRElWTUFTSwkgICg3IDw8IDEyKQogI2RlZmluZSBTM0MyNDQwX1VDT05fRElWU0hJRlQJICAoMTIpCiAKKyNkZWZpbmUgUzNDMjQxMl9VQ09OX0NMS01BU0sJKDM8PDEwKQorI2RlZmluZSBTM0MyNDEyX1VDT05fVUNMSwkoMTw8MTApCisjZGVmaW5lIFMzQzI0MTJfVUNPTl9VU1lTQ0xLCSgzPDwxMCkKKyNkZWZpbmUgUzNDMjQxMl9VQ09OX1BDTEsJKDA8PDEwKQorI2RlZmluZSBTM0MyNDEyX1VDT05fUENMSzIJKDI8PDEwKQorCiAjZGVmaW5lIFMzQzI0MTBfVUNPTl9VQ0xLCSAgKDE8PDEwKQogI2RlZmluZSBTM0MyNDEwX1VDT05fU0JSRUFLCSAgKDE8PDQpCiAKQEAgLTEyNCw2ICsxMzAsMTUgQEAKICNkZWZpbmUJUzNDMjQxMF9VTUNPTV9BRkMJICAoMTw8NCkKICNkZWZpbmUJUzNDMjQxMF9VTUNPTV9SVFNfTE9XCSAgKDE8PDApCiAKKyNkZWZpbmUgUzNDMjQxMl9VTUNPTl9BRkNfNjMJKDA8PDUpCisjZGVmaW5lIFMzQzI0MTJfVU1DT05fQUZDXzU2CSgxPDw1KQorI2RlZmluZSBTM0MyNDEyX1VNQ09OX0FGQ180OAkoMjw8NSkKKyNkZWZpbmUgUzNDMjQxMl9VTUNPTl9BRkNfNDAJKDM8PDUpCisjZGVmaW5lIFMzQzI0MTJfVU1DT05fQUZDXzMyCSg0PDw1KQorI2RlZmluZSBTM0MyNDEyX1VNQ09OX0FGQ18yNAkoNTw8NSkKKyNkZWZpbmUgUzNDMjQxMl9VTUNPTl9BRkNfMTYJKDY8PDUpCisjZGVmaW5lIFMzQzI0MTJfVU1DT05fQUZDXzgJKDc8PDUpCisKICNkZWZpbmUgUzNDMjQxMF9VRlNUQVRfVFhGVUxMCSAgKDE8PDkpCiAjZGVmaW5lIFMzQzI0MTBfVUZTVEFUX1JYRlVMTAkgICgxPDw4KQogI2RlZmluZSBTM0MyNDEwX1VGU1RBVF9UWE1BU0sJICAoMTU8PDQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC1zYTExMDAvaW8uaCBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9pby5oCmluZGV4IDA0MGNjZGUuLjA3NTYyNjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9hcmNoLXNhMTEwMC9pby5oCkBAIC0yMiw2ICsyMiw1IEBACiB9CiAjZGVmaW5lIF9faW8oYSkJCQlfX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkJKGEpCi0jZGVmaW5lIF9fbWVtX2lzYShhKQkJKGEpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXJtL2FyY2gtdmVyc2F0aWxlL2lvLmggYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaW8uaAppbmRleCA0N2U5MDRjLi5jNGQwMTk0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaW8uaAorKysgYi9pbmNsdWRlL2FzbS1hcm0vYXJjaC12ZXJzYXRpbGUvaW8uaApAQCAtMjgsNiArMjgsNSBAQAogfQogI2RlZmluZSBfX2lvKGEpCV9faW8oYSkKICNkZWZpbmUgX19tZW1fcGNpKGEpCQkoYSkKLSNkZWZpbmUgX19tZW1faXNhKGEpCQkoYSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1hcm0vZmxvcHB5LmgKaW5kZXggNmVhNjU3Yy4uYWEwYzhkMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9mbG9wcHkuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjZGVmaW5lIGZkX2luYihwb3J0KQkJaW5iKChwb3J0KSkKICNkZWZpbmUgZmRfcmVxdWVzdF9pcnEoKQlyZXF1ZXN0X2lycShJUlFfRkxPUFBZRElTSyxmbG9wcHlfaW50ZXJydXB0LFwKLQkJCQkJU0FfSU5URVJSVVBUfFNBX1NBTVBMRV9SQU5ET00sImZsb3BweSIsTlVMTCkKKwkJCQkJICAgIFNBX0lOVEVSUlVQVCwiZmxvcHB5IixOVUxMKQogI2RlZmluZSBmZF9mcmVlX2lycSgpCQlmcmVlX2lycShJUlFfRkxPUFBZRElTSyxOVUxMKQogI2RlZmluZSBmZF9kaXNhYmxlX2lycSgpCWRpc2FibGVfaXJxKElSUV9GTE9QUFlESVNLKQogI2RlZmluZSBmZF9lbmFibGVfaXJxKCkJCWVuYWJsZV9pcnEoSVJRX0ZMT1BQWURJU0spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vaXJxLmggYi9pbmNsdWRlL2FzbS1hcm0vaXJxLmgKaW5kZXggNjBiNTEwNS4uNjZlNjdlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS9pcnEuaApAQCAtNDcsMTAgKzQ3LDYgQEAKIHZvaWQgZW5hYmxlX2lycV93YWtlKHVuc2lnbmVkIGludCBpcnEpOwogaW50IHNldHVwX2lycSh1bnNpZ25lZCBpbnQsIHN0cnVjdCBpcnFhY3Rpb24gKik7CiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogZXh0ZXJuIHZvaWQgbWlncmF0ZV9pcnFzKHZvaWQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybS90aHJlYWRfbm90aWZ5LmggYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX25vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjZlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1hcm0vdGhyZWFkX25vdGlmeS5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiAgbGludXgvaW5jbHVkZS9hc20tYXJtL3RocmVhZF9ub3RpZnkuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgQVNNQVJNX1RIUkVBRF9OT1RJRllfSAorI2RlZmluZSBBU01BUk1fVEhSRUFEX05PVElGWV9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgorCitzdGF0aWMgaW5saW5lIGludCB0aHJlYWRfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKQoreworCWV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgdGhyZWFkX25vdGlmeV9oZWFkOworCXJldHVybiBhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnRocmVhZF9ub3RpZnlfaGVhZCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pCit7CisJZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCB0aHJlYWRfbm90aWZ5X2hlYWQ7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnRocmVhZF9ub3RpZnlfaGVhZCwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmMsIHN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkKQoreworCWV4dGVybiBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgdGhyZWFkX25vdGlmeV9oZWFkOworCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ0aHJlYWRfbm90aWZ5X2hlYWQsIHJjLCB0aHJlYWQpOworfQorCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcmVhc29uIGNvZGVzIGZvciB0aGUgdGhyZWFkIG5vdGlmaWVyLgorICovCisjZGVmaW5lIFRIUkVBRF9OT1RJRllfRkxVU0gJMAorI2RlZmluZSBUSFJFQURfTk9USUZZX1JFTEVBU0UJMQorI2RlZmluZSBUSFJFQURfTk9USUZZX1NXSVRDSAkyCisKKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdWNvbnRleHQuaCBiL2luY2x1ZGUvYXNtLWFybS91Y29udGV4dC5oCmluZGV4IGY4NTMxMzAuLjllNmY3Y2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybS91Y29udGV4dC5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS91Y29udGV4dC5oCkBAIC0xLDEyICsxLDg5IEBACiAjaWZuZGVmIF9BU01BUk1fVUNPTlRFWFRfSAogI2RlZmluZSBfQVNNQVJNX1VDT05URVhUX0gKIAorI2luY2x1ZGUgPGFzbS9mcHN0YXRlLmg+CisKKy8qCisgKiBzdHJ1Y3Qgc2lnY29udGV4dCBvbmx5IGhhcyByb29tIGZvciB0aGUgYmFzaWMgcmVnaXN0ZXJzLCBidXQgc3RydWN0CisgKiB1Y29udGV4dCBub3cgaGFzIHJvb20gZm9yIGFsbCByZWdpc3RlcnMgd2hpY2ggbmVlZCB0byBiZSBzYXZlZCBhbmQKKyAqIHJlc3RvcmVkLiAgQ29wcm9jZXNzb3IgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gdWNfcmVnc3BhY2UuICBFYWNoCisgKiBjb3Byb2Nlc3NvcidzIHNhdmVkIHN0YXRlIHNob3VsZCBzdGFydCB3aXRoIGEgZG9jdW1lbnRlZCAzMi1iaXQgbWFnaWMKKyAqIG51bWJlciwgZm9sbG93ZWQgYnkgYSAzMi1iaXQgd29yZCBnaXZpbmcgdGhlIGNvcHJvY2Nlc29yJ3Mgc2F2ZWQgc2l6ZS4KKyAqIHVjX3JlZ3NwYWNlIG1heSBiZSBleHBhbmRlZCBpZiBuZWNlc3NhcnksIGFsdGhvdWdoIHRoaXMgdGFrZXMgc29tZQorICogY29vcmRpbmF0aW9uIHdpdGggZ2xpYmMuCisgKi8KKwogc3RydWN0IHVjb250ZXh0IHsKIAl1bnNpZ25lZCBsb25nCSAgdWNfZmxhZ3M7CiAJc3RydWN0IHVjb250ZXh0ICAqdWNfbGluazsKIAlzdGFja190CQkgIHVjX3N0YWNrOwogCXN0cnVjdCBzaWdjb250ZXh0IHVjX21jb250ZXh0OwotCXNpZ3NldF90CSAgdWNfc2lnbWFzazsJLyogbWFzayBsYXN0IGZvciBleHRlbnNpYmlsaXR5ICovCisJc2lnc2V0X3QJICB1Y19zaWdtYXNrOworCS8qIEFsbG93IGZvciB1Y19zaWdtYXNrIGdyb3d0aC4gIEdsaWJjIHVzZXMgYSAxMDI0LWJpdCBzaWdzZXRfdC4gICovCisJaW50CQkgIF9fdW51c2VkWzMyIC0gKHNpemVvZiAoc2lnc2V0X3QpIC8gc2l6ZW9mIChpbnQpKV07CisJLyogTGFzdCBmb3IgZXh0ZW5zaWJpbGl0eS4gIEVpZ2h0IGJ5dGUgYWxpZ25lZCBiZWNhdXNlIHNvbWUKKwkgICBjb3Byb2Nlc3NvcnMgcmVxdWlyZSBlaWdodCBieXRlIGFsaWdubWVudC4gICovCisgCXVuc2lnbmVkIGxvbmcJICB1Y19yZWdzcGFjZVsxMjhdIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDgpKSk7CiB9OwogCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogQ29wcm9jZXNzb3Igc2F2ZSBzdGF0ZS4gIFRoZSBtYWdpYyB2YWx1ZXMgYW5kIHNwZWNpZmljCisgKiBjb3Byb2Nlc3NvcidzIGxheW91dHMgYXJlIHBhcnQgb2YgdGhlIHVzZXJzcGFjZSBBQkkuICBFYWNoIG9uZSBvZgorICogdGhlc2Ugc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgZWlnaHQgYnl0ZXMgYW5kIGFsaWduZWQgdG8gZWlnaHQKKyAqIGJ5dGVzLCB0byBwcmV2ZW50IHVucHJlZGljdGFibGUgcGFkZGluZyBpbiB0aGUgc2lnbmFsIGZyYW1lLgorICovCisKKyNpZmRlZiBDT05GSUdfSVdNTVhUCisvKiBpd21teHRfYXJlYSBpcyAweDk4IGJ5dGVzIGxvbmcsIHByZWNlZWRlZCBieSA4IGJ5dGVzIG9mIHNpZ25hdHVyZSAqLworI2RlZmluZSBJV01NWFRfTUFHSUMJCTB4MTJlZjg0MmEKKyNkZWZpbmUgSVdNTVhUX1NUT1JBR0VfU0laRQkoSVdNTVhUX1NJWkUgKyA4KQorCitzdHJ1Y3QgaXdtbXh0X3NpZ2ZyYW1lIHsKKwl1bnNpZ25lZCBsb25nCW1hZ2ljOworCXVuc2lnbmVkIGxvbmcJc2l6ZTsKKwlzdHJ1Y3QgaXdtbXh0X3N0cnVjdCBzdG9yYWdlOworfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg4KSkpOworI2VuZGlmIC8qIENPTkZJR19JV01NWFQgKi8KKworI2lmZGVmIENPTkZJR19WRlAKKyNpZiBfX0xJTlVYX0FSTV9BUkNIX18gPCA2CisvKiBGb3IgQVJNIHByZS12Niwgd2UgdXNlIGZzdG1pYXggYW5kIGZsZG1pYXguICBUaGlzIGFkZHMgb25lIGV4dHJhCisgKiB3b3JkIGFmdGVyIHRoZSByZWdpc3RlcnMsIGFuZCBhIHdvcmQgb2YgcGFkZGluZyBhdCB0aGUgZW5kIGZvcgorICogYWxpZ25tZW50LiAgKi8KKyNkZWZpbmUgVkZQX01BR0lDCQkweDU2NDY1MDAxCisjZGVmaW5lIFZGUF9TVE9SQUdFX1NJWkUJMTUyCisjZWxzZQorI2RlZmluZSBWRlBfTUFHSUMJCTB4NTY0NjUwMDIKKyNkZWZpbmUgVkZQX1NUT1JBR0VfU0laRQkxNDQKKyNlbmRpZgorCitzdHJ1Y3QgdmZwX3NpZ2ZyYW1lCit7CisJdW5zaWduZWQgbG9uZwkJbWFnaWM7CisJdW5zaWduZWQgbG9uZwkJc2l6ZTsKKwl1bmlvbiB2ZnBfc3RhdGUJCXN0b3JhZ2U7Cit9OworI2VuZGlmIC8qIENPTkZJR19WRlAgKi8KKworLyoKKyAqIEF1eGlsaWFyeSBzaWduYWwgZnJhbWUuICBUaGlzIHNhdmVzIHN0dWZmIGxpa2UgRlAgc3RhdGUuCisgKiBUaGUgbGF5b3V0IG9mIHRoaXMgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSB1c2VyIEFCSSwKKyAqIGJlY2F1c2UgdGhlIGNvbmZpZyBvcHRpb25zIGFyZW4ndC4gIHVjX3JlZ3NwYWNlIGlzIHJlYWxseQorICogb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3QgYXV4X3NpZ2ZyYW1lIHsKKyNpZmRlZiBDT05GSUdfSVdNTVhUCisJc3RydWN0IGl3bW14dF9zaWdmcmFtZQlpd21teHQ7CisjZW5kaWYKKyNpZiAwICYmIGRlZmluZWQgQ09ORklHX1ZGUCAvKiBOb3QgeWV0IHNhdmVkLiAgKi8KKwlzdHJ1Y3QgdmZwX3NpZ2ZyYW1lCXZmcDsKKyNlbmRpZgorCS8qIFNvbWV0aGluZyB0aGF0IGlzbid0IGEgdmFsaWQgbWFnaWMgbnVtYmVyIGZvciBhbnkgY29wcm9jZXNzb3IuICAqLworCXVuc2lnbmVkIGxvbmcJCWVuZF9tYWdpYzsKK30gX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oOCkpKTsKKworI2VuZGlmCisKICNlbmRpZiAvKiAhX0FTTUFSTV9VQ09OVEVYVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0vdmdhLmggYi9pbmNsdWRlL2FzbS1hcm0vdmdhLmgKaW5kZXggOTI2ZTVlZS4uMWUwYjkxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtL3ZnYS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybS92Z2EuaApAQCAtNCw3ICs0LDcgQEAKICNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBWR0FfTUFQX01FTSh4KQkoUENJTUVNX0JBU0UgKyAoeCkpCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykJKFBDSU1FTV9CQVNFICsgKHgpKQogCiAjZGVmaW5lIHZnYV9yZWFkYih4KQkoKigodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkJKCooKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKil5KSA9ICh4KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWFybTI2L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tYXJtMjYvZmxvcHB5LmgKaW5kZXggOWUwOTBhZC4uYTE4YWYwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXJtMjYvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tYXJtMjYvZmxvcHB5LmgKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2RlZmluZSBmZF9pbmIocG9ydCkJCWluYigocG9ydCkpCiAjZGVmaW5lIGZkX3JlcXVlc3RfaXJxKCkJcmVxdWVzdF9pcnEoSVJRX0ZMT1BQWURJU0ssZmxvcHB5X2ludGVycnVwdCxcCi0JCQkJCVNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLCJmbG9wcHkiLE5VTEwpCisJCQkJCVNBX0lOVEVSUlVQVCwiZmxvcHB5IixOVUxMKQogI2RlZmluZSBmZF9mcmVlX2lycSgpCQlmcmVlX2lycShJUlFfRkxPUFBZRElTSyxOVUxMKQogI2RlZmluZSBmZF9kaXNhYmxlX2lycSgpCWRpc2FibGVfaXJxKElSUV9GTE9QUFlESVNLKQogI2RlZmluZSBmZF9lbmFibGVfaXJxKCkJCWVuYWJsZV9pcnEoSVJRX0ZMT1BQWURJU0spCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1hcm0yNi9pcnEuaCBiL2luY2x1ZGUvYXNtLWFybTI2L2lycS5oCmluZGV4IDA2YmQ1YTUuLjlhYWFjODcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWFybTI2L2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWFybTI2L2lycS5oCkBAIC00NCw5ICs0NCw1IEBACiAKIGludCBzZXRfaXJxX3R5cGUodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHR5cGUpOwogCi1pbnQgc2V0dXBfaXJxKHVuc2lnbmVkIGludCwgc3RydWN0IGlycWFjdGlvbiAqKTsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oIGIvaW5jbHVkZS9hc20tZnJ2L2F0b21pYy5oCmluZGV4IDlhNGZmMDMuLjA2NjM4NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9hdG9taWMuaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvYXRvbWljLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogCQlicmVhazsJCQkJCQkJCVwKIAkJCQkJCQkJCQlcCiAJZGVmYXVsdDoJCQkJCQkJCVwKLQkJX194Z19vcmlnID0gMDsJCQkJCQkJXAorCQlfX3hnX29yaWcgPSAoX190eXBlb2ZfXyhfX3hnX29yaWcpKTA7CQkJCVwKIAkJYXNtIHZvbGF0aWxlKCJicmVhayIpOwkJCQkJCVwKIAkJYnJlYWs7CQkJCQkJCQlcCiAJfQkJCQkJCQkJCVwKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCXN3aXRjaCAoc2l6ZW9mKF9feGdfb3JpZykpIHsJCQkJCQkJCVwKIAljYXNlIDQ6IF9feGdfb3JpZyA9IChfX3R5cGVvZl9fKCoocHRyKSkpIF9feGNoZ18zMigodWludDMyX3QpIHgsIF9feGdfcHRyKTsJYnJlYWs7CVwKIAlkZWZhdWx0OgkJCQkJCQkJCQlcCi0JCV9feGdfb3JpZyA9IDA7CQkJCQkJCQkJXAorCQlfX3hnX29yaWcgPSAoX190eXBlb2ZfXyhfX3hnX29yaWcpKTA7CQkJCQkJCQkJXAogCQlhc20gdm9sYXRpbGUoImJyZWFrIik7CQkJCQkJCQlcCiAJCWJyZWFrOwkJCQkJCQkJCQlcCiAJfQkJCQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2NoZWNrc3VtLmggYi9pbmNsdWRlL2FzbS1mcnYvY2hlY2tzdW0uaAppbmRleCAxMDIzNmY2OC4uNDJiZjBkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2NoZWNrc3VtLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L2NoZWNrc3VtLmgKQEAgLTQzLDcgKzQzLDcgQEAKICAqIGhlcmUgZXZlbiBtb3JlIGltcG9ydGFudCB0byBhbGlnbiBzcmMgYW5kIGRzdCBvbiBhIDMyLWJpdCAob3IgZXZlbgogICogYmV0dGVyIDY0LWJpdCkgYm91bmRhcnkKICAqLwotZXh0ZXJuIHVuc2lnbmVkIGludCBjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsCitleHRlcm4gdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBjaGFyICpkc3QsCiAJCQkJCQlpbnQgbGVuLCBpbnQgc3VtLCBpbnQgKmNzdW1fZXJyKTsKIAogI2RlZmluZSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHNyYywgZHN0LCBsZW4sIHN1bSkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZnJ2L2hpZ2htZW0uaCBiL2luY2x1ZGUvYXNtLWZydi9oaWdobWVtLmgKaW5kZXggY2ZiZjdkMy4uZTIyNDdjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L2hpZ2htZW0uaAorKysgYi9pbmNsdWRlL2FzbS1mcnYvaGlnaG1lbS5oCkBAIC0xMzQsNyArMTM0LDcgQEAKIAogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIE5VTEw7CiAJfQogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvaW8uaCBiL2luY2x1ZGUvYXNtLWZydi9pby5oCmluZGV4IGI1NmViYTUuLjc3NjVmNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9pby5oCkBAIC00MCwxMyArNDAsMTMgQEAKIC8vI2RlZmluZSBfX2lvcm1iKCkgYXNtIHZvbGF0aWxlKCJtZW1iYXIiKQogLy8jZGVmaW5lIF9faW93bWIoKSBhc20gdm9sYXRpbGUoIm1lbWJhciIpCiAKLSNkZWZpbmUgX19yYXdfcmVhZGIoYWRkcikgX19idWlsdGluX3JlYWQ4KCh2b2lkICopIChhZGRyKSkKLSNkZWZpbmUgX19yYXdfcmVhZHcoYWRkcikgX19idWlsdGluX3JlYWQxNigodm9pZCAqKSAoYWRkcikpCi0jZGVmaW5lIF9fcmF3X3JlYWRsKGFkZHIpIF9fYnVpbHRpbl9yZWFkMzIoKHZvaWQgKikgKGFkZHIpKQorI2RlZmluZSBfX3Jhd19yZWFkYiBfX2J1aWx0aW5fcmVhZDgKKyNkZWZpbmUgX19yYXdfcmVhZHcgX19idWlsdGluX3JlYWQxNgorI2RlZmluZSBfX3Jhd19yZWFkbCBfX2J1aWx0aW5fcmVhZDMyCiAKLSNkZWZpbmUgX19yYXdfd3JpdGViKGRhdHVtLCBhZGRyKSBfX2J1aWx0aW5fd3JpdGU4KCh2b2lkICopIChhZGRyKSwgZGF0dW0pCi0jZGVmaW5lIF9fcmF3X3dyaXRldyhkYXR1bSwgYWRkcikgX19idWlsdGluX3dyaXRlMTYoKHZvaWQgKikgKGFkZHIpLCBkYXR1bSkKLSNkZWZpbmUgX19yYXdfd3JpdGVsKGRhdHVtLCBhZGRyKSBfX2J1aWx0aW5fd3JpdGUzMigodm9pZCAqKSAoYWRkciksIGRhdHVtKQorI2RlZmluZSBfX3Jhd193cml0ZWIoZGF0dW0sIGFkZHIpIF9fYnVpbHRpbl93cml0ZTgoYWRkciwgZGF0dW0pCisjZGVmaW5lIF9fcmF3X3dyaXRldyhkYXR1bSwgYWRkcikgX19idWlsdGluX3dyaXRlMTYoYWRkciwgZGF0dW0pCisjZGVmaW5lIF9fcmF3X3dyaXRlbChkYXR1bSwgYWRkcikgX19idWlsdGluX3dyaXRlMzIoYWRkciwgZGF0dW0pCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb19vdXRzYih1bnNpZ25lZCBpbnQgYWRkciwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQogewpAQCAtMTE2LDcgKzExNiw3IEBACiAJbWVtc2V0KCh2b2lkIF9fZm9yY2UgKikgYWRkciwgdmFsLCBjb3VudCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRzdCwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsIGludCBjb3VudCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1jcHlfZnJvbWlvKHZvaWQgKmRzdCwgY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICpzcmMsIGludCBjb3VudCkKIHsKIAltZW1jcHkoZHN0LCAodm9pZCBfX2ZvcmNlICopIHNyYywgY291bnQpOwogfQpAQCAtMTI4LDEyICsxMjgsMTIgQEAKIAogc3RhdGljIGlubGluZSB1aW50OF90IGluYih1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JcmV0dXJuIF9fYnVpbHRpbl9yZWFkOCgodm9pZCAqKWFkZHIpOworCXJldHVybiBfX2J1aWx0aW5fcmVhZDgoKHZvaWQgX19pb21lbSAqKWFkZHIpOwogfQogCiBzdGF0aWMgaW5saW5lIHVpbnQxNl90IGludyh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdWludDE2X3QgcmV0ID0gX19idWlsdGluX3JlYWQxNigodm9pZCAqKWFkZHIpOworCXVpbnQxNl90IHJldCA9IF9fYnVpbHRpbl9yZWFkMTYoKHZvaWQgX19pb21lbSAqKWFkZHIpOwogCiAJaWYgKF9faXNfUENJX0lPKGFkZHIpKQogCQlyZXQgPSBfc3dhcHcocmV0KTsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IGlubCh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JdWludDMyX3QgcmV0ID0gX19idWlsdGluX3JlYWQzMigodm9pZCAqKWFkZHIpOworCXVpbnQzMl90IHJldCA9IF9fYnVpbHRpbl9yZWFkMzIoKHZvaWQgX19pb21lbSAqKWFkZHIpOwogCiAJaWYgKF9faXNfUENJX0lPKGFkZHIpKQogCQlyZXQgPSBfc3dhcGwocmV0KTsKQEAgLTE1MywyMSArMTUzLDIxIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvdXRiKHVpbnQ4X3QgZGF0dW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlfX2J1aWx0aW5fd3JpdGU4KCh2b2lkICopYWRkciwgZGF0dW0pOworCV9fYnVpbHRpbl93cml0ZTgoKHZvaWQgX19pb21lbSAqKWFkZHIsIGRhdHVtKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIG91dHcodWludDE2X3QgZGF0dW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlpZiAoX19pc19QQ0lfSU8oYWRkcikpCiAJCWRhdHVtID0gX3N3YXB3KGRhdHVtKTsKLQlfX2J1aWx0aW5fd3JpdGUxNigodm9pZCAqKWFkZHIsIGRhdHVtKTsKKwlfX2J1aWx0aW5fd3JpdGUxNigodm9pZCBfX2lvbWVtICopYWRkciwgZGF0dW0pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgb3V0bCh1aW50MzJfdCBkYXR1bSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCWlmIChfX2lzX1BDSV9JTyhhZGRyKSkKIAkJZGF0dW0gPSBfc3dhcGwoZGF0dW0pOwotCV9fYnVpbHRpbl93cml0ZTMyKCh2b2lkICopYWRkciwgZGF0dW0pOworCV9fYnVpbHRpbl93cml0ZTMyKCh2b2lkIF9faW9tZW0gKilhZGRyLCBkYXR1bSk7CiB9CiAKICNkZWZpbmUgaW5iX3AoYWRkcikJaW5iKGFkZHIpCkBAIC0xODksMTIgKzE4OSwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgcmVhZGIoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCXJldHVybiBfX2J1aWx0aW5fcmVhZDgoKHZvbGF0aWxlIHVpbnQ4X3QgX19mb3JjZSAqKSBhZGRyKTsKKwlyZXR1cm4gX19idWlsdGluX3JlYWQ4KChfX2ZvcmNlIHZvaWQgdm9sYXRpbGUgX19pb21lbSAqKSBhZGRyKTsKIH0KIAogc3RhdGljIGlubGluZSB1aW50MTZfdCByZWFkdyhjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpCiB7Ci0JdWludDE2X3QgcmV0ID0JX19idWlsdGluX3JlYWQxNigodm9sYXRpbGUgdWludDE2X3QgX19mb3JjZSAqKWFkZHIpOworCXVpbnQxNl90IHJldCA9CV9fYnVpbHRpbl9yZWFkMTYoKF9fZm9yY2Ugdm9pZCB2b2xhdGlsZSBfX2lvbWVtICopYWRkcik7CiAKIAlpZiAoX19pc19QQ0lfTUVNKGFkZHIpKQogCQlyZXQgPSBfc3dhcHcocmV0KTsKQEAgLTIwMyw3ICsyMDMsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVpbnQzMl90IHJlYWRsKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKIHsKLQl1aW50MzJfdCByZXQgPQlfX2J1aWx0aW5fcmVhZDMyKCh2b2xhdGlsZSB1aW50MzJfdCBfX2ZvcmNlICopYWRkcik7CisJdWludDMyX3QgcmV0ID0JX19idWlsdGluX3JlYWQzMigoX19mb3JjZSB2b2lkIHZvbGF0aWxlIF9faW9tZW0gKilhZGRyKTsKIAogCWlmIChfX2lzX1BDSV9NRU0oYWRkcikpCiAJCXJldCA9IF9zd2FwbChyZXQpOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWIodWludDhfdCBkYXR1bSwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewotCV9fYnVpbHRpbl93cml0ZTgoKHZvbGF0aWxlIHVpbnQ4X3QgX19mb3JjZSAqKSBhZGRyLCBkYXR1bSk7CisJX19idWlsdGluX3dyaXRlOChhZGRyLCBkYXR1bSk7CiAJaWYgKF9faXNfUENJX01FTShhZGRyKSkKIAkJX19mbHVzaF9QQ0lfd3JpdGVzKCk7CiB9CkBAIC0yMjcsNyArMjI3LDcgQEAKIAlpZiAoX19pc19QQ0lfTUVNKGFkZHIpKQogCQlkYXR1bSA9IF9zd2FwdyhkYXR1bSk7CiAKLQlfX2J1aWx0aW5fd3JpdGUxNigodm9sYXRpbGUgdWludDE2X3QgX19mb3JjZSAqKSBhZGRyLCBkYXR1bSk7CisJX19idWlsdGluX3dyaXRlMTYoYWRkciwgZGF0dW0pOwogCWlmIChfX2lzX1BDSV9NRU0oYWRkcikpCiAJCV9fZmx1c2hfUENJX3dyaXRlcygpOwogfQpAQCAtMjM3LDcgKzIzNyw3IEBACiAJaWYgKF9faXNfUENJX01FTShhZGRyKSkKIAkJZGF0dW0gPSBfc3dhcGwoZGF0dW0pOwogCi0JX19idWlsdGluX3dyaXRlMzIoKHZvbGF0aWxlIHVpbnQzMl90IF9fZm9yY2UgKikgYWRkciwgZGF0dW0pOworCV9fYnVpbHRpbl93cml0ZTMyKGFkZHIsIGRhdHVtKTsKIAlpZiAoX19pc19QQ0lfTUVNKGFkZHIpKQogCQlfX2ZsdXNoX1BDSV93cml0ZXMoKTsKIH0KQEAgLTI3MSw3ICsyNzEsNyBAQAogCXJldHVybiBfX2lvcmVtYXAocGh5c2FkZHIsIHNpemUsIElPTUFQX0ZVTExfQ0FDSElORyk7CiB9CiAKLWV4dGVybiB2b2lkIGlvdW5tYXAodm9pZCBfX2lvbWVtICphZGRyKTsKK2V4dGVybiB2b2lkIGlvdW5tYXAodm9pZCB2b2xhdGlsZSBfX2lvbWVtICphZGRyKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9faW9tZW0gKmlvcG9ydF9tYXAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBpbnQgbnIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvbWItcmVncy5oIGIvaW5jbHVkZS9hc20tZnJ2L21iLXJlZ3MuaAppbmRleCA5M2ZhNzMyLi4yMTllNWY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvbWItcmVncy5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi9tYi1yZWdzLmgKQEAgLTE2LDYgKzE2LDE3IEBACiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL21lbS1sYXlvdXQuaD4KIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKy8qIGdjYyBidWlsdGlucywgYW5ub3RhdGVkICovCisKK3Vuc2lnbmVkIGxvbmcgX19idWlsdGluX3JlYWQ4KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKTsKK3Vuc2lnbmVkIGxvbmcgX19idWlsdGluX3JlYWQxNih2b2xhdGlsZSB2b2lkIF9faW9tZW0gKik7Cit1bnNpZ25lZCBsb25nIF9fYnVpbHRpbl9yZWFkMzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopOwordm9pZCBfX2J1aWx0aW5fd3JpdGU4KHZvbGF0aWxlIHZvaWQgX19pb21lbSAqLCB1bnNpZ25lZCBjaGFyKTsKK3ZvaWQgX19idWlsdGluX3dyaXRlMTYodm9sYXRpbGUgdm9pZCBfX2lvbWVtICosIHVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgX19idWlsdGluX3dyaXRlMzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICosIHVuc2lnbmVkIGxvbmcpOworI2VuZGlmCisKICNkZWZpbmUgX19yZWdpb25fSU8JS0VSTkVMX0lPX1NUQVJUCS8qIHRoZSByZWdpb24gZnJvbSAweGUwMDAwMDAwIHRvIDB4ZmZmZmZmZmYgaGFzIHN1aXRhYmxlCiAJCQkJCSAqIHByb3RlY3Rpb24gbGFpZCBvdmVyIHRoZSB0b3AgZm9yIHVzZSBpbiBtZW1vcnktbWFwcGVkCiAJCQkJCSAqIEkvTwpAQCAtNTksNyArNzAsNyBAQAogI2RlZmluZSBfX3JlZ2lvbl9QQ0lfTUVNCShfX3JlZ2lvbl9DUzIgKyAweDA4MDAwMDAwVUwpCiAjZGVmaW5lIF9fZmx1c2hfUENJX3dyaXRlcygpCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKLQlfX2J1aWx0aW5fd3JpdGU4KCh2b2xhdGlsZSB2b2lkICopIF9fcmVnaW9uX1BDSV9NRU0sIDApOwlcCisJX19idWlsdGluX3dyaXRlOCgodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIF9fcmVnaW9uX1BDSV9NRU0sIDApOwlcCiB9IHdoaWxlKDApCiAKICNkZWZpbmUgX19pc19QQ0lfSU8oYWRkcikgXApAQCAtODMsMTUgKzk0LDE1IEBACiAjZGVmaW5lIF9fc2V0X0xFRFMoWCkJCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlpZiAobWI5MzA5MF9tYjAwX2RldGVjdGVkKQkJCQkJXAotCQlfX2J1aWx0aW5fd3JpdGUzMigodm9pZCAqKSBfX2FkZHJfTEVEUygpLCB+KFgpKTsJXAorCQlfX2J1aWx0aW5fd3JpdGUzMigodm9pZCBfX2lvbWVtICopIF9fYWRkcl9MRURTKCksIH4oWCkpOwlcCiB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgX19zZXRfTEVEUyhYKQogI2VuZGlmCiAKICNkZWZpbmUgX19hZGRyX0xDRCgpCQkoX19yZWdpb25fQ1MyICsgMHgwMTIwMDAwOFVMKQotI2RlZmluZSBfX2dldF9MQ0QoQikJCV9fYnVpbHRpbl9yZWFkMzIoKHZvbGF0aWxlIHZvaWQgKikgKEIpKQotI2RlZmluZSBfX3NldF9MQ0QoQixYKQkJX19idWlsdGluX3dyaXRlMzIoKHZvbGF0aWxlIHZvaWQgKikgKEIpLCAoWCkpCisjZGVmaW5lIF9fZ2V0X0xDRChCKQkJX19idWlsdGluX3JlYWQzMigodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIChCKSkKKyNkZWZpbmUgX19zZXRfTENEKEIsWCkJCV9fYnVpbHRpbl93cml0ZTMyKCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikgKEIpLCAoWCkpCiAKICNkZWZpbmUgTENEX0QJCQkweDAwMDAwMGZmCQkvKiBMQ0QgZGF0YSBidXMgKi8KICNkZWZpbmUgTENEX1JXCQkJMHgwMDAwMDEwMAkJLyogTENEIFIvVyBzaWduYWwgKi8KQEAgLTE2MSwxMSArMTcyLDExIEBACiAjZGVmaW5lIF9fZ2V0X0NMS0lOKCkJCTY2MDAwMDAwVUwKIAogI2RlZmluZSBfX2FkZHJfTEVEUygpCQkoX19yZWdpb25fQ1MyICsgMHgwMDAwMDAyM1VMKQotI2RlZmluZSBfX3NldF9MRURTKFgpCQlfX2J1aWx0aW5fd3JpdGU4KCh2b2xhdGlsZSB2b2lkICopIF9fYWRkcl9MRURTKCksIChYKSkKKyNkZWZpbmUgX19zZXRfTEVEUyhYKQkJX19idWlsdGluX3dyaXRlOCgodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIF9fYWRkcl9MRURTKCksIChYKSkKIAogI2RlZmluZSBfX2FkZHJfRlBHQVRSKCkJCShfX3JlZ2lvbl9DUzIgKyAweDAwMDAwMDMwVUwpCi0jZGVmaW5lIF9fc2V0X0ZQR0FUUihYKQkJX19idWlsdGluX3dyaXRlMzIoKHZvbGF0aWxlIHZvaWQgKikgX19hZGRyX0ZQR0FUUigpLCAoWCkpCi0jZGVmaW5lIF9fZ2V0X0ZQR0FUUigpCQlfX2J1aWx0aW5fcmVhZDMyKCh2b2xhdGlsZSB2b2lkICopIF9fYWRkcl9GUEdBVFIoKSkKKyNkZWZpbmUgX19zZXRfRlBHQVRSKFgpCQlfX2J1aWx0aW5fd3JpdGUzMigodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIF9fYWRkcl9GUEdBVFIoKSwgKFgpKQorI2RlZmluZSBfX2dldF9GUEdBVFIoKQkJX19idWlsdGluX3JlYWQzMigodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopIF9fYWRkcl9GUEdBVFIoKSkKIAogI2RlZmluZSBNQjkzMDkzX0ZQR0FfRlBHQVRSX0FVRElPX0NMSwkweDAwMDAwMDAzCiAKQEAgLTE4MCw3ICsxOTEsNyBAQAogI2RlZmluZSBNQjkzMDkzX0ZQR0FfU1dSX1BVU0hTV01BU0sJKDB4MUY8PDI2KQogI2RlZmluZSBNQjkzMDkzX0ZQR0FfU1dSX1BVU0hTVzQJKDE8PDI5KQogCi0jZGVmaW5lIF9fYWRkcl9GUEdBX1NXUgkJKCh2b2xhdGlsZSB2b2lkICopKF9fcmVnaW9uX0NTMiArIDB4MjhVTCkpCisjZGVmaW5lIF9fYWRkcl9GUEdBX1NXUgkJKCh2b2xhdGlsZSB2b2lkIF9faW9tZW0gKikoX19yZWdpb25fQ1MyICsgMHgyOFVMKSkKICNkZWZpbmUgX19nZXRfRlBHQV9QVVNIU1cxXzUoKQkoX19idWlsdGluX3JlYWQzMihfX2FkZHJfRlBHQV9TV1IpICYgTUI5MzA5M19GUEdBX1NXUl9QVVNIU1dNQVNLKQogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi9zaWduYWwuaCBiL2luY2x1ZGUvYXNtLWZydi9zaWduYWwuaAppbmRleCA2NzM2Njg5Li5kY2MxYjM1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1mcnYvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3NpZ25hbC5oCkBAIC0xMTQsMTMgKzExNCwxMyBAQAogCV9fc2lnaGFuZGxlcl90IHNhX2hhbmRsZXI7CiAJb2xkX3NpZ3NldF90IHNhX21hc2s7CiAJdW5zaWduZWQgbG9uZyBzYV9mbGFnczsKLQl2b2lkICgqc2FfcmVzdG9yZXIpKHZvaWQpOworCV9fc2lncmVzdG9yZV90IHNhX3Jlc3RvcmVyOwogfTsKIAogc3RydWN0IHNpZ2FjdGlvbiB7CiAJX19zaWdoYW5kbGVyX3Qgc2FfaGFuZGxlcjsKIAl1bnNpZ25lZCBsb25nIHNhX2ZsYWdzOwotCXZvaWQgKCpzYV9yZXN0b3Jlcikodm9pZCk7CisJX19zaWdyZXN0b3JlX3Qgc2FfcmVzdG9yZXI7CiAJc2lnc2V0X3Qgc2FfbWFzazsJCS8qIG1hc2sgbGFzdCBmb3IgZXh0ZW5zaWJpbGl0eSAqLwogfTsKIApAQCAtMTQ2LDcgKzE0Niw3IEBACiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCiB0eXBlZGVmIHN0cnVjdCBzaWdhbHRzdGFjayB7Ci0Jdm9pZCAqc3Nfc3A7CisJdm9pZCBfX3VzZXIgKnNzX3NwOwogCWludCBzc19mbGFnczsKIAlzaXplX3Qgc3Nfc2l6ZTsKIH0gc3RhY2tfdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1mcnYvdWFjY2Vzcy5oCmluZGV4IGExZDE0MDQuLjNkOTBlMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWZydi91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20tZnJ2L3VhY2Nlc3MuaApAQCAtMjIsNyArMjIsNyBAQAogCiAjZGVmaW5lIEhBVkVfQVJDSF9VTk1BUFBFRF9BUkVBCS8qIHdlIGRlY2lkZSB3aGVyZSB0byBwdXQgbW1hcHMgKi8KIAotI2RlZmluZSBfX3B0cih4KSAoKHVuc2lnbmVkIGxvbmcgKikoeCkpCisjZGVmaW5lIF9fcHRyKHgpICgodW5zaWduZWQgbG9uZyBfX2ZvcmNlICopKHgpKQogCiAjZGVmaW5lIFZFUklGWV9SRUFECTAKICNkZWZpbmUgVkVSSUZZX1dSSVRFCTEKQEAgLTY0LDcgKzY0LDcgQEAKIAogI2RlZmluZSBfX3JhbmdlX29rKGFkZHIsc2l6ZSkgX19fcmFuZ2Vfb2soKHVuc2lnbmVkIGxvbmcpIChhZGRyKSwgKHVuc2lnbmVkIGxvbmcpIChzaXplKSkKIAotI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIChfX3JhbmdlX29rKChhZGRyKSwgKHNpemUpKSA9PSAwKQorI2RlZmluZSBhY2Nlc3Nfb2sodHlwZSxhZGRyLHNpemUpIChfX3JhbmdlX29rKCh2b2lkIF9fdXNlciAqKShhZGRyKSwgKHNpemUpKSA9PSAwKQogI2RlZmluZSBfX2FjY2Vzc19vayhhZGRyLHNpemUpIChfX3JhbmdlX29rKChhZGRyKSwgKHNpemUpKSA9PSAwKQogCiAvKgpAQCAtOTcsNiArOTcsNyBAQAogCWludCBfX3B1X2VyciA9IDA7CQkJCQkJXAogCQkJCQkJCQkJXAogCXR5cGVvZigqKHB0cikpIF9fcHVfdmFsID0gKHgpOwkJCQkJXAorCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQkJXAogCQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mICgqKHB0cikpKSB7CQkJCQlcCiAJY2FzZSAxOgkJCQkJCQkJXApAQCAtMTIwLDcgKzEyMSw3IEBACiAKICNkZWZpbmUgcHV0X3VzZXIoeCwgcHRyKQkJCVwKICh7CQkJCQkJXAotCXR5cGVvZigmKnB0cikgX3AgPSAocHRyKTsJCVwKKwl0eXBlb2YoKihwdHIpKSBfX3VzZXIgKl9wID0gKHB0cik7CVwKIAlpbnQgX2U7CQkJCQlcCiAJCQkJCQlcCiAJX2UgPSBfX3JhbmdlX29rKF9wLCBzaXplb2YoKl9wKSk7CVwKQEAgLTE3NSwzMyArMTc2LDQ0IEBACiAgKi8KICNkZWZpbmUgX19nZXRfdXNlcih4LCBwdHIpCQkJCQkJXAogKHsJCQkJCQkJCQlcCi0JdHlwZW9mKCoocHRyKSkgX19ndV92YWwgPSAwOwkJCQkJXAogCWludCBfX2d1X2VyciA9IDA7CQkJCQkJXAorCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQkJXAogCQkJCQkJCQkJXAogCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJCVwKLQljYXNlIDE6CQkJCQkJCQlcCi0JCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCAqKHU4KikmX19ndV92YWwsIHB0ciwgInViIiwgIj1yIik7IFwKKwljYXNlIDE6IHsJCQkJCQkJXAorCQl1bnNpZ25lZCBjaGFyIF9fZ3VfdmFsOwkJCQkJXAorCQlfX2dldF91c2VyX2FzbShfX2d1X2VyciwgX19ndV92YWwsIHB0ciwgInViIiwgIj1yIik7CVwKKwkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX19ndV92YWw7CVwKIAkJYnJlYWs7CQkJCQkJCVwKLQljYXNlIDI6CQkJCQkJCQlcCi0JCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCAqKHUxNiopJl9fZ3VfdmFsLCBwdHIsICJ1aCIsICI9ciIpOyBcCisJfQkJCQkJCQkJXAorCWNhc2UgMjogewkJCQkJCQlcCisJCXVuc2lnbmVkIHNob3J0IF9fZ3VfdmFsOwkJCQlcCisJCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCBfX2d1X3ZhbCwgcHRyLCAidWgiLCAiPXIiKTsJXAorCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX2d1X3ZhbDsJXAogCQlicmVhazsJCQkJCQkJXAotCWNhc2UgNDoJCQkJCQkJCVwKLQkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsICoodTMyKikmX19ndV92YWwsIHB0ciwgIiIsICI9ciIpOyBcCisJfQkJCQkJCQkJXAorCWNhc2UgNDogewkJCQkJCQlcCisJCXVuc2lnbmVkIGludCBfX2d1X3ZhbDsJCQkJCVwKKwkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIF9fZ3VfdmFsLCBwdHIsICIiLCAiPXIiKTsJXAorCQkoeCkgPSAqKF9fZm9yY2UgX190eXBlb2ZfXygqKHB0cikpICopICZfX2d1X3ZhbDsJXAogCQlicmVhazsJCQkJCQkJXAotCWNhc2UgODoJCQkJCQkJCVwKLQkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsICoodTY0KikmX19ndV92YWwsIHB0ciwgImQiLCAiPWUiKTsgXAorCX0JCQkJCQkJCVwKKwljYXNlIDg6IHsJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIGxvbmcgX19ndV92YWw7CQkJCVwKKwkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIF9fZ3VfdmFsLCBwdHIsICJkIiwgIj1lIik7CVwKKwkJKHgpID0gKihfX2ZvcmNlIF9fdHlwZW9mX18oKihwdHIpKSAqKSAmX19ndV92YWw7CVwKIAkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCiAJZGVmYXVsdDoJCQkJCQkJXAogCQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfYmFkKCk7CQkJCVwKIAkJYnJlYWs7CQkJCQkJCVwKIAl9CQkJCQkJCQlcCi0JKHgpID0gX19ndV92YWw7CQkJCQkJCVwKIAlfX2d1X2VycjsJCQkJCQkJXAogfSkKIAogI2RlZmluZSBnZXRfdXNlcih4LCBwdHIpCQkJXAogKHsJCQkJCQlcCi0JdHlwZW9mKCYqcHRyKSBfcCA9IChwdHIpOwkJXAorCWNvbnN0IHR5cGVvZigqKHB0cikpIF9fdXNlciAqX3AgPSAocHRyKTtcCiAJaW50IF9lOwkJCQkJXAogCQkJCQkJXAogCV9lID0gX19yYW5nZV9vayhfcCwgc2l6ZW9mKCpfcCkpOwlcCkBAIC0yNDgsMTkgKzI2MCwyMCBAQAogLyoKICAqCiAgKi8KKyNkZWZpbmUgX19fX2ZvcmNlKHgpIChfX2ZvcmNlIHZvaWQgKikodm9pZCBfX3VzZXIgKikoeCkKICNpZmRlZiBDT05GSUdfTU1VCiBleHRlcm4gbG9uZyBfX21lbXNldF91c2VyKHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCk7CiBleHRlcm4gbG9uZyBfX21lbWNweV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIAotI2RlZmluZSBjbGVhcl91c2VyKGRzdCxjb3VudCkJCQlfX21lbXNldF91c2VyKChkc3QpLCAoY291bnQpKQotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQlfX21lbWNweV91c2VyKCh0byksIChmcm9tKSwgKG4pKQotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJX19tZW1jcHlfdXNlcigodG8pLCAoZnJvbSksIChuKSkKKyNkZWZpbmUgY2xlYXJfdXNlcihkc3QsY291bnQpCQkJX19tZW1zZXRfdXNlcihfX19fZm9yY2UoZHN0KSwgKGNvdW50KSkKKyNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJX19tZW1jcHlfdXNlcigodG8pLCBfX19fZm9yY2UoZnJvbSksIChuKSkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCV9fbWVtY3B5X3VzZXIoX19fX2ZvcmNlKHRvKSwgKGZyb20pLCAobikpCiAKICNlbHNlCiAKLSNkZWZpbmUgY2xlYXJfdXNlcihkc3QsY291bnQpCQkJKG1lbXNldCgoZHN0KSwgMCwgKGNvdW50KSksIDApCi0jZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCShtZW1jcHkoKHRvKSwgKGZyb20pLCAobikpLCAwKQotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbikJKG1lbWNweSgodG8pLCAoZnJvbSksIChuKSksIDApCisjZGVmaW5lIGNsZWFyX3VzZXIoZHN0LGNvdW50KQkJCShtZW1zZXQoX19fX2ZvcmNlKGRzdCksIDAsIChjb3VudCkpLCAwKQorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHRvLCBmcm9tLCBuKQkobWVtY3B5KCh0byksIF9fX19mb3JjZShmcm9tKSwgKG4pKSwgMCkKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pCShtZW1jcHkoX19fX2ZvcmNlKHRvKSwgKGZyb20pLCAobikpLCAwKQogCiAjZW5kaWYKIApAQCAtMjc4LDcgKzI5MSw3IEBACiAgICAgICAgcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWModG8sIGZyb20sIG4pOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3N0YXRpYyBpbmxpbmUgbG9uZyBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAl1bnNpZ25lZCBsb25nIHJldCA9IG47CiAKQEAgLTI5MSwxNiArMzA0LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGlubGluZSBsb25nIGNvcHlfdG9fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQorc3RhdGljIGlubGluZSBsb25nIGNvcHlfdG9fdXNlcih2b2lkIF9fdXNlciAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKIHsKIAlyZXR1cm4gbGlrZWx5KF9fYWNjZXNzX29rKHRvLCBuKSkgPyBfX2NvcHlfdG9fdXNlcih0bywgZnJvbSwgbikgOiBuOwogfQogCi0jZGVmaW5lIGNvcHlfdG9fdXNlcl9yZXQodG8sZnJvbSxuLHJldHZhbCkJKHsgaWYgKGNvcHlfdG9fdXNlcih0byxmcm9tLG4pKSByZXR1cm4gcmV0dmFsOyB9KQotI2RlZmluZSBjb3B5X2Zyb21fdXNlcl9yZXQodG8sZnJvbSxuLHJldHZhbCkJKHsgaWYgKGNvcHlfZnJvbV91c2VyKHRvLGZyb20sbikpIHJldHVybiByZXR2YWw7IH0pCi0KLWV4dGVybiBsb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBsb25nIGNvdW50KTsKLWV4dGVybiBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyICpzcmMsIGxvbmcgY291bnQpOworZXh0ZXJuIGxvbmcgc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKK2V4dGVybiBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKIAogI2RlZmluZSBzdHJsZW5fdXNlcihzdHIpIHN0cm5sZW5fdXNlcihzdHIsIDMyNzY3KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1mcnYvdW5pc3RkLmgKaW5kZXggN2MyZTcxMi4uYjgwZGJkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZnJ2L3VuaXN0ZC5oCisrKyBiL2luY2x1ZGUvYXNtLWZydi91bmlzdGQuaApAQCAtMzA2LDcgKzMwNiw3IEBACiAjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CiAjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAogI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5Ci0jZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJMzAwCisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkzMDAKICNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCiAjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgogI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCkBAIC00NjAsMjQgKzQ2MCw3IEBACiAgKiBzb21lIG90aGVycyB0b28uCiAgKi8KICNkZWZpbmUgX19OUl9fZXhpdCBfX05SX2V4aXQKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwwKGludCxwYXVzZSkKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwwKGludCxzeW5jKQotc3RhdGljIGlubGluZSBfc3lzY2FsbDAocGlkX3Qsc2V0c2lkKQotc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LHdyaXRlLGludCxmZCxjb25zdCBjaGFyICosYnVmLG9mZl90LGNvdW50KQotc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LHJlYWQsaW50LGZkLGNoYXIgKixidWYsb2ZmX3QsY291bnQpCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhvZmZfdCxsc2VlayxpbnQsZmQsb2ZmX3Qsb2Zmc2V0LGludCxjb3VudCkKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwxKGludCxkdXAsaW50LGZkKQogc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LGV4ZWN2ZSxjb25zdCBjaGFyICosZmlsZSxjaGFyICoqLGFyZ3YsY2hhciAqKixlbnZwKQotc3RhdGljIGlubGluZSBfc3lzY2FsbDMoaW50LG9wZW4sY29uc3QgY2hhciAqLGZpbGUsaW50LGZsYWcsaW50LG1vZGUpCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMShpbnQsY2xvc2UsaW50LGZkKQotc3RhdGljIGlubGluZSBfc3lzY2FsbDEoaW50LF9leGl0LGludCxleGl0Y29kZSkKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwzKHBpZF90LHdhaXRwaWQscGlkX3QscGlkLGludCAqLHdhaXRfc3RhdCxpbnQsb3B0aW9ucykKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwxKGludCxkZWxldGVfbW9kdWxlLGNvbnN0IGNoYXIgKixuYW1lKQotCi1zdGF0aWMgaW5saW5lIHBpZF90IHdhaXQoaW50ICogd2FpdF9zdGF0KQotewotCXJldHVybiB3YWl0cGlkKC0xLHdhaXRfc3RhdCwwKTsKLX0KIAogI2VuZGlmIC8qIF9fS0VSTkVMX1NZU0NBTExTX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYnVnLmgKaW5kZXggMGNkOTcxMS4uODQ1Y2I2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9idWcuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oCkBAIC0zOCw0ICszOCwxNyBAQAogI2VuZGlmCiAjZW5kaWYKIAorI2RlZmluZSBXQVJOX09OX09OQ0UoY29uZGl0aW9uKQkJCQlcCisoewkJCQkJCQlcCisJc3RhdGljIGludCBfX3dhcm5fb25jZSA9IDE7CQkJXAorCWludCBfX3JldCA9IDA7CQkJCQlcCisJCQkJCQkJXAorCWlmICh1bmxpa2VseSgoY29uZGl0aW9uKSAmJiBfX3dhcm5fb25jZSkpIHsJXAorCQlfX3dhcm5fb25jZSA9IDA7CQkJXAorCQlXQVJOX09OKDEpOwkJCQlcCisJCV9fcmV0ID0gMTsJCQkJXAorCX0JCQkJCQlcCisJX19yZXQ7CQkJCQkJXAorfSkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9tZW1vcnlfbW9kZWwuaAppbmRleCAwY2ZiMDg2Li44MDc4Y2JkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvbWVtb3J5X21vZGVsLmgKQEAgLTIzLDI5ICsyMywyMyBAQAogCiAjZW5kaWYgLyogQ09ORklHX0RJU0NPTlRJR01FTSAqLwogCi0jaWZkZWYgQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFCi1zdHJ1Y3QgcGFnZTsKLS8qIHRoaXMgaXMgdXNlZnVsIHdoZW4gaW5saW5lZCBwZm5fdG9fcGFnZSBpcyB0b28gYmlnICovCi1leHRlcm4gc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKTsKLSNlbHNlCiAvKgogICogc3VwcG9ydHMgMyBtZW1vcnkgbW9kZWxzLgogICovCiAjaWYgZGVmaW5lZChDT05GSUdfRkxBVE1FTSkKIAotI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pCShtZW1fbWFwICsgKChwZm4pIC0gQVJDSF9QRk5fT0ZGU0VUKSkKLSNkZWZpbmUgcGFnZV90b19wZm4ocGFnZSkJKCh1bnNpZ25lZCBsb25nKSgocGFnZSkgLSBtZW1fbWFwKSArIFwKKyNkZWZpbmUgX19wZm5fdG9fcGFnZShwZm4pCShtZW1fbWFwICsgKChwZm4pIC0gQVJDSF9QRk5fT0ZGU0VUKSkKKyNkZWZpbmUgX19wYWdlX3RvX3BmbihwYWdlKQkoKHVuc2lnbmVkIGxvbmcpKChwYWdlKSAtIG1lbV9tYXApICsgXAogCQkJCSBBUkNIX1BGTl9PRkZTRVQpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19ESVNDT05USUdNRU0pCiAKLSNkZWZpbmUgcGZuX3RvX3BhZ2UocGZuKQkJCVwKKyNkZWZpbmUgX19wZm5fdG9fcGFnZShwZm4pCQkJXAogKHsJdW5zaWduZWQgbG9uZyBfX3BmbiA9IChwZm4pOwkJXAogCXVuc2lnbmVkIGxvbmcgX19uaWQgPSBhcmNoX3Bmbl90b19uaWQocGZuKTsgIFwKIAlOT0RFX0RBVEEoX19uaWQpLT5ub2RlX21lbV9tYXAgKyBhcmNoX2xvY2FsX3BhZ2Vfb2Zmc2V0KF9fcGZuLCBfX25pZCk7XAogfSkKIAotI2RlZmluZSBwYWdlX3RvX3BmbihwZykJCQkJCQkJXAorI2RlZmluZSBfX3BhZ2VfdG9fcGZuKHBnKQkJCQkJCVwKICh7CXN0cnVjdCBwYWdlICpfX3BnID0gKHBnKTsJCQkJCVwKIAlzdHJ1Y3QgcGdsaXN0X2RhdGEgKl9fcGdkYXQgPSBOT0RFX0RBVEEocGFnZV90b19uaWQoX19wZykpOwlcCiAJKHVuc2lnbmVkIGxvbmcpKF9fcGcgLSBfX3BnZGF0LT5ub2RlX21lbV9tYXApICsJCQlcCkBAIC01NywxOCArNTEsMjcgQEAKICAqIE5vdGU6IHNlY3Rpb24ncyBtZW1fbWFwIGlzIGVuY29yZGVkIHRvIHJlZmxlY3QgaXRzIHN0YXJ0X3Bmbi4KICAqIHNlY3Rpb25baV0uc2VjdGlvbl9tZW1fbWFwID09IG1lbV9tYXAncyBhZGRyZXNzIC0gc3RhcnRfcGZuOwogICovCi0jZGVmaW5lIHBhZ2VfdG9fcGZuKHBnKQkJCQkJXAorI2RlZmluZSBfX3BhZ2VfdG9fcGZuKHBnKQkJCQkJXAogKHsJc3RydWN0IHBhZ2UgKl9fcGcgPSAocGcpOwkJCQlcCiAJaW50IF9fc2VjID0gcGFnZV90b19zZWN0aW9uKF9fcGcpOwkJCVwKIAlfX3BnIC0gX19zZWN0aW9uX21lbV9tYXBfYWRkcihfX25yX3RvX3NlY3Rpb24oX19zZWMpKTsJXAogfSkKIAotI2RlZmluZSBwZm5fdG9fcGFnZShwZm4pCQkJCVwKKyNkZWZpbmUgX19wZm5fdG9fcGFnZShwZm4pCQkJCVwKICh7CXVuc2lnbmVkIGxvbmcgX19wZm4gPSAocGZuKTsJCQlcCiAJc3RydWN0IG1lbV9zZWN0aW9uICpfX3NlYyA9IF9fcGZuX3RvX3NlY3Rpb24oX19wZm4pOwlcCiAJX19zZWN0aW9uX21lbV9tYXBfYWRkcihfX3NlYykgKyBfX3BmbjsJCVwKIH0pCiAjZW5kaWYgLyogQ09ORklHX0ZMQVRNRU0vRElTQ09OVElHTUVNL1NQQVJTRU1FTSAqLworCisjaWZkZWYgQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFCitzdHJ1Y3QgcGFnZTsKKy8qIHRoaXMgaXMgdXNlZnVsIHdoZW4gaW5saW5lZCBwZm5fdG9fcGFnZSBpcyB0b28gYmlnICovCitleHRlcm4gc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKTsKKyNlbHNlCisjZGVmaW5lIHBhZ2VfdG9fcGZuIF9fcGFnZV90b19wZm4KKyNkZWZpbmUgcGZuX3RvX3BhZ2UgX19wZm5fdG9fcGFnZQogI2VuZGlmIC8qIENPTkZJR19PVVRfT0ZfTElORV9QRk5fVE9fUEFHRSAqLwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BlcmNwdS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZXJjcHUuaAppbmRleCBjMGNhZjQzLi5jNzQ1MjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BlcmNwdS5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGVyY3B1LmgKQEAgLTE0LDYgKzE0LDcgQEAKIC8qIHZhciBpcyBpbiBkaXNjYXJkZWQgcmVnaW9uOiBvZmZzZXQgdG8gcGFydGljdWxhciBjb3B5IHdlIHdhbnQgKi8KICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19wZXJfY3B1X29mZnNldFtjcHVdKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpIHBlcl9jcHUodmFyLCBzbXBfcHJvY2Vzc29yX2lkKCkpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgcGVyX2NwdSh2YXIsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwogI2RlZmluZSBwZXJjcHVfbW9kY29weShwY3B1ZHN0LCBzcmMsIHNpemUpCQkJXApAQCAtMzAsNiArMzEsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpKGNwdSksICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogCiAjZW5kaWYJLyogU01QICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcnRjLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3J0Yy5oCmluZGV4IGNlZjA4ZGIuLjQwODcwMzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcnRjLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9ydGMuaApAQCAtMTE0LDYgKzExNCw3IEBACiAvKiBTZXQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBpbiB0aGUgcmVhbCB0aW1lIGNsb2NrLiAqLwogc3RhdGljIGlubGluZSBpbnQgc2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqdGltZSkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGNoYXIgbW9uLCBkYXksIGhycywgbWluLCBzZWM7CiAJdW5zaWduZWQgY2hhciBzYXZlX2NvbnRyb2wsIHNhdmVfZnJlcV9zZWxlY3Q7CiAJdW5zaWduZWQgaW50IHlyczsKQEAgLTEzMSw3ICsxMzIsNyBAQAogCWlmICh5cnMgPiAyNTUpCS8qIFRoZXkgYXJlIHVuc2lnbmVkICovCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3Bpbl9sb2NrX2lycSgmcnRjX2xvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZydGNfbG9jaywgZmxhZ3MpOwogI2lmZGVmIENPTkZJR19NQUNIX0RFQ1NUQVRJT04KIAlyZWFsX3lycyA9IHlyczsKIAlsZWFwX3lyID0gKCghKCh5cnMgKyAxOTAwKSAlIDQpICYmICgoeXJzICsgMTkwMCkgJSAxMDApKSB8fApAQCAtMTUyLDcgKzE1Myw3IEBACiAJICogd2hldGhlciB0aGUgY2hpcCBpcyBpbiBiaW5hcnkgbW9kZSBvciBub3QuCiAJICovCiAJaWYgKHlycyA+IDE2OSkgewotCQlzcGluX3VubG9ja19pcnEoJnJ0Y19sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRjX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xODcsNyArMTg4LDcgQEAKIAlDTU9TX1dSSVRFKHNhdmVfY29udHJvbCwgUlRDX0NPTlRST0wpOwogCUNNT1NfV1JJVEUoc2F2ZV9mcmVxX3NlbGVjdCwgUlRDX0ZSRVFfU0VMRUNUKTsKIAotCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWg4MzAwL2lycS5oIGIvaW5jbHVkZS9hc20taDgzMDAvaXJxLmgKaW5kZXggNzMwNjVmNS4uNDJhM2FjNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taDgzMDAvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20taDgzMDAvaXJxLmgKQEAgLTYzLDggKzYzLDQgQEAKIGV4dGVybiB2b2lkIGRpc2FibGVfaXJxKHVuc2lnbmVkIGludCk7CiAjZGVmaW5lIGRpc2FibGVfaXJxX25vc3luYyh4KQlkaXNhYmxlX2lycSh4KQogCi1zdHJ1Y3QgaXJxYWN0aW9uOwotc3RydWN0IHB0X3JlZ3M7Ci1pbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCBpcnFhY3Rpb24gKik7Ci0KICNlbmRpZiAvKiBfSDgzMDBfSVJRX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FsdGVybmF0aXZlLmgKaW5kZXggZTIwMWRlYy4uZDc5ZTllZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9hbHRlcm5hdGl2ZS5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYWx0ZXJuYXRpdmUuaApAQCAtMyw2ICszLDggQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCiBzdHJ1Y3QgYWx0X2luc3RyIHsKIAl1OCAqaW5zdHI7IAkJLyogb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KIAl1OCAqcmVwbGFjZW1lbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCmluZGV4IGNjOWI5NDAuLjFkODM2MmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCkBAIC0xMzgsOCArMTM4LDYgQEAKIAogZXh0ZXJuIGludCB0aW1lcl9vdmVyXzgyNTQ7CiAKLWV4dGVybiBpbnQgbW9kZXJuX2FwaWModm9pZCk7Ci0KICNlbHNlIC8qICFDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBsYXBpY19zaHV0ZG93bih2b2lkKSB7IH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAppbmRleCA1ZTRhMzVhLi45ZjY5OTUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FwaWNkZWYuaApAQCAtMTIxLDcgKzEyMSw2IEBACiAgKi8KICNkZWZpbmUgdTMyIHVuc2lnbmVkIGludAogCi0jZGVmaW5lIGxhcGljICgodm9sYXRpbGUgc3RydWN0IGxvY2FsX2FwaWMgKilBUElDX0JBU0UpCiAKIHN0cnVjdCBsb2NhbF9hcGljIHsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9jcHVmZWF0dXJlLmggYi9pbmNsdWRlL2FzbS1pMzg2L2NwdWZlYXR1cmUuaAppbmRleCBiNDRiZmM2Li4zZWNlZGJhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2NwdWZlYXR1cmUuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2NwdWZlYXR1cmUuaApAQCAtODgsNiArODgsMTIgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNUT1JFX0VOCSg1KjMyKyAzKSAvKiBvbi1DUFUgUk5HIGVuYWJsZWQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWENSWVBUCSg1KjMyKyA2KSAvKiBvbi1DUFUgY3J5cHRvICh4Y3J5cHQgaW5zbikgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWENSWVBUX0VOCSg1KjMyKyA3KSAvKiBvbi1DUFUgY3J5cHRvIGVuYWJsZWQgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQUNFMgkoNSozMisgOCkgLyogQWR2YW5jZWQgQ3J5cHRvZ3JhcGh5IEVuZ2luZSB2MiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BQ0UyX0VOCSg1KjMyKyA5KSAvKiBBQ0UgdjIgZW5hYmxlZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QSEUJCSg1KjMyKyAxMCkgLyogUGFkTG9jayBIYXNoIEVuZ2luZSAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QSEVfRU4JKDUqMzIrIDExKSAvKiBQSEUgZW5hYmxlZCAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QTU0JCSg1KjMyKyAxMikgLyogUGFkTG9jayBNb250Z29tZXJ5IE11bHRpcGxpZXIgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfUE1NX0VOCSg1KjMyKyAxMykgLyogUE1NIGVuYWJsZWQgKi8KIAogLyogTW9yZSBleHRlbmRlZCBBTUQgZmxhZ3M6IENQVUlEIGxldmVsIDB4ODAwMDAwMDEsIGVjeCwgd29yZCA2ICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0xBSEZfTE0JKDYqMzIrIDApIC8qIExBSEYvU0FIRiBpbiBsb25nIG1vZGUgKi8KQEAgLTEyMSw2ICsxMjcsMTIgQEAKICNkZWZpbmUgY3B1X2hhc194c3RvcmVfZW5hYmxlZAlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWFNUT1JFX0VOKQogI2RlZmluZSBjcHVfaGFzX3hjcnlwdAkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hDUllQVCkKICNkZWZpbmUgY3B1X2hhc194Y3J5cHRfZW5hYmxlZAlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWENSWVBUX0VOKQorI2RlZmluZSBjcHVfaGFzX2FjZTIJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BQ0UyKQorI2RlZmluZSBjcHVfaGFzX2FjZTJfZW5hYmxlZAlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQUNFMl9FTikKKyNkZWZpbmUgY3B1X2hhc19waGUJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QSEUpCisjZGVmaW5lIGNwdV9oYXNfcGhlX2VuYWJsZWQJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BIRV9FTikKKyNkZWZpbmUgY3B1X2hhc19wbW0JCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9QTU0pCisjZGVmaW5lIGNwdV9oYXNfcG1tX2VuYWJsZWQJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1BNTV9FTikKIAogI2VuZGlmIC8qIF9fQVNNX0kzODZfQ1BVRkVBVFVSRV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1pMzg2L2Zsb3BweS5oCmluZGV4IDAzNDAzMDQuLjljYjI3OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9mbG9wcHkuaApAQCAtMTQ3LDkgKzE0Nyw4IEBACiAJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaGFyZGludCxTQV9JTlRFUlJVUFQsCiAJCQkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQotCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkJCSAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLAotCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwkKKwkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaF9wcmUuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaF9wcmUuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXBfYXJjaC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9zZXR1cF9hcmNoX3Bvc3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2hfcG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM0ODg4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L3NldHVwX2FyY2hfcG9zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqCi0gKiBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCAtIEhvb2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLgotICoKLSAqIERlc2NyaXB0aW9uOgotICoJVGhpcyBpcyBpbmNsdWRlZCBsYXRlIGluIGtlcm5lbC9zZXR1cC5jIHNvIHRoYXQgaXQgY2FuIG1ha2UKLSAqCXVzZSBvZiBhbGwgb2YgdGhlIHN0YXRpYyBmdW5jdGlvbnMuCi0gKiovCi0KLXN0YXRpYyBjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCi17Ci0JY2hhciAqd2hvOwotCi0KLQl3aG8gPSAiQklPUy1lODIwIjsKLQotCS8qCi0JICogVHJ5IHRvIGNvcHkgdGhlIEJJT1Mtc3VwcGxpZWQgRTgyMC1tYXAuCi0JICoKLQkgKiBPdGhlcndpc2UgZmFrZSBhIG1lbW9yeSBtYXA7IG9uZSBzZWN0aW9uIGZyb20gMGstPjY0MGssCi0JICogdGhlIG5leHQgc2VjdGlvbiBmcm9tIDFtYi0+YXBwcm9wcmlhdGVfbWVtX2sKLQkgKi8KLQlzYW5pdGl6ZV9lODIwX21hcChFODIwX01BUCwgJkU4MjBfTUFQX05SKTsKLQlpZiAoY29weV9lODIwX21hcChFODIwX01BUCwgRTgyMF9NQVBfTlIpIDwgMCkgewotCQl1bnNpZ25lZCBsb25nIG1lbV9zaXplOwotCi0JCS8qIGNvbXBhcmUgcmVzdWx0cyBmcm9tIG90aGVyIG1ldGhvZHMgYW5kIHRha2UgdGhlIGdyZWF0ZXIgKi8KLQkJaWYgKEFMVF9NRU1fSyA8IEVYVF9NRU1fSykgewotCQkJbWVtX3NpemUgPSBFWFRfTUVNX0s7Ci0JCQl3aG8gPSAiQklPUy04OCI7Ci0JCX0gZWxzZSB7Ci0JCQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKLQkJCXdobyA9ICJCSU9TLWU4MDEiOwotCQl9Ci0KLQkJZTgyMC5ucl9tYXAgPSAwOwotCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCBMT1dNRU1TSVpFKCksIEU4MjBfUkFNKTsKLQkJYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIDw8IDEwLCBFODIwX1JBTSk7Ci0gIAl9Ci0JcmV0dXJuIHdobzsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3ByZS5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL3NldHVwX2FyY2guaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZpc3dzL3NldHVwX2FyY2hfcHJlLmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3Bvc3QuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12aXN3cy9zZXR1cF9hcmNoX3Bvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RiZDg5NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdmlzd3Mvc2V0dXBfYXJjaF9wb3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKiBIb29rIGZvciBtYWNoaW5lIHNwZWNpZmljIG1lbW9yeSBzZXR1cC4KLSAqCi0gKiBUaGlzIGlzIGluY2x1ZGVkIGxhdGUgaW4ga2VybmVsL3NldHVwLmMgc28gdGhhdCBpdCBjYW4gbWFrZSB1c2Ugb2YgYWxsIG9mCi0gKiB0aGUgc3RhdGljIGZ1bmN0aW9ucy4gKi8KLQotI2RlZmluZSBNQiAoMTAyNCAqIDEwMjQpCi0KLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fcGh5czsKLXVuc2lnbmVkIGxvbmcgc2dpdndmYl9tZW1fc2l6ZTsKLQotbG9uZyBsb25nIG1lbV9zaXplIF9faW5pdGRhdGEgPSAwOwotCi1zdGF0aWMgY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKQotewotCWxvbmcgbG9uZyBnZnhfbWVtX3NpemUgPSA4ICogTUI7Ci0KLQltZW1fc2l6ZSA9IEFMVF9NRU1fSzsKLQotCWlmICghbWVtX3NpemUpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQm9vdGxvYWRlciBkaWRuJ3Qgc2V0IG1lbW9yeSBzaXplLCB1cGdyYWRlIGl0ICFcbiIpOwotCQltZW1fc2l6ZSA9IDEyOCAqIE1COwotCX0KLQotCS8qCi0JICogdGhpcyBoYXJkY29kZXMgdGhlIGdyYXBoaWNzIG1lbW9yeSB0byA4IE1CCi0JICogaXQgcmVhbGx5IHNob3VsZCBiZSBzaXplZCBkeW5hbWljYWxseSAob3IgYXQgbGVhc3QKLQkgKiBzZXQgYXMgYSBib290IHBhcmFtKQotCSAqLwotCWlmICghc2dpdndmYl9tZW1fc2l6ZSkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZWZhdWx0aW5nIHRvIDggTUIgZnJhbWVidWZmZXIgc2l6ZVxuIik7Ci0JCXNnaXZ3ZmJfbWVtX3NpemUgPSA4ICogTUI7Ci0JfQotCi0JLyoKLQkgKiBUcmltIHRvIG5lYXJlc3QgTUIKLQkgKi8KLQlzZ2l2d2ZiX21lbV9zaXplICY9IH4oKDEgPDwgMjApIC0gMSk7Ci0Jc2dpdndmYl9tZW1fcGh5cyA9IG1lbV9zaXplIC0gZ2Z4X21lbV9zaXplOwotCi0JYWRkX21lbW9yeV9yZWdpb24oMCwgTE9XTUVNU0laRSgpLCBFODIwX1JBTSk7Ci0JYWRkX21lbW9yeV9yZWdpb24oSElHSF9NRU1PUlksIG1lbV9zaXplIC0gc2dpdndmYl9tZW1fc2l6ZSAtIEhJR0hfTUVNT1JZLCBFODIwX1JBTSk7Ci0JYWRkX21lbW9yeV9yZWdpb24oc2dpdndmYl9tZW1fcGh5cywgc2dpdndmYl9tZW1fc2l6ZSwgRTgyMF9SRVNFUlZFRCk7Ci0KLQlyZXR1cm4gIlBST00iOwotCi0JLyogUmVtb3ZlIGdjYyB3YXJuaW5ncyAqLwotCSh2b2lkKSBzYW5pdGl6ZV9lODIwX21hcChOVUxMLCBOVUxMKTsKLQkodm9pZCkgY29weV9lODIwX21hcChOVUxMLCAwKTsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL3NldHVwX2FyY2hfcHJlLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaF9wcmUuaApyZW5hbWUgdG8gaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaC5oCmluZGV4IDQ4ZjdlNmYuLjg0ZDAxYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL3NldHVwX2FyY2hfcHJlLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaC5oCkBAIC0zLDcgKzMsNyBAQAogCiAvKiBIb29rIHRvIGNhbGwgQklPUyBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiAqLwogCi0vKiBmb3Igdm95YWdlciwgcGFzcyB0aGUgdm95YWdlciBCSU9TL1NVUyBpbmZvIGFyZWEgdG8gdGhlIGRldGVjdGlvbiAKKy8qIGZvciB2b3lhZ2VyLCBwYXNzIHRoZSB2b3lhZ2VyIEJJT1MvU1VTIGluZm8gYXJlYSB0byB0aGUgZGV0ZWN0aW9uCiAgKiByb3V0aW5lcyAqLwogCiAjZGVmaW5lIEFSQ0hfU0VUVVAJdm95YWdlcl9kZXRlY3QoVk9ZQUdFUl9CSU9TX0lORk8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvc2V0dXBfYXJjaF9wb3N0LmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoX3Bvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmNmMyYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9zZXR1cF9hcmNoX3Bvc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qIEhvb2sgZm9yIG1hY2hpbmUgc3BlY2lmaWMgbWVtb3J5IHNldHVwLgotICoKLSAqIFRoaXMgaXMgaW5jbHVkZWQgbGF0ZSBpbiBrZXJuZWwvc2V0dXAuYyBzbyB0aGF0IGl0IGNhbiBtYWtlIHVzZSBvZiBhbGwgb2YKLSAqIHRoZSBzdGF0aWMgZnVuY3Rpb25zLiAqLwotCi1zdGF0aWMgY2hhciAqIF9faW5pdCBtYWNoaW5lX3NwZWNpZmljX21lbW9yeV9zZXR1cCh2b2lkKQotewotCWNoYXIgKndobzsKLQotCXdobyA9ICJOT1QgVk9ZQUdFUiI7Ci0KLQlpZih2b3lhZ2VyX2xldmVsID09IDUpIHsKLQkJX191MzIgYWRkciwgbGVuZ3RoOwotCQlpbnQgaTsKLQotCQl3aG8gPSAiVm95YWdlci1TVVMiOwotCi0JCWU4MjAubnJfbWFwID0gMDsKLQkJZm9yKGk9MDsgdm95YWdlcl9tZW1vcnlfZGV0ZWN0KGksICZhZGRyLCAmbGVuZ3RoKTsgaSsrKSB7Ci0JCQlhZGRfbWVtb3J5X3JlZ2lvbihhZGRyLCBsZW5ndGgsIEU4MjBfUkFNKTsKLQkJfQotCQlyZXR1cm4gd2hvOwotCX0gZWxzZSBpZih2b3lhZ2VyX2xldmVsID09IDQpIHsKLQkJX191MzIgdG9tOwotCQlfX3UxNiBjYXRiYXNlID0gaW5iKFZPWUFHRVJfU1NQQl9SRUxPQ0FUSU9OX1BPUlQpPDw4OwotCQkvKiBzZWxlY3QgdGhlIERJTk8gY29uZmlnIHNwYWNlICovCi0JCW91dGIoVk9ZQUdFUl9ESU5PLCBWT1lBR0VSX0NBVF9DT05GSUdfUE9SVCk7Ci0JCS8qIFJlYWQgRElOTyB0b3Agb2YgbWVtb3J5IHJlZ2lzdGVyICovCi0JCXRvbSA9ICgoaW5iKGNhdGJhc2UgKyAweDQpICYgMHhmMCkgPDwgMTYpCi0JCQkrICgoaW5iKGNhdGJhc2UgKyAweDUpICYgMHg3ZikgPDwgMjQpOwotCi0JCWlmKGluYihjYXRiYXNlKSAhPSBWT1lBR0VSX0RJTk8pIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiVm95YWdlcjogRmFpbGVkIHRvIGdldCBESU5PIGZvciBMNCwgc2V0dGluZyB0b20gdG8gRVhUX01FTV9LXG4iKTsKLQkJCXRvbSA9IChFWFRfTUVNX0spPDwxMDsKLQkJfQotCQl3aG8gPSAiVm95YWdlci1UT00iOwotCQlhZGRfbWVtb3J5X3JlZ2lvbigwLCAweDlmMDAwLCBFODIwX1JBTSk7Ci0JCS8qIG1hcCBmcm9tIDFNIHRvIHRvcCBvZiBtZW1vcnkgKi8KLQkJYWRkX21lbW9yeV9yZWdpb24oMSoxMDI0KjEwMjQsIHRvbSAtIDEqMTAyNCoxMDI0LCBFODIwX1JBTSk7Ci0JCS8qIEZJWE1FOiBTaG91bGQgY2hlY2sgdGhlIEFTSUNzIHRvIHNlZSBpZiBJIG5lZWQgdG8KLQkJICogdGFrZSBvdXQgdGhlIDhNIHdpbmRvdy4gIEp1c3QgZG8gaXQgYXQgdGhlIG1vbWVudAotCQkgKiAqLwotCQlhZGRfbWVtb3J5X3JlZ2lvbig4KjEwMjQqMTAyNCwgOCoxMDI0KjEwMjQsIEU4MjBfUkVTRVJWRUQpOwotCQlyZXR1cm4gd2hvOwotCX0KLQotCXdobyA9ICJCSU9TLWU4MjAiOwotCi0JLyoKLQkgKiBUcnkgdG8gY29weSB0aGUgQklPUy1zdXBwbGllZCBFODIwLW1hcC4KLQkgKgotCSAqIE90aGVyd2lzZSBmYWtlIGEgbWVtb3J5IG1hcDsgb25lIHNlY3Rpb24gZnJvbSAway0+NjQwaywKLQkgKiB0aGUgbmV4dCBzZWN0aW9uIGZyb20gMW1iLT5hcHByb3ByaWF0ZV9tZW1fawotCSAqLwotCXNhbml0aXplX2U4MjBfbWFwKEU4MjBfTUFQLCAmRTgyMF9NQVBfTlIpOwotCWlmIChjb3B5X2U4MjBfbWFwKEU4MjBfTUFQLCBFODIwX01BUF9OUikgPCAwKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbWVtX3NpemU7Ci0KLQkJLyogY29tcGFyZSByZXN1bHRzIGZyb20gb3RoZXIgbWV0aG9kcyBhbmQgdGFrZSB0aGUgZ3JlYXRlciAqLwotCQlpZiAoQUxUX01FTV9LIDwgRVhUX01FTV9LKSB7Ci0JCQltZW1fc2l6ZSA9IEVYVF9NRU1fSzsKLQkJCXdobyA9ICJCSU9TLTg4IjsKLQkJfSBlbHNlIHsKLQkJCW1lbV9zaXplID0gQUxUX01FTV9LOwotCQkJd2hvID0gIkJJT1MtZTgwMSI7Ci0JCX0KLQotCQllODIwLm5yX21hcCA9IDA7Ci0JCWFkZF9tZW1vcnlfcmVnaW9uKDAsIExPV01FTVNJWkUoKSwgRTgyMF9SQU0pOwotCQlhZGRfbWVtb3J5X3JlZ2lvbihISUdIX01FTU9SWSwgbWVtX3NpemUgPDwgMTAsIEU4MjBfUkFNKTsKLSAgCX0KLQlyZXR1cm4gd2hvOwotfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tY2UuaCBiL2luY2x1ZGUvYXNtLWkzODYvbWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NjMWE5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21jZS5oCkBAIC0wLDAgKzEsNSBAQAorI2lmZGVmIENPTkZJR19YODZfTUNFCitleHRlcm4gdm9pZCBtY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOworI2Vsc2UKKyNkZWZpbmUgbWNoZWNrX2luaXQoYykgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9tc2kuaCBiL2luY2x1ZGUvYXNtLWkzODYvbXNpLmgKaW5kZXggZjA0MWQ0NC4uYjExYzRiNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tc2kuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L21zaS5oCkBAIC05LDcgKzksMTUgQEAKICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPG1hY2hfYXBpYy5oPgogCi0jZGVmaW5lIExBU1RfREVWSUNFX1ZFQ1RPUgkJMjMyCisjZGVmaW5lIExBU1RfREVWSUNFX1ZFQ1RPUgkoRklSU1RfU1lTVEVNX1ZFQ1RPUiAtIDEpCiAjZGVmaW5lIE1TSV9UQVJHRVRfQ1BVX1NISUZUCTEyCiAKK2V4dGVybiBzdHJ1Y3QgbXNpX29wcyBtc2lfYXBpY19vcHM7CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zaV9hcmNoX2luaXQodm9pZCkKK3sKKwltc2lfcmVnaXN0ZXIoJm1zaV9hcGljX29wcyk7CisJcmV0dXJuIDA7Cit9CisKICNlbmRpZiAvKiBBU01fTVNJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXRyci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tdHJyLmgKaW5kZXggNWE0NmRlMC4uMDdmMDYzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9tdHJyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tdHJyLmgKQEAgLTc2LDYgKzc2LDggQEAKIGV4dGVybiBpbnQgbXRycl9kZWwgKGludCByZWcsIHVuc2lnbmVkIGxvbmcgYmFzZSwgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiBpbnQgbXRycl9kZWxfcGFnZSAoaW50IHJlZywgdW5zaWduZWQgbG9uZyBiYXNlLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgbXRycl9jZW50YXVyX3JlcG9ydF9tY3IoaW50IG1jciwgdTMyIGxvLCB1MzIgaGkpOworZXh0ZXJuIHZvaWQgbXRycl9hcF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgbXRycl9icF9pbml0KHZvaWQpOwogIyAgZWxzZQogc3RhdGljIF9faW5saW5lX18gaW50IG10cnJfYWRkICh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQl1bnNpZ25lZCBpbnQgdHlwZSwgY2hhciBpbmNyZW1lbnQpCkBAIC0xMDAsNiArMTAyLDggQEAKIAogc3RhdGljIF9faW5saW5lX18gdm9pZCBtdHJyX2NlbnRhdXJfcmVwb3J0X21jcihpbnQgbWNyLCB1MzIgbG8sIHUzMiBoaSkgezt9CiAKKyNkZWZpbmUgbXRycl9hcF9pbml0KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG10cnJfYnBfaW5pdCgpIGRvIHt9IHdoaWxlICgwKQogIyAgZW5kaWYKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20taTM4Ni9wcm9jZXNzb3IuaAppbmRleCA0ZGYzODE4Li4wYzgzY2YxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvcHJvY2Vzc29yLmgKQEAgLTcyOCwxOCArNzI4LDQgQEAKIGV4dGVybiB2b2lkIGVuYWJsZV9zZXBfY3B1KHZvaWQpOwogZXh0ZXJuIGludCBzeXNlbnRlcl9zZXR1cCh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19NVFJSCi1leHRlcm4gdm9pZCBtdHJyX2FwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBtdHJyX2JwX2luaXQodm9pZCk7Ci0jZWxzZQotI2RlZmluZSBtdHJyX2FwX2luaXQoKSBkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgbXRycl9icF9pbml0KCkgZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19YODZfTUNFCi1leHRlcm4gdm9pZCBtY2hlY2tfaW5pdChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwotI2Vsc2UKLSNkZWZpbmUgbWNoZWNrX2luaXQoYykgZG8ge30gd2hpbGUoMCkKLSNlbmRpZgotCiAjZW5kaWYgLyogX19BU01fSTM4Nl9QUk9DRVNTT1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9zZXR1cC5oIGIvaW5jbHVkZS9hc20taTM4Ni9zZXR1cC5oCmluZGV4IGVlOTQxNDUuLmY3MzdlNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvc2V0dXAuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3NldHVwLmgKQEAgLTU5LDYgKzU5LDIxIEBACiAjZGVmaW5lIEVERF9NQlJfU0lHTkFUVVJFICgodW5zaWduZWQgaW50ICopIChQQVJBTStFRERfTUJSX1NJR19CVUYpKQogI2RlZmluZSBFRERfQlVGICAgICAoKHN0cnVjdCBlZGRfaW5mbyAqKSAoUEFSQU0rRUREQlVGKSkKIAorLyoKKyAqIERvIE5PVCBFVkVSIGxvb2sgYXQgdGhlIEJJT1MgbWVtb3J5IHNpemUgbG9jYXRpb24uCisgKiBJdCBkb2VzIG5vdCB3b3JrIG9uIG1hbnkgbWFjaGluZXMuCisgKi8KKyNkZWZpbmUgTE9XTUVNU0laRSgpCSgweDlmMDAwKQorCitzdHJ1Y3QgZTgyMGVudHJ5OworCitjaGFyICogX19pbml0IG1hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpOworCitpbnQgX19pbml0IGNvcHlfZTgyMF9tYXAoc3RydWN0IGU4MjBlbnRyeSAqIGJpb3NtYXAsIGludCBucl9tYXApOworaW50IF9faW5pdCBzYW5pdGl6ZV9lODIwX21hcChzdHJ1Y3QgZTgyMGVudHJ5ICogYmlvc21hcCwgY2hhciAqIHBucl9tYXApOwordm9pZCBfX2luaXQgYWRkX21lbW9yeV9yZWdpb24odW5zaWduZWQgbG9uZyBsb25nIHN0YXJ0LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHNpemUsIGludCB0eXBlKTsKKwogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYgLyogX2kzODZfU0VUVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAppbmRleCAxZWM2NTUyLi41NGQ5MDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3VhY2Nlc3MuaApAQCAtNTgsNyArNTgsNyBAQAogCV9fY2hrX3VzZXJfcHRyKGFkZHIpOyBcCiAJYXNtKCJhZGRsICUzLCUxIDsgc2JibCAlMCwlMDsgY21wbCAlMSwlNDsgc2JibCAkMCwlMCIgXAogCQk6Ij0mciIgKGZsYWcpLCAiPXIiIChzdW0pIFwKLQkJOiIxIiAoYWRkciksImciICgoaW50KShzaXplKSksImciIChjdXJyZW50X3RocmVhZF9pbmZvKCktPmFkZHJfbGltaXQuc2VnKSk7IFwKKwkJOiIxIiAoYWRkciksImciICgoaW50KShzaXplKSksInJtIiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0LnNlZykpOyBcCiAJZmxhZzsgfSkKIAogLyoqCkBAIC0zOTAsNiArMzkwLDEyIEBACiAJCQkJY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKIHVuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV9mcm9tX3VzZXJfbGwodm9pZCAqdG8sCiAJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBfX2NvcHlfZnJvbV91c2VyX2xsX25vemVybyh2b2lkICp0bywKKwkJCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV9mcm9tX3VzZXJfbGxfbm9jYWNoZSh2b2lkICp0bywKKwkJCQljb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKTsKK3Vuc2lnbmVkIGxvbmcgX19tdXN0X2NoZWNrIF9fY29weV9mcm9tX3VzZXJfbGxfbm9jYWNoZV9ub3plcm8odm9pZCAqdG8sCisJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiAKIC8qCiAgKiBIZXJlIHdlIHNwZWNpYWwtY2FzZSAxLCAyIGFuZCA0LWJ5dGUgY29weV8qX3VzZXIgaW52b2NhdGlvbnMuICBPbiBhIGZhdWx0CkBAIC00NTYsMTAgKzQ2Miw0MSBAQAogICoKICAqIElmIHNvbWUgZGF0YSBjb3VsZCBub3QgYmUgY29waWVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcGFkIHRoZSBjb3BpZWQKICAqIGRhdGEgdG8gdGhlIHJlcXVlc3RlZCBzaXplIHVzaW5nIHplcm8gYnl0ZXMuCisgKgorICogQW4gYWx0ZXJuYXRlIHZlcnNpb24gLSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgLSBtYXkgYmUgY2FsbGVkIGZyb20KKyAqIGF0b21pYyBjb250ZXh0IGFuZCB3aWxsIGZhaWwgcmF0aGVyIHRoYW4gc2xlZXAuICBJbiB0aGlzIGNhc2UgdGhlCisgKiB1bmNvcGllZCBieXRlcyB3aWxsICpOT1QqIGJlIHBhZGRlZCB3aXRoIHplcm9zLiAgU2VlIGZzL2ZpbGVtYXAuaAorICogZm9yIGV4cGxhbmF0aW9uIG9mIHdoeSB0aGlzIGlzIG5lZWRlZC4KICAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogeworCS8qIEF2b2lkIHplcm9pbmcgdGhlIHRhaWwgaWYgdGhlIGNvcHkgZmFpbHMuLgorCSAqIElmICduJyBpcyBjb25zdGFudCBhbmQgMSwgMiwgb3IgNCwgd2UgZG8gc3RpbGwgemVybyBvbiBhIGZhaWx1cmUsCisJICogYnV0IGFzIHRoZSB6ZXJvaW5nIGJlaGF2aW91ciBpcyBvbmx5IHNpZ25pZmljYW50IHdoZW4gbiBpcyBub3QKKwkgKiBjb25zdGFudCwgdGhhdCBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLgorCSAqLworCWlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChuKSkgeworCQl1bnNpZ25lZCBsb25nIHJldDsKKworCQlzd2l0Y2ggKG4pIHsKKwkJY2FzZSAxOgorCQkJX19nZXRfdXNlcl9zaXplKCoodTggKil0bywgZnJvbSwgMSwgcmV0LCAxKTsKKwkJCXJldHVybiByZXQ7CisJCWNhc2UgMjoKKwkJCV9fZ2V0X3VzZXJfc2l6ZSgqKHUxNiAqKXRvLCBmcm9tLCAyLCByZXQsIDIpOworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSA0OgorCQkJX19nZXRfdXNlcl9zaXplKCoodTMyICopdG8sIGZyb20sIDQsIHJldCwgNCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiBfX2NvcHlfZnJvbV91c2VyX2xsX25vemVybyh0bywgZnJvbSwgbik7Cit9CitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKK19fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisJbWlnaHRfc2xlZXAoKTsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKIAkJdW5zaWduZWQgbG9uZyByZXQ7CiAKQEAgLTQ3OCwxMiArNTE1LDM2IEBACiAJcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfbGwodG8sIGZyb20sIG4pOwogfQogCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCisjZGVmaW5lIEFSQ0hfSEFTX05PQ0FDSEVfVUFDQ0VTUworCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19jb3B5X2Zyb21fdXNlcl9ub2NhY2hlKHZvaWQgKnRvLAorCQkJCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCiB7Ci0gICAgICAgbWlnaHRfc2xlZXAoKTsKLSAgICAgICByZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbik7CisJbWlnaHRfc2xlZXAoKTsKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AobikpIHsKKwkJdW5zaWduZWQgbG9uZyByZXQ7CisKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgMToKKwkJCV9fZ2V0X3VzZXJfc2l6ZSgqKHU4ICopdG8sIGZyb20sIDEsIHJldCwgMSk7CisJCQlyZXR1cm4gcmV0OworCQljYXNlIDI6CisJCQlfX2dldF91c2VyX3NpemUoKih1MTYgKil0bywgZnJvbSwgMiwgcmV0LCAyKTsKKwkJCXJldHVybiByZXQ7CisJCWNhc2UgNDoKKwkJCV9fZ2V0X3VzZXJfc2l6ZSgqKHUzMiAqKXRvLCBmcm9tLCA0LCByZXQsIDQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9sbF9ub2NhY2hlKHRvLCBmcm9tLCBuKTsKIH0KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCitfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodm9pZCAqdG8sIGNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCit7CisgICAgICAgcmV0dXJuIF9fY29weV9mcm9tX3VzZXJfbGxfbm9jYWNoZV9ub3plcm8odG8sIGZyb20sIG4pOworfQorCiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBjb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLAogCQkJCWNvbnN0IHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7CiB1bnNpZ25lZCBsb25nIF9fbXVzdF9jaGVjayBjb3B5X2Zyb21fdXNlcih2b2lkICp0bywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pMzg2L3VuaXN0ZC5oCmluZGV4IGRlMmNjYzEuLmZjMWM4ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni91bmlzdGQuaApAQCAtMzIyLDEwICszMjIsMTEgQEAKICNkZWZpbmUgX19OUl9zeW5jX2ZpbGVfcmFuZ2UJMzE0CiAjZGVmaW5lIF9fTlJfdGVlCQkzMTUKICNkZWZpbmUgX19OUl92bXNwbGljZQkJMzE2CisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMzE3CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKLSNkZWZpbmUgTlJfc3lzY2FsbHMgMzE3CisjZGVmaW5lIE5SX3N5c2NhbGxzIDMxOAogCiAvKgogICogdXNlci12aXNpYmxlIGVycm9yIG51bWJlcnMgYXJlIGluIHRoZSByYW5nZSAtMSAtIC0xMjg6IHNlZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni92Z2EuaCBiL2luY2x1ZGUvYXNtLWkzODYvdmdhLmgKaW5kZXggZWYwYzBlNS4uMGVjZjY4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni92Z2EuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3ZnYS5oCkBAIC0xMiw3ICsxMiw3IEBACiAgKglhY2Nlc3MgdGhlIHZpZGVvcmFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IGJsYWNrIG1hZ2ljLgogICovCiAKLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCiAKICNkZWZpbmUgdmdhX3JlYWRiKHgpICgqKHgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkgKCooeSkgPSAoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oIGIvaW5jbHVkZS9hc20taWE2NC9od19pcnEuaAppbmRleCAwY2YxMTliLi5lYThiOGM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L2h3X2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaHdfaXJxLmgKQEAgLTQ3LDkgKzQ3LDE5IEBACiAjZGVmaW5lIElBNjRfQ01DX1ZFQ1RPUgkJCTB4MWYJLyogY29ycmVjdGVkIG1hY2hpbmUtY2hlY2sgaW50ZXJydXB0IHZlY3RvciAqLwogLyoKICAqIFZlY3RvcnMgMHgyMC0weDJmIGFyZSByZXNlcnZlZCBmb3IgbGVnYWN5IElTQSBJUlFzLgorICogVXNlIHZlY3RvcnMgMHgzMC0weGU3IGFzIHRoZSBkZWZhdWx0IGRldmljZSB2ZWN0b3IgcmFuZ2UgZm9yIGlhNjQuCisgKiBQbGF0Zm9ybXMgbWF5IGNob29zZSB0byByZWR1Y2UgdGhpcyByYW5nZSBpbiBwbGF0Zm9ybV9pcnFfc2V0dXAsIGJ1dCB0aGUKKyAqIHBsYXRmb3JtIHJhbmdlIG11c3QgZmFsbCB3aXRoaW4KKyAqCVtJQTY0X0RFRl9GSVJTVF9ERVZJQ0VfVkVDVE9SLi5JQTY0X0RFRl9MQVNUX0RFVklDRV9WRUNUT1JdCiAgKi8KLSNkZWZpbmUgSUE2NF9GSVJTVF9ERVZJQ0VfVkVDVE9SCTB4MzAKLSNkZWZpbmUgSUE2NF9MQVNUX0RFVklDRV9WRUNUT1IJCTB4ZTcKK2V4dGVybiBpbnQgaWE2NF9maXJzdF9kZXZpY2VfdmVjdG9yOworZXh0ZXJuIGludCBpYTY0X2xhc3RfZGV2aWNlX3ZlY3RvcjsKKworI2RlZmluZSBJQTY0X0RFRl9GSVJTVF9ERVZJQ0VfVkVDVE9SCTB4MzAKKyNkZWZpbmUgSUE2NF9ERUZfTEFTVF9ERVZJQ0VfVkVDVE9SCTB4ZTcKKyNkZWZpbmUgSUE2NF9GSVJTVF9ERVZJQ0VfVkVDVE9SCWlhNjRfZmlyc3RfZGV2aWNlX3ZlY3RvcgorI2RlZmluZSBJQTY0X0xBU1RfREVWSUNFX1ZFQ1RPUgkJaWE2NF9sYXN0X2RldmljZV92ZWN0b3IKKyNkZWZpbmUgSUE2NF9NQVhfREVWSUNFX1ZFQ1RPUlMJCShJQTY0X0RFRl9MQVNUX0RFVklDRV9WRUNUT1IgLSBJQTY0X0RFRl9GSVJTVF9ERVZJQ0VfVkVDVE9SICsgMSkKICNkZWZpbmUgSUE2NF9OVU1fREVWSUNFX1ZFQ1RPUlMJCShJQTY0X0xBU1RfREVWSUNFX1ZFQ1RPUiAtIElBNjRfRklSU1RfREVWSUNFX1ZFQ1RPUiArIDEpCiAKICNkZWZpbmUgSUE2NF9NQ0FfUkVOREVaX1ZFQ1RPUgkJMHhlOAkvKiBNQ0EgcmVuZGV6IGludGVycnVwdCAqLwpAQCAtODMsNiArOTMsNyBAQAogCiBleHRlcm4gaW50IGFzc2lnbl9pcnFfdmVjdG9yIChpbnQgaXJxKTsJLyogYWxsb2NhdGUgYSBmcmVlIHZlY3RvciAqLwogZXh0ZXJuIHZvaWQgZnJlZV9pcnFfdmVjdG9yIChpbnQgdmVjdG9yKTsKK2V4dGVybiBpbnQgcmVzZXJ2ZV9pcnFfdmVjdG9yIChpbnQgdmVjdG9yKTsKIGV4dGVybiB2b2lkIGlhNjRfc2VuZF9pcGkgKGludCBjcHUsIGludCB2ZWN0b3IsIGludCBkZWxpdmVyeV9tb2RlLCBpbnQgcmVkaXJlY3QpOwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfcGVyY3B1X2lycSAoaWE2NF92ZWN0b3IgdmVjLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L2lvLmggYi9pbmNsdWRlL2FzbS1pYTY0L2lvLmgKaW5kZXggYzJlMzc0Mi4uNzgxZWUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9pby5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvaW8uaApAQCAtODgsNiArODgsNyBAQAogfQogCiAjZGVmaW5lIEFSQ0hfSEFTX1ZBTElEX1BIWVNfQUREUl9SQU5HRQorZXh0ZXJuIHU2NCBrZXJuX21lbV9hdHRyaWJ1dGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIGludCB2YWxpZF9waHlzX2FkZHJfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGNvdW50KTsgLyogZWZpLmMgKi8KIGV4dGVybiBpbnQgdmFsaWRfbW1hcF9waHlzX2FkZHJfcmFuZ2UgKHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IGNvdW50KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjLmggYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaAppbmRleCAwZGY3MmExLi4xNWI1NDVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWMuaApAQCAtNzUsNiArNzUsNyBAQAogdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBpYTY0X212X3JlYWR3X3JlbGF4ZWRfdCAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICopOwogdHlwZWRlZiB1bnNpZ25lZCBpbnQgaWE2NF9tdl9yZWFkbF9yZWxheGVkX3QgKGNvbnN0IHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKTsKIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBpYTY0X212X3JlYWRxX3JlbGF4ZWRfdCAoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICopOwordHlwZWRlZiBpbnQgaWE2NF9tdl9tc2lfaW5pdF90ICh2b2lkKTsKIAogc3RhdGljIGlubGluZSB2b2lkCiBtYWNodmVjX25vb3AgKHZvaWQpCkBAIC0xNTMsNiArMTU0LDcgQEAKICMgIGRlZmluZSBwbGF0Zm9ybV9yZWFkbF9yZWxheGVkICAgICAgICBpYTY0X212LnJlYWRsX3JlbGF4ZWQKICMgIGRlZmluZSBwbGF0Zm9ybV9yZWFkcV9yZWxheGVkICAgICAgICBpYTY0X212LnJlYWRxX3JlbGF4ZWQKICMgIGRlZmluZSBwbGF0Zm9ybV9taWdyYXRlCQlpYTY0X212Lm1pZ3JhdGUKKyMgIGRlZmluZSBwbGF0Zm9ybV9tc2lfaW5pdAkJaWE2NF9tdi5tc2lfaW5pdAogIyBlbmRpZgogCiAvKiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKSBpcyByZXF1aXJlZCB0byBtYWtlIHNpemUgb2YgdGhlCkBAIC0yMDIsNiArMjA0LDcgQEAKIAlpYTY0X212X3JlYWRsX3JlbGF4ZWRfdCAqcmVhZGxfcmVsYXhlZDsKIAlpYTY0X212X3JlYWRxX3JlbGF4ZWRfdCAqcmVhZHFfcmVsYXhlZDsKIAlpYTY0X212X21pZ3JhdGVfdCAqbWlncmF0ZTsKKwlpYTY0X212X21zaV9pbml0X3QgKm1zaV9pbml0OwogfSBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXygxNikpKTsgLyogYWxpZ24gYXR0cmliPyBzZWUgYWJvdmUgY29tbWVudCAqLwogCiAjZGVmaW5lIE1BQ0hWRUNfSU5JVChuYW1lKQkJCVwKQEAgLTI0Nyw2ICsyNTAsNyBAQAogCXBsYXRmb3JtX3JlYWRsX3JlbGF4ZWQsCQkJXAogCXBsYXRmb3JtX3JlYWRxX3JlbGF4ZWQsCQkJXAogCXBsYXRmb3JtX21pZ3JhdGUsCQkJXAorCXBsYXRmb3JtX21zaV9pbml0LAkJCVwKIH0KIAogZXh0ZXJuIHN0cnVjdCBpYTY0X21hY2hpbmVfdmVjdG9yIGlhNjRfbXY7CkBAIC00MDAsNSArNDA0LDggQEAKICNpZm5kZWYgcGxhdGZvcm1fbWlncmF0ZQogIyBkZWZpbmUgcGxhdGZvcm1fbWlncmF0ZSBtYWNodmVjX25vb3BfdGFzawogI2VuZGlmCisjaWZuZGVmIHBsYXRmb3JtX21zaV9pbml0CisjIGRlZmluZSBwbGF0Zm9ybV9tc2lfaW5pdAkoKGlhNjRfbXZfbXNpX2luaXRfdCopTlVMTCkKKyNlbmRpZgogCiAjZW5kaWYgLyogX0FTTV9JQTY0X01BQ0hWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjX3NuMi5oIGIvaW5jbHVkZS9hc20taWE2NC9tYWNodmVjX3NuMi5oCmluZGV4IGRhMWQ0MzcuLmNmNzI0ZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvbWFjaHZlY19zbjIuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21hY2h2ZWNfc24yLmgKQEAgLTY3LDYgKzY3LDggQEAKIGV4dGVybiBpYTY0X212X2RtYV9tYXBwaW5nX2Vycm9yCXNuX2RtYV9tYXBwaW5nX2Vycm9yOwogZXh0ZXJuIGlhNjRfbXZfZG1hX3N1cHBvcnRlZAkJc25fZG1hX3N1cHBvcnRlZDsKIGV4dGVybiBpYTY0X212X21pZ3JhdGVfdAkJc25fbWlncmF0ZTsKK2V4dGVybiBpYTY0X212X21zaV9pbml0X3QJCXNuX21zaV9pbml0OworCiAKIC8qCiAgKiBUaGlzIHN0dWZmIGhhcyBkdWFsIHVzZSEKQEAgLTExNyw2ICsxMTksMTEgQEAKICNkZWZpbmUgcGxhdGZvcm1fZG1hX21hcHBpbmdfZXJyb3IJCXNuX2RtYV9tYXBwaW5nX2Vycm9yCiAjZGVmaW5lIHBsYXRmb3JtX2RtYV9zdXBwb3J0ZWQJCXNuX2RtYV9zdXBwb3J0ZWQKICNkZWZpbmUgcGxhdGZvcm1fbWlncmF0ZQkJc25fbWlncmF0ZQorI2lmZGVmIENPTkZJR19QQ0lfTVNJCisjZGVmaW5lIHBsYXRmb3JtX21zaV9pbml0CQlzbl9tc2lfaW5pdAorI2Vsc2UKKyNkZWZpbmUgcGxhdGZvcm1fbXNpX2luaXQJCSgoaWE2NF9tdl9tc2lfaW5pdF90KilOVUxMKQorI2VuZGlmCiAKICNpbmNsdWRlIDxhc20vc24vaW8uaD4KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tY2EuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbWNhLmgKaW5kZXggOWM1Mzg5Yi4uZWU5N2Y3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tY2EuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21jYS5oCkBAIC02OSwxNCArNjksMTYgQEAKICAqLwogCiBzdHJ1Y3QgaWE2NF9zYWxfb3Nfc3RhdGUgewotCS8qIFNBTCB0byBPUywgbXVzdCBiZSBhdCBvZmZzZXQgMCAqLworCisJLyogU0FMIHRvIE9TICovCiAJdTY0CQkJb3NfZ3A7CQkJLyogR1Agb2YgdGhlIG9zIHJlZ2lzdGVyZWQgd2l0aCB0aGUgU0FMLCBwaHlzaWNhbCAqLwogCXU2NAkJCXBhbF9wcm9jOwkJLyogUEFMX1BST0MgZW50cnkgcG9pbnQsIHBoeXNpY2FsICovCiAJdTY0CQkJc2FsX3Byb2M7CQkvKiBTQUxfUFJPQyBlbnRyeSBwb2ludCwgcGh5c2ljYWwgKi8KIAl1NjQJCQlydl9yYzsJCQkvKiBNQ0EgLSBSZW5kZXp2b3VzIHN0YXRlLCBJTklUIC0gcmVhc29uIGNvZGUgKi8KIAl1NjQJCQlwcm9jX3N0YXRlX3BhcmFtOwkvKiBmcm9tIFIxOCAqLwogCXU2NAkJCW1vbmFyY2g7CQkvKiAxIGZvciBhIG1vbmFyY2ggZXZlbnQsIDAgZm9yIGEgc2xhdmUgKi8KLQkvKiBjb21tb24sIG11c3QgZm9sbG93IFNBTCB0byBPUyAqLworCisJLyogY29tbW9uICovCiAJdTY0CQkJc2FsX3JhOwkJCS8qIFJldHVybiBhZGRyZXNzIGluIFNBTCwgcGh5c2ljYWwgKi8KIAl1NjQJCQlzYWxfZ3A7CQkJLyogR1Agb2YgdGhlIFNBTCAtIHBoeXNpY2FsICovCiAJcGFsX21pbl9zdGF0ZV9hcmVhX3QJKnBhbF9taW5fc3RhdGU7CQkvKiBmcm9tIFIxNy4gIHBoeXNpY2FsIGluIGFzbSwgdmlydHVhbCBpbiBDICovCkBAIC05OCw3ICsxMDAsOCBAQAogCXU2NAkJCWlpcGE7CiAJdTY0CQkJaWltOwogCXU2NAkJCWloYTsKLQkvKiBPUyB0byBTQUwsIG11c3QgZm9sbG93IGNvbW1vbiAqLworCisJLyogT1MgdG8gU0FMICovCiAJdTY0CQkJb3Nfc3RhdHVzOwkJLyogT1Mgc3RhdHVzIHRvIFNBTCwgZW51bSBiZWxvdyAqLwogCXU2NAkJCWNvbnRleHQ7CQkvKiAwIGlmIHJldHVybiB0byBzYW1lIGNvbnRleHQKIAkJCQkJCQkgICAxIGlmIHJldHVybiB0byBuZXcgY29udGV4dCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9tc2kuaCBiL2luY2x1ZGUvYXNtLWlhNjQvbXNpLmgKaW5kZXggOTc4OTBmNy4uYmI5MmIwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9tc2kuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L21zaS5oCkBAIC0xNCw0ICsxNCwxNiBAQAogI2RlZmluZSBhY2tfQVBJQ19pcnEJCWlhNjRfZW9pCiAjZGVmaW5lIE1TSV9UQVJHRVRfQ1BVX1NISUZUCTQKIAorZXh0ZXJuIHN0cnVjdCBtc2lfb3BzIG1zaV9hcGljX29wczsKKworc3RhdGljIGlubGluZSBpbnQgbXNpX2FyY2hfaW5pdCh2b2lkKQoreworCWlmIChwbGF0Zm9ybV9tc2lfaW5pdCkKKwkJcmV0dXJuIHBsYXRmb3JtX21zaV9pbml0KCk7CisKKwkvKiBkZWZhdWx0IG9wcyBmb3IgbW9zdCBpYTY0IHBsYXRmb3JtcyAqLworCW1zaV9yZWdpc3RlcigmbXNpX2FwaWNfb3BzKTsKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmIC8qIEFTTV9NU0lfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZXJjcHUuaCBiL2luY2x1ZGUvYXNtLWlhNjQvcGVyY3B1LmgKaW5kZXggYWUzNTdkNS4uMjRkODk4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BlcmNwdS5oCkBAIC00Miw2ICs0Miw3IEBACiAKICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkgICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fcGVyX2NwdV9vZmZzZXRbY3B1XSkpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX2lhNjRfcGVyX2NwdV92YXIobG9jYWxfcGVyX2NwdV9vZmZzZXQpKSkKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX2lhNjRfcGVyX2NwdV92YXIobG9jYWxfcGVyX2NwdV9vZmZzZXQpKSkKIAogZXh0ZXJuIHZvaWQgcGVyY3B1X21vZGNvcHkodm9pZCAqcGNwdWRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgc2V0dXBfcGVyX2NwdV9hcmVhcyAodm9pZCk7CkBAIC01MSw2ICs1Miw3IEBACiAKICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkJCQkoKigodm9pZCkoY3B1KSwgJnBlcl9jcHVfXyMjdmFyKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpCQkJcGVyX2NwdV9fIyN2YXIKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCiAjZGVmaW5lIHBlcl9jcHVfaW5pdCgpCQkJCShfX3BoeXNfcGVyX2NwdV9zdGFydCkKIAogI2VuZGlmCS8qIFNNUCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAppbmRleCBlYWFjMDhkLi4yMjg5ODFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L3BndGFibGUuaApAQCAtMzE2LDIyICszMTYsMjAgQEAKICNkZWZpbmUgcHRlX21raHVnZShwdGUpCQkoX19wdGUocHRlX3ZhbChwdGUpKSkKIAogLyoKLSAqIE1hY3JvIHRvIGEgcGFnZSBwcm90ZWN0aW9uIHZhbHVlIGFzICJ1bmNhY2hlYWJsZSIuICBOb3RlIHRoYXQgInByb3RlY3Rpb24iIGlzIHJlYWxseSBhCi0gKiBtaXNub21lciBoZXJlIGFzIHRoZSBwcm90ZWN0aW9uIHZhbHVlIGNvbnRhaW5zIHRoZSBtZW1vcnkgYXR0cmlidXRlIGJpdHMsIGRpcnR5IGJpdHMsCi0gKiBhbmQgdmFyaW91cyBvdGhlciBiaXRzIGFzIHdlbGwuCisgKiBNYWtlIHBhZ2UgcHJvdGVjdGlvbiB2YWx1ZXMgY2FjaGVhYmxlLCB1bmNhY2hlYWJsZSwgb3Igd3JpdGUtCisgKiBjb21iaW5pbmcuICBOb3RlIHRoYXQgInByb3RlY3Rpb24iIGlzIHJlYWxseSBhIG1pc25vbWVyIGhlcmUgYXMgdGhlCisgKiBwcm90ZWN0aW9uIHZhbHVlIGNvbnRhaW5zIHRoZSBtZW1vcnkgYXR0cmlidXRlIGJpdHMsIGRpcnR5IGJpdHMsIGFuZAorICogdmFyaW91cyBvdGhlciBiaXRzIGFzIHdlbGwuCiAgKi8KKyNkZWZpbmUgcGdwcm90X2NhY2hlYWJsZShwcm90KQkJX19wZ3Byb3QoKHBncHJvdF92YWwocHJvdCkgJiB+X1BBR0VfTUFfTUFTSykgfCBfUEFHRV9NQV9XQikKICNkZWZpbmUgcGdwcm90X25vbmNhY2hlZChwcm90KQkJX19wZ3Byb3QoKHBncHJvdF92YWwocHJvdCkgJiB+X1BBR0VfTUFfTUFTSykgfCBfUEFHRV9NQV9VQykKLQotLyoKLSAqIE1hY3JvIHRvIG1ha2UgbWFyayBhIHBhZ2UgcHJvdGVjdGlvbiB2YWx1ZSBhcyAid3JpdGUtY29tYmluaW5nIi4KLSAqIE5vdGUgdGhhdCAicHJvdGVjdGlvbiIgaXMgcmVhbGx5IGEgbWlzbm9tZXIgaGVyZSBhcyB0aGUgcHJvdGVjdGlvbgotICogdmFsdWUgY29udGFpbnMgdGhlIG1lbW9yeSBhdHRyaWJ1dGUgYml0cywgZGlydHkgYml0cywgYW5kIHZhcmlvdXMKLSAqIG90aGVyIGJpdHMgYXMgd2VsbC4gIEFjY2Vzc2VzIHRocm91Z2ggYSB3cml0ZS1jb21iaW5pbmcgdHJhbnNsYXRpb24KLSAqIHdvcmtzIGJ5cGFzc2VzIHRoZSBjYWNoZXMsIGJ1dCBkb2VzIGFsbG93IGZvciBjb25zZWN1dGl2ZSB3cml0ZXMgdG8KLSAqIGJlIGNvbWJpbmVkIGludG8gc2luZ2xlIChidXQgbGFyZ2VyKSB3cml0ZSB0cmFuc2FjdGlvbnMuCi0gKi8KICNkZWZpbmUgcGdwcm90X3dyaXRlY29tYmluZShwcm90KQlfX3BncHJvdCgocGdwcm90X3ZhbChwcm90KSAmIH5fUEFHRV9NQV9NQVNLKSB8IF9QQUdFX01BX1dDKQogCitzdHJ1Y3QgZmlsZTsKK2V4dGVybiBwZ3Byb3RfdCBwaHlzX21lbV9hY2Nlc3NfcHJvdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBwZm4sCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHBncHJvdF90IHZtYV9wcm90KTsKKyNkZWZpbmUgX19IQVZFX1BIWVNfTUVNX0FDQ0VTU19QUk9UCisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwogcGdkX2luZGV4ICh1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL2ludHIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCmluZGV4IDYwYTUxYTQuLjEyYjU0ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vaW50ci5oCkBAIC0xMCw2ICsxMCw3IEBACiAjZGVmaW5lIF9BU01fSUE2NF9TTl9JTlRSX0gKIAogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8YXNtL3NuL3R5cGVzLmg+CiAKICNkZWZpbmUgU0dJX1VBUlRfVkVDVE9SCQkweGU5CiAKQEAgLTQwLDYgKzQxLDcgQEAKIAlpbnQJCWlycV9jcHVpZDsJLyoga2VybmVsIGxvZ2ljYWwgY3B1aWQJICAgICAqLwogCWludAkJaXJxX2lycTsJLyogdGhlIElSUSBudW1iZXIgKi8KIAlpbnQJCWlycV9pbnRfYml0OwkvKiBCcmlkZ2UgaW50ZXJydXB0IHBpbiAqLworCQkJCQkvKiA8MCBtZWFucyBNU0kgKi8KIAl1NjQJaXJxX3h0YWxrYWRkcjsJLyogeHRhbGthZGRyIElSUSBpcyBzZW50IHRvICAqLwogCWludAkJaXJxX2JyaWRnZV90eXBlOy8qIHBjaWlvIGFzaWMgdHlwZSAocGNpaW8uaCkgKi8KIAl2b2lkCSAgICAgICAqaXJxX2JyaWRnZTsJLyogYnJpZGdlIGdlbmVyYXRpbmcgaXJxICAgICAqLwpAQCAtNTMsNiArNTUsMTIgQEAKIH07CiAKIGV4dGVybiB2b2lkIHNuX3NlbmRfSVBJX3BoeXMoaW50LCBsb25nLCBpbnQsIGludCk7CitleHRlcm4gdTY0IHNuX2ludHJfYWxsb2MobmFzaWRfdCwgaW50LAorCQkJICAgICAgc3RydWN0IHNuX2lycV9pbmZvICosCisJCQkgICAgICBpbnQsIG5hc2lkX3QsIGludCk7CitleHRlcm4gdm9pZCBzbl9pbnRyX2ZyZWUobmFzaWRfdCwgaW50LCBzdHJ1Y3Qgc25faXJxX2luZm8gKik7CitleHRlcm4gc3RydWN0IHNuX2lycV9pbmZvICpzbl9yZXRhcmdldF92ZWN0b3Ioc3RydWN0IHNuX2lycV9pbmZvICosIG5hc2lkX3QsIGludCk7CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCAqKnNuX2lycV9saDsKIAogI2RlZmluZSBDUFVfVkVDVE9SX1RPX0lSUShjcHVpZCx2ZWN0b3IpICh2ZWN0b3IpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnJfcHJvdmlkZXIuaAppbmRleCA1MTI2MGFiLi5lM2IwYzNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJyX3Byb3ZpZGVyLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9wY2licl9wcm92aWRlci5oCkBAIC01NSw2ICs1NSw3IEBACiAjZGVmaW5lIFBDSTMyX0FURV9WICAgICAgICAgICAgICAgICAgICAgKDB4MSA8PCAwKQogI2RlZmluZSBQQ0kzMl9BVEVfQ08gICAgICAgICAgICAgICAgICAgICgweDEgPDwgMSkKICNkZWZpbmUgUENJMzJfQVRFX1BSRUMgICAgICAgICAgICAgICAgICAoMHgxIDw8IDIpCisjZGVmaW5lIFBDSTMyX0FURV9NU0kgICAgICAgICAgICAgICAgICAgKDB4MSA8PCAyKQogI2RlZmluZSBQQ0kzMl9BVEVfUFJFRiAgICAgICAgICAgICAgICAgICgweDEgPDwgMykKICNkZWZpbmUgUENJMzJfQVRFX0JBUiAgICAgICAgICAgICAgICAgICAoMHgxIDw8IDQpCiAjZGVmaW5lIFBDSTMyX0FURV9BRERSX1NIRlQgICAgICAgICAgICAgMTIKQEAgLTExNyw4ICsxMTgsOCBAQAogCiBleHRlcm4gaW50ICBwY2licl9pbml0X3Byb3ZpZGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgKnBjaWJyX2J1c19maXh1cChzdHJ1Y3QgcGNpYnVzX2J1c3NvZnQgKiwgc3RydWN0IHBjaV9jb250cm9sbGVyICopOwotZXh0ZXJuIGRtYV9hZGRyX3QgcGNpYnJfZG1hX21hcChzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOwotZXh0ZXJuIGRtYV9hZGRyX3QgcGNpYnJfZG1hX21hcF9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCk7CitleHRlcm4gZG1hX2FkZHJfdCBwY2licl9kbWFfbWFwKHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50IHR5cGUpOworZXh0ZXJuIGRtYV9hZGRyX3QgcGNpYnJfZG1hX21hcF9jb25zaXN0ZW50KHN0cnVjdCBwY2lfZGV2ICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50IHR5cGUpOwogZXh0ZXJuIHZvaWQgcGNpYnJfZG1hX3VubWFwKHN0cnVjdCBwY2lfZGV2ICosIGRtYV9hZGRyX3QsIGludCk7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3BjaWJ1c19wcm92aWRlcl9kZWZzLmgKaW5kZXggY2UzZjZjMy4uOGY3YzgzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taWE2NC9zbi9wY2lidXNfcHJvdmlkZXJfZGVmcy5oCisrKyBiL2luY2x1ZGUvYXNtLWlhNjQvc24vcGNpYnVzX3Byb3ZpZGVyX2RlZnMuaApAQCAtMyw3ICszLDcgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IChDKSAxOTkyIC0gMTk5NywgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMTk5MiAtIDE5OTcsIDIwMDAtMjAwNSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKi8KICNpZm5kZWYgX0FTTV9JQTY0X1NOX1BDSV9QQ0lCVVNfUFJPVklERVJfSAogI2RlZmluZSBfQVNNX0lBNjRfU05fUENJX1BDSUJVU19QUk9WSURFUl9ICkBAIC00NSwxMyArNDUsMjQgQEAKICAqLwogCiBzdHJ1Y3Qgc25fcGNpYnVzX3Byb3ZpZGVyIHsKLQlkbWFfYWRkcl90CSgqZG1hX21hcCkoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKLQlkbWFfYWRkcl90CSgqZG1hX21hcF9jb25zaXN0ZW50KShzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOworCWRtYV9hZGRyX3QJKCpkbWFfbWFwKShzdHJ1Y3QgcGNpX2RldiAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QsIGludCBmbGFncyk7CisJZG1hX2FkZHJfdAkoKmRtYV9tYXBfY29uc2lzdGVudCkoc3RydWN0IHBjaV9kZXYgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90LCBpbnQgZmxhZ3MpOwogCXZvaWQJCSgqZG1hX3VubWFwKShzdHJ1Y3QgcGNpX2RldiAqLCBkbWFfYWRkcl90LCBpbnQpOwogCXZvaWQgKgkJKCpidXNfZml4dXApKHN0cnVjdCBwY2lidXNfYnVzc29mdCAqLCBzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKik7CiAgCXZvaWQJCSgqZm9yY2VfaW50ZXJydXB0KShzdHJ1Y3Qgc25faXJxX2luZm8gKik7CiAgCXZvaWQJCSgqdGFyZ2V0X2ludGVycnVwdCkoc3RydWN0IHNuX2lycV9pbmZvICopOwogfTsKIAorLyoKKyAqIEZsYWdzIHVzZWQgYnkgdGhlIG1hcCBpbnRlcmZhY2VzCisgKiBiaXRzIDM6MCBzcGVjaWZpZXMgZm9ybWF0IG9mIHBhc3NlZCBpbiBhZGRyZXNzCisgKiBiaXQgIDQgICBzcGVjaWZpZXMgdGhhdCBhZGRyZXNzIGlzIHRvIGJlIHVzZWQgZm9yIE1TSQorICovCisKKyNkZWZpbmUgU05fRE1BX0FERFJUWVBFKHgpCSgoeCkgJiAweGYpCisjZGVmaW5lICAgICBTTl9ETUFfQUREUl9QSFlTCTEJLyogYWRkcmVzcyBpcyBhbiB4aW8gYWRkcmVzcy4gKi8KKyNkZWZpbmUgICAgIFNOX0RNQV9BRERSX1hJTwkyCS8qIGFkZHJlc3MgaXMgcGh5cyBtZW1vcnkgKi8KKyNkZWZpbmUgU05fRE1BX01TSQkJMHgxMAkvKiBCdXMgYWRkcmVzcyBpcyB0byBiZSB1c2VkIGZvciBNU0kgKi8KKwogZXh0ZXJuIHN0cnVjdCBzbl9wY2lidXNfcHJvdmlkZXIgKnNuX3BjaV9wcm92aWRlcltdOwogI2VuZGlmCQkJCS8qIF9BU01fSUE2NF9TTl9QQ0lfUENJQlVTX1BST1ZJREVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmggYi9pbmNsdWRlL2FzbS1pYTY0L3NuL3NuX3NhbC5oCmluZGV4IDhjODY1ZTQuLmNkNDkwYjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvc24vc25fc2FsLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi9zbl9zYWwuaApAQCAtMzQ1LDcgKzM0NSw3IEBACiAJcmV0X3N0dWZmLnYxID0gMDsKIAlyZXRfc3R1ZmYudjIgPSAwOwogCVNBTF9DQUxMX1JFRU5UUkFOVChyZXRfc3R1ZmYsIFNOX1NBTF9TRVRfRVJST1JfSEFORExJTkdfRkVBVFVSRVMsCi0JCShTQUxfRVJSX0ZFQVRfTUNBX1NMVl9UT19PU19JTklUX1NMViB8IFNBTF9FUlJfRkVBVF9MT0dfU0JFUyksCisJCVNBTF9FUlJfRkVBVF9MT0dfU0JFUywKIAkJMCwgMCwgMCwgMCwgMCwgMCk7CiAKIAlyZXR1cm4gcmV0X3N0dWZmLnN0YXR1czsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaCBiL2luY2x1ZGUvYXNtLWlhNjQvc24vdGlvY3AuaAppbmRleCBmNDdjMDhhLi5lOGFkMGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pYTY0L3NuL3Rpb2NwLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC9zbi90aW9jcC5oCkBAIC0zLDEzICszLDE0IEBACiAgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqLwogI2lmbmRlZiBfQVNNX0lBNjRfU05fUENJX1RJT0NQX0gKICNkZWZpbmUgX0FTTV9JQTY0X1NOX1BDSV9USU9DUF9ICiAKICNkZWZpbmUgVElPQ1BfSE9TVF9JTlRSX0FERFIgICAgICAgICAgICAweDAwM0ZGRkZGRkZGRkZGRkZVTAogI2RlZmluZSBUSU9DUF9QQ0k2NF9DTURUWVBFX01FTSAgICAgICAgICgweDF1bGwgPDwgNjApCisjZGVmaW5lIFRJT0NQX1BDSTY0X0NNRFRZUEVfTVNJICAgICAgICAgKDB4M3VsbCA8PCA2MCkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmggYi9pbmNsdWRlL2FzbS1pYTY0L3VuaXN0ZC5oCmluZGV4IDYzMmYyZWUuLmJiMGViNzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC91bmlzdGQuaApAQCAtMjY1LDcgKzI2NSw3IEBACiAjZGVmaW5lIF9fTlJfa2V5Y3RsCQkJMTI3MwogI2RlZmluZSBfX05SX2lvcHJpb19zZXQJCQkxMjc0CiAjZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJCTEyNzUKLS8qIDEyNzYgaXMgYXZhaWxhYmxlIGZvciByZXVzZSAod2FzIGJyaWVmbHkgc3lzX3NldF96b25lX3JlY2xhaW0pICovCisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJCTEyNzYKICNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJCTEyNzcKICNkZWZpbmUgX19OUl9pbm90aWZ5X2FkZF93YXRjaAkJMTI3OAogI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJCTEyNzkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWlhNjQvdmdhLmggYi9pbmNsdWRlL2FzbS1pYTY0L3ZnYS5oCmluZGV4IDA5MTE3N2MuLjAyMTg0ZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWlhNjQvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20taWE2NC92Z2EuaApAQCAtMTcsNyArMTcsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfaW9iYXNlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmdhX2NvbnNvbGVfbWVtYmFzZTsKIAotI2RlZmluZSBWR0FfTUFQX01FTSh4KQkoKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZSh2Z2FfY29uc29sZV9tZW1iYXNlICsgKHgpLCAwKSkKKyNkZWZpbmUgVkdBX01BUF9NRU0oeCxzKQkoKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXBfbm9jYWNoZSh2Z2FfY29uc29sZV9tZW1iYXNlICsgKHgpLCBzKSkKIAogI2RlZmluZSB2Z2FfcmVhZGIoeCkJKCooeCkpCiAjZGVmaW5lIHZnYV93cml0ZWIoeCx5KQkoKih5KSA9ICh4KSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW0zMnIvdmdhLmggYi9pbmNsdWRlL2FzbS1tMzJyL3ZnYS5oCmluZGV4IGQwZjRiNmUuLjUzMzE2MzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW0zMnIvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20tbTMyci92Z2EuaApAQCAtMTQsNyArMTQsNyBAQAogICoJYWNjZXNzIHRoZSB2aWRlb3JhbSBkaXJlY3RseSB3aXRob3V0IGFueSBibGFjayBtYWdpYy4KICAqLwogCi0jZGVmaW5lIFZHQV9NQVBfTUVNKHgpICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydCh4KQorI2RlZmluZSBWR0FfTUFQX01FTSh4LHMpICh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydCh4KQogCiAjZGVmaW5lIHZnYV9yZWFkYih4KSAoKih4KSkKICNkZWZpbmUgdmdhX3dyaXRlYih4LHkpICgqKHkpID0gKHgpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaCBiL2luY2x1ZGUvYXNtLW02OGsvYW1pZ2FpbnRzLmgKaW5kZXggYWE5NjhkMC4uN2M4NzEzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9hbWlnYWludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2FtaWdhaW50cy5oCkBAIC0xMyw2ICsxMyw4IEBACiAjaWZuZGVmIF9BU01tNjhrX0FNSUdBSU5UU19IXwogI2RlZmluZSBfQVNNbTY4a19BTUlHQUlOVFNfSF8KIAorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKwogLyoKICoqIEFtaWdhIEludGVycnVwdCBzb3VyY2VzLgogKioKQEAgLTIzLDcyICsyNSw1MiBAQAogI2RlZmluZSBDSUFfSVJRUyAgICAgICAgICAgICg1KQogI2RlZmluZSBBTUlfSVJRUyAgICAgICAgICAgICgzMikgLyogQVVUT19JUlFTK0FNSV9TVERfSVJRUysyKkNJQV9JUlFTICovCiAKLS8qIHZlcnRpY2FsIGJsYW5raW5nIGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfQU1JR0FfVkVSVEIgICAgIDAKLQotLyogY29wcGVyIGludGVycnVwdCAqLwotI2RlZmluZSBJUlFfQU1JR0FfQ09QUEVSICAgIDEKLQotLyogQXVkaW8gaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQU1JR0FfQVVEMAkgICAgMgotI2RlZmluZSBJUlFfQU1JR0FfQVVEMQkgICAgMwotI2RlZmluZSBJUlFfQU1JR0FfQVVEMgkgICAgNAotI2RlZmluZSBJUlFfQU1JR0FfQVVEMwkgICAgNQotCi0vKiBCbGl0dGVyIGRvbmUgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUV9BTUlHQV9CTElUCSAgICA2CisvKiBidWlsdGluIHNlcmlhbCBwb3J0IGludGVycnVwdHMgKi8KKyNkZWZpbmUgSVJRX0FNSUdBX1RCRQkJKElSUV9VU0VSKzApCisjZGVmaW5lIElSUV9BTUlHQV9SQkYJCShJUlFfVVNFUisxMSkKIAogLyogZmxvcHB5IGRpc2sgaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQU1JR0FfRFNLU1lOICAgIDcKLSNkZWZpbmUgSVJRX0FNSUdBX0RTS0JMSyAgICA4Ci0KLS8qIGJ1aWx0aW4gc2VyaWFsIHBvcnQgaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQU1JR0FfUkJGCSAgICA5Ci0jZGVmaW5lIElSUV9BTUlHQV9UQkUJICAgIDEwCisjZGVmaW5lIElSUV9BTUlHQV9EU0tCTEsJKElSUV9VU0VSKzEpCisjZGVmaW5lIElSUV9BTUlHQV9EU0tTWU4JKElSUV9VU0VSKzEyKQogCiAvKiBzb2Z0d2FyZSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIElSUV9BTUlHQV9TT0ZUICAgICAgMTEKKyNkZWZpbmUgSVJRX0FNSUdBX1NPRlQJCShJUlFfVVNFUisyKQogCiAvKiBpbnRlcnJ1cHRzIGZyb20gZXh0ZXJuYWwgaGFyZHdhcmUgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX1BPUlRTCSAgICAxMgotI2RlZmluZSBJUlFfQU1JR0FfRVhURVIJICAgIDEzCisjZGVmaW5lIElSUV9BTUlHQV9QT1JUUwkJSVJRX0FVVE9fMgorI2RlZmluZSBJUlFfQU1JR0FfRVhURVIJCUlSUV9BVVRPXzYKKworLyogY29wcGVyIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQU1JR0FfQ09QUEVSCShJUlFfVVNFUis0KQorCisvKiB2ZXJ0aWNhbCBibGFua2luZyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FNSUdBX1ZFUlRCCQkoSVJRX1VTRVIrNSkKKworLyogQmxpdHRlciBkb25lIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQU1JR0FfQkxJVAkJKElSUV9VU0VSKzYpCisKKy8qIEF1ZGlvIGludGVycnVwdHMgKi8KKyNkZWZpbmUgSVJRX0FNSUdBX0FVRDAJCShJUlFfVVNFUis3KQorI2RlZmluZSBJUlFfQU1JR0FfQVVEMQkJKElSUV9VU0VSKzgpCisjZGVmaW5lIElSUV9BTUlHQV9BVUQyCQkoSVJRX1VTRVIrOSkKKyNkZWZpbmUgSVJRX0FNSUdBX0FVRDMJCShJUlFfVVNFUisxMCkKIAogLyogQ0lBIGludGVycnVwdCBzb3VyY2VzICovCi0jZGVmaW5lIElSUV9BTUlHQV9DSUFBICAgICAgMTQKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfVEEgICAxNAotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9UQiAgIDE1Ci0jZGVmaW5lIElSUV9BTUlHQV9DSUFBX0FMUk0gMTYKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfU1AgICAxNwotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9GTEcgIDE4Ci0jZGVmaW5lIElSUV9BTUlHQV9DSUFCICAgICAgMTkKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfVEEgICAxOQotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9UQiAgIDIwCi0jZGVmaW5lIElSUV9BTUlHQV9DSUFCX0FMUk0gMjEKLSNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfU1AgICAyMgotI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9GTEcgIDIzCisjZGVmaW5lIElSUV9BTUlHQV9DSUFBCQkoSVJRX1VTRVIrMTQpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFBX1RBCShJUlFfVVNFUisxNCkKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfVEIJKElSUV9VU0VSKzE1KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9BTFJNCShJUlFfVVNFUisxNikKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUFfU1AJKElSUV9VU0VSKzE3KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQV9GTEcJKElSUV9VU0VSKzE4KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQgkJKElSUV9VU0VSKzE5KQorI2RlZmluZSBJUlFfQU1JR0FfQ0lBQl9UQQkoSVJRX1VTRVIrMTkpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFCX1RCCShJUlFfVVNFUisyMCkKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfQUxSTQkoSVJRX1VTRVIrMjEpCisjZGVmaW5lIElSUV9BTUlHQV9DSUFCX1NQCShJUlFfVVNFUisyMikKKyNkZWZpbmUgSVJRX0FNSUdBX0NJQUJfRkxHCShJUlFfVVNFUisyMykKIAotLyogYXV0by12ZWN0b3IgaW50ZXJydXB0cyAqLwotI2RlZmluZSBJUlFfQU1JR0FfQVVUTyAgICAgIDI0Ci0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzAgICAgMjQgLyogVGhpcyBpcyBqdXN0IGEgZHVtbXkgKi8KLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE9fMSAgICAyNQotI2RlZmluZSBJUlFfQU1JR0FfQVVUT18yICAgIDI2Ci0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzMgICAgMjcKLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE9fNCAgICAyOAotI2RlZmluZSBJUlFfQU1JR0FfQVVUT181ICAgIDI5Ci0jZGVmaW5lIElSUV9BTUlHQV9BVVRPXzYgICAgMzAKLSNkZWZpbmUgSVJRX0FNSUdBX0FVVE9fNyAgICAzMQotCi0jZGVmaW5lIElSUV9GTE9QUFkJICAgIElSUV9BTUlHQV9EU0tCTEsKIAogLyogSU5UUkVRUiBtYXNrcyAqLwotI2RlZmluZSBJUlExX01BU0sgICAweDAwMDcJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgMSAqLwotI2RlZmluZSBJUlEyX01BU0sgICAweDAwMDgJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgMiAqLwotI2RlZmluZSBJUlEzX01BU0sgICAweDAwNzAJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgMyAqLwotI2RlZmluZSBJUlE0X01BU0sgICAweDA3ODAJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgNCAqLwotI2RlZmluZSBJUlE1X01BU0sgICAweDE4MDAJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgNSAqLwotI2RlZmluZSBJUlE2X01BU0sgICAweDIwMDAJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgNiAqLwotI2RlZmluZSBJUlE3X01BU0sgICAweDQwMDAJLyogSU5UUkVRUiBtYXNrIGZvciBJUlEgNyAqLwotCiAjZGVmaW5lIElGX1NFVENMUiAgIDB4ODAwMCAgICAgIC8qIHNldC9jbHIgYml0ICovCiAjZGVmaW5lIElGX0lOVEVOICAgIDB4NDAwMAkvKiBtYXN0ZXIgaW50ZXJydXB0IGJpdCBpbiBJTlQqIHJlZ2lzdGVycyAqLwogI2RlZmluZSBJRl9FWFRFUiAgICAweDIwMDAJLyogZXh0ZXJuYWwgbGV2ZWwgNiBhbmQgQ0lBIEIgaW50ZXJydXB0ICovCkBAIC0xMDYsOSArODgsNiBAQAogI2RlZmluZSBJRl9EU0tCTEsgICAweDAwMDIJLyogZGlza2Jsb2NrIERNQSBmaW5pc2hlZCAqLwogI2RlZmluZSBJRl9UQkUJICAgIDB4MDAwMQkvKiBzZXJpYWwgdHJhbnNtaXQgYnVmZmVyIGVtcHR5IGludGVycnVwdCAqLwogCi1leHRlcm4gdm9pZCBhbWlnYV9kb19pcnEoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKLWV4dGVybiB2b2lkIGFtaWdhX2RvX2lycV9saXN0KGludCBpcnEsIHN0cnVjdCBwdF9yZWdzICpmcCk7Ci0KIC8qIENJQSBpbnRlcnJ1cHQgY29udHJvbCByZWdpc3RlciBiaXRzICovCiAKICNkZWZpbmUgQ0lBX0lDUl9UQQkweDAxCkBAIC0xMjUsNiArMTA0LDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBjaWFiYXNlIGNpYWFfYmFzZSwgY2lhYl9iYXNlOwogCitleHRlcm4gdm9pZCBjaWFfaW5pdF9JUlEoc3RydWN0IGNpYWJhc2UgKmJhc2UpOwogZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY2lhX3NldF9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHVuc2lnbmVkIGNoYXIgbWFzayk7CiBleHRlcm4gdW5zaWduZWQgY2hhciBjaWFfYWJsZV9pcnEoc3RydWN0IGNpYWJhc2UgKmJhc2UsIHVuc2lnbmVkIGNoYXIgbWFzayk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXBvbGxvaHcuaCBiL2luY2x1ZGUvYXNtLW02OGsvYXBvbGxvaHcuaAppbmRleCA0MzA0ZTFjLi5hMTM3M2I5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL2Fwb2xsb2h3LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hcG9sbG9ody5oCkBAIC0zLDYgKzMsOCBAQAogI2lmbmRlZiBfQVNNbTY4a19BUE9MTE9IV19IXwogI2RlZmluZSBfQVNNbTY4a19BUE9MTE9IV19IXwogCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwogLyoKICAgIGFwb2xsbyBtb2RlbHMKICovCkBAIC0xMDEsNCArMTAzLDYgQEAKIAogI2RlZmluZSBpc2FJTzJtZW0oeCkgKCgoKCh4KSAmIDB4M2Y4KSAgPDwgNykgfCAoKCh4KSAmIDB4ZmMwMCkgPj4gNikgfCAoKHgpICYgMHg3KSkgKyAweDQwMDAwICsgSU9fQkFTRSkKIAorI2RlZmluZSBJUlFfQVBPTExPCUlSUV9VU0VSCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9zdGRtYS5oIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaV9zdGRtYS5oCmluZGV4IDY0ZjkyODguLmI0ZWFkZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlfc3RkbWEuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpX3N0ZG1hLmgKQEAgLTMsNyArMyw3IEBACiAjZGVmaW5lIF9hdGFyaV9zdGRtYV9oCiAKIAotI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogUHJvdG90eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlpbnRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL2F0YXJpaW50cy5oCmluZGV4IDQyOTUyYzguLjBlZDQ1NGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvYXRhcmlpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9hdGFyaWludHMuaApAQCAtNDUsMTcgKzQ1LDYgQEAKICNkZWZpbmUgSVJRX1RZUEVfRkFTVCAgICAgMQogI2RlZmluZSBJUlFfVFlQRV9QUklPICAgICAyCiAKLSNkZWZpbmUJSVJRX1NQVVJJT1VTICAgICAgKDApCi0KLS8qIGF1dG8tdmVjdG9yIGludGVycnVwdHMgKi8KLSNkZWZpbmUgSVJRX0FVVE9fMSAgICAgICAgKDEpCi0jZGVmaW5lIElSUV9BVVRPXzIgICAgICAgICgyKQotI2RlZmluZSBJUlFfQVVUT18zICAgICAgICAoMykKLSNkZWZpbmUgSVJRX0FVVE9fNCAgICAgICAgKDQpCi0jZGVmaW5lIElSUV9BVVRPXzUgICAgICAgICg1KQotI2RlZmluZSBJUlFfQVVUT182ICAgICAgICAoNikKLSNkZWZpbmUgSVJRX0FVVE9fNyAgICAgICAgKDcpCi0KIC8qIFNULU1GUCBpbnRlcnJ1cHRzICovCiAjZGVmaW5lIElSUV9NRlBfQlVTWSAgICAgICg4KQogI2RlZmluZSBJUlFfTUZQX0RDRCAgICAgICAoOSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvYnZtZTYwMDBody5oIGIvaW5jbHVkZS9hc20tbTY4ay9idm1lNjAwMGh3LmgKaW5kZXggMjhhODU5Yi4uZjQwZDJmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9idm1lNjAwMGh3LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9idm1lNjAwMGh3LmgKQEAgLTEwOSwyMyArMTA5LDIzIEBACiAKICNkZWZpbmUgQlZNRV9JUlFfVFlQRV9QUklPCTAKIAotI2RlZmluZSBCVk1FX0lSUV9QUk4JCTB4NTQKLSNkZWZpbmUgQlZNRV9JUlFfSTU5NgkJMHgxYQotI2RlZmluZSBCVk1FX0lSUV9TQ1NJCQkweDFiCi0jZGVmaW5lIEJWTUVfSVJRX1RJTUVSCQkweDU5Ci0jZGVmaW5lIEJWTUVfSVJRX1JUQwkJMHgxZQotI2RlZmluZSBCVk1FX0lSUV9BQk9SVAkJMHgxZgorI2RlZmluZSBCVk1FX0lSUV9QUk4JCShJUlFfVVNFUisyMCkKKyNkZWZpbmUgQlZNRV9JUlFfVElNRVIJCShJUlFfVVNFUisyNSkKKyNkZWZpbmUgQlZNRV9JUlFfSTU5NgkJSVJRX0FVVE9fMgorI2RlZmluZSBCVk1FX0lSUV9TQ1NJCQlJUlFfQVVUT18zCisjZGVmaW5lIEJWTUVfSVJRX1JUQwkJSVJRX0FVVE9fNgorI2RlZmluZSBCVk1FX0lSUV9BQk9SVAkJSVJRX0FVVE9fNwogCiAvKiBTQ0MgaW50ZXJydXB0cyAqLwotI2RlZmluZSBCVk1FX0lSUV9TQ0NfQkFTRQkJMHg0MAotI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1RYCQkweDQwCi0jZGVmaW5lIEJWTUVfSVJRX1NDQ0JfU1RBVAkJMHg0MgotI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1JYCQkweDQ0Ci0jZGVmaW5lIEJWTUVfSVJRX1NDQ0JfU1BDT05ECQkweDQ2Ci0jZGVmaW5lIEJWTUVfSVJRX1NDQ0FfVFgJCTB4NDgKLSNkZWZpbmUgQlZNRV9JUlFfU0NDQV9TVEFUCQkweDRhCi0jZGVmaW5lIEJWTUVfSVJRX1NDQ0FfUlgJCTB4NGMKLSNkZWZpbmUgQlZNRV9JUlFfU0NDQV9TUENPTkQJCTB4NGUKKyNkZWZpbmUgQlZNRV9JUlFfU0NDX0JBU0UJCUlSUV9VU0VSCisjZGVmaW5lIEJWTUVfSVJRX1NDQ0JfVFgJCUlSUV9VU0VSCisjZGVmaW5lIEJWTUVfSVJRX1NDQ0JfU1RBVAkJKElSUV9VU0VSKzIpCisjZGVmaW5lIEJWTUVfSVJRX1NDQ0JfUlgJCShJUlFfVVNFUis0KQorI2RlZmluZSBCVk1FX0lSUV9TQ0NCX1NQQ09ORAkJKElSUV9VU0VSKzYpCisjZGVmaW5lIEJWTUVfSVJRX1NDQ0FfVFgJCShJUlFfVVNFUis4KQorI2RlZmluZSBCVk1FX0lSUV9TQ0NBX1NUQVQJCShJUlFfVVNFUisxMCkKKyNkZWZpbmUgQlZNRV9JUlFfU0NDQV9SWAkJKElSUV9VU0VSKzEyKQorI2RlZmluZSBCVk1FX0lSUV9TQ0NBX1NQQ09ORAkJKElSUV9VU0VSKzE0KQogCiAvKiBBZGRyZXNzIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKaW5kZXggOGFiYTk3MS4uMjRkM2ZmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9jYWNoZWZsdXNoLmgKQEAgLTMsMjYgKzMsMzAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKKy8qIGNhY2hlIGNvZGUgKi8KKyNkZWZpbmUgRkxVU0hfSV9BTkRfRAkoMHgwMDAwMDgwOCkKKyNkZWZpbmUgRkxVU0hfSQkJKDB4MDAwMDAwMDgpCisKIC8qCiAgKiBDYWNoZSBoYW5kbGluZyBmdW5jdGlvbnMKICAqLwogCi0jZGVmaW5lIGZsdXNoX2ljYWNoZSgpCQkJCQkJXAotKHsJCQkJCQkJCVwKLQlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApCQkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJub3Bcblx0IgkJCVwKLQkJCQkgICAgICIuY2hpcCA2ODA0MFxuXHQiCQlcCi0JCQkJICAgICAiY2ludmEgJSVpY1xuXHQiCQlcCi0JCQkJICAgICAiLmNoaXAgNjhrIiA6ICk7CQlcCi0JZWxzZSB7CQkJCQkJCVwKLQkJdW5zaWduZWQgbG9uZyBfdG1wOwkJCQlcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJtb3ZlYyAlJWNhY3IsJTBcblx0IglcCi0JCQkJICAgICAib3J3ICUxLCUwXG5cdCIJCVwKLQkJCQkgICAgICJtb3ZlYyAlMCwlJWNhY3IiCQlcCi0JCQkJICAgICA6ICI9JmQiIChfdG1wKQkJXAotCQkJCSAgICAgOiAiaWQiIChGTFVTSF9JKSk7CVwKLQl9CQkJCQkJCVwKLX0pCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfaWNhY2hlKHZvaWQpCit7CisJaWYgKENQVV9JU18wNDBfT1JfMDYwKQorCQlhc20gdm9sYXRpbGUgKAkibm9wXG4iCisJCQkiCS5jaGlwCTY4MDQwXG4iCisJCQkiCWNwdXNoYQklYmNcbiIKKwkJCSIJLmNoaXAJNjhrIik7CisJZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQlhc20gdm9sYXRpbGUgKAkibW92ZWMJJSVjYWNyLCUwXG4iCisJCQkiCW9yLncJJTEsJTBcbiIKKwkJCSIJbW92ZWMJJTAsJSVjYWNyIgorCQkJOiAiPSZkIiAodG1wKQorCQkJOiAiaWQiIChGTFVTSF9JKSk7CisJfQorfQogCiAvKgogICogaW52YWxpZGF0ZSB0aGUgY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgbWVtb3J5IHJhbmdlLgpAQCAtNDMsMTAgKzQ3LDYgQEAKICAqLwogZXh0ZXJuIHZvaWQgY2FjaGVfcHVzaF92KHVuc2lnbmVkIGxvbmcgdmFkZHIsIGludCBsZW4pOwogCi0vKiBjYWNoZSBjb2RlICovCi0jZGVmaW5lIEZMVVNIX0lfQU5EX0QJKDB4MDAwMDA4MDgpCi0jZGVmaW5lIEZMVVNIX0kJCSgweDAwMDAwMDA4KQotCiAvKiBUaGlzIGlzIG5lZWRlZCB3aGVuZXZlciB0aGUgdmlydHVhbCBtYXBwaW5nIG9mIHRoZSBjdXJyZW50CiAgICBwcm9jZXNzIGNoYW5nZXMuICAqLwogI2RlZmluZSBfX2ZsdXNoX2NhY2hlX2FsbCgpCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmggYi9pbmNsdWRlL2FzbS1tNjhrL2RtYS1tYXBwaW5nLmgKaW5kZXggZGZmZDU5Yy4uY2ViYmIwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvZG1hLW1hcHBpbmcuaApAQCAtMSwxMSArMSw5MSBAQAogI2lmbmRlZiBfTTY4S19ETUFfTUFQUElOR19ICiAjZGVmaW5lIF9NNjhLX0RNQV9NQVBQSU5HX0gKIAorI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCi0jaWZkZWYgQ09ORklHX1BDSQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RtYS1tYXBwaW5nLWJyb2tlbi5oPgotI2VuZGlmCitzdHJ1Y3Qgc2NhdHRlcmxpc3Q7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqZGV2LCB1NjQgbWFzaykKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hX3NldF9tYXNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdTY0IG1hc2spCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9nZXRfY2FjaGVfYWxpZ25tZW50KHZvaWQpCit7CisJcmV0dXJuIDEgPDwgTDFfQ0FDSEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9pc19jb25zaXN0ZW50KGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiB2b2lkICpkbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqLCBzaXplX3QsCisJCQkJZG1hX2FkZHJfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZG1hX2ZyZWVfY29oZXJlbnQoc3RydWN0IGRldmljZSAqLCBzaXplX3QsCisJCQkgICAgICB2b2lkICosIGRtYV9hZGRyX3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRtYV9hbGxvY19ub25jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCQkgIGRtYV9hZGRyX3QgKmhhbmRsZSwgaW50IGZsYWcpCit7CisJcmV0dXJuIGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIGhhbmRsZSwgZmxhZyk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2ZyZWVfbm9uY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkJdm9pZCAqYWRkciwgZG1hX2FkZHJfdCBoYW5kbGUpCit7CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBhZGRyLCBoYW5kbGUpOworfQorc3RhdGljIGlubGluZSB2b2lkIGRtYV9jYWNoZV9zeW5jKHZvaWQgKnZhZGRyLCBzaXplX3Qgc2l6ZSwKKwkJCQkgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwkvKiB3ZSB1c2UgY29oZXJlbnQgYWxsb2NhdGlvbiwgc28gbm90IG11Y2ggdG8gZG8gaGVyZS4gKi8KK30KKworZXh0ZXJuIGRtYV9hZGRyX3QgZG1hX21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqLCB2b2lkICosIHNpemVfdCwKKwkJCQkgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGFkZHIsCisJCQkJICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK2V4dGVybiBkbWFfYWRkcl90IGRtYV9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBwYWdlICosCisJCQkgICAgICAgdW5zaWduZWQgbG9uZywgc2l6ZV90IHNpemUsCisJCQkgICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBhZGRyZXNzLAorCQkJCSAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKK30KKworZXh0ZXJuIGludCBkbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIGludCwKKwkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24pOworc3RhdGljIGlubGluZSB2b2lkIGRtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJaW50IG5od2VudHJpZXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKK30KKworZXh0ZXJuIHZvaWQgZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqLCBkbWFfYWRkcl90LCBzaXplX3QsCisJCQkJICAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKK2V4dGVybiB2b2lkIGRtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKiwgaW50LAorCQkJCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uKTsKKworc3RhdGljIGlubGluZSB2b2lkIGRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBoYW5kbGUsCisJCQkJCSAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgICAgICAgaW50IG5lbnRzLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9hZGRyX3QgaGFuZGxlKQoreworCXJldHVybiAwOworfQogCiAjZW5kaWYgIC8qIF9NNjhLX0RNQV9NQVBQSU5HX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvaXJxLmggYi9pbmNsdWRlL2FzbS1tNjhrL2lycS5oCmluZGV4IGI0ZjQ4YjIuLmY0YWU3ZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9pcnEuaApAQCAtMSwxMyArMSw5IEBACiAjaWZuZGVmIF9NNjhLX0lSUV9IXwogI2RlZmluZSBfTTY4S19JUlFfSF8KIAotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCi0vKgotICogIyBvZiBtNjhrIGludGVycnVwdHMKLSAqLwotCi0jZGVmaW5lIFNZU19JUlFTIDgKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrX3R5cGVzLmg+CiAKIC8qCiAgKiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgbWF4KE5VTV9YX1NPVVJDRVMpIGZvciBhbGwgdGhlCkBAIC0xNSwxMCArMTEsMjAgQEAKICAqIEN1cnJlbnRseSB0aGUgQXRhcmkgaGFzIDcyIGFuZCB0aGUgQW1pZ2EgMjQsIGJ1dCBpZiBib3RoIGFyZQogICogc3VwcG9ydGVkIGluIHRoZSBrZXJuZWwgaXQgaXMgYmV0dGVyIHRvIG1ha2Ugcm9vbSBmb3IgNzIuCiAgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19BVEFSSSkgfHwgZGVmaW5lZChDT05GSUdfTUFDKQotI2RlZmluZSBOUl9JUlFTICg3MitTWVNfSVJRUykKKyNpZiBkZWZpbmVkKENPTkZJR19WTUUpIHx8IGRlZmluZWQoQ09ORklHX1NVTjMpIHx8IGRlZmluZWQoQ09ORklHX1NVTjNYKQorI2RlZmluZSBOUl9JUlFTIDIwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfQVRBUkkpIHx8IGRlZmluZWQoQ09ORklHX01BQykKKyNkZWZpbmUgTlJfSVJRUyA3MgorI2VsaWYgZGVmaW5lZChDT05GSUdfUTQwKQorI2RlZmluZSBOUl9JUlFTCTQzCisjZWxpZiBkZWZpbmVkKENPTkZJR19BTUlHQSkKKyNkZWZpbmUgTlJfSVJRUwkzMgorI2VsaWYgZGVmaW5lZChDT05GSUdfQVBPTExPKQorI2RlZmluZSBOUl9JUlFTCTI0CisjZWxpZiBkZWZpbmVkKENPTkZJR19IUDMwMCkKKyNkZWZpbmUgTlJfSVJRUwk4CiAjZWxzZQotI2RlZmluZSBOUl9JUlFTICgyNCtTWVNfSVJRUykKKyNlcnJvciB1bmtub3duIG5yIG9mIGlycXMKICNlbmRpZgogCiAvKgpAQCAtNDAsNTMgKzQ2LDI1IEBACiAgKiB0aGF0IHJvdXRpbmUgcmVxdWlyZXMgc2VydmljZS4KICAqLwogCi0jZGVmaW5lIElSUTEJCSgxKQkvKiBsZXZlbCAxIGludGVycnVwdCAqLwotI2RlZmluZSBJUlEyCQkoMikJLyogbGV2ZWwgMiBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRMwkJKDMpCS8qIGxldmVsIDMgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUTQJCSg0KQkvKiBsZXZlbCA0IGludGVycnVwdCAqLwotI2RlZmluZSBJUlE1CQkoNSkJLyogbGV2ZWwgNSBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSVJRNgkJKDYpCS8qIGxldmVsIDYgaW50ZXJydXB0ICovCi0jZGVmaW5lIElSUTcJCSg3KQkvKiBsZXZlbCA3IGludGVycnVwdCAobm9uLW1hc2thYmxlKSAqLworI2RlZmluZSBJUlFfU1BVUklPVVMJMAogCi0vKgotICogIkdlbmVyaWMiIGludGVycnVwdCBzb3VyY2VzCi0gKi8KKyNkZWZpbmUgSVJRX0FVVE9fMQkxCS8qIGxldmVsIDEgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9BVVRPXzIJMgkvKiBsZXZlbCAyIGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQVVUT18zCTMJLyogbGV2ZWwgMyBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FVVE9fNAk0CS8qIGxldmVsIDQgaW50ZXJydXB0ICovCisjZGVmaW5lIElSUV9BVVRPXzUJNQkvKiBsZXZlbCA1IGludGVycnVwdCAqLworI2RlZmluZSBJUlFfQVVUT182CTYJLyogbGV2ZWwgNiBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgSVJRX0FVVE9fNwk3CS8qIGxldmVsIDcgaW50ZXJydXB0IChub24tbWFza2FibGUpICovCiAKLSNkZWZpbmUgSVJRX1NDSEVEX1RJTUVSCSg4KSAgICAvKiBpbnRlcnJ1cHQgc291cmNlIGZvciBzY2hlZHVsaW5nIHRpbWVyICovCisjZGVmaW5lIElSUV9VU0VSCTgKIAotc3RhdGljIF9faW5saW5lX18gaW50IGlycV9jYW5vbmljYWxpemUoaW50IGlycSkKLXsKLQlyZXR1cm4gaXJxOwotfQotCi0vKgotICogTWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlcy4KLSAqCi0gKiBBZGRpbmcgYW4gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSBmb3IgYSBzb3VyY2Ugd2l0aCB0aGlzIGJpdAotICogc2V0IGluZGljYXRlcyBhIHNwZWNpYWwgbWFjaGluZSBzcGVjaWZpYyBpbnRlcnJ1cHQgc291cmNlLgotICogVGhlIG1hY2hpbmUgc3BlY2lmaWMgZmlsZXMgZGVmaW5lIHRoZXNlIHNvdXJjZXMuCi0gKgotICogVGhlIElSUV9NQUNIU1BFQyBiaXQgaXMgbm93IGdvbmUgLSB0aGUgb25seSB0aGluZyBpdCBkaWQgd2FzIHRvCi0gKiBpbnRyb2R1Y2UgdW5uZWNlc3Nhcnkgb3ZlcmhlYWQuCi0gKgotICogQWxsIGludGVycnVwdCBoYW5kbGluZyBpcyBhY3R1YWxseSBtYWNoaW5lIHNwZWNpZmljIHNvIGl0IGlzIGJldHRlcgotICogdG8gdXNlIGZ1bmN0aW9uIHBvaW50ZXJzLCBhcyB1c2VkIGJ5IHRoZSBTcGFyYyBwb3J0LCBhbmQgc2VsZWN0IHRoZQotICogaW50ZXJydXB0IGhhbmRsaW5nIGZ1bmN0aW9ucyB3aGVuIGluaXRpYWxpemluZyB0aGUga2VybmVsLiBUaGlzIHdheQotICogd2Ugc2F2ZSBzb21lIHVubmVjZXNzYXJ5IG92ZXJoZWFkIGF0IHJ1bi10aW1lLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwMS8xMS85NyAtIEplcwotICovCi0KLWV4dGVybiB2b2lkICgqZW5hYmxlX2lycSkodW5zaWduZWQgaW50KTsKLWV4dGVybiB2b2lkICgqZGlzYWJsZV9pcnEpKHVuc2lnbmVkIGludCk7CitleHRlcm4gdW5zaWduZWQgaW50IGlycV9jYW5vbmljYWxpemUodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBkaXNhYmxlX2lycSh1bnNpZ25lZCBpbnQpOwogI2RlZmluZSBkaXNhYmxlX2lycV9ub3N5bmMJZGlzYWJsZV9pcnEKIAogc3RydWN0IHB0X3JlZ3M7CiAKLWV4dGVybiBpbnQgY3B1X3JlcXVlc3RfaXJxKHVuc2lnbmVkIGludCwKLQkJCSAgIGlycXJldHVybl90ICgqKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0JCQkgICB1bnNpZ25lZCBsb25nLCBjb25zdCBjaGFyICosIHZvaWQgKik7Ci1leHRlcm4gdm9pZCBjcHVfZnJlZV9pcnEodW5zaWduZWQgaW50LCB2b2lkICopOwotCiAvKgogICogdmFyaW91cyBmbGFncyBmb3IgcmVxdWVzdF9pcnEoKSAtIHRoZSBBbWlnYSBub3cgdXNlcyB0aGUgc3RhbmRhcmQKICAqIG1lY2hhbmlzbSBsaWtlIGFsbCBvdGhlciBhcmNoaXRlY3R1cmVzIC0gU0FfSU5URVJSVVBUIGFuZCBTQV9TSElSUQpAQCAtMTA1LDMzICs4Myw0NSBAQAogICogaW50ZXJydXB0IHNvdXJjZSAoaWYgaXQgc3VwcG9ydHMgY2hhaW5pbmcpLgogICovCiB0eXBlZGVmIHN0cnVjdCBpcnFfbm9kZSB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7Ci0JdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQJCSgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCXZvaWQJCSpkZXZfaWQ7Ci0JY29uc3QgY2hhcgkqZGV2bmFtZTsKIAlzdHJ1Y3QgaXJxX25vZGUgKm5leHQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwljb25zdCBjaGFyCSpkZXZuYW1lOwogfSBpcnFfbm9kZV90OwogCiAvKgogICogVGhpcyBzdHJ1Y3R1cmUgaGFzIG9ubHkgNCBlbGVtZW50cyBmb3Igc3BlZWQgcmVhc29ucwogICovCiB0eXBlZGVmIHN0cnVjdCBpcnFfaGFuZGxlciB7Ci0JaXJxcmV0dXJuX3QJKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisJaW50CQkoKmhhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAl1bnNpZ25lZCBsb25nCWZsYWdzOwogCXZvaWQJCSpkZXZfaWQ7CiAJY29uc3QgY2hhcgkqZGV2bmFtZTsKIH0gaXJxX2hhbmRsZXJfdDsKIAotLyogY291bnQgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAqLwotZXh0ZXJuIHZvbGF0aWxlIHVuc2lnbmVkIGludCBudW1fc3B1cmlvdXM7CitzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCAoKnN0YXJ0dXApKHVuc2lnbmVkIGludCBpcnEpOworCXZvaWQgKCpzaHV0ZG93bikodW5zaWduZWQgaW50IGlycSk7CisJdm9pZCAoKmVuYWJsZSkodW5zaWduZWQgaW50IGlycSk7CisJdm9pZCAoKmRpc2FibGUpKHVuc2lnbmVkIGludCBpcnEpOworfTsKKworZXh0ZXJuIGludCBtNjhrX2lycV9zdGFydHVwKHVuc2lnbmVkIGludCk7CitleHRlcm4gdm9pZCBtNjhrX2lycV9zaHV0ZG93bih1bnNpZ25lZCBpbnQpOwogCiAvKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IGlycV9ub2RlX3QKICAqLwogZXh0ZXJuIGlycV9ub2RlX3QgKm5ld19pcnFfbm9kZSh2b2lkKTsKIAotc3RydWN0IGlycWFjdGlvbjsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9hdXRvX2ludGVycnVwdCh2b2lkICgqaGFuZGxlcikodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqKSk7CitleHRlcm4gdm9pZCBtNjhrX3NldHVwX3VzZXJfaW50ZXJydXB0KHVuc2lnbmVkIGludCB2ZWMsIHVuc2lnbmVkIGludCBjbnQsCisJCQkJICAgICAgdm9pZCAoKmhhbmRsZXIpKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKikpOworZXh0ZXJuIHZvaWQgbTY4a19zZXR1cF9pcnFfY29udHJvbGxlcihzdHJ1Y3QgaXJxX2NvbnRyb2xsZXIgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOworCithc21saW5rYWdlIHZvaWQgbTY4a19oYW5kbGVfaW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKik7CiAKICNlbmRpZiAvKiBfTTY4S19JUlFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbWFjX29zcy5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNfb3NzLmgKaW5kZXggNzY0NGE2My4uNzIyMWY3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNfb3NzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNfb3NzLmgKQEAgLTY5LDEyICs2OSwxMiBAQAogCiAjZGVmaW5lIE9TU19JUlFMRVZfRElTQUJMRUQJMAogI2RlZmluZSBPU1NfSVJRTEVWX0lPUElTTQkxCS8qIEFEQj8gKi8KLSNkZWZpbmUgT1NTX0lSUUxFVl9TQ1NJCQkyCi0jZGVmaW5lIE9TU19JUlFMRVZfTlVCVVMJMwkvKiBrZWVwIHRoaXMgb24gaXRzIG93biBsZXZlbCAqLwotI2RlZmluZSBPU1NfSVJRTEVWX0lPUFNDQwk0CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCi0jZGVmaW5lIE9TU19JUlFMRVZfU09VTkQJNQkvKiBtYXRjaGVzIFZJQSBhbHRlcm5hdGUgbWFwcGluZyAqLworI2RlZmluZSBPU1NfSVJRTEVWX1NDU0kJCUlSUV9BVVRPXzIKKyNkZWZpbmUgT1NTX0lSUUxFVl9OVUJVUwlJUlFfQVVUT18zCS8qIGtlZXAgdGhpcyBvbiBpdHMgb3duIGxldmVsICovCisjZGVmaW5lIE9TU19JUlFMRVZfSU9QU0NDCUlSUV9BVVRPXzQJLyogbWF0Y2hlcyBWSUEgYWx0ZXJuYXRlIG1hcHBpbmcgKi8KKyNkZWZpbmUgT1NTX0lSUUxFVl9TT1VORAlJUlFfQVVUT181CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCiAjZGVmaW5lIE9TU19JUlFMRVZfNjBIWgkJNgkvKiBtYXRjaGVzIFZJQSBhbHRlcm5hdGUgbWFwcGluZyAqLwotI2RlZmluZSBPU1NfSVJRTEVWX1ZJQTEJCTYJLyogbWF0Y2hlcyBWSUEgYWx0ZXJuYXRlIG1hcHBpbmcgKi8KKyNkZWZpbmUgT1NTX0lSUUxFVl9WSUExCQlJUlFfQVVUT182CS8qIG1hdGNoZXMgVklBIGFsdGVybmF0ZSBtYXBwaW5nICovCiAjZGVmaW5lIE9TU19JUlFMRVZfUEFSSVRZCTcJLyogbWF0Y2hlcyBWSUEgYWx0ZXJuYXRlIG1hcHBpbmcgKi8KIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvbWFjaGRlcC5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKaW5kZXggN2QzZmVlMy4uZGY4OThmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNoZGVwLmgKQEAgLTEzLDE0ICsxMyw4IEBACiBleHRlcm4gdm9pZCAoKm1hY2hfc2NoZWRfaW5pdCkgKGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopKTsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IGlycSBmdW5jdGlvbnMgKi8KIGV4dGVybiB2b2lkICgqbWFjaF9pbml0X0lSUSkgKHZvaWQpOwotZXh0ZXJuIGlycXJldHVybl90ICgqKCptYWNoX2RlZmF1bHRfaGFuZGxlcilbXSkgKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKLWV4dGVybiBpbnQgKCptYWNoX3JlcXVlc3RfaXJxKSAodW5zaWduZWQgaW50IGlycSwgaXJxcmV0dXJuX3QgKCpoYW5kbGVyKShpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldm5hbWUsIHZvaWQgKmRldl9pZCk7Ci1leHRlcm4gdm9pZCAoKm1hY2hfZnJlZV9pcnEpICh1bnNpZ25lZCBpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogZXh0ZXJuIHZvaWQgKCptYWNoX2dldF9tb2RlbCkgKGNoYXIgKm1vZGVsKTsKIGV4dGVybiBpbnQgKCptYWNoX2dldF9oYXJkd2FyZV9saXN0KSAoY2hhciAqYnVmZmVyKTsKLWV4dGVybiBpbnQgKCptYWNoX2dldF9pcnFfbGlzdCkgKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCptYWNoX3Byb2Nlc3NfaW50KSAoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKIC8qIG1hY2hpbmUgZGVwZW5kZW50IHRpbWVyIGZ1bmN0aW9ucyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgKCptYWNoX2dldHRpbWVvZmZzZXQpKHZvaWQpOwogZXh0ZXJuIGludCAoKm1hY2hfaHdjbGspKGludCwgc3RydWN0IHJ0Y190aW1lKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL21hY2ludG9zaC5oIGIvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRvc2guaAppbmRleCA2ZmMzZDE5Li4yN2QxMWRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL21hY2ludG9zaC5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbWFjaW50b3NoLmgKQEAgLTExLDE3ICsxMSw3IEBACiBleHRlcm4gdm9pZCBtYWNfcmVzZXQodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNfcG93ZXJvZmYodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNfaW5pdF9JUlEodm9pZCk7Ci1leHRlcm4gaW50IG1hY19yZXF1ZXN0X2lycSAodW5zaWduZWQgaW50LCBpcnFyZXR1cm5fdCAoKikoaW50LCB2b2lkICosCi0JCQkJc3RydWN0IHB0X3JlZ3MgKiksCi0JCQkJdW5zaWduZWQgbG9uZywgY29uc3QgY2hhciAqLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgbWFjX2ZyZWVfaXJxKHVuc2lnbmVkIGludCwgdm9pZCAqKTsKLWV4dGVybiB2b2lkIG1hY19lbmFibGVfaXJxKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gdm9pZCBtYWNfZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsKIGV4dGVybiBpbnQgbWFjX2lycV9wZW5kaW5nKHVuc2lnbmVkIGludCk7Ci1leHRlcm4gaW50IHNob3dfbWFjX2ludGVycnVwdHMoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Ci0jaWYgMAotZXh0ZXJuIHZvaWQgbWFjX2RlZmF1bHRfaGFuZGxlcihpbnQgaXJxKTsKLSNlbmRpZgogZXh0ZXJuIHZvaWQgbWFjX2lkZW50aWZ5KHZvaWQpOwogZXh0ZXJuIHZvaWQgbWFjX3JlcG9ydF9oYXJkd2FyZSh2b2lkKTsKIGV4dGVybiB2b2lkIG1hY19kZWJ1Z2dpbmdfcGVuZ3VpbihpbnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay9tYWNpbnRzLmggYi9pbmNsdWRlL2FzbS1tNjhrL21hY2ludHMuaAppbmRleCBmZDhjM2E5Li42NzljNDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL21hY2ludHMuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL21hY2ludHMuaApAQCAtNTksMTcgKzU5LDYgQEAKICNkZWZpbmUgSVJRX1NSQyhpcnEpCShpcnEgPj4gMykKICNkZWZpbmUJSVJRX0lEWChpcnEpCShpcnEgJiA3KQogCi0jZGVmaW5lCUlSUV9TUFVSSU9VUyAgICAgICgwKQotCi0vKiBhdXRvLXZlY3RvciBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIElSUV9BVVRPXzEgICAgICAgICgxKQotI2RlZmluZSBJUlFfQVVUT18yICAgICAgICAoMikKLSNkZWZpbmUgSVJRX0FVVE9fMyAgICAgICAgKDMpCi0jZGVmaW5lIElSUV9BVVRPXzQgICAgICAgICg0KQotI2RlZmluZSBJUlFfQVVUT181ICAgICAgICAoNSkKLSNkZWZpbmUgSVJRX0FVVE9fNiAgICAgICAgKDYpCi0jZGVmaW5lIElSUV9BVVRPXzcgICAgICAgICg3KQotCiAvKiBWSUExIGludGVycnVwdHMgKi8KICNkZWZpbmUgSVJRX1ZJQTFfMAkgICg4KQkJLyogb25lIHNlY29uZCBpbnQuICovCiAjZGVmaW5lIElSUV9WSUExXzEgICAgICAgICg5KQkJLyogVkJsYW5rIGludC4gKi8KQEAgLTE2Myw3ICsxNTIsNCBAQAogI2RlZmluZSBJTlRfQ0xLICAgMjQ1NzYJICAgIC8qIENMSyB3aGlsZSBpbnRfY2xrID0yLjQ1Nk1IeiBhbmQgZGl2aWRlID0gMTAwICovCiAjZGVmaW5lIElOVF9USUNLUyAyNDYJICAgIC8qIHRvIG1ha2Ugc2NoZWRfdGltZSA9IDk5LjkwMi4uLiBIWiAqLwogCi1leHRlcm4gaXJxX25vZGVfdCAqbWFjX2lycV9saXN0W05VTV9NQUNfU09VUkNFU107Ci1leHRlcm4gdm9pZCBtYWNfZG9faXJxX2xpc3QoaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KICNlbmRpZiAvKiBhc20vbWFjaW50cy5oICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL212bWUxNDdody5oIGIvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTQ3aHcuaAppbmRleCBmMjQ1MTM5Li5iODEwNDMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL212bWUxNDdody5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbXZtZTE0N2h3LmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9NVk1FMTQ3SFdfSF8KICNkZWZpbmUgX01WTUUxNDdIV19IXwogCisjaW5jbHVkZSA8YXNtL2lycS5oPgorCiB0eXBlZGVmIHN0cnVjdCB7CiAJdW5zaWduZWQgY2hhcgogCQljdHJsLApAQCAtNzIsMzkgKzc0LDM5IEBACiAjZGVmaW5lIFBDQ19MRVZFTF9TQ1NJX1BPUlQJMHgwNAogI2RlZmluZSBQQ0NfTEVWRUxfU0NTSV9ETUEJMHgwNAogCi0jZGVmaW5lIFBDQ19JUlFfQUNfRkFJTAkJMHg0MAotI2RlZmluZSBQQ0NfSVJRX0JFUlIJCTB4NDEKLSNkZWZpbmUgUENDX0lSUV9BQk9SVAkJMHg0MgotLyogI2RlZmluZSBQQ0NfSVJRX1NFUklBTAkweDQzICovCi0jZGVmaW5lIFBDQ19JUlFfUFJJTlRFUgkJMHg0NwotI2RlZmluZSBQQ0NfSVJRX1RJTUVSMQkJMHg0OAotI2RlZmluZSBQQ0NfSVJRX1RJTUVSMgkJMHg0OQotI2RlZmluZSBQQ0NfSVJRX1NPRlRXQVJFMQkweDRhCi0jZGVmaW5lIFBDQ19JUlFfU09GVFdBUkUyCTB4NGIKKyNkZWZpbmUgUENDX0lSUV9BQ19GQUlMCQkoSVJRX1VTRVIrMCkKKyNkZWZpbmUgUENDX0lSUV9CRVJSCQkoSVJRX1VTRVIrMSkKKyNkZWZpbmUgUENDX0lSUV9BQk9SVAkJKElSUV9VU0VSKzIpCisvKiAjZGVmaW5lIFBDQ19JUlFfU0VSSUFMCShJUlFfVVNFUiszKSAqLworI2RlZmluZSBQQ0NfSVJRX1BSSU5URVIJCShJUlFfVVNFUis3KQorI2RlZmluZSBQQ0NfSVJRX1RJTUVSMQkJKElSUV9VU0VSKzgpCisjZGVmaW5lIFBDQ19JUlFfVElNRVIyCQkoSVJRX1VTRVIrOSkKKyNkZWZpbmUgUENDX0lSUV9TT0ZUV0FSRTEJKElSUV9VU0VSKzEwKQorI2RlZmluZSBQQ0NfSVJRX1NPRlRXQVJFMgkoSVJRX1VTRVIrMTEpCiAKIAogI2RlZmluZSBNMTQ3X1NDQ19BX0FERFIJCTB4ZmZmZTMwMDIKICNkZWZpbmUgTTE0N19TQ0NfQl9BRERSCQkweGZmZmUzMDAwCiAjZGVmaW5lIE0xNDdfU0NDX1BDTEsJCTUwMDAwMDAKIAotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ1NJX1BPUlQJMHg0NQotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ1NJX0RNQQkweDQ2CisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDU0lfUE9SVAkoSVJRX1VTRVIrMHg0NSkKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NTSV9ETUEJKElSUV9VU0VSKzB4NDYpCiAKIC8qIFNDQyBpbnRlcnJ1cHRzLCBmb3IgTVZNRTE0NyAqLwogCiAjZGVmaW5lIE1WTUUxNDdfSVJRX1RZUEVfUFJJTwkwCi0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ19CQVNFCQkweDYwCi0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfVFgJCTB4NjAKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQl9TVEFUCQkweDYyCi0jZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfUlgJCTB4NjQKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQl9TUENPTkQJCTB4NjYKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9UWAkJMHg2OAotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NBX1NUQVQJCTB4NmEKLSNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9SWAkJMHg2YwotI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NBX1NQQ09ORAkJMHg2ZQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NfQkFTRQkJKElSUV9VU0VSKzMyKQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1RYCQkoSVJRX1VTRVIrMzIpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfU1RBVAkJKElSUV9VU0VSKzM0KQorI2RlZmluZSBNVk1FMTQ3X0lSUV9TQ0NCX1JYCQkoSVJRX1VTRVIrMzYpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0JfU1BDT05ECQkoSVJRX1VTRVIrMzgpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfVFgJCShJUlFfVVNFUis0MCkKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9TVEFUCQkoSVJRX1VTRVIrNDIpCisjZGVmaW5lIE1WTUUxNDdfSVJRX1NDQ0FfUlgJCShJUlFfVVNFUis0NCkKKyNkZWZpbmUgTVZNRTE0N19JUlFfU0NDQV9TUENPTkQJCShJUlFfVVNFUis0NikKIAogI2RlZmluZSBNVk1FMTQ3X0xBTkNFX0JBU0UJMHhmZmZlMTgwMAotI2RlZmluZSBNVk1FMTQ3X0xBTkNFX0lSUQkweDQ0CisjZGVmaW5lIE1WTUUxNDdfTEFOQ0VfSVJRCShJUlFfVVNFUis0KQogCiAjZGVmaW5lIEVUSEVSTkVUX0FERFJFU1MgMHhmZmZlMDc3OAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL212bWUxNnhody5oIGIvaW5jbHVkZS9hc20tbTY4ay9tdm1lMTZ4aHcuaAppbmRleCA1ZDA3MjMxLi42MTE3ZjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL212bWUxNnhody5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvbXZtZTE2eGh3LmgKQEAgLTY2LDI4ICs2NiwyOCBAQAogCiAjZGVmaW5lIE1WTUUxNjJfSVJRX1RZUEVfUFJJTwkwCiAKLSNkZWZpbmUgTVZNRTE2N19JUlFfUFJOCQkweDU0Ci0jZGVmaW5lIE1WTUUxNnhfSVJRX0k1OTYJMHg1NwotI2RlZmluZSBNVk1FMTZ4X0lSUV9TQ1NJCTB4NTUKLSNkZWZpbmUgTVZNRTE2eF9JUlFfRkxZCQkweDdmCi0jZGVmaW5lIE1WTUUxNjdfSVJRX1NFUl9FUlIJMHg1YwotI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfTU9ERU0JMHg1ZAotI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfVFgJMHg1ZQotI2RlZmluZSBNVk1FMTY3X0lSUV9TRVJfUlgJMHg1ZgotI2RlZmluZSBNVk1FMTZ4X0lSUV9USU1FUgkweDU5Ci0jZGVmaW5lIE1WTUUxNjdfSVJRX0FCT1JUCTB4NmUKLSNkZWZpbmUgTVZNRTE2Ml9JUlFfQUJPUlQJMHg1ZQorI2RlZmluZSBNVk1FMTY3X0lSUV9QUk4JCShJUlFfVVNFUisyMCkKKyNkZWZpbmUgTVZNRTE2eF9JUlFfSTU5NgkoSVJRX1VTRVIrMjMpCisjZGVmaW5lIE1WTUUxNnhfSVJRX1NDU0kJKElSUV9VU0VSKzIxKQorI2RlZmluZSBNVk1FMTZ4X0lSUV9GTFkJCShJUlFfVVNFUis2MykKKyNkZWZpbmUgTVZNRTE2N19JUlFfU0VSX0VSUgkoSVJRX1VTRVIrMjgpCisjZGVmaW5lIE1WTUUxNjdfSVJRX1NFUl9NT0RFTQkoSVJRX1VTRVIrMjkpCisjZGVmaW5lIE1WTUUxNjdfSVJRX1NFUl9UWAkoSVJRX1VTRVIrMzApCisjZGVmaW5lIE1WTUUxNjdfSVJRX1NFUl9SWAkoSVJRX1VTRVIrMzEpCisjZGVmaW5lIE1WTUUxNnhfSVJRX1RJTUVSCShJUlFfVVNFUisyNSkKKyNkZWZpbmUgTVZNRTE2N19JUlFfQUJPUlQJKElSUV9VU0VSKzQ2KQorI2RlZmluZSBNVk1FMTYyX0lSUV9BQk9SVAkoSVJRX1VTRVIrMzApCiAKIC8qIFNDQyBpbnRlcnJ1cHRzLCBmb3IgTVZNRTE2MiAqLwotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NfQkFTRQkJMHg0MAotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1RYCQkweDQwCi0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0JfU1RBVAkJMHg0MgotI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1JYCQkweDQ0Ci0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0JfU1BDT05ECQkweDQ2Ci0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfVFgJCTB4NDgKLSNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQV9TVEFUCQkweDRhCi0jZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfUlgJCTB4NGMKLSNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQV9TUENPTkQJCTB4NGUKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDX0JBU0UJCShJUlFfVVNFUiswKQorI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NCX1RYCQkoSVJRX1VTRVIrMCkKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQl9TVEFUCQkoSVJRX1VTRVIrMikKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQl9SWAkJKElSUV9VU0VSKzQpCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0JfU1BDT05ECQkoSVJRX1VTRVIrNikKKyNkZWZpbmUgTVZNRTE2Ml9JUlFfU0NDQV9UWAkJKElSUV9VU0VSKzgpCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfU1RBVAkJKElSUV9VU0VSKzEwKQorI2RlZmluZSBNVk1FMTYyX0lSUV9TQ0NBX1JYCQkoSVJRX1VTRVIrMTIpCisjZGVmaW5lIE1WTUUxNjJfSVJRX1NDQ0FfU1BDT05ECQkoSVJRX1VTRVIrMTQpCiAKIC8qIE1WTUUxNjIgdmVyc2lvbiByZWdpc3RlciAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hc20tbTY4ay9wcm9jZXNzb3IuaAppbmRleCAzNTI3OTllLi44NDU1Zjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvcHJvY2Vzc29yLmgKQEAgLTcxLDEwICs3MSwxMCBAQAogfTsKIAogI2RlZmluZSBJTklUX1RIUkVBRCAgewkJCQkJCQlcCi0Ja3NwOglzaXplb2YoaW5pdF9zdGFjaykgKyAodW5zaWduZWQgbG9uZykgaW5pdF9zdGFjaywJXAotCXNyOglQU19TLAkJCQkJCQlcCi0JZnM6CV9fS0VSTkVMX0RTLAkJCQkJCVwKLQlpbmZvOglJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzaykJCQkJXAorCS5rc3AJPSBzaXplb2YoaW5pdF9zdGFjaykgKyAodW5zaWduZWQgbG9uZykgaW5pdF9zdGFjaywJXAorCS5zcgk9IFBTX1MsCQkJCQkJCVwKKwkuZnMJPSBfX0tFUk5FTF9EUywJCQkJCQlcCisJLmluZm8JPSBJTklUX1RIUkVBRF9JTkZPKGluaXRfdGFzayksCQkJCVwKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc2NhdHRlcmxpc3QuaCBiL2luY2x1ZGUvYXNtLW02OGsvc2NhdHRlcmxpc3QuaAppbmRleCBkN2M5YjVjLi44ZTYxMjI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3NjYXR0ZXJsaXN0LmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zY2F0dGVybGlzdC5oCkBAIC0yLDE4ICsyLDE3IEBACiAjZGVmaW5lIF9NNjhLX1NDQVRURVJMSVNUX0gKIAogc3RydWN0IHNjYXR0ZXJsaXN0IHsKLQkvKiBUaGVzZSB0d28gYXJlIG9ubHkgdmFsaWQgaWYgQUREUkVTUyBtZW1iZXIgb2YgdGhpcwotCSAqIHN0cnVjdCBpcyBOVUxMLgotCSAqLwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0KIAl1bnNpZ25lZCBpbnQgbGVuZ3RoOwogCi0JX191MzIgZHZtYV9hZGRyZXNzOyAvKiBBIHBsYWNlIHRvIGhhbmcgaG9zdC1zcGVjaWZpYyBhZGRyZXNzZXMgYXQuICovCisJX191MzIgZG1hX2FkZHJlc3M7CS8qIEEgcGxhY2UgdG8gaGFuZyBob3N0LXNwZWNpZmljIGFkZHJlc3NlcyBhdC4gKi8KIH07CiAKIC8qIFRoaXMgaXMgYm9ndXMgYW5kIHNob3VsZCBnbyBhd2F5LiAqLwogI2RlZmluZSBJU0FfRE1BX1RIUkVTSE9MRCAoMHgwMGZmZmZmZikKIAorI2RlZmluZSBzZ19kbWFfYWRkcmVzcyhzZykJKChzZyktPmRtYV9hZGRyZXNzKQorI2RlZmluZSBzZ19kbWFfbGVuKHNnKQkJKChzZyktPmxlbmd0aCkKKwogI2VuZGlmIC8qICEoX002OEtfU0NBVFRFUkxJU1RfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc2lnbmFsLmggYi9pbmNsdWRlL2FzbS1tNjhrL3NpZ25hbC5oCmluZGV4IGI3YjdlYTIuLjg1MDM3YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvc2lnbmFsLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zaWduYWwuaApAQCAtMTU2LDEzICsxNTYsMTcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNpZ2FkZHNldChzaWdzZXRfdCAqc2V0LCBpbnQgX3NpZykKIHsKLQlfX2FzbV9fKCJiZnNldCAlMHslMSwjMX0iIDogIj1tIiAoKnNldCkgOiAiaWQiICgoX3NpZyAtIDEpIF4gMzEpCisJYXNtICgiYmZzZXQgJTB7JTEsIzF9IgorCQk6ICIrb2QiICgqc2V0KQorCQk6ICJpZCIgKChfc2lnIC0gMSkgXiAzMSkKIAkJOiAiY2MiKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNpZ2RlbHNldChzaWdzZXRfdCAqc2V0LCBpbnQgX3NpZykKIHsKLQlfX2FzbV9fKCJiZmNsciAlMHslMSwjMX0iIDogIj1tIigqc2V0KSA6ICJpZCIoKF9zaWcgLSAxKSBeIDMxKQorCWFzbSAoImJmY2xyICUweyUxLCMxfSIKKwkJOiAiK29kIiAoKnNldCkKKwkJOiAiaWQiICgoX3NpZyAtIDEpIF4gMzEpCiAJCTogImNjIik7CiB9CiAKQEAgLTE3NSw4ICsxNzksMTAgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9fZ2VuX3NpZ2lzbWVtYmVyKHNpZ3NldF90ICpzZXQsIGludCBfc2lnKQogewogCWludCByZXQ7Ci0JX19hc21fXygiYmZleHR1ICUxeyUyLCMxfSwlMCIKLQkJOiAiPWQiKHJldCkgOiAibSIoKnNldCksICJpZCIoKF9zaWctMSkgXiAzMSkpOworCWFzbSAoImJmZXh0dSAlMXslMiwjMX0sJTAiCisJCTogIj1kIiAocmV0KQorCQk6ICJvZCIgKCpzZXQpLCAiaWQiICgoX3NpZy0xKSBeIDMxKQorCQk6ICJjYyIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4Nyw3ICsxOTMsMTAgQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2lnZmluZGlud29yZCh1bnNpZ25lZCBsb25nIHdvcmQpCiB7Ci0JX19hc21fXygiYmZmZm8gJTF7IzAsIzB9LCUwIiA6ICI9ZCIod29yZCkgOiAiZCIod29yZCAmIC13b3JkKSA6ICJjYyIpOworCWFzbSAoImJmZmZvICUxeyMwLCMwfSwlMCIKKwkJOiAiPWQiICh3b3JkKQorCQk6ICJkIiAod29yZCAmIC13b3JkKQorCQk6ICJjYyIpOwogCXJldHVybiB3b3JkIF4gMzE7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaCBiL2luY2x1ZGUvYXNtLW02OGsvc3VuM2ludHMuaAppbmRleCBiZDAzOGZjLi5kZTkxZmEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3N1bjNpbnRzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay9zdW4zaW50cy5oCkBAIC0xMiwzNyArMTIsMjUgQEAKICNkZWZpbmUgU1VOM0lOVFNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgogI2luY2x1ZGUgPGFzbS9pbnRlcnNpbC5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS90cmFwcy5oPgogCiAjZGVmaW5lIFNVTjNfSU5UX1ZFQ1MgMTkyCiAKIHZvaWQgc3VuM19lbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogdm9pZCBzdW4zX2Rpc2FibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotaW50IHN1bjNfcmVxdWVzdF9pcnEodW5zaWduZWQgaW50IGlycSwKLSAgICAgICAgICAgICAgICAgICAgIGlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopLAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqZGV2bmFtZSwgdm9pZCAqZGV2X2lkCi0JCSAgICApOwogZXh0ZXJuIHZvaWQgc3VuM19pbml0X0lSUSAodm9pZCk7Ci1leHRlcm4gaXJxcmV0dXJuX3QgKCpzdW4zX2RlZmF1bHRfaGFuZGxlcltdKSAoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwotZXh0ZXJuIHZvaWQgc3VuM19mcmVlX2lycSAodW5zaWduZWQgaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIGV4dGVybiB2b2lkIHN1bjNfZW5hYmxlX2ludGVycnVwdHMgKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3VuM19kaXNhYmxlX2ludGVycnVwdHMgKHZvaWQpOwotZXh0ZXJuIGludCBzaG93X3N1bjNfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKTsKLWV4dGVybiBpcnFyZXR1cm5fdCBzdW4zX3Byb2Nlc3NfaW50KGludCwgc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciogc3VuM19pbnRyZWc7CiAKIC8qIG1hc3RlciBsaXN0IG9mIFZNRSB2ZWN0b3JzIC0tIGRvbid0IGZ1Y2sgd2l0aCB0aGlzICovCi0jZGVmaW5lIFNVTjNfVkVDX0ZMT1BQWSAweDQwCi0jZGVmaW5lIFNVTjNfVkVDX1ZNRVNDU0kwIDB4NDAKLSNkZWZpbmUgU1VOM19WRUNfVk1FU0NTSTEgMHg0MQotI2RlZmluZSBTVU4zX1ZFQ19DRyAweEE4CisjZGVmaW5lIFNVTjNfVkVDX0ZMT1BQWQkJKElSUV9VU0VSKzApCisjZGVmaW5lIFNVTjNfVkVDX1ZNRVNDU0kwCShJUlFfVVNFUiswKQorI2RlZmluZSBTVU4zX1ZFQ19WTUVTQ1NJMQkoSVJRX1VTRVIrMSkKKyNkZWZpbmUgU1VOM19WRUNfQ0cJCShJUlFfVVNFUisxMDQpCiAKIAogI2VuZGlmIC8qIFNVTjNJTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGsvdHJhcHMuaCBiL2luY2x1ZGUvYXNtLW02OGsvdHJhcHMuaAppbmRleCA0NzUwNTYxLi44Y2FlZjI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrL3RyYXBzLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4ay90cmFwcy5oCkBAIC0xMyw4ICsxMywxNSBAQAogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKwogdHlwZWRlZiB2b2lkICgqZV92ZWN0b3IpKHZvaWQpOwogCithc21saW5rYWdlIHZvaWQgYXV0b19pbnRoYW5kbGVyKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHVzZXJfaW50aGFuZGxlcih2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCBiYWRfaW50aGFuZGxlcih2b2lkKTsKKwogZXh0ZXJuIGVfdmVjdG9yIHZlY3RvcnNbXTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1tNjhrL3VhY2Nlc3MuaCBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCmluZGV4IDJmZmQ4N2IuLjg4YjFmNDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCisrKyBiL2luY2x1ZGUvYXNtLW02OGsvdWFjY2Vzcy5oCkBAIC00LDggKzQsOSBAQAogLyoKICAqIFVzZXIgc3BhY2UgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMKICAqLworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4KIAogI2RlZmluZSBWRVJJRllfUkVBRAkwCkBAIC0zMiw4NTggKzMzLDMzNSBAQAogCXVuc2lnbmVkIGxvbmcgaW5zbiwgZml4dXA7CiB9OwogCitleHRlcm4gaW50IF9fcHV0X3VzZXJfYmFkKHZvaWQpOworZXh0ZXJuIGludCBfX2dldF91c2VyX2JhZCh2b2lkKTsKKworI2RlZmluZSBfX3B1dF91c2VyX2FzbShyZXMsIHgsIHB0ciwgYndsLCByZWcsIGVycikJXAorYXNtIHZvbGF0aWxlICgiXG4iCQkJCQlcCisJIjE6CW1vdmVzLiIjYndsIgklMiwlMVxuIgkJXAorCSIyOlxuIgkJCQkJCVwKKwkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkiCS5ldmVuXG4iCQkJCVwKKwkiMTA6CW1vdmVxLmwJJTMsJTBcbiIJCQlcCisJIglqcmEgMmJcbiIJCQkJXAorCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkiXG4iCQkJCQkJXAorCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCSIJLmFsaWduCTRcbiIJCQkJXAorCSIJLmxvbmcJMWIsMTBiXG4iCQkJXAorCSIJLmxvbmcJMmIsMTBiXG4iCQkJXAorCSIJLnByZXZpb3VzIgkJCQlcCisJOiAiK2QiIChyZXMpLCAiPW0iICgqKHB0cikpCQkJXAorCTogI3JlZyAoeCksICJpIiAoZXJyKSkKIAogLyoKICAqIFRoZXNlIGFyZSB0aGUgbWFpbiBzaW5nbGUtdmFsdWUgdHJhbnNmZXIgcm91dGluZXMuICBUaGV5IGF1dG9tYXRpY2FsbHkKICAqIHVzZSB0aGUgcmlnaHQgc2l6ZSBpZiB3ZSBqdXN0IGhhdmUgdGhlIHJpZ2h0IHBvaW50ZXIgdHlwZS4KICAqLwogCi0jZGVmaW5lIHB1dF91c2VyKHgsIHB0cikJCQkJXAotKHsJCQkJCQkJXAotICAgIGludCBfX3B1X2VycjsJCQkJCVwKLSAgICB0eXBlb2YoKihwdHIpKSBfX3B1X3ZhbCA9ICh4KTsJCQlcCi0gICAgX19jaGtfdXNlcl9wdHIocHRyKTsJCQkJXAotICAgIHN3aXRjaCAoc2l6ZW9mICgqKHB0cikpKSB7CQkJCVwKLSAgICBjYXNlIDE6CQkJCQkJXAotCV9fcHV0X3VzZXJfYXNtKF9fcHVfZXJyLCBfX3B1X3ZhbCwgcHRyLCBiKTsJXAotCWJyZWFrOwkJCQkJCVwKLSAgICBjYXNlIDI6CQkJCQkJXAotCV9fcHV0X3VzZXJfYXNtKF9fcHVfZXJyLCBfX3B1X3ZhbCwgcHRyLCB3KTsJXAotCWJyZWFrOwkJCQkJCVwKLSAgICBjYXNlIDQ6CQkJCQkJXAotCV9fcHV0X3VzZXJfYXNtKF9fcHVfZXJyLCBfX3B1X3ZhbCwgcHRyLCBsKTsJXAotCWJyZWFrOwkJCQkJCVwKLSAgICBjYXNlIDg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIF9fcHVfZXJyID0gX19jb25zdGFudF9jb3B5X3RvX3VzZXIocHRyLCAmX19wdV92YWwsIDgpOyAgICAgICAgXAotICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDoJCQkJCQlcCi0JX19wdV9lcnIgPSBfX3B1dF91c2VyX2JhZCgpOwkJCVwKLQlicmVhazsJCQkJCQlcCi0gICAgfQkJCQkJCQlcCi0gICAgX19wdV9lcnI7CQkJCQkJXAorI2RlZmluZSBfX3B1dF91c2VyKHgsIHB0cikJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl0eXBlb2YoKihwdHIpKSBfX3B1X3ZhbCA9ICh4KTsJCQkJCVwKKwlpbnQgX19wdV9lcnIgPSAwOwkJCQkJCVwKKwlfX2Noa191c2VyX3B0cihwdHIpOwkJCQkJCVwKKwlzd2l0Y2ggKHNpemVvZiAoKihwdHIpKSkgewkJCQkJXAorCWNhc2UgMToJCQkJCQkJCVwKKwkJX19wdXRfdXNlcl9hc20oX19wdV9lcnIsIF9fcHVfdmFsLCBwdHIsIGIsIGQsIC1FRkFVTFQpOwlcCisJCWJyZWFrOwkJCQkJCQlcCisJY2FzZSAyOgkJCQkJCQkJXAorCQlfX3B1dF91c2VyX2FzbShfX3B1X2VyciwgX19wdV92YWwsIHB0ciwgdywgZCwgLUVGQVVMVCk7CVwKKwkJYnJlYWs7CQkJCQkJCVwKKwljYXNlIDQ6CQkJCQkJCQlcCisJCV9fcHV0X3VzZXJfYXNtKF9fcHVfZXJyLCBfX3B1X3ZhbCwgcHRyLCBsLCByLCAtRUZBVUxUKTsJXAorCQlicmVhazsJCQkJCQkJXAorCWNhc2UgODoJCQkJCQkJCVwKKyAJICAgIHsJCQkJCQkJCVwKKyAJCWNvbnN0IHZvaWQgKl9fcHVfcHRyID0gKHB0cik7CQkJCVwKKwkJYXNtIHZvbGF0aWxlICgiXG4iCQkJCQlcCisJCQkiMToJbW92ZXMubAklMiwoJTEpK1xuIgkJCVwKKwkJCSIyOgltb3Zlcy5sCSVSMiwoJTEpXG4iCQkJXAorCQkJIjM6XG4iCQkJCQkJXAorCQkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCQkiCS5ldmVuXG4iCQkJCVwKKwkJCSIxMDoJbW92ZWwgJTMsJTBcbiIJCQkJXAorCQkJIglqcmEgM2JcbiIJCQkJXAorCQkJIgkucHJldmlvdXNcbiIJCQkJXAorCQkJIlxuIgkJCQkJCVwKKwkJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJXAorCQkJIgkuYWxpZ24gNFxuIgkJCQlcCisJCQkiCS5sb25nIDFiLDEwYlxuIgkJCQlcCisJCQkiCS5sb25nIDJiLDEwYlxuIgkJCQlcCisJCQkiCS5sb25nIDNiLDEwYlxuIgkJCQlcCisJCQkiCS5wcmV2aW91cyIJCQkJXAorCQkJOiAiK2QiIChfX3B1X2VyciksICIrYSIgKF9fcHVfcHRyKQkJXAorCQkJOiAiciIgKF9fcHVfdmFsKSwgImkiICgtRUZBVUxUKQkJCVwKKwkJCTogIm1lbW9yeSIpOwkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICB9CQkJCQkJCQlcCisJZGVmYXVsdDoJCQkJCQkJXAorCQlfX3B1X2VyciA9IF9fcHV0X3VzZXJfYmFkKCk7CQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJX19wdV9lcnI7CQkJCQkJCVwKIH0pCi0jZGVmaW5lIF9fcHV0X3VzZXIoeCwgcHRyKSBwdXRfdXNlcih4LCBwdHIpCisjZGVmaW5lIHB1dF91c2VyKHgsIHB0cikJX19wdXRfdXNlcih4LCBwdHIpCiAKLWV4dGVybiBpbnQgX19wdXRfdXNlcl9iYWQodm9pZCk7CiAKLS8qCi0gKiBUZWxsIGdjYyB3ZSByZWFkIGZyb20gbWVtb3J5IGluc3RlYWQgb2Ygd3JpdGluZzogdGhpcyBpcyBiZWNhdXNlCi0gKiB3ZSBkbyBub3Qgd3JpdGUgdG8gYW55IG1lbW9yeSBnY2Mga25vd3MgYWJvdXQsIHNvIHRoZXJlIGFyZSBubwotICogYWxpYXNpbmcgaXNzdWVzLgotICovCi0jZGVmaW5lIF9fcHV0X3VzZXJfYXNtKGVycix4LHB0cixid2wpCQkJXAotX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJCVwKLSAgICAoIjIxOm1vdmVzIiAjYndsICIgJTIsJTFcbiIJCQkJXAotICAgICAiMTpcbiIJCQkJCQlcCi0gICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJCVwKLSAgICAgIiAgIC5ldmVuXG4iCQkJCQlcCi0gICAgICIyOiBtb3ZlbCAlMywlMFxuIgkJCQkJXAotICAgICAiICAganJhIDFiXG4iCQkJCQlcCi0gICAgICIucHJldmlvdXNcbiIJCQkJCVwKLSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCi0gICAgICIgICAuYWxpZ24gNFxuIgkJCQkJXAotICAgICAiICAgLmxvbmcgMjFiLDJiXG4iCQkJCVwKLSAgICAgIiAgIC5sb25nIDFiLDJiXG4iCQkJCQlcCi0gICAgICIucHJldmlvdXMiCQkJCQlcCi0gICAgIDogIj1kIihlcnIpCQkJCQlcCi0gICAgIDogIm0iKCoocHRyKSksICJyIih4KSwgImkiKC1FRkFVTFQpLCAiMCIoMCkpCi0KLSNkZWZpbmUgZ2V0X3VzZXIoeCwgcHRyKQkJCQkJXAotKHsJCQkJCQkJCVwKLSAgICBpbnQgX19ndV9lcnI7CQkJCQkJXAotICAgIHR5cGVvZigqKHB0cikpIF9fZ3VfdmFsOwkJCQkJXAotICAgIF9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQlcCi0gICAgc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQkJXAotICAgIGNhc2UgMToJCQkJCQkJXAotCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCBfX2d1X3ZhbCwgcHRyLCBiLCAiPWQiKTsJXAotCWJyZWFrOwkJCQkJCQlcCi0gICAgY2FzZSAyOgkJCQkJCQlcCi0JX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIF9fZ3VfdmFsLCBwdHIsIHcsICI9ciIpOwlcCi0JYnJlYWs7CQkJCQkJCVwKLSAgICBjYXNlIDQ6CQkJCQkJCVwKLQlfX2dldF91c2VyX2FzbShfX2d1X2VyciwgX19ndV92YWwsIHB0ciwgbCwgIj1yIik7CVwKLQlicmVhazsJCQkJCQkJXAotICAgIGNhc2UgODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19ndV9lcnIgPSBfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKCZfX2d1X3ZhbCwgcHRyLCA4KTsgIFwKLSAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVmYXVsdDoJCQkJCQkJXAotCV9fZ3VfdmFsID0gKHR5cGVvZigqKHB0cikpKTA7CQkJCVwKLQlfX2d1X2VyciA9IF9fZ2V0X3VzZXJfYmFkKCk7CQkJCVwKLQlicmVhazsJCQkJCQkJXAotICAgIH0JCQkJCQkJCVwKLSAgICAoeCkgPSBfX2d1X3ZhbDsJCQkJCQlcCi0gICAgX19ndV9lcnI7CQkJCQkJCVwKKyNkZWZpbmUgX19nZXRfdXNlcl9hc20ocmVzLCB4LCBwdHIsIHR5cGUsIGJ3bCwgcmVnLCBlcnIpICh7CVwKKwl0eXBlIF9fZ3VfdmFsOwkJCQkJCVwKKwlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCVwKKwkJIjE6CW1vdmVzLiIjYndsIgklMiwlMVxuIgkJXAorCQkiMjpcbiIJCQkJCQlcCisJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAorCQkiCS5ldmVuXG4iCQkJCVwKKwkJIjEwOgltb3ZlLmwJJTMsJTBcbiIJCQlcCisJCSIJc3ViLiIjYndsIgklMSwlMVxuIgkJXAorCQkiCWpyYQkyYlxuIgkJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJIlxuIgkJCQkJCVwKKwkJIgkuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCQlcCisJCSIJLmFsaWduCTRcbiIJCQkJXAorCQkiCS5sb25nCTFiLDEwYlxuIgkJCVwKKwkJIgkucHJldmlvdXMiCQkJCVwKKwkJOiAiK2QiIChyZXMpLCAiPSYiICNyZWcgKF9fZ3VfdmFsKQkJXAorCQk6ICJtIiAoKihwdHIpKSwgImkiIChlcnIpKTsJCQlcCisJKHgpID0gKHR5cGVvZigqKHB0cikpKShsb25nKV9fZ3VfdmFsOwkJCVwKIH0pCi0jZGVmaW5lIF9fZ2V0X3VzZXIoeCwgcHRyKSBnZXRfdXNlcih4LCBwdHIpCiAKLWV4dGVybiBpbnQgX19nZXRfdXNlcl9iYWQodm9pZCk7CisjZGVmaW5lIF9fZ2V0X3VzZXIoeCwgcHRyKQkJCQkJCVwKKyh7CQkJCQkJCQkJXAorCWludCBfX2d1X2VyciA9IDA7CQkJCQkJXAorCV9fY2hrX3VzZXJfcHRyKHB0cik7CQkJCQkJXAorCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJCVwKKwljYXNlIDE6CQkJCQkJCQlcCisJCV9fZ2V0X3VzZXJfYXNtKF9fZ3VfZXJyLCB4LCBwdHIsIHU4LCBiLCBkLCAtRUZBVUxUKTsJXAorCQlicmVhazsJCQkJCQkJXAorCWNhc2UgMjoJCQkJCQkJCVwKKwkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIHgsIHB0ciwgdTE2LCB3LCBkLCAtRUZBVUxUKTsJXAorCQlicmVhazsJCQkJCQkJXAorCWNhc2UgNDoJCQkJCQkJCVwKKwkJX19nZXRfdXNlcl9hc20oX19ndV9lcnIsIHgsIHB0ciwgdTMyLCBsLCByLCAtRUZBVUxUKTsJXAorCQlicmVhazsJCQkJCQkJXAorLyoJY2FzZSA4OglkaXNhYmxlZCBiZWNhdXNlIGdjYy00LjEgaGFzIGEgYnJva2VuIHR5cGVvZgkJXAorIAkgICAgewkJCQkJCQkJXAorIAkJY29uc3Qgdm9pZCAqX19ndV9wdHIgPSAocHRyKTsJCQkJXAorIAkJdTY0IF9fZ3VfdmFsOwkJCQkJCVwKKwkJYXNtIHZvbGF0aWxlICgiXG4iCQkJCQlcCisJCQkiMToJbW92ZXMubAkoJTIpKywlMVxuIgkJCVwKKwkJCSIyOgltb3Zlcy5sCSglMiksJVIxXG4iCQkJXAorCQkJIjM6XG4iCQkJCQkJXAorCQkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJCQkiCS5ldmVuXG4iCQkJCVwKKwkJCSIxMDoJbW92ZS5sCSUzLCUwXG4iCQkJXAorCQkJIglzdWIubAklMSwlMVxuIgkJCVwKKwkJCSIJc3ViLmwJJVIxLCVSMVxuIgkJCVwKKwkJCSIJanJhCTNiXG4iCQkJCVwKKwkJCSIJLnByZXZpb3VzXG4iCQkJCVwKKwkJCSJcbiIJCQkJCQlcCisJCQkiCS5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKKwkJCSIJLmFsaWduCTRcbiIJCQkJXAorCQkJIgkubG9uZwkxYiwxMGJcbiIJCQlcCisJCQkiCS5sb25nCTJiLDEwYlxuIgkJCVwKKwkJCSIJLnByZXZpb3VzIgkJCQlcCisJCQk6ICIrZCIgKF9fZ3VfZXJyKSwgIj0mciIgKF9fZ3VfdmFsKSwJCVwKKwkJCSAgIithIiAoX19ndV9wdHIpCQkJCVwKKwkJCTogImkiICgtRUZBVUxUKQkJCQkJXAorCQkJOiAibWVtb3J5Iik7CQkJCQlcCisJCSh4KSA9ICh0eXBlb2YoKihwdHIpKSlfX2d1X3ZhbDsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCSAgICB9CSovCQkJCQkJCVwKKwlkZWZhdWx0OgkJCQkJCQlcCisJCV9fZ3VfZXJyID0gX19nZXRfdXNlcl9iYWQoKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX2d1X2VycjsJCQkJCQkJXAorfSkKKyNkZWZpbmUgZ2V0X3VzZXIoeCwgcHRyKSBfX2dldF91c2VyKHgsIHB0cikKIAotI2RlZmluZSBfX2dldF91c2VyX2FzbShlcnIseCxwdHIsYndsLHJlZykJXAotX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJXAotICAgICgiMTogbW92ZXMiICNid2wgIiAlMiwlMVxuIgkJCVwKLSAgICAgIjI6XG4iCQkJCQlcCi0gICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAotICAgICAiICAgLmV2ZW5cbiIJCQkJXAotICAgICAiMzogbW92ZWwgJTMsJTBcbiIJCQkJXAotICAgICAiICAgc3ViIiAjYndsICIgJTEsJTFcbiIJCQlcCi0gICAgICIgICBqcmEgMmJcbiIJCQkJXAotICAgICAiLnByZXZpb3VzXG4iCQkJCVwKLSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCVwKLSAgICAgIiAgIC5hbGlnbiA0XG4iCQkJCVwKLSAgICAgIiAgIC5sb25nIDFiLDNiXG4iCQkJCVwKLSAgICAgIi5wcmV2aW91cyIJCQkJXAotICAgICA6ICI9ZCIoZXJyKSwgcmVnKHgpCQkJXAotICAgICA6ICJtIigqKHB0cikpLCAiaSIgKC1FRkFVTFQpLCAiMCIoMCkpCit1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKLXsKLSAgICB1bnNpZ25lZCBsb25nIHRtcDsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSgiICAgdHN0bCAlMlxuIgotCSAiICAgamVxIDJmXG4iCi0JICIxOiBtb3Zlc2wgKCUxKSssJTNcbiIKLQkgIiAgIG1vdmVsICUzLCglMCkrXG4iCi0JICIgICBzdWJxbCAjMSwlMlxuIgotCSAiICAgam5lIDFiXG4iCi0JICIyOiBtb3ZlbCAlNCwlMlxuIgotCSAiICAgYmNsciAjMSwlMlxuIgotCSAiICAgamVxIDRmXG4iCi0JICIzOiBtb3Zlc3cgKCUxKSssJTNcbiIKLQkgIiAgIG1vdmV3ICUzLCglMCkrXG4iCi0JICI0OiBiY2xyICMwLCUyXG4iCi0JICIgICBqZXEgNmZcbiIKLQkgIjU6IG1vdmVzYiAoJTEpKywlM1xuIgotCSAiICAgbW92ZWIgJTMsKCUwKStcbiIKLQkgIjY6XG4iCi0JICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JICIgICAuZXZlblxuIgotCSAiNzogbW92ZWwgJTIsJSVkMFxuIgotCSAiNzE6Y2xybCAoJTApK1xuIgotCSAiICAgc3VicWwgIzEsJSVkMFxuIgotCSAiICAgam5lIDcxYlxuIgotCSAiICAgbHNsbCAjMiwlMlxuIgotCSAiICAgYWRkbCAlNCwlMlxuIgotCSAiICAgYnRzdCAjMSwlNFxuIgotCSAiICAgam5lIDgxZlxuIgotCSAiICAgYnRzdCAjMCwlNFxuIgotCSAiICAgam5lIDkxZlxuIgotCSAiICAganJhIDZiXG4iCi0JICI4OiBhZGRxbCAjMiwlMlxuIgotCSAiODE6Y2xydyAoJTApK1xuIgotCSAiICAgYnRzdCAjMCwlNFxuIgotCSAiICAgam5lIDkxZlxuIgotCSAiICAganJhIDZiXG4iCi0JICI5OiBhZGRxbCAjMSwlMlxuIgotCSAiOTE6Y2xyYiAoJTApK1xuIgotCSAiICAganJhIDZiXG4iCi0gICAgICAgICAiLnByZXZpb3VzXG4iCi0JICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICIgICAuYWxpZ24gNFxuIgotCSAiICAgLmxvbmcgMWIsN2JcbiIKLQkgIiAgIC5sb25nIDNiLDhiXG4iCi0JICIgICAubG9uZyA1Yiw5YlxuIgotCSAiLnByZXZpb3VzIgotCSA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pLCAiPSZkIih0bXApCi0JIDogImQiKG4gJiAzKSwgIjAiKHRvKSwgIjEiKGZyb20pLCAiMiIobi80KQotCSA6ICJkMCIsICJtZW1vcnkiKTsKLSAgICByZXR1cm4gbjsKLX0KKyNkZWZpbmUgX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCBuLCBzMSwgczIsIHMzKVwKKwlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCQlcCisJCSIxOgltb3Zlcy4iI3MxIgkoJTIpKywlM1xuIgkJCVwKKwkJIgltb3ZlLiIjczEiCSUzLCglMSkrXG4iCQkJXAorCQkiMjoJbW92ZXMuIiNzMiIJKCUyKSssJTNcbiIJCQlcCisJCSIJbW92ZS4iI3MyIgklMywoJTEpK1xuIgkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIjM6CW1vdmVzLiIjczMiCSglMikrLCUzXG4iCQkJXAorCQkiCW1vdmUuIiNzMyIJJTMsKCUxKStcbiIJCQlcCisJCSIJLmVuZGlmXG4iCQkJCQlcCisJCSI0OlxuIgkJCQkJCQlcCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKwkJIgkuYWxpZ24JNFxuIgkJCQkJXAorCQkiCS5sb25nCTFiLDEwZlxuIgkJCQlcCisJCSIJLmxvbmcJMmIsMjBmXG4iCQkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIgkubG9uZwkzYiwzMGZcbiIJCQkJXAorCQkiCS5lbmRpZlxuIgkJCQkJXAorCQkiCS5wcmV2aW91c1xuIgkJCQkJXAorCQkiXG4iCQkJCQkJCVwKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCQkiCS5ldmVuXG4iCQkJCQlcCisJCSIxMDoJY2xyLiIjczEiCSglMSkrXG4iCQkJXAorCQkiMjA6CWNsci4iI3MyIgkoJTEpK1xuIgkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIjMwOgljbHIuIiNzMyIJKCUxKStcbiIJCQlcCisJCSIJLmVuZGlmXG4iCQkJCQlcCisJCSIJbW92ZXEubAkjIiNuIiwlMFxuIgkJCQlcCisJCSIJanJhCTRiXG4iCQkJCQlcCisJCSIJLnByZXZpb3VzXG4iCQkJCQlcCisJCTogIitkIiAocmVzKSwgIismYSIgKHRvKSwgIithIiAoZnJvbSksICI9JmQiICh0bXApCVwKKwkJOiA6ICJtZW1vcnkiKQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLV9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIG4pCi17Ci0gICAgdW5zaWduZWQgbG9uZyB0bXA7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18KLQkoIiAgIHRzdGwgJTJcbiIKLQkgIiAgIGplcSAzZlxuIgotCSAiMTogbW92ZWwgKCUxKSssJTNcbiIKLQkgIjIyOm1vdmVzbCAlMywoJTApK1xuIgotCSAiMjogc3VicWwgIzEsJTJcbiIKLQkgIiAgIGpuZSAxYlxuIgotCSAiMzogbW92ZWwgJTQsJTJcbiIKLQkgIiAgIGJjbHIgIzEsJTJcbiIKLQkgIiAgIGplcSA0ZlxuIgotCSAiICAgbW92ZXcgKCUxKSssJTNcbiIKLQkgIjI0Om1vdmVzdyAlMywoJTApK1xuIgotCSAiNDogYmNsciAjMCwlMlxuIgotCSAiICAgamVxIDVmXG4iCi0JICIgICBtb3ZlYiAoJTEpKywlM1xuIgotCSAiMjU6bW92ZXNiICUzLCglMCkrXG4iCi0JICI1OlxuIgotCSAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCSAiICAgLmV2ZW5cbiIKLQkgIjYwOmFkZHFsICMxLCUyXG4iCi0JICI2OiBsc2xsICMyLCUyXG4iCi0JICIgICBhZGRsICU0LCUyXG4iCi0JICIgICBqcmEgNWJcbiIKLQkgIjc6IGFkZHFsICMyLCUyXG4iCi0JICIgICBqcmEgNWJcbiIKLQkgIjg6IGFkZHFsICMxLCUyXG4iCi0JICIgICBqcmEgNWJcbiIKLQkgIi5wcmV2aW91c1xuIgotCSAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAiICAgLmFsaWduIDRcbiIKLQkgIiAgIC5sb25nIDFiLDYwYlxuIgotCSAiICAgLmxvbmcgMjJiLDZiXG4iCi0JICIgICAubG9uZyAyYiw2YlxuIgotCSAiICAgLmxvbmcgMjRiLDdiXG4iCi0JICIgICAubG9uZyAzYiw2MGJcbiIKLQkgIiAgIC5sb25nIDRiLDdiXG4iCi0JICIgICAubG9uZyAyNWIsOGJcbiIKLQkgIiAgIC5sb25nIDViLDhiXG4iCi0JICIucHJldmlvdXMiCi0JIDogIj1hIih0byksICI9YSIoZnJvbSksICI9ZCIobiksICI9JmQiKHRtcCkKLQkgOiAiciIobiAmIDMpLCAiMCIodG8pLCAiMSIoZnJvbSksICIyIihuIC8gNCkKLQkgOiAibWVtb3J5Iik7Ci0gICAgcmV0dXJuIG47Ci19Ci0KLSNkZWZpbmUgX19jb3B5X2Zyb21fdXNlcl9iaWcodG8sIGZyb20sIG4sIGZpeHVwLCBjb3B5KQlcCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18JCQkJXAotCSgiMTA6IG1vdmVzbCAoJTEpKywlJWQwXG4iCQkJXAotCSAiICAgIG1vdmVsICUlZDAsKCUwKStcbiIJCQlcCi0JICIgICAgc3VicWwgIzEsJTJcbiIJCQkJXAotCSAiICAgIGpuZSAxMGJcbiIJCQkJXAotCSAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCVwKLQkgIiAgICAuZXZlblxuIgkJCQkJXAotCSAiMTE6IG1vdmVsICUyLCUlZDBcbiIJCQkJXAotCSAiMTM6IGNscmwgKCUwKStcbiIJCQkJXAotCSAiICAgIHN1YnFsICMxLCUlZDBcbiIJCQkJXAotCSAiICAgIGpuZSAxM2JcbiIJCQkJXAotCSAiICAgIGxzbGwgIzIsJTJcbiIJCQkJXAotCSBmaXh1cCAiXG4iCQkJCQlcCi0JICIgICAganJhIDEyZlxuIgkJCQlcCi0JICIucHJldmlvdXNcbiIJCQkJCVwKLQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCi0JICIgICAgLmFsaWduIDRcbiIJCQkJXAotCSAiICAgIC5sb25nIDEwYiwxMWJcbiIJCQkJXAotCSAiLnByZXZpb3VzXG4iCQkJCQlcCi0JIGNvcHkgIlxuIgkJCQkJXAotCSAiMTI6IgkJCQkJCVwKLQkgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQkJXAotCSA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKG4vNCkJCQlcCi0JIDogImQwIiwgIm1lbW9yeSIpCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1bnNpZ25lZCBsb25nCiBfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotICAgIHN3aXRjaCAobikgewotICAgIGNhc2UgMDoKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18KLQkgICAgKCIxOiBtb3Zlc2IgKCUxKSssJSVkMFxuIgotCSAgICAgIiAgIG1vdmViICUlZDAsKCUwKStcbiIKLQkgICAgICIyOlxuIgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjM6IGFkZHFsICMxLCUyXG4iCi0JICAgICAiICAgY2xyYiAoJTApK1xuIgotCSAgICAgIiAgIGpyYSAyYlxuIgotCSAgICAgIi5wcmV2aW91c1xuIgotCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkgICAgICIgICAuYWxpZ24gNFxuIgotCSAgICAgIiAgIC5sb25nIDFiLDNiXG4iCi0JICAgICAiLnByZXZpb3VzIgotCSAgICAgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQotCSAgICAgOiAiMCIodG8pLCAiMSIoZnJvbSksICIyIigwKQotCSAgICAgOiAiZDAiLCAibWVtb3J5Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAyOgotCV9fYXNtX18gX192b2xhdGlsZV9fCi0JICAgICgiMTogbW92ZXN3ICglMSkrLCUlZDBcbiIKLQkgICAgICIgICBtb3ZldyAlJWQwLCglMCkrXG4iCi0JICAgICAiMjpcbiIKLQkgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JICAgICAiICAgLmV2ZW5cbiIKLQkgICAgICIzOiBhZGRxbCAjMiwlMlxuIgotCSAgICAgIiAgIGNscncgKCUwKStcbiIKLQkgICAgICIgICBqcmEgMmJcbiIKLQkgICAgICIucHJldmlvdXNcbiIKLQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICAgICAiICAgLmFsaWduIDRcbiIKLQkgICAgICIgICAubG9uZyAxYiwzYlxuIgotCSAgICAgIi5wcmV2aW91cyIKLQkgICAgIDogIj1hIih0byksICI9YSIoZnJvbSksICI9ZCIobikKLQkgICAgIDogIjAiKHRvKSwgIjEiKGZyb20pLCAiMiIoMCkKLQkgICAgIDogImQwIiwgIm1lbW9yeSIpOwotCWJyZWFrOwotICAgIGNhc2UgMzoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIjE6IG1vdmVzdyAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZXcgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6IG1vdmVzYiAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWIgJSVkMCwoJTApK1xuIgotCSAgICAgIjM6IgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjQ6IGFkZHFsICMyLCUyXG4iCi0JICAgICAiICAgY2xydyAoJTApK1xuIgotCSAgICAgIjU6IGFkZHFsICMxLCUyXG4iCi0JICAgICAiICAgY2xyYiAoJTApK1xuIgotCSAgICAgIiAgIGpyYSAzYlxuIgotCSAgICAgIi5wcmV2aW91c1xuIgotCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkgICAgICIgICAuYWxpZ24gNFxuIgotCSAgICAgIiAgIC5sb25nIDFiLDRiXG4iCi0JICAgICAiICAgLmxvbmcgMmIsNWJcbiIKLQkgICAgICIucHJldmlvdXMiCi0JICAgICA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pCi0JICAgICA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKDApCi0JICAgICA6ICJkMCIsICJtZW1vcnkiKTsKLQlicmVhazsKLSAgICBjYXNlIDQ6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18KLQkgICAgKCIxOiBtb3Zlc2wgKCUxKSssJSVkMFxuIgotCSAgICAgIiAgIG1vdmVsICUlZDAsKCUwKStcbiIKLQkgICAgICIyOiIKLQkgICAgICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JICAgICAiICAgLmV2ZW5cbiIKLQkgICAgICIzOiBhZGRxbCAjNCwlMlxuIgotCSAgICAgIiAgIGNscmwgKCUwKStcbiIKLQkgICAgICIgICBqcmEgMmJcbiIKLQkgICAgICIucHJldmlvdXNcbiIKLQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICAgICAiICAgLmFsaWduIDRcbiIKLQkgICAgICIgICAubG9uZyAxYiwzYlxuIgotCSAgICAgIi5wcmV2aW91cyIKLQkgICAgIDogIj1hIih0byksICI9YSIoZnJvbSksICI9ZCIobikKLQkgICAgIDogIjAiKHRvKSwgIjEiKGZyb20pLCAiMiIoMCkKLQkgICAgIDogImQwIiwgIm1lbW9yeSIpOwotCWJyZWFrOwotICAgIGNhc2UgODoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIjE6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjM6IgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjQ6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIjU6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIiAgIGpyYSAzYlxuIgotCSAgICAgIi5wcmV2aW91c1xuIgotCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkgICAgICIgICAuYWxpZ24gNFxuIgotCSAgICAgIiAgIC5sb25nIDFiLDRiXG4iCi0JICAgICAiICAgLmxvbmcgMmIsNWJcbiIKLQkgICAgICIucHJldmlvdXMiCi0JICAgICA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pCi0JICAgICA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKDApCi0JICAgICA6ICJkMCIsICJtZW1vcnkiKTsKLQlicmVhazsKLSAgICBjYXNlIDEyOgotCV9fYXNtX18gX192b2xhdGlsZV9fCi0JICAgICgiMTogbW92ZXNsICglMSkrLCUlZDBcbiIKLQkgICAgICIgICBtb3ZlbCAlJWQwLCglMCkrXG4iCi0JICAgICAiMjogbW92ZXNsICglMSkrLCUlZDBcbiIKLQkgICAgICIgICBtb3ZlbCAlJWQwLCglMCkrXG4iCi0JICAgICAiMzogbW92ZXNsICglMSkrLCUlZDBcbiIKLQkgICAgICIgICBtb3ZlbCAlJWQwLCglMCkrXG4iCi0JICAgICAiNDoiCi0JICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCSAgICAgIiAgIC5ldmVuXG4iCi0JICAgICAiNTogYWRkcWwgIzQsJTJcbiIKLQkgICAgICIgICBjbHJsICglMCkrXG4iCi0JICAgICAiNjogYWRkcWwgIzQsJTJcbiIKLQkgICAgICIgICBjbHJsICglMCkrXG4iCi0JICAgICAiNzogYWRkcWwgIzQsJTJcbiIKLQkgICAgICIgICBjbHJsICglMCkrXG4iCi0JICAgICAiICAganJhIDRiXG4iCi0JICAgICAiLnByZXZpb3VzXG4iCi0JICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAgICAgIiAgIC5hbGlnbiA0XG4iCi0JICAgICAiICAgLmxvbmcgMWIsNWJcbiIKLQkgICAgICIgICAubG9uZyAyYiw2YlxuIgotCSAgICAgIiAgIC5sb25nIDNiLDdiXG4iCi0JICAgICAiLnByZXZpb3VzIgotCSAgICAgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQotCSAgICAgOiAiMCIodG8pLCAiMSIoZnJvbSksICIyIigwKQotCSAgICAgOiAiZDAiLCAibWVtb3J5Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxNjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIjE6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjM6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjQ6IG1vdmVzbCAoJTEpKywlJWQwXG4iCi0JICAgICAiICAgbW92ZWwgJSVkMCwoJTApK1xuIgotCSAgICAgIjU6IgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjY6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIjc6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIjg6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIjk6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAgY2xybCAoJTApK1xuIgotCSAgICAgIiAgIGpyYSA1YlxuIgotCSAgICAgIi5wcmV2aW91c1xuIgotCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkgICAgICIgICAuYWxpZ24gNFxuIgotCSAgICAgIiAgIC5sb25nIDFiLDZiXG4iCi0JICAgICAiICAgLmxvbmcgMmIsN2JcbiIKLQkgICAgICIgICAubG9uZyAzYiw4YlxuIgotCSAgICAgIiAgIC5sb25nIDRiLDliXG4iCi0JICAgICAiLnByZXZpb3VzIgotCSAgICAgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQotCSAgICAgOiAiMCIodG8pLCAiMSIoZnJvbSksICIyIigwKQotCSAgICAgOiAiZDAiLCAibWVtb3J5Iik7Ci0JYnJlYWs7Ci0gICAgZGVmYXVsdDoKLQlzd2l0Y2ggKG4gJiAzKSB7Ci0JY2FzZSAwOgotCSAgICBfX2NvcHlfZnJvbV91c2VyX2JpZyh0bywgZnJvbSwgbiwgIiIsICIiKTsKLQkgICAgYnJlYWs7CisJdW5zaWduZWQgbG9uZyByZXMgPSAwLCB0bXA7CisKKwlzd2l0Y2ggKG4pIHsKIAljYXNlIDE6Ci0JICAgIF9fY29weV9mcm9tX3VzZXJfYmlnKHRvLCBmcm9tLCBuLAotCQkJCSAvKiBmaXh1cCAqLwotCQkJCSAiMTogYWRkcWwgIzEsJTJcbiIKLQkJCQkgIiAgIGNscmIgKCUwKSsiLAotCQkJCSAvKiBjb3B5ICovCi0JCQkJICIyOiBtb3Zlc2IgKCUxKSssJSVkMFxuIgotCQkJCSAiICAgbW92ZWIgJSVkMCwoJTApK1xuIgotCQkJCSAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkJCSAiICAgLmxvbmcgMmIsMWJcbiIKLQkJCQkgIi5wcmV2aW91cyIpOwotCSAgICBicmVhazsKKwkJX19nZXRfdXNlcl9hc20ocmVzLCAqKHU4ICopdG8sICh1OCAqKWZyb20sIHU4LCBiLCBkLCAxKTsKKwkJYnJlYWs7CiAJY2FzZSAyOgotCSAgICBfX2NvcHlfZnJvbV91c2VyX2JpZyh0bywgZnJvbSwgbiwKLQkJCQkgLyogZml4dXAgKi8KLQkJCQkgIjE6IGFkZHFsICMyLCUyXG4iCi0JCQkJICIgICBjbHJ3ICglMCkrIiwKLQkJCQkgLyogY29weSAqLwotCQkJCSAiMjogbW92ZXN3ICglMSkrLCUlZDBcbiIKLQkJCQkgIiAgIG1vdmV3ICUlZDAsKCUwKStcbiIKLQkJCQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkJCQkgIiAgIC5sb25nIDJiLDFiXG4iCi0JCQkJICIucHJldmlvdXMiKTsKLQkgICAgYnJlYWs7CisJCV9fZ2V0X3VzZXJfYXNtKHJlcywgKih1MTYgKil0bywgKHUxNiAqKWZyb20sIHUxNiwgdywgZCwgMik7CisJCWJyZWFrOwogCWNhc2UgMzoKLQkgICAgX19jb3B5X2Zyb21fdXNlcl9iaWcodG8sIGZyb20sIG4sCi0JCQkJIC8qIGZpeHVwICovCi0JCQkJICIxOiBhZGRxbCAjMiwlMlxuIgotCQkJCSAiICAgY2xydyAoJTApK1xuIgotCQkJCSAiMjogYWRkcWwgIzEsJTJcbiIKLQkJCQkgIiAgIGNscmIgKCUwKSsiLAotCQkJCSAvKiBjb3B5ICovCi0JCQkJICIzOiBtb3Zlc3cgKCUxKSssJSVkMFxuIgotCQkJCSAiICAgbW92ZXcgJSVkMCwoJTApK1xuIgotCQkJCSAiNDogbW92ZXNiICglMSkrLCUlZDBcbiIKLQkJCQkgIiAgIG1vdmViICUlZDAsKCUwKStcbiIKLQkJCQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkJCQkgIiAgIC5sb25nIDNiLDFiXG4iCi0JCQkJICIgICAubG9uZyA0YiwyYlxuIgotCQkJCSAiLnByZXZpb3VzIik7Ci0JICAgIGJyZWFrOworCQlfX2NvbnN0YW50X2NvcHlfZnJvbV91c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDMsIHcsIGIsKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlfX2dldF91c2VyX2FzbShyZXMsICoodTMyICopdG8sICh1MzIgKilmcm9tLCB1MzIsIGwsIHIsIDQpOworCQlicmVhazsKKwljYXNlIDU6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNSwgbCwgYiwpOworCQlicmVhazsKKwljYXNlIDY6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNiwgbCwgdywpOworCQlicmVhazsKKwljYXNlIDc6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNywgbCwgdywgYik7CisJCWJyZWFrOworCWNhc2UgODoKKwkJX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCA4LCBsLCBsLCk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCA5LCBsLCBsLCBiKTsKKwkJYnJlYWs7CisJY2FzZSAxMDoKKwkJX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCAxMCwgbCwgbCwgdyk7CisJCWJyZWFrOworCWNhc2UgMTI6CisJCV9fY29uc3RhbnRfY29weV9mcm9tX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMTIsIGwsIGwsIGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiB3ZSBsaW1pdCB0aGUgaW5saW5lZCB2ZXJzaW9uIHRvIDMgbW92ZXMgKi8KKwkJcmV0dXJuIF9fZ2VuZXJpY19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7CiAJfQotCWJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gbjsKKworCXJldHVybiByZXM7CiB9CiAKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXJfYmlnKHRvLCBmcm9tLCBuLCBmaXh1cCwgY29weSkJXAotICAgIF9fYXNtX18gX192b2xhdGlsZV9fCQkJCVwKLQkoIjEwOiBtb3ZlbCAoJTEpKywlJWQwXG4iCQkJXAotCSAiMzE6IG1vdmVzbCAlJWQwLCglMCkrXG4iCQkJXAotCSAiMTE6IHN1YnFsICMxLCUyXG4iCQkJCVwKLQkgIiAgICBqbmUgMTBiXG4iCQkJCVwKLQkgIjQxOlxuIgkJCQkJXAotCSAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCVwKLQkgIiAgIC5ldmVuXG4iCQkJCQlcCi0JICIyMjogYWRkcWwgIzEsJTJcbiIJCQkJXAotCSAiMTI6IGxzbGwgIzIsJTJcbiIJCQkJXAotCSBmaXh1cCAiXG4iCQkJCQlcCi0JICIgICAganJhIDEzZlxuIgkJCQlcCi0JICIucHJldmlvdXNcbiIJCQkJCVwKLQkgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIJCQlcCi0JICIgICAgLmFsaWduIDRcbiIJCQkJXAotCSAiICAgIC5sb25nIDEwYiwyMmJcbiIJCQkJXAotCSAiICAgIC5sb25nIDMxYiwxMmJcbiIJCQkJXAotCSAiICAgIC5sb25nIDExYiwxMmJcbiIJCQkJXAotCSAiICAgIC5sb25nIDQxYiwyMmJcbiIJCQkJXAotCSAiLnByZXZpb3VzXG4iCQkJCQlcCi0JIGNvcHkgIlxuIgkJCQkJXAotCSAiMTM6IgkJCQkJCVwKLQkgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQkJXAotCSA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKG4vNCkJCQlcCi0JIDogImQwIiwgIm1lbW9yeSIpCisjZGVmaW5lIF9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIG4sIHMxLCBzMiwgczMpCVwKKwlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCQlcCisJCSIJbW92ZS4iI3MxIgkoJTIpKywlM1xuIgkJCVwKKwkJIjExOgltb3Zlcy4iI3MxIgklMywoJTEpK1xuIgkJCVwKKwkJIjEyOgltb3ZlLiIjczIiCSglMikrLCUzXG4iCQkJXAorCQkiMjE6CW1vdmVzLiIjczIiCSUzLCglMSkrXG4iCQkJXAorCQkiMjI6XG4iCQkJCQkJCVwKKwkJIgkuaWZuYwlcIiIjczMiXCIsXCJcIlxuIgkJCVwKKwkJIgltb3ZlLiIjczMiCSglMikrLCUzXG4iCQkJXAorCQkiMzE6CW1vdmVzLiIjczMiCSUzLCglMSkrXG4iCQkJXAorCQkiMzI6XG4iCQkJCQkJCVwKKwkJIgkuZW5kaWZcbiIJCQkJCVwKKwkJIjQ6XG4iCQkJCQkJCVwKKwkJIlxuIgkJCQkJCQlcCisJCSIJLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgkJCVwKKwkJIgkuYWxpZ24JNFxuIgkJCQkJXAorCQkiCS5sb25nCTExYiw1ZlxuIgkJCQlcCisJCSIJLmxvbmcJMTJiLDVmXG4iCQkJCVwKKwkJIgkubG9uZwkyMWIsNWZcbiIJCQkJXAorCQkiCS5sb25nCTIyYiw1ZlxuIgkJCQlcCisJCSIJLmlmbmMJXCIiI3MzIlwiLFwiXCJcbiIJCQlcCisJCSIJLmxvbmcJMzFiLDVmXG4iCQkJCVwKKwkJIgkubG9uZwkzMmIsNWZcbiIJCQkJXAorCQkiCS5lbmRpZlxuIgkJCQkJXAorCQkiCS5wcmV2aW91c1xuIgkJCQkJXAorCQkiXG4iCQkJCQkJCVwKKwkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCQkiCS5ldmVuXG4iCQkJCQlcCisJCSI1Ogltb3ZlcS5sCSMiI24iLCUwXG4iCQkJCVwKKwkJIglqcmEJNGJcbiIJCQkJCVwKKwkJIgkucHJldmlvdXNcbiIJCQkJCVwKKwkJOiAiK2QiIChyZXMpLCAiK2EiICh0byksICIrYSIgKGZyb20pLCAiPSZkIiAodG1wKQlcCisJCTogOiAibWVtb3J5IikKIAotI2RlZmluZSBfX2NvcHlfdG9fdXNlcl9pbmF0b21pYyBfX2NvcHlfdG9fdXNlcgotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljIF9fY29weV9mcm9tX3VzZXIKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKIF9fY29uc3RhbnRfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQogewotICAgIHN3aXRjaCAobikgewotICAgIGNhc2UgMDoKLQlicmVhazsKLSAgICBjYXNlIDE6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18KLQkgICAgKCIgICBtb3ZlYiAoJTEpKywlJWQwXG4iCi0JICAgICAiMjE6bW92ZXNiICUlZDAsKCUwKStcbiIKLQkgICAgICIxOlxuIgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjI6IGFkZHFsICMxLCUyXG4iCi0JICAgICAiICAganJhIDFiXG4iCi0JICAgICAiLnByZXZpb3VzXG4iCi0JICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAgICAgIiAgIC5hbGlnbiA0XG4gICIKLQkgICAgICIgICAubG9uZyAyMWIsMmJcbiIKLQkgICAgICIgICAubG9uZyAxYiwyYlxuIgotCSAgICAgIi5wcmV2aW91cyIKLQkgICAgIDogIj1hIih0byksICI9YSIoZnJvbSksICI9ZCIobikKLQkgICAgIDogIjAiKHRvKSwgIjEiKGZyb20pLCAiMiIoMCkKLQkgICAgIDogImQwIiwgIm1lbW9yeSIpOwotCWJyZWFrOwotICAgIGNhc2UgMjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIiAgIG1vdmV3ICglMSkrLCUlZDBcbiIKLQkgICAgICIyMTptb3Zlc3cgJSVkMCwoJTApK1xuIgotCSAgICAgIjE6XG4iCi0JICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCSAgICAgIiAgIC5ldmVuXG4iCi0JICAgICAiMjogYWRkcWwgIzIsJTJcbiIKLQkgICAgICIgICBqcmEgMWJcbiIKLQkgICAgICIucHJldmlvdXNcbiIKLQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICAgICAiICAgLmFsaWduIDRcbiIKLQkgICAgICIgICAubG9uZyAyMWIsMmJcbiIKLQkgICAgICIgICAubG9uZyAxYiwyYlxuIgotCSAgICAgIi5wcmV2aW91cyIKLQkgICAgIDogIj1hIih0byksICI9YSIoZnJvbSksICI9ZCIobikKLQkgICAgIDogIjAiKHRvKSwgIjEiKGZyb20pLCAiMiIoMCkKLQkgICAgIDogImQwIiwgIm1lbW9yeSIpOwotCWJyZWFrOwotICAgIGNhc2UgMzoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIiAgIG1vdmV3ICglMSkrLCUlZDBcbiIKLQkgICAgICIyMTptb3Zlc3cgJSVkMCwoJTApK1xuIgotCSAgICAgIjE6IG1vdmViICglMSkrLCUlZDBcbiIKLQkgICAgICIyMjptb3Zlc2IgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6XG4iCi0JICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCSAgICAgIiAgIC5ldmVuXG4iCi0JICAgICAiMzogYWRkcWwgIzIsJTJcbiIKLQkgICAgICI0OiBhZGRxbCAjMSwlMlxuIgotCSAgICAgIiAgIGpyYSAyYlxuIgotCSAgICAgIi5wcmV2aW91c1xuIgotCSAgICAgIi5zZWN0aW9uIF9fZXhfdGFibGUsXCJhXCJcbiIKLQkgICAgICIgICAuYWxpZ24gNFxuIgotCSAgICAgIiAgIC5sb25nIDIxYiwzYlxuIgotCSAgICAgIiAgIC5sb25nIDFiLDNiXG4iCi0JICAgICAiICAgLmxvbmcgMjJiLDRiXG4iCi0JICAgICAiICAgLmxvbmcgMmIsNGJcbiIKLQkgICAgICIucHJldmlvdXMiCi0JICAgICA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pCi0JICAgICA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKDApCi0JICAgICA6ICJkMCIsICJtZW1vcnkiKTsKLQlicmVhazsKLSAgICBjYXNlIDQ6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18KLQkgICAgKCIgICBtb3ZlbCAoJTEpKywlJWQwXG4iCi0JICAgICAiMjE6bW92ZXNsICUlZDAsKCUwKStcbiIKLQkgICAgICIxOlxuIgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjI6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAganJhIDFiXG4iCi0JICAgICAiLnByZXZpb3VzXG4iCi0JICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAgICAgIiAgIC5hbGlnbiA0XG4iCi0JICAgICAiICAgLmxvbmcgMjFiLDJiXG4iCi0JICAgICAiICAgLmxvbmcgMWIsMmJcbiIKLQkgICAgICIucHJldmlvdXMiCi0JICAgICA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pCi0JICAgICA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKDApCi0JICAgICA6ICJkMCIsICJtZW1vcnkiKTsKLQlicmVhazsKLSAgICBjYXNlIDg6Ci0JX19hc21fXyBfX3ZvbGF0aWxlX18KLQkgICAgKCIgICBtb3ZlbCAoJTEpKywlJWQwXG4iCi0JICAgICAiMjE6bW92ZXNsICUlZDAsKCUwKStcbiIKLQkgICAgICIxOiBtb3ZlbCAoJTEpKywlJWQwXG4iCi0JICAgICAiMjI6bW92ZXNsICUlZDAsKCUwKStcbiIKLQkgICAgICIyOlxuIgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjM6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiNDogYWRkcWwgIzQsJTJcbiIKLQkgICAgICIgICBqcmEgMmJcbiIKLQkgICAgICIucHJldmlvdXNcbiIKLQkgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICAgICAiICAgLmFsaWduIDRcbiIKLQkgICAgICIgICAubG9uZyAyMWIsM2JcbiIKLQkgICAgICIgICAubG9uZyAxYiwzYlxuIgotCSAgICAgIiAgIC5sb25nIDIyYiw0YlxuIgotCSAgICAgIiAgIC5sb25nIDJiLDRiXG4iCi0JICAgICAiLnByZXZpb3VzIgotCSAgICAgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQotCSAgICAgOiAiMCIodG8pLCAiMSIoZnJvbSksICIyIigwKQotCSAgICAgOiAiZDAiLCAibWVtb3J5Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxMjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIiAgIG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMTptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjE6IG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMjptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6IG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMzptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjM6XG4iCi0JICAgICAiLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgotCSAgICAgIiAgIC5ldmVuXG4iCi0JICAgICAiNDogYWRkcWwgIzQsJTJcbiIKLQkgICAgICI1OiBhZGRxbCAjNCwlMlxuIgotCSAgICAgIjY6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAganJhIDNiXG4iCi0JICAgICAiLnByZXZpb3VzXG4iCi0JICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAgICAgIiAgIC5hbGlnbiA0XG4iCi0JICAgICAiICAgLmxvbmcgMjFiLDRiXG4iCi0JICAgICAiICAgLmxvbmcgMWIsNGJcbiIKLQkgICAgICIgICAubG9uZyAyMmIsNWJcbiIKLQkgICAgICIgICAubG9uZyAyYiw1YlxuIgotCSAgICAgIiAgIC5sb25nIDIzYiw2YlxuIgotCSAgICAgIiAgIC5sb25nIDNiLDZiXG4iCi0JICAgICAiLnByZXZpb3VzIgotCSAgICAgOiAiPWEiKHRvKSwgIj1hIihmcm9tKSwgIj1kIihuKQotCSAgICAgOiAiMCIodG8pLCAiMSIoZnJvbSksICIyIigwKQotCSAgICAgOiAiZDAiLCAibWVtb3J5Iik7Ci0JYnJlYWs7Ci0gICAgY2FzZSAxNjoKLQlfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSAgICAoIiAgIG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMTptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjE6IG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMjptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjI6IG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyMzptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjM6IG1vdmVsICglMSkrLCUlZDBcbiIKLQkgICAgICIyNDptb3Zlc2wgJSVkMCwoJTApK1xuIgotCSAgICAgIjQ6IgotCSAgICAgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkgICAgICIgICAuZXZlblxuIgotCSAgICAgIjU6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiNjogYWRkcWwgIzQsJTJcbiIKLQkgICAgICI3OiBhZGRxbCAjNCwlMlxuIgotCSAgICAgIjg6IGFkZHFsICM0LCUyXG4iCi0JICAgICAiICAganJhIDRiXG4iCi0JICAgICAiLnByZXZpb3VzXG4iCi0JICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCSAgICAgIiAgIC5hbGlnbiA0XG4iCi0JICAgICAiICAgLmxvbmcgMjFiLDViXG4iCi0JICAgICAiICAgLmxvbmcgMWIsNWJcbiIKLQkgICAgICIgICAubG9uZyAyMmIsNmJcbiIKLQkgICAgICIgICAubG9uZyAyYiw2YlxuIgotCSAgICAgIiAgIC5sb25nIDIzYiw3YlxuIgotCSAgICAgIiAgIC5sb25nIDNiLDdiXG4iCi0JICAgICAiICAgLmxvbmcgMjRiLDhiXG4iCi0JICAgICAiICAgLmxvbmcgNGIsOGJcbiIKLQkgICAgICIucHJldmlvdXMiCi0JICAgICA6ICI9YSIodG8pLCAiPWEiKGZyb20pLCAiPWQiKG4pCi0JICAgICA6ICIwIih0byksICIxIihmcm9tKSwgIjIiKDApCi0JICAgICA6ICJkMCIsICJtZW1vcnkiKTsKLQlicmVhazsKLSAgICBkZWZhdWx0OgotCXN3aXRjaCAobiAmIDMpIHsKLQljYXNlIDA6Ci0JICAgIF9fY29weV90b191c2VyX2JpZyh0bywgZnJvbSwgbiwgIiIsICIiKTsKLQkgICAgYnJlYWs7CisJdW5zaWduZWQgbG9uZyByZXMgPSAwLCB0bXA7CisKKwlzd2l0Y2ggKG4pIHsKIAljYXNlIDE6Ci0JICAgIF9fY29weV90b191c2VyX2JpZyh0bywgZnJvbSwgbiwKLQkJCSAgICAgICAvKiBmaXh1cCAqLwotCQkJICAgICAgICIxOiBhZGRxbCAjMSwlMiIsCi0JCQkgICAgICAgLyogY29weSAqLwotCQkJICAgICAgICIgICBtb3ZlYiAoJTEpKywlJWQwXG4iCi0JCQkgICAgICAgIjIyOm1vdmVzYiAlJWQwLCglMCkrXG4iCi0JCQkgICAgICAgIjI6IgotCQkJICAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgICAgICAgIiAgIC5sb25nIDIyYiwxYlxuIgotCQkJICAgICAgICIgICAubG9uZyAyYiwxYlxuIgotCQkJICAgICAgICIucHJldmlvdXMiKTsKLQkgICAgYnJlYWs7CisJCV9fcHV0X3VzZXJfYXNtKHJlcywgKih1OCAqKWZyb20sICh1OCAqKXRvLCBiLCBkLCAxKTsKKwkJYnJlYWs7CiAJY2FzZSAyOgotCSAgICBfX2NvcHlfdG9fdXNlcl9iaWcodG8sIGZyb20sIG4sCi0JCQkgICAgICAgLyogZml4dXAgKi8KLQkJCSAgICAgICAiMTogYWRkcWwgIzIsJTIiLAotCQkJICAgICAgIC8qIGNvcHkgKi8KLQkJCSAgICAgICAiICAgbW92ZXcgKCUxKSssJSVkMFxuIgotCQkJICAgICAgICIyMjptb3Zlc3cgJSVkMCwoJTApK1xuIgotCQkJICAgICAgICIyOiIKLQkJCSAgICAgICAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkJICAgICAgICIgICAubG9uZyAyMmIsMWJcbiIKLQkJCSAgICAgICAiICAgLmxvbmcgMmIsMWJcbiIKLQkJCSAgICAgICAiLnByZXZpb3VzIik7Ci0JICAgIGJyZWFrOworCQlfX3B1dF91c2VyX2FzbShyZXMsICoodTE2ICopZnJvbSwgKHUxNiAqKXRvLCB3LCBkLCAyKTsKKwkJYnJlYWs7CiAJY2FzZSAzOgotCSAgICBfX2NvcHlfdG9fdXNlcl9iaWcodG8sIGZyb20sIG4sCi0JCQkgICAgICAgLyogZml4dXAgKi8KLQkJCSAgICAgICAiMTogYWRkcWwgIzIsJTJcbiIKLQkJCSAgICAgICAiMjogYWRkcWwgIzEsJTIiLAotCQkJICAgICAgIC8qIGNvcHkgKi8KLQkJCSAgICAgICAiICAgbW92ZXcgKCUxKSssJSVkMFxuIgotCQkJICAgICAgICIyMzptb3Zlc3cgJSVkMCwoJTApK1xuIgotCQkJICAgICAgICIzOiBtb3ZlYiAoJTEpKywlJWQwXG4iCi0JCQkgICAgICAgIjI0Om1vdmVzYiAlJWQwLCglMCkrXG4iCi0JCQkgICAgICAgIjQ6IgotCQkJICAgICAgICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JCQkgICAgICAgIiAgIC5sb25nIDIzYiwxYlxuIgotCQkJICAgICAgICIgICAubG9uZyAzYiwxYlxuIgotCQkJICAgICAgICIgICAubG9uZyAyNGIsMmJcbiIKLQkJCSAgICAgICAiICAgLmxvbmcgNGIsMmJcbiIKLQkJCSAgICAgICAiLnByZXZpb3VzIik7Ci0JICAgIGJyZWFrOworCQlfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCAzLCB3LCBiLCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJX19wdXRfdXNlcl9hc20ocmVzLCAqKHUzMiAqKWZyb20sICh1MzIgKil0bywgbCwgciwgNCk7CisJCWJyZWFrOworCWNhc2UgNToKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgNSwgbCwgYiwpOworCQlicmVhazsKKwljYXNlIDY6CisJCV9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDYsIGwsIHcsKTsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQlfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCA3LCBsLCB3LCBiKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQlfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCA4LCBsLCBsLCk7CisJCWJyZWFrOworCWNhc2UgOToKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgOSwgbCwgbCwgYik7CisJCWJyZWFrOworCWNhc2UgMTA6CisJCV9fY29uc3RhbnRfY29weV90b191c2VyX2FzbShyZXMsIHRvLCBmcm9tLCB0bXAsIDEwLCBsLCBsLCB3KTsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJX19jb25zdGFudF9jb3B5X3RvX3VzZXJfYXNtKHJlcywgdG8sIGZyb20sIHRtcCwgMTIsIGwsIGwsIGwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBsaW1pdCB0aGUgaW5saW5lZCB2ZXJzaW9uIHRvIDMgbW92ZXMgKi8KKwkJcmV0dXJuIF9fZ2VuZXJpY19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pOwogCX0KLQlicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIG47CisKKwlyZXR1cm4gcmVzOwogfQogCi0jZGVmaW5lIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJXAorI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKQkJXAogKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8JCQlcCiAgX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikgOglcCiAgX19nZW5lcmljX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSkKIAotI2RlZmluZSBjb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCQlcCisjZGVmaW5lIF9fY29weV90b191c2VyKHRvLCBmcm9tLCBuKQkJXAogKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8JCQlcCiAgX19jb25zdGFudF9jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIDoJCVwKICBfX2dlbmVyaWNfY29weV90b191c2VyKHRvLCBmcm9tLCBuKSkKIAotI2RlZmluZSBfX2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKSBjb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbikKLSNkZWZpbmUgX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pIGNvcHlfdG9fdXNlcih0bywgZnJvbSwgbikKKyNkZWZpbmUgX19jb3B5X3RvX3VzZXJfaW5hdG9taWMJCV9fY29weV90b191c2VyCisjZGVmaW5lIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMJX19jb3B5X2Zyb21fdXNlcgogCi0vKgotICogQ29weSBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgZnJvbSB1c2Vyc3BhY2UuCi0gKi8KKyNkZWZpbmUgY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCV9fY29weV9mcm9tX3VzZXIodG8sIGZyb20sIG4pCisjZGVmaW5lIGNvcHlfdG9fdXNlcih0bywgZnJvbSwgbikJX19jb3B5X3RvX3VzZXIodG8sIGZyb20sIG4pCiAKLXN0YXRpYyBpbmxpbmUgbG9uZwotc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KQotewotICAgIGxvbmcgcmVzOwotICAgIGlmIChjb3VudCA9PSAwKSByZXR1cm4gY291bnQ7Ci0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18KLQkoIjE6IG1vdmVzYiAoJTIpKywlJWQwXG4iCi0JICIxMjptb3ZlYiAlJWQwLCglMSkrXG4iCi0JICIgICBqZXEgMmZcbiIKLQkgIiAgIHN1YnFsICMxLCUzXG4iCi0JICIgICBqbmUgMWJcbiIKLQkgIjI6IHN1YmwgJTMsJTBcbiIKLQkgIjM6XG4iCi0JICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JICIgICAuZXZlblxuIgotCSAiNDogbW92ZWwgJTQsJTBcbiIKLQkgIiAgIGpyYSAzYlxuIgotCSAiLnByZXZpb3VzXG4iCi0JICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICIgICAuYWxpZ24gNFxuIgotCSAiICAgLmxvbmcgMWIsNGJcbiIKLQkgIiAgIC5sb25nIDEyYiw0YlxuIgotCSAiLnByZXZpb3VzIgotCSA6ICI9ZCIocmVzKSwgIj1hIihkc3QpLCAiPWEiKHNyYyksICI9ZCIoY291bnQpCi0JIDogImkiKC1FRkFVTFQpLCAiMCIoY291bnQpLCAiMSIoZHN0KSwgIjIiKHNyYyksICIzIihjb3VudCkKLQkgOiAiZDAiLCAibWVtb3J5Iik7Ci0gICAgcmV0dXJuIHJlczsKLX0KLQotLyoKLSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhIHN0cmluZyAoaW5jbHVkaW5nIHRoZSBlbmRpbmcgMCkKLSAqCi0gKiBSZXR1cm4gMCBvbiBleGNlcHRpb24sIGEgdmFsdWUgZ3JlYXRlciB0aGFuIE4gaWYgdG9vIGxvbmcKLSAqLwotc3RhdGljIGlubGluZSBsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIG4pCi17Ci0JbG9uZyByZXM7Ci0KLQlyZXMgPSAtKHVuc2lnbmVkIGxvbmcpc3JjOwotCV9fYXNtX18gX192b2xhdGlsZV9fCi0JCSgiMTpcbiIKLQkJICIgICB0c3RsICUyXG4iCi0JCSAiICAgamVxIDNmXG4iCi0JCSAiMjogbW92ZXNiICglMSkrLCUlZDBcbiIKLQkJICIyMjpcbiIKLQkJICIgICBzdWJxbCAjMSwlMlxuIgotCQkgIiAgIHRzdGIgJSVkMFxuIgotCQkgIiAgIGpuZSAxYlxuIgotCQkgIiAgIGpyYSA0ZlxuIgotCQkgIjM6XG4iCi0JCSAiICAgYWRkcWwgIzEsJTBcbiIKLQkJICI0OlxuIgotCQkgIiAgIGFkZGwgJTEsJTBcbiIKLQkJICI1OlxuIgotCQkgIi5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKLQkJICIgICAuZXZlblxuIgotCQkgIjY6IG1vdmVxICUzLCUwXG4iCi0JCSAiICAganJhIDViXG4iCi0JCSAiLnByZXZpb3VzXG4iCi0JCSAiLnNlY3Rpb24gX19leF90YWJsZSxcImFcIlxuIgotCQkgIiAgIC5hbGlnbiA0XG4iCi0JCSAiICAgLmxvbmcgMmIsNmJcbiIKLQkJICIgICAubG9uZyAyMmIsNmJcbiIKLQkJICIucHJldmlvdXMiCi0JCSA6ICI9ZCIocmVzKSwgIj1hIihzcmMpLCAiPWQiKG4pCi0JCSA6ICJpIigwKSwgIjAiKHJlcyksICIxIihzcmMpLCAiMiIobikKLQkJIDogImQwIik7Ci0JcmV0dXJuIHJlczsKLX0KK2xvbmcgc3RybmNweV9mcm9tX3VzZXIoY2hhciAqZHN0LCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBsb25nIGNvdW50KTsKK2xvbmcgc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIGxvbmcgbik7Cit1bnNpZ25lZCBsb25nIGNsZWFyX3VzZXIodm9pZCBfX3VzZXIgKnRvLCB1bnNpZ25lZCBsb25nIG4pOwogCiAjZGVmaW5lIHN0cmxlbl91c2VyKHN0cikgc3Rybmxlbl91c2VyKHN0ciwgMzI3NjcpCiAKLS8qCi0gKiBaZXJvIFVzZXJzcGFjZQotICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwotY2xlYXJfdXNlcih2b2lkIF9fdXNlciAqdG8sIHVuc2lnbmVkIGxvbmcgbikKLXsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXwotCSgiICAgdHN0bCAlMVxuIgotCSAiICAgamVxIDNmXG4iCi0JICIxOiBtb3Zlc2wgJTMsKCUwKStcbiIKLQkgIjI6IHN1YnFsICMxLCUxXG4iCi0JICIgICBqbmUgMWJcbiIKLQkgIjM6IG1vdmVsICUyLCUxXG4iCi0JICIgICBiY2xyICMxLCUxXG4iCi0JICIgICBqZXEgNGZcbiIKLQkgIjI0Om1vdmVzdyAlMywoJTApK1xuIgotCSAiNDogYmNsciAjMCwlMVxuIgotCSAiICAgamVxIDVmXG4iCi0JICIyNTptb3Zlc2IgJTMsKCUwKStcbiIKLQkgIjU6XG4iCi0JICIuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCi0JICIgICAuZXZlblxuIgotCSAiNjE6YWRkcWwgIzEsJTFcbiIKLQkgIjY6IGxzbGwgIzIsJTFcbiIKLQkgIiAgIGFkZGwgJTIsJTFcbiIKLQkgIiAgIGpyYSA1YlxuIgotCSAiNzogYWRkcWwgIzIsJTFcbiIKLQkgIiAgIGpyYSA1YlxuIgotCSAiODogYWRkcWwgIzEsJTFcbiIKLQkgIiAgIGpyYSA1YlxuIgotCSAiLnByZXZpb3VzXG4iCi0JICIuc2VjdGlvbiBfX2V4X3RhYmxlLFwiYVwiXG4iCi0JICIgICAuYWxpZ24gNFxuIgotCSAiICAgLmxvbmcgMWIsNjFiXG4iCi0JICIgICAubG9uZyAyYiw2YlxuIgotCSAiICAgLmxvbmcgM2IsNjFiXG4iCi0JICIgICAubG9uZyAyNGIsN2JcbiIKLQkgIiAgIC5sb25nIDRiLDdiXG4iCi0JICIgICAubG9uZyAyNWIsOGJcbiIKLQkgIiAgIC5sb25nIDViLDhiXG4iCi0JICIucHJldmlvdXMiCi0JIDogIj1hIih0byksICI9ZCIobikKLQkgOiAiciIobiAmIDMpLCAiciIoMCksICIwIih0byksICIxIihuLzQpKTsKLSAgICByZXR1cm4gbjsKLX0KLQogI2VuZGlmIC8qIF9NNjhLX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4ay91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLW02OGsvdW5pc3RkLmgKaW5kZXggZjIzNmZlOS4uN2MwYjYyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbTY4ay91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrL3VuaXN0ZC5oCkBAIC00MTAsNDYgKzQxMCw3IEBACiAKICNpZmRlZiBfX0tFUk5FTF9TWVNDQUxMU19fCiAKLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLS8qCi0gKiB3ZSBuZWVkIHRoaXMgaW5saW5lIC0gZm9ya2luZyBmcm9tIGtlcm5lbCBzcGFjZSB3aWxsIHJlc3VsdAotICogaW4gTk8gQ09QWSBPTiBXUklURSAoISEhKSwgdW50aWwgYW4gZXhlY3ZlIGlzIGV4ZWN1dGVkLiBUaGlzCi0gKiBpcyBubyBwcm9ibGVtLCBidXQgZm9yIHRoZSBzdGFjay4gVGhpcyBpcyBoYW5kbGVkIGJ5IG5vdCBsZXR0aW5nCi0gKiBtYWluKCkgdXNlIHRoZSBzdGFjayBhdCBhbGwgYWZ0ZXIgZm9yaygpLiBUaHVzLCBubyBmdW5jdGlvbgotICogY2FsbHMgLSB3aGljaCBtZWFucyBpbmxpbmUgY29kZSBmb3IgZm9yayB0b28sIGFzIG90aGVyd2lzZSB3ZQotICogd291bGQgdXNlIHRoZSBzdGFjayB1cG9uIGV4aXQgZnJvbSAnZm9yaygpJy4KLSAqCi0gKiBBY3R1YWxseSBvbmx5IHBhdXNlIGFuZCBmb3JrIGFyZSBuZWVkZWQgaW5saW5lLCBzbyB0aGF0IHRoZXJlCi0gKiB3b24ndCBiZSBhbnkgbWVzc2luZyB3aXRoIHRoZSBzdGFjayBmcm9tIG1haW4oKSwgYnV0IHdlIGRlZmluZQotICogc29tZSBvdGhlcnMgdG9vLgotICovCi0jZGVmaW5lIF9fTlJfX2V4aXQgX19OUl9leGl0Ci1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMChwaWRfdCxzZXRzaWQpCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQsd3JpdGUsaW50LGZkLGNvbnN0IGNoYXIgKixidWYsb2ZmX3QsY291bnQpCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQscmVhZCxpbnQsZmQsY2hhciAqLGJ1ZixvZmZfdCxjb3VudCkKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwzKG9mZl90LGxzZWVrLGludCxmZCxvZmZfdCxvZmZzZXQsaW50LGNvdW50KQotc3RhdGljIGlubGluZSBfc3lzY2FsbDEoaW50LGR1cCxpbnQsZmQpCiBzdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQsZXhlY3ZlLGNvbnN0IGNoYXIgKixmaWxlLGNoYXIgKiosYXJndixjaGFyICoqLGVudnApCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMyhpbnQsb3Blbixjb25zdCBjaGFyICosZmlsZSxpbnQsZmxhZyxpbnQsbW9kZSkKLXN0YXRpYyBpbmxpbmUgX3N5c2NhbGwxKGludCxjbG9zZSxpbnQsZmQpCi1zdGF0aWMgaW5saW5lIF9zeXNjYWxsMShpbnQsX2V4aXQsaW50LGV4aXRjb2RlKQotc3RhdGljIGlubGluZSBfc3lzY2FsbDMocGlkX3Qsd2FpdHBpZCxwaWRfdCxwaWQsaW50ICosd2FpdF9zdGF0LGludCxvcHRpb25zKQotCi1hc21saW5rYWdlIGxvbmcgc3lzX21tYXAyKAotCQkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkJCXVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkJCXVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgcGdvZmYpOwotYXNtbGlua2FnZSBpbnQgc3lzX2V4ZWN2ZShjaGFyICpuYW1lLCBjaGFyICoqYXJndiwgY2hhciAqKmVudnApOwotYXNtbGlua2FnZSBpbnQgc3lzX3BpcGUodW5zaWduZWQgbG9uZyAqZmlsZGVzKTsKLXN0cnVjdCBwdF9yZWdzOwotc3RydWN0IHNpZ2FjdGlvbjsKLWFzbWxpbmthZ2UgbG9uZyBzeXNfcnRfc2lnYWN0aW9uKGludCBzaWcsCi0JCQkJY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiBfX3VzZXIgKmFjdCwKLQkJCQlzdHJ1Y3Qgc2lnYWN0aW9uIF9fdXNlciAqb2FjdCwKLQkJCQlzaXplX3Qgc2lnc2V0c2l6ZSk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9TWVNDQUxMU19fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaCBiL2luY2x1ZGUvYXNtLW02OGtub21tdS9pcnEuaAppbmRleCAyYjQwODg0Li5jNTI0NzUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L2lycS5oCkBAIC04Nyw4ICs4Nyw0IEBACiAjZGVmaW5lIGRpc2FibGVfaXJxKHgpCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZGlzYWJsZV9pcnFfbm9zeW5jKHgpCWRpc2FibGVfaXJxKHgpCiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2VuZGlmIC8qIF9NNjhLX0lSUV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbTY4a25vbW11L3B0cmFjZS5oIGIvaW5jbHVkZS9hc20tbTY4a25vbW11L3B0cmFjZS5oCmluZGV4IGY2NWJkOTAuLjFlMTljNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW02OGtub21tdS9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1tNjhrbm9tbXUvcHRyYWNlLmgKQEAgLTcwLDcgKzcwLDcgQEAKIC8qIEFyYml0cmFyaWx5IGNob29zZSB0aGUgc2FtZSBwdHJhY2UgbnVtYmVycyBhcyB1c2VkIGJ5IHRoZSBTcGFyYyBjb2RlLiAqLwogI2RlZmluZSBQVFJBQ0VfR0VUUkVHUyAgICAgICAgICAgIDEyCiAjZGVmaW5lIFBUUkFDRV9TRVRSRUdTICAgICAgICAgICAgMTMKLSNpZmRlZiBDT0ZOSUdfRlBVCisjaWZkZWYgQ09ORklHX0ZQVQogI2RlZmluZSBQVFJBQ0VfR0VURlBSRUdTICAgICAgICAgIDE0CiAjZGVmaW5lIFBUUkFDRV9TRVRGUFJFR1MgICAgICAgICAgMTUKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaCBiL2luY2x1ZGUvYXNtLW1pcHMvY29tcGF0LmgKaW5kZXggOTg2NTExZC4uOTAwZjQ3MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9jb21wYXQuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL2NvbXBhdC5oCkBAIC0xNDUsOCArMTQ1LDUgQEAKIAogCXJldHVybiAodm9pZCBfX3VzZXIgKikgKHJlZ3MtPnJlZ3NbMjldIC0gbGVuKTsKIH0KLSNpZiBkZWZpbmVkIChfX01JUFNFTF9fKQotI2RlZmluZSBfX0NPTVBBVF9FTkRJQU5fU1dBUF9fIAkxCi0jZW5kaWYKIAogI2VuZGlmIC8qIF9BU01fQ09NUEFUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmgKaW5kZXggNWMzZTJhMy4uZDdjYmFjZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmgKQEAgLTM5LDcgKzM5LDEyIEBACiAjZGVmaW5lIFBTQzBfQkFTRV9BRERSCQkweGIxYTAwMDAwCiAjZGVmaW5lIFBTQzFfQkFTRV9BRERSCQkweGIxYjAwMDAwCiAjZGVmaW5lIFBTQzJfQkFTRV9BRERSCQkweGIwYTAwMDAwCi0jZGVmaW5lIFBTQzNfQkFTRV9BRERSCQkweGIwZDAwMDAwCisjZGVmaW5lIFBTQzNfQkFTRV9BRERSCQkweGIwYjAwMDAwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TT0NfQVUxMjAwCisjZGVmaW5lIFBTQzBfQkFTRV9BRERSCQkweGIxYTAwMDAwCisjZGVmaW5lIFBTQzFfQkFTRV9BRERSCQkweGIxYjAwMDAwCiAjZW5kaWYKIAogLyogVGhlIFBTQyBzZWxlY3QgYW5kIGNvbnRyb2wgcmVnaXN0ZXJzIGFyZSBjb21tb24gdG8KQEAgLTIyNyw2ICsyMzIsOCBAQAogI2RlZmluZSBQU0NfSTJTQ0ZHX0REX0RJU0FCTEUJKDEgPDwgMjcpCiAjZGVmaW5lIFBTQ19JMlNDRkdfREVfRU5BQkxFCSgxIDw8IDI2KQogI2RlZmluZSBQU0NfSTJTQ0ZHX1NFVF9XUyh4KQkoKCgoKHgpIC8gMikgLSAxKSAmIDB4N2YpIDw8IDE2KQorI2RlZmluZSBQU0NfSTJTQ0ZHX1dTKG4pCSgobiAmIDB4RkYpIDw8IDE2KQorI2RlZmluZSBQU0NfSTJTQ0ZHX1dTX01BU0sJKFBTQ19JMlNDRkdfV1MoMHgzRikpCiAjZGVmaW5lIFBTQ19JMlNDRkdfV0kJCSgxIDw8IDE1KQogCiAjZGVmaW5lIFBTQ19JMlNDRkdfRElWX01BU0sJKDMgPDwgMTMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwL2RiMXgwMC5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWRiMXgwMC9kYjF4MDAuaAppbmRleCA4ZmJiNGI0Li4wZjVmNGMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtZGIxeDAwL2RiMXgwMC5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1kYjF4MDAvZGIxeDAwLmgKQEAgLTMwLDggKzMwLDIwIEBACiAKIAogI2lmZGVmIENPTkZJR19NSVBTX0RCMTU1MAorCisjZGVmaW5lIERCRE1BX0FDOTdfVFhfQ0hBTiBEU0NSX0NNRDBfUFNDMV9UWAorI2RlZmluZSBEQkRNQV9BQzk3X1JYX0NIQU4gRFNDUl9DTUQwX1BTQzFfUlgKKyNkZWZpbmUgREJETUFfSTJTX1RYX0NIQU4gIERTQ1JfQ01EMF9QU0MzX1RYCisjZGVmaW5lIERCRE1BX0kyU19SWF9DSEFOICBEU0NSX0NNRDBfUFNDM19SWAorCisjZGVmaW5lIFNQSV9QU0NfQkFTRSAgICAgICBQU0MwX0JBU0VfQUREUgorI2RlZmluZSBBQzk3X1BTQ19CQVNFICAgICAgUFNDMV9CQVNFX0FERFIKKyNkZWZpbmUgU01CVVNfUFNDX0JBU0UgICAgIFBTQzJfQkFTRV9BRERSCisjZGVmaW5lIEkyU19QU0NfQkFTRSAgICAgICBQU0MzX0JBU0VfQUREUgorCiAjZGVmaW5lIEJDU1JfS1NFRzFfQUREUiAweEFGMDAwMDAwCiAjZGVmaW5lIE5BTkRfUEhZU19BRERSICAweDIwMDAwMDAwCisKICNlbHNlCiAjZGVmaW5lIEJDU1JfS1NFRzFfQUREUiAweEFFMDAwMDAwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvbWFjaC1nZW5lcmljL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKaW5kZXggNjgyYTU4NS4uODNjZDY5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWdlbmVyaWMvZmxvcHB5LmgKQEAgLTk4LDcgKzk4LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZkX3JlcXVlc3RfaXJxKHZvaWQpCiB7CiAJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JICAgICAgICAgICAgICAgICAgIFNBX0lOVEVSUlVQVCB8IFNBX1NBTVBMRV9SQU5ET00sICJmbG9wcHkiLCBOVUxMKTsKKwkgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBULCAiZmxvcHB5IiwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmZF9mcmVlX2lycSh2b2lkKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tbWlwcy9tYWNoLWphenovZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9mbG9wcHkuaAppbmRleCBjOWRhZDk5Li45NDEzMTE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1taXBzL21hY2gtamF6ei9mbG9wcHkuaApAQCAtOTAsNyArOTAsNyBAQAogc3RhdGljIGlubGluZSBpbnQgZmRfcmVxdWVzdF9pcnEodm9pZCkKIHsKIAlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkgICAgICAgICAgICAgICAgICAgU0FfSU5URVJSVVBUIHwgU0FfU0FNUExFX1JBTkRPTSwgImZsb3BweSIsIE5VTEwpOworCSAgICAgICAgICAgICAgICAgICBTQV9JTlRFUlJVUFQsICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZkX2ZyZWVfaXJxKHZvaWQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1taXBzL21tem9uZS5oIGIvaW5jbHVkZS9hc20tbWlwcy9tbXpvbmUuaAppbmRleCBkYzIzMWM4Li5mNTNlYzU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1taXBzL21tem9uZS5oCisrKyBiL2luY2x1ZGUvYXNtLW1pcHMvbW16b25lLmgKQEAgLTEwLDcgKzEwLDYgQEAKIAogI2lmZGVmIENPTkZJR19ESVNDT05USUdNRU0KIAotI2RlZmluZSBrdmFkZHJfdG9fbmlkKGt2YWRkcikJcGFfdG9fbmlkKF9fcGEoa3ZhZGRyKSkKICNkZWZpbmUgcGZuX3RvX25pZChwZm4pCQlwYV90b19uaWQoKHBmbikgPDwgUEFHRV9TSElGVCkKIAogI2VuZGlmIC8qIENPTkZJR19ESVNDT05USUdNRU0gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLW1pcHMvdmdhLmggYi9pbmNsdWRlL2FzbS1taXBzL3ZnYS5oCmluZGV4IDM0NzU1YzAuLmMxZGQwYjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLW1pcHMvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20tbWlwcy92Z2EuaApAQCAtMTMsNyArMTMsNyBAQAogICoJYWNjZXNzIHRoZSB2aWRlb3JhbSBkaXJlY3RseSB3aXRob3V0IGFueSBibGFjayBtYWdpYy4KICAqLwogCi0jZGVmaW5lIFZHQV9NQVBfTUVNKHgpCSgweGIwMDAwMDAwTCArICh1bnNpZ25lZCBsb25nKSh4KSkKKyNkZWZpbmUgVkdBX01BUF9NRU0oeCxzKQkoMHhiMDAwMDAwMEwgKyAodW5zaWduZWQgbG9uZykoeCkpCiAKICNkZWZpbmUgdmdhX3JlYWRiKHgpCSgqKHgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkJKCooeSkgPSAoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wYXJpc2MvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1wYXJpc2MvZmxvcHB5LmgKaW5kZXggY2EzYWVkNy4uNDU4Y2RiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcGFyaXNjL2Zsb3BweS5oCisrKyBiL2luY2x1ZGUvYXNtLXBhcmlzYy9mbG9wcHkuaApAQCAtMTU5LDEwICsxNTksOCBAQAogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2hhcmRpbnQsU0FfSU5URVJSVVBULAogCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJCQkgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsJCi0KKwkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9tZW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcGFyaXNjL21tem9uZS5oIGIvaW5jbHVkZS9hc20tcGFyaXNjL21tem9uZS5oCmluZGV4IGNlYjliNzMuLmM4NzgxMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBhcmlzYy9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2FzbS1wYXJpc2MvbW16b25lLmgKQEAgLTE0LDExICsxNCw2IEBACiAKICNkZWZpbmUgTk9ERV9EQVRBKG5pZCkgICAgICAgICAgKCZub2RlX2RhdGFbbmlkXS5wZ19kYXRhKQogCi0vKgotICogR2l2ZW4gYSBrZXJuZWwgYWRkcmVzcywgZmluZCB0aGUgaG9tZSBub2RlIG9mIHRoZSB1bmRlcmx5aW5nIG1lbW9yeS4KLSAqLwotI2RlZmluZSBrdmFkZHJfdG9fbmlkKGthZGRyKQlwZm5fdG9fbmlkKF9fcGEoa2FkZHIpID4+IFBBR0VfU0hJRlQpCi0KICNkZWZpbmUgbm9kZV9zdGFydF9wZm4obmlkKQkoTk9ERV9EQVRBKG5pZCktPm5vZGVfc3RhcnRfcGZuKQogI2RlZmluZSBub2RlX2VuZF9wZm4obmlkKQkJCQkJCVwKICh7CQkJCQkJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9iYWNrbGlnaHQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvYmFja2xpZ2h0LmgKaW5kZXggMWJhMWYyNy4uYTVlOWU2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9iYWNrbGlnaHQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2JhY2tsaWdodC5oCkBAIC0yLDMwICsyLDMwIEBACiAgKiBSb3V0aW5lcyBmb3IgaGFuZGxpbmcgYmFja2xpZ2h0IGNvbnRyb2wgb24gUG93ZXJCb29rcwogICoKICAqIEZvciBub3csIGltcGxlbWVudGF0aW9uIHJlc2lkZXMgaW4KLSAqIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcG1hY19zdXBwb3J0LmMKKyAqIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvYmFja2xpZ2h0LmMKICAqCiAgKi8KICNpZm5kZWYgX19BU01fUE9XRVJQQ19CQUNLTElHSFRfSAogI2RlZmluZSBfX0FTTV9QT1dFUlBDX0JBQ0tMSUdIVF9ICiAjaWZkZWYgX19LRVJORUxfXwogCi0vKiBBYnN0cmFjdCB2YWx1ZXMgKi8KLSNkZWZpbmUgQkFDS0xJR0hUX09GRgkwCi0jZGVmaW5lIEJBQ0tMSUdIVF9NSU4JMQotI2RlZmluZSBCQUNLTElHSFRfTUFYCTB4ZgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAotc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyIHsKLQlpbnQgKCpzZXRfZW5hYmxlKShpbnQgZW5hYmxlLCBpbnQgbGV2ZWwsIHZvaWQgKmRhdGEpOwotCWludCAoKnNldF9sZXZlbCkoaW50IGxldmVsLCB2b2lkICpkYXRhKTsKLX07CisvKiBGb3IgbG9ja2luZyBpbnN0cnVjdGlvbnMsIHNlZSB0aGUgaW1wbGVtZW50YXRpb24gZmlsZSAqLworZXh0ZXJuIHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpwbWFjX2JhY2tsaWdodDsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggcG1hY19iYWNrbGlnaHRfbXV0ZXg7CiAKLWV4dGVybiB2b2lkIHJlZ2lzdGVyX2JhY2tsaWdodF9jb250cm9sbGVyKHN0cnVjdCBiYWNrbGlnaHRfY29udHJvbGxlciAqY3RybGVyLCB2b2lkICpkYXRhLCBjaGFyICp0eXBlKTsKLWV4dGVybiB2b2lkIHVucmVnaXN0ZXJfYmFja2xpZ2h0X2NvbnRyb2xsZXIoc3RydWN0IGJhY2tsaWdodF9jb250cm9sbGVyICpjdHJsZXIsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgcG1hY19iYWNrbGlnaHRfY2FsY19jdXJ2ZShzdHJ1Y3QgZmJfaW5mbyopOworZXh0ZXJuIGludCBwbWFjX2JhY2tsaWdodF9jdXJ2ZV9sb29rdXAoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB2YWx1ZSk7CiAKLWV4dGVybiBpbnQgc2V0X2JhY2tsaWdodF9lbmFibGUoaW50IGVuYWJsZSk7Ci1leHRlcm4gaW50IGdldF9iYWNrbGlnaHRfZW5hYmxlKHZvaWQpOwotZXh0ZXJuIGludCBzZXRfYmFja2xpZ2h0X2xldmVsKGludCBsZXZlbCk7Ci1leHRlcm4gaW50IGdldF9iYWNrbGlnaHRfbGV2ZWwodm9pZCk7CitleHRlcm4gaW50IHBtYWNfaGFzX2JhY2tsaWdodF90eXBlKGNvbnN0IGNoYXIgKnR5cGUpOworCitleHRlcm4gdm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfdXAodm9pZCk7CitleHRlcm4gdm9pZCBwbWFjX2JhY2tsaWdodF9rZXlfZG93bih2b2lkKTsKKworZXh0ZXJuIGludCBwbWFjX2JhY2tsaWdodF9zZXRfbGVnYWN5X2JyaWdodG5lc3MoaW50IGJyaWdodG5lc3MpOworZXh0ZXJuIGludCBwbWFjX2JhY2tsaWdodF9nZXRfbGVnYWN5X2JyaWdodG5lc3Modm9pZCk7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2JpdG9wcy5oCmluZGV4IGQxYzJhNDQuLjc2ZTJmMDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9iaXRvcHMuaApAQCAtMjg4LDggKzI4OCw4IEBACiAjZGVmaW5lIF9fdGVzdF9hbmRfY2xlYXJfbGVfYml0KG5yLCBhZGRyKSBcCiAJX190ZXN0X2FuZF9jbGVhcl9iaXQoKG5yKSBeIEJJVE9QX0xFX1NXSVpaTEUsIChhZGRyKSkKIAotI2RlZmluZSBmaW5kX2ZpcnN0X3plcm9fbGVfYml0KGFkZHIsIHNpemUpIGZpbmRfbmV4dF96ZXJvX2xlX2JpdCgoYWRkciksIChzaXplKSwgMCkKLXVuc2lnbmVkIGxvbmcgZmluZF9uZXh0X3plcm9fbGVfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCisjZGVmaW5lIGZpbmRfZmlyc3RfemVyb19sZV9iaXQoYWRkciwgc2l6ZSkgZ2VuZXJpY19maW5kX25leHRfemVyb19sZV9iaXQoKGFkZHIpLCAoc2l6ZSksIDApCit1bnNpZ25lZCBsb25nIGdlbmVyaWNfZmluZF9uZXh0X3plcm9fbGVfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsCiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwogCiAvKiBCaXRtYXAgZnVuY3Rpb25zIGZvciB0aGUgZXh0MiBmaWxlc3lzdGVtICovCkBAIC0zMDksNyArMzA5LDcgQEAKICNkZWZpbmUgZXh0Ml9maW5kX2ZpcnN0X3plcm9fYml0KGFkZHIsIHNpemUpIFwKIAlmaW5kX2ZpcnN0X3plcm9fbGVfYml0KCh1bnNpZ25lZCBsb25nKilhZGRyLCBzaXplKQogI2RlZmluZSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdChhZGRyLCBzaXplLCBvZmYpIFwKLQlmaW5kX25leHRfemVyb19sZV9iaXQoKHVuc2lnbmVkIGxvbmcqKWFkZHIsIHNpemUsIG9mZikKKwlnZW5lcmljX2ZpbmRfbmV4dF96ZXJvX2xlX2JpdCgodW5zaWduZWQgbG9uZyopYWRkciwgc2l6ZSwgb2ZmKQogCiAvKiBCaXRtYXAgZnVuY3Rpb25zIGZvciB0aGUgbWluaXggZmlsZXN5c3RlbS4gICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvY3B1dGFibGUuaAppbmRleCBmNjI2NWMyLi5mYWI0MWMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2NwdXRhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9jcHV0YWJsZS5oCkBAIC0yNCw2ICsyNCw5IEBACiAjZGVmaW5lIFBQQ19GRUFUVVJFX0lDQUNIRV9TTk9PUAkweDAwMDAyMDAwCiAjZGVmaW5lIFBQQ19GRUFUVVJFX0FSQ0hfMl8wNQkJMHgwMDAwMTAwMAogCisjZGVmaW5lIFBQQ19GRUFUVVJFX1RSVUVfTEUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgUFBDX0ZFQVRVUkVfUFBDX0xFCQkweDAwMDAwMDAxCisKICNpZmRlZiBfX0tFUk5FTF9fCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC02OSw2ICs3MiwxMyBAQAogCS8qIFByb2Nlc3NvciBzcGVjaWZpYyBvcHJvZmlsZSBvcGVyYXRpb25zICovCiAJZW51bSBwb3dlcnBjX29wcm9maWxlX3R5cGUgb3Byb2ZpbGVfdHlwZTsKIAorCS8qIEJpdCBsb2NhdGlvbnMgaW5zaWRlIHRoZSBtbWNyYSBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBsb25nCW9wcm9maWxlX21tY3JhX3NpaHY7CisJdW5zaWduZWQgbG9uZwlvcHJvZmlsZV9tbWNyYV9zaXByOworCisJLyogQml0cyB0byBjbGVhciBkdXJpbmcgYW4gb3Byb2ZpbGUgZXhjZXB0aW9uICovCisJdW5zaWduZWQgbG9uZwlvcHJvZmlsZV9tbWNyYV9jbGVhcjsKKwogCS8qIE5hbWUgb2YgcHJvY2Vzc29yIGNsYXNzLCBmb3IgdGhlIEVMRiBBVF9QTEFURk9STSBlbnRyeSAqLwogCWNoYXIJCSpwbGF0Zm9ybTsKIH07CkBAIC0xMDQsNiArMTE0LDggQEAKICNkZWZpbmUgQ1BVX0ZUUl9OT19CVElDCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDA0MDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9CSUdfUEhZUwkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDA4MDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9OT0RTSVNSQUxJR04JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAxMDAwMDApCisjZGVmaW5lIENQVV9GVFJfUFBDX0xFCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDIwMDAwMCkKKyNkZWZpbmUgQ1BVX0ZUUl9SRUFMX0xFCQkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDQwMDAwMCkKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KIC8qIEFkZCB0aGUgNjRiIHByb2Nlc3NvciB1bmlxdWUgZmVhdHVyZXMgaW4gdGhlIHRvcCBoYWxmIG9mIHRoZSB3b3JkICovCkBAIC0xMTcsNyArMTI5LDYgQEAKICNkZWZpbmUgQ1BVX0ZUUl9TTVQJCQlBU01fQ09OU1QoMHgwMDAwMDEwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRQkJQVNNX0NPTlNUKDB4MDAwMDAyMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRQkJQVNNX0NPTlNUKDB4MDAwMDA0MDAwMDAwMDAwMCkKLSNkZWZpbmUgQ1BVX0ZUUl9NTUNSQV9TSUhWCQlBU01fQ09OU1QoMHgwMDAwMDgwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX0NJX0xBUkdFX1BBR0UJCUFTTV9DT05TVCgweDAwMDAxMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfUEFVU0VfWkVSTwkJQVNNX0NPTlNUKDB4MDAwMDIwMDAwMDAwMDAwMCkKICNkZWZpbmUgQ1BVX0ZUUl9QVVJSCQkJQVNNX0NPTlNUKDB4MDAwMDQwMDAwMDAwMDAwMCkKQEAgLTEzNCw3ICsxNDUsNiBAQAogI2RlZmluZSBDUFVfRlRSX1NNVAkJCUFTTV9DT05TVCgweDApCiAjZGVmaW5lIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFCQlBU01fQ09OU1QoMHgwKQogI2RlZmluZSBDUFVfRlRSX0xPQ0tMRVNTX1RMQklFCQlBU01fQ09OU1QoMHgwKQotI2RlZmluZSBDUFVfRlRSX01NQ1JBX1NJSFYJCUFTTV9DT05TVCgweDApCiAjZGVmaW5lIENQVV9GVFJfQ0lfTEFSR0VfUEFHRQkJQVNNX0NPTlNUKDB4MCkKICNkZWZpbmUgQ1BVX0ZUUl9QVVJSCQkJQVNNX0NPTlNUKDB4MCkKICNlbmRpZgpAQCAtMTkyLDkyICsyMDIsOTUgQEAKICNkZWZpbmUgQ1BVX0ZUUlNfUFBDNjAxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfNjAxIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFKQogI2RlZmluZSBDUFVfRlRSU182MDMJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVApCisJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU182MDQJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSXzYwNF9QRVJGX01PTiB8IENQVV9GVFJfSFBURV9UQUJMRSkKKwkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSXzYwNF9QRVJGX01PTiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKKwkgICAgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0MF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCkKKwkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0MAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQKQorCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKKwkgICAgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc1MAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCi0JICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQKQorCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKKwkgICAgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc1MEZYMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfVEFVIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgXAotCSAgICBDUFVfRlRSX0RVQUxfUExMXzc1MEZYIHwgQ1BVX0ZUUl9OT19EUE0pCisJICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX05PX0RQTSB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU183NTBGWDIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fRE9aRSB8IENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9MMkNSIHwgXAogCSAgICBDUFVfRlRSX1RBVSB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9OT19EUE0pCisJICAgIENQVV9GVFJfTk9fRFBNIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc1MEZYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMpCisJICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfNzUwR1gJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfVEFVIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBcCi0JICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMpCisJICAgIENQVV9GVFJfRFVBTF9QTExfNzUwRlggfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfNzQwMF9OT1RBVQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0wyQ1IgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgXAotCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVApCisJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU183NDAwCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IFwKIAkgICAgQ1BVX0ZUUl9UQVUgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfSFBURV9UQUJMRSB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQKQorCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX1BQQ19MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfNzQ1MF8yMAkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAotCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQpCisJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU183NDUwXzIxCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfTDNfRElTQUJMRV9OQVAgfCBcCi0JICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCkKKwkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0NTBfMjMJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAotCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UKQorCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0NTVfMQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBDUFVfRlRSX0wzQ1IgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCi0JICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCkKKwkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0NTVfMjAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9MM19ESVNBQkxFX05BUCB8IFwKLQkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTKQorCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBDUFVfRlRSX1BQQ19MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfNzQ1NQkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAogCSAgICBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9MMkNSIHwgQ1BVX0ZUUl9BTFRJVkVDX0NPTVAgfCBcCiAJICAgIENQVV9GVFJfTDNDUiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfU1BFQzc0NTAgfCBcCiAJICAgIENQVV9GVFJfTkFQX0RJU0FCTEVfTDJfUFIgfCBDUFVfRlRSX0hBU19ISUdIX0JBVFMgfCBcCi0JICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCkKKwkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UIHwgQ1BVX0ZUUl9QUENfTEUpCiAjZGVmaW5lIENQVV9GVFJTXzc0NDdfMTAJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0wzQ1IgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAotCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX05PX0JUSUMpCisJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfTk9fQlRJQyB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU183NDQ3CShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgXAogCSAgICBDUFVfRlRSX01BWUJFX0NBTl9OQVAgfCBDUFVfRlRSX0wyQ1IgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKIAkgICAgQ1BVX0ZUUl9MM0NSIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9TUEVDNzQ1MCB8IFwKIAkgICAgQ1BVX0ZUUl9OQVBfRElTQUJMRV9MMl9QUiB8IENQVV9GVFJfSEFTX0hJR0hfQkFUUyB8IFwKLQkgICAgQ1BVX0ZUUl9ORUVEX0NPSEVSRU5UKQorCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQgfCBDUFVfRlRSX1BQQ19MRSkKICNkZWZpbmUgQ1BVX0ZUUlNfNzQ0N0EJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKIAkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX05BUCB8IENQVV9GVFJfTDJDUiB8IENQVV9GVFJfQUxUSVZFQ19DT01QIHwgXAogCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX1NQRUM3NDUwIHwgXAogCSAgICBDUFVfRlRSX05BUF9ESVNBQkxFX0wyX1BSIHwgQ1BVX0ZUUl9IQVNfSElHSF9CQVRTIHwgXAotCSAgICBDUFVfRlRSX05FRURfQ09IRVJFTlQpCisJICAgIENQVV9GVFJfTkVFRF9DT0hFUkVOVCB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU184MlhYCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfTUFZQkVfQ0FOX0RPWkUgfCBDUFVfRlRSX1VTRV9UQikKICNkZWZpbmUgQ1BVX0ZUUlNfRzJfTEUJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX01BWUJFX0NBTl9ET1pFIHwgXApAQCAtMjg3LDEzICszMDAsNiBAQAogCSAgICBDUFVfRlRSX0NPTU1PTikKICNkZWZpbmUgQ1BVX0ZUUlNfQ0xBU1NJQzMyCShDUFVfRlRSX0NPTU1PTiB8IENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBcCiAJICAgIENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9IUFRFX1RBQkxFKQotI2RlZmluZSBDUFVfRlRSU19QT1dFUjNfMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUpCi0jZGVmaW5lIENQVV9GVFJTX1BPV0VSNF8zMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgXAotCSAgICBDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQotI2RlZmluZSBDUFVfRlRSU185NzBfMzIJKENQVV9GVFJfQ09NTU9OIHwgQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IFwKLQkgICAgQ1BVX0ZUUl9VU0VfVEIgfCBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IFwKLQkgICAgQ1BVX0ZUUl9NQVlCRV9DQU5fTkFQIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCiAjZGVmaW5lIENQVV9GVFJTXzhYWAkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCKQogI2RlZmluZSBDUFVfRlRSU180MFgJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9OT0RTSVNSQUxJR04pCkBAIC0zMDcsNyArMzEzLDcgQEAKICNkZWZpbmUgQ1BVX0ZUUlNfR0VORVJJQ18zMgkoQ1BVX0ZUUl9DT01NT04gfCBDUFVfRlRSX05PRFNJU1JBTElHTikKICNpZmRlZiBfX3Bvd2VycGM2NF9fCiAjZGVmaW5lIENQVV9GVFJTX1BPV0VSMwkoQ1BVX0ZUUl9TUExJVF9JRF9DQUNIRSB8IENQVV9GVFJfVVNFX1RCIHwgXAotCSAgICBDUFVfRlRSX0hQVEVfVEFCTEUgfCBDUFVfRlRSX0lBQlIpCisJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IENQVV9GVFJfUFBDX0xFKQogI2RlZmluZSBDUFVfRlRSU19SUzY0CShDUFVfRlRSX1NQTElUX0lEX0NBQ0hFIHwgQ1BVX0ZUUl9VU0VfVEIgfCBcCiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfSUFCUiB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfQ1RSTCkKQEAgLTMyMCwxMiArMzI2LDEyIEBACiAJICAgIENQVV9GVFJfSFBURV9UQUJMRSB8IENQVV9GVFJfUFBDQVNfQVJDSF9WMiB8IFwKIAkgICAgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXAogCSAgICBDUFVfRlRSX0NPSEVSRU5UX0lDQUNIRSB8IENQVV9GVFJfTE9DS0xFU1NfVExCSUUgfCBcCi0JICAgIENQVV9GVFJfTU1DUkFfU0lIViB8IENQVV9GVFJfUFVSUikKKwkgICAgQ1BVX0ZUUl9QVVJSKQogI2RlZmluZSBDUFVfRlRSU19QT1dFUjYgKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX01NQ1JBIHwgQ1BVX0ZUUl9TTVQgfCBcCiAJICAgIENQVV9GVFJfQ09IRVJFTlRfSUNBQ0hFIHwgQ1BVX0ZUUl9MT0NLTEVTU19UTEJJRSB8IFwKLQkgICAgQ1BVX0ZUUl9QVVJSIHwgQ1BVX0ZUUl9DSV9MQVJHRV9QQUdFKQorCSAgICBDUFVfRlRSX1BVUlIgfCBDUFVfRlRSX0NJX0xBUkdFX1BBR0UgfCBDUFVfRlRSX1JFQUxfTEUpCiAjZGVmaW5lIENQVV9GVFJTX0NFTEwJKENQVV9GVFJfU1BMSVRfSURfQ0FDSEUgfCBDUFVfRlRSX1VTRV9UQiB8IFwKIAkgICAgQ1BVX0ZUUl9IUFRFX1RBQkxFIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyIHwgXAogCSAgICBDUFVfRlRSX0FMVElWRUNfQ09NUCB8IENQVV9GVFJfTU1DUkEgfCBDUFVfRlRSX1NNVCB8IFwKQEAgLTM1NCwxMiArMzYwLDYgQEAKICNlbHNlCiAJICAgIENQVV9GVFJTX0dFTkVSSUNfMzIgfAogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JICAgIENQVV9GVFJTX1BPV0VSM18zMiB8Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0JICAgIENQVV9GVFJTX1BPV0VSNF8zMiB8IENQVV9GVFJTXzk3MF8zMiB8Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfOHh4CiAJICAgIENQVV9GVFJTXzhYWCB8CiAjZW5kaWYKQEAgLTM5OSwxMiArMzk5LDYgQEAKICNlbHNlCiAJICAgIENQVV9GVFJTX0dFTkVSSUNfMzIgJgogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JICAgIENQVV9GVFJTX1BPV0VSM18zMiAmCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUE9XRVI0Ci0JICAgIENQVV9GVFJTX1BPV0VSNF8zMiAmIENQVV9GVFJTXzk3MF8zMiAmCi0jZW5kaWYKICNpZmRlZiBDT05GSUdfOHh4CiAJICAgIENQVV9GVFJTXzhYWCAmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZGVsYXkuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZGVsYXkuaAppbmRleCAwNTdhNjA5Li5mOTIwMGE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2RlbGF5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9kZWxheS5oCkBAIC0xNyw1ICsxNywxOCBAQAogZXh0ZXJuIHZvaWQgX19kZWxheSh1bnNpZ25lZCBsb25nIGxvb3BzKTsKIGV4dGVybiB2b2lkIHVkZWxheSh1bnNpZ25lZCBsb25nIHVzZWNzKTsKIAorLyoKKyAqIE9uIHNoYXJlZCBwcm9jZXNzb3IgbWFjaGluZXMgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgbWRlbGF5IGNhbgorICogcmVzdWx0IGluIGxhcmdlIGVycm9ycy4gV2hpbGUgZWFjaCBpdGVyYXRpb24gb2YgdGhlIGxvb3AgaW5zaWRlIG1kZWxheQorICogaXMgc3VwcG9zZWQgdG8gdGFrZSAxbXMsIHRoZSBoeXBlcnZpc29yIGNvdWxkIHNsZWVwIG91ciBwYXJ0aXRpb24gZm9yCisgKiBsb25nZXIgKGVnIDEwbXMpLiBXaXRoIHRoZSByaWdodCB0aW1pbmcgdGhlc2UgZXJyb3JzIGNhbiBhZGQgdXAuCisgKgorICogU2luY2UgdGhlcmUgaXMgbm8gMzJiaXQgb3ZlcmZsb3cgaXNzdWUgb24gNjRiaXQga2VybmVscywganVzdCBjYWxsCisgKiB1ZGVsYXkgZGlyZWN0bHkuCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNkZWZpbmUgbWRlbGF5KG4pCXVkZWxheSgobikgKiAxMDAwKQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0RFTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaC5oCmluZGV4IGU5Yzg2YjEuLjRkZjNlODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWguaApAQCAtMjkyLDggKzI5Miw2IEBACiBzdGF0aWMgaW5saW5lIHU4IGVlaF9pbmIodW5zaWduZWQgbG9uZyBwb3J0KQogewogCXU4IHZhbDsKLQlpZiAoIV9JT19JU19WQUxJRChwb3J0KSkKLQkJcmV0dXJuIH4wOwogCXZhbCA9IGluXzgoKHU4IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSkpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1OCkpCiAJCXJldHVybiBlZWhfY2hlY2tfZmFpbHVyZSgodm9pZCBfX2lvbWVtICopKHBvcnQpLCB2YWwpOwpAQCAtMzAyLDE1ICszMDAsMTIgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGVlaF9vdXRiKHU4IHZhbCwgdW5zaWduZWQgbG9uZyBwb3J0KQogewotCWlmIChfSU9fSVNfVkFMSUQocG9ydCkpCi0JCW91dF84KCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOworCW91dF84KCh1OCBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHUxNiBlZWhfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKIAl1MTYgdmFsOwotCWlmICghX0lPX0lTX1ZBTElEKHBvcnQpKQotCQlyZXR1cm4gfjA7CiAJdmFsID0gaW5fbGUxNigodTE2IF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSkpOwogCWlmIChFRUhfUE9TU0lCTEVfRVJST1IodmFsLCB1MTYpKQogCQlyZXR1cm4gZWVoX2NoZWNrX2ZhaWx1cmUoKHZvaWQgX19pb21lbSAqKShwb3J0KSwgdmFsKTsKQEAgLTMxOSwxNSArMzE0LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlZWhfb3V0dyh1MTYgdmFsLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7Ci0JaWYgKF9JT19JU19WQUxJRChwb3J0KSkKLQkJb3V0X2xlMTYoKHUxNiBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOworCW91dF9sZTE2KCh1MTYgX19pb21lbSAqKShwb3J0K3BjaV9pb19iYXNlKSwgdmFsKTsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgZWVoX2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJdTMyIHZhbDsKLQlpZiAoIV9JT19JU19WQUxJRChwb3J0KSkKLQkJcmV0dXJuIH4wOwogCXZhbCA9IGluX2xlMzIoKHUzMiBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpKTsKIAlpZiAoRUVIX1BPU1NJQkxFX0VSUk9SKHZhbCwgdTMyKSkKIAkJcmV0dXJuIGVlaF9jaGVja19mYWlsdXJlKCh2b2lkIF9faW9tZW0gKikocG9ydCksIHZhbCk7CkBAIC0zMzYsOCArMzI4LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGVlaF9vdXRsKHUzMiB2YWwsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQlpZiAoX0lPX0lTX1ZBTElEKHBvcnQpKQotCQlvdXRfbGUzMigodTMyIF9faW9tZW0gKikocG9ydCtwY2lfaW9fYmFzZSksIHZhbCk7CisJb3V0X2xlMzIoKHUzMiBfX2lvbWVtICopKHBvcnQrcGNpX2lvX2Jhc2UpLCB2YWwpOwogfQogCiAvKiBpbi1zdHJpbmcgZWVoIG1hY3JvcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWhfZXZlbnQuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvZWVoX2V2ZW50LmgKaW5kZXggOTNkNTVhMi4uZGM2YmYwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9lZWhfZXZlbnQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VlaF9ldmVudC5oCkBAIC0xOCw4ICsxOCw4IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUgTGluYXMgVmVwc3RhcyA8bGluYXNAbGluYXMub3JnPgogICovCiAKLSNpZm5kZWYgQVNNX1BQQzY0X0VFSF9FVkVOVF9ICi0jZGVmaW5lIEFTTV9QUEM2NF9FRUhfRVZFTlRfSAorI2lmbmRlZiBBU01fUE9XRVJQQ19FRUhfRVZFTlRfSAorI2RlZmluZSBBU01fUE9XRVJQQ19FRUhfRVZFTlRfSAogI2lmZGVmIF9fS0VSTkVMX18KIAogLyoqIEVFSCBldmVudCAtLSBzdHJ1Y3R1cmUgaG9sZGluZyBwY2kgY29udHJvbGxlciBkYXRhIHRoYXQgZGVzY3JpYmVzCkBAIC0zOSw3ICszOSw3IEBACiAgKiBAZGV2IHBjaSBkZXZpY2UKICAqCiAgKiBUaGlzIHJvdXRpbmUgYnVpbGRzIGEgUENJIGVycm9yIGV2ZW50IHdoaWNoIHdpbGwgYmUgZGVsaXZlcmVkCi0gKiB0byBhbGwgbGlzdGVuZXJzIG9uIHRoZSBwZWhfbm90aWZpZXJfY2hhaW4uCisgKiB0byBhbGwgbGlzdGVuZXJzIG9uIHRoZSBlZWhfbm90aWZpZXJfY2hhaW4uCiAgKgogICogVGhpcyByb3V0aW5lIGNhbiBiZSBjYWxsZWQgd2l0aGluIGFuIGludGVycnVwdCBjb250ZXh0OwogICogdGhlIGFjdHVhbCBldmVudCB3aWxsIGJlIGRlbGl2ZXJlZCBpbiBhIG5vcm1hbCBjb250ZXh0CkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbWVfdW5hdmFpbCk7CiAKIC8qIE1haW4gcmVjb3ZlcnkgZnVuY3Rpb24gKi8KLXZvaWQgaGFuZGxlX2VlaF9ldmVudHMgKHN0cnVjdCBlZWhfZXZlbnQgKik7CitzdHJ1Y3QgcGNpX2RuICogaGFuZGxlX2VlaF9ldmVudHMgKHN0cnVjdCBlZWhfZXZlbnQgKik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0jZW5kaWYgLyogQVNNX1BQQzY0X0VFSF9FVkVOVF9IICovCisjZW5kaWYgLyogQVNNX1BPV0VSUENfRUVIX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2VsZi5oCmluZGV4IDk5YzE4YjcuLjlhODNhOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZWxmLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9lbGYuaApAQCAtMjkzLDcgKzI5Myw3IEBACiAJTkVXX0FVWF9FTlQoQVRfRENBQ0hFQlNJWkUsIGRjYWNoZV9ic2l6ZSk7CQkJXAogCU5FV19BVVhfRU5UKEFUX0lDQUNIRUJTSVpFLCBpY2FjaGVfYnNpemUpOwkJCVwKIAlORVdfQVVYX0VOVChBVF9VQ0FDSEVCU0laRSwgdWNhY2hlX2JzaXplKTsJCQlcCi0JVkRTT19BVVhfRU5UKEFUX1NZU0lORk9fRUhEUiwgY3VycmVudC0+dGhyZWFkLnZkc29fYmFzZSkJXAorCVZEU09fQVVYX0VOVChBVF9TWVNJTkZPX0VIRFIsIGN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc29fYmFzZSkJXAogfSB3aGlsZSAoMCkKIAogLyogUG93ZXJQQzY0IHJlbG9jYXRpb25zIGRlZmluZWQgYnkgdGhlIEFCSXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2Zsb3BweS5oCmluZGV4IDdlMmQxNjkuLjljOGQ5MWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9mbG9wcHkuaApAQCAtMjcsOCArMjcsNyBAQAogI2RlZmluZSBmZF9kaXNhYmxlX2lycSgpICAgICAgICBkaXNhYmxlX2lycShGTE9QUFlfSVJRKQogI2RlZmluZSBmZF9jYWNoZWZsdXNoKGFkZHIsc2l6ZSkgLyogbm90aGluZyAqLwogI2RlZmluZSBmZF9yZXF1ZXN0X2lycSgpICAgICAgICByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LCBcCi0JCQkJCSAgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwgXAotCQkJCSAgICAgICAgICAgICJmbG9wcHkiLCBOVUxMKQorCQkJCQkgICAgU0FfSU5URVJSVVBULCAiZmxvcHB5IiwgTlVMTCkKICNkZWZpbmUgZmRfZnJlZV9pcnEoKSAgICAgICAgICAgZnJlZV9pcnEoRkxPUFBZX0lSUSwgTlVMTCk7CiAKICNpZmRlZiBDT05GSUdfUENJCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9odmNhbGwuaAppbmRleCA2Y2M3ZTFmLi4wZDNjNGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2h2Y2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaHZjYWxsLmgKQEAgLTEwMiw2ICsxMDIsMTUgQEAKICNkZWZpbmUgSF9QUDEJCQkoMVVMPDwoNjMtNjIpKQogI2RlZmluZSBIX1BQMgkJCSgxVUw8PCg2My02MykpCiAKKy8qIFZBU0kgU3RhdGVzICovCisjZGVmaW5lIEhfVkFTSV9JTlZBTElEICAgICAgICAgIDAKKyNkZWZpbmUgSF9WQVNJX0VOQUJMRUQgICAgICAgICAgMQorI2RlZmluZSBIX1ZBU0lfQUJPUlRFRCAgICAgICAgICAyCisjZGVmaW5lIEhfVkFTSV9TVVNQRU5ESU5HICAgICAgIDMKKyNkZWZpbmUgSF9WQVNJX1NVU1BFTkRFRCAgICAgICAgNAorI2RlZmluZSBIX1ZBU0lfUkVTVU1FRCAgICAgICAgICA1CisjZGVmaW5lIEhfVkFTSV9DT01QTEVURUQgICAgICAgIDYKKwogLyogREFCUlggZmxhZ3MgKi8KICNkZWZpbmUgSF9EQUJSWF9IWVBFUlZJU09SCSgxVUw8PCg2My02MSkpCiAjZGVmaW5lIEhfREFCUlhfS0VSTkVMCQkoMVVMPDwoNjMtNjIpKQpAQCAtMTkwLDYgKzE5OSw3IEBACiAjZGVmaW5lIEhfUVVFUllfSU5UX1NUQVRFICAgICAgIDB4MUU0CiAjZGVmaW5lIEhfUE9MTF9QRU5ESU5HCQkweDFEOAogI2RlZmluZSBIX0pPSU4JCQkweDI5OAorI2RlZmluZSBIX1ZBU0lfU1RBVEUgICAgICAgICAgICAweDJBNAogI2RlZmluZSBIX0VOQUJMRV9DUlEJCTB4MkIwCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2ltbWFwXzg2eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW1tYXBfODZ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDViNjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2ltbWFwXzg2eHguaApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIE1QQzg2eHggSW50ZXJuYWwgTWVtb3J5IE1hcAorICoKKyAqIEF1dGhvcjogSmVmZiBCcm93bgorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fQVNNX1BPV0VSUENfSU1NQVBfODZYWF9IX18KKyNkZWZpbmUgX19BU01fUE9XRVJQQ19JTU1BUF84NlhYX0hfXworI2lmZGVmIF9fS0VSTkVMX18KKworLyogRXZlbnR1YWxseSB0aGlzIHNob3VsZCBkZWZpbmUgYWxsIHRoZSBJTyBibG9jayByZWdpc3RlcnMgaW4gODZ4eCAqLworCisvKiBQQ0kgUmVnaXN0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBjY3NyX3BjaSB7CisJdWludAljZmdfYWRkcjsJLyogMHguMDAwIC0gUENJIENvbmZpZ3VyYXRpb24gQWRkcmVzcyBSZWdpc3RlciAqLworCXVpbnQJY2ZnX2RhdGE7CS8qIDB4LjAwNCAtIFBDSSBDb25maWd1cmF0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKwl1aW50CWludF9hY2s7CS8qIDB4LjAwOCAtIFBDSSBJbnRlcnJ1cHQgQWNrbm93bGVkZ2UgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczFbMzA2MF07CisJdWludAlwb3RhcjA7CQkvKiAweC5jMDAgLSBQQ0kgT3V0Ym91bmQgVHJhbnNhY3Rpb24gQWRkcmVzcyBSZWdpc3RlciAwICovCisJdWludAlwb3RlYXIwOwkvKiAweC5jMDQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAwICovCisJdWludAlwb3diYXIwOwkvKiAweC5jMDggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwICovCisJY2hhcglyZXMyWzRdOworCXVpbnQJcG93YXIwOwkJLyogMHguYzEwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDAgKi8KKwljaGFyCXJlczNbMTJdOworCXVpbnQJcG90YXIxOwkJLyogMHguYzIwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCXVpbnQJcG90ZWFyMTsJLyogMHguYzI0IC0gUENJIE91dGJvdW5kIFRyYW5zbGF0aW9uIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCXVpbnQJcG93YmFyMTsJLyogMHguYzI4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzNFs0XTsKKwl1aW50CXBvd2FyMTsJCS8qIDB4LmMzMCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAxICovCisJY2hhcglyZXM1WzEyXTsKKwl1aW50CXBvdGFyMjsJCS8qIDB4LmM0MCAtIFBDSSBPdXRib3VuZCBUcmFuc2FjdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1aW50CXBvdGVhcjI7CS8qIDB4LmM0NCAtIFBDSSBPdXRib3VuZCBUcmFuc2xhdGlvbiBFeHRlbmRlZCBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwl1aW50CXBvd2JhcjI7CS8qIDB4LmM0OCAtIFBDSSBPdXRib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDIgKi8KKwljaGFyCXJlczZbNF07CisJdWludAlwb3dhcjI7CQkvKiAweC5jNTAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzN1sxMl07CisJdWludAlwb3RhcjM7CQkvKiAweC5jNjAgLSBQQ0kgT3V0Ym91bmQgVHJhbnNhY3Rpb24gQWRkcmVzcyBSZWdpc3RlciAzICovCisJdWludAlwb3RlYXIzOwkvKiAweC5jNjQgLSBQQ0kgT3V0Ym91bmQgVHJhbnNsYXRpb24gRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdWludAlwb3diYXIzOwkvKiAweC5jNjggLSBQQ0kgT3V0Ym91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAzICovCisJY2hhcglyZXM4WzRdOworCXVpbnQJcG93YXIzOwkJLyogMHguYzcwIC0gUENJIE91dGJvdW5kIFdpbmRvdyBBdHRyaWJ1dGVzIFJlZ2lzdGVyIDMgKi8KKwljaGFyCXJlczlbMTJdOworCXVpbnQJcG90YXI0OwkJLyogMHguYzgwIC0gUENJIE91dGJvdW5kIFRyYW5zYWN0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCXVpbnQJcG90ZWFyNDsJLyogMHguYzg0IC0gUENJIE91dGJvdW5kIFRyYW5zbGF0aW9uIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCXVpbnQJcG93YmFyNDsJLyogMHguYzg4IC0gUENJIE91dGJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgNCAqLworCWNoYXIJcmVzMTBbNF07CisJdWludAlwb3dhcjQ7CQkvKiAweC5jOTAgLSBQQ0kgT3V0Ym91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgNCAqLworCWNoYXIJcmVzMTFbMjY4XTsKKwl1aW50CXBpdGFyMzsJCS8qIDB4LmRhMCAtIFBDSSBJbmJvdW5kIFRyYW5zbGF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIgMyAgKi8KKwljaGFyCXJlczEyWzRdOworCXVpbnQJcGl3YmFyMzsJLyogMHguZGE4IC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdWludAlwaXdiZWFyMzsJLyogMHguZGFjIC0gUENJIEluYm91bmQgV2luZG93IEJhc2UgRXh0ZW5kZWQgQWRkcmVzcyBSZWdpc3RlciAzICovCisJdWludAlwaXdhcjM7CQkvKiAweC5kYjAgLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQXR0cmlidXRlcyBSZWdpc3RlciAzICovCisJY2hhcglyZXMxM1sxMl07CisJdWludAlwaXRhcjI7CQkvKiAweC5kYzAgLSBQQ0kgSW5ib3VuZCBUcmFuc2xhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyIDIgICovCisJY2hhcglyZXMxNFs0XTsKKwl1aW50CXBpd2JhcjI7CS8qIDB4LmRjOCAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXVpbnQJcGl3YmVhcjI7CS8qIDB4LmRjYyAtIFBDSSBJbmJvdW5kIFdpbmRvdyBCYXNlIEV4dGVuZGVkIEFkZHJlc3MgUmVnaXN0ZXIgMiAqLworCXVpbnQJcGl3YXIyOwkJLyogMHguZGQwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMiAqLworCWNoYXIJcmVzMTVbMTJdOworCXVpbnQJcGl0YXIxOwkJLyogMHguZGUwIC0gUENJIEluYm91bmQgVHJhbnNsYXRpb24gQWRkcmVzcyBSZWdpc3RlciAxICAqLworCWNoYXIJcmVzMTZbNF07CisJdWludAlwaXdiYXIxOwkvKiAweC5kZTggLSBQQ0kgSW5ib3VuZCBXaW5kb3cgQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDEgKi8KKwljaGFyCXJlczE3WzRdOworCXVpbnQJcGl3YXIxOwkJLyogMHguZGYwIC0gUENJIEluYm91bmQgV2luZG93IEF0dHJpYnV0ZXMgUmVnaXN0ZXIgMSAqLworCWNoYXIJcmVzMThbMTJdOworCXVpbnQJZXJyX2RyOwkJLyogMHguZTAwIC0gUENJIEVycm9yIERldGVjdCBSZWdpc3RlciAqLworCXVpbnQJZXJyX2NhcF9kcjsJLyogMHguZTA0IC0gUENJIEVycm9yIENhcHR1cmUgRGlzYWJsZSBSZWdpc3RlciAqLworCXVpbnQJZXJyX2VuOwkJLyogMHguZTA4IC0gUENJIEVycm9yIEVuYWJsZSBSZWdpc3RlciAqLworCXVpbnQJZXJyX2F0dHJpYjsJLyogMHguZTBjIC0gUENJIEVycm9yIEF0dHJpYnV0ZXMgQ2FwdHVyZSBSZWdpc3RlciAqLworCXVpbnQJZXJyX2FkZHI7CS8qIDB4LmUxMCAtIFBDSSBFcnJvciBBZGRyZXNzIENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1aW50CWVycl9leHRfYWRkcjsJLyogMHguZTE0IC0gUENJIEVycm9yIEV4dGVuZGVkIEFkZHJlc3MgQ2FwdHVyZSBSZWdpc3RlciAqLworCXVpbnQJZXJyX2RsOwkJLyogMHguZTE4IC0gUENJIEVycm9yIERhdGEgTG93IENhcHR1cmUgUmVnaXN0ZXIgKi8KKwl1aW50CWVycl9kaDsJCS8qIDB4LmUxYyAtIFBDSSBFcnJvciBEYXRhIEhpZ2ggQ2FwdHVyZSBSZWdpc3RlciAqLworCXVpbnQJZ2FzX3RpbXI7CS8qIDB4LmUyMCAtIFBDSSBHYXNrZXQgVGltZXIgUmVnaXN0ZXIgKi8KKwl1aW50CXBjaV90aW1yOwkvKiAweC5lMjQgLSBQQ0kgVGltZXIgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczE5WzQ3Ml07Cit9IGNjc3JfcGNpX3Q7CisKKy8qIFBDSSBFeHByZXNzIFJlZ2lzdGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgY2Nzcl9wZXggeworCXVpbnQgICAgcGV4X2NvbmZpZ19hZGRyOyAgICAgICAgLyogMHguMDAwIC0gUENJIEV4cHJlc3MgQ29uZmlndXJhdGlvbiBBZGRyZXNzIFJlZ2lzdGVyICovCisJdWludCAgICBwZXhfY29uZmlnX2RhdGE7ICAgICAgICAvKiAweC4wMDQgLSBQQ0kgRXhwcmVzcyBDb25maWd1cmF0aW9uIERhdGEgUmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczFbNF07CisJdWludCAgICBwZXhfb3RiX2NwbF90b3I7ICAgICAgICAvKiAweC4wMGMgLSBQQ0kgRXhwcmVzcyBPdXRib3VuZCBjb21wbGV0aW9uIHRpbWVvdXQgcmVnaXN0ZXIgKi8KKwl1aW50ICAgIHBleF9jb25mX3RvcjsgICAgICAgICAgIC8qIDB4LjAxMCAtIFBDSSBFeHByZXNzIGNvbmZpZ3VyYXRpb24gdGltZW91dCByZWdpc3RlciAqLworCWNoYXIgICAgcmVzMlsxMl07CisJdWludCAgICBwZXhfcG1lX21lc19kcjsgICAgICAgICAvKiAweC4wMjAgLSBQQ0kgRXhwcmVzcyBQTUUgYW5kIG1lc3NhZ2UgZGV0ZWN0IHJlZ2lzdGVyICovCisJdWludCAgICBwZXhfcG1lX21lc19kaXNyOyAgICAgICAvKiAweC4wMjQgLSBQQ0kgRXhwcmVzcyBQTUUgYW5kIG1lc3NhZ2UgZGlzYWJsZSByZWdpc3RlciAqLworCXVpbnQgICAgcGV4X3BtZV9tZXNfaWVyOyAgICAgICAgLyogMHguMDI4IC0gUENJIEV4cHJlc3MgUE1FIGFuZCBtZXNzYWdlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KKwl1aW50ICAgIHBleF9wbWNyOyAgICAgICAgICAgICAgIC8qIDB4LjAyYyAtIFBDSSBFeHByZXNzIHBvd2VyIG1hbmFnZW1lbnQgY29tbWFuZCByZWdpc3RlciAqLworCWNoYXIgICAgcmVzM1szMDI0XTsKKwl1aW50ICAgIHBleG90YXIwOyAgICAgICAgICAgICAgIC8qIDB4LmMwMCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMCAqLworCXVpbnQgICAgcGV4b3RlYXIwOyAgICAgICAgICAgICAgLyogMHguYzA0IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAwKi8KKwljaGFyICAgIHJlczRbOF07CisJdWludCAgICBwZXhvd2FyMDsgICAgICAgICAgICAgICAvKiAweC5jMTAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAwKi8KKwljaGFyICAgIHJlczVbMTJdOworCXVpbnQgICAgcGV4b3RhcjE7ICAgICAgICAgICAgICAgLyogMHguYzIwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAxICovCisJdWludCAgICBwZXhvdGVhcjE7ICAgICAgICAgICAgICAvKiAweC5jMjQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDEqLworCXVpbnQgICAgcGV4b3diYXIxOyAgICAgICAgICAgICAgLyogMHguYzI4IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAxKi8KKwljaGFyICAgIHJlczZbNF07CisJdWludCAgICBwZXhvd2FyMTsgICAgICAgICAgICAgICAvKiAweC5jMzAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAxKi8KKwljaGFyICAgIHJlczdbMTJdOworCXVpbnQgICAgcGV4b3RhcjI7ICAgICAgICAgICAgICAgLyogMHguYzQwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAyICovCisJdWludCAgICBwZXhvdGVhcjI7ICAgICAgICAgICAgICAvKiAweC5jNDQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDIqLworCXVpbnQgICAgcGV4b3diYXIyOyAgICAgICAgICAgICAgLyogMHguYzQ4IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAyKi8KKwljaGFyICAgIHJlczhbNF07CisJdWludCAgICBwZXhvd2FyMjsgICAgICAgICAgICAgICAvKiAweC5jNTAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAyKi8KKwljaGFyICAgIHJlczlbMTJdOworCXVpbnQgICAgcGV4b3RhcjM7ICAgICAgICAgICAgICAgLyogMHguYzYwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAzICovCisJdWludCAgICBwZXhvdGVhcjM7ICAgICAgICAgICAgICAvKiAweC5jNjQgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDMqLworCXVpbnQgICAgcGV4b3diYXIzOyAgICAgICAgICAgICAgLyogMHguYzY4IC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAzKi8KKwljaGFyICAgIHJlczEwWzRdOworCXVpbnQgICAgcGV4b3dhcjM7ICAgICAgICAgICAgICAgLyogMHguYzcwIC0gUENJIEV4cHJlc3Mgb3V0Ym91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMyovCisJY2hhciAgICByZXMxMVsxMl07CisJdWludCAgICBwZXhvdGFyNDsgICAgICAgICAgICAgICAvKiAweC5jODAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDQgKi8KKwl1aW50ICAgIHBleG90ZWFyNDsgICAgICAgICAgICAgIC8qIDB4LmM4NCAtIFBDSSBFeHByZXNzIG91dGJvdW5kIHRyYW5zbGF0aW9uIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgNCovCisJdWludCAgICBwZXhvd2JhcjQ7ICAgICAgICAgICAgICAvKiAweC5jODggLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDQqLworCWNoYXIgICAgcmVzMTJbNF07CisJdWludCAgICBwZXhvd2FyNDsgICAgICAgICAgICAgICAvKiAweC5jOTAgLSBQQ0kgRXhwcmVzcyBvdXRib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciA0Ki8KKwljaGFyICAgIHJlczEzWzEyXTsKKwljaGFyICAgIHJlczE0WzI1Nl07CisJdWludCAgICBwZXhpdGFyMzsgICAgICAgICAgICAgICAvKiAweC5kYTAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHRyYW5zbGF0aW9uIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCWNoYXIgICAgcmVzMTVbNF07CisJdWludCAgICBwZXhpd2JhcjM7ICAgICAgICAgICAgICAvKiAweC5kYTggLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgMyAqLworCXVpbnQgICAgcGV4aXdiZWFyMzsgICAgICAgICAgICAgLyogMHguZGFjIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBleHRlbmRlZCBhZGRyZXNzIHJlZ2lzdGVyIDMgKi8KKwl1aW50ICAgIHBleGl3YXIzOyAgICAgICAgICAgICAgIC8qIDB4LmRiMCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGF0dHJpYnV0ZXMgcmVnaXN0ZXIgMyAqLworCWNoYXIgICAgcmVzMTZbMTJdOworCXVpbnQgICAgcGV4aXRhcjI7ICAgICAgICAgICAgICAgLyogMHguZGMwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB0cmFuc2xhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwljaGFyICAgIHJlczE3WzRdOworCXVpbnQgICAgcGV4aXdiYXIyOyAgICAgICAgICAgICAgLyogMHguZGM4IC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIDIgKi8KKwl1aW50ICAgIHBleGl3YmVhcjI7ICAgICAgICAgICAgIC8qIDB4LmRjYyAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgZXh0ZW5kZWQgYWRkcmVzcyByZWdpc3RlciAyICovCisJdWludCAgICBwZXhpd2FyMjsgICAgICAgICAgICAgICAvKiAweC5kZDAgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBhdHRyaWJ1dGVzIHJlZ2lzdGVyIDIgKi8KKwljaGFyICAgIHJlczE4WzEyXTsKKwl1aW50ICAgIHBleGl0YXIxOyAgICAgICAgICAgICAgIC8qIDB4LmRlMCAtIFBDSSBFeHByZXNzIGluYm91bmQgdHJhbnNsYXRpb24gYWRkcmVzcyByZWdpc3RlciAyICovCisJY2hhciAgICByZXMxOVs0XTsKKwl1aW50ICAgIHBleGl3YmFyMTsgICAgICAgICAgICAgIC8qIDB4LmRlOCAtIFBDSSBFeHByZXNzIGluYm91bmQgd2luZG93IGJhc2UgYWRkcmVzcyByZWdpc3RlciAyICovCisJdWludCAgICBwZXhpd2JlYXIxOyAgICAgICAgICAgICAvKiAweC5kZWMgLSBQQ0kgRXhwcmVzcyBpbmJvdW5kIHdpbmRvdyBiYXNlIGV4dGVuZGVkIGFkZHJlc3MgcmVnaXN0ZXIgMiAqLworCXVpbnQgICAgcGV4aXdhcjE7ICAgICAgICAgICAgICAgLyogMHguZGYwIC0gUENJIEV4cHJlc3MgaW5ib3VuZCB3aW5kb3cgYXR0cmlidXRlcyByZWdpc3RlciAyICovCisJY2hhciAgICByZXMyMFsxMl07CisJdWludCAgICBwZXhfZXJyX2RyOyAgICAgICAgICAgICAvKiAweC5lMDAgLSBQQ0kgRXhwcmVzcyBlcnJvciBkZXRlY3QgcmVnaXN0ZXIgKi8KKwljaGFyICAgIHJlczIxWzRdOworCXVpbnQgICAgcGV4X2Vycl9lbjsgICAgICAgICAgICAgLyogMHguZTA4IC0gUENJIEV4cHJlc3MgZXJyb3IgaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLworCWNoYXIgICAgcmVzMjJbNF07CisJdWludCAgICBwZXhfZXJyX2Rpc3I7ICAgICAgICAgICAvKiAweC5lMTAgLSBQQ0kgRXhwcmVzcyBlcnJvciBkaXNhYmxlIHJlZ2lzdGVyICovCisJY2hhciAgICByZXMyM1sxMl07CisJdWludCAgICBwZXhfZXJyX2NhcF9zdGF0OyAgICAgICAvKiAweC5lMjAgLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHN0YXR1cyByZWdpc3RlciAqLworCWNoYXIgICAgcmVzMjRbNF07CisJdWludCAgICBwZXhfZXJyX2NhcF9yMDsgICAgICAgICAvKiAweC5lMjggLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KKwl1aW50ICAgIHBleF9lcnJfY2FwX3IxOyAgICAgICAgIC8qIDB4LmUyYyAtIFBDSSBFeHByZXNzIGVycm9yIGNhcHR1cmUgcmVnaXN0ZXIgMCAqLworCXVpbnQgICAgcGV4X2Vycl9jYXBfcjI7ICAgICAgICAgLyogMHguZTMwIC0gUENJIEV4cHJlc3MgZXJyb3IgY2FwdHVyZSByZWdpc3RlciAwICovCisJdWludCAgICBwZXhfZXJyX2NhcF9yMzsgICAgICAgICAvKiAweC5lMzQgLSBQQ0kgRXhwcmVzcyBlcnJvciBjYXB0dXJlIHJlZ2lzdGVyIDAgKi8KK30gY2Nzcl9wZXhfdDsKKworLyogR2xvYmFsIFV0aWxpdHkgUmVnaXN0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBjY3NyX2d1dHMgeworCXVpbnQJcG9ycGxsc3I7CS8qIDB4LjAwMDAgLSBQT1IgUExMIFJhdGlvIFN0YXR1cyBSZWdpc3RlciAqLworCXVpbnQJcG9yYm1zcjsJLyogMHguMDAwNCAtIFBPUiBCb290IE1vZGUgU3RhdHVzIFJlZ2lzdGVyICovCisJdWludAlwb3JpbXBzY3I7CS8qIDB4LjAwMDggLSBQT1IgSS9PIEltcGVkYW5jZSBTdGF0dXMgYW5kIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl1aW50CXBvcmRldnNyOwkvKiAweC4wMDBjIC0gUE9SIEkvTyBEZXZpY2UgU3RhdHVzIFJlZ2lzdGVyICovCisJdWludAlwb3JkYmdtc3I7CS8qIDB4LjAwMTAgLSBQT1IgRGVidWcgTW9kZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczFbMTJdOworCXVpbnQJZ3Bwb3JjcjsJLyogMHguMDAyMCAtIEdlbmVyYWwtUHVycG9zZSBQT1IgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworCWNoYXIJcmVzMlsxMl07CisJdWludAlncGlvY3I7CQkvKiAweC4wMDMwIC0gR1BJTyBDb250cm9sIFJlZ2lzdGVyICovCisJY2hhcglyZXMzWzEyXTsKKwl1aW50CWdwb3V0ZHI7CS8qIDB4LjAwNDAgLSBHZW5lcmFsLVB1cnBvc2UgT3V0cHV0IERhdGEgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczRbMTJdOworCXVpbnQJZ3BpbmRyOwkJLyogMHguMDA1MCAtIEdlbmVyYWwtUHVycG9zZSBJbnB1dCBEYXRhIFJlZ2lzdGVyICovCisJY2hhcglyZXM1WzEyXTsKKwl1aW50CXBtdXhjcjsJCS8qIDB4LjAwNjAgLSBBbHRlcm5hdGUgRnVuY3Rpb24gU2lnbmFsIE11bHRpcGxleCBDb250cm9sICovCisJY2hhcglyZXM2WzEyXTsKKwl1aW50CWRldmRpc3I7CS8qIDB4LjAwNzAgLSBEZXZpY2UgRGlzYWJsZSBDb250cm9sICovCisJY2hhcglyZXM3WzEyXTsKKwl1aW50CXBvd21ndGNzcjsJLyogMHguMDA4MCAtIFBvd2VyIE1hbmFnZW1lbnQgU3RhdHVzIGFuZCBDb250cm9sIFJlZ2lzdGVyICovCisJY2hhcglyZXM4WzEyXTsKKwl1aW50CW1jcHN1bXI7CS8qIDB4LjAwOTAgLSBNYWNoaW5lIENoZWNrIFN1bW1hcnkgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczlbMTJdOworCXVpbnQJcHZyOwkJLyogMHguMDBhMCAtIFByb2Nlc3NvciBWZXJzaW9uIFJlZ2lzdGVyICovCisJdWludAlzdnI7CQkvKiAweC4wMGE0IC0gU3lzdGVtIFZlcnNpb24gUmVnaXN0ZXIgKi8KKwljaGFyCXJlczEwWzM0MTZdOworCXVpbnQJY2xrb2NyOwkJLyogMHguMGUwMCAtIENsb2NrIE91dCBTZWxlY3QgUmVnaXN0ZXIgKi8KKwljaGFyCXJlczExWzEyXTsKKwl1aW50CWRkcmRsbGNyOwkvKiAweC4wZTEwIC0gRERSIERMTCBDb250cm9sIFJlZ2lzdGVyICovCisJY2hhcglyZXMxMlsxMl07CisJdWludAlsYmNkbGxjcjsJLyogMHguMGUyMCAtIExCQyBETEwgQ29udHJvbCBSZWdpc3RlciAqLworCWNoYXIJcmVzMTNbNjE5MTZdOworfSBjY3NyX2d1dHNfdDsKKworI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfSU1NQVBfODZYWF9IX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvLmgKaW5kZXggZjFjMjQ2OS4uYTk0OTZmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pby5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW8uaApAQCAtNDAsMTIgKzQwLDYgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaXNhX2lvX2Jhc2U7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBwY2lfaW9fYmFzZTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGlvX3BhZ2VfbWFzazsKLQotI2RlZmluZSBNQVhfSVNBX1BPUlQgMHgxMDAwMAotCi0jZGVmaW5lIF9JT19JU19WQUxJRChwb3J0KSAoKHBvcnQpID49IE1BWF9JU0FfUE9SVCB8fCAoMSA8PCAocG9ydD4+UEFHRV9TSElGVCkpIFwKLQkJCSAgICAmIGlvX3BhZ2VfbWFzaykKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogLyogX19yYXdfKiBhY2Nlc3NvcnMgYXJlbid0IHN1cHBvcnRlZCBvbiBpU2VyaWVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lvbW11LmgKaW5kZXggMmFjZjdiMi4uYTVlOTg2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaW9tbXUuaApAQCAtNjYsNyArNjYsOCBAQAogLyogSW5pdGlhbGl6ZXMgYW4gaW9tbXVfdGFibGUgYmFzZWQgaW4gdmFsdWVzIHNldCBpbiB0aGUgcGFzc2VkLWluCiAgKiBzdHJ1Y3R1cmUKICAqLwotZXh0ZXJuIHN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfaW5pdF90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKiB0YmwpOworZXh0ZXJuIHN0cnVjdCBpb21tdV90YWJsZSAqaW9tbXVfaW5pdF90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKiB0YmwsCisJCQkJCSAgICBpbnQgbmlkKTsKIAogZXh0ZXJuIGludCBpb21tdV9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKIAkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsIGludCBuZWxlbXMsIHVuc2lnbmVkIGxvbmcgbWFzaywKQEAgLTc1LDcgKzc2LDggQEAKIAkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKIAogZXh0ZXJuIHZvaWQgKmlvbW11X2FsbG9jX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKLQkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBtYXNrLCBnZnBfdCBmbGFnKTsKKwkJZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgdW5zaWduZWQgbG9uZyBtYXNrLAorCQlnZnBfdCBmbGFnLCBpbnQgbm9kZSk7CiBleHRlcm4gdm9pZCBpb21tdV9mcmVlX2NvaGVyZW50KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBzaXplX3Qgc2l6ZSwKIAkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSk7CiBleHRlcm4gZG1hX2FkZHJfdCBpb21tdV9tYXBfc2luZ2xlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCB2b2lkICp2YWRkciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2lycS5oCmluZGV4IDFlOWYyNTMuLmExMGZlZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pcnEuaApAQCAtMzQ3LDYgKzM0Nyw5MiBAQAogI2RlZmluZQlTSVVfSU5UX1BDMQkJKCh1aW50KTB4M2UrQ1BNX0lSUV9PRkZTRVQpCiAjZGVmaW5lCVNJVV9JTlRfUEMwCQkoKHVpbnQpMHgzZitDUE1fSVJRX09GRlNFVCkKIAorI2VsaWYgZGVmaW5lZChDT05GSUdfUFBDXzg2eHgpCisjaW5jbHVkZSA8YXNtL21wYzg2eHguaD4KKworI2RlZmluZSBOUl9FUElDX0lOVFMgNDgKKyNpZm5kZWYgTlJfODI1OV9JTlRTCisjZGVmaW5lIE5SXzgyNTlfSU5UUyAxNiAvKlVMSSAxNTc1IGNhbiByb3V0ZSAxMiBpbnRlcnJ1cHRzICovCisjZW5kaWYKKyNkZWZpbmUgTlVNXzgyNTlfSU5URVJSVVBUUyBOUl84MjU5X0lOVFMKKworI2lmbmRlZiBJODI1OV9PRkZTRVQKKyNkZWZpbmUgSTgyNTlfT0ZGU0VUIDAKKyNlbmRpZgorCisjZGVmaW5lIE5SX0lSUVMgMjU2CisKKy8qIEludGVybmFsIElSUXMgb24gTVBDODZ4eCBPcGVuUElDICovCisKKyNpZm5kZWYgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQKKyNkZWZpbmUgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQgTlJfODI1OV9JTlRTCisjZW5kaWYKKworLyogVGhlIDQ4IGludGVybmFsIHNvdXJjZXMgKi8KKyNkZWZpbmUgTVBDODZ4eF9JUlFfTlVMTCAgICAgICAgKCAwICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX01DTSAgICAgICAgICggMSArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9ERFIgICAgICAgICAoIDIgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfTEJDICAgICAgICAgKCAzICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0RNQTAgICAgICAgICggNCArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9ETUExICAgICAgICAoIDUgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfRE1BMiAgICAgICAgKCA2ICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0RNQTMgICAgICAgICggNyArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorCisvKiBubyAxMCwxMSAqLworI2RlZmluZSBNUEM4Nnh4X0lSUV9VQVJUMiAgICAgICAoMTIgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfVFNFQzFfVFggICAgKDEzICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1RTRUMxX1JYICAgICgxNCArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9UU0VDM19UWCAgICAoMTUgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfVFNFQzNfUlggICAgKDE2ICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1RTRUMzX0VSUk9SICgxNyArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9UU0VDMV9FUlJPUiAoMTggKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfVFNFQzJfVFggICAgKDE5ICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1RTRUMyX1JYICAgICgyMCArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9UU0VDNF9UWCAgICAoMjEgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfVFNFQzRfUlggICAgKDIyICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1RTRUM0X0VSUk9SICgyMyArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9UU0VDMl9FUlJPUiAoMjQgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKy8qIG5vIDI1ICovCisjZGVmaW5lIE1QQzg2eHhfSVJRX1VBUlQxICAgICAgICgyNiArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9JSUMgICAgICAgICAoMjcgKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfUEVSRk1PTiAgICAgICAoMjggKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKy8qIG5vIDI5LDMwLDMxICovCisjZGVmaW5lIE1QQzg2eHhfSVJRX1NSSU9fRVJST1IgICAgKDMyICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1NSSU9fT1VUX0JFTEwgKDMzICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX1NSSU9fSU5fQkVMTCAgKDM0ICsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisvKiBubyAzNSwzNiAqLworI2RlZmluZSBNUEM4Nnh4X0lSUV9TUklPX09VVF9NU0cxICgzNyArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9TUklPX0lOX01TRzEgICgzOCArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9TUklPX09VVF9NU0cyICgzOSArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorI2RlZmluZSBNUEM4Nnh4X0lSUV9TUklPX0lOX01TRzIgICg0MCArIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorCisvKiBUaGUgMTIgZXh0ZXJuYWwgaW50ZXJydXB0IGxpbmVzICovCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVF9CQVNFCTQ4CisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDAJKDAgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDEJKDEgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDIJKDIgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDMJKDMgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDQJKDQgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDUJKDUgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDYJKDYgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDcJKDcgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDgJKDggKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDkJKDkgKyBNUEM4Nnh4X0lSUV9FWFRfQkFTRSBcCisJCSsgTVBDODZ4eF9PUEVOUElDX0lSUV9PRkZTRVQpCisjZGVmaW5lIE1QQzg2eHhfSVJRX0VYVDEwCSgxMCArIE1QQzg2eHhfSVJRX0VYVF9CQVNFIFwKKwkJKyBNUEM4Nnh4X09QRU5QSUNfSVJRX09GRlNFVCkKKyNkZWZpbmUgTVBDODZ4eF9JUlFfRVhUMTEJKDExICsgTVBDODZ4eF9JUlFfRVhUX0JBU0UgXAorCQkrIE1QQzg2eHhfT1BFTlBJQ19JUlFfT0ZGU0VUKQorCiAjZWxzZSAvKiBDT05GSUdfNDB4ICsgQ09ORklHXzh4eCAqLwogLyoKICAqIHRoaXMgaXMgdGhlICMgaXJxJ3MgZm9yIGFsbCBwcGMgYXJjaCdzIChwbWFjL2NocnAvcHJlcCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9pc2VyaWVzL2lvbW11LmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL2lvbW11LmgKcmVuYW1lIHRvIGluY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pb21tdS5oCmluZGV4IGNiNTY1OGYuLjBlZGJmZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9pb21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvaXNlcmllcy9pb21tdS5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAotI2RlZmluZSBfUExBVEZPUk1TX0lTRVJJRVNfSU9NTVVfSAorI2lmbmRlZiBfQVNNX1BPV0VSUENfSVNFUklFU19JT01NVV9ICisjZGVmaW5lIF9BU01fUE9XRVJQQ19JU0VSSUVTX0lPTU1VX0gKIAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwNSAgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcnBvcmF0aW9uCkBAIC0zMiw0ICszMiw0IEBACiAJCXVuc2lnbmVkIGNoYXIgc2xvdG5vLCB1bnNpZ25lZCBjaGFyIHZpcnRidXMsCiAJCXN0cnVjdCBpb21tdV90YWJsZSAqdGJsKTsKIAotI2VuZGlmIC8qIF9QTEFURk9STVNfSVNFUklFU19JT01NVV9IICovCisjZW5kaWYgLyogX0FTTV9QT1dFUlBDX0lTRVJJRVNfSU9NTVVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9rZHVtcC5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZHVtcC5oCmluZGV4IGE4N2FlZDAuLjVhNWMzYjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2R1bXAuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL2tkdW1wLmgKQEAgLTEsMTMgKzEsMzggQEAKICNpZm5kZWYgX1BQQzY0X0tEVU1QX0gKICNkZWZpbmUgX1BQQzY0X0tEVU1QX0gKIAorLyogS2R1bXAga2VybmVsIHJ1bnMgYXQgMzIgTUIsIGNoYW5nZSBhdCB5b3VyIHBlcmlsLiAqLworI2RlZmluZSBLRFVNUF9LRVJORUxCQVNFCTB4MjAwMDAwMAorCiAvKiBIb3cgbWFueSBieXRlcyB0byByZXNlcnZlIGF0IHplcm8gZm9yIGtkdW1wLiBUaGUgcmVzZXJ2ZSBsaW1pdCBzaG91bGQKLSAqIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHRyYW1wb2xpbmUncyBlbmQgYWRkcmVzcy4gKi8KKyAqIGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gdGhlIHRyYW1wb2xpbmUncyBlbmQgYWRkcmVzcy4KKyAqIFJlc2VydmUgdG8gdGhlIGVuZCBvZiB0aGUgRldOTUkgYXJlYSwgc2VlIGhlYWRfNjQuUyAqLwogI2RlZmluZSBLRFVNUF9SRVNFUlZFX0xJTUlUCTB4ODAwMAogCisjaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKKworI2RlZmluZSBQSFlTSUNBTF9TVEFSVAlLRFVNUF9LRVJORUxCQVNFCiAjZGVmaW5lIEtEVU1QX1RSQU1QT0xJTkVfU1RBUlQJMHgwMTAwCiAjZGVmaW5lIEtEVU1QX1RSQU1QT0xJTkVfRU5ECTB4MzAwMAogCi1leHRlcm4gdm9pZCBrZHVtcF9zZXR1cCh2b2lkKTsKKyNlbHNlIC8qICFDT05GSUdfQ1JBU0hfRFVNUCAqLworCisjZGVmaW5lIFBIWVNJQ0FMX1NUQVJUCTB4MAorCisjZW5kaWYgLyogQ09ORklHX0NSQVNIX0RVTVAgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKyNpZmRlZiBDT05GSUdfQ1JBU0hfRFVNUAorCitleHRlcm4gdm9pZCByZXNlcnZlX2tkdW1wX3RyYW1wb2xpbmUodm9pZCk7CitleHRlcm4gdm9pZCBzZXR1cF9rZHVtcF90cmFtcG9saW5lKHZvaWQpOworCisjZWxzZSAvKiAhQ09ORklHX0NSQVNIX0RVTVAgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2VydmVfa2R1bXBfdHJhbXBvbGluZSh2b2lkKSB7IDsgfQorc3RhdGljIGlubGluZSB2b2lkIHNldHVwX2tkdW1wX3RyYW1wb2xpbmUodm9pZCkgeyA7IH0KKworI2VuZGlmIC8qIENPTkZJR19DUkFTSF9EVU1QICovCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX1BQQzY0X0tEVU1QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMva2V4ZWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMva2V4ZWMuaAppbmRleCA2YTJhZjJmLi5lZmU4ODcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL2tleGVjLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9rZXhlYy5oCkBAIC0zMSw5ICszMSwxMCBAQAogI2RlZmluZSBLRVhFQ19BUkNIIEtFWEVDX0FSQ0hfUFBDCiAjZW5kaWYKIAorI2lmbmRlZiBfX0FTU0VNQkxZX18KKwogI2lmZGVmIENPTkZJR19LRVhFQwogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwogI2lmZGVmIF9fcG93ZXJwYzY0X18KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjYXB0dXJpbmcgcmVnaXN0ZXIgc3RhdGVzIGlmIGNvbWluZwpAQCAtMTIzLDggKzEyNCwxOSBAQAogZXh0ZXJuIHZvaWQgZGVmYXVsdF9tYWNoaW5lX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAogZXh0ZXJuIHZvaWQgbWFjaGluZV9rZXhlY19zaW1wbGUoc3RydWN0IGtpbWFnZSAqaW1hZ2UpOworZXh0ZXJuIGludCBvdmVybGFwc19jcmFzaGtlcm5lbCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgcmVzZXJ2ZV9jcmFzaGtlcm5lbCh2b2lkKTsKIAotI2VuZGlmIC8qICEgX19BU1NFTUJMWV9fICovCisjZWxzZSAvKiAhQ09ORklHX0tFWEVDICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXBzX2NyYXNoa2VybmVsKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2VydmVfY3Jhc2hrZXJuZWwodm9pZCkgeyA7IH0KKwogI2VuZGlmIC8qIENPTkZJR19LRVhFQyAqLworI2VuZGlmIC8qICEgX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19LRVhFQ19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21hY2hkZXAuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCmluZGV4IDNlN2QzN2EuLjczZGIxZjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbWFjaGRlcC5oCkBAIC0yMzcsNiArMjM3LDExIEBACiAJICovCiAJdm9pZCAoKm1hY2hpbmVfa2V4ZWMpKHN0cnVjdCBraW1hZ2UgKmltYWdlKTsKICNlbmRpZiAvKiBDT05GSUdfS0VYRUMgKi8KKworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaW50ICgqZW5hYmxlX21zaSkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCXZvaWQgKCpkaXNhYmxlX21zaSkoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworI2VuZGlmIC8qIENPTkZJR19QQ0lfTVNJICovCiB9OwogCiBleHRlcm4gdm9pZCBwb3dlcjRfaWRsZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdS5oCmluZGV4IDMxZjcyMTkuLjNhNWViZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11LmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9tbXUuaApAQCAtOTYsNiArOTYsOCBAQAogI2RlZmluZSBIUFRFX1JfRkxBR1MJCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAzZmYpCiAjZGVmaW5lIEhQVEVfUl9QUAkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDAwMykKICNkZWZpbmUgSFBURV9SX04JCUFTTV9DT05TVCgweDAwMDAwMDAwMDAwMDAwMDQpCisjZGVmaW5lIEhQVEVfUl9DCQlBU01fQ09OU1QoMHgwMDAwMDAwMDAwMDAwMDgwKQorI2RlZmluZSBIUFRFX1JfUgkJQVNNX0NPTlNUKDB4MDAwMDAwMDAwMDAwMDEwMCkKIAogLyogVmFsdWVzIGZvciBQUCAoYXNzdW1lcyBLcz0wLCBLcD0xKSAqLwogLyogcHAwIHdpbGwgYWx3YXlzIGJlIDAgZm9yIGxpbnV4ICAgICAqLwpAQCAtMTYzLDYgKzE2NSwxNiBAQAogZXh0ZXJuIHN0cnVjdCBtbXVfcHNpemVfZGVmIG1tdV9wc2l6ZV9kZWZzW01NVV9QQUdFX0NPVU5UXTsKIGV4dGVybiBpbnQgbW11X2xpbmVhcl9wc2l6ZTsKIGV4dGVybiBpbnQgbW11X3ZpcnR1YWxfcHNpemU7CitleHRlcm4gaW50IG1tdV92bWFsbG9jX3BzaXplOworZXh0ZXJuIGludCBtbXVfaW9fcHNpemU7CisKKy8qCisgKiBJZiB0aGUgcHJvY2Vzc29yIHN1cHBvcnRzIDY0ayBub3JtYWwgcGFnZXMgYnV0IG5vdCA2NGsgY2FjaGUKKyAqIGluaGliaXRlZCBwYWdlcywgd2UgaGF2ZSB0byBiZSBwcmVwYXJlZCB0byBzd2l0Y2ggcHJvY2Vzc2VzCisgKiB0byB1c2UgNGsgcGFnZXMgd2hlbiB0aGV5IGNyZWF0ZSBjYWNoZS1pbmhpYml0ZWQgbWFwcGluZ3MuCisgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBtbXVfY2lfcmVzdHJpY3Rpb25zIHdpbGwgYmUgc2V0IHRvIDEuCisgKi8KK2V4dGVybiBpbnQgbW11X2NpX3Jlc3RyaWN0aW9uczsKIAogI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKIC8qCkBAIC0yNTQsNiArMjY2LDcgQEAKIAogZXh0ZXJuIHZvaWQgc3RhYnNfYWxsb2Modm9pZCk7CiBleHRlcm4gdm9pZCBzbGJfaW5pdGlhbGl6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNsYl9mbHVzaF9hbmRfcmVib2x0KHZvaWQpOwogZXh0ZXJuIHZvaWQgc3RhYl9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgc3RhYik7CiAKICNlbmRpZiAvKiBfX0FTU0VNQkxZX18gKi8KQEAgLTM1Nyw5ICszNzAsMTIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCW1tX2NvbnRleHRfaWRfdCBpZDsKKwl1MTYgdXNlcl9wc2l6ZTsJCQkvKiBwYWdlIHNpemUgaW5kZXggKi8KKwl1MTYgc2xscDsJCQkvKiBTTEIgZW50cnkgcGFnZSBzaXplIGVuY29kaW5nICovCiAjaWZkZWYgQ09ORklHX0hVR0VUTEJfUEFHRQogCXUxNiBsb3dfaHRsYl9hcmVhcywgaGlnaF9odGxiX2FyZWFzOwogI2VuZGlmCisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7CiB9IG1tX2NvbnRleHRfdDsKIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKaW5kZXggMWI4YTI1Zi4uOGM2YjFhNmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21tdV9jb250ZXh0LmgKQEAgLTIwLDE2ICsyMCw5IEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS8qCi0gKiBHZXR0aW5nIGludG8gYSBrZXJuZWwgdGhyZWFkLCB0aGVyZSBpcyBubyB2YWxpZCB1c2VyIHNlZ21lbnQsIG1hcmsKLSAqIHBhY2EtPnBnZGlyIE5VTEwgc28gdGhhdCBTTEIgbWlzcyBvbiB1c2VyIGFkZHJlc3NlcyB3aWxsIGZhdWx0Ci0gKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5X3RsYihzdHJ1Y3QgbW1fc3RydWN0ICptbSwKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewotI2lmZGVmIENPTkZJR19QUENfNjRLX1BBR0VTCi0JZ2V0X3BhY2EoKS0+cGdkaXIgPSBOVUxMOwotI2VuZGlmIC8qIENPTkZJR19QUENfNjRLX1BBR0VTICovCiB9CiAKICNkZWZpbmUgTk9fQ09OVEVYVAkwCkBAIC01MiwxMyArNDUsOCBAQAogCQljcHVfc2V0KHNtcF9wcm9jZXNzb3JfaWQoKSwgbmV4dC0+Y3B1X3ZtX21hc2spOwogCiAJLyogTm8gbmVlZCB0byBmbHVzaCB1c2Vyc3BhY2Ugc2VnbWVudHMgaWYgdGhlIG1tIGRvZXNudCBjaGFuZ2UgKi8KLSNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwotCWlmIChwcmV2ID09IG5leHQgJiYgZ2V0X3BhY2EoKS0+cGdkaXIgPT0gbmV4dC0+cGdkKQotCQlyZXR1cm47Ci0jZWxzZQogCWlmIChwcmV2ID09IG5leHQpCiAJCXJldHVybjsKLSNlbmRpZiAvKiBDT05GSUdfUFBDXzY0S19QQUdFUyAqLwogCiAjaWZkZWYgQ09ORklHX0FMVElWRUMKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQUxUSVZFQykpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBjODZ4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTY3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL21wYzg2eHguaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogTVBDODZ4eCBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcjogSmVmZiBCcm93bgorICoKKyAqIENvcHlyaWdodCAyMDA0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fQVNNX1BPV0VSUENfTVBDODZ4eF9IX18KKyNkZWZpbmUgX19BU01fUE9XRVJQQ19NUEM4Nnh4X0hfXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL21tdS5oPgorCisjaWZkZWYgQ09ORklHX1BQQ184Nnh4CisKKyNpZmRlZiBDT05GSUdfTVBDODY0MV9IUENOCisjaW5jbHVkZSA8cGxhdGZvcm1zLzg2eHgvbXBjODY0MV9ocGNuLmg+CisjZW5kaWYKKworI2RlZmluZSBfSU9fQkFTRSAgICAgICAgaXNhX2lvX2Jhc2UKKyNkZWZpbmUgX0lTQV9NRU1fQkFTRSAgIGlzYV9tZW1fYmFzZQorI2lmZGVmIENPTkZJR19QQ0kKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIHBjaV9kcmFtX29mZnNldAorI2Vsc2UKKyNkZWZpbmUgUENJX0RSQU1fT0ZGU0VUIDAKKyNlbmRpZgorCisjZGVmaW5lIENQVTBfQk9PVF9SRUxFQVNFIDB4MDEwMDAwMDAKKyNkZWZpbmUgQ1BVMV9CT09UX1JFTEVBU0UgMHgwMjAwMDAwMAorI2RlZmluZSBDUFVfQUxMX1JFTEVBU0VEIChDUFUwX0JPT1RfUkVMRUFTRSB8IENQVTFfQk9PVF9SRUxFQVNFKQorI2RlZmluZSBNQ01fUE9SVF9DT05GSUdfT0ZGU0VUIDB4MTAxMAorCisvKiBPZmZzZXQgZnJvbSBDQ1NSQkFSICovCisjZGVmaW5lIE1QQzg2eHhfT1BFTlBJQ19PRkZTRVQJKDB4NDAwMDApCisjZGVmaW5lIE1QQzg2eHhfTUNNX09GRlNFVCAgICAgICgweDAwMDAwKQorI2RlZmluZSBNUEM4Nnh4X01DTV9TSVpFICAgICAgICAoMHgwMjAwMCkKKworI2VuZGlmIC8qIENPTkZJR19QUENfODZ4eCAqLworI2VuZGlmIC8qIF9fQVNNX1BPV0VSUENfTVBDODZ4eF9IX18gKi8KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL21waWMuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCmluZGV4IDZiOWU3ODEuLmYwZDIyYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvbXBpYy5oCkBAIC0yMiw2ICsyMiwxMCBAQAogI2RlZmluZQkJTVBJQ19HUkVHX0dDT05GXzgyNTlfUFRIUk9VX0RJUwkJMHgyMDAwMDAwMAogI2RlZmluZQkJTVBJQ19HUkVHX0dDT05GX0JBU0VfTUFTSwkJMHgwMDBmZmZmZgogI2RlZmluZSBNUElDX0dSRUdfR0xPQkFMX0NPTkZfMQkJMHgwMDAzMAorI2RlZmluZQkJTVBJQ19HUkVHX0dMT0JBTF9DT05GXzFfU0lFCQkweDA4MDAwMDAwCisjZGVmaW5lCQlNUElDX0dSRUdfR0xPQkFMX0NPTkZfMV9DTEtfUkFUSU9fTUFTSwkweDcwMDAwMDAwCisjZGVmaW5lCQlNUElDX0dSRUdfR0xPQkFMX0NPTkZfMV9DTEtfUkFUSU8ocikJXAorCQkJKCgocikgPDwgMjgpICYgTVBJQ19HUkVHX0dMT0JBTF9DT05GXzFfQ0xLX1JBVElPX01BU0spCiAjZGVmaW5lIE1QSUNfR1JFR19WRU5ET1JfMAkJMHgwMDA0MAogI2RlZmluZSBNUElDX0dSRUdfVkVORE9SXzEJCTB4MDAwNTAKICNkZWZpbmUgTVBJQ19HUkVHX1ZFTkRPUl8yCQkweDAwMDYwCkBAIC0yODQsNiArMjg4LDEyIEBACiAvKiBUaGlzIG9uZSBnZXRzIHRvIHRoZSBwcmltYXJ5IG1waWMgKi8KIGV4dGVybiBpbnQgbXBpY19nZXRfaXJxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAorLyogU2V0IHRoZSBFUElDIGNsb2NrIHJhdGlvICovCit2b2lkIG1waWNfc2V0X2Nsa19yYXRpbyhzdHJ1Y3QgbXBpYyAqbXBpYywgdTMyIGNsb2NrX3JhdGlvKTsKKworLyogRW5hYmxlL0Rpc2FibGUgRVBJQyBzZXJpYWwgaW50ZXJydXB0IG1vZGUgKi8KK3ZvaWQgbXBpY19zZXRfc2VyaWFsX2ludChzdHJ1Y3QgbXBpYyAqbXBpYywgaW50IGVuYWJsZSk7CisKIC8qIGdsb2JhbCBtcGljIGZvciBwU2VyaWVzICovCiBleHRlcm4gc3RydWN0IG1waWMgKnBTZXJpZXNfbXBpYzsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWNhLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaAppbmRleCAzYzZmNjQ0Li4yZDQ1ODVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BhY2EuaApAQCAtNzgsMTEgKzc4LDkgQEAKIAl1NjQgZXhtY1sxMF07CQkvKiB1c2VkIGZvciBtYWNoaW5lIGNoZWNrcyAqLwogCXU2NCBleHNsYlsxMF07CQkvKiB1c2VkIGZvciBTTEIvc2VnbWVudCB0YWJsZSBtaXNzZXMKICAJCQkJICogb24gdGhlIGxpbmVhciBtYXBwaW5nICovCi0jaWZkZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKLQlwZ2RfdCAqcGdkaXI7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ182NEtfUEFHRVMgKi8KIAogCW1tX2NvbnRleHRfdCBjb250ZXh0OworCXUxNiB2bWFsbG9jX3NsbHA7CiAJdTE2IHNsYl9jYWNoZVtTTEJfQ0FDSEVfRU5UUklFU107CiAJdTE2IHNsYl9jYWNoZV9wdHI7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGFnZS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKaW5kZXggZjA0NjliOS4uZmI1OTdiMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wYWdlLmgKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KICNpbmNsdWRlIDxhc20vYXNtLWNvbXBhdC5oPgorI2luY2x1ZGUgPGFzbS9rZHVtcC5oPgogCiAvKgogICogT24gUFBDMzIgcGFnZSBzaXplIGlzIDRLLiBGb3IgUFBDNjQgd2Ugc3VwcG9ydCBlaXRoZXIgNEsgb3IgNjRLIHNvZnR3YXJlCkBAIC01MSwxMyArNTIsNiBAQAogICogSWYgeW91IHdhbnQgdG8gdGVzdCBpZiBzb21ldGhpbmcncyBhIGtlcm5lbCBhZGRyZXNzLCB1c2UgaXNfa2VybmVsX2FkZHIoKS4KICAqLwogCi0jaWZkZWYgQ09ORklHX0NSQVNIX0RVTVAKLS8qIEtkdW1wIGtlcm5lbCBydW5zIGF0IDMyIE1CLCBjaGFuZ2UgYXQgeW91ciBwZXJpbC4gKi8KLSNkZWZpbmUgUEhZU0lDQUxfU1RBUlQJMHgyMDAwMDAwCi0jZWxzZQotI2RlZmluZSBQSFlTSUNBTF9TVEFSVAkweDAKLSNlbmRpZgotCiAjZGVmaW5lIFBBR0VfT0ZGU0VUICAgICBBU01fQ09OU1QoQ09ORklHX0tFUk5FTF9TVEFSVCkKICNkZWZpbmUgS0VSTkVMQkFTRSAgICAgIChQQUdFX09GRlNFVCArIFBIWVNJQ0FMX1NUQVJUKQogCkBAIC0xOTcsNiArMTkxLDkgQEAKIAkJc3RydWN0IHBhZ2UgKnApOwogZXh0ZXJuIGludCBwYWdlX2lzX3JhbSh1bnNpZ25lZCBsb25nIHBmbik7CiAKK3N0cnVjdCB2bV9hcmVhX3N0cnVjdDsKK2V4dGVybiBjb25zdCBjaGFyICphcmNoX3ZtYV9uYW1lKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKKwogI2luY2x1ZGUgPGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oPgogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BjaS1icmlkZ2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCmluZGV4IDM4ZGU5MmQuLjRmNTU1NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGNpLWJyaWRnZS5oCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGFzbS1wcGMvcGNpLWJyaWRnZS5oPgogI2Vsc2UKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIApAQCAtMjIsNiArMjMsNyBAQAogc3RydWN0IHBjaV9jb250cm9sbGVyIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCWNoYXIgaXNfZHluYW1pYzsKKwlpbnQgbm9kZTsKIAl2b2lkICphcmNoX2RhdGE7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CiAKQEAgLTc4LDEyICs4MCw2IEBACiAJc3RydWN0CWlvbW11X3RhYmxlICppb21tdV90YWJsZTsJLyogZm9yIHBoYidzIG9yIGJyaWRnZXMgKi8KIAlzdHJ1Y3QJcGNpX2RldiAqcGNpZGV2OwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIHBjaSBkZXZpY2UgKi8KIAlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5vZGU7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgZGV2aWNlX25vZGUgKi8KLSNpZmRlZiBDT05GSUdfUFBDX0lTRVJJRVMKLQlzdHJ1Y3QJbGlzdF9oZWFkIERldmljZV9MaXN0OwotCWludAlJcnE7CQkJLyogQXNzaWduZWQgSVJRICovCi0JaW50CUZsYWdzOwkJCS8qIFBvc3NpYmxlIGZsYWdzKGRpc2FibGUvYmlzdCkqLwotCXU4CUxvZ2ljYWxTbG90OwkJLyogSHYgU2xvdCBJbmRleCBmb3IgVGNlcyAqLwotI2VuZGlmCiAJdTMyCWNvbmZpZ19zcGFjZVsxNl07CS8qIHNhdmVkIFBDSSBjb25maWcgc3BhY2UgKi8KIH07CiAKQEAgLTE3MSw2ICsxNjcsMTIgQEAKICNkZWZpbmUgUENJX1BST0JFX05PUk1BTAkwCS8qIERvIG5vcm1hbCBQQ0kgcHJvYmluZyAqLwogI2RlZmluZSBQQ0lfUFJPQkVfREVWVFJFRQkxCS8qIEluc3RhbnRpYXRlIGZyb20gZGV2aWNlIHRyZWUgKi8KIAorI2lmZGVmIENPTkZJR19OVU1BCisjZGVmaW5lIFBIQl9TRVRfTk9ERShQSEIsIE5PREUpCQkoKFBIQiktPm5vZGUgPSAoTk9ERSkpCisjZWxzZQorI2RlZmluZSBQSEJfU0VUX05PREUoUEhCLCBOT0RFKQkJKChQSEIpLT5ub2RlID0gLTEpCisjZW5kaWYKKwogI2VuZGlmIC8qIENPTkZJR19QUEM2NCAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZXJjcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGVyY3B1LmgKaW5kZXggMTg0YTdhNC4uZmFhMWZjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BlcmNwdS5oCkBAIC0yMiw2ICsyMiw3IEBACiAvKiB2YXIgaXMgaW4gZGlzY2FyZGVkIHJlZ2lvbjogb2Zmc2V0IHRvIHBhcnRpY3VsYXIgY29weSB3ZSB3YW50ICovCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fcGVyX2NwdV9vZmZzZXQoY3B1KSkpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX215X2NwdV9vZmZzZXQoKSkpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19teV9jcHVfb2Zmc2V0KCkpKQogCiAvKiBBIG1hY3JvIHRvIGF2b2lkICNpbmNsdWRlIGhlbGwuLi4gKi8KICNkZWZpbmUgcGVyY3B1X21vZGNvcHkocGNwdWRzdCwgc3JjLCBzaXplKQkJCVwKQEAgLTQxLDYgKzQyLDcgQEAKIAogI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KQkJCSgqKCh2b2lkKShjcHUpLCAmcGVyX2NwdV9fIyN2YXIpKQogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgorI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpCQkJcGVyX2NwdV9fIyN2YXIKIAogI2VuZGlmCS8qIFNNUCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNGsuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS00ay5oCmluZGV4IGIyZTE4NjIuLmU3MDM2MTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS00ay5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS00ay5oCkBAIC03OCw2ICs3OCw4IEBACiAKICNkZWZpbmUgcHRlX2l0ZXJhdGVfaGFzaGVkX2VuZCgpIH0gd2hpbGUoMCkKIAorI2RlZmluZSBwdGVfcGFnZXNpemVfaW5kZXgocHRlKQlNTVVfUEFHRV80SworCiAvKgogICogNC1sZXZlbCBwYWdlIHRhYmxlcyByZWxhdGVkIGJpdHMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTY0ay5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLTY0ay5oCmluZGV4IDY1MzkxNTAuLjRiNzEyNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcGd0YWJsZS02NGsuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUtNjRrLmgKQEAgLTkwLDYgKzkwLDggQEAKIAogI2RlZmluZSBwdGVfaXRlcmF0ZV9oYXNoZWRfZW5kKCkgfSB3aGlsZSgwKTsgfSB9IHdoaWxlKDApCiAKKyNkZWZpbmUgcHRlX3BhZ2VzaXplX2luZGV4KHB0ZSkJXAorCSgoKHB0ZSkgJiBfUEFHRV9DT01CTyk/IE1NVV9QQUdFXzRLOiBNTVVfUEFHRV82NEspCiAKICNlbmRpZiAvKiAgX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAppbmRleCA5NjRlMzEyLi44ZGJmNWFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3BndGFibGUuaApAQCAtNDYsOCArNDYsOCBAQAogLyoKICAqIERlZmluZSB0aGUgYWRkcmVzcyByYW5nZSBvZiB0aGUgdm1hbGxvYyBWTSBhcmVhLgogICovCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQgKDB4RDAwMDAwMDAwMDAwMDAwMHVsKQotI2RlZmluZSBWTUFMTE9DX1NJWkUgICgweDgwMDAwMDAwMDAwVUwpCisjZGVmaW5lIFZNQUxMT0NfU1RBUlQgQVNNX0NPTlNUKDB4RDAwMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgVk1BTExPQ19TSVpFICBBU01fQ09OU1QoMHg4MDAwMDAwMDAwMCkKICNkZWZpbmUgVk1BTExPQ19FTkQgICAoVk1BTExPQ19TVEFSVCArIFZNQUxMT0NfU0laRSkKIAogLyoKQEAgLTQxMiwxMiArNDEyLDYgQEAKIAkJZmx1c2hfdGxiX3BlbmRpbmcoKTsKIAl9CiAJcHRlID0gX19wdGUocHRlX3ZhbChwdGUpICYgfl9QQUdFX0hQVEVGTEFHUyk7Ci0KLSNpZmRlZiBDT05GSUdfUFBDXzY0S19QQUdFUwotCWlmIChtbXVfdmlydHVhbF9wc2l6ZSAhPSBNTVVfUEFHRV82NEspCi0JCXB0ZSA9IF9fcHRlKHB0ZV92YWwocHRlKSB8IF9QQUdFX0NPTUJPKTsKLSNlbmRpZiAvKiBDT05GSUdfUFBDXzY0S19QQUdFUyAqLwotCiAJKnB0ZXAgPSBwdGU7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb2Nlc3Nvci5oCmluZGV4IDkzZjgzZWYuLjIyZTU0YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcHJvY2Vzc29yLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9jZXNzb3IuaApAQCAtMTQ5LDExICsxNDksMTEgQEAKIAkJdW5zaWduZWQgaW50IHZhbDsJLyogRmxvYXRpbmcgcG9pbnQgc3RhdHVzICovCiAJfSBmcHNjcjsKIAlpbnQJCWZwZXhjX21vZGU7CS8qIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiBtb2RlICovCisJdW5zaWduZWQgaW50CWFsaWduX2N0bDsJLyogYWxpZ25tZW50IGhhbmRsaW5nIGNvbnRyb2wgKi8KICNpZmRlZiBDT05GSUdfUFBDNjQKIAl1bnNpZ25lZCBsb25nCXN0YXJ0X3RiOwkvKiBTdGFydCBwdXJyIHdoZW4gcHJvYyBzd2l0Y2hlZCBpbiAqLwogCXVuc2lnbmVkIGxvbmcJYWNjdW1fdGI7CS8qIFRvdGFsIGFjY3VtaWxhdGVkIHB1cnIgZm9yIHByb2Nlc3MgKi8KICNlbmRpZgotCXVuc2lnbmVkIGxvbmcJdmRzb19iYXNlOwkvKiBiYXNlIG9mIHRoZSB2RFNPIGxpYnJhcnkgKi8KIAl1bnNpZ25lZCBsb25nCWRhYnI7CQkvKiBEYXRhIGFkZHJlc3MgYnJlYWtwb2ludCByZWdpc3RlciAqLwogI2lmZGVmIENPTkZJR19BTFRJVkVDCiAJLyogQ29tcGxldGUgQWx0aVZlYyByZWdpc3RlciBzZXQgKi8KQEAgLTE5MCw3ICsxOTAsNyBAQAogCS5mcyA9IEtFUk5FTF9EUywgXAogCS5mcHIgPSB7MH0sIFwKIAkuZnBzY3IgPSB7IC52YWwgPSAwLCB9LCBcCi0JLmZwZXhjX21vZGUgPSBNU1JfRkUwfE1TUl9GRTEsIFwKKwkuZnBleGNfbW9kZSA9IDAsIFwKIH0KICNlbmRpZgogCkBAIC0yMTIsNiArMjEyLDE4IEBACiBleHRlcm4gaW50IGdldF9mcGV4Y19tb2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBsb25nIGFkcik7CiBleHRlcm4gaW50IHNldF9mcGV4Y19tb2RlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgdmFsKTsKIAorI2RlZmluZSBHRVRfRU5ESUFOKHRzaywgYWRyKSBnZXRfZW5kaWFuKCh0c2spLCAoYWRyKSkKKyNkZWZpbmUgU0VUX0VORElBTih0c2ssIHZhbCkgc2V0X2VuZGlhbigodHNrKSwgKHZhbCkpCisKK2V4dGVybiBpbnQgZ2V0X2VuZGlhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdW5zaWduZWQgbG9uZyBhZHIpOworZXh0ZXJuIGludCBzZXRfZW5kaWFuKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworI2RlZmluZSBHRVRfVU5BTElHTl9DVEwodHNrLCBhZHIpCWdldF91bmFsaWduX2N0bCgodHNrKSwgKGFkcikpCisjZGVmaW5lIFNFVF9VTkFMSUdOX0NUTCh0c2ssIHZhbCkJc2V0X3VuYWxpZ25fY3RsKCh0c2spLCAodmFsKSkKKworZXh0ZXJuIGludCBnZXRfdW5hbGlnbl9jdGwoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGxvbmcgYWRyKTsKK2V4dGVybiBpbnQgc2V0X3VuYWxpZ25fY3RsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1bnNpZ25lZCBpbnQgdmFsKTsKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgX191bnBhY2tfZmUwMSh1bnNpZ25lZCBsb25nIG1zcl9iaXRzKQogewogCXJldHVybiAoKG1zcl9iaXRzICYgTVNSX0ZFMCkgPj4gMTApIHwgKChtc3JfYml0cyAmIE1TUl9GRTEpID4+IDgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wcm9tLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaAppbmRleCBmNGUyY2E2Li4wMTBkMTg2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Byb20uaApAQCAtMjI5LDcgKzIyOSwxNiBAQAogZXh0ZXJuIGludCBvZl9wY2lfYWRkcmVzc190b19yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldiwgaW50IGJhciwKIAkJCQkgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpOwogCisvKiBQYXJzZSB0aGUgaWJtLGRtYS13aW5kb3cgcHJvcGVydHkgb2YgYW4gT0Ygbm9kZSBpbnRvIHRoZSBidXNubywgcGh5cyBhbmQKKyAqIHNpemUgcGFyYW1ldGVycy4KKyAqLwordm9pZCBvZl9wYXJzZV9kbWFfd2luZG93KHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIHVuc2lnbmVkIGNoYXIgKmRtYV93aW5kb3dfcHJvcCwKKwkJdW5zaWduZWQgbG9uZyAqYnVzbm8sIHVuc2lnbmVkIGxvbmcgKnBoeXMsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCiBleHRlcm4gdm9pZCBrZHVtcF9tb3ZlX2RldmljZV90cmVlKHZvaWQpOwogCisvKiBDUFUgT0Ygbm9kZSBtYXRjaGluZyAqLworc3RydWN0IGRldmljZV9ub2RlICpvZl9nZXRfY3B1X25vZGUoaW50IGNwdSwgdW5zaWduZWQgaW50ICp0aHJlYWQpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9QT1dFUlBDX1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcHRyYWNlLmgKaW5kZXggOWM1NTBiMy4uZGM0Y2I5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3B0cmFjZS5oCkBAIC0yMjksMTMgKzIyOSwxMyBAQAogI2RlZmluZSBQVFJBQ0VfR0VUX0RFQlVHUkVHCTI1CiAjZGVmaW5lIFBUUkFDRV9TRVRfREVCVUdSRUcJMjYKIAotI2lmZGVmIF9fcG93ZXJwYzY0X18KIC8qIEFkZGl0aW9uYWwgUFRSQUNFIHJlcXVlc3RzIGltcGxlbWVudGVkIG9uIFBvd2VyUEMuICovCiAjZGVmaW5lIFBQQ19QVFJBQ0VfR0VUUkVHUwkweDk5CS8qIEdldCBHUFJzIDAgLSAzMSAqLwogI2RlZmluZSBQUENfUFRSQUNFX1NFVFJFR1MJMHg5OAkvKiBTZXQgR1BScyAwIC0gMzEgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9HRVRGUFJFR1MJMHg5NwkvKiBHZXQgRlBScyAwIC0gMzEgKi8KICNkZWZpbmUgUFBDX1BUUkFDRV9TRVRGUFJFR1MJMHg5NgkvKiBTZXQgRlBScyAwIC0gMzEgKi8KIAorI2lmZGVmIF9fcG93ZXJwYzY0X18KIC8qIENhbGxzIHRvIHRyYWNlIGEgNjRiaXQgcHJvZ3JhbSBmcm9tIGEgMzJiaXQgcHJvZ3JhbSAqLwogI2RlZmluZSBQUENfUFRSQUNFX1BFRUtURVhUXzMyNjQgMHg5NQogI2RlZmluZSBQUENfUFRSQUNFX1BFRUtEQVRBXzMyNjQgMHg5NApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvcmVnLmgKaW5kZXggYmQ0NjdiZi4uY2Y3MzQ3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9yZWcuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3JlZy5oCkBAIC05Myw4ICs5Myw4IEBACiAjZGVmaW5lIE1TUl9MRQkJX19NQVNLKE1TUl9MRV9MRykJLyogTGl0dGxlIEVuZGlhbiAqLwogCiAjaWZkZWYgQ09ORklHX1BQQzY0Ci0jZGVmaW5lIE1TUl8JCU1TUl9NRSB8IE1TUl9SSSB8IE1TUl9JUiB8IE1TUl9EUiB8IE1TUl9JU0YKLSNkZWZpbmUgTVNSX0tFUk5FTCAgICAgIE1TUl8gfCBNU1JfU0YgfCBNU1JfSFYKKyNkZWZpbmUgTVNSXwkJTVNSX01FIHwgTVNSX1JJIHwgTVNSX0lSIHwgTVNSX0RSIHwgTVNSX0lTRiB8TVNSX0hWCisjZGVmaW5lIE1TUl9LRVJORUwgICAgICBNU1JfIHwgTVNSX1NGCiAKICNkZWZpbmUgTVNSX1VTRVIzMglNU1JfIHwgTVNSX1BSIHwgTVNSX0VFCiAjZGVmaW5lIE1TUl9VU0VSNjQJTVNSX1VTRVIzMiB8IE1TUl9TRgpAQCAtMTUzLDcgKzE1Myw3IEBACiAjZGVmaW5lIFNQUk5fREFCUgkweDNGNQkvKiBEYXRhIEFkZHJlc3MgQnJlYWtwb2ludCBSZWdpc3RlciAqLwogI2RlZmluZSAgIERBQlJfVFJBTlNMQVRJT04JKDFVTCA8PCAyKQogI2RlZmluZSBTUFJOX0RBUgkweDAxMwkvKiBEYXRhIEFkZHJlc3MgUmVnaXN0ZXIgKi8KLSNkZWZpbmUJU1BSTl9EU0lTUgkweDAxMgkvKiBEYXRhIFN0b3JhZ2UgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBTUFJOX0RTSVNSCTB4MDEyCS8qIERhdGEgU3RvcmFnZSBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICovCiAjZGVmaW5lICAgRFNJU1JfTk9IUFRFCQkweDQwMDAwMDAwCS8qIG5vIHRyYW5zbGF0aW9uIGZvdW5kICovCiAjZGVmaW5lICAgRFNJU1JfUFJPVEZBVUxUCTB4MDgwMDAwMDAJLyogcHJvdGVjdGlvbiBmYXVsdCAqLwogI2RlZmluZSAgIERTSVNSX0lTU1RPUkUJCTB4MDIwMDAwMDAJLyogYWNjZXNzIHdhcyBhIHN0b3JlICovCkBAIC0yNTgsMTYgKzI1OCwxNiBAQAogI2RlZmluZSBTUFJOX0lBQlIJMHgzRjIJLyogSW5zdHJ1Y3Rpb24gQWRkcmVzcyBCcmVha3BvaW50IFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fSElENAkweDNGNAkJLyogOTcwIEhJRDQgKi8KICNkZWZpbmUgU1BSTl9ISUQ1CTB4M0Y2CQkvKiA5NzAgSElENSAqLwotI2RlZmluZQlTUFJOX0hJRDYJMHgzRjkJLyogQkUgSElEIDYgKi8KLSNkZWZpbmUJICBISUQ2X0xCCSgweDBGPDwxMikgLyogQ29uY3VycmVudCBMYXJnZSBQYWdlIE1vZGVzICovCi0jZGVmaW5lCSAgSElENl9ETFAJKDE8PDIwKQkvKiBEaXNhYmxlIGFsbCBsYXJnZSBwYWdlIG1vZGVzICg0SyBvbmx5KSAqLwotI2RlZmluZQlTUFJOX1RTQ19DRUxMCTB4Mzk5CS8qIFRocmVhZCBzd2l0Y2ggY29udHJvbCBvbiBDZWxsICovCi0jZGVmaW5lCSAgVFNDX0NFTExfREVDX0VOQUJMRV8wCTB4NDAwMDAwIC8qIERlY3JlbWVudGVyIEludGVycnVwdCAqLwotI2RlZmluZQkgIFRTQ19DRUxMX0RFQ19FTkFCTEVfMQkweDIwMDAwMCAvKiBEZWNyZW1lbnRlciBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUJICBUU0NfQ0VMTF9FRV9FTkFCTEUJMHgxMDAwMDAgLyogRXh0ZXJuYWwgSW50ZXJydXB0ICovCi0jZGVmaW5lCSAgVFNDX0NFTExfRUVfQk9PU1QJMHgwODAwMDAgLyogRXh0ZXJuYWwgSW50ZXJydXB0IEJvb3N0ICovCi0jZGVmaW5lCVNQUk5fVFNDIAkweDNGRAkvKiBUaHJlYWQgc3dpdGNoIGNvbnRyb2wgb24gb3RoZXJzICovCi0jZGVmaW5lCVNQUk5fVFNUIAkweDNGQwkvKiBUaHJlYWQgc3dpdGNoIHRpbWVvdXQgb24gb3RoZXJzICovCisjZGVmaW5lIFNQUk5fSElENgkweDNGOQkvKiBCRSBISUQgNiAqLworI2RlZmluZSAgIEhJRDZfTEIJKDB4MEY8PDEyKSAvKiBDb25jdXJyZW50IExhcmdlIFBhZ2UgTW9kZXMgKi8KKyNkZWZpbmUgICBISUQ2X0RMUAkoMTw8MjApCS8qIERpc2FibGUgYWxsIGxhcmdlIHBhZ2UgbW9kZXMgKDRLIG9ubHkpICovCisjZGVmaW5lIFNQUk5fVFNDX0NFTEwJMHgzOTkJLyogVGhyZWFkIHN3aXRjaCBjb250cm9sIG9uIENlbGwgKi8KKyNkZWZpbmUgICBUU0NfQ0VMTF9ERUNfRU5BQkxFXzAJMHg0MDAwMDAgLyogRGVjcmVtZW50ZXIgSW50ZXJydXB0ICovCisjZGVmaW5lICAgVFNDX0NFTExfREVDX0VOQUJMRV8xCTB4MjAwMDAwIC8qIERlY3JlbWVudGVyIEludGVycnVwdCAqLworI2RlZmluZSAgIFRTQ19DRUxMX0VFX0VOQUJMRQkweDEwMDAwMCAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgKi8KKyNkZWZpbmUgICBUU0NfQ0VMTF9FRV9CT09TVAkweDA4MDAwMCAvKiBFeHRlcm5hbCBJbnRlcnJ1cHQgQm9vc3QgKi8KKyNkZWZpbmUgU1BSTl9UU0MgCTB4M0ZECS8qIFRocmVhZCBzd2l0Y2ggY29udHJvbCBvbiBvdGhlcnMgKi8KKyNkZWZpbmUgU1BSTl9UU1QgCTB4M0ZDCS8qIFRocmVhZCBzd2l0Y2ggdGltZW91dCBvbiBvdGhlcnMgKi8KICNpZiAhZGVmaW5lZChTUFJOX0lBQzEpICYmICFkZWZpbmVkKFNQUk5fSUFDMikKICNkZWZpbmUgU1BSTl9JQUMxCTB4M0Y0CQkvKiBJbnN0cnVjdGlvbiBBZGRyZXNzIENvbXBhcmUgMSAqLwogI2RlZmluZSBTUFJOX0lBQzIJMHgzRjUJCS8qIEluc3RydWN0aW9uIEFkZHJlc3MgQ29tcGFyZSAyICovCkBAIC0zNjIsNyArMzYyLDcgQEAKICNlbmRpZgogI2RlZmluZSBTUFJOX1BURUhJCTB4M0Q1CS8qIDk4MSA3NDUwIFBURSBISSB3b3JkIChTL1cgVExCIGxvYWQpICovCiAjZGVmaW5lIFNQUk5fUFRFTE8JMHgzRDYJLyogOTgyIDc0NTAgUFRFIExPIHdvcmQgKFMvVyBUTEIgbG9hZCkgKi8KLSNkZWZpbmUJU1BSTl9QVVJSCTB4MTM1CS8qIFByb2Nlc3NvciBVdGlsaXphdGlvbiBvZiBSZXNvdXJjZXMgUmVnICovCisjZGVmaW5lIFNQUk5fUFVSUgkweDEzNQkvKiBQcm9jZXNzb3IgVXRpbGl6YXRpb24gb2YgUmVzb3VyY2VzIFJlZyAqLwogI2RlZmluZSBTUFJOX1BWUgkweDExRgkvKiBQcm9jZXNzb3IgVmVyc2lvbiBSZWdpc3RlciAqLwogI2RlZmluZSBTUFJOX1JQQQkweDNENgkvKiBSZXF1aXJlZCBQaHlzaWNhbCBBZGRyZXNzIFJlZ2lzdGVyICovCiAjZGVmaW5lIFNQUk5fU0RBCTB4M0JGCS8qIFNhbXBsZWQgRGF0YSBBZGRyZXNzIFJlZ2lzdGVyICovCkBAIC0zODYsNiArMzg2LDggQEAKICNkZWZpbmUgICBTUlIxX1dBS0VNVAkJMHgwMDI4MDAwMCAvKiBtdGN0cmwgKi8KICNkZWZpbmUgICBTUlIxX1dBS0VERUMJCTB4MDAxODAwMDAgLyogRGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCiAjZGVmaW5lICAgU1JSMV9XQUtFVEhFUk0JMHgwMDEwMDAwMCAvKiBUaGVybWFsIG1hbmFnZW1lbnQgaW50ZXJydXB0ICovCisjZGVmaW5lIFNQUk5fSFNSUjAJMHgxM0EJLyogU2F2ZS9SZXN0b3JlIFJlZ2lzdGVyIDAgKi8KKyNkZWZpbmUgU1BSTl9IU1JSMQkweDEzQgkvKiBTYXZlL1Jlc3RvcmUgUmVnaXN0ZXIgMSAqLwogCiAjaWZuZGVmIFNQUk5fU1ZSCiAjZGVmaW5lIFNQUk5fU1ZSCTB4MTFFCS8qIFN5c3RlbSBWZXJzaW9uIFJlZ2lzdGVyICovCkBAIC00NDMsNiArNDQ1LDEwIEBACiAjZGVmaW5lICAgTU1DUkFfU0lIVgkweDEwMDAwMDAwVUwgLyogc3RhdGUgb2YgTVNSIEhWIHdoZW4gU0lBUiBzZXQgKi8KICNkZWZpbmUgICBNTUNSQV9TSVBSCTB4MDgwMDAwMDBVTCAvKiBzdGF0ZSBvZiBNU1IgUFIgd2hlbiBTSUFSIHNldCAqLwogI2RlZmluZSAgIE1NQ1JBX1NBTVBMRV9FTkFCTEUgMHgwMDAwMDAwMVVMIC8qIGVuYWJsZSBzYW1wbGluZyAqLworI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9TSUhWICAgMHgwMDAwMDQwMDAwMDAwMDAwVUxMCisjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJUFIgICAweDAwMDAwMjAwMDAwMDAwMDBVTEwKKyNkZWZpbmUgICBQT1dFUjZfTU1DUkFfVEhSTQkweDAwMDAwMDIwVUwKKyNkZWZpbmUgICBQT1dFUjZfTU1DUkFfT1RIRVIJMHgwMDAwMDAwRVVMCiAjZGVmaW5lIFNQUk5fUE1DMQk3ODcKICNkZWZpbmUgU1BSTl9QTUMyCTc4OAogI2RlZmluZSBTUFJOX1BNQzMJNzg5CkBAIC00OTUsNiArNTAxLDE5IEBACiAjZGVmaW5lIE1NQ1IwX1BNQzJfTE9BRE1JU1NUSU1FCTB4NQogI2VuZGlmCiAKKy8qCisgKiBBbiBtdGZzZiBpbnN0cnVjdGlvbiB3aXRoIHRoZSBMIGJpdCBzZXQuIE9uIENQVXMgdGhhdCBzdXBwb3J0IHRoaXMgYQorICogZnVsbCA2NGJpdHMgb2YgRlBTQ1IgaXMgcmVzdG9yZWQgYW5kIG9uIG90aGVyIENQVXMgaXQgaXMgaWdub3JlZC4KKyAqCisgKiBVbnRpbCBiaW51dGlscyBnZXRzIHRoZSBuZXcgZm9ybSBvZiBtdGZzZiwgaGFyZHdpcmUgdGhlIGluc3RydWN0aW9uLgorICovCisjaWZkZWYgQ09ORklHX1BQQzY0CisjZGVmaW5lIE1URlNGX0woUkVHKSBcCisJLmxvbmcgKDB4ZmMwMDA1OGUgfCAoKDB4ZmYpIDw8IDE3KSB8ICgoUkVHKSA8PCAxMSkgfCAoMSA8PCAyNSkpCisjZWxzZQorI2RlZmluZSBNVEZTRl9MKFJFRykJbXRmc2YJMHhmZiwgKFJFRykKKyNlbmRpZgorCiAvKiBQcm9jZXNzb3IgVmVyc2lvbiBSZWdpc3RlciAoUFZSKSBmaWVsZCBleHRyYWN0aW9uICovCiAKICNkZWZpbmUgUFZSX1ZFUihwdnIpCSgoKHB2cikgPj4gIDE2KSAmIDB4RkZGRikJLyogVmVyc2lvbiBmaWVsZCAqLwpAQCAtNTU5LDIwICs1NzgsMjAgQEAKIAogLyogNjQtYml0IHByb2Nlc3NvcnMgKi8KIC8qIFhYWCB0aGUgcHJlZml4IHNob3VsZCBiZSBQVlJfLCB3ZSdsbCBkbyBhIGdsb2JhbCBzd2VlcCB0byBmaXggaXQgb25lIGRheSAqLwotI2RlZmluZQlQVl9OT1JUSFNUQVIJMHgwMDMzCi0jZGVmaW5lCVBWX1BVTFNBUgkweDAwMzQKLSNkZWZpbmUJUFZfUE9XRVI0CTB4MDAzNQotI2RlZmluZQlQVl9JQ0VTVEFSCTB4MDAzNgotI2RlZmluZQlQVl9TU1RBUgkweDAwMzcKLSNkZWZpbmUJUFZfUE9XRVI0cAkweDAwMzgKKyNkZWZpbmUgUFZfTk9SVEhTVEFSCTB4MDAzMworI2RlZmluZSBQVl9QVUxTQVIJMHgwMDM0CisjZGVmaW5lIFBWX1BPV0VSNAkweDAwMzUKKyNkZWZpbmUgUFZfSUNFU1RBUgkweDAwMzYKKyNkZWZpbmUgUFZfU1NUQVIJMHgwMDM3CisjZGVmaW5lIFBWX1BPV0VSNHAJMHgwMDM4CiAjZGVmaW5lIFBWXzk3MAkJMHgwMDM5Ci0jZGVmaW5lCVBWX1BPV0VSNQkweDAwM0EKKyNkZWZpbmUgUFZfUE9XRVI1CTB4MDAzQQogI2RlZmluZSBQVl9QT1dFUjVwCTB4MDAzQgogI2RlZmluZSBQVl85NzBGWAkweDAwM0MKLSNkZWZpbmUJUFZfNjMwCQkweDAwNDAKLSNkZWZpbmUJUFZfNjMwcAkweDAwNDEKLSNkZWZpbmUJUFZfOTcwTVAJMHgwMDQ0Ci0jZGVmaW5lCVBWX0JFCQkweDAwNzAKKyNkZWZpbmUgUFZfNjMwCQkweDAwNDAKKyNkZWZpbmUgUFZfNjMwcAkweDAwNDEKKyNkZWZpbmUgUFZfOTcwTVAJMHgwMDQ0CisjZGVmaW5lIFBWX0JFCQkweDAwNzAKIAogLyoKICAqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBTTEIuIElmIHRoaXMgZXZlciBjaGFuZ2VzIHdlIHNob3VsZCBoYW5kbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvcnRhcy5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKaW5kZXggZjQzYzY4My4uMDJlMjEzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9ydGFzLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNkZWZpbmUgUlRBU19STU9CVUZfTUFYICg2NCAqIDEwMjQpCiAKIC8qIFJUQVMgcmV0dXJuIHN0YXR1cyBjb2RlcyAqLworI2RlZmluZSBSVEFTX05PVF9TVVNQRU5EQUJMRQktOTAwNAogI2RlZmluZSBSVEFTX0JVU1kJCS0yICAgIC8qIFJUQVMgQnVzeSAqLwogI2RlZmluZSBSVEFTX0VYVEVOREVEX0RFTEFZX01JTgk5OTAwCiAjZGVmaW5lIFJUQVNfRVhURU5ERURfREVMQVlfTUFYCTk5MDUKQEAgLTE3NywxMiArMTc4LDggQEAKIGV4dGVybiB2b2lkIHJ0YXNfZ2V0X3J0Y190aW1lKHN0cnVjdCBydGNfdGltZSAqcnRjX3RpbWUpOwogZXh0ZXJuIGludCBydGFzX3NldF9ydGNfdGltZShzdHJ1Y3QgcnRjX3RpbWUgKnJ0Y190aW1lKTsKIAotLyogR2l2ZW4gYW4gUlRBUyBzdGF0dXMgY29kZSBvZiA5OTAwLi45OTA1IGNvbXB1dGUgdGhlIGhpbnRlZCBkZWxheSAqLwotdW5zaWduZWQgaW50IHJ0YXNfZXh0ZW5kZWRfYnVzeV9kZWxheV90aW1lKGludCBzdGF0dXMpOwotc3RhdGljIGlubGluZSBpbnQgcnRhc19pc19leHRlbmRlZF9idXN5KGludCBzdGF0dXMpCi17Ci0JcmV0dXJuIHN0YXR1cyA+PSA5OTAwICYmIHN0YXR1cyA8PSA5OTA5OwotfQorZXh0ZXJuIHVuc2lnbmVkIGludCBydGFzX2J1c3lfZGVsYXlfdGltZShpbnQgc3RhdHVzKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgcnRhc19idXN5X2RlbGF5KGludCBzdGF0dXMpOwogCiBleHRlcm4gdm9pZCBwU2VyaWVzX2xvZ19lcnJvcihjaGFyICpidWYsIHVuc2lnbmVkIGludCBlcnJfdHlwZSwgaW50IGZhdGFsKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1LmgKaW5kZXggOTU3MTNmMy4uOTYwOWQzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHUuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3NwdS5oCkBAIC0yNCw4ICsyNCw4IEBACiAjZGVmaW5lIF9TUFVfSAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KIAogI2RlZmluZSBMU19TSVpFICgyNTYgKiAxMDI0KQogI2RlZmluZSBMU19BRERSX01BU0sgKExTX1NJWkUgLSAxKQpAQCAtMTIyLDcgKzEyMiw2IEBACiAJdTY0IGZsYWdzOwogCXU2NCBkYXI7CiAJdTY0IGRzaXNyOwotCXN0cnVjdCBrcmVmIGtyZWY7CiAJc2l6ZV90IGxzX3NpemU7CiAJdW5zaWduZWQgaW50IHNsYl9yZXBsYWNlOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOwpAQCAtMTM0LDcgKzEzMyw2IEBACiAJaW50IGNsYXNzXzBfcGVuZGluZzsKIAlzcGlubG9ja190IHJlZ2lzdGVyX2xvY2s7CiAKLQl1MzIgc3RvcF9jb2RlOwogCXZvaWQgKCogd2JveF9jYWxsYmFjaykoc3RydWN0IHNwdSAqc3B1KTsKIAl2b2lkICgqIGlib3hfY2FsbGJhY2spKHN0cnVjdCBzcHUgKnNwdSk7CiAJdm9pZCAoKiBzdG9wX2NhbGxiYWNrKShzdHJ1Y3Qgc3B1ICpzcHUpOwpAQCAtMTQzLDYgKzE0MSw4IEBACiAJY2hhciBpcnFfYzBbOF07CiAJY2hhciBpcnFfYzFbOF07CiAJY2hhciBpcnFfYzJbOF07CisKKwlzdHJ1Y3Qgc3lzX2RldmljZSBzeXNkZXY7CiB9OwogCiBzdHJ1Y3Qgc3B1ICpzcHVfYWxsb2Modm9pZCk7CkBAIC0xODEsMjkgKzE4MSw2IEBACiAjZW5kaWYgLyogTU9EVUxFICovCiAKIAotLyogYWNjZXNzIHRvIHByaXYxIHJlZ2lzdGVycyAqLwotdm9pZCBzcHVfaW50X21hc2tfYW5kKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7Ci12b2lkIHNwdV9pbnRfbWFza19vcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spOwotdm9pZCBzcHVfaW50X21hc2tfc2V0KHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7Ci11NjQgc3B1X2ludF9tYXNrX2dldChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcyk7Ci12b2lkIHNwdV9pbnRfc3RhdF9jbGVhcihzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IHN0YXQpOwotdTY0IHNwdV9pbnRfc3RhdF9nZXQoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpOwotdm9pZCBzcHVfaW50X3JvdXRlX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCByb3V0ZSk7Ci11NjQgc3B1X21mY19kYXJfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Ci11NjQgc3B1X21mY19kc2lzcl9nZXQoc3RydWN0IHNwdSAqc3B1KTsKLXZvaWQgc3B1X21mY19kc2lzcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZHNpc3IpOwotdm9pZCBzcHVfbWZjX3Nkcl9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKTsKLXZvaWQgc3B1X21mY19zcjFfc2V0KHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSk7Ci11NjQgc3B1X21mY19zcjFfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Ci12b2lkIHNwdV9tZmNfdGNsYXNzX2lkX3NldChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCB0Y2xhc3NfaWQpOwotdTY0IHNwdV9tZmNfdGNsYXNzX2lkX2dldChzdHJ1Y3Qgc3B1ICpzcHUpOwotdm9pZCBzcHVfdGxiX2ludmFsaWRhdGUoc3RydWN0IHNwdSAqc3B1KTsKLXZvaWQgc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgaWQpOwotdTY0IHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Ci12b2lkIHNwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQoc3RydWN0IHNwdSAqc3B1LCB1NjQgZW5hYmxlKTsKLXU2NCBzcHVfcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0KHN0cnVjdCBzcHUgKnNwdSk7Ci0KLQogLyoKICAqIFRoaXMgZGVmaW5lcyB0aGUgTG9jYWwgU3RvcmUsIFByb2JsZW0gQXJlYSBhbmQgUHJpdmxlZ2UgQXJlYSBvZiBhbiBTUFUuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X2NzYS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKaW5kZXggYmExOGQ3ZC4uOTY0YzJkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfY3NhLmgKQEAgLTg2LDEwICs4NiwxOCBAQAogCXN0cnVjdCBzcHVfcmVnMTI4IGV2ZW50X21hc2s7CiAJc3RydWN0IHNwdV9yZWcxMjggc3JyMDsKIAlzdHJ1Y3Qgc3B1X3JlZzEyOCBzdG9wcGVkX3N0YXR1czsKLQlzdHJ1Y3Qgc3B1X3JlZzEyOCBwYWRbMTE5XTsJLyogJ2xzJyBtdXN0IGJlIHBhZ2UtYWxpZ25lZC4gKi8KLQl1bnNpZ25lZCBjaGFyIGxzW0xTX1NJWkVdOworCisJLyoKKwkgKiAnbHMnIG11c3QgYmUgcGFnZS1hbGlnbmVkIG9uIGFsbCBjb25maWd1cmF0aW9ucy4KKwkgKiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIHJlbHkgb24gaGF2aW5nIHRoZSBzcHUtZ2NjCisJICogaW5zdGFsbGVkIHRvIGJ1aWxkIHRoZSBrZXJuZWwgYW5kIHRoaXMgc3RydWN0dXJlCisJICogaXMgdXNlZCBpbiB0aGUgU1BVLXNpZGUgY29kZSwgbWFrZSBpdCA2NGstcGFnZQorCSAqIGFsaWduZWQgZm9yIG5vdy4KKwkgKi8KKwl1bnNpZ25lZCBjaGFyIGxzW0xTX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNjU1MzYpKSk7CiB9OwogCisjaWZuZGVmIF9fU1BVX18KIC8qCiAgKiBzdHJ1Y3Qgc3B1X3Byb2JsZW1fY29sbGFwc2VkIC0gY29uZGVuc2VkIHByb2JsZW0gc3RhdGUgYXJlYSwgdy9vIHBhZHMuCiAgKi8KQEAgLTI1MCw2ICsyNTgsNyBAQAogZXh0ZXJuIGludCBzcHVfc3dpdGNoKHN0cnVjdCBzcHVfc3RhdGUgKnByZXYsIHN0cnVjdCBzcHVfc3RhdGUgKm5ldywKIAkJICAgICAgc3RydWN0IHNwdSAqc3B1KTsKIAorI2VuZGlmIC8qICFfX1NQVV9fICovCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfU1BVX0NTQV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zcHVfcHJpdjEuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X3ByaXYxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAwYzQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3B1X3ByaXYxLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBEZWZpbmVzIGFuIHNwdSBoeXBlcnZpc29yIGFic3RyYWN0aW9uIGxheWVyLgorICoKKyAqICBDb3B5cmlnaHQgMjAwNiBTb255IENvcnAuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmICFkZWZpbmVkKF9TUFVfUFJJVjFfSCkKKyNkZWZpbmUgX1NQVV9QUklWMV9ICisjaWYgZGVmaW5lZChfX0tFUk5FTF9fKQorCitzdHJ1Y3Qgc3B1OworCisvKiBhY2Nlc3MgdG8gcHJpdjEgcmVnaXN0ZXJzICovCisKK3N0cnVjdCBzcHVfcHJpdjFfb3BzCit7CisJdm9pZCAoKmludF9tYXNrX2FuZCkgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzayk7CisJdm9pZCAoKmludF9tYXNrX29yKSAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKTsKKwl2b2lkICgqaW50X21hc2tfc2V0KSAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKTsKKwl1NjQgKCppbnRfbWFza19nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcyk7CisJdm9pZCAoKmludF9zdGF0X2NsZWFyKSAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBzdGF0KTsKKwl1NjQgKCppbnRfc3RhdF9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcyk7CisJdm9pZCAoKmNwdV9hZmZpbml0eV9zZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjcHUpOworCXU2NCAoKm1mY19kYXJfZ2V0KSAoc3RydWN0IHNwdSAqc3B1KTsKKwl1NjQgKCptZmNfZHNpc3JfZ2V0KSAoc3RydWN0IHNwdSAqc3B1KTsKKwl2b2lkICgqbWZjX2RzaXNyX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IGRzaXNyKTsKKwl2b2lkICgqbWZjX3Nkcl9zZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBzZHIpOworCXZvaWQgKCptZmNfc3IxX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSk7CisJdTY0ICgqbWZjX3NyMV9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUpOworCXZvaWQgKCptZmNfdGNsYXNzX2lkX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHRjbGFzc19pZCk7CisJdTY0ICgqbWZjX3RjbGFzc19pZF9nZXQpIChzdHJ1Y3Qgc3B1ICpzcHUpOworCXZvaWQgKCp0bGJfaW52YWxpZGF0ZSkgKHN0cnVjdCBzcHUgKnNwdSk7CisJdm9pZCAoKnJlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9zZXQpIChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBpZCk7CisJdTY0ICgqcmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldCkgKHN0cnVjdCBzcHUgKnNwdSk7CisJdm9pZCAoKnJlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX3NldCkgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IGVuYWJsZSk7CisJdTY0ICgqcmVzb3VyY2VfYWxsb2NhdGlvbl9lbmFibGVfZ2V0KSAoc3RydWN0IHNwdSAqc3B1KTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgc3B1X3ByaXYxX29wcyogc3B1X3ByaXYxX29wczsKKworc3RhdGljIGlubGluZSB2b2lkCitzcHVfaW50X21hc2tfYW5kIChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcywgdTY0IG1hc2spCit7CisJc3B1X3ByaXYxX29wcy0+aW50X21hc2tfYW5kKHNwdSwgY2xhc3MsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9pbnRfbWFza19vciAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBtYXNrKQoreworCXNwdV9wcml2MV9vcHMtPmludF9tYXNrX29yKHNwdSwgY2xhc3MsIG1hc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9pbnRfbWFza19zZXQgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNsYXNzLCB1NjQgbWFzaykKK3sKKwlzcHVfcHJpdjFfb3BzLT5pbnRfbWFza19zZXQoc3B1LCBjbGFzcywgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitzcHVfaW50X21hc2tfZ2V0IChzdHJ1Y3Qgc3B1ICpzcHUsIGludCBjbGFzcykKK3sKKwlyZXR1cm4gc3B1X3ByaXYxX29wcy0+aW50X21hc2tfZ2V0KHNwdSwgY2xhc3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9pbnRfc3RhdF9jbGVhciAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MsIHU2NCBzdGF0KQoreworCXNwdV9wcml2MV9vcHMtPmludF9zdGF0X2NsZWFyKHNwdSwgY2xhc3MsIHN0YXQpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorc3B1X2ludF9zdGF0X2dldCAoc3RydWN0IHNwdSAqc3B1LCBpbnQgY2xhc3MpCit7CisJcmV0dXJuIHNwdV9wcml2MV9vcHMtPmludF9zdGF0X2dldCAoc3B1LCBjbGFzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc3B1X2NwdV9hZmZpbml0eV9zZXQgKHN0cnVjdCBzcHUgKnNwdSwgaW50IGNwdSkKK3sKKwlzcHVfcHJpdjFfb3BzLT5jcHVfYWZmaW5pdHlfc2V0KHNwdSwgY3B1KTsKK30KKworc3RhdGljIGlubGluZSB1NjQKK3NwdV9tZmNfZGFyX2dldCAoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBzcHVfcHJpdjFfb3BzLT5tZmNfZGFyX2dldChzcHUpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorc3B1X21mY19kc2lzcl9nZXQgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3ByaXYxX29wcy0+bWZjX2RzaXNyX2dldChzcHUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9tZmNfZHNpc3Jfc2V0IChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBkc2lzcikKK3sKKwlzcHVfcHJpdjFfb3BzLT5tZmNfZHNpc3Jfc2V0KHNwdSwgZHNpc3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9tZmNfc2RyX3NldCAoc3RydWN0IHNwdSAqc3B1LCB1NjQgc2RyKQoreworCXNwdV9wcml2MV9vcHMtPm1mY19zZHJfc2V0KHNwdSwgc2RyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcHVfbWZjX3NyMV9zZXQgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHNyMSkKK3sKKwlzcHVfcHJpdjFfb3BzLT5tZmNfc3IxX3NldChzcHUsIHNyMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitzcHVfbWZjX3NyMV9nZXQgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3ByaXYxX29wcy0+bWZjX3NyMV9nZXQoc3B1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcHVfbWZjX3RjbGFzc19pZF9zZXQgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IHRjbGFzc19pZCkKK3sKKwlzcHVfcHJpdjFfb3BzLT5tZmNfdGNsYXNzX2lkX3NldChzcHUsIHRjbGFzc19pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitzcHVfbWZjX3RjbGFzc19pZF9nZXQgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3ByaXYxX29wcy0+bWZjX3RjbGFzc19pZF9nZXQoc3B1KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitzcHVfdGxiX2ludmFsaWRhdGUgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlzcHVfcHJpdjFfb3BzLT50bGJfaW52YWxpZGF0ZShzcHUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0IChzdHJ1Y3Qgc3B1ICpzcHUsIHU2NCBpZCkKK3sKKwlzcHVfcHJpdjFfb3BzLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2dyb3VwSURfc2V0KHNwdSwgaWQpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZ3JvdXBJRF9nZXQgKHN0cnVjdCBzcHUgKnNwdSkKK3sKKwlyZXR1cm4gc3B1X3ByaXYxX29wcy0+cmVzb3VyY2VfYWxsb2NhdGlvbl9ncm91cElEX2dldChzcHUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NwdV9yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQgKHN0cnVjdCBzcHUgKnNwdSwgdTY0IGVuYWJsZSkKK3sKKwlzcHVfcHJpdjFfb3BzLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9zZXQoc3B1LCBlbmFibGUpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorc3B1X3Jlc291cmNlX2FsbG9jYXRpb25fZW5hYmxlX2dldCAoc3RydWN0IHNwdSAqc3B1KQoreworCXJldHVybiBzcHVfcHJpdjFfb3BzLT5yZXNvdXJjZV9hbGxvY2F0aW9uX2VuYWJsZV9nZXQoc3B1KTsKK30KKworLyogVGhlIGRlY2xhcmF0aW9ucyBmb2xvd2luZyBhcmUgcHV0IGhlcmUgZm9yIGNvbnZlbmllbmNlCisgKiBhbmQgb25seSBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBwbGF0Zm9ybSBzZXR1cCBjb2RlCisgKiBmb3IgaW5pdGlhbGl6aW5nIHNwdV9wcml2MV9vcHMuCisgKi8KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzcHVfcHJpdjFfb3BzIHNwdV9wcml2MV9tbWlvX29wczsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy9zeXN0YmwuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjODVjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvc3lzdGJsLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBMaXN0IG9mIHBvd2VycGMgc3lzY2FsbHMuIEZvciB0aGUgbWVhbmluZyBvZiB0aGUgX1NQVSBzdWZmaXggc2VlCisgKiBhcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc3B1X2NhbGxiYWNrcy5jCisgKi8KKworU1lTQ0FMTChyZXN0YXJ0X3N5c2NhbGwpCitTWVNDQUxMKGV4aXQpCitQUENfU1lTKGZvcmspCitTWVNDQUxMX1NQVShyZWFkKQorU1lTQ0FMTF9TUFUod3JpdGUpCitDT01QQVRfU1lTX1NQVShvcGVuKQorU1lTQ0FMTF9TUFUoY2xvc2UpCitDT01QQVRfU1lTX1NQVSh3YWl0cGlkKQorQ09NUEFUX1NZU19TUFUoY3JlYXQpCitTWVNDQUxMX1NQVShsaW5rKQorU1lTQ0FMTF9TUFUodW5saW5rKQorQ09NUEFUX1NZUyhleGVjdmUpCitTWVNDQUxMX1NQVShjaGRpcikKK0NPTVBBVF9TWVNfU1BVKHRpbWUpCitTWVNDQUxMX1NQVShta25vZCkKK1NZU0NBTExfU1BVKGNobW9kKQorU1lTQ0FMTF9TUFUobGNob3duKQorU1lTQ0FMTChuaV9zeXNjYWxsKQorT0xEU1lTKHN0YXQpCitTWVNYX1NQVShzeXNfbHNlZWsscHBjMzJfbHNlZWssc3lzX2xzZWVrKQorU1lTQ0FMTF9TUFUoZ2V0cGlkKQorQ09NUEFUX1NZUyhtb3VudCkKK1NZU1goc3lzX25pX3N5c2NhbGwsc3lzX29sZHVtb3VudCxzeXNfb2xkdW1vdW50KQorU1lTQ0FMTF9TUFUoc2V0dWlkKQorU1lTQ0FMTF9TUFUoZ2V0dWlkKQorQ09NUEFUX1NZU19TUFUoc3RpbWUpCitDT01QQVRfU1lTKHB0cmFjZSkKK1NZU0NBTExfU1BVKGFsYXJtKQorT0xEU1lTKGZzdGF0KQorQ09NUEFUX1NZUyhwYXVzZSkKK0NPTVBBVF9TWVModXRpbWUpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitDT01QQVRfU1lTX1NQVShhY2Nlc3MpCitDT01QQVRfU1lTX1NQVShuaWNlKQorU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTQ0FMTF9TUFUoc3luYykKK0NPTVBBVF9TWVNfU1BVKGtpbGwpCitTWVNDQUxMX1NQVShyZW5hbWUpCitDT01QQVRfU1lTX1NQVShta2RpcikKK1NZU0NBTExfU1BVKHJtZGlyKQorU1lTQ0FMTF9TUFUoZHVwKQorU1lTQ0FMTF9TUFUocGlwZSkKK0NPTVBBVF9TWVNfU1BVKHRpbWVzKQorU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTQ0FMTF9TUFUoYnJrKQorU1lTQ0FMTF9TUFUoc2V0Z2lkKQorU1lTQ0FMTF9TUFUoZ2V0Z2lkKQorU1lTQ0FMTChzaWduYWwpCitTWVNDQUxMX1NQVShnZXRldWlkKQorU1lTQ0FMTF9TUFUoZ2V0ZWdpZCkKK1NZU0NBTEwoYWNjdCkKK1NZU0NBTEwodW1vdW50KQorU1lTQ0FMTChuaV9zeXNjYWxsKQorQ09NUEFUX1NZU19TUFUoaW9jdGwpCitDT01QQVRfU1lTX1NQVShmY250bCkKK1NZU0NBTEwobmlfc3lzY2FsbCkKK0NPTVBBVF9TWVNfU1BVKHNldHBnaWQpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNYKHN5c19uaV9zeXNjYWxsLHN5c19vbGR1bmFtZSwgc3lzX29sZHVuYW1lKQorQ09NUEFUX1NZU19TUFUodW1hc2spCitTWVNDQUxMX1NQVShjaHJvb3QpCitTWVNDQUxMKHVzdGF0KQorU1lTQ0FMTF9TUFUoZHVwMikKK1NZU0NBTExfU1BVKGdldHBwaWQpCitTWVNDQUxMX1NQVShnZXRwZ3JwKQorU1lTQ0FMTF9TUFUoc2V0c2lkKQorU1lTMzJPTkxZKHNpZ2FjdGlvbikKK1NZU0NBTExfU1BVKHNnZXRtYXNrKQorQ09NUEFUX1NZU19TUFUoc3NldG1hc2spCitTWVNDQUxMX1NQVShzZXRyZXVpZCkKK1NZU0NBTExfU1BVKHNldHJlZ2lkKQorU1lTMzJPTkxZKHNpZ3N1c3BlbmQpCitDT01QQVRfU1lTKHNpZ3BlbmRpbmcpCitDT01QQVRfU1lTX1NQVShzZXRob3N0bmFtZSkKK0NPTVBBVF9TWVNfU1BVKHNldHJsaW1pdCkKK0NPTVBBVF9TWVMob2xkX2dldHJsaW1pdCkKK0NPTVBBVF9TWVNfU1BVKGdldHJ1c2FnZSkKK0NPTVBBVF9TWVNfU1BVKGdldHRpbWVvZmRheSkKK0NPTVBBVF9TWVNfU1BVKHNldHRpbWVvZmRheSkKK0NPTVBBVF9TWVNfU1BVKGdldGdyb3VwcykKK0NPTVBBVF9TWVNfU1BVKHNldGdyb3VwcykKK1NZU1goc3lzX25pX3N5c2NhbGwsc3lzX25pX3N5c2NhbGwscHBjX3NlbGVjdCkKK1NZU0NBTExfU1BVKHN5bWxpbmspCitPTERTWVMobHN0YXQpCitDT01QQVRfU1lTX1NQVShyZWFkbGluaykKK1NZU0NBTEwodXNlbGliKQorU1lTQ0FMTChzd2Fwb24pCitTWVNDQUxMKHJlYm9vdCkKK1NZU1goc3lzX25pX3N5c2NhbGwsb2xkMzJfcmVhZGRpcixvbGRfcmVhZGRpcikKK1NZU0NBTExfU1BVKG1tYXApCitTWVNDQUxMX1NQVShtdW5tYXApCitTWVNDQUxMX1NQVSh0cnVuY2F0ZSkKK1NZU0NBTExfU1BVKGZ0cnVuY2F0ZSkKK1NZU0NBTExfU1BVKGZjaG1vZCkKK1NZU0NBTExfU1BVKGZjaG93bikKK0NPTVBBVF9TWVNfU1BVKGdldHByaW9yaXR5KQorQ09NUEFUX1NZU19TUFUoc2V0cHJpb3JpdHkpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitDT01QQVRfU1lTKHN0YXRmcykKK0NPTVBBVF9TWVMoZnN0YXRmcykKK1NZU0NBTEwobmlfc3lzY2FsbCkKK0NPTVBBVF9TWVNfU1BVKHNvY2tldGNhbGwpCitDT01QQVRfU1lTX1NQVShzeXNsb2cpCitDT01QQVRfU1lTX1NQVShzZXRpdGltZXIpCitDT01QQVRfU1lTX1NQVShnZXRpdGltZXIpCitDT01QQVRfU1lTX1NQVShuZXdzdGF0KQorQ09NUEFUX1NZU19TUFUobmV3bHN0YXQpCitDT01QQVRfU1lTX1NQVShuZXdmc3RhdCkKK1NZU1goc3lzX25pX3N5c2NhbGwsc3lzX3VuYW1lLHN5c191bmFtZSkKK1NZU0NBTEwobmlfc3lzY2FsbCkKK1NZU0NBTExfU1BVKHZoYW5ndXApCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitDT01QQVRfU1lTX1NQVSh3YWl0NCkKK1NZU0NBTEwoc3dhcG9mZikKK0NPTVBBVF9TWVNfU1BVKHN5c2luZm8pCitDT01QQVRfU1lTKGlwYykKK1NZU0NBTExfU1BVKGZzeW5jKQorU1lTMzJPTkxZKHNpZ3JldHVybikKK1BQQ19TWVMoY2xvbmUpCitDT01QQVRfU1lTX1NQVShzZXRkb21haW5uYW1lKQorUFBDX1NZU19TUFUobmV3dW5hbWUpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitDT01QQVRfU1lTX1NQVShhZGp0aW1leCkKK1NZU0NBTExfU1BVKG1wcm90ZWN0KQorU1lTWChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3NpZ3Byb2NtYXNrLHN5c19zaWdwcm9jbWFzaykKK1NZU0NBTEwobmlfc3lzY2FsbCkKK1NZU0NBTEwoaW5pdF9tb2R1bGUpCitTWVNDQUxMKGRlbGV0ZV9tb2R1bGUpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMKHF1b3RhY3RsKQorQ09NUEFUX1NZU19TUFUoZ2V0cGdpZCkKK1NZU0NBTExfU1BVKGZjaGRpcikKK1NZU0NBTExfU1BVKGJkZmx1c2gpCitDT01QQVRfU1lTKHN5c2ZzKQorU1lTWF9TUFUocHBjNjRfcGVyc29uYWxpdHkscHBjNjRfcGVyc29uYWxpdHksc3lzX3BlcnNvbmFsaXR5KQorU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTQ0FMTF9TUFUoc2V0ZnN1aWQpCitTWVNDQUxMX1NQVShzZXRmc2dpZCkKK1NZU0NBTExfU1BVKGxsc2VlaykKK0NPTVBBVF9TWVNfU1BVKGdldGRlbnRzKQorU1lTWF9TUFUoc3lzX3NlbGVjdCxwcGMzMl9zZWxlY3QscHBjX3NlbGVjdCkKK1NZU0NBTExfU1BVKGZsb2NrKQorU1lTQ0FMTF9TUFUobXN5bmMpCitDT01QQVRfU1lTX1NQVShyZWFkdikKK0NPTVBBVF9TWVNfU1BVKHdyaXRldikKK0NPTVBBVF9TWVNfU1BVKGdldHNpZCkKK1NZU0NBTExfU1BVKGZkYXRhc3luYykKK0NPTVBBVF9TWVMoc3lzY3RsKQorU1lTQ0FMTF9TUFUobWxvY2spCitTWVNDQUxMX1NQVShtdW5sb2NrKQorU1lTQ0FMTF9TUFUobWxvY2thbGwpCitTWVNDQUxMX1NQVShtdW5sb2NrYWxsKQorQ09NUEFUX1NZU19TUFUoc2NoZWRfc2V0cGFyYW0pCitDT01QQVRfU1lTX1NQVShzY2hlZF9nZXRwYXJhbSkKK0NPTVBBVF9TWVNfU1BVKHNjaGVkX3NldHNjaGVkdWxlcikKK0NPTVBBVF9TWVNfU1BVKHNjaGVkX2dldHNjaGVkdWxlcikKK1NZU0NBTExfU1BVKHNjaGVkX3lpZWxkKQorQ09NUEFUX1NZU19TUFUoc2NoZWRfZ2V0X3ByaW9yaXR5X21heCkKK0NPTVBBVF9TWVNfU1BVKHNjaGVkX2dldF9wcmlvcml0eV9taW4pCitDT01QQVRfU1lTX1NQVShzY2hlZF9ycl9nZXRfaW50ZXJ2YWwpCitDT01QQVRfU1lTX1NQVShuYW5vc2xlZXApCitTWVNDQUxMX1NQVShtcmVtYXApCitTWVNDQUxMX1NQVShzZXRyZXN1aWQpCitTWVNDQUxMX1NQVShnZXRyZXN1aWQpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMX1NQVShwb2xsKQorQ09NUEFUX1NZUyhuZnNzZXJ2Y3RsKQorU1lTQ0FMTF9TUFUoc2V0cmVzZ2lkKQorU1lTQ0FMTF9TUFUoZ2V0cmVzZ2lkKQorQ09NUEFUX1NZU19TUFUocHJjdGwpCitDT01QQVRfU1lTKHJ0X3NpZ3JldHVybikKK0NPTVBBVF9TWVMocnRfc2lnYWN0aW9uKQorQ09NUEFUX1NZUyhydF9zaWdwcm9jbWFzaykKK0NPTVBBVF9TWVMocnRfc2lncGVuZGluZykKK0NPTVBBVF9TWVMocnRfc2lndGltZWR3YWl0KQorQ09NUEFUX1NZUyhydF9zaWdxdWV1ZWluZm8pCitDT01QQVRfU1lTKHJ0X3NpZ3N1c3BlbmQpCitDT01QQVRfU1lTX1NQVShwcmVhZDY0KQorQ09NUEFUX1NZU19TUFUocHdyaXRlNjQpCitTWVNDQUxMX1NQVShjaG93bikKK1NZU0NBTExfU1BVKGdldGN3ZCkKK1NZU0NBTExfU1BVKGNhcGdldCkKK1NZU0NBTExfU1BVKGNhcHNldCkKK0NPTVBBVF9TWVMoc2lnYWx0c3RhY2spCitTWVNYX1NQVShzeXNfc2VuZGZpbGU2NCxjb21wYXRfc3lzX3NlbmRmaWxlLHN5c19zZW5kZmlsZSkKK1NZU0NBTEwobmlfc3lzY2FsbCkKK1NZU0NBTEwobmlfc3lzY2FsbCkKK1BQQ19TWVModmZvcmspCitDT01QQVRfU1lTX1NQVShnZXRybGltaXQpCitDT01QQVRfU1lTX1NQVShyZWFkYWhlYWQpCitTWVMzMk9OTFkobW1hcDIpCitTWVMzMk9OTFkodHJ1bmNhdGU2NCkKK1NZUzMyT05MWShmdHJ1bmNhdGU2NCkKK1NZU1goc3lzX25pX3N5c2NhbGwsc3lzX3N0YXQ2NCxzeXNfc3RhdDY0KQorU1lTWChzeXNfbmlfc3lzY2FsbCxzeXNfbHN0YXQ2NCxzeXNfbHN0YXQ2NCkKK1NZU1goc3lzX25pX3N5c2NhbGwsc3lzX2ZzdGF0NjQsc3lzX2ZzdGF0NjQpCitTWVNDQUxMKHBjaWNvbmZpZ19yZWFkKQorU1lTQ0FMTChwY2ljb25maWdfd3JpdGUpCitTWVNDQUxMKHBjaWNvbmZpZ19pb2Jhc2UpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMX1NQVShnZXRkZW50czY0KQorU1lTQ0FMTF9TUFUocGl2b3Rfcm9vdCkKK1NZU1goc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19mY250bDY0LHN5c19mY250bDY0KQorU1lTQ0FMTF9TUFUobWFkdmlzZSkKK1NZU0NBTExfU1BVKG1pbmNvcmUpCitTWVNDQUxMX1NQVShnZXR0aWQpCitTWVNDQUxMX1NQVSh0a2lsbCkKK1NZU0NBTExfU1BVKHNldHhhdHRyKQorU1lTQ0FMTF9TUFUobHNldHhhdHRyKQorU1lTQ0FMTF9TUFUoZnNldHhhdHRyKQorU1lTQ0FMTF9TUFUoZ2V0eGF0dHIpCitTWVNDQUxMX1NQVShsZ2V0eGF0dHIpCitTWVNDQUxMX1NQVShmZ2V0eGF0dHIpCitTWVNDQUxMX1NQVShsaXN0eGF0dHIpCitTWVNDQUxMX1NQVShsbGlzdHhhdHRyKQorU1lTQ0FMTF9TUFUoZmxpc3R4YXR0cikKK1NZU0NBTExfU1BVKHJlbW92ZXhhdHRyKQorU1lTQ0FMTF9TUFUobHJlbW92ZXhhdHRyKQorU1lTQ0FMTF9TUFUoZnJlbW92ZXhhdHRyKQorQ09NUEFUX1NZU19TUFUoZnV0ZXgpCitDT01QQVRfU1lTX1NQVShzY2hlZF9zZXRhZmZpbml0eSkKK0NPTVBBVF9TWVNfU1BVKHNjaGVkX2dldGFmZmluaXR5KQorU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTMzJPTkxZKHNlbmRmaWxlNjQpCitDT01QQVRfU1lTX1NQVShpb19zZXR1cCkKK1NZU0NBTExfU1BVKGlvX2Rlc3Ryb3kpCitDT01QQVRfU1lTX1NQVShpb19nZXRldmVudHMpCitDT01QQVRfU1lTX1NQVShpb19zdWJtaXQpCitTWVNDQUxMX1NQVShpb19jYW5jZWwpCitTWVNDQUxMKHNldF90aWRfYWRkcmVzcykKK1NZU1hfU1BVKHN5c19mYWR2aXNlNjQscHBjMzJfZmFkdmlzZTY0LHN5c19mYWR2aXNlNjQpCitTWVNDQUxMKGV4aXRfZ3JvdXApCitTWVNYKHN5c19sb29rdXBfZGNvb2tpZSxwcGMzMl9sb29rdXBfZGNvb2tpZSxzeXNfbG9va3VwX2Rjb29raWUpCitTWVNDQUxMX1NQVShlcG9sbF9jcmVhdGUpCitTWVNDQUxMX1NQVShlcG9sbF9jdGwpCitTWVNDQUxMX1NQVShlcG9sbF93YWl0KQorU1lTQ0FMTF9TUFUocmVtYXBfZmlsZV9wYWdlcykKK1NZU1hfU1BVKHN5c190aW1lcl9jcmVhdGUsY29tcGF0X3N5c190aW1lcl9jcmVhdGUsc3lzX3RpbWVyX2NyZWF0ZSkKK0NPTVBBVF9TWVNfU1BVKHRpbWVyX3NldHRpbWUpCitDT01QQVRfU1lTX1NQVSh0aW1lcl9nZXR0aW1lKQorU1lTQ0FMTF9TUFUodGltZXJfZ2V0b3ZlcnJ1bikKK1NZU0NBTExfU1BVKHRpbWVyX2RlbGV0ZSkKK0NPTVBBVF9TWVNfU1BVKGNsb2NrX3NldHRpbWUpCitDT01QQVRfU1lTX1NQVShjbG9ja19nZXR0aW1lKQorQ09NUEFUX1NZU19TUFUoY2xvY2tfZ2V0cmVzKQorQ09NUEFUX1NZU19TUFUoY2xvY2tfbmFub3NsZWVwKQorU1lTWChwcGM2NF9zd2FwY29udGV4dCxwcGMzMl9zd2FwY29udGV4dCxwcGNfc3dhcGNvbnRleHQpCitDT01QQVRfU1lTX1NQVSh0Z2tpbGwpCitDT01QQVRfU1lTX1NQVSh1dGltZXMpCitDT01QQVRfU1lTX1NQVShzdGF0ZnM2NCkKK0NPTVBBVF9TWVNfU1BVKGZzdGF0ZnM2NCkKK1NZU1goc3lzX25pX3N5c2NhbGwsIHBwY19mYWR2aXNlNjRfNjQsIHBwY19mYWR2aXNlNjRfNjQpCitQUENfU1lTX1NQVShydGFzKQorT0xEU1lTKGRlYnVnX3NldGNvbnRleHQpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitTWVNDQUxMKG5pX3N5c2NhbGwpCitDT01QQVRfU1lTKG1iaW5kKQorQ09NUEFUX1NZUyhnZXRfbWVtcG9saWN5KQorQ09NUEFUX1NZUyhzZXRfbWVtcG9saWN5KQorQ09NUEFUX1NZUyhtcV9vcGVuKQorU1lTQ0FMTChtcV91bmxpbmspCitDT01QQVRfU1lTKG1xX3RpbWVkc2VuZCkKK0NPTVBBVF9TWVMobXFfdGltZWRyZWNlaXZlKQorQ09NUEFUX1NZUyhtcV9ub3RpZnkpCitDT01QQVRfU1lTKG1xX2dldHNldGF0dHIpCitDT01QQVRfU1lTKGtleGVjX2xvYWQpCitDT01QQVRfU1lTKGFkZF9rZXkpCitDT01QQVRfU1lTKHJlcXVlc3Rfa2V5KQorQ09NUEFUX1NZUyhrZXljdGwpCitDT01QQVRfU1lTKHdhaXRpZCkKK0NPTVBBVF9TWVMoaW9wcmlvX3NldCkKK0NPTVBBVF9TWVMoaW9wcmlvX2dldCkKK1NZU0NBTEwoaW5vdGlmeV9pbml0KQorU1lTQ0FMTChpbm90aWZ5X2FkZF93YXRjaCkKK1NZU0NBTEwoaW5vdGlmeV9ybV93YXRjaCkKK1NZU0NBTEwoc3B1X3J1bikKK1NZU0NBTEwoc3B1X2NyZWF0ZSkKK0NPTVBBVF9TWVMocHNlbGVjdDYpCitDT01QQVRfU1lTKHBwb2xsKQorU1lTQ0FMTF9TUFUodW5zaGFyZSkKK1NZU0NBTExfU1BVKHNwbGljZSkKK1NZU0NBTExfU1BVKHRlZSkKK1NZU0NBTExfU1BVKHZtc3BsaWNlKQorQ09NUEFUX1NZU19TUFUob3BlbmF0KQorU1lTQ0FMTF9TUFUobWtkaXJhdCkKK1NZU0NBTExfU1BVKG1rbm9kYXQpCitTWVNDQUxMX1NQVShmY2hvd25hdCkKK0NPTVBBVF9TWVNfU1BVKGZ1dGltZXNhdCkKK1NZU1hfU1BVKHN5c19uZXdmc3RhdGF0LCBzeXNfZnN0YXRhdDY0LCBzeXNfZnN0YXRhdDY0KQorU1lTQ0FMTF9TUFUodW5saW5rYXQpCitTWVNDQUxMX1NQVShyZW5hbWVhdCkKK1NZU0NBTExfU1BVKGxpbmthdCkKK1NZU0NBTExfU1BVKHN5bWxpbmthdCkKK1NZU0NBTExfU1BVKHJlYWRsaW5rYXQpCitTWVNDQUxMX1NQVShmY2htb2RhdCkKK1NZU0NBTExfU1BVKGZhY2Nlc3NhdCkKK0NPTVBBVF9TWVNfU1BVKGdldF9yb2J1c3RfbGlzdCkKK0NPTVBBVF9TWVNfU1BVKHNldF9yb2J1c3RfbGlzdCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmggYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RjZS5oCmluZGV4IDZmYTIwMGEuLmM5NDgzYWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdGNlLmgKKysrIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90Y2UuaApAQCAtMzUsMzIgKzM1LDE1IEBACiAjZGVmaW5lIFRDRV9QQUdFX1NJWkUJKDEgPDwgVENFX1NISUZUKQogI2RlZmluZSBUQ0VfUEFHRV9GQUNUT1IJKFBBR0VfU0hJRlQgLSBUQ0VfU0hJRlQpCiAKKyNkZWZpbmUgVENFX0VOVFJZX1NJWkUJCTgJCS8qIGVhY2ggVENFIGlzIDY0IGJpdHMgKi8KIAotLyogdGNlX2VudHJ5Ci0gKiBVc2VkIGJ5IHBTZXJpZXMgKFNNUCkgYW5kIGlTZXJpZXMvcFNlcmllcyBMUEFSLCBidXQgdGhlcmUgaXQncwotICogYWJzdHJhY3RlZCBzbyBsYXlvdXQgaXMgaXJyZWxldmFudC4KLSAqLwotdW5pb24gdGNlX2VudHJ5IHsKLSAgIAl1bnNpZ25lZCBsb25nIHRlX3dvcmQ7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgaW50ICB0Yl9jYWNoZUJpdHMgOjY7CS8qIENhY2hlIGhhc2ggYml0cyAtIG5vdCB1c2VkICovCi0JCXVuc2lnbmVkIGludCAgdGJfcnN2ZCAgICAgIDo2OwotCQl1bnNpZ25lZCBsb25nIHRiX3JwbiAgICAgICA6NDA7CS8qIFJlYWwgcGFnZSBudW1iZXIgKi8KLQkJdW5zaWduZWQgaW50ICB0Yl92YWxpZCAgICAgOjE7CS8qIFRjZSBpcyB2YWxpZCAodmIgb25seSkgKi8KLQkJdW5zaWduZWQgaW50ICB0Yl9hbGxpbyAgICAgOjE7CS8qIFRjZSBpcyB2YWxpZCBmb3IgYWxsIGxwcyAodmIgb25seSkgKi8KLQkJdW5zaWduZWQgaW50ICB0Yl9scGluZGV4ICAgOjg7CS8qIExwSW5kZXggZm9yIHVzZXIgb2YgVENFICh2YiBvbmx5KSAqLwotCQl1bnNpZ25lZCBpbnQgIHRiX3BjaXdyICAgICA6MTsJLyogV3JpdGUgYWxsb3dlZCAocGNpIG9ubHkpICovCi0JCXVuc2lnbmVkIGludCAgdGJfcmR3ciAgICAgIDoxOwkvKiBSZWFkIGFsbG93ZWQgIChwY2kpLCBXcml0ZSBhbGxvd2VkICh2YikgKi8KLQl9IHRlX2JpdHM7Ci0jZGVmaW5lIHRlX2NhY2hlQml0cyB0ZV9iaXRzLnRiX2NhY2hlQml0cwotI2RlZmluZSB0ZV9ycG4gICAgICAgdGVfYml0cy50Yl9ycG4KLSNkZWZpbmUgdGVfdmFsaWQgICAgIHRlX2JpdHMudGJfdmFsaWQKLSNkZWZpbmUgdGVfYWxsaW8gICAgIHRlX2JpdHMudGJfYWxsaW8KLSNkZWZpbmUgdGVfbHBpbmRleCAgIHRlX2JpdHMudGJfbHBpbmRleAotI2RlZmluZSB0ZV9wY2l3ciAgICAgdGVfYml0cy50Yl9wY2l3cgotI2RlZmluZSB0ZV9yZHdyICAgICAgdGVfYml0cy50Yl9yZHdyCi19OwotCisjZGVmaW5lIFRDRV9SUE5fTUFTSwkJMHhmZmZmZmZmZmZmdWwgIC8qIDQwLWJpdCBSUE4gKDRLIHBhZ2VzKSAqLworI2RlZmluZSBUQ0VfUlBOX1NISUZUCQkxMgorI2RlZmluZSBUQ0VfVkFMSUQJCTB4ODAwCQkvKiBUQ0UgdmFsaWQgKi8KKyNkZWZpbmUgVENFX0FMTElPCQkweDQwMAkJLyogVENFIHZhbGlkIGZvciBhbGwgbHBhcnMgKi8KKyNkZWZpbmUgVENFX1BDSV9XUklURQkJMHgyCQkvKiB3cml0ZSBmcm9tIFBDSSBhbGxvd2VkICovCisjZGVmaW5lIFRDRV9QQ0lfUkVBRAkJMHgxCQkvKiByZWFkIGZyb20gUENJIGFsbG93ZWQgKi8KKyNkZWZpbmUgVENFX1ZCX1dSSVRFCQkweDEJCS8qIHdyaXRlIGZyb20gVkIgYWxsb3dlZCAqLwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19UQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy90b3BvbG9neS5oCmluZGV4IDE5YzU3NWYuLjkyZjNlNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdG9wb2xvZ3kuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3RvcG9sb2d5LmgKQEAgLTMxLDggKzMxLDEzIEBACiAKIGludCBvZl9ub2RlX3RvX25pZChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSk7CiAKLSNkZWZpbmUgcGNpYnVzX3RvX25vZGUobm9kZSkgICAgKC0xKQotI2RlZmluZSBwY2lidXNfdG9fY3B1bWFzayhidXMpCShjcHVfb25saW5lX21hcCkKK3N0cnVjdCBwY2lfYnVzOworZXh0ZXJuIGludCBwY2lidXNfdG9fbm9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKKworI2RlZmluZSBwY2lidXNfdG9fY3B1bWFzayhidXMpCShwY2lidXNfdG9fbm9kZShidXMpID09IC0xID8gXAorCQkJCQlDUFVfTUFTS19BTEwgOiBcCisJCQkJCW5vZGVfdG9fY3B1bWFzayhwY2lidXNfdG9fbm9kZShidXMpKSBcCisJCQkJKQogCiAvKiBzY2hlZF9kb21haW5zIFNEX05PREVfSU5JVCBmb3IgUFBDNjQgbWFjaGluZXMgKi8KICNkZWZpbmUgU0RfTk9ERV9JTklUIChzdHJ1Y3Qgc2NoZWRfZG9tYWluKSB7CQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3VkYmcuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oCmluZGV4IDVjNDIzNmMuLjE5YTE1MTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oCisrKyBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdWRiZy5oCkBAIC0yMyw3ICsyMyw4IEBACiBleHRlcm4gaW50IHVkYmdfcmVhZChjaGFyICpidWYsIGludCBidWZsZW4pOwogCiBleHRlcm4gdm9pZCByZWdpc3Rlcl9lYXJseV91ZGJnX2NvbnNvbGUodm9pZCk7Ci1leHRlcm4gdm9pZCB1ZGJnX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gdm9pZCB1ZGJnX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CiBleHRlcm4gdm9pZCB1ZGJnX3Byb2dyZXNzKGNoYXIgKnMsIHVuc2lnbmVkIHNob3J0IGhleCk7CiAKIGV4dGVybiB2b2lkIHVkYmdfaW5pdF91YXJ0KHZvaWQgX19pb21lbSAqY29tcG9ydCwgdW5zaWduZWQgaW50IHNwZWVkLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcG93ZXJwYy92Z2EuaCBiL2luY2x1ZGUvYXNtLXBvd2VycGMvdmdhLmgKaW5kZXggZWFkYWYyZi4uYTJlYWM0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy92Z2EuaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3ZnYS5oCkBAIC00MSw5ICs0MSw5IEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyB2Z2Fjb25fcmVtYXBfYmFzZTsKIAogI2lmZGVmIF9fcG93ZXJwYzY0X18KLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkgKCh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKCh4KSwgMCkpCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykgKCh1bnNpZ25lZCBsb25nKSBpb3JlbWFwKCh4KSwgcykpCiAjZWxzZQotI2RlZmluZSBWR0FfTUFQX01FTSh4KSAoeCArIHZnYWNvbl9yZW1hcF9iYXNlKQorI2RlZmluZSBWR0FfTUFQX01FTSh4LHMpICh4ICsgdmdhY29uX3JlbWFwX2Jhc2UpCiAjZW5kaWYKIAogI2RlZmluZSB2Z2FfcmVhZGIoeCkgKCooeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oIGIvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaAppbmRleCBiZTE0YzU5Li5kYzliZDEwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcG93ZXJwYy92aW8uaAorKysgYi9pbmNsdWRlL2FzbS1wb3dlcnBjL3Zpby5oCkBAIC02MywzMiArNjMsMjIgQEAKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CiB9OwogCi1zdHJ1Y3QgdmlvX2J1c19vcHMgewotCWludCAoKm1hdGNoKShjb25zdCBzdHJ1Y3QgdmlvX2RldmljZV9pZCAqaWQsIGNvbnN0IHN0cnVjdCB2aW9fZGV2ICpkZXYpOwotCXZvaWQgKCp1bnJlZ2lzdGVyX2RldmljZSkoc3RydWN0IHZpb19kZXYgKik7Ci0Jdm9pZCAoKnJlbGVhc2VfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICopOwotfTsKLQogZXh0ZXJuIHN0cnVjdCBkbWFfbWFwcGluZ19vcHMgdmlvX2RtYV9vcHM7CiBleHRlcm4gc3RydWN0IGJ1c190eXBlIHZpb19idXNfdHlwZTsKLWV4dGVybiBzdHJ1Y3QgdmlvX2RldiB2aW9fYnVzX2RldmljZTsKIAogZXh0ZXJuIGludCB2aW9fcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aW9fZHJpdmVyICpkcnYpOwogZXh0ZXJuIHZvaWQgdmlvX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2aW9fZHJpdmVyICpkcnYpOwogCi1leHRlcm4gc3RydWN0IHZpb19kZXYgKiBfX2RldmluaXQgdmlvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlvX2RldiAqdmlvZGV2KTsKIGV4dGVybiB2b2lkIF9fZGV2aW5pdCB2aW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpb19kZXYgKmRldik7CiAKLWV4dGVybiBpbnQgdmlvX2J1c19pbml0KHN0cnVjdCB2aW9fYnVzX29wcyAqKTsKLQotI2lmZGVmIENPTkZJR19QUENfUFNFUklFUwogc3RydWN0IGRldmljZV9ub2RlOwogCiBleHRlcm4gc3RydWN0IHZpb19kZXYgKiBfX2RldmluaXQgdmlvX3JlZ2lzdGVyX2RldmljZV9ub2RlKAogCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGVfdmRldik7Ci1leHRlcm4gc3RydWN0IHZpb19kZXYgKnZpb19maW5kX25vZGUoc3RydWN0IGRldmljZV9ub2RlICp2bm9kZSk7Ci1leHRlcm4gY29uc3Qgdm9pZCAqdmlvX2dldF9hdHRyaWJ1dGUoc3RydWN0IHZpb19kZXYgKnZkZXYsIHZvaWQgKndoaWNoLAorZXh0ZXJuIGNvbnN0IHZvaWQgKnZpb19nZXRfYXR0cmlidXRlKHN0cnVjdCB2aW9fZGV2ICp2ZGV2LCBjaGFyICp3aGljaCwKIAkJaW50ICpsZW5ndGgpOworI2lmZGVmIENPTkZJR19QUENfUFNFUklFUworZXh0ZXJuIHN0cnVjdCB2aW9fZGV2ICp2aW9fZmluZF9ub2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqdm5vZGUpOwogZXh0ZXJuIGludCB2aW9fZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHZpb19kZXYgKmRldik7CiBleHRlcm4gaW50IHZpb19kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IHZpb19kZXYgKmRldik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXBwYy9mbG9wcHkuaAppbmRleCA4Y2NkNGEyLi4yYmExOTFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL2Zsb3BweS5oCkBAIC05OSwxMCArOTksOCBAQAogCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2hhcmRpbnQsU0FfSU5URVJSVVBULAogCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwogCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsCi0JCQkJCQkgICBTQV9JTlRFUlJVUFR8U0FfU0FNUExFX1JBTkRPTSwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKLQorCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwgU0FfSU5URVJSVVBULAorCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCB2ZG1hX2RtYV9zZXR1cChjaGFyICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsIGludCBtb2RlLCBpbnQgaW8pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1wcGMvbW11LmggYi9pbmNsdWRlL2FzbS1wcGMvbW11LmgKaW5kZXggMGE3MGIwNS4uMTQ1ODRlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tcHBjL21tdS5oCisrKyBiL2luY2x1ZGUvYXNtLXBwYy9tbXUuaApAQCAtMjMsMjUgKzIzLDE4IEBACiAjZGVmaW5lIFBIWVNfRk1UCSIlMTZMeCIKICNlbmRpZgogCi0vKiBEZWZhdWx0ICJ1bnNpZ25lZCBsb25nIiBjb250ZXh0ICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbW1fY29udGV4dF90OwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgaWQ7CisJdW5zaWduZWQgbG9uZyB2ZHNvX2Jhc2U7Cit9IG1tX2NvbnRleHRfdDsKIAogLyogSGFyZHdhcmUgUGFnZSBUYWJsZSBFbnRyeSAqLwogdHlwZWRlZiBzdHJ1Y3QgX1BURSB7Ci0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JdW5zaWduZWQgbG9uZyBsb25nIHZzaWQ6NTI7Ci0JdW5zaWduZWQgbG9uZyBhcGk6NTsKLQl1bnNpZ25lZCBsb25nIDo1OwotCXVuc2lnbmVkIGxvbmcgaDoxOwotCXVuc2lnbmVkIGxvbmcgdjoxOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBycG46NTI7Ci0jZWxzZSAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KIAl1bnNpZ25lZCBsb25nIHY6MTsJLyogRW50cnkgaXMgdmFsaWQgKi8KIAl1bnNpZ25lZCBsb25nIHZzaWQ6MjQ7CS8qIFZpcnR1YWwgc2VnbWVudCBpZGVudGlmaWVyICovCiAJdW5zaWduZWQgbG9uZyBoOjE7CS8qIEhhc2ggYWxnb3JpdGhtIGluZGljYXRvciAqLwogCXVuc2lnbmVkIGxvbmcgYXBpOjY7CS8qIEFiYnJldmlhdGVkIHBhZ2UgaW5kZXggKi8KIAl1bnNpZ25lZCBsb25nIHJwbjoyMDsJLyogUmVhbCAocGh5c2ljYWwpIHBhZ2UgbnVtYmVyICovCi0jZW5kaWYgLyogQ09ORklHX1BQQzY0QlJJREdFICovCiAJdW5zaWduZWQgbG9uZyAgICA6MzsJLyogVW51c2VkICovCiAJdW5zaWduZWQgbG9uZyByOjE7CS8qIFJlZmVyZW5jZWQgKi8KIAl1bnNpZ25lZCBsb25nIGM6MTsJLyogQ2hhbmdlZCAqLwpAQCAtODIsMTEgKzc1LDcgQEAKIH0gUDYwMV9CQVRVOwogCiB0eXBlZGVmIHN0cnVjdCBfQkFUVSB7CQkvKiBVcHBlciBwYXJ0IG9mIEJBVCAoYWxsIGV4Y2VwdCA2MDEpICovCi0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JdW5zaWduZWQgbG9uZyBsb25nIGJlcGk6NDc7Ci0jZWxzZSAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KIAl1bnNpZ25lZCBsb25nIGJlcGk6MTU7CS8qIEVmZmVjdGl2ZSBwYWdlIGluZGV4ICh2aXJ0dWFsIGFkZHJlc3MpICovCi0jZW5kaWYgLyogQ09ORklHX1BQQzY0QlJJREdFICovCiAJdW5zaWduZWQgbG9uZyA6NDsJLyogVW51c2VkICovCiAJdW5zaWduZWQgbG9uZyBibDoxMTsJLyogQmxvY2sgc2l6ZSBtYXNrICovCiAJdW5zaWduZWQgbG9uZyB2czoxOwkvKiBTdXBlcnZpc29yIHZhbGlkICovCkBAIC0xMDEsMTEgKzkwLDcgQEAKIH0gUDYwMV9CQVRMOwogCiB0eXBlZGVmIHN0cnVjdCBfQkFUTCB7CQkvKiBMb3dlciBwYXJ0IG9mIEJBVCAoYWxsIGV4Y2VwdCA2MDEpICovCi0jaWZkZWYgQ09ORklHX1BQQzY0QlJJREdFCi0JdW5zaWduZWQgbG9uZyBsb25nIGJycG46NDc7Ci0jZWxzZSAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KIAl1bnNpZ25lZCBsb25nIGJycG46MTU7CS8qIFJlYWwgcGFnZSBpbmRleCAocGh5c2ljYWwgYWRkcmVzcykgKi8KLSNlbmRpZiAvKiBDT05GSUdfUFBDNjRCUklER0UgKi8KIAl1bnNpZ25lZCBsb25nIDoxMDsJLyogVW51c2VkICovCiAJdW5zaWduZWQgbG9uZyB3OjE7CS8qIFdyaXRlLXRocnUgY2FjaGUgKi8KIAl1bnNpZ25lZCBsb25nIGk6MTsJLyogQ2FjaGUgaW5oaWJpdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tcHBjL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaAppbmRleCA5NGYyYmY3Li4yYmM4NTg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaAorKysgYi9pbmNsdWRlL2FzbS1wcGMvbW11X2NvbnRleHQuaApAQCAtNzAsNyArNzAsNyBAQAogI2Vsc2UKIAogLyogUFBDIDZ4eCwgN3h4IENQVXMgKi8KLSNkZWZpbmUgTk9fQ09OVEVYVCAgICAgIAkoKG1tX2NvbnRleHRfdCkgLTEpCisjZGVmaW5lIE5PX0NPTlRFWFQgICAgICAJKCh1bnNpZ25lZCBsb25nKSAtMSkKICNkZWZpbmUgTEFTVF9DT05URVhUICAgIAkzMjc2NwogI2RlZmluZSBGSVJTVF9DT05URVhUICAgIAkxCiAjZW5kaWYKQEAgLTg1LDcgKzg1LDcgQEAKICAqIGNhbiBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb24gYWxsIHByb2Nlc3NvcnMgKGlmIHlvdSBoYXBwZW4gdG8gaGF2ZQogICogYW4gQWJhdHJvbikuCiAgKi8KLWV4dGVybiB2b2lkIHNldF9jb250ZXh0KG1tX2NvbnRleHRfdCBjb250ZXh0LCBwZ2RfdCAqcGdkKTsKK2V4dGVybiB2b2lkIHNldF9jb250ZXh0KHVuc2lnbmVkIGxvbmcgY29udGV4dGlkLCBwZ2RfdCAqcGdkKTsKIAogLyoKICAqIEJpdG1hcCBvZiBjb250ZXh0cyBpbiB1c2UuCkBAIC05OCw3ICs5OCw3IEBACiAgKiBJdHMgdXNlIGlzIGFuIG9wdGltaXphdGlvbiBvbmx5LCB3ZSBjYW4ndCByZWx5IG9uIHRoaXMgY29udGV4dAogICogbnVtYmVyIHRvIGJlIGZyZWUsIGJ1dCBpdCB1c3VhbGx5IHdpbGwgYmUuCiAgKi8KLWV4dGVybiBtbV9jb250ZXh0X3QgbmV4dF9tbXVfY29udGV4dDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG5leHRfbW11X2NvbnRleHQ7CiAKIC8qCiAgKiBJZiB3ZSBkb24ndCBoYXZlIHN1ZmZpY2llbnQgY29udGV4dHMgdG8gZ2l2ZSBvbmUgdG8gZXZlcnkgdGFzawpAQCAtMTE3LDkgKzExNyw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JbW1fY29udGV4dF90IGN0eDsKKwl1bnNpZ25lZCBsb25nIGN0eDsKIAotCWlmIChtbS0+Y29udGV4dCAhPSBOT19DT05URVhUKQorCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKQogCQlyZXR1cm47CiAjaWZkZWYgRkVXX0NPTlRFWFRTCiAJd2hpbGUgKGF0b21pY19kZWNfaWZfcG9zaXRpdmUoJm5yX2ZyZWVfY29udGV4dHMpIDwgMCkKQEAgLTEzMiw3ICsxMzIsNyBAQAogCQkJY3R4ID0gMDsKIAl9CiAJbmV4dF9tbXVfY29udGV4dCA9IChjdHggKyAxKSAmIExBU1RfQ09OVEVYVDsKLQltbS0+Y29udGV4dCA9IGN0eDsKKwltbS0+Y29udGV4dC5pZCA9IGN0eDsKICNpZmRlZiBGRVdfQ09OVEVYVFMKIAljb250ZXh0X21tW2N0eF0gPSBtbTsKICNlbmRpZgpAQCAtMTQxLDcgKzE0MSwxMiBAQAogLyoKICAqIFNldCB1cCB0aGUgY29udGV4dCBmb3IgYSBuZXcgYWRkcmVzcyBzcGFjZS4KICAqLwotI2RlZmluZSBpbml0X25ld19jb250ZXh0KHRzayxtbSkJKCgobW0pLT5jb250ZXh0ID0gTk9fQ09OVEVYVCksIDApCitzdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJbW0tPmNvbnRleHQuaWQgPSBOT19DT05URVhUOworCW1tLT5jb250ZXh0LnZkc29fYmFzZSA9IDA7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgKiBXZSdyZSBmaW5pc2hlZCB1c2luZyB0aGUgY29udGV4dCBmb3IgYW4gYWRkcmVzcyBzcGFjZS4KQEAgLTE0OSw5ICsxNTQsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIGRlc3Ryb3lfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKLQlpZiAobW0tPmNvbnRleHQgIT0gTk9fQ09OVEVYVCkgewotCQljbGVhcl9iaXQobW0tPmNvbnRleHQsIGNvbnRleHRfbWFwKTsKLQkJbW0tPmNvbnRleHQgPSBOT19DT05URVhUOworCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJCWNsZWFyX2JpdChtbS0+Y29udGV4dC5pZCwgY29udGV4dF9tYXApOworCQltbS0+Y29udGV4dC5pZCA9IE5PX0NPTlRFWFQ7CiAjaWZkZWYgRkVXX0NPTlRFWFRTCiAJCWF0b21pY19pbmMoJm5yX2ZyZWVfY29udGV4dHMpOwogI2VuZGlmCkBAIC0xNzksNyArMTg0LDcgQEAKIAogCS8qIFNldHVwIG5ldyB1c2Vyc3BhY2UgY29udGV4dCAqLwogCWdldF9tbXVfY29udGV4dChuZXh0KTsKLQlzZXRfY29udGV4dChuZXh0LT5jb250ZXh0LCBuZXh0LT5wZ2QpOworCXNldF9jb250ZXh0KG5leHQtPmNvbnRleHQuaWQsIG5leHQtPnBnZCk7CiB9CiAKICNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssbW0pCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4NXh4LmggYi9pbmNsdWRlL2FzbS1wcGMvbXBjODV4eC5oCmluZGV4IGMyNWJkZDkuLjliNDg1MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9tcGM4NXh4LmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL21wYzg1eHguaApAQCAtMjcsNiArMjcsOSBAQAogI2lmIGRlZmluZWQoQ09ORklHX01QQzg1NTVfQ0RTKSB8fCBkZWZpbmVkKENPTkZJR19NUEM4NTQ4X0NEUykKICNpbmNsdWRlIDxwbGF0Zm9ybXMvODV4eC9tcGM4NTU1X2Nkcy5oPgogI2VuZGlmCisjaWZkZWYgQ09ORklHX01QQzg1eHhfQ0RTCisjaW5jbHVkZSA8cGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuaD4KKyNlbmRpZgogI2lmZGVmIENPTkZJR19NUEM4NTYwX0FEUwogI2luY2x1ZGUgPHBsYXRmb3Jtcy84NXh4L21wYzg1NjBfYWRzLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oCmluZGV4IDljYjgzNjcuLjUxZmE3YzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXBwYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tcHBjL3BndGFibGUuaApAQCAtNjYyLDcgKzY2Miw3IEBACiAJcmV0dXJuIChvbGQgJiBfUEFHRV9BQ0NFU1NFRCkgIT0gMDsKIH0KICNkZWZpbmUgcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZyhfX3ZtYSwgX19hZGRyLCBfX3B0ZXApIFwKLQlfX3B0ZXBfdGVzdF9hbmRfY2xlYXJfeW91bmcoKF9fdm1hKS0+dm1fbW0tPmNvbnRleHQsIF9fYWRkciwgX19wdGVwKQorCV9fcHRlcF90ZXN0X2FuZF9jbGVhcl95b3VuZygoX192bWEpLT52bV9tbS0+Y29udGV4dC5pZCwgX19hZGRyLCBfX3B0ZXApCiAKICNkZWZpbmUgX19IQVZFX0FSQ0hfUFRFUF9URVNUX0FORF9DTEVBUl9ESVJUWQogc3RhdGljIGlubGluZSBpbnQgcHRlcF90ZXN0X2FuZF9jbGVhcl9kaXJ0eShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvaXJxLmggYi9pbmNsdWRlL2FzbS1zMzkwL2lycS5oCmluZGV4IDkxNmExYWEuLmJkMWE3MjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9pcnEuaApAQCAtMjEsMTAgKzIxLDYgQEAKIAogI2RlZmluZSB0b3VjaF9ubWlfd2F0Y2hkb2coKSBkbyB7IH0gd2hpbGUoMCkKIAotc3RydWN0IGlycWFjdGlvbjsKLXN0cnVjdCBwdF9yZWdzOwotaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgaXJxYWN0aW9uICopOwotCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXMzOTAvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1zMzkwL3BlcmNwdS5oCmluZGV4IDQzNmQyMTYuLmQ5YThjY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXMzOTAvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9hc20tczM5MC9wZXJjcHUuaApAQCAtNDAsNiArNDAsNyBAQAogICAgIF9fdHlwZW9mX18odHlwZSkgcGVyX2NwdV9fIyNuYW1lCiAKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpIF9fcmVsb2NfaGlkZSh2YXIsUzM5MF9sb3djb3JlLnBlcmNwdV9vZmZzZXQpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgX19yZWxvY19oaWRlKHZhcixTMzkwX2xvd2NvcmUucGVyY3B1X29mZnNldCkKICNkZWZpbmUgcGVyX2NwdSh2YXIsY3B1KSBfX3JlbG9jX2hpZGUodmFyLF9fcGVyX2NwdV9vZmZzZXRbY3B1XSkKIAogLyogQSBtYWNybyB0byBhdm9pZCAjaW5jbHVkZSBoZWxsLi4uICovCkBAIC01Nyw2ICs1OCw3IEBACiAgICAgX190eXBlb2ZfXyh0eXBlKSBwZXJfY3B1X18jI25hbWUKIAogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikgX19yZWxvY19oaWRlKHZhciwwKQorI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpIF9fcmVsb2NfaGlkZSh2YXIsMCkKICNkZWZpbmUgcGVyX2NwdSh2YXIsY3B1KSBfX3JlbG9jX2hpZGUodmFyLDApCiAKICNlbmRpZiAvKiBTTVAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2Zsb3BweS5oIGIvaW5jbHVkZS9hc20tc2gvZmxvcHB5LmgKaW5kZXggMzhkN2EyOS4uMzA3ZDljZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvZmxvcHB5LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvZmxvcHB5LmgKQEAgLTE0NywxMSArMTQ3LDEwIEBACiB7CiAJaWYoY2FuX3VzZV92aXJ0dWFsX2RtYSkKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LFNBX0lOVEVSUlVQVCwKLQkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAJZWxzZQotCQlyZXR1cm4gcmVxdWVzdF9pcnEoRkxPUFBZX0lSUSwgZmxvcHB5X2ludGVycnVwdCwKLQkJCQkJCSAgIFNBX0lOVEVSUlVQVHxTQV9TQU1QTEVfUkFORE9NLAotCQkJCQkJICAgImZsb3BweSIsIE5VTEwpOwkKKwkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CiAKIH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvZWJ1cy5oIGIvaW5jbHVkZS9hc20tc3BhcmMvZWJ1cy5oCmluZGV4IDJkNmE5OTcuLjU0NjUyODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjL2VidXMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9lYnVzLmgKQEAgLTEzLDEzICsxMywxNCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAKIHN0cnVjdCBsaW51eF9lYnVzX2NoaWxkIHsKIAlzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZAkJKm5leHQ7CiAJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpwYXJlbnQ7CiAJc3RydWN0IGxpbnV4X2VidXMJCSpidXM7Ci0JaW50CQkJCSBwcm9tX25vZGU7Ci0JY2hhcgkJCQkgcHJvbV9uYW1lWzY0XTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpwcm9tX25vZGU7CiAJc3RydWN0IHJlc291cmNlCQkJIHJlc291cmNlW1BST01SRUdfTUFYXTsKIAlpbnQJCQkJIG51bV9hZGRyczsKIAl1bnNpZ25lZCBpbnQJCQkgaXJxc1tQUk9NSU5UUl9NQVhdOwpAQCAtMjcsMjcgKzI4LDI3IEBACiB9OwogCiBzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UgeworCXN0cnVjdCBvZl9kZXZpY2UJCW9mZGV2OwogCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqbmV4dDsKIAlzdHJ1Y3QgbGludXhfZWJ1c19jaGlsZAkJKmNoaWxkcmVuOwogCXN0cnVjdCBsaW51eF9lYnVzCQkqYnVzOwotCWludAkJCQkgcHJvbV9ub2RlOwotCWNoYXIJCQkJIHByb21fbmFtZVs2NF07CisJc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwogCXN0cnVjdCByZXNvdXJjZQkJCSByZXNvdXJjZVtQUk9NUkVHX01BWF07CiAJaW50CQkJCSBudW1fYWRkcnM7CiAJdW5zaWduZWQgaW50CQkJIGlycXNbUFJPTUlOVFJfTUFYXTsKIAlpbnQJCQkJIG51bV9pcnFzOwogfTsKKyNkZWZpbmUgdG9fZWJ1c19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSwgb2ZkZXYuZGV2KQogCiBzdHJ1Y3QgbGludXhfZWJ1cyB7CisJc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7CiAJc3RydWN0IGxpbnV4X2VidXMJCSpuZXh0OwogCXN0cnVjdCBsaW51eF9lYnVzX2RldmljZQkqZGV2aWNlczsKIAlzdHJ1Y3QgbGludXhfcGJtX2luZm8JCSpwYXJlbnQ7CiAJc3RydWN0IHBjaV9kZXYJCQkqc2VsZjsKLQlpbnQJCQkJIHByb21fbm9kZTsKLQljaGFyCQkJCSBwcm9tX25hbWVbNjRdOwotCXN0cnVjdCBsaW51eF9wcm9tX2VidXNfcmFuZ2VzCSBlYnVzX3Jhbmdlc1tQUk9NUkVHX01BWF07Ci0JaW50CQkJCSBudW1fZWJ1c19yYW5nZXM7CisJc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwogfTsKKyNkZWZpbmUgdG9fZWJ1cyhkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGxpbnV4X2VidXMsIG9mZGV2LmRldikKIAogc3RydWN0IGxpbnV4X2VidXNfZG1hIHsKIAl1bnNpZ25lZCBpbnQgZGNzcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL2lycS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvaXJxLmgKaW5kZXggZjJkNjQ1My4uMzE0MWRkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvaXJxLmgKQEAgLTE4MSw4ICsxODEsNCBAQAogI2RlZmluZSBTVU40TV9JTlRfU0JVUyh4KQkoMSA8PCAoeCs3KSkKICNkZWZpbmUgU1VONE1fSU5UX1ZNRSh4KQkoMSA8PCAoeCkpCiAKLXN0cnVjdCBpcnFhY3Rpb247Ci1zdHJ1Y3QgcHRfcmVnczsKLWludCBoYW5kbGVfSVJRX2V2ZW50KHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgc3RydWN0IGlycWFjdGlvbiAqKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYy9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL29mX2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9vZl9kZXZpY2UuaApAQCAtMCwwICsxLDYzIEBACisjaWZuZGVmIF9BU01fU1BBUkNfT0ZfREVWSUNFX0gKKyNkZWZpbmUgX0FTTV9TUEFSQ19PRl9ERVZJQ0VfSAorI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZWJ1c19idXNfdHlwZTsKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgc2J1c19idXNfdHlwZTsKKworLyoKKyAqIFRoZSBvZl9kZXZpY2UgaXMgYSBraW5kIG9mICJiYXNlIGNsYXNzIiB0aGF0IGlzIGEgc3VwZXJzZXQgb2YKKyAqIHN0cnVjdCBkZXZpY2UgZm9yIHVzZSBieSBkZXZpY2VzIGF0dGFjaGVkIHRvIGFuIE9GIG5vZGUgYW5kCisgKiBwcm9iZWQgdXNpbmcgT0YgcHJvcGVydGllcy4KKyAqLworc3RydWN0IG9mX2RldmljZQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZQkqbm9kZTsJCS8qIE9GIGRldmljZSBub2RlICovCisJc3RydWN0IGRldmljZQkJZGV2OwkJLyogR2VuZXJpYyBkZXZpY2UgaW50ZXJmYWNlICovCit9OworI2RlZmluZQl0b19vZl9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBvZl9kZXZpY2UsIGRldikKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX2RldmljZSgKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaGVzLCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOworCitleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfZGV2X2dldChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgb2ZfZGV2X3B1dChzdHJ1Y3Qgb2ZfZGV2aWNlICpkZXYpOworCisvKgorICogQW4gb2ZfcGxhdGZvcm1fZHJpdmVyIGRyaXZlciBpcyBhdHRhY2hlZCB0byBhIGJhc2ljIG9mX2RldmljZSBvbgorICogdGhlIElTQSwgRUJVUywgYW5kIFNCVVMgYnVzc2VzIG9uIHNwYXJjNjQuCisgKi8KK3N0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIKK3sKKwljaGFyCQkJKm5hbWU7CisJc3RydWN0IG9mX2RldmljZV9pZAkqbWF0Y2hfdGFibGU7CisJc3RydWN0IG1vZHVsZQkJKm93bmVyOworCisJaW50CSgqcHJvYmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpOworCWludAkoKnJlbW92ZSkoc3RydWN0IG9mX2RldmljZSogZGV2KTsKKworCWludAkoKnN1c3BlbmQpKHN0cnVjdCBvZl9kZXZpY2UqIGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKKwlpbnQJKCpyZXN1bWUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisJaW50CSgqc2h1dGRvd24pKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7Cit9OworI2RlZmluZQl0b19vZl9wbGF0Zm9ybV9kcml2ZXIoZHJ2KSBjb250YWluZXJfb2YoZHJ2LHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIsIGRyaXZlcikKKworZXh0ZXJuIGludCBvZl9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2LAorCQkJICAgICAgc3RydWN0IGJ1c190eXBlICpidXMpOworZXh0ZXJuIHZvaWQgb2ZfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciAqZHJ2KTsKK2V4dGVybiBpbnQgb2ZfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KTsKK2V4dGVybiB2b2lkIG9mX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBvZl9kZXZpY2UgKm9mZGV2KTsKK2V4dGVybiBzdHJ1Y3Qgb2ZfZGV2aWNlICpvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJCQkgICBjb25zdCBjaGFyICpidXNfaWQsCisJCQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJCQkgICBzdHJ1Y3QgYnVzX3R5cGUgKmJ1cyk7CitleHRlcm4gdm9pZCBvZl9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9BU01fU1BBUkNfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3BibS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcGJtLmgKaW5kZXggMGFiYTNhOC4uZmVkZDljNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmMvcGJtLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvcGJtLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAKIHN0cnVjdCBsaW51eF9wYm1faW5mbyB7CiAJaW50CQlwcm9tX25vZGU7CkBAIC00MCw3ICs0MSw3IEBACiAgKi8KIHN0cnVjdCBwY2lkZXZfY29va2llIHsKIAlzdHJ1Y3QgbGludXhfcGJtX2luZm8JCSpwYm07Ci0JaW50CQkJCXByb21fbm9kZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpwcm9tX25vZGU7CiB9OwogCiAjZW5kaWYgLyogIShfX1NQQVJDX1BCTV9IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmMvcHJvbS5oIGIvaW5jbHVkZS9hc20tc3BhcmMvcHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZTNkMjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYy9wcm9tLmgKQEAgLTAsMCArMSw5OCBAQAorI2lmbmRlZiBfU1BBUkNfUFJPTV9ICisjZGVmaW5lIF9TUEFSQ19QUk9NX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0YWxraW5nIHRvIHRoZSBPcGVuIEZpcm13YXJlIFBST00gb24KKyAqIFBvd2VyIE1hY2ludG9zaCBjb21wdXRlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVXBkYXRlcyBmb3IgUFBDNjQgYnkgUGV0ZXIgQmVyZ25lciAmIERhdmlkIEVuZ2VicmV0c2VuLCBJQk0gQ29ycC4KKyAqIFVwZGF0ZXMgZm9yIFNQQVJDMzIgYnkgRGF2aWQgUy4gTWlsbGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCit0eXBlZGVmIHUzMiBwaGFuZGxlOwordHlwZWRlZiB1MzIgaWhhbmRsZTsKKworc3RydWN0IGludGVycnVwdF9pbmZvIHsKKwlpbnQJbGluZTsKKwlpbnQJc2Vuc2U7CQkvKiArdmUvLXZlIGxvZ2ljLCBlZGdlIG9yIGxldmVsLCBldGMuICovCit9OworCitzdHJ1Y3QgcHJvcGVydHkgeworCWNoYXIJKm5hbWU7CisJaW50CWxlbmd0aDsKKwl2b2lkCSp2YWx1ZTsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7Cit9OworCitzdHJ1Y3QgZGV2aWNlX25vZGUgeworCWNoYXIJKm5hbWU7CisJY2hhcgkqdHlwZTsKKwlwaGFuZGxlCW5vZGU7CisJcGhhbmRsZSBsaW51eF9waGFuZGxlOworCWludAluX2ludHJzOworCXN0cnVjdAlpbnRlcnJ1cHRfaW5mbyAqaW50cnM7CisJY2hhcgkqcGF0aF9jb21wb25lbnRfbmFtZTsKKwljaGFyCSpmdWxsX25hbWU7CisKKwlzdHJ1Y3QJcHJvcGVydHkgKnByb3BlcnRpZXM7CisJc3RydWN0ICBwcm9wZXJ0eSAqZGVhZHByb3BzOyAvKiByZW1vdmVkIHByb3BlcnRpZXMgKi8KKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKnBhcmVudDsKKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqc2libGluZzsKKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5leHQ7CS8qIG5leHQgZGV2aWNlIG9mIHNhbWUgdHlwZSAqLworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqYWxsbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIGFsbCBub2RlcyAqLworCXN0cnVjdCAgcHJvY19kaXJfZW50cnkgKnBkZTsJLyogdGhpcyBub2RlJ3MgcHJvYyBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgIGtyZWYga3JlZjsKKwl1bnNpZ25lZCBsb25nIF9mbGFnczsKKwl2b2lkCSpkYXRhOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ub2RlX3Byb2NfZW50cnkoc3RydWN0IGRldmljZV9ub2RlICpkbiwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlkbi0+cGRlID0gZGU7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKKwljb25zdCBjaGFyICpuYW1lKTsKKyNkZWZpbmUgZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRuLCBuYW1lKSBcCisJZm9yIChkbiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsIG5hbWUpOyBkbjsgXAorCSAgICAgZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShkbiwgbmFtZSkpCitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfdHlwZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCisJY29uc3QgY2hhciAqdHlwZSk7CisjZGVmaW5lIGZvcl9lYWNoX25vZGVfYnlfdHlwZShkbiwgdHlwZSkgXAorCWZvciAoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCB0eXBlKTsgZG47IFwKKwkgICAgIGRuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoZG4sIHR5cGUpKQorZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAorCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCk7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUgaGFuZGxlKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOworZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIGludCAqbGVucCk7CitleHRlcm4gaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgKm9mX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGludCAqbGVucCk7CitleHRlcm4gaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBpbnQgZGVmKTsKKworZXh0ZXJuIHZvaWQgcHJvbV9idWlsZF9kZXZpY2V0cmVlKHZvaWQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9TUEFSQ19QUk9NX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjL3NidXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjL3NidXMuaAppbmRleCBhMTNjZGRjLi5kMDM2ZTQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYy9zYnVzLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmMvc2J1cy5oCkBAIC0xMSw3ICsxMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLS8qICNpbmNsdWRlIDxhc20vaW9tbXUuaD4gKi8gLyogVW51c2VkIHNpbmNlIHdlIHVzZSBvcGFxdWUgaW9tbXUgKHxpby11bml0KSAqLworI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29mX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCiAvKiBXZSBzY2FuIHdoaWNoIGRldmljZXMgYXJlIG9uIHRoZSBTQnVzIHVzaW5nIHRoZSBQUk9NIG5vZGUgZGV2aWNlCkBAIC00MiwxOCArNDMsMTkgQEAKIAogLyogTGludXggU0JVUyBkZXZpY2UgdGFibGVzICovCiBzdHJ1Y3Qgc2J1c19kZXYgewotCXN0cnVjdCBzYnVzX2J1cwkqYnVzOyAgICAgICAvKiBCYWNrIHB0ciB0byBzYnVzICovCi0Jc3RydWN0IHNidXNfZGV2CSpuZXh0OyAgICAgIC8qIG5leHQgZGV2aWNlIG9uIHRoaXMgU0J1cyBvciBudWxsICovCi0Jc3RydWN0IHNidXNfZGV2CSpjaGlsZDsgICAgIC8qIEZvciBsZWRtYSBhbmQgZXNwZG1hIG9uIHN1bjRtICovCi0Jc3RydWN0IHNidXNfZGV2CSpwYXJlbnQ7ICAgIC8qIFBhcmVudCBkZXZpY2UgaWYgbm90IHRvcGxldmVsICovCi0JaW50IHByb21fbm9kZTsgICAgICAgICAgICAgIC8qIFBST00gZGV2aWNlIHRyZWUgbm9kZSBmb3IgdGhpcyBkZXZpY2UgKi8KLQljaGFyIHByb21fbmFtZVs2NF07ICAgICAgICAgLyogUFJPTSBkZXZpY2UgbmFtZSAqLworCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7CisJc3RydWN0IHNidXNfYnVzCQkqYnVzOworCXN0cnVjdCBzYnVzX2RldgkJKm5leHQ7CisJc3RydWN0IHNidXNfZGV2CQkqY2hpbGQ7CisJc3RydWN0IHNidXNfZGV2CQkqcGFyZW50OworCWludCBwcm9tX25vZGU7CQorCWNoYXIgcHJvbV9uYW1lWzY0XTsKIAlpbnQgc2xvdDsKIAogCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZVtQUk9NUkVHX01BWF07CiAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnX2FkZHJzW1BST01SRUdfTUFYXTsKLQlpbnQgbnVtX3JlZ2lzdGVycywgcmFuZ2VzX2FwcGxpZWQ7CisJaW50IG51bV9yZWdpc3RlcnM7CiAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgZGV2aWNlX3Jhbmdlc1tQUk9NUkVHX01BWF07CiAJaW50IG51bV9kZXZpY2VfcmFuZ2VzOwpAQCAtNjEsOSArNjMsMTEgQEAKIAl1bnNpZ25lZCBpbnQgaXJxc1s0XTsKIAlpbnQgbnVtX2lycXM7CiB9OworI2RlZmluZSB0b19zYnVzX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHNidXNfZGV2LCBvZmRldi5kZXYpCiAKIC8qIFRoaXMgc3RydWN0IGRlc2NyaWJlcyB0aGUgU0J1cyhzKSBmb3VuZCBvbiB0aGlzIG1hY2hpbmUuICovCiBzdHJ1Y3Qgc2J1c19idXMgeworCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7CiAJdm9pZAkJCSppb21tdTsJCS8qIE9wYXF1ZSBJT01NVSBjb29raWUgKi8KIAlzdHJ1Y3Qgc2J1c19kZXYJCSpkZXZpY2VzOwkvKiBMaW5rIHRvIGRldmljZXMgb24gdGhpcyBTQnVzICovCiAJc3RydWN0IHNidXNfYnVzCQkqbmV4dDsJCS8qIG5leHQgU0J1cywgaWYgbW9yZSB0aGFuIG9uZSBTQnVzICovCkBAIC03Nyw2ICs4MSw3IEBACiAJaW50IGRldmlkOwogCWludCBib2FyZDsKIH07CisjZGVmaW5lIHRvX3NidXMoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzYnVzX2J1cywgb2ZkZXYuZGV2KQogCiBleHRlcm4gc3RydWN0IHNidXNfYnVzICpzYnVzX3Jvb3Q7CiAKQEAgLTEwMiw2ICsxMDcsNyBAQAogI2RlZmluZSBzYnVzX2Nhbl9kbWFfNjRiaXQoc2RldikJKDApIC8qIGFjdHVhbGx5LCBzcGFyY19jcHVfbW9kZWw9PXN1bjRkICovCiAjZGVmaW5lIHNidXNfY2FuX2J1cnN0NjQoc2RldikJCSgwKSAvKiBhY3R1YWxseSwgc3BhcmNfY3B1X21vZGVsPT1zdW40ZCAqLwogZXh0ZXJuIHZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBzYnVzX2RldiAqLCBpbnQpOworZXh0ZXJuIHZvaWQgc2J1c19maWxsX2RldmljZV9pcnEoc3RydWN0IHNidXNfZGV2ICopOwogCiAvKiBUaGVzZSB5aWVsZCBJT01NVSBtYXBwaW5ncyBpbiBjb25zaXN0ZW50IG1vZGUuICovCiBleHRlcm4gdm9pZCAqc2J1c19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqLCBsb25nLCB1MzIgKmRtYV9hZGRycCk7CkBAIC0xMzksNCArMTQ1LDEwIEBACiBCVEZJWFVQREVGX0NBTEwodW5zaWduZWQgaW50LCBzYmludF90b19pcnEsIHN0cnVjdCBzYnVzX2RldiAqc2RldiwgdW5zaWduZWQgaW50KQogI2RlZmluZSBzYmludF90b19pcnEoc2Rldiwgc2JpbnQpIEJURklYVVBfQ0FMTChzYmludF90b19pcnEpKHNkZXYsIHNiaW50KQogCitleHRlcm4gdm9pZCBzYnVzX2FyY2hfYnVzX3Jhbmdlc19pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqLCBzdHJ1Y3Qgc2J1c19idXMgKik7CitleHRlcm4gdm9pZCBzYnVzX3NldHVwX2lvbW11KHN0cnVjdCBzYnVzX2J1cyAqLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CitleHRlcm4gdm9pZCBzYnVzX3NldHVwX2FyY2hfcHJvcHMoc3RydWN0IHNidXNfYnVzICosIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKK2V4dGVybiBpbnQgc2J1c19hcmNoX3ByZWluaXQodm9pZCk7CitleHRlcm4gdm9pZCBzYnVzX2FyY2hfcG9zdGluaXQodm9pZCk7CisKICNlbmRpZiAvKiAhKF9TUEFSQ19TQlVTX0gpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2VidXMuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCmluZGV4IDdhNDA4YTAuLmE0YWZlOWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZWJ1cy5oCkBAIC0xMCwxMyArMTAsMTQgQEAKIAogI2luY2x1ZGUgPGFzbS9wYm0uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIAogc3RydWN0IGxpbnV4X2VidXNfY2hpbGQgewogCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkCQkqbmV4dDsKIAlzdHJ1Y3QgbGludXhfZWJ1c19kZXZpY2UJKnBhcmVudDsKIAlzdHJ1Y3QgbGludXhfZWJ1cwkJKmJ1czsKLQlpbnQJCQkJIHByb21fbm9kZTsKLQljaGFyCQkJCSBwcm9tX25hbWVbNjRdOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKIAlzdHJ1Y3QgcmVzb3VyY2UJCQkgcmVzb3VyY2VbUFJPTVJFR19NQVhdOwogCWludAkJCQkgbnVtX2FkZHJzOwogCXVuc2lnbmVkIGludAkJCSBpcnFzW1BST01JTlRSX01BWF07CkBAIC0yNCwzMiArMjUsMjkgQEAKIH07CiAKIHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSB7CisJc3RydWN0IG9mX2RldmljZQkJb2ZkZXY7CiAJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpuZXh0OwogCXN0cnVjdCBsaW51eF9lYnVzX2NoaWxkCQkqY2hpbGRyZW47CiAJc3RydWN0IGxpbnV4X2VidXMJCSpidXM7Ci0JaW50CQkJCSBwcm9tX25vZGU7Ci0JY2hhcgkJCQkgcHJvbV9uYW1lWzY0XTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpwcm9tX25vZGU7CiAJc3RydWN0IHJlc291cmNlCQkJIHJlc291cmNlW1BST01SRUdfTUFYXTsKIAlpbnQJCQkJIG51bV9hZGRyczsKIAl1bnNpZ25lZCBpbnQJCQkgaXJxc1tQUk9NSU5UUl9NQVhdOwogCWludAkJCQkgbnVtX2lycXM7CiB9OworI2RlZmluZSB0b19lYnVzX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlLCBvZmRldi5kZXYpCiAKIHN0cnVjdCBsaW51eF9lYnVzIHsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCQlvZmRldjsKIAlzdHJ1Y3QgbGludXhfZWJ1cwkJKm5leHQ7CiAJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlCSpkZXZpY2VzOwogCXN0cnVjdCBwY2lfcGJtX2luZm8JCSpwYXJlbnQ7CiAJc3RydWN0IHBjaV9kZXYJCQkqc2VsZjsKIAlpbnQJCQkJIGluZGV4OwogCWludAkJCQkgaXNfcmlvOwotCWludAkJCQkgcHJvbV9ub2RlOwotCWNoYXIJCQkJIHByb21fbmFtZVs2NF07Ci0Jc3RydWN0IGxpbnV4X3Byb21fZWJ1c19yYW5nZXMJIGVidXNfcmFuZ2VzW1BST01SRUdfTUFYXTsKLQlpbnQJCQkJIG51bV9lYnVzX3JhbmdlczsKLQlzdHJ1Y3QgbGludXhfcHJvbV9lYnVzX2ludG1hcAkgZWJ1c19pbnRtYXBbUFJPTVJFR19NQVhdOwotCWludAkJCQkgbnVtX2VidXNfaW50bWFwOwotCXN0cnVjdCBsaW51eF9wcm9tX2VidXNfaW50bWFzawkgZWJ1c19pbnRtYXNrOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKIH07CisjZGVmaW5lIHRvX2VidXMoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBsaW51eF9lYnVzLCBvZmRldi5kZXYpCiAKIHN0cnVjdCBlYnVzX2RtYV9pbmZvIHsKIAlzcGlubG9ja190CWxvY2s7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZoYy5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9maGMuaAppbmRleCBmMjllYWEyLi45ZTdmMWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2ZoYy5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmhjLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KICNpbmNsdWRlIDxhc20vdXBhLmg+CiAKIHN0cnVjdCBsaW51eF9maGM7CkBAIC0zNCw4ICszNSw3IEBACiAJdW5zaWduZWQgbG9uZwkJCWNsa3JlZ3M7CiAJdW5zaWduZWQgbG9uZwkJCWNsa3ZlcjsKIAlpbnQJCQkJc2xvdHM7Ci0JaW50CQkJCXByb21fbm9kZTsKLQljaGFyCQkJCXByb21fbmFtZVs2NF07CisJc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOwogCiAJc3RydWN0IGxpbnV4X3Byb21fcmFuZ2VzCWNlbnRyYWxfcmFuZ2VzW1BST01SRUdfTUFYXTsKIAlpbnQJCQkJbnVtX2NlbnRyYWxfcmFuZ2VzOwpAQCAtMTEyLDggKzExMiw3IEBACiAJc3RydWN0IGZoY19yZWdzCQkJZmhjX3JlZ3M7CiAJaW50CQkJCWJvYXJkOwogCWludAkJCQlqdGFnX21hc3RlcjsKLQlpbnQJCQkJcHJvbV9ub2RlOwotCWNoYXIJCQkJcHJvbV9uYW1lWzY0XTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJCSpwcm9tX25vZGU7CiAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMJZmhjX3Jhbmdlc1tQUk9NUkVHX01BWF07CiAJaW50CQkJCW51bV9maGNfcmFuZ2VzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvZmxvcHB5LmgKaW5kZXggMDdjY2Q2Zi4uZjhkNTdiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L2Zsb3BweS5oCkBAIC00OTgsMTUgKzQ5OCwxNCBAQAogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgX19pbml0IGVidXNfZmR0aHJlZV9wKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikKIHsKLQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJmZHRocmVlIikpCisJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiZmR0aHJlZSIpKQogCQlyZXR1cm4gMTsKLQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJmbG9wcHkiKSkgewotCQljaGFyIGNvbXBhdFsxNl07Ci0JCXByb21fZ2V0c3RyaW5nKGVkZXYtPnByb21fbm9kZSwKLQkJCSAgICAgICAiY29tcGF0aWJsZSIsCi0JCQkgICAgICAgY29tcGF0LCBzaXplb2YoY29tcGF0KSk7Ci0JCWNvbXBhdFsxNV0gPSAnXDAnOwotCQlpZiAoIXN0cmNtcChjb21wYXQsICJmZHRocmVlIikpCisJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiZmxvcHB5IikpIHsKKwkJY2hhciAqY29tcGF0OworCisJCWNvbXBhdCA9IG9mX2dldF9wcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsCisJCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOworCQlpZiAoY29tcGF0ICYmICFzdHJjbXAoY29tcGF0LCAiZmR0aHJlZSIpKQogCQkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNTI0LDEyICs1MjMsMTIgQEAKIAogCWZvcl9lYWNoX2lzYShpc2FfYnIpIHsKIAkJZm9yX2VhY2hfaXNhZGV2KGlzYV9kZXYsIGlzYV9icikgewotCQkJaWYgKCFzdHJjbXAoaXNhX2Rldi0+cHJvbV9uYW1lLCAiZG1hIikpIHsKKwkJCWlmICghc3RyY21wKGlzYV9kZXYtPnByb21fbm9kZS0+bmFtZSwgImRtYSIpKSB7CiAJCQkJc3RydWN0IHNwYXJjX2lzYV9kZXZpY2UgKmNoaWxkID0KIAkJCQkJaXNhX2Rldi0+Y2hpbGQ7CiAKIAkJCQl3aGlsZSAoY2hpbGQpIHsKLQkJCQkJaWYgKCFzdHJjbXAoY2hpbGQtPnByb21fbmFtZSwKKwkJCQkJaWYgKCFzdHJjbXAoY2hpbGQtPnByb21fbm9kZS0+bmFtZSwKIAkJCQkJCSAgICAiZmxvcHB5IikpIHsKIAkJCQkJCWlzYV9kZXYgPSBjaGlsZDsKIAkJCQkJCWdvdG8gaXNhX2RvbmU7CkBAIC02MTQsNiArNjEzLDcgQEAKIAkJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVMTDsKIAkJdW5zaWduZWQgbG9uZyBjb25maWcgPSAwOwogCQl2b2lkIF9faW9tZW0gKmF1eGlvX3JlZzsKKwkJY2hhciAqc3RhdGVfcHJvcDsKIAogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewpAQCAtNjMwLDkgKzYzMCw4IEBACiAjZW5kaWYKIAkJfQogCi0JCXByb21fZ2V0cHJvcGVydHkoZWRldi0+cHJvbV9ub2RlLCAic3RhdHVzIiwKLQkJCQkgc3RhdGUsIHNpemVvZihzdGF0ZSkpOwotCQlpZiAoIXN0cm5jbXAoc3RhdGUsICJkaXNhYmxlZCIsIDgpKQorCQlzdGF0ZV9wcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGVkZXYtPnByb21fbm9kZSwgInN0YXR1cyIsIE5VTEwpOworCQlpZiAoc3RhdGVfcHJvcCAmJiAhc3RybmNtcChzdGF0ZV9wcm9wLCAiZGlzYWJsZWQiLCA4KSkKIAkJCXJldHVybiAwOwogCQkJCiAJCUZMT1BQWV9JUlEgPSBlZGV2LT5pcnFzWzBdOwpAQCAtNzAzLDcgKzcwMiw3IEBACiAJCSAqLwogCQlmb3JfZWFjaF9lYnVzKGVidXMpIHsKIAkJCWZvcl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgewotCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImVjcHAiKSkgeworCQkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbm9kZS0+bmFtZSwgImVjcHAiKSkgewogCQkJCQljb25maWcgPSBlZGV2LT5yZXNvdXJjZVsxXS5zdGFydDsKIAkJCQkJZ290byBjb25maWdfZG9uZTsKIAkJCQl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2lzYS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9pc2EuaAppbmRleCA0NjAxYmJmLi5kOTcyOGI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L2lzYS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvaXNhLmgKQEAgLTksMzcgKzksMzIgQEAKIAogI2luY2x1ZGUgPGFzbS9wYm0uaD4KICNpbmNsdWRlIDxhc20vb3BsaWIuaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KIAogc3RydWN0IHNwYXJjX2lzYV9icmlkZ2U7CiAKIHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlIHsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCW9mZGV2OwogCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlCSpuZXh0OwogCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlCSpjaGlsZDsKIAlzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZQkqYnVzOwotCWludAkJCXByb21fbm9kZTsKLQljaGFyCQkJcHJvbV9uYW1lWzY0XTsKLQljaGFyCQkJY29tcGF0aWJsZVs2NF07CisJc3RydWN0IGRldmljZV9ub2RlCSpwcm9tX25vZGU7CiAJc3RydWN0IHJlc291cmNlCQlyZXNvdXJjZTsKIAl1bnNpZ25lZCBpbnQJCWlycTsKIH07CisjZGVmaW5lIHRvX2lzYV9kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzcGFyY19pc2FfZGV2aWNlLCBvZmRldi5kZXYpCiAKIHN0cnVjdCBzcGFyY19pc2FfYnJpZGdlIHsKKwlzdHJ1Y3Qgb2ZfZGV2aWNlCW9mZGV2OwogCXN0cnVjdCBzcGFyY19pc2FfYnJpZGdlCSpuZXh0OwogCXN0cnVjdCBzcGFyY19pc2FfZGV2aWNlCSpkZXZpY2VzOwogCXN0cnVjdCBwY2lfcGJtX2luZm8JKnBhcmVudDsKIAlzdHJ1Y3QgcGNpX2RldgkJKnNlbGY7CiAJaW50CQkJaW5kZXg7Ci0JaW50CQkJcHJvbV9ub2RlOwotCWNoYXIJCQlwcm9tX25hbWVbNjRdOwotI2RlZmluZSBsaW51eF9wcm9tX2lzYV9yYW5nZXMgbGludXhfcHJvbV9lYnVzX3JhbmdlcwotCXN0cnVjdCBsaW51eF9wcm9tX2lzYV9yYW5nZXMJaXNhX3Jhbmdlc1tQUk9NUkVHX01BWF07Ci0JaW50CQkJbnVtX2lzYV9yYW5nZXM7Ci0jZGVmaW5lIGxpbnV4X3Byb21faXNhX2ludG1hcAlsaW51eF9wcm9tX2VidXNfaW50bWFwCi0Jc3RydWN0IGxpbnV4X3Byb21faXNhX2ludG1hcAlpc2FfaW50bWFwW1BST01SRUdfTUFYXTsKLQlpbnQJCQludW1faXNhX2ludG1hcDsKLSNkZWZpbmUgbGludXhfcHJvbV9pc2FfaW50bWFzawlsaW51eF9wcm9tX2VidXNfaW50bWFzawotCXN0cnVjdCBsaW51eF9wcm9tX2lzYV9pbnRtYXAJaXNhX2ludG1hc2s7CisJc3RydWN0IGRldmljZV9ub2RlCSpwcm9tX25vZGU7CiB9OworI2RlZmluZSB0b19pc2FfYnJpZGdlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc3BhcmNfaXNhX2JyaWRnZSwgb2ZkZXYuZGV2KQogCiBleHRlcm4gc3RydWN0IHNwYXJjX2lzYV9icmlkZ2UJKmlzYV9jaGFpbjsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvb2ZfZGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI0MDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvb2ZfZGV2aWNlLmgKQEAgLTAsMCArMSw2NCBAQAorI2lmbmRlZiBfQVNNX1NQQVJDNjRfT0ZfREVWSUNFX0gKKyNkZWZpbmUgX0FTTV9TUEFSQzY0X09GX0RFVklDRV9ICisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpc2FfYnVzX3R5cGU7CitleHRlcm4gc3RydWN0IGJ1c190eXBlIGVidXNfYnVzX3R5cGU7CitleHRlcm4gc3RydWN0IGJ1c190eXBlIHNidXNfYnVzX3R5cGU7CisKKy8qCisgKiBUaGUgb2ZfZGV2aWNlIGlzIGEga2luZCBvZiAiYmFzZSBjbGFzcyIgdGhhdCBpcyBhIHN1cGVyc2V0IG9mCisgKiBzdHJ1Y3QgZGV2aWNlIGZvciB1c2UgYnkgZGV2aWNlcyBhdHRhY2hlZCB0byBhbiBPRiBub2RlIGFuZAorICogcHJvYmVkIHVzaW5nIE9GIHByb3BlcnRpZXMuCisgKi8KK3N0cnVjdCBvZl9kZXZpY2UKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUJKm5vZGU7CQkvKiBPRiBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBkZXZpY2UJCWRldjsJCS8qIEdlbmVyaWMgZGV2aWNlIGludGVyZmFjZSAqLworfTsKKyNkZWZpbmUJdG9fb2ZfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgb2ZfZGV2aWNlLCBkZXYpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9tYXRjaF9kZXZpY2UoCisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2hlcywgY29uc3Qgc3RydWN0IG9mX2RldmljZSAqZGV2KTsKKworZXh0ZXJuIHN0cnVjdCBvZl9kZXZpY2UgKm9mX2Rldl9nZXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIG9mX2Rldl9wdXQoc3RydWN0IG9mX2RldmljZSAqZGV2KTsKKworLyoKKyAqIEFuIG9mX3BsYXRmb3JtX2RyaXZlciBkcml2ZXIgaXMgYXR0YWNoZWQgdG8gYSBiYXNpYyBvZl9kZXZpY2Ugb24KKyAqIHRoZSBJU0EsIEVCVVMsIGFuZCBTQlVTIGJ1c3NlcyBvbiBzcGFyYzY0LgorICovCitzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyCit7CisJY2hhcgkJCSpuYW1lOworCXN0cnVjdCBvZl9kZXZpY2VfaWQJKm1hdGNoX3RhYmxlOworCXN0cnVjdCBtb2R1bGUJCSpvd25lcjsKKworCWludAkoKnByb2JlKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKTsKKwlpbnQJKCpyZW1vdmUpKHN0cnVjdCBvZl9kZXZpY2UqIGRldik7CisKKwlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50CSgqcmVzdW1lKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOworCWludAkoKnNodXRkb3duKShzdHJ1Y3Qgb2ZfZGV2aWNlKiBkZXYpOworCisJc3RydWN0IGRldmljZV9kcml2ZXIJZHJpdmVyOworfTsKKyNkZWZpbmUJdG9fb2ZfcGxhdGZvcm1fZHJpdmVyKGRydikgY29udGFpbmVyX29mKGRydixzdHJ1Y3Qgb2ZfcGxhdGZvcm1fZHJpdmVyLCBkcml2ZXIpCisKK2V4dGVybiBpbnQgb2ZfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydiwKKwkJCSAgICAgIHN0cnVjdCBidXNfdHlwZSAqYnVzKTsKK2V4dGVybiB2b2lkIG9mX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBvZl9wbGF0Zm9ybV9kcml2ZXIgKmRydik7CitleHRlcm4gaW50IG9mX2RldmljZV9yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7CitleHRlcm4gdm9pZCBvZl9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgb2ZfZGV2aWNlICpvZmRldik7CitleHRlcm4gc3RydWN0IG9mX2RldmljZSAqb2ZfcGxhdGZvcm1fZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkJICAgY29uc3QgY2hhciAqYnVzX2lkLAorCQkJCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkJICAgc3RydWN0IGJ1c190eXBlICpidXMpOworZXh0ZXJuIHZvaWQgb2ZfcmVsZWFzZV9kZXYoc3RydWN0IGRldmljZSAqZGV2KTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfQVNNX1NQQVJDNjRfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvb3BsaWIuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvb3BsaWIuaAppbmRleCBkZWEzZTczLi5hNjhiMGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L29wbGliLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9vcGxpYi5oCkBAIC0zMjMsOCArMzIzLDkgQEAKIGV4dGVybiBpbnQgcHJvbV9pbnN0MnBrZyhpbnQpOwogCiAvKiBDUFUgcHJvYmluZyBoZWxwZXJzLiAgKi8KLWludCBjcHVfZmluZF9ieV9pbnN0YW5jZShpbnQgaW5zdGFuY2UsIGludCAqcHJvbV9ub2RlLCBpbnQgKm1pZCk7Ci1pbnQgY3B1X2ZpbmRfYnlfbWlkKGludCBtaWQsIGludCAqcHJvbV9ub2RlKTsKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKK2ludCBjcHVfZmluZF9ieV9pbnN0YW5jZShpbnQgaW5zdGFuY2UsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKmRldl9ub2RlLCBpbnQgKm1pZCk7CitpbnQgY3B1X2ZpbmRfYnlfbWlkKGludCBtaWQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKnByb21fbm9kZSk7CiAKIC8qIENsaWVudCBpbnRlcmZhY2UgbGV2ZWwgcm91dGluZXMuICovCiBleHRlcm4gdm9pZCBwcm9tX3NldF90cmFwX3RhYmxlKHVuc2lnbmVkIGxvbmcgdGJhKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGFycG9ydC5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmgKaW5kZXggNTZiNTE5Ny4uZDM4OTU4NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYXJwb3J0LmgKQEAgLTY3LDE4ICs2NywxNyBAQAogCiBzdGF0aWMgaW50IGVidXNfZWNwcF9wKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikKIHsKLQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJlY3BwIikpCisJaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiZWNwcCIpKQogCQlyZXR1cm4gMTsKLQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJwYXJhbGxlbCIpKSB7Ci0JCWNoYXIgY29tcGF0WzE5XTsKLQkJcHJvbV9nZXRzdHJpbmcoZWRldi0+cHJvbV9ub2RlLAotCQkJICAgICAgICJjb21wYXRpYmxlIiwKLQkJCSAgICAgICBjb21wYXQsIHNpemVvZihjb21wYXQpKTsKLQkJY29tcGF0WzE4XSA9ICdcMCc7Ci0JCWlmICghc3RyY21wKGNvbXBhdCwgImVjcHAiKSkKLQkJCXJldHVybiAxOwotCQlpZiAoIXN0cmNtcChjb21wYXQsICJuczg3MzE3LWVjcHAiKSAmJgotCQkgICAgIXN0cmNtcChjb21wYXQgKyAxMywgImVjcHAiKSkKKwlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJwYXJhbGxlbCIpKSB7CisJCWNoYXIgKmNvbXBhdDsKKworCQljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZWRldi0+cHJvbV9ub2RlLAorCQkJCQkgImNvbXBhdGlibGUiLCBOVUxMKTsKKwkJaWYgKGNvbXBhdCAmJgorCQkgICAgKCFzdHJjbXAoY29tcGF0LCAiZWNwcCIpIHx8CisJCSAgICAgIXN0cmNtcChjb21wYXQsICJuczg3MzE3LWVjcHAiKSB8fAorCQkgICAgICFzdHJjbXAoY29tcGF0ICsgMTMsICJlY3BwIikpKQogCQkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtOTQsMTIgKzkzLDEyIEBACiAJCQlzdHJ1Y3Qgc3BhcmNfaXNhX2RldmljZSAqY2hpbGQ7CiAJCQl1bnNpZ25lZCBsb25nIGJhc2U7CiAKLQkJCWlmIChzdHJjbXAoaXNhX2Rldi0+cHJvbV9uYW1lLCAiZG1hIikpCisJCQlpZiAoc3RyY21wKGlzYV9kZXYtPnByb21fbm9kZS0+bmFtZSwgImRtYSIpKQogCQkJCWNvbnRpbnVlOwogCiAJCQljaGlsZCA9IGlzYV9kZXYtPmNoaWxkOwogCQkJd2hpbGUgKGNoaWxkKSB7Ci0JCQkJaWYgKCFzdHJjbXAoY2hpbGQtPnByb21fbmFtZSwgInBhcmFsbGVsIikpCisJCQkJaWYgKCFzdHJjbXAoY2hpbGQtPnByb21fbm9kZS0+bmFtZSwgInBhcmFsbGVsIikpCiAJCQkJCWJyZWFrOwogCQkJCWNoaWxkID0gY2hpbGQtPm5leHQ7CiAJCQl9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wYm0uaAppbmRleCAxMzk2ZjExLi5jZWJlODBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BibS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGJtLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9vcGxpYi5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAKIC8qIFRoZSBhYnN0cmFjdGlvbiB1c2VkIGhlcmUgaXMgdGhhdCB0aGVyZSBhcmUgUENJIGNvbnRyb2xsZXJzLApAQCAtMTUzLDE2ICsxNTQsMTUgQEAKIAlpbnQJCQkJY2hpcF9yZXZpc2lvbjsKIAogCS8qIE5hbWUgdXNlZCBmb3IgdG9wLWxldmVsIHJlc291cmNlcy4gKi8KLQljaGFyCQkJCW5hbWVbNjRdOworCWNoYXIJCQkJKm5hbWU7CiAKIAkvKiBPQlAgc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCi0JaW50CQkJCXByb21fbm9kZTsKLQljaGFyCQkJCXByb21fbmFtZVs2NF07Ci0Jc3RydWN0IGxpbnV4X3Byb21fcGNpX3JhbmdlcwlwYm1fcmFuZ2VzW1BST01fUENJUk5HX01BWF07CisJc3RydWN0IGRldmljZV9ub2RlCQkqcHJvbV9ub2RlOworCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9yYW5nZXMJKnBibV9yYW5nZXM7CiAJaW50CQkJCW51bV9wYm1fcmFuZ2VzOwotCXN0cnVjdCBsaW51eF9wcm9tX3BjaV9pbnRtYXAJcGJtX2ludG1hcFtQUk9NX1BDSUlNQVBfTUFYXTsKKwlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFwCSpwYm1faW50bWFwOwogCWludAkJCQludW1fcGJtX2ludG1hcDsKLQlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFzawlwYm1faW50bWFzazsKKwlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfaW50bWFzawkqcGJtX2ludG1hc2s7CiAJdTY0CQkJCWlub19iaXRtYXA7CiAKIAkvKiBQQk0gSS9PIGFuZCBNZW1vcnkgc3BhY2UgcmVzb3VyY2VzLiAqLwpAQCAtMjI3LDggKzIyNyw3IEBACiAgKi8KIHN0cnVjdCBwY2lkZXZfY29va2llIHsKIAlzdHJ1Y3QgcGNpX3BibV9pbmZvCQkqcGJtOwotCWNoYXIJCQkJcHJvbV9uYW1lWzY0XTsKLQlpbnQJCQkJcHJvbV9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZQkJKnByb21fbm9kZTsKIAlzdHJ1Y3QgbGludXhfcHJvbV9wY2lfcmVnaXN0ZXJzCXByb21fcmVnc1tQUk9NUkVHX01BWF07CiAJaW50IG51bV9wcm9tX3JlZ3M7CiAJc3RydWN0IGxpbnV4X3Byb21fcGNpX3JlZ2lzdGVycyBwcm9tX2Fzc2lnbm1lbnRzW1BST01SRUdfTUFYXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGVyY3B1LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3BlcmNwdS5oCmluZGV4IGJhZWYxM2IuLmE2ZWNlMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGVyY3B1LmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC9wZXJjcHUuaApAQCAtMjEsNiArMjEsNyBAQAogLyogdmFyIGlzIGluIGRpc2NhcmRlZCByZWdpb246IG9mZnNldCB0byBwYXJ0aWN1bGFyIGNvcHkgd2Ugd2FudCAqLwogI2RlZmluZSBwZXJfY3B1KHZhciwgY3B1KSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX3Blcl9jcHVfb2Zmc2V0KGNwdSkpKQogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19sb2NhbF9wZXJfY3B1X29mZnNldCkpCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19sb2NhbF9wZXJfY3B1X29mZnNldCkpCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwogI2RlZmluZSBwZXJjcHVfbW9kY29weShwY3B1ZHN0LCBzcmMsIHNpemUpCQkJXApAQCAtMzcsNiArMzgsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpY3B1LCAmcGVyX2NwdV9fIyN2YXIpKQogI2RlZmluZSBfX2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgorI2RlZmluZSBfX3Jhd19nZXRfY3B1X3Zhcih2YXIpCQkJcGVyX2NwdV9fIyN2YXIKIAogI2VuZGlmCS8qIFNNUCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3BndGFibGUuaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGd0YWJsZS5oCmluZGV4IDRlMjE4ODEuLjAzZjViYzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGd0YWJsZS5oCisrKyBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcGd0YWJsZS5oCkBAIC03NTYsNiArNzU2LDggQEAKICNkZWZpbmUga2Vybl9hZGRyX3ZhbGlkKGFkZHIpCVwKIAkodGVzdF9iaXQoX19wYSgodW5zaWduZWQgbG9uZykoYWRkcikpPj4yMiwgc3BhcmM2NF92YWxpZF9hZGRyX2JpdG1hcCkpCiAKK2V4dGVybiBpbnQgcGFnZV9pbl9waHlzX2F2YWlsKHVuc2lnbmVkIGxvbmcgcGFkZHIpOworCiBleHRlcm4gaW50IGlvX3JlbWFwX3Bmbl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBmcm9tLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgcGdwcm90X3QgcHJvdCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb20uaCBiL2luY2x1ZGUvYXNtLXNwYXJjNjQvcHJvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTU1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3Byb20uaApAQCAtMCwwICsxLDk4IEBACisjaWZuZGVmIF9TUEFSQzY0X1BST01fSAorI2RlZmluZSBfU1BBUkM2NF9QUk9NX0gKKyNpZmRlZiBfX0tFUk5FTF9fCisKKworLyoKKyAqIERlZmluaXRpb25zIGZvciB0YWxraW5nIHRvIHRoZSBPcGVuIEZpcm13YXJlIFBST00gb24KKyAqIFBvd2VyIE1hY2ludG9zaCBjb21wdXRlcnMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDUgUGF1bCBNYWNrZXJyYXMuCisgKgorICogVXBkYXRlcyBmb3IgUFBDNjQgYnkgUGV0ZXIgQmVyZ25lciAmIERhdmlkIEVuZ2VicmV0c2VuLCBJQk0gQ29ycC4KKyAqIFVwZGF0ZXMgZm9yIFNQQVJDNjQgYnkgRGF2aWQgUy4gTWlsbGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCit0eXBlZGVmIHUzMiBwaGFuZGxlOwordHlwZWRlZiB1MzIgaWhhbmRsZTsKKworc3RydWN0IGludGVycnVwdF9pbmZvIHsKKwlpbnQJbGluZTsKKwlpbnQJc2Vuc2U7CQkvKiArdmUvLXZlIGxvZ2ljLCBlZGdlIG9yIGxldmVsLCBldGMuICovCit9OworCitzdHJ1Y3QgcHJvcGVydHkgeworCWNoYXIJKm5hbWU7CisJaW50CWxlbmd0aDsKKwl2b2lkCSp2YWx1ZTsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7Cit9OworCitzdHJ1Y3QgZGV2aWNlX25vZGUgeworCWNoYXIJKm5hbWU7CisJY2hhcgkqdHlwZTsKKwlwaGFuZGxlCW5vZGU7CisJcGhhbmRsZSBsaW51eF9waGFuZGxlOworCWludAluX2ludHJzOworCXN0cnVjdAlpbnRlcnJ1cHRfaW5mbyAqaW50cnM7CisJY2hhcgkqcGF0aF9jb21wb25lbnRfbmFtZTsKKwljaGFyCSpmdWxsX25hbWU7CisKKwlzdHJ1Y3QJcHJvcGVydHkgKnByb3BlcnRpZXM7CisJc3RydWN0ICBwcm9wZXJ0eSAqZGVhZHByb3BzOyAvKiByZW1vdmVkIHByb3BlcnRpZXMgKi8KKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKnBhcmVudDsKKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKmNoaWxkOworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqc2libGluZzsKKwlzdHJ1Y3QJZGV2aWNlX25vZGUgKm5leHQ7CS8qIG5leHQgZGV2aWNlIG9mIHNhbWUgdHlwZSAqLworCXN0cnVjdAlkZXZpY2Vfbm9kZSAqYWxsbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIGFsbCBub2RlcyAqLworCXN0cnVjdCAgcHJvY19kaXJfZW50cnkgKnBkZTsJLyogdGhpcyBub2RlJ3MgcHJvYyBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgIGtyZWYga3JlZjsKKwl1bnNpZ25lZCBsb25nIF9mbGFnczsKKwl2b2lkCSpkYXRhOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ub2RlX3Byb2NfZW50cnkoc3RydWN0IGRldmljZV9ub2RlICpkbiwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlkbi0+cGRlID0gZGU7Cit9CisKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9uYW1lKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZnJvbSwKKwljb25zdCBjaGFyICpuYW1lKTsKKyNkZWZpbmUgZm9yX2VhY2hfbm9kZV9ieV9uYW1lKGRuLCBuYW1lKSBcCisJZm9yIChkbiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsIG5hbWUpOyBkbjsgXAorCSAgICAgZG4gPSBvZl9maW5kX25vZGVfYnlfbmFtZShkbiwgbmFtZSkpCitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfdHlwZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmZyb20sCisJY29uc3QgY2hhciAqdHlwZSk7CisjZGVmaW5lIGZvcl9lYWNoX25vZGVfYnlfdHlwZShkbiwgdHlwZSkgXAorCWZvciAoZG4gPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCB0eXBlKTsgZG47IFwKKwkgICAgIGRuID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoZG4sIHR5cGUpKQorZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoc3RydWN0IGRldmljZV9ub2RlICpmcm9tLAorCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKmNvbXBhdCk7CitleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9maW5kX25vZGVfYnlfcGF0aChjb25zdCBjaGFyICpwYXRoKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKHBoYW5kbGUgaGFuZGxlKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9wYXJlbnQoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpub2RlKTsKK2V4dGVybiBzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX2dldF9uZXh0X2NoaWxkKGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnByZXYpOworZXh0ZXJuIHN0cnVjdCBwcm9wZXJ0eSAqb2ZfZmluZF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCQkgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJIGludCAqbGVucCk7CitleHRlcm4gaW50IG9mX2RldmljZV9pc19jb21wYXRpYmxlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZGV2aWNlLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHZvaWQgKm9mX2dldF9wcm9wZXJ0eShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIGludCAqbGVucCk7CitleHRlcm4gaW50IG9mX2dldGludHByb3BfZGVmYXVsdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSBjb25zdCBjaGFyICpuYW1lLAorCQkJCSBpbnQgZGVmKTsKKworZXh0ZXJuIHZvaWQgcHJvbV9idWlsZF9kZXZpY2V0cmVlKHZvaWQpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmIC8qIF9TUEFSQzY0X1BST01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC9zYnVzLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NidXMuaAppbmRleCA0ODI3OWUxLi41NmVlOTg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3NidXMuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3NidXMuaApAQCAtMTEsNiArMTEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogCiAjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lvbW11Lmg+CiAjaW5jbHVkZSA8YXNtL3NjYXR0ZXJsaXN0Lmg+CiAKQEAgLTQyLDE4ICs0NCwxOSBAQAogCiAvKiBMaW51eCBTQlVTIGRldmljZSB0YWJsZXMgKi8KIHN0cnVjdCBzYnVzX2RldiB7Ci0Jc3RydWN0IHNidXNfYnVzICpidXM7CS8qIE91ciB0b3BsZXZlbCBwYXJlbnQgU0JVUwkqLwotCXN0cnVjdCBzYnVzX2RldiAqbmV4dDsJLyogQ2hhaW4gb2Ygc2libGluZ3MJCSovCi0Jc3RydWN0IHNidXNfZGV2ICpjaGlsZDsJLyogQ2hhaW4gb2YgY2hpbGRyZW4JCSovCi0Jc3RydWN0IHNidXNfZGV2ICpwYXJlbnQ7LyogUGFyZW50IGRldmljZSBpZiBub3QgdG9wbGV2ZWwqLwotCWludCBwcm9tX25vZGU7CQkvKiBPQlAgbm9kZSBvZiB0aGlzIGRldmljZQkqLwotCWNoYXIgcHJvbV9uYW1lWzY0XTsJLyogT0JQIGRldmljZSBuYW1lIHByb3BlcnR5CSovCi0JaW50IHNsb3Q7CQkvKiBTQlVTIHNsb3QgbnVtYmVyCQkqLworCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7CisJc3RydWN0IHNidXNfYnVzCQkqYnVzOworCXN0cnVjdCBzYnVzX2RldgkJKm5leHQ7CisJc3RydWN0IHNidXNfZGV2CQkqY2hpbGQ7CisJc3RydWN0IHNidXNfZGV2CQkqcGFyZW50OworCWludCBwcm9tX25vZGU7CQorCWNoYXIgcHJvbV9uYW1lWzY0XTsKKwlpbnQgc2xvdDsKIAogCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZVtQUk9NUkVHX01BWF07CiAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnX2FkZHJzW1BST01SRUdfTUFYXTsKLQlpbnQgbnVtX3JlZ2lzdGVycywgcmFuZ2VzX2FwcGxpZWQ7CisJaW50IG51bV9yZWdpc3RlcnM7CiAKIAlzdHJ1Y3QgbGludXhfcHJvbV9yYW5nZXMgZGV2aWNlX3Jhbmdlc1tQUk9NUkVHX01BWF07CiAJaW50IG51bV9kZXZpY2VfcmFuZ2VzOwpAQCAtNjEsOSArNjQsMTEgQEAKIAl1bnNpZ25lZCBpbnQgaXJxc1s0XTsKIAlpbnQgbnVtX2lycXM7CiB9OworI2RlZmluZSB0b19zYnVzX2RldmljZShkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IHNidXNfZGV2LCBvZmRldi5kZXYpCiAKIC8qIFRoaXMgc3RydWN0IGRlc2NyaWJlcyB0aGUgU0J1cyhzKSBmb3VuZCBvbiB0aGlzIG1hY2hpbmUuICovCiBzdHJ1Y3Qgc2J1c19idXMgeworCXN0cnVjdCBvZl9kZXZpY2UJb2ZkZXY7CiAJdm9pZAkJCSppb21tdTsJCS8qIE9wYXF1ZSBJT01NVSBjb29raWUJKi8KIAlzdHJ1Y3Qgc2J1c19kZXYJCSpkZXZpY2VzOwkvKiBUcmVlIG9mIFNCVVMgZGV2aWNlcwkqLwogCXN0cnVjdCBzYnVzX2J1cwkJKm5leHQ7CQkvKiBOZXh0IFNCVVMgaW4gc3lzdGVtCSovCkBAIC03Nyw2ICs4Miw3IEBACiAJaW50IHBvcnRpZDsKIAl2b2lkICpzdGFyZmlyZV9jb29raWU7CiB9OworI2RlZmluZSB0b19zYnVzKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc2J1c19idXMsIG9mZGV2LmRldikKIAogZXh0ZXJuIHN0cnVjdCBzYnVzX2J1cyAqc2J1c19yb290OwogCkBAIC05NSw2ICsxMDEsNyBAQAogI2RlZmluZSBzYnVzX2Nhbl9kbWFfNjRiaXQoc2RldikJKDEpCiAjZGVmaW5lIHNidXNfY2FuX2J1cnN0NjQoc2RldikJCSgxKQogZXh0ZXJuIHZvaWQgc2J1c19zZXRfc2J1czY0KHN0cnVjdCBzYnVzX2RldiAqLCBpbnQpOworZXh0ZXJuIHZvaWQgc2J1c19maWxsX2RldmljZV9pcnEoc3RydWN0IHNidXNfZGV2ICopOwogCiAvKiBUaGVzZSB5aWVsZCBJT01NVSBtYXBwaW5ncyBpbiBjb25zaXN0ZW50IG1vZGUuICovCiBleHRlcm4gdm9pZCAqc2J1c19hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBzYnVzX2RldiAqLCBzaXplX3QsIGRtYV9hZGRyX3QgKmRtYV9hZGRycCk7CkBAIC0xMTksNCArMTI2LDEwIEBACiAjZGVmaW5lIHNidXNfZG1hX3N5bmNfc2cgc2J1c19kbWFfc3luY19zZ19mb3JfY3B1CiBleHRlcm4gdm9pZCBzYnVzX2RtYV9zeW5jX3NnX2Zvcl9kZXZpY2Uoc3RydWN0IHNidXNfZGV2ICosIHN0cnVjdCBzY2F0dGVybGlzdCAqLCBpbnQsIGludCk7CiAKK2V4dGVybiB2b2lkIHNidXNfYXJjaF9idXNfcmFuZ2VzX2luaXQoc3RydWN0IGRldmljZV9ub2RlICosIHN0cnVjdCBzYnVzX2J1cyAqKTsKK2V4dGVybiB2b2lkIHNidXNfc2V0dXBfaW9tbXUoc3RydWN0IHNidXNfYnVzICosIHN0cnVjdCBkZXZpY2Vfbm9kZSAqKTsKK2V4dGVybiB2b2lkIHNidXNfc2V0dXBfYXJjaF9wcm9wcyhzdHJ1Y3Qgc2J1c19idXMgKiwgc3RydWN0IGRldmljZV9ub2RlICopOworZXh0ZXJuIGludCBzYnVzX2FyY2hfcHJlaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHNidXNfYXJjaF9wb3N0aW5pdCh2b2lkKTsKKwogI2VuZGlmIC8qICEoX1NQQVJDNjRfU0JVU19IKSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc3BhcmM2NC92ZGV2LmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3ZkZXYuaAppbmRleCA5OTZlNmJlLi4yNTYzN2M1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zcGFyYzY0L3ZkZXYuaAorKysgYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3ZkZXYuaApAQCAtNywxMCArNywxMSBAQAogI2RlZmluZSBfU1BBUkM2NF9WREVWX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogZXh0ZXJuIHUzMiBzdW40dl92ZGV2X2RldmhhbmRsZTsKLWV4dGVybiBpbnQgc3VuNHZfdmRldl9yb290OworZXh0ZXJuIHN0cnVjdCBkZXZpY2Vfbm9kZSAqc3VuNHZfdmRldl9yb290OwogCi1leHRlcm4gdW5zaWduZWQgaW50IHN1bjR2X3ZkZXZfZGV2aWNlX2ludGVycnVwdCh1bnNpZ25lZCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBzdW40dl92ZGV2X2RldmljZV9pbnRlcnJ1cHQoc3RydWN0IGRldmljZV9ub2RlICpkZXZfbm9kZSk7CiAKICNlbmRpZiAvKiAhKF9TUEFSQzY0X1ZERVZfSCkgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdmdhLmggYi9pbmNsdWRlL2FzbS1zcGFyYzY0L3ZnYS5oCmluZGV4IDljNTdlYjMuLmM2OWQ1YjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNwYXJjNjQvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20tc3BhcmM2NC92Z2EuaApAQCAtMjgsNiArMjgsNiBAQAogCXJldHVybiAqYWRkcjsKIH0KIAotI2RlZmluZSBWR0FfTUFQX01FTSh4KSAoeCkKKyNkZWZpbmUgVkdBX01BUF9NRU0oeCxzKSAoeCkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS12ODUwL2lycS5oIGIvaW5jbHVkZS9hc20tdjg1MC9pcnEuaAppbmRleCA0NDQzMTE1Li4xYmYwOTZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS12ODUwL2lycS5oCisrKyBiL2luY2x1ZGUvYXNtLXY4NTAvaXJxLmgKQEAgLTYyLDggKzYyLDYgQEAKIC8qIERpc2FibGUgYW4gaXJxIHdpdGhvdXQgd2FpdGluZy4gKi8KIGV4dGVybiB2b2lkIGRpc2FibGVfaXJxX25vc3luYyAodW5zaWduZWQgaW50IGlycSk7CiAKLWV4dGVybiBpbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICosIHN0cnVjdCBpcnFhY3Rpb24gKik7Ci0KICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNlbmRpZiAvKiBfX1Y4NTBfSVJRX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9hY3BpLmgKaW5kZXggYWExYzdiMi4uMmM5NWEzMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvYWNwaS5oCkBAIC0xNjIsNiArMTYyLDggQEAKIAogZXh0ZXJuIHU4IHg4Nl9hY3BpaWRfdG9fYXBpY2lkW107CiAKKyNkZWZpbmUgQVJDSF9IQVNfUE9XRVJfSU5JVCAxCisKIGV4dGVybiBpbnQgYWNwaV9za2lwX3RpbWVyX292ZXJyaWRlOwogCiAjZW5kaWYgLypfX0tFUk5FTF9fKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvYXBpY2RlZi5oCmluZGV4IDVhNDhlOWIuLjFkZDQwMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9hcGljZGVmLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L2FwaWNkZWYuaApAQCAtMTM3LDggKzEzNyw2IEBACiAgKi8KICNkZWZpbmUgdTMyIHVuc2lnbmVkIGludAogCi0jZGVmaW5lIGxhcGljICgodm9sYXRpbGUgc3RydWN0IGxvY2FsX2FwaWMgKilBUElDX0JBU0UpCi0KIHN0cnVjdCBsb2NhbF9hcGljIHsKIAogLyowMDAqLwlzdHJ1Y3QgeyB1MzIgX19yZXNlcnZlZFs0XTsgfSBfX3Jlc2VydmVkXzAxOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L2Zsb3BweS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2Zsb3BweS5oCmluZGV4IDUyODI1Y2UuLjAwNjI5MWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9mbG9wcHkuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvZmxvcHB5LmgKQEAgLTE0NywxMCArMTQ3LDggQEAKIAkJcmV0dXJuIHJlcXVlc3RfaXJxKEZMT1BQWV9JUlEsIGZsb3BweV9oYXJkaW50LFNBX0lOVEVSUlVQVCwKIAkJCQkJCSAgICJmbG9wcHkiLCBOVUxMKTsKIAllbHNlCi0JCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LAotCQkJCQkJICAgU0FfSU5URVJSVVBUfFNBX1NBTVBMRV9SQU5ET00sCi0JCQkJCQkgICAiZmxvcHB5IiwgTlVMTCk7CQotCisJCXJldHVybiByZXF1ZXN0X2lycShGTE9QUFlfSVJRLCBmbG9wcHlfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQkJICAgImZsb3BweSIsIE5VTEwpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkbWFfbWVtX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXpvbmUuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC9tbXpvbmUuaAppbmRleCA3MGJiOTk2Li5jMzhlYmRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbW16b25lLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L21tem9uZS5oCkBAIC00Miw3ICs0Miw2IEBACiAKICNpZmRlZiBDT05GSUdfRElTQ09OVElHTUVNCiAjZGVmaW5lIHBmbl90b19uaWQocGZuKSBwaHlzX3RvX25pZCgodW5zaWduZWQgbG9uZykocGZuKSA8PCBQQUdFX1NISUZUKQotI2RlZmluZSBrdmFkZHJfdG9fbmlkKGthZGRyKQlwaHlzX3RvX25pZChfX3BhKGthZGRyKSkKIAogZXh0ZXJuIGludCBwZm5fdmFsaWQodW5zaWduZWQgbG9uZyBwZm4pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbXNpLmggYi9pbmNsdWRlL2FzbS14ODZfNjQvbXNpLmgKaW5kZXggMzU2ZTBlOC4uM2FkMjM0NjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9tc2kuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvbXNpLmgKQEAgLTEwLDcgKzEwLDE1IEBACiAjaW5jbHVkZSA8YXNtL21hY2hfYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAotI2RlZmluZSBMQVNUX0RFVklDRV9WRUNUT1IJCTIzMgorI2RlZmluZSBMQVNUX0RFVklDRV9WRUNUT1IJKEZJUlNUX1NZU1RFTV9WRUNUT1IgLSAxKQogI2RlZmluZSBNU0lfVEFSR0VUX0NQVV9TSElGVAkxMgogCitleHRlcm4gc3RydWN0IG1zaV9vcHMgbXNpX2FwaWNfb3BzOworCitzdGF0aWMgaW5saW5lIGludCBtc2lfYXJjaF9pbml0KHZvaWQpCit7CisJbXNpX3JlZ2lzdGVyKCZtc2lfYXBpY19vcHMpOworCXJldHVybiAwOworfQorCiAjZW5kaWYgLyogQVNNX01TSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvbnVtYS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L251bWEuaAppbmRleCAxY2M5MmZlLi45MzNmZjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvbnVtYS5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9udW1hLmgKQEAgLTgsNyArOCw2IEBACiB9OwogCiBleHRlcm4gaW50IGNvbXB1dGVfaGFzaF9zaGlmdChzdHJ1Y3QgYm9vdG5vZGUgKm5vZGVzLCBpbnQgbnVtbm9kZXMpOwotZXh0ZXJuIGludCBweG1fdG9fbm9kZShpbnQgbmlkKTsKIAogI2RlZmluZSBaT05FX0FMSUdOICgxVUwgPDwgKE1BWF9PUkRFUitQQUdFX1NISUZUKSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teDg2XzY0L3BlcmNwdS5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3BlcmNwdS5oCmluZGV4IDdmMzNhYWYuLjU0OWViOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wZXJjcHUuaAorKysgYi9pbmNsdWRlL2FzbS14ODZfNjQvcGVyY3B1LmgKQEAgLTIxLDYgKzIxLDcgQEAKIC8qIHZhciBpcyBpbiBkaXNjYXJkZWQgcmVnaW9uOiBvZmZzZXQgdG8gcGFydGljdWxhciBjb3B5IHdlIHdhbnQgKi8KICNkZWZpbmUgcGVyX2NwdSh2YXIsIGNwdSkgKCpSRUxPQ19ISURFKCZwZXJfY3B1X18jI3ZhciwgX19wZXJfY3B1X29mZnNldChjcHUpKSkKICNkZWZpbmUgX19nZXRfY3B1X3Zhcih2YXIpICgqUkVMT0NfSElERSgmcGVyX2NwdV9fIyN2YXIsIF9fbXlfY3B1X29mZnNldCgpKSkKKyNkZWZpbmUgX19yYXdfZ2V0X2NwdV92YXIodmFyKSAoKlJFTE9DX0hJREUoJnBlcl9jcHVfXyMjdmFyLCBfX215X2NwdV9vZmZzZXQoKSkpCiAKIC8qIEEgbWFjcm8gdG8gYXZvaWQgI2luY2x1ZGUgaGVsbC4uLiAqLwogI2RlZmluZSBwZXJjcHVfbW9kY29weShwY3B1ZHN0LCBzcmMsIHNpemUpCQkJXApAQCAtNDAsNiArNDEsNyBAQAogCiAjZGVmaW5lIHBlcl9jcHUodmFyLCBjcHUpCQkJKCooKHZvaWQpKGNwdSksICZwZXJfY3B1X18jI3ZhcikpCiAjZGVmaW5lIF9fZ2V0X2NwdV92YXIodmFyKQkJCXBlcl9jcHVfXyMjdmFyCisjZGVmaW5lIF9fcmF3X2dldF9jcHVfdmFyKHZhcikJCQlwZXJfY3B1X18jI3ZhcgogCiAjZW5kaWYJLyogU01QICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC91bmlzdGQuaAppbmRleCAwYWZmMjJiLi45NDM4N2M5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3VuaXN0ZC5oCkBAIC02MTcsMTAgKzYxNywxMiBAQAogX19TWVNDQUxMKF9fTlJfc3luY19maWxlX3JhbmdlLCBzeXNfc3luY19maWxlX3JhbmdlKQogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkyNzgKIF9fU1lTQ0FMTChfX05SX3Ztc3BsaWNlLCBzeXNfdm1zcGxpY2UpCisjZGVmaW5lIF9fTlJfbW92ZV9wYWdlcwkJMjc5CitfX1NZU0NBTEwoX19OUl9tb3ZlX3BhZ2VzLCBzeXNfbW92ZV9wYWdlcykKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotI2RlZmluZSBfX05SX3N5c2NhbGxfbWF4IF9fTlJfdm1zcGxpY2UKKyNkZWZpbmUgX19OUl9zeXNjYWxsX21heCBfX05SX21vdmVfcGFnZXMKIAogI2lmbmRlZiBfX05PX1NUVUJTCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC92Z2EuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC92Z2EuaAppbmRleCBlZjBjMGU1Li4wZWNmNjhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvdmdhLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3ZnYS5oCkBAIC0xMiw3ICsxMiw3IEBACiAgKglhY2Nlc3MgdGhlIHZpZGVvcmFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IGJsYWNrIG1hZ2ljLgogICovCiAKLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCiAKICNkZWZpbmUgdmdhX3JlYWRiKHgpICgqKHgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkgKCooeSkgPSAoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14dGVuc2EvY2hlY2tzdW0uaCBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCmluZGV4IGJkYzAwYWUuLjAzMTE0ZjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCisrKyBiL2luY2x1ZGUvYXNtLXh0ZW5zYS9jaGVja3N1bS5oCkBAIC00Myw4ICs0Myw3IEBACiAgKglOb3RlOiB3aGVuIHlvdSBnZXQgYSBOVUxMIHBvaW50ZXIgZXhjZXB0aW9uIGhlcmUgdGhpcyBtZWFucyBzb21lb25lCiAgKglwYXNzZWQgaW4gYW4gaW5jb3JyZWN0IGtlcm5lbCBhZGRyZXNzIHRvIG9uZSBvZiB0aGVzZSBmdW5jdGlvbnMuCiAgKgotICoJSWYgeW91IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkgcGxlYXNlIGRvbid0IGZvcmdldCB0aGUKLSAqCXZlcmlmeV9hcmVhKCkuCisgKglJZiB5b3UgdXNlIHRoZXNlIGZ1bmN0aW9ucyBkaXJlY3RseSBwbGVhc2UgZG9uJ3QgZm9yZ2V0IHRoZSBhY2Nlc3Nfb2soKS4KICAqLwogc3RhdGljIGlubGluZQogdW5zaWduZWQgaW50IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sgKCBjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS9yd3NlbS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3J3c2VtLmgKaW5kZXggM2MwMmIwZS4uYWJjZDg2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teHRlbnNhL3J3c2VtLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3J3c2VtLmgKQEAgLTE3Miw0ICsxNzIsOSBAQAogCXJldHVybiBhdG9taWNfYWRkX3JldHVybihkZWx0YSwgKGF0b21pY190ICopKCZzZW0tPmNvdW50KSk7CiB9CiAKLSNlbmRpZgkvKiBfWFRFTlNBX1JXU0VNX1hBRERfSCAqLworc3RhdGljIGlubGluZSBpbnQgcndzZW1faXNfbG9ja2VkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlyZXR1cm4gKHNlbS0+Y291bnQgIT0gMCk7Cit9CisKKyNlbmRpZgkvKiBfWFRFTlNBX1JXU0VNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmggYi9pbmNsdWRlL2FzbS14dGVuc2EvdWFjY2Vzcy5oCmluZGV4IDA2YTIyYjguLjg4YTY0ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS91YWNjZXNzLmgKKysrIGIvaW5jbHVkZS9hc20teHRlbnNhL3VhY2Nlc3MuaApAQCAtMTU0LDM1ICsxNTQsNiBAQAogLkxhY2Nlc3Nfb2tfXEA6CiAJLmVuZG0KIAotLyoKLSAqIHZlcmlmeV9hcmVhIGRldGVybWluZXMgd2hldGhlciBhIG1lbW9yeSBhY2Nlc3MgaXMgYWxsb3dlZC4gIEl0J3MKLSAqIG1vc3RseSBhbiB1bm5lY2Vzc2FyeSB3cmFwcGVyIGZvciBhY2Nlc3Nfb2ssIGJ1dCB3ZSBwcm92aWRlIGl0IGFzIGEKLSAqIGR1cGxpY2F0ZSBvZiB0aGUgdmVyaWZ5X2FyZWEoKSBDIGlubGluZSBmdW5jdGlvbiBiZWxvdy4gIFNlZSB0aGUKLSAqIGVxdWl2YWxlbnQgQyB2ZXJzaW9uIGJlbG93IGZvciBjbGFyaXR5LgotICoKLSAqIE9uIGVycm9yLCB2ZXJpZnlfYXJlYSBicmFuY2hlcyB0byBhIGxhYmVsIGluZGljYXRlZCBieSBwYXJhbWV0ZXIKLSAqIDxlcnJvcj4uICBUaGlzIGltcGxpZXMgdGhhdCB0aGUgbWFjcm8gZmFsbHMgdGhyb3VnaCB0byB0aGUgbmV4dAotICogaW5zdHJ1Y3Rpb24gb24gc3VjY2Vzcy4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgYXNzdW1lIHN1Y2Nlc3MgaXMgdGhlIGNvbW1vbiBjYXNlLCBhbmQgd2Ugb3B0aW1pemUgdGhlCi0gKiBicmFuY2ggZmFsbC10aHJvdWdoIGNhc2Ugb24gc3VjY2Vzcy4KLSAqCi0gKiBPbiBFbnRyeToKLSAqIAk8YWE+CXJlZ2lzdGVyIGNvbnRhaW5pbmcgbWVtb3J5IGFkZHJlc3MKLSAqIAk8YXM+CXJlZ2lzdGVyIGNvbnRhaW5pbmcgbWVtb3J5IHNpemUKLSAqIAk8YXQ+CXRlbXAgcmVnaXN0ZXIKLSAqIAk8ZXJyb3I+CWxhYmVsIHRvIGJyYW5jaCB0byBvbiBlcnJvcjsgaW1wbGllcyBmYWxsLXRocm91Z2gKLSAqIAkJbWFjcm8gb24gc3VjY2VzcwotICogT24gRXhpdDoKLSAqIAk8YWE+CXByZXNlcnZlZAotICogCTxhcz4JcHJlc2VydmVkCi0gKiAJPGF0PglkZXN0cm95ZWQKLSAqLwotCS5tYWNybwl2ZXJpZnlfYXJlYQlhYSwgYXMsIGF0LCBzcCwgZXJyb3IKLQlhY2Nlc3Nfb2sgIFxhdCwgXGFhLCBcYXMsIFxzcCwgXGVycm9yCi0JLmVuZG0KLQotCiAjZWxzZSAvKiBfX0FTU0VNQkxZX18gbm90IGRlZmluZWQgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CkBAIC0yMTEsMTEgKzE4Miw2IEBACiAjZGVmaW5lIF9fYWNjZXNzX29rKGFkZHIsc2l6ZSkgKF9fa2VybmVsX29rIHx8IF9fdXNlcl9vaygoYWRkciksKHNpemUpKSkKICNkZWZpbmUgYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSBfX2FjY2Vzc19vaygodW5zaWduZWQgbG9uZykoYWRkciksKHNpemUpKQogCi1zdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfYXJlYShpbnQgdHlwZSwgY29uc3Qgdm9pZCAqIGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlyZXR1cm4gYWNjZXNzX29rKHR5cGUsYWRkcixzaXplKSA/IDAgOiAtRUZBVUxUOwotfQotCiAvKgogICogVGhlc2UgYXJlIHRoZSBtYWluIHNpbmdsZS12YWx1ZSB0cmFuc2ZlciByb3V0aW5lcy4gIFRoZXkKICAqIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSByaWdodCBzaXplIGlmIHdlIGp1c3QgaGF2ZSB0aGUgcmlnaHQgcG9pbnRlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20teHRlbnNhL3ZnYS5oIGIvaW5jbHVkZS9hc20teHRlbnNhL3ZnYS5oCmluZGV4IDIzZDgyZjYuLjFmZDhjYWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXh0ZW5zYS92Z2EuaAorKysgYi9pbmNsdWRlL2FzbS14dGVuc2EvdmdhLmgKQEAgLTExLDcgKzExLDcgQEAKICNpZm5kZWYgX1hURU5TQV9WR0FfSAogI2RlZmluZSBfWFRFTlNBX1ZHQV9ICiAKLSNkZWZpbmUgVkdBX01BUF9NRU0oeCkgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCisjZGVmaW5lIFZHQV9NQVBfTUVNKHgscykgKHVuc2lnbmVkIGxvbmcpcGh5c190b192aXJ0KHgpCiAKICNkZWZpbmUgdmdhX3JlYWRiKHgpCSgqKHgpKQogI2RlZmluZSB2Z2Ffd3JpdGViKHgseSkJKCooeSkgPSAoeCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjY3QuaCBiL2luY2x1ZGUvbGludXgvYWNjdC5oCmluZGV4IDNkNTRmYmMuLmU4NmJhZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNjdC5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNjdC5oCkBAIC0xMjEsMTMgKzEyMSwxNyBAQAogc3RydWN0IHN1cGVyX2Jsb2NrOwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlX21udChzdHJ1Y3QgdmZzbW91bnQgKm0pOwogZXh0ZXJuIHZvaWQgYWNjdF9hdXRvX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwotZXh0ZXJuIHZvaWQgYWNjdF9wcm9jZXNzKGxvbmcgZXhpdGNvZGUpOworZXh0ZXJuIHZvaWQgYWNjdF9pbml0X3BhY2N0KHN0cnVjdCBwYWNjdF9zdHJ1Y3QgKnBhY2N0KTsKK2V4dGVybiB2b2lkIGFjY3RfY29sbGVjdChsb25nIGV4aXRjb2RlLCBpbnQgZ3JvdXBfZGVhZCk7CitleHRlcm4gdm9pZCBhY2N0X3Byb2Nlc3Modm9pZCk7CiBleHRlcm4gdm9pZCBhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogZXh0ZXJuIHZvaWQgYWNjdF9jbGVhcl9pbnRlZ3JhbHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogI2Vsc2UKICNkZWZpbmUgYWNjdF9hdXRvX2Nsb3NlX21udCh4KQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGFjY3RfYXV0b19jbG9zZSh4KQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGFjY3RfcHJvY2Vzcyh4KQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBhY2N0X2luaXRfcGFjY3QoeCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBhY2N0X2NvbGxlY3QoeCx5KQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGFjY3RfcHJvY2VzcygpCQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGFjY3RfdXBkYXRlX2ludGVncmFscyh4KQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBhY2N0X2NsZWFyX2ludGVncmFscyh0YXNrKQlkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWNwaS5oIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKaW5kZXggMWNmMGI5MS4uOTBkNmRmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpLmgKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGkuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfbnVtYS5oPgogI2luY2x1ZGUgPGFzbS9hY3BpLmg+CiAKIApAQCAtNDA3LDEwICs0MDgsMTggQEAKIHZvaWQgYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5IChhY3BpX3RhYmxlX2VudHJ5X2hlYWRlciAqc3JhdCk7CiAKIC8qIHRoZSBmb2xsb3dpbmcgZm91ciBmdW5jdGlvbnMgYXJlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgKi8KKyNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX1BBUlNFX1NSQVQKKyNkZWZpbmUgTlJfTk9ERV9NRU1CTEtTIE1BWF9OVU1OT0RFUworI2RlZmluZSBhY3BpX251bWFfc2xpdF9pbml0KHNsaXQpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBhY3BpX251bWFfcHJvY2Vzc29yX2FmZmluaXR5X2luaXQocGEpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBhY3BpX251bWFfbWVtb3J5X2FmZmluaXR5X2luaXQobWEpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBhY3BpX251bWFfYXJjaF9maXh1cCgpIGRvIHt9IHdoaWxlICgwKQorI2Vsc2UKIHZvaWQgYWNwaV9udW1hX3NsaXRfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfc2xpdCAqc2xpdCk7CiB2b2lkIGFjcGlfbnVtYV9wcm9jZXNzb3JfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfcHJvY2Vzc29yX2FmZmluaXR5ICpwYSk7CiB2b2lkIGFjcGlfbnVtYV9tZW1vcnlfYWZmaW5pdHlfaW5pdCAoc3RydWN0IGFjcGlfdGFibGVfbWVtb3J5X2FmZmluaXR5ICptYSk7CiB2b2lkIGFjcGlfbnVtYV9hcmNoX2ZpeHVwKHZvaWQpOworI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQUNQSV9IT1RQTFVHX0NQVQogLyogQXJjaCBkZXBlbmRlbnQgZnVuY3Rpb25zIGZvciBjcHUgaG90cGx1ZyBzdXBwb3J0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0YS5oIGIvaW5jbHVkZS9saW51eC9hdGEuaAppbmRleCAzMTJhMmMwLi4zNjcxYWY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRhLmgKQEAgLTk3LDYgKzk3LDkgQEAKIAlBVEFfRFJRCQkJPSAoMSA8PCAzKSwJLyogZGF0YSByZXF1ZXN0IGkvbyAqLwogCUFUQV9FUlIJCQk9ICgxIDw8IDApLAkvKiBoYXZlIGFuIGVycm9yICovCiAJQVRBX1NSU1QJCT0gKDEgPDwgMiksCS8qIHNvZnR3YXJlIHJlc2V0ICovCisJQVRBX0lDUkMJCT0gKDEgPDwgNyksCS8qIGludGVyZmFjZSBDUkMgZXJyb3IgKi8KKwlBVEFfVU5DCQkJPSAoMSA8PCA2KSwJLyogdW5jb3JyZWN0YWJsZSBtZWRpYSBlcnJvciAqLworCUFUQV9JRE5GCQk9ICgxIDw8IDQpLAkvKiBJRCBub3QgZm91bmQgKi8KIAlBVEFfQUJPUlRFRAkJPSAoMSA8PCAyKSwJLyogY29tbWFuZCBhYm9ydGVkICovCiAKIAkvKiBBVEEgY29tbWFuZCBibG9jayByZWdpc3RlcnMgKi8KQEAgLTEzMCw2ICsxMzMsOCBAQAogCUFUQV9DTURfV1JJVEUJCT0gMHhDQSwKIAlBVEFfQ01EX1dSSVRFX0VYVAk9IDB4MzUsCiAJQVRBX0NNRF9XUklURV9GVUFfRVhUCT0gMHgzRCwKKwlBVEFfQ01EX0ZQRE1BX1JFQUQJPSAweDYwLAorCUFUQV9DTURfRlBETUFfV1JJVEUJPSAweDYxLAogCUFUQV9DTURfUElPX1JFQUQJPSAweDIwLAogCUFUQV9DTURfUElPX1JFQURfRVhUCT0gMHgyNCwKIAlBVEFfQ01EX1BJT19XUklURQk9IDB4MzAsCkBAIC0xNDgsNiArMTUzLDEwIEBACiAJQVRBX0NNRF9JTklUX0RFVl9QQVJBTVMJPSAweDkxLAogCUFUQV9DTURfUkVBRF9OQVRJVkVfTUFYCT0gMHhGOCwKIAlBVEFfQ01EX1JFQURfTkFUSVZFX01BWF9FWFQgPSAweDI3LAorCUFUQV9DTURfUkVBRF9MT0dfRVhUCT0gMHgyZiwKKworCS8qIFJFQURfTE9HX0VYVCBwYWdlcyAqLworCUFUQV9MT0dfU0FUQV9OQ1EJPSAweDEwLAogCiAJLyogU0VURkVBVFVSRVMgc3R1ZmYgKi8KIAlTRVRGRUFUVVJFU19YRkVSCT0gMHgwMywKQEAgLTE3Miw2ICsxODEsOSBAQAogCVhGRVJfUElPXzAJCT0gMHgwOCwKIAlYRkVSX1BJT19TTE9XCQk9IDB4MDAsCiAKKwlTRVRGRUFUVVJFU19XQ19PTgk9IDB4MDIsIC8qIEVuYWJsZSB3cml0ZSBjYWNoZSAqLworCVNFVEZFQVRVUkVTX1dDX09GRgk9IDB4ODIsIC8qIERpc2FibGUgd3JpdGUgY2FjaGUgKi8KKwogCS8qIEFUQVBJIHN0dWZmICovCiAJQVRBUElfUEtUX0RNQQkJPSAoMSA8PCAwKSwKIAlBVEFQSV9ETUFESVIJCT0gKDEgPDwgMiksCS8qIEFUQVBJIGRhdGEgZGlyOgpAQCAtMTkyLDYgKzIwNCwxNiBAQAogCVNDUl9BQ1RJVkUJCT0gMywKIAlTQ1JfTk9USUZJQ0FUSU9OCT0gNCwKIAorCS8qIFNFcnJvciBiaXRzICovCisJU0VSUl9EQVRBX1JFQ09WRVJFRAk9ICgxIDw8IDApLCAvKiByZWNvdmVyZWQgZGF0YSBlcnJvciAqLworCVNFUlJfQ09NTV9SRUNPVkVSRUQJPSAoMSA8PCAxKSwgLyogcmVjb3ZlcmVkIGNvbW0gZmFpbHVyZSAqLworCVNFUlJfREFUQQkJPSAoMSA8PCA4KSwgLyogdW5yZWNvdmVyZWQgZGF0YSBlcnJvciAqLworCVNFUlJfUEVSU0lTVEVOVAkJPSAoMSA8PCA5KSwgLyogcGVyc2lzdGVudCBkYXRhL2NvbW0gZXJyb3IgKi8KKwlTRVJSX1BST1RPQ09MCQk9ICgxIDw8IDEwKSwgLyogcHJvdG9jb2wgdmlvbGF0aW9uICovCisJU0VSUl9JTlRFUk5BTAkJPSAoMSA8PCAxMSksIC8qIGhvc3QgaW50ZXJuYWwgZXJyb3IgKi8KKwlTRVJSX1BIWVJEWV9DSEcJCT0gKDEgPDwgMTYpLCAvKiBQSFkgUkRZIGNoYW5nZWQgKi8KKwlTRVJSX0RFVl9YQ0hHCQk9ICgxIDw8IDI2KSwgLyogZGV2aWNlIGV4Y2hhbmdlZCAqLworCiAJLyogc3RydWN0IGF0YV90YXNrZmlsZSBmbGFncyAqLwogCUFUQV9URkxBR19MQkE0OAkJPSAoMSA8PCAwKSwgLyogZW5hYmxlIDQ4LWJpdCBMQkEgYW5kICJIT0IiICovCiAJQVRBX1RGTEFHX0lTQUREUgk9ICgxIDw8IDEpLCAvKiBlbmFibGUgci93IHRvIG5zZWN0L2xiYSByZWdzICovCkBAIC0xOTksNiArMjIxLDcgQEAKIAlBVEFfVEZMQUdfV1JJVEUJCT0gKDEgPDwgMyksIC8qIGRhdGEgZGlyOiBob3N0LT5kZXY9PTEgKHdyaXRlKSAqLwogCUFUQV9URkxBR19MQkEJCT0gKDEgPDwgNCksIC8qIGVuYWJsZSBMQkEgKi8KIAlBVEFfVEZMQUdfRlVBCQk9ICgxIDw8IDUpLCAvKiBlbmFibGUgRlVBICovCisJQVRBX1RGTEFHX1BPTExJTkcJPSAoMSA8PCA2KSwgLyogc2V0IG5JRU4gdG8gMSBhbmQgdXNlIHBvbGxpbmcgKi8KIH07CiAKIGVudW0gYXRhX3RmX3Byb3RvY29scyB7CkBAIC0yMDcsNiArMjMwLDcgQEAKIAlBVEFfUFJPVF9OT0RBVEEsCS8qIG5vIGRhdGEgKi8KIAlBVEFfUFJPVF9QSU8sCQkvKiBQSU8gc2luZ2xlIHNlY3RvciAqLwogCUFUQV9QUk9UX0RNQSwJCS8qIERNQSAqLworCUFUQV9QUk9UX05DUSwJCS8qIE5DUSAqLwogCUFUQV9QUk9UX0FUQVBJLAkJLyogcGFja2V0IGNvbW1hbmQsIFBJTyBkYXRhIHhmZXIqLwogCUFUQV9QUk9UX0FUQVBJX05PREFUQSwJLyogcGFja2V0IGNvbW1hbmQsIG5vIGRhdGEgKi8KIAlBVEFfUFJPVF9BVEFQSV9ETUEsCS8qIHBhY2tldCBjb21tYW5kIHdpdGggc3BlY2lhbCBETUEgc2F1Y2UgKi8KQEAgLTI2Miw2ICsyODYsOCBAQAogI2RlZmluZSBhdGFfaWRfaGFzX3BtKGlkKQkoKGlkKVs4Ml0gJiAoMSA8PCAzKSkKICNkZWZpbmUgYXRhX2lkX2hhc19sYmEoaWQpCSgoaWQpWzQ5XSAmICgxIDw8IDkpKQogI2RlZmluZSBhdGFfaWRfaGFzX2RtYShpZCkJKChpZClbNDldICYgKDEgPDwgOCkpCisjZGVmaW5lIGF0YV9pZF9oYXNfbmNxKGlkKQkoKGlkKVs3Nl0gJiAoMSA8PCA4KSkKKyNkZWZpbmUgYXRhX2lkX3F1ZXVlX2RlcHRoKGlkKQkoKChpZClbNzVdICYgMHgxZikgKyAxKQogI2RlZmluZSBhdGFfaWRfcmVtb3ZlYWJsZShpZCkJKChpZClbMF0gJiAoMSA8PCA3KSkKICNkZWZpbmUgYXRhX2lkX2hhc19kd29yZF9pbyhpZCkJKChpZClbNTBdICYgKDEgPDwgMCkpCiAjZGVmaW5lIGF0YV9pZF91MzIoaWQsbikJXApAQCAtMjcyLDYgKzI5OCw4IEBACiAJICAoKHU2NCkgKGlkKVsobikgKyAxXSA8PCAxNikgfAlcCiAJICAoKHU2NCkgKGlkKVsobikgKyAwXSkgKQogCisjZGVmaW5lIGF0YV9pZF9jZGJfaW50cihpZCkJKCgoaWQpWzBdICYgMHg2MCkgPT0gMHgyMCkKKwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2lkX21ham9yX3ZlcnNpb24oY29uc3QgdTE2ICppZCkKIHsKIAl1bnNpZ25lZCBpbnQgbXZlcjsKQEAgLTMxMSw2ICszMzksMTUgQEAKIAkgICAgICAgKHRmLT5wcm90b2NvbCA9PSBBVEFfUFJPVF9BVEFQSV9ETUEpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBpc19tdWx0aV90YXNrZmlsZShzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3sKKwlyZXR1cm4gKHRmLT5jb21tYW5kID09IEFUQV9DTURfUkVBRF9NVUxUSSkgfHwKKwkgICAgICAgKHRmLT5jb21tYW5kID09IEFUQV9DTURfV1JJVEVfTVVMVEkpIHx8CisJICAgICAgICh0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX1JFQURfTVVMVElfRVhUKSB8fAorCSAgICAgICAodGYtPmNvbW1hbmQgPT0gQVRBX0NNRF9XUklURV9NVUxUSV9FWFQpIHx8CisJICAgICAgICh0Zi0+Y29tbWFuZCA9PSBBVEFfQ01EX1dSSVRFX01VTFRJX0ZVQV9FWFQpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBhdGFfb2sodTggc3RhdHVzKQogewogCXJldHVybiAoKHN0YXR1cyAmIChBVEFfQlVTWSB8IEFUQV9EUkRZIHwgQVRBX0RGIHwgQVRBX0RSUSB8IEFUQV9FUlIpKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaW8uaCBiL2luY2x1ZGUvbGludXgvYmlvLmgKaW5kZXggYjYwZmZlMy4uNzZiZGFlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Jpby5oCkBAIC00Nyw3ICs0Nyw3IEBACiAjZGVmaW5lIEJJT19CVUdfT04KICNlbmRpZgogCi0jZGVmaW5lIEJJT19NQVhfUEFHRVMJCSgyNTYpCisjZGVmaW5lIEJJT19NQVhfUEFHRVMJCTI1NgogI2RlZmluZSBCSU9fTUFYX1NJWkUJCShCSU9fTUFYX1BBR0VTIDw8IFBBR0VfQ0FDSEVfU0hJRlQpCiAjZGVmaW5lIEJJT19NQVhfU0VDVE9SUwkJKEJJT19NQVhfU0laRSA+PiA5KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCAzNDU3ZTdiLi5hYWZlODI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTE1MSwxMSArMTUxLDkgQEAKIAl2b2lkICplbGV2YXRvcl9wcml2YXRlOwogCXZvaWQgKmNvbXBsZXRpb25fZGF0YTsKIAotCXVuc2lnbmVkIHNob3J0IGlvcHJpbzsKLQogCWludCBycV9zdGF0dXM7CS8qIHNob3VsZCBzcGxpdCB0aGlzIGludG8gYSBmZXcgc3RhdHVzIGJpdHMgKi8KLQlzdHJ1Y3QgZ2VuZGlzayAqcnFfZGlzazsKIAlpbnQgZXJyb3JzOworCXN0cnVjdCBnZW5kaXNrICpycV9kaXNrOwogCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKIAogCS8qIE51bWJlciBvZiBzY2F0dGVyLWdhdGhlciBETUEgYWRkcitsZW4gcGFpcnMgYWZ0ZXIKQEAgLTE3MCw4ICsxNjgsOSBAQAogCSAqLwogCXVuc2lnbmVkIHNob3J0IG5yX2h3X3NlZ21lbnRzOwogCisJdW5zaWduZWQgc2hvcnQgaW9wcmlvOworCiAJaW50IHRhZzsKLQljaGFyICpidWZmZXI7CiAKIAlpbnQgcmVmX2NvdW50OwogCXJlcXVlc3RfcXVldWVfdCAqcTsKQEAgLTE3OSw2ICsxNzgsNyBAQAogCiAJc3RydWN0IGNvbXBsZXRpb24gKndhaXRpbmc7CiAJdm9pZCAqc3BlY2lhbDsKKwljaGFyICpidWZmZXI7CiAKIAkvKgogCSAqIHdoZW4gcmVxdWVzdCBpcyB1c2VkIGFzIGEgcGFja2V0IGNvbW1hbmQgY2FycmllcgpAQCAtMTg3LDIwICsxODcsMTQgQEAKIAl1bnNpZ25lZCBjaGFyIGNtZFtCTEtfTUFYX0NEQl07CiAKIAl1bnNpZ25lZCBpbnQgZGF0YV9sZW47Ci0Jdm9pZCAqZGF0YTsKLQogCXVuc2lnbmVkIGludCBzZW5zZV9sZW47CisJdm9pZCAqZGF0YTsKIAl2b2lkICpzZW5zZTsKIAogCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCWludCByZXRyaWVzOwogCiAJLyoKLQkgKiBGb3IgUG93ZXIgTWFuYWdlbWVudCByZXF1ZXN0cwotCSAqLwotCXN0cnVjdCByZXF1ZXN0X3BtX3N0YXRlICpwbTsKLQotCS8qCiAJICogY29tcGxldGlvbiBjYWxsYmFjay4gZW5kX2lvX2RhdGEgc2hvdWxkIGJlIGZvbGRlZCBpbiB3aXRoIHdhaXRpbmcKIAkgKi8KIAlycV9lbmRfaW9fZm4gKmVuZF9pbzsKQEAgLTI0MSw2ICsyMzUsNyBAQAogCV9fUkVRX1BNX1JFU1VNRSwJLyogcmVzdW1lIHJlcXVlc3QgKi8KIAlfX1JFUV9QTV9TSFVURE9XTiwJLyogc2h1dGRvd24gcmVxdWVzdCAqLwogCV9fUkVRX09SREVSRURfQ09MT1IsCS8qIGlzIGJlZm9yZSBvciBhZnRlciBiYXJyaWVyICovCisJX19SRVFfUldfU1lOQywJCS8qIHJlcXVlc3QgaXMgc3luYyAoT19ESVJFQ1QpICovCiAJX19SRVFfTlJfQklUUywJCS8qIHN0b3BzIGhlcmUgKi8KIH07CiAKQEAgLTI3MCw2ICsyNjUsNyBAQAogI2RlZmluZSBSRVFfUE1fUkVTVU1FCSgxIDw8IF9fUkVRX1BNX1JFU1VNRSkKICNkZWZpbmUgUkVRX1BNX1NIVVRET1dOCSgxIDw8IF9fUkVRX1BNX1NIVVRET1dOKQogI2RlZmluZSBSRVFfT1JERVJFRF9DT0xPUgkoMSA8PCBfX1JFUV9PUkRFUkVEX0NPTE9SKQorI2RlZmluZSBSRVFfUldfU1lOQwkoMSA8PCBfX1JFUV9SV19TWU5DKQogCiAvKgogICogU3RhdGUgaW5mb3JtYXRpb24gY2FycmllZCBmb3IgUkVRX1BNX1NVU1BFTkQgYW5kIFJFUV9QTV9SRVNVTUUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmggYi9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCmluZGV4IGViMWE4NjcuLmE3ZThjZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKKysrIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaApAQCAtOTAsOSArOTAsOSBAQAogICogVGhlIHJlbWFwIGV2ZW50CiAgKi8KIHN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgewotCXUzMiBkZXZpY2U7CisJX19iZTMyIGRldmljZTsKIAl1MzIgX19wYWQ7Ci0JdTY0IHNlY3RvcjsKKwlfX2JlNjQgc2VjdG9yOwogfTsKIAogZW51bSB7CkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJCQkJIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IHBkdSkKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpidCA9IHEtPmJsa190cmFjZTsKLQl1NjQgcnBkdSA9IGNwdV90b19iZTY0KHBkdSk7CisJX19iZTY0IHJwZHUgPSBjcHVfdG9fYmU2NChwZHUpOwogCiAJaWYgKGxpa2VseSghYnQpKQogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jvb3RtZW0uaCBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCmluZGV4IGRhMmQxMDcuLjIyODY2ZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCkBAIC05MSw4ICs5MSw4IEBACiB9CiAjZW5kaWYKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBucl9rZXJuZWxfcGFnZXM7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5yX2FsbF9wYWdlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG5yX2tlcm5lbF9wYWdlczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG5yX2FsbF9wYWdlczsKIAogZXh0ZXJuIHZvaWQgKl9faW5pdCBhbGxvY19sYXJnZV9zeXN0ZW1faGFzaChjb25zdCBjaGFyICp0YWJsZW5hbWUsCiAJCQkJCSAgICB1bnNpZ25lZCBsb25nIGJ1Y2tldHNpemUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NuX3Byb2MuaCBiL2luY2x1ZGUvbGludXgvY25fcHJvYy5oCmluZGV4IDE0MTdkZTkuLmRiYjc3NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY25fcHJvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvY25fcHJvYy5oCkBAIC0zLDMxICszLDIyIEBACiAgKgogICogQ29weXJpZ2h0IChDKSBNYXR0IEhlbHNsZXksIElCTSBDb3JwLiAyMDA1CiAgKiBCYXNlZCBvbiBjbl9mb3JrLmggYnkgTmd1eWVuIEFuaCBRdXluaCBhbmQgR3VpbGxhdW1lIFRob3V2ZW5pbgotICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBmb2xsb3dzOgogICogQ29weXJpZ2h0IChDKSAyMDA1IE5ndXllbiBBbmggUXV5bmggPGFxdXluaEBnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUgR3VpbGxhdW1lIFRob3V2ZW5pbiA8Z3VpbGxhdW1lLnRob3V2ZW5pbkBidWxsLm5ldD4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKi8KIAogI2lmbmRlZiBDTl9QUk9DX0gKICNkZWZpbmUgQ05fUFJPQ19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9jb25uZWN0b3IuaD4KIAogLyoKICAqIFVzZXJzcGFjZSBzZW5kcyB0aGlzIGVudW0gdG8gcmVnaXN0ZXIgd2l0aCB0aGUga2VybmVsIHRoYXQgaXQgaXMgbGlzdGVuaW5nCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvZGFfbGludXguaCBiL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oCmluZGV4IGIzZWNmOGYuLjdiNWM1ZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oCisrKyBiL2luY2x1ZGUvbGludXgvY29kYV9saW51eC5oCkBAIC0zNiw3ICszNiw3IEBACiAKIC8qIG9wZXJhdGlvbnMgc2hhcmVkIG92ZXIgbW9yZSB0aGFuIG9uZSBmaWxlICovCiBpbnQgY29kYV9vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpOwotaW50IGNvZGFfZmx1c2goc3RydWN0IGZpbGUgKmYpOworaW50IGNvZGFfZmx1c2goc3RydWN0IGZpbGUgKmYsIGZsX293bmVyX3QgaWQpOwogaW50IGNvZGFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmaWxlICpmKTsKIGludCBjb2RhX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKIGludCBjb2RhX3JldmFsaWRhdGVfaW5vZGUoc3RydWN0IGRlbnRyeSAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29kYV9wc2Rldi5oIGIvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKaW5kZXggZDUzOTI2Mi4uOThmNmM1MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb2RhX3BzZGV2LmgKQEAgLTcwLDcgKzcwLDcgQEAKIAkJIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBQaW9jdGxEYXRhICpkYXRhKTsKIGludCBjb2RhX2Rvd25jYWxsKGludCBvcGNvZGUsIHVuaW9uIG91dHB1dEFyZ3MgKm91dCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBpbnQgdmVudXNfZnN5bmMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCk7Ci1pbnQgdmVudXNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpOworaW50IHZlbnVzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpzZnMpOwogCiAKIC8qIG1lc3NhZ2VzIGJldHdlZW4gY29kYSBmaWxlc3lzdGVtIGluIGtlcm5lbCBhbmQgVmVudXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmggYi9pbmNsdWRlL2xpbnV4L2Nvbm5lY3Rvci5oCmluZGV4IGFkMWEyMmMuLjRjMDIxMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29ubmVjdG9yLmgKKysrIGIvaW5jbHVkZS9saW51eC9jb25uZWN0b3IuaApAQCAtMzQsOCArMzQsMTEgQEAKICNkZWZpbmUgQ05fVkFMX1BST0MJCQkweDEKICNkZWZpbmUgQ05fSURYX0NJRlMJCQkweDIKICNkZWZpbmUgQ05fVkFMX0NJRlMgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgQ05fVzFfSURYCQkJMHgzCS8qIHcxIGNvbW11bmljYXRpb24gKi8KKyNkZWZpbmUgQ05fVzFfVkFMCQkJMHgxCiAKLSNkZWZpbmUgQ05fTkVUTElOS19VU0VSUwkJMQorCisjZGVmaW5lIENOX05FVExJTktfVVNFUlMJCTQKIAogLyoKICAqIE1heGltdW0gY29ubmVjdG9yJ3MgbWVzc2FnZSBzaXplLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb25zb2xlLmggYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAppbmRleCAwODczNGU2Li5kMGY4YTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnNvbGUuaApAQCAtODcsNiArODcsNyBAQAogI2RlZmluZSBDT05fQ09OU0RFVgkoMikgLyogTGFzdCBvbiB0aGUgY29tbWFuZCBsaW5lICovCiAjZGVmaW5lIENPTl9FTkFCTEVECSg0KQogI2RlZmluZSBDT05fQk9PVAkoOCkKKyNkZWZpbmUgQ09OX0FOWVRJTUUJKDE2KSAvKiBTYWZlIHRvIGNhbGwgd2hlbiBjcHUgaXMgb2ZmbGluZSAqLwogCiBzdHJ1Y3QgY29uc29sZQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmggYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAppbmRleCA1YWE5NTAxLi40NjZmYmU5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWZyZXEuaApAQCAtNzIsNiArNzIsOCBAQAogCiBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgewogCWNwdW1hc2tfdAkJY3B1czsJLyogYWZmZWN0ZWQgQ1BVcyAqLworCXVuc2lnbmVkIGludAkJc2hhcmVkX3R5cGU7IC8qIEFOWSBvciBBTEwgYWZmZWN0ZWQgQ1BVcworCQkJCQkJc2hvdWxkIHNldCBjcHVmcmVxICovCiAJdW5zaWduZWQgaW50CQljcHU7ICAgIC8qIGNwdSBuciBvZiByZWdpc3RlcmVkIENQVSAqLwogCXN0cnVjdCBjcHVmcmVxX2NwdWluZm8JY3B1aW5mbzsvKiBzZWUgYWJvdmUgKi8KIApAQCAtOTgsNiArMTAwLDggQEAKICNkZWZpbmUgQ1BVRlJFUV9JTkNPTVBBVElCTEUJKDEpCiAjZGVmaW5lIENQVUZSRVFfTk9USUZZCQkoMikKIAorI2RlZmluZSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FMTAkoMCkgLyogQWxsIGRlcGVuZGVudCBDUFVzIHNob3VsZCBzZXQgZnJlcSAqLworI2RlZmluZSBDUFVGUkVRX1NIQVJFRF9UWVBFX0FOWQkoMSkgLyogRnJlcSBjYW4gYmUgc2V0IGZyb20gYW55IGRlcGVuZGVudCBDUFUgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqIGNwdWZyZXEgdHJhbnNpdGlvbiBub3RpZmllcnMgKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVtYXNrLmggYi9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaAppbmRleCA5Y2JiNzgxLi5iMjY4YTNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdW1hc2suaApAQCAtMzE3LDcgKzMxNyw4IEBACiAJCShjcHUpIDwgTlJfQ1BVUzsJCVwKIAkJKGNwdSkgPSBuZXh0X2NwdSgoY3B1KSwgKG1hc2spKSkKICNlbHNlIC8qIE5SX0NQVVMgPT0gMSAqLwotI2RlZmluZSBmb3JfZWFjaF9jcHVfbWFzayhjcHUsIG1hc2spIGZvciAoKGNwdSkgPSAwOyAoY3B1KSA8IDE7IChjcHUpKyspCisjZGVmaW5lIGZvcl9lYWNoX2NwdV9tYXNrKGNwdSwgbWFzaykJCVwKKwlmb3IgKChjcHUpID0gMDsgKGNwdSkgPCAxOyAoY3B1KSsrLCAodm9pZCltYXNrKQogI2VuZGlmIC8qIE5SX0NQVVMgKi8KIAogLyoKQEAgLTQwNSw3ICs0MDYsNiBAQAogI2RlZmluZSBhbnlfb25saW5lX2NwdShtYXNrKQkJMAogI2VuZGlmCiAKLSNkZWZpbmUgZm9yX2VhY2hfY3B1KGNwdSkgIGZvcl9lYWNoX2NwdV9tYXNrKChjcHUpLCBjcHVfcG9zc2libGVfbWFwKQogI2RlZmluZSBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSAgZm9yX2VhY2hfY3B1X21hc2soKGNwdSksIGNwdV9wb3NzaWJsZV9tYXApCiAjZGVmaW5lIGZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSAgZm9yX2VhY2hfY3B1X21hc2soKGNwdSksIGNwdV9vbmxpbmVfbWFwKQogI2RlZmluZSBmb3JfZWFjaF9wcmVzZW50X2NwdShjcHUpIGZvcl9lYWNoX2NwdV9tYXNrKChjcHUpLCBjcHVfcHJlc2VudF9tYXApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA4MzYzMjVlLi4wZGQxNjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTIxNyw3ICsyMTcsNiBAQAogZXh0ZXJuIHN0cnVjdCBkZW50cnkgKiBkX3NwbGljZV9hbGlhcyhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKIGV4dGVybiB2b2lkIHNocmlua19kY2FjaGVfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHZvaWQgc2hyaW5rX2RjYWNoZV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqKTsKLWV4dGVybiB2b2lkIHNocmlua19kY2FjaGVfYW5vbihzdHJ1Y3QgaGxpc3RfaGVhZCAqKTsKIGV4dGVybiBpbnQgZF9pbnZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKik7CiAKIC8qIG9ubHkgdXNlZCBhdCBtb3VudC10aW1lICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RlbGF5LmggYi9pbmNsdWRlL2xpbnV4L2RlbGF5LmgKaW5kZXggYWNiNzQ4Ni4uMTdkZGI1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZWxheS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGVsYXkuaApAQCAtMjUsMTAgKzI1LDcgQEAKICNkZWZpbmUgTUFYX1VERUxBWV9NUwk1CiAjZW5kaWYKIAotI2lmZGVmIG5vdGRlZgotI2RlZmluZSBtZGVsYXkobikgKFwKLQl7dW5zaWduZWQgbG9uZyBfX21zPShuKTsgd2hpbGUgKF9fbXMtLSkgdWRlbGF5KDEwMDApO30pCi0jZWxzZQorI2lmbmRlZiBtZGVsYXkKICNkZWZpbmUgbWRlbGF5KG4pIChcCiAJKF9fYnVpbHRpbl9jb25zdGFudF9wKG4pICYmIChuKTw9TUFYX1VERUxBWV9NUykgPyB1ZGVsYXkoKG4pKjEwMDApIDogXAogCSh7dW5zaWduZWQgbG9uZyBfX21zPShuKTsgd2hpbGUgKF9fbXMtLSkgdWRlbGF5KDEwMDApO30pKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kdmIvZG14LmggYi9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaAppbmRleCAyNzg3YjhhLi5jNmEyMzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaAorKysgYi9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaApAQCAtODgsMjAgKzg4LDYgQEAKICNkZWZpbmUgRE1YX1BFU19QQ1IgICAgICBETVhfUEVTX1BDUjAKIAogCi10eXBlZGVmIGVudW0KLXsKLQlETVhfU0NSQU1CTElOR19FViwKLQlETVhfRlJPTlRFTkRfRVYKLX0gZG14X2V2ZW50X3Q7Ci0KLQotdHlwZWRlZiBlbnVtCi17Ci0JRE1YX1NDUkFNQkxJTkdfT0ZGLAotCURNWF9TQ1JBTUJMSU5HX09OCi19IGRteF9zY3JhbWJsaW5nX3N0YXR1c190OwotCi0KIHR5cGVkZWYgc3RydWN0IGRteF9maWx0ZXIKIHsKIAlfX3U4ICBmaWx0ZXJbRE1YX0ZJTFRFUl9TSVpFXTsKQEAgLTEzMiwxNyArMTE4LDYgQEAKIAlfX3UzMiAgICAgICAgICBmbGFnczsKIH07CiAKLQotc3RydWN0IGRteF9ldmVudAotewotCWRteF9ldmVudF90ICAgICAgICAgZXZlbnQ7Ci0JdGltZV90ICAgICAgICAgICAgICB0aW1lU3RhbXA7Ci0JdW5pb24KLQl7Ci0JCWRteF9zY3JhbWJsaW5nX3N0YXR1c190IHNjcmFtYmxpbmc7Ci0JfSB1OwotfTsKLQogdHlwZWRlZiBzdHJ1Y3QgZG14X2NhcHMgewogCV9fdTMyIGNhcHM7CiAJaW50IG51bV9kZWNvZGVyczsKQEAgLTE3MSw3ICsxNDYsNiBAQAogI2RlZmluZSBETVhfU0VUX0ZJTFRFUiAgICAgICAgICAgX0lPVygnbycsIDQzLCBzdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zKQogI2RlZmluZSBETVhfU0VUX1BFU19GSUxURVIgICAgICAgX0lPVygnbycsIDQ0LCBzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zKQogI2RlZmluZSBETVhfU0VUX0JVRkZFUl9TSVpFICAgICAgX0lPKCdvJywgNDUpCi0jZGVmaW5lIERNWF9HRVRfRVZFTlQgICAgICAgICAgICBfSU9SKCdvJywgNDYsIHN0cnVjdCBkbXhfZXZlbnQpCiAjZGVmaW5lIERNWF9HRVRfUEVTX1BJRFMgICAgICAgICBfSU9SKCdvJywgNDcsIF9fdTE2WzVdKQogI2RlZmluZSBETVhfR0VUX0NBUFMgICAgICAgICAgICAgX0lPUignbycsIDQ4LCBkbXhfY2Fwc190KQogI2RlZmluZSBETVhfU0VUX1NPVVJDRSAgICAgICAgICAgX0lPVygnbycsIDQ5LCBkbXhfc291cmNlX3QpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCBlMjAzNjEzLi42NmQ2MjFkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTI5NCw2ICsyOTQsNyBAQAogZXh0ZXJuIHU2NCBlZmlfZ2V0X2lvYmFzZSAodm9pZCk7CiBleHRlcm4gdTMyIGVmaV9tZW1fdHlwZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIpOwogZXh0ZXJuIHU2NCBlZmlfbWVtX2F0dHJpYnV0ZXMgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyKTsKK2V4dGVybiB1NjQgZWZpX21lbV9hdHRyaWJ1dGUgKHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIGludCBlZmlfbWVtX2F0dHJpYnV0ZV9yYW5nZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKIAkJCQkgICAgdTY0IGF0dHIpOwogZXh0ZXJuIGludCBfX2luaXQgZWZpX3VhcnRfY29uc29sZV9vbmx5ICh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKaW5kZXggY2YyYWJlYy4uYzYzMTBhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldGh0b29sLmgKQEAgLTQxMSw2ICs0MTEsOCBAQAogI2RlZmluZSBFVEhUT09MX0dQRVJNQUREUgkweDAwMDAwMDIwIC8qIEdldCBwZXJtYW5lbnQgaGFyZHdhcmUgYWRkcmVzcyAqLwogI2RlZmluZSBFVEhUT09MX0dVRk8JCTB4MDAwMDAwMjEgLyogR2V0IFVGTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCiAjZGVmaW5lIEVUSFRPT0xfU1VGTwkJMHgwMDAwMDAyMiAvKiBTZXQgVUZPIGVuYWJsZSAoZXRodG9vbF92YWx1ZSkgKi8KKyNkZWZpbmUgRVRIVE9PTF9HR1NPCQkweDAwMDAwMDIzIC8qIEdldCBHU08gZW5hYmxlIChldGh0b29sX3ZhbHVlKSAqLworI2RlZmluZSBFVEhUT09MX1NHU08JCTB4MDAwMDAwMjQgLyogU2V0IEdTTyBlbmFibGUgKGV0aHRvb2xfdmFsdWUpICovCiAKIC8qIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlICovCiAjZGVmaW5lIFNQQVJDX0VUSF9HU0VUCQlFVEhUT09MX0dTRVQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmggYi9pbmNsdWRlL2xpbnV4L2V2ZW50cG9sbC5oCmluZGV4IDFlNGJkZmMuLjg0Y2ZhOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXZlbnRwb2xsLmgKKysrIGIvaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiAgaW5jbHVkZS9saW51eC9ldmVudHBvbGwuaCAoIEVmZmljZW50IGV2ZW50IHBvbGxpbmcgaW1wbGVtZW50YXRpb24gKQotICogIENvcHlyaWdodCAoQykgMjAwMSwuLi4sMjAwMwkgRGF2aWRlIExpYmVuemkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsLi4uLDIwMDYJIERhdmlkZSBMaWJlbnppCiAgKgogICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mcy5oIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKaW5kZXggNzU3ZDU0ZC4uNTYwN2U2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzLmgKQEAgLTcxMCw2ICs3MTAsMTQgQEAKIAlfX3UzMgkJbmV4dF9oYXNoOwogfTsKIAorLyogY2FsY3VsYXRlIHRoZSBmaXJzdCBibG9jayBudW1iZXIgb2YgdGhlIGdyb3VwICovCitzdGF0aWMgaW5saW5lIGV4dDNfZnNibGtfdAorZXh0M19ncm91cF9maXJzdF9ibG9ja19ubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGdyb3VwX25vKQoreworCXJldHVybiBncm91cF9ubyAqIChleHQzX2ZzYmxrX3QpRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSArCisJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworfQorCiAvKgogICogU3BlY2lhbCBlcnJvciByZXR1cm4gY29kZSBvbmx5IHVzZWQgYnkgZHhfcHJvYmUoKSBhbmQgaXRzIGNhbGxlcnMuCiAgKi8KQEAgLTczMCwxNCArNzM4LDE2IEBACiAvKiBiYWxsb2MuYyAqLwogZXh0ZXJuIGludCBleHQzX2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0M19iZ19udW1fZ2RiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBncm91cCk7Ci1leHRlcm4gaW50IGV4dDNfbmV3X2Jsb2NrIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywgaW50ICopOwotZXh0ZXJuIGludCBleHQzX25ld19ibG9ja3MgKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nLAotCQkJdW5zaWduZWQgbG9uZyAqLCBpbnQgKik7Ci1leHRlcm4gdm9pZCBleHQzX2ZyZWVfYmxvY2tzIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgZXh0M19mcmVlX2Jsb2Nrc19zYiAoaGFuZGxlX3QgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosCi0JCQkJIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCAqKTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2sgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlleHQzX2ZzYmxrX3QgZ29hbCwgaW50ICplcnJwKTsKK2V4dGVybiBleHQzX2ZzYmxrX3QgZXh0M19uZXdfYmxvY2tzIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJZXh0M19mc2Jsa190IGdvYWwsIHVuc2lnbmVkIGxvbmcgKmNvdW50LCBpbnQgKmVycnApOworZXh0ZXJuIHZvaWQgZXh0M19mcmVlX2Jsb2NrcyAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWV4dDNfZnNibGtfdCBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCk7CitleHRlcm4gdm9pZCBleHQzX2ZyZWVfYmxvY2tzX3NiIChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSBleHQzX2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCQkJdW5zaWduZWQgbG9uZyAqcGRxdW90X2ZyZWVkX2Jsb2Nrcyk7CitleHRlcm4gZXh0M19mc2Jsa190IGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiB2b2lkIGV4dDNfY2hlY2tfYmxvY2tzX2JpdG1hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwogZXh0ZXJuIHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBleHQzX2dldF9ncm91cF9kZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAogCQkJCQkJICAgIHVuc2lnbmVkIGludCBibG9ja19ncm91cCwKQEAgLTc3Myw3ICs3ODMsOCBAQAogCiAKIC8qIGlub2RlLmMgKi8KLWludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqLCBpbnQsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK2ludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGV4dDNfZnNibGtfdCBibG9ja25yKTsKIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZ2V0YmxrIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgbG9uZywgaW50LCBpbnQgKik7CiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQzX2JyZWFkIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQsIGludCAqKTsKIGludCBleHQzX2dldF9ibG9ja3NfaGFuZGxlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC04MDgsNyArODE5LDcgQEAKIAkJCQlzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpOwogZXh0ZXJuIGludCBleHQzX2dyb3VwX2V4dGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAogCQkJCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcywKLQkJCQl1bnNpZ25lZCBsb25nIG5fYmxvY2tzX2NvdW50KTsKKwkJCQlleHQzX2ZzYmxrX3Qgbl9ibG9ja3NfY291bnQpOwogCiAvKiBzdXBlci5jICovCiBleHRlcm4gdm9pZCBleHQzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmggYi9pbmNsdWRlL2xpbnV4L2V4dDNfZnNfaS5oCmluZGV4IDdhYmY5MDEuLjJmMThiOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXh0M19mc19pLmgKKysrIGIvaW5jbHVkZS9saW51eC9leHQzX2ZzX2kuaApAQCAtMjEsOSArMjEsMTcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KIAorLyogZGF0YSB0eXBlIGZvciBibG9jayBvZmZzZXQgb2YgYmxvY2sgZ3JvdXAgKi8KK3R5cGVkZWYgaW50IGV4dDNfZ3JwYmxrX3Q7CisKKy8qIGRhdGEgdHlwZSBmb3IgZmlsZXN5c3RlbS13aWRlIGJsb2NrcyBudW1iZXIgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBleHQzX2ZzYmxrX3Q7CisKKyNkZWZpbmUgRTNGU0JMSyAiJWx1IgorCiBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyB7Ci0JX191MzIJCQlfcnN2X3N0YXJ0OwkvKiBGaXJzdCBieXRlIHJlc2VydmVkICovCi0JX191MzIJCQlfcnN2X2VuZDsJLyogTGFzdCBieXRlIHJlc2VydmVkIG9yIDAgKi8KKwlleHQzX2ZzYmxrX3QJX3Jzdl9zdGFydDsJLyogRmlyc3QgYnl0ZSByZXNlcnZlZCAqLworCWV4dDNfZnNibGtfdAlfcnN2X2VuZDsJLyogTGFzdCBieXRlIHJlc2VydmVkIG9yIDAgKi8KIH07CiAKIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgewpAQCAtNTAsNyArNTgsNyBAQAogCSAqIGFsbG9jYXRlZCB0byB0aGlzIGZpbGUuICBUaGlzIGdpdmUgdXMgdGhlIGdvYWwgKHRhcmdldCkgZm9yIHRoZSBuZXh0CiAJICogYWxsb2NhdGlvbiB3aGVuIHdlIGRldGVjdCBsaW5lYXJseSBhc2NlbmRpbmcgcmVxdWVzdHMuCiAJICovCi0JX191MzIgICAgICAgICAgICAgICAgICAgbGFzdF9hbGxvY19waHlzaWNhbF9ibG9jazsKKwlleHQzX2ZzYmxrX3QJCWxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2s7CiB9OwogCiAjZGVmaW5lIHJzdl9zdGFydCByc3Zfd2luZG93Ll9yc3Zfc3RhcnQKQEAgLTY3LDcgKzc1LDcgQEAKIAlfX3U4CWlfZnJhZ19ubzsKIAlfX3U4CWlfZnJhZ19zaXplOwogI2VuZGlmCi0JX191MzIJaV9maWxlX2FjbDsKKwlleHQzX2ZzYmxrX3QJaV9maWxlX2FjbDsKIAlfX3UzMglpX2Rpcl9hY2w7CiAJX191MzIJaV9kdGltZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mYi5oIGIvaW5jbHVkZS9saW51eC9mYi5oCmluZGV4IDMxNWQ4OTcuLmYxMjgxNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZiLmgKQEAgLTEsNiArMSw3IEBACiAjaWZuZGVmIF9MSU5VWF9GQl9ICiAjZGVmaW5lIF9MSU5VWF9GQl9ICiAKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogLyogRGVmaW5pdGlvbnMgb2YgZnJhbWUgYnVmZmVycwkJCQkJCSovCkBAIC0zNjYsNiArMzY3LDEyIEBACiAJc3RydWN0IGZiX2ltYWdlCWltYWdlOwkvKiBDdXJzb3IgaW1hZ2UgKi8KIH07CiAKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisvKiBTZXR0aW5ncyBmb3IgdGhlIGdlbmVyaWMgYmFja2xpZ2h0IGNvZGUgKi8KKyNkZWZpbmUgRkJfQkFDS0xJR0hUX0xFVkVMUwkxMjgKKyNkZWZpbmUgRkJfQkFDS0xJR0hUX01BWAkweEZGCisjZW5kaWYKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CkBAIC03NTYsNiArNzYzLDIxIEBACiAJc3RydWN0IGZiX2NtYXAgY21hcDsJCS8qIEN1cnJlbnQgY21hcCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbW9kZWxpc3Q7ICAgICAgLyogbW9kZSBsaXN0ICovCiAJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZTsJLyogY3VycmVudCBtb2RlICovCisKKyNpZmRlZiBDT05GSUdfRkJfQkFDS0xJR0hUCisJLyogTG9jayBvcmRlcmluZzoKKwkgKiBibF9tdXRleCAocHJvdGVjdHMgYmxfZGV2IGFuZCBibF9jdXJ2ZSkKKwkgKiAgIGJsX2Rldi0+c2VtIChiYWNrbGlnaHQgY2xhc3MpCisJICovCisJc3RydWN0IG11dGV4IGJsX211dGV4OworCisJLyogYXNzaWduZWQgYmFja2xpZ2h0IGRldmljZSAqLworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpibF9kZXY7CisKKwkvKiBCYWNrbGlnaHQgbGV2ZWwgY3VydmUgKi8KKwl1OCBibF9jdXJ2ZVtGQl9CQUNLTElHSFRfTEVWRUxTXTsKKyNlbmRpZgorCiAJc3RydWN0IGZiX29wcyAqZmJvcHM7CiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwogCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldmljZTsgLyogc3lzZnMgcGVyIGRldmljZSBhdHRycyAqLwpAQCAtODk1LDYgKzkxNyw3IEBACiBleHRlcm4gdm9pZCBmcmFtZWJ1ZmZlcl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKIGV4dGVybiBpbnQgZmJfaW5pdF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIHZvaWQgZmJfY2xlYW51cF9jbGFzc19kZXZpY2Uoc3RydWN0IGZiX2luZm8gKmhlYWQpOworZXh0ZXJuIHZvaWQgZmJfYmxfZGVmYXVsdF9jdXJ2ZShzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbywgdTggb2ZmLCB1OCBtaW4sIHU4IG1heCk7CiAKIC8qIGRyaXZlcnMvdmlkZW8vZmJtb24uYyAqLwogI2RlZmluZSBGQl9NQVhUSU1JTkdTCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZjbnRsLmggYi9pbmNsdWRlL2xpbnV4L2ZjbnRsLmgKaW5kZXggYzUyYTYzNy4uOTk2ZjU2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mY250bC5oCisrKyBiL2luY2x1ZGUvbGludXgvZmNudGwuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBBVF9TWU1MSU5LX05PRk9MTE9XCTB4MTAwICAgLyogRG8gbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcy4gICovCiAjZGVmaW5lIEFUX1JFTU9WRURJUgkJMHgyMDAgICAvKiBSZW1vdmUgZGlyZWN0b3J5IGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmtpbmcgZmlsZS4gICovCisjZGVmaW5lIEFUX1NZTUxJTktfRk9MTE9XCTB4NDAwICAgLyogRm9sbG93IHN5bWJvbGljIGxpbmtzLiAgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGVjYzhjMmMuLjJkOGIzNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTM3Niw3ICszNzYsOCBAQAogCXN0cnVjdCBwYWdlKiAoKmdldF94aXBfcGFnZSkoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc2VjdG9yX3QsCiAJCQlpbnQpOwogCS8qIG1pZ3JhdGUgdGhlIGNvbnRlbnRzIG9mIGEgcGFnZSB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCAqLwotCWludCAoKm1pZ3JhdGVwYWdlKSAoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CisJaW50ICgqbWlncmF0ZXBhZ2UpIChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAorCQkJc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CiB9OwogCiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbzsKQEAgLTY4Miw2ICs2ODMsNyBAQAogI2RlZmluZSBGTF9GTE9DSwkyCiAjZGVmaW5lIEZMX0FDQ0VTUwk4CS8qIG5vdCB0cnlpbmcgdG8gbG9jaywganVzdCBsb29raW5nICovCiAjZGVmaW5lIEZMX0xFQVNFCTMyCS8qIGxlYXNlIGhlbGQgb24gdGhpcyBmaWxlICovCisjZGVmaW5lIEZMX0NMT1NFCTY0CS8qIHVubG9jayBvbiBjbG9zZSAqLwogI2RlZmluZSBGTF9TTEVFUAkxMjgJLyogQSBibG9ja2luZyBsb2NrICovCiAKIC8qCkBAIC03NzQsNyArNzc2LDYgQEAKIGV4dGVybiBpbnQgcG9zaXhfbG9ja19maWxlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gaW50IHBvc2l4X2xvY2tfZmlsZV93YWl0KHN0cnVjdCBmaWxlICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gaW50IHBvc2l4X3VuYmxvY2tfbG9jayhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZmlsZV9sb2NrICopOwotZXh0ZXJuIGludCBwb3NpeF9sb2Nrc19kZWFkbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiBleHRlcm4gaW50IGZsb2NrX2xvY2tfZmlsZV93YWl0KHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CiBleHRlcm4gaW50IF9fYnJlYWtfbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKIGV4dGVybiB2b2lkIGxlYXNlX2dldF9tdGltZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHRpbWVzcGVjICp0aW1lKTsKQEAgLTc4Miw3ICs3ODMsNiBAQAogZXh0ZXJuIGludCBsZWFzZV9tb2RpZnkoc3RydWN0IGZpbGVfbG9jayAqKiwgaW50KTsKIGV4dGVybiBpbnQgbG9ja19tYXlfcmVhZChzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90IHN0YXJ0LCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBpbnQgbG9ja19tYXlfd3JpdGUoc3RydWN0IGlub2RlICosIGxvZmZfdCBzdGFydCwgdW5zaWduZWQgbG9uZyBjb3VudCk7Ci1leHRlcm4gdm9pZCBzdGVhbF9sb2NrcyhmbF9vd25lcl90IGZyb20pOwogCiBzdHJ1Y3QgZmFzeW5jX3N0cnVjdCB7CiAJaW50CW1hZ2ljOwpAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAlsb25nICgqY29tcGF0X2lvY3RsKSAoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIAlpbnQgKCptbWFwKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogCWludCAoKm9wZW4pIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7Ci0JaW50ICgqZmx1c2gpIChzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgKCpmbHVzaCkgKHN0cnVjdCBmaWxlICosIGZsX293bmVyX3QgaWQpOwogCWludCAoKnJlbGVhc2UpIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAJaW50ICgqZnN5bmMpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCBkYXRhc3luYyk7CiAJaW50ICgqYWlvX2ZzeW5jKSAoc3RydWN0IGtpb2NiICosIGludCBkYXRhc3luYyk7CkBAIC0xMDk3LDEwICsxMDk3LDEwIEBACiAJaW50ICgqc3luY19mcykoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOwogCXZvaWQgKCp3cml0ZV9zdXBlcl9sb2NrZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAJdm9pZCAoKnVubG9ja2ZzKSAoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotCWludCAoKnN0YXRmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKKwlpbnQgKCpzdGF0ZnMpIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogCWludCAoKnJlbW91bnRfZnMpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CiAJdm9pZCAoKmNsZWFyX2lub2RlKSAoc3RydWN0IGlub2RlICopOwotCXZvaWQgKCp1bW91bnRfYmVnaW4pIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisJdm9pZCAoKnVtb3VudF9iZWdpbikgKHN0cnVjdCB2ZnNtb3VudCAqLCBpbnQpOwogCiAJaW50ICgqc2hvd19vcHRpb25zKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IHZmc21vdW50ICopOwogCWludCAoKnNob3dfc3RhdHMpKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CkBAIC0xMjcwLDIzICsxMjcwLDI2IEBACiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgZnNfZmxhZ3M7Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICooKmdldF9zYikgKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICosIGludCwKLQkJCQkgICAgICAgY29uc3QgY2hhciAqLCB2b2lkICopOworCWludCAoKmdldF9zYikgKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICosIGludCwKKwkJICAgICAgIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CiAJdm9pZCAoKmtpbGxfc2IpIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBuZXh0OwogCXN0cnVjdCBsaXN0X2hlYWQgZnNfc3VwZXJzOwogfTsKIAotc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc2JfYmRldihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKK2V4dGVybiBpbnQgZ2V0X3NiX2JkZXYoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCiAJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwKLQlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpKTsKLXN0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X3NiX3NpbmdsZShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK2V4dGVybiBpbnQgZ2V0X3NiX3NpbmdsZShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKIAlpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsCi0JaW50ICgqZmlsbF9zdXBlcikoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KSk7Ci1zdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zYl9ub2RldihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KTsKK2V4dGVybiBpbnQgZ2V0X3NiX25vZGV2KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgdm9pZCAqZGF0YSwKLQlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpKTsKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpLAorCXN0cnVjdCB2ZnNtb3VudCAqbW50KTsKIHZvaWQgZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHZvaWQga2lsbF9ibG9ja19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHZvaWQga2lsbF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOwpAQCAtMTI5Nyw4ICsxMzAwLDEwIEBACiAJCQlpbnQgKCp0ZXN0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAogCQkJaW50ICgqc2V0KShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix2b2lkICopLAogCQkJdm9pZCAqZGF0YSk7Ci1zdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zYl9wc2V1ZG8oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgY2hhciAqLAotCQkJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wcywgdW5zaWduZWQgbG9uZyk7CitleHRlcm4gaW50IGdldF9zYl9wc2V1ZG8oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiwgY2hhciAqLAorCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpvcHMsIHVuc2lnbmVkIGxvbmcsCisJc3RydWN0IHZmc21vdW50ICptbnQpOworZXh0ZXJuIGludCBzaW1wbGVfc2V0X21udChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBpbnQgX19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiBpbnQgX19wdXRfc3VwZXJfYW5kX25lZWRfcmVzdGFydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKIHZvaWQgdW5uYW1lZF9kZXZfaW5pdCh2b2lkKTsKQEAgLTEzMjEsNyArMTMyNiw3IEBACiBleHRlcm4gdm9pZCBtbnRfc2V0X21vdW50cG9pbnQoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwKIAkJCQkgIHN0cnVjdCB2ZnNtb3VudCAqKTsKIAotZXh0ZXJuIGludCB2ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK2V4dGVybiBpbnQgdmZzX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdGZzICopOwogCiAvKiAvc3lzL2ZzICovCiBleHRlcm4gc3RydWN0IHN1YnN5c3RlbSBmc19zdWJzeXM7CkBAIC0xNzQyLDcgKzE3NDcsNyBAQAogZXh0ZXJuIGxvZmZfdCBkY2FjaGVfZGlyX2xzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIGV4dGVybiBpbnQgZGNhY2hlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOwogZXh0ZXJuIGludCBzaW1wbGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXQgKik7Ci1leHRlcm4gaW50IHNpbXBsZV9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworZXh0ZXJuIGludCBzaW1wbGVfc3RhdGZzKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBleHRlcm4gaW50IHNpbXBsZV9saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHNpbXBsZV91bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CiBleHRlcm4gaW50IHNpbXBsZV9ybWRpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKQEAgLTE3NjIsMTMgKzE3NjcsMTQgQEAKIHN0cnVjdCB0cmVlX2Rlc2NyIHsgY2hhciAqbmFtZTsgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqb3BzOyBpbnQgbW9kZTsgfTsKIHN0cnVjdCBkZW50cnkgKmRfYWxsb2NfbmFtZShzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKik7CiBleHRlcm4gaW50IHNpbXBsZV9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIHN0cnVjdCB0cmVlX2Rlc2NyICopOwotZXh0ZXJuIGludCBzaW1wbGVfcGluX2ZzKGNoYXIgKm5hbWUsIHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KTsKK2V4dGVybiBpbnQgc2ltcGxlX3Bpbl9mcyhzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCk7CiBleHRlcm4gdm9pZCBzaW1wbGVfcmVsZWFzZV9mcyhzdHJ1Y3QgdmZzbW91bnQgKiptb3VudCwgaW50ICpjb3VudCk7CiAKIGV4dGVybiBzc2l6ZV90IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHZvaWQgX191c2VyICosIHNpemVfdCwgbG9mZl90ICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKIAogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KLWV4dGVybiBpbnQgYnVmZmVyX21pZ3JhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgYnVmZmVyX21pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAorCQkJCXN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwogI2Vsc2UKICNkZWZpbmUgYnVmZmVyX21pZ3JhdGVfcGFnZSBOVUxMCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnVzZS5oIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKaW5kZXggNTQyNWI2MC4uOWZjNDhhNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdXNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXNlLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICAgIEZVU0U6IEZpbGVzeXN0ZW0gaW4gVXNlcnNwYWNlCi0gICAgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgIE1pa2xvcyBTemVyZWRpIDxtaWtsb3NAc3plcmVkaS5odT4KKyAgICBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiAgTWlrbG9zIFN6ZXJlZGkgPG1pa2xvc0BzemVyZWRpLmh1PgogCiAgICAgVGhpcyBwcm9ncmFtIGNhbiBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwuCiAgICAgU2VlIHRoZSBmaWxlIENPUFlJTkcuCkBAIC05LDE4ICs5LDE5IEBACiAvKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUga2VybmVsIGludGVyZmFjZSBvZiBGVVNFICovCiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgogCiAvKiogVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBpbnRlcmZhY2UgKi8KICNkZWZpbmUgRlVTRV9LRVJORUxfVkVSU0lPTiA3CiAKIC8qKiBNaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIGludGVyZmFjZSAqLwotI2RlZmluZSBGVVNFX0tFUk5FTF9NSU5PUl9WRVJTSU9OIDYKKyNkZWZpbmUgRlVTRV9LRVJORUxfTUlOT1JfVkVSU0lPTiA3CiAKIC8qKiBUaGUgbm9kZSBJRCBvZiB0aGUgcm9vdCBpbm9kZSAqLwogI2RlZmluZSBGVVNFX1JPT1RfSUQgMQogCiAvKiogVGhlIG1ham9yIG51bWJlciBvZiB0aGUgZnVzZSBjaGFyYWN0ZXIgZGV2aWNlICovCi0jZGVmaW5lIEZVU0VfTUFKT1IgMTAKKyNkZWZpbmUgRlVTRV9NQUpPUiBNSVNDX01BSk9SCiAKIC8qKiBUaGUgbWlub3IgbnVtYmVyIG9mIHRoZSBmdXNlIGNoYXJhY3RlciBkZXZpY2UgKi8KICNkZWZpbmUgRlVTRV9NSU5PUiAyMjkKQEAgLTU4LDYgKzU5LDEzIEBACiAJX191MzIJc3BhcmVbNl07CiB9OwogCitzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgeworCV9fdTY0CXN0YXJ0OworCV9fdTY0CWVuZDsKKwlfX3UzMgl0eXBlOworCV9fdTMyCXBpZDsgLyogdGdpZCAqLworfTsKKwogLyoqCiAgKiBCaXRtYXNrcyBmb3IgZnVzZV9zZXRhdHRyX2luLnZhbGlkCiAgKi8KQEAgLTgyLDYgKzkwLDcgQEAKICAqIElOSVQgcmVxdWVzdC9yZXBseSBmbGFncwogICovCiAjZGVmaW5lIEZVU0VfQVNZTkNfUkVBRAkJKDEgPDwgMCkKKyNkZWZpbmUgRlVTRV9QT1NJWF9MT0NLUwkoMSA8PCAxKQogCiBlbnVtIGZ1c2Vfb3Bjb2RlIHsKIAlGVVNFX0xPT0tVUAkgICA9IDEsCkBAIC0xMTIsOCArMTIxLDEyIEBACiAJRlVTRV9SRUFERElSICAgICAgID0gMjgsCiAJRlVTRV9SRUxFQVNFRElSICAgID0gMjksCiAJRlVTRV9GU1lOQ0RJUiAgICAgID0gMzAsCisJRlVTRV9HRVRMSyAgICAgICAgID0gMzEsCisJRlVTRV9TRVRMSyAgICAgICAgID0gMzIsCisJRlVTRV9TRVRMS1cgICAgICAgID0gMzMsCiAJRlVTRV9BQ0NFU1MgICAgICAgID0gMzQsCi0JRlVTRV9DUkVBVEUgICAgICAgID0gMzUKKwlGVVNFX0NSRUFURSAgICAgICAgPSAzNSwKKwlGVVNFX0lOVEVSUlVQVCAgICAgPSAzNiwKIH07CiAKIC8qIFRoZSByZWFkIGJ1ZmZlciBpcyByZXF1aXJlZCB0byBiZSBhdCBsZWFzdCA4aywgYnV0IG1heSBiZSBtdWNoIGxhcmdlciAqLwpAQCAtMTk5LDYgKzIxMiw3IEBACiAJX191NjQJZmg7CiAJX191MzIJZmx1c2hfZmxhZ3M7CiAJX191MzIJcGFkZGluZzsKKwlfX3U2NAlsb2NrX293bmVyOwogfTsKIAogc3RydWN0IGZ1c2VfcmVhZF9pbiB7CkBAIC0yNDcsNiArMjYxLDE2IEBACiAJX191MzIJcGFkZGluZzsKIH07CiAKK3N0cnVjdCBmdXNlX2xrX2luIHsKKwlfX3U2NAlmaDsKKwlfX3U2NAlvd25lcjsKKwlzdHJ1Y3QgZnVzZV9maWxlX2xvY2sgbGs7Cit9OworCitzdHJ1Y3QgZnVzZV9sa19vdXQgeworCXN0cnVjdCBmdXNlX2ZpbGVfbG9jayBsazsKK307CisKIHN0cnVjdCBmdXNlX2FjY2Vzc19pbiB7CiAJX191MzIJbWFzazsKIAlfX3UzMglwYWRkaW5nOwpAQCAtMjY4LDYgKzI5MiwxMCBAQAogCV9fdTMyCW1heF93cml0ZTsKIH07CiAKK3N0cnVjdCBmdXNlX2ludGVycnVwdF9pbiB7CisJX191NjQJdW5pcXVlOworfTsKKwogc3RydWN0IGZ1c2VfaW5faGVhZGVyIHsKIAlfX3UzMglsZW47CiAJX191MzIJb3Bjb2RlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oIGIvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oCmluZGV4IDdmZDA1NzYuLjY5MGM0MjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuYWxsb2MuaAorKysgYi9pbmNsdWRlL2xpbnV4L2dlbmFsbG9jLmgKQEAgLTQsMzcgKzQsMzIgQEAKICAqIFVzZXMgZm9yIHRoaXMgaW5jbHVkZXMgb24tZGV2aWNlIHNwZWNpYWwgbWVtb3J5LCB1bmNhY2hlZCBtZW1vcnkKICAqIGV0Yy4KICAqCi0gKiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGJ1ZGR5IGFsbG9jYXRvciBmb3VuZCBpbiB0aGUgc3ltNTNjOHh4XzIKLSAqIGRyaXZlciwgYWRhcHRlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZS4KLSAqCiAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKICAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0KLSNkZWZpbmUgQUxMT0NfTUlOX1NISUZUCQk1IC8qIDMyIGJ5dGVzIG1pbmltdW0gKi8KLS8qCi0gKiAgTGluayBiZXR3ZWVuIGZyZWUgbWVtb3J5IGNodW5rcyBvZiBhIGdpdmVuIHNpemUuCi0gKi8KLXN0cnVjdCBnZW5fcG9vbF9saW5rIHsKLQlzdHJ1Y3QgZ2VuX3Bvb2xfbGluayAqbmV4dDsKLX07CiAKIC8qCi0gKiAgTWVtb3J5IHBvb2wgZGVzY3JpcHRvci4KKyAqICBHZW5lcmFsIHB1cnBvc2Ugc3BlY2lhbCBtZW1vcnkgcG9vbCBkZXNjcmlwdG9yLgogICovCiBzdHJ1Y3QgZ2VuX3Bvb2wgewotCXNwaW5sb2NrX3QgbG9jazsKLQl1bnNpZ25lZCBsb25nICgqZ2V0X25ld19jaHVuaykoc3RydWN0IGdlbl9wb29sICopOwotCXN0cnVjdCBnZW5fcG9vbCAqbmV4dDsKLQlzdHJ1Y3QgZ2VuX3Bvb2xfbGluayAqaDsKLQl1bnNpZ25lZCBsb25nIHByaXZhdGU7Ci0JaW50IG1heF9jaHVua19zaGlmdDsKKwlyd2xvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgY2h1bmtzOwkvKiBsaXN0IG9mIGNodW5rcyBpbiB0aGlzIHBvb2wgKi8KKwlpbnQgbWluX2FsbG9jX29yZGVyOwkJLyogbWluaW11bSBhbGxvY2F0aW9uIG9yZGVyICovCiB9OwogCi11bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqcG9vbHAsIGludCBzaXplKTsKLXZvaWQgZ2VuX3Bvb2xfZnJlZShzdHJ1Y3QgZ2VuX3Bvb2wgKm1wLCB1bnNpZ25lZCBsb25nIHB0ciwgaW50IHNpemUpOwotc3RydWN0IGdlbl9wb29sICpnZW5fcG9vbF9jcmVhdGUoaW50IG5yX2NodW5rcywgaW50IG1heF9jaHVua19zaGlmdCwKLQkJCQkgdW5zaWduZWQgbG9uZyAoKmZwKShzdHJ1Y3QgZ2VuX3Bvb2wgKiksCi0JCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSk7CisvKgorICogIEdlbmVyYWwgcHVycG9zZSBzcGVjaWFsIG1lbW9yeSBwb29sIGNodW5rIGRlc2NyaXB0b3IuCisgKi8KK3N0cnVjdCBnZW5fcG9vbF9jaHVuayB7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dF9jaHVuazsJLyogbmV4dCBjaHVuayBpbiBwb29sICovCisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOwkvKiBzdGFydGluZyBhZGRyZXNzIG9mIG1lbW9yeSBjaHVuayAqLworCXVuc2lnbmVkIGxvbmcgZW5kX2FkZHI7CQkvKiBlbmRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgKi8KKwl1bnNpZ25lZCBsb25nIGJpdHNbMF07CQkvKiBiaXRtYXAgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IGNodW5rICovCit9OworCitleHRlcm4gc3RydWN0IGdlbl9wb29sICpnZW5fcG9vbF9jcmVhdGUoaW50LCBpbnQpOworZXh0ZXJuIGludCBnZW5fcG9vbF9hZGQoc3RydWN0IGdlbl9wb29sICosIHVuc2lnbmVkIGxvbmcsIHNpemVfdCwgaW50KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgZ2VuX3Bvb2xfZnJlZShzdHJ1Y3QgZ2VuX3Bvb2wgKiwgdW5zaWduZWQgbG9uZywgc2l6ZV90KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGRsYy5oIGIvaW5jbHVkZS9saW51eC9oZGxjLmgKaW5kZXggZGY2OTVlOWEuLjQ1MTNmOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGRsYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaGRsYy5oCkBAIC0xODgsNyArMTg4LDcgQEAKIGludCBoZGxjX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqaWZyLCBpbnQgY21kKTsKIAogLyogTXVzdCBiZSB1c2VkIGJ5IGhhcmR3YXJlIGRyaXZlciBvbiBtb2R1bGUgc3RhcnR1cC9leGl0ICovCi1pbnQgcmVnaXN0ZXJfaGRsY19kZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZGVmaW5lIHJlZ2lzdGVyX2hkbGNfZGV2aWNlKGRldikJcmVnaXN0ZXJfbmV0ZGV2KGRldikKIHZvaWQgdW5yZWdpc3Rlcl9oZGxjX2RldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2hkbGNkZXYodm9pZCAqcHJpdik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hydGltZXIuaCBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCmluZGV4IDdkMmExYjkuLjA3ZDczMDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oCkBAIC00MCw3ICs0MCw2IEBACiAKIC8qKgogICogc3RydWN0IGhydGltZXIgLSB0aGUgYmFzaWMgaHJ0aW1lciBzdHJ1Y3R1cmUKLSAqCiAgKiBAbm9kZToJcmVkIGJsYWNrIHRyZWUgbm9kZSBmb3IgdGltZSBvcmRlcmVkIGluc2VydGlvbgogICogQGV4cGlyZXM6CXRoZSBhYnNvbHV0ZSBleHBpcnkgdGltZSBpbiB0aGUgaHJ0aW1lcnMgaW50ZXJuYWwKICAqCQlyZXByZXNlbnRhdGlvbi4gVGhlIHRpbWUgaXMgcmVsYXRlZCB0byB0aGUgY2xvY2sgb24KQEAgLTU5LDcgKzU4LDYgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaHJ0aW1lcl9zbGVlcGVyIC0gc2ltcGxlIHNsZWVwZXIgc3RydWN0dXJlCi0gKgogICogQHRpbWVyOgllbWJlZGRlZCB0aW1lciBzdHJ1Y3R1cmUKICAqIEB0YXNrOgl0YXNrIHRvIHdha2UgdXAKICAqCkBAIC03Miw3ICs3MCw2IEBACiAKIC8qKgogICogc3RydWN0IGhydGltZXJfYmFzZSAtIHRoZSB0aW1lciBiYXNlIGZvciBhIHNwZWNpZmljIGNsb2NrCi0gKgogICogQGluZGV4OgkJY2xvY2sgdHlwZSBpbmRleCBmb3IgcGVyX2NwdSBzdXBwb3J0IHdoZW4gbW92aW5nIGEgdGltZXIKICAqCQkJdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgogICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIGJhc2UgYW5kIGFzc29jaWF0ZWQgdGltZXJzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaCBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCmluZGV4IDRjNWU2MTAuLmMyNWEzOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvaHVnZXRsYi5oCkBAIC0yMyw2ICsyMyw4IEBACiB1bnNpZ25lZCBsb25nIGh1Z2V0bGJfdG90YWxfcGFnZXModm9pZCk7CiBpbnQgaHVnZXRsYl9mYXVsdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCB3cml0ZV9hY2Nlc3MpOworaW50IGh1Z2V0bGJfcmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGZyb20sIGxvbmcgdG8pOwordm9pZCBodWdldGxiX3VucmVzZXJ2ZV9wYWdlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIG9mZnNldCwgbG9uZyBmcmVlZCk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIG1heF9odWdlX3BhZ2VzOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgaHVnZXRsYl96ZXJvLCBodWdldGxiX2luZmluaXR5OwpAQCAtMTM5LDggKzE0MSw2IEBACiAKIHN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyB7CiAJc3RydWN0IHNoYXJlZF9wb2xpY3kgcG9saWN5OwotCS8qIFByb3RlY3RlZCBieSB0aGUgKGdsb2JhbCkgaHVnZXRsYl9sb2NrICovCi0JdW5zaWduZWQgbG9uZyBwcmVyZXNlcnZlZF9ocGFnZXM7CiAJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKIH07CiAKQEAgLTE1NywxMCArMTU3LDYgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7CiBleHRlcm4gc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGh1Z2V0bGJfdm1fb3BzOwogc3RydWN0IGZpbGUgKmh1Z2V0bGJfemVyb19zZXR1cChzaXplX3QpOwotaW50IGh1Z2V0bGJfZXh0ZW5kX3Jlc2VydmF0aW9uKHN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGF0bGVhc3RfaHBhZ2VzKTsKLXZvaWQgaHVnZXRsYl90cnVuY2F0ZV9yZXNlcnZhdGlvbihzdHJ1Y3QgaHVnZXRsYmZzX2lub2RlX2luZm8gKmluZm8sCi0JCQkJICB1bnNpZ25lZCBsb25nIGF0bW9zdF9ocGFnZXMpOwogaW50IGh1Z2V0bGJfZ2V0X3F1b3RhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKIHZvaWQgaHVnZXRsYl9wdXRfcXVvdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oIGIvaW5jbHVkZS9saW51eC9pMmMtaWQuaAppbmRleCBjOGI4MWY0Li4yMTMzOGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy1pZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLWlkLmgKQEAgLTExMiw2ICsxMTIsOSBAQAogI2RlZmluZSBJMkNfRFJJVkVSSURfWDEyMDUJODIJLyogWGljb3IvSW50ZXJzaWwgWDEyMDUgUlRDCSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9QQ0Y4NTYzCTgzCS8qIFBoaWxpcHMgUENGODU2MyBSVEMJCSovCiAjZGVmaW5lIEkyQ19EUklWRVJJRF9SUzVDMzcyCTg0CS8qIFJpY29oIFJTNUMzNzIgUlRDCQkqLworI2RlZmluZSBJMkNfRFJJVkVSSURfQlQ4NjYJODUJLyogQ29uZXhhbnQgYnQ4NjYgdmlkZW8gZW5jb2RlciAqLworI2RlZmluZSBJMkNfRFJJVkVSSURfS1MwMTI3CTg2CS8qIFNhbXN1bmcga3MwMTI3IHZpZGVvIGRlY29kZXIgKi8KKyNkZWZpbmUgSTJDX0RSSVZFUklEX1RMVjMyMEFJQzIzQiA4NwkvKiBUSSBUTFYzMjBBSUMyM0IgYXVkaW8gY29kZWMgICovCiAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0kyQ0RFVgk5MDAKICNkZWZpbmUgSTJDX0RSSVZFUklEX0FSUCAgICAgICAgOTAyICAgIC8qIFNNQnVzIEFSUCBDbGllbnQgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy1vY29yZXMuaCBiL2luY2x1ZGUvbGludXgvaTJjLW9jb3Jlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDU5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2kyYy1vY29yZXMuaApAQCAtMCwwICsxLDE5IEBACisvKgorICogaTJjLW9jb3Jlcy5oIC0gZGVmaW5pdGlvbnMgZm9yIHRoZSBpMmMtb2NvcmVzIGludGVyZmFjZQorICoKKyAqIFBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMi4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfTElOVVhfSTJDX09DT1JFU19ICisjZGVmaW5lIF9MSU5VWF9JMkNfT0NPUkVTX0gKKworc3RydWN0IG9jb3Jlc19pMmNfcGxhdGZvcm1fZGF0YSB7CisJdTMyIHJlZ3N0ZXA7ICAgLyogZGlzdGFuY2UgYmV0d2VlbiByZWdpc3RlcnMgKi8KKwl1MzIgY2xvY2tfa2h6OyAvKiBpbnB1dCBjbG9jayBpbiBrSHogKi8KK307CisKKyNlbmRpZiAvKiBfTElOVVhfSTJDX09DT1JFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2kyYy5oIGIvaW5jbHVkZS9saW51eC9pMmMuaAppbmRleCAwNTEwNDMwLi41MjZkZGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2kyYy5oCisrKyBiL2luY2x1ZGUvbGludXgvaTJjLmgKQEAgLTk3LDEzICs5NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4IGNvbW1hbmQsIHUxNiB2YWx1ZSk7CiBleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAogCQkJCSAgICAgIHU4IGNvbW1hbmQsIHU4IGxlbmd0aCwKLQkJCQkgICAgICB1OCAqdmFsdWVzKTsKKwkJCQkgICAgICBjb25zdCB1OCAqdmFsdWVzKTsKIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiByZWFkIGJ5dGVzICovCiBleHRlcm4gczMyIGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICogY2xpZW50LAogCQkJCQkgdTggY29tbWFuZCwgdTggKnZhbHVlcyk7CiBleHRlcm4gczMyIGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqIGNsaWVudCwKIAkJCQkJICB1OCBjb21tYW5kLCB1OCBsZW5ndGgsCi0JCQkJCSAgdTggKnZhbHVlcyk7CisJCQkJCSAgY29uc3QgdTggKnZhbHVlcyk7CiAKIC8qCiAgKiBBIGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIG9uZSBvciBtb3JlIHBoeXNpY2FsIGRldmljZXMgcHJlc2VudCBvbgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZGUuaCBiL2luY2x1ZGUvbGludXgvaWRlLmgKaW5kZXggNzdlNjZkMC4uZWY3YmVmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkZS5oCkBAIC02MzAsNiArNjMwLDcgQEAKIAl1bnNpZ25lZCBpbnQJdXNhZ2U7CQkvKiBjdXJyZW50ICJvcGVuKCkiIGNvdW50IGZvciBkcml2ZSAqLwogCXVuc2lnbmVkIGludAlmYWlsdXJlczsJLyogY3VycmVudCBmYWlsdXJlIGNvdW50ICovCiAJdW5zaWduZWQgaW50CW1heF9mYWlsdXJlczsJLyogbWF4aW11bSBhbGxvd2VkIGZhaWx1cmUgY291bnQgKi8KKwl1NjQJCXByb2JlZF9jYXBhY2l0eTsvKiBpbml0aWFsIHJlcG9ydGVkIG1lZGlhIGNhcGFjaXR5IChpZGUtY2Qgb25seSBjdXJyZW50bHkpICovCiAKIAl1NjQJCWNhcGFjaXR5NjQ7CS8qIHRvdGFsIG51bWJlciBvZiBzZWN0b3JzICovCiAKQEAgLTEwMDUsNiArMTAwNiw4IEBACiBleHRlcm4gaW50IG5vYXV0b2RtYTsKIAogZXh0ZXJuIGludCBpZGVfZW5kX3JlcXVlc3QgKGlkZV9kcml2ZV90ICpkcml2ZSwgaW50IHVwdG9kYXRlLCBpbnQgbnJzZWNzKTsKK2ludCBpZGVfZW5kX2RlcXVldWVkX3JlcXVlc3QoaWRlX2RyaXZlX3QgKmRyaXZlLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCisJCQkgICAgIGludCB1cHRvZGF0ZSwgaW50IG5yX3NlY3RvcnMpOwogCiAvKgogICogVGhpcyBpcyB1c2VkIG9uIGV4aXQgZnJvbSB0aGUgZHJpdmVyIHRvIGRlc2lnbmF0ZSB0aGUgbmV4dCBpcnEgaGFuZGxlcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggOWUwZmVmZC4uNzA3NDFlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC03LDMyICs3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KIAotLyoKLSAqIEZvciAyLjQueCBjb21wYXRpYmlsaXR5LCAyLjQueCBjYW4gdXNlCi0gKgotICoJdHlwZWRlZiB2b2lkIGlycXJldHVybl90OwotICoJI2RlZmluZSBJUlFfTk9ORQotICoJI2RlZmluZSBJUlFfSEFORExFRAotICoJI2RlZmluZSBJUlFfUkVUVkFMKHgpCi0gKgotICogVG8gbWl4IG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGlycSBoYW5kbGVyIHJldHVybnMuCi0gKgotICogSVJRX05PTkUgbWVhbnMgd2UgZGlkbid0IGhhbmRsZSBpdC4KLSAqIElSUV9IQU5ETEVEIG1lYW5zIHRoYXQgd2UgZGlkIGhhdmUgYSB2YWxpZCBpbnRlcnJ1cHQgYW5kIGhhbmRsZWQgaXQuCi0gKiBJUlFfUkVUVkFMKHgpIHNlbGVjdHMgb24gdGhlIHR3byBkZXBlbmRpbmcgb24geCBiZWluZyBub24temVybyAoZm9yIGhhbmRsZWQpCi0gKi8KLXR5cGVkZWYgaW50IGlycXJldHVybl90OwotCi0jZGVmaW5lIElSUV9OT05FCSgwKQotI2RlZmluZSBJUlFfSEFORExFRAkoMSkKLSNkZWZpbmUgSVJRX1JFVFZBTCh4KQkoKHgpICE9IDApCi0KIHN0cnVjdCBpcnFhY3Rpb24gewogCWlycXJldHVybl90ICgqaGFuZGxlcikoaW50LCB2b2lkICosIHN0cnVjdCBwdF9yZWdzICopOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvYzQuaCBiL2luY2x1ZGUvbGludXgvaW9jNC5oCmluZGV4IDNkZDE4YjcuLmRlNzNhMzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW9jNC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9jNC5oCkBAIC0xNDcsNiArMTQ3LDEwIEBACiAjZGVmaW5lIElPQzRfR1BDUl9FREdFXzYgMHg0MAogI2RlZmluZSBJT0M0X0dQQ1JfRURHRV83IDB4ODAKIAorI2RlZmluZSBJT0M0X1ZBUklBTlRfSU85CTB4MDkwMAorI2RlZmluZSBJT0M0X1ZBUklBTlRfUENJX1JUCTB4MDkwMQorI2RlZmluZSBJT0M0X1ZBUklBTlRfSU8xMAkweDEwMDAKKwogLyogT25lIG9mIHRoZXNlIHBlciBJT0M0ICovCiBzdHJ1Y3QgaW9jNF9kcml2ZXJfZGF0YSB7CiAJc3RydWN0IGxpc3RfaGVhZCBpZGRfbGlzdDsKQEAgLTE1Niw2ICsxNjAsNyBAQAogCXN0cnVjdCBfX2lvbWVtIGlvYzRfbWlzY19yZWdzICppZGRfbWlzY19yZWdzOwogCXVuc2lnbmVkIGxvbmcgY291bnRfcGVyaW9kOwogCXZvaWQgKmlkZF9zZXJpYWxfZGF0YTsKKwl1bnNpZ25lZCBpbnQgaWRkX3ZhcmlhbnQ7CiB9OwogCiAvKiBPbmUgcGVyIHN1Ym1vZHVsZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggNDJjOWNkNS4uNjc2ZTAwZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFyZXR1cm4uaD4KIAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CkBAIC0xNjQsMTAgKzE2NSwxOCBAQAogCiAjZW5kaWYgLy8gQ09ORklHX1NNUAogCisjaWZkZWYgQ09ORklHX0lSUUJBTEFOQ0UKK2V4dGVybiB2b2lkIHNldF9iYWxhbmNlX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzayk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNldF9iYWxhbmNlX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFzaykKK3sKK30KKyNlbmRpZgorCiBleHRlcm4gaW50IG5vX2lycV9hZmZpbml0eTsKIGV4dGVybiBpbnQgbm9pcnFkZWJ1Z19zZXR1cChjaGFyICpzdHIpOwogCi1leHRlcm4gZmFzdGNhbGwgaW50IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCitleHRlcm4gZmFzdGNhbGwgaXJxcmV0dXJuX3QgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKIAkJCQkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKTsKIGV4dGVybiBmYXN0Y2FsbCB1bnNpZ25lZCBpbnQgX19kb19JUlEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogZXh0ZXJuIHZvaWQgbm90ZV9pbnRlcnJ1cHQodW5zaWduZWQgaW50IGlycSwgaXJxX2Rlc2NfdCAqZGVzYywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxcmV0dXJuLmggYi9pbmNsdWRlL2xpbnV4L2lycXJldHVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTg4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lycXJldHVybi5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qIGlycXJldHVybi5oICovCisjaWZuZGVmIF9MSU5VWF9JUlFSRVRVUk5fSAorI2RlZmluZSBfTElOVVhfSVJRUkVUVVJOX0gKKworLyoKKyAqIEZvciAyLjQueCBjb21wYXRpYmlsaXR5LCAyLjQueCBjYW4gdXNlCisgKgorICoJdHlwZWRlZiB2b2lkIGlycXJldHVybl90OworICoJI2RlZmluZSBJUlFfTk9ORQorICoJI2RlZmluZSBJUlFfSEFORExFRAorICoJI2RlZmluZSBJUlFfUkVUVkFMKHgpCisgKgorICogVG8gbWl4IG9sZC1zdHlsZSBhbmQgbmV3LXN0eWxlIGlycSBoYW5kbGVyIHJldHVybnMuCisgKgorICogSVJRX05PTkUgbWVhbnMgd2UgZGlkbid0IGhhbmRsZSBpdC4KKyAqIElSUV9IQU5ETEVEIG1lYW5zIHRoYXQgd2UgZGlkIGhhdmUgYSB2YWxpZCBpbnRlcnJ1cHQgYW5kIGhhbmRsZWQgaXQuCisgKiBJUlFfUkVUVkFMKHgpIHNlbGVjdHMgb24gdGhlIHR3byBkZXBlbmRpbmcgb24geCBiZWluZyBub24temVybyAoZm9yIGhhbmRsZWQpCisgKi8KK3R5cGVkZWYgaW50IGlycXJldHVybl90OworCisjZGVmaW5lIElSUV9OT05FCSgwKQorI2RlZmluZSBJUlFfSEFORExFRAkoMSkKKyNkZWZpbmUgSVJRX1JFVFZBTCh4KQkoKHgpICE9IDApCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQuaCBiL2luY2x1ZGUvbGludXgvamJkLmgKaW5kZXggNmE0MjVlMy4uMjBlYjM0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qYmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZC5oCkBAIC01MDEsNiArNTAxLDEyIEBACiAJc3RydWN0IGpvdXJuYWxfaGVhZAkqdF9jaGVja3BvaW50X2xpc3Q7CiAKIAkvKgorCSAqIERvdWJseS1saW5rZWQgY2lyY3VsYXIgbGlzdCBvZiBhbGwgYnVmZmVycyBzdWJtaXR0ZWQgZm9yIElPIHdoaWxlCisJICogY2hlY2twb2ludGluZy4gW2pfbGlzdF9sb2NrXQorCSAqLworCXN0cnVjdCBqb3VybmFsX2hlYWQJKnRfY2hlY2twb2ludF9pb19saXN0OworCisJLyoKIAkgKiBEb3VibHktbGlua2VkIGNpcmN1bGFyIGxpc3Qgb2YgdGVtcG9yYXJ5IGJ1ZmZlcnMgY3VycmVudGx5IHVuZGVyZ29pbmcKIAkgKiBJTyBpbiB0aGUgbG9nIFtqX2xpc3RfbG9ja10KIAkgKi8KQEAgLTg0OSw3ICs4NTUsNyBAQAogCiAvKiBDaGVja3BvaW50IGxpc3QgbWFuYWdlbWVudCAqLwogaW50IF9fam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3Qoam91cm5hbF90ICpqb3VybmFsKTsKLXZvaWQgX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CitpbnQgX19qb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKik7CiB2b2lkIF9fam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChzdHJ1Y3Qgam91cm5hbF9oZWFkICosIHRyYW5zYWN0aW9uX3QgKik7CiAKIC8qIEJ1ZmZlciBJTyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaCBiL2luY2x1ZGUvbGludXgva2VybmVsLmgKaW5kZXggZjRmYzU3Ni4uM2M1ZTRjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXJuZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbC5oCkBAIC0yNCw2ICsyNCw5IEBACiAjZGVmaW5lIExPTkdfTUFYCSgobG9uZykofjBVTD4+MSkpCiAjZGVmaW5lIExPTkdfTUlOCSgtTE9OR19NQVggLSAxKQogI2RlZmluZSBVTE9OR19NQVgJKH4wVUwpCisjZGVmaW5lIExMT05HX01BWAkoKGxvbmcgbG9uZykofjBVTEw+PjEpKQorI2RlZmluZSBMTE9OR19NSU4JKC1MTE9OR19NQVggLSAxKQorI2RlZmluZSBVTExPTkdfTUFYCSh+MFVMTCkKIAogI2RlZmluZSBTVEFDS19NQUdJQwkweGRlYWRiZWVmCiAKQEAgLTc1LDcgKzc4LDcgQEAKICMgZGVmaW5lIG1pZ2h0X3NsZWVwKCkgZG8geyBtaWdodF9yZXNjaGVkKCk7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2RlZmluZSBtaWdodF9zbGVlcF9pZihjb25kKSBkbyB7IGlmICh1bmxpa2VseShjb25kKSkgbWlnaHRfc2xlZXAoKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgbWlnaHRfc2xlZXBfaWYoY29uZCkgZG8geyBpZiAoY29uZCkgbWlnaHRfc2xlZXAoKTsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBhYnMoeCkgKHsJCQkJXAogCQlpbnQgX194ID0gKHgpOwkJCVwKQEAgLTExNCw2ICsxMTcsOCBAQAogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKIGV4dGVybiBpbnQgdnNjbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKIAlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDApKSk7CitleHRlcm4gY2hhciAqa2FzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwogCiBleHRlcm4gaW50IHNzY2FuZihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgLi4uKQogCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHNjYW5mLCAyLCAzKSkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXhlYy5oIGIvaW5jbHVkZS9saW51eC9rZXhlYy5oCmluZGV4IGNmYjM0MTAuLjY0Mjc5NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2V4ZWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleGVjLmgKQEAgLTEwNiw2ICsxMDYsNyBAQAogZXh0ZXJuIHZvaWQgY3Jhc2hfa2V4ZWMoc3RydWN0IHB0X3JlZ3MgKik7CiBpbnQga2V4ZWNfc2hvdWxkX2NyYXNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKIGV4dGVybiBzdHJ1Y3Qga2ltYWdlICprZXhlY19pbWFnZTsKK2V4dGVybiBzdHJ1Y3Qga2ltYWdlICprZXhlY19jcmFzaF9pbWFnZTsKIAogI2RlZmluZSBLRVhFQ19PTl9DUkFTSCAgMHgwMDAwMDAwMQogI2RlZmluZSBLRVhFQ19BUkNIX01BU0sgMHhmZmZmMDAwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXkuaCBiL2luY2x1ZGUvbGludXgva2V5LmgKaW5kZXggY2JmNDY0YS4uZTgxZWJmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rZXkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tleS5oCkBAIC0yMDUsNiArMjA1LDExIEBACiAJLyogbWF0Y2ggYSBrZXkgYWdhaW5zdCBhIGRlc2NyaXB0aW9uICovCiAJaW50ICgqbWF0Y2gpKGNvbnN0IHN0cnVjdCBrZXkgKmtleSwgY29uc3Qgdm9pZCAqZGVzYyk7CiAKKwkvKiBjbGVhciBzb21lIG9mIHRoZSBkYXRhIGZyb20gYSBrZXkgb24gcmV2b2thdGlvbiAob3B0aW9uYWwpCisJICogLSB0aGUga2V5J3Mgc2VtYXBob3JlIHdpbGwgYmUgd3JpdGUtbG9ja2VkIGJ5IHRoZSBjYWxsZXIKKwkgKi8KKwl2b2lkICgqcmV2b2tlKShzdHJ1Y3Qga2V5ICprZXkpOworCiAJLyogY2xlYXIgdGhlIGRhdGEgZnJvbSBhIGtleSAob3B0aW9uYWwpICovCiAJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBrZXkgKmtleSk7CiAKQEAgLTI0MSw4ICsyNDYsOSBAQAogCiBleHRlcm4gc3RydWN0IGtleSAqa2V5X2FsbG9jKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwKIAkJCSAgICAgY29uc3QgY2hhciAqZGVzYywKLQkJCSAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGtleV9wZXJtX3QgcGVybSwKLQkJCSAgICAgaW50IG5vdF9pbl9xdW90YSk7CisJCQkgICAgIHVpZF90IHVpZCwgZ2lkX3QgZ2lkLAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwKKwkJCSAgICAga2V5X3Blcm1fdCBwZXJtLCBpbnQgbm90X2luX3F1b3RhKTsKIGV4dGVybiBpbnQga2V5X3BheWxvYWRfcmVzZXJ2ZShzdHJ1Y3Qga2V5ICprZXksIHNpemVfdCBkYXRhbGVuKTsKIGV4dGVybiBpbnQga2V5X2luc3RhbnRpYXRlX2FuZF9saW5rKHN0cnVjdCBrZXkgKmtleSwKIAkJCQkgICAgY29uc3Qgdm9pZCAqZGF0YSwKQEAgLTI5Miw3ICsyOTgsOSBAQAogCQkgICAgICBzdHJ1Y3Qga2V5ICprZXkpOwogCiBleHRlcm4gc3RydWN0IGtleSAqa2V5cmluZ19hbGxvYyhjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgdWlkX3QgdWlkLCBnaWRfdCBnaWQsCi0JCQkJIGludCBub3RfaW5fcXVvdGEsIHN0cnVjdCBrZXkgKmRlc3QpOworCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCwKKwkJCQkgaW50IG5vdF9pbl9xdW90YSwKKwkJCQkgc3RydWN0IGtleSAqZGVzdCk7CiAKIGV4dGVybiBpbnQga2V5cmluZ19jbGVhcihzdHJ1Y3Qga2V5ICprZXlyaW5nKTsKIApAQCAtMzEzLDcgKzMyMSw4IEBACiAgKiB0aGUgdXNlcnNwYWNlIGludGVyZmFjZQogICovCiBleHRlcm4gc3RydWN0IGtleSByb290X3VzZXJfa2V5cmluZywgcm9vdF9zZXNzaW9uX2tleXJpbmc7Ci1leHRlcm4gaW50IGFsbG9jX3VpZF9rZXlyaW5nKHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlcik7CitleHRlcm4gaW50IGFsbG9jX3VpZF9rZXlyaW5nKHN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciwKKwkJCSAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpjdHgpOwogZXh0ZXJuIHZvaWQgc3dpdGNoX3VpZF9rZXlyaW5nKHN0cnVjdCB1c2VyX3N0cnVjdCAqbmV3X3VzZXIpOwogZXh0ZXJuIGludCBjb3B5X2tleXModW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogZXh0ZXJuIGludCBjb3B5X3RocmVhZF9ncm91cF9rZXlzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKQEAgLTM0Miw3ICszNTEsNyBAQAogI2RlZmluZSBtYWtlX2tleV9yZWYoaykJCQkoeyBOVUxMOyB9KQogI2RlZmluZSBrZXlfcmVmX3RvX3B0cihrKQkJKHsgTlVMTDsgfSkKICNkZWZpbmUgaXNfa2V5X3Bvc3Nlc3NlZChrKQkJMAotI2RlZmluZSBhbGxvY191aWRfa2V5cmluZyh1KQkJMAorI2RlZmluZSBhbGxvY191aWRfa2V5cmluZyh1LGMpCQkwCiAjZGVmaW5lIHN3aXRjaF91aWRfa2V5cmluZyh1KQkJZG8geyB9IHdoaWxlKDApCiAjZGVmaW5lIF9faW5zdGFsbF9zZXNzaW9uX2tleXJpbmcodCwgaykJKHsgTlVMTDsgfSkKICNkZWZpbmUgY29weV9rZXlzKGYsdCkJCQkwCkBAIC0zNTUsNiArMzY0LDEwIEBACiAjZGVmaW5lIGtleV9mc2dpZF9jaGFuZ2VkKHQpCQlkbyB7IH0gd2hpbGUoMCkKICNkZWZpbmUga2V5X2luaXQoKQkJCWRvIHsgfSB3aGlsZSgwKQogCisvKiBJbml0aWFsIGtleXJpbmdzICovCitleHRlcm4gc3RydWN0IGtleSByb290X3VzZXJfa2V5cmluZzsKK2V4dGVybiBzdHJ1Y3Qga2V5IHJvb3Rfc2Vzc2lvbl9rZXlyaW5nOworCiAjZW5kaWYgLyogQ09ORklHX0tFWVMgKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX0tFWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aHJlYWQuaCBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCmluZGV4IGViZGQ0MWYuLjdjY2U1ZGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RocmVhZC5oCisrKyBiL2luY2x1ZGUvbGludXgva3RocmVhZC5oCkBAIC00LDM3ICs0LDE5IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAotLyoqCi0gKiBrdGhyZWFkX2NyZWF0ZTogY3JlYXRlIGEga3RocmVhZC4KLSAqIEB0aHJlYWRmbjogdGhlIGZ1bmN0aW9uIHRvIHJ1biB1bnRpbCBzaWduYWxfcGVuZGluZyhjdXJyZW50KS4KLSAqIEBkYXRhOiBkYXRhIHB0ciBmb3IgQHRocmVhZGZuLgotICogQG5hbWVmbXQ6IHByaW50Zi1zdHlsZSBuYW1lIGZvciB0aGUgdGhyZWFkLgotICoKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGhlbHBlciBmdW5jdGlvbiBjcmVhdGVzIGFuZCBuYW1lcyBhIGtlcm5lbAotICogdGhyZWFkLiAgVGhlIHRocmVhZCB3aWxsIGJlIHN0b3BwZWQ6IHVzZSB3YWtlX3VwX3Byb2Nlc3MoKSB0byBzdGFydAotICogaXQuICBTZWUgYWxzbyBrdGhyZWFkX3J1bigpLCBrdGhyZWFkX2NyZWF0ZV9vbl9jcHUoKS4KLSAqCi0gKiBXaGVuIHdva2VuLCB0aGUgdGhyZWFkIHdpbGwgcnVuIEB0aHJlYWRmbigpIHdpdGggQGRhdGEgYXMgaXRzCi0gKiBhcmd1bWVudC4gQHRocmVhZGZuIGNhbiBlaXRoZXIgY2FsbCBkb19leGl0KCkgZGlyZWN0bHkgaWYgaXQgaXMgYQotICogc3RhbmRhbG9uZSB0aHJlYWQgZm9yIHdoaWNoIG5vb25lIHdpbGwgY2FsbCBrdGhyZWFkX3N0b3AoKSwgb3IKLSAqIHJldHVybiB3aGVuICdrdGhyZWFkX3Nob3VsZF9zdG9wKCknIGlzIHRydWUgKHdoaWNoIG1lYW5zCi0gKiBrdGhyZWFkX3N0b3AoKSBoYXMgYmVlbiBjYWxsZWQpLiAgVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgemVybwotICogb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXI6IGl0IHdpbGwgYmUgcGFzc2VkIHRvIGt0aHJlYWRfc3RvcCgpLgotICoKLSAqIFJldHVybnMgYSB0YXNrX3N0cnVjdCBvciBFUlJfUFRSKC1FTk9NRU0pLgotICovCiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0aHJlYWRfY3JlYXRlKGludCAoKnRocmVhZGZuKSh2b2lkICpkYXRhKSwKIAkJCQkgICB2b2lkICpkYXRhLAogCQkJCSAgIGNvbnN0IGNoYXIgbmFtZWZtdFtdLCAuLi4pOwogCiAvKioKLSAqIGt0aHJlYWRfcnVuOiBjcmVhdGUgYW5kIHdha2UgYSB0aHJlYWQuCisgKiBrdGhyZWFkX3J1biAtIGNyZWF0ZSBhbmQgd2FrZSBhIHRocmVhZC4KICAqIEB0aHJlYWRmbjogdGhlIGZ1bmN0aW9uIHRvIHJ1biB1bnRpbCBzaWduYWxfcGVuZGluZyhjdXJyZW50KS4KICAqIEBkYXRhOiBkYXRhIHB0ciBmb3IgQHRocmVhZGZuLgogICogQG5hbWVmbXQ6IHByaW50Zi1zdHlsZSBuYW1lIGZvciB0aGUgdGhyZWFkLgogICoKICAqIERlc2NyaXB0aW9uOiBDb252ZW5pZW50IHdyYXBwZXIgZm9yIGt0aHJlYWRfY3JlYXRlKCkgZm9sbG93ZWQgYnkKLSAqIHdha2VfdXBfcHJvY2VzcygpLiAgUmV0dXJucyB0aGUga3RocmVhZCwgb3IgRVJSX1BUUigtRU5PTUVNKS4gKi8KKyAqIHdha2VfdXBfcHJvY2VzcygpLiAgUmV0dXJucyB0aGUga3RocmVhZCBvciBFUlJfUFRSKC1FTk9NRU0pLgorICovCiAjZGVmaW5lIGt0aHJlYWRfcnVuKHRocmVhZGZuLCBkYXRhLCBuYW1lZm10LCAuLi4pCQkJICAgXAogKHsJCQkJCQkJCQkgICBcCiAJc3RydWN0IHRhc2tfc3RydWN0ICpfX2sJCQkJCQkgICBcCkBAIC00NCw1MCArMjYsOSBAQAogCV9fazsJCQkJCQkJCSAgIFwKIH0pCiAKLS8qKgotICoga3RocmVhZF9iaW5kOiBiaW5kIGEganVzdC1jcmVhdGVkIGt0aHJlYWQgdG8gYSBjcHUuCi0gKiBAazogdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KLSAqIEBjcHU6IGNwdSAobWlnaHQgbm90IGJlIG9ubGluZSwgbXVzdCBiZSBwb3NzaWJsZSkgZm9yIEBrIHRvIHJ1biBvbi4KLSAqCi0gKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldF9jcHVzX2FsbG93ZWQoKSwKLSAqIGV4Y2VwdCB0aGF0IEBjcHUgZG9lc24ndCBuZWVkIHRvIGJlIG9ubGluZSwgYW5kIHRoZSB0aHJlYWQgbXVzdCBiZQotICogc3RvcHBlZCAoaWUuIGp1c3QgcmV0dXJuZWQgZnJvbSBrdGhyZWFkX2NyZWF0ZSgpLgotICovCiB2b2lkIGt0aHJlYWRfYmluZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmssIHVuc2lnbmVkIGludCBjcHUpOwotCi0vKioKLSAqIGt0aHJlYWRfc3RvcDogc3RvcCBhIHRocmVhZCBjcmVhdGVkIGJ5IGt0aHJlYWRfY3JlYXRlKCkuCi0gKiBAazogdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KLSAqCi0gKiBTZXRzIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBmb3IgQGsgdG8gcmV0dXJuIHRydWUsIHdha2VzIGl0LCBhbmQKLSAqIHdhaXRzIGZvciBpdCB0byBleGl0LiAgWW91ciB0aHJlYWRmbigpIG11c3Qgbm90IGNhbGwgZG9fZXhpdCgpCi0gKiBpdHNlbGYgaWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uISAgVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgYWZ0ZXIKLSAqIGt0aHJlYWRfY3JlYXRlKCkgaW5zdGVhZCBvZiBjYWxsaW5nIHdha2VfdXBfcHJvY2VzcygpOiB0aGUgdGhyZWFkCi0gKiB3aWxsIGV4aXQgd2l0aG91dCBjYWxsaW5nIHRocmVhZGZuKCkuCi0gKgotICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRocmVhZGZuKCksIG9yIC1FSU5UUiBpZiB3YWtlX3VwX3Byb2Nlc3MoKQotICogd2FzIG5ldmVyIGNhbGxlZC4gKi8KIGludCBrdGhyZWFkX3N0b3Aoc3RydWN0IHRhc2tfc3RydWN0ICprKTsKLQotLyoqCi0gKiBrdGhyZWFkX3N0b3Bfc2VtOiBzdG9wIGEgdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KLSAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgotICogQHM6IHNlbWFwaG9yZSB0aGF0IEBrIHdhaXRzIG9uIHdoaWxlIGlkbGUuCi0gKgotICogRG9lcyBlc3NlbnRpYWxseSB0aGUgc2FtZSB0aGluZyBhcyBrdGhyZWFkX3N0b3AoKSBhYm92ZSwgYnV0IHdha2VzCi0gKiBAayBieSBjYWxsaW5nIHVwKEBzKS4KLSAqCi0gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhyZWFkZm4oKSwgb3IgLUVJTlRSIGlmIHdha2VfdXBfcHJvY2VzcygpCi0gKiB3YXMgbmV2ZXIgY2FsbGVkLiAqLwogaW50IGt0aHJlYWRfc3RvcF9zZW0oc3RydWN0IHRhc2tfc3RydWN0ICprLCBzdHJ1Y3Qgc2VtYXBob3JlICpzKTsKLQotLyoqCi0gKiBrdGhyZWFkX3Nob3VsZF9zdG9wOiBzaG91bGQgdGhpcyBrdGhyZWFkIHJldHVybiBub3c/Ci0gKgotICogV2hlbiBzb21lb25lIGNhbGxzIGt0aHJlYWRfc3RvcCBvbiB5b3VyIGt0aHJlYWQsIGl0IHdpbGwgYmUgd29rZW4KLSAqIGFuZCB0aGlzIHdpbGwgcmV0dXJuIHRydWUuICBZb3Ugc2hvdWxkIHRoZW4gcmV0dXJuLCBhbmQgeW91ciByZXR1cm4KLSAqIHZhbHVlIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8ga3RocmVhZF9zdG9wKCkuCi0gKi8KIGludCBrdGhyZWFkX3Nob3VsZF9zdG9wKHZvaWQpOwogCiAjZW5kaWYgLyogX0xJTlVYX0tUSFJFQURfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdGltZS5oIGIvaW5jbHVkZS9saW51eC9rdGltZS5oCmluZGV4IDYyYmM1NzUuLmVkMzM5NmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3RpbWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKQEAgLTY2LDcgKzY2LDYgQEAKIAogLyoqCiAgKiBrdGltZV9zZXQgLSBTZXQgYSBrdGltZV90IHZhcmlhYmxlIGZyb20gYSBzZWNvbmRzL25hbm9zZWNvbmRzIHZhbHVlCi0gKgogICogQHNlY3M6CXNlY29uZHMgdG8gc2V0CiAgKiBAbnNlY3M6CW5hbm9zZWNvbmRzIHRvIHNldAogICoKQEAgLTEzOCw3ICsxMzcsNiBAQAogCiAvKioKICAqIGt0aW1lX3N1YiAtIHN1YnRyYWN0IHR3byBrdGltZV90IHZhcmlhYmxlcwotICoKICAqIEBsaHM6CW1pbnVlbmQKICAqIEByaHM6CXN1YnRyYWhlbmQKICAqCkBAIC0xNTcsNyArMTU1LDYgQEAKIAogLyoqCiAgKiBrdGltZV9hZGQgLSBhZGQgdHdvIGt0aW1lX3QgdmFyaWFibGVzCi0gKgogICogQGFkZDE6CWFkZGVuZDEKICAqIEBhZGQyOglhZGRlbmQyCiAgKgpAQCAtMTg0LDcgKzE4MSw2IEBACiAKIC8qKgogICoga3RpbWVfYWRkX25zIC0gQWRkIGEgc2NhbGFyIG5hbm9zZWNvbmRzIHZhbHVlIHRvIGEga3RpbWVfdCB2YXJpYWJsZQotICoKICAqIEBrdDoJCWFkZGVuZAogICogQG5zZWM6CXRoZSBzY2FsYXIgbnNlYyB2YWx1ZSB0byBhZGQKICAqCkBAIC0xOTQsNyArMTkwLDYgQEAKIAogLyoqCiAgKiB0aW1lc3BlY190b19rdGltZSAtIGNvbnZlcnQgYSB0aW1lc3BlYyB0byBrdGltZV90IGZvcm1hdAotICoKICAqIEB0czoJCXRoZSB0aW1lc3BlYyB2YXJpYWJsZSB0byBjb252ZXJ0CiAgKgogICogUmV0dXJucyBhIGt0aW1lX3QgdmFyaWFibGUgd2l0aCB0aGUgY29udmVydGVkIHRpbWVzcGVjIHZhbHVlCkBAIC0yMDcsNyArMjAyLDYgQEAKIAogLyoqCiAgKiB0aW1ldmFsX3RvX2t0aW1lIC0gY29udmVydCBhIHRpbWV2YWwgdG8ga3RpbWVfdCBmb3JtYXQKLSAqCiAgKiBAdHY6CQl0aGUgdGltZXZhbCB2YXJpYWJsZSB0byBjb252ZXJ0CiAgKgogICogUmV0dXJucyBhIGt0aW1lX3QgdmFyaWFibGUgd2l0aCB0aGUgY29udmVydGVkIHRpbWV2YWwgdmFsdWUKQEAgLTIyMCw3ICsyMTQsNiBAQAogCiAvKioKICAqIGt0aW1lX3RvX3RpbWVzcGVjIC0gY29udmVydCBhIGt0aW1lX3QgdmFyaWFibGUgdG8gdGltZXNwZWMgZm9ybWF0Ci0gKgogICogQGt0OgkJdGhlIGt0aW1lX3QgdmFyaWFibGUgdG8gY29udmVydAogICoKICAqIFJldHVybnMgdGhlIHRpbWVzcGVjIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrdGltZSB2YWx1ZQpAQCAtMjMzLDcgKzIyNiw2IEBACiAKIC8qKgogICoga3RpbWVfdG9fdGltZXZhbCAtIGNvbnZlcnQgYSBrdGltZV90IHZhcmlhYmxlIHRvIHRpbWV2YWwgZm9ybWF0Ci0gKgogICogQGt0OgkJdGhlIGt0aW1lX3QgdmFyaWFibGUgdG8gY29udmVydAogICoKICAqIFJldHVybnMgdGhlIHRpbWV2YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGt0aW1lIHZhbHVlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCBiODBkMmU3Li4yMGIxY2Y1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxsaW51eC9hdGEuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCiAvKgogICogY29tcGlsZS10aW1lIG9wdGlvbnM6IHRvIGJlIHJlbW92ZWQgYXMgc29vbiBhcyBhbGwgdGhlIGRyaXZlcnMgYXJlCkBAIC00NCw3ICs0NSw2IEBACiAjdW5kZWYgQVRBX05ERUJVRwkJLyogZGVmaW5lIHRvIGRpc2FibGUgcXVpY2sgcnVudGltZSBjaGVja3MgKi8KICN1bmRlZiBBVEFfRU5BQkxFX1BBVEEJCS8qIGRlZmluZSB0byBlbmFibGUgUEFUQSBzdXBwb3J0IGluIHNvbWUKIAkJCQkgKiBsb3ctbGV2ZWwgZHJpdmVycyAqLwotI3VuZGVmIEFUQVBJX0VOQUJMRV9ETUFESVIJLyogZW5hYmxlcyBBVEFQSSBETUFESVIgYnJpZGdlIHN1cHBvcnQgKi8KIAogCiAvKiBub3RlOiBwcmludHMgZnVuY3Rpb24gbmFtZSBmb3IgeW91ICovCkBAIC0xMDgsOCArMTA4LDExIEBACiAJTElCQVRBX01BWF9QUkQJCT0gQVRBX01BWF9QUkQgLyAyLAogCUFUQV9NQVhfUE9SVFMJCT0gOCwKIAlBVEFfREVGX1FVRVVFCQk9IDEsCi0JQVRBX01BWF9RVUVVRQkJPSAxLAorCS8qIHRhZyBBVEFfTUFYX1FVRVVFIC0gMSBpcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgY29tbWFuZHMgKi8KKwlBVEFfTUFYX1FVRVVFCQk9IDMyLAorCUFUQV9UQUdfSU5URVJOQUwJPSBBVEFfTUFYX1FVRVVFIC0gMSwKIAlBVEFfTUFYX1NFQ1RPUlMJCT0gMjAwLAkvKiBGSVhNRSAqLworCUFUQV9NQVhfU0VDVE9SU19MQkE0OAk9IDY1NTM1LAogCUFUQV9NQVhfQlVTCQk9IDIsCiAJQVRBX0RFRl9CVVNZX1dBSVQJPSAxMDAwMCwKIAlBVEFfU0hPUlRfUEFVU0UJCT0gKEhaID4+IDYpICsgMSwKQEAgLTEyMCw5ICsxMjMsMTcgQEAKIAlBVEFfU0hUX1VTRV9DTFVTVEVSSU5HCT0gMSwKIAogCS8qIHN0cnVjdCBhdGFfZGV2aWNlIHN0dWZmICovCi0JQVRBX0RGTEFHX0xCQTQ4CQk9ICgxIDw8IDApLCAvKiBkZXZpY2Ugc3VwcG9ydHMgTEJBNDggKi8KLQlBVEFfREZMQUdfUElPCQk9ICgxIDw8IDEpLCAvKiBkZXZpY2UgY3VycmVudGx5IGluIFBJTyBtb2RlICovCi0JQVRBX0RGTEFHX0xCQQkJPSAoMSA8PCAyKSwgLyogZGV2aWNlIHN1cHBvcnRzIExCQSAqLworCUFUQV9ERkxBR19MQkEJCT0gKDEgPDwgMCksIC8qIGRldmljZSBzdXBwb3J0cyBMQkEgKi8KKwlBVEFfREZMQUdfTEJBNDgJCT0gKDEgPDwgMSksIC8qIGRldmljZSBzdXBwb3J0cyBMQkE0OCAqLworCUFUQV9ERkxBR19DREJfSU5UUgk9ICgxIDw8IDIpLCAvKiBkZXZpY2UgYXNzZXJ0cyBJTlRSUSB3aGVuIHJlYWR5IGZvciBDREIgKi8KKwlBVEFfREZMQUdfTkNRCQk9ICgxIDw8IDMpLCAvKiBkZXZpY2Ugc3VwcG9ydHMgTkNRICovCisJQVRBX0RGTEFHX0NGR19NQVNLCT0gKDEgPDwgOCkgLSAxLAorCisJQVRBX0RGTEFHX1BJTwkJPSAoMSA8PCA4KSwgLyogZGV2aWNlIGN1cnJlbnRseSBpbiBQSU8gbW9kZSAqLworCUFUQV9ERkxBR19JTklUX01BU0sJPSAoMSA8PCAxNikgLSAxLAorCisJQVRBX0RGTEFHX0RFVEFDSAk9ICgxIDw8IDE2KSwKKwlBVEFfREZMQUdfREVUQUNIRUQJPSAoMSA8PCAxNyksCiAKIAlBVEFfREVWX1VOS05PV04JCT0gMCwJLyogdW5rbm93biBkZXZpY2UgKi8KIAlBVEFfREVWX0FUQQkJPSAxLAkvKiBBVEEgZGV2aWNlICovCkBAIC0xMzIsNDMgKzE0Myw1NyBAQAogCUFUQV9ERVZfTk9ORQkJPSA1LAkvKiBubyBkZXZpY2UgKi8KIAogCS8qIHN0cnVjdCBhdGFfcG9ydCBmbGFncyAqLwotCUFUQV9GTEFHX1NMQVZFX1BPU1MJPSAoMSA8PCAxKSwgLyogaG9zdCBzdXBwb3J0cyBzbGF2ZSBkZXYgKi8KKwlBVEFfRkxBR19TTEFWRV9QT1NTCT0gKDEgPDwgMCksIC8qIGhvc3Qgc3VwcG9ydHMgc2xhdmUgZGV2ICovCiAJCQkJCSAgICAvKiAoZG9lc24ndCBpbXBseSBwcmVzZW5jZSkgKi8KLQlBVEFfRkxBR19QT1JUX0RJU0FCTEVECT0gKDEgPDwgMiksIC8qIHBvcnQgaXMgZGlzYWJsZWQsIGlnbm9yZSBpdCAqLwotCUFUQV9GTEFHX1NBVEEJCT0gKDEgPDwgMyksCi0JQVRBX0ZMQUdfTk9fTEVHQUNZCT0gKDEgPDwgNCksIC8qIG5vIGxlZ2FjeSBtb2RlIGNoZWNrICovCi0JQVRBX0ZMQUdfU1JTVAkJPSAoMSA8PCA1KSwgLyogKG9ic29sZXRlKSB1c2UgQVRBIFNSU1QsIG5vdCBFLkQuRC4gKi8KLQlBVEFfRkxBR19NTUlPCQk9ICgxIDw8IDYpLCAvKiB1c2UgTU1JTywgbm90IFBJTyAqLwotCUFUQV9GTEFHX1NBVEFfUkVTRVQJPSAoMSA8PCA3KSwgLyogKG9ic29sZXRlKSB1c2UgQ09NUkVTRVQgKi8KLQlBVEFfRkxBR19QSU9fRE1BCT0gKDEgPDwgOCksIC8qIFBJTyBjbWRzIHZpYSBETUEgKi8KLQlBVEFfRkxBR19OT0lOVFIJCT0gKDEgPDwgOSksIC8qIEZJWE1FOiBSZW1vdmUgdGhpcyBvbmNlCi0JCQkJCSAgICAgKiBwcm9wZXIgSFNNIGlzIGluIHBsYWNlLiAqLwotCUFUQV9GTEFHX0RFQlVHTVNHCT0gKDEgPDwgMTApLAotCUFUQV9GTEFHX05PX0FUQVBJCT0gKDEgPDwgMTEpLCAvKiBObyBBVEFQSSBzdXBwb3J0ICovCisJQVRBX0ZMQUdfU0FUQQkJPSAoMSA8PCAxKSwKKwlBVEFfRkxBR19OT19MRUdBQ1kJPSAoMSA8PCAyKSwgLyogbm8gbGVnYWN5IG1vZGUgY2hlY2sgKi8KKwlBVEFfRkxBR19NTUlPCQk9ICgxIDw8IDMpLCAvKiB1c2UgTU1JTywgbm90IFBJTyAqLworCUFUQV9GTEFHX1NSU1QJCT0gKDEgPDwgNCksIC8qIChvYnNvbGV0ZSkgdXNlIEFUQSBTUlNULCBub3QgRS5ELkQuICovCisJQVRBX0ZMQUdfU0FUQV9SRVNFVAk9ICgxIDw8IDUpLCAvKiAob2Jzb2xldGUpIHVzZSBDT01SRVNFVCAqLworCUFUQV9GTEFHX05PX0FUQVBJCT0gKDEgPDwgNiksIC8qIE5vIEFUQVBJIHN1cHBvcnQgKi8KKwlBVEFfRkxBR19QSU9fRE1BCT0gKDEgPDwgNyksIC8qIFBJTyBjbWRzIHZpYSBETUEgKi8KKwlBVEFfRkxBR19QSU9fTEJBNDgJPSAoMSA8PCA4KSwgLyogSG9zdCBETUEgZW5naW5lIGlzIExCQTI4IG9ubHkgKi8KKwlBVEFfRkxBR19QSU9fUE9MTElORwk9ICgxIDw8IDkpLCAvKiB1c2UgcG9sbGluZyBQSU8gaWYgTExECisJCQkJCSAgICAgKiBkb2Vzbid0IGhhbmRsZSBQSU8gaW50ZXJydXB0cyAqLworCUFUQV9GTEFHX05DUQkJPSAoMSA8PCAxMCksIC8qIGhvc3Qgc3VwcG9ydHMgTkNRICovCisJQVRBX0ZMQUdfSFJTVF9UT19SRVNVTUUJPSAoMSA8PCAxMSksIC8qIGhhcmRyZXNldCB0byByZXN1bWUgcGh5ICovCisJQVRBX0ZMQUdfU0tJUF9EMkhfQlNZCT0gKDEgPDwgMTIpLCAvKiBjYW4ndCB3YWl0IGZvciB0aGUgZmlyc3QgRDJICisJCQkJCSAgICAgICogUmVnaXN0ZXIgRklTIGNsZWFyaW5nIEJTWSAqLwogCi0JQVRBX0ZMQUdfU1VTUEVOREVECT0gKDEgPDwgMTIpLCAvKiBwb3J0IGlzIHN1c3BlbmRlZCAqLworCUFUQV9GTEFHX0RFQlVHTVNHCT0gKDEgPDwgMTMpLAorCUFUQV9GTEFHX0ZMVVNIX1BPUlRfVEFTSyA9ICgxIDw8IDE0KSwgLyogZmx1c2ggcG9ydCB0YXNrICovCiAKLQlBVEFfRkxBR19QSU9fTEJBNDgJPSAoMSA8PCAxMyksIC8qIEhvc3QgRE1BIGVuZ2luZSBpcyBMQkEyOCBvbmx5ICovCi0JQVRBX0ZMQUdfSVJRX01BU0sJPSAoMSA8PCAxNCksIC8qIE1hc2sgSVJRIGluIFBJTyB4ZmVycyAqLworCUFUQV9GTEFHX0VIX1BFTkRJTkcJPSAoMSA8PCAxNSksIC8qIEVIIHBlbmRpbmcgKi8KKwlBVEFfRkxBR19FSF9JTl9QUk9HUkVTUwk9ICgxIDw8IDE2KSwgLyogRUggaW4gcHJvZ3Jlc3MgKi8KKwlBVEFfRkxBR19GUk9aRU4JCT0gKDEgPDwgMTcpLCAvKiBwb3J0IGlzIGZyb3plbiAqLworCUFUQV9GTEFHX1JFQ09WRVJFRAk9ICgxIDw8IDE4KSwgLyogcmVjb3ZlcnkgYWN0aW9uIHBlcmZvcm1lZCAqLworCUFUQV9GTEFHX0xPQURJTkcJPSAoMSA8PCAxOSksIC8qIGJvb3QvbG9hZGluZyBwcm9iZSAqLworCUFUQV9GTEFHX1VOTE9BRElORwk9ICgxIDw8IDIwKSwgLyogbW9kdWxlIGlzIHVubG9hZGluZyAqLworCUFUQV9GTEFHX1NDU0lfSE9UUExVRwk9ICgxIDw8IDIxKSwgLyogU0NTSSBob3RwbHVnIHNjaGVkdWxlZCAqLwogCi0JQVRBX0ZMQUdfRkxVU0hfUE9SVF9UQVNLID0gKDEgPDwgMTUpLCAvKiBGbHVzaCBwb3J0IHRhc2sgKi8KLQlBVEFfRkxBR19JTl9FSAkJPSAoMSA8PCAxNiksIC8qIEVIIGluIHByb2dyZXNzICovCisJQVRBX0ZMQUdfRElTQUJMRUQJPSAoMSA8PCAyMiksIC8qIHBvcnQgaXMgZGlzYWJsZWQsIGlnbm9yZSBpdCAqLworCUFUQV9GTEFHX1NVU1BFTkRFRAk9ICgxIDw8IDIzKSwgLyogcG9ydCBpcyBzdXNwZW5kZWQgKHBvd2VyKSAqLwogCi0JQVRBX1FDRkxBR19BQ1RJVkUJPSAoMSA8PCAxKSwgLyogY21kIG5vdCB5ZXQgYWNrJ2QgdG8gc2NzaSBseWVyICovCi0JQVRBX1FDRkxBR19TRwkJPSAoMSA8PCAzKSwgLyogaGF2ZSBzL2cgdGFibGU/ICovCi0JQVRBX1FDRkxBR19TSU5HTEUJPSAoMSA8PCA0KSwgLyogbm8gcy9nLCBqdXN0IGEgc2luZ2xlIGJ1ZmZlciAqLworCS8qIGJpdHMgMjQ6MzEgb2YgYXAtPmZsYWdzIGFyZSByZXNlcnZlZCBmb3IgTExERCBzcGVjaWZpYyBmbGFncyAqLworCisJLyogc3RydWN0IGF0YV9xdWV1ZWRfY21kIGZsYWdzICovCisJQVRBX1FDRkxBR19BQ1RJVkUJPSAoMSA8PCAwKSwgLyogY21kIG5vdCB5ZXQgYWNrJ2QgdG8gc2NzaSBseWVyICovCisJQVRBX1FDRkxBR19TRwkJPSAoMSA8PCAxKSwgLyogaGF2ZSBzL2cgdGFibGU/ICovCisJQVRBX1FDRkxBR19TSU5HTEUJPSAoMSA8PCAyKSwgLyogbm8gcy9nLCBqdXN0IGEgc2luZ2xlIGJ1ZmZlciAqLwogCUFUQV9RQ0ZMQUdfRE1BTUFQCT0gQVRBX1FDRkxBR19TRyB8IEFUQV9RQ0ZMQUdfU0lOR0xFLAotCUFUQV9RQ0ZMQUdfRUhfU0NIRURVTEVEID0gKDEgPDwgNSksIC8qIEVIIHNjaGVkdWxlZCAqLworCUFUQV9RQ0ZMQUdfSU8JCT0gKDEgPDwgMyksIC8qIHN0YW5kYXJkIElPIGNvbW1hbmQgKi8KKwlBVEFfUUNGTEFHX1JFU1VMVF9URgk9ICgxIDw8IDQpLCAvKiByZXN1bHQgVEYgcmVxdWVzdGVkICovCisKKwlBVEFfUUNGTEFHX0ZBSUxFRAk9ICgxIDw8IDE2KSwgLyogY21kIGZhaWxlZCBhbmQgaXMgb3duZWQgYnkgRUggKi8KKwlBVEFfUUNGTEFHX1NFTlNFX1ZBTElECT0gKDEgPDwgMTcpLCAvKiBzZW5zZSBkYXRhIHZhbGlkICovCisJQVRBX1FDRkxBR19FSF9TQ0hFRFVMRUQgPSAoMSA8PCAxOCksIC8qIEVIIHNjaGVkdWxlZCAob2Jzb2xldGUpICovCiAKIAkvKiBob3N0IHNldCBmbGFncyAqLwogCUFUQV9IT1NUX1NJTVBMRVgJPSAoMSA8PCAwKSwJLyogSG9zdCBpcyBzaW1wbGV4LCBvbmUgRE1BIGNoYW5uZWwgcGVyIGhvc3Rfc2V0IG9ubHkgKi8KIAkKIAkvKiB2YXJpb3VzIGxlbmd0aHMgb2YgdGltZSAqLwotCUFUQV9UTU9VVF9QSU8JCT0gMzAgKiBIWiwKIAlBVEFfVE1PVVRfQk9PVAkJPSAzMCAqIEhaLAkvKiBoZXVyaXN0aWMgKi8KIAlBVEFfVE1PVVRfQk9PVF9RVUlDSwk9IDcgKiBIWiwJLyogaGV1cmlzdGljICovCi0JQVRBX1RNT1VUX0NEQgkJPSAzMCAqIEhaLAotCUFUQV9UTU9VVF9DREJfUVVJQ0sJPSA1ICogSFosCiAJQVRBX1RNT1VUX0lOVEVSTkFMCT0gMzAgKiBIWiwKIAlBVEFfVE1PVVRfSU5URVJOQUxfUVVJQ0sgPSA1ICogSFosCiAKQEAgLTIwNywyMSArMjMyLDU2IEBACiAJLyogc2l6ZSBvZiBidWZmZXIgdG8gcGFkIHhmZXJzIGVuZGluZyBvbiB1bmFsaWduZWQgYm91bmRhcmllcyAqLwogCUFUQV9ETUFfUEFEX1NaCQk9IDQsCiAJQVRBX0RNQV9QQURfQlVGX1NaCT0gQVRBX0RNQV9QQURfU1ogKiBBVEFfTUFYX1FVRVVFLAotCQotCS8qIE1hc2tzIGZvciBwb3J0IGZ1bmN0aW9ucyAqLworCisJLyogbWFza3MgZm9yIHBvcnQgZnVuY3Rpb25zICovCiAJQVRBX1BPUlRfUFJJTUFSWQk9ICgxIDw8IDApLAogCUFUQV9QT1JUX1NFQ09OREFSWQk9ICgxIDw8IDEpLAorCisJLyogZXJpbmcgc2l6ZSAqLworCUFUQV9FUklOR19TSVpFCQk9IDMyLAorCisJLyogZGVzY19sZW4gZm9yIGF0YV9laF9pbmZvIGFuZCBjb250ZXh0ICovCisJQVRBX0VIX0RFU0NfTEVOCQk9IDgwLAorCisJLyogcmVzZXQgLyByZWNvdmVyeSBhY3Rpb24gdHlwZXMgKi8KKwlBVEFfRUhfUkVWQUxJREFURQk9ICgxIDw8IDApLAorCUFUQV9FSF9TT0ZUUkVTRVQJPSAoMSA8PCAxKSwKKwlBVEFfRUhfSEFSRFJFU0VUCT0gKDEgPDwgMiksCisKKwlBVEFfRUhfUkVTRVRfTUFTSwk9IEFUQV9FSF9TT0ZUUkVTRVQgfCBBVEFfRUhfSEFSRFJFU0VULAorCUFUQV9FSF9QRVJERVZfTUFTSwk9IEFUQV9FSF9SRVZBTElEQVRFLAorCisJLyogYXRhX2VoX2luZm8tPmZsYWdzICovCisJQVRBX0VISV9IT1RQTFVHR0VECT0gKDEgPDwgMCksICAvKiBjb3VsZCBoYXZlIGJlZW4gaG90cGx1Z2dlZCAqLworCisJQVRBX0VISV9ESURfUkVTRVQJPSAoMSA8PCAxNiksIC8qIGFscmVhZHkgcmVzZXQgdGhpcyBwb3J0ICovCisKKwkvKiBtYXggcmVwZWF0IGlmIGVycm9yIGNvbmRpdGlvbiBpcyBzdGlsbCBzZXQgYWZ0ZXIgLT5lcnJvcl9oYW5kbGVyICovCisJQVRBX0VIX01BWF9SRVBFQVQJPSA1LAorCisJLyogaG93IGhhcmQgYXJlIHdlIGdvbm5hIHRyeSB0byBwcm9iZS9yZWNvdmVyIGRldmljZXMgKi8KKwlBVEFfUFJPQkVfTUFYX1RSSUVTCT0gMywKKwlBVEFfRUhfUkVTRVRfVFJJRVMJPSAzLAorCUFUQV9FSF9ERVZfVFJJRVMJPSAzLAorCisJLyogRHJpdmUgc3BpbnVwIHRpbWUgKHRpbWUgZnJvbSBwb3dlci1vbiB0byB0aGUgZmlyc3QgRDJIIEZJUykKKwkgKiBpbiBtc2VjcyAtIDhzIGN1cnJlbnRseS4gIEZhaWxpbmcgdG8gZ2V0IHJlYWR5IGluIHRoaXMgdGltZQorCSAqIGlzbid0IGNyaXRpY2FsLiAgSXQgd2lsbCByZXN1bHQgaW4gcmVzZXQgZmFpbHVyZSBmb3IKKwkgKiBjb250cm9sbGVycyB3aGljaCBjYW4ndCB3YWl0IGZvciB0aGUgZmlyc3QgRDJIIEZJUy4gIGxpYmF0YQorCSAqIHdpbGwgcmV0cnksIHNvIGl0IGp1c3QgaGFzIHRvIGJlIGxvbmcgZW5vdWdoIHRvIHNwaW4gdXAKKwkgKiBtb3N0IGRldmljZXMuCisJICovCisJQVRBX1NQSU5VUF9XQUlUCQk9IDgwMDAsCiB9OwogCiBlbnVtIGhzbV90YXNrX3N0YXRlcyB7Ci0JSFNNX1NUX1VOS05PV04sCi0JSFNNX1NUX0lETEUsCi0JSFNNX1NUX1BPTEwsCi0JSFNNX1NUX1RNT1VULAotCUhTTV9TVCwKLQlIU01fU1RfTEFTVCwKLQlIU01fU1RfTEFTVF9QT0xMLAotCUhTTV9TVF9FUlIsCisJSFNNX1NUX1VOS05PV04sCQkvKiBzdGF0ZSB1bmtub3duICovCisJSFNNX1NUX0lETEUsCQkvKiBubyBjb21tYW5kIG9uIGdvaW5nICovCisJSFNNX1NULAkJCS8qICh3YWl0aW5nIHRoZSBkZXZpY2UgdG8pIHRyYW5zZmVyIGRhdGEgKi8KKwlIU01fU1RfTEFTVCwJCS8qICh3YWl0aW5nIHRoZSBkZXZpY2UgdG8pIGNvbXBsZXRlIGNvbW1hbmQgKi8KKwlIU01fU1RfRVJSLAkJLyogZXJyb3IgKi8KKwlIU01fU1RfRklSU1QsCQkvKiAod2FpdGluZyB0aGUgZGV2aWNlIHRvKQorCQkJCSAgIHdyaXRlIENEQiBvciBmaXJzdCBkYXRhIGJsb2NrICovCiB9OwogCiBlbnVtIGF0YV9jb21wbGV0aW9uX2Vycm9ycyB7CkBAIC0yNDQsOSArMzA0LDkgQEAKIAogLyogdHlwZWRlZnMgKi8KIHR5cGVkZWYgdm9pZCAoKmF0YV9xY19jYl90KSAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7Ci10eXBlZGVmIHZvaWQgKCphdGFfcHJvYmVpbml0X2ZuX3QpKHN0cnVjdCBhdGFfcG9ydCAqKTsKLXR5cGVkZWYgaW50ICgqYXRhX3Jlc2V0X2ZuX3QpKHN0cnVjdCBhdGFfcG9ydCAqLCBpbnQsIHVuc2lnbmVkIGludCAqKTsKLXR5cGVkZWYgdm9pZCAoKmF0YV9wb3N0cmVzZXRfZm5fdCkoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICopOwordHlwZWRlZiBpbnQgKCphdGFfcHJlcmVzZXRfZm5fdCkoc3RydWN0IGF0YV9wb3J0ICphcCk7Cit0eXBlZGVmIGludCAoKmF0YV9yZXNldF9mbl90KShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bvc3RyZXNldF9mbl90KShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOwogCiBzdHJ1Y3QgYXRhX2lvcG9ydHMgewogCXVuc2lnbmVkIGxvbmcJCWNtZF9hZGRyOwpAQCAtMjk3LDcgKzM1Nyw4IEBACiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CiAJaW50CQkJc2ltcGxleF9jbGFpbWVkOwkvKiBLZWVwIHNlcGVyYXRlIGluIGNhc2Ugd2UKIAkJCQkJCQkgICBldmVyIG5lZWQgdG8gZG8gdGhpcyBsb2NrZWQgKi8KLQlzdHJ1Y3QgYXRhX3BvcnQgKglwb3J0c1swXTsKKwlzdHJ1Y3QgYXRhX2hvc3Rfc2V0CSpuZXh0OwkJLyogZm9yIGxlZ2FjeSBtb2RlICovCisJc3RydWN0IGF0YV9wb3J0CQkqcG9ydHNbMF07CiB9OwogCiBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgewpAQCAtMzM2LDcgKzM5Nyw3IEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0CSpfX3NnOwogCiAJdW5zaWduZWQgaW50CQllcnJfbWFzazsKLQorCXN0cnVjdCBhdGFfdGFza2ZpbGUJcmVzdWx0X3RmOwogCWF0YV9xY19jYl90CQljb21wbGV0ZV9mbjsKIAogCXZvaWQJCQkqcHJpdmF0ZV9kYXRhOwpAQCAtMzQ4LDEyICs0MDksMjYgQEAKIAl1bnNpZ25lZCBsb25nCQlyd19yZXFidWY7CiB9OwogCitzdHJ1Y3QgYXRhX2VyaW5nX2VudHJ5IHsKKwlpbnQJCQlpc19pbzsKKwl1bnNpZ25lZCBpbnQJCWVycl9tYXNrOworCXU2NAkJCXRpbWVzdGFtcDsKK307CisKK3N0cnVjdCBhdGFfZXJpbmcgeworCWludAkJCWN1cnNvcjsKKwlzdHJ1Y3QgYXRhX2VyaW5nX2VudHJ5CXJpbmdbQVRBX0VSSU5HX1NJWkVdOworfTsKKwogc3RydWN0IGF0YV9kZXZpY2UgewotCXU2NAkJCW5fc2VjdG9yczsJLyogc2l6ZSBvZiBkZXZpY2UsIGlmIEFUQSAqLwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogQVRBX0RGTEFHX3h4eCAqLwotCXVuc2lnbmVkIGludAkJY2xhc3M7CQkvKiBBVEFfREVWX3h4eCAqLworCXN0cnVjdCBhdGFfcG9ydAkJKmFwOwogCXVuc2lnbmVkIGludAkJZGV2bm87CQkvKiAwIG9yIDEgKi8KLQl1MTYJCQkqaWQ7CQkvKiBJREVOVElGWSB4eHggREVWSUNFIGRhdGEgKi8KKwl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIEFUQV9ERkxBR194eHggKi8KKwlzdHJ1Y3Qgc2NzaV9kZXZpY2UJKnNkZXY7CQkvKiBhdHRhY2hlZCBTQ1NJIGRldmljZSAqLworCS8qIG5fc2VjdG9yIGlzIHVzZWQgYXMgQ0xFQVJfT0ZGU0VULCByZWFkIGNvbW1lbnQgYWJvdmUgQ0xFQVJfT0ZGU0VUICovCisJdTY0CQkJbl9zZWN0b3JzOwkvKiBzaXplIG9mIGRldmljZSwgaWYgQVRBICovCisJdW5zaWduZWQgaW50CQljbGFzczsJCS8qIEFUQV9ERVZfeHh4ICovCisJdTE2CQkJaWRbQVRBX0lEX1dPUkRTXTsgLyogSURFTlRJRlkgeHh4IERFVklDRSBkYXRhICovCiAJdTgJCQlwaW9fbW9kZTsKIAl1OAkJCWRtYV9tb2RlOwogCXU4CQkJeGZlcl9tb2RlOwpAQCAtMzczLDExICs0NDgsNDIgQEAKIAl1MTYJCQljeWxpbmRlcnM7CS8qIE51bWJlciBvZiBjeWxpbmRlcnMgKi8KIAl1MTYJCQloZWFkczsJCS8qIE51bWJlciBvZiBoZWFkcyAqLwogCXUxNgkJCXNlY3RvcnM7CS8qIE51bWJlciBvZiBzZWN0b3JzIHBlciB0cmFjayAqLworCisJLyogZXJyb3IgaGlzdG9yeSAqLworCXN0cnVjdCBhdGFfZXJpbmcJZXJpbmc7Cit9OworCisvKiBPZmZzZXQgaW50byBzdHJ1Y3QgYXRhX2RldmljZS4gIEZpZWxkcyBhYm92ZSBpdCBhcmUgbWFpbnRhaW5lZAorICogYWNyZXNzIGRldmljZSBpbml0LiAgRmllbGRzIGJlbG93IGFyZSB6ZXJvZWQuCisgKi8KKyNkZWZpbmUgQVRBX0RFVklDRV9DTEVBUl9PRkZTRVQJCW9mZnNldG9mKHN0cnVjdCBhdGFfZGV2aWNlLCBuX3NlY3RvcnMpCisKK3N0cnVjdCBhdGFfZWhfaW5mbyB7CisJc3RydWN0IGF0YV9kZXZpY2UJKmRldjsJCS8qIG9mZmVuZGluZyBkZXZpY2UgKi8KKwl1MzIJCQlzZXJyb3I7CQkvKiBTRXJyb3IgZnJvbSBMTEREICovCisJdW5zaWduZWQgaW50CQllcnJfbWFzazsJLyogcG9ydC13aWRlIGVycl9tYXNrICovCisJdW5zaWduZWQgaW50CQlhY3Rpb247CQkvKiBBVEFfRUhfKiBhY3Rpb24gbWFzayAqLworCXVuc2lnbmVkIGludAkJZGV2X2FjdGlvbltBVEFfTUFYX0RFVklDRVNdOyAvKiBkZXYgRUggYWN0aW9uICovCisJdW5zaWduZWQgaW50CQlmbGFnczsJCS8qIEFUQV9FSElfKiBmbGFncyAqLworCisJdW5zaWduZWQgbG9uZwkJaG90cGx1Z190aW1lc3RhbXA7CisJdW5zaWduZWQgaW50CQlwcm9iZV9tYXNrOworCisJY2hhcgkJCWRlc2NbQVRBX0VIX0RFU0NfTEVOXTsKKwlpbnQJCQlkZXNjX2xlbjsKK307CisKK3N0cnVjdCBhdGFfZWhfY29udGV4dCB7CisJc3RydWN0IGF0YV9laF9pbmZvCWk7CisJaW50CQkJdHJpZXNbQVRBX01BWF9ERVZJQ0VTXTsKKwl1bnNpZ25lZCBpbnQJCWNsYXNzZXNbQVRBX01BWF9ERVZJQ0VTXTsKKwl1bnNpZ25lZCBpbnQJCWRpZF9wcm9iZV9tYXNrOwogfTsKIAogc3RydWN0IGF0YV9wb3J0IHsKIAlzdHJ1Y3QgU2NzaV9Ib3N0CSpob3N0OwkvKiBvdXIgY28tYWxsb2NhdGVkIHNjc2kgaG9zdCAqLwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9vcGVyYXRpb25zICpvcHM7CisJc3BpbmxvY2tfdAkJKmxvY2s7CiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CS8qIEFUQV9GTEFHX3h4eCAqLwogCXVuc2lnbmVkIGludAkJaWQ7CS8qIHVuaXF1ZSBpZCByZXEnZCBieSBzY3NpIG1pZGx5ciAqLwogCXVuc2lnbmVkIGludAkJcG9ydF9ubzsgLyogdW5pcXVlIHBvcnQgIzsgZnJvbSB6ZXJvICovCkBAIC0zOTcsMjYgKzUwMyw0MCBAQAogCXVuc2lnbmVkIGludAkJbXdkbWFfbWFzazsKIAl1bnNpZ25lZCBpbnQJCXVkbWFfbWFzazsKIAl1bnNpZ25lZCBpbnQJCWNibDsJLyogY2FibGUgdHlwZTsgQVRBX0NCTF94eHggKi8KKwl1bnNpZ25lZCBpbnQJCWh3X3NhdGFfc3BkX2xpbWl0OworCXVuc2lnbmVkIGludAkJc2F0YV9zcGRfbGltaXQ7CS8qIFNBVEEgUEhZIHNwZWVkIGxpbWl0ICovCisKKwkvKiByZWNvcmQgcnVudGltZSBlcnJvciBpbmZvLCBwcm90ZWN0ZWQgYnkgaG9zdF9zZXQgbG9jayAqLworCXN0cnVjdCBhdGFfZWhfaW5mbwllaF9pbmZvOworCS8qIEVIIGNvbnRleHQgb3duZWQgYnkgRUggKi8KKwlzdHJ1Y3QgYXRhX2VoX2NvbnRleHQJZWhfY29udGV4dDsKIAogCXN0cnVjdCBhdGFfZGV2aWNlCWRldmljZVtBVEFfTUFYX0RFVklDRVNdOwogCiAJc3RydWN0IGF0YV9xdWV1ZWRfY21kCXFjbWRbQVRBX01BWF9RVUVVRV07Ci0JdW5zaWduZWQgbG9uZwkJcWFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nCQlxY19hbGxvY2F0ZWQ7CisJdW5zaWduZWQgaW50CQlxY19hY3RpdmU7CisKIAl1bnNpZ25lZCBpbnQJCWFjdGl2ZV90YWc7CisJdTMyCQkJc2FjdGl2ZTsKIAogCXN0cnVjdCBhdGFfaG9zdF9zdGF0cwlzdGF0czsKIAlzdHJ1Y3QgYXRhX2hvc3Rfc2V0CSpob3N0X3NldDsKIAlzdHJ1Y3QgZGV2aWNlIAkJKmRldjsKIAogCXN0cnVjdCB3b3JrX3N0cnVjdAlwb3J0X3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0CWhvdHBsdWdfdGFzazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJc2NzaV9yZXNjYW5fdGFzazsKIAogCXVuc2lnbmVkIGludAkJaHNtX3Rhc2tfc3RhdGU7Ci0JdW5zaWduZWQgbG9uZwkJcGlvX3Rhc2tfdGltZW91dDsKIAogCXUzMgkJCW1zZ19lbmFibGU7CiAJc3RydWN0IGxpc3RfaGVhZAllaF9kb25lX3E7CisJd2FpdF9xdWV1ZV9oZWFkX3QJZWhfd2FpdF9xOwogCiAJdm9pZAkJCSpwcml2YXRlX2RhdGE7CisKKwl1OAkJCXNlY3Rvcl9idWZbQVRBX1NFQ1RfU0laRV07IC8qIG93bmVkIGJ5IEVIICovCiB9OwogCiBzdHJ1Y3QgYXRhX3BvcnRfb3BlcmF0aW9ucyB7CkBAIC00MzgsNyArNTU4LDYgQEAKIAogCXZvaWQgKCpwaHlfcmVzZXQpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsgLyogb2Jzb2xldGUgKi8KIAl2b2lkICgqc2V0X21vZGUpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLQlpbnQgKCpwcm9iZV9yZXNldCkgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7CiAKIAl2b2lkICgqcG9zdF9zZXRfbW9kZSkgKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogCkBAIC00NDcsMTAgKzU2NiwyMCBAQAogCXZvaWQgKCpibWRtYV9zZXR1cCkgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogCXZvaWQgKCpibWRtYV9zdGFydCkgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogCisJdm9pZCAoKmRhdGFfeGZlcikgKHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworCiAJdm9pZCAoKnFjX3ByZXApIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAl1bnNpZ25lZCBpbnQgKCpxY19pc3N1ZSkgKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogCi0Jdm9pZCAoKmVuZ190aW1lb3V0KSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CisJLyogRXJyb3IgaGFuZGxlcnMuICAtPmVycm9yX2hhbmRsZXIgb3ZlcnJpZGVzIC0+ZW5nX3RpbWVvdXQgYW5kCisJICogaW5kaWNhdGVzIHRoYXQgbmV3LXN0eWxlIEVIIGlzIGluIHBsYWNlLgorCSAqLworCXZvaWQgKCplbmdfdGltZW91dCkgKHN0cnVjdCBhdGFfcG9ydCAqYXApOyAvKiBvYnNvbGV0ZSAqLworCisJdm9pZCAoKmZyZWV6ZSkgKHN0cnVjdCBhdGFfcG9ydCAqYXApOworCXZvaWQgKCp0aGF3KSAoc3RydWN0IGF0YV9wb3J0ICphcCk7CisJdm9pZCAoKmVycm9yX2hhbmRsZXIpIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKKwl2b2lkICgqcG9zdF9pbnRlcm5hbF9jbWQpIChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIAogCWlycXJldHVybl90ICgqaXJxX2hhbmRsZXIpKGludCwgdm9pZCAqLCBzdHJ1Y3QgcHRfcmVncyAqKTsKIAl2b2lkICgqaXJxX2NsZWFyKSAoc3RydWN0IGF0YV9wb3J0ICopOwpAQCAtNDkyLDIyICs2MjEsMjIgQEAKIAogI2RlZmluZSBGSVQodix2bWluLHZtYXgpCW1heF90KHNob3J0LG1pbl90KHNob3J0LHYsdm1heCksdm1pbikKIAorZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgc2F0YV9kZWJfdGltaW5nX2Jvb3RbXTsKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBsb25nIHNhdGFfZGViX3RpbWluZ19laFtdOworZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGxvbmcgc2F0YV9kZWJfdGltaW5nX2JlZm9yZV9mc3JzdFtdOworCiBleHRlcm4gdm9pZCBhdGFfcG9ydF9wcm9iZShzdHJ1Y3QgYXRhX3BvcnQgKik7CiBleHRlcm4gdm9pZCBfX3NhdGFfcGh5X3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIHZvaWQgc2F0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfYnVzX3Jlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXApOwotZXh0ZXJuIGludCBhdGFfZHJpdmVfcHJvYmVfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwKLQkJCWF0YV9wcm9iZWluaXRfZm5fdCBwcm9iZWluaXQsCi0JCQlhdGFfcmVzZXRfZm5fdCBzb2Z0cmVzZXQsIGF0YV9yZXNldF9mbl90IGhhcmRyZXNldCwKLQkJCWF0YV9wb3N0cmVzZXRfZm5fdCBwb3N0cmVzZXQsIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7Ci1leHRlcm4gdm9pZCBhdGFfc3RkX3Byb2JlaW5pdChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKLWV4dGVybiBpbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHZlcmJvc2UsCi0JCQkgICAgIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7Ci1leHRlcm4gaW50IHNhdGFfc3RkX2hhcmRyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgdmVyYm9zZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCAqY2xhc3MpOworZXh0ZXJuIGludCBzYXRhX3NldF9zcGQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IHNhdGFfcGh5X2RlYm91bmNlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnBhcmFtKTsKK2V4dGVybiBpbnQgc2F0YV9waHlfcmVzdW1lKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnBhcmFtKTsKK2V4dGVybiBpbnQgYXRhX3N0ZF9wcmVyZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiBpbnQgYXRhX3N0ZF9zb2Z0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKK2V4dGVybiBpbnQgc2F0YV9zdGRfaGFyZHJlc2V0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCAqY2xhc3MpOwogZXh0ZXJuIHZvaWQgYXRhX3N0ZF9wb3N0cmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50ICpjbGFzc2VzKTsKLWV4dGVybiBpbnQgYXRhX2Rldl9yZXZhbGlkYXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfZGV2aWNlICpkZXYsCi0JCQkgICAgICBpbnQgcG9zdF9yZXNldCk7CitleHRlcm4gaW50IGF0YV9kZXZfcmV2YWxpZGF0ZShzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBpbnQgcG9zdF9yZXNldCk7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9kaXNhYmxlKHN0cnVjdCBhdGFfcG9ydCAqKTsKIGV4dGVybiB2b2lkIGF0YV9zdGRfcG9ydHMoc3RydWN0IGF0YV9pb3BvcnRzICppb2FkZHIpOwogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTUxOSwyNCArNjQ4LDMyIEBACiBleHRlcm4gaW50IGF0YV9wY2lfY2xlYXJfc2ltcGxleChzdHJ1Y3QgcGNpX2RldiAqcGRldik7CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogZXh0ZXJuIGludCBhdGFfZGV2aWNlX2FkZChjb25zdCBzdHJ1Y3QgYXRhX3Byb2JlX2VudCAqZW50KTsKK2V4dGVybiB2b2lkIGF0YV9wb3J0X2RldGFjaChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB2b2lkIGF0YV9ob3N0X3NldF9yZW1vdmUoc3RydWN0IGF0YV9ob3N0X3NldCAqaG9zdF9zZXQpOwogZXh0ZXJuIGludCBhdGFfc2NzaV9kZXRlY3Qoc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSAqc2h0KTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwogZXh0ZXJuIGludCBhdGFfc2NzaV9xdWV1ZWNtZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHZvaWQgKCpkb25lKShzdHJ1Y3Qgc2NzaV9jbW5kICopKTsKLWV4dGVybiB2b2lkIGF0YV9laF9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKLWV4dGVybiB2b2lkIGF0YV9laF9xY19yZXRyeShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfcmVsZWFzZShzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgYXRhX2hvc3RfaW50cihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK2V4dGVybiBpbnQgc2F0YV9zY3JfdmFsaWQoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IHNhdGFfc2NyX3JlYWQoc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHJlZywgdTMyICp2YWwpOworZXh0ZXJuIGludCBzYXRhX3Njcl93cml0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBpbnQgcmVnLCB1MzIgdmFsKTsKK2V4dGVybiBpbnQgc2F0YV9zY3Jfd3JpdGVfZmx1c2goc3RydWN0IGF0YV9wb3J0ICphcCwgaW50IHJlZywgdTMyIHZhbCk7CitleHRlcm4gaW50IGF0YV9wb3J0X29ubGluZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiBpbnQgYXRhX3BvcnRfb2ZmbGluZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfZGV2aWNlX3Jlc3VtZShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKik7CiBleHRlcm4gaW50IGF0YV9zY3NpX2RldmljZV9zdXNwZW5kKHN0cnVjdCBzY3NpX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotZXh0ZXJuIGludCBhdGFfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgYXRhX3BvcnQgKiwgc3RydWN0IGF0YV9kZXZpY2UgKik7Ci1leHRlcm4gaW50IGF0YV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgYXRhX3BvcnQgKiwgc3RydWN0IGF0YV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2V4dGVybiBpbnQgYXRhX2RldmljZV9yZXN1bWUoc3RydWN0IGF0YV9kZXZpY2UgKik7CitleHRlcm4gaW50IGF0YV9kZXZpY2Vfc3VzcGVuZChzdHJ1Y3QgYXRhX2RldmljZSAqLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwogZXh0ZXJuIGludCBhdGFfcmF0ZWxpbWl0KHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfYnVzeV9zbGVlcChzdHJ1Y3QgYXRhX3BvcnQgKmFwLAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgdGltZW91dF9wYXQsCiAJCQkJICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKIGV4dGVybiB2b2lkIGF0YV9wb3J0X3F1ZXVlX3Rhc2soc3RydWN0IGF0YV9wb3J0ICphcCwgdm9pZCAoKmZuKSh2b2lkICopLAogCQkJCXZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgZGVsYXkpOworZXh0ZXJuIHUzMiBhdGFfd2FpdF9yZWdpc3Rlcih2b2lkIF9faW9tZW0gKnJlZywgdTMyIG1hc2ssIHUzMiB2YWwsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWxfbXNlYywKKwkJCSAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0X21zZWMpOwogCiAvKgogICogRGVmYXVsdCBkcml2ZXIgb3BzIGltcGxlbWVudGF0aW9ucwpAQCAtNTUwLDExICs2ODcsMTYgQEAKIGV4dGVybiB1OCBhdGFfY2hlY2tfc3RhdHVzKHN0cnVjdCBhdGFfcG9ydCAqYXApOwogZXh0ZXJuIHU4IGF0YV9hbHRzdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfZXhlY19jb21tYW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKLWV4dGVybiBpbnQgYXRhX3N0ZF9wcm9iZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgKmNsYXNzZXMpOwogZXh0ZXJuIGludCBhdGFfcG9ydF9zdGFydCAoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfcG9ydF9zdG9wIChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIGV4dGVybiB2b2lkIGF0YV9ob3N0X3N0b3AgKHN0cnVjdCBhdGFfaG9zdF9zZXQgKmhvc3Rfc2V0KTsKIGV4dGVybiBpcnFyZXR1cm5fdCBhdGFfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiB2b2lkIGF0YV9tbWlvX2RhdGFfeGZlcihzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBidWZsZW4sIGludCB3cml0ZV9kYXRhKTsKK2V4dGVybiB2b2lkIGF0YV9waW9fZGF0YV94ZmVyKHN0cnVjdCBhdGFfZGV2aWNlICphZGV2LCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgYnVmbGVuLCBpbnQgd3JpdGVfZGF0YSk7CitleHRlcm4gdm9pZCBhdGFfcGlvX2RhdGFfeGZlcl9ub2lycShzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiwgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJICAgICAgdW5zaWduZWQgaW50IGJ1ZmxlbiwgaW50IHdyaXRlX2RhdGEpOwogZXh0ZXJuIHZvaWQgYXRhX3FjX3ByZXAoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CiBleHRlcm4gdm9pZCBhdGFfbm9vcF9xY19wcmVwKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpOwogZXh0ZXJuIHVuc2lnbmVkIGludCBhdGFfcWNfaXNzdWVfcHJvdChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKQEAgLTU3MiwxNyArNzE0LDI5IEBACiBleHRlcm4gdm9pZCBhdGFfYm1kbWFfc3RvcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIGV4dGVybiB1OCAgIGF0YV9ibWRtYV9zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBleHRlcm4gdm9pZCBhdGFfYm1kbWFfaXJxX2NsZWFyKHN0cnVjdCBhdGFfcG9ydCAqYXApOwotZXh0ZXJuIHZvaWQgX19hdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7Ci1leHRlcm4gdm9pZCBhdGFfZW5nX3RpbWVvdXQoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1leHRlcm4gdm9pZCBhdGFfc2NzaV9zaW11bGF0ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IHNjc2lfY21uZCAqY21kLAorZXh0ZXJuIHZvaWQgYXRhX2JtZG1hX2ZyZWV6ZShzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiB2b2lkIGF0YV9ibWRtYV90aGF3KHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIHZvaWQgYXRhX2JtZG1hX2RyaXZlX2VoKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGF0YV9wcmVyZXNldF9mbl90IHByZXJlc2V0LAorCQkJICAgICAgIGF0YV9yZXNldF9mbl90IHNvZnRyZXNldCwKKwkJCSAgICAgICBhdGFfcmVzZXRfZm5fdCBoYXJkcmVzZXQsCisJCQkgICAgICAgYXRhX3Bvc3RyZXNldF9mbl90IHBvc3RyZXNldCk7CitleHRlcm4gdm9pZCBhdGFfYm1kbWFfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiB2b2lkIGF0YV9ibWRtYV9wb3N0X2ludGVybmFsX2NtZChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK2V4dGVybiBpbnQgYXRhX2hzbV9tb3ZlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCisJCQl1OCBzdGF0dXMsIGludCBpbl93cSk7CitleHRlcm4gdm9pZCBhdGFfcWNfY29tcGxldGUoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyk7CitleHRlcm4gaW50IGF0YV9xY19jb21wbGV0ZV9tdWx0aXBsZShzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1MzIgcWNfYWN0aXZlLAorCQkJCSAgICB2b2lkICgqZmluaXNoX3FjKShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKikpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2ltdWxhdGUoc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgc3RydWN0IHNjc2lfY21uZCAqY21kLAogCQkJICAgICAgdm9pZCAoKmRvbmUpKHN0cnVjdCBzY3NpX2NtbmQgKikpOwogZXh0ZXJuIGludCBhdGFfc3RkX2Jpb3NfcGFyYW0oc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAogCQkJICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSAgICAgIHNlY3Rvcl90IGNhcGFjaXR5LCBpbnQgZ2VvbVtdKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfc2xhdmVfY29uZmlnKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7Ci1leHRlcm4gc3RydWN0IGF0YV9kZXZpY2UgKmF0YV9kZXZfcGFpcihzdHJ1Y3QgYXRhX3BvcnQgKmFwLCAKLQkJCQkgICAgICAgc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOworZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2xhdmVfZGVzdHJveShzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpOworZXh0ZXJuIGludCBhdGFfc2NzaV9jaGFuZ2VfcXVldWVfZGVwdGgoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LAorCQkJCSAgICAgICBpbnQgcXVldWVfZGVwdGgpOworZXh0ZXJuIHN0cnVjdCBhdGFfZGV2aWNlICphdGFfZGV2X3BhaXIoc3RydWN0IGF0YV9kZXZpY2UgKmFkZXYpOwogCiAvKgogICogVGltaW5nIGhlbHBlcnMKQEAgLTYyOCw3ICs3ODIsNjQgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGF0YV9wY2lfZGVmYXVsdF9maWx0ZXIoY29uc3Qgc3RydWN0IGF0YV9wb3J0ICosIHN0cnVjdCBhdGFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwogI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KIAorLyoKKyAqIEVICisgKi8KK2V4dGVybiB2b2lkIGF0YV9lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIAorZXh0ZXJuIHZvaWQgYXRhX3BvcnRfc2NoZWR1bGVfZWgoc3RydWN0IGF0YV9wb3J0ICphcCk7CitleHRlcm4gaW50IGF0YV9wb3J0X2Fib3J0KHN0cnVjdCBhdGFfcG9ydCAqYXApOworZXh0ZXJuIGludCBhdGFfcG9ydF9mcmVlemUoc3RydWN0IGF0YV9wb3J0ICphcCk7CisKK2V4dGVybiB2b2lkIGF0YV9laF9mcmVlemVfcG9ydChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKK2V4dGVybiB2b2lkIGF0YV9laF90aGF3X3BvcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7CisKK2V4dGVybiB2b2lkIGF0YV9laF9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKK2V4dGVybiB2b2lkIGF0YV9laF9xY19yZXRyeShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKKworZXh0ZXJuIHZvaWQgYXRhX2RvX2VoKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGF0YV9wcmVyZXNldF9mbl90IHByZXJlc2V0LAorCQkgICAgICBhdGFfcmVzZXRfZm5fdCBzb2Z0cmVzZXQsIGF0YV9yZXNldF9mbl90IGhhcmRyZXNldCwKKwkJICAgICAgYXRhX3Bvc3RyZXNldF9mbl90IHBvc3RyZXNldCk7CisKKy8qCisgKiBwcmludGsgaGVscGVycworICovCisjZGVmaW5lIGF0YV9wb3J0X3ByaW50ayhhcCwgbHYsIGZtdCwgYXJncy4uLikgXAorCXByaW50ayhsdiJhdGEldTogImZtdCwgKGFwKS0+aWQgLCAjI2FyZ3MpCisKKyNkZWZpbmUgYXRhX2Rldl9wcmludGsoZGV2LCBsdiwgZm10LCBhcmdzLi4uKSBcCisJcHJpbnRrKGx2ImF0YSV1LiUwMnU6ICJmbXQsIChkZXYpLT5hcC0+aWQsIChkZXYpLT5kZXZubyAsICMjYXJncykKKworLyoKKyAqIGF0YV9laF9pbmZvIGhlbHBlcnMKKyAqLworI2RlZmluZSBhdGFfZWhpX3B1c2hfZGVzYyhlaGksIGZtdCwgYXJncy4uLikgZG8geyBcCisJKGVoaSktPmRlc2NfbGVuICs9IHNjbnByaW50ZigoZWhpKS0+ZGVzYyArIChlaGkpLT5kZXNjX2xlbiwgXAorCQkJCSAgICAgQVRBX0VIX0RFU0NfTEVOIC0gKGVoaSktPmRlc2NfbGVuLCBcCisJCQkJICAgICBmbXQgLCAjI2FyZ3MpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGF0YV9laGlfY2xlYXJfZGVzYyhlaGkpIGRvIHsgXAorCShlaGkpLT5kZXNjWzBdID0gJ1wwJzsgXAorCShlaGkpLT5kZXNjX2xlbiA9IDA7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfZWhpX2hvdHBsdWdnZWQoc3RydWN0IGF0YV9laF9pbmZvICplaGkpCit7CisJaWYgKGVoaS0+ZmxhZ3MgJiBBVEFfRUhJX0hPVFBMVUdHRUQpCisJCXJldHVybjsKKworCWVoaS0+ZmxhZ3MgfD0gQVRBX0VISV9IT1RQTFVHR0VEOworCWVoaS0+aG90cGx1Z190aW1lc3RhbXAgPSBqaWZmaWVzOworCisJZWhpLT5lcnJfbWFzayB8PSBBQ19FUlJfQVRBX0JVUzsKKwllaGktPmFjdGlvbiB8PSBBVEFfRUhfU09GVFJFU0VUOworCWVoaS0+cHJvYmVfbWFzayB8PSAoMSA8PCBBVEFfTUFYX0RFVklDRVMpIC0gMTsKK30KKworLyoKKyAqIHFjIGhlbHBlcnMKKyAqLwogc3RhdGljIGlubGluZSBpbnQKIGF0YV9zZ19pc19sYXN0KHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CkBAIC02NzEsMTQgKzg4MiwzOSBAQAogCXJldHVybiAodGFnIDwgQVRBX01BWF9RVUVVRSkgPyAxIDogMDsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2NsYXNzX3ByZXNlbnQodW5zaWduZWQgaW50IGNsYXNzKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX3RhZ19pbnRlcm5hbCh1bnNpZ25lZCBpbnQgdGFnKQoreworCXJldHVybiB0YWcgPT0gQVRBX01BWF9RVUVVRSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9jbGFzc19lbmFibGVkKHVuc2lnbmVkIGludCBjbGFzcykKIHsKIAlyZXR1cm4gY2xhc3MgPT0gQVRBX0RFVl9BVEEgfHwgY2xhc3MgPT0gQVRBX0RFVl9BVEFQSTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2Rldl9wcmVzZW50KGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhdGFfY2xhc3NfZGlzYWJsZWQodW5zaWduZWQgaW50IGNsYXNzKQogewotCXJldHVybiBhdGFfY2xhc3NfcHJlc2VudChkZXYtPmNsYXNzKTsKKwlyZXR1cm4gY2xhc3MgPT0gQVRBX0RFVl9BVEFfVU5TVVAgfHwgY2xhc3MgPT0gQVRBX0RFVl9BVEFQSV9VTlNVUDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2NsYXNzX2Fic2VudCh1bnNpZ25lZCBpbnQgY2xhc3MpCit7CisJcmV0dXJuICFhdGFfY2xhc3NfZW5hYmxlZChjbGFzcykgJiYgIWF0YV9jbGFzc19kaXNhYmxlZChjbGFzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9kZXZfZW5hYmxlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXJldHVybiBhdGFfY2xhc3NfZW5hYmxlZChkZXYtPmNsYXNzKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXRhX2Rldl9kaXNhYmxlZChjb25zdCBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KQoreworCXJldHVybiBhdGFfY2xhc3NfZGlzYWJsZWQoZGV2LT5jbGFzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0YV9kZXZfYWJzZW50KGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGF0YV9jbGFzc19hYnNlbnQoZGV2LT5jbGFzcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggYXRhX2Noa19zdGF0dXMoc3RydWN0IGF0YV9wb3J0ICphcCkKQEAgLTc1OSwyMCArOTk1LDM1IEBACiAJcWMtPnRmLmN0bCB8PSBBVEFfTklFTjsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKmF0YV9xY19mcm9tX3RhZyAoc3RydWN0IGF0YV9wb3J0ICphcCwKLQkJCQkJCSAgICAgIHVuc2lnbmVkIGludCB0YWcpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqX19hdGFfcWNfZnJvbV90YWcoc3RydWN0IGF0YV9wb3J0ICphcCwKKwkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdGFnKQogewogCWlmIChsaWtlbHkoYXRhX3RhZ192YWxpZCh0YWcpKSkKIAkJcmV0dXJuICZhcC0+cWNtZFt0YWddOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRhX3RmX2luaXQoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIHVuc2lnbmVkIGludCBkZXZpY2UpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqYXRhX3FjX2Zyb21fdGFnKHN0cnVjdCBhdGFfcG9ydCAqYXAsCisJCQkJCQkgICAgIHVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyA9IF9fYXRhX3FjX2Zyb21fdGFnKGFwLCB0YWcpOworCisJaWYgKHVubGlrZWx5KCFxYykgfHwgIWFwLT5vcHMtPmVycm9yX2hhbmRsZXIpCisJCXJldHVybiBxYzsKKworCWlmICgocWMtPmZsYWdzICYgKEFUQV9RQ0ZMQUdfQUNUSVZFIHwKKwkJCSAgQVRBX1FDRkxBR19GQUlMRUQpKSA9PSBBVEFfUUNGTEFHX0FDVElWRSkKKwkJcmV0dXJuIHFjOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGFfdGZfaW5pdChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKIHsKIAltZW1zZXQodGYsIDAsIHNpemVvZigqdGYpKTsKIAotCXRmLT5jdGwgPSBhcC0+Y3RsOwotCWlmIChkZXZpY2UgPT0gMCkKKwl0Zi0+Y3RsID0gZGV2LT5hcC0+Y3RsOworCWlmIChkZXYtPmRldm5vID09IDApCiAJCXRmLT5kZXZpY2UgPSBBVEFfREVWSUNFX09CUzsKIAllbHNlCiAJCXRmLT5kZXZpY2UgPSBBVEFfREVWSUNFX09CUyB8IEFUQV9ERVYxOwpAQCAtNzg3LDI2ICsxMDM4LDExIEBACiAJcWMtPm5ieXRlcyA9IHFjLT5jdXJieXRlcyA9IDA7CiAJcWMtPmVycl9tYXNrID0gMDsKIAotCWF0YV90Zl9pbml0KHFjLT5hcCwgJnFjLT50ZiwgcWMtPmRldi0+ZGV2bm8pOwotfQorCWF0YV90Zl9pbml0KHFjLT5kZXYsICZxYy0+dGYpOwogCi0vKioKLSAqCWF0YV9xY19jb21wbGV0ZSAtIENvbXBsZXRlIGFuIGFjdGl2ZSBBVEEgY29tbWFuZAotICoJQHFjOiBDb21tYW5kIHRvIGNvbXBsZXRlCi0gKglAZXJyX21hc2s6IEFUQSBTdGF0dXMgcmVnaXN0ZXIgY29udGVudHMKLSAqCi0gKglJbmRpY2F0ZSB0byB0aGUgbWlkIGFuZCB1cHBlciBsYXllcnMgdGhhdCBhbiBBVEEKLSAqCWNvbW1hbmQgaGFzIGNvbXBsZXRlZCwgd2l0aCBlaXRoZXIgYW4gb2sgb3Igbm90LW9rIHN0YXR1cy4KLSAqCi0gKglMT0NLSU5HOgotICoJc3Bpbl9sb2NrX2lycXNhdmUoaG9zdF9zZXQgbG9jaykKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGF0YV9xY19jb21wbGV0ZShzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQotewotCWlmICh1bmxpa2VseShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0VIX1NDSEVEVUxFRCkpCi0JCXJldHVybjsKLQotCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKKwkvKiBpbml0IHJlc3VsdF90ZiBzdWNoIHRoYXQgaXQgaW5kaWNhdGVzIG5vcm1hbCBjb21wbGV0aW9uICovCisJcWMtPnJlc3VsdF90Zi5jb21tYW5kID0gQVRBX0RSRFk7CisJcWMtPnJlc3VsdF90Zi5mZWF0dXJlID0gMDsKIH0KIAogLyoqCkBAIC04ODUsMjggKzExMjEsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHNjcl9yZWFkKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGFwLT5vcHMtPnNjcl9yZWFkKGFwLCByZWcpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NyX3dyaXRlKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWwpCi17Ci0JYXAtPm9wcy0+c2NyX3dyaXRlKGFwLCByZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY3Jfd3JpdGVfZmx1c2goc3RydWN0IGF0YV9wb3J0ICphcCwgdW5zaWduZWQgaW50IHJlZywKLQkJCQkgICB1MzIgdmFsKQotewotCWFwLT5vcHMtPnNjcl93cml0ZShhcCwgcmVnLCB2YWwpOwotCSh2b2lkKSBhcC0+b3BzLT5zY3JfcmVhZChhcCwgcmVnKTsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2F0YV9kZXZfcHJlc2VudChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXJldHVybiAoKHNjcl9yZWFkKGFwLCBTQ1JfU1RBVFVTKSAmIDB4ZikgPT0gMHgzKSA/IDEgOiAwOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBhdGFfdHJ5X2ZsdXNoX2NhY2hlKGNvbnN0IHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIGF0YV9pZF93Y2FjaGVfZW5hYmxlZChkZXYtPmlkKSB8fApAQCAtOTE2LDcgKzExMzAsNyBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBhY19lcnJfbWFzayh1OCBzdGF0dXMpCiB7Ci0JaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQorCWlmIChzdGF0dXMgJiAoQVRBX0JVU1kgfCBBVEFfRFJRKSkKIAkJcmV0dXJuIEFDX0VSUl9IU007CiAJaWYgKHN0YXR1cyAmIChBVEFfRVJSIHwgQVRBX0RGKSkKIAkJcmV0dXJuIEFDX0VSUl9ERVY7CkBAIC05NDQsNCArMTE1OCw5IEBACiAJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBBVEFfRE1BX1BBRF9CVUZfU1osIGFwLT5wYWQsIGFwLT5wYWRfZG1hKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRhX3BvcnQgKmF0YV9zaG9zdF90b19wb3J0KHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuIChzdHJ1Y3QgYXRhX3BvcnQgKikgJmhvc3QtPmhvc3RkYXRhWzBdOworfQorCiAjZW5kaWYgLyogX19MSU5VWF9MSUJBVEFfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpc3QuaCBiL2luY2x1ZGUvbGludXgvbGlzdC5oCmluZGV4IDc2ZjA1NzEuLjM3Y2EzMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGlzdC5oCisrKyBiL2luY2x1ZGUvbGludXgvbGlzdC5oCkBAIC0xOTcsMTIgKzE5NywzNSBAQAogCWVudHJ5LT5wcmV2ID0gTElTVF9QT0lTT04yOwogfQogCisvKioKKyAqIGxpc3RfcmVwbGFjZSAtIHJlcGxhY2Ugb2xkIGVudHJ5IGJ5IG5ldyBvbmUKKyAqIEBvbGQgOiB0aGUgZWxlbWVudCB0byBiZSByZXBsYWNlZAorICogQG5ldyA6IHRoZSBuZXcgZWxlbWVudCB0byBpbnNlcnQKKyAqIE5vdGU6IGlmICdvbGQnIHdhcyBlbXB0eSwgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfcmVwbGFjZShzdHJ1Y3QgbGlzdF9oZWFkICpvbGQsCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqbmV3KQoreworCW5ldy0+bmV4dCA9IG9sZC0+bmV4dDsKKwluZXctPm5leHQtPnByZXYgPSBuZXc7CisJbmV3LT5wcmV2ID0gb2xkLT5wcmV2OworCW5ldy0+cHJldi0+bmV4dCA9IG5ldzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfcmVwbGFjZV9pbml0KHN0cnVjdCBsaXN0X2hlYWQgKm9sZCwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqbmV3KQoreworCWxpc3RfcmVwbGFjZShvbGQsIG5ldyk7CisJSU5JVF9MSVNUX0hFQUQob2xkKTsKK30KKwogLyoKICAqIGxpc3RfcmVwbGFjZV9yY3UgLSByZXBsYWNlIG9sZCBlbnRyeSBieSBuZXcgb25lCiAgKiBAb2xkIDogdGhlIGVsZW1lbnQgdG8gYmUgcmVwbGFjZWQKICAqIEBuZXcgOiB0aGUgbmV3IGVsZW1lbnQgdG8gaW5zZXJ0CiAgKgogICogVGhlIG9sZCBlbnRyeSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIG5ldyBlbnRyeSBhdG9taWNhbGx5LgorICogTm90ZTogJ29sZCcgc2hvdWxkIG5vdCBiZSBlbXB0eS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIGxpc3RfcmVwbGFjZV9yY3Uoc3RydWN0IGxpc3RfaGVhZCAqb2xkLAogCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5ldykKQEAgLTI1OCwxNiArMjgxLDE3IEBACiB9CiAKIC8qKgotICogbGlzdF9lbXB0eV9jYXJlZnVsIC0gdGVzdHMgd2hldGhlciBhIGxpc3QgaXMKLSAqIGVtcHR5IF9hbmRfIGNoZWNrcyB0aGF0IG5vIG90aGVyIENQVSBtaWdodCBiZQotICogaW4gdGhlIHByb2Nlc3Mgb2Ygc3RpbGwgbW9kaWZ5aW5nIGVpdGhlciBtZW1iZXIKKyAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgbW9kaWZpZWQKKyAqIEBoZWFkOiB0aGUgbGlzdCB0byB0ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKiB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUKKyAqIGluIHRoZSBwcm9jZXNzIG9mIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyIChuZXh0IG9yIHByZXYpCiAgKgogICogTk9URTogdXNpbmcgbGlzdF9lbXB0eV9jYXJlZnVsKCkgd2l0aG91dCBzeW5jaHJvbml6YXRpb24KICAqIGNhbiBvbmx5IGJlIHNhZmUgaWYgdGhlIG9ubHkgYWN0aXZpdHkgdGhhdCBjYW4gaGFwcGVuCiAgKiB0byB0aGUgbGlzdCBlbnRyeSBpcyBsaXN0X2RlbF9pbml0KCkuIEVnLiBpdCBjYW5ub3QgYmUgdXNlZAogICogaWYgYW5vdGhlciBDUFUgY291bGQgcmUtbGlzdF9hZGQoKSBpdC4KLSAqCi0gKiBAaGVhZDogdGhlIGxpc3QgdG8gdGVzdC4KICAqLwogc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eV9jYXJlZnVsKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CkBAIC0zMjcsNyArMzUxLDcgQEAKIAogLyoqCiAgKiBsaXN0X2Zvcl9lYWNoCS0JaXRlcmF0ZSBvdmVyIGEgbGlzdAotICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCkBAIC0zMzYsNyArMzYwLDcgQEAKIAogLyoqCiAgKiBfX2xpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0Ci0gKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKgogICogVGhpcyB2YXJpYW50IGRpZmZlcnMgZnJvbSBsaXN0X2Zvcl9lYWNoKCkgaW4gdGhhdCBpdCdzIHRoZQpAQCAtMzQ5LDcgKzM3Myw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9wcmV2CS0JaXRlcmF0ZSBvdmVyIGEgbGlzdCBiYWNrd2FyZHMKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3ByZXYocG9zLCBoZWFkKSBcCkBAIC0zNTcsOCArMzgxLDggQEAKICAgICAgICAgCXBvcyA9IHBvcy0+cHJldikKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX3NhZmUJLQlpdGVyYXRlIG92ZXIgYSBsaXN0IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX3NhZmUgLSBpdGVyYXRlIG92ZXIgYSBsaXN0IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBuOgkJYW5vdGhlciAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICovCkBAIC0zNjgsNyArMzkyLDcgQEAKIAogLyoqCiAgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKi8KQEAgLTM3OSw3ICs0MDMsNyBAQAogCiAvKioKICAqIGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSAtIGl0ZXJhdGUgYmFja3dhcmRzIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLgotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKi8KQEAgLTM4OSwyMSArNDEzLDI0IEBACiAJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogLyoqCi0gKiBsaXN0X3ByZXBhcmVfZW50cnkgLSBwcmVwYXJlIGEgcG9zIGVudHJ5IGZvciB1c2UgYXMgYSBzdGFydCBwb2ludCBpbgotICoJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlCisgKiBsaXN0X3ByZXBhcmVfZW50cnkgLSBwcmVwYXJlIGEgcG9zIGVudHJ5IGZvciB1c2UgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZQogICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBzdGFydCBwb2ludAogICogQGhlYWQ6CXRoZSBoZWFkIG9mIHRoZSBsaXN0CiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogUHJlcGFyZXMgYSBwb3MgZW50cnkgZm9yIHVzZSBhcyBhIHN0YXJ0IHBvaW50IGluIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUuCiAgKi8KICNkZWZpbmUgbGlzdF9wcmVwYXJlX2VudHJ5KHBvcywgaGVhZCwgbWVtYmVyKSBcCiAJKChwb3MpID8gOiBsaXN0X2VudHJ5KGhlYWQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlIC0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50Ci0gKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLSBjb250aW51ZSBpdGVyYXRpb24gb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBDb250aW51ZSB0byBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGFmdGVyCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgaGVhZCwgbWVtYmVyKSAJCVwKIAlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwlcCkBAIC00MTEsMTEgKzQzOCwxMiBAQAogCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tIC0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICoJCQljb250aW51aW5nIGZyb20gZXhpc3RpbmcgcG9pbnQKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBjdXJyZW50IHBvaW50CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24uCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHBvcywgaGVhZCwgbWVtYmVyKSAJCQlcCiAJZm9yICg7IHByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCkBAIC00MjMsNyArNDUxLDcgQEAKIAogLyoqCiAgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUgLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KQEAgLTQzNSwxMiArNDYzLDE0IEBACiAJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUgLQlpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlCi0gKgkJCWNvbnRpbnVpbmcgYWZ0ZXIgZXhpc3RpbmcgcG9pbnQgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50LAorICogc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KICAqLwogI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUocG9zLCBuLCBoZWFkLCBtZW1iZXIpIAkJXAogCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksIAkJXApAQCAtNDQ5LDEyICs0NzksMTQgQEAKIAkgICAgIHBvcyA9IG4sIG4gPSBsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQogCiAvKioKLSAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICoJCQlmcm9tIGV4aXN0aW5nIHBvaW50IHNhZmUgYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX2Zyb20KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBmcm9tIGN1cnJlbnQgcG9pbnQsIHNhZmUgYWdhaW5zdAorICogcmVtb3ZhbCBvZiBsaXN0IGVudHJ5LgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tKHBvcywgbiwgaGVhZCwgbWVtYmVyKSAJCQlcCiAJZm9yIChuID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CQlcCkBAIC00NjIsMTIgKzQ5NCwxNCBAQAogCSAgICAgcG9zID0gbiwgbiA9IGxpc3RfZW50cnkobi0+bWVtYmVyLm5leHQsIHR5cGVvZigqbiksIG1lbWJlcikpCiAKIC8qKgotICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QKLSAqCQkJCSAgICAgIHJlbW92YWwgb2YgbGlzdCBlbnRyeQotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgc2FmZSBhZ2FpbnN0IHJlbW92YWwKKyAqIG9mIGxpc3QgZW50cnkuCiAgKi8KICNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQlcCiAJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCkBAIC00NzcsNyArNTExLDcgQEAKIAogLyoqCiAgKiBsaXN0X2Zvcl9lYWNoX3JjdQktCWl0ZXJhdGUgb3ZlciBhbiByY3UtcHJvdGVjdGVkIGxpc3QKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqCiAgKiBUaGlzIGxpc3QtdHJhdmVyc2FsIHByaW1pdGl2ZSBtYXkgc2FmZWx5IHJ1biBjb25jdXJyZW50bHkgd2l0aApAQCAtNDk1LDEyICs1MjksMTMgQEAKICAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCkKIAogLyoqCi0gKiBsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1CS0JaXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGlzdCBzYWZlCi0gKgkJCQkJYWdhaW5zdCByZW1vdmFsIG9mIGxpc3QgZW50cnkKLSAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBsaXN0X2Zvcl9lYWNoX3NhZmVfcmN1CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqCisgKiBJdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsaXN0LCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5LgorICoKICAqIFRoaXMgbGlzdC10cmF2ZXJzYWwgcHJpbWl0aXZlIG1heSBzYWZlbHkgcnVuIGNvbmN1cnJlbnRseSB3aXRoCiAgKiB0aGUgX3JjdSBsaXN0LW11dGF0aW9uIHByaW1pdGl2ZXMgc3VjaCBhcyBsaXN0X2FkZF9yY3UoKQogICogYXMgbG9uZyBhcyB0aGUgdHJhdmVyc2FsIGlzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgpAQCAtNTEyLDcgKzU0Nyw3IEBACiAKIC8qKgogICogbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UJLQlpdGVyYXRlIG92ZXIgcmN1IGxpc3Qgb2YgZ2l2ZW4gdHlwZQotICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKgpAQCAtNTI4LDExICs1NjMsMTIgQEAKIAogCiAvKioKLSAqIGxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1CS0JaXRlcmF0ZSBvdmVyIGFuIHJjdS1wcm90ZWN0ZWQgbGlzdAotICoJCQljb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50LgotICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGxpc3RfZm9yX2VhY2hfY29udGludWVfcmN1CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KICAqCisgKiBJdGVyYXRlIG92ZXIgYW4gcmN1LXByb3RlY3RlZCBsaXN0LCBjb250aW51aW5nIGFmdGVyIGN1cnJlbnQgcG9pbnQuCisgKgogICogVGhpcyBsaXN0LXRyYXZlcnNhbCBwcmltaXRpdmUgbWF5IHNhZmVseSBydW4gY29uY3VycmVudGx5IHdpdGgKICAqIHRoZSBfcmN1IGxpc3QtbXV0YXRpb24gcHJpbWl0aXZlcyBzdWNoIGFzIGxpc3RfYWRkX3JjdSgpCiAgKiBhcyBsb25nIGFzIHRoZSB0cmF2ZXJzYWwgaXMgZ3VhcmRlZCBieSByY3VfcmVhZF9sb2NrKCkuCkBAIC02NTgsMTEgKzY5NCwxNCBAQAogCiAKIC8qKgotICogaGxpc3RfYWRkX2hlYWRfcmN1IC0gYWRkcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBobGlzdCwKLSAqIHdoaWxlIHBlcm1pdHRpbmcgcmFjaW5nIHRyYXZlcnNhbHMuCisgKiBobGlzdF9hZGRfaGVhZF9yY3UKICAqIEBuOiB0aGUgZWxlbWVudCB0byBhZGQgdG8gdGhlIGhhc2ggbGlzdC4KICAqIEBoOiB0aGUgbGlzdCB0byBhZGQgdG8uCiAgKgorICogRGVzY3JpcHRpb246CisgKiBBZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGhsaXN0LAorICogd2hpbGUgcGVybWl0dGluZyByYWNpbmcgdHJhdmVyc2Fscy4KKyAqCiAgKiBUaGUgY2FsbGVyIG11c3QgdGFrZSB3aGF0ZXZlciBwcmVjYXV0aW9ucyBhcmUgbmVjZXNzYXJ5CiAgKiAoc3VjaCBhcyBob2xkaW5nIGFwcHJvcHJpYXRlIGxvY2tzKSB0byBhdm9pZCByYWNpbmcKICAqIHdpdGggYW5vdGhlciBsaXN0LW11dGF0aW9uIHByaW1pdGl2ZSwgc3VjaCBhcyBobGlzdF9hZGRfaGVhZF9yY3UoKQpAQCAtNzA3LDExICs3NDYsMTQgQEAKIH0KIAogLyoqCi0gKiBobGlzdF9hZGRfYmVmb3JlX3JjdSAtIGFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaGxpc3QKLSAqIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5vZGUgd2hpbGUgcGVybWl0dGluZyByYWNpbmcgdHJhdmVyc2Fscy4KKyAqIGhsaXN0X2FkZF9iZWZvcmVfcmN1CiAgKiBAbjogdGhlIG5ldyBlbGVtZW50IHRvIGFkZCB0byB0aGUgaGFzaCBsaXN0LgogICogQG5leHQ6IHRoZSBleGlzdGluZyBlbGVtZW50IHRvIGFkZCB0aGUgbmV3IGVsZW1lbnQgYmVmb3JlLgogICoKKyAqIERlc2NyaXB0aW9uOgorICogQWRkcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBobGlzdAorICogYmVmb3JlIHRoZSBzcGVjaWZpZWQgbm9kZSB3aGlsZSBwZXJtaXR0aW5nIHJhY2luZyB0cmF2ZXJzYWxzLgorICoKICAqIFRoZSBjYWxsZXIgbXVzdCB0YWtlIHdoYXRldmVyIHByZWNhdXRpb25zIGFyZSBuZWNlc3NhcnkKICAqIChzdWNoIGFzIGhvbGRpbmcgYXBwcm9wcmlhdGUgbG9ja3MpIHRvIGF2b2lkIHJhY2luZwogICogd2l0aCBhbm90aGVyIGxpc3QtbXV0YXRpb24gcHJpbWl0aXZlLCBzdWNoIGFzIGhsaXN0X2FkZF9oZWFkX3JjdSgpCkBAIC03MzIsMTEgKzc3NCwxNCBAQAogfQogCiAvKioKLSAqIGhsaXN0X2FkZF9hZnRlcl9yY3UgLSBhZGRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGhsaXN0Ci0gKiBhZnRlciB0aGUgc3BlY2lmaWVkIG5vZGUgd2hpbGUgcGVybWl0dGluZyByYWNpbmcgdHJhdmVyc2Fscy4KKyAqIGhsaXN0X2FkZF9hZnRlcl9yY3UKICAqIEBwcmV2OiB0aGUgZXhpc3RpbmcgZWxlbWVudCB0byBhZGQgdGhlIG5ldyBlbGVtZW50IGFmdGVyLgogICogQG46IHRoZSBuZXcgZWxlbWVudCB0byBhZGQgdG8gdGhlIGhhc2ggbGlzdC4KICAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFkZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaGxpc3QKKyAqIGFmdGVyIHRoZSBzcGVjaWZpZWQgbm9kZSB3aGlsZSBwZXJtaXR0aW5nIHJhY2luZyB0cmF2ZXJzYWxzLgorICoKICAqIFRoZSBjYWxsZXIgbXVzdCB0YWtlIHdoYXRldmVyIHByZWNhdXRpb25zIGFyZSBuZWNlc3NhcnkKICAqIChzdWNoIGFzIGhvbGRpbmcgYXBwcm9wcmlhdGUgbG9ja3MpIHRvIGF2b2lkIHJhY2luZwogICogd2l0aCBhbm90aGVyIGxpc3QtbXV0YXRpb24gcHJpbWl0aXZlLCBzdWNoIGFzIGhsaXN0X2FkZF9oZWFkX3JjdSgpCkBAIC03NjksOCArODE0LDggQEAKIAogLyoqCiAgKiBobGlzdF9mb3JfZWFjaF9lbnRyeQktIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKLSAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KLSAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgaGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KICAqLwpAQCAtNzgxLDkgKzgyNiw5IEBACiAJICAgICBwb3MgPSBwb3MtPm5leHQpCiAKIC8qKgotICogaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLSBpdGVyYXRlIG92ZXIgYSBobGlzdCBjb250aW51aW5nIGFmdGVyIGV4aXN0aW5nIHBvaW50Ci0gKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlIC0gaXRlcmF0ZSBvdmVyIGEgaGxpc3QgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50CisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgaGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KICAqLwogI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSh0cG9zLCBwb3MsIG1lbWJlcikJCSBcCkBAIC03OTMsOSArODM4LDkgQEAKIAkgICAgIHBvcyA9IHBvcy0+bmV4dCkKIAogLyoqCi0gKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tIC0gaXRlcmF0ZSBvdmVyIGEgaGxpc3QgY29udGludWluZyBmcm9tIGV4aXN0aW5nIHBvaW50Ci0gKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20gLSBpdGVyYXRlIG92ZXIgYSBobGlzdCBjb250aW51aW5nIGZyb20gY3VycmVudCBwb2ludAorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKi8KICNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSh0cG9zLCBwb3MsIG1lbWJlcikJCQkgXApAQCAtODA1LDggKzg1MCw4IEBACiAKIC8qKgogICogaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQotICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyLgotICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCiAgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQogICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCiAgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgaGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KQEAgLTgxOSw4ICs4NjQsOCBAQAogCiAvKioKICAqIGhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSAtIGl0ZXJhdGUgb3ZlciByY3UgbGlzdCBvZiBnaXZlbiB0eXBlCi0gKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIuCi0gKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlci4KKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KICAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgogICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCmluZGV4IGE4ODc2YmMuLmFhNGZlOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKQEAgLTQ5LDExICs0OSwxMiBAQAogCQkJCWhfa2lsbGVkICAgICA6IDEsCiAJCQkJaF9tb25pdG9yZWQgIDogMTsKIAl3YWl0X3F1ZXVlX2hlYWRfdAloX2dyYWNld2FpdDsJLyogd2FpdCB3aGlsZSByZWNsYWltaW5nICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZQloX3J3c2VtOwkvKiBSZWJvb3QgcmVjb3ZlcnkgbG9jayAqLwogCXUzMgkJCWhfc3RhdGU7CS8qIHBzZXVkby1zdGF0ZSBjb3VudGVyICovCiAJdTMyCQkJaF9uc21zdGF0ZTsJLyogdHJ1ZSByZW1vdGUgTlNNIHN0YXRlICovCiAJdTMyCQkJaF9waWRjb3VudDsJLyogUHNldWRvcGlkcyAqLwogCWF0b21pY190CQloX2NvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlCWhfc2VtYTsJCS8qIG11dGV4IGZvciBwbWFwIGJpbmRpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXgJCWhfbXV0ZXg7CS8qIG11dGV4IGZvciBwbWFwIGJpbmRpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQloX25leHRyZWJpbmQ7CS8qIG5leHQgcG9ydG1hcCBjYWxsICovCiAJdW5zaWduZWQgbG9uZwkJaF9leHBpcmVzOwkvKiBlbGlnaWJsZSBmb3IgR0MgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWhfbG9ja293bmVyczsJLyogTG9ja293bmVycyBmb3IgdGhlIGNsaWVudCAqLwpAQCAtMjE5LDYgKzIyMCw3IEBACiBubG1fY29tcGFyZV9sb2Nrcyhjb25zdCBzdHJ1Y3QgZmlsZV9sb2NrICpmbDEsIGNvbnN0IHN0cnVjdCBmaWxlX2xvY2sgKmZsMikKIHsKIAlyZXR1cm4JZmwxLT5mbF9waWQgICA9PSBmbDItPmZsX3BpZAorCSAgICAgJiYgZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyCiAJICAgICAmJiBmbDEtPmZsX3N0YXJ0ID09IGZsMi0+Zmxfc3RhcnQKIAkgICAgICYmIGZsMS0+ZmxfZW5kICAgPT0gZmwyLT5mbF9lbmQKIAkgICAgICYmKGZsMS0+ZmxfdHlwZSAgPT0gZmwyLT5mbF90eXBlIHx8IGZsMi0+ZmxfdHlwZSA9PSBGX1VOTENLKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9vcC5oIGIvaW5jbHVkZS9saW51eC9sb29wLmgKaW5kZXggZTc2Yzc2MS4uYmYzZDIzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb29wLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb29wLmgKQEAgLTU5LDcgKzU5LDcgQEAKIAlzdHJ1Y3QgYmlvIAkJKmxvX2JpbzsKIAlzdHJ1Y3QgYmlvCQkqbG9fYmlvdGFpbDsKIAlpbnQJCQlsb19zdGF0ZTsKLQlzdHJ1Y3QgY29tcGxldGlvbglsb19kb25lOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqbG9fdGhyZWFkOwogCXN0cnVjdCBjb21wbGV0aW9uCWxvX2JoX2RvbmU7CiAJc3RydWN0IG11dGV4CQlsb19jdGxfbXV0ZXg7CiAJaW50CQkJbG9fcGVuZGluZzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbTQxdDAwLmggYi9pbmNsdWRlL2xpbnV4L200MXQwMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MjMzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L200MXQwMC5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFNUIE00MVQwMCBmYW1pbHkgb2YgaTJjIHJ0YyBjaGlwcy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQS4gR3JlZXIgPG1ncmVlckBtdmlzdGEuY29tPgorICoKKyAqIDIwMDUsIDIwMDYgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtCisgKiBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQuCisgKi8KKworI2lmbmRlZiBfTTQxVDAwX0gKKyNkZWZpbmUgX000MVQwMF9ICisKKyNkZWZpbmUJTTQxVDAwX0RSVl9OQU1FCQkibTQxdDAwIgorI2RlZmluZQlNNDFUMDBfSTJDX0FERFIJCTB4NjgKKworI2RlZmluZQlNNDFUMDBfVFlQRV9NNDFUMDAJMAorI2RlZmluZQlNNDFUMDBfVFlQRV9NNDFUODEJODEKKyNkZWZpbmUJTTQxVDAwX1RZUEVfTTQxVDg1CTg1CisKK3N0cnVjdCBtNDF0MDBfcGxhdGZvcm1fZGF0YSB7CisJdTgJdHlwZTsKKwl1OAlpMmNfYWRkcjsKKwl1OAlzcXdfZnJlcTsKK307CisKKy8qIFNRVyBvdXRwdXQgZGlzYWJsZWQsIHRoaXMgaXMgZGVmYXVsdCB2YWx1ZSBieSBwb3dlciBvbiAqLworI2RlZmluZSBNNDFUMDBfU1FXX0RJU0FCTEUJKDApCisKKyNkZWZpbmUgTTQxVDAwX1NRV18zMktIWgkoMTw8NCkJCS8qIDMyLjc2OCBLSHogKi8KKyNkZWZpbmUgTTQxVDAwX1NRV184S0haCQkoMjw8NCkJCS8qIDguMTkyIEtIeiAqLworI2RlZmluZSBNNDFUMDBfU1FXXzRLSFoJCSgzPDw0KQkJLyogNC4wOTYgS0h6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfMktIWgkJKDQ8PDQpCQkvKiAyLjA0OCBLSHogKi8KKyNkZWZpbmUgTTQxVDAwX1NRV18xS0haCQkoNTw8NCkJCS8qIDEuMDI0IEtIeiAqLworI2RlZmluZSBNNDFUMDBfU1FXXzUxMkhaCSg2PDw0KQkJLyogNTEyIEh6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfMjU2SFoJKDc8PDQpCQkvKiAyNTYgSHogKi8KKyNkZWZpbmUgTTQxVDAwX1NRV18xMjhIWgkoODw8NCkJCS8qIDEyOCBIeiAqLworI2RlZmluZSBNNDFUMDBfU1FXXzY0SFoJCSg5PDw0KQkJLyogNjQgSHogKi8KKyNkZWZpbmUgTTQxVDAwX1NRV18zMkhaCQkoMTA8PDQpCQkvKiAzMiBIeiAqLworI2RlZmluZSBNNDFUMDBfU1FXXzE2SFoJCSgxMTw8NCkJCS8qIDE2IEh6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfOEhaCQkoMTI8PDQpCQkvKiA4IEh6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfNEhaCQkoMTM8PDQpCQkvKiA0IEh6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfMkhaCQkoMTQ8PDQpCQkvKiAyIEh6ICovCisjZGVmaW5lIE00MVQwMF9TUVdfMUhaCQkoMTU8PDQpCQkvKiAxIEh6ICovCisKK2V4dGVybiB1bG9uZyBtNDF0MDBfZ2V0X3J0Y190aW1lKHZvaWQpOworZXh0ZXJuIGludCBtNDF0MDBfc2V0X3J0Y190aW1lKHVsb25nIG5vd3RpbWUpOworCisjZW5kaWYgLyogX000MVQwMF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaCBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCmluZGV4IDY3ODljNDkuLjQ4MTQ4ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWlncmF0ZS5oCkBAIC0zLDMzICszLDQyIEBACiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCit0eXBlZGVmIHN0cnVjdCBwYWdlICpuZXdfcGFnZV90KHN0cnVjdCBwYWdlICosIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqKTsKKwogI2lmZGVmIENPTkZJR19NSUdSQVRJT04KIGV4dGVybiBpbnQgaXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcCwgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QpOwogZXh0ZXJuIGludCBwdXRiYWNrX2xydV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsKTsKLWV4dGVybiBpbnQgbWlncmF0ZV9wYWdlKHN0cnVjdCBwYWdlICosIHN0cnVjdCBwYWdlICopOwotZXh0ZXJuIHZvaWQgbWlncmF0ZV9wYWdlX2NvcHkoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7Ci1leHRlcm4gaW50IG1pZ3JhdGVfcGFnZV9yZW1vdmVfcmVmZXJlbmNlcyhzdHJ1Y3QgcGFnZSAqLCBzdHJ1Y3QgcGFnZSAqLCBpbnQpOwotZXh0ZXJuIGludCBtaWdyYXRlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmwsIHN0cnVjdCBsaXN0X2hlYWQgKnQsCi0JCXN0cnVjdCBsaXN0X2hlYWQgKm1vdmVkLCBzdHJ1Y3QgbGlzdF9oZWFkICpmYWlsZWQpOwotZXh0ZXJuIGludCBtaWdyYXRlX3BhZ2VzX3RvKHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VsaXN0LAotCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGludCBkZXN0KTsKLWV4dGVybiBpbnQgZmFpbF9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IG1pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAorCQkJc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LCB1bnNpZ25lZCBsb25nKTsKKworZXh0ZXJuIGludCBmYWlsX21pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLAorCQkJc3RydWN0IHBhZ2UgKiwgc3RydWN0IHBhZ2UgKik7CiAKIGV4dGVybiBpbnQgbWlncmF0ZV9wcmVwKHZvaWQpOwotCitleHRlcm4gaW50IG1pZ3JhdGVfdm1hcyhzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJY29uc3Qgbm9kZW1hc2tfdCAqZnJvbSwgY29uc3Qgbm9kZW1hc2tfdCAqdG8sCisJCXVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQgaXNvbGF0ZV9scnVfcGFnZShzdHJ1Y3QgcGFnZSAqcCwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIAkJCQkJeyByZXR1cm4gLUVOT1NZUzsgfQogc3RhdGljIGlubGluZSBpbnQgcHV0YmFja19scnVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpsLCBzdHJ1Y3QgbGlzdF9oZWFkICp0LAotCXN0cnVjdCBsaXN0X2hlYWQgKm1vdmVkLCBzdHJ1Y3QgbGlzdF9oZWFkICpmYWlsZWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgaW50IG1pZ3JhdGVfcGFnZXMoc3RydWN0IGxpc3RfaGVhZCAqbCwgbmV3X3BhZ2VfdCB4LAorCQl1bnNpZ25lZCBsb25nIHByaXZhdGUpIHsgcmV0dXJuIC1FTk9TWVM7IH0KIAogc3RhdGljIGlubGluZSBpbnQgbWlncmF0ZV9wYWdlc190byhzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlbGlzdCwKIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBpbnQgZGVzdCkgeyByZXR1cm4gMDsgfQogCiBzdGF0aWMgaW5saW5lIGludCBtaWdyYXRlX3ByZXAodm9pZCkgeyByZXR1cm4gLUVOT1NZUzsgfQogCitzdGF0aWMgaW5saW5lIGludCBtaWdyYXRlX3ZtYXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCWNvbnN0IG5vZGVtYXNrX3QgKmZyb20sIGNvbnN0IG5vZGVtYXNrX3QgKnRvLAorCQl1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiAvKiBQb3NzaWJsZSBzZXR0aW5ncyBmb3IgdGhlIG1pZ3JhdGVfcGFnZSgpIG1ldGhvZCBpbiBhZGRyZXNzX29wZXJhdGlvbnMgKi8KICNkZWZpbmUgbWlncmF0ZV9wYWdlIE5VTEwKICNkZWZpbmUgZmFpbF9taWdyYXRlX3BhZ2UgTlVMTApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGUyZmEzNzUuLmE5MjllYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTE0NSw3ICsxNDUsNiBAQAogCiAjZGVmaW5lIFZNX0dST1dTRE9XTgkweDAwMDAwMTAwCS8qIGdlbmVyYWwgaW5mbyBvbiB0aGUgc2VnbWVudCAqLwogI2RlZmluZSBWTV9HUk9XU1VQCTB4MDAwMDAyMDAKLSNkZWZpbmUgVk1fU0hNCQkweDAwMDAwMDAwCS8qIE1lYW5zIG5vdGhpbmc6IGRlbGV0ZSBpdCBsYXRlciAqLwogI2RlZmluZSBWTV9QRk5NQVAJMHgwMDAwMDQwMAkvKiBQYWdlLXJhbmdlcyBtYW5hZ2VkIHdpdGhvdXQgInN0cnVjdCBwYWdlIiwganVzdCBwdXJlIFBGTiAqLwogI2RlZmluZSBWTV9ERU5ZV1JJVEUJMHgwMDAwMDgwMAkvKiBFVFhUQlNZIG9uIHdyaXRlIGF0dGVtcHRzLi4gKi8KIApAQCAtMTk5LDEwICsxOTgsMTYgQEAKIAl2b2lkICgqY2xvc2UpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGFyZWEpOwogCXN0cnVjdCBwYWdlICogKCpub3BhZ2UpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIGFyZWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKTsKIAlpbnQgKCpwb3B1bGF0ZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogYXJlYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCB1bnNpZ25lZCBsb25nIGxlbiwgcGdwcm90X3QgcHJvdCwgdW5zaWduZWQgbG9uZyBwZ29mZiwgaW50IG5vbmJsb2NrKTsKKworCS8qIG5vdGlmaWNhdGlvbiB0aGF0IGEgcHJldmlvdXNseSByZWFkLW9ubHkgcGFnZSBpcyBhYm91dCB0byBiZWNvbWUKKwkgKiB3cml0YWJsZSwgaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQgaXQgd2lsbCBjYXVzZSBhIFNJR0JVUyAqLworCWludCAoKnBhZ2VfbWt3cml0ZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKTsKICNpZmRlZiBDT05GSUdfTlVNQQogCWludCAoKnNldF9wb2xpY3kpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgbWVtcG9saWN5ICpuZXcpOwogCXN0cnVjdCBtZW1wb2xpY3kgKigqZ2V0X3BvbGljeSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJCXVuc2lnbmVkIGxvbmcgYWRkcik7CisJaW50ICgqbWlncmF0ZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGNvbnN0IG5vZGVtYXNrX3QgKmZyb20sCisJCWNvbnN0IG5vZGVtYXNrX3QgKnRvLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKICNlbmRpZgogfTsKIApAQCAtNDY1LDEwICs0NzAsMTMgQEAKIHN0cnVjdCB6b25lOwogZXh0ZXJuIHN0cnVjdCB6b25lICp6b25lX3RhYmxlW107CiAKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2Vfem9uZV9pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gKHBhZ2UtPmZsYWdzID4+IFpPTkVUQUJMRV9QR1NISUZUKSAmIFpPTkVUQUJMRV9NQVNLOworfQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgem9uZSAqcGFnZV96b25lKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXJldHVybiB6b25lX3RhYmxlWyhwYWdlLT5mbGFncyA+PiBaT05FVEFCTEVfUEdTSElGVCkgJgotCQkJWk9ORVRBQkxFX01BU0tdOworCXJldHVybiB6b25lX3RhYmxlW3BhZ2Vfem9uZV9pZChwYWdlKV07CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwYWdlX3RvX25pZChzdHJ1Y3QgcGFnZSAqcGFnZSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IDk3NDJlM2MuLmQ2MTIwZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMTk3LDcgKzE5Nyw3IEBACiAKIAkvKgogCSAqIHdhaXRfdGFibGUJCS0tIHRoZSBhcnJheSBob2xkaW5nIHRoZSBoYXNoIHRhYmxlCi0JICogd2FpdF90YWJsZV9zaXplCS0tIHRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlIGFycmF5CisJICogd2FpdF90YWJsZV9oYXNoX25yX2VudHJpZXMJLS0gdGhlIHNpemUgb2YgdGhlIGhhc2ggdGFibGUgYXJyYXkKIAkgKiB3YWl0X3RhYmxlX2JpdHMJLS0gd2FpdF90YWJsZV9zaXplID09ICgxIDw8IHdhaXRfdGFibGVfYml0cykKIAkgKgogCSAqIFRoZSBwdXJwb3NlIG9mIGFsbCB0aGVzZSBpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBwZW9wbGUKQEAgLTIyMCw3ICsyMjAsNyBAQAogCSAqIGZyZWVfYXJlYV9pbml0X2NvcmUoKSBwZXJmb3JtcyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlbS4KIAkgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAkqIHdhaXRfdGFibGU7Ci0JdW5zaWduZWQgbG9uZwkJd2FpdF90YWJsZV9zaXplOworCXVuc2lnbmVkIGxvbmcJCXdhaXRfdGFibGVfaGFzaF9ucl9lbnRyaWVzOwogCXVuc2lnbmVkIGxvbmcJCXdhaXRfdGFibGVfYml0czsKIAogCS8qCkBAIC0zMzMsNiArMzMzLDkgQEAKIGludCB6b25lX3dhdGVybWFya19vayhzdHJ1Y3Qgem9uZSAqeiwgaW50IG9yZGVyLCB1bnNpZ25lZCBsb25nIG1hcmssCiAJCWludCBjbGFzc3pvbmVfaWR4LCBpbnQgYWxsb2NfZmxhZ3MpOwogCitleHRlcm4gaW50IGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplKTsKKwogI2lmZGVmIENPTkZJR19IQVZFX01FTU9SWV9QUkVTRU5UCiB2b2lkIG1lbW9yeV9wcmVzZW50KGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKICNlbHNlCkBAIC01MDYsNiArNTA5LDEwIEBACiAJICogcGFnZXMuICBIb3dldmVyLCBpdCBpcyBzdG9yZWQgd2l0aCBzb21lIG90aGVyIG1hZ2ljLgogCSAqIChzZWUgc3BhcnNlLmM6OnNwYXJzZV9pbml0X29uZV9zZWN0aW9uKCkpCiAJICoKKwkgKiBBZGRpdGlvbmFsbHkgZHVyaW5nIGVhcmx5IGJvb3Qgd2UgZW5jb2RlIG5vZGUgaWQgb2YKKwkgKiB0aGUgbG9jYXRpb24gb2YgdGhlIHNlY3Rpb24gaGVyZSB0byBndWlkZSBhbGxvY2F0aW9uLgorCSAqIChzZWUgc3BhcnNlLmM6Om1lbW9yeV9wcmVzZW50KCkpCisJICoKIAkgKiBNYWtpbmcgaXQgYSBVTCBhdCBsZWFzdCBtYWtlcyBzb21lb25lIGRvIGEgY2FzdAogCSAqIGJlZm9yZSB1c2luZyBpdCB3cm9uZy4KIAkgKi8KQEAgLTU0NSw2ICs1NTIsNyBAQAogI2RlZmluZSBTRUNUSU9OX0hBU19NRU1fTUFQCSgxVUw8PDEpCiAjZGVmaW5lIFNFQ1RJT05fTUFQX0xBU1RfQklUCSgxVUw8PDIpCiAjZGVmaW5lIFNFQ1RJT05fTUFQX01BU0sJKH4oU0VDVElPTl9NQVBfTEFTVF9CSVQtMSkpCisjZGVmaW5lIFNFQ1RJT05fTklEX1NISUZUCTIKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqX19zZWN0aW9uX21lbV9tYXBfYWRkcihzdHJ1Y3QgbWVtX3NlY3Rpb24gKnNlY3Rpb24pCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCBjMmQ4OWUwLi4yZDM2NjA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTEwNSw2ICsxMDUsOCBAQAogICoJIkdQTCBhbmQgYWRkaXRpb25hbCByaWdodHMiCVtHTlUgUHVibGljIExpY2Vuc2UgdjIgcmlnaHRzIGFuZCBtb3JlXQogICoJIkR1YWwgQlNEL0dQTCIJCQlbR05VIFB1YmxpYyBMaWNlbnNlIHYyCiAgKgkJCQkJIG9yIEJTRCBsaWNlbnNlIGNob2ljZV0KKyAqCSJEdWFsIE1JVC9HUEwiCQkJW0dOVSBQdWJsaWMgTGljZW5zZSB2MgorICoJCQkJCSBvciBNSVQgbGljZW5zZSBjaG9pY2VdCiAgKgkiRHVhbCBNUEwvR1BMIgkJCVtHTlUgUHVibGljIExpY2Vuc2UgdjIKICAqCQkJCQkgb3IgTW96aWxsYSBsaWNlbnNlIGNob2ljZV0KICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vdW50LmggYi9pbmNsdWRlL2xpbnV4L21vdW50LmgKaW5kZXggYjc0NzJhZS4uNDAzZDFhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb3VudC5oCisrKyBiL2luY2x1ZGUvbGludXgvbW91bnQuaApAQCAtMTcsMTIgKzE3LDE5IEBACiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKK3N0cnVjdCBzdXBlcl9ibG9jazsKK3N0cnVjdCB2ZnNtb3VudDsKK3N0cnVjdCBkZW50cnk7CitzdHJ1Y3QgbmFtZXNwYWNlOworCiAjZGVmaW5lIE1OVF9OT1NVSUQJMHgwMQogI2RlZmluZSBNTlRfTk9ERVYJMHgwMgogI2RlZmluZSBNTlRfTk9FWEVDCTB4MDQKICNkZWZpbmUgTU5UX05PQVRJTUUJMHgwOAogI2RlZmluZSBNTlRfTk9ESVJBVElNRQkweDEwCiAKKyNkZWZpbmUgTU5UX1NIUklOS0FCTEUJMHgxMDAKKwogI2RlZmluZSBNTlRfU0hBUkVECTB4MTAwMAkvKiBpZiB0aGUgdmZzbW91bnQgaXMgYSBzaGFyZWQgbW91bnQgKi8KICNkZWZpbmUgTU5UX1VOQklOREFCTEUJMHgyMDAwCS8qIGlmIHRoZSB2ZnNtb3VudCBpcyBhIHVuYmluZGFibGUgbW91bnQgKi8KICNkZWZpbmUgTU5UX1BOT0RFX01BU0sJMHgzMDAwCS8qIHByb3BvZ2F0aW9uIGZsYWcgbWFzayAqLwpAQCAtNzMsMTIgKzgwLDE4IEBACiBleHRlcm4gc3RydWN0IHZmc21vdW50ICpkb19rZXJuX21vdW50KGNvbnN0IGNoYXIgKmZzdHlwZSwgaW50IGZsYWdzLAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpOwogCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZTsKK2V4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKnZmc19rZXJuX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlLAorCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICB2b2lkICpkYXRhKTsKKwogc3RydWN0IG5hbWVpZGF0YTsKIAogZXh0ZXJuIGludCBkb19hZGRfbW91bnQoc3RydWN0IHZmc21vdW50ICpuZXdtbnQsIHN0cnVjdCBuYW1laWRhdGEgKm5kLAogCQkJaW50IG1udF9mbGFncywgc3RydWN0IGxpc3RfaGVhZCAqZnNsaXN0KTsKIAogZXh0ZXJuIHZvaWQgbWFya19tb3VudHNfZm9yX2V4cGlyeShzdHJ1Y3QgbGlzdF9oZWFkICptb3VudHMpOworZXh0ZXJuIHZvaWQgc2hyaW5rX3N1Ym1vdW50cyhzdHJ1Y3QgdmZzbW91bnQgKm1vdW50cG9pbnQsIHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cyk7CiAKIGV4dGVybiBzcGlubG9ja190IHZmc21vdW50X2xvY2s7CiBleHRlcm4gZGV2X3QgbmFtZV90b19kZXZfdChjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmJkLmggYi9pbmNsdWRlL2xpbnV4L25iZC5oCmluZGV4IDFkN2NkZDIuLmU3MTJlN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmJkLmgKKysrIGIvaW5jbHVkZS9saW51eC9uYmQuaApAQCAtNzcsMTEgKzc3LDExIEBACiAgKiBzZXJ2ZXIuIEFsbCBkYXRhIGFyZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIuCiAgKi8KIHN0cnVjdCBuYmRfcmVxdWVzdCB7Ci0JX191MzIgbWFnaWM7Ci0JX191MzIgdHlwZTsJLyogPT0gUkVBRCB8fCA9PSBXUklURSAJKi8KKwlfX2JlMzIgbWFnaWM7CisJX19iZTMyIHR5cGU7CS8qID09IFJFQUQgfHwgPT0gV1JJVEUgCSovCiAJY2hhciBoYW5kbGVbOF07Ci0JX191NjQgZnJvbTsKLQlfX3UzMiBsZW47CisJX19iZTY0IGZyb207CisJX19iZTMyIGxlbjsKIH0KICNpZmRlZiBfX0dOVUNfXwogCV9fYXR0cmlidXRlX18gKChwYWNrZWQpKQpAQCAtOTMsOCArOTMsOCBAQAogICogaXQgaGFzIGNvbXBsZXRlZCBhbiBJL08gcmVxdWVzdCAob3IgYW4gZXJyb3Igb2NjdXJzKS4KICAqLwogc3RydWN0IG5iZF9yZXBseSB7Ci0JX191MzIgbWFnaWM7Ci0JX191MzIgZXJyb3I7CQkvKiAwID0gb2ssIGVsc2UgZXJyb3IJKi8KKwlfX2JlMzIgbWFnaWM7CisJX19iZTMyIGVycm9yOwkJLyogMCA9IG9rLCBlbHNlIGVycm9yCSovCiAJY2hhciBoYW5kbGVbOF07CQkvKiBoYW5kbGUgeW91IGdvdCBmcm9tIHJlcXVlc3QJKi8KIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGNlYWQ2YmUuLmJjNzQ3ZTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtMzA4LDkgKzMwOCwxMyBAQAogI2RlZmluZSBORVRJRl9GX0hXX1ZMQU5fUlgJMjU2CS8qIFJlY2VpdmUgVkxBTiBodyBhY2NlbGVyYXRpb24gKi8KICNkZWZpbmUgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUgk1MTIJLyogUmVjZWl2ZSBmaWx0ZXJpbmcgb24gVkxBTiAqLwogI2RlZmluZSBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRAkxMDI0CS8qIERldmljZSBjYW5ub3QgaGFuZGxlIFZMQU4gcGFja2V0cyAqLwotI2RlZmluZSBORVRJRl9GX1RTTwkJMjA0OAkvKiBDYW4gb2ZmbG9hZCBUQ1AvSVAgc2VnbWVudGF0aW9uICovCisjZGVmaW5lIE5FVElGX0ZfR1NPCQkyMDQ4CS8qIEVuYWJsZSBzb2Z0d2FyZSBHU08uICovCiAjZGVmaW5lIE5FVElGX0ZfTExUWAkJNDA5NgkvKiBMb2NrTGVzcyBUWCAqLwotI2RlZmluZSBORVRJRl9GX1VGTyAgICAgICAgICAgICA4MTkyICAgIC8qIENhbiBvZmZsb2FkIFVEUCBMYXJnZSBTZW5kKi8KKworCS8qIFNlZ21lbnRhdGlvbiBvZmZsb2FkIGZlYXR1cmVzICovCisjZGVmaW5lIE5FVElGX0ZfR1NPX1NISUZUCTE2CisjZGVmaW5lIE5FVElGX0ZfVFNPCQkoU0tCX0dTT19UQ1BWNCA8PCBORVRJRl9GX0dTT19TSElGVCkKKyNkZWZpbmUgTkVUSUZfRl9VRk8JCShTS0JfR1NPX1VEUFY0IDw8IE5FVElGX0ZfR1NPX1NISUZUKQogCiAjZGVmaW5lIE5FVElGX0ZfR0VOX0NTVU0JKE5FVElGX0ZfTk9fQ1NVTSB8IE5FVElGX0ZfSFdfQ1NVTSkKICNkZWZpbmUgTkVUSUZfRl9BTExfQ1NVTQkoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9HRU5fQ1NVTSkKQEAgLTQwMiw2ICs0MDYsOSBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcWRpc2NfbGlzdDsKIAl1bnNpZ25lZCBsb25nCQl0eF9xdWV1ZV9sZW47CS8qIE1heCBmcmFtZXMgcGVyIHF1ZXVlIGFsbG93ZWQgKi8KIAorCS8qIFBhcnRpYWxseSB0cmFuc21pdHRlZCBHU08gcGFja2V0LiAqLworCXN0cnVjdCBza19idWZmCQkqZ3NvX3NrYjsKKwogCS8qIGluZ3Jlc3MgcGF0aCBzeW5jaHJvbml6ZXIgKi8KIAlzcGlubG9ja190CQlpbmdyZXNzX2xvY2s7CiAJc3RydWN0IFFkaXNjCQkqcWRpc2NfaW5ncmVzczsKQEAgLTUzNiw2ICs1NDMsNyBAQAogCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJCQkJIHN0cnVjdCBwYWNrZXRfdHlwZSAqLAogCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKik7CisJc3RydWN0IHNrX2J1ZmYJCSooKmdzb19zZWdtZW50KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc2cpOwogCXZvaWQJCQkqYWZfcGFja2V0X3ByaXY7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogfTsKQEAgLTY4Niw3ICs2OTQsOCBAQAogZXh0ZXJuIGludAkJZGV2X3NldF9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKiwgaW50KTsKIGV4dGVybiBpbnQJCWRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJCQkJICAgIHN0cnVjdCBzb2NrYWRkciAqKTsKLWV4dGVybiB2b2lkCQlkZXZfcXVldWVfeG1pdF9uaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50CQlkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogZXh0ZXJuIHZvaWQJCWRldl9pbml0KHZvaWQpOwogCkBAIC05NjAsNiArOTY5LDcgQEAKIGV4dGVybiBpbnQJCXdlaWdodF9wOwogZXh0ZXJuIGludAkJbmV0ZGV2X3NldF9tYXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm1hc3Rlcik7CiBleHRlcm4gaW50IHNrYl9jaGVja3N1bV9oZWxwKHN0cnVjdCBza19idWZmICpza2IsIGludCBpbndhcmQpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNnKTsKICNpZmRlZiBDT05GSUdfQlVHCiBleHRlcm4gdm9pZCBuZXRkZXZfcnhfY3N1bV9mYXVsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKICNlbHNlCkBAIC05NzksNiArOTg5LDEzIEBACiAKIGV4dGVybiB2b2lkIGxpbmt3YXRjaF9ydW5fcXVldWUodm9pZCk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGlmX25lZWRzX2dzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBmZWF0dXJlID0gc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA8PCBORVRJRl9GX0dTT19TSElGVDsKKwlyZXR1cm4gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSAmJgorCSAgICAgICAoZGV2LT5mZWF0dXJlcyAmIGZlYXR1cmUpICE9IGZlYXR1cmU7Cit9CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfTElOVVhfREVWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggODdiOGE1Ny4uODU1YjQ0NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTUsNyArNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBORVRMSU5LX1JPVVRFCQkwCS8qIFJvdXRpbmcvZGV2aWNlIGhvb2sJCQkJKi8KLSNkZWZpbmUgTkVUTElOS19XMQkJMQkvKiAxLXdpcmUgc3Vic3lzdGVtCQkJCSovCisjZGVmaW5lIE5FVExJTktfVU5VU0VECQkxCS8qIFVudXNlZCBudW1iZXIJCQkJKi8KICNkZWZpbmUgTkVUTElOS19VU0VSU09DSwkyCS8qIFJlc2VydmVkIGZvciB1c2VyIG1vZGUgc29ja2V0IHByb3RvY29scyAJKi8KICNkZWZpbmUgTkVUTElOS19GSVJFV0FMTAkzCS8qIEZpcmV3YWxsaW5nIGhvb2sJCQkJKi8KICNkZWZpbmUgTkVUTElOS19JTkVUX0RJQUcJNAkvKiBJTkVUIHNvY2tldCBtb25pdG9yaW5nCQkJKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzNC5oIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKaW5kZXggMTA1OWU2ZC4uNWY2ODFkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnM0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnM0LmgKQEAgLTM4NCw2ICszODQsNyBAQAogCU5GU1BST0M0X0NMTlRfREVMRUdSRVRVUk4sCiAJTkZTUFJPQzRfQ0xOVF9HRVRBQ0wsCiAJTkZTUFJPQzRfQ0xOVF9TRVRBQ0wsCisJTkZTUFJPQzRfQ0xOVF9GU19MT0NBVElPTlMsCiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDdlMDc5ZjguLjBhMTc0MGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtOSw2ICs5LDI3IEBACiAjaWZuZGVmIF9MSU5VWF9ORlNfRlNfSAogI2RlZmluZSBfTElOVVhfTkZTX0ZTX0gKIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KKworI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgogCiAvKgogICogRW5hYmxlIGRlYnVnZ2luZyBzdXBwb3J0IGZvciBuZnMgY2xpZW50LgpAQCAtNDEsMjcgKzYyLDkgQEAKICNkZWZpbmUgRkxVU0hfTE9XUFJJCQk4CS8qIGxvdyBwcmlvcml0eSBiYWNrZ3JvdW5kIGZsdXNoICovCiAjZGVmaW5lIEZMVVNIX0hJR0hQUkkJCTE2CS8qIGhpZ2ggcHJpb3JpdHkgbWVtb3J5IHJlY2xhaW0gZmx1c2ggKi8KICNkZWZpbmUgRkxVU0hfTk9DT01NSVQJCTMyCS8qIERvbid0IHNlbmQgdGhlIE5GU3YzL3Y0IENPTU1JVCAqLworI2RlZmluZSBGTFVTSF9JTlZBTElEQVRFCTY0CS8qIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUgKi8KIAogI2lmZGVmIF9fS0VSTkVMX18KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSA8bGludXgvbmZzX2ZzX3NiLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZGVidWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zdW5ycGMvYXV0aC5oPgotI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnMyLmg+Ci0jaW5jbHVkZSA8bGludXgvbmZzMy5oPgotI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZnNfeGRyLmg+Ci0jaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CiAKIC8qCiAgKiBORlN2My92NCBBY2Nlc3MgbW9kZSBjYWNoZSBlbnRyeQpAQCAtMjMzLDggKzIzNiwxMiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZzX21hcmtfZm9yX3JldmFsaWRhdGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKLQlORlNfSShpbm9kZSktPmNhY2hlX3ZhbGlkaXR5IHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSIHwgTkZTX0lOT19JTlZBTElEX0FDQ0VTUzsKKwluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQluZnNpLT5jYWNoZV92YWxpZGl0eSB8PSBORlNfSU5PX1JFVkFMX1BBR0VDQUNIRXxORlNfSU5PX0lOVkFMSURfREFUQTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiB9CiAKQEAgLTI5Niw3ICszMDMsNyBAQAogZXh0ZXJuIGludCBuZnNfYXR0cmlidXRlX3RpbWVvdXQoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gaW50IG5mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogZXh0ZXJuIGludCBfX25mc19yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiB2b2lkIG5mc19yZXZhbGlkYXRlX21hcHBpbmcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpOworZXh0ZXJuIGludCBuZnNfcmV2YWxpZGF0ZV9tYXBwaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKIGV4dGVybiBpbnQgbmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CiBleHRlcm4gdm9pZCBuZnNfc2V0YXR0cl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICphdHRyKTsKIGV4dGVybiB2b2lkIG5mc19iZWdpbl9hdHRyX3VwZGF0ZShzdHJ1Y3QgaW5vZGUgKik7CkBAIC0zMDYsNiArMzEzLDEwIEBACiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmdldF9uZnNfb3Blbl9jb250ZXh0KHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpOwogZXh0ZXJuIHZvaWQgcHV0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCk7CiBleHRlcm4gc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKm5mc19maW5kX29wZW5fY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBtb2RlKTsKK2V4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKm5mc19kb19zdWJtb3VudChjb25zdCBzdHJ1Y3QgdmZzbW91bnQgKm1udF9wYXJlbnQsCisJCQkJCWNvbnN0IHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkJc3RydWN0IG5mc19maCAqZmgsCisJCQkJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKTsKIAogLyogbGludXgvbmV0L2lwdjQvaXBjb25maWcuYzogdHJpbXMgaXAgYWRkciBvZmYgZnJvbnQgb2YgbmFtZSwgdG9vLiAqLwogZXh0ZXJuIHUzMiByb290X25mc19wYXJzZV9hZGRyKGNoYXIgKm5hbWUpOyAvKl9faW5pdCovCkBAIC0zOTIsNiArNDAzLDE1IEBACiAjZW5kaWYKIAogLyoKKyAqIGxpbnV4L2ZzL25mcy9uYW1lc3BhY2UuYworICovCitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZnNfYXV0b21vdW50X2xpc3Q7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzX21vdW50cG9pbnRfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnNfcmVmZXJyYWxfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBpbnQgbmZzX21vdW50cG9pbnRfZXhwaXJ5X3RpbWVvdXQ7CitleHRlcm4gdm9pZCBuZnNfcmVsZWFzZV9hdXRvbW91bnRfdGltZXIodm9pZCk7CisKKy8qCiAgKiBsaW51eC9mcy9uZnMvdW5saW5rLmMKICAqLwogZXh0ZXJuIGludCAgbmZzX2FzeW5jX3VubGluayhzdHJ1Y3QgZGVudHJ5ICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNjVkZWMyMS4uNmI0YTEzYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC0zNSw2ICszNSw3IEBACiAJY2hhciAqCQkJaG9zdG5hbWU7CS8qIHJlbW90ZSBob3N0bmFtZSAqLwogCXN0cnVjdCBuZnNfZmgJCWZoOwogCXN0cnVjdCBzb2NrYWRkcl9pbglhZGRyOworCXN0cnVjdCBuZnNfZnNpZAkJZnNpZDsKIAl1bnNpZ25lZCBsb25nCQltb3VudF90aW1lOwkvKiB3aGVuIHRoaXMgZnMgd2FzIG1vdW50ZWQgKi8KICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJLyogT3VyIG93biBJUCBhZGRyZXNzLCBhcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmggYi9pbmNsdWRlL2xpbnV4L25mc19wYWdlLmgKaW5kZXggNjZlMmVkNi4uMWY3YmQyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfcGFnZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmZzX3BhZ2UuaApAQCAtMTMsNyArMTMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L25mc19mc19zYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9hdXRoLmg+CiAjaW5jbHVkZSA8bGludXgvbmZzX3hkci5oPgogCkBAIC02Myw4ICs2Miw4IEBACiAKIGV4dGVybiAgaW50IG5mc19zY2FuX2xvY2tfZGlydHkoc3RydWN0IG5mc19pbm9kZSAqbmZzaSwgc3RydWN0IGxpc3RfaGVhZCAqZHN0LAogCQkJCXVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKTsKLWV4dGVybglpbnQgbmZzX3NjYW5fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICosIHN0cnVjdCBsaXN0X2hlYWQgKiwKLQkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgaW50KTsKK2V4dGVybglpbnQgbmZzX3NjYW5fbGlzdChzdHJ1Y3QgbmZzX2lub2RlICpuZnNpLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBzdHJ1Y3QgbGlzdF9oZWFkICpkc3QsCisJCQkgIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKTsKIGV4dGVybglpbnQgbmZzX2NvYWxlc2NlX3JlcXVlc3RzKHN0cnVjdCBsaXN0X2hlYWQgKiwgc3RydWN0IGxpc3RfaGVhZCAqLAogCQkJCSAgdW5zaWduZWQgaW50KTsKIGV4dGVybiAgaW50IG5mc193YWl0X29uX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA3ZmFmYzRjLi43YzczMjBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTQsMTEgKzE0LDE5IEBACiAjZGVmaW5lIE5GU19ERUZfRklMRV9JT19TSVpFCSg0MDk2VSkKICNkZWZpbmUgTkZTX01JTl9GSUxFX0lPX1NJWkUJKDEwMjRVKQogCi1zdHJ1Y3QgbmZzNF9mc2lkIHsKLQlfX3U2NCBtYWpvcjsKLQlfX3U2NCBtaW5vcjsKK3N0cnVjdCBuZnNfZnNpZCB7CisJdWludDY0X3QJCW1ham9yOworCXVpbnQ2NF90CQltaW5vcjsKIH07CiAKKy8qCisgKiBIZWxwZXIgZm9yIGNoZWNraW5nIGVxdWFsaXR5IGJldHdlZW4gMiBmc2lkcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbmZzX2ZzaWRfZXF1YWwoY29uc3Qgc3RydWN0IG5mc19mc2lkICphLCBjb25zdCBzdHJ1Y3QgbmZzX2ZzaWQgKmIpCit7CisJcmV0dXJuIGEtPm1ham9yID09IGItPm1ham9yICYmIGEtPm1pbm9yID09IGItPm1pbm9yOworfQorCiBzdHJ1Y3QgbmZzX2ZhdHRyIHsKIAl1bnNpZ25lZCBzaG9ydAkJdmFsaWQ7CQkvKiB3aGljaCBmaWVsZHMgYXJlIHZhbGlkICovCiAJX191NjQJCQlwcmVfc2l6ZTsJLyogcHJlX29wX2F0dHIuc2l6ZQkgICovCkBAIC00MCwxMCArNDgsNyBAQAogCQl9IG5mczM7CiAJfSBkdTsKIAlkZXZfdAkJCXJkZXY7Ci0JdW5pb24gewotCQlfX3U2NAkJbmZzMzsJCS8qIGFsc28gbmZzMiAqLwotCQlzdHJ1Y3QgbmZzNF9mc2lkIG5mczQ7Ci0JfSBmc2lkX3U7CisJc3RydWN0IG5mc19mc2lkCQlmc2lkOwogCV9fdTY0CQkJZmlsZWlkOwogCXN0cnVjdCB0aW1lc3BlYwkJYXRpbWU7CiAJc3RydWN0IHRpbWVzcGVjCQltdGltZTsKQEAgLTU3LDggKzYyLDggQEAKICNkZWZpbmUgTkZTX0FUVFJfV0NDCQkweDAwMDEJCS8qIHByZS1vcCBXQ0MgZGF0YSAgICAqLwogI2RlZmluZSBORlNfQVRUUl9GQVRUUgkJMHgwMDAyCQkvKiBwb3N0LW9wIGF0dHJpYnV0ZXMgKi8KICNkZWZpbmUgTkZTX0FUVFJfRkFUVFJfVjMJMHgwMDA0CQkvKiBORlN2MyBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIE5GU19BVFRSX0ZBVFRSX1Y0CTB4MDAwOAotI2RlZmluZSBORlNfQVRUUl9QUkVfQ0hBTkdFCTB4MDAxMAorI2RlZmluZSBORlNfQVRUUl9GQVRUUl9WNAkweDAwMDgJCS8qIE5GU3Y0IGNoYW5nZSBhdHRyaWJ1dGUgKi8KKyNkZWZpbmUgTkZTX0FUVFJfRkFUVFJfVjRfUkVGRVJSQUwJMHgwMDEwCQkvKiBORlN2NCByZWZlcnJhbCAqLwogCiAvKgogICogSW5mbyBvbiB0aGUgZmlsZSBzeXN0ZW0KQEAgLTY3NSw2ICs2ODAsNDAgQEAKIAl1MzIJCQkJaGFzX3N5bWxpbmtzOwogfTsKIAorc3RydWN0IG5mczRfc3RyaW5nIHsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNoYXIgKmRhdGE7Cit9OworCisjZGVmaW5lIE5GUzRfUEFUSE5BTUVfTUFYQ09NUE9ORU5UUyA1MTIKK3N0cnVjdCBuZnM0X3BhdGhuYW1lIHsKKwl1bnNpZ25lZCBpbnQgbmNvbXBvbmVudHM7CisJc3RydWN0IG5mczRfc3RyaW5nIGNvbXBvbmVudHNbTkZTNF9QQVRITkFNRV9NQVhDT01QT05FTlRTXTsKK307CisKKyNkZWZpbmUgTkZTNF9GU19MT0NBVElPTl9NQVhTRVJWRVJTIDEwCitzdHJ1Y3QgbmZzNF9mc19sb2NhdGlvbiB7CisJdW5zaWduZWQgaW50IG5zZXJ2ZXJzOworCXN0cnVjdCBuZnM0X3N0cmluZyBzZXJ2ZXJzW05GUzRfRlNfTE9DQVRJT05fTUFYU0VSVkVSU107CisJc3RydWN0IG5mczRfcGF0aG5hbWUgcm9vdHBhdGg7Cit9OworCisjZGVmaW5lIE5GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVMgMTAKK3N0cnVjdCBuZnM0X2ZzX2xvY2F0aW9ucyB7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwljb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBuZnM0X3BhdGhuYW1lIGZzX3BhdGg7CisJaW50IG5sb2NhdGlvbnM7CisJc3RydWN0IG5mczRfZnNfbG9jYXRpb24gbG9jYXRpb25zW05GUzRfRlNfTE9DQVRJT05TX01BWEVOVFJJRVNdOworfTsKKworc3RydWN0IG5mczRfZnNfbG9jYXRpb25zX2FyZyB7CisJY29uc3Qgc3RydWN0IG5mc19maCAqZGlyX2ZoOworCWNvbnN0IHN0cnVjdCBxc3RyICpuYW1lOworCXN0cnVjdCBwYWdlICpwYWdlOworCWNvbnN0IHUzMiAqYml0bWFzazsKK307CisKICNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCiAKIHN0cnVjdCBuZnNfcGFnZTsKQEAgLTY5NSw3ICs3MzQsNyBAQAogI2lmZGVmIENPTkZJR19ORlNfVjQKIAl1bnNpZ25lZCBsb25nCQl0aW1lc3RhbXA7CS8qIEZvciBsZWFzZSByZW5ld2FsICovCiAjZW5kaWYKLQlzdHJ1Y3QgcGFnZQkJKnBhZ2VfYXJyYXlbTkZTX1BBR0VWRUNfU0laRSArIDFdOworCXN0cnVjdCBwYWdlCQkqcGFnZV9hcnJheVtORlNfUEFHRVZFQ19TSVpFXTsKIH07CiAKIHN0cnVjdCBuZnNfd3JpdGVfZGF0YSB7CkBAIC03MTMsNyArNzUyLDcgQEAKICNpZmRlZiBDT05GSUdfTkZTX1Y0CiAJdW5zaWduZWQgbG9uZwkJdGltZXN0YW1wOwkvKiBGb3IgbGVhc2UgcmVuZXdhbCAqLwogI2VuZGlmCi0Jc3RydWN0IHBhZ2UJCSpwYWdlX2FycmF5W05GU19QQUdFVkVDX1NJWkUgKyAxXTsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2VfYXJyYXlbTkZTX1BBR0VWRUNfU0laRV07CiB9OwogCiBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKaW5kZXggZDI3NmE0ZS4uMGMwNzZkNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKQEAgLTcsNiArNyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCiAvKgpAQCAtODgsNyArOTAsMTcgQEAKICNkZWZpbmUgUEdfbm9zYXZlX2ZyZWUJCTE4CS8qIEZyZWUsIHNob3VsZCBub3QgYmUgd3JpdHRlbiAqLwogI2RlZmluZSBQR19idWRkeQkJMTkJLyogUGFnZSBpcyBmcmVlLCBvbiBidWRkeSBsaXN0cyAqLwogCi0jZGVmaW5lIFBHX3VuY2FjaGVkCQkyMAkvKiBQYWdlIGhhcyBiZWVuIG1hcHBlZCBhcyB1bmNhY2hlZCAqLworCisjaWYgKEJJVFNfUEVSX0xPTkcgPiAzMikKKy8qCisgKiA2NC1iaXQtb25seSBmbGFncyBidWlsZCBkb3duIGZyb20gYml0IDMxCisgKgorICogMzIgYml0ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBGSUVMRFMgfCAgICAgICBGTEFHUyAgICAgICAgIHwKKyAqIDY0IGJpdCAgfCAgICAgICAgICAgRklFTERTICAgICAgICAgICAgIHwgPz8/Pz8/ICAgICAgICAgRkxBR1MgICAgICAgICB8CisgKiAgICAgICAgIDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICovCisjZGVmaW5lIFBHX3VuY2FjaGVkCQkzMQkvKiBQYWdlIGhhcyBiZWVuIG1hcHBlZCBhcyB1bmNhY2hlZCAqLworI2VuZGlmCiAKIC8qCiAgKiBHbG9iYWwgcGFnZSBhY2NvdW50aW5nLiAgT25lIGluc3RhbmNlIHBlciBDUFUuICBPbmx5IHVuc2lnbmVkIGxvbmdzIGFyZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wYWdlbWFwLmggYi9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaAppbmRleCA3YTFhZjU3Li4xMjQ1ZGY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BhZ2VtYXAuaApAQCAtOTksNiArOTksMTMgQEAKIGV4dGVybiBpbnQgcmVhZF9jYWNoZV9wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIGZpbGxlcl90ICpmaWxsZXIsIHZvaWQgKmRhdGEpOwogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpyZWFkX21hcHBpbmdfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGluZGV4LCB2b2lkICpkYXRhKQoreworCWZpbGxlcl90ICpmaWxsZXIgPSAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2U7CisJcmV0dXJuIHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwgZmlsbGVyLCBkYXRhKTsKK30KKwogaW50IGFkZF90b19wYWdlX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKIAkJCQl1bnNpZ25lZCBsb25nIGluZGV4LCBnZnBfdCBnZnBfbWFzayk7CiBpbnQgYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFycG9ydC5oIGIvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKaW5kZXggZDQyNzM3ZS4uNWJmMzIxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKKysrIGIvaW5jbHVkZS9saW51eC9wYXJwb3J0LmgKQEAgLTEyNyw2ICsxMjcsMTAgQEAKICAgICAgICB1bnNpZ25lZCBjaGFyIHN0YXR1c2RpcjsvKiBjaWFiLmRkcmIgJiA3ICovCiB9OwogCitzdHJ1Y3QgYXg4ODc5Nl9wYXJwb3J0X3N0YXRlIHsKKwl1bnNpZ25lZCBjaGFyIGNwcjsKK307CisKIHN0cnVjdCBpcDMyX3BhcnBvcnRfc3RhdGUgewogCXVuc2lnbmVkIGludCBkY3I7CiAJdW5zaWduZWQgaW50IGVjcjsKQEAgLTEzOCw2ICsxNDIsNyBAQAogCQkvKiBBUkMgaGFzIG5vIHN0YXRlLiAqLwogCQlzdHJ1Y3QgYXhfcGFycG9ydF9zdGF0ZSBheDsKIAkJc3RydWN0IGFtaWdhX3BhcnBvcnRfc3RhdGUgYW1pZ2E7CisJCXN0cnVjdCBheDg4Nzk2X3BhcnBvcnRfc3RhdGUgYXg4ODc5NjsKIAkJLyogQXRhcmkgaGFzIG5vdCBzdGF0ZS4gKi8KIAkJc3RydWN0IGlwMzJfcGFycG9ydF9zdGF0ZSBpcDMyOwogCQl2b2lkICptaXNjOyAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLmggYi9pbmNsdWRlL2xpbnV4L3BjaS5oCmluZGV4IDZjNGJjNzcuLjYyYThjMjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2kuaApAQCAtMTYyLDYgKzE2Miw5IEBACiAJdW5zaWduZWQgaW50CWlzX2J1c21hc3RlcjoxOyAvKiBkZXZpY2UgaXMgYnVzbWFzdGVyICovCiAJdW5zaWduZWQgaW50CW5vX21zaToxOwkvKiBkZXZpY2UgbWF5IG5vdCB1c2UgbXNpICovCiAJdW5zaWduZWQgaW50CWJsb2NrX3VjZmdfYWNjZXNzOjE7CS8qIHVzZXJzcGFjZSBjb25maWcgc3BhY2UgYWNjZXNzIGlzIGJsb2NrZWQgKi8KKwl1bnNpZ25lZCBpbnQJYnJva2VuX3Bhcml0eV9zdGF0dXM6MTsJLyogRGV2aWNlIGdlbmVyYXRlcyBmYWxzZSBwb3NpdGl2ZSBwYXJpdHkgKi8KKwl1bnNpZ25lZCBpbnQgCW1zaV9lbmFibGVkOjE7CisJdW5zaWduZWQgaW50CW1zaXhfZW5hYmxlZDoxOwogCiAJdTMyCQlzYXZlZF9jb25maWdfc3BhY2VbMTZdOyAvKiBjb25maWcgc3BhY2Ugc2F2ZWQgYXQgc3VzcGVuZCB0aW1lICovCiAJc3RydWN0IGhsaXN0X2hlYWQgc2F2ZWRfY2FwX3NwYWNlOwpAQCAtNDk2LDYgKzQ5OSw3IEBACiBpbnQgcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU2NCBtYXNrKTsKIHZvaWQgcGNpX3VwZGF0ZV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgaW50IHJlc25vKTsKIGludCBwY2lfYXNzaWduX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpKTsKK2ludCBwY2lfYXNzaWduX3Jlc291cmNlX2ZpeGVkKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBpKTsKIHZvaWQgcGNpX3Jlc3RvcmVfYmFycyhzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIAogLyogUk9NIGNvbnRyb2wgcmVsYXRlZCByb3V0aW5lcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBiY2ZlOWQ0Li5jMmZkMmQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMzUyLDggKzM1MiwxMSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9SUzQ4MCAgICAgICAgIDB4NTk1MAogLyogQVRJIElYUCBDaGlwc2V0ICovCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDIwMF9JREUJMHg0MzQ5CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDIwMF9TTUJVUwkweDQzNTMKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BVElfSVhQMzAwX1NNQlVTCTB4NDM2MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFAzMDBfSURFCTB4NDM2OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFAzMDBfU0FUQSAgIDB4NDM2ZQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FUSV9JWFA0MDBfU01CVVMJMHg0MzcyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDQwMF9JREUJMHg0Mzc2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDQwMF9TQVRBICAgMHg0Mzc5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQVRJX0lYUDQwMF9TQVRBMgkweDQzN2EKQEAgLTg0OCw3ICs4NTEsMTIgQEAKIAogCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUUxPR0lDCQkweDEwNzcKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQMTAxNjAJMHgxMDE2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwMjAJMHgxMDIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEwODAJMHgxMDgwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUUxPR0lDX0lTUDEyMTYwCTB4MTIxNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjQwCTB4MTI0MAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AxMjgwCTB4MTI4MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMTAwCTB4MjEwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMjAwCTB4MjIwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1FMT0dJQ19JU1AyMzAwCTB4MjMwMApAQCAtMTAxOCw2ICsxMDI2LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTlZFTkVUXzgJCTB4MDA1NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfOQkJMHgwMDU3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0NLODA0X0FVRElPCTB4MDA1OQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9DSzgwNF9QQ0lFCQkweDAwNWQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMl9TTUJVUwkweDAwNjQKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFMl9JREUJMHgwMDY1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05WRU5FVF8yCQkweDAwNjYKQEAgLTExMjcsOSArMTEzNiwxMSBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9RVUFEUk80XzkwMFhHTAkweDAyNTgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfUVVBRFJPNF83NTBYR0wJMHgwMjU5CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX1FVQURSTzRfNzAwWEdMCTB4MDI1QgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfU01CVVMJMHgwMjY0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9JREUJMHgwMjY1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1MV9TQVRBCTB4MDI2NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNTFfU0FUQTIJMHgwMjY3CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9TTUJVUwkweDAzNjgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X0lERQkweDAzNkUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9OVklESUFfTkZPUkNFX01DUDU1X1NBVEEJMHgwMzdFCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A1NV9TQVRBMgkweDAzN0YKQEAgLTExODUsOCArMTE5NiwxMiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTUgICAgICAgICAgICAgIDB4MDM3MwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTYgICAgICAgICAgICAgIDB4MDNFNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTcgICAgICAgICAgICAgIDB4MDNFNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQSAgICAgIDB4MDNFNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfSURFICAgICAgIDB4MDNFQwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTggICAgICAgICAgICAgIDB4MDNFRQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMTkgICAgICAgICAgICAgIDB4MDNFRgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQTIgICAgIDB4MDNGNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9ORk9SQ0VfTUNQNjFfU0FUQTMgICAgIDB4MDNGNwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjAgICAgICAgICAgICAgIDB4MDQ1MAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjEgICAgICAgICAgICAgIDB4MDQ1MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX05WSURJQV9OVkVORVRfMjIgICAgICAgICAgICAgIDB4MDQ1MgpAQCAtMTI0NCw2ICsxMjU5LDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfUFg4WDBfMAkweDAyNTkKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfMzI2OV8wCTB4MDI2OQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9LOFQ4MDBQUk9fMAkweDAyODIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfMzI5Nl8wCTB4MDI5NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MzYzXzAJMHgwMzA1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1A0TTgwMENFCTB4MDMxNAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MzcxXzAJMHgwMzkxCkBAIC0xMjUxLDYgKzEyNjcsNyBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NjEJMHgwNTYxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8xCTB4MDU3MQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV84MkM1NzYJMHgwNTc2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBX1NBVEFfRUlERQkweDA1ODEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTg2XzAJMHgwNTg2CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU5NgkweDA1OTYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk3XzAJMHgwNTk3CkBAIC0xMjkxLDEwICsxMzA4LDExIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzg3ODNfMAkweDMyMDgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzNwkJMHgzMjI3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyNTEJCTB4MzI4NwotI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV8zMjk2XzAJMHgwMjk2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzdBCQkweDMzMzcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODIzMQkJMHg4MjMxCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgyMzFfNAkweDgyMzUKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODM2NV8xCTB4ODMwNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJQV9DWDcwMAkJMHg4MzI0CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzNzFfMQkweDgzOTEKICNkZWZpbmUgUENJX0RFVklDRV9JRF9WSUFfODJDNTk4XzEJMHg4NTk4CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfVklBXzgzOFhfMQkweEIxODgKQEAgLTE5NDYsNiArMTk2NCw3IEBACiAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9NRUxMQU5PWAkJMHgxNWIzCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVMTEFOT1hfVEFWT1IJMHg1YTQ0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTUVMTEFOT1hfVEFWT1JfQlJJREdFCTB4NWE0NgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX01FTExBTk9YX0FSQkVMX0NPTVBBVCAweDYyNzgKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUxMQU5PWF9BUkJFTAkweDYyODIKICNkZWZpbmUgUENJX0RFVklDRV9JRF9NRUxMQU5PWF9TSU5BSV9PTEQgMHg1ZThjCkBAIC0xOTY5LDYgKzE5ODgsOSBAQAogI2RlZmluZSBQQ0lfVkVORE9SX0lEX05FVENFTEwJCTB4MTY5YwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1JFVk9MVVRJT04JMHgwMDQ0CiAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9WSVRFU1NFCQkweDE3MjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9WSVRFU1NFX1ZTQzcxNzQJMHg3MTc0CisKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9MSU5LU1lTCQkweDE3MzcKICNkZWZpbmUgUENJX0RFVklDRV9JRF9MSU5LU1lTX0VHMTA2NAkweDEwNjQKIApAQCAtMjE0OCw2ICsyMTcwLDcgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g4XzQJMHgyODE1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF81CTB4MjgzZQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNgkweDI4NTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9HRDMxMjQ0CTB4MzIwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODU1UE1fSEIJMHgzMzQwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfSEIJMHgzNTc1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MzBfQ0dDCTB4MzU3NwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oIGIvaW5jbHVkZS9saW51eC9wY2lfcmVncy5oCmluZGV4IGQyN2E3OGIuLjZiY2U0YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9yZWdzLmgKQEAgLTE5Nyw2ICsxOTcsNyBAQAogI2RlZmluZSAgUENJX0NBUF9JRF9DSFNXUAkweDA2CS8qIENvbXBhY3RQQ0kgSG90U3dhcCAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9QQ0lYCTB4MDcJLyogUENJLVggKi8KICNkZWZpbmUgIFBDSV9DQVBfSURfSFRfSVJRQ09ORgkweDA4CS8qIEh5cGVyVHJhbnNwb3J0IElSUSBDb25maWd1cmF0aW9uICovCisjZGVmaW5lICBQQ0lfQ0FQX0lEX1ZORFIJMHgwOQkvKiBWZW5kb3Igc3BlY2lmaWMgY2FwYWJpbGl0eSAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9TSFBDIAkweDBDCS8qIFBDSSBTdGFuZGFyZCBIb3QtUGx1ZyBDb250cm9sbGVyICovCiAjZGVmaW5lICBQQ0lfQ0FQX0lEX0VYUCAJMHgxMAkvKiBQQ0kgRXhwcmVzcyAqLwogI2RlZmluZSAgUENJX0NBUF9JRF9NU0lYCTB4MTEJLyogTVNJLVggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaCBiL2luY2x1ZGUvbGludXgvcGVyY3B1X2NvdW50ZXIuaAppbmRleCA2NmI1ZGU0Li5mNWFhNTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmNwdV9jb3VudGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJjcHVfY291bnRlci5oCkBAIC0xMCwxMyArMTAsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxsaW51eC90aHJlYWRzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2lmZGVmIENPTkZJR19TTVAKIAogc3RydWN0IHBlcmNwdV9jb3VudGVyIHsKIAlzcGlubG9ja190IGxvY2s7Ci0JbG9uZyBjb3VudDsKLQlsb25nICpjb3VudGVyczsKKwlzNjQgY291bnQ7CisJczMyICpjb3VudGVyczsKIH07CiAKICNpZiBOUl9DUFVTID49IDE2CkBAIC0yNSwxMSArMjYsMTEgQEAKICNkZWZpbmUgRkJDX0JBVENICShOUl9DUFVTKjQpCiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIHBlcmNwdV9jb3VudGVyX2luaXQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCitzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCkKIHsKIAlzcGluX2xvY2tfaW5pdCgmZmJjLT5sb2NrKTsKLQlmYmMtPmNvdW50ID0gMDsKLQlmYmMtPmNvdW50ZXJzID0gYWxsb2NfcGVyY3B1KGxvbmcpOworCWZiYy0+Y291bnQgPSBhbW91bnQ7CisJZmJjLT5jb3VudGVycyA9IGFsbG9jX3BlcmNwdShzMzIpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKQEAgLTM3LDEwICszOCwxMCBAQAogCWZyZWVfcGVyY3B1KGZiYy0+Y291bnRlcnMpOwogfQogCi12b2lkIHBlcmNwdV9jb3VudGVyX21vZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgbG9uZyBhbW91bnQpOwotbG9uZyBwZXJjcHVfY291bnRlcl9zdW0oc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpOwordm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHMzMiBhbW91bnQpOworczY0IHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYyk7CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBwZXJjcHVfY291bnRlcl9yZWFkKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQorc3RhdGljIGlubGluZSBzNjQgcGVyY3B1X2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKIHsKIAlyZXR1cm4gZmJjLT5jb3VudDsKIH0KQEAgLTQ4LDEzICs0OSwxNCBAQAogLyoKICAqIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcGVyY3B1X2NvdW50ZXJfcmVhZCgpIHRvIHJldHVybiBhIHNtYWxsIG5lZ2F0aXZlCiAgKiBudW1iZXIgZm9yIHNvbWUgY291bnRlciB3aGljaCBzaG91bGQgbmV2ZXIgYmUgbmVnYXRpdmUuCisgKgogICovCi1zdGF0aWMgaW5saW5lIGxvbmcgcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3N0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7Ci0JbG9uZyByZXQgPSBmYmMtPmNvdW50OworCXM2NCByZXQgPSBmYmMtPmNvdW50OwogCiAJYmFycmllcigpOwkJLyogUHJldmVudCByZWxvYWRzIG9mIGZiYy0+Y291bnQgKi8KLQlpZiAocmV0ID4gMCkKKwlpZiAocmV0ID49IDApCiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIDE7CiB9CkBAIC02MiwxMiArNjQsMTIgQEAKICNlbHNlCiAKIHN0cnVjdCBwZXJjcHVfY291bnRlciB7Ci0JbG9uZyBjb3VudDsKKwlzNjQgY291bnQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9pbml0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQogewotCWZiYy0+Y291bnQgPSAwOworCWZiYy0+Y291bnQgPSBhbW91bnQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJjcHVfY291bnRlcl9kZXN0cm95KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQpAQCAtNzUsMjQgKzc3LDI0IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotcGVyY3B1X2NvdW50ZXJfbW9kKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBsb25nIGFtb3VudCkKK3BlcmNwdV9jb3VudGVyX21vZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczMyIGFtb3VudCkKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlmYmMtPmNvdW50ICs9IGFtb3VudDsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIGxvbmcgcGVyY3B1X2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3N0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3JlYWQoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCiB7CiAJcmV0dXJuIGZiYy0+Y291bnQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgbG9uZyBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQorc3RhdGljIGlubGluZSBzNjQgcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKIHsKIAlyZXR1cm4gZmJjLT5jb3VudDsKIH0KIAotc3RhdGljIGlubGluZSBsb25nIHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3N0YXRpYyBpbmxpbmUgczY0IHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKIHsKIAlyZXR1cm4gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZShmYmMpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbXUuaCBiL2luY2x1ZGUvbGludXgvcG11LmgKaW5kZXggZWNjZTU5MS4uMmVkODA3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbXUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BtdS5oCkBAIC0yMzAsNCArMjMwLDggQEAKIGV4dGVybiBzdHJ1Y3QgcG11X2JhdHRlcnlfaW5mbyBwbXVfYmF0dGVyaWVzW1BNVV9NQVhfQkFUVEVSSUVTXTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcG11X3Bvd2VyX2ZsYWdzOwogCisvKiBCYWNrbGlnaHQgKi8KK2V4dGVybiBpbnQgZGlzYWJsZV9rZXJuZWxfYmFja2xpZ2h0OworZXh0ZXJuIHZvaWQgcG11X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSopOworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcmN0bC5oIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCmluZGV4IGJmMDIyYzQzLi41MmE5YmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCkBAIC01Miw0ICs1MiwxMSBAQAogI2RlZmluZSBQUl9TRVRfTkFNRSAgICAxNQkJLyogU2V0IHByb2Nlc3MgbmFtZSAqLwogI2RlZmluZSBQUl9HRVRfTkFNRSAgICAxNgkJLyogR2V0IHByb2Nlc3MgbmFtZSAqLwogCisvKiBHZXQvc2V0IHByb2Nlc3MgZW5kaWFuICovCisjZGVmaW5lIFBSX0dFVF9FTkRJQU4JMTkKKyNkZWZpbmUgUFJfU0VUX0VORElBTgkyMAorIyBkZWZpbmUgUFJfRU5ESUFOX0JJRwkJMAorIyBkZWZpbmUgUFJfRU5ESUFOX0xJVFRMRQkxCS8qIFRydWUgbGl0dGxlIGVuZGlhbiBtb2RlICovCisjIGRlZmluZSBQUl9FTkRJQU5fUFBDX0xJVFRMRQkyCS8qICJQb3dlclBDIiBwc2V1ZG8gbGl0dGxlIGVuZGlhbiAqLworCiAjZW5kaWYgLyogX0xJTlVYX1BSQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCmluZGV4IDBkMzY3NTAuLmVlOTE4YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHJhY2UuaApAQCAtNTEsNiArNTEsMTAgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAvKgogICogUHRyYWNlIGZsYWdzCisgKgorICogVGhlIG93bmVyIHNoaXAgcnVsZXMgZm9yIHRhc2stPnB0cmFjZSB3aGljaCBob2xkcyB0aGUgcHRyYWNlCisgKiBmbGFncyBpcyBzaW1wbGUuICBXaGVuIGEgdGFzayBpcyBydW5uaW5nIGl0IG93bnMgaXQncyB0YXNrLT5wdHJhY2UKKyAqIGZsYWdzLiAgV2hlbiB0aGUgYSB0YXNrIGlzIHN0b3BwZWQgdGhlIHB0cmFjZXIgb3ducyB0YXNrLT5wdHJhY2UuCiAgKi8KIAogI2RlZmluZSBQVF9QVFJBQ0VECTB4MDAwMDAwMDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmFkaXgtdHJlZS5oIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKaW5kZXggZGQ4M2NjYS4uOTE1OGE2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmgKQEAgLTIzLDYgKzIzLDkgQEAKICNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorI2RlZmluZSBSQURJWF9UUkVFX01BWF9UQUdTIDIKKworLyogcm9vdCB0YWdzIGFyZSBzdG9yZWQgaW4gZ2ZwX21hc2ssIHNoaWZ0ZWQgYnkgX19HRlBfQklUU19TSElGVCAqLwogc3RydWN0IHJhZGl4X3RyZWVfcm9vdCB7CiAJdW5zaWduZWQgaW50CQloZWlnaHQ7CiAJZ2ZwX3QJCQlnZnBfbWFzazsKQEAgLTQ1LDggKzQ4LDYgQEAKIAkocm9vdCktPnJub2RlID0gTlVMTDsJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIFJBRElYX1RSRUVfTUFYX1RBR1MgMgotCiBpbnQgcmFkaXhfdHJlZV9pbnNlcnQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwogdm9pZCAqcmFkaXhfdHJlZV9sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqLCB1bnNpZ25lZCBsb25nKTsKIHZvaWQgKipyYWRpeF90cmVlX2xvb2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKiwgdW5zaWduZWQgbG9uZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JhbWZzLmggYi9pbmNsdWRlL2xpbnV4L3JhbWZzLmgKaW5kZXggNzhlY2ZhMi4uMDBiMzQwYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYW1mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcmFtZnMuaApAQCAtMiw4ICsyLDggQEAKICNkZWZpbmUgX0xJTlVYX1JBTUZTX0gKIAogc3RydWN0IGlub2RlICpyYW1mc19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUsIGRldl90IGRldik7Ci1zdHJ1Y3Qgc3VwZXJfYmxvY2sgKnJhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSk7CitleHRlcm4gaW50IHJhbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpOwogCiAjaWZuZGVmIENPTkZJR19NTVUKIGV4dGVybiB1bnNpZ25lZCBsb25nIHJhbWZzX25vbW11X2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYnRyZWUuaCBiL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKaW5kZXggZjM3MDA2Zi4uOGQ1MzgyZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yYnRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JidHJlZS5oCkBAIC0xMzIsNiArMTMyLDEwIEBACiAjZGVmaW5lIFJCX1JPT1QJKHN0cnVjdCByYl9yb290KSB7IE5VTEwsIH0KICNkZWZpbmUJcmJfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIGNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKIAorI2RlZmluZSBSQl9FTVBUWV9ST09UKHJvb3QpCSgocm9vdCktPnJiX25vZGUgPT0gTlVMTCkKKyNkZWZpbmUgUkJfRU1QVFlfTk9ERShub2RlKQkocmJfcGFyZW50KG5vZGUpICE9IG5vZGUpCisjZGVmaW5lIFJCX0NMRUFSX05PREUobm9kZSkJKHJiX3NldF9wYXJlbnQobm9kZSwgbm9kZSkpCisKIGV4dGVybiB2b2lkIHJiX2luc2VydF9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqLCBzdHJ1Y3QgcmJfcm9vdCAqKTsKIGV4dGVybiB2b2lkIHJiX2VyYXNlKHN0cnVjdCByYl9ub2RlICosIHN0cnVjdCByYl9yb290ICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggOTcwMjg0Zi4uNjMxMjc1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtMjQ2LDcgKzI0Niw3IEBACiAgKiBzb2Z0aXJxIGhhbmRsZXJzIHdpbGwgaGF2ZSBjb21wbGV0ZWQsIHNpbmNlIGluIHNvbWUga2VybmVscywgdGhlc2UKICAqIGhhbmRsZXJzIGNhbiBydW4gaW4gcHJvY2VzcyBjb250ZXh0LCBhbmQgY2FuIGJsb2NrLgogICoKLSAqIFRoaXMgcHJpbWl0aXZlIHByb3ZpZGVzIHRoZSBndWFyYW50ZWVzIG1hZGUgYnkgdGhlIChkZXByZWNhdGVkKQorICogVGhpcyBwcmltaXRpdmUgcHJvdmlkZXMgdGhlIGd1YXJhbnRlZXMgbWFkZSBieSB0aGUgKG5vdyByZW1vdmVkKQogICogc3luY2hyb25pemVfa2VybmVsKCkgQVBJLiAgSW4gY29udHJhc3QsIHN5bmNocm9uaXplX3JjdSgpIG9ubHkKICAqIGd1YXJhbnRlZXMgdGhhdCByY3VfcmVhZF9sb2NrKCkgc2VjdGlvbnMgd2lsbCBoYXZlIGNvbXBsZXRlZC4KICAqIEluICJjbGFzc2ljIFJDVSIsIHRoZXNlIHR3byBndWFyYW50ZWVzIGhhcHBlbiB0byBiZSBvbmUgYW5kCkBAIC0yNjQsNyArMjY0LDYgQEAKIAkJCQl2b2lkICgqZnVuYykoc3RydWN0IHJjdV9oZWFkICpoZWFkKSkpOwogZXh0ZXJuIHZvaWQgRkFTVENBTEwoY2FsbF9yY3VfYmgoc3RydWN0IHJjdV9oZWFkICpoZWFkLAogCQkJCXZvaWQgKCpmdW5jKShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpKSk7Ci1leHRlcm4gX19kZXByZWNhdGVkX2Zvcl9tb2R1bGVzIHZvaWQgc3luY2hyb25pemVfa2VybmVsKHZvaWQpOwogZXh0ZXJuIHZvaWQgc3luY2hyb25pemVfcmN1KHZvaWQpOwogdm9pZCBzeW5jaHJvbml6ZV9pZGxlKHZvaWQpOwogZXh0ZXJuIHZvaWQgcmN1X2JhcnJpZXIodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oIGIvaW5jbHVkZS9saW51eC9yZWJvb3QuaAppbmRleCAwMTUyOTdmLi4xZGQxYzcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVib290LmgKQEAgLTU5LDEzICs1OSwxMyBAQAogICogQXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50IGltcGxlbWVuYXRpb25zIG9mIHN5c19yZWJvb3QgY29tbWFuZHMuCiAgKi8KIAotZXh0ZXJuIHZvaWQga2VybmVsX3Jlc3RhcnRfcHJlcGFyZShjaGFyICpjbWQpOwogZXh0ZXJuIHZvaWQga2VybmVsX3NodXRkb3duX3ByZXBhcmUoZW51bSBzeXN0ZW1fc3RhdGVzIHN0YXRlKTsKIAogZXh0ZXJuIHZvaWQga2VybmVsX3Jlc3RhcnQoY2hhciAqY21kKTsKIGV4dGVybiB2b2lkIGtlcm5lbF9oYWx0KHZvaWQpOwogZXh0ZXJuIHZvaWQga2VybmVsX3Bvd2VyX29mZih2b2lkKTsKLWV4dGVybiB2b2lkIGtlcm5lbF9rZXhlYyh2b2lkKTsKKwordm9pZCBjdHJsX2FsdF9kZWwodm9pZCk7CiAKIC8qCiAgKiBFbWVyZ2VuY3kgcmVzdGFydCwgY2FsbGFibGUgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaCBiL2luY2x1ZGUvbGludXgvcmVzb3VyY2UuaAppbmRleCAyMWE4NmNiLi5hZTEzZGI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Jlc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZXNvdXJjZS5oCkBAIC0zLDYgKzMsOCBAQAogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogCitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CisKIC8qCiAgKiBSZXNvdXJjZSBjb250cm9sL2FjY291bnRpbmcgaGVhZGVyIGZpbGUgZm9yIGxpbnV4CiAgKi8KQEAgLTY3LDQgKzY5LDYgQEAKICAqLwogI2luY2x1ZGUgPGFzbS9yZXNvdXJjZS5oPgogCitpbnQgZ2V0cnVzYWdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHdobywgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKnJ1KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Jlc3VtZS10cmFjZS5oIGIvaW5jbHVkZS9saW51eC9yZXN1bWUtdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzc2YmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9yZXN1bWUtdHJhY2UuaApAQCAtMCwwICsxLDMwIEBACisjaWZuZGVmIFJFU1VNRV9UUkFDRV9ICisjZGVmaW5lIFJFU1VNRV9UUkFDRV9ICisKKyNpZmRlZiBDT05GSUdfUE1fVFJBQ0UKKworc3RydWN0IGRldmljZTsKK2V4dGVybiB2b2lkIHNldF90cmFjZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX3Jlc3VtZV90cmFjZSh2b2lkICp0cmFjZWRhdGEsIHVuc2lnbmVkIGludCB1c2VyKTsKKworI2RlZmluZSBUUkFDRV9ERVZJQ0UoZGV2KSBzZXRfdHJhY2VfZGV2aWNlKGRldikKKyNkZWZpbmUgVFJBQ0VfUkVTVU1FKHVzZXIpIGRvIHsJCQkJXAorCXZvaWQgKnRyYWNlZGF0YTsJCQkJXAorCWFzbSB2b2xhdGlsZSgibW92bCAkMWYsJTBcbiIJCQlcCisJCSIuc2VjdGlvbiAudHJhY2VkYXRhLFwiYVwiXG4iCQlcCisJCSIxOlx0LndvcmQgJWMxXG4iCQkJXAorCQkiXHQubG9uZyAlYzJcbiIJCQkJXAorCQkiLnByZXZpb3VzIgkJCQlcCisJCToiPXIiICh0cmFjZWRhdGEpCQkJXAorCQk6ICJpIiAoX19MSU5FX18pLCAiaSIgKF9fRklMRV9fKSk7CVwKKwlnZW5lcmF0ZV9yZXN1bWVfdHJhY2UodHJhY2VkYXRhLCB1c2VyKTsJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisKKyNkZWZpbmUgVFJBQ0VfREVWSUNFKGRldikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBUUkFDRV9SRVNVTUUoZGV2KSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggMmQ0YzgxYS4uYmY5N2IwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTkxLDcgKzkxLDYgQEAKICAqLwogaW50IHBhZ2VfcmVmZXJlbmNlZChzdHJ1Y3QgcGFnZSAqLCBpbnQgaXNfbG9ja2VkKTsKIGludCB0cnlfdG9fdW5tYXAoc3RydWN0IHBhZ2UgKiwgaW50IGlnbm9yZV9yZWZzKTsKLXZvaWQgcmVtb3ZlX2Zyb21fc3dhcChzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSBtbS9maWxlbWFwX3hpcC5jIHRvIHVubWFwIGVtcHR5IHplcm8gcGFnZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ydGMtdjMwMjAuaCBiL2luY2x1ZGUvbGludXgvcnRjLXYzMDIwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3NGU2MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcnRjLXYzMDIwLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIHYzMDIwLmggLSBSZWdpc3RlcnMgZGVmaW5pdGlvbiBhbmQgcGxhdGZvcm0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHRoZSB2MzAyMCBSVEMuCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCA4RCBUZWNobm9sb2dpZXMgaW5jLgorICovCisjaWZuZGVmIF9fTElOVVhfVjMwMjBfSAorI2RlZmluZSBfX0xJTlVYX1YzMDIwX0gKKworLyogVGhlIHYzMDIwIGhhcyBvbmx5IG9uZSBkYXRhIHBpbiBidXQgd2hpY2ggb25lCisgKiBpcyB1c2VkIGRlcGVuZHMgb24gdGhlIGJvYXJkLiAqLworc3RydWN0IHYzMDIwX3BsYXRmb3JtX2RhdGEgeworCWludCBsZWZ0c2hpZnQ7IC8qICgxPDwobGVmdHNoaWZ0KSkgJiByZWFkbCgpICovCit9OworCisjZGVmaW5lIFYzMDIwX1NUQVRVU18wCTB4MDAKKyNkZWZpbmUgVjMwMjBfU1RBVFVTXzEJMHgwMQorI2RlZmluZSBWMzAyMF9TRUNPTkRTCTB4MDIKKyNkZWZpbmUgVjMwMjBfTUlOVVRFUwkweDAzCisjZGVmaW5lIFYzMDIwX0hPVVJTCQkweDA0CisjZGVmaW5lIFYzMDIwX01PTlRIX0RBWQkweDA1CisjZGVmaW5lIFYzMDIwX01PTlRICQkweDA2CisjZGVmaW5lIFYzMDIwX1lFQVIJCTB4MDcKKyNkZWZpbmUgVjMwMjBfV0VFS19EQVkJMHgwOAorI2RlZmluZSBWMzAyMF9XRUVLCQkweDA5CisKKyNkZWZpbmUgVjMwMjBfSVNfQ09NTUFORCh2YWwpICgodmFsKT49MHgwRSkKKworI2RlZmluZSBWMzAyMF9DTURfUkFNMkNMT0NLCTB4MEUKKyNkZWZpbmUgVjMwMjBfQ01EX0NMT0NLMlJBTQkweDBGCisKKyNlbmRpZiAvKiBfX0xJTlVYX1YzMDIwX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjLmggYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCmluZGV4IGFiNjFjZDEuLjM2ZTJiZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtMTAyLDYgKzEwMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKIGV4dGVybiBpbnQgcnRjX21vbnRoX2RheXModW5zaWduZWQgaW50IG1vbnRoLCB1bnNpZ25lZCBpbnQgeWVhcik7CitleHRlcm4gaW50IHJ0Y195ZWFyX2RheXModW5zaWduZWQgaW50IGRheSwgdW5zaWduZWQgaW50IG1vbnRoLCB1bnNpZ25lZCBpbnQgeWVhcik7CiBleHRlcm4gaW50IHJ0Y192YWxpZF90bShzdHJ1Y3QgcnRjX3RpbWUgKnRtKTsKIGV4dGVybiBpbnQgcnRjX3RtX3RvX3RpbWUoc3RydWN0IHJ0Y190aW1lICp0bSwgdW5zaWduZWQgbG9uZyAqdGltZSk7CiBleHRlcm4gdm9pZCBydGNfdGltZV90b190bSh1bnNpZ25lZCBsb25nIHRpbWUsIHN0cnVjdCBydGNfdGltZSAqdG0pOwpAQCAtMTU1LDYgKzE1NiwxNyBAQAogCXN0cnVjdCBydGNfdGFzayAqaXJxX3Rhc2s7CiAJc3BpbmxvY2tfdCBpcnFfdGFza19sb2NrOwogCWludCBpcnFfZnJlcTsKKwlpbnQgbWF4X3VzZXJfZnJlcTsKKyNpZmRlZiBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMCisJc3RydWN0IHdvcmtfc3RydWN0IHVpZV90YXNrOworCXN0cnVjdCB0aW1lcl9saXN0IHVpZV90aW1lcjsKKwkvKiBUaG9zZSBmaWVsZHMgYXJlIHByb3RlY3RlZCBieSBydGMtPmlycV9sb2NrICovCisJdW5zaWduZWQgaW50IG9sZHNlY3M7CisJdW5zaWduZWQgaW50IGlycV9hY3RpdmU6MTsKKwl1bnNpZ25lZCBpbnQgc3RvcF91aWVfcG9sbGluZzoxOworCXVuc2lnbmVkIGludCB1aWVfdGFza19hY3RpdmU6MTsKKwl1bnNpZ25lZCBpbnQgdWllX3RpbWVyX2FjdGl2ZToxOworI2VuZGlmCiB9OwogI2RlZmluZSB0b19ydGNfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgcnRjX2RldmljZSwgY2xhc3NfZGV2KQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKaW5kZXggMjY3ZjE1Mi4uOGQxMWQ5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zY2hlZC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtMzU4LDYgKzM1OCwxNCBAQAogCXNwaW5sb2NrX3QJCXNpZ2xvY2s7CiB9OwogCitzdHJ1Y3QgcGFjY3Rfc3RydWN0IHsKKwlpbnQJCQlhY19mbGFnOworCWxvbmcJCQlhY19leGl0Y29kZTsKKwl1bnNpZ25lZCBsb25nCQlhY19tZW07CisJY3B1dGltZV90CQlhY191dGltZSwgYWNfc3RpbWU7CisJdW5zaWduZWQgbG9uZwkJYWNfbWluZmx0LCBhY19tYWpmbHQ7Cit9OworCiAvKgogICogTk9URSEgInNpZ25hbF9zdHJ1Y3QiIGRvZXMgbm90IGhhdmUgaXQncyBvd24KICAqIGxvY2tpbmcsIGJlY2F1c2UgYSBzaGFyZWQgc2lnbmFsX3N0cnVjdCBhbHdheXMKQEAgLTQ0OSw2ICs0NTcsOSBAQAogCXN0cnVjdCBrZXkgKnNlc3Npb25fa2V5cmluZzsJLyoga2V5cmluZyBpbmhlcml0ZWQgb3ZlciBmb3JrICovCiAJc3RydWN0IGtleSAqcHJvY2Vzc19rZXlyaW5nOwkvKiBrZXlyaW5nIHByaXZhdGUgdG8gdGhpcyBwcm9jZXNzICovCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVAorCXN0cnVjdCBwYWNjdF9zdHJ1Y3QgcGFjY3Q7CS8qIHBlci1wcm9jZXNzIGFjY291bnRpbmcgaW5mb3JtYXRpb24gKi8KKyNlbmRpZgogfTsKIAogLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRzIGFyZSB0byBiZSBlbmFibGVkICovCkBAIC05NDEsMTIgKzk1MiwxMSBAQAogI2RlZmluZSBQRl9LU1dBUEQJMHgwMDA0MDAwMAkvKiBJIGFtIGtzd2FwZCAqLwogI2RlZmluZSBQRl9TV0FQT0ZGCTB4MDAwODAwMDAJLyogSSBhbSBpbiBzd2Fwb2ZmICovCiAjZGVmaW5lIFBGX0xFU1NfVEhST1RUTEUgMHgwMDEwMDAwMAkvKiBUaHJvdHRsZSBtZSBsZXNzOiBJIGNsZWFuIG1lbW9yeSAqLwotI2RlZmluZSBQRl9TWU5DV1JJVEUJMHgwMDIwMDAwMAkvKiBJIGFtIGRvaW5nIGEgc3luYyB3cml0ZSAqLwotI2RlZmluZSBQRl9CT1JST1dFRF9NTQkweDAwNDAwMDAwCS8qIEkgYW0gYSBrdGhyZWFkIGRvaW5nIHVzZV9tbSAqLwotI2RlZmluZSBQRl9SQU5ET01JWkUJMHgwMDgwMDAwMAkvKiByYW5kb21pemUgdmlydHVhbCBhZGRyZXNzIHNwYWNlICovCi0jZGVmaW5lIFBGX1NXQVBXUklURQkweDAxMDAwMDAwCS8qIEFsbG93ZWQgdG8gd3JpdGUgdG8gc3dhcCAqLwotI2RlZmluZSBQRl9TUFJFQURfUEFHRQkweDA0MDAwMDAwCS8qIFNwcmVhZCBwYWdlIGNhY2hlIG92ZXIgY3B1c2V0ICovCi0jZGVmaW5lIFBGX1NQUkVBRF9TTEFCCTB4MDgwMDAwMDAJLyogU3ByZWFkIHNvbWUgc2xhYiBjYWNoZXMgb3ZlciBjcHVzZXQgKi8KKyNkZWZpbmUgUEZfQk9SUk9XRURfTU0JMHgwMDIwMDAwMAkvKiBJIGFtIGEga3RocmVhZCBkb2luZyB1c2VfbW0gKi8KKyNkZWZpbmUgUEZfUkFORE9NSVpFCTB4MDA0MDAwMDAJLyogcmFuZG9taXplIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSAqLworI2RlZmluZSBQRl9TV0FQV1JJVEUJMHgwMDgwMDAwMAkvKiBBbGxvd2VkIHRvIHdyaXRlIHRvIHN3YXAgKi8KKyNkZWZpbmUgUEZfU1BSRUFEX1BBR0UJMHgwMTAwMDAwMAkvKiBTcHJlYWQgcGFnZSBjYWNoZSBvdmVyIGNwdXNldCAqLworI2RlZmluZSBQRl9TUFJFQURfU0xBQgkweDAyMDAwMDAwCS8qIFNwcmVhZCBzb21lIHNsYWIgY2FjaGVzIG92ZXIgY3B1c2V0ICovCiAjZGVmaW5lIFBGX01FTVBPTElDWQkweDEwMDAwMDAwCS8qIE5vbi1kZWZhdWx0IE5VTUEgbWVtcG9saWN5ICovCiAKIC8qCkBAIC0xMjI1LDcgKzEyMzUsNyBAQAogCQkodGhyZWFkX2dyb3VwX2xlYWRlcihwKSAmJiAhdGhyZWFkX2dyb3VwX2VtcHR5KHApKQogCiAvKgotICogUHJvdGVjdHMgLT5mcywgLT5maWxlcywgLT5tbSwgLT5wdHJhY2UsIC0+Z3JvdXBfaW5mbywgLT5jb21tLCBrZXlyaW5nCisgKiBQcm90ZWN0cyAtPmZzLCAtPmZpbGVzLCAtPm1tLCAtPmdyb3VwX2luZm8sIC0+Y29tbSwga2V5cmluZwogICogc3Vic2NyaXB0aW9ucyBhbmQgc3luY2hyb25pc2VzIHdpdGggd2FpdDQoKS4gIEFsc28gdXNlZCBpbiBwcm9jZnMuICBBbHNvCiAgKiBwaW5zIHRoZSBmaW5hbCByZWxlYXNlIG9mIHRhc2suaW9fY29udGV4dC4gIEFsc28gcHJvdGVjdHMgLT5jcHVzZXQuCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oIGIvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCmluZGV4IDRkZmIxYjguLmQyYzE3YmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKQEAgLTE3MSw5ICsxNzEsOSBAQAogICoJRGVhbGxvY2F0ZSBhbmQgY2xlYXIgdGhlIHNiLT5zX3NlY3VyaXR5IGZpZWxkLgogICoJQHNiIGNvbnRhaW5zIHRoZSBzdXBlcl9ibG9jayBzdHJ1Y3R1cmUgdG8gYmUgbW9kaWZpZWQuCiAgKiBAc2Jfc3RhdGZzOgotICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgb2J0YWluaW5nIGZpbGVzeXN0ZW0gc3RhdGlzdGljcyBmb3IgdGhlIEBzYgotICoJZmlsZXN5c3RlbS4KLSAqCUBzYiBjb250YWlucyB0aGUgc3VwZXJfYmxvY2sgc3RydWN0dXJlIGZvciB0aGUgZmlsZXN5c3RlbS4KKyAqCUNoZWNrIHBlcm1pc3Npb24gYmVmb3JlIG9idGFpbmluZyBmaWxlc3lzdGVtIHN0YXRpc3RpY3MgZm9yIHRoZSBAbW50CisgKgltb3VudHBvaW50LgorICoJQGRlbnRyeSBpcyBhIGhhbmRsZSBvbiB0aGUgc3VwZXJibG9jayBmb3IgdGhlIGZpbGVzeXN0ZW0uCiAgKglSZXR1cm4gMCBpZiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQuICAKICAqIEBzYl9tb3VudDoKICAqCUNoZWNrIHBlcm1pc3Npb24gYmVmb3JlIGFuIG9iamVjdCBzcGVjaWZpZWQgYnkgQGRldl9uYW1lIGlzIG1vdW50ZWQgb24KQEAgLTU3Nyw2ICs1NzcsMTEgQEAKICAqCUBwIGNvbnRhaW5zIHRoZSB0YXNrX3N0cnVjdCBvZiBwcm9jZXNzLgogICoJQG5pY2UgY29udGFpbnMgdGhlIG5ldyBuaWNlIHZhbHVlLgogICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLgorICogQHRhc2tfc2V0aW9wcmlvCisgKglDaGVjayBwZXJtaXNzaW9uIGJlZm9yZSBzZXR0aW5nIHRoZSBpb3ByaW8gdmFsdWUgb2YgQHAgdG8gQGlvcHJpby4KKyAqCUBwIGNvbnRhaW5zIHRoZSB0YXNrX3N0cnVjdCBvZiBwcm9jZXNzLgorICoJQGlvcHJpbyBjb250YWlucyB0aGUgbmV3IGlvcHJpbyB2YWx1ZQorICoJUmV0dXJuIDAgaWYgcGVybWlzc2lvbiBpcyBncmFudGVkLgogICogQHRhc2tfc2V0cmxpbWl0OgogICoJQ2hlY2sgcGVybWlzc2lvbiBiZWZvcmUgc2V0dGluZyB0aGUgcmVzb3VyY2UgbGltaXRzIG9mIHRoZSBjdXJyZW50CiAgKglwcm9jZXNzIGZvciBAcmVzb3VyY2UgdG8gQG5ld19ybGltLiAgVGhlIG9sZCByZXNvdXJjZSBsaW1pdCB2YWx1ZXMgY2FuCkBAIC01OTYsNiArNjAxLDEwIEBACiAgKglAcC4KICAqCUBwIGNvbnRhaW5zIHRoZSB0YXNrX3N0cnVjdCBmb3IgcHJvY2Vzcy4KICAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KKyAqIEB0YXNrX21vdmVtZW1vcnkKKyAqCUNoZWNrIHBlcm1pc3Npb24gYmVmb3JlIG1vdmluZyBtZW1vcnkgb3duZWQgYnkgcHJvY2VzcyBAcC4KKyAqCUBwIGNvbnRhaW5zIHRoZSB0YXNrX3N0cnVjdCBmb3IgcHJvY2Vzcy4KKyAqCVJldHVybiAwIGlmIHBlcm1pc3Npb24gaXMgZ3JhbnRlZC4KICAqIEB0YXNrX2tpbGw6CiAgKglDaGVjayBwZXJtaXNzaW9uIGJlZm9yZSBzZW5kaW5nIHNpZ25hbCBAc2lnIHRvIEBwLiAgQGluZm8gY2FuIGJlIE5VTEwsCiAgKgl0aGUgY29uc3RhbnQgMSwgb3IgYSBwb2ludGVyIHRvIGEgc2lnaW5mbyBzdHJ1Y3R1cmUuICBJZiBAaW5mbyBpcyAxIG9yCkBAIC0xMTI3LDcgKzExMzYsNyBAQAogCWludCAoKnNiX2NvcHlfZGF0YSkoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCiAJCQkgICAgdm9pZCAqb3JpZywgdm9pZCAqY29weSk7CiAJaW50ICgqc2Jfa2Vybl9tb3VudCkgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpOwotCWludCAoKnNiX3N0YXRmcykgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKTsKKwlpbnQgKCpzYl9zdGF0ZnMpIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOwogCWludCAoKnNiX21vdW50KSAoY2hhciAqZGV2X25hbWUsIHN0cnVjdCBuYW1laWRhdGEgKiBuZCwKIAkJCSBjaGFyICp0eXBlLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB2b2lkICpkYXRhKTsKIAlpbnQgKCpzYl9jaGVja19zYikgKHN0cnVjdCB2ZnNtb3VudCAqIG1udCwgc3RydWN0IG5hbWVpZGF0YSAqIG5kKTsKQEAgLTEyMTAsMTAgKzEyMTksMTIgQEAKIAlpbnQgKCp0YXNrX2dldHNpZCkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHApOwogCWludCAoKnRhc2tfc2V0Z3JvdXBzKSAoc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm8pOwogCWludCAoKnRhc2tfc2V0bmljZSkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIGludCBuaWNlKTsKKwlpbnQgKCp0YXNrX3NldGlvcHJpbykgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsIGludCBpb3ByaW8pOwogCWludCAoKnRhc2tfc2V0cmxpbWl0KSAodW5zaWduZWQgaW50IHJlc291cmNlLCBzdHJ1Y3QgcmxpbWl0ICogbmV3X3JsaW0pOwogCWludCAoKnRhc2tfc2V0c2NoZWR1bGVyKSAoc3RydWN0IHRhc2tfc3RydWN0ICogcCwgaW50IHBvbGljeSwKIAkJCQkgIHN0cnVjdCBzY2hlZF9wYXJhbSAqIGxwKTsKIAlpbnQgKCp0YXNrX2dldHNjaGVkdWxlcikgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHApOworCWludCAoKnRhc2tfbW92ZW1lbW9yeSkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHApOwogCWludCAoKnRhc2tfa2lsbCkgKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHAsCiAJCQkgIHN0cnVjdCBzaWdpbmZvICogaW5mbywgaW50IHNpZyk7CiAJaW50ICgqdGFza193YWl0KSAoc3RydWN0IHRhc2tfc3RydWN0ICogcCk7CkBAIC0xMzEzLDcgKzEzMjQsNyBAQAogCiAJLyoga2V5IG1hbmFnZW1lbnQgc2VjdXJpdHkgaG9va3MgKi8KICNpZmRlZiBDT05GSUdfS0VZUwotCWludCAoKmtleV9hbGxvYykoc3RydWN0IGtleSAqa2V5KTsKKwlpbnQgKCprZXlfYWxsb2MpKHN0cnVjdCBrZXkgKmtleSwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCXZvaWQgKCprZXlfZnJlZSkoc3RydWN0IGtleSAqa2V5KTsKIAlpbnQgKCprZXlfcGVybWlzc2lvbikoa2V5X3JlZl90IGtleV9yZWYsCiAJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnRleHQsCkBAIC0xNDUwLDkgKzE0NjEsOSBAQAogCXJldHVybiBzZWN1cml0eV9vcHMtPnNiX2tlcm5fbW91bnQgKHNiLCBkYXRhKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfc2Jfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfc2Jfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7Ci0JcmV0dXJuIHNlY3VyaXR5X29wcy0+c2Jfc3RhdGZzIChzYik7CisJcmV0dXJuIHNlY3VyaXR5X29wcy0+c2Jfc3RhdGZzIChkZW50cnkpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9zYl9tb3VudCAoY2hhciAqZGV2X25hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kLApAQCAtMTgzNiw2ICsxODQ3LDExIEBACiAJcmV0dXJuIHNlY3VyaXR5X29wcy0+dGFza19zZXRuaWNlIChwLCBuaWNlKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfdGFza19zZXRpb3ByaW8gKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGlvcHJpbykKK3sKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT50YXNrX3NldGlvcHJpbyAocCwgaW9wcmlvKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfdGFza19zZXRybGltaXQgKHVuc2lnbmVkIGludCByZXNvdXJjZSwKIAkJCQkJICAgc3RydWN0IHJsaW1pdCAqbmV3X3JsaW0pCiB7CkBAIC0xODU0LDYgKzE4NzAsMTEgQEAKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT50YXNrX2dldHNjaGVkdWxlciAocCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3Rhc2tfbW92ZW1lbW9yeSAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBzZWN1cml0eV9vcHMtPnRhc2tfbW92ZW1lbW9yeSAocCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3Rhc2tfa2lsbCAoc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCSAgICAgIHN0cnVjdCBzaWdpbmZvICppbmZvLCBpbnQgc2lnKQogewpAQCAtMjE2Miw3ICsyMTgzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfc2Jfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfc2Jfc3RhdGZzIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDc4LDYgKzI0OTksMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfdGFza19zZXRpb3ByaW8gKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGlvcHJpbykKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfdGFza19zZXRybGltaXQgKHVuc2lnbmVkIGludCByZXNvdXJjZSwKIAkJCQkJICAgc3RydWN0IHJsaW1pdCAqbmV3X3JsaW0pCiB7CkBAIC0yNDk2LDYgKzI1MjIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfdGFza19tb3ZlbWVtb3J5IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X3Rhc2tfa2lsbCAoc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCSAgICAgIHN0cnVjdCBzaWdpbmZvICppbmZvLCBpbnQgc2lnKQogewpAQCAtMzAwOCw5ICszMDM5LDEwIEBACiAKICNpZmRlZiBDT05GSUdfS0VZUwogI2lmZGVmIENPTkZJR19TRUNVUklUWQotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfa2V5X2FsbG9jKHN0cnVjdCBrZXkgKmtleSkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCisJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlyZXR1cm4gc2VjdXJpdHlfb3BzLT5rZXlfYWxsb2Moa2V5KTsKKwlyZXR1cm4gc2VjdXJpdHlfb3BzLT5rZXlfYWxsb2Moa2V5LCB0c2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2VjdXJpdHlfa2V5X2ZyZWUoc3RydWN0IGtleSAqa2V5KQpAQCAtMzAyNyw3ICszMDU5LDggQEAKIAogI2Vsc2UKIAotc3RhdGljIGlubGluZSBpbnQgc2VjdXJpdHlfa2V5X2FsbG9jKHN0cnVjdCBrZXkgKmtleSkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksCisJCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaCBiL2luY2x1ZGUvbGludXgvc2VyaWFsX2NvcmUuaAppbmRleCAwZWY1MGJhLi45NTFjNGU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9jb3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXJpYWxfY29yZS5oCkBAIC0xMzAsNiArMTMwLDkgQEAKIC8qIFNVTjRWIEh5cGVydmlzb3IgQ29uc29sZSAqLwogI2RlZmluZSBQT1JUX1NVTkhWCTcyCiAKKyNkZWZpbmUgUE9SVF9TM0MyNDEyCTczCisKKwogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaAppbmRleCA2NmY4ODE5Li4xNmVlZjAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc2tidWZmLmgKQEAgLTEzNCw5ICsxMzQsMTAgQEAKIHN0cnVjdCBza2Jfc2hhcmVkX2luZm8gewogCWF0b21pY190CWRhdGFyZWY7CiAJdW5zaWduZWQgc2hvcnQJbnJfZnJhZ3M7Ci0JdW5zaWduZWQgc2hvcnQJdHNvX3NpemU7Ci0JdW5zaWduZWQgc2hvcnQJdHNvX3NlZ3M7Ci0JdW5zaWduZWQgc2hvcnQgIHVmb19zaXplOworCXVuc2lnbmVkIHNob3J0CWdzb19zaXplOworCS8qIFdhcm5pbmc6IHRoaXMgZmllbGQgaXMgbm90IGFsd2F5cyBmaWxsZWQgaW4gKFVGTykhICovCisJdW5zaWduZWQgc2hvcnQJZ3NvX3NlZ3M7CisJdW5zaWduZWQgc2hvcnQgIGdzb190eXBlOwogCXVuc2lnbmVkIGludCAgICBpcDZfZnJhZ19pZDsKIAlzdHJ1Y3Qgc2tfYnVmZgkqZnJhZ19saXN0OwogCXNrYl9mcmFnX3QJZnJhZ3NbTUFYX1NLQl9GUkFHU107CkBAIC0xNjgsNiArMTY5LDExIEBACiAJU0tCX0ZDTE9ORV9DTE9ORSwKIH07CiAKK2VudW0geworCVNLQl9HU09fVENQVjQgPSAxIDw8IDAsCisJU0tCX0dTT19VRFBWNCA9IDEgPDwgMSwKK307CisKIC8qKiAKICAqCXN0cnVjdCBza19idWZmIC0gc29ja2V0IGJ1ZmZlcgogICoJQG5leHQ6IE5leHQgYnVmZmVyIGluIGxpc3QKQEAgLTIwOSw2ICsyMTUsOCBAQAogICoJQG5mX2JyaWRnZTogU2F2ZWQgZGF0YSBhYm91dCBhIGJyaWRnZWQgZnJhbWUgLSBzZWUgYnJfbmV0ZmlsdGVyLmMKICAqCUB0Y19pbmRleDogVHJhZmZpYyBjb250cm9sIGluZGV4CiAgKglAdGNfdmVyZDogdHJhZmZpYyBjb250cm9sIHZlcmRpY3QKKyAqCUBkbWFfY29va2llOiBhIGNvb2tpZSB0byBvbmUgb2Ygc2V2ZXJhbCBwb3NzaWJsZSBETUEgb3BlcmF0aW9ucworICoJCWRvbmUgYnkgc2tiIERNQSBmdW5jdGlvbnMKICAqCUBzZWNtYXJrOiBzZWN1cml0eSBtYXJraW5nCiAgKi8KIApAQCAtMzQ1LDcgKzM1Myw3IEBACiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5X2V4cGFuZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICBpbnQgbmV3aGVhZHJvb20sIGludCBuZXd0YWlscm9vbSwKIAkJCQkgICAgICAgZ2ZwX3QgcHJpb3JpdHkpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICoJCXNrYl9wYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCk7CitleHRlcm4gaW50CSAgICAgICBza2JfcGFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBwYWQpOwogI2RlZmluZSBkZXZfa2ZyZWVfc2tiKGEpCWtmcmVlX3NrYihhKQogZXh0ZXJuIHZvaWQJICAgICAgc2tiX292ZXJfcGFuaWMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbiwKIAkJCQkgICAgIHZvaWQgKmhlcmUpOwpAQCAtMTEyMiwxNiArMTEzMCwxNSBAQAogICoKICAqCVBhZHMgdXAgYSBidWZmZXIgdG8gZW5zdXJlIHRoZSB0cmFpbGluZyBieXRlcyBleGlzdCBhbmQgYXJlCiAgKglibGFua2VkLiBJZiB0aGUgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgc3VmZmljaWVudCBkYXRhIGl0Ci0gKglpcyB1bnRvdWNoZWQuIFJldHVybnMgdGhlIGJ1ZmZlciwgd2hpY2ggbWF5IGJlIGEgcmVwbGFjZW1lbnQKLSAqCWZvciB0aGUgb3JpZ2luYWwsIG9yIE5VTEwgZm9yIG91dCBvZiBtZW1vcnkgLSBpbiB3aGljaCBjYXNlCi0gKgl0aGUgb3JpZ2luYWwgYnVmZmVyIGlzIHN0aWxsIGZyZWVkLgorICoJaXMgdW50b3VjaGVkLiBPdGhlcndpc2UgaXQgaXMgZXh0ZW5kZWQuIFJldHVybnMgemVybyBvbgorICoJc3VjY2Vzcy4gVGhlIHNrYiBpcyBmcmVlZCBvbiBlcnJvci4KICAqLwogIAotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3BhZHRvKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgaW5saW5lIGludCBza2JfcGFkdG8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGxlbikKIHsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNrYi0+bGVuOwogCWlmIChsaWtlbHkoc2l6ZSA+PSBsZW4pKQotCQlyZXR1cm4gc2tiOworCQlyZXR1cm4gMDsKIAlyZXR1cm4gc2tiX3BhZChza2IsIGxlbi1zaXplKTsKIH0KIApAQCAtMTI5Miw2ICsxMjk5LDcgQEAKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYjEsIGNvbnN0IHUzMiBsZW4pOwogCiBleHRlcm4gdm9pZAkgICAgICAgc2tiX3JlbGVhc2VfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNnKTsKIAogc3RhdGljIGlubGluZSB2b2lkICpza2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCQkgICAgICAgaW50IGxlbiwgdm9pZCAqYnVmZmVyKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCA5ZGM5MzE2My4uNDVhZDU1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbGFiLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbGFiLmgKQEAgLTg2LDYgKzg2LDUxIEBACiAgICAgX19rbWFsbG9jX3RyYWNrX2NhbGxlcihzaXplLCBmbGFncywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKQogI2VuZGlmCiAKKy8qKgorICoga21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQorICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCisgKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqCisgKiBrbWFsbG9jIGlzIHRoZSBub3JtYWwgbWV0aG9kIG9mIGFsbG9jYXRpbmcgbWVtb3J5CisgKiBpbiB0aGUga2VybmVsLgorICoKKyAqIFRoZSBAZmxhZ3MgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjoKKyAqCisgKiAlR0ZQX1VTRVIgLSBBbGxvY2F0ZSBtZW1vcnkgb24gYmVoYWxmIG9mIHVzZXIuICBNYXkgc2xlZXAuCisgKgorICogJUdGUF9LRVJORUwgLSBBbGxvY2F0ZSBub3JtYWwga2VybmVsIHJhbS4gIE1heSBzbGVlcC4KKyAqCisgKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuCisgKiAgIEZvciBleGFtcGxlLCB1c2UgdGhpcyBpbnNpZGUgaW50ZXJydXB0IGhhbmRsZXJzLgorICoKKyAqICVHRlBfSElHSFVTRVIgLSBBbGxvY2F0ZSBwYWdlcyBmcm9tIGhpZ2ggbWVtb3J5LgorICoKKyAqICVHRlBfTk9JTyAtIERvIG5vdCBkbyBhbnkgSS9PIGF0IGFsbCB3aGlsZSB0cnlpbmcgdG8gZ2V0IG1lbW9yeS4KKyAqCisgKiAlR0ZQX05PRlMgLSBEbyBub3QgbWFrZSBhbnkgZnMgY2FsbHMgd2hpbGUgdHJ5aW5nIHRvIGdldCBtZW1vcnkuCisgKgorICogQWxzbyBpdCBpcyBwb3NzaWJsZSB0byBzZXQgZGlmZmVyZW50IGZsYWdzIGJ5IE9SJ2luZworICogaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIEBmbGFnczoKKyAqCisgKiAlX19HRlBfQ09MRCAtIFJlcXVlc3QgY2FjaGUtY29sZCBwYWdlcyBpbnN0ZWFkIG9mCisgKiAgIHRyeWluZyB0byByZXR1cm4gY2FjaGUtd2FybSBwYWdlcy4KKyAqCisgKiAlX19HRlBfRE1BIC0gUmVxdWVzdCBtZW1vcnkgZnJvbSB0aGUgRE1BLWNhcGFibGUgem9uZS4KKyAqCisgKiAlX19HRlBfSElHSCAtIFRoaXMgYWxsb2NhdGlvbiBoYXMgaGlnaCBwcmlvcml0eSBhbmQgbWF5IHVzZSBlbWVyZ2VuY3kgcG9vbHMuCisgKgorICogJV9fR0ZQX0hJR0hNRU0gLSBBbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBmcm9tIGhpZ2htZW0uCisgKgorICogJV9fR0ZQX05PRkFJTCAtIEluZGljYXRlIHRoYXQgdGhpcyBhbGxvY2F0aW9uIGlzIGluIG5vIHdheSBhbGxvd2VkIHRvIGZhaWwKKyAqICAgKHRoaW5rIHR3aWNlIGJlZm9yZSB1c2luZykuCisgKgorICogJV9fR0ZQX05PUkVUUlkgLSBJZiBtZW1vcnkgaXMgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwKKyAqICAgdGhlbiBnaXZlIHVwIGF0IG9uY2UuCisgKgorICogJV9fR0ZQX05PV0FSTiAtIElmIGFsbG9jYXRpb24gZmFpbHMsIGRvbid0IGlzc3VlIGFueSB3YXJuaW5ncy4KKyAqCisgKiAlX19HRlBfUkVQRUFUIC0gSWYgYWxsb2NhdGlvbiBmYWlscyBpbml0aWFsbHksIHRyeSBvbmNlIG1vcmUgYmVmb3JlIGZhaWxpbmcuCisgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCAqa21hbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHNpemUpKSB7CkBAIC0xMTEsNiArMTU2LDExIEBACiAKIGV4dGVybiB2b2lkICpfX2t6YWxsb2Moc2l6ZV90LCBnZnBfdCk7CiAKKy8qKgorICoga3phbGxvYyAtIGFsbG9jYXRlIG1lbW9yeS4gVGhlIG1lbW9yeSBpcyBzZXQgdG8gemVyby4KKyAqIEBzaXplOiBob3cgbWFueSBieXRlcyBvZiBtZW1vcnkgYXJlIHJlcXVpcmVkLgorICogQGZsYWdzOiB0aGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUgKHNlZSBrbWFsbG9jKS4KKyAqLwogc3RhdGljIGlubGluZSB2b2lkICpremFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKIHsKIAlpZiAoX19idWlsdGluX2NvbnN0YW50X3Aoc2l6ZSkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZy5oCmluZGV4IGM2MTMwNmQuLmU0Yzc1NTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdHJpbmcuaApAQCAtNTYsNiArNTYsNyBAQAogI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJSQ0hSCiBleHRlcm4gY2hhciAqIHN0cnJjaHIoY29uc3QgY2hhciAqLGludCk7CiAjZW5kaWYKK2V4dGVybiBjaGFyICogc3Ryc3RyaXAoY2hhciAqKTsKICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1RSCiBleHRlcm4gY2hhciAqIHN0cnN0cihjb25zdCBjaGFyICosY29uc3QgY2hhciAqKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zdW5ycGMveGRyLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAppbmRleCA4NGMzNWQ0Li5lNmQzZDM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy94ZHIuaApAQCAtMTk0LDYgKzE5NCw3IEBACiBleHRlcm4gdm9pZCB4ZHJfaW5pdF9kZWNvZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHhkcl9idWYgKmJ1ZiwgdWludDMyX3QgKnApOwogZXh0ZXJuIHVpbnQzMl90ICp4ZHJfaW5saW5lX2RlY29kZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzaXplX3QgbmJ5dGVzKTsKIGV4dGVybiB2b2lkIHhkcl9yZWFkX3BhZ2VzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pOworZXh0ZXJuIHZvaWQgeGRyX2VudGVyX3BhZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdW5zaWduZWQgaW50IGxlbik7CiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VzcGVuZC5oIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKaW5kZXggOTZlMzFhYS4uZTgyY2IxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdXNwZW5kLmgKQEAgLTcxLDYgKzcxLDcgQEAKIHZvaWQgX19zYXZlX3Byb2Nlc3Nvcl9zdGF0ZShzdHJ1Y3Qgc2F2ZWRfY29udGV4dCAqY3R4dCk7CiB2b2lkIF9fcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoc3RydWN0IHNhdmVkX2NvbnRleHQgKmN0eHQpOwogdW5zaWduZWQgbG9uZyBnZXRfc2FmZV9wYWdlKGdmcF90IGdmcF9tYXNrKTsKK2ludCBzd3N1c3BfYWRkX2FyY2hfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwogCiAvKgogICogWFhYOiBXZSB0cnkgdG8ga2VlcCBzb21lIG1vcmUgcGFnZXMgZnJlZSBzbyB0aGF0IEkvTyBvcGVyYXRpb25zIHN1Y2NlZWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcC5oIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKaW5kZXggYWNhOWJmYS4uZGMzZjNhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2FwLmgKQEAgLTI4LDcgKzI4LDE0IEBACiAgKiB0aGUgdHlwZS9vZmZzZXQgaW50byB0aGUgcHRlIGFzIDUvMjcgYXMgd2VsbC4KICAqLwogI2RlZmluZSBNQVhfU1dBUEZJTEVTX1NISUZUCTUKKyNpZm5kZWYgQ09ORklHX01JR1JBVElPTgogI2RlZmluZSBNQVhfU1dBUEZJTEVTCQkoMSA8PCBNQVhfU1dBUEZJTEVTX1NISUZUKQorI2Vsc2UKKy8qIFVzZSBsYXN0IHR3byBlbnRyaWVzIGZvciBwYWdlIG1pZ3JhdGlvbiBzd2FwIGVudHJpZXMgKi8KKyNkZWZpbmUgTUFYX1NXQVBGSUxFUwkJKCgxIDw8IE1BWF9TV0FQRklMRVNfU0hJRlQpLTIpCisjZGVmaW5lIFNXUF9NSUdSQVRJT05fUkVBRAlNQVhfU1dBUEZJTEVTCisjZGVmaW5lIFNXUF9NSUdSQVRJT05fV1JJVEUJKE1BWF9TV0FQRklMRVMgKyAxKQorI2VuZGlmCiAKIC8qCiAgKiBNYWdpYyBoZWFkZXIgZm9yIGEgc3dhcCBhcmVhLiBUaGUgZmlyc3QgcGFydCBvZiB0aGUgdW5pb24gaXMKQEAgLTQ4LDEyICs1NSwxNCBAQAogCQljaGFyIG1hZ2ljWzEwXTsJCQkvKiBTV0FQLVNQQUNFIG9yIFNXQVBTUEFDRTIgKi8KIAl9IG1hZ2ljOwogCXN0cnVjdCB7Ci0JCWNoYXIJICAgICBib290Yml0c1sxMDI0XTsJLyogU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCi0JCXVuc2lnbmVkIGludCB2ZXJzaW9uOwotCQl1bnNpZ25lZCBpbnQgbGFzdF9wYWdlOwotCQl1bnNpZ25lZCBpbnQgbnJfYmFkcGFnZXM7Ci0JCXVuc2lnbmVkIGludCBwYWRkaW5nWzEyNV07Ci0JCXVuc2lnbmVkIGludCBiYWRwYWdlc1sxXTsKKwkJY2hhcgkJYm9vdGJpdHNbMTAyNF07CS8qIFNwYWNlIGZvciBkaXNrbGFiZWwgZXRjLiAqLworCQlfX3UzMgkJdmVyc2lvbjsKKwkJX191MzIJCWxhc3RfcGFnZTsKKwkJX191MzIJCW5yX2JhZHBhZ2VzOworCQl1bnNpZ25lZCBjaGFyCXN3c191dWlkWzE2XTsKKwkJdW5zaWduZWQgY2hhcglzd3Nfdm9sdW1lWzE2XTsKKwkJX191MzIJCXBhZGRpbmdbMTE3XTsKKwkJX191MzIJCWJhZHBhZ2VzWzFdOwogCX0gaW5mbzsKIH07CiAKQEAgLTE3NiwyMCArMTg1LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHNocmlua19hbGxfbWVtb3J5KHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpOwogZXh0ZXJuIGludCB2bV9zd2FwcGluZXNzOwogZXh0ZXJuIGludCByZW1vdmVfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpOwotCi0vKiBwb3NzaWJsZSBvdXRjb21lIG9mIHBhZ2VvdXQoKSAqLwotdHlwZWRlZiBlbnVtIHsKLQkvKiBmYWlsZWQgdG8gd3JpdGUgcGFnZSBvdXQsIHBhZ2UgaXMgbG9ja2VkICovCi0JUEFHRV9LRUVQLAotCS8qIG1vdmUgcGFnZSB0byB0aGUgYWN0aXZlIGxpc3QsIHBhZ2UgaXMgbG9ja2VkICovCi0JUEFHRV9BQ1RJVkFURSwKLQkvKiBwYWdlIGhhcyBiZWVuIHNlbnQgdG8gdGhlIGRpc2sgc3VjY2Vzc2Z1bGx5LCBwYWdlIGlzIHVubG9ja2VkICovCi0JUEFHRV9TVUNDRVNTLAotCS8qIHBhZ2UgaXMgY2xlYW4gYW5kIGxvY2tlZCAqLwotCVBBR0VfQ0xFQU4sCi19IHBhZ2VvdXRfdDsKLQotZXh0ZXJuIHBhZ2VvdXRfdCBwYWdlb3V0KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyk7CitleHRlcm4gbG9uZyB2bV90b3RhbF9wYWdlczsKIAogI2lmZGVmIENPTkZJR19OVU1BCiBleHRlcm4gaW50IHpvbmVfcmVjbGFpbV9tb2RlOwpAQCAtMjUwLDcgKzI0Niw2IEBACiBzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbzsKIAogZXh0ZXJuIHNwaW5sb2NrX3Qgc3dhcF9sb2NrOwotZXh0ZXJuIGludCByZW1vdmVfdm1hX3N3YXAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBwYWdlICpwYWdlKTsKIAogLyogbGludXgvbW0vdGhyYXNoLmMgKi8KIGV4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICogc3dhcF90b2tlbl9tbTsKQEAgLTI4OCwxOCArMjgzLDYwIEBACiAjZGVmaW5lIGZyZWVfcGFnZXNfYW5kX3N3YXBfY2FjaGUocGFnZXMsIG5yKSBcCiAJcmVsZWFzZV9wYWdlcygocGFnZXMpLCAobnIpLCAwKTsKIAotI2RlZmluZSBzaG93X3N3YXBfY2FjaGVfaW5mbygpCQkJLypOT1RISU5HKi8KLSNkZWZpbmUgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3ApCQkvKk5PVEhJTkcqLwotI2RlZmluZSBzd2FwX2R1cGxpY2F0ZShzd3ApCQkJLypOT1RISU5HKi8KLSNkZWZpbmUgc3dhcF9mcmVlKHN3cCkJCQkJLypOT1RISU5HKi8KLSNkZWZpbmUgcmVhZF9zd2FwX2NhY2hlX2FzeW5jKHN3cCx2bWEsYWRkcikJTlVMTAotI2RlZmluZSBsb29rdXBfc3dhcF9jYWNoZShzd3ApCQkJTlVMTAotI2RlZmluZSB2YWxpZF9zd2FwaGFuZGxlcyhzd3AsIG9mZikJCTAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzaG93X3N3YXBfY2FjaGVfaW5mbyh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zd2FwX2FuZF9jYWNoZShzd3BfZW50cnlfdCBzd3ApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN3YXBfZHVwbGljYXRlKHN3cF9lbnRyeV90IHN3cCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3YXBfZnJlZShzd3BfZW50cnlfdCBzd3ApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnJlYWRfc3dhcF9jYWNoZV9hc3luYyhzd3BfZW50cnlfdCBzd3AsCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpsb29rdXBfc3dhcF9jYWNoZShzd3BfZW50cnlfdCBzd3ApCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3N3YXBoYW5kbGVzKHN3cF9lbnRyeV90IGVudHJ5LCB1bnNpZ25lZCBsb25nICpvZmZzZXQpCit7CisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgY2FuX3NoYXJlX3N3YXBfcGFnZShwKQkJCShwYWdlX21hcGNvdW50KHApID09IDEpCi0jZGVmaW5lIG1vdmVfdG9fc3dhcF9jYWNoZShwLCBzd3ApCQkxCi0jZGVmaW5lIG1vdmVfZnJvbV9zd2FwX2NhY2hlKHAsIGksIG0pCQkxCi0jZGVmaW5lIF9fZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwKQkJLypOT1RISU5HKi8KLSNkZWZpbmUgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwKQkJLypOT1RISU5HKi8KKworc3RhdGljIGlubGluZSBpbnQgbW92ZV90b19zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLCBzd3BfZW50cnlfdCBlbnRyeSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbW92ZV9mcm9tX3N3YXBfY2FjaGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19kZWxldGVfZnJvbV9zd2FwX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKK30KKwogI2RlZmluZSBzd2FwX3Rva2VuX2RlZmF1bHRfdGltZW91dAkJMAogCiBzdGF0aWMgaW5saW5lIGludCByZW1vdmVfZXhjbHVzaXZlX3N3YXBfcGFnZShzdHJ1Y3QgcGFnZSAqcCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3dhcG9wcy5oIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKaW5kZXggODdiOWQxNC4uZWM2MzlhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmgKQEAgLTY3LDMgKzY3LDU2IEBACiAJQlVHX09OKHB0ZV9maWxlKF9fc3dwX2VudHJ5X3RvX3B0ZShhcmNoX2VudHJ5KSkpOwogCXJldHVybiBfX3N3cF9lbnRyeV90b19wdGUoYXJjaF9lbnRyeSk7CiB9CisKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCitzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IG1ha2VfbWlncmF0aW9uX2VudHJ5KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd3JpdGUpCit7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlyZXR1cm4gc3dwX2VudHJ5KHdyaXRlID8gU1dQX01JR1JBVElPTl9XUklURSA6IFNXUF9NSUdSQVRJT05fUkVBRCwKKwkJCXBhZ2VfdG9fcGZuKHBhZ2UpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfbWlncmF0aW9uX2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5KQoreworCXJldHVybiB1bmxpa2VseShzd3BfdHlwZShlbnRyeSkgPT0gU1dQX01JR1JBVElPTl9SRUFEIHx8CisJCQlzd3BfdHlwZShlbnRyeSkgPT0gU1dQX01JR1JBVElPTl9XUklURSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3dyaXRlX21pZ3JhdGlvbl9lbnRyeShzd3BfZW50cnlfdCBlbnRyeSkKK3sKKwlyZXR1cm4gdW5saWtlbHkoc3dwX3R5cGUoZW50cnkpID09IFNXUF9NSUdSQVRJT05fV1JJVEUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICptaWdyYXRpb25fZW50cnlfdG9fcGFnZShzd3BfZW50cnlfdCBlbnRyeSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcCA9IHBmbl90b19wYWdlKHN3cF9vZmZzZXQoZW50cnkpKTsKKwkvKgorCSAqIEFueSB1c2Ugb2YgbWlncmF0aW9uIGVudHJpZXMgbWF5IG9ubHkgb2NjdXIgd2hpbGUgdGhlCisJICogY29ycmVzcG9uZGluZyBwYWdlIGlzIGxvY2tlZAorCSAqLworCUJVR19PTighUGFnZUxvY2tlZChwKSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWtlX21pZ3JhdGlvbl9lbnRyeV9yZWFkKHN3cF9lbnRyeV90ICplbnRyeSkKK3sKKwkqZW50cnkgPSBzd3BfZW50cnkoU1dQX01JR1JBVElPTl9SRUFELCBzd3Bfb2Zmc2V0KCplbnRyeSkpOworfQorCitleHRlcm4gdm9pZCBtaWdyYXRpb25fZW50cnlfd2FpdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgcG1kX3QgKnBtZCwKKwkJCQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzKTsKKyNlbHNlCisKKyNkZWZpbmUgbWFrZV9taWdyYXRpb25fZW50cnkocGFnZSwgd3JpdGUpIHN3cF9lbnRyeSgwLCAwKQorI2RlZmluZSBpc19taWdyYXRpb25fZW50cnkoc3dwKSAwCisjZGVmaW5lIG1pZ3JhdGlvbl9lbnRyeV90b19wYWdlKHN3cCkgTlVMTAorc3RhdGljIGlubGluZSB2b2lkIG1ha2VfbWlncmF0aW9uX2VudHJ5X3JlYWQoc3dwX2VudHJ5X3QgKmVudHJ5cCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgbWlncmF0aW9uX2VudHJ5X3dhaXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBtZF90ICpwbWQsCisJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpIHsgfQorc3RhdGljIGlubGluZSBpbnQgaXNfd3JpdGVfbWlncmF0aW9uX2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeW5jbGluay5oIGIvaW5jbHVkZS9saW51eC9zeW5jbGluay5oCmluZGV4IDI5OTMzMDIuLjA1NzdmNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3luY2xpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5bmNsaW5rLmgKQEAgLTEsNyArMSw3IEBACiAvKgogICogU3luY0xpbmsgTXVsdGlwcm90b2NvbCBTZXJpYWwgQWRhcHRlciBEcml2ZXIKICAqCi0gKiAkSWQ6IHN5bmNsaW5rLmgsdiAzLjExIDIwMDYvMDIvMDYgMjE6MjA6MjkgcGF1bGtmIEV4cCAkCisgKiAkSWQ6IHN5bmNsaW5rLmgsdiAzLjEzIDIwMDYvMDUvMjMgMTg6MjU6MDYgcGF1bGtmIEV4cCAkCiAgKgogICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDAgYnkgTWljcm9nYXRlIENvcnBvcmF0aW9uCiAgKgpAQCAtOTcsNiArOTcsOCBAQAogI2RlZmluZSBIRExDX1RYSURMRV9BTFRfTUFSS19TUEFDRQk0CiAjZGVmaW5lIEhETENfVFhJRExFX1NQQUNFCQk1CiAjZGVmaW5lIEhETENfVFhJRExFX01BUksJCTYKKyNkZWZpbmUgSERMQ19UWElETEVfQ1VTVE9NXzggICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEhETENfVFhJRExFX0NVU1RPTV8xNiAgICAgICAgICAgMHgyMDAwMDAwMAogCiAjZGVmaW5lIEhETENfRU5DT0RJTkdfTlJaCQkJMAogI2RlZmluZSBIRExDX0VOQ09ESU5HX05SWkIJCQkxCkBAIC0xNzAsNiArMTcyLDcgQEAKICNkZWZpbmUgU1lOQ0xJTktfR1RfREVWSUNFX0lEIDB4MDA3MAogI2RlZmluZSBTWU5DTElOS19HVDRfREVWSUNFX0lEIDB4MDA4MAogI2RlZmluZSBTWU5DTElOS19BQ19ERVZJQ0VfSUQgIDB4MDA5MAorI2RlZmluZSBTWU5DTElOS19HVDJfREVWSUNFX0lEIDB4MDBBMAogI2RlZmluZSBNR1NMX01BWF9TRVJJQUxfTlVNQkVSIDMwCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKaW5kZXggYmQ2N2E0NC4uMzM3ODViNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaApAQCAtNTE2LDYgKzUxNiwxNiBAQAogYXNtbGlua2FnZSBsb25nIHN5c19taWdyYXRlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBtYXhub2RlLAogCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICpmcm9tLAogCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgX191c2VyICp0byk7Cithc21saW5rYWdlIGxvbmcgc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAorCQkJCWNvbnN0IHZvaWQgX191c2VyICogX191c2VyICpwYWdlcywKKwkJCQljb25zdCBpbnQgX191c2VyICpub2RlcywKKwkJCQlpbnQgX191c2VyICpzdGF0dXMsCisJCQkJaW50IGZsYWdzKTsKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2UsCisJCQkJX191MzIgX191c2VyICpwYWdlcywKKwkJCQljb25zdCBpbnQgX191c2VyICpub2RlcywKKwkJCQlpbnQgX191c2VyICpzdGF0dXMsCisJCQkJaW50IGZsYWdzKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbWJpbmQodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sCiAJCQkJdW5zaWduZWQgbG9uZyBtb2RlLAogCQkJCXVuc2lnbmVkIGxvbmcgX191c2VyICpubWFzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmggYi9pbmNsdWRlL2xpbnV4L3N5c2N0bC5oCmluZGV4IGNlZTk0NGQuLjZhNjA3NzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9zeXNjdGwuaApAQCAtNTUsNyArNTUsNyBAQAogCUNUTF9LRVJOPTEsCQkvKiBHZW5lcmFsIGtlcm5lbCBpbmZvIGFuZCBjb250cm9sICovCiAJQ1RMX1ZNPTIsCQkvKiBWTSBtYW5hZ2VtZW50ICovCiAJQ1RMX05FVD0zLAkJLyogTmV0d29ya2luZyAqLwotCUNUTF9QUk9DPTQsCQkvKiBQcm9jZXNzIGluZm8gKi8KKwkvKiB3YXMgQ1RMX1BST0MgKi8KIAlDVExfRlM9NSwJCS8qIEZpbGVzeXN0ZW1zICovCiAJQ1RMX0RFQlVHPTYsCQkvKiBEZWJ1Z2dpbmcgKi8KIAlDVExfREVWPTcsCQkvKiBEZXZpY2VzICovCkBAIC0xODYsNiArMTg2LDcgQEAKIAlWTV9QRVJDUFVfUEFHRUxJU1RfRlJBQ1RJT049MzAsLyogaW50OiBmcmFjdGlvbiBvZiBwYWdlcyBpbiBlYWNoIHBlcmNwdV9wYWdlbGlzdCAqLwogCVZNX1pPTkVfUkVDTEFJTV9NT0RFPTMxLCAvKiByZWNsYWltIGxvY2FsIHpvbmUgbWVtb3J5IGJlZm9yZSBnb2luZyBvZmYgbm9kZSAqLwogCVZNX1pPTkVfUkVDTEFJTV9JTlRFUlZBTD0zMiwgLyogdGltZSBwZXJpb2QgdG8gd2FpdCBhZnRlciByZWNsYWltIGZhaWx1cmUgKi8KKwlWTV9QQU5JQ19PTl9PT009MzMsCS8qIHBhbmljIGF0IG91dC1vZi1tZW1vcnkgKi8KIH07CiAKIApAQCAtNzY2LDggKzc2Nyw2IEBACiAJTkVUX0JSSURHRV9ORl9GSUxURVJfVkxBTl9UQUdHRUQgPSA0LAogfTsKIAotLyogQ1RMX1BST0MgbmFtZXM6ICovCi0KIC8qIENUTF9GUyBuYW1lczogKi8KIGVudW0KIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGNwLmggYi9pbmNsdWRlL2xpbnV4L3RjcC5oCmluZGV4IDQyMGE2ODkuLjhlYmY0OTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGNwLmgKKysrIGIvaW5jbHVkZS9saW51eC90Y3AuaApAQCAtMTgsNyArMTgsNiBAQAogI2RlZmluZSBfTElOVVhfVENQX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgogCiBzdHJ1Y3QgdGNwaGRyIHsKQEAgLTE2MSw2ICsxNjAsNyBAQAogI2lmZGVmIF9fS0VSTkVMX18KIAogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfdGltZXdhaXRfc29jay5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91YWNjZXNzLmggYi9pbmNsdWRlL2xpbnV4L3VhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTFlN2VkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91YWNjZXNzLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfX0xJTlVYX1VBQ0NFU1NfSF9fCisjZGVmaW5lIF9fTElOVVhfVUFDQ0VTU19IX18KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpZm5kZWYgQVJDSF9IQVNfTk9DQUNIRV9VQUNDRVNTCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUodm9pZCAqdG8sCisJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh0bywgZnJvbSwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX2NvcHlfZnJvbV91c2VyX25vY2FjaGUodm9pZCAqdG8sCisJCQkJY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcih0bywgZnJvbSwgbik7Cit9CisKKyNlbmRpZgkJLyogQVJDSF9IQVNfTk9DQUNIRV9VQUNDRVNTICovCisKKyNlbmRpZgkJLyogX19MSU5VWF9VQUNDRVNTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91ZnNfZnMuaCBiL2luY2x1ZGUvbGludXgvdWZzX2ZzLmgKaW5kZXggODZiNWI0Mi4uOTE0ZjkxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91ZnNfZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vmc19mcy5oCkBAIC0yMjAsNiArMjIwLDE5IEBACiAgKi8KICNkZWZpbmUgVUZTX01JTkZSRUUgICAgICAgICA1CiAjZGVmaW5lIFVGU19ERUZBVUxUT1BUICAgICAgVUZTX09QVFRJTUUKKworLyoKKyAqIERlYnVnIGNvZGUKKyAqLworI2lmZGVmIENPTkZJR19VRlNfREVCVUcKKyMJZGVmaW5lIFVGU0QoZiwgYS4uLikJewkJCQkJXAorCQlwcmludGsgKCJVRlNEICglcywgJWQpOiAlczoiLAkJCQlcCisJCQlfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7CQlcCisJCXByaW50ayAoZiwgIyMgYSk7CQkJCQlcCisJfQorI2Vsc2UKKyMJZGVmaW5lIFVGU0QoZiwgYS4uLikJLyoqLworI2VuZGlmCiAgICAgICAgICAgICAKIC8qCiAgKiBUdXJuIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlcnMgaW50byBkaXNrIGJsb2NrIGFkZHJlc3Nlcy4KQEAgLTMzOSw3ICszNTIsMjIgQEAKIH07CiAKIC8qCisgKiBGaWxlIHN5c3RlbSBmbGFncworICovCisjZGVmaW5lIFVGU19VTkNMRUFOICAgICAgMHgwMSAgICAvKiBmaWxlIHN5c3RlbSBub3QgY2xlYW4gYXQgbW91bnQgKHVudXNlZCkgKi8KKyNkZWZpbmUgVUZTX0RPU09GVERFUCAgICAweDAyICAgIC8qIGZpbGUgc3lzdGVtIHVzaW5nIHNvZnQgZGVwZW5kZW5jaWVzICovCisjZGVmaW5lIFVGU19ORUVEU0ZTQ0sgICAgMHgwNCAgICAvKiBuZWVkcyBzeW5jIGZzY2sgKEZyZWVCU0QgY29tcGF0LCB1bnVzZWQpICovCisjZGVmaW5lIFVGU19JTkRFWERJUlMgICAgMHgwOCAgICAvKiBrZXJuZWwgc3VwcG9ydHMgaW5kZXhlZCBkaXJlY3RvcmllcyAqLworI2RlZmluZSBVRlNfQUNMUyAgICAgICAgIDB4MTAgICAgLyogZmlsZSBzeXN0ZW0gaGFzIEFDTHMgZW5hYmxlZCAqLworI2RlZmluZSBVRlNfTVVMVElMQUJFTCAgIDB4MjAgICAgLyogZmlsZSBzeXN0ZW0gaXMgTUFDIG11bHRpLWxhYmVsICovCisjZGVmaW5lIFVGU19GTEFHU19VUERBVEVEIDB4ODAgICAvKiBmbGFncyBoYXZlIGJlZW4gbW92ZWQgdG8gbmV3IGxvY2F0aW9uICovCisKKyNpZiAwCisvKgogICogVGhpcyBpcyB0aGUgYWN0dWFsIHN1cGVyYmxvY2ssIGFzIGl0IGlzIGxhaWQgb3V0IG9uIHRoZSBkaXNrLgorICogRG8gTk9UIHVzZSB0aGlzIHN0cnVjdHVyZSwgYmVjYXVzZSBvZiBzaXplb2YodWZzX3N1cGVyX2Jsb2NrKSA+IDUxMiBhbmQKKyAqIGl0IG1heSBvY2N1cHkgc2V2ZXJhbCBibG9ja3MsIHVzZQorICogc3RydWN0IHVmc19zdXBlcl9ibG9ja18oZmlyc3Qsc2Vjb25kLHRoaXJkKSBpbnN0ZWFkLgogICovCiBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrIHsKIAlfX2ZzMzIJZnNfbGluazsJLyogVU5VU0VEICovCkBAIC00MTYsNyArNDQ0LDcgQEAKIAlfX3M4CWZzX2Ztb2Q7CS8qIHN1cGVyIGJsb2NrIG1vZGlmaWVkIGZsYWcgKi8KIAlfX3M4CWZzX2NsZWFuOwkvKiBmaWxlIHN5c3RlbSBpcyBjbGVhbiBmbGFnICovCiAJX19zOAlmc19yb25seTsJLyogbW91bnRlZCByZWFkLW9ubHkgZmxhZyAqLwotCV9fczgJZnNfZmxhZ3M7CS8qIGN1cnJlbnRseSB1bnVzZWQgZmxhZyAqLworCV9fczgJZnNfZmxhZ3M7CiAJdW5pb24gewogCQlzdHJ1Y3QgewogCQkJX19zOAlmc19mc21udFtVRlNfTUFYTU5UTEVOXTsvKiBuYW1lIG1vdW50ZWQgb24gKi8KQEAgLTQ4NSw2ICs1MTMsNyBAQAogCV9fZnMzMglmc19tYWdpYzsJCS8qIG1hZ2ljIG51bWJlciAqLwogCV9fdTgJZnNfc3BhY2VbMV07CQkvKiBsaXN0IG9mIGJsb2NrcyBmb3IgZWFjaCByb3RhdGlvbiAqLwogfTsKKyNlbmRpZi8qc3RydWN0IHVmc19zdXBlcl9ibG9jayovCiAKIC8qCiAgKiBQcmVmZXJlbmNlIGZvciBvcHRpbWl6YXRpb24uCkBAIC02NjYsNyArNjk1LDcgQEAKIH07CiAKIHN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvIHsKLQlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwIHVjZzsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkIGNfdWJoOwogCV9fdTMyCWNfY2d4OwkJLyogbnVtYmVyIG9mIGN5bGlkbmVyIGdyb3VwICovCiAJX191MTYJY19uY3lsOwkJLyogbnVtYmVyIG9mIGN5bCdzIHRoaXMgY2cgKi8KIAlfX3UxNgljX25pYmxrOwkvKiBudW1iZXIgb2YgaW5vZGUgYmxvY2tzIHRoaXMgY2cgKi8KQEAgLTY4Niw2ICs3MTUsNyBAQAogCiBzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyB7CiAJc3RydWN0IHVmc19idWZmZXJfaGVhZCBzX3ViaDsgLyogYnVmZmVyIGNvbnRhaW5pbmcgc3VwZXIgYmxvY2sgKi8KKwlzdHJ1Y3QgdWZzMl9jc3VtX3RvdGFsIGNzX3RvdGFsOwogCV9fdTMyCXNfc2Jsa25vOwkvKiBvZmZzZXQgb2Ygc3VwZXItYmxvY2tzIGluIGZpbGVzeXMgKi8KIAlfX3UzMglzX2NibGtubzsJLyogb2Zmc2V0IG9mIGNnLWJsb2NrIGluIGZpbGVzeXMgKi8KIAlfX3UzMglzX2libGtubzsJLyogb2Zmc2V0IG9mIGlub2RlLWJsb2NrcyBpbiBmaWxlc3lzICovCkBAIC04MjQsMTYgKzg1NCw1NCBAQAogfTsKIAogc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgewotCV9fczgJZnNfZnNtbnRbMjEyXTsKLQlfX2ZzMzIJZnNfY2dyb3RvcjsKLQlfX2ZzMzIJZnNfY3NwW1VGU19NQVhDU0JVRlNdOwotCV9fZnMzMglmc19tYXhjbHVzdGVyOwotCV9fZnMzMglmc19jcGM7Ci0JX19mczE2CWZzX29wb3N0YmxbODJdOwotfTsJCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19zOAlmc19mc21udFsyMTJdOworCQkJX19mczMyCWZzX2Nncm90b3I7CisJCQlfX2ZzMzIJZnNfY3NwW1VGU19NQVhDU0JVRlNdOworCQkJX19mczMyCWZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIJZnNfY3BjOworCQkJX19mczE2CWZzX29wb3N0YmxbODJdOworCQl9IGZzX3UxOworCQlzdHJ1Y3QgeworCQkJX19zOCAgZnNfZnNtbnRbVUZTMl9NQVhNTlRMRU4gLSBVRlNfTUFYTU5UTEVOICsgMjEyXTsKKwkJCV9fdTggICBmc192b2xuYW1lW1VGUzJfTUFYVk9MTEVOXTsKKwkJCV9fZnM2NCAgZnNfc3d1aWQ7CisJCQlfX2ZzMzIgIGZzX3BhZDsKKwkJCV9fZnMzMiAgIGZzX2Nncm90b3I7CisJCQlfX2ZzMzIgICBmc19vY3NwW1VGUzJfTk9DU1BUUlNdOworCQkJX19mczMyICAgZnNfY29udGlnZGlyczsKKwkJCV9fZnMzMiAgIGZzX2NzcDsKKwkJCV9fZnMzMiAgIGZzX21heGNsdXN0ZXI7CisJCQlfX2ZzMzIgICBmc19hY3RpdmU7CisJCQlfX2ZzMzIgICBmc19vbGRfY3BjOworCQkJX19mczMyICAgZnNfbWF4YnNpemU7CisJCQlfX2ZzNjQgICBmc19zcGFyZWNvbjY0WzE3XTsKKwkJCV9fZnM2NCAgIGZzX3NibG9ja2xvYzsKKwkJCV9fZnM2NAljc19uZGlyOworCQkJX19mczY0CWNzX25iZnJlZTsKKwkJfSBmc191MjsKKwl9IGZzX3VuOworfTsKIAogc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCB7Ci0JX19mczE2CWZzX29wb3N0YmxbNDZdOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fZnMxNglmc19vcG9zdGJsWzQ2XTsKKwkJfSBmc191MTsKKwkJc3RydWN0IHsKKwkJCV9fZnM2NAljc19uaWZyZWU7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCQkJX19mczY0CWNzX25mZnJlZTsJLyogbnVtYmVyIG9mIGZyZWUgZnJhZ3MgKi8KKwkJCV9fZnM2NCAgIGNzX251bWNsdXN0ZXJzOwkvKiBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyAqLworCQkJX19mczY0ICAgY3Nfc3BhcmVbM107CS8qIGZ1dHVyZSBleHBhbnNpb24gKi8KKwkJCXN0cnVjdCAgdWZzX3RpbWV2YWwgICAgZnNfdGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuICovCisJCQlfX2ZzNjQgICAgZnNfc2l6ZTsJCS8qIG51bWJlciBvZiBibG9ja3MgaW4gZnMgKi8KKwkJCV9fZnM2NCAgICBmc19kc2l6ZTsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIGluIGZzICovCisJCQlfX2ZzNjQgICBmc19jc2FkZHI7CS8qIGJsayBhZGRyIG9mIGN5bCBncnAgc3VtbWFyeSBhcmVhICovCisJCQlfX2ZzNjQgICAgZnNfcGVuZGluZ2Jsb2NrczsvKiBibG9ja3MgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQkJX19mczMyICAgIGZzX3BlbmRpbmdpbm9kZXM7Lyppbm9kZXMgaW4gcHJvY2VzcyBvZiBiZWluZyBmcmVlZCAqLworCQl9IGZzX3UyOworCX0gZnNfdW4xOwogCXVuaW9uIHsKIAkJc3RydWN0IHsKIAkJCV9fZnMzMglmc19zcGFyZWNvbls1M107LyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBjb25zdGFudHMgKi8KQEAgLTg2MSw3ICs5MjksNyBAQAogCQkJX19mczMyCWZzX3FmbWFza1syXTsJLyogfnVzYl9mbWFzayAqLwogCQkJX19mczMyCWZzX3N0YXRlOwkvKiBmaWxlIHN5c3RlbSBzdGF0ZSB0aW1lIHN0YW1wICovCiAJCX0gZnNfNDQ7Ci0JfSBmc191MjsKKwl9IGZzX3VuMjsKIAlfX2ZzMzIJZnNfcG9zdGJsZm9ybWF0OwogCV9fZnMzMglmc19ucnBvczsKIAlfX2ZzMzIJZnNfcG9zdGJsb2ZmOwpAQCAtODc1LDcgKzk0Myw4IEBACiAvKiBiYWxsb2MuYyAqLwogZXh0ZXJuIHZvaWQgdWZzX2ZyZWVfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIHVuc2lnbmVkKTsKIGV4dGVybiB2b2lkIHVmc19mcmVlX2Jsb2NrcyAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7Ci1leHRlcm4gdW5zaWduZWQgdWZzX25ld19mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqLCBfX2ZzMzIgKiwgdW5zaWduZWQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgaW50ICopOworZXh0ZXJuIHVuc2lnbmVkIHVmc19uZXdfZnJhZ21lbnRzKHN0cnVjdCBpbm9kZSAqLCBfX2ZzMzIgKiwgdW5zaWduZWQsIHVuc2lnbmVkLAorCQkJCSAgdW5zaWduZWQsIGludCAqLCBzdHJ1Y3QgcGFnZSAqKTsKIAogLyogY3lsaW5kZXIuYyAqLwogZXh0ZXJuIHN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWZzX2xvYWRfY3lsaW5kZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCk7CkBAIC04ODYsMTEgKzk1NSwxMiBAQAogZXh0ZXJuIGludCB1ZnNfYWRkX2xpbmsgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlub2RlICopOwogZXh0ZXJuIGlub190IHVmc19pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCB1ZnNfbWFrZV9lbXB0eShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogdWZzX2ZpbmRfZW50cnkgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKLWV4dGVybiBpbnQgdWZzX2RlbGV0ZV9lbnRyeSAoc3RydWN0IGlub2RlICosIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqdWZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHBhZ2UgKiopOworZXh0ZXJuIGludCB1ZnNfZGVsZXRlX2VudHJ5KHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqLCBzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiBpbnQgdWZzX2VtcHR5X2RpciAoc3RydWN0IGlub2RlICopOwotZXh0ZXJuIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogdWZzX2RvdGRvdCAoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7Ci1leHRlcm4gdm9pZCB1ZnNfc2V0X2xpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gc3RydWN0IHVmc19kaXJfZW50cnkgKnVmc19kb3Rkb3Qoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICoqKTsKK2V4dGVybiB2b2lkIHVmc19zZXRfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLAorCQkJIHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAogLyogZmlsZS5jICovCiBleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKQEAgLTkwMywxMyArOTczLDExIEBACiBleHRlcm4gc3RydWN0IGlub2RlICogdWZzX25ld19pbm9kZSAoc3RydWN0IGlub2RlICosIGludCk7CiAKIC8qIGlub2RlLmMgKi8KLWV4dGVybiB1NjQgIHVmc19mcmFnX21hcCAoc3RydWN0IGlub2RlICosIHNlY3Rvcl90KTsKIGV4dGVybiB2b2lkIHVmc19yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCB1ZnNfcHV0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gaW50IHVmc193cml0ZV9pbm9kZSAoc3RydWN0IGlub2RlICosIGludCk7CiBleHRlcm4gaW50IHVmc19zeW5jX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiBleHRlcm4gdm9pZCB1ZnNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7Ci1leHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICogdWZzX2dldGZyYWcgKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCwgaW50LCBpbnQgKik7CiBleHRlcm4gc3RydWN0IGJ1ZmZlcl9oZWFkICogdWZzX2JyZWFkIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQsIGludCwgaW50ICopOwogZXh0ZXJuIGludCB1ZnNfZ2V0ZnJhZ19ibG9jayAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgZnJhZ21lbnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91ZnNfZnNfaS5oIGIvaW5jbHVkZS9saW51eC91ZnNfZnNfaS5oCmluZGV4IDIxNjY1YTkuLmY1MGNlM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWZzX2ZzX2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Vmc19mc19pLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAlfX3UzMglpX29lZnRmbGFnOwogCV9fdTE2CWlfb3N5bmM7CiAJX191MzIJaV9sYXN0ZnJhZzsKKwlfX3UzMiAgIGlfZGlyX3N0YXJ0X2xvb2t1cDsKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oIGIvaW5jbHVkZS9saW51eC92aWRlb2Rldi5oCmluZGV4IDkxMTQwMDkuLjQxYmM3ZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmlkZW9kZXYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2LmgKQEAgLTEsNDkgKzEsMjEgQEAKKy8qCisgKglWaWRlbyBmb3IgTGludXggdmVyc2lvbiAxIC0gT0JTT0xFVEUKKyAqCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsMSBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMsIGZvcgorICoJTGludXgga2VybmVscyAyLjIueCBvciAyLjQueC4KKyAqCisgKglQcm92aWRlcyBoZWFkZXIgZm9yIGxlZ2FjeSBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKKyAqCisgKglTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KKyAqCisgKi8KICNpZm5kZWYgX19MSU5VWF9WSURFT0RFVl9ICiAjZGVmaW5lIF9fTElOVVhfVklERU9ERVZfSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQogI2RlZmluZSBIQVZFX1Y0TDEgMQogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotCi1leHRlcm4gc3RydWN0IHZpZGVvX2RldmljZSogdmlkZW9fZGV2ZGF0YShzdHJ1Y3QgZmlsZSopOwotCi0jZGVmaW5lIHRvX3ZpZGVvX2RldmljZShjZCkgY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlLCBjbGFzc19kZXYpCi1zdGF0aWMgaW5saW5lIHZvaWQKLXZpZGVvX2RldmljZV9jcmVhdGVfZmlsZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsCi0JCQkgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCi17Ci0JY2xhc3NfZGV2aWNlX2NyZWF0ZV9maWxlKCZ2ZmQtPmNsYXNzX2RldiwgYXR0cik7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXZpZGVvX2RldmljZV9yZW1vdmVfZmlsZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsCi0JCQkgc3RydWN0IGNsYXNzX2RldmljZV9hdHRyaWJ1dGUgKmF0dHIpCi17Ci0JY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKCZ2ZmQtPmNsYXNzX2RldiwgYXR0cik7Ci19Ci0KLSNpZiBPQlNPTEVURV9PV05FUiAvKiB0byBiZSByZW1vdmVkIGluIDIuNi4xNSAqLwotLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhY2Nlc3MgZHJpdmVyIHByaXZhdGUgZGF0YS4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqdmlkZW9fZ2V0X2RydmRhdGEoc3RydWN0IHZpZGVvX2RldmljZSAqZGV2KQotewotCXJldHVybiBkZXYtPnByaXY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB2aWRlb19zZXRfZHJ2ZGF0YShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCi17Ci0JZGV2LT5wcml2ID0gZGF0YTsKLX0KLSNlbmRpZgotCi1leHRlcm4gaW50IHZpZGVvX2V4Y2x1c2l2ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLWV4dGVybiBpbnQgdmlkZW9fZXhjbHVzaXZlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogc3RydWN0IHZpZGVvX2NhcGFiaWxpdHkKIHsKIAljaGFyIG5hbWVbMzJdOwpAQCAtMzYzLDYgKzMzNSw3IEBACiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9TQUE3MTE0SCAgIDM3CiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9TTjlDMTAyCTM4CiAjZGVmaW5lIFZJRF9IQVJEV0FSRV9BUlYJMzkKKwogI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVZfSCAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKaW5kZXggYWQ3ZmE5Yy4uNGY0Mjg1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCkBAIC0xLDM1ICsxLDMzIEBACi0jaWZuZGVmIF9fTElOVVhfVklERU9ERVYyX0gKLSNkZWZpbmUgX19MSU5VWF9WSURFT0RFVjJfSAogLyoKICAqCVZpZGVvIGZvciBMaW51eCBUd28KICAqCi0gKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zLCBmb3IKLSAqCUxpbnV4IGtlcm5lbHMgMi4yLnggb3IgMi40LnguCisgKglIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zCisgKiB3aXRoIHB1YmxpYyBBUEkuCisgKiBBbGwga2VybmVsLXNwZWNpZmljIHN0dWZmIHdlcmUgbW92ZWQgdG8gbWVkaWEvdjRsMi1kZXYuaCwgc28KKyAqIG5vICNpZiBfX0tFUk5FTCB0ZXN0cyBhcmUgYWxsb3dlZCBoZXJlCiAgKgotICoJU2VlIGh0dHA6Ly9ieXRlc2V4Lm9yZy92NGwvIGZvciBBUEkgc3BlY3MgYW5kIG90aGVyCi0gKgl2NGwyIGRvY3VtZW50YXRpb24uCisgKglTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KICAqCiAgKglBdXRob3I6IEJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KICAqCQlKdXN0aW4gU2Nob2VtYW4KICAqCQlldCBhbC4KICAqLworI2lmbmRlZiBfX0xJTlVYX1ZJREVPREVWMl9ICisjZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX0gKICNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSA8bGludXgvdGltZS5oPiAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCi0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+ICAgICAvKiBuZWVkIHN0cnVjdCB0aW1ldmFsICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4gLyogbmVlZCBfX3VzZXIgKi8KKyNlbHNlCisjZGVmaW5lIF9fdXNlcgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAotCi0jZGVmaW5lIE9CU09MRVRFX09XTkVSIDEgLyogSXQgd2lsbCBiZSByZW1vdmVkIGZvciAyLjYuMTcgKi8KICNkZWZpbmUgSEFWRV9WNEwyIDEKIAogLyoKICAqIENvbW1vbiBzdHVmZiBmb3IgYm90aCBWNEwxIGFuZCBWNEwyCiAgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2LmgKICAqLwotCiAjZGVmaW5lIFZJREVPX01BWF9GUkFNRSAgICAgICAgICAgICAgIDMyCiAKICNkZWZpbmUgVklEX1RZUEVfQ0FQVFVSRQkxCS8qIENhbiBjYXB0dXJlICovCkBAIC00Nyw3MSArNDUsNiBAQAogI2RlZmluZSBWSURfVFlQRV9NSlBFR19ERUNPREVSCTQwOTYJLyogQ2FuIGRlY29kZSBNSlBFRyBzdHJlYW1zICovCiAjZGVmaW5lIFZJRF9UWVBFX01KUEVHX0VOQ09ERVIJODE5MgkvKiBDYW4gZW5jb2RlIE1KUEVHIHN0cmVhbXMgKi8KIAotI2lmZGVmIF9fS0VSTkVMX18KLQotLyogTWlub3IgZGV2aWNlIGFsbG9jYXRpb24gKi8KLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NSU4gICAwCi0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUFYICA2MwotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU4gICAgNjQKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfUkFESU9fTUFYICAgMTI3Ci0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZUWF9NSU4gICAgIDE5MgotI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WVFhfTUFYICAgICAyMjMKLSNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVkJJX01JTiAgICAgMjI0Ci0jZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NQVggICAgIDI1NQotCi0jZGVmaW5lIFZGTF9UWVBFX0dSQUJCRVIJMAotI2RlZmluZSBWRkxfVFlQRV9WQkkJCTEKLSNkZWZpbmUgVkZMX1RZUEVfUkFESU8JCTIKLSNkZWZpbmUgVkZMX1RZUEVfVlRYCQkzCi0KLXN0cnVjdCB2aWRlb19kZXZpY2UKLXsKLQkvKiBkZXZpY2UgaW5mbyAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQljaGFyIG5hbWVbMzJdOwotCWludCB0eXBlOyAgICAgICAvKiB2NGwxICovCi0JaW50IHR5cGUyOyAgICAgIC8qIHY0bDIgKi8KLQlpbnQgaGFyZHdhcmU7Ci0JaW50IG1pbm9yOwotCi0JLyogZGV2aWNlIG9wcyArIGNhbGxiYWNrcyAqLwotCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7Ci0Jdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZCk7Ci0KLQotI2lmIE9CU09MRVRFX09XTkVSIC8qIHRvIGJlIHJlbW92ZWQgaW4gMi42LjE1ICovCi0JLyogb2Jzb2xldGUgLS0gZm9wcy0+b3duZXIgaXMgdXNlZCBpbnN0ZWFkICovCi0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JLyogZGV2LT5kcml2ZXJfZGF0YSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBzb21lIGRheS4KLQkgKiBVc2UgdGhlIHZpZGVvX3tnZXR8c2V0fV9kcnZkYXRhKCkgaGVscGVyIGZ1bmN0aW9ucywKLQkgKiBzbyB0aGUgc3dpdGNoIG92ZXIgd2lsbCBiZSB0cmFuc3BhcmVudCBmb3IgeW91LgotCSAqIE9yIHVzZSB7cGNpfHVzYn1fe2dldHxzZXR9X2RydmRhdGEoKSBkaXJlY3RseS4gKi8KLQl2b2lkICpwcml2OwotI2VuZGlmCi0KLQkvKiBmb3IgdmlkZW9kZXYuYyBpbnRlbmFsIHVzYWdlIC0tIHBsZWFzZSBkb24ndCB0b3VjaCAqLwotCWludCB1c2VyczsgICAgICAgICAgICAgICAgICAgICAvKiB2aWRlb19leGNsdXNpdmVfe29wZW58Y2xvc2V9IC4uLiAqLwotCXN0cnVjdCBtdXRleCBsb2NrOyAgICAgICAgICAgICAvKiAuLi4gaGVscGVyIGZ1bmN0aW9uIHVzZXMgdGhlc2UgICAqLwotCWNoYXIgZGV2ZnNfbmFtZVs2NF07ICAgICAgICAgICAvKiBkZXZmcyAqLwotCXN0cnVjdCBjbGFzc19kZXZpY2UgY2xhc3NfZGV2OyAvKiBzeXNmcyAqLwotfTsKLQotI2RlZmluZSBWSURFT19NQUpPUgk4MQotCi1leHRlcm4gaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICosIGludCB0eXBlLCBpbnQgbnIpOwotZXh0ZXJuIHZvaWQgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHZpZGVvX2RldmljZSAqKTsKLWV4dGVybiBpbnQgdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAotCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpKTsKLQotLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhbGxvYyAvIHJlbGVhc2Ugc3RydWN0IHZpZGVvX2RldmljZSwgdGhlCi0gICBsYXRlciBjYW4gYmUgdXNlZCBmb3IgdmlkZW9fZGV2aWNlLT5yZWxlYXNlKCkgKi8KLXN0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZV9hbGxvYyh2b2lkKTsKLXZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKTsKLQotI2VuZGlmCi0KIC8qCiAgKglNIEkgUyBDIEUgTCBMIEEgTiBFIE8gVSBTCiAgKi8KQEAgLTE3Miw2ICsxMDUsOCBAQAogCVY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4JICAgICA9IDIsCiAJVjRMMl9DVFJMX1RZUEVfTUVOVQkgICAgID0gMywKIAlWNEwyX0NUUkxfVFlQRV9CVVRUT04JICAgICA9IDQsCisJVjRMMl9DVFJMX1RZUEVfSU5URUdFUjY0ICAgICA9IDUsCisJVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCiB9OwogCiBlbnVtIHY0bDJfdHVuZXJfdHlwZSB7CkBAIC0yNzAsNyArMjA1LDYgQEAKIC8qCiAgKglWIEkgRCBFIE8gICBJIE0gQSBHIEUgICBGIE8gUiBNIEEgVAogICovCi0KIHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQKIHsKIAlfX3UzMiAgICAgICAgIAkJd2lkdGg7CkBAIC0yODMsNyArMjE3LDcgQEAKIAlfX3UzMgkJCXByaXY7CQkvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KIH07CiAKLS8qICAgICAgICAgICBQaXhlbCBmb3JtYXQgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAgKi8KKy8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggIERlc2NyaXB0aW9uICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfUkdCMzMyICB2NGwyX2ZvdXJjYygnUicsJ0cnLCdCJywnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9SR0I1NTUgIHY0bDJfZm91cmNjKCdSJywnRycsJ0InLCdPJykgLyogMTYgIFJHQi01LTUtNSAgICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX1JHQjU2NSAgdjRsMl9mb3VyY2MoJ1InLCdHJywnQicsJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLwpAQCAtMzE5LDcgKzI1Myw3IEBACiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9NSlBFRyAgICB2NGwyX2ZvdXJjYygnTScsJ0onLCdQJywnRycpIC8qIE1vdGlvbi1KUEVHICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUcgICAgIHY0bDJfZm91cmNjKCdKJywnUCcsJ0UnLCdHJykgLyogSkZJRiBKUEVHICAgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfRFYgICAgICAgdjRsMl9mb3VyY2MoJ2QnLCd2JywncycsJ2QnKSAvKiAxMzk0ICAgICAgICAgICovCi0jZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsJ1AnLCdFJywnRycpIC8qIE1QRUcgICAgICAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywnUCcsJ0UnLCdHJykgLyogTVBFRy0xLzIvNCAgICAqLwogCiAvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfV05WQSAgICAgdjRsMl9mb3VyY2MoJ1cnLCdOJywnVicsJ0EnKSAvKiBXaW5ub3YgaHcgY29tcHJlc3MgKi8KQEAgLTM0Myw3ICsyNzcsNiBAQAogCiAjZGVmaW5lIFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRCAweDAwMDEKIAotCiAvKgogICoJVCBJIE0gRSBDIE8gRCBFCiAgKi8KQEAgLTM3MywxNiArMzA2LDE1IEBACiAjZGVmaW5lIFY0TDJfVENfVVNFUkJJVFNfOEJJVENIQVJTCTB4MDAwOAogLyogVGhlIGFib3ZlIGlzIGJhc2VkIG9uIFNNUFRFIHRpbWVjb2RlcyAqLwogCi0KKyNpZmRlZiBfX0tFUk5FTF9fCiAvKgogICoJTSBQIEUgRyAgIEMgTyBNIFAgUiBFIFMgUyBJIE8gTiAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKICAqCi0gKiAgIyMjIFdBUk5JTkc6IHRoaXMgaXMgc3RpbGwgd29yay1pbi1wcm9ncmVzcyByaWdodCBub3csIG1vc3QgbGlrZWx5Ci0gKiAgIyMjICAgICAgICAgIHRoZXJlIHdpbGwgYmUgc29tZSBpbmNvbXBhdGlibGUgY2hhbmdlcy4KKyAqICAjIyMgV0FSTklORzogVGhpcyBleHBlcmltZW50YWwgTVBFRyBjb21wcmVzc2lvbiBBUEkgaXMgb2Jzb2xldGUuCisgKiAgIyMjICAgICAgICAgIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBNUEVHIGNvbnRyb2xzIEFQSS4KKyAqICAjIyMgICAgICAgICAgVGhpcyBvbGQgQVBJIHdpbGwgZGlzYXBwZWFyIGluIHRoZSBuZWFyIGZ1dHVyZSEKICAqCiAgKi8KLQotCiBlbnVtIHY0bDJfYml0cmF0ZV9tb2RlIHsKIAlWNEwyX0JJVFJBVEVfTk9ORSA9IDAsCS8qIG5vdCBzcGVjaWZpZWQgKi8KIAlWNEwyX0JJVFJBVEVfQ0JSLAkvKiBjb25zdGFudCBiaXRyYXRlICovCkBAIC00NjAsNiArMzkyLDcgQEAKIAkvKiBJIGRvbid0IGV4cGVjdCB0aGUgYWJvdmUgYmVpbmcgcGVyZmVjdCB5ZXQgOykgKi8KIAlfX3UzMgkJCQlyZXNlcnZlZF81WzhdOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24KIHsKQEAgLTQ5MSw3ICs0MjQsNiBAQAogCQkJCQkqIGFsbHdheXMgdXNlIEFQUDAgKi8KIH07CiAKLQogLyoKICAqCU0gRSBNIE8gUiBZIC0gTSBBIFAgUCBJIE4gRyAgIEIgVSBGIEYgRSBSIFMKICAqLwpAQCAtNTczLDcgKzUwNSw2IEBACiAJdm9pZAkJCV9fdXNlciAqYml0bWFwOwogfTsKIAotCiAvKgogICoJQyBBIFAgVCBVIFIgRSAgIFAgQSBSIEEgTSBFIFQgRSBSIFMKICAqLwpAQCAtNTg2LDYgKzUxNyw3IEBACiAJX191MzIgICAgICAgICAgICAgIHJlYWRidWZmZXJzOyAgIC8qICAjIG9mIGJ1ZmZlcnMgZm9yIHJlYWQgKi8KIAlfX3UzMgkJICAgcmVzZXJ2ZWRbNF07CiB9OworCiAvKiAgRmxhZ3MgZm9yICdjYXBhYmlsaXR5JyBhbmQgJ2NhcHR1cmVtb2RlJyBmaWVsZHMgKi8KICNkZWZpbmUgVjRMMl9NT0RFX0hJR0hRVUFMSVRZCTB4MDAwMQkvKiAgSGlnaCBxdWFsaXR5IGltYWdpbmcgbW9kZSAqLwogI2RlZmluZSBWNEwyX0NBUF9USU1FUEVSRlJBTUUJMHgxMDAwCS8qICB0aW1lcGVyZnJhbWUgZmllbGQgaXMgc3VwcG9ydGVkICovCkBAIC02MDMsNyArNTM1LDYgQEAKIC8qCiAgKglJIE4gUCBVIFQgICBJIE0gQSBHIEUgICBDIFIgTyBQIFAgSSBOIEcKICAqLwotCiBzdHJ1Y3QgdjRsMl9jcm9wY2FwIHsKIAllbnVtIHY0bDJfYnVmX3R5cGUgICAgICB0eXBlOwogCXN0cnVjdCB2NGwyX3JlY3QgICAgICAgIGJvdW5kczsKQEAgLTcxMCw3ICs2NDEsNiBAQAogCV9fdTMyCQkgICAgIHJlc2VydmVkWzRdOwogfTsKIAotCiAvKgogICoJViBJIEQgRSBPICAgSSBOIFAgVSBUIFMKICAqLwpAQCAtNzI1LDYgKzY1NSw3IEBACiAJX191MzIJICAgICBzdGF0dXM7CiAJX191MzIJICAgICByZXNlcnZlZFs0XTsKIH07CisKIC8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KICNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX1RVTkVSCQkxCiAjZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9DQU1FUkEJCTIKQEAgLTc3NSw2ICs3MDYsMzQgQEAKIAlfX3MzMgkJICAgICB2YWx1ZTsKIH07CiAKK3N0cnVjdCB2NGwyX2V4dF9jb250cm9sCit7CisJX191MzIgaWQ7CisJX191MzIgcmVzZXJ2ZWQyWzJdOworCXVuaW9uIHsKKwkJX19zMzIgdmFsdWU7CisJCV9fczY0IHZhbHVlNjQ7CisJCXZvaWQgKnJlc2VydmVkOworCX07Cit9OworCitzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMKK3sKKwlfX3UzMiBjdHJsX2NsYXNzOworCV9fdTMyIGNvdW50OworCV9fdTMyIGVycm9yX2lkeDsKKwlfX3UzMiByZXNlcnZlZFsyXTsKKwlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqY29udHJvbHM7Cit9OworCisvKiAgVmFsdWVzIGZvciBjdHJsX2NsYXNzIGZpZWxkICovCisjZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19VU0VSIDB4MDA5ODAwMDAJLyogT2xkLXN0eWxlICd1c2VyJyBjb250cm9scyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRyAweDAwOTkwMDAwCS8qIE1QRUctY29tcHJlc3Npb24gY29udHJvbHMgKi8KKworI2RlZmluZSBWNEwyX0NUUkxfSURfTUFTSyAgICAgIAkgICgweDBmZmZmZmZmKQorI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQorI2RlZmluZSBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoaWQpICgoKGlkKSAmIDB4ZmZmZikgPj0gMHgxMDAwKQorCiAvKiAgVXNlZCBpbiB0aGUgVklESU9DX1FVRVJZQ1RSTCBpb2N0bCBmb3IgcXVlcnlpbmcgY29udHJvbHMgKi8KIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybAogewpAQCAtODAxLDEyICs3NjAsMjEgQEAKIC8qICBDb250cm9sIGZsYWdzICAqLwogI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ESVNBQkxFRAkJMHgwMDAxCiAjZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQJCTB4MDAwMgorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkgCTB4MDAwNAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgCQkweDAwMDgKKyNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgCTB4MDAxMAorI2RlZmluZSBWNEwyX0NUUkxfRkxBR19TTElERVIgCQkweDAwMjAKIAotLyogIENvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwotI2RlZmluZSBWNEwyX0NJRF9CQVNFCQkJMHgwMDk4MDkwMAorLyogIFF1ZXJ5IGZsYWcsIHRvIGJlIE9SZWQgd2l0aCB0aGUgY29udHJvbCBJRCAqLworI2RlZmluZSBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwJMHg4MDAwMDAwMAorCisvKiAgVXNlci1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KKyNkZWZpbmUgVjRMMl9DSURfQkFTRQkJCShWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JBU0UgCQlWNEwyX0NJRF9CQVNFCiAvKiAgSURzIHJlc2VydmVkIGZvciBkcml2ZXIgc3BlY2lmaWMgY29udHJvbHMgKi8KICNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9CQVNFCQkweDA4MDAwMDAwCiAKKyNkZWZpbmUgVjRMMl9DSURfVVNFUl9DTEFTUyAJCShWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDEpCiAjZGVmaW5lIFY0TDJfQ0lEX0JSSUdIVE5FU1MJCShWNEwyX0NJRF9CQVNFKzApCiAjZGVmaW5lIFY0TDJfQ0lEX0NPTlRSQVNUCQkoVjRMMl9DSURfQkFTRSsxKQogI2RlZmluZSBWNEwyX0NJRF9TQVRVUkFUSU9OCQkoVjRMMl9DSURfQkFTRSsyKQpAQCAtODMzLDYgKzgwMSwxODMgQEAKICNkZWZpbmUgVjRMMl9DSURfVkNFTlRFUgkJKFY0TDJfQ0lEX0JBU0UrMjMpCiAjZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMQkJCShWNEwyX0NJRF9CQVNFKzI0KSAvKiBsYXN0IENJRCArIDEgKi8KIAorLyogIE1QRUctY2xhc3MgY29udHJvbCBJRHMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQkFTRSAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDkwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DTEFTUyAJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAxKQorCisvKiAgTVBFRyBzdHJlYW1zICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1RZUEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzApCitlbnVtIHY0bDJfbXBlZ19zdHJlYW1fdHlwZSB7CisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX1BTICAgPSAwLCAvKiBNUEVHLTIgcHJvZ3JhbSBzdHJlYW0gKi8KKwlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfVFMgICA9IDEsIC8qIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtICovCisJVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcxX1NTICAgPSAyLCAvKiBNUEVHLTEgc3lzdGVtIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9EVkQgID0gMywgLyogTVBFRy0yIERWRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9WQ0QgID0gNCwgLyogTVBFRy0xIFZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLworCVY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMl9TVkNEID0gNSwgLyogTVBFRy0yIFNWQ0QtY29tcGF0aWJsZSBzdHJlYW0gKi8KK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9QTVQgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfU1RSRUFNX1BJRF9BVURJTyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUElEX1ZJREVPIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU8gCShWNEwyX0NJRF9NUEVHX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fUEVTX0lEX1ZJREVPIAkoVjRMMl9DSURfTVBFR19CQVNFKzYpCisKKy8qICBNUEVHIGF1ZGlvICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDApCitlbnVtIHY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxIHsKKwlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCA9IDAsCisJVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfNDgwMDAgPSAxLAorCVY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzMyMDAwID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwMSkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nIHsKKwlWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzIgPSAxLAorCVY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8zID0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTAyKQorZW51bSB2NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZSB7CisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzJLICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNjRLICA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfOTZLICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTI4SyA9IDMsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTYwSyA9IDQsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTkySyA9IDUsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjI0SyA9IDYsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjU2SyA9IDcsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjg4SyA9IDgsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzIwSyA9IDksCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMzUySyA9IDEwLAorCVY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM4NEsgPSAxMSwKKwlWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80MTZLID0gMTIsCisJVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDQ4SyA9IDEzLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MMl9CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDMpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19sMl9iaXRyYXRlIHsKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMksgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV80OEsgID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV81NksgID0gMiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV82NEsgID0gMywKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV84MEsgID0gNCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV85NksgID0gNSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMTJLID0gNiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMjhLID0gNywKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xNjBLID0gOCwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xOTJLID0gOSwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yMjRLID0gMTAsCisJVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjU2SyA9IDExLAorCVY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMyMEsgPSAxMiwKKwlWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zODRLID0gMTMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wzX0JJVFJBVEUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzEwNCkKK2VudW0gdjRsMl9tcGVnX2F1ZGlvX2wzX2JpdHJhdGUgeworCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMySyAgPSAwLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQwSyAgPSAxLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQ4SyAgPSAyLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzU2SyAgPSAzLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzY0SyAgPSA0LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzgwSyAgPSA1LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzk2SyAgPSA2LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzExMksgPSA3LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzEyOEsgPSA4LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE2MEsgPSA5LAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MksgPSAxMCwKKwlWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yMjRLID0gMTEsCisJVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjU2SyA9IDEyLAorCVY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMyMEsgPSAxMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA1KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbW9kZSB7CisJVjRMMl9NUEVHX0FVRElPX01PREVfU1RFUkVPICAgICAgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9KT0lOVF9TVEVSRU8gPSAxLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0RVQUwgICAgICAgICA9IDIsCisJVjRMMl9NUEVHX0FVRElPX01PREVfTU9OTyAgICAgICAgID0gMywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT04gCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA2KQorZW51bSB2NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb24geworCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80ICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OX0JPVU5EXzggID0gMSwKKwlWNEwyX01QRUdfQVVESU9fTU9ERV9FWFRFTlNJT05fQk9VTkRfMTIgPSAyLAorCVY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xNiA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDcpCitlbnVtIHY0bDJfbXBlZ19hdWRpb19lbXBoYXNpcyB7CisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX05PTkUgICAgICAgICA9IDAsCisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTXzUwX0RJVl8xNV91UyA9IDEsCisJVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX0NDSVRUX0oxNyAgICA9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQyAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMTA4KQorZW51bSB2NGwyX21wZWdfYXVkaW9fY3JjIHsKKwlWNEwyX01QRUdfQVVESU9fQ1JDX05PTkUgID0gMCwKKwlWNEwyX01QRUdfQVVESU9fQ1JDX0NSQzE2ID0gMSwKK307CisKKy8qICBNUEVHIHZpZGVvICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkcgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMCkKK2VudW0gdjRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nIHsKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xID0gMCwKKwlWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18yID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQVNQRUNUIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDEpCitlbnVtIHY0bDJfbXBlZ192aWRlb19hc3BlY3QgeworCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxICAgICA9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0FTUEVDVF80eDMgICAgID0gMSwKKwlWNEwyX01QRUdfVklERU9fQVNQRUNUXzE2eDkgICAgPSAyLAorCVY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCA9IDMsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUgCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwMykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fUFVMTERPV04gCQkoVjRMMl9DSURfTVBFR19CQVNFKzIwNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX01PREUgCShWNEwyX0NJRF9NUEVHX0JBU0UrMjA2KQorZW51bSB2NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiA9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0JJVFJBVEVfTU9ERV9DQlIgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDcpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9QRUFLIAkoVjRMMl9DSURfTVBFR19CQVNFKzIwOCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19URU1QT1JBTF9ERUNJTUFUSU9OIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA5KQorCisvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyNTg0eCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFIAkJCQkoVjRMMl9DVFJMX0NMQVNTX01QRUcgfCAweDEwMDApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUl9NT0RFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMCkKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9NQU5VQUwgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfQVVUTyAgID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19TUEFUSUFMX0ZJTFRFUiAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMikKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlIHsKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGICAgICAgICAgICAgICAgICAgPSAwLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IgICAgICAgICAgICAgICA9IDEsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX1ZFUlQgICAgICAgICAgICAgID0gMiwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX1NQQVRJQUxfRklMVEVSX1RZUEVfMkRfSFZfU0VQQVJBQkxFICAgICAgPSAzLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRV8yRF9TWU1fTk9OX1NFUEFSQUJMRSA9IDQsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEUgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSszKQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZSB7CisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX1NQQVRJQUxfRklMVEVSX1RZUEVfT0ZGICAgID0gMCwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IgPSAxLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNCkKK2VudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSX01PREVfQVVUTyAgID0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19URU1QT1JBTF9GSUxURVIgCQkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRSAJCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs2KQorZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19tZWRpYW5fZmlsdGVyX3R5cGUgeworCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9PRkYgICAgICA9IDAsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0hPUiAgICAgID0gMSwKKwlWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfVkVSVCAgICAgPSAyLAorCVY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX01FRElBTl9GSUxURVJfVFlQRV9IT1JfVkVSVCA9IDMsCisJVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFX0RJQUcgICAgID0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19MVU1BX01FRElBTl9GSUxURVJfQk9UVE9NIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9UT1AgCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs4KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfQk9UVE9NCShWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTApCisKIC8qCiAgKglUIFUgTiBJIE4gRwogICovCkBAIC05MDQsNiArMTA0OSw3IEBACiAJX191MzIJbW9kZTsKIAlfX3UzMglyZXNlcnZlZFsyXTsKIH07CisKIC8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLwogI2RlZmluZSBWNEwyX0FVRENBUF9TVEVSRU8JCTB4MDAwMDEKICNkZWZpbmUgVjRMMl9BVURDQVBfQVZMCQkJMHgwMDAwMgpAQCAtOTI3LDcgKzEwNzMsNiBAQAogICovCiAKIC8qIFJhdyBWQkkgKi8KLQogc3RydWN0IHY0bDJfdmJpX2Zvcm1hdAogewogCV9fdTMyCXNhbXBsaW5nX3JhdGU7CQkvKiBpbiAxIEh6ICovCkBAIC0xMDM0LDggKzExNzksNiBAQAogCX0gcGFybTsKIH07CiAKLQotCiAvKgogICoJSSBPIEMgVCBMICAgQyBPIEQgRSBTICAgRiBPIFIgICBWIEkgRCBFIE8gICBEIEUgViBJIEMgRSBTCiAgKgpAQCAtMTA0NSw4ICsxMTg4LDEwIEBACiAjZGVmaW5lIFZJRElPQ19FTlVNX0ZNVCAgICAgICAgIF9JT1dSICgnVicsICAyLCBzdHJ1Y3QgdjRsMl9mbXRkZXNjKQogI2RlZmluZSBWSURJT0NfR19GTVQJCV9JT1dSICgnVicsICA0LCBzdHJ1Y3QgdjRsMl9mb3JtYXQpCiAjZGVmaW5lIFZJRElPQ19TX0ZNVAkJX0lPV1IgKCdWJywgIDUsIHN0cnVjdCB2NGwyX2Zvcm1hdCkKKyNpZmRlZiBfX0tFUk5FTF9fCiAjZGVmaW5lIFZJRElPQ19HX01QRUdDT01QICAgICAgIF9JT1IgICgnVicsICA2LCBzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uKQogI2RlZmluZSBWSURJT0NfU19NUEVHQ09NUCAgICAgCV9JT1cgICgnVicsICA3LCBzdHJ1Y3QgdjRsMl9tcGVnX2NvbXByZXNzaW9uKQorI2VuZGlmCiAjZGVmaW5lIFZJRElPQ19SRVFCVUZTCQlfSU9XUiAoJ1YnLCAgOCwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMpCiAjZGVmaW5lIFZJRElPQ19RVUVSWUJVRgkJX0lPV1IgKCdWJywgIDksIHN0cnVjdCB2NGwyX2J1ZmZlcikKICNkZWZpbmUgVklESU9DX0dfRkJVRgkJX0lPUiAgKCdWJywgMTAsIHN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyKQpAQCAtMTA5Niw3ICsxMjQxLDExIEBACiAjZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1IgICgnVicsIDY5LCBzdHJ1Y3QgdjRsMl9zbGljZWRfdmJpX2NhcCkKICNlbmRpZgogI2RlZmluZSBWSURJT0NfTE9HX1NUQVRVUyAgICAgICBfSU8gICAoJ1YnLCA3MCkKKyNkZWZpbmUgVklESU9DX0dfRVhUX0NUUkxTCV9JT1dSICgnVicsIDcxLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMpCisjZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUwlfSU9XUiAoJ1YnLCA3Miwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQorI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUwlfSU9XUiAoJ1YnLCA3Mywgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzKQogCisjaWZkZWYgX19PTERfVklESU9DXwogLyogZm9yIGNvbXBhdGliaWxpdHksIHdpbGwgZ28gYXdheSBzb21lIGRheSAqLwogI2RlZmluZSBWSURJT0NfT1ZFUkxBWV9PTEQgICAgIAlfSU9XUiAoJ1YnLCAxNCwgaW50KQogI2RlZmluZSBWSURJT0NfU19QQVJNX09MRCAgICAgIAlfSU9XICAoJ1YnLCAyMiwgc3RydWN0IHY0bDJfc3RyZWFtcGFybSkKQEAgLTExMDQsNTcgKzEyNTMsMTAgQEAKICNkZWZpbmUgVklESU9DX0dfQVVESU9fT0xEICAgICAJX0lPV1IgKCdWJywgMzMsIHN0cnVjdCB2NGwyX2F1ZGlvKQogI2RlZmluZSBWSURJT0NfR19BVURPVVRfT0xEICAgIAlfSU9XUiAoJ1YnLCA0OSwgc3RydWN0IHY0bDJfYXVkaW9vdXQpCiAjZGVmaW5lIFZJRElPQ19DUk9QQ0FQX09MRCAgICAgCV9JT1IgICgnVicsIDU4LCBzdHJ1Y3QgdjRsMl9jcm9wY2FwKQorI2VuZGlmCiAKICNkZWZpbmUgQkFTRV9WSURJT0NfUFJJVkFURQkxOTIJCS8qIDE5Mi0yNTUgYXJlIHByaXZhdGUgKi8KIAotCi0jaWZkZWYgX19LRVJORUxfXwotLyoKLSAqCi0gKglWIDQgTCAyICAgRCBSIEkgViBFIFIgICBIIEUgTCBQIEUgUiAgIEEgUCBJCi0gKgotICoJU29tZSBjb21tb25seSBuZWVkZWQgZnVuY3Rpb25zIGZvciBkcml2ZXJzICh2NGwyLWNvbW1vbi5vIG1vZHVsZSkKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0KLS8qICBWaWRlbyBzdGFuZGFyZCBmdW5jdGlvbnMgICovCi1leHRlcm4gdW5zaWduZWQgaW50IHY0bDJfdmlkZW9fc3RkX2ZwcyhzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMpOwotZXh0ZXJuIGludCB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzLAotCQkJCSAgICBpbnQgaWQsIGNoYXIgKm5hbWUpOwotCi0vKiBwcm9yaXR5IGhhbmRsaW5nICovCi1zdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHsKLQlhdG9taWNfdCBwcmlvc1s0XTsKLX07Ci1pbnQgdjRsMl9wcmlvX2luaXQoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKTsKLWludCB2NGwyX3ByaW9fY2hhbmdlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCwKLQkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgbmV3KTsKLWludCB2NGwyX3ByaW9fb3BlbihzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpOwotaW50IHY0bDJfcHJpb19jbG9zZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpOwotZW51bSB2NGwyX3ByaW9yaXR5IHY0bDJfcHJpb19tYXgoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKTsKLWludCB2NGwyX3ByaW9fY2hlY2soc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKTsKLQotLyogbmFtZXMgZm9yIGZhbmN5IGRlYnVnIG91dHB1dCAqLwotZXh0ZXJuIGNoYXIgKnY0bDJfZmllbGRfbmFtZXNbXTsKLWV4dGVybiBjaGFyICp2NGwyX3R5cGVfbmFtZXNbXTsKLQotLyogIENvbXBhdGliaWxpdHkgbGF5ZXIgaW50ZXJmYWNlICAtLSAgdjRsMS1jb21wYXQgbW9kdWxlICovCi10eXBlZGVmIGludCAoKnY0bDJfa2lvY3RsKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7Ci0KLSNpZmRlZiBDT05GSUdfVklERU9fVjRMMV9DT01QQVQKLWludCB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCSAgICAgICBpbnQgY21kLCB2b2lkICphcmcsIHY0bDJfa2lvY3RsIGRyaXZlcl9pb2N0bCk7Ci0jZWxzZQotI2RlZmluZSB2NGxfY29tcGF0X3RyYW5zbGF0ZV9pb2N0bChpbm9kZSxmaWxlLGNtZCxhcmcsaW9jdGwpIC1FSU5WQUwKLSNlbmRpZgotCi0vKiAzMiBCaXRzIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIDY0IGJpdHMgcHJvY2Vzc29ycyAqLwotZXh0ZXJuIGxvbmcgdjRsX2NvbXBhdF9pb2N0bDMyKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKLQotCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fTElOVVhfVklERU9ERVYyX0ggKi8KIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1hbGxvYy5oIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKaW5kZXggMWQ1NTc3Yi4uZjYwMjRhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKQEAgLTQsMTAgKzQsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBwZ3Byb3RfdCAqLwogCitzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CisKIC8qIGJpdHMgaW4gdm1fc3RydWN0LT5mbGFncyAqLwogI2RlZmluZSBWTV9JT1JFTUFQCTB4MDAwMDAwMDEJLyogaW9yZW1hcCgpIGFuZCBmcmllbmRzICovCiAjZGVmaW5lIFZNX0FMTE9DCTB4MDAwMDAwMDIJLyogdm1hbGxvYygpICovCiAjZGVmaW5lIFZNX01BUAkJMHgwMDAwMDAwNAkvKiB2bWFwKCllZCBwYWdlcyAqLworI2RlZmluZSBWTV9VU0VSTUFQCTB4MDAwMDAwMDgJLyogc3VpdGFibGUgZm9yIHJlbWFwX3ZtYWxsb2NfcmFuZ2UgKi8KIC8qIGJpdHMgWzIwLi4zMl0gcmVzZXJ2ZWQgZm9yIGFyY2ggc3BlY2lmaWMgaW9yZW1hcCBpbnRlcm5hbHMgKi8KIAogLyoKQEAgLTMyLDkgKzM1LDExIEBACiAgKglIaWdobGV2ZWwgQVBJcyBmb3IgZHJpdmVyIHVzZQogICovCiBleHRlcm4gdm9pZCAqdm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgKnZtYWxsb2NfdXNlcih1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgKnZtYWxsb2Nfbm9kZSh1bnNpZ25lZCBsb25nIHNpemUsIGludCBub2RlKTsKIGV4dGVybiB2b2lkICp2bWFsbG9jX2V4ZWModW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkICp2bWFsbG9jXzMyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CitleHRlcm4gdm9pZCAqdm1hbGxvY18zMl91c2VyKHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiBleHRlcm4gdm9pZCAqX192bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2ssIHBncHJvdF90IHByb3QpOwogZXh0ZXJuIHZvaWQgKl9fdm1hbGxvY19hcmVhKHN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWEsIGdmcF90IGdmcF9tYXNrLAogCQkJCXBncHJvdF90IHByb3QpOwpAQCAtNDUsNiArNTAsOSBAQAogZXh0ZXJuIHZvaWQgKnZtYXAoc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IGNvdW50LAogCQkJdW5zaWduZWQgbG9uZyBmbGFncywgcGdwcm90X3QgcHJvdCk7CiBleHRlcm4gdm9pZCB2dW5tYXAodm9pZCAqYWRkcik7CisKK2V4dGVybiBpbnQgcmVtYXBfdm1hbGxvY19yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdm9pZCAqYWRkciwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIHBnb2ZmKTsKICAKIC8qCiAgKglMb3dsZXZlbC1BUElzIChub3QgZm9yIGRyaXZlciB1c2UhKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaCBiL2luY2x1ZGUvbGludXgvd3JpdGViYWNrLmgKaW5kZXggNTZmOTJmYy4uOWUzOGI1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC01MCwxNCArNTAsMTUgQEAKIAkgKiBhIGhpbnQgdGhhdCB0aGUgZmlsZXN5c3RlbSBuZWVkIG9ubHkgd3JpdGUgb3V0IHRoZSBwYWdlcyBpbnNpZGUgdGhhdAogCSAqIGJ5dGVyYW5nZS4gIFRoZSBieXRlIGF0IGBlbmQnIGlzIGluY2x1ZGVkIGluIHRoZSB3cml0ZW91dCByZXF1ZXN0LgogCSAqLwotCWxvZmZfdCBzdGFydDsKLQlsb2ZmX3QgZW5kOworCWxvZmZfdCByYW5nZV9zdGFydDsKKwlsb2ZmX3QgcmFuZ2VfZW5kOwogCiAJdW5zaWduZWQgbm9uYmxvY2tpbmc6MTsJCS8qIERvbid0IGdldCBzdHVjayBvbiByZXF1ZXN0IHF1ZXVlcyAqLwogCXVuc2lnbmVkIGVuY291bnRlcmVkX2Nvbmdlc3Rpb246MTsgLyogQW4gb3V0cHV0OiBhIHF1ZXVlIGlzIGZ1bGwgKi8KIAl1bnNpZ25lZCBmb3Jfa3VwZGF0ZToxOwkJLyogQSBrdXBkYXRlIHdyaXRlYmFjayAqLwogCXVuc2lnbmVkIGZvcl9yZWNsYWltOjE7CQkvKiBJbnZva2VkIGZyb20gdGhlIHBhZ2UgYWxsb2NhdG9yICovCiAJdW5zaWduZWQgZm9yX3dyaXRlcGFnZXM6MTsJLyogVGhpcyBpcyBhIHdyaXRlcGFnZXMoKSBjYWxsICovCisJdW5zaWduZWQgcmFuZ2VfY3ljbGljOjE7CS8qIHJhbmdlX3N0YXJ0IGlzIGN5Y2xpYyAqLwogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvemNvbmYuaCBiL2luY2x1ZGUvbGludXgvemNvbmYuaAppbmRleCBmMWNmZDY2Li4wYmViNzVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3pjb25mLmgKKysrIGIvaW5jbHVkZS9saW51eC96Y29uZi5oCkBAIC0zNSw2ICszNSwxOCBAQAogIyAgZGVmaW5lIE1BWF9XQklUUyAgIDE1IC8qIDMySyBMWjc3IHdpbmRvdyAqLwogI2VuZGlmCiAKKy8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCisjaWZuZGVmIERFRl9XQklUUworIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKKyNlbmRpZgorCisvKiBkZWZhdWx0IG1lbUxldmVsICovCisjaWYgTUFYX01FTV9MRVZFTCA+PSA4CisjICBkZWZpbmUgREVGX01FTV9MRVZFTCA4CisjZWxzZQorIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgIE1BWF9NRU1fTEVWRUwKKyNlbmRpZgorCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUeXBlIGRlY2xhcmF0aW9ucyAqLwogCiB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgIEJ5dGU7ICAvKiA4IGJpdHMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvemxpYi5oIGIvaW5jbHVkZS9saW51eC96bGliLmgKaW5kZXggNGZhMzJmMC4uOWUzMTkyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC96bGliLmgKKysrIGIvaW5jbHVkZS9saW51eC96bGliLmgKQEAgLTEsNyArMSw2IEBACiAvKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgdmVyc2lvbiAxLjEuMywgSnVseSA5dGgsIDE5OTgKIAotICBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyCisgIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKIAogICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCkBAIC0yNCw3ICsyMyw3IEBACiAKIAogICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgotICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTAudHh0CisgIENvbW1lbnRzKSAxOTUwIHRvIDE5NTIgaW4gdGhlIGZpbGVzIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE5NTAudHh0CiAgICh6bGliIGZvcm1hdCksIHJmYzE5NTEudHh0IChkZWZsYXRlIGZvcm1hdCkgYW5kIHJmYzE5NTIudHh0IChnemlwIGZvcm1hdCkuCiAqLwogCkBAIC0zMyw3ICszMiwyMiBAQAogCiAjaW5jbHVkZSA8bGludXgvemNvbmYuaD4KIAotI2RlZmluZSBaTElCX1ZFUlNJT04gIjEuMS4zIgorLyogemxpYiBkZWZsYXRlIGJhc2VkIG9uIFpMSUJfVkVSU0lPTiAiMS4xLjMiICovCisvKiB6bGliIGluZmxhdGUgYmFzZWQgb24gWkxJQl9WRVJTSU9OICIxLjIuMyIgKi8KKworLyoKKyAgVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgemxpYiBmb3IgdXNlIGluc2lkZSB0aGUgTGludXgga2VybmVsLgorICBUaGUgbWFpbiBjaGFuZ2VzIGFyZSB0byBwZXJmb3JtIGFsbCBtZW1vcnkgYWxsb2NhdGlvbiBpbiBhZHZhbmNlLgorCisgIEluZmxhdGlvbiBDaGFuZ2VzOgorICAgICogWl9QQUNLRVRfRkxVU0ggaXMgYWRkZWQgYW5kIHVzZWQgYnkgcHBwX2RlZmxhdGUuIEJlZm9yZSByZXR1cm5pbmcKKyAgICAgIHRoaXMgY2hlY2tzIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBhdmFpbGFibGUgYW5kIHRoZSBuZXh0IGRhdGEKKyAgICAgIGlzIGEgU1RPUkVEIGJsb2NrLiBJdCBhbHNvIHJlc2V0cyB0aGUgbW9kZSB0byBiZSByZWFkIGZvciB0aGUgbmV4dAorICAgICAgZGF0YSwgYWxsIGFzIHBlciBQUFAgcmVxdWlyZW1lbnRzLgorICAgICogQWRkaXRpb24gb2YgemxpYl9pbmZsYXRlSW5jb21wIHdoaWNoIGNvcGllcyBpbmNvbXByZXNzaWJsZSBkYXRhIGludG8KKyAgICAgIHRoZSBoaXN0b3J5IHdpbmRvdyBhbmQgYWRqdXN0cyB0aGUgYWNjb3V0bmluZyB3aXRob3V0IGNhbGxpbmcKKyAgICAgIHpsaWJfaW5mbGF0ZSBpdHNlbGYgdG8gaW5mbGF0ZSB0aGUgZGF0YS4KKyovCiAKIC8qIAogICAgICBUaGUgJ3psaWInIGNvbXByZXNzaW9uIGxpYnJhcnkgcHJvdmlkZXMgaW4tbWVtb3J5IGNvbXByZXNzaW9uIGFuZApAQCAtNDgsOSArNjIsMTggQEAKICAgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAogICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgogCisgICAgIFRoZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0IHVzZWQgYnkgZGVmYXVsdCBieSB0aGUgaW4tbWVtb3J5IGZ1bmN0aW9ucyBpcworICB0aGUgemxpYiBmb3JtYXQsIHdoaWNoIGlzIGEgemxpYiB3cmFwcGVyIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTAsIHdyYXBwZWQKKyAgYXJvdW5kIGEgZGVmbGF0ZSBzdHJlYW0sIHdoaWNoIGlzIGl0c2VsZiBkb2N1bWVudGVkIGluIFJGQyAxOTUxLgorCiAgICAgIFRoZSBsaWJyYXJ5IGFsc28gc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdAogICB3aXRoIGFuIGludGVyZmFjZSBzaW1pbGFyIHRvIHRoYXQgb2Ygc3RkaW8uCiAKKyAgICAgVGhlIHpsaWIgZm9ybWF0IHdhcyBkZXNpZ25lZCB0byBiZSBjb21wYWN0IGFuZCBmYXN0IGZvciB1c2UgaW4gbWVtb3J5CisgIGFuZCBvbiBjb21tdW5pY2F0aW9ucyBjaGFubmVscy4gIFRoZSBnemlwIGZvcm1hdCB3YXMgZGVzaWduZWQgZm9yIHNpbmdsZS0KKyAgZmlsZSBjb21wcmVzc2lvbiBvbiBmaWxlIHN5c3RlbXMsIGhhcyBhIGxhcmdlciBoZWFkZXIgdGhhbiB6bGliIHRvIG1haW50YWluCisgIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiwgYW5kIHVzZXMgYSBkaWZmZXJlbnQsIHNsb3dlciBjaGVjayBtZXRob2QgdGhhbiB6bGliLgorCiAgICAgIFRoZSBsaWJyYXJ5IGRvZXMgbm90IGluc3RhbGwgYW55IHNpZ25hbCBoYW5kbGVyLiBUaGUgZGVjb2RlciBjaGVja3MKICAgdGhlIGNvbnNpc3RlbmN5IG9mIHRoZSBjb21wcmVzc2VkIGRhdGEsIHNvIHRoZSBsaWJyYXJ5IHNob3VsZCBuZXZlcgogICBjcmFzaCBldmVuIGluIGNhc2Ugb2YgY29ycnVwdGVkIGlucHV0LgpAQCAtMTE5LDcgKzE0Miw4IEBACiAjZGVmaW5lIFpfU1lOQ19GTFVTSCAgICAzCiAjZGVmaW5lIFpfRlVMTF9GTFVTSCAgICA0CiAjZGVmaW5lIFpfRklOSVNIICAgICAgICA1Ci0vKiBBbGxvd2VkIGZsdXNoIHZhbHVlczsgc2VlIGRlZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqLworI2RlZmluZSBaX0JMT0NLICAgICAgICAgNiAvKiBPbmx5IGZvciBpbmZsYXRlIGF0IHByZXNlbnQgKi8KKy8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KIAogI2RlZmluZSBaX09LICAgICAgICAgICAgMAogI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQpAQCAtMTU1LDEzICsxNzksNiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiYXNpYyBmdW5jdGlvbnMgKi8KIAotZXh0ZXJuIGNvbnN0IGNoYXIgKiB6bGliX3psaWJWZXJzaW9uICh2b2lkKTsKLS8qIFRoZSBhcHBsaWNhdGlvbiBjYW4gY29tcGFyZSB6bGliVmVyc2lvbiBhbmQgWkxJQl9WRVJTSU9OIGZvciBjb25zaXN0ZW5jeS4KLSAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZGlmZmVycywgdGhlIGxpYnJhcnkgY29kZSBhY3R1YWxseSB1c2VkIGlzCi0gICBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSB6bGliLmggaGVhZGVyIGZpbGUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCi0gICBUaGlzIGNoZWNrIGlzIGF1dG9tYXRpY2FsbHkgbWFkZSBieSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQuCi0gKi8KLQogZXh0ZXJuIGludCB6bGliX2RlZmxhdGVfd29ya3NwYWNlc2l6ZSAodm9pZCk7CiAvKgogICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIGZvciBhIHBlci0KQEAgLTMxNSw5ICszMzIsOSBAQAogZXh0ZXJuIGludCB6bGliX2luZmxhdGUgKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpOwogLyoKICAgICBpbmZsYXRlIGRlY29tcHJlc3NlcyBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUsIGFuZCBzdG9wcyB3aGVuIHRoZSBpbnB1dAotICBidWZmZXIgYmVjb21lcyBlbXB0eSBvciB0aGUgb3V0cHV0IGJ1ZmZlciBiZWNvbWVzIGZ1bGwuIEl0IG1heSBzb21lCi0gIGludHJvZHVjZSBzb21lIG91dHB1dCBsYXRlbmN5IChyZWFkaW5nIGlucHV0IHdpdGhvdXQgcHJvZHVjaW5nIGFueSBvdXRwdXQpCi0gIGV4Y2VwdCB3aGVuIGZvcmNlZCB0byBmbHVzaC4KKyAgYnVmZmVyIGJlY29tZXMgZW1wdHkgb3IgdGhlIG91dHB1dCBidWZmZXIgYmVjb21lcyBmdWxsLiBJdCBtYXkgaW50cm9kdWNlCisgIHNvbWUgb3V0cHV0IGxhdGVuY3kgKHJlYWRpbmcgaW5wdXQgd2l0aG91dCBwcm9kdWNpbmcgYW55IG91dHB1dCkgZXhjZXB0IHdoZW4KKyAgZm9yY2VkIHRvIGZsdXNoLgogCiAgIFRoZSBkZXRhaWxlZCBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3MuIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCiAgIGZvbGxvd2luZyBhY3Rpb25zOgpAQCAtMzQxLDExICszNTgsMjYgQEAKICAgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZQogICBtaWdodCBiZSBtb3JlIG91dHB1dCBwZW5kaW5nLgogCi0gICAgSWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBzZXQgdG8gWl9TWU5DX0ZMVVNILCBpbmZsYXRlIGZsdXNoZXMgYXMgbXVjaAotICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFRoZSBmbHVzaGluZyBiZWhhdmlvciBvZiBpbmZsYXRlIGlzCi0gIG5vdCBzcGVjaWZpZWQgZm9yIHZhbHVlcyBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIG90aGVyIHRoYW4gWl9TWU5DX0ZMVVNICi0gIGFuZCBaX0ZJTklTSCwgYnV0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IGZsdXNoZXMgYXMgbXVjaCBvdXRwdXQKLSAgYXMgcG9zc2libGUgYW55d2F5LgorICAgIFRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIGNhbiBiZSBaX05PX0ZMVVNILCBaX1NZTkNfRkxVU0gsCisgIFpfRklOSVNILCBvciBaX0JMT0NLLiBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAorICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuIFpfQkxPQ0sgcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgc3RvcAorICBpZiBhbmQgd2hlbiBpdCBnZXRzIHRvIHRoZSBuZXh0IGRlZmxhdGUgYmxvY2sgYm91bmRhcnkuIFdoZW4gZGVjb2RpbmcgdGhlCisgIHpsaWIgb3IgZ3ppcCBmb3JtYXQsIHRoaXMgd2lsbCBjYXVzZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyCisgIHRoZSBoZWFkZXIgYW5kIGJlZm9yZSB0aGUgZmlyc3QgYmxvY2suIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwgaW5mbGF0ZSgpCisgIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdCBnZXRzIHRvCisgIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgorCisgICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCisgIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQKKyAgaWYgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sCisgIHBsdXMgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sKKyAgY29kZSBvciBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZQorICBkZWZsYXRlIHN0cmVhbS4gVGhlIGVuZC1vZi1ibG9jayB3aWxsIG5vdCBiZSBpbmRpY2F0ZWQgdW50aWwgYWxsIG9mIHRoZQorICB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIHRoYXQgYmxvY2sgaGFzIGJlZW4gd3JpdHRlbiB0byBzdHJtLT5uZXh0X291dC4gIFRoZQorICBudW1iZXIgb2YgdW51c2VkIGJpdHMgbWF5IGluIGdlbmVyYWwgYmUgZ3JlYXRlciB0aGFuIHNldmVuLCBleGNlcHQgd2hlbgorICBiaXQgNyBvZiBkYXRhX3R5cGUgaXMgc2V0LCBpbiB3aGljaCBjYXNlIHRoZSBudW1iZXIgb2YgdW51c2VkIGJpdHMgd2lsbCBiZQorICBsZXNzIHRoYW4gZWlnaHQuCiAKICAgICBpbmZsYXRlKCkgc2hvdWxkIG5vcm1hbGx5IGJlIGNhbGxlZCB1bnRpbCBpdCByZXR1cm5zIFpfU1RSRUFNX0VORCBvciBhbgogICBlcnJvci4gSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcApAQCAtMzU1LDI5ICszODcsNDQgQEAKICAgdW5jb21wcmVzc2VkIGRhdGEuIChUaGUgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgbWF5IGhhdmUgYmVlbiBzYXZlZAogICBieSB0aGUgY29tcHJlc3NvciBmb3IgdGhpcyBwdXJwb3NlLikgVGhlIG5leHQgb3BlcmF0aW9uIG9uIHRoaXMgc3RyZWFtIG11c3QKICAgYmUgaW5mbGF0ZUVuZCB0byBkZWFsbG9jYXRlIHRoZSBkZWNvbXByZXNzaW9uIHN0YXRlLiBUaGUgdXNlIG9mIFpfRklOSVNICi0gIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciByb3V0aW5lCisgIGlzIG5ldmVyIHJlcXVpcmVkLCBidXQgY2FuIGJlIHVzZWQgdG8gaW5mb3JtIGluZmxhdGUgdGhhdCBhIGZhc3RlciBhcHByb2FjaAogICBtYXkgYmUgdXNlZCBmb3IgdGhlIHNpbmdsZSBpbmZsYXRlKCkgY2FsbC4KIAotICAgICBJZiBhIHByZXNldCBkaWN0aW9uYXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHBvaW50IChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKLSAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS1hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiB0aGUKLSAgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSAKLSAgaXQgc2V0cyBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkCi0gIHNvIGZhciAodGhhdCBpcywgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IKLSAgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpCi0gIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlCi0gIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5EIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisgICAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIGluZmxhdGUoKSBhbHdheXMgZmx1c2hlcyBhcyBtdWNoIG91dHB1dCBhcworICBwb3NzaWJsZSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgYW5kIGFsd2F5cyB1c2VzIHRoZSBmYXN0ZXIgYXBwcm9hY2ggb24gdGhlCisgIGZpcnN0IGNhbGwuIFNvIHRoZSBvbmx5IGVmZmVjdCBvZiB0aGUgZmx1c2ggcGFyYW1ldGVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgaXMgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCksIGFzIG5vdGVkIGJlbG93LCBvciB3aGVuIGl0IHJldHVybnMgZWFybHkKKyAgYmVjYXVzZSBaX0JMT0NLIGlzIHVzZWQuCisKKyAgICAgSWYgYSBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYWZ0ZXIgdGhpcyBjYWxsIChzZWUgaW5mbGF0ZVNldERpY3Rpb25hcnkKKyAgYmVsb3cpLCBpbmZsYXRlIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgdGhlIGRpY3Rpb25hcnkKKyAgY2hvc2VuIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfTkVFRF9ESUNUOyBvdGhlcndpc2UgaXQgc2V0cworICBzdHJtLT5hZGxlciB0byB0aGUgYWRsZXIzMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKKyAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKKyAgYmVsb3cuIEF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbSwgaW5mbGF0ZSgpIGNoZWNrcyB0aGF0IGl0cyBjb21wdXRlZCBhZGxlcjMyCisgIGNoZWNrc3VtIGlzIGVxdWFsIHRvIHRoYXQgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9TVFJFQU1fRU5ECisgIG9ubHkgaWYgdGhlIGNoZWNrc3VtIGlzIGNvcnJlY3QuCisKKyAgICBpbmZsYXRlKCkgd2lsbCBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAorICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4gIEFueSBpbmZvcm1hdGlvbgorICBjb250YWluZWQgaW4gdGhlIGd6aXAgaGVhZGVyIGlzIG5vdCByZXRhaW5lZCwgc28gYXBwbGljYXRpb25zIHRoYXQgbmVlZCB0aGF0CisgIGluZm9ybWF0aW9uIHNob3VsZCBpbnN0ZWFkIHVzZSByYXcgaW5mbGF0ZSwgc2VlIGluZmxhdGVJbml0MigpIGJlbG93LCBvcgorICBpbmZsYXRlQmFjaygpIGFuZCBwZXJmb3JtIHRoZWlyIG93biBwcm9jZXNzaW5nIG9mIHRoZSBnemlwIGhlYWRlciBhbmQKKyAgdHJhaWxlci4KIAogICAgIGluZmxhdGUoKSByZXR1cm5zIFpfT0sgaWYgc29tZSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIChtb3JlIGlucHV0IHByb2Nlc3NlZAogICBvciBtb3JlIG91dHB1dCBwcm9kdWNlZCksIFpfU1RSRUFNX0VORCBpZiB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgaGFzCiAgIGJlZW4gcmVhY2hlZCBhbmQgYWxsIHVuY29tcHJlc3NlZCBvdXRwdXQgaGFzIGJlZW4gcHJvZHVjZWQsIFpfTkVFRF9ESUNUIGlmIGEKICAgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGF0IHRoaXMgcG9pbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMKLSAgY29ycnVwdGVkIChpbnB1dCBzdHJlYW0gbm90IGNvbmZvcm1pbmcgdG8gdGhlIHpsaWIgZm9ybWF0IG9yIGluY29ycmVjdAotICBhZGxlcjMyIGNoZWNrc3VtKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudAotICAoZm9yIGV4YW1wbGUgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QKLSAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdAotICBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIEluIHRoZSBaX0RBVEFfRVJST1IKLSAgY2FzZSwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuIGNhbGwgaW5mbGF0ZVN5bmMgdG8gbG9vayBmb3IgYSBnb29kCi0gIGNvbXByZXNzaW9uIGJsb2NrLgorICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCisgIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKKyAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgTlVMTCksIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSwKKyAgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUgb3IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUKKyAgb3V0cHV0IGJ1ZmZlciB3aGVuIFpfRklOSVNIIGlzIHVzZWQuIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAorICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCisgIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuIElmIFpfREFUQV9FUlJPUiBpcyByZXR1cm5lZCwgdGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCisgIGNhbGwgaW5mbGF0ZVN5bmMoKSB0byBsb29rIGZvciBhIGdvb2QgY29tcHJlc3Npb24gYmxvY2sgaWYgYSBwYXJ0aWFsIHJlY292ZXJ5CisgIG9mIHRoZSBkYXRhIGlzIGRlc2lyZWQuCiAqLwogCiAKQEAgLTU0NywxNiArNTk0LDM2IEBACiAgICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwogICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCiAgICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDE1IGlmIGluZmxhdGVJbml0IGlzIHVzZWQKLSAgIGluc3RlYWQuIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cgc2l6ZSBpcyBnaXZlbiBhcwotICAgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mCi0gICB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgorICAgaW5zdGVhZC4gd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQorICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKKyAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gSWYgYSBjb21wcmVzc2VkIHN0cmVhbSB3aXRoIGEgbGFyZ2VyIHdpbmRvdworICAgc2l6ZSBpcyBnaXZlbiBhcyBpbnB1dCwgaW5mbGF0ZSgpIHdpbGwgcmV0dXJuIHdpdGggdGhlIGVycm9yIGNvZGUKKyAgIFpfREFUQV9FUlJPUiBpbnN0ZWFkIG9mIHRyeWluZyB0byBhbGxvY2F0ZSBhIGxhcmdlciB3aW5kb3cuCiAKLSAgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKLSAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhIG5lZ2F0aXZlCi0gICBtZW1MZXZlbCkuIG1zZyBpcyBzZXQgdG8gbnVsbCBpZiB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyCi0gICBkb2VzIG5vdCBwZXJmb3JtIGFueSBkZWNvbXByZXNzaW9uIGFwYXJ0IGZyb20gcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYKLSAgIHByZXNlbnQ6IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gKFNvIG5leHRfaW4gYW5kIGF2YWlsX2luIG1heSBiZQotICAgbW9kaWZpZWQsIGJ1dCBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGFyZSB1bmNoYW5nZWQuKQorICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIC04Li4tMTUgZm9yIHJhdyBpbmZsYXRlLiBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCisgICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gaW5mbGF0ZSgpIHdpbGwgdGhlbiBwcm9jZXNzIHJhdyBkZWZsYXRlIGRhdGEsCisgICBub3QgbG9va2luZyBmb3IgYSB6bGliIG9yIGd6aXAgaGVhZGVyLCBub3QgZ2VuZXJhdGluZyBhIGNoZWNrIHZhbHVlLCBhbmQgbm90CisgICBsb29raW5nIGZvciBhbnkgY2hlY2sgdmFsdWVzIGZvciBjb21wYXJpc29uIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gVGhpcworICAgaXMgZm9yIHVzZSB3aXRoIG90aGVyIGZvcm1hdHMgdGhhdCB1c2UgdGhlIGRlZmxhdGUgY29tcHJlc3NlZCBkYXRhIGZvcm1hdAorICAgc3VjaCBhcyB6aXAuICBUaG9zZSBmb3JtYXRzIHByb3ZpZGUgdGhlaXIgb3duIGNoZWNrIHZhbHVlcy4gSWYgYSBjdXN0b20KKyAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcworICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KKyAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKKyAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuIE5vdGUgdGhhdCBjb21tZW50cworICAgYWJvdmUgb24gdGhlIHVzZSBpbiBkZWZsYXRlSW5pdDIoKSBhcHBsaWVzIHRvIHRoZSBtYWduaXR1ZGUgb2Ygd2luZG93Qml0cy4KKworICAgICB3aW5kb3dCaXRzIGNhbiBhbHNvIGJlIGdyZWF0ZXIgdGhhbiAxNSBmb3Igb3B0aW9uYWwgZ3ppcCBkZWNvZGluZy4gQWRkCisgICAzMiB0byB3aW5kb3dCaXRzIHRvIGVuYWJsZSB6bGliIGFuZCBnemlwIGRlY29kaW5nIHdpdGggYXV0b21hdGljIGhlYWRlcgorICAgZGV0ZWN0aW9uLCBvciBhZGQgMTYgdG8gZGVjb2RlIG9ubHkgdGhlIGd6aXAgZm9ybWF0ICh0aGUgemxpYiBmb3JtYXQgd2lsbAorICAgcmV0dXJuIGEgWl9EQVRBX0VSUk9SKS4gIElmIGEgZ3ppcCBzdHJlYW0gaXMgYmVpbmcgZGVjb2RlZCwgc3RybS0+YWRsZXIgaXMKKyAgIGEgY3JjMzIgaW5zdGVhZCBvZiBhbiBhZGxlcjMyLgorCisgICAgIGluZmxhdGVJbml0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2gKKyAgIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgYSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhIG51bGwgc3RybSkuIG1zZworICAgaXMgc2V0IHRvIG51bGwgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGluZmxhdGVJbml0MiBkb2VzIG5vdCBwZXJmb3JtCisgICBhbnkgZGVjb21wcmVzc2lvbiBhcGFydCBmcm9tIHJlYWRpbmcgdGhlIHpsaWIgaGVhZGVyIGlmIHByZXNlbnQ6IHRoaXMgd2lsbAorICAgYmUgZG9uZSBieSBpbmZsYXRlKCkuIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dCBuZXh0X291dAorICAgYW5kIGF2YWlsX291dCBhcmUgdW5jaGFuZ2VkLikKICovCiAKIGV4dGVybiBpbnQgemxpYl9pbmZsYXRlU2V0RGljdGlvbmFyeSAoel9zdHJlYW1wIHN0cm0sCkBAIC01NjQsMTYgKzYzMSwxOSBAQAogCQkJCQkJICAgICB1SW50ICBkaWN0TGVuZ3RoKTsKIC8qCiAgICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKLSAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlCi0gICBpZiB0aGlzIGNhbGwgcmV0dXJuZWQgWl9ORUVEX0RJQ1QuIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgotICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgQWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIGNhbGwgb2YKLSAgIGluZmxhdGUuIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZQotICAgZGljdGlvbmFyeSAoc2VlIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4KKyAgIHNlcXVlbmNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGEgY2FsbCBvZiBpbmZsYXRlLAorICAgaWYgdGhhdCBjYWxsIHJldHVybmVkIFpfTkVFRF9ESUNULiBUaGUgZGljdGlvbmFyeSBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IKKyAgIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkbGVyMzIgdmFsdWUgcmV0dXJuZWQgYnkgdGhhdCBjYWxsIG9mIGluZmxhdGUuCisgICBUaGUgY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yIG11c3QgdXNlIGV4YWN0bHkgdGhlIHNhbWUgZGljdGlvbmFyeSAoc2VlCisgICBkZWZsYXRlU2V0RGljdGlvbmFyeSkuICBGb3IgcmF3IGluZmxhdGUsIHRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZAorICAgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5mbGF0ZUluaXQyKCkgb3IgaW5mbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZgorICAgaW5mbGF0ZSgpIHRvIHNldCB0aGUgZGljdGlvbmFyeS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZQorICAgZGljdGlvbmFyeSB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KIAogICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQogICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKHN1Y2ggYXMgTlVMTCBkaWN0aW9uYXJ5KSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCiAgICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgQWRsZXIzMiB2YWx1ZSkuIGluZmxhdGVTZXREaWN0aW9uYXJ5IGRvZXMgbm90CisgICBleHBlY3RlZCBvbmUgKGluY29ycmVjdCBhZGxlcjMyIHZhbHVlKS4gaW5mbGF0ZVNldERpY3Rpb25hcnkgZG9lcyBub3QKICAgIHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IHN1YnNlcXVlbnQgY2FsbHMgb2YKICAgIGluZmxhdGUoKS4KICovCkBAIC02MTQsNDAgKzY4NCwxOSBAQAogICAgY29udGFpbmluZyB0aGUgZGF0YSBhdCBuZXh0X2luIChleGNlcHQgdGhhdCB0aGUgZGF0YSBpcyBub3Qgb3V0cHV0KS4KICovCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KLQotLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06Ci0gKi8KLWV4dGVybiBpbnQgemxpYl9kZWZsYXRlSW5pdF8gKHpfc3RyZWFtcCBzdHJtLCBpbnQgbGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKTsKLWV4dGVybiBpbnQgemxpYl9pbmZsYXRlSW5pdF8gKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSk7Ci1leHRlcm4gaW50IHpsaWJfZGVmbGF0ZUluaXQyXyAoel9zdHJlYW1wIHN0cm0sIGludCAgbGV2ZWwsIGludCAgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93Qml0cywgaW50IG1lbUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyYXRlZ3ksIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSk7Ci1leHRlcm4gaW50IHpsaWJfaW5mbGF0ZUluaXQyXyAoel9zdHJlYW1wIHN0cm0sIGludCAgd2luZG93Qml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmVyc2lvbiwgaW50IHN0cmVhbV9zaXplKTsKICNkZWZpbmUgemxpYl9kZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAotICAgICAgICB6bGliX2RlZmxhdGVJbml0Xygoc3RybSksIChsZXZlbCksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKwl6bGliX2RlZmxhdGVJbml0Migoc3RybSksIChsZXZlbCksIFpfREVGTEFURUQsIE1BWF9XQklUUywgXAorCQkJICAgICAgREVGX01FTV9MRVZFTCwgWl9ERUZBVUxUX1NUUkFURUdZKQogI2RlZmluZSB6bGliX2luZmxhdGVJbml0KHN0cm0pIFwKLSAgICAgICAgemxpYl9pbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIHNpemVvZih6X3N0cmVhbSkpCi0jZGVmaW5lIHpsaWJfZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAotICAgICAgICB6bGliX2RlZmxhdGVJbml0Ml8oKHN0cm0pLChsZXZlbCksKG1ldGhvZCksKHdpbmRvd0JpdHMpLChtZW1MZXZlbCksXAotICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgemxpYl9pbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykgXAotICAgICAgICB6bGliX2luZmxhdGVJbml0Ml8oKHN0cm0pLCAod2luZG93Qml0cyksIFpMSUJfVkVSU0lPTiwgc2l6ZW9mKHpfc3RyZWFtKSkKKwl6bGliX2luZmxhdGVJbml0Migoc3RybSksIERFRl9XQklUUykKIAorZXh0ZXJuIGludCB6bGliX2RlZmxhdGVJbml0Mih6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSk7CitleHRlcm4gaW50IHpsaWJfaW5mbGF0ZUluaXQyKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMpOwogCiAjaWYgIWRlZmluZWQoX1pfVVRJTF9IKSAmJiAhZGVmaW5lZChOT19EVU1NWV9ERUNMKQogICAgIHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSB7aW50IGR1bW15O307IC8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwogI2VuZGlmCiAKLWV4dGVybiBjb25zdCBjaGFyICAqIHpsaWJfekVycm9yICAgICAgICAgICAoaW50IGVycik7Ci0jaWYgMAotZXh0ZXJuIGludCAgICAgICAgICAgemxpYl9pbmZsYXRlU3luY1BvaW50ICh6X3N0cmVhbXAgeik7Ci0jZW5kaWYKLWV4dGVybiBjb25zdCB1TG9uZyAqIHpsaWJfZ2V0X2NyY190YWJsZSAgICAodm9pZCk7Ci0KICNlbmRpZiAvKiBfWkxJQl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3pvcnJvLmggYi9pbmNsdWRlL2xpbnV4L3pvcnJvLmgKaW5kZXggMmYxMzVjZi4uOTEzYmZjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC96b3Jyby5oCisrKyBiL2luY2x1ZGUvbGludXgvem9ycm8uaApAQCAtMTEsOCArMTEsNiBAQAogI2lmbmRlZiBfTElOVVhfWk9SUk9fSAogI2RlZmluZSBfTElOVVhfWk9SUk9fSAogCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAKIApAQCAtMTEyLDQ1ICsxMTAsNiBAQAogICAgIF9fdTMyCQljZF9VbnVzZWRbNF07CS8qIGZvciB3aGF0ZXZlciB0aGUgZHJpdmVyIHdhbnRzICovCiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIAotI2Vsc2UgLyogX19BU1NFTUJMWV9fICovCi0KLUxOX1N1Y2MJCT0gMAotTE5fUHJlZAkJPSBMTl9TdWNjKzQKLUxOX1R5cGUJCT0gTE5fUHJlZCs0Ci1MTl9QcmkJCT0gTE5fVHlwZSsxCi1MTl9OYW1lCQk9IExOX1ByaSsxCi1MTl9zaXplb2YJPSBMTl9OYW1lKzQKLQotRVJfVHlwZQkJPSAwCi1FUl9Qcm9kdWN0CT0gRVJfVHlwZSsxCi1FUl9GbGFncwk9IEVSX1Byb2R1Y3QrMQotRVJfUmVzZXJ2ZWQwMwk9IEVSX0ZsYWdzKzEKLUVSX01hbnVmYWN0dXJlcgk9IEVSX1Jlc2VydmVkMDMrMQotRVJfU2VyaWFsTnVtYmVyCT0gRVJfTWFudWZhY3R1cmVyKzIKLUVSX0luaXREaWFnVmVjCT0gRVJfU2VyaWFsTnVtYmVyKzQKLUVSX1Jlc2VydmVkMGMJPSBFUl9Jbml0RGlhZ1ZlYysyCi1FUl9SZXNlcnZlZDBkCT0gRVJfUmVzZXJ2ZWQwYysxCi1FUl9SZXNlcnZlZDBlCT0gRVJfUmVzZXJ2ZWQwZCsxCi1FUl9SZXNlcnZlZDBmCT0gRVJfUmVzZXJ2ZWQwZSsxCi1FUl9zaXplb2YJPSBFUl9SZXNlcnZlZDBmKzEKLQotQ0RfTm9kZQkJPSAwCi1DRF9GbGFncwk9IENEX05vZGUrTE5fc2l6ZW9mCi1DRF9QYWQJCT0gQ0RfRmxhZ3MrMQotQ0RfUm9tCQk9IENEX1BhZCsxCi1DRF9Cb2FyZEFkZHIJPSBDRF9Sb20rRVJfc2l6ZW9mCi1DRF9Cb2FyZFNpemUJPSBDRF9Cb2FyZEFkZHIrNAotQ0RfU2xvdEFkZHIJPSBDRF9Cb2FyZFNpemUrNAotQ0RfU2xvdFNpemUJPSBDRF9TbG90QWRkcisyCi1DRF9Ecml2ZXIJPSBDRF9TbG90U2l6ZSsyCi1DRF9OZXh0Q0QJPSBDRF9Ecml2ZXIrNAotQ0RfVW51c2VkCT0gQ0RfTmV4dENEKzQKLUNEX3NpemVvZgk9IENEX1VudXNlZCsoNCo0KQotCi0jZW5kaWYgLyogX19BU1NFTUJMWV9fICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KICNkZWZpbmUgWk9SUk9fTlVNX0FVVE8JCTE2CiAKICNpZmRlZiBfX0tFUk5FTF9fCkBAIC0yOTAsNyArMjQ5LDYgQEAKICNkZWZpbmUgWjJSQU1fQ0hVTktTSElGVAkoMTYpCiAKIAotI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAvKiBfTElOVVhfWk9SUk9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC96dXRpbC5oIGIvaW5jbHVkZS9saW51eC96dXRpbC5oCmluZGV4IGVlMGM1OWMuLjZhZGZhOWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvenV0aWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L3p1dGlsLmgKQEAgLTIzLDE4ICsyMyw2IEBACiAKICAgICAgICAgLyogY29tbW9uIGNvbnN0YW50cyAqLwogCi0jaWZuZGVmIERFRl9XQklUUwotIyAgZGVmaW5lIERFRl9XQklUUyBNQVhfV0JJVFMKLSNlbmRpZgotLyogZGVmYXVsdCB3aW5kb3dCaXRzIGZvciBkZWNvbXByZXNzaW9uLiBNQVhfV0JJVFMgaXMgZm9yIGNvbXByZXNzaW9uIG9ubHkgKi8KLQotI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAotI2Vsc2UKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCi0jZW5kaWYKLS8qIGRlZmF1bHQgbWVtTGV2ZWwgKi8KLQogI2RlZmluZSBTVE9SRURfQkxPQ0sgMAogI2RlZmluZSBTVEFUSUNfVFJFRVMgMQogI2RlZmluZSBEWU5fVFJFRVMgICAgMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmggYi9pbmNsdWRlL21lZGlhL2N4MjM0MXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZiMDZiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9jeDIzNDF4LmgKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgICAgY3gyMzQxNS82IGhlYWRlciBjb250YWluaW5nIGNvbW1vbiBkZWZpbmVzLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgQ1gyMzQxWF9ICisjZGVmaW5lIENYMjM0MVhfSAorCitlbnVtIGN4MjM0MXhfcG9ydCB7CisJQ1gyMzQxWF9QT1JUX01FTU9SWSAgICA9IDAsCisJQ1gyMzQxWF9QT1JUX1NUUkVBTUlORyA9IDEsCisJQ1gyMzQxWF9QT1JUX1NFUklBTCAgICA9IDIKK307CisKK3N0cnVjdCBjeDIzNDF4X21wZWdfcGFyYW1zIHsKKwkvKiBtaXNjICovCisJZW51bSBjeDIzNDF4X3BvcnQgcG9ydDsKKwl1MTYgd2lkdGg7CisJdTE2IGhlaWdodDsKKwl1MTYgaXNfNTBoejsKKworCS8qIHN0cmVhbSAqLworCWVudW0gdjRsMl9tcGVnX3N0cmVhbV90eXBlIHN0cmVhbV90eXBlOworCisJLyogYXVkaW8gKi8KKwllbnVtIHY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxIGF1ZGlvX3NhbXBsaW5nX2ZyZXE7CisJZW51bSB2NGwyX21wZWdfYXVkaW9fZW5jb2RpbmcgYXVkaW9fZW5jb2Rpbmc7CisJZW51bSB2NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZSBhdWRpb19sMl9iaXRyYXRlOworCWVudW0gdjRsMl9tcGVnX2F1ZGlvX21vZGUgYXVkaW9fbW9kZTsKKwllbnVtIHY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbiBhdWRpb19tb2RlX2V4dGVuc2lvbjsKKwllbnVtIHY0bDJfbXBlZ19hdWRpb19lbXBoYXNpcyBhdWRpb19lbXBoYXNpczsKKwllbnVtIHY0bDJfbXBlZ19hdWRpb19jcmMgYXVkaW9fY3JjOworCXU4IGF1ZGlvX3Byb3BlcnRpZXM7CisKKwkvKiB2aWRlbyAqLworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nIHZpZGVvX2VuY29kaW5nOworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2FzcGVjdCB2aWRlb19hc3BlY3Q7CisJdTE2IHZpZGVvX2JfZnJhbWVzOworCXUxNiB2aWRlb19nb3Bfc2l6ZTsKKwl1MTYgdmlkZW9fZ29wX2Nsb3N1cmU7CisJdTE2IHZpZGVvX3B1bGxkb3duOworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZSB2aWRlb19iaXRyYXRlX21vZGU7CisJdTMyIHZpZGVvX2JpdHJhdGU7CisJdTMyIHZpZGVvX2JpdHJhdGVfcGVhazsKKwl1MTYgdmlkZW9fdGVtcG9yYWxfZGVjaW1hdGlvbjsKKworCS8qIGVuY29kaW5nIGZpbHRlcnMgKi8KKwllbnVtIHY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGUgdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTsKKwl1MTYgdmlkZW9fc3BhdGlhbF9maWx0ZXI7CisJZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGUgdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlOworCWVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGUgdmlkZW9fY2hyb21hX3NwYXRpYWxfZmlsdGVyX3R5cGU7CisJZW51bSB2NGwyX21wZWdfY3gyMzQxeF92aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZSB2aWRlb190ZW1wb3JhbF9maWx0ZXJfbW9kZTsKKwl1MTYgdmlkZW9fdGVtcG9yYWxfZmlsdGVyOworCWVudW0gdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlIHZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZTsKKwl1MTYgdmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX3RvcDsKKwl1MTYgdmlkZW9fbHVtYV9tZWRpYW5fZmlsdGVyX2JvdHRvbTsKKwl1MTYgdmlkZW9fY2hyb21hX21lZGlhbl9maWx0ZXJfdG9wOworCXUxNiB2aWRlb19jaHJvbWFfbWVkaWFuX2ZpbHRlcl9ib3R0b207Cit9OworCisjZGVmaW5lIENYMjM0MVhfTUJPWF9NQVhfREFUQSAxNgorCitleHRlcm4gY29uc3QgdTMyIGN4MjM0MXhfbXBlZ19jdHJsc1tdOwordHlwZWRlZiBpbnQgKCpjeDIzNDF4X21ib3hfZnVuYykodm9pZCAqcHJpdiwgaW50IGNtZCwgaW50IGluLCBpbnQgb3V0LAorCQl1MzIgZGF0YVtDWDIzNDFYX01CT1hfTUFYX0RBVEFdKTsKK2ludCBjeDIzNDF4X3VwZGF0ZSh2b2lkICpwcml2LCBjeDIzNDF4X21ib3hfZnVuYyBmdW5jLAorCQljb25zdCBzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqb2xkLAorCQljb25zdCBzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqbmV3KTsKK2ludCBjeDIzNDF4X2N0cmxfcXVlcnkoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxY3RybCk7Citjb25zdCBjaGFyICoqY3gyMzQxeF9jdHJsX2dldF9tZW51KHUzMiBpZCk7CitpbnQgY3gyMzQxeF9leHRfY3RybHMoc3RydWN0IGN4MjM0MXhfbXBlZ19wYXJhbXMgKnBhcmFtcywKKwkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjdHJscywgaW50IGNtZCk7Cit2b2lkIGN4MjM0MXhfZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcCk7Cit2b2lkIGN4MjM0MXhfbG9nX3N0YXR1cyhzdHJ1Y3QgY3gyMzQxeF9tcGVnX3BhcmFtcyAqcCwgaW50IGNhcmRpZCk7CisKKy8qIEZpcm13YXJlIG5hbWVzICovCisjZGVmaW5lIENYMjM0MVhfRklSTV9FTkNfRklMRU5BTUUgInY0bC1jeDIzNDF4LWVuYy5mdyIKKy8qIERlY29kZXIgZmlybXdhcmUgZm9yIHRoZSBjeDIzNDE1IG9ubHkgKi8KKyNkZWZpbmUgQ1gyMzQxWF9GSVJNX0RFQ19GSUxFTkFNRSAidjRsLWN4MjM0MXgtZGVjLmZ3IgorCisvKiBGaXJtd2FyZSBBUEkgY29tbWFuZHMgKi8KKworLyogTVBFRyBkZWNvZGVyIEFQSSwgc3BlY2lmaWMgdG8gdGhlIGN4MjM0MTUgKi8KKyNkZWZpbmUgQ1gyMzQxWF9ERUNfUElOR19GVyAJCQkweDAwCisjZGVmaW5lIENYMjM0MVhfREVDX1NUQVJUX1BMQVlCQUNLIAkJMHgwMQorI2RlZmluZSBDWDIzNDFYX0RFQ19TVE9QX1BMQVlCQUNLIAkJMHgwMgorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfUExBWUJBQ0tfU1BFRUQgCQkweDAzCisjZGVmaW5lIENYMjM0MVhfREVDX1NURVBfVklERU8gCQkJMHgwNQorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfRE1BX0JMT0NLX1NJWkUgCQkweDA4CisjZGVmaW5lIENYMjM0MVhfREVDX0dFVF9YRkVSX0lORk8JCTB4MDkKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfR0VUX0RNQV9TVEFUVVMJCTB4MGEKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0NIRURfRE1BX0ZST01fSE9TVAkJMHgwYgorI2RlZmluZSBDWDIzNDFYX0RFQ19QQVVTRV9QTEFZQkFDSyAJCTB4MGQKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfSEFMVF9GVyAJCQkweDBlCisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9TVEFOREFSRCAJCTB4MTAKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfR0VUX1ZFUlNJT04JCQkweDExCisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9TVFJFQU1fSU5QVVQgCQkweDE0CisjZGVmaW5lIENYMjM0MVhfREVDX0dFVF9USU1JTkdfSU5GTyAJCTB4MTUKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX0FVRElPX01PREUgCQkweDE2CisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9FVkVOVF9OT1RJRklDQVRJT04JMHgxNworI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfRElTUExBWV9CVUZGRVJTCQkweDE4CisjZGVmaW5lIENYMjM0MVhfREVDX0VYVFJBQ1RfVkJJIAkJMHgxOQorI2RlZmluZSBDWDIzNDFYX0RFQ19TRVRfREVDT0RFUl9TT1VSQ0UgCQkweDFhCisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9BVURJT19PVVRQVVQgCQkweDFiCisjZGVmaW5lIENYMjM0MVhfREVDX1NFVF9BVl9ERUxBWSAJCTB4MWMKKyNkZWZpbmUgQ1gyMzQxWF9ERUNfU0VUX1BSRUJVRkZFUklORwkJMHgxZQorCisvKiBNUEVHIGVuY29kZXIgQVBJICovCisjZGVmaW5lIENYMjM0MVhfRU5DX1BJTkdfRlcgCQkJMHg4MAorI2RlZmluZSBDWDIzNDFYX0VOQ19TVEFSVF9DQVBUVVJFIAkJMHg4MQorI2RlZmluZSBDWDIzNDFYX0VOQ19TVE9QX0NBUFRVUkUgCQkweDgyCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9BVURJT19JRCAJCTB4ODkKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1ZJREVPX0lEIAkJMHg4YgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfUENSX0lEIAkJCTB4OGQKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0ZSQU1FX1JBVEUgCQkweDhmCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9GUkFNRV9TSVpFIAkJMHg5MQorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfQklUX1JBVEUgCQkweDk1CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9HT1BfUFJPUEVSVElFUyAJCTB4OTcKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0FTUEVDVF9SQVRJTyAJCTB4OTkKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0ROUl9GSUxURVJfTU9ERSAJMHg5YgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfRE5SX0ZJTFRFUl9QUk9QUyAJMHg5ZAorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfQ09SSU5HX0xFVkVMUyAJCTB4OWYKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1NQQVRJQUxfRklMVEVSX1RZUEUgCTB4YTEKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUXzNfMl9QVUxMRE9XTiAJCTB4YjEKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1ZCSV9MSU5FIAkJMHhiNworI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfU1RSRUFNX1RZUEUgCQkweGI5CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9PVVRQVVRfUE9SVCAJCTB4YmIKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0FVRElPX1BST1BFUlRJRVMgCTB4YmQKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfSEFMVF9GVyAJCQkweGMzCisjZGVmaW5lIENYMjM0MVhfRU5DX0dFVF9WRVJTSU9OCQkJMHhjNAorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfR09QX0NMT1NVUkUgCQkweGM1CisjZGVmaW5lIENYMjM0MVhfRU5DX0dFVF9TRVFfRU5EIAkJMHhjNgorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfUEdNX0lOREVYX0lORk8gCQkweGM3CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9WQklfQ09ORklHCQkweGM4CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9ETUFfQkxPQ0tfU0laRSAJCTB4YzkKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfR0VUX1BSRVZfRE1BX0lORk9fTUJfMTAJMHhjYQorI2RlZmluZSBDWDIzNDFYX0VOQ19HRVRfUFJFVl9ETUFfSU5GT19NQl85CTB4Y2IKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0NIRURfRE1BX1RPX0hPU1QgCQkweGNjCisjZGVmaW5lIENYMjM0MVhfRU5DX0lOSVRJQUxJWkVfSU5QVVQgCQkweGNkCisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9GUkFNRV9EUk9QX1JBVEUgCTB4ZDAKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfUEFVU0VfRU5DT0RFUiAJCTB4ZDIKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfUkVGUkVTSF9JTlBVVCAJCTB4ZDMKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX0NPUFlSSUdIVAkJMHhkNAorI2RlZmluZSBDWDIzNDFYX0VOQ19TRVRfRVZFTlRfTk9USUZJQ0FUSU9OIAkweGQ1CisjZGVmaW5lIENYMjM0MVhfRU5DX1NFVF9OVU1fVlNZTkNfTElORVMgCTB4ZDYKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfU0VUX1BMQUNFSE9MREVSIAkJMHhkNworI2RlZmluZSBDWDIzNDFYX0VOQ19NVVRFX1ZJREVPIAkJCTB4ZDkKKyNkZWZpbmUgQ1gyMzQxWF9FTkNfTVVURV9BVURJTyAJCQkweGRhCisjZGVmaW5lIENYMjM0MVhfRU5DX1VOS05PV04JCQkweGRiCisjZGVmaW5lIENYMjM0MVhfRU5DX01JU0MgCQkJMHhkYworCisvKiBPU0QgQVBJLCBzcGVjaWZpYyB0byB0aGUgY3gyMzQxNSAqLworI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfRlJBTUVCVUZGRVIgCQkweDQxCisjZGVmaW5lIENYMjM0MVhfT1NEX0dFVF9QSVhFTF9GT1JNQVQgCQkweDQyCisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9QSVhFTF9GT1JNQVQgCQkweDQzCisjZGVmaW5lIENYMjM0MVhfT1NEX0dFVF9TVEFURSAJCQkweDQ0CisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9TVEFURSAJCQkweDQ1CisjZGVmaW5lIENYMjM0MVhfT1NEX0dFVF9PU0RfQ09PUkRTIAkJMHg0NgorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfT1NEX0NPT1JEUyAJCTB4NDcKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfR0VUX1NDUkVFTl9DT09SRFMgCQkweDQ4CisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9TQ1JFRU5fQ09PUkRTIAkJMHg0OQorI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfR0xPQkFMX0FMUEhBIAkJMHg0YQorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfR0xPQkFMX0FMUEhBIAkJMHg0YgorI2RlZmluZSBDWDIzNDFYX09TRF9TRVRfQkxFTkRfQ09PUkRTIAkJMHg0YworI2RlZmluZSBDWDIzNDFYX09TRF9HRVRfRkxJQ0tFUl9TVEFURSAJCTB4NGYKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfU0VUX0ZMSUNLRVJfU1RBVEUgCQkweDUwCisjZGVmaW5lIENYMjM0MVhfT1NEX0JMVF9DT1BZIAkJCTB4NTIKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfQkxUX0ZJTEwgCQkJMHg1MworI2RlZmluZSBDWDIzNDFYX09TRF9CTFRfVEVYVCAJCQkweDU0CisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9GUkFNRUJVRkZFUl9XSU5ET1cgCTB4NTYKKyNkZWZpbmUgQ1gyMzQxWF9PU0RfU0VUX0NIUk9NQV9LRVkgCQkweDYwCisjZGVmaW5lIENYMjM0MVhfT1NEX0dFVF9BTFBIQV9DT05URU5UX0lOREVYIAkweDYxCisjZGVmaW5lIENYMjM0MVhfT1NEX1NFVF9BTFBIQV9DT05URU5UX0lOREVYIAkweDYyCisKKyNlbmRpZiAvKiBDWDIzNDFYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL2lyLWNvbW1vbi5oCmluZGV4IDMwMmQ1YjMuLjdiYWIwOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvaXItY29tbW9uLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1jb21tb24uaApAQCAtNzMsNyArNzMsNyBAQAogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2F2ZXJ0dl8zMDNbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2RudHZfbGl2ZV9kdmJ0X3Byb1tJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZW1fdGVycmF0ZWNbSVJfS0VZVEFCX1NJWkVdOwotZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2VtX3Bpbm5hY2xlX3VzYltJUl9LRVlUQUJfU0laRV07CitleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVfZ3JleVtJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfZmx5dmlkZW9bSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX2ZseWR2YltJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfY2luZXJneVtJUl9LRVlUQUJfU0laRV07CkBAIC04Nyw4ICs4Nyw5IEBACiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcHY5NTFbSVJfS0VZVEFCX1NJWkVdOwogZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3JjNV90dltJUl9LRVlUQUJfU0laRV07CiBleHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfd2luZmFzdFtJUl9LRVlUQUJfU0laRV07Ci1leHRlcm4gSVJfS0VZVEFCX1RZUEUgaXJfY29kZXNfcGlubmFjbGVbSVJfS0VZVEFCX1NJWkVdOworZXh0ZXJuIElSX0tFWVRBQl9UWVBFIGlyX2NvZGVzX3Bpbm5hY2xlX2NvbG9yW0lSX0tFWVRBQl9TSVpFXTsKIGV4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19oYXVwcGF1Z2VfbmV3W0lSX0tFWVRBQl9TSVpFXTsKK2V4dGVybiBJUl9LRVlUQUJfVFlQRSBpcl9jb2Rlc19ucGd0ZWNoW0lSX0tFWVRBQl9TSVpFXTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaXIta2JkLWkyYy5oIGIvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKaW5kZXggNzMwZjIxZS4uYTQ1NWY3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9pci1rYmQtaTJjLmgKQEAgLTIwLDUgKzIwLDYgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICgqZ2V0X2tleSkoc3RydWN0IElSX2kyYyosIHUzMiosIHUzMiopOwogfTsKIAotaW50IGdldF9rZXlfcGlubmFjbGUoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3Jhdyk7CitpbnQgZ2V0X2tleV9waW5uYWNsZV9ncmV5KHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOworaW50IGdldF9rZXlfcGlubmFjbGVfY29sb3Ioc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3Jhdyk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3ZjYW1jaGlwLmggYi9pbmNsdWRlL21lZGlhL292Y2FtY2hpcC5oCmluZGV4IDgxMzg5ODMuLjBmNDM0NTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvb3ZjYW1jaGlwLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9vdmNhbWNoaXAuaApAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBfX0xJTlVYX09WQ0FNQ0hJUF9ICiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9wd2MtaW9jdGwuaCBiL2luY2x1ZGUvbWVkaWEvcHdjLWlvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMTI1NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvcHdjLWlvY3RsLmgKQEAgLTAsMCArMSwzMjUgQEAKKyNpZm5kZWYgUFdDX0lPQ1RMX0gKKyNkZWZpbmUgUFdDX0lPQ1RMX0gKKworLyogKEMpIDIwMDEtMjAwNCBOZW1vc29mdCBVbnYuCisgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKworICAgTk9URTogdGhpcyB2ZXJzaW9uIG9mIHB3YyBpcyBhbiB1bm9mZmljaWFsIChtb2RpZmllZCkgcmVsZWFzZSBvZiBwd2MgJiBwY3d4CisgICBkcml2ZXIgYW5kIHRodXMgbWF5IGhhdmUgYnVncyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgb3JpZ2luYWwgdmVyc2lvbi4KKyAgIFBsZWFzZSBzZW5kIGJ1ZyByZXBvcnRzIGFuZCBzdXBwb3J0IHJlcXVlc3RzIHRvIDxsdWNAc2FpbGxhcmQub3JnPi4KKyAgIFRoZSBkZWNvbXByZXNzaW9uIHJvdXRpbmVzIGhhdmUgYmVlbiBpbXBsZW1lbnRlZCBieSByZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQorICAgTmVtb3NvZnQgYmluYXJ5IHB3Y3ggbW9kdWxlLiBDYXZlYXQgZW1wdG9yLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyovCisKKy8qIFRoaXMgaXMgcHdjLWlvY3RsLmggYmVsb25naW5nIHRvIFBXQyAxMC4wLjEwCisgICBJdCBjb250YWlucyBzdHJ1Y3R1cmVzIGFuZCBkZWZpbmVzIHRvIGNvbW11bmljYXRlIGZyb20gdXNlciBzcGFjZQorICAgZGlyZWN0bHkgdG8gdGhlIGRyaXZlci4KKyAqLworCisvKgorICAgQ2hhbmdlcworICAgMjAwMS8wOC8wMyAgQWx2YXJhZG8gICBBZGRlZCBpb2N0bCBjb25zdGFudHMgdG8gYWNjZXNzIG1ldGhvZHMgZm9yCisJCQkgIGNoYW5naW5nIHdoaXRlIGJhbGFuY2UgYW5kIHJlZC9ibHVlIGdhaW5zCisgICAyMDAyLzEyLzE1ICBHLiBILiBGZXJuYW5kZXotVG9yaWJpbyAgIFZJRElPQ0dSRUFMU0laRQorICAgMjAwMy8xMi8xMyAgTmVtb3NmdCBVbnYuIFNvbWUgbW9kaWZpY2F0aW9ucyB0byBtYWtlIGludGVyZmFjaW5nIHRvCisJICAgICAgIFBXQ1ggZWFzaWVyCisgICAyMDA2LzAxLzAxICBMdWMgU2FpbGxhcmQgQWRkIHJhdyBmb3JtYXQgZGVmaW5pdGlvbgorICovCisKKy8qIFRoZXNlIGFyZSBwcml2YXRlIGlvY3RsKCkgY29tbWFuZHMsIHNwZWNpZmljIGZvciB0aGUgUGhpbGlwcyB3ZWJjYW1zLgorICAgVGhleSBjb250YWluIGZ1bmN0aW9ucyBub3QgZm91bmQgaW4gb3RoZXIgd2ViY2FtcywgYW5kIHNldHRpbmdzIG5vdAorICAgc3BlY2lmaWVkIGluIHRoZSBWaWRlbzRMaW51eCBBUEkuCisKKyAgIFRoZSAjZGVmaW5lIG5hbWVzIGFyZSBidWlsdCB1cCBsaWtlIGZvbGxvd3M6CisgICBWSURJT0MJCVZJRGVvIElPQ3RsIHByZWZpeAorCSBQV0MJCVBoaWxwcyBXZWJDYW0KKwkgICAgRyAgICAgICAgICAgb3B0aW9uYWw6IEdldAorCSAgICBTICAgICAgICAgICBvcHRpb25hbDogU2V0CisJICAgICAuLi4gCXRoZSBmdW5jdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworCisgLyogRW51bWVyYXRpb24gb2YgaW1hZ2Ugc2l6ZXMgKi8KKyNkZWZpbmUgUFNaX1NRQ0lGCTB4MDAKKyNkZWZpbmUgUFNaX1FTSUYJMHgwMQorI2RlZmluZSBQU1pfUUNJRgkweDAyCisjZGVmaW5lIFBTWl9TSUYJCTB4MDMKKyNkZWZpbmUgUFNaX0NJRgkJMHgwNAorI2RlZmluZSBQU1pfVkdBCQkweDA1CisjZGVmaW5lIFBTWl9NQVgJCTYKKworCisvKiBUaGUgZnJhbWUgcmF0ZSBpcyBlbmNvZGVkIGluIHRoZSB2aWRlb193aW5kb3cuZmxhZ3MgcGFyYW1ldGVyIHVzaW5nCisgICB0aGUgdXBwZXIgMTYgYml0cywgc2luY2Ugc29tZSBmbGFncyBhcmUgZGVmaW5lZCBub3dhZGF5cy4gVGhlIGZvbGxvd2luZworICAgZGVmaW5lcyBwcm92aWRlIGEgbWFzayBhbmQgc2hpZnQgdG8gZmlsdGVyIG91dCB0aGlzIHZhbHVlLgorICAgVGhpcyB2YWx1ZSBjYW4gYWxzbyBiZSBwYXNzaW5nIHVzaW5nIHRoZSBwcml2YXRlIGZsYWcgd2hlbiB1c2luZyB2NGwyIGFuZAorICAgVklESU9DX1NfRk1UIGlvY3RsLgorCisgICBJbiAnU25hcHNob3QnIG1vZGUgdGhlIGNhbWVyYSBmcmVlemVzIGl0cyBhdXRvbWF0aWMgZXhwb3N1cmUgYW5kIGNvbG91cgorICAgYmFsYW5jZSBjb250cm9scy4KKyAqLworI2RlZmluZSBQV0NfRlBTX1NISUZUCQkxNgorI2RlZmluZSBQV0NfRlBTX01BU0sJCTB4MDBGRjAwMDAKKyNkZWZpbmUgUFdDX0ZQU19GUk1BU0sJCTB4MDAzRjAwMDAKKyNkZWZpbmUgUFdDX0ZQU19TTkFQU0hPVAkweDAwNDAwMDAwCisjZGVmaW5lIFBXQ19RTFRfTUFTSwkJMHgwMzAwMDAwMAorI2RlZmluZSBQV0NfUUxUX1NISUZUCQkyNAorCisKKy8qIHN0cnVjdHVyZSBmb3IgdHJhbnNmZXJyaW5nIHggJiB5IGNvb3JkaW5hdGVzICovCitzdHJ1Y3QgcHdjX2Nvb3JkCit7CisJaW50IHgsIHk7CQkvKiBndWVzcyB3aGF0ICovCisJaW50IHNpemU7CQkvKiBzaXplLCBvciBvZmZzZXQgKi8KK307CisKKworLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1BST0JFICovCitzdHJ1Y3QgcHdjX3Byb2JlCit7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgdHlwZTsKK307CisKK3N0cnVjdCBwd2Nfc2VyaWFsCit7CisJY2hhciBzZXJpYWxbMzBdOwkvKiBTdHJpbmcgd2l0aCBzZXJpYWwgbnVtYmVyLiBDb250YWlucyB0ZXJtaW5hdGluZyAwICovCit9OworCisvKiBwd2Nfd2hpdGViYWxhbmNlLm1vZGUgdmFsdWVzICovCisjZGVmaW5lIFBXQ19XQl9JTkRPT1IJCTAKKyNkZWZpbmUgUFdDX1dCX09VVERPT1IJCTEKKyNkZWZpbmUgUFdDX1dCX0ZMCQkyCisjZGVmaW5lIFBXQ19XQl9NQU5VQUwJCTMKKyNkZWZpbmUgUFdDX1dCX0FVVE8JCTQKKworLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1tTR11BV0IgKEF1dG8gV2hpdGUgQmFsYW5jZSkuCisgICBTZXQgbW9kZSB0byBvbmUgb2YgdGhlIFBXQ19XQl8qIHZhbHVlcyBhYm92ZS4KKyAgICpyZWQgYW5kICpibHVlIGFyZSB0aGUgcmVzcGVjdGl2ZSBnYWlucyBvZiB0aGVzZSBjb2xvdXIgY29tcG9uZW50cyBpbnNpZGUKKyAgIHRoZSBjYW1lcmE7IHJhbmdlIDAuLjY1NTM1CisgICBXaGVuICdtb2RlJyA9PSBQV0NfV0JfTUFOVUFMLCAnbWFudWFsX3JlZCcgYW5kICdtYW51YWxfYmx1ZScgYXJlIHNldCBvciByZWFkOworICAgb3RoZXJ3aXNlIHVuZGVmaW5lZC4KKyAgICdyZWFkX3JlZCcgYW5kICdyZWFkX2JsdWUnIGFyZSByZWFkLW9ubHkuCisqLworc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UKK3sKKwlpbnQgbW9kZTsKKwlpbnQgbWFudWFsX3JlZCwgbWFudWFsX2JsdWU7CS8qIFIvVyAqLworCWludCByZWFkX3JlZCwgcmVhZF9ibHVlOwkvKiBSL08gKi8KK307CisKKy8qCisgICAnY29udHJvbF9zcGVlZCcgYW5kICdjb250cm9sX2RlbGF5JyBhcmUgdXNlZCBpbiBhdXRvbWF0aWMgd2hpdGViYWxhbmNlIG1vZGUsCisgICBhbmQgdGVsbCB0aGUgY2FtZXJhIGhvdyBmYXN0IGl0IHNob3VsZCByZWFjdCB0byBjaGFuZ2VzIGluIGxpZ2h0aW5nLCBhbmQKKyAgIHdpdGggaG93IG11Y2ggZGVsYXkuIFZhbGlkIHZhbHVlcyBhcmUgMC4uNjU1MzUuCisqLworc3RydWN0IHB3Y193Yl9zcGVlZAoreworCWludCBjb250cm9sX3NwZWVkOworCWludCBjb250cm9sX2RlbGF5OworCit9OworCisvKiBVc2VkIHdpdGggVklESU9DUFdDW1NHXUxFRCAqLworc3RydWN0IHB3Y19sZWRzCit7CisJaW50IGxlZF9vbjsJCQkvKiBMZWQgb24tdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAqLworCWludCBsZWRfb2ZmOwkJCS8qIExlZCBvZmYtdGltZTsgcmFuZ2UgPSAwLi4yNTAwMCAgKi8KK307CisKKy8qIEltYWdlIHNpemUgKHVzZWQgd2l0aCBHUkVBTFNJWkUpICovCitzdHJ1Y3QgcHdjX2ltYWdlc2l6ZQoreworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworfTsKKworLyogRGVmaW5lcyBhbmQgc3RydWN0dXJlcyBmb3IgTW90b3JpemVkIFBhbiAmIFRpbHQgKi8KKyNkZWZpbmUgUFdDX01QVF9QQU4JCTB4MDEKKyNkZWZpbmUgUFdDX01QVF9USUxUCQkweDAyCisjZGVmaW5lIFBXQ19NUFRfVElNRU9VVAkJMHgwNCAvKiBmb3Igc3RhdHVzICovCisKKy8qIFNldCBhbmdsZXM7IHdoZW4gYWJzb2x1dGUgIT0gMCwgdGhlIGFuZ2xlIGlzIGFic29sdXRlIGFuZCB0aGUKKyAgIGRyaXZlciBjYWxjdWxhdGVzIHRoZSByZWxhdGl2ZSBvZmZzZXQgZm9yIHlvdS4gVGhpcyBjYW4gb25seQorICAgYmUgdXNlZCB3aXRoIFZJRElPQ1BXQ1NBTkdMRTsgVklESU9DUFdDR0FOR0xFIGFsd2F5cyByZXR1cm5zCisgICBhYnNvbHV0ZSBhbmdsZXMuCisgKi8KK3N0cnVjdCBwd2NfbXB0X2FuZ2xlcworeworCWludCBhYnNvbHV0ZTsJCS8qIHdyaXRlLW9ubHkgKi8KKwlpbnQgcGFuOwkJLyogZGVncmVlcyAqIDEwMCAqLworCWludCB0aWx0OwkJLyogZGVncmVzcyAqIDEwMCAqLworfTsKKworLyogUmFuZ2Ugb2YgYW5nbGVzIG9mIHRoZSBjYW1lcmEsIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5LgorICovCitzdHJ1Y3QgcHdjX21wdF9yYW5nZQoreworCWludCBwYW5fbWluLCBwYW5fbWF4OwkJLyogZGVncmVlcyAqIDEwMCAqLworCWludCB0aWx0X21pbiwgdGlsdF9tYXg7Cit9OworCitzdHJ1Y3QgcHdjX21wdF9zdGF0dXMKK3sKKwlpbnQgc3RhdHVzOworCWludCB0aW1lX3BhbjsKKwlpbnQgdGltZV90aWx0OworfTsKKworCisvKiBUaGlzIGlzIHVzZWQgZm9yIG91dC1vZi1rZXJuZWwgZGVjb21wcmVzc2lvbi4gV2l0aCBpdCwgeW91IGNhbiBnZXQKKyAgIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGluaXRpYWxpemUgYW5kIHVzZSB0aGUgZGVjb21wcmVzc29yCisgICByb3V0aW5lcyBpbiBzdGFuZGFsb25lIGFwcGxpY2F0aW9ucy4KKyAqLworc3RydWN0IHB3Y192aWRlb19jb21tYW5kCit7CisJaW50IHR5cGU7CQkvKiBjYW1lcmEgdHlwZSAoNjQ1LCA2NzUsIDczMCwgZXRjLikgKi8KKwlpbnQgcmVsZWFzZTsJCS8qIHJlbGVhc2UgbnVtYmVyICovCisKKwlpbnQgc2l6ZTsJCS8qIG9uZSBvZiBQU1pfKiAqLworCWludCBhbHRlcm5hdGU7CisJaW50IGNvbW1hbmRfbGVuOwkvKiBsZW5ndGggb2YgVVNCIHZpZGVvIGNvbW1hbmQgKi8KKwl1bnNpZ25lZCBjaGFyIGNvbW1hbmRfYnVmWzEzXTsJLyogQWN0dWFsIFVTQiB2aWRlbyBjb21tYW5kICovCisJaW50IGJhbmRsZW5ndGg7CQkvKiA+MCA9IGNvbXByZXNzZWQgKi8KKwlpbnQgZnJhbWVfc2l6ZTsJCS8qIFNpemUgb2Ygb25lICh1biljb21wcmVzc2VkIGZyYW1lICovCit9OworCisvKiBGbGFncyBmb3IgUFdDWCBzdWJyb3V0aW5lcy4gTm90IGFsbCBtb2R1bGVzIGhvbm91ciBhbGwgZmxhZ3MuICovCisjZGVmaW5lIFBXQ1hfRkxBR19QTEFOQVIJMHgwMDAxCisjZGVmaW5lIFBXQ1hfRkxBR19CQVlFUgkJMHgwMDA4CisKKworLyogSU9DVEwgZGVmaW5pdGlvbnMgKi8KKworIC8qIFJlc3RvcmUgdXNlciBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NSVVNFUgkJX0lPKCd2JywgMTkyKQorIC8qIFNhdmUgdXNlciBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NTVVNFUgkJX0lPKCd2JywgMTkzKQorIC8qIFJlc3RvcmUgZmFjdG9yeSBzZXR0aW5ncyAqLworI2RlZmluZSBWSURJT0NQV0NGQUNUT1JZCV9JTygndicsIDE5NCkKKworIC8qIFlvdSBjYW4gbWFuaXB1bGF0ZSB0aGUgY29tcHJlc3Npb24gZmFjdG9yLiBBIGNvbXByZXNzaW9uIHByZWZlcmVuY2Ugb2YgMAorICAgIG1lYW5zIHVzZSB1bmNvbXByZXNzZWQgbW9kZXMgd2hlbiBhdmFpbGFibGU7IDEgaXMgbG93IGNvbXByZXNzaW9uLCAyIGlzCisgICAgbWVkaXVtIGFuZCAzIGlzIGhpZ2ggY29tcHJlc3Npb24gcHJlZmVycmVkLiBPZiBjb3Vyc2UsIHRoZSBoaWdoZXIgdGhlCisgICAgY29tcHJlc3Npb24sIHRoZSBsb3dlciB0aGUgYmFuZHdpZHRoIHVzZWQgYnV0IG1vcmUgY2hhbmNlIG9mIGFydGVmYWN0cworICAgIGluIHRoZSBpbWFnZS4gVGhlIGRyaXZlciBhdXRvbWF0aWNhbGx5IGNob29zZXMgYSBoaWdoZXIgY29tcHJlc3Npb24gd2hlbgorICAgIHRoZSBwcmVmZXJyZWQgbW9kZSBpcyBub3QgYXZhaWxhYmxlLgorICAqLworIC8qIFNldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAoMCA9IHVuY29tcHJlc3NlZCwgMyA9IGhpZ2hlc3QgY29tcHJlc3Npb24pICovCisjZGVmaW5lIFZJRElPQ1BXQ1NDUVVBTAkJX0lPVygndicsIDE5NSwgaW50KQorIC8qIEdldCBwcmVmZXJyZWQgY29tcHJlc3Npb24gcXVhbGl0eSAqLworI2RlZmluZSBWSURJT0NQV0NHQ1FVQUwJCV9JT1IoJ3YnLCAxOTUsIGludCkKKworCisvKiBSZXRyaWV2ZSBzZXJpYWwgbnVtYmVyIG9mIGNhbWVyYSAqLworI2RlZmluZSBWSURJT0NQV0NHU0VSSUFMCV9JT1IoJ3YnLCAxOTgsIHN0cnVjdCBwd2Nfc2VyaWFsKQorCisgLyogVGhpcyBpcyBhIHByb2JlIGZ1bmN0aW9uOyBzaW5jZSBzbyBtYW55IGRldmljZXMgYXJlIHN1cHBvcnRlZCwgaXQKKyAgICBiZWNvbWVzIGRpZmZpY3VsdCB0byBpbmNsdWRlIGFsbCB0aGUgbmFtZXMgaW4gcHJvZ3JhbXMgdGhhdCB3YW50IHRvCisgICAgY2hlY2sgZm9yIHRoZSBlbmhhbmNlZCBQaGlsaXBzIHN0dWZmLiBTbyBpbiBzdGVhZCwgdHJ5IHRoaXMgUFJPQkU7CisgICAgaXQgcmV0dXJucyBhIHN0cnVjdHVyZSB3aXRoIHRoZSBvcmlnaW5hbCBuYW1lLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBQaGlsaXBzIHR5cGUuCisgICAgVG8gdXNlLCBmaWxsIHRoZSBzdHJ1Y3R1cmUgd2l0aCB6ZXJvZXMsIGNhbGwgUFJPQkUgYW5kIGlmIHRoYXQgc3VjY2VlZHMsCisgICAgY29tcGFyZSB0aGUgbmFtZSB3aXRoIHRoYXQgcmV0dXJuZWQgZnJvbSBWSURJT0NHQ0FQOyB0aGV5IHNob3VsZCBiZSB0aGUKKyAgICBzYW1lLiBJZiBzbywgeW91IGNhbiBiZSBhc3N1cmVkIGl0IGlzIGEgUGhpbGlwcyAoT0VNKSBjYW0gYW5kIHRoZSB0eXBlCisgICAgaXMgdmFsaWQuCisgKi8KKyNkZWZpbmUgVklESU9DUFdDUFJPQkUJCV9JT1IoJ3YnLCAxOTksIHN0cnVjdCBwd2NfcHJvYmUpCisKKyAvKiBTZXQgQUdDIChBdXRvbWF0aWMgR2FpbiBDb250cm9sKTsgaW50IDwgMCA9IGF1dG8sIDAuLjY1NTM1ID0gZml4ZWQgKi8KKyNkZWZpbmUgVklESU9DUFdDU0FHQwkJX0lPVygndicsIDIwMCwgaW50KQorIC8qIEdldCBBR0M7IGludCA8IDAgPSBhdXRvOyA+PSAwID0gZml4ZWQsIHJhbmdlIDAuLjY1NTM1ICovCisjZGVmaW5lIFZJRElPQ1BXQ0dBR0MJCV9JT1IoJ3YnLCAyMDAsIGludCkKKyAvKiBTZXQgc2h1dHRlciBzcGVlZDsgaW50IDwgMCA9IGF1dG87ID49IDAgPSBmaXhlZCwgcmFuZ2UgMC4uNjU1MzUgKi8KKyNkZWZpbmUgVklESU9DUFdDU1NIVVRURVIJX0lPVygndicsIDIwMSwgaW50KQorCisgLyogQ29sb3IgY29tcGVuc2F0aW9uIChBdXRvIFdoaXRlIEJhbGFuY2UpICovCisjZGVmaW5lIFZJRElPQ1BXQ1NBV0IgICAgICAgICAgIF9JT1coJ3YnLCAyMDIsIHN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlKQorI2RlZmluZSBWSURJT0NQV0NHQVdCICAgICAgICAgICBfSU9SKCd2JywgMjAyLCBzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkKKworIC8qIEF1dG8gV0Igc3BlZWQgKi8KKyNkZWZpbmUgVklESU9DUFdDU0FXQlNQRUVECV9JT1coJ3YnLCAyMDMsIHN0cnVjdCBwd2Nfd2Jfc3BlZWQpCisjZGVmaW5lIFZJRElPQ1BXQ0dBV0JTUEVFRAlfSU9SKCd2JywgMjAzLCBzdHJ1Y3QgcHdjX3diX3NwZWVkKQorCisgLyogTEVEcyBvbi9vZmYvYmxpbms7IGludCByYW5nZSAwLi42NTUzNSAqLworI2RlZmluZSBWSURJT0NQV0NTTEVEICAgICAgICAgICBfSU9XKCd2JywgMjA1LCBzdHJ1Y3QgcHdjX2xlZHMpCisjZGVmaW5lIFZJRElPQ1BXQ0dMRUQgICAgICAgICAgIF9JT1IoJ3YnLCAyMDUsIHN0cnVjdCBwd2NfbGVkcykKKworICAvKiBDb250b3VyIChzaGFycG5lc3MpOyBpbnQgPCAwID0gYXV0bywgMC4uNjU1MzYgPSBmaXhlZCAqLworI2RlZmluZSBWSURJT0NQV0NTQ09OVE9VUglfSU9XKCd2JywgMjA2LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dDT05UT1VSCV9JT1IoJ3YnLCAyMDYsIGludCkKKworICAvKiBCYWNrbGlnaHQgY29tcGVuc2F0aW9uOyAwID0gb2ZmLCBvdGhlcndpc2Ugb24gKi8KKyNkZWZpbmUgVklESU9DUFdDU0JBQ0tMSUdIVAlfSU9XKCd2JywgMjA3LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dCQUNLTElHSFQJX0lPUigndicsIDIwNywgaW50KQorCisgIC8qIEZsaWNrZXJsZXNzIG1vZGU7ID0gMCBvZmYsIG90aGVyd2lzZSBvbiAqLworI2RlZmluZSBWSURJT0NQV0NTRkxJQ0tFUglfSU9XKCd2JywgMjA4LCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ0dGTElDS0VSCV9JT1IoJ3YnLCAyMDgsIGludCkKKworICAvKiBEeW5hbWljIG5vaXNlIHJlZHVjdGlvbjsgMCBvZmYsIDMgPSBoaWdoIG5vaXNlIHJlZHVjdGlvbiAqLworI2RlZmluZSBWSURJT0NQV0NTRFlOTk9JU0UJX0lPVygndicsIDIwOSwgaW50KQorI2RlZmluZSBWSURJT0NQV0NHRFlOTk9JU0UJX0lPUigndicsIDIwOSwgaW50KQorCisgLyogUmVhbCBpbWFnZSBzaXplIGFzIHVzZWQgYnkgdGhlIGNhbWVyYTsgdGVsbHMgeW91IHdoZXRoZXIgb3Igbm90IHRoZXJlJ3MgYSBncmF5IGJvcmRlciBhcm91bmQgdGhlIGltYWdlICovCisjZGVmaW5lIFZJRElPQ1BXQ0dSRUFMU0laRQlfSU9SKCd2JywgMjEwLCBzdHJ1Y3QgcHdjX2ltYWdlc2l6ZSkKKworIC8qIE1vdG9yaXplZCBwYW4gJiB0aWx0IGZ1bmN0aW9ucyAqLworI2RlZmluZSBWSURJT0NQV0NNUFRSRVNFVAlfSU9XKCd2JywgMjExLCBpbnQpCisjZGVmaW5lIFZJRElPQ1BXQ01QVEdSQU5HRQlfSU9SKCd2JywgMjExLCBzdHJ1Y3QgcHdjX21wdF9yYW5nZSkKKyNkZWZpbmUgVklESU9DUFdDTVBUU0FOR0xFCV9JT1coJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKKyNkZWZpbmUgVklESU9DUFdDTVBUR0FOR0xFCV9JT1IoJ3YnLCAyMTIsIHN0cnVjdCBwd2NfbXB0X2FuZ2xlcykKKyNkZWZpbmUgVklESU9DUFdDTVBUU1RBVFVTCV9JT1IoJ3YnLCAyMTMsIHN0cnVjdCBwd2NfbXB0X3N0YXR1cykKKworIC8qIEdldCB0aGUgVVNCIHNldC12aWRlbyBjb21tYW5kOyBuZWVkZWQgZm9yIGluaXRpYWxpemluZyBsaWJwd2N4ICovCisjZGVmaW5lIFZJRElPQ1BXQ0dWSURDTUQJX0lPUigndicsIDIxNSwgc3RydWN0IHB3Y192aWRlb19jb21tYW5kKQorc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlciB7CisgICBpbnQgbGVuOworICAgY2hhciAqYnVmZmVyOworCit9OworI2RlZmluZSBWSURJT0NQV0NHVklEVEFCTEUJX0lPUigndicsIDIxNiwgc3RydWN0IHB3Y190YWJsZV9pbml0X2J1ZmZlcikKKworLyoKKyAqIFRoaXMgaXMgcHJpdmF0ZSBjb21tYW5kIHVzZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGggdjRsMi4KKyAqIEluIHRoZSBmdXR1cmUgYWxsIHByaXZhdGUgaW9jdGwgd2lsbCBiZSByZW1vdmUvcmVwbGFjZSB0bworICogdXNlIGludGVyZmFjZSBvZmZlciBieSB2NGwyLgorICovCisKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9TQVZFX1VTRVIgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDApCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9VU0VSICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxKQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWSAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMikKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERSAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVIgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0NPTlRPVVIgICAgICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNSkKKyNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfRkxJQ0tFUkxFU1MgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA3KQorI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX05PSVNFX1JFRFVDVElPTiAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOCkKKworc3RydWN0IHB3Y19yYXdfZnJhbWUgeworICAgX19sZTE2IHR5cGU7CQkvKiB0eXBlIG9mIHRoZSB3ZWJjYW0gKi8KKyAgIF9fbGUxNiB2YmFuZGxlbmd0aDsJLyogU2l6ZSBvZiA0bGluZXMgY29tcHJlc3NlZCAodXNlZCBieSB0aGUgZGVjb21wcmVzc29yKSAqLworICAgX191OCAgIGNtZFs0XTsJLyogdGhlIGZvdXIgYnl0ZSBvZiB0aGUgY29tbWFuZCAoaW4gY2FzZSBvZiBuYWxhLAorCQkJICAgb25seSB0aGUgZmlyc3QgMyBieXRlcyBpcyBmaWxsZWQpICovCisgICBfX3U4ICAgcmF3ZnJhbWVbMF07CS8qIGZyYW1lX3NpemUgPSBILzQqdmJhbmRsZW5ndGggKi8KK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zYWE3MTE1LmggYi9pbmNsdWRlL21lZGlhL3NhYTcxMTUuaAppbmRleCA2YjQ4MzZmLi45ZjBlMjI4IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NhYTcxMTUuaAorKysgYi9pbmNsdWRlL21lZGlhL3NhYTcxMTUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gICAgc2FhNzExNS5oIC0gZGVmaW5pdGlvbiBmb3Igc2FhNzExMy80LzUgaW5wdXRzCisgICAgc2FhNzExNS5oIC0gZGVmaW5pdGlvbiBmb3Igc2FhNzExMy80LzUgaW5wdXRzIGFuZCBmcmVxdWVuY3kgZmxhZ3MKIAogICAgIENvcHlyaWdodCAoQykgMjAwNiBIYW5zIFZlcmt1aWwgKGh2ZXJrdWlsQHhzNGFsbC5ubCkKIApAQCAtMzMsNSArMzMsMTQgQEAKICNkZWZpbmUgU0FBNzExNV9TVklERU8yICAgIDgKICNkZWZpbmUgU0FBNzExNV9TVklERU8zICAgIDkKIAorLyogU0FBNzExNSB2NGwyX2NyeXN0YWxfZnJlcSBmcmVxdWVuY3kgdmFsdWVzICovCisjZGVmaW5lIFNBQTcxMTVfRlJFUV8zMl8xMV9NSFogIDMyMTEwMDAwICAgLyogMzIuMTEgTUh6IGNyeXN0YWwsIFNBQTcxMTQvNSBvbmx5ICovCisjZGVmaW5lIFNBQTcxMTVfRlJFUV8yNF81NzZfTUhaIDI0NTc2MDAwICAgLyogMjQuNTc2IE1IeiBjcnlzdGFsICovCisKKy8qIFNBQTcxMTUgdjRsMl9jcnlzdGFsX2ZyZXEgYXVkaW8gY2xvY2sgY29udHJvbCBmbGFncyAqLworI2RlZmluZSBTQUE3MTE1X0ZSRVFfRkxfVUNHQyAgICgxIDw8IDApCSAgIC8qIFNBIDNBWzddLCBVQ0dDLCBTQUE3MTE1IG9ubHkgKi8KKyNkZWZpbmUgU0FBNzExNV9GUkVRX0ZMX0NHQ0RJViAoMSA8PCAxKQkgICAvKiBTQSAzQVs2XSwgQ0dDRElWLCBTQUE3MTE1IG9ubHkgKi8KKyNkZWZpbmUgU0FBNzExNV9GUkVRX0ZMX0FQTEwgICAoMSA8PCAyKQkgICAvKiBTQSAzQVszXSwgQVBMTCwgU0FBNzExNC81IG9ubHkgKi8KKwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2FhNzE0Nl92di5oIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKaW5kZXggNDUwN2NiNi4uODNmZTJlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zYWE3MTQ2X3Z2LmgKQEAgLTIsNyArMiw3IEBACiAjZGVmaW5lIF9fU0FBNzE0Nl9WVl9fCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgotCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS9zYWE3MTQ2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW8tYnVmLmg+CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAppbmRleCAwMTdmZWQ3Li4yZjdiMDBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3R1bmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCkBAIC0yNSw2ICsyNSw4IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdHVuZXItdHlwZXMuaD4KIAorZXh0ZXJuIGludCB0dW5lcl9kZWJ1ZzsKKwogI2RlZmluZSBBRERSX1VOU0VUICgyNTUpCiAKICNkZWZpbmUgVFVORVJfVEVNSUNfUEFMCQkJMCAgICAgICAgLyogNDAwMiBGSDUgKDNYIDc3NTYsIDk0ODMpICovCkBAIC0xMDgsNyArMTEwLDcgQEAKICNkZWZpbmUgVFVORVJfVEVBNTc2NwkJCTYyCS8qIE9ubHkgRk0gUmFkaW8gVHVuZXIgKi8KICNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVfTUszCTYzCiAKLSNkZWZpbmUgVFVORVJfTEdfVERWU19IMDYyRgkJNjQJLyogRFZpQ08gRnVzaW9uSERUViA1ICovCisjZGVmaW5lIFRVTkVSX0xHX1REVlNfSDA2WEYJCTY0CS8qIFREVlMgSDA2MUYsIEgwNjJGLCBIMDY0RiAqLwogI2RlZmluZSBUVU5FUl9ZTUVDX1RWRjY2VDVfQl9ERkYJNjUJLyogQWNvcnAgWTg3OEYgKi8KICNkZWZpbmUgVFVORVJfTEdfVEFMTgkJCTY2CiAjZGVmaW5lIFRVTkVSX1BISUxJUFNfVEQxMzE2CQk2NwpAQCAtMTE5LDYgKzEyMSw4IEBACiAjZGVmaW5lIFRVTkVSX1hDRUlWRV9YQzMwMjgJCTcxCiAKICNkZWZpbmUgVFVORVJfVEhPTVNPTl9GRTY2MDAJCTcyCS8qIERWaUNPIEZ1c2lvbkhEVFYgRFZCLVQgSHlicmlkICovCisjZGVmaW5lIFRVTkVSX1NBTVNVTkdfVENQR182MTIxUDMwQSAgICAgNzMgCS8qIEhhdXBwYXVnZSBQVlItNTAwIFBBTCAqLworI2RlZmluZSBUVU5FUl9UREE5ODg3ICAgICAgICAgICAgICAgICAgIDc0ICAgICAgLyogVGhpcyB0dW5lciBzaG91bGQgYmUgdXNlZCBvbmx5IGludGVybmFsbHkgKi8KIAogLyogdHYgY2FyZCBzcGVjaWZpYyAqLwogI2RlZmluZSBUREE5ODg3X1BSRVNFTlQgCQkoMTw8MCkKQEAgLTE5MCw2ICsxOTQsMTAgQEAKIAogCWludCAgICAgICAgICB1c2luZ192NGwyOwogCisJLyogdXNlZCBieSB0ZGE5ODg3ICovCisJdW5zaWduZWQgaW50ICAgICAgIHRkYTk4ODdfY29uZmlnOworCXVuc2lnbmVkIGNoYXIgCSAgIHRkYTk4ODdfZGF0YVs0XTsKKwogCS8qIHVzZWQgYnkgTVQyMDMyICovCiAJdW5zaWduZWQgaW50IHhvZ2M7CiAJdW5zaWduZWQgaW50IHJhZGlvX2lmMjsKQEAgLTIwNiw2ICsyMTQsOCBAQAogCXZvaWQgKCpzZXRfcmFkaW9fZnJlcSkoc3RydWN0IGkyY19jbGllbnQgKmMsIHVuc2lnbmVkIGludCBmcmVxKTsKIAlpbnQgICgqaGFzX3NpZ25hbCkoc3RydWN0IGkyY19jbGllbnQgKmMpOwogCWludCAgKCppc19zdGVyZW8pKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKKwlpbnQgICgqZ2V0X2FmYykoc3RydWN0IGkyY19jbGllbnQgKmMpOworCXZvaWQgKCp0dW5lcl9zdGF0dXMpKHN0cnVjdCBpMmNfY2xpZW50ICpjKTsKIAl2b2lkICgqc3RhbmRieSkoc3RydWN0IGkyY19jbGllbnQgKmMpOwogfTsKIApAQCAtMjE4LDYgKzIyOCw3IEBACiBleHRlcm4gaW50IHRlYTU3NjdfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiBleHRlcm4gaW50IGRlZmF1bHRfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiBleHRlcm4gaW50IHRlYTU3NjdfYXV0b2RldGVjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CitleHRlcm4gaW50IHRkYTk4ODdfdHVuZXJfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqYyk7CiAKICNkZWZpbmUgdHVuZXJfd2FybihmbXQsIGFyZy4uLikgZG8ge1wKIAlwcmludGsoS0VSTl9XQVJOSU5HICIlcyAlZC0lMDR4OiAiIGZtdCwgdC0+aTJjLmRyaXZlci0+ZHJpdmVyLm5hbWUsIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHZwNTE1MC5oIGIvaW5jbHVkZS9tZWRpYS90dnA1MTUwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiZDJhMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvdHZwNTE1MC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgICAgdHZwNTE1MC5oIC0gZGVmaW5pdGlvbiBmb3IgdHZwNTE1MCBpbnB1dHMKKworICAgIENvcHlyaWdodCAoQykgMjAwNiBIYW5zIFZlcmt1aWwgKGh2ZXJrdWlsQHhzNGFsbC5ubCkKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2lmbmRlZiBfVFZQNTE1MF9IXworI2RlZmluZSBfVFZQNTE1MF9IXworCisvKiBUVlA1MTUwIEhXIGlucHV0cyAqLworI2RlZmluZSBUVlA1MTUwX0NPTVBPU0lURTAgMAorI2RlZmluZSBUVlA1MTUwX0NPTVBPU0lURTEgMQorI2RlZmluZSBUVlA1MTUwX1NWSURFTyAgICAgMgorCisvKiBUVlA1MTUwIEhXIG91dHB1dHMgKi8KKyNkZWZpbmUgVFZQNTE1MF9OT1JNQUwgICAgICAgMAorI2RlZmluZSBUVlA1MTUwX0JMQUNLX1NDUkVFTiAxCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmggYi9pbmNsdWRlL21lZGlhL3Y0bDItY29tbW9uLmgKaW5kZXggNjQyNTIwYS4uNTU2NGRiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jb21tb24uaApAQCAtMjYsOCArMjYsMTQgQEAKICNpZm5kZWYgVjRMMl9DT01NT05fSF8KICNkZWZpbmUgVjRMMl9DT01NT05fSF8KIAorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CisKIC8qIHY0bCBkZWJ1Z2dpbmcgYW5kIGRpYWdub3N0aWNzICovCiAKKy8qIERlYnVnIGJpdG1hc2sgZmxhZ3MgdG8gYmUgdXNlZCBvbiBWNEwyICovCisjZGVmaW5lIFY0TDJfREVCVUdfSU9DVEwgICAgIDB4MDEKKyNkZWZpbmUgVjRMMl9ERUJVR19JT0NUTF9BUkcgMHgwMgorCiAvKiBDb21tb24gcHJpbnRrIGNvbnN0dWN0cyBmb3IgdjRsLWkyYyBkcml2ZXJzLiBUaGVzZSBtYWNyb3MgY3JlYXRlIGEgdW5pcXVlCiAgICBwcmVmaXggY29uc2lzdGluZyBvZiB0aGUgZHJpdmVyIG5hbWUsIHRoZSBhZGFwdGVyIG51bWJlciBhbmQgdGhlIGkyYwogICAgYWRkcmVzcy4gKi8KQEAgLTc4LDYgKzg0LDE5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorLyogQ29udHJvbCBoZWxwZXIgZnVuY3Rpb25zICovCisKK2ludCB2NGwyX2N0cmxfY2hlY2soc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmN0cmwsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsCisJCWNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKTsKK2NvbnN0IGNoYXIgKip2NGwyX2N0cmxfZ2V0X21lbnUodTMyIGlkKTsKK2ludCB2NGwyX2N0cmxfcXVlcnlfZmlsbChzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsLCBzMzIgbWluLCBzMzIgbWF4LCBzMzIgc3RlcCwgczMyIGRlZik7CitpbnQgdjRsMl9jdHJsX3F1ZXJ5X2ZpbGxfc3RkKHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpOworaW50IHY0bDJfY3RybF9xdWVyeV9tZW51KHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSAqcW1lbnUsCisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwsIGNvbnN0IGNoYXIgKiptZW51X2l0ZW1zKTsKK3UzMiB2NGwyX2N0cmxfbmV4dChjb25zdCB1MzIgKiBjb25zdCAqY3RybF9jbGFzc2VzLCB1MzIgaWQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKIC8qIEludGVybmFsIGlvY3RscyAqLwogCiAvKiBWSURJT0NfSU5UX0dfUkVHSVNURVIgYW5kIFZJRElPQ19JTlRfU19SRUdJU1RFUiAqLwpAQCAtMTEyLDYgKzEzMSw4IEBACiAJVjRMMl9JREVOVF9TQUE3MTI5ID0gMTU5LAogCiAJLyogbW9kdWxlIGN4MjU4NDA6IHJlc2VydmVkIHJhbmdlIDIwMC0yNDkgKi8KKwlWNEwyX0lERU5UX0NYMjU4MzYgPSAyMzYsCisJVjRMMl9JREVOVF9DWDI1ODM3ID0gMjM3LAogCVY0TDJfSURFTlRfQ1gyNTg0MCA9IDI0MCwKIAlWNEwyX0lERU5UX0NYMjU4NDEgPSAyNDEsCiAJVjRMMl9JREVOVF9DWDI1ODQyID0gMjQyLApAQCAtMjExLDQgKzIzMiwxNSBAQAogI2RlZmluZQlWSURJT0NfSU5UX1NfVklERU9fUk9VVElORwlfSU9XICgnZCcsIDExMSwgc3RydWN0IHY0bDJfcm91dGluZykKICNkZWZpbmUJVklESU9DX0lOVF9HX1ZJREVPX1JPVVRJTkcJX0lPUiAoJ2QnLCAxMTIsIHN0cnVjdCB2NGwyX3JvdXRpbmcpCiAKK3N0cnVjdCB2NGwyX2NyeXN0YWxfZnJlcSB7CisJdTMyIGZyZXE7CS8qIGZyZXF1ZW5jeSBpbiBIeiBvZiB0aGUgY3J5c3RhbCAqLworCXUzMiBmbGFnczsgCS8qIGRldmljZSBzcGVjaWZpYyBmbGFncyAqLworfTsKKworLyogU2V0cyB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjcnlzdGFsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNsb2Nrcy4KKyAgIEFuIGV4dHJhIGZsYWdzIGZpZWxkIGFsbG93cyBkZXZpY2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbiByZWdhcmRpbmcKKyAgIGNsb2NrIGZyZXF1ZW5jeSBkaXZpZGVycywgZXRjLiBJZiBub3QgdXNlZCwgdGhlbiBzZXQgZmxhZ3MgdG8gMC4KKyAgIElmIHRoZSBmcmVxdWVuY3kgaXMgbm90IHN1cHBvcnRlZCwgdGhlbiAtRUlOVkFMIGlzIHJldHVybmVkLiAqLworI2RlZmluZSBWSURJT0NfSU5UX1NfQ1JZU1RBTF9GUkVRIAlfSU9XICgnZCcsIDExMywgc3RydWN0IHY0bDJfY3J5c3RhbF9mcmVxKQorCiAjZW5kaWYgLyogVjRMMl9DT01NT05fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1kZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI0NzMxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWRldi5oCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICoKKyAqCVYgNCBMIDIgICBEIFIgSSBWIEUgUiAgIEggRSBMIFAgRSBSICAgQSBQIEkKKyAqCisgKiBNb3ZlZCBmcm9tIHZpZGVvZGV2Mi5oCisgKgorICoJU29tZSBjb21tb25seSBuZWVkZWQgZnVuY3Rpb25zIGZvciBkcml2ZXJzICh2NGwyLWNvbW1vbi5vIG1vZHVsZSkKKyAqLworI2lmbmRlZiBfVjRMMl9ERVZfSAorI2RlZmluZSBfVjRMMl9ERVZfSAorCisjZGVmaW5lIE9CU09MRVRFX09XTkVSIDEgLyogdG8gYmUgcmVtb3ZlZCBzb29uICovCisKKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+IC8qIG5lZWQgX191c2VyICovCisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDEKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2RlZmluZSBWSURFT19NQUpPUgk4MQorLyogTWlub3IgZGV2aWNlIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfR1JBQkJFUl9NSU4gICAwCisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX0dSQUJCRVJfTUFYICA2MworI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9SQURJT19NSU4gICAgNjQKKyNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfUkFESU9fTUFYICAgMTI3CisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZUWF9NSU4gICAgIDE5MgorI2RlZmluZSBNSU5PUl9WRkxfVFlQRV9WVFhfTUFYICAgICAyMjMKKyNkZWZpbmUgTUlOT1JfVkZMX1RZUEVfVkJJX01JTiAgICAgMjI0CisjZGVmaW5lIE1JTk9SX1ZGTF9UWVBFX1ZCSV9NQVggICAgIDI1NQorCisjZGVmaW5lIFZGTF9UWVBFX0dSQUJCRVIJMAorI2RlZmluZSBWRkxfVFlQRV9WQkkJCTEKKyNkZWZpbmUgVkZMX1RZUEVfUkFESU8JCTIKKyNkZWZpbmUgVkZMX1RZUEVfVlRYCQkzCisKKy8qICBWaWRlbyBzdGFuZGFyZCBmdW5jdGlvbnMgICovCitleHRlcm4gdW5zaWduZWQgaW50IHY0bDJfdmlkZW9fc3RkX2ZwcyhzdHJ1Y3QgdjRsMl9zdGFuZGFyZCAqdnMpOworZXh0ZXJuIGludCB2NGwyX3ZpZGVvX3N0ZF9jb25zdHJ1Y3Qoc3RydWN0IHY0bDJfc3RhbmRhcmQgKnZzLAorCQkJCSAgICBpbnQgaWQsIGNoYXIgKm5hbWUpOworCisvKiBwcm9yaXR5IGhhbmRsaW5nICovCitzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHsKKwlhdG9taWNfdCBwcmlvc1s0XTsKK307CitpbnQgdjRsMl9wcmlvX2luaXQoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKTsKK2ludCB2NGwyX3ByaW9fY2hhbmdlKHN0cnVjdCB2NGwyX3ByaW9fc3RhdGUgKmdsb2JhbCwgZW51bSB2NGwyX3ByaW9yaXR5ICpsb2NhbCwKKwkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgbmV3KTsKK2ludCB2NGwyX3ByaW9fb3BlbihzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpOworaW50IHY0bDJfcHJpb19jbG9zZShzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlICpnbG9iYWwsIGVudW0gdjRsMl9wcmlvcml0eSAqbG9jYWwpOworZW51bSB2NGwyX3ByaW9yaXR5IHY0bDJfcHJpb19tYXgoc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsKTsKK2ludCB2NGwyX3ByaW9fY2hlY2soc3RydWN0IHY0bDJfcHJpb19zdGF0ZSAqZ2xvYmFsLCBlbnVtIHY0bDJfcHJpb3JpdHkgKmxvY2FsKTsKKworLyogbmFtZXMgZm9yIGZhbmN5IGRlYnVnIG91dHB1dCAqLworZXh0ZXJuIGNoYXIgKnY0bDJfZmllbGRfbmFtZXNbXTsKK2V4dGVybiBjaGFyICp2NGwyX3R5cGVfbmFtZXNbXTsKKworLyogIENvbXBhdGliaWxpdHkgbGF5ZXIgaW50ZXJmYWNlICAtLSAgdjRsMS1jb21wYXQgbW9kdWxlICovCit0eXBlZGVmIGludCAoKnY0bDJfa2lvY3RsKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CisjaWZkZWYgQ09ORklHX1ZJREVPX1Y0TDFfQ09NUEFUCitpbnQgdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgaW50IGNtZCwgdm9pZCAqYXJnLCB2NGwyX2tpb2N0bCBkcml2ZXJfaW9jdGwpOworI2Vsc2UKKyNkZWZpbmUgdjRsX2NvbXBhdF90cmFuc2xhdGVfaW9jdGwoaW5vZGUsZmlsZSxjbWQsYXJnLGlvY3RsKSAtRUlOVkFMCisjZW5kaWYKKworLyogMzIgQml0cyBjb21wYXRpYmlsaXR5IGxheWVyIGZvciA2NCBiaXRzIHByb2Nlc3NvcnMgKi8KK2V4dGVybiBsb25nIHY0bF9jb21wYXRfaW9jdGwzMihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CisKKy8qCisgKiBOZXdlciB2ZXJzaW9uIG9mIHZpZGVvX2RldmljZSwgaGFuZGxlZCBieSB2aWRlb2RldjIuYworICogCVRoaXMgdmVyc2lvbiBtb3ZlcyByZWR1bmRhbnQgY29kZSBmcm9tIHZpZGVvIGRldmljZSBjb2RlIHRvCisgKgl0aGUgY29tbW9uIGhhbmRsZXIKKyAqLworc3RydWN0IHY0bDJfdHZub3JtIHsKKwljaGFyICAgICAgICAgICpuYW1lOworCXY0bDJfc3RkX2lkICAgaWQ7CisKKwl2b2lkICAgICAgICAgICpwcml2X2RhdGE7Cit9OworCitzdHJ1Y3QgdmlkZW9fZGV2aWNlCit7CisJLyogZGV2aWNlIG9wcyAqLworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7CisKKwkvKiBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwljaGFyIG5hbWVbMzJdOworCWludCB0eXBlOyAgICAgICAvKiB2NGwxICovCisJaW50IHR5cGUyOyAgICAgIC8qIHY0bDIgKi8KKwlpbnQgaGFyZHdhcmU7CisJaW50IG1pbm9yOworCisJaW50IGRlYnVnOwkvKiBBY3RpdmF0ZXMgZGVidWcgbGV2ZWwqLworCisJLyogVmlkZW8gc3RhbmRhcmQgdmFycyAqLworCWludCB0dm5vcm1zaXplOwkvKiBTaXplIG9mIHR2bm9ybSBhcnJheSAqLworCXY0bDJfc3RkX2lkIGN1cnJlbnRfbm9ybTsgLyogQ3VycmVudCB0dm5vcm0gKi8KKwlzdHJ1Y3QgdjRsMl90dm5vcm0gKnR2bm9ybXM7CisKKwkvKiBjYWxsYmFja3MgKi8KKwl2b2lkICgqcmVsZWFzZSkoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKTsKKworCS8qIGlvY3RsIGNhbGxiYWNrcyAqLworCisJLyogVklESU9DX1FVRVJZQ0FQIGhhbmRsZXIgKi8KKwlpbnQgKCp2aWRpb2NfcXVlcnljYXApKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKTsKKworCS8qIFByaW9yaXR5IGhhbmRsaW5nICovCisJaW50ICgqdmlkaW9jX2dfcHJpb3JpdHkpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkgICAgZW51bSB2NGwyX3ByaW9yaXR5ICpwKTsKKwlpbnQgKCp2aWRpb2Nfc19wcmlvcml0eSkgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcCk7CisKKwkvKiBWSURJT0NfRU5VTV9GTVQgaGFuZGxlcnMgKi8KKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfY2FwKSAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfb3ZlcmxheSkgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdmJpKSAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdmJpX2NhcHR1cmUpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdmlkZW9fb3V0cHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdmJpX291dHB1dCkgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKwlpbnQgKCp2aWRpb2NfZW51bV9mbXRfdHlwZV9wcml2YXRlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKKworCS8qIFZJRElPQ19HX0ZNVCBoYW5kbGVycyAqLworCWludCAoKnZpZGlvY19nX2ZtdF9jYXApICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19nX2ZtdF9vdmVybGF5KSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19nX2ZtdF92YmkpICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19nX2ZtdF92Ymlfb3V0cHV0KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19nX2ZtdF92YmlfY2FwdHVyZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19nX2ZtdF92aWRlb19vdXRwdXQpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfZ19mbXRfdHlwZV9wcml2YXRlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisKKwkvKiBWSURJT0NfU19GTVQgaGFuZGxlcnMgKi8KKwlpbnQgKCp2aWRpb2Nfc19mbXRfY2FwKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKworCWludCAoKnZpZGlvY19zX2ZtdF9vdmVybGF5KSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19zX2ZtdF92YmkpICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19zX2ZtdF92Ymlfb3V0cHV0KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19zX2ZtdF92YmlfY2FwdHVyZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY19zX2ZtdF92aWRlb19vdXRwdXQpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2Nfc19mbXRfdHlwZV9wcml2YXRlKShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisKKwkvKiBWSURJT0NfVFJZX0ZNVCBoYW5kbGVycyAqLworCWludCAoKnZpZGlvY190cnlfZm10X2NhcCkgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF9vdmVybGF5KSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3RyeV9mbXRfdmJpKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCWludCAoKnZpZGlvY190cnlfZm10X3ZiaV9vdXRwdXQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF92YmlfY2FwdHVyZSkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CisJaW50ICgqdmlkaW9jX3RyeV9mbXRfdmlkZW9fb3V0cHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCSAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKTsKKwlpbnQgKCp2aWRpb2NfdHJ5X2ZtdF90eXBlX3ByaXZhdGUpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCisJLyogQnVmZmVyIGhhbmRsZXJzICovCisJaW50ICgqdmlkaW9jX3JlcWJ1ZnMpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpiKTsKKwlpbnQgKCp2aWRpb2NfcXVlcnlidWYpKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKKwlpbnQgKCp2aWRpb2NfcWJ1ZikgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKKwlpbnQgKCp2aWRpb2NfZHFidWYpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfYnVmZmVyICpiKTsKKworCisJaW50ICgqdmlkaW9jX292ZXJsYXkpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCBpKTsKKyNpZmRlZiBIQVZFX1Y0TDEKKwkJCS8qIGJ1ZmZlciB0eXBlIGlzIHN0cnVjdCB2aWRpb19tYnVmICogKi8KKwlpbnQgKCp2aWRpb2NnbWJ1ZikgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2aWRlb19tYnVmICpwKTsKKyNlbmRpZgorCWludCAoKnZpZGlvY19nX2ZidWYpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqYSk7CisJaW50ICgqdmlkaW9jX3NfZmJ1ZikgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICphKTsKKworCQkvKiBTdHJlYW0gb24vb2ZmICovCisJaW50ICgqdmlkaW9jX3N0cmVhbW9uKSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSk7CisJaW50ICgqdmlkaW9jX3N0cmVhbW9mZikoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSk7CisKKwkJLyogU3RhbmRhcmQgaGFuZGxpbmcKKwkJCUdfU1REIGFuZCBFTlVNU1REIGFyZSBoYW5kbGVkIGJ5IHZpZGVvZGV2LmMKKwkJICovCisJaW50ICgqdmlkaW9jX3Nfc3RkKSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCBhKTsKKwlpbnQgKCp2aWRpb2NfcXVlcnlzdGQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICphKTsKKworCQkvKiBJbnB1dCBoYW5kbGluZyAqLworCWludCAoKnZpZGlvY19lbnVtX2lucHV0KShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJIHN0cnVjdCB2NGwyX2lucHV0ICppbnApOworCWludCAoKnZpZGlvY19nX2lucHV0KSAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHVuc2lnbmVkIGludCAqaSk7CisJaW50ICgqdmlkaW9jX3NfaW5wdXQpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdW5zaWduZWQgaW50IGkpOworCisJCS8qIE91dHB1dCBoYW5kbGluZyAqLworCWludCAoKnZpZGlvY19lbnVtb3V0cHV0KSAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCSAgc3RydWN0IHY0bDJfb3V0cHV0ICphKTsKKwlpbnQgKCp2aWRpb2NfZ19vdXRwdXQpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdW5zaWduZWQgaW50ICppKTsKKwlpbnQgKCp2aWRpb2Nfc19vdXRwdXQpICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgdW5zaWduZWQgaW50IGkpOworCisJCS8qIENvbnRyb2wgaGFuZGxpbmcgKi8KKwlpbnQgKCp2aWRpb2NfcXVlcnljdHJsKSAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICphKTsKKwlpbnQgKCp2aWRpb2NfZ19jdHJsKSAgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqYSk7CisJaW50ICgqdmlkaW9jX3NfY3RybCkgICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmEpOworCWludCAoKnZpZGlvY19nX2V4dF9jdHJscykgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmEpOworCWludCAoKnZpZGlvY19zX2V4dF9jdHJscykgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmEpOworCWludCAoKnZpZGlvY190cnlfZXh0X2N0cmxzKSAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmEpOworCWludCAoKnZpZGlvY19xdWVyeW1lbnUpICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKmEpOworCisJLyogQXVkaW8gaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2VudW1hdWRpbykgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKTsKKwlpbnQgKCp2aWRpb2NfZ19hdWRpbykgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW8gKmEpOworCWludCAoKnZpZGlvY19zX2F1ZGlvKSAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSk7CisKKwkvKiBBdWRpbyBvdXQgaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2VudW1hdWRvdXQpICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2F1ZGlvb3V0ICphKTsKKwlpbnQgKCp2aWRpb2NfZ19hdWRvdXQpICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfYXVkaW9vdXQgKmEpOworCWludCAoKnZpZGlvY19zX2F1ZG91dCkgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpb291dCAqYSk7CisJaW50ICgqdmlkaW9jX2dfbW9kdWxhdG9yKSAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX21vZHVsYXRvciAqYSk7CisJaW50ICgqdmlkaW9jX3NfbW9kdWxhdG9yKSAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX21vZHVsYXRvciAqYSk7CisJLyogQ3JvcCBpb2N0bHMgKi8KKwlpbnQgKCp2aWRpb2NfY3JvcGNhcCkgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfY3JvcGNhcCAqYSk7CisJaW50ICgqdmlkaW9jX2dfY3JvcCkgICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX2Nyb3AgKmEpOworCWludCAoKnZpZGlvY19zX2Nyb3ApICAgICAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9jcm9wICphKTsKKwkvKiBDb21wcmVzc2lvbiBpb2N0bHMgKi8KKwlpbnQgKCp2aWRpb2NfZ19tcGVnY29tcCkgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfbXBlZ19jb21wcmVzc2lvbiAqYSk7CisJaW50ICgqdmlkaW9jX3NfbXBlZ2NvbXApICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX21wZWdfY29tcHJlc3Npb24gKmEpOworCWludCAoKnZpZGlvY19nX2pwZWdjb21wKSAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmEpOworCWludCAoKnZpZGlvY19zX2pwZWdjb21wKSAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9qcGVnY29tcHJlc3Npb24gKmEpOworCisJLyogU3RyZWFtIHR5cGUtZGVwZW5kZW50IHBhcmFtZXRlciBpb2N0bHMgKi8KKwlpbnQgKCp2aWRpb2NfZ19wYXJtKSAgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSk7CisJaW50ICgqdmlkaW9jX3NfcGFybSkgICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpOworCisJLyogVHVuZXIgaW9jdGxzICovCisJaW50ICgqdmlkaW9jX2dfdHVuZXIpICAgICAgICAgIChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCQkJCXN0cnVjdCB2NGwyX3R1bmVyICphKTsKKwlpbnQgKCp2aWRpb2Nfc190dW5lcikgICAgICAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfdHVuZXIgKmEpOworCWludCAoKnZpZGlvY19nX2ZyZXF1ZW5jeSkgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmEpOworCWludCAoKnZpZGlvY19zX2ZyZXF1ZW5jeSkgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCQkJCQlzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmEpOworCisJLyogU2xpY2VkIFZCSSBjYXAgKi8KKwlpbnQgKCp2aWRpb2NfZ19zbGljZWRfdmJpX2NhcCkgKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwkJCQkJc3RydWN0IHY0bDJfc2xpY2VkX3ZiaV9jYXAgKmEpOworCisJLyogTG9nIHN0YXR1cyBpb2N0bCAqLworCWludCAoKnZpZGlvY19sb2dfc3RhdHVzKSAgICAgICAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoKTsKKworCisjaWZkZWYgT0JTT0xFVEVfT1dORVIgLyogdG8gYmUgcmVtb3ZlZCBzb29uICovCisvKiBvYnNvbGV0ZSAtLSBmb3BzLT5vd25lciBpcyB1c2VkIGluc3RlYWQgKi8KK3N0cnVjdCBtb2R1bGUgKm93bmVyOworLyogZGV2LT5kcml2ZXJfZGF0YSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBzb21lIGRheS4KKwkqIFVzZSB0aGUgdmlkZW9fe2dldHxzZXR9X2RydmRhdGEoKSBoZWxwZXIgZnVuY3Rpb25zLAorCSogc28gdGhlIHN3aXRjaCBvdmVyIHdpbGwgYmUgdHJhbnNwYXJlbnQgZm9yIHlvdS4KKwkqIE9yIHVzZSB7cGNpfHVzYn1fe2dldHxzZXR9X2RydmRhdGEoKSBkaXJlY3RseS4gKi8KK3ZvaWQgKnByaXY7CisjZW5kaWYKKworCS8qIGZvciB2aWRlb2Rldi5jIGludGVuYWwgdXNhZ2UgLS0gcGxlYXNlIGRvbid0IHRvdWNoICovCisJaW50IHVzZXJzOyAgICAgICAgICAgICAgICAgICAgIC8qIHZpZGVvX2V4Y2x1c2l2ZV97b3BlbnxjbG9zZX0gLi4uICovCisJc3RydWN0IG11dGV4IGxvY2s7ICAgICAgICAgICAgIC8qIC4uLiBoZWxwZXIgZnVuY3Rpb24gdXNlcyB0aGVzZSAgICovCisJY2hhciBkZXZmc19uYW1lWzY0XTsgICAgICAgICAgIC8qIGRldmZzICovCisJc3RydWN0IGNsYXNzX2RldmljZSBjbGFzc19kZXY7IC8qIHN5c2ZzICovCit9OworCisvKiBWZXJzaW9uIDIgZnVuY3Rpb25zICovCitleHRlcm4gaW50IHZpZGVvX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQsIGludCB0eXBlLCBpbnQgbnIpOwordm9pZCB2aWRlb191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICopOworZXh0ZXJuIGludCB2aWRlb19pb2N0bDIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogaGVscGVyIGZ1bmN0aW9ucyB0byBhbGxvYyAvIHJlbGVhc2Ugc3RydWN0IHZpZGVvX2RldmljZSwgdGhlCisgICBsYXRlciBjYW4gYmUgdXNlZCBmb3IgdmlkZW9fZGV2aWNlLT5yZWxlYXNlKCkgKi8KK3N0cnVjdCB2aWRlb19kZXZpY2UgKnZpZGVvX2RldmljZV9hbGxvYyh2b2lkKTsKK3ZvaWQgdmlkZW9fZGV2aWNlX3JlbGVhc2Uoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkKTsKKworLyogSW5jbHVkZSBzdXBwb3J0IGZvciBvYnNvbGV0ZWQgc3R1ZmYgKi8KK2V4dGVybiBpbnQgdmlkZW9fdXNlcmNvcHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnLAorCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICphcmcpKTsKKworCisjaWZkZWYgSEFWRV9WNEwxCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworZXh0ZXJuIHN0cnVjdCB2aWRlb19kZXZpY2UqIHZpZGVvX2RldmRhdGEoc3RydWN0IGZpbGUqKTsKKworI2RlZmluZSB0b192aWRlb19kZXZpY2UoY2QpIGNvbnRhaW5lcl9vZihjZCwgc3RydWN0IHZpZGVvX2RldmljZSwgY2xhc3NfZGV2KQorc3RhdGljIGlubGluZSB2b2lkCit2aWRlb19kZXZpY2VfY3JlYXRlX2ZpbGUoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZSgmdmZkLT5jbGFzc19kZXYsIGF0dHIpOworfQorc3RhdGljIGlubGluZSB2b2lkCit2aWRlb19kZXZpY2VfcmVtb3ZlX2ZpbGUoc3RydWN0IHZpZGVvX2RldmljZSAqdmZkLAorCQkJIHN0cnVjdCBjbGFzc19kZXZpY2VfYXR0cmlidXRlICphdHRyKQoreworCWNsYXNzX2RldmljZV9yZW1vdmVfZmlsZSgmdmZkLT5jbGFzc19kZXYsIGF0dHIpOworfQorCisjaWZkZWYgT0JTT0xFVEVfT1dORVIgLyogdG8gYmUgcmVtb3ZlZCBzb29uICovCisvKiBoZWxwZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBkcml2ZXIgcHJpdmF0ZSBkYXRhLiAqLworc3RhdGljIGlubGluZSB2b2lkICp2aWRlb19nZXRfZHJ2ZGF0YShzdHJ1Y3QgdmlkZW9fZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+cHJpdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZpZGVvX3NldF9kcnZkYXRhKHN0cnVjdCB2aWRlb19kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlkZXYtPnByaXYgPSBkYXRhOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgdmlkZW9fZXhjbHVzaXZlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworZXh0ZXJuIGludCB2aWRlb19leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisjZW5kaWYgLyogSEFWRV9WNEwxICovCisKKyNlbmRpZiAvKiBfVjRMMl9ERVZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92aWRlby1idWYtZHZiLmggYi9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi1kdmIuaAppbmRleCBiNzhkOTBmLi44MjMzY2FmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi1kdmIuaAorKysgYi9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi1kdmIuaApAQCAtMjYsNyArMjYsOCBAQAogCiBpbnQgdmlkZW9idWZfZHZiX3JlZ2lzdGVyKHN0cnVjdCB2aWRlb2J1Zl9kdmIgKmR2YiwKIAkJCSAgc3RydWN0IG1vZHVsZSAqbW9kdWxlLAotCQkJICB2b2lkICphZGFwdGVyX3ByaXYpOworCQkJICB2b2lkICphZGFwdGVyX3ByaXYsCisJCQkgIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CiB2b2lkIHZpZGVvYnVmX2R2Yl91bnJlZ2lzdGVyKHN0cnVjdCB2aWRlb2J1Zl9kdmIgKmR2Yik7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oIGIvaW5jbHVkZS9tZWRpYS92aWRlby1idWYuaAppbmRleCBmZmYzZmQwLi4xMTE1YTI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3ZpZGVvLWJ1Zi5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdmlkZW8tYnVmLmgKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMS5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKaW5kZXggZDUxNDc3Ny4uZWNjNDI4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExLmgKQEAgLTk2OCw2ICs5NjgsNyBAQAogCiBlbnVtIHsKIAlJRUVFODAyMTFfQ0hfUEFTU0lWRV9PTkxZID0gKDEgPDwgMCksCisJSUVFRTgwMjExX0NIXzgwMjExSF9SVUxFUyA9ICgxIDw8IDEpLAogCUlFRUU4MDIxMV9DSF9CX09OTFkgPSAoMSA8PCAyKSwKIAlJRUVFODAyMTFfQ0hfTk9fSUJTUyA9ICgxIDw8IDMpLAogCUlFRUU4MDIxMV9DSF9VTklGT1JNX1NQUkVBRElORyA9ICgxIDw8IDQpLApAQCAtOTc2LDEwICs5NzcsMTAgQEAKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCB7Ci0JdTMyIGZyZXE7CisJdTMyIGZyZXE7CS8qIGluIE1IeiAqLwogCXU4IGNoYW5uZWw7CiAJdTggZmxhZ3M7Ci0JdTggbWF4X3Bvd2VyOworCXU4IG1heF9wb3dlcjsJLyogaW4gZEJtICovCiB9OwogCiBzdHJ1Y3QgaWVlZTgwMjExX2dlbyB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAppbmRleCBiY2FlZTM5Li4zYjZkYzE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9wcm90b2NvbC5oCisrKyBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKQEAgLTM2LDYgKzM2LDcgQEAKIHN0cnVjdCBuZXRfcHJvdG9jb2wgewogCWludAkJCSgqaGFuZGxlcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJdm9pZAkJCSgqZXJyX2hhbmRsZXIpKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvKTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgICAgKigqZ3NvX3NlZ21lbnQpKHN0cnVjdCBza19idWZmICpza2IsIGludCBzZyk7CiAJaW50CQkJbm9fcG9saWN5OwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc29jay5oIGIvaW5jbHVkZS9uZXQvc29jay5oCmluZGV4IGQxMGRmZWMuLjJkOGQ2YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9zb2NrLmgKQEAgLTEwMzAsOSArMTAzMCwxMyBAQAogewogCV9fc2tfZHN0X3NldChzaywgZHN0KTsKIAlzay0+c2tfcm91dGVfY2FwcyA9IGRzdC0+ZGV2LT5mZWF0dXJlczsKKwlpZiAoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX0dTTykKKwkJc2stPnNrX3JvdXRlX2NhcHMgfD0gTkVUSUZfRl9UU087CiAJaWYgKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9UU08pIHsKIAkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19OT19MQVJHRVNFTkQpIHx8IGRzdC0+aGVhZGVyX2xlbikKIAkJCXNrLT5za19yb3V0ZV9jYXBzICY9IH5ORVRJRl9GX1RTTzsKKwkJZWxzZSAKKwkJCXNrLT5za19yb3V0ZV9jYXBzIHw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0hXX0NTVU07CiAJfQogfQogCkBAIC0xMjY1LDYgKzEyNjksNyBAQAogICogc2tfZWF0X3NrYiAtIFJlbGVhc2UgYSBza2IgaWYgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZAogICogQHNrOiBzb2NrZXQgdG8gZWF0IHRoaXMgc2tiIGZyb20KICAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gZWF0CisgKiBAY29waWVkX2Vhcmx5OiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBETUEgb3BlcmF0aW9ucyBjb3BpZWQgdGhpcyBkYXRhIGVhcmx5CiAgKgogICogVGhpcyByb3V0aW5lIG11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCBvciB3aXRoIHRoZSBzb2NrZXQKICAqIGxvY2tlZCBzbyB0aGF0IHRoZSBza19idWZmIHF1ZXVlIG9wZXJhdGlvbiBpcyBvay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggNWY0ZWI1Yy4uY2EzZDM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTU2OSwxMyArNTY5LDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRjcF9za2JfcGNvdW50KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIHNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3M7CisJcmV0dXJuIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3M7CiB9CiAKIC8qIFRoaXMgaXMgdmFsaWQgaWZmIHRjcF9za2JfcGNvdW50KCkgPiAxLiAqLwogc3RhdGljIGlubGluZSBpbnQgdGNwX3NrYl9tc3MoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZTsKKwlyZXR1cm4gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHRjcF9kZWNfcGNvdW50X2FwcHJveChfX3UzMiAqY291bnQsCkBAIC0xMDg2LDYgKzEwODYsOCBAQAogCiBleHRlcm4gaW50IHRjcF92NF9kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKTsKIAorZXh0ZXJuIHN0cnVjdCBza19idWZmICp0Y3BfdHNvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNnKTsKKwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBleHRlcm4gaW50ICB0Y3A0X3Byb2NfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIHRjcDRfcHJvY19leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oIGIvaW5jbHVkZS9zY3NpL3Njc2lfY21uZC5oCmluZGV4IGIwY2FhYmUuLmU0NmNkNDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2NzaS9zY3NpX2NtbmQuaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9jbW5kLmgKQEAgLTE0NSw2ICsxNDUsNyBAQAogZXh0ZXJuIHZvaWQgc2NzaV9wdXRfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICopOwogZXh0ZXJuIHZvaWQgc2NzaV9pb19jb21wbGV0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpOwogZXh0ZXJuIHZvaWQgc2NzaV9maW5pc2hfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQpOworZXh0ZXJuIHZvaWQgc2NzaV9yZXFfYWJvcnRfY21kKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCk7CiAKIGV4dGVybiB2b2lkICpzY3NpX2ttYXBfYXRvbWljX3NnKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBzZ19jb3VudCwKIAkJCQkgc2l6ZV90ICpvZmZzZXQsIHNpemVfdCAqbGVuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2hvc3QuaAppbmRleCBkZTZjZTU0Li5hNDJlZmQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3Njc2kvc2NzaV9ob3N0LmgKKysrIGIvaW5jbHVkZS9zY3NpL3Njc2lfaG9zdC5oCkBAIC00NzIsNiArNDcyLDcgQEAKIAkgKi8KIAl1bnNpZ25lZCBpbnQgaG9zdF9idXN5OwkJICAgLyogY29tbWFuZHMgYWN0dWFsbHkgYWN0aXZlIG9uIGxvdy1sZXZlbCAqLwogCXVuc2lnbmVkIGludCBob3N0X2ZhaWxlZDsJICAgLyogY29tbWFuZHMgdGhhdCBmYWlsZWQuICovCisJdW5zaWduZWQgaW50IGhvc3RfZWhfc2NoZWR1bGVkOyAgICAvKiBFSCBzY2hlZHVsZWQgd2l0aG91dCBjb21tYW5kICovCiAgICAgCiAJdW5zaWduZWQgc2hvcnQgaG9zdF9ubzsgIC8qIFVzZWQgZm9yIElPQ1RMX0dFVF9JRExVTiwgL3Byb2Mvc2NzaSBldCBhbC4gKi8KIAlpbnQgcmVzZXR0aW5nOyAvKiBpZiBzZXQsIGl0IG1lYW5zIHRoYXQgbGFzdF9yZXNldCBpcyBhIHZhbGlkIHZhbHVlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2FjOTdfY29kZWMuaCBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCmluZGV4IGI0NWE3MzcuLjQ0NmFmYzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCisrKyBiL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oCkBAIC0zNzgsNiArMzc4LDcgQEAKICNkZWZpbmUgQUM5N19IQVNfTk9fTUlDCSgxPDwxNSkgLyogbm8gTUlDIHZvbHVtZSAqLwogI2RlZmluZSBBQzk3X0hBU19OT19UT05FCSgxPDwxNikgLyogbm8gVG9uZSB2b2x1bWUgKi8KICNkZWZpbmUgQUM5N19IQVNfTk9fU1REX1BDTQkoMTw8MTcpCS8qIG5vIHN0YW5kYXJkIEFDOTcgUENNIHZvbHVtZSBhbmQgbXV0ZSAqLworI2RlZmluZSBBQzk3X0hBU19OT19BVVgJCSgxPDwxOCkgLyogbm8gc3RhbmRhcmQgQUM5NyBBVVggdm9sdW1lIGFuZCBtdXRlICovCiAKIC8qIHJhdGVzIGluZGV4ZXMgKi8KICNkZWZpbmUgQUM5N19SQVRFU19GUk9OVF9EQUMJMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9hc2VxdWVuY2VyLmggYi9pbmNsdWRlL3NvdW5kL2FzZXF1ZW5jZXIuaAppbmRleCA2NjkxZTRhLi4zZjJmNDA0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2FzZXF1ZW5jZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kL2FzZXF1ZW5jZXIuaApAQCAtNjA1LDYgKzYwNSwxMCBAQAogI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgKDE8PDExKQkvKiBTYW1wbGluZyBkZXZpY2UgKHN1cHBvcnQgc2FtcGxlIGRvd25sb2FkKSAqLwogI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX1NBTVBMRQkoMTw8MTIpCS8qIFNhbXBsaW5nIGRldmljZSAoc2FtcGxlIGNhbiBiZSBkb3dubG9hZGVkIGF0IGFueSB0aW1lKSAqLwogLyouLi4qLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFCSgxPDwxNikJLyogZHJpdmVyIGZvciBhIGhhcmR3YXJlIGRldmljZSAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX1NPRlRXQVJFCSgxPDwxNykJLyogaW1wbGVtZW50ZWQgaW4gc29mdHdhcmUgKi8KKyNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USEVTSVpFUgkoMTw8MTgpCS8qIGdlbmVyYXRlcyBzb3VuZCAqLworI2RlZmluZSBTTkRSVl9TRVFfUE9SVF9UWVBFX1BPUlQJKDE8PDE5KQkvKiBjb25uZWN0cyB0byBvdGhlciBkZXZpY2UocykgKi8KICNkZWZpbmUgU05EUlZfU0VRX1BPUlRfVFlQRV9BUFBMSUNBVElPTgkoMTw8MjApCS8qIGFwcGxpY2F0aW9uIChzZXF1ZW5jZXIvZWRpdG9yKSAqLwogCiAvKiBtaXNjLiBjb25kaXRpb25pbmcgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYXNvdW5kLmggYi9pbmNsdWRlL3NvdW5kL2Fzb3VuZC5oCmluZGV4IDljYzAyMWMuLjQxODg1ZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvYXNvdW5kLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hc291bmQuaApAQCAtMTM3LDcgKzEzNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBTTkRSVl9QQ01fVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCA3KQorI2RlZmluZSBTTkRSVl9QQ01fVkVSU0lPTgkJU05EUlZfUFJPVE9DT0xfVkVSU0lPTigyLCAwLCA4KQogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc25kX3BjbV91ZnJhbWVzX3Q7CiB0eXBlZGVmIHNpZ25lZCBsb25nIHNuZF9wY21fc2ZyYW1lc190OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9jb3JlLmggYi9pbmNsdWRlL3NvdW5kL2NvcmUuaAppbmRleCA1MTM1MTQ3Li41ZDE4NGJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL2NvcmUuaAorKysgYi9pbmNsdWRlL3NvdW5kL2NvcmUuaApAQCAtMjMzLDkgKzIzMyw4IEBACiAKIC8qIGluaXQuYyAqLwogCi1leHRlcm4gdW5zaWduZWQgaW50IHNuZF9jYXJkc19sb2NrOwogZXh0ZXJuIHN0cnVjdCBzbmRfY2FyZCAqc25kX2NhcmRzW1NORFJWX0NBUkRTXTsKLWV4dGVybiByd2xvY2tfdCBzbmRfY2FyZF9yd2xvY2s7CitpbnQgc25kX2NhcmRfbG9ja2VkKGludCBjYXJkKTsKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKICNkZWZpbmUgU05EX01JWEVSX09TU19OT1RJRllfUkVHSVNURVIJMAogI2RlZmluZSBTTkRfTUlYRVJfT1NTX05PVElGWV9ESVNDT05ORUNUCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvZW11MTBrMS5oIGIvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKaW5kZXggMTg2ZTAwYS4uODg0YmJmNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9lbXUxMGsxLmgKQEAgLTI0NSw2ICsyNDUsNyBAQAogI2RlZmluZSBBX0lPQ0ZHX0dQT1VUMAkJMHgwMDQ0CQkvKiBhbmFsb2cvZGlnaXRhbAkJCQkqLwogI2RlZmluZSBBX0lPQ0ZHX0RJU0FCTEVfQU5BTE9HCTB4MDA0MAkJLyogPSAnZW5hYmxlJyBmb3IgQXVkaWd5MiAoY2hpcHJldj00KQkJKi8KICNkZWZpbmUgQV9JT0NGR19FTkFCTEVfRElHSVRBTAkweDAwMDQKKyNkZWZpbmUgQV9JT0NGR19FTkFCTEVfRElHSVRBTF9BVURJR1k0CTB4MDA4MAogI2RlZmluZSBBX0lPQ0ZHX1VOS05PV05fMjAgICAgICAweDAwMjAKICNkZWZpbmUgQV9JT0NGR19ESVNBQkxFX0FDOTdfRlJPTlQgICAgICAweDAwODAgIC8qIHR1cm4gb2ZmIGFjOTcgZnJvbnQgLT4gZnJvbnQgKDEwazIuMSkJKi8KICNkZWZpbmUgQV9JT0NGR19HUE9VVDEJCTB4MDAwMgkJLyogSVI/IGRyaXZlJ3MgaW50ZXJuYWwgYnlwYXNzICg/KQkJKi8KQEAgLTEwNjUsNiArMTA2Niw3IEBACiAJdW5zaWduZWQgY2hhciBlbXUxMjEybTsgICAgIC8qIEVNVSAxMjEybSBjYXJkICovCiAJdW5zaWduZWQgY2hhciBzcGlfZGFjOyAgICAgIC8qIFNQSSBpbnRlcmZhY2UgZm9yIERBQyAqLwogCXVuc2lnbmVkIGNoYXIgaTJjX2FkYzsgICAgICAvKiBJMkMgaW50ZXJmYWNlIGZvciBBREMgKi8KKwl1bnNpZ25lZCBjaGFyIGFkY18xMzYxdDsgICAgLyogVXNlIFBoaWxpcHMgMTM2MVQgQURDICovCiAJY29uc3QgY2hhciAqZHJpdmVyOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJY29uc3QgY2hhciAqaWQ7CQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIGNhbiBiZSBOVUxMIGlmIG5vdCBuZWVkZWQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvaW5mby5oIGIvaW5jbHVkZS9zb3VuZC9pbmZvLmgKaW5kZXggZjIzZDgzOC4uNzRmNjk5NjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvaW5mby5oCisrKyBiL2luY2x1ZGUvc291bmQvaW5mby5oCkBAIC0yNyw5ICsyNyw5IEBACiAvKiBidWZmZXIgZm9yIGluZm9ybWF0aW9uICovCiBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyIHsKIAljaGFyICpidWZmZXI7CQkvKiBwb2ludGVyIHRvIGJlZ2luIG9mIGJ1ZmZlciAqLwotCWNoYXIgKmN1cnI7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGJ1ZmZlciAqLwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsJLyogY3VycmVudCBzaXplICovCi0JdW5zaWduZWQgbG9uZyBsZW47CS8qIHRvdGFsIGxlbmd0aCBvZiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgY3VycjsJLyogY3VycmVudCBwb3NpdGlvbiBpbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgc2l6ZTsJLyogY3VycmVudCBzaXplICovCisJdW5zaWduZWQgaW50IGxlbjsJLyogdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlciAqLwogCWludCBzdG9wOwkJLyogc3RvcCBmbGFnICovCiAJaW50IGVycm9yOwkJLyogZXJyb3IgY29kZSAqLwogfTsKQEAgLTQwLDggKzQwLDYgQEAKIHN0cnVjdCBzbmRfaW5mb19lbnRyeTsKIAogc3RydWN0IHNuZF9pbmZvX2VudHJ5X3RleHQgewotCXVuc2lnbmVkIGxvbmcgcmVhZF9zaXplOwotCXVuc2lnbmVkIGxvbmcgd3JpdGVfc2l6ZTsKIAl2b2lkICgqcmVhZCkgKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcik7CiAJdm9pZCAoKndyaXRlKSAoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKTsKIH07CkBAIC0xMzIsMTEgKzEzMCw5IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaW5mb19zZXRfdGV4dF9vcHMoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwgCiAJCQkJCSB2b2lkICpwcml2YXRlX2RhdGEsCi0JCQkJCSBsb25nIHJlYWRfc2l6ZSwKIAkJCQkJIHZvaWQgKCpyZWFkKShzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKiwgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqKSkKIHsKIAllbnRyeS0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOwotCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gcmVhZF9zaXplOwogCWVudHJ5LT5jLnRleHQucmVhZCA9IHJlYWQ7CiB9CiAKQEAgLTE2Nyw3ICsxNjMsNiBAQAogCQkJCSAgICBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKiplbnRyeXApIHsgcmV0dXJuIC1FSU5WQUw7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaW5mb19zZXRfdGV4dF9vcHMoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSwKIAkJCQkJIHZvaWQgKnByaXZhdGVfZGF0YSwKLQkJCQkJIGxvbmcgcmVhZF9zaXplLAogCQkJCQkgdm9pZCAoKnJlYWQpKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqLCBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICopKSB7fQogCiBzdGF0aWMgaW5saW5lIGludCBzbmRfaW5mb19jaGVja19yZXNlcnZlZF93b3Jkcyhjb25zdCBjaGFyICpzdHIpIHsgcmV0dXJuIDE7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmggYi9pbmNsdWRlL3NvdW5kL21wdTQwMS5oCmluZGV4IDhlOTdhY2UuLmFjNTA0MzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvbXB1NDAxLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9tcHU0MDEuaApAQCAtNDUsNiArNDUsMTIgQEAKICNkZWZpbmUgTVBVNDAxX0hXX1BDOThJSQkJMTgJLyogUm9sYW5kIFBDOThJSSAqLwogI2RlZmluZSBNUFU0MDFfSFdfQVVSRUFMCQkxOQkvKiBBdXJlYWwgVm9ydGV4ICovCiAKKyNkZWZpbmUgTVBVNDAxX0lORk9fSU5QVVQJKDEgPDwgMCkJLyogaW5wdXQgc3RyZWFtICovCisjZGVmaW5lIE1QVTQwMV9JTkZPX09VVFBVVAkoMSA8PCAxKQkvKiBvdXRwdXQgc3RyZWFtICovCisjZGVmaW5lIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQJKDEgPDwgMikJLyogaW50ZWdyYXRlZCBoL3cgcG9ydCAqLworI2RlZmluZSBNUFU0MDFfSU5GT19NTUlPCSgxIDw8IDMpCS8qIE1NSU8gYWNjZXNzICovCisjZGVmaW5lIE1QVTQwMV9JTkZPX1RYX0lSUQkoMSA8PCA0KQkvKiBpbmRlcGVuZGVudCBUWCBpcnEgKi8KKwogI2RlZmluZSBNUFU0MDFfTU9ERV9CSVRfSU5QVVQJCTAKICNkZWZpbmUgTVBVNDAxX01PREVfQklUX09VVFBVVAkJMQogI2RlZmluZSBNUFU0MDFfTU9ERV9CSVRfSU5QVVRfVFJJR0dFUgkyCkBAIC02Miw2ICs2OCw3IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAogCXVuc2lnbmVkIHNob3J0IGhhcmR3YXJlOwkvKiBNUFU0MDFfSFdfWFhYWCAqLworCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzOwkvKiBNUFU0MDFfSU5GT19YWFggKi8KIAl1bnNpZ25lZCBsb25nIHBvcnQ7CQkvKiBiYXNlIHBvcnQgb2YgTVBVLTQwMSBjaGlwICovCiAJdW5zaWduZWQgbG9uZyBjcG9ydDsJCS8qIHBvcnQgKyAxICh1c3VhbGx5KSAqLwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwkJLyogcG9ydCByZXNvdXJjZSAqLwpAQCAtOTksMTMgKzEwNiwxNiBAQAogCiAgKi8KIAotaXJxcmV0dXJuX3Qgc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2lycXJldHVybl90IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2lycXJldHVybl90IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHRfdHgoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogCiBpbnQgc25kX21wdTQwMV91YXJ0X25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCQlpbnQgZGV2aWNlLAogCQkJdW5zaWduZWQgc2hvcnQgaGFyZHdhcmUsCiAJCQl1bnNpZ25lZCBsb25nIHBvcnQsCi0JCQlpbnQgaW50ZWdyYXRlZCwKKwkJCXVuc2lnbmVkIGludCBpbmZvX2ZsYWdzLAogCQkJaW50IGlycSwKIAkJCWludCBpcnFfZmxhZ3MsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY20uaCBiL2luY2x1ZGUvc291bmQvcGNtLmgKaW5kZXggMzczNDI1OC4uZjg0ZDg0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY20uaAorKysgYi9pbmNsdWRlL3NvdW5kL3BjbS5oCkBAIC0zMDAsNyArMzAwLDYgQEAKIAkvKiAtLSBtbWFwIC0tICovCiAJdm9sYXRpbGUgc3RydWN0IHNuZF9wY21fbW1hcF9zdGF0dXMgKnN0YXR1czsKIAl2b2xhdGlsZSBzdHJ1Y3Qgc25kX3BjbV9tbWFwX2NvbnRyb2wgKmNvbnRyb2w7Ci0JYXRvbWljX3QgbW1hcF9jb3VudDsKIAogCS8qIC0tIGxvY2tpbmcgLyBzY2hlZHVsaW5nIC0tICovCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgc2xlZXA7CkBAIC0zNjgsNyArMzY3LDkgQEAKIAlzdHJ1Y3Qgc25kX3BjbV9ncm91cCAqZ3JvdXA7CQkvKiBwb2ludGVyIHRvIGN1cnJlbnQgZ3JvdXAgKi8KIAkvKiAtLSBhc3NpZ25lZCBmaWxlcyAtLSAqLwogCXZvaWQgKmZpbGU7Ci0Jc3RydWN0IGZpbGUgKmZmaWxlOworCWludCByZWZfY291bnQ7CisJYXRvbWljX3QgbW1hcF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgZl9mbGFnczsKIAl2b2lkICgqcGNtX3JlbGVhc2UpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqKTsKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQogCS8qIC0tIE9TUyB0aGluZ3MgLS0gKi8KQEAgLTM4Nyw3ICszODgsNyBAQAogCXVuc2lnbmVkIGludCBod19vcGVuZWQ6IDE7CiB9OwogCi0jZGVmaW5lIFNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkgKChzdWJzdHJlYW0pLT5maWxlICE9IE5VTEwpCisjZGVmaW5lIFNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkgKChzdWJzdHJlYW0pLT5yZWZfY291bnQgPiAwKQogCiAKIHN0cnVjdCBzbmRfcGNtX3N0ciB7CkBAIC04MjUsMTQgKzgyNiw2IEBACiAKIHZvaWQgX3NuZF9wY21faHdfcGFyYW1zX2FueShzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyk7CiB2b2lkIF9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyKTsKLWludCBzbmRfcGNtX2h3X3BhcmFtX25lYXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIAotCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgCi0JCQkgIHVuc2lnbmVkIGludCB2YWwsIGludCAqZGlyKTsKLWludCBzbmRfcGNtX2h3X3BhcmFtX3NldChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwKLQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLAotCQkJIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOwogaW50IHNuZF9wY21faHdfcGFyYW1zX2Nob29zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpOwogCiBpbnQgc25kX3BjbV9od19yZWZpbmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKTsKQEAgLTk3OSwxMyArOTcyLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX3BjbV9tbWFwX2RhdGFfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCiB7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICopYXJlYS0+dm1fcHJpdmF0ZV9kYXRhOwotCWF0b21pY19pbmMoJnN1YnN0cmVhbS0+cnVudGltZS0+bW1hcF9jb3VudCk7CisJYXRvbWljX2luYygmc3Vic3RyZWFtLT5tbWFwX2NvdW50KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNuZF9wY21fbW1hcF9kYXRhX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKilhcmVhLT52bV9wcml2YXRlX2RhdGE7Ci0JYXRvbWljX2RlYygmc3Vic3RyZWFtLT5ydW50aW1lLT5tbWFwX2NvdW50KTsKKwlhdG9taWNfZGVjKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpOwogfQogCiAvKiBtbWFwIGZvciBpby1tZW1vcnkgYXJlYSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmggYi9pbmNsdWRlL3NvdW5kL3BjbV9wYXJhbXMuaAppbmRleCBmYjE4YWVmNy4uODVjZjFjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmgKQEAgLTIyLDI5ICsyMiwyMSBAQAogICoKICAqLwogCi1leHRlcm4gaW50IHNuZF9wY21faHdfcGFyYW1fbWFzayhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqdmFsKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgc25kX3BjbV9od19wYXJhbV92YWx1ZV9taW4oY29uc3Qgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJCSAgICAgICBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBpbnQgKmRpcik7Ci1leHRlcm4gdW5zaWduZWQgaW50IHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWF4KGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCQkgICAgICAgc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpOwotZXh0ZXJuIGludCBfc25kX3BjbV9od19wYXJhbV9taW4oc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpOwotZXh0ZXJuIGludCBfc25kX3BjbV9od19wYXJhbV9zZXRpbnRlZ2VyKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCQlzbmRfcGNtX2h3X3BhcmFtX3QgdmFyKTsKLWV4dGVybiBpbnQgX3NuZF9wY21faHdfcGFyYW1fc2V0KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCSBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKTsKLQotLyogVG8gc2hhcmUgdGhlIHNhbWUgY29kZSB3ZSBoYXZlICBhbHNhLWxpYiAqLwotI2RlZmluZSBJTkxJTkUgc3RhdGljIGlubGluZQotI2RlZmluZSBhc3NlcnQoYSkgKHZvaWQpKGEpCitpbnQgc25kX3BjbV9od19wYXJhbV9maXJzdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwgCisJCQkgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIGludCAqZGlyKTsKK2ludCBzbmRfcGNtX2h3X3BhcmFtX2xhc3Qoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIAorCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpOworaW50IHNuZF9wY21faHdfcGFyYW1fdmFsdWUoY29uc3Qgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBpbnQgKmRpcik7CiAKICNkZWZpbmUgU05EUlZfTUFTS19CSVRTCTY0CS8qIHdlIHVzZSBzbyBmYXIgNjRiaXRzIG9ubHkgKi8KICNkZWZpbmUgU05EUlZfTUFTS19TSVpFCShTTkRSVl9NQVNLX0JJVFMgLyAzMikKICNkZWZpbmUgTUFTS19PRlMoaSkJKChpKSA+PiA1KQogI2RlZmluZSBNQVNLX0JJVChpKQkoMVUgPDwgKChpKSAmIDMxKSkKIAotSU5MSU5FIHVuc2lnbmVkIGludCBsZDIodV9pbnQzMl90IHYpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBsZDIodV9pbnQzMl90IHYpCiB7CiAgICAgICAgIHVuc2lnbmVkIHIgPSAwOwogCkBAIC02OSwyMiArNjEsMjIgQEAKICAgICAgICAgcmV0dXJuIHI7CiB9CiAKLUlOTElORSBzaXplX3Qgc25kX21hc2tfc2l6ZW9mKHZvaWQpCitzdGF0aWMgaW5saW5lIHNpemVfdCBzbmRfbWFza19zaXplb2Yodm9pZCkKIHsKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzbmRfbWFzayk7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9tYXNrX25vbmUoc3RydWN0IHNuZF9tYXNrICptYXNrKQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9tYXNrX25vbmUoc3RydWN0IHNuZF9tYXNrICptYXNrKQogewogCW1lbXNldChtYXNrLCAwLCBzaXplb2YoKm1hc2spKTsKIH0KIAotSU5MSU5FIHZvaWQgc25kX21hc2tfYW55KHN0cnVjdCBzbmRfbWFzayAqbWFzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbWFza19hbnkoc3RydWN0IHNuZF9tYXNrICptYXNrKQogewogCW1lbXNldChtYXNrLCAweGZmLCBTTkRSVl9NQVNLX1NJWkUgKiBzaXplb2YodV9pbnQzMl90KSk7CiB9CiAKLUlOTElORSBpbnQgc25kX21hc2tfZW1wdHkoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrKQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfZW1wdHkoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrKQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9NQVNLX1NJWkU7IGkrKykKQEAgLTkzLDEwICs4NSw5IEBACiAJcmV0dXJuIDE7CiB9CiAKLUlOTElORSB1bnNpZ25lZCBpbnQgc25kX21hc2tfbWluKGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqbWFzaykKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9tYXNrX21pbihjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKm1hc2spCiB7CiAJaW50IGk7Ci0JYXNzZXJ0KCFzbmRfbWFza19lbXB0eShtYXNrKSk7CiAJZm9yIChpID0gMDsgaSA8IFNORFJWX01BU0tfU0laRTsgaSsrKSB7CiAJCWlmIChtYXNrLT5iaXRzW2ldKQogCQkJcmV0dXJuIGZmcyhtYXNrLT5iaXRzW2ldKSAtIDEgKyAoaSA8PCA1KTsKQEAgLTEwNCwxMCArOTUsOSBAQAogCXJldHVybiAwOwogfQogCi1JTkxJTkUgdW5zaWduZWQgaW50IHNuZF9tYXNrX21heChjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKm1hc2spCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbmRfbWFza19tYXgoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrKQogewogCWludCBpOwotCWFzc2VydCghc25kX21hc2tfZW1wdHkobWFzaykpOwogCWZvciAoaSA9IFNORFJWX01BU0tfU0laRSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChtYXNrLT5iaXRzW2ldKQogCQkJcmV0dXJuIGxkMihtYXNrLT5iaXRzW2ldKSArIChpIDw8IDUpOwpAQCAtMTE1LDcwICsxMDUsNjggQEAKIAlyZXR1cm4gMDsKIH0KIAotSU5MSU5FIHZvaWQgc25kX21hc2tfc2V0KHN0cnVjdCBzbmRfbWFzayAqbWFzaywgdW5zaWduZWQgaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbWFza19zZXQoc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewotCWFzc2VydCh2YWwgPD0gU05EUlZfTUFTS19CSVRTKTsKIAltYXNrLT5iaXRzW01BU0tfT0ZTKHZhbCldIHw9IE1BU0tfQklUKHZhbCk7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9tYXNrX3Jlc2V0KHN0cnVjdCBzbmRfbWFzayAqbWFzaywgdW5zaWduZWQgaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfbWFza19yZXNldChzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JYXNzZXJ0KHZhbCA8PSBTTkRSVl9NQVNLX0JJVFMpOwogCW1hc2stPmJpdHNbTUFTS19PRlModmFsKV0gJj0gfk1BU0tfQklUKHZhbCk7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9tYXNrX3NldF9yYW5nZShzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCBmcm9tLCB1bnNpZ25lZCBpbnQgdG8pCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX21hc2tfc2V0X3JhbmdlKHN0cnVjdCBzbmRfbWFzayAqbWFzaywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvKQogewogCXVuc2lnbmVkIGludCBpOwotCWFzc2VydCh0byA8PSBTTkRSVl9NQVNLX0JJVFMgJiYgZnJvbSA8PSB0byk7CiAJZm9yIChpID0gZnJvbTsgaSA8PSB0bzsgaSsrKQogCQltYXNrLT5iaXRzW01BU0tfT0ZTKGkpXSB8PSBNQVNLX0JJVChpKTsKIH0KIAotSU5MSU5FIHZvaWQgc25kX21hc2tfcmVzZXRfcmFuZ2Uoc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgZnJvbSwgdW5zaWduZWQgaW50IHRvKQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9tYXNrX3Jlc2V0X3JhbmdlKHN0cnVjdCBzbmRfbWFzayAqbWFzaywKKwkJCQkJdW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlhc3NlcnQodG8gPD0gU05EUlZfTUFTS19CSVRTICYmIGZyb20gPD0gdG8pOwogCWZvciAoaSA9IGZyb207IGkgPD0gdG87IGkrKykKIAkJbWFzay0+Yml0c1tNQVNLX09GUyhpKV0gJj0gfk1BU0tfQklUKGkpOwogfQogCi1JTkxJTkUgdm9pZCBzbmRfbWFza19sZWF2ZShzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX21hc2tfbGVhdmUoc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCXVuc2lnbmVkIGludCB2OwotCWFzc2VydCh2YWwgPD0gU05EUlZfTUFTS19CSVRTKTsKIAl2ID0gbWFzay0+Yml0c1tNQVNLX09GUyh2YWwpXSAmIE1BU0tfQklUKHZhbCk7CiAJc25kX21hc2tfbm9uZShtYXNrKTsKIAltYXNrLT5iaXRzW01BU0tfT0ZTKHZhbCldID0gdjsKIH0KIAotSU5MSU5FIHZvaWQgc25kX21hc2tfaW50ZXJzZWN0KHN0cnVjdCBzbmRfbWFzayAqbWFzaywgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2KQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9tYXNrX2ludGVyc2VjdChzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2KQogewogCWludCBpOwogCWZvciAoaSA9IDA7IGkgPCBTTkRSVl9NQVNLX1NJWkU7IGkrKykKIAkJbWFzay0+Yml0c1tpXSAmPSB2LT5iaXRzW2ldOwogfQogCi1JTkxJTkUgaW50IHNuZF9tYXNrX2VxKGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqbWFzaywgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2KQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfZXEoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2KQogewogCXJldHVybiAhIG1lbWNtcChtYXNrLCB2LCBTTkRSVl9NQVNLX1NJWkUgKiBzaXplb2YodV9pbnQzMl90KSk7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9tYXNrX2NvcHkoc3RydWN0IHNuZF9tYXNrICptYXNrLCBjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKnYpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX21hc2tfY29weShzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssCisJCQkJIGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqdikKIHsKIAkqbWFzayA9ICp2OwogfQogCi1JTkxJTkUgaW50IHNuZF9tYXNrX3Rlc3QoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfdGVzdChjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JYXNzZXJ0KHZhbCA8PSBTTkRSVl9NQVNLX0JJVFMpOwogCXJldHVybiBtYXNrLT5iaXRzW01BU0tfT0ZTKHZhbCldICYgTUFTS19CSVQodmFsKTsKIH0KIAotSU5MSU5FIGludCBzbmRfbWFza19zaW5nbGUoY29uc3Qgc3RydWN0IHNuZF9tYXNrICptYXNrKQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfc2luZ2xlKGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqbWFzaykKIHsKIAlpbnQgaSwgYyA9IDA7Ci0JYXNzZXJ0KCFzbmRfbWFza19lbXB0eShtYXNrKSk7CiAJZm9yIChpID0gMDsgaSA8IFNORFJWX01BU0tfU0laRTsgaSsrKSB7CiAJCWlmICghIG1hc2stPmJpdHNbaV0pCiAJCQljb250aW51ZTsKQEAgLTE5MSwxMCArMTc5LDEwIEBACiAJcmV0dXJuIDE7CiB9CiAKLUlOTElORSBpbnQgc25kX21hc2tfcmVmaW5lKHN0cnVjdCBzbmRfbWFzayAqbWFzaywgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2KQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfcmVmaW5lKHN0cnVjdCBzbmRfbWFzayAqbWFzaywKKwkJCQkgIGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqdikKIHsKIAlzdHJ1Y3Qgc25kX21hc2sgb2xkOwotCWFzc2VydCghc25kX21hc2tfZW1wdHkobWFzaykpOwogCXNuZF9tYXNrX2NvcHkoJm9sZCwgbWFzayk7CiAJc25kX21hc2tfaW50ZXJzZWN0KG1hc2ssIHYpOwogCWlmIChzbmRfbWFza19lbXB0eShtYXNrKSkKQEAgLTIwMiwyNyArMTkwLDI0IEBACiAJcmV0dXJuICFzbmRfbWFza19lcShtYXNrLCAmb2xkKTsKIH0KIAotSU5MSU5FIGludCBzbmRfbWFza19yZWZpbmVfZmlyc3Qoc3RydWN0IHNuZF9tYXNrICptYXNrKQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfcmVmaW5lX2ZpcnN0KHN0cnVjdCBzbmRfbWFzayAqbWFzaykKIHsKLQlhc3NlcnQoIXNuZF9tYXNrX2VtcHR5KG1hc2spKTsKIAlpZiAoc25kX21hc2tfc2luZ2xlKG1hc2spKQogCQlyZXR1cm4gMDsKIAlzbmRfbWFza19sZWF2ZShtYXNrLCBzbmRfbWFza19taW4obWFzaykpOwogCXJldHVybiAxOwogfQogCi1JTkxJTkUgaW50IHNuZF9tYXNrX3JlZmluZV9sYXN0KHN0cnVjdCBzbmRfbWFzayAqbWFzaykKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9tYXNrX3JlZmluZV9sYXN0KHN0cnVjdCBzbmRfbWFzayAqbWFzaykKIHsKLQlhc3NlcnQoIXNuZF9tYXNrX2VtcHR5KG1hc2spKTsKIAlpZiAoc25kX21hc2tfc2luZ2xlKG1hc2spKQogCQlyZXR1cm4gMDsKIAlzbmRfbWFza19sZWF2ZShtYXNrLCBzbmRfbWFza19tYXgobWFzaykpOwogCXJldHVybiAxOwogfQogCi1JTkxJTkUgaW50IHNuZF9tYXNrX3JlZmluZV9taW4oc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGlubGluZSBpbnQgc25kX21hc2tfcmVmaW5lX21pbihzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JYXNzZXJ0KCFzbmRfbWFza19lbXB0eShtYXNrKSk7CiAJaWYgKHNuZF9tYXNrX21pbihtYXNrKSA+PSB2YWwpCiAJCXJldHVybiAwOwogCXNuZF9tYXNrX3Jlc2V0X3JhbmdlKG1hc2ssIDAsIHZhbCAtIDEpOwpAQCAtMjMxLDkgKzIxNiw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLUlOTElORSBpbnQgc25kX21hc2tfcmVmaW5lX21heChzdHJ1Y3Qgc25kX21hc2sgKm1hc2ssIHVuc2lnbmVkIGludCB2YWwpCitzdGF0aWMgaW5saW5lIGludCBzbmRfbWFza19yZWZpbmVfbWF4KHN0cnVjdCBzbmRfbWFzayAqbWFzaywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQlhc3NlcnQoIXNuZF9tYXNrX2VtcHR5KG1hc2spKTsKIAlpZiAoc25kX21hc2tfbWF4KG1hc2spIDw9IHZhbCkKIAkJcmV0dXJuIDA7CiAJc25kX21hc2tfcmVzZXRfcmFuZ2UobWFzaywgdmFsICsgMSwgU05EUlZfTUFTS19CSVRTKTsKQEAgLTI0MiwxMCArMjI2LDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotSU5MSU5FIGludCBzbmRfbWFza19yZWZpbmVfc2V0KHN0cnVjdCBzbmRfbWFzayAqbWFzaywgdW5zaWduZWQgaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9tYXNrX3JlZmluZV9zZXQoc3RydWN0IHNuZF9tYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQogewogCWludCBjaGFuZ2VkOwotCWFzc2VydCghc25kX21hc2tfZW1wdHkobWFzaykpOwogCWNoYW5nZWQgPSAhc25kX21hc2tfc2luZ2xlKG1hc2spOwogCXNuZF9tYXNrX2xlYXZlKG1hc2ssIHZhbCk7CiAJaWYgKHNuZF9tYXNrX2VtcHR5KG1hc2spKQpAQCAtMjUzLDEzICsyMzYsMTIgQEAKIAlyZXR1cm4gY2hhbmdlZDsKIH0KIAotSU5MSU5FIGludCBzbmRfbWFza192YWx1ZShjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKm1hc2spCitzdGF0aWMgaW5saW5lIGludCBzbmRfbWFza192YWx1ZShjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKm1hc2spCiB7Ci0JYXNzZXJ0KCFzbmRfbWFza19lbXB0eShtYXNrKSk7CiAJcmV0dXJuIHNuZF9tYXNrX21pbihtYXNrKTsKIH0KIAotSU5MSU5FIHZvaWQgc25kX2ludGVydmFsX2FueShzdHJ1Y3Qgc25kX2ludGVydmFsICppKQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9pbnRlcnZhbF9hbnkoc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKIHsKIAlpLT5taW4gPSAwOwogCWktPm9wZW5taW4gPSAwOwpAQCAtMjY5LDYzICsyNTEsNTkgQEAKIAlpLT5lbXB0eSA9IDA7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9pbnRlcnZhbF9ub25lKHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ludGVydmFsX25vbmUoc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKIHsKIAlpLT5lbXB0eSA9IDE7CiB9CiAKLUlOTElORSBpbnQgc25kX2ludGVydmFsX2NoZWNrZW1wdHkoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9pbnRlcnZhbF9jaGVja2VtcHR5KGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCiB7CiAJcmV0dXJuIChpLT5taW4gPiBpLT5tYXggfHwKIAkJKGktPm1pbiA9PSBpLT5tYXggJiYgKGktPm9wZW5taW4gfHwgaS0+b3Blbm1heCkpKTsKIH0KIAotSU5MSU5FIGludCBzbmRfaW50ZXJ2YWxfZW1wdHkoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9pbnRlcnZhbF9lbXB0eShjb25zdCBzdHJ1Y3Qgc25kX2ludGVydmFsICppKQogewogCXJldHVybiBpLT5lbXB0eTsKIH0KIAotSU5MSU5FIGludCBzbmRfaW50ZXJ2YWxfc2luZ2xlKGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCitzdGF0aWMgaW5saW5lIGludCBzbmRfaW50ZXJ2YWxfc2luZ2xlKGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCiB7Ci0JYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpOwogCXJldHVybiAoaS0+bWluID09IGktPm1heCB8fCAKIAkJKGktPm1pbiArIDEgPT0gaS0+bWF4ICYmIGktPm9wZW5tYXgpKTsKIH0KIAotSU5MSU5FIGludCBzbmRfaW50ZXJ2YWxfdmFsdWUoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9pbnRlcnZhbF92YWx1ZShjb25zdCBzdHJ1Y3Qgc25kX2ludGVydmFsICppKQogewotCWFzc2VydChzbmRfaW50ZXJ2YWxfc2luZ2xlKGkpKTsKIAlyZXR1cm4gaS0+bWluOwogfQogCi1JTkxJTkUgaW50IHNuZF9pbnRlcnZhbF9taW4oY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9pbnRlcnZhbF9taW4oY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSkKIHsKLQlhc3NlcnQoIXNuZF9pbnRlcnZhbF9lbXB0eShpKSk7CiAJcmV0dXJuIGktPm1pbjsKIH0KIAotSU5MSU5FIGludCBzbmRfaW50ZXJ2YWxfbWF4KGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCitzdGF0aWMgaW5saW5lIGludCBzbmRfaW50ZXJ2YWxfbWF4KGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCiB7CiAJdW5zaWduZWQgaW50IHY7Ci0JYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpOwogCXYgPSBpLT5tYXg7CiAJaWYgKGktPm9wZW5tYXgpCiAJCXYtLTsKIAlyZXR1cm4gdjsKIH0KIAotSU5MSU5FIGludCBzbmRfaW50ZXJ2YWxfdGVzdChjb25zdCBzdHJ1Y3Qgc25kX2ludGVydmFsICppLCB1bnNpZ25lZCBpbnQgdmFsKQorc3RhdGljIGlubGluZSBpbnQgc25kX2ludGVydmFsX3Rlc3QoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaSwgdW5zaWduZWQgaW50IHZhbCkKIHsKIAlyZXR1cm4gISgoaS0+bWluID4gdmFsIHx8IChpLT5taW4gPT0gdmFsICYmIGktPm9wZW5taW4pIHx8CiAJCSAgaS0+bWF4IDwgdmFsIHx8IChpLT5tYXggPT0gdmFsICYmIGktPm9wZW5tYXgpKSk7CiB9CiAKLUlOTElORSB2b2lkIHNuZF9pbnRlcnZhbF9jb3B5KHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmQsIGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKnMpCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2ludGVydmFsX2NvcHkoc3RydWN0IHNuZF9pbnRlcnZhbCAqZCwgY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqcykKIHsKIAkqZCA9ICpzOwogfQogCi1JTkxJTkUgaW50IHNuZF9pbnRlcnZhbF9zZXRpbnRlZ2VyKHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCitzdGF0aWMgaW5saW5lIGludCBzbmRfaW50ZXJ2YWxfc2V0aW50ZWdlcihzdHJ1Y3Qgc25kX2ludGVydmFsICppKQogewogCWlmIChpLT5pbnRlZ2VyKQogCQlyZXR1cm4gMDsKQEAgLTMzNSw3ICszMTMsNyBAQAogCXJldHVybiAxOwogfQogCi1JTkxJTkUgaW50IHNuZF9pbnRlcnZhbF9lcShjb25zdCBzdHJ1Y3Qgc25kX2ludGVydmFsICppMSwgY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaTIpCitzdGF0aWMgaW5saW5lIGludCBzbmRfaW50ZXJ2YWxfZXEoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqaTEsIGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkyKQogewogCWlmIChpMS0+ZW1wdHkpCiAJCXJldHVybiBpMi0+ZW1wdHk7CkBAIC0zNTksOCArMzM3LDUgQEAKIAlyZXR1cm4gMDsKIH0KIAotI3VuZGVmIElOTElORQotI3VuZGVmIGFzc2VydAotCiAjZW5kaWYgLyogX19TT1VORF9QQ01fUEFSQU1TX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9yYXdtaWRpLmggYi9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaAppbmRleCA1ODRlNzNkLi43ZGJjZDEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaAorKysgYi9pbmNsdWRlL3NvdW5kL3Jhd21pZGkuaApAQCAtNDYsNiArNDYsNyBAQAogCiBzdHJ1Y3Qgc25kX3Jhd21pZGk7CiBzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtOworc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvOwogCiBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzIHsKIAlpbnQgKCpvcGVuKSAoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqIHN1YnN0cmVhbSk7CkBAIC01Nyw2ICs1OCw4IEBACiBzdHJ1Y3Qgc25kX3Jhd21pZGlfZ2xvYmFsX29wcyB7CiAJaW50ICgqZGV2X3JlZ2lzdGVyKSAoc3RydWN0IHNuZF9yYXdtaWRpICogcm1pZGkpOwogCWludCAoKmRldl91bnJlZ2lzdGVyKSAoc3RydWN0IHNuZF9yYXdtaWRpICogcm1pZGkpOworCXZvaWQgKCpnZXRfcG9ydF9pbmZvKShzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpLCBpbnQgbnVtYmVyLAorCQkJICAgICAgc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICppbmZvKTsKIH07CiAKIHN0cnVjdCBzbmRfcmF3bWlkaV9ydW50aW1lIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oIGIvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmgKaW5kZXggYTRmNTU0NTIuLmI1MDY3ZDMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCisrKyBiL2luY2x1ZGUvc291bmQvdGVhNTc1eC10dW5lci5oCkBAIC0yMCw5ICsyMCwxMCBAQAogICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKICAqCi0gKi8gICAgICAKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogCiBzdHJ1Y3Qgc25kX3RlYTU3NXg7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvdmVyc2lvbi5oIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKaW5kZXggNGYwZTY1OC4uMmVlODQ5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS9zb3VuZC92ZXJzaW9uLmgKQEAgLTEsMyArMSwzIEBACiAvKiBpbmNsdWRlL3ZlcnNpb24uaC4gIEdlbmVyYXRlZCBieSBjb25maWd1cmUuICAqLwotI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xMXJjNCIKLSNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIgKFdlZCBNYXIgMjIgMTA6Mjc6MjQgMjAwNiBVVEMpIgorI2RlZmluZSBDT05GSUdfU05EX1ZFUlNJT04gIjEuMC4xMnJjMSIKKyNkZWZpbmUgQ09ORklHX1NORF9EQVRFICIgKFRodSBKdW4gMjIgMTM6NTU6NTAgMjAwNiBVVEMpIgpkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGRmODY0YTMuLmUwMzU4ZjMgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTE1MSw3ICsxNTEsOCBAQAogCSAgYXQgPGh0dHA6Ly93d3cucGh5c2lrMy51bmktcm9zdG9jay5kZS90aW0va2VybmVsL3V0aWxzL2FjY3QvPi4KIAogY29uZmlnIFNZU0NUTAotCWJvb2wgIlN5c2N0bCBzdXBwb3J0IgorCWJvb2wgIlN5c2N0bCBzdXBwb3J0IiBpZiBFTUJFRERFRAorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFRoZSBzeXNjdGwgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWVhbnMgb2YgZHluYW1pY2FsbHkgY2hhbmdpbmcKIAkgIGNlcnRhaW4ga2VybmVsIHBhcmFtZXRlcnMgYW5kIHZhcmlhYmxlcyBvbiB0aGUgZmx5IHdpdGhvdXQgcmVxdWlyaW5nCmRpZmYgLS1naXQgYS9pcGMvbXF1ZXVlLmMgYi9pcGMvbXF1ZXVlLmMKaW5kZXggMTUxMTcxNC4uMDJlNmY2NyAxMDA2NDQKLS0tIGEvaXBjL21xdWV1ZS5jCisrKyBiL2lwYy9tcXVldWUuYwpAQCAtMjA1LDExICsyMDUsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbXF1ZXVlX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCi0JCQkJCSB2b2lkICpkYXRhKQorc3RhdGljIGludCBtcXVldWVfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG1xdWV1ZV9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgbXF1ZXVlX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKQEAgLTM1OSw3ICszNTksNyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIGludCBtcXVldWVfZmx1c2hfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3N0YXRpYyBpbnQgbXF1ZXVlX2ZsdXNoX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIGZsX293bmVyX3QgaWQpCiB7CiAJc3RydWN0IG1xdWV1ZV9pbm9kZV9pbmZvICppbmZvID0gTVFVRVVFX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOwogCmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggNGYxMzNkMi4uZmU3YWU3MyAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtNjk4LDcgKzY5OCw2IEBACiAJaW50ICAgIGVycjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgcHJvdDsKLQl1bnNpZ25lZCBsb25nIG9fZmxhZ3M7CiAJaW50IGFjY19tb2RlOwogCXZvaWQgKnVzZXJfYWRkcjsKIApAQCAtNzI1LDExICs3MjQsOSBAQAogCiAJaWYgKHNobWZsZyAmIFNITV9SRE9OTFkpIHsKIAkJcHJvdCA9IFBST1RfUkVBRDsKLQkJb19mbGFncyA9IE9fUkRPTkxZOwogCQlhY2NfbW9kZSA9IFNfSVJVR087CiAJfSBlbHNlIHsKIAkJcHJvdCA9IFBST1RfUkVBRCB8IFBST1RfV1JJVEU7Ci0JCW9fZmxhZ3MgPSBPX1JEV1I7CiAJCWFjY19tb2RlID0gU19JUlVHTyB8IFNfSVdVR087CiAJfQogCWlmIChzaG1mbGcgJiBTSE1fRVhFQykgewpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggYjMyN2Y0ZC4uMzY4YzRmMCAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC03NSw3ICs3NSw3IEBACiAvKgogICogRXh0ZXJuYWwgcmVmZXJlbmNlcyBhbmQgYWxsIG9mIHRoZSBnbG9iYWxzLgogICovCi1zdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3MobG9uZywgc3RydWN0IGZpbGUgKik7CitzdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3Moc3RydWN0IGZpbGUgKik7CiAKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHNvIHRoYXQgYWxsIHRoZSBkYXRhIHByb3RlY3RlZCBieSBsb2NrCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlzcGluX3VubG9jaygmYWNjdF9nbG9iYWxzLmxvY2spOwogCiAJLyogTWF5IGJsb2NrICovCi0JaWYgKHZmc19zdGF0ZnMoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2IsICZzYnVmKSkKKwlpZiAodmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeSwgJnNidWYpKQogCQlyZXR1cm4gcmVzOwogCXN1c3BlbmQgPSBzYnVmLmZfYmxvY2tzICogU1VTUEVORDsKIAlyZXN1bWUgPSBzYnVmLmZfYmxvY2tzICogUkVTVU1FOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJaWYgKG9sZF9hY2N0KSB7CiAJCW1udF91bnBpbihvbGRfYWNjdC0+Zl92ZnNtbnQpOwogCQlzcGluX3VubG9jaygmYWNjdF9nbG9iYWxzLmxvY2spOwotCQlkb19hY2N0X3Byb2Nlc3MoMCwgb2xkX2FjY3QpOworCQlkb19hY2N0X3Byb2Nlc3Mob2xkX2FjY3QpOwogCQlmaWxwX2Nsb3NlKG9sZF9hY2N0LCBOVUxMKTsKIAkJc3Bpbl9sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7CiAJfQpAQCAtNDE5LDE2ICs0MTksMTUgQEAKIC8qCiAgKiAgZG9fYWNjdF9wcm9jZXNzIGRvZXMgYWxsIGFjdHVhbCB3b3JrLiBDYWxsZXIgaG9sZHMgdGhlIHJlZmVyZW5jZSB0byBmaWxlLgogICovCi1zdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3MobG9uZyBleGl0Y29kZSwgc3RydWN0IGZpbGUgKmZpbGUpCitzdGF0aWMgdm9pZCBkb19hY2N0X3Byb2Nlc3Moc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJc3RydWN0IHBhY2N0X3N0cnVjdCAqcGFjY3QgPSAmY3VycmVudC0+c2lnbmFsLT5wYWNjdDsKIAlhY2N0X3QgYWM7CiAJbW1fc2VnbWVudF90IGZzOwotCXVuc2lnbmVkIGxvbmcgdnNpemU7CiAJdW5zaWduZWQgbG9uZyBmbGltOwogCXU2NCBlbGFwc2VkOwogCXU2NCBydW5fdGltZTsKIAlzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOwotCXVuc2lnbmVkIGxvbmcgamlmZmllczsKIAogCS8qCiAJICogRmlyc3QgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGVub3VnaCBmcmVlX3NwYWNlIHRvIGNvbnRpbnVlCkBAIC00NjksMTIgKzQ2OCw2IEBACiAjZW5kaWYKIAlkb19kaXYoZWxhcHNlZCwgQUhaKTsKIAlhYy5hY19idGltZSA9IHh0aW1lLnR2X3NlYyAtIGVsYXBzZWQ7Ci0JamlmZmllcyA9IGNwdXRpbWVfdG9famlmZmllcyhjcHV0aW1lX2FkZChjdXJyZW50LT51dGltZSwKLQkJCQkJCSBjdXJyZW50LT5zaWduYWwtPnV0aW1lKSk7Ci0JYWMuYWNfdXRpbWUgPSBlbmNvZGVfY29tcF90KGppZmZpZXNfdG9fQUhaKGppZmZpZXMpKTsKLQlqaWZmaWVzID0gY3B1dGltZV90b19qaWZmaWVzKGNwdXRpbWVfYWRkKGN1cnJlbnQtPnN0aW1lLAotCQkJCQkJIGN1cnJlbnQtPnNpZ25hbC0+c3RpbWUpKTsKLQlhYy5hY19zdGltZSA9IGVuY29kZV9jb21wX3QoamlmZmllc190b19BSFooamlmZmllcykpOwogCS8qIHdlIHJlYWxseSBuZWVkIHRvIGJpdGUgdGhlIGJ1bGxldCBhbmQgY2hhbmdlIGxheW91dCAqLwogCWFjLmFjX3VpZCA9IGN1cnJlbnQtPnVpZDsKIAlhYy5hY19naWQgPSBjdXJyZW50LT5naWQ7CkBAIC00OTYsMzcgKzQ4OSwxOCBAQAogCQlvbGRfZW5jb2RlX2Rldih0dHlfZGV2bnVtKGN1cnJlbnQtPnNpZ25hbC0+dHR5KSkgOiAwOwogCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKIAotCWFjLmFjX2ZsYWcgPSAwOwotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX0ZPUktOT0VYRUMpCi0JCWFjLmFjX2ZsYWcgfD0gQUZPUks7Ci0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfU1VQRVJQUklWKQotCQlhYy5hY19mbGFnIHw9IEFTVTsKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9EVU1QQ09SRSkKLQkJYWMuYWNfZmxhZyB8PSBBQ09SRTsKLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9TSUdOQUxFRCkKLQkJYWMuYWNfZmxhZyB8PSBBWFNJRzsKLQotCXZzaXplID0gMDsKLQlpZiAoY3VycmVudC0+bW0pIHsKLQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7Ci0JCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKLQkJdm1hID0gY3VycmVudC0+bW0tPm1tYXA7Ci0JCXdoaWxlICh2bWEpIHsKLQkJCXZzaXplICs9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKLQkJCXZtYSA9IHZtYS0+dm1fbmV4dDsKLQkJfQotCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCX0KLQl2c2l6ZSA9IHZzaXplIC8gMTAyNDsKLQlhYy5hY19tZW0gPSBlbmNvZGVfY29tcF90KHZzaXplKTsKKwlzcGluX2xvY2soJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWFjLmFjX3V0aW1lID0gZW5jb2RlX2NvbXBfdChqaWZmaWVzX3RvX0FIWihjcHV0aW1lX3RvX2ppZmZpZXMocGFjY3QtPmFjX3V0aW1lKSkpOworCWFjLmFjX3N0aW1lID0gZW5jb2RlX2NvbXBfdChqaWZmaWVzX3RvX0FIWihjcHV0aW1lX3RvX2ppZmZpZXMocGFjY3QtPmFjX3N0aW1lKSkpOworCWFjLmFjX2ZsYWcgPSBwYWNjdC0+YWNfZmxhZzsKKwlhYy5hY19tZW0gPSBlbmNvZGVfY29tcF90KHBhY2N0LT5hY19tZW0pOworCWFjLmFjX21pbmZsdCA9IGVuY29kZV9jb21wX3QocGFjY3QtPmFjX21pbmZsdCk7CisJYWMuYWNfbWFqZmx0ID0gZW5jb2RlX2NvbXBfdChwYWNjdC0+YWNfbWFqZmx0KTsKKwlhYy5hY19leGl0Y29kZSA9IHBhY2N0LT5hY19leGl0Y29kZTsKKwlzcGluX3VubG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJYWMuYWNfaW8gPSBlbmNvZGVfY29tcF90KDAgLyogY3VycmVudC0+aW9fdXNhZ2UgKi8pOwkvKiAlJSAqLwogCWFjLmFjX3J3ID0gZW5jb2RlX2NvbXBfdChhYy5hY19pbyAvIDEwMjQpOwotCWFjLmFjX21pbmZsdCA9IGVuY29kZV9jb21wX3QoY3VycmVudC0+c2lnbmFsLT5taW5fZmx0ICsKLQkJCQkgICAgIGN1cnJlbnQtPm1pbl9mbHQpOwotCWFjLmFjX21hamZsdCA9IGVuY29kZV9jb21wX3QoY3VycmVudC0+c2lnbmFsLT5tYWpfZmx0ICsKLQkJCQkgICAgIGN1cnJlbnQtPm1hal9mbHQpOwogCWFjLmFjX3N3YXBzID0gZW5jb2RlX2NvbXBfdCgwKTsKLQlhYy5hY19leGl0Y29kZSA9IGV4aXRjb2RlOwogCiAJLyoKICAgICAgICAgICogS2VybmVsIHNlZ21lbnQgb3ZlcnJpZGUgdG8gZGF0YXNlZ21lbnQgYW5kIHdyaXRlIGl0CkBAIC01NDYsMTIgKzUyMCw2MyBAQAogfQogCiAvKioKKyAqIGFjY3RfaW5pdF9wYWNjdCAtIGluaXRpYWxpemUgYSBuZXcgcGFjY3Rfc3RydWN0CisgKi8KK3ZvaWQgYWNjdF9pbml0X3BhY2N0KHN0cnVjdCBwYWNjdF9zdHJ1Y3QgKnBhY2N0KQoreworCW1lbXNldChwYWNjdCwgMCwgc2l6ZW9mKHN0cnVjdCBwYWNjdF9zdHJ1Y3QpKTsKKwlwYWNjdC0+YWNfdXRpbWUgPSBwYWNjdC0+YWNfc3RpbWUgPSBjcHV0aW1lX3plcm87Cit9CisKKy8qKgorICogYWNjdF9jb2xsZWN0IC0gY29sbGVjdCBhY2NvdW50aW5nIGluZm9ybWF0aW9uIGludG8gcGFjY3Rfc3RydWN0CisgKiBAZXhpdGNvZGU6IHRhc2sgZXhpdCBjb2RlCisgKiBAZ3JvdXBfZGVhZDogbm90IDAsIGlmIHRoaXMgdGhyZWFkIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcHJvY2Vzcy4KKyAqLwordm9pZCBhY2N0X2NvbGxlY3QobG9uZyBleGl0Y29kZSwgaW50IGdyb3VwX2RlYWQpCit7CisJc3RydWN0IHBhY2N0X3N0cnVjdCAqcGFjY3QgPSAmY3VycmVudC0+c2lnbmFsLT5wYWNjdDsKKwl1bnNpZ25lZCBsb25nIHZzaXplID0gMDsKKworCWlmIChncm91cF9kZWFkICYmIGN1cnJlbnQtPm1tKSB7CisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCQlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXZtYSA9IGN1cnJlbnQtPm1tLT5tbWFwOworCQl3aGlsZSAodm1hKSB7CisJCQl2c2l6ZSArPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJCQl2bWEgPSB2bWEtPnZtX25leHQ7CisJCX0KKwkJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKKwlpZiAoZ3JvdXBfZGVhZCkKKwkJcGFjY3QtPmFjX21lbSA9IHZzaXplIC8gMTAyNDsKKwlpZiAodGhyZWFkX2dyb3VwX2xlYWRlcihjdXJyZW50KSkgeworCQlwYWNjdC0+YWNfZXhpdGNvZGUgPSBleGl0Y29kZTsKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRk9SS05PRVhFQykKKwkJCXBhY2N0LT5hY19mbGFnIHw9IEFGT1JLOworCX0KKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9TVVBFUlBSSVYpCisJCXBhY2N0LT5hY19mbGFnIHw9IEFTVTsKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9EVU1QQ09SRSkKKwkJcGFjY3QtPmFjX2ZsYWcgfD0gQUNPUkU7CisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfU0lHTkFMRUQpCisJCXBhY2N0LT5hY19mbGFnIHw9IEFYU0lHOworCXBhY2N0LT5hY191dGltZSA9IGNwdXRpbWVfYWRkKHBhY2N0LT5hY191dGltZSwgY3VycmVudC0+dXRpbWUpOworCXBhY2N0LT5hY19zdGltZSA9IGNwdXRpbWVfYWRkKHBhY2N0LT5hY19zdGltZSwgY3VycmVudC0+c3RpbWUpOworCXBhY2N0LT5hY19taW5mbHQgKz0gY3VycmVudC0+bWluX2ZsdDsKKwlwYWNjdC0+YWNfbWFqZmx0ICs9IGN1cnJlbnQtPm1hal9mbHQ7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKK30KKworLyoqCiAgKiBhY2N0X3Byb2Nlc3MgLSBub3cganVzdCBhIHdyYXBwZXIgYXJvdW5kIGRvX2FjY3RfcHJvY2VzcwogICogQGV4aXRjb2RlOiB0YXNrIGV4aXQgY29kZQogICoKICAqIGhhbmRsZXMgcHJvY2VzcyBhY2NvdW50aW5nIGZvciBhbiBleGl0aW5nIHRhc2sKICAqLwotdm9pZCBhY2N0X3Byb2Nlc3MobG9uZyBleGl0Y29kZSkKK3ZvaWQgYWNjdF9wcm9jZXNzKCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IE5VTEw7CiAKQEAgLTU3MCw3ICs1OTUsNyBAQAogCWdldF9maWxlKGZpbGUpOwogCXNwaW5fdW5sb2NrKCZhY2N0X2dsb2JhbHMubG9jayk7CiAKLQlkb19hY2N0X3Byb2Nlc3MoZXhpdGNvZGUsIGZpbGUpOworCWRvX2FjY3RfcHJvY2VzcyhmaWxlKTsKIAlmcHV0KGZpbGUpOwogfQogCkBAIC01OTksOSArNjI0LDcgQEAKICAqLwogdm9pZCBhY2N0X2NsZWFyX2ludGVncmFscyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKLQlpZiAodHNrKSB7Ci0JCXRzay0+YWNjdF9zdGltZXhwZCA9IDA7Ci0JCXRzay0+YWNjdF9yc3NfbWVtMSA9IDA7Ci0JCXRzay0+YWNjdF92bV9tZW0xID0gMDsKLQl9CisJdHNrLT5hY2N0X3N0aW1leHBkID0gMDsKKwl0c2stPmFjY3RfcnNzX21lbTEgPSAwOworCXRzay0+YWNjdF92bV9tZW0xID0gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9hdWRpdHNjLmMgYi9rZXJuZWwvYXVkaXRzYy5jCmluZGV4IGIwOTdjY2IuLjllYmQ5NmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9hdWRpdHNjLmMKKysrIGIva2VybmVsL2F1ZGl0c2MuYwpAQCAtMTU1OCw2ICsxNTU4LDcgQEAKICAqIEB1aWQ6IG1zZ3EgdXNlciBpZAogICogQGdpZDogbXNncSBncm91cCBpZAogICogQG1vZGU6IG1zZ3EgbW9kZSAocGVybWlzc2lvbnMpCisgKiBAaXBjcDogaW4ta2VybmVsIElQQyBwZXJtaXNzaW9ucwogICoKICAqIFJldHVybnMgMCBmb3Igc3VjY2VzcyBvciBOVUxMIGNvbnRleHQgb3IgPCAwIG9uIGVycm9yLgogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggYzE2MDFhOC4uMTI2ZGVlOSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXguaD4KKyNpbmNsdWRlIDxsaW51eC9taWdyYXRlLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC03MjksMTcgKzczMCwxMCBAQAogc2lnc2V0X2Zyb21fY29tcGF0IChzaWdzZXRfdCAqc2V0LCBjb21wYXRfc2lnc2V0X3QgKmNvbXBhdCkKIHsKIAlzd2l0Y2ggKF9OU0lHX1dPUkRTKSB7Ci0jaWYgZGVmaW5lZCAoX19DT01QQVRfRU5ESUFOX1NXQVBfXykKLQljYXNlIDQ6IHNldC0+c2lnWzNdID0gY29tcGF0LT5zaWdbN10gfCAoKChsb25nKWNvbXBhdC0+c2lnWzZdKSA8PCAzMiApOwotCWNhc2UgMzogc2V0LT5zaWdbMl0gPSBjb21wYXQtPnNpZ1s1XSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbNF0pIDw8IDMyICk7Ci0JY2FzZSAyOiBzZXQtPnNpZ1sxXSA9IGNvbXBhdC0+c2lnWzNdIHwgKCgobG9uZyljb21wYXQtPnNpZ1syXSkgPDwgMzIgKTsKLQljYXNlIDE6IHNldC0+c2lnWzBdID0gY29tcGF0LT5zaWdbMV0gfCAoKChsb25nKWNvbXBhdC0+c2lnWzBdKSA8PCAzMiApOwotI2Vsc2UKIAljYXNlIDQ6IHNldC0+c2lnWzNdID0gY29tcGF0LT5zaWdbNl0gfCAoKChsb25nKWNvbXBhdC0+c2lnWzddKSA8PCAzMiApOwogCWNhc2UgMzogc2V0LT5zaWdbMl0gPSBjb21wYXQtPnNpZ1s0XSB8ICgoKGxvbmcpY29tcGF0LT5zaWdbNV0pIDw8IDMyICk7CiAJY2FzZSAyOiBzZXQtPnNpZ1sxXSA9IGNvbXBhdC0+c2lnWzJdIHwgKCgobG9uZyljb21wYXQtPnNpZ1szXSkgPDwgMzIgKTsKIAljYXNlIDE6IHNldC0+c2lnWzBdID0gY29tcGF0LT5zaWdbMF0gfCAoKChsb25nKWNvbXBhdC0+c2lnWzFdKSA8PCAzMiApOwotI2VuZGlmCiAJfQogfQogCkBAIC05MzQsMyArOTI4LDI1IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCisjaWZkZWYgQ09ORklHX05VTUEKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX21vdmVfcGFnZXMocGlkX3QgcGlkLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAorCQljb21wYXRfdXB0cl90IF9fdXNlciAqcGFnZXMzMiwKKwkJY29uc3QgaW50IF9fdXNlciAqbm9kZXMsCisJCWludCBfX3VzZXIgKnN0YXR1cywKKwkJaW50IGZsYWdzKQoreworCWNvbnN0IHZvaWQgX191c2VyICogX191c2VyICpwYWdlczsKKwlpbnQgaTsKKworCXBhZ2VzID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobnJfcGFnZXMgKiBzaXplb2Yodm9pZCAqKSk7CisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJY29tcGF0X3VwdHJfdCBwOworCisJCWlmIChnZXRfdXNlcihwLCBwYWdlczMyICsgaSkgfHwKKwkJCXB1dF91c2VyKGNvbXBhdF9wdHIocCksIHBhZ2VzICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIHN5c19tb3ZlX3BhZ2VzKHBpZCwgbnJfcGFnZXMsIHBhZ2VzLCBub2Rlcywgc3RhdHVzLCBmbGFncyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCBhYjgxZmRkLi5iNjAyZjczIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMzkyLDExICszOTMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqY3B1c2V0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKLQkJCQkJaW50IGZsYWdzLCBjb25zdCBjaGFyICp1bnVzZWRfZGV2X25hbWUsCi0JCQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGNwdXNldF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkgaW50IGZsYWdzLCBjb25zdCBjaGFyICp1bnVzZWRfZGV2X25hbWUsCisJCQkgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGNwdXNldF9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgY3B1c2V0X2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjcHVzZXRfZnNfdHlwZSA9IHsKQEAgLTExNzcsNiArMTE3OCw3IEBACiAJY3B1bWFza190IGNwdXM7CiAJbm9kZW1hc2tfdCBmcm9tLCB0bzsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlpbnQgcmV0dmFsOwogCiAJaWYgKHNzY2FuZihwaWRidWYsICIlZCIsICZwaWQpICE9IDEpCiAJCXJldHVybiAtRUlPOwpAQCAtMTIwNSw2ICsxMjA3LDEyIEBACiAJCWdldF90YXNrX3N0cnVjdCh0c2spOwogCX0KIAorCXJldHZhbCA9IHNlY3VyaXR5X3Rhc2tfc2V0c2NoZWR1bGVyKHRzaywgMCwgTlVMTCk7CisJaWYgKHJldHZhbCkgeworCQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKIAltdXRleF9sb2NrKCZjYWxsYmFja19tdXRleCk7CiAKIAl0YXNrX2xvY2sodHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGUwNmQwYzEuLmU3NmJkMDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BpcGVfZnNfaS5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+IC8qIGZvciBhdWRpdF9mcmVlKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9yZXNvdXJjZS5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC00NSw4ICs0Niw2IEBACiBleHRlcm4gdm9pZCBzZW1fZXhpdCAodm9pZCk7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZF9yZWFwZXI7CiAKLWludCBnZXRydXNhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICosIGludCwgc3RydWN0IHJ1c2FnZSBfX3VzZXIgKik7Ci0KIHN0YXRpYyB2b2lkIGV4aXRfbW0oc3RydWN0IHRhc2tfc3RydWN0ICogdHNrKTsKIAogc3RhdGljIHZvaWQgX191bmhhc2hfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC01NzksNyArNTc4LDcgQEAKIAkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCX0KIAlhdG9taWNfaW5jKCZtbS0+bW1fY291bnQpOwotCWlmIChtbSAhPSB0c2stPmFjdGl2ZV9tbSkgQlVHKCk7CisJQlVHX09OKG1tICE9IHRzay0+YWN0aXZlX21tKTsKIAkvKiBtb3JlIGEgbWVtb3J5IGJhcnJpZXIgdGhhbiBhIHJlYWwgbG9jayAqLwogCXRhc2tfbG9jayh0c2spOwogCXRzay0+bW0gPSBOVUxMOwpAQCAtODk1LDExICs4OTQsMTEgQEAKIAlpZiAoZ3JvdXBfZGVhZCkgewogIAkJaHJ0aW1lcl9jYW5jZWwoJnRzay0+c2lnbmFsLT5yZWFsX3RpbWVyKTsKIAkJZXhpdF9pdGltZXJzKHRzay0+c2lnbmFsKTsKLQkJYWNjdF9wcm9jZXNzKGNvZGUpOwogCX0KKwlhY2N0X2NvbGxlY3QoY29kZSwgZ3JvdXBfZGVhZCk7CiAJaWYgKHVubGlrZWx5KHRzay0+cm9idXN0X2xpc3QpKQogCQlleGl0X3JvYnVzdF9saXN0KHRzayk7Ci0jaWZkZWYgQ09ORklHX0NPTVBBVAorI2lmIGRlZmluZWQoQ09ORklHX0ZVVEVYKSAmJiBkZWZpbmVkKENPTkZJR19DT01QQVQpCiAJaWYgKHVubGlrZWx5KHRzay0+Y29tcGF0X3JvYnVzdF9saXN0KSkKIAkJY29tcGF0X2V4aXRfcm9idXN0X2xpc3QodHNrKTsKICNlbmRpZgpAQCAtOTA3LDYgKzkwNiw4IEBACiAJCWF1ZGl0X2ZyZWUodHNrKTsKIAlleGl0X21tKHRzayk7CiAKKwlpZiAoZ3JvdXBfZGVhZCkKKwkJYWNjdF9wcm9jZXNzKCk7CiAJZXhpdF9zZW0odHNrKTsKIAlfX2V4aXRfZmlsZXModHNrKTsKIAlfX2V4aXRfZnModHNrKTsKQEAgLTE1MzAsOCArMTUzMSw3IEBACiAJCWlmIChvcHRpb25zICYgX19XTk9USFJFQUQpCiAJCQlicmVhazsKIAkJdHNrID0gbmV4dF90aHJlYWQodHNrKTsKLQkJaWYgKHRzay0+c2lnbmFsICE9IGN1cnJlbnQtPnNpZ25hbCkKLQkJCUJVRygpOworCQlCVUdfT04odHNrLT5zaWduYWwgIT0gY3VycmVudC0+c2lnbmFsKTsKIAl9IHdoaWxlICh0c2sgIT0gY3VycmVudCk7CiAKIAlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCBhYzgxMDBlLi5kZmQxMGNiIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTM2OCw2ICszNjgsOCBAQAogICovCiB2b2lkIG1tcHV0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCW1pZ2h0X3NsZWVwKCk7CisKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbW0tPm1tX3VzZXJzKSkgewogCQlleGl0X2FpbyhtbSk7CiAJCWV4aXRfbW1hcChtbSk7CkBAIC02MjMsNiArNjI1LDcgQEAKIC8qCiAgKiBBbGxvY2F0ZSBhIG5ldyBmaWxlcyBzdHJ1Y3R1cmUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0aGUKICAqIHBhc3NlZCBpbiBmaWxlcyBzdHJ1Y3R1cmUuCisgKiBlcnJvcnAgd2lsbCBiZSB2YWxpZCBvbmx5IHdoZW4gdGhlIHJldHVybmVkIGZpbGVzX3N0cnVjdCBpcyBOVUxMLgogICovCiBzdGF0aWMgc3RydWN0IGZpbGVzX3N0cnVjdCAqZHVwX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKm9sZGYsIGludCAqZXJyb3JwKQogewpAQCAtNjMxLDYgKzYzNCw3IEBACiAJaW50IG9wZW5fZmlsZXMsIHNpemUsIGksIGV4cGFuZDsKIAlzdHJ1Y3QgZmR0YWJsZSAqb2xkX2ZkdCwgKm5ld19mZHQ7CiAKKwkqZXJyb3JwID0gLUVOT01FTTsKIAluZXdmID0gYWxsb2NfZmlsZXMoKTsKIAlpZiAoIW5ld2YpCiAJCWdvdG8gb3V0OwpAQCAtNzQ0LDcgKzc0OCw2IEBACiAJICogYnJlYWsgdGhpcy4KIAkgKi8KIAl0c2stPmZpbGVzID0gTlVMTDsKLQllcnJvciA9IC1FTk9NRU07CiAJbmV3ZiA9IGR1cF9mZChvbGRmLCAmZXJyb3IpOwogCWlmICghbmV3ZikKIAkJZ290byBvdXQ7CkBAIC04NzEsNiArODc0LDcgQEAKIAkJdHNrLT5pdF9wcm9mX2V4cGlyZXMgPQogCQkJc2Vjc190b19jcHV0aW1lKHNpZy0+cmxpbVtSTElNSVRfQ1BVXS5ybGltX2N1cik7CiAJfQorCWFjY3RfaW5pdF9wYWNjdCgmc2lnLT5wYWNjdCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggNTY5OWM1MS4uZTFhMzgwYyAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTEwNTYsMTEgKzEwNTYsMTEgQEAKIAkJCSh1bnNpZ25lZCBsb25nKXVhZGRyMiwgdmFsMiwgdmFsMyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgotZnV0ZXhmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGZ1dGV4ZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLAorCQkJICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiZnV0ZXgiLCBOVUxMLCAweEJBRDFERUEpOworCXJldHVybiBnZXRfc2JfcHNldWRvKGZzX3R5cGUsICJmdXRleCIsIE5VTEwsIDB4QkFEMURFQSwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGZ1dGV4X2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCAxODMyNDMwLi41NTYwMWIzIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTk4LDcgKzk4LDYgQEAKIAogLyoqCiAgKiBrdGltZV9nZXRfdHMgLSBnZXQgdGhlIG1vbm90b25pYyBjbG9jayBpbiB0aW1lc3BlYyBmb3JtYXQKLSAqCiAgKiBAdHM6CQlwb2ludGVyIHRvIHRpbWVzcGVjIHZhcmlhYmxlCiAgKgogICogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIG1vbm90b25pYyBjbG9jayBmcm9tIHRoZSByZWFsdGltZQpAQCAtMjM4LDcgKzIzNyw2IEBACiAjIGlmbmRlZiBDT05GSUdfS1RJTUVfU0NBTEFSCiAvKioKICAqIGt0aW1lX2FkZF9ucyAtIEFkZCBhIHNjYWxhciBuYW5vc2Vjb25kcyB2YWx1ZSB0byBhIGt0aW1lX3QgdmFyaWFibGUKLSAqCiAgKiBAa3Q6CQlhZGRlbmQKICAqIEBuc2VjOgl0aGUgc2NhbGFyIG5zZWMgdmFsdWUgdG8gYWRkCiAgKgpAQCAtMjk5LDcgKzI5Nyw2IEBACiAKIC8qKgogICogaHJ0aW1lcl9mb3J3YXJkIC0gZm9yd2FyZCB0aGUgdGltZXIgZXhwaXJ5Ci0gKgogICogQHRpbWVyOglocnRpbWVyIHRvIGZvcndhcmQKICAqIEBub3c6CWZvcndhcmQgcGFzdCB0aGlzIHRpbWUKICAqIEBpbnRlcnZhbDoJdGhlIGludGVydmFsIHRvIGZvcndhcmQKQEAgLTQxMSw3ICs0MDgsNiBAQAogCiAvKioKICAqIGhydGltZXJfc3RhcnQgLSAocmUpc3RhcnQgYW4gcmVsYXRpdmUgdGltZXIgb24gdGhlIGN1cnJlbnQgQ1BVCi0gKgogICogQHRpbWVyOgl0aGUgdGltZXIgdG8gYmUgYWRkZWQKICAqIEB0aW06CWV4cGlyeSB0aW1lCiAgKiBAbW9kZToJZXhwaXJ5IG1vZGU6IGFic29sdXRlIChIUlRJTUVSX0FCUykgb3IgcmVsYXRpdmUgKEhSVElNRVJfUkVMKQpAQCAtNDYwLDE0ICs0NTYsMTMgQEAKIAogLyoqCiAgKiBocnRpbWVyX3RyeV90b19jYW5jZWwgLSB0cnkgdG8gZGVhY3RpdmF0ZSBhIHRpbWVyCi0gKgogICogQHRpbWVyOglocnRpbWVyIHRvIHN0b3AKICAqCiAgKiBSZXR1cm5zOgogICogIDAgd2hlbiB0aGUgdGltZXIgd2FzIG5vdCBhY3RpdmUKICAqICAxIHdoZW4gdGhlIHRpbWVyIHdhcyBhY3RpdmUKICAqIC0xIHdoZW4gdGhlIHRpbWVyIGlzIGN1cnJlbnRseSBleGN1dGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gYW5kCi0gKiAgICBjYW4gbm90IGJlIHN0b3BwZWQKKyAqICAgIGNhbm5vdCBiZSBzdG9wcGVkCiAgKi8KIGludCBocnRpbWVyX3RyeV90b19jYW5jZWwoc3RydWN0IGhydGltZXIgKnRpbWVyKQogewpAQCAtNDg5LDcgKzQ4NCw2IEBACiAKIC8qKgogICogaHJ0aW1lcl9jYW5jZWwgLSBjYW5jZWwgYSB0aW1lciBhbmQgd2FpdCBmb3IgdGhlIGhhbmRsZXIgdG8gZmluaXNoLgotICoKICAqIEB0aW1lcjoJdGhlIHRpbWVyIHRvIGJlIGNhbmNlbGxlZAogICoKICAqIFJldHVybnM6CkBAIC01MTAsNyArNTA0LDYgQEAKIAogLyoqCiAgKiBocnRpbWVyX2dldF9yZW1haW5pbmcgLSBnZXQgcmVtYWluaW5nIHRpbWUgZm9yIHRoZSB0aW1lcgotICoKICAqIEB0aW1lcjoJdGhlIHRpbWVyIHRvIHJlYWQKICAqLwoga3RpbWVfdCBocnRpbWVyX2dldF9yZW1haW5pbmcoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyKQpAQCAtNTY0LDcgKzU1Nyw2IEBACiAKIC8qKgogICogaHJ0aW1lcl9pbml0IC0gaW5pdGlhbGl6ZSBhIHRpbWVyIHRvIHRoZSBnaXZlbiBjbG9jawotICoKICAqIEB0aW1lcjoJdGhlIHRpbWVyIHRvIGJlIGluaXRpYWxpemVkCiAgKiBAY2xvY2tfaWQ6CXRoZSBjbG9jayB0byBiZSB1c2VkCiAgKiBAbW9kZToJdGltZXIgbW9kZSBhYnMvcmVsCkBAIC01NzYsNyArNTY4LDcgQEAKIAogCW1lbXNldCh0aW1lciwgMCwgc2l6ZW9mKHN0cnVjdCBocnRpbWVyKSk7CiAKLQliYXNlcyA9IHBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJYmFzZXMgPSBfX3Jhd19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKIAogCWlmIChjbG9ja19pZCA9PSBDTE9DS19SRUFMVElNRSAmJiBtb2RlICE9IEhSVElNRVJfQUJTKQogCQljbG9ja19pZCA9IENMT0NLX01PTk9UT05JQzsKQEAgLTU4OCw3ICs1ODAsNiBAQAogCiAvKioKICAqIGhydGltZXJfZ2V0X3JlcyAtIGdldCB0aGUgdGltZXIgcmVzb2x1dGlvbiBmb3IgYSBjbG9jawotICoKICAqIEB3aGljaF9jbG9jazogd2hpY2ggY2xvY2sgdG8gcXVlcnkKICAqIEB0cDoJCSBwb2ludGVyIHRvIHRpbWVzcGVjIHZhcmlhYmxlIHRvIHN0b3JlIHRoZSByZXNvbHV0aW9uCiAgKgpAQCAtNTk5LDcgKzU5MCw3IEBACiB7CiAJc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CiAKLQliYXNlcyA9IHBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJYmFzZXMgPSBfX3Jhd19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKIAkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlc1t3aGljaF9jbG9ja10ucmVzb2x1dGlvbik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaGFuZGxlLmMgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCmluZGV4IDUxZGYzMzcuLjBmNjUzMDEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaGFuZGxlLmMKKysrIGIva2VybmVsL2lycS9oYW5kbGUuYwpAQCAtNzYsMTAgKzc2LDExIEBACiAvKgogICogSGF2ZSBnb3QgYW4gZXZlbnQgdG8gaGFuZGxlOgogICovCi1mYXN0Y2FsbCBpbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywKK2Zhc3RjYWxsIGlycXJldHVybl90IGhhbmRsZV9JUlFfZXZlbnQodW5zaWduZWQgaW50IGlycSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogewotCWludCByZXQsIHJldHZhbCA9IDAsIHN0YXR1cyA9IDA7CisJaXJxcmV0dXJuX3QgcmV0LCByZXR2YWwgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzID0gMDsKIAogCWlmICghKGFjdGlvbi0+ZmxhZ3MgJiBTQV9JTlRFUlJVUFQpKQogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21pZ3JhdGlvbi5jIGIva2VybmVsL2lycS9taWdyYXRpb24uYwppbmRleCAxMzRmOWYyLi5hMTJkMDBlIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21pZ3JhdGlvbi5jCisrKyBiL2tlcm5lbC9pcnEvbWlncmF0aW9uLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogCWRlc2MtPm1vdmVfaXJxID0gMDsKIAotCWlmIChsaWtlbHkoY3B1c19lbXB0eShwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0pKSkKKwlpZiAodW5saWtlbHkoY3B1c19lbXB0eShwZW5kaW5nX2lycV9jcHVtYXNrW2lycV0pKSkKIAkJcmV0dXJuOwogCiAJaWYgKCFkZXNjLT5oYW5kbGVyLT5zZXRfYWZmaW5pdHkpCkBAIC00OSw3ICs0OSw3IEBACiAJICogY2F1c2Ugc29tZSBpb2FwaWNzIHRvIG1hbC1mdW5jdGlvbi4KIAkgKiBCZWluZyBwYXJhbm9pZCBpIGd1ZXNzIQogCSAqLwotCWlmICh1bmxpa2VseSghY3B1c19lbXB0eSh0bXApKSkgeworCWlmIChsaWtlbHkoIWNwdXNfZW1wdHkodG1wKSkpIHsKIAkJaWYgKGxpa2VseSghKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkpKQogCQkJZGVzYy0+aGFuZGxlci0+ZGlzYWJsZShpcnEpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IGQwM2I1ZWUuLmFmYWNkNmYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0yNCw2ICsyNCw4IEBACiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKIHZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKIHsKKwlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBtYXNrX3ZhbCk7CisKIAkvKgogCSAqIFNhdmUgdGhlc2UgYXdheSBmb3IgbGF0ZXIgdXNlLiBSZS1wcm9nYW0gd2hlbiB0aGUKIAkgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZwpAQCAtMzMsNiArMzUsNyBAQAogI2Vsc2UKIHZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKIHsKKwlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBtYXNrX3ZhbCk7CiAJaXJxX2FmZmluaXR5W2lycV0gPSBtYXNrX3ZhbDsKIAlpcnFfZGVzY1tpcnFdLmhhbmRsZXItPnNldF9hZmZpbml0eShpcnEsIG1hc2tfdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvc3B1cmlvdXMuYyBiL2tlcm5lbC9pcnEvc3B1cmlvdXMuYwppbmRleCA3ZGY5YWJkLi5iMmZiM2MxIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL3NwdXJpb3VzLmMKKysrIGIva2VybmVsL2lycS9zcHVyaW91cy5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotc3RhdGljIGludCBpcnFmaXh1cDsKK3N0YXRpYyBpbnQgaXJxZml4dXAgX19yZWFkX21vc3RseTsKIAogLyoKICAqIFJlY292ZXJ5IGhhbmRsZXIgZm9yIG1pc3JvdXRlZCBpbnRlcnJ1cHRzLgpAQCAtMTM2LDkgKzEzNiw5IEBACiB2b2lkIG5vdGVfaW50ZXJydXB0KHVuc2lnbmVkIGludCBpcnEsIGlycV9kZXNjX3QgKmRlc2MsIGlycXJldHVybl90IGFjdGlvbl9yZXQsCiAJCQlzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpZiAoYWN0aW9uX3JldCAhPSBJUlFfSEFORExFRCkgeworCWlmICh1bmxpa2VseShhY3Rpb25fcmV0ICE9IElSUV9IQU5ETEVEKSkgewogCQlkZXNjLT5pcnFzX3VuaGFuZGxlZCsrOwotCQlpZiAoYWN0aW9uX3JldCAhPSBJUlFfTk9ORSkKKwkJaWYgKHVubGlrZWx5KGFjdGlvbl9yZXQgIT0gSVJRX05PTkUpKQogCQkJcmVwb3J0X2JhZF9pcnEoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAl9CiAKQEAgLTE1MiwxMSArMTUyLDExIEBACiAJfQogCiAJZGVzYy0+aXJxX2NvdW50Kys7Ci0JaWYgKGRlc2MtPmlycV9jb3VudCA8IDEwMDAwMCkKKwlpZiAobGlrZWx5KGRlc2MtPmlycV9jb3VudCA8IDEwMDAwMCkpCiAJCXJldHVybjsKIAogCWRlc2MtPmlycV9jb3VudCA9IDA7Ci0JaWYgKGRlc2MtPmlycXNfdW5oYW5kbGVkID4gOTk5MDApIHsKKwlpZiAodW5saWtlbHkoZGVzYy0+aXJxc191bmhhbmRsZWQgPiA5OTkwMCkpIHsKIAkJLyoKIAkJICogVGhlIGludGVycnVwdCBpcyBzdHVjawogCQkgKi8KQEAgLTE3MSw3ICsxNzEsNyBAQAogCWRlc2MtPmlycXNfdW5oYW5kbGVkID0gMDsKIH0KIAotaW50IG5vaXJxZGVidWc7CitpbnQgbm9pcnFkZWJ1ZyBfX3JlYWRfbW9zdGx5OwogCiBpbnQgX19pbml0IG5vaXJxZGVidWdfc2V0dXAoY2hhciAqc3RyKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL2tleGVjLmMgYi9rZXJuZWwva2V4ZWMuYwppbmRleCBiZjM5ZDI4Li41OGYwZjM4IDEwMDY0NAotLS0gYS9rZXJuZWwva2V4ZWMuYworKysgYi9rZXJuZWwva2V4ZWMuYwpAQCAtOTAyLDE0ICs5MDIsMTQgQEAKICAqIGtleGVjIGRvZXMgbm90IHN5bmMsIG9yIHVubW91bnQgZmlsZXN5c3RlbXMgc28gaWYgeW91IG5lZWQKICAqIHRoYXQgdG8gaGFwcGVuIHlvdSBuZWVkIHRvIGRvIHRoYXQgeW91cnNlbGYuCiAgKi8KLXN0cnVjdCBraW1hZ2UgKmtleGVjX2ltYWdlID0gTlVMTDsKLXN0YXRpYyBzdHJ1Y3Qga2ltYWdlICprZXhlY19jcmFzaF9pbWFnZSA9IE5VTEw7CitzdHJ1Y3Qga2ltYWdlICprZXhlY19pbWFnZTsKK3N0cnVjdCBraW1hZ2UgKmtleGVjX2NyYXNoX2ltYWdlOwogLyoKICAqIEEgaG9tZSBncm93biBiaW5hcnkgbXV0ZXguCiAgKiBOb3RoaW5nIGNhbiB3YWl0IHNvIHRoaXMgbXV0ZXggaXMgc2FmZSB0byB1c2UKICAqIGluIGludGVycnVwdCBjb250ZXh0IDopCiAgKi8KLXN0YXRpYyBpbnQga2V4ZWNfbG9jayA9IDA7CitzdGF0aWMgaW50IGtleGVjX2xvY2s7CiAKIGFzbWxpbmthZ2UgbG9uZyBzeXNfa2V4ZWNfbG9hZCh1bnNpZ25lZCBsb25nIGVudHJ5LCB1bnNpZ25lZCBsb25nIG5yX3NlZ21lbnRzLAogCQkJCXN0cnVjdCBrZXhlY19zZWdtZW50IF9fdXNlciAqc2VnbWVudHMsCmRpZmYgLS1naXQgYS9rZXJuZWwva3N5c2ZzLmMgYi9rZXJuZWwva3N5c2ZzLmMKaW5kZXggZjExOWUwOS4uOWUyODQ3OCAxMDA2NDQKLS0tIGEva2VybmVsL2tzeXNmcy5jCisrKyBiL2tlcm5lbC9rc3lzZnMuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKICNkZWZpbmUgS0VSTkVMX0FUVFJfUk8oX25hbWUpIFwKIHN0YXRpYyBzdHJ1Y3Qgc3Vic3lzX2F0dHJpYnV0ZSBfbmFtZSMjX2F0dHIgPSBfX0FUVFJfUk8oX25hbWUpCkBAIC00OCw2ICs0OSwyMCBAQAogS0VSTkVMX0FUVFJfUlcodWV2ZW50X2hlbHBlcik7CiAjZW5kaWYKIAorI2lmZGVmIENPTkZJR19LRVhFQworc3RhdGljIHNzaXplX3Qga2V4ZWNfbG9hZGVkX3Nob3coc3RydWN0IHN1YnN5c3RlbSAqc3Vic3lzLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgISFrZXhlY19pbWFnZSk7Cit9CitLRVJORUxfQVRUUl9STyhrZXhlY19sb2FkZWQpOworCitzdGF0aWMgc3NpemVfdCBrZXhlY19jcmFzaF9sb2FkZWRfc2hvdyhzdHJ1Y3Qgc3Vic3lzdGVtICpzdWJzeXMsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVkXG4iLCAhIWtleGVjX2NyYXNoX2ltYWdlKTsKK30KK0tFUk5FTF9BVFRSX1JPKGtleGVjX2NyYXNoX2xvYWRlZCk7CisjZW5kaWYgLyogQ09ORklHX0tFWEVDICovCisKIGRlY2xfc3Vic3lzKGtlcm5lbCwgTlVMTCwgTlVMTCk7CiBFWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfc3Vic3lzKTsKIApAQCAtNTYsNiArNzEsMTAgQEAKIAkmdWV2ZW50X3NlcW51bV9hdHRyLmF0dHIsCiAJJnVldmVudF9oZWxwZXJfYXR0ci5hdHRyLAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0tFWEVDCisJJmtleGVjX2xvYWRlZF9hdHRyLmF0dHIsCisJJmtleGVjX2NyYXNoX2xvYWRlZF9hdHRyLmF0dHIsCisjZW5kaWYKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCBjNWYzYzY2Li4yNGJlNzE0IDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTQ1LDYgKzQ1LDEzIEBACiBzdGF0aWMgREVGSU5FX01VVEVYKGt0aHJlYWRfc3RvcF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3Qga3RocmVhZF9zdG9wX2luZm8ga3RocmVhZF9zdG9wX2luZm87CiAKKy8qKgorICoga3RocmVhZF9zaG91bGRfc3RvcCAtIHNob3VsZCB0aGlzIGt0aHJlYWQgcmV0dXJuIG5vdz8KKyAqCisgKiBXaGVuIHNvbWVvbmUgY2FsbHMga3RocmVhZF9zdG9wIG9uIHlvdXIga3RocmVhZCwgaXQgd2lsbCBiZSB3b2tlbgorICogYW5kIHRoaXMgd2lsbCByZXR1cm4gdHJ1ZS4gIFlvdSBzaG91bGQgdGhlbiByZXR1cm4sIGFuZCB5b3VyIHJldHVybgorICogdmFsdWUgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB0byBrdGhyZWFkX3N0b3AoKS4KKyAqLwogaW50IGt0aHJlYWRfc2hvdWxkX3N0b3Aodm9pZCkKIHsKIAlyZXR1cm4gKGt0aHJlYWRfc3RvcF9pbmZvLmsgPT0gY3VycmVudCk7CkBAIC0xMjIsNiArMTI5LDI1IEBACiAJY29tcGxldGUoJmNyZWF0ZS0+ZG9uZSk7CiB9CiAKKy8qKgorICoga3RocmVhZF9jcmVhdGUgLSBjcmVhdGUgYSBrdGhyZWFkLgorICogQHRocmVhZGZuOiB0aGUgZnVuY3Rpb24gdG8gcnVuIHVudGlsIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpLgorICogQGRhdGE6IGRhdGEgcHRyIGZvciBAdGhyZWFkZm4uCisgKiBAbmFtZWZtdDogcHJpbnRmLXN0eWxlIG5hbWUgZm9yIHRoZSB0aHJlYWQuCisgKgorICogRGVzY3JpcHRpb246IFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNyZWF0ZXMgYW5kIG5hbWVzIGEga2VybmVsCisgKiB0aHJlYWQuICBUaGUgdGhyZWFkIHdpbGwgYmUgc3RvcHBlZDogdXNlIHdha2VfdXBfcHJvY2VzcygpIHRvIHN0YXJ0CisgKiBpdC4gIFNlZSBhbHNvIGt0aHJlYWRfcnVuKCksIGt0aHJlYWRfY3JlYXRlX29uX2NwdSgpLgorICoKKyAqIFdoZW4gd29rZW4sIHRoZSB0aHJlYWQgd2lsbCBydW4gQHRocmVhZGZuKCkgd2l0aCBAZGF0YSBhcyBpdHMKKyAqIGFyZ3VtZW50LiBAdGhyZWFkZm4gY2FuIGVpdGhlciBjYWxsIGRvX2V4aXQoKSBkaXJlY3RseSBpZiBpdCBpcyBhCisgKiBzdGFuZGFsb25lIHRocmVhZCBmb3Igd2hpY2ggbm9vbmUgd2lsbCBjYWxsIGt0aHJlYWRfc3RvcCgpLCBvcgorICogcmV0dXJuIHdoZW4gJ2t0aHJlYWRfc2hvdWxkX3N0b3AoKScgaXMgdHJ1ZSAod2hpY2ggbWVhbnMKKyAqIGt0aHJlYWRfc3RvcCgpIGhhcyBiZWVuIGNhbGxlZCkuICBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSB6ZXJvCisgKiBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlcjsgaXQgd2lsbCBiZSBwYXNzZWQgdG8ga3RocmVhZF9zdG9wKCkuCisgKgorICogUmV0dXJucyBhIHRhc2tfc3RydWN0IG9yIEVSUl9QVFIoLUVOT01FTSkuCisgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdCAqa3RocmVhZF9jcmVhdGUoaW50ICgqdGhyZWFkZm4pKHZvaWQgKmRhdGEpLAogCQkJCSAgIHZvaWQgKmRhdGEsCiAJCQkJICAgY29uc3QgY2hhciBuYW1lZm10W10sCkBAIC0xNTYsNiArMTgyLDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGt0aHJlYWRfY3JlYXRlKTsKIAorLyoqCisgKiBrdGhyZWFkX2JpbmQgLSBiaW5kIGEganVzdC1jcmVhdGVkIGt0aHJlYWQgdG8gYSBjcHUuCisgKiBAazogdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KKyAqIEBjcHU6IGNwdSAobWlnaHQgbm90IGJlIG9ubGluZSwgbXVzdCBiZSBwb3NzaWJsZSkgZm9yIEBrIHRvIHJ1biBvbi4KKyAqCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIHNldF9jcHVzX2FsbG93ZWQoKSwKKyAqIGV4Y2VwdCB0aGF0IEBjcHUgZG9lc24ndCBuZWVkIHRvIGJlIG9ubGluZSwgYW5kIHRoZSB0aHJlYWQgbXVzdCBiZQorICogc3RvcHBlZCAoaS5lLiwganVzdCByZXR1cm5lZCBmcm9tIGt0aHJlYWRfY3JlYXRlKCkuCisgKi8KIHZvaWQga3RocmVhZF9iaW5kKHN0cnVjdCB0YXNrX3N0cnVjdCAqaywgdW5zaWduZWQgaW50IGNwdSkKIHsKIAlCVUdfT04oay0+c3RhdGUgIT0gVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTE2NiwxMiArMjAxLDM2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGt0aHJlYWRfYmluZCk7CiAKKy8qKgorICoga3RocmVhZF9zdG9wIC0gc3RvcCBhIHRocmVhZCBjcmVhdGVkIGJ5IGt0aHJlYWRfY3JlYXRlKCkuCisgKiBAazogdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KKyAqCisgKiBTZXRzIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSBmb3IgQGsgdG8gcmV0dXJuIHRydWUsIHdha2VzIGl0LCBhbmQKKyAqIHdhaXRzIGZvciBpdCB0byBleGl0LiAgWW91ciB0aHJlYWRmbigpIG11c3Qgbm90IGNhbGwgZG9fZXhpdCgpCisgKiBpdHNlbGYgaWYgeW91IHVzZSB0aGlzIGZ1bmN0aW9uISAgVGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgYWZ0ZXIKKyAqIGt0aHJlYWRfY3JlYXRlKCkgaW5zdGVhZCBvZiBjYWxsaW5nIHdha2VfdXBfcHJvY2VzcygpOiB0aGUgdGhyZWFkCisgKiB3aWxsIGV4aXQgd2l0aG91dCBjYWxsaW5nIHRocmVhZGZuKCkuCisgKgorICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRocmVhZGZuKCksIG9yICUtRUlOVFIgaWYgd2FrZV91cF9wcm9jZXNzKCkKKyAqIHdhcyBuZXZlciBjYWxsZWQuCisgKi8KIGludCBrdGhyZWFkX3N0b3Aoc3RydWN0IHRhc2tfc3RydWN0ICprKQogewogCXJldHVybiBrdGhyZWFkX3N0b3Bfc2VtKGssIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTChrdGhyZWFkX3N0b3ApOwogCisvKioKKyAqIGt0aHJlYWRfc3RvcF9zZW0gLSBzdG9wIGEgdGhyZWFkIGNyZWF0ZWQgYnkga3RocmVhZF9jcmVhdGUoKS4KKyAqIEBrOiB0aHJlYWQgY3JlYXRlZCBieSBrdGhyZWFkX2NyZWF0ZSgpLgorICogQHM6IHNlbWFwaG9yZSB0aGF0IEBrIHdhaXRzIG9uIHdoaWxlIGlkbGUuCisgKgorICogRG9lcyBlc3NlbnRpYWxseSB0aGUgc2FtZSB0aGluZyBhcyBrdGhyZWFkX3N0b3AoKSBhYm92ZSwgYnV0IHdha2VzCisgKiBAayBieSBjYWxsaW5nIHVwKEBzKS4KKyAqCisgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhyZWFkZm4oKSwgb3IgJS1FSU5UUiBpZiB3YWtlX3VwX3Byb2Nlc3MoKQorICogd2FzIG5ldmVyIGNhbGxlZC4KKyAqLwogaW50IGt0aHJlYWRfc3RvcF9zZW0oc3RydWN0IHRhc2tfc3RydWN0ICprLCBzdHJ1Y3Qgc2VtYXBob3JlICpzKQogewogCWludCByZXQ7CkBAIC0yMTAsNSArMjY5LDUgQEAKIAogCXJldHVybiAwOwogfQotY29yZV9pbml0Y2FsbChoZWxwZXJfaW5pdCk7CiAKK2NvcmVfaW5pdGNhbGwoaGVscGVyX2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGJiZTA0ODYuLmQ3NTI3NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTEzMjYsNyArMTMyNiw3IEBACiAJaWYgKCFtb2QgJiYgbG9va3VwX3N5bWJvbChuYW1lLCBfX3N0YXJ0X19fa3N5bXRhYiwgX19zdG9wX19fa3N5bXRhYikpCiAJCXJldHVybiAxOwogCWVsc2UKLQkJaWYgKGxvb2t1cF9zeW1ib2wobmFtZSwgbW9kLT5zeW1zLCBtb2QtPnN5bXMgKyBtb2QtPm51bV9zeW1zKSkKKwkJaWYgKG1vZCAmJiBsb29rdXBfc3ltYm9sKG5hbWUsIG1vZC0+c3ltcywgbW9kLT5zeW1zICsgbW9kLT5udW1fc3ltcykpCiAJCQlyZXR1cm4gMTsKIAkJZWxzZQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvS2NvbmZpZyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCmluZGV4IGNlMGRmYjguLmZjMzExYTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9LY29uZmlnCisrKyBiL2tlcm5lbC9wb3dlci9LY29uZmlnCkBAIC0zNiw2ICszNiwxNSBAQAogCWNvZGUuIFRoaXMgaXMgaGVscGZ1bCB3aGVuIGRlYnVnZ2luZyBhbmQgcmVwb3J0aW5nIHZhcmlvdXMgUE0gYnVncywgCiAJbGlrZSBzdXNwZW5kIHN1cHBvcnQuCiAKK2NvbmZpZyBQTV9UUkFDRQorCWJvb2wgIlN1c3BlbmQvcmVzdW1lIGV2ZW50IHRyYWNpbmciCisJZGVwZW5kcyBvbiBQTSAmJiBQTV9ERUJVRyAmJiBYODZfMzIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJVGhpcyBlbmFibGVzIHNvbWUgY2hlZXN5IGNvZGUgdG8gc2F2ZSB0aGUgbGFzdCBQTSBldmVudCBwb2ludCBpbiB0aGUKKwlSVEMgYWNyb3NzIHJlYm9vdHMsIHNvIHRoYXQgeW91IGNhbiBkZWJ1ZyBhIG1hY2hpbmUgdGhhdCBqdXN0IGhhbmdzCisJZHVyaW5nIHN1c3BlbmQgKG9yIG1vcmUgY29tbW9ubHksIGR1cmluZyByZXN1bWUpLgorCiBjb25maWcgU09GVFdBUkVfU1VTUEVORAogCWJvb2wgIlNvZnR3YXJlIFN1c3BlbmQiCiAJZGVwZW5kcyBvbiBQTSAmJiBTV0FQICYmIChYODYgJiYgKCFTTVAgfHwgU1VTUEVORF9TTVApKSB8fCAoKEZSViB8fCBQUEMzMikgJiYgIVNNUCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9kaXNrLmMgYi9rZXJuZWwvcG93ZXIvZGlzay5jCmluZGV4IDgxZDRkOTguLmUxM2U3NDAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9kaXNrLmMKKysrIGIva2VybmVsL3Bvd2VyL2Rpc2suYwpAQCAtMjMxLDcgKzIzMSw3IEBACiBsYXRlX2luaXRjYWxsKHNvZnR3YXJlX3Jlc3VtZSk7CiAKIAotc3RhdGljIGNoYXIgKiBwbV9kaXNrX21vZGVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBtX2Rpc2tfbW9kZXNbXSA9IHsKIAlbUE1fRElTS19GSVJNV0FSRV0JPSAiZmlybXdhcmUiLAogCVtQTV9ESVNLX1BMQVRGT1JNXQk9ICJwbGF0Zm9ybSIsCiAJW1BNX0RJU0tfU0hVVERPV05dCT0gInNodXRkb3duIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9tYWluLmMgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCmluZGV4IDBhOTA3ZjAuLjZkMjk1YzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9tYWluLmMKKysrIGIva2VybmVsL3Bvd2VyL21haW4uYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAKICNpbmNsdWRlICJwb3dlci5oIgogCkBAIC0xNDUsNyArMTQ1LDcgQEAKIAogCiAKLXN0YXRpYyBjaGFyICpwbV9zdGF0ZXNbUE1fU1VTUEVORF9NQVhdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwbV9zdGF0ZXNbUE1fU1VTUEVORF9NQVhdID0gewogCVtQTV9TVVNQRU5EX1NUQU5EQlldCT0gInN0YW5kYnkiLAogCVtQTV9TVVNQRU5EX01FTV0JPSAibWVtIiwKICNpZmRlZiBDT05GSUdfU09GVFdBUkVfU1VTUEVORApAQCAtMjYyLDcgKzI2Miw3IEBACiBzdGF0aWMgc3NpemVfdCBzdGF0ZV9zdG9yZShzdHJ1Y3Qgc3Vic3lzdGVtICogc3Vic3lzLCBjb25zdCBjaGFyICogYnVmLCBzaXplX3QgbikKIHsKIAlzdXNwZW5kX3N0YXRlX3Qgc3RhdGUgPSBQTV9TVVNQRU5EX1NUQU5EQlk7Ci0JY2hhciAqKiBzOworCWNvbnN0IGNoYXIgKiBjb25zdCAqczsKIAljaGFyICpwOwogCWludCBlcnJvcjsKIAlpbnQgbGVuOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL3Bvd2VyLmggYi9rZXJuZWwvcG93ZXIvcG93ZXIuaAppbmRleCBmMDZmMTJmLi45OGM0MTQyIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvcG93ZXIuaAorKysgYi9rZXJuZWwvcG93ZXIvcG93ZXIuaApAQCAtNTUsNyArNTUsNyBAQAogCXVuc2lnbmVkIGludAlwYWdlOwogCXVuc2lnbmVkIGludAlwYWdlX29mZnNldDsKIAl1bnNpZ25lZCBpbnQJcHJldjsKLQlzdHJ1Y3QgcGJlCSpwYmU7CisJc3RydWN0IHBiZQkqcGJlLCAqbGFzdF9wYmU7CiAJdm9pZAkJKmJ1ZmZlcjsKIAl1bnNpZ25lZCBpbnQJYnVmX29mZnNldDsKIH07CkBAIC0xMDUsNiArMTA1LDEwIEBACiBleHRlcm4gdW5zaWduZWQgbG9uZyBhbGxvY19zd2FwX3BhZ2UoaW50IHN3YXAsIHN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwKTsKIGV4dGVybiB2b2lkIGZyZWVfYWxsX3N3YXBfcGFnZXMoaW50IHN3YXAsIHN0cnVjdCBiaXRtYXBfcGFnZSAqYml0bWFwKTsKIAorZXh0ZXJuIHVuc2lnbmVkIGludCBjb3VudF9zcGVjaWFsX3BhZ2VzKHZvaWQpOworZXh0ZXJuIGludCBzYXZlX3NwZWNpYWxfbWVtKHZvaWQpOworZXh0ZXJuIGludCByZXN0b3JlX3NwZWNpYWxfbWVtKHZvaWQpOworCiBleHRlcm4gaW50IHN3c3VzcF9jaGVjayh2b2lkKTsKIGV4dGVybiBpbnQgc3dzdXNwX3Nocmlua19tZW1vcnkodm9pZCk7CiBleHRlcm4gdm9pZCBzd3N1c3BfZnJlZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKaW5kZXggM2VlZWRiYi4uM2Q5Mjg0MSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKKysrIGIva2VybmVsL3Bvd2VyL3NuYXBzaG90LmMKQEAgLTM5LDggKzM5LDkwIEBACiBzdGF0aWMgdW5zaWduZWQgaW50IG5yX21ldGFfcGFnZXM7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyAqYnVmZmVyOwogCitzdHJ1Y3QgYXJjaF9zYXZlYWJsZV9wYWdlIHsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZW5kOworCWNoYXIgKmRhdGE7CisJc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSAqbmV4dDsKK307CitzdGF0aWMgc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSAqYXJjaF9wYWdlczsKKworaW50IHN3c3VzcF9hZGRfYXJjaF9wYWdlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgYXJjaF9zYXZlYWJsZV9wYWdlICp0bXA7CisKKwl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKwkJdG1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFyY2hfc2F2ZWFibGVfcGFnZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQl0bXAtPnN0YXJ0ID0gc3RhcnQ7CisJCXRtcC0+ZW5kID0gKChzdGFydCA+PiBQQUdFX1NISUZUKSArIDEpIDw8IFBBR0VfU0hJRlQ7CisJCWlmICh0bXAtPmVuZCA+IGVuZCkKKwkJCXRtcC0+ZW5kID0gZW5kOworCQl0bXAtPm5leHQgPSBhcmNoX3BhZ2VzOworCQlzdGFydCA9IHRtcC0+ZW5kOworCQlhcmNoX3BhZ2VzID0gdG1wOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9hcmNoX3BhZ2VzKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3QgYXJjaF9zYXZlYWJsZV9wYWdlICp0bXAgPSBhcmNoX3BhZ2VzOworCXdoaWxlICh0bXApIHsKKwkJY291bnQrKzsKKwkJdG1wID0gdG1wLT5uZXh0OworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9hcmNoX21lbSh2b2lkKQoreworCWNoYXIgKmthZGRyOworCXN0cnVjdCBhcmNoX3NhdmVhYmxlX3BhZ2UgKnRtcCA9IGFyY2hfcGFnZXM7CisJaW50IG9mZnNldDsKKworCXByX2RlYnVnKCJzd3N1c3A6IFNhdmluZyBhcmNoIHNwZWNpZmljIG1lbW9yeSIpOworCXdoaWxlICh0bXApIHsKKwkJdG1wLT5kYXRhID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0FUT01JQyk7CisJCWlmICghdG1wLT5kYXRhKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW9mZnNldCA9IHRtcC0+c3RhcnQgLSAodG1wLT5zdGFydCAmIFBBR0VfTUFTSyk7CisJCS8qIGFyY2ggcGFnZXMgbWlnaHQgaGF2ZW4ndCBhICdzdHJ1Y3QgcGFnZScgKi8KKwkJa2FkZHIgPSBrbWFwX2F0b21pY19wZm4odG1wLT5zdGFydCA+PiBQQUdFX1NISUZULCBLTV9VU0VSMCk7CisJCW1lbWNweSh0bXAtPmRhdGEgKyBvZmZzZXQsIGthZGRyICsgb2Zmc2V0LAorCQkJdG1wLT5lbmQgLSB0bXAtPnN0YXJ0KTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJCXRtcCA9IHRtcC0+bmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9hcmNoX21lbSh2b2lkKQoreworCWNoYXIgKmthZGRyOworCXN0cnVjdCBhcmNoX3NhdmVhYmxlX3BhZ2UgKnRtcCA9IGFyY2hfcGFnZXM7CisJaW50IG9mZnNldDsKKworCXdoaWxlICh0bXApIHsKKwkJaWYgKCF0bXAtPmRhdGEpCisJCQljb250aW51ZTsKKwkJb2Zmc2V0ID0gdG1wLT5zdGFydCAtICh0bXAtPnN0YXJ0ICYgUEFHRV9NQVNLKTsKKwkJa2FkZHIgPSBrbWFwX2F0b21pY19wZm4odG1wLT5zdGFydCA+PiBQQUdFX1NISUZULCBLTV9VU0VSMCk7CisJCW1lbWNweShrYWRkciArIG9mZnNldCwgdG1wLT5kYXRhICsgb2Zmc2V0LAorCQkJdG1wLT5lbmQgLSB0bXAtPnN0YXJ0KTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlmcmVlX3BhZ2UoKGxvbmcpdG1wLT5kYXRhKTsKKwkJdG1wLT5kYXRhID0gTlVMTDsKKwkJdG1wID0gdG1wLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19ISUdITUVNCi11bnNpZ25lZCBpbnQgY291bnRfaGlnaG1lbV9wYWdlcyh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGludCBjb3VudF9oaWdobWVtX3BhZ2VzKHZvaWQpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CiAJdW5zaWduZWQgbG9uZyB6b25lX3BmbjsKQEAgLTExNyw3ICsxOTksNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgc2F2ZV9oaWdobWVtKHZvaWQpCitzdGF0aWMgaW50IHNhdmVfaGlnaG1lbSh2b2lkKQogewogCXN0cnVjdCB6b25lICp6b25lOwogCWludCByZXMgPSAwOwpAQCAtMTM0LDcgKzIxNiw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCByZXN0b3JlX2hpZ2htZW0odm9pZCkKK3N0YXRpYyBpbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpCiB7CiAJcHJpbnRrKCJzd3N1c3A6IFJlc3RvcmluZyBIaWdobWVtXG4iKTsKIAl3aGlsZSAoaGlnaG1lbV9jb3B5KSB7CkBAIC0xNTAsOCArMjMyLDM1IEBACiAJfQogCXJldHVybiAwOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNvdW50X2hpZ2htZW1fcGFnZXModm9pZCkge3JldHVybiAwO30KK3N0YXRpYyBpbmxpbmUgaW50IHNhdmVfaGlnaG1lbSh2b2lkKSB7cmV0dXJuIDA7fQorc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpIHtyZXR1cm4gMDt9CiAjZW5kaWYKIAordW5zaWduZWQgaW50IGNvdW50X3NwZWNpYWxfcGFnZXModm9pZCkKK3sKKwlyZXR1cm4gY291bnRfYXJjaF9wYWdlcygpICsgY291bnRfaGlnaG1lbV9wYWdlcygpOworfQorCitpbnQgc2F2ZV9zcGVjaWFsX21lbSh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gc2F2ZV9hcmNoX21lbSgpOworCWlmICghcmV0KQorCQlyZXQgPSBzYXZlX2hpZ2htZW0oKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcmVzdG9yZV9zcGVjaWFsX21lbSh2b2lkKQoreworCWludCByZXQ7CisJcmV0ID0gcmVzdG9yZV9hcmNoX21lbSgpOworCWlmICghcmV0KQorCQlyZXQgPSByZXN0b3JlX2hpZ2htZW0oKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHBmbl9pc19ub3NhdmUodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJdW5zaWduZWQgbG9uZyBub3NhdmVfYmVnaW5fcGZuID0gX19wYSgmX19ub3NhdmVfYmVnaW4pID4+IFBBR0VfU0hJRlQ7CkBAIC0xNzcsNyArMjg2LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQlCVUdfT04oUGFnZVJlc2VydmVkKHBhZ2UpICYmIFBhZ2VOb3NhdmUocGFnZSkpOwogCWlmIChQYWdlTm9zYXZlKHBhZ2UpKQogCQlyZXR1cm4gMDsKIAlpZiAoUGFnZVJlc2VydmVkKHBhZ2UpICYmIHBmbl9pc19ub3NhdmUocGZuKSkKQEAgLTI5Myw2MiArNDAxLDI5IEBACiAJfQogfQogCi0vKioKLSAqCU9uIHJlc3VtZSBpdCBpcyBuZWNlc3NhcnkgdG8gdHJhY2UgYW5kIGV2ZW50dWFsbHkgZnJlZSB0aGUgdW5zYWZlCi0gKglwYWdlcyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQsIGJlY2F1c2UgdGhleSBhcmUgbmVlZGVkIGZvciBJL08KLSAqCShvbiB4ODYtNjQgd2UgbGlrZWx5IHdpbGwgImVhdCIgdGhlc2UgcGFnZXMgb25jZSBhZ2FpbiB3aGlsZQotICoJY3JlYXRpbmcgdGhlIHRlbXBvcmFyeSBwYWdlIHRyYW5zbGF0aW9uIHRhYmxlcykKLSAqLwotCi1zdHJ1Y3QgZWF0ZW5fcGFnZSB7Ci0Jc3RydWN0IGVhdGVuX3BhZ2UgKm5leHQ7Ci0JY2hhciBwYWRkaW5nW1BBR0VfU0laRSAtIHNpemVvZih2b2lkICopXTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZWF0ZW5fcGFnZSAqZWF0ZW5fcGFnZXMgPSBOVUxMOwotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2VhdGVuX3BhZ2VzKHZvaWQpCi17Ci0Jc3RydWN0IGVhdGVuX3BhZ2UgKnAsICpxOwotCi0JcCA9IGVhdGVuX3BhZ2VzOwotCXdoaWxlIChwKSB7Ci0JCXEgPSBwLT5uZXh0OwotCQkvKiBXZSBkb24ndCB3YW50IHN3c3VzcF9mcmVlKCkgdG8gZnJlZSB0aGlzIHBhZ2UgYWdhaW4gKi8KLQkJQ2xlYXJQYWdlTm9zYXZlKHZpcnRfdG9fcGFnZShwKSk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwKTsKLQkJcCA9IHE7Ci0JfQotCWVhdGVuX3BhZ2VzID0gTlVMTDsKLX0KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdW5zYWZlX3BhZ2VzOwogCiAvKioKICAqCUBzYWZlX25lZWRlZCAtIG9uIHJlc3VtZSwgZm9yIHN0b3JpbmcgdGhlIFBCRSBsaXN0IGFuZCB0aGUgaW1hZ2UsCiAgKgl3ZSBjYW4gb25seSB1c2UgbWVtb3J5IHBhZ2VzIHRoYXQgZG8gbm90IGNvbmZsaWN0IHdpdGggdGhlIHBhZ2VzCi0gKgl3aGljaCBoYWQgYmVlbiB1c2VkIGJlZm9yZSBzdXNwZW5kLgorICoJdXNlZCBiZWZvcmUgc3VzcGVuZC4KICAqCiAgKglUaGUgdW5zYWZlIHBhZ2VzIGFyZSBtYXJrZWQgd2l0aCB0aGUgUEdfbm9zYXZlX2ZyZWUgZmxhZwotICoKLSAqCUFsbG9jYXRlZCBidXQgdW51c2FibGUgKGllIGVhdGVuKSBtZW1vcnkgcGFnZXMgc2hvdWxkIGJlIG1hcmtlZAotICoJc28gdGhhdCBzd3N1c3BfZnJlZSgpIGNhbiByZWxlYXNlIHRoZW0KKyAqCWFuZCB3ZSBjb3VudCB0aGVtIHVzaW5nIHVuc2FmZV9wYWdlcwogICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCAqYWxsb2NfaW1hZ2VfcGFnZShnZnBfdCBnZnBfbWFzaywgaW50IHNhZmVfbmVlZGVkKQogewogCXZvaWQgKnJlczsKIAorCXJlcyA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKGdmcF9tYXNrKTsKIAlpZiAoc2FmZV9uZWVkZWQpCi0JCWRvIHsKKwkJd2hpbGUgKHJlcyAmJiBQYWdlTm9zYXZlRnJlZSh2aXJ0X3RvX3BhZ2UocmVzKSkpIHsKKwkJCS8qIFRoZSBwYWdlIGlzIHVuc2FmZSwgbWFyayBpdCBmb3Igc3dzdXNwX2ZyZWUoKSAqLworCQkJU2V0UGFnZU5vc2F2ZSh2aXJ0X3RvX3BhZ2UocmVzKSk7CisJCQl1bnNhZmVfcGFnZXMrKzsKIAkJCXJlcyA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKGdmcF9tYXNrKTsKLQkJCWlmIChyZXMgJiYgUGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKHJlcykpKSB7Ci0JCQkJLyogVGhpcyBpcyBmb3Igc3dzdXNwX2ZyZWUoKSAqLwotCQkJCVNldFBhZ2VOb3NhdmUodmlydF90b19wYWdlKHJlcykpOwotCQkJCSgoc3RydWN0IGVhdGVuX3BhZ2UgKilyZXMpLT5uZXh0ID0gZWF0ZW5fcGFnZXM7Ci0JCQkJZWF0ZW5fcGFnZXMgPSByZXM7Ci0JCQl9Ci0JCX0gd2hpbGUgKHJlcyAmJiBQYWdlTm9zYXZlRnJlZSh2aXJ0X3RvX3BhZ2UocmVzKSkpOwotCWVsc2UKLQkJcmVzID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoZ2ZwX21hc2spOworCQl9CiAJaWYgKHJlcykgewogCQlTZXRQYWdlTm9zYXZlKHZpcnRfdG9fcGFnZShyZXMpKTsKIAkJU2V0UGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKHJlcykpOwpAQCAtMzc0LDcgKzQ0OSw4IEBACiAgKglPbiBlYWNoIHBhZ2Ugd2Ugc2V0IHVwIGEgbGlzdCBvZiBzdHJ1Y3RfcGJlIGVsZW1lbnRzLgogICovCiAKLXN0cnVjdCBwYmUgKmFsbG9jX3BhZ2VkaXIodW5zaWduZWQgaW50IG5yX3BhZ2VzLCBnZnBfdCBnZnBfbWFzaywgaW50IHNhZmVfbmVlZGVkKQorc3RhdGljIHN0cnVjdCBwYmUgKmFsbG9jX3BhZ2VkaXIodW5zaWduZWQgaW50IG5yX3BhZ2VzLCBnZnBfdCBnZnBfbWFzaywKKwkJCQkgaW50IHNhZmVfbmVlZGVkKQogewogCXVuc2lnbmVkIGludCBudW07CiAJc3RydWN0IHBiZSAqcGJsaXN0LCAqcGJlOwpAQCAtNjQyLDYgKzcxOCw4IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKKwl1bnNhZmVfcGFnZXMgPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxOSw0MiArNzk3LDk5IEBACiB9CiAKIC8qKgotICoJY3JlYXRlX2ltYWdlIC0gdXNlIG1ldGFkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUEJFIGxpc3QKKyAqCXByZXBhcmVfaW1hZ2UgLSB1c2UgbWV0YWRhdGEgY29udGFpbmVkIGluIHRoZSBQQkUgbGlzdAogICoJcG9pbnRlZCB0byBieSBwYWdlZGlyX25vc2F2ZSB0byBtYXJrIHRoZSBwYWdlcyB0aGF0IHdpbGwKICAqCWJlIG92ZXJ3cml0dGVuIGluIHRoZSBwcm9jZXNzIG9mIHJlc3RvcmluZyB0aGUgc3lzdGVtCi0gKgltZW1vcnkgc3RhdGUgZnJvbSB0aGUgaW1hZ2UgYW5kIGFsbG9jYXRlIG1lbW9yeSBmb3IKLSAqCXRoZSBpbWFnZSBhdm9pZGluZyB0aGVzZSBwYWdlcworICoJbWVtb3J5IHN0YXRlIGZyb20gdGhlIGltYWdlICgidW5zYWZlIiBwYWdlcykgYW5kIGFsbG9jYXRlCisgKgltZW1vcnkgZm9yIHRoZSBpbWFnZQorICoKKyAqCVRoZSBpZGVhIGlzIHRvIGFsbG9jYXRlIHRoZSBQQkUgbGlzdCBmaXJzdCBhbmQgdGhlbgorICoJYWxsb2NhdGUgYXMgbWFueSBwYWdlcyBhcyBpdCdzIG5lZWRlZCBmb3IgdGhlIGltYWdlIGRhdGEsCisgKglidXQgbm90IHRvIGFzc2lnbiB0aGVzZSBwYWdlcyB0byB0aGUgUEJFcyBpbml0aWFsbHkuCisgKglJbnN0ZWFkLCB3ZSBqdXN0IG1hcmsgdGhlbSBhcyBhbGxvY2F0ZWQgYW5kIGNyZWF0ZSBhIGxpc3QKKyAqCW9mICJzYWZlIiB3aGljaCB3aWxsIGJlIHVzZWQgbGF0ZXIKICAqLwogCi1zdGF0aWMgaW50IGNyZWF0ZV9pbWFnZShzdHJ1Y3Qgc25hcHNob3RfaGFuZGxlICpoYW5kbGUpCitzdHJ1Y3Qgc2FmZV9wYWdlIHsKKwlzdHJ1Y3Qgc2FmZV9wYWdlICpuZXh0OworCWNoYXIgcGFkZGluZ1tQQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKV07Cit9OworCitzdGF0aWMgc3RydWN0IHNhZmVfcGFnZSAqc2FmZV9wYWdlczsKKworc3RhdGljIGludCBwcmVwYXJlX2ltYWdlKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwotCXN0cnVjdCBwYmUgKnAsICpwYmxpc3Q7CisJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gbnJfY29weV9wYWdlczsKKwlzdHJ1Y3QgcGJlICpwLCAqcGJsaXN0ID0gTlVMTDsKIAogCXAgPSBwYWdlZGlyX25vc2F2ZTsKIAllcnJvciA9IG1hcmtfdW5zYWZlX3BhZ2VzKHApOwogCWlmICghZXJyb3IpIHsKLQkJcGJsaXN0ID0gYWxsb2NfcGFnZWRpcihucl9jb3B5X3BhZ2VzLCBHRlBfQVRPTUlDLCAxKTsKKwkJcGJsaXN0ID0gYWxsb2NfcGFnZWRpcihucl9wYWdlcywgR0ZQX0FUT01JQywgMSk7CiAJCWlmIChwYmxpc3QpCiAJCQljb3B5X3BhZ2VfYmFja3VwX2xpc3QocGJsaXN0LCBwKTsKIAkJZnJlZV9wYWdlZGlyKHAsIDApOwogCQlpZiAoIXBibGlzdCkKIAkJCWVycm9yID0gLUVOT01FTTsKIAl9Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBhbGxvY19kYXRhX3BhZ2VzKHBibGlzdCwgR0ZQX0FUT01JQywgMSk7CisJc2FmZV9wYWdlcyA9IE5VTEw7CisJaWYgKCFlcnJvciAmJiBucl9wYWdlcyA+IHVuc2FmZV9wYWdlcykgeworCQlucl9wYWdlcyAtPSB1bnNhZmVfcGFnZXM7CisJCXdoaWxlIChucl9wYWdlcy0tKSB7CisJCQlzdHJ1Y3Qgc2FmZV9wYWdlICpwdHI7CisKKwkJCXB0ciA9IChzdHJ1Y3Qgc2FmZV9wYWdlICopZ2V0X3plcm9lZF9wYWdlKEdGUF9BVE9NSUMpOworCQkJaWYgKCFwdHIpIHsKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIVBhZ2VOb3NhdmVGcmVlKHZpcnRfdG9fcGFnZShwdHIpKSkgeworCQkJCS8qIFRoZSBwYWdlIGlzICJzYWZlIiwgYWRkIGl0IHRvIHRoZSBsaXN0ICovCisJCQkJcHRyLT5uZXh0ID0gc2FmZV9wYWdlczsKKwkJCQlzYWZlX3BhZ2VzID0gcHRyOworCQkJfQorCQkJLyogTWFyayB0aGUgcGFnZSBhcyBhbGxvY2F0ZWQgKi8KKwkJCVNldFBhZ2VOb3NhdmUodmlydF90b19wYWdlKHB0cikpOworCQkJU2V0UGFnZU5vc2F2ZUZyZWUodmlydF90b19wYWdlKHB0cikpOworCQl9CisJfQogCWlmICghZXJyb3IpIHsKLQkJcmVsZWFzZV9lYXRlbl9wYWdlcygpOwogCQlwYWdlZGlyX25vc2F2ZSA9IHBibGlzdDsKIAl9IGVsc2UgewotCQlwYWdlZGlyX25vc2F2ZSA9IE5VTEw7CiAJCWhhbmRsZS0+cGJlID0gTlVMTDsKLQkJbnJfY29weV9wYWdlcyA9IDA7Ci0JCW5yX21ldGFfcGFnZXMgPSAwOworCQlzd3N1c3BfZnJlZSgpOwogCX0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKK3N0YXRpYyB2b2lkICpnZXRfYnVmZmVyKHN0cnVjdCBzbmFwc2hvdF9oYW5kbGUgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGJlICpwYmUgPSBoYW5kbGUtPnBiZSwgKmxhc3QgPSBoYW5kbGUtPmxhc3RfcGJlOworCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHBiZS0+b3JpZ19hZGRyZXNzKTsKKworCWlmIChQYWdlTm9zYXZlKHBhZ2UpICYmIFBhZ2VOb3NhdmVGcmVlKHBhZ2UpKSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYWxsb2NhdGVkIHRoZSAib3JpZ2luYWwiIHBhZ2UgZnJhbWUgYW5kIHdlIGNhbgorCQkgKiB1c2UgaXQgZGlyZWN0bHkgdG8gc3RvcmUgdGhlIHJlYWQgcGFnZQorCQkgKi8KKwkJcGJlLT5hZGRyZXNzID0gMDsKKwkJaWYgKGxhc3QgJiYgbGFzdC0+bmV4dCkKKwkJCWxhc3QtPm5leHQgPSBOVUxMOworCQlyZXR1cm4gKHZvaWQgKilwYmUtPm9yaWdfYWRkcmVzczsKKwl9CisJLyoKKwkgKiBUaGUgIm9yaWdpbmFsIiBwYWdlIGZyYW1lIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgYW5kIHdlIGhhdmUgdG8KKwkgKiB1c2UgYSAic2FmZSIgcGFnZSBmcmFtZSB0byBzdG9yZSB0aGUgcmVhZCBwYWdlCisJICovCisJcGJlLT5hZGRyZXNzID0gKHVuc2lnbmVkIGxvbmcpc2FmZV9wYWdlczsKKwlzYWZlX3BhZ2VzID0gc2FmZV9wYWdlcy0+bmV4dDsKKwlpZiAobGFzdCkKKwkJbGFzdC0+bmV4dCA9IHBiZTsKKwloYW5kbGUtPmxhc3RfcGJlID0gcGJlOworCXJldHVybiAodm9pZCAqKXBiZS0+YWRkcmVzczsKK30KKwogLyoqCiAgKglzbmFwc2hvdF93cml0ZV9uZXh0IC0gdXNlZCBmb3Igd3JpdGluZyB0aGUgc3lzdGVtIG1lbW9yeSBzbmFwc2hvdC4KICAqCkBAIC03OTksMTUgKzkzNCwxNiBAQAogCQl9IGVsc2UgaWYgKGhhbmRsZS0+cHJldiA8PSBucl9tZXRhX3BhZ2VzKSB7CiAJCQloYW5kbGUtPnBiZSA9IHVucGFja19vcmlnX2FkZHJlc3NlcyhidWZmZXIsIGhhbmRsZS0+cGJlKTsKIAkJCWlmICghaGFuZGxlLT5wYmUpIHsKLQkJCQllcnJvciA9IGNyZWF0ZV9pbWFnZShoYW5kbGUpOworCQkJCWVycm9yID0gcHJlcGFyZV9pbWFnZShoYW5kbGUpOwogCQkJCWlmIChlcnJvcikKIAkJCQkJcmV0dXJuIGVycm9yOwogCQkJCWhhbmRsZS0+cGJlID0gcGFnZWRpcl9ub3NhdmU7Ci0JCQkJaGFuZGxlLT5idWZmZXIgPSAodm9pZCAqKWhhbmRsZS0+cGJlLT5hZGRyZXNzOworCQkJCWhhbmRsZS0+bGFzdF9wYmUgPSBOVUxMOworCQkJCWhhbmRsZS0+YnVmZmVyID0gZ2V0X2J1ZmZlcihoYW5kbGUpOwogCQkJfQogCQl9IGVsc2UgewogCQkJaGFuZGxlLT5wYmUgPSBoYW5kbGUtPnBiZS0+bmV4dDsKLQkJCWhhbmRsZS0+YnVmZmVyID0gKHZvaWQgKiloYW5kbGUtPnBiZS0+YWRkcmVzczsKKwkJCWhhbmRsZS0+YnVmZmVyID0gZ2V0X2J1ZmZlcihoYW5kbGUpOwogCQl9CiAJCWhhbmRsZS0+cHJldiA9IGhhbmRsZS0+cGFnZTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc3dzdXNwLmMgYi9rZXJuZWwvcG93ZXIvc3dzdXNwLmMKaW5kZXggYzQwMTZjYi4uZjBlZTRlNyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3N3c3VzcC5jCisrKyBiL2tlcm5lbC9wb3dlci9zd3N1c3AuYwpAQCAtNjIsMTYgKzYyLDYgQEAKIAogaW50IGluX3N1c3BlbmQgX19ub3NhdmVkYXRhID0gMDsKIAotI2lmZGVmIENPTkZJR19ISUdITUVNCi11bnNpZ25lZCBpbnQgY291bnRfaGlnaG1lbV9wYWdlcyh2b2lkKTsKLWludCBzYXZlX2hpZ2htZW0odm9pZCk7Ci1pbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbnQgc2F2ZV9oaWdobWVtKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbnQgcmVzdG9yZV9oaWdobWVtKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgY291bnRfaGlnaG1lbV9wYWdlcyh2b2lkKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYKLQogLyoqCiAgKglUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgdHJhY2luZyB0aGUgYWxsb2NhdGVkCiAgKglzd2FwIHBhZ2VzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIGZyZWVkIGluIGNhc2Ugb2YgYW4gZXJyb3IuCkBAIC0xNzUsNiArMTY1LDEyIEBACiAgKi8KIAogI2RlZmluZSBTSFJJTktfQklURQkxMDAwMAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fc2hyaW5rX21lbW9yeShsb25nIHRtcCkKK3sKKwlpZiAodG1wID4gU0hSSU5LX0JJVEUpCisJCXRtcCA9IFNIUklOS19CSVRFOworCXJldHVybiBzaHJpbmtfYWxsX21lbW9yeSh0bXApOworfQogCiBpbnQgc3dzdXNwX3Nocmlua19tZW1vcnkodm9pZCkKIHsKQEAgLTE4NiwyMSArMTgyLDIzIEBACiAKIAlwcmludGsoIlNocmlua2luZyBtZW1vcnkuLi4gICIpOwogCWRvIHsKLQkJc2l6ZSA9IDIgKiBjb3VudF9oaWdobWVtX3BhZ2VzKCk7CisJCXNpemUgPSAyICogY291bnRfc3BlY2lhbF9wYWdlcygpOwogCQlzaXplICs9IHNpemUgLyA1MCArIGNvdW50X2RhdGFfcGFnZXMoKTsKIAkJc2l6ZSArPSAoc2l6ZSArIFBCRVNfUEVSX1BBR0UgLSAxKSAvIFBCRVNfUEVSX1BBR0UgKwogCQkJUEFHRVNfRk9SX0lPOwogCQl0bXAgPSBzaXplOwogCQlmb3JfZWFjaF96b25lICh6b25lKQotCQkJaWYgKCFpc19oaWdobWVtKHpvbmUpKQorCQkJaWYgKCFpc19oaWdobWVtKHpvbmUpICYmIHBvcHVsYXRlZF96b25lKHpvbmUpKSB7CiAJCQkJdG1wIC09IHpvbmUtPmZyZWVfcGFnZXM7CisJCQkJdG1wICs9IHpvbmUtPmxvd21lbV9yZXNlcnZlW1pPTkVfTk9STUFMXTsKKwkJCX0KIAkJaWYgKHRtcCA+IDApIHsKLQkJCXRtcCA9IHNocmlua19hbGxfbWVtb3J5KFNIUklOS19CSVRFKTsKKwkJCXRtcCA9IF9fc2hyaW5rX21lbW9yeSh0bXApOwogCQkJaWYgKCF0bXApCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCQlwYWdlcyArPSB0bXA7CiAJCX0gZWxzZSBpZiAoc2l6ZSA+IGltYWdlX3NpemUgLyBQQUdFX1NJWkUpIHsKLQkJCXRtcCA9IHNocmlua19hbGxfbWVtb3J5KFNIUklOS19CSVRFKTsKKwkJCXRtcCA9IF9fc2hyaW5rX21lbW9yeShzaXplIC0gKGltYWdlX3NpemUgLyBQQUdFX1NJWkUpKTsKIAkJCXBhZ2VzICs9IHRtcDsKIAkJfQogCQlwcmludGsoIlxiJWMiLCBwW2krKyU0XSk7CkBAIC0yMjgsNyArMjI2LDcgQEAKIAkJZ290byBFbmFibGVfaXJxczsKIAl9CiAKLQlpZiAoKGVycm9yID0gc2F2ZV9oaWdobWVtKCkpKSB7CisJaWYgKChlcnJvciA9IHNhdmVfc3BlY2lhbF9tZW0oKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzd3N1c3A6IE5vdCBlbm91Z2ggZnJlZSBwYWdlcyBmb3IgaGlnaG1lbVxuIik7CiAJCWdvdG8gUmVzdG9yZV9oaWdobWVtOwogCX0KQEAgLTIzOSw3ICsyMzcsNyBAQAogCS8qIFJlc3RvcmUgY29udHJvbCBmbG93IG1hZ2ljYWxseSBhcHBlYXJzIGhlcmUgKi8KIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogUmVzdG9yZV9oaWdobWVtOgotCXJlc3RvcmVfaGlnaG1lbSgpOworCXJlc3RvcmVfc3BlY2lhbF9tZW0oKTsKIAlkZXZpY2VfcG93ZXJfdXAoKTsKIEVuYWJsZV9pcnFzOgogCWxvY2FsX2lycV9lbmFibGUoKTsKQEAgLTI2NSw3ICsyNjMsNyBAQAogCSAqLwogCXN3c3VzcF9mcmVlKCk7CiAJcmVzdG9yZV9wcm9jZXNzb3Jfc3RhdGUoKTsKLQlyZXN0b3JlX2hpZ2htZW0oKTsKKwlyZXN0b3JlX3NwZWNpYWxfbWVtKCk7CiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCWRldmljZV9wb3dlcl91cCgpOwogCWxvY2FsX2lycV9lbmFibGUoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wcmludGsuYyBiL2tlcm5lbC9wcmludGsuYwppbmRleCAxOWE5NTU2Li45NWI3ZmUxIDEwMDY0NAotLS0gYS9rZXJuZWwvcHJpbnRrLmMKKysrIGIva2VybmVsL3ByaW50ay5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgkJCS8qIEZvciBpbl9pbnRlcnJ1cHQoKSAqLwogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0zMjcsNyArMzI4LDkgQEAKIAlzdHJ1Y3QgY29uc29sZSAqY29uOwogCiAJZm9yIChjb24gPSBjb25zb2xlX2RyaXZlcnM7IGNvbjsgY29uID0gY29uLT5uZXh0KSB7Ci0JCWlmICgoY29uLT5mbGFncyAmIENPTl9FTkFCTEVEKSAmJiBjb24tPndyaXRlKQorCQlpZiAoKGNvbi0+ZmxhZ3MgJiBDT05fRU5BQkxFRCkgJiYgY29uLT53cml0ZSAmJgorCQkJCShjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkgfHwKKwkJCQkoY29uLT5mbGFncyAmIENPTl9BTllUSU1FKSkpCiAJCQljb24tPndyaXRlKGNvbiwgJkxPR19CVUYoc3RhcnQpLCBlbmQgLSBzdGFydCk7CiAJfQogfQpAQCAtNDM3LDYgKzQ0MCw3IEBACiAjZWxzZQogc3RhdGljIGludCBwcmludGtfdGltZSA9IDA7CiAjZW5kaWYKK21vZHVsZV9wYXJhbShwcmludGtfdGltZSwgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CiAKIHN0YXRpYyBpbnQgX19pbml0IHByaW50a190aW1lX3NldHVwKGNoYXIgKnN0cikKIHsKQEAgLTQ1Myw2ICs0NTcsMTggQEAKIAlyZXR1cm4gc2NoZWRfY2xvY2soKTsKIH0KIAorLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgY29uc29sZSByZWdpc3RlcmVkIHRoYXQgY2FuIGJlIGNhbGxlZCBlYXJseSBpbiBib290LiAqLworc3RhdGljIGludCBoYXZlX2NhbGxhYmxlX2NvbnNvbGUodm9pZCkKK3sKKwlzdHJ1Y3QgY29uc29sZSAqY29uOworCisJZm9yIChjb24gPSBjb25zb2xlX2RyaXZlcnM7IGNvbjsgY29uID0gY29uLT5uZXh0KQorCQlpZiAoY29uLT5mbGFncyAmIENPTl9BTllUSU1FKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBwcmludGsgLSBwcmludCBhIGtlcm5lbCBtZXNzYWdlCiAgKiBAZm10OiBmb3JtYXQgc3RyaW5nCkBAIC01NjYsMjcgKzU4MiwyOSBAQAogCQkJbG9nX2xldmVsX3Vua25vd24gPSAxOwogCX0KIAotCWlmICghY3B1X29ubGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKSB7Ci0JCS8qCi0JCSAqIFNvbWUgY29uc29sZSBkcml2ZXJzIG1heSBhc3N1bWUgdGhhdCBwZXItY3B1IHJlc291cmNlcyBoYXZlCi0JCSAqIGJlZW4gYWxsb2NhdGVkLiAgU28gZG9uJ3QgYWxsb3cgdGhlbSB0byBiZSBjYWxsZWQgYnkgdGhpcwotCQkgKiBDUFUgdW50aWwgaXQgaXMgb2ZmaWNpYWxseSB1cC4gIFdlIHNob3VsZG4ndCBiZSBjYWxsaW5nIGludG8KLQkJICogcmFuZG9tIGNvbnNvbGUgZHJpdmVycyBvbiBhIENQVSB3aGljaCBkb2Vzbid0IGV4aXN0IHlldC4uCi0JCSAqLwotCQlwcmludGtfY3B1ID0gVUlOVF9NQVg7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7Ci0JCWdvdG8gb3V0OwotCX0KIAlpZiAoIWRvd25fdHJ5bG9jaygmY29uc29sZV9zZW0pKSB7Ci0JCWNvbnNvbGVfbG9ja2VkID0gMTsKIAkJLyoKLQkJICogV2Ugb3duIHRoZSBkcml2ZXJzLiAgV2UgY2FuIGRyb3AgdGhlIHNwaW5sb2NrIGFuZCBsZXQKLQkJICogcmVsZWFzZV9jb25zb2xlX3NlbSgpIHByaW50IHRoZSB0ZXh0CisJCSAqIFdlIG93biB0aGUgZHJpdmVycy4gIFdlIGNhbiBkcm9wIHRoZSBzcGlubG9jayBhbmQKKwkJICogbGV0IHJlbGVhc2VfY29uc29sZV9zZW0oKSBwcmludCB0aGUgdGV4dCwgbWF5YmUgLi4uCiAJCSAqLworCQljb25zb2xlX2xvY2tlZCA9IDE7CiAJCXByaW50a19jcHUgPSBVSU5UX01BWDsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKLQkJY29uc29sZV9tYXlfc2NoZWR1bGUgPSAwOwotCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CisKKwkJLyoKKwkJICogQ29uc29sZSBkcml2ZXJzIG1heSBhc3N1bWUgdGhhdCBwZXItY3B1IHJlc291cmNlcyBoYXZlCisJCSAqIGJlZW4gYWxsb2NhdGVkLiBTbyB1bmxlc3MgdGhleSdyZSBleHBsaWNpdGx5IG1hcmtlZCBhcworCQkgKiBiZWluZyBhYmxlIHRvIGNvcGUgKENPTl9BTllUSU1FKSBkb24ndCBjYWxsIHRoZW0gdW50aWwKKwkJICogdGhpcyBDUFUgaXMgb2ZmaWNpYWxseSB1cC4KKwkJICovCisJCWlmIChjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkgfHwgaGF2ZV9jYWxsYWJsZV9jb25zb2xlKCkpIHsKKwkJCWNvbnNvbGVfbWF5X3NjaGVkdWxlID0gMDsKKwkJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlbGVhc2UgYnkgaGFuZCB0byBhdm9pZCBmbHVzaGluZyB0aGUgYnVmZmVyLiAqLworCQkJY29uc29sZV9sb2NrZWQgPSAwOworCQkJdXAoJmNvbnNvbGVfc2VtKTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFNvbWVvbmUgZWxzZSBvd25zIHRoZSBkcml2ZXJzLiAgV2UgZHJvcCB0aGUgc3BpbmxvY2ssIHdoaWNoCkBAIC01OTYsNyArNjE0LDcgQEAKIAkJcHJpbnRrX2NwdSA9IFVJTlRfTUFYOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2didWZfbG9jaywgZmxhZ3MpOwogCX0KLW91dDoKKwogCXByZWVtcHRfZW5hYmxlKCk7CiAJcmV0dXJuIHByaW50ZWRfbGVuOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXBkYXRlLmMgYi9rZXJuZWwvcmN1cGRhdGUuYwppbmRleCAyMDU4Zjg4Li4yMGU5NzEwIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cGRhdGUuYworKysgYi9rZXJuZWwvcmN1cGRhdGUuYwpAQCAtNjEyLDE0ICs2MTIsNiBAQAogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJjdS5jb21wbGV0aW9uKTsKIH0KIAotLyoKLSAqIERlcHJlY2F0ZWQsIHVzZSBzeW5jaHJvbml6ZV9yY3UoKSBvciBzeW5jaHJvbml6ZV9zY2hlZCgpIGluc3RlYWQuCi0gKi8KLXZvaWQgc3luY2hyb25pemVfa2VybmVsKHZvaWQpCi17Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci19Ci0KIG1vZHVsZV9wYXJhbShibGltaXQsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0ocWhpbWFyaywgaW50LCAwKTsKIG1vZHVsZV9wYXJhbShxbG93bWFyaywgaW50LCAwKTsKQEAgLTYyNyw3ICs2MTksNiBAQAogbW9kdWxlX3BhcmFtKHJzaW50ZXJ2YWwsIGludCwgMCk7CiAjZW5kaWYKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9iYXRjaGVzX2NvbXBsZXRlZCk7Ci1FWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoY2FsbF9yY3UpOwkvKiBXQVJOSU5HOiBHUEwtb25seSBpbiBBcHJpbCAyMDA2LiAqLwotRVhQT1JUX1NZTUJPTF9HUExfRlVUVVJFKGNhbGxfcmN1X2JoKTsJLyogV0FSTklORzogR1BMLW9ubHkgaW4gQXByaWwgMjAwNi4gKi8KK0VYUE9SVF9TWU1CT0xfR1BMKGNhbGxfcmN1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNhbGxfcmN1X2JoKTsKIEVYUE9SVF9TWU1CT0xfR1BMKHN5bmNocm9uaXplX3JjdSk7Ci1FWFBPUlRfU1lNQk9MX0dQTF9GVVRVUkUoc3luY2hyb25pemVfa2VybmVsKTsgLyogV0FSTklORzogR1BMLW9ubHkgaW4gQXByaWwgMjAwNi4gKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC5jIGIva2VybmVsL3NjaGVkLmMKaW5kZXggYzEzZjFiZC4uZjA2ZDA1OSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkLmMKKysrIGIva2VybmVsL3NjaGVkLmMKQEAgLTM4ODYsNiArMzg4NiwxMCBAQAogCQkJIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIocCwgMCwgTlVMTCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCiAJY3B1c19hbGxvd2VkID0gY3B1c2V0X2NwdXNfYWxsb3dlZChwKTsKIAljcHVzX2FuZChuZXdfbWFzaywgbmV3X21hc2ssIGNwdXNfYWxsb3dlZCk7CiAJcmV0dmFsID0gc2V0X2NwdXNfYWxsb3dlZChwLCBuZXdfbWFzayk7CkBAIC0zOTU0LDcgKzM5NTgsMTAgQEAKIAlpZiAoIXApCiAJCWdvdG8gb3V0X3VubG9jazsKIAotCXJldHZhbCA9IDA7CisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19nZXRzY2hlZHVsZXIocCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCiAJY3B1c19hbmQoKm1hc2ssIHAtPmNwdXNfYWxsb3dlZCwgY3B1X29ubGluZV9tYXApOwogCiBvdXRfdW5sb2NrOgpAQCAtNDA0Niw2ICs0MDUzLDkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fY29uZF9yZXNjaGVkKHZvaWQpCiB7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQCisJX19taWdodF9zbGVlcChfX0ZJTEVfXywgX19MSU5FX18pOworI2VuZGlmCiAJLyoKIAkgKiBUaGUgQktTIG1pZ2h0IGJlIHJlYWNxdWlyZWQgYmVmb3JlIHdlIGhhdmUgZHJvcHBlZAogCSAqIFBSRUVNUFRfQUNUSVZFLCB3aGljaCBjb3VsZCB0cmlnZ2VyIGEgc2Vjb25kCkBAIC00MTQyLDcgKzQxNTIsNyBAQAogICovCiB2b2lkIF9fc2NoZWQgaW9fc2NoZWR1bGUodm9pZCkKIHsKLQlzdHJ1Y3QgcnVucXVldWUgKnJxID0gJnBlcl9jcHUocnVucXVldWVzLCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlzdHJ1Y3QgcnVucXVldWUgKnJxID0gJl9fcmF3X2dldF9jcHVfdmFyKHJ1bnF1ZXVlcyk7CiAKIAlhdG9taWNfaW5jKCZycS0+bnJfaW93YWl0KTsKIAlzY2hlZHVsZSgpOwpAQCAtNDE1Myw3ICs0MTYzLDcgQEAKIAogbG9uZyBfX3NjaGVkIGlvX3NjaGVkdWxlX3RpbWVvdXQobG9uZyB0aW1lb3V0KQogewotCXN0cnVjdCBydW5xdWV1ZSAqcnEgPSAmcGVyX2NwdShydW5xdWV1ZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXN0cnVjdCBydW5xdWV1ZSAqcnEgPSAmX19yYXdfZ2V0X2NwdV92YXIocnVucXVldWVzKTsKIAlsb25nIHJldDsKIAogCWF0b21pY19pbmMoJnJxLT5ucl9pb3dhaXQpOwpAQCAtNDc0Niw2ICs0NzU2LDggQEAKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCWlmICghY3B1X3JxKGNwdSktPm1pZ3JhdGlvbl90aHJlYWQpCisJCQlicmVhazsKIAkJLyogVW5iaW5kIGl0IGZyb20gb2ZmbGluZSBjcHUgc28gaXQgY2FuIHJ1bi4gIEZhbGwgdGhydS4gKi8KIAkJa3RocmVhZF9iaW5kKGNwdV9ycShjcHUpLT5taWdyYXRpb25fdGhyZWFkLAogCQkJICAgICBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggMzM2ZjkyZC4uOWUyZjFjNiAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC00NzAsNiArNDcwLDggQEAKIAkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAJY2FzZSBDUFVfVVBfQ0FOQ0VMRUQ6CisJCWlmICghcGVyX2NwdShrc29mdGlycWQsIGhvdGNwdSkpCisJCQlicmVhazsKIAkJLyogVW5iaW5kIHNvIGl0IGNhbiBydW4uICBGYWxsIHRocnUuICovCiAJCWt0aHJlYWRfYmluZChwZXJfY3B1KGtzb2Z0aXJxZCwgaG90Y3B1KSwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMgYi9rZXJuZWwvc29mdGxvY2t1cC5jCmluZGV4IDE0YzdmYWYuLmI1YzNiOTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0bG9ja3VwLmMKKysrIGIva2VybmVsL3NvZnRsb2NrdXAuYwpAQCAtMzYsNyArMzYsNyBAQAogCiB2b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKIHsKLQlwZXJfY3B1KHRvdWNoX3RpbWVzdGFtcCwgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgPSBqaWZmaWVzOworCV9fcmF3X2dldF9jcHVfdmFyKHRvdWNoX3RpbWVzdGFtcCkgPSBqaWZmaWVzOwogfQogRVhQT1JUX1NZTUJPTCh0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKTsKIApAQCAtMTI3LDYgKzEyNyw4IEBACiAJCWJyZWFrOwogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgorCQlpZiAoIXBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSkKKwkJCWJyZWFrOwogCQkvKiBVbmJpbmQgc28gaXQgY2FuIHJ1bi4gIEZhbGwgdGhydS4gKi8KIAkJa3RocmVhZF9iaW5kKHBlcl9jcHUod2F0Y2hkb2dfdGFzaywgaG90Y3B1KSwKIAkJCSAgICAgYW55X29ubGluZV9jcHUoY3B1X29ubGluZV9tYXApKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zdG9wX21hY2hpbmUuYyBiL2tlcm5lbC9zdG9wX21hY2hpbmUuYwppbmRleCBkY2ZiNWQ3Li4yYzBhYWNjIDEwMDY0NAotLS0gYS9rZXJuZWwvc3RvcF9tYWNoaW5lLmMKKysrIGIva2VybmVsL3N0b3BfbWFjaGluZS5jCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTI1LDEzICsyNiwxMSBAQAogc3RhdGljIGF0b21pY190IHN0b3BtYWNoaW5lX3RocmVhZF9hY2s7CiBzdGF0aWMgREVDTEFSRV9NVVRFWChzdG9wbWFjaGluZV9tdXRleCk7CiAKLXN0YXRpYyBpbnQgc3RvcG1hY2hpbmUodm9pZCAqY3B1KQorc3RhdGljIGludCBzdG9wbWFjaGluZSh2b2lkICp1bnVzZWQpCiB7CiAJaW50IGlycXNfZGlzYWJsZWQgPSAwOwogCWludCBwcmVwYXJlZCA9IDA7CiAKLQlzZXRfY3B1c19hbGxvd2VkKGN1cnJlbnQsIGNwdW1hc2tfb2ZfY3B1KChpbnQpKGxvbmcpY3B1KSk7Ci0KIAkvKiBBY2s6IHdlIGFyZSBhbGl2ZSAqLwogCXNtcF9tYigpOyAvKiBUaGVvcmV0aWNhbGx5IHRoZSBhY2sgPSAwIG1pZ2h0IG5vdCBiZSBvbiB0aGlzIENQVSB5ZXQuICovCiAJYXRvbWljX2luYygmc3RvcG1hY2hpbmVfdGhyZWFkX2Fjayk7CkBAIC04NSw3ICs4NCw4IEBACiAKIHN0YXRpYyBpbnQgc3RvcF9tYWNoaW5lKHZvaWQpCiB7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CiAJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtID0geyAuc2NoZWRfcHJpb3JpdHkgPSBNQVhfUlRfUFJJTy0xIH07CiAKIAkvKiBPbmUgaGlnaC1wcmlvIHRocmVhZCBwZXIgY3B1LiAgV2UnbGwgZG8gdGhpcyBvbmUuICovCkBAIC05NiwxMSArOTYsMTYgQEAKIAlzdG9wbWFjaGluZV9zdGF0ZSA9IFNUT1BNQUNISU5FX1dBSVQ7CiAKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CiAJCWlmIChpID09IHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpCiAJCQljb250aW51ZTsKLQkJcmV0ID0ga2VybmVsX3RocmVhZChzdG9wbWFjaGluZSwgKHZvaWQgKikobG9uZylpLENMT05FX0tFUk5FTCk7Ci0JCWlmIChyZXQgPCAwKQorCQl0c2sgPSBrdGhyZWFkX2NyZWF0ZShzdG9wbWFjaGluZSwgTlVMTCwgInN0b3BtYWNoaW5lIik7CisJCWlmIChJU19FUlIodHNrKSkgeworCQkJcmV0ID0gUFRSX0VSUih0c2spOwogCQkJYnJlYWs7CisJCX0KKwkJa3RocmVhZF9iaW5kKHRzaywgaSk7CisJCXdha2VfdXBfcHJvY2Vzcyh0c2spOwogCQlzdG9wbWFjaGluZV9udW1fdGhyZWFkcysrOwogCX0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IDBiNmVjMGUuLjJkNTE3OWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L3ByY3RsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNTcsNiArNTYsMTIgQEAKICNpZm5kZWYgR0VUX0ZQRVhDX0NUTAogIyBkZWZpbmUgR0VUX0ZQRVhDX0NUTChhLGIpCSgtRUlOVkFMKQogI2VuZGlmCisjaWZuZGVmIEdFVF9FTkRJQU4KKyMgZGVmaW5lIEdFVF9FTkRJQU4oYSxiKQkoLUVJTlZBTCkKKyNlbmRpZgorI2lmbmRlZiBTRVRfRU5ESUFOCisjIGRlZmluZSBTRVRfRU5ESUFOKGEsYikJKC1FSU5WQUwpCisjZW5kaWYKIAogLyoKICAqIHRoaXMgaXMgd2hlcmUgdGhlIHN5c3RlbS13aWRlIG92ZXJmbG93IFVJRCBhbmQgR0lEIGFyZSBkZWZpbmVkLCBmb3IKQEAgLTEzMiwxNCArMTM3LDE1IEBACiAJCXVuc2lnbmVkIGxvbmcgdmFsLCB2b2lkICp2KQogewogCWludCByZXQgPSBOT1RJRllfRE9ORTsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iOworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsICpuZXh0X25iOwogCiAJbmIgPSByY3VfZGVyZWZlcmVuY2UoKm5sKTsKIAl3aGlsZSAobmIpIHsKKwkJbmV4dF9uYiA9IHJjdV9kZXJlZmVyZW5jZShuYi0+bmV4dCk7CiAJCXJldCA9IG5iLT5ub3RpZmllcl9jYWxsKG5iLCB2YWwsIHYpOwogCQlpZiAoKHJldCAmIE5PVElGWV9TVE9QX01BU0spID09IE5PVElGWV9TVE9QX01BU0spCiAJCQlicmVhazsKLQkJbmIgPSByY3VfZGVyZWZlcmVuY2UobmItPm5leHQpOworCQluYiA9IG5leHRfbmI7CiAJfQogCXJldHVybiByZXQ7CiB9CkBAIC01ODMsNyArNTg5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVtZXJnZW5jeV9yZXN0YXJ0KTsKIAotdm9pZCBrZXJuZWxfcmVzdGFydF9wcmVwYXJlKGNoYXIgKmNtZCkKK3N0YXRpYyB2b2lkIGtlcm5lbF9yZXN0YXJ0X3ByZXBhcmUoY2hhciAqY21kKQogewogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJlYm9vdF9ub3RpZmllcl9saXN0LCBTWVNfUkVTVEFSVCwgY21kKTsKIAlzeXN0ZW1fc3RhdGUgPSBTWVNURU1fUkVTVEFSVDsKQEAgLTYxNyw3ICs2MjMsNyBAQAogICoJTW92ZSBpbnRvIHBsYWNlIGFuZCBzdGFydCBleGVjdXRpbmcgYSBwcmVsb2FkZWQgc3RhbmRhbG9uZQogICoJZXhlY3V0YWJsZS4gIElmIG5vdGhpbmcgd2FzIHByZWxvYWRlZCByZXR1cm4gYW4gZXJyb3IuCiAgKi8KLXZvaWQga2VybmVsX2tleGVjKHZvaWQpCitzdGF0aWMgdm9pZCBrZXJuZWxfa2V4ZWModm9pZCkKIHsKICNpZmRlZiBDT05GSUdfS0VYRUMKIAlzdHJ1Y3Qga2ltYWdlICppbWFnZTsKQEAgLTYzMSw3ICs2MzcsNiBAQAogCW1hY2hpbmVfa2V4ZWMoaW1hZ2UpOwogI2VuZGlmCiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChrZXJuZWxfa2V4ZWMpOwogCiB2b2lkIGtlcm5lbF9zaHV0ZG93bl9wcmVwYXJlKGVudW0gc3lzdGVtX3N0YXRlcyBzdGF0ZSkKIHsKQEAgLTE4NjAsMjMgKzE4NjUsMjAgQEAKICAqIGZpZWxkcyB3aGVuIHJlYXBpbmcsIHNvIGEgc2FtcGxlIGVpdGhlciBnZXRzIGFsbCB0aGUgYWRkaXRpb25zIG9mIGEKICAqIGdpdmVuIGNoaWxkIGFmdGVyIGl0J3MgcmVhcGVkLCBvciBub25lIHNvIHRoaXMgc2FtcGxlIGlzIGJlZm9yZSByZWFwaW5nLgogICoKLSAqIHRhc2tsaXN0X2xvY2sgbG9ja2luZyBvcHRpbWlzYXRpb246Ci0gKiBJZiB3ZSBhcmUgY3VycmVudCBhbmQgc2luZ2xlIHRocmVhZGVkLCB3ZSBkbyBub3QgbmVlZCB0byB0YWtlIHRoZSB0YXNrbGlzdAotICogbG9jayBvciB0aGUgc2lnbG9jay4gIE5vIG9uZSBlbHNlIGNhbiB0YWtlIG91ciBzaWduYWxfc3RydWN0IGF3YXksCi0gKiBubyBvbmUgZWxzZSBjYW4gcmVhcCB0aGUgY2hpbGRyZW4gdG8gdXBkYXRlIHNpZ25hbC0+YyogY291bnRlcnMsIGFuZAotICogbm8gb25lIGVsc2UgY2FuIHJhY2Ugd2l0aCB0aGUgc2lnbmFsLT4gZmllbGRzLgotICogSWYgd2UgZG8gbm90IHRha2UgdGhlIHRhc2tsaXN0X2xvY2ssIHRoZSBzaWduYWwtPiBmaWVsZHMgY291bGQgYmUgcmVhZAotICogb3V0IG9mIG9yZGVyIHdoaWxlIGFub3RoZXIgdGhyZWFkIHdhcyBqdXN0IGV4aXRpbmcuIFNvIHdlIHBsYWNlIGEKLSAqIHJlYWQgbWVtb3J5IGJhcnJpZXIgd2hlbiB3ZSBhdm9pZCB0aGUgbG9jay4gIE9uIHRoZSB3cml0ZXIgc2lkZSwKLSAqIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGlzIGltcGxpZWQgaW4gIF9fZXhpdF9zaWduYWwgYXMgX19leGl0X3NpZ25hbCByZWxlYXNlcwotICogdGhlIHNpZ2xvY2sgc3BpbmxvY2sgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNpZ25hbC0+IGZpZWxkcy4KLSAqCi0gKiBXZSBkb24ndCByZWFsbHkgbmVlZCB0aGUgc2lnbG9jayB3aGVuIHdlIGFjY2VzcyB0aGUgbm9uIGMqIGZpZWxkcwotICogb2YgdGhlIHNpZ25hbF9zdHJ1Y3QgKGZvciBSVVNBR0VfU0VMRikgZXZlbiBpbiBtdWx0aXRocmVhZGVkCi0gKiBjYXNlLCBzaW5jZSB3ZSB0YWtlIHRoZSB0YXNrbGlzdCBsb2NrIGZvciByZWFkIGFuZCB0aGUgbm9uIGMqIHNpZ25hbC0+Ci0gKiBmaWVsZHMgYXJlIHVwZGF0ZWQgb25seSBpbiBfX2V4aXRfc2lnbmFsLCB3aGljaCBpcyBjYWxsZWQgd2l0aAotICogdGFza2xpc3RfbG9jayB0YWtlbiBmb3Igd3JpdGUsIGhlbmNlIHRoZXNlIHR3byB0aHJlYWRzIGNhbm5vdCBleGVjdXRlCi0gKiBjb25jdXJyZW50bHkuCisgKiBMb2NraW5nOgorICogV2UgbmVlZCB0byB0YWtlIHRoZSBzaWdsb2NrIGZvciBDSElMREVSRU4sIFNFTEYgYW5kIEJPVEgKKyAqIGZvciAgdGhlIGNhc2VzIGN1cnJlbnQgbXVsdGl0aHJlYWRlZCwgbm9uLWN1cnJlbnQgc2luZ2xlIHRocmVhZGVkCisgKiBub24tY3VycmVudCBtdWx0aXRocmVhZGVkLiAgVGhyZWFkIHRyYXZlcnNhbCBpcyBub3cgc2FmZSB3aXRoCisgKiB0aGUgc2lnbG9jayBoZWxkLgorICogU3RyaWN0bHkgc3BlYWtpbmcsIHdlIGRvbm90IG5lZWQgdG8gdGFrZSB0aGUgc2lnbG9jayBpZiB3ZSBhcmUgY3VycmVudCBhbmQKKyAqIHNpbmdsZSB0aHJlYWRlZCwgIGFzIG5vIG9uZSBlbHNlIGNhbiB0YWtlIG91ciBzaWduYWxfc3RydWN0IGF3YXksIG5vIG9uZQorICogZWxzZSBjYW4gIHJlYXAgdGhlICBjaGlsZHJlbiB0byB1cGRhdGUgc2lnbmFsLT5jKiBjb3VudGVycywgYW5kIG5vIG9uZSBlbHNlCisgKiBjYW4gcmFjZSB3aXRoIHRoZSBzaWduYWwtPiBmaWVsZHMuIElmIHdlIGRvIG5vdCB0YWtlIGFueSBsb2NrLCB0aGUKKyAqIHNpZ25hbC0+IGZpZWxkcyBjb3VsZCBiZSByZWFkIG91dCBvZiBvcmRlciB3aGlsZSBhbm90aGVyIHRocmVhZCB3YXMganVzdAorICogZXhpdGluZy4gU28gd2Ugc2hvdWxkICBwbGFjZSBhIHJlYWQgbWVtb3J5IGJhcnJpZXIgd2hlbiB3ZSBhdm9pZCB0aGUgbG9jay4KKyAqIE9uIHRoZSB3cml0ZXIgc2lkZSwgIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGlzIGltcGxpZWQgaW4gIF9fZXhpdF9zaWduYWwKKyAqIGFzIF9fZXhpdF9zaWduYWwgcmVsZWFzZXMgIHRoZSBzaWdsb2NrIHNwaW5sb2NrIGFmdGVyIHVwZGF0aW5nIHRoZSBzaWduYWwtPgorICogZmllbGRzLiBCdXQgd2UgZG9uJ3QgZG8gdGhpcyB5ZXQgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLgogICoKICAqLwogCkBAIC0xODg1LDM1ICsxODg3LDI1IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJY3B1dGltZV90IHV0aW1lLCBzdGltZTsKLQlpbnQgbmVlZF9sb2NrID0gMDsKIAogCW1lbXNldCgoY2hhciAqKSByLCAwLCBzaXplb2YgKnIpOwogCXV0aW1lID0gc3RpbWUgPSBjcHV0aW1lX3plcm87CiAKLQlpZiAocCAhPSBjdXJyZW50IHx8ICF0aHJlYWRfZ3JvdXBfZW1wdHkocCkpCi0JCW5lZWRfbG9jayA9IDE7Ci0KLQlpZiAobmVlZF9sb2NrKSB7Ci0JCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7Ci0JCWlmICh1bmxpa2VseSghcC0+c2lnbmFsKSkgewotCQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlCi0JCS8qIFNlZSBsb2NraW5nIGNvbW1lbnRzIGFib3ZlICovCi0JCXNtcF9ybWIoKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJaWYgKCFsb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQogCiAJc3dpdGNoICh3aG8pIHsKIAkJY2FzZSBSVVNBR0VfQk9USDoKIAkJY2FzZSBSVVNBR0VfQ0hJTERSRU46Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOwogCQkJdXRpbWUgPSBwLT5zaWduYWwtPmN1dGltZTsKIAkJCXN0aW1lID0gcC0+c2lnbmFsLT5jc3RpbWU7CiAJCQlyLT5ydV9udmNzdyA9IHAtPnNpZ25hbC0+Y252Y3N3OwogCQkJci0+cnVfbml2Y3N3ID0gcC0+c2lnbmFsLT5jbml2Y3N3OwogCQkJci0+cnVfbWluZmx0ID0gcC0+c2lnbmFsLT5jbWluX2ZsdDsKIAkJCXItPnJ1X21hamZsdCA9IHAtPnNpZ25hbC0+Y21hal9mbHQ7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAKIAkJCWlmICh3aG8gPT0gUlVTQUdFX0NISUxEUkVOKQogCQkJCWJyZWFrOwpAQCAtMTk0MSw4ICsxOTMzLDkgQEAKIAkJCUJVRygpOwogCX0KIAotCWlmIChuZWVkX2xvY2spCi0JCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl1bmxvY2tfdGFza19zaWdoYW5kKHAsICZmbGFncyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAljcHV0aW1lX3RvX3RpbWV2YWwodXRpbWUsICZyLT5ydV91dGltZSk7CiAJY3B1dGltZV90b190aW1ldmFsKHN0aW1lLCAmci0+cnVfc3RpbWUpOwogfQpAQCAtMjA1Nyw2ICsyMDUwLDEzIEBACiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQlyZXR1cm4gMDsKIAkJfQorCQljYXNlIFBSX0dFVF9FTkRJQU46CisJCQllcnJvciA9IEdFVF9FTkRJQU4oY3VycmVudCwgYXJnMik7CisJCQlicmVhazsKKwkJY2FzZSBQUl9TRVRfRU5ESUFOOgorCQkJZXJyb3IgPSBTRVRfRU5ESUFOKGN1cnJlbnQsIGFyZzIpOworCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCWVycm9yID0gLUVJTlZBTDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c19uaS5jIGIva2VybmVsL3N5c19uaS5jCmluZGV4IDU0MzMxOTUuLjY5OTFiZWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNfbmkuYworKysgYi9rZXJuZWwvc3lzX25pLmMKQEAgLTg3LDYgKzg3LDcgQEAKIGNvbmRfc3lzY2FsbChzeXNfaW5vdGlmeV9hZGRfd2F0Y2gpOwogY29uZF9zeXNjYWxsKHN5c19pbm90aWZ5X3JtX3dhdGNoKTsKIGNvbmRfc3lzY2FsbChzeXNfbWlncmF0ZV9wYWdlcyk7Citjb25kX3N5c2NhbGwoc3lzX21vdmVfcGFnZXMpOwogY29uZF9zeXNjYWxsKHN5c19jaG93bjE2KTsKIGNvbmRfc3lzY2FsbChzeXNfZmNob3duMTYpOwogY29uZF9zeXNjYWxsKHN5c19nZXRlZ2lkMTYpOwpAQCAtMTMyLDMgKzEzMyw0IEBACiBjb25kX3N5c2NhbGwoc3lzX21hZHZpc2UpOwogY29uZF9zeXNjYWxsKHN5c19tcmVtYXApOwogY29uZF9zeXNjYWxsKHN5c19yZW1hcF9maWxlX3BhZ2VzKTsKK2NvbmRfc3lzY2FsbChjb21wYXRfc3lzX21vdmVfcGFnZXMpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDBkNjU2ZTYuLjJjMGU2NTggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTU5LDYgKzU5LDcgQEAKIGV4dGVybiBpbnQgQ19BX0Q7CiBleHRlcm4gaW50IHN5c2N0bF9vdmVyY29tbWl0X21lbW9yeTsKIGV4dGVybiBpbnQgc3lzY3RsX292ZXJjb21taXRfcmF0aW87CitleHRlcm4gaW50IHN5c2N0bF9wYW5pY19vbl9vb207CiBleHRlcm4gaW50IG1heF90aHJlYWRzOwogZXh0ZXJuIGludCBzeXNycV9lbmFibGVkOwogZXh0ZXJuIGludCBjb3JlX3VzZXNfcGlkOwpAQCAtMTQyLDcgKzE0Myw2IEBACiAKIHN0YXRpYyBjdGxfdGFibGUga2Vybl90YWJsZVtdOwogc3RhdGljIGN0bF90YWJsZSB2bV90YWJsZVtdOwotc3RhdGljIGN0bF90YWJsZSBwcm9jX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGZzX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGRlYnVnX3RhYmxlW107CiBzdGF0aWMgY3RsX3RhYmxlIGRldl90YWJsZVtdOwpAQCAtMjAyLDEyICsyMDIsNiBAQAogCX0sCiAjZW5kaWYKIAl7Ci0JCS5jdGxfbmFtZQk9IENUTF9QUk9DLAotCQkucHJvY25hbWUJPSAicHJvYyIsCi0JCS5tb2RlCQk9IDA1NTUsCi0JCS5jaGlsZAkJPSBwcm9jX3RhYmxlLAotCX0sCi0JewogCQkuY3RsX25hbWUJPSBDVExfRlMsCiAJCS5wcm9jbmFtZQk9ICJmcyIsCiAJCS5tb2RlCQk9IDA1NTUsCkBAIC0zOTgsNyArMzkyLDcgQEAKIAkJLnN0cmF0ZWd5CT0gJnN5c2N0bF9zdHJpbmcsCiAJfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19IT1RQTFVHCisjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVRykgJiYgZGVmaW5lZChDT05GSUdfTkVUKQogCXsKIAkJLmN0bF9uYW1lCT0gS0VSTl9IT1RQTFVHLAogCQkucHJvY25hbWUJPSAiaG90cGx1ZyIsCkBAIC03MDIsNiArNjk2LDE0IEBACiAJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKIAl9LAogCXsKKwkJLmN0bF9uYW1lCT0gVk1fUEFOSUNfT05fT09NLAorCQkucHJvY25hbWUJPSAicGFuaWNfb25fb29tIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9wYW5pY19vbl9vb20sCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9wYW5pY19vbl9vb20pLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CiAJCS5jdGxfbmFtZQk9IFZNX09WRVJDT01NSVRfUkFUSU8sCiAJCS5wcm9jbmFtZQk9ICJvdmVyY29tbWl0X3JhdGlvIiwKIAkJLmRhdGEJCT0gJnN5c2N0bF9vdmVyY29tbWl0X3JhdGlvLApAQCAtOTE4LDEwICs5MjAsNiBAQAogCXsgLmN0bF9uYW1lID0gMCB9CiB9OwogCi1zdGF0aWMgY3RsX3RhYmxlIHByb2NfdGFibGVbXSA9IHsKLQl7IC5jdGxfbmFtZSA9IDAgfQotfTsKLQogc3RhdGljIGN0bF90YWJsZSBmc190YWJsZVtdID0gewogCXsKIAkJLmN0bF9uYW1lCT0gRlNfTlJJTk9ERSwKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lci5jIGIva2VybmVsL3RpbWVyLmMKaW5kZXggOWU0OWRlZS4uZWI5NzM3MSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWVyLmMKKysrIGIva2VybmVsL3RpbWVyLmMKQEAgLTE0Niw3ICsxNDYsNyBAQAogdm9pZCBmYXN0Y2FsbCBpbml0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKIHsKIAl0aW1lci0+ZW50cnkubmV4dCA9IE5VTEw7Ci0JdGltZXItPmJhc2UgPSBwZXJfY3B1KHR2ZWNfYmFzZXMsIHJhd19zbXBfcHJvY2Vzc29yX2lkKCkpOworCXRpbWVyLT5iYXNlID0gX19yYXdfZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CiB9CiBFWFBPUlRfU1lNQk9MKGluaXRfdGltZXIpOwogCkBAIC0zODMsMjMgKzM4MywxOSBAQAogc3RhdGljIGludCBjYXNjYWRlKHR2ZWNfYmFzZV90ICpiYXNlLCB0dmVjX3QgKnR2LCBpbnQgaW5kZXgpCiB7CiAJLyogY2FzY2FkZSBhbGwgdGhlIHRpbWVycyBmcm9tIHR2IHVwIG9uZSBsZXZlbCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsICpjdXJyOworCXN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR2X2xpc3Q7CiAKLQloZWFkID0gdHYtPnZlYyArIGluZGV4OwotCWN1cnIgPSBoZWFkLT5uZXh0OworCWxpc3RfcmVwbGFjZV9pbml0KHR2LT52ZWMgKyBpbmRleCwgJnR2X2xpc3QpOworCiAJLyoKLQkgKiBXZSBhcmUgcmVtb3ZpbmcgX2FsbF8gdGltZXJzIGZyb20gdGhlIGxpc3QsIHNvIHdlIGRvbid0ICBoYXZlIHRvCi0JICogZGV0YWNoIHRoZW0gaW5kaXZpZHVhbGx5LCBqdXN0IGNsZWFyIHRoZSBsaXN0IGFmdGVyd2FyZHMuCisJICogV2UgYXJlIHJlbW92aW5nIF9hbGxfIHRpbWVycyBmcm9tIHRoZSBsaXN0LCBzbyB3ZQorCSAqIGRvbid0IGhhdmUgdG8gZGV0YWNoIHRoZW0gaW5kaXZpZHVhbGx5LgogCSAqLwotCXdoaWxlIChjdXJyICE9IGhlYWQpIHsKLQkJc3RydWN0IHRpbWVyX2xpc3QgKnRtcDsKLQotCQl0bXAgPSBsaXN0X2VudHJ5KGN1cnIsIHN0cnVjdCB0aW1lcl9saXN0LCBlbnRyeSk7Ci0JCUJVR19PTih0bXAtPmJhc2UgIT0gYmFzZSk7Ci0JCWN1cnIgPSBjdXJyLT5uZXh0OwotCQlpbnRlcm5hbF9hZGRfdGltZXIoYmFzZSwgdG1wKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGltZXIsIHRtcCwgJnR2X2xpc3QsIGVudHJ5KSB7CisJCUJVR19PTih0aW1lci0+YmFzZSAhPSBiYXNlKTsKKwkJaW50ZXJuYWxfYWRkX3RpbWVyKGJhc2UsIHRpbWVyKTsKIAl9Ci0JSU5JVF9MSVNUX0hFQUQoaGVhZCk7CiAKIAlyZXR1cm4gaW5kZXg7CiB9CkBAIC00MTksMTAgKzQxNSwxMCBAQAogCiAJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CiAJd2hpbGUgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCB3b3JrX2xpc3QgPSBMSVNUX0hFQURfSU5JVCh3b3JrX2xpc3QpOworCQlzdHJ1Y3QgbGlzdF9oZWFkIHdvcmtfbGlzdDsKIAkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZ3b3JrX2xpc3Q7CiAgCQlpbnQgaW5kZXggPSBiYXNlLT50aW1lcl9qaWZmaWVzICYgVFZSX01BU0s7Ci0gCisKIAkJLyoKIAkJICogQ2FzY2FkZSB0aW1lcnM6CiAJCSAqLwpAQCAtNDMxLDggKzQyNyw4IEBACiAJCQkJKCFjYXNjYWRlKGJhc2UsICZiYXNlLT50djMsIElOREVYKDEpKSkgJiYKIAkJCQkJIWNhc2NhZGUoYmFzZSwgJmJhc2UtPnR2NCwgSU5ERVgoMikpKQogCQkJY2FzY2FkZShiYXNlLCAmYmFzZS0+dHY1LCBJTkRFWCgzKSk7Ci0JCSsrYmFzZS0+dGltZXJfamlmZmllczsgCi0JCWxpc3Rfc3BsaWNlX2luaXQoYmFzZS0+dHYxLnZlYyArIGluZGV4LCAmd29ya19saXN0KTsKKwkJKytiYXNlLT50aW1lcl9qaWZmaWVzOworCQlsaXN0X3JlcGxhY2VfaW5pdChiYXNlLT50djEudmVjICsgaW5kZXgsICZ3b3JrX2xpc3QpOwogCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKIAkJCXZvaWQgKCpmbikodW5zaWduZWQgbG9uZyk7CiAJCQl1bnNpZ25lZCBsb25nIGRhdGE7CmRpZmYgLS1naXQgYS9rZXJuZWwvdXNlci5jIGIva2VybmVsL3VzZXIuYwppbmRleCA0YjFlYjc0Li42NDA4YzA0IDEwMDY0NAotLS0gYS9rZXJuZWwvdXNlci5jCisrKyBiL2tlcm5lbC91c2VyLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCQluZXctPm1xX2J5dGVzID0gMDsKIAkJbmV3LT5sb2NrZWRfc2htID0gMDsKIAotCQlpZiAoYWxsb2NfdWlkX2tleXJpbmcobmV3KSA8IDApIHsKKwkJaWYgKGFsbG9jX3VpZF9rZXlyaW5nKG5ldywgY3VycmVudCkgPCAwKSB7CiAJCQlrbWVtX2NhY2hlX2ZyZWUodWlkX2NhY2hlcCwgbmV3KTsKIAkJCXJldHVybiBOVUxMOwogCQl9CmRpZmYgLS1naXQgYS9rZXJuZWwvd29ya3F1ZXVlLmMgYi9rZXJuZWwvd29ya3F1ZXVlLmMKaW5kZXggODgwZmI0MS4uNTY1Y2Y3YSAxMDA2NDQKLS0tIGEva2VybmVsL3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC93b3JrcXVldWUuYwpAQCAtNDI4LDIyICs0MjgsMzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgc2NoZWR1bGVfb25fZWFjaF9jcHUodm9pZCAoKmZ1bmMpICh2b2lkICppbmZvKSwgdm9pZCAqaW5mbykKKy8qKgorICogc2NoZWR1bGVfb25fZWFjaF9jcHUgLSBjYWxsIGEgZnVuY3Rpb24gb24gZWFjaCBvbmxpbmUgQ1BVIGZyb20ga2V2ZW50ZAorICogQGZ1bmM6IHRoZSBmdW5jdGlvbiB0byBjYWxsCisgKiBAaW5mbzogYSBwb2ludGVyIHRvIHBhc3MgdG8gZnVuYygpCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm5zIC12ZSBlcnJubyBvbiBmYWlsdXJlLgorICoKKyAqIEFwcGVhcnMgdG8gYmUgcmFjeSBhZ2FpbnN0IENQVSBob3RwbHVnLgorICoKKyAqIHNjaGVkdWxlX29uX2VhY2hfY3B1KCkgaXMgdmVyeSBzbG93LgorICovCitpbnQgc2NoZWR1bGVfb25fZWFjaF9jcHUodm9pZCAoKmZ1bmMpKHZvaWQgKmluZm8pLCB2b2lkICppbmZvKQogewogCWludCBjcHU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOworCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29ya3M7CiAKLQl3b3JrID0ga21hbGxvYyhOUl9DUFVTICogc2l6ZW9mKHN0cnVjdCB3b3JrX3N0cnVjdCksIEdGUF9LRVJORUwpOwotCi0JaWYgKCF3b3JrKQorCXdvcmtzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB3b3JrX3N0cnVjdCk7CisJaWYgKCF3b3JrcykKIAkJcmV0dXJuIC1FTk9NRU07CisKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlJTklUX1dPUksod29yayArIGNwdSwgZnVuYywgaW5mbyk7CisJCUlOSVRfV09SSyhwZXJfY3B1X3B0cih3b3JrcywgY3B1KSwgZnVuYywgaW5mbyk7CiAJCV9fcXVldWVfd29yayhwZXJfY3B1X3B0cihrZXZlbnRkX3dxLT5jcHVfd3EsIGNwdSksCi0JCQkJd29yayArIGNwdSk7CisJCQkJcGVyX2NwdV9wdHIod29ya3MsIGNwdSkpOwogCX0KIAlmbHVzaF93b3JrcXVldWUoa2V2ZW50ZF93cSk7Ci0Ja2ZyZWUod29yayk7CisJZnJlZV9wZXJjcHUod29ya3MpOwogCXJldHVybiAwOwogfQogCkBAIC01MzEsMTEgKzU0MywxMSBAQAogc3RhdGljIHZvaWQgdGFrZV9vdmVyX3dvcmsoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxLCB1bnNpZ25lZCBpbnQgY3B1KQogewogCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxID0gcGVyX2NwdV9wdHIod3EtPmNwdV93cSwgY3B1KTsKLQlMSVNUX0hFQUQobGlzdCk7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKIAogCXNwaW5fbG9ja19pcnEoJmN3cS0+bG9jayk7Ci0JbGlzdF9zcGxpY2VfaW5pdCgmY3dxLT53b3JrbGlzdCwgJmxpc3QpOworCWxpc3RfcmVwbGFjZV9pbml0KCZjd3EtPndvcmtsaXN0LCAmbGlzdCk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CiAJCXByaW50aygiVGFraW5nIHdvcmsgZm9yICVzXG4iLCB3cS0+bmFtZSk7CkBAIC01NzgsNiArNTkwLDggQEAKIAogCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOgogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdxLCAmd29ya3F1ZXVlcywgbGlzdCkgeworCQkJaWYgKCFwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBob3RjcHUpLT50aHJlYWQpCisJCQkJY29udGludWU7CiAJCQkvKiBVbmJpbmQgc28gaXQgY2FuIHJ1bi4gKi8KIAkJCWt0aHJlYWRfYmluZChwZXJfY3B1X3B0cih3cS0+Y3B1X3dxLCBob3RjcHUpLT50aHJlYWQsCiAJCQkJICAgICBhbnlfb25saW5lX2NwdShjcHVfb25saW5lX21hcCkpOwpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGI4MzBjOWEuLjc5MzU4YWQgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTQ2LDYgKzQ2LDcgQEAKIG9iai0kKENPTkZJR19URVhUU0VBUkNIX0tNUCkgKz0gdHNfa21wLm8KIG9iai0kKENPTkZJR19URVhUU0VBUkNIX0JNKSArPSB0c19ibS5vCiBvYmotJChDT05GSUdfVEVYVFNFQVJDSF9GU00pICs9IHRzX2ZzbS5vCitvYmotJChDT05GSUdfU01QKSArPSBwZXJjcHVfY291bnRlci5vCiAKIG9iai0kKENPTkZJR19TV0lPVExCKSArPSBzd2lvdGxiLm8KIApkaWZmIC0tZ2l0IGEvbGliL2JpdG1hcC5jIGIvbGliL2JpdG1hcC5jCmluZGV4IGVkMmFlM2IuLmQ3MWUzOGMgMTAwNjQ0Ci0tLSBhL2xpYi9iaXRtYXAuYworKysgYi9saWIvYml0bWFwLmMKQEAgLTMxNywxNiArMzE3LDE2IEBACiAKIC8qKgogICogYml0bWFwX3BhcnNlIC0gY29udmVydCBhbiBBU0NJSSBoZXggc3RyaW5nIGludG8gYSBiaXRtYXAuCi0gKiBAYnVmOiBwb2ludGVyIHRvIGJ1ZmZlciBpbiB1c2VyIHNwYWNlIGNvbnRhaW5pbmcgc3RyaW5nLgotICogQGJ1ZmxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKKyAqIEB1YnVmOiBwb2ludGVyIHRvIGJ1ZmZlciBpbiB1c2VyIHNwYWNlIGNvbnRhaW5pbmcgc3RyaW5nLgorICogQHVidWZsZW46IGJ1ZmZlciBzaXplIGluIGJ5dGVzLiAgSWYgc3RyaW5nIGlzIHNtYWxsZXIgdGhhbiB0aGlzCiAgKiAgICB0aGVuIGl0IG11c3QgYmUgdGVybWluYXRlZCB3aXRoIGEgXDAuCiAgKiBAbWFza3A6IHBvaW50ZXIgdG8gYml0bWFwIGFycmF5IHRoYXQgd2lsbCBjb250YWluIHJlc3VsdC4KICAqIEBubWFza2JpdHM6IHNpemUgb2YgYml0bWFwLCBpbiBiaXRzLgogICoKICAqIENvbW1hcyBncm91cCBoZXggZGlnaXRzIGludG8gY2h1bmtzLiAgRWFjaCBjaHVuayBkZWZpbmVzIGV4YWN0bHkgMzIKICAqIGJpdHMgb2YgdGhlIHJlc3VsdGFudCBiaXRtYXNrLiAgTm8gY2h1bmsgbWF5IHNwZWNpZnkgYSB2YWx1ZSBsYXJnZXIKLSAqIHRoYW4gMzIgYml0cyAoLUVPVkVSRkxPVyksIGFuZCBpZiBhIGNodW5rIHNwZWNpZmllcyBhIHNtYWxsZXIgdmFsdWUKLSAqIHRoZW4gbGVhZGluZyAwLWJpdHMgYXJlIHByZXBlbmRlZC4gIC1FSU5WQUwgaXMgcmV0dXJuZWQgZm9yIGlsbGVnYWwKKyAqIHRoYW4gMzIgYml0cyAoJS1FT1ZFUkZMT1cpLCBhbmQgaWYgYSBjaHVuayBzcGVjaWZpZXMgYSBzbWFsbGVyIHZhbHVlCisgKiB0aGVuIGxlYWRpbmcgMC1iaXRzIGFyZSBwcmVwZW5kZWQuICAlLUVJTlZBTCBpcyByZXR1cm5lZCBmb3IgaWxsZWdhbAogICogY2hhcmFjdGVycyBhbmQgZm9yIGdyb3VwaW5nIGVycm9ycyBzdWNoIGFzICIxLCw1IiwgIiw0NCIsICIsIiBhbmQgIiIuCiAgKiBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGFjY2VwdGVkLCBidXQgbm90IGVtYmVkZGVkIHdoaXRlc3BhY2UuCiAgKi8KQEAgLTQ1Miw4ICs0NTIsOCBAQAogCiAvKioKICAqIGJpdG1hcF9wYXJzZWxpc3QgLSBjb252ZXJ0IGxpc3QgZm9ybWF0IEFTQ0lJIHN0cmluZyB0byBiaXRtYXAKLSAqIEBidWY6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgotICogQG1hc2s6IHdyaXRlIHJlc3VsdGluZyBtYXNrIGhlcmUKKyAqIEBicDogcmVhZCBudWwtdGVybWluYXRlZCB1c2VyIHN0cmluZyBmcm9tIHRoaXMgYnVmZmVyCisgKiBAbWFza3A6IHdyaXRlIHJlc3VsdGluZyBtYXNrIGhlcmUKICAqIEBubWFza2JpdHM6IG51bWJlciBvZiBiaXRzIGluIG1hc2sgdG8gYmUgd3JpdHRlbgogICoKICAqIElucHV0IGZvcm1hdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGRlY2ltYWwgbnVtYmVycyBhbmQKQEAgLTQ2MSwxMCArNDYxLDExIEBACiAgKiBkZWNpbWFsIG51bWJlcnMsIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBiaXQgbnVtYmVycyBzZXQgaW4KICAqIHRoZSByYW5nZS4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGludmFsaWQgaW5wdXQgc3RyaW5nczoKLSAqICAgIC1FSU5WQUw6ICAgc2Vjb25kIG51bWJlciBpbiByYW5nZSBzbWFsbGVyIHRoYW4gZmlyc3QKLSAqICAgIC1FSU5WQUw6ICAgaW52YWxpZCBjaGFyYWN0ZXIgaW4gc3RyaW5nCi0gKiAgICAtRVJBTkdFOiAgIGJpdCBudW1iZXIgc3BlY2lmaWVkIHRvbyBsYXJnZSBmb3IgbWFzaworICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBpbnZhbGlkIGlucHV0IHN0cmluZ3MuCisgKiBFcnJvciB2YWx1ZXM6CisgKiAgICAlLUVJTlZBTDogc2Vjb25kIG51bWJlciBpbiByYW5nZSBzbWFsbGVyIHRoYW4gZmlyc3QKKyAqICAgICUtRUlOVkFMOiBpbnZhbGlkIGNoYXJhY3RlciBpbiBzdHJpbmcKKyAqICAgICUtRVJBTkdFOiBiaXQgbnVtYmVyIHNwZWNpZmllZCB0b28gbGFyZ2UgZm9yIG1hc2sKICAqLwogaW50IGJpdG1hcF9wYXJzZWxpc3QoY29uc3QgY2hhciAqYnAsIHVuc2lnbmVkIGxvbmcgKm1hc2twLCBpbnQgbm1hc2tiaXRzKQogewpAQCAtNjI1LDEwICs2MjYsMTAgQEAKIAogLyoqCiAgKiBiaXRtYXBfYml0cmVtYXAgLSBBcHBseSBtYXAgZGVmaW5lZCBieSBhIHBhaXIgb2YgYml0bWFwcyB0byBhIHNpbmdsZSBiaXQKLSAqCUBvbGRiaXQgLSBiaXQgcG9zaXRpb24gdG8gYmUgbWFwcGVkCi0gKiAgICAgIEBvbGQ6IGRlZmluZXMgZG9tYWluIG9mIG1hcAotICogICAgICBAbmV3OiBkZWZpbmVzIHJhbmdlIG9mIG1hcAotICogICAgICBAYml0czogbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBvZiB0aGVzZSBiaXRtYXBzCisgKglAb2xkYml0OiBiaXQgcG9zaXRpb24gdG8gYmUgbWFwcGVkCisgKglAb2xkOiBkZWZpbmVzIGRvbWFpbiBvZiBtYXAKKyAqCUBuZXc6IGRlZmluZXMgcmFuZ2Ugb2YgbWFwCisgKglAYml0czogbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBvZiB0aGVzZSBiaXRtYXBzCiAgKgogICogTGV0IEBvbGQgYW5kIEBuZXcgZGVmaW5lIGEgbWFwcGluZyBvZiBiaXQgcG9zaXRpb25zLCBzdWNoIHRoYXQKICAqIHdoYXRldmVyIHBvc2l0aW9uIGlzIGhlbGQgYnkgdGhlIG4tdGggc2V0IGJpdCBpbiBAb2xkIGlzIG1hcHBlZApAQCAtNzkwLDcgKzc5MSw3IEBACiAgKgogICogQWxsb2NhdGUgKHNldCBiaXRzIGluKSBhIHNwZWNpZmllZCByZWdpb24gb2YgYSBiaXRtYXAuCiAgKgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgLUVCVVNZIGlmIHNwZWNpZmllZCByZWdpb24gd2Fzbid0CisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciAlLUVCVVNZIGlmIHNwZWNpZmllZCByZWdpb24gd2Fzbid0CiAgKiBmcmVlIChub3QgYWxsIGJpdHMgd2VyZSB6ZXJvKS4KICAqLwogaW50IGJpdG1hcF9hbGxvY2F0ZV9yZWdpb24odW5zaWduZWQgbG9uZyAqYml0bWFwLCBpbnQgcG9zLCBpbnQgb3JkZXIpCmRpZmYgLS1naXQgYS9saWIvY3JjLWNjaXR0LmMgYi9saWIvY3JjLWNjaXR0LmMKaW5kZXggMTE1ZDE0OS4uN2Y2ZGQ2OCAxMDA2NDQKLS0tIGEvbGliL2NyYy1jY2l0dC5jCisrKyBiL2xpYi9jcmMtY2NpdHQuYwpAQCAtNTMsOSArNTMsOSBAQAogCiAvKioKICAqCWNyY19jY2l0dCAtIHJlY29tcHV0ZSB0aGUgQ1JDIGZvciB0aGUgZGF0YSBidWZmZXIKLSAqCUBjcmMgLSBwcmV2aW91cyBDUkMgdmFsdWUKLSAqCUBidWZmZXIgLSBkYXRhIHBvaW50ZXIKLSAqCUBsZW4gLSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICoJQGNyYzogcHJldmlvdXMgQ1JDIHZhbHVlCisgKglAYnVmZmVyOiBkYXRhIHBvaW50ZXIKKyAqCUBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyCiAgKi8KIHUxNiBjcmNfY2NpdHQodTE2IGNyYywgdTggY29uc3QgKmJ1ZmZlciwgc2l6ZV90IGxlbikKIHsKZGlmZiAtLWdpdCBhL2xpYi9jcmMxNi5jIGIvbGliL2NyYzE2LmMKaW5kZXggMDExZmU1Ny4uODczN2IwOCAxMDA2NDQKLS0tIGEvbGliL2NyYzE2LmMKKysrIGIvbGliL2NyYzE2LmMKQEAgLTQ3LDEyICs0NywxMiBAQAogRVhQT1JUX1NZTUJPTChjcmMxNl90YWJsZSk7CiAKIC8qKgotICogQ29tcHV0ZSB0aGUgQ1JDLTE2IGZvciB0aGUgZGF0YSBidWZmZXIKKyAqIGNyYzE2IC0gY29tcHV0ZSB0aGUgQ1JDLTE2IGZvciB0aGUgZGF0YSBidWZmZXIKKyAqIEBjcmM6CXByZXZpb3VzIENSQyB2YWx1ZQorICogQGJ1ZmZlcjoJZGF0YSBwb2ludGVyCisgKiBAbGVuOgludW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgogICoKLSAqIEBwYXJhbSBjcmMgICAgIHByZXZpb3VzIENSQyB2YWx1ZQotICogQHBhcmFtIGJ1ZmZlciAgZGF0YSBwb2ludGVyCi0gKiBAcGFyYW0gbGVuICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgotICogQHJldHVybiAgICAgICAgdGhlIHVwZGF0ZWQgQ1JDIHZhbHVlCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIENSQyB2YWx1ZS4KICAqLwogdTE2IGNyYzE2KHUxNiBjcmMsIHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCiB7CmRpZmYgLS1naXQgYS9saWIvY3JjMzIuYyBiL2xpYi9jcmMzMi5jCmluZGV4IDA2NTE5OGYuLjI4NWZkOWIgMTAwNjQ0Ci0tLSBhL2xpYi9jcmMzMi5jCisrKyBiL2xpYi9jcmMzMi5jCkBAIC00MiwyMCArNDIsMjEgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiRXRoZXJuZXQgQ1JDMzIgY2FsY3VsYXRpb25zIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKKy8qKgorICogY3JjMzJfbGUoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGxpdHRsZS1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSSBDUkMzMgorICogQGNyYzogc2VlZCB2YWx1ZSBmb3IgY29tcHV0YXRpb24uICB+MCBmb3IgRXRoZXJuZXQsIHNvbWV0aW1lcyAwIGZvcgorICoJb3RoZXIgdXNlcywgb3IgdGhlIHByZXZpb3VzIGNyYzMyIHZhbHVlIGlmIGNvbXB1dGluZyBpbmNyZW1lbnRhbGx5LgorICogQHA6IHBvaW50ZXIgdG8gYnVmZmVyIG92ZXIgd2hpY2ggQ1JDIGlzIHJ1bgorICogQGxlbjogbGVuZ3RoIG9mIGJ1ZmZlciBAcAorICovCit1MzIgX19hdHRyaWJ1dGVfcHVyZV9fIGNyYzMyX2xlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pOworCiAjaWYgQ1JDX0xFX0JJVFMgPT0gMQogLyoKICAqIEluIGZhY3QsIHRoZSB0YWJsZS1iYXNlZCBjb2RlIHdpbGwgd29yayBpbiB0aGlzIGNhc2UsIGJ1dCBpdCBjYW4gYmUKICAqIHNpbXBsaWZpZWQgYnkgaW5saW5pbmcgdGhlIHRhYmxlIGluID86IGZvcm0uCiAgKi8KIAotLyoqCi0gKiBjcmMzMl9sZSgpIC0gQ2FsY3VsYXRlIGJpdHdpc2UgbGl0dGxlLWVuZGlhbiBFdGhlcm5ldCBBVVRPRElOIElJIENSQzMyCi0gKiBAY3JjIC0gc2VlZCB2YWx1ZSBmb3IgY29tcHV0YXRpb24uICB+MCBmb3IgRXRoZXJuZXQsIHNvbWV0aW1lcyAwIGZvcgotICogICAgICAgIG90aGVyIHVzZXMsIG9yIHRoZSBwcmV2aW91cyBjcmMzMiB2YWx1ZSBpZiBjb21wdXRpbmcgaW5jcmVtZW50YWxseS4KLSAqIEBwICAgLSBwb2ludGVyIHRvIGJ1ZmZlciBvdmVyIHdoaWNoIENSQyBpcyBydW4KLSAqIEBsZW4gLSBsZW5ndGggb2YgYnVmZmVyIEBwCi0gKiAKLSAqLwogdTMyIF9fYXR0cmlidXRlX3B1cmVfXyBjcmMzMl9sZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKQogewogCWludCBpOwpAQCAtNjgsMTQgKzY5LDYgQEAKIH0KICNlbHNlCQkJCS8qIFRhYmxlLWJhc2VkIGFwcHJvYWNoICovCiAKLS8qKgotICogY3JjMzJfbGUoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGxpdHRsZS1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSSBDUkMzMgotICogQGNyYyAtIHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKLSAqICAgICAgICBvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCi0gKiBAcCAgIC0gcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMgaXMgcnVuCi0gKiBAbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciBAcAotICogCi0gKi8KIHUzMiBfX2F0dHJpYnV0ZV9wdXJlX18gY3JjMzJfbGUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKIHsKICMgaWYgQ1JDX0xFX0JJVFMgPT0gOApAQCAtMTQ1LDIwICsxMzgsMjEgQEAKIH0KICNlbmRpZgogCisvKioKKyAqIGNyYzMyX2JlKCkgLSBDYWxjdWxhdGUgYml0d2lzZSBiaWctZW5kaWFuIEV0aGVybmV0IEFVVE9ESU4gSUkgQ1JDMzIKKyAqIEBjcmM6IHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKKyAqCW90aGVyIHVzZXMsIG9yIHRoZSBwcmV2aW91cyBjcmMzMiB2YWx1ZSBpZiBjb21wdXRpbmcgaW5jcmVtZW50YWxseS4KKyAqIEBwOiBwb2ludGVyIHRvIGJ1ZmZlciBvdmVyIHdoaWNoIENSQyBpcyBydW4KKyAqIEBsZW46IGxlbmd0aCBvZiBidWZmZXIgQHAKKyAqLwordTMyIF9fYXR0cmlidXRlX3B1cmVfXyBjcmMzMl9iZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKTsKKwogI2lmIENSQ19CRV9CSVRTID09IDEKIC8qCiAgKiBJbiBmYWN0LCB0aGUgdGFibGUtYmFzZWQgY29kZSB3aWxsIHdvcmsgaW4gdGhpcyBjYXNlLCBidXQgaXQgY2FuIGJlCiAgKiBzaW1wbGlmaWVkIGJ5IGlubGluaW5nIHRoZSB0YWJsZSBpbiA/OiBmb3JtLgogICovCiAKLS8qKgotICogY3JjMzJfYmUoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGJpZy1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSSBDUkMzMgotICogQGNyYyAtIHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKLSAqICAgICAgICBvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCi0gKiBAcCAgIC0gcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMgaXMgcnVuCi0gKiBAbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciBAcAotICogCi0gKi8KIHUzMiBfX2F0dHJpYnV0ZV9wdXJlX18gY3JjMzJfYmUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKIHsKIAlpbnQgaTsKQEAgLTE3MywxNCArMTY3LDYgQEAKIH0KIAogI2Vsc2UJCQkJLyogVGFibGUtYmFzZWQgYXBwcm9hY2ggKi8KLS8qKgotICogY3JjMzJfYmUoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGJpZy1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSSBDUkMzMgotICogQGNyYyAtIHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3IKLSAqICAgICAgICBvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCi0gKiBAcCAgIC0gcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMgaXMgcnVuCi0gKiBAbGVuIC0gbGVuZ3RoIG9mIGJ1ZmZlciBAcAotICogCi0gKi8KIHUzMiBfX2F0dHJpYnV0ZV9wdXJlX18gY3JjMzJfYmUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKIHsKICMgaWYgQ1JDX0JFX0JJVFMgPT0gOApAQCAtMjQ5LDYgKzIzNSwxMCBAQAogfQogI2VuZGlmCiAKKy8qKgorICogYml0cmV2ZXJzZSAtIHJldmVyc2UgdGhlIG9yZGVyIG9mIGJpdHMgaW4gYSB1MzIgdmFsdWUKKyAqIEB4OiB2YWx1ZSB0byBiZSBiaXQtcmV2ZXJzZWQKKyAqLwogdTMyIGJpdHJldmVyc2UodTMyIHgpCiB7CiAJeCA9ICh4ID4+IDE2KSB8ICh4IDw8IDE2KTsKZGlmZiAtLWdpdCBhL2xpYi9nZW5hbGxvYy5jIGIvbGliL2dlbmFsbG9jLmMKaW5kZXggOWNlMGE2YS4uNzEzMzhiNCAxMDA2NDQKLS0tIGEvbGliL2dlbmFsbG9jLmMKKysrIGIvbGliL2dlbmFsbG9jLmMKQEAgLTQsMTAgKzQsNiBAQAogICogVXNlcyBmb3IgdGhpcyBpbmNsdWRlcyBvbi1kZXZpY2Ugc3BlY2lhbCBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeQogICogZXRjLgogICoKLSAqIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgYnVkZHkgYWxsb2NhdG9yIGZvdW5kIGluIHRoZSBzeW01M2M4eHhfMgotICogZHJpdmVyIENvcHlyaWdodCAoQykgMTk5OS0yMDAxICBHZXJhcmQgUm91ZGllciA8Z3JvdWRpZXJAZnJlZS5mcj4sCi0gKiBhbmQgYWRhcHRlZCBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzZS4KLSAqCiAgKiBDb3B5cmlnaHQgMjAwNSAoQykgSmVzIFNvcmVuc2VuIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPgogICoKICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTUsMTcyICsxMSwxNTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KIAotI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAKLQotc3RydWN0IGdlbl9wb29sICpnZW5fcG9vbF9jcmVhdGUoaW50IG5yX2NodW5rcywgaW50IG1heF9jaHVua19zaGlmdCwKLQkJCQkgdW5zaWduZWQgbG9uZyAoKmZwKShzdHJ1Y3QgZ2VuX3Bvb2wgKiksCi0JCQkJIHVuc2lnbmVkIGxvbmcgZGF0YSkKKy8qCisgKiBDcmVhdGUgYSBuZXcgc3BlY2lhbCBtZW1vcnkgcG9vbC4KKyAqCisgKiBAbWluX2FsbG9jX29yZGVyOiBsb2cgYmFzZSAyIG9mIG51bWJlciBvZiBieXRlcyBlYWNoIGJpdG1hcCBiaXQgcmVwcmVzZW50cworICogQG5pZDogbm9kZSBpZCBvZiB0aGUgbm9kZSB0aGUgcG9vbCBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiwgb3IgLTEKKyAqLworc3RydWN0IGdlbl9wb29sICpnZW5fcG9vbF9jcmVhdGUoaW50IG1pbl9hbGxvY19vcmRlciwgaW50IG5pZCkKIHsKLQlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2xwOwotCXVuc2lnbmVkIGxvbmcgdG1wOwotCWludCBpOworCXN0cnVjdCBnZW5fcG9vbCAqcG9vbDsKIAotCS8qCi0JICogVGhpcyBpcyByZWFsbHkgYW4gYXJiaXRyYXJ5IGxpbWl0LCArMTAgaXMgZW5vdWdoIGZvcgotCSAqIElBNjRfR1JBTlVMRV9TSElGVCwgYWthIDE2TUIuIElmIGFueW9uZSBuZWVkcyBhIGxhcmdlIGxpbWl0Ci0JICogdGhpcyBjYW4gYmUgaW5jcmVhc2VkIHdpdGhvdXQgcHJvYmxlbXMuCi0JICovCi0JaWYgKChtYXhfY2h1bmtfc2hpZnQgPiAoUEFHRV9TSElGVCArIDEwKSkgfHwKLQkgICAgKChtYXhfY2h1bmtfc2hpZnQgPCBBTExPQ19NSU5fU0hJRlQpICYmIG1heF9jaHVua19zaGlmdCkpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCFtYXhfY2h1bmtfc2hpZnQpCi0JCW1heF9jaHVua19zaGlmdCA9IFBBR0VfU0hJRlQ7Ci0KLQlwb29scCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbCksIEdGUF9LRVJORUwpOwotCWlmICghcG9vbHApCi0JCXJldHVybiBOVUxMOwotCW1lbXNldChwb29scCwgMCwgc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbCkpOwotCXBvb2xwLT5oID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGdlbl9wb29sX2xpbmspICoKLQkJCSAgIChtYXhfY2h1bmtfc2hpZnQgLSBBTExPQ19NSU5fU0hJRlQgKyAxKSwKLQkJCSAgIEdGUF9LRVJORUwpOwotCWlmICghcG9vbHAtPmgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ2VuX3Bvb2xfYWxsb2MoKSBmYWlsZWQgdG8gYWxsb2NhdGVcbiIpOwotCQlrZnJlZShwb29scCk7Ci0JCXJldHVybiBOVUxMOworCXBvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbCksIEdGUF9LRVJORUwsIG5pZCk7CisJaWYgKHBvb2wgIT0gTlVMTCkgeworCQlyd2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CisJCUlOSVRfTElTVF9IRUFEKCZwb29sLT5jaHVua3MpOworCQlwb29sLT5taW5fYWxsb2Nfb3JkZXIgPSBtaW5fYWxsb2Nfb3JkZXI7CiAJfQotCW1lbXNldChwb29scC0+aCwgMCwgc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbF9saW5rKSAqCi0JICAgICAgIChtYXhfY2h1bmtfc2hpZnQgLSBBTExPQ19NSU5fU0hJRlQgKyAxKSk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcG9vbHAtPmxvY2spOwotCXBvb2xwLT5nZXRfbmV3X2NodW5rID0gZnA7Ci0JcG9vbHAtPm1heF9jaHVua19zaGlmdCA9IG1heF9jaHVua19zaGlmdDsKLQlwb29scC0+cHJpdmF0ZSA9IGRhdGE7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnJfY2h1bmtzOyBpKyspIHsKLQkJdG1wID0gcG9vbHAtPmdldF9uZXdfY2h1bmsocG9vbHApOwotCQlwcmludGsoS0VSTl9JTkZPICJhbGxvY2F0ZWQgJWx4XG4iLCB0bXApOwotCQlpZiAoIXRtcCkKLQkJCWJyZWFrOwotCQlnZW5fcG9vbF9mcmVlKHBvb2xwLCB0bXAsICgxIDw8IHBvb2xwLT5tYXhfY2h1bmtfc2hpZnQpKTsKLQl9Ci0KLQlyZXR1cm4gcG9vbHA7CisJcmV0dXJuIHBvb2w7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2NyZWF0ZSk7CiAKIAogLyoKLSAqICBTaW1wbGUgcG93ZXIgb2YgdHdvIGJ1ZGR5LWxpa2UgZ2VuZXJpYyBhbGxvY2F0b3IuCi0gKiAgUHJvdmlkZXMgbmF0dXJhbGx5IGFsaWduZWQgbWVtb3J5IGNodW5rcy4KKyAqIEFkZCBhIG5ldyBjaHVuayBvZiBtZW1vcnkgdG8gdGhlIHNwZWNpZmllZCBwb29sLgorICoKKyAqIEBwb29sOiBwb29sIHRvIGFkZCBuZXcgbWVtb3J5IGNodW5rIHRvCisgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgdG8gYWRkIHRvIHBvb2wKKyAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgY2h1bmsgdG8gYWRkIHRvIHBvb2wKKyAqIEBuaWQ6IG5vZGUgaWQgb2YgdGhlIG5vZGUgdGhlIGNodW5rIHN0cnVjdHVyZSBhbmQgYml0bWFwIHNob3VsZCBiZQorICogICAgICAgYWxsb2NhdGVkIG9uLCBvciAtMQogICovCi11bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqcG9vbHAsIGludCBzaXplKQoraW50IGdlbl9wb29sX2FkZChzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgYWRkciwgc2l6ZV90IHNpemUsCisJCSBpbnQgbmlkKQogewotCWludCBqLCBpLCBzLCBtYXhfY2h1bmtfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGEsIGZsYWdzOwotCXN0cnVjdCBnZW5fcG9vbF9saW5rICpoID0gcG9vbHAtPmg7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlpbnQgbmJpdHMgPSBzaXplID4+IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKKwlpbnQgbmJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbF9jaHVuaykgKworCQkJCShuYml0cyArIEJJVFNfUEVSX0JZVEUgLSAxKSAvIEJJVFNfUEVSX0JZVEU7CiAKLQltYXhfY2h1bmtfc2l6ZSA9IDEgPDwgcG9vbHAtPm1heF9jaHVua19zaGlmdDsKKwljaHVuayA9IGttYWxsb2Nfbm9kZShuYnl0ZXMsIEdGUF9LRVJORUwsIG5pZCk7CisJaWYgKHVubGlrZWx5KGNodW5rID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CiAKLQlpZiAoc2l6ZSA+IG1heF9jaHVua19zaXplKQorCW1lbXNldChjaHVuaywgMCwgbmJ5dGVzKTsKKwlzcGluX2xvY2tfaW5pdCgmY2h1bmstPmxvY2spOworCWNodW5rLT5zdGFydF9hZGRyID0gYWRkcjsKKwljaHVuay0+ZW5kX2FkZHIgPSBhZGRyICsgc2l6ZTsKKworCXdyaXRlX2xvY2soJnBvb2wtPmxvY2spOworCWxpc3RfYWRkKCZjaHVuay0+bmV4dF9jaHVuaywgJnBvb2wtPmNodW5rcyk7CisJd3JpdGVfdW5sb2NrKCZwb29sLT5sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9hZGQpOworCisKKy8qCisgKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqIFVzZXMgYSBmaXJzdC1maXQgYWxnb3JpdGhtLgorICoKKyAqIEBwb29sOiBwb29sIHRvIGFsbG9jYXRlIGZyb20KKyAqIEBzaXplOiBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgcG9vbAorICovCit1bnNpZ25lZCBsb25nIGdlbl9wb29sX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rOworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBhZGRyLCBmbGFnczsKKwlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CisJaW50IG5iaXRzLCBiaXQsIHN0YXJ0X2JpdCwgZW5kX2JpdDsKKworCWlmIChzaXplID09IDApCiAJCXJldHVybiAwOwogCi0Jc2l6ZSA9IG1heChzaXplLCAxIDw8IEFMTE9DX01JTl9TSElGVCk7Ci0JaSA9IGZscyhzaXplIC0gMSk7Ci0JcyA9IDEgPDwgaTsKLQlqID0gaSAtPSBBTExPQ19NSU5fU0hJRlQ7CisJbmJpdHMgPSAoc2l6ZSArICgxVUwgPDwgb3JkZXIpIC0gMSkgPj4gb3JkZXI7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbHAtPmxvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWhbal0ubmV4dCkgewotCQlpZiAocyA9PSBtYXhfY2h1bmtfc2l6ZSkgewotCQkJc3RydWN0IGdlbl9wb29sX2xpbmsgKnB0cjsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2xwLT5sb2NrLCBmbGFncyk7Ci0JCQlwdHIgPSAoc3RydWN0IGdlbl9wb29sX2xpbmsgKilwb29scC0+Z2V0X25ld19jaHVuayhwb29scCk7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbHAtPmxvY2ssIGZsYWdzKTsKLQkJCWhbal0ubmV4dCA9IHB0cjsKLQkJCWlmIChoW2pdLm5leHQpCi0JCQkJaFtqXS5uZXh0LT5uZXh0ID0gTlVMTDsKLQkJCWJyZWFrOworCXJlYWRfbG9jaygmcG9vbC0+bG9jayk7CisJbGlzdF9mb3JfZWFjaChfY2h1bmssICZwb29sLT5jaHVua3MpIHsKKwkJY2h1bmsgPSBsaXN0X2VudHJ5KF9jaHVuaywgc3RydWN0IGdlbl9wb29sX2NodW5rLCBuZXh0X2NodW5rKTsKKworCQllbmRfYml0ID0gKGNodW5rLT5lbmRfYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKKwkJZW5kX2JpdCAtPSBuYml0cyArIDE7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNodW5rLT5sb2NrLCBmbGFncyk7CisJCWJpdCA9IC0xOworCQl3aGlsZSAoYml0ICsgMSA8IGVuZF9iaXQpIHsKKwkJCWJpdCA9IGZpbmRfbmV4dF96ZXJvX2JpdChjaHVuay0+Yml0cywgZW5kX2JpdCwgYml0ICsgMSk7CisJCQlpZiAoYml0ID49IGVuZF9iaXQpCisJCQkJYnJlYWs7CisKKwkJCXN0YXJ0X2JpdCA9IGJpdDsKKwkJCWlmIChuYml0cyA+IDEpIHsKKwkJCQliaXQgPSBmaW5kX25leHRfYml0KGNodW5rLT5iaXRzLCBiaXQgKyBuYml0cywKKwkJCQkJCQliaXQgKyAxKTsKKwkJCQlpZiAoYml0IC0gc3RhcnRfYml0IDwgbmJpdHMpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlhZGRyID0gY2h1bmstPnN0YXJ0X2FkZHIgKworCQkJCQkgICAgKCh1bnNpZ25lZCBsb25nKXN0YXJ0X2JpdCA8PCBvcmRlcik7CisJCQl3aGlsZSAobmJpdHMtLSkKKwkJCQlfX3NldF9iaXQoc3RhcnRfYml0KyssICZjaHVuay0+Yml0cyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHVuay0+bG9jaywgZmxhZ3MpOworCQkJcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOworCQkJcmV0dXJuIGFkZHI7CiAJCX0KLQkJaisrOwotCQlzIDw8PSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaHVuay0+bG9jaywgZmxhZ3MpOwogCX0KLQlhID0gKHVuc2lnbmVkIGxvbmcpIGhbal0ubmV4dDsKLQlpZiAoYSkgewotCQloW2pdLm5leHQgPSBoW2pdLm5leHQtPm5leHQ7Ci0JCS8qCi0JCSAqIFRoaXMgc2hvdWxkIGJlIHNwbGl0IGludG8gYSBzZXBlcmF0ZSBmdW5jdGlvbiBkb2luZwotCQkgKiB0aGUgY2h1bmsgc3BsaXQgaW4gb3JkZXIgdG8gc3VwcG9ydCBjdXN0b20KLQkJICogaGFuZGxpbmcgbWVtb3J5IG5vdCBwaHlzaWNhbGx5IGFjY2Vzc2libGUgYnkgaG9zdAotCQkgKi8KLQkJd2hpbGUgKGogPiBpKSB7Ci0JCQlqIC09IDE7Ci0JCQlzID4+PSAxOwotCQkJaFtqXS5uZXh0ID0gKHN0cnVjdCBnZW5fcG9vbF9saW5rICopIChhICsgcyk7Ci0JCQloW2pdLm5leHQtPm5leHQgPSBOVUxMOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2xwLT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIGE7CisJcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9hbGxvYyk7CiAKIAogLyoKLSAqICBDb3VudGVyLXBhcnQgb2YgdGhlIGdlbmVyaWMgYWxsb2NhdG9yLgorICogRnJlZSB0aGUgc3BlY2lmaWVkIG1lbW9yeSBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqCisgKiBAcG9vbDogcG9vbCB0byBmcmVlIHRvCisgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgdG8gZnJlZSBiYWNrIHRvIHBvb2wKKyAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSB0byBmcmVlCiAgKi8KLXZvaWQgZ2VuX3Bvb2xfZnJlZShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2xwLCB1bnNpZ25lZCBsb25nIHB0ciwgaW50IHNpemUpCit2b2lkIGdlbl9wb29sX2ZyZWUoc3RydWN0IGdlbl9wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBzaXplKQogewotCXN0cnVjdCBnZW5fcG9vbF9saW5rICpxOwotCXN0cnVjdCBnZW5fcG9vbF9saW5rICpoID0gcG9vbHAtPmg7Ci0JdW5zaWduZWQgbG9uZyBhLCBiLCBmbGFnczsKLQlpbnQgaSwgcywgbWF4X2NodW5rX3NpemU7CisJc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rOworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CisJaW50IGJpdCwgbmJpdHM7CiAKLQltYXhfY2h1bmtfc2l6ZSA9IDEgPDwgcG9vbHAtPm1heF9jaHVua19zaGlmdDsKKwluYml0cyA9IChzaXplICsgKDFVTCA8PCBvcmRlcikgLSAxKSA+PiBvcmRlcjsKIAotCWlmIChzaXplID4gbWF4X2NodW5rX3NpemUpCi0JCXJldHVybjsKKwlyZWFkX2xvY2soJnBvb2wtPmxvY2spOworCWxpc3RfZm9yX2VhY2goX2NodW5rLCAmcG9vbC0+Y2h1bmtzKSB7CisJCWNodW5rID0gbGlzdF9lbnRyeShfY2h1bmssIHN0cnVjdCBnZW5fcG9vbF9jaHVuaywgbmV4dF9jaHVuayk7CiAKLQlzaXplID0gbWF4KHNpemUsIDEgPDwgQUxMT0NfTUlOX1NISUZUKTsKLQlpID0gZmxzKHNpemUgLSAxKTsKLQlzID0gMSA8PCBpOwotCWkgLT0gQUxMT0NfTUlOX1NISUZUOwotCi0JYSA9IHB0cjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwb29scC0+bG9jaywgZmxhZ3MpOwotCXdoaWxlICgxKSB7Ci0JCWlmIChzID09IG1heF9jaHVua19zaXplKSB7Ci0JCQkoKHN0cnVjdCBnZW5fcG9vbF9saW5rICopYSktPm5leHQgPSBoW2ldLm5leHQ7Ci0JCQloW2ldLm5leHQgPSAoc3RydWN0IGdlbl9wb29sX2xpbmsgKilhOworCQlpZiAoYWRkciA+PSBjaHVuay0+c3RhcnRfYWRkciAmJiBhZGRyIDwgY2h1bmstPmVuZF9hZGRyKSB7CisJCQlCVUdfT04oYWRkciArIHNpemUgPiBjaHVuay0+ZW5kX2FkZHIpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNodW5rLT5sb2NrLCBmbGFncyk7CisJCQliaXQgPSAoYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKKwkJCXdoaWxlIChuYml0cy0tKQorCQkJCV9fY2xlYXJfYml0KGJpdCsrLCAmY2h1bmstPmJpdHMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWIgPSBhIF4gczsKLQkJcSA9ICZoW2ldOwotCi0JCXdoaWxlIChxLT5uZXh0ICYmIHEtPm5leHQgIT0gKHN0cnVjdCBnZW5fcG9vbF9saW5rICopYikKLQkJCXEgPSBxLT5uZXh0OwotCi0JCWlmICghcS0+bmV4dCkgewotCQkJKChzdHJ1Y3QgZ2VuX3Bvb2xfbGluayAqKWEpLT5uZXh0ID0gaFtpXS5uZXh0OwotCQkJaFtpXS5uZXh0ID0gKHN0cnVjdCBnZW5fcG9vbF9saW5rICopYTsKLQkJCWJyZWFrOwotCQl9Ci0JCXEtPm5leHQgPSBxLT5uZXh0LT5uZXh0OwotCQlhID0gYSAmIGI7Ci0JCXMgPDw9IDE7Ci0JCWkrKzsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbHAtPmxvY2ssIGZsYWdzKTsKKwlCVUdfT04obmJpdHMgPiAwKTsKKwlyZWFkX3VubG9jaygmcG9vbC0+bG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvbGliL2lkci5jIGIvbGliL2lkci5jCmluZGV4IGQyMjYyNTkuLmRlMTkwMzAgMTAwNjQ0Ci0tLSBhL2xpYi9pZHIuYworKysgYi9saWIvaWRyLmMKQEAgLTQ4LDE1ICs0OCwyMSBAQAogCXJldHVybihwKTsKIH0KIAorLyogb25seSBjYWxsZWQgd2hlbiBpZHAtPmxvY2sgaXMgaGVsZCAqLworc3RhdGljIHZvaWQgX19mcmVlX2xheWVyKHN0cnVjdCBpZHIgKmlkcCwgc3RydWN0IGlkcl9sYXllciAqcCkKK3sKKwlwLT5hcnlbMF0gPSBpZHAtPmlkX2ZyZWU7CisJaWRwLT5pZF9mcmVlID0gcDsKKwlpZHAtPmlkX2ZyZWVfY250Kys7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfbGF5ZXIoc3RydWN0IGlkciAqaWRwLCBzdHJ1Y3QgaWRyX2xheWVyICpwKQogewogCS8qCiAJICogRGVwZW5kcyBvbiB0aGUgcmV0dXJuIGVsZW1lbnQgYmVpbmcgemVyb2VkLgogCSAqLwogCXNwaW5fbG9jaygmaWRwLT5sb2NrKTsKLQlwLT5hcnlbMF0gPSBpZHAtPmlkX2ZyZWU7Ci0JaWRwLT5pZF9mcmVlID0gcDsKLQlpZHAtPmlkX2ZyZWVfY250Kys7CisJX19mcmVlX2xheWVyKGlkcCwgcCk7CiAJc3Bpbl91bmxvY2soJmlkcC0+bG9jayk7CiB9CiAKQEAgLTE4NCwxMiArMTkwLDE0IEBACiAJCQkgKiBUaGUgYWxsb2NhdGlvbiBmYWlsZWQuICBJZiB3ZSBidWlsdCBwYXJ0IG9mCiAJCQkgKiB0aGUgc3RydWN0dXJlIHRlYXIgaXQgZG93bi4KIAkJCSAqLworCQkJc3Bpbl9sb2NrKCZpZHAtPmxvY2spOwogCQkJZm9yIChuZXcgPSBwOyBwICYmIHAgIT0gaWRwLT50b3A7IG5ldyA9IHApIHsKIAkJCQlwID0gcC0+YXJ5WzBdOwogCQkJCW5ldy0+YXJ5WzBdID0gTlVMTDsKIAkJCQluZXctPmJpdG1hcCA9IG5ldy0+Y291bnQgPSAwOwotCQkJCWZyZWVfbGF5ZXIoaWRwLCBuZXcpOworCQkJCV9fZnJlZV9sYXllcihpZHAsIG5ldyk7CiAJCQl9CisJCQlzcGluX3VubG9jaygmaWRwLT5sb2NrKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQluZXctPmFyeVswXSA9IHA7CmRpZmYgLS1naXQgYS9saWIvbGliY3JjMzJjLmMgYi9saWIvbGliY3JjMzJjLmMKaW5kZXggNTJiNmRjMS4uNjBmNDY4MCAxMDA2NDQKLS0tIGEvbGliL2xpYmNyYzMyYy5jCisrKyBiL2xpYi9saWJjcmMzMmMuYwpAQCAtODgsNyArODgsNyBAQAogICogcmVmbGVjdCBvdXRwdXQgYnl0ZXMgPSB0cnVlCiAgKi8KIAotc3RhdGljIHUzMiBjcmMzMmNfdGFibGVbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCB1MzIgY3JjMzJjX3RhYmxlWzI1Nl0gPSB7CiAJMHgwMDAwMDAwMEwsIDB4RjI2QjgzMDNMLCAweEUxM0I3MEY3TCwgMHgxMzUwRjNGNEwsCiAJMHhDNzlBOTcxRkwsIDB4MzVGMTE0MUNMLCAweDI2QTFFN0U4TCwgMHhENENBNjRFQkwsCiAJMHg4QUQ5NThDRkwsIDB4NzhCMkRCQ0NMLCAweDZCRTIyODM4TCwgMHg5OTg5QUIzQkwsCmRpZmYgLS1naXQgYS9saWIvcGVyY3B1X2NvdW50ZXIuYyBiL2xpYi9wZXJjcHVfY291bnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDQ0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGVyY3B1X2NvdW50ZXIuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogRmFzdCBiYXRjaGluZyBwZXJjcHUgY291bnRlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BlcmNwdV9jb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfbW9kKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzMzIgYW1vdW50KQoreworCWxvbmcgY291bnQ7CisJczMyICpwY291bnQ7CisJaW50IGNwdSA9IGdldF9jcHUoKTsKKworCXBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CisJY291bnQgPSAqcGNvdW50ICsgYW1vdW50OworCWlmIChjb3VudCA+PSBGQkNfQkFUQ0ggfHwgY291bnQgPD0gLUZCQ19CQVRDSCkgeworCQlzcGluX2xvY2soJmZiYy0+bG9jayk7CisJCWZiYy0+Y291bnQgKz0gY291bnQ7CisJCSpwY291bnQgPSAwOworCQlzcGluX3VubG9jaygmZmJjLT5sb2NrKTsKKwl9IGVsc2UgeworCQkqcGNvdW50ID0gY291bnQ7CisJfQorCXB1dF9jcHUoKTsKK30KK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfbW9kKTsKKworLyoKKyAqIEFkZCB1cCBhbGwgdGhlIHBlci1jcHUgY291bnRzLCByZXR1cm4gdGhlIHJlc3VsdC4gIFRoaXMgaXMgYSBtb3JlIGFjY3VyYXRlCisgKiBidXQgbXVjaCBzbG93ZXIgdmVyc2lvbiBvZiBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCkKKyAqLworczY0IHBlcmNwdV9jb3VudGVyX3N1bShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3sKKwlzNjQgcmV0OworCWludCBjcHU7CisKKwlzcGluX2xvY2soJmZiYy0+bG9jayk7CisJcmV0ID0gZmJjLT5jb3VudDsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXMzMiAqcGNvdW50ID0gcGVyX2NwdV9wdHIoZmJjLT5jb3VudGVycywgY3B1KTsKKwkJcmV0ICs9ICpwY291bnQ7CisJfQorCXNwaW5fdW5sb2NrKCZmYmMtPmxvY2spOworCXJldHVybiByZXQgPCAwID8gMCA6IHJldDsKK30KK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfc3VtKTsKZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IDcwOTdiYjIuLjYzN2Q1NTYgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAKICNpZmRlZiBfX0tFUk5FTF9fCi0jZGVmaW5lIFJBRElYX1RSRUVfTUFQX1NISUZUCTYKKyNkZWZpbmUgUkFESVhfVFJFRV9NQVBfU0hJRlQJKENPTkZJR19CQVNFX1NNQUxMID8gNCA6IDYpCiAjZWxzZQogI2RlZmluZSBSQURJWF9UUkVFX01BUF9TSElGVAkzCS8qIEZvciBtb3JlIHN0cmVzc2Z1bCB0ZXN0aW5nICovCiAjZW5kaWYKQEAgLTc0LDYgKzc0LDExIEBACiB9OwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCwgcmFkaXhfdHJlZV9wcmVsb2FkcykgPSB7IDAsIH07CiAKK3N0YXRpYyBpbmxpbmUgZ2ZwX3Qgcm9vdF9nZnBfbWFzayhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQoreworCXJldHVybiByb290LT5nZnBfbWFzayAmIF9fR0ZQX0JJVFNfTUFTSzsKK30KKwogLyoKICAqIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBjYWxsZXIgaGFzIHBlcmZvcm1lZCBhcHByb3ByaWF0ZSBwcmVhbGxvY2F0aW9uLCBhbmQKICAqIHRoYXQgdGhlIGNhbGxlciBoYXMgcGlubmVkIHRoaXMgdGhyZWFkIG9mIGNvbnRyb2wgdG8gdGhlIGN1cnJlbnQgQ1BVLgpAQCAtODIsOSArODcsMTAgQEAKIHJhZGl4X3RyZWVfbm9kZV9hbGxvYyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQogewogCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnJldDsKKwlnZnBfdCBnZnBfbWFzayA9IHJvb3RfZ2ZwX21hc2socm9vdCk7CiAKLQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsIHJvb3QtPmdmcF9tYXNrKTsKLQlpZiAocmV0ID09IE5VTEwgJiYgIShyb290LT5nZnBfbWFzayAmIF9fR0ZQX1dBSVQpKSB7CisJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhyYWRpeF90cmVlX25vZGVfY2FjaGVwLCBnZnBfbWFzayk7CisJaWYgKHJldCA9PSBOVUxMICYmICEoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKSkgewogCQlzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkICpydHA7CiAKIAkJcnRwID0gJl9fZ2V0X2NwdV92YXIocmFkaXhfdHJlZV9wcmVsb2Fkcyk7CkBAIC0xNTIsNiArMTU4LDI3IEBACiAJcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgbm9kZS0+dGFnc1t0YWddKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJvb3RfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBpbnQgdGFnKQoreworCXJvb3QtPmdmcF9tYXNrIHw9ICgxIDw8ICh0YWcgKyBfX0dGUF9CSVRTX1NISUZUKSk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHJvb3RfdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGludCB0YWcpCit7CisJcm9vdC0+Z2ZwX21hc2sgJj0gfigxIDw8ICh0YWcgKyBfX0dGUF9CSVRTX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByb290X3RhZ19jbGVhcl9hbGwoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCkKK3sKKwlyb290LT5nZnBfbWFzayAmPSBfX0dGUF9CSVRTX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJvb3RfdGFnX2dldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBpbnQgdGFnKQoreworCXJldHVybiByb290LT5nZnBfbWFzayAmICgxIDw8ICh0YWcgKyBfX0dGUF9CSVRTX1NISUZUKSk7Cit9CisKIC8qCiAgKiBSZXR1cm5zIDEgaWYgYW55IHNsb3QgaW4gdGhlIG5vZGUgaGFzIHRoaXMgdGFnIHNldC4KICAqIE90aGVyd2lzZSByZXR1cm5zIDAuCkBAIC0xODIsNyArMjA5LDYgQEAKIHsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOwogCXVuc2lnbmVkIGludCBoZWlnaHQ7Ci0JY2hhciB0YWdzW1JBRElYX1RSRUVfTUFYX1RBR1NdOwogCWludCB0YWc7CiAKIAkvKiBGaWd1cmUgb3V0IHdoYXQgdGhlIGhlaWdodCBzaG91bGQgYmUuICAqLwpAQCAtMTk1LDE2ICsyMjEsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQkvKgotCSAqIFByZXBhcmUgdGhlIHRhZyBzdGF0dXMgb2YgdGhlIHRvcC1sZXZlbCBub2RlIGZvciBwcm9wYWdhdGlvbgotCSAqIGludG8gdGhlIG5ld2x5LXB1c2hlZCB0b3AtbGV2ZWwgbm9kZShzKQotCSAqLwotCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspIHsKLQkJdGFnc1t0YWddID0gMDsKLQkJaWYgKGFueV90YWdfc2V0KHJvb3QtPnJub2RlLCB0YWcpKQotCQkJdGFnc1t0YWddID0gMTsKLQl9Ci0KIAlkbyB7CiAJCWlmICghKG5vZGUgPSByYWRpeF90cmVlX25vZGVfYWxsb2Mocm9vdCkpKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMTQsNyArMjMwLDcgQEAKIAogCQkvKiBQcm9wYWdhdGUgdGhlIGFnZ3JlZ2F0ZWQgdGFnIGluZm8gaW50byB0aGUgbmV3IHJvb3QgKi8KIAkJZm9yICh0YWcgPSAwOyB0YWcgPCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykgewotCQkJaWYgKHRhZ3NbdGFnXSkKKwkJCWlmIChyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKIAkJCQl0YWdfc2V0KG5vZGUsIHRhZywgMCk7CiAJCX0KIApAQCAtMjQzLDggKzI1OSw3IEBACiAJaW50IGVycm9yOwogCiAJLyogTWFrZSBzdXJlIHRoZSB0cmVlIGlzIGhpZ2ggZW5vdWdoLiAgKi8KLQlpZiAoKCFpbmRleCAmJiAhcm9vdC0+cm5vZGUpIHx8Ci0JCQlpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgocm9vdC0+aGVpZ2h0KSkgeworCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgocm9vdC0+aGVpZ2h0KSkgewogCQllcnJvciA9IHJhZGl4X3RyZWVfZXh0ZW5kKHJvb3QsIGluZGV4KTsKIAkJaWYgKGVycm9yKQogCQkJcmV0dXJuIGVycm9yOwpAQCAtMjU1LDcgKzI3MCw3IEBACiAJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAKIAlvZmZzZXQgPSAwOwkJCS8qIHVuaW5pdGlhbGlzZWQgdmFyIHdhcm5pbmcgKi8KLQlkbyB7CisJd2hpbGUgKGhlaWdodCA+IDApIHsKIAkJaWYgKHNsb3QgPT0gTlVMTCkgewogCQkJLyogSGF2ZSB0byBhZGQgYSBjaGlsZCBub2RlLiAgKi8KIAkJCWlmICghKHNsb3QgPSByYWRpeF90cmVlX25vZGVfYWxsb2Mocm9vdCkpKQpAQCAtMjczLDE2ICsyODgsMjEgQEAKIAkJc2xvdCA9IG5vZGUtPnNsb3RzW29mZnNldF07CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwogCQloZWlnaHQtLTsKLQl9IHdoaWxlIChoZWlnaHQgPiAwKTsKKwl9CiAKIAlpZiAoc2xvdCAhPSBOVUxMKQogCQlyZXR1cm4gLUVFWElTVDsKIAotCUJVR19PTighbm9kZSk7Ci0Jbm9kZS0+Y291bnQrKzsKLQlub2RlLT5zbG90c1tvZmZzZXRdID0gaXRlbTsKLQlCVUdfT04odGFnX2dldChub2RlLCAwLCBvZmZzZXQpKTsKLQlCVUdfT04odGFnX2dldChub2RlLCAxLCBvZmZzZXQpKTsKKwlpZiAobm9kZSkgeworCQlub2RlLT5jb3VudCsrOworCQlub2RlLT5zbG90c1tvZmZzZXRdID0gaXRlbTsKKwkJQlVHX09OKHRhZ19nZXQobm9kZSwgMCwgb2Zmc2V0KSk7CisJCUJVR19PTih0YWdfZ2V0KG5vZGUsIDEsIG9mZnNldCkpOworCX0gZWxzZSB7CisJCXJvb3QtPnJub2RlID0gaXRlbTsKKwkJQlVHX09OKHJvb3RfdGFnX2dldChyb290LCAwKSk7CisJCUJVR19PTihyb290X3RhZ19nZXQocm9vdCwgMSkpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMjk1LDkgKzMxNSwxMyBAQAogCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKipzbG90OwogCiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OworCiAJaWYgKGluZGV4ID4gcmFkaXhfdHJlZV9tYXhpbmRleChoZWlnaHQpKQogCQlyZXR1cm4gTlVMTDsKIAorCWlmIChoZWlnaHQgPT0gMCAmJiByb290LT5ybm9kZSkKKwkJcmV0dXJuICh2b2lkICoqKSZyb290LT5ybm9kZTsKKwogCXNoaWZ0ID0gKGhlaWdodC0xKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCXNsb3QgPSAmcm9vdC0+cm5vZGU7CiAKQEAgLTM2NSwxMSArMzg5LDEwIEBACiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKLQlpZiAoaW5kZXggPiByYWRpeF90cmVlX21heGluZGV4KGhlaWdodCkpCi0JCXJldHVybiBOVUxMOworCUJVR19PTihpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSk7CiAKLQlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCXNsb3QgPSByb290LT5ybm9kZTsKKwlzaGlmdCA9IChoZWlnaHQgLSAxKSAqIFJBRElYX1RSRUVfTUFQX1NISUZUOwogCiAJd2hpbGUgKGhlaWdodCA+IDApIHsKIAkJaW50IG9mZnNldDsKQEAgLTM4Myw2ICs0MDYsMTAgQEAKIAkJaGVpZ2h0LS07CiAJfQogCisJLyogc2V0IHRoZSByb290J3MgdGFnIGJpdCAqLworCWlmIChzbG90ICYmICFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKKwkJcm9vdF90YWdfc2V0KHJvb3QsIHRhZyk7CisKIAlyZXR1cm4gc2xvdDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdfc2V0KTsKQEAgLTQwNSw5ICs0MzIsOCBAQAogCQkJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IHRhZykKIHsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9wYXRoIHBhdGhbUkFESVhfVFJFRV9NQVhfUEFUSF0sICpwYXRocCA9IHBhdGg7Ci0Jc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90ID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgaGVpZ2h0LCBzaGlmdDsKLQl2b2lkICpyZXQgPSBOVUxMOwogCiAJaGVpZ2h0ID0gcm9vdC0+aGVpZ2h0OwogCWlmIChpbmRleCA+IHJhZGl4X3RyZWVfbWF4aW5kZXgoaGVpZ2h0KSkKQEAgLTQzMiwyMCArNDU4LDI0IEBACiAJCWhlaWdodC0tOwogCX0KIAotCXJldCA9IHNsb3Q7Ci0JaWYgKHJldCA9PSBOVUxMKQorCWlmIChzbG90ID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCi0JZG8geworCXdoaWxlIChwYXRocC0+bm9kZSkgewogCQlpZiAoIXRhZ19nZXQocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCkpCiAJCQlnb3RvIG91dDsKIAkJdGFnX2NsZWFyKHBhdGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZzZXQpOwogCQlpZiAoYW55X3RhZ19zZXQocGF0aHAtPm5vZGUsIHRhZykpCiAJCQlnb3RvIG91dDsKIAkJcGF0aHAtLTsKLQl9IHdoaWxlIChwYXRocC0+bm9kZSk7CisJfQorCisJLyogY2xlYXIgdGhlIHJvb3QncyB0YWcgYml0ICovCisJaWYgKHJvb3RfdGFnX2dldChyb290LCB0YWcpKQorCQlyb290X3RhZ19jbGVhcihyb290LCB0YWcpOworCiBvdXQ6Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc2xvdDsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdfY2xlYXIpOwogCkBAIC00NTgsOSArNDg4LDggQEAKICAqCiAgKiBSZXR1cm4gdmFsdWVzOgogICoKLSAqICAwOiB0YWcgbm90IHByZXNlbnQKLSAqICAxOiB0YWcgcHJlc2VudCwgc2V0Ci0gKiAtMTogdGFnIHByZXNlbnQsIHVuc2V0CisgKiAgMDogdGFnIG5vdCBwcmVzZW50IG9yIG5vdCBzZXQKKyAqICAxOiB0YWcgc2V0CiAgKi8KIGludCByYWRpeF90cmVlX3RhZ19nZXQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKIAkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGludCB0YWcpCkBAIC00NzMsNiArNTAyLDEzIEBACiAJaWYgKGluZGV4ID4gcmFkaXhfdHJlZV9tYXhpbmRleChoZWlnaHQpKQogCQlyZXR1cm4gMDsKIAorCS8qIGNoZWNrIHRoZSByb290J3MgdGFnIGJpdCAqLworCWlmICghcm9vdF90YWdfZ2V0KHJvb3QsIHRhZykpCisJCXJldHVybiAwOworCisJaWYgKGhlaWdodCA9PSAwKQorCQlyZXR1cm4gMTsKKwogCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJc2xvdCA9IHJvb3QtPnJub2RlOwogCkBAIC00OTQsNyArNTMwLDcgQEAKIAkJCWludCByZXQgPSB0YWdfZ2V0KHNsb3QsIHRhZywgb2Zmc2V0KTsKIAogCQkJQlVHX09OKHJldCAmJiBzYXdfdW5zZXRfdGFnKTsKLQkJCXJldHVybiByZXQgPyAxIDogLTE7CisJCQlyZXR1cm4gISFyZXQ7CiAJCX0KIAkJc2xvdCA9IHNsb3QtPnNsb3RzW29mZnNldF07CiAJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOwpAQCAtNTE0LDggKzU1MCwxMSBAQAogCXVuc2lnbmVkIGxvbmcgaTsKIAogCWhlaWdodCA9IHJvb3QtPmhlaWdodDsKLQlpZiAoaGVpZ2h0ID09IDApCisJaWYgKGhlaWdodCA9PSAwKSB7CisJCWlmIChyb290LT5ybm9kZSAmJiBpbmRleCA9PSAwKQorCQkJcmVzdWx0c1tucl9mb3VuZCsrXSA9IHJvb3QtPnJub2RlOwogCQlnb3RvIG91dDsKKwl9CiAKIAlzaGlmdCA9IChoZWlnaHQtMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKIAlzbG90ID0gcm9vdC0+cm5vZGU7CkBAIC02MDMsMTAgKzY0MiwxNiBAQAogCXVuc2lnbmVkIGludCBoZWlnaHQgPSByb290LT5oZWlnaHQ7CiAJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdDsKIAorCWlmIChoZWlnaHQgPT0gMCkgeworCQlpZiAocm9vdC0+cm5vZGUgJiYgaW5kZXggPT0gMCkKKwkJCXJlc3VsdHNbbnJfZm91bmQrK10gPSByb290LT5ybm9kZTsKKwkJZ290byBvdXQ7CisJfQorCiAJc2hpZnQgPSAoaGVpZ2h0IC0gMSkgKiBSQURJWF9UUkVFX01BUF9TSElGVDsKIAlzbG90ID0gcm9vdC0+cm5vZGU7CiAKLQl3aGlsZSAoaGVpZ2h0ID4gMCkgeworCWRvIHsKIAkJdW5zaWduZWQgbG9uZyBpID0gKGluZGV4ID4+IHNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CiAKIAkJZm9yICggOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CkBAIC02MzcsNyArNjgyLDcgQEAKIAkJfQogCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKIAkJc2xvdCA9IHNsb3QtPnNsb3RzW2ldOwotCX0KKwl9IHdoaWxlIChoZWlnaHQgPiAwKTsKIG91dDoKIAkqbmV4dF9pbmRleCA9IGluZGV4OwogCXJldHVybiBucl9mb3VuZDsKQEAgLTY2NSw2ICs3MTAsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA9IGZpcnN0X2luZGV4OwogCXVuc2lnbmVkIGludCByZXQgPSAwOwogCisJLyogY2hlY2sgdGhlIHJvb3QncyB0YWcgYml0ICovCisJaWYgKCFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKKwkJcmV0dXJuIDA7CisKIAl3aGlsZSAocmV0IDwgbWF4X2l0ZW1zKSB7CiAJCXVuc2lnbmVkIGludCBucl9mb3VuZDsKIAkJdW5zaWduZWQgbG9uZyBuZXh0X2luZGV4OwkvKiBJbmRleCBvZiBuZXh0IHNlYXJjaCAqLwpAQCAtNjg5LDcgKzczOCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcmFkaXhfdHJlZV9zaHJpbmsoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCkKIHsKIAkvKiB0cnkgdG8gc2hyaW5rIHRyZWUgaGVpZ2h0ICovCi0Jd2hpbGUgKHJvb3QtPmhlaWdodCA+IDEgJiYKKwl3aGlsZSAocm9vdC0+aGVpZ2h0ID4gMCAmJgogCQkJcm9vdC0+cm5vZGUtPmNvdW50ID09IDEgJiYKIAkJCXJvb3QtPnJub2RlLT5zbG90c1swXSkgewogCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICp0b19mcmVlID0gcm9vdC0+cm5vZGU7CkBAIC03MTcsMTIgKzc2Niw4IEBACiB2b2lkICpyYWRpeF90cmVlX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGluZGV4KQogewogCXN0cnVjdCByYWRpeF90cmVlX3BhdGggcGF0aFtSQURJWF9UUkVFX01BWF9QQVRIXSwgKnBhdGhwID0gcGF0aDsKLQlzdHJ1Y3QgcmFkaXhfdHJlZV9wYXRoICpvcmlnX3BhdGhwOwotCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdCA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgc2hpZnQ7Ci0Jdm9pZCAqcmV0ID0gTlVMTDsKLQljaGFyIHRhZ3NbUkFESVhfVFJFRV9NQVhfVEFHU107Ci0JaW50IG5yX2NsZWFyZWRfdGFnczsKIAlpbnQgdGFnOwogCWludCBvZmZzZXQ7CiAKQEAgLTczMCwxMSArNzc1LDE3IEBACiAJaWYgKGluZGV4ID4gcmFkaXhfdHJlZV9tYXhpbmRleChoZWlnaHQpKQogCQlnb3RvIG91dDsKIAorCXNsb3QgPSByb290LT5ybm9kZTsKKwlpZiAoaGVpZ2h0ID09IDAgJiYgcm9vdC0+cm5vZGUpIHsKKwkJcm9vdF90YWdfY2xlYXJfYWxsKHJvb3QpOworCQlyb290LT5ybm9kZSA9IE5VTEw7CisJCWdvdG8gb3V0OworCX0KKwogCXNoaWZ0ID0gKGhlaWdodCAtIDEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CiAJcGF0aHAtPm5vZGUgPSBOVUxMOwotCXNsb3QgPSByb290LT5ybm9kZTsKIAotCWZvciAoIDsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0pIHsKKwlkbyB7CiAJCWlmIChzbG90ID09IE5VTEwpCiAJCQlnb3RvIG91dDsKIApAQCAtNzQ0LDQ0ICs3OTUsMjIgQEAKIAkJcGF0aHAtPm5vZGUgPSBzbG90OwogCQlzbG90ID0gc2xvdC0+c2xvdHNbb2Zmc2V0XTsKIAkJc2hpZnQgLT0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7Ci0JfQorCQloZWlnaHQtLTsKKwl9IHdoaWxlIChoZWlnaHQgPiAwKTsKIAotCXJldCA9IHNsb3Q7Ci0JaWYgKHJldCA9PSBOVUxMKQorCWlmIChzbG90ID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCi0Jb3JpZ19wYXRocCA9IHBhdGhwOwotCiAJLyoKIAkgKiBDbGVhciBhbGwgdGFncyBhc3NvY2lhdGVkIHdpdGggdGhlIGp1c3QtZGVsZXRlZCBpdGVtCiAJICovCi0JbnJfY2xlYXJlZF90YWdzID0gMDsKIAlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKSB7Ci0JCXRhZ3NbdGFnXSA9IDE7Ci0JCWlmICh0YWdfZ2V0KHBhdGhwLT5ub2RlLCB0YWcsIHBhdGhwLT5vZmZzZXQpKSB7Ci0JCQl0YWdfY2xlYXIocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCk7Ci0JCQlpZiAoIWFueV90YWdfc2V0KHBhdGhwLT5ub2RlLCB0YWcpKSB7Ci0JCQkJdGFnc1t0YWddID0gMDsKLQkJCQlucl9jbGVhcmVkX3RhZ3MrKzsKLQkJCX0KLQkJfQotCX0KLQotCWZvciAocGF0aHAtLTsgbnJfY2xlYXJlZF90YWdzICYmIHBhdGhwLT5ub2RlOyBwYXRocC0tKSB7Ci0JCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspIHsKLQkJCWlmICh0YWdzW3RhZ10pCi0JCQkJY29udGludWU7Ci0KLQkJCXRhZ19jbGVhcihwYXRocC0+bm9kZSwgdGFnLCBwYXRocC0+b2Zmc2V0KTsKLQkJCWlmIChhbnlfdGFnX3NldChwYXRocC0+bm9kZSwgdGFnKSkgewotCQkJCXRhZ3NbdGFnXSA9IDE7Ci0JCQkJbnJfY2xlYXJlZF90YWdzLS07Ci0JCQl9Ci0JCX0KKwkJaWYgKHRhZ19nZXQocGF0aHAtPm5vZGUsIHRhZywgcGF0aHAtPm9mZnNldCkpCisJCQlyYWRpeF90cmVlX3RhZ19jbGVhcihyb290LCBpbmRleCwgdGFnKTsKIAl9CiAKIAkvKiBOb3cgZnJlZSB0aGUgbm9kZXMgd2UgZG8gbm90IG5lZWQgYW55bW9yZSAqLwotCWZvciAocGF0aHAgPSBvcmlnX3BhdGhwOyBwYXRocC0+bm9kZTsgcGF0aHAtLSkgeworCXdoaWxlIChwYXRocC0+bm9kZSkgewogCQlwYXRocC0+bm9kZS0+c2xvdHNbcGF0aHAtPm9mZnNldF0gPSBOVUxMOwogCQlwYXRocC0+bm9kZS0+Y291bnQtLTsKIApAQCAtNzkzLDExICs4MjIsMTUgQEAKIAogCQkvKiBOb2RlIHdpdGggemVybyBzbG90cyBpbiB1c2Ugc28gZnJlZSBpdCAqLwogCQlyYWRpeF90cmVlX25vZGVfZnJlZShwYXRocC0+bm9kZSk7CisKKwkJcGF0aHAtLTsKIAl9Ci0Jcm9vdC0+cm5vZGUgPSBOVUxMOworCXJvb3RfdGFnX2NsZWFyX2FsbChyb290KTsKIAlyb290LT5oZWlnaHQgPSAwOworCXJvb3QtPnJub2RlID0gTlVMTDsKKwogb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIHNsb3Q7CiB9CiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZGVsZXRlKTsKIApAQCAtODA4LDExICs4NDEsNyBAQAogICovCiBpbnQgcmFkaXhfdHJlZV90YWdnZWQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgaW50IHRhZykKIHsKLSAgCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnJub2RlOwotICAJcm5vZGUgPSByb290LT5ybm9kZTsKLSAgCWlmICghcm5vZGUpCi0gIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGFueV90YWdfc2V0KHJub2RlLCB0YWcpOworCXJldHVybiByb290X3RhZ19nZXQocm9vdCwgdGFnKTsKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdnZWQpOwogCmRpZmYgLS1naXQgYS9saWIvcmVlZF9zb2xvbW9uL3JlZWRfc29sb21vbi5jIGIvbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYwppbmRleCBmOGFjOWZhLi4yY2MxMWZhIDEwMDY0NAotLS0gYS9saWIvcmVlZF9zb2xvbW9uL3JlZWRfc29sb21vbi5jCisrKyBiL2xpYi9yZWVkX3NvbG9tb24vcmVlZF9zb2xvbW9uLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAogLyoqCiAgKiByc19pbml0IC0gSW5pdGlhbGl6ZSBhIFJlZWQtU29sb21vbiBjb2RlYwotICoKICAqIEBzeW1zaXplOglzeW1ib2wgc2l6ZSwgYml0cyAoMS04KQogICogQGdmcG9seToJRmllbGQgZ2VuZXJhdG9yIHBvbHlub21pYWwgY29lZmZpY2llbnRzCiAgKiBAZmNyOglmaXJzdCByb290IG9mIFJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwsIGluZGV4IGZvcm0KQEAgLTYyLDcgKzYxLDcgQEAKICAqIEBucm9vdHM6CVJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZGVncmVlIChudW1iZXIgb2Ygcm9vdHMpCiAgKgogICogQWxsb2NhdGUgYSBjb250cm9sIHN0cnVjdHVyZSBhbmQgdGhlIHBvbHlub20gYXJyYXlzIGZvciBmYXN0ZXIKLSAqIGVuL2RlY29kaW5nLiBGaWxsIHRoZSBhcnJheXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzCisgKiBlbi9kZWNvZGluZy4gRmlsbCB0aGUgYXJyYXlzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KICAqLwogc3RhdGljIHN0cnVjdCByc19jb250cm9sICpyc19pbml0KGludCBzeW1zaXplLCBpbnQgZ2Zwb2x5LCBpbnQgZmNyLAogCQkJCSAgIGludCBwcmltLCBpbnQgbnJvb3RzKQpAQCAtMTU1LDggKzE1NCw3IEBACiAKIAogLyoqCi0gKiAgZnJlZV9ycyAtIEZyZWUgdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlLCBpZiBpdHMgbm90IGxvbmdlciB1c2VkCi0gKgorICogIGZyZWVfcnMgLSBGcmVlIHRoZSBycyBjb250cm9sIHN0cnVjdHVyZSwgaWYgaXQgaXMgbm8gbG9uZ2VyIHVzZWQKICAqICBAcnM6CXRoZSBjb250cm9sIHN0cnVjdHVyZSB3aGljaCBpcyBub3QgbG9uZ2VyIHVzZWQgYnkgdGhlCiAgKgkJY2FsbGVyCiAgKi8KQEAgLTE3Niw3ICsxNzQsNiBAQAogCiAvKioKICAqIGluaXRfcnMgLSBGaW5kIGEgbWF0Y2hpbmcgb3IgYWxsb2NhdGUgYSBuZXcgcnMgY29udHJvbCBzdHJ1Y3R1cmUKLSAqCiAgKiAgQHN5bXNpemU6CXRoZSBzeW1ib2wgc2l6ZSAobnVtYmVyIG9mIGJpdHMpCiAgKiAgQGdmcG9seToJdGhlIGV4dGVuZGVkIEdhbG9pcyBmaWVsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBjb2VmZmljaWVudHMsCiAgKgkJd2l0aCB0aGUgMHRoIGNvZWZmaWNpZW50IGluIHRoZSBsb3cgb3JkZXIgYml0LiBUaGUgcG9seW5vbWlhbApAQCAtMjM2LDcgKzIzMyw2IEBACiAjaWZkZWYgQ09ORklHX1JFRURfU09MT01PTl9FTkM4CiAvKioKICAqICBlbmNvZGVfcnM4IC0gQ2FsY3VsYXRlIHRoZSBwYXJpdHkgZm9yIGRhdGEgdmFsdWVzICg4Yml0IGRhdGEgd2lkdGgpCi0gKgogICogIEByczoJdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlCiAgKiAgQGRhdGE6CWRhdGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlCiAgKiAgQGxlbjoJZGF0YSBsZW5ndGgKQEAgLTI1OCw3ICsyNTQsNiBAQAogI2lmZGVmIENPTkZJR19SRUVEX1NPTE9NT05fREVDOAogLyoqCiAgKiAgZGVjb2RlX3JzOCAtIERlY29kZSBjb2Rld29yZCAoOGJpdCBkYXRhIHdpZHRoKQotICoKICAqICBAcnM6CXRoZSBycyBjb250cm9sIHN0cnVjdHVyZQogICogIEBkYXRhOglkYXRhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZQogICogIEBwYXI6CXJlY2VpdmVkIHBhcml0eSBkYXRhIGZpZWxkCkBAIC0yODUsNyArMjgwLDYgQEAKICNpZmRlZiBDT05GSUdfUkVFRF9TT0xPTU9OX0VOQzE2CiAvKioKICAqICBlbmNvZGVfcnMxNiAtIENhbGN1bGF0ZSB0aGUgcGFyaXR5IGZvciBkYXRhIHZhbHVlcyAoMTZiaXQgZGF0YSB3aWR0aCkKLSAqCiAgKiAgQHJzOgl0aGUgcnMgY29udHJvbCBzdHJ1Y3R1cmUKICAqICBAZGF0YToJZGF0YSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUKICAqICBAbGVuOglkYXRhIGxlbmd0aApAQCAtMzA1LDcgKzI5OSw2IEBACiAjaWZkZWYgQ09ORklHX1JFRURfU09MT01PTl9ERUMxNgogLyoqCiAgKiAgZGVjb2RlX3JzMTYgLSBEZWNvZGUgY29kZXdvcmQgKDE2Yml0IGRhdGEgd2lkdGgpCi0gKgogICogIEByczoJdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlCiAgKiAgQGRhdGE6CWRhdGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlCiAgKiAgQHBhcjoJcmVjZWl2ZWQgcGFyaXR5IGRhdGEgZmllbGQKZGlmZiAtLWdpdCBhL2xpYi9zdHJpbmcuYyBiL2xpYi9zdHJpbmcuYwppbmRleCAwNjRmNjMxLi42MzA3NzI2IDEwMDY0NAotLS0gYS9saWIvc3RyaW5nLmMKKysrIGIvbGliL3N0cmluZy5jCkBAIC0zMDEsNiArMzAxLDM2IEBACiBFWFBPUlRfU1lNQk9MKHN0cm5jaHIpOwogI2VuZGlmCiAKKy8qKgorICogc3Ryc3RyaXAgLSBSZW1vdmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBAcy4KKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHN0cmlwcGVkLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgZmlyc3QgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZXBsYWNlZCB3aXRoIGEgJU5VTC10ZXJtaW5hdG9yCisgKiBpbiB0aGUgZ2l2ZW4gc3RyaW5nIEBzLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UKKyAqIGNoYXJhY3RlciBpbiBAcy4KKyAqLworY2hhciAqc3Ryc3RyaXAoY2hhciAqcykKK3sKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICplbmQ7CisKKwlzaXplID0gc3RybGVuKHMpOworCisJaWYgKCFzaXplKQorCQlyZXR1cm4gczsKKworCWVuZCA9IHMgKyBzaXplIC0gMTsKKwl3aGlsZSAoZW5kICE9IHMgJiYgaXNzcGFjZSgqZW5kKSkKKwkJZW5kLS07CisJKihlbmQgKyAxKSA9ICdcMCc7CisKKwl3aGlsZSAoKnMgJiYgaXNzcGFjZSgqcykpCisJCXMrKzsKKworCXJldHVybiBzOworfQorRVhQT1JUX1NZTUJPTChzdHJzdHJpcCk7CisKICNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTEVOCiAvKioKICAqIHN0cmxlbiAtIEZpbmQgdGhlIGxlbmd0aCBvZiBhIHN0cmluZwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBiMDdkYjVjLi43OTc0MjhhIDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTg3LDQ5ICsxODcsNDkgQEAKIAlzaXplIC09IHByZWNpc2lvbjsKIAlpZiAoISh0eXBlJihaRVJPUEFEK0xFRlQpKSkgewogCQl3aGlsZShzaXplLS0+MCkgewotCQkJaWYgKGJ1ZiA8PSBlbmQpCisJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSAnICc7CiAJCQkrK2J1ZjsKIAkJfQogCX0KIAlpZiAoc2lnbikgewotCQlpZiAoYnVmIDw9IGVuZCkKKwkJaWYgKGJ1ZiA8IGVuZCkKIAkJCSpidWYgPSBzaWduOwogCQkrK2J1ZjsKIAl9CiAJaWYgKHR5cGUgJiBTUEVDSUFMKSB7CiAJCWlmIChiYXNlPT04KSB7Ci0JCQlpZiAoYnVmIDw9IGVuZCkKKwkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9ICcwJzsKIAkJCSsrYnVmOwogCQl9IGVsc2UgaWYgKGJhc2U9PTE2KSB7Ci0JCQlpZiAoYnVmIDw9IGVuZCkKKwkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9ICcwJzsKIAkJCSsrYnVmOwotCQkJaWYgKGJ1ZiA8PSBlbmQpCisJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSBkaWdpdHNbMzNdOwogCQkJKytidWY7CiAJCX0KIAl9CiAJaWYgKCEodHlwZSAmIExFRlQpKSB7CiAJCXdoaWxlIChzaXplLS0gPiAwKSB7Ci0JCQlpZiAoYnVmIDw9IGVuZCkKKwkJCWlmIChidWYgPCBlbmQpCiAJCQkJKmJ1ZiA9IGM7CiAJCQkrK2J1ZjsKIAkJfQogCX0KIAl3aGlsZSAoaSA8IHByZWNpc2lvbi0tKSB7Ci0JCWlmIChidWYgPD0gZW5kKQorCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9ICcwJzsKIAkJKytidWY7CiAJfQogCXdoaWxlIChpLS0gPiAwKSB7Ci0JCWlmIChidWYgPD0gZW5kKQorCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9IHRtcFtpXTsKIAkJKytidWY7CiAJfQogCXdoaWxlIChzaXplLS0gPiAwKSB7Ci0JCWlmIChidWYgPD0gZW5kKQorCQlpZiAoYnVmIDwgZW5kKQogCQkJKmJ1ZiA9ICcgJzsKIAkJKytidWY7CiAJfQpAQCAtMjcyLDcgKzI3Miw4IEBACiAJCQkJLyogJ3onIGNoYW5nZWQgdG8gJ1onIC0tZGF2aWRtIDEvMjUvOTkgKi8KIAkJCQkvKiAndCcgYWRkZWQgZm9yIHB0cmRpZmZfdCAqLwogCi0JLyogUmVqZWN0IG91dC1vZi1yYW5nZSB2YWx1ZXMgZWFybHkgKi8KKwkvKiBSZWplY3Qgb3V0LW9mLXJhbmdlIHZhbHVlcyBlYXJseS4gIExhcmdlIHBvc2l0aXZlIHNpemVzIGFyZQorCSAgIHVzZWQgZm9yIHVua25vd24gYnVmZmVyIHNpemVzLiAqLwogCWlmICh1bmxpa2VseSgoaW50KSBzaXplIDwgMCkpIHsKIAkJLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lLi4gKi8KIAkJc3RhdGljIGludCB3YXJuID0gMTsKQEAgLTI4MiwxNiArMjgzLDE3IEBACiAJfQogCiAJc3RyID0gYnVmOwotCWVuZCA9IGJ1ZiArIHNpemUgLSAxOworCWVuZCA9IGJ1ZiArIHNpemU7CiAKLQlpZiAoZW5kIDwgYnVmIC0gMSkgewotCQllbmQgPSAoKHZvaWQgKikgLTEpOwotCQlzaXplID0gZW5kIC0gYnVmICsgMTsKKwkvKiBNYWtlIHN1cmUgZW5kIGlzIGFsd2F5cyA+PSBidWYgKi8KKwlpZiAoZW5kIDwgYnVmKSB7CisJCWVuZCA9ICgodm9pZCAqKS0xKTsKKwkJc2l6ZSA9IGVuZCAtIGJ1ZjsKIAl9CiAKIAlmb3IgKDsgKmZtdCA7ICsrZm10KSB7CiAJCWlmICgqZm10ICE9ICclJykgewotCQkJaWYgKHN0ciA8PSBlbmQpCisJCQlpZiAoc3RyIDwgZW5kKQogCQkJCSpzdHIgPSAqZm10OwogCQkJKytzdHI7CiAJCQljb250aW51ZTsKQEAgLTM1NywxNyArMzU5LDE3IEBACiAJCQljYXNlICdjJzoKIAkJCQlpZiAoIShmbGFncyAmIExFRlQpKSB7CiAJCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkgewotCQkJCQkJaWYgKHN0ciA8PSBlbmQpCisJCQkJCQlpZiAoc3RyIDwgZW5kKQogCQkJCQkJCSpzdHIgPSAnICc7CiAJCQkJCQkrK3N0cjsKIAkJCQkJfQogCQkJCX0KIAkJCQljID0gKHVuc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOwotCQkJCWlmIChzdHIgPD0gZW5kKQorCQkJCWlmIChzdHIgPCBlbmQpCiAJCQkJCSpzdHIgPSBjOwogCQkJCSsrc3RyOwogCQkJCXdoaWxlICgtLWZpZWxkX3dpZHRoID4gMCkgewotCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJCSpzdHIgPSAnICc7CiAJCQkJCSsrc3RyOwogCQkJCX0KQEAgLTM4MiwxOCArMzg0LDE4IEBACiAKIAkJCQlpZiAoIShmbGFncyAmIExFRlQpKSB7CiAJCQkJCXdoaWxlIChsZW4gPCBmaWVsZF93aWR0aC0tKSB7Ci0JCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJCWlmIChzdHIgPCBlbmQpCiAJCQkJCQkJKnN0ciA9ICcgJzsKIAkJCQkJCSsrc3RyOwogCQkJCQl9CiAJCQkJfQogCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJCSpzdHIgPSAqczsKIAkJCQkJKytzdHI7ICsrczsKIAkJCQl9CiAJCQkJd2hpbGUgKGxlbiA8IGZpZWxkX3dpZHRoLS0pIHsKLQkJCQkJaWYgKHN0ciA8PSBlbmQpCisJCQkJCWlmIChzdHIgPCBlbmQpCiAJCQkJCQkqc3RyID0gJyAnOwogCQkJCQkrK3N0cjsKIAkJCQl9CkBAIC00MjYsNyArNDI4LDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJY2FzZSAnJSc6Ci0JCQkJaWYgKHN0ciA8PSBlbmQpCisJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJKnN0ciA9ICclJzsKIAkJCQkrK3N0cjsKIAkJCQljb250aW51ZTsKQEAgLTQ0OSwxMSArNDUxLDExIEBACiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJaWYgKHN0ciA8PSBlbmQpCisJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJKnN0ciA9ICclJzsKIAkJCQkrK3N0cjsKIAkJCQlpZiAoKmZtdCkgewotCQkJCQlpZiAoc3RyIDw9IGVuZCkKKwkJCQkJaWYgKHN0ciA8IGVuZCkKIAkJCQkJCSpzdHIgPSAqZm10OwogCQkJCQkrK3N0cjsKIAkJCQl9IGVsc2UgewpAQCAtNDgzLDE0ICs0ODUsMTMgQEAKIAkJc3RyID0gbnVtYmVyKHN0ciwgZW5kLCBudW0sIGJhc2UsCiAJCQkJZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgZmxhZ3MpOwogCX0KLQlpZiAoc3RyIDw9IGVuZCkKLQkJKnN0ciA9ICdcMCc7Ci0JZWxzZSBpZiAoc2l6ZSA+IDApCi0JCS8qIGRvbid0IHdyaXRlIG91dCBhIG51bGwgYnl0ZSBpZiB0aGUgYnVmIHNpemUgaXMgemVybyAqLwotCQkqZW5kID0gJ1wwJzsKLQkvKiB0aGUgdHJhaWxpbmcgbnVsbCBieXRlIGRvZXNuJ3QgY291bnQgdG93YXJkcyB0aGUgdG90YWwKLQkqICsrc3RyOwotCSovCisJaWYgKHNpemUgPiAwKSB7CisJCWlmIChzdHIgPCBlbmQpCisJCQkqc3RyID0gJ1wwJzsKKwkJZWxzZQorCQkJKmVuZCA9ICdcMCc7CisJfQorCS8qIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSB0b3RhbCAqLwogCXJldHVybiBzdHItYnVmOwogfQogCkBAIC04NDgsMyArODQ5LDI2IEBACiB9CiAKIEVYUE9SVF9TWU1CT0woc3NjYW5mKTsKKworCisvKiBTaW1wbGlmaWVkIGFzcHJpbnRmLiAqLworY2hhciAqa2FzcHJpbnRmKGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNoYXIgKnA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlsZW4gPSB2c25wcmludGYoTlVMTCwgMCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXAgPSBrbWFsbG9jKGxlbisxLCBnZnApOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKHAsIGxlbisxLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCXJldHVybiBwOworfQorCitFWFBPUlRfU1lNQk9MKGthc3ByaW50Zik7CmRpZmYgLS1naXQgYS9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYyBiL2xpYi96bGliX2RlZmxhdGUvZGVmbGF0ZS5jCmluZGV4IDE2NTNkZDkuLmMzZTRhMmJhIDEwMDY0NAotLS0gYS9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYworKysgYi9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYwpAQCAtMTY0LDM0ICsxNjQsMTcgQEAKICAgICBtZW1zZXQoKGNoYXIgKilzLT5oZWFkLCAwLCAodW5zaWduZWQpKHMtPmhhc2hfc2l6ZS0xKSpzaXplb2YoKnMtPmhlYWQpKTsKIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IHpsaWJfZGVmbGF0ZUluaXRfKAotCXpfc3RyZWFtcCBzdHJtLAotCWludCBsZXZlbCwKLQljb25zdCBjaGFyICp2ZXJzaW9uLAotCWludCBzdHJlYW1fc2l6ZQotKQotewotICAgIHJldHVybiB6bGliX2RlZmxhdGVJbml0Ml8oc3RybSwgbGV2ZWwsIFpfREVGTEFURUQsIE1BWF9XQklUUywKLQkJCSAgICAgIERFRl9NRU1fTEVWRUwsCi0JCQkgICAgICBaX0RFRkFVTFRfU1RSQVRFR1ksIHZlcnNpb24sIHN0cmVhbV9zaXplKTsKLSAgICAvKiBUbyBkbzogaWdub3JlIHN0cm0tPm5leHRfaW4gaWYgd2UgdXNlIGl0IGFzIHdpbmRvdyAqLwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgemxpYl9kZWZsYXRlSW5pdDJfKAoraW50IHpsaWJfZGVmbGF0ZUluaXQyKAogCXpfc3RyZWFtcCBzdHJtLAogCWludCAgbGV2ZWwsCiAJaW50ICBtZXRob2QsCiAJaW50ICB3aW5kb3dCaXRzLAogCWludCAgbWVtTGV2ZWwsCi0JaW50ICBzdHJhdGVneSwKLQljb25zdCBjaGFyICp2ZXJzaW9uLAotCWludCBzdHJlYW1fc2l6ZQorCWludCAgc3RyYXRlZ3kKICkKIHsKICAgICBkZWZsYXRlX3N0YXRlICpzOwogICAgIGludCBub2hlYWRlciA9IDA7Ci0gICAgc3RhdGljIGNoYXIqIG15X3ZlcnNpb24gPSBaTElCX1ZFUlNJT047CiAgICAgZGVmbGF0ZV93b3Jrc3BhY2UgKm1lbTsKIAogICAgIHVzaCAqb3ZlcmxheTsKQEAgLTE5OSwxMCArMTgyLDYgQEAKICAgICAgKiBvdXRwdXQgc2l6ZSBmb3IgKGxlbmd0aCxkaXN0YW5jZSkgY29kZXMgaXMgPD0gMjQgYml0cy4KICAgICAgKi8KIAotICAgIGlmICh2ZXJzaW9uID09IE5VTEwgfHwgdmVyc2lvblswXSAhPSBteV92ZXJzaW9uWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkpIHsKLQlyZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotICAgIH0KICAgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CiAKICAgICBzdHJtLT5tc2cgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlX3N5bXMuYyBiL2xpYi96bGliX2RlZmxhdGUvZGVmbGF0ZV9zeW1zLmMKaW5kZXggNzY3YjU3My4uY2NmZTI1ZiAxMDA2NDQKLS0tIGEvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlX3N5bXMuYworKysgYi9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGVfc3ltcy5jCkBAIC0xMiw4ICsxMiw3IEBACiAKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUpOwogRVhQT1JUX1NZTUJPTCh6bGliX2RlZmxhdGUpOwotRVhQT1JUX1NZTUJPTCh6bGliX2RlZmxhdGVJbml0Xyk7Ci1FWFBPUlRfU1lNQk9MKHpsaWJfZGVmbGF0ZUluaXQyXyk7CitFWFBPUlRfU1lNQk9MKHpsaWJfZGVmbGF0ZUluaXQyKTsKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlRW5kKTsKIEVYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlUmVzZXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9NYWtlZmlsZSBiL2xpYi96bGliX2luZmxhdGUvTWFrZWZpbGUKaW5kZXggMjIxYzEzOS4uYmYwNjU0OCAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9NYWtlZmlsZQorKysgYi9saWIvemxpYl9pbmZsYXRlL01ha2VmaWxlCkBAIC0xNSw1ICsxNSw1IEBACiAKIG9iai0kKENPTkZJR19aTElCX0lORkxBVEUpICs9IHpsaWJfaW5mbGF0ZS5vCiAKLXpsaWJfaW5mbGF0ZS1vYmpzIDo9IGluZmJsb2NrLm8gaW5mY29kZXMubyBpbmZmYXN0Lm8gaW5mbGF0ZS5vIFwKLQkJICAgICBpbmZsYXRlX3N5bmMubyBpbmZ0cmVlcy5vIGluZnV0aWwubyBpbmZsYXRlX3N5bXMubworemxpYl9pbmZsYXRlLW9ianMgOj0gaW5mZmFzdC5vIGluZmxhdGUubyBcCisJCSAgICAgaW5mdHJlZXMubyBpbmZsYXRlX3N5bXMubwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZibG9jay5jIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZibG9jay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTZjZGVmLi4wMDAwMDAwCi0tLSBhL2xpYi96bGliX2luZmxhdGUvaW5mYmxvY2suYworKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKiBpbmZibG9jay5jIC0tIGludGVycHJldCBhbmQgcHJvY2VzcyBibG9jayB0eXBlcyB0byBsYXN0IGJsb2NrCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgotI2luY2x1ZGUgImluZmJsb2NrLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZjb2Rlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKLQotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Ci0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0vKiBUYWJsZSBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCi1zdGF0aWMgY29uc3QgdUludCBib3JkZXJbXSA9IHsgLyogT3JkZXIgb2YgdGhlIGJpdCBsZW5ndGggY29kZSBsZW5ndGhzICovCi0gICAgICAgIDE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OwotCi0vKgotICAgTm90ZXMgYmV5b25kIHRoZSAxLjkzYSBhcHBub3RlLnR4dDoKLQotICAgMS4gRGlzdGFuY2UgcG9pbnRlcnMgbmV2ZXIgcG9pbnQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dAotICAgICAgc3RyZWFtLgotICAgMi4gRGlzdGFuY2UgcG9pbnRlcnMgY2FuIHBvaW50IGJhY2sgYWNyb3NzIGJsb2NrcywgdXAgdG8gMzJrIGF3YXkuCi0gICAzLiBUaGVyZSBpcyBhbiBpbXBsaWVkIG1heGltdW0gb2YgNyBiaXRzIGZvciB0aGUgYml0IGxlbmd0aCB0YWJsZSBhbmQKLSAgICAgIDE1IGJpdHMgZm9yIHRoZSBhY3R1YWwgZGF0YS4KLSAgIDQuIElmIG9ubHkgb25lIGNvZGUgZXhpc3RzLCB0aGVuIGl0IGlzIGVuY29kZWQgdXNpbmcgb25lIGJpdC4gIChaZXJvCi0gICAgICB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwgYnV0IHBlcmhhcHMgYSBsaXR0bGUgY29uZnVzaW5nLikgIElmIHR3bwotICAgICAgY29kZXMgZXhpc3QsIHRoZXkgYXJlIGNvZGVkIHVzaW5nIG9uZSBiaXQgZWFjaCAoMCBhbmQgMSkuCi0gICA1LiBUaGVyZSBpcyBubyB3YXkgb2Ygc2VuZGluZyB6ZXJvIGRpc3RhbmNlIGNvZGVzLS1hIGR1bW15IG11c3QgYmUKLSAgICAgIHNlbnQgaWYgdGhlcmUgYXJlIG5vbmUuICAoSGlzdG9yeTogYSBwcmUgMi4wIHZlcnNpb24gb2YgUEtaSVAgd291bGQKLSAgICAgIHN0b3JlIGJsb2NrcyB3aXRoIG5vIGRpc3RhbmNlIGNvZGVzLCBidXQgdGhpcyB3YXMgZGlzY292ZXJlZCB0byBiZQotICAgICAgdG9vIGhhcnNoIGEgY3JpdGVyaW9uLikgIFZhbGlkIG9ubHkgZm9yIDEuOTNhLiAgMi4wNGMgZG9lcyBhbGxvdwotICAgICAgemVybyBkaXN0YW5jZSBjb2Rlcywgd2hpY2ggaXMgc2VudCBhcyBvbmUgY29kZSBvZiB6ZXJvIGJpdHMgaW4KLSAgICAgIGxlbmd0aC4KLSAgIDYuIFRoZXJlIGFyZSB1cCB0byAyODYgbGl0ZXJhbC9sZW5ndGggY29kZXMuICBDb2RlIDI1NiByZXByZXNlbnRzIHRoZQotICAgICAgZW5kLW9mLWJsb2NrLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlIHN0YXRpYyBsZW5ndGggdHJlZSBkZWZpbmVzCi0gICAgICAyODggY29kZXMganVzdCB0byBmaWxsIG91dCB0aGUgSHVmZm1hbiBjb2Rlcy4gIENvZGVzIDI4NiBhbmQgMjg3Ci0gICAgICBjYW5ub3QgYmUgdXNlZCB0aG91Z2gsIHNpbmNlIHRoZXJlIGlzIG5vIGxlbmd0aCBiYXNlIG9yIGV4dHJhIGJpdHMKLSAgICAgIGRlZmluZWQgZm9yIHRoZW0uICBTaW1pbGFyaWx5LCB0aGVyZSBhcmUgdXAgdG8gMzAgZGlzdGFuY2UgY29kZXMuCi0gICAgICBIb3dldmVyLCBzdGF0aWMgdHJlZXMgZGVmaW5lIDMyIGNvZGVzIChhbGwgNSBiaXRzKSB0byBmaWxsIG91dCB0aGUKLSAgICAgIEh1ZmZtYW4gY29kZXMsIGJ1dCB0aGUgbGFzdCB0d28gaGFkIGJldHRlciBub3Qgc2hvdyB1cCBpbiB0aGUgZGF0YS4KLSAgIDcuIFVuemlwIGNhbiBjaGVjayBkeW5hbWljIEh1ZmZtYW4gYmxvY2tzIGZvciBjb21wbGV0ZSBjb2RlIHNldHMuCi0gICAgICBUaGUgZXhjZXB0aW9uIGlzIHRoYXQgYSBzaW5nbGUgY29kZSB3b3VsZCBub3QgYmUgY29tcGxldGUgKHNlZSAjNCkuCi0gICA4LiBUaGUgZml2ZSBiaXRzIGZvbGxvd2luZyB0aGUgYmxvY2sgdHlwZSBpcyByZWFsbHkgdGhlIG51bWJlciBvZgotICAgICAgbGl0ZXJhbCBjb2RlcyBzZW50IG1pbnVzIDI1Ny4KLSAgIDkuIExlbmd0aCBjb2RlcyA4LDE2LDE2IGFyZSBpbnRlcnByZXRlZCBhcyAxMyBsZW5ndGggY29kZXMgb2YgOCBiaXRzCi0gICAgICAoMSs2KzYpLiAgVGhlcmVmb3JlLCB0byBvdXRwdXQgdGhyZWUgdGltZXMgdGhlIGxlbmd0aCwgeW91IG91dHB1dAotICAgICAgdGhyZWUgY29kZXMgKDErMSsxKSwgd2hlcmVhcyB0byBvdXRwdXQgZm91ciB0aW1lcyB0aGUgc2FtZSBsZW5ndGgsCi0gICAgICB5b3Ugb25seSBuZWVkIHR3byBjb2RlcyAoMSszKS4gIEhtbS4KLSAgMTAuIEluIHRoZSB0cmVlIHJlY29uc3RydWN0aW9uIGFsZ29yaXRobSwgQ29kZSA9IENvZGUgKyBJbmNyZW1lbnQKLSAgICAgIG9ubHkgaWYgQml0TGVuZ3RoKGkpIGlzIG5vdCB6ZXJvLiAgKFByZXR0eSBvYnZpb3VzLikKLSAgMTEuIENvcnJlY3Rpb246IDQgQml0czogIyBvZiBCaXQgTGVuZ3RoIGNvZGVzIC0gNCAgICAgKDQgLSAxOSkKLSAgMTIuIE5vdGU6IGxlbmd0aCBjb2RlIDI4NCBjYW4gcmVwcmVzZW50IDIyNy0yNTgsIGJ1dCBsZW5ndGggY29kZSAyODUKLSAgICAgIHJlYWxseSBpcyAyNTguICBUaGUgbGFzdCBsZW5ndGggZGVzZXJ2ZXMgaXRzIG93biwgc2hvcnQgY29kZQotICAgICAgc2luY2UgaXQgZ2V0cyB1c2VkIGEgbG90IGluIHZlcnkgcmVkdW5kYW50IGZpbGVzLiAgVGhlIGxlbmd0aAotICAgICAgMjU4IGlzIHNwZWNpYWwgc2luY2UgMjU4IC0gMyAodGhlIG1pbiBtYXRjaCBsZW5ndGgpIGlzIDI1NS4KLSAgMTMuIFRoZSBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBiaXQgbGVuZ3RocyBhcmUgcmVhZCBhcyBhCi0gICAgICBzaW5nbGUgc3RyZWFtIG9mIGxlbmd0aHMuICBJdCBpcyBwb3NzaWJsZSAoYW5kIGFkdmFudGFnZW91cykgZm9yCi0gICAgICBhIHJlcGVhdCBjb2RlICgxNiwgMTcsIG9yIDE4KSB0byBnbyBhY3Jvc3MgdGhlIGJvdW5kYXJ5IGJldHdlZW4KLSAgICAgIHRoZSB0d28gc2V0cyBvZiBsZW5ndGhzLgotICovCi0KLQotdm9pZCB6bGliX2luZmxhdGVfYmxvY2tzX3Jlc2V0KAotCWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLQl6X3N0cmVhbXAgeiwKLQl1TG9uZyAqYwotKQotewotICBpZiAoYyAhPSBOVUxMKQotICAgICpjID0gcy0+Y2hlY2s7Ci0gIGlmIChzLT5tb2RlID09IENPREVTKQotICAgIHpsaWJfaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOwotICBzLT5tb2RlID0gVFlQRTsKLSAgcy0+Yml0ayA9IDA7Ci0gIHMtPmJpdGIgPSAwOwotICBzLT5yZWFkID0gcy0+d3JpdGUgPSBzLT53aW5kb3c7Ci0gIGlmIChzLT5jaGVja2ZuICE9IE5VTEwpCi0gICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikoMEwsIE5VTEwsIDApOwotfQotCi1pbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnpsaWJfaW5mbGF0ZV9ibG9ja3NfbmV3KAotCXpfc3RyZWFtcCB6LAotCWNoZWNrX2Z1bmMgYywKLQl1SW50IHcKLSkKLXsKLSAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzOwotCi0gIHMgPSAmV1MoeiktPndvcmtpbmdfYmxvY2tzX3N0YXRlOwotICBzLT5odWZ0cyA9IFdTKHopLT53b3JraW5nX2h1ZnRzOwotICBzLT53aW5kb3cgPSBXUyh6KS0+d29ya2luZ193aW5kb3c7Ci0gIHMtPmVuZCA9IHMtPndpbmRvdyArIHc7Ci0gIHMtPmNoZWNrZm4gPSBjOwotICBzLT5tb2RlID0gVFlQRTsKLSAgemxpYl9pbmZsYXRlX2Jsb2Nrc19yZXNldChzLCB6LCBOVUxMKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLQotaW50IHpsaWJfaW5mbGF0ZV9ibG9ja3MoCi0JaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotCXpfc3RyZWFtcCB6LAotCWludCByCi0pCi17Ci0gIHVJbnQgdDsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIEJ5dGUgKnA7ICAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KLSAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLwotICBCeXRlICpxOyAgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLwotCi0gIC8qIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKSAqLwotICBMT0FECi0KLSAgLyogcHJvY2VzcyBpbnB1dCBiYXNlZCBvbiBjdXJyZW50IHN0YXRlICovCi0gIHdoaWxlICgxKSBzd2l0Y2ggKHMtPm1vZGUpCi0gIHsKLSAgICBjYXNlIFRZUEU6Ci0gICAgICBORUVEQklUUygzKQotICAgICAgdCA9ICh1SW50KWIgJiA3OwotICAgICAgcy0+bGFzdCA9IHQgJiAxOwotICAgICAgc3dpdGNoICh0ID4+IDEpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkICovCi0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICB0ID0gayAmIDc7ICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgRFVNUEJJVFModCkKLSAgICAgICAgICBzLT5tb2RlID0gTEVOUzsgICAgICAgICAgICAgICAvKiBnZXQgbGVuZ3RoIG9mIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkICovCi0gICAgICAgICAgewotICAgICAgICAgICAgdUludCBibCwgYmQ7Ci0gICAgICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7Ci0KLSAgICAgICAgICAgIHpsaWJfaW5mbGF0ZV90cmVlc19maXhlZCgmYmwsICZiZCwgJnRsLCAmdGQsIHMtPmh1ZnRzLCB6KTsKLSAgICAgICAgICAgIHMtPnN1Yi5kZWNvZGUuY29kZXMgPSB6bGliX2luZmxhdGVfY29kZXNfbmV3KGJsLCBiZCwgdGwsIHRkLCB6KTsKLSAgICAgICAgICAgIGlmIChzLT5zdWIuZGVjb2RlLmNvZGVzID09IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHIgPSBaX01FTV9FUlJPUjsKLSAgICAgICAgICAgICAgTEVBVkUKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgRFVNUEJJVFMoMykKLSAgICAgICAgICBzLT5tb2RlID0gQ09ERVM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyAqLwotICAgICAgICAgIERVTVBCSVRTKDMpCi0gICAgICAgICAgcy0+bW9kZSA9IFRBQkxFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlsbGVnYWwgKi8KLSAgICAgICAgICBEVU1QQklUUygzKQotICAgICAgICAgIHMtPm1vZGUgPSBCX0JBRDsKLSAgICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgYmxvY2sgdHlwZSI7Ci0gICAgICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICBMRUFWRQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMRU5TOgotICAgICAgTkVFREJJVFMoMzIpCi0gICAgICBpZiAoKCgofmIpID4+IDE2KSAmIDB4ZmZmZikgIT0gKGIgJiAweGZmZmYpKQotICAgICAgewotICAgICAgICBzLT5tb2RlID0gQl9CQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7Ci0gICAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgIExFQVZFCi0gICAgICB9Ci0gICAgICBzLT5zdWIubGVmdCA9ICh1SW50KWIgJiAweGZmZmY7Ci0gICAgICBiID0gayA9IDA7ICAgICAgICAgICAgICAgICAgICAgIC8qIGR1bXAgYml0cyAqLwotICAgICAgcy0+bW9kZSA9IHMtPnN1Yi5sZWZ0ID8gU1RPUkVEIDogKHMtPmxhc3QgPyBEUlkgOiBUWVBFKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RPUkVEOgotICAgICAgaWYgKG4gPT0gMCkKLSAgICAgICAgTEVBVkUKLSAgICAgIE5FRURPVVQKLSAgICAgIHQgPSBzLT5zdWIubGVmdDsKLSAgICAgIGlmICh0ID4gbikgdCA9IG47Ci0gICAgICBpZiAodCA+IG0pIHQgPSBtOwotICAgICAgbWVtY3B5KHEsIHAsIHQpOwotICAgICAgcCArPSB0OyAgbiAtPSB0OwotICAgICAgcSArPSB0OyAgbSAtPSB0OwotICAgICAgaWYgKChzLT5zdWIubGVmdCAtPSB0KSAhPSAwKQotICAgICAgICBicmVhazsKLSAgICAgIHMtPm1vZGUgPSBzLT5sYXN0ID8gRFJZIDogVFlQRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEFCTEU6Ci0gICAgICBORUVEQklUUygxNCkKLSAgICAgIHMtPnN1Yi50cmVlcy50YWJsZSA9IHQgPSAodUludCliICYgMHgzZmZmOwotI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAotICAgICAgaWYgKCh0ICYgMHgxZikgPiAyOSB8fCAoKHQgPj4gNSkgJiAweDFmKSA+IDI5KQotICAgICAgewotICAgICAgICBzLT5tb2RlID0gQl9CQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikidG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMiOwotICAgICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgICBMRUFWRQotICAgICAgfQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAJcy0+c3ViLnRyZWVzLmJsZW5zID0gV1MoeiktPndvcmtpbmdfYmxlbnM7Ci0gICAgICB9Ci0gICAgICBEVU1QQklUUygxNCkKLSAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IDA7Ci0gICAgICBzLT5tb2RlID0gQlRSRUU7Ci0gICAgY2FzZSBCVFJFRToKLSAgICAgIHdoaWxlIChzLT5zdWIudHJlZXMuaW5kZXggPCA0ICsgKHMtPnN1Yi50cmVlcy50YWJsZSA+PiAxMCkpCi0gICAgICB7Ci0gICAgICAgIE5FRURCSVRTKDMpCi0gICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tib3JkZXJbcy0+c3ViLnRyZWVzLmluZGV4KytdXSA9ICh1SW50KWIgJiA3OwotICAgICAgICBEVU1QQklUUygzKQotICAgICAgfQotICAgICAgd2hpbGUgKHMtPnN1Yi50cmVlcy5pbmRleCA8IDE5KQotICAgICAgICBzLT5zdWIudHJlZXMuYmxlbnNbYm9yZGVyW3MtPnN1Yi50cmVlcy5pbmRleCsrXV0gPSAwOwotICAgICAgcy0+c3ViLnRyZWVzLmJiID0gNzsKLSAgICAgIHQgPSB6bGliX2luZmxhdGVfdHJlZXNfYml0cyhzLT5zdWIudHJlZXMuYmxlbnMsICZzLT5zdWIudHJlZXMuYmIsCi0JCQkJICAmcy0+c3ViLnRyZWVzLnRiLCBzLT5odWZ0cywgeik7Ci0gICAgICBpZiAodCAhPSBaX09LKQotICAgICAgewotICAgICAgICByID0gdDsKLSAgICAgICAgaWYgKHIgPT0gWl9EQVRBX0VSUk9SKQotICAgICAgICAgIHMtPm1vZGUgPSBCX0JBRDsKLSAgICAgICAgTEVBVkUKLSAgICAgIH0KLSAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IDA7Ci0gICAgICBzLT5tb2RlID0gRFRSRUU7Ci0gICAgY2FzZSBEVFJFRToKLSAgICAgIHdoaWxlICh0ID0gcy0+c3ViLnRyZWVzLnRhYmxlLAotICAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA8IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSkKLSAgICAgIHsKLSAgICAgICAgaW5mbGF0ZV9odWZ0ICpoOwotICAgICAgICB1SW50IGksIGosIGM7Ci0KLSAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy5iYjsKLSAgICAgICAgTkVFREJJVFModCkKLSAgICAgICAgaCA9IHMtPnN1Yi50cmVlcy50YiArICgodUludCliICYgemxpYl9pbmZsYXRlX21hc2tbdF0pOwotICAgICAgICB0ID0gaC0+Yml0czsKLSAgICAgICAgYyA9IGgtPmJhc2U7Ci0gICAgICAgIGlmIChjIDwgMTYpCi0gICAgICAgIHsKLSAgICAgICAgICBEVU1QQklUUyh0KQotICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tzLT5zdWIudHJlZXMuaW5kZXgrK10gPSBjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogYyA9PSAxNi4uMTggKi8KLSAgICAgICAgewotICAgICAgICAgIGkgPSBjID09IDE4ID8gNyA6IGMgLSAxNDsKLSAgICAgICAgICBqID0gYyA9PSAxOCA/IDExIDogMzsKLSAgICAgICAgICBORUVEQklUUyh0ICsgaSkKLSAgICAgICAgICBEVU1QQklUUyh0KQotICAgICAgICAgIGogKz0gKHVJbnQpYiAmIHpsaWJfaW5mbGF0ZV9tYXNrW2ldOwotICAgICAgICAgIERVTVBCSVRTKGkpCi0gICAgICAgICAgaSA9IHMtPnN1Yi50cmVlcy5pbmRleDsKLSAgICAgICAgICB0ID0gcy0+c3ViLnRyZWVzLnRhYmxlOwotICAgICAgICAgIGlmIChpICsgaiA+IDI1OCArICh0ICYgMHgxZikgKyAoKHQgPj4gNSkgJiAweDFmKSB8fAotICAgICAgICAgICAgICAoYyA9PSAxNiAmJiBpIDwgMSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcy0+bW9kZSA9IEJfQkFEOwotICAgICAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBMRUFWRQotICAgICAgICAgIH0KLSAgICAgICAgICBjID0gYyA9PSAxNiA/IHMtPnN1Yi50cmVlcy5ibGVuc1tpIC0gMV0gOiAwOwotICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIHMtPnN1Yi50cmVlcy5ibGVuc1tpKytdID0gYzsKLSAgICAgICAgICB9IHdoaWxlICgtLWopOwotICAgICAgICAgIHMtPnN1Yi50cmVlcy5pbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHMtPnN1Yi50cmVlcy50YiA9IE5VTEw7Ci0gICAgICB7Ci0gICAgICAgIHVJbnQgYmwsIGJkOwotICAgICAgICBpbmZsYXRlX2h1ZnQgKnRsLCAqdGQ7Ci0gICAgICAgIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotCi0gICAgICAgIGJsID0gOTsgICAgICAgICAvKiBtdXN0IGJlIDw9IDkgZm9yIGxvb2thaGVhZCBhc3N1bXB0aW9ucyAqLwotICAgICAgICBiZCA9IDY7ICAgICAgICAgLyogbXVzdCBiZSA8PSA5IGZvciBsb29rYWhlYWQgYXNzdW1wdGlvbnMgKi8KLSAgICAgICAgdCA9IHMtPnN1Yi50cmVlcy50YWJsZTsKLSAgICAgICAgdCA9IHpsaWJfaW5mbGF0ZV90cmVlc19keW5hbWljKDI1NyArICh0ICYgMHgxZiksIDEgKyAoKHQgPj4gNSkgJiAweDFmKSwKLQkJCQkgICAgICAgcy0+c3ViLnRyZWVzLmJsZW5zLCAmYmwsICZiZCwgJnRsLCAmdGQsCi0JCQkJICAgICAgIHMtPmh1ZnRzLCB6KTsKLSAgICAgICAgaWYgKHQgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGlmICh0ID09ICh1SW50KVpfREFUQV9FUlJPUikKLSAgICAgICAgICAgIHMtPm1vZGUgPSBCX0JBRDsKLSAgICAgICAgICByID0gdDsKLSAgICAgICAgICBMRUFWRQotICAgICAgICB9Ci0gICAgICAgIGlmICgoYyA9IHpsaWJfaW5mbGF0ZV9jb2Rlc19uZXcoYmwsIGJkLCB0bCwgdGQsIHopKSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgciA9IFpfTUVNX0VSUk9SOwotICAgICAgICAgIExFQVZFCi0gICAgICAgIH0KLSAgICAgICAgcy0+c3ViLmRlY29kZS5jb2RlcyA9IGM7Ci0gICAgICB9Ci0gICAgICBzLT5tb2RlID0gQ09ERVM7Ci0gICAgY2FzZSBDT0RFUzoKLSAgICAgIFVQREFURQotICAgICAgaWYgKChyID0gemxpYl9pbmZsYXRlX2NvZGVzKHMsIHosIHIpKSAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHJldHVybiB6bGliX2luZmxhdGVfZmx1c2gocywgeiwgcik7Ci0gICAgICByID0gWl9PSzsKLSAgICAgIHpsaWJfaW5mbGF0ZV9jb2Rlc19mcmVlKHMtPnN1Yi5kZWNvZGUuY29kZXMsIHopOwotICAgICAgTE9BRAotICAgICAgaWYgKCFzLT5sYXN0KQotICAgICAgewotICAgICAgICBzLT5tb2RlID0gVFlQRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzLT5tb2RlID0gRFJZOwotICAgIGNhc2UgRFJZOgotICAgICAgRkxVU0gKLSAgICAgIGlmIChzLT5yZWFkICE9IHMtPndyaXRlKQotICAgICAgICBMRUFWRQotICAgICAgcy0+bW9kZSA9IEJfRE9ORTsKLSAgICBjYXNlIEJfRE9ORToKLSAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgQl9CQUQ6Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgTEVBVkUKLSAgICBkZWZhdWx0OgotICAgICAgciA9IFpfU1RSRUFNX0VSUk9SOwotICAgICAgTEVBVkUKLSAgfQotfQotCi0KLWludCB6bGliX2luZmxhdGVfYmxvY2tzX2ZyZWUoCi0JaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotCXpfc3RyZWFtcCB6Ci0pCi17Ci0gIHpsaWJfaW5mbGF0ZV9ibG9ja3NfcmVzZXQocywgeiwgTlVMTCk7Ci0gIHJldHVybiBaX09LOwotfQotCi0KLSNpZiAwCi12b2lkIHpsaWJfaW5mbGF0ZV9zZXRfZGljdGlvbmFyeSgKLQlpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMsCi0JY29uc3QgQnl0ZSAqZCwKLQl1SW50ICBuCi0pCi17Ci0gIG1lbWNweShzLT53aW5kb3csIGQsIG4pOwotICBzLT5yZWFkID0gcy0+d3JpdGUgPSBzLT53aW5kb3cgKyBuOwotfQotI2VuZGlmICAvKiAgMCAgKi8KLQotCi0vKiBSZXR1cm5zIHRydWUgaWYgaW5mbGF0ZSBpcyBjdXJyZW50bHkgYXQgdGhlIGVuZCBvZiBhIGJsb2NrIGdlbmVyYXRlZAotICogYnkgWl9TWU5DX0ZMVVNIIG9yIFpfRlVMTF9GTFVTSC4gCi0gKiBJTiBhc3NlcnRpb246IHMgIT0gTlVMTAotICovCi0jaWYgMAotaW50IHpsaWJfaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCgKLQlpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMKLSkKLXsKLSAgcmV0dXJuIHMtPm1vZGUgPT0gTEVOUzsKLX0KLSNlbmRpZiAgLyogIDAgICovCmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmJsb2NrLmggYi9saWIvemxpYl9pbmZsYXRlL2luZmJsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWU2MGIuLjAwMDAwMDAKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZibG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyogaW5mYmxvY2suaCAtLSBoZWFkZXIgdG8gdXNlIGluZmJsb2NrLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLSNpZm5kZWYgX0lORkJMT0NLX0gKLSNkZWZpbmUgX0lORkJMT0NLX0gKLQotc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlOwotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmOwotCi1leHRlcm4gaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICogemxpYl9pbmZsYXRlX2Jsb2Nrc19uZXcgKAotICAgIHpfc3RyZWFtcCB6LAotICAgIGNoZWNrX2Z1bmMgYywgICAgICAgICAgICAgIC8qIGNoZWNrIGZ1bmN0aW9uICovCi0gICAgdUludCB3KTsgICAgICAgICAgICAgICAgICAgLyogd2luZG93IHNpemUgKi8KLQotZXh0ZXJuIGludCB6bGliX2luZmxhdGVfYmxvY2tzICgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgLAotICAgIGludCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWwgcmV0dXJuIGNvZGUgKi8KLQotZXh0ZXJuIHZvaWQgemxpYl9pbmZsYXRlX2Jsb2Nrc19yZXNldCAoCi0gICAgaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICosCi0gICAgel9zdHJlYW1wICwKLSAgICB1TG9uZyAqKTsgICAgICAgICAgICAgICAgICAvKiBjaGVjayB2YWx1ZSBvbiBvdXRwdXQgKi8KLQotZXh0ZXJuIGludCB6bGliX2luZmxhdGVfYmxvY2tzX2ZyZWUgKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCk7Ci0KLSNpZiAwCi1leHRlcm4gdm9pZCB6bGliX2luZmxhdGVfc2V0X2RpY3Rpb25hcnkgKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLSAgICBjb25zdCBCeXRlICpkLCAgLyogZGljdGlvbmFyeSAqLwotICAgIHVJbnQgIG4pOyAgICAgICAvKiBkaWN0aW9uYXJ5IGxlbmd0aCAqLwotI2VuZGlmICAvKiAgMCAgKi8KLQotI2lmIDAKLWV4dGVybiBpbnQgemxpYl9pbmZsYXRlX2Jsb2Nrc19zeW5jX3BvaW50ICgKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMpOwotI2VuZGlmICAvKiAgMCAgKi8KLQotI2VuZGlmIC8qIF9JTkZCTE9DS19IICovCmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmNvZGVzLmMgYi9saWIvemxpYl9pbmZsYXRlL2luZmNvZGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2Q3NTkuLjAwMDAwMDAKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZjb2Rlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qIGluZmNvZGVzLmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZjb2Rlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKLSNpbmNsdWRlICJpbmZmYXN0LmgiCi0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi1pbmZsYXRlX2NvZGVzX3N0YXRlZiAqemxpYl9pbmZsYXRlX2NvZGVzX25ldygKLQl1SW50IGJsLAotCXVJbnQgYmQsCi0JaW5mbGF0ZV9odWZ0ICp0bCwKLQlpbmZsYXRlX2h1ZnQgKnRkLCAvKiBuZWVkIHNlcGFyYXRlIGRlY2xhcmF0aW9uIGZvciBCb3JsYW5kIEMrKyAqLwotCXpfc3RyZWFtcCB6Ci0pCi17Ci0gIGluZmxhdGVfY29kZXNfc3RhdGVmICpjOwotCi0gIGMgPSAmV1MoeiktPndvcmtpbmdfc3RhdGU7Ci0gIHsKLSAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgYy0+bGJpdHMgPSAoQnl0ZSlibDsKLSAgICBjLT5kYml0cyA9IChCeXRlKWJkOwotICAgIGMtPmx0cmVlID0gdGw7Ci0gICAgYy0+ZHRyZWUgPSB0ZDsKLSAgfQotICByZXR1cm4gYzsKLX0KLQotCi1pbnQgemxpYl9pbmZsYXRlX2NvZGVzKAotCWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLQl6X3N0cmVhbXAgeiwKLQlpbnQgcgotKQotewotICB1SW50IGo7ICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgKi8KLSAgaW5mbGF0ZV9odWZ0ICp0OyAgICAgIC8qIHRlbXBvcmFyeSBwb2ludGVyICovCi0gIHVJbnQgZTsgICAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG9yIG9wZXJhdGlvbiAqLwotICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICB1SW50IGs7ICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIEJ5dGUgKnA7ICAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KLSAgdUludCBuOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIGF2YWlsYWJsZSB0aGVyZSAqLwotICBCeXRlICpxOyAgICAgICAgICAgICAgLyogb3V0cHV0IHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLwotICBCeXRlICpmOyAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBjb3B5IHN0cmluZ3MgZnJvbSAqLwotICBpbmZsYXRlX2NvZGVzX3N0YXRlZiAqYyA9IHMtPnN1Yi5kZWNvZGUuY29kZXM7ICAvKiBjb2RlcyBzdGF0ZSAqLwotCi0gIC8qIGNvcHkgaW5wdXQvb3V0cHV0IGluZm9ybWF0aW9uIHRvIGxvY2FscyAoVVBEQVRFIG1hY3JvIHJlc3RvcmVzKSAqLwotICBMT0FECi0KLSAgLyogcHJvY2VzcyBpbnB1dCBhbmQgb3V0cHV0IGJhc2VkIG9uIGN1cnJlbnQgc3RhdGUgKi8KLSAgd2hpbGUgKDEpIHN3aXRjaCAoYy0+bW9kZSkKLSAgeyAgICAgICAgICAgICAvKiB3YWl0aW5nIGZvciAiaToiPWlucHV0LCAibzoiPW91dHB1dCwgIng6Ij1ub3RoaW5nICovCi0gICAgY2FzZSBTVEFSVDogICAgICAgICAvKiB4OiBzZXQgdXAgZm9yIExFTiAqLwotI2lmbmRlZiBTTE9XCi0gICAgICBpZiAobSA+PSAyNTggJiYgbiA+PSAxMCkKLSAgICAgIHsKLSAgICAgICAgVVBEQVRFCi0gICAgICAgIHIgPSB6bGliX2luZmxhdGVfZmFzdChjLT5sYml0cywgYy0+ZGJpdHMsIGMtPmx0cmVlLCBjLT5kdHJlZSwgcywgeik7Ci0gICAgICAgIExPQUQKLSAgICAgICAgaWYgKHIgIT0gWl9PSykKLSAgICAgICAgewotICAgICAgICAgIGMtPm1vZGUgPSByID09IFpfU1RSRUFNX0VORCA/IFdBU0ggOiBCQURDT0RFOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0jZW5kaWYgLyogIVNMT1cgKi8KLSAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBjLT5sYml0czsKLSAgICAgIGMtPnN1Yi5jb2RlLnRyZWUgPSBjLT5sdHJlZTsKLSAgICAgIGMtPm1vZGUgPSBMRU47Ci0gICAgY2FzZSBMRU46ICAgICAgICAgICAvKiBpOiBnZXQgbGVuZ3RoL2xpdGVyYWwvZW9iIG5leHQgKi8KLSAgICAgIGogPSBjLT5zdWIuY29kZS5uZWVkOwotICAgICAgTkVFREJJVFMoaikKLSAgICAgIHQgPSBjLT5zdWIuY29kZS50cmVlICsgKCh1SW50KWIgJiB6bGliX2luZmxhdGVfbWFza1tqXSk7Ci0gICAgICBEVU1QQklUUyh0LT5iaXRzKQotICAgICAgZSA9ICh1SW50KSh0LT5leG9wKTsKLSAgICAgIGlmIChlID09IDApICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLwotICAgICAgewotICAgICAgICBjLT5zdWIubGl0ID0gdC0+YmFzZTsKLSAgICAgICAgYy0+bW9kZSA9IExJVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGxlbmd0aCAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29weS5nZXQgPSBlICYgMTU7Ci0gICAgICAgIGMtPmxlbiA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBMRU5FWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKChlICYgNjQpID09IDApICAgICAgICAvKiBuZXh0IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb2RlLm5lZWQgPSBlOwotICAgICAgICBjLT5zdWIuY29kZS50cmVlID0gdCArIHQtPmJhc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGUgJiAzMikgICAgICAgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KLSAgICAgIHsKLSAgICAgICAgYy0+bW9kZSA9IFdBU0g7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IEJBRENPREU7ICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgIHotPm1zZyA9IChjaGFyKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgTEVORVhUOiAgICAgICAgLyogaTogZ2V0dGluZyBsZW5ndGggZXh0cmEgKGhhdmUgYmFzZSkgKi8KLSAgICAgIGogPSBjLT5zdWIuY29weS5nZXQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgYy0+bGVuICs9ICh1SW50KWIgJiB6bGliX2luZmxhdGVfbWFza1tqXTsKLSAgICAgIERVTVBCSVRTKGopCi0gICAgICBjLT5zdWIuY29kZS5uZWVkID0gYy0+ZGJpdHM7Ci0gICAgICBjLT5zdWIuY29kZS50cmVlID0gYy0+ZHRyZWU7Ci0gICAgICBjLT5tb2RlID0gRElTVDsKLSAgICBjYXNlIERJU1Q6ICAgICAgICAgIC8qIGk6IGdldCBkaXN0YW5jZSBuZXh0ICovCi0gICAgICBqID0gYy0+c3ViLmNvZGUubmVlZDsKLSAgICAgIE5FRURCSVRTKGopCi0gICAgICB0ID0gYy0+c3ViLmNvZGUudHJlZSArICgodUludCliICYgemxpYl9pbmZsYXRlX21hc2tbal0pOwotICAgICAgRFVNUEJJVFModC0+Yml0cykKLSAgICAgIGUgPSAodUludCkodC0+ZXhvcCk7Ci0gICAgICBpZiAoZSAmIDE2KSAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlICovCi0gICAgICB7Ci0gICAgICAgIGMtPnN1Yi5jb3B5LmdldCA9IGUgJiAxNTsKLSAgICAgICAgYy0+c3ViLmNvcHkuZGlzdCA9IHQtPmJhc2U7Ci0gICAgICAgIGMtPm1vZGUgPSBESVNURVhUOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoZSAmIDY0KSA9PSAwKSAgICAgICAgLyogbmV4dCB0YWJsZSAqLwotICAgICAgewotICAgICAgICBjLT5zdWIuY29kZS5uZWVkID0gZTsKLSAgICAgICAgYy0+c3ViLmNvZGUudHJlZSA9IHQgKyB0LT5iYXNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGMtPm1vZGUgPSBCQURDT0RFOyAgICAgICAgLyogaW52YWxpZCBjb2RlICovCi0gICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgZGlzdGFuY2UgY29kZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgTEVBVkUKLSAgICBjYXNlIERJU1RFWFQ6ICAgICAgIC8qIGk6IGdldHRpbmcgZGlzdGFuY2UgZXh0cmEgKi8KLSAgICAgIGogPSBjLT5zdWIuY29weS5nZXQ7Ci0gICAgICBORUVEQklUUyhqKQotICAgICAgYy0+c3ViLmNvcHkuZGlzdCArPSAodUludCliICYgemxpYl9pbmZsYXRlX21hc2tbal07Ci0gICAgICBEVU1QQklUUyhqKQotICAgICAgYy0+bW9kZSA9IENPUFk7Ci0gICAgY2FzZSBDT1BZOiAgICAgICAgICAvKiBvOiBjb3B5aW5nIGJ5dGVzIGluIHdpbmRvdywgd2FpdGluZyBmb3Igc3BhY2UgKi8KLSAgICAgIGYgPSBxIC0gYy0+c3ViLmNvcHkuZGlzdDsKLSAgICAgIHdoaWxlIChmIDwgcy0+d2luZG93KSAgICAgICAgICAgICAvKiBtb2R1bG8gd2luZG93IHNpemUtIndoaWxlIiBpbnN0ZWFkICovCi0gICAgICAgIGYgKz0gcy0+ZW5kIC0gcy0+d2luZG93OyAgICAgICAgLyogb2YgImlmIiBoYW5kbGVzIGludmFsaWQgZGlzdGFuY2VzICovCi0gICAgICB3aGlsZSAoYy0+bGVuKQotICAgICAgewotICAgICAgICBORUVET1VUCi0gICAgICAgIE9VVEJZVEUoKmYrKykKLSAgICAgICAgaWYgKGYgPT0gcy0+ZW5kKQotICAgICAgICAgIGYgPSBzLT53aW5kb3c7Ci0gICAgICAgIGMtPmxlbi0tOwotICAgICAgfQotICAgICAgYy0+bW9kZSA9IFNUQVJUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBMSVQ6ICAgICAgICAgICAvKiBvOiBnb3QgbGl0ZXJhbCwgd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlICovCi0gICAgICBORUVET1VUCi0gICAgICBPVVRCWVRFKGMtPnN1Yi5saXQpCi0gICAgICBjLT5tb2RlID0gU1RBUlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdBU0g6ICAgICAgICAgIC8qIG86IGdvdCBlb2IsIHBvc3NpYmx5IG1vcmUgb3V0cHV0ICovCi0gICAgICBpZiAoayA+IDcpICAgICAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGUsIGlmIGFueSAqLwotICAgICAgewotICAgICAgICBrIC09IDg7Ci0gICAgICAgIG4rKzsKLSAgICAgICAgcC0tOyAgICAgICAgICAgIC8qIGNhbiBhbHdheXMgcmV0dXJuIG9uZSAqLwotICAgICAgfQotICAgICAgRkxVU0gKLSAgICAgIGlmIChzLT5yZWFkICE9IHMtPndyaXRlKQotICAgICAgICBMRUFWRQotICAgICAgYy0+bW9kZSA9IEVORDsKLSAgICBjYXNlIEVORDoKLSAgICAgIHIgPSBaX1NUUkVBTV9FTkQ7Ci0gICAgICBMRUFWRQotICAgIGNhc2UgQkFEQ09ERTogICAgICAgLyogeDogZ290IGVycm9yICovCi0gICAgICByID0gWl9EQVRBX0VSUk9SOwotICAgICAgTEVBVkUKLSAgICBkZWZhdWx0OgotICAgICAgciA9IFpfU1RSRUFNX0VSUk9SOwotICAgICAgTEVBVkUKLSAgfQotI2lmZGVmIE5FRURfRFVNTVlfUkVUVVJOCi0gIHJldHVybiBaX1NUUkVBTV9FUlJPUjsgIC8qIFNvbWUgZHVtYiBjb21waWxlcnMgY29tcGxhaW4gd2l0aG91dCB0aGlzICovCi0jZW5kaWYKLX0KLQotCi12b2lkIHpsaWJfaW5mbGF0ZV9jb2Rlc19mcmVlKAotCWluZmxhdGVfY29kZXNfc3RhdGVmICpjLAotCXpfc3RyZWFtcCB6Ci0pCi17Ci19CmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmNvZGVzLmggYi9saWIvemxpYl9pbmZsYXRlL2luZmNvZGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmY0MTcuLjAwMDAwMDAKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZjb2Rlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyogaW5mY29kZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZmNvZGVzLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLSNpZm5kZWYgX0lORkNPREVTX0gKLSNkZWZpbmUgX0lORkNPREVTX0gKLQotI2luY2x1ZGUgImluZmJsb2NrLmgiCi0KLXN0cnVjdCBpbmZsYXRlX2NvZGVzX3N0YXRlOwotdHlwZWRlZiBzdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSBpbmZsYXRlX2NvZGVzX3N0YXRlZjsKLQotZXh0ZXJuIGluZmxhdGVfY29kZXNfc3RhdGVmICp6bGliX2luZmxhdGVfY29kZXNfbmV3ICgKLSAgICB1SW50LCB1SW50LAotICAgIGluZmxhdGVfaHVmdCAqLCBpbmZsYXRlX2h1ZnQgKiwKLSAgICB6X3N0cmVhbXAgKTsKLQotZXh0ZXJuIGludCB6bGliX2luZmxhdGVfY29kZXMgKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCAsCi0gICAgaW50KTsKLQotZXh0ZXJuIHZvaWQgemxpYl9pbmZsYXRlX2NvZGVzX2ZyZWUgKAotICAgIGluZmxhdGVfY29kZXNfc3RhdGVmICosCi0gICAgel9zdHJlYW1wICk7Ci0KLSNlbmRpZiAvKiBfSU5GQ09ERVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmMgYi9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuYwppbmRleCAwYmQ3NjIzLi4wMmExNmVhIDEwMDY0NAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuYworKysgYi9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuYwpAQCAtMSwxNzYgKzEsMzEyIEBACi0vKiBpbmZmYXN0LmMgLS0gcHJvY2VzcyBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlIHBhaXJzIGZhc3QKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisvKiBpbmZmYXN0LmMgLS0gZmFzdCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKICNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgogI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mYmxvY2suaCIKLSNpbmNsdWRlICJpbmZjb2Rlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCiAjaW5jbHVkZSAiaW5mZmFzdC5oIgogCi1zdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZTsKKyNpZm5kZWYgQVNNSU5GCiAKLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cworLyogQWxsb3cgbWFjaGluZSBkZXBlbmRlbnQgb3B0aW1pemF0aW9uIGZvciBwb3N0LWluY3JlbWVudCBvciBwcmUtaW5jcmVtZW50LgorICAgQmFzZWQgb24gdGVzdGluZyB0byBkYXRlLAorICAgUHJlLWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgorICAgLSBQb3dlclBDIEczIChBZGxlcikKKyAgIC0gTUlQUyBSNTAwMCAoUmFuZGVycy1QZWhyc29uKQorICAgUG9zdC1pbmNyZW1lbnQgcHJlZmVycmVkIGZvcjoKKyAgIC0gbm9uZQorICAgTm8gbWVhc3VyYWJsZSBkaWZmZXJlbmNlOgorICAgLSBQZW50aXVtIElJSSAoQW5kZXJzb24pCisgICAtIE02ODA2MCAoTmlrbCkKKyAqLworI2lmZGVmIFBPU1RJTkMKKyMgIGRlZmluZSBPRkYgMAorIyAgZGVmaW5lIFBVUChhKSAqKGEpKysKKyNlbHNlCisjICBkZWZpbmUgT0ZGIDEKKyMgIGRlZmluZSBQVVAoYSkgKisrKGEpCisjZW5kaWYKIAotLyogbWFjcm9zIGZvciBiaXQgaW5wdXQgd2l0aCBubyBjaGVja2luZyBhbmQgZm9yIHJldHVybmluZyB1bnVzZWQgYnl0ZXMgKi8KLSNkZWZpbmUgR1JBQkJJVFMoaikge3doaWxlKGs8KGopKXtifD0oKHVMb25nKU5FWFRCWVRFKTw8aztrKz04O319Ci0jZGVmaW5lIFVOR1JBQiB7Yz16LT5hdmFpbF9pbi1uO2M9KGs+PjMpPGM/az4+MzpjO24rPWM7cC09YztrLT1jPDwzO30KKy8qCisgICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nCisgICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXMKKyAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yCisgICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlCisgICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS4KIAotLyogQ2FsbGVkIHdpdGggbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdG8gd3JpdGUgaW4gd2luZG93IGF0IGxlYXN0IDI1OAotICAgKHRoZSBtYXhpbXVtIHN0cmluZyBsZW5ndGgpIGFuZCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgYXZhaWxhYmxlCi0gICBhdCBsZWFzdCB0ZW4uICBUaGUgdGVuIGJ5dGVzIGFyZSBzaXggYnl0ZXMgZm9yIHRoZSBsb25nZXN0IGxlbmd0aC8KLSAgIGRpc3RhbmNlIHBhaXIgcGx1cyBmb3VyIGJ5dGVzIGZvciBvdmVybG9hZGluZyB0aGUgYml0IGJ1ZmZlci4gKi8KKyAgIEVudHJ5IGFzc3VtcHRpb25zOgogCi1pbnQgemxpYl9pbmZsYXRlX2Zhc3QoCi0JdUludCBibCwKLQl1SW50IGJkLAotCWluZmxhdGVfaHVmdCAqdGwsCi0JaW5mbGF0ZV9odWZ0ICp0ZCwgLyogbmVlZCBzZXBhcmF0ZSBkZWNsYXJhdGlvbiBmb3IgQm9ybGFuZCBDKysgKi8KLQlpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKnMsCi0Jel9zdHJlYW1wIHoKLSkKKyAgICAgICAgc3RhdGUtPm1vZGUgPT0gTEVOCisgICAgICAgIHN0cm0tPmF2YWlsX2luID49IDYKKyAgICAgICAgc3RybS0+YXZhaWxfb3V0ID49IDI1OAorICAgICAgICBzdGFydCA+PSBzdHJtLT5hdmFpbF9vdXQKKyAgICAgICAgc3RhdGUtPmJpdHMgPCA4CisKKyAgIE9uIHJldHVybiwgc3RhdGUtPm1vZGUgaXMgb25lIG9mOgorCisgICAgICAgIExFTiAtLSByYW4gb3V0IG9mIGVub3VnaCBvdXRwdXQgc3BhY2Ugb3IgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dAorICAgICAgICBUWVBFIC0tIHJlYWNoZWQgZW5kIG9mIGJsb2NrIGNvZGUsIGluZmxhdGUoKSB0byBpbnRlcnByZXQgbmV4dCBibG9jaworICAgICAgICBCQUQgLS0gZXJyb3IgaW4gYmxvY2sgZGF0YQorCisgICBOb3RlczoKKworICAgIC0gVGhlIG1heGltdW0gaW5wdXQgYml0cyB1c2VkIGJ5IGEgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgaXMgMTUgYml0cyBmb3IgdGhlCisgICAgICBsZW5ndGggY29kZSwgNSBiaXRzIGZvciB0aGUgbGVuZ3RoIGV4dHJhLCAxNSBiaXRzIGZvciB0aGUgZGlzdGFuY2UgY29kZSwKKyAgICAgIGFuZCAxMyBiaXRzIGZvciB0aGUgZGlzdGFuY2UgZXh0cmEuICBUaGlzIHRvdGFscyA0OCBiaXRzLCBvciBzaXggYnl0ZXMuCisgICAgICBUaGVyZWZvcmUgaWYgc3RybS0+YXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWQKKyAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuCisKKyAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNTgKKyAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKQorICAgICAgcmVxdWlyZXMgc3RybS0+YXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvcgorICAgICAgb3V0cHV0IHNwYWNlLgorICovCit2b2lkIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkKK3pfc3RyZWFtcCBzdHJtOwordW5zaWduZWQgc3RhcnQ7ICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLwogewotICBpbmZsYXRlX2h1ZnQgKnQ7ICAgICAgLyogdGVtcG9yYXJ5IHBvaW50ZXIgKi8KLSAgdUludCBlOyAgICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gIHVMb25nIGI7ICAgICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgQnl0ZSAqcDsgICAgICAgICAgICAgIC8qIGlucHV0IGRhdGEgcG9pbnRlciAqLwotICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gIEJ5dGUgKnE7ICAgICAgICAgICAgICAvKiBvdXRwdXQgd2luZG93IHdyaXRlIHBvaW50ZXIgKi8KLSAgdUludCBtOyAgICAgICAgICAgICAgIC8qIGJ5dGVzIHRvIGVuZCBvZiB3aW5kb3cgb3IgcmVhZCBwb2ludGVyICovCi0gIHVJbnQgbWw7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsaXRlcmFsL2xlbmd0aCB0cmVlICovCi0gIHVJbnQgbWQ7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBkaXN0YW5jZSB0cmVlICovCi0gIHVJbnQgYzsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBjb3B5ICovCi0gIHVJbnQgZDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgZnJvbSAqLwotICBCeXRlICpyOyAgICAgICAgICAgICAgLyogY29weSBzb3VyY2UgcG9pbnRlciAqLworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjaGFyICppbjsgICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X2luICovCisgICAgdW5zaWduZWQgY2hhciAqbGFzdDsgICAgLyogd2hpbGUgaW4gPCBsYXN0LCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciAqZW5kOyAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovCisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovCisjZW5kaWYKKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmhvbGQgKi8KKyAgICB1bnNpZ25lZCBiaXRzOyAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS0+Yml0cyAqLworICAgIGNvZGUgY29uc3QgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KKyAgICBjb2RlIGNvbnN0ICpkY29kZTsgICAgICAvKiBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLworICAgIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi8KKyAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgb3A7ICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggZnJvbSAqLwogCi0gIC8qIGxvYWQgaW5wdXQsIG91dHB1dCwgYml0IHZhbHVlcyAqLwotICBMT0FECisgICAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKKyAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKKyAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKKyAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOworICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgZG1heCA9IHN0YXRlLT5kbWF4OworI2VuZGlmCisgICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7CisgICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7CisgICAgd3JpdGUgPSBzdGF0ZS0+d3JpdGU7CisgICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKKyAgICBob2xkID0gc3RhdGUtPmhvbGQ7CisgICAgYml0cyA9IHN0YXRlLT5iaXRzOworICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7CisgICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7CisgICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKKyAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKIAotICAvKiBpbml0aWFsaXplIG1hc2tzICovCi0gIG1sID0gemxpYl9pbmZsYXRlX21hc2tbYmxdOwotICBtZCA9IHpsaWJfaW5mbGF0ZV9tYXNrW2JkXTsKLQotICAvKiBkbyB1bnRpbCBub3QgZW5vdWdoIGlucHV0IG9yIG91dHB1dCBzcGFjZSBmb3IgZmFzdCBsb29wICovCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtZSBjYWxsZWQgd2l0aCBtID49IDI1OCAmJiBuID49IDEwICovCi0gICAgLyogZ2V0IGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBHUkFCQklUUygyMCkgICAgICAgICAgICAgICAgLyogbWF4IGJpdHMgZm9yIGxpdGVyYWwvbGVuZ3RoIGNvZGUgKi8KLSAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1SW50KWIgJiBtbCkpLT5leG9wKSA9PSAwKQotICAgIHsKLSAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICAqcSsrID0gKEJ5dGUpdC0+YmFzZTsKLSAgICAgIG0tLTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2gKKyAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLwogICAgIGRvIHsKLSAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICBpZiAoZSAmIDE2KQotICAgICAgewotICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyBmb3IgbGVuZ3RoICovCi0gICAgICAgIGUgJj0gMTU7Ci0gICAgICAgIGMgPSB0LT5iYXNlICsgKCh1SW50KWIgJiB6bGliX2luZmxhdGVfbWFza1tlXSk7Ci0gICAgICAgIERVTVBCSVRTKGUpCi0KLSAgICAgICAgLyogZGVjb2RlIGRpc3RhbmNlIGJhc2Ugb2YgYmxvY2sgdG8gY29weSAqLwotICAgICAgICBHUkFCQklUUygxNSk7ICAgICAgICAgICAvKiBtYXggYml0cyBmb3IgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICBlID0gKHQgPSB0ZCArICgodUludCliICYgbWQpKS0+ZXhvcDsKLSAgICAgICAgZG8gewotICAgICAgICAgIERVTVBCSVRTKHQtPmJpdHMpCi0gICAgICAgICAgaWYgKGUgJiAxNikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBnZXQgZXh0cmEgYml0cyB0byBhZGQgdG8gZGlzdGFuY2UgYmFzZSAqLwotICAgICAgICAgICAgZSAmPSAxNTsKLSAgICAgICAgICAgIEdSQUJCSVRTKGUpICAgICAgICAgLyogZ2V0IGV4dHJhIGJpdHMgKHVwIHRvIDEzKSAqLwotICAgICAgICAgICAgZCA9IHQtPmJhc2UgKyAoKHVJbnQpYiAmIHpsaWJfaW5mbGF0ZV9tYXNrW2VdKTsKLSAgICAgICAgICAgIERVTVBCSVRTKGUpCi0KLSAgICAgICAgICAgIC8qIGRvIHRoZSBjb3B5ICovCi0gICAgICAgICAgICBtIC09IGM7Ci0gICAgICAgICAgICByID0gcSAtIGQ7Ci0gICAgICAgICAgICBpZiAociA8IHMtPndpbmRvdykgICAgICAgICAgICAgICAgICAvKiB3cmFwIGlmIG5lZWRlZCAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgciArPSBzLT5lbmQgLSBzLT53aW5kb3c7ICAgICAgICAvKiBmb3JjZSBwb2ludGVyIGluIHdpbmRvdyAqLwotICAgICAgICAgICAgICB9IHdoaWxlIChyIDwgcy0+d2luZG93KTsgICAgICAgICAgLyogY292ZXJzIGludmFsaWQgZGlzdGFuY2VzICovCi0gICAgICAgICAgICAgIGUgPSBzLT5lbmQgLSByOwotICAgICAgICAgICAgICBpZiAoYyA+IGUpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjIC09IGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdyYXBwZWQgY29weSAqLwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1lKTsKLSAgICAgICAgICAgICAgICByID0gcy0+d2luZG93OwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsIGNvcHkgKi8KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOwotICAgICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOwotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgKnErKyA9ICpyKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1jKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9ybWFsIGNvcHkgKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgKnErKyA9ICpyKys7ICBjLS07Ci0gICAgICAgICAgICAgICpxKysgPSAqcisrOyAgYy0tOwotICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgKnErKyA9ICpyKys7Ci0gICAgICAgICAgICAgIH0gd2hpbGUgKC0tYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoKGUgJiA2NCkgPT0gMCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0ICs9IHQtPmJhc2U7Ci0gICAgICAgICAgICBlID0gKHQgKz0gKCh1SW50KWIgJiB6bGliX2luZmxhdGVfbWFza1tlXSkpLT5leG9wOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgVU5HUkFCCi0gICAgICAgICAgICBVUERBVEUKLSAgICAgICAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoKGUgJiA2NCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgdCArPSB0LT5iYXNlOwotICAgICAgICBpZiAoKGUgPSAodCArPSAoKHVJbnQpYiAmIHpsaWJfaW5mbGF0ZV9tYXNrW2VdKSktPmV4b3ApID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICBEVU1QQklUUyh0LT5iaXRzKQotICAgICAgICAgICpxKysgPSAoQnl0ZSl0LT5iYXNlOwotICAgICAgICAgIG0tLTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGUgJiAzMikKLSAgICAgIHsKLSAgICAgICAgVU5HUkFCCi0gICAgICAgIFVQREFURQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRU5EOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICAgIFVOR1JBQgotICAgICAgICBVUERBVEUKLSAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICAgIH0KLSAgICB9IHdoaWxlICgxKTsKLSAgfSB3aGlsZSAobSA+PSAyNTggJiYgbiA+PSAxMCk7CisgICAgICAgIHRoaXMgPSBsY29kZVtob2xkICYgbG1hc2tdOworICAgICAgZG9sZW46CisgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLmJpdHMpOworICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMub3ApOworICAgICAgICBpZiAob3AgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGl0ZXJhbCAqLworICAgICAgICAgICAgUFVQKG91dCkgPSAodW5zaWduZWQgY2hhcikodGhpcy52YWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqLworICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKSh0aGlzLnZhbCk7CisgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgaWYgKG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbiArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMgPSBkY29kZVtob2xkICYgZG1hc2tdOworICAgICAgICAgIGRvZGlzdDoKKyAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLmJpdHMpOworICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICBiaXRzIC09IG9wOworICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMub3ApOworICAgICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqLworICAgICAgICAgICAgICAgIGRpc3QgPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkgeworICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKFBVUChpbikpIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdCArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IGRtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkob3V0IC0gYmVnKTsgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA+IG9wKSB7ICAgICAgICAgICAgICAgIC8qIHNlZSBpZiBjb3B5IGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgIG9wID0gZGlzdCAtIG9wOyAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcm9tID0gd2luZG93IC0gT0ZGOworICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGUgPT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdyaXRlIDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgb3AgLT0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlIDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wID0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovCisgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuID4gMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgICAgIHRoaXMgPSBkY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgICAgIGdvdG8gZG9kaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgIGdvdG8gZG9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqLworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOwogCi0gIC8qIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0LS1yZXN0b3JlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSAgVU5HUkFCCi0gIFVQREFURQotICByZXR1cm4gWl9PSzsKKyAgICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi8KKyAgICBsZW4gPSBiaXRzID4+IDM7CisgICAgaW4gLT0gbGVuOworICAgIGJpdHMgLT0gbGVuIDw8IDM7CisgICAgaG9sZCAmPSAoMVUgPDwgYml0cykgLSAxOworCisgICAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXR1cm4gKi8KKyAgICBzdHJtLT5uZXh0X2luID0gaW4gKyBPRkY7CisgICAgc3RybS0+bmV4dF9vdXQgPSBvdXQgKyBPRkY7CisgICAgc3RybS0+YXZhaWxfaW4gPSAodW5zaWduZWQpKGluIDwgbGFzdCA/IDUgKyAobGFzdCAtIGluKSA6IDUgLSAoaW4gLSBsYXN0KSk7CisgICAgc3RybS0+YXZhaWxfb3V0ID0gKHVuc2lnbmVkKShvdXQgPCBlbmQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU3ICsgKGVuZCAtIG91dCkgOiAyNTcgLSAob3V0IC0gZW5kKSk7CisgICAgc3RhdGUtPmhvbGQgPSBob2xkOworICAgIHN0YXRlLT5iaXRzID0gYml0czsKKyAgICByZXR1cm47CiB9CisKKy8qCisgICBpbmZsYXRlX2Zhc3QoKSBzcGVlZHVwcyB0aGF0IHR1cm5lZCBvdXQgc2xvd2VyIChvbiBhIFBvd2VyUEMgRzMgNzUwQ1hlKToKKyAgIC0gVXNpbmcgYml0IGZpZWxkcyBmb3IgY29kZSBzdHJ1Y3R1cmUKKyAgIC0gRGlmZmVyZW50IG9wIGRlZmluaXRpb24gdG8gYXZvaWQgJiBmb3IgZXh0cmEgYml0cyAoZG8gJiBmb3IgdGFibGUgYml0cykKKyAgIC0gVGhyZWUgc2VwYXJhdGUgZGVjb2RpbmcgZG8tbG9vcHMgZm9yIGRpcmVjdCwgd2luZG93LCBhbmQgd3JpdGUgPT0gMAorICAgLSBTcGVjaWFsIGNhc2UgZm9yIGRpc3RhbmNlID4gMSBjb3BpZXMgdG8gZG8gb3ZlcmxhcHBlZCBsb2FkIGFuZCBzdG9yZSBjb3B5CisgICAtIEV4cGxpY2l0IGJyYW5jaCBwcmVkaWN0aW9ucyAoYmFzZWQgb24gbWVhc3VyZWQgYnJhbmNoIHByb2JhYmlsaXRpZXMpCisgICAtIERlZmVycmluZyBtYXRjaCBjb3B5IGFuZCBpbnRlcnNwZXJzZWQgaXQgd2l0aCBkZWNvZGluZyBzdWJzZXF1ZW50IGNvZGVzCisgICAtIFN3YXBwaW5nIGxpdGVyYWwvbGVuZ3RoIGVsc2UKKyAgIC0gU3dhcHBpbmcgd2luZG93L2RpcmVjdCBlbHNlCisgICAtIExhcmdlciB1bnJvbGxlZCBjb3B5IGxvb3BzICh0aHJlZSBpcyBhYm91dCByaWdodCkKKyAgIC0gTW92aW5nIGxlbiAtPSAzIHN0YXRlbWVudCBpbnRvIG1pZGRsZSBvZiBsb29wCisgKi8KKworI2VuZGlmIC8qICFBU01JTkYgKi8KZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mZmFzdC5oIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmgKaW5kZXggZmM3MjBmMC4uNDAzMTVkOSAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmgKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmgKQEAgLTEsNiArMSw2IEBACiAvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMyBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCiAgKi8KIAogLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKQEAgLTgsMTAgKzgsNCBAQAogICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgogICovCiAKLWV4dGVybiBpbnQgemxpYl9pbmZsYXRlX2Zhc3QgKAotICAgIHVJbnQsCi0gICAgdUludCwKLSAgICBpbmZsYXRlX2h1ZnQgKiwKLSAgICBpbmZsYXRlX2h1ZnQgKiwKLSAgICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgKiwKLSAgICB6X3N0cmVhbXAgKTsKK3ZvaWQgaW5mbGF0ZV9mYXN0ICh6X3N0cmVhbXAgc3RybSwgdW5zaWduZWQgc3RhcnQpOwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZmaXhlZC5oIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZmaXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvemxpYl9pbmZsYXRlL2luZmZpeGVkLmgKQEAgLTAsMCArMSw5NCBAQAorICAgIC8qIGluZmZpeGVkLmggLS0gdGFibGUgZm9yIGRlY29kaW5nIGZpeGVkIGNvZGVzCisgICAgICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgbWFrZWZpeGVkKCkuCisgICAgICovCisKKyAgICAvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdAorICAgICAgIGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZAorICAgICAgIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAgICAgKi8KKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGxlbmZpeFs1MTJdID0geworICAgICAgICB7OTYsNywwfSx7MCw4LDgwfSx7MCw4LDE2fSx7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sCisgICAgICAgIHswLDksMTkyfSx7MTYsNywxMH0sezAsOCw5Nn0sezAsOCwzMn0sezAsOSwxNjB9LHswLDgsMH0sezAsOCwxMjh9LAorICAgICAgICB7MCw4LDY0fSx7MCw5LDIyNH0sezE2LDcsNn0sezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDR9LHsxOSw3LDU5fSwKKyAgICAgICAgezAsOCwxMjB9LHswLDgsNTZ9LHswLDksMjA4fSx7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc2fSwKKyAgICAgICAgezAsOCw4fSx7MCw4LDEzNn0sezAsOCw3Mn0sezAsOSwyNDB9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LAorICAgICAgICB7MjEsOCwyMjd9LHsxOSw3LDQzfSx7MCw4LDExNn0sezAsOCw1Mn0sezAsOSwyMDB9LHsxNyw3LDEzfSx7MCw4LDEwMH0sCisgICAgICAgIHswLDgsMzZ9LHswLDksMTY4fSx7MCw4LDR9LHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzMn0sezE2LDcsOH0sCisgICAgICAgIHswLDgsOTJ9LHswLDgsMjh9LHswLDksMTUyfSx7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE2fSwKKyAgICAgICAgezE4LDcsMjN9LHswLDgsMTA4fSx7MCw4LDQ0fSx7MCw5LDE4NH0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LAorICAgICAgICB7MCw5LDI0OH0sezE2LDcsM30sezAsOCw4Mn0sezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LAorICAgICAgICB7MCw4LDUwfSx7MCw5LDE5Nn0sezE3LDcsMTF9LHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY0fSx7MCw4LDJ9LAorICAgICAgICB7MCw4LDEzMH0sezAsOCw2Nn0sezAsOSwyMjh9LHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ4fSwKKyAgICAgICAgezIwLDcsNjd9LHswLDgsMTIyfSx7MCw4LDU4fSx7MCw5LDIxMn0sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSwKKyAgICAgICAgezAsOSwxODB9LHswLDgsMTB9LHswLDgsMTM4fSx7MCw4LDc0fSx7MCw5LDI0NH0sezE2LDcsNX0sezAsOCw4Nn0sCisgICAgICAgIHswLDgsMjJ9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDR9LHsxNyw3LDE1fSwKKyAgICAgICAgezAsOCwxMDJ9LHswLDgsMzh9LHswLDksMTcyfSx7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzNn0sCisgICAgICAgIHsxNiw3LDl9LHswLDgsOTR9LHswLDgsMzB9LHswLDksMTU2fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LAorICAgICAgICB7MCw5LDIyMH0sezE4LDcsMjd9LHswLDgsMTEwfSx7MCw4LDQ2fSx7MCw5LDE4OH0sezAsOCwxNH0sezAsOCwxNDJ9LAorICAgICAgICB7MCw4LDc4fSx7MCw5LDI1Mn0sezk2LDcsMH0sezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sCisgICAgICAgIHswLDgsMTEzfSx7MCw4LDQ5fSx7MCw5LDE5NH0sezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYyfSwKKyAgICAgICAgezAsOCwxfSx7MCw4LDEyOX0sezAsOCw2NX0sezAsOSwyMjZ9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LAorICAgICAgICB7MCw5LDE0Nn0sezE5LDcsNTl9LHswLDgsMTIxfSx7MCw4LDU3fSx7MCw5LDIxMH0sezE3LDcsMTd9LHswLDgsMTA1fSwKKyAgICAgICAgezAsOCw0MX0sezAsOSwxNzh9LHswLDgsOX0sezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQyfSx7MTYsNyw0fSwKKyAgICAgICAgezAsOCw4NX0sezAsOCwyMX0sezE2LDgsMjU4fSx7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAyfSwKKyAgICAgICAgezE3LDcsMTN9LHswLDgsMTAxfSx7MCw4LDM3fSx7MCw5LDE3MH0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sCisgICAgICAgIHswLDksMjM0fSx7MTYsNyw4fSx7MCw4LDkzfSx7MCw4LDI5fSx7MCw5LDE1NH0sezIwLDcsODN9LHswLDgsMTI1fSwKKyAgICAgICAgezAsOCw2MX0sezAsOSwyMTh9LHsxOCw3LDIzfSx7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODZ9LHswLDgsMTN9LAorICAgICAgICB7MCw4LDE0MX0sezAsOCw3N30sezAsOSwyNTB9LHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sCisgICAgICAgIHsxOSw3LDM1fSx7MCw4LDExNX0sezAsOCw1MX0sezAsOSwxOTh9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSwKKyAgICAgICAgezAsOSwxNjZ9LHswLDgsM30sezAsOCwxMzF9LHswLDgsNjd9LHswLDksMjMwfSx7MTYsNyw3fSx7MCw4LDkxfSwKKyAgICAgICAgezAsOCwyN30sezAsOSwxNTB9LHsyMCw3LDY3fSx7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTR9LHsxOCw3LDE5fSwKKyAgICAgICAgezAsOCwxMDd9LHswLDgsNDN9LHswLDksMTgyfSx7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDZ9LAorICAgICAgICB7MTYsNyw1fSx7MCw4LDg3fSx7MCw4LDIzfSx7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LAorICAgICAgICB7MCw5LDIwNn0sezE3LDcsMTV9LHswLDgsMTAzfSx7MCw4LDM5fSx7MCw5LDE3NH0sezAsOCw3fSx7MCw4LDEzNX0sCisgICAgICAgIHswLDgsNzF9LHswLDksMjM4fSx7MTYsNyw5fSx7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OH0sezIwLDcsOTl9LAorICAgICAgICB7MCw4LDEyN30sezAsOCw2M30sezAsOSwyMjJ9LHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTB9LAorICAgICAgICB7MCw4LDE1fSx7MCw4LDE0M30sezAsOCw3OX0sezAsOSwyNTR9LHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LAorICAgICAgICB7MjAsOCwxMTV9LHsxOCw3LDMxfSx7MCw4LDExMn0sezAsOCw0OH0sezAsOSwxOTN9LHsxNiw3LDEwfSx7MCw4LDk2fSwKKyAgICAgICAgezAsOCwzMn0sezAsOSwxNjF9LHswLDgsMH0sezAsOCwxMjh9LHswLDgsNjR9LHswLDksMjI1fSx7MTYsNyw2fSwKKyAgICAgICAgezAsOCw4OH0sezAsOCwyNH0sezAsOSwxNDV9LHsxOSw3LDU5fSx7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDl9LAorICAgICAgICB7MTcsNywxN30sezAsOCwxMDR9LHswLDgsNDB9LHswLDksMTc3fSx7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSwKKyAgICAgICAgezAsOSwyNDF9LHsxNiw3LDR9LHswLDgsODR9LHswLDgsMjB9LHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSwKKyAgICAgICAgezAsOCw1Mn0sezAsOSwyMDF9LHsxNyw3LDEzfSx7MCw4LDEwMH0sezAsOCwzNn0sezAsOSwxNjl9LHswLDgsNH0sCisgICAgICAgIHswLDgsMTMyfSx7MCw4LDY4fSx7MCw5LDIzM30sezE2LDcsOH0sezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTN9LAorICAgICAgICB7MjAsNyw4M30sezAsOCwxMjR9LHswLDgsNjB9LHswLDksMjE3fSx7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LAorICAgICAgICB7MCw5LDE4NX0sezAsOCwxMn0sezAsOCwxNDB9LHswLDgsNzZ9LHswLDksMjQ5fSx7MTYsNywzfSx7MCw4LDgyfSwKKyAgICAgICAgezAsOCwxOH0sezIxLDgsMTYzfSx7MTksNywzNX0sezAsOCwxMTR9LHswLDgsNTB9LHswLDksMTk3fSx7MTcsNywxMX0sCisgICAgICAgIHswLDgsOTh9LHswLDgsMzR9LHswLDksMTY1fSx7MCw4LDJ9LHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOX0sCisgICAgICAgIHsxNiw3LDd9LHswLDgsOTB9LHswLDgsMjZ9LHswLDksMTQ5fSx7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LAorICAgICAgICB7MCw5LDIxM30sezE4LDcsMTl9LHswLDgsMTA2fSx7MCw4LDQyfSx7MCw5LDE4MX0sezAsOCwxMH0sezAsOCwxMzh9LAorICAgICAgICB7MCw4LDc0fSx7MCw5LDI0NX0sezE2LDcsNX0sezAsOCw4Nn0sezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LAorICAgICAgICB7MCw4LDExOH0sezAsOCw1NH0sezAsOSwyMDV9LHsxNyw3LDE1fSx7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzN9LAorICAgICAgICB7MCw4LDZ9LHswLDgsMTM0fSx7MCw4LDcwfSx7MCw5LDIzN30sezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sCisgICAgICAgIHswLDksMTU3fSx7MjAsNyw5OX0sezAsOCwxMjZ9LHswLDgsNjJ9LHswLDksMjIxfSx7MTgsNywyN30sezAsOCwxMTB9LAorICAgICAgICB7MCw4LDQ2fSx7MCw5LDE4OX0sezAsOCwxNH0sezAsOCwxNDJ9LHswLDgsNzh9LHswLDksMjUzfSx7OTYsNywwfSwKKyAgICAgICAgezAsOCw4MX0sezAsOCwxN30sezIxLDgsMTMxfSx7MTgsNywzMX0sezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk1fSwKKyAgICAgICAgezE2LDcsMTB9LHswLDgsOTd9LHswLDgsMzN9LHswLDksMTYzfSx7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSwKKyAgICAgICAgezAsOSwyMjd9LHsxNiw3LDZ9LHswLDgsODl9LHswLDgsMjV9LHswLDksMTQ3fSx7MTksNyw1OX0sezAsOCwxMjF9LAorICAgICAgICB7MCw4LDU3fSx7MCw5LDIxMX0sezE3LDcsMTd9LHswLDgsMTA1fSx7MCw4LDQxfSx7MCw5LDE3OX0sezAsOCw5fSwKKyAgICAgICAgezAsOCwxMzd9LHswLDgsNzN9LHswLDksMjQzfSx7MTYsNyw0fSx7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LAorICAgICAgICB7MTksNyw0M30sezAsOCwxMTd9LHswLDgsNTN9LHswLDksMjAzfSx7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LAorICAgICAgICB7MCw5LDE3MX0sezAsOCw1fSx7MCw4LDEzM30sezAsOCw2OX0sezAsOSwyMzV9LHsxNiw3LDh9LHswLDgsOTN9LAorICAgICAgICB7MCw4LDI5fSx7MCw5LDE1NX0sezIwLDcsODN9LHswLDgsMTI1fSx7MCw4LDYxfSx7MCw5LDIxOX0sezE4LDcsMjN9LAorICAgICAgICB7MCw4LDEwOX0sezAsOCw0NX0sezAsOSwxODd9LHswLDgsMTN9LHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MX0sCisgICAgICAgIHsxNiw3LDN9LHswLDgsODN9LHswLDgsMTl9LHsyMSw4LDE5NX0sezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSwKKyAgICAgICAgezAsOSwxOTl9LHsxNyw3LDExfSx7MCw4LDk5fSx7MCw4LDM1fSx7MCw5LDE2N30sezAsOCwzfSx7MCw4LDEzMX0sCisgICAgICAgIHswLDgsNjd9LHswLDksMjMxfSx7MTYsNyw3fSx7MCw4LDkxfSx7MCw4LDI3fSx7MCw5LDE1MX0sezIwLDcsNjd9LAorICAgICAgICB7MCw4LDEyM30sezAsOCw1OX0sezAsOSwyMTV9LHsxOCw3LDE5fSx7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODN9LAorICAgICAgICB7MCw4LDExfSx7MCw4LDEzOX0sezAsOCw3NX0sezAsOSwyNDd9LHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LAorICAgICAgICB7NjQsOCwwfSx7MTksNyw1MX0sezAsOCwxMTl9LHswLDgsNTV9LHswLDksMjA3fSx7MTcsNywxNX0sezAsOCwxMDN9LAorICAgICAgICB7MCw4LDM5fSx7MCw5LDE3NX0sezAsOCw3fSx7MCw4LDEzNX0sezAsOCw3MX0sezAsOSwyMzl9LHsxNiw3LDl9LAorICAgICAgICB7MCw4LDk1fSx7MCw4LDMxfSx7MCw5LDE1OX0sezIwLDcsOTl9LHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyM30sCisgICAgICAgIHsxOCw3LDI3fSx7MCw4LDExMX0sezAsOCw0N30sezAsOSwxOTF9LHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSwKKyAgICAgICAgezAsOSwyNTV9CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbMzJdID0geworICAgICAgICB7MTYsNSwxfSx7MjMsNSwyNTd9LHsxOSw1LDE3fSx7MjcsNSw0MDk3fSx7MTcsNSw1fSx7MjUsNSwxMDI1fSwKKyAgICAgICAgezIxLDUsNjV9LHsyOSw1LDE2Mzg1fSx7MTYsNSwzfSx7MjQsNSw1MTN9LHsyMCw1LDMzfSx7MjgsNSw4MTkzfSwKKyAgICAgICAgezE4LDUsOX0sezI2LDUsMjA0OX0sezIyLDUsMTI5fSx7NjQsNSwwfSx7MTYsNSwyfSx7MjMsNSwzODV9LAorICAgICAgICB7MTksNSwyNX0sezI3LDUsNjE0NX0sezE3LDUsN30sezI1LDUsMTUzN30sezIxLDUsOTd9LHsyOSw1LDI0NTc3fSwKKyAgICAgICAgezE2LDUsNH0sezI0LDUsNzY5fSx7MjAsNSw0OX0sezI4LDUsMTIyODl9LHsxOCw1LDEzfSx7MjYsNSwzMDczfSwKKyAgICAgICAgezIyLDUsMTkzfSx7NjQsNSwwfQorICAgIH07CmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmxhdGUuYyBiL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5jCmluZGV4IDMxYjllOTAuLjdmOTIyZGMgMTAwNjQ0Ci0tLSBhL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5jCisrKyBiL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5jCkBAIC0xLDg5ICsxLDE0OCBAQAotLyogaW5mbGF0ZS5jIC0tIHpsaWIgaW50ZXJmYWNlIHRvIGluZmxhdGUgbW9kdWxlcwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKy8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqCisgKiBCYXNlZCBvbiB6bGliIDEuMi4zIGJ1dCBtb2RpZmllZCBmb3IgdGhlIExpbnV4IEtlcm5lbCBieQorICogUmljaGFyZCBQdXJkaWUgPHJpY2hhcmRAb3BlbmVkaGFuZC5jb20+CisgKgorICogQ2hhbmdlcyBtYWlubHkgZm9yIHN0YXRpYyBpbnN0ZWFkIG9mIGR5bmFtaWMgbWVtb3J5IGFsbG9jYXRpb24KKyAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3p1dGlsLmg+Ci0jaW5jbHVkZSAiaW5mYmxvY2suaCIKKyNpbmNsdWRlICJpbmZ0cmVlcy5oIgorI2luY2x1ZGUgImluZmxhdGUuaCIKKyNpbmNsdWRlICJpbmZmYXN0LmgiCiAjaW5jbHVkZSAiaW5mdXRpbC5oIgogCiBpbnQgemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUodm9pZCkKIHsKLSAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV93b3Jrc3BhY2UpOworICAgIHJldHVybiBzaXplb2Yoc3RydWN0IGluZmxhdGVfd29ya3NwYWNlKTsKK30KKworaW50IHpsaWJfaW5mbGF0ZVJlc2V0KHpfc3RyZWFtcCBzdHJtKQoreworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOworICAgIHN0cm0tPm1zZyA9IE5VTEw7CisgICAgc3RybS0+YWRsZXIgPSAxOyAgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqLworICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKKyAgICBzdGF0ZS0+bGFzdCA9IDA7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKKyAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKKyAgICBzdGF0ZS0+aG9sZCA9IDA7CisgICAgc3RhdGUtPmJpdHMgPSAwOworICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisKKyAgICAvKiBJbml0aWFsaXNlIFdpbmRvdyAqLworICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisKKyAgICByZXR1cm4gWl9PSzsKK30KKworI2lmIDAKK2ludCB6bGliX2luZmxhdGVQcmltZSh6X3N0cmVhbXAgc3RybSwgaW50IGJpdHMsIGludCB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIGlmIChiaXRzID4gMTYgfHwgc3RhdGUtPmJpdHMgKyBiaXRzID4gMzIpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB2YWx1ZSAmPSAoMUwgPDwgYml0cykgLSAxOworICAgIHN0YXRlLT5ob2xkICs9IHZhbHVlIDw8IHN0YXRlLT5iaXRzOworICAgIHN0YXRlLT5iaXRzICs9IGJpdHM7CisgICAgcmV0dXJuIFpfT0s7Cit9CisjZW5kaWYKKworaW50IHpsaWJfaW5mbGF0ZUluaXQyKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cykKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisKKyAgICBzdGF0ZSA9ICZXUyhzdHJtKS0+aW5mbGF0ZV9zdGF0ZTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgKilzdGF0ZTsKKworICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeworICAgICAgICBzdGF0ZS0+d3JhcCA9IDA7CisgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRlLT53cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOworICAgIH0KKyAgICBpZiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndpbmRvdyA9ICZXUyhzdHJtKS0+d29ya2luZ193aW5kb3dbMF07CisKKyAgICByZXR1cm4gemxpYl9pbmZsYXRlUmVzZXQoc3RybSk7Cit9CisKKy8qCisgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCisgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgVGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCisgKi8KK3N0YXRpYyB2b2lkIHpsaWJfZml4ZWR0YWJsZXMoc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlKQoreworIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKIH0KIAogCi1pbnQgemxpYl9pbmZsYXRlUmVzZXQoCi0Jel9zdHJlYW1wIHoKLSkKKy8qCisgICBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlCisgICByZXR1cm5pbmcuIFRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbgorICAgb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXMgaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZQorICAgc3RyZWFtIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldC4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gd2luZG93IGRpY3Rpb25hcnkgZGF0YQorICAgd2hlbiBhIGRpY3Rpb25hcnkgaXMgbG9hZGVkLgorCisgICBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkCisgICBhZHZhbnRhZ2UsIHNpbmNlIG9ubHkgdGhlIGxhc3QgMzJLIG9mIG91dHB1dCBpcyBjb3BpZWQgdG8gdGhlIHNsaWRpbmcgd2luZG93CisgICB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZgorICAgb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLgorICAgVGhlIGFkdmFudGFnZSBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzb3IncyBkYXRhIGNhY2hlcy4KKyAqLworc3RhdGljIHZvaWQgemxpYl91cGRhdGV3aW5kb3coel9zdHJlYW1wIHN0cm0sIHVuc2lnbmVkIG91dCkKIHsKLSAgaWYgKHogPT0gTlVMTCB8fCB6LT5zdGF0ZSA9PSBOVUxMIHx8IHotPndvcmtzcGFjZSA9PSBOVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgei0+dG90YWxfaW4gPSB6LT50b3RhbF9vdXQgPSAwOwotICB6LT5tc2cgPSBOVUxMOwotICB6LT5zdGF0ZS0+bW9kZSA9IHotPnN0YXRlLT5ub3dyYXAgPyBCTE9DS1MgOiBNRVRIT0Q7Ci0gIHpsaWJfaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgTlVMTCk7Ci0gIHJldHVybiBaX09LOwotfQorICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKyAgICB1bnNpZ25lZCBjb3B5LCBkaXN0OwogCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgKilzdHJtLT5zdGF0ZTsKIAotaW50IHpsaWJfaW5mbGF0ZUVuZCgKLQl6X3N0cmVhbXAgegotKQotewotICBpZiAoeiA9PSBOVUxMIHx8IHotPnN0YXRlID09IE5VTEwgfHwgei0+d29ya3NwYWNlID09IE5VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICBpZiAoei0+c3RhdGUtPmJsb2NrcyAhPSBOVUxMKQotICAgIHpsaWJfaW5mbGF0ZV9ibG9ja3NfZnJlZSh6LT5zdGF0ZS0+YmxvY2tzLCB6KTsKLSAgei0+c3RhdGUgPSBOVUxMOwotICByZXR1cm4gWl9PSzsKLX0KLQotCi1pbnQgemxpYl9pbmZsYXRlSW5pdDJfKAotCXpfc3RyZWFtcCB6LAotCWludCB3LAotCWNvbnN0IGNoYXIgKnZlcnNpb24sCi0JaW50IHN0cmVhbV9zaXplCi0pCi17Ci0gIGlmICh2ZXJzaW9uID09IE5VTEwgfHwgdmVyc2lvblswXSAhPSBaTElCX1ZFUlNJT05bMF0gfHwKLSAgICAgIHN0cmVhbV9zaXplICE9IHNpemVvZih6X3N0cmVhbSkgfHwgei0+d29ya3NwYWNlID09IE5VTEwpCi0gICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotCi0gIC8qIGluaXRpYWxpemUgc3RhdGUgKi8KLSAgei0+bXNnID0gTlVMTDsKLSAgei0+c3RhdGUgPSAmV1MoeiktPmludGVybmFsX3N0YXRlOwotICB6LT5zdGF0ZS0+YmxvY2tzID0gTlVMTDsKLQotICAvKiBoYW5kbGUgdW5kb2N1bWVudGVkIG5vd3JhcCBvcHRpb24gKG5vIHpsaWIgaGVhZGVyIG9yIGNoZWNrKSAqLwotICB6LT5zdGF0ZS0+bm93cmFwID0gMDsKLSAgaWYgKHcgPCAwKQotICB7Ci0gICAgdyA9IC0gdzsKLSAgICB6LT5zdGF0ZS0+bm93cmFwID0gMTsKLSAgfQotCi0gIC8qIHNldCB3aW5kb3cgc2l6ZSAqLwotICBpZiAodyA8IDggfHwgdyA+IDE1KQotICB7Ci0gICAgemxpYl9pbmZsYXRlRW5kKHopOwotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgfQotICB6LT5zdGF0ZS0+d2JpdHMgPSAodUludCl3OwotCi0gIC8qIGNyZWF0ZSBpbmZsYXRlX2Jsb2NrcyBzdGF0ZSAqLwotICBpZiAoKHotPnN0YXRlLT5ibG9ja3MgPQotICAgICAgemxpYl9pbmZsYXRlX2Jsb2Nrc19uZXcoeiwgei0+c3RhdGUtPm5vd3JhcCA/IE5VTEwgOiB6bGliX2FkbGVyMzIsICh1SW50KTEgPDwgdykpCi0gICAgICA9PSBOVUxMKQotICB7Ci0gICAgemxpYl9pbmZsYXRlRW5kKHopOwotICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgfQotCi0gIC8qIHJlc2V0IHN0YXRlICovCi0gIHpsaWJfaW5mbGF0ZVJlc2V0KHopOwotICByZXR1cm4gWl9PSzsKKyAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KKyAgICBjb3B5ID0gb3V0IC0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChjb3B5ID49IHN0YXRlLT53c2l6ZSkgeworICAgICAgICBtZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBzdGF0ZS0+d3NpemUsIHN0YXRlLT53c2l6ZSk7CisgICAgICAgIHN0YXRlLT53cml0ZSA9IDA7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGRpc3QgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+d3JpdGU7CisgICAgICAgIGlmIChkaXN0ID4gY29weSkgZGlzdCA9IGNvcHk7CisgICAgICAgIG1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPndyaXRlLCBzdHJtLT5uZXh0X291dCAtIGNvcHksIGRpc3QpOworICAgICAgICBjb3B5IC09IGRpc3Q7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBtZW1jcHkoc3RhdGUtPndpbmRvdywgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBjb3B5KTsKKyAgICAgICAgICAgIHN0YXRlLT53cml0ZSA9IGNvcHk7CisgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdGF0ZS0+d3JpdGUgKz0gZGlzdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JpdGUgPT0gc3RhdGUtPndzaXplKSBzdGF0ZS0+d3JpdGUgPSAwOworICAgICAgICAgICAgaWYgKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndoYXZlICs9IGRpc3Q7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIApAQCAtOTEsMTU3ICsxNTAsNzY0IEBACiAgKiBBdCB0aGUgZW5kIG9mIGEgRGVmbGF0ZS1jb21wcmVzc2VkIFBQUCBwYWNrZXQsIHdlIGV4cGVjdCB0byBoYXZlIHNlZW4KICAqIGEgYHN0b3JlZCcgYmxvY2sgdHlwZSB2YWx1ZSBidXQgbm90IHRoZSAoemVybykgbGVuZ3RoIGJ5dGVzLgogICovCi1zdGF0aWMgaW50IHpsaWJfaW5mbGF0ZV9wYWNrZXRfZmx1c2goaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzKQorLyoKKyAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5CisgICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAorICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKKyAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCisgICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCisgICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KKyAqLworc3RhdGljIGludCB6bGliX2luZmxhdGVTeW5jUGFja2V0KHpfc3RyZWFtcCBzdHJtKQogewotICAgIGlmIChzLT5tb2RlICE9IExFTlMpCi0JcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICBzLT5tb2RlID0gVFlQRTsKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworCisgICAgaWYgKHN0YXRlLT5tb2RlID09IFNUT1JFRCAmJiBzdGF0ZS0+Yml0cyA9PSAwKSB7CisJc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICByZXR1cm4gWl9PSzsKKyAgICB9CisgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKK30KKworLyogTWFjcm9zIGZvciBpbmZsYXRlKCk6ICovCisKKy8qIGNoZWNrIGZ1bmN0aW9uIHRvIHVzZSBhZGxlcjMyKCkgZm9yIHpsaWIgb3IgY3JjMzIoKSBmb3IgZ3ppcCAqLworI2RlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSB6bGliX2FkbGVyMzIoY2hlY2ssIGJ1ZiwgbGVuKQorCisvKiBMb2FkIHJlZ2lzdGVycyB3aXRoIHN0YXRlIGluIGluZmxhdGUoKSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgTE9BRCgpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgcHV0ID0gc3RybS0+bmV4dF9vdXQ7IFwKKyAgICAgICAgbGVmdCA9IHN0cm0tPmF2YWlsX291dDsgXAorICAgICAgICBuZXh0ID0gc3RybS0+bmV4dF9pbjsgXAorICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfaW47IFwKKyAgICAgICAgaG9sZCA9IHN0YXRlLT5ob2xkOyBcCisgICAgICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlc3RvcmUgc3RhdGUgZnJvbSByZWdpc3RlcnMgaW4gaW5mbGF0ZSgpICovCisjZGVmaW5lIFJFU1RPUkUoKSBcCisgICAgZG8geyBcCisgICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKKyAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKKyAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCisgICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAorICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIElOSVRCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID0gMDsgXAorICAgICAgICBiaXRzID0gMDsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEdldCBhIGJ5dGUgb2YgaW5wdXQgaW50byB0aGUgYml0IGFjY3VtdWxhdG9yLCBvciByZXR1cm4gZnJvbSBpbmZsYXRlKCkKKyAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgUFVMTEJZVEUoKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChoYXZlID09IDApIGdvdG8gaW5mX2xlYXZlOyBcCisgICAgICAgIGhhdmUtLTsgXAorICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqbmV4dCsrKSA8PCBiaXRzOyBcCisgICAgICAgIGJpdHMgKz0gODsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIEFzc3VyZSB0aGF0IHRoZXJlIGFyZSBhdCBsZWFzdCBuIGJpdHMgaW4gdGhlIGJpdCBhY2N1bXVsYXRvci4gIElmIHRoZXJlIGlzCisgICBub3QgZW5vdWdoIGF2YWlsYWJsZSBpbnB1dCB0byBkbyB0aGF0LCB0aGVuIHJldHVybiBmcm9tIGluZmxhdGUoKS4gKi8KKyNkZWZpbmUgTkVFREJJVFMobikgXAorICAgIGRvIHsgXAorICAgICAgICB3aGlsZSAoYml0cyA8ICh1bnNpZ25lZCkobikpIFwKKyAgICAgICAgICAgIFBVTExCWVRFKCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXR1cm4gdGhlIGxvdyBuIGJpdHMgb2YgdGhlIGJpdCBhY2N1bXVsYXRvciAobiA8IDE2KSAqLworI2RlZmluZSBCSVRTKG4pIFwKKyAgICAoKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IChuKSkgLSAxKSkKKworLyogUmVtb3ZlIG4gYml0cyBmcm9tIHRoZSBiaXQgYWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgRFJPUEJJVFMobikgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSAobik7IFwKKyAgICAgICAgYml0cyAtPSAodW5zaWduZWQpKG4pOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmVtb3ZlIHplcm8gdG8gc2V2ZW4gYml0cyBhcyBuZWVkZWQgdG8gZ28gdG8gYSBieXRlIGJvdW5kYXJ5ICovCisjZGVmaW5lIEJZVEVCSVRTKCkgXAorICAgIGRvIHsgXAorICAgICAgICBob2xkID4+PSBiaXRzICYgNzsgXAorICAgICAgICBiaXRzIC09IGJpdHMgJiA3OyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV2ZXJzZSB0aGUgYnl0ZXMgaW4gYSAzMi1iaXQgdmFsdWUgKi8KKyNkZWZpbmUgUkVWRVJTRShxKSBcCisgICAgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAorICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKKworLyoKKyAgIGluZmxhdGUoKSB1c2VzIGEgc3RhdGUgbWFjaGluZSB0byBwcm9jZXNzIGFzIG11Y2ggaW5wdXQgZGF0YSBhbmQgZ2VuZXJhdGUgYXMKKyAgIG11Y2ggb3V0cHV0IGRhdGEgYXMgcG9zc2libGUgYmVmb3JlIHJldHVybmluZy4gIFRoZSBzdGF0ZSBtYWNoaW5lIGlzCisgICBzdHJ1Y3R1cmVkIHJvdWdobHkgYXMgZm9sbG93czoKKworICAgIGZvciAoOzspIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAuLi4KKyAgICBjYXNlIFNUQVRFbjoKKyAgICAgICAgaWYgKG5vdCBlbm91Z2ggaW5wdXQgZGF0YSBvciBvdXRwdXQgc3BhY2UgdG8gbWFrZSBwcm9ncmVzcykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLi4uIG1ha2UgcHJvZ3Jlc3MgLi4uCisgICAgICAgIHN0YXRlID0gU1RBVEVtOworICAgICAgICBicmVhazsKKyAgICAuLi4KKyAgICB9CisKKyAgIHNvIHdoZW4gaW5mbGF0ZSgpIGlzIGNhbGxlZCBhZ2FpbiwgdGhlIHNhbWUgY2FzZSBpcyBhdHRlbXB0ZWQgYWdhaW4sIGFuZAorICAgaWYgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlcyBhcmUgcHJvdmlkZWQsIHRoZSBtYWNoaW5lIHByb2NlZWRzIHRvIHRoZQorICAgbmV4dCBzdGF0ZS4gIFRoZSBORUVEQklUUygpIG1hY3JvIGlzIHVzdWFsbHkgdGhlIHdheSB0aGUgc3RhdGUgZXZhbHVhdGVzCisgICB3aGV0aGVyIGl0IGNhbiBwcm9jZWVkIG9yIHNob3VsZCByZXR1cm4uICBORUVEQklUUygpIGRvZXMgdGhlIHJldHVybiBpZgorICAgdGhlIHJlcXVlc3RlZCBiaXRzIGFyZSBub3QgYXZhaWxhYmxlLiAgVGhlIHR5cGljYWwgdXNlIG9mIHRoZSBCSVRTIG1hY3JvcworICAgaXM6CisKKyAgICAgICAgTkVFREJJVFMobik7CisgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCBCSVRTKG4pIC4uLgorICAgICAgICBEUk9QQklUUyhuKTsKKworICAgd2hlcmUgTkVFREJJVFMobikgZWl0aGVyIHJldHVybnMgZnJvbSBpbmZsYXRlKCkgaWYgdGhlcmUgaXNuJ3QgZW5vdWdoCisgICBpbnB1dCBsZWZ0IHRvIGxvYWQgbiBiaXRzIGludG8gdGhlIGFjY3VtdWxhdG9yLCBvciBpdCBjb250aW51ZXMuICBCSVRTKG4pCisgICBnaXZlcyB0aGUgbG93IG4gYml0cyBpbiB0aGUgYWNjdW11bGF0b3IuICBXaGVuIGRvbmUsIERST1BCSVRTKG4pIGRyb3BzCisgICB0aGUgbG93IG4gYml0cyBvZmYgdGhlIGFjY3VtdWxhdG9yLiAgSU5JVEJJVFMoKSBjbGVhcnMgdGhlIGFjY3VtdWxhdG9yCisgICBhbmQgc2V0cyB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBiaXRzIHRvIHplcm8uICBCWVRFQklUUygpIGRpc2NhcmRzIGp1c3QKKyAgIGVub3VnaCBiaXRzIHRvIHB1dCB0aGUgYWNjdW11bGF0b3Igb24gYSBieXRlIGJvdW5kYXJ5LiAgQWZ0ZXIgQllURUJJVFMoKQorICAgYW5kIGEgTkVFREJJVFMoOCksIHRoZW4gQklUUyg4KSB3b3VsZCByZXR1cm4gdGhlIG5leHQgYnl0ZSBpbiB0aGUgc3RyZWFtLgorCisgICBORUVEQklUUyhuKSB1c2VzIFBVTExCWVRFKCkgdG8gZ2V0IGFuIGF2YWlsYWJsZSBieXRlIG9mIGlucHV0LCBvciB0byByZXR1cm4KKyAgIGlmIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZS4gIFRoZSBkZWNvZGluZyBvZiB2YXJpYWJsZSBsZW5ndGggY29kZXMgdXNlcworICAgUFVMTEJZVEUoKSBkaXJlY3RseSBpbiBvcmRlciB0byBwdWxsIGp1c3QgZW5vdWdoIGJ5dGVzIHRvIGRlY29kZSB0aGUgbmV4dAorICAgY29kZSwgYW5kIG5vIG1vcmUuCisKKyAgIFNvbWUgc3RhdGVzIGxvb3AgdW50aWwgdGhleSBnZXQgZW5vdWdoIGlucHV0LCBtYWtpbmcgc3VyZSB0aGF0IGVub3VnaAorICAgc3RhdGUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCB0byBjb250aW51ZSB0aGUgbG9vcCB3aGVyZSBpdCBsZWZ0IG9mZgorICAgaWYgTkVFREJJVFMoKSByZXR1cm5zIGluIHRoZSBsb29wLiAgRm9yIGV4YW1wbGUsIHdhbnQsIG5lZWQsIGFuZCBrZWVwCisgICB3b3VsZCBhbGwgaGF2ZSB0byBhY3R1YWxseSBiZSBwYXJ0IG9mIHRoZSBzYXZlZCBzdGF0ZSBpbiBjYXNlIE5FRURCSVRTKCkKKyAgIHJldHVybnM6CisKKyAgICBjYXNlIFNUQVRFdzoKKyAgICAgICAgd2hpbGUgKHdhbnQgPCBuZWVkKSB7CisgICAgICAgICAgICBORUVEQklUUyhuKTsKKyAgICAgICAgICAgIGtlZXBbd2FudCsrXSA9IEJJVFMobik7CisgICAgICAgICAgICBEUk9QQklUUyhuKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFNUQVRFeDsKKyAgICBjYXNlIFNUQVRFeDoKKworICAgQXMgc2hvd24gYWJvdmUsIGlmIHRoZSBuZXh0IHN0YXRlIGlzIGFsc28gdGhlIG5leHQgY2FzZSwgdGhlbiB0aGUgYnJlYWsKKyAgIGlzIG9taXR0ZWQuCisKKyAgIEEgc3RhdGUgbWF5IGFsc28gcmV0dXJuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggb3V0cHV0IHNwYWNlIGF2YWlsYWJsZSB0bworICAgY29tcGxldGUgdGhhdCBzdGF0ZS4gIFRob3NlIHN0YXRlcyBhcmUgY29weWluZyBzdG9yZWQgZGF0YSwgd3JpdGluZyBhCisgICBsaXRlcmFsIGJ5dGUsIGFuZCBjb3B5aW5nIGEgbWF0Y2hpbmcgc3RyaW5nLgorCisgICBXaGVuIHJldHVybmluZywgYSAiZ290byBpbmZfbGVhdmUiIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSB0b3RhbCBjb3VudGVycywKKyAgIHVwZGF0ZSB0aGUgY2hlY2sgdmFsdWUsIGFuZCBkZXRlcm1pbmUgd2hldGhlciBhbnkgcHJvZ3Jlc3MgaGFzIGJlZW4gbWFkZQorICAgZHVyaW5nIHRoYXQgaW5mbGF0ZSgpIGNhbGwgaW4gb3JkZXIgdG8gcmV0dXJuIHRoZSBwcm9wZXIgcmV0dXJuIGNvZGUuCisgICBQcm9ncmVzcyBpcyBkZWZpbmVkIGFzIGEgY2hhbmdlIGluIGVpdGhlciBzdHJtLT5hdmFpbF9pbiBvciBzdHJtLT5hdmFpbF9vdXQuCisgICBXaGVuIHRoZXJlIGlzIGEgd2luZG93LCBnb3RvIGluZl9sZWF2ZSB3aWxsIHVwZGF0ZSB0aGUgd2luZG93IHdpdGggdGhlIGxhc3QKKyAgIG91dHB1dCB3cml0dGVuLiAgSWYgYSBnb3RvIGluZl9sZWF2ZSBvY2N1cnMgaW4gdGhlIG1pZGRsZSBvZiBkZWNvbXByZXNzaW9uCisgICBhbmQgdGhlcmUgaXMgbm8gd2luZG93IGN1cnJlbnRseSwgZ290byBpbmZfbGVhdmUgd2lsbCBjcmVhdGUgb25lIGFuZCBjb3B5CisgICBvdXRwdXQgdG8gdGhlIHdpbmRvdyBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCisKKyAgIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHRoZSBmbHVzaCBwYXJhbWV0ZXIgb2YgaW5mbGF0ZSgpIG9ubHkgYWZmZWN0cyB0aGUKKyAgIHJldHVybiBjb2RlIChwZXIgemxpYi5oKS4gIGluZmxhdGUoKSBhbHdheXMgd3JpdGVzIGFzIG11Y2ggYXMgcG9zc2libGUgdG8KKyAgIHN0cm0tPm5leHRfb3V0LCBnaXZlbiB0aGUgc3BhY2UgYXZhaWxhYmxlIGFuZCB0aGUgcHJvdmlkZWQgaW5wdXQtLXRoZSBlZmZlY3QKKyAgIGRvY3VtZW50ZWQgaW4gemxpYi5oIG9mIFpfU1lOQ19GTFVTSC4gIEZ1cnRoZXJtb3JlLCBpbmZsYXRlKCkgYWx3YXlzIGRlZmVycworICAgdGhlIGFsbG9jYXRpb24gb2YgYW5kIGNvcHlpbmcgaW50byBhIHNsaWRpbmcgd2luZG93IHVudGlsIG5lY2Vzc2FyeSwgd2hpY2gKKyAgIHByb3ZpZGVzIHRoZSBlZmZlY3QgZG9jdW1lbnRlZCBpbiB6bGliLmggZm9yIFpfRklOSVNIIHdoZW4gdGhlIGVudGlyZSBpbnB1dAorICAgc3RyZWFtIGF2YWlsYWJsZS4gIFNvIHRoZSBvbmx5IHRoaW5nIHRoZSBmbHVzaCBwYXJhbWV0ZXIgYWN0dWFsbHkgZG9lcyBpczoKKyAgIHdoZW4gZmx1c2ggaXMgc2V0IHRvIFpfRklOSVNILCBpbmZsYXRlKCkgY2Fubm90IHJldHVybiBaX09LLiAgSW5zdGVhZCBpdAorICAgd2lsbCByZXR1cm4gWl9CVUZfRVJST1IgaWYgaXQgaGFzIG5vdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KKyAqLworCitpbnQgemxpYl9pbmZsYXRlKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlOworICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLworICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGluLCBvdXQ7ICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZyb207ICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovCisgICAgY29kZSBsYXN0OyAgICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YWJsZSBlbnRyeSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG9yZGVyWzE5XSA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqLworICAgICAgICB7MTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CisKKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwgfHwgc3RybS0+bmV4dF9vdXQgPT0gTlVMTCB8fAorICAgICAgICAoc3RybS0+bmV4dF9pbiA9PSBOVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQorICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworCisgICAgaWYgKHN0YXRlLT5tb2RlID09IFRZUEUpIHN0YXRlLT5tb2RlID0gVFlQRURPOyAgICAgIC8qIHNraXAgY2hlY2sgKi8KKyAgICBMT0FEKCk7CisgICAgaW4gPSBoYXZlOworICAgIG91dCA9IGxlZnQ7CisgICAgcmV0ID0gWl9PSzsKKyAgICBmb3IgKDs7KQorICAgICAgICBzd2l0Y2ggKHN0YXRlLT5tb2RlKSB7CisgICAgICAgIGNhc2UgSEVBRDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFRE87CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBORUVEQklUUygxNik7CisgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgKChCSVRTKDgpIDw8IDgpICsgKGhvbGQgPj4gOCkpICUgMzEpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbmNvcnJlY3QgaGVhZGVyIGNoZWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChCSVRTKDQpICE9IFpfREVGTEFURUQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyAgICAgICAgICAgIGxlbiA9IEJJVFMoNCkgKyA4OworICAgICAgICAgICAgaWYgKGxlbiA+IHN0YXRlLT53Yml0cykgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgd2luZG93IHNpemUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRtYXggPSAxVSA8PCBsZW47CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IHpsaWJfYWRsZXIzMigwTCwgTlVMTCwgMCk7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRElDVElEOgorICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBSRVZFUlNFKGhvbGQpOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElDVDsKKyAgICAgICAgY2FzZSBESUNUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlZGljdCA9PSAwKSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gemxpYl9hZGxlcjMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgY2FzZSBUWVBFOgorICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfQkxPQ0spIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIFRZUEVETzoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGFzdCkgeworICAgICAgICAgICAgICAgIEJZVEVCSVRTKCk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDSEVDSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDMpOworICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOworICAgICAgICAgICAgRFJPUEJJVFMoMSk7CisgICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKKyAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KKyAgICAgICAgICAgICAgICB6bGliX2ZpeGVkdGFibGVzKHN0YXRlKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVEFCTEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBibG9jayB0eXBlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RPUkVEOgorICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOworICAgICAgICAgICAgSU5JVEJJVFMoKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQ09QWTsKKyAgICAgICAgY2FzZSBDT1BZOgorICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgY29weSA9IGhhdmU7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKKyAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7CisgICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OworICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUQUJMRToKKyAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKKyAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7CisgICAgICAgICAgICBEUk9QQklUUyg1KTsKKyAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OworICAgICAgICAgICAgRFJPUEJJVFMoNCk7CisjaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOTEVOUzsKKyAgICAgICAgY2FzZSBMRU5MRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5jb2RlKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gKHVuc2lnbmVkIHNob3J0KUJJVFMoMyk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCAxOSkKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAwOworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0ICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKKyAgICAgICAgICAgIHJldCA9IHpsaWJfaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT0RFTEVOUzsKKyAgICAgICAgY2FzZSBDT0RFTEVOUzoKKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPCAxNikgeworICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IHRoaXMudmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsID09IDE2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RhdGUtPmxlbnNbc3RhdGUtPmhhdmUgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMudmFsID09IDE3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyh0aGlzLmJpdHMgKyA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCisgICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKKworICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgKi8KKyAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOworICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7CisgICAgICAgICAgICByZXQgPSB6bGliX2luZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvZGUgY29uc3QgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmRpc3RiaXRzID0gNjsKKyAgICAgICAgICAgIHJldCA9IHpsaWJfaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgIGNhc2UgTEVOOgorICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgeworICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKKyAgICAgICAgICAgICAgICBpbmZsYXRlX2Zhc3Qoc3RybSwgb3V0KTsKKyAgICAgICAgICAgICAgICBMT0FEKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW0JJVFMoc3RhdGUtPmxlbmJpdHMpXTsKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKSh0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmJiAodGhpcy5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKKyAgICAgICAgICAgIGlmICgoaW50KSh0aGlzLm9wKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMSVQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDMyKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKHRoaXMub3ApICYgMTU7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkVYVDsKKyAgICAgICAgY2FzZSBMRU5FWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNUOworICAgICAgICBjYXNlIERJU1Q6CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtCSVRTKHN0YXRlLT5kaXN0Yml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodGhpcy5vcCAmIDB4ZjApID09IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGhpczsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+ZGlzdGNvZGVbbGFzdC52YWwgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyB0aGlzLmJpdHMpIDw9IGJpdHMpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgNjQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm9mZnNldCA9ICh1bnNpZ25lZCl0aGlzLnZhbDsKKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVEVYVDsKKyAgICAgICAgY2FzZSBESVNURVhUOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5leHRyYSkgeworICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+ZG1heCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+d2hhdmUgKyBvdXQgLSBsZWZ0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKKyAgICAgICAgY2FzZSBNQVRDSDoKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndyaXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvcHkgLT0gc3RhdGUtPndyaXRlOworICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3NpemUgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmcm9tID0gc3RhdGUtPndpbmRvdyArIChzdGF0ZS0+d3JpdGUgLSBjb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgIGZyb20gPSBwdXQgLSBzdGF0ZS0+b2Zmc2V0OworICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSBjb3B5ID0gbGVmdDsKKyAgICAgICAgICAgIGxlZnQgLT0gY29weTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuZ3RoID09IDApIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTElUOgorICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7CisgICAgICAgICAgICBsZWZ0LS07CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENIRUNLOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoMzIpOworICAgICAgICAgICAgICAgIG91dCAtPSBsZWZ0OworICAgICAgICAgICAgICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7CisgICAgICAgICAgICAgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKKyAgICAgICAgICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBwdXQgLSBvdXQsIG91dCk7CisgICAgICAgICAgICAgICAgb3V0ID0gbGVmdDsKKyAgICAgICAgICAgICAgICBpZiAoKAorICAgICAgICAgICAgICAgICAgICAgUkVWRVJTRShob2xkKSkgIT0gc3RhdGUtPmNoZWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBET05FOworICAgICAgICBjYXNlIERPTkU6CisgICAgICAgICAgICByZXQgPSBaX1NUUkVBTV9FTkQ7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBCQUQ6CisgICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7CisgICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgY2FzZSBNRU06CisgICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7CisgICAgICAgIGNhc2UgU1lOQzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICAgICAgfQorCisgICAgLyoKKyAgICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS4KKyAgICAgICBJZiB0aGVyZSB3YXMgbm8gcHJvZ3Jlc3MgZHVyaW5nIHRoZSBpbmZsYXRlKCkgY2FsbCwgcmV0dXJuIGEgYnVmZmVyCisgICAgICAgZXJyb3IuICBDYWxsIHpsaWJfdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KKyAgICAgKi8KKyAgaW5mX2xlYXZlOgorICAgIFJFU1RPUkUoKTsKKyAgICBpZiAoc3RhdGUtPndzaXplIHx8IChzdGF0ZS0+bW9kZSA8IENIRUNLICYmIG91dCAhPSBzdHJtLT5hdmFpbF9vdXQpKQorICAgICAgICB6bGliX3VwZGF0ZXdpbmRvdyhzdHJtLCBvdXQpOworCisgICAgaW4gLT0gc3RybS0+YXZhaWxfaW47CisgICAgb3V0IC09IHN0cm0tPmF2YWlsX291dDsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBpbjsKKyAgICBzdHJtLT50b3RhbF9vdXQgKz0gb3V0OworICAgIHN0YXRlLT50b3RhbCArPSBvdXQ7CisgICAgaWYgKHN0YXRlLT53cmFwICYmIG91dCkKKyAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPQorICAgICAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgc3RybS0+bmV4dF9vdXQgLSBvdXQsIG91dCk7CisKKyAgICBzdHJtLT5kYXRhX3R5cGUgPSBzdGF0ZS0+Yml0cyArIChzdGF0ZS0+bGFzdCA/IDY0IDogMCkgKworICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBUWVBFID8gMTI4IDogMCk7CisgICAgaWYgKCgoaW4gPT0gMCAmJiBvdXQgPT0gMCkgfHwgZmx1c2ggPT0gWl9GSU5JU0gpICYmIHJldCA9PSBaX09LKQorICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKKworICAgIGlmIChmbHVzaCA9PSBaX1BBQ0tFVF9GTFVTSCAmJiByZXQgPT0gWl9PSyAmJgorICAgICAgICAgICAgKHN0cm0tPmF2YWlsX291dCAhPSAwIHx8IHN0cm0tPmF2YWlsX2luID09IDApKQorCQlyZXR1cm4gemxpYl9pbmZsYXRlU3luY1BhY2tldChzdHJtKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgemxpYl9pbmZsYXRlRW5kKHpfc3RyZWFtcCBzdHJtKQoreworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwogICAgIHJldHVybiBaX09LOwogfQogCi0KLWludCB6bGliX2luZmxhdGVJbml0XygKLQl6X3N0cmVhbXAgeiwKLQljb25zdCBjaGFyICp2ZXJzaW9uLAotCWludCBzdHJlYW1fc2l6ZQotKQorI2lmIDAKK2ludCB6bGliX2luZmxhdGVTZXREaWN0aW9uYXJ5KHpfc3RyZWFtcCBzdHJtLCBjb25zdCBCeXRlICpkaWN0aW9uYXJ5LAorICAgICAgICB1SW50IGRpY3RMZW5ndGgpCiB7Ci0gIHJldHVybiB6bGliX2luZmxhdGVJbml0Ml8oeiwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlOworICAgIHVuc2lnbmVkIGxvbmcgaWQ7CisKKyAgICAvKiBjaGVjayBzdGF0ZSAqLworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisgICAgaWYgKHN0YXRlLT53cmFwICE9IDAgJiYgc3RhdGUtPm1vZGUgIT0gRElDVCkKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworCisgICAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZCAqLworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7CisgICAgICAgIGlkID0gemxpYl9hZGxlcjMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgaWQgPSB6bGliX2FkbGVyMzIoaWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOworICAgICAgICBpZiAoaWQgIT0gc3RhdGUtPmNoZWNrKQorICAgICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBjb3B5IGRpY3Rpb25hcnkgdG8gd2luZG93ICovCisgICAgemxpYl91cGRhdGV3aW5kb3coc3RybSwgc3RybS0+YXZhaWxfb3V0KTsKKworICAgIGlmIChkaWN0TGVuZ3RoID4gc3RhdGUtPndzaXplKSB7CisgICAgICAgIG1lbWNweShzdGF0ZS0+d2luZG93LCBkaWN0aW9uYXJ5ICsgZGljdExlbmd0aCAtIHN0YXRlLT53c2l6ZSwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBtZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53c2l6ZSAtIGRpY3RMZW5ndGgsIGRpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgZGljdExlbmd0aCk7CisgICAgICAgIHN0YXRlLT53aGF2ZSA9IGRpY3RMZW5ndGg7CisgICAgfQorICAgIHN0YXRlLT5oYXZlZGljdCA9IDE7CisgICAgcmV0dXJuIFpfT0s7CiB9CisjZW5kaWYKIAotI3VuZGVmIE5FRURCWVRFCi0jdW5kZWYgTkVYVEJZVEUKLSNkZWZpbmUgTkVFREJZVEUge2lmKHotPmF2YWlsX2luPT0wKWdvdG8gZW1wdHk7cj10cnY7fQotI2RlZmluZSBORVhUQllURSAoei0+YXZhaWxfaW4tLSx6LT50b3RhbF9pbisrLCp6LT5uZXh0X2luKyspCi0KLWludCB6bGliX2luZmxhdGUoCi0Jel9zdHJlYW1wIHosCi0JaW50IGYKLSkKKyNpZiAwCisvKgorICAgU2VhcmNoIGJ1ZlswLi5sZW4tMV0gZm9yIHRoZSBwYXR0ZXJuOiAwLCAwLCAweGZmLCAweGZmLiAgUmV0dXJuIHdoZW4gZm91bmQKKyAgIG9yIHdoZW4gb3V0IG9mIGlucHV0LiAgV2hlbiBjYWxsZWQsICpoYXZlIGlzIHRoZSBudW1iZXIgb2YgcGF0dGVybiBieXRlcworICAgZm91bmQgaW4gb3JkZXIgc28gZmFyLCBpbiAwLi4zLiAgT24gcmV0dXJuICpoYXZlIGlzIHVwZGF0ZWQgdG8gdGhlIG5ldworICAgc3RhdGUuICBJZiBvbiByZXR1cm4gKmhhdmUgZXF1YWxzIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gd2FzIGZvdW5kIGFuZCB0aGUKKyAgIHJldHVybiB2YWx1ZSBpcyBob3cgbWFueSBieXRlcyB3ZXJlIHJlYWQgaW5jbHVkaW5nIHRoZSBsYXN0IGJ5dGUgb2YgdGhlCisgICBwYXR0ZXJuLiAgSWYgKmhhdmUgaXMgbGVzcyB0aGFuIGZvdXIsIHRoZW4gdGhlIHBhdHRlcm4gaGFzIG5vdCBiZWVuIGZvdW5kCisgICB5ZXQgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVuLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB6bGliX3N5bmNzZWFyY2goKSBjYW4gYmUKKyAgIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgZGF0YSBhbmQgdGhlICpoYXZlIHN0YXRlLiAgKmhhdmUgaXMgaW5pdGlhbGl6ZWQgdG8KKyAgIHplcm8gZm9yIHRoZSBmaXJzdCBjYWxsLgorICovCitzdGF0aWMgdW5zaWduZWQgemxpYl9zeW5jc2VhcmNoKHVuc2lnbmVkICpoYXZlLCB1bnNpZ25lZCBjaGFyICpidWYsCisgICAgICAgIHVuc2lnbmVkIGxlbikKIHsKLSAgaW50IHIsIHRydjsKLSAgdUludCBiOworICAgIHVuc2lnbmVkIGdvdDsKKyAgICB1bnNpZ25lZCBuZXh0OwogCi0gIGlmICh6ID09IE5VTEwgfHwgei0+c3RhdGUgPT0gTlVMTCB8fCB6LT5uZXh0X2luID09IE5VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICB0cnYgPSBmID09IFpfRklOSVNIID8gWl9CVUZfRVJST1IgOiBaX09LOwotICByID0gWl9CVUZfRVJST1I7Ci0gIHdoaWxlICgxKSBzd2l0Y2ggKHotPnN0YXRlLT5tb2RlKQotICB7Ci0gICAgY2FzZSBNRVRIT0Q6Ci0gICAgICBORUVEQllURQotICAgICAgaWYgKCgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPSBORVhUQllURSkgJiAweGYpICE9IFpfREVGTEFURUQpCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gSV9CQUQ7Ci0gICAgICAgIHotPm1zZyA9IChjaGFyKikidW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QiOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPj4gNCkgKyA4ID4gei0+c3RhdGUtPndiaXRzKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IElfQkFEOwotICAgICAgICB6LT5tc2cgPSAoY2hhciopImludmFsaWQgd2luZG93IHNpemUiOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRkxBRzsKLSAgICBjYXNlIEZMQUc6Ci0gICAgICBORUVEQllURQotICAgICAgYiA9IE5FWFRCWVRFOwotICAgICAgaWYgKCgoei0+c3RhdGUtPnN1Yi5tZXRob2QgPDwgOCkgKyBiKSAlIDMxKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IElfQkFEOwotICAgICAgICB6LT5tc2cgPSAoY2hhciopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOwotICAgICAgICB6LT5zdGF0ZS0+c3ViLm1hcmtlciA9IDU7ICAgICAgIC8qIGNhbid0IHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICghKGIgJiBQUkVTRVRfRElDVCkpCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gQkxPQ0tTOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDQ7Ci0gICAgY2FzZSBESUNUNDoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QzOwotICAgIGNhc2UgRElDVDM6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCAxNjsKLSAgICAgIHotPnN0YXRlLT5tb2RlID0gRElDVDI7Ci0gICAgY2FzZSBESUNUMjoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDg7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IERJQ1QxOwotICAgIGNhc2UgRElDVDE6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURTsKLSAgICAgIHotPmFkbGVyID0gei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkOwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBESUNUMDsKLSAgICAgIHJldHVybiBaX05FRURfRElDVDsKLSAgICBjYXNlIERJQ1QwOgotICAgICAgei0+c3RhdGUtPm1vZGUgPSBJX0JBRDsKLSAgICAgIHotPm1zZyA9IChjaGFyKikibmVlZCBkaWN0aW9uYXJ5IjsKLSAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIGNhc2UgQkxPQ0tTOgotICAgICAgciA9IHpsaWJfaW5mbGF0ZV9ibG9ja3Moei0+c3RhdGUtPmJsb2Nrcywgeiwgcik7Ci0gICAgICBpZiAoZiA9PSBaX1BBQ0tFVF9GTFVTSCAmJiB6LT5hdmFpbF9pbiA9PSAwICYmIHotPmF2YWlsX291dCAhPSAwKQotCSAgciA9IHpsaWJfaW5mbGF0ZV9wYWNrZXRfZmx1c2goei0+c3RhdGUtPmJsb2Nrcyk7Ci0gICAgICBpZiAociA9PSBaX0RBVEFfRVJST1IpCi0gICAgICB7Ci0gICAgICAgIHotPnN0YXRlLT5tb2RlID0gSV9CQUQ7Ci0gICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsgICAgICAgLyogY2FuIHRyeSBpbmZsYXRlU3luYyAqLwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChyID09IFpfT0spCi0gICAgICAgIHIgPSB0cnY7Ci0gICAgICBpZiAociAhPSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHJldHVybiByOwotICAgICAgciA9IHRydjsKLSAgICAgIHpsaWJfaW5mbGF0ZV9ibG9ja3NfcmVzZXQoei0+c3RhdGUtPmJsb2NrcywgeiwgJnotPnN0YXRlLT5zdWIuY2hlY2sud2FzKTsKLSAgICAgIGlmICh6LT5zdGF0ZS0+bm93cmFwKQotICAgICAgewotICAgICAgICB6LT5zdGF0ZS0+bW9kZSA9IElfRE9ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLNDsKLSAgICBjYXNlIENIRUNLNDoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgPSAodUxvbmcpTkVYVEJZVEUgPDwgMjQ7Ci0gICAgICB6LT5zdGF0ZS0+bW9kZSA9IENIRUNLMzsKLSAgICBjYXNlIENIRUNLMzoKLSAgICAgIE5FRURCWVRFCi0gICAgICB6LT5zdGF0ZS0+c3ViLmNoZWNrLm5lZWQgKz0gKHVMb25nKU5FWFRCWVRFIDw8IDE2OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzI7Ci0gICAgY2FzZSBDSEVDSzI6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURSA8PCA4OwotICAgICAgei0+c3RhdGUtPm1vZGUgPSBDSEVDSzE7Ci0gICAgY2FzZSBDSEVDSzE6Ci0gICAgICBORUVEQllURQotICAgICAgei0+c3RhdGUtPnN1Yi5jaGVjay5uZWVkICs9ICh1TG9uZylORVhUQllURTsKKyAgICBnb3QgPSAqaGF2ZTsKKyAgICBuZXh0ID0gMDsKKyAgICB3aGlsZSAobmV4dCA8IGxlbiAmJiBnb3QgPCA0KSB7CisgICAgICAgIGlmICgoaW50KShidWZbbmV4dF0pID09IChnb3QgPCAyID8gMCA6IDB4ZmYpKQorICAgICAgICAgICAgZ290Kys7CisgICAgICAgIGVsc2UgaWYgKGJ1ZltuZXh0XSkKKyAgICAgICAgICAgIGdvdCA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdvdCA9IDQgLSBnb3Q7CisgICAgICAgIG5leHQrKzsKKyAgICB9CisgICAgKmhhdmUgPSBnb3Q7CisgICAgcmV0dXJuIG5leHQ7Cit9CisjZW5kaWYKIAotICAgICAgaWYgKHotPnN0YXRlLT5zdWIuY2hlY2sud2FzICE9IHotPnN0YXRlLT5zdWIuY2hlY2submVlZCkKLSAgICAgIHsKLSAgICAgICAgei0+c3RhdGUtPm1vZGUgPSBJX0JBRDsKLSAgICAgICAgei0+bXNnID0gKGNoYXIqKSJpbmNvcnJlY3QgZGF0YSBjaGVjayI7Ci0gICAgICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gNTsgICAgICAgLyogY2FuJ3QgdHJ5IGluZmxhdGVTeW5jICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgei0+c3RhdGUtPm1vZGUgPSBJX0RPTkU7Ci0gICAgY2FzZSBJX0RPTkU6Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRU5EOwotICAgIGNhc2UgSV9CQUQ6Ci0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gIH0KLSBlbXB0eToKLSAgaWYgKGYgIT0gWl9QQUNLRVRfRkxVU0gpCi0gICAgcmV0dXJuIHI7Ci0gIHotPnN0YXRlLT5tb2RlID0gSV9CQUQ7Ci0gIHotPm1zZyA9IChjaGFyICopIm5lZWQgbW9yZSBmb3IgcGFja2V0IGZsdXNoIjsKLSAgei0+c3RhdGUtPnN1Yi5tYXJrZXIgPSAwOyAgICAgICAvKiBjYW4gdHJ5IGluZmxhdGVTeW5jICovCi0gIHJldHVybiBaX0RBVEFfRVJST1I7CisjaWYgMAoraW50IHpsaWJfaW5mbGF0ZVN5bmMoel9zdHJlYW1wIHN0cm0pCit7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBieXRlcyB0byBsb29rIGF0IG9yIGxvb2tlZCBhdCAqLworICAgIHVuc2lnbmVkIGxvbmcgaW4sIG91dDsgICAgICAvKiB0ZW1wb3JhcnkgdG8gc2F2ZSB0b3RhbF9pbiBhbmQgdG90YWxfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciBidWZbNF07ICAgICAgIC8qIHRvIHJlc3RvcmUgYml0IGJ1ZmZlciB0byBieXRlIHN0cmluZyAqLworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKworICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwICYmIHN0YXRlLT5iaXRzIDwgOCkgcmV0dXJuIFpfQlVGX0VSUk9SOworCisgICAgLyogaWYgZmlyc3QgdGltZSwgc3RhcnQgc2VhcmNoIGluIGJpdCBidWZmZXIgKi8KKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gU1lOQykgeworICAgICAgICBzdGF0ZS0+bW9kZSA9IFNZTkM7CisgICAgICAgIHN0YXRlLT5ob2xkIDw8PSBzdGF0ZS0+Yml0cyAmIDc7CisgICAgICAgIHN0YXRlLT5iaXRzIC09IHN0YXRlLT5iaXRzICYgNzsKKyAgICAgICAgbGVuID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXRlLT5iaXRzID49IDgpIHsKKyAgICAgICAgICAgIGJ1ZltsZW4rK10gPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmhvbGQpOworICAgICAgICAgICAgc3RhdGUtPmhvbGQgPj49IDg7CisgICAgICAgICAgICBzdGF0ZS0+Yml0cyAtPSA4OworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKKyAgICAgICAgemxpYl9zeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7CisgICAgfQorCisgICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLworICAgIGxlbiA9IHpsaWJfc3luY3NlYXJjaCgmKHN0YXRlLT5oYXZlKSwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOworICAgIHN0cm0tPmF2YWlsX2luIC09IGxlbjsKKyAgICBzdHJtLT5uZXh0X2luICs9IGxlbjsKKyAgICBzdHJtLT50b3RhbF9pbiArPSBsZW47CisKKyAgICAvKiByZXR1cm4gbm8gam95IG9yIHNldCB1cCB0byByZXN0YXJ0IGluZmxhdGUoKSBvbiBhIG5ldyBibG9jayAqLworICAgIGlmIChzdGF0ZS0+aGF2ZSAhPSA0KSByZXR1cm4gWl9EQVRBX0VSUk9SOworICAgIGluID0gc3RybS0+dG90YWxfaW47ICBvdXQgPSBzdHJtLT50b3RhbF9vdXQ7CisgICAgemxpYl9pbmZsYXRlUmVzZXQoc3RybSk7CisgICAgc3RybS0+dG90YWxfaW4gPSBpbjsgIHN0cm0tPnRvdGFsX291dCA9IG91dDsKKyAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgcmV0dXJuIFpfT0s7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBhZGRzIHRoZSBkYXRhIGF0IG5leHRfaW4vYXZhaWxfaW4gdG8gdGhlIG91dHB1dCBoaXN0b3J5CisgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG91dHB1dC4gIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgImNhdWdodCB1cCI7CisgKiBpLmUuIG5vIHBlbmRpbmcgb3V0cHV0IGJ1dCB0aGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGNhc2UuIFRoZSBzdGF0ZSBtdXN0CisgKiBiZSB3YWl0aW5nIG9uIHRoZSBzdGFydCBvZiBhIGJsb2NrIChpLmUuIG1vZGUgPT0gVFlQRSBvciBIRUFEKS4gIE9uIGV4aXQsCisgKiB0aGUgb3V0cHV0IHdpbGwgYWxzbyBiZSBjYXVnaHQgdXAsIGFuZCB0aGUgY2hlY2tzdW0gd2lsbCBoYXZlIGJlZW4gdXBkYXRlZAorICogaWYgbmVlZCBiZS4KKyAqLworaW50IHpsaWJfaW5mbGF0ZUluY29tcCh6X3N0cmVhbSAqeikKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgKil6LT5zdGF0ZTsKKyAgICBCeXRlICpzYXZlZF9ubyA9IHotPm5leHRfb3V0OworICAgIHVJbnQgc2F2ZWRfYW8gPSB6LT5hdmFpbF9vdXQ7CisKKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gVFlQRSAmJiBzdGF0ZS0+bW9kZSAhPSBIRUFEKQorCXJldHVybiBaX0RBVEFfRVJST1I7CisKKyAgICAvKiBTZXR1cCBzb21lIHZhcmlhYmxlcyB0byBhbGxvdyBtaXN1c2Ugb2YgdXBkYXRlV2luZG93ICovCisgICAgei0+YXZhaWxfb3V0ID0gMDsKKyAgICB6LT5uZXh0X291dCA9IHotPm5leHRfaW4gKyB6LT5hdmFpbF9pbjsKKworICAgIHpsaWJfdXBkYXRld2luZG93KHosIHotPmF2YWlsX2luKTsKKworICAgIC8qIFJlc3RvcmUgc2F2ZWQgdmFyaWFibGVzICovCisgICAgei0+YXZhaWxfb3V0ID0gc2F2ZWRfYW87CisgICAgei0+bmV4dF9vdXQgPSBzYXZlZF9ubzsKKworICAgIHotPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgVVBEQVRFKHN0YXRlLT5jaGVjaywgei0+bmV4dF9pbiwgei0+YXZhaWxfaW4pOworCisgICAgei0+dG90YWxfb3V0ICs9IHotPmF2YWlsX2luOworICAgIHotPnRvdGFsX2luICs9IHotPmF2YWlsX2luOworICAgIHotPm5leHRfaW4gKz0gei0+YXZhaWxfaW47CisgICAgc3RhdGUtPnRvdGFsICs9IHotPmF2YWlsX2luOworICAgIHotPmF2YWlsX2luID0gMDsKKworICAgIHJldHVybiBaX09LOwogfQpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlLmggYi9saWIvemxpYl9pbmZsYXRlL2luZmxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjhhNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIGluZmxhdGUuaCAtLSBpbnRlcm5hbCBpbmZsYXRlIHN0YXRlIGRlZmluaXRpb24KKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA0IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBIRUFELCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi8KKyAgICBGTEFHUywgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqLworICAgIFRJTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqLworICAgIE9TLCAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqLworICAgIEVYTEVOLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi8KKyAgICBFWFRSQSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi8KKyAgICBOQU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqLworICAgIENPTU1FTlQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqLworICAgIEhDUkMsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovCisgICAgRElDVElELCAgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqLworICAgIERJQ1QsICAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqLworICAgICAgICBUWVBFLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovCisgICAgICAgIFRZUEVETywgICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi8KKyAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KKyAgICAgICAgQ09QWSwgICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi8KKyAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCisgICAgICAgIExFTkxFTlMsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLworICAgICAgICBDT0RFTEVOUywgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgICAgIExFTiwgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgY29kZSAqLworICAgICAgICAgICAgTEVORVhULCAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIERJU1QsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi8KKyAgICAgICAgICAgIERJU1RFWFQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgIE1BVENILCAgICAgIC8qIG86IHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSB0byBjb3B5IHN0cmluZyAqLworICAgICAgICAgICAgTElULCAgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi8KKyAgICBDSEVDSywgICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi8KKyAgICBMRU5HVEgsICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgbGVuZ3RoIChnemlwKSAqLworICAgIERPTkUsICAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgQkFELCAgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqLworICAgIE1FTSwgICAgICAgIC8qIGdvdCBhbiBpbmZsYXRlKCkgbWVtb3J5IGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgU1lOQyAgICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovCit9IGluZmxhdGVfbW9kZTsKKworLyoKKyAgICBTdGF0ZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGFib3ZlIG1vZGVzIC0KKworICAgIChtb3N0IG1vZGVzIGNhbiBnbyB0byB0aGUgQkFEIG9yIE1FTSBtb2RlIC0tIG5vdCBzaG93biBmb3IgY2xhcml0eSkKKworICAgIFByb2Nlc3MgaGVhZGVyOgorICAgICAgICBIRUFEIC0+IChnemlwKSBvciAoemxpYikKKyAgICAgICAgKGd6aXApIC0+IEZMQUdTIC0+IFRJTUUgLT4gT1MgLT4gRVhMRU4gLT4gRVhUUkEgLT4gTkFNRQorICAgICAgICBOQU1FIC0+IENPTU1FTlQgLT4gSENSQyAtPiBUWVBFCisgICAgICAgICh6bGliKSAtPiBESUNUSUQgb3IgVFlQRQorICAgICAgICBESUNUSUQgLT4gRElDVCAtPiBUWVBFCisgICAgUmVhZCBkZWZsYXRlIGJsb2NrczoKKyAgICAgICAgICAgIFRZUEUgLT4gU1RPUkVEIG9yIFRBQkxFIG9yIExFTiBvciBDSEVDSworICAgICAgICAgICAgU1RPUkVEIC0+IENPUFkgLT4gVFlQRQorICAgICAgICAgICAgVEFCTEUgLT4gTEVOTEVOUyAtPiBDT0RFTEVOUyAtPiBMRU4KKyAgICBSZWFkIGRlZmxhdGUgY29kZXM6CisgICAgICAgICAgICAgICAgTEVOIC0+IExFTkVYVCBvciBMSVQgb3IgVFlQRQorICAgICAgICAgICAgICAgIExFTkVYVCAtPiBESVNUIC0+IERJU1RFWFQgLT4gTUFUQ0ggLT4gTEVOCisgICAgICAgICAgICAgICAgTElUIC0+IExFTgorICAgIFByb2Nlc3MgdHJhaWxlcjoKKyAgICAgICAgQ0hFQ0sgLT4gTEVOR1RIIC0+IERPTkUKKyAqLworCisvKiBzdGF0ZSBtYWludGFpbmVkIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzLiAgQXBwcm94aW1hdGVseSA3SyBieXRlcy4gKi8KK3N0cnVjdCBpbmZsYXRlX3N0YXRlIHsKKyAgICBpbmZsYXRlX21vZGUgbW9kZTsgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi8KKyAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi8KKyAgICBpbnQgd3JhcDsgICAgICAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLworICAgIGludCBoYXZlZGljdDsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi8KKyAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqLworICAgIHVuc2lnbmVkIGRtYXg7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVfU1RSSUNUKSAqLworICAgIHVuc2lnbmVkIGxvbmcgY2hlY2s7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqLworICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi8KKyAvKiAgIGd6X2hlYWRlcnAgaGVhZDsgKi8gICAgICAgICAgIC8qIHdoZXJlIHRvIHNhdmUgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgLyogc2xpZGluZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3Yml0czsgICAgICAgICAgICAgLyogbG9nIGJhc2UgMiBvZiByZXF1ZXN0ZWQgd2luZG93IHNpemUgKi8KKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KKyAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiAiaW4iICovCisgICAgICAgIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovCisgICAgdW5zaWduZWQgbGVuZ3RoOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqLworICAgIHVuc2lnbmVkIG9mZnNldDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi8KKyAgICAgICAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovCisgICAgdW5zaWduZWQgZXh0cmE7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovCisgICAgICAgIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovCisgICAgY29kZSBjb25zdCAqbGVuY29kZTsgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzICovCisgICAgY29kZSBjb25zdCAqZGlzdGNvZGU7ICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovCisgICAgdW5zaWduZWQgbGVuYml0czsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi8KKyAgICB1bnNpZ25lZCBkaXN0Yml0czsgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgZGlzdGNvZGUgKi8KKyAgICAgICAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqLworICAgIHVuc2lnbmVkIG5jb2RlOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmxlbjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgbmRpc3Q7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBoYXZlOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RocyBpbiBsZW5zW10gKi8KKyAgICBjb2RlICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovCisgICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCisgICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLworfTsKZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW1zLmMgYi9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3ltcy5jCmluZGV4IGVmNDk3MzguLjIwNjFkNGYgMTAwNjQ0Ci0tLSBhL2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW1zLmMKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bXMuYwpAQCAtMTIsOCArMTIsNyBAQAogCiBFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKTsKIEVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlKTsKLUVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlSW5pdF8pOwotRVhQT1JUX1NZTUJPTCh6bGliX2luZmxhdGVJbml0Ml8pOworRVhQT1JUX1NZTUJPTCh6bGliX2luZmxhdGVJbml0Mik7CiBFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZUVuZCk7CiBFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZVJlc2V0KTsKIEVYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlSW5jb21wKTsgCmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3luYy5jIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bmMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MTFmZi4uMDAwMDAwMAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZmxhdGVfc3luYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qIGluZmxhdGUuYyAtLSB6bGliIGludGVyZmFjZSB0byBpbmZsYXRlIG1vZHVsZXMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4IE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvenV0aWwuaD4KLSNpbmNsdWRlICJpbmZibG9jay5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKLQotI2lmIDAKLWludCB6bGliX2luZmxhdGVTeW5jKAotCXpfc3RyZWFtcCB6Ci0pCi17Ci0gIHVJbnQgbjsgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgKi8KLSAgQnl0ZSAqcDsgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVzICovCi0gIHVJbnQgbTsgICAgICAgLyogbnVtYmVyIG9mIG1hcmtlciBieXRlcyBmb3VuZCBpbiBhIHJvdyAqLwotICB1TG9uZyByLCB3OyAgIC8qIHRlbXBvcmFyaWVzIHRvIHNhdmUgdG90YWxfaW4gYW5kIHRvdGFsX291dCAqLwotCi0gIC8qIHNldCB1cCAqLwotICBpZiAoeiA9PSBOVUxMIHx8IHotPnN0YXRlID09IE5VTEwpCi0gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICBpZiAoei0+c3RhdGUtPm1vZGUgIT0gSV9CQUQpCi0gIHsKLSAgICB6LT5zdGF0ZS0+bW9kZSA9IElfQkFEOwotICAgIHotPnN0YXRlLT5zdWIubWFya2VyID0gMDsKLSAgfQotICBpZiAoKG4gPSB6LT5hdmFpbF9pbikgPT0gMCkKLSAgICByZXR1cm4gWl9CVUZfRVJST1I7Ci0gIHAgPSB6LT5uZXh0X2luOwotICBtID0gei0+c3RhdGUtPnN1Yi5tYXJrZXI7Ci0KLSAgLyogc2VhcmNoICovCi0gIHdoaWxlIChuICYmIG0gPCA0KQotICB7Ci0gICAgc3RhdGljIGNvbnN0IEJ5dGUgbWFya1s0XSA9IHswLCAwLCAweGZmLCAweGZmfTsKLSAgICBpZiAoKnAgPT0gbWFya1ttXSkKLSAgICAgIG0rKzsKLSAgICBlbHNlIGlmICgqcCkKLSAgICAgIG0gPSAwOwotICAgIGVsc2UKLSAgICAgIG0gPSA0IC0gbTsKLSAgICBwKyssIG4tLTsKLSAgfQotCi0gIC8qIHJlc3RvcmUgKi8KLSAgei0+dG90YWxfaW4gKz0gcCAtIHotPm5leHRfaW47Ci0gIHotPm5leHRfaW4gPSBwOwotICB6LT5hdmFpbF9pbiA9IG47Ci0gIHotPnN0YXRlLT5zdWIubWFya2VyID0gbTsKLQotICAvKiByZXR1cm4gbm8gam95IG9yIHNldCB1cCB0byByZXN0YXJ0IG9uIGEgbmV3IGJsb2NrICovCi0gIGlmIChtICE9IDQpCi0gICAgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgciA9IHotPnRvdGFsX2luOyAgdyA9IHotPnRvdGFsX291dDsKLSAgemxpYl9pbmZsYXRlUmVzZXQoeik7Ci0gIHotPnRvdGFsX2luID0gcjsgIHotPnRvdGFsX291dCA9IHc7Ci0gIHotPnN0YXRlLT5tb2RlID0gQkxPQ0tTOwotICByZXR1cm4gWl9PSzsKLX0KLSNlbmRpZiAgLyogIDAgICovCi0KLQotLyogUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQKLSAqIGJ5IFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCi0gKiBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcyBaX1NZTkNfRkxVU0gKLSAqIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQgYmxvY2suIFdoZW4KLSAqIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwgaW5mbGF0ZSBpcwotICogd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgotICovCi0jaWYgMAotaW50IHpsaWJfaW5mbGF0ZVN5bmNQb2ludCgKLQl6X3N0cmVhbXAgegotKQotewotICBpZiAoeiA9PSBOVUxMIHx8IHotPnN0YXRlID09IE5VTEwgfHwgei0+c3RhdGUtPmJsb2NrcyA9PSBOVUxMKQotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgcmV0dXJuIHpsaWJfaW5mbGF0ZV9ibG9ja3Nfc3luY19wb2ludCh6LT5zdGF0ZS0+YmxvY2tzKTsKLX0KLSNlbmRpZiAgLyogIDAgICovCi0KLS8qCi0gKiBUaGlzIHN1YnJvdXRpbmUgYWRkcyB0aGUgZGF0YSBhdCBuZXh0X2luL2F2YWlsX2luIHRvIHRoZSBvdXRwdXQgaGlzdG9yeQotICogd2l0aG91dCBwZXJmb3JtaW5nIGFueSBvdXRwdXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlICJjYXVnaHQgdXAiOwotICogaS5lLiBubyBwZW5kaW5nIG91dHB1dCAoaGVuY2Ugcy0+cmVhZCBlcXVhbHMgcy0+d3JpdGUpLCBhbmQgdGhlIHN0YXRlIG11c3QKLSAqIGJlIEJMT0NLUyAoaS5lLiB3ZSBzaG91bGQgYmUgd2lsbGluZyB0byBzZWUgdGhlIHN0YXJ0IG9mIGEgc2VyaWVzIG9mCi0gKiBCTE9DS1MpLiAgT24gZXhpdCwgdGhlIG91dHB1dCB3aWxsIGFsc28gYmUgY2F1Z2h0IHVwLCBhbmQgdGhlIGNoZWNrc3VtCi0gKiB3aWxsIGhhdmUgYmVlbiB1cGRhdGVkIGlmIG5lZWQgYmUuCi0gKi8KLXN0YXRpYyBpbnQgemxpYl9pbmZsYXRlX2FkZGhpc3RvcnkoaW5mbGF0ZV9ibG9ja3Nfc3RhdGVmICpzLAotCQkJCSAgICAgIHpfc3RyZWFtICAgICAgICAgICAgICAqeikKLXsKLSAgICB1TG9uZyBiOyAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLyAgLyogTk9UIFVTRUQgSEVSRSAqLwotICAgIHVJbnQgazsgICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8gLyogTk9UIFVTRUQgSEVSRSAqLwotICAgIHVJbnQgdDsgICAgICAgICAgICAgICAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSAqLwotICAgIEJ5dGUgKnA7ICAgICAgICAgICAgICAvKiBpbnB1dCBkYXRhIHBvaW50ZXIgKi8KLSAgICB1SW50IG47ICAgICAgICAgICAgICAgLyogYnl0ZXMgYXZhaWxhYmxlIHRoZXJlICovCi0gICAgQnl0ZSAqcTsgICAgICAgICAgICAgIC8qIG91dHB1dCB3aW5kb3cgd3JpdGUgcG9pbnRlciAqLwotICAgIHVJbnQgbTsgICAgICAgICAgICAgICAvKiBieXRlcyB0byBlbmQgb2Ygd2luZG93IG9yIHJlYWQgcG9pbnRlciAqLwotCi0gICAgaWYgKHMtPnJlYWQgIT0gcy0+d3JpdGUpCi0JcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIGlmIChzLT5tb2RlICE9IFRZUEUpCi0JcmV0dXJuIFpfREFUQV9FUlJPUjsKLQotICAgIC8qIHdlJ3JlIHJlYWR5IHRvIHJvY2sgKi8KLSAgICBMT0FECi0gICAgLyogd2hpbGUgdGhlcmUgaXMgaW5wdXQgcmVhZHksIGNvcHkgdG8gb3V0cHV0IGJ1ZmZlciwgbW92aW5nCi0gICAgICogcG9pbnRlcnMgYXMgbmVlZGVkLgotICAgICAqLwotICAgIHdoaWxlIChuKSB7Ci0JdCA9IG47ICAvKiBob3cgbWFueSB0byBkbyAqLwotCS8qIGlzIHRoZXJlIHJvb20gdW50aWwgZW5kIG9mIGJ1ZmZlcj8gKi8KLQlpZiAodCA+IG0pIHQgPSBtOwotCS8qIHVwZGF0ZSBjaGVjayBpbmZvcm1hdGlvbiAqLwotCWlmIChzLT5jaGVja2ZuICE9IE5VTEwpCi0JICAgIHMtPmNoZWNrID0gKCpzLT5jaGVja2ZuKShzLT5jaGVjaywgcSwgdCk7Ci0JbWVtY3B5KHEsIHAsIHQpOwotCXEgKz0gdDsKLQlwICs9IHQ7Ci0JbiAtPSB0OwotCXotPnRvdGFsX291dCArPSB0OwotCXMtPnJlYWQgPSBxOyAgICAvKiBkcmFnIHJlYWQgcG9pbnRlciBmb3J3YXJkICovCi0vKiAgICAgIFdXUkFQICAqLyAJLyogZXhwYW5kIFdXUkFQIG1hY3JvIGJ5IGhhbmQgdG8gaGFuZGxlIHMtPnJlYWQgKi8KLQlpZiAocSA9PSBzLT5lbmQpIHsKLQkgICAgcy0+cmVhZCA9IHEgPSBzLT53aW5kb3c7Ci0JICAgIG0gPSBXQVZBSUw7Ci0JfQotICAgIH0KLSAgICBVUERBVEUKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotCi0vKgotICogVGhpcyBzdWJyb3V0aW5lIGFkZHMgdGhlIGRhdGEgYXQgbmV4dF9pbi9hdmFpbF9pbiB0byB0aGUgb3V0cHV0IGhpc3RvcnkKLSAqIHdpdGhvdXQgcGVyZm9ybWluZyBhbnkgb3V0cHV0LiAgVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSAiY2F1Z2h0IHVwIjsKLSAqIGkuZS4gbm8gcGVuZGluZyBvdXRwdXQgKGhlbmNlIHMtPnJlYWQgZXF1YWxzIHMtPndyaXRlKSwgYW5kIHRoZSBzdGF0ZSBtdXN0Ci0gKiBiZSBCTE9DS1MgKGkuZS4gd2Ugc2hvdWxkIGJlIHdpbGxpbmcgdG8gc2VlIHRoZSBzdGFydCBvZiBhIHNlcmllcyBvZgotICogQkxPQ0tTKS4gIE9uIGV4aXQsIHRoZSBvdXRwdXQgd2lsbCBhbHNvIGJlIGNhdWdodCB1cCwgYW5kIHRoZSBjaGVja3N1bQotICogd2lsbCBoYXZlIGJlZW4gdXBkYXRlZCBpZiBuZWVkIGJlLgotICovCi0KLWludCB6bGliX2luZmxhdGVJbmNvbXAoCi0Jel9zdHJlYW0gKnoKLQotKQotewotICAgIGlmICh6LT5zdGF0ZS0+bW9kZSAhPSBCTE9DS1MpCi0JcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICByZXR1cm4gemxpYl9pbmZsYXRlX2FkZGhpc3Rvcnkoei0+c3RhdGUtPmJsb2Nrcywgeik7Ci19CmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmMgYi9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmMKaW5kZXggODc0OTUwZS4uNjIzNDNjNSAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5jCisrKyBiL2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuYwpAQCAtMSw0MTIgKzEsMzI5IEBACiAvKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZwotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKICAqLwogCiAjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KICNpbmNsdWRlICJpbmZ0cmVlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKIAotc3RhdGljIGNvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSBfX2F0dHJpYnV0ZV91c2VkX18gPQotICAgIiBpbmZsYXRlIDEuMS4zIENvcHlyaWdodCAxOTk1LTE5OTggTWFyayBBZGxlciAiOworI2RlZmluZSBNQVhCSVRTIDE1CisKK2NvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9CisgICAiIGluZmxhdGUgMS4yLjMgQ29weXJpZ2h0IDE5OTUtMjAwNSBNYXJrIEFkbGVyICI7CiAvKgogICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCiAgIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKICAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCiAgIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgogICovCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGU7Ci0KLS8qIHNpbXBsaWZ5IHRoZSB1c2Ugb2YgdGhlIGluZmxhdGVfaHVmdCB0eXBlIHdpdGggc29tZSBkZWZpbmVzICovCi0jZGVmaW5lIGV4b3Agd29yZC53aGF0LkV4b3AKLSNkZWZpbmUgYml0cyB3b3JkLndoYXQuQml0cwotCi0KLXN0YXRpYyBpbnQgaHVmdF9idWlsZCAoCi0gICAgdUludCAqLCAgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAqLwotICAgIHVJbnQsICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzICovCi0gICAgdUludCwgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgInNpbXBsZSIgY29kZXMgKi8KLSAgICBjb25zdCB1SW50ICosICAgICAgIC8qIGxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMgKi8KLSAgICBjb25zdCB1SW50ICosICAgICAgIC8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwotICAgIGluZmxhdGVfaHVmdCAqKiwgICAgLyogcmVzdWx0OiBzdGFydGluZyB0YWJsZSAqLwotICAgIHVJbnQgKiwgICAgICAgICAgICAgLyogbWF4aW11bSBsb29rdXAgYml0cyAocmV0dXJucyBhY3R1YWwpICovCi0gICAgaW5mbGF0ZV9odWZ0ICosICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLSAgICB1SW50ICosICAgICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KLSAgICB1SW50ICogKTsgICAgICAgICAgIC8qIHNwYWNlIGZvciB2YWx1ZXMgKi8KLQotLyogVGFibGVzIGZvciBkZWZsYXRlIGZyb20gUEtaSVAncyBhcHBub3RlLnR4dC4gKi8KLXN0YXRpYyBjb25zdCB1SW50IGNwbGVuc1szMV0gPSB7IC8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLwotICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAotICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07Ci0gICAgICAgIC8qIHNlZSBub3RlICMxMyBhYm92ZSBhYm91dCAyNTggKi8KLXN0YXRpYyBjb25zdCB1SW50IGNwbGV4dFszMV0gPSB7IC8qIEV4dHJhIGJpdHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwKLSAgICAgICAgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgMCwgMTEyLCAxMTJ9OyAvKiAxMTI9PWludmFsaWQgKi8KLXN0YXRpYyBjb25zdCB1SW50IGNwZGlzdFszMF0gPSB7IC8qIENvcHkgb2Zmc2V0cyBmb3IgZGlzdGFuY2UgY29kZXMgMC4uMjkgKi8KLSAgICAgICAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLAotICAgICAgICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsCi0gICAgICAgIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1Nzd9Owotc3RhdGljIGNvbnN0IHVJbnQgY3BkZXh0WzMwXSA9IHsgLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgKi8KLSAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKLSAgICAgICAgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsCi0gICAgICAgIDEyLCAxMiwgMTMsIDEzfTsKIAogLyoKLSAgIEh1ZmZtYW4gY29kZSBkZWNvZGluZyBpcyBwZXJmb3JtZWQgdXNpbmcgYSBtdWx0aS1sZXZlbCB0YWJsZSBsb29rdXAuCi0gICBUaGUgZmFzdGVzdCB3YXkgdG8gZGVjb2RlIGlzIHRvIHNpbXBseSBidWlsZCBhIGxvb2t1cCB0YWJsZSB3aG9zZQotICAgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBsb25nZXN0IGNvZGUuICBIb3dldmVyLCB0aGUgdGltZSBpdCB0YWtlcwotICAgdG8gYnVpbGQgdGhpcyB0YWJsZSBjYW4gYWxzbyBiZSBhIGZhY3RvciBpZiB0aGUgZGF0YSBiZWluZyBkZWNvZGVkCi0gICBpcyBub3QgdmVyeSBsb25nLiAgVGhlIG1vc3QgY29tbW9uIGNvZGVzIGFyZSBuZWNlc3NhcmlseSB0aGUKLSAgIHNob3J0ZXN0IGNvZGVzLCBzbyB0aG9zZSBjb2RlcyBkb21pbmF0ZSB0aGUgZGVjb2RpbmcgdGltZSwgYW5kIGhlbmNlCi0gICB0aGUgc3BlZWQuICBUaGUgaWRlYSBpcyB5b3UgY2FuIGhhdmUgYSBzaG9ydGVyIHRhYmxlIHRoYXQgZGVjb2RlcyB0aGUKLSAgIHNob3J0ZXIsIG1vcmUgcHJvYmFibGUgY29kZXMsIGFuZCB0aGVuIHBvaW50IHRvIHN1YnNpZGlhcnkgdGFibGVzIGZvcgotICAgdGhlIGxvbmdlciBjb2Rlcy4gIFRoZSB0aW1lIGl0IGNvc3RzIHRvIGRlY29kZSB0aGUgbG9uZ2VyIGNvZGVzIGlzCi0gICB0aGVuIHRyYWRlZCBhZ2FpbnN0IHRoZSB0aW1lIGl0IHRha2VzIHRvIG1ha2UgbG9uZ2VyIHRhYmxlcy4KLQotICAgVGhpcyByZXN1bHRzIG9mIHRoaXMgdHJhZGUgYXJlIGluIHRoZSB2YXJpYWJsZXMgbGJpdHMgYW5kIGRiaXRzCi0gICBiZWxvdy4gIGxiaXRzIGlzIHRoZSBudW1iZXIgb2YgYml0cyB0aGUgZmlyc3QgbGV2ZWwgdGFibGUgZm9yIGxpdGVyYWwvCi0gICBsZW5ndGggY29kZXMgY2FuIGRlY29kZSBpbiBvbmUgc3RlcCwgYW5kIGRiaXRzIGlzIHRoZSBzYW1lIHRoaW5nIGZvcgotICAgdGhlIGRpc3RhbmNlIGNvZGVzLiAgU3Vic2VxdWVudCB0YWJsZXMgYXJlIGFsc28gbGVzcyB0aGFuIG9yIGVxdWFsIHRvCi0gICB0aG9zZSBzaXplcy4gIFRoZXNlIHZhbHVlcyBtYXkgYmUgYWRqdXN0ZWQgZWl0aGVyIHdoZW4gYWxsIG9mIHRoZQotICAgY29kZXMgYXJlIHNob3J0ZXIgdGhhbiB0aGF0LCBpbiB3aGljaCBjYXNlIHRoZSBsb25nZXN0IGNvZGUgbGVuZ3RoIGluCi0gICBiaXRzIGlzIHVzZWQsIG9yIHdoZW4gdGhlIHNob3J0ZXN0IGNvZGUgaXMgKmxvbmdlciogdGhhbiB0aGUgcmVxdWVzdGVkCi0gICB0YWJsZSBzaXplLCBpbiB3aGljaCBjYXNlIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXN0IGNvZGUgaW4gYml0cyBpcwotICAgdXNlZC4KLQotICAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGUgdHdvIHRhYmxlcywgc2luY2UgdGhleSBjb2RlIGEKLSAgIGRpZmZlcmVudCBudW1iZXIgb2YgcG9zc2liaWxpdGllcyBlYWNoLiAgVGhlIGxpdGVyYWwvbGVuZ3RoIHRhYmxlCi0gICBjb2RlcyAyODYgcG9zc2libGUgdmFsdWVzLCBvciBpbiBhIGZsYXQgY29kZSwgYSBsaXR0bGUgb3ZlciBlaWdodAotICAgYml0cy4gIFRoZSBkaXN0YW5jZSB0YWJsZSBjb2RlcyAzMCBwb3NzaWJsZSB2YWx1ZXMsIG9yIGEgbGl0dGxlIGxlc3MKLSAgIHRoYW4gZml2ZSBiaXRzLCBmbGF0LiAgVGhlIG9wdGltdW0gdmFsdWVzIGZvciBzcGVlZCBlbmQgdXAgYmVpbmcKLSAgIGFib3V0IG9uZSBiaXQgbW9yZSB0aGFuIHRob3NlLCBzbyBsYml0cyBpcyA4KzEgYW5kIGRiaXRzIGlzIDUrMS4KLSAgIFRoZSBvcHRpbXVtIHZhbHVlcyBtYXkgZGlmZmVyIHRob3VnaCBmcm9tIG1hY2hpbmUgdG8gbWFjaGluZSwgYW5kCi0gICBwb3NzaWJseSBldmVuIGJldHdlZW4gY29tcGlsZXJzLiAgWW91ciBtaWxlYWdlIG1heSB2YXJ5LgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KICAqLwotCi0KLS8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1TG9uZy4gKi8KLSNkZWZpbmUgQk1BWCAxNSAgICAgICAgIC8qIG1heGltdW0gYml0IGxlbmd0aCBvZiBhbnkgY29kZSAqLwotCi1zdGF0aWMgaW50IGh1ZnRfYnVpbGQoCi0JdUludCAqYiwgICAgICAgICAgICAgICAvKiBjb2RlIGxlbmd0aHMgaW4gYml0cyAoYWxsIGFzc3VtZWQgPD0gQk1BWCkgKi8KLQl1SW50IG4sICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyAoYXNzdW1lZCA8PSAyODgpICovCi0JdUludCBzLCAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc2ltcGxlLXZhbHVlZCBjb2RlcyAoMC4ucy0xKSAqLwotCWNvbnN0IHVJbnQgKmQsICAgICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLwotCWNvbnN0IHVJbnQgKmUsICAgICAgICAgLyogbGlzdCBvZiBleHRyYSBiaXRzIGZvciBub24tc2ltcGxlIGNvZGVzICovCi0JaW5mbGF0ZV9odWZ0ICoqdCwgICAgICAvKiByZXN1bHQ6IHN0YXJ0aW5nIHRhYmxlICovCi0JdUludCAqbSwgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbCAqLwotCWluZmxhdGVfaHVmdCAqaHAsICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0JdUludCAqaG4sICAgICAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCi0JdUludCAqdiAgICAgICAgICAgICAgICAvKiB3b3JraW5nIGFyZWE6IHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCi0pCi0vKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgotICAgdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiBaX09LIG9uIHN1Y2Nlc3MsIFpfQlVGX0VSUk9SCi0gICBpZiB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcwotICAgY2FzZSksIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYW4gb3Zlci1zdWJzY3JpYmVkIHNldCBvZgotICAgbGVuZ3RocyksIG9yIFpfTUVNX0VSUk9SIGlmIG5vdCBlbm91Z2ggbWVtb3J5LiAqLworaW50IHpsaWJfaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBjb2RlcywgdGFibGUsIGJpdHMsIHdvcmspCitjb2RldHlwZSB0eXBlOwordW5zaWduZWQgc2hvcnQgKmxlbnM7Cit1bnNpZ25lZCBjb2RlczsKK2NvZGUgKip0YWJsZTsKK3Vuc2lnbmVkICpiaXRzOwordW5zaWduZWQgc2hvcnQgKndvcms7CiB7CisgICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovCisgICAgdW5zaWduZWQgc3ltOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqLworICAgIHVuc2lnbmVkIG1pbiwgbWF4OyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHJvb3Q7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGN1cnI7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqLworICAgIHVuc2lnbmVkIGRyb3A7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovCisgICAgaW50IGxlZnQ7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgdXNlZDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovCisgICAgdW5zaWduZWQgaHVmZjsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqLworICAgIHVuc2lnbmVkIGluY3I7ICAgICAgICAgICAgICAvKiBmb3IgaW5jcmVtZW50aW5nIGNvZGUsIGluZGV4ICovCisgICAgdW5zaWduZWQgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovCisgICAgdW5zaWduZWQgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBtYXNrOyAgICAgICAgICAgICAgLyogbWFzayBmb3IgbG93IHJvb3QgYml0cyAqLworICAgIGNvZGUgdGhpczsgICAgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3IgZHVwbGljYXRpb24gKi8KKyAgICBjb2RlICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovCisgICAgaW50IGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBiYXNlIGFuZCBleHRyYSBmb3Igc3ltYm9sID4gZW5kICovCisgICAgdW5zaWduZWQgc2hvcnQgY291bnRbTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovCisgICAgdW5zaWduZWQgc2hvcnQgb2Zmc1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGJhc2VbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxleHRbMzFdID0geyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgZXh0cmEgKi8KKyAgICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE3LCAxNywgMTgsIDE4LCAxOCwgMTgsCisgICAgICAgIDE5LCAxOSwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDE2LCAyMDEsIDE5Nn07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRiYXNlWzMyXSA9IHsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgYmFzZSAqLworICAgICAgICAxLCAyLCAzLCA0LCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNDksIDY1LCA5NywgMTI5LCAxOTMsCisgICAgICAgIDI1NywgMzg1LCA1MTMsIDc2OSwgMTAyNSwgMTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwKKyAgICAgICAgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3NywgMCwgMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGRleHRbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqLworICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMiwKKyAgICAgICAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsCisgICAgICAgIDI4LCAyOCwgMjksIDI5LCA2NCwgNjR9OwogCi0gIHVJbnQgYTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvdW50ZXIgZm9yIGNvZGVzIG9mIGxlbmd0aCBrICovCi0gIHVJbnQgY1tCTUFYKzFdOyAgICAgICAgICAgICAgIC8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KLSAgdUludCBmOyAgICAgICAgICAgICAgICAgICAgICAgLyogaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcyAqLwotICBpbnQgZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCi0gIGludCBoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGxldmVsICovCi0gIHJlZ2lzdGVyIHVJbnQgaTsgICAgICAgICAgICAgIC8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLwotICByZWdpc3RlciB1SW50IGo7ICAgICAgICAgICAgICAvKiBjb3VudGVyICovCi0gIHJlZ2lzdGVyIGludCBrOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLwotICBpbnQgbDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KLSAgdUludCBtYXNrOyAgICAgICAgICAgICAgICAgICAgLyogKDEgPDwgdykgLSAxLCB0byBhdm9pZCBjYyAtTyBidWcgb24gSFAgKi8KLSAgcmVnaXN0ZXIgdUludCAqcDsgICAgICAgICAgICAgLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KLSAgaW5mbGF0ZV9odWZ0ICpxOyAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KLSAgc3RydWN0IGluZmxhdGVfaHVmdF9zIHI7ICAgICAgLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCi0gIGluZmxhdGVfaHVmdCAqdVtCTUFYXTsgICAgICAgIC8qIHRhYmxlIHN0YWNrICovCi0gIHJlZ2lzdGVyIGludCB3OyAgICAgICAgICAgICAgIC8qIGJpdHMgYmVmb3JlIHRoaXMgdGFibGUgPT0gKGwgKiBoKSAqLwotICB1SW50IHhbQk1BWCsxXTsgICAgICAgICAgICAgICAvKiBiaXQgb2Zmc2V0cywgdGhlbiBjb2RlIHN0YWNrICovCi0gIHVJbnQgKnhwOyAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byB4ICovCi0gIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkdW1teSBjb2RlcyBhZGRlZCAqLwotICB1SW50IHo7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBjdXJyZW50IHRhYmxlICovCisgICAgLyoKKyAgICAgICBQcm9jZXNzIGEgc2V0IG9mIGNvZGUgbGVuZ3RocyB0byBjcmVhdGUgYSBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLiAgVGhlCisgICAgICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlCisgICAgICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGUKKyAgICAgICBzeW1ib2xzIGJ5IGxlbmd0aCBmcm9tIHNob3J0IHRvIGxvbmcsIGFuZCByZXRhaW5pbmcgdGhlIHN5bWJvbCBvcmRlcgorICAgICAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHMKKyAgICAgICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlcgorICAgICAgIGluY3JlbWVudHMgZm9yIHRoZSBzYW1lIGxlbmd0aCwgYW5kIHplcm9zIGFyZSBhcHBlbmRlZCBhcyB0aGUgbGVuZ3RoCisgICAgICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkcworICAgICAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMgYXJlIGJ1aWx0IGluIHRoZSBsYXJnZSBsb29wIGJlbG93LCB0aGUgaW50ZWdlciBjb2RlcworICAgICAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuCiAKKyAgICAgICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpbgorICAgICAgIGxlbnNbXSBhcmUgaW4gdGhlIHJhbmdlIDAuLk1BWEJJVFMuICBUaGUgY2FsbGVyIG11c3QgYXNzdXJlIHRoaXMuCisgICAgICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXQKKyAgICAgICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLgogCi0gIC8qIEdlbmVyYXRlIGNvdW50cyBmb3IgZWFjaCBiaXQgbGVuZ3RoICovCi0gIHAgPSBjOwotI2RlZmluZSBDMCAqcCsrID0gMDsKLSNkZWZpbmUgQzIgQzAgQzAgQzAgQzAKLSNkZWZpbmUgQzQgQzIgQzIgQzIgQzIKLSAgQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY2xlYXIgY1tdLS1hc3N1bWUgQk1BWCsxIGlzIDE2ICovCi0gIHAgPSBiOyAgaSA9IG47Ci0gIGRvIHsKLSAgICBjWypwKytdKys7ICAgICAgICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KLSAgfSB3aGlsZSAoLS1pKTsKLSAgaWYgKGNbMF0gPT0gbikgICAgICAgICAgICAgICAgLyogbnVsbCBpbnB1dC0tYWxsIHplcm8gbGVuZ3RoIGNvZGVzICovCi0gIHsKLSAgICAqdCA9IE5VTEw7Ci0gICAgKm0gPSAwOwotICAgIHJldHVybiBaX09LOwotICB9CisgICAgICAgVGhlIGNvZGVzIGFyZSBzb3J0ZWQgYnkgY29tcHV0aW5nIGEgY291bnQgb2YgY29kZXMgZm9yIGVhY2ggbGVuZ3RoLAorICAgICAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZQorICAgICAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZAorICAgICAgIHRhYmxlLiAgVGhlIHNvcnRlZCB0YWJsZSBpcyB3b3JrW10sIHdpdGggdGhhdCBzcGFjZSBiZWluZyBwcm92aWRlZCBieQorICAgICAgIHRoZSBjYWxsZXIuCiAKKyAgICAgICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nCisgICAgICAgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RoIGNvZGVzLCBkZXRlcm1pbmluZyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWQKKyAgICAgICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGUKKyAgICAgICBkZWNvZGluZyB0YWJsZXMuCisgICAgICovCiAKLSAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KLSAgbCA9ICptOwotICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKLSAgICBpZiAoY1tqXSkKLSAgICAgIGJyZWFrOwotICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCi0gIGlmICgodUludClsIDwgaikKLSAgICBsID0gajsKLSAgZm9yIChpID0gQk1BWDsgaTsgaS0tKQotICAgIGlmIChjW2ldKQotICAgICAgYnJlYWs7Ci0gIGcgPSBpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gY29kZSBsZW5ndGggKi8KLSAgaWYgKCh1SW50KWwgPiBpKQotICAgIGwgPSBpOwotICAqbSA9IGw7CisgICAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCisgICAgICAgIGNvdW50W2xlbl0gPSAwOworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBjb3VudFtsZW5zW3N5bV1dKys7CiAKKyAgICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqLworICAgIHJvb3QgPSAqYml0czsKKyAgICBmb3IgKG1heCA9IE1BWEJJVFM7IG1heCA+PSAxOyBtYXgtLSkKKyAgICAgICAgaWYgKGNvdW50W21heF0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPiBtYXgpIHJvb3QgPSBtYXg7CisgICAgaWYgKG1heCA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqLworICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpMTsKKyAgICAgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOyAgICAgICAgICAgICAvKiBtYWtlIGEgdGFibGUgdG8gZm9yY2UgYW4gZXJyb3IgKi8KKyAgICAgICAgKigqdGFibGUpKysgPSB0aGlzOworICAgICAgICAqYml0cyA9IDE7CisgICAgICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqLworICAgIH0KKyAgICBmb3IgKG1pbiA9IDE7IG1pbiA8PSBNQVhCSVRTOyBtaW4rKykKKyAgICAgICAgaWYgKGNvdW50W21pbl0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPCBtaW4pIHJvb3QgPSBtaW47CiAKLSAgLyogQWRqdXN0IGxhc3QgbGVuZ3RoIGNvdW50IHRvIGZpbGwgb3V0IGNvZGVzLCBpZiBuZWVkZWQgKi8KLSAgZm9yICh5ID0gMSA8PCBqOyBqIDwgaTsgaisrLCB5IDw8PSAxKQotICAgIGlmICgoeSAtPSBjW2pdKSA8IDApCi0gICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICBpZiAoKHkgLT0gY1tpXSkgPCAwKQotICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0gIGNbaV0gKz0geTsKKyAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KKyAgICBsZWZ0ID0gMTsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICBsZWZ0IC09IGNvdW50W2xlbl07CisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIC0xOyAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovCisgICAgfQorICAgIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PSBDT0RFUyB8fCBtYXggIT0gMSkpCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi8KIAorICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCisgICAgb2Zmc1sxXSA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07CiAKLSAgLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KLSAgeFsxXSA9IGogPSAwOwotICBwID0gYyArIDE7ICB4cCA9IHggKyAyOwotICB3aGlsZSAoLS1pKSB7ICAgICAgICAgICAgICAgICAvKiBub3RlIHRoYXQgaSA9PSBnIGZyb20gYWJvdmUgKi8KLSAgICAqeHArKyA9IChqICs9ICpwKyspOwotICB9CisgICAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqLworICAgIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKQorICAgICAgICBpZiAobGVuc1tzeW1dICE9IDApIHdvcmtbb2Zmc1tsZW5zW3N5bV1dKytdID0gKHVuc2lnbmVkIHNob3J0KXN5bTsKIAorICAgIC8qCisgICAgICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nCisgICAgICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmYKKyAgICAgICB3aXRoIGxlbmd0aCBsZW4uICBUaGF0IGNvZGUgaXMgY29udmVydGVkIHRvIGFuIGluZGV4IGJ5IGRyb3BwaW5nIGRyb3AKKyAgICAgICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsCisgICAgICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0bworICAgICAgIGZpbGwgdGhlIHRhYmxlIHdpdGggcmVwbGljYXRlZCBlbnRyaWVzLgogCi0gIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KLSAgcCA9IGI7ICBpID0gMDsKLSAgZG8gewotICAgIGlmICgoaiA9ICpwKyspICE9IDApCi0gICAgICB2W3hbal0rK10gPSBpOwotICB9IHdoaWxlICgrK2kgPCBuKTsKLSAgbiA9IHhbZ107ICAgICAgICAgICAgICAgICAgICAgLyogc2V0IG4gdG8gbGVuZ3RoIG9mIHYgKi8KKyAgICAgICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzCisgICAgICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXgKKyAgICAgICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYQorICAgICAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpcworICAgICAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC4KIAorICAgICAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlCisgICAgICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGgKKyAgICAgICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZQorICAgICAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy4KIAotICAvKiBHZW5lcmF0ZSB0aGUgSHVmZm1hbiBjb2RlcyBhbmQgZm9yIGVhY2gsIG1ha2UgdGhlIHRhYmxlIGVudHJpZXMgKi8KLSAgeFswXSA9IGkgPSAwOyAgICAgICAgICAgICAgICAgLyogZmlyc3QgSHVmZm1hbiBjb2RlIGlzIHplcm8gKi8KLSAgcCA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JhYiB2YWx1ZXMgaW4gYml0IG9yZGVyICovCi0gIGggPSAtMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHRhYmxlcyB5ZXQtLWxldmVsIC0xICovCi0gIHcgPSAtbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgZGVjb2RlZCA9PSAobCAqIGgpICovCi0gIHVbMF0gPSBOVUxMOyAgICAgICAgICAgICAgICAgIC8qIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KLSAgcSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgLyogZGl0dG8gKi8KLSAgeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKyAgICAgICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZQorICAgICAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgd2hlbiBhIExFTlMgdGFibGUgaXMgYmVpbmcgbWFkZQorICAgICAgIGFnYWluc3QgdGhlIHNwYWNlIGluICp0YWJsZSwgRU5PVUdILCBtaW51cyB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgYnkKKyAgICAgICB0aGUgd29yc3QgY2FzZSBkaXN0YW5jZSBjb2RlLCBNQVhELiAgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgdGhlCisgICAgICAgc3VmZmljaWVuY3kgb2YgRU5PVUdIIGhhcyBub3QgYmVlbiBwcm92ZW4gZXhoYXVzdGl2ZWx5LCBoZW5jZSB0aGUgY2hlY2suCisgICAgICAgVGhpcyBhc3N1bWVzIHRoYXQgd2hlbiB0eXBlID09IExFTlMsIGJpdHMgPT0gOS4KIAotICAvKiBnbyB0aHJvdWdoIHRoZSBiaXQgbGVuZ3RocyAoayBhbHJlYWR5IGlzIGJpdHMgaW4gc2hvcnRlc3QgY29kZSkgKi8KLSAgZm9yICg7IGsgPD0gZzsgaysrKQotICB7Ci0gICAgYSA9IGNba107Ci0gICAgd2hpbGUgKGEtLSkKLSAgICB7Ci0gICAgICAvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLwotICAgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KLSAgICAgIHdoaWxlIChrID4gdyArIGwpCi0gICAgICB7Ci0gICAgICAgIGgrKzsKLSAgICAgICAgdyArPSBsOyAgICAgICAgICAgICAgICAgLyogcHJldmlvdXMgdGFibGUgYWx3YXlzIGwgYml0cyAqLworICAgICAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4KKyAgICAgICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCisgICAgICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxscworICAgICAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy4KKyAgICAgKi8KIAotICAgICAgICAvKiBjb21wdXRlIG1pbmltdW0gc2l6ZSB0YWJsZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gbCBiaXRzICovCi0gICAgICAgIHogPSBnIC0gdzsKLSAgICAgICAgeiA9IHogPiAodUludClsID8gbCA6IHo7ICAgICAgICAvKiB0YWJsZSBzaXplIHVwcGVyIGxpbWl0ICovCi0gICAgICAgIGlmICgoZiA9IDEgPDwgKGogPSBrIC0gdykpID4gYSArIDEpICAgICAvKiB0cnkgYSBrLXcgYml0IHRhYmxlICovCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvbyBmZXcgY29kZXMgZm9yIGstdyBiaXQgdGFibGUgKi8KLSAgICAgICAgICBmIC09IGEgKyAxOyAgICAgICAgICAgLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLwotICAgICAgICAgIHhwID0gYyArIGs7Ci0gICAgICAgICAgaWYgKGogPCB6KQotICAgICAgICAgICAgd2hpbGUgKCsraiA8IHopICAgICAvKiB0cnkgc21hbGxlciB0YWJsZXMgdXAgdG8geiBiaXRzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICgoZiA8PD0gMSkgPD0gKisreHApCi0gICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIGVub3VnaCBjb2RlcyB0byB1c2UgdXAgaiBiaXRzICovCi0gICAgICAgICAgICAgIGYgLT0gKnhwOyAgICAgICAgIC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KLSAgICAgICAgICAgIH0KKyAgICAvKiBzZXQgdXAgZm9yIGNvZGUgdHlwZSAqLworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQ09ERVM6CisgICAgICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqLworICAgICAgICBlbmQgPSAxOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMRU5TOgorICAgICAgICBiYXNlID0gbGJhc2U7CisgICAgICAgIGJhc2UgLT0gMjU3OworICAgICAgICBleHRyYSA9IGxleHQ7CisgICAgICAgIGV4dHJhIC09IDI1NzsKKyAgICAgICAgZW5kID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgIC8qIERJU1RTICovCisgICAgICAgIGJhc2UgPSBkYmFzZTsKKyAgICAgICAgZXh0cmEgPSBkZXh0OworICAgICAgICBlbmQgPSAtMTsKKyAgICB9CisKKyAgICAvKiBpbml0aWFsaXplIHN0YXRlIGZvciBsb29wICovCisgICAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi8KKyAgICBzeW0gPSAwOyAgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBzeW1ib2wgKi8KKyAgICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi8KKyAgICBuZXh0ID0gKnRhYmxlOyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovCisgICAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqLworICAgIGRyb3AgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IGJpdHMgdG8gZHJvcCBmcm9tIGNvZGUgZm9yIGluZGV4ICovCisgICAgbG93ID0gKHVuc2lnbmVkKSgtMSk7ICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi8KKyAgICB1c2VkID0gMVUgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqLworICAgIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovCisKKyAgICAvKiBjaGVjayBhdmFpbGFibGUgdGFibGUgc3BhY2UgKi8KKyAgICBpZiAodHlwZSA9PSBMRU5TICYmIHVzZWQgPj0gRU5PVUdIIC0gTUFYRCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi8KKyAgICAgICAgdGhpcy5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOworICAgICAgICBpZiAoKGludCkod29ya1tzeW1dKSA8IGVuZCkgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTA7CisgICAgICAgICAgICB0aGlzLnZhbCA9IHdvcmtbc3ltXTsKICAgICAgICAgfQotICAgICAgICB6ID0gMSA8PCBqOyAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyaWVzIGZvciBqLWJpdCB0YWJsZSAqLworICAgICAgICBlbHNlIGlmICgoaW50KSh3b3JrW3N5bV0pID4gZW5kKSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKGV4dHJhW3dvcmtbc3ltXV0pOworICAgICAgICAgICAgdGhpcy52YWwgPSBiYXNlW3dvcmtbc3ltXV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpKDMyICsgNjQpOyAgICAgICAgIC8qIGVuZCBvZiBibG9jayAqLworICAgICAgICAgICAgdGhpcy52YWwgPSAwOworICAgICAgICB9CiAKLSAgICAgICAgLyogYWxsb2NhdGUgbmV3IHRhYmxlICovCi0gICAgICAgIGlmICgqaG4gKyB6ID4gTUFOWSkgICAgIC8qIChub3RlOiBkb2Vzbid0IG1hdHRlciBmb3IgZml4ZWQpICovCi0gICAgICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjsgIC8qIG92ZXJmbG93IG9mIE1BTlkgKi8KLSAgICAgICAgdVtoXSA9IHEgPSBocCArICpobjsKLSAgICAgICAgKmhuICs9IHo7CisgICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7CisgICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOworICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBmaWxsIC09IGluY3I7CisgICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOworICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOwogCi0gICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSwgaWYgdGhlcmUgaXMgb25lICovCi0gICAgICAgIGlmIChoKQotICAgICAgICB7Ci0gICAgICAgICAgeFtoXSA9IGk7ICAgICAgICAgICAgIC8qIHNhdmUgcGF0dGVybiBmb3IgYmFja2luZyB1cCAqLwotICAgICAgICAgIHIuYml0cyA9IChCeXRlKWw7ICAgICAvKiBiaXRzIHRvIGR1bXAgYmVmb3JlIHRoaXMgdGFibGUgKi8KLSAgICAgICAgICByLmV4b3AgPSAoQnl0ZSlqOyAgICAgLyogYml0cyBpbiB0aGlzIHRhYmxlICovCi0gICAgICAgICAgaiA9IGkgPj4gKHcgLSBsKTsKLSAgICAgICAgICByLmJhc2UgPSAodUludCkocSAtIHVbaC0xXSAtIGopOyAgIC8qIG9mZnNldCB0byB0aGlzIHRhYmxlICovCi0gICAgICAgICAgdVtoLTFdW2pdID0gcjsgICAgICAgIC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSAqLworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAqdCA9IHE7ICAgICAgICAgICAgICAgLyogZmlyc3QgdGFibGUgaXMgcmV0dXJuZWQgcmVzdWx0ICovCi0gICAgICB9CisgICAgICAgICAgICBodWZmID0gMDsKIAotICAgICAgLyogc2V0IHVwIHRhYmxlIGVudHJ5IGluIHIgKi8KLSAgICAgIHIuYml0cyA9IChCeXRlKShrIC0gdyk7Ci0gICAgICBpZiAocCA+PSB2ICsgbikKLSAgICAgICAgci5leG9wID0gMTI4ICsgNjQ7ICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCi0gICAgICBlbHNlIGlmICgqcCA8IHMpCi0gICAgICB7Ci0gICAgICAgIHIuZXhvcCA9IChCeXRlKSgqcCA8IDI1NiA/IDAgOiAzMiArIDY0KTsgICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgKi8KLSAgICAgICAgci5iYXNlID0gKnArKzsgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgci5leG9wID0gKEJ5dGUpKGVbKnAgLSBzXSArIDE2ICsgNjQpOy8qIG5vbi1zaW1wbGUtLWxvb2sgdXAgaW4gbGlzdHMgKi8KLSAgICAgICAgci5iYXNlID0gZFsqcCsrIC0gc107Ci0gICAgICB9CisgICAgICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqLworICAgICAgICBzeW0rKzsKKyAgICAgICAgaWYgKC0tKGNvdW50W2xlbl0pID09IDApIHsKKyAgICAgICAgICAgIGlmIChsZW4gPT0gbWF4KSBicmVhazsKKyAgICAgICAgICAgIGxlbiA9IGxlbnNbd29ya1tzeW1dXTsKKyAgICAgICAgfQogCi0gICAgICAvKiBmaWxsIGNvZGUtbGlrZSBlbnRyaWVzIHdpdGggciAqLwotICAgICAgZiA9IDEgPDwgKGsgLSB3KTsKLSAgICAgIGZvciAoaiA9IGkgPj4gdzsgaiA8IHo7IGogKz0gZikKLSAgICAgICAgcVtqXSA9IHI7CisgICAgICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqLworICAgICAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovCisgICAgICAgICAgICBpZiAoZHJvcCA9PSAwKQorICAgICAgICAgICAgICAgIGRyb3AgPSByb290OwogCi0gICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBrLWJpdCBjb2RlIGkgKi8KLSAgICAgIGZvciAoaiA9IDEgPDwgKGsgLSAxKTsgaSAmIGo7IGogPj49IDEpCi0gICAgICAgIGkgXj0gajsKLSAgICAgIGkgXj0gajsKKyAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KKyAgICAgICAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqLwogCi0gICAgICAvKiBiYWNrdXAgb3ZlciBmaW5pc2hlZCB0YWJsZXMgKi8KLSAgICAgIG1hc2sgPSAoMSA8PCB3KSAtIDE7ICAgICAgLyogbmVlZGVkIG9uIEhQLCBjYyAtTyBidWcgKi8KLSAgICAgIHdoaWxlICgoaSAmIG1hc2spICE9IHhbaF0pCi0gICAgICB7Ci0gICAgICAgIGgtLTsgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEgKi8KLSAgICAgICAgdyAtPSBsOwotICAgICAgICBtYXNrID0gKDEgPDwgdykgLSAxOwotICAgICAgfQorICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGxlbmd0aCBvZiBuZXh0IHRhYmxlICovCisgICAgICAgICAgICBjdXJyID0gbGVuIC0gZHJvcDsKKyAgICAgICAgICAgIGxlZnQgPSAoaW50KSgxIDw8IGN1cnIpOworICAgICAgICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3VudFtjdXJyICsgZHJvcF07CisgICAgICAgICAgICAgICAgaWYgKGxlZnQgPD0gMCkgYnJlYWs7CisgICAgICAgICAgICAgICAgY3VycisrOworICAgICAgICAgICAgICAgIGxlZnQgPDw9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi8KKyAgICAgICAgICAgIHVzZWQgKz0gMVUgPDwgY3VycjsKKyAgICAgICAgICAgIGlmICh0eXBlID09IExFTlMgJiYgdXNlZCA+PSBFTk9VR0ggLSBNQVhEKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLworICAgICAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLm9wID0gKHVuc2lnbmVkIGNoYXIpY3VycjsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10uYml0cyA9ICh1bnNpZ25lZCBjaGFyKXJvb3Q7CisgICAgICAgICAgICAoKnRhYmxlKVtsb3ddLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkobmV4dCAtICp0YWJsZSk7CisgICAgICAgIH0KICAgICB9Ci0gIH0KIAorICAgIC8qCisgICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCisgICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAorICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50CisgICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCisgICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KKyAgICAgKi8KKyAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICB3aGlsZSAoaHVmZiAhPSAwKSB7CisgICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KKyAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgZHJvcCA9IDA7CisgICAgICAgICAgICBsZW4gPSByb290OworICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKKyAgICAgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKWxlbjsKKyAgICAgICAgfQogCi0gIC8qIFJldHVybiBaX0JVRl9FUlJPUiBpZiB3ZSB3ZXJlIGdpdmVuIGFuIGluY29tcGxldGUgdGFibGUgKi8KLSAgcmV0dXJuIHkgIT0gMCAmJiBnICE9IDEgPyBaX0JVRl9FUlJPUiA6IFpfT0s7Ci19CisgICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCisgICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7CiAKLQotaW50IHpsaWJfaW5mbGF0ZV90cmVlc19iaXRzKAotCXVJbnQgKmMsICAgICAgICAgICAgICAgIC8qIDE5IGNvZGUgbGVuZ3RocyAqLwotCXVJbnQgKmJiLCAgICAgICAgICAgICAgIC8qIGJpdHMgdHJlZSBkZXNpcmVkL2FjdHVhbCBkZXB0aCAqLwotCWluZmxhdGVfaHVmdCAqKnRiLCAgICAgIC8qIGJpdHMgdHJlZSByZXN1bHQgKi8KLQlpbmZsYXRlX2h1ZnQgKmhwLCAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLQl6X3N0cmVhbXAgeiAgICAgICAgICAgICAvKiBmb3IgbWVzc2FnZXMgKi8KLSkKLXsKLSAgaW50IHI7Ci0gIHVJbnQgaG4gPSAwOyAgICAgICAgICAvKiBodWZ0cyB1c2VkIGluIHNwYWNlICovCi0gIHVJbnQgKnY7ICAgICAgICAgICAgICAvKiB3b3JrIGFyZWEgZm9yIGh1ZnRfYnVpbGQgKi8KLSAgCi0gIHYgPSBXUyh6KS0+dHJlZV93b3JrX2FyZWFfMTsKLSAgciA9IGh1ZnRfYnVpbGQoYywgMTksIDE5LCBOVUxMLCBOVUxMLCB0YiwgYmIsIGhwLCAmaG4sIHYpOwotICBpZiAociA9PSBaX0RBVEFfRVJST1IpCi0gICAgei0+bXNnID0gKGNoYXIqKSJvdmVyc3Vic2NyaWJlZCBkeW5hbWljIGJpdCBsZW5ndGhzIHRyZWUiOwotICBlbHNlIGlmIChyID09IFpfQlVGX0VSUk9SIHx8ICpiYiA9PSAwKQotICB7Ci0gICAgei0+bXNnID0gKGNoYXIqKSJpbmNvbXBsZXRlIGR5bmFtaWMgYml0IGxlbmd0aHMgdHJlZSI7Ci0gICAgciA9IFpfREFUQV9FUlJPUjsKLSAgfQotICByZXR1cm4gcjsKLX0KLQotaW50IHpsaWJfaW5mbGF0ZV90cmVlc19keW5hbWljKAotCXVJbnQgbmwsICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLwotCXVJbnQgbmQsICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLwotCXVJbnQgKmMsICAgICAgICAgICAgICAgIC8qIHRoYXQgbWFueSAodG90YWwpIGNvZGUgbGVuZ3RocyAqLwotCXVJbnQgKmJsLCAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0JdUludCAqYmQsICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0JaW5mbGF0ZV9odWZ0ICoqdGwsICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLQlpbmZsYXRlX2h1ZnQgKip0ZCwgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotCWluZmxhdGVfaHVmdCAqaHAsICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwotCXpfc3RyZWFtcCB6ICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotKQotewotICBpbnQgcjsKLSAgdUludCBobiA9IDA7ICAgICAgICAgIC8qIGh1ZnRzIHVzZWQgaW4gc3BhY2UgKi8KLSAgdUludCAqdjsgICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLwotCi0gIC8qIGFsbG9jYXRlIHdvcmsgYXJlYSAqLwotICB2ID0gV1MoeiktPnRyZWVfd29ya19hcmVhXzI7Ci0KLSAgLyogYnVpbGQgbGl0ZXJhbC9sZW5ndGggdHJlZSAqLwotICByID0gaHVmdF9idWlsZChjLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgdGwsIGJsLCBocCwgJmhuLCB2KTsKLSAgaWYgKHIgIT0gWl9PSyB8fCAqYmwgPT0gMCkKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgbGl0ZXJhbC9sZW5ndGggdHJlZSI7Ci0gICAgZWxzZSBpZiAociAhPSBaX01FTV9FUlJPUikKLSAgICB7Ci0gICAgICB6LT5tc2cgPSAoY2hhciopImluY29tcGxldGUgbGl0ZXJhbC9sZW5ndGggdHJlZSI7Ci0gICAgICByID0gWl9EQVRBX0VSUk9SOworICAgICAgICAvKiBiYWNrd2FyZHMgaW5jcmVtZW50IHRoZSBsZW4tYml0IGNvZGUgaHVmZiAqLworICAgICAgICBpbmNyID0gMVUgPDwgKGxlbiAtIDEpOworICAgICAgICB3aGlsZSAoaHVmZiAmIGluY3IpCisgICAgICAgICAgICBpbmNyID4+PSAxOworICAgICAgICBpZiAoaW5jciAhPSAwKSB7CisgICAgICAgICAgICBodWZmICY9IGluY3IgLSAxOworICAgICAgICAgICAgaHVmZiArPSBpbmNyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGh1ZmYgPSAwOwogICAgIH0KLSAgICByZXR1cm4gcjsKLSAgfQogCi0gIC8qIGJ1aWxkIGRpc3RhbmNlIHRyZWUgKi8KLSAgciA9IGh1ZnRfYnVpbGQoYyArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsIHRkLCBiZCwgaHAsICZobiwgdik7Ci0gIGlmIChyICE9IFpfT0sgfHwgKCpiZCA9PSAwICYmIG5sID4gMjU3KSkKLSAgewotICAgIGlmIChyID09IFpfREFUQV9FUlJPUikKLSAgICAgIHotPm1zZyA9IChjaGFyKikib3ZlcnN1YnNjcmliZWQgZGlzdGFuY2UgdHJlZSI7Ci0gICAgZWxzZSBpZiAociA9PSBaX0JVRl9FUlJPUikgewotI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECi0gICAgICByID0gWl9PSzsKLSAgICB9Ci0jZWxzZQotICAgICAgei0+bXNnID0gKGNoYXIqKSJpbmNvbXBsZXRlIGRpc3RhbmNlIHRyZWUiOwotICAgICAgciA9IFpfREFUQV9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZSBpZiAociAhPSBaX01FTV9FUlJPUikKLSAgICB7Ci0gICAgICB6LT5tc2cgPSAoY2hhciopImVtcHR5IGRpc3RhbmNlIHRyZWUgd2l0aCBsZW5ndGhzIjsKLSAgICAgIHIgPSBaX0RBVEFfRVJST1I7Ci0gICAgfQotICAgIHJldHVybiByOwotI2VuZGlmCi0gIH0KLQotICAvKiBkb25lICovCi0gIHJldHVybiBaX09LOwotfQotCi0KLWludCB6bGliX2luZmxhdGVfdHJlZXNfZml4ZWQoCi0JdUludCAqYmwsICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0JdUludCAqYmQsICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotCWluZmxhdGVfaHVmdCAqKnRsLCAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotCWluZmxhdGVfaHVmdCAqKnRkLCAgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotCWluZmxhdGVfaHVmdCAqaHAsICAgICAgIC8qIHNwYWNlIGZvciB0cmVlcyAqLwotCXpfc3RyZWFtcCB6ICAgICAgICAgICAgICAvKiBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKi8KLSkKLXsKLSAgaW50IGk7ICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLwotICB1bnNpZ25lZCBsWzI4OF07ICAgICAgLyogbGVuZ3RoIGxpc3QgZm9yIGh1ZnRfYnVpbGQgKi8KLSAgdUludCAqdjsgICAgICAgICAgICAgIC8qIHdvcmsgYXJlYSBmb3IgaHVmdF9idWlsZCAqLwotCi0gIC8qIHNldCB1cCBsaXRlcmFsIHRhYmxlICovCi0gIGZvciAoaSA9IDA7IGkgPCAxNDQ7IGkrKykKLSAgICBsW2ldID0gODsKLSAgZm9yICg7IGkgPCAyNTY7IGkrKykKLSAgICBsW2ldID0gOTsKLSAgZm9yICg7IGkgPCAyODA7IGkrKykKLSAgICBsW2ldID0gNzsKLSAgZm9yICg7IGkgPCAyODg7IGkrKykgICAgICAgICAgLyogbWFrZSBhIGNvbXBsZXRlLCBidXQgd3JvbmcgY29kZSBzZXQgKi8KLSAgICBsW2ldID0gODsKLSAgKmJsID0gOTsKLSAgdiA9IFdTKHopLT50cmVlX3dvcmtfYXJlYV8xOwotICBpZiAoKGkgPSBodWZ0X2J1aWxkKGwsIDI4OCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgdGwsIGJsLCBocCwgICZpLCB2KSkgIT0gMCkKLSAgICByZXR1cm4gaTsKLQotICAvKiBzZXQgdXAgZGlzdGFuY2UgdGFibGUgKi8KLSAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspICAgICAgLyogbWFrZSBhbiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCi0gICAgbFtpXSA9IDU7Ci0gICpiZCA9IDU7Ci0gIGlmICgoaSA9IGh1ZnRfYnVpbGQobCwgMzAsIDAsIGNwZGlzdCwgY3BkZXh0LCB0ZCwgYmQsIGhwLCAmaSwgdikpID4gMSkKLSAgICByZXR1cm4gaTsKLQotICByZXR1cm4gWl9PSzsKKyAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KKyAgICAqdGFibGUgKz0gdXNlZDsKKyAgICAqYml0cyA9IHJvb3Q7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmggYi9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmgKaW5kZXggZTM3NzA1YS4uNWY1MjE5YiAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5oCisrKyBiL2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuaApAQCAtMSw2ICsxLDYgQEAKIC8qIGluZnRyZWVzLmggLS0gaGVhZGVyIHRvIHVzZSBpbmZ0cmVlcy5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAogICovCiAKIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCkBAIC04LDU3ICs4LDQ4IEBACiAgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCiAgKi8KIAotLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcwotICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLiAqLworLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKKyAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0CisgICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCisgICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKKyAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgorICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKKyAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgorICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKKyAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCisgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKKyAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKKyAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KKyAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KK30gY29kZTsKIAotI2lmbmRlZiBfSU5GVFJFRVNfSAotI2RlZmluZSBfSU5GVFJFRVNfSAotCi10eXBlZGVmIHN0cnVjdCBpbmZsYXRlX2h1ZnRfcyBpbmZsYXRlX2h1ZnQ7Ci0KLXN0cnVjdCBpbmZsYXRlX2h1ZnRfcyB7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgQnl0ZSBFeG9wOyAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCi0gICAgICBCeXRlIEJpdHM7ICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3Igc3ViY29kZSAqLwotICAgIH0gd2hhdDsKLSAgICB1SW50IHBhZDsgICAgICAgICAgIC8qIHBhZCBzdHJ1Y3R1cmUgdG8gYSBwb3dlciBvZiAyICg0IGJ5dGVzIGZvciAqLwotICB9IHdvcmQ7ICAgICAgICAgICAgICAgLyogIDE2LWJpdCwgOCBieXRlcyBmb3IgMzItYml0IGludCdzKSAqLwotICB1SW50IGJhc2U7ICAgICAgICAgICAgLyogbGl0ZXJhbCwgbGVuZ3RoIGJhc2UsIGRpc3RhbmNlIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0YWJsZSBvZmZzZXQgKi8KLX07CisvKiBvcCB2YWx1ZXMgYXMgc2V0IGJ5IGluZmxhdGVfdGFibGUoKToKKyAgICAwMDAwMDAwMCAtIGxpdGVyYWwKKyAgICAwMDAwdHR0dCAtIHRhYmxlIGxpbmssIHR0dHQgIT0gMCBpcyB0aGUgbnVtYmVyIG9mIHRhYmxlIGluZGV4IGJpdHMKKyAgICAwMDAxZWVlZSAtIGxlbmd0aCBvciBkaXN0YW5jZSwgZWVlZSBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMKKyAgICAwMTEwMDAwMCAtIGVuZCBvZiBibG9jaworICAgIDAxMDAwMDAwIC0gaW52YWxpZCBjb2RlCisgKi8KIAogLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQotICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDEwMDQgaHVmdCBzdHJ1Y3R1cmVzICg4NTAgZm9yIGxlbmd0aC9saXRlcmFscwotICAgYW5kIDE1NCBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KLSAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSBhY3R1YWwgbWF4aW11bSBpcyBub3Qga25vd24sIGJ1dCB0aGUKLSAgIHZhbHVlIGJlbG93IGlzIG1vcmUgdGhhbiBzYWZlLiAqLwotI2RlZmluZSBNQU5ZIDE0NDAKKyAgIGV4aGF1c3RpdmUgc2VhcmNoIHdhcyAxNDQ0IGNvZGUgc3RydWN0dXJlcyAoODUyIGZvciBsZW5ndGgvbGl0ZXJhbHMKKyAgIGFuZCA1OTIgZm9yIGRpc3RhbmNlcywgdGhlIGxhdHRlciBhY3R1YWxseSB0aGUgcmVzdWx0IG9mIGFuCisgICBleGhhdXN0aXZlIHNlYXJjaCkuICBUaGUgdHJ1ZSBtYXhpbXVtIGlzIG5vdCBrbm93biwgYnV0IHRoZSB2YWx1ZQorICAgYmVsb3cgaXMgbW9yZSB0aGFuIHNhZmUuICovCisjZGVmaW5lIEVOT1VHSCAyMDQ4CisjZGVmaW5lIE1BWEQgNTkyCiAKLWV4dGVybiBpbnQgemxpYl9pbmZsYXRlX3RyZWVzX2JpdHMgKAotICAgIHVJbnQgKiwgICAgICAgICAgICAgICAgICAgICAvKiAxOSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1SW50ICosICAgICAgICAgICAgICAgICAgICAgLyogYml0cyB0cmVlIGRlc2lyZWQvYWN0dWFsIGRlcHRoICovCi0gICAgaW5mbGF0ZV9odWZ0ICoqLCAgICAgICAgICAgIC8qIGJpdHMgdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0gICAgel9zdHJlYW1wKTsgICAgICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZ0YWJsZSgpICovCit0eXBlZGVmIGVudW0geworICAgIENPREVTLAorICAgIExFTlMsCisgICAgRElTVFMKK30gY29kZXR5cGU7CiAKLWV4dGVybiBpbnQgemxpYl9pbmZsYXRlX3RyZWVzX2R5bmFtaWMgKAotICAgIHVJbnQsICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KLSAgICB1SW50LCAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi0gICAgdUludCAqLCAgICAgICAgICAgICAgICAgICAgIC8qIHRoYXQgbWFueSAodG90YWwpIGNvZGUgbGVuZ3RocyAqLwotICAgIHVJbnQgKiwgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIHVJbnQgKiwgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBkZXNpcmVkL2FjdHVhbCBiaXQgZGVwdGggKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiosICAgICAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiosICAgICAgICAgICAgLyogZGlzdGFuY2UgdHJlZSByZXN1bHQgKi8KLSAgICBpbmZsYXRlX2h1ZnQgKiwgICAgICAgICAgICAgLyogc3BhY2UgZm9yIHRyZWVzICovCi0gICAgel9zdHJlYW1wKTsgICAgICAgICAgICAgICAgIC8qIGZvciBtZXNzYWdlcyAqLwotCi1leHRlcm4gaW50IHpsaWJfaW5mbGF0ZV90cmVlc19maXhlZCAoCi0gICAgdUludCAqLCAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgZGVzaXJlZC9hY3R1YWwgYml0IGRlcHRoICovCi0gICAgdUludCAqLCAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGRlc2lyZWQvYWN0dWFsIGJpdCBkZXB0aCAqLwotICAgIGluZmxhdGVfaHVmdCAqKiwgICAgICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqKiwgICAgICAgICAgICAvKiBkaXN0YW5jZSB0cmVlIHJlc3VsdCAqLwotICAgIGluZmxhdGVfaHVmdCAqLCAgICAgICAgICAgICAvKiBzcGFjZSBmb3IgdHJlZXMgKi8KLSAgICB6X3N0cmVhbXApOyAgICAgICAgICAgICAgICAgLyogZm9yIG1lbW9yeSBhbGxvY2F0aW9uICovCi0KLSNlbmRpZiAvKiBfSU5GVFJFRVNfSCAqLworZXh0ZXJuIGludCB6bGliX2luZmxhdGVfdGFibGUgKGNvZGV0eXBlIHR5cGUsIHVuc2lnbmVkIHNob3J0ICpsZW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb2RlcywgY29kZSAqKnRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqYml0cywgdW5zaWduZWQgc2hvcnQgKndvcmspOwpkaWZmIC0tZ2l0IGEvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmMgYi9saWIvemxpYl9pbmZsYXRlL2luZnV0aWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAyMDJiMy4uMDAwMDAwMAotLS0gYS9saWIvemxpYl9pbmZsYXRlL2luZnV0aWwuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qIGluZmxhdGVfdXRpbC5jIC0tIGRhdGEgYW5kIHJvdXRpbmVzIGNvbW1vbiB0byBibG9ja3MgYW5kIGNvZGVzCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5OCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oIAotICovCi0KLSNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgotI2luY2x1ZGUgImluZmJsb2NrLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZjb2Rlcy5oIgotI2luY2x1ZGUgImluZnV0aWwuaCIKLQotc3RydWN0IGluZmxhdGVfY29kZXNfc3RhdGU7Ci0KLS8qIEFuZCdpbmcgd2l0aCBtYXNrW25dIG1hc2tzIHRoZSBsb3dlciBuIGJpdHMgKi8KLXVJbnQgemxpYl9pbmZsYXRlX21hc2tbMTddID0gewotICAgIDB4MDAwMCwKLSAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKLSAgICAweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgotfTsKLQotCi0vKiBjb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgc2xpZGluZyB3aW5kb3cgdG8gdGhlIG91dHB1dCBhcmVhICovCi1pbnQgemxpYl9pbmZsYXRlX2ZsdXNoKAotCWluZmxhdGVfYmxvY2tzX3N0YXRlZiAqcywKLQl6X3N0cmVhbXAgeiwKLQlpbnQgcgotKQotewotICB1SW50IG47Ci0gIEJ5dGUgKnA7Ci0gIEJ5dGUgKnE7Ci0KLSAgLyogbG9jYWwgY29waWVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMgKi8KLSAgcCA9IHotPm5leHRfb3V0OwotICBxID0gcy0+cmVhZDsKLQotICAvKiBjb21wdXRlIG51bWJlciBvZiBieXRlcyB0byBjb3B5IGFzIGZhciBhcyBlbmQgb2Ygd2luZG93ICovCi0gIG4gPSAodUludCkoKHEgPD0gcy0+d3JpdGUgPyBzLT53cml0ZSA6IHMtPmVuZCkgLSBxKTsKLSAgaWYgKG4gPiB6LT5hdmFpbF9vdXQpIG4gPSB6LT5hdmFpbF9vdXQ7Ci0gIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOwotCi0gIC8qIHVwZGF0ZSBjb3VudGVycyAqLwotICB6LT5hdmFpbF9vdXQgLT0gbjsKLSAgei0+dG90YWxfb3V0ICs9IG47Ci0KLSAgLyogdXBkYXRlIGNoZWNrIGluZm9ybWF0aW9uICovCi0gIGlmIChzLT5jaGVja2ZuICE9IE5VTEwpCi0gICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikocy0+Y2hlY2ssIHEsIG4pOwotCi0gIC8qIGNvcHkgYXMgZmFyIGFzIGVuZCBvZiB3aW5kb3cgKi8KLSAgbWVtY3B5KHAsIHEsIG4pOwotICBwICs9IG47Ci0gIHEgKz0gbjsKLQotICAvKiBzZWUgaWYgbW9yZSB0byBjb3B5IGF0IGJlZ2lubmluZyBvZiB3aW5kb3cgKi8KLSAgaWYgKHEgPT0gcy0+ZW5kKQotICB7Ci0gICAgLyogd3JhcCBwb2ludGVycyAqLwotICAgIHEgPSBzLT53aW5kb3c7Ci0gICAgaWYgKHMtPndyaXRlID09IHMtPmVuZCkKLSAgICAgIHMtPndyaXRlID0gcy0+d2luZG93OwotCi0gICAgLyogY29tcHV0ZSBieXRlcyB0byBjb3B5ICovCi0gICAgbiA9ICh1SW50KShzLT53cml0ZSAtIHEpOwotICAgIGlmIChuID4gei0+YXZhaWxfb3V0KSBuID0gei0+YXZhaWxfb3V0OwotICAgIGlmIChuICYmIHIgPT0gWl9CVUZfRVJST1IpIHIgPSBaX09LOwotCi0gICAgLyogdXBkYXRlIGNvdW50ZXJzICovCi0gICAgei0+YXZhaWxfb3V0IC09IG47Ci0gICAgei0+dG90YWxfb3V0ICs9IG47Ci0KLSAgICAvKiB1cGRhdGUgY2hlY2sgaW5mb3JtYXRpb24gKi8KLSAgICBpZiAocy0+Y2hlY2tmbiAhPSBOVUxMKQotICAgICAgei0+YWRsZXIgPSBzLT5jaGVjayA9ICgqcy0+Y2hlY2tmbikocy0+Y2hlY2ssIHEsIG4pOwotCi0gICAgLyogY29weSAqLwotICAgIG1lbWNweShwLCBxLCBuKTsKLSAgICBwICs9IG47Ci0gICAgcSArPSBuOwotICB9Ci0KLSAgLyogdXBkYXRlIHBvaW50ZXJzICovCi0gIHotPm5leHRfb3V0ID0gcDsKLSAgcy0+cmVhZCA9IHE7Ci0KLSAgLyogZG9uZSAqLwotICByZXR1cm4gcjsKLX0KZGlmZiAtLWdpdCBhL2xpYi96bGliX2luZmxhdGUvaW5mdXRpbC5oIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmgKaW5kZXggYTE1ODc1Zi4uZWIxYTkwMCAxMDA2NDQKLS0tIGEvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmgKKysrIGIvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmgKQEAgLTExLDE4NCArMTEsMTIgQEAKICNpZm5kZWYgX0lORlVUSUxfSAogI2RlZmluZSBfSU5GVVRJTF9ICiAKLSNpbmNsdWRlIDxsaW51eC96Y29uZi5oPgotI2luY2x1ZGUgImluZnRyZWVzLmgiCi0jaW5jbHVkZSAiaW5mY29kZXMuaCIKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAgIFRZUEUsICAgICAvKiBnZXQgdHlwZSBiaXRzICgzLCBpbmNsdWRpbmcgZW5kIGJpdCkgKi8KLSAgICAgIExFTlMsICAgICAvKiBnZXQgbGVuZ3RocyBmb3Igc3RvcmVkICovCi0gICAgICBTVE9SRUQsICAgLyogcHJvY2Vzc2luZyBzdG9yZWQgYmxvY2sgKi8KLSAgICAgIFRBQkxFLCAgICAvKiBnZXQgdGFibGUgbGVuZ3RocyAqLwotICAgICAgQlRSRUUsICAgIC8qIGdldCBiaXQgbGVuZ3RocyB0cmVlIGZvciBhIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgIERUUkVFLCAgICAvKiBnZXQgbGVuZ3RoLCBkaXN0YW5jZSB0cmVlcyBmb3IgYSBkeW5hbWljIGJsb2NrICovCi0gICAgICBDT0RFUywgICAgLyogcHJvY2Vzc2luZyBmaXhlZCBvciBkeW5hbWljIGJsb2NrICovCi0gICAgICBEUlksICAgICAgLyogb3V0cHV0IHJlbWFpbmluZyB3aW5kb3cgYnl0ZXMgKi8KLSAgICAgIEJfRE9ORSwgICAvKiBmaW5pc2hlZCBsYXN0IGJsb2NrLCBkb25lICovCi0gICAgICBCX0JBRH0gICAgLyogZ290IGEgZGF0YSBlcnJvci0tc3R1Y2sgaGVyZSAqLwotaW5mbGF0ZV9ibG9ja19tb2RlOwotCi0vKiBpbmZsYXRlIGJsb2NrcyBzZW1pLXByaXZhdGUgc3RhdGUgKi8KLXN0cnVjdCBpbmZsYXRlX2Jsb2Nrc19zdGF0ZSB7Ci0KLSAgLyogbW9kZSAqLwotICBpbmZsYXRlX2Jsb2NrX21vZGUgIG1vZGU7ICAgICAvKiBjdXJyZW50IGluZmxhdGVfYmxvY2sgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVuaW9uIHsKLSAgICB1SW50IGxlZnQ7ICAgICAgICAgIC8qIGlmIFNUT1JFRCwgYnl0ZXMgbGVmdCB0byBjb3B5ICovCi0gICAgc3RydWN0IHsKLSAgICAgIHVJbnQgdGFibGU7ICAgICAgICAgICAgICAgLyogdGFibGUgbGVuZ3RocyAoMTQgYml0cykgKi8KLSAgICAgIHVJbnQgaW5kZXg7ICAgICAgICAgICAgICAgLyogaW5kZXggaW50byBibGVucyAob3IgYm9yZGVyKSAqLwotICAgICAgdUludCAqYmxlbnM7ICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RocyBvZiBjb2RlcyAqLwotICAgICAgdUludCBiYjsgICAgICAgICAgICAgICAgICAvKiBiaXQgbGVuZ3RoIHRyZWUgZGVwdGggKi8KLSAgICAgIGluZmxhdGVfaHVmdCAqdGI7ICAgICAgICAgLyogYml0IGxlbmd0aCBkZWNvZGluZyB0cmVlICovCi0gICAgfSB0cmVlczsgICAgICAgICAgICAvKiBpZiBEVFJFRSwgZGVjb2RpbmcgaW5mbyBmb3IgdHJlZXMgKi8KLSAgICBzdHJ1Y3QgewotICAgICAgaW5mbGF0ZV9jb2Rlc19zdGF0ZWYgCi0gICAgICAgICAqY29kZXM7Ci0gICAgfSBkZWNvZGU7ICAgICAgICAgICAvKiBpZiBDT0RFUywgY3VycmVudCBzdGF0ZSAqLwotICB9IHN1YjsgICAgICAgICAgICAgICAgLyogc3VibW9kZSAqLwotICB1SW50IGxhc3Q7ICAgICAgICAgICAgLyogdHJ1ZSBpZiB0aGlzIGJsb2NrIGlzIHRoZSBsYXN0IGJsb2NrICovCi0KLSAgLyogbW9kZSBpbmRlcGVuZGVudCBpbmZvcm1hdGlvbiAqLwotICB1SW50IGJpdGs7ICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCi0gIHVMb25nIGJpdGI7ICAgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gIGluZmxhdGVfaHVmdCAqaHVmdHM7ICAvKiBzaW5nbGUgbWFsbG9jIGZvciB0cmVlIHNwYWNlICovCi0gIEJ5dGUgKndpbmRvdzsgICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICBCeXRlICplbmQ7ICAgICAgICAgICAgLyogb25lIGJ5dGUgYWZ0ZXIgc2xpZGluZyB3aW5kb3cgKi8KLSAgQnl0ZSAqcmVhZDsgICAgICAgICAgIC8qIHdpbmRvdyByZWFkIHBvaW50ZXIgKi8KLSAgQnl0ZSAqd3JpdGU7ICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBwb2ludGVyICovCi0gIGNoZWNrX2Z1bmMgY2hlY2tmbjsgICAvKiBjaGVjayBmdW5jdGlvbiAqLwotICB1TG9uZyBjaGVjazsgICAgICAgICAgLyogY2hlY2sgb24gb3V0cHV0ICovCi0KLX07Ci0KLQotLyogZGVmaW5lcyBmb3IgaW5mbGF0ZSBpbnB1dC9vdXRwdXQgKi8KLS8qICAgdXBkYXRlIHBvaW50ZXJzIGFuZCByZXR1cm4gKi8KLSNkZWZpbmUgVVBEQklUUyB7cy0+Yml0Yj1iO3MtPmJpdGs9azt9Ci0jZGVmaW5lIFVQRElOIHt6LT5hdmFpbF9pbj1uO3otPnRvdGFsX2luKz1wLXotPm5leHRfaW47ei0+bmV4dF9pbj1wO30KLSNkZWZpbmUgVVBET1VUIHtzLT53cml0ZT1xO30KLSNkZWZpbmUgVVBEQVRFIHtVUERCSVRTIFVQRElOIFVQRE9VVH0KLSNkZWZpbmUgTEVBVkUge1VQREFURSByZXR1cm4gemxpYl9pbmZsYXRlX2ZsdXNoKHMseixyKTt9Ci0vKiAgIGdldCBieXRlcyBhbmQgYml0cyAqLwotI2RlZmluZSBMT0FESU4ge3A9ei0+bmV4dF9pbjtuPXotPmF2YWlsX2luO2I9cy0+Yml0YjtrPXMtPmJpdGs7fQotI2RlZmluZSBORUVEQllURSB7aWYobilyPVpfT0s7ZWxzZSBMRUFWRX0KLSNkZWZpbmUgTkVYVEJZVEUgKG4tLSwqcCsrKQotI2RlZmluZSBORUVEQklUUyhqKSB7d2hpbGUoazwoaikpe05FRURCWVRFO2J8PSgodUxvbmcpTkVYVEJZVEUpPDxrO2srPTg7fX0KLSNkZWZpbmUgRFVNUEJJVFMoaikge2I+Pj0oaik7ay09KGopO30KLS8qICAgb3V0cHV0IGJ5dGVzICovCi0jZGVmaW5lIFdBVkFJTCAodUludCkocTxzLT5yZWFkP3MtPnJlYWQtcS0xOnMtPmVuZC1xKQotI2RlZmluZSBMT0FET1VUIHtxPXMtPndyaXRlO209KHVJbnQpV0FWQUlMO30KLSNkZWZpbmUgV1JBUCB7aWYocT09cy0+ZW5kJiZzLT5yZWFkIT1zLT53aW5kb3cpe3E9cy0+d2luZG93O209KHVJbnQpV0FWQUlMO319Ci0jZGVmaW5lIEZMVVNIIHtVUERPVVQgcj16bGliX2luZmxhdGVfZmx1c2gocyx6LHIpOyBMT0FET1VUfQotI2RlZmluZSBORUVET1VUIHtpZihtPT0wKXtXUkFQIGlmKG09PTApe0ZMVVNIIFdSQVAgaWYobT09MCkgTEVBVkV9fXI9Wl9PSzt9Ci0jZGVmaW5lIE9VVEJZVEUoYSkgeypxKys9KEJ5dGUpKGEpO20tLTt9Ci0vKiAgIGxvYWQgbG9jYWwgcG9pbnRlcnMgKi8KLSNkZWZpbmUgTE9BRCB7TE9BRElOIExPQURPVVR9Ci0KLS8qIG1hc2tzIGZvciBsb3dlciBiaXRzIChzaXplIGdpdmVuIHRvIGF2b2lkIHNpbGx5IHdhcm5pbmdzIHdpdGggVmlzdWFsIEMrKykgKi8KLWV4dGVybiB1SW50IHpsaWJfaW5mbGF0ZV9tYXNrWzE3XTsKLQotLyogY29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gdGhlIHNsaWRpbmcgd2luZG93IHRvIHRoZSBvdXRwdXQgYXJlYSAqLwotZXh0ZXJuIGludCB6bGliX2luZmxhdGVfZmx1c2ggKAotICAgIGluZmxhdGVfYmxvY2tzX3N0YXRlZiAqLAotICAgIHpfc3RyZWFtcCAsCi0gICAgaW50KTsKLQotLyogaW5mbGF0ZSBwcml2YXRlIHN0YXRlICovCi10eXBlZGVmIGVudW0gewotICAgICAgTUVUSE9ELCAgIC8qIHdhaXRpbmcgZm9yIG1ldGhvZCBieXRlICovCi0gICAgICBGTEFHLCAgICAgLyogd2FpdGluZyBmb3IgZmxhZyBieXRlICovCi0gICAgICBESUNUNCwgICAgLyogZm91ciBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMywgICAgLyogdGhyZWUgZGljdGlvbmFyeSBjaGVjayBieXRlcyB0byBnbyAqLwotICAgICAgRElDVDIsICAgIC8qIHR3byBkaWN0aW9uYXJ5IGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBESUNUMSwgICAgLyogb25lIGRpY3Rpb25hcnkgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgRElDVDAsICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5ICovCi0gICAgICBCTE9DS1MsICAgLyogZGVjb21wcmVzc2luZyBibG9ja3MgKi8KLSAgICAgIENIRUNLNCwgICAvKiBmb3VyIGNoZWNrIGJ5dGVzIHRvIGdvICovCi0gICAgICBDSEVDSzMsICAgLyogdGhyZWUgY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMiwgICAvKiB0d28gY2hlY2sgYnl0ZXMgdG8gZ28gKi8KLSAgICAgIENIRUNLMSwgICAvKiBvbmUgY2hlY2sgYnl0ZSB0byBnbyAqLwotICAgICAgSV9ET05FLCAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lICovCi0gICAgICBJX0JBRH0gICAgLyogZ290IGFuIGVycm9yLS1zdGF5IGhlcmUgKi8KLWluZmxhdGVfbW9kZTsKLQotc3RydWN0IGludGVybmFsX3N0YXRlIHsKLQotICAvKiBtb2RlICovCi0gIGluZmxhdGVfbW9kZSAgbW9kZTsgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVuaW9uIHsKLSAgICB1SW50IG1ldGhvZDsgICAgICAgIC8qIGlmIEZMQUdTLCBtZXRob2QgYnl0ZSAqLwotICAgIHN0cnVjdCB7Ci0gICAgICB1TG9uZyB3YXM7ICAgICAgICAgICAgICAgIC8qIGNvbXB1dGVkIGNoZWNrIHZhbHVlICovCi0gICAgICB1TG9uZyBuZWVkOyAgICAgICAgICAgICAgIC8qIHN0cmVhbSBjaGVjayB2YWx1ZSAqLwotICAgIH0gY2hlY2s7ICAgICAgICAgICAgLyogaWYgQ0hFQ0ssIGNoZWNrIHZhbHVlcyB0byBjb21wYXJlICovCi0gICAgdUludCBtYXJrZXI7ICAgICAgICAvKiBpZiBCQUQsIGluZmxhdGVTeW5jJ3MgbWFya2VyIGJ5dGVzIGNvdW50ICovCi0gIH0gc3ViOyAgICAgICAgLyogc3VibW9kZSAqLwotCi0gIC8qIG1vZGUgaW5kZXBlbmRlbnQgaW5mb3JtYXRpb24gKi8KLSAgaW50ICBub3dyYXA7ICAgICAgICAgIC8qIGZsYWcgZm9yIG5vIHdyYXBwZXIgKi8KLSAgdUludCB3Yml0czsgICAgICAgICAgIC8qIGxvZzIod2luZG93IHNpemUpICAoOC4uMTUsIGRlZmF1bHRzIHRvIDE1KSAqLwotICBpbmZsYXRlX2Jsb2Nrc19zdGF0ZWYgCi0gICAgKmJsb2NrczsgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGVfYmxvY2tzIHN0YXRlICovCi0KLX07Ci0KLS8qIGluZmxhdGUgY29kZXMgcHJpdmF0ZSBzdGF0ZSAqLwotdHlwZWRlZiBlbnVtIHsgICAgICAgIC8qIHdhaXRpbmcgZm9yICJpOiI9aW5wdXQsICJvOiI9b3V0cHV0LCAieDoiPW5vdGhpbmcgKi8KLSAgICAgIFNUQVJULCAgICAvKiB4OiBzZXQgdXAgZm9yIExFTiAqLwotICAgICAgTEVOLCAgICAgIC8qIGk6IGdldCBsZW5ndGgvbGl0ZXJhbC9lb2IgbmV4dCAqLwotICAgICAgTEVORVhULCAgIC8qIGk6IGdldHRpbmcgbGVuZ3RoIGV4dHJhIChoYXZlIGJhc2UpICovCi0gICAgICBESVNULCAgICAgLyogaTogZ2V0IGRpc3RhbmNlIG5leHQgKi8KLSAgICAgIERJU1RFWFQsICAvKiBpOiBnZXR0aW5nIGRpc3RhbmNlIGV4dHJhICovCi0gICAgICBDT1BZLCAgICAgLyogbzogY29weWluZyBieXRlcyBpbiB3aW5kb3csIHdhaXRpbmcgZm9yIHNwYWNlICovCi0gICAgICBMSVQsICAgICAgLyogbzogZ290IGxpdGVyYWwsIHdhaXRpbmcgZm9yIG91dHB1dCBzcGFjZSAqLwotICAgICAgV0FTSCwgICAgIC8qIG86IGdvdCBlb2IsIHBvc3NpYmx5IHN0aWxsIG91dHB1dCB3YWl0aW5nICovCi0gICAgICBFTkQsICAgICAgLyogeDogZ290IGVvYiBhbmQgYWxsIGRhdGEgZmx1c2hlZCAqLwotICAgICAgQkFEQ09ERX0gIC8qIHg6IGdvdCBlcnJvciAqLwotaW5mbGF0ZV9jb2Rlc19tb2RlOwotCi1zdHJ1Y3QgaW5mbGF0ZV9jb2Rlc19zdGF0ZSB7Ci0KLSAgLyogbW9kZSAqLwotICBpbmZsYXRlX2NvZGVzX21vZGUgbW9kZTsgICAgICAvKiBjdXJyZW50IGluZmxhdGVfY29kZXMgbW9kZSAqLwotCi0gIC8qIG1vZGUgZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIHVJbnQgbGVuOwotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIGluZmxhdGVfaHVmdCAqdHJlZTsgICAgICAgLyogcG9pbnRlciBpbnRvIHRyZWUgKi8KLSAgICAgIHVJbnQgbmVlZDsgICAgICAgICAgICAgICAgLyogYml0cyBuZWVkZWQgKi8KLSAgICB9IGNvZGU7ICAgICAgICAgICAgIC8qIGlmIExFTiBvciBESVNULCB3aGVyZSBpbiB0cmVlICovCi0gICAgdUludCBsaXQ7ICAgICAgICAgICAvKiBpZiBMSVQsIGxpdGVyYWwgKi8KLSAgICBzdHJ1Y3QgewotICAgICAgdUludCBnZXQ7ICAgICAgICAgICAgICAgICAvKiBiaXRzIHRvIGdldCBmb3IgZXh0cmEgKi8KLSAgICAgIHVJbnQgZGlzdDsgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IGZyb20gKi8KLSAgICB9IGNvcHk7ICAgICAgICAgICAgIC8qIGlmIEVYVCBvciBDT1BZLCB3aGVyZSBhbmQgaG93IG11Y2ggKi8KLSAgfSBzdWI7ICAgICAgICAgICAgICAgIC8qIHN1Ym1vZGUgKi8KLQotICAvKiBtb2RlIGluZGVwZW5kZW50IGluZm9ybWF0aW9uICovCi0gIEJ5dGUgbGJpdHM7ICAgICAgICAgICAvKiBsdHJlZSBiaXRzIGRlY29kZWQgcGVyIGJyYW5jaCAqLwotICBCeXRlIGRiaXRzOyAgICAgICAgICAgLyogZHRyZWUgYml0cyBkZWNvZGVyIHBlciBicmFuY2ggKi8KLSAgaW5mbGF0ZV9odWZ0ICpsdHJlZTsgICAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGgvZW9iIHRyZWUgKi8KLSAgaW5mbGF0ZV9odWZ0ICpkdHJlZTsgICAgICAgICAgLyogZGlzdGFuY2UgdHJlZSAqLwotCi19OworI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KIAogLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluZmxhdGlvbiAqLwogCiBzdHJ1Y3QgaW5mbGF0ZV93b3Jrc3BhY2UgewotCWluZmxhdGVfY29kZXNfc3RhdGVmIHdvcmtpbmdfc3RhdGU7Ci0Jc3RydWN0IGluZmxhdGVfYmxvY2tzX3N0YXRlIHdvcmtpbmdfYmxvY2tzX3N0YXRlOwotCXN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBpbnRlcm5hbF9zdGF0ZTsKLQl1bnNpZ25lZCBpbnQgdHJlZV93b3JrX2FyZWFfMVsxOV07Ci0JdW5zaWduZWQgaW50IHRyZWVfd29ya19hcmVhXzJbMjg4XTsKLQl1bnNpZ25lZCB3b3JraW5nX2JsZW5zWzI1OCArIDB4MWYgKyAweDFmXTsKLQlpbmZsYXRlX2h1ZnQgd29ya2luZ19odWZ0c1tNQU5ZXTsKKwlzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBpbmZsYXRlX3N0YXRlOwogCXVuc2lnbmVkIGNoYXIgd29ya2luZ193aW5kb3dbMSA8PCBNQVhfV0JJVFNdOwogfTsKIApkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggMzMyZjVjMi4uNjZlNjVhYiAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xMzgsOCArMTM4LDggQEAKICMKIGNvbmZpZyBNSUdSQVRJT04KIAlib29sICJQYWdlIG1pZ3JhdGlvbiIKLQlkZWZfYm9vbCB5IGlmIE5VTUEKLQlkZXBlbmRzIG9uIFNXQVAgJiYgTlVNQQorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIE5VTUEKIAloZWxwCiAJICBBbGxvd3MgdGhlIG1pZ3JhdGlvbiBvZiB0aGUgcGh5c2ljYWwgbG9jYXRpb24gb2YgcGFnZXMgb2YgcHJvY2Vzc2VzCiAJICB3aGlsZSB0aGUgdmlydHVhbCBhZGRyZXNzZXMgYXJlIG5vdCBjaGFuZ2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBmZDU3NDQyLi45YzczMzRiIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CkBAIC0zOCw3ICszOSw2IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPiAvKiBmb3IgZ2VuZXJpY19vc3luY19pbm9kZSAqLwogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vbW1hbi5oPgogCiBzdGF0aWMgc3NpemVfdApAQCAtMTcxLDE1ICsxNzEsMTcgQEAKIH0KIAogLyoqCi0gKiBmaWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UgLSBzdGFydCB3cml0ZWJhY2sgYWdhaW5zdCBhbGwgb2YgYSBtYXBwaW5nJ3MKLSAqIGRpcnR5IHBhZ2VzIHRoYXQgbGllIHdpdGhpbiB0aGUgYnl0ZSBvZmZzZXRzIDxzdGFydCwgZW5kPgorICogX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UgLSBzdGFydCB3cml0ZWJhY2sgb24gbWFwcGluZyBkaXJ0eSBwYWdlcyBpbiByYW5nZQogICogQG1hcHBpbmc6CWFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlIHRvIHdyaXRlCiAgKiBAc3RhcnQ6CW9mZnNldCBpbiBieXRlcyB3aGVyZSB0aGUgcmFuZ2Ugc3RhcnRzCiAgKiBAZW5kOglvZmZzZXQgaW4gYnl0ZXMgd2hlcmUgdGhlIHJhbmdlIGVuZHMgKGluY2x1c2l2ZSkKICAqIEBzeW5jX21vZGU6CWVuYWJsZSBzeW5jaHJvbm91cyBvcGVyYXRpb24KICAqCisgKiBTdGFydCB3cml0ZWJhY2sgYWdhaW5zdCBhbGwgb2YgYSBtYXBwaW5nJ3MgZGlydHkgcGFnZXMgdGhhdCBsaWUKKyAqIHdpdGhpbiB0aGUgYnl0ZSBvZmZzZXRzIDxzdGFydCwgZW5kPiBpbmNsdXNpdmUuCisgKgogICogSWYgc3luY19tb2RlIGlzIFdCX1NZTkNfQUxMIHRoZW4gdGhpcyBpcyBhICJkYXRhIGludGVncml0eSIgb3BlcmF0aW9uLCBhcwotICogb3Bwb3NlZCB0byBhIHJlZ3VsYXIgbWVtb3J5ICogY2xlYW5zaW5nIHdyaXRlYmFjay4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAqIG9wcG9zZWQgdG8gYSByZWd1bGFyIG1lbW9yeSBjbGVhbnNpbmcgd3JpdGViYWNrLiAgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbgogICogdGhlc2UgdHdvIG9wZXJhdGlvbnMgaXMgdGhhdCBpZiBhIGRpcnR5IHBhZ2UvYnVmZmVyIGlzIGVuY291bnRlcmVkLCBpdCBtdXN0CiAgKiBiZSB3YWl0ZWQgdXBvbiwgYW5kIG5vdCBqdXN0IHNraXBwZWQgb3Zlci4KICAqLwpAQCAtMTkwLDggKzE5Miw4IEBACiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYyA9IHsKIAkJLnN5bmNfbW9kZSA9IHN5bmNfbW9kZSwKIAkJLm5yX3RvX3dyaXRlID0gbWFwcGluZy0+bnJwYWdlcyAqIDIsCi0JCS5zdGFydCA9IHN0YXJ0LAotCQkuZW5kID0gZW5kLAorCQkucmFuZ2Vfc3RhcnQgPSBzdGFydCwKKwkJLnJhbmdlX2VuZCA9IGVuZCwKIAl9OwogCiAJaWYgKCFtYXBwaW5nX2NhcF93cml0ZWJhY2tfZGlydHkobWFwcGluZykpCkBAIC0yMDQsNyArMjA2LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50IF9fZmlsZW1hcF9mZGF0YXdyaXRlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCWludCBzeW5jX21vZGUpCiB7Ci0JcmV0dXJuIF9fZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIDAsIDAsIHN5bmNfbW9kZSk7CisJcmV0dXJuIF9fZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKG1hcHBpbmcsIDAsIExMT05HX01BWCwgc3luY19tb2RlKTsKIH0KIAogaW50IGZpbGVtYXBfZmRhdGF3cml0ZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKQEAgLTIxOSw3ICsyMjEsMTAgQEAKIAlyZXR1cm4gX19maWxlbWFwX2ZkYXRhd3JpdGVfcmFuZ2UobWFwcGluZywgc3RhcnQsIGVuZCwgV0JfU1lOQ19BTEwpOwogfQogCi0vKgorLyoqCisgKiBmaWxlbWFwX2ZsdXNoIC0gbW9zdGx5IGEgbm9uLWJsb2NraW5nIGZsdXNoCisgKiBAbWFwcGluZzoJdGFyZ2V0IGFkZHJlc3Nfc3BhY2UKKyAqCiAgKiBUaGlzIGlzIGEgbW9zdGx5IG5vbi1ibG9ja2luZyBmbHVzaC4gIE5vdCBzdWl0YWJsZSBmb3IgZGF0YS1pbnRlZ3JpdHkKICAqIHB1cnBvc2VzIC0gSS9PIG1heSBub3QgYmUgc3RhcnRlZCBhZ2FpbnN0IGFsbCBkaXJ0eSBwYWdlcy4KICAqLwpAQCAtMjI5LDcgKzIzNCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChmaWxlbWFwX2ZsdXNoKTsKIAotLyoKKy8qKgorICogd2FpdF9vbl9wYWdlX3dyaXRlYmFja19yYW5nZSAtIHdhaXQgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZQorICogQG1hcHBpbmc6CXRhcmdldCBhZGRyZXNzX3NwYWNlCisgKiBAc3RhcnQ6CWJlZ2lubmluZyBwYWdlIGluZGV4CisgKiBAZW5kOgllbmRpbmcgcGFnZSBpbmRleAorICoKICAqIFdhaXQgZm9yIHdyaXRlYmFjayB0byBjb21wbGV0ZSBhZ2FpbnN0IHBhZ2VzIGluZGV4ZWQgYnkgc3RhcnQtPmVuZAogICogaW5jbHVzaXZlCiAgKi8KQEAgLTI3Niw3ICsyODYsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgorLyoqCisgKiBzeW5jX3BhZ2VfcmFuZ2UgLSB3cml0ZSBhbmQgd2FpdCBvbiBhbGwgcGFnZXMgaW4gdGhlIHBhc3NlZCByYW5nZQorICogQGlub2RlOgl0YXJnZXQgaW5vZGUKKyAqIEBtYXBwaW5nOgl0YXJnZXQgYWRkcmVzc19zcGFjZQorICogQHBvczoJYmVnaW5uaW5nIG9mZnNldCBpbiBwYWdlcyB0byB3cml0ZQorICogQGNvdW50OgludW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqCiAgKiBXcml0ZSBhbmQgd2FpdCB1cG9uIGFsbCB0aGUgcGFnZXMgaW4gdGhlIHBhc3NlZCByYW5nZS4gIFRoaXMgaXMgYSAiZGF0YQogICogaW50ZWdyaXR5IiBvcGVyYXRpb24uICBJdCB3YWl0cyB1cG9uIGluLWZsaWdodCB3cml0ZW91dCBiZWZvcmUgc3RhcnRpbmcgYW5kCiAgKiB3YWl0aW5nIHVwb24gbmV3IHdyaXRlb3V0LiAgSWYgdGhlcmUgd2FzIGFuIElPIGVycm9yLCByZXR1cm4gaXQuCkBAIC0zMDUsNyArMzIxLDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MKHN5bmNfcGFnZV9yYW5nZSk7CiAKLS8qCisvKioKKyAqIHN5bmNfcGFnZV9yYW5nZV9ub2xvY2sKKyAqIEBpbm9kZToJdGFyZ2V0IGlub2RlCisgKiBAbWFwcGluZzoJdGFyZ2V0IGFkZHJlc3Nfc3BhY2UKKyAqIEBwb3M6CWJlZ2lubmluZyBvZmZzZXQgaW4gcGFnZXMgdG8gd3JpdGUKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCisgKgogICogTm90ZTogSG9sZGluZyBpX211dGV4IGFjcm9zcyBzeW5jX3BhZ2VfcmFuZ2Vfbm9sb2NrIGlzIG5vdCBhIGdvb2QgaWRlYQogICogYXMgaXQgZm9yY2VzIE9fU1lOQyB3cml0ZXJzIHRvIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgc2FtZSBmaWxlCiAgKiB0byBiZSBzZXJpYWxpc2VkIHJpZ2h0IHVudGlsIGlvIGNvbXBsZXRpb24uCkBAIC0zMjksMTAgKzM1MSwxMSBAQAogRVhQT1JUX1NZTUJPTChzeW5jX3BhZ2VfcmFuZ2Vfbm9sb2NrKTsKIAogLyoqCi0gKiBmaWxlbWFwX2ZkYXRhd2FpdCAtIHdhbGsgdGhlIGxpc3Qgb2YgdW5kZXItd3JpdGViYWNrIHBhZ2VzIG9mIHRoZSBnaXZlbgotICogICAgIGFkZHJlc3Mgc3BhY2UgYW5kIHdhaXQgZm9yIGFsbCBvZiB0aGVtLgotICoKKyAqIGZpbGVtYXBfZmRhdGF3YWl0IC0gd2FpdCBmb3IgYWxsIHVuZGVyLXdyaXRlYmFjayBwYWdlcyB0byBjb21wbGV0ZQogICogQG1hcHBpbmc6IGFkZHJlc3Mgc3BhY2Ugc3RydWN0dXJlIHRvIHdhaXQgZm9yCisgKgorICogV2FsayB0aGUgbGlzdCBvZiB1bmRlci13cml0ZWJhY2sgcGFnZXMgb2YgdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UKKyAqIGFuZCB3YWl0IGZvciBhbGwgb2YgdGhlbS4KICAqLwogaW50IGZpbGVtYXBfZmRhdGF3YWl0KHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQogewpAQCAtMzY4LDcgKzM5MSwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChmaWxlbWFwX3dyaXRlX2FuZF93YWl0KTsKIAotLyoKKy8qKgorICogZmlsZW1hcF93cml0ZV9hbmRfd2FpdF9yYW5nZSAtIHdyaXRlIG91dCAmIHdhaXQgb24gYSBmaWxlIHJhbmdlCisgKiBAbWFwcGluZzoJdGhlIGFkZHJlc3Nfc3BhY2UgZm9yIHRoZSBwYWdlcworICogQGxzdGFydDoJb2Zmc2V0IGluIGJ5dGVzIHdoZXJlIHRoZSByYW5nZSBzdGFydHMKKyAqIEBsZW5kOglvZmZzZXQgaW4gYnl0ZXMgd2hlcmUgdGhlIHJhbmdlIGVuZHMgKGluY2x1c2l2ZSkKKyAqCiAgKiBXcml0ZSBvdXQgYW5kIHdhaXQgdXBvbiBmaWxlIG9mZnNldHMgbHN0YXJ0LT5sZW5kLCBpbmNsdXNpdmUuCiAgKgogICogTm90ZSB0aGF0IGBsZW5kJyBpcyBpbmNsdXNpdmUgKGRlc2NyaWJlcyB0aGUgbGFzdCBieXRlIHRvIGJlIHdyaXR0ZW4pIHNvCkBAIC0zOTQsOCArNDIyLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgbmV3bHkgYWxsb2NhdGVkIHBhZ2VjYWNoZSBwYWdlczoKKy8qKgorICogYWRkX3RvX3BhZ2VfY2FjaGUgLSBhZGQgbmV3bHkgYWxsb2NhdGVkIHBhZ2VjYWNoZSBwYWdlcworICogQHBhZ2U6CXBhZ2UgdG8gYWRkCisgKiBAbWFwcGluZzoJdGhlIHBhZ2UncyBhZGRyZXNzX3NwYWNlCisgKiBAb2Zmc2V0OglwYWdlIGluZGV4CisgKiBAZ2ZwX21hc2s6CXBhZ2UgYWxsb2NhdGlvbiBtb2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGFkZCBuZXdseSBhbGxvY2F0ZWQgcGFnZWNhY2hlIHBhZ2VzOwogICogdGhlIHBhZ2UgaXMgbmV3LCBzbyB3ZSBjYW4ganVzdCBydW4gU2V0UGFnZUxvY2tlZCgpIGFnYWluc3QgaXQuCiAgKiBUaGUgb3RoZXIgcGFnZSBzdGF0ZSBmbGFncyB3ZXJlIHNldCBieSBybXF1ZXVlKCkuCiAgKgpAQCAtNDIyLDcgKzQ1Niw2IEBACiAJfQogCXJldHVybiBlcnJvcjsKIH0KLQogRVhQT1JUX1NZTUJPTChhZGRfdG9fcGFnZV9jYWNoZSk7CiAKIGludCBhZGRfdG9fcGFnZV9jYWNoZV9scnUoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLApAQCAtNDg5LDggKzUyMiw3IEBACiBFWFBPUlRfU1lNQk9MKHdhaXRfb25fcGFnZV9iaXQpOwogCiAvKioKLSAqIHVubG9ja19wYWdlKCkgLSB1bmxvY2sgYSBsb2NrZWQgcGFnZQotICoKKyAqIHVubG9ja19wYWdlIC0gdW5sb2NrIGEgbG9ja2VkIHBhZ2UKICAqIEBwYWdlOiB0aGUgcGFnZQogICoKICAqIFVubG9ja3MgdGhlIHBhZ2UgYW5kIHdha2VzIHVwIHNsZWVwZXJzIGluIF9fX3dhaXRfb25fcGFnZV9sb2NrZWQoKS4KQEAgLTUxMyw4ICs1NDUsOSBAQAogfQogRVhQT1JUX1NZTUJPTCh1bmxvY2tfcGFnZSk7CiAKLS8qCi0gKiBFbmQgd3JpdGViYWNrIGFnYWluc3QgYSBwYWdlLgorLyoqCisgKiBlbmRfcGFnZV93cml0ZWJhY2sgLSBlbmQgd3JpdGViYWNrIGFnYWluc3QgYSBwYWdlCisgKiBAcGFnZTogdGhlIHBhZ2UKICAqLwogdm9pZCBlbmRfcGFnZV93cml0ZWJhY2soc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CkBAIC01MjcsMTAgKzU2MCwxMSBAQAogfQogRVhQT1JUX1NZTUJPTChlbmRfcGFnZV93cml0ZWJhY2spOwogCi0vKgotICogR2V0IGEgbG9jayBvbiB0aGUgcGFnZSwgYXNzdW1pbmcgd2UgbmVlZCB0byBzbGVlcCB0byBnZXQgaXQuCisvKioKKyAqIF9fbG9ja19wYWdlIC0gZ2V0IGEgbG9jayBvbiB0aGUgcGFnZSwgYXNzdW1pbmcgd2UgbmVlZCB0byBzbGVlcCB0byBnZXQgaXQKKyAqIEBwYWdlOiB0aGUgcGFnZSB0byBsb2NrCiAgKgotICogVWdseTogcnVubmluZyBzeW5jX3BhZ2UoKSBpbiBzdGF0ZSBUQVNLX1VOSU5URVJSVVBUSUJMRSBpcyBzY2FyeS4gIElmIHNvbWUKKyAqIFVnbHkuIFJ1bm5pbmcgc3luY19wYWdlKCkgaW4gc3RhdGUgVEFTS19VTklOVEVSUlVQVElCTEUgaXMgc2NhcnkuICBJZiBzb21lCiAgKiByYW5kb20gZHJpdmVyJ3MgcmVxdWVzdGZuIHNldHMgVEFTS19SVU5OSU5HLCB3ZSBjb3VsZCBidXN5d2FpdC4gIEhvd2V2ZXIKICAqIGNoYW5jZXMgYXJlIHRoYXQgb24gdGhlIHNlY29uZCBsb29wLCB0aGUgYmxvY2sgbGF5ZXIncyBwbHVnIGxpc3QgaXMgZW1wdHksCiAgKiBzbyBzeW5jX3BhZ2UoKSB3aWxsIHRoZW4gcmV0dXJuIGluIHN0YXRlIFRBU0tfVU5JTlRFUlJVUFRJQkxFLgpAQCAtNTQ0LDggKzU3OCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTChfX2xvY2tfcGFnZSk7CiAKLS8qCi0gKiBhIHJhdGhlciBsaWdodHdlaWdodCBmdW5jdGlvbiwgZmluZGluZyBhbmQgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byBhCisvKioKKyAqIGZpbmRfZ2V0X3BhZ2UgLSBmaW5kIGFuZCBnZXQgYSBwYWdlIHJlZmVyZW5jZQorICogQG1hcHBpbmc6IHRoZSBhZGRyZXNzX3NwYWNlIHRvIHNlYXJjaAorICogQG9mZnNldDogdGhlIHBhZ2UgaW5kZXgKKyAqCisgKiBBIHJhdGhlciBsaWdodHdlaWdodCBmdW5jdGlvbiwgZmluZGluZyBhbmQgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byBhCiAgKiBoYXNoZWQgcGFnZSBhdG9taWNhbGx5LgogICovCiBzdHJ1Y3QgcGFnZSAqIGZpbmRfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQpAQCAtNTU5LDExICs1OTcsMTQgQEAKIAlyZWFkX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CiAJcmV0dXJuIHBhZ2U7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZmluZF9nZXRfcGFnZSk7CiAKLS8qCi0gKiBTYW1lIGFzIGFib3ZlLCBidXQgdHJ5bG9jayBpdCBpbnN0ZWFkIG9mIGluY3JlbWVudGluZyB0aGUgY291bnQuCisvKioKKyAqIGZpbmRfdHJ5bG9ja19wYWdlIC0gZmluZCBhbmQgbG9jayBhIHBhZ2UKKyAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZSB0byBzZWFyY2gKKyAqIEBvZmZzZXQ6IHRoZSBwYWdlIGluZGV4CisgKgorICogU2FtZSBhcyBmaW5kX2dldF9wYWdlKCksIGJ1dCB0cnlsb2NrIGl0IGluc3RlYWQgb2YgaW5jcmVtZW50aW5nIHRoZSBjb3VudC4KICAqLwogc3RydWN0IHBhZ2UgKmZpbmRfdHJ5bG9ja19wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKQEAgLTU3NiwxMiArNjE3LDEwIEBACiAJcmVhZF91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCXJldHVybiBwYWdlOwogfQotCiBFWFBPUlRfU1lNQk9MKGZpbmRfdHJ5bG9ja19wYWdlKTsKIAogLyoqCiAgKiBmaW5kX2xvY2tfcGFnZSAtIGxvY2F0ZSwgcGluIGFuZCBsb2NrIGEgcGFnZWNhY2hlIHBhZ2UKLSAqCiAgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2UgdG8gc2VhcmNoCiAgKiBAb2Zmc2V0OiB0aGUgcGFnZSBpbmRleAogICoKQEAgLTYxNywxMiArNjU2LDEwIEBACiAJcmVhZF91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCXJldHVybiBwYWdlOwogfQotCiBFWFBPUlRfU1lNQk9MKGZpbmRfbG9ja19wYWdlKTsKIAogLyoqCiAgKiBmaW5kX29yX2NyZWF0ZV9wYWdlIC0gbG9jYXRlIG9yIGFkZCBhIHBhZ2VjYWNoZSBwYWdlCi0gKgogICogQG1hcHBpbmc6IHRoZSBwYWdlJ3MgYWRkcmVzc19zcGFjZQogICogQGluZGV4OiB0aGUgcGFnZSdzIGluZGV4IGludG8gdGhlIG1hcHBpbmcKICAqIEBnZnBfbWFzazogcGFnZSBhbGxvY2F0aW9uIG1vZGUKQEAgLTY2Myw3ICs3MDAsNiBAQAogCQlwYWdlX2NhY2hlX3JlbGVhc2UoY2FjaGVkX3BhZ2UpOwogCXJldHVybiBwYWdlOwogfQotCiBFWFBPUlRfU1lNQk9MKGZpbmRfb3JfY3JlYXRlX3BhZ2UpOwogCiAvKioKQEAgLTcyOSw5ICs3NjUsMTYgQEAKIAlyZXR1cm4gaTsKIH0KIAotLyoKKy8qKgorICogZmluZF9nZXRfcGFnZXNfdGFnIC0gZmluZCBhbmQgcmV0dXJuIHBhZ2VzIHRoYXQgbWF0Y2ggQHRhZworICogQG1hcHBpbmc6CXRoZSBhZGRyZXNzX3NwYWNlIHRvIHNlYXJjaAorICogQGluZGV4Ogl0aGUgc3RhcnRpbmcgcGFnZSBpbmRleAorICogQHRhZzoJdGhlIHRhZyBpbmRleAorICogQG5yX3BhZ2VzOgl0aGUgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKKyAqIEBwYWdlczoJd2hlcmUgdGhlIHJlc3VsdGluZyBwYWdlcyBhcmUgcGxhY2VkCisgKgogICogTGlrZSBmaW5kX2dldF9wYWdlcywgZXhjZXB0IHdlIG9ubHkgcmV0dXJuIHBhZ2VzIHdoaWNoIGFyZSB0YWdnZWQgd2l0aAotICogYHRhZycuICAgV2UgdXBkYXRlICppbmRleCB0byBpbmRleCB0aGUgbmV4dCBwYWdlIGZvciB0aGUgdHJhdmVyc2FsLgorICogQHRhZy4gICBXZSB1cGRhdGUgQGluZGV4IHRvIGluZGV4IHRoZSBuZXh0IHBhZ2UgZm9yIHRoZSB0cmF2ZXJzYWwuCiAgKi8KIHVuc2lnbmVkIGZpbmRfZ2V0X3BhZ2VzX3RhZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCAqaW5kZXgsCiAJCQlpbnQgdGFnLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsIHN0cnVjdCBwYWdlICoqcGFnZXMpCkBAIC03NTAsNyArNzkzLDExIEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKKy8qKgorICogZ3JhYl9jYWNoZV9wYWdlX25vd2FpdCAtIHJldHVybnMgbG9ja2VkIHBhZ2UgYXQgZ2l2ZW4gaW5kZXggaW4gZ2l2ZW4gY2FjaGUKKyAqIEBtYXBwaW5nOiB0YXJnZXQgYWRkcmVzc19zcGFjZQorICogQGluZGV4OiB0aGUgcGFnZSBpbmRleAorICoKICAqIFNhbWUgYXMgZ3JhYl9jYWNoZV9wYWdlLCBidXQgZG8gbm90IHdhaXQgaWYgdGhlIHBhZ2UgaXMgdW5hdmFpbGFibGUuCiAgKiBUaGlzIGlzIGludGVuZGVkIGZvciBzcGVjdWxhdGl2ZSBkYXRhIGdlbmVyYXRvcnMsIHdoZXJlIHRoZSBkYXRhIGNhbgogICogYmUgcmVnZW5lcmF0ZWQgaWYgdGhlIHBhZ2UgY291bGRuJ3QgYmUgZ3JhYmJlZC4gIFRoaXMgcm91dGluZSBzaG91bGQKQEAgLTc3OSwxOSArODI2LDUxIEBACiAJfQogCXJldHVybiBwYWdlOwogfQotCiBFWFBPUlRfU1lNQk9MKGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQpOwogCiAvKgorICogQ0QvRFZEcyBhcmUgZXJyb3IgcHJvbmUuIFdoZW4gYSBtZWRpdW0gZXJyb3Igb2NjdXJzLCB0aGUgZHJpdmVyIG1heSBmYWlsCisgKiBhIF9sYXJnZV8gcGFydCBvZiB0aGUgaS9vIHJlcXVlc3QuIEltYWdpbmUgdGhlIHdvcnN0IHNjZW5hcmlvOgorICoKKyAqICAgICAgLS0tUl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX0JfX19fX19fX19fCisgKiAgICAgICAgIF4gcmVhZGluZyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIGJhZCBibG9jayhhc3N1bWUgNGspCisgKgorICogcmVhZChSKSA9PiBtaXNzID0+IHJlYWRhaGVhZChSLi4uQikgPT4gbWVkaWEgZXJyb3IgPT4gZnJ1c3RyYXRpbmcgcmV0cmllcworICogPT4gZmFpbGluZyB0aGUgd2hvbGUgcmVxdWVzdCA9PiByZWFkKFIpID0+IHJlYWQoUisxKSA9PgorICogcmVhZGFoZWFkKFIrMS4uLkIrMSkgPT4gYmFuZyA9PiByZWFkKFIrMikgPT4gcmVhZChSKzMpID0+CisgKiByZWFkYWhlYWQoUiszLi4uQisyKSA9PiBiYW5nID0+IHJlYWQoUiszKSA9PiByZWFkKFIrNCkgPT4KKyAqIHJlYWRhaGVhZChSKzQuLi5CKzMpID0+IGJhbmcgPT4gcmVhZChSKzQpID0+IHJlYWQoUis1KSA9PiAuLi4uLi4KKyAqCisgKiBJdCBpcyBnb2luZyBpbnNhbmUuIEZpeCBpdCBieSBxdWlja2x5IHNjYWxpbmcgZG93biB0aGUgcmVhZGFoZWFkIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIHNocmlua19yZWFkYWhlYWRfc2l6ZV9laW8oc3RydWN0IGZpbGUgKmZpbHAsCisJCQkJCXN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSkKK3sKKwlpZiAoIXJhLT5yYV9wYWdlcykKKwkJcmV0dXJuOworCisJcmEtPnJhX3BhZ2VzIC89IDQ7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVkdWNpbmcgcmVhZGFoZWFkIHNpemUgdG8gJWx1S1xuIiwKKwkJCXJhLT5yYV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIDEwKSk7Cit9CisKKy8qKgorICogZG9fZ2VuZXJpY19tYXBwaW5nX3JlYWQgLSBnZW5lcmljIGZpbGUgcmVhZCByb3V0aW5lCisgKiBAbWFwcGluZzoJYWRkcmVzc19zcGFjZSB0byBiZSByZWFkCisgKiBAX3JhOglmaWxlJ3MgcmVhZGFoZWFkIHN0YXRlCisgKiBAZmlscDoJdGhlIGZpbGUgdG8gcmVhZAorICogQHBwb3M6CWN1cnJlbnQgZmlsZSBwb3NpdGlvbgorICogQGRlc2M6CXJlYWRfZGVzY3JpcHRvcgorICogQGFjdG9yOglyZWFkIG1ldGhvZAorICoKICAqIFRoaXMgaXMgYSBnZW5lcmljIGZpbGUgcmVhZCByb3V0aW5lLCBhbmQgdXNlcyB0aGUKLSAqIG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSgpIGZ1bmN0aW9uIGZvciB0aGUgYWN0dWFsIGxvdy1sZXZlbAotICogc3R1ZmYuCisgKiBtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UoKSBmdW5jdGlvbiBmb3IgdGhlIGFjdHVhbCBsb3ctbGV2ZWwgc3R1ZmYuCiAgKgogICogVGhpcyBpcyByZWFsbHkgdWdseS4gQnV0IHRoZSBnb3RvJ3MgYWN0dWFsbHkgdHJ5IHRvIGNsYXJpZnkgc29tZQogICogb2YgdGhlIGxvZ2ljIHdoZW4gaXQgY29tZXMgdG8gZXJyb3IgaGFuZGxpbmcgZXRjLgogICoKLSAqIE5vdGUgdGhlIHN0cnVjdCBmaWxlKiBpcyBvbmx5IHBhc3NlZCBmb3IgdGhlIHVzZSBvZiByZWFkcGFnZS4gIEl0IG1heSBiZQotICogTlVMTC4KKyAqIE5vdGUgdGhlIHN0cnVjdCBmaWxlKiBpcyBvbmx5IHBhc3NlZCBmb3IgdGhlIHVzZSBvZiByZWFkcGFnZS4KKyAqIEl0IG1heSBiZSBOVUxMLgogICovCiB2b2lkIGRvX2dlbmVyaWNfbWFwcGluZ19yZWFkKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAogCQkJICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqX3JhLApAQCAtOTMyLDYgKzEwMTEsNyBAQAogCQkJCX0KIAkJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJCQllcnJvciA9IC1FSU87CisJCQkJc2hyaW5rX3JlYWRhaGVhZF9zaXplX2VpbyhmaWxwLCAmcmEpOwogCQkJCWdvdG8gcmVhZHBhZ2VfZXJyb3I7CiAJCQl9CiAJCQl1bmxvY2tfcGFnZShwYWdlKTsKQEAgLTEwMDQsNyArMTA4NCw2IEBACiAJaWYgKGZpbHApCiAJCWZpbGVfYWNjZXNzZWQoZmlscCk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZG9fZ2VuZXJpY19tYXBwaW5nX3JlYWQpOwogCiBpbnQgZmlsZV9yZWFkX2FjdG9yKHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTEwNDUsNyArMTEyNCwxMyBAQAogCXJldHVybiBzaXplOwogfQogCi0vKgorLyoqCisgKiBfX2dlbmVyaWNfZmlsZV9haW9fcmVhZCAtIGdlbmVyaWMgZmlsZXN5c3RlbSByZWFkIHJvdXRpbmUKKyAqIEBpb2NiOglrZXJuZWwgSS9PIGNvbnRyb2wgYmxvY2sKKyAqIEBpb3Y6CWlvIHZlY3RvciByZXF1ZXN0CisgKiBAbnJfc2VnczoJbnVtYmVyIG9mIHNlZ21lbnRzIGluIHRoZSBpb3ZlYworICogQHBwb3M6CWN1cnJlbnQgZmlsZSBwb3NpdGlvbgorICoKICAqIFRoaXMgaXMgdGhlICJyZWFkKCkiIHJvdXRpbmUgZm9yIGFsbCBmaWxlc3lzdGVtcwogICogdGhhdCBjYW4gdXNlIHRoZSBwYWdlIGNhY2hlIGRpcmVjdGx5LgogICovCkBAIC0xMTI0LDcgKzEyMDksNiBAQAogb3V0OgogCXJldHVybiByZXR2YWw7CiB9Ci0KIEVYUE9SVF9TWU1CT0woX19nZW5lcmljX2ZpbGVfYWlvX3JlYWQpOwogCiBzc2l6ZV90CkBAIC0xMTM1LDcgKzEyMTksNiBAQAogCUJVR19PTihpb2NiLT5raV9wb3MgIT0gcG9zKTsKIAlyZXR1cm4gX19nZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgJmxvY2FsX2lvdiwgMSwgJmlvY2ItPmtpX3Bvcyk7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX2Fpb19yZWFkKTsKIAogc3NpemVfdApAQCAtMTE1MSw3ICsxMjM0LDYgQEAKIAkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZraW9jYik7CiAJcmV0dXJuIHJldDsKIH0KLQogRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfcmVhZCk7CiAKIGludCBmaWxlX3NlbmRfYWN0b3IocmVhZF9kZXNjcmlwdG9yX3QgKiBkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKQEAgLTExOTIsNyArMTI3NCw2IEBACiAJCXJldHVybiBkZXNjLndyaXR0ZW47CiAJcmV0dXJuIGRlc2MuZXJyb3I7CiB9Ci0KIEVYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxlX3NlbmRmaWxlKTsKIAogc3RhdGljIHNzaXplX3QKQEAgLTEyMjgsMTEgKzEzMDksMTUgQEAKIH0KIAogI2lmZGVmIENPTkZJR19NTVUKLS8qCitzdGF0aWMgaW50IEZBU1RDQUxMKHBhZ2VfY2FjaGVfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSk7CisvKioKKyAqIHBhZ2VfY2FjaGVfcmVhZCAtIGFkZHMgcmVxdWVzdGVkIHBhZ2UgdG8gdGhlIHBhZ2UgY2FjaGUgaWYgbm90IGFscmVhZHkgdGhlcmUKKyAqIEBmaWxlOglmaWxlIHRvIHJlYWQKKyAqIEBvZmZzZXQ6CXBhZ2UgaW5kZXgKKyAqCiAgKiBUaGlzIGFkZHMgdGhlIHJlcXVlc3RlZCBwYWdlIHRvIHRoZSBwYWdlIGNhY2hlIGlmIGl0IGlzbid0IGFscmVhZHkgdGhlcmUsCiAgKiBhbmQgc2NoZWR1bGVzIGFuIEkvTyB0byByZWFkIGluIGl0cyBjb250ZW50cyBmcm9tIGRpc2suCiAgKi8KLXN0YXRpYyBpbnQgRkFTVENBTEwocGFnZV9jYWNoZV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpKTsKIHN0YXRpYyBpbnQgZmFzdGNhbGwgcGFnZV9jYWNoZV9yZWFkKHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CkBAIC0xMjU5LDcgKzEzNDQsMTIgQEAKIAogI2RlZmluZSBNTUFQX0xPVFNBTUlTUyAgKDEwMCkKIAotLyoKKy8qKgorICogZmlsZW1hcF9ub3BhZ2UgLSByZWFkIGluIGZpbGUgZGF0YSBmb3IgcGFnZSBmYXVsdCBoYW5kbGluZworICogQGFyZWE6CXRoZSBhcHBsaWNhYmxlIHZtX2FyZWEKKyAqIEBhZGRyZXNzOgl0YXJnZXQgYWRkcmVzcyB0byByZWFkIGluCisgKiBAdHlwZToJcmV0dXJuZWQgd2l0aCBWTV9GQVVMVF97TUlOT1IsTUFKT1J9IGlmIG5vdCAlTlVMTAorICoKICAqIGZpbGVtYXBfbm9wYWdlKCkgaXMgaW52b2tlZCB2aWEgdGhlIHZtYSBvcGVyYXRpb25zIHZlY3RvciBmb3IgYQogICogbWFwcGVkIG1lbW9yeSByZWdpb24gdG8gcmVhZCBpbiBmaWxlIGRhdGEgZHVyaW5nIGEgcGFnZSBmYXVsdC4KICAqCkBAIC0xNDU5LDEwICsxNTQ5LDEwIEBACiAJICogVGhpbmdzIGRpZG4ndCB3b3JrIG91dC4gUmV0dXJuIHplcm8gdG8gdGVsbCB0aGUKIAkgKiBtbSBsYXllciBzbywgcG9zc2libHkgZnJlZWluZyB0aGUgcGFnZSBjYWNoZSBwYWdlIGZpcnN0LgogCSAqLworCXNocmlua19yZWFkYWhlYWRfc2l6ZV9laW8oZmlsZSwgcmEpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlyZXR1cm4gTlVMTDsKIH0KLQogRVhQT1JUX1NZTUJPTChmaWxlbWFwX25vcGFnZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqIGZpbGVtYXBfZ2V0cGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBwZ29mZiwKQEAgLTE3MTYsNyArMTgwNiwxMyBAQAogCXJldHVybiBwYWdlOwogfQogCi0vKgorLyoqCisgKiByZWFkX2NhY2hlX3BhZ2UgLSByZWFkIGludG8gcGFnZSBjYWNoZSwgZmlsbCBpdCBpZiBuZWVkZWQKKyAqIEBtYXBwaW5nOgl0aGUgcGFnZSdzIGFkZHJlc3Nfc3BhY2UKKyAqIEBpbmRleDoJdGhlIHBhZ2UgaW5kZXgKKyAqIEBmaWxsZXI6CWZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIHJlYWQKKyAqIEBkYXRhOglkZXN0aW5hdGlvbiBmb3IgcmVhZCBkYXRhCisgKgogICogUmVhZCBpbnRvIHRoZSBwYWdlIGNhY2hlLiBJZiBhIHBhZ2UgYWxyZWFkeSBleGlzdHMsCiAgKiBhbmQgUGFnZVVwdG9kYXRlKCkgaXMgbm90IHNldCwgdHJ5IHRvIGZpbGwgdGhlIHBhZ2UuCiAgKi8KQEAgLTE3NTQsNyArMTg1MCw2IEBACiAgb3V0OgogCXJldHVybiBwYWdlOwogfQotCiBFWFBPUlRfU1lNQk9MKHJlYWRfY2FjaGVfcGFnZSk7CiAKIC8qCkBAIC0xODI1LDcgKzE5MjAsNyBAQAogRVhQT1JUX1NZTUJPTChyZW1vdmVfc3VpZCk7CiAKIHNpemVfdAotX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGNoYXIgKnZhZGRyLCAKK19fZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhjaGFyICp2YWRkciwKIAkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBzaXplX3QgYmFzZSwgc2l6ZV90IGJ5dGVzKQogewogCXNpemVfdCBjb3BpZWQgPSAwLCBsZWZ0ID0gMDsKQEAgLTE4MzUsMTggKzE5MzAsMTQgQEAKIAkJaW50IGNvcHkgPSBtaW4oYnl0ZXMsIGlvdi0+aW92X2xlbiAtIGJhc2UpOwogCiAJCWJhc2UgPSAwOwotCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyh2YWRkciwgYnVmLCBjb3B5KTsKKwkJbGVmdCA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWNfbm9jYWNoZSh2YWRkciwgYnVmLCBjb3B5KTsKIAkJY29waWVkICs9IGNvcHk7CiAJCWJ5dGVzIC09IGNvcHk7CiAJCXZhZGRyICs9IGNvcHk7CiAJCWlvdisrOwogCi0JCWlmICh1bmxpa2VseShsZWZ0KSkgewotCQkJLyogemVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlciAqLwotCQkJaWYgKGJ5dGVzKQotCQkJCW1lbXNldCh2YWRkciwgMCwgYnl0ZXMpOworCQlpZiAodW5saWtlbHkobGVmdCkpCiAJCQlicmVhazsKLQkJfQogCX0KIAlyZXR1cm4gY29waWVkIC0gbGVmdDsKIH0KQEAgLTE4NTQsNyArMTk0NSw3IEBACiAvKgogICogUGVyZm9ybXMgbmVjZXNzYXJ5IGNoZWNrcyBiZWZvcmUgZG9pbmcgYSB3cml0ZQogICoKLSAqIENhbiBhZGp1c3Qgd3JpdGluZyBwb3NpdGlvbiBhb3IgYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlLgorICogQ2FuIGFkanVzdCB3cml0aW5nIHBvc2l0aW9uIG9yIGFtb3VudCBvZiBieXRlcyB0byB3cml0ZS4KICAqIFJldHVybnMgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0aGF0IGNhbGxlciBzaG91bGQgcmV0dXJuIG9yCiAgKiB6ZXJvIGluIGNhc2UgdGhhdCB3cml0ZSBzaG91bGQgYmUgYWxsb3dlZC4KICAqLwpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5oIGIvbW0vZmlsZW1hcC5oCmluZGV4IDEzNzkzYmEuLjUzNjk3OWYgMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuaAorKysgYi9tbS9maWxlbWFwLmgKQEAgLTEzLDE4ICsxMywyNiBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogc2l6ZV90Ci1fX2ZpbGVtYXBfY29weV9mcm9tX3VzZXJfaW92ZWMoY2hhciAqdmFkZHIsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgICAgICAgc2l6ZV90IGJhc2UsCi0JCQkgICAgICAgc2l6ZV90IGJ5dGVzKTsKK19fZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhjaGFyICp2YWRkciwKKwkJCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQkJCXNpemVfdCBiYXNlLAorCQkJCQlzaXplX3QgYnl0ZXMpOwogCiAvKgogICogQ29weSBhcyBtdWNoIGFzIHdlIGNhbiBpbnRvIHRoZSBwYWdlIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3aGljaAogICogd2VyZSBzdWNlc3NmdWxseSBjb3BpZWQuICBJZiBhIGZhdWx0IGlzIGVuY291bnRlcmVkIHRoZW4gY2xlYXIgdGhlIHBhZ2UKICAqIG91dCB0byAob2Zmc2V0K2J5dGVzKSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2VyZSBjb3BpZWQuCisgKgorICogTk9URTogRm9yIHRoaXMgdG8gd29yayByZWxpYWJseSB3ZSByZWFsbHkgd2FudCBjb3B5X2Zyb21fdXNlcl9pbmF0b21pY19ub2NhY2hlCisgKiB0byAqTk9UKiB6ZXJvIGFueSB0YWlsIG9mIHRoZSBidWZmZXIgdGhhdCBpdCBmYWlsZWQgdG8gY29weS4gIElmIGl0IGRvZXMsCisgKiBhbmQgaWYgdGhlIGZvbGxvd2luZyBub24tYXRvbWljIGNvcHkgc3VjY2VlZHMsIHRoZW4gdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cKKyAqIHdoZXJlIHRoZSB0YXJnZXQgcGFnZSBjb250YWlucyBuZWl0aGVyIHRoZSBkYXRhIGJlZm9yZSB0aGUgd3JpdGUsIG5vciB0aGUKKyAqIGRhdGEgYWZ0ZXIgdGhlIHdyaXRlIChpdCBjb250YWlucyB6ZXJvKS4gIEEgcmVhZCBhdCB0aGlzIHRpbWUgd2lsbCBzZWUKKyAqIGRhdGEgdGhhdCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhbnkgb3JkZXJpbmcgb2YgdGhlIHJlYWQgYW5kIHRoZSB3cml0ZS4KKyAqIChUaGlzIGhhcyBiZWVuIGRldGVjdGVkIGluIHByYWN0aWNlKS4KICAqLwogc3RhdGljIGlubGluZSBzaXplX3QKIGZpbGVtYXBfY29weV9mcm9tX3VzZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LApAQCAtMzQsMTMgKzQyLDEzIEBACiAJaW50IGxlZnQ7CiAKIAlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7CisJbGVmdCA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWNfbm9jYWNoZShrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7CiAJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOwogCiAJaWYgKGxlZnQgIT0gMCkgewogCQkvKiBEbyBpdCB0aGUgc2xvdyB3YXkgKi8KIAkJa2FkZHIgPSBrbWFwKHBhZ2UpOwotCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcihrYWRkciArIG9mZnNldCwgYnVmLCBieXRlcyk7CisJCWxlZnQgPSBfX2NvcHlfZnJvbV91c2VyX25vY2FjaGUoa2FkZHIgKyBvZmZzZXQsIGJ1ZiwgYnl0ZXMpOwogCQlrdW5tYXAocGFnZSk7CiAJfQogCXJldHVybiBieXRlcyAtIGxlZnQ7CkBAIC02MCwxMyArNjgsMTUgQEAKIAlzaXplX3QgY29waWVkOwogCiAJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7Ci0JY29waWVkID0gX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjKGthZGRyICsgb2Zmc2V0LCBpb3YsCi0JCQkJCQliYXNlLCBieXRlcyk7CisJY29waWVkID0gX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGthZGRyICsgb2Zmc2V0LCBpb3YsCisJCQkJCQkJIGJhc2UsIGJ5dGVzKTsKIAlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CiAJaWYgKGNvcGllZCAhPSBieXRlcykgewogCQlrYWRkciA9IGttYXAocGFnZSk7Ci0JCWNvcGllZCA9IF9fZmlsZW1hcF9jb3B5X2Zyb21fdXNlcl9pb3ZlYyhrYWRkciArIG9mZnNldCwgaW92LAotCQkJCQkJCWJhc2UsIGJ5dGVzKTsKKwkJY29waWVkID0gX19maWxlbWFwX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGthZGRyICsgb2Zmc2V0LCBpb3YsCisJCQkJCQkJCSBiYXNlLCBieXRlcyk7CisJCWlmIChieXRlcyAtIGNvcGllZCkKKwkJCW1lbXNldChrYWRkciArIG9mZnNldCArIGNvcGllZCwgMCwgYnl0ZXMgLSBjb3BpZWQpOwogCQlrdW5tYXAocGFnZSk7CiAJfQogCXJldHVybiBjb3BpZWQ7CmRpZmYgLS1naXQgYS9tbS9mcmVtYXAuYyBiL21tL2ZyZW1hcC5jCmluZGV4IDlmMzgxZTUuLjIxYjdkMGMgMTAwNjQ0Ci0tLSBhL21tL2ZyZW1hcC5jCisrKyBiL21tL2ZyZW1hcC5jCkBAIC04Myw2ICs4Myw3IEBACiAJcGFnZV9hZGRfZmlsZV9ybWFwKHBhZ2UpOwogCXB0ZV92YWwgPSAqcHRlOwogCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyLCBwdGVfdmFsKTsKKwlsYXp5X21tdV9wcm90X3VwZGF0ZShwdGVfdmFsKTsKIAllcnIgPSAwOwogdW5sb2NrOgogCXB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpOwpAQCAtMTE0LDcgKzExNSwxMyBAQAogCiAJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlLCBwZ29mZl90b19wdGUocGdvZmYpKTsKIAlwdGVfdmFsID0gKnB0ZTsKLQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkciwgcHRlX3ZhbCk7CisJLyoKKwkgKiBXZSBkb24ndCBuZWVkIHRvIHJ1biB1cGRhdGVfbW11X2NhY2hlKCkgaGVyZSBiZWNhdXNlIHRoZSAiZmlsZSBwdGUiCisJICogYmVpbmcgaW5zdGFsbGVkIGJ5IGluc3RhbGxfZmlsZV9wdGUoKSBpcyBub3QgYSByZWFsIHB0ZSAtIGl0J3MgYQorCSAqIG5vbi1wcmVzZW50IGVudHJ5IChsaWtlIGEgc3dhcCBlbnRyeSksIG5vdGluZyB3aGF0IGZpbGUgb2Zmc2V0IHNob3VsZAorCSAqIGJlIG1hcHBlZCB0aGVyZSB3aGVuIHRoZXJlJ3MgYSBmYXVsdCAoaW4gYSBub24tbGluZWFyIHZtYSB3aGVyZQorCSAqIHRoYXQncyBub3Qgb2J2aW91cykuCisJICovCiAJcHRlX3VubWFwX3VubG9jayhwdGUsIHB0bCk7CiAJZXJyID0gMDsKIG91dDoKZGlmZiAtLWdpdCBhL21tL2h1Z2V0bGIuYyBiL21tL2h1Z2V0bGIuYwppbmRleCA4MzJmNjc2Li5kZjQ5OTk3IDEwMDY0NAotLS0gYS9tbS9odWdldGxiLmMKKysrIGIvbW0vaHVnZXRsYi5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogY29uc3QgdW5zaWduZWQgbG9uZyBodWdldGxiX3plcm8gPSAwLCBodWdldGxiX2luZmluaXR5ID0gfjBVTDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG5yX2h1Z2VfcGFnZXMsIGZyZWVfaHVnZV9wYWdlcywgcmVzZXJ2ZWRfaHVnZV9wYWdlczsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG5yX2h1Z2VfcGFnZXMsIGZyZWVfaHVnZV9wYWdlcywgcmVzdl9odWdlX3BhZ2VzOwogdW5zaWduZWQgbG9uZyBtYXhfaHVnZV9wYWdlczsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGh1Z2VwYWdlX2ZyZWVsaXN0c1tNQVhfTlVNTk9ERVNdOwogc3RhdGljIHVuc2lnbmVkIGludCBucl9odWdlX3BhZ2VzX25vZGVbTUFYX05VTU5PREVTXTsKQEAgLTEyMywzOSArMTIzLDEzIEBACiBzdGF0aWMgc3RydWN0IHBhZ2UgKmFsbG9jX2h1Z2VfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkgICAgdW5zaWduZWQgbG9uZyBhZGRyKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCWludCB1c2VfcmVzZXJ2ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyBpZHg7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7Ci0KLQlpZiAodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSB7Ci0KLQkJLyogaWR4ID0gcmFkaXggdHJlZSBpbmRleCwgaS5lLiBvZmZzZXQgaW50byBmaWxlIGluCi0JCSAqIEhQQUdFX1NJWkUgdW5pdHMgKi8KLQkJaWR4ID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gSFBBR0VfU0hJRlQpCi0JCQkrICh2bWEtPnZtX3Bnb2ZmID4+IChIUEFHRV9TSElGVCAtIFBBR0VfU0hJRlQpKTsKLQotCQkvKiBUaGUgaHVnZXRsYmZzIHNwZWNpZmljIGlub2RlIGluZm8gc3RvcmVzIHRoZSBudW1iZXIKLQkJICogb2YgImd1YXJhbnRlZWQgYXZhaWxhYmxlIiAoaHVnZSkgcGFnZXMuICBUaGF0IGlzLAotCQkgKiB0aGUgZmlyc3QgJ3ByZXJlc2VydmVkX2hwYWdlcycgcGFnZXMgb2YgdGhlIGlub2RlCi0JCSAqIGFyZSBlaXRoZXIgYWxyZWFkeSBpbnN0YW50aWF0ZWQsIG9yIGhhdmUgYmVlbgotCQkgKiBwcmUtcmVzZXJ2ZWQgKGJ5IGh1Z2V0bGJfcmVzZXJ2ZV9mb3JfaW5vZGUoKSkuIEhlcmUKLQkJICogd2UncmUgaW4gdGhlIHByb2Nlc3Mgb2YgaW5zdGFudGlhdGluZyB0aGUgcGFnZSwgc28KLQkJICogd2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZHJhdyBmcm9tIHRoZQotCQkgKiBwcmUtcmVzZXJ2ZWQgcG9vbCBvciB0aGUgdHJ1bHkgZnJlZSBwb29sLiAqLwotCQlpZiAoaWR4IDwgSFVHRVRMQkZTX0koaW5vZGUpLT5wcmVyZXNlcnZlZF9ocGFnZXMpCi0JCQl1c2VfcmVzZXJ2ZSA9IDE7Ci0JfQotCi0JaWYgKCF1c2VfcmVzZXJ2ZSkgewotCQlpZiAoZnJlZV9odWdlX3BhZ2VzIDw9IHJlc2VydmVkX2h1Z2VfcGFnZXMpCi0JCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJQlVHX09OKHJlc2VydmVkX2h1Z2VfcGFnZXMgPT0gMCk7Ci0JCXJlc2VydmVkX2h1Z2VfcGFnZXMtLTsKLQl9CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkKKwkJcmVzdl9odWdlX3BhZ2VzLS07CisJZWxzZSBpZiAoZnJlZV9odWdlX3BhZ2VzIDw9IHJlc3ZfaHVnZV9wYWdlcykKKwkJZ290byBmYWlsOwogCiAJcGFnZSA9IGRlcXVldWVfaHVnZV9wYWdlKHZtYSwgYWRkcik7CiAJaWYgKCFwYWdlKQpAQCAtMTY1LDk2ICsxMzksMTEgQEAKIAlzZXRfcGFnZV9yZWZjb3VudGVkKHBhZ2UpOwogCXJldHVybiBwYWdlOwogCi0gZmFpbDoKLQlXQVJOX09OKHVzZV9yZXNlcnZlKTsgLyogcmVzZXJ2ZWQgYWxsb2NhdGlvbnMgc2hvdWxkbid0IGZhaWwgKi8KK2ZhaWw6CiAJc3Bpbl91bmxvY2soJmh1Z2V0bGJfbG9jayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qIGh1Z2V0bGJfZXh0ZW5kX3Jlc2VydmF0aW9uKCkKLSAqCi0gKiBFbnN1cmUgdGhhdCBhdCBsZWFzdCAnYXRsZWFzdCcgaHVnZXBhZ2VzIGFyZSwgYW5kIHdpbGwgcmVtYWluLAotICogYXZhaWxhYmxlIHRvIGluc3RhbnRpYXRlIHRoZSBmaXJzdCAnYXRsZWFzdCcgcGFnZXMgb2YgdGhlIGdpdmVuCi0gKiBpbm9kZS4gIElmIHRoZSBpbm9kZSBkb2Vzbid0IGFscmVhZHkgaGF2ZSB0aGlzIG1hbnkgcGFnZXMgcmVzZXJ2ZWQKLSAqIG9yIGluc3RhbnRpYXRlZCwgc2V0IGFzaWRlIHNvbWUgaHVnZXBhZ2VzIGluIHRoZSByZXNlcnZlZCBwb29sIHRvCi0gKiBzYXRpc2Z5IGxhdGVyIGZhdWx0cyAob3IgZmFpbCBub3cgaWYgdGhlcmUgYXJlbid0IGVub3VnaCwgcmF0aGVyCi0gKiB0aGFuIGdldHRpbmcgdGhlIFNJR0JVUyBsYXRlcikuCi0gKi8KLWludCBodWdldGxiX2V4dGVuZF9yZXNlcnZhdGlvbihzdHJ1Y3QgaHVnZXRsYmZzX2lub2RlX2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdGxlYXN0KQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaW5mby0+dmZzX2lub2RlOwotCXVuc2lnbmVkIGxvbmcgY2hhbmdlX2luX3Jlc2VydmUgPSAwOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrKCZodWdldGxiX2xvY2spOwotCXJlYWRfbG9ja19pcnEoJmlub2RlLT5pX21hcHBpbmctPnRyZWVfbG9jayk7Ci0KLQlpZiAoaW5mby0+cHJlcmVzZXJ2ZWRfaHBhZ2VzID49IGF0bGVhc3QpCi0JCWdvdG8gb3V0OwotCi0JLyogQmVjYXVzZSB3ZSBhbHdheXMgY2FsbCB0aGlzIG9uIHNoYXJlZCBtYXBwaW5ncywgbm9uZSBvZiB0aGUKLQkgKiBwYWdlcyBiZXlvbmQgaW5mby0+cHJlcmVzZXJ2ZWRfaHBhZ2VzIGNhbiBoYXZlIGJlZW4KLQkgKiBpbnN0YW50aWF0ZWQsIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBhbGwgb2YgdGhlbSBub3cuICovCi0JY2hhbmdlX2luX3Jlc2VydmUgPSBhdGxlYXN0IC0gaW5mby0+cHJlcmVzZXJ2ZWRfaHBhZ2VzOwotCi0JaWYgKChyZXNlcnZlZF9odWdlX3BhZ2VzICsgY2hhbmdlX2luX3Jlc2VydmUpID4gZnJlZV9odWdlX3BhZ2VzKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXJlc2VydmVkX2h1Z2VfcGFnZXMgKz0gY2hhbmdlX2luX3Jlc2VydmU7Ci0JaW5mby0+cHJlcmVzZXJ2ZWRfaHBhZ2VzID0gYXRsZWFzdDsKLQotIG91dDoKLQlyZWFkX3VubG9ja19pcnEoJmlub2RlLT5pX21hcHBpbmctPnRyZWVfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmh1Z2V0bGJfbG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBodWdldGxiX3RydW5jYXRlX3Jlc2VydmF0aW9uKCkKLSAqCi0gKiBUaGlzIHJldHVybnMgcGFnZXMgcmVzZXJ2ZWQgZm9yIHRoZSBnaXZlbiBpbm9kZSB0byB0aGUgZ2VuZXJhbCBmcmVlCi0gKiBodWdlcGFnZSBwb29sLiAgSWYgdGhlIGlub2RlIGhhcyBhbnkgcGFnZXMgcHJlcmVzZXJ2ZWQsIGJ1dCBub3QKLSAqIGluc3RhbnRpYXRlZCwgYmV5b25kIG9mZnNldCAoYXRtb3N0IDw8IEhQQUdFX1NJWkUpLCB0aGVuIHJlbGVhc2UKLSAqIHRoZW0uCi0gKi8KLXZvaWQgaHVnZXRsYl90cnVuY2F0ZV9yZXNlcnZhdGlvbihzdHJ1Y3QgaHVnZXRsYmZzX2lub2RlX2luZm8gKmluZm8sCi0JCQkJICB1bnNpZ25lZCBsb25nIGF0bW9zdCkKLXsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmluZm8tPnZmc19pbm9kZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JdW5zaWduZWQgbG9uZyBpZHg7Ci0JdW5zaWduZWQgbG9uZyBjaGFuZ2VfaW5fcmVzZXJ2ZSA9IDA7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7Ci0JcmVhZF9sb2NrX2lycSgmaW5vZGUtPmlfbWFwcGluZy0+dHJlZV9sb2NrKTsKLQotCWlmIChpbmZvLT5wcmVyZXNlcnZlZF9ocGFnZXMgPD0gYXRtb3N0KQotCQlnb3RvIG91dDsKLQotCS8qIENvdW50IHBhZ2VzIHdoaWNoIHdlcmUgcmVzZXJ2ZWQsIGJ1dCBub3QgaW5zdGFudGlhdGVkLCBhbmQKLQkgKiB3aGljaCB3ZSBjYW4gbm93IHJlbGVhc2UuICovCi0JZm9yIChpZHggPSBhdG1vc3Q7IGlkeCA8IGluZm8tPnByZXJlc2VydmVkX2hwYWdlczsgaWR4KyspIHsKLQkJcGFnZSA9IHJhZGl4X3RyZWVfbG9va3VwKCZtYXBwaW5nLT5wYWdlX3RyZWUsIGlkeCk7Ci0JCWlmICghcGFnZSkKLQkJCS8qIFBhZ2VzIHdoaWNoIGFyZSBhbHJlYWR5IGluc3RhbnRpYXRlZCBjYW4ndAotCQkJICogYmUgdW5yZXNlcnZlZCAoYW5kIGluIGZhY3QgaGF2ZSBhbHJlYWR5Ci0JCQkgKiBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZWQgcG9vbCkgKi8KLQkJCWNoYW5nZV9pbl9yZXNlcnZlKys7Ci0JfQotCi0JQlVHX09OKHJlc2VydmVkX2h1Z2VfcGFnZXMgPCBjaGFuZ2VfaW5fcmVzZXJ2ZSk7Ci0JcmVzZXJ2ZWRfaHVnZV9wYWdlcyAtPSBjaGFuZ2VfaW5fcmVzZXJ2ZTsKLQlpbmZvLT5wcmVyZXNlcnZlZF9ocGFnZXMgPSBhdG1vc3Q7Ci0KLSBvdXQ6Ci0JcmVhZF91bmxvY2tfaXJxKCZpbm9kZS0+aV9tYXBwaW5nLT50cmVlX2xvY2spOwotCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBodWdldGxiX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGk7CkBAIC0zMzQsNyArMjIzLDcgQEAKIAkJcmV0dXJuIG5yX2h1Z2VfcGFnZXM7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7Ci0JY291bnQgPSBtYXgoY291bnQsIHJlc2VydmVkX2h1Z2VfcGFnZXMpOworCWNvdW50ID0gbWF4KGNvdW50LCByZXN2X2h1Z2VfcGFnZXMpOwogCXRyeV90b19mcmVlX2xvdyhjb3VudCk7CiAJd2hpbGUgKGNvdW50IDwgbnJfaHVnZV9wYWdlcykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGRlcXVldWVfaHVnZV9wYWdlKE5VTEwsIDApOwpAQCAtMzYxLDExICsyNTAsMTEgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsCiAJCQkiSHVnZVBhZ2VzX1RvdGFsOiAlNWx1XG4iCiAJCQkiSHVnZVBhZ2VzX0ZyZWU6ICAlNWx1XG4iCi0JCSAgICAgICAgIkh1Z2VQYWdlc19Sc3ZkOiAgJTVsdVxuIgorCQkJIkh1Z2VQYWdlc19Sc3ZkOiAgJTVsdVxuIgogCQkJIkh1Z2VwYWdlc2l6ZTogICAgJTVsdSBrQlxuIiwKIAkJCW5yX2h1Z2VfcGFnZXMsCiAJCQlmcmVlX2h1Z2VfcGFnZXMsCi0JCSAgICAgICAgcmVzZXJ2ZWRfaHVnZV9wYWdlcywKKwkJCXJlc3ZfaHVnZV9wYWdlcywKIAkJCUhQQUdFX1NJWkUvMTAyNCk7CiB9CiAKQEAgLTc1NCwzICs2NDMsMTU2IEBACiAJZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCk7CiB9CiAKK3N0cnVjdCBmaWxlX3JlZ2lvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCWxvbmcgZnJvbTsKKwlsb25nIHRvOworfTsKKworc3RhdGljIGxvbmcgcmVnaW9uX2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBsb25nIGYsIGxvbmcgdCkKK3sKKwlzdHJ1Y3QgZmlsZV9yZWdpb24gKnJnLCAqbnJnLCAqdHJnOworCisJLyogTG9jYXRlIHRoZSByZWdpb24gd2UgYXJlIGVpdGhlciBpbiBvciBiZWZvcmUuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZywgaGVhZCwgbGluaykKKwkJaWYgKGYgPD0gcmctPnRvKQorCQkJYnJlYWs7CisKKwkvKiBSb3VuZCBvdXIgbGVmdCBlZGdlIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgaXQgZW5jbG9zZXMgdXMuICovCisJaWYgKGYgPiByZy0+ZnJvbSkKKwkJZiA9IHJnLT5mcm9tOworCisJLyogQ2hlY2sgZm9yIGFuZCBjb25zdW1lIGFueSByZWdpb25zIHdlIG5vdyBvdmVybGFwIHdpdGguICovCisJbnJnID0gcmc7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJnLCB0cmcsIHJnLT5saW5rLnByZXYsIGxpbmspIHsKKwkJaWYgKCZyZy0+bGluayA9PSBoZWFkKQorCQkJYnJlYWs7CisJCWlmIChyZy0+ZnJvbSA+IHQpCisJCQlicmVhazsKKworCQkvKiBJZiB0aGlzIGFyZWEgcmVhY2hlcyBoaWdoZXIgdGhlbiBleHRlbmQgb3VyIGFyZWEgdG8KKwkJICogaW5jbHVkZSBpdCBjb21wbGV0ZWx5LiAgSWYgdGhpcyBpcyBub3QgdGhlIGZpcnN0IGFyZWEKKwkJICogd2hpY2ggd2UgaW50ZW5kIHRvIHJldXNlLCBmcmVlIGl0LiAqLworCQlpZiAocmctPnRvID4gdCkKKwkJCXQgPSByZy0+dG87CisJCWlmIChyZyAhPSBucmcpIHsKKwkJCWxpc3RfZGVsKCZyZy0+bGluayk7CisJCQlrZnJlZShyZyk7CisJCX0KKwl9CisJbnJnLT5mcm9tID0gZjsKKwlucmctPnRvID0gdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgcmVnaW9uX2NoZyhzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBsb25nIGYsIGxvbmcgdCkKK3sKKwlzdHJ1Y3QgZmlsZV9yZWdpb24gKnJnLCAqbnJnOworCWxvbmcgY2hnID0gMDsKKworCS8qIExvY2F0ZSB0aGUgcmVnaW9uIHdlIGFyZSBiZWZvcmUgb3IgaW4uICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZywgaGVhZCwgbGluaykKKwkJaWYgKGYgPD0gcmctPnRvKQorCQkJYnJlYWs7CisKKwkvKiBJZiB3ZSBhcmUgYmVsb3cgdGhlIGN1cnJlbnQgcmVnaW9uIHRoZW4gYSBuZXcgcmVnaW9uIGlzIHJlcXVpcmVkLgorCSAqIFN1YnRsZSwgYWxsb2NhdGUgYSBuZXcgcmVnaW9uIGF0IHRoZSBwb3NpdGlvbiBidXQgbWFrZSBpdCB6ZXJvCisJICogc2l6ZSBzdWNoIHRoYXQgd2UgY2FuIGd1YXJlbnRlZSB0byByZWNvcmQgdGhlIHJlc2VydmF0aW9uLiAqLworCWlmICgmcmctPmxpbmsgPT0gaGVhZCB8fCB0IDwgcmctPmZyb20pIHsKKwkJbnJnID0ga21hbGxvYyhzaXplb2YoKm5yZyksIEdGUF9LRVJORUwpOworCQlpZiAobnJnID09IDApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbnJnLT5mcm9tID0gZjsKKwkJbnJnLT50byAgID0gZjsKKwkJSU5JVF9MSVNUX0hFQUQoJm5yZy0+bGluayk7CisJCWxpc3RfYWRkKCZucmctPmxpbmssIHJnLT5saW5rLnByZXYpOworCisJCXJldHVybiB0IC0gZjsKKwl9CisKKwkvKiBSb3VuZCBvdXIgbGVmdCBlZGdlIHRvIHRoZSBjdXJyZW50IHNlZ21lbnQgaWYgaXQgZW5jbG9zZXMgdXMuICovCisJaWYgKGYgPiByZy0+ZnJvbSkKKwkJZiA9IHJnLT5mcm9tOworCWNoZyA9IHQgLSBmOworCisJLyogQ2hlY2sgZm9yIGFuZCBjb25zdW1lIGFueSByZWdpb25zIHdlIG5vdyBvdmVybGFwIHdpdGguICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZywgcmctPmxpbmsucHJldiwgbGluaykgeworCQlpZiAoJnJnLT5saW5rID09IGhlYWQpCisJCQlicmVhazsKKwkJaWYgKHJnLT5mcm9tID4gdCkKKwkJCXJldHVybiBjaGc7CisKKwkJLyogV2Ugb3ZlcmxhcCB3aXRoIHRoaXMgYXJlYSwgaWYgaXQgZXh0ZW5kcyBmdXRoZXIgdGhhbgorCQkgKiB1cyB0aGVuIHdlIG11c3QgZXh0ZW5kIG91cnNlbHZlcy4gIEFjY291bnQgZm9yIGl0cworCQkgKiBleGlzdGluZyByZXNlcnZhdGlvbi4gKi8KKwkJaWYgKHJnLT50byA+IHQpIHsKKwkJCWNoZyArPSByZy0+dG8gLSB0OworCQkJdCA9IHJnLT50bzsKKwkJfQorCQljaGcgLT0gcmctPnRvIC0gcmctPmZyb207CisJfQorCXJldHVybiBjaGc7Cit9CisKK3N0YXRpYyBsb25nIHJlZ2lvbl90cnVuY2F0ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBsb25nIGVuZCkKK3sKKwlzdHJ1Y3QgZmlsZV9yZWdpb24gKnJnLCAqdHJnOworCWxvbmcgY2hnID0gMDsKKworCS8qIExvY2F0ZSB0aGUgcmVnaW9uIHdlIGFyZSBlaXRoZXIgaW4gb3IgYmVmb3JlLiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmcsIGhlYWQsIGxpbmspCisJCWlmIChlbmQgPD0gcmctPnRvKQorCQkJYnJlYWs7CisJaWYgKCZyZy0+bGluayA9PSBoZWFkKQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgcmVnaW9uIHRoZW4gYWRqdXN0IGl0LiAqLworCWlmIChlbmQgPiByZy0+ZnJvbSkgeworCQljaGcgPSByZy0+dG8gLSBlbmQ7CisJCXJnLT50byA9IGVuZDsKKwkJcmcgPSBsaXN0X2VudHJ5KHJnLT5saW5rLm5leHQsIHR5cGVvZigqcmcpLCBsaW5rKTsKKwl9CisKKwkvKiBEcm9wIGFueSByZW1haW5pbmcgcmVnaW9ucy4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmcsIHRyZywgcmctPmxpbmsucHJldiwgbGluaykgeworCQlpZiAoJnJnLT5saW5rID09IGhlYWQpCisJCQlicmVhazsKKwkJY2hnICs9IHJnLT50byAtIHJnLT5mcm9tOworCQlsaXN0X2RlbCgmcmctPmxpbmspOworCQlrZnJlZShyZyk7CisJfQorCXJldHVybiBjaGc7Cit9CisKK3N0YXRpYyBpbnQgaHVnZXRsYl9hY2N0X21lbW9yeShsb25nIGRlbHRhKQoreworCWludCByZXQgPSAtRU5PTUVNOworCisJc3Bpbl9sb2NrKCZodWdldGxiX2xvY2spOworCWlmICgoZGVsdGEgKyByZXN2X2h1Z2VfcGFnZXMpIDw9IGZyZWVfaHVnZV9wYWdlcykgeworCQlyZXN2X2h1Z2VfcGFnZXMgKz0gZGVsdGE7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCBodWdldGxiX3Jlc2VydmVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBmcm9tLCBsb25nIHRvKQoreworCWxvbmcgcmV0LCBjaGc7CisKKwljaGcgPSByZWdpb25fY2hnKCZpbm9kZS0+aV9tYXBwaW5nLT5wcml2YXRlX2xpc3QsIGZyb20sIHRvKTsKKwlpZiAoY2hnIDwgMCkKKwkJcmV0dXJuIGNoZzsKKwlyZXQgPSBodWdldGxiX2FjY3RfbWVtb3J5KGNoZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmVnaW9uX2FkZCgmaW5vZGUtPmlfbWFwcGluZy0+cHJpdmF0ZV9saXN0LCBmcm9tLCB0byk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaHVnZXRsYl91bnJlc2VydmVfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBvZmZzZXQsIGxvbmcgZnJlZWQpCit7CisJbG9uZyBjaGcgPSByZWdpb25fdHJ1bmNhdGUoJmlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbGlzdCwgb2Zmc2V0KTsKKwlodWdldGxiX2FjY3RfbWVtb3J5KGZyZWVkIC0gY2hnKTsKK30KZGlmZiAtLWdpdCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKaW5kZXggMGVjN2JjNi4uMjQ3YjVjMyAxMDA2NDQKLS0tIGEvbW0vbWVtb3J5LmMKKysrIGIvbW0vbWVtb3J5LmMKQEAgLTQzNCw3ICs0MzQsOSBAQAogCS8qIHB0ZSBjb250YWlucyBwb3NpdGlvbiBpbiBzd2FwIG9yIGZpbGUsIHNvIGNvcHkuICovCiAJaWYgKHVubGlrZWx5KCFwdGVfcHJlc2VudChwdGUpKSkgewogCQlpZiAoIXB0ZV9maWxlKHB0ZSkpIHsKLQkJCXN3YXBfZHVwbGljYXRlKHB0ZV90b19zd3BfZW50cnkocHRlKSk7CisJCQlzd3BfZW50cnlfdCBlbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKworCQkJc3dhcF9kdXBsaWNhdGUoZW50cnkpOwogCQkJLyogbWFrZSBzdXJlIGRzdF9tbSBpcyBvbiBzd2Fwb2ZmJ3MgbW1saXN0LiAqLwogCQkJaWYgKHVubGlrZWx5KGxpc3RfZW1wdHkoJmRzdF9tbS0+bW1saXN0KSkpIHsKIAkJCQlzcGluX2xvY2soJm1tbGlzdF9sb2NrKTsKQEAgLTQ0Myw2ICs0NDUsMTYgQEAKIAkJCQkJCSAmc3JjX21tLT5tbWxpc3QpOwogCQkJCXNwaW5fdW5sb2NrKCZtbWxpc3RfbG9jayk7CiAJCQl9CisJCQlpZiAoaXNfd3JpdGVfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSAmJgorCQkJCQlpc19jb3dfbWFwcGluZyh2bV9mbGFncykpIHsKKwkJCQkvKgorCQkJCSAqIENPVyBtYXBwaW5ncyByZXF1aXJlIHBhZ2VzIGluIGJvdGggcGFyZW50CisJCQkJICogYW5kIGNoaWxkIHRvIGJlIHNldCB0byByZWFkLgorCQkJCSAqLworCQkJCW1ha2VfbWlncmF0aW9uX2VudHJ5X3JlYWQoJmVudHJ5KTsKKwkJCQlwdGUgPSBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KTsKKwkJCQlzZXRfcHRlX2F0KHNyY19tbSwgYWRkciwgc3JjX3B0ZSwgcHRlKTsKKwkJCX0KIAkJfQogCQlnb3RvIG91dF9zZXRfcHRlOwogCX0KQEAgLTE0NDUsMjUgKzE0NTcsNjAgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqb2xkX3BhZ2UsICpuZXdfcGFnZTsKIAlwdGVfdCBlbnRyeTsKLQlpbnQgcmV0ID0gVk1fRkFVTFRfTUlOT1I7CisJaW50IHJldXNlLCByZXQgPSBWTV9GQVVMVF9NSU5PUjsKIAogCW9sZF9wYWdlID0gdm1fbm9ybWFsX3BhZ2Uodm1hLCBhZGRyZXNzLCBvcmlnX3B0ZSk7CiAJaWYgKCFvbGRfcGFnZSkKIAkJZ290byBnb3R0ZW47CiAKLQlpZiAoUGFnZUFub24ob2xkX3BhZ2UpICYmICFUZXN0U2V0UGFnZUxvY2tlZChvbGRfcGFnZSkpIHsKLQkJaW50IHJldXNlID0gY2FuX3NoYXJlX3N3YXBfcGFnZShvbGRfcGFnZSk7Ci0JCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKLQkJaWYgKHJldXNlKSB7Ci0JCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOwotCQkJZW50cnkgPSBwdGVfbWt5b3VuZyhvcmlnX3B0ZSk7Ci0JCQllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwotCQkJcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnksIDEpOwotCQkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIGVudHJ5KTsKLQkJCWxhenlfbW11X3Byb3RfdXBkYXRlKGVudHJ5KTsKLQkJCXJldCB8PSBWTV9GQVVMVF9XUklURTsKLQkJCWdvdG8gdW5sb2NrOworCWlmICh1bmxpa2VseSgodm1hLT52bV9mbGFncyAmIChWTV9TSEFSRUR8Vk1fV1JJVEUpKSA9PQorCQkJCShWTV9TSEFSRUR8Vk1fV1JJVEUpKSkgeworCQlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSkgeworCQkJLyoKKwkJCSAqIE5vdGlmeSB0aGUgYWRkcmVzcyBzcGFjZSB0aGF0IHRoZSBwYWdlIGlzIGFib3V0IHRvCisJCQkgKiBiZWNvbWUgd3JpdGFibGUgc28gdGhhdCBpdCBjYW4gcHJvaGliaXQgdGhpcyBvciB3YWl0CisJCQkgKiBmb3IgdGhlIHBhZ2UgdG8gZ2V0IGludG8gYW4gYXBwcm9wcmlhdGUgc3RhdGUuCisJCQkgKgorCQkJICogV2UgZG8gdGhpcyB3aXRob3V0IHRoZSBsb2NrIGhlbGQsIHNvIHRoYXQgaXQgY2FuCisJCQkgKiBzbGVlcCBpZiBpdCBuZWVkcyB0by4KKwkJCSAqLworCQkJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOworCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCisJCQlpZiAodm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSh2bWEsIG9sZF9wYWdlKSA8IDApCisJCQkJZ290byB1bndyaXRhYmxlX3BhZ2U7CisKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CisKKwkJCS8qCisJCQkgKiBTaW5jZSB3ZSBkcm9wcGVkIHRoZSBsb2NrIHdlIG5lZWQgdG8gcmV2YWxpZGF0ZQorCQkJICogdGhlIFBURSBhcyBzb21lb25lIGVsc2UgbWF5IGhhdmUgY2hhbmdlZCBpdC4gIElmCisJCQkgKiB0aGV5IGRpZCwgd2UganVzdCByZXR1cm4sIGFzIHdlIGNhbiBjb3VudCBvbiB0aGUKKwkJCSAqIE1NVSB0byB0ZWxsIHVzIGlmIHRoZXkgZGlkbid0IGFsc28gbWFrZSBpdCB3cml0YWJsZS4KKwkJCSAqLworCQkJcGFnZV90YWJsZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywKKwkJCQkJCQkgJnB0bCk7CisJCQlpZiAoIXB0ZV9zYW1lKCpwYWdlX3RhYmxlLCBvcmlnX3B0ZSkpCisJCQkJZ290byB1bmxvY2s7CiAJCX0KKworCQlyZXVzZSA9IDE7CisJfSBlbHNlIGlmIChQYWdlQW5vbihvbGRfcGFnZSkgJiYgIVRlc3RTZXRQYWdlTG9ja2VkKG9sZF9wYWdlKSkgeworCQlyZXVzZSA9IGNhbl9zaGFyZV9zd2FwX3BhZ2Uob2xkX3BhZ2UpOworCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJfSBlbHNlIHsKKwkJcmV1c2UgPSAwOworCX0KKworCWlmIChyZXVzZSkgeworCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOworCQllbnRyeSA9IHB0ZV9ta3lvdW5nKG9yaWdfcHRlKTsKKwkJZW50cnkgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KGVudHJ5KSwgdm1hKTsKKwkJcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSwgZW50cnksIDEpOworCQl1cGRhdGVfbW11X2NhY2hlKHZtYSwgYWRkcmVzcywgZW50cnkpOworCQlsYXp5X21tdV9wcm90X3VwZGF0ZShlbnRyeSk7CisJCXJldCB8PSBWTV9GQVVMVF9XUklURTsKKwkJZ290byB1bmxvY2s7CiAJfQogCiAJLyoKQEAgLTE1MjMsNiArMTU3MCwxMCBAQAogCWlmIChvbGRfcGFnZSkKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKIAlyZXR1cm4gVk1fRkFVTFRfT09NOworCit1bndyaXRhYmxlX3BhZ2U6CisJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKKwlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOwogfQogCiAvKgpAQCAtMTg3OSw3ICsxOTMwLDEwIEBACiAJCWdvdG8gb3V0OwogCiAJZW50cnkgPSBwdGVfdG9fc3dwX2VudHJ5KG9yaWdfcHRlKTsKLWFnYWluOgorCWlmIChpc19taWdyYXRpb25fZW50cnkoZW50cnkpKSB7CisJCW1pZ3JhdGlvbl9lbnRyeV93YWl0KG1tLCBwbWQsIGFkZHJlc3MpOworCQlnb3RvIG91dDsKKwl9CiAJcGFnZSA9IGxvb2t1cF9zd2FwX2NhY2hlKGVudHJ5KTsKIAlpZiAoIXBhZ2UpIHsKICAJCXN3YXBpbl9yZWFkYWhlYWQoZW50cnksIGFkZHJlc3MsIHZtYSk7CkBAIC0xOTAzLDEyICsxOTU3LDYgQEAKIAogCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKIAlsb2NrX3BhZ2UocGFnZSk7Ci0JaWYgKCFQYWdlU3dhcENhY2hlKHBhZ2UpKSB7Ci0JCS8qIFBhZ2UgbWlncmF0aW9uIGhhcyBvY2N1cmVkICovCi0JCXVubG9ja19wYWdlKHBhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCWdvdG8gYWdhaW47Ci0JfQogCiAJLyoKIAkgKiBCYWNrIG91dCBpZiBzb21lYm9keSBlbHNlIGFscmVhZHkgZmF1bHRlZCBpbiB0aGlzIHB0ZS4KQEAgLTIwNzQsMTggKzIxMjIsMzEgQEAKIAkvKgogCSAqIFNob3VsZCB3ZSBkbyBhbiBlYXJseSBDLU8tVyBicmVhaz8KIAkgKi8KLQlpZiAod3JpdGVfYWNjZXNzICYmICEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaWYgKHdyaXRlX2FjY2VzcykgeworCQlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKSkgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkJaWYgKHVubGlrZWx5KGFub25fdm1hX3ByZXBhcmUodm1hKSkpCi0JCQlnb3RvIG9vbTsKLQkJcGFnZSA9IGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBhZGRyZXNzKTsKLQkJaWYgKCFwYWdlKQotCQkJZ290byBvb207Ci0JCWNvcHlfdXNlcl9oaWdocGFnZShwYWdlLCBuZXdfcGFnZSwgYWRkcmVzcyk7Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7Ci0JCW5ld19wYWdlID0gcGFnZTsKLQkJYW5vbiA9IDE7CisJCQlpZiAodW5saWtlbHkoYW5vbl92bWFfcHJlcGFyZSh2bWEpKSkKKwkJCQlnb3RvIG9vbTsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlX3ZtYShHRlBfSElHSFVTRVIsIHZtYSwgYWRkcmVzcyk7CisJCQlpZiAoIXBhZ2UpCisJCQkJZ290byBvb207CisJCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZSwgbmV3X3BhZ2UsIGFkZHJlc3MpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG5ld19wYWdlKTsKKwkJCW5ld19wYWdlID0gcGFnZTsKKwkJCWFub24gPSAxOworCisJCX0gZWxzZSB7CisJCQkvKiBpZiB0aGUgcGFnZSB3aWxsIGJlIHNoYXJlYWJsZSwgc2VlIGlmIHRoZSBiYWNraW5nCisJCQkgKiBhZGRyZXNzIHNwYWNlIHdhbnRzIHRvIGtub3cgdGhhdCB0aGUgcGFnZSBpcyBhYm91dAorCQkJICogdG8gYmVjb21lIHdyaXRhYmxlICovCisJCQlpZiAodm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSAmJgorCQkJICAgIHZtYS0+dm1fb3BzLT5wYWdlX21rd3JpdGUodm1hLCBuZXdfcGFnZSkgPCAwCisJCQkgICAgKSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG5ld19wYWdlKTsKKwkJCQlyZXR1cm4gVk1fRkFVTFRfU0lHQlVTOworCQkJfQorCQl9CiAJfQogCiAJcGFnZV90YWJsZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkcmVzcywgJnB0bCk7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnlfaG90cGx1Zy5jIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwppbmRleCA3MGRmNWMwLi44NDFhMDc3IDEwMDY0NAotLS0gYS9tbS9tZW1vcnlfaG90cGx1Zy5jCisrKyBiL21tL21lbW9yeV9ob3RwbHVnLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogZXh0ZXJuIHZvaWQgem9uZXRhYmxlX2FkZChzdHJ1Y3Qgem9uZSAqem9uZSwgaW50IG5pZCwgaW50IHppZCwgdW5zaWduZWQgbG9uZyBwZm4sCiAJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci1zdGF0aWMgdm9pZCBfX2FkZF96b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuKQorc3RhdGljIGludCBfX2FkZF96b25lKHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHBoeXNfc3RhcnRfcGZuKQogewogCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLT56b25lX3BnZGF0OwogCWludCBucl9wYWdlcyA9IFBBR0VTX1BFUl9TRUNUSU9OOwpAQCAtMzQsOCArMzQsMTUgQEAKIAlpbnQgem9uZV90eXBlOwogCiAJem9uZV90eXBlID0gem9uZSAtIHBnZGF0LT5ub2RlX3pvbmVzOworCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpIHsKKwkJaW50IHJldCA9IDA7CisJCXJldCA9IGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoem9uZSwgcGh5c19zdGFydF9wZm4sIG5yX3BhZ2VzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAltZW1tYXBfaW5pdF96b25lKG5yX3BhZ2VzLCBuaWQsIHpvbmVfdHlwZSwgcGh5c19zdGFydF9wZm4pOwogCXpvbmV0YWJsZV9hZGQoem9uZSwgbmlkLCB6b25lX3R5cGUsIHBoeXNfc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJcmV0dXJuIDA7CiB9CiAKIGV4dGVybiBpbnQgc3BhcnNlX2FkZF9vbmVfc2VjdGlvbihzdHJ1Y3Qgem9uZSAqem9uZSwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCkBAIC01MCw3ICs1NywxMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JX19hZGRfem9uZSh6b25lLCBwaHlzX3N0YXJ0X3Bmbik7CisJcmV0ID0gX19hZGRfem9uZSh6b25lLCBwaHlzX3N0YXJ0X3Bmbik7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCXJldHVybiByZWdpc3Rlcl9uZXdfbWVtb3J5KF9fcGZuX3RvX3NlY3Rpb24ocGh5c19zdGFydF9wZm4pKTsKIH0KIApAQCAtMTE2LDYgKzEyNyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIG9ubGluZWRfcGFnZXMgPSAwOwogCXN0cnVjdCB6b25lICp6b25lOworCWludCBuZWVkX3pvbmVsaXN0c19yZWJ1aWxkID0gMDsKIAogCS8qCiAJICogVGhpcyBkb2Vzbid0IG5lZWQgYSBsb2NrIHRvIGRvIHBmbl90b19wYWdlKCkuCkBAIC0xMjgsNiArMTQwLDE0IEBACiAJZ3Jvd19wZ2RhdF9zcGFuKHpvbmUtPnpvbmVfcGdkYXQsIHBmbiwgcGZuICsgbnJfcGFnZXMpOwogCXBnZGF0X3Jlc2l6ZV91bmxvY2soem9uZS0+em9uZV9wZ2RhdCwgJmZsYWdzKTsKIAorCS8qCisJICogSWYgdGhpcyB6b25lIGlzIG5vdCBwb3B1bGF0ZWQsIHRoZW4gaXQgaXMgbm90IGluIHpvbmVsaXN0LgorCSAqIFRoaXMgbWVhbnMgdGhlIHBhZ2UgYWxsb2NhdG9yIGlnbm9yZXMgdGhpcyB6b25lLgorCSAqIFNvLCB6b25lbGlzdCBtdXN0IGJlIHVwZGF0ZWQgYWZ0ZXIgb25saW5lLgorCSAqLworCWlmICghcG9wdWxhdGVkX3pvbmUoem9uZSkpCisJCW5lZWRfem9uZWxpc3RzX3JlYnVpbGQgPSAxOworCiAJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4gKyBpKTsKIAkJb25saW5lX3BhZ2UocGFnZSk7CkBAIC0xMzgsNSArMTU4LDggQEAKIAogCXNldHVwX3Blcl96b25lX3BhZ2VzX21pbigpOwogCisJaWYgKG5lZWRfem9uZWxpc3RzX3JlYnVpbGQpCisJCWJ1aWxkX2FsbF96b25lbGlzdHMoKTsKKwl2bV90b3RhbF9wYWdlcyA9IG5yX2ZyZWVfcGFnZWNhY2hlX3BhZ2VzKCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IDg3NzhmNTguLjczZTBmMjMgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC04Nyw2ICs4Nyw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogCiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTU4Nyw2ICs1ODksMTEgQEAKIAkJaXNvbGF0ZV9scnVfcGFnZShwYWdlLCBwYWdlbGlzdCk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqbmV3X25vZGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBub2RlLCBpbnQgKip4KQoreworCXJldHVybiBhbGxvY19wYWdlc19ub2RlKG5vZGUsIEdGUF9ISUdIVVNFUiwgMCk7Cit9CisKIC8qCiAgKiBNaWdyYXRlIHBhZ2VzIGZyb20gb25lIG5vZGUgdG8gYSB0YXJnZXQgbm9kZS4KICAqIFJldHVybnMgZXJyb3Igb3IgdGhlIG51bWJlciBvZiBwYWdlcyBub3QgbWlncmF0ZWQuCkBAIC02MDMsMTEgKzYxMCw5IEBACiAJY2hlY2tfcmFuZ2UobW0sIG1tLT5tbWFwLT52bV9zdGFydCwgVEFTS19TSVpFLCAmbm1hc2ssCiAJCQlmbGFncyB8IE1QT0xfTUZfRElTQ09OVElHX09LLCAmcGFnZWxpc3QpOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZwYWdlbGlzdCkpIHsKLQkJZXJyID0gbWlncmF0ZV9wYWdlc190bygmcGFnZWxpc3QsIE5VTEwsIGRlc3QpOwotCQlpZiAoIWxpc3RfZW1wdHkoJnBhZ2VsaXN0KSkKLQkJCXB1dGJhY2tfbHJ1X3BhZ2VzKCZwYWdlbGlzdCk7Ci0JfQorCWlmICghbGlzdF9lbXB0eSgmcGFnZWxpc3QpKQorCQllcnIgPSBtaWdyYXRlX3BhZ2VzKCZwYWdlbGlzdCwgbmV3X25vZGVfcGFnZSwgZGVzdCk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC02MjcsNiArNjMyLDEwIEBACiAKICAgCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKIAorCWVyciA9IG1pZ3JhdGVfdm1hcyhtbSwgZnJvbV9ub2RlcywgdG9fbm9kZXMsIGZsYWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogLyoKICAqIEZpbmQgYSAnc291cmNlJyBiaXQgc2V0IGluICd0bXAnIHdob3NlIGNvcnJlc3BvbmRpbmcgJ2Rlc3QnCiAgKiBiaXQgaW4gJ3RvJyBpcyBub3QgYWxzbyBzZXQgaW4gJ3RtcCcuICBDbGVhciB0aGUgZm91bmQgJ3NvdXJjZScKQEAgLTY4Niw3ICs2OTUsNyBAQAogCQlpZiAoZXJyIDwgMCkKIAkJCWJyZWFrOwogCX0KLQorb3V0OgogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CkBAIC02OTQsNiArNzAzLDEyIEBACiAKIH0KIAorc3RhdGljIHN0cnVjdCBwYWdlICpuZXdfdm1hX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgaW50ICoqeCkKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKilwcml2YXRlOworCisJcmV0dXJuIGFsbG9jX3BhZ2Vfdm1hKEdGUF9ISUdIVVNFUiwgdm1hLCBwYWdlX2FkZHJlc3NfaW5fdm1hKHBhZ2UsIHZtYSkpOworfQogI2Vsc2UKIAogc3RhdGljIHZvaWQgbWlncmF0ZV9wYWdlX2FkZChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxpc3RfaGVhZCAqcGFnZWxpc3QsCkBAIC03MDYsNiArNzIxLDExIEBACiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqbmV3X3ZtYV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUpCit7CisJcmV0dXJuIE5VTEw7Cit9CiAjZW5kaWYKIAogbG9uZyBkb19tYmluZCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwKQEAgLTc2NywxNSArNzg3LDEzIEBACiAJCWVyciA9IG1iaW5kX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCwgbmV3KTsKIAogCQlpZiAoIWxpc3RfZW1wdHkoJnBhZ2VsaXN0KSkKLQkJCW5yX2ZhaWxlZCA9IG1pZ3JhdGVfcGFnZXNfdG8oJnBhZ2VsaXN0LCB2bWEsIC0xKTsKKwkJCW5yX2ZhaWxlZCA9IG1pZ3JhdGVfcGFnZXMoJnBhZ2VsaXN0LCBuZXdfdm1hX3BhZ2UsCisJCQkJCQkodW5zaWduZWQgbG9uZyl2bWEpOwogCiAJCWlmICghZXJyICYmIG5yX2ZhaWxlZCAmJiAoZmxhZ3MgJiBNUE9MX01GX1NUUklDVCkpCiAJCQllcnIgPSAtRUlPOwogCX0KIAotCWlmICghbGlzdF9lbXB0eSgmcGFnZWxpc3QpKQotCQlwdXRiYWNrX2xydV9wYWdlcygmcGFnZWxpc3QpOwotCiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJbXBvbF9mcmVlKG5ldyk7CiAJcmV0dXJuIGVycjsKQEAgLTkyOSw2ICs5NDcsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJZXJyID0gc2VjdXJpdHlfdGFza19tb3ZlbWVtb3J5KHRhc2spOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCiAJZXJyID0gZG9fbWlncmF0ZV9wYWdlcyhtbSwgJm9sZCwgJm5ldywKIAkJY2FwYWJsZShDQVBfU1lTX05JQ0UpID8gTVBPTF9NRl9NT1ZFX0FMTCA6IE1QT0xfTUZfTU9WRSk7CiBvdXQ6CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggMWMyNTA0MC4uM2YxZTBjMiAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgpAQCAtMjMsMTMgKzI0LDEzIEBACiAjaW5jbHVkZSA8bGludXgvdG9wb2xvZ3kuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMgdG8gdGFrZSBvZmYgdGhlIExSVSBmb3IgbWlncmF0aW9uICovCi0jZGVmaW5lIE1JR1JBVEVfQ0hVTktfU0laRSAyNTYKLQogI2RlZmluZSBscnVfdG9fcGFnZShfaGVhZCkgKGxpc3RfZW50cnkoKF9oZWFkKS0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSkpCiAKIC8qCkBAIC02NCwxNiArNjUsMTEgQEAKIH0KIAogLyoKLSAqIG1pZ3JhdGVfcHJlcCgpIG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciB3ZSBoYXZlIGNvbXBpbGVkIHRoZSBsaXN0IG9mIHBhZ2VzCi0gKiB0byBiZSBtaWdyYXRlZCB1c2luZyBpc29sYXRlX2xydV9wYWdlKCkgYnV0IGJlZm9yZSB3ZSBiZWdpbiBhIHNlcmllcyBvZiBjYWxscwotICogdG8gbWlncmF0ZV9wYWdlcygpLgorICogbWlncmF0ZV9wcmVwKCkgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB3ZSBzdGFydCBjb21waWxpbmcgYSBsaXN0IG9mIHBhZ2VzCisgKiB0byBiZSBtaWdyYXRlZCB1c2luZyBpc29sYXRlX2xydV9wYWdlKCkuCiAgKi8KIGludCBtaWdyYXRlX3ByZXAodm9pZCkKIHsKLQkvKiBNdXN0IGhhdmUgc3dhcCBkZXZpY2UgZm9yIG1pZ3JhdGlvbiAqLwotCWlmIChucl9zd2FwX3BhZ2VzIDw9IDApCi0JCXJldHVybiAtRU5PREVWOwotCiAJLyoKIAkgKiBDbGVhciB0aGUgTFJVIGxpc3RzIHNvIHBhZ2VzIGNhbiBiZSBpc29sYXRlZC4KIAkgKiBOb3RlIHRoYXQgcGFnZXMgbWF5IGJlIG1vdmVkIG9mZiB0aGUgTFJVIGFmdGVyIHdlIGhhdmUKQEAgLTg3LDcgKzgzLDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG1vdmVfdG9fbHJ1KHN0cnVjdCBwYWdlICpwYWdlKQogewotCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCWlmIChQYWdlQWN0aXZlKHBhZ2UpKSB7CiAJCS8qCiAJCSAqIGxydV9jYWNoZV9hZGRfYWN0aXZlIGNoZWNrcyB0aGF0CkBAIC0xMTMsMTEzICsxMDgsMjAwIEBACiAJaW50IGNvdW50ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBwYWdlMiwgbCwgbHJ1KSB7CisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwogCQltb3ZlX3RvX2xydShwYWdlKTsKIAkJY291bnQrKzsKIAl9CiAJcmV0dXJuIGNvdW50OwogfQogCi0vKgotICogTm9uIG1pZ3JhdGFibGUgcGFnZQotICovCi1pbnQgZmFpbF9taWdyYXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSBpbnQgaXNfc3dhcF9wdGUocHRlX3QgcHRlKQogewotCXJldHVybiAtRUlPOwotfQotRVhQT1JUX1NZTUJPTChmYWlsX21pZ3JhdGVfcGFnZSk7Ci0KLS8qCi0gKiBzd2Fwb3V0IGEgc2luZ2xlIHBhZ2UKLSAqIHBhZ2UgaXMgbG9ja2VkIHVwb24gZW50cnksIHVubG9ja2VkIG9uIGV4aXQKLSAqLwotc3RhdGljIGludCBzd2FwX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7Ci0KLQlpZiAocGFnZV9tYXBwZWQocGFnZSkgJiYgbWFwcGluZykKLQkJaWYgKHRyeV90b191bm1hcChwYWdlLCAxKSAhPSBTV0FQX1NVQ0NFU1MpCi0JCQlnb3RvIHVubG9ja19yZXRyeTsKLQotCWlmIChQYWdlRGlydHkocGFnZSkpIHsKLQkJLyogUGFnZSBpcyBkaXJ0eSwgdHJ5IHRvIHdyaXRlIGl0IG91dCBoZXJlICovCi0JCXN3aXRjaChwYWdlb3V0KHBhZ2UsIG1hcHBpbmcpKSB7Ci0JCWNhc2UgUEFHRV9LRUVQOgotCQljYXNlIFBBR0VfQUNUSVZBVEU6Ci0JCQlnb3RvIHVubG9ja19yZXRyeTsKLQotCQljYXNlIFBBR0VfU1VDQ0VTUzoKLQkJCWdvdG8gcmV0cnk7Ci0KLQkJY2FzZSBQQUdFX0NMRUFOOgotCQkJOyAvKiB0cnkgdG8gZnJlZSB0aGUgcGFnZSBiZWxvdyAqLwotCQl9Ci0JfQotCi0JaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKSB7Ci0JCWlmICghdHJ5X3RvX3JlbGVhc2VfcGFnZShwYWdlLCBHRlBfS0VSTkVMKSB8fAotCQkgICAgKCFtYXBwaW5nICYmIHBhZ2VfY291bnQocGFnZSkgPT0gMSkpCi0JCQlnb3RvIHVubG9ja19yZXRyeTsKLQl9Ci0KLQlpZiAocmVtb3ZlX21hcHBpbmcobWFwcGluZywgcGFnZSkpIHsKLQkJLyogU3VjY2VzcyAqLwotCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi11bmxvY2tfcmV0cnk6Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci0KLXJldHJ5OgotCXJldHVybiAtRUFHQUlOOworCXJldHVybiAhcHRlX25vbmUocHRlKSAmJiAhcHRlX3ByZXNlbnQocHRlKSAmJiAhcHRlX2ZpbGUocHRlKTsKIH0KIAogLyoKLSAqIFJlbW92ZSByZWZlcmVuY2VzIGZvciBhIHBhZ2UgYW5kIGVzdGFibGlzaCB0aGUgbmV3IHBhZ2Ugd2l0aCB0aGUgY29ycmVjdAotICogYmFzaWMgc2V0dGluZ3MgdG8gYmUgYWJsZSB0byBzdG9wIGFjY2Vzc2VzIHRvIHRoZSBwYWdlLgorICogUmVzdG9yZSBhIHBvdGVudGlhbCBtaWdyYXRpb24gcHRlIHRvIGEgd29ya2luZyBwdGUgZW50cnkKICAqLwotaW50IG1pZ3JhdGVfcGFnZV9yZW1vdmVfcmVmZXJlbmNlcyhzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwKLQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG5yX3JlZnMpCitzdGF0aWMgdm9pZCByZW1vdmVfbWlncmF0aW9uX3B0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKKwkJc3RydWN0IHBhZ2UgKm9sZCwgc3RydWN0IHBhZ2UgKm5ldykKIHsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJc3dwX2VudHJ5X3QgZW50cnk7CisgCXBnZF90ICpwZ2Q7CisgCXB1ZF90ICpwdWQ7CisgCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZXAsIHB0ZTsKKyAJc3BpbmxvY2tfdCAqcHRsOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHBhZ2VfYWRkcmVzc19pbl92bWEobmV3LCB2bWEpOworCisJaWYgKGFkZHIgPT0gLUVGQVVMVCkKKwkJcmV0dXJuOworCisgCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHIpOworCWlmICghcGdkX3ByZXNlbnQoKnBnZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOworCWlmICghcHVkX3ByZXNlbnQoKnB1ZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOworCWlmICghcG1kX3ByZXNlbnQoKnBtZCkpCisJCXJldHVybjsKKworCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcChwbWQsIGFkZHIpOworCisJaWYgKCFpc19zd2FwX3B0ZSgqcHRlcCkpIHsKKwkJcHRlX3VubWFwKHB0ZXApOworIAkJcmV0dXJuOworIAl9CisKKyAJcHRsID0gcHRlX2xvY2twdHIobW0sIHBtZCk7CisgCXNwaW5fbG9jayhwdGwpOworCXB0ZSA9ICpwdGVwOworCWlmICghaXNfc3dhcF9wdGUocHRlKSkKKwkJZ290byBvdXQ7CisKKwllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKworCWlmICghaXNfbWlncmF0aW9uX2VudHJ5KGVudHJ5KSB8fCBtaWdyYXRpb25fZW50cnlfdG9fcGFnZShlbnRyeSkgIT0gb2xkKQorCQlnb3RvIG91dDsKKworCWdldF9wYWdlKG5ldyk7CisJcHRlID0gcHRlX21rb2xkKG1rX3B0ZShuZXcsIHZtYS0+dm1fcGFnZV9wcm90KSk7CisJaWYgKGlzX3dyaXRlX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCisJCXB0ZSA9IHB0ZV9ta3dyaXRlKHB0ZSk7CisJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlcCwgcHRlKTsKKworCWlmIChQYWdlQW5vbihuZXcpKQorCQlwYWdlX2FkZF9hbm9uX3JtYXAobmV3LCB2bWEsIGFkZHIpOworCWVsc2UKKwkJcGFnZV9hZGRfZmlsZV9ybWFwKG5ldyk7CisKKwkvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXByZXNlbnQgYmVmb3JlICovCisJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHIsIHB0ZSk7CisJbGF6eV9tbXVfcHJvdF91cGRhdGUocHRlKTsKKworb3V0OgorCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCByZW1vdmVfZmlsZV9taWdyYXRpb25fcHRlcyB3aWxsIG9ubHkgd29yayBvbiByZWd1bGFyIG1hcHBpbmdzLAorICogTm9ubGluZWFyIG1hcHBpbmdzIGRvIG5vdCB1c2UgbWlncmF0aW9uIGVudHJpZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9maWxlX21pZ3JhdGlvbl9wdGVzKHN0cnVjdCBwYWdlICpvbGQsIHN0cnVjdCBwYWdlICpuZXcpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcobmV3KTsKKwlzdHJ1Y3QgcHJpb190cmVlX2l0ZXIgaXRlcjsKKwlwZ29mZl90IHBnb2ZmID0gbmV3LT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQpOworCisJaWYgKCFtYXBwaW5nKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKworCXZtYV9wcmlvX3RyZWVfZm9yZWFjaCh2bWEsICZpdGVyLCAmbWFwcGluZy0+aV9tbWFwLCBwZ29mZiwgcGdvZmYpCisJCXJlbW92ZV9taWdyYXRpb25fcHRlKHZtYSwgb2xkLCBuZXcpOworCisJc3Bpbl91bmxvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKK30KKworLyoKKyAqIE11c3QgaG9sZCBtbWFwX3NlbSBsb2NrIG9uIGF0IGxlYXN0IG9uZSBvZiB0aGUgdm1hcyBjb250YWluaW5nCisgKiB0aGUgcGFnZSBzbyB0aGF0IHRoZSBhbm9uX3ZtYSBjYW5ub3QgdmFuaXNoLgorICovCitzdGF0aWMgdm9pZCByZW1vdmVfYW5vbl9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgcGFnZSAqb2xkLCBzdHJ1Y3QgcGFnZSAqbmV3KQoreworCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWE7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBtYXBwaW5nOworCisJbWFwcGluZyA9ICh1bnNpZ25lZCBsb25nKW5ldy0+bWFwcGluZzsKKworCWlmICghbWFwcGluZyB8fCAobWFwcGluZyAmIFBBR0VfTUFQUElOR19BTk9OKSA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhvbGQgdGhlIG1tYXBfc2VtIGxvY2suIFNvIG5vIG5lZWQgdG8gY2FsbCBwYWdlX2xvY2tfYW5vbl92bWEuCisJICovCisJYW5vbl92bWEgPSAoc3RydWN0IGFub25fdm1hICopIChtYXBwaW5nIC0gUEFHRV9NQVBQSU5HX0FOT04pOworCXNwaW5fbG9jaygmYW5vbl92bWEtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bWEsICZhbm9uX3ZtYS0+aGVhZCwgYW5vbl92bWFfbm9kZSkKKwkJcmVtb3ZlX21pZ3JhdGlvbl9wdGUodm1hLCBvbGQsIG5ldyk7CisKKwlzcGluX3VubG9jaygmYW5vbl92bWEtPmxvY2spOworfQorCisvKgorICogR2V0IHJpZCBvZiBhbGwgbWlncmF0aW9uIGVudHJpZXMgYW5kIHJlcGxhY2UgdGhlbSBieQorICogcmVmZXJlbmNlcyB0byB0aGUgaW5kaWNhdGVkIHBhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9taWdyYXRpb25fcHRlcyhzdHJ1Y3QgcGFnZSAqb2xkLCBzdHJ1Y3QgcGFnZSAqbmV3KQoreworCWlmIChQYWdlQW5vbihuZXcpKQorCQlyZW1vdmVfYW5vbl9taWdyYXRpb25fcHRlcyhvbGQsIG5ldyk7CisJZWxzZQorCQlyZW1vdmVfZmlsZV9taWdyYXRpb25fcHRlcyhvbGQsIG5ldyk7Cit9CisKKy8qCisgKiBTb21ldGhpbmcgdXNlZCB0aGUgcHRlIG9mIGEgcGFnZSB1bmRlciBtaWdyYXRpb24uIFdlIG5lZWQgdG8KKyAqIGdldCB0byB0aGUgcGFnZSBhbmQgd2FpdCB1bnRpbCBtaWdyYXRpb24gaXMgZmluaXNoZWQuCisgKiBXaGVuIHdlIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdGhlIGZhdWx0IHdpbGwgYmUgcmV0cmllZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIGRvX3N3YXBfcGFnZSgpLgorICovCit2b2lkIG1pZ3JhdGlvbl9lbnRyeV93YWl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAorCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlwdGVfdCAqcHRlcCwgcHRlOworCXNwaW5sb2NrX3QgKnB0bDsKKwlzd3BfZW50cnlfdCBlbnRyeTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXB0ZXAgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZwdGwpOworCXB0ZSA9ICpwdGVwOworCWlmICghaXNfc3dhcF9wdGUocHRlKSkKKwkJZ290byBvdXQ7CisKKwllbnRyeSA9IHB0ZV90b19zd3BfZW50cnkocHRlKTsKKwlpZiAoIWlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCisJCWdvdG8gb3V0OworCisJcGFnZSA9IG1pZ3JhdGlvbl9lbnRyeV90b19wYWdlKGVudHJ5KTsKKworCWdldF9wYWdlKHBhZ2UpOworCXB0ZV91bm1hcF91bmxvY2socHRlcCwgcHRsKTsKKwl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCXB1dF9wYWdlKHBhZ2UpOworCXJldHVybjsKK291dDoKKwlwdGVfdW5tYXBfdW5sb2NrKHB0ZXAsIHB0bCk7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBwYWdlIGluIHRoZSBtYXBwaW5nLgorICoKKyAqIFRoZSBudW1iZXIgb2YgcmVtYWluaW5nIHJlZmVyZW5jZXMgbXVzdCBiZToKKyAqIDEgZm9yIGFub255bW91cyBwYWdlcyB3aXRob3V0IGEgbWFwcGluZworICogMiBmb3IgcGFnZXMgd2l0aCBhIG1hcHBpbmcKKyAqIDMgZm9yIHBhZ2VzIHdpdGggYSBtYXBwaW5nIGFuZCBQYWdlUHJpdmF0ZSBzZXQuCisgKi8KK3N0YXRpYyBpbnQgbWlncmF0ZV9wYWdlX21vdmVfbWFwcGluZyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQorewogCXN0cnVjdCBwYWdlICoqcmFkaXhfcG9pbnRlcjsKIAotCS8qCi0JICogQXZvaWQgZG9pbmcgYW55IG9mIHRoZSBmb2xsb3dpbmcgd29yayBpZiB0aGUgcGFnZSBjb3VudAotCSAqIGluZGljYXRlcyB0aGF0IHRoZSBwYWdlIGlzIGluIHVzZSBvciB0cnVuY2F0ZSBoYXMgcmVtb3ZlZAotCSAqIHRoZSBwYWdlLgotCSAqLwotCWlmICghbWFwcGluZyB8fCBwYWdlX21hcGNvdW50KHBhZ2UpICsgbnJfcmVmcyAhPSBwYWdlX2NvdW50KHBhZ2UpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCS8qCi0JICogRXN0YWJsaXNoIHN3YXAgcHRlcyBmb3IgYW5vbnltb3VzIHBhZ2VzIG9yIGRlc3Ryb3kgcHRlCi0JICogbWFwcyBmb3IgZmlsZXMuCi0JICoKLQkgKiBJbiBvcmRlciB0byByZWVzdGFibGlzaCBmaWxlIGJhY2tlZCBtYXBwaW5ncyB0aGUgZmF1bHQgaGFuZGxlcnMKLQkgKiB3aWxsIHRha2UgdGhlIHJhZGl4IHRyZWVfbG9jayB3aGljaCBtYXkgdGhlbiBiZSB1c2VkIHRvIHN0b3AKLSAgCSAqIHByb2Nlc3NzZXMgZnJvbSBhY2Nlc3NpbmcgdGhpcyBwYWdlIHVudGlsIHRoZSBuZXcgcGFnZSBpcyByZWFkeS4KLQkgKgotCSAqIEEgcHJvY2VzcyBhY2Nlc3NpbmcgdmlhIGEgc3dhcCBwdGUgKGFuIGFub255bW91cyBwYWdlKSB3aWxsIHRha2UgYQotCSAqIHBhZ2VfbG9jayBvbiB0aGUgb2xkIHBhZ2Ugd2hpY2ggd2lsbCBibG9jayB0aGUgcHJvY2VzcyB1bnRpbCB0aGUKLQkgKiBtaWdyYXRpb24gYXR0ZW1wdCBpcyBjb21wbGV0ZS4gQXQgdGhhdCB0aW1lIHRoZSBQYWdlU3dhcENhY2hlIGJpdAotCSAqIHdpbGwgYmUgZXhhbWluZWQuIElmIHRoZSBwYWdlIHdhcyBtaWdyYXRlZCB0aGVuIHRoZSBQYWdlU3dhcENhY2hlCi0JICogYml0IHdpbGwgYmUgY2xlYXIgYW5kIHRoZSBvcGVyYXRpb24gdG8gcmV0cmlldmUgdGhlIHBhZ2Ugd2lsbCBiZQotCSAqIHJldHJpZWQgd2hpY2ggd2lsbCBmaW5kIHRoZSBuZXcgcGFnZSBpbiB0aGUgcmFkaXggdHJlZS4gVGhlbiBhIG5ldwotCSAqIGRpcmVjdCBtYXBwaW5nIG1heSBiZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHJhZGl4IHRyZWUgY29udGVudHMuCi0JICoKLQkgKiBJZiB0aGUgcGFnZSB3YXMgbm90IG1pZ3JhdGVkIHRoZW4gdGhlIFBhZ2VTd2FwQ2FjaGUgYml0Ci0JICogaXMgc3RpbGwgc2V0IGFuZCB0aGUgb3BlcmF0aW9uIG1heSBjb250aW51ZS4KLQkgKi8KLQlpZiAodHJ5X3RvX3VubWFwKHBhZ2UsIDEpID09IFNXQVBfRkFJTCkKLQkJLyogQSB2bWEgaGFzIFZNX0xPQ0tFRCBzZXQgLT4gcGVybWFuZW50IGZhaWx1cmUgKi8KLQkJcmV0dXJuIC1FUEVSTTsKLQotCS8qCi0JICogR2l2ZSB1cCBpZiB3ZSB3ZXJlIHVuYWJsZSB0byByZW1vdmUgYWxsIG1hcHBpbmdzLgotCSAqLwotCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpKQotCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAoIW1hcHBpbmcpIHsKKwkJLyogQW5vbnltb3VzIHBhZ2UgKi8KKwkJaWYgKHBhZ2VfY291bnQocGFnZSkgIT0gMSkKKwkJCXJldHVybiAtRUFHQUlOOworCQlyZXR1cm4gMDsKKwl9CiAKIAl3cml0ZV9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIApAQCAtMjI3LDcgKzMwOSw3IEBACiAJCQkJCQkmbWFwcGluZy0+cGFnZV90cmVlLAogCQkJCQkJcGFnZV9pbmRleChwYWdlKSk7CiAKLQlpZiAoIXBhZ2VfbWFwcGluZyhwYWdlKSB8fCBwYWdlX2NvdW50KHBhZ2UpICE9IG5yX3JlZnMgfHwKKwlpZiAocGFnZV9jb3VudChwYWdlKSAhPSAyICsgISFQYWdlUHJpdmF0ZShwYWdlKSB8fAogCQkJKnJhZGl4X3BvaW50ZXIgIT0gcGFnZSkgewogCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwogCQlyZXR1cm4gLUVBR0FJTjsKQEAgLTIzNSwxOSArMzE3LDE0IEBACiAKIAkvKgogCSAqIE5vdyB3ZSBrbm93IHRoYXQgbm8gb25lIGVsc2UgaXMgbG9va2luZyBhdCB0aGUgcGFnZS4KLQkgKgotCSAqIENlcnRhaW4gbWluaW1hbCBpbmZvcm1hdGlvbiBhYm91dCBhIHBhZ2UgbXVzdCBiZSBhdmFpbGFibGUKLQkgKiBpbiBvcmRlciBmb3Igb3RoZXIgc3Vic3lzdGVtcyB0byBwcm9wZXJseSBoYW5kbGUgdGhlIHBhZ2UgaWYgdGhleQotCSAqIGZpbmQgaXQgdGhyb3VnaCB0aGUgcmFkaXggdHJlZSB1cGRhdGUgYmVmb3JlIHdlIGFyZSBmaW5pc2hlZAotCSAqIGNvcHlpbmcgdGhlIHBhZ2UuCiAJICovCiAJZ2V0X3BhZ2UobmV3cGFnZSk7Ci0JbmV3cGFnZS0+aW5kZXggPSBwYWdlLT5pbmRleDsKLQluZXdwYWdlLT5tYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKyNpZmRlZiBDT05GSUdfU1dBUAogCWlmIChQYWdlU3dhcENhY2hlKHBhZ2UpKSB7CiAJCVNldFBhZ2VTd2FwQ2FjaGUobmV3cGFnZSk7CiAJCXNldF9wYWdlX3ByaXZhdGUobmV3cGFnZSwgcGFnZV9wcml2YXRlKHBhZ2UpKTsKIAl9CisjZW5kaWYKIAogCSpyYWRpeF9wb2ludGVyID0gbmV3cGFnZTsKIAlfX3B1dF9wYWdlKHBhZ2UpOwpAQCAtMjU1LDEyICszMzIsMTEgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChtaWdyYXRlX3BhZ2VfcmVtb3ZlX3JlZmVyZW5jZXMpOwogCiAvKgogICogQ29weSB0aGUgcGFnZSB0byBpdHMgbmV3IGxvY2F0aW9uCiAgKi8KLXZvaWQgbWlncmF0ZV9wYWdlX2NvcHkoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgbWlncmF0ZV9wYWdlX2NvcHkoc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQogewogCWNvcHlfaGlnaHBhZ2UobmV3cGFnZSwgcGFnZSk7CiAKQEAgLTI4Miw3ICszNTgsOSBAQAogCQlzZXRfcGFnZV9kaXJ0eShuZXdwYWdlKTsKICAJfQogCisjaWZkZWYgQ09ORklHX1NXQVAKIAlDbGVhclBhZ2VTd2FwQ2FjaGUocGFnZSk7CisjZW5kaWYKIAlDbGVhclBhZ2VBY3RpdmUocGFnZSk7CiAJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKIAlzZXRfcGFnZV9wcml2YXRlKHBhZ2UsIDApOwpAQCAtMjk1LDcgKzM3MywxOCBAQAogCWlmIChQYWdlV3JpdGViYWNrKG5ld3BhZ2UpKQogCQllbmRfcGFnZV93cml0ZWJhY2sobmV3cGFnZSk7CiB9Ci1FWFBPUlRfU1lNQk9MKG1pZ3JhdGVfcGFnZV9jb3B5KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgIE1pZ3JhdGlvbiBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQWx3YXlzIGZhaWwgbWlncmF0aW9uLiBVc2VkIGZvciBtYXBwaW5ncyB0aGF0IGFyZSBub3QgbW92YWJsZSAqLworaW50IGZhaWxfbWlncmF0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAtRUlPOworfQorRVhQT1JUX1NZTUJPTChmYWlsX21pZ3JhdGVfcGFnZSk7CiAKIC8qCiAgKiBDb21tb24gbG9naWMgdG8gZGlyZWN0bHkgbWlncmF0ZSBhIHNpbmdsZSBwYWdlIHN1aXRhYmxlIGZvcgpAQCAtMzAzLDI1MSArMzkyLDQwIEBACiAgKgogICogUGFnZXMgYXJlIGxvY2tlZCB1cG9uIGVudHJ5IGFuZCBleGl0LgogICovCi1pbnQgbWlncmF0ZV9wYWdlKHN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCBtaWdyYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpbnQgcmM7CiAKIAlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CS8qIFdyaXRlYmFjayBtdXN0IGJlIGNvbXBsZXRlICovCiAKLQlyYyA9IG1pZ3JhdGVfcGFnZV9yZW1vdmVfcmVmZXJlbmNlcyhuZXdwYWdlLCBwYWdlLCAyKTsKKwlyYyA9IG1pZ3JhdGVfcGFnZV9tb3ZlX21hcHBpbmcobWFwcGluZywgbmV3cGFnZSwgcGFnZSk7CiAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAogCW1pZ3JhdGVfcGFnZV9jb3B5KG5ld3BhZ2UsIHBhZ2UpOwotCi0JLyoKLQkgKiBSZW1vdmUgYXV4aWxpYXJ5IHN3YXAgZW50cmllcyBhbmQgcmVwbGFjZQotCSAqIHRoZW0gd2l0aCByZWFsIHB0ZXMuCi0JICoKLQkgKiBOb3RlIHRoYXQgYSByZWFsIHB0ZSBlbnRyeSB3aWxsIGFsbG93IHByb2Nlc3NlcyB0aGF0IGFyZSBub3QKLQkgKiB3YWl0aW5nIG9uIHRoZSBwYWdlIGxvY2sgdG8gdXNlIHRoZSBuZXcgcGFnZSB2aWEgdGhlIHBhZ2UgdGFibGVzCi0JICogYmVmb3JlIHRoZSBuZXcgcGFnZSBpcyB1bmxvY2tlZC4KLQkgKi8KLQlyZW1vdmVfZnJvbV9zd2FwKG5ld3BhZ2UpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChtaWdyYXRlX3BhZ2UpOwogCiAvKgotICogbWlncmF0ZV9wYWdlcwotICoKLSAqIFR3byBsaXN0cyBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uIFRoZSBmaXJzdCBsaXN0Ci0gKiBjb250YWlucyB0aGUgcGFnZXMgaXNvbGF0ZWQgZnJvbSB0aGUgTFJVIHRvIGJlIG1pZ3JhdGVkLgotICogVGhlIHNlY29uZCBsaXN0IGNvbnRhaW5zIG5ldyBwYWdlcyB0aGF0IHRoZSBwYWdlcyBpc29sYXRlZAotICogY2FuIGJlIG1vdmVkIHRvLiBJZiB0aGUgc2Vjb25kIGxpc3QgaXMgTlVMTCB0aGVuIGFsbAotICogcGFnZXMgYXJlIHN3YXBwZWQgb3V0LgotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFmdGVyIDEwIGF0dGVtcHRzIG9yIGlmIG5vIHBhZ2VzCi0gKiBhcmUgbW92YWJsZSBhbnltb3JlIGJlY2F1c2UgdG8gaGFzIGJlY29tZSBlbXB0eQotICogb3Igbm8gcmV0cnlhYmxlIHBhZ2VzIGV4aXN0IGFueW1vcmUuCi0gKgotICogUmV0dXJuOiBOdW1iZXIgb2YgcGFnZXMgbm90IG1pZ3JhdGVkIHdoZW4gInRvIiByYW4gZW1wdHkuCi0gKi8KLWludCBtaWdyYXRlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKmZyb20sIHN0cnVjdCBsaXN0X2hlYWQgKnRvLAotCQkgIHN0cnVjdCBsaXN0X2hlYWQgKm1vdmVkLCBzdHJ1Y3QgbGlzdF9oZWFkICpmYWlsZWQpCi17Ci0JaW50IHJldHJ5OwotCWludCBucl9mYWlsZWQgPSAwOwotCWludCBwYXNzID0gMDsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTI7Ci0JaW50IHN3YXB3cml0ZSA9IGN1cnJlbnQtPmZsYWdzICYgUEZfU1dBUFdSSVRFOwotCWludCByYzsKLQotCWlmICghc3dhcHdyaXRlKQotCQljdXJyZW50LT5mbGFncyB8PSBQRl9TV0FQV1JJVEU7Ci0KLXJlZG86Ci0JcmV0cnkgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIHBhZ2UyLCBmcm9tLCBscnUpIHsKLQkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UgPSBOVUxMOwotCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQotCQljb25kX3Jlc2NoZWQoKTsKLQotCQlyYyA9IDA7Ci0JCWlmIChwYWdlX2NvdW50KHBhZ2UpID09IDEpCi0JCQkvKiBwYWdlIHdhcyBmcmVlZCBmcm9tIHVuZGVyIHVzLiBTbyB3ZSBhcmUgZG9uZS4gKi8KLQkJCWdvdG8gbmV4dDsKLQotCQlpZiAodG8gJiYgbGlzdF9lbXB0eSh0bykpCi0JCQlicmVhazsKLQotCQkvKgotCQkgKiBTa2lwIGxvY2tlZCBwYWdlcyBkdXJpbmcgdGhlIGZpcnN0IHR3byBwYXNzZXMgdG8gZ2l2ZSB0aGUKLQkJICogZnVuY3Rpb25zIGhvbGRpbmcgdGhlIGxvY2sgdGltZSB0byByZWxlYXNlIHRoZSBwYWdlLiBMYXRlciB3ZQotCQkgKiB1c2UgbG9ja19wYWdlKCkgdG8gaGF2ZSBhIGhpZ2hlciBjaGFuY2Ugb2YgYWNxdWlyaW5nIHRoZQotCQkgKiBsb2NrLgotCQkgKi8KLQkJcmMgPSAtRUFHQUlOOwotCQlpZiAocGFzcyA+IDIpCi0JCQlsb2NrX3BhZ2UocGFnZSk7Ci0JCWVsc2UKLQkJCWlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKLQkJCQlnb3RvIG5leHQ7Ci0KLQkJLyoKLQkJICogT25seSB3YWl0IG9uIHdyaXRlYmFjayBpZiB3ZSBoYXZlIGFscmVhZHkgZG9uZSBhIHBhc3Mgd2hlcmUKLQkJICogd2Ugd2UgbWF5IGhhdmUgdHJpZ2dlcmVkIHdyaXRlb3V0cyBmb3IgbG90cyBvZiBwYWdlcy4KLQkJICovCi0JCWlmIChwYXNzID4gMCkgewotCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQotCQkJCWdvdG8gdW5sb2NrX3BhZ2U7Ci0JCX0KLQotCQkvKgotCQkgKiBBbm9ueW1vdXMgcGFnZXMgbXVzdCBoYXZlIHN3YXAgY2FjaGUgcmVmZXJlbmNlcyBvdGhlcndpc2UKLQkJICogdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgcGFnZSBtYXBzIGNhbm5vdCBiZQotCQkgKiBwcmVzZXJ2ZWQuCi0JCSAqLwotCQlpZiAoUGFnZUFub24ocGFnZSkgJiYgIVBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKLQkJCWlmICghYWRkX3RvX3N3YXAocGFnZSwgR0ZQX0tFUk5FTCkpIHsKLQkJCQlyYyA9IC1FTk9NRU07Ci0JCQkJZ290byB1bmxvY2tfcGFnZTsKLQkJCX0KLQkJfQotCi0JCWlmICghdG8pIHsKLQkJCXJjID0gc3dhcF9wYWdlKHBhZ2UpOwotCQkJZ290byBuZXh0OwotCQl9Ci0KLQkJbmV3cGFnZSA9IGxydV90b19wYWdlKHRvKTsKLQkJbG9ja19wYWdlKG5ld3BhZ2UpOwotCi0JCS8qCi0JCSAqIFBhZ2VzIGFyZSBwcm9wZXJseSBsb2NrZWQgYW5kIHdyaXRlYmFjayBpcyBjb21wbGV0ZS4KLQkJICogVHJ5IHRvIG1pZ3JhdGUgdGhlIHBhZ2UuCi0JCSAqLwotCQltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwotCQlpZiAoIW1hcHBpbmcpCi0JCQlnb3RvIHVubG9ja19ib3RoOwotCi0JCWlmIChtYXBwaW5nLT5hX29wcy0+bWlncmF0ZXBhZ2UpIHsKLQkJCS8qCi0JCQkgKiBNb3N0IHBhZ2VzIGhhdmUgYSBtYXBwaW5nIGFuZCBtb3N0IGZpbGVzeXN0ZW1zCi0JCQkgKiBzaG91bGQgcHJvdmlkZSBhIG1pZ3JhdGlvbiBmdW5jdGlvbi4gQW5vbnltb3VzCi0JCQkgKiBwYWdlcyBhcmUgcGFydCBvZiBzd2FwIHNwYWNlIHdoaWNoIGFsc28gaGFzIGl0cwotCQkJICogb3duIG1pZ3JhdGlvbiBmdW5jdGlvbi4gVGhpcyBpcyB0aGUgbW9zdCBjb21tb24KLQkJCSAqIHBhdGggZm9yIHBhZ2UgbWlncmF0aW9uLgotCQkJICovCi0JCQlyYyA9IG1hcHBpbmctPmFfb3BzLT5taWdyYXRlcGFnZShuZXdwYWdlLCBwYWdlKTsKLQkJCWdvdG8gdW5sb2NrX2JvdGg7Ci0gICAgICAgICAgICAgICAgfQotCi0JCS8qIE1ha2Ugc3VyZSB0aGUgZGlydHkgYml0IGlzIHVwIHRvIGRhdGUgKi8KLQkJaWYgKHRyeV90b191bm1hcChwYWdlLCAxKSA9PSBTV0FQX0ZBSUwpIHsKLQkJCXJjID0gLUVQRVJNOwotCQkJZ290byB1bmxvY2tfYm90aDsKLQkJfQotCi0JCWlmIChwYWdlX21hcGNvdW50KHBhZ2UpKSB7Ci0JCQlyYyA9IC1FQUdBSU47Ci0JCQlnb3RvIHVubG9ja19ib3RoOwotCQl9Ci0KLQkJLyoKLQkJICogRGVmYXVsdCBoYW5kbGluZyBpZiBhIGZpbGVzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZQotCQkgKiBhIG1pZ3JhdGlvbiBmdW5jdGlvbi4gV2UgY2FuIG9ubHkgbWlncmF0ZSBjbGVhbgotCQkgKiBwYWdlcyBzbyB0cnkgdG8gd3JpdGUgb3V0IGFueSBkaXJ0eSBwYWdlcyBmaXJzdC4KLQkJICovCi0JCWlmIChQYWdlRGlydHkocGFnZSkpIHsKLQkJCXN3aXRjaCAocGFnZW91dChwYWdlLCBtYXBwaW5nKSkgewotCQkJY2FzZSBQQUdFX0tFRVA6Ci0JCQljYXNlIFBBR0VfQUNUSVZBVEU6Ci0JCQkJZ290byB1bmxvY2tfYm90aDsKLQotCQkJY2FzZSBQQUdFX1NVQ0NFU1M6Ci0JCQkJdW5sb2NrX3BhZ2UobmV3cGFnZSk7Ci0JCQkJZ290byBuZXh0OwotCi0JCQljYXNlIFBBR0VfQ0xFQU46Ci0JCQkJOyAvKiB0cnkgdG8gbWlncmF0ZSB0aGUgcGFnZSBiZWxvdyAqLwotCQkJfQotICAgICAgICAgICAgICAgIH0KLQotCQkvKgotCQkgKiBCdWZmZXJzIGFyZSBtYW5hZ2VkIGluIGEgZmlsZXN5c3RlbSBzcGVjaWZpYyB3YXkuCi0JCSAqIFdlIG11c3QgaGF2ZSBubyBidWZmZXJzIG9yIGRyb3AgdGhlbS4KLQkJICovCi0JCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSB8fAotCQkgICAgdHJ5X3RvX3JlbGVhc2VfcGFnZShwYWdlLCBHRlBfS0VSTkVMKSkgewotCQkJcmMgPSBtaWdyYXRlX3BhZ2UobmV3cGFnZSwgcGFnZSk7Ci0JCQlnb3RvIHVubG9ja19ib3RoOwotCQl9Ci0KLQkJLyoKLQkJICogT24gZWFybHkgcGFzc2VzIHdpdGggbWFwcGVkIHBhZ2VzIHNpbXBseQotCQkgKiByZXRyeS4gVGhlcmUgbWF5IGJlIGEgbG9jayBoZWxkIGZvciBzb21lCi0JCSAqIGJ1ZmZlcnMgdGhhdCBtYXkgZ28gYXdheS4gTGF0ZXIKLQkJICogc3dhcCB0aGVtIG91dC4KLQkJICovCi0JCWlmIChwYXNzID4gNCkgewotCQkJLyoKLQkJCSAqIFBlcnNpc3RlbnRseSB1bmFibGUgdG8gZHJvcCBidWZmZXJzLi4uLi4gQXMgYQotCQkJICogbWVhc3VyZSBvZiBsYXN0IHJlc29ydCB3ZSBmYWxsIGJhY2sgdG8KLQkJCSAqIHN3YXBfcGFnZSgpLgotCQkJICovCi0JCQl1bmxvY2tfcGFnZShuZXdwYWdlKTsKLQkJCW5ld3BhZ2UgPSBOVUxMOwotCQkJcmMgPSBzd2FwX3BhZ2UocGFnZSk7Ci0JCQlnb3RvIG5leHQ7Ci0JCX0KLQotdW5sb2NrX2JvdGg6Ci0JCXVubG9ja19wYWdlKG5ld3BhZ2UpOwotCi11bmxvY2tfcGFnZToKLQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0KLW5leHQ6Ci0JCWlmIChyYyA9PSAtRUFHQUlOKSB7Ci0JCQlyZXRyeSsrOwotCQl9IGVsc2UgaWYgKHJjKSB7Ci0JCQkvKiBQZXJtYW5lbnQgZmFpbHVyZSAqLwotCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIGZhaWxlZCk7Ci0JCQlucl9mYWlsZWQrKzsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdwYWdlKSB7Ci0JCQkJLyogU3VjY2Vzc2Z1bCBtaWdyYXRpb24uIFJldHVybiBwYWdlIHRvIExSVSAqLwotCQkJCW1vdmVfdG9fbHJ1KG5ld3BhZ2UpOwotCQkJfQotCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsIG1vdmVkKTsKLQkJfQotCX0KLQlpZiAocmV0cnkgJiYgcGFzcysrIDwgMTApCi0JCWdvdG8gcmVkbzsKLQotCWlmICghc3dhcHdyaXRlKQotCQljdXJyZW50LT5mbGFncyAmPSB+UEZfU1dBUFdSSVRFOwotCi0JcmV0dXJuIG5yX2ZhaWxlZCArIHJldHJ5OwotfQotCi0vKgogICogTWlncmF0aW9uIGZ1bmN0aW9uIGZvciBwYWdlcyB3aXRoIGJ1ZmZlcnMuIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZAogICogaWYgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBndWFyYW50ZWVzIHRoYXQgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byAicGFnZSIKICAqIGV4aXN0LgogICovCi1pbnQgYnVmZmVyX21pZ3JhdGVfcGFnZShzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCitpbnQgYnVmZmVyX21pZ3JhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IHBhZ2UgKm5ld3BhZ2UsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKIAlpbnQgcmM7CiAKLQlpZiAoIW1hcHBpbmcpCi0JCXJldHVybiAtRUFHQUlOOwotCiAJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQotCQlyZXR1cm4gbWlncmF0ZV9wYWdlKG5ld3BhZ2UsIHBhZ2UpOworCQlyZXR1cm4gbWlncmF0ZV9wYWdlKG1hcHBpbmcsIG5ld3BhZ2UsIHBhZ2UpOwogCiAJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKIAotCXJjID0gbWlncmF0ZV9wYWdlX3JlbW92ZV9yZWZlcmVuY2VzKG5ld3BhZ2UsIHBhZ2UsIDMpOworCXJjID0gbWlncmF0ZV9wYWdlX21vdmVfbWFwcGluZyhtYXBwaW5nLCBuZXdwYWdlLCBwYWdlKTsKIAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtNTkwLDczICs0NjgsNTI5IEBACiBFWFBPUlRfU1lNQk9MKGJ1ZmZlcl9taWdyYXRlX3BhZ2UpOwogCiAvKgotICogTWlncmF0ZSB0aGUgbGlzdCAncGFnZWxpc3QnIG9mIHBhZ2VzIHRvIGEgY2VydGFpbiBkZXN0aW5hdGlvbi4KLSAqCi0gKiBTcGVjaWZ5IGRlc3RpbmF0aW9uIHdpdGggZWl0aGVyIG5vbi1OVUxMIHZtYSBvciBkZXN0X25vZGUgPj0gMAotICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMgbm90IG1pZ3JhdGVkIG9yIGVycm9yIGNvZGUKKyAqIFdyaXRlYmFjayBhIHBhZ2UgdG8gY2xlYW4gdGhlIGRpcnR5IHN0YXRlCiAgKi8KLWludCBtaWdyYXRlX3BhZ2VzX3RvKHN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VsaXN0LAotCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGludCBkZXN0KQorc3RhdGljIGludCB3cml0ZW91dChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JTElTVF9IRUFEKG5ld2xpc3QpOwotCUxJU1RfSEVBRChtb3ZlZCk7Ci0JTElTVF9IRUFEKGZhaWxlZCk7Ci0JaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOwotCWludCBucl9wYWdlczsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CisJCS5zeW5jX21vZGUgPSBXQl9TWU5DX05PTkUsCisJCS5ucl90b193cml0ZSA9IDEsCisJCS5yYW5nZV9zdGFydCA9IDAsCisJCS5yYW5nZV9lbmQgPSBMTE9OR19NQVgsCisJCS5ub25ibG9ja2luZyA9IDEsCisJCS5mb3JfcmVjbGFpbSA9IDEKKwl9OworCWludCByYzsKIAotcmVkbzoKLQlucl9wYWdlcyA9IDA7Ci0JbGlzdF9mb3JfZWFjaChwLCBwYWdlbGlzdCkgewotCQlpZiAodm1hKSB7Ci0JCQkvKgotCQkJICogVGhlIGFkZHJlc3MgcGFzc2VkIHRvIGFsbG9jX3BhZ2Vfdm1hIGlzIHVzZWQgdG8KLQkJCSAqIGdlbmVyYXRlIHRoZSBwcm9wZXIgaW50ZXJsZWF2ZSBiZWhhdmlvci4gV2UgZmFrZQotCQkJICogdGhlIGFkZHJlc3MgaGVyZSBieSBhbiBpbmNyZWFzaW5nIG9mZnNldCBpbiBvcmRlcgotCQkJICogdG8gZ2V0IHRoZSBwcm9wZXIgZGlzdHJpYnV0aW9uIG9mIHBhZ2VzLgotCQkJICoKLQkJCSAqIE5vIGRlY2lzaW9uIGhhcyBiZWVuIG1hZGUgYXMgdG8gd2hpY2ggcGFnZQotCQkJICogYSBjZXJ0YWluIG9sZCBwYWdlIGlzIG1vdmVkIHRvIHNvIHdlIGNhbm5vdAotCQkJICogc3BlY2lmeSB0aGUgY29ycmVjdCBhZGRyZXNzLgotCQkJICovCi0JCQlwYWdlID0gYWxsb2NfcGFnZV92bWEoR0ZQX0hJR0hVU0VSLCB2bWEsCi0JCQkJCW9mZnNldCArIHZtYS0+dm1fc3RhcnQpOwotCQkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKLQkJfQorCWlmICghbWFwcGluZy0+YV9vcHMtPndyaXRlcGFnZSkKKwkJLyogTm8gd3JpdGUgbWV0aG9kIGZvciB0aGUgYWRkcmVzcyBzcGFjZSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpCisJCS8qIFNvbWVvbmUgZWxzZSBhbHJlYWR5IHRyaWdnZXJlZCBhIHdyaXRlICovCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBBIGRpcnR5IHBhZ2UgbWF5IGltcGx5IHRoYXQgdGhlIHVuZGVybHlpbmcgZmlsZXN5c3RlbSBoYXMKKwkgKiB0aGUgcGFnZSBvbiBzb21lIHF1ZXVlLiBTbyB0aGUgcGFnZSBtdXN0IGJlIGNsZWFuIGZvcgorCSAqIG1pZ3JhdGlvbi4gV3JpdGVvdXQgbWF5IG1lYW4gd2UgbG9vc2UgdGhlIGxvY2sgYW5kIHRoZQorCSAqIHBhZ2Ugc3RhdGUgaXMgbm8gbG9uZ2VyIHdoYXQgd2UgY2hlY2tlZCBmb3IgZWFybGllci4KKwkgKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCB0aGUgbWlncmF0aW9uIGF0dGVtcHQgY2Fubm90CisJICogYmUgc3VjY2Vzc2Z1bC4KKwkgKi8KKwlyZW1vdmVfbWlncmF0aW9uX3B0ZXMocGFnZSwgcGFnZSk7CisKKwlyYyA9IG1hcHBpbmctPmFfb3BzLT53cml0ZXBhZ2UocGFnZSwgJndiYyk7CisJaWYgKHJjIDwgMCkKKwkJLyogSS9PIEVycm9yIHdyaXRpbmcgKi8KKwkJcmV0dXJuIC1FSU87CisKKwlpZiAocmMgIT0gQU9QX1dSSVRFUEFHRV9BQ1RJVkFURSkKKwkJLyogdW5sb2NrZWQuIFJlbG9jayAqLworCQlsb2NrX3BhZ2UocGFnZSk7CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoKKyAqIERlZmF1bHQgaGFuZGxpbmcgaWYgYSBmaWxlc3lzdGVtIGRvZXMgbm90IHByb3ZpZGUgYSBtaWdyYXRpb24gZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgZmFsbGJhY2tfbWlncmF0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCXN0cnVjdCBwYWdlICpuZXdwYWdlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoUGFnZURpcnR5KHBhZ2UpKQorCQlyZXR1cm4gd3JpdGVvdXQobWFwcGluZywgcGFnZSk7CisKKwkvKgorCSAqIEJ1ZmZlcnMgbWF5IGJlIG1hbmFnZWQgaW4gYSBmaWxlc3lzdGVtIHNwZWNpZmljIHdheS4KKwkgKiBXZSBtdXN0IGhhdmUgbm8gYnVmZmVycyBvciBkcm9wIHRoZW0uCisJICovCisJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkgJiYKKwkgICAgIXRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIG1pZ3JhdGVfcGFnZShtYXBwaW5nLCBuZXdwYWdlLCBwYWdlKTsKK30KKworLyoKKyAqIE1vdmUgYSBwYWdlIHRvIGEgbmV3bHkgYWxsb2NhdGVkIHBhZ2UKKyAqIFRoZSBwYWdlIGlzIGxvY2tlZCBhbmQgYWxsIHB0ZXMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgorICoKKyAqIFRoZSBuZXcgcGFnZSB3aWxsIGhhdmUgcmVwbGFjZWQgdGhlIG9sZCBwYWdlIGlmIHRoaXMgZnVuY3Rpb24KKyAqIGlzIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgbW92ZV90b19uZXdfcGFnZShzdHJ1Y3QgcGFnZSAqbmV3cGFnZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJaW50IHJjOworCisJLyoKKwkgKiBCbG9jayBvdGhlcnMgZnJvbSBhY2Nlc3NpbmcgdGhlIHBhZ2Ugd2hlbiB3ZSBnZXQgYXJvdW5kIHRvCisJICogZXN0YWJsaXNoaW5nIGFkZGl0aW9uYWwgcmVmZXJlbmNlcy4gV2UgYXJlIHRoZSBvbmx5IG9uZQorCSAqIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdGhlIG5ldyBwYWdlIGF0IHRoaXMgcG9pbnQuCisJICovCisJaWYgKFRlc3RTZXRQYWdlTG9ja2VkKG5ld3BhZ2UpKQorCQlCVUcoKTsKKworCS8qIFByZXBhcmUgbWFwcGluZyBmb3IgdGhlIG5ldyBwYWdlLiovCisJbmV3cGFnZS0+aW5kZXggPSBwYWdlLT5pbmRleDsKKwluZXdwYWdlLT5tYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKworCW1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7CisJaWYgKCFtYXBwaW5nKQorCQlyYyA9IG1pZ3JhdGVfcGFnZShtYXBwaW5nLCBuZXdwYWdlLCBwYWdlKTsKKwllbHNlIGlmIChtYXBwaW5nLT5hX29wcy0+bWlncmF0ZXBhZ2UpCisJCS8qCisJCSAqIE1vc3QgcGFnZXMgaGF2ZSBhIG1hcHBpbmcgYW5kIG1vc3QgZmlsZXN5c3RlbXMKKwkJICogc2hvdWxkIHByb3ZpZGUgYSBtaWdyYXRpb24gZnVuY3Rpb24uIEFub255bW91cworCQkgKiBwYWdlcyBhcmUgcGFydCBvZiBzd2FwIHNwYWNlIHdoaWNoIGFsc28gaGFzIGl0cworCQkgKiBvd24gbWlncmF0aW9uIGZ1bmN0aW9uLiBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbgorCQkgKiBwYXRoIGZvciBwYWdlIG1pZ3JhdGlvbi4KKwkJICovCisJCXJjID0gbWFwcGluZy0+YV9vcHMtPm1pZ3JhdGVwYWdlKG1hcHBpbmcsCisJCQkJCQluZXdwYWdlLCBwYWdlKTsKKwllbHNlCisJCXJjID0gZmFsbGJhY2tfbWlncmF0ZV9wYWdlKG1hcHBpbmcsIG5ld3BhZ2UsIHBhZ2UpOworCisJaWYgKCFyYykKKwkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIG5ld3BhZ2UpOworCWVsc2UKKwkJbmV3cGFnZS0+bWFwcGluZyA9IE5VTEw7CisKKwl1bmxvY2tfcGFnZShuZXdwYWdlKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgbG9jayBvbiBwYWdlLCByZW1vdmUgYWxsIHB0ZXMgYW5kIG1pZ3JhdGUgdGhlIHBhZ2UKKyAqIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcGFnZSBpbiBuZXdwYWdlLgorICovCitzdGF0aWMgaW50IHVubWFwX2FuZF9tb3ZlKG5ld19wYWdlX3QgZ2V0X25ld19wYWdlLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGZvcmNlKQoreworCWludCByYyA9IDA7CisJaW50ICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBwYWdlICpuZXdwYWdlID0gZ2V0X25ld19wYWdlKHBhZ2UsIHByaXZhdGUsICZyZXN1bHQpOworCisJaWYgKCFuZXdwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChwYWdlX2NvdW50KHBhZ2UpID09IDEpCisJCS8qIHBhZ2Ugd2FzIGZyZWVkIGZyb20gdW5kZXIgdXMuIFNvIHdlIGFyZSBkb25lLiAqLworCQlnb3RvIG1vdmVfbmV3cGFnZTsKKworCXJjID0gLUVBR0FJTjsKKwlpZiAoVGVzdFNldFBhZ2VMb2NrZWQocGFnZSkpIHsKKwkJaWYgKCFmb3JjZSkKKwkJCWdvdG8gbW92ZV9uZXdwYWdlOworCQlsb2NrX3BhZ2UocGFnZSk7CisJfQorCisJaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKKwkJaWYgKCFmb3JjZSkKKwkJCWdvdG8gdW5sb2NrOworCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCX0KKworCS8qCisJICogRXN0YWJsaXNoIG1pZ3JhdGlvbiBwdGVzIG9yIHJlbW92ZSBwdGVzCisJICovCisJdHJ5X3RvX3VubWFwKHBhZ2UsIDEpOworCWlmICghcGFnZV9tYXBwZWQocGFnZSkpCisJCXJjID0gbW92ZV90b19uZXdfcGFnZShuZXdwYWdlLCBwYWdlKTsKKworCWlmIChyYykKKwkJcmVtb3ZlX21pZ3JhdGlvbl9wdGVzKHBhZ2UsIHBhZ2UpOworCit1bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwlpZiAocmMgIT0gLUVBR0FJTikgeworIAkJLyoKKyAJCSAqIEEgcGFnZSB0aGF0IGhhcyBiZWVuIG1pZ3JhdGVkIGhhcyBhbGwgcmVmZXJlbmNlcworIAkJICogcmVtb3ZlZCBhbmQgd2lsbCBiZSBmcmVlZC4gQSBwYWdlIHRoYXQgaGFzIG5vdCBiZWVuCisgCQkgKiBtaWdyYXRlZCB3aWxsIGhhdmUga2VwdHMgaXRzIHJlZmVyZW5jZXMgYW5kIGJlCisgCQkgKiByZXN0b3JlZC4KKyAJCSAqLworIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisgCQltb3ZlX3RvX2xydShwYWdlKTsKKwl9CisKK21vdmVfbmV3cGFnZToKKwkvKgorCSAqIE1vdmUgdGhlIG5ldyBwYWdlIHRvIHRoZSBMUlUuIElmIG1pZ3JhdGlvbiB3YXMgbm90IHN1Y2Nlc3NmdWwKKwkgKiB0aGVuIHRoaXMgd2lsbCBmcmVlIHRoZSBwYWdlLgorCSAqLworCW1vdmVfdG9fbHJ1KG5ld3BhZ2UpOworCWlmIChyZXN1bHQpIHsKKwkJaWYgKHJjKQorCQkJKnJlc3VsdCA9IHJjOwogCQllbHNlCi0JCQlwYWdlID0gYWxsb2NfcGFnZXNfbm9kZShkZXN0LCBHRlBfSElHSFVTRVIsIDApOworCQkJKnJlc3VsdCA9IHBhZ2VfdG9fbmlkKG5ld3BhZ2UpOworCX0KKwlyZXR1cm4gcmM7Cit9CiAKLQkJaWYgKCFwYWdlKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7CisvKgorICogbWlncmF0ZV9wYWdlcworICoKKyAqIFRoZSBmdW5jdGlvbiB0YWtlcyBvbmUgbGlzdCBvZiBwYWdlcyB0byBtaWdyYXRlIGFuZCBhIGZ1bmN0aW9uCisgKiB0aGF0IGRldGVybWluZXMgZnJvbSB0aGUgcGFnZSB0byBiZSBtaWdyYXRlZCBhbmQgdGhlIHByaXZhdGUgZGF0YQorICogdGhlIHRhcmdldCBvZiB0aGUgbW92ZSBhbmQgYWxsb2NhdGVzIHRoZSBwYWdlLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFmdGVyIDEwIGF0dGVtcHRzIG9yIGlmIG5vIHBhZ2VzCisgKiBhcmUgbW92YWJsZSBhbnltb3JlIGJlY2F1c2UgdG8gaGFzIGJlY29tZSBlbXB0eQorICogb3Igbm8gcmV0cnlhYmxlIHBhZ2VzIGV4aXN0IGFueW1vcmUuIEFsbCBwYWdlcyB3aWxsIGJlCisgKiByZXRydW5lZCB0byB0aGUgTFJVIG9yIGZyZWVkLgorICoKKyAqIFJldHVybjogTnVtYmVyIG9mIHBhZ2VzIG5vdCBtaWdyYXRlZCBvciBlcnJvciBjb2RlLgorICovCitpbnQgbWlncmF0ZV9wYWdlcyhzdHJ1Y3QgbGlzdF9oZWFkICpmcm9tLAorCQluZXdfcGFnZV90IGdldF9uZXdfcGFnZSwgdW5zaWduZWQgbG9uZyBwcml2YXRlKQoreworCWludCByZXRyeSA9IDE7CisJaW50IG5yX2ZhaWxlZCA9IDA7CisJaW50IHBhc3MgPSAwOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlMjsKKwlpbnQgc3dhcHdyaXRlID0gY3VycmVudC0+ZmxhZ3MgJiBQRl9TV0FQV1JJVEU7CisJaW50IHJjOworCisJaWYgKCFzd2Fwd3JpdGUpCisJCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NXQVBXUklURTsKKworCWZvcihwYXNzID0gMDsgcGFzcyA8IDEwICYmIHJldHJ5OyBwYXNzKyspIHsKKwkJcmV0cnkgPSAwOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBwYWdlMiwgZnJvbSwgbHJ1KSB7CisJCQljb25kX3Jlc2NoZWQoKTsKKworCQkJcmMgPSB1bm1hcF9hbmRfbW92ZShnZXRfbmV3X3BhZ2UsIHByaXZhdGUsCisJCQkJCQlwYWdlLCBwYXNzID4gMik7CisKKwkJCXN3aXRjaChyYykgeworCQkJY2FzZSAtRU5PTUVNOgorCQkJCWdvdG8gb3V0OworCQkJY2FzZSAtRUFHQUlOOgorCQkJCXJldHJ5Kys7CisJCQkJYnJlYWs7CisJCQljYXNlIDA6CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIFBlcm1hbmVudCBmYWlsdXJlICovCisJCQkJbnJfZmFpbGVkKys7CisJCQkJYnJlYWs7CisJCQl9CiAJCX0KLQkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmbmV3bGlzdCk7Ci0JCW5yX3BhZ2VzKys7Ci0JCWlmIChucl9wYWdlcyA+IE1JR1JBVEVfQ0hVTktfU0laRSkKLQkJCWJyZWFrOwogCX0KLQllcnIgPSBtaWdyYXRlX3BhZ2VzKHBhZ2VsaXN0LCAmbmV3bGlzdCwgJm1vdmVkLCAmZmFpbGVkKTsKLQotCXB1dGJhY2tfbHJ1X3BhZ2VzKCZtb3ZlZCk7CS8qIENhbGwgcmVsZWFzZSBwYWdlcyBpbnN0ZWFkID8/ICovCi0KLQlpZiAoZXJyID49IDAgJiYgbGlzdF9lbXB0eSgmbmV3bGlzdCkgJiYgIWxpc3RfZW1wdHkocGFnZWxpc3QpKQotCQlnb3RvIHJlZG87CisJcmMgPSAwOwogb3V0OgotCS8qIFJldHVybiBsZWZ0b3ZlciBhbGxvY2F0ZWQgcGFnZXMgKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJm5ld2xpc3QpKSB7Ci0JCXBhZ2UgPSBsaXN0X2VudHJ5KG5ld2xpc3QubmV4dCwgc3RydWN0IHBhZ2UsIGxydSk7Ci0JCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQlfX2ZyZWVfcGFnZShwYWdlKTsKLQl9Ci0JbGlzdF9zcGxpY2UoJmZhaWxlZCwgcGFnZWxpc3QpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOworCWlmICghc3dhcHdyaXRlKQorCQljdXJyZW50LT5mbGFncyAmPSB+UEZfU1dBUFdSSVRFOwogCi0JLyogQ2FsY3VsYXRlIG51bWJlciBvZiBsZWZ0b3ZlciBwYWdlcyAqLwotCW5yX3BhZ2VzID0gMDsKLQlsaXN0X2Zvcl9lYWNoKHAsIHBhZ2VsaXN0KQotCQlucl9wYWdlcysrOwotCXJldHVybiBucl9wYWdlczsKKwlwdXRiYWNrX2xydV9wYWdlcyhmcm9tKTsKKworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIG5yX2ZhaWxlZCArIHJldHJ5OworfQorCisjaWZkZWYgQ09ORklHX05VTUEKKy8qCisgKiBNb3ZlIGEgbGlzdCBvZiBpbmRpdmlkdWFsIHBhZ2VzCisgKi8KK3N0cnVjdCBwYWdlX3RvX25vZGUgeworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgbm9kZTsKKwlpbnQgc3RhdHVzOworfTsKKworc3RhdGljIHN0cnVjdCBwYWdlICpuZXdfcGFnZV9ub2RlKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHByaXZhdGUsCisJCWludCAqKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbSA9IChzdHJ1Y3QgcGFnZV90b19ub2RlICopcHJpdmF0ZTsKKworCXdoaWxlIChwbS0+bm9kZSAhPSBNQVhfTlVNTk9ERVMgJiYgcG0tPnBhZ2UgIT0gcCkKKwkJcG0rKzsKKworCWlmIChwbS0+bm9kZSA9PSBNQVhfTlVNTk9ERVMpCisJCXJldHVybiBOVUxMOworCisJKnJlc3VsdCA9ICZwbS0+c3RhdHVzOworCisJcmV0dXJuIGFsbG9jX3BhZ2VzX25vZGUocG0tPm5vZGUsIEdGUF9ISUdIVVNFUiwgMCk7Cit9CisKKy8qCisgKiBNb3ZlIGEgc2V0IG9mIHBhZ2VzIGFzIGluZGljYXRlZCBpbiB0aGUgcG0gYXJyYXkuIFRoZSBhZGRyCisgKiBmaWVsZCBtdXN0IGJlIHNldCB0byB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwYWdlIHRvIGJlIG1vdmVkCisgKiBhbmQgdGhlIG5vZGUgbnVtYmVyIG11c3QgY29udGFpbiBhIHZhbGlkIHRhcmdldCBub2RlLgorICovCitzdGF0aWMgaW50IGRvX21vdmVfcGFnZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlX3RvX25vZGUgKnBtLAorCQkJCWludCBtaWdyYXRlX2FsbCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBwYWdlX3RvX25vZGUgKnBwOworCUxJU1RfSEVBRChwYWdlbGlzdCk7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwkvKgorCSAqIEJ1aWxkIGEgbGlzdCBvZiBwYWdlcyB0byBtaWdyYXRlCisJICovCisJbWlncmF0ZV9wcmVwKCk7CisJZm9yIChwcCA9IHBtOyBwcC0+bm9kZSAhPSBNQVhfTlVNTk9ERVM7IHBwKyspIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCS8qCisJCSAqIEEgdmFsaWQgcGFnZSBwb2ludGVyIHRoYXQgd2lsbCBub3QgbWF0Y2ggYW55IG9mIHRoZQorCQkgKiBwYWdlcyB0aGF0IHdpbGwgYmUgbW92ZWQuCisJCSAqLworCQlwcC0+cGFnZSA9IFpFUk9fUEFHRSgwKTsKKworCQllcnIgPSAtRUZBVUxUOworCQl2bWEgPSBmaW5kX3ZtYShtbSwgcHAtPmFkZHIpOworCQlpZiAoIXZtYSkKKwkJCWdvdG8gc2V0X3N0YXR1czsKKworCQlwYWdlID0gZm9sbG93X3BhZ2Uodm1hLCBwcC0+YWRkciwgRk9MTF9HRVQpOworCQllcnIgPSAtRU5PRU5UOworCQlpZiAoIXBhZ2UpCisJCQlnb3RvIHNldF9zdGF0dXM7CisKKwkJaWYgKFBhZ2VSZXNlcnZlZChwYWdlKSkJCS8qIENoZWNrIGZvciB6ZXJvIHBhZ2UgKi8KKwkJCWdvdG8gcHV0X2FuZF9zZXQ7CisKKwkJcHAtPnBhZ2UgPSBwYWdlOworCQllcnIgPSBwYWdlX3RvX25pZChwYWdlKTsKKworCQlpZiAoZXJyID09IHBwLT5ub2RlKQorCQkJLyoKKwkJCSAqIE5vZGUgYWxyZWFkeSBpbiB0aGUgcmlnaHQgcGxhY2UKKwkJCSAqLworCQkJZ290byBwdXRfYW5kX3NldDsKKworCQllcnIgPSAtRUFDQ0VTOworCQlpZiAocGFnZV9tYXBjb3VudChwYWdlKSA+IDEgJiYKKwkJCQkhbWlncmF0ZV9hbGwpCisJCQlnb3RvIHB1dF9hbmRfc2V0OworCisJCWVyciA9IGlzb2xhdGVfbHJ1X3BhZ2UocGFnZSwgJnBhZ2VsaXN0KTsKK3B1dF9hbmRfc2V0OgorCQkvKgorCQkgKiBFaXRoZXIgcmVtb3ZlIHRoZSBkdXBsaWNhdGUgcmVmY291bnQgZnJvbQorCQkgKiBpc29sYXRlX2xydV9wYWdlKCkgb3IgZHJvcCB0aGUgcGFnZSByZWYgaWYgaXQgd2FzCisJCSAqIG5vdCBpc29sYXRlZC4KKwkJICovCisJCXB1dF9wYWdlKHBhZ2UpOworc2V0X3N0YXR1czoKKwkJcHAtPnN0YXR1cyA9IGVycjsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnBhZ2VsaXN0KSkKKwkJZXJyID0gbWlncmF0ZV9wYWdlcygmcGFnZWxpc3QsIG5ld19wYWdlX25vZGUsCisJCQkJKHVuc2lnbmVkIGxvbmcpcG0pOworCWVsc2UKKwkJZXJyID0gLUVOT0VOVDsKKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIERldGVybWluZSB0aGUgbm9kZXMgb2YgYSBsaXN0IG9mIHBhZ2VzLiBUaGUgYWRkciBpbiB0aGUgcG0gYXJyYXkKKyAqIG11c3QgaGF2ZSBiZWVuIHNldCB0byB0aGUgdmlydHVhbCBhZGRyZXNzIG9mIHdoaWNoIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgKiB0aGUgbm9kZSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQgZG9fcGFnZXNfc3RhdChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHBhZ2VfdG9fbm9kZSAqcG0pCit7CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJZm9yICggOyBwbS0+bm9kZSAhPSBNQVhfTlVNTk9ERVM7IHBtKyspIHsKKwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlpbnQgZXJyOworCisJCWVyciA9IC1FRkFVTFQ7CisJCXZtYSA9IGZpbmRfdm1hKG1tLCBwbS0+YWRkcik7CisJCWlmICghdm1hKQorCQkJZ290byBzZXRfc3RhdHVzOworCisJCXBhZ2UgPSBmb2xsb3dfcGFnZSh2bWEsIHBtLT5hZGRyLCAwKTsKKwkJZXJyID0gLUVOT0VOVDsKKwkJLyogVXNlIFBhZ2VSZXNlcnZlZCB0byBjaGVjayBmb3IgemVybyBwYWdlICovCisJCWlmICghcGFnZSB8fCBQYWdlUmVzZXJ2ZWQocGFnZSkpCisJCQlnb3RvIHNldF9zdGF0dXM7CisKKwkJZXJyID0gcGFnZV90b19uaWQocGFnZSk7CitzZXRfc3RhdHVzOgorCQlwbS0+c3RhdHVzID0gZXJyOworCX0KKworCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIGEgbGlzdCBvZiBwYWdlcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgY3VycmVudGx5IGV4ZWN1dGluZworICogcHJvY2Vzcy4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19tb3ZlX3BhZ2VzKHBpZF90IHBpZCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKKwkJCWNvbnN0IHZvaWQgX191c2VyICogX191c2VyICpwYWdlcywKKwkJCWNvbnN0IGludCBfX3VzZXIgKm5vZGVzLAorCQkJaW50IF9fdXNlciAqc3RhdHVzLCBpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCW5vZGVtYXNrX3QgdGFza19ub2RlczsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwlzdHJ1Y3QgcGFnZV90b19ub2RlICpwbSA9IE5VTEw7CisKKwkvKiBDaGVjayBmbGFncyAqLworCWlmIChmbGFncyAmIH4oTVBPTF9NRl9NT1ZFfE1QT0xfTUZfTU9WRV9BTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZmxhZ3MgJiBNUE9MX01GX01PVkVfQUxMKSAmJiAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKQorCQlyZXR1cm4gLUVQRVJNOworCisJLyogRmluZCB0aGUgbW1fc3RydWN0ICovCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0YXNrID0gcGlkID8gZmluZF90YXNrX2J5X3BpZChwaWQpIDogY3VycmVudDsKKwlpZiAoIXRhc2spIHsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyZXR1cm4gLUVTUkNIOworCX0KKwltbSA9IGdldF90YXNrX21tKHRhc2spOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCWlmICghbW0pCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIHByb2Nlc3MgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhlIHNwZWNpZmllZAorCSAqIHByb2Nlc3MuIFRoZSByaWdodCBleGlzdHMgaWYgdGhlIHByb2Nlc3MgaGFzIGFkbWluaXN0cmF0aXZlCisJICogY2FwYWJpbGl0aWVzLCBzdXBlcnVzZXIgcHJpdmlsZWdlcyBvciB0aGUgc2FtZQorCSAqIHVzZXJpZCBhcyB0aGUgdGFyZ2V0IHByb2Nlc3MuCisJICovCisJaWYgKChjdXJyZW50LT5ldWlkICE9IHRhc2stPnN1aWQpICYmIChjdXJyZW50LT5ldWlkICE9IHRhc2stPnVpZCkgJiYKKwkgICAgKGN1cnJlbnQtPnVpZCAhPSB0YXNrLT5zdWlkKSAmJiAoY3VycmVudC0+dWlkICE9IHRhc2stPnVpZCkgJiYKKwkgICAgIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkgeworCQllcnIgPSAtRVBFUk07CisJCWdvdG8gb3V0MjsKKwl9CisKKyAJZXJyID0gc2VjdXJpdHlfdGFza19tb3ZlbWVtb3J5KHRhc2spOworIAlpZiAoZXJyKQorIAkJZ290byBvdXQyOworCisKKwl0YXNrX25vZGVzID0gY3B1c2V0X21lbXNfYWxsb3dlZCh0YXNrKTsKKworCS8qIExpbWl0IG5yX3BhZ2VzIHNvIHRoYXQgdGhlIG11bHRpcGxpY2F0aW9uIG1heSBub3Qgb3ZlcmZsb3cgKi8KKwlpZiAobnJfcGFnZXMgPj0gVUxPTkdfTUFYIC8gc2l6ZW9mKHN0cnVjdCBwYWdlX3RvX25vZGUpIC0gMSkgeworCQllcnIgPSAtRTJCSUc7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlwbSA9IHZtYWxsb2MoKG5yX3BhZ2VzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBhZ2VfdG9fbm9kZSkpOworCWlmICghcG0pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQyOworCX0KKworCS8qCisJICogR2V0IHBhcmFtZXRlcnMgZnJvbSB1c2VyIHNwYWNlIGFuZCBpbml0aWFsaXplIHRoZSBwbQorCSAqIGFycmF5LiBSZXR1cm4gdmFyaW91cyBlcnJvcnMgaWYgdGhlIHVzZXIgZGlkIHNvbWV0aGluZyB3cm9uZy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQljb25zdCB2b2lkICpwOworCisJCWVyciA9IC1FRkFVTFQ7CisJCWlmIChnZXRfdXNlcihwLCBwYWdlcyArIGkpKQorCQkJZ290byBvdXQ7CisKKwkJcG1baV0uYWRkciA9ICh1bnNpZ25lZCBsb25nKXA7CisJCWlmIChub2RlcykgeworCQkJaW50IG5vZGU7CisKKwkJCWlmIChnZXRfdXNlcihub2RlLCBub2RlcyArIGkpKQorCQkJCWdvdG8gb3V0OworCisJCQllcnIgPSAtRU5PREVWOworCQkJaWYgKCFub2RlX29ubGluZShub2RlKSkKKwkJCQlnb3RvIG91dDsKKworCQkJZXJyID0gLUVBQ0NFUzsKKwkJCWlmICghbm9kZV9pc3NldChub2RlLCB0YXNrX25vZGVzKSkKKwkJCQlnb3RvIG91dDsKKworCQkJcG1baV0ubm9kZSA9IG5vZGU7CisJCX0KKwl9CisJLyogRW5kIG1hcmtlciAqLworCXBtW25yX3BhZ2VzXS5ub2RlID0gTUFYX05VTU5PREVTOworCisJaWYgKG5vZGVzKQorCQllcnIgPSBkb19tb3ZlX3BhZ2VzKG1tLCBwbSwgZmxhZ3MgJiBNUE9MX01GX01PVkVfQUxMKTsKKwllbHNlCisJCWVyciA9IGRvX3BhZ2VzX3N0YXQobW0sIHBtKTsKKworCWlmIChlcnIgPj0gMCkKKwkJLyogUmV0dXJuIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKKwkJCWlmIChwdXRfdXNlcihwbVtpXS5zdGF0dXMsIHN0YXR1cyArIGkpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisKK291dDoKKwl2ZnJlZShwbSk7CitvdXQyOgorCW1tcHV0KG1tKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qCisgKiBDYWxsIG1pZ3JhdGlvbiBmdW5jdGlvbnMgaW4gdGhlIHZtYV9vcHMgdGhhdCBtYXkgcHJlcGFyZQorICogbWVtb3J5IGluIGEgdm0gZm9yIG1pZ3JhdGlvbi4gbWlncmF0aW9uIGZ1bmN0aW9ucyBtYXkgcGVyZm9ybQorICogdGhlIG1pZ3JhdGlvbiBmb3Igdm1hcyB0aGF0IGRvIG5vdCBoYXZlIGFuIHVuZGVybHlpbmcgcGFnZSBzdHJ1Y3QuCisgKi8KK2ludCBtaWdyYXRlX3ZtYXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sIGNvbnN0IG5vZGVtYXNrX3QgKnRvLAorCWNvbnN0IG5vZGVtYXNrX3QgKmZyb20sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisgCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworIAlpbnQgZXJyID0gMDsKKworIAlmb3Iodm1hID0gbW0tPm1tYXA7IHZtYS0+dm1fbmV4dCAmJiAhZXJyOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKyAJCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+bWlncmF0ZSkgeworIAkJCWVyciA9IHZtYS0+dm1fb3BzLT5taWdyYXRlKHZtYSwgdG8sIGZyb20sIGZsYWdzKTsKKyAJCQlpZiAoZXJyKQorIAkJCQlicmVhazsKKyAJCX0KKyAJfQorIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IGU2ZWUxMjMuLjY0NDZjNjEgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTEwNjUsNyArMTA2NSw4IEBACiAJdm1hLT52bV9zdGFydCA9IGFkZHI7CiAJdm1hLT52bV9lbmQgPSBhZGRyICsgbGVuOwogCXZtYS0+dm1fZmxhZ3MgPSB2bV9mbGFnczsKLQl2bWEtPnZtX3BhZ2VfcHJvdCA9IHByb3RlY3Rpb25fbWFwW3ZtX2ZsYWdzICYgMHgwZl07CisJdm1hLT52bV9wYWdlX3Byb3QgPSBwcm90ZWN0aW9uX21hcFt2bV9mbGFncyAmCisJCQkJKFZNX1JFQUR8Vk1fV1JJVEV8Vk1fRVhFQ3xWTV9TSEFSRUQpXTsKIAl2bWEtPnZtX3Bnb2ZmID0gcGdvZmY7CiAKIAlpZiAoZmlsZSkgewpAQCAtMTA4OSw2ICsxMDkwLDEyIEBACiAJCQlnb3RvIGZyZWVfdm1hOwogCX0KIAorCS8qIERvbid0IG1ha2UgdGhlIFZNQSBhdXRvbWF0aWNhbGx5IHdyaXRhYmxlIGlmIGl0J3Mgc2hhcmVkLCBidXQgdGhlCisJICogYmFja2VyIHdpc2hlcyB0byBrbm93IHdoZW4gcGFnZXMgYXJlIGZpcnN0IHdyaXR0ZW4gdG8gKi8KKwlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSkKKwkJdm1hLT52bV9wYWdlX3Byb3QgPQorCQkJcHJvdGVjdGlvbl9tYXBbdm1fZmxhZ3MgJiAoVk1fUkVBRHxWTV9XUklURXxWTV9FWEVDKV07CisKIAkvKiBXZSBzZXQgVk1fQUNDT1VOVCBpbiBhIHNoYXJlZCBtYXBwaW5nJ3Mgdm1fZmxhZ3MsIHRvIGluZm9ybQogCSAqIHNobWVtX3plcm9fc2V0dXAgKHBlcmhhcHMgY2FsbGVkIHRocm91Z2ggL2Rldi96ZXJvJ3MgLT5tbWFwKQogCSAqIHRoYXQgbWVtb3J5IHJlc2VydmF0aW9uIG11c3QgYmUgY2hlY2tlZDsgYnV0IHRoYXQgcmVzZXJ2YXRpb24KQEAgLTE5MjEsNyArMTkyOCw4IEBACiAJdm1hLT52bV9lbmQgPSBhZGRyICsgbGVuOwogCXZtYS0+dm1fcGdvZmYgPSBwZ29mZjsKIAl2bWEtPnZtX2ZsYWdzID0gZmxhZ3M7Ci0Jdm1hLT52bV9wYWdlX3Byb3QgPSBwcm90ZWN0aW9uX21hcFtmbGFncyAmIDB4MGZdOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcHJvdGVjdGlvbl9tYXBbZmxhZ3MgJgorCQkJCShWTV9SRUFEfFZNX1dSSVRFfFZNX0VYRUN8Vk1fU0hBUkVEKV07CiAJdm1hX2xpbmsobW0sIHZtYSwgcHJldiwgcmJfbGluaywgcmJfcGFyZW50KTsKIG91dDoKIAltbS0+dG90YWxfdm0gKz0gbGVuID4+IFBBR0VfU0hJRlQ7CmRpZmYgLS1naXQgYS9tbS9tcHJvdGVjdC5jIGIvbW0vbXByb3RlY3QuYwppbmRleCA0YzE0ZDQyLi42MzhlZGFiIDEwMDY0NAotLS0gYS9tbS9tcHJvdGVjdC5jCisrKyBiL21tL21wcm90ZWN0LmMKQEAgLTE5LDcgKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjgsMTIgKzI5LDEzIEBACiBzdGF0aWMgdm9pZCBjaGFuZ2VfcHRlX3JhbmdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLAogCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ3Byb3RfdCBuZXdwcm90KQogewotCXB0ZV90ICpwdGU7CisJcHRlX3QgKnB0ZSwgb2xkcHRlOwogCXNwaW5sb2NrX3QgKnB0bDsKIAogCXB0ZSA9IHB0ZV9vZmZzZXRfbWFwX2xvY2sobW0sIHBtZCwgYWRkciwgJnB0bCk7CiAJZG8gewotCQlpZiAocHRlX3ByZXNlbnQoKnB0ZSkpIHsKKwkJb2xkcHRlID0gKnB0ZTsKKwkJaWYgKHB0ZV9wcmVzZW50KG9sZHB0ZSkpIHsKIAkJCXB0ZV90IHB0ZW50OwogCiAJCQkvKiBBdm9pZCBhbiBTTVAgcmFjZSB3aXRoIGhhcmR3YXJlIHVwZGF0ZWQgZGlydHkvY2xlYW4KQEAgLTQzLDcgKzQ1LDIyIEBACiAJCQlwdGVudCA9IHB0ZV9tb2RpZnkocHRlcF9nZXRfYW5kX2NsZWFyKG1tLCBhZGRyLCBwdGUpLCBuZXdwcm90KTsKIAkJCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwgcHRlbnQpOwogCQkJbGF6eV9tbXVfcHJvdF91cGRhdGUocHRlbnQpOworI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKwkJfSBlbHNlIGlmICghcHRlX2ZpbGUob2xkcHRlKSkgeworCQkJc3dwX2VudHJ5X3QgZW50cnkgPSBwdGVfdG9fc3dwX2VudHJ5KG9sZHB0ZSk7CisKKwkJCWlmIChpc193cml0ZV9taWdyYXRpb25fZW50cnkoZW50cnkpKSB7CisJCQkJLyoKKwkJCQkgKiBBIHByb3RlY3Rpb24gY2hlY2sgaXMgZGlmZmljdWx0IHNvCisJCQkJICoganVzdCBiZSBzYWZlIGFuZCBkaXNhYmxlIHdyaXRlCisJCQkJICovCisJCQkJbWFrZV9taWdyYXRpb25fZW50cnlfcmVhZCgmZW50cnkpOworCQkJCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSwKKwkJCQkJc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOworCQkJfQorI2VuZGlmCiAJCX0KKwogCX0gd2hpbGUgKHB0ZSsrLCBhZGRyICs9IFBBR0VfU0laRSwgYWRkciAhPSBlbmQpOwogCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKIH0KQEAgLTEwNiw2ICsxMjMsNyBAQAogCXVuc2lnbmVkIGxvbmcgb2xkZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOwogCWxvbmcgbnJwYWdlcyA9IChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsKIAl1bnNpZ25lZCBsb25nIGNoYXJnZWQgPSAwOworCXVuc2lnbmVkIGludCBtYXNrOwogCXBncHJvdF90IG5ld3Byb3Q7CiAJcGdvZmZfdCBwZ29mZjsKIAlpbnQgZXJyb3I7CkBAIC0xMzIsOCArMTUwLDYgQEAKIAkJfQogCX0KIAotCW5ld3Byb3QgPSBwcm90ZWN0aW9uX21hcFtuZXdmbGFncyAmIDB4Zl07Ci0KIAkvKgogCSAqIEZpcnN0IHRyeSB0byBtZXJnZSB3aXRoIHByZXZpb3VzIGFuZC9vciBuZXh0IHZtYS4KIAkgKi8KQEAgLTE2MCw2ICsxNzYsMTQgQEAKIAl9CiAKIHN1Y2Nlc3M6CisJLyogRG9uJ3QgbWFrZSB0aGUgVk1BIGF1dG9tYXRpY2FsbHkgd3JpdGFibGUgaWYgaXQncyBzaGFyZWQsIGJ1dCB0aGUKKwkgKiBiYWNrZXIgd2lzaGVzIHRvIGtub3cgd2hlbiBwYWdlcyBhcmUgZmlyc3Qgd3JpdHRlbiB0byAqLworCW1hc2sgPSBWTV9SRUFEfFZNX1dSSVRFfFZNX0VYRUN8Vk1fU0hBUkVEOworCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+cGFnZV9ta3dyaXRlKQorCQltYXNrICY9IH5WTV9TSEFSRUQ7CisKKwluZXdwcm90ID0gcHJvdGVjdGlvbl9tYXBbbmV3ZmxhZ3MgJiBtYXNrXTsKKwogCS8qCiAJICogdm1fZmxhZ3MgYW5kIHZtX3BhZ2VfcHJvdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBtbWFwX3NlbQogCSAqIGhlbGQgaW4gd3JpdGUgbW9kZS4KQEAgLTIwNSw4ICsyMjksNyBAQAogCS8qCiAJICogRG9lcyB0aGUgYXBwbGljYXRpb24gZXhwZWN0IFBST1RfUkVBRCB0byBpbXBseSBQUk9UX0VYRUM6CiAJICovCi0JaWYgKHVubGlrZWx5KChwcm90ICYgUFJPVF9SRUFEKSAmJgotCQkJKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgUkVBRF9JTVBMSUVTX0VYRUMpKSkKKwlpZiAoKHByb3QgJiBQUk9UX1JFQUQpICYmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFJFQURfSU1QTElFU19FWEVDKSkKIAkJcHJvdCB8PSBQUk9UX0VYRUM7CiAKIAl2bV9mbGFncyA9IGNhbGNfdm1fcHJvdF9iaXRzKHByb3QpOwpkaWZmIC0tZ2l0IGEvbW0vbXN5bmMuYyBiL21tL21zeW5jLmMKaW5kZXggYmM2Yzk1My4uZDA4MzU0NCAxMDA2NDQKLS0tIGEvbW0vbXN5bmMuYworKysgYi9tbS9tc3luYy5jCkBAIC0xNzAsOCArMTcwLDYgQEAKIAkgKiBqdXN0IGlnbm9yZSB0aGVtLCBidXQgcmV0dXJuIC1FTk9NRU0gYXQgdGhlIGVuZC4KIAkgKi8KIAlkb3duX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKGZsYWdzICYgTVNfU1lOQykKLQkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1lOQ1dSSVRFOwogCXZtYSA9IGZpbmRfdm1hKGN1cnJlbnQtPm1tLCBzdGFydCk7CiAJaWYgKCF2bWEpIHsKIAkJZXJyb3IgPSAtRU5PTUVNOwpAQCAtMjI4LDcgKzIyNiw2IEBACiAJCX0KIAl9IHdoaWxlICh2bWEgJiYgIWRvbmUpOwogb3V0X3VubG9jazoKLQljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOwogCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiBvdXQ6CiAJcmV0dXJuIGVycm9yOwpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggMDQyZTY0My4uZDQ2ZWQwZiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0yMiwxMCArMjIsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAKK2ludCBzeXNjdGxfcGFuaWNfb25fb29tOwogLyogI2RlZmluZSBERUJVRyAqLwogCiAvKioKLSAqIG9vbV9iYWRuZXNzIC0gY2FsY3VsYXRlIGEgbnVtZXJpYyB2YWx1ZSBmb3IgaG93IGJhZCB0aGlzIHRhc2sgaGFzIGJlZW4KKyAqIGJhZG5lc3MgLSBjYWxjdWxhdGUgYSBudW1lcmljIHZhbHVlIGZvciBob3cgYmFkIHRoaXMgdGFzayBoYXMgYmVlbgogICogQHA6IHRhc2sgc3RydWN0IG9mIHdoaWNoIHRhc2sgd2Ugc2hvdWxkIGNhbGN1bGF0ZQogICogQHVwdGltZTogY3VycmVudCB1cHRpbWUgaW4gc2Vjb25kcwogICoKQEAgLTIwMCw3ICsyMDEsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyoKLQkJICogVGhpcyBpcyBpbiB0aGUgcHJvY2VzcyBvZiByZWxlYXNpbmcgbWVtb3J5IHNvIGZvciB3YWl0IGl0CisJCSAqIFRoaXMgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgcmVsZWFzaW5nIG1lbW9yeSBzbyB3YWl0IGZvciBpdAogCQkgKiB0byBmaW5pc2ggYmVmb3JlIGtpbGxpbmcgc29tZSBvdGhlciB0YXNrIGJ5IG1pc3Rha2UuCiAJCSAqLwogCQlyZWxlYXNpbmcgPSB0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTUVNRElFKSB8fApAQCAtMzA2LDcgKzMwNyw3IEBACiB9CiAKIC8qKgotICogb29tX2tpbGwgLSBraWxsIHRoZSAiYmVzdCIgcHJvY2VzcyB3aGVuIHdlIHJ1biBvdXQgb2YgbWVtb3J5CisgKiBvdXRfb2ZfbWVtb3J5IC0ga2lsbCB0aGUgImJlc3QiIHByb2Nlc3Mgd2hlbiB3ZSBydW4gb3V0IG9mIG1lbW9yeQogICoKICAqIElmIHdlIHJ1biBvdXQgb2YgbWVtb3J5LCB3ZSBoYXZlIHRoZSBjaG9pY2UgYmV0d2VlbiBlaXRoZXIKICAqIGtpbGxpbmcgYSByYW5kb20gdGFzayAoYmFkKSwgbGV0dGluZyB0aGUgc3lzdGVtIGNyYXNoICh3b3JzZSkKQEAgLTM0NCw2ICszNDUsOCBAQAogCQlicmVhazsKIAogCWNhc2UgQ09OU1RSQUlOVF9OT05FOgorCQlpZiAoc3lzY3RsX3BhbmljX29uX29vbSkKKwkJCXBhbmljKCJvdXQgb2YgbWVtb3J5LiBwYW5pY19vbl9vb20gaXMgc2VsZWN0ZWRcbiIpOwogcmV0cnk6CiAJCS8qCiAJCSAqIFJhbWJvIG1vZGU6IFNob290IGRvd24gYSBwcm9jZXNzIGFuZCBob3BlIGl0IHNvbHZlcyB3aGF0ZXZlcgpkaWZmIC0tZ2l0IGEvbW0vcGFnZS13cml0ZWJhY2suYyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKaW5kZXggNzVkN2Y0OC4uOGNjZjZmMWIgMTAwNjQ0Ci0tLSBhL21tL3BhZ2Utd3JpdGViYWNrLmMKKysrIGIvbW0vcGFnZS13cml0ZWJhY2suYwpAQCAtMjA0LDYgKzIwNCw3IEBACiAJCQkuc3luY19tb2RlCT0gV0JfU1lOQ19OT05FLAogCQkJLm9sZGVyX3RoYW5fdGhpcyA9IE5VTEwsCiAJCQkubnJfdG9fd3JpdGUJPSB3cml0ZV9jaHVuaywKKwkJCS5yYW5nZV9jeWNsaWMJPSAxLAogCQl9OwogCiAJCWdldF9kaXJ0eV9saW1pdHMoJndicywgJmJhY2tncm91bmRfdGhyZXNoLApAQCAtMzMxLDYgKzMzMiw3IEBACiAJCS5vbGRlcl90aGFuX3RoaXMgPSBOVUxMLAogCQkubnJfdG9fd3JpdGUJPSAwLAogCQkubm9uYmxvY2tpbmcJPSAxLAorCQkucmFuZ2VfY3ljbGljCT0gMSwKIAl9OwogCiAJZm9yICggOyA7ICkgewpAQCAtNDA3LDYgKzQwOSw3IEBACiAJCS5ucl90b193cml0ZQk9IDAsCiAJCS5ub25ibG9ja2luZwk9IDEsCiAJCS5mb3Jfa3VwZGF0ZQk9IDEsCisJCS5yYW5nZV9jeWNsaWMJPSAxLAogCX07CiAKIAlzeW5jX3N1cGVycygpOwpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDI1M2E0NTAuLjZjMTE3NGYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub2RlbWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KKyNpbmNsdWRlIDxsaW51eC9zdG9wX21hY2hpbmUuaD4KIAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtODMsOCArODQsOCBAQAogc3RhdGljIGNoYXIgKnpvbmVfbmFtZXNbTUFYX05SX1pPTkVTXSA9IHsgIkRNQSIsICJETUEzMiIsICJOb3JtYWwiLCAiSGlnaE1lbSIgfTsKIGludCBtaW5fZnJlZV9rYnl0ZXMgPSAxMDI0OwogCi11bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgbnJfa2VybmVsX3BhZ2VzOwotdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIG5yX2FsbF9wYWdlczsKK3Vuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBucl9rZXJuZWxfcGFnZXM7Cit1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbnJfYWxsX3BhZ2VzOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCiBzdGF0aWMgaW50IHBhZ2Vfb3V0c2lkZV96b25lX2JvdW5kYXJpZXMoc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMjg2LDIyICsyODcsMjcgQEAKICAqIHdlIGNhbiBkbyBjb2FsZXNjZSBhIHBhZ2UgYW5kIGl0cyBidWRkeSBpZgogICogKGEpIHRoZSBidWRkeSBpcyBub3QgaW4gYSBob2xlICYmCiAgKiAoYikgdGhlIGJ1ZGR5IGlzIGluIHRoZSBidWRkeSBzeXN0ZW0gJiYKLSAqIChjKSBhIHBhZ2UgYW5kIGl0cyBidWRkeSBoYXZlIHRoZSBzYW1lIG9yZGVyLgorICogKGMpIGEgcGFnZSBhbmQgaXRzIGJ1ZGR5IGhhdmUgdGhlIHNhbWUgb3JkZXIgJiYKKyAqIChkKSBhIHBhZ2UgYW5kIGl0cyBidWRkeSBhcmUgaW4gdGhlIHNhbWUgem9uZS4KICAqCiAgKiBGb3IgcmVjb3JkaW5nIHdoZXRoZXIgYSBwYWdlIGlzIGluIHRoZSBidWRkeSBzeXN0ZW0sIHdlIHVzZSBQR19idWRkeS4KICAqIFNldHRpbmcsIGNsZWFyaW5nLCBhbmQgdGVzdGluZyBQR19idWRkeSBpcyBzZXJpYWxpemVkIGJ5IHpvbmUtPmxvY2suCiAgKgogICogRm9yIHJlY29yZGluZyBwYWdlJ3Mgb3JkZXIsIHdlIHVzZSBwYWdlX3ByaXZhdGUocGFnZSkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBhZ2VfaXNfYnVkZHkoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvcmRlcikKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2VfaXNfYnVkZHkoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBwYWdlICpidWRkeSwKKwkJCQkJCQkJaW50IG9yZGVyKQogewogI2lmZGVmIENPTkZJR19IT0xFU19JTl9aT05FCi0JaWYgKCFwZm5fdmFsaWQocGFnZV90b19wZm4ocGFnZSkpKQorCWlmICghcGZuX3ZhbGlkKHBhZ2VfdG9fcGZuKGJ1ZGR5KSkpCiAJCXJldHVybiAwOwogI2VuZGlmCiAKLQlpZiAoUGFnZUJ1ZGR5KHBhZ2UpICYmIHBhZ2Vfb3JkZXIocGFnZSkgPT0gb3JkZXIpIHsKLQkJQlVHX09OKHBhZ2VfY291bnQocGFnZSkgIT0gMCk7CisJaWYgKHBhZ2Vfem9uZV9pZChwYWdlKSAhPSBwYWdlX3pvbmVfaWQoYnVkZHkpKQorCQlyZXR1cm4gMDsKKworCWlmIChQYWdlQnVkZHkoYnVkZHkpICYmIHBhZ2Vfb3JkZXIoYnVkZHkpID09IG9yZGVyKSB7CisJCUJVR19PTihwYWdlX2NvdW50KGJ1ZGR5KSAhPSAwKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtMzUyLDcgKzM1OCw3IEBACiAJCXN0cnVjdCBwYWdlICpidWRkeTsKIAogCQlidWRkeSA9IF9fcGFnZV9maW5kX2J1ZGR5KHBhZ2UsIHBhZ2VfaWR4LCBvcmRlcik7Ci0JCWlmICghcGFnZV9pc19idWRkeShidWRkeSwgb3JkZXIpKQorCQlpZiAoIXBhZ2VfaXNfYnVkZHkocGFnZSwgYnVkZHksIG9yZGVyKSkKIAkJCWJyZWFrOwkJLyogTW92ZSB0aGUgYnVkZHkgdXAgb25lIGxldmVsLiAqLwogCiAJCWxpc3RfZGVsKCZidWRkeS0+bHJ1KTsKQEAgLTk1MSw4ICs5NTcsNyBAQAogCQlnb3RvIGdvdF9wZzsKIAogCWRvIHsKLQkJaWYgKGNwdXNldF96b25lX2FsbG93ZWQoKnosIGdmcF9tYXNrfF9fR0ZQX0hBUkRXQUxMKSkKLQkJCXdha2V1cF9rc3dhcGQoKnosIG9yZGVyKTsKKwkJd2FrZXVwX2tzd2FwZCgqeiwgb3JkZXIpOwogCX0gd2hpbGUgKCooKyt6KSk7CiAKIAkvKgpAQCAtMTQ4NSw3ICsxNDkwLDcgQEAKIAl9CiAKIAlmb3JfZWFjaF96b25lKHpvbmUpIHsKLSAJCXVuc2lnbmVkIGxvbmcgbnIsIGZsYWdzLCBvcmRlciwgdG90YWwgPSAwOworIAkJdW5zaWduZWQgbG9uZyBucltNQVhfT1JERVJdLCBmbGFncywgb3JkZXIsIHRvdGFsID0gMDsKIAogCQlzaG93X25vZGUoem9uZSk7CiAJCXByaW50aygiJXM6ICIsIHpvbmUtPm5hbWUpOwpAQCAtMTQ5NiwxMSArMTUwMSwxMiBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ6b25lLT5sb2NrLCBmbGFncyk7CiAJCWZvciAob3JkZXIgPSAwOyBvcmRlciA8IE1BWF9PUkRFUjsgb3JkZXIrKykgewotCQkJbnIgPSB6b25lLT5mcmVlX2FyZWFbb3JkZXJdLm5yX2ZyZWU7Ci0JCQl0b3RhbCArPSBuciA8PCBvcmRlcjsKLQkJCXByaW50aygiJWx1KiVsdWtCICIsIG5yLCBLKDFVTCkgPDwgb3JkZXIpOworCQkJbnJbb3JkZXJdID0gem9uZS0+ZnJlZV9hcmVhW29yZGVyXS5ucl9mcmVlOworCQkJdG90YWwgKz0gbnJbb3JkZXJdIDw8IG9yZGVyOwogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnpvbmUtPmxvY2ssIGZsYWdzKTsKKwkJZm9yIChvcmRlciA9IDA7IG9yZGVyIDwgTUFYX09SREVSOyBvcmRlcisrKQorCQkJcHJpbnRrKCIlbHUqJWx1a0IgIiwgbnJbb3JkZXJdLCBLKDFVTCkgPDwgb3JkZXIpOwogCQlwcmludGsoIj0gJWx1a0JcbiIsIEsodG90YWwpKTsKIAl9CiAKQEAgLTE1MTIsNyArMTUxOCw3IEBACiAgKgogICogQWRkIGFsbCBwb3B1bGF0ZWQgem9uZXMgb2YgYSBub2RlIHRvIHRoZSB6b25lbGlzdC4KICAqLwotc3RhdGljIGludCBfX2luaXQgYnVpbGRfem9uZWxpc3RzX25vZGUocGdfZGF0YV90ICpwZ2RhdCwKK3N0YXRpYyBpbnQgX19tZW1pbml0IGJ1aWxkX3pvbmVsaXN0c19ub2RlKHBnX2RhdGFfdCAqcGdkYXQsCiAJCQlzdHJ1Y3Qgem9uZWxpc3QgKnpvbmVsaXN0LCBpbnQgbnJfem9uZXMsIGludCB6b25lX3R5cGUpCiB7CiAJc3RydWN0IHpvbmUgKnpvbmU7CkBAIC0xNTQ4LDcgKzE1NTQsNyBAQAogCiAjaWZkZWYgQ09ORklHX05VTUEKICNkZWZpbmUgTUFYX05PREVfTE9BRCAobnVtX29ubGluZV9ub2RlcygpKQotc3RhdGljIGludCBfX2luaXRkYXRhIG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOworc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5vZGVfbG9hZFtNQVhfTlVNTk9ERVNdOwogLyoqCiAgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUgbmV4dCBub2RlIHRoYXQgc2hvdWxkIGFwcGVhciBpbiBhIGdpdmVuIG5vZGUncyBmYWxsYmFjayBsaXN0CiAgKiBAbm9kZTogbm9kZSB3aG9zZSBmYWxsYmFjayBsaXN0IHdlJ3JlIGFwcGVuZGluZwpAQCAtMTU2Myw3ICsxNTY5LDcgQEAKICAqIG9uIHRoZW0gb3RoZXJ3aXNlLgogICogSXQgcmV0dXJucyAtMSBpZiBubyBub2RlIGlzIGZvdW5kLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBmaW5kX25leHRfYmVzdF9ub2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVfbWFzaykKK3N0YXRpYyBpbnQgX19tZW1pbml0IGZpbmRfbmV4dF9iZXN0X25vZGUoaW50IG5vZGUsIG5vZGVtYXNrX3QgKnVzZWRfbm9kZV9tYXNrKQogewogCWludCBuLCB2YWw7CiAJaW50IG1pbl92YWwgPSBJTlRfTUFYOwpAQCAtMTYwOSw3ICsxNjE1LDcgQEAKIAlyZXR1cm4gYmVzdF9ub2RlOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCitzdGF0aWMgdm9pZCBfX21lbWluaXQgYnVpbGRfem9uZWxpc3RzKHBnX2RhdGFfdCAqcGdkYXQpCiB7CiAJaW50IGksIGosIGssIG5vZGUsIGxvY2FsX25vZGU7CiAJaW50IHByZXZfbm9kZSwgbG9hZDsKQEAgLTE2NjEsNyArMTY2Nyw3IEBACiAKICNlbHNlCS8qIENPTkZJR19OVU1BICovCiAKLXN0YXRpYyB2b2lkIF9faW5pdCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKK3N0YXRpYyB2b2lkIF9fbWVtaW5pdCBidWlsZF96b25lbGlzdHMocGdfZGF0YV90ICpwZ2RhdCkKIHsKIAlpbnQgaSwgaiwgaywgbm9kZSwgbG9jYWxfbm9kZTsKIApAQCAtMTY5OSwxNCArMTcwNSwyOSBAQAogCiAjZW5kaWYJLyogQ09ORklHX05VTUEgKi8KIAotdm9pZCBfX2luaXQgYnVpbGRfYWxsX3pvbmVsaXN0cyh2b2lkKQorLyogcmV0dXJuIHZhbHVlcyBpbnQgLi4uLmp1c3QgZm9yIHN0b3BfbWFjaGluZV9ydW4oKSAqLworc3RhdGljIGludCBfX21lbWluaXQgX19idWlsZF9hbGxfem9uZWxpc3RzKHZvaWQgKmR1bW15KQogewotCWludCBpOworCWludCBuaWQ7CisJZm9yX2VhY2hfb25saW5lX25vZGUobmlkKQorCQlidWlsZF96b25lbGlzdHMoTk9ERV9EQVRBKG5pZCkpOworCXJldHVybiAwOworfQogCi0JZm9yX2VhY2hfb25saW5lX25vZGUoaSkKLQkJYnVpbGRfem9uZWxpc3RzKE5PREVfREFUQShpKSk7Ci0JcHJpbnRrKCJCdWlsdCAlaSB6b25lbGlzdHNcbiIsIG51bV9vbmxpbmVfbm9kZXMoKSk7Ci0JY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQoKTsKK3ZvaWQgX19tZW1pbml0IGJ1aWxkX2FsbF96b25lbGlzdHModm9pZCkKK3sKKwlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7CisJCV9fYnVpbGRfYWxsX3pvbmVsaXN0cygwKTsKKwkJY3B1c2V0X2luaXRfY3VycmVudF9tZW1zX2FsbG93ZWQoKTsKKwl9IGVsc2UgeworCQkvKiB3ZSBoYXZlIHRvIHN0b3AgYWxsIGNwdXMgdG8gZ3VhcmFubnRlZSB0aGVyZSBpcyBubyB1c2VyCisJCSAgIG9mIHpvbmVsaXN0ICovCisJCXN0b3BfbWFjaGluZV9ydW4oX19idWlsZF9hbGxfem9uZWxpc3RzLCBOVUxMLCBOUl9DUFVTKTsKKwkJLyogY3B1c2V0IHJlZnJlc2ggcm91dGluZSBzaG91bGQgYmUgaGVyZSAqLworCX0KKwl2bV90b3RhbF9wYWdlcyA9IG5yX2ZyZWVfcGFnZWNhY2hlX3BhZ2VzKCk7CisJcHJpbnRrKCJCdWlsdCAlaSB6b25lbGlzdHMuICBUb3RhbCBwYWdlczogJWxkXG4iLAorCQkJbnVtX29ubGluZV9ub2RlcygpLCB2bV90b3RhbF9wYWdlcyk7CiB9CiAKIC8qCkBAIC0xNzIyLDcgKzE3NDMsOCBAQAogICovCiAjZGVmaW5lIFBBR0VTX1BFUl9XQUlUUVVFVUUJMjU2CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB3YWl0X3RhYmxlX3NpemUodW5zaWduZWQgbG9uZyBwYWdlcykKKyNpZm5kZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgd2FpdF90YWJsZV9oYXNoX25yX2VudHJpZXModW5zaWduZWQgbG9uZyBwYWdlcykKIHsKIAl1bnNpZ25lZCBsb25nIHNpemUgPSAxOwogCkBAIC0xNzQwLDYgKzE3NjIsMjkgQEAKIAogCXJldHVybiBtYXgoc2l6ZSwgNFVMKTsKIH0KKyNlbHNlCisvKgorICogQSB6b25lJ3Mgc2l6ZSBtaWdodCBiZSBjaGFuZ2VkIGJ5IGhvdC1hZGQsIHNvIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUKKyAqIGEgc3VpdGFibGUgc2l6ZSBmb3IgaXRzIHdhaXRfdGFibGUuICBTbyB3ZSB1c2UgdGhlIG1heGltdW0gc2l6ZSBub3cuCisgKgorICogVGhlIG1heCB3YWl0IHRhYmxlIHNpemUgPSA0MDk2IHggc2l6ZW9mKHdhaXRfcXVldWVfaGVhZF90KS4gICBpZToKKyAqCisgKiAgICBpMzg2IChwcmVlbXB0aW9uIGNvbmZpZykgICAgOiA0MDk2IHggMTYgPSA2NEtieXRlLgorICogICAgaWE2NCwgeDg2LTY0IChubyBwcmVlbXB0aW9uKTogNDA5NiB4IDIwID0gODBLYnl0ZS4KKyAqICAgIGlhNjQsIHg4Ni02NCAocHJlZW1wdGlvbikgICA6IDQwOTYgeCAyNCA9IDk2S2J5dGUuCisgKgorICogVGhlIG1heGltdW0gZW50cmllcyBhcmUgcHJlcGFyZWQgd2hlbiBhIHpvbmUncyBtZW1vcnkgaXMgKDUxMksgKyAyNTYpIHBhZ2VzCisgKiBvciBtb3JlIGJ5IHRoZSB0cmFkaXRpb25hbCB3YXkuIChTZWUgYWJvdmUpLiAgSXQgZXF1YWxzOgorICoKKyAqICAgIGkzODYsIHg4Ni02NCwgcG93ZXJwYyg0SyBwYWdlIHNpemUpIDogPSAgKCAyRyArIDFNKWJ5dGUuCisgKiAgICBpYTY0KDE2SyBwYWdlIHNpemUpICAgICAgICAgICAgICAgICA6ID0gICggOEcgKyA0TSlieXRlLgorICogICAgcG93ZXJwYyAoNjRLIHBhZ2Ugc2l6ZSkgICAgICAgICAgICAgOiA9ICAoMzJHICsxNk0pYnl0ZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHdhaXRfdGFibGVfaGFzaF9ucl9lbnRyaWVzKHVuc2lnbmVkIGxvbmcgcGFnZXMpCit7CisJcmV0dXJuIDQwOTZVTDsKK30KKyNlbmRpZgogCiAvKgogICogVGhpcyBpcyBhbiBpbnRlZ2VyIGxvZ2FyaXRobSBzbyB0aGF0IHNoaWZ0cyBjYW4gYmUgdXNlZCBsYXRlcgpAQCAtMjAwNSwyMyArMjA1MCw0NiBAQAogI2VuZGlmCiAKIHN0YXRpYyBfX21lbWluaXQKLXZvaWQgem9uZV93YWl0X3RhYmxlX2luaXQoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGxvbmcgem9uZV9zaXplX3BhZ2VzKQoraW50IHpvbmVfd2FpdF90YWJsZV9pbml0KHN0cnVjdCB6b25lICp6b25lLCB1bnNpZ25lZCBsb25nIHpvbmVfc2l6ZV9wYWdlcykKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gem9uZS0+em9uZV9wZ2RhdDsKKwlzaXplX3QgYWxsb2Nfc2l6ZTsKIAogCS8qCiAJICogVGhlIHBlci1wYWdlIHdhaXRxdWV1ZSBtZWNoYW5pc20gdXNlcyBoYXNoZWQgd2FpdHF1ZXVlcwogCSAqIHBlciB6b25lLgogCSAqLwotCXpvbmUtPndhaXRfdGFibGVfc2l6ZSA9IHdhaXRfdGFibGVfc2l6ZSh6b25lX3NpemVfcGFnZXMpOwotCXpvbmUtPndhaXRfdGFibGVfYml0cyA9CXdhaXRfdGFibGVfYml0cyh6b25lLT53YWl0X3RhYmxlX3NpemUpOwotCXpvbmUtPndhaXRfdGFibGUgPSAod2FpdF9xdWV1ZV9oZWFkX3QgKikKLQkJYWxsb2NfYm9vdG1lbV9ub2RlKHBnZGF0LCB6b25lLT53YWl0X3RhYmxlX3NpemUKLQkJCQkJKiBzaXplb2Yod2FpdF9xdWV1ZV9oZWFkX3QpKTsKKwl6b25lLT53YWl0X3RhYmxlX2hhc2hfbnJfZW50cmllcyA9CisJCSB3YWl0X3RhYmxlX2hhc2hfbnJfZW50cmllcyh6b25lX3NpemVfcGFnZXMpOworCXpvbmUtPndhaXRfdGFibGVfYml0cyA9CisJCXdhaXRfdGFibGVfYml0cyh6b25lLT53YWl0X3RhYmxlX2hhc2hfbnJfZW50cmllcyk7CisJYWxsb2Nfc2l6ZSA9IHpvbmUtPndhaXRfdGFibGVfaGFzaF9ucl9lbnRyaWVzCisJCQkJCSogc2l6ZW9mKHdhaXRfcXVldWVfaGVhZF90KTsKIAotCWZvcihpID0gMDsgaSA8IHpvbmUtPndhaXRfdGFibGVfc2l6ZTsgKytpKQorIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9CT09USU5HKSB7CisJCXpvbmUtPndhaXRfdGFibGUgPSAod2FpdF9xdWV1ZV9oZWFkX3QgKikKKwkJCWFsbG9jX2Jvb3RtZW1fbm9kZShwZ2RhdCwgYWxsb2Nfc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBjYXNlIG1lYW5zIHRoYXQgYSB6b25lIHdob3NlIHNpemUgd2FzIDAgZ2V0cyBuZXcgbWVtb3J5CisJCSAqIHZpYSBtZW1vcnkgaG90LWFkZC4KKwkJICogQnV0IGl0IG1heSBiZSB0aGUgY2FzZSB0aGF0IGEgbmV3IG5vZGUgd2FzIGhvdC1hZGRlZC4gIEluCisJCSAqIHRoaXMgY2FzZSB2bWFsbG9jKCkgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UgdGhpcyBuZXcgbm9kZSdzCisJCSAqIG1lbW9yeSAtIHRoaXMgd2FpdF90YWJsZSBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHVzZSB0aGlzIG5ldworCQkgKiBub2RlIGl0c2VsZiBhcyB3ZWxsLgorCQkgKiBUbyB1c2UgdGhpcyBuZXcgbm9kZSdzIG1lbW9yeSwgZnVydGhlciBjb25zaWRlcmF0aW9uIHdpbGwgYmUKKwkJICogbmVjZXNzYXJ5LgorCQkgKi8KKwkJem9uZS0+d2FpdF90YWJsZSA9ICh3YWl0X3F1ZXVlX2hlYWRfdCAqKXZtYWxsb2MoYWxsb2Nfc2l6ZSk7CisJfQorCWlmICghem9uZS0+d2FpdF90YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IoaSA9IDA7IGkgPCB6b25lLT53YWl0X3RhYmxlX2hhc2hfbnJfZW50cmllczsgKytpKQogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKHpvbmUtPndhaXRfdGFibGUgKyBpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgX19tZW1pbml0IHZvaWQgem9uZV9wY3BfaW5pdChzdHJ1Y3Qgem9uZSAqem9uZSkKQEAgLTIwNDMsMTIgKzIxMTEsMTUgQEAKIAkJCXpvbmUtPm5hbWUsIHpvbmUtPnByZXNlbnRfcGFnZXMsIGJhdGNoKTsKIH0KIAotc3RhdGljIF9fbWVtaW5pdCB2b2lkIGluaXRfY3VycmVudGx5X2VtcHR5X3pvbmUoc3RydWN0IHpvbmUgKnpvbmUsCi0JCXVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK19fbWVtaW5pdCBpbnQgaW5pdF9jdXJyZW50bHlfZW1wdHlfem9uZShzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkJdW5zaWduZWQgbG9uZyB6b25lX3N0YXJ0X3BmbiwKKwkJCQkJdW5zaWduZWQgbG9uZyBzaXplKQogewogCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSB6b25lLT56b25lX3BnZGF0OwotCi0Jem9uZV93YWl0X3RhYmxlX2luaXQoem9uZSwgc2l6ZSk7CisJaW50IHJldDsKKwlyZXQgPSB6b25lX3dhaXRfdGFibGVfaW5pdCh6b25lLCBzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCXBnZGF0LT5ucl96b25lcyA9IHpvbmVfaWR4KHpvbmUpICsgMTsKIAogCXpvbmUtPnpvbmVfc3RhcnRfcGZuID0gem9uZV9zdGFydF9wZm47CkBAIC0yMDU2LDYgKzIxMjcsOCBAQAogCW1lbW1hcF9pbml0KHNpemUsIHBnZGF0LT5ub2RlX2lkLCB6b25lX2lkeCh6b25lKSwgem9uZV9zdGFydF9wZm4pOwogCiAJem9uZV9pbml0X2ZyZWVfbGlzdHMocGdkYXQsIHpvbmUsIHpvbmUtPnNwYW5uZWRfcGFnZXMpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yMDY0LDEyICsyMTM3LDEzIEBACiAgKiAgIC0gbWFyayBhbGwgbWVtb3J5IHF1ZXVlcyBlbXB0eQogICogICAtIGNsZWFyIHRoZSBtZW1vcnkgYml0bWFwcwogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9hcmVhX2luaXRfY29yZShzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LAorc3RhdGljIHZvaWQgX19tZW1pbml0IGZyZWVfYXJlYV9pbml0X2NvcmUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSwgdW5zaWduZWQgbG9uZyAqemhvbGVzX3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBqOwogCWludCBuaWQgPSBwZ2RhdC0+bm9kZV9pZDsKIAl1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuID0gcGdkYXQtPm5vZGVfc3RhcnRfcGZuOworCWludCByZXQ7CiAKIAlwZ2RhdF9yZXNpemVfaW5pdChwZ2RhdCk7CiAJcGdkYXQtPm5yX3pvbmVzID0gMDsKQEAgLTIxMTEsNyArMjE4NSw4IEBACiAJCQljb250aW51ZTsKIAogCQl6b25ldGFibGVfYWRkKHpvbmUsIG5pZCwgaiwgem9uZV9zdGFydF9wZm4sIHNpemUpOwotCQlpbml0X2N1cnJlbnRseV9lbXB0eV96b25lKHpvbmUsIHpvbmVfc3RhcnRfcGZuLCBzaXplKTsKKwkJcmV0ID0gaW5pdF9jdXJyZW50bHlfZW1wdHlfem9uZSh6b25lLCB6b25lX3N0YXJ0X3Bmbiwgc2l6ZSk7CisJCUJVR19PTihyZXQpOwogCQl6b25lX3N0YXJ0X3BmbiArPSBzaXplOwogCX0KIH0KQEAgLTIxNTIsNyArMjIyNyw3IEBACiAjZW5kaWYgLyogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQICovCiB9CiAKLXZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X25vZGUoaW50IG5pZCwgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKK3ZvaWQgX19tZW1pbml0IGZyZWVfYXJlYV9pbml0X25vZGUoaW50IG5pZCwgc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKIAkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSwgdW5zaWduZWQgbG9uZyBub2RlX3N0YXJ0X3BmbiwKIAkJdW5zaWduZWQgbG9uZyAqemhvbGVzX3NpemUpCiB7CkBAIC0yODA0LDQyICsyODc5LDE0IEBACiB9CiAKICNpZmRlZiBDT05GSUdfT1VUX09GX0xJTkVfUEZOX1RPX1BBR0UKLS8qCi0gKiBwZm4gPC0+IHBhZ2UgdHJhbnNsYXRpb24uIG91dC1vZi1saW5lIHZlcnNpb24uCi0gKiAoc2VlIGFzbS1nZW5lcmljL21lbW9yeV9tb2RlbC5oKQotICovCi0jaWYgZGVmaW5lZChDT05GSUdfRkxBVE1FTSkKIHN0cnVjdCBwYWdlICpwZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlyZXR1cm4gbWVtX21hcCArIChwZm4gLSBBUkNIX1BGTl9PRkZTRVQpOworCXJldHVybiBfX3Bmbl90b19wYWdlKHBmbik7CiB9CiB1bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXJldHVybiAocGFnZSAtIG1lbV9tYXApICsgQVJDSF9QRk5fT0ZGU0VUOworCXJldHVybiBfX3BhZ2VfdG9fcGZuKHBhZ2UpOwogfQotI2VsaWYgZGVmaW5lZChDT05GSUdfRElTQ09OVElHTUVNKQotc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCWludCBuaWQgPSBhcmNoX3Bmbl90b19uaWQocGZuKTsKLQlyZXR1cm4gTk9ERV9EQVRBKG5pZCktPm5vZGVfbWVtX21hcCArIGFyY2hfbG9jYWxfcGFnZV9vZmZzZXQocGZuLG5pZCk7Ci19Ci11bnNpZ25lZCBsb25nIHBhZ2VfdG9fcGZuKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQgPSBOT0RFX0RBVEEocGFnZV90b19uaWQocGFnZSkpOwotCXJldHVybiAocGFnZSAtIHBnZGF0LT5ub2RlX21lbV9tYXApICsgcGdkYXQtPm5vZGVfc3RhcnRfcGZuOwotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfU1BBUlNFTUVNKQotc3RydWN0IHBhZ2UgKnBmbl90b19wYWdlKHVuc2lnbmVkIGxvbmcgcGZuKQotewotCXJldHVybiBfX3NlY3Rpb25fbWVtX21hcF9hZGRyKF9fcGZuX3RvX3NlY3Rpb24ocGZuKSkgKyBwZm47Ci19Ci0KLXVuc2lnbmVkIGxvbmcgcGFnZV90b19wZm4oc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JbG9uZyBzZWN0aW9uX2lkID0gcGFnZV90b19zZWN0aW9uKHBhZ2UpOwotCXJldHVybiBwYWdlIC0gX19zZWN0aW9uX21lbV9tYXBfYWRkcihfX25yX3RvX3NlY3Rpb24oc2VjdGlvbl9pZCkpOwotfQotI2VuZGlmIC8qIENPTkZJR19GTEFUTUVNL0RJU0NPTlRJR01NRS9TUEFSU0VNRU0gKi8KIEVYUE9SVF9TWU1CT0wocGZuX3RvX3BhZ2UpOwogRVhQT1JUX1NZTUJPTChwYWdlX3RvX3Bmbik7CiAjZW5kaWYgLyogQ09ORklHX09VVF9PRl9MSU5FX1BGTl9UT19QQUdFICovCmRpZmYgLS1naXQgYS9tbS9wZGZsdXNoLmMgYi9tbS9wZGZsdXNoLmMKaW5kZXggYzRiNmQwYS4uYjAyMTAyZiAxMDA2NDQKLS0tIGEvbW0vcGRmbHVzaC5jCisrKyBiL21tL3BkZmx1c2guYwpAQCAtMTA0LDIxICsxMDQsMjAgQEAKIAkJbGlzdF9tb3ZlKCZteV93b3JrLT5saXN0LCAmcGRmbHVzaF9saXN0KTsKIAkJbXlfd29yay0+d2hlbl9pX3dlbnRfdG9fc2xlZXAgPSBqaWZmaWVzOwogCQlzcGluX3VubG9ja19pcnEoJnBkZmx1c2hfbG9jayk7Ci0KIAkJc2NoZWR1bGUoKTsKLQkJaWYgKHRyeV90b19mcmVlemUoKSkgewotCQkJc3Bpbl9sb2NrX2lycSgmcGRmbHVzaF9sb2NrKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KKwkJdHJ5X3RvX2ZyZWV6ZSgpOwogCQlzcGluX2xvY2tfaXJxKCZwZGZsdXNoX2xvY2spOwogCQlpZiAoIWxpc3RfZW1wdHkoJm15X3dvcmstPmxpc3QpKSB7Ci0JCQlwcmludGsoInBkZmx1c2g6IGJvZ3VzIHdha2V1cCFcbiIpOworCQkJLyoKKwkJCSAqIFNvbWVvbmUgd29rZSB1cyB1cCwgYnV0IHdpdGhvdXQgcmVtb3Zpbmcgb3VyIGNvbnRyb2wKKwkJCSAqIHN0cnVjdHVyZSBmcm9tIHRoZSBnbG9iYWwgbGlzdC4gIHN3c3VzcCB3aWxsIGRvIHRoaXMKKwkJCSAqIGluIHRyeV90b19mcmVlemUoKS0+cmVmcmlnZXJhdG9yKCkuICBIYW5kbGUgaXQuCisJCQkgKi8KIAkJCW15X3dvcmstPmZuID0gTlVMTDsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChteV93b3JrLT5mbiA9PSBOVUxMKSB7Ci0JCQlwcmludGsoInBkZmx1c2g6IE5VTEwgd29yayBmdW5jdGlvblxuIik7CisJCQlwcmludGsoInBkZmx1c2g6IGJvZ3VzIHdha2V1cFxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlzcGluX3VubG9ja19pcnEoJnBkZmx1c2hfbG9jayk7CkBAIC0yMDIsOCArMjAxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwogCi0JaWYgKGZuID09IE5VTEwpCi0JCUJVRygpOwkJLyogSGFyZCB0byBkaWFnbm9zZSBpZiBpdCdzIGRlZmVycmVkICovCisJQlVHX09OKGZuID09IE5VTEwpOwkvKiBIYXJkIHRvIGRpYWdub3NlIGlmIGl0J3MgZGVmZXJyZWQgKi8KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZGZsdXNoX2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmcGRmbHVzaF9saXN0KSkgewpkaWZmIC0tZ2l0IGEvbW0vcmVhZGFoZWFkLmMgYi9tbS9yZWFkYWhlYWQuYwppbmRleCAwZjE0MmE0Li5lMzllNDE2IDEwMDY0NAotLS0gYS9tbS9yZWFkYWhlYWQuYworKysgYi9tbS9yZWFkYWhlYWQuYwpAQCAtMTE4LDggKzExOCw3IEBACiAjZGVmaW5lIGxpc3RfdG9fcGFnZShoZWFkKSAobGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpKQogCiAvKioKLSAqIHJlYWRfY2FjaGVfcGFnZXMgLSBwb3B1bGF0ZSBhbiBhZGRyZXNzIHNwYWNlIHdpdGggc29tZSBwYWdlcywgYW5kCi0gKiAJCQlzdGFydCByZWFkcyBhZ2FpbnN0IHRoZW0uCisgKiByZWFkX2NhY2hlX3BhZ2VzIC0gcG9wdWxhdGUgYW4gYWRkcmVzcyBzcGFjZSB3aXRoIHNvbWUgcGFnZXMgJiBzdGFydCByZWFkcyBhZ2FpbnN0IHRoZW0KICAqIEBtYXBwaW5nOiB0aGUgYWRkcmVzc19zcGFjZQogICogQHBhZ2VzOiBUaGUgYWRkcmVzcyBvZiBhIGxpc3RfaGVhZCB3aGljaCBjb250YWlucyB0aGUgdGFyZ2V0IHBhZ2VzLiAgVGhlc2UKICAqICAgcGFnZXMgaGF2ZSB0aGVpciAtPmluZGV4IHBvcHVsYXRlZCBhbmQgYXJlIG90aGVyd2lzZSB1bmluaXRpYWxpc2VkLgpAQCAtMTgyLDE0ICsxODEsMTEgQEAKIAkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CiAJCWlmICghYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywKIAkJCQkJcGFnZS0+aW5kZXgsIEdGUF9LRVJORUwpKSB7Ci0JCQlyZXQgPSBtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UoZmlscCwgcGFnZSk7Ci0JCQlpZiAocmV0ICE9IEFPUF9UUlVOQ0FURURfUEFHRSkgewotCQkJCWlmICghcGFnZXZlY19hZGQoJmxydV9wdmVjLCBwYWdlKSkKLQkJCQkJX19wYWdldmVjX2xydV9hZGQoJmxydV9wdmVjKTsKLQkJCQljb250aW51ZTsKLQkJCX0gLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gcmVsZWFzZSAqLwotCQl9Ci0JCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZShmaWxwLCBwYWdlKTsKKwkJCWlmICghcGFnZXZlY19hZGQoJmxydV9wdmVjLCBwYWdlKSkKKwkJCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCQl9IGVsc2UKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAl9CiAJcGFnZXZlY19scnVfYWRkKCZscnVfcHZlYyk7CiAJcmV0ID0gMDsKZGlmZiAtLWdpdCBhL21tL3JtYXAuYyBiL21tL3JtYXAuYwppbmRleCAxOTYzZTI2Li5lNzY5MDllIDEwMDY0NAotLS0gYS9tbS9ybWFwLmMKKysrIGIvbW0vcm1hcC5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJc3Bpbl9sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAkJaWYgKGxpa2VseSghdm1hLT5hbm9uX3ZtYSkpIHsKIAkJCXZtYS0+YW5vbl92bWEgPSBhbm9uX3ZtYTsKLQkJCWxpc3RfYWRkKCZ2bWEtPmFub25fdm1hX25vZGUsICZhbm9uX3ZtYS0+aGVhZCk7CisJCQlsaXN0X2FkZF90YWlsKCZ2bWEtPmFub25fdm1hX25vZGUsICZhbm9uX3ZtYS0+aGVhZCk7CiAJCQlhbGxvY2F0ZWQgPSBOVUxMOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogCXN0cnVjdCBhbm9uX3ZtYSAqYW5vbl92bWEgPSB2bWEtPmFub25fdm1hOwogCiAJaWYgKGFub25fdm1hKSB7Ci0JCWxpc3RfYWRkKCZ2bWEtPmFub25fdm1hX25vZGUsICZhbm9uX3ZtYS0+aGVhZCk7CisJCWxpc3RfYWRkX3RhaWwoJnZtYS0+YW5vbl92bWFfbm9kZSwgJmFub25fdm1hLT5oZWFkKTsKIAkJdmFsaWRhdGVfYW5vbl92bWEodm1hKTsKIAl9CiB9CkBAIC0xMzgsNyArMTM4LDcgQEAKIAogCWlmIChhbm9uX3ZtYSkgewogCQlzcGluX2xvY2soJmFub25fdm1hLT5sb2NrKTsKLQkJbGlzdF9hZGQoJnZtYS0+YW5vbl92bWFfbm9kZSwgJmFub25fdm1hLT5oZWFkKTsKKwkJbGlzdF9hZGRfdGFpbCgmdm1hLT5hbm9uX3ZtYV9ub2RlLCAmYW5vbl92bWEtPmhlYWQpOwogCQl2YWxpZGF0ZV9hbm9uX3ZtYSh2bWEpOwogCQlzcGluX3VubG9jaygmYW5vbl92bWEtPmxvY2spOwogCX0KQEAgLTIwNSw0NCArMjA1LDYgQEAKIAlyZXR1cm4gYW5vbl92bWE7CiB9CiAKLSNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCi0vKgotICogUmVtb3ZlIGFuIGFub255bW91cyBwYWdlIGZyb20gc3dhcCByZXBsYWNpbmcgdGhlIHN3YXAgcHRlJ3MKLSAqIHRocm91Z2ggcmVhbCBwdGUncyBwb2ludGluZyB0byB2YWxpZCBwYWdlcyBhbmQgdGhlbiByZWxlYXNpbmcKLSAqIHRoZSBwYWdlIGZyb20gdGhlIHN3YXAgY2FjaGUuCi0gKgotICogTXVzdCBob2xkIHBhZ2UgbG9jayBvbiBwYWdlIGFuZCBtbWFwX3NlbSBvZiBvbmUgdm1hIHRoYXQgY29udGFpbnMKLSAqIHRoZSBwYWdlLgotICovCi12b2lkIHJlbW92ZV9mcm9tX3N3YXAoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGFub25fdm1hICphbm9uX3ZtYTsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKLQl1bnNpZ25lZCBsb25nIG1hcHBpbmc7Ci0KLQlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCXJldHVybjsKLQotCW1hcHBpbmcgPSAodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5nOwotCi0JaWYgKCFtYXBwaW5nIHx8IChtYXBwaW5nICYgUEFHRV9NQVBQSU5HX0FOT04pID09IDApCi0JCXJldHVybjsKLQotCS8qCi0JICogV2UgaG9sZCB0aGUgbW1hcF9zZW0gbG9jay4gU28gbm8gbmVlZCB0byBjYWxsIHBhZ2VfbG9ja19hbm9uX3ZtYS4KLQkgKi8KLQlhbm9uX3ZtYSA9IChzdHJ1Y3QgYW5vbl92bWEgKikgKG1hcHBpbmcgLSBQQUdFX01BUFBJTkdfQU5PTik7Ci0Jc3Bpbl9sb2NrKCZhbm9uX3ZtYS0+bG9jayk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJmFub25fdm1hLT5oZWFkLCBhbm9uX3ZtYV9ub2RlKQotCQlyZW1vdmVfdm1hX3N3YXAodm1hLCBwYWdlKTsKLQotCXNwaW5fdW5sb2NrKCZhbm9uX3ZtYS0+bG9jayk7Ci0JZGVsZXRlX2Zyb21fc3dhcF9jYWNoZShwYWdlKTsKLX0KLUVYUE9SVF9TWU1CT0wocmVtb3ZlX2Zyb21fc3dhcCk7Ci0jZW5kaWYKLQogLyoKICAqIEF0IHdoYXQgdXNlciB2aXJ0dWFsIGFkZHJlc3MgaXMgcGFnZSBleHBlY3RlZCBpbiB2bWE/CiAgKi8KQEAgLTU3OCw3ICs1NDAsNyBAQAogICogcmVwZWF0ZWRseSBmcm9tIGVpdGhlciB0cnlfdG9fdW5tYXBfYW5vbiBvciB0cnlfdG9fdW5tYXBfZmlsZS4KICAqLwogc3RhdGljIGludCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJCQlpbnQgaWdub3JlX3JlZnMpCisJCQkJaW50IG1pZ3JhdGlvbikKIHsKIAlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwpAQCAtNjAwLDkgKzU2Miw4IEBACiAJICogSWYgaXQncyByZWNlbnRseSByZWZlcmVuY2VkIChwZXJoYXBzIHBhZ2VfcmVmZXJlbmNlZAogCSAqIHNraXBwZWQgb3ZlciB0aGlzIG1tKSB0aGVuIHdlIHNob3VsZCByZWFjdGl2YXRlIGl0LgogCSAqLwotCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkgfHwKLQkJCShwdGVwX2NsZWFyX2ZsdXNoX3lvdW5nKHZtYSwgYWRkcmVzcywgcHRlKQotCQkJCSYmICFpZ25vcmVfcmVmcykpIHsKKwlpZiAoIW1pZ3JhdGlvbiAmJiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHx8CisJCQkocHRlcF9jbGVhcl9mbHVzaF95b3VuZyh2bWEsIGFkZHJlc3MsIHB0ZSkpKSkgewogCQlyZXQgPSBTV0FQX0ZBSUw7CiAJCWdvdG8gb3V0X3VubWFwOwogCX0KQEAgLTYyMCwyNCArNTgxLDQ1IEBACiAKIAlpZiAoUGFnZUFub24ocGFnZSkpIHsKIAkJc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSBwYWdlX3ByaXZhdGUocGFnZSkgfTsKLQkJLyoKLQkJICogU3RvcmUgdGhlIHN3YXAgbG9jYXRpb24gaW4gdGhlIHB0ZS4KLQkJICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi4KLQkJICovCi0JCUJVR19PTighUGFnZVN3YXBDYWNoZShwYWdlKSk7Ci0JCXN3YXBfZHVwbGljYXRlKGVudHJ5KTsKLQkJaWYgKGxpc3RfZW1wdHkoJm1tLT5tbWxpc3QpKSB7Ci0JCQlzcGluX2xvY2soJm1tbGlzdF9sb2NrKTsKLQkJCWlmIChsaXN0X2VtcHR5KCZtbS0+bW1saXN0KSkKLQkJCQlsaXN0X2FkZCgmbW0tPm1tbGlzdCwgJmluaXRfbW0ubW1saXN0KTsKLQkJCXNwaW5fdW5sb2NrKCZtbWxpc3RfbG9jayk7CisKKwkJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKKwkJCS8qCisJCQkgKiBTdG9yZSB0aGUgc3dhcCBsb2NhdGlvbiBpbiB0aGUgcHRlLgorCQkJICogU2VlIGhhbmRsZV9wdGVfZmF1bHQoKSAuLi4KKwkJCSAqLworCQkJc3dhcF9kdXBsaWNhdGUoZW50cnkpOworCQkJaWYgKGxpc3RfZW1wdHkoJm1tLT5tbWxpc3QpKSB7CisJCQkJc3Bpbl9sb2NrKCZtbWxpc3RfbG9jayk7CisJCQkJaWYgKGxpc3RfZW1wdHkoJm1tLT5tbWxpc3QpKQorCQkJCQlsaXN0X2FkZCgmbW0tPm1tbGlzdCwgJmluaXRfbW0ubW1saXN0KTsKKwkJCQlzcGluX3VubG9jaygmbW1saXN0X2xvY2spOworCQkJfQorCQkJZGVjX21tX2NvdW50ZXIobW0sIGFub25fcnNzKTsKKyNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogU3RvcmUgdGhlIHBmbiBvZiB0aGUgcGFnZSBpbiBhIHNwZWNpYWwgbWlncmF0aW9uCisJCQkgKiBwdGUuIGRvX3N3YXBfcGFnZSgpIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWlncmF0aW9uCisJCQkgKiBwdGUgaXMgcmVtb3ZlZCBhbmQgdGhlbiByZXN0YXJ0IGZhdWx0IGhhbmRsaW5nLgorCQkJICovCisJCQlCVUdfT04oIW1pZ3JhdGlvbik7CisJCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKKyNlbmRpZgogCQl9CiAJCXNldF9wdGVfYXQobW0sIGFkZHJlc3MsIHB0ZSwgc3dwX2VudHJ5X3RvX3B0ZShlbnRyeSkpOwogCQlCVUdfT04ocHRlX2ZpbGUoKnB0ZSkpOwotCQlkZWNfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOwogCX0gZWxzZQorI2lmZGVmIENPTkZJR19NSUdSQVRJT04KKwlpZiAobWlncmF0aW9uKSB7CisJCS8qIEVzdGFibGlzaCBtaWdyYXRpb24gZW50cnkgZm9yIGEgZmlsZSBwYWdlICovCisJCXN3cF9lbnRyeV90IGVudHJ5OworCQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5KHBhZ2UsIHB0ZV93cml0ZShwdGV2YWwpKTsKKwkJc2V0X3B0ZV9hdChtbSwgYWRkcmVzcywgcHRlLCBzd3BfZW50cnlfdG9fcHRlKGVudHJ5KSk7CisJfSBlbHNlCisjZW5kaWYKIAkJZGVjX21tX2NvdW50ZXIobW0sIGZpbGVfcnNzKTsKIAorCiAJcGFnZV9yZW1vdmVfcm1hcChwYWdlKTsKIAlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAKQEAgLTczNiw3ICs3MTgsNyBAQAogCXB0ZV91bm1hcF91bmxvY2socHRlIC0gMSwgcHRsKTsKIH0KIAotc3RhdGljIGludCB0cnlfdG9fdW5tYXBfYW5vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGlnbm9yZV9yZWZzKQorc3RhdGljIGludCB0cnlfdG9fdW5tYXBfYW5vbihzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG1pZ3JhdGlvbikKIHsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hOwogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOwpAQCAtNzQ3LDcgKzcyOSw3IEBACiAJCXJldHVybiByZXQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZtYSwgJmFub25fdm1hLT5oZWFkLCBhbm9uX3ZtYV9ub2RlKSB7Ci0JCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBpZ25vcmVfcmVmcyk7CisJCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBtaWdyYXRpb24pOwogCQlpZiAocmV0ID09IFNXQVBfRkFJTCB8fCAhcGFnZV9tYXBwZWQocGFnZSkpCiAJCQlicmVhazsKIAl9CkBAIC03NjQsNyArNzQ2LDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gdHJ5X3RvX3VubWFwIGZvciBvYmplY3QtYmFzZWQgcGFnZXMuCiAgKi8KLXN0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX2ZpbGUoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBpZ25vcmVfcmVmcykKK3N0YXRpYyBpbnQgdHJ5X3RvX3VubWFwX2ZpbGUoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtaWdyYXRpb24pCiB7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCXBnb2ZmX3QgcGdvZmYgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIFBBR0VfU0hJRlQpOwpAQCAtNzc4LDcgKzc2MCw3IEBACiAKIAlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKIAl2bWFfcHJpb190cmVlX2ZvcmVhY2godm1hLCAmaXRlciwgJm1hcHBpbmctPmlfbW1hcCwgcGdvZmYsIHBnb2ZmKSB7Ci0JCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBpZ25vcmVfcmVmcyk7CisJCXJldCA9IHRyeV90b191bm1hcF9vbmUocGFnZSwgdm1hLCBtaWdyYXRpb24pOwogCQlpZiAocmV0ID09IFNXQVBfRkFJTCB8fCAhcGFnZV9tYXBwZWQocGFnZSkpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC03ODgsNyArNzcwLDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCAmbWFwcGluZy0+aV9tbWFwX25vbmxpbmVhciwKIAkJCQkJCXNoYXJlZC52bV9zZXQubGlzdCkgewotCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkKKwkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSAmJiAhbWlncmF0aW9uKQogCQkJY29udGludWU7CiAJCWN1cnNvciA9ICh1bnNpZ25lZCBsb25nKSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAkJaWYgKGN1cnNvciA+IG1heF9ubF9jdXJzb3IpCkBAIC04MjIsNyArODA0LDcgQEAKIAlkbyB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkodm1hLCAmbWFwcGluZy0+aV9tbWFwX25vbmxpbmVhciwKIAkJCQkJCXNoYXJlZC52bV9zZXQubGlzdCkgewotCQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpCisJCQlpZiAoKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpICYmICFtaWdyYXRpb24pCiAJCQkJY29udGludWU7CiAJCQljdXJzb3IgPSAodW5zaWduZWQgbG9uZykgdm1hLT52bV9wcml2YXRlX2RhdGE7CiAJCQl3aGlsZSAoIGN1cnNvciA8IG1heF9ubF9jdXJzb3IgJiYKQEAgLTg2MywxNiArODQ1LDE2IEBACiAgKiBTV0FQX0FHQUlOCS0gd2UgbWlzc2VkIGEgbWFwcGluZywgdHJ5IGFnYWluIGxhdGVyCiAgKiBTV0FQX0ZBSUwJLSB0aGUgcGFnZSBpcyB1bnN3YXBwYWJsZQogICovCi1pbnQgdHJ5X3RvX3VubWFwKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgaWdub3JlX3JlZnMpCitpbnQgdHJ5X3RvX3VubWFwKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbWlncmF0aW9uKQogewogCWludCByZXQ7CiAKIAlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOwogCiAJaWYgKFBhZ2VBbm9uKHBhZ2UpKQotCQlyZXQgPSB0cnlfdG9fdW5tYXBfYW5vbihwYWdlLCBpZ25vcmVfcmVmcyk7CisJCXJldCA9IHRyeV90b191bm1hcF9hbm9uKHBhZ2UsIG1pZ3JhdGlvbik7CiAJZWxzZQotCQlyZXQgPSB0cnlfdG9fdW5tYXBfZmlsZShwYWdlLCBpZ25vcmVfcmVmcyk7CisJCXJldCA9IHRyeV90b191bm1hcF9maWxlKHBhZ2UsIG1pZ3JhdGlvbik7CiAKIAlpZiAoIXBhZ2VfbWFwcGVkKHBhZ2UpKQogCQlyZXQgPSBTV0FQX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCAxZTQzYzhhLi4zOGJjMzMzIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTEwODEsMTQgKzEwODEsNiBAQAogCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKIAkJCWdvdG8gcmVwZWF0OwogCQl9Ci0JCWlmICghUGFnZVN3YXBDYWNoZShzd2FwcGFnZSkpIHsKLQkJCS8qIFBhZ2UgbWlncmF0aW9uIGhhcyBvY2N1cmVkICovCi0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJdW5sb2NrX3BhZ2Uoc3dhcHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHN3YXBwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9CiAJCWlmIChQYWdlV3JpdGViYWNrKHN3YXBwYWdlKSkgewogCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKIAkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKQEAgLTE2NTQsOSArMTY0Niw5IEBACiAJcmV0dXJuIGRlc2MuZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgc2htZW1fc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCitzdGF0aWMgaW50IHNobWVtX3N0YXRmcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdGZzICpidWYpCiB7Ci0Jc3RydWN0IHNobWVtX3NiX2luZm8gKnNiaW5mbyA9IFNITUVNX1NCKHNiKTsKKwlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0IoZGVudHJ5LT5kX3NiKTsKIAogCWJ1Zi0+Zl90eXBlID0gVE1QRlNfTUFHSUM7CiAJYnVmLT5mX2JzaXplID0gUEFHRV9DQUNIRV9TSVpFOwpAQCAtMjIzMywxMCArMjIyNSwxMCBAQAogfTsKIAogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpzaG1lbV9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgc2htZW1fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEsIHN0cnVjdCB2ZnNtb3VudCAqbW50KQogewotCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNobWVtX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNobWVtX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB0bXBmc19mc190eXBlID0gewpAQCAtMjI2Myw3ICsyMjU1LDcgQEAKICNpZmRlZiBDT05GSUdfVE1QRlMKIAlkZXZmc19ta19kaXIoInNobSIpOwogI2VuZGlmCi0Jc2htX21udCA9IGRvX2tlcm5fbW91bnQodG1wZnNfZnNfdHlwZS5uYW1lLCBNU19OT1VTRVIsCisJc2htX21udCA9IHZmc19rZXJuX21vdW50KCZ0bXBmc19mc190eXBlLCBNU19OT1VTRVIsCiAJCQkJdG1wZnNfZnNfdHlwZS5uYW1lLCBOVUxMKTsKIAlpZiAoSVNfRVJSKHNobV9tbnQpKSB7CiAJCWVycm9yID0gUFRSX0VSUihzaG1fbW50KTsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCBmMWI2NDRlLi45OGFjMjBiIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0zMzEsNiArMzMxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzbGFiX2Vhcmx5X2luaXQgPSAxOworCiAjZGVmaW5lIElOREVYX0FDIGluZGV4X29mKHNpemVvZihzdHJ1Y3QgYXJyYXljYWNoZV9pbml0KSkKICNkZWZpbmUgSU5ERVhfTDMgaW5kZXhfb2Yoc2l6ZW9mKHN0cnVjdCBrbWVtX2xpc3QzKSkKIApAQCAtNTkyLDYgKzU5NCw3IEBACiB7CiAJaWYgKHVubGlrZWx5KFBhZ2VDb21wb3VuZChwYWdlKSkpCiAJCXBhZ2UgPSAoc3RydWN0IHBhZ2UgKilwYWdlX3ByaXZhdGUocGFnZSk7CisJQlVHX09OKCFQYWdlU2xhYihwYWdlKSk7CiAJcmV0dXJuIChzdHJ1Y3Qga21lbV9jYWNoZSAqKXBhZ2UtPmxydS5uZXh0OwogfQogCkBAIC02MDQsNiArNjA3LDcgQEAKIHsKIAlpZiAodW5saWtlbHkoUGFnZUNvbXBvdW5kKHBhZ2UpKSkKIAkJcGFnZSA9IChzdHJ1Y3QgcGFnZSAqKXBhZ2VfcHJpdmF0ZShwYWdlKTsKKwlCVUdfT04oIVBhZ2VTbGFiKHBhZ2UpKTsKIAlyZXR1cm4gKHN0cnVjdCBzbGFiICopcGFnZS0+bHJ1LnByZXY7CiB9CiAKQEAgLTEwMjQsNiArMTAyOCw0MCBAQAogCQl9CiAJfQogfQorCitzdGF0aWMgaW5saW5lIGludCBjYWNoZV9mcmVlX2FsaWVuKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHZvaWQgKm9ianApCit7CisJc3RydWN0IHNsYWIgKnNsYWJwID0gdmlydF90b19zbGFiKG9ianApOworCWludCBub2RlaWQgPSBzbGFicC0+bm9kZWlkOworCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKwlzdHJ1Y3QgYXJyYXlfY2FjaGUgKmFsaWVuID0gTlVMTDsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGFyZSBub3QgZnJlZWluZyBhIG9iamVjdCBmcm9tIGFub3RoZXIgbm9kZSB0byB0aGUgYXJyYXkKKwkgKiBjYWNoZSBvbiB0aGlzIGNwdS4KKwkgKi8KKwlpZiAobGlrZWx5KHNsYWJwLT5ub2RlaWQgPT0gbnVtYV9ub2RlX2lkKCkpKQorCQlyZXR1cm4gMDsKKworCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldOworCVNUQVRTX0lOQ19OT0RFRlJFRVMoY2FjaGVwKTsKKwlpZiAobDMtPmFsaWVuICYmIGwzLT5hbGllbltub2RlaWRdKSB7CisJCWFsaWVuID0gbDMtPmFsaWVuW25vZGVpZF07CisJCXNwaW5fbG9jaygmYWxpZW4tPmxvY2spOworCQlpZiAodW5saWtlbHkoYWxpZW4tPmF2YWlsID09IGFsaWVuLT5saW1pdCkpIHsKKwkJCVNUQVRTX0lOQ19BQ09WRVJGTE9XKGNhY2hlcCk7CisJCQlfX2RyYWluX2FsaWVuX2NhY2hlKGNhY2hlcCwgYWxpZW4sIG5vZGVpZCk7CisJCX0KKwkJYWxpZW4tPmVudHJ5W2FsaWVuLT5hdmFpbCsrXSA9IG9ianA7CisJCXNwaW5fdW5sb2NrKCZhbGllbi0+bG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCYoY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSktPmxpc3RfbG9jayk7CisJCWZyZWVfYmxvY2soY2FjaGVwLCAmb2JqcCwgMSwgbm9kZWlkKTsKKwkJc3Bpbl91bmxvY2soJihjYWNoZXAtPm5vZGVsaXN0c1tub2RlaWRdKS0+bGlzdF9sb2NrKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKICNlbHNlCiAKICNkZWZpbmUgZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLCBhbGllbikgZG8geyB9IHdoaWxlICgwKQpAQCAtMTAzOCw2ICsxMDc2LDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGNhY2hlX2ZyZWVfYWxpZW4oc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgdm9pZCAqb2JqcCkKK3sKKwlyZXR1cm4gMDsKK30KKwogI2VuZGlmCiAKIHN0YXRpYyBpbnQgY3B1dXBfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCkBAIC0xMzM1LDYgKzEzNzgsOCBAQAogCQkJCU5VTEwsIE5VTEwpOwogCX0KIAorCXNsYWJfZWFybHlfaW5pdCA9IDA7CisKIAl3aGlsZSAoc2l6ZXMtPmNzX3NpemUgIT0gVUxPTkdfTUFYKSB7CiAJCS8qCiAJCSAqIEZvciBwZXJmb3JtYW5jZSwgYWxsIHRoZSBnZW5lcmFsIGNhY2hlcyBhcmUgTDEgYWxpZ25lZC4KQEAgLTE0NTAsMzEgKzE0OTUsMjkgQEAKIHN0YXRpYyB2b2lkICprbWVtX2dldHBhZ2VzKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGdmcF90IGZsYWdzLCBpbnQgbm9kZWlkKQogewogCXN0cnVjdCBwYWdlICpwYWdlOwotCXZvaWQgKmFkZHI7CisJaW50IG5yX3BhZ2VzOwogCWludCBpOwogCi0JZmxhZ3MgfD0gY2FjaGVwLT5nZnBmbGFnczsKICNpZm5kZWYgQ09ORklHX01NVQotCS8qIG5vbW11IHVzZXMgc2xhYidzIGZvciBwcm9jZXNzIGFub255bW91cyBtZW1vcnkgYWxsb2NhdGlvbnMsIHNvCi0JICogcmVxdWlyZXMgX19HRlBfQ09NUCB0byBwcm9wZXJseSByZWZjb3VudCBoaWdoZXIgb3JkZXIgYWxsb2NhdGlvbnMiCisJLyoKKwkgKiBOb21tdSB1c2VzIHNsYWIncyBmb3IgcHJvY2VzcyBhbm9ueW1vdXMgbWVtb3J5IGFsbG9jYXRpb25zLCBhbmQgdGh1cworCSAqIHJlcXVpcmVzIF9fR0ZQX0NPTVAgdG8gcHJvcGVybHkgcmVmY291bnQgaGlnaGVyIG9yZGVyIGFsbG9jYXRpb25zCiAJICovCi0JcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZWlkLCAoZmxhZ3MgfCBfX0dGUF9DT01QKSwgY2FjaGVwLT5nZnBvcmRlcik7Ci0jZWxzZQotCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGVpZCwgZmxhZ3MsIGNhY2hlcC0+Z2Zwb3JkZXIpOworCWZsYWdzIHw9IF9fR0ZQX0NPTVA7CiAjZW5kaWYKKwlmbGFncyB8PSBjYWNoZXAtPmdmcGZsYWdzOworCisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZWlkLCBmbGFncywgY2FjaGVwLT5nZnBvcmRlcik7CiAJaWYgKCFwYWdlKQogCQlyZXR1cm4gTlVMTDsKLQlhZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCi0JaSA9ICgxIDw8IGNhY2hlcC0+Z2Zwb3JkZXIpOworCW5yX3BhZ2VzID0gKDEgPDwgY2FjaGVwLT5nZnBvcmRlcik7CiAJaWYgKGNhY2hlcC0+ZmxhZ3MgJiBTTEFCX1JFQ0xBSU1fQUNDT1VOVCkKLQkJYXRvbWljX2FkZChpLCAmc2xhYl9yZWNsYWltX3BhZ2VzKTsKLQlhZGRfcGFnZV9zdGF0ZShucl9zbGFiLCBpKTsKLQl3aGlsZSAoaS0tKSB7Ci0JCV9fU2V0UGFnZVNsYWIocGFnZSk7Ci0JCXBhZ2UrKzsKLQl9Ci0JcmV0dXJuIGFkZHI7CisJCWF0b21pY19hZGQobnJfcGFnZXMsICZzbGFiX3JlY2xhaW1fcGFnZXMpOworCWFkZF9wYWdlX3N0YXRlKG5yX3NsYWIsIG5yX3BhZ2VzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykKKwkJX19TZXRQYWdlU2xhYihwYWdlICsgaSk7CisJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKIH0KIAogLyoKQEAgLTE5MTMsOCArMTk1Niw3IEBACiAJdm9pZCAoKmR0b3IpKHZvaWQqLCBzdHJ1Y3Qga21lbV9jYWNoZSAqLCB1bnNpZ25lZCBsb25nKSkKIHsKIAlzaXplX3QgbGVmdF9vdmVyLCBzbGFiX3NpemUsIHJhbGlnbjsKLQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBOVUxMLCAqcGM7CiAKIAkvKgogCSAqIFNhbml0eSBjaGVja3MuLi4gdGhlc2UgYXJlIGFsbCBzZXJpb3VzIHVzYWdlIGJ1Z3MuCkBAIC0xOTM0LDggKzE5NzYsNyBAQAogCiAJbXV0ZXhfbG9jaygmY2FjaGVfY2hhaW5fbXV0ZXgpOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmY2FjaGVfY2hhaW4pIHsKLQkJc3RydWN0IGttZW1fY2FjaGUgKnBjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwYywgJmNhY2hlX2NoYWluLCBuZXh0KSB7CiAJCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAkJY2hhciB0bXA7CiAJCWludCByZXM7CkBAIC0yMDY5LDggKzIxMTAsMTIgQEAKICNlbmRpZgogI2VuZGlmCiAKLQkvKiBEZXRlcm1pbmUgaWYgdGhlIHNsYWIgbWFuYWdlbWVudCBpcyAnb24nIG9yICdvZmYnIHNsYWIuICovCi0JaWYgKHNpemUgPj0gKFBBR0VfU0laRSA+PiAzKSkKKwkvKgorCSAqIERldGVybWluZSBpZiB0aGUgc2xhYiBtYW5hZ2VtZW50IGlzICdvbicgb3IgJ29mZicgc2xhYi4KKwkgKiAoYm9vdHN0cmFwcGluZyBjYW5ub3QgY29wZSB3aXRoIG9mZnNsYWIgY2FjaGVzIHNvIGRvbid0IGRvCisJICogaXQgdG9vIGVhcmx5IG9uLikKKwkgKi8KKwlpZiAoKHNpemUgPj0gKFBBR0VfU0laRSA+PiAzKSkgJiYgIXNsYWJfZWFybHlfaW5pdCkKIAkJLyoKIAkJICogU2l6ZSBpcyBsYXJnZSwgYXNzdW1lIGJlc3QgdG8gcGxhY2UgdGhlIHNsYWIgbWFuYWdlbWVudCBvYmoKIAkJICogb2ZmLXNsYWIgKHNob3VsZCBhbGxvdyBiZXR0ZXIgcGFja2luZyBvZiBvYmpzKS4KQEAgLTI0NjAsMjMgKzI1MDUsMjggQEAKIAlzbGFicC0+aW51c2UtLTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3NsYWJfYXR0cihzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBzdHJ1Y3Qgc2xhYiAqc2xhYnAsCi0JCQl2b2lkICpvYmpwKQorLyoKKyAqIE1hcCBwYWdlcyBiZWdpbm5pbmcgYXQgYWRkciB0byB0aGUgZ2l2ZW4gY2FjaGUgYW5kIHNsYWIuIFRoaXMgaXMgcmVxdWlyZWQKKyAqIGZvciB0aGUgc2xhYiBhbGxvY2F0b3IgdG8gYmUgYWJsZSB0byBsb29rdXAgdGhlIGNhY2hlIGFuZCBzbGFiIG9mIGEKKyAqIHZpcnR1YWwgYWRkcmVzcyBmb3Iga2ZyZWUsIGtzaXplLCBrbWVtX3B0cl92YWxpZGF0ZSwgYW5kIHNsYWIgZGVidWdnaW5nLgorICovCitzdGF0aWMgdm9pZCBzbGFiX21hcF9wYWdlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsIHN0cnVjdCBzbGFiICpzbGFiLAorCQkJICAgdm9pZCAqYWRkcikKIHsKLQlpbnQgaTsKKwlpbnQgbnJfcGFnZXM7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKLQkvKiBOYXN0eSEhISEhISBJIGhvcGUgdGhpcyBpcyBPSy4gKi8KLQlwYWdlID0gdmlydF90b19wYWdlKG9ianApOworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CiAKLQlpID0gMTsKKwlucl9wYWdlcyA9IDE7CiAJaWYgKGxpa2VseSghUGFnZUNvbXBvdW5kKHBhZ2UpKSkKLQkJaSA8PD0gY2FjaGVwLT5nZnBvcmRlcjsKKwkJbnJfcGFnZXMgPDw9IGNhY2hlLT5nZnBvcmRlcjsKKwogCWRvIHsKLQkJcGFnZV9zZXRfY2FjaGUocGFnZSwgY2FjaGVwKTsKLQkJcGFnZV9zZXRfc2xhYihwYWdlLCBzbGFicCk7CisJCXBhZ2Vfc2V0X2NhY2hlKHBhZ2UsIGNhY2hlKTsKKwkJcGFnZV9zZXRfc2xhYihwYWdlLCBzbGFiKTsKIAkJcGFnZSsrOwotCX0gd2hpbGUgKC0taSk7CisJfSB3aGlsZSAoLS1ucl9wYWdlcyk7CiB9CiAKIC8qCkBAIC0yNTQ4LDcgKzI1OTgsNyBAQAogCQlnb3RvIG9wcHMxOwogCiAJc2xhYnAtPm5vZGVpZCA9IG5vZGVpZDsKLQlzZXRfc2xhYl9hdHRyKGNhY2hlcCwgc2xhYnAsIG9ianApOworCXNsYWJfbWFwX3BhZ2VzKGNhY2hlcCwgc2xhYnAsIG9ianApOwogCiAJY2FjaGVfaW5pdF9vYmpzKGNhY2hlcCwgc2xhYnAsIGN0b3JfZmxhZ3MpOwogCkBAIC0yNTk2LDYgKzI2NDYsMjggQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZXJpZnlfcmVkem9uZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZSwgdm9pZCAqb2JqKQoreworCXVuc2lnbmVkIGxvbmcgcmVkem9uZTEsIHJlZHpvbmUyOworCisJcmVkem9uZTEgPSAqZGJnX3JlZHpvbmUxKGNhY2hlLCBvYmopOworCXJlZHpvbmUyID0gKmRiZ19yZWR6b25lMihjYWNoZSwgb2JqKTsKKworCS8qCisJICogUmVkem9uZSBpcyBvay4KKwkgKi8KKwlpZiAocmVkem9uZTEgPT0gUkVEX0FDVElWRSAmJiByZWR6b25lMiA9PSBSRURfQUNUSVZFKQorCQlyZXR1cm47CisKKwlpZiAocmVkem9uZTEgPT0gUkVEX0lOQUNUSVZFICYmIHJlZHpvbmUyID09IFJFRF9JTkFDVElWRSkKKwkJc2xhYl9lcnJvcihjYWNoZSwgImRvdWJsZSBmcmVlIGRldGVjdGVkIik7CisJZWxzZQorCQlzbGFiX2Vycm9yKGNhY2hlLCAibWVtb3J5IG91dHNpZGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlbiIpOworCisJcHJpbnRrKEtFUk5fRVJSICIlcDogcmVkem9uZSAxOjB4JWx4LCByZWR6b25lIDI6MHglbHguXG4iLAorCQkJb2JqLCByZWR6b25lMSwgcmVkem9uZTIpOworfQorCiBzdGF0aWMgdm9pZCAqY2FjaGVfZnJlZV9kZWJ1Z2NoZWNrKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIHZvaWQgKm9ianAsCiAJCQkJICAgdm9pZCAqY2FsbGVyKQogewpAQCAtMjYwNywyNyArMjY3OSwxMCBAQAogCWtmcmVlX2RlYnVnY2hlY2sob2JqcCk7CiAJcGFnZSA9IHZpcnRfdG9fcGFnZShvYmpwKTsKIAotCWlmIChwYWdlX2dldF9jYWNoZShwYWdlKSAhPSBjYWNoZXApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaXNtYXRjaCBpbiBrbWVtX2NhY2hlX2ZyZWU6IGV4cGVjdGVkICIKLQkJCQkiY2FjaGUgJXAsIGdvdCAlcFxuIiwKLQkJICAgICAgIHBhZ2VfZ2V0X2NhY2hlKHBhZ2UpLCBjYWNoZXApOwotCQlwcmludGsoS0VSTl9FUlIgIiVwIGlzICVzLlxuIiwgY2FjaGVwLCBjYWNoZXAtPm5hbWUpOwotCQlwcmludGsoS0VSTl9FUlIgIiVwIGlzICVzLlxuIiwgcGFnZV9nZXRfY2FjaGUocGFnZSksCi0JCSAgICAgICBwYWdlX2dldF9jYWNoZShwYWdlKS0+bmFtZSk7Ci0JCVdBUk5fT04oMSk7Ci0JfQogCXNsYWJwID0gcGFnZV9nZXRfc2xhYihwYWdlKTsKIAogCWlmIChjYWNoZXAtPmZsYWdzICYgU0xBQl9SRURfWk9ORSkgewotCQlpZiAoKmRiZ19yZWR6b25lMShjYWNoZXAsIG9ianApICE9IFJFRF9BQ1RJVkUgfHwKLQkJCQkqZGJnX3JlZHpvbmUyKGNhY2hlcCwgb2JqcCkgIT0gUkVEX0FDVElWRSkgewotCQkJc2xhYl9lcnJvcihjYWNoZXAsICJkb3VibGUgZnJlZSwgb3IgbWVtb3J5IG91dHNpZGUiCi0JCQkJCQkiIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW4iKTsKLQkJCXByaW50ayhLRVJOX0VSUiAiJXA6IHJlZHpvbmUgMToweCVseCwgIgotCQkJCQkicmVkem9uZSAyOjB4JWx4LlxuIiwKLQkJCSAgICAgICBvYmpwLCAqZGJnX3JlZHpvbmUxKGNhY2hlcCwgb2JqcCksCi0JCQkgICAgICAgKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApKTsKLQkJfQorCQl2ZXJpZnlfcmVkem9uZV9mcmVlKGNhY2hlcCwgb2JqcCk7CiAJCSpkYmdfcmVkem9uZTEoY2FjaGVwLCBvYmpwKSA9IFJFRF9JTkFDVElWRTsKIAkJKmRiZ19yZWR6b25lMihjYWNoZXAsIG9ianApID0gUkVEX0lOQUNUSVZFOwogCX0KQEAgLTMwODcsNDEgKzMxNDIsOSBAQAogCWNoZWNrX2lycV9vZmYoKTsKIAlvYmpwID0gY2FjaGVfZnJlZV9kZWJ1Z2NoZWNrKGNhY2hlcCwgb2JqcCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGZyZWVpbmcgYSBvYmplY3QgZnJvbSBhbm90aGVyCi0JICogbm9kZSB0byB0aGUgYXJyYXkgY2FjaGUgb24gdGhpcyBjcHUuCi0JICovCi0jaWZkZWYgQ09ORklHX05VTUEKLQl7Ci0JCXN0cnVjdCBzbGFiICpzbGFicDsKLQkJc2xhYnAgPSB2aXJ0X3RvX3NsYWIob2JqcCk7Ci0JCWlmICh1bmxpa2VseShzbGFicC0+bm9kZWlkICE9IG51bWFfbm9kZV9pZCgpKSkgewotCQkJc3RydWN0IGFycmF5X2NhY2hlICphbGllbiA9IE5VTEw7Ci0JCQlpbnQgbm9kZWlkID0gc2xhYnAtPm5vZGVpZDsKLQkJCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKKwlpZiAoY2FjaGVfZnJlZV9hbGllbihjYWNoZXAsIG9ianApKQorCQlyZXR1cm47CiAKLQkJCWwzID0gY2FjaGVwLT5ub2RlbGlzdHNbbnVtYV9ub2RlX2lkKCldOwotCQkJU1RBVFNfSU5DX05PREVGUkVFUyhjYWNoZXApOwotCQkJaWYgKGwzLT5hbGllbiAmJiBsMy0+YWxpZW5bbm9kZWlkXSkgewotCQkJCWFsaWVuID0gbDMtPmFsaWVuW25vZGVpZF07Ci0JCQkJc3Bpbl9sb2NrKCZhbGllbi0+bG9jayk7Ci0JCQkJaWYgKHVubGlrZWx5KGFsaWVuLT5hdmFpbCA9PSBhbGllbi0+bGltaXQpKSB7Ci0JCQkJCVNUQVRTX0lOQ19BQ09WRVJGTE9XKGNhY2hlcCk7Ci0JCQkJCV9fZHJhaW5fYWxpZW5fY2FjaGUoY2FjaGVwLAotCQkJCQkJCSAgICBhbGllbiwgbm9kZWlkKTsKLQkJCQl9Ci0JCQkJYWxpZW4tPmVudHJ5W2FsaWVuLT5hdmFpbCsrXSA9IG9ianA7Ci0JCQkJc3Bpbl91bmxvY2soJmFsaWVuLT5sb2NrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3Bpbl9sb2NrKCYoY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSktPgotCQkJCQkgIGxpc3RfbG9jayk7Ci0JCQkJZnJlZV9ibG9jayhjYWNoZXAsICZvYmpwLCAxLCBub2RlaWQpOwotCQkJCXNwaW5fdW5sb2NrKCYoY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSktPgotCQkJCQkgICAgbGlzdF9sb2NrKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCX0KLSNlbmRpZgogCWlmIChsaWtlbHkoYWMtPmF2YWlsIDwgYWMtPmxpbWl0KSkgewogCQlTVEFUU19JTkNfRlJFRUhJVChjYWNoZXApOwogCQlhYy0+ZW50cnlbYWMtPmF2YWlsKytdID0gb2JqcDsKQEAgLTMyNTQsMjYgKzMyNzcsMTAgQEAKICNlbmRpZgogCiAvKioKLSAqIGttYWxsb2MgLSBhbGxvY2F0ZSBtZW1vcnkKKyAqIF9fZG9fa21hbGxvYyAtIGFsbG9jYXRlIG1lbW9yeQogICogQHNpemU6IGhvdyBtYW55IGJ5dGVzIG9mIG1lbW9yeSBhcmUgcmVxdWlyZWQuCi0gKiBAZmxhZ3M6IHRoZSB0eXBlIG9mIG1lbW9yeSB0byBhbGxvY2F0ZS4KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCiAgKiBAY2FsbGVyOiBmdW5jdGlvbiBjYWxsZXIgZm9yIGRlYnVnIHRyYWNraW5nIG9mIHRoZSBjYWxsZXIKLSAqCi0gKiBrbWFsbG9jIGlzIHRoZSBub3JtYWwgbWV0aG9kIG9mIGFsbG9jYXRpbmcgbWVtb3J5Ci0gKiBpbiB0aGUga2VybmVsLgotICoKLSAqIFRoZSBAZmxhZ3MgYXJndW1lbnQgbWF5IGJlIG9uZSBvZjoKLSAqCi0gKiAlR0ZQX1VTRVIgLSBBbGxvY2F0ZSBtZW1vcnkgb24gYmVoYWxmIG9mIHVzZXIuICBNYXkgc2xlZXAuCi0gKgotICogJUdGUF9LRVJORUwgLSBBbGxvY2F0ZSBub3JtYWwga2VybmVsIHJhbS4gIE1heSBzbGVlcC4KLSAqCi0gKiAlR0ZQX0FUT01JQyAtIEFsbG9jYXRpb24gd2lsbCBub3Qgc2xlZXAuICBVc2UgaW5zaWRlIGludGVycnVwdCBoYW5kbGVycy4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHRoZSAlR0ZQX0RNQSBmbGFnIG1heSBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlIG1lbW9yeQotICogbXVzdCBiZSBzdWl0YWJsZSBmb3IgRE1BLiAgVGhpcyBjYW4gbWVhbiBkaWZmZXJlbnQgdGhpbmdzIG9uIGRpZmZlcmVudAotICogcGxhdGZvcm1zLiAgRm9yIGV4YW1wbGUsIG9uIGkzODYsIGl0IG1lYW5zIHRoYXQgdGhlIG1lbW9yeSBtdXN0IGNvbWUKLSAqIGZyb20gdGhlIGZpcnN0IDE2TUIuCiAgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCAqX19kb19rbWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncywKIAkJCQkJICB2b2lkICpjYWxsZXIpCkBAIC0zMzcxLDYgKzMzNzgsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKKwlCVUdfT04odmlydF90b19jYWNoZShvYmpwKSAhPSBjYWNoZXApOworCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCV9fY2FjaGVfZnJlZShjYWNoZXAsIG9ianApOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKQEAgLTM2ODAsNyArMzY4OSw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNhY2hlX3JlYXAodm9pZCAqdW51c2VkKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKndhbGs7CisJc3RydWN0IGttZW1fY2FjaGUgKnNlYXJjaHA7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCWludCBub2RlID0gbnVtYV9ub2RlX2lkKCk7CiAKQEAgLTM2OTEsMTMgKzM3MDAsMTEgQEAKIAkJcmV0dXJuOwogCX0KIAotCWxpc3RfZm9yX2VhY2god2FsaywgJmNhY2hlX2NoYWluKSB7Ci0JCXN0cnVjdCBrbWVtX2NhY2hlICpzZWFyY2hwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2VhcmNocCwgJmNhY2hlX2NoYWluLCBuZXh0KSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJCWludCB0b2ZyZWU7CiAJCXN0cnVjdCBzbGFiICpzbGFicDsKIAotCQlzZWFyY2hwID0gbGlzdF9lbnRyeSh3YWxrLCBzdHJ1Y3Qga21lbV9jYWNoZSwgbmV4dCk7CiAJCWNoZWNrX2lycV9vbigpOwogCiAJCS8qCkBAIC0zODI1LDcgKzM4MzIsNiBAQAogc3RhdGljIGludCBzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQogewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAgPSBwOwotCXN0cnVjdCBsaXN0X2hlYWQgKnE7CiAJc3RydWN0IHNsYWIgKnNsYWJwOwogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29ianM7CiAJdW5zaWduZWQgbG9uZyBudW1fb2JqczsKQEAgLTM4NDYsMTUgKzM4NTIsMTMgQEAKIAkJY2hlY2tfaXJxX29uKCk7CiAJCXNwaW5fbG9ja19pcnEoJmwzLT5saXN0X2xvY2spOwogCi0JCWxpc3RfZm9yX2VhY2gocSwgJmwzLT5zbGFic19mdWxsKSB7Ci0JCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsYWJwLCAmbDMtPnNsYWJzX2Z1bGwsIGxpc3QpIHsKIAkJCWlmIChzbGFicC0+aW51c2UgIT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQogCQkJCWVycm9yID0gInNsYWJzX2Z1bGwgYWNjb3VudGluZyBlcnJvciI7CiAJCQlhY3RpdmVfb2JqcyArPSBjYWNoZXAtPm51bTsKIAkJCWFjdGl2ZV9zbGFicysrOwogCQl9Ci0JCWxpc3RfZm9yX2VhY2gocSwgJmwzLT5zbGFic19wYXJ0aWFsKSB7Ci0JCQlzbGFicCA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNsYWIsIGxpc3QpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNsYWJwLCAmbDMtPnNsYWJzX3BhcnRpYWwsIGxpc3QpIHsKIAkJCWlmIChzbGFicC0+aW51c2UgPT0gY2FjaGVwLT5udW0gJiYgIWVycm9yKQogCQkJCWVycm9yID0gInNsYWJzX3BhcnRpYWwgaW51c2UgYWNjb3VudGluZyBlcnJvciI7CiAJCQlpZiAoIXNsYWJwLT5pbnVzZSAmJiAhZXJyb3IpCkBAIC0zODYyLDggKzM4NjYsNyBAQAogCQkJYWN0aXZlX29ianMgKz0gc2xhYnAtPmludXNlOwogCQkJYWN0aXZlX3NsYWJzKys7CiAJCX0KLQkJbGlzdF9mb3JfZWFjaChxLCAmbDMtPnNsYWJzX2ZyZWUpIHsKLQkJCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2xhYnAsICZsMy0+c2xhYnNfZnJlZSwgbGlzdCkgewogCQkJaWYgKHNsYWJwLT5pbnVzZSAmJiAhZXJyb3IpCiAJCQkJZXJyb3IgPSAic2xhYnNfZnJlZS9pbnVzZSBhY2NvdW50aW5nIGVycm9yIjsKIAkJCW51bV9zbGFicysrOwpAQCAtMzk1Niw3ICszOTU5LDcgQEAKIHsKIAljaGFyIGtidWZbTUFYX1NMQUJJTkZPX1dSSVRFICsgMV0sICp0bXA7CiAJaW50IGxpbWl0LCBiYXRjaGNvdW50LCBzaGFyZWQsIHJlczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7CiAKIAlpZiAoY291bnQgPiBNQVhfU0xBQklORk9fV1JJVEUpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMzk3NSwxMCArMzk3OCw3IEBACiAJLyogRmluZCB0aGUgY2FjaGUgaW4gdGhlIGNoYWluIG9mIGNhY2hlcy4gKi8KIAltdXRleF9sb2NrKCZjYWNoZV9jaGFpbl9tdXRleCk7CiAJcmVzID0gLUVJTlZBTDsKLQlsaXN0X2Zvcl9lYWNoKHAsICZjYWNoZV9jaGFpbikgewotCQlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwotCi0JCWNhY2hlcCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGttZW1fY2FjaGUsIG5leHQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FjaGVwLCAmY2FjaGVfY2hhaW4sIG5leHQpIHsKIAkJaWYgKCFzdHJjbXAoY2FjaGVwLT5uYW1lLCBrYnVmKSkgewogCQkJaWYgKGxpbWl0IDwgMSB8fCBiYXRjaGNvdW50IDwgMSB8fAogCQkJCQliYXRjaGNvdW50ID4gbGltaXQgfHwgc2hhcmVkIDwgMCkgewpAQCAtNDA4MCw3ICs0MDgwLDYgQEAKIHN0YXRpYyBpbnQgbGVha3Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCA9IHA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcTsKIAlzdHJ1Y3Qgc2xhYiAqc2xhYnA7CiAJc3RydWN0IGttZW1fbGlzdDMgKmwzOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC00MTA1LDE0ICs0MTA0LDEwIEBACiAJCWNoZWNrX2lycV9vbigpOwogCQlzcGluX2xvY2tfaXJxKCZsMy0+bGlzdF9sb2NrKTsKIAotCQlsaXN0X2Zvcl9lYWNoKHEsICZsMy0+c2xhYnNfZnVsbCkgewotCQkJc2xhYnAgPSBsaXN0X2VudHJ5KHEsIHN0cnVjdCBzbGFiLCBsaXN0KTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzbGFicCwgJmwzLT5zbGFic19mdWxsLCBsaXN0KQogCQkJaGFuZGxlX3NsYWIobiwgY2FjaGVwLCBzbGFicCk7Ci0JCX0KLQkJbGlzdF9mb3JfZWFjaChxLCAmbDMtPnNsYWJzX3BhcnRpYWwpIHsKLQkJCXNsYWJwID0gbGlzdF9lbnRyeShxLCBzdHJ1Y3Qgc2xhYiwgbGlzdCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2xhYnAsICZsMy0+c2xhYnNfcGFydGlhbCwgbGlzdCkKIAkJCWhhbmRsZV9zbGFiKG4sIGNhY2hlcCwgc2xhYnApOwotCQl9CiAJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAJfQogCW5hbWUgPSBjYWNoZXAtPm5hbWU7CmRpZmYgLS1naXQgYS9tbS9zcGFyc2UuYyBiL21tL3NwYXJzZS5jCmluZGV4IDEwMDA0MGMuLmUwYTNmZTQgMTAwNjQ0Ci0tLSBhL21tL3NwYXJzZS5jCisrKyBiL21tL3NwYXJzZS5jCkBAIC05OSw2ICs5OSwyMiBAQAogCXJldHVybiAocm9vdF9uciAqIFNFQ1RJT05TX1BFUl9ST09UKSArIChtcyAtIHJvb3QpOwogfQogCisvKgorICogRHVyaW5nIGVhcmx5IGJvb3QsIGJlZm9yZSBzZWN0aW9uX21lbV9tYXAgaXMgdXNlZCBmb3IgYW4gYWN0dWFsCisgKiBtZW1fbWFwLCB3ZSB1c2Ugc2VjdGlvbl9tZW1fbWFwIHRvIHN0b3JlIHRoZSBzZWN0aW9uJ3MgTlVNQQorICogbm9kZS4gIFRoaXMga2VlcHMgdXMgZnJvbSBoYXZpbmcgdG8gdXNlIGFub3RoZXIgZGF0YSBzdHJ1Y3R1cmUuICBUaGUKKyAqIG5vZGUgaW5mb3JtYXRpb24gaXMgY2xlYXJlZCBqdXN0IGJlZm9yZSB3ZSBzdG9yZSB0aGUgcmVhbCBtZW1fbWFwLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc3BhcnNlX2VuY29kZV9lYXJseV9uaWQoaW50IG5pZCkKK3sKKwlyZXR1cm4gKG5pZCA8PCBTRUNUSU9OX05JRF9TSElGVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwYXJzZV9lYXJseV9uaWQoc3RydWN0IG1lbV9zZWN0aW9uICpzZWN0aW9uKQoreworCXJldHVybiAoc2VjdGlvbi0+c2VjdGlvbl9tZW1fbWFwID4+IFNFQ1RJT05fTklEX1NISUZUKTsKK30KKwogLyogUmVjb3JkIGEgbWVtb3J5IGFyZWEgYWdhaW5zdCBhIG5vZGUuICovCiB2b2lkIG1lbW9yeV9wcmVzZW50KGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewpAQCAtMTEzLDcgKzEyOSw4IEBACiAKIAkJbXMgPSBfX25yX3RvX3NlY3Rpb24oc2VjdGlvbik7CiAJCWlmICghbXMtPnNlY3Rpb25fbWVtX21hcCkKLQkJCW1zLT5zZWN0aW9uX21lbV9tYXAgPSBTRUNUSU9OX01BUktFRF9QUkVTRU5UOworCQkJbXMtPnNlY3Rpb25fbWVtX21hcCA9IHNwYXJzZV9lbmNvZGVfZWFybHlfbmlkKG5pZCkgfAorCQkJCQkJCVNFQ1RJT05fTUFSS0VEX1BSRVNFTlQ7CiAJfQogfQogCkBAIC0xNjQsNiArMTgxLDcgQEAKIAlpZiAoIXZhbGlkX3NlY3Rpb24obXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW1zLT5zZWN0aW9uX21lbV9tYXAgJj0gflNFQ1RJT05fTUFQX01BU0s7CiAJbXMtPnNlY3Rpb25fbWVtX21hcCB8PSBzcGFyc2VfZW5jb2RlX21lbV9tYXAobWVtX21hcCwgcG51bSk7CiAKIAlyZXR1cm4gMTsKQEAgLTE3Miw4ICsxOTAsOCBAQAogc3RhdGljIHN0cnVjdCBwYWdlICpzcGFyc2VfZWFybHlfbWVtX21hcF9hbGxvYyh1bnNpZ25lZCBsb25nIHBudW0pCiB7CiAJc3RydWN0IHBhZ2UgKm1hcDsKLQlpbnQgbmlkID0gZWFybHlfcGZuX3RvX25pZChzZWN0aW9uX25yX3RvX3BmbihwbnVtKSk7CiAJc3RydWN0IG1lbV9zZWN0aW9uICptcyA9IF9fbnJfdG9fc2VjdGlvbihwbnVtKTsKKwlpbnQgbmlkID0gc3BhcnNlX2Vhcmx5X25pZChtcyk7CiAKIAltYXAgPSBhbGxvY19yZW1hcChuaWQsIHNpemVvZihzdHJ1Y3QgcGFnZSkgKiBQQUdFU19QRVJfU0VDVElPTik7CiAJaWYgKG1hcCkKZGlmZiAtLWdpdCBhL21tL3N3YXAuYyBiL21tL3N3YXAuYwppbmRleCA4ODg5NWMyLi4wM2FlMjA3IDEwMDY0NAotLS0gYS9tbS9zd2FwLmMKKysrIGIvbW0vc3dhcC5jCkBAIC00ODAsNDggKzQ4MCw2IEBACiAjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCi0jaWZkZWYgQ09ORklHX1NNUAotdm9pZCBwZXJjcHVfY291bnRlcl9tb2Qoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIGxvbmcgYW1vdW50KQotewotCWxvbmcgY291bnQ7Ci0JbG9uZyAqcGNvdW50OwotCWludCBjcHUgPSBnZXRfY3B1KCk7Ci0KLQlwY291bnQgPSBwZXJfY3B1X3B0cihmYmMtPmNvdW50ZXJzLCBjcHUpOwotCWNvdW50ID0gKnBjb3VudCArIGFtb3VudDsKLQlpZiAoY291bnQgPj0gRkJDX0JBVENIIHx8IGNvdW50IDw9IC1GQkNfQkFUQ0gpIHsKLQkJc3Bpbl9sb2NrKCZmYmMtPmxvY2spOwotCQlmYmMtPmNvdW50ICs9IGNvdW50OwotCQkqcGNvdW50ID0gMDsKLQkJc3Bpbl91bmxvY2soJmZiYy0+bG9jayk7Ci0JfSBlbHNlIHsKLQkJKnBjb3VudCA9IGNvdW50OwotCX0KLQlwdXRfY3B1KCk7Ci19Ci1FWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX21vZCk7Ci0KLS8qCi0gKiBBZGQgdXAgYWxsIHRoZSBwZXItY3B1IGNvdW50cywgcmV0dXJuIHRoZSByZXN1bHQuICBUaGlzIGlzIGEgbW9yZSBhY2N1cmF0ZQotICogYnV0IG11Y2ggc2xvd2VyIHZlcnNpb24gb2YgcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgpCi0gKi8KLWxvbmcgcGVyY3B1X2NvdW50ZXJfc3VtKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQotewotCWxvbmcgcmV0OwotCWludCBjcHU7Ci0KLQlzcGluX2xvY2soJmZiYy0+bG9jayk7Ci0JcmV0ID0gZmJjLT5jb3VudDsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWxvbmcgKnBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7Ci0JCXJldCArPSAqcGNvdW50OwotCX0KLQlzcGluX3VubG9jaygmZmJjLT5sb2NrKTsKLQlyZXR1cm4gcmV0IDwgMCA/IDAgOiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX3N1bSk7Ci0jZW5kaWYKLQogLyoKICAqIFBlcmZvcm0gYW55IHNldHVwIGZvciB0aGUgc3dhcCBzeXN0ZW0KICAqLwpkaWZmIC0tZ2l0IGEvbW0vc3dhcGZpbGUuYyBiL21tL3N3YXBmaWxlLmMKaW5kZXggZTVmZDUzOC4uY2MzNjdmNyAxMDA2NDQKLS0tIGEvbW0vc3dhcGZpbGUuYworKysgYi9tbS9zd2FwZmlsZS5jCkBAIC0zOTUsNiArMzk1LDkgQEAKIAlzdHJ1Y3Qgc3dhcF9pbmZvX3N0cnVjdCAqIHA7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCisJaWYgKGlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCisJCXJldHVybjsKKwogCXAgPSBzd2FwX2luZm9fZ2V0KGVudHJ5KTsKIAlpZiAocCkgewogCQlpZiAoc3dhcF9lbnRyeV9mcmVlKHAsIHN3cF9vZmZzZXQoZW50cnkpKSA9PSAxKSB7CkBAIC02MTUsMTUgKzYxOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfTUlHUkFUSU9OCi1pbnQgcmVtb3ZlX3ZtYV9zd2FwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlzd3BfZW50cnlfdCBlbnRyeSA9IHsgLnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKSB9OwotCi0JcmV0dXJuIHVudXNlX3ZtYSh2bWEsIGVudHJ5LCBwYWdlKTsKLX0KLSNlbmRpZgotCiAvKgogICogU2NhbiBzd2FwX21hcCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gbmV4dCBlbnRyeSBzdGlsbCBpbiB1c2UuCiAgKiBSZWN5Y2xlIHRvIHN0YXJ0IG9uIHJlYWNoaW5nIHRoZSBlbmQsIHJldHVybmluZyAwIHdoZW4gZW1wdHkuCkBAIC03MTYsNyArNzEwLDYgQEAKIAkJICovCiAJCXN3YXBfbWFwID0gJnNpLT5zd2FwX21hcFtpXTsKIAkJZW50cnkgPSBzd3BfZW50cnkodHlwZSwgaSk7Ci1hZ2FpbjoKIAkJcGFnZSA9IHJlYWRfc3dhcF9jYWNoZV9hc3luYyhlbnRyeSwgTlVMTCwgMCk7CiAJCWlmICghcGFnZSkgewogCQkJLyoKQEAgLTc1MSwxMiArNzQ0LDYgQEAKIAkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKIAkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAkJbG9ja19wYWdlKHBhZ2UpOwotCQlpZiAoIVBhZ2VTd2FwQ2FjaGUocGFnZSkpIHsKLQkJCS8qIFBhZ2UgbWlncmF0aW9uIGhhcyBvY2N1cmVkICovCi0JCQl1bmxvY2tfcGFnZShwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KIAkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKIAogCQkvKgpAQCAtNzg1LDEwICs3NzIsOCBAQAogCQkJd2hpbGUgKCpzd2FwX21hcCA+IDEgJiYgIXJldHZhbCAmJgogCQkJCQkocCA9IHAtPm5leHQpICE9ICZzdGFydF9tbS0+bW1saXN0KSB7CiAJCQkJbW0gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBtbV9zdHJ1Y3QsIG1tbGlzdCk7Ci0JCQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZtbS0+bW1fdXNlcnMpID09IDEpIHsKLQkJCQkJYXRvbWljX2RlYygmbW0tPm1tX3VzZXJzKTsKKwkJCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJm1tLT5tbV91c2VycykpCiAJCQkJCWNvbnRpbnVlOwotCQkJCX0KIAkJCQlzcGluX3VubG9jaygmbW1saXN0X2xvY2spOwogCQkJCW1tcHV0KHByZXZfbW0pOwogCQkJCXByZXZfbW0gPSBtbTsKQEAgLTE0MDcsMTkgKzEzOTIsNyBAQAogCQlpZiAoIShwLT5mbGFncyAmIFNXUF9VU0VEKSkKIAkJCWJyZWFrOwogCWVycm9yID0gLUVQRVJNOwotCS8qCi0JICogVGVzdCBpZiBhZGRpbmcgYW5vdGhlciBzd2FwIGRldmljZSBpcyBwb3NzaWJsZS4gVGhlcmUgYXJlCi0JICogdHdvIGxpbWl0aW5nIGZhY3RvcnM6IDEpIHRoZSBudW1iZXIgb2YgYml0cyBmb3IgdGhlIHN3YXAKLQkgKiB0eXBlIHN3cF9lbnRyeV90IGRlZmluaXRpb24gYW5kIDIpIHRoZSBudW1iZXIgb2YgYml0cyBmb3IKLQkgKiB0aGUgc3dhcCB0eXBlIGluIHRoZSBzd2FwIHB0ZXMgYXMgZGVmaW5lZCBieSB0aGUgZGlmZmVyZW50Ci0JICogYXJjaGl0ZWN0dXJlcy4gVG8gaG9ub3IgYm90aCBsaW1pdGF0aW9ucyBhIHN3YXAgZW50cnkKLQkgKiB3aXRoIHN3YXAgb2Zmc2V0IDAgYW5kIHN3YXAgdHlwZSB+MFVMIGlzIGNyZWF0ZWQsIGVuY29kZWQKLQkgKiB0byBhIHN3YXAgcHRlLCBkZWNvZGVkIHRvIGEgc3dwX2VudHJ5X3QgYWdhaW4gYW5kIGZpbmFsbHkKLQkgKiB0aGUgc3dhcCB0eXBlIHBhcnQgaXMgZXh0cmFjdGVkLiBUaGlzIHdpbGwgbWFzayBhbGwgYml0cwotCSAqIGZyb20gdGhlIGluaXRpYWwgfjBVTCB0aGF0IGNhbid0IGJlIGVuY29kZWQgaW4gZWl0aGVyIHRoZQotCSAqIHN3cF9lbnRyeV90IG9yIHRoZSBhcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiBvZiBhIHN3YXAgcHRlLgotCSAqLwotCWlmICh0eXBlID4gc3dwX3R5cGUocHRlX3RvX3N3cF9lbnRyeShzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSh+MFVMLDApKSkpKSB7CisJaWYgKHR5cGUgPj0gTUFYX1NXQVBGSUxFUykgewogCQlzcGluX3VubG9jaygmc3dhcF9sb2NrKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTUwNCw4ICsxNDc3LDcgQEAKIAkJZXJyb3IgPSAtRUlOVkFMOwogCQlnb3RvIGJhZF9zd2FwOwogCX0KLQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIDAsCi0JCQkoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIHN3YXBfZmlsZSk7CisJcGFnZSA9IHJlYWRfbWFwcGluZ19wYWdlKG1hcHBpbmcsIDAsIHN3YXBfZmlsZSk7CiAJaWYgKElTX0VSUihwYWdlKSkgewogCQllcnJvciA9IFBUUl9FUlIocGFnZSk7CiAJCWdvdG8gYmFkX3N3YXA7CkBAIC0xNzA5LDYgKzE2ODEsOSBAQAogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB0eXBlOwogCWludCByZXN1bHQgPSAwOwogCisJaWYgKGlzX21pZ3JhdGlvbl9lbnRyeShlbnRyeSkpCisJCXJldHVybiAxOworCiAJdHlwZSA9IHN3cF90eXBlKGVudHJ5KTsKIAlpZiAodHlwZSA+PSBucl9zd2FwZmlsZXMpCiAJCWdvdG8gYmFkX2ZpbGU7CmRpZmYgLS1naXQgYS9tbS90cnVuY2F0ZS5jIGIvbW0vdHJ1bmNhdGUuYwppbmRleCA2Y2IzZmZmLi5jZjFiMDE1IDEwMDY0NAotLS0gYS9tbS90cnVuY2F0ZS5jCisrKyBiL21tL3RydW5jYXRlLmMKQEAgLTIzMCwxNCArMjMwLDI0IEBACiAJCQlwYWdldmVjX2xvb2t1cCgmcHZlYywgbWFwcGluZywgbmV4dCwgUEFHRVZFQ19TSVpFKSkgewogCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgewogCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOworCQkJcGdvZmZfdCBpbmRleDsKKwkJCWludCBsb2NrX2ZhaWxlZDsKIAotCQkJaWYgKFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpKSB7Ci0JCQkJbmV4dCsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHBhZ2UtPmluZGV4ID4gbmV4dCkKLQkJCQluZXh0ID0gcGFnZS0+aW5kZXg7CisJCQlsb2NrX2ZhaWxlZCA9IFRlc3RTZXRQYWdlTG9ja2VkKHBhZ2UpOworCisJCQkvKgorCQkJICogV2UgcmVhbGx5IHNob3VsZG4ndCBiZSBsb29raW5nIGF0IHRoZSAtPmluZGV4IG9mIGFuCisJCQkgKiB1bmxvY2tlZCBwYWdlLiAgQnV0IHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGxvY2sgdGhlc2UKKwkJCSAqIHBhZ2VzLiAgU28gd2UgcmVseSB1cG9uIG5vYm9keSBhbHRlcmluZyB0aGUgLT5pbmRleAorCQkJICogb2YgdGhpcyAocGlubmVkLWJ5LXVzKSBwYWdlLgorCQkJICovCisJCQlpbmRleCA9IHBhZ2UtPmluZGV4OworCQkJaWYgKGluZGV4ID4gbmV4dCkKKwkJCQluZXh0ID0gaW5kZXg7CiAJCQluZXh0Kys7CisJCQlpZiAobG9ja19mYWlsZWQpCisJCQkJY29udGludWU7CisKIAkJCWlmIChQYWdlRGlydHkocGFnZSkgfHwgUGFnZVdyaXRlYmFjayhwYWdlKSkKIAkJCQlnb3RvIHVubG9jazsKIAkJCWlmIChwYWdlX21hcHBlZChwYWdlKSkKZGlmZiAtLWdpdCBhL21tL3ZtYWxsb2MuYyBiL21tL3ZtYWxsb2MuYwppbmRleCBjMDUwNGYxLi4zNWY4NTUzIDEwMDY0NAotLS0gYS9tbS92bWFsbG9jLmMKKysrIGIvbW0vdm1hbGxvYy5jCkBAIC0yNTcsNiArMjU3LDE5IEBACiB9CiAKIC8qIENhbGxlciBtdXN0IGhvbGQgdm1saXN0X2xvY2sgKi8KK3N0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0ICpfX2ZpbmRfdm1fYXJlYSh2b2lkICphZGRyKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKnRtcDsKKworCWZvciAodG1wID0gdm1saXN0OyB0bXAgIT0gTlVMTDsgdG1wID0gdG1wLT5uZXh0KSB7CisJCSBpZiAodG1wLT5hZGRyID09IGFkZHIpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gdG1wOworfQorCisvKiBDYWxsZXIgbXVzdCBob2xkIHZtbGlzdF9sb2NrICovCiBzdHJ1Y3Qgdm1fc3RydWN0ICpfX3JlbW92ZV92bV9hcmVhKHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IHZtX3N0cnVjdCAqKnAsICp0bXA7CkBAIC00OTgsMTEgKzUxMSwzMyBAQAogICovCiB2b2lkICp2bWFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLSAgICAgICByZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9ISUdITUVNLCBQQUdFX0tFUk5FTCk7CisJcmV0dXJuIF9fdm1hbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwpOwogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jKTsKIAogLyoqCisgKgl2bWFsbG9jX3VzZXIgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSB3aGljaCBoYXMKKyAqCQkJICAgYmVlbiB6ZXJvZWQgc28gaXQgY2FuIGJlIG1hcHBlZCB0byB1c2Vyc3BhY2Ugd2l0aG91dAorICoJCQkgICBsZWFraW5nIGRhdGEuCisgKgorICoJQHNpemU6CQlhbGxvY2F0aW9uIHNpemUKKyAqLwordm9pZCAqdm1hbGxvY191c2VyKHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgdm1fc3RydWN0ICphcmVhOworCXZvaWQgKnJldDsKKworCXJldCA9IF9fdm1hbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sIFBBR0VfS0VSTkVMKTsKKwl3cml0ZV9sb2NrKCZ2bWxpc3RfbG9jayk7CisJYXJlYSA9IF9fZmluZF92bV9hcmVhKHJldCk7CisJYXJlYS0+ZmxhZ3MgfD0gVk1fVVNFUk1BUDsKKwl3cml0ZV91bmxvY2soJnZtbGlzdF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHZtYWxsb2NfdXNlcik7CisKKy8qKgogICoJdm1hbGxvY19ub2RlICAtICBhbGxvY2F0ZSBtZW1vcnkgb24gYSBzcGVjaWZpYyBub2RlCiAgKgogICoJQHNpemU6CQlhbGxvY2F0aW9uIHNpemUKQEAgLTUxNiw3ICs1NTEsNyBAQAogICovCiB2b2lkICp2bWFsbG9jX25vZGUodW5zaWduZWQgbG9uZyBzaXplLCBpbnQgbm9kZSkKIHsKLSAgICAgICByZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMLCBub2RlKTsKKwlyZXR1cm4gX192bWFsbG9jX25vZGUoc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0sIFBBR0VfS0VSTkVMLCBub2RlKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1hbGxvY19ub2RlKTsKIApAQCAtNTU2LDYgKzU5MSwyOCBAQAogfQogRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyKTsKIAorLyoqCisgKgl2bWFsbG9jXzMyX3VzZXIgIC0gIGFsbG9jYXRlIHZpcnR1YWxseSBjb250aWd1b3VzIG1lbW9yeSAoMzJiaXQKKyAqCQkJICAgICAgYWRkcmVzc2FibGUpIHdoaWNoIGlzIHplcm9lZCBzbyBpdCBjYW4gYmUKKyAqCQkJICAgICAgbWFwcGVkIHRvIHVzZXJzcGFjZSB3aXRob3V0IGxlYWtpbmcgZGF0YS4KKyAqCisgKglAc2l6ZToJCWFsbG9jYXRpb24gc2l6ZQorICovCit2b2lkICp2bWFsbG9jXzMyX3VzZXIodW5zaWduZWQgbG9uZyBzaXplKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJdm9pZCAqcmV0OworCisJcmV0ID0gX192bWFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7CisJd3JpdGVfbG9jaygmdm1saXN0X2xvY2spOworCWFyZWEgPSBfX2ZpbmRfdm1fYXJlYShyZXQpOworCWFyZWEtPmZsYWdzIHw9IFZNX1VTRVJNQVA7CisJd3JpdGVfdW5sb2NrKCZ2bWxpc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh2bWFsbG9jXzMyX3VzZXIpOworCiBsb25nIHZyZWFkKGNoYXIgKmJ1ZiwgY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKIHsKIAlzdHJ1Y3Qgdm1fc3RydWN0ICp0bXA7CkBAIC02MzAsMyArNjg3LDY0IEBACiAJcmVhZF91bmxvY2soJnZtbGlzdF9sb2NrKTsKIAlyZXR1cm4gYnVmIC0gYnVmX3N0YXJ0OwogfQorCisvKioKKyAqCXJlbWFwX3ZtYWxsb2NfcmFuZ2UgIC0gIG1hcCB2bWFsbG9jIHBhZ2VzIHRvIHVzZXJzcGFjZQorICoKKyAqCUB2bWE6CQl2bWEgdG8gY292ZXIgKG1hcCBmdWxsIHJhbmdlIG9mIHZtYSkKKyAqCUBhZGRyOgkJdm1hbGxvYyBtZW1vcnkKKyAqCUBwZ29mZjoJCW51bWJlciBvZiBwYWdlcyBpbnRvIGFkZHIgYmVmb3JlIGZpcnN0IHBhZ2UgdG8gbWFwCisgKglAcmV0dXJuczoJMCBmb3Igc3VjY2VzcywgLUV4eHggb24gZmFpbHVyZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoYXQgYWRkciBpcyBhIHZhbGlkIHZtYWxsb2MnZWQgYXJlYSwgYW5kCisgKgl0aGF0IGl0IGlzIGJpZyBlbm91Z2ggdG8gY292ZXIgdGhlIHZtYS4gV2lsbCByZXR1cm4gZmFpbHVyZSBpZgorICoJdGhhdCBjcml0ZXJpYSBpc24ndCBtZXQuCisgKgorICoJU2ltaWxhciB0byByZW1hcF9wZm5fcmFuZ2UgKHNlZSBtbS9tZW1vcnkuYykKKyAqLworaW50IHJlbWFwX3ZtYWxsb2NfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHZvaWQgKmFkZHIsCisJCQkJCQl1bnNpZ25lZCBsb25nIHBnb2ZmKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKmFyZWE7CisJdW5zaWduZWQgbG9uZyB1YWRkciA9IHZtYS0+dm1fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyB1c2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpbnQgcmV0OworCisJaWYgKChQQUdFX1NJWkUtMSkgJiAodW5zaWduZWQgbG9uZylhZGRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlYWRfbG9jaygmdm1saXN0X2xvY2spOworCWFyZWEgPSBfX2ZpbmRfdm1fYXJlYShhZGRyKTsKKwlpZiAoIWFyZWEpCisJCWdvdG8gb3V0X2VpbnZhbF9sb2NrZWQ7CisKKwlpZiAoIShhcmVhLT5mbGFncyAmIFZNX1VTRVJNQVApKQorCQlnb3RvIG91dF9laW52YWxfbG9ja2VkOworCisJaWYgKHVzaXplICsgKHBnb2ZmIDw8IFBBR0VfU0hJRlQpID4gYXJlYS0+c2l6ZSAtIFBBR0VfU0laRSkKKwkJZ290byBvdXRfZWludmFsX2xvY2tlZDsKKwlyZWFkX3VubG9jaygmdm1saXN0X2xvY2spOworCisJYWRkciArPSBwZ29mZiA8PCBQQUdFX1NISUZUOworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UoYWRkcik7CisJCXJldCA9IHZtX2luc2VydF9wYWdlKHZtYSwgdWFkZHIsIHBhZ2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQl1YWRkciArPSBQQUdFX1NJWkU7CisJCWFkZHIgKz0gUEFHRV9TSVpFOworCQl1c2l6ZSAtPSBQQUdFX1NJWkU7CisJfSB3aGlsZSAodXNpemUgPiAwKTsKKworCS8qIFByZXZlbnQgInRoaW5ncyIgbGlrZSBtZW1vcnkgbWlncmF0aW9uPyBWTV9mbGFncyBuZWVkIGEgY2xlYW51cC4uLiAqLworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisKKwlyZXR1cm4gcmV0OworCitvdXRfZWludmFsX2xvY2tlZDoKKwlyZWFkX3VubG9jaygmdm1saXN0X2xvY2spOworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChyZW1hcF92bWFsbG9jX3JhbmdlKTsKKwpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCA0NDBhNzMzLi43MmJhYmFjIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtNjEsNiArNjEsOCBAQAogCSAqIEluIHRoaXMgY29udGV4dCwgaXQgZG9lc24ndCBtYXR0ZXIgdGhhdCB3ZSBzY2FuIHRoZQogCSAqIHdob2xlIGxpc3QgYXQgb25jZS4gKi8KIAlpbnQgc3dhcF9jbHVzdGVyX21heDsKKworCWludCBzd2FwcGluZXNzOwogfTsKIAogLyoKQEAgLTEwOCw3ICsxMTAsNyBAQAogICogRnJvbSAwIC4uIDEwMC4gIEhpZ2hlciBtZWFucyBtb3JlIHN3YXBweS4KICAqLwogaW50IHZtX3N3YXBwaW5lc3MgPSA2MDsKLXN0YXRpYyBsb25nIHRvdGFsX21lbW9yeTsKK2xvbmcgdm1fdG90YWxfcGFnZXM7CS8qIFRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgd2hpY2ggdGhlIFZNIGNvbnRyb2xzICovCiAKIHN0YXRpYyBMSVNUX0hFQUQoc2hyaW5rZXJfbGlzdCk7CiBzdGF0aWMgREVDTEFSRV9SV1NFTShzaHJpbmtlcl9yd3NlbSk7CkBAIC0yODgsMTEgKzI5MCwyMyBAQAogCXVubG9ja19wYWdlKHBhZ2UpOwogfQogCisvKiBwb3NzaWJsZSBvdXRjb21lIG9mIHBhZ2VvdXQoKSAqLwordHlwZWRlZiBlbnVtIHsKKwkvKiBmYWlsZWQgdG8gd3JpdGUgcGFnZSBvdXQsIHBhZ2UgaXMgbG9ja2VkICovCisJUEFHRV9LRUVQLAorCS8qIG1vdmUgcGFnZSB0byB0aGUgYWN0aXZlIGxpc3QsIHBhZ2UgaXMgbG9ja2VkICovCisJUEFHRV9BQ1RJVkFURSwKKwkvKiBwYWdlIGhhcyBiZWVuIHNlbnQgdG8gdGhlIGRpc2sgc3VjY2Vzc2Z1bGx5LCBwYWdlIGlzIHVubG9ja2VkICovCisJUEFHRV9TVUNDRVNTLAorCS8qIHBhZ2UgaXMgY2xlYW4gYW5kIGxvY2tlZCAqLworCVBBR0VfQ0xFQU4sCit9IHBhZ2VvdXRfdDsKKwogLyoKICAqIHBhZ2VvdXQgaXMgY2FsbGVkIGJ5IHNocmlua19wYWdlX2xpc3QoKSBmb3IgZWFjaCBkaXJ0eSBwYWdlLgogICogQ2FsbHMgLT53cml0ZXBhZ2UoKS4KICAqLwotcGFnZW91dF90IHBhZ2VvdXQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQorc3RhdGljIHBhZ2VvdXRfdCBwYWdlb3V0KHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZykKIHsKIAkvKgogCSAqIElmIHRoZSBwYWdlIGlzIGRpcnR5LCBvbmx5IHBlcmZvcm0gd3JpdGViYWNrIGlmIHRoYXQgd3JpdGUKQEAgLTMzNyw2ICszNTEsOCBAQAogCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0gewogCQkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfTk9ORSwKIAkJCS5ucl90b193cml0ZSA9IFNXQVBfQ0xVU1RFUl9NQVgsCisJCQkucmFuZ2Vfc3RhcnQgPSAwLAorCQkJLnJhbmdlX2VuZCA9IExMT05HX01BWCwKIAkJCS5ub25ibG9ja2luZyA9IDEsCiAJCQkuZm9yX3JlY2xhaW0gPSAxLAogCQl9OwpAQCAtNzI3LDcgKzc0Myw3IEBACiAJCSAqIGhvdyBtdWNoIG1lbW9yeQogCQkgKiBpcyBtYXBwZWQuCiAJCSAqLwotCQltYXBwZWRfcmF0aW8gPSAoc2MtPm5yX21hcHBlZCAqIDEwMCkgLyB0b3RhbF9tZW1vcnk7CisJCW1hcHBlZF9yYXRpbyA9IChzYy0+bnJfbWFwcGVkICogMTAwKSAvIHZtX3RvdGFsX3BhZ2VzOwogCiAJCS8qCiAJCSAqIE5vdyBkZWNpZGUgaG93IG11Y2ggd2UgcmVhbGx5IHdhbnQgdG8gdW5tYXAgc29tZSBwYWdlcy4gIFRoZQpAQCAtNzQxLDcgKzc1Nyw3IEBACiAJCSAqIEEgMTAwJSB2YWx1ZSBvZiB2bV9zd2FwcGluZXNzIG92ZXJyaWRlcyB0aGlzIGFsZ29yaXRobQogCQkgKiBhbHRvZ2V0aGVyLgogCQkgKi8KLQkJc3dhcF90ZW5kZW5jeSA9IG1hcHBlZF9yYXRpbyAvIDIgKyBkaXN0cmVzcyArIHZtX3N3YXBwaW5lc3M7CisJCXN3YXBfdGVuZGVuY3kgPSBtYXBwZWRfcmF0aW8gLyAyICsgZGlzdHJlc3MgKyBzYy0+c3dhcHBpbmVzczsKIAogCQkvKgogCQkgKiBOb3cgdXNlIHRoaXMgbWV0cmljIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHN0YXJ0IG1vdmluZyBtYXBwZWQKQEAgLTk1Nyw2ICs5NzMsNyBAQAogCQkubWF5X3dyaXRlcGFnZSA9ICFsYXB0b3BfbW9kZSwKIAkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAogCQkubWF5X3N3YXAgPSAxLAorCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCiAJfTsKIAogCWluY19wYWdlX3N0YXRlKGFsbG9jc3RhbGwpOwpAQCAtMTAyMSwxMCArMTAzOCw2IEBACiAgKiBGb3Iga3N3YXBkLCBiYWxhbmNlX3BnZGF0KCkgd2lsbCB3b3JrIGFjcm9zcyBhbGwgdGhpcyBub2RlJ3Mgem9uZXMgdW50aWwKICAqIHRoZXkgYXJlIGFsbCBhdCBwYWdlc19oaWdoLgogICoKLSAqIElmIGBucl9wYWdlcycgaXMgbm9uLXplcm8gdGhlbiBpdCBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIGFyZSB0byBiZQotICogcmVjbGFpbWVkLCByZWdhcmRsZXNzIG9mIHRoZSB6b25lIG9jY3VwYW5jaWVzLiAgVGhpcyBpcyBhIHNvZnR3YXJlIHN1c3BlbmQKLSAqIHNwZWNpYWwuCi0gKgogICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdoaWNoIHdlcmUgYWN0dWFsbHkgZnJlZWQuCiAgKgogICogVGhlcmUgaXMgc3BlY2lhbCBoYW5kbGluZyBoZXJlIGZvciB6b25lcyB3aGljaCBhcmUgZnVsbCBvZiBwaW5uZWQgcGFnZXMuCkBAIC0xMDQyLDEwICsxMDU1LDggQEAKICAqIHRoZSBwYWdlIGFsbG9jYXRvciBmYWxsYmFjayBzY2hlbWUgdG8gZW5zdXJlIHRoYXQgYWdpbmcgb2YgcGFnZXMgaXMgYmFsYW5jZWQKICAqIGFjcm9zcyB0aGUgem9uZXMuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJhbGFuY2VfcGdkYXQocGdfZGF0YV90ICpwZ2RhdCwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKLQkJCQlpbnQgb3JkZXIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYWxhbmNlX3BnZGF0KHBnX2RhdGFfdCAqcGdkYXQsIGludCBvcmRlcikKIHsKLQl1bnNpZ25lZCBsb25nIHRvX2ZyZWUgPSBucl9wYWdlczsKIAlpbnQgYWxsX3pvbmVzX29rOwogCWludCBwcmlvcml0eTsKIAlpbnQgaTsKQEAgLTEwNTUsNyArMTA2Niw4IEBACiAJc3RydWN0IHNjYW5fY29udHJvbCBzYyA9IHsKIAkJLmdmcF9tYXNrID0gR0ZQX0tFUk5FTCwKIAkJLm1heV9zd2FwID0gMSwKLQkJLnN3YXBfY2x1c3Rlcl9tYXggPSBucl9wYWdlcyA/IG5yX3BhZ2VzIDogU1dBUF9DTFVTVEVSX01BWCwKKwkJLnN3YXBfY2x1c3Rlcl9tYXggPSBTV0FQX0NMVVNURVJfTUFYLAorCQkuc3dhcHBpbmVzcyA9IHZtX3N3YXBwaW5lc3MsCiAJfTsKIAogbG9vcF9hZ2FpbjoKQEAgLTEwODIsMzEgKzEwOTQsMjYgQEAKIAogCQlhbGxfem9uZXNfb2sgPSAxOwogCi0JCWlmIChucl9wYWdlcyA9PSAwKSB7Ci0JCQkvKgotCQkJICogU2NhbiBpbiB0aGUgaGlnaG1lbS0+ZG1hIGRpcmVjdGlvbiBmb3IgdGhlIGhpZ2hlc3QKLQkJCSAqIHpvbmUgd2hpY2ggbmVlZHMgc2Nhbm5pbmcKLQkJCSAqLwotCQkJZm9yIChpID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlzdHJ1Y3Qgem9uZSAqem9uZSA9IHBnZGF0LT5ub2RlX3pvbmVzICsgaTsKKwkJLyoKKwkJICogU2NhbiBpbiB0aGUgaGlnaG1lbS0+ZG1hIGRpcmVjdGlvbiBmb3IgdGhlIGhpZ2hlc3QKKwkJICogem9uZSB3aGljaCBuZWVkcyBzY2FubmluZworCQkgKi8KKwkJZm9yIChpID0gcGdkYXQtPm5yX3pvbmVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCXN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwogCi0JCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKLQkJCQkJY29udGludWU7CisJCQlpZiAoIXBvcHVsYXRlZF96b25lKHpvbmUpKQorCQkJCWNvbnRpbnVlOwogCi0JCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlICYmCi0JCQkJCQlwcmlvcml0eSAhPSBERUZfUFJJT1JJVFkpCi0JCQkJCWNvbnRpbnVlOworCQkJaWYgKHpvbmUtPmFsbF91bnJlY2xhaW1hYmxlICYmIHByaW9yaXR5ICE9IERFRl9QUklPUklUWSkKKwkJCQljb250aW51ZTsKIAotCQkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsCi0JCQkJCQl6b25lLT5wYWdlc19oaWdoLCAwLCAwKSkgewotCQkJCQllbmRfem9uZSA9IGk7Ci0JCQkJCWdvdG8gc2NhbjsKLQkJCQl9CisJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB6b25lLT5wYWdlc19oaWdoLAorCQkJCQkgICAgICAgMCwgMCkpIHsKKwkJCQllbmRfem9uZSA9IGk7CisJCQkJZ290byBzY2FuOwogCQkJfQotCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSB7Ci0JCQllbmRfem9uZSA9IHBnZGF0LT5ucl96b25lcyAtIDE7CiAJCX0KKwkJZ290byBvdXQ7CiBzY2FuOgogCQlmb3IgKGkgPSAwOyBpIDw9IGVuZF96b25lOyBpKyspIHsKIAkJCXN0cnVjdCB6b25lICp6b25lID0gcGdkYXQtPm5vZGVfem9uZXMgKyBpOwpAQCAtMTEzMywxMSArMTE0MCw5IEBACiAJCQlpZiAoem9uZS0+YWxsX3VucmVjbGFpbWFibGUgJiYgcHJpb3JpdHkgIT0gREVGX1BSSU9SSVRZKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAobnJfcGFnZXMgPT0gMCkgewkvKiBOb3Qgc29mdHdhcmUgc3VzcGVuZCAqLwotCQkJCWlmICghem9uZV93YXRlcm1hcmtfb2soem9uZSwgb3JkZXIsCi0JCQkJCQl6b25lLT5wYWdlc19oaWdoLCBlbmRfem9uZSwgMCkpCi0JCQkJCWFsbF96b25lc19vayA9IDA7Ci0JCQl9CisJCQlpZiAoIXpvbmVfd2F0ZXJtYXJrX29rKHpvbmUsIG9yZGVyLCB6b25lLT5wYWdlc19oaWdoLAorCQkJCQkgICAgICAgZW5kX3pvbmUsIDApKQorCQkJCWFsbF96b25lc19vayA9IDA7CiAJCQl6b25lLT50ZW1wX3ByaW9yaXR5ID0gcHJpb3JpdHk7CiAJCQlpZiAoem9uZS0+cHJldl9wcmlvcml0eSA+IHByaW9yaXR5KQogCQkJCXpvbmUtPnByZXZfcHJpb3JpdHkgPSBwcmlvcml0eTsKQEAgLTExNjIsOCArMTE2Nyw2IEBACiAJCQkgICAgdG90YWxfc2Nhbm5lZCA+IG5yX3JlY2xhaW1lZCArIG5yX3JlY2xhaW1lZCAvIDIpCiAJCQkJc2MubWF5X3dyaXRlcGFnZSA9IDE7CiAJCX0KLQkJaWYgKG5yX3BhZ2VzICYmIHRvX2ZyZWUgPiBucl9yZWNsYWltZWQpCi0JCQljb250aW51ZTsJLyogc3dzdXNwOiBuZWVkIHRvIGRvIG1vcmUgd29yayAqLwogCQlpZiAoYWxsX3pvbmVzX29rKQogCQkJYnJlYWs7CQkvKiBrc3dhcGQ6IGFsbCBkb25lICovCiAJCS8qCkBAIC0xMTc5LDcgKzExODIsNyBAQAogCQkgKiBtYXRjaGVzIHRoZSBkaXJlY3QgcmVjbGFpbSBwYXRoIGJlaGF2aW91ciBpbiB0ZXJtcyBvZiBpbXBhY3QKIAkJICogb24gem9uZS0+Kl9wcmlvcml0eS4KIAkJICovCi0JCWlmICgobnJfcmVjbGFpbWVkID49IFNXQVBfQ0xVU1RFUl9NQVgpICYmICFucl9wYWdlcykKKwkJaWYgKG5yX3JlY2xhaW1lZCA+PSBTV0FQX0NMVVNURVJfTUFYKQogCQkJYnJlYWs7CiAJfQogb3V0OgpAQCAtMTI2MSw3ICsxMjY0LDcgQEAKIAkJfQogCQlmaW5pc2hfd2FpdCgmcGdkYXQtPmtzd2FwZF93YWl0LCAmd2FpdCk7CiAKLQkJYmFsYW5jZV9wZ2RhdChwZ2RhdCwgMCwgb3JkZXIpOworCQliYWxhbmNlX3BnZGF0KHBnZGF0LCBvcmRlcik7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTI5MCwzNSArMTI5MywxNTQgQEAKIAogI2lmZGVmIENPTkZJR19QTQogLyoKLSAqIFRyeSB0byBmcmVlIGBucl9wYWdlcycgb2YgbWVtb3J5LCBzeXN0ZW0td2lkZS4gIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmVlZAotICogcGFnZXMuCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNocmlua19hbGxfbWVtb3J5KCkuICBUcmllcyB0byByZWNsYWltICducl9wYWdlcycgcGFnZXMKKyAqIGZyb20gTFJVIGxpc3RzIHN5c3RlbS13aWRlLCBmb3IgZ2l2ZW4gcGFzcyBhbmQgcHJpb3JpdHksIGFuZCByZXR1cm5zIHRoZQorICogbnVtYmVyIG9mIHJlY2xhaW1lZCBwYWdlcworICoKKyAqIEZvciBwYXNzID4gMyB3ZSBhbHNvIHRyeSB0byBzaHJpbmsgdGhlIExSVSBsaXN0cyB0aGF0IGNvbnRhaW4gYSBmZXcgcGFnZXMKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF96b25lcyh1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLCBpbnQgcGFzcywKKwkJCQkgICAgICBpbnQgcHJpbywgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCit7CisJc3RydWN0IHpvbmUgKnpvbmU7CisJdW5zaWduZWQgbG9uZyBucl90b19zY2FuLCByZXQgPSAwOworCisJZm9yX2VhY2hfem9uZSh6b25lKSB7CisKKwkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICh6b25lLT5hbGxfdW5yZWNsYWltYWJsZSAmJiBwcmlvICE9IERFRl9QUklPUklUWSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEZvciBwYXNzID0gMCB3ZSBkb24ndCBzaHJpbmsgdGhlIGFjdGl2ZSBsaXN0ICovCisJCWlmIChwYXNzID4gMCkgeworCQkJem9uZS0+bnJfc2Nhbl9hY3RpdmUgKz0gKHpvbmUtPm5yX2FjdGl2ZSA+PiBwcmlvKSArIDE7CisJCQlpZiAoem9uZS0+bnJfc2Nhbl9hY3RpdmUgPj0gbnJfcGFnZXMgfHwgcGFzcyA+IDMpIHsKKwkJCQl6b25lLT5ucl9zY2FuX2FjdGl2ZSA9IDA7CisJCQkJbnJfdG9fc2NhbiA9IG1pbihucl9wYWdlcywgem9uZS0+bnJfYWN0aXZlKTsKKwkJCQlzaHJpbmtfYWN0aXZlX2xpc3QobnJfdG9fc2Nhbiwgem9uZSwgc2MpOworCQkJfQorCQl9CisKKwkJem9uZS0+bnJfc2Nhbl9pbmFjdGl2ZSArPSAoem9uZS0+bnJfaW5hY3RpdmUgPj4gcHJpbykgKyAxOworCQlpZiAoem9uZS0+bnJfc2Nhbl9pbmFjdGl2ZSA+PSBucl9wYWdlcyB8fCBwYXNzID4gMykgeworCQkJem9uZS0+bnJfc2Nhbl9pbmFjdGl2ZSA9IDA7CisJCQlucl90b19zY2FuID0gbWluKG5yX3BhZ2VzLCB6b25lLT5ucl9pbmFjdGl2ZSk7CisJCQlyZXQgKz0gc2hyaW5rX2luYWN0aXZlX2xpc3QobnJfdG9fc2Nhbiwgem9uZSwgc2MpOworCQkJaWYgKHJldCA+PSBucl9wYWdlcykKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRyeSB0byBmcmVlIGBucl9wYWdlcycgb2YgbWVtb3J5LCBzeXN0ZW0td2lkZSwgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mCisgKiBmcmVlZCBwYWdlcy4KKyAqCisgKiBSYXRoZXIgdGhhbiB0cnlpbmcgdG8gYWdlIExSVXMgdGhlIGFpbSBpcyB0byBwcmVzZXJ2ZSB0aGUgb3ZlcmFsbAorICogTFJVIG9yZGVyIGJ5IHJlY2xhaW1pbmcgcHJlZmVyZW50aWFsbHkKKyAqIGluYWN0aXZlID4gYWN0aXZlID4gYWN0aXZlIHJlZmVyZW5jZWQgPiBhY3RpdmUgbWFwcGVkCiAgKi8KIHVuc2lnbmVkIGxvbmcgc2hyaW5rX2FsbF9tZW1vcnkodW5zaWduZWQgbG9uZyBucl9wYWdlcykKIHsKLQlwZ19kYXRhX3QgKnBnZGF0OwotCXVuc2lnbmVkIGxvbmcgbnJfdG9fZnJlZSA9IG5yX3BhZ2VzOworCXVuc2lnbmVkIGxvbmcgbHJ1X3BhZ2VzLCBucl9zbGFiOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKLQl1bnNpZ25lZCByZXRyeSA9IDI7Ci0Jc3RydWN0IHJlY2xhaW1fc3RhdGUgcmVjbGFpbV9zdGF0ZSA9IHsKLQkJLnJlY2xhaW1lZF9zbGFiID0gMCwKKwlpbnQgcGFzczsKKwlzdHJ1Y3QgcmVjbGFpbV9zdGF0ZSByZWNsYWltX3N0YXRlOworCXN0cnVjdCB6b25lICp6b25lOworCXN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7CisJCS5nZnBfbWFzayA9IEdGUF9LRVJORUwsCisJCS5tYXlfc3dhcCA9IDAsCisJCS5zd2FwX2NsdXN0ZXJfbWF4ID0gbnJfcGFnZXMsCisJCS5tYXlfd3JpdGVwYWdlID0gMSwKKwkJLnN3YXBwaW5lc3MgPSB2bV9zd2FwcGluZXNzLAogCX07CiAKIAljdXJyZW50LT5yZWNsYWltX3N0YXRlID0gJnJlY2xhaW1fc3RhdGU7Ci1yZXBlYXQ6Ci0JZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgZnJlZWQ7CiAKLQkJZnJlZWQgPSBiYWxhbmNlX3BnZGF0KHBnZGF0LCBucl90b19mcmVlLCAwKTsKLQkJcmV0ICs9IGZyZWVkOwotCQlucl90b19mcmVlIC09IGZyZWVkOwotCQlpZiAoKGxvbmcpbnJfdG9fZnJlZSA8PSAwKQorCWxydV9wYWdlcyA9IDA7CisJZm9yX2VhY2hfem9uZSh6b25lKQorCQlscnVfcGFnZXMgKz0gem9uZS0+bnJfYWN0aXZlICsgem9uZS0+bnJfaW5hY3RpdmU7CisKKwlucl9zbGFiID0gcmVhZF9wYWdlX3N0YXRlKG5yX3NsYWIpOworCS8qIElmIHNsYWIgY2FjaGVzIGFyZSBodWdlLCBpdCdzIGJldHRlciB0byBoaXQgdGhlbSBmaXJzdCAqLworCXdoaWxlIChucl9zbGFiID49IGxydV9wYWdlcykgeworCQlyZWNsYWltX3N0YXRlLnJlY2xhaW1lZF9zbGFiID0gMDsKKwkJc2hyaW5rX3NsYWIobnJfcGFnZXMsIHNjLmdmcF9tYXNrLCBscnVfcGFnZXMpOworCQlpZiAoIXJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWIpCiAJCQlicmVhazsKKworCQlyZXQgKz0gcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYjsKKwkJaWYgKHJldCA+PSBucl9wYWdlcykKKwkJCWdvdG8gb3V0OworCisJCW5yX3NsYWIgLT0gcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYjsKIAl9Ci0JaWYgKHJldHJ5LS0gJiYgcmV0IDwgbnJfcGFnZXMpIHsKLQkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNSk7Ci0JCWdvdG8gcmVwZWF0OworCisJLyoKKwkgKiBXZSB0cnkgdG8gc2hyaW5rIExSVXMgaW4gNSBwYXNzZXM6CisJICogMCA9IFJlY2xhaW0gZnJvbSBpbmFjdGl2ZV9saXN0IG9ubHkKKwkgKiAxID0gUmVjbGFpbSBmcm9tIGFjdGl2ZSBsaXN0IGJ1dCBkb24ndCByZWNsYWltIG1hcHBlZAorCSAqIDIgPSAybmQgcGFzcyBvZiB0eXBlIDEKKwkgKiAzID0gUmVjbGFpbSBtYXBwZWQgKG5vcm1hbCByZWNsYWltKQorCSAqIDQgPSAybmQgcGFzcyBvZiB0eXBlIDMKKwkgKi8KKwlmb3IgKHBhc3MgPSAwOyBwYXNzIDwgNTsgcGFzcysrKSB7CisJCWludCBwcmlvOworCisJCS8qIE5lZWRlZCBmb3Igc2hyaW5raW5nIHNsYWIgY2FjaGVzIGxhdGVyIG9uICovCisJCWlmICghbHJ1X3BhZ2VzKQorCQkJZm9yX2VhY2hfem9uZSh6b25lKSB7CisJCQkJbHJ1X3BhZ2VzICs9IHpvbmUtPm5yX2FjdGl2ZTsKKwkJCQlscnVfcGFnZXMgKz0gem9uZS0+bnJfaW5hY3RpdmU7CisJCQl9CisKKwkJLyogRm9yY2UgcmVjbGFpbWluZyBtYXBwZWQgcGFnZXMgaW4gdGhlIHBhc3NlcyAjMyBhbmQgIzQgKi8KKwkJaWYgKHBhc3MgPiAyKSB7CisJCQlzYy5tYXlfc3dhcCA9IDE7CisJCQlzYy5zd2FwcGluZXNzID0gMTAwOworCQl9CisKKwkJZm9yIChwcmlvID0gREVGX1BSSU9SSVRZOyBwcmlvID49IDA7IHByaW8tLSkgeworCQkJdW5zaWduZWQgbG9uZyBucl90b19zY2FuID0gbnJfcGFnZXMgLSByZXQ7CisKKwkJCXNjLm5yX21hcHBlZCA9IHJlYWRfcGFnZV9zdGF0ZShucl9tYXBwZWQpOworCQkJc2MubnJfc2Nhbm5lZCA9IDA7CisKKwkJCXJldCArPSBzaHJpbmtfYWxsX3pvbmVzKG5yX3RvX3NjYW4sIHByaW8sIHBhc3MsICZzYyk7CisJCQlpZiAocmV0ID49IG5yX3BhZ2VzKQorCQkJCWdvdG8gb3V0OworCisJCQlyZWNsYWltX3N0YXRlLnJlY2xhaW1lZF9zbGFiID0gMDsKKwkJCXNocmlua19zbGFiKHNjLm5yX3NjYW5uZWQsIHNjLmdmcF9tYXNrLCBscnVfcGFnZXMpOworCQkJcmV0ICs9IHJlY2xhaW1fc3RhdGUucmVjbGFpbWVkX3NsYWI7CisJCQlpZiAocmV0ID49IG5yX3BhZ2VzKQorCQkJCWdvdG8gb3V0OworCisJCQlpZiAoc2MubnJfc2Nhbm5lZCAmJiBwcmlvIDwgREVGX1BSSU9SSVRZIC0gMikKKwkJCQlibGtfY29uZ2VzdGlvbl93YWl0KFdSSVRFLCBIWiAvIDEwKTsKKwkJfQorCisJCWxydV9wYWdlcyA9IDA7CiAJfQorCisJLyoKKwkgKiBJZiByZXQgPSAwLCB3ZSBjb3VsZCBub3Qgc2hyaW5rIExSVXMsIGJ1dCB0aGVyZSBtYXkgYmUgc29tZXRoaW5nCisJICogaW4gc2xhYiBjYWNoZXMKKwkgKi8KKwlpZiAoIXJldCkKKwkJZG8geworCQkJcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYiA9IDA7CisJCQlzaHJpbmtfc2xhYihucl9wYWdlcywgc2MuZ2ZwX21hc2ssIGxydV9wYWdlcyk7CisJCQlyZXQgKz0gcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYjsKKwkJfSB3aGlsZSAocmV0IDwgbnJfcGFnZXMgJiYgcmVjbGFpbV9zdGF0ZS5yZWNsYWltZWRfc2xhYiA+IDApOworCitvdXQ6CiAJY3VycmVudC0+cmVjbGFpbV9zdGF0ZSA9IE5VTEw7CisKIAlyZXR1cm4gcmV0OwogfQogI2VuZGlmCkBAIC0xMzYwLDcgKzE0ODIsNiBAQAogCQlwZ2RhdC0+a3N3YXBkID0gZmluZF90YXNrX2J5X3BpZChwaWQpOwogCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJfQotCXRvdGFsX21lbW9yeSA9IG5yX2ZyZWVfcGFnZWNhY2hlX3BhZ2VzKCk7CiAJaG90Y3B1X25vdGlmaWVyKGNwdV9jYWxsYmFjaywgMCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDE2LDYgKzE1MzcsNyBAQAogCQkuc3dhcF9jbHVzdGVyX21heCA9IG1heF90KHVuc2lnbmVkIGxvbmcsIG5yX3BhZ2VzLAogCQkJCQlTV0FQX0NMVVNURVJfTUFYKSwKIAkJLmdmcF9tYXNrID0gZ2ZwX21hc2ssCisJCS5zd2FwcGluZXNzID0gdm1fc3dhcHBpbmVzcywKIAl9OwogCiAJZGlzYWJsZV9zd2FwX3Rva2VuKCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCmluZGV4IDBkY2EwMjcuLjhiZTlmMjEgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCisrKyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCkBAIC0zNCw4ICszNCw4IEBACiAKIGludCBicl9kZXZfcXVldWVfcHVzaF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JLyogZHJvcCBtdHUgb3ZlcnNpemVkIHBhY2tldHMgZXhjZXB0IHRzbyAqLwotCWlmIChwYWNrZXRfbGVuZ3RoKHNrYikgPiBza2ItPmRldi0+bXR1ICYmICFza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKQorCS8qIGRyb3AgbXR1IG92ZXJzaXplZCBwYWNrZXRzIGV4Y2VwdCBnc28gKi8KKwlpZiAocGFja2V0X2xlbmd0aChza2IpID4gc2tiLT5kZXYtPm10dSAmJiAhc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKIAkJa2ZyZWVfc2tiKHNrYik7CiAJZWxzZSB7CiAjaWZkZWYgQ09ORklHX0JSSURHRV9ORVRGSUxURVIKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfaWYuYyBiL25ldC9icmlkZ2UvYnJfaWYuYwppbmRleCBmZGVjNzczLi4wNzk1NmVjIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2lmLmMKKysrIGIvbmV0L2JyaWRnZS9icl9pZi5jCkBAIC0zNzYsMTUgKzM3NiwyMCBAQAogCWZlYXR1cmVzID0gYnItPmZlYXR1cmVfbWFzayAmIH5ORVRJRl9GX0FMTF9DU1VNOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgewotCQlpZiAoY2hlY2tzdW0gJiBORVRJRl9GX05PX0NTVU0gJiYKLQkJICAgICEocC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTk9fQ1NVTSkpCisJCXVuc2lnbmVkIGxvbmcgZmVhdHVyZSA9IHAtPmRldi0+ZmVhdHVyZXM7CisKKwkJaWYgKGNoZWNrc3VtICYgTkVUSUZfRl9OT19DU1VNICYmICEoZmVhdHVyZSAmIE5FVElGX0ZfTk9fQ1NVTSkpCiAJCQljaGVja3N1bSBePSBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX0hXX0NTVU07Ci0JCWlmIChjaGVja3N1bSAmIE5FVElGX0ZfSFdfQ1NVTSAmJgotCQkgICAgIShwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19DU1VNKSkKKwkJaWYgKGNoZWNrc3VtICYgTkVUSUZfRl9IV19DU1VNICYmICEoZmVhdHVyZSAmIE5FVElGX0ZfSFdfQ1NVTSkpCiAJCQljaGVja3N1bSBePSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX0lQX0NTVU07Ci0JCWlmICghKHAtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0lQX0NTVU0pKQorCQlpZiAoIShmZWF0dXJlICYgTkVUSUZfRl9JUF9DU1VNKSkKIAkJCWNoZWNrc3VtID0gMDsKLQkJZmVhdHVyZXMgJj0gcC0+ZGV2LT5mZWF0dXJlczsKKworCQlpZiAoZmVhdHVyZSAmIE5FVElGX0ZfR1NPKQorCQkJZmVhdHVyZSB8PSBORVRJRl9GX1RTTzsKKwkJZmVhdHVyZSB8PSBORVRJRl9GX0dTTzsKKworCQlmZWF0dXJlcyAmPSBmZWF0dXJlOwogCX0KIAogCWJyLT5kZXYtPmZlYXR1cmVzID0gZmVhdHVyZXMgfCBjaGVja3N1bSB8IE5FVElGX0ZfTExUWDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IDNlNDFmOWQuLjgyOThhNTEgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtNzYxLDcgKzc2MSw3IEBACiB7CiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApICYmCiAJICAgIHNrYi0+bGVuID4gc2tiLT5kZXYtPm10dSAmJgotCSAgICAhKHNrYl9zaGluZm8oc2tiKS0+dWZvX3NpemUgfHwgc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSkpCisJICAgICFza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQogCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2tiLCBicl9kZXZfcXVldWVfcHVzaF94bWl0KTsKIAllbHNlCiAJCXJldHVybiBicl9kZXZfcXVldWVfcHVzaF94bWl0KHNrYik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXYuYyBiL25ldC9jb3JlL2Rldi5jCmluZGV4IGFiMzlmZTEuLmVhMjQ2OTMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Rldi5jCisrKyBiL25ldC9jb3JlL2Rldi5jCkBAIC0xMTYsNiArMTE2LDcgQEAKICNpbmNsdWRlIDxhc20vY3VycmVudC5oPgogI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKIC8qCiAgKglUaGUgbGlzdCBvZiBwYWNrZXQgdHlwZXMgd2Ugd2lsbCByZWNlaXZlIChhcyBvcHBvc2VkIHRvIGRpc2NhcmQpCkBAIC0xMDQ4LDcgKzEwNDksNyBAQAogICoJdGFwcyBjdXJyZW50bHkgaW4gdXNlLgogICovCiAKLXZvaWQgZGV2X3F1ZXVlX3htaXRfbml0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBkZXZfcXVldWVfeG1pdF9uaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwogCkBAIC0xMTg2LDYgKzExODcsNDAgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqCXNrYl9nc29fc2VnbWVudCAtIFBlcmZvcm0gc2VnbWVudGF0aW9uIG9uIHNrYi4KKyAqCUBza2I6IGJ1ZmZlciB0byBzZWdtZW50CisgKglAc2c6IHdoZXRoZXIgc2NhdHRlci1nYXRoZXIgaXMgc3VwcG9ydGVkIG9uIHRoZSB0YXJnZXQuCisgKgorICoJVGhpcyBmdW5jdGlvbiBzZWdtZW50cyB0aGUgZ2l2ZW4gc2tiIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBzZWdtZW50cy4KKyAqLworc3RydWN0IHNrX2J1ZmYgKnNrYl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc2cpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOworCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGU7CisJaW50IHR5cGUgPSBza2ItPnByb3RvY29sOworCisJQlVHX09OKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKKwlCVUdfT04oc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fSFcpOworCisJc2tiLT5tYWMucmF3ID0gc2tiLT5kYXRhOworCXNrYi0+bWFjX2xlbiA9IHNrYi0+bmgucmF3IC0gc2tiLT5kYXRhOworCV9fc2tiX3B1bGwoc2tiLCBza2ItPm1hY19sZW4pOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHB0eXBlLCAmcHR5cGVfYmFzZVtudG9ocyh0eXBlKSAmIDE1XSwgbGlzdCkgeworCQlpZiAocHR5cGUtPnR5cGUgPT0gdHlwZSAmJiAhcHR5cGUtPmRldiAmJiBwdHlwZS0+Z3NvX3NlZ21lbnQpIHsKKwkJCXNlZ3MgPSBwdHlwZS0+Z3NvX3NlZ21lbnQoc2tiLCBzZyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBzZWdzOworfQorCitFWFBPUlRfU1lNQk9MKHNrYl9nc29fc2VnbWVudCk7CisKIC8qIFRha2UgYWN0aW9uIHdoZW4gaGFyZHdhcmUgcmVjZXB0aW9uIGNoZWNrc3VtIGVycm9ycyBhcmUgZGV0ZWN0ZWQuICovCiAjaWZkZWYgQ09ORklHX0JVRwogdm9pZCBuZXRkZXZfcnhfY3N1bV9mYXVsdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTIyMiw2ICsxMjU3LDg2IEBACiAjZGVmaW5lIGlsbGVnYWxfaGlnaGRtYShkZXYsIHNrYikJKDApCiAjZW5kaWYKIAorc3RydWN0IGRldl9nc29fY2IgeworCXZvaWQgKCpkZXN0cnVjdG9yKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK307CisKKyNkZWZpbmUgREVWX0dTT19DQihza2IpICgoc3RydWN0IGRldl9nc29fY2IgKikoc2tiKS0+Y2IpCisKK3N0YXRpYyB2b2lkIGRldl9nc29fc2tiX2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZGV2X2dzb19jYiAqY2I7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpuc2tiID0gc2tiLT5uZXh0OworCisJCXNrYi0+bmV4dCA9IG5za2ItPm5leHQ7CisJCW5za2ItPm5leHQgPSBOVUxMOworCQlrZnJlZV9za2IobnNrYik7CisJfSB3aGlsZSAoc2tiLT5uZXh0KTsKKworCWNiID0gREVWX0dTT19DQihza2IpOworCWlmIChjYi0+ZGVzdHJ1Y3RvcikKKwkJY2ItPmRlc3RydWN0b3Ioc2tiKTsKK30KKworLyoqCisgKglkZXZfZ3NvX3NlZ21lbnQgLSBQZXJmb3JtIGVtdWxhdGVkIGhhcmR3YXJlIHNlZ21lbnRhdGlvbiBvbiBza2IuCisgKglAc2tiOiBidWZmZXIgdG8gc2VnbWVudAorICoKKyAqCVRoaXMgZnVuY3Rpb24gc2VnbWVudHMgdGhlIGdpdmVuIHNrYiBhbmQgc3RvcmVzIHRoZSBsaXN0IG9mIHNlZ21lbnRzCisgKglpbiBza2ItPm5leHQuCisgKi8KK3N0YXRpYyBpbnQgZGV2X2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBza19idWZmICpzZWdzOworCisJc2VncyA9IHNrYl9nc29fc2VnbWVudChza2IsIGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHICYmCisJCQkJICAgICFpbGxlZ2FsX2hpZ2hkbWEoZGV2LCBza2IpKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHNlZ3MpKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2Vncyk7CisKKwlza2ItPm5leHQgPSBzZWdzOworCURFVl9HU09fQ0Ioc2tiKS0+ZGVzdHJ1Y3RvciA9IHNrYi0+ZGVzdHJ1Y3RvcjsKKwlza2ItPmRlc3RydWN0b3IgPSBkZXZfZ3NvX3NrYl9kZXN0cnVjdG9yOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaWYgKGxpa2VseSghc2tiLT5uZXh0KSkgeworCQlpZiAobmV0ZGV2X25pdCkKKwkJCWRldl9xdWV1ZV94bWl0X25pdChza2IsIGRldik7CisKKwkJaWYgKCFuZXRpZl9uZWVkc19nc28oZGV2LCBza2IpKQorCQkJcmV0dXJuIGRldi0+aGFyZF9zdGFydF94bWl0KHNrYiwgZGV2KTsKKworCQlpZiAodW5saWtlbHkoZGV2X2dzb19zZWdtZW50KHNrYikpKQorCQkJZ290byBvdXRfa2ZyZWVfc2tiOworCX0KKworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2ItPm5leHQ7CisJCWludCByYzsKKworCQlza2ItPm5leHQgPSBuc2tiLT5uZXh0OworCQluc2tiLT5uZXh0ID0gTlVMTDsKKwkJcmMgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdChuc2tiLCBkZXYpOworCQlpZiAodW5saWtlbHkocmMpKSB7CisJCQlza2ItPm5leHQgPSBuc2tiOworCQkJcmV0dXJuIHJjOworCQl9CisJfSB3aGlsZSAoc2tiLT5uZXh0KTsKKwkKKwlza2ItPmRlc3RydWN0b3IgPSBERVZfR1NPX0NCKHNrYiktPmRlc3RydWN0b3I7CisKK291dF9rZnJlZV9za2I6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgSEFSRF9UWF9MT0NLKGRldiwgY3B1KSB7CQkJXAogCWlmICgoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTExUWCkgPT0gMCkgewlcCiAJCW5ldGlmX3R4X2xvY2soZGV2KTsJCQlcCkBAIC0xMjY2LDYgKzEzODEsMTAgQEAKIAlzdHJ1Y3QgUWRpc2MgKnE7CiAJaW50IHJjID0gLUVOT01FTTsKIAorCS8qIEdTTyB3aWxsIGhhbmRsZSB0aGUgZm9sbG93aW5nIGVtdWxhdGlvbnMgZGlyZWN0bHkuICovCisJaWYgKG5ldGlmX25lZWRzX2dzbyhkZXYsIHNrYikpCisJCWdvdG8gZ3NvOworCiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0ICYmCiAJICAgICEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfRlJBR0xJU1QpICYmCiAJICAgIF9fc2tiX2xpbmVhcml6ZShza2IpKQpAQCAtMTI5MCwxMiArMTQwOSwxMyBAQAogCSAgICAgIAlpZiAoc2tiX2NoZWNrc3VtX2hlbHAoc2tiLCAwKSkKIAkgICAgICAJCWdvdG8gb3V0X2tmcmVlX3NrYjsKIAorZ3NvOgogCXNwaW5fbG9ja19wcmVmZXRjaCgmZGV2LT5xdWV1ZV9sb2NrKTsKIAogCS8qIERpc2FibGUgc29mdCBpcnFzIGZvciB2YXJpb3VzIGxvY2tzIGJlbG93LiBBbHNvIAogCSAqIHN0b3BzIHByZWVtcHRpb24gZm9yIFJDVS4gCiAJICovCi0JbG9jYWxfYmhfZGlzYWJsZSgpOyAKKwlyY3VfcmVhZF9sb2NrX2JoKCk7IAogCiAJLyogVXBkYXRlcyBvZiBxZGlzYyBhcmUgc2VyaWFsaXplZCBieSBxdWV1ZV9sb2NrLiAKIAkgKiBUaGUgc3RydWN0IFFkaXNjIHdoaWNoIGlzIHBvaW50ZWQgdG8gYnkgcWRpc2MgaXMgbm93IGEgCkBAIC0xMzQ2LDExICsxNDY2LDggQEAKIAkJCUhBUkRfVFhfTE9DSyhkZXYsIGNwdSk7CiAKIAkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKSB7Ci0JCQkJaWYgKG5ldGRldl9uaXQpCi0JCQkJCWRldl9xdWV1ZV94bWl0X25pdChza2IsIGRldik7Ci0KIAkJCQlyYyA9IDA7Ci0JCQkJaWYgKCFkZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRldikpIHsKKwkJCQlpZiAoIWRldl9oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYpKSB7CiAJCQkJCUhBUkRfVFhfVU5MT0NLKGRldik7CiAJCQkJCWdvdG8gb3V0OwogCQkJCX0KQEAgLTEzNjksMTMgKzE0ODYsMTMgQEAKIAl9CiAKIAlyYyA9IC1FTkVURE9XTjsKLQlsb2NhbF9iaF9lbmFibGUoKTsKKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAogb3V0X2tmcmVlX3NrYjoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gcmM7CiBvdXQ6Ci0JbG9jYWxfYmhfZW5hYmxlKCk7CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yOTgwLDcgKzMwOTcsNyBAQAogc3RhdGljIERFRklORV9NVVRFWChuZXRfdG9kb19ydW5fbXV0ZXgpOwogdm9pZCBuZXRkZXZfcnVuX3RvZG8odm9pZCkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QgPSBMSVNUX0hFQURfSU5JVChsaXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKIAkvKiBOZWVkIHRvIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgY3B1J3MgZ2V0dGluZyBvdXQgb2Ygb3JkZXIuICovCiAJbXV0ZXhfbG9jaygmbmV0X3RvZG9fcnVuX211dGV4KTsKQEAgLTI5OTUsOSArMzExMiw5IEBACiAKIAkvKiBTbmFwc2hvdCBsaXN0LCBhbGxvdyBsYXRlciByZXF1ZXN0cyAqLwogCXNwaW5fbG9jaygmbmV0X3RvZG9fbGlzdF9sb2NrKTsKLQlsaXN0X3NwbGljZV9pbml0KCZuZXRfdG9kb19saXN0LCAmbGlzdCk7CisJbGlzdF9yZXBsYWNlX2luaXQoJm5ldF90b2RvX2xpc3QsICZsaXN0KTsKIAlzcGluX3VubG9jaygmbmV0X3RvZG9fbGlzdF9sb2NrKTsKLQkJCisKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CiAJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYKIAkJCT0gbGlzdF9lbnRyeShsaXN0Lm5leHQsIHN0cnVjdCBuZXRfZGV2aWNlLCB0b2RvX2xpc3QpOwpAQCAtMzMwMSw4ICszNDE4LDggQEAKIC8qKgogICogbmV0ZGV2X2RtYV9ldmVudCAtIGV2ZW50IGNhbGxiYWNrIGZvciB0aGUgbmV0X2RtYV9jbGllbnQKICAqIEBjbGllbnQ6IHNob3VsZCBhbHdheXMgYmUgbmV0X2RtYV9jbGllbnQKLSAqIEBjaGFuOgotICogQGV2ZW50OgorICogQGNoYW46IERNQSBjaGFubmVsIGZvciB0aGUgZXZlbnQKKyAqIEBldmVudDogZXZlbnQgdHlwZQogICovCiBzdGF0aWMgdm9pZCBuZXRkZXZfZG1hX2V2ZW50KHN0cnVjdCBkbWFfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKIAllbnVtIGRtYV9ldmVudCBldmVudCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2V0aHRvb2wuYyBiL25ldC9jb3JlL2V0aHRvb2wuYwppbmRleCAzM2NlN2VkLi4yN2NlMTY4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9ldGh0b29sLmMKKysrIGIvbmV0L2NvcmUvZXRodG9vbC5jCkBAIC02MTQsNiArNjE0LDI5IEBACiAJcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF91Zm8oZGV2LCBlZGF0YS5kYXRhKTsKIH0KIAorc3RhdGljIGludCBldGh0b29sX2dldF9nc28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQoreworCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0geyBFVEhUT09MX0dHU08gfTsKKworCWVkYXRhLmRhdGEgPSBkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HU087CisJaWYgKGNvcHlfdG9fdXNlcih1c2VyYWRkciwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKKwkJIHJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV0aHRvb2xfc2V0X2dzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCit7CisJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmVkYXRhLCB1c2VyYWRkciwgc2l6ZW9mKGVkYXRhKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChlZGF0YS5kYXRhKQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfR1NPOworCWVsc2UKKwkJZGV2LT5mZWF0dXJlcyAmPSB+TkVUSUZfRl9HU087CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZXRodG9vbF9zZWxmX3Rlc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciBfX3VzZXIgKnVzZXJhZGRyKQogewogCXN0cnVjdCBldGh0b29sX3Rlc3QgdGVzdDsKQEAgLTkwNSw2ICs5MjgsMTIgQEAKIAljYXNlIEVUSFRPT0xfU1VGTzoKIAkJcmMgPSBldGh0b29sX3NldF91Zm8oZGV2LCB1c2VyYWRkcik7CiAJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9HR1NPOgorCQlyYyA9IGV0aHRvb2xfZ2V0X2dzbyhkZXYsIHVzZXJhZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBFVEhUT09MX1NHU086CisJCXJjID0gZXRodG9vbF9zZXRfZ3NvKGRldiwgdXNlcmFkZHIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyYyA9ICAtRU9QTk9UU1VQUDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9saW5rX3dhdGNoLmMgYi9uZXQvY29yZS9saW5rX3dhdGNoLmMKaW5kZXggNjQ2OTM3Yy4uMGYzNzI2NiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbGlua193YXRjaC5jCisrKyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwpAQCAtOTEsMTEgKzkxLDEwIEBACiAvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBydG5sIHNlbWFwaG9yZSBoZWxkICovCiB2b2lkIGxpbmt3YXRjaF9ydW5fcXVldWUodm9pZCkKIHsKLQlMSVNUX0hFQUQoaGVhZCk7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbiwgKm5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkLCAqbiwgKm5leHQ7CiAKIAlzcGluX2xvY2tfaXJxKCZsd2V2ZW50bGlzdF9sb2NrKTsKLQlsaXN0X3NwbGljZV9pbml0KCZsd2V2ZW50bGlzdCwgJmhlYWQpOworCWxpc3RfcmVwbGFjZV9pbml0KCZsd2V2ZW50bGlzdCwgJmhlYWQpOwogCXNwaW5fdW5sb2NrX2lycSgmbHdldmVudGxpc3RfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobiwgbmV4dCwgJmhlYWQpIHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggYmI3MjEwZi4uOGU1MDQ0YiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTE3Miw5ICsxNzIsOSBAQAogCXNoaW5mbyA9IHNrYl9zaGluZm8oc2tiKTsKIAlhdG9taWNfc2V0KCZzaGluZm8tPmRhdGFyZWYsIDEpOwogCXNoaW5mby0+bnJfZnJhZ3MgID0gMDsKLQlzaGluZm8tPnRzb19zaXplID0gMDsKLQlzaGluZm8tPnRzb19zZWdzID0gMDsKLQlzaGluZm8tPnVmb19zaXplID0gMDsKKwlzaGluZm8tPmdzb19zaXplID0gMDsKKwlzaGluZm8tPmdzb19zZWdzID0gMDsKKwlzaGluZm8tPmdzb190eXBlID0gMDsKIAlzaGluZm8tPmlwNl9mcmFnX2lkID0gMDsKIAlzaGluZm8tPmZyYWdfbGlzdCA9IE5VTEw7CiAKQEAgLTIzOCw4ICsyMzgsOSBAQAogCiAJYXRvbWljX3NldCgmKHNrYl9zaGluZm8oc2tiKS0+ZGF0YXJlZiksIDEpOwogCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgID0gMDsKLQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKLQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKIAlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CiBvdXQ6CiAJcmV0dXJuIHNrYjsKQEAgLTUyOCw4ICs1MjksOSBAQAogI2VuZGlmCiAJc2tiX2NvcHlfc2VjbWFyayhuZXcsIG9sZCk7CiAJYXRvbWljX3NldCgmbmV3LT51c2VycywgMSk7Ci0Jc2tiX3NoaW5mbyhuZXcpLT50c29fc2l6ZSA9IHNrYl9zaGluZm8ob2xkKS0+dHNvX3NpemU7Ci0Jc2tiX3NoaW5mbyhuZXcpLT50c29fc2VncyA9IHNrYl9zaGluZm8ob2xkKS0+dHNvX3NlZ3M7CisJc2tiX3NoaW5mbyhuZXcpLT5nc29fc2l6ZSA9IHNrYl9zaGluZm8ob2xkKS0+Z3NvX3NpemU7CisJc2tiX3NoaW5mbyhuZXcpLT5nc29fc2VncyA9IHNrYl9zaGluZm8ob2xkKS0+Z3NvX3NlZ3M7CisJc2tiX3NoaW5mbyhuZXcpLT5nc29fdHlwZSA9IHNrYl9zaGluZm8ob2xkKS0+Z3NvX3R5cGU7CiB9CiAKIC8qKgpAQCAtNzgxLDI0ICs3ODMsNDAgQEAKICAqCWZpbGxlZC4gVXNlZCBieSBuZXR3b3JrIGRyaXZlcnMgd2hpY2ggbWF5IERNQSBvciB0cmFuc2ZlciBkYXRhCiAgKgliZXlvbmQgdGhlIGJ1ZmZlciBlbmQgb250byB0aGUgd2lyZS4KICAqCi0gKglNYXkgcmV0dXJuIE5VTEwgaW4gb3V0IG9mIG1lbW9yeSBjYXNlcy4KKyAqCU1heSByZXR1cm4gZXJyb3IgaW4gb3V0IG9mIG1lbW9yeSBjYXNlcy4gVGhlIHNrYiBpcyBmcmVlZCBvbiBlcnJvci4KICAqLwogIAotc3RydWN0IHNrX2J1ZmYgKnNrYl9wYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHBhZCkKK2ludCBza2JfcGFkKHN0cnVjdCBza19idWZmICpza2IsIGludCBwYWQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKm5za2I7CisJaW50IGVycjsKKwlpbnQgbnRhaWw7CiAJCiAJLyogSWYgdGhlIHNrYnVmZiBpcyBub24gbGluZWFyIHRhaWxyb29tIGlzIGFsd2F5cyB6ZXJvLi4gKi8KLQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPj0gcGFkKSB7CisJaWYgKCFza2JfY2xvbmVkKHNrYikgJiYgc2tiX3RhaWxyb29tKHNrYikgPj0gcGFkKSB7CiAJCW1lbXNldChza2ItPmRhdGErc2tiLT5sZW4sIDAsIHBhZCk7Ci0JCXJldHVybiBza2I7CisJCXJldHVybiAwOwogCX0KLQkKLQluc2tiID0gc2tiX2NvcHlfZXhwYW5kKHNrYiwgc2tiX2hlYWRyb29tKHNrYiksIHNrYl90YWlscm9vbShza2IpICsgcGFkLCBHRlBfQVRPTUlDKTsKKworCW50YWlsID0gc2tiLT5kYXRhX2xlbiArIHBhZCAtIChza2ItPmVuZCAtIHNrYi0+dGFpbCk7CisJaWYgKGxpa2VseShza2JfY2xvbmVkKHNrYikgfHwgbnRhaWwgPiAwKSkgeworCQllcnIgPSBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgbnRhaWwsIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoZXJyKSkKKwkJCWdvdG8gZnJlZV9za2I7CisJfQorCisJLyogRklYTUU6IFRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiB3aXRoIG5vbi1saW5lYXIgc2tiJ3MgcmVhbGx5IG5lZWRzCisJICogdG8gYmUgYXVkaXRlZC4KKwkgKi8KKwllcnIgPSBza2JfbGluZWFyaXplKHNrYik7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gZnJlZV9za2I7CisKKwltZW1zZXQoc2tiLT5kYXRhICsgc2tiLT5sZW4sIDAsIHBhZCk7CisJcmV0dXJuIDA7CisKK2ZyZWVfc2tiOgogCWtmcmVlX3NrYihza2IpOwotCWlmIChuc2tiKQotCQltZW1zZXQobnNrYi0+ZGF0YStuc2tiLT5sZW4sIDAsIHBhZCk7Ci0JcmV0dXJuIG5za2I7CisJcmV0dXJuIGVycjsKIH0JCiAgCiAvKiBUcmltcyBza2IgdG8gbGVuZ3RoIGxlbi4gSXQgY2FuIGNoYW5nZSBza2IgcG9pbnRlcnMuCkBAIC0xODI0LDYgKzE4NDIsMTMyIEBACiAKIEVYUE9SVF9TWU1CT0xfR1BMKHNrYl9wdWxsX3Jjc3VtKTsKIAorLyoqCisgKglza2Jfc2VnbWVudCAtIFBlcmZvcm0gcHJvdG9jb2wgc2VnbWVudGF0aW9uIG9uIHNrYi4KKyAqCUBza2I6IGJ1ZmZlciB0byBzZWdtZW50CisgKglAc2c6IHdoZXRoZXIgc2NhdHRlci1nYXRoZXIgY2FuIGJlIHVzZWQgZm9yIGdlbmVyYXRlZCBzZWdtZW50cworICoKKyAqCVRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgc2VnbWVudGF0aW9uIG9uIHRoZSBnaXZlbiBza2IuICBJdCByZXR1cm5zCisgKgl0aGUgc2VnbWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uICBJdCByZXR1cm5zIE5VTEwgaWYgdGhlcmUgYXJlCisgKglubyBtb3JlIHNlZ21lbnRzIHRvIGdlbmVyYXRlLCBvciB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkLgorICovCitzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNnKQoreworCXN0cnVjdCBza19idWZmICpzZWdzID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IG1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CisJdW5zaWduZWQgaW50IGRvZmZzZXQgPSBza2ItPmRhdGEgLSBza2ItPm1hYy5yYXc7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGRvZmZzZXQ7CisJdW5zaWduZWQgaW50IGhlYWRyb29tOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IG5mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisJaW50IGVyciA9IC1FTk9NRU07CisJaW50IGkgPSAwOworCWludCBwb3M7CisKKwlfX3NrYl9wdXNoKHNrYiwgZG9mZnNldCk7CisJaGVhZHJvb20gPSBza2JfaGVhZHJvb20oc2tiKTsKKwlwb3MgPSBza2JfaGVhZGxlbihza2IpOworCisJZG8geworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKKwkJc2tiX2ZyYWdfdCAqZnJhZzsKKwkJaW50IGhzaXplLCBuc2l6ZTsKKwkJaW50IGs7CisJCWludCBzaXplOworCisJCWxlbiA9IHNrYi0+bGVuIC0gb2Zmc2V0OworCQlpZiAobGVuID4gbXNzKQorCQkJbGVuID0gbXNzOworCisJCWhzaXplID0gc2tiX2hlYWRsZW4oc2tiKSAtIG9mZnNldDsKKwkJaWYgKGhzaXplIDwgMCkKKwkJCWhzaXplID0gMDsKKwkJbnNpemUgPSBoc2l6ZSArIGRvZmZzZXQ7CisJCWlmIChuc2l6ZSA+IGxlbiArIGRvZmZzZXQgfHwgIXNnKQorCQkJbnNpemUgPSBsZW4gKyBkb2Zmc2V0OworCisJCW5za2IgPSBhbGxvY19za2IobnNpemUgKyBoZWFkcm9vbSwgR0ZQX0FUT01JQyk7CisJCWlmICh1bmxpa2VseSghbnNrYikpCisJCQlnb3RvIGVycjsKKworCQlpZiAoc2VncykKKwkJCXRhaWwtPm5leHQgPSBuc2tiOworCQllbHNlCisJCQlzZWdzID0gbnNrYjsKKwkJdGFpbCA9IG5za2I7CisKKwkJbnNrYi0+ZGV2ID0gc2tiLT5kZXY7CisJCW5za2ItPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKKwkJbnNrYi0+cHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCQluc2tiLT5kc3QgPSBkc3RfY2xvbmUoc2tiLT5kc3QpOworCQltZW1jcHkobnNrYi0+Y2IsIHNrYi0+Y2IsIHNpemVvZihza2ItPmNiKSk7CisJCW5za2ItPnBrdF90eXBlID0gc2tiLT5wa3RfdHlwZTsKKwkJbnNrYi0+bWFjX2xlbiA9IHNrYi0+bWFjX2xlbjsKKworCQlza2JfcmVzZXJ2ZShuc2tiLCBoZWFkcm9vbSk7CisJCW5za2ItPm1hYy5yYXcgPSBuc2tiLT5kYXRhOworCQluc2tiLT5uaC5yYXcgPSBuc2tiLT5kYXRhICsgc2tiLT5tYWNfbGVuOworCQluc2tiLT5oLnJhdyA9IG5za2ItPm5oLnJhdyArIChza2ItPmgucmF3IC0gc2tiLT5uaC5yYXcpOworCQltZW1jcHkoc2tiX3B1dChuc2tiLCBkb2Zmc2V0KSwgc2tiLT5kYXRhLCBkb2Zmc2V0KTsKKworCQlpZiAoIXNnKSB7CisJCQluc2tiLT5jc3VtID0gc2tiX2NvcHlfYW5kX2NzdW1fYml0cyhza2IsIG9mZnNldCwKKwkJCQkJCQkgICAgc2tiX3B1dChuc2tiLCBsZW4pLAorCQkJCQkJCSAgICBsZW4sIDApOworCQkJY29udGludWU7CisJCX0KKworCQlmcmFnID0gc2tiX3NoaW5mbyhuc2tiKS0+ZnJhZ3M7CisJCWsgPSAwOworCisJCW5za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0hXOworCQluc2tiLT5jc3VtID0gc2tiLT5jc3VtOworCQltZW1jcHkoc2tiX3B1dChuc2tiLCBoc2l6ZSksIHNrYi0+ZGF0YSArIG9mZnNldCwgaHNpemUpOworCisJCXdoaWxlIChwb3MgPCBvZmZzZXQgKyBsZW4pIHsKKwkJCUJVR19PTihpID49IG5mcmFncyk7CisKKwkJCSpmcmFnID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKwkJCWdldF9wYWdlKGZyYWctPnBhZ2UpOworCQkJc2l6ZSA9IGZyYWctPnNpemU7CisKKwkJCWlmIChwb3MgPCBvZmZzZXQpIHsKKwkJCQlmcmFnLT5wYWdlX29mZnNldCArPSBvZmZzZXQgLSBwb3M7CisJCQkJZnJhZy0+c2l6ZSAtPSBvZmZzZXQgLSBwb3M7CisJCQl9CisKKwkJCWsrKzsKKworCQkJaWYgKHBvcyArIHNpemUgPD0gb2Zmc2V0ICsgbGVuKSB7CisJCQkJaSsrOworCQkJCXBvcyArPSBzaXplOworCQkJfSBlbHNlIHsKKwkJCQlmcmFnLT5zaXplIC09IHBvcyArIHNpemUgLSAob2Zmc2V0ICsgbGVuKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJZnJhZysrOworCQl9CisKKwkJc2tiX3NoaW5mbyhuc2tiKS0+bnJfZnJhZ3MgPSBrOworCQluc2tiLT5kYXRhX2xlbiA9IGxlbiAtIGhzaXplOworCQluc2tiLT5sZW4gKz0gbnNrYi0+ZGF0YV9sZW47CisJCW5za2ItPnRydWVzaXplICs9IG5za2ItPmRhdGFfbGVuOworCX0gd2hpbGUgKChvZmZzZXQgKz0gbGVuKSA8IHNrYi0+bGVuKTsKKworCXJldHVybiBzZWdzOworCitlcnI6CisJd2hpbGUgKChza2IgPSBzZWdzKSkgeworCQlzZWdzID0gc2tiLT5uZXh0OworCQlrZnJlZShza2IpOworCX0KKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChza2Jfc2VnbWVudCk7CisKIHZvaWQgX19pbml0IHNrYl9pbml0KHZvaWQpCiB7CiAJc2tidWZmX2hlYWRfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgic2tidWZmX2hlYWRfY2FjaGUiLApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvS2NvbmZpZyBiL25ldC9kY2NwL0tjb25maWcKaW5kZXggN2UwOTZiYS4uODU5ZTMzNSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvS2NvbmZpZworKysgYi9uZXQvZGNjcC9LY29uZmlnCkBAIC0yNiw3ICsyNiw3IEBACiAKIGNvbmZpZyBJUF9EQ0NQX0FDS1ZFQwogCWRlcGVuZHMgb24gSVBfRENDUAotCWRlZl9ib29sIE4KKwlib29sCiAKIHNvdXJjZSAibmV0L2RjY3AvY2NpZHMvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfd3guYyBiL25ldC9pZWVlODAyMTEvc29mdG1hYy9pZWVlODAyMTFzb2Z0bWFjX3d4LmMKaW5kZXggMjJhYTYxOS4uMGU2NWZmNCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxMS9zb2Z0bWFjL2llZWU4MDIxMXNvZnRtYWNfd3guYworKysgYi9uZXQvaWVlZTgwMjExL3NvZnRtYWMvaWVlZTgwMjExc29mdG1hY193eC5jCkBAIC0zODgsNyArMzg4LDcgQEAKIAkJbWVtY3B5KG1hYy0+d3BhLklFLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwogCQlkcHJpbnRrKEtFUk5fSU5GTyBQRlggImdlbmVyaWMgSUUgc2V0IHRvICIpOwogCQlmb3IgKGk9MDtpPHdycXUtPmRhdGEubGVuZ3RoO2krKykKLQkJCWRwcmludGsoIiUuMngiLCBtYWMtPndwYS5JRVtpXSk7CisJCQlkcHJpbnRrKCIlLjJ4IiwgKHU4KW1hYy0+d3BhLklFW2ldKTsKIAkJZHByaW50aygiXG4iKTsKIAkJbWFjLT53cGEuSUVsZW4gPSB3cnF1LT5kYXRhLmxlbmd0aDsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYWZfaW5ldC5jIGIvbmV0L2lwdjQvYWZfaW5ldC5jCmluZGV4IDBhMjc3NDUuLjQ2MTIxNmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2FmX2luZXQuYworKysgYi9uZXQvaXB2NC9hZl9pbmV0LmMKQEAgLTY4LDYgKzY4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgpAQCAtMTA5Niw2ICsxMDk3LDU0IEBACiAKIEVYUE9SVF9TWU1CT0woaW5ldF9za19yZWJ1aWxkX2hlYWRlcik7CiAKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaW5ldF9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc2cpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBFUlJfUFRSKC1FSU5WQUwpOworCXN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBuZXRfcHJvdG9jb2wgKm9wczsKKwlpbnQgcHJvdG87CisJaW50IGlobDsKKwlpbnQgaWQ7CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpKQorCQlnb3RvIG91dDsKKworCWlwaCA9IHNrYi0+bmguaXBoOworCWlobCA9IGlwaC0+aWhsICogNDsKKwlpZiAoaWhsIDwgc2l6ZW9mKCppcGgpKQorCQlnb3RvIG91dDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGlobCkpCisJCWdvdG8gb3V0OworCisJc2tiLT5oLnJhdyA9IF9fc2tiX3B1bGwoc2tiLCBpaGwpOworCWlwaCA9IHNrYi0+bmguaXBoOworCWlkID0gbnRvaHMoaXBoLT5pZCk7CisJcHJvdG8gPSBpcGgtPnByb3RvY29sICYgKE1BWF9JTkVUX1BST1RPUyAtIDEpOworCXNlZ3MgPSBFUlJfUFRSKC1FUFJPVE9OT1NVUFBPUlQpOworCisJcmN1X3JlYWRfbG9jaygpOworCW9wcyA9IHJjdV9kZXJlZmVyZW5jZShpbmV0X3Byb3Rvc1twcm90b10pOworCWlmIChvcHMgJiYgb3BzLT5nc29fc2VnbWVudCkKKwkJc2VncyA9IG9wcy0+Z3NvX3NlZ21lbnQoc2tiLCBzZyk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoSVNfRVJSKHNlZ3MpKQorCQlnb3RvIG91dDsKKworCXNrYiA9IHNlZ3M7CisJZG8geworCQlpcGggPSBza2ItPm5oLmlwaDsKKwkJaXBoLT5pZCA9IGh0b25zKGlkKyspOworCQlpcGgtPnRvdF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNrYi0+bWFjX2xlbik7CisJCWlwaC0+Y2hlY2sgPSAwOworCQlpcGgtPmNoZWNrID0gaXBfZmFzdF9jc3VtKHNrYi0+bmgucmF3LCBpcGgtPmlobCk7CisJfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOworCitvdXQ6CisJcmV0dXJuIHNlZ3M7Cit9CisKICNpZmRlZiBDT05GSUdfSVBfTVVMVElDQVNUCiBzdGF0aWMgc3RydWN0IG5ldF9wcm90b2NvbCBpZ21wX3Byb3RvY29sID0gewogCS5oYW5kbGVyID0JaWdtcF9yY3YsCkBAIC0xMTA1LDYgKzExNTQsNyBAQAogc3RhdGljIHN0cnVjdCBuZXRfcHJvdG9jb2wgdGNwX3Byb3RvY29sID0gewogCS5oYW5kbGVyID0JdGNwX3Y0X3JjdiwKIAkuZXJyX2hhbmRsZXIgPQl0Y3BfdjRfZXJyLAorCS5nc29fc2VnbWVudCA9CXRjcF90c29fc2VnbWVudCwKIAkubm9fcG9saWN5ID0JMSwKIH07CiAKQEAgLTExNTAsNiArMTIwMCw3IEBACiBzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGlwX3BhY2tldF90eXBlID0gewogCS50eXBlID0gX19jb25zdGFudF9odG9ucyhFVEhfUF9JUCksCiAJLmZ1bmMgPSBpcF9yY3YsCisJLmdzb19zZWdtZW50ID0gaW5ldF9nc29fc2VnbWVudCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluZXRfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCA4NTM4YWFjLi43NjI0ZmQxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtMjEwLDggKzIxMCw3IEBACiAJCXJldHVybiBkc3Rfb3V0cHV0KHNrYik7CiAJfQogI2VuZGlmCi0JaWYgKHNrYi0+bGVuID4gZHN0X210dShza2ItPmRzdCkgJiYKLQkgICAgIShza2Jfc2hpbmZvKHNrYiktPnVmb19zaXplIHx8IHNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUpKQorCWlmIChza2ItPmxlbiA+IGRzdF9tdHUoc2tiLT5kc3QpICYmICFza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQogCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2tiLCBpcF9maW5pc2hfb3V0cHV0Mik7CiAJZWxzZQogCQlyZXR1cm4gaXBfZmluaXNoX291dHB1dDIoc2tiKTsKQEAgLTM2Miw3ICszNjEsNyBAQAogCX0KIAogCWlwX3NlbGVjdF9pZGVudF9tb3JlKGlwaCwgJnJ0LT51LmRzdCwgc2ssCi0JCQkgICAgIChza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID86IDEpIC0gMSk7CisJCQkgICAgIChza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID86IDEpIC0gMSk7CiAKIAkvKiBBZGQgYW4gSVAgY2hlY2tzdW0uICovCiAJaXBfc2VuZF9jaGVjayhpcGgpOwpAQCAtNzQ0LDcgKzc0Myw4IEBACiAJCQkgICAgICAgKGxlbmd0aCAtIHRyYW5zaGRybGVuKSk7CiAJaWYgKCFlcnIpIHsKIAkJLyogc3BlY2lmeSB0aGUgbGVuZ3RoIG9mIGVhY2ggSVAgZGF0YWdyYW0gZnJhZ21lbnQqLwotCQlza2Jfc2hpbmZvKHNrYiktPnVmb19zaXplID0gKG10dSAtIGZyYWdoZWFkZXJsZW4pOworCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gbXR1IC0gZnJhZ2hlYWRlcmxlbjsKKwkJc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSA9IFNLQl9HU09fVURQVjQ7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKIAogCQlyZXR1cm4gMDsKQEAgLTEwODcsMTQgKzEwODcsMTYgQEAKIAogCWluZXQtPmNvcmsubGVuZ3RoICs9IHNpemU7CiAJaWYgKChzay0+c2tfcHJvdG9jb2wgPT0gSVBQUk9UT19VRFApICYmCi0JICAgIChydC0+dS5kc3QuZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVUZPKSkKLQkJc2tiX3NoaW5mbyhza2IpLT51Zm9fc2l6ZSA9IChtdHUgLSBmcmFnaGVhZGVybGVuKTsKKwkgICAgKHJ0LT51LmRzdC5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pKSB7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSBtdHUgLSBmcmFnaGVhZGVybGVuOworCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gU0tCX0dTT19VRFBWNDsKKwl9CiAKIAogCXdoaWxlIChzaXplID4gMCkgewogCQlpbnQgaTsKIAotCQlpZiAoc2tiX3NoaW5mbyhza2IpLT51Zm9fc2l6ZSkKKwkJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCiAJCQlsZW4gPSBzaXplOwogCQllbHNlIHsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCmluZGV4IGNlZTMzOTcuLjcwNmMwMDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKQEAgLTE3NjEsNyArMTc2MSw3IEBACiAJCWdvdG8gZnJlZV9uZXdpbmZvOwogCiAJLyogQW5kIG9uZSBjb3B5IGZvciBldmVyeSBvdGhlciBDUFUgKi8KLQlmb3JfZWFjaF9jcHUoaSkKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKIAkJaWYgKG5ld2luZm8tPmVudHJpZXNbaV0gJiYgbmV3aW5mby0+ZW50cmllc1tpXSAhPSBlbnRyeTEpCiAJCQltZW1jcHkobmV3aW5mby0+ZW50cmllc1tpXSwgZW50cnkxLCBuZXdpbmZvLT5zaXplKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggY2M5NDIzZC4uNjBiMTFhZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC0yNDQsNyArMjQ0LDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBydF9jYWNoZV9zdGF0LCBydF9jYWNoZV9zdGF0KTsKICNkZWZpbmUgUlRfQ0FDSEVfU1RBVF9JTkMoZmllbGQpIFwKLQkocGVyX2NwdShydF9jYWNoZV9zdGF0LCByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKS5maWVsZCsrKQorCShfX3Jhd19nZXRfY3B1X3ZhcihydF9jYWNoZV9zdGF0KS5maWVsZCsrKQogCiBzdGF0aWMgaW50IHJ0X2ludGVybl9oYXNoKHVuc2lnbmVkIGhhc2gsIHN0cnVjdCBydGFibGUgKnJ0aCwKIAkJCQlzdHJ1Y3QgcnRhYmxlICoqcmVzKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcC5jIGIvbmV0L2lwdjQvdGNwLmMKaW5kZXggNzQ5OThmMi4uMGUwMjljNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwLmMKKysrIGIvbmV0L2lwdjQvdGNwLmMKQEAgLTI1OCw2ICsyNTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvdGNwLmg+CkBAIC01NzEsNyArNTcyLDcgQEAKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9IVzsKIAkJdHAtPndyaXRlX3NlcSArPSBjb3B5OwogCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgKz0gY29weTsKLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDA7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAwOwogCiAJCWlmICghY29waWVkKQogCQkJVENQX1NLQl9DQihza2IpLT5mbGFncyAmPSB+VENQQ0JfRkxBR19QU0g7CkBAIC04MTgsNyArODE5LDcgQEAKIAogCQkJdHAtPndyaXRlX3NlcSArPSBjb3B5OwogCQkJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxICs9IGNvcHk7Ci0JCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAwOwogCiAJCQlmcm9tICs9IGNvcHk7CiAJCQljb3BpZWQgKz0gY29weTsKQEAgLTIxNDQsNiArMjE0NSw2NyBAQAogRVhQT1JUX1NZTUJPTChjb21wYXRfdGNwX2dldHNvY2tvcHQpOwogI2VuZGlmCiAKK3N0cnVjdCBza19idWZmICp0Y3BfdHNvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHNnKQoreworCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRUlOVkFMKTsKKwlzdHJ1Y3QgdGNwaGRyICp0aDsKKwl1bnNpZ25lZCB0aGxlbjsKKwl1bnNpZ25lZCBpbnQgc2VxOworCXVuc2lnbmVkIGludCBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgb2xkbGVuOworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2YoKnRoKSkpCisJCWdvdG8gb3V0OworCisJdGggPSBza2ItPmgudGg7CisJdGhsZW4gPSB0aC0+ZG9mZiAqIDQ7CisJaWYgKHRobGVuIDwgc2l6ZW9mKCp0aCkpCisJCWdvdG8gb3V0OworCisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgdGhsZW4pKQorCQlnb3RvIG91dDsKKworCW9sZGxlbiA9IH5odG9ubChza2ItPmxlbik7CisJX19za2JfcHVsbChza2IsIHRobGVuKTsKKworCXNlZ3MgPSBza2Jfc2VnbWVudChza2IsIHNnKTsKKwlpZiAoSVNfRVJSKHNlZ3MpKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CisJZGVsdGEgPSBjc3VtX2FkZChvbGRsZW4sIGh0b25sKHRobGVuICsgbGVuKSk7CisKKwlza2IgPSBzZWdzOworCXRoID0gc2tiLT5oLnRoOworCXNlcSA9IG50b2hsKHRoLT5zZXEpOworCisJZG8geworCQl0aC0+ZmluID0gdGgtPnBzaCA9IDA7CisKKwkJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKKwkJCXRoLT5jaGVjayA9IGNzdW1fZm9sZChjc3VtX3BhcnRpYWwoCisJCQkJc2tiLT5oLnJhdywgdGhsZW4sIGNzdW1fYWRkKHNrYi0+Y3N1bSwgZGVsdGEpKSk7CisJCX0KKworCQlzZXEgKz0gbGVuOworCQlza2IgPSBza2ItPm5leHQ7CisJCXRoID0gc2tiLT5oLnRoOworCisJCXRoLT5zZXEgPSBodG9ubChzZXEpOworCQl0aC0+Y3dyID0gMDsKKwl9IHdoaWxlIChza2ItPm5leHQpOworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX05PTkUpIHsKKwkJZGVsdGEgPSBjc3VtX2FkZChvbGRsZW4sIGh0b25sKHNrYi0+dGFpbCAtIHNrYi0+aC5yYXcpKTsKKwkJdGgtPmNoZWNrID0gY3N1bV9mb2xkKGNzdW1fcGFydGlhbCgKKwkJCXNrYi0+aC5yYXcsIHRobGVuLCBjc3VtX2FkZChza2ItPmNzdW0sIGRlbHRhKSkpOworCX0KKworb3V0OgorCXJldHVybiBzZWdzOworfQorCiBleHRlcm4gdm9pZCBfX3NrYl9jYl90b29fc21hbGxfZm9yX3RjcChpbnQsIGludCk7CiBleHRlcm4gc3RydWN0IHRjcF9jb25nZXN0aW9uX29wcyB0Y3BfcmVubzsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lucHV0LmMgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwppbmRleCBlMDgyNDViLi45NGZlNWIxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaW5wdXQuYworKysgYi9uZXQvaXB2NC90Y3BfaW5wdXQuYwpAQCAtMTA3Myw3ICsxMDczLDcgQEAKIAkJCQllbHNlCiAJCQkJCXBrdF9sZW4gPSAoZW5kX3NlcSAtCiAJCQkJCQkgICBUQ1BfU0tCX0NCKHNrYiktPnNlcSk7Ci0JCQkJaWYgKHRjcF9mcmFnbWVudChzaywgc2tiLCBwa3RfbGVuLCBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplKSkKKwkJCQlpZiAodGNwX2ZyYWdtZW50KHNrLCBza2IsIHBrdF9sZW4sIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpKQogCQkJCQlicmVhazsKIAkJCQlwY291bnQgPSB0Y3Bfc2tiX3Bjb3VudChza2IpOwogCQkJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX291dHB1dC5jIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCmluZGV4IDA3YmI1YTIuLmJkZDcxZGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKQEAgLTUxNSwxNSArNTE1LDE3IEBACiAJCS8qIEF2b2lkIHRoZSBjb3N0bHkgZGl2aWRlIGluIHRoZSBub3JtYWwKIAkJICogbm9uLVRTTyBjYXNlLgogCQkgKi8KLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7Ci0JCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMTsKKwkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IDA7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGludCBmYWN0b3I7CiAKIAkJZmFjdG9yID0gc2tiLT5sZW4gKyAobXNzX25vdyAtIDEpOwogCQlmYWN0b3IgLz0gbXNzX25vdzsKLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IGZhY3RvcjsKLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2l6ZSA9IG1zc19ub3c7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSBmYWN0b3I7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSBtc3Nfbm93OworCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gU0tCX0dTT19UQ1BWNDsKIAl9CiB9CiAKQEAgLTkxNCw3ICs5MTYsNyBAQAogCiAJaWYgKCF0c29fc2VncyB8fAogCSAgICAodHNvX3NlZ3MgPiAxICYmCi0JICAgICBza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplICE9IG1zc19ub3cpKSB7CisJICAgICB0Y3Bfc2tiX21zcyhza2IpICE9IG1zc19ub3cpKSB7CiAJCXRjcF9zZXRfc2tiX3Rzb19zZWdzKHNrLCBza2IsIG1zc19ub3cpOwogCQl0c29fc2VncyA9IHRjcF9za2JfcGNvdW50KHNrYik7CiAJfQpAQCAtMTcyNCw4ICsxNzI2LDkgQEAKIAkgICB0cC0+c25kX3VuYSA9PSAoVENQX1NLQl9DQihza2IpLT5lbmRfc2VxIC0gMSkpIHsKIAkJaWYgKCFwc2tiX3RyaW0oc2tiLCAwKSkgewogCQkJVENQX1NLQl9DQihza2IpLT5zZXEgPSBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgLSAxOwotCQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7Ci0JCQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKKwkJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAxOworCQkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IDA7CisJCQlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIAkJCXNrYi0+Y3N1bSA9IDA7CiAJCX0KQEAgLTE5MzAsOCArMTkzMyw5IEBACiAJCXNrYi0+Y3N1bSA9IDA7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSAoVENQQ0JfRkxBR19BQ0sgfCBUQ1BDQl9GTEFHX0ZJTik7CiAJCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKLQkJc2tiX3NoaW5mbyhza2IpLT50c29fc2VncyA9IDE7Ci0JCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMTsKKwkJc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSA9IDA7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOwogCiAJCS8qIEZJTiBlYXRzIGEgc2VxdWVuY2UgYnl0ZSwgd3JpdGVfc2VxIGFkdmFuY2VkIGJ5IHRjcF9xdWV1ZV9za2IoKS4gKi8KIAkJVENQX1NLQl9DQihza2IpLT5zZXEgPSB0cC0+d3JpdGVfc2VxOwpAQCAtMTk2Myw4ICsxOTY3LDkgQEAKIAlza2ItPmNzdW0gPSAwOwogCVRDUF9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgPSAoVENQQ0JfRkxBR19BQ0sgfCBUQ1BDQl9GTEFHX1JTVCk7CiAJVENQX1NLQl9DQihza2IpLT5zYWNrZWQgPSAwOwotCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgPSAxOwotCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAxOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOwogCiAJLyogU2VuZCBpdCBvZmYuICovCiAJVENQX1NLQl9DQihza2IpLT5zZXEgPSB0Y3BfYWNjZXB0YWJsZV9zZXEoc2ssIHRwKTsKQEAgLTIwNDcsOCArMjA1Miw5IEBACiAJVENQX1NLQl9DQihza2IpLT5zZXEgPSB0Y3BfcnNrKHJlcSktPnNudF9pc247CiAJVENQX1NLQl9DQihza2IpLT5lbmRfc2VxID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyAxOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKLQlza2Jfc2hpbmZvKHNrYiktPnRzb19zZWdzID0gMTsKLQlza2Jfc2hpbmZvKHNrYiktPnRzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID0gMTsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gMDsKIAl0aC0+c2VxID0gaHRvbmwoVENQX1NLQl9DQihza2IpLT5zZXEpOwogCXRoLT5hY2tfc2VxID0gaHRvbmwodGNwX3JzayhyZXEpLT5yY3ZfaXNuICsgMSk7CiAJaWYgKHJlcS0+cmN2X3duZCA9PSAwKSB7IC8qIGlnbm9yZWQgZm9yIHJldHJhbnNtaXR0ZWQgc3lucyAqLwpAQCAtMjE1Miw4ICsyMTU4LDkgQEAKIAlUQ1BfU0tCX0NCKGJ1ZmYpLT5mbGFncyA9IFRDUENCX0ZMQUdfU1lOOwogCVRDUF9FQ05fc2VuZF9zeW4oc2ssIHRwLCBidWZmKTsKIAlUQ1BfU0tCX0NCKGJ1ZmYpLT5zYWNrZWQgPSAwOwotCXNrYl9zaGluZm8oYnVmZiktPnRzb19zZWdzID0gMTsKLQlza2Jfc2hpbmZvKGJ1ZmYpLT50c29fc2l6ZSA9IDA7CisJc2tiX3NoaW5mbyhidWZmKS0+Z3NvX3NlZ3MgPSAxOworCXNrYl9zaGluZm8oYnVmZiktPmdzb19zaXplID0gMDsKKwlza2Jfc2hpbmZvKGJ1ZmYpLT5nc29fdHlwZSA9IDA7CiAJYnVmZi0+Y3N1bSA9IDA7CiAJVENQX1NLQl9DQihidWZmKS0+c2VxID0gdHAtPndyaXRlX3NlcSsrOwogCVRDUF9TS0JfQ0IoYnVmZiktPmVuZF9zZXEgPSB0cC0+d3JpdGVfc2VxOwpAQCAtMjI1Nyw4ICsyMjY0LDkgQEAKIAkJYnVmZi0+Y3N1bSA9IDA7CiAJCVRDUF9TS0JfQ0IoYnVmZiktPmZsYWdzID0gVENQQ0JfRkxBR19BQ0s7CiAJCVRDUF9TS0JfQ0IoYnVmZiktPnNhY2tlZCA9IDA7Ci0JCXNrYl9zaGluZm8oYnVmZiktPnRzb19zZWdzID0gMTsKLQkJc2tiX3NoaW5mbyhidWZmKS0+dHNvX3NpemUgPSAwOworCQlza2Jfc2hpbmZvKGJ1ZmYpLT5nc29fc2VncyA9IDE7CisJCXNrYl9zaGluZm8oYnVmZiktPmdzb19zaXplID0gMDsKKwkJc2tiX3NoaW5mbyhidWZmKS0+Z3NvX3R5cGUgPSAwOwogCiAJCS8qIFNlbmQgaXQgb2ZmLCB0aGlzIGNsZWFycyBkZWxheWVkIGFja3MgZm9yIHVzLiAqLwogCQlUQ1BfU0tCX0NCKGJ1ZmYpLT5zZXEgPSBUQ1BfU0tCX0NCKGJ1ZmYpLT5lbmRfc2VxID0gdGNwX2FjY2VwdGFibGVfc2VxKHNrLCB0cCk7CkBAIC0yMjkzLDggKzIzMDEsOSBAQAogCXNrYi0+Y3N1bSA9IDA7CiAJVENQX1NLQl9DQihza2IpLT5mbGFncyA9IFRDUENCX0ZMQUdfQUNLOwogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gdXJnZW50OwotCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NlZ3MgPSAxOwotCXNrYl9zaGluZm8oc2tiKS0+dHNvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPSAxOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSAwOworCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSAwOwogCiAJLyogVXNlIGEgcHJldmlvdXMgc2VxdWVuY2UuICBUaGlzIHNob3VsZCBjYXVzZSB0aGUgb3RoZXIKIAkgKiBlbmQgdG8gc2VuZCBhbiBhY2suICBEb24ndCBxdWV1ZSBvciBjbG9uZSBTS0IsIGp1c3QKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X291dHB1dC5jIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKaW5kZXggYWM5ZDkxZC4uMTkzMzYzZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMKQEAgLTksNiArOSw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CkBAIC05NywxNiArOTksMTAgQEAKIAlnb3RvIG91dF9leGl0OwogfQogCi1zdGF0aWMgaW50IHhmcm00X291dHB1dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgeGZybTRfb3V0cHV0X2ZpbmlzaDIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgZXJyOwogCi0jaWZkZWYgQ09ORklHX05FVEZJTFRFUgotCWlmICghc2tiLT5kc3QtPnhmcm0pIHsKLQkJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9SRVJPVVRFRDsKLQkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKLQl9Ci0jZW5kaWYKIAl3aGlsZSAobGlrZWx5KChlcnIgPSB4ZnJtNF9vdXRwdXRfb25lKHNrYikpID09IDApKSB7CiAJCW5mX3Jlc2V0KHNrYik7CiAKQEAgLTExOSw3ICsxMTUsNyBAQAogCQkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKIAogCQllcnIgPSBuZl9ob29rKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgJnNrYiwgTlVMTCwKLQkJCSAgICAgIHNrYi0+ZHN0LT5kZXYsIHhmcm00X291dHB1dF9maW5pc2gpOworCQkJICAgICAgc2tiLT5kc3QtPmRldiwgeGZybTRfb3V0cHV0X2ZpbmlzaDIpOwogCQlpZiAodW5saWtlbHkoZXJyICE9IDEpKQogCQkJYnJlYWs7CiAJfQpAQCAtMTI3LDYgKzEyMyw0OCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgeGZybTRfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpzZWdzOworCisjaWZkZWYgQ09ORklHX05FVEZJTFRFUgorCWlmICghc2tiLT5kc3QtPnhmcm0pIHsKKwkJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9SRVJPVVRFRDsKKwkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKKwl9CisjZW5kaWYKKworCWlmICghc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZSkKKwkJcmV0dXJuIHhmcm00X291dHB1dF9maW5pc2gyKHNrYik7CisKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOworCXNlZ3MgPSBza2JfZ3NvX3NlZ21lbnQoc2tiLCAwKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHNlZ3MpKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2Vncyk7CisKKwlkbyB7CisJCXN0cnVjdCBza19idWZmICpuc2tiID0gc2Vncy0+bmV4dDsKKwkJaW50IGVycjsKKworCQlzZWdzLT5uZXh0ID0gTlVMTDsKKwkJZXJyID0geGZybTRfb3V0cHV0X2ZpbmlzaDIoc2Vncyk7CisKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCXdoaWxlICgoc2VncyA9IG5za2IpKSB7CisJCQkJbnNrYiA9IHNlZ3MtPm5leHQ7CisJCQkJc2Vncy0+bmV4dCA9IE5VTEw7CisJCQkJa2ZyZWVfc2tiKHNlZ3MpOworCQkJfQorCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXNlZ3MgPSBuc2tiOworCX0gd2hpbGUgKHNlZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIGludCB4ZnJtNF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gTkZfSE9PS19DT05EKFBGX0lORVQsIE5GX0lQX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBza2ItPmRzdC0+ZGV2LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWRkcmNvbmYuYyBiL25ldC9pcHY2L2FkZHJjb25mLmMKaW5kZXggYzJjMjZmYS4uNGRhNjY0NSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmYuYworKysgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCkBAIC04NjIsNiArODYyLDggQEAKICAgKiAJMjAwMjo6LzE2CQkyCiAgICogCTo6Lzk2CQkJMwogICAqIAk6OmZmZmY6MDowLzk2CQk0CisgICoJZmMwMDo6LzcJCTUKKyAgKiAJMjAwMTo6LzMyCQk2CiAgICovCiAJaWYgKHR5cGUgJiBJUFY2X0FERFJfTE9PUEJBQ0spCiAJCXJldHVybiAwOwpAQCAtODY5LDggKzg3MSwxMiBAQAogCQlyZXR1cm4gMzsKIAllbHNlIGlmICh0eXBlICYgSVBWNl9BRERSX01BUFBFRCkKIAkJcmV0dXJuIDQ7CisJZWxzZSBpZiAoYWRkci0+czZfYWRkcjMyWzBdID09IGh0b25sKDB4MjAwMTAwMDApKQorCQlyZXR1cm4gNjsKIAllbHNlIGlmIChhZGRyLT5zNl9hZGRyMTZbMF0gPT0gaHRvbnMoMHgyMDAyKSkKIAkJcmV0dXJuIDI7CisJZWxzZSBpZiAoKGFkZHItPnM2X2FkZHJbMF0gJiAweGZlKSA9PSAweGZjKQorCQlyZXR1cm4gNTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTA2OSw2ICsxMDc1LDkgQEAKIAkJCQlpZiAoaGlzY29yZS5hdHRycyAmIElQVjZfU0FERFJfU0NPUkVfUFJJVkFDWSkKIAkJCQkJY29udGludWU7CiAJCQl9CisjZWxzZQorCQkJaWYgKGhpc2NvcmUucnVsZSA8IDcpCisJCQkJaGlzY29yZS5ydWxlKys7CiAjZW5kaWYKIAkJCS8qIFJ1bGUgODogVXNlIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4ICovCiAJCQlpZiAoaGlzY29yZS5ydWxlIDwgOCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IGQyOTYyMGYuLmFiYjk0ZGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCiBpbnQgaXA2X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICgoc2tiLT5sZW4gPiBkc3RfbXR1KHNrYi0+ZHN0KSAmJiAhc2tiX3NoaW5mbyhza2IpLT51Zm9fc2l6ZSkgfHwKKwlpZiAoKHNrYi0+bGVuID4gZHN0X210dShza2ItPmRzdCkgJiYgIXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpIHx8CiAJCQkJZHN0X2FsbGZyYWcoc2tiLT5kc3QpKQogCQlyZXR1cm4gaXA2X2ZyYWdtZW50KHNrYiwgaXA2X291dHB1dDIpOwogCWVsc2UKQEAgLTgzMyw4ICs4MzMsOSBAQAogCQlzdHJ1Y3QgZnJhZ19oZHIgZmhkcjsKIAogCQkvKiBzcGVjaWZ5IHRoZSBsZW5ndGggb2YgZWFjaCBJUCBkYXRhZ3JhbSBmcmFnbWVudCovCi0JCXNrYl9zaGluZm8oc2tiKS0+dWZvX3NpemUgPSAobXR1IC0gZnJhZ2hlYWRlcmxlbikgLSAKLQkJCQkJCXNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpOworCQlza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplID0gbXR1IC0gZnJhZ2hlYWRlcmxlbiAtIAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcik7CisJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSBTS0JfR1NPX1VEUFY0OwogCQlpcHY2X3NlbGVjdF9pZGVudChza2IsICZmaGRyKTsKIAkJc2tiX3NoaW5mbyhza2IpLT5pcDZfZnJhZ19pZCA9IGZoZHIuaWRlbnRpZmljYXRpb247CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X291dHB1dC5jIGIvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKaW5kZXggMTZlODQyNS4uNDhmY2NiMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMKQEAgLTk0LDcgKzk0LDcgQEAKIAlnb3RvIG91dF9leGl0OwogfQogCi1zdGF0aWMgaW50IHhmcm02X291dHB1dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgeGZybTZfb3V0cHV0X2ZpbmlzaDIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgZXJyOwogCkBAIC0xMTAsNyArMTEwLDcgQEAKIAkJCXJldHVybiBkc3Rfb3V0cHV0KHNrYik7CiAKIAkJZXJyID0gbmZfaG9vayhQRl9JTkVUNiwgTkZfSVA2X1BPU1RfUk9VVElORywgJnNrYiwgTlVMTCwKLQkJCSAgICAgIHNrYi0+ZHN0LT5kZXYsIHhmcm02X291dHB1dF9maW5pc2gpOworCQkJICAgICAgc2tiLT5kc3QtPmRldiwgeGZybTZfb3V0cHV0X2ZpbmlzaDIpOwogCQlpZiAodW5saWtlbHkoZXJyICE9IDEpKQogCQkJYnJlYWs7CiAJfQpAQCAtMTE4LDYgKzExOCw0MSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgeGZybTZfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBza19idWZmICpzZWdzOworCisJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKQorCQlyZXR1cm4geGZybTZfb3V0cHV0X2ZpbmlzaDIoc2tiKTsKKworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJc2VncyA9IHNrYl9nc29fc2VnbWVudChza2IsIDApOworCWtmcmVlX3NrYihza2IpOworCWlmICh1bmxpa2VseShJU19FUlIoc2VncykpKQorCQlyZXR1cm4gUFRSX0VSUihzZWdzKTsKKworCWRvIHsKKwkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBzZWdzLT5uZXh0OworCQlpbnQgZXJyOworCisJCXNlZ3MtPm5leHQgPSBOVUxMOworCQllcnIgPSB4ZnJtNl9vdXRwdXRfZmluaXNoMihzZWdzKTsKKworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJd2hpbGUgKChzZWdzID0gbnNrYikpIHsKKwkJCQluc2tiID0gc2Vncy0+bmV4dDsKKwkJCQlzZWdzLT5uZXh0ID0gTlVMTDsKKwkJCQlrZnJlZV9za2Ioc2Vncyk7CisJCQl9CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJc2VncyA9IG5za2I7CisJfSB3aGlsZSAoc2Vncyk7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXJldHVybiBORl9IT09LKFBGX0lORVQ2LCBORl9JUDZfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIHNrYi0+ZHN0LT5kZXYsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCmluZGV4IGQ3YWNhOGUuLjc0ZDRhMWQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ2VuZXJpYy5jCkBAIC05Niw4ICs5NiwxMSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAkvKiBEZXF1ZXVlIHBhY2tldCAqLwotCWlmICgoc2tiID0gcS0+ZGVxdWV1ZShxKSkgIT0gTlVMTCkgeworCWlmICgoKHNrYiA9IGRldi0+Z3NvX3NrYikpIHx8ICgoc2tiID0gcS0+ZGVxdWV1ZShxKSkpKSB7CiAJCXVuc2lnbmVkIG5vbG9jayA9IChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MTFRYKTsKKworCQlkZXYtPmdzb19za2IgPSBOVUxMOworCiAJCS8qCiAJCSAqIFdoZW4gdGhlIGRyaXZlciBoYXMgTExUWCBzZXQgaXQgZG9lcyBpdHMgb3duIGxvY2tpbmcKIAkJICogaW4gc3RhcnRfeG1pdC4gTm8gbmVlZCB0byBhZGQgYWRkaXRpb25hbCBvdmVyaGVhZCBieQpAQCAtMTM0LDEwICsxMzcsOCBAQAogCiAJCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkgewogCQkJCWludCByZXQ7Ci0JCQkJaWYgKG5ldGRldl9uaXQpCi0JCQkJCWRldl9xdWV1ZV94bWl0X25pdChza2IsIGRldik7CiAKLQkJCQlyZXQgPSBkZXYtPmhhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisJCQkJcmV0ID0gZGV2X2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CiAJCQkJaWYgKHJldCA9PSBORVRERVZfVFhfT0spIHsgCiAJCQkJCWlmICghbm9sb2NrKSB7CiAJCQkJCQluZXRpZl90eF91bmxvY2soZGV2KTsKQEAgLTE3MSw3ICsxNzIsMTAgQEAKIAkJICovCiAKIHJlcXVldWU6Ci0JCXEtPm9wcy0+cmVxdWV1ZShza2IsIHEpOworCQlpZiAoc2tiLT5uZXh0KQorCQkJZGV2LT5nc29fc2tiID0gc2tiOworCQllbHNlCisJCQlxLT5vcHMtPnJlcXVldWUoc2tiLCBxKTsKIAkJbmV0aWZfc2NoZWR1bGUoZGV2KTsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTgxLDkgKzE4NSwxMyBAQAogCiB2b2lkIF9fcWRpc2NfcnVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJaWYgKHVubGlrZWx5KGRldi0+cWRpc2MgPT0gJm5vb3BfcWRpc2MpKQorCQlnb3RvIG91dDsKKwogCXdoaWxlIChxZGlzY19yZXN0YXJ0KGRldikgPCAwICYmICFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCiAJCS8qIE5PVEhJTkcgKi87CiAKK291dDoKIAljbGVhcl9iaXQoX19MSU5LX1NUQVRFX1FESVNDX1JVTk5JTkcsICZkZXYtPnN0YXRlKTsKIH0KIApAQCAtNTgzLDEwICs1OTEsMTcgQEAKIAogCWRldl93YXRjaGRvZ19kb3duKGRldik7CiAKLQl3aGlsZSAodGVzdF9iaXQoX19MSU5LX1NUQVRFX1NDSEVELCAmZGV2LT5zdGF0ZSkpCisJLyogV2FpdCBmb3Igb3V0c3RhbmRpbmcgZGV2X3F1ZXVlX3htaXQgY2FsbHMuICovCisJc3luY2hyb25pemVfcmN1KCk7CisKKwkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBxZGlzY19ydW4gY2FsbHMuICovCisJd2hpbGUgKHRlc3RfYml0KF9fTElOS19TVEFURV9RRElTQ19SVU5OSU5HLCAmZGV2LT5zdGF0ZSkpCiAJCXlpZWxkKCk7CiAKLQlzcGluX3VubG9ja193YWl0KCZkZXYtPl94bWl0X2xvY2spOworCWlmIChkZXYtPmdzb19za2IpIHsKKwkJa2ZyZWVfc2tiKGRldi0+Z3NvX3NrYik7CisJCWRldi0+Z3NvX3NrYiA9IE5VTEw7CisJfQogfQogCiB2b2lkIGRldl9pbml0X3NjaGVkdWxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvbmV0L3NvY2tldC5jIGIvbmV0L3NvY2tldC5jCmluZGV4IDAyOTQ4YjYuLjU2NWY1ZTggMTAwNjQ0Ci0tLSBhL25ldC9zb2NrZXQuYworKysgYi9uZXQvc29ja2V0LmMKQEAgLTMzNSwxMCArMzM1LDExIEBACiAJLnN0YXRmcyA9CXNpbXBsZV9zdGF0ZnMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpzb2NrZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHNvY2tmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9wc2V1ZG8oZnNfdHlwZSwgInNvY2tldDoiLCAmc29ja2ZzX29wcywgU09DS0ZTX01BR0lDKTsKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAic29ja2V0OiIsICZzb2NrZnNfb3BzLCBTT0NLRlNfTUFHSUMsCisJCQkgICAgIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnNvY2tfbW50IF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2F1dGhfbnVsbC5jIGIvbmV0L3N1bnJwYy9hdXRoX251bGwuYwppbmRleCBmNTY3NjdhLi4yZWNjZmZhIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2F1dGhfbnVsbC5jCisrKyBiL25ldC9zdW5ycGMvYXV0aF9udWxsLmMKQEAgLTExOCw2ICsxMTgsOCBAQAogCS5hdV9jc2xhY2sJPSA0LAogCS5hdV9yc2xhY2sJPSAyLAogCS5hdV9vcHMJCT0gJmF1dGhudWxsX29wcywKKwkuYXVfZmxhdm9yCT0gUlBDX0FVVEhfTlVMTCwKKwkuYXVfY291bnQJPSBBVE9NSUNfSU5JVCgwKSwKIH07CiAKIHN0YXRpYwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hdXRoX3VuaXguYyBiL25ldC9zdW5ycGMvYXV0aF91bml4LmMKaW5kZXggZGYxNGI2Yi4uNzRjNzQwNiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9hdXRoX3VuaXguYworKysgYi9uZXQvc3VucnBjL2F1dGhfdW5peC5jCkBAIC0yMjUsNiArMjI1LDcgQEAKIAkuYXVfY3NsYWNrCT0gVU5YX1dSSVRFU0xBQ0ssCiAJLmF1X3JzbGFjawk9IDIsCQkJLyogYXNzdW1lIEFVVEhfTlVMTCB2ZXJmICovCiAJLmF1X29wcwkJPSAmYXV0aHVuaXhfb3BzLAorCS5hdV9mbGF2b3IJPSBSUENfQVVUSF9VTklYLAogCS5hdV9jb3VudAk9IEFUT01JQ19JTklUKDApLAogCS5hdV9jcmVkY2FjaGUJPSAmdW5peF9jcmVkX2NhY2hlLAogfTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvcnBjX3BpcGUuYyBiL25ldC9zdW5ycGMvcnBjX3BpcGUuYwppbmRleCBjYzY3M2RkLi5kYWZlNzkzIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3JwY19waXBlLmMKKysrIGIvbmV0L3N1bnJwYy9ycGNfcGlwZS5jCkBAIC00MzksNyArNDM5LDcgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gc2ltcGxlX3Bpbl9mcygicnBjX3BpcGVmcyIsICZycGNfbW91bnQsICZycGNfbW91bnRfY291bnQpOworCWVyciA9IHNpbXBsZV9waW5fZnMoJnJwY19waXBlX2ZzX3R5cGUsICZycGNfbW91bnQsICZycGNfbW91bnRfY291bnQpOwogCWlmIChlcnIgIT0gMCkKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAlyZXR1cm4gcnBjX21vdW50OwpAQCAtODE1LDExICs4MTUsMTEgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqCitzdGF0aWMgaW50CiBycGNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAotCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgcnBjX2ZpbGxfc3VwZXIpOworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBycGNfZmlsbF9zdXBlciwgbW50KTsKIH0KIAogc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHJwY19waXBlX2ZzX3R5cGUgPSB7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3hkci5jIGIvbmV0L3N1bnJwYy94ZHIuYwppbmRleCBjYTRiZmE1Li40OTE3NGYwIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hkci5jCisrKyBiL25ldC9zdW5ycGMveGRyLmMKQEAgLTU2OCw4ICs1NjgsNyBAQAogICoKICAqIE1vdmVzIGRhdGEgYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24gZnJvbSB0aGUgWERSIGhlYWRbXSBidWZmZXIKICAqIGludG8gdGhlIHBhZ2UgbGlzdC4gQW55IGRhdGEgdGhhdCBsaWVzIGJleW9uZCBjdXJyZW50IHBvc2l0aW9uICsgImxlbiIKLSAqIGJ5dGVzIGlzIG1vdmVkIGludG8gdGhlIFhEUiB0YWlsW10uIFRoZSBjdXJyZW50IHBvaW50ZXIgaXMgdGhlbgotICogcmVwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFhEUiB0YWlsLgorICogYnl0ZXMgaXMgbW92ZWQgaW50byB0aGUgWERSIHRhaWxbXS4KICAqLwogdm9pZCB4ZHJfcmVhZF9wYWdlcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtNjA2LDYgKzYwNSwzMSBAQAogfQogRVhQT1JUX1NZTUJPTCh4ZHJfcmVhZF9wYWdlcyk7CiAKKy8qKgorICogeGRyX2VudGVyX3BhZ2UgLSBkZWNvZGUgZGF0YSBmcm9tIHRoZSBYRFIgcGFnZQorICogQHhkcjogcG9pbnRlciB0byB4ZHJfc3RyZWFtIHN0cnVjdAorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIG9mIHBhZ2UgZGF0YQorICoKKyAqIE1vdmVzIGRhdGEgYmV5b25kIHRoZSBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24gZnJvbSB0aGUgWERSIGhlYWRbXSBidWZmZXIKKyAqIGludG8gdGhlIHBhZ2UgbGlzdC4gQW55IGRhdGEgdGhhdCBsaWVzIGJleW9uZCBjdXJyZW50IHBvc2l0aW9uICsgImxlbiIKKyAqIGJ5dGVzIGlzIG1vdmVkIGludG8gdGhlIFhEUiB0YWlsW10uIFRoZSBjdXJyZW50IHBvaW50ZXIgaXMgdGhlbgorICogcmVwb3NpdGlvbmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpcnN0IFhEUiBwYWdlLgorICovCit2b2lkIHhkcl9lbnRlcl9wYWdlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY2hhciAqIGthZGRyID0gcGFnZV9hZGRyZXNzKHhkci0+YnVmLT5wYWdlc1swXSk7CisJeGRyX3JlYWRfcGFnZXMoeGRyLCBsZW4pOworCS8qCisJICogUG9zaXRpb24gY3VycmVudCBwb2ludGVyIGF0IGJlZ2lubmluZyBvZiB0YWlsLCBhbmQKKwkgKiBzZXQgcmVtYWluaW5nIG1lc3NhZ2UgbGVuZ3RoLgorCSAqLworCWlmIChsZW4gPiBQQUdFX0NBQ0hFX1NJWkUgLSB4ZHItPmJ1Zi0+cGFnZV9iYXNlKQorCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSB4ZHItPmJ1Zi0+cGFnZV9iYXNlOworCXhkci0+cCA9ICh1aW50MzJfdCAqKShrYWRkciArIHhkci0+YnVmLT5wYWdlX2Jhc2UpOworCXhkci0+ZW5kID0gKHVpbnQzMl90ICopKChjaGFyICopeGRyLT5wICsgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0woeGRyX2VudGVyX3BhZ2UpOworCiBzdGF0aWMgc3RydWN0IGt2ZWMgZW1wdHlfaW92ID0gey5pb3ZfYmFzZSA9IE5VTEwsIC5pb3ZfbGVuID0gMH07CiAKIHZvaWQKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydC5jIGIvbmV0L3N1bnJwYy94cHJ0LmMKaW5kZXggNGRkNWIzYy4uMDIwNjBkMCAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTQxLDcgKzQxLDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogCiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvbWV0cmljcy5oPgpAQCAtODMwLDcgKzgzMCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB4cHJ0X2luaXRfeGlkKHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKLQlnZXRfcmFuZG9tX2J5dGVzKCZ4cHJ0LT54aWQsIHNpemVvZih4cHJ0LT54aWQpKTsKKwl4cHJ0LT54aWQgPSBuZXRfcmFuZG9tKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHhwcnRfcmVxdWVzdF9pbml0KHN0cnVjdCBycGNfdGFzayAqdGFzaywgc3RydWN0IHJwY194cHJ0ICp4cHJ0KQpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0c29jay5jIGIvbmV0L3N1bnJwYy94cHJ0c29jay5jCmluZGV4IDRiNGU3ZGYuLjIxMDA2YjEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMveHBydHNvY2suYworKysgYi9uZXQvc3VucnBjL3hwcnRzb2NrLmMKQEAgLTkzMCw2ICs5MzAsMTMgQEAKIAl4cHJ0X2FkanVzdF9jd25kKHRhc2ssIC1FVElNRURPVVQpOwogfQogCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeHNfZ2V0X3JhbmRvbV9wb3J0KHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgcmFuZ2UgPSB4cHJ0X21heF9yZXN2cG9ydCAtIHhwcnRfbWluX3Jlc3Zwb3J0OworCXVuc2lnbmVkIHNob3J0IHJhbmQgPSAodW5zaWduZWQgc2hvcnQpIG5ldF9yYW5kb20oKSAlIHJhbmdlOworCXJldHVybiByYW5kICsgeHBydF9taW5fcmVzdnBvcnQ7Cit9CisKIC8qKgogICogeHNfc2V0X3BvcnQgLSByZXNldCB0aGUgcG9ydCBudW1iZXIgaW4gdGhlIHJlbW90ZSBlbmRwb2ludCBhZGRyZXNzCiAgKiBAeHBydDogZ2VuZXJpYyB0cmFuc3BvcnQKQEAgLTEyNzUsNyArMTI4Miw3IEBACiAJbWVtc2V0KHhwcnQtPnNsb3QsIDAsIHNsb3RfdGFibGVfc2l6ZSk7CiAKIAl4cHJ0LT5wcm90ID0gSVBQUk9UT19VRFA7Ci0JeHBydC0+cG9ydCA9IHhwcnRfbWF4X3Jlc3Zwb3J0OworCXhwcnQtPnBvcnQgPSB4c19nZXRfcmFuZG9tX3BvcnQoKTsKIAl4cHJ0LT50c2hfc2l6ZSA9IDA7CiAJeHBydC0+cmVzdnBvcnQgPSBjYXBhYmxlKENBUF9ORVRfQklORF9TRVJWSUNFKSA/IDEgOiAwOwogCS8qIFhYWDogaGVhZGVyIHNpemUgY2FuIHZhcnkgZHVlIHRvIGF1dGggdHlwZSwgSVB2NiwgZXRjLiAqLwpAQCAtMTMxNyw3ICsxMzI0LDcgQEAKIAltZW1zZXQoeHBydC0+c2xvdCwgMCwgc2xvdF90YWJsZV9zaXplKTsKIAogCXhwcnQtPnByb3QgPSBJUFBST1RPX1RDUDsKLQl4cHJ0LT5wb3J0ID0geHBydF9tYXhfcmVzdnBvcnQ7CisJeHBydC0+cG9ydCA9IHhzX2dldF9yYW5kb21fcG9ydCgpOwogCXhwcnQtPnRzaF9zaXplID0gc2l6ZW9mKHJwY19mcmFnaGRyKSAvIHNpemVvZih1MzIpOwogCXhwcnQtPnJlc3Zwb3J0ID0gY2FwYWJsZShDQVBfTkVUX0JJTkRfU0VSVklDRSkgPyAxIDogMDsKIAl4cHJ0LT5tYXhfcGF5bG9hZCA9IFJQQ19NQVhfRlJBR01FTlRfU0laRTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmxvYXQtby1tZXRlciBiL3NjcmlwdHMvYmxvYXQtby1tZXRlcgppbmRleCA3NWYyMWQ4Li5jZTU5ZmMyIDEwMDc1NQotLS0gYS9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIKKysrIGIvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCkBAIC0xOCw3ICsxOCw4IEBACiAgICAgZm9yIGwgaW4gb3MucG9wZW4oIm5tIC0tc2l6ZS1zb3J0ICIgKyBmaWxlKS5yZWFkbGluZXMoKToKICAgICAgICAgc2l6ZSwgdHlwZSwgbmFtZSA9IGxbOi0xXS5zcGxpdCgpCiAgICAgICAgIGlmIHR5cGUgaW4gInRUZERiQiI6Ci0gICAgICAgICAgICBzeW1bbmFtZV0gPSBpbnQoc2l6ZSwgMTYpCisgICAgICAgICAgICBpZiAiLiIgaW4gbmFtZTogbmFtZSA9ICJzdGF0aWMuIiArIG5hbWUuc3BsaXQoIi4iKVswXQorICAgICAgICAgICAgc3ltW25hbWVdID0gc3ltLmdldChuYW1lLCAwKSArIGludChzaXplLCAxNikKICAgICByZXR1cm4gc3ltCiAKIG9sZCA9IGdldHNpemVzKHN5cy5hcmd2WzFdKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3N0YWNrLnBsIGIvc2NyaXB0cy9jaGVja3N0YWNrLnBsCmluZGV4IGRhZGZhMjAuLmIzNDkyNDYgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvY2hlY2tzdGFjay5wbAorKysgYi9zY3JpcHRzL2NoZWNrc3RhY2sucGwKQEAgLTg5LDExICs4OSwyMSBAQAogIwogbXkgJGZ1bmNyZSA9IHFyL14keCogPCguKik+OiQvOwogbXkgJGZ1bmM7CitteSAkZmlsZSwgJGxhc3RzbGFzaDsKKwogd2hpbGUgKG15ICRsaW5lID0gPFNURElOPikgewogCWlmICgkbGluZSA9fiBtLyRmdW5jcmUvKSB7CiAJCSRmdW5jID0gJDE7CiAJfQotCWlmICgkbGluZSA9fiBtLyRyZS8pIHsKKwllbHNpZiAoJGxpbmUgPX4gbS8oLiopOlxzKmZpbGUgZm9ybWF0LykgeworCQkkZmlsZSA9ICQxOworCQkkZmlsZSA9fiBzL1wua28vLzsKKwkJJGxhc3RzbGFzaCA9IHJpbmRleCgkZmlsZSwgIi8iKTsKKwkJaWYgKCRsYXN0c2xhc2ggIT0gLTEpIHsKKwkJCSRmaWxlID0gc3Vic3RyKCRmaWxlLCAkbGFzdHNsYXNoICsgMSk7CisJCX0KKwl9CisJZWxzaWYgKCRsaW5lID1+IG0vJHJlLykgewogCQlteSAkc2l6ZSA9ICQxOwogCQkkc2l6ZSA9IGhleCgkc2l6ZSkgaWYgKCRzaXplID1+IC9eMHgvKTsKIApAQCAtMTA5LDcgKzExOSw3IEBACiAJCSRhZGRyID1+IHMvIC8wL2c7CiAJCSRhZGRyID0gIjB4JGFkZHIiOwogCi0JCW15ICRpbnRybyA9ICIkYWRkciAkZnVuYzoiOworCQlteSAkaW50cm8gPSAiJGFkZHIgJGZ1bmMgWyRmaWxlXToiOwogCQlteSAkcGFkbGVuID0gNTYgLSBsZW5ndGgoJGludHJvKTsKIAkJd2hpbGUgKCRwYWRsZW4gPiAwKSB7CiAJCQkkaW50cm8gLj0gJwknOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCmluZGV4IDk5ZmU0YjcuLjAwZTIxMjkgMTAwNzU1Ci0tLSBhL3NjcmlwdHMva2VybmVsLWRvYworKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTI1Myw2ICsyNTMsNyBAQAogIyAzIC0gc2Nhbm5pbmcgcHJvdG90eXBlLgogIyA0IC0gZG9jdW1lbnRhdGlvbiBibG9jawogbXkgJHN0YXRlOworbXkgJGluX2RvY19zZWN0OwogCiAjZGVjbGFyYXRpb24gdHlwZXM6IGNhbiBiZQogIyAnZnVuY3Rpb24nLCAnc3RydWN0JywgJ3VuaW9uJywgJ2VudW0nLCAndHlwZWRlZicKQEAgLTEwNjQsNyArMTA2NSw3IEBACiAgICAgfQogICAgIHByaW50ICJ9O1xuLmJyXG4iOwogCi0gICAgcHJpbnQgIi5TSCBBcmd1bWVudHNcbiI7CisgICAgcHJpbnQgIi5TSCBNZW1iZXJzXG4iOwogICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgewogCSgkcGFyYW1ldGVyID1+IC9eIy8pICYmIG5leHQ7CiAKQEAgLTE2NzMsNiArMTY3NCw5IEBACiAjIHJlcGxhY2UgPCwgPiwgYW5kICYKIHN1YiB4bWxfZXNjYXBlKCQpIHsKIAlteSAkdGV4dCA9IHNoaWZ0OworCWlmICgoJG91dHB1dF9tb2RlIGVxICJ0ZXh0IikgfHwgKCRvdXRwdXRfbW9kZSBlcSAibWFuIikpIHsKKwkJcmV0dXJuICR0ZXh0OworCX0KIAkkdGV4dCA9fiBzL1wmL1xcXFxcXGFtcDsvZzsKIAkkdGV4dCA9fiBzL1w8L1xcXFxcXGx0Oy9nOwogCSR0ZXh0ID1+IHMvXD4vXFxcXFxcZ3Q7L2c7CkBAIC0xNzA2LDYgKzE3MTAsNyBAQAogCWlmICgkc3RhdGUgPT0gMCkgewogCSAgICBpZiAoLyRkb2Nfc3RhcnQvbykgewogCQkkc3RhdGUgPSAxOwkJIyBuZXh0IGxpbmUgaXMgYWx3YXlzIHRoZSBmdW5jdGlvbiBuYW1lCisJCSRpbl9kb2Nfc2VjdCA9IDA7CiAJICAgIH0KIAl9IGVsc2lmICgkc3RhdGUgPT0gMSkgewkjIHRoaXMgbGluZSBpcyB0aGUgZnVuY3Rpb24gbmFtZSAoYWx3YXlzKQogCSAgICBpZiAoLyRkb2NfYmxvY2svbykgewpAQCAtMTc1NiwxMiArMTc2MSwyMCBAQAogCQkkbmV3Y29udGVudHMgPSAkMjsKIAogCQlpZiAoJGNvbnRlbnRzIG5lICIiKSB7CisJCSAgICBpZiAoISRpbl9kb2Nfc2VjdCAmJiAkdmVyYm9zZSkgeworCQkJcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBjb250ZW50cyBiZWZvcmUgc2VjdGlvbnNcbiI7CisJCQkrKyR3YXJuaW5nczsKKwkJICAgIH0KIAkJICAgIGR1bXBfc2VjdGlvbigkc2VjdGlvbiwgeG1sX2VzY2FwZSgkY29udGVudHMpKTsKIAkJICAgICRzZWN0aW9uID0gJHNlY3Rpb25fZGVmYXVsdDsKIAkJfQogCisJCSRpbl9kb2Nfc2VjdCA9IDE7CiAJCSRjb250ZW50cyA9ICRuZXdjb250ZW50czsKIAkJaWYgKCRjb250ZW50cyBuZSAiIikgeworCQkgICAgaWYgKHN1YnN0cigkY29udGVudHMsIDAsIDEpIGVxICIgIikgeworCQkJJGNvbnRlbnRzID0gc3Vic3RyKCRjb250ZW50cywgMSk7CisJCSAgICB9CiAJCSAgICAkY29udGVudHMgLj0gIlxuIjsKIAkJfQogCQkkc2VjdGlvbiA9ICRuZXdzZWN0aW9uOwpAQCAtMTc3Niw3ICsxNzg5LDcgQEAKIAkJJHByb3RvdHlwZSA9ICIiOwogCQkkc3RhdGUgPSAzOwogCQkkYnJjb3VudCA9IDA7Ci0jCSAgICBwcmludCBTVERFUlIgImVuZCBvZiBkb2MgY29tbWVudCwgbG9va2luZyBmb3IgcHJvdG90eXBlXG4iOworIwkJcHJpbnQgU1RERVJSICJlbmQgb2YgZG9jIGNvbW1lbnQsIGxvb2tpbmcgZm9yIHByb3RvdHlwZVxuIjsKIAkgICAgfSBlbHNpZiAoLyRkb2NfY29udGVudC8pIHsKIAkJIyBtaWd1ZWwtc3R5bGUgY29tbWVudCBrbHVkZ2UsIGxvb2sgZm9yIGJsYW5rIGxpbmVzIGFmdGVyCiAJCSMgQHBhcmFtZXRlciBsaW5lIHRvIHNpZ25pZnkgc3RhcnQgb2YgZGVzY3JpcHRpb24KQEAgLTE3OTMsNyArMTgwNiw3IEBACiAJCXByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKTogYmFkIGxpbmU6ICRfIjsKIAkJKyskd2FybmluZ3M7CiAJICAgIH0KLQl9IGVsc2lmICgkc3RhdGUgPT0gMykgewkjIHNjYW5uaW5nIGZvciBmdW5jdGlvbiB7IChlbmQgb2YgcHJvdG90eXBlKQorCX0gZWxzaWYgKCRzdGF0ZSA9PSAzKSB7CSMgc2Nhbm5pbmcgZm9yIGZ1bmN0aW9uICd7JyAoZW5kIG9mIHByb3RvdHlwZSkKIAkgICAgaWYgKCRkZWNsX3R5cGUgZXEgJ2Z1bmN0aW9uJykgewogCSAgICAgICAgcHJvY2Vzc19zdGF0ZTNfZnVuY3Rpb24oJF8sICRmaWxlKTsKIAkgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2R1bW15LmMgYi9zZWN1cml0eS9kdW1teS5jCmluZGV4IDY0ZjZkYTAuLmMzYzU0OTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2R1bW15LmMKKysrIGIvc2VjdXJpdHkvZHVtbXkuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHVtbXlfc2Jfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGludCBkdW1teV9zYl9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTUxNiw2ICs1MTYsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkdW1teV90YXNrX3NldGlvcHJpbyAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgaW9wcmlvKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGR1bW15X3Rhc2tfc2V0cmxpbWl0ICh1bnNpZ25lZCBpbnQgcmVzb3VyY2UsIHN0cnVjdCBybGltaXQgKm5ld19ybGltKQogewogCXJldHVybiAwOwpAQCAtNTMyLDYgKzUzNywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGR1bW15X3Rhc2tfbW92ZW1lbW9yeSAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGR1bW15X3Rhc2tfd2FpdCAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCXJldHVybiAwOwpAQCAtODYwLDcgKzg3MCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfS0VZUwotc3RhdGljIGlubGluZSBpbnQgZHVtbXlfa2V5X2FsbG9jKHN0cnVjdCBrZXkgKmtleSkKK3N0YXRpYyBpbmxpbmUgaW50IGR1bW15X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprZXksIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3R4KQogewogCXJldHVybiAwOwogfQpAQCAtOTcyLDkgKzk4MiwxMSBAQAogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgdGFza19nZXRzaWQpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgdGFza19zZXRncm91cHMpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgdGFza19zZXRuaWNlKTsKKwlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfc2V0aW9wcmlvKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfc2V0cmxpbWl0KTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfc2V0c2NoZWR1bGVyKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfZ2V0c2NoZWR1bGVyKTsKKwlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfbW92ZW1lbW9yeSk7CiAJc2V0X3RvX2R1bW15X2lmX251bGwob3BzLCB0YXNrX3dhaXQpOwogCXNldF90b19kdW1teV9pZl9udWxsKG9wcywgdGFza19raWxsKTsKIAlzZXRfdG9fZHVtbXlfaWZfbnVsbChvcHMsIHRhc2tfcHJjdGwpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvaW5vZGUuYyBiL3NlY3VyaXR5L2lub2RlLmMKaW5kZXggMGY3N2IwMi4uOThhMGRmNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvaW5vZGUuYworKysgYi9zZWN1cml0eS9pbm9kZS5jCkBAIC0xMzUsMTEgKzEzNSwxMSBAQAogCXJldHVybiBzaW1wbGVfZmlsbF9zdXBlcihzYiwgU0VDVVJJVFlGU19NQUdJQywgZmlsZXMpOwogfQogCi1zdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAotCQkJCQl2b2lkICpkYXRhKQorc3RhdGljIGludCBnZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCSAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJICB2b2lkICpkYXRhLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKIHsKLQlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgZmlsbF9zdXBlcik7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBmc190eXBlID0gewpAQCAtMjI0LDcgKzIyNCw3IEBACiAKIAlwcl9kZWJ1Zygic2VjdXJpdHlmczogY3JlYXRpbmcgZmlsZSAnJXMnXG4iLG5hbWUpOwogCi0JZXJyb3IgPSBzaW1wbGVfcGluX2ZzKCJzZWN1cml0eWZzIiwgJm1vdW50LCAmbW91bnRfY291bnQpOworCWVycm9yID0gc2ltcGxlX3Bpbl9mcygmZnNfdHlwZSwgJm1vdW50LCAmbW91bnRfY291bnQpOwogCWlmIChlcnJvcikgewogCQlkZW50cnkgPSBFUlJfUFRSKGVycm9yKTsKIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9rZXkuYyBiL3NlY3VyaXR5L2tleXMva2V5LmMKaW5kZXggM2ZkYzQ5Yy4uNTFmODUxNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkva2V5cy9rZXkuYworKysgYi9zZWN1cml0eS9rZXlzL2tleS5jCkBAIC0yNDcsOCArMjQ3LDggQEAKICAqICAgaW5zdGFudGlhdGUgdGhlIGtleSBvciBkaXNjYXJkIGl0IGJlZm9yZSByZXR1cm5pbmcKICAqLwogc3RydWN0IGtleSAqa2V5X2FsbG9jKHN0cnVjdCBrZXlfdHlwZSAqdHlwZSwgY29uc3QgY2hhciAqZGVzYywKLQkJICAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIGtleV9wZXJtX3QgcGVybSwKLQkJICAgICAgaW50IG5vdF9pbl9xdW90YSkKKwkJICAgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3R4LAorCQkgICAgICBrZXlfcGVybV90IHBlcm0sIGludCBub3RfaW5fcXVvdGEpCiB7CiAJc3RydWN0IGtleV91c2VyICp1c2VyID0gTlVMTDsKIAlzdHJ1Y3Qga2V5ICprZXk7CkBAIC0zMTgsNyArMzE4LDcgQEAKICNlbmRpZgogCiAJLyogbGV0IHRoZSBzZWN1cml0eSBtb2R1bGUga25vdyBhYm91dCB0aGUga2V5ICovCi0JcmV0ID0gc2VjdXJpdHlfa2V5X2FsbG9jKGtleSk7CisJcmV0ID0gc2VjdXJpdHlfa2V5X2FsbG9jKGtleSwgY3R4KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBzZWN1cml0eV9lcnJvcjsKIApAQCAtODIyLDcgKzgyMiw3IEBACiAKIAkvKiBhbGxvY2F0ZSBhIG5ldyBrZXkgKi8KIAlrZXkgPSBrZXlfYWxsb2Moa3R5cGUsIGRlc2NyaXB0aW9uLCBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsCi0JCQlwZXJtLCBub3RfaW5fcXVvdGEpOworCQkJY3VycmVudCwgcGVybSwgbm90X2luX3F1b3RhKTsKIAlpZiAoSVNfRVJSKGtleSkpIHsKIAkJa2V5X3JlZiA9IEVSUl9QVFIoUFRSX0VSUihrZXkpKTsKIAkJZ290byBlcnJvcl8zOwpAQCAtOTA3LDYgKzkwNywxMCBAQAogCSAqIGl0ICovCiAJZG93bl93cml0ZSgma2V5LT5zZW0pOwogCXNldF9iaXQoS0VZX0ZMQUdfUkVWT0tFRCwgJmtleS0+ZmxhZ3MpOworCisJaWYgKGtleS0+dHlwZS0+cmV2b2tlKQorCQlrZXktPnR5cGUtPnJldm9rZShrZXkpOworCiAJdXBfd3JpdGUoJmtleS0+c2VtKTsKIAogfSAvKiBlbmQga2V5X3Jldm9rZSgpICovCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleXJpbmcuYyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCmluZGV4IGJmZmE5MjQuLjEzNTcyMDcgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5cmluZy5jCkBAIC0yNDAsMTMgKzI0MCwxNCBAQAogICogYWxsb2NhdGUgYSBrZXlyaW5nIGFuZCBsaW5rIGludG8gdGhlIGRlc3RpbmF0aW9uIGtleXJpbmcKICAqLwogc3RydWN0IGtleSAqa2V5cmluZ19hbGxvYyhjb25zdCBjaGFyICpkZXNjcmlwdGlvbiwgdWlkX3QgdWlkLCBnaWRfdCBnaWQsCi0JCQkgIGludCBub3RfaW5fcXVvdGEsIHN0cnVjdCBrZXkgKmRlc3QpCisJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3R4LCBpbnQgbm90X2luX3F1b3RhLAorCQkJICBzdHJ1Y3Qga2V5ICpkZXN0KQogewogCXN0cnVjdCBrZXkgKmtleXJpbmc7CiAJaW50IHJldDsKIAogCWtleXJpbmcgPSBrZXlfYWxsb2MoJmtleV90eXBlX2tleXJpbmcsIGRlc2NyaXB0aW9uLAotCQkJICAgIHVpZCwgZ2lkLAorCQkJICAgIHVpZCwgZ2lkLCBjdHgsCiAJCQkgICAgKEtFWV9QT1NfQUxMICYgfktFWV9QT1NfU0VUQVRUUikgfCBLRVlfVVNSX0FMTCwKIAkJCSAgICBub3RfaW5fcXVvdGEpOwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jIGIvc2VjdXJpdHkva2V5cy9wcm9jZXNzX2tleXMuYwppbmRleCAyMTdhMGJlLi40ZDk4MjVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3Byb2Nlc3Nfa2V5cy5jCisrKyBiL3NlY3VyaXR5L2tleXMvcHJvY2Vzc19rZXlzLmMKQEAgLTY3LDcgKzY3LDggQEAKIC8qCiAgKiBhbGxvY2F0ZSB0aGUga2V5cmluZ3MgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGEgVUlECiAgKi8KLWludCBhbGxvY191aWRfa2V5cmluZyhzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXIpCitpbnQgYWxsb2NfdWlkX2tleXJpbmcoc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyLAorCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN0eCkKIHsKIAlzdHJ1Y3Qga2V5ICp1aWRfa2V5cmluZywgKnNlc3Npb25fa2V5cmluZzsKIAljaGFyIGJ1ZlsyMF07CkBAIC03Niw3ICs3Nyw3IEBACiAJLyogY29uY29jdCBhIGRlZmF1bHQgc2Vzc2lvbiBrZXlyaW5nICovCiAJc3ByaW50ZihidWYsICJfdWlkX3Nlcy4ldSIsIHVzZXItPnVpZCk7CiAKLQlzZXNzaW9uX2tleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdXNlci0+dWlkLCAoZ2lkX3QpIC0xLCAwLCBOVUxMKTsKKwlzZXNzaW9uX2tleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdXNlci0+dWlkLCAoZ2lkX3QpIC0xLCBjdHgsIDAsIE5VTEwpOwogCWlmIChJU19FUlIoc2Vzc2lvbl9rZXlyaW5nKSkgewogCQlyZXQgPSBQVFJfRVJSKHNlc3Npb25fa2V5cmluZyk7CiAJCWdvdG8gZXJyb3I7CkBAIC04Niw3ICs4Nyw3IEBACiAJICoga2V5cmluZyAqLwogCXNwcmludGYoYnVmLCAiX3VpZC4ldSIsIHVzZXItPnVpZCk7CiAKLQl1aWRfa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB1c2VyLT51aWQsIChnaWRfdCkgLTEsIDAsCisJdWlkX2tleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdXNlci0+dWlkLCAoZ2lkX3QpIC0xLCBjdHgsIDAsCiAJCQkJICAgIHNlc3Npb25fa2V5cmluZyk7CiAJaWYgKElTX0VSUih1aWRfa2V5cmluZykpIHsKIAkJa2V5X3B1dChzZXNzaW9uX2tleXJpbmcpOwpAQCAtMTQzLDcgKzE0NCw3IEBACiAKIAlzcHJpbnRmKGJ1ZiwgIl90aWQuJXUiLCB0c2stPnBpZCk7CiAKLQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhidWYsIHRzay0+dWlkLCB0c2stPmdpZCwgMSwgTlVMTCk7CisJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB0c2stPnVpZCwgdHNrLT5naWQsIHRzaywgMSwgTlVMTCk7CiAJaWYgKElTX0VSUihrZXlyaW5nKSkgewogCQlyZXQgPSBQVFJfRVJSKGtleXJpbmcpOwogCQlnb3RvIGVycm9yOwpAQCAtMTc3LDcgKzE3OCw3IEBACiAJaWYgKCF0c2stPnNpZ25hbC0+cHJvY2Vzc19rZXlyaW5nKSB7CiAJCXNwcmludGYoYnVmLCAiX3BpZC4ldSIsIHRzay0+dGdpZCk7CiAKLQkJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoYnVmLCB0c2stPnVpZCwgdHNrLT5naWQsIDEsIE5VTEwpOworCQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhidWYsIHRzay0+dWlkLCB0c2stPmdpZCwgdHNrLCAxLCBOVUxMKTsKIAkJaWYgKElTX0VSUihrZXlyaW5nKSkgewogCQkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJCWdvdG8gZXJyb3I7CkBAIC0yMTcsNyArMjE4LDcgQEAKIAlpZiAoIWtleXJpbmcpIHsKIAkJc3ByaW50ZihidWYsICJfc2VzLiV1IiwgdHNrLT50Z2lkKTsKIAotCQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhidWYsIHRzay0+dWlkLCB0c2stPmdpZCwgMSwgTlVMTCk7CisJCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGJ1ZiwgdHNrLT51aWQsIHRzay0+Z2lkLCB0c2ssIDEsIE5VTEwpOwogCQlpZiAoSVNfRVJSKGtleXJpbmcpKQogCQkJcmV0dXJuIFBUUl9FUlIoa2V5cmluZyk7CiAJfQpAQCAtMzkwLDYgKzM5MSw4IEBACiAJc3RydWN0IHJlcXVlc3Rfa2V5X2F1dGggKnJrYTsKIAlrZXlfcmVmX3Qga2V5X3JlZiwgcmV0LCBlcnI7CiAKKwltaWdodF9zbGVlcCgpOworCiAJLyogd2Ugd2FudCB0byByZXR1cm4gLUVBR0FJTiBvciAtRU5PS0VZIGlmIGFueSBvZiB0aGUga2V5cmluZ3Mgd2VyZQogCSAqIHNlYXJjaGFibGUsIGJ1dCB3ZSBmYWlsZWQgdG8gZmluZCBhIGtleSBvciB3ZSBmb3VuZCBhIG5lZ2F0aXZlIGtleTsKIAkgKiBvdGhlcndpc2Ugd2Ugd2FudCB0byByZXR1cm4gYSBzYW1wbGUgZXJyb3IgKHByb2JhYmx5IC1FQUNDRVMpIGlmCkBAIC00OTUsMjcgKzQ5OCwzNSBAQAogCSAqLwogCWlmIChjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoICYmCiAJICAgIGNvbnRleHQgPT0gY3VycmVudCAmJgotCSAgICB0eXBlICE9ICZrZXlfdHlwZV9yZXF1ZXN0X2tleV9hdXRoICYmCi0JICAgIGtleV92YWxpZGF0ZShjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoKSA9PSAwCisJICAgIHR5cGUgIT0gJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgKIAkgICAgKSB7Ci0JCXJrYSA9IGNvbnRleHQtPnJlcXVlc3Rfa2V5X2F1dGgtPnBheWxvYWQuZGF0YTsKKwkJLyogZGVmZW5kIGFnYWluc3QgdGhlIGF1dGgga2V5IGJlaW5nIHJldm9rZWQgKi8KKwkJZG93bl9yZWFkKCZjb250ZXh0LT5yZXF1ZXN0X2tleV9hdXRoLT5zZW0pOwogCi0JCWtleV9yZWYgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyh0eXBlLCBkZXNjcmlwdGlvbiwgbWF0Y2gsCi0JCQkJCQkgIHJrYS0+Y29udGV4dCk7CisJCWlmIChrZXlfdmFsaWRhdGUoY29udGV4dC0+cmVxdWVzdF9rZXlfYXV0aCkgPT0gMCkgeworCQkJcmthID0gY29udGV4dC0+cmVxdWVzdF9rZXlfYXV0aC0+cGF5bG9hZC5kYXRhOwogCi0JCWlmICghSVNfRVJSKGtleV9yZWYpKQotCQkJZ290byBmb3VuZDsKKwkJCWtleV9yZWYgPSBzZWFyY2hfcHJvY2Vzc19rZXlyaW5ncyh0eXBlLCBkZXNjcmlwdGlvbiwKKwkJCQkJCQkgIG1hdGNoLCBya2EtPmNvbnRleHQpOwogCi0JCXN3aXRjaCAoUFRSX0VSUihrZXlfcmVmKSkgewotCQljYXNlIC1FQUdBSU46IC8qIG5vIGtleSAqLwotCQkJaWYgKHJldCkKKwkJCXVwX3JlYWQoJmNvbnRleHQtPnJlcXVlc3Rfa2V5X2F1dGgtPnNlbSk7CisKKwkJCWlmICghSVNfRVJSKGtleV9yZWYpKQorCQkJCWdvdG8gZm91bmQ7CisKKwkJCXN3aXRjaCAoUFRSX0VSUihrZXlfcmVmKSkgeworCQkJY2FzZSAtRUFHQUlOOiAvKiBubyBrZXkgKi8KKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKKwkJCWNhc2UgLUVOT0tFWTogLyogbmVnYXRpdmUga2V5ICovCisJCQkJcmV0ID0ga2V5X3JlZjsKIAkJCQlicmVhazsKLQkJY2FzZSAtRU5PS0VZOiAvKiBuZWdhdGl2ZSBrZXkgKi8KLQkJCXJldCA9IGtleV9yZWY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWVyciA9IGtleV9yZWY7Ci0JCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXJyID0ga2V5X3JlZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVwX3JlYWQoJmNvbnRleHQtPnJlcXVlc3Rfa2V5X2F1dGgtPnNlbSk7CiAJCX0KIAl9CiAKQEAgLTcxNyw3ICs3MjgsNyBAQAogCWtleXJpbmcgPSBmaW5kX2tleXJpbmdfYnlfbmFtZShuYW1lLCAwKTsKIAlpZiAoUFRSX0VSUihrZXlyaW5nKSA9PSAtRU5PS0VZKSB7CiAJCS8qIG5vdCBmb3VuZCAtIHRyeSBhbmQgY3JlYXRlIGEgbmV3IG9uZSAqLwotCQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhuYW1lLCB0c2stPnVpZCwgdHNrLT5naWQsIDAsIE5VTEwpOworCQlrZXlyaW5nID0ga2V5cmluZ19hbGxvYyhuYW1lLCB0c2stPnVpZCwgdHNrLT5naWQsIHRzaywgMCwgTlVMTCk7CiAJCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJCXJldCA9IFBUUl9FUlIoa2V5cmluZyk7CiAJCQlnb3RvIGVycm9yMjsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYyBiL3NlY3VyaXR5L2tleXMvcmVxdWVzdF9rZXkuYwppbmRleCBmMDMwYTBjLi5lYWI2NmEwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5LmMKKysrIGIvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleS5jCkBAIC00OCw3ICs0OCw4IEBACiAJLyogYWxsb2NhdGUgYSBuZXcgc2Vzc2lvbiBrZXlyaW5nICovCiAJc3ByaW50ZihkZXNjLCAiX3JlcS4ldSIsIGtleS0+c2VyaWFsKTsKIAotCWtleXJpbmcgPSBrZXlyaW5nX2FsbG9jKGRlc2MsIGN1cnJlbnQtPmZzdWlkLCBjdXJyZW50LT5mc2dpZCwgMSwgTlVMTCk7CisJa2V5cmluZyA9IGtleXJpbmdfYWxsb2MoZGVzYywgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLAorCQkJCWN1cnJlbnQsIDEsIE5VTEwpOwogCWlmIChJU19FUlIoa2V5cmluZykpIHsKIAkJcmV0ID0gUFRSX0VSUihrZXlyaW5nKTsKIAkJZ290byBlcnJvcl9hbGxvYzsKQEAgLTEzNyw3ICsxMzgsOCBAQAogCiAJLyogY3JlYXRlIGEga2V5IGFuZCBhZGQgaXQgdG8gdGhlIHF1ZXVlICovCiAJa2V5ID0ga2V5X2FsbG9jKHR5cGUsIGRlc2NyaXB0aW9uLAotCQkJY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLCBLRVlfUE9TX0FMTCwgMCk7CisJCQljdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQsCisJCQljdXJyZW50LCBLRVlfUE9TX0FMTCwgMCk7CiAJaWYgKElTX0VSUihrZXkpKQogCQlnb3RvIGFsbG9jX2ZhaWxlZDsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9yZXF1ZXN0X2tleV9hdXRoLmMgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwppbmRleCBjY2U2YmE2Li5jYjk4MTdjIDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYworKysgYi9zZWN1cml0eS9rZXlzL3JlcXVlc3Rfa2V5X2F1dGguYwpAQCAtMjAsNiArMjAsNyBAQAogCiBzdGF0aWMgaW50IHJlcXVlc3Rfa2V5X2F1dGhfaW5zdGFudGlhdGUoc3RydWN0IGtleSAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CiBzdGF0aWMgdm9pZCByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlKGNvbnN0IHN0cnVjdCBrZXkgKiwgc3RydWN0IHNlcV9maWxlICopOworc3RhdGljIHZvaWQgcmVxdWVzdF9rZXlfYXV0aF9yZXZva2Uoc3RydWN0IGtleSAqKTsKIHN0YXRpYyB2b2lkIHJlcXVlc3Rfa2V5X2F1dGhfZGVzdHJveShzdHJ1Y3Qga2V5ICopOwogc3RhdGljIGxvbmcgcmVxdWVzdF9rZXlfYXV0aF9yZWFkKGNvbnN0IHN0cnVjdCBrZXkgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKIApAQCAtMzEsNiArMzIsNyBAQAogCS5kZWZfZGF0YWxlbgk9IHNpemVvZihzdHJ1Y3QgcmVxdWVzdF9rZXlfYXV0aCksCiAJLmluc3RhbnRpYXRlCT0gcmVxdWVzdF9rZXlfYXV0aF9pbnN0YW50aWF0ZSwKIAkuZGVzY3JpYmUJPSByZXF1ZXN0X2tleV9hdXRoX2Rlc2NyaWJlLAorCS5yZXZva2UJCT0gcmVxdWVzdF9rZXlfYXV0aF9yZXZva2UsCiAJLmRlc3Ryb3kJPSByZXF1ZXN0X2tleV9hdXRoX2Rlc3Ryb3ksCiAJLnJlYWQJCT0gcmVxdWVzdF9rZXlfYXV0aF9yZWFkLAogfTsKQEAgLTkzLDYgKzk1LDI0IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCisgKiBoYW5kbGUgcmV2b2NhdGlvbiBvZiBhbiBhdXRob3Jpc2F0aW9uIHRva2VuIGtleQorICogLSBjYWxsZWQgd2l0aCB0aGUga2V5IHNlbSB3cml0ZS1sb2NrZWQKKyAqLworc3RhdGljIHZvaWQgcmVxdWVzdF9rZXlfYXV0aF9yZXZva2Uoc3RydWN0IGtleSAqa2V5KQoreworCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2EgPSBrZXktPnBheWxvYWQuZGF0YTsKKworCWtlbnRlcigieyVkfSIsIGtleS0+c2VyaWFsKTsKKworCWlmIChya2EtPmNvbnRleHQpIHsKKwkJcHV0X3Rhc2tfc3RydWN0KHJrYS0+Y29udGV4dCk7CisJCXJrYS0+Y29udGV4dCA9IE5VTEw7CisJfQorCit9IC8qIGVuZCByZXF1ZXN0X2tleV9hdXRoX3Jldm9rZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCiAgKiBkZXN0cm95IGFuIGluc3RhbnRpYXRpb24gYXV0aG9yaXNhdGlvbiB0b2tlbiBrZXkKICAqLwogc3RhdGljIHZvaWQgcmVxdWVzdF9rZXlfYXV0aF9kZXN0cm95KHN0cnVjdCBrZXkgKmtleSkKQEAgLTEwMSw2ICsxMjEsMTEgQEAKIAogCWtlbnRlcigieyVkfSIsIGtleS0+c2VyaWFsKTsKIAorCWlmIChya2EtPmNvbnRleHQpIHsKKwkJcHV0X3Rhc2tfc3RydWN0KHJrYS0+Y29udGV4dCk7CisJCXJrYS0+Y29udGV4dCA9IE5VTEw7CisJfQorCiAJa2V5X3B1dChya2EtPnRhcmdldF9rZXkpOwogCWtmcmVlKHJrYSk7CiAKQEAgLTEzMSwxNCArMTU2LDI2IEBACiAJICogYW5vdGhlciBwcm9jZXNzICovCiAJaWYgKGN1cnJlbnQtPnJlcXVlc3Rfa2V5X2F1dGgpIHsKIAkJLyogaXQgaXMgLSB1c2UgdGhhdCBpbnN0YW50aWF0aW9uIGNvbnRleHQgaGVyZSB0b28gKi8KKwkJZG93bl9yZWFkKCZjdXJyZW50LT5yZXF1ZXN0X2tleV9hdXRoLT5zZW0pOworCisJCS8qIGlmIHRoZSBhdXRoIGtleSBoYXMgYmVlbiByZXZva2VkLCB0aGVuIHRoZSBrZXkgd2UncmUKKwkJICogc2VydmljaW5nIGlzIGFscmVhZHkgaW5zdGFudGlhdGVkICovCisJCWlmICh0ZXN0X2JpdChLRVlfRkxBR19SRVZPS0VELAorCQkJICAgICAmY3VycmVudC0+cmVxdWVzdF9rZXlfYXV0aC0+ZmxhZ3MpKQorCQkJZ290byBhdXRoX2tleV9yZXZva2VkOworCiAJCWlya2EgPSBjdXJyZW50LT5yZXF1ZXN0X2tleV9hdXRoLT5wYXlsb2FkLmRhdGE7CiAJCXJrYS0+Y29udGV4dCA9IGlya2EtPmNvbnRleHQ7CiAJCXJrYS0+cGlkID0gaXJrYS0+cGlkOworCQlnZXRfdGFza19zdHJ1Y3QocmthLT5jb250ZXh0KTsKKworCQl1cF9yZWFkKCZjdXJyZW50LT5yZXF1ZXN0X2tleV9hdXRoLT5zZW0pOwogCX0KIAllbHNlIHsKIAkJLyogaXQgaXNuJ3QgLSB1c2UgdGhpcyBwcm9jZXNzIGFzIHRoZSBjb250ZXh0ICovCiAJCXJrYS0+Y29udGV4dCA9IGN1cnJlbnQ7CiAJCXJrYS0+cGlkID0gY3VycmVudC0+cGlkOworCQlnZXRfdGFza19zdHJ1Y3QocmthLT5jb250ZXh0KTsKIAl9CiAKIAlya2EtPnRhcmdldF9rZXkgPSBrZXlfZ2V0KHRhcmdldCk7CkBAIC0xNDgsNyArMTg1LDcgQEAKIAlzcHJpbnRmKGRlc2MsICIleCIsIHRhcmdldC0+c2VyaWFsKTsKIAogCWF1dGhrZXkgPSBrZXlfYWxsb2MoJmtleV90eXBlX3JlcXVlc3Rfa2V5X2F1dGgsIGRlc2MsCi0JCQkgICAgY3VycmVudC0+ZnN1aWQsIGN1cnJlbnQtPmZzZ2lkLAorCQkJICAgIGN1cnJlbnQtPmZzdWlkLCBjdXJyZW50LT5mc2dpZCwgY3VycmVudCwKIAkJCSAgICBLRVlfUE9TX1ZJRVcgfCBLRVlfUE9TX1JFQUQgfCBLRVlfUE9TX1NFQVJDSCB8CiAJCQkgICAgS0VZX1VTUl9WSUVXLCAxKTsKIAlpZiAoSVNfRVJSKGF1dGhrZXkpKSB7CkBAIC0xNjEsOSArMTk4LDE1IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfaW5zdDsKIAotCWtsZWF2ZSgiID0geyVkfSkiLCBhdXRoa2V5LT5zZXJpYWwpOworCWtsZWF2ZSgiID0geyVkfSIsIGF1dGhrZXktPnNlcmlhbCk7CiAJcmV0dXJuIGF1dGhrZXk7CiAKK2F1dGhfa2V5X3Jldm9rZWQ6CisJdXBfcmVhZCgmY3VycmVudC0+cmVxdWVzdF9rZXlfYXV0aC0+c2VtKTsKKwlrZnJlZShya2EpOworCWtsZWF2ZSgiPSAtRUtFWVJFVk9LRUQiKTsKKwlyZXR1cm4gRVJSX1BUUigtRUtFWVJFVk9LRUQpOworCiBlcnJvcl9pbnN0OgogCWtleV9yZXZva2UoYXV0aGtleSk7CiAJa2V5X3B1dChhdXRoa2V5KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA1NGFkYzlkLi43OWMxNmUzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC0xOTAzLDEzICsxOTAzLDEzIEBACiAJcmV0dXJuIHN1cGVyYmxvY2tfaGFzX3Blcm0oY3VycmVudCwgc2IsIEZJTEVTWVNURU1fX01PVU5ULCAmYWQpOwogfQogCi1zdGF0aWMgaW50IHNlbGludXhfc2Jfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCitzdGF0aWMgaW50IHNlbGludXhfc2Jfc3RhdGZzKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgYXZjX2F1ZGl0X2RhdGEgYWQ7CiAKIAlBVkNfQVVESVRfREFUQV9JTklUKCZhZCxGUyk7Ci0JYWQudS5mcy5kZW50cnkgPSBzYi0+c19yb290OwotCXJldHVybiBzdXBlcmJsb2NrX2hhc19wZXJtKGN1cnJlbnQsIHNiLCBGSUxFU1lTVEVNX19HRVRBVFRSLCAmYWQpOworCWFkLnUuZnMuZGVudHJ5ID0gZGVudHJ5LT5kX3NiLT5zX3Jvb3Q7CisJcmV0dXJuIHN1cGVyYmxvY2tfaGFzX3Blcm0oY3VycmVudCwgZGVudHJ5LT5kX3NiLCBGSUxFU1lTVEVNX19HRVRBVFRSLCAmYWQpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfbW91bnQoY2hhciAqIGRldl9uYW1lLApAQCAtMjY0NSw2ICsyNjQ1LDExIEBACiAJcmV0dXJuIHRhc2tfaGFzX3Blcm0oY3VycmVudCxwLCBQUk9DRVNTX19TRVRTQ0hFRCk7CiB9CiAKK3N0YXRpYyBpbnQgc2VsaW51eF90YXNrX3NldGlvcHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBpb3ByaW8pCit7CisJcmV0dXJuIHRhc2tfaGFzX3Blcm0oY3VycmVudCwgcCwgUFJPQ0VTU19fU0VUU0NIRUQpOworfQorCiBzdGF0aWMgaW50IHNlbGludXhfdGFza19zZXRybGltaXQodW5zaWduZWQgaW50IHJlc291cmNlLCBzdHJ1Y3QgcmxpbWl0ICpuZXdfcmxpbSkKIHsKIAlzdHJ1Y3QgcmxpbWl0ICpvbGRfcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbSArIHJlc291cmNlOwpAQCAtMjY3NCw2ICsyNjc5LDExIEBACiAJcmV0dXJuIHRhc2tfaGFzX3Blcm0oY3VycmVudCwgcCwgUFJPQ0VTU19fR0VUU0NIRUQpOwogfQogCitzdGF0aWMgaW50IHNlbGludXhfdGFza19tb3ZlbWVtb3J5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gdGFza19oYXNfcGVybShjdXJyZW50LCBwLCBQUk9DRVNTX19TRVRTQ0hFRCk7Cit9CisKIHN0YXRpYyBpbnQgc2VsaW51eF90YXNrX2tpbGwoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgaW50IHNpZykKIHsKIAl1MzIgcGVybTsKQEAgLTQyNTIsNiArNDI2Miw1NyBAQAogCXJldHVybiBzaXplOwogfQogCisjaWZkZWYgQ09ORklHX0tFWVMKKworc3RhdGljIGludCBzZWxpbnV4X2tleV9hbGxvYyhzdHJ1Y3Qga2V5ICprLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlzdHJ1Y3QgdGFza19zZWN1cml0eV9zdHJ1Y3QgKnRzZWMgPSB0c2stPnNlY3VyaXR5OworCXN0cnVjdCBrZXlfc2VjdXJpdHlfc3RydWN0ICprc2VjOworCisJa3NlYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrZXlfc2VjdXJpdHlfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrc2VjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWtzZWMtPm9iaiA9IGs7CisJa3NlYy0+c2lkID0gdHNlYy0+c2lkOworCWstPnNlY3VyaXR5ID0ga3NlYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZWxpbnV4X2tleV9mcmVlKHN0cnVjdCBrZXkgKmspCit7CisJc3RydWN0IGtleV9zZWN1cml0eV9zdHJ1Y3QgKmtzZWMgPSBrLT5zZWN1cml0eTsKKworCWstPnNlY3VyaXR5ID0gTlVMTDsKKwlrZnJlZShrc2VjKTsKK30KKworc3RhdGljIGludCBzZWxpbnV4X2tleV9wZXJtaXNzaW9uKGtleV9yZWZfdCBrZXlfcmVmLAorCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3R4LAorCQkJICAgIGtleV9wZXJtX3QgcGVybSkKK3sKKwlzdHJ1Y3Qga2V5ICprZXk7CisJc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICp0c2VjOworCXN0cnVjdCBrZXlfc2VjdXJpdHlfc3RydWN0ICprc2VjOworCisJa2V5ID0ga2V5X3JlZl90b19wdHIoa2V5X3JlZik7CisKKwl0c2VjID0gY3R4LT5zZWN1cml0eTsKKwlrc2VjID0ga2V5LT5zZWN1cml0eTsKKworCS8qIGlmIG5vIHNwZWNpZmljIHBlcm1pc3Npb25zIGFyZSByZXF1ZXN0ZWQsIHdlIHNraXAgdGhlCisJICAgcGVybWlzc2lvbiBjaGVjay4gTm8gc2VyaW91cywgYWRkaXRpb25hbCBjb3ZlcnQgY2hhbm5lbHMKKwkgICBhcHBlYXIgdG8gYmUgY3JlYXRlZC4gKi8KKwlpZiAocGVybSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBhdmNfaGFzX3Blcm0odHNlYy0+c2lkLCBrc2VjLT5zaWQsCisJCQkgICAgU0VDQ0xBU1NfS0VZLCBwZXJtLCBOVUxMKTsKK30KKworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3Qgc2VjdXJpdHlfb3BlcmF0aW9ucyBzZWxpbnV4X29wcyA9IHsKIAkucHRyYWNlID0JCQlzZWxpbnV4X3B0cmFjZSwKIAkuY2FwZ2V0ID0JCQlzZWxpbnV4X2NhcGdldCwKQEAgLTQzMzIsOSArNDM5MywxMSBAQAogCS50YXNrX2dldHNpZCA9CQkgICAgICAgIHNlbGludXhfdGFza19nZXRzaWQsCiAJLnRhc2tfc2V0Z3JvdXBzID0JCXNlbGludXhfdGFza19zZXRncm91cHMsCiAJLnRhc2tfc2V0bmljZSA9CQkJc2VsaW51eF90YXNrX3NldG5pY2UsCisJLnRhc2tfc2V0aW9wcmlvID0JCXNlbGludXhfdGFza19zZXRpb3ByaW8sCiAJLnRhc2tfc2V0cmxpbWl0ID0JCXNlbGludXhfdGFza19zZXRybGltaXQsCiAJLnRhc2tfc2V0c2NoZWR1bGVyID0JCXNlbGludXhfdGFza19zZXRzY2hlZHVsZXIsCiAJLnRhc2tfZ2V0c2NoZWR1bGVyID0JCXNlbGludXhfdGFza19nZXRzY2hlZHVsZXIsCisJLnRhc2tfbW92ZW1lbW9yeSA9CQlzZWxpbnV4X3Rhc2tfbW92ZW1lbW9yeSwKIAkudGFza19raWxsID0JCQlzZWxpbnV4X3Rhc2tfa2lsbCwKIAkudGFza193YWl0ID0JCQlzZWxpbnV4X3Rhc2tfd2FpdCwKIAkudGFza19wcmN0bCA9CQkJc2VsaW51eF90YXNrX3ByY3RsLApAQCAtNDQwNiw2ICs0NDY5LDEyIEBACiAJLnhmcm1fc3RhdGVfZGVsZXRlX3NlY3VyaXR5ID0Jc2VsaW51eF94ZnJtX3N0YXRlX2RlbGV0ZSwKIAkueGZybV9wb2xpY3lfbG9va3VwID0gCQlzZWxpbnV4X3hmcm1fcG9saWN5X2xvb2t1cCwKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tFWVMKKwkua2V5X2FsbG9jID0gICAgICAgICAgICAgICAgICAgIHNlbGludXhfa2V5X2FsbG9jLAorCS5rZXlfZnJlZSA9ICAgICAgICAgICAgICAgICAgICAgc2VsaW51eF9rZXlfZnJlZSwKKwkua2V5X3Blcm1pc3Npb24gPSAgICAgICAgICAgICAgIHNlbGludXhfa2V5X3Blcm1pc3Npb24sCisjZW5kaWYKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IHNlbGludXhfaW5pdCh2b2lkKQpAQCAtNDQ0MSw2ICs0NTEwLDEzIEBACiAJfSBlbHNlIHsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiU0VMaW51eDogIFN0YXJ0aW5nIGluIHBlcm1pc3NpdmUgbW9kZVxuIik7CiAJfQorCisjaWZkZWYgQ09ORklHX0tFWVMKKwkvKiBBZGQgc2VjdXJpdHkgaW5mb3JtYXRpb24gdG8gaW5pdGlhbCBrZXlyaW5ncyAqLworCXNlY3VyaXR5X2tleV9hbGxvYygmcm9vdF91c2VyX2tleXJpbmcsIGN1cnJlbnQpOworCXNlY3VyaXR5X2tleV9hbGxvYygmcm9vdF9zZXNzaW9uX2tleXJpbmcsIGN1cnJlbnQpOworI2VuZGlmCisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1fdG9fc3RyaW5nLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybV90b19zdHJpbmcuaAppbmRleCA3MGVlNjVhLi5iYzAyMGJkIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybV90b19zdHJpbmcuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybV90b19zdHJpbmcuaApAQCAtMjQyLDMgKzI0Miw5IEBACiAgICBTXyhTRUNDTEFTU19QQUNLRVQsIFBBQ0tFVF9fU0VORCwgInNlbmQiKQogICAgU18oU0VDQ0xBU1NfUEFDS0VULCBQQUNLRVRfX1JFQ1YsICJyZWN2IikKICAgIFNfKFNFQ0NMQVNTX1BBQ0tFVCwgUEFDS0VUX19SRUxBQkVMVE8sICJyZWxhYmVsdG8iKQorICAgU18oU0VDQ0xBU1NfS0VZLCBLRVlfX1ZJRVcsICJ2aWV3IikKKyAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19SRUFELCAicmVhZCIpCisgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fV1JJVEUsICJ3cml0ZSIpCisgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fU0VBUkNILCAic2VhcmNoIikKKyAgIFNfKFNFQ0NMQVNTX0tFWSwgS0VZX19MSU5LLCAibGluayIpCisgICBTXyhTRUNDTEFTU19LRVksIEtFWV9fU0VUQVRUUiwgInNldGF0dHIiKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2F2X3Blcm1pc3Npb25zLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAppbmRleCAxZDljZjNkLi4xMjA1MjI3IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvYXZfcGVybWlzc2lvbnMuaApAQCAtOTU5LDMgKzk1OSwxMSBAQAogI2RlZmluZSBQQUNLRVRfX1NFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxVUwKICNkZWZpbmUgUEFDS0VUX19SRUNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMlVMCiAjZGVmaW5lIFBBQ0tFVF9fUkVMQUJFTFRPICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRVTAorCisjZGVmaW5lIEtFWV9fVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFVTAorI2RlZmluZSBLRVlfX1JFQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyVUwKKyNkZWZpbmUgS0VZX19XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNFVMCisjZGVmaW5lIEtFWV9fU0VBUkNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhVTAorI2RlZmluZSBLRVlfX0xJTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwVUwKKyNkZWZpbmUgS0VZX19TRVRBVFRSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMFVMCisKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc190b19zdHJpbmcuaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9jbGFzc190b19zdHJpbmcuaAppbmRleCAzYWVjNzVmLi4yNDMwM2I2IDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvY2xhc3NfdG9fc3RyaW5nLmgKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL2NsYXNzX3RvX3N0cmluZy5oCkBAIC02MCwzICs2MCw0IEBACiAgICAgU18oIm5ldGxpbmtfa29iamVjdF91ZXZlbnRfc29ja2V0IikKICAgICBTXygiYXBwbGV0YWxrX3NvY2tldCIpCiAgICAgU18oInBhY2tldCIpCisgICAgU18oImtleSIpCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvZmxhc2suaCBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oCmluZGV4IGEwZWI5ZTIuLjk1ODg3YWUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9mbGFzay5oCkBAIC02Miw2ICs2Miw3IEBACiAjZGVmaW5lIFNFQ0NMQVNTX05FVExJTktfS09CSkVDVF9VRVZFTlRfU09DS0VUICAgICAgICAgICA1NQogI2RlZmluZSBTRUNDTEFTU19BUFBMRVRBTEtfU09DS0VUICAgICAgICAgICAgICAgICAgICAgICAgNTYKICNkZWZpbmUgU0VDQ0xBU1NfUEFDS0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3CisjZGVmaW5lIFNFQ0NMQVNTX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OAogCiAvKgogICogU2VjdXJpdHkgaWRlbnRpZmllciBpbmRpY2VzIGZvciBpbml0aWFsIGVudGl0aWVzCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmggYi9zZWN1cml0eS9zZWxpbnV4L2luY2x1ZGUvb2Jqc2VjLmgKaW5kZXggNTRjMDMwNy4uOGY1NTQ3YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9pbmNsdWRlL29ianNlYy5oCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaW5jbHVkZS9vYmpzZWMuaApAQCAtOTksNiArOTksMTEgQEAKIAl1MzIgcGVlcl9zaWQ7CQkJLyogU0lEIG9mIHBlZXIgKi8KIH07CiAKK3N0cnVjdCBrZXlfc2VjdXJpdHlfc3RydWN0IHsKKwlzdHJ1Y3Qga2V5ICpvYmo7IC8qIGJhY2sgcG9pbnRlciAqLworCXUzMiBzaWQ7ICAgICAgICAgLyogU0lEIG9mIGtleSAqLworfTsKKwogZXh0ZXJuIHVuc2lnbmVkIGludCBzZWxpbnV4X2NoZWNrcmVxcHJvdDsKIAogI2VuZGlmIC8qIF9TRUxJTlVYX09CSlNFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYyBiL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKaW5kZXggMmU3M2QzMi4uNzAyOWJiYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCkBAIC0xMzQ1LDEwICsxMzQ1LDExIEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNlbF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCi0JCQkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgc2VsX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJICAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwKKwkJICAgICAgc3RydWN0IHZmc21vdW50ICptbnQpCiB7Ci0JcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNlbF9maWxsX3N1cGVyKTsKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgc2VsX2ZpbGxfc3VwZXIsIG1udCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzZWxfZnNfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL0tjb25maWcgYi9zb3VuZC9LY29uZmlnCmluZGV4IGI2NWVlNDcuLmUwZDc5MWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL0tjb25maWcKKysrIGIvc291bmQvS2NvbmZpZwpAQCAtNTgsNiArNTgsOCBAQAogCiBzb3VyY2UgInNvdW5kL3BwYy9LY29uZmlnIgogCitzb3VyY2UgInNvdW5kL2FvYS9LY29uZmlnIgorCiBzb3VyY2UgInNvdW5kL2FybS9LY29uZmlnIgogCiBzb3VyY2UgInNvdW5kL21pcHMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL3NvdW5kL01ha2VmaWxlIGIvc291bmQvTWFrZWZpbGUKaW5kZXggZjM1MmJiMi4uYTY4MmVhMyAxMDA2NDQKLS0tIGEvc291bmQvTWFrZWZpbGUKKysrIGIvc291bmQvTWFrZWZpbGUKQEAgLTQsNyArNCw3IEBACiBvYmotJChDT05GSUdfU09VTkQpICs9IHNvdW5kY29yZS5vCiBvYmotJChDT05GSUdfU09VTkRfUFJJTUUpICs9IG9zcy8KIG9iai0kKENPTkZJR19ETUFTT1VORCkgKz0gb3NzLwotb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBkcml2ZXJzLyBpc2EvIHBjaS8gcHBjLyBhcm0vIHN5bnRoLyB1c2IvIHNwYXJjLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8KK29iai0kKENPTkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJtLyBzeW50aC8gdXNiLyBzcGFyYy8gcGFyaXNjLyBwY21jaWEvIG1pcHMvIGFvYS8KIAogaWZlcSAoJChDT05GSUdfU05EKSx5KQogICBvYmoteSArPSBsYXN0Lm8KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9LY29uZmlnIGIvc291bmQvYW9hL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9LY29uZmlnCkBAIC0wLDAgKzEsMTcgQEAKK21lbnUgIkFwcGxlIE9uYm9hcmQgQXVkaW8gZHJpdmVyIgorCWRlcGVuZHMgb24gU05EIT1uICYmIFBQQworCitjb25maWcgU05EX0FPQQorCXRyaXN0YXRlICJBcHBsZSBPbmJvYXJkIEF1ZGlvIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5EICYmIFNORF9QQ00KKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgbmV3IGRyaXZlciBmb3IgdGhlIHZhcmlvdXMKKwlBcHBsZSBPbmJvYXJkIEF1ZGlvIGNvbXBvbmVudHMuCisKK3NvdXJjZSAic291bmQvYW9hL2ZhYnJpY3MvS2NvbmZpZyIKKworc291cmNlICJzb3VuZC9hb2EvY29kZWNzL0tjb25maWciCisKK3NvdXJjZSAic291bmQvYW9hL3NvdW5kYnVzL0tjb25maWciCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9NYWtlZmlsZSBiL3NvdW5kL2FvYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRlM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorb2JqLSQoQ09ORklHX1NORF9BT0EpICs9IGNvcmUvCitvYmotJChDT05GSUdfU05EX0FPQSkgKz0gY29kZWNzLworb2JqLSQoQ09ORklHX1NORF9BT0EpICs9IGZhYnJpY3MvCitvYmotJChDT05GSUdfU05EX0FPQV9TT1VOREJVUykgKz0gc291bmRidXMvCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvYW9hLWdwaW8uaCBiL3NvdW5kL2FvYS9hb2EtZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjFmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvYW9hLWdwaW8uaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQXBwbGUgT25ib2FyZCBBdWRpbyBHUElPIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpZm5kZWYgX19BT0FfR1BJT19ICisjZGVmaW5lIF9fQU9BX0dQSU9fSAorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKwordHlwZWRlZiB2b2lkICgqbm90aWZ5X2Z1bmNfdCkodm9pZCAqZGF0YSk7CisKK2VudW0gbm90aWZ5X3R5cGUgeworCUFPQV9OT1RJRllfSEVBRFBIT05FLAorCUFPQV9OT1RJRllfTElORV9JTiwKKwlBT0FfTk9USUZZX0xJTkVfT1VULAorfTsKKworc3RydWN0IGdwaW9fcnVudGltZTsKK3N0cnVjdCBncGlvX21ldGhvZHMgeworCS8qIGZvciBpbml0aWFsaXNhdGlvbi9kZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgR1BJTyBsYXllciAqLworCXZvaWQgKCppbml0KShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCk7CisJdm9pZCAoKmV4aXQpKHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0KTsKKworCS8qIHR1cm4gb2ZmIGhlYWRwaG9uZSwgc3BlYWtlcnMsIGxpbmVvdXQgKi8KKwl2b2lkICgqYWxsX2FtcHNfb2ZmKShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCk7CisJLyogdHVybiBoZWFkcGhvbmUsIHNwZWFrZXJzLCBsaW5lb3V0IGJhY2sgdG8gcHJldmlvdXMgc2V0dGluZyAqLworCXZvaWQgKCphbGxfYW1wc19yZXN0b3JlKShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCk7CisKKwl2b2lkICgqc2V0X2hlYWRwaG9uZSkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsIGludCBvbik7CisJdm9pZCAoKnNldF9zcGVha2Vycykoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsIGludCBvbik7CisJdm9pZCAoKnNldF9saW5lb3V0KShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCwgaW50IG9uKTsKKworCWludCAoKmdldF9oZWFkcGhvbmUpKHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0KTsKKwlpbnQgKCpnZXRfc3BlYWtlcnMpKHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0KTsKKwlpbnQgKCpnZXRfbGluZW91dCkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpOworCisJdm9pZCAoKnNldF9od19yZXNldCkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsIGludCBvbik7CisKKwkvKiB1c2UgdGhpcyB0byBiZSBub3RpZmllZCBvZiBhbnkgZXZlbnRzLiBUaGUgbm90aWZpY2F0aW9uCisJICogZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBkYXRhLCBhbmQgaXMgY2FsbGVkIGluIHByb2Nlc3MKKwkgKiBjb250ZXh0IGJ5IHRoZSB1c2Ugb2Ygc2NoZWR1bGVfd29yay4KKwkgKiBUaGUgaW50ZXJmYWNlIGZvciBpdCBpcyB0aGF0IHNldHRpbmcgYSBmdW5jdGlvbiB0byBOVUxMCisJICogcmVtb3ZlcyBpdCwgYW5kIHRoZXkgcmV0dXJuIDAgaWYgdGhlIG9wZXJhdGlvbiBzdWNjZWVkZWQsCisJICogYW5kIC1FQlVTWSBpZiB0aGUgbm90aWZpY2F0aW9uIGlzIGFscmVhZHkgYXNzaWduZWQgYnkKKwkgKiBzb21lb25lIGVsc2UuICovCisJaW50ICgqc2V0X25vdGlmeSkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsCisJCQkgIGVudW0gbm90aWZ5X3R5cGUgdHlwZSwKKwkJCSAgbm90aWZ5X2Z1bmNfdCBub3RpZnksCisJCQkgIHZvaWQgKmRhdGEpOworCS8qIHJldHVybnMgMCBpZiBub3QgcGx1Z2dlZCBpbiwgMSBpZiBwbHVnZ2VkIGluCisJICogb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlICovCisJaW50ICgqZ2V0X2RldGVjdCkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsCisJCQkgIGVudW0gbm90aWZ5X3R5cGUgdHlwZSk7Cit9OworCitzdHJ1Y3QgZ3Bpb19ub3RpZmljYXRpb24geworCW5vdGlmeV9mdW5jX3Qgbm90aWZ5OworCXZvaWQgKmRhdGE7CisJdm9pZCAqZ3Bpb19wcml2YXRlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKK3N0cnVjdCBncGlvX3J1bnRpbWUgeworCS8qIHRvIGJlIGFzc2lnbmVkIGJ5IGZhYnJpYyAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwkvKiBzaW5jZSBldmVyeW9uZSBuZWVkcyB0aGlzIHBvaW50ZXIgYW55d2F5Li4uICovCisJc3RydWN0IGdwaW9fbWV0aG9kcyAqbWV0aG9kczsKKwkvKiB0byBiZSB1c2VkIGJ5IHRoZSBncGlvIGltcGxlbWVudGF0aW9uICovCisJaW50IGltcGxlbWVudGF0aW9uX3ByaXZhdGU7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uIGhlYWRwaG9uZV9ub3RpZnk7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uIGxpbmVfaW5fbm90aWZ5OworCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiBsaW5lX291dF9ub3RpZnk7Cit9OworCisjZW5kaWYgLyogX19BT0FfR1BJT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvYW9hLmggYi9zb3VuZC9hb2EvYW9hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4ZWYxZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9hb2EuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIEFwcGxlIE9uYm9hcmQgQXVkaW8gZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTCB2MiwgY2FuIGJlIGZvdW5kIGluIENPUFlJTkcuCisgKi8KKworI2lmbmRlZiBfX0FPQV9ICisjZGVmaW5lIF9fQU9BX0gKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorLyogU28gYXBwYXJlbnRseSB0aGVyZSdzIGEgcmVhc29uIGZvciByZXF1aXJpbmcgZHJpdmVyLmggdG8gYmUgaW5jbHVkZWQgZmlyc3QhICovCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlICJhb2EtZ3Bpby5oIgorI2luY2x1ZGUgInNvdW5kYnVzL3NvdW5kYnVzLmgiCisKKyNkZWZpbmUgTUFYX0NPREVDX05BTUVfTEVOCTMyCisKK3N0cnVjdCBhb2FfY29kZWMgeworCWNoYXIJbmFtZVtNQVhfQ09ERUNfTkFNRV9MRU5dOworCisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwkvKiBjYWxsZWQgd2hlbiB0aGUgZmFicmljIHdhbnRzIHRvIGluaXQgdGhpcyBjb2RlYy4KKwkgKiBEbyBhbHNhIGNhcmQgbWFuaXB1bGF0aW9ucyBmcm9tIGhlcmUuICovCisJaW50ICgqaW5pdCkoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpOworCisJLyogY2FsbGVkIHdoZW4gdGhlIGZhYnJpYyBpcyBkb25lIHdpdGggdGhlIGNvZGVjLgorCSAqIFRoZSBhbHNhIGNhcmQgd2lsbCBiZSBjbGVhbmVkIHVwIHNvIGRvbid0IGJvdGhlci4gKi8KKwl2b2lkICgqZXhpdCkoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpOworCisJLyogTWF5IGJlIE5VTEwsIGJ1dCBjYW4gYmUgdXNlZCBieSB0aGUgZmFicmljLgorCSAqIFJlZmNvdW50aW5nIGlzIHRoZSBjb2RlYyBkcml2ZXIncyByZXNwb25zaWJpbGl0eSAqLworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCS8qIGFzc2lnbmVkIGJ5IGZhYnJpYyBiZWZvcmUgaW5pdCgpIGlzIGNhbGxlZCwgcG9pbnRzCisJICogdG8gdGhlIHNvdW5kYnVzIGRldmljZS4gQ2Fubm90IGJlIE5VTEwuICovCisJc3RydWN0IHNvdW5kYnVzX2RldiAqc291bmRidXNfZGV2OworCisJLyogYXNzaWduZWQgYnkgdGhlIGZhYnJpYyBiZWZvcmUgaW5pdCgpIGlzIGNhbGxlZCwgcG9pbnRzCisJICogdG8gdGhlIGZhYnJpYydzIGdwaW8gcnVudGltZSByZWNvcmQgZm9yIHRoZSByZWxldmFudAorCSAqIGRldmljZS4gKi8KKwlzdHJ1Y3QgZ3Bpb19ydW50aW1lICpncGlvOworCisJLyogYXNzaWduZWQgYnkgdGhlIGZhYnJpYyBiZWZvcmUgaW5pdCgpIGlzIGNhbGxlZCwgY29udGFpbnMKKwkgKiBhIGNvZGVjIHNwZWNpZmljIGJpdG1hc2sgb2Ygd2hhdCBvdXRwdXRzIGFuZCBpbnB1dHMgYXJlCisJICogYWN0dWFsbHkgY29ubmVjdGVkICovCisJdTMyIGNvbm5lY3RlZDsKKworCS8qIGRhdGEgdGhlIGZhYnJpYyBjYW4gYXNzb2NpYXRlIHdpdGggdGhpcyBzdHJ1Y3R1cmUgKi8KKwl2b2lkICpmYWJyaWNfZGF0YTsKKworCS8qIHByaXZhdGUhICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBhb2FfZmFicmljICpmYWJyaWM7Cit9OworCisvKiByZXR1cm4gMCBvbiBzdWNjZXNzICovCitleHRlcm4gaW50Cithb2FfY29kZWNfcmVnaXN0ZXIoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpOworZXh0ZXJuIHZvaWQKK2FvYV9jb2RlY191bnJlZ2lzdGVyKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKTsKKworI2RlZmluZSBNQVhfTEFZT1VUX05BTUVfTEVOCTMyCisKK3N0cnVjdCBhb2FfZmFicmljIHsKKwljaGFyCW5hbWVbTUFYX0xBWU9VVF9OQU1FX0xFTl07CisKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKworCS8qIG9uY2UgY29kZWNzIHJlZ2lzdGVyLCB0aGV5IGFyZSBwYXNzZWQgaGVyZSBhZnRlci4KKwkgKiBUaGV5IGFyZSBvZiBjb3Vyc2Ugbm90IGluaXRpYWxpc2VkLCBzaW5jZSB0aGUKKwkgKiBmYWJyaWMgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpc2luZyBzb21lIGZpZWxkcworCSAqIGluIHRoZSBjb2RlYyBzdHJ1Y3R1cmUhICovCisJaW50ICgqZm91bmRfY29kZWMpKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKTsKKwkvKiBjYWxsZWQgZm9yIGVhY2ggY29kZWMgd2hlbiBpdCBpcyByZW1vdmVkLAorCSAqIGFsc28gaW4gdGhlIGNhc2UgdGhhdCBhb2FfZmFicmljX3VucmVnaXN0ZXIKKwkgKiBpcyBjYWxsZWQgYW5kIGFsbCBjb2RlY3MgYXJlIHJlbW92ZWQKKwkgKiBmcm9tIHRoaXMgZmFicmljLgorCSAqIEFsc28gY2FsbGVkIGlmIGZvdW5kX2NvZGVjIHJldHVybmVkIDAgYnV0CisJICogdGhlIGNvZGVjIGNvdWxkbid0IGluaXRpYWxpc2UuICovCisJdm9pZCAoKnJlbW92ZV9jb2RlYykoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpOworCS8qIElmIGZvdW5kX2NvZGVjIHJldHVybmVkIDAsIGFuZCB0aGUgY29kZWMKKwkgKiBjb3VsZCBiZSBpbml0aWFsaXNlZCwgdGhpcyBpcyBjYWxsZWQuICovCisJdm9pZCAoKmF0dGFjaGVkX2NvZGVjKShzdHJ1Y3QgYW9hX2NvZGVjICpjb2RlYyk7Cit9OworCisvKiByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRUVYSVNUIGlmIGFub3RoZXIgZmFicmljIGlzCisgKiByZWdpc3RlcmVkLCAtRUFMUkVBRFkgaWYgdGhlIHNhbWUgZmFicmljIGlzIHJlZ2lzdGVyZWQuCisgKiBQYXNzaW5nIE5VTEwgY2FuIGJlIHVzZWQgdG8gdGVzdCBmb3IgdGhlIHByZXNlbmNlCisgKiBvZiBhbm90aGVyIGZhYnJpYywgaWYgLUVBTFJFQURZIGlzIHJldHVybmVkIHRoZXJlIGlzCisgKiBubyBvdGhlciBmYWJyaWMgcHJlc2VudC4KKyAqIEluIHRoZSBjYXNlIHRoYXQgdGhlIGZ1bmN0aW9uIHJldHVybnMgLUVBTFJFQURZCisgKiBhbmQgdGhlIGZhYnJpYyBwYXNzZWQgaXMgbm90IE5VTEwsIGFsbCBjb2RlY3MKKyAqIHRoYXQgYXJlIG5vdCBhc3NpZ25lZCB5ZXQgYXJlIHBhc3NlZCB0byB0aGUgZmFicmljCisgKiBhZ2FpbiBmb3IgcmVjb25zaWRlcmF0aW9uLiAqLworZXh0ZXJuIGludAorYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqZmFicmljKTsKKworLyogaXQgaXMgdml0YWwgdG8gY2FsbCB0aGlzIHdoZW4gdGhlIGZhYnJpYyBleGl0cyEKKyAqIFdoZW4gY2FsbGluZywgdGhlIHJlbW92ZV9jb2RlYyB3aWxsIGJlIGNhbGxlZAorICogZm9yIGFsbCBjb2RlY3MsIHVubGVzcyBpdCBpcyBOVUxMLiAqLworZXh0ZXJuIHZvaWQKK2FvYV9mYWJyaWNfdW5yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqZmFicmljKTsKKworLyogaWYgZm9yIHNvbWUgcmVhc29uIHlvdSB3YW50IHRvIGdldCByaWQgb2YgYSBjb2RlYworICogYmVmb3JlIHRoZSBmYWJyaWMgaXMgcmVtb3ZlZCwgdXNlIHRoaXMuCisgKiBOb3RlIHRoYXQgcmVtb3ZlX2NvZGVjIGlzIGNhbGxlZCBmb3IgaXQhICovCitleHRlcm4gdm9pZAorYW9hX2ZhYnJpY191bmxpbmtfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpOworCisvKiBhbHNhIGhlbHAgbWV0aG9kcyAqLworc3RydWN0IGFvYV9jYXJkIHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmFsc2FfY2FyZDsKK307CisgICAgICAgIAorZXh0ZXJuIGludCBhb2Ffc25kX2RldmljZV9uZXcoc25kX2RldmljZV90eXBlX3QgdHlwZSwKKwl2b2lkICogZGV2aWNlX2RhdGEsIHN0cnVjdCBzbmRfZGV2aWNlX29wcyAqIG9wcyk7CitleHRlcm4gc3RydWN0IHNuZF9jYXJkICphb2FfZ2V0X2NhcmQodm9pZCk7CitleHRlcm4gaW50IGFvYV9zbmRfY3RsX2FkZChzdHJ1Y3Qgc25kX2tjb250cm9sKiBjb250cm9sKTsKKworLyogR1BJTyBzdHVmZiAqLworZXh0ZXJuIHN0cnVjdCBncGlvX21ldGhvZHMgKnBtZl9ncGlvX21ldGhvZHM7CitleHRlcm4gc3RydWN0IGdwaW9fbWV0aG9kcyAqZnRyX2dwaW9fbWV0aG9kczsKKy8qIGV4dGVybiBzdHJ1Y3QgZ3Bpb19tZXRob2RzICptYXBfZ3Bpb19tZXRob2RzOyAqLworCisjZW5kaWYgLyogX19BT0FfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9LY29uZmlnIGIvc291bmQvYW9hL2NvZGVjcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2Y1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29kZWNzL0tjb25maWcKQEAgLTAsMCArMSwzMiBAQAorY29uZmlnIFNORF9BT0FfT05ZWAorCXRyaXN0YXRlICJzdXBwb3J0IE9ueXggY2hpcCIKKwlkZXBlbmRzIG9uIFNORF9BT0EKKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgT255eCAocGNtMzA1MikKKwljb2RlYyBjaGlwIGZvdW5kIGluIHRoZSBsYXRlc3QgQXBwbGUgbWFjaGluZXMKKwkobW9zdCBvZiB0aG9zZSB3aXRoIGRpZ2l0YWwgYXVkaW8gb3V0cHV0KS4KKworI2NvbmZpZyBTTkRfQU9BX1RPUEFaCisjCXRyaXN0YXRlICJzdXBwb3J0IFRvcGF6IGNoaXBzIgorIwlkZXBlbmRzIG9uIFNORF9BT0EKKyMJLS0taGVscC0tLQorIwlUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBUb3BheiAoQ1M4NHh4KQorIwljb2RlYyBjaGlwcyBmb3VuZCBpbiB0aGUgbGF0ZXN0IEFwcGxlIG1hY2hpbmVzLAorIwl0aGVzZSBjaGlwcyBkbyB0aGUgZGlnaXRhbCBpbnB1dCBhbmQgb3V0cHV0IG9uCisjCXNvbWUgUG93ZXJNYWNzLgorCitjb25maWcgU05EX0FPQV9UQVMKKwl0cmlzdGF0ZSAic3VwcG9ydCBUQVMgY2hpcHMiCisJZGVwZW5kcyBvbiBTTkRfQU9BCisJLS0taGVscC0tLQorCVRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHRhcyBjaGlwcworCWZvdW5kIGluIGEgbG90IG9mIEFwcGxlIE1hY2hpbmVzLCBlc3BlY2lhbGx5CisJaUJvb2tzIGFuZCBQb3dlckJvb2tzIHdpdGhvdXQgZGlnaXRhbC4KKworY29uZmlnIFNORF9BT0FfVE9PTklFCisJdHJpc3RhdGUgInN1cHBvcnQgVG9vbmllIGNoaXAiCisJZGVwZW5kcyBvbiBTTkRfQU9BCisJLS0taGVscC0tLQorCVRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIHRvb25pZSBjb2RlYworCWZvdW5kIGluIHRoZSBNYWMgTWluaS4gSWYgeW91IGhhdmUgYSBNYWMgTWluaSBhbmQKKwl3YW50IHRvIGhlYXIgc291bmQsIHNlbGVjdCB0aGlzIG9wdGlvbi4KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3MvTWFrZWZpbGUgYi9zb3VuZC9hb2EvY29kZWNzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2JlNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29kZWNzL01ha2VmaWxlCkBAIC0wLDAgKzEsMyBAQAorb2JqLSQoQ09ORklHX1NORF9BT0FfT05ZWCkgKz0gc25kLWFvYS1jb2RlYy1vbnl4Lm8KK29iai0kKENPTkZJR19TTkRfQU9BX1RBUykgKz0gc25kLWFvYS1jb2RlYy10YXMubworb2JqLSQoQ09ORklHX1NORF9BT0FfVE9PTklFKSArPSBzbmQtYW9hLWNvZGVjLXRvb25pZS5vCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtb255eC5jIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc2NTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguYwpAQCAtMCwwICsxLDExMTMgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIGRyaXZlciBmb3IgT255eCBjb2RlYworICoKKyAqIENvcHlyaWdodCAyMDA2IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogR1BMIHYyLCBjYW4gYmUgZm91bmQgaW4gQ09QWUlORy4KKyAqCisgKgorICogVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIHBjbTMwNTIgY29kZWMgY2hpcCAoY29kZW5hbWVkIE9ueXgpCisgKiB0aGF0IGlzIHByZXNlbnQgaW4gbmV3ZXIgQXBwbGUgaGFyZHdhcmUgKHdpdGggZGlnaXRhbCBvdXRwdXQpLgorICoKKyAqIFRoZSBPbnl4IGNvZGVjIGhhcyB0aGUgZm9sbG93aW5nIGNvbm5lY3Rpb25zIChsaXN0ZWQgYnkgdGhlIGJpdAorICogdG8gYmUgdXNlZCBpbiBhb2FfY29kZWMuY29ubmVjdGVkKToKKyAqICAwOiBhbmFsb2cgb3V0cHV0CisgKiAgMTogZGlnaXRhbCBvdXRwdXQKKyAqICAyOiBsaW5lIGlucHV0CisgKiAgMzogbWljcm9waG9uZSBpbnB1dAorICogTm90ZSB0aGF0IGV2ZW4gdGhvdWdoIEkga25vdyBvZiBubyBtYWNoaW5lIHRoYXQgaGFzIGZvciBleGFtcGxlCisgKiB0aGUgZGlnaXRhbCBvdXRwdXQgY29ubmVjdGVkIGJ1dCBub3QgdGhlIGFuYWxvZywgSSBoYXZlIGhhbmRsZWQKKyAqIGFsbCB0aGUgZGlmZmVyZW50IGNhc2VzIGluIHRoZSBjb2RlIHNvIHRoYXQgdGhpcyBkcml2ZXIgbWF5IHNlcnZlCisgKiBhcyBhIGdvb2QgZXhhbXBsZSBvZiB3aGF0IHRvIGRvLgorICoKKyAqIE5PVEU6IFRoaXMgZHJpdmVyIGFzc3VtZXMgdGhhdCB0aGVyZSdzIGF0IG1vc3Qgb25lIGNoaXAgdG8gYmUKKyAqIAkgdXNlZCB3aXRoIG9uZSBhbHNhIGNhcmQsIGluIGZvcm0gb2YgY3JlYXRpbmcgYWxsIGtpbmRzCisgKgkgb2YgbWl4ZXIgZWxlbWVudHMgd2l0aG91dCByZWdhcmQgZm9yIHRoZWlyIGV4aXN0ZW5jZS4KKyAqCSBCdXQgc25kLWFvYSBhc3N1bWVzIHRoYXQgdGhlcmUncyBhdCBtb3N0IG9uZSBjYXJkLCBzbworICoJIHRoaXMgbWVhbnMgeW91IGNhbiBvbmx5IGhhdmUgb25lIG9ueXggb24gYSBzeXN0ZW0uIFRoaXMKKyAqCSBzaG91bGQgcHJvYmFibHkgYmUgZml4ZWQgYnkgY2hhbmdpbmcgdGhlIGFzc3VtcHRpb24gb2YKKyAqCSBoYXZpbmcganVzdCBhIHNpbmdsZSBjYXJkIG9uIGEgc3lzdGVtLCBhbmQgbWFraW5nIHRoZQorICoJICdjYXJkJyBwb2ludGVyIGFjY2Vzc2libGUgdG8gYW55b25lIHdobyBuZWVkcyBpdCBpbnN0ZWFkCisgKgkgb2YgaGlkaW5nIGl0IGluIHRoZSBhb2Ffc25kXyogZnVuY3Rpb25zLi4uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInBjbTMwNTIgKG9ueXgpIGNvZGVjIGRyaXZlciBmb3Igc25kLWFvYSIpOworCisjaW5jbHVkZSAic25kLWFvYS1jb2RlYy1vbnl4LmgiCisjaW5jbHVkZSAiLi4vYW9hLmgiCisjaW5jbHVkZSAiLi4vc291bmRidXMvc291bmRidXMuaCIKKworCisjZGVmaW5lIFBGWCAic25kLWFvYS1jb2RlYy1vbnl4OiAiCisKK3N0cnVjdCBvbnl4IHsKKwkvKiBjYWNoZSByZWdpc3RlcnMgNjUgdG8gODAsIHRoZXkgYXJlIHdyaXRlLW9ubHkhICovCisJdTgJCQljYWNoZVsxNl07CisJc3RydWN0IGkyY19jbGllbnQJaTJjOworCXN0cnVjdCBhb2FfY29kZWMJY29kZWM7CisJdTMyCQkJaW5pdGlhbGlzZWQ6MSwKKwkJCQlzcGRpZl9sb2NrZWQ6MSwKKwkJCQlhbmFsb2dfbG9ja2VkOjEsCisJCQkJb3JpZ2luYWxfbXV0ZToyOworCWludAkJCW9wZW5fY291bnQ7CisJc3RydWN0IGNvZGVjX2luZm8JKmNvZGVjX2luZm87CisKKwkvKiBtdXRleCBzZXJpYWxpemVzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBkZXZpY2UKKwkgKiBhbmQgdGhpcyBzdHJ1Y3R1cmUuCisJICovCisJc3RydWN0IG11dGV4IG11dGV4OworfTsKKyNkZWZpbmUgY29kZWNfdG9fb255eChjKSBjb250YWluZXJfb2YoYywgc3RydWN0IG9ueXgsIGNvZGVjKQorCisvKiBib3RoIHJldHVybiAwIGlmIGFsbCBvaywgZWxzZSBvbiBlcnJvciAqLworc3RhdGljIGludCBvbnl4X3JlYWRfcmVnaXN0ZXIoc3RydWN0IG9ueXggKm9ueXgsIHU4IHJlZywgdTggKnZhbHVlKQoreworCXMzMiB2OworCisJaWYgKHJlZyAhPSBPTllYX1JFR19DT05UUk9MKSB7CisJCSp2YWx1ZSA9IG9ueXgtPmNhY2hlW3JlZy1GSVJTVFJFR0lTVEVSXTsKKwkJcmV0dXJuIDA7CisJfQorCXYgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoJm9ueXgtPmkyYywgcmVnKTsKKwlpZiAodiA8IDApCisJCXJldHVybiAtMTsKKwkqdmFsdWUgPSAodTgpdjsKKwlvbnl4LT5jYWNoZVtPTllYX1JFR19DT05UUk9MLUZJUlNUUkVHSVNURVJdID0gKnZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9ueXhfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IG9ueXggKm9ueXgsIHU4IHJlZywgdTggdmFsdWUpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoJm9ueXgtPmkyYywgcmVnLCB2YWx1ZSk7CisJaWYgKCFyZXN1bHQpCisJCW9ueXgtPmNhY2hlW3JlZy1GSVJTVFJFR0lTVEVSXSA9IHZhbHVlOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGFsc2Egc3R1ZmYgKi8KKworc3RhdGljIGludCBvbnl4X2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKKwkuZGV2X3JlZ2lzdGVyID0gb255eF9kZXZfcmVnaXN0ZXIsCit9OworCisvKiB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG1vc3QgYWxzYSBtaXhlciBwcm9ncmFtcworICogY2FuJ3QgcHJvcGVybHkgaGFuZGxlIHRoZSBuZWdhdGl2ZSByYW5nZSAqLworI2RlZmluZSBWT0xVTUVfUkFOR0VfU0hJRlQJMTI4CisKK3N0YXRpYyBpbnQgb255eF9zbmRfdm9sX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IC0xMjggKyBWT0xVTUVfUkFOR0VfU0hJRlQ7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gLTEgKyBWT0xVTUVfUkFOR0VfU0hJRlQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zbmRfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzOCBsLCByOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQVRURU5fTEVGVCwgJmwpOworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQVRURU5fUklHSFQsICZyKTsKKwltdXRleF91bmxvY2soJm9ueXgtPm11dGV4KTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbCArIFZPTFVNRV9SQU5HRV9TSElGVDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHIgKyBWT0xVTUVfUkFOR0VfU0hJRlQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbnl4X3NuZF92b2xfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXM4IGwsIHI7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RBQ19BVFRFTl9MRUZULCAmbCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RBQ19BVFRFTl9SSUdIVCwgJnIpOworCisJaWYgKGwgKyBWT0xVTUVfUkFOR0VfU0hJRlQgPT0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiYKKwkgICAgciArIFZPTFVNRV9SQU5HRV9TSElGVCA9PSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgeworCQltdXRleF91bmxvY2soJm9ueXgtPm11dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJb255eF93cml0ZV9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQVRURU5fTEVGVCwKKwkJCSAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXQorCQkJICAgICAtIFZPTFVNRV9SQU5HRV9TSElGVCk7CisJb255eF93cml0ZV9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQVRURU5fUklHSFQsCisJCQkgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0KKwkJCSAgICAgLSBWT0xVTUVfUkFOR0VfU0hJRlQpOworCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB2b2x1bWVfY29udHJvbCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IG9ueXhfc25kX3ZvbF9pbmZvLAorCS5nZXQgPSBvbnl4X3NuZF92b2xfZ2V0LAorCS5wdXQgPSBvbnl4X3NuZF92b2xfcHV0LAorfTsKKworLyogbGlrZSBhYm92ZSwgdGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhIGxvdAorICogb2YgYWxzYSBtaXhlciBwcm9ncmFtcyBkb24ndCBoYW5kbGUgcmFuZ2VzCisgKiB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgcHJvcGVybHkuCisgKiBldmVuIGFsc2FtaXhlciBpcyBvbmUgb2YgdGhlbS4uLiAqLworI2RlZmluZSBJTlBVVEdBSU5fUkFOR0VfU0hJRlQJKC0zKQorCitzdGF0aWMgaW50IG9ueXhfc25kX2lucHV0Z2Fpbl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAzICsgSU5QVVRHQUlOX1JBTkdFX1NISUZUOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDI4ICsgSU5QVVRHQUlOX1JBTkdFX1NISUZUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9ueXhfc25kX2lucHV0Z2Fpbl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggaWc7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0FEQ19DT05UUk9MLCAmaWcpOworCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQorCQkoaWcgJiBPTllYX0FEQ19QR0FfR0FJTl9NQVNLKSArIElOUFVUR0FJTl9SQU5HRV9TSElGVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9ueXhfc25kX2lucHV0Z2Fpbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggdiwgbjsKKworCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKKwlvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfQURDX0NPTlRST0wsICZ2KTsKKwluID0gdjsKKwluICY9IH5PTllYX0FEQ19QR0FfR0FJTl9NQVNLOworCW4gfD0gKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdIC0gSU5QVVRHQUlOX1JBTkdFX1NISUZUKQorCQkmIE9OWVhfQURDX1BHQV9HQUlOX01BU0s7CisJb255eF93cml0ZV9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19BRENfQ09OVFJPTCwgbik7CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwlyZXR1cm4gbiAhPSB2OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaW5wdXRnYWluX2NvbnRyb2wgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTWFzdGVyIENhcHR1cmUgVm9sdW1lIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IG9ueXhfc25kX2lucHV0Z2Fpbl9pbmZvLAorCS5nZXQgPSBvbnl4X3NuZF9pbnB1dGdhaW5fZ2V0LAorCS5wdXQgPSBvbnl4X3NuZF9pbnB1dGdhaW5fcHV0LAorfTsKKworc3RhdGljIGludCBvbnl4X3NuZF9jYXB0dXJlX3NvdXJjZV9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJMaW5lLUluIiwgIk1pY3JvcGhvbmUiIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsKKwlpZiAodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA+IDEpCisJCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAxOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zbmRfY2FwdHVyZV9zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXM4IHY7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0FEQ19DT05UUk9MLCAmdik7CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gISEodiZPTllYX0FEQ19JTlBVVF9NSUMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9ueXhfc2V0X2NhcHR1cmVfc291cmNlKHN0cnVjdCBvbnl4ICpvbnl4LCBpbnQgbWljKQoreworCXM4IHY7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0FEQ19DT05UUk9MLCAmdik7CisJdiAmPSB+T05ZWF9BRENfSU5QVVRfTUlDOworCWlmIChtaWMpCisJCXYgfD0gT05ZWF9BRENfSU5QVVRfTUlDOworCW9ueXhfd3JpdGVfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfQURDX0NPTlRST0wsIHYpOworCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IG9ueXhfc25kX2NhcHR1cmVfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlvbnl4X3NldF9jYXB0dXJlX3NvdXJjZShzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCksCisJCQkJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjYXB0dXJlX3NvdXJjZV9jb250cm9sID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qIElmIHdlIG5hbWUgdGhpcyAnSW5wdXQgU291cmNlJywgaXQgcHJvcGVybHkgc2hvd3MgdXAgaW4KKwkgKiBhbHNhbWl4ZXIgYXMgYSBzZWxlY3Rpb24sICogYnV0IGl0J3Mgc2hvd24gdW5kZXIgdGhlIAorCSAqICdQbGF5YmFjaycgY2F0ZWdvcnkuCisJICogSWYgSSBuYW1lIGl0ICdDYXB0dXJlIFNvdXJjZScsIGl0IHNob3dzIHVwIGluIHN0cmFuZ2UKKwkgKiB3YXlzICh0d28gYm9vbHMgb2Ygd2hpY2ggb25lIGNhbiBiZSBzZWxlY3RlZCBhdCBhCisJICogdGltZSkgYnV0IGF0IGxlYXN0IGl0J3Mgc2hvd24gaW4gdGhlICdDYXB0dXJlJworCSAqIGNhdGVnb3J5LgorCSAqIEkgd2FzIHRvbGQgdGhhdCB0aGlzIHdhcyBkdWUgdG8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKKwkgKiBidXQgSSBkb24ndCB1bmRlcnN0YW5kIHRoZW4gd2h5IHRoZSBtYW5nbGluZyBpcyAqbm90KgorCSAqIGRvbmUgd2hlbiBJIG5hbWUgaXQgIklucHV0IFNvdXJjZSIuLi4uLgorCSAqLworCS5uYW1lID0gIkNhcHR1cmUgU291cmNlIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IG9ueXhfc25kX2NhcHR1cmVfc291cmNlX2luZm8sCisJLmdldCA9IG9ueXhfc25kX2NhcHR1cmVfc291cmNlX2dldCwKKwkucHV0ID0gb255eF9zbmRfY2FwdHVyZV9zb3VyY2VfcHV0LAorfTsKKworc3RhdGljIGludCBvbnl4X3NuZF9tdXRlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvbnl4X3NuZF9tdXRlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1OCBjOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQ09OVFJPTCwgJmMpOworCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhKGMgJiBPTllYX01VVEVfTEVGVCk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSAhKGMgJiBPTllYX01VVEVfUklHSFQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zbmRfbXV0ZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggdiA9IDAsIGMgPSAwOworCWludCBlcnIgPSAtRUJVU1k7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJaWYgKG9ueXgtPmFuYWxvZ19sb2NrZWQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQ09OVFJPTCwgJnYpOworCWMgPSB2OworCWMgJj0gfihPTllYX01VVEVfUklHSFQgfCBPTllYX01VVEVfTEVGVCk7CisJaWYgKCF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKKwkJYyB8PSBPTllYX01VVEVfTEVGVDsKKwlpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKQorCQljIHw9IE9OWVhfTVVURV9SSUdIVDsKKwllcnIgPSBvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RBQ19DT05UUk9MLCBjKTsKKworIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwlyZXR1cm4gIWVyciA/ICh2ICE9IGMpIDogZXJyOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbXV0ZV9jb250cm9sID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pbmZvID0gb255eF9zbmRfbXV0ZV9pbmZvLAorCS5nZXQgPSBvbnl4X3NuZF9tdXRlX2dldCwKKwkucHV0ID0gb255eF9zbmRfbXV0ZV9wdXQsCit9OworCisKK3N0YXRpYyBpbnQgb255eF9zbmRfc2luZ2xlX2JpdF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU47CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgRkxBR19QT0xBUklUWV9JTlZFUlQJMQorI2RlZmluZSBGTEFHX1NQRElGTE9DSwkJMgorCitzdGF0aWMgaW50IG9ueXhfc25kX3NpbmdsZV9iaXRfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IGM7CisJbG9uZyBpbnQgcHYgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1OCBwb2xhcml0eSA9IChwdiA+PiAxNikgJiBGTEFHX1BPTEFSSVRZX0lOVkVSVDsKKwl1OCBhZGRyZXNzID0gKHB2ID4+IDgpICYgMHhmZjsKKwl1OCBtYXNrID0gcHYgJiAweGZmOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBhZGRyZXNzLCAmYyk7CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9ICEhKGMgJiBtYXNrKSBeIHBvbGFyaXR5OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zbmRfc2luZ2xlX2JpdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggdiA9IDAsIGMgPSAwOworCWludCBlcnI7CisJbG9uZyBpbnQgcHYgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1OCBwb2xhcml0eSA9IChwdiA+PiAxNikgJiBGTEFHX1BPTEFSSVRZX0lOVkVSVDsKKwl1OCBzcGRpZmxvY2sgPSAocHYgPj4gMTYpICYgRkxBR19TUERJRkxPQ0s7CisJdTggYWRkcmVzcyA9IChwdiA+PiA4KSAmIDB4ZmY7CisJdTggbWFzayA9IHB2ICYgMHhmZjsKKworCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKKwlpZiAoc3BkaWZsb2NrICYmIG9ueXgtPnNwZGlmX2xvY2tlZCkgeworCQkvKiBldmVuIGlmIGFsc2FtaXhlciBkb2Vzbid0IGNhcmUuLiAqLworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIGFkZHJlc3MsICZ2KTsKKwljID0gdjsKKwljICY9IH4obWFzayk7CisJaWYgKCEhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gXiBwb2xhcml0eSkKKwkJYyB8PSBtYXNrOworCWVyciA9IG9ueXhfd3JpdGVfcmVnaXN0ZXIob255eCwgYWRkcmVzcywgYyk7CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJcmV0dXJuICFlcnIgPyAodiAhPSBjKSA6IGVycjsKK30KKworI2RlZmluZSBTSU5HTEVfQklUKG4sIHR5cGUsIGRlc2NyaXB0aW9uLCBhZGRyZXNzLCBtYXNrLCBmbGFncykJIAlcCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbiMjX2NvbnRyb2wgPSB7CQkJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV8jI3R5cGUsCQkJCVwKKwkubmFtZSA9IGRlc2NyaXB0aW9uLAkJCQkJCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwJCQlcCisJLmluZm8gPSBvbnl4X3NuZF9zaW5nbGVfYml0X2luZm8sCQkJCVwKKwkuZ2V0ID0gb255eF9zbmRfc2luZ2xlX2JpdF9nZXQsCQkJCQlcCisJLnB1dCA9IG9ueXhfc25kX3NpbmdsZV9iaXRfcHV0LAkJCQkJXAorCS5wcml2YXRlX3ZhbHVlID0gKGZsYWdzIDw8IDE2KSB8IChhZGRyZXNzIDw8IDgpIHwgbWFzawkJXAorfQorCitTSU5HTEVfQklUKHNwZGlmLAorCSAgIE1JWEVSLAorCSAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIiwgUExBWUJBQ0ssIFNXSVRDSCksCisJICAgT05ZWF9SRUdfRElHX0lORk80LAorCSAgIE9OWVhfU1BESUZfRU5BQkxFLAorCSAgIEZMQUdfU1BESUZMT0NLKTsKK1NJTkdMRV9CSVQob3ZyMSwKKwkgICBNSVhFUiwKKwkgICAiT3ZlcnNhbXBsaW5nIFJhdGUiLAorCSAgIE9OWVhfUkVHX0RBQ19DT05UUk9MLAorCSAgIE9OWVhfT1ZSMSwKKwkgICAwKTsKK1NJTkdMRV9CSVQoZmx0MCwKKwkgICBNSVhFUiwKKwkgICAiRmFzdCBEaWdpdGFsIEZpbHRlciBSb2xsb2ZmIiwKKwkgICBPTllYX1JFR19EQUNfRklMVEVSLAorCSAgIE9OWVhfUk9MTE9GRl9GQVNULAorCSAgIEZMQUdfUE9MQVJJVFlfSU5WRVJUKTsKK1NJTkdMRV9CSVQoaHBmLAorCSAgIE1JWEVSLAorCSAgICJIaWdocGFzcyBGaWx0ZXIiLAorCSAgIE9OWVhfUkVHX0FEQ19IUEZfQllQQVNTLAorCSAgIE9OWVhfSFBGX0RJU0FCTEUsCisJICAgRkxBR19QT0xBUklUWV9JTlZFUlQpOworU0lOR0xFX0JJVChkbTEyLAorCSAgIE1JWEVSLAorCSAgICJEaWdpdGFsIERlLUVtcGhhc2lzIiwKKwkgICBPTllYX1JFR19EQUNfREVFTVBILAorCSAgIE9OWVhfRElHREVFTVBIX0NUUkwsCisJICAgMCk7CisKK3N0YXRpYyBpbnQgb255eF9zcGRpZl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OworCXVpbmZvLT5jb3VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zcGRpZl9tYXNrX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwkvKiBkYXRhc2hlZXQgcGFnZSAzMCwgYWxsIG90aGVycyBhcmUgMCAqLworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHgzZTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA9IDB4M2Y7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbNF0gPSAweDBmOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb255eF9zcGRpZl9tYXNrID0geworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLm5hbWUgPQkJU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLENPTl9NQVNLKSwKKwkuaW5mbyA9CQlvbnl4X3NwZGlmX2luZm8sCisJLmdldCA9CQlvbnl4X3NwZGlmX21hc2tfZ2V0LAorfTsKKworc3RhdGljIGludCBvbnl4X3NwZGlmX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTggdjsKKworCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKKwlvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfRElHX0lORk8xLCAmdik7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMF0gPSB2ICYgMHgzZTsKKworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19ESUdfSU5GTzIsICZ2KTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IHY7CisKKwlvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfRElHX0lORk8zLCAmdik7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPSB2ICYgMHgzZjsKKworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19ESUdfSU5GTzQsICZ2KTsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1s0XSA9IHYgJiAweDBmOworCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb255eF9zcGRpZl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXU4IHY7CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RJR19JTkZPMSwgJnYpOworCXYgPSAodiAmIH4weDNlKSB8ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSAmIDB4M2UpOworCW9ueXhfd3JpdGVfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfRElHX0lORk8xLCB2KTsKKworCXYgPSB1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXTsKKwlvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RJR19JTkZPMiwgdik7CisKKwlvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfRElHX0lORk8zLCAmdik7CisJdiA9ICh2ICYgfjB4M2YpIHwgKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdICYgMHgzZik7CisJb255eF93cml0ZV9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19ESUdfSU5GTzMsIHYpOworCisJb255eF9yZWFkX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RJR19JTkZPNCwgJnYpOworCXYgPSAodiAmIH4weDBmKSB8ICh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1s0XSAmIDB4MGYpOworCW9ueXhfd3JpdGVfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfRElHX0lORk80LCB2KTsKKwltdXRleF91bmxvY2soJm9ueXgtPm11dGV4KTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgb255eF9zcGRpZl9jdHJsID0geworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9CQlTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsUExBWUJBQ0ssREVGQVVMVCksCisJLmluZm8gPQkJb255eF9zcGRpZl9pbmZvLAorCS5nZXQgPQkJb255eF9zcGRpZl9nZXQsCisJLnB1dCA9CQlvbnl4X3NwZGlmX3B1dCwKK307CisKKy8qIG91ciByZWdpc3RlcnMgKi8KKworc3RhdGljIHU4IHJlZ2lzdGVyX21hcFtdID0geworCU9OWVhfUkVHX0RBQ19BVFRFTl9MRUZULAorCU9OWVhfUkVHX0RBQ19BVFRFTl9SSUdIVCwKKwlPTllYX1JFR19DT05UUk9MLAorCU9OWVhfUkVHX0RBQ19DT05UUk9MLAorCU9OWVhfUkVHX0RBQ19ERUVNUEgsCisJT05ZWF9SRUdfREFDX0ZJTFRFUiwKKwlPTllYX1JFR19EQUNfT1VUUEhBU0UsCisJT05ZWF9SRUdfQURDX0NPTlRST0wsCisJT05ZWF9SRUdfQURDX0hQRl9CWVBBU1MsCisJT05ZWF9SRUdfRElHX0lORk8xLAorCU9OWVhfUkVHX0RJR19JTkZPMiwKKwlPTllYX1JFR19ESUdfSU5GTzMsCisJT05ZWF9SRUdfRElHX0lORk80Cit9OworCitzdGF0aWMgdTggaW5pdGlhbF92YWx1ZXNbQVJSQVlfU0laRShyZWdpc3Rlcl9tYXApXSA9IHsKKwkweDgwLCAweDgwLCAvKiBtdXRlZCAqLworCU9OWVhfTVJTVCB8IE9OWVhfU1JTVCwgLyogYnV0IGhhbmRsZWQgc3BlY2lhbGx5ISAqLworCU9OWVhfTVVURV9MRUZUIHwgT05ZWF9NVVRFX1JJR0hULAorCTAsIC8qIG5vIGRlZW1waGFzaXMgKi8KKwlPTllYX0RBQ19GSUxURVJfQUxXQVlTLAorCU9OWVhfT1VUUEhBU0VfSU5WRVJURUQsCisJKC0xIC8qZEIqLyArIDgpICYgMHhGLCAvKiBsaW5lIGluIHNlbGVjdGVkLCAtMSBkQiBnYWluKi8KKwlPTllYX0FEQ19IUEZfQUxXQVlTLAorCSgxPDwyKSwJLyogcGNtIGF1ZGlvICovCisJMiwJLyogY2F0ZWdvcnk6IHBjbSBjb2RlciAqLworCTAsCS8qIHNhbXBsaW5nIGZyZXF1ZW5jeSA0NC4xIGtIeiwgY2xvY2sgYWNjdXJhY3kgbGV2ZWwgSUkgKi8KKwkxCS8qIDI0IGJpdCBkZXB0aCAqLworfTsKKworLyogcmVzZXQgcmVnaXN0ZXJzIG9mIGNoaXAsIGVpdGhlciB0byBpbml0aWFsIG9yIHRvIHByZXZpb3VzIHZhbHVlcyAqLworc3RhdGljIGludCBvbnl4X3JlZ2lzdGVyX2luaXQoc3RydWN0IG9ueXggKm9ueXgpCit7CisJaW50IGk7CisJdTggdmFsOworCXU4IHJlZ3Nbc2l6ZW9mKGluaXRpYWxfdmFsdWVzKV07CisKKwlpZiAoIW9ueXgtPmluaXRpYWxpc2VkKSB7CisJCW1lbWNweShyZWdzLCBpbml0aWFsX3ZhbHVlcywgc2l6ZW9mKGluaXRpYWxfdmFsdWVzKSk7CisJCWlmIChvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfQ09OVFJPTCwgJnZhbCkpCisJCQlyZXR1cm4gLTE7CisJCXZhbCAmPSB+T05ZWF9TSUxJQ09OVkVSU0lPTjsKKwkJdmFsIHw9IGluaXRpYWxfdmFsdWVzWzNdOworCQlyZWdzWzNdID0gdmFsOworCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpPHNpemVvZihyZWdpc3Rlcl9tYXApOyBpKyspCisJCQlyZWdzW2ldID0gb255eC0+Y2FjaGVbcmVnaXN0ZXJfbWFwW2ldLUZJUlNUUkVHSVNURVJdOworCX0KKworCWZvciAoaT0wOyBpPHNpemVvZihyZWdpc3Rlcl9tYXApOyBpKyspIHsKKwkJaWYgKG9ueXhfd3JpdGVfcmVnaXN0ZXIob255eCwgcmVnaXN0ZXJfbWFwW2ldLCByZWdzW2ldKSkKKwkJCXJldHVybiAtMTsKKwl9CisJb255eC0+aW5pdGlhbGlzZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRyYW5zZmVyX2luZm8gb255eF90cmFuc2ZlcnNbXSA9IHsKKwkvKiB0aGlzIGlzIGZpcnN0IHNvIHdlIGNhbiBza2lwIGl0IGlmIG5vIGlucHV0IGlzIHByZXNlbnQuLi4KKwkgKiBObyBoYXJkd2FyZSBleGlzdHMgd2l0aCB0aGF0LCBidXQgaXQncyBoZXJlIGFzIGFuIGV4YW1wbGUKKwkgKiBvZiB3aGF0IHRvIGRvIDopICovCisJeworCQkvKiBhbmFsb2cgaW5wdXQgKi8KKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1M4IHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkudHJhbnNmZXJfaW4gPSAxLAorCQkubXVzdF9iZV9jbG9ja19zb3VyY2UgPSAwLAorCQkudGFnID0gMCwKKwl9LAorCXsKKwkJLyogaWYgYW5hbG9nIGFuZCBkaWdpdGFsIGFyZSBjdXJyZW50bHkgb2ZmLCBhbnl0aGluZyBzaG91bGQgZ28sCisJCSAqIHNvIHRoaXMgZW50cnkgZGVzY3JpYmVzIGV2ZXJ5dGhpbmcgd2UgY2FuIGRvLi4uICovCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TOCB8CisJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8CisJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRQorI2lmZGVmIFNORFJWX1BDTV9GTVRCSVRfQ09NUFJFU1NFRF8xNkJFCisJCQkgICB8IFNORFJWX1BDTV9GTVRCSVRfQ09NUFJFU1NFRF8xNkJFCisjZW5kaWYKKwkJLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwLAorCQkudGFnID0gMCwKKwl9LAorCXsKKwkJLyogYW5hbG9nIG91dHB1dCAqLworCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzggfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAsCisJCS50cmFuc2Zlcl9pbiA9IDAsCisJCS5tdXN0X2JlX2Nsb2NrX3NvdXJjZSA9IDAsCisJCS50YWcgPSAxLAorCX0sCisJeworCQkvKiBkaWdpdGFsIHBjbSBvdXRwdXQsIGFsc28gcG9zc2libGUgZm9yIGFuYWxvZyBvdXQgKi8KKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1M4IHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkudHJhbnNmZXJfaW4gPSAwLAorCQkubXVzdF9iZV9jbG9ja19zb3VyY2UgPSAwLAorCQkudGFnID0gMiwKKwl9LAorI2lmZGVmIFNORFJWX1BDTV9GTVRCSVRfQ09NUFJFU1NFRF8xNkJFCitPbmNlIGFsc2EgZ2V0cyBzdXBwb3J0cyBmb3IgdGhpcyBraW5kIG9mIHRoaW5nIHdlIGNhbiBhZGQgaXQuLi4KKwl7CisJCS8qIGRpZ2l0YWwgY29tcHJlc3NlZCBvdXRwdXQgKi8KKwkJLmZvcm1hdHMgPSAgU05EUlZfUENNX0ZNVEJJVF9DT01QUkVTU0VEXzE2QkUsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV80NDEwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS50YWcgPSAyLAorCX0sCisjZW5kaWYKKwl7fQorfTsKKworc3RhdGljIGludCBvbnl4X3VzYWJsZShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksCisJCSAgICAgICBzdHJ1Y3QgdHJhbnNmZXJfaW5mbyAqdGksCisJCSAgICAgICBzdHJ1Y3QgdHJhbnNmZXJfaW5mbyAqb3V0KQoreworCXU4IHY7CisJc3RydWN0IG9ueXggKm9ueXggPSBjaWktPmNvZGVjX2RhdGE7CisJaW50IHNwZGlmX2VuYWJsZWQsIGFuYWxvZ19lbmFibGVkOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19ESUdfSU5GTzQsICZ2KTsKKwlzcGRpZl9lbmFibGVkID0gISEodiAmIE9OWVhfU1BESUZfRU5BQkxFKTsKKwlvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfREFDX0NPTlRST0wsICZ2KTsKKwlhbmFsb2dfZW5hYmxlZCA9IAorCQkodiAmIChPTllYX01VVEVfUklHSFR8T05ZWF9NVVRFX0xFRlQpKQorCQkgIT0gKE9OWVhfTVVURV9SSUdIVHxPTllYX01VVEVfTEVGVCk7CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwlzd2l0Y2ggKHRpLT50YWcpIHsKKwljYXNlIDA6IHJldHVybiAxOworCWNhc2UgMToJcmV0dXJuIGFuYWxvZ19lbmFibGVkOworCWNhc2UgMjogcmV0dXJuIHNwZGlmX2VuYWJsZWQ7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG9ueXhfcHJlcGFyZShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksCisJCQlzdHJ1Y3QgYnVzX2luZm8gKmJpLAorCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJdTggdjsKKwlzdHJ1Y3Qgb255eCAqb255eCA9IGNpaS0+Y29kZWNfZGF0YTsKKwlpbnQgZXJyID0gLUVCVVNZOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCisjaWZkZWYgU05EUlZfUENNX0ZNVEJJVF9DT01QUkVTU0VEXzE2QkUKKwlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5mb3JtYXQgPT0gU05EUlZfUENNX0ZNVEJJVF9DT01QUkVTU0VEXzE2QkUpIHsKKwkJLyogbXV0ZSBhbmQgbG9jayBhbmFsb2cgb3V0cHV0ICovCisJCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19EQUNfQ09OVFJPTCwgJnYpOworCQlpZiAob255eF93cml0ZV9yZWdpc3Rlcihvbnl4CisJCQkJCU9OWVhfUkVHX0RBQ19DT05UUk9MLAorCQkJCQl2IHwgT05ZWF9NVVRFX1JJR0hUIHwgT05ZWF9NVVRFX0xFRlQpKQorCQkJZ290byBvdXRfdW5sb2NrOworCQlvbnl4LT5hbmFsb2dfbG9ja2VkID0gMTsKKwkJZXJyID0gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKyNlbmRpZgorCXN3aXRjaCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSAzMjAwMDoKKwljYXNlIDQ0MTAwOgorCWNhc2UgNDgwMDA6CisJCS8qIHRoZXNlIHJhdGVzIGFyZSBvayBmb3IgYWxsIG91dHB1dHMgKi8KKwkJLyogRklYTUU6IHByb2dyYW0gc3BkaWYgY2hhbm5lbCBjb250cm9sIGJpdHMgaGVyZSBzbyB0aGF0CisJCSAqCSAgdXNlcnNwYWNlIGRvZXNuJ3QgaGF2ZSB0byBpZiBpdCBvbmx5IHBsYXlzIHBjbSEgKi8KKwkJZXJyID0gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCWRlZmF1bHQ6CisJCS8qIGdvdCBzb21lIHJhdGUgdGhhdCB0aGUgZGlnaXRhbCBvdXRwdXQgY2FuJ3QgZG8sCisJCSAqIHNvIGRpc2FibGUgYW5kIGxvY2sgaXQgKi8KKwkJb255eF9yZWFkX3JlZ2lzdGVyKGNpaS0+Y29kZWNfZGF0YSwgT05ZWF9SRUdfRElHX0lORk80LCAmdik7CisJCWlmIChvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsCisJCQkJCU9OWVhfUkVHX0RJR19JTkZPNCwKKwkJCQkJdiAmIH5PTllYX1NQRElGX0VOQUJMRSkpCisJCQlnb3RvIG91dF91bmxvY2s7CisJCW9ueXgtPnNwZGlmX2xvY2tlZCA9IDE7CisJCWVyciA9IDA7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvbnl4X29wZW4oc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLAorCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gY2lpLT5jb2RlY19kYXRhOworCisJbXV0ZXhfbG9jaygmb255eC0+bXV0ZXgpOworCW9ueXgtPm9wZW5fY291bnQrKzsKKwltdXRleF91bmxvY2soJm9ueXgtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9ueXhfY2xvc2Uoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLAorCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IGNpaS0+Y29kZWNfZGF0YTsKKworCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKKwlvbnl4LT5vcGVuX2NvdW50LS07CisJaWYgKCFvbnl4LT5vcGVuX2NvdW50KQorCQlvbnl4LT5zcGRpZl9sb2NrZWQgPSBvbnl4LT5hbmFsb2dfbG9ja2VkID0gMDsKKwltdXRleF91bmxvY2soJm9ueXgtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9ueXhfc3dpdGNoX2Nsb2NrKHN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaSwKKwkJCSAgICAgZW51bSBjbG9ja19zd2l0Y2ggd2hhdCkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IGNpaS0+Y29kZWNfZGF0YTsKKworCW11dGV4X2xvY2soJm9ueXgtPm11dGV4KTsKKwkvKiB0aGlzICpNVVNUKiBiZSBtb3JlIGVsYWJvcmF0ZSBsYXRlci4uLiAqLworCXN3aXRjaCAod2hhdCkgeworCWNhc2UgQ0xPQ0tfU1dJVENIX1BSRVBBUkVfU0xBVkU6CisJCW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPmFsbF9hbXBzX29mZihvbnl4LT5jb2RlYy5ncGlvKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19TV0lUQ0hfU0xBVkU6CisJCW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPmFsbF9hbXBzX3Jlc3RvcmUob255eC0+Y29kZWMuZ3Bpbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIHNpbGVuY2Ugd2FybmluZyAqLworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IG9ueXhfc3VzcGVuZChzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IGNpaS0+Y29kZWNfZGF0YTsKKwl1OCB2OworCWludCBlcnIgPSAtRU5YSU87CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJaWYgKG9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19DT05UUk9MLCAmdikpCisJCWdvdG8gb3V0X3VubG9jazsKKwlvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0NPTlRST0wsIHYgfCBPTllYX0FEUFNWIHwgT05ZWF9EQVBTVik7CisJLyogQXBwbGUgZG9lcyBhIHNsZWVwIGhlcmUgYnV0IHRoZSBkYXRhc2hlZXQgc2F5cyB0byBkbyBpdCBvbiByZXN1bWUgKi8KKwllcnIgPSAwOworIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZvbnl4LT5tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9ueXhfcmVzdW1lKHN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaSkKK3sKKwlzdHJ1Y3Qgb255eCAqb255eCA9IGNpaS0+Y29kZWNfZGF0YTsKKwl1OCB2OworCWludCBlcnIgPSAtRU5YSU87CisKKwltdXRleF9sb2NrKCZvbnl4LT5tdXRleCk7CisJLyogdGFrZSBjb2RlYyBvdXQgb2Ygc3VzcGVuZCAqLworCWlmIChvbnl4X3JlYWRfcmVnaXN0ZXIob255eCwgT05ZWF9SRUdfQ09OVFJPTCwgJnYpKQorCQlnb3RvIG91dF91bmxvY2s7CisJb255eF93cml0ZV9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19DT05UUk9MLCB2ICYgfihPTllYX0FEUFNWIHwgT05ZWF9EQVBTVikpOworCS8qIEZJWE1FOiBzaG91bGQgZGl2aWRlIGJ5IHNhbXBsZSByYXRlLCBidXQgOGsgaXMgdGhlIGxvd2VzdCB3ZSBnbyAqLworCW1zbGVlcCgyMjA1MDAwLzgwMDApOworCS8qIHJlc2V0IGFsbCB2YWx1ZXMgKi8KKwlvbnl4X3JlZ2lzdGVyX2luaXQob255eCk7CisJZXJyID0gMDsKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmb255eC0+bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IGNvZGVjX2luZm8gb255eF9jb2RlY19pbmZvID0geworCS50cmFuc2ZlcnMgPSBvbnl4X3RyYW5zZmVycywKKwkuc3lzY2xvY2tfZmFjdG9yID0gMjU2LAorCS5idXNfZmFjdG9yID0gNjQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVzYWJsZSA9IG9ueXhfdXNhYmxlLAorCS5wcmVwYXJlID0gb255eF9wcmVwYXJlLAorCS5vcGVuID0gb255eF9vcGVuLAorCS5jbG9zZSA9IG9ueXhfY2xvc2UsCisJLnN3aXRjaF9jbG9jayA9IG9ueXhfc3dpdGNoX2Nsb2NrLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gb255eF9zdXNwZW5kLAorCS5yZXN1bWUgPSBvbnl4X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBvbnl4X2luaXRfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBjb2RlY190b19vbnl4KGNvZGVjKTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpjdGw7CisJc3RydWN0IGNvZGVjX2luZm8gKmNpID0gJm9ueXhfY29kZWNfaW5mbzsKKwl1OCB2OworCWludCBlcnI7CisKKwlpZiAoIW9ueXgtPmNvZGVjLmdwaW8gfHwgIW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZ3Bpb3Mgbm90IGFzc2lnbmVkISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvbnl4LT5jb2RlYy5ncGlvLT5tZXRob2RzLT5zZXRfaHdfcmVzZXQob255eC0+Y29kZWMuZ3BpbywgMCk7CisJbXNsZWVwKDEpOworCW9ueXgtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldChvbnl4LT5jb2RlYy5ncGlvLCAxKTsKKwltc2xlZXAoMSk7CisJb255eC0+Y29kZWMuZ3Bpby0+bWV0aG9kcy0+c2V0X2h3X3Jlc2V0KG9ueXgtPmNvZGVjLmdwaW8sIDApOworCW1zbGVlcCgxKTsKKwkKKwlpZiAob255eF9yZWdpc3Rlcl9pbml0KG9ueXgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBpbml0aWFsaXNlIG9ueXggcmVnaXN0ZXJzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGFvYV9zbmRfZGV2aWNlX25ldyhTTkRSVl9ERVZfTE9XTEVWRUwsIG9ueXgsICZvcHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBjcmVhdGUgb255eCBzbmQgZGV2aWNlIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIG5vdGhpbmcgY29ubmVjdGVkPyB3aGF0IGEgam9rZSEgKi8KKwlpZiAoKG9ueXgtPmNvZGVjLmNvbm5lY3RlZCAmIDB4RikgPT0gMCkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCS8qIGlmIG5vIGlucHV0cyBhcmUgcHJlc2VudC4uLiAqLworCWlmICgob255eC0+Y29kZWMuY29ubmVjdGVkICYgMHhDKSA9PSAwKSB7CisJCWlmICghb255eC0+Y29kZWNfaW5mbykKKwkJCW9ueXgtPmNvZGVjX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29kZWNfaW5mbyksIEdGUF9LRVJORUwpOworCQlpZiAoIW9ueXgtPmNvZGVjX2luZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY2kgPSBvbnl4LT5jb2RlY19pbmZvOworCQkqY2kgPSBvbnl4X2NvZGVjX2luZm87CisJCWNpLT50cmFuc2ZlcnMrKzsKKwl9CisKKwkvKiBpZiBubyBvdXRwdXRzIGFyZSBwcmVzZW50Li4uICovCisJaWYgKChvbnl4LT5jb2RlYy5jb25uZWN0ZWQgJiAzKSA9PSAwKSB7CisJCWlmICghb255eC0+Y29kZWNfaW5mbykKKwkJCW9ueXgtPmNvZGVjX2luZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29kZWNfaW5mbyksIEdGUF9LRVJORUwpOworCQlpZiAoIW9ueXgtPmNvZGVjX2luZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJY2kgPSBvbnl4LT5jb2RlY19pbmZvOworCQkvKiB0aGlzIGlzIGZpbmUgYXMgdGhlcmUgaGF2ZSB0byBiZSBpbnB1dHMKKwkJICogaWYgd2UgZW5kIHVwIGluIHRoaXMgcGFydCBvZiB0aGUgY29kZSAqLworCQkqY2kgPSBvbnl4X2NvZGVjX2luZm87CisJCWNpLT50cmFuc2ZlcnNbMV0uZm9ybWF0cyA9IDA7CisJfQorCisJaWYgKG9ueXgtPmNvZGVjLnNvdW5kYnVzX2Rldi0+YXR0YWNoX2NvZGVjKG9ueXgtPmNvZGVjLnNvdW5kYnVzX2RldiwKKwkJCQkJCSAgIGFvYV9nZXRfY2FyZCgpLAorCQkJCQkJICAgY2ksIG9ueXgpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIGNyZWF0aW5nIG9ueXggcGNtXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorI2RlZmluZSBBRERDVEwobikJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJY3RsID0gc25kX2N0bF9uZXcxKCZuLCBvbnl4KTsJCQkJXAorCQlpZiAoY3RsKSB7CQkJCQkJXAorCQkJY3RsLT5pZC5kZXZpY2UgPQkJCQlcCisJCQkJb255eC0+Y29kZWMuc291bmRidXNfZGV2LT5wY20tPmRldmljZTsJXAorCQkJZXJyID0gYW9hX3NuZF9jdGxfYWRkKGN0bCk7CQkJXAorCQkJaWYgKGVycikJCQkJCVwKKwkJCQlnb3RvIGVycm9yOwkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKwlpZiAob255eC0+Y29kZWMuc291bmRidXNfZGV2LT5wY20pIHsKKwkJLyogZ2l2ZSB0aGUgdXNlciBhcHByb3ByaWF0ZSBjb250cm9scworCQkgKiBkZXBlbmRpbmcgb24gd2hhdCBpbnB1dHMgYXJlIGNvbm5lY3RlZCAqLworCQlpZiAoKG9ueXgtPmNvZGVjLmNvbm5lY3RlZCAmIDB4QykgPT0gMHhDKQorCQkJQUREQ1RMKGNhcHR1cmVfc291cmNlX2NvbnRyb2wpOworCQllbHNlIGlmIChvbnl4LT5jb2RlYy5jb25uZWN0ZWQgJiA0KQorCQkJb255eF9zZXRfY2FwdHVyZV9zb3VyY2Uob255eCwgMCk7CisJCWVsc2UKKwkJCW9ueXhfc2V0X2NhcHR1cmVfc291cmNlKG9ueXgsIDEpOworCQlpZiAob255eC0+Y29kZWMuY29ubmVjdGVkICYgMHhDKQorCQkJQUREQ1RMKGlucHV0Z2Fpbl9jb250cm9sKTsKKworCQkvKiBkZXBlbmRpbmcgb24gd2hhdCBvdXRwdXQgaXMgY29ubmVjdGVkLAorCQkgKiBnaXZlIHRoZSB1c2VyIGFwcHJvcHJpYXRlIGNvbnRyb2xzICovCisJCWlmIChvbnl4LT5jb2RlYy5jb25uZWN0ZWQgJiAxKSB7CisJCQlBRERDVEwodm9sdW1lX2NvbnRyb2wpOworCQkJQUREQ1RMKG11dGVfY29udHJvbCk7CisJCQlBRERDVEwob3ZyMV9jb250cm9sKTsKKwkJCUFERENUTChmbHQwX2NvbnRyb2wpOworCQkJQUREQ1RMKGhwZl9jb250cm9sKTsKKwkJCUFERENUTChkbTEyX2NvbnRyb2wpOworCQkJLyogc3BkaWYgY29udHJvbCBkZWZhdWx0cyB0byBvZmYgKi8KKwkJfQorCQlpZiAob255eC0+Y29kZWMuY29ubmVjdGVkICYgMikgeworCQkJQUREQ1RMKG9ueXhfc3BkaWZfbWFzayk7CisJCQlBRERDVEwob255eF9zcGRpZl9jdHJsKTsKKwkJfQorCQlpZiAoKG9ueXgtPmNvZGVjLmNvbm5lY3RlZCAmIDMpID09IDMpCisJCQlBRERDVEwoc3BkaWZfY29udHJvbCk7CisJCS8qIGlmIG9ubHkgUy9QRElGIGlzIGNvbm5lY3RlZCwgZW5hYmxlIGl0IHVuY29uZGl0aW9uYWxseSAqLworCQlpZiAoKG9ueXgtPmNvZGVjLmNvbm5lY3RlZCAmIDMpID09IDIpIHsKKwkJCW9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19ESUdfSU5GTzQsICZ2KTsKKwkJCXYgfD0gT05ZWF9TUERJRl9FTkFCTEU7CisJCQlvbnl4X3dyaXRlX3JlZ2lzdGVyKG9ueXgsIE9OWVhfUkVHX0RJR19JTkZPNCwgdik7CisJCX0KKwl9CisjdW5kZWYgQUREQ1RMCisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImF0dGFjaGVkIHRvIG9ueXggY29kZWMgdmlhIGkyY1xuIik7CisKKwlyZXR1cm4gMDsKKyBlcnJvcjoKKwlvbnl4LT5jb2RlYy5zb3VuZGJ1c19kZXYtPmRldGFjaF9jb2RlYyhvbnl4LT5jb2RlYy5zb3VuZGJ1c19kZXYsIG9ueXgpOworCXNuZF9kZXZpY2VfZnJlZShhb2FfZ2V0X2NhcmQoKSwgb255eCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgb255eF9leGl0X2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBvbnl4ICpvbnl4ID0gY29kZWNfdG9fb255eChjb2RlYyk7CisKKwlpZiAoIW9ueXgtPmNvZGVjLnNvdW5kYnVzX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJvbnl4X2V4aXRfY29kZWMgY2FsbGVkIHdpdGhvdXQgc291bmRidXNfZGV2IVxuIik7CisJCXJldHVybjsKKwl9CisJb255eC0+Y29kZWMuc291bmRidXNfZGV2LT5kZXRhY2hfY29kZWMob255eC0+Y29kZWMuc291bmRidXNfZGV2LCBvbnl4KTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG9ueXhfZHJpdmVyOworCitzdGF0aWMgaW50IG9ueXhfY3JlYXRlKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJICAgICAgIGludCBhZGRyKQoreworCXN0cnVjdCBvbnl4ICpvbnl4OworCXU4IGR1bW15OworCisJb255eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvbnl4KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIW9ueXgpCisJCXJldHVybiAtRU5PTUVNOworCisJbXV0ZXhfaW5pdCgmb255eC0+bXV0ZXgpOworCW9ueXgtPmkyYy5kcml2ZXIgPSAmb255eF9kcml2ZXI7CisJb255eC0+aTJjLmFkYXB0ZXIgPSBhZGFwdGVyOworCW9ueXgtPmkyYy5hZGRyID0gYWRkciAmIDB4N2Y7CisJc3RybGNweShvbnl4LT5pMmMubmFtZSwgIm9ueXggYXVkaW8gY29kZWMiLCBJMkNfTkFNRV9TSVpFLTEpOworCisJaWYgKGkyY19hdHRhY2hfY2xpZW50KCZvbnl4LT5pMmMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBhdHRhY2ggdG8gaTJjXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHdlIHRyeSB0byByZWFkIGZyb20gcmVnaXN0ZXIgT05ZWF9SRUdfQ09OVFJPTAorCSAqIHRvIGNoZWNrIGlmIHRoZSBjb2RlYyBpcyBwcmVzZW50ICovCisJaWYgKG9ueXhfcmVhZF9yZWdpc3Rlcihvbnl4LCBPTllYX1JFR19DT05UUk9MLCAmZHVtbXkpICE9IDApIHsKKwkJaTJjX2RldGFjaF9jbGllbnQoJm9ueXgtPmkyYyk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byByZWFkIGNvbnRyb2wgcmVnaXN0ZXJcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJc3RybGNweShvbnl4LT5jb2RlYy5uYW1lLCAib255eCIsIE1BWF9DT0RFQ19OQU1FX0xFTi0xKTsKKwlvbnl4LT5jb2RlYy5vd25lciA9IFRISVNfTU9EVUxFOworCW9ueXgtPmNvZGVjLmluaXQgPSBvbnl4X2luaXRfY29kZWM7CisJb255eC0+Y29kZWMuZXhpdCA9IG9ueXhfZXhpdF9jb2RlYzsKKwlvbnl4LT5jb2RlYy5ub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisKKwlpZiAoYW9hX2NvZGVjX3JlZ2lzdGVyKCZvbnl4LT5jb2RlYykpIHsKKwkJaTJjX2RldGFjaF9jbGllbnQoJm9ueXgtPmkyYyk7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJjcmVhdGVkIGFuZCBhdHRhY2hlZCBvbnl4IGluc3RhbmNlXG4iKTsKKwlyZXR1cm4gMDsKKyBmYWlsOgorCWtmcmVlKG9ueXgpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG9ueXhfaTJjX2F0dGFjaChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpidXNub2RlLCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcG1hY19pMmNfYnVzICpidXM7CisKKwlidXMgPSBwbWFjX2kyY19hZGFwdGVyX3RvX2J1cyhhZGFwdGVyKTsKKwlpZiAoYnVzID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCWJ1c25vZGUgPSBwbWFjX2kyY19nZXRfYnVzX25vZGUoYnVzKTsKKworCXdoaWxlICgoZGV2ID0gb2ZfZ2V0X25leHRfY2hpbGQoYnVzbm9kZSwgZGV2KSkgIT0gTlVMTCkgeworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoZGV2LCAicGNtMzA1MiIpKSB7CisJCQl1MzIgKmFkZHI7CisJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggImZvdW5kIHBjbTMwNTJcbiIpOworCQkJYWRkciA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGRldiwgInJlZyIsIE5VTEwpOworCQkJaWYgKCFhZGRyKQorCQkJCXJldHVybiAtRU5PREVWOworCQkJcmV0dXJuIG9ueXhfY3JlYXRlKGFkYXB0ZXIsIGRldiwgKCphZGRyKT4+MSk7CisJCX0KKwl9CisKKwkvKiBpZiB0aGF0IGRpZG4ndCB3b3JrLCB0cnkgZGVzcGVyYXRlIG1vZGUgZm9yIG9sZGVyCisJICogbWFjaGluZXMgdGhhdCBoYXZlIHN0dWZmIG1pc3NpbmcgZnJvbSB0aGUgZGV2aWNlIHRyZWUgKi8KKwkKKwlpZiAoIWRldmljZV9pc19jb21wYXRpYmxlKGJ1c25vZGUsICJrMi1pMmMiKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggImZvdW5kIGsyLWkyYywgY2hlY2tpbmcgaWYgb255eCBjaGlwIGlzIG9uIGl0XG4iKTsKKwkvKiBwcm9iZSBib3RoIHBvc3NpYmxlIGFkZHJlc3NlcyBmb3IgdGhlIG9ueXggY2hpcCAqLworCWlmIChvbnl4X2NyZWF0ZShhZGFwdGVyLCBOVUxMLCAweDQ2KSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gb255eF9jcmVhdGUoYWRhcHRlciwgTlVMTCwgMHg0Nyk7Cit9CisKK3N0YXRpYyBpbnQgb255eF9pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG9ueXggKm9ueXggPSBjb250YWluZXJfb2YoY2xpZW50LCBzdHJ1Y3Qgb255eCwgaTJjKTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKwlhb2FfY29kZWNfdW5yZWdpc3Rlcigmb255eC0+Y29kZWMpOworCW9mX25vZGVfcHV0KG9ueXgtPmNvZGVjLm5vZGUpOworCWlmIChvbnl4LT5jb2RlY19pbmZvKQorCQlrZnJlZShvbnl4LT5jb2RlY19pbmZvKTsKKwlrZnJlZShvbnl4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG9ueXhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFvYV9jb2RlY19vbnl4IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSBvbnl4X2kyY19hdHRhY2gsCisJLmRldGFjaF9jbGllbnQgPSBvbnl4X2kyY19kZXRhY2gsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBvbnl4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm9ueXhfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9ueXhfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZvbnl4X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9ueXhfaW5pdCk7Cittb2R1bGVfZXhpdChvbnl4X2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLW9ueXguaCBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlZGRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy1vbnl4LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIEFwcGxlIE9uYm9hcmQgQXVkaW8gZHJpdmVyIGZvciBPbnl4IGNvZGVjIChoZWFkZXIpCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisjaWZuZGVmIF9fU05EX0FPQV9DT0RFQ19PTllYX0gKKyNkZWZpbmUgX19TTkRfQU9BX0NPREVDX09OWVhfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKyNpbmNsdWRlIDxhc20vcG1hY19sb3dfaTJjLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKworLyogUENNMzA1MiByZWdpc3RlciBkZWZpbml0aW9ucyAqLworCisvKiB0aGUgYXR0ZW51YXRpb24gcmVnaXN0ZXJzIHRha2UgdmFsdWVzIGZyb20KKyAqIC0xICgwZEIpIHRvIC0xMjcgKC02My4wIGRCKSBvciBvdGhlcnMgKG11dGVkKSAqLworI2RlZmluZSBPTllYX1JFR19EQUNfQVRURU5fTEVGVAkJNjUKKyNkZWZpbmUgRklSU1RSRUdJU1RFUgkJCU9OWVhfUkVHX0RBQ19BVFRFTl9MRUZUCisjZGVmaW5lIE9OWVhfUkVHX0RBQ19BVFRFTl9SSUdIVAk2NgorCisjZGVmaW5lIE9OWVhfUkVHX0NPTlRST0wJCTY3CisjCWRlZmluZSBPTllYX01SU1QJCSgxPDw3KQorIwlkZWZpbmUgT05ZWF9TUlNUCQkoMTw8NikKKyMJZGVmaW5lIE9OWVhfQURQU1YJCSgxPDw1KQorIwlkZWZpbmUgT05ZWF9EQVBTVgkJKDE8PDQpCisjCWRlZmluZSBPTllYX1NJTElDT05WRVJTSU9OCSgxPDwwKQorLyogYWxsIG90aGVycyByZXNlcnZlZCAqLworCisjZGVmaW5lIE9OWVhfUkVHX0RBQ19DT05UUk9MCQk2OAorIwlkZWZpbmUgT05ZWF9PVlIxCQkoMTw8NikKKyMJZGVmaW5lIE9OWVhfTVVURV9SSUdIVAkJKDE8PDEpCisjCWRlZmluZSBPTllYX01VVEVfTEVGVAkJKDE8PDApCisKKyNkZWZpbmUgT05ZWF9SRUdfREFDX0RFRU1QSAkJNjkKKyMJZGVmaW5lIE9OWVhfRElHREVFTVBIX1NISUZUCTUKKyMJZGVmaW5lIE9OWVhfRElHREVFTVBIX01BU0sJKDM8PE9OWVhfRElHREVFTVBIX1NISUZUKQorIwlkZWZpbmUgT05ZWF9ESUdERUVNUEhfQ1RSTAkoMTw8NCkKKworI2RlZmluZSBPTllYX1JFR19EQUNfRklMVEVSCQk3MAorIwlkZWZpbmUgT05ZWF9ST0xMT0ZGX0ZBU1QJKDE8PDUpCisjCWRlZmluZSBPTllYX0RBQ19GSUxURVJfQUxXQVlTCSgxPDwyKQorCisjZGVmaW5lCU9OWVhfUkVHX0RBQ19PVVRQSEFTRQkJNzEKKyMJZGVmaW5lIE9OWVhfT1VUUEhBU0VfSU5WRVJURUQJKDE8PDApCisKKyNkZWZpbmUgT05ZWF9SRUdfQURDX0NPTlRST0wJCTcyCisjCWRlZmluZSBPTllYX0FEQ19JTlBVVF9NSUMJKDE8PDUpCisvKiA4ICsgaW5wdXQgZ2FpbiBpbiBkQiwgdmFsaWQgcmFuZ2UgZm9yIGlucHV0IGdhaW4gaXMgLTQgLi4gMjAgZEIgKi8KKyMJZGVmaW5lIE9OWVhfQURDX1BHQV9HQUlOX01BU0sJMHgxZgorCisjZGVmaW5lIE9OWVhfUkVHX0FEQ19IUEZfQllQQVNTCQk3NQorIwlkZWZpbmUgT05ZWF9IUEZfRElTQUJMRQkJKDE8PDMpCisjCWRlZmluZSBPTllYX0FEQ19IUEZfQUxXQVlTCSgxPDwyKQorCisjZGVmaW5lIE9OWVhfUkVHX0RJR19JTkZPMQkJNzcKKyMJZGVmaW5lIE9OWVhfTUFTS19ESU5fVE9fQlBaCSgxPDw3KQorLyogYml0cyAxLTUgY29udHJvbCBjaGFubmVsIGJpdHMgMS01ICovCisjCWRlZmluZSBPTllYX0RJR09VVF9ESVNBQkxFCSgxPDwwKQorCisjZGVmaW5lIE9OWVhfUkVHX0RJR19JTkZPMgkJNzgKKy8qIGNvbnRyb2xzIGNoYW5uZWwgYml0cyA4LTE1ICovCisKKyNkZWZpbmUgT05ZWF9SRUdfRElHX0lORk8zCQk3OQorLyogY29udHJvbCBjaGFubmVsIGJpdHMgMjQtMjksIGhpZ2ggMiBiaXRzIHJlc2VydmVkICovCisKKyNkZWZpbmUgT05ZWF9SRUdfRElHX0lORk80CQk4MAorIwlkZWZpbmUgT05ZWF9WQUxJREwJCSgxPDw3KQorIwlkZWZpbmUgT05ZWF9WQUxJRFIJCSgxPDw2KQorIwlkZWZpbmUgT05ZWF9TUERJRl9FTkFCTEUJKDE8PDUpCisvKiBsb3dlciA0IGJpdHMgY29udHJvbCBiaXRzIDMyLTM1IG9mIGNoYW5uZWwgY29udHJvbCBhbmQgd29yZCBsZW5ndGggKi8KKyMJZGVmaW5lIE9OWVhfV09SRExFTl9NQVNLCSgweEYpCisKKyNlbmRpZiAvKiBfX1NORF9BT0FfQ09ERUNfT05ZWF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLWdhaW4tdGFibGUuaCBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMtZ2Fpbi10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZmE2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLWdhaW4tdGFibGUuaApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyBUaGlzIGlzIHRoZSBwcm9ncmFtIHVzZWQgdG8gZ2VuZXJhdGUgYmVsb3cgdGFibGUuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KK2ludCBtYWluKCkgeworICBpbnQgZEIyOworICBwcmludGYoIi8iICIqIFRoaXMgZmlsZSBpcyBvbmx5IGluY2x1ZGVkIGV4YWN0bHkgb25jZSFcbiIpOworICBwcmludGYoIiAqXG4iKTsKKyAgcHJpbnRmKCIgKiBJZiB0aGV5J2Qgb25seSB0ZWxsIHVzIHRoYXQgZ2VuZXJhdGluZyB0aGlzIHRhYmxlIHdhc1xuIik7CisgIHByaW50ZigiICogYXMgZWFzeSBhcyBjYWxjdWxhdGluZ1xuIik7CisgIHByaW50ZigiICogICAgICBod3ZhbHVlID0gMTA0ODU3Ni4wKmV4cCgwLjA1NzU2NDYyOCpkQioyKVxuIik7CisgIHByaW50ZigiICogOikgKiIgIi9cbiIpOworICBwcmludGYoInN0YXRpYyBpbnQgdGFzX2dhaW50YWJsZVtdID0ge1xuIik7CisgIHByaW50ZigiCTB4MDAwMDAwLCAvIiAiKiAtaW5maW5pdHkgZEIgKiIgIi9cbiIpOworICBmb3IgKGRCMj0tMTQwO2RCMjw9MzY7ZEIyKyspCisgICAgcHJpbnRmKCIJMHglLjZ4LCAvIiAiKiAlLTAyLjFmIGRCICoiICIvXG4iLCAoaW50KSgxMDQ4NTc2LjAqZXhwKDAuMDU3NTY0NjI4KmRCMikpLCBkQjIvMi4wKTsKKyAgcHJpbnRmKCJ9O1xuXG4iKTsKK30KKworKi8KKworLyogVGhpcyBmaWxlIGlzIG9ubHkgaW5jbHVkZWQgZXhhY3RseSBvbmNlIQorICoKKyAqIElmIHRoZXknZCBvbmx5IHRlbGwgdXMgdGhhdCBnZW5lcmF0aW5nIHRoaXMgdGFibGUgd2FzCisgKiBhcyBlYXN5IGFzIGNhbGN1bGF0aW5nCisgKiAgICAgIGh3dmFsdWUgPSAxMDQ4NTc2LjAqZXhwKDAuMDU3NTY0NjI4KmRCKjIpCisgKiA6KSAqLworc3RhdGljIGludCB0YXNfZ2FpbnRhYmxlW10gPSB7CisJMHgwMDAwMDAsIC8qIC1pbmZpbml0eSBkQiAqLworCTB4MDAwMTRiLCAvKiAtNzAuMCBkQiAqLworCTB4MDAwMTVmLCAvKiAtNjkuNSBkQiAqLworCTB4MDAwMTc0LCAvKiAtNjkuMCBkQiAqLworCTB4MDAwMThhLCAvKiAtNjguNSBkQiAqLworCTB4MDAwMWExLCAvKiAtNjguMCBkQiAqLworCTB4MDAwMWJhLCAvKiAtNjcuNSBkQiAqLworCTB4MDAwMWQ0LCAvKiAtNjcuMCBkQiAqLworCTB4MDAwMWYwLCAvKiAtNjYuNSBkQiAqLworCTB4MDAwMjBkLCAvKiAtNjYuMCBkQiAqLworCTB4MDAwMjJjLCAvKiAtNjUuNSBkQiAqLworCTB4MDAwMjRkLCAvKiAtNjUuMCBkQiAqLworCTB4MDAwMjcwLCAvKiAtNjQuNSBkQiAqLworCTB4MDAwMjk1LCAvKiAtNjQuMCBkQiAqLworCTB4MDAwMmJjLCAvKiAtNjMuNSBkQiAqLworCTB4MDAwMmU2LCAvKiAtNjMuMCBkQiAqLworCTB4MDAwMzEyLCAvKiAtNjIuNSBkQiAqLworCTB4MDAwMzQwLCAvKiAtNjIuMCBkQiAqLworCTB4MDAwMzcyLCAvKiAtNjEuNSBkQiAqLworCTB4MDAwM2E2LCAvKiAtNjEuMCBkQiAqLworCTB4MDAwM2RkLCAvKiAtNjAuNSBkQiAqLworCTB4MDAwNDE4LCAvKiAtNjAuMCBkQiAqLworCTB4MDAwNDU2LCAvKiAtNTkuNSBkQiAqLworCTB4MDAwNDk4LCAvKiAtNTkuMCBkQiAqLworCTB4MDAwNGRlLCAvKiAtNTguNSBkQiAqLworCTB4MDAwNTI4LCAvKiAtNTguMCBkQiAqLworCTB4MDAwNTc2LCAvKiAtNTcuNSBkQiAqLworCTB4MDAwNWM5LCAvKiAtNTcuMCBkQiAqLworCTB4MDAwNjIwLCAvKiAtNTYuNSBkQiAqLworCTB4MDAwNjdkLCAvKiAtNTYuMCBkQiAqLworCTB4MDAwNmUwLCAvKiAtNTUuNSBkQiAqLworCTB4MDAwNzQ4LCAvKiAtNTUuMCBkQiAqLworCTB4MDAwN2I3LCAvKiAtNTQuNSBkQiAqLworCTB4MDAwODJjLCAvKiAtNTQuMCBkQiAqLworCTB4MDAwOGE4LCAvKiAtNTMuNSBkQiAqLworCTB4MDAwOTJiLCAvKiAtNTMuMCBkQiAqLworCTB4MDAwOWI2LCAvKiAtNTIuNSBkQiAqLworCTB4MDAwYTQ5LCAvKiAtNTIuMCBkQiAqLworCTB4MDAwYWU1LCAvKiAtNTEuNSBkQiAqLworCTB4MDAwYjhiLCAvKiAtNTEuMCBkQiAqLworCTB4MDAwYzNhLCAvKiAtNTAuNSBkQiAqLworCTB4MDAwY2YzLCAvKiAtNTAuMCBkQiAqLworCTB4MDAwZGI4LCAvKiAtNDkuNSBkQiAqLworCTB4MDAwZTg4LCAvKiAtNDkuMCBkQiAqLworCTB4MDAwZjY0LCAvKiAtNDguNSBkQiAqLworCTB4MDAxMDRlLCAvKiAtNDguMCBkQiAqLworCTB4MDAxMTQ1LCAvKiAtNDcuNSBkQiAqLworCTB4MDAxMjRiLCAvKiAtNDcuMCBkQiAqLworCTB4MDAxMzYxLCAvKiAtNDYuNSBkQiAqLworCTB4MDAxNDg3LCAvKiAtNDYuMCBkQiAqLworCTB4MDAxNWJlLCAvKiAtNDUuNSBkQiAqLworCTB4MDAxNzA4LCAvKiAtNDUuMCBkQiAqLworCTB4MDAxODY1LCAvKiAtNDQuNSBkQiAqLworCTB4MDAxOWQ4LCAvKiAtNDQuMCBkQiAqLworCTB4MDAxYjYwLCAvKiAtNDMuNSBkQiAqLworCTB4MDAxY2ZmLCAvKiAtNDMuMCBkQiAqLworCTB4MDAxZWI3LCAvKiAtNDIuNSBkQiAqLworCTB4MDAyMDg5LCAvKiAtNDIuMCBkQiAqLworCTB4MDAyMjc2LCAvKiAtNDEuNSBkQiAqLworCTB4MDAyNDgxLCAvKiAtNDEuMCBkQiAqLworCTB4MDAyNmFiLCAvKiAtNDAuNSBkQiAqLworCTB4MDAyOGY1LCAvKiAtNDAuMCBkQiAqLworCTB4MDAyYjYzLCAvKiAtMzkuNSBkQiAqLworCTB4MDAyZGY1LCAvKiAtMzkuMCBkQiAqLworCTB4MDAzMGFlLCAvKiAtMzguNSBkQiAqLworCTB4MDAzMzkwLCAvKiAtMzguMCBkQiAqLworCTB4MDAzNjllLCAvKiAtMzcuNSBkQiAqLworCTB4MDAzOWRiLCAvKiAtMzcuMCBkQiAqLworCTB4MDAzZDQ5LCAvKiAtMzYuNSBkQiAqLworCTB4MDA0MGVhLCAvKiAtMzYuMCBkQiAqLworCTB4MDA0NGMzLCAvKiAtMzUuNSBkQiAqLworCTB4MDA0OGQ2LCAvKiAtMzUuMCBkQiAqLworCTB4MDA0ZDI3LCAvKiAtMzQuNSBkQiAqLworCTB4MDA1MWI5LCAvKiAtMzQuMCBkQiAqLworCTB4MDA1NjkxLCAvKiAtMzMuNSBkQiAqLworCTB4MDA1YmIyLCAvKiAtMzMuMCBkQiAqLworCTB4MDA2MTIxLCAvKiAtMzIuNSBkQiAqLworCTB4MDA2NmUzLCAvKiAtMzIuMCBkQiAqLworCTB4MDA2Y2ZiLCAvKiAtMzEuNSBkQiAqLworCTB4MDA3MzcwLCAvKiAtMzEuMCBkQiAqLworCTB4MDA3YTQ4LCAvKiAtMzAuNSBkQiAqLworCTB4MDA4MTg2LCAvKiAtMzAuMCBkQiAqLworCTB4MDA4OTMzLCAvKiAtMjkuNSBkQiAqLworCTB4MDA5MTU0LCAvKiAtMjkuMCBkQiAqLworCTB4MDA5OWYxLCAvKiAtMjguNSBkQiAqLworCTB4MDBhMzEwLCAvKiAtMjguMCBkQiAqLworCTB4MDBhY2JhLCAvKiAtMjcuNSBkQiAqLworCTB4MDBiNmY2LCAvKiAtMjcuMCBkQiAqLworCTB4MDBjMWNkLCAvKiAtMjYuNSBkQiAqLworCTB4MDBjZDQ5LCAvKiAtMjYuMCBkQiAqLworCTB4MDBkOTczLCAvKiAtMjUuNSBkQiAqLworCTB4MDBlNjU1LCAvKiAtMjUuMCBkQiAqLworCTB4MDBmM2ZiLCAvKiAtMjQuNSBkQiAqLworCTB4MDEwMjcwLCAvKiAtMjQuMCBkQiAqLworCTB4MDExMWMwLCAvKiAtMjMuNSBkQiAqLworCTB4MDEyMWY5LCAvKiAtMjMuMCBkQiAqLworCTB4MDEzMzI4LCAvKiAtMjIuNSBkQiAqLworCTB4MDE0NTViLCAvKiAtMjIuMCBkQiAqLworCTB4MDE1OGEyLCAvKiAtMjEuNSBkQiAqLworCTB4MDE2ZDBlLCAvKiAtMjEuMCBkQiAqLworCTB4MDE4MmFmLCAvKiAtMjAuNSBkQiAqLworCTB4MDE5OTk5LCAvKiAtMjAuMCBkQiAqLworCTB4MDFiMWRlLCAvKiAtMTkuNSBkQiAqLworCTB4MDFjYjk0LCAvKiAtMTkuMCBkQiAqLworCTB4MDFlNmNmLCAvKiAtMTguNSBkQiAqLworCTB4MDIwM2E3LCAvKiAtMTguMCBkQiAqLworCTB4MDIyMjM1LCAvKiAtMTcuNSBkQiAqLworCTB4MDI0MjkzLCAvKiAtMTcuMCBkQiAqLworCTB4MDI2NGRiLCAvKiAtMTYuNSBkQiAqLworCTB4MDI4OTJjLCAvKiAtMTYuMCBkQiAqLworCTB4MDJhZmEzLCAvKiAtMTUuNSBkQiAqLworCTB4MDJkODYyLCAvKiAtMTUuMCBkQiAqLworCTB4MDMwMzhhLCAvKiAtMTQuNSBkQiAqLworCTB4MDMzMTQyLCAvKiAtMTQuMCBkQiAqLworCTB4MDM2MWFmLCAvKiAtMTMuNSBkQiAqLworCTB4MDM5NGZhLCAvKiAtMTMuMCBkQiAqLworCTB4MDNjYjUwLCAvKiAtMTIuNSBkQiAqLworCTB4MDQwNGRlLCAvKiAtMTIuMCBkQiAqLworCTB4MDQ0MWQ1LCAvKiAtMTEuNSBkQiAqLworCTB4MDQ4MjY4LCAvKiAtMTEuMCBkQiAqLworCTB4MDRjNmQwLCAvKiAtMTAuNSBkQiAqLworCTB4MDUwZjQ0LCAvKiAtMTAuMCBkQiAqLworCTB4MDU1YzA0LCAvKiAtOS41IGRCICovCisJMHgwNWFkNTAsIC8qIC05LjAgZEIgKi8KKwkweDA2MDM2ZSwgLyogLTguNSBkQiAqLworCTB4MDY1ZWE1LCAvKiAtOC4wIGRCICovCisJMHgwNmJmNDQsIC8qIC03LjUgZEIgKi8KKwkweDA3MjU5ZCwgLyogLTcuMCBkQiAqLworCTB4MDc5MjA3LCAvKiAtNi41IGRCICovCisJMHgwODA0ZGMsIC8qIC02LjAgZEIgKi8KKwkweDA4N2U4MCwgLyogLTUuNSBkQiAqLworCTB4MDhmZjU5LCAvKiAtNS4wIGRCICovCisJMHgwOTg3ZDUsIC8qIC00LjUgZEIgKi8KKwkweDBhMTg2NiwgLyogLTQuMCBkQiAqLworCTB4MGFiMTg5LCAvKiAtMy41IGRCICovCisJMHgwYjUzYmUsIC8qIC0zLjAgZEIgKi8KKwkweDBiZmY5MSwgLyogLTIuNSBkQiAqLworCTB4MGNiNTkxLCAvKiAtMi4wIGRCICovCisJMHgwZDc2NWEsIC8qIC0xLjUgZEIgKi8KKwkweDBlNDI5MCwgLyogLTEuMCBkQiAqLworCTB4MGYxYWRmLCAvKiAtMC41IGRCICovCisJMHgxMDAwMDAsIC8qIDAuMCBkQiAqLworCTB4MTBmMmI0LCAvKiAwLjUgZEIgKi8KKwkweDExZjNjOSwgLyogMS4wIGRCICovCisJMHgxMzA0MWEsIC8qIDEuNSBkQiAqLworCTB4MTQyNDhlLCAvKiAyLjAgZEIgKi8KKwkweDE1NTYxYSwgLyogMi41IGRCICovCisJMHgxNjk5YzAsIC8qIDMuMCBkQiAqLworCTB4MTdmMDk0LCAvKiAzLjUgZEIgKi8KKwkweDE5NWJiOCwgLyogNC4wIGRCICovCisJMHgxYWRjNjEsIC8qIDQuNSBkQiAqLworCTB4MWM3M2Q1LCAvKiA1LjAgZEIgKi8KKwkweDFlMjM2ZCwgLyogNS41IGRCICovCisJMHgxZmVjOTgsIC8qIDYuMCBkQiAqLworCTB4MjFkMGQ5LCAvKiA2LjUgZEIgKi8KKwkweDIzZDFjZCwgLyogNy4wIGRCICovCisJMHgyNWYxMjUsIC8qIDcuNSBkQiAqLworCTB4MjgzMGFmLCAvKiA4LjAgZEIgKi8KKwkweDJhOTI1NCwgLyogOC41IGRCICovCisJMHgyZDE4MTgsIC8qIDkuMCBkQiAqLworCTB4MmZjNDIwLCAvKiA5LjUgZEIgKi8KKwkweDMyOThiMCwgLyogMTAuMCBkQiAqLworCTB4MzU5ODJmLCAvKiAxMC41IGRCICovCisJMHgzOGM1MjgsIC8qIDExLjAgZEIgKi8KKwkweDNjMjI0YywgLyogMTEuNSBkQiAqLworCTB4M2ZiMjc4LCAvKiAxMi4wIGRCICovCisJMHg0Mzc4YjAsIC8qIDEyLjUgZEIgKi8KKwkweDQ3NzgyOSwgLyogMTMuMCBkQiAqLworCTB4NGJiNDQ2LCAvKiAxMy41IGRCICovCisJMHg1MDMwYTEsIC8qIDE0LjAgZEIgKi8KKwkweDU0ZjEwNiwgLyogMTQuNSBkQiAqLworCTB4NTlmOTgwLCAvKiAxNS4wIGRCICovCisJMHg1ZjRlNTIsIC8qIDE1LjUgZEIgKi8KKwkweDY0ZjQwMywgLyogMTYuMCBkQiAqLworCTB4NmFlZjVlLCAvKiAxNi41IGRCICovCisJMHg3MTQ1NzUsIC8qIDE3LjAgZEIgKi8KKwkweDc3ZmJhYSwgLyogMTcuNSBkQiAqLworCTB4N2YxN2FmLCAvKiAxOC4wIGRCICovCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdGFzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzOWZmNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuYwpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIEFwcGxlIE9uYm9hcmQgQXVkaW8gZHJpdmVyIGZvciB0YXMgY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTCB2MiwgY2FuIGJlIGZvdW5kIGluIENPUFlJTkcuCisgKgorICogT3BlbiBxdWVzdGlvbnM6CisgKiAgLSBIb3cgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAzMDA0IGFuZCB2ZXJzaW9ucz8KKyAqCisgKiBGSVhNRXM6CisgKiAgLSBUaGlzIGNvZGVjIGRyaXZlciBkb2Vzbid0IGhvbm91ciB0aGUgJ2Nvbm5lY3RlZCcKKyAqICAgIHByb3BlcnR5IG9mIHRoZSBhb2FfY29kZWMgc3RydWN0LCBoZW5jZSBpZgorICogICAgaXQgaXMgdXNlZCBpbiBtYWNoaW5lcyB3aGVyZSBub3QgZXZlcnl0aGluZyBpcworICogICAgY29ubmVjdGVkIGl0IHdpbGwgZGlzcGxheSB3cm9uZyBtaXhlciBlbGVtZW50cy4KKyAqICAtIERyaXZlciBhc3N1bWVzIHRoYXQgdGhlIG1pY3JvcGhvbmUgaXMgYWx3YXlzCisgKiAgICBtb25hdXJlYWwgYW5kIGNvbm5lY3RlZCB0byB0aGUgcmlnaHQgY2hhbm5lbCBvZgorICogICAgdGhlIGlucHV0LiBUaGlzIHNob3VsZCBhbHNvIGJlIGEgY29kZWMtZGVwZW5kZW50CisgKiAgICBmbGFnLCBtYXliZSB0aGUgY29kZWMgc2hvdWxkIGhhdmUgMyBkaWZmZXJlbnQKKyAqICAgIGJpdHMgZm9yIHRoZSB0aHJlZSBkaWZmZXJlbnQgcG9zc2liaWxpdGllcyBob3cKKyAqICAgIGl0IGNhbiBiZSBob29rZWQgdXAuLi4KKyAqICAgIEJ1dCBhcyBsb25nIGFzIEkgZG9uJ3Qgc2VlIGFueSBoYXJkd2FyZSBob29rZWQKKyAqICAgIHVwIHRoYXQgd2F5Li4uCisgKiAgLSBBcyBBcHBsZSBub3RlcyBpbiB0aGVpciBjb2RlLCB0aGUgdGFzMzAwNCBzZWVtcworICogICAgdG8gZGVsYXkgdGhlIHJpZ2h0IGNoYW5uZWwgYnkgb25lIHNhbXBsZS4gWW91IGNhbgorICogICAgc2VlIHRoaXMgd2hlbiBmb3IgZXhhbXBsZSByZWNvcmRpbmcgc3RlcmVvIGluCisgKiAgICBhdWRhY2l0eSwgb3IgcmVjb3JkaW5nIHRoZSB0YXMgb3V0cHV0IHZpYSBjYWJsZQorICogICAgb24gYW5vdGhlciBtYWNoaW5lICh1c2UgYSBzaW51cyBnZW5lcmF0b3Igb3Igc28pLgorICogICAgSSB0cmllZCBwcm9ncmFtbWluZyB0aGUgQmlRdWFkcyBidXQgY291bGRuJ3QKKyAqICAgIG1ha2UgdGhlIGRlbGF5IHdvcmssIG1heWJlIHNvbWVvbmUgY2FuIHJlYWQgdGhlCisgKiAgICBkYXRhc2hlZXQgYW5kIGZpeCBpdC4gVGhlIHJlbGV2YW50IEFwcGxlIGNvbW1lbnQKKyAqICAgIGlzIGluIEFwcGxlVEFTMzAwNEF1ZGlvLmNwcCBsaW5lcyAxNjM3IGZmLiBOb3RlCisgKiAgICB0aGF0IHRoZWlyIGNvbW1lbnQgZGVzY3JpYmluZyBob3cgdGhleSBwcm9ncmFtCisgKiAgICB0aGUgZmlsdGVycyBzdWNrcy4uLgorICoKKyAqIE90aGVyIHRoaW5nczoKKyAqICAtIHRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlZ2lzdGVyICp0d28qIGFvYV9jb2RlYworICogICAgc3RydWN0cyBzaW5jZSBpdCBoYXMgdHdvIGlucHV0cy4gVGhlbiBpdCBtdXN0CisgKiAgICB1c2UgdGhlIHByZXBhcmUgY2FsbGJhY2sgdG8gZm9yYmlkIHJ1bm5pbmcgdGhlCisgKiAgICBzZWNvbmRhcnkgb3V0cHV0IG9uIGEgZGlmZmVyZW50IGNsb2NrLgorICogICAgQWxzbywgd2hhdGV2ZXIgYnVzIGtub3dzIGhvdyB0byBkbyB0aGlzIG11c3QKKyAqICAgIHByb3ZpZGUgdHdvIHNvdW5kYnVzX2RldiBkZXZpY2VzIGFuZCB0aGUgZmFicmljCisgKiAgICBtdXN0IGJlIGFibGUgdG8gbGluayB0aGVtIGNvcnJlY3RseS4KKyAqCisgKiAgICBJIGRvbid0IGV2ZW4ga25vdyBpZiBBcHBsZSBldmVyIHVzZXMgdGhlIHNlY29uZAorICogICAgcG9ydCBvbiB0aGUgdGFzMzAwNCB0aG91Z2gsIEkgZG9uJ3QgdGhpbmsgdGhlaXIKKyAqICAgIGkycyBjb250cm9sbGVycyBjYW4gZXZlbiBkbyBpdC4gT1RPSCwgdGhleSBhbGwKKyAqICAgIGRlcml2ZSB0aGUgY2xvY2tzIGZyb20gY29tbW9uIGNsb2Nrcywgc28gaXQKKyAqICAgIG1pZ2h0IGp1c3QgYmUgcG9zc2libGUuIFRoZSBmcmFtZXdvcmsgYWxsb3dzIHRoZQorICogICAgY29kZWMgdG8gcmVmaW5lIHRoZSB0cmFuc2Zlcl9pbmZvIGl0ZW1zIGluIHRoZQorICogICAgdXNhYmxlIGNhbGxiYWNrLCBzbyB3ZSBjYW4gc2ltcGx5IHJlbW92ZSB0aGUKKyAqICAgIHJhdGVzIHRoZSBzZWNvbmQgaW5zdGFuY2UgaXMgbm90IHVzaW5nIHdoZW4gaXQKKyAqICAgIGFjdHVhbGx5IGlzIGluIHVzZS4KKyAqICAgIE1heWJlIHdlJ2xsIG5lZWQgdG8gbWFrZSB0aGUgc291bmQgYnVzc2VzIGhhdmUKKyAqICAgIGEgJ2Nsb2NrIGdyb3VwIGlkJyB2YWx1ZSBzbyB0aGUgY29kZWMgY2FuCisgKiAgICBkZXRlcm1pbmUgaWYgdGhlIHR3byBvdXRwdXRzIGNhbiBiZSBkcml2ZW4gYXQKKyAqICAgIHRoZSBzYW1lIHRpbWUuIEJ1dCB0aGF0IGlzIGxpa2VseSBvdmVya2lsbCwgdXAKKyAqICAgIHRvIHRoZSBmYWJyaWMgdG8gbm90IGxpbmsgdGhlbSB1cCBpbmNvcnJlY3RseSwKKyAqICAgIGFuZCB1cCB0byB0aGUgaGFyZHdhcmUgZGVzaWduZXIgdG8gbm90IHdpcmUKKyAqICAgIHRoZW0gdXAgaW4gc29tZSB3ZWlyZCB1bnVzYWJsZSB3YXkuCisgKi8KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfbG93X2kyYy5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRhcyBjb2RlYyBkcml2ZXIgZm9yIHNuZC1hb2EiKTsKKworI2luY2x1ZGUgInNuZC1hb2EtY29kZWMtdGFzLmgiCisjaW5jbHVkZSAic25kLWFvYS1jb2RlYy10YXMtZ2Fpbi10YWJsZS5oIgorI2luY2x1ZGUgIi4uL2FvYS5oIgorI2luY2x1ZGUgIi4uL3NvdW5kYnVzL3NvdW5kYnVzLmgiCisKKworI2RlZmluZSBQRlggInNuZC1hb2EtY29kZWMtdGFzOiAiCisKK3N0cnVjdCB0YXMgeworCXN0cnVjdCBhb2FfY29kZWMJY29kZWM7CisJc3RydWN0IGkyY19jbGllbnQJaTJjOworCXUzMgkJCW11dGVkX2w6MSwgbXV0ZWRfcjoxLAorCQkJCWNvbnRyb2xzX2NyZWF0ZWQ6MTsKKwl1OAkJCWNhY2hlZF92b2x1bWVfbCwgY2FjaGVkX3ZvbHVtZV9yOworCXU4CQkJbWl4ZXJfbFszXSwgbWl4ZXJfclszXTsKKwl1OAkJCWFjcjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzICpjb2RlY190b190YXMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjb2RlYywgc3RydWN0IHRhcywgY29kZWMpOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YXNfd3JpdGVfcmVnKHN0cnVjdCB0YXMgKnRhcywgdTggcmVnLCB1OCBsZW4sIHU4ICpkYXRhKQoreworCWlmIChsZW4gPT0gMSkKKwkJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoJnRhcy0+aTJjLCByZWcsICpkYXRhKTsKKwllbHNlCisJCXJldHVybiBpMmNfc21idXNfd3JpdGVfaTJjX2Jsb2NrX2RhdGEoJnRhcy0+aTJjLCByZWcsIGxlbiwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHRhc19zZXRfdm9sdW1lKHN0cnVjdCB0YXMgKnRhcykKK3sKKwl1OCBibG9ja1s2XTsKKwlpbnQgdG1wOworCXU4IGxlZnQsIHJpZ2h0OworCisJbGVmdCA9IHRhcy0+Y2FjaGVkX3ZvbHVtZV9sOworCXJpZ2h0ID0gdGFzLT5jYWNoZWRfdm9sdW1lX3I7CisKKwlpZiAobGVmdCA+IDE3NykgbGVmdCA9IDE3NzsKKwlpZiAocmlnaHQgPiAxNzcpIHJpZ2h0ID0gMTc3OworCisJaWYgKHRhcy0+bXV0ZWRfbCkgbGVmdCA9IDA7CisJaWYgKHRhcy0+bXV0ZWRfcikgcmlnaHQgPSAwOworCisJLyogYW5hbHlzaW5nIHRoZSB2b2x1bWUgYW5kIG1peGVyIHRhYmxlcyBzaG93cworCSAqIHRoYXQgdGhleSBhcmUgc2ltaWxhciBlbm91Z2ggd2hlbiB3ZSBzaGlmdAorCSAqIHRoZSBtaXhlciB0YWJsZSBkb3duIGJ5IDQgYml0cy4gVGhlIGVycm9yCisJICogaXMgbWluaXNjdWxlLCBpbiBqdXN0IG9uZSBpdGVtIHRoZSBlcnJvcgorCSAqIGlzIDEsIGF0IGEgdmFsdWUgb2YgMHgwN2YxN2IgKG1peGVyIHRhYmxlCisJICogdmFsdWUgaXMgMHgwN2YxN2EpICovCisJdG1wID0gdGFzX2dhaW50YWJsZVtsZWZ0XTsKKwlibG9ja1swXSA9IHRtcD4+MjA7CisJYmxvY2tbMV0gPSB0bXA+PjEyOworCWJsb2NrWzJdID0gdG1wPj40OworCXRtcCA9IHRhc19nYWludGFibGVbcmlnaHRdOworCWJsb2NrWzNdID0gdG1wPj4yMDsKKwlibG9ja1s0XSA9IHRtcD4+MTI7CisJYmxvY2tbNV0gPSB0bXA+PjQ7CisJdGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfVk9MLCA2LCBibG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRhc19zZXRfbWl4ZXIoc3RydWN0IHRhcyAqdGFzKQoreworCXU4IGJsb2NrWzldOworCWludCB0bXAsIGk7CisJdTggdmFsOworCisJZm9yIChpPTA7aTwzO2krKykgeworCQl2YWwgPSB0YXMtPm1peGVyX2xbaV07CisJCWlmICh2YWwgPiAxNzcpIHZhbCA9IDE3NzsKKwkJdG1wID0gdGFzX2dhaW50YWJsZVt2YWxdOworCQlibG9ja1szKmkrMF0gPSB0bXA+PjE2OworCQlibG9ja1szKmkrMV0gPSB0bXA+Pjg7CisJCWJsb2NrWzMqaSsyXSA9IHRtcDsKKwl9CisJdGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfTE1JWCwgOSwgYmxvY2spOworCisJZm9yIChpPTA7aTwzO2krKykgeworCQl2YWwgPSB0YXMtPm1peGVyX3JbaV07CisJCWlmICh2YWwgPiAxNzcpIHZhbCA9IDE3NzsKKwkJdG1wID0gdGFzX2dhaW50YWJsZVt2YWxdOworCQlibG9ja1szKmkrMF0gPSB0bXA+PjE2OworCQlibG9ja1szKmkrMV0gPSB0bXA+Pjg7CisJCWJsb2NrWzMqaSsyXSA9IHRtcDsKKwl9CisJdGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfUk1JWCwgOSwgYmxvY2spOworfQorCisvKiBhbHNhIHN0dWZmICovCisKK3N0YXRpYyBpbnQgdGFzX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgc25kX2RldmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKKwkuZGV2X3JlZ2lzdGVyID0gdGFzX2Rldl9yZWdpc3RlciwKK307CisKK3N0YXRpYyBpbnQgdGFzX3NuZF92b2xfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IDI7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAxNzc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzX3NuZF92b2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gdGFzLT5jYWNoZWRfdm9sdW1lX2w7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSB0YXMtPmNhY2hlZF92b2x1bWVfcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNfc25kX3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRhcyAqdGFzID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJaWYgKHRhcy0+Y2FjaGVkX3ZvbHVtZV9sID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdCisJICYmIHRhcy0+Y2FjaGVkX3ZvbHVtZV9yID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKQorCQlyZXR1cm4gMDsKKworCXRhcy0+Y2FjaGVkX3ZvbHVtZV9sID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdGFzLT5jYWNoZWRfdm9sdW1lX3IgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwl0YXNfc2V0X3ZvbHVtZSh0YXMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgdm9sdW1lX2NvbnRyb2wgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUsCisJLmluZm8gPSB0YXNfc25kX3ZvbF9pbmZvLAorCS5nZXQgPSB0YXNfc25kX3ZvbF9nZXQsCisJLnB1dCA9IHRhc19zbmRfdm9sX3B1dCwKK307CisKK3N0YXRpYyBpbnQgdGFzX3NuZF9tdXRlX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNfc25kX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gIXRhcy0+bXV0ZWRfbDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9ICF0YXMtPm11dGVkX3I7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzX3NuZF9tdXRlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGFzICp0YXMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlpZiAodGFzLT5tdXRlZF9sID09ICF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXQorCSAmJiB0YXMtPm11dGVkX3IgPT0gIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKQorCQlyZXR1cm4gMDsKKworCXRhcy0+bXV0ZWRfbCA9ICF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwl0YXMtPm11dGVkX3IgPSAhdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV07CisJdGFzX3NldF92b2x1bWUodGFzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG11dGVfY29udHJvbCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICJNYXN0ZXIgUGxheWJhY2sgU3dpdGNoIiwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuaW5mbyA9IHRhc19zbmRfbXV0ZV9pbmZvLAorCS5nZXQgPSB0YXNfc25kX211dGVfZ2V0LAorCS5wdXQgPSB0YXNfc25kX211dGVfcHV0LAorfTsKKworc3RhdGljIGludCB0YXNfc25kX21peGVyX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSAyOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTc3OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc19zbmRfbWl4ZXJfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgaWR4ID0ga2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHRhcy0+bWl4ZXJfbFtpZHhdOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gdGFzLT5taXhlcl9yW2lkeF07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0YXNfc25kX21peGVyX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdGFzICp0YXMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IGlkeCA9IGtjb250cm9sLT5wcml2YXRlX3ZhbHVlOworCisJaWYgKHRhcy0+bWl4ZXJfbFtpZHhdID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdCisJICYmIHRhcy0+bWl4ZXJfcltpZHhdID09IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKQorCQlyZXR1cm4gMDsKKworCXRhcy0+bWl4ZXJfbFtpZHhdID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJdGFzLT5taXhlcl9yW2lkeF0gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKworCXRhc19zZXRfbWl4ZXIodGFzKTsKKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBNSVhFUl9DT05UUk9MKG4sZGVzY3IsaWR4KQkJCVwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuIyNfY29udHJvbCA9IHsJCVwKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwJCVwKKwkubmFtZSA9IGRlc2NyICIgUGxheWJhY2sgVm9sdW1lIiwJCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwJXAorCS5pbmZvID0gdGFzX3NuZF9taXhlcl9pbmZvLAkJCVwKKwkuZ2V0ID0gdGFzX3NuZF9taXhlcl9nZXQsCQkJXAorCS5wdXQgPSB0YXNfc25kX21peGVyX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBpZHgsCQkJCVwKK30KKworTUlYRVJfQ09OVFJPTChwY20xLCAiUENNMSIsIDApOworTUlYRVJfQ09OVFJPTChtb25pdG9yLCAiTW9uaXRvciIsIDIpOworCitzdGF0aWMgaW50IHRhc19zbmRfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1tdID0geyAiTGluZS1JbiIsICJNaWNyb3Bob25lIiB9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDI7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAxKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc19zbmRfY2FwdHVyZV9zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSAhISh0YXMtPmFjciAmIFRBU19BQ1JfSU5QVVRfQik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFzX3NuZF9jYXB0dXJlX3NvdXJjZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHRhcyAqdGFzID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBvbGRhY3IgPSB0YXMtPmFjcjsKKworCXRhcy0+YWNyICY9IH5UQVNfQUNSX0lOUFVUX0I7CisJaWYgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0pCisJCXRhcy0+YWNyIHw9IFRBU19BQ1JfSU5QVVRfQjsKKwlpZiAob2xkYWNyID09IHRhcy0+YWNyKQorCQlyZXR1cm4gMDsKKwl0YXNfd3JpdGVfcmVnKHRhcywgVEFTX1JFR19BQ1IsIDEsICZ0YXMtPmFjcik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjYXB0dXJlX3NvdXJjZV9jb250cm9sID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS8qIElmIHdlIG5hbWUgdGhpcyAnSW5wdXQgU291cmNlJywgaXQgcHJvcGVybHkgc2hvd3MgdXAgaW4KKwkgKiBhbHNhbWl4ZXIgYXMgYSBzZWxlY3Rpb24sICogYnV0IGl0J3Mgc2hvd24gdW5kZXIgdGhlCisJICogJ1BsYXliYWNrJyBjYXRlZ29yeS4KKwkgKiBJZiBJIG5hbWUgaXQgJ0NhcHR1cmUgU291cmNlJywgaXQgc2hvd3MgdXAgaW4gc3RyYW5nZQorCSAqIHdheXMgKHR3byBib29scyBvZiB3aGljaCBvbmUgY2FuIGJlIHNlbGVjdGVkIGF0IGEKKwkgKiB0aW1lKSBidXQgYXQgbGVhc3QgaXQncyBzaG93biBpbiB0aGUgJ0NhcHR1cmUnCisJICogY2F0ZWdvcnkuCisJICogSSB3YXMgdG9sZCB0aGF0IHRoaXMgd2FzIGR1ZSB0byBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorCSAqIGJ1dCBJIGRvbid0IHVuZGVyc3RhbmQgdGhlbiB3aHkgdGhlIG1hbmdsaW5nIGlzICpub3QqCisJICogZG9uZSB3aGVuIEkgbmFtZSBpdCAiSW5wdXQgU291cmNlIi4uLi4uCisJICovCisJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pbmZvID0gdGFzX3NuZF9jYXB0dXJlX3NvdXJjZV9pbmZvLAorCS5nZXQgPSB0YXNfc25kX2NhcHR1cmVfc291cmNlX2dldCwKKwkucHV0ID0gdGFzX3NuZF9jYXB0dXJlX3NvdXJjZV9wdXQsCit9OworCisKK3N0YXRpYyBzdHJ1Y3QgdHJhbnNmZXJfaW5mbyB0YXNfdHJhbnNmZXJzW10gPSB7CisJeworCQkvKiBpbnB1dCAqLworCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAorCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUgfCBTTkRSVl9QQ01fRk1UQklUX1MyNF9CRSwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMzIwMDAgfCBTTkRSVl9QQ01fUkFURV80NDEwMCB8IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkudHJhbnNmZXJfaW4gPSAxLAorCX0sCisJeworCQkvKiBvdXRwdXQgKi8KKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9CRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfQkUsCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzMyMDAwIHwgU05EUlZfUENNX1JBVEVfNDQxMDAgfCBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLnRyYW5zZmVyX2luID0gMCwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgaW50IHRhc191c2FibGUoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLAorCQkgICAgICBzdHJ1Y3QgdHJhbnNmZXJfaW5mbyAqdGksCisJCSAgICAgIHN0cnVjdCB0cmFuc2Zlcl9pbmZvICpvdXQpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdGFzX3Jlc2V0X2luaXQoc3RydWN0IHRhcyAqdGFzKQoreworCXU4IHRtcDsKKwl0YXMtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldCh0YXMtPmNvZGVjLmdwaW8sIDApOworCW1zbGVlcCgxKTsKKwl0YXMtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldCh0YXMtPmNvZGVjLmdwaW8sIDEpOworCW1zbGVlcCgxKTsKKwl0YXMtPmNvZGVjLmdwaW8tPm1ldGhvZHMtPnNldF9od19yZXNldCh0YXMtPmNvZGVjLmdwaW8sIDApOworCW1zbGVlcCgxKTsKKworCXRhcy0+YWNyICY9IH5UQVNfQUNSX0FOQUxPR19QRE9XTjsKKwl0YXMtPmFjciB8PSBUQVNfQUNSX0JfTU9OQVVSRUFMIHwgVEFTX0FDUl9CX01PTl9TRUxfUklHSFQ7CisJaWYgKHRhc193cml0ZV9yZWcodGFzLCBUQVNfUkVHX0FDUiwgMSwgJnRhcy0+YWNyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0bXAgPSBUQVNfTUNTX1NDTEs2NCB8IFRBU19NQ1NfU1BPUlRfTU9ERV9JMlMgfCBUQVNfTUNTX1NQT1JUX1dMXzI0QklUOworCWlmICh0YXNfd3JpdGVfcmVnKHRhcywgVEFTX1JFR19NQ1MsIDEsICZ0bXApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRtcCA9IDA7CisJaWYgKHRhc193cml0ZV9yZWcodGFzLCBUQVNfUkVHX01DUzIsIDEsICZ0bXApKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCisvKiB3ZSBhcmUgY29udHJvbGxlZCB2aWEgaTJjIGFuZCBhc3N1bWUgdGhhdCBpcyBhbHdheXMgdXAKKyAqIElmIHRoYXQgd2Fzbid0IHRoZSBjYXNlLCB3ZSdkIGhhdmUgdG8gc3VzcGVuZCBvbmNlCisgKiBvdXIgaTJjIGRldmljZSBpcyBzdXNwZW5kZWQsIGFuZCB0aGVuIHRha2Ugbm90ZSBvZiB0aGF0ISAqLworc3RhdGljIGludCB0YXNfc3VzcGVuZChzdHJ1Y3QgdGFzICp0YXMpCit7CisJdGFzLT5hY3IgfD0gVEFTX0FDUl9BTkFMT0dfUERPV047CisJdGFzX3dyaXRlX3JlZyh0YXMsIFRBU19SRUdfQUNSLCAxLCAmdGFzLT5hY3IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRhc19yZXN1bWUoc3RydWN0IHRhcyAqdGFzKQoreworCS8qIHJlc2V0IGNvZGVjICovCisJdGFzX3Jlc2V0X2luaXQodGFzKTsKKwl0YXNfc2V0X3ZvbHVtZSh0YXMpOworCXRhc19zZXRfbWl4ZXIodGFzKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBfdGFzX3N1c3BlbmQoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcmV0dXJuIHRhc19zdXNwZW5kKGNpaS0+Y29kZWNfZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX3Rhc19yZXN1bWUoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpKQoreworCXJldHVybiB0YXNfcmVzdW1lKGNpaS0+Y29kZWNfZGF0YSk7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBjb2RlY19pbmZvIHRhc19jb2RlY19pbmZvID0geworCS50cmFuc2ZlcnMgPSB0YXNfdHJhbnNmZXJzLAorCS8qIGluIHRoZW9yeSwgd2UgY2FuIGRyaXZlIGl0IGF0IDUxMiB0b28uLi4KKwkgKiBidXQgc28gZmFyIHRoZSBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdworCSAqIGZvciB0aGF0IGFuZCBJIGRvbid0IHNlZSBtdWNoIHBvaW50IGluIGl0LiAqLworCS5zeXNjbG9ja19mYWN0b3IgPSAyNTYsCisJLyogc2FtZSBoZXJlLCBjb3VsZCBiZSAzMiBmb3IganVzdCBvbmUgMTYgYml0IGZvcm1hdCAqLworCS5idXNfZmFjdG9yID0gNjQsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnVzYWJsZSA9IHRhc191c2FibGUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBfdGFzX3N1c3BlbmQsCisJLnJlc3VtZSA9IF90YXNfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHRhc19pbml0X2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IGNvZGVjX3RvX3Rhcyhjb2RlYyk7CisJaW50IGVycjsKKworCWlmICghdGFzLT5jb2RlYy5ncGlvIHx8ICF0YXMtPmNvZGVjLmdwaW8tPm1ldGhvZHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZ3Bpb3Mgbm90IGFzc2lnbmVkISFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGFzX3Jlc2V0X2luaXQodGFzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0YXMgZmFpbGVkIHRvIGluaXRpYWxpc2VcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWlmICh0YXMtPmNvZGVjLnNvdW5kYnVzX2Rldi0+YXR0YWNoX2NvZGVjKHRhcy0+Y29kZWMuc291bmRidXNfZGV2LAorCQkJCQkJICAgYW9hX2dldF9jYXJkKCksCisJCQkJCQkgICAmdGFzX2NvZGVjX2luZm8sIHRhcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyb3IgYXR0YWNoaW5nIHRhcyB0byBzb3VuZGJ1c1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhb2Ffc25kX2RldmljZV9uZXcoU05EUlZfREVWX0xPV0xFVkVMLCB0YXMsICZvcHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZhaWxlZCB0byBjcmVhdGUgdGFzIHNuZCBkZXZpY2UhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWVyciA9IGFvYV9zbmRfY3RsX2FkZChzbmRfY3RsX25ldzEoJnZvbHVtZV9jb250cm9sLCB0YXMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gYW9hX3NuZF9jdGxfYWRkKHNuZF9jdGxfbmV3MSgmbXV0ZV9jb250cm9sLCB0YXMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gYW9hX3NuZF9jdGxfYWRkKHNuZF9jdGxfbmV3MSgmcGNtMV9jb250cm9sLCB0YXMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gYW9hX3NuZF9jdGxfYWRkKHNuZF9jdGxfbmV3MSgmbW9uaXRvcl9jb250cm9sLCB0YXMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJZXJyID0gYW9hX3NuZF9jdGxfYWRkKHNuZF9jdGxfbmV3MSgmY2FwdHVyZV9zb3VyY2VfY29udHJvbCwgdGFzKSk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworIGVycm9yOgorCXRhcy0+Y29kZWMuc291bmRidXNfZGV2LT5kZXRhY2hfY29kZWModGFzLT5jb2RlYy5zb3VuZGJ1c19kZXYsIHRhcyk7CisJc25kX2RldmljZV9mcmVlKGFvYV9nZXRfY2FyZCgpLCB0YXMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHRhc19leGl0X2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0YXMgKnRhcyA9IGNvZGVjX3RvX3Rhcyhjb2RlYyk7CisKKwlpZiAoIXRhcy0+Y29kZWMuc291bmRidXNfZGV2KQorCQlyZXR1cm47CisJdGFzLT5jb2RlYy5zb3VuZGJ1c19kZXYtPmRldGFjaF9jb2RlYyh0YXMtPmNvZGVjLnNvdW5kYnVzX2RldiwgdGFzKTsKK30KKwkKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRhc19kcml2ZXI7CisKK3N0YXRpYyBpbnQgdGFzX2NyZWF0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCSAgICAgICBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgdGFzICp0YXM7CisKKwl0YXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGFzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRhcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0YXMtPmkyYy5kcml2ZXIgPSAmdGFzX2RyaXZlcjsKKwl0YXMtPmkyYy5hZGFwdGVyID0gYWRhcHRlcjsKKwl0YXMtPmkyYy5hZGRyID0gYWRkcjsKKwlzdHJsY3B5KHRhcy0+aTJjLm5hbWUsICJ0YXMgYXVkaW8gY29kZWMiLCBJMkNfTkFNRV9TSVpFLTEpOworCisJaWYgKGkyY19hdHRhY2hfY2xpZW50KCZ0YXMtPmkyYykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGF0dGFjaCB0byBpMmNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJc3RybGNweSh0YXMtPmNvZGVjLm5hbWUsICJ0YXMiLCBNQVhfQ09ERUNfTkFNRV9MRU4tMSk7CisJdGFzLT5jb2RlYy5vd25lciA9IFRISVNfTU9EVUxFOworCXRhcy0+Y29kZWMuaW5pdCA9IHRhc19pbml0X2NvZGVjOworCXRhcy0+Y29kZWMuZXhpdCA9IHRhc19leGl0X2NvZGVjOworCXRhcy0+Y29kZWMubm9kZSA9IG9mX25vZGVfZ2V0KG5vZGUpOworCisJaWYgKGFvYV9jb2RlY19yZWdpc3RlcigmdGFzLT5jb2RlYykpIHsKKwkJZ290byBkZXRhY2g7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJzbmQtYW9hLWNvZGVjLXRhczogY3JlYXRlZCBhbmQgYXR0YWNoZWQgdGFzIGluc3RhbmNlXG4iKTsKKwlyZXR1cm4gMDsKKyBkZXRhY2g6CisJaTJjX2RldGFjaF9jbGllbnQoJnRhcy0+aTJjKTsKKyBmYWlsOgorCWtmcmVlKHRhcyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdGFzX2kyY19hdHRhY2goc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqYnVzbm9kZSwgKmRldiA9IE5VTEw7CisJc3RydWN0IHBtYWNfaTJjX2J1cyAqYnVzOworCisJYnVzID0gcG1hY19pMmNfYWRhcHRlcl90b19idXMoYWRhcHRlcik7CisJaWYgKGJ1cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlidXNub2RlID0gcG1hY19pMmNfZ2V0X2J1c19ub2RlKGJ1cyk7CisKKwl3aGlsZSAoKGRldiA9IG9mX2dldF9uZXh0X2NoaWxkKGJ1c25vZGUsIGRldikpICE9IE5VTEwpIHsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGRldiwgInRhczMwMDQiKSkgeworCQkJdTMyICphZGRyOworCQkJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJmb3VuZCB0YXMzMDA0XG4iKTsKKwkJCWFkZHIgPSAodTMyICopIGdldF9wcm9wZXJ0eShkZXYsICJyZWciLCBOVUxMKTsKKwkJCWlmICghYWRkcikKKwkJCQljb250aW51ZTsKKwkJCXJldHVybiB0YXNfY3JlYXRlKGFkYXB0ZXIsIGRldiwgKCgqYWRkcikgPj4gMSkgJiAweDdmKTsKKwkJfQorCQkvKiBvbGRlciBtYWNoaW5lcyBoYXZlIG5vICdjb2RlYycgbm9kZSB3aXRoIGEgJ2NvbXBhdGlibGUnCisJCSAqIHByb3BlcnR5IHRoYXQgc2F5cyAndGFzMzAwNCcsIHRoZXkganVzdCBoYXZlIGEgJ2RlcScKKwkJICogbm9kZSB3aXRob3V0IGFueSBzdWNoIHByb3BlcnR5Li4uICovCisJCWlmIChzdHJjbXAoZGV2LT5uYW1lLCAiZGVxIikgPT0gMCkgeworCQkJdTMyICpfYWRkciwgYWRkcjsKKwkJCXByaW50ayhLRVJOX0RFQlVHIFBGWCAiZm91bmQgJ2RlcScgbm9kZVxuIik7CisJCQlfYWRkciA9ICh1MzIgKikgZ2V0X3Byb3BlcnR5KGRldiwgImkyYy1hZGRyZXNzIiwgTlVMTCk7CisJCQlpZiAoIV9hZGRyKQorCQkJCWNvbnRpbnVlOworCQkJYWRkciA9ICgoKl9hZGRyKSA+PiAxKSAmIDB4N2Y7CisJCQkvKiBub3csIGlmIHRoZSBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSB0d28KKwkJCSAqIHRoYXQgYSB0YXMzMDA0IGNhbiBoYXZlLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMuCisJCQkgKiBJIGRvdWJ0IGl0IGV2ZXIgaGFwcGVucyBidXQgaGV5LiAqLworCQkJaWYgKGFkZHIgIT0gMHgzNCAmJiBhZGRyICE9IDB4MzUpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gdGFzX2NyZWF0ZShhZGFwdGVyLCBkZXYsIGFkZHIpOworCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IHRhc19pMmNfZGV0YWNoKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHRhcyAqdGFzID0gY29udGFpbmVyX29mKGNsaWVudCwgc3RydWN0IHRhcywgaTJjKTsKKwlpbnQgZXJyOworCXU4IHRtcCA9IFRBU19BQ1JfQU5BTE9HX1BET1dOOworCisJaWYgKChlcnIgPSBpMmNfZGV0YWNoX2NsaWVudChjbGllbnQpKSkKKwkJcmV0dXJuIGVycjsKKwlhb2FfY29kZWNfdW5yZWdpc3RlcigmdGFzLT5jb2RlYyk7CisJb2Zfbm9kZV9wdXQodGFzLT5jb2RlYy5ub2RlKTsKKworCS8qIHBvd2VyIGRvd24gY29kZWMgY2hpcCAqLworCXRhc193cml0ZV9yZWcodGFzLCBUQVNfUkVHX0FDUiwgMSwgJnRtcCk7CisKKwlrZnJlZSh0YXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdGFzX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhb2FfY29kZWNfdGFzIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuYXR0YWNoX2FkYXB0ZXIgPSB0YXNfaTJjX2F0dGFjaCwKKwkuZGV0YWNoX2NsaWVudCA9IHRhc19pMmNfZGV0YWNoLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGFzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRhc19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGFzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdGFzX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHRhc19pbml0KTsKK21vZHVsZV9leGl0KHRhc19leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuaCBiL3NvdW5kL2FvYS9jb2RlY3Mvc25kLWFvYS1jb2RlYy10YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY4MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRhcy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIGRyaXZlciBmb3IgdGFzIGNvZGVjIChoZWFkZXIpCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisjaWZuZGVmIF9fU05EX0FPQV9DT0RFQ1RBU0gKKyNkZWZpbmUgX19TTkRfQU9BX0NPREVDVEFTSAorCisjZGVmaW5lIFRBU19SRUdfTUNTCTB4MDEJLyogbWFpbiBjb250cm9sICovCisjCWRlZmluZSBUQVNfTUNTX0ZBU1RMT0FECQkoMTw8NykKKyMJZGVmaW5lIFRBU19NQ1NfU0NMSzY0CQkoMTw8NikKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfTU9ERV9NQVNLCSgzPDw0KQorIwlkZWZpbmUgVEFTX01DU19TUE9SVF9NT0RFX0kyUwkoMjw8NCkKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfTU9ERV9SSgkoMTw8NCkKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfTU9ERV9MSgkoMDw8NCkKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfV0xfTUFTSwkoMzw8MCkKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfV0xfMTZCSVQJKDA8PDApCisjCWRlZmluZSBUQVNfTUNTX1NQT1JUX1dMXzE4QklUCSgxPDwwKQorIwlkZWZpbmUgVEFTX01DU19TUE9SVF9XTF8yMEJJVAkoMjw8MCkKKyMJZGVmaW5lIFRBU19NQ1NfU1BPUlRfV0xfMjRCSVQJKDM8PDApCisKKyNkZWZpbmUgVEFTX1JFR19EUkMJMHgwMgorI2RlZmluZSBUQVNfUkVHX1ZPTAkweDA0CisjZGVmaW5lIFRBU19SRUdfVFJFQkxFCTB4MDUKKyNkZWZpbmUgVEFTX1JFR19CQVNTCTB4MDYKKyNkZWZpbmUgVEFTX1JFR19MTUlYCTB4MDcKKyNkZWZpbmUgVEFTX1JFR19STUlYCTB4MDgKKworI2RlZmluZSBUQVNfUkVHX0FDUgkweDQwCS8qIGFuYWxvZyBjb250cm9sICovCisjCWRlZmluZSBUQVNfQUNSX0JfTU9OQVVSRUFMCSgxPDw3KQorIwlkZWZpbmUgVEFTX0FDUl9CX01PTl9TRUxfUklHSFQJKDE8PDYpCisjCWRlZmluZSBUQVNfQUNSX0RFRU1QSF9NQVNLCSgzPDwyKQorIwlkZWZpbmUgVEFTX0FDUl9ERUVNUEhfT0ZGCSgwPDwyKQorIwlkZWZpbmUgVEFTX0FDUl9ERUVNUEhfNDhLSHoJKDE8PDIpCisjCWRlZmluZSBUQVNfQUNSX0RFRU1QSF80NEtIegkoMjw8MikKKyMJZGVmaW5lIFRBU19BQ1JfSU5QVVRfQgkJKDE8PDEpCisjCWRlZmluZSBUQVNfQUNSX0FOQUxPR19QRE9XTgkoMTw8MCkKKworI2RlZmluZSBUQVNfUkVHX01DUzIJMHg0MwkvKiBtYWluIGNvbnRyb2wgMiAqLworIwlkZWZpbmUgVEFTX01DUzJfQUxMUEFTUwkJKDE8PDEpCisKKyNkZWZpbmUgVEFTX1JFR19MRUZUX0JJUVVBRDYJMHgxMAorI2RlZmluZSBUQVNfUkVHX1JJR0hUX0JJUVVBRDYJMHgxOQorCisjZW5kaWYgLyogX19TTkRfQU9BX0NPREVDVEFTSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRvb25pZS5jIGIvc291bmQvYW9hL2NvZGVjcy9zbmQtYW9hLWNvZGVjLXRvb25pZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYzU1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29kZWNzL3NuZC1hb2EtY29kZWMtdG9vbmllLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIGRyaXZlciBmb3IgVG9vbmllIGNvZGVjCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICoKKyAqCisgKiBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgdG9vbmllIGNvZGVjIGNoaXAuIFRoaXMgY2hpcCBpcyBwcmVzZW50CisgKiBvbiB0aGUgTWFjIE1pbmkgYW5kIGlzIG5vdGhpbmcgYnV0IGEgREFDLgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRvb25pZSBjb2RlYyBkcml2ZXIgZm9yIHNuZC1hb2EiKTsKKworI2luY2x1ZGUgIi4uL2FvYS5oIgorI2luY2x1ZGUgIi4uL3NvdW5kYnVzL3NvdW5kYnVzLmgiCisKKworI2RlZmluZSBQRlggInNuZC1hb2EtY29kZWMtdG9vbmllOiAiCisKK3N0cnVjdCB0b29uaWUgeworCXN0cnVjdCBhb2FfY29kZWMJY29kZWM7Cit9OworI2RlZmluZSBjb2RlY190b190b29uaWUoYykgY29udGFpbmVyX29mKGMsIHN0cnVjdCB0b29uaWUsIGNvZGVjKQorCitzdGF0aWMgaW50IHRvb25pZV9kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CisJLmRldl9yZWdpc3RlciA9IHRvb25pZV9kZXZfcmVnaXN0ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHRyYW5zZmVyX2luZm8gdG9vbmllX3RyYW5zZmVyc1tdID0geworCS8qIFRoaXMgdGhpbmcgKm9ubHkqIGhhcyBhbmFsb2cgb3V0cHV0LAorCSAqIHRoZSByYXRlcyBhcmUgdGFrZW4gZnJvbSBJbmZvLnBsaXN0CisJICogZnJvbSBEYXJ3aW4uICovCisJeworCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0JFIHwKKwkJCSAgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfNDQxMDAgfAorCQkJIFNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJCSBTTkRSVl9QQ01fUkFURV84ODIwMCB8CisJCQkgU05EUlZfUENNX1JBVEVfOTYwMDAsCisJfSwKKwl7fQorfTsKKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB0b29uaWVfc3VzcGVuZChzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwkvKiBjYW4gd2UgdHVybiBpdCBvZmYgc29tZWhvdz8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0b29uaWVfcmVzdW1lKHN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIHN0cnVjdCBjb2RlY19pbmZvIHRvb25pZV9jb2RlY19pbmZvID0geworCS50cmFuc2ZlcnMgPSB0b29uaWVfdHJhbnNmZXJzLAorCS5zeXNjbG9ja19mYWN0b3IgPSAyNTYsCisJLmJ1c19mYWN0b3IgPSA2NCwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IHRvb25pZV9zdXNwZW5kLAorCS5yZXN1bWUgPSB0b29uaWVfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHRvb25pZV9pbml0X2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB0b29uaWUgKnRvb25pZSA9IGNvZGVjX3RvX3Rvb25pZShjb2RlYyk7CisKKwlpZiAoYW9hX3NuZF9kZXZpY2VfbmV3KFNORFJWX0RFVl9MT1dMRVZFTCwgdG9vbmllLCAmb3BzKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJmYWlsZWQgdG8gY3JlYXRlIHRvb25pZSBzbmQgZGV2aWNlIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIG5vdGhpbmcgY29ubmVjdGVkPyB3aGF0IGEgam9rZSEgKi8KKwlpZiAodG9vbmllLT5jb2RlYy5jb25uZWN0ZWQgIT0gMSkKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCWlmICh0b29uaWUtPmNvZGVjLnNvdW5kYnVzX2Rldi0+YXR0YWNoX2NvZGVjKHRvb25pZS0+Y29kZWMuc291bmRidXNfZGV2LAorCQkJCQkJICAgICBhb2FfZ2V0X2NhcmQoKSwKKwkJCQkJCSAgICAgJnRvb25pZV9jb2RlY19pbmZvLCB0b29uaWUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImVycm9yIGNyZWF0aW5nIHRvb25pZSBwY21cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdG9vbmllX2V4aXRfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHRvb25pZSAqdG9vbmllID0gY29kZWNfdG9fdG9vbmllKGNvZGVjKTsKKworCWlmICghdG9vbmllLT5jb2RlYy5zb3VuZGJ1c19kZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidG9vbmllX2V4aXRfY29kZWMgY2FsbGVkIHdpdGhvdXQgc291bmRidXNfZGV2IVxuIik7CisJCXJldHVybjsKKwl9CisJdG9vbmllLT5jb2RlYy5zb3VuZGJ1c19kZXYtPmRldGFjaF9jb2RlYyh0b29uaWUtPmNvZGVjLnNvdW5kYnVzX2RldiwgdG9vbmllKTsKK30KKworc3RhdGljIHN0cnVjdCB0b29uaWUgKnRvb25pZTsKKworc3RhdGljIGludCBfX2luaXQgdG9vbmllX2luaXQodm9pZCkKK3sKKwl0b29uaWUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdG9vbmllKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRvb25pZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzdHJsY3B5KHRvb25pZS0+Y29kZWMubmFtZSwgInRvb25pZSIsIHNpemVvZih0b29uaWUtPmNvZGVjLm5hbWUpKTsKKwl0b29uaWUtPmNvZGVjLm93bmVyID0gVEhJU19NT0RVTEU7CisJdG9vbmllLT5jb2RlYy5pbml0ID0gdG9vbmllX2luaXRfY29kZWM7CisJdG9vbmllLT5jb2RlYy5leGl0ID0gdG9vbmllX2V4aXRfY29kZWM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKGFvYV9jb2RlY19yZWdpc3RlcigmdG9vbmllLT5jb2RlYykpIHsKKwkJa2ZyZWUodG9vbmllKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0b29uaWVfZXhpdCh2b2lkKQoreworCWFvYV9jb2RlY191bnJlZ2lzdGVyKCZ0b29uaWUtPmNvZGVjKTsKKwlrZnJlZSh0b29uaWUpOworfQorCittb2R1bGVfaW5pdCh0b29uaWVfaW5pdCk7Cittb2R1bGVfZXhpdCh0b29uaWVfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvY29yZS9NYWtlZmlsZSBiL3NvdW5kL2FvYS9jb3JlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGM3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29yZS9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19TTkRfQU9BKSArPSBzbmQtYW9hLm8KK3NuZC1hb2Etb2JqcyA6PSBzbmQtYW9hLWNvcmUubyBcCisJCXNuZC1hb2EtYWxzYS5vIFwKKwkJc25kLWFvYS1ncGlvLXBtZi5vIFwKKwkJc25kLWFvYS1ncGlvLWZlYXR1cmUubwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmMgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWFsc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDJmZGVhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIEFwcGxlIE9uYm9hcmQgQXVkaW8gQWxzYSBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAic25kLWFvYS1hbHNhLmgiCisKK3N0YXRpYyBpbnQgaW5kZXggPSAtMTsKK21vZHVsZV9wYXJhbShpbmRleCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJpbmRleCBmb3IgQU9BIHNvdW5kIGNhcmQuIik7CisKK3N0YXRpYyBzdHJ1Y3QgYW9hX2NhcmQgKmFvYV9jYXJkOworCitpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IHNuZF9jYXJkICphbHNhX2NhcmQ7CisJaW50IGVycjsKKworCWlmIChhb2FfY2FyZCkKKwkJLyogY2Fubm90IGJlIEVFWElTVCBkdWUgdG8gdXNhZ2UgaW4gYW9hX2ZhYnJpY19yZWdpc3RlciAqLworCQlyZXR1cm4gLUVCVVNZOworCisJYWxzYV9jYXJkID0gc25kX2NhcmRfbmV3KGluZGV4LCBuYW1lLCBtb2QsIHNpemVvZihzdHJ1Y3QgYW9hX2NhcmQpKTsKKwlpZiAoIWFsc2FfY2FyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJYW9hX2NhcmQgPSBhbHNhX2NhcmQtPnByaXZhdGVfZGF0YTsKKwlhb2FfY2FyZC0+YWxzYV9jYXJkID0gYWxzYV9jYXJkOworCXN0cmxjcHkoYWxzYV9jYXJkLT5kcml2ZXIsICJBcHBsZU9uYmRBdWRpbyIsIHNpemVvZihhbHNhX2NhcmQtPmRyaXZlcikpOworCXN0cmxjcHkoYWxzYV9jYXJkLT5zaG9ydG5hbWUsIG5hbWUsIHNpemVvZihhbHNhX2NhcmQtPnNob3J0bmFtZSkpOworCXN0cmxjcHkoYWxzYV9jYXJkLT5sb25nbmFtZSwgbmFtZSwgc2l6ZW9mKGFsc2FfY2FyZC0+bG9uZ25hbWUpKTsKKwlzdHJsY3B5KGFsc2FfY2FyZC0+bWl4ZXJuYW1lLCBuYW1lLCBzaXplb2YoYWxzYV9jYXJkLT5taXhlcm5hbWUpKTsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3Rlcihhb2FfY2FyZC0+YWxzYV9jYXJkKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgInNuZC1hb2E6IGNvdWxkbid0IHJlZ2lzdGVyIGFsc2EgY2FyZFxuIik7CisJCXNuZF9jYXJkX2ZyZWUoYW9hX2NhcmQtPmFsc2FfY2FyZCk7CisJCWFvYV9jYXJkID0gTlVMTDsKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzbmRfY2FyZCAqYW9hX2dldF9jYXJkKHZvaWQpCit7CisJaWYgKGFvYV9jYXJkKQorCQlyZXR1cm4gYW9hX2NhcmQtPmFsc2FfY2FyZDsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFvYV9nZXRfY2FyZCk7CisKK3ZvaWQgYW9hX2Fsc2FfY2xlYW51cCh2b2lkKQoreworCWlmIChhb2FfY2FyZCkgeworCQlzbmRfY2FyZF9mcmVlKGFvYV9jYXJkLT5hbHNhX2NhcmQpOworCQlhb2FfY2FyZCA9IE5VTEw7CisJfQorfQorCitpbnQgYW9hX3NuZF9kZXZpY2VfbmV3KHNuZF9kZXZpY2VfdHlwZV90IHR5cGUsCisgICAgICAgIHZvaWQgKiBkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICogb3BzKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGFvYV9nZXRfY2FyZCgpOworCWludCBlcnI7CisJCisJaWYgKCFjYXJkKSByZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIHR5cGUsIGRldmljZV9kYXRhLCBvcHMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbmQtYW9hOiBmYWlsZWQgdG8gY3JlYXRlIHNuZCBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gc25kX2RldmljZV9yZWdpc3RlcihjYXJkLCBkZXZpY2VfZGF0YSk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNuZC1hb2E6IGZhaWxlZCB0byByZWdpc3RlciAiCisJCQkJInNuZCBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbmQtYW9hOiBoYXZlIHlvdSBmb3Jnb3R0ZW4gdGhlICIKKwkJCQkiZGV2X3JlZ2lzdGVyIGNhbGxiYWNrP1xuIik7CisJCXNuZF9kZXZpY2VfZnJlZShjYXJkLCBkZXZpY2VfZGF0YSk7CisJfQorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhb2Ffc25kX2RldmljZV9uZXcpOworCitpbnQgYW9hX3NuZF9jdGxfYWRkKHN0cnVjdCBzbmRfa2NvbnRyb2wqIGNvbnRyb2wpCit7CisJaW50IGVycjsKKworCWlmICghYW9hX2NhcmQpIHJldHVybiAtRU5PREVWOworCisJZXJyID0gc25kX2N0bF9hZGQoYW9hX2NhcmQtPmFsc2FfY2FyZCwgY29udHJvbCk7CisJaWYgKGVycikKKwkJcHJpbnRrKEtFUk5fRVJSICJzbmQtYW9hOiBmYWlsZWQgdG8gYWRkIGFsc2EgY29udHJvbCAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYW9hX3NuZF9jdGxfYWRkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5oIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1hbHNhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwZDJmMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtYWxzYS5oCkBAIC0wLDAgKzEsMTYgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIEFsc2EgcHJpdmF0ZSBoZWxwZXJzCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpZm5kZWYgX19TTkRfQU9BX0FMU0FfSAorI2RlZmluZSBfX1NORF9BT0FfQUxTQV9ICisjaW5jbHVkZSAiLi4vYW9hLmgiCisKK2V4dGVybiBpbnQgYW9hX2Fsc2FfaW5pdChjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2QpOworZXh0ZXJuIHZvaWQgYW9hX2Fsc2FfY2xlYW51cCh2b2lkKTsKKworI2VuZGlmIC8qIF9fU05EX0FPQV9BTFNBX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtY29yZS5jIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNkMmQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtY29yZS5jCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQXBwbGUgT25ib2FyZCBBdWRpbyBkcml2ZXIgY29yZQorICoKKyAqIENvcHlyaWdodCAyMDA2IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogR1BMIHYyLCBjYW4gYmUgZm91bmQgaW4gQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlICIuLi9hb2EuaCIKKyNpbmNsdWRlICJzbmQtYW9hLWFsc2EuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZSBPbmJvYXJkIEF1ZGlvIFNvdW5kIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogV2UgYWxsb3cgb25seSBvbmUgZmFicmljLiBUaGlzIHNpbXBsaWZpZXMgdGhpbmdzLAorICogYW5kIG1vcmUgZG9uJ3QgcmVhbGx5IG1ha2UgdGhhdCBtdWNoIHNlbnNlICovCitzdGF0aWMgc3RydWN0IGFvYV9mYWJyaWMgKmZhYnJpYzsKK3N0YXRpYyBMSVNUX0hFQUQoY29kZWNfbGlzdCk7CisKK3N0YXRpYyBpbnQgYXR0YWNoX2NvZGVjX3RvX2ZhYnJpYyhzdHJ1Y3QgYW9hX2NvZGVjICpjKQoreworCWludCBlcnI7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGMtPm93bmVyKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkvKiBmb3VuZF9jb2RlYyBoYXMgdG8gYmUgYXNzaWduZWQgKi8KKwllcnIgPSAtRU5PRU5UOworCWlmIChmYWJyaWMtPmZvdW5kX2NvZGVjKQorCQllcnIgPSBmYWJyaWMtPmZvdW5kX2NvZGVjKGMpOworCWlmIChlcnIpIHsKKwkJbW9kdWxlX3B1dChjLT5vd25lcik7CisJCXByaW50ayhLRVJOX0VSUiAic25kLWFvYTogZmFicmljIGRpZG4ndCBsaWtlIGNvZGVjICVzXG4iLAorCQkJCWMtPm5hbWUpOworCQlyZXR1cm4gZXJyOworCX0KKwljLT5mYWJyaWMgPSBmYWJyaWM7CisKKwllcnIgPSAwOworCWlmIChjLT5pbml0KQorCQllcnIgPSBjLT5pbml0KGMpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbmQtYW9hOiBjb2RlYyAlcyBkaWRuJ3QgaW5pdFxuIiwgYy0+bmFtZSk7CisJCWMtPmZhYnJpYyA9IE5VTEw7CisJCWlmIChmYWJyaWMtPnJlbW92ZV9jb2RlYykKKwkJCWZhYnJpYy0+cmVtb3ZlX2NvZGVjKGMpOworCQltb2R1bGVfcHV0KGMtPm93bmVyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGZhYnJpYy0+YXR0YWNoZWRfY29kZWMpCisJCWZhYnJpYy0+YXR0YWNoZWRfY29kZWMoYyk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhb2FfY29kZWNfcmVnaXN0ZXIoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGVyciA9IDA7CisKKwkvKiBpZiB0aGVyZSdzIGEgZmFicmljIGFscmVhZHksIHdlIGNhbiB0ZWxsIGlmIHdlCisJICogd2lsbCB3YW50IHRvIGhhdmUgdGhpcyBjb2RlYywgc28gcHJvcGFnYXRlIGVycm9yCisJICogdGhyb3VnaC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgaGFwcGVuIGxhdGVyLi4uICovCisJaWYgKGZhYnJpYykKKwkJZXJyID0gYXR0YWNoX2NvZGVjX3RvX2ZhYnJpYyhjb2RlYyk7CisJaWYgKCFlcnIpCisJCWxpc3RfYWRkKCZjb2RlYy0+bGlzdCwgJmNvZGVjX2xpc3QpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhb2FfY29kZWNfcmVnaXN0ZXIpOworCit2b2lkIGFvYV9jb2RlY191bnJlZ2lzdGVyKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCWxpc3RfZGVsKCZjb2RlYy0+bGlzdCk7CisJaWYgKGNvZGVjLT5mYWJyaWMgJiYgY29kZWMtPmV4aXQpCisJCWNvZGVjLT5leGl0KGNvZGVjKTsKKwlpZiAoZmFicmljICYmIGZhYnJpYy0+cmVtb3ZlX2NvZGVjKQorCQlmYWJyaWMtPnJlbW92ZV9jb2RlYyhjb2RlYyk7CisJY29kZWMtPmZhYnJpYyA9IE5VTEw7CisJbW9kdWxlX3B1dChjb2RlYy0+b3duZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYW9hX2NvZGVjX3VucmVnaXN0ZXIpOworCitpbnQgYW9hX2ZhYnJpY19yZWdpc3RlcihzdHJ1Y3QgYW9hX2ZhYnJpYyAqbmV3X2ZhYnJpYykKK3sKKwlzdHJ1Y3QgYW9hX2NvZGVjICpjOworCWludCBlcnI7CisKKwkvKiBhbGxvdyBxdWVyeWluZyBmb3IgcHJlc2VuY2Ugb2YgZmFicmljCisJICogKGkuZS4gZG8gdGhpcyB0ZXN0IGZpcnN0ISkgKi8KKwlpZiAobmV3X2ZhYnJpYyA9PSBmYWJyaWMpIHsKKwkJZXJyID0gLUVBTFJFQURZOworCQlnb3RvIGF0dGFjaDsKKwl9CisJaWYgKGZhYnJpYykKKwkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKCFuZXdfZmFicmljKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IGFvYV9hbHNhX2luaXQobmV3X2ZhYnJpYy0+bmFtZSwgbmV3X2ZhYnJpYy0+b3duZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmYWJyaWMgPSBuZXdfZmFicmljOworCisgYXR0YWNoOgorCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGMtPmZhYnJpYyAhPSBmYWJyaWMpCisJCQlhdHRhY2hfY29kZWNfdG9fZmFicmljKGMpOworCX0KKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYW9hX2ZhYnJpY19yZWdpc3Rlcik7CisKK3ZvaWQgYW9hX2ZhYnJpY191bnJlZ2lzdGVyKHN0cnVjdCBhb2FfZmFicmljICpvbGRfZmFicmljKQoreworCXN0cnVjdCBhb2FfY29kZWMgKmM7CisKKwlpZiAoZmFicmljICE9IG9sZF9mYWJyaWMpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGMtPmZhYnJpYykKKwkJCWFvYV9mYWJyaWNfdW5saW5rX2NvZGVjKGMpOworCX0KKworCWFvYV9hbHNhX2NsZWFudXAoKTsKKworCWZhYnJpYyA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhb2FfZmFicmljX3VucmVnaXN0ZXIpOworCit2b2lkIGFvYV9mYWJyaWNfdW5saW5rX2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCWlmICghY29kZWMtPmZhYnJpYykgeworCQlwcmludGsoS0VSTl9FUlIgInNuZC1hb2E6IGZhYnJpYyB1bmFzc2lnbmVkICIKKwkJCQkiaW4gYW9hX2ZhYnJpY191bmxpbmtfY29kZWNcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybjsKKwl9CisJaWYgKGNvZGVjLT5leGl0KQorCQljb2RlYy0+ZXhpdChjb2RlYyk7CisJaWYgKGNvZGVjLT5mYWJyaWMtPnJlbW92ZV9jb2RlYykKKwkJY29kZWMtPmZhYnJpYy0+cmVtb3ZlX2NvZGVjKGNvZGVjKTsKKwljb2RlYy0+ZmFicmljID0gTlVMTDsKKwltb2R1bGVfcHV0KGNvZGVjLT5vd25lcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhb2FfZmFicmljX3VubGlua19jb2RlYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGFvYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhb2FfZXhpdCh2b2lkKQoreworCWFvYV9hbHNhX2NsZWFudXAoKTsKK30KKworbW9kdWxlX2luaXQoYW9hX2luaXQpOworbW9kdWxlX2V4aXQoYW9hX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLWZlYXR1cmUuYyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtZ3Bpby1mZWF0dXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2ZWI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9jb3JlL3NuZC1hb2EtZ3Bpby1mZWF0dXJlLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIGZlYXR1cmUgY2FsbCBHUElPIGNvbnRyb2wKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTCB2MiwgY2FuIGJlIGZvdW5kIGluIENPUFlJTkcuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBHUElPIGNvbnRyb2wgcm91dGluZXMgZm9yIAorICogZGlyZWN0ICh0aHJvdWdoIGZlYXR1cmUgY2FsbHMpIGFjY2VzcyB0byB0aGUgR1BJTworICogcmVnaXN0ZXJzLgorICovCisKKyNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSAiLi4vYW9hLmgiCisKKy8qIFRPRE86IHRoZXNlIGFyZSAyMCBnbG9iYWwgdmFyaWFibGVzCisgKiB0aGF0IGFyZW4ndCB1c2VkIG9uIG1vc3QgbWFjaGluZXMuLi4KKyAqIE1vdmUgdGhlbSBpbnRvIGEgZHluYW1pY2FsbHkgYWxsb2NhdGVkCisgKiBzdHJ1Y3R1cmUgYW5kIHVzZSB0aGF0LgorICovCisKKy8qIHRoZXNlIGFyZSB0aGUgR1BJTyBudW1iZXJzIChyZWdpc3RlciBhZGRyZXNzZXMgYXMgb2Zmc2V0cyBpbnRvCisgKiB0aGUgR1BJTyBzcGFjZSkgKi8KK3N0YXRpYyBpbnQgaGVhZHBob25lX211dGVfZ3BpbzsKK3N0YXRpYyBpbnQgYW1wX211dGVfZ3BpbzsKK3N0YXRpYyBpbnQgbGluZW91dF9tdXRlX2dwaW87CitzdGF0aWMgaW50IGh3X3Jlc2V0X2dwaW87CitzdGF0aWMgaW50IGxpbmVvdXRfZGV0ZWN0X2dwaW87CitzdGF0aWMgaW50IGhlYWRwaG9uZV9kZXRlY3RfZ3BpbzsKK3N0YXRpYyBpbnQgbGluZWluX2RldGVjdF9ncGlvOworCisvKiBzZWUgdGhlIFNXSVRDSF9HUElPIG1hY3JvICovCitzdGF0aWMgaW50IGhlYWRwaG9uZV9tdXRlX2dwaW9fYWN0aXZlc3RhdGU7CitzdGF0aWMgaW50IGFtcF9tdXRlX2dwaW9fYWN0aXZlc3RhdGU7CitzdGF0aWMgaW50IGxpbmVvdXRfbXV0ZV9ncGlvX2FjdGl2ZXN0YXRlOworc3RhdGljIGludCBod19yZXNldF9ncGlvX2FjdGl2ZXN0YXRlOworc3RhdGljIGludCBsaW5lb3V0X2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlOworc3RhdGljIGludCBoZWFkcGhvbmVfZGV0ZWN0X2dwaW9fYWN0aXZlc3RhdGU7CitzdGF0aWMgaW50IGxpbmVpbl9kZXRlY3RfZ3Bpb19hY3RpdmVzdGF0ZTsKKworLyogbm9kZSBwb2ludGVycyB0aGF0IHdlIHNhdmUgd2hlbiBnZXR0aW5nIHRoZSBHUElPIG51bWJlcgorICogdG8gZ2V0IHRoZSBpbnRlcnJ1cHQgbGF0ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmxpbmVvdXRfZGV0ZWN0X25vZGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpsaW5laW5fZGV0ZWN0X25vZGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpoZWFkcGhvbmVfZGV0ZWN0X25vZGU7CisKK3N0YXRpYyBpbnQgbGluZW91dF9kZXRlY3RfaXJxOworc3RhdGljIGludCBsaW5laW5fZGV0ZWN0X2lycTsKK3N0YXRpYyBpbnQgaGVhZHBob25lX2RldGVjdF9pcnE7CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUgKmdldF9ncGlvKGNoYXIgKm5hbWUsCisJCQkJICAgIGNoYXIgKmFsdG5hbWUsCisJCQkJICAgIGludCAqZ3Bpb3B0ciwKKwkJCQkgICAgaW50ICpncGlvYWN0aXZlcHRyKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpncGlvOworCXUzMiAqcmVnOworCWNoYXIgKmF1ZGlvX2dwaW87CisKKwkqZ3Bpb3B0ciA9IC0xOworCisJLyogY2hlY2sgaWYgd2UgY2FuIGdldCBpdCB0aGUgZWFzeSB3YXkgLi4uICovCisJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCBuYW1lKTsKKwlpZiAoIW5wKSB7CisJCS8qIHNvbWUgbWFjaGluZXMgaGF2ZSBvbmx5IGdwaW9YL2V4dGludC1ncGlvWCBub2RlcywKKwkJICogYW5kIGFuIGF1ZGlvLWdwaW8gcHJvcGVydHkgc2F5aW5nIHdoYXQgaXQgaXMgLi4uCisJCSAqIFNvIHdoYXQgd2UgaGF2ZSB0byBkbyBpcyBlbnVtZXJhdGUgYWxsIGNoaWxkcmVuCisJCSAqIG9mIHRoZSBncGlvIG5vZGUgYW5kIGNoZWNrIHRoZW0gYWxsLiAqLworCQlncGlvID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgImdwaW8iKTsKKwkJaWYgKCFncGlvKQorCQkJcmV0dXJuIE5VTEw7CisJCXdoaWxlICgobnAgPSBvZl9nZXRfbmV4dF9jaGlsZChncGlvLCBucCkpKSB7CisJCQlhdWRpb19ncGlvID0gZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3BpbyIsIE5VTEwpOworCQkJaWYgKCFhdWRpb19ncGlvKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHN0cmNtcChhdWRpb19ncGlvLCBuYW1lKSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGFsdG5hbWUgJiYgKHN0cmNtcChhdWRpb19ncGlvLCBhbHRuYW1lKSA9PSAwKSkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBzdGlsbCBub3QgZm91bmQsIGFzc3VtZSBub3QgdGhlcmUgKi8KKwkJaWYgKCFucCkKKwkJCXJldHVybiBOVUxMOworCX0KKworCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJyZWciLCBOVUxMKTsKKwlpZiAoIXJlZykKKwkJcmV0dXJuIE5VTEw7CisKKwkqZ3Bpb3B0ciA9ICpyZWc7CisKKwkvKiB0aGlzIGlzIGEgaGFjaywgdXN1YWxseSB0aGUgR1BJT3MgJ3JlZycgcHJvcGVydHkKKwkgKiBzaG91bGQgaGF2ZSB0aGUgb2Zmc2V0IGJhc2VkIGZyb20gdGhlIEdQSU8gc3BhY2UKKwkgKiB3aGljaCBpcyBhdCAweDUwLCBidXQgYXBwYXJlbnRseSBub3QgYWx3YXlzLi4uICovCisJaWYgKCpncGlvcHRyIDwgMHg1MCkKKwkJKmdwaW9wdHIgKz0gMHg1MDsKKworCXJlZyA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsICJhdWRpby1ncGlvLWFjdGl2ZS1zdGF0ZSIsIE5VTEwpOworCWlmICghcmVnKQorCQkvKiBBcHBsZSBzZWVtcyB0byBkZWZhdWx0IHRvIDEsIGJ1dAorCQkgKiB0aGF0IGRvZXNuJ3Qgc2VlbSByaWdodCBhdCBsZWFzdCBvbiBtb3N0CisJCSAqIG1hY2hpbmVzLiBTbyB1bnRpbCBwcm92ZW4gdGhhdCB0aGUgb3Bwb3NpdGUKKwkJICogaXMgbmVjZXNzYXJ5LCB3ZSBkZWZhdWx0IHRvIDAKKwkJICogKHdoaWNoLCBpbmNpZGVudGFsbHksIHNuZC1wb3dlcm1hYyBhbHNvIGRvZXMuLi4pICovCisJCSpncGlvYWN0aXZlcHRyID0gMDsKKwllbHNlCisJCSpncGlvYWN0aXZlcHRyID0gKnJlZzsKKworCXJldHVybiBucDsKK30KKworc3RhdGljIHZvaWQgZ2V0X2lycShzdHJ1Y3QgZGV2aWNlX25vZGUgKiBucCwgaW50ICppcnFwdHIpCit7CisJKmlycXB0ciA9IC0xOworCWlmICghbnApCisJCXJldHVybjsKKwlpZiAobnAtPm5faW50cnMgIT0gMSkKKwkJcmV0dXJuOworCSppcnFwdHIgPSBucC0+aW50cnNbMF0ubGluZTsKK30KKworLyogMHg0IGlzIG91dGVuYWJsZSwgMHgxIGlzIG91dCwgdGh1cyA0IG9yIDUgKi8KKyNkZWZpbmUgU1dJVENIX0dQSU8obmFtZSwgdiwgb24pCQkJCVwKKwkoKCh2KSZ+MSkgfCAoKG9uKT8JCQkJCVwKKwkJCShuYW1lIyNfZ3Bpb19hY3RpdmVzdGF0ZT09MD80OjUpOglcCisJCQkobmFtZSMjX2dwaW9fYWN0aXZlc3RhdGU9PTA/NTo0KSkpCisKKyNkZWZpbmUgRlRSX0dQSU8obmFtZSwgYml0KQkJCQkJXAorc3RhdGljIHZvaWQgZnRyX2dwaW9fc2V0XyMjbmFtZShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCwgaW50IG9uKVwKK3sJCQkJCQkJCVwKKwlpbnQgdjsJCQkJCQkJXAorCQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KCFydCkpIHJldHVybjsJCQkJXAorCQkJCQkJCQlcCisJaWYgKG5hbWUjI19tdXRlX2dwaW8gPCAwKQkJCQlcCisJCXJldHVybjsJCQkJCQlcCisJCQkJCQkJCVwKKwl2ID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLAkJXAorCQkJICAgICAgbmFtZSMjX211dGVfZ3BpbywJCQlcCisJCQkgICAgICAwKTsJCQkJXAorCQkJCQkJCQlcCisJLyogbXV0ZWQgPSAhb24uLi4gKi8JCQkJCVwKKwl2ID0gU1dJVENIX0dQSU8obmFtZSMjX211dGUsIHYsICFvbik7CQkJXAorCQkJCQkJCQlcCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwJCVwKKwkJCSAgbmFtZSMjX211dGVfZ3Bpbywgdik7CQkJXAorCQkJCQkJCQlcCisJcnQtPmltcGxlbWVudGF0aW9uX3ByaXZhdGUgJj0gfigxPDxiaXQpOwkJXAorCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlIHw9ICghIW9uIDw8IGJpdCk7CQlcCit9CQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cl9ncGlvX2dldF8jI25hbWUoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCQlcCit7CQkJCQkJCQlcCisJaWYgKHVubGlrZWx5KCFydCkpIHJldHVybiAwOwkJCQlcCisJcmV0dXJuIChydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZT4+Yml0KSYxOwkJXAorfQorCitGVFJfR1BJTyhoZWFkcGhvbmUsIDApOworRlRSX0dQSU8oYW1wLCAxKTsKK0ZUUl9HUElPKGxpbmVvdXQsIDIpOworCitzdGF0aWMgdm9pZCBmdHJfZ3Bpb19zZXRfaHdfcmVzZXQoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsIGludCBvbikKK3sKKwlpbnQgdjsKKworCWlmICh1bmxpa2VseSghcnQpKSByZXR1cm47CisJaWYgKGh3X3Jlc2V0X2dwaW8gPCAwKQorCQlyZXR1cm47CisKKwl2ID0gcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLAorCQkJICAgICAgaHdfcmVzZXRfZ3BpbywgMCk7CisJdiA9IFNXSVRDSF9HUElPKGh3X3Jlc2V0LCB2LCBvbik7CisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfV1JJVEVfR1BJTywgTlVMTCwKKwkJCSAgaHdfcmVzZXRfZ3Bpbywgdik7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cl9ncGlvX2FsbF9hbXBzX29mZihzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCkKK3sKKwlpbnQgc2F2ZWQ7CisKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOworCXNhdmVkID0gcnQtPmltcGxlbWVudGF0aW9uX3ByaXZhdGU7CisJZnRyX2dwaW9fc2V0X2hlYWRwaG9uZShydCwgMCk7CisJZnRyX2dwaW9fc2V0X2FtcChydCwgMCk7CisJZnRyX2dwaW9fc2V0X2xpbmVvdXQocnQsIDApOworCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlID0gc2F2ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cl9ncGlvX2FsbF9hbXBzX3Jlc3RvcmUoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCit7CisJaW50IHM7CisKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOworCXMgPSBydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZTsKKwlmdHJfZ3Bpb19zZXRfaGVhZHBob25lKHJ0LCAocz4+MCkmMSk7CisJZnRyX2dwaW9fc2V0X2FtcChydCwgKHM+PjEpJjEpOworCWZ0cl9ncGlvX3NldF9saW5lb3V0KHJ0LCAocz4+MikmMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cl9oYW5kbGVfbm90aWZ5KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uICpub3RpZiA9IGRhdGE7CisKKwltdXRleF9sb2NrKCZub3RpZi0+bXV0ZXgpOworCWlmIChub3RpZi0+bm90aWZ5KQorCQlub3RpZi0+bm90aWZ5KG5vdGlmLT5kYXRhKTsKKwltdXRleF91bmxvY2soJm5vdGlmLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cl9ncGlvX2luaXQoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCit7CisJZ2V0X2dwaW8oImhlYWRwaG9uZS1tdXRlIiwgTlVMTCwKKwkJICZoZWFkcGhvbmVfbXV0ZV9ncGlvLAorCQkgJmhlYWRwaG9uZV9tdXRlX2dwaW9fYWN0aXZlc3RhdGUpOworCWdldF9ncGlvKCJhbXAtbXV0ZSIsIE5VTEwsCisJCSAmYW1wX211dGVfZ3BpbywKKwkJICZhbXBfbXV0ZV9ncGlvX2FjdGl2ZXN0YXRlKTsKKwlnZXRfZ3BpbygibGluZW91dC1tdXRlIiwgTlVMTCwKKwkJICZsaW5lb3V0X211dGVfZ3BpbywKKwkJICZsaW5lb3V0X211dGVfZ3Bpb19hY3RpdmVzdGF0ZSk7CisJZ2V0X2dwaW8oImh3LXJlc2V0IiwgImF1ZGlvLWh3LXJlc2V0IiwKKwkJICZod19yZXNldF9ncGlvLAorCQkgJmh3X3Jlc2V0X2dwaW9fYWN0aXZlc3RhdGUpOworCisJaGVhZHBob25lX2RldGVjdF9ub2RlID0gZ2V0X2dwaW8oImhlYWRwaG9uZS1kZXRlY3QiLCBOVUxMLAorCQkJCQkgJmhlYWRwaG9uZV9kZXRlY3RfZ3BpbywKKwkJCQkJICZoZWFkcGhvbmVfZGV0ZWN0X2dwaW9fYWN0aXZlc3RhdGUpOworCS8qIGdvIEFwcGxlLCBhbmQgdGhhbmtzIGZvciBnaXZpbmcgdGhlc2UgZGlmZmVyZW50IG5hbWVzCisJICogYWNyb3NzIHRoZSBib2FyZC4uLiAqLworCWxpbmVvdXRfZGV0ZWN0X25vZGUgPSBnZXRfZ3BpbygibGluZW91dC1kZXRlY3QiLCAibGluZS1vdXRwdXQtZGV0ZWN0IiwKKwkJCQkgICAgICAgJmxpbmVvdXRfZGV0ZWN0X2dwaW8sCisJCQkJICAgICAgICZsaW5lb3V0X2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlKTsKKwlsaW5laW5fZGV0ZWN0X25vZGUgPSBnZXRfZ3BpbygibGluZWluLWRldGVjdCIsICJsaW5lLWlucHV0LWRldGVjdCIsCisJCQkJICAgICAgJmxpbmVpbl9kZXRlY3RfZ3BpbywKKwkJCQkgICAgICAmbGluZWluX2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlKTsKKworCWdldF9pcnEoaGVhZHBob25lX2RldGVjdF9ub2RlLCAmaGVhZHBob25lX2RldGVjdF9pcnEpOworCWdldF9pcnEobGluZW91dF9kZXRlY3Rfbm9kZSwgJmxpbmVvdXRfZGV0ZWN0X2lycSk7CisJZ2V0X2lycShsaW5laW5fZGV0ZWN0X25vZGUsICZsaW5laW5fZGV0ZWN0X2lycSk7CisKKwlmdHJfZ3Bpb19hbGxfYW1wc19vZmYocnQpOworCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlID0gMDsKKwlJTklUX1dPUksoJnJ0LT5oZWFkcGhvbmVfbm90aWZ5LndvcmssIGZ0cl9oYW5kbGVfbm90aWZ5LAorCQkgICZydC0+aGVhZHBob25lX25vdGlmeSk7CisJSU5JVF9XT1JLKCZydC0+bGluZV9pbl9ub3RpZnkud29yaywgZnRyX2hhbmRsZV9ub3RpZnksCisJCSAgJnJ0LT5saW5lX2luX25vdGlmeSk7CisJSU5JVF9XT1JLKCZydC0+bGluZV9vdXRfbm90aWZ5LndvcmssIGZ0cl9oYW5kbGVfbm90aWZ5LAorCQkgICZydC0+bGluZV9vdXRfbm90aWZ5KTsKKwltdXRleF9pbml0KCZydC0+aGVhZHBob25lX25vdGlmeS5tdXRleCk7CisJbXV0ZXhfaW5pdCgmcnQtPmxpbmVfaW5fbm90aWZ5Lm11dGV4KTsKKwltdXRleF9pbml0KCZydC0+bGluZV9vdXRfbm90aWZ5Lm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgZnRyX2dwaW9fZXhpdChzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCkKK3sKKwlmdHJfZ3Bpb19hbGxfYW1wc19vZmYocnQpOworCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlID0gMDsKKwlpZiAocnQtPmhlYWRwaG9uZV9ub3RpZnkubm90aWZ5KQorCQlmcmVlX2lycShoZWFkcGhvbmVfZGV0ZWN0X2lycSwgJnJ0LT5oZWFkcGhvbmVfbm90aWZ5KTsKKwlpZiAocnQtPmxpbmVfaW5fbm90aWZ5LmdwaW9fcHJpdmF0ZSkKKwkJZnJlZV9pcnEobGluZWluX2RldGVjdF9pcnEsICZydC0+bGluZV9pbl9ub3RpZnkpOworCWlmIChydC0+bGluZV9vdXRfbm90aWZ5LmdwaW9fcHJpdmF0ZSkKKwkJZnJlZV9pcnEobGluZW91dF9kZXRlY3RfaXJxLCAmcnQtPmxpbmVfb3V0X25vdGlmeSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmhlYWRwaG9uZV9ub3RpZnkud29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ0LT5saW5lX291dF9ub3RpZnkud29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwltdXRleF9kZXN0cm95KCZydC0+aGVhZHBob25lX25vdGlmeS5tdXRleCk7CisJbXV0ZXhfZGVzdHJveSgmcnQtPmxpbmVfaW5fbm90aWZ5Lm11dGV4KTsKKwltdXRleF9kZXN0cm95KCZydC0+bGluZV9vdXRfbm90aWZ5Lm11dGV4KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGZ0cl9oYW5kbGVfbm90aWZ5X2lycShpbnQgeHgsCisJCQkJCSB2b2lkICpkYXRhLAorCQkJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uICpub3RpZiA9IGRhdGE7CisKKwlzY2hlZHVsZV93b3JrKCZub3RpZi0+d29yayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZnRyX3NldF9ub3RpZnkoc3RydWN0IGdwaW9fcnVudGltZSAqcnQsCisJCQkgIGVudW0gbm90aWZ5X3R5cGUgdHlwZSwKKwkJCSAgbm90aWZ5X2Z1bmNfdCBub3RpZnksCisJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uICpub3RpZjsKKwlub3RpZnlfZnVuY190IG9sZDsKKwlpbnQgaXJxOworCWNoYXIgKm5hbWU7CisJaW50IGVyciA9IC1FQlVTWTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQU9BX05PVElGWV9IRUFEUEhPTkU6CisJCW5vdGlmID0gJnJ0LT5oZWFkcGhvbmVfbm90aWZ5OworCQluYW1lID0gImhlYWRwaG9uZS1kZXRlY3QiOworCQlpcnEgPSBoZWFkcGhvbmVfZGV0ZWN0X2lycTsKKwkJYnJlYWs7CisJY2FzZSBBT0FfTk9USUZZX0xJTkVfSU46CisJCW5vdGlmID0gJnJ0LT5saW5lX2luX25vdGlmeTsKKwkJbmFtZSA9ICJsaW5laW4tZGV0ZWN0IjsKKwkJaXJxID0gbGluZWluX2RldGVjdF9pcnE7CisJCWJyZWFrOworCWNhc2UgQU9BX05PVElGWV9MSU5FX09VVDoKKwkJbm90aWYgPSAmcnQtPmxpbmVfb3V0X25vdGlmeTsKKwkJbmFtZSA9ICJsaW5lb3V0LWRldGVjdCI7CisJCWlycSA9IGxpbmVvdXRfZGV0ZWN0X2lycTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGlycSA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZub3RpZi0+bXV0ZXgpOworCisJb2xkID0gbm90aWYtPm5vdGlmeTsKKworCWlmICghb2xkICYmICFub3RpZnkpIHsKKwkJZXJyID0gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChvbGQgJiYgbm90aWZ5KSB7CisJCWlmIChvbGQgPT0gbm90aWZ5ICYmIG5vdGlmLT5kYXRhID09IGRhdGEpCisJCQllcnIgPSAwOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKG9sZCAmJiAhbm90aWZ5KQorCQlmcmVlX2lycShpcnEsIG5vdGlmKTsKKworCWlmICghb2xkICYmIG5vdGlmeSkgeworCQllcnIgPSByZXF1ZXN0X2lycShpcnEsIGZ0cl9oYW5kbGVfbm90aWZ5X2lycSwgMCwgbmFtZSwgbm90aWYpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfdW5sb2NrOworCX0KKworCW5vdGlmLT5ub3RpZnkgPSBub3RpZnk7CisJbm90aWYtPmRhdGEgPSBkYXRhOworCisJZXJyID0gMDsKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmbm90aWYtPm11dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZ0cl9nZXRfZGV0ZWN0KHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0LAorCQkJICBlbnVtIG5vdGlmeV90eXBlIHR5cGUpCit7CisJaW50IGdwaW8sIHJldCwgYWN0aXZlOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBT0FfTk9USUZZX0hFQURQSE9ORToKKwkJZ3BpbyA9IGhlYWRwaG9uZV9kZXRlY3RfZ3BpbzsKKwkJYWN0aXZlID0gaGVhZHBob25lX2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlOworCQlicmVhazsKKwljYXNlIEFPQV9OT1RJRllfTElORV9JTjoKKwkJZ3BpbyA9IGxpbmVpbl9kZXRlY3RfZ3BpbzsKKwkJYWN0aXZlID0gbGluZWluX2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlOworCQlicmVhazsKKwljYXNlIEFPQV9OT1RJRllfTElORV9PVVQ6CisJCWdwaW8gPSBsaW5lb3V0X2RldGVjdF9ncGlvOworCQlhY3RpdmUgPSBsaW5lb3V0X2RldGVjdF9ncGlvX2FjdGl2ZXN0YXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZ3BpbyA9PSAtMSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9SRUFEX0dQSU8sIE5VTEwsIGdwaW8sIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAoKHJldCA+PiAxKSAmIDEpID09IGFjdGl2ZTsKK30KKworc3RhdGljIHN0cnVjdCBncGlvX21ldGhvZHMgbWV0aG9kcyA9IHsKKwkuaW5pdAkJCT0gZnRyX2dwaW9faW5pdCwKKwkuZXhpdAkJCT0gZnRyX2dwaW9fZXhpdCwKKwkuYWxsX2FtcHNfb2ZmCQk9IGZ0cl9ncGlvX2FsbF9hbXBzX29mZiwKKwkuYWxsX2FtcHNfcmVzdG9yZQk9IGZ0cl9ncGlvX2FsbF9hbXBzX3Jlc3RvcmUsCisJLnNldF9oZWFkcGhvbmUJCT0gZnRyX2dwaW9fc2V0X2hlYWRwaG9uZSwKKwkuc2V0X3NwZWFrZXJzCQk9IGZ0cl9ncGlvX3NldF9hbXAsCisJLnNldF9saW5lb3V0CQk9IGZ0cl9ncGlvX3NldF9saW5lb3V0LAorCS5zZXRfaHdfcmVzZXQJCT0gZnRyX2dwaW9fc2V0X2h3X3Jlc2V0LAorCS5nZXRfaGVhZHBob25lCQk9IGZ0cl9ncGlvX2dldF9oZWFkcGhvbmUsCisJLmdldF9zcGVha2VycwkJPSBmdHJfZ3Bpb19nZXRfYW1wLAorCS5nZXRfbGluZW91dAkJPSBmdHJfZ3Bpb19nZXRfbGluZW91dCwKKwkuc2V0X25vdGlmeQkJPSBmdHJfc2V0X25vdGlmeSwKKwkuZ2V0X2RldGVjdAkJPSBmdHJfZ2V0X2RldGVjdCwKK307CisKK3N0cnVjdCBncGlvX21ldGhvZHMgKmZ0cl9ncGlvX21ldGhvZHMgPSAmbWV0aG9kczsKK0VYUE9SVF9TWU1CT0xfR1BMKGZ0cl9ncGlvX21ldGhvZHMpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLXBtZi5jIGIvc291bmQvYW9hL2NvcmUvc25kLWFvYS1ncGlvLXBtZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWI5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvY29yZS9zbmQtYW9hLWdwaW8tcG1mLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIHBtZiBHUElPcworICoKKyAqIENvcHlyaWdodCAyMDA2IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogR1BMIHYyLCBjYW4gYmUgZm91bmQgaW4gQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX3BmdW5jLmg+CisjaW5jbHVkZSAiLi4vYW9hLmgiCisKKyNkZWZpbmUgUE1GX0dQSU8obmFtZSwgYml0KQkJCQkJXAorc3RhdGljIHZvaWQgcG1mX2dwaW9fc2V0XyMjbmFtZShzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCwgaW50IG9uKVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgcG1mX2FyZ3MgYXJncyA9IHsgLmNvdW50ID0gMSwgLnVbMF0udiA9ICFvbiB9OwlcCisJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOwkJCQlcCisJcG1mX2NhbGxfZnVuY3Rpb24ocnQtPm5vZGUsICNuYW1lICItbXV0ZSIsICZhcmdzKTsJXAorCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlICY9IH4oMTw8Yml0KTsJCVwKKwlydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZSB8PSAoISFvbiA8PCBiaXQpOwkJXAorfQkJCQkJCQkJXAorc3RhdGljIGludCBwbWZfZ3Bpb19nZXRfIyNuYW1lKHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0KQkJXAorewkJCQkJCQkJXAorCWlmICh1bmxpa2VseSghcnQpKSByZXR1cm4gMDsJCQkJXAorCXJldHVybiAocnQtPmltcGxlbWVudGF0aW9uX3ByaXZhdGU+PmJpdCkmMTsJCVwKK30KKworUE1GX0dQSU8oaGVhZHBob25lLCAwKTsKK1BNRl9HUElPKGFtcCwgMSk7CitQTUZfR1BJTyhsaW5lb3V0LCAyKTsKKworc3RhdGljIHZvaWQgcG1mX2dwaW9fc2V0X2h3X3Jlc2V0KHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0LCBpbnQgb24pCit7CisJc3RydWN0IHBtZl9hcmdzIGFyZ3MgPSB7IC5jb3VudCA9IDEsIC51WzBdLnYgPSAhIW9uIH07CisKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOworCXBtZl9jYWxsX2Z1bmN0aW9uKHJ0LT5ub2RlLCAiaHctcmVzZXQiLCAmYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9ncGlvX2FsbF9hbXBzX29mZihzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCkKK3sKKwlpbnQgc2F2ZWQ7CisKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOworCXNhdmVkID0gcnQtPmltcGxlbWVudGF0aW9uX3ByaXZhdGU7CisJcG1mX2dwaW9fc2V0X2hlYWRwaG9uZShydCwgMCk7CisJcG1mX2dwaW9fc2V0X2FtcChydCwgMCk7CisJcG1mX2dwaW9fc2V0X2xpbmVvdXQocnQsIDApOworCXJ0LT5pbXBsZW1lbnRhdGlvbl9wcml2YXRlID0gc2F2ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9ncGlvX2FsbF9hbXBzX3Jlc3RvcmUoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCit7CisJaW50IHM7CisKKwlpZiAodW5saWtlbHkoIXJ0KSkgcmV0dXJuOworCXMgPSBydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZTsKKwlwbWZfZ3Bpb19zZXRfaGVhZHBob25lKHJ0LCAocz4+MCkmMSk7CisJcG1mX2dwaW9fc2V0X2FtcChydCwgKHM+PjEpJjEpOworCXBtZl9ncGlvX3NldF9saW5lb3V0KHJ0LCAocz4+MikmMSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9oYW5kbGVfbm90aWZ5KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdwaW9fbm90aWZpY2F0aW9uICpub3RpZiA9IGRhdGE7CisKKwltdXRleF9sb2NrKCZub3RpZi0+bXV0ZXgpOworCWlmIChub3RpZi0+bm90aWZ5KQorCQlub3RpZi0+bm90aWZ5KG5vdGlmLT5kYXRhKTsKKwltdXRleF91bmxvY2soJm5vdGlmLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9ncGlvX2luaXQoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCit7CisJcG1mX2dwaW9fYWxsX2FtcHNfb2ZmKHJ0KTsKKwlydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZSA9IDA7CisJSU5JVF9XT1JLKCZydC0+aGVhZHBob25lX25vdGlmeS53b3JrLCBwbWZfaGFuZGxlX25vdGlmeSwKKwkJICAmcnQtPmhlYWRwaG9uZV9ub3RpZnkpOworCUlOSVRfV09SSygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmssIHBtZl9oYW5kbGVfbm90aWZ5LAorCQkgICZydC0+bGluZV9pbl9ub3RpZnkpOworCUlOSVRfV09SSygmcnQtPmxpbmVfb3V0X25vdGlmeS53b3JrLCBwbWZfaGFuZGxlX25vdGlmeSwKKwkJICAmcnQtPmxpbmVfb3V0X25vdGlmeSk7CisJbXV0ZXhfaW5pdCgmcnQtPmhlYWRwaG9uZV9ub3RpZnkubXV0ZXgpOworCW11dGV4X2luaXQoJnJ0LT5saW5lX2luX25vdGlmeS5tdXRleCk7CisJbXV0ZXhfaW5pdCgmcnQtPmxpbmVfb3V0X25vdGlmeS5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9ncGlvX2V4aXQoc3RydWN0IGdwaW9fcnVudGltZSAqcnQpCit7CisJcG1mX2dwaW9fYWxsX2FtcHNfb2ZmKHJ0KTsKKwlydC0+aW1wbGVtZW50YXRpb25fcHJpdmF0ZSA9IDA7CisKKwlpZiAocnQtPmhlYWRwaG9uZV9ub3RpZnkuZ3Bpb19wcml2YXRlKQorCQlwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KHJ0LT5oZWFkcGhvbmVfbm90aWZ5LmdwaW9fcHJpdmF0ZSk7CisJaWYgKHJ0LT5saW5lX2luX25vdGlmeS5ncGlvX3ByaXZhdGUpCisJCXBtZl91bnJlZ2lzdGVyX2lycV9jbGllbnQocnQtPmxpbmVfaW5fbm90aWZ5LmdwaW9fcHJpdmF0ZSk7CisJaWYgKHJ0LT5saW5lX291dF9ub3RpZnkuZ3Bpb19wcml2YXRlKQorCQlwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KHJ0LT5saW5lX291dF9ub3RpZnkuZ3Bpb19wcml2YXRlKTsKKworCS8qIG1ha2Ugc3VyZSBubyB3b3JrIGlzIHBlbmRpbmcgYmVmb3JlIGZyZWVpbmcKKwkgKiBhbGwgdGhpbmdzICovCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmhlYWRwaG9uZV9ub3RpZnkud29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcnQtPmxpbmVfaW5fbm90aWZ5LndvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJ0LT5saW5lX291dF9ub3RpZnkud29yayk7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKworCW11dGV4X2Rlc3Ryb3koJnJ0LT5oZWFkcGhvbmVfbm90aWZ5Lm11dGV4KTsKKwltdXRleF9kZXN0cm95KCZydC0+bGluZV9pbl9ub3RpZnkubXV0ZXgpOworCW11dGV4X2Rlc3Ryb3koJnJ0LT5saW5lX291dF9ub3RpZnkubXV0ZXgpOworCisJaWYgKHJ0LT5oZWFkcGhvbmVfbm90aWZ5LmdwaW9fcHJpdmF0ZSkKKwkJa2ZyZWUocnQtPmhlYWRwaG9uZV9ub3RpZnkuZ3Bpb19wcml2YXRlKTsKKwlpZiAocnQtPmxpbmVfaW5fbm90aWZ5LmdwaW9fcHJpdmF0ZSkKKwkJa2ZyZWUocnQtPmxpbmVfaW5fbm90aWZ5LmdwaW9fcHJpdmF0ZSk7CisJaWYgKHJ0LT5saW5lX291dF9ub3RpZnkuZ3Bpb19wcml2YXRlKQorCQlrZnJlZShydC0+bGluZV9vdXRfbm90aWZ5LmdwaW9fcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtZl9oYW5kbGVfbm90aWZ5X2lycSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWYgPSBkYXRhOworCisJc2NoZWR1bGVfd29yaygmbm90aWYtPndvcmspOworfQorCitzdGF0aWMgaW50IHBtZl9zZXRfbm90aWZ5KHN0cnVjdCBncGlvX3J1bnRpbWUgKnJ0LAorCQkJICBlbnVtIG5vdGlmeV90eXBlIHR5cGUsCisJCQkgIG5vdGlmeV9mdW5jX3Qgbm90aWZ5LAorCQkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBncGlvX25vdGlmaWNhdGlvbiAqbm90aWY7CisJbm90aWZ5X2Z1bmNfdCBvbGQ7CisJc3RydWN0IHBtZl9pcnFfY2xpZW50ICppcnFfY2xpZW50OworCWNoYXIgKm5hbWU7CisJaW50IGVyciA9IC1FQlVTWTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgQU9BX05PVElGWV9IRUFEUEhPTkU6CisJCW5vdGlmID0gJnJ0LT5oZWFkcGhvbmVfbm90aWZ5OworCQluYW1lID0gImhlYWRwaG9uZS1kZXRlY3QiOworCQlicmVhazsKKwljYXNlIEFPQV9OT1RJRllfTElORV9JTjoKKwkJbm90aWYgPSAmcnQtPmxpbmVfaW5fbm90aWZ5OworCQluYW1lID0gImxpbmVpbi1kZXRlY3QiOworCQlicmVhazsKKwljYXNlIEFPQV9OT1RJRllfTElORV9PVVQ6CisJCW5vdGlmID0gJnJ0LT5saW5lX291dF9ub3RpZnk7CisJCW5hbWUgPSAibGluZW91dC1kZXRlY3QiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF9sb2NrKCZub3RpZi0+bXV0ZXgpOworCisJb2xkID0gbm90aWYtPm5vdGlmeTsKKworCWlmICghb2xkICYmICFub3RpZnkpIHsKKwkJZXJyID0gMDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmIChvbGQgJiYgbm90aWZ5KSB7CisJCWlmIChvbGQgPT0gbm90aWZ5ICYmIG5vdGlmLT5kYXRhID09IGRhdGEpCisJCQllcnIgPSAwOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKG9sZCAmJiAhbm90aWZ5KSB7CisJCWlycV9jbGllbnQgPSBub3RpZi0+Z3Bpb19wcml2YXRlOworCQlwbWZfdW5yZWdpc3Rlcl9pcnFfY2xpZW50KGlycV9jbGllbnQpOworCQlrZnJlZShpcnFfY2xpZW50KTsKKwkJbm90aWYtPmdwaW9fcHJpdmF0ZSA9IE5VTEw7CisJfQorCWlmICghb2xkICYmIG5vdGlmeSkgeworCQlpcnFfY2xpZW50ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHBtZl9pcnFfY2xpZW50KSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCQlpcnFfY2xpZW50LT5kYXRhID0gbm90aWY7CisJCWlycV9jbGllbnQtPmhhbmRsZXIgPSBwbWZfaGFuZGxlX25vdGlmeV9pcnE7CisJCWlycV9jbGllbnQtPm93bmVyID0gVEhJU19NT0RVTEU7CisJCWVyciA9IHBtZl9yZWdpc3Rlcl9pcnFfY2xpZW50KHJ0LT5ub2RlLAorCQkJCQkgICAgICBuYW1lLAorCQkJCQkgICAgICBpcnFfY2xpZW50KTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzbmQtYW9hOiBncGlvIGxheWVyIGZhaWxlZCB0byIKKwkJCQkJIiByZWdpc3RlciAlcyBpcnEgKCVkKVxuIiwgbmFtZSwgZXJyKTsKKwkJCWtmcmVlKGlycV9jbGllbnQpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCW5vdGlmLT5ncGlvX3ByaXZhdGUgPSBpcnFfY2xpZW50OworCX0KKwlub3RpZi0+bm90aWZ5ID0gbm90aWZ5OworCW5vdGlmLT5kYXRhID0gZGF0YTsKKworCWVyciA9IDA7Cisgb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJm5vdGlmLT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwbWZfZ2V0X2RldGVjdChzdHJ1Y3QgZ3Bpb19ydW50aW1lICpydCwKKwkJCSAgZW51bSBub3RpZnlfdHlwZSB0eXBlKQoreworCWNoYXIgKm5hbWU7CisJaW50IGVyciA9IC1FQlVTWSwgcmV0OworCXN0cnVjdCBwbWZfYXJncyBhcmdzID0geyAuY291bnQgPSAxLCAudVswXS5wID0gJnJldCB9OworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBT0FfTk9USUZZX0hFQURQSE9ORToKKwkJbmFtZSA9ICJoZWFkcGhvbmUtZGV0ZWN0IjsKKwkJYnJlYWs7CisJY2FzZSBBT0FfTk9USUZZX0xJTkVfSU46CisJCW5hbWUgPSAibGluZWluLWRldGVjdCI7CisJCWJyZWFrOworCWNhc2UgQU9BX05PVElGWV9MSU5FX09VVDoKKwkJbmFtZSA9ICJsaW5lb3V0LWRldGVjdCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWVyciA9IHBtZl9jYWxsX2Z1bmN0aW9uKHJ0LT5ub2RlLCBuYW1lLCAmYXJncyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fbWV0aG9kcyBtZXRob2RzID0geworCS5pbml0CQkJPSBwbWZfZ3Bpb19pbml0LAorCS5leGl0CQkJPSBwbWZfZ3Bpb19leGl0LAorCS5hbGxfYW1wc19vZmYJCT0gcG1mX2dwaW9fYWxsX2FtcHNfb2ZmLAorCS5hbGxfYW1wc19yZXN0b3JlCT0gcG1mX2dwaW9fYWxsX2FtcHNfcmVzdG9yZSwKKwkuc2V0X2hlYWRwaG9uZQkJPSBwbWZfZ3Bpb19zZXRfaGVhZHBob25lLAorCS5zZXRfc3BlYWtlcnMJCT0gcG1mX2dwaW9fc2V0X2FtcCwKKwkuc2V0X2xpbmVvdXQJCT0gcG1mX2dwaW9fc2V0X2xpbmVvdXQsCisJLnNldF9od19yZXNldAkJPSBwbWZfZ3Bpb19zZXRfaHdfcmVzZXQsCisJLmdldF9oZWFkcGhvbmUJCT0gcG1mX2dwaW9fZ2V0X2hlYWRwaG9uZSwKKwkuZ2V0X3NwZWFrZXJzCQk9IHBtZl9ncGlvX2dldF9hbXAsCisJLmdldF9saW5lb3V0CQk9IHBtZl9ncGlvX2dldF9saW5lb3V0LAorCS5zZXRfbm90aWZ5CQk9IHBtZl9zZXRfbm90aWZ5LAorCS5nZXRfZGV0ZWN0CQk9IHBtZl9nZXRfZGV0ZWN0LAorfTsKKworc3RydWN0IGdwaW9fbWV0aG9kcyAqcG1mX2dwaW9fbWV0aG9kcyA9ICZtZXRob2RzOworRVhQT1JUX1NZTUJPTF9HUEwocG1mX2dwaW9fbWV0aG9kcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvZmFicmljcy9LY29uZmlnIGIvc291bmQvYW9hL2ZhYnJpY3MvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JjNzcwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL2ZhYnJpY3MvS2NvbmZpZwpAQCAtMCwwICsxLDEyIEBACitjb25maWcgU05EX0FPQV9GQUJSSUNfTEFZT1VUCisJdHJpc3RhdGUgImxheW91dC1pZCBmYWJyaWMiCisJZGVwZW5kcyBTTkRfQU9BCisJc2VsZWN0IFNORF9BT0FfU09VTkRCVVMKKwlzZWxlY3QgU05EX0FPQV9TT1VOREJVU19JMlMKKwktLS1oZWxwLS0tCisJVGhpcyBlbmFibGVzIHRoZSBsYXlvdXQtaWQgZmFicmljIGZvciB0aGUgQXBwbGUgT25ib2FyZAorCUF1ZGlvIGRyaXZlciwgdGhlIG1vZHVsZSBob2xkaW5nIGl0IGFsbCB0b2dldGhlcgorCWJhc2VkIG9uIHRoZSBkZXZpY2UtdHJlZSdzIGxheW91dC1pZCBwcm9wZXJ0eS4KKwkKKwlJZiB5b3UgYXJlIHVuc3VyZSBhbmQgaGF2ZSBhIGxhdGVyIEFwcGxlIG1hY2hpbmUsCisJY29tcGlsZSBpdCBhcyBhIG1vZHVsZS4KZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9mYWJyaWNzL01ha2VmaWxlIGIvc291bmQvYW9hL2ZhYnJpY3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmYzVlNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9mYWJyaWNzL01ha2VmaWxlCkBAIC0wLDAgKzEgQEAKK29iai0kKENPTkZJR19TTkRfQU9BX0ZBQlJJQ19MQVlPVVQpICs9IHNuZC1hb2EtZmFicmljLWxheW91dC5vCmRpZmYgLS1naXQgYS9zb3VuZC9hb2EvZmFicmljcy9zbmQtYW9hLWZhYnJpYy1sYXlvdXQuYyBiL3NvdW5kL2FvYS9mYWJyaWNzL3NuZC1hb2EtZmFicmljLWxheW91dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTcyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2EvZmFicmljcy9zbmQtYW9hLWZhYnJpYy1sYXlvdXQuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKiBBcHBsZSBPbmJvYXJkIEF1ZGlvIGRyaXZlciAtLSBsYXlvdXQgZmFicmljCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICoKKyAqCisgKiBUaGlzIGZhYnJpYyBtb2R1bGUgbG9va3MgZm9yIHNvdW5kIGNvZGVjcworICogYmFzZWQgb24gdGhlIGxheW91dC1pZCBwcm9wZXJ0eSBpbiB0aGUgZGV2aWNlIHRyZWUuCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICIuLi9hb2EuaCIKKyNpbmNsdWRlICIuLi9zb3VuZGJ1cy9zb3VuZGJ1cy5oIgorCitNT0RVTEVfQVVUSE9SKCJKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMYXlvdXQtSUQgZmFicmljIGZvciBzbmQtYW9hIik7CisKKyNkZWZpbmUgTUFYX0NPREVDU19QRVJfQlVTCTIKKworLyogVGhlc2UgYXJlIHRoZSBjb25uZWN0aW9ucyB0aGUgbGF5b3V0IGZhYnJpYworICoga25vd3MgYWJvdXQuIEl0IGRvZXNuJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhlCisgKiBpbnB1dCBvbmVzLCBidXQgSSB0aG91Z2h0IEknZCBzZXBhcmF0ZSB0aGVtCisgKiB0byBnaXZlIHRoZW0gcHJvcGVyIG5hbWVzLiBUaGUgdGhpbmcgaXMgdGhhdAorICogQXBwbGUgdXN1YWxseSB3aWxsIGRpc3Rpbmd1aXNoIHRoZSBhY3RpdmUgb3V0cHV0CisgKiBieSBHUElPcywgd2hpbGUgdGhlIGFjdGl2ZSBpbnB1dCBpcyBzZXQgZGlyZWN0bHkKKyAqIG9uIHRoZSBjb2RlYy4gSGVuY2Ugd2UgaGVyZSB0ZWxsIHRoZSBjb2RlYyB3aGF0CisgKiB3ZSB0aGluayBpcyBjb25uZWN0ZWQuIFRoaXMgaW5mb3JtYXRpb24gaXMgaGFyZC0KKyAqIGNvZGVkIGJlbG93IC4uLiAqLworI2RlZmluZSBDQ19TUEVBS0VSUwkoMTw8MCkKKyNkZWZpbmUgQ0NfSEVBRFBIT05FCSgxPDwxKQorI2RlZmluZSBDQ19MSU5FT1VUCSgxPDwyKQorI2RlZmluZSBDQ19ESUdJVEFMT1VUCSgxPDwzKQorI2RlZmluZSBDQ19MSU5FSU4JKDE8PDQpCisjZGVmaW5lIENDX01JQ1JPUEhPTkUJKDE8PDUpCisjZGVmaW5lIENDX0RJR0lUQUxJTgkoMTw8NikKKy8qIHByZXR0eSBib2d1cyBidXQgdXNlcnMgY29tcGxhaW4uLi4KKyAqIFRoaXMgaXMgYSBmbGFnIHNheWluZyB0aGF0IHRoZSBMSU5FT1VUCisgKiBzaG91bGQgYmUgcmVuYW1lZCB0byBIRUFEUEhPTkUuCisgKiBiZSBjYXJlZnVsIHdpdGggaW5wdXQgZGV0ZWN0aW9uISAqLworI2RlZmluZSBDQ19MSU5FT1VUX0xBQkVMTEVEX0hFQURQSE9ORQkoMTw8NykKKworc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24geworCS8qIENDXyBmbGFncyBmcm9tIGFib3ZlICovCisJaW50IGNvbm5lY3RlZDsKKwkvKiBjb2RlYyBkZXBlbmRlbnQgYml0IHRvIGJlIHNldCBpbiB0aGUgYW9hX2NvZGVjLmNvbm5lY3RlZCBmaWVsZC4KKwkgKiBUaGlzIGludGVudGlvbmFsbHkgZG9lc24ndCBoYXZlIGFueSBnZW5lcmljIGZsYWdzIGJlY2F1c2UgdGhlCisJICogZmFicmljIGhhcyB0byBrbm93IHRoZSBjb2RlYyBhbnl3YXkgYW5kIGFsbCBjb2RlY3MgbWlnaHQgaGF2ZQorCSAqIGRpZmZlcmVudCBjb25uZWN0b3JzICovCisJaW50IGNvZGVjX2JpdDsKK307CisKK3N0cnVjdCBjb2RlY19jb25uZWN0X2luZm8geworCWNoYXIgKm5hbWU7CisJc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb25zOworfTsKKworI2RlZmluZSBMQVlPVVRfRkxBR19DT01CT19MSU5FT1VUX1NQRElGCSgxPDwwKQorCitzdHJ1Y3QgbGF5b3V0IHsKKwl1bnNpZ25lZCBpbnQgbGF5b3V0X2lkOworCXN0cnVjdCBjb2RlY19jb25uZWN0X2luZm8gY29kZWNzW01BWF9DT0RFQ1NfUEVSX0JVU107CisJaW50IGZsYWdzOworCQorCS8qIGlmIGJ1c25hbWUgaXMgbm90IGFzc2lnbmVkLCB3ZSB1c2UgJ01hc3RlcicgYmVsb3csCisJICogc28gdGhhdCBvdXIgbGF5b3V0IHRhYmxlIGRvZXNuJ3QgbmVlZCB0byBiZSBmaWxsZWQKKwkgKiB0b28gbXVjaC4KKwkgKiBXZSBvbmx5IGFzc2lnbiB0aGVzZSB0d28gaWYgd2UgZXhwZWN0IHRvIGZpbmQgbW9yZQorCSAqIHRoYW4gb25lIHNvdW5kYnVzLCBpLmUuIG9uIHRob3NlIG1hY2hpbmVzIHdpdGgKKwkgKiBtdWx0aXBsZSBsYXlvdXQtaWRzICovCisJY2hhciAqYnVzbmFtZTsKKwlpbnQgcGNtaWQ7Cit9OworCitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC00MSIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtNDUiKTsKK01PRFVMRV9BTElBUygic291bmQtbGF5b3V0LTUxIik7CitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC01OCIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtNjAiKTsKK01PRFVMRV9BTElBUygic291bmQtbGF5b3V0LTYxIik7CitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC02NCIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtNjUiKTsKK01PRFVMRV9BTElBUygic291bmQtbGF5b3V0LTY4Iik7CitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC02OSIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtNzAiKTsKK01PRFVMRV9BTElBUygic291bmQtbGF5b3V0LTcyIik7CitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC04MCIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtODIiKTsKK01PRFVMRV9BTElBUygic291bmQtbGF5b3V0LTg0Iik7CitNT0RVTEVfQUxJQVMoInNvdW5kLWxheW91dC04NiIpOworTU9EVUxFX0FMSUFTKCJzb3VuZC1sYXlvdXQtOTIiKTsKKworLyogb255eCB3aXRoIGFsbCBidXQgbWljcm9waG9uZSBjb25uZWN0ZWQgKi8KK3N0YXRpYyBzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiBvbnl4X2Nvbm5lY3Rpb25zX25vbWljW10gPSB7CisJeworCQkuY29ubmVjdGVkID0gQ0NfU1BFQUtFUlMgfCBDQ19IRUFEUEhPTkUgfCBDQ19MSU5FT1VULAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX0RJR0lUQUxPVVQsCisJCS5jb2RlY19iaXQgPSAxLAorCX0sCisJeworCQkuY29ubmVjdGVkID0gQ0NfTElORUlOLAorCQkuY29kZWNfYml0ID0gMiwKKwl9LAorCXt9IC8qIHRlcm1pbmF0ZSBhcnJheSBieSAuY29ubmVjdGVkID09IDAgKi8KK307CisKKy8qIG9ueXggb24gbWFjaGluZXMgd2l0aG91dCBoZWFkcGhvbmUgKi8KK3N0YXRpYyBzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lc1tdID0geworCXsKKwkJLmNvbm5lY3RlZCA9IENDX1NQRUFLRVJTIHwgQ0NfTElORU9VVCB8CisJCQkgICAgIENDX0xJTkVPVVRfTEFCRUxMRURfSEVBRFBIT05FLAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX0RJR0lUQUxPVVQsCisJCS5jb2RlY19iaXQgPSAxLAorCX0sCisJLyogRklYTUU6IGFyZSB0aGVzZSBjb3JyZWN0PyBwcm9iYWJseSBub3QgZm9yIGFsbCB0aGUgbWFjaGluZXMKKwkgKiBiZWxvdyAuLi4gSWYgbm90IHRoaXMgd2lsbCBuZWVkIHNlcGFyYXRpbmcuICovCisJeworCQkuY29ubmVjdGVkID0gQ0NfTElORUlOLAorCQkuY29kZWNfYml0ID0gMiwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX01JQ1JPUEhPTkUsCisJCS5jb2RlY19iaXQgPSAzLAorCX0sCisJe30gLyogdGVybWluYXRlIGFycmF5IGJ5IC5jb25uZWN0ZWQgPT0gMCAqLworfTsKKworLyogb255eCBvbiBtYWNoaW5lcyB3aXRoIHJlYWwgbGluZS1vdXQgKi8KK3N0YXRpYyBzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiBvbnl4X2Nvbm5lY3Rpb25zX3JlYWxsaW5lb3V0W10gPSB7CisJeworCQkuY29ubmVjdGVkID0gQ0NfU1BFQUtFUlMgfCBDQ19MSU5FT1VUIHwgQ0NfSEVBRFBIT05FLAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX0RJR0lUQUxPVVQsCisJCS5jb2RlY19iaXQgPSAxLAorCX0sCisJeworCQkuY29ubmVjdGVkID0gQ0NfTElORUlOLAorCQkuY29kZWNfYml0ID0gMiwKKwl9LAorCXt9IC8qIHRlcm1pbmF0ZSBhcnJheSBieSAuY29ubmVjdGVkID09IDAgKi8KK307CisKKy8qIHRhcyBvbiBtYWNoaW5lcyB3aXRob3V0IGxpbmUgb3V0ICovCitzdGF0aWMgc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gdGFzX2Nvbm5lY3Rpb25zX25vbGluZW91dFtdID0geworCXsKKwkJLmNvbm5lY3RlZCA9IENDX1NQRUFLRVJTIHwgQ0NfSEVBRFBIT05FLAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX0xJTkVJTiwKKwkJLmNvZGVjX2JpdCA9IDIsCisJfSwKKwl7CisJCS5jb25uZWN0ZWQgPSBDQ19NSUNST1BIT05FLAorCQkuY29kZWNfYml0ID0gMywKKwl9LAorCXt9IC8qIHRlcm1pbmF0ZSBhcnJheSBieSAuY29ubmVjdGVkID09IDAgKi8KK307CisKKy8qIHRhcyBvbiBtYWNoaW5lcyB3aXRoIG5laXRoZXIgbGluZSBvdXQgbm9yIGxpbmUgaW4gKi8KK3N0YXRpYyBzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiB0YXNfY29ubmVjdGlvbnNfbm9saW5lW10gPSB7CisJeworCQkuY29ubmVjdGVkID0gQ0NfU1BFQUtFUlMgfCBDQ19IRUFEUEhPTkUsCisJCS5jb2RlY19iaXQgPSAwLAorCX0sCisJeworCQkuY29ubmVjdGVkID0gQ0NfTUlDUk9QSE9ORSwKKwkJLmNvZGVjX2JpdCA9IDMsCisJfSwKKwl7fSAvKiB0ZXJtaW5hdGUgYXJyYXkgYnkgLmNvbm5lY3RlZCA9PSAwICovCit9OworCisvKiB0YXMgb24gbWFjaGluZXMgd2l0aG91dCBtaWNyb3Bob25lICovCitzdGF0aWMgc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gdGFzX2Nvbm5lY3Rpb25zX25vbWljW10gPSB7CisJeworCQkuY29ubmVjdGVkID0gQ0NfU1BFQUtFUlMgfCBDQ19IRUFEUEhPTkUgfCBDQ19MSU5FT1VULAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX0xJTkVJTiwKKwkJLmNvZGVjX2JpdCA9IDIsCisJfSwKKwl7fSAvKiB0ZXJtaW5hdGUgYXJyYXkgYnkgLmNvbm5lY3RlZCA9PSAwICovCit9OworCisvKiB0YXMgb24gbWFjaGluZXMgd2l0aCBldmVyeXRoaW5nIGNvbm5lY3RlZCAqLworc3RhdGljIHN0cnVjdCBjb2RlY19jb25uZWN0aW9uIHRhc19jb25uZWN0aW9uc19hbGxbXSA9IHsKKwl7CisJCS5jb25uZWN0ZWQgPSBDQ19TUEVBS0VSUyB8IENDX0hFQURQSE9ORSB8IENDX0xJTkVPVVQsCisJCS5jb2RlY19iaXQgPSAwLAorCX0sCisJeworCQkuY29ubmVjdGVkID0gQ0NfTElORUlOLAorCQkuY29kZWNfYml0ID0gMiwKKwl9LAorCXsKKwkJLmNvbm5lY3RlZCA9IENDX01JQ1JPUEhPTkUsCisJCS5jb2RlY19iaXQgPSAzLAorCX0sCisJe30gLyogdGVybWluYXRlIGFycmF5IGJ5IC5jb25uZWN0ZWQgPT0gMCAqLworfTsKKworc3RhdGljIHN0cnVjdCBjb2RlY19jb25uZWN0aW9uIHRvb25pZV9jb25uZWN0aW9uc1tdID0geworCXsKKwkJLmNvbm5lY3RlZCA9IENDX1NQRUFLRVJTIHwgQ0NfSEVBRFBIT05FLAorCQkuY29kZWNfYml0ID0gMCwKKwl9LAorCXt9IC8qIHRlcm1pbmF0ZSBhcnJheSBieSAuY29ubmVjdGVkID09IDAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiB0b3Bhel9pbnB1dFtdID0geworCXsKKwkJLmNvbm5lY3RlZCA9IENDX0RJR0lUQUxJTiwKKwkJLmNvZGVjX2JpdCA9IDAsCisJfSwKKwl7fSAvKiB0ZXJtaW5hdGUgYXJyYXkgYnkgLmNvbm5lY3RlZCA9PSAwICovCit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gdG9wYXpfb3V0cHV0W10gPSB7CisJeworCQkuY29ubmVjdGVkID0gQ0NfRElHSVRBTE9VVCwKKwkJLmNvZGVjX2JpdCA9IDEsCisJfSwKKwl7fSAvKiB0ZXJtaW5hdGUgYXJyYXkgYnkgLmNvbm5lY3RlZCA9PSAwICovCit9OworCitzdGF0aWMgc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gdG9wYXpfaW5vdXRbXSA9IHsKKwl7CisJCS5jb25uZWN0ZWQgPSBDQ19ESUdJVEFMSU4sCisJCS5jb2RlY19iaXQgPSAwLAorCX0sCisJeworCQkuY29ubmVjdGVkID0gQ0NfRElHSVRBTE9VVCwKKwkJLmNvZGVjX2JpdCA9IDEsCisJfSwKKwl7fSAvKiB0ZXJtaW5hdGUgYXJyYXkgYnkgLmNvbm5lY3RlZCA9PSAwICovCit9OworCitzdGF0aWMgc3RydWN0IGxheW91dCBsYXlvdXRzW10gPSB7CisJLyogbGFzdCBQb3dlckJvb2tzICgxNSIgT2N0IDIwMDUpICovCisJeyAubGF5b3V0X2lkID0gODIsCisJICAuZmxhZ3MgPSBMQVlPVVRfRkxBR19DT01CT19MSU5FT1VUX1NQRElGLAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAib255eCIsCisJCS5jb25uZWN0aW9ucyA9IG9ueXhfY29ubmVjdGlvbnNfbm9oZWFkcGhvbmVzLAorCSAgfSwKKwkgIC5jb2RlY3NbMV0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5wdXQsCisJICB9LAorCX0sCisJLyogUG93ZXJNYWM5LDEgKi8KKwl7IC5sYXlvdXRfaWQgPSA2MCwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX3JlYWxsaW5lb3V0LAorCSAgfSwKKwl9LAorCS8qIFBvd2VyTWFjOSwxICovCisJeyAubGF5b3V0X2lkID0gNjEsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwl9LAorCS8qIFBvd2VyQm9vazUsNyAqLworCXsgLmxheW91dF9pZCA9IDY0LAorCSAgLmZsYWdzID0gTEFZT1VUX0ZMQUdfQ09NQk9fTElORU9VVF9TUERJRiwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJfSwKKwkvKiBQb3dlckJvb2s1LDcgKi8KKwl7IC5sYXlvdXRfaWQgPSA2NSwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5wdXQsCisJICB9LAorCX0sCisJLyogUG93ZXJCb29rNSw5IFsxNyIgT2N0IDIwMDVdICovCisJeyAubGF5b3V0X2lkID0gODQsCisJICAuZmxhZ3MgPSBMQVlPVVRfRkxBR19DT01CT19MSU5FT1VUX1NQRElGLAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAib255eCIsCisJCS5jb25uZWN0aW9ucyA9IG9ueXhfY29ubmVjdGlvbnNfbm9oZWFkcGhvbmVzLAorCSAgfSwKKwkgIC5jb2RlY3NbMV0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5wdXQsCisJICB9LAorCX0sCisJLyogUG93ZXJNYWM4LDEgKi8KKwl7IC5sYXlvdXRfaWQgPSA0NSwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJICAuY29kZWNzWzFdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwl9LAorCS8qIFF1YWQgUG93ZXJNYWMgKGFuYWxvZyBpbiwgYW5hbG9nL2RpZ2l0YWwgb3V0KSAqLworCXsgLmxheW91dF9pZCA9IDY4LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAib255eCIsCisJCS5jb25uZWN0aW9ucyA9IG9ueXhfY29ubmVjdGlvbnNfbm9taWMsCisJICB9LAorCX0sCisJLyogUXVhZCBQb3dlck1hYyAoZGlnaXRhbCBpbikgKi8KKwl7IC5sYXlvdXRfaWQgPSA2OSwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5wdXQsCisJICB9LAorCSAgLmJ1c25hbWUgPSAiZGlnaXRhbCBpbiIsIC5wY21pZCA9IDEgfSwKKwkvKiBFYXJseSAyMDA1IFBvd2VyQm9vayAoUG93ZXJCb29rIDUsNikgKi8KKwl7IC5sYXlvdXRfaWQgPSA3MCwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRhcyIsCisJCS5jb25uZWN0aW9ucyA9IHRhc19jb25uZWN0aW9uc19ub2xpbmVvdXQsCisJICB9LAorCX0sCisJLyogUG93ZXJCb29rIDUsNCAqLworCXsgLmxheW91dF9pZCA9IDUxLAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidGFzIiwKKwkJLmNvbm5lY3Rpb25zID0gdGFzX2Nvbm5lY3Rpb25zX25vbGluZW91dCwKKwkgIH0sCisJfSwKKwkvKiBQb3dlckJvb2s2LDcgKi8KKwl7IC5sYXlvdXRfaWQgPSA4MCwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRhcyIsCisJCS5jb25uZWN0aW9ucyA9IHRhc19jb25uZWN0aW9uc19ub2xpbmUsCisJICB9LAorCX0sCisJLyogUG93ZXJCb29rNiw4ICovCisJeyAubGF5b3V0X2lkID0gNzIsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0YXMiLAorCQkuY29ubmVjdGlvbnMgPSB0YXNfY29ubmVjdGlvbnNfbm9saW5lb3V0LAorCSAgfSwKKwl9LAorCS8qIFBvd2VyTWFjOCwyICovCisJeyAubGF5b3V0X2lkID0gODYsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJvbnl4IiwKKwkJLmNvbm5lY3Rpb25zID0gb255eF9jb25uZWN0aW9uc19ub21pYywKKwkgIH0sCisJICAuY29kZWNzWzFdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwl9LAorCS8qIFBvd2VyQm9vazYsNyAqLworCXsgLmxheW91dF9pZCA9IDkyLAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidGFzIiwKKwkJLmNvbm5lY3Rpb25zID0gdGFzX2Nvbm5lY3Rpb25zX25vbGluZW91dCwKKwkgIH0sCisJfSwKKwkvKiBQb3dlck1hYzEwLDEgKE1hYyBNaW5pKSAqLworCXsgLmxheW91dF9pZCA9IDU4LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidG9vbmllIiwKKwkJLmNvbm5lY3Rpb25zID0gdG9vbmllX2Nvbm5lY3Rpb25zLAorCSAgfSwKKwl9LAorCS8qIHVua25vd24sIHVudGVzdGVkLCBidXQgdGhpcyBjb21lcyBmcm9tIEFwcGxlICovCisJeyAubGF5b3V0X2lkID0gNDEsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0YXMiLAorCQkuY29ubmVjdGlvbnMgPSB0YXNfY29ubmVjdGlvbnNfYWxsLAorCSAgfSwKKwl9LAorCXsgLmxheW91dF9pZCA9IDM2LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidGFzIiwKKwkJLmNvbm5lY3Rpb25zID0gdGFzX2Nvbm5lY3Rpb25zX25vbWljLAorCSAgfSwKKwkgIC5jb2RlY3NbMV0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5vdXQsCisJICB9LAorCX0sCisJeyAubGF5b3V0X2lkID0gNDcsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJvbnl4IiwKKwkJLmNvbm5lY3Rpb25zID0gb255eF9jb25uZWN0aW9uc19ub2hlYWRwaG9uZXMsCisJICB9LAorCX0sCisJeyAubGF5b3V0X2lkID0gNDgsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwl9LAorCXsgLmxheW91dF9pZCA9IDQ5LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAib255eCIsCisJCS5jb25uZWN0aW9ucyA9IG9ueXhfY29ubmVjdGlvbnNfbm9taWMsCisJICB9LAorCX0sCisJeyAubGF5b3V0X2lkID0gNTAsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwl9LAorCXsgLmxheW91dF9pZCA9IDU2LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAib255eCIsCisJCS5jb25uZWN0aW9ucyA9IG9ueXhfY29ubmVjdGlvbnNfbm9oZWFkcGhvbmVzLAorCSAgfSwKKwl9LAorCXsgLmxheW91dF9pZCA9IDU3LAorCSAgLmNvZGVjc1swXSA9IHsKKwkJLm5hbWUgPSAidG9wYXoiLAorCQkuY29ubmVjdGlvbnMgPSB0b3Bhel9pbnB1dCwKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA2MiwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJICAuY29kZWNzWzFdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X291dHB1dCwKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA2NiwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA2NywKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRvcGF6IiwKKwkJLmNvbm5lY3Rpb25zID0gdG9wYXpfaW5wdXQsCisJICB9LAorCX0sCisJeyAubGF5b3V0X2lkID0gNzYsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0YXMiLAorCQkuY29ubmVjdGlvbnMgPSB0YXNfY29ubmVjdGlvbnNfbm9taWMsCisJICB9LAorCSAgLmNvZGVjc1sxXSA9IHsKKwkJLm5hbWUgPSAidG9wYXoiLAorCQkuY29ubmVjdGlvbnMgPSB0b3Bhel9pbm91dCwKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA5MCwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRhcyIsCisJCS5jb25uZWN0aW9ucyA9IHRhc19jb25uZWN0aW9uc19ub2xpbmUsCisJICB9LAorCX0sCisJeyAubGF5b3V0X2lkID0gOTQsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJvbnl4IiwKKwkJLyogYnV0IGl0IGhhcyBhbiBleHRlcm5hbCBtaWM/PyBob3cgdG8gc2VsZWN0PyAqLworCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA5NiwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSA5OCwKKwkgIC5jb2RlY3NbMF0gPSB7CisJCS5uYW1lID0gInRvb25pZSIsCisJCS5jb25uZWN0aW9ucyA9IHRvb25pZV9jb25uZWN0aW9ucywKKwkgIH0sCisJfSwKKwl7IC5sYXlvdXRfaWQgPSAxMDAsCisJICAuY29kZWNzWzBdID0geworCQkubmFtZSA9ICJ0b3BheiIsCisJCS5jb25uZWN0aW9ucyA9IHRvcGF6X2lucHV0LAorCSAgfSwKKwkgIC5jb2RlY3NbMV0gPSB7CisJCS5uYW1lID0gIm9ueXgiLAorCQkuY29ubmVjdGlvbnMgPSBvbnl4X2Nvbm5lY3Rpb25zX25vaGVhZHBob25lcywKKwkgIH0sCisJfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBsYXlvdXQgKmZpbmRfbGF5b3V0X2J5X2lkKHVuc2lnbmVkIGludCBpZCkKK3sKKwlzdHJ1Y3QgbGF5b3V0ICpsOworCisJbCA9IGxheW91dHM7CisJd2hpbGUgKGwtPmxheW91dF9pZCkgeworCQlpZiAobC0+bGF5b3V0X2lkID09IGlkKQorCQkJcmV0dXJuIGw7CisJCWwrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHVzZV9sYXlvdXQoc3RydWN0IGxheW91dCAqbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPE1BWF9DT0RFQ1NfUEVSX0JVUzsgaSsrKSB7CisJCWlmIChsLT5jb2RlY3NbaV0ubmFtZSkgeworCQkJcmVxdWVzdF9tb2R1bGUoInNuZC1hb2EtY29kZWMtJXMiLCBsLT5jb2RlY3NbaV0ubmFtZSk7CisJCX0KKwl9CisJLyogbm93IHdlIHdhaXQgZm9yIHRoZSBjb2RlY3MgdG8gY2FsbCB1cyBiYWNrICovCit9CisKK3N0cnVjdCBsYXlvdXRfZGV2OworCitzdHJ1Y3QgbGF5b3V0X2Rldl9wdHIgeworCXN0cnVjdCBsYXlvdXRfZGV2ICpwdHI7Cit9OworCitzdHJ1Y3QgbGF5b3V0X2RldiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzb3VuZGJ1c19kZXYgKnNkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpzb3VuZDsKKwlzdHJ1Y3QgYW9hX2NvZGVjICpjb2RlY3NbTUFYX0NPREVDU19QRVJfQlVTXTsKKwlzdHJ1Y3QgbGF5b3V0ICpsYXlvdXQ7CisJc3RydWN0IGdwaW9fcnVudGltZSBncGlvOworCisJLyogd2UgbmVlZCB0aGVzZSBmb3IgaGVhZHBob25lL2xpbmVvdXQgZGV0ZWN0aW9uICovCisJc3RydWN0IHNuZF9rY29udHJvbCAqaGVhZHBob25lX2N0cmw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqbGluZW91dF9jdHJsOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKnNwZWFrZXJfY3RybDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpoZWFkcGhvbmVfZGV0ZWN0ZWRfY3RybDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpsaW5lb3V0X2RldGVjdGVkX2N0cmw7CisKKwlzdHJ1Y3QgbGF5b3V0X2Rldl9wdHIgc2VsZnB0cl9oZWFkcGhvbmU7CisJc3RydWN0IGxheW91dF9kZXZfcHRyIHNlbGZwdHJfbGluZW91dDsKKworCXUzMiBoYXZlX2xpbmVvdXRfZGV0ZWN0OjEsCisJICAgIGhhdmVfaGVhZHBob25lX2RldGVjdDoxLAorCSAgICBzd2l0Y2hfb25faGVhZHBob25lOjEsCisJICAgIHN3aXRjaF9vbl9saW5lb3V0OjE7Cit9OworCitzdGF0aWMgTElTVF9IRUFEKGxheW91dHNfbGlzdCk7CitzdGF0aWMgaW50IGxheW91dHNfbGlzdF9pdGVtczsKKy8qIHRoaXMgY2FuIGdvIGF3YXkgYnV0IG9ubHkgaWYgd2UgYWxsb3cgbXVsdGlwbGUgY2FyZHMsCisgKiBtYWtlIHRoZSBmYWJyaWMgaGFuZGxlIGFsbCB0aGUgY2FyZCBzdHVmZiwgZXRjLi4uICovCitzdGF0aWMgc3RydWN0IGxheW91dF9kZXYgKmxheW91dF9kZXZpY2U7CisKK3N0YXRpYyBpbnQgY29udHJvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTjsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gMTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBBTVBfQ09OVFJPTChuLCBkZXNjcmlwdGlvbikJCQkJCVwKK3N0YXRpYyBpbnQgbiMjX2NvbnRyb2xfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAkJXAorCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBncGlvX3J1bnRpbWUgKmdwaW8gPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CVwKKwlpZiAoZ3Bpby0+bWV0aG9kcyAmJiBncGlvLT5tZXRob2RzLT5nZXRfIyNuKQkJCVwKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQkJCVwKKwkJCWdwaW8tPm1ldGhvZHMtPmdldF8jI24oZ3Bpbyk7CQkJXAorCXJldHVybiAwOwkJCQkJCQlcCit9CQkJCQkJCQkJXAorc3RhdGljIGludCBuIyNfY29udHJvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCQlcCisJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGdwaW9fcnVudGltZSAqZ3BpbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsJXAorCWlmIChncGlvLT5tZXRob2RzICYmIGdwaW8tPm1ldGhvZHMtPmdldF8jI24pCQkJXAorCQlncGlvLT5tZXRob2RzLT5zZXRfIyNuKGdwaW8sCQkJCVwKKwkJCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsJCVwKKwlyZXR1cm4gMTsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBuIyNfY3RsID0gewkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCQkJCVwKKwkubmFtZSA9IGRlc2NyaXB0aW9uLAkJCQkJCVwKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwgICAgICAgICAgICAgICAgICAgICAgXAorCS5pbmZvID0gY29udHJvbF9pbmZvLAkJCQkJCVwKKwkuZ2V0ID0gbiMjX2NvbnRyb2xfZ2V0LAkJCQkJCVwKKwkucHV0ID0gbiMjX2NvbnRyb2xfcHV0LAkJCQkJCVwKK30KKworQU1QX0NPTlRST0woaGVhZHBob25lLCAiSGVhZHBob25lIFN3aXRjaCIpOworQU1QX0NPTlRST0woc3BlYWtlcnMsICJTcGVha2VycyBTd2l0Y2giKTsKK0FNUF9DT05UUk9MKGxpbmVvdXQsICJMaW5lLU91dCBTd2l0Y2giKTsKKworc3RhdGljIGludCBkZXRlY3RfY2hvaWNlX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IGxheW91dF9kZXYgKmxkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlzd2l0Y2ggKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSB7CisJY2FzZSAwOgorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGxkZXYtPnN3aXRjaF9vbl9oZWFkcGhvbmU7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBsZGV2LT5zd2l0Y2hfb25fbGluZW91dDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldGVjdF9jaG9pY2VfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKworCXN3aXRjaCAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKKwljYXNlIDA6CisJCWxkZXYtPnN3aXRjaF9vbl9oZWFkcGhvbmUgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCQlicmVhazsKKwljYXNlIDE6CisJCWxkZXYtPnN3aXRjaF9vbl9saW5lb3V0ID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGVhZHBob25lX2RldGVjdF9jaG9pY2UgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiSGVhZHBob25lIERldGVjdCBBdXRvc3dpdGNoIiwKKwkuaW5mbyA9IGNvbnRyb2xfaW5mbywKKwkuYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSwKKwkuZ2V0ID0gZGV0ZWN0X2Nob2ljZV9nZXQsCisJLnB1dCA9IGRldGVjdF9jaG9pY2VfcHV0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBsaW5lb3V0X2RldGVjdF9jaG9pY2UgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTGluZS1PdXQgRGV0ZWN0IEF1dG9zd2l0Y2giLAorCS5pbmZvID0gY29udHJvbF9pbmZvLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5nZXQgPSBkZXRlY3RfY2hvaWNlX2dldCwKKwkucHV0ID0gZGV0ZWN0X2Nob2ljZV9wdXQsCisJLnByaXZhdGVfdmFsdWUgPSAxLAorfTsKKworc3RhdGljIGludCBkZXRlY3RlZF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlpbnQgdjsKKworCXN3aXRjaCAoa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpIHsKKwljYXNlIDA6CisJCXYgPSBsZGV2LT5ncGlvLm1ldGhvZHMtPmdldF9kZXRlY3QoJmxkZXYtPmdwaW8sCisJCQkJCQkgICBBT0FfTk9USUZZX0hFQURQSE9ORSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJdiA9IGxkZXYtPmdwaW8ubWV0aG9kcy0+Z2V0X2RldGVjdCgmbGRldi0+Z3BpbywKKwkJCQkJCSAgIEFPQV9OT1RJRllfTElORV9PVVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB2OworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGVhZHBob25lX2RldGVjdGVkID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIkhlYWRwaG9uZSBEZXRlY3RlZCIsCisJLmluZm8gPSBjb250cm9sX2luZm8sCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5nZXQgPSBkZXRlY3RlZF9nZXQsCisJLnByaXZhdGVfdmFsdWUgPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGxpbmVvdXRfZGV0ZWN0ZWQgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAiTGluZS1PdXQgRGV0ZWN0ZWQiLAorCS5pbmZvID0gY29udHJvbF9pbmZvLAorCS5hY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKKwkuZ2V0ID0gZGV0ZWN0ZWRfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gMSwKK307CisKK3N0YXRpYyBpbnQgY2hlY2tfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMsCisJCSAgICAgICBzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiwKKwkJICAgICAgIHN0cnVjdCBjb2RlY19jb25uZWN0X2luZm8gKmNjaSkKK3sKKwl1MzIgKnJlZjsKKwljaGFyIHByb3BuYW1lWzMyXTsKKwlzdHJ1Y3QgY29kZWNfY29ubmVjdGlvbiAqY2M7CisKKwkvKiBpZiB0aGUgY29kZWMgaGFzIGEgJ2NvZGVjJyBub2RlLCB3ZSByZXF1aXJlIGEgcmVmZXJlbmNlICovCisJaWYgKGNvZGVjLT5ub2RlICYmIChzdHJjbXAoY29kZWMtPm5vZGUtPm5hbWUsICJjb2RlYyIpID09IDApKSB7CisJCXNucHJpbnRmKHByb3BuYW1lLCBzaXplb2YocHJvcG5hbWUpLAorCQkJICJwbGF0Zm9ybS0lcy1jb2RlYy1yZWYiLCBjb2RlYy0+bmFtZSk7CisJCXJlZiA9ICh1MzIqKWdldF9wcm9wZXJ0eShsZGV2LT5zb3VuZCwgcHJvcG5hbWUsIE5VTEwpOworCQlpZiAoIXJlZikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic25kLWFvYS1mYWJyaWMtbGF5b3V0OiAiCisJCQkJInJlcXVpcmVkIHByb3BlcnR5ICVzIG5vdCBwcmVzZW50XG4iLCBwcm9wbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoKnJlZiAhPSBjb2RlYy0+bm9kZS0+bGludXhfcGhhbmRsZSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic25kLWFvYS1mYWJyaWMtbGF5b3V0OiAiCisJCQkJIiVzIGRvZXNuJ3QgbWF0Y2ghXG4iLCBwcm9wbmFtZSk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChsYXlvdXRzX2xpc3RfaXRlbXMgIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic25kLWFvYS1mYWJyaWMtbGF5b3V0OiAiCisJCQkJIm1vcmUgdGhhbiBvbmUgc291bmRidXMsIGJ1dCBubyByZWZlcmVuY2VzLlxuIik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKwljb2RlYy0+c291bmRidXNfZGV2ID0gbGRldi0+c2RldjsKKwljb2RlYy0+Z3BpbyA9ICZsZGV2LT5ncGlvOworCisJY2MgPSBjY2ktPmNvbm5lY3Rpb25zOworCWlmICghY2MpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAic25kLWFvYS1mYWJyaWMtbGF5b3V0OiBjYW4gdXNlIHRoaXMgY29kZWNcbiIpOworCisJY29kZWMtPmNvbm5lY3RlZCA9IDA7CisJY29kZWMtPmZhYnJpY19kYXRhID0gY2M7CisKKwl3aGlsZSAoY2MtPmNvbm5lY3RlZCkgeworCQljb2RlYy0+Y29ubmVjdGVkIHw9IDE8PGNjLT5jb2RlY19iaXQ7CisJCWNjKys7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGF5b3V0X2ZvdW5kX2NvZGVjKHN0cnVjdCBhb2FfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBsYXlvdXRfZGV2ICpsZGV2OworCWludCBpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsZGV2LCAmbGF5b3V0c19saXN0LCBsaXN0KSB7CisJCWZvciAoaT0wOyBpPE1BWF9DT0RFQ1NfUEVSX0JVUzsgaSsrKSB7CisJCQlpZiAoIWxkZXYtPmxheW91dC0+Y29kZWNzW2ldLm5hbWUpCisJCQkJY29udGludWU7CisJCQlpZiAoc3RyY21wKGxkZXYtPmxheW91dC0+Y29kZWNzW2ldLm5hbWUsIGNvZGVjLT5uYW1lKSA9PSAwKSB7CisJCQkJaWYgKGNoZWNrX2NvZGVjKGNvZGVjLAorCQkJCQkJbGRldiwKKwkJCQkJCSZsZGV2LT5sYXlvdXQtPmNvZGVjc1tpXSkgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGxheW91dF9yZW1vdmVfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJLyogaGVyZSByZW1vdmUgdGhlIGNvZGVjIGZyb20gdGhlIGxheW91dCBkZXYncworCSAqIGNvZGVjIHJlZmVyZW5jZSAqLworCisJY29kZWMtPnNvdW5kYnVzX2RldiA9IE5VTEw7CisJY29kZWMtPmdwaW8gPSBOVUxMOworCWZvciAoaT0wOyBpPE1BWF9DT0RFQ1NfUEVSX0JVUzsgaSsrKSB7CisJfQorfQorCitzdGF0aWMgdm9pZCBsYXlvdXRfbm90aWZ5KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxheW91dF9kZXZfcHRyICpkcHRyID0gZGF0YTsKKwlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldjsKKwlpbnQgdiwgdXBkYXRlOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmRldGVjdGVkLCAqYzsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBhb2FfZ2V0X2NhcmQoKTsKKworCWxkZXYgPSBkcHRyLT5wdHI7CisJaWYgKGRhdGEgPT0gJmxkZXYtPnNlbGZwdHJfaGVhZHBob25lKSB7CisJCXYgPSBsZGV2LT5ncGlvLm1ldGhvZHMtPmdldF9kZXRlY3QoJmxkZXYtPmdwaW8sIEFPQV9OT1RJRllfSEVBRFBIT05FKTsKKwkJZGV0ZWN0ZWQgPSBsZGV2LT5oZWFkcGhvbmVfZGV0ZWN0ZWRfY3RybDsKKwkJdXBkYXRlID0gbGRldi0+c3dpdGNoX29uX2hlYWRwaG9uZTsKKwkJaWYgKHVwZGF0ZSkgeworCQkJbGRldi0+Z3Bpby5tZXRob2RzLT5zZXRfc3BlYWtlcnMoJmxkZXYtPmdwaW8sICF2KTsKKwkJCWxkZXYtPmdwaW8ubWV0aG9kcy0+c2V0X2hlYWRwaG9uZSgmbGRldi0+Z3Bpbywgdik7CisJCQlsZGV2LT5ncGlvLm1ldGhvZHMtPnNldF9saW5lb3V0KCZsZGV2LT5ncGlvLCAwKTsKKwkJfQorCX0gZWxzZSBpZiAoZGF0YSA9PSAmbGRldi0+c2VsZnB0cl9saW5lb3V0KSB7CisJCXYgPSBsZGV2LT5ncGlvLm1ldGhvZHMtPmdldF9kZXRlY3QoJmxkZXYtPmdwaW8sIEFPQV9OT1RJRllfTElORV9PVVQpOworCQlkZXRlY3RlZCA9IGxkZXYtPmxpbmVvdXRfZGV0ZWN0ZWRfY3RybDsKKwkJdXBkYXRlID0gbGRldi0+c3dpdGNoX29uX2xpbmVvdXQ7CisJCWlmICh1cGRhdGUpIHsKKwkJCWxkZXYtPmdwaW8ubWV0aG9kcy0+c2V0X3NwZWFrZXJzKCZsZGV2LT5ncGlvLCAhdik7CisJCQlsZGV2LT5ncGlvLm1ldGhvZHMtPnNldF9oZWFkcGhvbmUoJmxkZXYtPmdwaW8sIDApOworCQkJbGRldi0+Z3Bpby5tZXRob2RzLT5zZXRfbGluZW91dCgmbGRldi0+Z3Bpbywgdik7CisJCX0KKwl9IGVsc2UKKwkJcmV0dXJuOworCisJaWYgKGRldGVjdGVkKQorCQlzbmRfY3RsX25vdGlmeShjYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwgJmRldGVjdGVkLT5pZCk7CisJaWYgKHVwZGF0ZSkgeworCQljID0gbGRldi0+aGVhZHBob25lX2N0cmw7CisJCWlmIChjKQorCQkJc25kX2N0bF9ub3RpZnkoY2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZjLT5pZCk7CisJCWMgPSBsZGV2LT5zcGVha2VyX2N0cmw7CisJCWlmIChjKQorCQkJc25kX2N0bF9ub3RpZnkoY2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZjLT5pZCk7CisJCWMgPSBsZGV2LT5saW5lb3V0X2N0cmw7CisJCWlmIChjKQorCQkJc25kX2N0bF9ub3RpZnkoY2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsICZjLT5pZCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBsYXlvdXRfYXR0YWNoZWRfY29kZWMoc3RydWN0IGFvYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGNvZGVjX2Nvbm5lY3Rpb24gKmNjOworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmN0bDsKKwlpbnQgaGVhZHBob25lcywgbGluZW91dDsKKwlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IGxheW91dF9kZXZpY2U7CisKKwkvKiBuZWVkIHRvIGFkZCB0aGlzIGNvZGVjIHRvIG91ciBjb2RlYyBhcnJheSEgKi8KKworCWNjID0gY29kZWMtPmZhYnJpY19kYXRhOworCisJaGVhZHBob25lcyA9IGNvZGVjLT5ncGlvLT5tZXRob2RzLT5nZXRfZGV0ZWN0KGNvZGVjLT5ncGlvLAorCQkJCQkJICAgICAgQU9BX05PVElGWV9IRUFEUEhPTkUpOworIAlsaW5lb3V0ID0gY29kZWMtPmdwaW8tPm1ldGhvZHMtPmdldF9kZXRlY3QoY29kZWMtPmdwaW8sCisJCQkJCQkgICBBT0FfTk9USUZZX0xJTkVfT1VUKTsKKworCXdoaWxlIChjYy0+Y29ubmVjdGVkKSB7CisJCWlmIChjYy0+Y29ubmVjdGVkICYgQ0NfU1BFQUtFUlMpIHsKKwkJCWlmIChoZWFkcGhvbmVzIDw9IDAgJiYgbGluZW91dCA8PSAwKQorCQkJCWxkZXYtPmdwaW8ubWV0aG9kcy0+c2V0X3NwZWFrZXJzKGNvZGVjLT5ncGlvLCAxKTsKKwkJCWN0bCA9IHNuZF9jdGxfbmV3MSgmc3BlYWtlcnNfY3RsLCBjb2RlYy0+Z3Bpbyk7CisJCQlsZGV2LT5zcGVha2VyX2N0cmwgPSBjdGw7CisJCQlhb2Ffc25kX2N0bF9hZGQoY3RsKTsKKwkJfQorCQlpZiAoY2MtPmNvbm5lY3RlZCAmIENDX0hFQURQSE9ORSkgeworCQkJaWYgKGhlYWRwaG9uZXMgPT0gMSkKKwkJCQlsZGV2LT5ncGlvLm1ldGhvZHMtPnNldF9oZWFkcGhvbmUoY29kZWMtPmdwaW8sIDEpOworCQkJY3RsID0gc25kX2N0bF9uZXcxKCZoZWFkcGhvbmVfY3RsLCBjb2RlYy0+Z3Bpbyk7CisJCQlsZGV2LT5oZWFkcGhvbmVfY3RybCA9IGN0bDsKKwkJCWFvYV9zbmRfY3RsX2FkZChjdGwpOworCQkJbGRldi0+aGF2ZV9oZWFkcGhvbmVfZGV0ZWN0ID0KKwkJCQkhbGRldi0+Z3Bpby5tZXRob2RzCisJCQkJCS0+c2V0X25vdGlmeSgmbGRldi0+Z3BpbywKKwkJCQkJCSAgICAgQU9BX05PVElGWV9IRUFEUEhPTkUsCisJCQkJCQkgICAgIGxheW91dF9ub3RpZnksCisJCQkJCQkgICAgICZsZGV2LT5zZWxmcHRyX2hlYWRwaG9uZSk7CisJCQlpZiAobGRldi0+aGF2ZV9oZWFkcGhvbmVfZGV0ZWN0KSB7CisJCQkJY3RsID0gc25kX2N0bF9uZXcxKCZoZWFkcGhvbmVfZGV0ZWN0X2Nob2ljZSwKKwkJCQkJCSAgIGxkZXYpOworCQkJCWFvYV9zbmRfY3RsX2FkZChjdGwpOworCQkJCWN0bCA9IHNuZF9jdGxfbmV3MSgmaGVhZHBob25lX2RldGVjdGVkLAorCQkJCQkJICAgbGRldik7CisJCQkJbGRldi0+aGVhZHBob25lX2RldGVjdGVkX2N0cmwgPSBjdGw7CisJCQkJYW9hX3NuZF9jdGxfYWRkKGN0bCk7CisJCQl9CisJCX0KKwkJaWYgKGNjLT5jb25uZWN0ZWQgJiBDQ19MSU5FT1VUKSB7CisJCQlpZiAobGluZW91dCA9PSAxKQorCQkJCWxkZXYtPmdwaW8ubWV0aG9kcy0+c2V0X2xpbmVvdXQoY29kZWMtPmdwaW8sIDEpOworCQkJY3RsID0gc25kX2N0bF9uZXcxKCZsaW5lb3V0X2N0bCwgY29kZWMtPmdwaW8pOworCQkJaWYgKGNjLT5jb25uZWN0ZWQgJiBDQ19MSU5FT1VUX0xBQkVMTEVEX0hFQURQSE9ORSkKKwkJCQlzdHJsY3B5KGN0bC0+aWQubmFtZSwKKwkJCQkJIkhlYWRwaG9uZSBTd2l0Y2giLCBzaXplb2YoY3RsLT5pZC5uYW1lKSk7CisJCQlsZGV2LT5saW5lb3V0X2N0cmwgPSBjdGw7CisJCQlhb2Ffc25kX2N0bF9hZGQoY3RsKTsKKwkJCWxkZXYtPmhhdmVfbGluZW91dF9kZXRlY3QgPQorCQkJCSFsZGV2LT5ncGlvLm1ldGhvZHMKKwkJCQkJLT5zZXRfbm90aWZ5KCZsZGV2LT5ncGlvLAorCQkJCQkJICAgICBBT0FfTk9USUZZX0xJTkVfT1VULAorCQkJCQkJICAgICBsYXlvdXRfbm90aWZ5LAorCQkJCQkJICAgICAmbGRldi0+c2VsZnB0cl9saW5lb3V0KTsKKwkJCWlmIChsZGV2LT5oYXZlX2xpbmVvdXRfZGV0ZWN0KSB7CisJCQkJY3RsID0gc25kX2N0bF9uZXcxKCZsaW5lb3V0X2RldGVjdF9jaG9pY2UsCisJCQkJCQkgICBsZGV2KTsKKwkJCQlpZiAoY2MtPmNvbm5lY3RlZCAmIENDX0xJTkVPVVRfTEFCRUxMRURfSEVBRFBIT05FKQorCQkJCQlzdHJsY3B5KGN0bC0+aWQubmFtZSwKKwkJCQkJCSJIZWFkcGhvbmUgRGV0ZWN0IEF1dG9zd2l0Y2giLAorCQkJCQkJc2l6ZW9mKGN0bC0+aWQubmFtZSkpOworCQkJCWFvYV9zbmRfY3RsX2FkZChjdGwpOworCQkJCWN0bCA9IHNuZF9jdGxfbmV3MSgmbGluZW91dF9kZXRlY3RlZCwKKwkJCQkJCSAgIGxkZXYpOworCQkJCWlmIChjYy0+Y29ubmVjdGVkICYgQ0NfTElORU9VVF9MQUJFTExFRF9IRUFEUEhPTkUpCisJCQkJCXN0cmxjcHkoY3RsLT5pZC5uYW1lLAorCQkJCQkJIkhlYWRwaG9uZSBEZXRlY3RlZCIsCisJCQkJCQlzaXplb2YoY3RsLT5pZC5uYW1lKSk7CisJCQkJbGRldi0+bGluZW91dF9kZXRlY3RlZF9jdHJsID0gY3RsOworCQkJCWFvYV9zbmRfY3RsX2FkZChjdGwpOworCQkJfQorCQl9CisJCWNjKys7CisJfQorCS8qIG5vdyB1cGRhdGUgaW5pdGlhbCBzdGF0ZSAqLworCWlmIChsZGV2LT5oYXZlX2hlYWRwaG9uZV9kZXRlY3QpCisJCWxheW91dF9ub3RpZnkoJmxkZXYtPnNlbGZwdHJfaGVhZHBob25lKTsKKwlpZiAobGRldi0+aGF2ZV9saW5lb3V0X2RldGVjdCkKKwkJbGF5b3V0X25vdGlmeSgmbGRldi0+c2VsZnB0cl9saW5lb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBhb2FfZmFicmljIGxheW91dF9mYWJyaWMgPSB7CisJLm5hbWUgPSAiU291bmRCeUxheW91dCIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZvdW5kX2NvZGVjID0gbGF5b3V0X2ZvdW5kX2NvZGVjLAorCS5yZW1vdmVfY29kZWMgPSBsYXlvdXRfcmVtb3ZlX2NvZGVjLAorCS5hdHRhY2hlZF9jb2RlYyA9IGxheW91dF9hdHRhY2hlZF9jb2RlYywKK307CisKK3N0YXRpYyBpbnQgYW9hX2ZhYnJpY19sYXlvdXRfcHJvYmUoc3RydWN0IHNvdW5kYnVzX2RldiAqc2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnNvdW5kID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgKmxheW91dF9pZDsKKwlzdHJ1Y3QgbGF5b3V0ICpsYXlvdXQ7CisJc3RydWN0IGxheW91dF9kZXYgKmxkZXYgPSBOVUxMOworCWludCBlcnI7CisKKwkvKiBobSwgY3VycmVudGx5IHdlIGNhbiBvbmx5IGhhdmUgb25lIC4uLiAqLworCWlmIChsYXlvdXRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGJ5IGJyZWFraW5nIG91dCB3ZSBrZWVwIGEgcmVmZXJlbmNlICovCisJd2hpbGUgKChzb3VuZCA9IG9mX2dldF9uZXh0X2NoaWxkKHNkZXYtPm9mZGV2Lm5vZGUsIHNvdW5kKSkpIHsKKwkJaWYgKHNvdW5kLT50eXBlICYmIHN0cmNhc2VjbXAoc291bmQtPnR5cGUsICJzb3VuZGNoaXAiKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmICghc291bmQpIHJldHVybiAtRU5PREVWOworCisJbGF5b3V0X2lkID0gKHVuc2lnbmVkIGludCAqKSBnZXRfcHJvcGVydHkoc291bmQsICJsYXlvdXQtaWQiLCBOVUxMKTsKKwlpZiAoIWxheW91dF9pZCkKKwkJZ290byBvdXRub2RldjsKKwlwcmludGsoS0VSTl9JTkZPICJzbmQtYW9hLWZhYnJpYy1sYXlvdXQ6IGZvdW5kIGJ1cyB3aXRoIGxheW91dCAlZCAiLCAqbGF5b3V0X2lkKTsKKworCWxheW91dCA9IGZpbmRfbGF5b3V0X2J5X2lkKCpsYXlvdXRfaWQpOworCWlmICghbGF5b3V0KSB7CisJCXByaW50aygiKG5vIGlkZWEgaG93IHRvIGhhbmRsZSlcbiIpOworCQlnb3RvIG91dG5vZGV2OworCX0KKworCWxkZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbGF5b3V0X2RldiksIEdGUF9LRVJORUwpOworCWlmICghbGRldikKKwkJZ290byBvdXRub2RldjsKKworCWxheW91dF9kZXZpY2UgPSBsZGV2OworCWxkZXYtPnNkZXYgPSBzZGV2OworCWxkZXYtPnNvdW5kID0gc291bmQ7CisJbGRldi0+bGF5b3V0ID0gbGF5b3V0OworCWxkZXYtPmdwaW8ubm9kZSA9IHNvdW5kLT5wYXJlbnQ7CisJc3dpdGNoIChsYXlvdXQtPmxheW91dF9pZCkgeworCWNhc2UgNDE6IC8qIHRoYXQgdW5rbm93biBtYWNoaW5lIG5vIG9uZSBzZWVtcyB0byBoYXZlICovCisJY2FzZSA1MTogLyogUG93ZXJCb29rNSw0ICovCisJY2FzZSA1ODogLyogTWFjIE1pbmkgKi8KKwkJbGRldi0+Z3Bpby5tZXRob2RzID0gZnRyX2dwaW9fbWV0aG9kczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGRldi0+Z3Bpby5tZXRob2RzID0gcG1mX2dwaW9fbWV0aG9kczsKKwl9CisJbGRldi0+c2VsZnB0cl9oZWFkcGhvbmUucHRyID0gbGRldjsKKwlsZGV2LT5zZWxmcHRyX2xpbmVvdXQucHRyID0gbGRldjsKKwlzZGV2LT5vZmRldi5kZXYuZHJpdmVyX2RhdGEgPSBsZGV2OworCisJcHJpbnRrKCIodXNpbmcpXG4iKTsKKwlsaXN0X2FkZCgmbGRldi0+bGlzdCwgJmxheW91dHNfbGlzdCk7CisJbGF5b3V0c19saXN0X2l0ZW1zKys7CisKKwkvKiBhc3NpZ24gdGhlc2UgYmVmb3JlIHJlZ2lzdGVyaW5nIG91cnNlbHZlcywgc28KKwkgKiBjYWxsYmFja3MgdGhhdCBhcmUgZG9uZSBkdXJpbmcgcmVnaXN0cmF0aW9uCisJICogYWxyZWFkeSBoYXZlIHRoZSB2YWx1ZXMgKi8KKwlzZGV2LT5wY21pZCA9IGxkZXYtPmxheW91dC0+cGNtaWQ7CisJaWYgKGxkZXYtPmxheW91dC0+YnVzbmFtZSkgeworCQlzZGV2LT5wY21uYW1lID0gbGRldi0+bGF5b3V0LT5idXNuYW1lOworCX0gZWxzZSB7CisJCXNkZXYtPnBjbW5hbWUgPSAiTWFzdGVyIjsKKwl9CisKKwlsZGV2LT5ncGlvLm1ldGhvZHMtPmluaXQoJmxkZXYtPmdwaW8pOworCisJZXJyID0gYW9hX2ZhYnJpY19yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYyk7CisJaWYgKGVyciAmJiBlcnIgIT0gLUVBTFJFQURZKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNuZC1hb2EtZmFicmljLWxheW91dDogY2FuJ3QgdXNlLCIKKwkJCQkgIiBhbm90aGVyIGZhYnJpYyBpcyBhY3RpdmUhXG4iKTsKKwkJZ290byBvdXRsaXN0ZGVsOworCX0KKworCXVzZV9sYXlvdXQobGF5b3V0KTsKKwlsZGV2LT5zd2l0Y2hfb25faGVhZHBob25lID0gMTsKKwlsZGV2LT5zd2l0Y2hfb25fbGluZW91dCA9IDE7CisJcmV0dXJuIDA7Cisgb3V0bGlzdGRlbDoKKwkvKiB3ZSB3b24ndCBiZSB1c2luZyB0aGVzZSB0aGVuLi4uICovCisJbGRldi0+Z3Bpby5tZXRob2RzLT5leGl0KCZsZGV2LT5ncGlvKTsKKwkvKiByZXNldCBpZiB3ZSBkaWRuJ3QgdXNlIGl0ICovCisJc2Rldi0+cGNtbmFtZSA9IE5VTEw7CisJc2Rldi0+cGNtaWQgPSAtMTsKKwlsaXN0X2RlbCgmbGRldi0+bGlzdCk7CisJbGF5b3V0c19saXN0X2l0ZW1zLS07Cisgb3V0bm9kZXY6CisgCWlmIChzb3VuZCkgb2Zfbm9kZV9wdXQoc291bmQpOworIAlsYXlvdXRfZGV2aWNlID0gTlVMTDsKKyAJaWYgKGxkZXYpIGtmcmVlKGxkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGFvYV9mYWJyaWNfbGF5b3V0X3JlbW92ZShzdHJ1Y3Qgc291bmRidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBsYXlvdXRfZGV2ICpsZGV2ID0gc2Rldi0+b2ZkZXYuZGV2LmRyaXZlcl9kYXRhOworCWludCBpOworCisJZm9yIChpPTA7IGk8TUFYX0NPREVDU19QRVJfQlVTOyBpKyspIHsKKwkJaWYgKGxkZXYtPmNvZGVjc1tpXSkgeworCQkJYW9hX2ZhYnJpY191bmxpbmtfY29kZWMobGRldi0+Y29kZWNzW2ldKTsKKwkJfQorCQlsZGV2LT5jb2RlY3NbaV0gPSBOVUxMOworCX0KKwlsaXN0X2RlbCgmbGRldi0+bGlzdCk7CisJbGF5b3V0c19saXN0X2l0ZW1zLS07CisJb2Zfbm9kZV9wdXQobGRldi0+c291bmQpOworCisJbGRldi0+Z3Bpby5tZXRob2RzLT5zZXRfbm90aWZ5KCZsZGV2LT5ncGlvLAorCQkJCSAgICAgICBBT0FfTk9USUZZX0hFQURQSE9ORSwKKwkJCQkgICAgICAgTlVMTCwKKwkJCQkgICAgICAgTlVMTCk7CisJbGRldi0+Z3Bpby5tZXRob2RzLT5zZXRfbm90aWZ5KCZsZGV2LT5ncGlvLAorCQkJCSAgICAgICBBT0FfTk9USUZZX0xJTkVfT1VULAorCQkJCSAgICAgICBOVUxMLAorCQkJCSAgICAgICBOVUxMKTsKKworCWxkZXYtPmdwaW8ubWV0aG9kcy0+ZXhpdCgmbGRldi0+Z3Bpbyk7CisJbGF5b3V0X2RldmljZSA9IE5VTEw7CisJa2ZyZWUobGRldik7CisJc2Rldi0+cGNtaWQgPSAtMTsKKwlzZGV2LT5wY21uYW1lID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhb2FfZmFicmljX2xheW91dF9zdXNwZW5kKHN0cnVjdCBzb3VuZGJ1c19kZXYgKnNkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbGF5b3V0X2RldiAqbGRldiA9IHNkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKKworCXByaW50aygiYW9hX2ZhYnJpY19sYXlvdXRfc3VzcGVuZCgpXG4iKTsKKworCWlmIChsZGV2LT5ncGlvLm1ldGhvZHMgJiYgbGRldi0+Z3Bpby5tZXRob2RzLT5hbGxfYW1wc19vZmYpCisJCWxkZXYtPmdwaW8ubWV0aG9kcy0+YWxsX2FtcHNfb2ZmKCZsZGV2LT5ncGlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFvYV9mYWJyaWNfbGF5b3V0X3Jlc3VtZShzdHJ1Y3Qgc291bmRidXNfZGV2ICpzZGV2KQoreworCXN0cnVjdCBsYXlvdXRfZGV2ICpsZGV2ID0gc2Rldi0+b2ZkZXYuZGV2LmRyaXZlcl9kYXRhOworCisJcHJpbnRrKCJhb2FfZmFicmljX2xheW91dF9yZXN1bWUoKVxuIik7CisKKwlpZiAobGRldi0+Z3Bpby5tZXRob2RzICYmIGxkZXYtPmdwaW8ubWV0aG9kcy0+YWxsX2FtcHNfb2ZmKQorCQlsZGV2LT5ncGlvLm1ldGhvZHMtPmFsbF9hbXBzX3Jlc3RvcmUoJmxkZXYtPmdwaW8pOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgYW9hX3NvdW5kYnVzX2RyaXZlciA9IHsKKwkubmFtZSA9ICJzbmRfYW9hX3NvdW5kYnVzX2RydiIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnByb2JlID0gYW9hX2ZhYnJpY19sYXlvdXRfcHJvYmUsCisJLnJlbW92ZSA9IGFvYV9mYWJyaWNfbGF5b3V0X3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGFvYV9mYWJyaWNfbGF5b3V0X3N1c3BlbmQsCisJLnJlc3VtZSA9IGFvYV9mYWJyaWNfbGF5b3V0X3Jlc3VtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBfX2luaXQgYW9hX2ZhYnJpY19sYXlvdXRfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwllcnIgPSBzb3VuZGJ1c19yZWdpc3Rlcl9kcml2ZXIoJmFvYV9zb3VuZGJ1c19kcml2ZXIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhb2FfZmFicmljX2xheW91dF9leGl0KHZvaWQpCit7CisJc291bmRidXNfdW5yZWdpc3Rlcl9kcml2ZXIoJmFvYV9zb3VuZGJ1c19kcml2ZXIpOworCWFvYV9mYWJyaWNfdW5yZWdpc3RlcigmbGF5b3V0X2ZhYnJpYyk7Cit9CisKK21vZHVsZV9pbml0KGFvYV9mYWJyaWNfbGF5b3V0X2luaXQpOworbW9kdWxlX2V4aXQoYW9hX2ZhYnJpY19sYXlvdXRfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvS2NvbmZpZyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzJkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2Evc291bmRidXMvS2NvbmZpZwpAQCAtMCwwICsxLDE0IEBACitjb25maWcgU05EX0FPQV9TT1VOREJVUworCXRyaXN0YXRlICJBcHBsZSBTb3VuZGJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkQgJiYgU05EX1BDTSAmJiBFWFBFUklNRU5UQUwKKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZ2VuZXJpYyBkcml2ZXIgZm9yIHRoZSBzb3VuZGJ1cworCXN1cHBvcnQgb24gQXBwbGUgbWFjaGluZXMuCisJCisJSXQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzb3VuZCBidXMgaW1wbGVtZW50YXRpb25zLgorCitjb25maWcgU05EX0FPQV9TT1VOREJVU19JMlMKKwl0cmlzdGF0ZSAiSTJTIGJ1cyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU05EX0FPQV9TT1VOREJVUyAmJiBQQ0kKKwktLS1oZWxwLS0tCisJVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBBcHBsZSBJMlMgYnVzc2VzLgpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL01ha2VmaWxlIGIvc291bmQvYW9hL3NvdW5kYnVzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjFmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2Evc291bmRidXMvTWFrZWZpbGUKQEAgLTAsMCArMSwzIEBACitvYmotJChDT05GSUdfU05EX0FPQV9TT1VOREJVUykgKz0gc25kLWFvYS1zb3VuZGJ1cy5vCitzbmQtYW9hLXNvdW5kYnVzLW9ianMgOj0gY29yZS5vIHN5c2ZzLm8KK29iai0kKENPTkZJR19TTkRfQU9BX1NPVU5EQlVTX0kyUykgKz0gaTJzYnVzLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2NvcmUuYyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODRhNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9jb3JlLmMKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBzb3VuZGJ1cworICoKKyAqIENvcHlyaWdodCAyMDA2IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogR1BMIHYyLCBjYW4gYmUgZm91bmQgaW4gQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAic291bmRidXMuaCIKKworTU9EVUxFX0FVVEhPUigiSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQXBwbGUgU291bmRidXMiKTsKKworc3RydWN0IHNvdW5kYnVzX2RldiAqc291bmRidXNfZGV2X2dldChzdHJ1Y3Qgc291bmRidXNfZGV2ICpkZXYpCit7CisJc3RydWN0IGRldmljZSAqdG1wOworCisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCXRtcCA9IGdldF9kZXZpY2UoJmRldi0+b2ZkZXYuZGV2KTsKKwlpZiAodG1wKQorCQlyZXR1cm4gdG9fc291bmRidXNfZGV2aWNlKHRtcCk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvdW5kYnVzX2Rldl9nZXQpOworCit2b2lkIHNvdW5kYnVzX2Rldl9wdXQoc3RydWN0IHNvdW5kYnVzX2RldiAqZGV2KQoreworCWlmIChkZXYpCisJCXB1dF9kZXZpY2UoJmRldi0+b2ZkZXYuZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvdW5kYnVzX2Rldl9wdXQpOworCitzdGF0aWMgaW50IHNvdW5kYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgZXJyb3IgPSAtRU5PREVWOworCXN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKmRydjsKKwlzdHJ1Y3Qgc291bmRidXNfZGV2ICpzb3VuZGJ1c19kZXY7CisKKwlkcnYgPSB0b19zb3VuZGJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCXNvdW5kYnVzX2RldiA9IHRvX3NvdW5kYnVzX2RldmljZShkZXYpOworCisJaWYgKCFkcnYtPnByb2JlKQorCQlyZXR1cm4gZXJyb3I7CisKKwlzb3VuZGJ1c19kZXZfZ2V0KHNvdW5kYnVzX2Rldik7CisKKwllcnJvciA9IGRydi0+cHJvYmUoc291bmRidXNfZGV2KTsKKwlpZiAoZXJyb3IpCisJCXNvdW5kYnVzX2Rldl9wdXQoc291bmRidXNfZGV2KTsKKworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IHNvdW5kYnVzX3VldmVudChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKiplbnZwLCBpbnQgbnVtX2VudnAsCisJCQkgICBjaGFyICpidWZmZXIsIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc291bmRidXNfZGV2ICogc291bmRidXNfZGV2OworCXN0cnVjdCBvZl9kZXZpY2UgKiBvZjsKKwljaGFyICpzY3JhdGNoLCAqY29tcGF0LCAqY29tcGF0MjsKKwlpbnQgaSA9IDA7CisJaW50IGxlbmd0aCwgY3BsZW4sIGNwbGVuMiwgc2VlbiA9IDA7CisKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzb3VuZGJ1c19kZXYgPSB0b19zb3VuZGJ1c19kZXZpY2UoZGV2KTsKKwlpZiAoIXNvdW5kYnVzX2RldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlvZiA9ICZzb3VuZGJ1c19kZXYtPm9mZGV2OworCisJLyogc3R1ZmYgd2Ugd2FudCB0byBwYXNzIHRvIC9zYmluL2hvdHBsdWcgKi8KKwllbnZwW2krK10gPSBzY3JhdGNoID0gYnVmZmVyOworCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJPRl9OQU1FPSVzIiwgb2YtPm5vZGUtPm5hbWUpOworCSsrbGVuZ3RoOworCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKKwlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKwllbnZwW2krK10gPSBzY3JhdGNoOworCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJPRl9UWVBFPSVzIiwgb2YtPm5vZGUtPnR5cGUpOworCSsrbGVuZ3RoOworCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKKwlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKwkvKiBTaW5jZSB0aGUgY29tcGF0aWJsZSBmaWVsZCBjYW4gY29udGFpbiBwcmV0dHkgbXVjaCBhbnl0aGluZworCSAqIGl0J3Mgbm90IHJlYWxseSBsZWdhbCB0byBzcGxpdCBpdCBvdXQgd2l0aCBjb21tYXMuIFdlIHNwbGl0IGl0CisJICogdXAgdXNpbmcgYSBudW1iZXIgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIGluc3RlYWQuICovCisKKwljb21wYXQgPSAoY2hhciAqKSBnZXRfcHJvcGVydHkob2YtPm5vZGUsICJjb21wYXRpYmxlIiwgJmNwbGVuKTsKKwljb21wYXQyID0gY29tcGF0OworCWNwbGVuMj0gY3BsZW47CisJd2hpbGUgKGNvbXBhdCAmJiBjcGxlbiA+IDApIHsKKwkJZW52cFtpKytdID0gc2NyYXRjaDsKKwkJbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwKKwkJCQkgICAgICJPRl9DT01QQVRJQkxFXyVkPSVzIiwgc2VlbiwgY29tcGF0KTsKKwkJKytsZW5ndGg7CisJCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKKwkJaWYgKChidWZmZXJfc2l6ZSA8PSAwKSB8fCAoaSA+PSBudW1fZW52cCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc2NyYXRjaCArPSBsZW5ndGg7CisJCWxlbmd0aCA9IHN0cmxlbiAoY29tcGF0KSArIDE7CisJCWNvbXBhdCArPSBsZW5ndGg7CisJCWNwbGVuIC09IGxlbmd0aDsKKwkJc2VlbisrOworCX0KKworCWVudnBbaSsrXSA9IHNjcmF0Y2g7CisJbGVuZ3RoID0gc2NucHJpbnRmIChzY3JhdGNoLCBidWZmZXJfc2l6ZSwgIk9GX0NPTVBBVElCTEVfTj0lZCIsIHNlZW4pOworCSsrbGVuZ3RoOworCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKKwlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2NyYXRjaCArPSBsZW5ndGg7CisKKwllbnZwW2krK10gPSBzY3JhdGNoOworCWxlbmd0aCA9IHNjbnByaW50ZiAoc2NyYXRjaCwgYnVmZmVyX3NpemUsICJNT0RBTElBUz0lcyIsCisJCQlzb3VuZGJ1c19kZXYtPm1vZGFsaWFzKTsKKworCWJ1ZmZlcl9zaXplIC09IGxlbmd0aDsKKwlpZiAoKGJ1ZmZlcl9zaXplIDw9IDApIHx8IChpID49IG51bV9lbnZwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllbnZwW2ldID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvdW5kYnVzX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzb3VuZGJ1c19kZXYgKiBzb3VuZGJ1c19kZXYgPSB0b19zb3VuZGJ1c19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3Qgc291bmRidXNfZHJpdmVyICogZHJ2ID0gdG9fc291bmRidXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKworCWlmIChkZXYtPmRyaXZlciAmJiBkcnYtPnJlbW92ZSkKKwkJZHJ2LT5yZW1vdmUoc291bmRidXNfZGV2KTsKKwlzb3VuZGJ1c19kZXZfcHV0KHNvdW5kYnVzX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc291bmRidXNfZGV2aWNlX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc291bmRidXNfZGV2ICogc291bmRidXNfZGV2ID0gdG9fc291bmRidXNfZGV2aWNlKGRldik7CisJc3RydWN0IHNvdW5kYnVzX2RyaXZlciAqIGRydiA9IHRvX3NvdW5kYnVzX2RyaXZlcihkZXYtPmRyaXZlcik7CisKKwlpZiAoZGV2LT5kcml2ZXIgJiYgZHJ2LT5zaHV0ZG93bikKKwkJZHJ2LT5zaHV0ZG93bihzb3VuZGJ1c19kZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCisKK3N0YXRpYyBpbnQgc291bmRidXNfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHNvdW5kYnVzX2RldiAqIHNvdW5kYnVzX2RldiA9IHRvX3NvdW5kYnVzX2RldmljZShkZXYpOworCXN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKiBkcnYgPSB0b19zb3VuZGJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+c3VzcGVuZCkKKwkJcmV0dXJuIGRydi0+c3VzcGVuZChzb3VuZGJ1c19kZXYsIHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb3VuZGJ1c19kZXZpY2VfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKiBkZXYpCit7CisJc3RydWN0IHNvdW5kYnVzX2RldiAqIHNvdW5kYnVzX2RldiA9IHRvX3NvdW5kYnVzX2RldmljZShkZXYpOworCXN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKiBkcnYgPSB0b19zb3VuZGJ1c19kcml2ZXIoZGV2LT5kcml2ZXIpOworCisJaWYgKGRldi0+ZHJpdmVyICYmIGRydi0+cmVzdW1lKQorCQlyZXR1cm4gZHJ2LT5yZXN1bWUoc291bmRidXNfZGV2KTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitleHRlcm4gc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc291bmRidXNfZGV2X2F0dHJzW107CisKK3N0YXRpYyBzdHJ1Y3QgYnVzX3R5cGUgc291bmRidXNfYnVzX3R5cGUgPSB7CisJLm5hbWUJCT0gImFvYS1zb3VuZGJ1cyIsCisJLnByb2JlCQk9IHNvdW5kYnVzX3Byb2JlLAorCS51ZXZlbnQJCT0gc291bmRidXNfdWV2ZW50LAorCS5yZW1vdmUJCT0gc291bmRidXNfZGV2aWNlX3JlbW92ZSwKKwkuc2h1dGRvd24JPSBzb3VuZGJ1c19kZXZpY2Vfc2h1dGRvd24sCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQJPSBzb3VuZGJ1c19kZXZpY2Vfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNvdW5kYnVzX2RldmljZV9yZXN1bWUsCisjZW5kaWYKKwkuZGV2X2F0dHJzCT0gc291bmRidXNfZGV2X2F0dHJzLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc291bmRidXNfaW5pdCh2b2lkKQoreworCXJldHVybiBidXNfcmVnaXN0ZXIoJnNvdW5kYnVzX2J1c190eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNvdW5kYnVzX2V4aXQodm9pZCkKK3sKKwlidXNfdW5yZWdpc3Rlcigmc291bmRidXNfYnVzX3R5cGUpOworfQorCitpbnQgc291bmRidXNfYWRkX29uZShzdHJ1Y3Qgc291bmRidXNfZGV2ICpkZXYpCit7CisJc3RhdGljIGludCBkZXZjb3VudDsKKworCS8qIHNhbml0eSBjaGVja3MgKi8KKwlpZiAoIWRldi0+YXR0YWNoX2NvZGVjIHx8CisJICAgICFkZXYtPm9mZGV2Lm5vZGUgfHwKKwkgICAgZGV2LT5wY21uYW1lIHx8CisJICAgIGRldi0+cGNtaWQgIT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZGJ1czogYWRkaW5nIGRldmljZSBmYWlsZWQgc2FuaXR5IGNoZWNrIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNucHJpbnRmKGRldi0+b2ZkZXYuZGV2LmJ1c19pZCwgQlVTX0lEX1NJWkUsICJzb3VuZGJ1czoleCIsICsrZGV2Y291bnQpOworCWRldi0+b2ZkZXYuZGV2LmJ1cyA9ICZzb3VuZGJ1c19idXNfdHlwZTsKKwlyZXR1cm4gb2ZfZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPm9mZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvdW5kYnVzX2FkZF9vbmUpOworCit2b2lkIHNvdW5kYnVzX3JlbW92ZV9vbmUoc3RydWN0IHNvdW5kYnVzX2RldiAqZGV2KQoreworCW9mX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPm9mZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvdW5kYnVzX3JlbW92ZV9vbmUpOworCitpbnQgc291bmRidXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKmRydikKK3sKKwkvKiBpbml0aWFsaXplIGNvbW1vbiBkcml2ZXIgZmllbGRzICovCisJZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKKwlkcnYtPmRyaXZlci5idXMgPSAmc291bmRidXNfYnVzX3R5cGU7CisKKwkvKiByZWdpc3RlciB3aXRoIGNvcmUgKi8KKwlyZXR1cm4gZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzb3VuZGJ1c19yZWdpc3Rlcl9kcml2ZXIpOworCit2b2lkIHNvdW5kYnVzX3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBzb3VuZGJ1c19kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc291bmRidXNfdW5yZWdpc3Rlcl9kcml2ZXIpOworCittb2R1bGVfaW5pdChzb3VuZGJ1c19pbml0KTsKK21vZHVsZV9leGl0KHNvdW5kYnVzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9NYWtlZmlsZSBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YTVjZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvTWFrZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfU05EX0FPQV9TT1VOREJVU19JMlMpICs9IHNuZC1hb2EtaTJzYnVzLm8KK3NuZC1hb2EtaTJzYnVzLW9ianMgOj0gaTJzYnVzLWNvcmUubyBpMnNidXMtcGNtLm8gaTJzYnVzLWNvbnRyb2wubwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29udHJvbC5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29udHJvbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDQwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb250cm9sLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBpMnNidXMgZHJpdmVyIC0tIGJ1cyBjb250cm9sIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL21hY2lvLmg+CisjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX3BmdW5jLmg+CisjaW5jbHVkZSAiaTJzYnVzLmgiCisKK2ludCBpMnNidXNfY29udHJvbF9pbml0KHN0cnVjdCBtYWNpb19kZXYqIGRldiwgc3RydWN0IGkyc2J1c19jb250cm9sICoqYykKK3sKKwkqYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMnNidXNfY29udHJvbCksIEdGUF9LRVJORUwpOworCWlmICghKmMpCisJCXJldHVybiAtRU5PTUVNOworCisJSU5JVF9MSVNUX0hFQUQoJigqYyktPmxpc3QpOworCisJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LT5vZmRldi5ub2RlLCAwLCAmKCpjKS0+cnNyYykpCisJCWdvdG8gZXJyOworCS8qIHdlIHJlYWxseSBzaG91bGQgYmUgdXNpbmcgZmVhdHVyZSBjYWxscyBpbnN0ZWFkIG9mIG1hcHBpbmcKKwkgKiB0aGVzZSByZWdpc3RlcnMuIEl0J3Mgc2FmZSBmb3Igbm93IHNpbmNlIG5vIG9uZSBlbHNlIGlzCisJICogdG91Y2hpbmcgdGhlbS4uLiAqLworCSgqYyktPmNvbnRyb2xyZWdzID0gaW9yZW1hcCgoKmMpLT5yc3JjLnN0YXJ0LAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGkyc19jb250cm9sX3JlZ3MpKTsKKwlpZiAoISgqYyktPmNvbnRyb2xyZWdzKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworIGVycjoKKwlrZnJlZSgqYyk7CisJKmMgPSBOVUxMOworCXJldHVybiAtRU5PREVWOworfQorCit2b2lkIGkyc2J1c19jb250cm9sX2Rlc3Ryb3koc3RydWN0IGkyc2J1c19jb250cm9sICpjKQoreworCWlvdW5tYXAoYy0+Y29udHJvbHJlZ3MpOworCWtmcmVlKGMpOworfQorCisvKiB0aGlzIGlzIHNlcmlhbGlzZWQgZXh0ZXJuYWxseSAqLworaW50IGkyc2J1c19jb250cm9sX2FkZF9kZXYoc3RydWN0IGkyc2J1c19jb250cm9sICpjLAorCQkJICAgc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJbnAgPSBpMnNkZXYtPnNvdW5kLm9mZGV2Lm5vZGU7CisJaTJzZGV2LT5lbmFibGUgPSBwbWZfZmluZF9mdW5jdGlvbihucCwgImVuYWJsZSIpOworCWkyc2Rldi0+Y2VsbF9lbmFibGUgPSBwbWZfZmluZF9mdW5jdGlvbihucCwgImNlbGwtZW5hYmxlIik7CisJaTJzZGV2LT5jbG9ja19lbmFibGUgPSBwbWZfZmluZF9mdW5jdGlvbihucCwgImNsb2NrLWVuYWJsZSIpOworCWkyc2Rldi0+Y2VsbF9kaXNhYmxlID0gcG1mX2ZpbmRfZnVuY3Rpb24obnAsICJjZWxsLWRpc2FibGUiKTsKKwlpMnNkZXYtPmNsb2NrX2Rpc2FibGUgPSBwbWZfZmluZF9mdW5jdGlvbihucCwgImNsb2NrLWRpc2FibGUiKTsKKworCS8qIGlmIHRoZSBidXMgbnVtYmVyIGlzIG5vdCAwIG9yIDEgd2UgYWJzb2x1dGVseSBuZWVkIHRvIHVzZQorCSAqIHRoZSBwbGF0Zm9ybSBmdW5jdGlvbnMgLS0gdGhlcmUncyBub3RoaW5nIGluIERhcndpbiB0aGF0CisJICogd291bGQgYWxsb3cgc2VlaW5nIGEgc3lzdGVtIGJlaGluZCB3aGF0IHRoZSBGQ1JzIGFyZSB0aGVuLAorCSAqIGFuZCBJIGRvbid0IHdhbnQgdG8gZ28gcGFyc2luZyBhIGJ1bmNoIG9mIHBsYXRmb3JtIGZ1bmN0aW9ucworCSAqIGJ5IGhhbmQgdG8gdHJ5IGZpbmRpbmcgYSBzeXN0ZW0uLi4gKi8KKwlpZiAoaTJzZGV2LT5idXNfbnVtYmVyICE9IDAgJiYgaTJzZGV2LT5idXNfbnVtYmVyICE9IDEgJiYKKwkgICAgKCFpMnNkZXYtPmVuYWJsZSB8fAorCSAgICAgIWkyc2Rldi0+Y2VsbF9lbmFibGUgfHwgIWkyc2Rldi0+Y2xvY2tfZW5hYmxlIHx8CisJICAgICAhaTJzZGV2LT5jZWxsX2Rpc2FibGUgfHwgIWkyc2Rldi0+Y2xvY2tfZGlzYWJsZSkpIHsKKwkJcG1mX3B1dF9mdW5jdGlvbihpMnNkZXYtPmVuYWJsZSk7CisJCXBtZl9wdXRfZnVuY3Rpb24oaTJzZGV2LT5jZWxsX2VuYWJsZSk7CisJCXBtZl9wdXRfZnVuY3Rpb24oaTJzZGV2LT5jbG9ja19lbmFibGUpOworCQlwbWZfcHV0X2Z1bmN0aW9uKGkyc2Rldi0+Y2VsbF9kaXNhYmxlKTsKKwkJcG1mX3B1dF9mdW5jdGlvbihpMnNkZXYtPmNsb2NrX2Rpc2FibGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlsaXN0X2FkZCgmaTJzZGV2LT5pdGVtLCAmYy0+bGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpMnNidXNfY29udHJvbF9yZW1vdmVfZGV2KHN0cnVjdCBpMnNidXNfY29udHJvbCAqYywKKwkJCSAgICAgICBzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2KQoreworCS8qIHRoaXMgaXMgc2VyaWFsaXNlZCBleHRlcm5hbGx5ICovCisJbGlzdF9kZWwoJmkyc2Rldi0+aXRlbSk7CisJaWYgKGxpc3RfZW1wdHkoJmMtPmxpc3QpKQorCQlpMnNidXNfY29udHJvbF9kZXN0cm95KGMpOworfQorCitpbnQgaTJzYnVzX2NvbnRyb2xfZW5hYmxlKHN0cnVjdCBpMnNidXNfY29udHJvbCAqYywKKwkJCSAgc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldikKK3sKKwlzdHJ1Y3QgcG1mX2FyZ3MgYXJncyA9IHsgLmNvdW50ID0gMCB9OworCWludCBjYzsKKworCWlmIChpMnNkZXYtPmVuYWJsZSkKKwkJcmV0dXJuIHBtZl9jYWxsX29uZShpMnNkZXYtPmVuYWJsZSwgJmFyZ3MpOworCisJc3dpdGNoIChpMnNkZXYtPmJ1c19udW1iZXIpIHsKKwljYXNlIDA6CisJCWNjID0gaW5fbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCk7CisJCW91dF9sZTMyKCZjLT5jb250cm9scmVncy0+Y2VsbF9jb250cm9sLCBjYyB8IENUUkxfQ0xPQ0tfSU5URl8wX0VOQUJMRSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJY2MgPSBpbl9sZTMyKCZjLT5jb250cm9scmVncy0+Y2VsbF9jb250cm9sKTsKKwkJb3V0X2xlMzIoJmMtPmNvbnRyb2xyZWdzLT5jZWxsX2NvbnRyb2wsIGNjIHwgQ1RSTF9DTE9DS19JTlRGXzFfRU5BQkxFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaTJzYnVzX2NvbnRyb2xfY2VsbChzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmMsCisJCQlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LAorCQkJaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgcG1mX2FyZ3MgYXJncyA9IHsgLmNvdW50ID0gMCB9OworCWludCBjYzsKKworCXN3aXRjaCAoZW5hYmxlKSB7CisJY2FzZSAwOgorCQlpZiAoaTJzZGV2LT5jZWxsX2Rpc2FibGUpCisJCQlyZXR1cm4gcG1mX2NhbGxfb25lKGkyc2Rldi0+Y2VsbF9kaXNhYmxlLCAmYXJncyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKGkyc2Rldi0+Y2VsbF9lbmFibGUpCisJCQlyZXR1cm4gcG1mX2NhbGxfb25lKGkyc2Rldi0+Y2VsbF9lbmFibGUsICZhcmdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IElOVkFMSUQgQ0VMTCBFTkFCTEUgVkFMVUVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc3dpdGNoIChpMnNkZXYtPmJ1c19udW1iZXIpIHsKKwljYXNlIDA6CisJCWNjID0gaW5fbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCk7CisJCWNjICY9IH5DVFJMX0NMT0NLX0NFTExfMF9FTkFCTEU7CisJCWNjIHw9IGVuYWJsZSAqIENUUkxfQ0xPQ0tfQ0VMTF8wX0VOQUJMRTsKKwkJb3V0X2xlMzIoJmMtPmNvbnRyb2xyZWdzLT5jZWxsX2NvbnRyb2wsIGNjKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQljYyA9IGluX2xlMzIoJmMtPmNvbnRyb2xyZWdzLT5jZWxsX2NvbnRyb2wpOworCQljYyAmPSB+Q1RSTF9DTE9DS19DRUxMXzFfRU5BQkxFOworCQljYyB8PSBlbmFibGUgKiBDVFJMX0NMT0NLX0NFTExfMV9FTkFCTEU7CisJCW91dF9sZTMyKCZjLT5jb250cm9scmVncy0+Y2VsbF9jb250cm9sLCBjYyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGkyc2J1c19jb250cm9sX2Nsb2NrKHN0cnVjdCBpMnNidXNfY29udHJvbCAqYywKKwkJCSBzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LAorCQkJIGludCBlbmFibGUpCit7CisJc3RydWN0IHBtZl9hcmdzIGFyZ3MgPSB7IC5jb3VudCA9IDAgfTsKKwlpbnQgY2M7CisKKwlzd2l0Y2ggKGVuYWJsZSkgeworCWNhc2UgMDoKKwkJaWYgKGkyc2Rldi0+Y2xvY2tfZGlzYWJsZSkKKwkJCXJldHVybiBwbWZfY2FsbF9vbmUoaTJzZGV2LT5jbG9ja19kaXNhYmxlLCAmYXJncyk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaWYgKGkyc2Rldi0+Y2xvY2tfZW5hYmxlKQorCQkJcmV0dXJuIHBtZl9jYWxsX29uZShpMnNkZXYtPmNsb2NrX2VuYWJsZSwgJmFyZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgImkyc2J1czogSU5WQUxJRCBDTE9DSyBFTkFCTEUgVkFMVUVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJc3dpdGNoIChpMnNkZXYtPmJ1c19udW1iZXIpIHsKKwljYXNlIDA6CisJCWNjID0gaW5fbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCk7CisJCWNjICY9IH5DVFJMX0NMT0NLX0NMT0NLXzBfRU5BQkxFOworCQljYyB8PSBlbmFibGUgKiBDVFJMX0NMT0NLX0NMT0NLXzBfRU5BQkxFOworCQlvdXRfbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCwgY2MpOworCQlicmVhazsKKwljYXNlIDE6CisJCWNjID0gaW5fbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCk7CisJCWNjICY9IH5DVFJMX0NMT0NLX0NMT0NLXzFfRU5BQkxFOworCQljYyB8PSBlbmFibGUgKiBDVFJMX0NMT0NLX0NMT0NLXzFfRU5BQkxFOworCQlvdXRfbGUzMigmYy0+Y29udHJvbHJlZ3MtPmNlbGxfY29udHJvbCwgY2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb250cm9sLmggYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb250cm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIwNTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWNvbnRyb2wuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogaTJzYnVzIGRyaXZlciAtLSBidXMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTCB2MiwgY2FuIGJlIGZvdW5kIGluIENPUFlJTkcuCisgKi8KKyNpZm5kZWYgX19JMlNCVVNfQ09OVFJPTFJFR1NfSAorI2RlZmluZSBfX0kyU0JVU19DT05UUk9MUkVHU19ICisKKy8qIGkycyBjb250cm9sIHJlZ2lzdGVycywgYXQgbGVhc3Qgd2hhdCB3ZSBrbm93IGFib3V0IHRoZW0gKi8KKworI2RlZmluZSBfX1BBRChtLG4pIHU4IF9fcGFkIyNtW25dCisjZGVmaW5lIF9QQUQobGluZSwgbikgX19QQUQobGluZSwgbikKKyNkZWZpbmUgUEFEKG4pIF9QQUQoX19MSU5FX18sIChuKSkKK3N0cnVjdCBpMnNfY29udHJvbF9yZWdzIHsKKwlQQUQoMHgzOCk7CisJX19sZTMyIGZjcjA7CQkvKiAweDM4ICh1bmtub3duKSAqLworCV9fbGUzMiBjZWxsX2NvbnRyb2w7CS8qIDB4M2MgKGZjcjEpICovCisJX19sZTMyIGZjcjI7CQkvKiAweDQwICh1bmtub3duKSAqLworCV9fbGUzMiBmY3IzOwkJLyogMHg0NCAoZmNyMykgKi8KKwlfX2xlMzIgY2xvY2tfY29udHJvbDsJLyogMHg0OCAodW5rbm93bikgKi8KKwlQQUQoNCk7CisJLyogdG90YWwgc2l6ZTogMHg1MCBieXRlcyAqLworfSAgX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisjZGVmaW5lIENUUkxfQ0xPQ0tfQ0VMTF8wX0VOQUJMRQkoMTw8MTApCisjZGVmaW5lIENUUkxfQ0xPQ0tfQ0xPQ0tfMF9FTkFCTEUJKDE8PDEyKQorI2RlZmluZSBDVFJMX0NMT0NLX1NXUkVTRVRfMAkJKDE8PDExKQorI2RlZmluZSBDVFJMX0NMT0NLX0lOVEZfMF9FTkFCTEUJKDE8PDEzKQorCisjZGVmaW5lIENUUkxfQ0xPQ0tfQ0VMTF8xX0VOQUJMRQkoMTw8MTcpCisjZGVmaW5lIENUUkxfQ0xPQ0tfQ0xPQ0tfMV9FTkFCTEUJKDE8PDE4KQorI2RlZmluZSBDVFJMX0NMT0NLX1NXUkVTRVRfMQkJKDE8PDE5KQorI2RlZmluZSBDVFJMX0NMT0NLX0lOVEZfMV9FTkFCTEUJKDE8PDIwKQorCisjZW5kaWYgLyogX19JMlNCVVNfQ09OVFJPTFJFR1NfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjhkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1jb3JlLmMKQEAgLTAsMCArMSwzODcgQEAKKy8qCisgKiBpMnNidXMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaW8uaD4KKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlICIuLi9zb3VuZGJ1cy5oIgorI2luY2x1ZGUgImkyc2J1cy5oIgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBcHBsZSBTb3VuZGJ1czogSTJTIHN1cHBvcnQiKTsKKy8qIGZvciBhdXRvLWxvYWRpbmcsIGRlY2xhcmUgdGhhdCB3ZSBoYW5kbGUgdGhpcyB3ZWlyZAorICogc3RyaW5nIHRoYXQgbWFjaW8gcHV0cyBpbnRvIHRoZSByZWxldmFudCBkZXZpY2UgKi8KK01PRFVMRV9BTElBUygib2Y6Tmkyc1RpMnNDIik7CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGkyc2J1c19tYXRjaFtdID0geworCXsgLm5hbWUgPSAiaTJzIiB9LAorCXsgfQorfTsKKworc3RhdGljIGludCBhbGxvY19kYmRtYV9kZXNjcmlwdG9yX3Jpbmcoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwKKwkJCQkgICAgICAgc3RydWN0IGRiZG1hX2NvbW1hbmRfbWVtICpyLAorCQkJCSAgICAgICBpbnQgbnVtY21kcykKK3sKKwkvKiBvbmUgbW9yZSBmb3Igcm91bmRpbmcgKi8KKwlyLT5zaXplID0gKG51bWNtZHMrMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCk7CisJLyogV2UgdXNlIHRoZSBQQ0kgQVBJcyBmb3Igbm93IHVudGlsIHRoZSBnZW5lcmljIG9uZSBnZXRzIGZpeGVkCisJICogZW5vdWdoIG9yIHVudGlsIHdlIGdldCBzb21lIG1hY2lvLXNwZWNpZmljIHZlcnNpb25zCisJICovCisJci0+c3BhY2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoCisJCQkmbWFjaW9fZ2V0X3BjaV9kZXYoaTJzZGV2LT5tYWNpbyktPmRldiwKKwkJCXItPnNpemUsCisJCQkmci0+YnVzX2FkZHIsCisJCQlHRlBfS0VSTkVMKTsKKworCWlmICghci0+c3BhY2UpIHJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KHItPnNwYWNlLCAwLCByLT5zaXplKTsKKwlyLT5jbWRzID0gKHZvaWQqKURCRE1BX0FMSUdOKHItPnNwYWNlKTsKKwlyLT5idXNfY21kX3N0YXJ0ID0gci0+YnVzX2FkZHIgKworCQkJICAgKGRtYV9hZGRyX3QpKChjaGFyKilyLT5jbWRzIC0gKGNoYXIqKXItPnNwYWNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2RiZG1hX2Rlc2NyaXB0b3JfcmluZyhzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGJkbWFfY29tbWFuZF9tZW0gKnIpCit7CisJaWYgKCFyLT5zcGFjZSkgcmV0dXJuOworCQorCWRtYV9mcmVlX2NvaGVyZW50KCZtYWNpb19nZXRfcGNpX2RldihpMnNkZXYtPm1hY2lvKS0+ZGV2LAorCQkJICAgIHItPnNpemUsIHItPnNwYWNlLCByLT5idXNfYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGkyc2J1c19yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldjsKKwlpbnQgaTsKKworCWkyc2RldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMnNidXNfZGV2LCBzb3VuZC5vZmRldi5kZXYpOworCisgCWlmIChpMnNkZXYtPmludGZyZWdzKSBpb3VubWFwKGkyc2Rldi0+aW50ZnJlZ3MpOworIAlpZiAoaTJzZGV2LT5vdXQuZGJkbWEpIGlvdW5tYXAoaTJzZGV2LT5vdXQuZGJkbWEpOworIAlpZiAoaTJzZGV2LT5pbi5kYmRtYSkgaW91bm1hcChpMnNkZXYtPmluLmRiZG1hKTsKKwlmb3IgKGk9MDtpPDM7aSsrKQorCQlpZiAoaTJzZGV2LT5hbGxvY2F0ZWRfcmVzb3VyY2VbaV0pCisJCQlyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKGkyc2Rldi0+YWxsb2NhdGVkX3Jlc291cmNlW2ldKTsKKwlmcmVlX2RiZG1hX2Rlc2NyaXB0b3JfcmluZyhpMnNkZXYsICZpMnNkZXYtPm91dC5kYmRtYV9yaW5nKTsKKwlmcmVlX2RiZG1hX2Rlc2NyaXB0b3JfcmluZyhpMnNkZXYsICZpMnNkZXYtPmluLmRiZG1hX3JpbmcpOworCWZvciAoaT0wO2k8MztpKyspCisJCWZyZWVfaXJxKGkyc2Rldi0+aW50ZXJydXB0c1tpXSwgaTJzZGV2KTsKKwlpMnNidXNfY29udHJvbF9yZW1vdmVfZGV2KGkyc2Rldi0+Y29udHJvbCwgaTJzZGV2KTsKKwltdXRleF9kZXN0cm95KCZpMnNkZXYtPmxvY2spOworCWtmcmVlKGkyc2Rldik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpMnNidXNfYnVzX2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICpkZXYgPSBkZXZpZDsKKwl1MzIgaW50cmVnOworCisJc3Bpbl9sb2NrKCZkZXYtPmxvd19sb2NrKTsKKwlpbnRyZWcgPSBpbl9sZTMyKCZkZXYtPmludGZyZWdzLT5pbnRyX2N0bCk7CisKKwkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgcmVhc29ucyAqLworCW91dF9sZTMyKCZkZXYtPmludGZyZWdzLT5pbnRyX2N0bCwgaW50cmVnKTsKKworCXNwaW5fdW5sb2NrKCZkZXYtPmxvd19sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBmb3JjZTsKK21vZHVsZV9wYXJhbShmb3JjZSwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBsb2FkaW5nIGkyc2J1cyBldmVuIHdoZW4iCisJCQkiIG5vIGxheW91dC1pZCBwcm9wZXJ0eSBpcyBwcmVzZW50Iik7CisKKy8qIEZJWE1FOiBsb29rIGF0IGRldmljZSBub2RlIHJlZmNvdW50aW5nICovCitzdGF0aWMgaW50IGkyc2J1c19hZGRfZGV2KHN0cnVjdCBtYWNpb19kZXYgKm1hY2lvLAorCQkJICBzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmNvbnRyb2wsCisJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJc3RydWN0IGkyc2J1c19kZXYgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoaWxkID0gTlVMTCwgKnNvdW5kID0gTlVMTDsKKwlpbnQgaTsKKwlzdGF0aWMgY29uc3QgY2hhciAqcm5hbWVzW10gPSB7ICJpMnNidXM6ICVzIChjb250cm9sKSIsCisJCQkJCSJpMnNidXM6ICVzICh0eCkiLAorCQkJCQkiaTJzYnVzOiAlcyAocngpIiB9OworCXN0YXRpYyBpcnFyZXR1cm5fdCAoKmludHNbXSkoaW50IGlycSwgdm9pZCAqZGV2aWQsCisJCQkJICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykgPSB7CisJCWkyc2J1c19idXNfaW50ciwKKwkJaTJzYnVzX3R4X2ludHIsCisJCWkyc2J1c19yeF9pbnRyCisJfTsKKworCWlmIChzdHJsZW4obnAtPm5hbWUpICE9IDUpCisJCXJldHVybiAwOworCWlmIChzdHJuY21wKG5wLT5uYW1lLCAiaTJzLSIsIDQpKQorCQlyZXR1cm4gMDsKKworCWlmIChucC0+bl9pbnRycyAhPSAzKQorCQlyZXR1cm4gMDsKKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpMnNidXNfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCisJaSA9IDA7CisJd2hpbGUgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpKSB7CisJCWlmIChzdHJjbXAoY2hpbGQtPm5hbWUsICJzb3VuZCIpID09IDApIHsKKwkJCWkrKzsKKwkJCXNvdW5kID0gY2hpbGQ7CisJCX0KKwl9CisJaWYgKGkgPT0gMSkgeworCQl1MzIgKmxheW91dF9pZDsKKwkJbGF5b3V0X2lkID0gKHUzMiopIGdldF9wcm9wZXJ0eShzb3VuZCwgImxheW91dC1pZCIsIE5VTEwpOworCQlpZiAobGF5b3V0X2lkKSB7CisJCQlzbnByaW50ZihkZXYtPnNvdW5kLm1vZGFsaWFzLCAzMiwKKwkJCQkgInNvdW5kLWxheW91dC0lZCIsICpsYXlvdXRfaWQpOworCQkJZm9yY2UgPSAxOworCQl9CisJfQorCS8qIGZvciB0aGUgdGltZSBiZWluZywgdW50aWwgd2UgY2FuIGhhbmRsZSBub24tbGF5b3V0LWlkCisJICogdGhpbmdzIGluIHNvbWUgZmFicmljLCByZWZ1c2UgdG8gYXR0YWNoIGlmIHRoZXJlIGlzIG5vCisJICogbGF5b3V0LWlkIHByb3BlcnR5IG9yIHdlIGhhdmVuJ3QgYmVlbiBmb3JjZWQgdG8gYXR0YWNoLgorCSAqIFdoZW4gdGhlcmUgYXJlIHR3byBpMnMgYnVzc2VzIGFuZCBvbmx5IG9uZSBoYXMgYSBsYXlvdXQtaWQsCisJICogdGhlbiB0aGlzIGRlcGVuZHMgb24gdGhlIG9yZGVyLCBidXQgdGhhdCBpc24ndCBpbXBvcnRhbnQKKwkgKiBlaXRoZXIgYXMgdGhlIHNlY29uZCBvbmUgaW4gdGhhdCBjYXNlIGlzIGp1c3QgYSBtb2RlbS4gKi8KKwlpZiAoIWZvcmNlKSB7CisJCWtmcmVlKGRldik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW11dGV4X2luaXQoJmRldi0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG93X2xvY2spOworCWRldi0+c291bmQub2ZkZXYubm9kZSA9IG5wOworCWRldi0+c291bmQub2ZkZXYuZG1hX21hc2sgPSBtYWNpby0+b2ZkZXYuZG1hX21hc2s7CisJZGV2LT5zb3VuZC5vZmRldi5kZXYuZG1hX21hc2sgPSAmZGV2LT5zb3VuZC5vZmRldi5kbWFfbWFzazsKKwlkZXYtPnNvdW5kLm9mZGV2LmRldi5wYXJlbnQgPSAmbWFjaW8tPm9mZGV2LmRldjsKKwlkZXYtPnNvdW5kLm9mZGV2LmRldi5yZWxlYXNlID0gaTJzYnVzX3JlbGVhc2VfZGV2OworCWRldi0+c291bmQuYXR0YWNoX2NvZGVjID0gaTJzYnVzX2F0dGFjaF9jb2RlYzsKKwlkZXYtPnNvdW5kLmRldGFjaF9jb2RlYyA9IGkyc2J1c19kZXRhY2hfY29kZWM7CisJZGV2LT5zb3VuZC5wY21pZCA9IC0xOworCWRldi0+bWFjaW8gPSBtYWNpbzsKKwlkZXYtPmNvbnRyb2wgPSBjb250cm9sOworCWRldi0+YnVzX251bWJlciA9IG5wLT5uYW1lWzRdIC0gJ2EnOworCUlOSVRfTElTVF9IRUFEKCZkZXYtPnNvdW5kLmNvZGVjX2xpc3QpOworCisJZm9yIChpPTA7aTwzO2krKykgeworCQlkZXYtPmludGVycnVwdHNbaV0gPSAtMTsKKwkJc25wcmludGYoZGV2LT5ybmFtZXNbaV0sIHNpemVvZihkZXYtPnJuYW1lc1tpXSksIHJuYW1lc1tpXSwgbnAtPm5hbWUpOworCX0KKwlmb3IgKGk9MDtpPDM7aSsrKSB7CisJCWlmIChyZXF1ZXN0X2lycShucC0+aW50cnNbaV0ubGluZSwgaW50c1tpXSwgMCwgZGV2LT5ybmFtZXNbaV0sIGRldikpCisJCQlnb3RvIGVycjsKKwkJZGV2LT5pbnRlcnJ1cHRzW2ldID0gbnAtPmludHJzW2ldLmxpbmU7CisJfQorCisJZm9yIChpPTA7aTwzO2krKykgeworCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgaSwgJmRldi0+cmVzb3VyY2VzW2ldKSkKKwkJCWdvdG8gZXJyOworCQkvKiBpZiBvbmx5IHdlIGNvdWxkIHVzZSBvdXIgcmVzb3VyY2UgZGV2LT5yZXNvdXJjZXNbaV0uLi4KKwkJICogYnV0IHJlcXVlc3RfcmVzb3VyY2UgZG9lc24ndCBrbm93IGFib3V0IHBhcmVudHMgYW5kCisJCSAqIGNvbnRhaW5lZCByZXNvdXJjZXMuLi4gKi8KKwkJZGV2LT5hbGxvY2F0ZWRfcmVzb3VyY2VbaV0gPSAKKwkJCXJlcXVlc3RfbWVtX3JlZ2lvbihkZXYtPnJlc291cmNlc1tpXS5zdGFydCwKKwkJCQkJICAgZGV2LT5yZXNvdXJjZXNbaV0uZW5kIC0KKwkJCQkJICAgZGV2LT5yZXNvdXJjZXNbaV0uc3RhcnQgKyAxLAorCQkJCQkgICBkZXYtPnJuYW1lc1tpXSk7CisJCWlmICghZGV2LT5hbGxvY2F0ZWRfcmVzb3VyY2VbaV0pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTJzYnVzOiBmYWlsZWQgdG8gY2xhaW0gcmVzb3VyY2UgJWQhXG4iLCBpKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCS8qIHNob3VsZCBkbyBzYW5pdHkgY2hlY2tpbmcgaGVyZSBhYm91dCBsZW5ndGggb2YgdGhlbSAqLworCWRldi0+aW50ZnJlZ3MgPSBpb3JlbWFwKGRldi0+cmVzb3VyY2VzWzBdLnN0YXJ0LAorCQkJCWRldi0+cmVzb3VyY2VzWzBdLmVuZC1kZXYtPnJlc291cmNlc1swXS5zdGFydCsxKTsKKwlkZXYtPm91dC5kYmRtYSA9IGlvcmVtYXAoZGV2LT5yZXNvdXJjZXNbMV0uc3RhcnQsCisJCQkgCSBkZXYtPnJlc291cmNlc1sxXS5lbmQtZGV2LT5yZXNvdXJjZXNbMV0uc3RhcnQrMSk7CisJZGV2LT5pbi5kYmRtYSA9IGlvcmVtYXAoZGV2LT5yZXNvdXJjZXNbMl0uc3RhcnQsCisJCQkJZGV2LT5yZXNvdXJjZXNbMl0uZW5kLWRldi0+cmVzb3VyY2VzWzJdLnN0YXJ0KzEpOworCWlmICghZGV2LT5pbnRmcmVncyB8fCAhZGV2LT5vdXQuZGJkbWEgfHwgIWRldi0+aW4uZGJkbWEpCisJCWdvdG8gZXJyOworCisJaWYgKGFsbG9jX2RiZG1hX2Rlc2NyaXB0b3JfcmluZyhkZXYsICZkZXYtPm91dC5kYmRtYV9yaW5nLAorCQkJCQlNQVhfREJETUFfQ09NTUFORFMpKQorCQlnb3RvIGVycjsKKwlpZiAoYWxsb2NfZGJkbWFfZGVzY3JpcHRvcl9yaW5nKGRldiwgJmRldi0+aW4uZGJkbWFfcmluZywKKwkJCQkJTUFYX0RCRE1BX0NPTU1BTkRTKSkKKwkJZ290byBlcnI7CisKKwlpZiAoaTJzYnVzX2NvbnRyb2xfYWRkX2RldihkZXYtPmNvbnRyb2wsIGRldikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IGNvbnRyb2wgbGF5ZXIgZGlkbid0IGxpa2UgYnVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKHNvdW5kYnVzX2FkZF9vbmUoJmRldi0+c291bmQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpMnNidXM6IGRldmljZSByZWdpc3RyYXRpb24gZXJyb3IhXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogZW5hYmxlIHRoaXMgY2VsbCAqLworCWkyc2J1c19jb250cm9sX2NlbGwoZGV2LT5jb250cm9sLCBkZXYsIDEpOworCWkyc2J1c19jb250cm9sX2VuYWJsZShkZXYtPmNvbnRyb2wsIGRldik7CisJaTJzYnVzX2NvbnRyb2xfY2xvY2soZGV2LT5jb250cm9sLCBkZXYsIDEpOworCisJcmV0dXJuIDE7CisgZXJyOgorCWZvciAoaT0wO2k8MztpKyspCisJCWlmIChkZXYtPmludGVycnVwdHNbaV0gIT0gLTEpCisJCQlmcmVlX2lycShkZXYtPmludGVycnVwdHNbaV0sIGRldik7CisJZnJlZV9kYmRtYV9kZXNjcmlwdG9yX3JpbmcoZGV2LCAmZGV2LT5vdXQuZGJkbWFfcmluZyk7CisJZnJlZV9kYmRtYV9kZXNjcmlwdG9yX3JpbmcoZGV2LCAmZGV2LT5pbi5kYmRtYV9yaW5nKTsKKwlpZiAoZGV2LT5pbnRmcmVncykgaW91bm1hcChkZXYtPmludGZyZWdzKTsKKwlpZiAoZGV2LT5vdXQuZGJkbWEpIGlvdW5tYXAoZGV2LT5vdXQuZGJkbWEpOworCWlmIChkZXYtPmluLmRiZG1hKSBpb3VubWFwKGRldi0+aW4uZGJkbWEpOworCWZvciAoaT0wO2k8MztpKyspCisJCWlmIChkZXYtPmFsbG9jYXRlZF9yZXNvdXJjZVtpXSkKKwkJCXJlbGVhc2VfYW5kX2ZyZWVfcmVzb3VyY2UoZGV2LT5hbGxvY2F0ZWRfcmVzb3VyY2VbaV0pOworCW11dGV4X2Rlc3Ryb3koJmRldi0+bG9jayk7CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMnNidXNfcHJvYmUoc3RydWN0IG1hY2lvX2RldiogZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKKwlpbnQgZ290ID0gMCwgZXJyOworCXN0cnVjdCBpMnNidXNfY29udHJvbCAqY29udHJvbCA9IE5VTEw7CisKKwllcnIgPSBpMnNidXNfY29udHJvbF9pbml0KGRldiwgJmNvbnRyb2wpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKCFjb250cm9sKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJzYnVzX2NvbnRyb2xfaW5pdCBBUEkgYnJlYWthZ2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl3aGlsZSAoKG5wID0gb2ZfZ2V0X25leHRfY2hpbGQoZGV2LT5vZmRldi5ub2RlLCBucCkpKSB7CisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImkyc2J1cyIpIHx8CisJCSAgICBkZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImkycy1tb2RlbSIpKSB7CisJCQlnb3QgKz0gaTJzYnVzX2FkZF9kZXYoZGV2LCBjb250cm9sLCBucCk7CisJCX0KKwl9CisKKwlpZiAoIWdvdCkgeworCQkvKiBmb3VuZCBub25lLCBjbGVhbiB1cCAqLworCQlpMnNidXNfY29udHJvbF9kZXN0cm95KGNvbnRyb2wpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YSA9IGNvbnRyb2w7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpMnNidXNfcmVtb3ZlKHN0cnVjdCBtYWNpb19kZXYqIGRldikKK3sKKwlzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmNvbnRyb2wgPSBkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGkyc2RldiwgdG1wLCAmY29udHJvbC0+bGlzdCwgaXRlbSkKKwkJc291bmRidXNfcmVtb3ZlX29uZSgmaTJzZGV2LT5zb3VuZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBpMnNidXNfc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmNvbnRyb2wgPSBkZXYtPm9mZGV2LmRldi5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWk7CisJc3RydWN0IGkyc2J1c19kZXYqIGkyc2RldjsKKwlpbnQgZXJyLCByZXQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpMnNkZXYsICZjb250cm9sLT5saXN0LCBpdGVtKSB7CisJCS8qIE5vdGlmeSBBbHNhICovCisJCWlmIChpMnNkZXYtPnNvdW5kLnBjbSkgeworCQkJLyogU3VzcGVuZCBQQ00gc3RyZWFtcyAqLworCQkJc25kX3BjbV9zdXNwZW5kX2FsbChpMnNkZXYtPnNvdW5kLnBjbSk7CisJCQkvKiBQcm9iYWJseSB1c2VsZXNzIGFzIHdlIGhhbmRsZQorCQkJICogcG93ZXIgdHJhbnNpdGlvbnMgb3Vyc2VsdmVzICovCisJCQlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGkyc2Rldi0+c291bmQucGNtLT5jYXJkLAorCQkJCQkgICAgICAgU05EUlZfQ1RMX1BPV0VSX0QzaG90KTsKKwkJfQorCQkvKiBOb3RpZnkgY29kZWNzICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2lpLCAmaTJzZGV2LT5zb3VuZC5jb2RlY19saXN0LCBsaXN0KSB7CisJCQllcnIgPSAwOworCQkJaWYgKGNpaS0+Y29kZWMtPnN1c3BlbmQpCisJCQkJZXJyID0gY2lpLT5jb2RlYy0+c3VzcGVuZChjaWksIHN0YXRlKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0ID0gZXJyOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2KiBkZXYpCit7CisJc3RydWN0IGkyc2J1c19jb250cm9sICpjb250cm9sID0gZGV2LT5vZmRldi5kZXYuZHJpdmVyX2RhdGE7CisJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOworCXN0cnVjdCBpMnNidXNfZGV2KiBpMnNkZXY7CisJaW50IGVyciwgcmV0ID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaTJzZGV2LCAmY29udHJvbC0+bGlzdCwgaXRlbSkgeworCQkvKiBOb3RpZnkgY29kZWNzIHNvIHRoZXkgY2FuIHJlLWluaXRpYWxpemUgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWksICZpMnNkZXYtPnNvdW5kLmNvZGVjX2xpc3QsIGxpc3QpIHsKKwkJCWVyciA9IDA7CisJCQlpZiAoY2lpLT5jb2RlYy0+cmVzdW1lKQorCQkJCWVyciA9IGNpaS0+Y29kZWMtPnJlc3VtZShjaWkpOworCQkJaWYgKGVycikKKwkJCQlyZXQgPSBlcnI7CisJCX0KKwkJLyogTm90aWZ5IEFsc2EgKi8KKwkJaWYgKGkyc2Rldi0+c291bmQucGNtKSB7CisJCQkvKiBTYW1lIGNvbW1lbnQgYXMgYWJvdmUsIHByb2JhYmx5IHVzZWxlc3MgKi8KKwkJCXNuZF9wb3dlcl9jaGFuZ2Vfc3RhdGUoaTJzZGV2LT5zb3VuZC5wY20tPmNhcmQsCisJCQkJCSAgICAgICBTTkRSVl9DVExfUE9XRVJfRDApOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGludCBpMnNidXNfc2h1dGRvd24oc3RydWN0IG1hY2lvX2RldiogZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1hY2lvX2RyaXZlciBpMnNidXNfZHJ2ID0geworCS5uYW1lID0gInNvdW5kYnVzLWkycyIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm1hdGNoX3RhYmxlID0gaTJzYnVzX21hdGNoLAorCS5wcm9iZSA9IGkyc2J1c19wcm9iZSwKKwkucmVtb3ZlID0gaTJzYnVzX3JlbW92ZSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IGkyc2J1c19zdXNwZW5kLAorCS5yZXN1bWUgPSBpMnNidXNfcmVzdW1lLAorI2VuZGlmCisJLnNodXRkb3duID0gaTJzYnVzX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc291bmRidXNfaTJzYnVzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbWFjaW9fcmVnaXN0ZXJfZHJpdmVyKCZpMnNidXNfZHJ2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNvdW5kYnVzX2kyc2J1c19leGl0KHZvaWQpCit7CisJbWFjaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmkyc2J1c19kcnYpOworfQorCittb2R1bGVfaW5pdChzb3VuZGJ1c19pMnNidXNfaW5pdCk7Cittb2R1bGVfZXhpdChzb3VuZGJ1c19pMnNidXNfZXhpdCk7CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1pbnRlcmZhY2UuaCBiL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvaTJzYnVzLWludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YjVmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1pbnRlcmZhY2UuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGkyc2J1cyBkcml2ZXIgLS0gaW50ZXJmYWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisjaWZuZGVmIF9fSTJTQlVTX0lOVEVSRkFDRV9ICisjZGVmaW5lIF9fSTJTQlVTX0lOVEVSRkFDRV9ICisKKy8qIGkycyBidXMgY29udHJvbCByZWdpc3RlcnMsIGF0IGxlYXN0IHdoYXQgd2Uga25vdyBhYm91dCB0aGVtICovCisKKyNkZWZpbmUgX19QQUQobSxuKSB1OCBfX3BhZCMjbVtuXQorI2RlZmluZSBfUEFEKGxpbmUsIG4pIF9fUEFEKGxpbmUsIG4pCisjZGVmaW5lIFBBRChuKSBfUEFEKF9fTElORV9fLCAobikpCitzdHJ1Y3QgaTJzX2ludGVyZmFjZV9yZWdzIHsKKwlfX2xlMzIgaW50cl9jdGw7CS8qIDB4MDAgKi8KKwlQQUQoMTIpOworCV9fbGUzMiBzZXJpYWxfZm9ybWF0OwkvKiAweDEwICovCisJUEFEKDEyKTsKKwlfX2xlMzIgY29kZWNfbXNnX291dDsJLyogMHgyMCAqLworCVBBRCgxMik7CisJX19sZTMyIGNvZGVjX21zZ19pbjsJLyogMHgzMCAqLworCVBBRCgxMik7CisJX19sZTMyIGZyYW1lX2NvdW50OwkvKiAweDQwICovCisJUEFEKDEyKTsKKwlfX2xlMzIgZnJhbWVfbWF0Y2g7CS8qIDB4NTAgKi8KKwlQQUQoMTIpOworCV9fbGUzMiBkYXRhX3dvcmRfc2l6ZXM7CS8qIDB4NjAgKi8KKwlQQUQoMTIpOworCV9fbGUzMiBwZWFrX2xldmVsX3NlbDsJLyogMHg3MCAqLworCVBBRCgxMik7CisJX19sZTMyIHBlYWtfbGV2ZWxfaW4wOwkvKiAweDgwICovCisJUEFEKDEyKTsKKwlfX2xlMzIgcGVha19sZXZlbF9pbjE7CS8qIDB4OTAgKi8KKwlQQUQoMTIpOworCS8qIHRvdGFsIHNpemU6IDB4MTAwIGJ5dGVzICovCit9ICBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKKy8qIGludGVycnVwdCByZWdpc3RlciBpcyBqdXN0IGEgYml0ZmllbGQgd2l0aAorICogaW50ZXJydXB0IGVuYWJsZSBhbmQgcGVuZGluZyBiaXRzICovCisjZGVmaW5lIEkyU19SRUdfSU5UUl9DVEwJCTB4MDAKKyMJZGVmaW5lIEkyU19JTlRfRlJBTUVfQ09VTlQJCSgxPDwzMSkKKyMJZGVmaW5lIEkyU19QRU5ESU5HX0ZSQU1FX0NPVU5UCQkoMTw8MzApCisjCWRlZmluZSBJMlNfSU5UX01FU1NBR0VfRkxBRwkJKDE8PDI5KQorIwlkZWZpbmUgSTJTX1BFTkRJTkdfTUVTU0FHRV9GTEFHCQkoMTw8MjgpCisjCWRlZmluZSBJMlNfSU5UX05FV19QRUFLCQkJKDE8PDI3KQorIwlkZWZpbmUgSTJTX1BFTkRJTkdfTkVXX1BFQUsJCSgxPDwyNikKKyMJZGVmaW5lIEkyU19JTlRfQ0xPQ0tTX1NUT1BQRUQJCSgxPDwyNSkKKyMJZGVmaW5lIEkyU19QRU5ESU5HX0NMT0NLU19TVE9QUEVECSgxPDwyNCkKKyMJZGVmaW5lIEkyU19JTlRfRVhURVJOQUxfU1lOQ19FUlJPUgkoMTw8MjMpCisjCWRlZmluZSBJMlNfUEVORElOR19FWFRFUk5BTF9TWU5DX0VSUk9SCSgxPDwyMikKKyMJZGVmaW5lIEkyU19JTlRfRVhURVJOQUxfU1lOQ19PSwkJKDE8PDIxKQorIwlkZWZpbmUgSTJTX1BFTkRJTkdfRVhURVJOQUxfU1lOQ19PSwkoMTw8MjApCisjCWRlZmluZSBJMlNfSU5UX05FV19TQU1QTEVfUkFURQkJKDE8PDE5KQorIwlkZWZpbmUgSTJTX1BFTkRJTkdfTkVXX1NBTVBMRV9SQVRFCSgxPDwxOCkKKyMJZGVmaW5lIEkyU19JTlRfU1RBVFVTX0ZMQUcJCSgxPDwxNykKKyMJZGVmaW5lIEkyU19QRU5ESU5HX1NUQVRVU19GTEFHCQkoMTw8MTYpCisKKy8qIHNlcmlhbCBmb3JtYXQgcmVnaXN0ZXIgaXMgbW9yZSBpbnRlcmVzdGluZyA6KQorICogSXQgY29udGFpbnM6CisgKiAgLSBjbG9jayBzb3VyY2UKKyAqICAtIE1DbGsgZGl2aXNvcgorICogIC0gU0NsayBkaXZpc29yCisgKiAgLSBTQ2xrIG1hc3RlciBmbGFnCisgKiAgLSBzZXJpYWwgZm9ybWF0IChzb255LCBpMnMgNjR4LCBpMnMgMzJ4LCBkYXYsIHNpbGFicykKKyAqICAtIGV4dGVybmFsIHNhbXBsZSBmcmVxdWVuY3kgaW50ZXJydXB0IChkb24ndCB1bmRlcnN0YW5kKQorICogIC0gZXh0ZXJuYWwgc2FtcGxlIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIEkyU19SRUdfU0VSSUFMX0ZPUk1BVAkJMHgxMAorLyogY2xvY2sgc291cmNlLiBZb3UgZ2V0IGVpdGhlciAxOC40MzIsIDQ1LjE1ODQgb3IgNDkuMTUyMCBNSHogKi8KKyMJZGVmaW5lIEkyU19TRl9DTE9DS19TT1VSQ0VfU0hJRlQJMzAKKyMJZGVmaW5lIEkyU19TRl9DTE9DS19TT1VSQ0VfTUFTSwkJKDM8PEkyU19TRl9DTE9DS19TT1VSQ0VfU0hJRlQpCisjCWRlZmluZSBJMlNfU0ZfQ0xPQ0tfU09VUkNFXzE4TUh6CSgwPDxJMlNfU0ZfQ0xPQ0tfU09VUkNFX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX0NMT0NLX1NPVVJDRV80NU1IegkoMTw8STJTX1NGX0NMT0NLX1NPVVJDRV9TSElGVCkKKyMJZGVmaW5lIEkyU19TRl9DTE9DS19TT1VSQ0VfNDlNSHoJKDI8PEkyU19TRl9DTE9DS19TT1VSQ0VfU0hJRlQpCisvKiBhbHNvLCBsZXQncyBkZWZpbmUgdGhlIGV4YWN0IGNsb2NrIHNwZWVkcyBoZXJlLCBpbiBIeiAqLworI2RlZmluZSBJMlNfQ0xPQ0tfU1BFRURfMThNSHoJMTg0MzIwMDAKKyNkZWZpbmUgSTJTX0NMT0NLX1NQRUVEXzQ1TUh6CTQ1MTU4NDAwCisjZGVmaW5lIEkyU19DTE9DS19TUEVFRF80OU1Iegk0OTE1MjAwMAorLyogTUNsayBpcyB0aGUgY2xvY2sgdGhhdCBkcml2ZXMgdGhlIGNvZGVjLCB1c3VhbGx5IGNhbGxlZCBpdHMgJ3N5c3RlbSBjbG9jaycuCisgKiBJdCBpcyBkZXJpdmVkIGJ5IHRha2luZyBvbmx5IGV2ZXJ5ICdkaXZpc29yJyB0aWNrIG9mIHRoZSBjbG9jay4KKyAqLworIwlkZWZpbmUgSTJTX1NGX01DTEtESVZfU0hJRlQJCTI0CisjCWRlZmluZSBJMlNfU0ZfTUNMS0RJVl9NQVNLCQkoMHgxRjw8STJTX1NGX01DTEtESVZfU0hJRlQpCisjCWRlZmluZSBJMlNfU0ZfTUNMS0RJVl8xCQkJKDB4MTQ8PEkyU19TRl9NQ0xLRElWX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX01DTEtESVZfMwkJCSgweDEzPDxJMlNfU0ZfTUNMS0RJVl9TSElGVCkKKyMJZGVmaW5lIEkyU19TRl9NQ0xLRElWXzUJCQkoMHgxMjw8STJTX1NGX01DTEtESVZfU0hJRlQpCisjCWRlZmluZSBJMlNfU0ZfTUNMS0RJVl8xNAkJKDB4MEU8PEkyU19TRl9NQ0xLRElWX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX01DTEtESVZfT1RIRVIoZGl2KQkoKChkaXYvMi0xKTw8STJTX1NGX01DTEtESVZfU0hJRlQpJkkyU19TRl9NQ0xLRElWX01BU0spCitzdGF0aWMgaW5saW5lIGludCBpMnNfc2ZfbWNsa2RpdihpbnQgZGl2LCBpbnQgKm91dCkKK3sKKwlpbnQgZDsKKworCXN3aXRjaChkaXYpIHsKKwljYXNlIDE6ICpvdXQgfD0gSTJTX1NGX01DTEtESVZfMTsgcmV0dXJuIDA7CisJY2FzZSAzOiAqb3V0IHw9IEkyU19TRl9NQ0xLRElWXzM7IHJldHVybiAwOworCWNhc2UgNTogKm91dCB8PSBJMlNfU0ZfTUNMS0RJVl81OyByZXR1cm4gMDsKKwljYXNlIDE0OiAqb3V0IHw9IEkyU19TRl9NQ0xLRElWXzE0OyByZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlpZiAoZGl2JTIpIHJldHVybiAtMTsKKwkJZCA9IGRpdi8yLTE7CisJCWlmIChkID09IDB4MTQgfHwgZCA9PSAweDEzIHx8IGQgPT0gMHgxMiB8fCBkID09IDB4MEUpCisJCQlyZXR1cm4gLTE7CisJCSpvdXQgfD0gSTJTX1NGX01DTEtESVZfT1RIRVIoZGl2KTsKKwkJcmV0dXJuIDA7CisJfQorfQorLyogU0NsayBpcyB0aGUgY2xvY2sgdGhhdCBkcml2ZXMgdGhlIGkycyB3aXJlIGJ1cy4gTm90ZSB0aGF0IGl0IGlzCisgKiBkZXJpdmVkIGZyb20gdGhlIE1DbGsgYWJvdmUgYnkgdGFraW5nIG9ubHkgZXZlcnkgJ2Rpdmlzb3InIHRpY2sKKyAqIG9mIE1DbGsuCisgKi8KKyMJZGVmaW5lIEkyU19TRl9TQ0xLRElWX1NISUZUCQkyMAorIwlkZWZpbmUgSTJTX1NGX1NDTEtESVZfTUFTSwkJKDB4Rjw8STJTX1NGX1NDTEtESVZfU0hJRlQpCisjCWRlZmluZSBJMlNfU0ZfU0NMS0RJVl8xCQkJKDg8PEkyU19TRl9TQ0xLRElWX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX1NDTEtESVZfMwkJCSg5PDxJMlNfU0ZfU0NMS0RJVl9TSElGVCkKKyMJZGVmaW5lIEkyU19TRl9TQ0xLRElWX09USEVSKGRpdikJKCgoZGl2LzItMSk8PEkyU19TRl9TQ0xLRElWX1NISUZUKSZJMlNfU0ZfU0NMS0RJVl9NQVNLKQorc3RhdGljIGlubGluZSBpbnQgaTJzX3NmX3NjbGtkaXYoaW50IGRpdiwgaW50ICpvdXQpCit7CisJaW50IGQ7CisKKwlzd2l0Y2goZGl2KSB7CisJY2FzZSAxOiAqb3V0IHw9IEkyU19TRl9TQ0xLRElWXzE7IHJldHVybiAwOworCWNhc2UgMzogKm91dCB8PSBJMlNfU0ZfU0NMS0RJVl8zOyByZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlpZiAoZGl2JTIpIHJldHVybiAtMTsKKwkJZCA9IGRpdi8yLTE7CisJCWlmIChkID09IDggfHwgZCA9PSA5KSByZXR1cm4gLTE7CisJCSpvdXQgfD0gSTJTX1NGX1NDTEtESVZfT1RIRVIoZGl2KTsKKwkJcmV0dXJuIDA7CisJfQorfQorIwlkZWZpbmUgSTJTX1NGX1NDTEtfTUFTVEVSCQkoMTw8MTkpCisvKiBzZXJpYWwgZm9ybWF0IGlzIHRoZSB3YXkgdGhlIGRhdGEgaXMgcHV0IHRvIHRoZSBpMnMgd2lyZSBidXMgKi8KKyMJZGVmaW5lIEkyU19TRl9TRVJJQUxfRk9STUFUX1NISUZUCTE2CisjCWRlZmluZSBJMlNfU0ZfU0VSSUFMX0ZPUk1BVF9NQVNLCSg3PDxJMlNfU0ZfU0VSSUFMX0ZPUk1BVF9TSElGVCkKKyMJZGVmaW5lIEkyU19TRl9TRVJJQUxfRk9STUFUX1NPTlkJKDA8PEkyU19TRl9TRVJJQUxfRk9STUFUX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX1NFUklBTF9GT1JNQVRfSTJTXzY0WAkoMTw8STJTX1NGX1NFUklBTF9GT1JNQVRfU0hJRlQpCisjCWRlZmluZSBJMlNfU0ZfU0VSSUFMX0ZPUk1BVF9JMlNfMzJYCSgyPDxJMlNfU0ZfU0VSSUFMX0ZPUk1BVF9TSElGVCkKKyMJZGVmaW5lIEkyU19TRl9TRVJJQUxfRk9STUFUX0kyU19EQVYJKDQ8PEkyU19TRl9TRVJJQUxfRk9STUFUX1NISUZUKQorIwlkZWZpbmUgSTJTX1NGX1NFUklBTF9GT1JNQVRfSTJTX1NJTEFCUwkoNTw8STJTX1NGX1NFUklBTF9GT1JNQVRfU0hJRlQpCisvKiB1bmtub3duICovCisjCWRlZmluZSBJMlNfU0ZfRVhUX1NBTVBMRV9GUkVRX0lOVF9TSElGVAkxMgorIwlkZWZpbmUgSTJTX1NGX0VYVF9TQU1QTEVfRlJFUV9JTlRfTUFTSwkoMHhGPDxJMlNfU0ZfU0FNUExFX0ZSRVFfSU5UX1NISUZUKQorLyogcHJvYmFibHkgZ2l2ZXMgZXh0ZXJuYWwgZnJlcXVlbmN5PyAqLworIwlkZWZpbmUgSTJTX1NGX0VYVF9TQU1QTEVfRlJFUV9NQVNLCTB4RkZGCisKKy8qIHVzZWQgdG8gc2VuZCBjb2RlYyBtZXNzYWdlcywgYnV0IGhvdyBpc24ndCBjbGVhciAqLworI2RlZmluZSBJMlNfUkVHX0NPREVDX01TR19PVVQJCTB4MjAKKworLyogdXNlZCB0byByZWNlaXZlIGNvZGVjIG1lc3NhZ2VzLCBidXQgaG93IGlzbid0IGNsZWFyICovCisjZGVmaW5lIEkyU19SRUdfQ09ERUNfTVNHX0lOCQkweDMwCisKKy8qIGZyYW1lIGNvdW50IHJlZyBpc24ndCBjbGVhciB0byBtZSB5ZXQsIGJ1dCBwcm9iYWJseSB1c2VmdWwgKi8KKyNkZWZpbmUgSTJTX1JFR19GUkFNRV9DT1VOVAkJMHg0MAorCisvKiBwcm9ncmFtIHRvIHNvbWUgdmFsdWUsIGFuZCBnZXQgaW50ZXJydXB0IGlmIGZyYW1lIGNvdW50IHJlYWNoZXMgaXQgKi8KKyNkZWZpbmUgSTJTX1JFR19GUkFNRV9NQVRDSAkJMHg1MAorCisvKiB0aGlzIHJlZ2lzdGVyIGRlc2NyaWJlcyBob3cgdGhlIGJ1cyB0cmFuc2ZlcnMgZGF0YSAqLworI2RlZmluZSBJMlNfUkVHX0RBVEFfV09SRF9TSVpFUwkJMHg2MAorLyogbnVtYmVyIG9mIGludGVybGVhdmVkIGlucHV0IGNoYW5uZWxzICovCisjCWRlZmluZSBJMlNfRFdTX05VTV9DSEFOTkVMU19JTl9TSElGVAkyNAorIwlkZWZpbmUgSTJTX0RXU19OVU1fQ0hBTk5FTFNfSU5fTUFTSwkoMHgxRjw8STJTX0RXU19OVU1fQ0hBTk5FTFNfSU5fU0hJRlQpCisvKiB3b3JkIHNpemUgb2YgaW5wdXQgZGF0YSAqLworIwlkZWZpbmUgSTJTX0RXU19EQVRBX0lOX1NJWkVfU0hJRlQJMTYKKyMJZGVmaW5lIEkyU19EV1NfREFUQV9JTl8xNkJJVAkJKDA8PEkyU19EV1NfREFUQV9JTl9TSVpFX1NISUZUKQorIwlkZWZpbmUgSTJTX0RXU19EQVRBX0lOXzI0QklUCQkoMzw8STJTX0RXU19EQVRBX0lOX1NJWkVfU0hJRlQpCisvKiBudW1iZXIgb2YgaW50ZXJsZWF2ZWQgb3V0cHV0IGNoYW5uZWxzICovCisjCWRlZmluZSBJMlNfRFdTX05VTV9DSEFOTkVMU19PVVRfU0hJRlQJOAorIwlkZWZpbmUgSTJTX0RXU19OVU1fQ0hBTk5FTFNfT1VUX01BU0sJKDB4MUY8PEkyU19EV1NfTlVNX0NIQU5ORUxTX09VVF9TSElGVCkKKy8qIHdvcmQgc2l6ZSBvZiBvdXRwdXQgZGF0YSAqLworIwlkZWZpbmUgSTJTX0RXU19EQVRBX09VVF9TSVpFX1NISUZUCTAKKyMJZGVmaW5lIEkyU19EV1NfREFUQV9PVVRfMTZCSVQJCSgwPDxJMlNfRFdTX0RBVEFfT1VUX1NJWkVfU0hJRlQpCisjCWRlZmluZSBJMlNfRFdTX0RBVEFfT1VUXzI0QklUCQkoMzw8STJTX0RXU19EQVRBX09VVF9TSVpFX1NISUZUKQorCisKKy8qIHVua25vd24gKi8KKyNkZWZpbmUgSTJTX1JFR19QRUFLX0xFVkVMX1NFTAkJMHg3MAorCisvKiB1bmtub3duICovCisjZGVmaW5lIEkyU19SRUdfUEVBS19MRVZFTF9JTjAJCTB4ODAKKworLyogdW5rbm93biAqLworI2RlZmluZSBJMlNfUkVHX1BFQUtfTEVWRUxfSU4xCQkweDkwCisKKyNlbmRpZiAvKiBfX0kyU0JVU19JTlRFUkZBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtcGNtLmMgYi9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQ5MDE1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMtcGNtLmMKQEAgLTAsMCArMSwxMDIxIEBACisvKgorICogaTJzYnVzIGRyaXZlciAtLSBwY20gcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgorICoKKyAqIEdQTCB2MiwgY2FuIGJlIGZvdW5kIGluIENPUFlJTkcuCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisvKiBTbyBhcHBhcmVudGx5IHRoZXJlJ3MgYSByZWFzb24gZm9yIHJlcXVpcmluZyBkcml2ZXIuaAorICogdG8gYmUgaW5jbHVkZWQgZmlyc3QsIGV2ZW4gaWYgSSBkb24ndCBrbm93IGl0Li4uICovCisjaW5jbHVkZSA8c291bmQvZHJpdmVyLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgIi4uL3NvdW5kYnVzLmgiCisjaW5jbHVkZSAiaTJzYnVzLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGNtX2luZm8oc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwgaW50IGluLAorCQkJCXN0cnVjdCBwY21faW5mbyAqKnBpLCBzdHJ1Y3QgcGNtX2luZm8gKipvdGhlcikKK3sKKwlpZiAoaW4pIHsKKwkJaWYgKHBpKQorCQkJKnBpID0gJmkyc2Rldi0+aW47CisJCWlmIChvdGhlcikKKwkJCSpvdGhlciA9ICZpMnNkZXYtPm91dDsKKwl9IGVsc2UgeworCQlpZiAocGkpCisJCQkqcGkgPSAmaTJzZGV2LT5vdXQ7CisJCWlmIChvdGhlcikKKwkJCSpvdGhlciA9ICZpMnNkZXYtPmluOworCX0KK30KKworc3RhdGljIGludCBjbG9ja19hbmRfZGl2aXNvcnMoaW50IG1jbGssIGludCBzY2xrLCBpbnQgcmF0ZSwgaW50ICpvdXQpCit7CisJLyogc2NsayBtdXN0IGJlIGRlcml2ZWQgZnJvbSBtY2xrISAqLworCWlmIChtY2xrICUgc2NsaykKKwkJcmV0dXJuIC0xOworCS8qIGRlcml2ZSBzY2xrIHJlZ2lzdGVyIHZhbHVlICovCisJaWYgKGkyc19zZl9zY2xrZGl2KG1jbGsgLyBzY2xrLCBvdXQpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoSTJTX0NMT0NLX1NQRUVEXzE4TUh6ICUgKHJhdGUgKiBtY2xrKSA9PSAwKSB7CisJCWlmICghaTJzX3NmX21jbGtkaXYoSTJTX0NMT0NLX1NQRUVEXzE4TUh6IC8gKHJhdGUgKiBtY2xrKSwgb3V0KSkgeworCQkJKm91dCB8PSBJMlNfU0ZfQ0xPQ0tfU09VUkNFXzE4TUh6OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKEkyU19DTE9DS19TUEVFRF80NU1IeiAlIChyYXRlICogbWNsaykgPT0gMCkgeworCQlpZiAoIWkyc19zZl9tY2xrZGl2KEkyU19DTE9DS19TUEVFRF80NU1IeiAvIChyYXRlICogbWNsayksIG91dCkpIHsKKwkJCSpvdXQgfD0gSTJTX1NGX0NMT0NLX1NPVVJDRV80NU1IejsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChJMlNfQ0xPQ0tfU1BFRURfNDlNSHogJSAocmF0ZSAqIG1jbGspID09IDApIHsKKwkJaWYgKCFpMnNfc2ZfbWNsa2RpdihJMlNfQ0xPQ0tfU1BFRURfNDlNSHogLyAocmF0ZSAqIG1jbGspLCBvdXQpKSB7CisJCQkqb3V0IHw9IEkyU19TRl9DTE9DS19TT1VSQ0VfNDlNSHo7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfUkFURShyYXRlKQkJCQkJCVwKKwlkbyB7IGlmIChyYXRlcyAmIFNORFJWX1BDTV9SQVRFXyAjI3JhdGUpIHsJCQlcCisJCWludCBkdW1teTsJCQkJCQlcCisJCWlmIChjbG9ja19hbmRfZGl2aXNvcnMoc3lzY2xvY2tfZmFjdG9yLAkJCVwKKwkJCQkgICAgICAgYnVzX2ZhY3RvciwgcmF0ZSwgJmR1bW15KSkJXAorCQkJcmF0ZXMgJj0gflNORFJWX1BDTV9SQVRFXyAjI3JhdGU7CQlcCisJfSB9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IGkyc2J1c19wY21fb3BlbihzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4pCit7CisJc3RydWN0IHBjbV9pbmZvICpwaSwgKm90aGVyOworCXN0cnVjdCBzb3VuZGJ1c19kZXYgKnNkZXY7CisJaW50IG1hc2tzX2luaXRlZCA9IDAsIGVycjsKKwlzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksICpyZXY7CisJc3RydWN0IHNuZF9wY21faGFyZHdhcmUgKmh3OworCXU2NCBmb3JtYXRzID0gMDsKKwl1bnNpZ25lZCBpbnQgcmF0ZXMgPSAwOworCXN0cnVjdCB0cmFuc2Zlcl9pbmZvIHY7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGJ1c19mYWN0b3IgPSAwLCBzeXNjbG9ja19mYWN0b3IgPSAwOworCWludCBmb3VuZF90aGlzOworCisJbXV0ZXhfbG9jaygmaTJzZGV2LT5sb2NrKTsKKworCWdldF9wY21faW5mbyhpMnNkZXYsIGluLCAmcGksICZvdGhlcik7CisKKwlodyA9ICZwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5odzsKKwlzZGV2ID0gJmkyc2Rldi0+c291bmQ7CisKKwlpZiAocGktPmFjdGl2ZSkgeworCQkvKiBhbHNhIG1lc3NlZCB1cCAqLworCQlyZXN1bHQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiB3ZSBub3cgbmVlZCB0byBhc3NpZ24gdGhlIGh3ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWksICZzZGV2LT5jb2RlY19saXN0LCBsaXN0KSB7CisJCXN0cnVjdCB0cmFuc2Zlcl9pbmZvICp0aSA9IGNpaS0+Y29kZWMtPnRyYW5zZmVyczsKKwkJYnVzX2ZhY3RvciA9IGNpaS0+Y29kZWMtPmJ1c19mYWN0b3I7CisJCXN5c2Nsb2NrX2ZhY3RvciA9IGNpaS0+Y29kZWMtPnN5c2Nsb2NrX2ZhY3RvcjsKKwkJd2hpbGUgKHRpLT5mb3JtYXRzICYmIHRpLT5yYXRlcykgeworCQkJdiA9ICp0aTsKKwkJCWlmICh0aS0+dHJhbnNmZXJfaW4gPT0gaW4KKwkJCSAgICAmJiBjaWktPmNvZGVjLT51c2FibGUoY2lpLCB0aSwgJnYpKSB7CisJCQkJaWYgKG1hc2tzX2luaXRlZCkgeworCQkJCQlmb3JtYXRzICY9IHYuZm9ybWF0czsKKwkJCQkJcmF0ZXMgJj0gdi5yYXRlczsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3JtYXRzID0gdi5mb3JtYXRzOworCQkJCQlyYXRlcyA9IHYucmF0ZXM7CisJCQkJCW1hc2tzX2luaXRlZCA9IDE7CisJCQkJfQorCQkJfQorCQkJdGkrKzsKKwkJfQorCX0KKwlpZiAoIW1hc2tzX2luaXRlZCB8fCAhYnVzX2ZhY3RvciB8fCAhc3lzY2xvY2tfZmFjdG9yKSB7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJLyogYnVzIGRlcGVuZGVudCBzdHVmZiAqLworCWh3LT5pbmZvID0gU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkgICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8IFNORFJWX1BDTV9JTkZPX1JFU1VNRTsKKworCUNIRUNLX1JBVEUoNTUxMik7CisJQ0hFQ0tfUkFURSg4MDAwKTsKKwlDSEVDS19SQVRFKDExMDI1KTsKKwlDSEVDS19SQVRFKDE2MDAwKTsKKwlDSEVDS19SQVRFKDIyMDUwKTsKKwlDSEVDS19SQVRFKDMyMDAwKTsKKwlDSEVDS19SQVRFKDQ0MTAwKTsKKwlDSEVDS19SQVRFKDQ4MDAwKTsKKwlDSEVDS19SQVRFKDY0MDAwKTsKKwlDSEVDS19SQVRFKDg4MjAwKTsKKwlDSEVDS19SQVRFKDk2MDAwKTsKKwlDSEVDS19SQVRFKDE3NjQwMCk7CisJQ0hFQ0tfUkFURSgxOTIwMDApOworCWh3LT5yYXRlcyA9IHJhdGVzOworCisJLyogd2VsbC4gdGhlIGNvZGVjIG1pZ2h0IHdhbnQgMjQgYml0cyBvbmx5LCBhbmQgd2UnbGwKKwkgKiBldmVyIG9ubHkgdHJhbnNmZXIgMjQgYml0cywgYnV0IHRoZXkgYXJlIHRvcC1hbGlnbmVkIQorCSAqIFNvIGZvciBhbHNhLCB3ZSBjbGFpbSB0aGF0IHdlJ3JlIGRvaW5nIGZ1bGwgMzIgYml0CisJICogd2hpbGUgaW4gcmVhbGl0eSB3ZSdsbCBpZ25vcmUgdGhlIGxvd2VyIDggYml0cyBvZgorCSAqIHRoYXQgd2hlbiBkb2luZyBwbGF5YmFjayAodGhleSdyZSB0cmFuc2ZlcnJlZCBhcyAwCisJICogYXMgZmFyIGFzIEkga25vdywgbm8gY29kZWNzIHdlIGhhdmUgYXJlIDMyLWJpdCBjYXBhYmxlCisJICogc28gSSBjYW4ndCByZWFsbHkgdGVzdCkgYW5kIHdoZW4gZG9pbmcgcmVjb3JkaW5nIHdlJ2xsCisJICogYWx3YXlzIGhhdmUgdGhvc2UgbG93ZXIgOCBiaXRzIHJlY29yZGVkIGFzIDAgKi8KKwlpZiAoZm9ybWF0cyAmIFNORFJWX1BDTV9GTVRCSVRfUzI0X0JFKQorCQlmb3JtYXRzIHw9IFNORFJWX1BDTV9GTVRCSVRfUzMyX0JFOworCWlmIChmb3JtYXRzICYgU05EUlZfUENNX0ZNVEJJVF9VMjRfQkUpCisJCWZvcm1hdHMgfD0gU05EUlZfUENNX0ZNVEJJVF9VMzJfQkU7CisJLyogbm93IG1hc2sgb2ZmIHdoYXQgd2UgY2FuIHN1cHBvcnQuIEkgc3VwcG9zZSB3ZSBjb3VsZAorCSAqIGFsc28gc3VwcG9ydCBTMjRfM0xFIGFuZCBzb21lIHNpbWlsYXIgZm9ybWF0cywgYnV0IEkKKwkgKiBkb3VidCB0aGVyZSdzIGEgY29kZWMgdGhhdCB3b3VsZCBiZSBhYmxlIHRvIHVzZSB0aGF0LAorCSAqIHNvIHdlIGRvbid0IHN1cHBvcnQgaXQgaGVyZS4gKi8KKwlody0+Zm9ybWF0cyA9IGZvcm1hdHMgJiAoU05EUlZfUENNX0ZNVEJJVF9TMTZfQkUgfAorCQkJCSBTTkRSVl9QQ01fRk1UQklUX1UxNl9CRSB8CisJCQkJIFNORFJWX1BDTV9GTVRCSVRfUzMyX0JFIHwKKwkJCQkgU05EUlZfUENNX0ZNVEJJVF9VMzJfQkUpOworCisJLyogd2UgbmVlZCB0byBzZXQgdGhlIGhpZ2hlc3QgYW5kIGxvd2VzdCByYXRlIHBvc3NpYmxlLgorCSAqIFRoZXNlIGFyZSB0aGUgaGlnaGVzdCBhbmQgbG93ZXN0IHJhdGVzIGFsc2EgY2FuCisJICogc3VwcG9ydCBwcm9wZXJseSBpbiBpdHMgYml0ZmllbGQuCisJICogQmVsb3csIHdlJ2xsIHVzZSB0aGF0IHRvIHJlc3RyaWN0IHRvIHRoZSByYXRlCisJICogY3VycmVudGx5IGluIHVzZSAoaWYgYW55KS4gKi8KKwlody0+cmF0ZV9taW4gPSA1NTEyOworCWh3LT5yYXRlX21heCA9IDE5MjAwMDsKKwkvKiBpZiB0aGUgb3RoZXIgc3RyZWFtIGlzIGFjdGl2ZSwgdGhlbiB3ZSBjYW4gb25seQorCSAqIHN1cHBvcnQgd2hhdCBpdCBpcyBjdXJyZW50bHkgdXNpbmcuCisJICogRklYTUU6IEkgbGllZC4gVGhpcyBjb21tZW50IGlzIHdyb25nLiBXZSBjYW4gc3VwcG9ydAorCSAqIGFueXRoaW5nIHRoYXQgd29ya3Mgd2l0aCB0aGUgc2FtZSBzZXJpYWwgZm9ybWF0LCBpZS4KKwkgKiB3aGVuIHJlY29yZGluZyAyNCBiaXQgc291bmQgd2UgY2FuIHdlbGwgcGxheSAxNiBiaXQKKwkgKiBzb3VuZCBhdCB0aGUgc2FtZSB0aW1lIGlmZiB1c2luZyB0aGUgc2FtZSB0cmFuc2ZlciBtb2RlLgorCSAqLworCWlmIChvdGhlci0+YWN0aXZlKSB7CisJCS8qIEZJWE1FOiBpcyB0aGlzIGd1YXJhbnRlZWQgYnkgdGhlIGFsc2EgYXBpPyAqLworCQlody0+Zm9ybWF0cyAmPSAoMVVMTCA8PCBpMnNkZXYtPmZvcm1hdCk7CisJCS8qIHNlZSBhYm92ZSwgcmVzdHJpY3QgcmF0ZXMgdG8gdGhlIG9uZSB3ZSBhbHJlYWR5IGhhdmUgKi8KKwkJaHctPnJhdGVfbWluID0gaTJzZGV2LT5yYXRlOworCQlody0+cmF0ZV9tYXggPSBpMnNkZXYtPnJhdGU7CisJfQorCisJaHctPmNoYW5uZWxzX21pbiA9IDI7CisJaHctPmNoYW5uZWxzX21heCA9IDI7CisJLyogdGhlc2UgYXJlIHNvbWV3aGF0IGFyYml0cmFyeSAqLworCWh3LT5idWZmZXJfYnl0ZXNfbWF4ID0gMTMxMDcyOworCWh3LT5wZXJpb2RfYnl0ZXNfbWluID0gMjU2OworCWh3LT5wZXJpb2RfYnl0ZXNfbWF4ID0gMTYzODQ7CisJaHctPnBlcmlvZHNfbWluID0gMzsKKwlody0+cGVyaW9kc19tYXggPSBNQVhfREJETUFfQ09NTUFORFM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaWksICZzZGV2LT5jb2RlY19saXN0LCBsaXN0KSB7CisJCWlmIChjaWktPmNvZGVjLT5vcGVuKSB7CisJCQllcnIgPSBjaWktPmNvZGVjLT5vcGVuKGNpaSwgcGktPnN1YnN0cmVhbSk7CisJCQlpZiAoZXJyKSB7CisJCQkJcmVzdWx0ID0gZXJyOworCQkJCS8qIHVud2luZCAqLworCQkJCWZvdW5kX3RoaXMgPSAwOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShyZXYsCisJCQkJICAgICZzZGV2LT5jb2RlY19saXN0LCBsaXN0KSB7CisJCQkJCWlmIChmb3VuZF90aGlzICYmIHJldi0+Y29kZWMtPmNsb3NlKSB7CisJCQkJCQlyZXYtPmNvZGVjLT5jbG9zZShyZXYsCisJCQkJCQkJCXBpLT5zdWJzdHJlYW0pOworCQkJCQl9CisJCQkJCWlmIChyZXYgPT0gY2lpKQorCQkJCQkJZm91bmRfdGhpcyA9IDE7CisJCQkJfQorCQkJCWdvdG8gb3V0X3VubG9jazsKKwkJCX0KKwkJfQorCX0KKworIG91dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpMnNkZXYtPmxvY2spOworCXJldHVybiByZXN1bHQ7Cit9CisKKyN1bmRlZiBDSEVDS19SQVRFCisKK3N0YXRpYyBpbnQgaTJzYnVzX3BjbV9jbG9zZShzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4pCit7CisJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOworCXN0cnVjdCBwY21faW5mbyAqcGk7CisJaW50IGVyciA9IDAsIHRtcDsKKworCW11dGV4X2xvY2soJmkyc2Rldi0+bG9jayk7CisKKwlnZXRfcGNtX2luZm8oaTJzZGV2LCBpbiwgJnBpLCBOVUxMKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2lpLCAmaTJzZGV2LT5zb3VuZC5jb2RlY19saXN0LCBsaXN0KSB7CisJCWlmIChjaWktPmNvZGVjLT5jbG9zZSkgeworCQkJdG1wID0gY2lpLT5jb2RlYy0+Y2xvc2UoY2lpLCBwaS0+c3Vic3RyZWFtKTsKKwkJCWlmICh0bXApCisJCQkJZXJyID0gdG1wOworCQl9CisJfQorCisJcGktPnN1YnN0cmVhbSA9IE5VTEw7CisJcGktPmFjdGl2ZSA9IDA7CisJbXV0ZXhfdW5sb2NrKCZpMnNkZXYtPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKK30KKworc3RhdGljIGludCBpMnNidXNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX3BjbV9wcmVwYXJlKHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYsIGludCBpbikKK3sKKwkvKiB3aGVlLiBIYXJkIHdvcmsgbm93LiBUaGUgdXNlciBoYXMgc2VsZWN0ZWQgYSBiaXRyYXRlCisJICogYW5kIGJpdCBmb3JtYXQsIHNvIG5vdyB3ZSBoYXZlIHRvIHByb2dyYW0gb3VyCisJICogSTJTIGNvbnRyb2xsZXIgYXBwcm9wcmlhdGVseS4gKi8KKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBkYmRtYV9jbWQgKmNvbW1hbmQ7CisJaW50IGksIHBlcmlvZHNpemU7CisJZG1hX2FkZHJfdCBvZmZzZXQ7CisJc3RydWN0IGJ1c19pbmZvIGJpOworCXN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaTsKKwlpbnQgc2ZyID0gMDsJCS8qIHNlcmlhbCBmb3JtYXQgcmVnaXN0ZXIgKi8KKwlpbnQgZHdzID0gMDsJCS8qIGRhdGEgd29yZCBzaXplcyByZWcgKi8KKwlpbnQgaW5wdXRfMTZiaXQ7CisJc3RydWN0IHBjbV9pbmZvICpwaSwgKm90aGVyOworCWludCBjbnQ7CisJaW50IHJlc3VsdCA9IDA7CisKKwltdXRleF9sb2NrKCZpMnNkZXYtPmxvY2spOworCisJZ2V0X3BjbV9pbmZvKGkyc2RldiwgaW4sICZwaSwgJm90aGVyKTsKKworCWlmIChwaS0+ZGJkbWFfcmluZy5ydW5uaW5nKSB7CisJCXJlc3VsdCA9IC1FQlVTWTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXJ1bnRpbWUgPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lOworCXBpLT5hY3RpdmUgPSAxOworCWlmIChvdGhlci0+YWN0aXZlICYmCisJICAgICgoaTJzZGV2LT5mb3JtYXQgIT0gcnVudGltZS0+Zm9ybWF0KQorCSAgICAgfHwgKGkyc2Rldi0+cmF0ZSAhPSBydW50aW1lLT5yYXRlKSkpIHsKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWkyc2Rldi0+Zm9ybWF0ID0gcnVudGltZS0+Zm9ybWF0OworCWkyc2Rldi0+cmF0ZSA9IHJ1bnRpbWUtPnJhdGU7CisKKwlwZXJpb2RzaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHBpLT5zdWJzdHJlYW0pOworCXBpLT5jdXJyZW50X3BlcmlvZCA9IDA7CisKKwkvKiBnZW5lcmF0ZSBkYmRtYSBjb21tYW5kIHJpbmcgZmlyc3QgKi8KKwljb21tYW5kID0gcGktPmRiZG1hX3JpbmcuY21kczsKKwlvZmZzZXQgPSBydW50aW1lLT5kbWFfYWRkcjsKKwlmb3IgKGkgPSAwOyBpIDwgcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kczsKKwkgICAgIGkrKywgY29tbWFuZCsrLCBvZmZzZXQgKz0gcGVyaW9kc2l6ZSkgeworCQltZW1zZXQoY29tbWFuZCwgMCwgc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwkJY29tbWFuZC0+Y29tbWFuZCA9CisJCSAgICBjcHVfdG9fbGUxNigoaW4gPyBJTlBVVF9NT1JFIDogT1VUUFVUX01PUkUpIHwgSU5UUl9BTFdBWVMpOworCQljb21tYW5kLT5waHlfYWRkciA9IGNwdV90b19sZTMyKG9mZnNldCk7CisJCWNvbW1hbmQtPnJlcV9jb3VudCA9IGNwdV90b19sZTE2KHBlcmlvZHNpemUpOworCQljb21tYW5kLT54ZmVyX3N0YXR1cyA9IGNwdV90b19sZTE2KDApOworCX0KKwkvKiBsYXN0IG9uZSBicmFuY2hlcyBiYWNrIHRvIGZpcnN0ICovCisJY29tbWFuZC0tOworCWNvbW1hbmQtPmNvbW1hbmQgfD0gY3B1X3RvX2xlMTYoQlJfQUxXQVlTKTsKKwljb21tYW5kLT5jbWRfZGVwID0gY3B1X3RvX2xlMzIocGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7CisKKwkvKiBvaywgbGV0J3Mgc2V0IHRoZSBzZXJpYWwgZm9ybWF0IGFuZCBzdHVmZiAqLworCXN3aXRjaCAocnVudGltZS0+Zm9ybWF0KSB7CisJLyogMTYgYml0IGZvcm1hdHMgKi8KKwljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzE2X0JFOgorCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VMTZfQkU6CisJCS8qIEZJWE1FOiBpZiB3ZSBhZGQgZGlmZmVyZW50IGJ1cyBmYWN0b3JzIHdlIG5lZWQgdG8KKwkJICogZG8gbW9yZSBoZXJlISEgKi8KKwkJYmkuYnVzX2ZhY3RvciA9IDA7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY2lpLCAmaTJzZGV2LT5zb3VuZC5jb2RlY19saXN0LCBsaXN0KSB7CisJCQliaS5idXNfZmFjdG9yID0gY2lpLT5jb2RlYy0+YnVzX2ZhY3RvcjsKKwkJCWJyZWFrOworCQl9CisJCWlmICghYmkuYnVzX2ZhY3RvcikgeworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlpbnB1dF8xNmJpdCA9IDE7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMzJfQkU6CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1UzMl9CRToKKwkJLyogZm9yY2UgNjR4IGJ1cyBzcGVlZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIGNhbm5vdCBiZQorCQkgKiB0cmFuc2ZlcnJlZCBxdWlja2x5IGVub3VnaCEgKi8KKwkJYmkuYnVzX2ZhY3RvciA9IDY0OworCQlpbnB1dF8xNmJpdCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJlc3VsdCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJLyogd2UgYXNzdW1lIGFsbCBzeXNjbG9ja3MgYXJlIHRoZSBzYW1lISAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2lpLCAmaTJzZGV2LT5zb3VuZC5jb2RlY19saXN0LCBsaXN0KSB7CisJCWJpLnN5c2Nsb2NrX2ZhY3RvciA9IGNpaS0+Y29kZWMtPnN5c2Nsb2NrX2ZhY3RvcjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNsb2NrX2FuZF9kaXZpc29ycyhiaS5zeXNjbG9ja19mYWN0b3IsCisJCQkgICAgICAgYmkuYnVzX2ZhY3RvciwKKwkJCSAgICAgICBydW50aW1lLT5yYXRlLAorCQkJICAgICAgICZzZnIpIDwgMCkgeworCQlyZXN1bHQgPSAtRUlOVkFMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXN3aXRjaCAoYmkuYnVzX2ZhY3RvcikgeworCWNhc2UgMzI6CisJCXNmciB8PSBJMlNfU0ZfU0VSSUFMX0ZPUk1BVF9JMlNfMzJYOworCQlicmVhazsKKwljYXNlIDY0OgorCQlzZnIgfD0gSTJTX1NGX1NFUklBTF9GT1JNQVRfSTJTXzY0WDsKKwkJYnJlYWs7CisJfQorCS8qIEZJWE1FOiBUSElTIEFTU1VNRVMgTUFTVEVSIEFMTCBUSEUgVElNRSAqLworCXNmciB8PSBJMlNfU0ZfU0NMS19NQVNURVI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkgeworCQlpbnQgZXJyID0gMDsKKwkJaWYgKGNpaS0+Y29kZWMtPnByZXBhcmUpCisJCQllcnIgPSBjaWktPmNvZGVjLT5wcmVwYXJlKGNpaSwgJmJpLCBwaS0+c3Vic3RyZWFtKTsKKwkJaWYgKGVycikgeworCQkJcmVzdWx0ID0gZXJyOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCS8qIGNvZGVjcyBhcmUgZmluZSB3aXRoIGl0LCBzbyBzZXQgb3VyIGNsb2NrcyAqLworCWlmIChpbnB1dF8xNmJpdCkKKwkJZHdzID0JKDIgPDwgSTJTX0RXU19OVU1fQ0hBTk5FTFNfSU5fU0hJRlQpIHwKKwkJCSgyIDw8IEkyU19EV1NfTlVNX0NIQU5ORUxTX09VVF9TSElGVCkgfAorCQkJSTJTX0RXU19EQVRBX0lOXzE2QklUIHwgSTJTX0RXU19EQVRBX09VVF8xNkJJVDsKKwllbHNlCisJCWR3cyA9CSgyIDw8IEkyU19EV1NfTlVNX0NIQU5ORUxTX0lOX1NISUZUKSB8CisJCQkoMiA8PCBJMlNfRFdTX05VTV9DSEFOTkVMU19PVVRfU0hJRlQpIHwKKwkJCUkyU19EV1NfREFUQV9JTl8yNEJJVCB8IEkyU19EV1NfREFUQV9PVVRfMjRCSVQ7CisKKwkvKiBlYXJseSBleGl0IGlmIGFscmVhZHkgcHJvZ3JhbW1lZCBjb3JyZWN0bHkgKi8KKwkvKiBub3QgbG9ja2luZyB0aGVzZSBpcyBmaW5lIHNpbmNlIHdlIHRvdWNoIHRoZW0gb25seSBpbiB0aGlzIGZ1bmN0aW9uICovCisJaWYgKGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPnNlcmlhbF9mb3JtYXQpID09IHNmcgorCSAmJiBpbl9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5kYXRhX3dvcmRfc2l6ZXMpID09IGR3cykKKwkJZ290byBvdXRfdW5sb2NrOworCisJLyogbGV0J3Mgbm90aWZ5IHRoZSBjb2RlY3MgYWJvdXQgY2xvY2tzIGdvaW5nIGF3YXkuCisJICogRm9yIG5vdyB3ZSBvbmx5IGRvIG1hc3RlcmluZyBvbiB0aGUgaTJzIGNlbGwuLi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKKwkJaWYgKGNpaS0+Y29kZWMtPnN3aXRjaF9jbG9jaykKKwkJCWNpaS0+Y29kZWMtPnN3aXRjaF9jbG9jayhjaWksIENMT0NLX1NXSVRDSF9QUkVQQVJFX1NMQVZFKTsKKworCWkyc2J1c19jb250cm9sX2VuYWJsZShpMnNkZXYtPmNvbnRyb2wsIGkyc2Rldik7CisJaTJzYnVzX2NvbnRyb2xfY2VsbChpMnNkZXYtPmNvbnRyb2wsIGkyc2RldiwgMSk7CisKKwlvdXRfbGUzMigmaTJzZGV2LT5pbnRmcmVncy0+aW50cl9jdGwsIEkyU19QRU5ESU5HX0NMT0NLU19TVE9QUEVEKTsKKworCWkyc2J1c19jb250cm9sX2Nsb2NrKGkyc2Rldi0+Y29udHJvbCwgaTJzZGV2LCAwKTsKKworCW1zbGVlcCgxKTsKKworCS8qIHdhaXQgZm9yIGNsb2NrIHN0b3BwZWQuIFRoaXMgY2FuIGFwcGFyZW50bHkgdGFrZSBhIHdoaWxlLi4uICovCisJY250ID0gMTAwOworCXdoaWxlIChjbnQtLSAmJgorCSAgICAhKGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPmludHJfY3RsKSAmIEkyU19QRU5ESU5HX0NMT0NLU19TVE9QUEVEKSkgeworCQltc2xlZXAoNSk7CisJfQorCW91dF9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5pbnRyX2N0bCwgSTJTX1BFTkRJTkdfQ0xPQ0tTX1NUT1BQRUQpOworCisJLyogbm90IGxvY2tpbmcgdGhlc2UgaXMgZmluZSBzaW5jZSB3ZSB0b3VjaCB0aGVtIG9ubHkgaW4gdGhpcyBmdW5jdGlvbiAqLworCW91dF9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5zZXJpYWxfZm9ybWF0LCBzZnIpOworCW91dF9sZTMyKCZpMnNkZXYtPmludGZyZWdzLT5kYXRhX3dvcmRfc2l6ZXMsIGR3cyk7CisKKyAgICAgICAgaTJzYnVzX2NvbnRyb2xfZW5hYmxlKGkyc2Rldi0+Y29udHJvbCwgaTJzZGV2KTsKKyAgICAgICAgaTJzYnVzX2NvbnRyb2xfY2VsbChpMnNkZXYtPmNvbnRyb2wsIGkyc2RldiwgMSk7CisgICAgICAgIGkyc2J1c19jb250cm9sX2Nsb2NrKGkyc2Rldi0+Y29udHJvbCwgaTJzZGV2LCAxKTsKKwltc2xlZXAoMSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKKwkJaWYgKGNpaS0+Y29kZWMtPnN3aXRjaF9jbG9jaykKKwkJCWNpaS0+Y29kZWMtPnN3aXRjaF9jbG9jayhjaWksIENMT0NLX1NXSVRDSF9TTEFWRSk7CisKKyBvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmaTJzZGV2LT5sb2NrKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGRiZG1hX2NtZCBTVE9QX0NNRCA9IHsKKwkuY29tbWFuZCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoREJETUFfU1RPUCksCit9OworCitzdGF0aWMgaW50IGkyc2J1c19wY21fdHJpZ2dlcihzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2LCBpbnQgaW4sIGludCBjbWQpCit7CisJc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpOworCXN0cnVjdCBwY21faW5mbyAqcGk7CisJaW50IHRpbWVvdXQ7CisJc3RydWN0IGRiZG1hX2NtZCB0bXA7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMnNkZXYtPmxvd19sb2NrLCBmbGFncyk7CisKKwlnZXRfcGNtX2luZm8oaTJzZGV2LCBpbiwgJnBpLCBOVUxMKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJaWYgKHBpLT5kYmRtYV9yaW5nLnJ1bm5pbmcpIHsKKwkJCXJlc3VsdCA9IC1FQUxSRUFEWTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKKwkJCWlmIChjaWktPmNvZGVjLT5zdGFydCkKKwkJCQljaWktPmNvZGVjLT5zdGFydChjaWksIHBpLT5zdWJzdHJlYW0pOworCQlwaS0+ZGJkbWFfcmluZy5ydW5uaW5nID0gMTsKKworCQkvKiByZXNldCBkbWEgZW5naW5lICovCisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsCisJCQkgMCB8IChSVU4gfCBQQVVTRSB8IEZMVVNIIHwgV0FLRSkgPDwgMTYpOworCQl0aW1lb3V0ID0gMTAwOworCQl3aGlsZSAoaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpICYgUlVOICYmIHRpbWVvdXQtLSkKKwkJCXVkZWxheSgxKTsKKwkJaWYgKHRpbWVvdXQgPD0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHJlc2V0XG4iKTsKKwkJCXJlc3VsdCA9IC1FTlhJTzsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCS8qIHdyaXRlIGRtYSBjb21tYW5kIGJ1ZmZlciBhZGRyZXNzIHRvIHRoZSBkYmRtYSBjaGlwICovCisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7CisJCS8qIHBvc3QgUENJIHdyaXRlICovCisJCW1iKCk7CisJCSh2b2lkKWluX2xlMzIoJnBpLT5kYmRtYS0+c3RhdHVzKTsKKworCQkvKiBjaGFuZ2UgZmlyc3QgY29tbWFuZCB0byBTVE9QICovCisJCXRtcCA9ICpwaS0+ZGJkbWFfcmluZy5jbWRzOworCQkqcGktPmRiZG1hX3JpbmcuY21kcyA9IFNUT1BfQ01EOworCisJCS8qIHNldCBydW5uaW5nIHN0YXRlLCByZW1lbWJlciB0aGF0IHRoZSBmaXJzdCBjb21tYW5kIGlzIFNUT1AgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwgUlVOIHwgKFJVTiA8PCAxNikpOworCQl0aW1lb3V0ID0gMTAwOworCQkvKiB3YWl0IGZvciBTVE9QIHRvIGJlIGV4ZWN1dGVkICovCisJCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBBQ1RJVkUgJiYgdGltZW91dC0tKQorCQkJdWRlbGF5KDEpOworCQlpZiAodGltZW91dCA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImkyc2J1czogZXJyb3Igd2FpdGluZyBmb3IgZG1hIHN0b3BcbiIpOworCQkJcmVzdWx0ID0gLUVOWElPOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCS8qIGFnYWluLCB3cml0ZSBkbWEgY29tbWFuZCBidWZmZXIgYWRkcmVzcyB0byB0aGUgZGJkbWEgY2hpcCwKKwkJICogdGhpcyB0aW1lIG9mIHRoZSBmaXJzdCByZWFsIGNvbW1hbmQgKi8KKwkJKnBpLT5kYmRtYV9yaW5nLmNtZHMgPSB0bXA7CisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0ciwgcGktPmRiZG1hX3JpbmcuYnVzX2NtZF9zdGFydCk7CisJCS8qIHBvc3Qgd3JpdGUgKi8KKwkJbWIoKTsKKwkJKHZvaWQpaW5fbGUzMigmcGktPmRiZG1hLT5zdGF0dXMpOworCisJCS8qIHJlc2V0IGRtYSBlbmdpbmUgYWdhaW4gKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKKwkJCSAwIHwgKFJVTiB8IFBBVVNFIHwgRkxVU0ggfCBXQUtFKSA8PCAxNik7CisJCXRpbWVvdXQgPSAxMDA7CisJCXdoaWxlIChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBSVU4gJiYgdGltZW91dC0tKQorCQkJdWRlbGF5KDEpOworCQlpZiAodGltZW91dCA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICAgICAiaTJzYnVzOiBlcnJvciB3YWl0aW5nIGZvciBkbWEgcmVzZXRcbiIpOworCQkJcmVzdWx0ID0gLUVOWElPOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJLyogd2FrZSB1cCB0aGUgY2hpcCB3aXRoIHRoZSBuZXh0IGRlc2NyaXB0b3IgKi8KKwkJb3V0X2xlMzIoJnBpLT5kYmRtYS0+Y29udHJvbCwKKwkJCSAoUlVOIHwgV0FLRSkgfCAoKFJVTiB8IFdBS0UpIDw8IDE2KSk7CisJCS8qIGdldCB0aGUgZnJhbWUgY291bnQgICovCisJCXBpLT5mcmFtZV9jb3VudCA9IGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPmZyYW1lX2NvdW50KTsKKworCQkvKiBvZmYgeW91IGdvISAqLworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlpZiAoIXBpLT5kYmRtYV9yaW5nLnJ1bm5pbmcpIHsKKwkJCXJlc3VsdCA9IC1FQUxSRUFEWTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCS8qIHR1cm4gb2ZmIGFsbCByZWxldmFudCBiaXRzICovCisJCW91dF9sZTMyKCZwaS0+ZGJkbWEtPmNvbnRyb2wsCisJCQkgKFJVTiB8IFdBS0UgfCBGTFVTSCB8IFBBVVNFKSA8PCAxNik7CisJCXsKKwkJCS8qIEZJWE1FOiBtb3ZlIHRvIG93biBmdW5jdGlvbiAqLworCQkJaW50IHRpbWVvdXQgPSA1MDAwOworCQkJd2hpbGUgKChpbl9sZTMyKCZwaS0+ZGJkbWEtPnN0YXR1cykgJiBSVU4pCisJCQkgICAgICAgJiYgLS10aW1lb3V0ID4gMCkKKwkJCQl1ZGVsYXkoMSk7CisJCQlpZiAoIXRpbWVvdXQpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJpMnNidXM6IHRpbWVkIG91dCB0dXJuaW5nICIKKwkJCQkgICAgICAgIm9mZiBkYmRtYSBlbmdpbmUhXG4iKTsKKwkJfQorCisJCXBpLT5kYmRtYV9yaW5nLnJ1bm5pbmcgPSAwOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkKKwkJCWlmIChjaWktPmNvZGVjLT5zdG9wKQorCQkJCWNpaS0+Y29kZWMtPnN0b3AoY2lpLCBwaS0+c3Vic3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gLUVJTlZBTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJzZGV2LT5sb3dfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBpMnNidXNfcGNtX3BvaW50ZXIoc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwgaW50IGluKQoreworCXN0cnVjdCBwY21faW5mbyAqcGk7CisJdTMyIGZjOworCisJZ2V0X3BjbV9pbmZvKGkyc2RldiwgaW4sICZwaSwgTlVMTCk7CisKKwlmYyA9IGluX2xlMzIoJmkyc2Rldi0+aW50ZnJlZ3MtPmZyYW1lX2NvdW50KTsKKwlmYyA9IGZjIC0gcGktPmZyYW1lX2NvdW50OworCisJcmV0dXJuIChieXRlc190b19mcmFtZXMocGktPnN1YnN0cmVhbS0+cnVudGltZSwKKwkJCXBpLT5jdXJyZW50X3BlcmlvZCAqCisJCQlzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMocGktPnN1YnN0cmVhbSkpCisJCSsgZmMpICUgcGktPnN1YnN0cmVhbS0+cnVudGltZS0+YnVmZmVyX3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYsIGludCBpbikKK3sKKwlzdHJ1Y3QgcGNtX2luZm8gKnBpOworCXUzMiBmYzsKKwl1MzIgZGVsdGE7CisKKwlzcGluX2xvY2soJmkyc2Rldi0+bG93X2xvY2spOworCWdldF9wY21faW5mbyhpMnNkZXYsIGluLCAmcGksIE5VTEwpOworCisJaWYgKCFwaS0+ZGJkbWFfcmluZy5ydW5uaW5nKSB7CisJCS8qIHRoZXJlIHdhcyBzdGlsbCBhbiBpbnRlcnJ1cHQgcGVuZGluZworCQkgKiB3aGlsZSB3ZSBzdG9wcGVkLiBvciBtYXliZSBhbm90aGVyCisJCSAqIHByb2Nlc3NvciAobm90IHRoZSBvbmUgdGhhdCB3YXMgc3RvcHBpbmcKKwkJICogdGhlIERNQSBlbmdpbmUpIHdhcyBzcGlubmluZyBhYm92ZQorCQkgKiB3YWl0aW5nIGZvciB0aGUgbG9jay4gKi8KKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWZjID0gaW5fbGUzMigmaTJzZGV2LT5pbnRmcmVncy0+ZnJhbWVfY291bnQpOworCS8qIGEgY291bnRlciBvdmVyZmxvdyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGNhbGN1bGF0aW9uLiAqLworCWRlbHRhID0gZmMgLSBwaS0+ZnJhbWVfY291bnQ7CisKKwkvKiB1cGRhdGUgY3VycmVudF9wZXJpb2QgKi8KKwl3aGlsZSAoZGVsdGEgPj0gcGktPnN1YnN0cmVhbS0+cnVudGltZS0+cGVyaW9kX3NpemUpIHsKKwkJcGktPmN1cnJlbnRfcGVyaW9kKys7CisJCWRlbHRhID0gZGVsdGEgLSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZTsKKwl9CisKKwlpZiAodW5saWtlbHkoZGVsdGEpKSB7CisJCS8qIFNvbWUgaW50ZXJydXB0IGNhbWUgbGF0ZSwgc28gY2hlY2sgdGhlIGRiZG1hLgorCQkgKiBUaGlzIHNwZWNpYWwgY2FzZSBleGlzdHMgdG8gc3luY3Jvbml6ZSB0aGUgZnJhbWVfY291bnQgd2l0aAorCQkgKiB0aGUgZGJkbWEgdHJhbnNmZXIsIGJ1dCBpcyBoaXQgZXZlcnkgb25jZSBpbiBhIHdoaWxlLiAqLworCQlpbnQgcGVyaW9kOworCisJCXBlcmlvZCA9IChpbl9sZTMyKCZwaS0+ZGJkbWEtPmNtZHB0cikKKwkJICAgICAgICAtIHBpLT5kYmRtYV9yaW5nLmJ1c19jbWRfc3RhcnQpCisJCQkJLyBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCk7CisJCXBpLT5jdXJyZW50X3BlcmlvZCA9IHBpLT5jdXJyZW50X3BlcmlvZAorCQkJCQklIHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7CisKKwkJd2hpbGUgKHBpLT5jdXJyZW50X3BlcmlvZCAhPSBwZXJpb2QpIHsKKwkJCXBpLT5jdXJyZW50X3BlcmlvZCsrOworCQkJcGktPmN1cnJlbnRfcGVyaW9kICU9IHBpLT5zdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZHM7CisJCQkvKiBTZXQgZGVsdGEgdG8gemVybywgYXMgdGhlIGZyYW1lX2NvdW50IHZhbHVlIGlzIHRvbworCQkJICogaGlnaCAob3RoZXJ3aXNlIHRoZSBjb2RlIHBhdGggd2lsbCBub3QgYmUgZXhlY3V0ZWQpLgorCQkJICogVGhpcyBjb3JyZWN0cyB0aGUgZmFjdCB0aGF0IHRoZSBmcmFtZV9jb3VudCBpcyB0b28KKwkJCSAqIGxvdyBhdCB0aGUgYmVnaW5uaW5nIGR1ZSB0byBidWZmZXJpbmcuICovCisJCQlkZWx0YSA9IDA7CisJCX0KKwl9CisKKwlwaS0+ZnJhbWVfY291bnQgPSBmYyAtIGRlbHRhOworCXBpLT5jdXJyZW50X3BlcmlvZCAlPSBwaS0+c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2RzOworCisJc3Bpbl91bmxvY2soJmkyc2Rldi0+bG93X2xvY2spOworCS8qIG1heSBjYWxsIF90cmlnZ2VyIGFnYWluLCBoZW5jZSBuZWVkcyB0byBiZSB1bmxvY2tlZCAqLworCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQocGktPnN1YnN0cmVhbSk7CisJcmV0dXJuOworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJmkyc2Rldi0+bG93X2xvY2spOworfQorCitpcnFyZXR1cm5fdCBpMnNidXNfdHhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaGFuZGxlX2ludGVycnVwdCgoc3RydWN0IGkyc2J1c19kZXYgKilkZXZpZCwgMCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitpcnFyZXR1cm5fdCBpMnNidXNfcnhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWhhbmRsZV9pbnRlcnJ1cHQoKHN0cnVjdCBpMnNidXNfZGV2ICopZGV2aWQsIDEpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBpMnNidXNfcGxheWJhY2tfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKCFpMnNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWkyc2Rldi0+b3V0LnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwlyZXR1cm4gaTJzYnVzX3BjbV9vcGVuKGkyc2RldiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX3BsYXliYWNrX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaW50IGVycjsKKworCWlmICghaTJzZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaTJzZGV2LT5vdXQuc3Vic3RyZWFtICE9IHN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gaTJzYnVzX3BjbV9jbG9zZShpMnNkZXYsIDApOworCWlmICghZXJyKQorCQlpMnNkZXYtPm91dC5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX3BsYXliYWNrX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmICghaTJzZGV2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaTJzZGV2LT5vdXQuc3Vic3RyZWFtICE9IHN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGkyc2J1c19wY21fcHJlcGFyZShpMnNkZXYsIDApOworfQorCitzdGF0aWMgaW50IGkyc2J1c19wbGF5YmFja190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoIWkyc2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkyc2Rldi0+b3V0LnN1YnN0cmVhbSAhPSBzdWJzdHJlYW0pCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBpMnNidXNfcGNtX3RyaWdnZXIoaTJzZGV2LCAwLCBjbWQpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgaTJzYnVzX3BsYXliYWNrX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtCisJCQkJCQkgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKCFpMnNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpMnNkZXYtPm91dC5zdWJzdHJlYW0gIT0gc3Vic3RyZWFtKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaTJzYnVzX3BjbV9wb2ludGVyKGkyc2RldiwgMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgaTJzYnVzX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9CQlpMnNidXNfcGxheWJhY2tfb3BlbiwKKwkuY2xvc2UgPQlpMnNidXNfcGxheWJhY2tfY2xvc2UsCisJLmlvY3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CWkyc2J1c19od19wYXJhbXMsCisJLmh3X2ZyZWUgPQlpMnNidXNfaHdfZnJlZSwKKwkucHJlcGFyZSA9CWkyc2J1c19wbGF5YmFja19wcmVwYXJlLAorCS50cmlnZ2VyID0JaTJzYnVzX3BsYXliYWNrX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlpMnNidXNfcGxheWJhY2tfcG9pbnRlciwKK307CisKK3N0YXRpYyBpbnQgaTJzYnVzX3JlY29yZF9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoIWkyc2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaTJzZGV2LT5pbi5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJcmV0dXJuIGkyc2J1c19wY21fb3BlbihpMnNkZXYsIDEpOworfQorCitzdGF0aWMgaW50IGkyc2J1c19yZWNvcmRfY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlpbnQgZXJyOworCisJaWYgKCFpMnNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpMnNkZXYtPmluLnN1YnN0cmVhbSAhPSBzdWJzdHJlYW0pCisJCXJldHVybiAtRUlOVkFMOworCWVyciA9IGkyc2J1c19wY21fY2xvc2UoaTJzZGV2LCAxKTsKKwlpZiAoIWVycikKKwkJaTJzZGV2LT5pbi5zdWJzdHJlYW0gPSBOVUxMOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaTJzYnVzX3JlY29yZF9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwlpZiAoIWkyc2RldikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGkyc2Rldi0+aW4uc3Vic3RyZWFtICE9IHN1YnN0cmVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGkyc2J1c19wY21fcHJlcGFyZShpMnNkZXYsIDEpOworfQorCitzdGF0aWMgaW50IGkyc2J1c19yZWNvcmRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKCFpMnNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpMnNkZXYtPmluLnN1YnN0cmVhbSAhPSBzdWJzdHJlYW0pCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBpMnNidXNfcGNtX3RyaWdnZXIoaTJzZGV2LCAxLCBjbWQpOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgaTJzYnVzX3JlY29yZF9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQorCQkJCQkgICAgICAgKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJaWYgKCFpMnNkZXYpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpMnNkZXYtPmluLnN1YnN0cmVhbSAhPSBzdWJzdHJlYW0pCisJCXJldHVybiAwOworCXJldHVybiBpMnNidXNfcGNtX3BvaW50ZXIoaTJzZGV2LCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBpMnNidXNfcmVjb3JkX29wcyA9IHsKKwkub3BlbiA9CQlpMnNidXNfcmVjb3JkX29wZW4sCisJLmNsb3NlID0JaTJzYnVzX3JlY29yZF9jbG9zZSwKKwkuaW9jdGwgPQlzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zID0JaTJzYnVzX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9CWkyc2J1c19od19mcmVlLAorCS5wcmVwYXJlID0JaTJzYnVzX3JlY29yZF9wcmVwYXJlLAorCS50cmlnZ2VyID0JaTJzYnVzX3JlY29yZF90cmlnZ2VyLAorCS5wb2ludGVyID0JaTJzYnVzX3JlY29yZF9wb2ludGVyLAorfTsKKworc3RhdGljIHZvaWQgaTJzYnVzX3ByaXZhdGVfZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzbmRfcGNtX2NoaXAocGNtKTsKKwlzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpwLCAqdG1wOworCisJaTJzZGV2LT5zb3VuZC5wY20gPSBOVUxMOworCWkyc2Rldi0+b3V0LmNyZWF0ZWQgPSAwOworCWkyc2Rldi0+aW4uY3JlYXRlZCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIHRtcCwgJmkyc2Rldi0+c291bmQuY29kZWNfbGlzdCwgbGlzdCkgeworCQlwcmludGsoS0VSTl9FUlIgImkyc2J1czogYSBjb2RlYyBkaWRuJ3QgdW5yZWdpc3RlciFcbiIpOworCQlsaXN0X2RlbCgmcC0+bGlzdCk7CisJCW1vZHVsZV9wdXQocC0+Y29kZWMtPm93bmVyKTsKKwkJa2ZyZWUocCk7CisJfQorCXNvdW5kYnVzX2Rldl9wdXQoJmkyc2Rldi0+c291bmQpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCisvKiBGSVhNRTogdGhpcyBmdW5jdGlvbiBuZWVkcyBhbiBlcnJvciBoYW5kbGluZyBzdHJhdGVneSB3aXRoIGxhYmVscyAqLworaW50CitpMnNidXNfYXR0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkgICAgc3RydWN0IGNvZGVjX2luZm8gKmNpLCB2b2lkICpkYXRhKQoreworCWludCBlcnIsIGluID0gMCwgb3V0ID0gMDsKKwlzdHJ1Y3QgdHJhbnNmZXJfaW5mbyAqdG1wOworCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYgPSBzb3VuZGJ1c19kZXZfdG9faTJzYnVzX2RldihkZXYpOworCXN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaTsKKworCWlmICghZGV2LT5wY21uYW1lIHx8IGRldi0+cGNtaWQgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpMnNidXM6IHBjbSBuYW1lIGFuZCBpZCBtdXN0IGJlIHNldCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmRldi0+Y29kZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoY2lpLT5jb2RlY19kYXRhID09IGRhdGEpCisJCQlyZXR1cm4gLUVBTFJFQURZOworCX0KKworCWlmICghY2ktPnRyYW5zZmVycyB8fCAhY2ktPnRyYW5zZmVycy0+Zm9ybWF0cworCSAgICB8fCAhY2ktPnRyYW5zZmVycy0+cmF0ZXMgfHwgIWNpLT51c2FibGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2UgY3VycmVudGx5IGNvZGUgdGhlIGkycyB0cmFuc2ZlciBvbiB0aGUgY2xvY2ssIGFuZCBzdXBwb3J0IG9ubHkKKwkgKiAzMiBhbmQgNjQgKi8KKwlpZiAoY2ktPmJ1c19mYWN0b3IgIT0gMzIgJiYgY2ktPmJ1c19mYWN0b3IgIT0gNjQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogSWYgeW91IHdhbnQgdG8gZml4IHRoaXMsIHlvdSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hhdCB0cmFuc3BvcnQgaW5mb3MKKwkgKiBhcmUgdG8gYmUgdXNlZCwgd2hpY2ggY29kZWNzIHRoZXkgYmVsb25nIHRvLCBhbmQgdGhlbiBmaXggYWxsIHRoZQorCSAqIHN5c2Nsb2NrL2J1c2Nsb2NrIHN0dWZmIGFib3ZlIHRvIGRlcGVuZCBvbiB3aGljaCBpcyB1c2FibGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNpaSwgJmRldi0+Y29kZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoY2lpLT5jb2RlYy0+c3lzY2xvY2tfZmFjdG9yICE9IGNpLT5zeXNjbG9ja19mYWN0b3IpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkgICAgICAgImNhbm5vdCB5ZXQgaGFuZGxlIG11bHRpcGxlIGRpZmZlcmVudCBzeXNjbG9ja3MhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjaWktPmNvZGVjLT5idXNfZmFjdG9yICE9IGNpLT5idXNfZmFjdG9yKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJjYW5ub3QgeWV0IGhhbmRsZSBtdWx0aXBsZSBkaWZmZXJlbnQgYnVzIGNsb2NrcyFcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwl0bXAgPSBjaS0+dHJhbnNmZXJzOworCXdoaWxlICh0bXAtPmZvcm1hdHMgJiYgdG1wLT5yYXRlcykgeworCQlpZiAodG1wLT50cmFuc2Zlcl9pbikKKwkJCWluID0gMTsKKwkJZWxzZQorCQkJb3V0ID0gMTsKKwkJdG1wKys7CisJfQorCisJY2lpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNvZGVjX2luZm9faXRlbSksIEdGUF9LRVJORUwpOworCWlmICghY2lpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJpMnNidXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaWlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiB1c2UgdGhlIHByaXZhdGUgZGF0YSB0byBwb2ludCB0byB0aGUgY29kZWMgaW5mbyAqLworCWNpaS0+c2RldiA9IHNvdW5kYnVzX2Rldl9nZXQoZGV2KTsKKwljaWktPmNvZGVjID0gY2k7CisJY2lpLT5jb2RlY19kYXRhID0gZGF0YTsKKworCWlmICghY2lpLT5zZGV2KSB7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiaTJzYnVzOiBmYWlsZWQgdG8gZ2V0IHNvdW5kYnVzIGRldiByZWZlcmVuY2VcbiIpOworCQlrZnJlZShjaWkpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiaTJzYnVzOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSByZWZlcmVuY2UhXG4iKTsKKwkJc291bmRidXNfZGV2X3B1dChkZXYpOworCQlrZnJlZShjaWkpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghdHJ5X21vZHVsZV9nZXQoY2ktPm93bmVyKSkgeworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgImkyc2J1czogZmFpbGVkIHRvIGdldCBtb2R1bGUgcmVmZXJlbmNlIHRvIGNvZGVjIG93bmVyIVxuIik7CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7CisJCWtmcmVlKGNpaSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJaWYgKCFkZXYtPnBjbSkgeworCQllcnIgPSBzbmRfcGNtX25ldyhjYXJkLAorCQkJCSAgZGV2LT5wY21uYW1lLAorCQkJCSAgZGV2LT5wY21pZCwKKwkJCQkgIDAsCisJCQkJICAwLAorCQkJCSAgJmRldi0+cGNtKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgImkyc2J1czogZmFpbGVkIHRvIGNyZWF0ZSBwY21cbiIpOworCQkJa2ZyZWUoY2lpKTsKKwkJCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKKwkJCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCS8qIEFMU0EgeWV0IGFnYWluIHN1Y2tzLgorCSAqIElmIGl0IGlzIGV2ZXIgZml4ZWQsIHJlbW92ZSB0aGlzIGxpbmUuIFNlZSBiZWxvdy4gKi8KKwlvdXQgPSBpbiA9IDE7CisKKwlpZiAoIWkyc2Rldi0+b3V0LmNyZWF0ZWQgJiYgb3V0KSB7CisJCWlmIChkZXYtPnBjbS0+Y2FyZCAhPSBjYXJkKSB7CisJCQkvKiBlaD8gKi8KKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJDYW4ndCBhdHRhY2ggc2FtZSBidXMgdG8gZGlmZmVyZW50IGNhcmRzIVxuIik7CisJCQltb2R1bGVfcHV0KGNpLT5vd25lcik7CisJCQlrZnJlZShjaWkpOworCQkJc291bmRidXNfZGV2X3B1dChkZXYpOworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGVyciA9CisJCSAgICAgc25kX3BjbV9uZXdfc3RyZWFtKGRldi0+cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCAxKSkpIHsKKwkJCW1vZHVsZV9wdXQoY2ktPm93bmVyKTsKKwkJCWtmcmVlKGNpaSk7CisJCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7CisJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc25kX3BjbV9zZXRfb3BzKGRldi0+cGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAorCQkJCSZpMnNidXNfcGxheWJhY2tfb3BzKTsKKwkJaTJzZGV2LT5vdXQuY3JlYXRlZCA9IDE7CisJfQorCisJaWYgKCFpMnNkZXYtPmluLmNyZWF0ZWQgJiYgaW4pIHsKKwkJaWYgKGRldi0+cGNtLT5jYXJkICE9IGNhcmQpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJDYW4ndCBhdHRhY2ggc2FtZSBidXMgdG8gZGlmZmVyZW50IGNhcmRzIVxuIik7CisJCQltb2R1bGVfcHV0KGNpLT5vd25lcik7CisJCQlrZnJlZShjaWkpOworCQkJc291bmRidXNfZGV2X3B1dChkZXYpOworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoKGVyciA9CisJCSAgICAgc25kX3BjbV9uZXdfc3RyZWFtKGRldi0+cGNtLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIDEpKSkgeworCQkJbW9kdWxlX3B1dChjaS0+b3duZXIpOworCQkJa2ZyZWUoY2lpKTsKKwkJCXNvdW5kYnVzX2Rldl9wdXQoZGV2KTsKKwkJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzbmRfcGNtX3NldF9vcHMoZGV2LT5wY20sIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSwKKwkJCQkmaTJzYnVzX3JlY29yZF9vcHMpOworCQlpMnNkZXYtPmluLmNyZWF0ZWQgPSAxOworCX0KKworCS8qIHNvIHdlIGhhdmUgdG8gcmVnaXN0ZXIgdGhlIHBjbSBhZnRlciBhZGRpbmcgYW55IHN1YnN0cmVhbQorCSAqIHRvIGl0IGJlY2F1c2UgYWxzYSBkb2Vzbid0IGNyZWF0ZSB0aGUgZGV2aWNlcyBmb3IgdGhlCisJICogc3Vic3RyZWFtcyB3aGVuIHdlIGFkZCB0aGVtIGxhdGVyLgorCSAqIFRoZXJlZm9yZSwgZm9yY2UgaW4gYW5kIG91dCBvbiBib3RoIGJ1c3NlcyAoYWJvdmUpIGFuZAorCSAqIHJlZ2lzdGVyIHRoZSBwY20gbm93IGluc3RlYWQgb2YganVzdCBhZnRlciBjcmVhdGluZyBpdC4KKwkgKi8KKwllcnIgPSBzbmRfZGV2aWNlX3JlZ2lzdGVyKGNhcmQsIGRldi0+cGNtKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTJzYnVzOiBlcnJvciByZWdpc3RlcmluZyBuZXcgcGNtXG4iKTsKKwkJbW9kdWxlX3B1dChjaS0+b3duZXIpOworCQlrZnJlZShjaWkpOworCQlzb3VuZGJ1c19kZXZfcHV0KGRldik7CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCQlyZXR1cm4gZXJyOworCX0KKwkvKiBubyBlcnJvcnMgYW55IG1vcmUsIHNvIGxldCdzIGFkZCB0aGlzIHRvIG91ciBsaXN0ICovCisJbGlzdF9hZGQoJmNpaS0+bGlzdCwgJmRldi0+Y29kZWNfbGlzdCk7CisKKwlkZXYtPnBjbS0+cHJpdmF0ZV9kYXRhID0gaTJzZGV2OworCWRldi0+cGNtLT5wcml2YXRlX2ZyZWUgPSBpMnNidXNfcHJpdmF0ZV9mcmVlOworCisJLyogd2VsbCwgd2UgcmVhbGx5IHNob3VsZCBzdXBwb3J0IHNjYXR0ZXIvZ2F0aGVyIERNQSAqLworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwoCisJCWRldi0+cGNtLCBTTkRSVl9ETUFfVFlQRV9ERVYsCisJCXNuZF9kbWFfcGNpX2RhdGEobWFjaW9fZ2V0X3BjaV9kZXYoaTJzZGV2LT5tYWNpbykpLAorCQk2NCAqIDEwMjQsIDY0ICogMTAyNCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpMnNidXNfZGV0YWNoX2NvZGVjKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWkgPSBOVUxMLCAqaTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaSwgJmRldi0+Y29kZWNfbGlzdCwgbGlzdCkgeworCQlpZiAoaS0+Y29kZWNfZGF0YSA9PSBkYXRhKSB7CisJCQljaWkgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGNpaSkgeworCQlsaXN0X2RlbCgmY2lpLT5saXN0KTsKKwkJbW9kdWxlX3B1dChjaWktPmNvZGVjLT5vd25lcik7CisJCWtmcmVlKGNpaSk7CisJfQorCS8qIG5vIG1vcmUgY29kZWNzLCBidXQgc3RpbGwgYSBwY20/ICovCisJaWYgKGxpc3RfZW1wdHkoJmRldi0+Y29kZWNfbGlzdCkgJiYgZGV2LT5wY20pIHsKKwkJLyogdGhlIGFjdHVhbCBjbGVhbnVwIGlzIGRvbmUgYnkgdGhlIGNhbGxiYWNrIGFib3ZlISAqLworCQlzbmRfZGV2aWNlX2ZyZWUoZGV2LT5wY20tPmNhcmQsIGRldi0+cGNtKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9hb2Evc291bmRidXMvaTJzYnVzL2kyc2J1cy5oIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmE1MTYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9pMnNidXMuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIGkyc2J1cyBkcml2ZXIgLS0gcHJpdmF0ZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA2IEpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+CisgKgorICogR1BMIHYyLCBjYW4gYmUgZm91bmQgaW4gQ09QWUlORy4KKyAqLworI2lmbmRlZiBfX0kyU0JVU19ICisjZGVmaW5lIF9fSTJTQlVTX0gKKyNpbmNsdWRlIDxhc20vZGJkbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlICJpMnNidXMtaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiaTJzYnVzLWNvbnRyb2wuaCIKKyNpbmNsdWRlICIuLi9zb3VuZGJ1cy5oIgorCitzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgeworCXZvbGF0aWxlIHN0cnVjdCBpMnNfY29udHJvbF9yZWdzIF9faW9tZW0gKmNvbnRyb2xyZWdzOworCXN0cnVjdCByZXNvdXJjZSByc3JjOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgTUFYX0RCRE1BX0NPTU1BTkRTCTMyCisKK3N0cnVjdCBkYmRtYV9jb21tYW5kX21lbSB7CisJZG1hX2FkZHJfdCBidXNfYWRkcjsKKwlkbWFfYWRkcl90IGJ1c19jbWRfc3RhcnQ7CisJc3RydWN0IGRiZG1hX2NtZCAqY21kczsKKwl2b2lkICpzcGFjZTsKKwlpbnQgc2l6ZTsKKwl1MzIgcnVubmluZzoxOworfTsKKworc3RydWN0IHBjbV9pbmZvIHsKKwl1MzIgY3JlYXRlZDoxLCAvKiBoYXMgdGhpcyBkaXJlY3Rpb24gYmVlbiBjcmVhdGVkIHdpdGggYWxzYT8gKi8KKwkgICAgYWN0aXZlOjE7ICAvKiBpcyB0aGlzIHN0cmVhbSBhY3RpdmU/ICovCisJLyogcnVudGltZSBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCWludCBjdXJyZW50X3BlcmlvZDsKKwl1MzIgZnJhbWVfY291bnQ7CisJc3RydWN0IGRiZG1hX2NvbW1hbmRfbWVtIGRiZG1hX3Jpbmc7CisJdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZGJkbWE7Cit9OworCitzdHJ1Y3QgaTJzYnVzX2RldiB7CisJc3RydWN0IHNvdW5kYnVzX2RldiBzb3VuZDsKKwlzdHJ1Y3QgbWFjaW9fZGV2ICptYWNpbzsKKwlzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmNvbnRyb2w7CisJdm9sYXRpbGUgc3RydWN0IGkyc19pbnRlcmZhY2VfcmVncyBfX2lvbWVtICppbnRmcmVnczsKKworCXN0cnVjdCByZXNvdXJjZSByZXNvdXJjZXNbM107CisJc3RydWN0IHJlc291cmNlICphbGxvY2F0ZWRfcmVzb3VyY2VbM107CisJaW50IGludGVycnVwdHNbM107CisJY2hhciBybmFtZXNbM11bMzJdOworCisJLyogaW5mbyBhYm91dCBjdXJyZW50bHkgYWN0aXZlIHN1YnN0cmVhbXMgKi8KKwlzdHJ1Y3QgcGNtX2luZm8gb3V0LCBpbjsKKwlzbmRfcGNtX2Zvcm1hdF90IGZvcm1hdDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKworCS8qIGxpc3QgZm9yIGEgc2luZ2xlIGNvbnRyb2xsZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGl0ZW07CisJLyogbnVtYmVyIG9mIGJ1cyBvbiBjb250cm9sbGVyICovCisJaW50IGJ1c19udW1iZXI7CisJLyogZm9yIHVzZSBieSBjb250cm9sIGxheWVyICovCisJc3RydWN0IHBtZl9mdW5jdGlvbiAqZW5hYmxlLAorCQkJICAgICpjZWxsX2VuYWJsZSwKKwkJCSAgICAqY2VsbF9kaXNhYmxlLAorCQkJICAgICpjbG9ja19lbmFibGUsCisJCQkgICAgKmNsb2NrX2Rpc2FibGU7CisKKwkvKiBsb2NrcyAqLworCS8qIHNwaW5sb2NrIGZvciBsb3ctbGV2ZWwgaW50ZXJydXB0IGxvY2tpbmcgKi8KKwlzcGlubG9ja190IGxvd19sb2NrOworCS8qIG11dGV4IGZvciBoaWdoLWxldmVsIGNvbnNpc3RlbmN5ICovCisJc3RydWN0IG11dGV4IGxvY2s7Cit9OworCisjZGVmaW5lIHNvdW5kYnVzX2Rldl90b19pMnNidXNfZGV2KHNkZXYpIFwKKwkJY29udGFpbmVyX29mKHNkZXYsIHN0cnVjdCBpMnNidXNfZGV2LCBzb3VuZCkKKworLyogcGNtIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludAoraTJzYnVzX2F0dGFjaF9jb2RlYyhzdHJ1Y3Qgc291bmRidXNfZGV2ICpkZXYsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKKwkJICAgIHN0cnVjdCBjb2RlY19pbmZvICpjaSwgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZAoraTJzYnVzX2RldGFjaF9jb2RlYyhzdHJ1Y3Qgc291bmRidXNfZGV2ICpkZXYsIHZvaWQgKmRhdGEpOworZXh0ZXJuIGlycXJldHVybl90CitpMnNidXNfdHhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworZXh0ZXJuIGlycXJldHVybl90CitpMnNidXNfcnhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKiBjb250cm9sIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGludCBpMnNidXNfY29udHJvbF9pbml0KHN0cnVjdCBtYWNpb19kZXYqIGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKipjKTsKK2V4dGVybiB2b2lkIGkyc2J1c19jb250cm9sX2Rlc3Ryb3koc3RydWN0IGkyc2J1c19jb250cm9sICpjKTsKK2V4dGVybiBpbnQgaTJzYnVzX2NvbnRyb2xfYWRkX2RldihzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmMsCisJCQkJICBzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2KTsKK2V4dGVybiB2b2lkIGkyc2J1c19jb250cm9sX3JlbW92ZV9kZXYoc3RydWN0IGkyc2J1c19jb250cm9sICpjLAorCQkJCSAgICAgIHN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYpOworZXh0ZXJuIGludCBpMnNidXNfY29udHJvbF9lbmFibGUoc3RydWN0IGkyc2J1c19jb250cm9sICpjLAorCQkJCSBzdHJ1Y3QgaTJzYnVzX2RldiAqaTJzZGV2KTsKK2V4dGVybiBpbnQgaTJzYnVzX2NvbnRyb2xfY2VsbChzdHJ1Y3QgaTJzYnVzX2NvbnRyb2wgKmMsCisJCQkgICAgICAgc3RydWN0IGkyc2J1c19kZXYgKmkyc2RldiwKKwkJCSAgICAgICBpbnQgZW5hYmxlKTsKK2V4dGVybiBpbnQgaTJzYnVzX2NvbnRyb2xfY2xvY2soc3RydWN0IGkyc2J1c19jb250cm9sICpjLAorCQkJCXN0cnVjdCBpMnNidXNfZGV2ICppMnNkZXYsCisJCQkJaW50IGVuYWJsZSk7CisjZW5kaWYgLyogX19JMlNCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmggYi9zb3VuZC9hb2Evc291bmRidXMvc291bmRidXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI3Mjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL3NvdW5kYnVzLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBzb3VuZGJ1cyBnZW5lcmljIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDIwMDYgSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KKyAqCisgKiBHUEwgdjIsIGNhbiBiZSBmb3VuZCBpbiBDT1BZSU5HLgorICovCisjaWZuZGVmIF9fU09VTkRCVVNfSAorI2RlZmluZSBfX1NPVU5EQlVTX0gKKworI2luY2x1ZGUgPGFzbS9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKworLyogV2hlbiBzd2l0Y2hpbmcgZnJvbSBtYXN0ZXIgdG8gc2xhdmUgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsCisgKiB5b3UgZG9uJ3Qgd2FudCB0byBoYXZlIHRoZSBjb2RlYyBjaGlwIGFjdGluZyBhcyBjbG9jayBzb3VyY2UKKyAqIHdoaWxlIHRoZSBidXMgc3RpbGwgaXMuCisgKiBNb3JlIGltcG9ydGFudGx5LCB3aGlsZSBzd2l0Y2ggZnJvbSBzbGF2ZSB0byBtYXN0ZXIsIHlvdSBuZWVkCisgKiB0byB0dXJuIG9mZiB0aGUgY2hpcCdzIG1hc3RlciBmdW5jdGlvbiBmaXJzdCwgYnV0IHRoZW4gdGhlcmUncworICogbm8gY2xvY2sgZm9yIGEgd2hpbGUgYW5kIG90aGVyIGNoaXBzIG1pZ2h0IHJlc2V0LCBzbyB3ZSBub3RpZnkKKyAqIHRoZWlyIGRyaXZlcnMgYWZ0ZXIgaGF2aW5nIHN3aXRjaGVkLgorICogVGhlIGNvbnN0YW50cyBoZXJlIGFyZSBjb2RlYy1wb2ludCBvZiB2aWV3LCBzbyB3aGVuIHdlIHN3aXRjaAorICogdGhlIHNvdW5kYnVzIHRvIG1hc3RlciB3ZSB0ZWxsIHRoZSBjb2RlYyB3ZSdyZSBnb2luZyB0byBzd2l0Y2gKKyAqIGFuZCBnaXZlIGl0IENMT0NLX1NXSVRDSF9QUkVQQVJFX1NMQVZFIQorICovCitlbnVtIGNsb2NrX3N3aXRjaCB7CisJQ0xPQ0tfU1dJVENIX1BSRVBBUkVfU0xBVkUsCisJQ0xPQ0tfU1dJVENIX1BSRVBBUkVfTUFTVEVSLAorCUNMT0NLX1NXSVRDSF9TTEFWRSwKKwlDTE9DS19TV0lUQ0hfTUFTVEVSLAorCUNMT0NLX1NXSVRDSF9OT1RJRlksCit9OworCisvKiBpbmZvcm1hdGlvbiBvbiBhIHRyYW5zZmVyIHRoZSBjb2RlYyBjYW4gdGFrZSAqLworc3RydWN0IHRyYW5zZmVyX2luZm8geworCXU2NCBmb3JtYXRzOwkJLyogU05EUlZfUENNX0ZNVEJJVF8qICovCisJdW5zaWduZWQgaW50IHJhdGVzOwkvKiBTTkRSVl9QQ01fUkFURV8qICovCisJLyogZmxhZ3MgKi8KKwl1MzIgdHJhbnNmZXJfaW46MSwgLyogaW5wdXQgPSAxLCBvdXRwdXQgPSAwICovCisJICAgIG11c3RfYmVfY2xvY2tfc291cmNlOjE7CisJLyogZm9yIGNvZGVjcyB0byBkaXN0aW5ndWlzaCBhbW9uZyB0aGVpciBUSXMgKi8KKwlpbnQgdGFnOworfTsKKworc3RydWN0IGNvZGVjX2luZm9faXRlbSB7CisJc3RydWN0IGNvZGVjX2luZm8gKmNvZGVjOworCXZvaWQgKmNvZGVjX2RhdGE7CisJc3RydWN0IHNvdW5kYnVzX2RldiAqc2RldjsKKwkvKiBpbnRlcm5hbCwgdG8gYmUgdXNlZCBieSB0aGUgc291bmRidXMgcHJvdmlkZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKiBmb3IgcHJlcGFyZSwgd2hlcmUgdGhlIGNvZGVjcyBuZWVkIHRvIGtub3cKKyAqIHdoYXQgd2UncmUgZ29pbmcgdG8gZHJpdmUgdGhlIGJ1cyB3aXRoICovCitzdHJ1Y3QgYnVzX2luZm8geworCS8qIHNlZSBiZWxvdyAqLworCWludCBzeXNjbG9ja19mYWN0b3I7CisJaW50IGJ1c19mYWN0b3I7Cit9OworCisvKiBpbmZvcm1hdGlvbiBvbiB0aGUgY29kZWMgaXRzZWxmLCBwbHVzIGZ1bmN0aW9uIHBvaW50ZXJzICovCitzdHJ1Y3QgY29kZWNfaW5mbyB7CisJLyogdGhlIG1vZHVsZSB0aGlzIGxpdmVzIGluICovCisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwkvKiBzdXBwb3J0ZWQgdHJhbnNmZXIgcG9zc2liaWxpdGllcywgYXJyYXkgdGVybWluYXRlZCBieQorCSAqIGZvcm1hdHMgb3IgcmF0ZXMgYmVpbmcgMC4gKi8KKwlzdHJ1Y3QgdHJhbnNmZXJfaW5mbyAqdHJhbnNmZXJzOworCisJLyogTWFzdGVyIGNsb2NrIHNwZWVkIGZhY3RvcgorCSAqIHRvIGJlIHVzZWQgKG1hc3RlciBjbG9jayBzcGVlZCA9IHN5c2Nsb2NrX2ZhY3RvciAqIHNhbXBsaW5nIGZyZXEpCisJICogVW51c2VkIGlmIHRoZSBzb3VuZGJ1cyBwcm92aWRlciBoYXMgbm8gc3VjaCBub3Rpb24uCisJICovCisJaW50IHN5c2Nsb2NrX2ZhY3RvcjsKKworCS8qIEJ1cyBmYWN0b3IsIGJ1cyBjbG9jayBzcGVlZCA9IGJ1c19mYWN0b3IgKiBzYW1wbGluZyBmcmVxKQorCSAqIFVudXNlZCBpZiB0aGUgc291bmRidXMgcHJvdmlkZXIgaGFzIG5vIHN1Y2ggbm90aW9uLgorCSAqLworCWludCBidXNfZmFjdG9yOworCisJLyogb3BlcmF0aW9ucyAqLworCS8qIGNsb2NrIHN3aXRjaGluZywgc2VlIGFib3ZlICovCisJaW50ICgqc3dpdGNoX2Nsb2NrKShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksCisJCQkgICAgZW51bSBjbG9ja19zd2l0Y2ggY2xvY2spOworCisJLyogY2FsbGVkIGZvciBlYWNoIHRyYW5zZmVyX2luZm8gd2hlbiB0aGUgdXNlcgorCSAqIG9wZW5zIHRoZSBwY20gZGV2aWNlIHRvIGRldGVybWluZSB3aGF0IHRoZQorCSAqIGhhcmR3YXJlIGNhbiBzdXBwb3J0IGF0IHRoaXMgcG9pbnQgaW4gdGltZS4KKwkgKiBUaGF0IGNhbiBkZXBlbmQgb24gb3RoZXIgdXNlci1zd2l0Y2hhYmxlIGNvbnRyb2xzLgorCSAqIFJldHVybiAxIGlmIHVzYWJsZSwgMCBpZiBub3QuCisJICogb3V0IHBvaW50cyB0byBhbm90aGVyIGluc3RhbmNlIG9mIGEgdHJhbnNmZXJfaW5mbworCSAqIHdoaWNoIGlzIGluaXRpYWxpc2VkIHRvIHRoZSB2YWx1ZXMgaW4gKnRpLCBhbmQKKwkgKiBpdCdzIGZvcm1hdCBhbmQgcmF0ZSB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkIGJ5CisJICogdGhlIGNhbGxiYWNrIGlmIGl0IGlzIG5lY2Vzc2FyeSB0byBmdXJ0aGVyIHJlc3RyaWN0CisJICogdGhlIGZvcm1hdHMgdGhhdCBjYW4gYmUgdXNlZCBhdCB0aGUgbW9tZW50LCBmb3IKKwkgKiBleGFtcGxlIHdoZW4gb25lIGNvZGVjIGhhcyBtdWx0aXBsZSBsb2dpY2FsIGNvZGVjCisJICogaW5mbyBzdHJ1Y3RzIGZvciBtdWx0aXBsZSBpbnB1dHMuCisJICovCisJaW50ICgqdXNhYmxlKShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksCisJCSAgICAgIHN0cnVjdCB0cmFuc2Zlcl9pbmZvICp0aSwKKwkJICAgICAgc3RydWN0IHRyYW5zZmVyX2luZm8gKm91dCk7CisKKwkvKiBjYWxsZWQgd2hlbiBwY20gc3RyZWFtIGlzIG9wZW5lZCwgcHJvYmFibHkgbm90IGltcGxlbWVudGVkCisJICogbW9zdCBvZiB0aGUgdGltZSBzaW5jZSBpdCBpc24ndCB0b28gdXNlZnVsICovCisJaW50ICgqb3Blbikoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLAorCQkgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOworCisJLyogY2FsbGVkIHdoZW4gdGhlIHBjbSBzdHJlYW0gaXMgY2xvc2VkLCBhdCB0aGlzIHBvaW50CisJICogdGhlIHVzZXIgY2hvaWNlcyBjYW4gYWxsIGJlIHVubG9ja2VkIChzZWUgYmVsb3cpICovCisJaW50ICgqY2xvc2UpKHN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaSwKKwkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisKKwkvKiBpZiB0aGUgY29kZWMgbXVzdCBmb3JiaWQgc29tZSB1c2VyIGNob2ljZXMgYmVjYXVzZQorCSAqIHRoZXkgYXJlIG5vdCB2YWxpZCB3aXRoIHRoZSBzdWJzdHJlYW0vdHJhbnNmZXIgaW5mbywKKwkgKiBpdCBtdXN0IGRvIHNvIGhlcmUuIEV4YW1wbGU6IG5vIGRpZ2l0YWwgb3V0cHV0IGZvcgorCSAqIGluY29tcGF0aWJsZSBmcmFtZXJhdGUsIHNheSA4S0h6LCBvbiBPbnl4LgorCSAqIElmIHRoZSBzZWxlY3RlZCBzdHVmZiBpbiB0aGUgc3Vic3RyZWFtIGlzIE5PVAorCSAqIGNvbXBhdGlibGUsIHlvdSBoYXZlIHRvIHJlamVjdCB0aGlzIGNhbGwhICovCisJaW50ICgqcHJlcGFyZSkoc3RydWN0IGNvZGVjX2luZm9faXRlbSAqY2lpLAorCQkgICAgICAgc3RydWN0IGJ1c19pbmZvICpiaSwKKwkJICAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKKworCS8qIHN0YXJ0KCkgaXMgY2FsbGVkIGJlZm9yZSBkYXRhIGlzIHB1c2hlZCB0byB0aGUgY29kZWMuCisJICogTm90ZSB0aGF0IHN0YXJ0KCkgbXVzdCBiZSBhdG9taWMhICovCisJaW50ICgqc3RhcnQpKHN0cnVjdCBjb2RlY19pbmZvX2l0ZW0gKmNpaSwKKwkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisKKwkvKiBzdG9wKCkgaXMgY2FsbGVkIGFmdGVyIGRhdGEgaXMgbm8gbG9uZ2VyIHB1c2hlZCB0byB0aGUgY29kZWMuCisJICogTm90ZSB0aGF0IHN0b3AoKSBtdXN0IGJlIGF0b21pYyEgKi8KKwlpbnQgKCpzdG9wKShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksCisJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWksIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgY29kZWNfaW5mb19pdGVtICpjaWkpOworfTsKKworLyogaW5mb3JtYXRpb24gb24gYSBzb3VuZGJ1cyBkZXZpY2UgKi8KK3N0cnVjdCBzb3VuZGJ1c19kZXYgeworCS8qIHRoZSBidXMgaXQgYmVsb25ncyB0byAqLworCXN0cnVjdCBsaXN0X2hlYWQgb25idXNsaXN0OworCisJLyogdGhlIG9mIGRldmljZSBpdCByZXByZXNlbnRzICovCisJc3RydWN0IG9mX2RldmljZSBvZmRldjsKKworCS8qIHdoYXQgbW9kdWxlcyBnbyBieSAqLworCWNoYXIgbW9kYWxpYXNbMzJdOworCisJLyogVGhlc2UgZmllbGRzIG11c3QgYmUgYmVmb3JlIGF0dGFjaF9jb2RlYyBjYW4gYmUgY2FsbGVkLgorCSAqIFRoZXkgc2hvdWxkIGJlIHNldCBieSB0aGUgb3duZXIgb2YgdGhlIGFsc2EgY2FyZCBvYmplY3QKKwkgKiB0aGF0IGlzIG5lZWRlZCwgYW5kIHdob2V2ZXIgc2V0cyB0aGVtIG11c3QgbWFrZSBzdXJlCisJICogdGhhdCB0aGV5IGFyZSB1bmlxdWUgd2l0aGluIHRoYXQgYWxzYSBjYXJkIG9iamVjdC4gKi8KKwljaGFyICpwY21uYW1lOworCWludCBwY21pZDsKKworCS8qIHRoaXMgaXMgYXNzaWduZWQgYnkgdGhlIHNvdW5kYnVzIHByb3ZpZGVyIGluIGF0dGFjaF9jb2RlYyAqLworCXN0cnVjdCBzbmRfcGNtICpwY207CisKKwkvKiBvcGVyYXRpb25zICovCisJLyogYXR0YWNoIGEgY29kZWMgdG8gdGhpcyBzb3VuZGJ1cywgZ2l2ZSB0aGUgYWxzYQorCSAqIGNhcmQgb2JqZWN0IHRoZSBQQ01zIGZvciB0aGlzIHNvdW5kYnVzIHNob3VsZCBiZSBpbi4KKwkgKiBUaGUgJ2RhdGEnIHBvaW50ZXIgbXVzdCBiZSB1bmlxdWUsIGl0IGlzIHVzZWQgYXMgdGhlCisJICoga2V5IGZvciBkZXRhY2hfY29kZWMoKS4gKi8KKwlpbnQgKCphdHRhY2hfY29kZWMpKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldiwgc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkJICAgIHN0cnVjdCBjb2RlY19pbmZvICpjaSwgdm9pZCAqZGF0YSk7CisJdm9pZCAoKmRldGFjaF9jb2RlYykoc3RydWN0IHNvdW5kYnVzX2RldiAqZGV2LCB2b2lkICpkYXRhKTsKKwkvKiBUT0RPOiBzdXNwZW5kL3Jlc3VtZSAqLworCisJLyogcHJpdmF0ZSBmb3IgdGhlIHNvdW5kYnVzIHByb3ZpZGVyICovCisJc3RydWN0IGxpc3RfaGVhZCBjb2RlY19saXN0OworCXUzMiBoYXZlX291dDoxLCBoYXZlX2luOjE7Cit9OworI2RlZmluZSB0b19zb3VuZGJ1c19kZXZpY2UoZCkgY29udGFpbmVyX29mKGQsIHN0cnVjdCBzb3VuZGJ1c19kZXYsIG9mZGV2LmRldikKKyNkZWZpbmUgb2ZfdG9fc291bmRidXNfZGV2aWNlKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3Qgc291bmRidXNfZGV2LCBvZmRldikKKworZXh0ZXJuIGludCBzb3VuZGJ1c19hZGRfb25lKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldik7CitleHRlcm4gdm9pZCBzb3VuZGJ1c19yZW1vdmVfb25lKHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldik7CisKK2V4dGVybiBzdHJ1Y3Qgc291bmRidXNfZGV2ICpzb3VuZGJ1c19kZXZfZ2V0KHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldik7CitleHRlcm4gdm9pZCBzb3VuZGJ1c19kZXZfcHV0KHN0cnVjdCBzb3VuZGJ1c19kZXYgKmRldik7CisKK3N0cnVjdCBzb3VuZGJ1c19kcml2ZXIgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisKKwkvKiB3ZSBkb24ndCBpbXBsZW1lbnQgYW55IG1hdGNoaW5nIGF0IGFsbCAqLworCisJaW50CSgqcHJvYmUpKHN0cnVjdCBzb3VuZGJ1c19kZXYqIGRldik7CisJaW50CSgqcmVtb3ZlKShzdHJ1Y3Qgc291bmRidXNfZGV2KiBkZXYpOworCisJaW50CSgqc3VzcGVuZCkoc3RydWN0IHNvdW5kYnVzX2RldiogZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworCWludAkoKnJlc3VtZSkoc3RydWN0IHNvdW5kYnVzX2RldiogZGV2KTsKKwlpbnQJKCpzaHV0ZG93bikoc3RydWN0IHNvdW5kYnVzX2RldiogZGV2KTsKKworCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKK307CisjZGVmaW5lIHRvX3NvdW5kYnVzX2RyaXZlcihkcnYpIGNvbnRhaW5lcl9vZihkcnYsc3RydWN0IHNvdW5kYnVzX2RyaXZlciwgZHJpdmVyKQorCitleHRlcm4gaW50IHNvdW5kYnVzX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgc291bmRidXNfZHJpdmVyICpkcnYpOworZXh0ZXJuIHZvaWQgc291bmRidXNfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHNvdW5kYnVzX2RyaXZlciAqZHJ2KTsKKworI2VuZGlmIC8qIF9fU09VTkRCVVNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvYW9hL3NvdW5kYnVzL3N5c2ZzLmMgYi9zb3VuZC9hb2Evc291bmRidXMvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFmODE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL3N5c2ZzLmMKQEAgLTAsMCArMSw0MyBAQAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKy8qIEZJWCBVUCAqLworI2luY2x1ZGUgInNvdW5kYnVzLmgiCisKKyNkZWZpbmUgc291bmRidXNfY29uZmlnX29mX2F0dHIoZmllbGQsIGZvcm1hdF9zdHJpbmcpCQkJXAorc3RhdGljIHNzaXplX3QJCQkJCQkJCVwKK2ZpZWxkIyNfc2hvdyAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAorICAgICAgICAgICAgICBjaGFyICpidWYpCQkJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3Qgc291bmRidXNfZGV2ICptZGV2ID0gdG9fc291bmRidXNfZGV2aWNlIChkZXYpOwkJXAorCXJldHVybiBzcHJpbnRmIChidWYsIGZvcm1hdF9zdHJpbmcsIG1kZXYtPm9mZGV2Lm5vZGUtPmZpZWxkKTsJXAorfQorCitzdGF0aWMgc3NpemVfdCBtb2RhbGlhc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc291bmRidXNfZGV2ICpzZGV2ID0gdG9fc291bmRidXNfZGV2aWNlKGRldik7CisJc3RydWN0IG9mX2RldmljZSAqb2YgPSAmc2Rldi0+b2ZkZXY7CisJaW50IGxlbmd0aDsKKworCWlmICgqc2Rldi0+bW9kYWxpYXMpIHsKKwkJc3RybGNweShidWYsIHNkZXYtPm1vZGFsaWFzLCBzaXplb2Yoc2Rldi0+bW9kYWxpYXMpICsgMSk7CisJCXN0cmNhdChidWYsICJcbiIpOworCQlsZW5ndGggPSBzdHJsZW4oYnVmKTsKKwl9IGVsc2UgeworCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIm9mOk4lc1Qlc1xuIiwKKwkJCQkgb2YtPm5vZGUtPm5hbWUsIG9mLT5ub2RlLT50eXBlKTsKKwl9CisKKwlyZXR1cm4gbGVuZ3RoOworfQorCitzb3VuZGJ1c19jb25maWdfb2ZfYXR0ciAobmFtZSwgIiVzXG4iKTsKK3NvdW5kYnVzX2NvbmZpZ19vZl9hdHRyICh0eXBlLCAiJXNcbiIpOworCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBzb3VuZGJ1c19kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFJfUk8obmFtZSksCisJX19BVFRSX1JPKHR5cGUpLAorCV9fQVRUUl9STyhtb2RhbGlhcyksCisJX19BVFRSX05VTEwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9hcm0vc2ExMXh4LXVkYTEzNDEuYyBiL3NvdW5kL2FybS9zYTExeHgtdWRhMTM0MS5jCmluZGV4IDEzMDU3ZDkuLmI4OGZiMGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2FybS9zYTExeHgtdWRhMTM0MS5jCisrKyBiL3NvdW5kL2FybS9zYTExeHgtdWRhMTM0MS5jCkBAIC0xMTIsNyArMTEyLDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU0ExMTAwL1NBMTExMSArIFVEQTEzNDFUUyBkcml2ZXIgZm9yIEFMU0EiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ7e1VEQTEzNDEsaVBBUSBIMzYwMCBVREExMzQxVFN9fSIpOwogCi1zdGF0aWMgY2hhciAqaWQgPSBOVUxMOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCitzdGF0aWMgY2hhciAqaWQ7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KIAogbW9kdWxlX3BhcmFtKGlkLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGlkLCAiSUQgc3RyaW5nIGZvciBTQTExMDAvU0ExMTExICsgVURBMTM0MVRTIHNvdW5kY2FyZC4iKTsKQEAgLTk4NCwxMSArOTg0LDE1IEBACiAJaWYgKChlcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNhMTF4eF91ZGExMzQxX2RyaXZlcikpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlkZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKFNBMTFYWF9VREExMzQxX0RSSVZFUiwgLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoZGV2aWNlKSkgewotCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2ExMXh4X3VkYTEzNDFfZHJpdmVyKTsKLQkJcmV0dXJuIFBUUl9FUlIoZGV2aWNlKTsKLQl9Ci0JcmV0dXJuIDA7CisJaWYgKCFJU19FUlIoZGV2aWNlKSkgeworCQlpZiAocGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKSkKKwkJCXJldHVybiAwOworCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihkZXZpY2UpOworCQllcnIgPSAtRU5PREVWCisJfSBlbHNlCisJCWVyciA9IFBUUl9FUlIoZGV2aWNlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2ExMXh4X3VkYTEzNDFfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc2ExMXh4X3VkYTEzNDFfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCAyMjU2NWM5Yi4uYmIzOTdlYSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9jb250cm9sLmMKKysrIGIvc291bmQvY29yZS9jb250cm9sLmMKQEAgLTE3Niw2ICsxNzYsOCBAQAogCXJlYWRfdW5sb2NrKCZjYXJkLT5jdGxfZmlsZXNfcndsb2NrKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX25vdGlmeSk7CisKIC8qKgogICogc25kX2N0bF9uZXcgLSBjcmVhdGUgYSBjb250cm9sIGluc3RhbmNlIGZyb20gdGhlIHRlbXBsYXRlCiAgKiBAY29udHJvbDogdGhlIGNvbnRyb2wgdGVtcGxhdGUKQEAgLTIwNCw2ICsyMDYsOCBAQAogCXJldHVybiBrY3RsOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9jdGxfbmV3KTsKKwogLyoqCiAgKiBzbmRfY3RsX25ldzEgLSBjcmVhdGUgYSBjb250cm9sIGluc3RhbmNlIGZyb20gdGhlIHRlbXBsYXRlCiAgKiBAbmNvbnRyb2w6IHRoZSBpbml0aWFsaXphdGlvbiByZWNvcmQKQEAgLTI0Miw2ICsyNDYsOCBAQAogCXJldHVybiBzbmRfY3RsX25ldygma2N0bCwgYWNjZXNzKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX25ldzEpOworCiAvKioKICAqIHNuZF9jdGxfZnJlZV9vbmUgLSByZWxlYXNlIHRoZSBjb250cm9sIGluc3RhbmNlCiAgKiBAa2NvbnRyb2w6IHRoZSBjb250cm9sIGluc3RhbmNlCkBAIC0yNTksNiArMjY1LDggQEAKIAl9CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF9mcmVlX29uZSk7CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2N0bF9ob2xlX2NoZWNrKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewpAQCAtMzQ3LDYgKzM1NSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX2FkZCk7CisKIC8qKgogICogc25kX2N0bF9yZW1vdmUgLSByZW1vdmUgdGhlIGNvbnRyb2wgZnJvbSB0aGUgY2FyZCBhbmQgcmVsZWFzZSBpdAogICogQGNhcmQ6IHRoZSBjYXJkIGluc3RhbmNlCkBAIC0zNzMsNiArMzgzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX3JlbW92ZSk7CisKIC8qKgogICogc25kX2N0bF9yZW1vdmVfaWQgLSByZW1vdmUgdGhlIGNvbnRyb2wgb2YgdGhlIGdpdmVuIGlkIGFuZCByZWxlYXNlIGl0CiAgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKQEAgLTM5OSw2ICs0MTEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF9yZW1vdmVfaWQpOworCiAvKioKICAqIHNuZF9jdGxfcmVtb3ZlX3VubG9ja2VkX2lkIC0gcmVtb3ZlIHRoZSB1bmxvY2tlZCBjb250cm9sIG9mIHRoZSBnaXZlbiBpZCBhbmQgcmVsZWFzZSBpdAogICogQGZpbGU6IGFjdGl2ZSBjb250cm9sIGhhbmRsZQpAQCAtNDYxLDYgKzQ3NSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF9yZW5hbWVfaWQpOworCiAvKioKICAqIHNuZF9jdGxfZmluZF9udW1pZCAtIGZpbmQgdGhlIGNvbnRyb2wgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLWlkCiAgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKQEAgLTQ4Nyw2ICs1MDMsOCBAQAogCXJldHVybiBOVUxMOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9jdGxfZmluZF9udW1pZCk7CisKIC8qKgogICogc25kX2N0bF9maW5kX2lkIC0gZmluZCB0aGUgY29udHJvbCBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBpZAogICogQGNhcmQ6IHRoZSBjYXJkIGluc3RhbmNlCkBAIC01MjcsNiArNTQ1LDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX2ZpbmRfaWQpOworCiBzdGF0aWMgaW50IHNuZF9jdGxfY2FyZF9pbmZvKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9jdGxfZmlsZSAqIGN0bCwKIAkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIHsKQEAgLTcwNCw2ICs3MjQsOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF9lbGVtX3JlYWQpOworCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV9yZWFkX3VzZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkLAogCQkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSBfX3VzZXIgKl9jb250cm9sKQogewpAQCAtNzY3LDYgKzc4OSw4IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY3RsX2VsZW1fd3JpdGUpOworCiBzdGF0aWMgaW50IHNuZF9jdGxfZWxlbV93cml0ZV91c2VyKHN0cnVjdCBzbmRfY3RsX2ZpbGUgKmZpbGUsCiAJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSBfX3VzZXIgKl9jb250cm9sKQogewpAQCAtMTE5OSwxMSArMTIyMywxNSBAQAogCXJldHVybiBfc25kX2N0bF9yZWdpc3Rlcl9pb2N0bChmY24sICZzbmRfY29udHJvbF9pb2N0bHMpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9jdGxfcmVnaXN0ZXJfaW9jdGwpOworCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogaW50IHNuZF9jdGxfcmVnaXN0ZXJfaW9jdGxfY29tcGF0KHNuZF9rY3RsX2lvY3RsX2Z1bmNfdCBmY24pCiB7CiAJcmV0dXJuIF9zbmRfY3RsX3JlZ2lzdGVyX2lvY3RsKGZjbiwgJnNuZF9jb250cm9sX2NvbXBhdF9pb2N0bHMpOwogfQorCitFWFBPUlRfU1lNQk9MKHNuZF9jdGxfcmVnaXN0ZXJfaW9jdGxfY29tcGF0KTsKICNlbmRpZgogCiAvKgpAQCAtMTIzNiwxMiArMTI2NCwxNSBAQAogCXJldHVybiBfc25kX2N0bF91bnJlZ2lzdGVyX2lvY3RsKGZjbiwgJnNuZF9jb250cm9sX2lvY3Rscyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF91bnJlZ2lzdGVyX2lvY3RsKTsKKwogI2lmZGVmIENPTkZJR19DT01QQVQKIGludCBzbmRfY3RsX3VucmVnaXN0ZXJfaW9jdGxfY29tcGF0KHNuZF9rY3RsX2lvY3RsX2Z1bmNfdCBmY24pCiB7CiAJcmV0dXJuIF9zbmRfY3RsX3VucmVnaXN0ZXJfaW9jdGwoZmNuLCAmc25kX2NvbnRyb2xfY29tcGF0X2lvY3Rscyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2N0bF91bnJlZ2lzdGVyX2lvY3RsX2NvbXBhdCk7CiAjZW5kaWYKIAogc3RhdGljIGludCBzbmRfY3RsX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlsZSwgaW50IG9uKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvZGV2aWNlLmMKaW5kZXggYjFjZjZlYy4uNmNlNGRhNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL2RldmljZS5jCkBAIC02Myw2ICs2Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2RldmljZV9uZXcpOworCiAvKioKICAqIHNuZF9kZXZpY2VfZnJlZSAtIHJlbGVhc2UgdGhlIGRldmljZSBmcm9tIHRoZSBjYXJkCiAgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKQEAgLTEwNyw2ICsxMDksOCBAQAogCXJldHVybiAtRU5YSU87CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2RldmljZV9mcmVlKTsKKwogLyoqCiAgKiBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QgLSBkaXNjb25uZWN0IHRoZSBkZXZpY2UKICAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQpAQCAtMTgyLDYgKzE4Niw4IEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX3JlZ2lzdGVyKTsKKwogLyoKICAqIHJlZ2lzdGVyIGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgY2FyZC4KICAqIGNhbGxlZCBmcm9tIGluaXQuYwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9od2RlcC5jIGIvc291bmQvY29yZS9od2RlcC5jCmluZGV4IDI1MjRlNjYuLjhiZDBkY2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaHdkZXAuYworKysgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKQEAgLTQ4Niw3ICs0ODYsNiBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgImh3ZGVwIiwgTlVMTCkpICE9IE5VTEwpIHsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSBQQUdFX1NJWkU7CiAJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9od2RlcF9wcm9jX3JlYWQ7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5mby5jIGIvc291bmQvY29yZS9pbmZvLmMKaW5kZXggMjU4MmI3NC4uMTBjMTc3MiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbmZvLmMKKysrIGIvc291bmQvY29yZS9pbmZvLmMKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC04Miw2ICs4MSwyNCBAQAogc3RhdGljIGludCBzbmRfaW5mb192ZXJzaW9uX2RvbmUodm9pZCk7CiAKIAorLyogcmVzaXplIHRoZSBwcm9jIHIvdyBidWZmZXIgKi8KK3N0YXRpYyBpbnQgcmVzaXplX2luZm9fYnVmZmVyKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlciwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBuc2l6ZSkKK3sKKwljaGFyICpuYnVmOworCisJbnNpemUgPSBQQUdFX0FMSUdOKG5zaXplKTsKKwluYnVmID0ga21hbGxvYyhuc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEgbmJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkobmJ1ZiwgYnVmZmVyLT5idWZmZXIsIGJ1ZmZlci0+bGVuKTsKKwlrZnJlZShidWZmZXItPmJ1ZmZlcik7CisJYnVmZmVyLT5idWZmZXIgPSBuYnVmOworCWJ1ZmZlci0+bGVuID0gbnNpemU7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogc25kX2lwcmludGYgLSBwcmludGYgb24gdGhlIHByb2NmcyBidWZmZXIKICAqIEBidWZmZXI6IHRoZSBwcm9jZnMgYnVmZmVyCkBAIC05NSwzMCArMTEyLDQzIEBACiB7CiAJdmFfbGlzdCBhcmdzOwogCWludCBsZW4sIHJlczsKKwlpbnQgZXJyID0gMDsKIAorCW1pZ2h0X3NsZWVwKCk7CiAJaWYgKGJ1ZmZlci0+c3RvcCB8fCBidWZmZXItPmVycm9yKQogCQlyZXR1cm4gMDsKIAlsZW4gPSBidWZmZXItPmxlbiAtIGJ1ZmZlci0+c2l6ZTsKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXJlcyA9IHZzbnByaW50ZihidWZmZXItPmN1cnIsIGxlbiwgZm10LCBhcmdzKTsKLQl2YV9lbmQoYXJncyk7Ci0JaWYgKHJlcyA+PSBsZW4pIHsKLQkJYnVmZmVyLT5zdG9wID0gMTsKLQkJcmV0dXJuIDA7CisJZm9yICg7OykgeworCQlyZXMgPSB2c25wcmludGYoYnVmZmVyLT5idWZmZXIgKyBidWZmZXItPmN1cnIsIGxlbiwgZm10LCBhcmdzKTsKKwkJaWYgKHJlcyA8IGxlbikKKwkJCWJyZWFrOworCQllcnIgPSByZXNpemVfaW5mb19idWZmZXIoYnVmZmVyLCBidWZmZXItPmxlbiArIFBBR0VfU0laRSk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisJCWxlbiA9IGJ1ZmZlci0+bGVuIC0gYnVmZmVyLT5zaXplOwogCX0KKwl2YV9lbmQoYXJncyk7CisKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAlidWZmZXItPmN1cnIgKz0gcmVzOwogCWJ1ZmZlci0+c2l6ZSArPSByZXM7CiAJcmV0dXJuIHJlczsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaXByaW50Zik7CisKIC8qCiAKICAqLwogCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzbmRfcHJvY19yb290ID0gTlVMTDsKLXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqc25kX3NlcV9yb290ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnNuZF9wcm9jX3Jvb3Q7CitzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF9zZXFfcm9vdDsKK0VYUE9SVF9TWU1CT0woc25kX3NlcV9yb290KTsKKwogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAotc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfb3NzX3Jvb3QgPSBOVUxMOworc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfb3NzX3Jvb3Q7CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIHNuZF9pbmZvX2VudHJ5X3ByZXBhcmUoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKQEAgLTIyMSw3ICsyNTEsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19wcml2YXRlX2RhdGEgKmRhdGE7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWY7Ci0Jc2l6ZV90IHNpemUgPSAwOworCXNzaXplX3Qgc2l6ZSA9IDA7CiAJbG9mZl90IHBvczsKIAogCWRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CkBAIC0yMzcsMTQgKzI2NywyMCBAQAogCQlidWYgPSBkYXRhLT53YnVmZmVyOwogCQlpZiAoYnVmID09IE5VTEwpCiAJCQlyZXR1cm4gLUVJTzsKLQkJaWYgKHBvcyA+PSBidWYtPmxlbikKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzaXplID0gYnVmLT5sZW4gLSBwb3M7Ci0JCXNpemUgPSBtaW4oY291bnQsIHNpemUpOwotCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLT5idWZmZXIgKyBwb3MsIGJ1ZmZlciwgc2l6ZSkpCisJCW11dGV4X2xvY2soJmVudHJ5LT5hY2Nlc3MpOworCQlpZiAocG9zICsgY291bnQgPj0gYnVmLT5sZW4pIHsKKwkJCWlmIChyZXNpemVfaW5mb19idWZmZXIoYnVmLCBwb3MgKyBjb3VudCkpIHsKKwkJCQltdXRleF91bmxvY2soJmVudHJ5LT5hY2Nlc3MpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihidWYtPmJ1ZmZlciArIHBvcywgYnVmZmVyLCBjb3VudCkpIHsKKwkJCW11dGV4X3VubG9jaygmZW50cnktPmFjY2Vzcyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKLQkJaWYgKChsb25nKWJ1Zi0+c2l6ZSA8IHBvcyArIHNpemUpCi0JCQlidWYtPnNpemUgPSBwb3MgKyBzaXplOworCQl9CisJCWJ1Zi0+c2l6ZSA9IHBvcyArIGNvdW50OworCQltdXRleF91bmxvY2soJmVudHJ5LT5hY2Nlc3MpOworCQlzaXplID0gY291bnQ7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfSU5GT19DT05URU5UX0RBVEE6CiAJCWlmIChlbnRyeS0+Yy5vcHMtPndyaXRlKQpAQCAtMjc5LDE4ICszMTUsMTQgQEAKIAl9CiAJbW9kZSA9IGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREU7CiAJaWYgKG1vZGUgPT0gT19SRE9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKLQkJaWYgKChlbnRyeS0+Y29udGVudCA9PSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVCAmJgotCQkgICAgICFlbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSkgfHwKLQkJICAgIChlbnRyeS0+Y29udGVudCA9PSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQSAmJgorCQlpZiAoKGVudHJ5LT5jb250ZW50ID09IFNORFJWX0lORk9fQ09OVEVOVF9EQVRBICYmCiAJCSAgICAgZW50cnktPmMub3BzLT5yZWFkID09IE5VTEwpKSB7CiAJCSAgICAJZXJyID0gLUVOT0RFVjsKIAkJICAgIAlnb3RvIF9fZXJyb3I7CiAJCX0KIAl9CiAJaWYgKG1vZGUgPT0gT19XUk9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKLQkJaWYgKChlbnRyeS0+Y29udGVudCA9PSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVCAmJgotCQkgICAgICFlbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUpIHx8Ci0JCSAgICAoZW50cnktPmNvbnRlbnQgPT0gU05EUlZfSU5GT19DT05URU5UX0RBVEEgJiYKKwkJaWYgKChlbnRyeS0+Y29udGVudCA9PSBTTkRSVl9JTkZPX0NPTlRFTlRfREFUQSAmJgogCQkgICAgIGVudHJ5LT5jLm9wcy0+d3JpdGUgPT0gTlVMTCkpIHsKIAkJICAgIAllcnIgPSAtRU5PREVWOwogCQkgICAgCWdvdG8gX19lcnJvcjsKQEAgLTMwNiw0OSArMzM4LDIzIEBACiAJY2FzZSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDoKIAkJaWYgKG1vZGUgPT0gT19SRE9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKIAkJCWJ1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKCpidWZmZXIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJCWtmcmVlKGRhdGEpOwotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJZ290byBfX2Vycm9yOwotCQkJfQotCQkJYnVmZmVyLT5sZW4gPSAoZW50cnktPmMudGV4dC5yZWFkX3NpemUgKwotCQkJCSAgICAgIChQQUdFX1NJWkUgLSAxKSkgJiB+KFBBR0VfU0laRSAtIDEpOwotCQkJYnVmZmVyLT5idWZmZXIgPSB2bWFsbG9jKGJ1ZmZlci0+bGVuKTsKLQkJCWlmIChidWZmZXItPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJa2ZyZWUoYnVmZmVyKTsKLQkJCQlrZnJlZShkYXRhKTsKLQkJCQllcnIgPSAtRU5PTUVNOwotCQkJCWdvdG8gX19lcnJvcjsKLQkJCX0KLQkJCWJ1ZmZlci0+Y3VyciA9IGJ1ZmZlci0+YnVmZmVyOworCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKQorCQkJCWdvdG8gX19ub21lbTsKIAkJCWRhdGEtPnJidWZmZXIgPSBidWZmZXI7CisJCQlidWZmZXItPmxlbiA9IFBBR0VfU0laRTsKKwkJCWJ1ZmZlci0+YnVmZmVyID0ga21hbGxvYyhidWZmZXItPmxlbiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoYnVmZmVyLT5idWZmZXIgPT0gTlVMTCkKKwkJCQlnb3RvIF9fbm9tZW07CiAJCX0KIAkJaWYgKG1vZGUgPT0gT19XUk9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKIAkJCWJ1ZmZlciA9IGt6YWxsb2Moc2l6ZW9mKCpidWZmZXIpLCBHRlBfS0VSTkVMKTsKLQkJCWlmIChidWZmZXIgPT0gTlVMTCkgewotCQkJCWlmIChtb2RlID09IE9fUkRXUikgewotCQkJCQl2ZnJlZShkYXRhLT5yYnVmZmVyLT5idWZmZXIpOwotCQkJCQlrZnJlZShkYXRhLT5yYnVmZmVyKTsKLQkJCQl9Ci0JCQkJa2ZyZWUoZGF0YSk7Ci0JCQkJZXJyID0gLUVOT01FTTsKLQkJCQlnb3RvIF9fZXJyb3I7Ci0JCQl9Ci0JCQlidWZmZXItPmxlbiA9IChlbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgKwotCQkJCSAgICAgIChQQUdFX1NJWkUgLSAxKSkgJiB+KFBBR0VfU0laRSAtIDEpOwotCQkJYnVmZmVyLT5idWZmZXIgPSB2bWFsbG9jKGJ1ZmZlci0+bGVuKTsKLQkJCWlmIChidWZmZXItPmJ1ZmZlciA9PSBOVUxMKSB7Ci0JCQkJaWYgKG1vZGUgPT0gT19SRFdSKSB7Ci0JCQkJCXZmcmVlKGRhdGEtPnJidWZmZXItPmJ1ZmZlcik7Ci0JCQkJCWtmcmVlKGRhdGEtPnJidWZmZXIpOwotCQkJCX0KLQkJCQlrZnJlZShidWZmZXIpOwotCQkJCWtmcmVlKGRhdGEpOwotCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJZ290byBfX2Vycm9yOwotCQkJfQotCQkJYnVmZmVyLT5jdXJyID0gYnVmZmVyLT5idWZmZXI7CisJCQlpZiAoYnVmZmVyID09IE5VTEwpCisJCQkJZ290byBfX25vbWVtOwogCQkJZGF0YS0+d2J1ZmZlciA9IGJ1ZmZlcjsKKwkJCWJ1ZmZlci0+bGVuID0gUEFHRV9TSVpFOworCQkJYnVmZmVyLT5idWZmZXIgPSBrbWFsbG9jKGJ1ZmZlci0+bGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChidWZmZXItPmJ1ZmZlciA9PSBOVUxMKQorCQkJCWdvdG8gX19ub21lbTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNORFJWX0lORk9fQ09OVEVOVF9EQVRBOgkvKiBkYXRhICovCkBAIC0zNzMsNiArMzc5LDE3IEBACiAJfQogCXJldHVybiAwOwogCisgX19ub21lbToKKwlpZiAoZGF0YS0+cmJ1ZmZlcikgeworCQlrZnJlZShkYXRhLT5yYnVmZmVyLT5idWZmZXIpOworCQlrZnJlZShkYXRhLT5yYnVmZmVyKTsKKwl9CisJaWYgKGRhdGEtPndidWZmZXIpIHsKKwkJa2ZyZWUoZGF0YS0+d2J1ZmZlci0+YnVmZmVyKTsKKwkJa2ZyZWUoZGF0YS0+d2J1ZmZlcik7CisJfQorCWtmcmVlKGRhdGEpOworCWVyciA9IC1FTk9NRU07CiAgICAgICBfX2Vycm9yOgogCW1vZHVsZV9wdXQoZW50cnktPm1vZHVsZSk7CiAgICAgICBfX2Vycm9yMToKQEAgLTM5MSwxMSArNDA4LDExIEBACiAJZW50cnkgPSBkYXRhLT5lbnRyeTsKIAlzd2l0Y2ggKGVudHJ5LT5jb250ZW50KSB7CiAJY2FzZSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDoKLQkJaWYgKG1vZGUgPT0gT19SRE9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKLQkJCXZmcmVlKGRhdGEtPnJidWZmZXItPmJ1ZmZlcik7CisJCWlmIChkYXRhLT5yYnVmZmVyKSB7CisJCQlrZnJlZShkYXRhLT5yYnVmZmVyLT5idWZmZXIpOwogCQkJa2ZyZWUoZGF0YS0+cmJ1ZmZlcik7CiAJCX0KLQkJaWYgKG1vZGUgPT0gT19XUk9OTFkgfHwgbW9kZSA9PSBPX1JEV1IpIHsKKwkJaWYgKGRhdGEtPndidWZmZXIpIHsKIAkJCWlmIChlbnRyeS0+Yy50ZXh0LndyaXRlKSB7CiAJCQkJZW50cnktPmMudGV4dC53cml0ZShlbnRyeSwgZGF0YS0+d2J1ZmZlcik7CiAJCQkJaWYgKGRhdGEtPndidWZmZXItPmVycm9yKSB7CkBAIC00MDQsNyArNDIxLDcgQEAKIAkJCQkJCWRhdGEtPndidWZmZXItPmVycm9yKTsKIAkJCQl9CiAJCQl9Ci0JCQl2ZnJlZShkYXRhLT53YnVmZmVyLT5idWZmZXIpOworCQkJa2ZyZWUoZGF0YS0+d2J1ZmZlci0+YnVmZmVyKTsKIAkJCWtmcmVlKGRhdGEtPndidWZmZXIpOwogCQl9CiAJCWJyZWFrOwpAQCAtNjY0LDI5ICs2ODEsMjkgQEAKIAlpZiAobGVuIDw9IDAgfHwgYnVmZmVyLT5zdG9wIHx8IGJ1ZmZlci0+ZXJyb3IpCiAJCXJldHVybiAxOwogCXdoaWxlICgtLWxlbiA+IDApIHsKLQkJYyA9ICpidWZmZXItPmN1cnIrKzsKKwkJYyA9IGJ1ZmZlci0+YnVmZmVyW2J1ZmZlci0+Y3VycisrXTsKIAkJaWYgKGMgPT0gJ1xuJykgewotCQkJaWYgKChidWZmZXItPmN1cnIgLSBidWZmZXItPmJ1ZmZlcikgPj0gKGxvbmcpYnVmZmVyLT5zaXplKSB7CisJCQlpZiAoYnVmZmVyLT5jdXJyID49IGJ1ZmZlci0+c2l6ZSkKIAkJCQlidWZmZXItPnN0b3AgPSAxOwotCQkJfQogCQkJYnJlYWs7CiAJCX0KIAkJKmxpbmUrKyA9IGM7Ci0JCWlmICgoYnVmZmVyLT5jdXJyIC0gYnVmZmVyLT5idWZmZXIpID49IChsb25nKWJ1ZmZlci0+c2l6ZSkgeworCQlpZiAoYnVmZmVyLT5jdXJyID49IGJ1ZmZlci0+c2l6ZSkgewogCQkJYnVmZmVyLT5zdG9wID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCXdoaWxlIChjICE9ICdcbicgJiYgIWJ1ZmZlci0+c3RvcCkgewotCQljID0gKmJ1ZmZlci0+Y3VycisrOwotCQlpZiAoKGJ1ZmZlci0+Y3VyciAtIGJ1ZmZlci0+YnVmZmVyKSA+PSAobG9uZylidWZmZXItPnNpemUpIHsKKwkJYyA9IGJ1ZmZlci0+YnVmZmVyW2J1ZmZlci0+Y3VycisrXTsKKwkJaWYgKGJ1ZmZlci0+Y3VyciA+PSBidWZmZXItPnNpemUpCiAJCQlidWZmZXItPnN0b3AgPSAxOwotCQl9CiAJfQogCSpsaW5lID0gJ1wwJzsKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaW5mb19nZXRfbGluZSk7CisKIC8qKgogICogc25kX2luZm9fZ2V0X3N0ciAtIHBhcnNlIGEgc3RyaW5nIHRva2VuCiAgKiBAZGVzdDogdGhlIGJ1ZmZlciB0byBzdG9yZSB0aGUgc3RyaW5nIHRva2VuCkBAIC03MjMsNiArNzQwLDggQEAKIAlyZXR1cm4gc3JjOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pbmZvX2dldF9zdHIpOworCiAvKioKICAqIHNuZF9pbmZvX2NyZWF0ZV9lbnRyeSAtIGNyZWF0ZSBhbiBpbmZvIGVudHJ5CiAgKiBAbmFtZTogdGhlIHByb2MgZmlsZSBuYW1lCkBAIC03NzQsNiArNzkzLDggQEAKIAlyZXR1cm4gZW50cnk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeSk7CisKIC8qKgogICogc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkgLSBjcmVhdGUgYW4gaW5mbyBlbnRyeSBmb3IgdGhlIGdpdmVuIGNhcmQKICAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQpAQCAtNzk3LDYgKzgxOCw4IEBACiAJcmV0dXJuIGVudHJ5OwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KTsKKwogc3RhdGljIGludCBzbmRfaW5mb19kZXZfZnJlZV9lbnRyeShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnkgPSBkZXZpY2UtPmRldmljZV9kYXRhOwpAQCAtODY3LDYgKzg5MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfcHJvY19uZXcpOworCiAvKioKICAqIHNuZF9pbmZvX2ZyZWVfZW50cnkgLSByZWxlYXNlIHRoZSBpbmZvIGVudHJ5CiAgKiBAZW50cnk6IHRoZSBpbmZvIGVudHJ5CkBAIC04ODMsNiArOTA4LDggQEAKIAlrZnJlZShlbnRyeSk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2luZm9fZnJlZV9lbnRyeSk7CisKIC8qKgogICogc25kX2luZm9fcmVnaXN0ZXIgLSByZWdpc3RlciB0aGUgaW5mbyBlbnRyeQogICogQGVudHJ5OiB0aGUgaW5mbyBlbnRyeQpAQCAtOTEzLDYgKzk0MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2luZm9fcmVnaXN0ZXIpOworCiAvKioKICAqIHNuZF9pbmZvX3VucmVnaXN0ZXIgLSBkZS1yZWdpc3RlciB0aGUgaW5mbyBlbnRyeQogICogQGVudHJ5OiB0aGUgaW5mbyBlbnRyeQpAQCAtOTM3LDExICs5NjYsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaW5mb191bnJlZ2lzdGVyKTsKKwogLyoKIAogICovCiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF9pbmZvX3ZlcnNpb25fZW50cnkgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqc25kX2luZm9fdmVyc2lvbl9lbnRyeTsKIAogc3RhdGljIHZvaWQgc25kX2luZm9fdmVyc2lvbl9yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKIHsKQEAgLTk1OCw3ICs5ODksNiBAQAogCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgInZlcnNpb24iLCBOVUxMKTsKIAlpZiAoZW50cnkgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAyNTY7CiAJZW50cnktPmMudGV4dC5yZWFkID0gc25kX2luZm9fdmVyc2lvbl9yZWFkOwogCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pbmZvX29zcy5jIGIvc291bmQvY29yZS9pbmZvX29zcy5jCmluZGV4IGY5Y2U4NTQuLmJiMmM0MGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5mb19vc3MuYworKysgYi9zb3VuZC9jb3JlL2luZm9fb3NzLmMKQEAgLTY0LDYgKzY0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfb3NzX2luZm9fcmVnaXN0ZXIpOworCiBleHRlcm4gdm9pZCBzbmRfY2FyZF9pbmZvX3JlYWRfb3NzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcik7CiAKIHN0YXRpYyBpbnQgc25kX3NuZHN0YXRfc2hvd19zdHJpbmdzKHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZiwgY2hhciAqaWQsIGludCBkZXYpCkBAIC0xMTcsNyArMTE5LDYgQEAKIAogCW1lbXNldChzbmRfc25kc3RhdF9zdHJpbmdzLCAwLCBzaXplb2Yoc25kX3NuZHN0YXRfc3RyaW5ncykpOwogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfbW9kdWxlX2VudHJ5KFRISVNfTU9EVUxFLCAic25kc3RhdCIsIHNuZF9vc3Nfcm9vdCkpICE9IE5VTEwpIHsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAyMDQ4OwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfc25kc3RhdF9wcm9jX3JlYWQ7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvaW5pdC5jIGIvc291bmQvY29yZS9pbml0LmMKaW5kZXggMzllZDJlNS4uNGQ5MjU4OCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pbml0LmMKKysrIGIvc291bmQvY29yZS9pbml0LmMKQEAgLTM4LDEyICszOCwxNSBAQAogCXN0cnVjdCBzbmRfc2h1dGRvd25fZl9vcHMgKm5leHQ7CiB9OwogCi11bnNpZ25lZCBpbnQgc25kX2NhcmRzX2xvY2sgPSAwOwkvKiBsb2NrZWQgZm9yIHJlZ2lzdGVyaW5nL3VzaW5nICovCi1zdHJ1Y3Qgc25kX2NhcmQgKnNuZF9jYXJkc1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSBOVUxMfTsKLURFRklORV9SV0xPQ0soc25kX2NhcmRfcndsb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc25kX2NhcmRzX2xvY2s7CS8qIGxvY2tlZCBmb3IgcmVnaXN0ZXJpbmcvdXNpbmcgKi8KK3N0cnVjdCBzbmRfY2FyZCAqc25kX2NhcmRzW1NORFJWX0NBUkRTXTsKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRzKTsKKworc3RhdGljIERFRklORV9NVVRFWChzbmRfY2FyZF9tdXRleCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfTUlYRVJfT1NTX01PRFVMRSkKIGludCAoKnNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBmcmVlX2ZsYWcpOworRVhQT1JUX1NZTUJPTChzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUk9DX0ZTCkBAIC02Niw3ICs2OSw2IEBACiAJCXNuZF9wcmludGQoInVuYWJsZSB0byBjcmVhdGUgY2FyZCBlbnRyeVxuIik7CiAJCXJldHVybiBlcnI7CiAJfQotCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gUEFHRV9TSVpFOwogCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9jYXJkX2lkX3JlYWQ7CiAJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CkBAIC0xMTAsNyArMTEyLDcgQEAKIAkJc3RybGNweShjYXJkLT5pZCwgeGlkLCBzaXplb2YoY2FyZC0+aWQpKTsKIAl9CiAJZXJyID0gMDsKLQl3cml0ZV9sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAlpZiAoaWR4IDwgMCkgewogCQlpbnQgaWR4MjsKIAkJZm9yIChpZHgyID0gMDsgaWR4MiA8IFNORFJWX0NBUkRTOyBpZHgyKyspCkBAIC0xMjgsMTIgKzEzMCwxMiBAQAogCWVsc2UKIAkJZXJyID0gLUVOT0RFVjsKIAlpZiAoaWR4IDwgMCB8fCBlcnIgPCAwKSB7Ci0JCXdyaXRlX3VubG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgImNhbm5vdCBmaW5kIHRoZSBzbG90IGZvciBpbmRleCAlZCAocmFuZ2UgMC0laSlcbiIsIGlkeCwgc25kX2VjYXJkc19saW1pdCAtIDEpOwogCQlnb3RvIF9fZXJyb3I7CiAJfQogCXNuZF9jYXJkc19sb2NrIHw9IDEgPDwgaWR4OwkJLyogbG9jayBpdCAqLwotCXdyaXRlX3VubG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKIAljYXJkLT5udW1iZXIgPSBpZHg7CiAJY2FyZC0+bW9kdWxlID0gbW9kdWxlOwogCUlOSVRfTElTVF9IRUFEKCZjYXJkLT5kZXZpY2VzKTsKQEAgLTE2OSw2ICsxNzEsMTkgQEAKICAgICAgIAlyZXR1cm4gTlVMTDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9uZXcpOworCisvKiByZXR1cm4gbm9uLXplcm8gaWYgYSBjYXJkIGlzIGFscmVhZHkgbG9ja2VkICovCitpbnQgc25kX2NhcmRfbG9ja2VkKGludCBjYXJkKQoreworCWludCBsb2NrZWQ7CisKKwltdXRleF9sb2NrKCZzbmRfY2FyZF9tdXRleCk7CisJbG9ja2VkID0gc25kX2NhcmRzX2xvY2sgJiAoMSA8PCBjYXJkKTsKKwltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKKwlyZXR1cm4gbG9ja2VkOworfQorCiBzdGF0aWMgbG9mZl90IHNuZF9kaXNjb25uZWN0X2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWcpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC0yMzYsOSArMjUxLDkgQEAKIAlzcGluX3VubG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAKIAkvKiBwaGFzZSAxOiBkaXNhYmxlIGZvcHMgKHVzZXIgc3BhY2UpIG9wZXJhdGlvbnMgZm9yIEFMU0EgQVBJICovCi0Jd3JpdGVfbG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwltdXRleF9sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJc25kX2NhcmRzW2NhcmQtPm51bWJlcl0gPSBOVUxMOwotCXdyaXRlX3VubG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKIAkKIAkvKiBwaGFzZSAyOiByZXBsYWNlIGZpbGUtPmZfb3Agd2l0aCBzcGVjaWFsIGR1bW15IG9wZXJhdGlvbnMgKi8KIAkKQEAgLTI5OCw2ICszMTMsOCBAQAogCXJldHVybiAwOwkKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9kaXNjb25uZWN0KTsKKwogLyoqCiAgKiAgc25kX2NhcmRfZnJlZSAtIGZyZWVzIGdpdmVuIHNvdW5kY2FyZCBzdHJ1Y3R1cmUKICAqICBAY2FyZDogc291bmRjYXJkIHN0cnVjdHVyZQpAQCAtMzE1LDkgKzMzMiw5IEBACiAKIAlpZiAoY2FyZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl3cml0ZV9sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAlzbmRfY2FyZHNbY2FyZC0+bnVtYmVyXSA9IE5VTEw7Ci0Jd3JpdGVfdW5sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwogCiAjaWZkZWYgQ09ORklHX1BNCiAJd2FrZV91cCgmY2FyZC0+cG93ZXJfc2xlZXApOwpAQCAtMzUzLDEzICszNzAsMTUgQEAKIAkJY2FyZC0+c19mX29wcyA9IHNfZl9vcHMtPm5leHQ7CiAJCWtmcmVlKHNfZl9vcHMpOwogCX0KLQl3cml0ZV9sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAlzbmRfY2FyZHNfbG9jayAmPSB+KDEgPDwgY2FyZC0+bnVtYmVyKTsKLQl3cml0ZV91bmxvY2soJnNuZF9jYXJkX3J3bG9jayk7CisJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJa2ZyZWUoY2FyZCk7CiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfZnJlZSk7CisKIHN0YXRpYyB2b2lkIHNuZF9jYXJkX2ZyZWVfdGhyZWFkKHZvaWQgKiBfX2NhcmQpCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gX19jYXJkOwpAQCAtNDA1LDYgKzQyNCw4IEBACiAJcmV0dXJuIC1FRkFVTFQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2NhcmRfZnJlZV9pbl90aHJlYWQpOworCiBzdGF0aWMgdm9pZCBjaG9vc2VfZGVmYXVsdF9pZChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCiB7CiAJaW50IGksIGxlbiwgaWR4X2ZsYWcgPSAwLCBsb29wcyA9IFNORFJWX0NBUkRTOwpAQCAtNDg3LDE2ICs1MDgsMTYgQEAKIAlzbmRfYXNzZXJ0KGNhcmQgIT0gTlVMTCwgcmV0dXJuIC1FSU5WQUwpOwogCWlmICgoZXJyID0gc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoY2FyZCkpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQl3cml0ZV9sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAlpZiAoc25kX2NhcmRzW2NhcmQtPm51bWJlcl0pIHsKIAkJLyogYWxyZWFkeSByZWdpc3RlcmVkICovCi0JCXdyaXRlX3VubG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwkJbXV0ZXhfdW5sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoY2FyZC0+aWRbMF0gPT0gJ1wwJykKIAkJY2hvb3NlX2RlZmF1bHRfaWQoY2FyZCk7CiAJc25kX2NhcmRzW2NhcmQtPm51bWJlcl0gPSBjYXJkOwotCXdyaXRlX3VubG9jaygmc25kX2NhcmRfcndsb2NrKTsKKwltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKIAlpbml0X2luZm9fZm9yX2NhcmQoY2FyZCk7CiAjaWYgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX01JWEVSX09TU19NT0RVTEUpCiAJaWYgKHNuZF9taXhlcl9vc3Nfbm90aWZ5X2NhbGxiYWNrKQpAQCAtNTA1LDggKzUyNiwxMCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9jYXJkX3JlZ2lzdGVyKTsKKwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCi1zdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfY2FyZF9pbmZvX2VudHJ5ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF9jYXJkX2luZm9fZW50cnk7CiAKIHN0YXRpYyB2b2lkIHNuZF9jYXJkX2luZm9fcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAogCQkJICAgICAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKQEAgLTUxNSw3ICs1MzgsNyBAQAogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAogCWZvciAoaWR4ID0gY291bnQgPSAwOyBpZHggPCBTTkRSVl9DQVJEUzsgaWR4KyspIHsKLQkJcmVhZF9sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCQltdXRleF9sb2NrKCZzbmRfY2FyZF9tdXRleCk7CiAJCWlmICgoY2FyZCA9IHNuZF9jYXJkc1tpZHhdKSAhPSBOVUxMKSB7CiAJCQljb3VudCsrOwogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiJTJpIFslLTE1c106ICVzIC0gJXNcbiIsCkBAIC01MjYsNyArNTQ5LDcgQEAKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgICAgICAgICAgICAgICAgICAgICAlc1xuIiwKIAkJCQkJY2FyZC0+bG9uZ25hbWUpOwogCQl9Ci0JCXJlYWRfdW5sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCQltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKIAl9CiAJaWYgKCFjb3VudCkKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiLS0tIG5vIHNvdW5kY2FyZHMgLS0tXG4iKTsKQEAgLTU0MCwxMiArNTYzLDEyIEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCiAJZm9yIChpZHggPSBjb3VudCA9IDA7IGlkeCA8IFNORFJWX0NBUkRTOyBpZHgrKykgewotCQlyZWFkX2xvY2soJnNuZF9jYXJkX3J3bG9jayk7CisJCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAkJaWYgKChjYXJkID0gc25kX2NhcmRzW2lkeF0pICE9IE5VTEwpIHsKIAkJCWNvdW50Kys7CiAJCQlzbmRfaXByaW50ZihidWZmZXIsICIlc1xuIiwgY2FyZC0+bG9uZ25hbWUpOwogCQl9Ci0JCXJlYWRfdW5sb2NrKCZzbmRfY2FyZF9yd2xvY2spOworCQltdXRleF91bmxvY2soJnNuZF9jYXJkX211dGV4KTsKIAl9CiAJaWYgKCFjb3VudCkgewogCQlzbmRfaXByaW50ZihidWZmZXIsICItLS0gbm8gc291bmRjYXJkcyAtLS1cbiIpOwpAQCAtNTYzLDExICs1ODYsMTEgQEAKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IFNORFJWX0NBUkRTOyBpZHgrKykgewotCQlyZWFkX2xvY2soJnNuZF9jYXJkX3J3bG9jayk7CisJCW11dGV4X2xvY2soJnNuZF9jYXJkX211dGV4KTsKIAkJaWYgKChjYXJkID0gc25kX2NhcmRzW2lkeF0pICE9IE5VTEwpCiAJCQlzbmRfaXByaW50ZihidWZmZXIsICIlMmkgJXNcbiIsCiAJCQkJICAgIGlkeCwgY2FyZC0+bW9kdWxlLT5uYW1lKTsKLQkJcmVhZF91bmxvY2soJnNuZF9jYXJkX3J3bG9jayk7CisJCW11dGV4X3VubG9jaygmc25kX2NhcmRfbXV0ZXgpOwogCX0KIH0KICNlbmRpZgpAQCAtNTc5LDcgKzYwMiw2IEBACiAJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfbW9kdWxlX2VudHJ5KFRISVNfTU9EVUxFLCAiY2FyZHMiLCBOVUxMKTsKIAlpZiAoISBlbnRyeSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSBQQUdFX1NJWkU7CiAJZW50cnktPmMudGV4dC5yZWFkID0gc25kX2NhcmRfaW5mb19yZWFkOwogCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpAQCAtNTkwLDcgKzYxMiw2IEBACiAjaWZkZWYgTU9EVUxFCiAJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfbW9kdWxlX2VudHJ5KFRISVNfTU9EVUxFLCAibW9kdWxlcyIsIE5VTEwpOwogCWlmIChlbnRyeSkgewotCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IFBBR0VfU0laRTsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gc25kX2NhcmRfbW9kdWxlX2luZm9fcmVhZDsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApCiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKQEAgLTY0NCw2ICs2NjUsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9jb21wb25lbnRfYWRkKTsKKwogLyoqCiAgKiAgc25kX2NhcmRfZmlsZV9hZGQgLSBhZGQgdGhlIGZpbGUgdG8gdGhlIGZpbGUgbGlzdCBvZiB0aGUgY2FyZAogICogIEBjYXJkOiBzb3VuZGNhcmQgc3RydWN0dXJlCkBAIC02NzYsNiArNjk5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9maWxlX2FkZCk7CisKIC8qKgogICogIHNuZF9jYXJkX2ZpbGVfcmVtb3ZlIC0gcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIGZpbGUgbGlzdAogICogIEBjYXJkOiBzb3VuZGNhcmQgc3RydWN0dXJlCkBAIC03MTcsNiArNzQyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9maWxlX3JlbW92ZSk7CisKICNpZmRlZiBDT05GSUdfUE0KIC8qKgogICogIHNuZF9wb3dlcl93YWl0IC0gd2FpdCB1bnRpbCB0aGUgcG93ZXItc3RhdGUgaXMgY2hhbmdlZC4KQEAgLTc1Myw0ICs3ODAsNSBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3Bvd2VyX3dhaXQpOwogI2VuZGlmIC8qIENPTkZJR19QTSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9pc2FkbWEuYyBiL3NvdW5kL2NvcmUvaXNhZG1hLmMKaW5kZXggMWEzNzg5NS4uZDUyMzk4NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9pc2FkbWEuYworKysgYi9zb3VuZC9jb3JlL2lzYWRtYS5jCkBAIC01Niw2ICs1Niw4IEBACiAJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2RtYV9wcm9ncmFtKTsKKwogLyoqCiAgKiBzbmRfZG1hX2Rpc2FibGUgLSBzdG9wIHRoZSBJU0EgRE1BIHRyYW5zZmVyCiAgKiBAZG1hOiB0aGUgZG1hIG51bWJlcgpAQCAtNzIsNiArNzQsOCBAQAogCXJlbGVhc2VfZG1hX2xvY2soZmxhZ3MpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9kbWFfZGlzYWJsZSk7CisKIC8qKgogICogc25kX2RtYV9wb2ludGVyIC0gcmV0dXJuIHRoZSBjdXJyZW50IHBvaW50ZXIgdG8gRE1BIHRyYW5zZmVyIGJ1ZmZlciBpbiBieXRlcwogICogQGRtYTogdGhlIGRtYSBudW1iZXIKQEAgLTEwMSwzICsxMDUsNSBAQAogCWVsc2UKIAkJcmV0dXJuIHNpemUgLSByZXN1bHQ7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX2RtYV9wb2ludGVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvbWVtb3J5LmMgYi9zb3VuZC9jb3JlL21lbW9yeS5jCmluZGV4IDg2MmQ2MmQuLmZlNTk4NTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9tZW1vcnkuYwpAQCAtMjEsNiArMjEsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC01NSw2ICs1Niw4IEBACiAjZW5kaWYKIH0KIAorRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfZnJvbWlvKTsKKwogLyoqCiAgKiBjb3B5X2Zyb21fdXNlcl90b2lvIC0gY29weSBkYXRhIGZyb20gdXNlci1zcGFjZSB0byBtbWlvLXNwYWNlCiAgKiBAZHN0OiB0aGUgZGVzdGluYXRpb24gcG9pbnRlciBvbiBtbWlvLXNwYWNlCkBAIC04NSwzICs4OCw1IEBACiAJcmV0dXJuIDA7CiAjZW5kaWYKIH0KKworRVhQT1JUX1NZTUJPTChjb3B5X2Zyb21fdXNlcl90b2lvKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvbWlzYy5jIGIvc291bmQvY29yZS9taXNjLmMKaW5kZXggYjUzZTU2My4uMDNmYzcxMSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9taXNjLmMKKysrIGIvc291bmQvY29yZS9taXNjLmMKQEAgLTM0LDYgKzM0LDggQEAKIAl9CiB9CiAKK0VYUE9SVF9TWU1CT0wocmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZSk7CisKICNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCiB2b2lkIHNuZF92ZXJib3NlX3ByaW50ayhjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCiB7CkBAIC01MSw2ICs1Myw4IEBACiAJdnByaW50ayhmb3JtYXQsIGFyZ3MpOwogCXZhX2VuZChhcmdzKTsKIH0KKworRVhQT1JUX1NZTUJPTChzbmRfdmVyYm9zZV9wcmludGspOwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USykKQEAgLTcxLDQgKzc1LDYgQEAKIAl2YV9lbmQoYXJncyk7CiAKIH0KKworRVhQT1JUX1NZTUJPTChzbmRfdmVyYm9zZV9wcmludGQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jCmluZGV4IDljNjhiYzMuLjcxYjUwODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL21peGVyX29zcy5jCkBAIC0xMTgyLDkgKzExODIsNyBAQAogCQlyZXR1cm47CiAJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKIAllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKLQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDgxOTI7CiAJZW50cnktPmMudGV4dC5yZWFkID0gc25kX21peGVyX29zc19wcm9jX3JlYWQ7Ci0JZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gODE5MjsKIAllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX21peGVyX29zc19wcm9jX3dyaXRlOwogCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBtaXhlcjsKIAlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jIGIvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCmluZGV4IGFjOTkwYmYuLmY1ZmY0ZjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9wY21fb3NzLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogI2RlZmluZSBPU1NfQUxTQUVNVUxWRVIJCV9TSU9SICgnTScsIDI0OSwgaW50KQogCi1zdGF0aWMgaW50IGRzcF9tYXBbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gMH07CitzdGF0aWMgaW50IGRzcF9tYXBbU05EUlZfQ0FSRFNdOwogc3RhdGljIGludCBhZHNwX21hcFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSAxfTsKIHN0YXRpYyBpbnQgbm9uYmxvY2tfb3BlbiA9IDE7CiAKQEAgLTc4LDYgKzc4LDQ4NyBAQAogCXNldF9mcyhmcyk7CiB9CiAKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb25zIHRvIHByb2Nlc3MgaHdfcGFyYW1zCisgKi8KK3N0YXRpYyBpbnQgc25kX2ludGVydmFsX3JlZmluZV9taW4oc3RydWN0IHNuZF9pbnRlcnZhbCAqaSwgdW5zaWduZWQgaW50IG1pbiwgaW50IG9wZW5taW4pCit7CisJaW50IGNoYW5nZWQgPSAwOworCWlmIChpLT5taW4gPCBtaW4pIHsKKwkJaS0+bWluID0gbWluOworCQlpLT5vcGVubWluID0gb3Blbm1pbjsKKwkJY2hhbmdlZCA9IDE7CisJfSBlbHNlIGlmIChpLT5taW4gPT0gbWluICYmICFpLT5vcGVubWluICYmIG9wZW5taW4pIHsKKwkJaS0+b3Blbm1pbiA9IDE7CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAoaS0+aW50ZWdlcikgeworCQlpZiAoaS0+b3Blbm1pbikgeworCQkJaS0+bWluKys7CisJCQlpLT5vcGVubWluID0gMDsKKwkJfQorCX0KKwlpZiAoc25kX2ludGVydmFsX2NoZWNrZW1wdHkoaSkpIHsKKwkJc25kX2ludGVydmFsX25vbmUoaSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gY2hhbmdlZDsKK30KKworc3RhdGljIGludCBzbmRfaW50ZXJ2YWxfcmVmaW5lX21heChzdHJ1Y3Qgc25kX2ludGVydmFsICppLCB1bnNpZ25lZCBpbnQgbWF4LCBpbnQgb3Blbm1heCkKK3sKKwlpbnQgY2hhbmdlZCA9IDA7CisJaWYgKGktPm1heCA+IG1heCkgeworCQlpLT5tYXggPSBtYXg7CisJCWktPm9wZW5tYXggPSBvcGVubWF4OworCQljaGFuZ2VkID0gMTsKKwl9IGVsc2UgaWYgKGktPm1heCA9PSBtYXggJiYgIWktPm9wZW5tYXggJiYgb3Blbm1heCkgeworCQlpLT5vcGVubWF4ID0gMTsKKwkJY2hhbmdlZCA9IDE7CisJfQorCWlmIChpLT5pbnRlZ2VyKSB7CisJCWlmIChpLT5vcGVubWF4KSB7CisJCQlpLT5tYXgtLTsKKwkJCWktPm9wZW5tYXggPSAwOworCQl9CisJfQorCWlmIChzbmRfaW50ZXJ2YWxfY2hlY2tlbXB0eShpKSkgeworCQlzbmRfaW50ZXJ2YWxfbm9uZShpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBjaGFuZ2VkOworfQorCitzdGF0aWMgaW50IHNuZF9pbnRlcnZhbF9yZWZpbmVfc2V0KHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmksIHVuc2lnbmVkIGludCB2YWwpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCB0OworCXQuZW1wdHkgPSAwOworCXQubWluID0gdC5tYXggPSB2YWw7CisJdC5vcGVubWluID0gdC5vcGVubWF4ID0gMDsKKwl0LmludGVnZXIgPSAxOworCXJldHVybiBzbmRfaW50ZXJ2YWxfcmVmaW5lKGksICZ0KTsKK30KKworLyoqCisgKiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21pbgorICogQHBhcmFtczogdGhlIGh3X3BhcmFtcyBpbnN0YW5jZQorICogQHZhcjogcGFyYW1ldGVyIHRvIHJldHJpZXZlCisgKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAorICoKKyAqIFJldHVybiB0aGUgbWluaW11bSB2YWx1ZSBmb3IgZmllbGQgUEFSLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21pbihjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIGludCAqZGlyKQoreworCWlmIChod19pc19tYXNrKHZhcikpIHsKKwkJaWYgKGRpcikKKwkJCSpkaXIgPSAwOworCQlyZXR1cm4gc25kX21hc2tfbWluKGh3X3BhcmFtX21hc2tfYyhwYXJhbXMsIHZhcikpOworCX0KKwlpZiAoaHdfaXNfaW50ZXJ2YWwodmFyKSkgeworCQljb25zdCBzdHJ1Y3Qgc25kX2ludGVydmFsICppID0gaHdfcGFyYW1faW50ZXJ2YWxfYyhwYXJhbXMsIHZhcik7CisJCWlmIChkaXIpCisJCQkqZGlyID0gaS0+b3Blbm1pbjsKKwkJcmV0dXJuIHNuZF9pbnRlcnZhbF9taW4oaSk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWF4CisgKiBAcGFyYW1zOiB0aGUgaHdfcGFyYW1zIGluc3RhbmNlCisgKiBAdmFyOiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKKyAqIEBkaXI6IHBvaW50ZXIgdG8gdGhlIGRpcmVjdGlvbiAoLTEsMCwxKSBvciBOVUxMCisgKgorICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBmaWVsZCBQQVIuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NuZF9wY21faHdfcGFyYW1fdmFsdWVfbWF4KGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJICAgc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpCit7CisJaWYgKGh3X2lzX21hc2sodmFyKSkgeworCQlpZiAoZGlyKQorCQkJKmRpciA9IDA7CisJCXJldHVybiBzbmRfbWFza19tYXgoaHdfcGFyYW1fbWFza19jKHBhcmFtcywgdmFyKSk7CisJfQorCWlmIChod19pc19pbnRlcnZhbCh2YXIpKSB7CisJCWNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkgPSBod19wYXJhbV9pbnRlcnZhbF9jKHBhcmFtcywgdmFyKTsKKwkJaWYgKGRpcikKKwkJCSpkaXIgPSAtIChpbnQpIGktPm9wZW5tYXg7CisJCXJldHVybiBzbmRfaW50ZXJ2YWxfbWF4KGkpOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBfc25kX3BjbV9od19wYXJhbV9tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwKKwkJCQkgIGNvbnN0IHN0cnVjdCBzbmRfbWFzayAqdmFsKQoreworCWludCBjaGFuZ2VkOworCWNoYW5nZWQgPSBzbmRfbWFza19yZWZpbmUoaHdfcGFyYW1fbWFzayhwYXJhbXMsIHZhciksIHZhbCk7CisJaWYgKGNoYW5nZWQpIHsKKwkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IHZhcjsKKwkJcGFyYW1zLT5ybWFzayB8PSAxIDw8IHZhcjsKKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX3BjbV9od19wYXJhbV9tYXNrKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLAorCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgc25kX3BjbV9od19wYXJhbV90IHZhciwKKwkJCQkgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2YWwpCit7CisJaW50IGNoYW5nZWQgPSBfc25kX3BjbV9od19wYXJhbV9tYXNrKHBhcmFtcywgdmFyLCB2YWwpOworCWlmIChjaGFuZ2VkIDwgMCkKKwkJcmV0dXJuIGNoYW5nZWQ7CisJaWYgKHBhcmFtcy0+cm1hc2spIHsKKwkJaW50IGVyciA9IHNuZF9wY21faHdfcmVmaW5lKHBjbSwgcGFyYW1zKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc25kX3BjbV9od19wYXJhbV9taW4oc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCB2YWwsCisJCQkJIGludCBkaXIpCit7CisJaW50IGNoYW5nZWQ7CisJaW50IG9wZW4gPSAwOworCWlmIChkaXIpIHsKKwkJaWYgKGRpciA+IDApIHsKKwkJCW9wZW4gPSAxOworCQl9IGVsc2UgaWYgKGRpciA8IDApIHsKKwkJCWlmICh2YWwgPiAwKSB7CisJCQkJb3BlbiA9IDE7CisJCQkJdmFsLS07CisJCQl9CisJCX0KKwl9CisJaWYgKGh3X2lzX21hc2sodmFyKSkKKwkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZV9taW4oaHdfcGFyYW1fbWFzayhwYXJhbXMsIHZhciksCisJCQkJCSAgICAgIHZhbCArICEhb3Blbik7CisJZWxzZSBpZiAoaHdfaXNfaW50ZXJ2YWwodmFyKSkKKwkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmVfbWluKGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgdmFyKSwKKwkJCQkJCSAgdmFsLCBvcGVuKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGFuZ2VkKSB7CisJCXBhcmFtcy0+Y21hc2sgfD0gMSA8PCB2YXI7CisJCXBhcmFtcy0+cm1hc2sgfD0gMSA8PCB2YXI7CisJfQorCXJldHVybiBjaGFuZ2VkOworfQorCisvKioKKyAqIHNuZF9wY21faHdfcGFyYW1fbWluCisgKiBAcGNtOiBQQ00gaW5zdGFuY2UKKyAqIEBwYXJhbXM6IHRoZSBod19wYXJhbXMgaW5zdGFuY2UKKyAqIEB2YXI6IHBhcmFtZXRlciB0byByZXRyaWV2ZQorICogQHZhbDogbWluaW1hbCB2YWx1ZQorICogQGRpcjogcG9pbnRlciB0byB0aGUgZGlyZWN0aW9uICgtMSwwLDEpIG9yIE5VTEwKKyAqCisgKiBJbnNpZGUgY29uZmlndXJhdGlvbiBzcGFjZSBkZWZpbmVkIGJ5IFBBUkFNUyByZW1vdmUgZnJvbSBQQVIgYWxsIAorICogdmFsdWVzIDwgVkFMLiBSZWR1Y2UgY29uZmlndXJhdGlvbiBzcGFjZSBhY2NvcmRpbmdseS4KKyAqIFJldHVybiBuZXcgbWluaW11bSBvciAtRUlOVkFMIGlmIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbnQgc25kX3BjbV9od19wYXJhbV9taW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJc25kX3BjbV9od19wYXJhbV90IHZhciwgdW5zaWduZWQgaW50IHZhbCwKKwkJCQlpbnQgKmRpcikKK3sKKwlpbnQgY2hhbmdlZCA9IF9zbmRfcGNtX2h3X3BhcmFtX21pbihwYXJhbXMsIHZhciwgdmFsLCBkaXIgPyAqZGlyIDogMCk7CisJaWYgKGNoYW5nZWQgPCAwKQorCQlyZXR1cm4gY2hhbmdlZDsKKwlpZiAocGFyYW1zLT5ybWFzaykgeworCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21pbihwYXJhbXMsIHZhciwgZGlyKTsKK30KKworc3RhdGljIGludCBfc25kX3BjbV9od19wYXJhbV9tYXgoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCB2YWwsCisJCQkJIGludCBkaXIpCit7CisJaW50IGNoYW5nZWQ7CisJaW50IG9wZW4gPSAwOworCWlmIChkaXIpIHsKKwkJaWYgKGRpciA8IDApIHsKKwkJCW9wZW4gPSAxOworCQl9IGVsc2UgaWYgKGRpciA+IDApIHsKKwkJCW9wZW4gPSAxOworCQkJdmFsKys7CisJCX0KKwl9CisJaWYgKGh3X2lzX21hc2sodmFyKSkgeworCQlpZiAodmFsID09IDAgJiYgb3BlbikgeworCQkJc25kX21hc2tfbm9uZShod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKSk7CisJCQljaGFuZ2VkID0gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQljaGFuZ2VkID0gc25kX21hc2tfcmVmaW5lX21heChod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKSwKKwkJCQkJCSAgICAgIHZhbCAtICEhb3Blbik7CisJfSBlbHNlIGlmIChod19pc19pbnRlcnZhbCh2YXIpKQorCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZV9tYXgoaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCB2YXIpLAorCQkJCQkJICB2YWwsIG9wZW4pOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNoYW5nZWQpIHsKKwkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IHZhcjsKKwkJcGFyYW1zLT5ybWFzayB8PSAxIDw8IHZhcjsKKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qKgorICogc25kX3BjbV9od19wYXJhbV9tYXgKKyAqIEBwY206IFBDTSBpbnN0YW5jZQorICogQHBhcmFtczogdGhlIGh3X3BhcmFtcyBpbnN0YW5jZQorICogQHZhcjogcGFyYW1ldGVyIHRvIHJldHJpZXZlCisgKiBAdmFsOiBtYXhpbWFsIHZhbHVlCisgKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAorICoKKyAqIEluc2lkZSBjb25maWd1cmF0aW9uIHNwYWNlIGRlZmluZWQgYnkgUEFSQU1TIHJlbW92ZSBmcm9tIFBBUiBhbGwgCisgKiAgdmFsdWVzID49IFZBTCArIDEuIFJlZHVjZSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY29yZGluZ2x5LgorICogIFJldHVybiBuZXcgbWF4aW11bSBvciAtRUlOVkFMIGlmIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbnQgc25kX3BjbV9od19wYXJhbV9tYXgoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sCisJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJc25kX3BjbV9od19wYXJhbV90IHZhciwgdW5zaWduZWQgaW50IHZhbCwKKwkJCQlpbnQgKmRpcikKK3sKKwlpbnQgY2hhbmdlZCA9IF9zbmRfcGNtX2h3X3BhcmFtX21heChwYXJhbXMsIHZhciwgdmFsLCBkaXIgPyAqZGlyIDogMCk7CisJaWYgKGNoYW5nZWQgPCAwKQorCQlyZXR1cm4gY2hhbmdlZDsKKwlpZiAocGFyYW1zLT5ybWFzaykgeworCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21heChwYXJhbXMsIHZhciwgZGlyKTsKK30KKworc3RhdGljIGludCBib3VuZGFyeV9zdWIoaW50IGEsIGludCBhZGlyLAorCQkJaW50IGIsIGludCBiZGlyLAorCQkJaW50ICpjLCBpbnQgKmNkaXIpCit7CisJYWRpciA9IGFkaXIgPCAwID8gLTEgOiAoYWRpciA+IDAgPyAxIDogMCk7CisJYmRpciA9IGJkaXIgPCAwID8gLTEgOiAoYmRpciA+IDAgPyAxIDogMCk7CisJKmMgPSBhIC0gYjsKKwkqY2RpciA9IGFkaXIgLSBiZGlyOworCWlmICgqY2RpciA9PSAtMikgeworCQkoKmMpLS07CisJfSBlbHNlIGlmICgqY2RpciA9PSAyKSB7CisJCSgqYykrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYm91bmRhcnlfbHQodW5zaWduZWQgaW50IGEsIGludCBhZGlyLAorCQkgICAgICAgdW5zaWduZWQgaW50IGIsIGludCBiZGlyKQoreworCWlmIChhZGlyIDwgMCkgeworCQlhLS07CisJCWFkaXIgPSAxOworCX0gZWxzZSBpZiAoYWRpciA+IDApCisJCWFkaXIgPSAxOworCWlmIChiZGlyIDwgMCkgeworCQliLS07CisJCWJkaXIgPSAxOworCX0gZWxzZSBpZiAoYmRpciA+IDApCisJCWJkaXIgPSAxOworCXJldHVybiBhIDwgYiB8fCAoYSA9PSBiICYmIGFkaXIgPCBiZGlyKTsKK30KKworLyogUmV0dXJuIDEgaWYgbWluIGlzIG5lYXJlciB0byBiZXN0IHRoYW4gbWF4ICovCitzdGF0aWMgaW50IGJvdW5kYXJ5X25lYXJlcihpbnQgbWluLCBpbnQgbWluZGlyLAorCQkJICAgaW50IGJlc3QsIGludCBiZXN0ZGlyLAorCQkJICAgaW50IG1heCwgaW50IG1heGRpcikKK3sKKwlpbnQgZG1pbiwgZG1pbmRpcjsKKwlpbnQgZG1heCwgZG1heGRpcjsKKwlib3VuZGFyeV9zdWIoYmVzdCwgYmVzdGRpciwgbWluLCBtaW5kaXIsICZkbWluLCAmZG1pbmRpcik7CisJYm91bmRhcnlfc3ViKG1heCwgbWF4ZGlyLCBiZXN0LCBiZXN0ZGlyLCAmZG1heCwgJmRtYXhkaXIpOworCXJldHVybiBib3VuZGFyeV9sdChkbWluLCBkbWluZGlyLCBkbWF4LCBkbWF4ZGlyKTsKK30KKworLyoqCisgKiBzbmRfcGNtX2h3X3BhcmFtX25lYXIKKyAqIEBwY206IFBDTSBpbnN0YW5jZQorICogQHBhcmFtczogdGhlIGh3X3BhcmFtcyBpbnN0YW5jZQorICogQHZhcjogcGFyYW1ldGVyIHRvIHJldHJpZXZlCisgKiBAYmVzdDogdmFsdWUgdG8gc2V0CisgKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAorICoKKyAqIEluc2lkZSBjb25maWd1cmF0aW9uIHNwYWNlIGRlZmluZWQgYnkgUEFSQU1TIHNldCBQQVIgdG8gdGhlIGF2YWlsYWJsZSB2YWx1ZQorICogbmVhcmVzdCB0byBWQUwuIFJlZHVjZSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY29yZGluZ2x5LgorICogVGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgY2FsbGVkIGZvciBTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTLAorICogU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwgU05EUlZfUENNX0hXX1BBUkFNX1NVQkZPUk1BVC4KKyAqIFJldHVybiB0aGUgdmFsdWUgZm91bmQuCisgICovCitzdGF0aWMgaW50IHNuZF9wY21faHdfcGFyYW1fbmVhcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCBiZXN0LAorCQkJCSBpbnQgKmRpcikKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnNhdmUgPSBOVUxMOworCWludCB2OworCXVuc2lnbmVkIGludCBzYXZlZF9taW47CisJaW50IGxhc3QgPSAwOworCWludCBtaW4sIG1heDsKKwlpbnQgbWluZGlyLCBtYXhkaXI7CisJaW50IHZhbGRpciA9IGRpciA/ICpkaXIgOiAwOworCS8qIEZJWE1FICovCisJaWYgKGJlc3QgPiBJTlRfTUFYKQorCQliZXN0ID0gSU5UX01BWDsKKwltaW4gPSBtYXggPSBiZXN0OworCW1pbmRpciA9IG1heGRpciA9IHZhbGRpcjsKKwlpZiAobWF4ZGlyID4gMCkKKwkJbWF4ZGlyID0gMDsKKwllbHNlIGlmIChtYXhkaXIgPT0gMCkKKwkJbWF4ZGlyID0gLTE7CisJZWxzZSB7CisJCW1heGRpciA9IDE7CisJCW1heC0tOworCX0KKwlzYXZlID0ga21hbGxvYyhzaXplb2YoKnNhdmUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2F2ZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqc2F2ZSA9ICpwYXJhbXM7CisJc2F2ZWRfbWluID0gbWluOworCW1pbiA9IHNuZF9wY21faHdfcGFyYW1fbWluKHBjbSwgcGFyYW1zLCB2YXIsIG1pbiwgJm1pbmRpcik7CisJaWYgKG1pbiA+PSAwKSB7CisJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zMTsKKwkJaWYgKG1heCA8IDApCisJCQlnb3RvIF9lbmQ7CisJCWlmICgodW5zaWduZWQgaW50KW1pbiA9PSBzYXZlZF9taW4gJiYgbWluZGlyID09IHZhbGRpcikKKwkJCWdvdG8gX2VuZDsKKwkJcGFyYW1zMSA9IGttYWxsb2Moc2l6ZW9mKCpwYXJhbXMxKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwYXJhbXMxID09IE5VTEwpIHsKKwkJCWtmcmVlKHNhdmUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJKnBhcmFtczEgPSAqc2F2ZTsKKwkJbWF4ID0gc25kX3BjbV9od19wYXJhbV9tYXgocGNtLCBwYXJhbXMxLCB2YXIsIG1heCwgJm1heGRpcik7CisJCWlmIChtYXggPCAwKSB7CisJCQlrZnJlZShwYXJhbXMxKTsKKwkJCWdvdG8gX2VuZDsKKwkJfQorCQlpZiAoYm91bmRhcnlfbmVhcmVyKG1heCwgbWF4ZGlyLCBiZXN0LCB2YWxkaXIsIG1pbiwgbWluZGlyKSkgeworCQkJKnBhcmFtcyA9ICpwYXJhbXMxOworCQkJbGFzdCA9IDE7CisJCX0KKwkJa2ZyZWUocGFyYW1zMSk7CisJfSBlbHNlIHsKKwkJKnBhcmFtcyA9ICpzYXZlOworCQltYXggPSBzbmRfcGNtX2h3X3BhcmFtX21heChwY20sIHBhcmFtcywgdmFyLCBtYXgsICZtYXhkaXIpOworCQlzbmRfYXNzZXJ0KG1heCA+PSAwLCByZXR1cm4gLUVJTlZBTCk7CisJCWxhc3QgPSAxOworCX0KKyBfZW5kOgorIAlrZnJlZShzYXZlKTsKKwlpZiAobGFzdCkKKwkJdiA9IHNuZF9wY21faHdfcGFyYW1fbGFzdChwY20sIHBhcmFtcywgdmFyLCBkaXIpOworCWVsc2UKKwkJdiA9IHNuZF9wY21faHdfcGFyYW1fZmlyc3QocGNtLCBwYXJhbXMsIHZhciwgZGlyKTsKKwlzbmRfYXNzZXJ0KHYgPj0gMCwgcmV0dXJuIC1FSU5WQUwpOworCXJldHVybiB2OworfQorCitzdGF0aWMgaW50IF9zbmRfcGNtX2h3X3BhcmFtX3NldChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgc25kX3BjbV9od19wYXJhbV90IHZhciwgdW5zaWduZWQgaW50IHZhbCwKKwkJCQkgaW50IGRpcikKK3sKKwlpbnQgY2hhbmdlZDsKKwlpZiAoaHdfaXNfbWFzayh2YXIpKSB7CisJCXN0cnVjdCBzbmRfbWFzayAqbSA9IGh3X3BhcmFtX21hc2socGFyYW1zLCB2YXIpOworCQlpZiAodmFsID09IDAgJiYgZGlyIDwgMCkgeworCQkJY2hhbmdlZCA9IC1FSU5WQUw7CisJCQlzbmRfbWFza19ub25lKG0pOworCQl9IGVsc2UgeworCQkJaWYgKGRpciA+IDApCisJCQkJdmFsKys7CisJCQllbHNlIGlmIChkaXIgPCAwKQorCQkJCXZhbC0tOworCQkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZV9zZXQoaHdfcGFyYW1fbWFzayhwYXJhbXMsIHZhciksIHZhbCk7CisJCX0KKwl9IGVsc2UgaWYgKGh3X2lzX2ludGVydmFsKHZhcikpIHsKKwkJc3RydWN0IHNuZF9pbnRlcnZhbCAqaSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgdmFyKTsKKwkJaWYgKHZhbCA9PSAwICYmIGRpciA8IDApIHsKKwkJCWNoYW5nZWQgPSAtRUlOVkFMOworCQkJc25kX2ludGVydmFsX25vbmUoaSk7CisJCX0gZWxzZSBpZiAoZGlyID09IDApCisJCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZV9zZXQoaSwgdmFsKTsKKwkJZWxzZSB7CisJCQlzdHJ1Y3Qgc25kX2ludGVydmFsIHQ7CisJCQl0Lm9wZW5taW4gPSAxOworCQkJdC5vcGVubWF4ID0gMTsKKwkJCXQuZW1wdHkgPSAwOworCQkJdC5pbnRlZ2VyID0gMDsKKwkJCWlmIChkaXIgPCAwKSB7CisJCQkJdC5taW4gPSB2YWwgLSAxOworCQkJCXQubWF4ID0gdmFsOworCQkJfSBlbHNlIHsKKwkJCQl0Lm1pbiA9IHZhbDsKKwkJCQl0Lm1heCA9IHZhbCsxOworCQkJfQorCQkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmUoaSwgJnQpOworCQl9CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjaGFuZ2VkKSB7CisJCXBhcmFtcy0+Y21hc2sgfD0gMSA8PCB2YXI7CisJCXBhcmFtcy0+cm1hc2sgfD0gMSA8PCB2YXI7CisJfQorCXJldHVybiBjaGFuZ2VkOworfQorCisvKioKKyAqIHNuZF9wY21faHdfcGFyYW1fc2V0CisgKiBAcGNtOiBQQ00gaW5zdGFuY2UKKyAqIEBwYXJhbXM6IHRoZSBod19wYXJhbXMgaW5zdGFuY2UKKyAqIEB2YXI6IHBhcmFtZXRlciB0byByZXRyaWV2ZQorICogQHZhbDogdmFsdWUgdG8gc2V0CisgKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAorICoKKyAqIEluc2lkZSBjb25maWd1cmF0aW9uIHNwYWNlIGRlZmluZWQgYnkgUEFSQU1TIHJlbW92ZSBmcm9tIFBBUiBhbGwgCisgKiB2YWx1ZXMgIT0gVkFMLiBSZWR1Y2UgY29uZmlndXJhdGlvbiBzcGFjZSBhY2NvcmRpbmdseS4KKyAqICBSZXR1cm4gVkFMIG9yIC1FSU5WQUwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UgaXMgZW1wdHkKKyAqLworc3RhdGljIGludCBzbmRfcGNtX2h3X3BhcmFtX3NldChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQlzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCB1bnNpZ25lZCBpbnQgdmFsLAorCQkJCWludCBkaXIpCit7CisJaW50IGNoYW5nZWQgPSBfc25kX3BjbV9od19wYXJhbV9zZXQocGFyYW1zLCB2YXIsIHZhbCwgZGlyKTsKKwlpZiAoY2hhbmdlZCA8IDApCisJCXJldHVybiBjaGFuZ2VkOworCWlmIChwYXJhbXMtPnJtYXNrKSB7CisJCWludCBlcnIgPSBzbmRfcGNtX2h3X3JlZmluZShwY20sIHBhcmFtcyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIHNuZF9wY21faHdfcGFyYW1fdmFsdWUocGFyYW1zLCB2YXIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9zbmRfcGNtX2h3X3BhcmFtX3NldGludGVnZXIoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJCXNuZF9wY21faHdfcGFyYW1fdCB2YXIpCit7CisJaW50IGNoYW5nZWQ7CisJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9zZXRpbnRlZ2VyKGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgdmFyKSk7CisJaWYgKGNoYW5nZWQpIHsKKwkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IHZhcjsKKwkJcGFyYW1zLT5ybWFzayB8PSAxIDw8IHZhcjsKKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisJCisvKgorICogcGx1Z2luCisgKi8KKwogI2lmZGVmIENPTkZJR19TTkRfUENNX09TU19QTFVHSU5TCiBzdGF0aWMgaW50IHNuZF9wY21fb3NzX3BsdWdpbl9jbGVhcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTIwMyw3ICs2ODQsNyBAQAogCW9zc19idWZmZXJfc2l6ZSA9IHNuZF9wY21fcGx1Z19jbGllbnRfc2l6ZShzdWJzdHJlYW0sCiAJCQkJCQkgICBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21heChzbGF2ZV9wYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSwgTlVMTCkpICogb3NzX2ZyYW1lX3NpemU7CiAJb3NzX2J1ZmZlcl9zaXplID0gMSA8PCBsZDIob3NzX2J1ZmZlcl9zaXplKTsKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpKSB7CisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKSB7CiAJCWlmIChvc3NfYnVmZmVyX3NpemUgPiBydW50aW1lLT5vc3MubW1hcF9ieXRlcykKIAkJCW9zc19idWZmZXJfc2l6ZSA9IHJ1bnRpbWUtPm9zcy5tbWFwX2J5dGVzOwogCX0KQEAgLTMzOCw3ICs4MTksNyBAQAogCQlnb3RvIGZhaWx1cmU7CiAJfQogCi0JaWYgKGF0b21pY19yZWFkKCZydW50aW1lLT5tbWFwX2NvdW50KSkKKwlpZiAoYXRvbWljX3JlYWQoJnN1YnN0cmVhbS0+bW1hcF9jb3VudCkpCiAJCWRpcmVjdCA9IDE7CiAJZWxzZQogCQlkaXJlY3QgPSBzdWJzdHJlYW0tPm9zcy5zZXR1cC5kaXJlY3Q7CkBAIC0zNDcsNyArODI4LDcgQEAKIAlfc25kX3BjbV9od19wYXJhbV9zZXRpbnRlZ2VyKHNwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKIAlfc25kX3BjbV9od19wYXJhbV9taW4oc3BhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMsIDIsIDApOwogCXNuZF9tYXNrX25vbmUoJm1hc2spOwotCWlmIChhdG9taWNfcmVhZCgmcnVudGltZS0+bW1hcF9jb3VudCkpCisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQogCQlzbmRfbWFza19zZXQoJm1hc2ssIFNORFJWX1BDTV9BQ0NFU1NfTU1BUF9JTlRFUkxFQVZFRCk7CiAJZWxzZSB7CiAJCXNuZF9tYXNrX3NldCgmbWFzaywgU05EUlZfUENNX0FDQ0VTU19SV19JTlRFUkxFQVZFRCk7CkBAIC00NjYsNyArOTQ3LDggQEAKIAl9IGVsc2UgewogCQlzd19wYXJhbXMtPnN0YXJ0X3RocmVzaG9sZCA9IHJ1bnRpbWUtPmJvdW5kYXJ5OwogCX0KLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpIHx8IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRSkKKwlpZiAoYXRvbWljX3JlYWQoJnN1YnN0cmVhbS0+bW1hcF9jb3VudCkgfHwKKwkgICAgc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQogCQlzd19wYXJhbXMtPnN0b3BfdGhyZXNob2xkID0gcnVudGltZS0+Ym91bmRhcnk7CiAJZWxzZQogCQlzd19wYXJhbXMtPnN0b3BfdGhyZXNob2xkID0gcnVudGltZS0+YnVmZmVyX3NpemU7CkBAIC00NzYsNyArOTU4LDcgQEAKIAlzd19wYXJhbXMtPmF2YWlsX21pbiA9IHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0sgPwogCQkxIDogcnVudGltZS0+cGVyaW9kX3NpemU7CiAJc3dfcGFyYW1zLT54ZmVyX2FsaWduID0gMTsKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpIHx8CisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpIHx8CiAJICAgIHN1YnN0cmVhbS0+b3NzLnNldHVwLm5vc2lsZW5jZSkgewogCQlzd19wYXJhbXMtPnNpbGVuY2VfdGhyZXNob2xkID0gMDsKIAkJc3dfcGFyYW1zLT5zaWxlbmNlX3NpemUgPSAwOwpAQCAtODIwLDcgKzEzMDIsNyBAQAogCXNzaXplX3QgdG1wOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpKQorCWlmIChhdG9taWNfcmVhZCgmc3Vic3RyZWFtLT5tbWFwX2NvdW50KSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCWlmICgodG1wID0gc25kX3BjbV9vc3NfbWFrZV9yZWFkeShzdWJzdHJlYW0pKSA8IDApCkBAIC04NTAsNyArMTMzMiw3IEBACiAJCQkJaWYgKHJ1bnRpbWUtPm9zcy5wZXJpb2RfcHRyID09IDAgfHwKIAkJCQkgICAgcnVudGltZS0+b3NzLnBlcmlvZF9wdHIgPT0gcnVudGltZS0+b3NzLmJ1ZmZlcl91c2VkKQogCQkJCQlydW50aW1lLT5vc3MuYnVmZmVyX3VzZWQgPSAwOwotCQkJCWVsc2UgaWYgKChzdWJzdHJlYW0tPmZmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgIT0gMCkKKwkJCQllbHNlIGlmICgoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSykgIT0gMCkKIAkJCQkJcmV0dXJuIHhmZXIgPiAwID8geGZlciA6IC1FQUdBSU47CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC04NjMsNyArMTM0NSw3IEBACiAJCQlidWYgKz0gdG1wOwogCQkJYnl0ZXMgLT0gdG1wOwogCQkJeGZlciArPSB0bXA7Ci0JCQlpZiAoKHN1YnN0cmVhbS0+ZmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAhPSAwICYmCisJCQlpZiAoKHN1YnN0cmVhbS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spICE9IDAgJiYKIAkJCSAgICB0bXAgIT0gcnVudGltZS0+b3NzLnBlcmlvZF9ieXRlcykKIAkJCQlicmVhazsKIAkJfQpAQCAtOTEwLDcgKzEzOTIsNyBAQAogCXNzaXplX3QgdG1wOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpKQorCWlmIChhdG9taWNfcmVhZCgmc3Vic3RyZWFtLT5tbWFwX2NvdW50KSkKIAkJcmV0dXJuIC1FTlhJTzsKIAogCWlmICgodG1wID0gc25kX3BjbV9vc3NfbWFrZV9yZWFkeShzdWJzdHJlYW0pKSA8IDApCkBAIC0xMDQwLDcgKzE1MjIsNyBAQAogCXN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKIAlpZiAoc3Vic3RyZWFtICE9IE5VTEwpIHsKIAkJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQkJaWYgKGF0b21pY19yZWFkKCZydW50aW1lLT5tbWFwX2NvdW50KSkKKwkJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQogCQkJZ290byBfX2RpcmVjdDsKIAkJaWYgKChlcnIgPSBzbmRfcGNtX29zc19tYWtlX3JlYWR5KHN1YnN0cmVhbSkpIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0xMTAxLDEwICsxNTgzLDEwIEBACiAJCSAqIGZpbmlzaCBzeW5jOiBkcmFpbiB0aGUgYnVmZmVyCiAJCSAqLwogCSAgICAgIF9fZGlyZWN0OgotCQlzYXZlZF9mX2ZsYWdzID0gc3Vic3RyZWFtLT5mZmlsZS0+Zl9mbGFnczsKLQkJc3Vic3RyZWFtLT5mZmlsZS0+Zl9mbGFncyAmPSB+T19OT05CTE9DSzsKKwkJc2F2ZWRfZl9mbGFncyA9IHN1YnN0cmVhbS0+Zl9mbGFnczsKKwkJc3Vic3RyZWFtLT5mX2ZsYWdzICY9IH5PX05PTkJMT0NLOwogCQllcnIgPSBzbmRfcGNtX2tlcm5lbF9pb2N0bChzdWJzdHJlYW0sIFNORFJWX1BDTV9JT0NUTF9EUkFJTiwgTlVMTCk7Ci0JCXN1YnN0cmVhbS0+ZmZpbGUtPmZfZmxhZ3MgPSBzYXZlZF9mX2ZsYWdzOworCQlzdWJzdHJlYW0tPmZfZmxhZ3MgPSBzYXZlZF9mX2ZsYWdzOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCXJ1bnRpbWUtPm9zcy5wcmVwYXJlID0gMTsKQEAgLTEyMDksNyArMTY5MSw3IEBACiAKIAlpZiAoKGVyciA9IHNuZF9wY21fb3NzX2dldF9hY3RpdmVfc3Vic3RyZWFtKHBjbV9vc3NfZmlsZSwgJnN1YnN0cmVhbSkpIDwgMCkKIAkJcmV0dXJuIGVycjsKLQlpZiAoYXRvbWljX3JlYWQoJnN1YnN0cmVhbS0+cnVudGltZS0+bW1hcF9jb3VudCkpCisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQogCQlkaXJlY3QgPSAxOwogCWVsc2UKIAkJZGlyZWN0ID0gc3Vic3RyZWFtLT5vc3Muc2V0dXAuZGlyZWN0OwpAQCAtMTQxOSw3ICsxOTAxLDcgQEAKIAkJaWYgKHRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkgewogCQkJaWYgKHJ1bnRpbWUtPm9zcy50cmlnZ2VyKQogCQkJCWdvdG8gX3NraXAxOwotCQkJaWYgKGF0b21pY19yZWFkKCZwc3Vic3RyZWFtLT5ydW50aW1lLT5tbWFwX2NvdW50KSkKKwkJCWlmIChhdG9taWNfcmVhZCgmcHN1YnN0cmVhbS0+bW1hcF9jb3VudCkpCiAJCQkJc25kX3BjbV9vc3Nfc2ltdWxhdGVfZmlsbChwc3Vic3RyZWFtLCBydW50aW1lLT5od19wdHJfaW50ZXJydXB0KTsKIAkJCXJ1bnRpbWUtPm9zcy50cmlnZ2VyID0gMTsKIAkJCXJ1bnRpbWUtPnN0YXJ0X3RocmVzaG9sZCA9IDE7CkBAIC0xNTM3LDcgKzIwMTksNyBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWluZm8ucHRyID0gc25kX3BjbV9vc3NfYnl0ZXMoc3Vic3RyZWFtLCBydW50aW1lLT5zdGF0dXMtPmh3X3B0ciAlIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKTsKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpKSB7CisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKSB7CiAJCXNuZF9wY21fc2ZyYW1lc190IG47CiAJCW4gPSAoZGVsYXkgPSBydW50aW1lLT5od19wdHJfaW50ZXJydXB0KSAtIHJ1bnRpbWUtPm9zcy5wcmV2X2h3X3B0cl9pbnRlcnJ1cHQ7CiAJCWlmIChuIDwgMCkKQEAgLTE2ODMsOSArMjE2NSw5IEBACiAJc3Vic3RyZWFtLT5vc3Mub3NzID0gMTsKIAlzdWJzdHJlYW0tPm9zcy5zZXR1cCA9ICpzZXR1cDsKIAlpZiAoc2V0dXAtPm5vbmJsb2NrKQotCQlzdWJzdHJlYW0tPmZmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXN1YnN0cmVhbS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOwogCWVsc2UgaWYgKHNldHVwLT5ibG9jaykKLQkJc3Vic3RyZWFtLT5mZmlsZS0+Zl9mbGFncyAmPSB+T19OT05CTE9DSzsKKwkJc3Vic3RyZWFtLT5mX2ZsYWdzICY9IH5PX05PTkJMT0NLOwogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJcnVudGltZS0+b3NzLnBhcmFtcyA9IDE7CiAJcnVudGltZS0+b3NzLnRyaWdnZXIgPSAxOwpAQCAtMTc0Miw2ICsyMjI0LDcgQEAKIAkgICAgKHBjbS0+aW5mb19mbGFncyAmIFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYKSkKIAkJZl9tb2RlID0gRk1PREVfV1JJVEU7CiAKKwlmaWxlLT5mX2ZsYWdzICY9IH5PX0FQUEVORDsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IDI7IGlkeCsrKSB7CiAJCWlmIChzZXR1cFtpZHhdLmRpc2FibGUpCiAJCQljb250aW51ZTsKQEAgLTIwNTksNiArMjU0Miw3IEBACiAJc3Vic3RyZWFtID0gcGNtX29zc19maWxlLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CiAJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOWElPOworCXN1YnN0cmVhbS0+Zl9mbGFncyA9IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLOwogI2lmbmRlZiBPU1NfREVCVUcKIAlyZXR1cm4gc25kX3BjbV9vc3NfcmVhZDEoc3Vic3RyZWFtLCBidWYsIGNvdW50KTsKICNlbHNlCkBAIC0yMDgwLDYgKzI1NjQsNyBAQAogCXN1YnN0cmVhbSA9IHBjbV9vc3NfZmlsZS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKIAlpZiAoc3Vic3RyZWFtID09IE5VTEwpCiAJCXJldHVybiAtRU5YSU87CisJc3Vic3RyZWFtLT5mX2ZsYWdzID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CiAJcmVzdWx0ID0gc25kX3BjbV9vc3Nfd3JpdGUxKHN1YnN0cmVhbSwgYnVmLCBjb3VudCk7CiAjaWZkZWYgT1NTX0RFQlVHCiAJcHJpbnRrKCJwY21fb3NzOiB3cml0ZSAlbGkgYnl0ZXMgKHdyb3RlICVsaSBieXRlcylcbiIsIChsb25nKWNvdW50LCAobG9uZylyZXN1bHQpOwpAQCAtMjA5MCw3ICsyNTc1LDcgQEAKIHN0YXRpYyBpbnQgc25kX3BjbV9vc3NfcGxheWJhY2tfcmVhZHkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlpZiAoYXRvbWljX3JlYWQoJnJ1bnRpbWUtPm1tYXBfY291bnQpKQorCWlmIChhdG9taWNfcmVhZCgmc3Vic3RyZWFtLT5tbWFwX2NvdW50KSkKIAkJcmV0dXJuIHJ1bnRpbWUtPm9zcy5wcmV2X2h3X3B0cl9pbnRlcnJ1cHQgIT0gcnVudGltZS0+aHdfcHRyX2ludGVycnVwdDsKIAllbHNlCiAJCXJldHVybiBzbmRfcGNtX3BsYXliYWNrX2F2YWlsKHJ1bnRpbWUpID49IHJ1bnRpbWUtPm9zcy5wZXJpb2RfZnJhbWVzOwpAQCAtMjA5OSw3ICsyNTg0LDcgQEAKIHN0YXRpYyBpbnQgc25kX3BjbV9vc3NfY2FwdHVyZV9yZWFkeShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCWlmIChhdG9taWNfcmVhZCgmcnVudGltZS0+bW1hcF9jb3VudCkpCisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQogCQlyZXR1cm4gcnVudGltZS0+b3NzLnByZXZfaHdfcHRyX2ludGVycnVwdCAhPSBydW50aW1lLT5od19wdHJfaW50ZXJydXB0OwogCWVsc2UKIAkJcmV0dXJuIHNuZF9wY21fY2FwdHVyZV9hdmFpbChydW50aW1lKSA+PSBydW50aW1lLT5vc3MucGVyaW9kX2ZyYW1lczsKQEAgLTIzNDIsOSArMjgyNyw3IEBACiAJCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShwY20tPmNhcmQsICJvc3MiLCBwc3RyLT5wcm9jX3Jvb3QpKSAhPSBOVUxMKSB7CiAJCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwogCQkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7Ci0JCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDgxOTI7CiAJCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfcGNtX29zc19wcm9jX3JlYWQ7Ci0JCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA4MTkyOwogCQkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9wY21fb3NzX3Byb2Nfd3JpdGU7CiAJCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gcHN0cjsKIAkJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCA4NGIwMDAzLi43NTgxZWRkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtLmMKQEAgLTM1MSwxMCArMzUxLDggQEAKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiY2xvc2VkXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlzbmRfcGNtX3N0cmVhbV9sb2NrX2lycShzdWJzdHJlYW0pOwogCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKSB7CiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIm5vIHNldHVwXG4iKTsKLQkJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwogCQlyZXR1cm47CiAJfQogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgImFjY2VzczogJXNcbiIsIHNuZF9wY21fYWNjZXNzX25hbWUocnVudGltZS0+YWNjZXNzKSk7CkBAIC0zNzUsNyArMzczLDYgQEAKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiT1NTIHBlcmlvZCBmcmFtZXM6ICVsdVxuIiwgKHVuc2lnbmVkIGxvbmcpcnVudGltZS0+b3NzLnBlcmlvZF9mcmFtZXMpOwogCX0KICNlbmRpZgotCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKIH0KIAogc3RhdGljIHZvaWQgc25kX3BjbV9zdWJzdHJlYW1fcHJvY19zd19wYXJhbXNfcmVhZChzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LApAQCAtMzg3LDEwICszODQsOCBAQAogCQlzbmRfaXByaW50ZihidWZmZXIsICJjbG9zZWRcbiIpOwogCQlyZXR1cm47CiAJfQotCXNuZF9wY21fc3RyZWFtX2xvY2tfaXJxKHN1YnN0cmVhbSk7CiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAibm8gc2V0dXBcbiIpOwotCQlzbmRfcGNtX3N0cmVhbV91bmxvY2tfaXJxKHN1YnN0cmVhbSk7CiAJCXJldHVybjsKIAl9CiAJc25kX2lwcmludGYoYnVmZmVyLCAidHN0YW1wX21vZGU6ICVzXG4iLCBzbmRfcGNtX3RzdGFtcF9tb2RlX25hbWUocnVudGltZS0+dHN0YW1wX21vZGUpKTsKQEAgLTQwMyw3ICszOTgsNiBAQAogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInNpbGVuY2VfdGhyZXNob2xkOiAlbHVcbiIsIHJ1bnRpbWUtPnNpbGVuY2VfdGhyZXNob2xkKTsKIAlzbmRfaXByaW50ZihidWZmZXIsICJzaWxlbmNlX3NpemU6ICVsdVxuIiwgcnVudGltZS0+c2lsZW5jZV9zaXplKTsKIAlzbmRfaXByaW50ZihidWZmZXIsICJib3VuZGFyeTogJWx1XG4iLCBydW50aW1lLT5ib3VuZGFyeSk7Ci0Jc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwogfQogCiBzdGF0aWMgdm9pZCBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX3N0YXR1c19yZWFkKHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnksCkBAIC00NzIsNyArNDY2LDcgQEAKIAlwc3RyLT5wcm9jX3Jvb3QgPSBlbnRyeTsKIAogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShwY20tPmNhcmQsICJpbmZvIiwgcHN0ci0+cHJvY19yb290KSkgIT0gTlVMTCkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHBzdHIsIDI1Niwgc25kX3BjbV9zdHJlYW1fcHJvY19pbmZvX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHBzdHIsIHNuZF9wY21fc3RyZWFtX3Byb2NfaW5mb19yZWFkKTsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwogCQkJZW50cnkgPSBOVUxMOwpAQCAtNDgzLDkgKzQ3Nyw3IEBACiAjaWZkZWYgQ09ORklHX1NORF9QQ01fWFJVTl9ERUJVRwogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShwY20tPmNhcmQsICJ4cnVuX2RlYnVnIiwKIAkJCQkJCXBzdHItPnByb2Nfcm9vdCkpICE9IE5VTEwpIHsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA2NDsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gc25kX3BjbV94cnVuX2RlYnVnX3JlYWQ7Ci0JCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX3BjbV94cnVuX2RlYnVnX3dyaXRlOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwogCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gcHN0cjsKQEAgLTUzNyw3ICs1MjksOCBAQAogCXN1YnN0cmVhbS0+cHJvY19yb290ID0gZW50cnk7CiAKIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgImluZm8iLCBzdWJzdHJlYW0tPnByb2Nfcm9vdCkpICE9IE5VTEwpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBzdWJzdHJlYW0sIDI1Niwgc25kX3BjbV9zdWJzdHJlYW1fcHJvY19pbmZvX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHN1YnN0cmVhbSwKKwkJCQkgICAgICBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX2luZm9fcmVhZCk7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKIAkJCWVudHJ5ID0gTlVMTDsKQEAgLTU0Niw3ICs1MzksOCBAQAogCXN1YnN0cmVhbS0+cHJvY19pbmZvX2VudHJ5ID0gZW50cnk7CiAKIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgImh3X3BhcmFtcyIsIHN1YnN0cmVhbS0+cHJvY19yb290KSkgIT0gTlVMTCkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHN1YnN0cmVhbSwgMjU2LCBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX2h3X3BhcmFtc19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBzdWJzdHJlYW0sCisJCQkJICAgICAgc25kX3BjbV9zdWJzdHJlYW1fcHJvY19od19wYXJhbXNfcmVhZCk7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKIAkJCWVudHJ5ID0gTlVMTDsKQEAgLTU1NSw3ICs1NDksOCBAQAogCXN1YnN0cmVhbS0+cHJvY19od19wYXJhbXNfZW50cnkgPSBlbnRyeTsKIAogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShjYXJkLCAic3dfcGFyYW1zIiwgc3Vic3RyZWFtLT5wcm9jX3Jvb3QpKSAhPSBOVUxMKSB7Ci0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgc3Vic3RyZWFtLCAyNTYsIHNuZF9wY21fc3Vic3RyZWFtX3Byb2Nfc3dfcGFyYW1zX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHN1YnN0cmVhbSwKKwkJCQkgICAgICBzbmRfcGNtX3N1YnN0cmVhbV9wcm9jX3N3X3BhcmFtc19yZWFkKTsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwogCQkJZW50cnkgPSBOVUxMOwpAQCAtNTY0LDcgKzU1OSw4IEBACiAJc3Vic3RyZWFtLT5wcm9jX3N3X3BhcmFtc19lbnRyeSA9IGVudHJ5OwogCiAJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGNhcmQsICJzdGF0dXMiLCBzdWJzdHJlYW0tPnByb2Nfcm9vdCkpICE9IE5VTEwpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBzdWJzdHJlYW0sIDI1Niwgc25kX3BjbV9zdWJzdHJlYW1fcHJvY19zdGF0dXNfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgc3Vic3RyZWFtLAorCQkJCSAgICAgIHNuZF9wY21fc3Vic3RyZWFtX3Byb2Nfc3RhdHVzX3JlYWQpOwogCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewogCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CiAJCQllbnRyeSA9IE5VTEw7CkBAIC02NjYsMTEgKzY2MiwxNCBAQAogCQlJTklUX0xJU1RfSEVBRCgmc3Vic3RyZWFtLT5zZWxmX2dyb3VwLnN1YnN0cmVhbXMpOwogCQlsaXN0X2FkZF90YWlsKCZzdWJzdHJlYW0tPmxpbmtfbGlzdCwgJnN1YnN0cmVhbS0+c2VsZl9ncm91cC5zdWJzdHJlYW1zKTsKIAkJc3Bpbl9sb2NrX2luaXQoJnN1YnN0cmVhbS0+dGltZXJfbG9jayk7CisJCWF0b21pY19zZXQoJnN1YnN0cmVhbS0+bW1hcF9jb3VudCwgMCk7CiAJCXByZXYgPSBzdWJzdHJlYW07CiAJfQogCXJldHVybiAwOwogfQkJCQkKIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX25ld19zdHJlYW0pOworCiAvKioKICAqIHNuZF9wY21fbmV3IC0gY3JlYXRlIGEgbmV3IFBDTSBpbnN0YW5jZQogICogQGNhcmQ6IHRoZSBjYXJkIGluc3RhbmNlCkBAIC03MzAsNiArNzI5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX25ldyk7CisKIHN0YXRpYyB2b2lkIHNuZF9wY21fZnJlZV9zdHJlYW0oc3RydWN0IHNuZF9wY21fc3RyICogcHN0cikKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgKnN1YnN0cmVhbV9uZXh0OwpAQCAtODI5LDYgKzgzMCwyNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CisJCWlmIChwcmVmZXJfc3ViZGV2aWNlIDwgMCkgeworCQkJaWYgKHBzdHItPnN1YnN0cmVhbV9jb3VudCA+IDEpCisJCQkJcmV0dXJuIC1FSU5WQUw7IC8qIG11c3QgYmUgdW5pcXVlICovCisJCQlzdWJzdHJlYW0gPSBwc3RyLT5zdWJzdHJlYW07CisJCX0gZWxzZSB7CisJCQlmb3IgKHN1YnN0cmVhbSA9IHBzdHItPnN1YnN0cmVhbTsgc3Vic3RyZWFtOworCQkJICAgICBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCisJCQkJaWYgKHN1YnN0cmVhbS0+bnVtYmVyID09IHByZWZlcl9zdWJkZXZpY2UpCisJCQkJCWJyZWFrOworCQl9CisJCWlmICghIHN1YnN0cmVhbSkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoISBTVUJTVFJFQU1fQlVTWShzdWJzdHJlYW0pKQorCQkJcmV0dXJuIC1FQkFERkQ7CisJCXN1YnN0cmVhbS0+cmVmX2NvdW50Kys7CisJCSpyc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCQlyZXR1cm4gMDsKKwl9CisKIAlpZiAocHJlZmVyX3N1YmRldmljZSA+PSAwKSB7CiAJCWZvciAoc3Vic3RyZWFtID0gcHN0ci0+c3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkKIAkJCWlmICghU1VCU1RSRUFNX0JVU1koc3Vic3RyZWFtKSAmJiBzdWJzdHJlYW0tPm51bWJlciA9PSBwcmVmZXJfc3ViZGV2aWNlKQpAQCAtODY0LDcgKzg4NSw2IEBACiAJbWVtc2V0KCh2b2lkKilydW50aW1lLT5jb250cm9sLCAwLCBzaXplKTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJ1bnRpbWUtPnNsZWVwKTsKLQlhdG9taWNfc2V0KCZydW50aW1lLT5tbWFwX2NvdW50LCAwKTsKIAlpbml0X3RpbWVyKCZydW50aW1lLT50aWNrX3RpbWVyKTsKIAlydW50aW1lLT50aWNrX3RpbWVyLmZ1bmN0aW9uID0gc25kX3BjbV90aWNrX3RpbWVyX2Z1bmM7CiAJcnVudGltZS0+dGlja190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHN1YnN0cmVhbTsKQEAgLTg3Myw3ICs4OTMsOCBAQAogCiAJc3Vic3RyZWFtLT5ydW50aW1lID0gcnVudGltZTsKIAlzdWJzdHJlYW0tPnByaXZhdGVfZGF0YSA9IHBjbS0+cHJpdmF0ZV9kYXRhOwotCXN1YnN0cmVhbS0+ZmZpbGUgPSBmaWxlOworCXN1YnN0cmVhbS0+cmVmX2NvdW50ID0gMTsKKwlzdWJzdHJlYW0tPmZfZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzOwogCXBzdHItPnN1YnN0cmVhbV9vcGVuZWQrKzsKIAkqcnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKIAlyZXR1cm4gMDsKQEAgLTg4Miw3ICs5MDMsNyBAQAogdm9pZCBzbmRfcGNtX2RldGFjaF9zdWJzdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQlzdWJzdHJlYW0tPmZpbGUgPSBOVUxMOworCiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzbmRfYXNzZXJ0KHJ1bnRpbWUgIT0gTlVMTCwgcmV0dXJuKTsKIAlpZiAocnVudGltZS0+cHJpdmF0ZV9mcmVlICE9IE5VTEwpCkBAIC0xMDIyLDYgKzEwNDMsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fbm90aWZ5KTsKKwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAvKgogICogIEluZm8gaW50ZXJmYWNlCkBAIC0xMDQ5LDE1ICsxMDcyLDE0IEBACiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF9wY21fcHJvY19lbnRyeSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfcGNtX3Byb2NfZW50cnk7CiAKIHN0YXRpYyB2b2lkIHNuZF9wY21fcHJvY19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfbW9kdWxlX2VudHJ5KFRISVNfTU9EVUxFLCAicGNtIiwgTlVMTCkpICE9IE5VTEwpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBOVUxMLCBTTkRSVl9DQVJEUyAqIFNORFJWX1BDTV9ERVZJQ0VTICogMTI4LAotCQkJCSAgICAgIHNuZF9wY21fcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBOVUxMLCBzbmRfcGNtX3Byb2NfcmVhZCk7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKIAkJCWVudHJ5ID0gTlVMTDsKQEAgLTEwOTksMzMgKzExMjEsMyBAQAogCiBtb2R1bGVfaW5pdChhbHNhX3BjbV9pbml0KQogbW9kdWxlX2V4aXQoYWxzYV9wY21fZXhpdCkKLQotRVhQT1JUX1NZTUJPTChzbmRfcGNtX25ldyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fbmV3X3N0cmVhbSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fbm90aWZ5KTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9vcGVuX3N1YnN0cmVhbSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fcmVsZWFzZV9zdWJzdHJlYW0pOwotICAvKiBwY21fbmF0aXZlLmMgKi8KLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saW5rX3J3bG9jayk7Ci0jaWZkZWYgQ09ORklHX1BNCi1FWFBPUlRfU1lNQk9MKHNuZF9wY21fc3VzcGVuZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fc3VzcGVuZF9hbGwpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKHNuZF9wY21fa2VybmVsX2lvY3RsKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9tbWFwX2RhdGEpOwotI2lmIFNORFJWX1BDTV9JTkZPX01NQVBfSU9NRU0KLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfbW1hcF9pb21lbSk7Ci0jZW5kaWYKLSAvKiBwY21fbWlzYy5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3NpZ25lZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9mb3JtYXRfbGluZWFyKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9mb3JtYXRfbGl0dGxlX2VuZGlhbik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4pOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF93aWR0aCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9mb3JtYXRfc2l6ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfNjQpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fYnVpbGRfbGluZWFyX2Zvcm1hdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fbGltaXRfaHdfcmF0ZXMpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fY29tcGF0LmMgYi9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYwppbmRleCBlNTEzMzAzLi4yYjhhYWI2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYworKysgYi9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYwpAQCAtNDk3LDkgKzQ5Nyw5IEBACiAJY2FzZSBTTkRSVl9QQ01fSU9DVExfTElOSzoKIAljYXNlIFNORFJWX1BDTV9JT0NUTF9VTkxJTks6CiAJCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQotCQkJcmV0dXJuIHNuZF9wY21fcGxheWJhY2tfaW9jdGwxKHN1YnN0cmVhbSwgY21kLCBhcmdwKTsKKwkJCXJldHVybiBzbmRfcGNtX3BsYXliYWNrX2lvY3RsMShmaWxlLCBzdWJzdHJlYW0sIGNtZCwgYXJncCk7CiAJCWVsc2UKLQkJCXJldHVybiBzbmRfcGNtX2NhcHR1cmVfaW9jdGwxKHN1YnN0cmVhbSwgY21kLCBhcmdwKTsKKwkJCXJldHVybiBzbmRfcGNtX2NhcHR1cmVfaW9jdGwxKGZpbGUsIHN1YnN0cmVhbSwgY21kLCBhcmdwKTsKIAljYXNlIFNORFJWX1BDTV9JT0NUTF9IV19SRUZJTkUzMjoKIAkJcmV0dXJuIHNuZF9wY21faW9jdGxfaHdfcGFyYW1zX2NvbXBhdChzdWJzdHJlYW0sIDEsIGFyZ3ApOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX0hXX1BBUkFNUzMyOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbGliLmMgYi9zb3VuZC9jb3JlL3BjbV9saWIuYwppbmRleCBlZWRjNmNiLi4wYmIxNDJhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9saWIuYworKysgYi9zb3VuZC9jb3JlL3BjbV9saWIuYwpAQCAtMjg5LDYgKzI4OSw3IEBACiAJCXN1YnN0cmVhbS0+b3BzID0gb3BzOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fc2V0X29wcyk7CiAKIC8qKgogICogc25kX3BjbV9zeW5jIC0gc2V0IHRoZSBQQ00gc3luYyBpZApAQCAtMzA2LDEzICszMDcsMTIgQEAKIAlydW50aW1lLT5zeW5jLmlkMzJbM10gPSAtMTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX3NldF9zeW5jKTsKKwogLyoKICAqICBTdGFuZGFyZCBpb2N0bCByb3V0aW5lCiAgKi8KIAotLyogQ29kZSB0YWtlbiBmcm9tIGFsc2EtbGliICovCi0jZGVmaW5lIGFzc2VydChhKSBzbmRfYXNzZXJ0KChhKSwgcmV0dXJuIC1FSU5WQUwpCi0KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGRpdjMyKHVuc2lnbmVkIGludCBhLCB1bnNpZ25lZCBpbnQgYiwgCiAJCQkJIHVuc2lnbmVkIGludCAqcikKIHsKQEAgLTM2OSw1NiArMzY5LDYgQEAKIAlyZXR1cm4gbjsKIH0KIAotc3RhdGljIGludCBzbmRfaW50ZXJ2YWxfcmVmaW5lX21pbihzdHJ1Y3Qgc25kX2ludGVydmFsICppLCB1bnNpZ25lZCBpbnQgbWluLCBpbnQgb3Blbm1pbikKLXsKLQlpbnQgY2hhbmdlZCA9IDA7Ci0JYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpOwotCWlmIChpLT5taW4gPCBtaW4pIHsKLQkJaS0+bWluID0gbWluOwotCQlpLT5vcGVubWluID0gb3Blbm1pbjsKLQkJY2hhbmdlZCA9IDE7Ci0JfSBlbHNlIGlmIChpLT5taW4gPT0gbWluICYmICFpLT5vcGVubWluICYmIG9wZW5taW4pIHsKLQkJaS0+b3Blbm1pbiA9IDE7Ci0JCWNoYW5nZWQgPSAxOwotCX0KLQlpZiAoaS0+aW50ZWdlcikgewotCQlpZiAoaS0+b3Blbm1pbikgewotCQkJaS0+bWluKys7Ci0JCQlpLT5vcGVubWluID0gMDsKLQkJfQotCX0KLQlpZiAoc25kX2ludGVydmFsX2NoZWNrZW1wdHkoaSkpIHsKLQkJc25kX2ludGVydmFsX25vbmUoaSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotc3RhdGljIGludCBzbmRfaW50ZXJ2YWxfcmVmaW5lX21heChzdHJ1Y3Qgc25kX2ludGVydmFsICppLCB1bnNpZ25lZCBpbnQgbWF4LCBpbnQgb3Blbm1heCkKLXsKLQlpbnQgY2hhbmdlZCA9IDA7Ci0JYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpOwotCWlmIChpLT5tYXggPiBtYXgpIHsKLQkJaS0+bWF4ID0gbWF4OwotCQlpLT5vcGVubWF4ID0gb3Blbm1heDsKLQkJY2hhbmdlZCA9IDE7Ci0JfSBlbHNlIGlmIChpLT5tYXggPT0gbWF4ICYmICFpLT5vcGVubWF4ICYmIG9wZW5tYXgpIHsKLQkJaS0+b3Blbm1heCA9IDE7Ci0JCWNoYW5nZWQgPSAxOwotCX0KLQlpZiAoaS0+aW50ZWdlcikgewotCQlpZiAoaS0+b3Blbm1heCkgewotCQkJaS0+bWF4LS07Ci0JCQlpLT5vcGVubWF4ID0gMDsKLQkJfQotCX0KLQlpZiAoc25kX2ludGVydmFsX2NoZWNrZW1wdHkoaSkpIHsKLQkJc25kX2ludGVydmFsX25vbmUoaSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQogLyoqCiAgKiBzbmRfaW50ZXJ2YWxfcmVmaW5lIC0gcmVmaW5lIHRoZSBpbnRlcnZhbCB2YWx1ZSBvZiBjb25maWd1cmF0b3IKICAqIEBpOiB0aGUgaW50ZXJ2YWwgdmFsdWUgdG8gcmVmaW5lCkBAIC00MzMsNyArMzgzLDcgQEAKIGludCBzbmRfaW50ZXJ2YWxfcmVmaW5lKHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmksIGNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKnYpCiB7CiAJaW50IGNoYW5nZWQgPSAwOwotCWFzc2VydCghc25kX2ludGVydmFsX2VtcHR5KGkpKTsKKwlzbmRfYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSksIHJldHVybiAtRUlOVkFMKTsKIAlpZiAoaS0+bWluIDwgdi0+bWluKSB7CiAJCWktPm1pbiA9IHYtPm1pbjsKIAkJaS0+b3Blbm1pbiA9IHYtPm9wZW5taW47CkBAIC00NzIsOSArNDIyLDExIEBACiAJcmV0dXJuIGNoYW5nZWQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2ludGVydmFsX3JlZmluZSk7CisKIHN0YXRpYyBpbnQgc25kX2ludGVydmFsX3JlZmluZV9maXJzdChzdHJ1Y3Qgc25kX2ludGVydmFsICppKQogewotCWFzc2VydCghc25kX2ludGVydmFsX2VtcHR5KGkpKTsKKwlzbmRfYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSksIHJldHVybiAtRUlOVkFMKTsKIAlpZiAoc25kX2ludGVydmFsX3NpbmdsZShpKSkKIAkJcmV0dXJuIDA7CiAJaS0+bWF4ID0gaS0+bWluOwpAQCAtNDg2LDcgKzQzOCw3IEBACiAKIHN0YXRpYyBpbnQgc25kX2ludGVydmFsX3JlZmluZV9sYXN0KHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkpCiB7Ci0JYXNzZXJ0KCFzbmRfaW50ZXJ2YWxfZW1wdHkoaSkpOworCXNuZF9hc3NlcnQoIXNuZF9pbnRlcnZhbF9lbXB0eShpKSwgcmV0dXJuIC1FSU5WQUwpOwogCWlmIChzbmRfaW50ZXJ2YWxfc2luZ2xlKGkpKQogCQlyZXR1cm4gMDsKIAlpLT5taW4gPSBpLT5tYXg7CkBAIC00OTYsMTYgKzQ0OCw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2ludGVydmFsX3JlZmluZV9zZXQoc3RydWN0IHNuZF9pbnRlcnZhbCAqaSwgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsIHQ7Ci0JdC5lbXB0eSA9IDA7Ci0JdC5taW4gPSB0Lm1heCA9IHZhbDsKLQl0Lm9wZW5taW4gPSB0Lm9wZW5tYXggPSAwOwotCXQuaW50ZWdlciA9IDE7Ci0JcmV0dXJuIHNuZF9pbnRlcnZhbF9yZWZpbmUoaSwgJnQpOwotfQotCiB2b2lkIHNuZF9pbnRlcnZhbF9tdWwoY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqYSwgY29uc3Qgc3RydWN0IHNuZF9pbnRlcnZhbCAqYiwgc3RydWN0IHNuZF9pbnRlcnZhbCAqYykKIHsKIAlpZiAoYS0+ZW1wdHkgfHwgYi0+ZW1wdHkpIHsKQEAgLTYyMSw3ICs1NjMsNiBAQAogCWMtPmludGVnZXIgPSAwOwogfQogCi0jdW5kZWYgYXNzZXJ0CiAvKiAtLS0tICovCiAKIApAQCAtNzI3LDYgKzY2OCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaW50ZXJ2YWxfcmF0bnVtKTsKKwogLyoqCiAgKiBzbmRfaW50ZXJ2YWxfcmF0ZGVuIC0gcmVmaW5lIHRoZSBpbnRlcnZhbCB2YWx1ZQogICogQGk6IGludGVydmFsIHRvIHJlZmluZQpAQCAtODc3LDYgKzgyMCw4IEBACiAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pbnRlcnZhbF9saXN0KTsKKwogc3RhdGljIGludCBzbmRfaW50ZXJ2YWxfc3RlcChzdHJ1Y3Qgc25kX2ludGVydmFsICppLCB1bnNpZ25lZCBpbnQgbWluLCB1bnNpZ25lZCBpbnQgc3RlcCkKIHsKIAl1bnNpZ25lZCBpbnQgbjsKQEAgLTk1Myw2ICs4OTgsOCBAQAogCXJldHVybiAwOwogfQkJCQkgICAgCiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9od19ydWxlX2FkZCk7CisKIC8qKgogICogc25kX3BjbV9od19jb25zdHJhaW50X21hc2sKICAqIEBydW50aW1lOiBQQ00gcnVudGltZSBpbnN0YW5jZQpAQCAtMTAwNyw2ICs5NTQsOCBAQAogCXJldHVybiBzbmRfaW50ZXJ2YWxfc2V0aW50ZWdlcihjb25zdHJzX2ludGVydmFsKGNvbnN0cnMsIHZhcikpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9pbnRlZ2VyKTsKKwogLyoqCiAgKiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4CiAgKiBAcnVudGltZTogUENNIHJ1bnRpbWUgaW5zdGFuY2UKQEAgLTEwMjgsNiArOTc3LDggQEAKIAlyZXR1cm4gc25kX2ludGVydmFsX3JlZmluZShjb25zdHJzX2ludGVydmFsKGNvbnN0cnMsIHZhciksICZ0KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KTsKKwogc3RhdGljIGludCBzbmRfcGNtX2h3X3J1bGVfbGlzdChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQlzdHJ1Y3Qgc25kX3BjbV9od19ydWxlICpydWxlKQogewpAQCAtMTA1NSw2ICsxMDA2LDggQEAKIAkJCQkgICB2YXIsIC0xKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCk7CisKIHN0YXRpYyBpbnQgc25kX3BjbV9od19ydWxlX3JhdG51bXMoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgc3RydWN0IHNuZF9wY21faHdfcnVsZSAqcnVsZSkKIHsKQEAgLTEwODcsNiArMTA0MCw4IEBACiAJCQkJICAgdmFyLCAtMSk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9od19jb25zdHJhaW50X3JhdG51bXMpOworCiBzdGF0aWMgaW50IHNuZF9wY21faHdfcnVsZV9yYXRkZW5zKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCiB7CkBAIC0xMTE4LDYgKzEwNzMsOCBAQAogCQkJCSAgIHZhciwgLTEpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9yYXRkZW5zKTsKKwogc3RhdGljIGludCBzbmRfcGNtX2h3X3J1bGVfbXNiaXRzKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcnVsZSAqcnVsZSkKIHsKQEAgLTExNDksNiArMTEwNiw4IEBACiAJCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9TQU1QTEVfQklUUywgLTEpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMpOworCiBzdGF0aWMgaW50IHNuZF9wY21faHdfcnVsZV9zdGVwKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCiB7CkBAIC0xMTczLDYgKzExMzIsOCBAQAogCQkJCSAgIHZhciwgLTEpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKTsKKwogc3RhdGljIGludCBzbmRfcGNtX2h3X3J1bGVfcG93MihzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9wY21faHdfcnVsZSAqcnVsZSkKIHsKIAlzdGF0aWMgaW50IHBvdzJfc2l6ZXNbXSA9IHsKQEAgLTEyMDAsMTEgKzExNjEsNyBAQAogCQkJCSAgIHZhciwgLTEpOwogfQogCi0vKiBUbyB1c2UgdGhlIHNhbWUgY29kZSB3ZSBoYXZlIGluIGFsc2EtbGliICovCi0jZGVmaW5lIGFzc2VydChpKSBzbmRfYXNzZXJ0KChpKSwgcmV0dXJuIC1FSU5WQUwpCi0jaWZuZGVmIElOVF9NSU4KLSNkZWZpbmUgSU5UX01JTiAoKGludCkoKHVuc2lnbmVkIGludClJTlRfTUFYKzEpKQotI2VuZGlmCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9wb3cyKTsKIAogc3RhdGljIHZvaWQgX3NuZF9wY21faHdfcGFyYW1fYW55KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhcikKQEAgLTEyMjQsMTggKzExODEsNiBAQAogCXNuZF9CVUcoKTsKIH0KIAotI2lmIDAKLS8qCi0gKiBzbmRfcGNtX2h3X3BhcmFtX2FueQotICovCi1pbnQgc25kX3BjbV9od19wYXJhbV9hbnkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJIHNuZF9wY21faHdfcGFyYW1fdCB2YXIpCi17Ci0JX3NuZF9wY21faHdfcGFyYW1fYW55KHBhcmFtcywgdmFyKTsKLQlyZXR1cm4gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOwotfQotI2VuZGlmICAvKiAgMCAgKi8KLQogdm9pZCBfc25kX3BjbV9od19wYXJhbXNfYW55KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewogCXVuc2lnbmVkIGludCBrOwpAQCAtMTI0NywxOCArMTE5Miw3IEBACiAJcGFyYW1zLT5pbmZvID0gfjBVOwogfQogCi0jaWYgMAotLyoKLSAqIHNuZF9wY21faHdfcGFyYW1zX2FueQotICoKLSAqIEZpbGwgUEFSQU1TIHdpdGggZnVsbCBjb25maWd1cmF0aW9uIHNwYWNlIGJvdW5kYXJpZXMKLSAqLwotaW50IHNuZF9wY21faHdfcGFyYW1zX2FueShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0JX3NuZF9wY21faHdfcGFyYW1zX2FueShwYXJhbXMpOwotCXJldHVybiBzbmRfcGNtX2h3X3JlZmluZShwY20sIHBhcmFtcyk7Ci19Ci0jZW5kaWYgIC8qICAwICAqLworRVhQT1JUX1NZTUJPTChfc25kX3BjbV9od19wYXJhbXNfYW55KTsKIAogLyoqCiAgKiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlCkBAIC0xMjY5LDggKzEyMDMsOCBAQAogICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgZmllbGQgUEFSIGlmIGl0J3MgZml4ZWQgaW4gY29uZmlndXJhdGlvbiBzcGFjZSAKICAqICBkZWZpbmVkIGJ5IFBBUkFNUy4gUmV0dXJuIC1FSU5WQUwgb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBpbnQgc25kX3BjbV9od19wYXJhbV92YWx1ZShjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQkgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIGludCAqZGlyKQoraW50IHNuZF9wY21faHdfcGFyYW1fdmFsdWUoY29uc3Qgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkgICBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBpbnQgKmRpcikKIHsKIAlpZiAoaHdfaXNfbWFzayh2YXIpKSB7CiAJCWNvbnN0IHN0cnVjdCBzbmRfbWFzayAqbWFzayA9IGh3X3BhcmFtX21hc2tfYyhwYXJhbXMsIHZhcik7CkBAIC0xMjg4LDYxICsxMjIyLDEwIEBACiAJCQkqZGlyID0gaS0+b3Blbm1pbjsKIAkJcmV0dXJuIHNuZF9pbnRlcnZhbF92YWx1ZShpKTsKIAl9Ci0JYXNzZXJ0KDApOwogCXJldHVybiAtRUlOVkFMOwogfQogCi0vKioKLSAqIHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWluCi0gKiBAcGFyYW1zOiB0aGUgaHdfcGFyYW1zIGluc3RhbmNlCi0gKiBAdmFyOiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKLSAqIEBkaXI6IHBvaW50ZXIgdG8gdGhlIGRpcmVjdGlvbiAoLTEsMCwxKSBvciBOVUxMCi0gKgotICogUmV0dXJuIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBmaWVsZCBQQVIuCi0gKi8KLXVuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21pbihjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQkJc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpCi17Ci0JaWYgKGh3X2lzX21hc2sodmFyKSkgewotCQlpZiAoZGlyKQotCQkJKmRpciA9IDA7Ci0JCXJldHVybiBzbmRfbWFza19taW4oaHdfcGFyYW1fbWFza19jKHBhcmFtcywgdmFyKSk7Ci0JfQotCWlmIChod19pc19pbnRlcnZhbCh2YXIpKSB7Ci0JCWNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkgPSBod19wYXJhbV9pbnRlcnZhbF9jKHBhcmFtcywgdmFyKTsKLQkJaWYgKGRpcikKLQkJCSpkaXIgPSBpLT5vcGVubWluOwotCQlyZXR1cm4gc25kX2ludGVydmFsX21pbihpKTsKLQl9Ci0JYXNzZXJ0KDApOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKioKLSAqIHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWF4Ci0gKiBAcGFyYW1zOiB0aGUgaHdfcGFyYW1zIGluc3RhbmNlCi0gKiBAdmFyOiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKLSAqIEBkaXI6IHBvaW50ZXIgdG8gdGhlIGRpcmVjdGlvbiAoLTEsMCwxKSBvciBOVUxMCi0gKgotICogUmV0dXJuIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBmaWVsZCBQQVIuCi0gKi8KLXVuc2lnbmVkIGludCBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlX21heChjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQkJc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpCi17Ci0JaWYgKGh3X2lzX21hc2sodmFyKSkgewotCQlpZiAoZGlyKQotCQkJKmRpciA9IDA7Ci0JCXJldHVybiBzbmRfbWFza19tYXgoaHdfcGFyYW1fbWFza19jKHBhcmFtcywgdmFyKSk7Ci0JfQotCWlmIChod19pc19pbnRlcnZhbCh2YXIpKSB7Ci0JCWNvbnN0IHN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkgPSBod19wYXJhbV9pbnRlcnZhbF9jKHBhcmFtcywgdmFyKTsKLQkJaWYgKGRpcikKLQkJCSpkaXIgPSAtIChpbnQpIGktPm9wZW5tYXg7Ci0JCXJldHVybiBzbmRfaW50ZXJ2YWxfbWF4KGkpOwotCX0KLQlhc3NlcnQoMCk7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcGFyYW1fdmFsdWUpOwogCiB2b2lkIF9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCXNuZF9wY21faHdfcGFyYW1fdCB2YXIpCkBAIC0xMzYwLDQyICsxMjQzLDcgQEAKIAl9CiB9CiAKLWludCBfc25kX3BjbV9od19wYXJhbV9zZXRpbnRlZ2VyKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCSBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyKQotewotCWludCBjaGFuZ2VkOwotCWFzc2VydChod19pc19pbnRlcnZhbCh2YXIpKTsKLQljaGFuZ2VkID0gc25kX2ludGVydmFsX3NldGludGVnZXIoaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCB2YXIpKTsKLQlpZiAoY2hhbmdlZCkgewotCQlwYXJhbXMtPmNtYXNrIHw9IDEgPDwgdmFyOwotCQlwYXJhbXMtPnJtYXNrIHw9IDEgPDwgdmFyOwotCX0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQkKLSNpZiAwCi0vKgotICogc25kX3BjbV9od19wYXJhbV9zZXRpbnRlZ2VyCi0gKgotICogSW5zaWRlIGNvbmZpZ3VyYXRpb24gc3BhY2UgZGVmaW5lZCBieSBQQVJBTVMgcmVtb3ZlIGZyb20gUEFSIGFsbCAKLSAqIG5vbiBpbnRlZ2VyIHZhbHVlcy4gUmVkdWNlIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjb3JkaW5nbHkuCi0gKiBSZXR1cm4gLUVJTlZBTCBpZiB0aGUgY29uZmlndXJhdGlvbiBzcGFjZSBpcyBlbXB0eQotICovCi1pbnQgc25kX3BjbV9od19wYXJhbV9zZXRpbnRlZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLCAKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQlzbmRfcGNtX2h3X3BhcmFtX3QgdmFyKQotewotCWludCBjaGFuZ2VkID0gX3NuZF9wY21faHdfcGFyYW1fc2V0aW50ZWdlcihwYXJhbXMsIHZhcik7Ci0JaWYgKGNoYW5nZWQgPCAwKQotCQlyZXR1cm4gY2hhbmdlZDsKLQlpZiAocGFyYW1zLT5ybWFzaykgewotCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOwotfQotI2VuZGlmICAvKiAgMCAgKi8KK0VYUE9SVF9TWU1CT0woX3NuZF9wY21faHdfcGFyYW1fc2V0ZW1wdHkpOwogCiBzdGF0aWMgaW50IF9zbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCSAgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIpCkBAIC0xNDA1LDEwICsxMjUzLDggQEAKIAkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZV9maXJzdChod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKSk7CiAJZWxzZSBpZiAoaHdfaXNfaW50ZXJ2YWwodmFyKSkKIAkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmVfZmlyc3QoaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCB2YXIpKTsKLQllbHNlIHsKLQkJYXNzZXJ0KDApOworCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCWlmIChjaGFuZ2VkKSB7CiAJCXBhcmFtcy0+Y21hc2sgfD0gMSA8PCB2YXI7CiAJCXBhcmFtcy0+cm1hc2sgfD0gMSA8PCB2YXI7CkBAIC0xNDI4LDIwICsxMjc0LDIyIEBACiAgKiB2YWx1ZXMgPiBtaW5pbXVtLiBSZWR1Y2UgY29uZmlndXJhdGlvbiBzcGFjZSBhY2NvcmRpbmdseS4KICAqIFJldHVybiB0aGUgbWluaW11bS4KICAqLwotc3RhdGljIGludCBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLCAKLQkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLCAKLQkJCQkgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIGludCAqZGlyKQoraW50IHNuZF9wY21faHdfcGFyYW1fZmlyc3Qoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIAorCQkJICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsIAorCQkJICAgc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpCiB7CiAJaW50IGNoYW5nZWQgPSBfc25kX3BjbV9od19wYXJhbV9maXJzdChwYXJhbXMsIHZhcik7CiAJaWYgKGNoYW5nZWQgPCAwKQogCQlyZXR1cm4gY2hhbmdlZDsKIAlpZiAocGFyYW1zLT5ybWFzaykgewogCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOwotCQlhc3NlcnQoZXJyID49IDApOworCQlzbmRfYXNzZXJ0KGVyciA+PSAwLCByZXR1cm4gZXJyKTsKIAl9CiAJcmV0dXJuIHNuZF9wY21faHdfcGFyYW1fdmFsdWUocGFyYW1zLCB2YXIsIGRpcik7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9od19wYXJhbV9maXJzdCk7CisKIHN0YXRpYyBpbnQgX3NuZF9wY21faHdfcGFyYW1fbGFzdChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQkgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIpCiB7CkBAIC0xNDUwLDEwICsxMjk4LDggQEAKIAkJY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZV9sYXN0KGh3X3BhcmFtX21hc2socGFyYW1zLCB2YXIpKTsKIAllbHNlIGlmIChod19pc19pbnRlcnZhbCh2YXIpKQogCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZV9sYXN0KGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgdmFyKSk7Ci0JZWxzZSB7Ci0JCWFzc2VydCgwKTsKKwllbHNlCiAJCXJldHVybiAtRUlOVkFMOwotCX0KIAlpZiAoY2hhbmdlZCkgewogCQlwYXJhbXMtPmNtYXNrIHw9IDEgPDwgdmFyOwogCQlwYXJhbXMtPnJtYXNrIHw9IDEgPDwgdmFyOwpAQCAtMTQ3MywzODEgKzEzMTksMjEgQEAKICAqIHZhbHVlcyA8IG1heGltdW0uIFJlZHVjZSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY29yZGluZ2x5LgogICogUmV0dXJuIHRoZSBtYXhpbXVtLgogICovCi1zdGF0aWMgaW50IHNuZF9wY21faHdfcGFyYW1fbGFzdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwgCi0JCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCSBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBpbnQgKmRpcikKK2ludCBzbmRfcGNtX2h3X3BhcmFtX2xhc3Qoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIAorCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgaW50ICpkaXIpCiB7CiAJaW50IGNoYW5nZWQgPSBfc25kX3BjbV9od19wYXJhbV9sYXN0KHBhcmFtcywgdmFyKTsKIAlpZiAoY2hhbmdlZCA8IDApCiAJCXJldHVybiBjaGFuZ2VkOwogCWlmIChwYXJhbXMtPnJtYXNrKSB7CiAJCWludCBlcnIgPSBzbmRfcGNtX2h3X3JlZmluZShwY20sIHBhcmFtcyk7Ci0JCWFzc2VydChlcnIgPj0gMCk7CisJCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOwogCX0KIAlyZXR1cm4gc25kX3BjbV9od19wYXJhbV92YWx1ZShwYXJhbXMsIHZhciwgZGlyKTsKIH0KIAotaW50IF9zbmRfcGNtX2h3X3BhcmFtX21pbihzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgdW5zaWduZWQgaW50IHZhbCwgaW50IGRpcikKLXsKLQlpbnQgY2hhbmdlZDsKLQlpbnQgb3BlbiA9IDA7Ci0JaWYgKGRpcikgewotCQlpZiAoZGlyID4gMCkgewotCQkJb3BlbiA9IDE7Ci0JCX0gZWxzZSBpZiAoZGlyIDwgMCkgewotCQkJaWYgKHZhbCA+IDApIHsKLQkJCQlvcGVuID0gMTsKLQkJCQl2YWwtLTsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaHdfaXNfbWFzayh2YXIpKQotCQljaGFuZ2VkID0gc25kX21hc2tfcmVmaW5lX21pbihod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKSwgdmFsICsgISFvcGVuKTsKLQllbHNlIGlmIChod19pc19pbnRlcnZhbCh2YXIpKQotCQljaGFuZ2VkID0gc25kX2ludGVydmFsX3JlZmluZV9taW4oaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLCB2YXIpLCB2YWwsIG9wZW4pOwotCWVsc2UgewotCQlhc3NlcnQoMCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoY2hhbmdlZCkgewotCQlwYXJhbXMtPmNtYXNrIHw9IDEgPDwgdmFyOwotCQlwYXJhbXMtPnJtYXNrIHw9IDEgPDwgdmFyOwotCX0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotLyoqCi0gKiBzbmRfcGNtX2h3X3BhcmFtX21pbgotICogQHBjbTogUENNIGluc3RhbmNlCi0gKiBAcGFyYW1zOiB0aGUgaHdfcGFyYW1zIGluc3RhbmNlCi0gKiBAdmFyOiBwYXJhbWV0ZXIgdG8gcmV0cmlldmUKLSAqIEB2YWw6IG1pbmltYWwgdmFsdWUKLSAqIEBkaXI6IHBvaW50ZXIgdG8gdGhlIGRpcmVjdGlvbiAoLTEsMCwxKSBvciBOVUxMCi0gKgotICogSW5zaWRlIGNvbmZpZ3VyYXRpb24gc3BhY2UgZGVmaW5lZCBieSBQQVJBTVMgcmVtb3ZlIGZyb20gUEFSIGFsbCAKLSAqIHZhbHVlcyA8IFZBTC4gUmVkdWNlIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjb3JkaW5nbHkuCi0gKiBSZXR1cm4gbmV3IG1pbmltdW0gb3IgLUVJTlZBTCBpZiB0aGUgY29uZmlndXJhdGlvbiBzcGFjZSBpcyBlbXB0eQotICovCi1zdGF0aWMgaW50IHNuZF9wY21faHdfcGFyYW1fbWluKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQlzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCB1bnNpZ25lZCBpbnQgdmFsLAotCQkJCWludCAqZGlyKQotewotCWludCBjaGFuZ2VkID0gX3NuZF9wY21faHdfcGFyYW1fbWluKHBhcmFtcywgdmFyLCB2YWwsIGRpciA/ICpkaXIgOiAwKTsKLQlpZiAoY2hhbmdlZCA8IDApCi0JCXJldHVybiBjaGFuZ2VkOwotCWlmIChwYXJhbXMtPnJtYXNrKSB7Ci0JCWludCBlcnIgPSBzbmRfcGNtX2h3X3JlZmluZShwY20sIHBhcmFtcyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWluKHBhcmFtcywgdmFyLCBkaXIpOwotfQotCi1zdGF0aWMgaW50IF9zbmRfcGNtX2h3X3BhcmFtX21heChzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCQkgc25kX3BjbV9od19wYXJhbV90IHZhciwgdW5zaWduZWQgaW50IHZhbCwKLQkJCQkgaW50IGRpcikKLXsKLQlpbnQgY2hhbmdlZDsKLQlpbnQgb3BlbiA9IDA7Ci0JaWYgKGRpcikgewotCQlpZiAoZGlyIDwgMCkgewotCQkJb3BlbiA9IDE7Ci0JCX0gZWxzZSBpZiAoZGlyID4gMCkgewotCQkJb3BlbiA9IDE7Ci0JCQl2YWwrKzsKLQkJfQotCX0KLQlpZiAoaHdfaXNfbWFzayh2YXIpKSB7Ci0JCWlmICh2YWwgPT0gMCAmJiBvcGVuKSB7Ci0JCQlzbmRfbWFza19ub25lKGh3X3BhcmFtX21hc2socGFyYW1zLCB2YXIpKTsKLQkJCWNoYW5nZWQgPSAtRUlOVkFMOwotCQl9IGVsc2UKLQkJCWNoYW5nZWQgPSBzbmRfbWFza19yZWZpbmVfbWF4KGh3X3BhcmFtX21hc2socGFyYW1zLCB2YXIpLCB2YWwgLSAhIW9wZW4pOwotCX0gZWxzZSBpZiAoaHdfaXNfaW50ZXJ2YWwodmFyKSkKLQkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmVfbWF4KGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgdmFyKSwgdmFsLCBvcGVuKTsKLQllbHNlIHsKLQkJYXNzZXJ0KDApOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKGNoYW5nZWQpIHsKLQkJcGFyYW1zLT5jbWFzayB8PSAxIDw8IHZhcjsKLQkJcGFyYW1zLT5ybWFzayB8PSAxIDw8IHZhcjsKLQl9Ci0JcmV0dXJuIGNoYW5nZWQ7Ci19Ci0KLS8qKgotICogc25kX3BjbV9od19wYXJhbV9tYXgKLSAqIEBwY206IFBDTSBpbnN0YW5jZQotICogQHBhcmFtczogdGhlIGh3X3BhcmFtcyBpbnN0YW5jZQotICogQHZhcjogcGFyYW1ldGVyIHRvIHJldHJpZXZlCi0gKiBAdmFsOiBtYXhpbWFsIHZhbHVlCi0gKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAotICoKLSAqIEluc2lkZSBjb25maWd1cmF0aW9uIHNwYWNlIGRlZmluZWQgYnkgUEFSQU1TIHJlbW92ZSBmcm9tIFBBUiBhbGwgCi0gKiAgdmFsdWVzID49IFZBTCArIDEuIFJlZHVjZSBjb25maWd1cmF0aW9uIHNwYWNlIGFjY29yZGluZ2x5LgotICogIFJldHVybiBuZXcgbWF4aW11bSBvciAtRUlOVkFMIGlmIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIGVtcHR5Ci0gKi8KLXN0YXRpYyBpbnQgc25kX3BjbV9od19wYXJhbV9tYXgoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCXNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCB2YWwsCi0JCQkJaW50ICpkaXIpCi17Ci0JaW50IGNoYW5nZWQgPSBfc25kX3BjbV9od19wYXJhbV9tYXgocGFyYW1zLCB2YXIsIHZhbCwgZGlyID8gKmRpciA6IDApOwotCWlmIChjaGFuZ2VkIDwgMCkKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JaWYgKHBhcmFtcy0+cm1hc2spIHsKLQkJaW50IGVyciA9IHNuZF9wY21faHdfcmVmaW5lKHBjbSwgcGFyYW1zKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gc25kX3BjbV9od19wYXJhbV92YWx1ZV9tYXgocGFyYW1zLCB2YXIsIGRpcik7Ci19Ci0KLWludCBfc25kX3BjbV9od19wYXJhbV9zZXQoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCB2YWwsIGludCBkaXIpCi17Ci0JaW50IGNoYW5nZWQ7Ci0JaWYgKGh3X2lzX21hc2sodmFyKSkgewotCQlzdHJ1Y3Qgc25kX21hc2sgKm0gPSBod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKTsKLQkJaWYgKHZhbCA9PSAwICYmIGRpciA8IDApIHsKLQkJCWNoYW5nZWQgPSAtRUlOVkFMOwotCQkJc25kX21hc2tfbm9uZShtKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkaXIgPiAwKQotCQkJCXZhbCsrOwotCQkJZWxzZSBpZiAoZGlyIDwgMCkKLQkJCQl2YWwtLTsKLQkJCWNoYW5nZWQgPSBzbmRfbWFza19yZWZpbmVfc2V0KGh3X3BhcmFtX21hc2socGFyYW1zLCB2YXIpLCB2YWwpOwotCQl9Ci0JfSBlbHNlIGlmIChod19pc19pbnRlcnZhbCh2YXIpKSB7Ci0JCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIHZhcik7Ci0JCWlmICh2YWwgPT0gMCAmJiBkaXIgPCAwKSB7Ci0JCQljaGFuZ2VkID0gLUVJTlZBTDsKLQkJCXNuZF9pbnRlcnZhbF9ub25lKGkpOwotCQl9IGVsc2UgaWYgKGRpciA9PSAwKQotCQkJY2hhbmdlZCA9IHNuZF9pbnRlcnZhbF9yZWZpbmVfc2V0KGksIHZhbCk7Ci0JCWVsc2UgewotCQkJc3RydWN0IHNuZF9pbnRlcnZhbCB0OwotCQkJdC5vcGVubWluID0gMTsKLQkJCXQub3Blbm1heCA9IDE7Ci0JCQl0LmVtcHR5ID0gMDsKLQkJCXQuaW50ZWdlciA9IDA7Ci0JCQlpZiAoZGlyIDwgMCkgewotCQkJCXQubWluID0gdmFsIC0gMTsKLQkJCQl0Lm1heCA9IHZhbDsKLQkJCX0gZWxzZSB7Ci0JCQkJdC5taW4gPSB2YWw7Ci0JCQkJdC5tYXggPSB2YWwrMTsKLQkJCX0KLQkJCWNoYW5nZWQgPSBzbmRfaW50ZXJ2YWxfcmVmaW5lKGksICZ0KTsKLQkJfQotCX0gZWxzZSB7Ci0JCWFzc2VydCgwKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChjaGFuZ2VkKSB7Ci0JCXBhcmFtcy0+Y21hc2sgfD0gMSA8PCB2YXI7Ci0JCXBhcmFtcy0+cm1hc2sgfD0gMSA8PCB2YXI7Ci0JfQotCXJldHVybiBjaGFuZ2VkOwotfQotCi0vKioKLSAqIHNuZF9wY21faHdfcGFyYW1fc2V0Ci0gKiBAcGNtOiBQQ00gaW5zdGFuY2UKLSAqIEBwYXJhbXM6IHRoZSBod19wYXJhbXMgaW5zdGFuY2UKLSAqIEB2YXI6IHBhcmFtZXRlciB0byByZXRyaWV2ZQotICogQHZhbDogdmFsdWUgdG8gc2V0Ci0gKiBAZGlyOiBwb2ludGVyIHRvIHRoZSBkaXJlY3Rpb24gKC0xLDAsMSkgb3IgTlVMTAotICoKLSAqIEluc2lkZSBjb25maWd1cmF0aW9uIHNwYWNlIGRlZmluZWQgYnkgUEFSQU1TIHJlbW92ZSBmcm9tIFBBUiBhbGwgCi0gKiB2YWx1ZXMgIT0gVkFMLiBSZWR1Y2UgY29uZmlndXJhdGlvbiBzcGFjZSBhY2NvcmRpbmdseS4KLSAqICBSZXR1cm4gVkFMIG9yIC1FSU5WQUwgaWYgdGhlIGNvbmZpZ3VyYXRpb24gc3BhY2UgaXMgZW1wdHkKLSAqLwotaW50IHNuZF9wY21faHdfcGFyYW1fc2V0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQkJCSBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCB1bnNpZ25lZCBpbnQgdmFsLCBpbnQgZGlyKQotewotCWludCBjaGFuZ2VkID0gX3NuZF9wY21faHdfcGFyYW1fc2V0KHBhcmFtcywgdmFyLCB2YWwsIGRpcik7Ci0JaWYgKGNoYW5nZWQgPCAwKQotCQlyZXR1cm4gY2hhbmdlZDsKLQlpZiAocGFyYW1zLT5ybWFzaykgewotCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiBzbmRfcGNtX2h3X3BhcmFtX3ZhbHVlKHBhcmFtcywgdmFyLCBOVUxMKTsKLX0KLQotc3RhdGljIGludCBfc25kX3BjbV9od19wYXJhbV9tYXNrKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCSAgc25kX3BjbV9od19wYXJhbV90IHZhciwgY29uc3Qgc3RydWN0IHNuZF9tYXNrICp2YWwpCi17Ci0JaW50IGNoYW5nZWQ7Ci0JYXNzZXJ0KGh3X2lzX21hc2sodmFyKSk7Ci0JY2hhbmdlZCA9IHNuZF9tYXNrX3JlZmluZShod19wYXJhbV9tYXNrKHBhcmFtcywgdmFyKSwgdmFsKTsKLQlpZiAoY2hhbmdlZCkgewotCQlwYXJhbXMtPmNtYXNrIHw9IDEgPDwgdmFyOwotCQlwYXJhbXMtPnJtYXNrIHw9IDEgPDwgdmFyOwotCX0KLQlyZXR1cm4gY2hhbmdlZDsKLX0KLQotLyoqCi0gKiBzbmRfcGNtX2h3X3BhcmFtX21hc2sKLSAqIEBwY206IFBDTSBpbnN0YW5jZQotICogQHBhcmFtczogdGhlIGh3X3BhcmFtcyBpbnN0YW5jZQotICogQHZhcjogcGFyYW1ldGVyIHRvIHJldHJpZXZlCi0gKiBAdmFsOiBtYXNrIHRvIGFwcGx5Ci0gKgotICogSW5zaWRlIGNvbmZpZ3VyYXRpb24gc3BhY2UgZGVmaW5lZCBieSBQQVJBTVMgcmVtb3ZlIGZyb20gUEFSIGFsbCB2YWx1ZXMKLSAqIG5vdCBjb250YWluZWQgaW4gTUFTSy4gUmVkdWNlIGNvbmZpZ3VyYXRpb24gc3BhY2UgYWNjb3JkaW5nbHkuCi0gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgb25seSBmb3IgU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUywKLSAqIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIFNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQuCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwKLSAqIGlmIHRoZSBjb25maWd1cmF0aW9uIHNwYWNlIGlzIGVtcHR5Ci0gKi8KLWludCBzbmRfcGNtX2h3X3BhcmFtX21hc2soc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJICBzbmRfcGNtX2h3X3BhcmFtX3QgdmFyLCBjb25zdCBzdHJ1Y3Qgc25kX21hc2sgKnZhbCkKLXsKLQlpbnQgY2hhbmdlZCA9IF9zbmRfcGNtX2h3X3BhcmFtX21hc2socGFyYW1zLCB2YXIsIHZhbCk7Ci0JaWYgKGNoYW5nZWQgPCAwKQotCQlyZXR1cm4gY2hhbmdlZDsKLQlpZiAocGFyYW1zLT5ybWFzaykgewotCQlpbnQgZXJyID0gc25kX3BjbV9od19yZWZpbmUocGNtLCBwYXJhbXMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJvdW5kYXJ5X3N1YihpbnQgYSwgaW50IGFkaXIsCi0JCQlpbnQgYiwgaW50IGJkaXIsCi0JCQlpbnQgKmMsIGludCAqY2RpcikKLXsKLQlhZGlyID0gYWRpciA8IDAgPyAtMSA6IChhZGlyID4gMCA/IDEgOiAwKTsKLQliZGlyID0gYmRpciA8IDAgPyAtMSA6IChiZGlyID4gMCA/IDEgOiAwKTsKLQkqYyA9IGEgLSBiOwotCSpjZGlyID0gYWRpciAtIGJkaXI7Ci0JaWYgKCpjZGlyID09IC0yKSB7Ci0JCWFzc2VydCgqYyA+IElOVF9NSU4pOwotCQkoKmMpLS07Ci0JfSBlbHNlIGlmICgqY2RpciA9PSAyKSB7Ci0JCWFzc2VydCgqYyA8IElOVF9NQVgpOwotCQkoKmMpKys7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJvdW5kYXJ5X2x0KHVuc2lnbmVkIGludCBhLCBpbnQgYWRpciwKLQkJICAgICAgIHVuc2lnbmVkIGludCBiLCBpbnQgYmRpcikKLXsKLQlhc3NlcnQoYSA+IDAgfHwgYWRpciA+PSAwKTsKLQlhc3NlcnQoYiA+IDAgfHwgYmRpciA+PSAwKTsKLQlpZiAoYWRpciA8IDApIHsKLQkJYS0tOwotCQlhZGlyID0gMTsKLQl9IGVsc2UgaWYgKGFkaXIgPiAwKQotCQlhZGlyID0gMTsKLQlpZiAoYmRpciA8IDApIHsKLQkJYi0tOwotCQliZGlyID0gMTsKLQl9IGVsc2UgaWYgKGJkaXIgPiAwKQotCQliZGlyID0gMTsKLQlyZXR1cm4gYSA8IGIgfHwgKGEgPT0gYiAmJiBhZGlyIDwgYmRpcik7Ci19Ci0KLS8qIFJldHVybiAxIGlmIG1pbiBpcyBuZWFyZXIgdG8gYmVzdCB0aGFuIG1heCAqLwotc3RhdGljIGludCBib3VuZGFyeV9uZWFyZXIoaW50IG1pbiwgaW50IG1pbmRpciwKLQkJCSAgIGludCBiZXN0LCBpbnQgYmVzdGRpciwKLQkJCSAgIGludCBtYXgsIGludCBtYXhkaXIpCi17Ci0JaW50IGRtaW4sIGRtaW5kaXI7Ci0JaW50IGRtYXgsIGRtYXhkaXI7Ci0JYm91bmRhcnlfc3ViKGJlc3QsIGJlc3RkaXIsIG1pbiwgbWluZGlyLCAmZG1pbiwgJmRtaW5kaXIpOwotCWJvdW5kYXJ5X3N1YihtYXgsIG1heGRpciwgYmVzdCwgYmVzdGRpciwgJmRtYXgsICZkbWF4ZGlyKTsKLQlyZXR1cm4gYm91bmRhcnlfbHQoZG1pbiwgZG1pbmRpciwgZG1heCwgZG1heGRpcik7Ci19Ci0KLS8qKgotICogc25kX3BjbV9od19wYXJhbV9uZWFyCi0gKiBAcGNtOiBQQ00gaW5zdGFuY2UKLSAqIEBwYXJhbXM6IHRoZSBod19wYXJhbXMgaW5zdGFuY2UKLSAqIEB2YXI6IHBhcmFtZXRlciB0byByZXRyaWV2ZQotICogQGJlc3Q6IHZhbHVlIHRvIHNldAotICogQGRpcjogcG9pbnRlciB0byB0aGUgZGlyZWN0aW9uICgtMSwwLDEpIG9yIE5VTEwKLSAqCi0gKiBJbnNpZGUgY29uZmlndXJhdGlvbiBzcGFjZSBkZWZpbmVkIGJ5IFBBUkFNUyBzZXQgUEFSIHRvIHRoZSBhdmFpbGFibGUgdmFsdWUKLSAqIG5lYXJlc3QgdG8gVkFMLiBSZWR1Y2UgY29uZmlndXJhdGlvbiBzcGFjZSBhY2NvcmRpbmdseS4KLSAqIFRoaXMgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBmb3IgU05EUlZfUENNX0hXX1BBUkFNX0FDQ0VTUywKLSAqIFNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsIFNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQuCi0gKiBSZXR1cm4gdGhlIHZhbHVlIGZvdW5kLgotICAqLwotaW50IHNuZF9wY21faHdfcGFyYW1fbmVhcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnBjbSwgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCi0JCQkgIHNuZF9wY21faHdfcGFyYW1fdCB2YXIsIHVuc2lnbmVkIGludCBiZXN0LCBpbnQgKmRpcikKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnNhdmUgPSBOVUxMOwotCWludCB2OwotCXVuc2lnbmVkIGludCBzYXZlZF9taW47Ci0JaW50IGxhc3QgPSAwOwotCWludCBtaW4sIG1heDsKLQlpbnQgbWluZGlyLCBtYXhkaXI7Ci0JaW50IHZhbGRpciA9IGRpciA/ICpkaXIgOiAwOwotCS8qIEZJWE1FICovCi0JaWYgKGJlc3QgPiBJTlRfTUFYKQotCQliZXN0ID0gSU5UX01BWDsKLQltaW4gPSBtYXggPSBiZXN0OwotCW1pbmRpciA9IG1heGRpciA9IHZhbGRpcjsKLQlpZiAobWF4ZGlyID4gMCkKLQkJbWF4ZGlyID0gMDsKLQllbHNlIGlmIChtYXhkaXIgPT0gMCkKLQkJbWF4ZGlyID0gLTE7Ci0JZWxzZSB7Ci0JCW1heGRpciA9IDE7Ci0JCW1heC0tOwotCX0KLQlzYXZlID0ga21hbGxvYyhzaXplb2YoKnNhdmUpLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2F2ZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQkqc2F2ZSA9ICpwYXJhbXM7Ci0Jc2F2ZWRfbWluID0gbWluOwotCW1pbiA9IHNuZF9wY21faHdfcGFyYW1fbWluKHBjbSwgcGFyYW1zLCB2YXIsIG1pbiwgJm1pbmRpcik7Ci0JaWYgKG1pbiA+PSAwKSB7Ci0JCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zMTsKLQkJaWYgKG1heCA8IDApCi0JCQlnb3RvIF9lbmQ7Ci0JCWlmICgodW5zaWduZWQgaW50KW1pbiA9PSBzYXZlZF9taW4gJiYgbWluZGlyID09IHZhbGRpcikKLQkJCWdvdG8gX2VuZDsKLQkJcGFyYW1zMSA9IGttYWxsb2Moc2l6ZW9mKCpwYXJhbXMxKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChwYXJhbXMxID09IE5VTEwpIHsKLQkJCWtmcmVlKHNhdmUpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJKnBhcmFtczEgPSAqc2F2ZTsKLQkJbWF4ID0gc25kX3BjbV9od19wYXJhbV9tYXgocGNtLCBwYXJhbXMxLCB2YXIsIG1heCwgJm1heGRpcik7Ci0JCWlmIChtYXggPCAwKSB7Ci0JCQlrZnJlZShwYXJhbXMxKTsKLQkJCWdvdG8gX2VuZDsKLQkJfQotCQlpZiAoYm91bmRhcnlfbmVhcmVyKG1heCwgbWF4ZGlyLCBiZXN0LCB2YWxkaXIsIG1pbiwgbWluZGlyKSkgewotCQkJKnBhcmFtcyA9ICpwYXJhbXMxOwotCQkJbGFzdCA9IDE7Ci0JCX0KLQkJa2ZyZWUocGFyYW1zMSk7Ci0JfSBlbHNlIHsKLQkJKnBhcmFtcyA9ICpzYXZlOwotCQltYXggPSBzbmRfcGNtX2h3X3BhcmFtX21heChwY20sIHBhcmFtcywgdmFyLCBtYXgsICZtYXhkaXIpOwotCQlhc3NlcnQobWF4ID49IDApOwotCQlsYXN0ID0gMTsKLQl9Ci0gX2VuZDoKLSAJa2ZyZWUoc2F2ZSk7Ci0JaWYgKGxhc3QpCi0JCXYgPSBzbmRfcGNtX2h3X3BhcmFtX2xhc3QocGNtLCBwYXJhbXMsIHZhciwgZGlyKTsKLQllbHNlCi0JCXYgPSBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHBjbSwgcGFyYW1zLCB2YXIsIGRpcik7Ci0JYXNzZXJ0KHYgPj0gMCk7Ci0JcmV0dXJuIHY7Ci19CitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcGFyYW1fbGFzdCk7CiAKIC8qKgogICogc25kX3BjbV9od19wYXJhbV9jaG9vc2UKQEAgLTE4NTksMzkgKzEzNDUsMzIgQEAKICAqIGZpcnN0IGFjY2VzcywgZmlyc3QgZm9ybWF0LCBmaXJzdCBzdWJmb3JtYXQsIG1pbiBjaGFubmVscywKICAqIG1pbiByYXRlLCBtaW4gcGVyaW9kIHRpbWUsIG1heCBidWZmZXIgc2l6ZSwgbWluIHRpY2sgdGltZQogICovCi1pbnQgc25kX3BjbV9od19wYXJhbXNfY2hvb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqcGNtLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK2ludCBzbmRfcGNtX2h3X3BhcmFtc19jaG9vc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwY20sCisJCQkgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewotCWludCBlcnI7CisJc3RhdGljIGludCB2YXJzW10gPSB7CisJCVNORFJWX1BDTV9IV19QQVJBTV9BQ0NFU1MsCisJCVNORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQsCisJCVNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQsCisJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKKwkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRSwKKwkJU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLAorCQlTTkRSVl9QQ01fSFdfUEFSQU1fVElDS19USU1FLAorCQktMQorCX07CisJaW50IGVyciwgKnY7CiAKLQllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHBjbSwgcGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fQUNDRVNTLCBOVUxMKTsKLQlhc3NlcnQoZXJyID49IDApOwotCi0JZXJyID0gc25kX3BjbV9od19wYXJhbV9maXJzdChwY20sIHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwgTlVMTCk7Ci0JYXNzZXJ0KGVyciA+PSAwKTsKLQotCWVyciA9IHNuZF9wY21faHdfcGFyYW1fZmlyc3QocGNtLCBwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9TVUJGT1JNQVQsIE5VTEwpOwotCWFzc2VydChlcnIgPj0gMCk7Ci0KLQllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHBjbSwgcGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIE5VTEwpOwotCWFzc2VydChlcnIgPj0gMCk7Ci0KLQllcnIgPSBzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KHBjbSwgcGFyYW1zLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgTlVMTCk7Ci0JYXNzZXJ0KGVyciA+PSAwKTsKLQotCWVyciA9IHNuZF9wY21faHdfcGFyYW1fZmlyc3QocGNtLCBwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfVElNRSwgTlVMTCk7Ci0JYXNzZXJ0KGVyciA+PSAwKTsKLQotCWVyciA9IHNuZF9wY21faHdfcGFyYW1fbGFzdChwY20sIHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLCBOVUxMKTsKLQlhc3NlcnQoZXJyID49IDApOwotCi0JZXJyID0gc25kX3BjbV9od19wYXJhbV9maXJzdChwY20sIHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1RJQ0tfVElNRSwgTlVMTCk7Ci0JYXNzZXJ0KGVyciA+PSAwKTsKLQorCWZvciAodiA9IHZhcnM7ICp2ICE9IC0xOyB2KyspIHsKKwkJaWYgKCp2ICE9IFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfU0laRSkKKwkJCWVyciA9IHNuZF9wY21faHdfcGFyYW1fZmlyc3QocGNtLCBwYXJhbXMsICp2LCBOVUxMKTsKKwkJZWxzZQorCQkJZXJyID0gc25kX3BjbV9od19wYXJhbV9sYXN0KHBjbSwgcGFyYW1zLCAqdiwgTlVMTCk7CisJCXNuZF9hc3NlcnQoZXJyID49IDAsIHJldHVybiBlcnIpOworCX0KIAlyZXR1cm4gMDsKIH0KIAotI3VuZGVmIGFzc2VydAotCiBzdGF0aWMgaW50IHNuZF9wY21fbGliX2lvY3RsX3Jlc2V0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgIHZvaWQgKmFyZykKIHsKQEAgLTE5NjcsNiArMTQ0Niw4IEBACiAJcmV0dXJuIC1FTlhJTzsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9pb2N0bCk7CisKIC8qCiAgKiAgQ29uZGl0aW9ucwogICovCkBAIC0yMTAxLDYgKzE1ODIsOCBAQAogCWtpbGxfZmFzeW5jKCZydW50aW1lLT5mYXN5bmMsIFNJR0lPLCBQT0xMX0lOKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKTsKKwogc3RhdGljIGludCBzbmRfcGNtX2xpYl93cml0ZV90cmFuc2ZlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgaHdvZmYsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBkYXRhLCB1bnNpZ25lZCBpbnQgb2ZmLApAQCAtMjI5OSw3ICsxNzgyLDcgQEAKIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKIAkJcmV0dXJuIC1FQkFERkQ7CiAKLQlub25ibG9jayA9ICEhKHN1YnN0cmVhbS0+ZmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlub25ibG9jayA9ICEhKHN1YnN0cmVhbS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogCiAJaWYgKHJ1bnRpbWUtPmFjY2VzcyAhPSBTTkRSVl9QQ01fQUNDRVNTX1JXX0lOVEVSTEVBVkVEICYmCiAJICAgIHJ1bnRpbWUtPmNoYW5uZWxzID4gMSkKQEAgLTIzMDgsNiArMTc5MSw4IEBACiAJCQkJICBzbmRfcGNtX2xpYl93cml0ZV90cmFuc2Zlcik7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfd3JpdGUpOworCiBzdGF0aWMgaW50IHNuZF9wY21fbGliX3dyaXRldl90cmFuc2ZlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgICAgICAgdW5zaWduZWQgaW50IGh3b2ZmLAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGludCBvZmYsCkBAIC0yMzYyLDcgKzE4NDcsNyBAQAogCWlmIChydW50aW1lLT5zdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQogCQlyZXR1cm4gLUVCQURGRDsKIAotCW5vbmJsb2NrID0gISEoc3Vic3RyZWFtLT5mZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW5vbmJsb2NrID0gISEoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAKIAlpZiAocnVudGltZS0+YWNjZXNzICE9IFNORFJWX1BDTV9BQ0NFU1NfUldfTk9OSU5URVJMRUFWRUQpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjM3MCw2ICsxODU1LDggQEAKIAkJCQkgIG5vbmJsb2NrLCBzbmRfcGNtX2xpYl93cml0ZXZfdHJhbnNmZXIpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fbGliX3dyaXRldik7CisKIHN0YXRpYyBpbnQgc25kX3BjbV9saWJfcmVhZF90cmFuc2ZlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgCiAJCQkJICAgICB1bnNpZ25lZCBpbnQgaHdvZmYsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGludCBvZmYsCkBAIC0yNTcyLDEyICsyMDU5LDE0IEBACiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCiAJCXJldHVybiAtRUJBREZEOwogCi0Jbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAlpZiAocnVudGltZS0+YWNjZXNzICE9IFNORFJWX1BDTV9BQ0NFU1NfUldfSU5URVJMRUFWRUQpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBzbmRfcGNtX2xpYl9yZWFkMShzdWJzdHJlYW0sICh1bnNpZ25lZCBsb25nKWJ1Ziwgc2l6ZSwgbm9uYmxvY2ssIHNuZF9wY21fbGliX3JlYWRfdHJhbnNmZXIpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fbGliX3JlYWQpOworCiBzdGF0aWMgaW50IHNuZF9wY21fbGliX3JlYWR2X3RyYW5zZmVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBod29mZiwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIGRhdGEsIHVuc2lnbmVkIGludCBvZmYsCkBAIC0yNjI5LDU4ICsyMTE4LDEwIEBACiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCiAJCXJldHVybiAtRUJBREZEOwogCi0Jbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJbm9uYmxvY2sgPSAhIShzdWJzdHJlYW0tPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAlpZiAocnVudGltZS0+YWNjZXNzICE9IFNORFJWX1BDTV9BQ0NFU1NfUldfTk9OSU5URVJMRUFWRUQpCiAJCXJldHVybiAtRUlOVkFMOwogCXJldHVybiBzbmRfcGNtX2xpYl9yZWFkMShzdWJzdHJlYW0sICh1bnNpZ25lZCBsb25nKWJ1ZnMsIGZyYW1lcywgbm9uYmxvY2ssIHNuZF9wY21fbGliX3JlYWR2X3RyYW5zZmVyKTsKIH0KIAotLyoKLSAqICBFeHBvcnRlZCBzeW1ib2xzCi0gKi8KLQotRVhQT1JUX1NZTUJPTChzbmRfaW50ZXJ2YWxfcmVmaW5lKTsKLUVYUE9SVF9TWU1CT0woc25kX2ludGVydmFsX2xpc3QpOwotRVhQT1JUX1NZTUJPTChzbmRfaW50ZXJ2YWxfcmF0bnVtKTsKLUVYUE9SVF9TWU1CT0woX3NuZF9wY21faHdfcGFyYW1zX2FueSk7Ci1FWFBPUlRfU1lNQk9MKF9zbmRfcGNtX2h3X3BhcmFtX21pbik7Ci1FWFBPUlRfU1lNQk9MKF9zbmRfcGNtX2h3X3BhcmFtX3NldCk7Ci1FWFBPUlRfU1lNQk9MKF9zbmRfcGNtX2h3X3BhcmFtX3NldGVtcHR5KTsKLUVYUE9SVF9TWU1CT0woX3NuZF9wY21faHdfcGFyYW1fc2V0aW50ZWdlcik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcGFyYW1fdmFsdWVfbWluKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19wYXJhbV92YWx1ZV9tYXgpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X3BhcmFtX21hc2spOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X3BhcmFtX2ZpcnN0KTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19wYXJhbV9sYXN0KTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19wYXJhbV9uZWFyKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19wYXJhbV9zZXQpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X3JlZmluZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludHNfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludHNfY29tcGxldGUpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19jb25zdHJhaW50X3JhdG51bXMpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcmF0ZGVucyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfY29uc3RyYWludF9tc2JpdHMpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2h3X2NvbnN0cmFpbnRfcG93Mik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcnVsZV9hZGQpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX3NldF9vcHMpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX3NldF9zeW5jKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfaW9jdGwpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX3N0b3ApOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfd3JpdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9yZWFkKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfd3JpdGV2KTsKIEVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfcmVhZHYpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMpOwotLyogcGNtX21lbW9yeS5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzKTsKLUVYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9wY21fc2didWZfb3BzX3BhZ2UpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMpOwotRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX21lbW9yeS5jIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKaW5kZXggNDI4ZjhjMS4uMDY3ZDIwNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9wY21fbWVtb3J5LmMKQEAgLTEyNiw2ICsxMjYsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbCk7CisKICNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJPQ0ZTCiAvKgogICogcmVhZCBjYWxsYmFjayBmb3IgcHJlYWxsb2MgcHJvYyBmaWxlCkBAIC0xOTEsOSArMTkzLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KHN1YnN0cmVhbS0+cGNtLT5jYXJkLCAicHJlYWxsb2MiLCBzdWJzdHJlYW0tPnByb2Nfcm9vdCkpICE9IE5VTEwpIHsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA2NDsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcHJvY19yZWFkOwotCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3Byb2Nfd3JpdGU7CiAJCWVudHJ5LT5tb2RlIHw9IFNfSVdVU1I7CiAJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBzdWJzdHJlYW07CkBAIC0yNTMsNiArMjUzLDggQEAKIAlyZXR1cm4gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXMxKHN1YnN0cmVhbSwgc2l6ZSwgbWF4KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlcyk7CisKIC8qKgogICogc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCAtIHByZS1hbGxvY2F0aW9uIGZvciBjb250aW5vdXMgbWVtb3J5IHR5cGUgKGFsbCBzdWJzdHJlYW1zKQogICogQHBjbTogdGhlIHBjbSBpbnN0YW5jZQpAQCAtMjgwLDYgKzI4Miw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCk7CisKIC8qKgogICogc25kX3BjbV9zZ2J1Zl9vcHNfcGFnZSAtIGdldCB0aGUgcGFnZSBzdHJ1Y3QgYXQgdGhlIGdpdmVuIG9mZnNldAogICogQHN1YnN0cmVhbTogdGhlIHBjbSBzdWJzdHJlYW0gaW5zdGFuY2UKQEAgLTI5OCw2ICszMDIsOCBAQAogCXJldHVybiBzZ2J1Zi0+cGFnZV90YWJsZVtpZHhdOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fc2didWZfb3BzX3BhZ2UpOworCiAvKioKICAqIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyAtIGFsbG9jYXRlIHRoZSBETUEgYnVmZmVyCiAgKiBAc3Vic3RyZWFtOiB0aGUgc3Vic3RyZWFtIHRvIGFsbG9jYXRlIHRoZSBETUEgYnVmZmVyIHRvCkBAIC0zNDksNiArMzU1LDggQEAKIAlyZXR1cm4gMTsJCQkvKiBhcmVhIHdhcyBjaGFuZ2VkICovCiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKTsKKwogLyoqCiAgKiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzIC0gcmVsZWFzZSB0aGUgYWxsb2NhdGVkIERNQSBidWZmZXIuCiAgKiBAc3Vic3RyZWFtOiB0aGUgc3Vic3RyZWFtIHRvIHJlbGVhc2UgdGhlIERNQSBidWZmZXIKQEAgLTM3NCwzICszODIsNSBAQAogCXNuZF9wY21fc2V0X3J1bnRpbWVfYnVmZmVyKHN1YnN0cmVhbSwgTlVMTCk7CiAJcmV0dXJuIDA7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfZnJlZV9wYWdlcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9taXNjLmMgYi9zb3VuZC9jb3JlL3BjbV9taXNjLmMKaW5kZXggNTkzYzc3Zi4uMDAxOWM1OSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbWlzYy5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX21pc2MuYwpAQCAtMjA3LDYgKzIwNyw4IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9zaWduZWQpOworCiAvKioKICAqIHNuZF9wY21fZm9ybWF0X3Vuc2lnbmVkIC0gQ2hlY2sgdGhlIFBDTSBmb3JtYXQgaXMgdW5zaWduZWQgbGluZWFyCiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCkBAIC0yMjQsNiArMjI2LDggQEAKIAlyZXR1cm4gIXZhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF91bnNpZ25lZCk7CisKIC8qKgogICogc25kX3BjbV9mb3JtYXRfbGluZWFyIC0gQ2hlY2sgdGhlIFBDTSBmb3JtYXQgaXMgbGluZWFyCiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCkBAIC0yMzUsNiArMjM5LDggQEAKIAlyZXR1cm4gc25kX3BjbV9mb3JtYXRfc2lnbmVkKGZvcm1hdCkgPj0gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9saW5lYXIpOworCiAvKioKICAqIHNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4gLSBDaGVjayB0aGUgUENNIGZvcm1hdCBpcyBsaXR0bGUtZW5kaWFuCiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCkBAIC0yNTIsNiArMjU4LDggQEAKIAlyZXR1cm4gdmFsOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X2xpdHRsZV9lbmRpYW4pOworCiAvKioKICAqIHNuZF9wY21fZm9ybWF0X2JpZ19lbmRpYW4gLSBDaGVjayB0aGUgUENNIGZvcm1hdCBpcyBiaWctZW5kaWFuCiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCkBAIC0yNjksNiArMjc3LDggQEAKIAlyZXR1cm4gIXZhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9iaWdfZW5kaWFuKTsKKwogLyoqCiAgKiBzbmRfcGNtX2Zvcm1hdF93aWR0aCAtIHJldHVybiB0aGUgYml0LXdpZHRoIG9mIHRoZSBmb3JtYXQKICAqIEBmb3JtYXQ6IHRoZSBmb3JtYXQgdG8gY2hlY2sKQEAgLTI4Niw2ICsyOTYsOCBAQAogCXJldHVybiB2YWw7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9mb3JtYXRfd2lkdGgpOworCiAvKioKICAqIHNuZF9wY21fZm9ybWF0X3BoeXNpY2FsX3dpZHRoIC0gcmV0dXJuIHRoZSBwaHlzaWNhbCBiaXQtd2lkdGggb2YgdGhlIGZvcm1hdAogICogQGZvcm1hdDogdGhlIGZvcm1hdCB0byBjaGVjawpAQCAtMzAzLDYgKzMxNSw4IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aCk7CisKIC8qKgogICogc25kX3BjbV9mb3JtYXRfc2l6ZSAtIHJldHVybiB0aGUgYnl0ZSBzaXplIG9mIHNhbXBsZXMgb24gdGhlIGdpdmVuIGZvcm1hdAogICogQGZvcm1hdDogdGhlIGZvcm1hdCB0byBjaGVjawpAQCAtMzE4LDYgKzMzMiw4IEBACiAJcmV0dXJuIHNhbXBsZXMgKiBwaHlzX3dpZHRoIC8gODsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX2Zvcm1hdF9zaXplKTsKKwogLyoqCiAgKiBzbmRfcGNtX2Zvcm1hdF9zaWxlbmNlXzY0IC0gcmV0dXJuIHRoZSBzaWxlbnQgZGF0YSBpbiA4IGJ5dGVzIGFycmF5CiAgKiBAZm9ybWF0OiB0aGUgZm9ybWF0IHRvIGNoZWNrCkBAIC0zMzMsNiArMzQ5LDggQEAKIAlyZXR1cm4gcGNtX2Zvcm1hdHNbZm9ybWF0XS5zaWxlbmNlOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3NpbGVuY2VfNjQpOworCiAvKioKICAqIHNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlIC0gc2V0IHRoZSBzaWxlbmNlIGRhdGEgb24gdGhlIGJ1ZmZlcgogICogQGZvcm1hdDogdGhlIFBDTSBmb3JtYXQKQEAgLTQwMiw2ICs0MjAsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKTsKKwogLyogW3dpZHRoXVt1bnNpZ25lZF1bYmlnZW5kaWFuXSAqLwogc3RhdGljIGludCBsaW5lYXJfZm9ybWF0c1s0XVsyXVsyXSA9IHsKIAl7eyBTTkRSVl9QQ01fRk9STUFUX1M4LCBTTkRSVl9QQ01fRk9STUFUX1M4fSwKQEAgLTQzMiw2ICs0NTIsOCBAQAogCXJldHVybiBsaW5lYXJfZm9ybWF0c1t3aWR0aF1bISF1bnNpZ25kXVshIWJpZ19lbmRpYW5dOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fYnVpbGRfbGluZWFyX2Zvcm1hdCk7CisKIC8qKgogICogc25kX3BjbV9saW1pdF9od19yYXRlcyAtIGRldGVybWluZSByYXRlX21pbi9yYXRlX21heCBmaWVsZHMKICAqIEBydW50aW1lOiB0aGUgcnVudGltZSBpbnN0YW5jZQpAQCAtNDYzLDMgKzQ4NSw1IEBACiAJfQogCXJldHVybiAwOwogfQorCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fbGltaXRfaHdfcmF0ZXMpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAwODYwYzVhLi40MzlmMDQ3IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtNzEsOCArNzEsOSBAQAogICovCiAKIERFRklORV9SV0xPQ0soc25kX3BjbV9saW5rX3J3bG9jayk7Ci1zdGF0aWMgREVDTEFSRV9SV1NFTShzbmRfcGNtX2xpbmtfcndzZW0pOworRVhQT1JUX1NZTUJPTChzbmRfcGNtX2xpbmtfcndsb2NrKTsKIAorc3RhdGljIERFQ0xBUkVfUldTRU0oc25kX3BjbV9saW5rX3J3c2VtKTsKIAogc3RhdGljIGlubGluZSBtbV9zZWdtZW50X3Qgc25kX2VudGVyX3VzZXIodm9pZCkKIHsKQEAgLTMxOSw2ICszMjAsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21faHdfcmVmaW5lKTsKKwogc3RhdGljIGludCBzbmRfcGNtX2h3X3JlZmluZV91c2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zIF9fdXNlciAqIF9wYXJhbXMpCiB7CkBAIC0zNjksNyArMzcyLDcgQEAKICNpZiBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TUykgfHwgZGVmaW5lZChDT05GSUdfU05EX1BDTV9PU1NfTU9EVUxFKQogCWlmICghc3Vic3RyZWFtLT5vc3Mub3NzKQogI2VuZGlmCi0JCWlmIChhdG9taWNfcmVhZCgmcnVudGltZS0+bW1hcF9jb3VudCkpCisJCWlmIChhdG9taWNfcmVhZCgmc3Vic3RyZWFtLT5tbWFwX2NvdW50KSkKIAkJCXJldHVybiAtRUJBREZEOwogCiAJcGFyYW1zLT5ybWFzayA9IH4wVTsKQEAgLTQ4Miw3ICs0ODUsNyBAQAogCQlyZXR1cm4gLUVCQURGRDsKIAl9CiAJc25kX3BjbV9zdHJlYW1fdW5sb2NrX2lycShzdWJzdHJlYW0pOwotCWlmIChhdG9taWNfcmVhZCgmcnVudGltZS0+bW1hcF9jb3VudCkpCisJaWYgKGF0b21pY19yZWFkKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpKQogCQlyZXR1cm4gLUVCQURGRDsKIAlpZiAoc3Vic3RyZWFtLT5vcHMtPmh3X2ZyZWUpCiAJCXJlc3VsdCA9IHN1YnN0cmVhbS0+b3BzLT5od19mcmVlKHN1YnN0cmVhbSk7CkBAIC05MzYsNiArOTM5LDggQEAKIAlyZXR1cm4gc25kX3BjbV9hY3Rpb24oJnNuZF9wY21fYWN0aW9uX3N0b3AsIHN1YnN0cmVhbSwgc3RhdGUpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fc3RvcCk7CisKIC8qKgogICogc25kX3BjbV9kcmFpbl9kb25lCiAgKiBAc3Vic3RyZWFtOiB0aGUgUENNIHN1YnN0cmVhbQpAQCAtMTA4NSw2ICsxMDkwLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fc3VzcGVuZCk7CisKIC8qKgogICogc25kX3BjbV9zdXNwZW5kX2FsbAogICogQHBjbTogdGhlIFBDTSBpbnN0YW5jZQpAQCAtMTExNCw2ICsxMTIxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX3N1c3BlbmRfYWxsKTsKKwogLyogcmVzdW1lICovCiAKIHN0YXRpYyBpbnQgc25kX3BjbV9wcmVfcmVzdW1lKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgc3RhdGUpCkBAIC0xMjc1LDEzICsxMjg0LDE2IEBACiAvKgogICogcHJlcGFyZSBpb2N0bAogICovCi1zdGF0aWMgaW50IHNuZF9wY21fcHJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBzdGF0ZSkKKy8qIHdlIHVzZSB0aGUgc2Vjb25kIGFyZ3VtZW50IGZvciB1cGRhdGluZyBmX2ZsYWdzICovCitzdGF0aWMgaW50IHNuZF9wY21fcHJlX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgICAgaW50IGZfZmxhZ3MpCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKIAkJcmV0dXJuIC1FQkFERkQ7CiAJaWYgKHNuZF9wY21fcnVubmluZyhzdWJzdHJlYW0pKQogCQlyZXR1cm4gLUVCVVNZOworCXN1YnN0cmVhbS0+Zl9mbGFncyA9IGZfZmxhZ3M7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzMTAsMTcgKzEzMjIsMjYgQEAKIC8qKgogICogc25kX3BjbV9wcmVwYXJlCiAgKiBAc3Vic3RyZWFtOiB0aGUgUENNIHN1YnN0cmVhbSBpbnN0YW5jZQorICogQGZpbGU6IGZpbGUgdG8gcmVmZXIgZl9mbGFncwogICoKICAqIFByZXBhcmUgdGhlIFBDTSBzdWJzdHJlYW0gdG8gYmUgdHJpZ2dlcmFibGUuCiAgKi8KLXN0YXRpYyBpbnQgc25kX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQorc3RhdGljIGludCBzbmRfcGNtX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlpbnQgcmVzOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHN1YnN0cmVhbS0+cGNtLT5jYXJkOworCWludCBmX2ZsYWdzOworCisJaWYgKGZpbGUpCisJCWZfZmxhZ3MgPSBmaWxlLT5mX2ZsYWdzOworCWVsc2UKKwkJZl9mbGFncyA9IHN1YnN0cmVhbS0+Zl9mbGFnczsKIAogCXNuZF9wb3dlcl9sb2NrKGNhcmQpOwogCWlmICgocmVzID0gc25kX3Bvd2VyX3dhaXQoY2FyZCwgU05EUlZfQ1RMX1BPV0VSX0QwKSkgPj0gMCkKLQkJcmVzID0gc25kX3BjbV9hY3Rpb25fbm9uYXRvbWljKCZzbmRfcGNtX2FjdGlvbl9wcmVwYXJlLCBzdWJzdHJlYW0sIDApOworCQlyZXMgPSBzbmRfcGNtX2FjdGlvbl9ub25hdG9taWMoJnNuZF9wY21fYWN0aW9uX3ByZXBhcmUsCisJCQkJCSAgICAgICBzdWJzdHJlYW0sIGZfZmxhZ3MpOwogCXNuZF9wb3dlcl91bmxvY2soY2FyZCk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTEzMzEsNyArMTM1Miw3IEBACiAKIHN0YXRpYyBpbnQgc25kX3BjbV9wcmVfZHJhaW5faW5pdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHN0YXRlKQogewotCWlmIChzdWJzdHJlYW0tPmZmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwlpZiAoc3Vic3RyZWFtLT5mX2ZsYWdzICYgT19OT05CTE9DSykKIAkJcmV0dXJuIC1FQUdBSU47CiAJc3Vic3RyZWFtLT5ydW50aW1lLT50cmlnZ2VyX21hc3RlciA9IHN1YnN0cmVhbTsKIAlyZXR1cm4gMDsKQEAgLTE0NDgsOCArMTQ2OSw2IEBACiAJCX0KIAl9CiAJdXBfcmVhZCgmc25kX3BjbV9saW5rX3J3c2VtKTsKLQlpZiAoISBudW1fZHJlY3MpCi0JCWdvdG8gX2Vycm9yOwogCiAJc25kX3BjbV9zdHJlYW1fbG9ja19pcnEoc3Vic3RyZWFtKTsKIAkvKiByZXN1bWUgcGF1c2UgKi8KQEAgLTIwMDYsNiArMjAyNSwxMCBAQAogCiB2b2lkIHNuZF9wY21fcmVsZWFzZV9zdWJzdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CisJc3Vic3RyZWFtLT5yZWZfY291bnQtLTsKKwlpZiAoc3Vic3RyZWFtLT5yZWZfY291bnQgPiAwKQorCQlyZXR1cm47CisKIAlzbmRfcGNtX2Ryb3Aoc3Vic3RyZWFtKTsKIAlpZiAoc3Vic3RyZWFtLT5od19vcGVuZWQpIHsKIAkJaWYgKHN1YnN0cmVhbS0+b3BzLT5od19mcmVlICE9IE5VTEwpCkBAIC0yMDIwLDYgKzIwNDMsOCBAQAogCXNuZF9wY21fZGV0YWNoX3N1YnN0cmVhbShzdWJzdHJlYW0pOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fcmVsZWFzZV9zdWJzdHJlYW0pOworCiBpbnQgc25kX3BjbV9vcGVuX3N1YnN0cmVhbShzdHJ1Y3Qgc25kX3BjbSAqcGNtLCBpbnQgc3RyZWFtLAogCQkJICAgc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKipyc3Vic3RyZWFtKQpAQCAtMjAzMCw2ICsyMDU1LDExIEBACiAJZXJyID0gc25kX3BjbV9hdHRhY2hfc3Vic3RyZWFtKHBjbSwgc3RyZWFtLCBmaWxlLCAmc3Vic3RyZWFtKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwlpZiAoc3Vic3RyZWFtLT5yZWZfY291bnQgPiAxKSB7CisJCSpyc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCQlyZXR1cm4gMDsKKwl9CisKIAlzdWJzdHJlYW0tPm5vX21tYXBfY3RybCA9IDA7CiAJZXJyID0gc25kX3BjbV9od19jb25zdHJhaW50c19pbml0KHN1YnN0cmVhbSk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTIwNTYsNiArMjA4Niw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfcGNtX29wZW5fc3Vic3RyZWFtKTsKKwogc3RhdGljIGludCBzbmRfcGNtX29wZW5fZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICAgc3RydWN0IHNuZF9wY20gKnBjbSwKIAkJCSAgICAgaW50IHN0cmVhbSwKQEAgLTIwNzMsMTcgKzIxMDUsMjAgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXBjbV9maWxlID0ga3phbGxvYyhzaXplb2YoKnBjbV9maWxlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBjbV9maWxlID09IE5VTEwpIHsKLQkJc25kX3BjbV9yZWxlYXNlX3N1YnN0cmVhbShzdWJzdHJlYW0pOwotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoc3Vic3RyZWFtLT5yZWZfY291bnQgPiAxKQorCQlwY21fZmlsZSA9IHN1YnN0cmVhbS0+ZmlsZTsKKwllbHNlIHsKKwkJcGNtX2ZpbGUgPSBremFsbG9jKHNpemVvZigqcGNtX2ZpbGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBjbV9maWxlID09IE5VTEwpIHsKKwkJCXNuZF9wY21fcmVsZWFzZV9zdWJzdHJlYW0oc3Vic3RyZWFtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXN0ciA9IHN1YnN0cmVhbS0+cHN0cjsKKwkJc3Vic3RyZWFtLT5maWxlID0gcGNtX2ZpbGU7CisJCXN1YnN0cmVhbS0+cGNtX3JlbGVhc2UgPSBwY21fcmVsZWFzZV9wcml2YXRlOworCQlwY21fZmlsZS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCQlzbmRfcGNtX2FkZF9maWxlKHN0ciwgcGNtX2ZpbGUpOwogCX0KLQlzdHIgPSBzdWJzdHJlYW0tPnBzdHI7Ci0Jc3Vic3RyZWFtLT5maWxlID0gcGNtX2ZpbGU7Ci0Jc3Vic3RyZWFtLT5wY21fcmVsZWFzZSA9IHBjbV9yZWxlYXNlX3ByaXZhdGU7Ci0JcGNtX2ZpbGUtPnN1YnN0cmVhbSA9IHN1YnN0cmVhbTsKLQlzbmRfcGNtX2FkZF9maWxlKHN0ciwgcGNtX2ZpbGUpOwotCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gcGNtX2ZpbGU7CiAJKnJwY21fZmlsZSA9IHBjbV9maWxlOwogCXJldHVybiAwOwpAQCAtMjE3MCw3ICsyMjA1LDYgQEAKIAlwY21fZmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdWJzdHJlYW0gPSBwY21fZmlsZS0+c3Vic3RyZWFtOwogCXNuZF9hc3NlcnQoc3Vic3RyZWFtICE9IE5VTEwsIHJldHVybiAtRU5YSU8pOwotCXNuZF9hc3NlcnQoIWF0b21pY19yZWFkKCZzdWJzdHJlYW0tPnJ1bnRpbWUtPm1tYXBfY291bnQpLCApOwogCXBjbSA9IHN1YnN0cmVhbS0+cGNtOwogCWZhc3luY19oZWxwZXIoLTEsIGZpbGUsIDAsICZzdWJzdHJlYW0tPnJ1bnRpbWUtPmZhc3luYyk7CiAJbXV0ZXhfbG9jaygmcGNtLT5vcGVuX211dGV4KTsKQEAgLTI0OTMsNyArMjUyNyw4IEBACiAJcmV0dXJuIDA7CiB9CiAJCQotc3RhdGljIGludCBzbmRfcGNtX2NvbW1vbl9pb2N0bDEoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCitzdGF0aWMgaW50IHNuZF9wY21fY29tbW9uX2lvY3RsMShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CkBAIC0yNTE4LDcgKzI1NTMsNyBAQAogCWNhc2UgU05EUlZfUENNX0lPQ1RMX0NIQU5ORUxfSU5GTzoKIAkJcmV0dXJuIHNuZF9wY21fY2hhbm5lbF9pbmZvX3VzZXIoc3Vic3RyZWFtLCBhcmcpOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1BSRVBBUkU6Ci0JCXJldHVybiBzbmRfcGNtX3ByZXBhcmUoc3Vic3RyZWFtKTsKKwkJcmV0dXJuIHNuZF9wY21fcHJlcGFyZShzdWJzdHJlYW0sIGZpbGUpOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1JFU0VUOgogCQlyZXR1cm4gc25kX3BjbV9yZXNldChzdWJzdHJlYW0pOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1NUQVJUOgpAQCAtMjU2MCw3ICsyNTk1LDggQEAKIAlyZXR1cm4gLUVOT1RUWTsKIH0KIAotc3RhdGljIGludCBzbmRfcGNtX3BsYXliYWNrX2lvY3RsMShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKK3N0YXRpYyBpbnQgc25kX3BjbV9wbGF5YmFja19pb2N0bDEoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzbmRfYXNzZXJ0KHN1YnN0cmVhbSAhPSBOVUxMLCByZXR1cm4gLUVOWElPKTsKQEAgLTI2MzYsMTAgKzI2NzIsMTEgQEAKIAkJcmV0dXJuIHJlc3VsdCA8IDAgPyByZXN1bHQgOiAwOwogCX0KIAl9Ci0JcmV0dXJuIHNuZF9wY21fY29tbW9uX2lvY3RsMShzdWJzdHJlYW0sIGNtZCwgYXJnKTsKKwlyZXR1cm4gc25kX3BjbV9jb21tb25faW9jdGwxKGZpbGUsIHN1YnN0cmVhbSwgY21kLCBhcmcpOwogfQogCi1zdGF0aWMgaW50IHNuZF9wY21fY2FwdHVyZV9pb2N0bDEoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCitzdGF0aWMgaW50IHNuZF9wY21fY2FwdHVyZV9pb2N0bDEoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCQkgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7CiAJc25kX2Fzc2VydChzdWJzdHJlYW0gIT0gTlVMTCwgcmV0dXJuIC1FTlhJTyk7CkBAIC0yNzE1LDcgKzI3NTIsNyBAQAogCQlyZXR1cm4gcmVzdWx0IDwgMCA/IHJlc3VsdCA6IDA7CiAJfQogCX0KLQlyZXR1cm4gc25kX3BjbV9jb21tb25faW9jdGwxKHN1YnN0cmVhbSwgY21kLCBhcmcpOworCXJldHVybiBzbmRfcGNtX2NvbW1vbl9pb2N0bDEoZmlsZSwgc3Vic3RyZWFtLCBjbWQsIGFyZyk7CiB9CiAKIHN0YXRpYyBsb25nIHNuZF9wY21fcGxheWJhY2tfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCkBAIC0yNzI4LDcgKzI3NjUsOCBAQAogCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdBJykKIAkJcmV0dXJuIC1FTk9UVFk7CiAKLQlyZXR1cm4gc25kX3BjbV9wbGF5YmFja19pb2N0bDEocGNtX2ZpbGUtPnN1YnN0cmVhbSwgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCXJldHVybiBzbmRfcGNtX3BsYXliYWNrX2lvY3RsMShmaWxlLCBwY21fZmlsZS0+c3Vic3RyZWFtLCBjbWQsCisJCQkJICAgICAgICh2b2lkIF9fdXNlciAqKWFyZyk7CiB9CiAKIHN0YXRpYyBsb25nIHNuZF9wY21fY2FwdHVyZV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKQEAgLTI3NDEsNyArMjc3OSw4IEBACiAJaWYgKCgoY21kID4+IDgpICYgMHhmZikgIT0gJ0EnKQogCQlyZXR1cm4gLUVOT1RUWTsKIAotCXJldHVybiBzbmRfcGNtX2NhcHR1cmVfaW9jdGwxKHBjbV9maWxlLT5zdWJzdHJlYW0sIGNtZCwgKHZvaWQgX191c2VyICopYXJnKTsKKwlyZXR1cm4gc25kX3BjbV9jYXB0dXJlX2lvY3RsMShmaWxlLCBwY21fZmlsZS0+c3Vic3RyZWFtLCBjbWQsCisJCQkJICAgICAgKHZvaWQgX191c2VyICopYXJnKTsKIH0KIAogaW50IHNuZF9wY21fa2VybmVsX2lvY3RsKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLApAQCAtMjc1MywxMiArMjc5MiwxMiBAQAogCWZzID0gc25kX2VudGVyX3VzZXIoKTsKIAlzd2l0Y2ggKHN1YnN0cmVhbS0+c3RyZWFtKSB7CiAJY2FzZSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLOgotCQlyZXN1bHQgPSBzbmRfcGNtX3BsYXliYWNrX2lvY3RsMShzdWJzdHJlYW0sCi0JCQkJCQkgY21kLCAodm9pZCBfX3VzZXIgKilhcmcpOworCQlyZXN1bHQgPSBzbmRfcGNtX3BsYXliYWNrX2lvY3RsMShOVUxMLCBzdWJzdHJlYW0sIGNtZCwKKwkJCQkJCSAodm9pZCBfX3VzZXIgKilhcmcpOwogCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRToKLQkJcmVzdWx0ID0gc25kX3BjbV9jYXB0dXJlX2lvY3RsMShzdWJzdHJlYW0sCi0JCQkJCQljbWQsICh2b2lkIF9fdXNlciAqKWFyZyk7CisJCXJlc3VsdCA9IHNuZF9wY21fY2FwdHVyZV9pb2N0bDEoTlVMTCwgc3Vic3RyZWFtLCBjbWQsCisJCQkJCQkodm9pZCBfX3VzZXIgKilhcmcpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXN1bHQgPSAtRUlOVkFMOwpAQCAtMjc2OCw2ICsyODA3LDggQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9wY21fa2VybmVsX2lvY3RsKTsKKwogc3RhdGljIHNzaXplX3Qgc25kX3BjbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCiAJCQkgICAgbG9mZl90ICogb2Zmc2V0KQogewpAQCAtMzEzNCw3ICszMTc1LDcgQEAKIAlhcmVhLT52bV9vcHMgPSAmc25kX3BjbV92bV9vcHNfZGF0YTsKIAlhcmVhLT52bV9wcml2YXRlX2RhdGEgPSBzdWJzdHJlYW07CiAJYXJlYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7Ci0JYXRvbWljX2luYygmc3Vic3RyZWFtLT5ydW50aW1lLT5tbWFwX2NvdW50KTsKKwlhdG9taWNfaW5jKCZzdWJzdHJlYW0tPm1tYXBfY291bnQpOwogCXJldHVybiAwOwogfQogCkBAIC0zMTY2LDkgKzMyMDcsMTEgQEAKIAkJCQkoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkciArIG9mZnNldCkgPj4gUEFHRV9TSElGVCwKIAkJCQlzaXplLCBhcmVhLT52bV9wYWdlX3Byb3QpKQogCQlyZXR1cm4gLUVBR0FJTjsKLQlhdG9taWNfaW5jKCZzdWJzdHJlYW0tPnJ1bnRpbWUtPm1tYXBfY291bnQpOworCWF0b21pY19pbmMoJnN1YnN0cmVhbS0+bW1hcF9jb3VudCk7CiAJcmV0dXJuIDA7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9saWJfbW1hcF9pb21lbSk7CiAjZW5kaWYgLyogU05EUlZfUENNX0lORk9fTU1BUCAqLwogCiAvKgpAQCAtMzIxMiw2ICszMjU1LDggQEAKIAkJcmV0dXJuIHNuZF9wY21fZGVmYXVsdF9tbWFwKHN1YnN0cmVhbSwgYXJlYSk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3BjbV9tbWFwX2RhdGEpOworCiBzdGF0aWMgaW50IHNuZF9wY21fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQogewogCXN0cnVjdCBzbmRfcGNtX2ZpbGUgKiBwY21fZmlsZTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jIGIvc291bmQvY29yZS9yYXdtaWRpLmMKaW5kZXggODdiNDdjOS4uOGMxNWM2NiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9yYXdtaWRpLmMKKysrIGIvc291bmQvY29yZS9yYXdtaWRpLmMKQEAgLTQzLDcgKzQzLDcgQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogI2lmZGVmIENPTkZJR19TTkRfT1NTRU1VTAotc3RhdGljIGludCBtaWRpX21hcFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSAwfTsKK3N0YXRpYyBpbnQgbWlkaV9tYXBbU05EUlZfQ0FSRFNdOwogc3RhdGljIGludCBhbWlkaV9tYXBbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gMX07CiBtb2R1bGVfcGFyYW1fYXJyYXkobWlkaV9tYXAsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG1pZGlfbWFwLCAiUmF3IE1JREkgZGV2aWNlIG51bWJlciBhc3NpZ25lZCB0byAxc3QgT1NTIGRldmljZS4iKTsKQEAgLTE1NjEsNyArMTU2MSw2IEBACiAJZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShybWlkaS0+Y2FyZCwgbmFtZSwgcm1pZGktPmNhcmQtPnByb2Nfcm9vdCk7CiAJaWYgKGVudHJ5KSB7CiAJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBybWlkaTsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAxMDI0OwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfcmF3bWlkaV9wcm9jX2luZm9fcmVhZDsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKaW5kZXggYjk5MTk3OC4uZTcyMzQxMyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCkBAIC0yOTEsNyArMjkxLDYgQEAKIAogCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CiAJZW50cnktPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAxMDI0OwogCWVudHJ5LT5jLnRleHQucmVhZCA9IGluZm9fcmVhZDsKIAlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewogCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcS5jIGIvc291bmQvY29yZS9zZXEvc2VxLmMKaW5kZXggMjBmOTU0Yi4uMmYwZDg3NyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxLmMKQEAgLTEyOSwyNSArMTI5LDMgQEAKIAogbW9kdWxlX2luaXQoYWxzYV9zZXFfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2Ffc2VxX2V4aXQpCi0KLSAgLyogc2VxX2NsaWVudG1nci5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfY3JlYXRlX2tlcm5lbF9jbGllbnQpOwotRVhQT1JUX1NZTUJPTChzbmRfc2VxX2RlbGV0ZV9rZXJuZWxfY2xpZW50KTsKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9rZXJuZWxfY2xpZW50X2VucXVldWUpOwotRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfZW5xdWV1ZV9ibG9ja2luZyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfa2VybmVsX2NsaWVudF9kaXNwYXRjaCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfa2VybmVsX2NsaWVudF9jdGwpOwotRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfd3JpdGVfcG9sbCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKTsKLSAgLyogc2VxX21lbW9yeS5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfZXhwYW5kX3Zhcl9ldmVudCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfZHVtcF92YXJfZXZlbnQpOwotICAvKiBzZXFfcG9ydHMuYyAqLwotRVhQT1JUX1NZTUJPTChzbmRfc2VxX2V2ZW50X3BvcnRfYXR0YWNoKTsKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9ldmVudF9wb3J0X2RldGFjaCk7Ci0gIC8qIHNlcV9sb2NrLmMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX1NORF9ERUJVRykKLS8qRVhQT1JUX1NZTUJPTChzbmRfc2VxX3NsZWVwX2luX2xvY2spOyovCi0vKkVYUE9SVF9TWU1CT0woc25kX3NlcV9zbGVlcF90aW1lb3V0X2luX2xvY2spOyovCi1FWFBPUlRfU1lNQk9MKHNuZF91c2VfbG9ja19zeW5jX2hlbHBlcik7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCBiYjE1ZDllLi41MzJhNjYwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0xNzE0LDYgKzE3MTQsOCBAQAogCXJldHVybiBzbmRfc2VxX3F1ZXVlX3RpbWVyX3NldF90ZW1wbyh0ZW1wby0+cXVldWUsIGNsaWVudCwgdGVtcG8pOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfc2V0X3F1ZXVlX3RlbXBvKTsKKwogc3RhdGljIGludCBzbmRfc2VxX2lvY3RsX3NldF9xdWV1ZV90ZW1wbyhzdHJ1Y3Qgc25kX3NlcV9jbGllbnQgKmNsaWVudCwKIAkJCQkJIHZvaWQgX191c2VyICphcmcpCiB7CkBAIC0yMjY0LDYgKzIyNjYsOCBAQAogCXJldHVybiBjbGllbnQtPm51bWJlcjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2NyZWF0ZV9rZXJuZWxfY2xpZW50KTsKKwogLyogZXhwb3J0ZWQgdG8ga2VybmVsIG1vZHVsZXMgKi8KIGludCBzbmRfc2VxX2RlbGV0ZV9rZXJuZWxfY2xpZW50KGludCBjbGllbnQpCiB7CkBAIC0yMjgwLDYgKzIyODQsNyBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfZGVsZXRlX2tlcm5lbF9jbGllbnQpOwogCiAvKiBza2VsZXRvbiB0byBlbnF1ZXVlIGV2ZW50LCBjYWxsZWQgZnJvbSBzbmRfc2VxX2tlcm5lbF9jbGllbnRfZW5xdWV1ZQogICogYW5kIHNuZF9zZXFfa2VybmVsX2NsaWVudF9lbnF1ZXVlX2Jsb2NraW5nCkBAIC0yMzI4LDYgKzIzMzMsOCBAQAogCXJldHVybiBrZXJuZWxfY2xpZW50X2VucXVldWUoY2xpZW50LCBldiwgTlVMTCwgMCwgYXRvbWljLCBob3ApOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfa2VybmVsX2NsaWVudF9lbnF1ZXVlKTsKKwogLyoKICAqIGV4cG9ydGVkLCBjYWxsZWQgYnkga2VybmVsIGNsaWVudHMgdG8gZW5xdWV1ZSBldmVudHMgKHdpdGggYmxvY2tpbmcpCiAgKgpAQCAtMjM0MCw2ICsyMzQ3LDcgQEAKIAlyZXR1cm4ga2VybmVsX2NsaWVudF9lbnF1ZXVlKGNsaWVudCwgZXYsIGZpbGUsIDEsIGF0b21pYywgaG9wKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfZW5xdWV1ZV9ibG9ja2luZyk7CiAKIC8qIAogICogZXhwb3J0ZWQsIGNhbGxlZCBieSBrZXJuZWwgY2xpZW50cyB0byBkaXNwYXRjaCBldmVudHMgZGlyZWN0bHkgdG8gb3RoZXIKQEAgLTIzNzYsNiArMjM4NCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfZGlzcGF0Y2gpOwogCiAvKgogICogZXhwb3J0ZWQsIGNhbGxlZCBieSBrZXJuZWwgY2xpZW50cyB0byBwZXJmb3JtIHNhbWUgZnVuY3Rpb25zIGFzIHdpdGgKQEAgLTIzOTYsNiArMjQwNSw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKTsKIAogLyogZXhwb3J0ZWQgKGZvciBPU1MgZW11bGF0b3IpICovCiBpbnQgc25kX3NlcV9rZXJuZWxfY2xpZW50X3dyaXRlX3BvbGwoaW50IGNsaWVudGlkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKQEAgLTI0MTMsNiArMjQyMyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3NlcV9rZXJuZWxfY2xpZW50X3dyaXRlX3BvbGwpOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCmluZGV4IGQ5YTNlNWEuLmQ4MTJkYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKQEAgLTgwLDcgKzgwLDcgQEAKIHN0YXRpYyBpbnQgbnVtX29wczsKIHN0YXRpYyBERUZJTkVfTVVURVgob3BzX211dGV4KTsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwotc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqaW5mb19lbnRyeSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICppbmZvX2VudHJ5OwogI2VuZGlmCiAKIC8qCkBAIC01NTUsNyArNTU1LDYgQEAKIAlpZiAoaW5mb19lbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlpbmZvX2VudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7Ci0JaW5mb19lbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDIwNDg7CiAJaW5mb19lbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfc2VxX2RldmljZV9pbmZvOwogCWlmIChzbmRfaW5mb19yZWdpc3RlcihpbmZvX2VudHJ5KSA8IDApIHsKIAkJc25kX2luZm9fZnJlZV9lbnRyeShpbmZvX2VudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kdW1teS5jIGIvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKaW5kZXggMmEyODNhNS4uZTU1NDg4ZCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMKQEAgLTY2LDcgKzY2LDcgQEAKIE1PRFVMRV9BTElBUygic25kLXNlcS1jbGllbnQtIiBfX3N0cmluZ2lmeShTTkRSVl9TRVFfQ0xJRU5UX0RVTU1ZKSk7CiAKIHN0YXRpYyBpbnQgcG9ydHMgPSAxOwotc3RhdGljIGludCBkdXBsZXggPSAwOworc3RhdGljIGludCBkdXBsZXg7CiAKIG1vZHVsZV9wYXJhbShwb3J0cywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG9ydHMsICJudW1iZXIgb2YgcG9ydHMgdG8gYmUgY3JlYXRlZCIpOwpAQCAtMTcxLDcgKzE3MSw5IEBACiAJcGluZm8uY2FwYWJpbGl0eSB8PSBTTkRSVl9TRVFfUE9SVF9DQVBfV1JJVEUgfCBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19XUklURTsKIAlpZiAoZHVwbGV4KQogCQlwaW5mby5jYXBhYmlsaXR5IHw9IFNORFJWX1NFUV9QT1JUX0NBUF9EVVBMRVg7Ci0JcGluZm8udHlwZSA9IFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDOworCXBpbmZvLnR5cGUgPSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQworCQl8IFNORFJWX1NFUV9QT1JUX1RZUEVfU09GVFdBUkUKKwkJfCBTTkRSVl9TRVFfUE9SVF9UWVBFX1BPUlQ7CiAJbWVtc2V0KCZwY2IsIDAsIHNpemVvZihwY2IpKTsKIAlwY2Iub3duZXIgPSBUSElTX01PRFVMRTsKIAlwY2IudW51c2UgPSBkdW1teV91bnVzZTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9pbmZvLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfaW5mby5jCmluZGV4IGFjY2UyMWEuLjE0MmU5ZTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9pbmZvLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2luZm8uYwpAQCAtMzQsOCArMzQsOCBAQAogCiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKiBfX2luaXQKLWNyZWF0ZV9pbmZvX2VudHJ5KGNoYXIgKm5hbWUsIGludCBzaXplLCB2b2lkICgqcmVhZCkoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICosCi0JCQkJCQkgICAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKikpCitjcmVhdGVfaW5mb19lbnRyeShjaGFyICpuYW1lLCB2b2lkICgqcmVhZCkoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICosCisJCQkJCSAgIHN0cnVjdCBzbmRfaW5mb19idWZmZXIgKikpCiB7CiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIApAQCAtNDMsNyArNDMsNiBAQAogCWlmIChlbnRyeSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwotCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gc2l6ZTsKIAllbnRyeS0+Yy50ZXh0LnJlYWQgPSByZWFkOwogCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpAQCAtNTUsMTEgKzU0LDExIEBACiAvKiBjcmVhdGUgYWxsIG91ciAvcHJvYyBlbnRyaWVzICovCiBpbnQgX19pbml0IHNuZF9zZXFfaW5mb19pbml0KHZvaWQpCiB7Ci0JcXVldWVzX2VudHJ5ID0gY3JlYXRlX2luZm9fZW50cnkoInF1ZXVlcyIsIDUxMiArICgyNTYgKiBTTkRSVl9TRVFfTUFYX1FVRVVFUyksCisJcXVldWVzX2VudHJ5ID0gY3JlYXRlX2luZm9fZW50cnkoInF1ZXVlcyIsCiAJCQkJCSBzbmRfc2VxX2luZm9fcXVldWVzX3JlYWQpOwotCWNsaWVudHNfZW50cnkgPSBjcmVhdGVfaW5mb19lbnRyeSgiY2xpZW50cyIsIDUxMiArICgyNTYgKiBTTkRSVl9TRVFfTUFYX0NMSUVOVFMpLAorCWNsaWVudHNfZW50cnkgPSBjcmVhdGVfaW5mb19lbnRyeSgiY2xpZW50cyIsCiAJCQkJCSAgc25kX3NlcV9pbmZvX2NsaWVudHNfcmVhZCk7Ci0JdGltZXJfZW50cnkgPSBjcmVhdGVfaW5mb19lbnRyeSgidGltZXIiLCAxMDI0LCBzbmRfc2VxX2luZm9fdGltZXJfcmVhZCk7CisJdGltZXJfZW50cnkgPSBjcmVhdGVfaW5mb19lbnRyeSgidGltZXIiLCBzbmRfc2VxX2luZm9fdGltZXJfcmVhZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbG9jay5jCmluZGV4IGE4MzdhOTQuLjFhMzQ5NDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9sb2NrLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2xvY2suYwpAQCAtNDQsNCArNDQsNiBAQAogCX0KIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdXNlX2xvY2tfc3luY19oZWxwZXIpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwppbmRleCA0MGI0ZjY3Li40YmZmZTUwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCkBAIC0xMTgsNiArMTE4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2R1bXBfdmFyX2V2ZW50KTsKKwogCiAvKgogICogZXhwb3J0ZWQ6CkBAIC0xNjcsNiArMTY5LDcgQEAKIAlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IG5ld2xlbjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2V4cGFuZF92YXJfZXZlbnQpOwogCiAvKgogICogcmVsZWFzZSB0aGlzIGNlbGwsIGZyZWUgZXh0ZW5kZWQgZGF0YSBpZiBhdmFpbGFibGUKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCmluZGV4IDljYWExMzcuLjFkYWE1YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYwpAQCAtMjc4LDYgKzI3OCw3IEBACiAJc3RydWN0IHNlcV9taWRpc3ludGggKm1zeW50aCwgKm1zOwogCXN0cnVjdCBzbmRfc2VxX3BvcnRfaW5mbyAqcG9ydDsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpID0gZGV2LT5wcml2YXRlX2RhdGE7CiAJaW50IG5ld2NsaWVudCA9IDA7CiAJdW5zaWduZWQgaW50IHAsIHBvcnRzOwogCXN0cnVjdCBzbmRfc2VxX3BvcnRfY2FsbGJhY2sgcGNhbGxiYWNrczsKQEAgLTMyMCw4ICszMjEsOCBAQAogCQl9CiAJCWNsaWVudC0+c2VxX2NsaWVudCA9CiAJCQlzbmRfc2VxX2NyZWF0ZV9rZXJuZWxfY2xpZW50KAotCQkJCWNhcmQsIDAsICIlcyIsIGluZm8tPm5hbWVbMF0gPwotCQkJCShjb25zdCBjaGFyICopaW5mby0+bmFtZSA6ICJFeHRlcm5hbCBNSURJIik7CisJCQkJY2FyZCwgMCwgIiVzIiwgY2FyZC0+c2hvcnRuYW1lWzBdID8KKwkJCQkoY29uc3QgY2hhciAqKWNhcmQtPnNob3J0bmFtZSA6ICJFeHRlcm5hbCBNSURJIik7CiAJCWlmIChjbGllbnQtPnNlcV9jbGllbnQgPCAwKSB7CiAJCQlrZnJlZShjbGllbnQpOwogCQkJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CkBAIC0zNzYsNyArMzc3LDkgQEAKIAkJaWYgKChwb3J0LT5jYXBhYmlsaXR5ICYgKFNORFJWX1NFUV9QT1JUX0NBUF9XUklURXxTTkRSVl9TRVFfUE9SVF9DQVBfUkVBRCkpID09IChTTkRSVl9TRVFfUE9SVF9DQVBfV1JJVEV8U05EUlZfU0VRX1BPUlRfQ0FQX1JFQUQpICYmCiAJCSAgICBpbmZvLT5mbGFncyAmIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVgpCiAJCQlwb3J0LT5jYXBhYmlsaXR5IHw9IFNORFJWX1NFUV9QT1JUX0NBUF9EVVBMRVg7Ci0JCXBvcnQtPnR5cGUgPSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQzsKKwkJcG9ydC0+dHlwZSA9IFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDCisJCQl8IFNORFJWX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUKKwkJCXwgU05EUlZfU0VRX1BPUlRfVFlQRV9QT1JUOwogCQlwb3J0LT5taWRpX2NoYW5uZWxzID0gMTY7CiAJCW1lbXNldCgmcGNhbGxiYWNrcywgMCwgc2l6ZW9mKHBjYWxsYmFja3MpKTsKIAkJcGNhbGxiYWNrcy5vd25lciA9IFRISVNfTU9EVUxFOwpAQCAtMzg3LDYgKzM5MCw4IEBACiAJCXBjYWxsYmFja3MudW51c2UgPSBtaWRpc3ludGhfdW51c2U7CiAJCXBjYWxsYmFja3MuZXZlbnRfaW5wdXQgPSBldmVudF9wcm9jZXNzX21pZGk7CiAJCXBvcnQtPmtlcm5lbCA9ICZwY2FsbGJhY2tzOworCQlpZiAocm1pZGktPm9wcyAmJiBybWlkaS0+b3BzLT5nZXRfcG9ydF9pbmZvKQorCQkJcm1pZGktPm9wcy0+Z2V0X3BvcnRfaW5mbyhybWlkaSwgcCwgcG9ydCk7CiAJCWlmIChzbmRfc2VxX2tlcm5lbF9jbGllbnRfY3RsKGNsaWVudC0+c2VxX2NsaWVudCwgU05EUlZfU0VRX0lPQ1RMX0NSRUFURV9QT1JULCBwb3J0KTwwKQogCQkJZ290byBfX25vbWVtOwogCQltcy0+c2VxX2NsaWVudCA9IGNsaWVudC0+c2VxX2NsaWVudDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jIGIvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKaW5kZXggNDFlMDc4Yy4uMzM0NTc5YTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jCkBAIC0yMjEsNyArMjIxLDYgQEAKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbjsKIAotCWRvd25fd3JpdGUoJmdycC0+bGlzdF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZncnAtPmxpc3RfaGVhZCkgewogCQlzdHJ1Y3Qgc25kX3NlcV9zdWJzY3JpYmVycyAqc3ViczsKIAkJc3RydWN0IHNuZF9zZXFfY2xpZW50ICpjOwpAQCAtMjU5LDcgKzI1OCw2IEBACiAJCQlzbmRfc2VxX2NsaWVudF91bmxvY2soYyk7CiAJCX0KIAl9Ci0JdXBfd3JpdGUoJmdycC0+bGlzdF9tdXRleCk7CiB9CiAKIC8qIGRlbGV0ZSBwb3J0IGRhdGEgKi8KQEAgLTY3Nyw2ICs2NzUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3NlcV9ldmVudF9wb3J0X2F0dGFjaCk7CiAKIC8qCiAgKiBEZXRhY2ggdGhlIGRyaXZlciBmcm9tIGEgcG9ydC4KQEAgLTY5NiwzICs2OTUsNSBAQAogCiAJcmV0dXJuIGVycjsKIH0KKworRVhQT1JUX1NZTUJPTChzbmRfc2VxX2V2ZW50X3BvcnRfZGV0YWNoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfdmlybWlkaS5jCmluZGV4IGY0ZWRlYzYuLjBjZmEwNmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV92aXJtaWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3Zpcm1pZGkuYwpAQCAtMzkwLDcgKzM5MCw5IEBACiAJcGluZm8tPmNhcGFiaWxpdHkgfD0gU05EUlZfU0VRX1BPUlRfQ0FQX1dSSVRFIHwgU05EUlZfU0VRX1BPUlRfQ0FQX1NZTkNfV1JJVEUgfCBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19XUklURTsKIAlwaW5mby0+Y2FwYWJpbGl0eSB8PSBTTkRSVl9TRVFfUE9SVF9DQVBfUkVBRCB8IFNORFJWX1NFUV9QT1JUX0NBUF9TWU5DX1JFQUQgfCBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19SRUFEOwogCXBpbmZvLT5jYXBhYmlsaXR5IHw9IFNORFJWX1NFUV9QT1JUX0NBUF9EVVBMRVg7Ci0JcGluZm8tPnR5cGUgPSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQzsKKwlwaW5mby0+dHlwZSA9IFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDCisJCXwgU05EUlZfU0VRX1BPUlRfVFlQRV9TT0ZUV0FSRQorCQl8IFNORFJWX1NFUV9QT1JUX1RZUEVfUE9SVDsKIAlwaW5mby0+bWlkaV9jaGFubmVscyA9IDE2OwogCW1lbXNldCgmcGNhbGxiYWNrcywgMCwgc2l6ZW9mKHBjYWxsYmFja3MpKTsKIAlwY2FsbGJhY2tzLm93bmVyID0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NvdW5kLmMgYi9zb3VuZC9jb3JlL3NvdW5kLmMKaW5kZXggMTA4ZTQzMC4uY2Q4NjI3MiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZC5jCisrKyBiL3NvdW5kL2NvcmUvc291bmQuYwpAQCAtMzksNiArMzksOCBAQAogCiBzdGF0aWMgaW50IG1ham9yID0gQ09ORklHX1NORF9NQUpPUjsKIGludCBzbmRfbWFqb3I7CitFWFBPUlRfU1lNQk9MKHNuZF9tYWpvcik7CisKIHN0YXRpYyBpbnQgY2FyZHNfbGltaXQgPSAxOwogc3RhdGljIGludCBkZXZpY2VfbW9kZSA9IFNfSUZDSFIgfCBTX0lSVUdPIHwgU19JV1VHTzsKIApAQCAtNjAsNiArNjIsNyBAQAogICogbW9kdWxlcyBhcmUgbG9hZGVkIG1hbnVhbGx5LCB0aGlzIGxpbWl0IG51bWJlciBpbmNyZWFzZXMsIHRvby4KICAqLwogaW50IHNuZF9lY2FyZHNfbGltaXQ7CitFWFBPUlRfU1lNQk9MKHNuZF9lY2FyZHNfbGltaXQpOwogCiBzdGF0aWMgc3RydWN0IHNuZF9taW5vciAqc25kX21pbm9yc1tTTkRSVl9PU19NSU5PUlNdOwogc3RhdGljIERFRklORV9NVVRFWChzb3VuZF9tdXRleCk7CkBAIC03OCwyMCArODEsMTcgQEAKICAqLwogdm9pZCBzbmRfcmVxdWVzdF9jYXJkKGludCBjYXJkKQogewotCWludCBsb2NrZWQ7Ci0KIAlpZiAoISBjdXJyZW50LT5mcy0+cm9vdCkKIAkJcmV0dXJuOwotCXJlYWRfbG9jaygmc25kX2NhcmRfcndsb2NrKTsKLQlsb2NrZWQgPSBzbmRfY2FyZHNfbG9jayAmICgxIDw8IGNhcmQpOwotCXJlYWRfdW5sb2NrKCZzbmRfY2FyZF9yd2xvY2spOwotCWlmIChsb2NrZWQpCisJaWYgKHNuZF9jYXJkX2xvY2tlZChjYXJkKSkKIAkJcmV0dXJuOwogCWlmIChjYXJkIDwgMCB8fCBjYXJkID49IGNhcmRzX2xpbWl0KQogCQlyZXR1cm47CiAJcmVxdWVzdF9tb2R1bGUoInNuZC1jYXJkLSVpIiwgY2FyZCk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3JlcXVlc3RfY2FyZCk7CisKIHN0YXRpYyB2b2lkIHNuZF9yZXF1ZXN0X290aGVyKGludCBtaW5vcikKIHsKIAljaGFyICpzdHI7CkBAIC0xMzMsNiArMTMzLDggQEAKIAlyZXR1cm4gcHJpdmF0ZV9kYXRhOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9sb29rdXBfbWlub3JfZGF0YSk7CisKIHN0YXRpYyBpbnQgc25kX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKQEAgLTI4MSw2ICsyODMsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9yZWdpc3Rlcl9kZXZpY2UpOworCiAvKioKICAqIHNuZF91bnJlZ2lzdGVyX2RldmljZSAtIHVucmVnaXN0ZXIgdGhlIGRldmljZSBvbiB0aGUgZ2l2ZW4gY2FyZAogICogQHR5cGU6IHRoZSBkZXZpY2UgdHlwZSwgU05EUlZfREVWSUNFX1RZUEVfWFhYCkBAIC0zMjEsMTIgKzMyNSwxNCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF91bnJlZ2lzdGVyX2RldmljZSk7CisKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogLyoKICAqICBJTkZPIFBBUlQKICAqLwogCi1zdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfbWlub3JfaW5mb19lbnRyeSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfbWlub3JfaW5mb19lbnRyeTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKnNuZF9kZXZpY2VfdHlwZV9uYW1lKGludCB0eXBlKQogewpAQCAtMzgxLDcgKzM4Nyw2IEBACiAKIAllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9tb2R1bGVfZW50cnkoVEhJU19NT0RVTEUsICJkZXZpY2VzIiwgTlVMTCk7CiAJaWYgKGVudHJ5KSB7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gUEFHRV9TSVpFOwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfbWlub3JfaW5mb19yZWFkOwogCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewogCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CkBAIC00NDYsOTEgKzQ1MSwzIEBACiAKIG1vZHVsZV9pbml0KGFsc2Ffc291bmRfaW5pdCkKIG1vZHVsZV9leGl0KGFsc2Ffc291bmRfZXhpdCkKLQotICAvKiBzb3VuZC5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9tYWpvcik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9lY2FyZHNfbGltaXQpOwotI2lmIGRlZmluZWQoQ09ORklHX0tNT0QpCi1FWFBPUlRfU1lNQk9MKHNuZF9yZXF1ZXN0X2NhcmQpOwotI2VuZGlmCi1FWFBPUlRfU1lNQk9MKHNuZF9yZWdpc3Rlcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzbmRfdW5yZWdpc3Rlcl9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzbmRfbG9va3VwX21pbm9yX2RhdGEpOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9PU1NFTVVMKQotRVhQT1JUX1NZTUJPTChzbmRfcmVnaXN0ZXJfb3NzX2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChzbmRfbG9va3VwX29zc19taW5vcl9kYXRhKTsKLSNlbmRpZgotICAvKiBtZW1vcnkuYyAqLwotRVhQT1JUX1NZTUJPTChjb3B5X3RvX3VzZXJfZnJvbWlvKTsKLUVYUE9SVF9TWU1CT0woY29weV9mcm9tX3VzZXJfdG9pbyk7Ci0gIC8qIGluaXQuYyAqLwotRVhQT1JUX1NZTUJPTChzbmRfY2FyZHMpOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1MpIHx8IGRlZmluZWQoQ09ORklHX1NORF9NSVhFUl9PU1NfTU9EVUxFKQotRVhQT1JUX1NZTUJPTChzbmRfbWl4ZXJfb3NzX25vdGlmeV9jYWxsYmFjayk7Ci0jZW5kaWYKLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfZGlzY29ubmVjdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX2ZyZWUpOwotRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9mcmVlX2luX3RocmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX3JlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woc25kX2NvbXBvbmVudF9hZGQpOwotRVhQT1JUX1NZTUJPTChzbmRfY2FyZF9maWxlX2FkZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jYXJkX2ZpbGVfcmVtb3ZlKTsKLSNpZmRlZiBDT05GSUdfUE0KLUVYUE9SVF9TWU1CT0woc25kX3Bvd2VyX3dhaXQpOwotI2VuZGlmCi0gIC8qIGRldmljZS5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9kZXZpY2VfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX2RldmljZV9yZWdpc3Rlcik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9kZXZpY2VfZnJlZSk7Ci0gIC8qIGlzYWRtYS5jICovCi0jaWZkZWYgQ09ORklHX0lTQV9ETUFfQVBJCi1FWFBPUlRfU1lNQk9MKHNuZF9kbWFfcHJvZ3JhbSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9kbWFfZGlzYWJsZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9kbWFfcG9pbnRlcik7Ci0jZW5kaWYKLSAgLyogaW5mby5jICovCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9yb290KTsKLUVYUE9SVF9TWU1CT0woc25kX2lwcmludGYpOwotRVhQT1JUX1NZTUJPTChzbmRfaW5mb19nZXRfbGluZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9pbmZvX2dldF9zdHIpOwotRVhQT1JUX1NZTUJPTChzbmRfaW5mb19jcmVhdGVfbW9kdWxlX2VudHJ5KTsKLUVYUE9SVF9TWU1CT0woc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkpOwotRVhQT1JUX1NZTUJPTChzbmRfaW5mb19mcmVlX2VudHJ5KTsKLUVYUE9SVF9TWU1CT0woc25kX2luZm9fcmVnaXN0ZXIpOwotRVhQT1JUX1NZTUJPTChzbmRfaW5mb191bnJlZ2lzdGVyKTsKLUVYUE9SVF9TWU1CT0woc25kX2NhcmRfcHJvY19uZXcpOwotI2VuZGlmCi0gIC8qIGluZm9fb3NzLmMgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfT1NTRU1VTCkgJiYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKLUVYUE9SVF9TWU1CT0woc25kX29zc19pbmZvX3JlZ2lzdGVyKTsKLSNlbmRpZgotICAvKiBjb250cm9sLmMgKi8KLUVYUE9SVF9TWU1CT0woc25kX2N0bF9uZXcpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX25ldzEpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX2ZyZWVfb25lKTsKLUVYUE9SVF9TWU1CT0woc25kX2N0bF9hZGQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX3JlbW92ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jdGxfcmVtb3ZlX2lkKTsKLUVYUE9SVF9TWU1CT0woc25kX2N0bF9yZW5hbWVfaWQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX2ZpbmRfbnVtaWQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX2ZpbmRfaWQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX25vdGlmeSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jdGxfcmVnaXN0ZXJfaW9jdGwpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX3VucmVnaXN0ZXJfaW9jdGwpOwotI2lmZGVmIENPTkZJR19DT01QQVQKLUVYUE9SVF9TWU1CT0woc25kX2N0bF9yZWdpc3Rlcl9pb2N0bF9jb21wYXQpOwotRVhQT1JUX1NZTUJPTChzbmRfY3RsX3VucmVnaXN0ZXJfaW9jdGxfY29tcGF0KTsKLSNlbmRpZgotRVhQT1JUX1NZTUJPTChzbmRfY3RsX2VsZW1fcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9jdGxfZWxlbV93cml0ZSk7Ci0gIC8qIG1pc2MuYyAqLwotRVhQT1JUX1NZTUJPTChyZWxlYXNlX2FuZF9mcmVlX3Jlc291cmNlKTsKLSNpZmRlZiBDT05GSUdfU05EX1ZFUkJPU0VfUFJJTlRLCi1FWFBPUlRfU1lNQk9MKHNuZF92ZXJib3NlX3ByaW50ayk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19TTkRfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1NORF9WRVJCT1NFX1BSSU5USykKLUVYUE9SVF9TWU1CT0woc25kX3ZlcmJvc2VfcHJpbnRkKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zb3VuZF9vc3MuYyBiL3NvdW5kL2NvcmUvc291bmRfb3NzLmMKaW5kZXggOTA1NWM2ZC4uNzRmMGZlNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zb3VuZF9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NvdW5kX29zcy5jCkBAIC01OCw2ICs1OCw4IEBACiAJcmV0dXJuIHByaXZhdGVfZGF0YTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfbG9va3VwX29zc19taW5vcl9kYXRhKTsKKwogc3RhdGljIGludCBzbmRfb3NzX2tlcm5lbF9taW5vcihpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KQogewogCWludCBtaW5vcjsKQEAgLTE1OCw2ICsxNjAsOCBAQAogICAgICAgCXJldHVybiAtRUJVU1k7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3JlZ2lzdGVyX29zc19kZXZpY2UpOworCiBpbnQgc25kX3VucmVnaXN0ZXJfb3NzX2RldmljZShpbnQgdHlwZSwgc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2KQogewogCWludCBtaW5vciA9IHNuZF9vc3Nfa2VybmVsX21pbm9yKHR5cGUsIGNhcmQsIGRldik7CkBAIC0xOTcsMTMgKzIwMSwxNSBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF91bnJlZ2lzdGVyX29zc19kZXZpY2UpOworCiAvKgogICogIElORk8gUEFSVAogICovCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogCi1zdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpzbmRfbWlub3JfaW5mb19vc3NfZW50cnkgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzbmRfaW5mb19lbnRyeSAqc25kX21pbm9yX2luZm9fb3NzX2VudHJ5OwogCiBzdGF0aWMgY29uc3QgY2hhciAqc25kX29zc19kZXZpY2VfdHlwZV9uYW1lKGludCB0eXBlKQogewpAQCAtMjUyLDcgKzI1OCw2IEBACiAKIAllbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9tb2R1bGVfZW50cnkoVEhJU19NT0RVTEUsICJkZXZpY2VzIiwgc25kX29zc19yb290KTsKIAlpZiAoZW50cnkpIHsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSBQQUdFX1NJWkU7CiAJCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9taW5vcl9pbmZvX29zc19yZWFkOwogCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewogCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3RpbWVyLmMgYi9zb3VuZC9jb3JlL3RpbWVyLmMKaW5kZXggY2RlZWI2My4uNzgxOTlmNSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvdGltZXIuYwpAQCAtMTA2MSw3ICsxMDYxLDYgQEAKIHN0YXRpYyB2b2lkIHNuZF90aW1lcl9wcm9jX3JlYWQoc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKIAkJCQlzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc25kX3RpbWVyICp0aW1lcjsKIAlzdHJ1Y3Qgc25kX3RpbWVyX2luc3RhbmNlICp0aTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcTsKQEAgLTEwOTUsNyArMTA5NCw2IEBACiAJCWlmICh0aW1lci0+aHcuZmxhZ3MgJiBTTkRSVl9USU1FUl9IV19TTEFWRSkKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBTTEFWRSIpOwogCQlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmdGltZXItPmxvY2ssIGZsYWdzKTsKIAkJbGlzdF9mb3JfZWFjaChxLCAmdGltZXItPm9wZW5fbGlzdF9oZWFkKSB7CiAJCQl0aSA9IGxpc3RfZW50cnkocSwgc3RydWN0IHNuZF90aW1lcl9pbnN0YW5jZSwgb3Blbl9saXN0KTsKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgQ2xpZW50ICVzIDogJXNcbiIsCkBAIC0xMTA0LDEyICsxMTAyLDExIEBACiAJCQkJCQkgU05EUlZfVElNRVJfSUZMR19SVU5OSU5HKQogCQkJCSAgICA/ICJydW5uaW5nIiA6ICJzdG9wcGVkIik7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZXItPmxvY2ssIGZsYWdzKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF90aW1lcl9wcm9jX2VudHJ5ID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKnNuZF90aW1lcl9wcm9jX2VudHJ5OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc25kX3RpbWVyX3Byb2NfaW5pdCh2b2lkKQogewpAQCAtMTExNyw3ICsxMTE0LDYgQEAKIAogCWVudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgInRpbWVycyIsIE5VTEwpOwogCWlmIChlbnRyeSAhPSBOVUxMKSB7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gU05EUlZfVElNRVJfREVWSUNFUyAqIDEyODsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gc25kX3RpbWVyX3Byb2NfcmVhZDsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9kdW1teS5jIGIvc291bmQvZHJpdmVycy9kdW1teS5jCmluZGV4IGFlMGRmNTQuLmZmZWFmYWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvZHVtbXkuYworKysgYi9zb3VuZC9kcml2ZXJzL2R1bW15LmMKQEAgLTY3Nyw2ICs2NzcsMTAgQEAKIAkJCQkJCQkgaSwgTlVMTCwgMCk7CiAJCWlmIChJU19FUlIoZGV2aWNlKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQogCQlkZXZpY2VzW2ldID0gZGV2aWNlOwogCQljYXJkcysrOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMS5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKaW5kZXggNzdiMDYwMC4uZDNjYmJiMCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKKysrIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxLmMKQEAgLTI1Myw2ICsyNTMsMTAgQEAKIAkJCQkJCQkgaSwgTlVMTCwgMCk7CiAJCWlmIChJU19FUlIoZGV2aWNlKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQogCQlwbGF0Zm9ybV9kZXZpY2VzW2ldID0gZGV2aWNlOwogCQlzbmRfbXB1NDAxX2RldmljZXMrKzsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jIGIvc291bmQvZHJpdmVycy9tcHU0MDEvbXB1NDAxX3VhcnQuYwppbmRleCBiNDlhNDVjLi40YmYwN2NhIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL21wdTQwMS9tcHU0MDFfdWFydC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXB1NDAxL21wdTQwMV91YXJ0LmMKQEAgLTU4LDIyICs1OCwyNiBAQAogI2RlZmluZSBNUFU0MDFfQUNLCQkweGZlCiAKIC8qIEJ1aWxkIGluIGxvd2xldmVsIGlvICovCi1zdGF0aWMgdm9pZCBtcHU0MDFfd3JpdGVfcG9ydChzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1LCB1bnNpZ25lZCBjaGFyIGRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyB2b2lkIG1wdTQwMV93cml0ZV9wb3J0KHN0cnVjdCBzbmRfbXB1NDAxICptcHUsIHVuc2lnbmVkIGNoYXIgZGF0YSwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlvdXRiKGRhdGEsIGFkZHIpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBtcHU0MDFfcmVhZF9wb3J0KHN0cnVjdCBzbmRfbXB1NDAxICptcHUsIHVuc2lnbmVkIGxvbmcgYWRkcikKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG1wdTQwMV9yZWFkX3BvcnQoc3RydWN0IHNuZF9tcHU0MDEgKm1wdSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJcmV0dXJuIGluYihhZGRyKTsKIH0KIAotc3RhdGljIHZvaWQgbXB1NDAxX3dyaXRlX21taW8oc3RydWN0IHNuZF9tcHU0MDEgKm1wdSwgdW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgdm9pZCBtcHU0MDFfd3JpdGVfbW1pbyhzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1LCB1bnNpZ25lZCBjaGFyIGRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJd3JpdGViKGRhdGEsICh2b2lkIF9faW9tZW0gKilhZGRyKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgbXB1NDAxX3JlYWRfbW1pbyhzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1LCB1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgdW5zaWduZWQgY2hhciBtcHU0MDFfcmVhZF9tbWlvKHN0cnVjdCBzbmRfbXB1NDAxICptcHUsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBhZGRyKQogewogCXJldHVybiByZWFkYigodm9pZCBfX2lvbWVtICopYWRkcik7CiB9CkBAIC04NiwyMCArOTAsMTMgQEAKIAkJbXB1LT5yZWFkKG1wdSwgTVBVNDAxRChtcHUpKTsKICNpZmRlZiBDT05GSUdfU05EX0RFQlVHCiAJaWYgKHRpbWVvdXQgPD0gMCkKLQkJc25kX3ByaW50aygiY21kOiBjbGVhciByeCB0aW1lb3V0IChzdGF0dXMgPSAweCV4KVxuIiwgbXB1LT5yZWFkKG1wdSwgTVBVNDAxQyhtcHUpKSk7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgImNtZDogY2xlYXIgcnggdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCisJCQkgICBtcHUtPnJlYWQobXB1LCBNUFU0MDFDKG1wdSkpKTsKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBfc25kX21wdTQwMV91YXJ0X2ludGVycnVwdChzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1KQorc3RhdGljIHZvaWQgdWFydF9pbnRlcnJ1cHRfdHgoc3RydWN0IHNuZF9tcHU0MDEgKm1wdSkKIHsKLQlzcGluX2xvY2soJm1wdS0+aW5wdXRfbG9jayk7Ci0JaWYgKHRlc3RfYml0KE1QVTQwMV9NT0RFX0JJVF9JTlBVVCwgJm1wdS0+bW9kZSkpIHsKLQkJc25kX21wdTQwMV91YXJ0X2lucHV0X3JlYWQobXB1KTsKLQl9IGVsc2UgewotCQlzbmRfbXB1NDAxX3VhcnRfY2xlYXJfcngobXB1KTsKLQl9Ci0Jc3Bpbl91bmxvY2soJm1wdS0+aW5wdXRfbG9jayk7Ci0gCS8qIG9rLiBmb3IgYmV0dGVyIFR4IHBlcmZvcm1hbmNlIHRyeSBkbyBzb21lIG91dHB1dCB3aGVuIGlucHV0IGlzIGRvbmUgKi8KIAlpZiAodGVzdF9iaXQoTVBVNDAxX01PREVfQklUX09VVFBVVCwgJm1wdS0+bW9kZSkgJiYKIAkgICAgdGVzdF9iaXQoTVBVNDAxX01PREVfQklUX09VVFBVVF9UUklHR0VSLCAmbXB1LT5tb2RlKSkgewogCQlzcGluX2xvY2soJm1wdS0+b3V0cHV0X2xvY2spOwpAQCAtMTA4LDYgKzEwNSwyMiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgX3NuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoc3RydWN0IHNuZF9tcHU0MDEgKm1wdSkKK3sKKwlpZiAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fSU5QVVQpIHsKKwkJc3Bpbl9sb2NrKCZtcHUtPmlucHV0X2xvY2spOworCQlpZiAodGVzdF9iaXQoTVBVNDAxX01PREVfQklUX0lOUFVULCAmbXB1LT5tb2RlKSkKKwkJCXNuZF9tcHU0MDFfdWFydF9pbnB1dF9yZWFkKG1wdSk7CisJCWVsc2UKKwkJCXNuZF9tcHU0MDFfdWFydF9jbGVhcl9yeChtcHUpOworCQlzcGluX3VubG9jaygmbXB1LT5pbnB1dF9sb2NrKTsKKwl9CisJaWYgKCEgKG1wdS0+aW5mb19mbGFncyAmIE1QVTQwMV9JTkZPX1RYX0lSUSkpCisJCS8qIG9rLiBmb3IgYmV0dGVyIFR4IHBlcmZvcm1hbmNlIHRyeSBkbyBzb21lIG91dHB1dAorCQkgICB3aGVuIGlucHV0IGlzIGRvbmUgKi8KKwkJdWFydF9pbnRlcnJ1cHRfdHgobXB1KTsKK30KKwogLyoqCiAgKiBzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0IC0gZ2VuZXJpYyBNUFU0MDEtVUFSVCBpbnRlcnJ1cHQgaGFuZGxlcgogICogQGlycTogdGhlIGlycSBudW1iZXIKQEAgLTExNiw3ICsxMjksOCBAQAogICoKICAqIFByb2Nlc3NlcyB0aGUgaW50ZXJydXB0IGZvciBNUFU0MDEtVUFSVCBpL28uCiAgKi8KLWlycXJldHVybl90IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK2lycXJldHVybl90IHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLAorCQkJCSAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBzbmRfbXB1NDAxICptcHUgPSBkZXZfaWQ7CiAJCkBAIC0xMjYsNiArMTQwLDI5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHQpOworCisvKioKKyAqIHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHRfdHggLSBnZW5lcmljIE1QVTQwMS1VQVJUIHRyYW5zbWl0IGlycSBoYW5kbGVyCisgKiBAaXJxOiB0aGUgaXJxIG51bWJlcgorICogQGRldl9pZDogbXB1NDAxIGluc3RhbmNlCisgKiBAcmVnczogdGhlIHJlaWdzdGVyCisgKgorICogUHJvY2Vzc2VzIHRoZSBpbnRlcnJ1cHQgZm9yIE1QVTQwMS1VQVJUIG91dHB1dC4KKyAqLworaXJxcmV0dXJuX3Qgc25kX21wdTQwMV91YXJ0X2ludGVycnVwdF90eChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCisJCQkJCSBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1ID0gZGV2X2lkOworCQorCWlmIChtcHUgPT0gTlVMTCkKKwkJcmV0dXJuIElSUV9OT05FOworCXVhcnRfaW50ZXJydXB0X3R4KG1wdSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitFWFBPUlRfU1lNQk9MKHNuZF9tcHU0MDFfdWFydF9pbnRlcnJ1cHRfdHgpOworCiAvKgogICogdGltZXIgY2FsbGJhY2sKICAqIHJlcHJvZ3JhbSB0aGUgdGltZXIgYW5kIGNhbGwgdGhlIGludGVycnVwdCBqb2IKQEAgLTE1OSw3ICsxOTYsOCBAQAogCQltcHUtPnRpbWVyLmV4cGlyZXMgPSAxICsgamlmZmllczsKIAkJYWRkX3RpbWVyKCZtcHUtPnRpbWVyKTsKIAl9IAotCW1wdS0+dGltZXJfaW52b2tlZCB8PSBpbnB1dCA/IE1QVTQwMV9NT0RFX0lOUFVUX1RJTUVSIDogTVBVNDAxX01PREVfT1VUUFVUX1RJTUVSOworCW1wdS0+dGltZXJfaW52b2tlZCB8PSBpbnB1dCA/IE1QVTQwMV9NT0RFX0lOUFVUX1RJTUVSIDoKKwkJTVBVNDAxX01PREVfT1VUUFVUX1RJTUVSOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZtcHUtPnRpbWVyX2xvY2ssIGZsYWdzKTsKIH0KIApAQCAtMTcyLDcgKzIxMCw4IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSAoJm1wdS0+dGltZXJfbG9jaywgZmxhZ3MpOwogCWlmIChtcHUtPnRpbWVyX2ludm9rZWQpIHsKLQkJbXB1LT50aW1lcl9pbnZva2VkICY9IGlucHV0ID8gfk1QVTQwMV9NT0RFX0lOUFVUX1RJTUVSIDogfk1QVTQwMV9NT0RFX09VVFBVVF9USU1FUjsKKwkJbXB1LT50aW1lcl9pbnZva2VkICY9IGlucHV0ID8gfk1QVTQwMV9NT0RFX0lOUFVUX1RJTUVSIDoKKwkJCX5NUFU0MDFfTU9ERV9PVVRQVVRfVElNRVI7CiAJCWlmICghIG1wdS0+dGltZXJfaW52b2tlZCkKIAkJCWRlbF90aW1lcigmbXB1LT50aW1lcik7CiAJfQpAQCAtMTgwLDExICsyMTksMTIgQEAKIH0KIAogLyoKLQorICogc2VuZCBhIFVBUlQgY29tbWFuZAorICogcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bCwgbm9uLXplcm8gZm9yIHNvbWUgZXJyb3JzCiAgKi8KIAogc3RhdGljIGludCBzbmRfbXB1NDAxX3VhcnRfY21kKHN0cnVjdCBzbmRfbXB1NDAxICogbXB1LCB1bnNpZ25lZCBjaGFyIGNtZCwKLQkJaW50IGFjaykKKwkJCSAgICAgICBpbnQgYWNrKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHRpbWVvdXQsIG9rOwpAQCAtMTk2LDExICsyMzYsMTMgQEAKIAl9CiAJLyogb2suIHN0YW5kYXJkIE1QVS00MDEgaW5pdGlhbGl6YXRpb24gKi8KIAlpZiAobXB1LT5oYXJkd2FyZSAhPSBNUFU0MDFfSFdfU0IpIHsKLQkJZm9yICh0aW1lb3V0ID0gMTAwMDsgdGltZW91dCA+IDAgJiYgIXNuZF9tcHU0MDFfb3V0cHV0X3JlYWR5KG1wdSk7IHRpbWVvdXQtLSkKKwkJZm9yICh0aW1lb3V0ID0gMTAwMDsgdGltZW91dCA+IDAgJiYKKwkJCSAgICAgIXNuZF9tcHU0MDFfb3V0cHV0X3JlYWR5KG1wdSk7IHRpbWVvdXQtLSkKIAkJCXVkZWxheSgxMCk7CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwogCQlpZiAoIXRpbWVvdXQpCi0JCQlzbmRfcHJpbnRrKCJjbWQ6IHR4IHRpbWVvdXQgKHN0YXR1cyA9IDB4JXgpXG4iLCBtcHUtPnJlYWQobXB1LCBNUFU0MDFDKG1wdSkpKTsKKwkJCXNuZF9wcmludGsoS0VSTl9FUlIgImNtZDogdHggdGltZW91dCAoc3RhdHVzID0gMHgleClcbiIsCisJCQkJICAgbXB1LT5yZWFkKG1wdSwgTVBVNDAxQyhtcHUpKSk7CiAjZW5kaWYKIAl9CiAJbXB1LT53cml0ZShtcHUsIGNtZCwgTVBVNDAxQyhtcHUpKTsKQEAgLTIxNSwxMiArMjU3LDE0IEBACiAJCX0KIAkJaWYgKCFvayAmJiBtcHUtPnJlYWQobXB1LCBNUFU0MDFEKG1wdSkpID09IE1QVTQwMV9BQ0spCiAJCQlvayA9IDE7Ci0JfSBlbHNlIHsKKwl9IGVsc2UKIAkJb2sgPSAxOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtcHUtPmlucHV0X2xvY2ssIGZsYWdzKTsKIAlpZiAoIW9rKSB7Ci0JCXNuZF9wcmludGsoImNtZDogMHgleCBmYWlsZWQgYXQgMHglbHggKHN0YXR1cyA9IDB4JXgsIGRhdGEgPSAweCV4KVxuIiwgY21kLCBtcHUtPnBvcnQsIG1wdS0+cmVhZChtcHUsIE1QVTQwMUMobXB1KSksIG1wdS0+cmVhZChtcHUsIE1QVTQwMUQobXB1KSkpOworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJjbWQ6IDB4JXggZmFpbGVkIGF0IDB4JWx4ICIKKwkJCSAgICIoc3RhdHVzID0gMHgleCwgZGF0YSA9IDB4JXgpXG4iLCBjbWQsIG1wdS0+cG9ydCwKKwkJCSAgIG1wdS0+cmVhZChtcHUsIE1QVTQwMUMobXB1KSksCisJCQkgICBtcHUtPnJlYWQobXB1LCBNUFU0MDFEKG1wdSkpKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtMzE0LDcgKzM1OCw4IEBACiAvKgogICogdHJpZ2dlciBpbnB1dCBjYWxsYmFjawogICovCi1zdGF0aWMgdm9pZCBzbmRfbXB1NDAxX3VhcnRfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKK3N0YXRpYyB2b2lkCitzbmRfbXB1NDAxX3VhcnRfaW5wdXRfdHJpZ2dlcihzdHJ1Y3Qgc25kX3Jhd21pZGlfc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCB1cCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzbmRfbXB1NDAxICptcHU7CkBAIC0zMjIsNyArMzY3LDggQEAKIAogCW1wdSA9IHN1YnN0cmVhbS0+cm1pZGktPnByaXZhdGVfZGF0YTsKIAlpZiAodXApIHsKLQkJaWYgKCEgdGVzdF9hbmRfc2V0X2JpdChNUFU0MDFfTU9ERV9CSVRfSU5QVVRfVFJJR0dFUiwgJm1wdS0+bW9kZSkpIHsKKwkJaWYgKCEgdGVzdF9hbmRfc2V0X2JpdChNUFU0MDFfTU9ERV9CSVRfSU5QVVRfVFJJR0dFUiwKKwkJCQkgICAgICAgJm1wdS0+bW9kZSkpIHsKIAkJCS8qIGZpcnN0IHRpbWUgLSBmbHVzaCBGSUZPICovCiAJCQl3aGlsZSAobWF4LS0gPiAwKQogCQkJCW1wdS0+cmVhZChtcHUsIE1QVTQwMUQobXB1KSk7CkBAIC0zNTIsMTMgKzM5OCwxMSBAQAogCXVuc2lnbmVkIGNoYXIgYnl0ZTsKIAogCXdoaWxlIChtYXgtLSA+IDApIHsKLQkJaWYgKHNuZF9tcHU0MDFfaW5wdXRfYXZhaWwobXB1KSkgewotCQkJYnl0ZSA9IG1wdS0+cmVhZChtcHUsIE1QVTQwMUQobXB1KSk7Ci0JCQlpZiAodGVzdF9iaXQoTVBVNDAxX01PREVfQklUX0lOUFVUX1RSSUdHRVIsICZtcHUtPm1vZGUpKQotCQkJCXNuZF9yYXdtaWRpX3JlY2VpdmUobXB1LT5zdWJzdHJlYW1faW5wdXQsICZieXRlLCAxKTsKLQkJfSBlbHNlIHsKKwkJaWYgKCEgc25kX21wdTQwMV9pbnB1dF9hdmFpbChtcHUpKQogCQkJYnJlYWs7IC8qIGlucHV0IG5vdCBhdmFpbGFibGUgKi8KLQkJfQorCQlieXRlID0gbXB1LT5yZWFkKG1wdSwgTVBVNDAxRChtcHUpKTsKKwkJaWYgKHRlc3RfYml0KE1QVTQwMV9NT0RFX0JJVF9JTlBVVF9UUklHR0VSLCAmbXB1LT5tb2RlKSkKKwkJCXNuZF9yYXdtaWRpX3JlY2VpdmUobXB1LT5zdWJzdHJlYW1faW5wdXQsICZieXRlLCAxKTsKIAl9CiB9CiAKQEAgLTM4MCwxNiArNDI0LDE2IEBACiAJaW50IG1heCA9IDI1NiwgdGltZW91dDsKIAogCWRvIHsKLQkJaWYgKHNuZF9yYXdtaWRpX3RyYW5zbWl0X3BlZWsobXB1LT5zdWJzdHJlYW1fb3V0cHV0LCAmYnl0ZSwgMSkgPT0gMSkgeworCQlpZiAoc25kX3Jhd21pZGlfdHJhbnNtaXRfcGVlayhtcHUtPnN1YnN0cmVhbV9vdXRwdXQsCisJCQkJCSAgICAgICZieXRlLCAxKSA9PSAxKSB7CiAJCQlmb3IgKHRpbWVvdXQgPSAxMDA7IHRpbWVvdXQgPiAwOyB0aW1lb3V0LS0pIHsKLQkJCQlpZiAoc25kX21wdTQwMV9vdXRwdXRfcmVhZHkobXB1KSkgewotCQkJCQltcHUtPndyaXRlKG1wdSwgYnl0ZSwgTVBVNDAxRChtcHUpKTsKLQkJCQkJc25kX3Jhd21pZGlfdHJhbnNtaXRfYWNrKG1wdS0+c3Vic3RyZWFtX291dHB1dCwgMSk7CisJCQkJaWYgKHNuZF9tcHU0MDFfb3V0cHV0X3JlYWR5KG1wdSkpCiAJCQkJCWJyZWFrOwotCQkJCX0KIAkJCX0KIAkJCWlmICh0aW1lb3V0ID09IDApCiAJCQkJYnJlYWs7CS8qIFR4IEZJRk8gZnVsbCAtIHRyeSBhZ2FpbiBsYXRlciAqLworCQkJbXB1LT53cml0ZShtcHUsIGJ5dGUsIE1QVTQwMUQobXB1KSk7CisJCQlzbmRfcmF3bWlkaV90cmFuc21pdF9hY2sobXB1LT5zdWJzdHJlYW1fb3V0cHV0LCAxKTsKIAkJfSBlbHNlIHsKIAkJCXNuZF9tcHU0MDFfdWFydF9yZW1vdmVfdGltZXIgKG1wdSwgMCk7CiAJCQlicmVhazsJLyogbm8gb3RoZXIgZGF0YSAtIGxlYXZlIHRoZSB0eCBsb29wICovCkBAIC00MDAsNyArNDQ0LDggQEAKIC8qCiAgKiBvdXRwdXQgdHJpZ2dlciBjYWxsYmFjawogICovCi1zdGF0aWMgdm9pZCBzbmRfbXB1NDAxX3VhcnRfb3V0cHV0X3RyaWdnZXIoc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgdXApCitzdGF0aWMgdm9pZAorc25kX21wdTQwMV91YXJ0X291dHB1dF90cmlnZ2VyKHN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IHVwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNuZF9tcHU0MDEgKm1wdTsKQEAgLTQxMywxNCArNDU4LDE2IEBACiAJCSAqIHNpbmNlIHRoZSBvdXRwdXQgdGltZXIgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQgaW4KIAkJICogc25kX21wdTQwMV91YXJ0X291dHB1dF93cml0ZSgpLgogCQkgKi8KLQkJc25kX21wdTQwMV91YXJ0X2FkZF90aW1lcihtcHUsIDApOworCQlpZiAoISAobXB1LT5pbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fVFhfSVJRKSkKKwkJCXNuZF9tcHU0MDFfdWFydF9hZGRfdGltZXIobXB1LCAwKTsKIAogCQkvKiBvdXRwdXQgcGVuZGluZyBkYXRhICovCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtcHUtPm91dHB1dF9sb2NrLCBmbGFncyk7CiAJCXNuZF9tcHU0MDFfdWFydF9vdXRwdXRfd3JpdGUobXB1KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXB1LT5vdXRwdXRfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7Ci0JCXNuZF9tcHU0MDFfdWFydF9yZW1vdmVfdGltZXIobXB1LCAwKTsKKwkJaWYgKCEgKG1wdS0+aW5mb19mbGFncyAmIE1QVTQwMV9JTkZPX1RYX0lSUSkpCisJCQlzbmRfbXB1NDAxX3VhcnRfcmVtb3ZlX3RpbWVyKG1wdSwgMCk7CiAJCWNsZWFyX2JpdChNUFU0MDFfTU9ERV9CSVRfT1VUUFVUX1RSSUdHRVIsICZtcHUtPm1vZGUpOwogCX0KIH0KQEAgLTQ1OCw3ICs1MDUsNyBAQAogICogQGRldmljZTogdGhlIGRldmljZSBpbmRleCwgemVyby1iYXNlZAogICogQGhhcmR3YXJlOiB0aGUgaGFyZHdhcmUgdHlwZSwgTVBVNDAxX0hXX1hYWFgKICAqIEBwb3J0OiB0aGUgYmFzZSBhZGRyZXNzIG9mIE1QVTQwMSBwb3J0Ci0gKiBAaW50ZWdyYXRlZDogbm9uLXplcm8gaWYgdGhlIHBvcnQgd2FzIGFscmVhZHkgcmVzZXJ2ZWQgYnkgdGhlIGNoaXAKKyAqIEBpbmZvX2ZsYWdzOiBiaXRmbGFncyBNUFU0MDFfSU5GT19YWFgKICAqIEBpcnE6IHRoZSBpcnEgbnVtYmVyLCAtMSBpZiBubyBpbnRlcnJ1cHQgZm9yIG1wdQogICogQGlycV9mbGFnczogdGhlIGlycSByZXF1ZXN0IGZsYWdzIChTQV9YWFgpLCAwIGlmIGlycSB3YXMgYWxyZWFkeSByZXNlcnZlZC4KICAqIEBycmF3bWlkaTogdGhlIHBvaW50ZXIgdG8gc3RvcmUgdGhlIG5ldyByYXdtaWRpIGluc3RhbmNlCkBAIC00NzMsMTcgKzUyMCwyNCBAQAogICovCiBpbnQgc25kX21wdTQwMV91YXJ0X25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXZpY2UsCiAJCQl1bnNpZ25lZCBzaG9ydCBoYXJkd2FyZSwKLQkJCXVuc2lnbmVkIGxvbmcgcG9ydCwgaW50IGludGVncmF0ZWQsCisJCQl1bnNpZ25lZCBsb25nIHBvcnQsCisJCQl1bnNpZ25lZCBpbnQgaW5mb19mbGFncywKIAkJCWludCBpcnEsIGludCBpcnFfZmxhZ3MsCiAJCQlzdHJ1Y3Qgc25kX3Jhd21pZGkgKiogcnJhd21pZGkpCiB7CiAJc3RydWN0IHNuZF9tcHU0MDEgKm1wdTsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOworCWludCBpbl9lbmFibGUsIG91dF9lbmFibGU7CiAJaW50IGVycjsKIAogCWlmIChycmF3bWlkaSkKIAkJKnJyYXdtaWRpID0gTlVMTDsKLQlpZiAoKGVyciA9IHNuZF9yYXdtaWRpX25ldyhjYXJkLCAiTVBVLTQwMVUiLCBkZXZpY2UsIDEsIDEsICZybWlkaSkpIDwgMCkKKwlpZiAoISAoaW5mb19mbGFncyAmIChNUFU0MDFfSU5GT19JTlBVVCB8IE1QVTQwMV9JTkZPX09VVFBVVCkpKQorCQlpbmZvX2ZsYWdzIHw9IE1QVTQwMV9JTkZPX0lOUFVUIHwgTVBVNDAxX0lORk9fT1VUUFVUOworCWluX2VuYWJsZSA9IChpbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fSU5QVVQpID8gMSA6IDA7CisJb3V0X2VuYWJsZSA9IChpbmZvX2ZsYWdzICYgTVBVNDAxX0lORk9fT1VUUFVUKSA/IDEgOiAwOworCWlmICgoZXJyID0gc25kX3Jhd21pZGlfbmV3KGNhcmQsICJNUFUtNDAxVSIsIGRldmljZSwKKwkJCQkgICBvdXRfZW5hYmxlLCBpbl9lbmFibGUsICZybWlkaSkpIDwgMCkKIAkJcmV0dXJuIGVycjsKIAltcHUgPSBremFsbG9jKHNpemVvZigqbXB1KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1wdSA9PSBOVUxMKSB7CkBAIC00OTcsMjMgKzU1MSwyMyBAQAogCXNwaW5fbG9ja19pbml0KCZtcHUtPm91dHB1dF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmbXB1LT50aW1lcl9sb2NrKTsKIAltcHUtPmhhcmR3YXJlID0gaGFyZHdhcmU7Ci0JaWYgKCFpbnRlZ3JhdGVkKSB7CisJaWYgKCEgKGluZm9fZmxhZ3MgJiBNUFU0MDFfSU5GT19JTlRFR1JBVEVEKSkgewogCQlpbnQgcmVzX3NpemUgPSBoYXJkd2FyZSA9PSBNUFU0MDFfSFdfUEM5OElJID8gNCA6IDI7Ci0JCWlmICgobXB1LT5yZXMgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCByZXNfc2l6ZSwgIk1QVTQwMSBVQVJUIikpID09IE5VTEwpIHsKLQkJCXNuZF9wcmludGsoS0VSTl9FUlIgIm1wdTQwMV91YXJ0OiB1bmFibGUgdG8gZ3JhYiBwb3J0IDB4JWx4IHNpemUgJWRcbiIsIHBvcnQsIHJlc19zaXplKTsKKwkJbXB1LT5yZXMgPSByZXF1ZXN0X3JlZ2lvbihwb3J0LCByZXNfc2l6ZSwgIk1QVTQwMSBVQVJUIik7CisJCWlmIChtcHUtPnJlcyA9PSBOVUxMKSB7CisJCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtcHU0MDFfdWFydDogIgorCQkJCSAgICJ1bmFibGUgdG8gZ3JhYiBwb3J0IDB4JWx4IHNpemUgJWRcbiIsCisJCQkJICAgcG9ydCwgcmVzX3NpemUpOwogCQkJc25kX2RldmljZV9mcmVlKGNhcmQsIHJtaWRpKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9Ci0Jc3dpdGNoIChoYXJkd2FyZSkgewotCWNhc2UgTVBVNDAxX0hXX0FVUkVBTDoKKwlpZiAoaW5mb19mbGFncyAmIE1QVTQwMV9JTkZPX01NSU8pIHsKIAkJbXB1LT53cml0ZSA9IG1wdTQwMV93cml0ZV9tbWlvOwogCQltcHUtPnJlYWQgPSBtcHU0MDFfcmVhZF9tbWlvOwotCQlicmVhazsKLQlkZWZhdWx0OgorCX0gZWxzZSB7CiAJCW1wdS0+d3JpdGUgPSBtcHU0MDFfd3JpdGVfcG9ydDsKIAkJbXB1LT5yZWFkID0gbXB1NDAxX3JlYWRfcG9ydDsKLQkJYnJlYWs7CiAJfQogCW1wdS0+cG9ydCA9IHBvcnQ7CiAJaWYgKGhhcmR3YXJlID09IE1QVTQwMV9IV19QQzk4SUkpCkBAIC01MjEsMzAgKzU3NSw0MCBAQAogCWVsc2UKIAkJbXB1LT5jcG9ydCA9IHBvcnQgKyAxOwogCWlmIChpcnEgPj0gMCAmJiBpcnFfZmxhZ3MpIHsKLQkJaWYgKHJlcXVlc3RfaXJxKGlycSwgc25kX21wdTQwMV91YXJ0X2ludGVycnVwdCwgaXJxX2ZsYWdzLCAiTVBVNDAxIFVBUlQiLCAodm9pZCAqKSBtcHUpKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJtcHU0MDFfdWFydDogdW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBpcnEpOworCQlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0LCBpcnFfZmxhZ3MsCisJCQkJIk1QVTQwMSBVQVJUIiwgKHZvaWQgKikgbXB1KSkgeworCQkJc25kX3ByaW50ayhLRVJOX0VSUiAibXB1NDAxX3VhcnQ6ICIKKwkJCQkgICAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBpcnEpOwogCQkJc25kX2RldmljZV9mcmVlKGNhcmQsIHJtaWRpKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CisJbXB1LT5pbmZvX2ZsYWdzID0gaW5mb19mbGFnczsKIAltcHUtPmlycSA9IGlycTsKIAltcHUtPmlycV9mbGFncyA9IGlycV9mbGFnczsKIAlpZiAoY2FyZC0+c2hvcnRuYW1lWzBdKQotCQlzbnByaW50ZihybWlkaS0+bmFtZSwgc2l6ZW9mKHJtaWRpLT5uYW1lKSwgIiVzIE1JREkiLCBjYXJkLT5zaG9ydG5hbWUpOworCQlzbnByaW50ZihybWlkaS0+bmFtZSwgc2l6ZW9mKHJtaWRpLT5uYW1lKSwgIiVzIE1JREkiLAorCQkJIGNhcmQtPnNob3J0bmFtZSk7CiAJZWxzZQotCQlzcHJpbnRmKHJtaWRpLT5uYW1lLCAiTVBVLTQwMSBNSURJICVkLSVkIiwgY2FyZC0+bnVtYmVyLCBkZXZpY2UpOwotCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX09VVFBVVCwgJnNuZF9tcHU0MDFfdWFydF9vdXRwdXQpOwotCXNuZF9yYXdtaWRpX3NldF9vcHMocm1pZGksIFNORFJWX1JBV01JRElfU1RSRUFNX0lOUFVULCAmc25kX21wdTQwMV91YXJ0X2lucHV0KTsKLQlybWlkaS0+aW5mb19mbGFncyB8PSBTTkRSVl9SQVdNSURJX0lORk9fT1VUUFVUIHwKLQkgICAgICAgICAgICAgICAgICAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAotCSAgICAgICAgICAgICAgICAgICAgIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisJCXNwcmludGYocm1pZGktPm5hbWUsICJNUFUtNDAxIE1JREkgJWQtJWQiLGNhcmQtPm51bWJlciwgZGV2aWNlKTsKKwlpZiAob3V0X2VuYWJsZSkgeworCQlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9PVVRQVVQsCisJCQkJICAgICZzbmRfbXB1NDAxX3VhcnRfb3V0cHV0KTsKKwkJcm1pZGktPmluZm9fZmxhZ3MgfD0gU05EUlZfUkFXTUlESV9JTkZPX09VVFBVVDsKKwl9CisJaWYgKGluX2VuYWJsZSkgeworCQlzbmRfcmF3bWlkaV9zZXRfb3BzKHJtaWRpLCBTTkRSVl9SQVdNSURJX1NUUkVBTV9JTlBVVCwKKwkJCQkgICAgJnNuZF9tcHU0MDFfdWFydF9pbnB1dCk7CisJCXJtaWRpLT5pbmZvX2ZsYWdzIHw9IFNORFJWX1JBV01JRElfSU5GT19JTlBVVDsKKwkJaWYgKG91dF9lbmFibGUpCisJCQlybWlkaS0+aW5mb19mbGFncyB8PSBTTkRSVl9SQVdNSURJX0lORk9fRFVQTEVYOworCX0KIAltcHUtPnJtaWRpID0gcm1pZGk7CiAJaWYgKHJyYXdtaWRpKQogCQkqcnJhd21pZGkgPSBybWlkaTsKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KTsKIEVYUE9SVF9TWU1CT0woc25kX21wdTQwMV91YXJ0X25ldyk7CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL210cGF2LmMgYi9zb3VuZC9kcml2ZXJzL210cGF2LmMKaW5kZXggYjdhMGI0Mi4uNDc0ZWVkMCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9tdHBhdi5jCisrKyBiL3NvdW5kL2RyaXZlcnMvbXRwYXYuYwpAQCAtNzcwLDExICs3NzAsMTUgQEAKIAkJcmV0dXJuIGVycjsKIAogCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoU05EX01UUEFWX0RSSVZFUiwgLTEsIE5VTEwsIDApOwotCWlmIChJU19FUlIoZGV2aWNlKSkgewotCQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX210cGF2X2RyaXZlcik7Ci0JCXJldHVybiBQVFJfRVJSKGRldmljZSk7Ci0JfQotCXJldHVybiAwOworCWlmICghSVNfRVJSKGRldmljZSkpIHsKKwkJaWYgKHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpCisJCQlyZXR1cm4gMDsKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZGV2aWNlKTsKKwkJZXJyID0gLUVOT0RFVjsKKwl9IGVsc2UKKwkJZXJyID0gUFRSX0VSUihkZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfbXRwYXZfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9jYXJkX210cGF2X2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX2xpYi5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMKaW5kZXggNGY4NTU2OS4uODdmZTM3NiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfbGliLmMKQEAgLTMxNiw2ICszMTYsOCBAQAogCX0KIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfb3BsM19pbnRlcnJ1cHQpOworCiAvKgogCiAgKi8KQEAgLTM2OSw2ICszNzEsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGwzX25ldyk7CisKIGludCBzbmRfb3BsM19pbml0KHN0cnVjdCBzbmRfb3BsMyAqb3BsMykKIHsKIAlpZiAoISBvcGwzLT5jb21tYW5kKSB7CkBAIC0zOTMsNiArMzk3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfb3BsM19pbml0KTsKKwogaW50IHNuZF9vcGwzX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCSAgICB1bnNpZ25lZCBsb25nIGxfcG9ydCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgcl9wb3J0LApAQCAtNDUxLDYgKzQ1Nyw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX29wbDNfY3JlYXRlKTsKKwogaW50IHNuZF9vcGwzX3RpbWVyX25ldyhzdHJ1Y3Qgc25kX29wbDMgKiBvcGwzLCBpbnQgdGltZXIxX2RldiwgaW50IHRpbWVyMl9kZXYpCiB7CiAJaW50IGVycjsKQEAgLTQ2OCw2ICs0NzYsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGwzX3RpbWVyX25ldyk7CisKIGludCBzbmRfb3BsM19od2RlcF9uZXcoc3RydWN0IHNuZF9vcGwzICogb3BsMywKIAkJICAgICAgIGludCBkZXZpY2UsIGludCBzZXFfZGV2aWNlLAogCQkgICAgICAgc3RydWN0IHNuZF9od2RlcCAqKiByaHdkZXApCkBAIC01MjYsMTcgKzUzNiw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLUVYUE9SVF9TWU1CT0woc25kX29wbDNfaW50ZXJydXB0KTsKLUVYUE9SVF9TWU1CT0woc25kX29wbDNfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX29wbDNfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9vcGwzX2NyZWF0ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9vcGwzX3RpbWVyX25ldyk7CiBFWFBPUlRfU1lNQk9MKHNuZF9vcGwzX2h3ZGVwX25ldyk7CiAKLS8qIG9wbDNfc3ludGguYyAqLwotRVhQT1JUX1NZTUJPTChzbmRfb3BsM19yZWdtYXApOwotRVhQT1JUX1NZTUJPTChzbmRfb3BsM19yZXNldCk7Ci0KIC8qCiAgKiAgSU5JVCBwYXJ0CiAgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX29zcy5jIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKaW5kZXggZmNjZjAxOS4uNWZkM2E0YyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfb3NzLmMKQEAgLTEwMCw3ICsxMDAsOCBAQAogCQkJCQkJCSAgU05EUlZfU0VRX1BPUlRfQ0FQX1dSSVRFLAogCQkJCQkJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMgfAogCQkJCQkJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dNIHwKLQkJCQkJCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEgsCisJCQkJCQkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFIHwKKwkJCQkJCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEhFU0laRVIsCiAJCQkJCQkJICB2b2ljZXMsIHZvaWNlcywKIAkJCQkJCQkgIG5hbWUpOwogCWlmIChvcGwzLT5vc3NfY2hzZXQtPnBvcnQgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCmluZGV4IDU3YmVjZjMuLjk2NzYyYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3NlcS5jCkBAIC0yMDMsNyArMjAzLDkgQEAKIAkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX0NBUF9TVUJTX1dSSVRFLAogCQkJCQkJICAgICAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dFTkVSSUMgfAogCQkJCQkJICAgICAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dNIHwKLQkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEgsCisJCQkJCQkgICAgICBTTkRSVl9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgfAorCQkJCQkJICAgICAgU05EUlZfU0VRX1BPUlRfVFlQRV9IQVJEV0FSRSB8CisJCQkJCQkgICAgICBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRIRVNJWkVSLAogCQkJCQkJICAgICAgMTYsIHZvaWNlcywKIAkJCQkJCSAgICAgIG5hbWUpOwogCWlmIChvcGwzLT5jaHNldC0+cG9ydCA8IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zeW50aC5jCmluZGV4IDZkYjUwM2YuLmE0YjM1NDMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsMy9vcGwzX3N5bnRoLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc3ludGguYwpAQCAtNTgsNiArNTgsOCBAQAogCXsgMHgxMiwgMHgxNSwgMHgwMCwgMHgwMCB9CS8qIGlzIHNlbGVjdGVkIChvbmx5IGxlZnQgcmVnIGJsb2NrKSAqLwogfTsKIAorRVhQT1JUX1NZTUJPTChzbmRfb3BsM19yZWdtYXApOworCiAvKgogICogcHJvdG90eXBlcwogICovCkBAIC0yMjgsNiArMjMwLDcgQEAKIAlvcGwzLT5yaHl0aG0gPSAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGwzX3Jlc2V0KTsKIAogc3RhdGljIGludCBzbmRfb3BsM19wbGF5X25vdGUoc3RydWN0IHNuZF9vcGwzICogb3BsMywgc3RydWN0IHNuZF9kbV9mbV9ub3RlICogbm90ZSkKIHsKQEAgLTQ0NSwzICs0NDgsNCBAQAogCiAJcmV0dXJuIDA7CiB9CisKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X2xpYi5jIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfbGliLmMKaW5kZXggNGJjODYwYS4uMDE5OTdmMiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfbGliLmMKKysrIGIvc291bmQvZHJpdmVycy9vcGw0L29wbDRfbGliLmMKQEAgLTQzLDYgKzQzLDggQEAKIAlvdXRiKHZhbHVlLCBvcGw0LT5wY21fcG9ydCArIDEpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGw0X3dyaXRlKTsKKwogdTggc25kX29wbDRfcmVhZChzdHJ1Y3Qgc25kX29wbDQgKm9wbDQsIHU4IHJlZykKIHsKIAlzbmRfb3BsNF93YWl0KG9wbDQpOwpAQCAtNTIsNiArNTQsOCBAQAogCXJldHVybiBpbmIob3BsNC0+cGNtX3BvcnQgKyAxKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfb3BsNF9yZWFkKTsKKwogdm9pZCBzbmRfb3BsNF9yZWFkX21lbW9yeShzdHJ1Y3Qgc25kX29wbDQgKm9wbDQsIGNoYXIgKmJ1ZiwgaW50IG9mZnNldCwgaW50IHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTc2LDYgKzgwLDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGw0LT5yZWdfbG9jaywgZmxhZ3MpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGw0X3JlYWRfbWVtb3J5KTsKKwogdm9pZCBzbmRfb3BsNF93cml0ZV9tZW1vcnkoc3RydWN0IHNuZF9vcGw0ICpvcGw0LCBjb25zdCBjaGFyICpidWYsIGludCBvZmZzZXQsIGludCBzaXplKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDAsNiArMTA2LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGw0LT5yZWdfbG9jaywgZmxhZ3MpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9vcGw0X3dyaXRlX21lbW9yeSk7CisKIHN0YXRpYyB2b2lkIHNuZF9vcGw0X2VuYWJsZV9vcGw0KHN0cnVjdCBzbmRfb3BsNCAqb3BsNCkKIHsKIAlvdXRiKE9QTDNfUkVHX01PREUsIG9wbDQtPmZtX3BvcnQgKyAyKTsKQEAgLTI1NiwxMCArMjY0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfb3BsNF93cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9vcGw0X3JlYWQpOwotRVhQT1JUX1NZTUJPTChzbmRfb3BsNF93cml0ZV9tZW1vcnkpOwotRVhQT1JUX1NZTUJPTChzbmRfb3BsNF9yZWFkX21lbW9yeSk7CiBFWFBPUlRfU1lNQk9MKHNuZF9vcGw0X2NyZWF0ZSk7CiAKIHN0YXRpYyBpbnQgX19pbml0IGFsc2Ffb3BsNF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9zZXEuYyBiL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3NlcS5jCmluZGV4IGRjMGRjZGMuLjQzZDhhMmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3NlcS5jCisrKyBiL3NvdW5kL2RyaXZlcnMvb3BsNC9vcGw0X3NlcS5jCkBAIC0xNjQsNyArMTY0LDkgQEAKIAkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX0NBUF9XUklURSB8CiAJCQkJCQkgICAgICBTTkRSVl9TRVFfUE9SVF9DQVBfU1VCU19XUklURSwKIAkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDIHwKLQkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HTSwKKwkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HTSB8CisJCQkJCQkgICAgICBTTkRSVl9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFIHwKKwkJCQkJCSAgICAgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEhFU0laRVIsCiAJCQkJCQkgICAgICAxNiwgMjQsCiAJCQkJCQkgICAgICAiT1BMNCBXYXZldGFibGUgUG9ydCIpOwogCWlmIChvcGw0LT5jaHNldC0+cG9ydCA8IDApIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvc2VyaWFsLXUxNjU1MC5jIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKaW5kZXggYzAxYjRjNS4uMjMzMGZlYyAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKKysrIGIvc291bmQvZHJpdmVycy9zZXJpYWwtdTE2NTUwLmMKQEAgLTk5OCw2ICs5OTgsMTAgQEAKIAkJCQkJCQkgaSwgTlVMTCwgMCk7CiAJCWlmIChJU19FUlIoZGV2aWNlKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQogCQlkZXZpY2VzW2ldID0gZGV2aWNlOwogCQljYXJkcysrOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdmlybWlkaS5jIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKaW5kZXggMjZlYjI0OS4uNTkxNzFmOCAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92aXJtaWRpLmMKKysrIGIvc291bmQvZHJpdmVycy92aXJtaWRpLmMKQEAgLTE3MSw2ICsxNzEsMTAgQEAKIAkJCQkJCQkgaSwgTlVMTCwgMCk7CiAJCWlmIChJU19FUlIoZGV2aWNlKSkKIAkJCWNvbnRpbnVlOworCQlpZiAoIXBsYXRmb3JtX2dldF9kcnZkYXRhKGRldmljZSkpIHsKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQogCQlkZXZpY2VzW2ldID0gZGV2aWNlOwogCQljYXJkcysrOwogCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2RyaXZlcnMvdngvdnhfY29yZS5jIGIvc291bmQvZHJpdmVycy92eC92eF9jb3JlLmMKaW5kZXggZmE0YTJiNS4uYTYwMTY4MiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF9jb3JlLmMKKysrIGIvc291bmQvZHJpdmVycy92eC92eF9jb3JlLmMKQEAgLTcwLDYgKzcwLDggQEAKIAlyZXR1cm4gLUVJTzsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdnhfY2hlY2tfcmVnX2JpdCk7CisKIC8qCiAgKiB2eF9zZW5kX2lycV9kc3AgLSBzZXQgY29tbWFuZCBpcnEgYml0CiAgKiBAbnVtOiB0aGUgcmVxdWVzdGVkIElSUSB0eXBlLCBJUlFfWFhYCkBAIC00NjUsNiArNDY3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdnhfbG9hZF9ib290X2ltYWdlKTsKKwogLyoKICAqIHZ4X3Rlc3RfaXJxX3NyYyAtIHF1ZXJ5IHRoZSBzb3VyY2Ugb2YgaW50ZXJydXB0cwogICoKQEAgLTU0NSw2ICs1NDksNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdnhfaXJxX2hhbmRsZXIpOwogCiAvKgogICovCkBAIC02MzUsNyArNjQwLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgInZ4LXN0YXR1cyIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgdnhfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCB2eF9wcm9jX3JlYWQpOwogfQogCiAKQEAgLTY1Nyw2ICs2NjIsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF92eF9kc3BfYm9vdCk7CisKIC8qKgogICogc25kX3Z4X2RzcF9sb2FkIC0gbG9hZCB0aGUgRFNQIGltYWdlCiAgKi8KQEAgLTcwNSw2ICs3MTIsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF92eF9kc3BfbG9hZCk7CisKICNpZmRlZiBDT05GSUdfUE0KIC8qCiAgKiBzdXNwZW5kCkBAIC03MjEsNiArNzMwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdnhfc3VzcGVuZCk7CisKIC8qCiAgKiByZXN1bWUKICAqLwpAQCAtNzQ3LDYgKzc1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3Z4X3Jlc3VtZSk7CiAjZW5kaWYKIAogLyoqCkBAIC03OTAsNiArODAyLDggQEAKIAlyZXR1cm4gY2hpcDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdnhfY3JlYXRlKTsKKwogLyoKICAqIG1vZHVsZSBlbnRyaWVzCiAgKi8KQEAgLTgwNCwxOSArODE4LDMgQEAKIAogbW9kdWxlX2luaXQoYWxzYV92eF9jb3JlX2luaXQpCiBtb2R1bGVfZXhpdChhbHNhX3Z4X2NvcmVfZXhpdCkKLQotLyoKLSAqIGV4cG9ydHMKLSAqLwotRVhQT1JUX1NZTUJPTChzbmRfdnhfY2hlY2tfcmVnX2JpdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfdnhfc2V0dXBfZmlybXdhcmUpOwotRVhQT1JUX1NZTUJPTChzbmRfdnhfZnJlZV9maXJtd2FyZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9pcnFfaGFuZGxlcik7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9kc3BfYm9vdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9kc3BfbG9hZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9sb2FkX2Jvb3RfaW1hZ2UpOwotI2lmZGVmIENPTkZJR19QTQotRVhQT1JUX1NZTUJPTChzbmRfdnhfc3VzcGVuZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF92eF9yZXN1bWUpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMgYi9zb3VuZC9kcml2ZXJzL3Z4L3Z4X2h3ZGVwLmMKaW5kZXggZDgzNzc4My4uZTE5MjBhZiAxMDA2NDQKLS0tIGEvc291bmQvZHJpdmVycy92eC92eF9od2RlcC5jCisrKyBiL3NvdW5kL2RyaXZlcnMvdngvdnhfaHdkZXAuYwpAQCAtMjUwLDMgKzI1MCw2IEBACiB9CiAKICNlbmRpZiAvKiBTTkRfVlhfRldfTE9BREVSICovCisKK0VYUE9SVF9TWU1CT0woc25kX3Z4X3NldHVwX2Zpcm13YXJlKTsKK0VYUE9SVF9TWU1CT0woc25kX3Z4X2ZyZWVfZmlybXdhcmUpOwpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL2kyYy5jIGIvc291bmQvaTJjL2kyYy5jCmluZGV4IGVkZmU3NmYuLmI2MGZiMTggMTAwNjQ0Ci0tLSBhL3NvdW5kL2kyYy9pMmMuYworKysgYi9zb3VuZC9pMmMvaTJjLmMKQEAgLTEwNiw2ICsxMDYsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pMmNfYnVzX2NyZWF0ZSk7CisKIGludCBzbmRfaTJjX2RldmljZV9jcmVhdGUoc3RydWN0IHNuZF9pMmNfYnVzICpidXMsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgIHVuc2lnbmVkIGNoYXIgYWRkciwgc3RydWN0IHNuZF9pMmNfZGV2aWNlICoqcmRldmljZSkKIHsKQEAgLTEyNCw2ICsxMjYsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pMmNfZGV2aWNlX2NyZWF0ZSk7CisKIGludCBzbmRfaTJjX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfaTJjX2RldmljZSAqZGV2aWNlKQogewogCWlmIChkZXZpY2UtPmJ1cykKQEAgLTEzNCwyMiArMTM4LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2kyY19kZXZpY2VfZnJlZSk7CisKIGludCBzbmRfaTJjX3NlbmRieXRlcyhzdHJ1Y3Qgc25kX2kyY19kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBjb3VudCkKIHsKIAlyZXR1cm4gZGV2aWNlLT5idXMtPm9wcy0+c2VuZGJ5dGVzKGRldmljZSwgYnl0ZXMsIGNvdW50KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaTJjX3NlbmRieXRlcyk7CiAKIGludCBzbmRfaTJjX3JlYWRieXRlcyhzdHJ1Y3Qgc25kX2kyY19kZXZpY2UgKmRldmljZSwgdW5zaWduZWQgY2hhciAqYnl0ZXMsIGludCBjb3VudCkKIHsKIAlyZXR1cm4gZGV2aWNlLT5idXMtPm9wcy0+cmVhZGJ5dGVzKGRldmljZSwgYnl0ZXMsIGNvdW50KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaTJjX3JlYWRieXRlcyk7CisKIGludCBzbmRfaTJjX3Byb2JlYWRkcihzdHJ1Y3Qgc25kX2kyY19idXMgKmJ1cywgdW5zaWduZWQgc2hvcnQgYWRkcikKIHsKIAlyZXR1cm4gYnVzLT5vcHMtPnByb2JlYWRkcihidXMsIGFkZHIpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9pMmNfcHJvYmVhZGRyKTsKKwogLyoKICAqICBiaXQtb3BlcmF0aW9ucwogICovCkBAIC0zMjAsMTIgKzMzMSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotRVhQT1JUX1NZTUJPTChzbmRfaTJjX2J1c19jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfaTJjX2RldmljZV9jcmVhdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfaTJjX2RldmljZV9mcmVlKTsKLUVYUE9SVF9TWU1CT0woc25kX2kyY19zZW5kYnl0ZXMpOwotRVhQT1JUX1NZTUJPTChzbmRfaTJjX3JlYWRieXRlcyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9pMmNfcHJvYmVhZGRyKTsKIAogc3RhdGljIGludCBfX2luaXQgYWxzYV9pMmNfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvc291bmQvaTJjL2wzL3VkYTEzNDEuYyBiL3NvdW5kL2kyYy9sMy91ZGExMzQxLmMKaW5kZXggNzQ2NTAwZS4uYjA3NGZkZCAxMDA2NDQKLS0tIGEvc291bmQvaTJjL2wzL3VkYTEzNDEuYworKysgYi9zb3VuZC9pMmMvbDMvdWRhMTM0MS5jCkBAIC01MTcsOSArNTE3LDkgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2FyZCwgInVkYTEzNDEiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNsbnQsIDEwMjQsIHNuZF91ZGExMzQxX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2xudCwgc25kX3VkYTEzNDFfcHJvY19yZWFkKTsKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjYXJkLCAidWRhMTM0MS1yZWdzIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjbG50LCAxMDI0LCBzbmRfdWRhMTM0MV9wcm9jX3JlZ3NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2xudCwgc25kX3VkYTEzNDFfcHJvY19yZWdzX3JlYWQpOwogfQogCiAvKiB9fX0gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX2lycS5jIGIvc291bmQvaXNhL2d1cy9ndXNfaXJxLmMKaW5kZXggYzE5YmEyOS4uNDJkYjM3NSAxMDA2NDQKLS0tIGEvc291bmQvaXNhL2d1cy9ndXNfaXJxLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfaXJxLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhndXMtPmNhcmQsICJndXNpcnEiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGd1cywgMTAyNCwgc25kX2d1c19pcnFfaW5mb19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBndXMsIHNuZF9ndXNfaXJxX2luZm9fcmVhZCk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL2d1cy9ndXNfbWVtLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c19tZW0uYwppbmRleCAzYzBkMjdhLi5mNTBjMjc2IDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2d1c19tZW0uYworKysgYi9zb3VuZC9pc2EvZ3VzL2d1c19tZW0uYwpAQCAtMjY0LDEwICsyNjQsOCBAQAogCWlmIChzbmRfZ2YxX21lbV94YWxsb2MoYWxsb2MsICZibG9jaykgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVRwotCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGd1cy0+Y2FyZCwgImd1c21lbSIsICZlbnRyeSkpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBndXMsIDEwMjQsIHNuZF9nZjFfbWVtX2luZm9fcmVhZCk7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gMjU2ICogMTAyNDsKLQl9CisJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZ3VzLT5jYXJkLCAiZ3VzbWVtIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBndXMsIHNuZF9nZjFfbWVtX2luZm9fcmVhZCk7CiAjZW5kaWYKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9ndXMvZ3VzX3N5bnRoLmMgYi9zb3VuZC9pc2EvZ3VzL2d1c19zeW50aC5jCmluZGV4IDI3NjdjYzEuLjNlNGQ0ZDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9ndXMvZ3VzX3N5bnRoLmMKKysrIGIvc291bmQvaXNhL2d1cy9ndXNfc3ludGguYwpAQCAtMTk0LDcgKzE5NCw5IEBACiAJCQkJCQkgICAmY2FsbGJhY2tzLAogCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfQ0FQX1dSSVRFIHwgU05EUlZfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUsCiAJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgfAotCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USCwKKwkJCQkJCSAgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEggfAorCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfVFlQRV9IQVJEV0FSRSB8CisJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRIRVNJWkVSLAogCQkJCQkJICAgMTYsIDAsCiAJCQkJCQkgICBuYW1lKTsKIAlpZiAocC0+Y2hzZXQtPnBvcnQgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jIGIvc291bmQvaXNhL2d1cy9pbnRlcndhdmUuYwppbmRleCA0Mjk4ZDMzLi44NjYzMDBmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2EvZ3VzL2ludGVyd2F2ZS5jCisrKyBiL3NvdW5kL2lzYS9ndXMvaW50ZXJ3YXZlLmMKQEAgLTcwLDkgKzcwLDkgQEAKIHN0YXRpYyBpbnQgZG1hMltTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJLyogMCwxLDMsNSw2LDcgKi8KIHN0YXRpYyBpbnQgam95c3RpY2tfZGFjW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMjl9OwogCQkJCS8qIDAgdG8gMzEsICgwLjU5Vi00LjUyViBvciAwLjM4OVYtMi45OFYpICovCi1zdGF0aWMgaW50IG1pZGlbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKK3N0YXRpYyBpbnQgbWlkaVtTTkRSVl9DQVJEU107CiBzdGF0aWMgaW50IHBjbV9jaGFubmVsc1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDJ9Owotc3RhdGljIGludCBlZmZlY3RbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKK3N0YXRpYyBpbnQgZWZmZWN0W1NORFJWX0NBUkRTXTsKIAogI2lmZGVmIFNORFJWX1NUQgogI2RlZmluZSBQRlggImludGVyd2F2ZS1zdGI6ICIKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcGwzc2EyLmMgYi9zb3VuZC9pc2Evb3BsM3NhMi5jCmluZGV4IDZkODg5MDUuLjY0N2E5OTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9vcGwzc2EyLmMKKysrIGIvc291bmQvaXNhL29wbDNzYTIuYwpAQCAtNTksNyArNTksNyBAQAogc3RhdGljIGludCBpcnFbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JUlE7CS8qIDAsMSwzLDUsOSwxMSwxMiwxNSAqLwogc3RhdGljIGludCBkbWExW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRE1BOwkvKiAxLDMsNSw2LDcgKi8KIHN0YXRpYyBpbnQgZG1hMltTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJLyogMSwzLDUsNiw3ICovCi1zdGF0aWMgaW50IG9wbDNzYTNfeW1vZGVbU05EUlZfQ0FSRFNdID0geyBbMCAuLi4gKFNORFJWX0NBUkRTLTEpXSA9IDAgfTsgICAvKiAwLDEsMiwzICovIC8qU0wgQWRkZWQqLworc3RhdGljIGludCBvcGwzc2EzX3ltb2RlW1NORFJWX0NBUkRTXTsgICAvKiAwLDEsMiwzICovIC8qU0wgQWRkZWQqLwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIE9QTDMtU0Egc291bmRjYXJkLiIpOwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc25kX29wbDNzYTJfZGV0ZWN0KHN0cnVjdCBzbmRfb3BsM3NhMiAqY2hpcCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNuZF9vcGwzc2EyX2RldGVjdChzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCXVuc2lnbmVkIGxvbmcgcG9ydDsKQEAgLTQ4OSw3ICs0ODksNyBAQAogCWNoaXAtPm1hc3Rlcl92b2x1bWUgPSBOVUxMOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfb3BsM3NhMl9taXhlcihzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXApCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9taXhlcihzdHJ1Y3Qgc25kX29wbDNzYTIgKmNoaXApCiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gY2hpcC0+Y2FyZDsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2lkIGlkMSwgaWQyOwpAQCAtNTgzLDggKzU4Myw4IEBACiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKICNpZmRlZiBDT05GSUdfUE5QCi1zdGF0aWMgaW50IF9faW5pdCBzbmRfb3BsM3NhMl9wbnAoaW50IGRldiwgc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwLAotCQkJCSAgc3RydWN0IHBucF9kZXYgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9wbnAoaW50IGRldiwgc3RydWN0IHNuZF9vcGwzc2EyICpjaGlwLAorCQkJCSAgICAgc3RydWN0IHBucF9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHBucF9yZXNvdXJjZV90YWJsZSAqIGNmZzsKIAlpbnQgZXJyOwpAQCAtODYyLDcgKzg2Miw3IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KIAotc3RhdGljIGludCBfX2luaXQgc25kX29wbDNzYTJfbm9ucG5wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfb3BsM3NhMl9ub25wbnBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYyBiL3NvdW5kL2lzYS9vcHRpOXh4L21pcm8uYwppbmRleCBlNmJmY2Y3Li4yODM4MTdmIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evb3B0aTl4eC9taXJvLmMKKysrIGIvc291bmQvaXNhL29wdGk5eHgvbWlyby5jCkBAIC05NjcsNyArOTY3LDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcobWlyby0+Y2FyZCwgIm1pcm8iLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIG1pcm8sIDEwMjQsIHNuZF9taXJvX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgbWlybywgc25kX21pcm9fcHJvY19yZWFkKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMgYi9zb3VuZC9pc2Evc2IvZW11ODAwMC5jCmluZGV4IGMwYjhkNjEuLjY1ODE3OWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwLmMKKysrIGIvc291bmQvaXNhL3NiL2VtdTgwMDAuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAKIC8qCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19kZXZpbml0CiBzbmRfZW11ODAwMF9yZWFkX3dhaXQoc3RydWN0IHNuZF9lbXU4MDAwICplbXUpCiB7CiAJd2hpbGUgKChFTVU4MDAwX1NNQUxSX1JFQUQoZW11KSAmIDB4ODAwMDAwMDApICE9IDApIHsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCiAvKgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAogc25kX2VtdTgwMDBfd3JpdGVfd2FpdChzdHJ1Y3Qgc25kX2VtdTgwMDAgKmVtdSkKIHsKIAl3aGlsZSAoKEVNVTgwMDBfU01BTFdfUkVBRChlbXUpICYgMHg4MDAwMDAwMCkgIT0gMCkgewpAQCAtMTU2LDcgKzE1Niw3IEBACiAvKgogICogZGV0ZWN0IGEgY2FyZCBhdCB0aGUgZ2l2ZW4gcG9ydAogICovCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHNuZF9lbXU4MDAwX2RldGVjdChzdHJ1Y3Qgc25kX2VtdTgwMDAgKmVtdSkKIHsKIAkvKiBJbml0aWFsaXNlICovCkBAIC0xODIsNyArMTgyLDcgQEAKIC8qCiAgKiBpbnRpYWlsaXplIGF1ZGlvIGNoYW5uZWxzCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19kZXZpbml0CiBpbml0X2F1ZGlvKHN0cnVjdCBzbmRfZW11ODAwMCAqZW11KQogewogCWludCBjaDsKQEAgLTIyMyw3ICsyMjMsNyBAQAogLyoKICAqIGluaXRpYWxpemUgRE1BIGFkZHJlc3MKICAqLwotc3RhdGljIHZvaWQgX19pbml0CitzdGF0aWMgdm9pZCBfX2RldmluaXQKIGluaXRfZG1hKHN0cnVjdCBzbmRfZW11ODAwMCAqZW11KQogewogCUVNVTgwMDBfU01BTFJfV1JJVEUoZW11LCAwKTsKQEAgLTMyNyw3ICszMjcsNyBAQAogICogVGFrZW4gZnJvbSB0aGUgb3NzIGRyaXZlciwgbm90IG9idmlvdXMgZnJvbSB0aGUgZG9jIGhvdyB0aGlzCiAgKiBpcyBtZWFudCB0byB3b3JrCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19kZXZpbml0CiBzZW5kX2FycmF5KHN0cnVjdCBzbmRfZW11ODAwMCAqZW11LCB1bnNpZ25lZCBzaG9ydCAqZGF0YSwgaW50IHNpemUpCiB7CiAJaW50IGk7CkBAIC0zNDksNyArMzQ5LDcgQEAKICAqIFNlbmQgaW5pdGlhbGl6YXRpb24gYXJyYXlzIHRvIHN0YXJ0IHVwLCB0aGlzIGp1c3QgZm9sbG93cyB0aGUKICAqIGluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIGluIHRoZSBhZGlwLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdAogaW5pdF9hcnJheXMoc3RydWN0IHNuZF9lbXU4MDAwICplbXUpCiB7CiAJc2VuZF9hcnJheShlbXUsIGluaXQxLCBBUlJBWV9TSVpFKGluaXQxKS80KTsKQEAgLTM3NSw3ICszNzUsNyBAQAogICogc2VlbXMgdGhhdCB0aGUgb25seSB3YXkgdG8gZG8gdGhpcyBpcyB0byB1c2UgdGhlIG9uZSBjaGFubmVsIGFuZCBrZWVwCiAgKiByZWFsbG9jYXRpbmcgYmV0d2VlbiByZWFkIGFuZCB3cml0ZS4KICAqLwotc3RhdGljIHZvaWQgX19pbml0CitzdGF0aWMgdm9pZCBfX2RldmluaXQKIHNpemVfZHJhbShzdHJ1Y3Qgc25kX2VtdTgwMDAgKmVtdSkKIHsKIAlpbnQgaSwgc2l6ZTsKQEAgLTUwMCw3ICs1MDAsNyBAQAogLyoKICAqIFRoZSBtYWluIGluaXRpYWxpemF0aW9uIHJvdXRpbmUuCiAgKi8KLXN0YXRpYyB2b2lkIF9faW5pdAorc3RhdGljIHZvaWQgX19kZXZpbml0CiBzbmRfZW11ODAwMF9pbml0X2h3KHN0cnVjdCBzbmRfZW11ODAwMCAqZW11KQogewogCWludCBpOwpAQCAtMTAxOSw3ICsxMDE5LDcgQEAKIC8qCiAgKiBjcmVhdGUgYW5kIGF0dGFjaCBtaXhlciBlbGVtZW50cyBmb3IgV2F2ZVRhYmxlIHRyZWJsZS9iYXNzIGNvbnRyb2xzCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0CitzdGF0aWMgaW50IF9fZGV2aW5pdAogc25kX2VtdTgwMDBfY3JlYXRlX21peGVyKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IHNuZF9lbXU4MDAwICplbXUpCiB7CiAJaW50IGksIGVyciA9IDA7CkBAIC0xMDY5LDcgKzEwNjksNyBAQAogLyoKICAqIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGVtdTgwMDAgc3ludGggZGV2aWNlLgogICovCi1pbnQgX19pbml0CitpbnQgX19kZXZpbml0CiBzbmRfZW11ODAwMF9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgaW5kZXgsIGxvbmcgcG9ydCwgaW50IHNlcV9wb3J0cywKIAkJc3RydWN0IHNuZF9zZXFfZGV2aWNlICoqYXdlX3JldCkKIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3BhdGNoLmMgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9wYXRjaC5jCmluZGV4IDgwYjFjZjguLjFiZTE2YzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3BhdGNoLmMKKysrIGIvc291bmQvaXNhL3NiL2VtdTgwMDBfcGF0Y2guYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAotc3RhdGljIGludCBlbXU4MDAwX3Jlc2V0X2FkZHIgPSAwOworc3RhdGljIGludCBlbXU4MDAwX3Jlc2V0X2FkZHI7CiBtb2R1bGVfcGFyYW0oZW11ODAwMF9yZXNldF9hZGRyLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhlbXU4MDAwX3Jlc2V0X2FkZHIsICJyZXNldCB3cml0ZSBhZGRyZXNzIGF0IGVhY2ggdGltZSAobWFrZXMgc2xvd2Rvd24pIik7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjE2LmMgYi9zb3VuZC9pc2Evc2Ivc2IxNi5jCmluZGV4IDYzMzNmOTAuLjdmN2YwNWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS9zYi9zYjE2LmMKKysrIGIvc291bmQvaXNhL3NiL3NiMTYuYwpAQCAtODUsNyArODUsNyBAQAogc3RhdGljIGludCBkbWExNltTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJLyogNSw2LDcgKi8KIHN0YXRpYyBpbnQgbWljX2FnY1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDF9OwogI2lmZGVmIENPTkZJR19TTkRfU0IxNl9DU1AKLXN0YXRpYyBpbnQgY3NwW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07CitzdGF0aWMgaW50IGNzcFtTTkRSVl9DQVJEU107CiAjZW5kaWYKICNpZmRlZiBTTkRSVl9TQkFXRV9FTVU4MDAwCiBzdGF0aWMgaW50IHNlcV9wb3J0c1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDR9OwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL3NiMTZfY3NwLmMgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwppbmRleCA5NzAzYzY4Li5mY2Q2MzgwIDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYworKysgYi9zb3VuZC9pc2Evc2Ivc2IxNl9jc3AuYwpAQCAtMTEwMSw3ICsxMTAxLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCXNwcmludGYobmFtZSwgImNzcEQlZCIsIGRldmljZSk7CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcocC0+Y2hpcC0+Y2FyZCwgbmFtZSwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBwLCAxMDI0LCBpbmZvX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHAsIGluZm9fcmVhZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zYi9zYjhfbWlkaS5jIGIvc291bmQvaXNhL3NiL3NiOF9taWRpLmMKaW5kZXggYzU0OWFjZS4uMGI2N2VkZCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL3NiOF9taWRpLmMKKysrIGIvc291bmQvaXNhL3NiL3NiOF9taWRpLmMKQEAgLTMyLDIwICszMiwyMiBAQAogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9zYi5oPgogCi0vKgogCi0gKi8KLQotaXJxcmV0dXJuX3Qgc25kX3NiOGRzcF9taWRpX2ludGVycnVwdChzdHJ1Y3Qgc25kX3NiICogY2hpcCkKK2lycXJldHVybl90IHNuZF9zYjhkc3BfbWlkaV9pbnRlcnJ1cHQoc3RydWN0IHNuZF9zYiAqY2hpcCkKIHsKIAlzdHJ1Y3Qgc25kX3Jhd21pZGkgKnJtaWRpOwogCWludCBtYXggPSA2NDsKIAljaGFyIGJ5dGU7CiAKLQlpZiAoY2hpcCA9PSBOVUxMIHx8IChybWlkaSA9IGNoaXAtPnJtaWRpKSA9PSBOVUxMKSB7CisJaWYgKCFjaGlwKQorCQlyZXR1cm4gSVJRX05PTkU7CisJCisJcm1pZGkgPSBjaGlwLT5ybWlkaTsKKwlpZiAoIXJtaWRpKSB7CiAJCWluYihTQlAoY2hpcCwgREFUQV9BVkFJTCkpOwkvKiBhY2sgaW50ZXJydXB0ICovCiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CisKIAlzcGluX2xvY2soJmNoaXAtPm1pZGlfaW5wdXRfbG9jayk7CiAJd2hpbGUgKG1heC0tID4gMCkgewogCQlpZiAoaW5iKFNCUChjaGlwLCBEQVRBX0FWQUlMKSkgJiAweDgwKSB7CkBAIC01OSwxMCArNjEsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyoKLQotICovCi0KIHN0YXRpYyBpbnQgc25kX3NiOGRzcF9taWRpX2lucHV0X29wZW4oc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNTIsMTAgKzI1MCw2IEBACiAJCXNuZF9zYjhkc3BfbWlkaV9vdXRwdXRfd3JpdGUoc3Vic3RyZWFtKTsKIH0KIAotLyoKLQotICovCi0KIHN0YXRpYyBzdHJ1Y3Qgc25kX3Jhd21pZGlfb3BzIHNuZF9zYjhkc3BfbWlkaV9vdXRwdXQgPQogewogCS5vcGVuID0JCXNuZF9zYjhkc3BfbWlkaV9vdXRwdXRfb3BlbiwKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS9zc2NhcGUuYyBiL3NvdW5kL2lzYS9zc2NhcGUuYwppbmRleCBkMmE4NTZmLi4yNzI3MWM5IDEwMDY0NAotLS0gYS9zb3VuZC9pc2Evc3NjYXBlLmMKKysrIGIvc291bmQvaXNhL3NzY2FwZS5jCkBAIC04OTcsMTAgKzg5Nyw5IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpyYXdtaWRpOwogCWludCBlcnI7CiAKLSNkZWZpbmUgTVBVNDAxX1NIQVJFX0hBUkRXQVJFICAxCiAJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIGRldm51bSwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBVNDAxX0hXX01QVTQwMSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgTVBVNDAxX1NIQVJFX0hBUkRXQVJFLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAogCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcnEsIFNBX0lOVEVSUlVQVCwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJhd21pZGkpKSA9PSAwKSB7CiAJCXN0cnVjdCBzbmRfbXB1NDAxICptcHUgPSAoc3RydWN0IHNuZF9tcHU0MDEgKikgcmF3bWlkaS0+cHJpdmF0ZV9kYXRhOwpkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYyBiL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250LmMKaW5kZXggN2FlODZmOC4uOWViMjcwOCAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnQuYworKysgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udC5jCkBAIC01MCw3ICs1MCw3IEBACiBzdGF0aWMgbG9uZyBmbV9wb3J0W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfUE9SVDsJICAgIC8qIFBuUCBzZXR1cCAqLwogc3RhdGljIGludCBkbWExW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRE1BOwkgICAgLyogMCwxLDMsNSw2LDcgKi8KIHN0YXRpYyBpbnQgZG1hMltTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0RNQTsJICAgIC8qIDAsMSwzLDUsNiw3ICovCi1zdGF0aWMgaW50IHVzZV9jczQyMzJfbWlkaVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OyAKK3N0YXRpYyBpbnQgdXNlX2NzNDIzMl9taWRpW1NORFJWX0NBUkRTXTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBXYXZlRnJvbnQgc291bmRjYXJkLiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL0tjb25maWcgYi9zb3VuZC9vc3MvS2NvbmZpZwppbmRleCAwODBhYjAzLi45NTc1NGUyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvS2NvbmZpZworKysgYi9zb3VuZC9vc3MvS2NvbmZpZwpAQCAtMTE0LDggKzExNCw5IEBACiAJICB3aXRoIHRoZSBBQzk3IGNvZGVjLgogCiBjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKLQl0cmlzdGF0ZSAiQXUxNTUwIEFDOTcgU291bmQiCi0JZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT0NfQVUxNTUwCisJdHJpc3RhdGUgIkF1MTU1MC9BdTEyMDAgQUM5NyBTb3VuZCIKKwlzZWxlY3QgU05EX0FDOTdfQ09ERUMKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIChTT0NfQVUxNTUwIHx8IFNPQ19BVTEyMDApCiAKIGNvbmZpZyBTT1VORF9UUklERU5UCiAJdHJpc3RhdGUgIlRyaWRlbnQgNERXYXZlIERYL05YLCBTaVMgNzAxOCBvciBBTGkgNTQ1MSBQQ0kgQXVkaW8gQ29yZSIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKaW5kZXggYzExNjhmYS4uNGNkYjg2MiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKKysrIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKQEAgLTU3LDkgKzU3LDkgQEAKICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfcHNjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MXh4eF9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHguaD4KIAogI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUwogCkBAIC0yMTMsNyArMjEzLDggQEAKIAl9CiAJaWYgKGkgPT0gUE9MTF9DT1VOVCkgewogCQllcnIoInJkY29kZWM6IHJlYWQgcG9sbCBleHBpcmVkISIpOwotCQlyZXR1cm4gMDsKKwkJZGF0YSA9IDA7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIHdhaXQgZm9yIGNvbW1hbmQgZG9uZT8KQEAgLTIyNiw3ICsyMjcsOCBAQAogCX0KIAlpZiAoaSA9PSBQT0xMX0NPVU5UKSB7CiAJCWVycigicmRjb2RlYzogcmVhZCBjbWR3YWl0IGV4cGlyZWQhIik7Ci0JCXJldHVybiAwOworCQlkYXRhID0gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJZGF0YSA9IGF1X3JlYWRsKFBTQ19BQzk3Q0RDKSAmIDB4ZmZmZjsKQEAgLTIzNyw2ICsyMzksNyBAQAogCWF1X3dyaXRlbChQU0NfQUM5N0VWTlRfQ0QsIFBTQ19BQzk3RVZOVCk7CiAJYXVfc3luYygpOwogCisgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiBkYXRhOwpAQCAtMTg5Miw2ICsxODk1LDggQEAKIAogTU9EVUxFX0FVVEhPUigiQWR2YW5jZWQgTWljcm8gRGV2aWNlcyAoQU1EKSwgZGFuQGVtYmVkZGVkZWRnZS5jb20iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQXUxNTUwIEFDOTcgQXVkaW8gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKIAogc3RhdGljIGludCBfX2RldmluaXQKIGF1MTU1MF9wcm9iZSh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eC5jIGIvc291bmQvb3NzL2NzNDZ4eC5jCmluZGV4IDUzODgxYmMuLjk5NGM3MWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9jczQ2eHguYworKysgYi9zb3VuZC9vc3MvY3M0Nnh4LmMKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICogdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBvbiBhbnkgcmVsZWFzZWQgZHJpdmVyLgogICovCiAjaWYgQ1NERUJVRwotI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSBpZigoY3NfZGVidWdsZXZlbCA+PSAobGV2ZWwpKSAmJiAoKG1hc2spICYgY3NfZGVidWdtYXNrKSkge3g7fSAKKyNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYgKChjc19kZWJ1Z2xldmVsID49IChsZXZlbCkpICYmICgobWFzaykgJiBjc19kZWJ1Z21hc2spKSB7eDt9CiAjZWxzZQogI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSAKICNlbmRpZgpAQCAtMTc1LDE5ICsxNzUsMTkgQEAKICNkZWZpbmUgQ1NfSU9DVExfQ01EX1JFU1VNRQkweDIJLy8gcmVzdW1lCiAKICNpZiBDU0RFQlVHCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsPTE7CQkJLyogbGV2ZWxzIHJhbmdlIGZyb20gMS05ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsID0gMTsJCQkvKiBsZXZlbHMgcmFuZ2UgZnJvbSAxLTkgKi8KIG1vZHVsZV9wYXJhbShjc19kZWJ1Z2xldmVsLCB1bG9uZywgMDY0NCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z21hc2s9Q1NfSU5JVCB8IENTX0VSUk9SOwkvKiB1c2UgQ1NfREJHT1VUIHdpdGggdmFyaW91cyBtYXNrIHZhbHVlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NfZGVidWdtYXNrID0gQ1NfSU5JVCB8IENTX0VSUk9SOwkvKiB1c2UgQ1NfREJHT1VUIHdpdGggdmFyaW91cyBtYXNrIHZhbHVlcyAqLwogbW9kdWxlX3BhcmFtKGNzX2RlYnVnbWFzaywgdWxvbmcsIDA2NDQpOwogI2VuZGlmCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBoZXJjdWxlc19lZ3Bpb19kaXNhYmxlOyAgLyogaWYgbm9uLXplcm8gc2V0IGFsbCBFR1BJTyB0byAwICovCiBtb2R1bGVfcGFyYW0oaGVyY3VsZXNfZWdwaW9fZGlzYWJsZSwgdWxvbmcsIDApOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5pdGRlbGF5PTcwMDsgIC8qIFBNIGRlbGF5IGluIG1pbGxpc2VjcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5pdGRlbGF5ID0gNzAwOyAgLyogUE0gZGVsYXkgaW4gbWlsbGlzZWNzICovCiBtb2R1bGVfcGFyYW0oaW5pdGRlbGF5LCB1bG9uZywgMCk7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcmRvd249LTE7ICAvKiB0dXJuIG9uL29mZiBwb3dlcmRvd24gcHJvY2Vzc2luZyBpbiBkcml2ZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyZG93biA9IC0xOyAgLyogdHVybiBvbi9vZmYgcG93ZXJkb3duIHByb2Nlc3NpbmcgaW4gZHJpdmVyICovCiBtb2R1bGVfcGFyYW0ocG93ZXJkb3duLCB1bG9uZywgMCk7CiAjZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgMwotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVmYXVsdG9yZGVyPURNQUJVRl9ERUZBVUxUT1JERVI7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOwogbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOwogCiBzdGF0aWMgaW50IGV4dGVybmFsX2FtcDsKQEAgLTIwMCw4ICsyMDAsOCBAQAogKiBwb3dlcmRvd24uIGFsc28gc2V0IHRoaW5rcGFkIHRvIDEgdG8gZGlzYWJsZSBwb3dlcmRvd24sIAogKiBidXQgYWxzbyB0byBlbmFibGUgdGhlIGNsa3J1biBmdW5jdGlvbmFsaXR5LgogKi8KLXN0YXRpYyB1bnNpZ25lZCBjc19wb3dlcmRvd249MTsKLXN0YXRpYyB1bnNpZ25lZCBjc19sYXB0b3Bfd2FpdD0xOworc3RhdGljIHVuc2lnbmVkIGNzX3Bvd2VyZG93biA9IDE7CitzdGF0aWMgdW5zaWduZWQgY3NfbGFwdG9wX3dhaXQgPSAxOwogCiAvKiBBbiBpbnN0YW5jZSBvZiB0aGUgNDYxMCBjaGFubmVsICovCiBzdHJ1Y3QgY3NfY2hhbm5lbCAKQEAgLTMxOSw3ICszMTksNyBAQAogCWF0b21pY190IG1peGVyX3VzZV9jbnQ7CiAKIAkvKiBQQ0kgZGV2aWNlIHN0dWZmICovCi0Jc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCXVuc2lnbmVkIGludCBwY3RsLCBjY3RsOwkvKiBIYXJkd2FyZSBETUEgZmxhZyBzZXRzICovCkBAIC0zODQsNyArMzg0LDcgQEAKIHN0YXRpYyBpbnQgY3Nfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogc3RhdGljIGludCBjc19yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKLQkJCQl1bnNpZ25lZCBsb25nIGFyZyk7CisJCQl1bnNpZ25lZCBsb25nIGFyZyk7CiBzdGF0aWMgaW50IGNzX2hhcmR3YXJlX2luaXQoc3RydWN0IGNzX2NhcmQgKmNhcmQpOwogc3RhdGljIGludCBjczQ2eHhfcG93ZXJ1cChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IHR5cGUpOwogc3RhdGljIGludCBjczQ2MXhfcG93ZXJkb3duKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50IHN1c3BlbmRmbGFnKTsKQEAgLTQyMyw4ICs0MjMsNyBAQAogICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9WT0xVTUVdICA9IDkgICAgLyogTWFzdGVyIFZvbHVtZSAqLwogICAgICAgICB9OwogICAgICAgICAKLSAgICBzd2l0Y2goeCkgCi0gICAgeworICAgIHN3aXRjaCAoeCkgewogCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKIAkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6ICIpICk7CiAJCWJyZWFrOwpAQCAtNTIxLDcgKzUyMCw2IEBACiAgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgogCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfRklMVEVSOiAiKSApOwogCQlicmVhazsKLQogICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUxOgogCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTE6ICIpICk7CiAJCWJyZWFrOwpAQCAtNTQzLDEwICs1NDEsOCBAQAogICAgICAgICBjYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgogCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86ICIpICk7CiAJCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJc3dpdGNoIChfSU9DX05SKHgpKSAKLQkJeworCQlzd2l0Y2ggKF9JT0NfTlIoeCkpIHsKIAkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgogCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6ICIpICk7CiAJCQkJYnJlYWs7CkBAIC01NzksMTQgKzU3NSwxMSBAQAogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlpID0gX0lPQ19OUih4KTsKLQkJCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKLQkJCQl7CisJCQkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKIAkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZCAiLHgsaSkgKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKKwkJCQl9IGVsc2UgewogCQkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfSU9DVEwgQUM5eDogMHglLjh4IE5SPSVkICIsCi0JCQkJCQkJeCxpKSApOworCQkJCQkJCXgsaSkpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJfQpAQCAtNjAxLDIyICs1OTQsMjIgQEAKIAogc3RhdGljIHZvaWQgY3M0NjF4X3Bva2Uoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKIHsKLQl3cml0ZWwodmFsLCBjb2RlYy0+YmExLmlkeFsocmVnID4+IDE2KSAmIDNdKyhyZWcmMHhmZmZmKSk7CisJd3JpdGVsKHZhbCwgY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSArIChyZWcgJiAweGZmZmYpKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBjczQ2MXhfcGVlayhzdHJ1Y3QgY3NfY2FyZCAqY29kZWMsIHVuc2lnbmVkIGxvbmcgcmVnKQogewotCXJldHVybiByZWFkbChjb2RlYy0+YmExLmlkeFsocmVnID4+IDE2KSAmIDNdKyhyZWcmMHhmZmZmKSk7CisJcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10gKyAocmVnICYgMHhmZmZmKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNzNDYxeF9wb2tlQkEwKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0Jd3JpdGVsKHZhbCwgY29kZWMtPmJhMCtyZWcpOworCXdyaXRlbCh2YWwsIGNvZGVjLT5iYTAgKyByZWcpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrQkEwKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcpCiB7Ci0JcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTArcmVnKTsKKwlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMCArIHJlZyk7CiB9CiAKIApAQCAtNjI1LDI2ICs2MTgsMjYgQEAKIAogc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKIHsKLQlpZihjYXJkLT5jaGFubmVsWzFdLnVzZWQ9PTEpCisJaWYgKGNhcmQtPmNoYW5uZWxbMV0udXNlZCA9PSAxKQogCQlyZXR1cm4gTlVMTDsKLQljYXJkLT5jaGFubmVsWzFdLnVzZWQ9MTsKLQljYXJkLT5jaGFubmVsWzFdLm51bT0xOworCWNhcmQtPmNoYW5uZWxbMV0udXNlZCA9IDE7CisJY2FyZC0+Y2hhbm5lbFsxXS5udW0gPSAxOwogCXJldHVybiAmY2FyZC0+Y2hhbm5lbFsxXTsKIH0KIAogc3RhdGljIHN0cnVjdCBjc19jaGFubmVsICpjc19hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQpCiB7Ci0JaWYoY2FyZC0+Y2hhbm5lbFswXS51c2VkPT0xKQorCWlmIChjYXJkLT5jaGFubmVsWzBdLnVzZWQgPT0gMSkKIAkJcmV0dXJuIE5VTEw7Ci0JY2FyZC0+Y2hhbm5lbFswXS51c2VkPTE7Ci0JY2FyZC0+Y2hhbm5lbFswXS5udW09MDsKKwljYXJkLT5jaGFubmVsWzBdLnVzZWQgPSAxOworCWNhcmQtPmNoYW5uZWxbMF0ubnVtID0gMDsKIAlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07CiB9CiAKIHN0YXRpYyB2b2lkIGNzX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFubmVsKQogewogCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0uc3RhdGUgPSBOVUxMOwotCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZD0wOworCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZCA9IDA7CiB9CiAKIC8qCkBAIC02NTUsMTUgKzY0OCwxNSBAQAogICovCiBzdGF0aWMgdm9pZCBjc19zZXRfZGl2aXNvcihzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCiB7Ci0JaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCWlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpCiAJCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7Ci0JZWxzZSBpZiggIShkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIAorCWVsc2UgaWYgKCEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJgogCSAgICAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQogCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYoIChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIAorCWVsc2UgaWYgKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmCiAJICAgICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpKQogCQlkbWFidWYtPmRpdmlzb3IgPSAyOwotCWVsc2UgaWYoICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAKKwllbHNlIGlmICghKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgJiYKIAkgICAgIShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCiAJCWRtYWJ1Zi0+ZGl2aXNvciA9IDQ7CiAJZWxzZQpAQCAtNjgwLDEzICs2NzMsMTIgQEAKICovCiBzdGF0aWMgdm9pZCBjc19tdXRlKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgc3RhdGUpIAogewotCXN0cnVjdCBhYzk3X2NvZGVjICpkZXY9Y2FyZC0+YWM5N19jb2RlY1swXTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2ID0gY2FyZC0+YWM5N19jb2RlY1swXTsKIAogCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19tdXRlKCkrICVzXG4iLAotCQkoc3RhdGUgPT0gQ1NfVFJVRSkgPyAiTXV0aW5nIiA6ICJVbk11dGluZyIpICk7CisJCShzdGF0ZSA9PSBDU19UUlVFKSA/ICJNdXRpbmciIDogIlVuTXV0aW5nIikpOwogCi0JaWYoc3RhdGUgPT0gQ1NfVFJVRSkKLQl7CisJaWYgKHN0YXRlID09IENTX1RSVUUpIHsKIAkvKgogCSogZml4IHBvcHMgd2hlbiBwb3dlcmluZyB1cCBvbiB0aGlua3BhZHMKIAkqLwpAQCAtNzAzLDkgKzY5NSw3IEBACiAJCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIDB4ODAwMCk7CiAJCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgMHg4MDAwKTsKIAkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKIAkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lKTsKIAkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyk7CkBAIC03NTcsNyArNzQ3LDYgQEAKIAkvKgogCSAqICBGaWxsIGluIHRoZSBTYW1wbGVSYXRlQ29udmVydGVyIGNvbnRyb2wgYmxvY2suCiAJICovCi0JIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUFNSQywKIAkgICgoY29ycmVjdGlvblBlclNlYyA8PCAxNikgJiAweEZGRkYwMDAwKSB8IChjb3JyZWN0aW9uUGVyR09GICYgMHhGRkZGKSk7CkBAIC03NzAsNyArNzU5LDcgQEAKIH0KIAogLyogc2V0IHJlY29yZGluZyBzYW1wbGUgcmF0ZSAqLwotc3RhdGljIHVuc2lnbmVkIGludCBjc19zZXRfYWRjX3JhdGUoc3RydWN0IGNzX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQorc3RhdGljIHVuc2lnbmVkIGludCBjc19zZXRfYWRjX3JhdGUoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCiB7CiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKQEAgLTgxNSw3ICs4MDQsNiBAQAogCSAqIAkgICAgZGl2aWRlbmQ6cmVtYWluZGVyKHVsT3RoZXIgLyBHT0ZfUEVSX1NFQykKIAkgKiAgICAgaW5pdGlhbERlbGF5ID0gZGl2aWRlbmQoKCgyNCAqIEZzLGluKSArIEZzLG91dCAtIDEpIC8gRnMsb3V0KQogCSAqLwotCiAJdG1wMSA9IHJhdGUgPDwgMTY7CiAJY29lZmZJbmNyID0gdG1wMSAvIDQ4MDAwOwogCXRtcDEgLT0gY29lZmZJbmNyICogNDgwMDA7CkBAIC04OTEsNyArODc5LDcgQEAKIAogCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKStcbiIpICk7CiAgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QVk9MLCAweDgwMDA4MDAwKTsKLSAgICAgICAgaWYoIWRtYWJ1Zi0+U0dvaykKKyAgICAgICAgaWYgKCFkbWFidWYtPlNHb2spCiAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEJBLCB2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpKTsKICAgICAKICAgICAgICAgQ291bnQgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTg5OSwxNiArODg3LDE0IEBACiAgICAgICAgIGlmICgoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgcGxheUZvcm1hdCAmPSB+RE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgQ291bnQgKj0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfihETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBwbGF5Rm9ybWF0IHw9IChETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUKTsgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTkxOSw3ICs5MDUsNiBAQAogICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUERUQywgdG1wIHwgLS1Db3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAogCiAJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpLVxuIikgKTsKLQogfQogCiBzdGF0aWMgc3RydWN0IEluaXRTdHJ1Y3QKQEAgLTk0NCw4ICs5MjksNyBAQAogewogCXVuc2lnbmVkIGksIG9mZnNldDsKIAlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50aygiY3M0Nnh4OiBTZXRDYXB0dXJlU1BWYWx1ZXMoKStcbiIpICk7Ci0JZm9yKGk9MDsgaTxzaXplb2YoSW5pdEFycmF5KS9zaXplb2Yoc3RydWN0IEluaXRTdHJ1Y3QpOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoSW5pdEFycmF5KSAvIHNpemVvZihzdHJ1Y3QgSW5pdFN0cnVjdCk7IGkrKykgewogCQlvZmZzZXQgPSBJbml0QXJyYXlbaV0ub2ZmKjQ7IC8qIDhiaXQgdG8gMzJiaXQgb2Zmc2V0IHZhbHVlICovCiAJCWNzNDYxeF9wb2tlKGNhcmQsIG9mZnNldCwgSW5pdEFycmF5W2ldLnZhbCApOwogCX0KQEAgLTk1Nyw4ICs5NDEsOCBAQAogewogCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCkrXG4iKSApOwogCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVjX3NldHVwKCkrXG4iKSk7CiAJU2V0Q2FwdHVyZVNQVmFsdWVzKGNhcmQpOwogCiAJLyoKQEAgLTk5NCwxNCArOTc4LDExIEBACiAJLyoKIAkgKiBncmFudWxhcml0eSBpcyBieXRlIGJvdW5kYXJ5LCBnb29kIHBhcnQuCiAJICovCi0JaWYoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKLQl7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCiAJCW9mZnNldCA9IGNzNDYxeF9wZWVrKHN0YXRlLT5jYXJkLCBCQTFfUEJBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JfQogCWVsc2UgLyogQURDX1JVTk5JTkcgbXVzdCBiZSBzZXQgKi8KLQl7CiAJCW9mZnNldCA9IGNzNDYxeF9wZWVrKHN0YXRlLT5jYXJkLCBCQTFfQ0JBKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JfQorCiAJQ1NfREJHT1VUKENTX1BBUk1TIHwgQ1NfRlVOQ1RJT04sIDksIAogCQlwcmludGsoImNzNDZ4eDogY3NfZ2V0X2RtYV9hZGRyKCkgJWRcbiIsb2Zmc2V0KSApOwogCW9mZnNldCA9ICh1MzIpYnVzX3RvX3ZpcnQoKHVuc2lnbmVkIGxvbmcpb2Zmc2V0KSAtICh1MzIpZG1hYnVmLT5yYXdidWY7CkBAIC0xMDE1LDggKzk5Niw3IEBACiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwogCQogCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHJlc3luY19kbWFfcHRycygpKyBcbiIpICk7Ci0JaWYoc3RhdGUpCi0JeworCWlmIChzdGF0ZSkgewogCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJZG1hYnVmLT5od3B0cj1kbWFidWYtPnN3cHRyID0gMDsKIAkJZG1hYnVmLT5wcmluZ2J1ZiA9IDA7CkBAIC0xMTQ5LDEzICsxMTI5LDEzIEBACiAvKgogKiBjaGVjayBmb3Igb3JkZXIgd2l0aGluIGxpbWl0cywgYnV0IGRvIG5vdCBvdmVyd3JpdGUgdmFsdWUuCiAqLwotCWlmKChkZWZhdWx0b3JkZXIgPiAxKSAmJiAoZGVmYXVsdG9yZGVyIDwgMTIpKQorCWlmICgoZGVmYXVsdG9yZGVyID4gMSkgJiYgKGRlZmF1bHRvcmRlciA8IDEyKSkKIAkJZGYgPSBkZWZhdWx0b3JkZXI7CiAJZWxzZQogCQlkZiA9IDI7CQogCiAJZm9yIChvcmRlciA9IGRmOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCi0JCWlmICggKHJhd2J1ZiA9ICh2b2lkICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQlpZiAoKHJhd2J1ZiA9ICh2b2lkICopcGNpX2FsbG9jX2NvbnNpc3RlbnQoCiAJCQljYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkbWFidWYtPmRtYWFkZHIpKSkKIAkJCSAgICBicmVhazsKIAlpZiAoIXJhd2J1ZikgewpAQCAtMTE4MSw4ICsxMTYxLDcgQEAKIC8qCiAqICBvbmx5IGFsbG9jYXRlIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciBmb3IgdGhlIEFEQwogKi8KLQlpZihkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpCi0JeworCWlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpIHsKIAkJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKIAkJZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gMDsKIAkJcmV0dXJuIDA7CkBAIC0xMjU4LDggKzEyMzcsNyBAQAogLyoKICAqIGNoZWNrIGZvciBDQVBUVVJFIGFuZCB1c2Ugb25seSBub24tc2cgZm9yIGluaXRpYWwgcmVsZWFzZQogICovCi0JaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfQURDKQotCXsKKwlpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfQURDKSB7CiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgQURDXG4iKSk7CiAJCS8qIAogCQkgKiBhZGQgaW4gbm9uLXNnIHN1cHBvcnQgZm9yIGNhcHR1cmUuCkBAIC0xMzEzLDkgKzEyOTEsNyBAQAogCiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCktIDAgXG4iKSk7CiAJCXJldHVybiAwOwotCX0KLQllbHNlIGlmIChkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9EQUMpCi0JeworCX0gZWxzZSBpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKSB7CiAJLyoKIAkgKiBNdXN0IGJlIERBQwogCSAqLwpAQCAtMTMzNyw4ICsxMzEzLDcgQEAKIAkJYWxsb2NhdGVkX3BhZ2VzID0gMSA8PCBkbWFidWYtPmJ1Zm9yZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJYWxsb2NhdGVkX2J5dGVzID0gYWxsb2NhdGVkX3BhZ2VzKlBBR0VfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCQkJCQkJCQkgICAgCi0JCWlmKGFsbG9jYXRlZF9wYWdlcyA8IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCXsKKwkJaWYgKGFsbG9jYXRlZF9wYWdlcyA8IDIpIHsKIAkJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKAogCQkJICAgICJjczQ2eHg6IHByb2dfZG1hYnVmKCkgRXJyb3I6IGFsbG9jYXRlZF9wYWdlcyB0b28gc21hbGwgKCVkKVxuIiwKIAkJCQkodW5zaWduZWQpYWxsb2NhdGVkX3BhZ2VzKSk7CkBAIC0xMzUzLDE0ICsxMzI4LDE0IEBACiAJCQkJCQkJCQkJICAgIAogCQkgICAgIC8qIFNldCB1cCBTL0cgdmFyaWFibGVzLiAqLwogCQkqcHRtcCA9IHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cmF3YnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkqKHB0bXArMSkgPSAweDAwMDAwMDA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQlmb3IodG1wMT0gMTsgdG1wMSA8IG5TR3BhZ2VzOyB0bXAxKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJKihwdG1wKzIqdG1wMSkgPSB2aXJ0X3RvX2J1cyggKGRtYWJ1Zi0+cmF3YnVmKSs0MDk2KnRtcDEpOyAgCi0JCQlpZiggdG1wMSA9PSBuU0dwYWdlcy0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJKihwdG1wICsgMSkgPSAweDAwMDAwMDA4OworCQlmb3IgKHRtcDEgPSAxOyB0bXAxIDwgblNHcGFnZXM7IHRtcDErKykgeworCQkJKihwdG1wICsgMiAqIHRtcDEpID0gdmlydF90b19idXMoKGRtYWJ1Zi0+cmF3YnVmKSArIDQwOTYgKiB0bXAxKTsKKwkJCWlmICh0bXAxID09IG5TR3BhZ2VzIC0gMSkKIAkJCQl0bXAyID0gMHhiZmZmMDAwMDsKIAkJCWVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCXRtcDIgPSAweDgwMDAwMDAwKzgqKHRtcDErMSk7ICAgICAgICAgICAgICAgICAgICAgICAKLQkJCSoocHRtcCsyKnRtcDErMSkgPSB0bXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCXRtcDIgPSAweDgwMDAwMDAwICsgOCAqICh0bXAxICsgMSk7CisJCQkqKHB0bXAgKyAyICogdG1wMSArIDEpID0gdG1wMjsKIAkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJU0dhcnJheVswXSA9IDB4ODJjMDIwMGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJU0dhcnJheVsxXSA9IDB4ZmZmZjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTEzNjgsMTggKzEzNDMsMTcgQEAKIAkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJU0dhcnJheVs0XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJU0dhcnJheVs1XSA9IDB4ODAwMDAwMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs2XSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs3XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJU0dhcnJheVs4XSA9ICh2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpICYgMHhmZmZmMDAwKSB8IDB4MTA7ICAgICAgICAKKwkJU0dhcnJheVs2XSA9ICpwdG1wOworCQlTR2FycmF5WzddID0gKihwdG1wKzIpOworCQlTR2FycmF5WzhdID0gKHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikgJiAweGZmZmYwMDApIHwgMHgxMDsKIAotCQlpZiAoZG1hYnVmLT5TR29rKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJZG1hYnVmLT5udW1mcmFnID0gblNHcGFnZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmZyYWdzaXplID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSA0MDk2ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07ICAgIAotCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcqNDA5NjsgICAgICAgICAgICAgICAgICAgICAKLQkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJaWYgKGRtYWJ1Zi0+U0dvaykgeworCQkJZG1hYnVmLT5udW1mcmFnID0gblNHcGFnZXM7CisJCQlkbWFidWYtPmZyYWdzaXplID0gNDA5NjsKKwkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSA0MDk2ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisJCQlkbWFidWYtPmZyYWdzaGlmdCA9IDEyOworCQkJZG1hYnVmLT5kbWFzaXplID0gZG1hYnVmLT5udW1mcmFnICogNDA5NjsKKwkJfSBlbHNlIHsKIAkJCVNHYXJyYXlbMF0gPSAweGYyYzAwMDBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQkJU0dhcnJheVsxXSA9IDB4MDAwMDAyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQlTR2FycmF5WzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKQEAgLTEzOTEsOCArMTM2NSw4IEBACiAJCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIAkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCQl9Ci0JCWZvcih0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KS80OyB0bXAxKyspICAgICAgICAgICAgICAgICAgICAgCi0JCQljczQ2MXhfcG9rZSggc3RhdGUtPmNhcmQsIEJBMV9QRFRDK3RtcDEqNCwgU0dhcnJheVt0bXAxXSk7ICAKKwkJZm9yICh0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KSAvIDQ7IHRtcDErKykKKwkJCWNzNDYxeF9wb2tlKHN0YXRlLT5jYXJkLCBCQTFfUERUQyt0bXAxICogNCwgU0dhcnJheVt0bXAxXSk7CiAKIAkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCiAJCSAgICAgICBkbWFidWYtPmRtYXNpemUpOwpAQCAtMTQxNiw5ICsxMzkwLDcgQEAKIAogCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBcbiIpKTsKIAkJcmV0dXJuIDA7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gSW52YWxpZCBUeXBlICVkXG4iLAogCQkJZG1hYnVmLT50eXBlKSk7CiAJfQpAQCAtMTQ4OSw4ICsxNDYxLDcgQEAKIAl9CiAJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOwogCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwotCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQl7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAtRVJFU1RBUlRTWVNcbiIpKTsKIAkJLyoKIAkJKiBzZXQgdG8gc2lsZW5jZSBhbmQgbGV0IHRoYXQgY2xlYXIgdGhlIGZpZm9zLgpAQCAtMTUxNCw4ICsxNDg1LDcgQEAKIAogCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLwogCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCWlmKHN0YXRlKQotCXsKKwlpZiAoc3RhdGUpIHsKIAkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CiAJCQkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLwpAQCAtMTUzMSwxMiArMTUwMSwxMCBAQAogCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCiAJCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKIAotCQkJaWYoZG1hYnVmLT5tYXBwZWQpCi0JCQl7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKIAkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKIAkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKLQkJCX0gZWxzZSAKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA+IDApCiAJCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CiAJCQl9CkBAIC0xNTQ3LDggKzE1MTUsNyBAQAogICogTm93IHRoZSBEQUMKICAqLwogCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmKHN0YXRlKQotCXsKKwlpZiAoc3RhdGUpIHsKIAkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIERBQyAqLwogCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgewpAQCAtMTU3MCw3ICsxNTM3LDcgQEAKIAkJCQkgKiBpbiB0aGF0LCBzaW5jZSBkbWFzaXplIGlzIHRoZSBidWZmZXIgYXNrZWQgZm9yCiAJCQkJICogdmlhIG1tYXAuCiAJCQkJICovCi0JCQkJaWYoIGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCisJCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCiAJCQkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5kbWFzaXplLTE7CiAJCQl9IGVsc2UgewogCQkJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKQEAgLTE1NzgsMTMgKzE1NDUsMTAgQEAKIAkJCQkgKiBiYWNrZmlsbCB3aXRoIHNpbGVuY2UgYW5kIGNsZWFyIG91dCB0aGUgbGFzdCAKIAkJCQkgKiAiZGlmZiIgbnVtYmVyIG9mIGJ5dGVzLgogCQkJCSAqLwotCQkJCWlmKGh3cHRyID49IGRpZmYpCi0JCQkJeworCQkJCWlmIChod3B0ciA+PSBkaWZmKSB7CiAJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIGh3cHRyIC0gZGlmZiwgCiAJCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIGRpZmYpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJeworCQkJCX0gZWxzZSB7CiAJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgCiAJCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCiAJCQkJCQkodW5zaWduZWQpaHdwdHIpOwpAQCAtMTYwMiwxMiArMTU2NiwxMiBAQAogCQkJCQkqIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgcmVzZXQgdGhlCiAJCQkJCSogY291bnQgb2YgYnl0ZXMgd3JpdHRlbiBiYWNrIHRvIDAuCiAJCQkJCSovCi0JCQkJCWlmKGRtYWJ1Zi0+Y291bnQgPCAwKQotCQkJCQkJZG1hYnVmLT51bmRlcnJ1bj0xOworCQkJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApCisJCQkJCQlkbWFidWYtPnVuZGVycnVuID0gMTsKIAkJCQkJZG1hYnVmLT5jb3VudCA9IDA7CiAJCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKIAkJCQl9Ci0JCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplLzIpCisJCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplIC8gMikKIAkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKIAkJCX0KIAkJfQpAQCAtMTY2MSw4ICsxNjI1LDcgQEAKIAogCXN0YXR1cyA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9ISVNSKTsKIAkKLQlpZiAoKHN0YXR1cyAmIDB4N2ZmZmZmZmYpID09IDApCi0JeworCWlmICgoc3RhdHVzICYgMHg3ZmZmZmZmZikgPT0gMCkgewogCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9DSEdNfEhJQ1JfSUVWKTsKIAkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CS8qIE1pZ2h0IGJlIElSUV9OT05FLi4gKi8KQEAgLTE2NzEsMTUgKzE2MzQsMTQgQEAKIAkvKgogCSAqIGNoZWNrIGZvciBwbGF5YmFjayBvciBjYXB0dXJlIGludGVycnVwdCBvbmx5CiAJICovCi0JaWYoICgoc3RhdHVzICYgSElTUl9WQzApICYmIHBsYXlzdGF0ZSAmJiBwbGF5c3RhdGUtPmRtYWJ1Zi5yZWFkeSkgfHwgCi0JICAgICgoKHN0YXR1cyAmIEhJU1JfVkMxKSAmJiByZWNzdGF0ZSAmJiByZWNzdGF0ZS0+ZG1hYnVmLnJlYWR5KSkgKQotCXsKKwlpZiAoKChzdGF0dXMgJiBISVNSX1ZDMCkgJiYgcGxheXN0YXRlICYmIHBsYXlzdGF0ZS0+ZG1hYnVmLnJlYWR5KSB8fAorCSAgICAoKChzdGF0dXMgJiBISVNSX1ZDMSkgJiYgcmVjc3RhdGUgJiYgcmVjc3RhdGUtPmRtYWJ1Zi5yZWFkeSkpKSB7CiAJCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDgsIHByaW50aygKIAkJCSJjczQ2eHg6IGNzX2ludGVycnVwdCgpIGludGVycnVwdCBiaXQocykgc2V0ICgweCV4KVxuIixzdGF0dXMpKTsKIAkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKIAl9CiAKLSAgICAgICAgaWYoIHN0YXR1cyAmIEhJU1JfTUlESSApCisgICAgICAgIGlmIChzdGF0dXMgJiBISVNSX01JREkpCiAgICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7CiAJCiAgCS8qIGNsZWFyICdlbSAqLwpAQCAtMTY5NCw3ICsxNjU2LDcgQEAKIAogc3RhdGljIHNzaXplX3QgY3NfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogICAgICAgICBzc2l6ZV90IHJldDsKICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICAgdW5zaWduZWQgcHRyOwpAQCAtMTczNyw3ICsxNjk5LDcgQEAKIAogc3RhdGljIHNzaXplX3QgY3NfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKICAgICAgICAgc3NpemVfdCByZXQ7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgIHVuc2lnbmVkIHB0cjsKQEAgLTE3ODUsNyArMTc0Nyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY3NfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCiB7Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKICAgICAgICAgdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCkBAIC0xODEwLDEyICsxNzcyLDExIEBACiBzdGF0aWMgaW50IGNzX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKICAgICAgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLSAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQ9TlVMTDsKKyAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwogICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwogCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQotCXsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKIAkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKIAkJaWYgKGNhcmQtPmRldl9taWRpID09IG1pbm9yKQogCQkJYnJlYWs7CkBAIC0xODIzLDggKzE3ODQsNyBAQAogCiAJaWYgKGVudHJ5ID09ICZjczQ2eHhfZGV2cykKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFjYXJkKQotCXsKKwlpZiAoIWNhcmQpIHsKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTwogCQkJImNzNDZ4eDogY3M0Nnh4X21pZGlfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGNhcmQgc3RydWN0XG4iKSk7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTg1MiwxMiArMTgxMiwxMCBAQAogICAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9NSURDUiwgMHgwMDAwMDAwZik7ICAgICAgICAgICAgLyogRW5hYmxlIHhtaXQsIHJjdi4gKi8KICAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9JRVYgfCBISUNSX0NIR00pOyAgIC8qIEVuYWJsZSBpbnRlcnJ1cHRzICovCiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCiAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IGNhcmQtPm1pZGkub3dyID0gY2FyZC0+bWlkaS5vY250ID0gMDsKLSAgICAgICAgfQogICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKICAgICAgICAgY2FyZC0+bWlkaS5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKTsKICAgICAgICAgbXV0ZXhfdW5sb2NrKCZjYXJkLT5taWRpLm9wZW5fbXV0ZXgpOwpAQCAtMTg2Nyw3ICsxODI1LDcgQEAKIAogc3RhdGljIGludCBjc19taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0gICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKICAgICAgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgICAgICAgIHVuc2lnbmVkIGNvdW50LCB0bW87CkBAIC0xOTMzLDExICsxODkxLDEwIEBACiBzdGF0aWMgdm9pZCBDb3B5U2FtcGxlcyhjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGNvdW50LCB1bnNpZ25lZCBmbXQsIAogCQlzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCiB7Ci0KICAgICBzMzIgczMyQXVkaW9TYW1wbGU7Ci0gICAgczE2ICpwc1NyYz0oczE2ICopc3JjOwotICAgIHMxNiAqcHNEc3Q9KHMxNiAqKWRzdDsKLSAgICB1OCAqcHVjRHN0PSh1OCAqKWRzdDsKKyAgICBzMTYgKnBzU3JjID0gKHMxNiAqKXNyYzsKKyAgICBzMTYgKnBzRHN0ID0gKHMxNiAqKWRzdDsKKyAgICB1OCAqcHVjRHN0ID0gKHU4ICopZHN0OwogCiAgICAgQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENvcHlTYW1wbGVzKCkrICIpICk7CiAgICAgQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgOCwgcHJpbnRrKEtFUk5fSU5GTwpAQCAtMTk0NywzNCArMTkwNCwyOSBAQAogICAgIC8qCiAgICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXMgOC1iaXQgdW5zaWduZWQgc3RlcmVvLgogICAgICAqLwotICAgIGlmKChmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAhKGZtdCAmIENTX0ZNVF8xNkJJVCkpCi0gICAgeworICAgIGlmICgoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgIShmbXQgJiBDU19GTVRfMTZCSVQpKSB7CiAgICAgICAgIC8qCiAgICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCiAJICogc3RlcmVvIHVzaW5nIHJvdW5kaW5nLgogICAgICAgICAgKi8KICAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOwotCWNvdW50ID0gY291bnQvMjsKLSAgICAgICAgd2hpbGUoY291bnQtLSkKLSAgICAgICAgeworCWNvdW50ID0gY291bnQgLyAyOworICAgICAgICB3aGlsZSAoY291bnQtLSkKICAgICAgICAgICAgICoocHVjRHN0KyspID0gKHU4KSgoKHMxNikoKnBzU3JjKyspICsgKHMxNikweDgwMDApID4+IDgpOwotICAgICAgICB9CiAgICAgfQogICAgIC8qCiAgICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgOC1iaXQgdW5zaWduZWQgbW9uby4KICAgICAgKi8KLSAgICBlbHNlIGlmKCEoZm10ICYgQ1NfRk1UX1NURVJFTykgJiYgIShmbXQgJiBDU19GTVRfMTZCSVQpKQotICAgIHsKKyAgICBlbHNlIGlmICghKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkgewogICAgICAgICAvKgogICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAogCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nIGFuZCByb3VuZGluZy4KICAgICAgICAgICovCiAgICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKLQljb3VudCA9IGNvdW50LzI7Ci0gICAgICAgIHdoaWxlKGNvdW50LS0pCi0gICAgICAgIHsKLQkgICAgczMyQXVkaW9TYW1wbGUgPSAoKCpwc1NyYykrKCoocHNTcmMgKyAxKSkpLzIgKyAoczMyKTB4ODA7Ci0JICAgIGlmKHMzMkF1ZGlvU2FtcGxlID4gMHg3ZmZmKQorCWNvdW50ID0gY291bnQgLyAyOworICAgICAgICB3aGlsZSAoY291bnQtLSkgeworCSAgICBzMzJBdWRpb1NhbXBsZSA9ICgoKnBzU3JjKSArICgqKHBzU3JjICsgMSkpKSAvIDIgKyAoczMyKTB4ODA7CisJICAgIGlmIChzMzJBdWRpb1NhbXBsZSA+IDB4N2ZmZikKIAkgICAgCXMzMkF1ZGlvU2FtcGxlID0gMHg3ZmZmOwogICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KXMzMkF1ZGlvU2FtcGxlICsgKHMxNikweDgwMDApID4+IDgpOwogCSAgICBwc1NyYyArPSAyOwpAQCAtMTk4MywxNyArMTkzNSwxNSBAQAogICAgIC8qCiAgICAgICogU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgMTYtYml0IHNpZ25lZCBtb25vLgogICAgICAqLwotICAgIGVsc2UgaWYoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAoZm10ICYgQ1NfRk1UXzE2QklUKSkKLSAgICB7CisgICAgZWxzZSBpZiAoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAoZm10ICYgQ1NfRk1UXzE2QklUKSkgewogICAgICAgICAvKgogICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDE2LWJpdCBzaWduZWQgCiAJICogbW9ubyB1c2luZyBhdmVyYWdpbmcuCiAgICAgICAgICAqLwogICAgICAgICBwc1NyYyA9IChzMTYgKilzcmM7Ci0JY291bnQgPSBjb3VudC8yOwotICAgICAgICB3aGlsZShjb3VudC0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqKHBzRHN0KyspID0gKHMxNikoKCpwc1NyYykrKCoocHNTcmMgKyAxKSkpLzI7CisJY291bnQgPSBjb3VudCAvIDI7CisgICAgICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgICAgICAqKHBzRHN0KyspID0gKHMxNikoKCpwc1NyYykgKyAoKihwc1NyYyArIDEpKSkgLyAyOwogCSAgICBwc1NyYyArPSAyOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAyMCwyMCArMTk3MCwxNSBAQAogCQkiY3NfY29weV90b191c2VyKCkrIGZtdD0weCV4IGNudD0lZCBkZXN0PSVwXG4iLAogCQlkbWFidWYtPmZtdCwodW5zaWduZWQpY250LGRlc3QpICk7CiAKLQlpZihjbnQgPiBkbWFidWYtPmRtYXNpemUpCi0JeworCWlmIChjbnQgPiBkbWFidWYtPmRtYXNpemUpCiAJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKLQl9Ci0JaWYoIWNudCkKLQl7CisJaWYgKCFjbnQpIHsKIAkJKmNvcGllZCA9IDA7CiAJCXJldHVybiAwOwogCX0KLQlpZihkbWFidWYtPmRpdmlzb3IgIT0gMSkKLQl7Ci0JCWlmKCFkbWFidWYtPnRtcGJ1ZmYpCi0JCXsKLQkJCSpjb3BpZWQgPSBjbnQvZG1hYnVmLT5kaXZpc29yOworCWlmIChkbWFidWYtPmRpdmlzb3IgIT0gMSkgeworCQlpZiAoIWRtYWJ1Zi0+dG1wYnVmZikgeworCQkJKmNvcGllZCA9IGNudCAvIGRtYWJ1Zi0+ZGl2aXNvcjsKIAkJCXJldHVybiAwOwogCQl9CiAKQEAgLTIwNDIsMTcgKzE5ODcsMTYgQEAKIAkJc3JjID0gZG1hYnVmLT50bXBidWZmOwogCQljbnQgPSBjbnQvZG1hYnVmLT5kaXZpc29yOwogCX0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihkZXN0LCBzcmMsIGNudCkpCi0JeworICAgICAgICBpZiAoY29weV90b191c2VyKGRlc3QsIHNyYywgY250KSkgewogCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0VSUiAKIAkJCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBmYXVsdCBkZXN0PSVwIHNyYz0lcCBjbnQ9JWRcbiIsCi0JCQkJZGVzdCxzcmMsY250KSApOworCQkJCWRlc3Qsc3JjLGNudCkpOwogCQkqY29waWVkID0gMDsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCSpjb3BpZWQgPSBjbnQ7CiAJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkiY3M0Nnh4OiBjc19jb3B5X3RvX3VzZXIoKS0gY29waWVkIGJ5dGVzIGlzICVkIFxuIixjbnQpICk7CisJCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBjb3BpZWQgYnl0ZXMgaXMgJWQgXG4iLGNudCkpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDYwLDcgKzIwMDQsNyBAQAogICAgdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KIHN0YXRpYyBzc2l6ZV90IGNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOwogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKQEAgLTIwNjgsMTIgKzIwMTIsMTIgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIHN3cHRyOwogCWludCBjbnQ7Ci0JdW5zaWduZWQgY29waWVkPTA7CisJdW5zaWduZWQgY29waWVkID0gMDsKIAogCUNTX0RCR09VVChDU19XQVZFX1JFQUQgfCBDU19GVU5DVElPTiwgNCwgCiAJCXByaW50aygiY3M0Nnh4OiBjc19yZWFkKCkrICV6ZFxuIixjb3VudCkgKTsKLQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JaWYoIXN0YXRlKQorCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCWlmICghc3RhdGUpCiAJCXJldHVybiAtRU5PREVWOwogCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCkBAIC0yMDg4LDExICsyMDMyLDExIEBACiAKIAlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CiAJd2hpbGUgKGNvdW50ID4gMCkgewotCQl3aGlsZSghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQotCQl7CisJCXdoaWxlICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKSB7CiAJCQlzY2hlZHVsZSgpOwogCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTIxMTIsMTkgKzIwNTYsMjAgQEAKIAkJCSAgIHJlY29yZGVkICovCiAJCQlzdGFydF9hZGMoc3RhdGUpOwogCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CiAJCQkJZ290byBvdXQ7CiAgCQkJfQogCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKIAkJCXNjaGVkdWxlKCk7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlpZighcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KIAkJCW11dGV4X2xvY2soJnN0YXRlLT5zZW0pOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSAKLQkJCXsKLQkJCQlpZighcmV0KQorCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CisJCQkJaWYgKCFyZXQpCiAJCQkJCXJldCA9IC1FTlhJTzsKIAkJCQlnb3RvIG91dDsKIAkJCX0KQEAgLTIxMzUsMTIgKzIwODAsMTIgQEAKIAkJCSJfcmVhZCgpIGNvcHlfdG8gY250PSVkIGNvdW50PSV6ZCAiLCBjbnQsY291bnQpICk7CiAJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8gCiAJCQkiIC5kbWFzaXplPSVkIC5jb3VudD0lZCBidWZmZXI9JXAgcmV0PSV6ZFxuIiwKLQkJCWRtYWJ1Zi0+ZG1hc2l6ZSxkbWFidWYtPmNvdW50LGJ1ZmZlcixyZXQpICk7CisJCQlkbWFidWYtPmRtYXNpemUsZG1hYnVmLT5jb3VudCxidWZmZXIscmV0KSk7CiAKICAgICAgICAgICAgICAgICBpZiAoY3NfY29weV90b191c2VyKHN0YXRlLCBidWZmZXIsIAotCQkJKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKQotCQl7Ci0JCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCShjaGFyICopZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250LCAmY29waWVkKSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CiAgICAgICAgICAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOwpAQCAtMjE2Nyw3ICsyMTEyLDcgQEAKICAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KIHN0YXRpYyBzc2l6ZV90IGNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CkBAIC0yMTc4LDE2ICsyMTIzLDE1IEBACiAKIAlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0ZVTkNUSU9OLCA0LAogCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICV6ZFxuIiwgY291bnQpICk7Ci0Jc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCWlmKCFzdGF0ZSkKKwlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwlpZiAoIXN0YXRlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCiAJCXJldHVybiAtRUZBVUxUOwogCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCiAJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JaWYgKGRtYWJ1Zi0+bWFwcGVkKQotCXsKKwlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKIAkJcmV0ID0gLUVOWElPOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMjAxLDExICsyMTQ1LDExIEBACiAqIGNoZWNrIGZvciBQTSBldmVudHMgYW5kIHVuZGVycnVuL292ZXJydW4gaW4gdGhlIGxvb3AuCiAqLwogCXdoaWxlIChjb3VudCA+IDApIHsKLQkJd2hpbGUoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKLQkJeworCQl3aGlsZSAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkgewogCQkJc2NoZWR1bGUoKTsKIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgewotCQkJCWlmKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CkBAIC0yMjE2LDggKzIxNjAsNyBAQAogCQkJZG1hYnVmLT5jb3VudCA9IDA7CiAJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKIAkJfQotCQlpZiAoZG1hYnVmLT51bmRlcnJ1bikKLQkJeworCQlpZiAoZG1hYnVmLT51bmRlcnJ1bikgewogCQkJZG1hYnVmLT51bmRlcnJ1biA9IDA7CiAJCQlkbWFidWYtPmh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKIAkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOwpAQCAtMjIzOCwzNCArMjE4MSwzNSBAQAogCQkJICAgcGxheWVkICovCiAJCQlzdGFydF9kYWMoc3RhdGUpOwogCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCQkJaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CiAJCQkJZ290byBvdXQ7CiAgCQkJfQogCQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+c2VtKTsKIAkJCXNjaGVkdWxlKCk7CiAgCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7Ci0JCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CiAJCQkJZ290byBvdXQ7CiAgCQkJfQogCQkJbXV0ZXhfbG9jaygmc3RhdGUtPnNlbSk7Ci0JCQlpZiAoZG1hYnVmLT5tYXBwZWQpCi0JCQl7Ci0JCQkJaWYoIXJldCkKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCWlmICghcmV0KQogCQkJCQlyZXQgPSAtRU5YSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAgCQkJY29udGludWU7CiAgCQl9CiAJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKLQkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CiAJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKIAkJZG1hYnVmLT5jb3VudCArPSBjbnQ7Ci0JCWlmKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpCi0JCXsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKIAkJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRVJST1IsIDIsIHByaW50aygKIAkJCSAgICAiY3M0Nnh4OiBjc193cml0ZSgpIGQtPmNvdW50ID4gZG1hc2l6ZSAtIHJlc2V0dGluZ1xuIikpOwogCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKQEAgLTIyODQsMzggKzIyMjgsMzIgQEAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCiAJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgMiwgCi0JCXByaW50aygiY3M0Nnh4OiBjc193cml0ZSgpLSByZXQ9JXpkXG4iLCByZXQpICk7CisJCXByaW50aygiY3M0Nnh4OiBjc193cml0ZSgpLSByZXQ9JXpkXG4iLCByZXQpKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGNzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CiAJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IG1hc2sgPSAwOwogCiAJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcG9sbCgpKyBcbiIpKTsKLQlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEKSkpCi0JeworCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSkgewogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQotCXsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKIAkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmKHN0YXRlKQotCQl7CisJCWlmIChzdGF0ZSkgewogCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQlwb2xsX3dhaXQoZmlsZSwgJmRtYWJ1Zi0+d2FpdCwgd2FpdCk7CiAJCX0KIAl9Ci0JaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JeworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CiAJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZihzdGF0ZSkKLQkJeworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOwogCQl9CkBAIC0yMzI1LDggKzIyNjMsNyBAQAogCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfRkFMU0UpOwogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CiAJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZihzdGF0ZSkKLQkJeworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQogCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKQEAgLTIzMzQsOCArMjI3MSw3IEBACiAJfQogCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKLQkJaWYoc3RhdGUpCi0JCXsKKwkJaWYgKHN0YXRlKSB7CiAJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCWlmIChkbWFidWYtPm1hcHBlZCkgewogCQkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKQEAgLTIzNjQsNyArMjMwMCw3IEBACiAgCiBzdGF0aWMgaW50IGNzX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7CiAJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOwogCWludCByZXQgPSAwOwpAQCAtMjM3Niw4ICsyMzEyLDcgQEAKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKIAkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCWlmKHN0YXRlKQotCQl7CisJCWlmIChzdGF0ZSkgewogCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKIAkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1dSSVRFIC0gc3RhdGUgVFJVRSBwcm9nX2RtYWJ1ZiBEQUNcbiIpICk7CiAJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkgIT0gMCkKQEAgLTIzODUsOCArMjMyMCw3IEBACiAJCX0KIAl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CiAJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwotCQlpZihzdGF0ZSkKLQkJeworCQlpZiAoc3RhdGUpIHsKIAkJCUNTX0RCR09VVChDU19PUEVOLCAyLCBwcmludGsoCiAJCQkgICJjczQ2eHg6IGNzX21tYXAoKSBWTV9SRUFEIC0gc3RhdGUgVFJVRSBwcm9nX2RtYWJ1ZiBBRENcbiIpICk7CiAJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkgIT0gMCkKQEAgLTI0MTQsOCArMjM0OCw3IEBACiAKIAltdXRleF9sb2NrKCZzdGF0ZS0+c2VtKTsKIAlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQlpZiAoY3M0eF9wZ29mZih2bWEpICE9IDApCi0JeworCWlmIChjczR4X3Bnb2ZmKHZtYSkgIT0gMCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yNDIzLDE1ICsyMzU2LDEzIEBACiAKIAlDU19EQkdPVVQoQ1NfUEFSTVMsIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCk6IHNpemU9JWRcbiIsKHVuc2lnbmVkKXNpemUpICk7CiAKLQlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCi0JeworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCiAJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKLQkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQotCXsKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CiAJCXJldCA9IC1FQUdBSU47CiAJCWdvdG8gb3V0OwogCX0KQEAgLTI0NDUsMjUgKzIzNzYsMjQgQEAKIAogc3RhdGljIGludCBjc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKLQlzdHJ1Y3QgZG1hYnVmICpkbWFidWY9TlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYXVkaW9fYnVmX2luZm8gYWJpbmZvOwogCWNvdW50X2luZm8gY2luZm87Ci0JaW50IHZhbCwgdmFsc2F2ZSwgbWFwcGVkLCByZXQ7CisJaW50IHZhbCwgdmFsc2F2ZSwgcmV0OworCWludCBtYXBwZWQgPSAwOwogCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwogCWludCBfX3VzZXIgKnAgPSBhcmdwOwogCi0Jc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOwotCWlmKHN0YXRlKQotCXsKKwlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwlpZiAoc3RhdGUpIHsKIAkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCW1hcHBlZCA9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBkbWFidWYtPm1hcHBlZDsKIAl9Ci0Jc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCWlmKHN0YXRlKQotCXsKKwlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwlpZiAoc3RhdGUpIHsKIAkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCW1hcHBlZCB8PSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+bWFwcGVkOwogCX0KQEAgLTI0NzIsMTcgKzI0MDIsMTQgQEAKIAlwcmludGlvY3RsKGNtZCk7CiAjZW5kaWYKIAotCXN3aXRjaCAoY21kKSAKLQl7CisJc3dpdGNoIChjbWQpIHsKIAljYXNlIE9TU19HRVRWRVJTSU9OOgogCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfUkVTRVQ6CiAJCS8qIEZJWE1FOiBzcGluX2xvY2sgPyAqLwogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmKHN0YXRlKQotCQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQlzdG9wX2RhYyhzdGF0ZSk7CiAJCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CkBAIC0yNDk1LDkgKzI0MjIsOCBAQAogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZihzdGF0ZSkKLQkJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJaWYgKHN0YXRlKSB7CiAJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOwpAQCAtMjUxMSwyMCArMjQzNywxNyBAQAogCQl9CiAJCUNTX0RCR09VVChDU19JT0NUTCwgMiwgcHJpbnRrKCJjczQ2eHg6IERTUF9SRVNFVCgpLVxuIikgKTsKIAkJcmV0dXJuIDA7Ci0KIAljYXNlIFNORENUTF9EU1BfU1lOQzoKIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQogCQkJcmV0dXJuIGRyYWluX2RhYyhzdGF0ZSwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOwogCQlyZXR1cm4gMDsKLQogCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDogLyogc2V0IHNhbXBsZSByYXRlICovCiAJCWlmIChnZXRfdXNlcih2YWwsIHApKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWlmICh2YWwgPj0gMCkgewogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQkJaWYoc3RhdGUpCi0JCQkJeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJCWlmIChzdGF0ZSkgewogCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKQEAgLTI1MzQsOSArMjQ1Nyw4IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7Ci0JCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQkJCWlmKHN0YXRlKQotCQkJCXsKKwkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJCQlpZiAoc3RhdGUpIHsKIAkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQkJCXN0b3BfZGFjKHN0YXRlKTsKIAkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CkBAIC0yNTUzLDE5ICsyNDc1LDE3IEBACiAJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKIAkJfQogCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLwogCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmKHN0YXRlKQotCQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQlzdG9wX2RhYyhzdGF0ZSk7CiAJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQlpZih2YWwpCisJCQkJaWYgKHZhbCkKIAkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKIAkJCQllbHNlCiAJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOwpAQCAtMjU3NywxNCArMjQ5NywxMyBAQAogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZihzdGF0ZSkKLQkJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJaWYgKHN0YXRlKSB7CiAJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOwogCQkJCWRtYWJ1Zi0+U0dvayA9IDA7Ci0JCQkJaWYodmFsKQorCQkJCWlmICh2YWwpCiAJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87CiAJCQkJZWxzZQogCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKQEAgLTI1OTYsMTIgKzI1MTUsMTAgQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gMDsKLQogCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmKHN0YXRlKQotCQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCiAJCQkJCXJldHVybiB2YWw7CkBAIC0yNjA5LDkgKzI1MjYsOCBAQAogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZihzdGF0ZSkKLQkJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJaWYgKHN0YXRlKSB7CiAJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQogCQkJCQlyZXR1cm4gdmFsOwpAQCAtMjYyMCwxMCArMjUzNiw4IEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCiAJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0Ki8KIAkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VOCwgcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLwogCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwpAQCAtMjYzNSw4OCArMjU0OSw3NSBAQAogCQkJdmFsID09IEFGTVRfVTggPyAiOEJpdCBVbnNpZ25lZCIgOiAiIikgKTsKIAkJdmFsc2F2ZSA9IHZhbDsKIAkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7Ci0JCQlpZih2YWw9PUFGTVRfUzE2X0xFIHx8IHZhbD09QUZNVF9VOCkKLQkJCXsKKwkJCWlmICh2YWw9PUFGTVRfUzE2X0xFIHx8IHZhbD09QUZNVF9VOCkgewogCQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCQkJCWlmKHN0YXRlKQotCQkJCQl7CisJCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQkJCQlpZiAoc3RhdGUpIHsKIAkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJCQkJc3RvcF9kYWMoc3RhdGUpOwogCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCiAJCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UXzE2QklUOwogCQkJCQkJZWxzZQogCQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfMTZCSVQ7CiAJCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQkJaWYoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCiAJCQkJCQkJcmV0dXJuIHJldDsKIAkJCQkJfQogCQkJCX0KIAkJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewogCQkJCQl2YWwgPSB2YWxzYXZlOwotCQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQkJCWlmKHN0YXRlKQotCQkJCQl7CisJCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJCQlpZiAoc3RhdGUpIHsKIAkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCQkJCQlkbWFidWYtPlNHb2sgPSAwOwotCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCiAJCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UXzE2QklUOwogCQkJCQkJZWxzZQogCQkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfMTZCSVQ7CiAJCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQkJCQkJaWYoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCiAJCQkJCQkJcmV0dXJuIHJldDsKIAkJCQkJfQogCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKKwkJCX0gZWxzZSB7CiAJCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfRVJST1IsIDIsIHByaW50aygKIAkJCQkgICAgImNzNDZ4eDogRFNQX1NFVEZNVCgpIFVuc3VwcG9ydGVkIGZvcm1hdCAoMHgleClcbiIsCiAJCQkJCXZhbHNhdmUpICk7CiAJCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJCXsKLQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYoc3RhdGUpCisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJCQlpZiAoc3RhdGUpCiAJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwotCQkJfQotCQkJZWxzZSBpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJewotCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKLQkJCQlpZihzdGF0ZSkKKwkJCX0gZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJCWlmIChzdGF0ZSkKIAkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQl9CiAJCX0KLQkJaWYoZG1hYnVmKQotCQl7Ci0JCQlpZihkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkKKwkJaWYgKGRtYWJ1ZikgeworCQkJaWYgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKQogCQkJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CiAJCQllbHNlCiAJCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIHApOwogCQl9CiAJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQogCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKHZhbCAhPSAwKSB7CiAJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCQkJaWYoc3RhdGUpCi0JCQkJeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQkJCWlmIChzdGF0ZSkgewogCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQkJc3RvcF9kYWMoc3RhdGUpOwogCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJaWYodmFsPjEpCisJCQkJCWlmICh2YWwgPiAxKQogCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKIAkJCQkJZWxzZQogCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87CkBAIC0yNzI2LDE0ICsyNjI3LDEzIEBACiAJCQkJfQogCQkJfQogCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQkJaWYoc3RhdGUpCi0JCQkJeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJCWlmIChzdGF0ZSkgewogCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQkJc3RvcF9hZGMoc3RhdGUpOwogCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJCQkJZG1hYnVmLT5TR29rID0gMDsKLQkJCQkJaWYodmFsPjEpCisJCQkJCWlmICh2YWwgPiAxKQogCQkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKIAkJCQkJZWxzZQogCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF9TVEVSRU87CkBAIC0yNzQ1LDE5ICsyNjQ1LDE2IEBACiAJCX0KIAkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCiAJCQkJcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfUE9TVDoKIAkJLyoKIAkJICogVGhlcmUgd2lsbCBiZSBhIGxvbmdlciB0aGFuIG5vcm1hbCBwYXVzZSBpbiB0aGUgZGF0YS4KIAkJICogc28uLi4gZG8gbm90aGluZywgYmVjYXVzZSB0aGVyZSBpcyBub3RoaW5nIHRoYXQgd2UgY2FuIGRvLgogCQkgKi8KIAkJcmV0dXJuIDA7Ci0KIAljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKLQkJCWlmKHN0YXRlKQotCQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQlpZiAoZG1hYnVmLT5zdWJkaXZpc2lvbikKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNzY5LDkgKzI2NjYsOCBAQAogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7Ci0JCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZihzdGF0ZSkKLQkJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQkJaWYgKHN0YXRlKSB7CiAJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCiAJCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjc4MywzNyArMjY3OSwzMSBAQAogCQkJfQogCQl9CiAJCXJldHVybiAwOwotCiAJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgogCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKIAkJCXJldHVybiAtRUZBVUxUOwotCiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYoc3RhdGUpCi0JCQl7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJCWlmIChzdGF0ZSkgewogCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwogCQkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKIAkJCX0KIAkJfQogCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgewotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOwotCQkJaWYoc3RhdGUpCi0JCQl7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwkJCWlmIChzdGF0ZSkgewogCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOwogCQkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKIAkJCX0KIAkJfQogCQlyZXR1cm4gMDsKLQogCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CiAJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCWlmKHN0YXRlKQotCQl7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwpAQCAtMjgzMiwxMyArMjcyMiwxMSBAQAogCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKIAkJfQogCQlyZXR1cm4gLUVOT0RFVjsKLQogCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CiAJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKLQkJaWYoc3RhdGUpCi0JCXsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCWlmIChzdGF0ZSkgewogCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKIAkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7CkBAIC0yODUwLDQ4ICsyNzM4LDM5IEBACiAJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOwogCQl9CiAJCXJldHVybiAtRU5PREVWOwotCiAJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgogCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAJCXJldHVybiAwOwotCiAJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CiAJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FfERTUF9DQVBfVFJJR0dFUnxEU1BfQ0FQX01NQVAsCiAJCQkgICAgcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKIAkJdmFsID0gMDsKIAkJQ1NfREJHT1VUKENTX0lPQ1RMLCAyLCBwcmludGsoImNzNDZ4eDogRFNQX0dFVFRSSUdHRVIoKStcbiIpICk7Ci0JCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKLQkJewotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYoc3RhdGUpCi0JCQl7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKLQkJCQlpZihkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQogCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKIAkJCX0KIAkJfQotCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJewotCQkJaWYoc3RhdGUpCi0JCQl7Ci0JCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHN0YXRlKSB7CisJCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CiAJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7Ci0JCQkJaWYoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKIAkJCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOwogCQkJfQogCQl9CiAJCUNTX0RCR09VVChDU19JT0NUTCwgMiwgcHJpbnRrKCJjczQ2eHg6IERTUF9HRVRUUklHR0VSKCktIHZhbD0weCV4XG4iLHZhbCkgKTsKIAkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Ci0KIAljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKIAkJaWYgKGdldF91c2VyKHZhbCwgcCkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKLQkJCWlmKHN0YXRlKQotCQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCQlpZiAoc3RhdGUpIHsKIAkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgewogCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCkBAIC0yOTAyLDkgKzI3ODEsOCBAQAogCQkJfQogCQl9CiAJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQkJaWYoc3RhdGUpCi0JCQl7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJCWlmIChzdGF0ZSkgewogCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgewogCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCkBAIC0yOTE1LDEzICsyNzkzLDExIEBACiAJCQl9CiAJCX0KIAkJcmV0dXJuIDA7Ci0KIAljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKIAkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOwotCQlpZihzdGF0ZSkKLQkJeworCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwkJaWYgKHN0YXRlKSB7CiAJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOwogCQkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKQEAgLTI5MzQsMjggKzI4MTAsMjMgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCXJldHVybiAtRU5PREVWOwotCiAJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CiAJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCWlmKHN0YXRlKQotCQl7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwogCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOwotCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQotCQkJeworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CiAJCQkJY2luZm8uYmxvY2tzID0gKGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0KSAKIAkJCQkJCQktIGRtYWJ1Zi0+YmxvY2tzOwogCQkJCUNTX0RCR09VVChDU19QQVJNUywgOCwgCiAJCQkJCXByaW50aygidG90YWxfYnl0ZXM9JWQgYmxvY2tzPSVkIGRtYWJ1Zi0+YmxvY2tzPSVkXG4iLCAKIAkJCQkJY2luZm8uYnl0ZXMsY2luZm8uYmxvY2tzLGRtYWJ1Zi0+YmxvY2tzKSApOwogCQkJCWRtYWJ1Zi0+YmxvY2tzID0gY2luZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7CisJCQl9IGVsc2UgewogCQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CiAJCQl9CiAJCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOwpAQCAtMjk2OSw2NiArMjg0MCw1NCBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAkJcmV0dXJuIC1FTk9ERVY7Ci0KIAljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgogCQlyZXR1cm4gMDsKLQogCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CiAJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07Ci0JCWlmKHN0YXRlKQotCQl7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CiAJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOwogCQkJdmFsID0gZG1hYnVmLT5jb3VudDsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UKIAkJCXZhbCA9IDA7CiAJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOwotCiAJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgotCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwogCQllbHNlIAotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQlpZihzdGF0ZSkKLQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCWlmIChzdGF0ZSkgewogCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKIAkJfQogCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7Ci0JCQotCiAJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKLQkJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKIAkJZWxzZSAKLQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKLQkJaWYoc3RhdGUpCi0JCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZiAoc3RhdGUpIHsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJcmV0dXJuIHB1dF91c2VyKChkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pID8gMiA6IDEsCiAJCQkJcCk7CiAJCX0KIAkJcmV0dXJuIHB1dF91c2VyKDAsIHApOwotCiAJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgotCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOwogCQllbHNlIAotCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOwotCQlpZihzdGF0ZSkKLQkJeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCWlmIChzdGF0ZSkgewogCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CiAJCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSA/IAogCQkJICAJQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKIAogCQl9CiAJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKLQogCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKIAljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgogCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CkBAIC0zMDU3LDE4ICsyOTE2LDE1IEBACiAJLyogTWFuYWdlIHRoZSBFQVBEIGJpdCBvbiB0aGUgQ3J5c3RhbCA0Mjk3IAogCSAgIGFuZCB0aGUgQW5hbG9nIEFEMTg4NSAqLwogCSAgIAotCWludCBvbGQ9Y2FyZC0+YW1wbGlmaWVyOworCWludCBvbGQgPSBjYXJkLT5hbXBsaWZpZXI7CiAJCiAJY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7Ci0JaWYoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpCi0JeworCWlmIChjYXJkLT5hbXBsaWZpZXIgJiYgIW9sZCkgewogCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvbiAqLwogCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCAgQUM5N19QT1dFUl9DT05UUk9MLCAKIAkJCWNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgfAogCQkJCTB4ODAwMCk7Ci0JfQotCWVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpCi0JeworCX0gZWxzZSBpZihvbGQgJiYgIWNhcmQtPmFtcGxpZmllcikgewogCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KIAkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCiAJCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYKQEAgLTMwODMsMjUgKzI5MzksMjEgQEAKICAKIHN0YXRpYyB2b2lkIGFtcF9oZXJjdWxlcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKIHsKLQlpbnQgb2xkPWNhcmQtPmFtcGxpZmllcjsKLQlpZighY2FyZCkKLQl7CisJaW50IG9sZCA9IGNhcmQtPmFtcGxpZmllcjsKKwlpZiAoIWNhcmQpIHsKIAkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPIAogCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZC5cbiIpKTsKIAkJcmV0dXJuOwogCX0KIAljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKLQlpZiggKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSAmJiAhKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUpKQotCXsKKwlpZiAoKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSAmJiAhKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUpKSB7CiAJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGV4dGVybmFsIGFtcCBlbmFibGVkXG4iKSk7CiAJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT0RSLCAKIAkJCUVHUElPRFJfR1BPRTIpOyAgICAgLyogZW5hYmxlIEVHUElPMiBvdXRwdXQgKi8KIAkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPUFRSLCAKIAkJCUVHUElPUFRSX0dQUFQyKTsgICAvKiBvcGVuLWRyYWluIG9uIG91dHB1dCAqLwotCX0KLQllbHNlIGlmKG9sZCAmJiAhY2FyZC0+YW1wbGlmaWVyKQotCXsKKwl9IGVsc2UgaWYgKG9sZCAmJiAhY2FyZC0+YW1wbGlmaWVyKSB7CiAJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCSJjczQ2eHg6IGFtcF9oZXJjdWxlcygpIGV4dGVybmFsIGFtcCBkaXNhYmxlZFxuIikpOwogCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9EUiwgMCk7IC8qIGRpc2FibGUgKi8KQEAgLTMxMjQsMzEgKzI5NzYsMjggQEAKIAl1MTYgY29udHJvbDsKIAl1OCBwcDsKIAl1bnNpZ25lZCBsb25nIHBvcnQ7Ci0JaW50IG9sZD1jYXJkLT5hY3RpdmU7CisJaW50IG9sZCA9IGNhcmQtPmFjdGl2ZTsKIAkKIAljYXJkLT5hY3RpdmUrPWNoYW5nZTsKIAkKIAlhY3BpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyMzcxQUJfMywgTlVMTCk7Ci0JaWYoYWNwaV9kZXYgPT0gTlVMTCkKKwlpZiAoYWNwaV9kZXYgPT0gTlVMTCkKIAkJcmV0dXJuOwkJLyogTm90IGEgdGhpbmtwYWQgdGhhdHMgZm9yIHN1cmUgKi8KIAogCS8qIEZpbmQgdGhlIGNvbnRyb2wgcG9ydCAqLwkJCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoYWNwaV9kZXYsIDB4NDEsICZwcCk7Ci0JcG9ydD1wcDw8ODsKKwlwb3J0ID0gcHAgPDwgODsKIAogCS8qIFJlYWQgQUNQSSBwb3J0ICovCQotCWNvbnRyb2w9aW53KHBvcnQrMHgxMCk7CisJY29udHJvbCA9IGludyhwb3J0ICsgMHgxMCk7CiAKIAkvKiBGbGlwIENMS1JVTiBvZmYgd2hpbGUgcnVubmluZyAqLwotCWlmKCFjYXJkLT5hY3RpdmUgJiYgb2xkKQotCXsKKwlpZiAoIWNhcmQtPmFjdGl2ZSAmJiBvbGQpIHsKIAkJQ1NfREJHT1VUKENTX1BBUk1TICwgOSwgcHJpbnRrKCBLRVJOX0lORk8KIAkJCSJjczQ2eHg6IGNsa3J1bigpIGVuYWJsZSBjbGtydW4gLSBjaGFuZ2U9JWQgYWN0aXZlPSVkXG4iLAogCQkJCWNoYW5nZSxjYXJkLT5hY3RpdmUpKTsKIAkJb3V0dyhjb250cm9sfDB4MjAwMCwgcG9ydCsweDEwKTsKLQl9Ci0JZWxzZSAKLQl7CisJfSBlbHNlIHsKIAkvKgogCSogc29tZXRpbWVzIG9uIGEgcmVzdW1lIHRoZSBiaXQgaXMgc2V0LCBzbyBhbHdheXMgcmVzZXQgdGhlIGJpdC4KIAkqLwpAQCAtMzE2MiwyMCArMzAxMSwxOSBAQAogCQogc3RhdGljIGludCBjc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAgICAgICAgIHVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0JaW50IHJldD0wOworCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGludCB0bXA7CiAKIAlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpKyBmaWxlPSVwICVzICVzXG4iLAogCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKIAkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSApOwogCi0JbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQotCXsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKIAkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKIAogCQlpZiAoISgoY2FyZC0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikpCkBAIC0zMTkyLDExICszMDQwLDEwIEBACiAJLyoKIAkgKiBoYXJkY29kZSBzdGF0ZVswXSBmb3IgY2FwdHVyZSwgWzFdIGZvciBwbGF5YmFjawogCSAqLwotCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCi0JeworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CiAJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCkgRk1PREVfUkVBRFxuIikgKTsKIAkJaWYgKGNhcmQtPnN0YXRlc1swXSA9PSBOVUxMKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKikKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdID0KIAkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChzdGF0ZSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtMzIwNCwzNiArMzA1MSwzMiBAQAogCQkJbXV0ZXhfaW5pdCgmc3RhdGUtPnNlbSk7CiAJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJCWlmKGRtYWJ1Zi0+cGJ1Zj09TlVMTCkKLQkJCXsKKwkJCWlmIChkbWFidWYtPnBidWYgPT0gTlVMTCkgewogCQkJCWtmcmVlKHN0YXRlKTsKLQkJCQljYXJkLT5zdGF0ZXNbMF09TlVMTDsKKwkJCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07Ci0JCQlpZihzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCWlmIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkKIAkJCQlyZXR1cm4gLUVCVVNZOwogCQl9CiAJCWRtYWJ1Zi0+Y2hhbm5lbCA9IGNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbChjYXJkKTsKIAkJCQogCQlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKLQkJCWtmcmVlIChjYXJkLT5zdGF0ZXNbMF0pOworCQkJa2ZyZWUoY2FyZC0+c3RhdGVzWzBdKTsKIAkJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCS8qIE5vdyB0dXJuIG9uIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KIAkJc3RhdGUtPmNhcmQgPSBjYXJkOwotCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsMSk7Ci0JCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwxKTsKKwkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKKwkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAxKTsKIAkJCi0JCWlmKCAodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfQURDKSkgKQotCQl7CisJCWlmICgodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfQURDKSkpIHsKIAkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCi0JCQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAgb2YgQURDIGZhaWxlZCAoMHgleClcbiIsdG1wKSApOworCQkJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwIG9mIEFEQyBmYWlsZWQgKDB4JXgpXG4iLCB0bXApKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAKQEAgLTMyNjMsMTEgKzMxMDYsMTAgQEAKIAkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9SRUFEOwogCQltdXRleF91bmxvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKIAl9Ci0JaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCi0JeworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgewogCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSBGTU9ERV9XUklURVxuIikgKTsKIAkJaWYgKGNhcmQtPnN0YXRlc1sxXSA9PSBOVUxMKSB7Ci0JCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKikKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdID0KIAkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChzdGF0ZSA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwpAQCAtMzI3NSwzNiArMzExNywzMiBAQAogCQkJbXV0ZXhfaW5pdCgmc3RhdGUtPnNlbSk7CiAJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKLQkJCWlmKGRtYWJ1Zi0+cGJ1Zj09TlVMTCkKLQkJCXsKKwkJCWlmIChkbWFidWYtPnBidWYgPT0gTlVMTCkgewogCQkJCWtmcmVlKHN0YXRlKTsKLQkJCQljYXJkLT5zdGF0ZXNbMV09TlVMTDsKKwkJCQljYXJkLT5zdGF0ZXNbMV0gPSBOVUxMOwogCQkJCXJldHVybiAtRU5PTUVNOwogCQkJfQotCQl9Ci0JCWVsc2UKLQkJeworCQl9IGVsc2UgewogCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07Ci0JCQlpZihzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlpZiAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQogCQkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CiAJCQkKIAkJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7Ci0JCQlrZnJlZSAoY2FyZC0+c3RhdGVzWzFdKTsKKwkJCWtmcmVlKGNhcmQtPnN0YXRlc1sxXSk7CiAJCQljYXJkLT5zdGF0ZXNbMV0gPSBOVUxMOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KIAogCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCiAJCXN0YXRlLT5jYXJkID0gY2FyZDsKLQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLDEpOwotCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsMSk7CisJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgMSk7CisJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgMSk7CiAKLQkJaWYoICh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMpKSApCi0JCXsKKwkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMpKSkgewogCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBEQUMgZmFpbGVkICgweCV4KVxuIix0bXApICk7CisJCQkJImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAgb2YgREFDIGZhaWxlZCAoMHgleClcbiIsIHRtcCkpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KIAkJCkBAIC0zMzMzLDMzICszMTcxLDI5IEBACiAKIAkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9XUklURTsKIAkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+b3Blbl9tdXRleCk7Ci0JCWlmKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCiAJCQlyZXR1cm4gcmV0OwogCX0KLQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpLSAwXG4iKSApOworCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCktIDBcbiIpKTsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKIHN0YXRpYyBpbnQgY3NfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CiAJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKIAl1bnNpZ25lZCBpbnQgdG1wOwogCUNTX0RCR09VVChDU19SRUxFQVNFIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkrIGZpbGU9JXAgJXMgJXNcbiIsCiAJCWZpbGUsIGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkZNT0RFX1dSSVRFIiA6ICIiLAotCQlmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEID8gIkZNT0RFX1JFQUQiIDogIiIpICk7CisJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikpOwogCiAJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKQotCXsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfQogCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOwotCWlmKHN0YXRlKQotCXsKLQkJaWYgKCAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgKQotCQl7Ci0JCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9XUklURVxuIikgKTsKKwlpZiAoc3RhdGUpIHsKKwkJaWYgKChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpICYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJQ1NfREJHT1VUKENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCkgRk1PREVfV1JJVEVcbiIpKTsKIAkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOwogCQkJY3NfY2xlYXJfdGFpbChzdGF0ZSk7CiAJCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKQEAgLTMzNzUsOCArMzIwOSw3IEBACiAJCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CiAJCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAotCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQywgQ1NfRkFMU0UgKSkgKQotCQkJeworCQkJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQywgQ1NfRkFMU0UpKSkgewogCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gREFDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKIAkJCX0KQEAgLTMzODQsMTcgKzMyMTcsMTQgQEAKIAkJCS8qIE5vdyB0dXJuIG9mZiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCiAJCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKIAkJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCiAJCQlrZnJlZShzdGF0ZSk7CiAJCX0KIAl9CiAKIAlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKLQlpZihzdGF0ZSkKLQl7Ci0JCWlmICggKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSApCi0JCXsKLQkJCUNTX0RCR09VVChDU19SRUxFQVNFLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpIEZNT0RFX1JFQURcbiIpICk7CisJaWYgKHN0YXRlKSB7CisJCWlmICgoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1JFQUQpICYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9SRUFEXG4iKSk7CiAJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKIAkJCW11dGV4X2xvY2soJnN0YXRlLT5vcGVuX211dGV4KTsKIAkJCXN0b3BfYWRjKHN0YXRlKTsKQEAgLTM0MDcsOCArMzIzNyw3IEBACiAJCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CiAJCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKIAotCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0FEQywgQ1NfRkFMU0UgKSkgKQotCQkJeworCQkJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0FEQywgQ1NfRkFMU0UpKSkgewogCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gQURDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKIAkJCX0KQEAgLTM0MTYsMTIgKzMyNDUsMTEgQEAKIAkJCS8qIE5vdyB0dXJuIG9mZiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCiAJCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKIAkJCXN0YXRlLT5jYXJkLT5hY3RpdmVfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOwotCiAJCQlrZnJlZShzdGF0ZSk7CiAJCX0KIAl9CiAKLQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpLSAwXG4iKSApOworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCktIDBcbiIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzQ3NCwyMSArMzMwMiwxOCBAQAogCiAJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpK1xuIikpOwogCi0JaWYoY2FyZC0+c3RhdGVzWzFdKQotCXsKKwlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7CiAJCXN0b3BfZGFjKGNhcmQtPnN0YXRlc1sxXSk7CiAJCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMV0pOwogCX0KLQlpZihjYXJkLT5zdGF0ZXNbMF0pCi0JeworCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKIAkJc3RvcF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKIAkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7CiAJfQogCi0JZm9yKENvdW50ID0gMHgyLCBpPTA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQotCQkJJiYgKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgCi0JCUNvdW50ICs9IDIsIGkrKykKLQl7CisJZm9yIChDb3VudCA9IDB4MiwgaSA9IDA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQorCQkJJiYgKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsKKwkJCUNvdW50ICs9IDIsIGkrKykgewogCQljYXJkLT5wbS5hYzk3W2ldID0gY3NfYWM5N19nZXQoZGV2LCBCQTBfQUM5N19SRVNFVCArIENvdW50KTsKIAl9CiAvKgpAQCAtMzUyMiwxMSArMzM0NywxMCBAQAogKiB3ZWxsLCBmb3Igbm93LCBvbmx5IHBvd2VyIGRvd24gdGhlIERBQy9BREMgYW5kIE1JWEVSIFZSRUZPTiBjb21wb25lbnRzLiAKICogdHJvdWJsZSB3aXRoIHJlbW92aW5nIFZSRUYuCiAqLwotCWlmKCAodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFICkpICkKLQl7CisJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUpKSkgewogCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKKwkJCSJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKSBmYWlsdXJlICgweCV4KVxuIix0bXApKTsKIAl9CiAKIAlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCktXG4iKSk7CkBAIC0zNTY2LDE2ICszMzkwLDEzIEBACiAqIFJlc3RvcmUganVzdCB0aGUgZmlyc3Qgc2V0IG9mIHJlZ2lzdGVycywgZnJvbSByZWdpc3RlciBudW1iZXIKICogMHgwMiB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyIHRoYXQgdWxIaWdoZXN0UmVnVG9SZXN0b3JlIHNwZWNpZmllcy4KICovCi0JZm9yKAlDb3VudCA9IDB4MiwgaT0wOyAKLQkJKENvdW50IDw9IENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpCi0JCQkmJiAoaSA8IENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOyAKLQkJQ291bnQgKz0gMiwgaSsrKQotCXsKKwlmb3IgKENvdW50ID0gMHgyLCBpPTA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKSAmJgorCQkJKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgQ291bnQgKz0gMiwgaSsrKSB7CiAJCWNzX2FjOTdfc2V0KGRldiwgKHU4KShCQTBfQUM5N19SRVNFVCArIENvdW50KSwgKHUxNiljYXJkLT5wbS5hYzk3W2ldKTsKIAl9CiAKIAkvKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciAqLwotCWlmKGNhcmQtPmFtcF9pbml0KQorCWlmIChjYXJkLT5hbXBfaW5pdCkKIAkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CiAgICAgICAgIAogCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpLVxuIikpOwpAQCAtMzU4NSwzMCArMzQwNiwyNyBAQAogc3RhdGljIGludCBjczQ2eHhfcmVzdGFydF9wYXJ0KHN0cnVjdCBjc19jYXJkICpjYXJkKQogewogCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwogCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKIAkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCkrXG4iKSk7Ci0JaWYoY2FyZC0+c3RhdGVzWzFdKQotCXsKKwlpZiAoY2FyZC0+c3RhdGVzWzFdKSB7CiAJCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1ZjsKIAkJZG1hYnVmLT5yZWFkeSA9IDA7CiAJCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMV0pOwogCQljc19zZXRfZGl2aXNvcihkbWFidWYpOwotCQlpZihfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1sxXSkpCi0JCXsKKwkJaWYgKF9fcHJvZ19kbWFidWYoY2FyZC0+c3RhdGVzWzFdKSkgewogCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDEsIAogCQkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfcmVzdGFydF9wYXJ0KCktICgtMSkgcHJvZ19kbWFidWYoKSBkYWMgZXJyb3JcbiIpKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCQljc19zZXRfZGFjX3JhdGUoY2FyZC0+c3RhdGVzWzFdLCBkbWFidWYtPnJhdGUpOwogCX0KLQlpZihjYXJkLT5zdGF0ZXNbMF0pCi0JeworCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKIAkJZG1hYnVmID0gJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmOwogCQlkbWFidWYtPnJlYWR5ID0gMDsKIAkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7CiAJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7Ci0JCWlmKF9fcHJvZ19kbWFidWYoY2FyZC0+c3RhdGVzWzBdKSkKLQkJeworCQlpZiAoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMF0pKSB7CiAJCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCiAJCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGFkYyBlcnJvclxuIikpOwogCQkJcmV0dXJuIC0xOwpAQCAtMzYxNiwxNyArMzQzNCwxNyBAQAogCQljc19zZXRfYWRjX3JhdGUoY2FyZC0+c3RhdGVzWzBdLCBkbWFidWYtPnJhdGUpOwogCX0KIAljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fUkVTVU1FRDsKLQlpZihjYXJkLT5zdGF0ZXNbMF0pCisJaWYgKGNhcmQtPnN0YXRlc1swXSkKIAkJc3RhcnRfYWRjKGNhcmQtPnN0YXRlc1swXSk7Ci0JaWYoY2FyZC0+c3RhdGVzWzFdKQorCWlmIChjYXJkLT5zdGF0ZXNbMV0pCiAJCXN0YXJ0X2RhYyhjYXJkLT5zdGF0ZXNbMV0pOwogCiAJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7CiAJY2FyZC0+cG0uZmxhZ3MgJj0gfihDUzQ2WFhfUE1fU1VTUEVORElORyB8IENTNDZYWF9QTV9TVVNQRU5ERUQgCiAJCQl8IENTNDZYWF9QTV9SRVNVTUlORyB8IENTNDZYWF9QTV9SRVNVTUVEKTsKLQlpZihjYXJkLT5zdGF0ZXNbMF0pCisJaWYgKGNhcmQtPnN0YXRlc1swXSkKIAkJd2FrZV91cCgmY2FyZC0+c3RhdGVzWzBdLT5kbWFidWYud2FpdCk7Ci0JaWYoY2FyZC0+c3RhdGVzWzFdKQorCWlmIChjYXJkLT5zdGF0ZXNbMV0pCiAJCXdha2VfdXAoJmNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLndhaXQpOwogCiAJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIApAQCAtMzYzNCwyMCArMzQ1MiwxOSBAQAogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIGNzNDYxeF9yZXNldChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7CiBzdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdG9wKHN0cnVjdCBjc19jYXJkICpjYXJkKTsKIHN0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAl1bnNpZ25lZCBpbnQgdG1wOworCiAJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAogCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKSsgZmxhZ3M9MHgleCBzPSVwXG4iLAogCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzLGNhcmQpKTsKIC8qCiAqIGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlLCBvbmx5IHN1c3BlbmQgaWYgSURMRQogKi8KLQlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQotCXsKKwlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkgewogCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCiAJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmQoKSB1bmFibGUgdG8gc3VzcGVuZCwgbm90IElETEVcbiIpKTsKIAkJcmV0dXJuIDE7CkBAIC0zNjc5LDEzICszNDk2LDExIEBACiAJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOwogCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKIAotCWlmKGNhcmQtPnN0YXRlc1sxXSkKLQl7CisJaWYgKGNhcmQtPnN0YXRlc1sxXSkgewogCQljYXJkLT5wbS5kbWFidWZfc3dwdHJfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLnN3cHRyOwogCQljYXJkLT5wbS5kbWFidWZfY291bnRfcGxheSA9IGNhcmQtPnN0YXRlc1sxXS0+ZG1hYnVmLmNvdW50OwogCX0KLQlpZihjYXJkLT5zdGF0ZXNbMF0pCi0JeworCWlmIChjYXJkLT5zdGF0ZXNbMF0pIHsKIAkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5zd3B0cjsKIAkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5jb3VudDsKIAl9CkBAIC0zNzM2LDggKzM1NTEsNyBAQAogCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKIAkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCkrIGZsYWdzPTB4JXhcbiIsCiAJCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKLQlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1NVU1BFTkRFRCkpCi0JeworCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1NVU1BFTkRFRCkpIHsKIAkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAogCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKSB1bmFibGUgdG8gcmVzdW1lLCBub3QgU1VTUEVOREVEXG4iKSk7CiAJCXJldHVybiAxOwpAQCAtMzc0NywxMCArMzU2MSw4IEBACiAJcHJpbnRwbShjYXJkKTsKIAljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAxKTsKIAotCWZvcihpPTA7aTw1O2krKykKLQl7Ci0JCWlmIChjc19oYXJkd2FyZV9pbml0KGNhcmQpICE9IDApCi0JCXsKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChjc19oYXJkd2FyZV9pbml0KGNhcmQpICE9IDApIHsKIAkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCA0LCBwcmludGsoCiAJCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KClcbiIpKTsKIAkJCW1kZWxheSgxMCAqIGNzX2xhcHRvcF93YWl0KTsKQEAgLTM3NTksMTUgKzM1NzEsMTMgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0JaWYoaT49NCkKLQl7CisJaWYgKGkgPj0gNCkgewogCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAogCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7CiAJCXJldHVybiAwOwogCX0KIAotCWlmKGNzNDZ4eF9yZXN0YXJ0X3BhcnQoY2FyZCkpCi0JeworCWlmIChjczQ2eHhfcmVzdGFydF9wYXJ0KGNhcmQpKSB7CiAJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCA0LCBwcmludGsoCiAJCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCk6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKSByZXR1cm5lZCBlcnJvclxuIikpOwogCX0KQEAgLTM4MzUsNyArMzY0NSw3IEBACiAJLyoKIAkgKiAgV2FpdCBmb3IgdGhlIHJlYWQgdG8gb2NjdXIuCiAJICovCi0JaWYoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKKwlpZiAoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKIAkJbG9vcGNudCA9IDIwMDA7CiAJZWxzZQogCQlsb29wY250ID0gNTAwICogY3NfbGFwdG9wX3dhaXQ7CkBAIC0zODY2LDcgKzM2NzYsNyBAQAogCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCiAJICovCiAKLQlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCWlmICghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQogCQlsb29wY250ID0gMjAwMDsKIAllbHNlCiAJCWxvb3BjbnQgPSAxMDAwOwpAQCAtMzg4NSw3ICszNjk1LDcgQEAKIAkvKgogCSAqICBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KIAkgKi8KLQlpZiAoISggKHRtcD1jczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpKSAmIEFDU1RTX1ZTVFMpKSB7CisJaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykpICYgQUNTVFNfVlNUUykpIHsKIAkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJImNzNDZ4eDogQUMnOTcgcmVhZCBwcm9ibGVtIChBQ1NUU19WU1RTKSwgcmVnID0gMHgleCB2YWw9MHgleCAweGZmZmYgXG4iLCAKIAkJCQlyZWcsIHRtcCkpOwpAQCAtMzkyMywxMiArMzczMyw5IEBACiAJCiAJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOwogCQotCWlmKHJlZyA9PSBBQzk3X0NEX1ZPTCkKLQl7CisJaWYgKHJlZyA9PSBBQzk3X0NEX1ZPTCkKIAkJdmFsMiA9IF9jc19hYzk3X2dldChkZXYsIEFDOTdfQ0RfVk9MKTsKLQl9Ci0JCi0JCisKIAkvKgogCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcwogCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NwpAQCAtMzk3MCw4ICszNzc3LDcgQEAKIAkvKgogCSAqICBNYWtlIHN1cmUgdGhlIHdyaXRlIGNvbXBsZXRlZC4KIAkgKi8KLQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikKLQl7CisJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpIHsKIAkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJImNzNDZ4eDogQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpKTsKIAl9CkBAIC0zOTk4LDI1ICszODA0LDIzIEBACiAJIAogCS8qIENEIG11dGUgY2hhbmdlID8gKi8KIAkKLQlpZihyZWc9PUFDOTdfQ0RfVk9MKQotCXsKKwlpZiAocmVnID09IEFDOTdfQ0RfVk9MKSB7CiAJCS8qIE11dGUgYml0IGNoYW5nZSA/ICovCi0JCWlmKCh2YWwyXnZhbCkmMHg4MDAwIHx8ICgodmFsMiA9PSAweDFmMWYgfHwgdmFsID09IDB4MWYxZikgJiYgdmFsMiAhPSB2YWwpKQotCQl7CisJCWlmICgodmFsMl52YWwpICYgMHg4MDAwIHx8CisJCSAgICAoKHZhbDIgPT0gMHgxZjFmIHx8IHZhbCA9PSAweDFmMWYpICYmIHZhbDIgIT0gdmFsKSkgewogCQkJLyogVGhpcyBpcyBhIGhhY2sgYnV0IGl0cyBjbGVhbmVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KIAkJCSAgIFJpZ2h0IG5vdyBjYXJkLT5hYzk3X2NvZGVjWzBdIG1pZ2h0IGJlIE5VTEwgYXMgd2UgYXJlCiAJCQkgICBzdGlsbCBkb2luZyBjb2RlYyBzZXR1cC4gVGhpcyBkb2VzIGFuIGVhcmx5IGFzc2lnbm1lbnQKIAkJCSAgIHRvIGF2b2lkIHRoZSBwcm9ibGVtIGlmIGl0IG9jY3VycyAqLwogCQkJICAgCi0JCQlpZihjYXJkLT5hYzk3X2NvZGVjWzBdPT1OVUxMKQotCQkJCWNhcmQtPmFjOTdfY29kZWNbMF09ZGV2OworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMF0gPT0gTlVMTCkKKwkJCQljYXJkLT5hYzk3X2NvZGVjWzBdID0gZGV2OwogCQkJCQogCQkJLyogTXV0ZSBvbiAqLwotCQkJaWYodmFsJjB4ODAwMCB8fCB2YWwgPT0gMHgxZjFmKQorCQkJaWYgKHZhbCAmIDB4ODAwMCB8fCB2YWwgPT0gMHgxZjFmKQogCQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKLQkJCWVsc2UgLyogTXV0ZSBvZmYgcG93ZXIgb24gKi8KLQkJCXsKLQkJCQlpZihjYXJkLT5hbXBfaW5pdCkKKwkJCWVsc2UgeyAvKiBNdXRlIG9mZiBwb3dlciBvbiAqLworCQkJCWlmIChjYXJkLT5hbXBfaW5pdCkKIAkJCQkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CiAJCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7CiAJCQl9CkBAIC00MDI0LDQ2ICszODI4LDQxIEBACiAJfQogfQogCi0KIC8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KIAogc3RhdGljIGludCBjc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlpbnQgaT0wOworCWludCBpID0gMDsKIAl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOwotCXN0cnVjdCBjc19jYXJkICpjYXJkPU5VTEw7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBOVUxMOwogCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OwogCXVuc2lnbmVkIGludCB0bXA7CiAKIAlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAogCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKStcbiIpKTsKIAotCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKLQl7CisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7CiAJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CiAJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCiAJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCiAJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQogCQkJCWdvdG8gbWF0Y2g7CiAJfQotCWlmICghY2FyZCkKLQl7CisJaWYgKCFjYXJkKSB7CiAJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKIAkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogIG1hdGNoOgotCWlmKCFjYXJkLT5hYzk3X2NvZGVjW2ldKQorCWlmICghY2FyZC0+YWM5N19jb2RlY1tpXSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5N19jb2RlY1tpXTsKIAogCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsMSk7Ci0JaWYoIUNTX0lOX1VTRSgmY2FyZC0+bWl4ZXJfdXNlX2NudCkpCi0JewotCQlpZiggKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX01JWFZPTiApKSApCi0JCXsKKwlpZiAoIUNTX0lOX1VTRSgmY2FyZC0+bWl4ZXJfdXNlX2NudCkpIHsKKwkJaWYgKCh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9NSVhWT04pKSkgewogCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBjc19vcGVuX21peGRldigpIHBvd2VydXAgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJCSJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCkgcG93ZXJ1cCBmYWlsdXJlICgweCV4KVxuIiwgdG1wKSk7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCX0KQEAgLTQwNzcsNyArMzg3Niw3IEBACiBzdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7Ci0Jc3RydWN0IGNzX2NhcmQgKmNhcmQ9TlVMTDsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CiAJaW50IGk7CiAJdW5zaWduZWQgaW50IHRtcDsKQEAgLTQwOTIsMTUgKzM4OTEsMTMgQEAKIAkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCiAJCQkJZ290byBtYXRjaDsKIAl9Ci0JaWYgKCFjYXJkKQotCXsKKwlpZiAoIWNhcmQpIHsKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiBtYXRjaDoKLQlpZighQ1NfREVDX0FORF9URVNUKCZjYXJkLT5taXhlcl91c2VfY250KSkKLQl7CisJaWYgKCFDU19ERUNfQU5EX1RFU1QoJmNhcmQtPm1peGVyX3VzZV9jbnQpKSB7CiAJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDQsCiAJCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKS0gbm8gcG93ZXJkb3duLCB1c2VjbnQ+MFxuIikpOwogCQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7CkBAIC00MTEwLDEwICszOTA3LDkgQEAKIC8qCiAqIG9rLCBubyBvdXRzdGFuZGluZyBtaXhlciBvcGVucywgc28gcG93ZXJkb3duLgogKi8KLQlpZiggKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfTUlYVk9OLCBDU19GQUxTRSApKSApCi0JeworCWlmICgodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9NSVhWT04sIENTX0ZBTFNFKSkpIHsKIAkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIE1JWFZPTiBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBNSVhWT04gZmFpbHVyZSAoMHgleClcbiIsIHRtcCkpOwogCQljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7CiAJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKIAkJcmV0dXJuIC1FSU87CkBAIC00MTI2LDc2ICszOTIyLDYwIEBACiB9CiAKIHN0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAotCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQorCQkJdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBjc19jYXJkICpjYXJkPU5VTEw7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gTlVMTDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IChsb25nIF9fdXNlciAqKWFyZzsKLQogI2lmIENTREVCVUdfSU5URVJGQUNFCiAgICAgICAgIGludCB2YWw7CiAKLQlpZiggCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwgCisJaWYgKAkoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0spIHx8CiAJCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSykgfHwKIAkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCkgfHwKIAkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCkgfHwKLQkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19BUE0pKQotCXsKLQkgICAgc3dpdGNoKGNtZCkKLQkgICAgewotCisJCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfQVBNKSkgeworCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6CiAJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdtYXNrLCBwKTsKLQkJCiAJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6CiAJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdsZXZlbCwgcCk7Ci0KIAkJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOgogCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQljc19kZWJ1Z21hc2sgPSB2YWw7CiAJCQlyZXR1cm4gMDsKLQogCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgogCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCiAJCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCQljc19kZWJ1Z2xldmVsID0gdmFsOwogCQkJcmV0dXJuIDA7Ci0KIAkJY2FzZSBTT1VORF9NSVhFUl9DU19BUE06CiAJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKIAkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmKHZhbCA9PSBDU19JT0NUTF9DTURfU1VTUEVORCkgCi0JCQl7Ci0JCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQotCQkJCXsKKwkJCWlmICh2YWwgPT0gQ1NfSU9DVExfQ01EX1NVU1BFTkQpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpIHsKIAkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKIAkJCQkJY3M0Nnh4X3N1c3BlbmQoY2FyZCwgUE1TR19PTik7CiAJCQkJfQogCi0JCQl9Ci0JCQllbHNlIGlmKHZhbCA9PSBDU19JT0NUTF9DTURfUkVTVU1FKQotCQkJewotCQkJCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKLQkJCQl7CisJCQl9IGVsc2UgaWYgKHZhbCA9PSBDU19JT0NUTF9DTURfUkVTVU1FKSB7CisJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKSB7CiAJCQkJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CiAJCQkJCWNzNDZ4eF9yZXN1bWUoY2FyZCk7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJeworCQkJfSBlbHNlIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8KIAkJCQkgICAgImNzNDZ4eDogbWl4ZXJfaW9jdGwoKTogaW52YWxpZCBBUE0gY21kICglZClcbiIsCiAJCQkJCXZhbCkpOwogCQkJfQogCQkJcmV0dXJuIDA7Ci0KIAkJZGVmYXVsdDoKIAkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKLQkJCQkiY3M0Nnh4OiBtaXhlcl9pb2N0bCgpOiBFUlJPUiB1bmtub3duIGRlYnVnIGNtZFxuIikgKTsKKwkJCQkiY3M0Nnh4OiBtaXhlcl9pb2N0bCgpOiBFUlJPUiB1bmtub3duIGRlYnVnIGNtZFxuIikpOwogCQkJcmV0dXJuIDA7Ci0JICAgIH0KKwkJfQogCX0KICNlbmRpZgogCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKQEAgLTQyMzIsOCArNDAxMiw3IEBACiAJCWNvZGVjLT5jb2RlY19yZWFkID0gY3NfYWM5N19nZXQ7CiAJCWNvZGVjLT5jb2RlY193cml0ZSA9IGNzX2FjOTdfc2V0OwogCQotCQlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkKLQkJeworCQlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkgewogCQkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKS0gY29kZWMgbnVtYmVyICVkIG5vdCBmb3VuZFxuIiwKIAkJCQkJbnVtX2FjOTcpICk7CkBAIC00MjQxLDEyICs0MDIwLDExIEBACiAJCQlicmVhazsKIAkJfQogCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAotCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZm91bmQgY29kZWMgJWRcbiIsbnVtX2FjOTcpICk7CisJCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKSBmb3VuZCBjb2RlYyAlZFxuIixudW1fYWM5NykpOwogCiAJCWVpZCA9IGNzX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKIAkJCi0JCWlmKGVpZD09MHhGRkZGKQotCQl7CisJCWlmIChlaWQgPT0gMHhGRkZGKSB7CiAJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNvZGVjICVkIG5vdCBwcmVzZW50XG4iLG51bV9hYzk3KTsKIAkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CiAJCQlicmVhazsKQEAgLTQyODUsMjcgKzQwNjMsMjMgQEAKIHsKICAgICB1bnNpZ25lZCBpLCBqLCB0ZW1wMSwgdGVtcDIsIG9mZnNldCwgY291bnQ7CiAgICAgdW5zaWduZWQgY2hhciBfX2lvbWVtICpwQkExID0gaW9yZW1hcChjYXJkLT5iYTFfYWRkciwgMHg0MDAwMCk7Ci0gICAgZm9yKCBpPTA7IGkgPCBDTEVBUl9fQ09VTlQ7IGkrKykKLSAgICB7CisgICAgZm9yIChpID0gMDsgaSA8IENMRUFSX19DT1VOVDsgaSsrKSB7CiAgICAgICAgIG9mZnNldCA9IENsclN0YXRbaV0uQkExX19EZXN0Qnl0ZU9mZnNldDsKICAgICAgICAgY291bnQgID0gQ2xyU3RhdFtpXS5CQTFfX1NvdXJjZVNpemU7Ci0gICAgICAgIGZvciggIHRlbXAxID0gb2Zmc2V0OyB0ZW1wMTwob2Zmc2V0K2NvdW50KTsgdGVtcDErPTQgKQorICAgICAgICBmb3IgKHRlbXAxID0gb2Zmc2V0OyB0ZW1wMSA8IChvZmZzZXQgKyBjb3VudCk7IHRlbXAxICs9IDQpCiAgICAgICAgICAgICAgIHdyaXRlbCgwLCBwQkExK3RlbXAxKTsKICAgICB9CiAKLSAgICBmb3IoaT0wOyBpPEZJTExfX0NPVU5UOyBpKyspCi0gICAgeworICAgIGZvciAoaSA9IDA7IGkgPCBGSUxMX19DT1VOVDsgaSsrKSB7CiAgICAgICAgIHRlbXAyID0gRmlsbFN0YXRbaV0uT2Zmc2V0OwotICAgICAgICBmb3Ioaj0wOyBqPChGaWxsU3RhdFtpXS5TaXplKS80OyBqKyspCi0gICAgICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IChGaWxsU3RhdFtpXS5TaXplKSAvIDQ7IGorKykgewogICAgICAgICAgICAgdGVtcDEgPSAoRmlsbFN0YXRbaV0pLnBGaWxsW2pdOwotICAgICAgICAgICAgd3JpdGVsKHRlbXAxLCBwQkExK3RlbXAyK2oqNCk7CisgICAgICAgICAgICB3cml0ZWwodGVtcDEsIHBCQTErdGVtcDIgKyBqICogNCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaW91bm1hcChwQkExKTsKIH0KIAotCiAvKgogICogIENoaXAgcmVzZXQKICAqLwpAQCAtNDM2NSwxNSArNDEzOSwxMyBAQAogCSogcGxheWluZyBvciBjYXB0dXJpbmcgdGhlbiB3ZSBkb24ndCB3YW50IHRvIHB1dCBpbiAxMjggYnl0ZXMgb2YKIAkqICJub2lzZSIuCiAJICovCi0JaWYodHlwZSAmIENTX1RZUEVfREFDKQotCXsKKwlpZiAodHlwZSAmIENTX1RZUEVfREFDKSB7CiAJCXN0YXJ0ZmlmbyA9IDEyODsKIAkJZW5kZmlmbyA9IDI1NjsKIAl9Ci0JaWYodHlwZSAmIENTX1RZUEVfQURDKQotCXsKKwlpZiAodHlwZSAmIENTX1RZUEVfQURDKSB7CiAJCXN0YXJ0ZmlmbyA9IDA7Ci0JCWlmKCFlbmRmaWZvKQorCQlpZiAoIWVuZGZpZm8pCiAJCQllbmRmaWZvID0gMTI4OwogCX0KIAkvKgpAQCAtNDQxNyw4ICs0MTg5LDcgQEAKIAogCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOwotCWlmKCFjc19wb3dlcmRvd24gJiYgIXN1c3BlbmRmbGFnKQotCXsKKwlpZiAoIWNzX3Bvd2VyZG93biAmJiAhc3VzcGVuZGZsYWcpIHsKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAogCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIERJU0FCTEVEIGV4aXRpbmdcbiIpKTsKIAkJcmV0dXJuIDA7CkBAIC00NDMyLDEyICs0MjAzLDExIEBACiAqIGN1cnJlbnRseSBwb3dlcmVkIGRvd24uICBJZiBwb3dlcmluZyBkb3duIERBQyBhbmQgQURDLCB0aGVuCiAqIGl0IGlzIHBvc3NpYmxlIHRvIHBvd2VyIGRvd24gdGhlIFZSRUYgKE9OKS4KICovCi0JaWYgKCAgICAoKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pICYmIAotCQkgKCEodHlwZSAmIENTX1BPV0VSX0FEQykgfHwgKCEodHlwZSAmIENTX1BPV0VSX0RBQykpKSApCisJaWYgKCgodHlwZSAmIENTX1BPV0VSX01JWFZPTikgJiYKKwkJICghKHR5cGUgJiBDU19QT1dFUl9BREMpIHx8ICghKHR5cGUgJiBDU19QT1dFUl9EQUMpKSkpCiAJICAgICAgJiYgCiAJCSgodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgfHwKLQkJICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSApICkKLQl7CisJCSAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpKSB7CiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCAgdW5hYmxlIHRvIHBvd2VyZG93bi4gdG1wPTB4JXhcbiIsdG1wKSk7CiAJCXJldHVybiAwOwpAQCAtNDQ1Miw4ICs0MjIyLDcgQEAKIAkvKgogCSAqICBQb3dlciBkb3duIGluZGljYXRlZCBhcmVhcy4KIAkgKi8KLQlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9GRikKLQl7CisJaWYgKHR5cGUgJiBDU19QT1dFUl9NSVhWT0ZGKSB7CiAKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKIAkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT0ZGXG4iKSk7CkBAIC00NDYxLDEyICs0MjMwLDEwIEBACiAJCSAqICBQb3dlciBkb3duIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAogCQkgKi8KIAkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKQotCQl7Ci0JCQlpZighbXV0ZWQpCi0JCQl7CisJCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikgeworCQkJaWYgKCFtdXRlZCkgewogCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQ9MTsKKwkJCQltdXRlZCA9IDE7CiAJCQl9CiAJCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkY7CiAJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwpAQCAtNDQ5MiwxNiArNDI1OSwxNCBAQAogCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgogCQkJICovCiAJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKQotCQkJeworCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSB7CiAJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gTUlYVk9GRiBmYWlsZWRcbiIpKTsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJfQogCX0KLQlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKQotCXsKKwlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPTikgewogCiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCiAJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgTUlYVk9OXG4iKSk7CkBAIC00NTA5LDE1ICs0Mjc0LDEzIEBACiAJCSAqICBQb3dlciBkb3duIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAogCQkgKi8KIAkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pCi0JCXsKLQkJCWlmKCFtdXRlZCkKLQkJCXsKKwkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pIHsKKwkJCWlmICghbXV0ZWQpIHsKIAkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkPTE7CisJCQkJbXV0ZWQgPSAxOwogCQkJfQogCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT047Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXApOwogCQkJLyoKIAkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCiAJCQkgKi8KQEAgLTQ1NDAsMzAgKzQzMDMsMjYgQEAKIAkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KIAkJCSAqLwogCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKQotCQkJeworCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCiAJCQkJCSJjczQ2eHg6IHBvd2VyZG93biBNSVhWT04gZmFpbGVkXG4iKSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCX0KIAl9Ci0JaWYodHlwZSAmIENTX1BPV0VSX0FEQykKLQl7CisJaWYgKHR5cGUgJiBDU19QT1dFUl9BREMpIHsKIAkJLyoKIAkJICogIFBvd2VyIGRvd24gdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCiAJCSAqLwogCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBBRENcbiIpKTsKIAkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCi0JCXsKLQkJCWlmKCFtdXRlZCkKLQkJCXsKKwkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHsKKwkJCWlmICghbXV0ZWQpIHsKIAkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOwotCQkJCW11dGVkPTE7CisJCQkJbXV0ZWQgPSAxOwogCQkJfQogCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREM7Ci0JCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXApOwogCiAJCQkvKgogCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KQEAgLTQ1ODcsMTYgKzQzNDYsMTQgQEAKIAkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KIAkJCSAqLwogCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKQotCQkJeworCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCiAJCQkJCSJjczQ2eHg6IHBvd2VyZG93biBBREMgZmFpbGVkXG4iKSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCX0KIAl9Ci0JaWYodHlwZSAmIENTX1BPV0VSX0RBQykKLQl7CisJaWYgKHR5cGUgJiBDU19QT1dFUl9EQUMpIHsKIAkJLyoKIAkJICogIFBvd2VyIGRvd24gdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCiAJCSAqLwpAQCAtNDYwNCwxNSArNDM2MSwxMyBAQAogCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkrIERBQ1xuIikpOwogCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikKLQkJewotCQkJaWYoIW11dGVkKQotCQkJeworCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikgeworCQkJaWYgKCFtdXRlZCkgewogCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQ9MTsKKwkJCQltdXRlZCA9IDE7CiAJCQl9CiAJCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQzsKLQkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCk7CiAJCQkvKgogCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KIAkJCSAqLwpAQCAtNDYzNSw4ICs0MzkwLDcgQEAKIAkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KIAkJCSAqLwogCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKQotCQkJeworCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCiAJCQkJCSJjczQ2eHg6IHBvd2VyZG93biBEQUMgZmFpbGVkXG4iKSk7CiAJCQkJcmV0dXJuIDE7CkBAIC00NjQ0LDcgKzQzOTgsNyBAQAogCQl9CiAJfQogCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JaWYobXV0ZWQpCisJaWYgKG11dGVkKQogCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKIAlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCiAJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCB0bXA9MHgleFxuIix0bXApKTsKQEAgLTQ2NTQsMjMgKzQ0MDgsMjIgQEAKIHN0YXRpYyBpbnQgY3M0Nnh4X3Bvd2VydXAoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlKQogewogCWludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgdG1wPTAsbXV0ZWQ9MDsKKwl1bnNpZ25lZCBpbnQgdG1wID0gMCwgbXV0ZWQgPSAwOwogCiAJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAogCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOwogCS8qCiAJKiBjaGVjayBmb3IgVlJFRiBhbmQgcG93ZXJ1cCBpZiBuZWVkIHRvLgogCSovCi0JaWYodHlwZSAmIENTX1BPV0VSX01JWFZPTikKKwlpZiAodHlwZSAmIENTX1BPV0VSX01JWFZPTikKIAkJdHlwZSB8PSBDU19QT1dFUl9NSVhWT0ZGOwotCWlmKHR5cGUgJiAoQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDKSkKKwlpZiAodHlwZSAmIChDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMpKQogCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPTiB8IENTX1BPV0VSX01JWFZPRkY7CiAKIAkvKgogCSAqICBQb3dlciB1cCBpbmRpY2F0ZWQgYXJlYXMuCiAJICovCi0JaWYodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpCi0JeworCWlmICh0eXBlICYgQ1NfUE9XRVJfTUlYVk9GRikgewogCiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCiAJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPRkZcbiIpKTsKQEAgLTQ2NzgsMTIgKzQ0MzEsMTAgQEAKIAkJICogIFBvd2VyIHVwIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAogCQkgKi8KIAkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKLQkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQotCQl7Ci0JCQlpZighbXV0ZWQpCi0JCQl7CisJCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkgeworCQkJaWYgKCFtdXRlZCkgewogCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQ9MTsKKwkJCQltdXRlZCA9IDE7CiAJCQl9CiAJCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGOwogCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKQEAgLTQ3MDksMTYgKzQ0NjAsMTQgQEAKIAkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KIAkJCSAqLwogCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKSkKLQkJCXsKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCiAJCQkJCSJjczQ2eHg6IHBvd2VydXAgTUlYVk9GRiBmYWlsZWRcbiIpKTsKIAkJCQlyZXR1cm4gMTsKIAkJCX0KIAkJfQogCX0KLQlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKQotCXsKKwlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKSB7CiAKIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKIAkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgTUlYVk9OXG4iKSk7CkBAIC00NzI2LDEyICs0NDc1LDEwIEBACiAJCSAqICBQb3dlciB1cCB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKIAkJICovCiAJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7Ci0JCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKQotCQl7Ci0JCQlpZighbXV0ZWQpCi0JCQl7CisJCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKSB7CisJCQlpZiAoIW11dGVkKSB7CiAJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKLQkJCQltdXRlZD0xOworCQkJCW11dGVkID0gMTsKIAkJCX0KIAkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKIAkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CkBAIC00NzU3LDI3ICs0NTA0LDIzIEBACiAJCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCiAJCQkgKi8KIAkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKLQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKLQkJCXsKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkgewogCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKIAkJCQkJImNzNDZ4eDogcG93ZXJ1cCBNSVhWT04gZmFpbGVkXG4iKSk7CiAJCQkJcmV0dXJuIDE7CiAJCQl9CiAJCX0KIAl9Ci0JaWYodHlwZSAmIENTX1BPV0VSX0FEQykKLQl7CisJaWYgKHR5cGUgJiBDU19QT1dFUl9BREMpIHsKIAkJLyoKIAkJICogIFBvd2VyIHVwIHRoZSBBREMgb24gdGhlIEFDOTcgY2FyZC4gIAogCQkgKi8KIAkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIEFEQ1xuIikpOwogCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkKLQkJewotCQkJaWYoIW11dGVkKQotCQkJeworCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKSkgeworCQkJaWYgKCFtdXRlZCkgewogCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQ9MTsKKwkJCQltdXRlZCA9IDE7CiAJCQl9CiAJCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREM7CiAJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwpAQCAtNDgwNCwxNiArNDU0NywxNCBAQAogCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgogCQkJICovCiAJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCi0JCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpCi0JCQl7CisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpIHsKIAkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCiAJCQkJCSJjczQ2eHg6IHBvd2VydXAgQURDIGZhaWxlZFxuIikpOwogCQkJCXJldHVybiAxOwogCQkJfQogCQl9CiAJfQotCWlmKHR5cGUgJiBDU19QT1dFUl9EQUMpCi0JeworCWlmICh0eXBlICYgQ1NfUE9XRVJfREFDKSB7CiAJCS8qCiAJCSAqICBQb3dlciB1cCB0aGUgREFDIG9uIHRoZSBBQzk3IGNhcmQuICAKIAkJICovCkBAIC00ODIxLDEyICs0NTYyLDEwIEBACiAJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCiAJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIERBQ1xuIikpOwogCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkKLQkJewotCQkJaWYoIW11dGVkKQotCQkJeworCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSkgeworCQkJaWYgKCFtdXRlZCkgewogCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7Ci0JCQkJbXV0ZWQ9MTsKKwkJCQltdXRlZCA9IDE7CiAJCQl9CiAJCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7CiAJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOwpAQCAtNDg1Miw4ICs0NTkxLDcgQEAKIAkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KIAkJCSAqLwogCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAotCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKQotCQkJeworCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pKSB7CiAJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAogCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIERBQyBmYWlsZWRcbiIpKTsKIAkJCQlyZXR1cm4gMTsKQEAgLTQ4NjEsMTQgKzQ1OTksMTMgQEAKIAkJfQogCX0KIAl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOwotCWlmKG11dGVkKQorCWlmIChtdXRlZCkKIAkJY3NfbXV0ZShjYXJkLCBDU19GQUxTRSk7CiAJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPIAogCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpLSAwIHRtcD0weCV4XG4iLHRtcCkpOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0YXJ0KHN0cnVjdCBjc19jYXJkICpjYXJkKQogewogCWludCBjbnQ7CkBAIC00OTY1LDcgKzQ3MDIsNyBAQAogCSogaXMgbm90IGVub3VnaCBmb3Igc29tZSBwbGF0Zm9ybXMhIHRlc3RlZCBvbiBhbiBJQk0gVGhpbmtwYWRzIGFuZCAKIAkqIHJlZmVyZW5jZSBjYXJkcy4KIAkqLwotCWlmKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCisJaWYgKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCiAJCW1kZWxheShpbml0ZGVsYXkpOwogCS8qCiAJICogIFdyaXRlIHRoZSBzZWxlY3RlZCBjbG9jayBjb250cm9sIHNldHVwIHRvIHRoZSBoYXJkd2FyZS4gIERvIG5vdCB0dXJuIG9uCkBAIC01MDE3LDggKzQ3NTQsNyBAQAogKiBJZiB3ZSBhcmUgcmVzdW1pbmcgdW5kZXIgMi4yLnggdGhlbiB3ZSBjYW4gbm90IHNjaGVkdWxlIGEgdGltZW91dC4KICogc28sIGp1c3Qgc3BpbiB0aGUgQ1BVLgogKi8KLQlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQotCXsKKwlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewogCS8qCiAJICogV2FpdCBmb3IgdGhlIGNhcmQgcmVhZHkgc2lnbmFsIGZyb20gdGhlIEFDOTcgY2FyZC4KIAkgKi8KQEAgLTUwMzMsOSArNDc2OSw3IEBACiAJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOwogCQkJc2NoZWR1bGVfdGltZW91dCgxKTsKIAkJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kX3RpbWUpKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspIHsKIAkJLy8gRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgogCQkJdWRlbGF5KDI1ICogY3NfbGFwdG9wX3dhaXQpOwpAQCAtNTA2NCw4ICs0Nzk4LDcgQEAKIAkgKi8KIAljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7CiAKLQlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQotCXsKKwlpZiAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgewogCS8qCiAJICogIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzIGFuZCA0IGFzIHZhbGlkLCBtZWFuaW5nIHRoYXQKIAkgKiAgdGhlIGNhcmQgaXMgcHVtcGluZyBBREMgZGF0YSBhY3Jvc3MgdGhlIEFDLWxpbmsuCkBAIC01MDgxLDkgKzQ4MTQsNyBAQAogCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKIAkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CiAJCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7CiAJCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KIAkJCXVkZWxheSgyNSAqIGNzX2xhcHRvcF93YWl0KTsKQEAgLTUxNDAsMTcgKzQ4NzEsMTMgQEAKIAljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NUTCwgdG1wICYgMHhmZmZmMDAwMCk7CiAKIAkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KLQlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQotCXsKLQkJaWYgKGNzX2FjOTdfaW5pdChjYXJkKSA8PSAwKQotCQl7CisJaWYgKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpIHsKKwkJaWYgKGNzX2FjOTdfaW5pdChjYXJkKSA8PSAwKSB7CiAJCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAotCQkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZhaWx1cmVcbiIpICk7CisJCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZmFpbHVyZVxuIikpOwogCQkJcmV0dXJuIC1FSU87CiAJCX0KLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQljczQ2eHhfYWM5N19yZXN1bWUoY2FyZCk7CiAJfQogCQpAQCAtNTE3NCwyMyArNDkwMSwxNyBAQAogCSAqICBJZiBJRExFIHRoZW4gUG93ZXIgZG93biB0aGUgcGFydC4gIFdlIHdpbGwgcG93ZXIgY29tcG9uZW50cyB1cCAKIAkgKiAgd2hlbiB3ZSBuZWVkIHRoZW0uICAKIAkgKi8KLQlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQotCXsKLQkJaWYoIWNzX3Bvd2VyZG93bikKLQkJewotCQkJaWYoICh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJCQlDU19QT1dFUl9NSVhWT04gKSkgKQotCQkJeworCWlmIChjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSB7CisJCWlmICghY3NfcG93ZXJkb3duKSB7CisJCQlpZiAoKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQkJCUNTX1BPV0VSX01JWFZPTikpKSB7CiAJCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VydXAoKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CiAJCQkJcmV0dXJuIC1FSU87CiAJCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiggKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKLQkJCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19GQUxTRSApKSApCi0JCQl7CisJCX0gZWxzZSB7CisJCQlpZiAoKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDIHwgQ1NfUE9XRVJfQURDIHwKKwkJCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19GQUxTRSkpKSB7CiAJCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKIAkJCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKIAkJCQlyZXR1cm4gLUVJTzsKQEAgLTUzMTAsMTQgKzUwMzEsMTMgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiQ3J5c3RhbCBTb3VuZEZ1c2lvbiBBdWRpbyBTdXBwb3J0Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLQogc3RhdGljIGNvbnN0IGNoYXIgY3M0Nnh4X2Jhbm5lcltdID0gS0VSTl9JTkZPICJDcnlzdGFsIDQyODAvNDZ4eCArIEFDOTcgQXVkaW8sIHZlcnNpb24gIiBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIi4iIENTNDZYWF9BUkNIICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBmbmRtc2dbXSA9IEtFUk5fSU5GTyAiY3M0Nnh4OiBGb3VuZCAlZCBhdWRpbyBkZXZpY2UocykuXG4iOwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjczQ2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCiB7Ci0JaW50IGksajsKKwlpbnQgaSwgajsKIAl1MTYgc3NfY2FyZCwgc3NfdmVuZG9yOwogCXN0cnVjdCBjc19jYXJkICpjYXJkOwogCWRtYV9hZGRyX3QgZG1hX21hc2s7CkBAIC01Mzc4LDQyICs1MDk4LDM1IEBACiAKIAl3aGlsZSAoY3AtPm5hbWUpCiAJewotCQlpZihjcC0+dmVuZG9yID09IHNzX3ZlbmRvciAmJiBjcC0+aWQgPT0gc3NfY2FyZCkKLQkJeworCQlpZiAoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpIHsKIAkJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKLQkJCWlmKGNwLT5hY3RpdmUpCisJCQlpZiAoY3AtPmFjdGl2ZSkKIAkJCQljYXJkLT5hY3RpdmVfY3RybCA9IGNwLT5hY3RpdmU7Ci0JCQlpZihjcC0+YW1wX2luaXQpCisJCQlpZiAoY3AtPmFtcF9pbml0KQogCQkJCWNhcmQtPmFtcF9pbml0ID0gY3AtPmFtcF9pbml0OwogCQkJYnJlYWs7CiAJCX0KIAkJY3ArKzsKIAl9Ci0JaWYgKGNwLT5uYW1lPT1OVUxMKQotCXsKKwlpZiAoY3AtPm5hbWUgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IFVua25vd24gY2FyZCAoJTA0WDolMDRYKSBhdCAweCUwOGx4LzB4JTA4bHgsIElSUSAlZFxuIiwKIAkJCXNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCAgY2FyZC0+aXJxKTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6ICVzICglMDRYOiUwNFgpIGF0IDB4JTA4bHgvMHglMDhseCwgSVJRICVkXG4iLAogCQkJY3AtPm5hbWUsIHNzX3ZlbmRvciwgc3NfY2FyZCwgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOwogCX0KIAkKLQlpZiAoY2FyZC0+YW1wbGlmaWVyX2N0cmw9PU5VTEwpCi0JeworCWlmIChjYXJkLT5hbXBsaWZpZXJfY3RybCA9PSBOVUxMKSB7CiAJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7CiAJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CiAJfQkJCiAKLQlpZiAoZXh0ZXJuYWxfYW1wID09IDEpCi0JeworCWlmIChleHRlcm5hbF9hbXAgPT0gMSkgewogCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOwogCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOwogCX0KIAotCWlmICh0aGlua3BhZCA9PSAxKQotCXsKKwlpZiAodGhpbmtwYWQgPT0gMSkgewogCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IEFjdGl2YXRpbmcgQ0xLUlVOIGhhY2sgZm9yIFRoaW5rcGFkLlxuIik7CiAJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CiAJfQpAQCAtNTQyNSwxMyArNTEzOCwxMSBAQAogKiBhbmQgbWRlbGF5IGtlcm5lbCBjb2RlIGlzIHJlcGxhY2VkIGJ5IGEgcG0gdGltZXIsIG9yIHRoZSBkZWxheXMKICogd29yayB3ZWxsIGZvciBiYXR0ZXJ5IGFuZC9vciBBQyBwb3dlciBib3RoLgogKi8KLQlpZihjYXJkLT5hY3RpdmVfY3RybCA9PSBjbGtydW5faGFjaykKLQl7CisJaWYgKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKSB7CiAJCWluaXRkZWxheSA9IDIxMDA7CiAJCWNzX2xhcHRvcF93YWl0ID0gNTsKIAl9Ci0JaWYoKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKSAmJiAhKHBvd2VyZG93biA9PSAxKSkKLQl7CisJaWYgKChjYXJkLT5hY3RpdmVfY3RybCA9PSBjbGtydW5faGFjaykgJiYgIShwb3dlcmRvd24gPT0gMSkpIHsKIC8qCiAqIGZvciBzb21lIGN1cnJlbnRseSB1bmtub3duIHJlYXNvbiwgcG93ZXJpbmcgZG93biB0aGUgREFDIGFuZCBBREMgY29tcG9uZW50CiAqIGJsb2NrcyBvbiB0aGlua3BhZHMgY2F1c2VzIHNvbWUgZnVua3kgYmVoYXZpb3IuLi4gZGlzdG9vcnJydGlvbiBhbmQgYWM5NyAKQEAgLTU0NDAsNyArNTE1MSw3IEBACiAqLwogCQljc19wb3dlcmRvd24gPSAwOwogCX0KLQlpZihwb3dlcmRvd24gPT0gMCkKKwlpZiAocG93ZXJkb3duID09IDApCiAJCWNzX3Bvd2VyZG93biA9IDA7CiAJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgMSk7CiAKQEAgLTU0NjEsNyArNTE3Miw3IEBACiAJCQljYXJkLT5iYTEubmFtZS5wbWVtLAogCQkJY2FyZC0+YmExLm5hbWUucmVnKSApOwogCi0JaWYoY2FyZC0+YmEwID09IDAgfHwgY2FyZC0+YmExLm5hbWUuZGF0YTAgPT0gMCB8fAorCWlmIChjYXJkLT5iYTAgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5kYXRhMCA9PSAwIHx8CiAJCWNhcmQtPmJhMS5uYW1lLmRhdGExID09IDAgfHwgY2FyZC0+YmExLm5hbWUucG1lbSA9PSAwIHx8CiAJCWNhcmQtPmJhMS5uYW1lLnJlZyA9PSAwKQogCQlnb3RvIGZhaWwyOwpAQCAtNTQ3NywxNCArNTE4OCwxMiBAQAogCX0KIAogICAgICAgICAvKiByZWdpc3RlciAvZGV2L21pZGkgKi8KLSAgICAgICAgaWYoKGNhcmQtPmRldl9taWRpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmY3NfbWlkaV9mb3BzLCAtMSkpIDwgMCkKKyAgICAgICAgaWYgKChjYXJkLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzX21pZGlfZm9wcywgLTEpKSA8IDApCiAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byByZWdpc3RlciBtaWRpXG4iKTsKICAgICAgICAgICAgICAgICAKIAljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKLQlmb3IoaT0wO2k8NTtpKyspCi0JewotCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKQotCQl7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKSB7CiAJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDQsIHByaW50aygKIAkJCQkiY3M0Nnh4OiBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KCkuLi4gcmV0cnlpbmdcbiIpKTsKIAkJCWZvciAoaiA9IDA7IGogPCBOUl9BQzk3OyBqKyspCkBAIC01NDk3LDEyICs1MjA2LDExIEBACiAJCX0KIAkJYnJlYWs7CiAJfQotCWlmKGk+PTQpCi0JeworCWlmKGkgPj0gNCkgewogCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAogCQkJImNzNDZ4eDogY3M0Nnh4X3Byb2JlKCktIGNzX2hhcmR3YXJlX2luaXQoKSBmYWlsZWQsIHJldHJpZWQgJWQgdGltZXMuXG4iLGkpKTsKICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5kZXZfYXVkaW8pOwotICAgICAgICAgICAgICAgIGlmKGNhcmQtPmRldl9taWRpKQorICAgICAgICAgICAgICAgIGlmIChjYXJkLT5kZXZfbWlkaSkKICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5kZXZfbWlkaSk7CiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogCX0KQEAgLTU1MTgsNyArNTIyNiw3IEBACiAJKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciwgYnV0IHByb2JhYmx5IGFscmVhZHkgZG9uZQogCSogc2luY2UgdGhlIENEIGxvZ2ljIGluIHRoZSBhYzk3IGluaXQgY29kZSB3aWxsIHR1cm4gb24gdGhlIGV4dCBhbXAuCiAJKi8KLQlpZihjcC0+YW1wX2luaXQpCisJaWYgKGNwLT5hbXBfaW5pdCkKIAkJY3AtPmFtcF9pbml0KGNhcmQpOwogICAgICAgICBjYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7CiAKQEAgLTU1MzYsMTUgKzUyNDQsMTUgQEAKIGZhaWw6CiAJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKIGZhaWwyOgotCWlmKGNhcmQtPmJhMCkKKwlpZiAoY2FyZC0+YmEwKQogCQlpb3VubWFwKGNhcmQtPmJhMCk7Ci0JaWYoY2FyZC0+YmExLm5hbWUuZGF0YTApCisJaWYgKGNhcmQtPmJhMS5uYW1lLmRhdGEwKQogCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGEwKTsKLQlpZihjYXJkLT5iYTEubmFtZS5kYXRhMSkKKwlpZiAoY2FyZC0+YmExLm5hbWUuZGF0YTEpCiAJCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOwotCWlmKGNhcmQtPmJhMS5uYW1lLnBtZW0pCisJaWYgKGNhcmQtPmJhMS5uYW1lLnBtZW0pCiAJCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7Ci0JaWYoY2FyZC0+YmExLm5hbWUucmVnKQorCWlmIChjYXJkLT5iYTEubmFtZS5yZWcpCiAJCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucmVnKTsKIAlrZnJlZShjYXJkKTsKIAlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCkBAIC01NTk4LDkgKzUzMDYsOCBAQAogCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIFdlIHdpbGwgcG93ZXIgdGhlbSB1cCAoaWYpIHdoZW4gd2UgbmVlZAogCSAqICB0aGVtLgogCSAqLwotCWlmKCAodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAotCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFICkpICkKLQl7CisJaWYgKCh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUpKSkgewogCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9JTkZPIAogCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKIAl9CkBAIC01NjM0LDcgKzUzNDEsNyBAQAogCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTdfY29kZWNbaV0pOwogCQl9CiAJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKLSAgICAgICAgaWYoY2FyZC0+ZGV2X21pZGkpCisgICAgICAgIGlmIChjYXJkLT5kZXZfbWlkaSkKICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOwogCWxpc3RfZGVsKCZjYXJkLT5saXN0KTsKIAlrZnJlZShjYXJkKTsKQEAgLTU2OTMsOCArNTQwMCw3IEBACiAJCSJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpKyBcbiIpKTsKIAlydG4gPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjczQ2eHhfcGNpX2RyaXZlcik7CiAKLQlpZihydG4gPT0gLUVOT0RFVikKLQl7CisJaWYgKHJ0biA9PSAtRU5PREVWKSB7CiAJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayggCiAJCQkiY3M0Nnh4OiBVbmFibGUgdG8gZGV0ZWN0IHZhbGlkIGNzNDZ4eCBkZXZpY2VcbiIpKTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKaW5kZXggMjVhZThlNC4uOGFjNzdkZiAxMDA2NDQKLS0tIGEvc291bmQvb3NzL2VtdTEwazEvbWlkaS5jCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgogI2VuZGlmCiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlkaV9zcGlubG9jayBfX2F0dHJpYnV0ZSgodW51c2VkKSkpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtaWRpX3NwaW5sb2NrKTsKIAogc3RhdGljIHZvaWQgaW5pdF9taWRpX2hkcihzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHIpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZC5jIGIvc291bmQvb3NzL21zbmQuYwppbmRleCA1ZGJmYzBmLi5iYTM4ZDYyIDEwMDY0NAotLS0gYS9zb3VuZC9vc3MvbXNuZC5jCisrKyBiL3NvdW5kL29zcy9tc25kLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIHN0YXRpYyBtdWx0aXNvdW5kX2Rldl90CQkqZGV2c1tNU05EX01BWF9ERVZTXTsKIHN0YXRpYyBpbnQJCQludW1fZGV2czsKIAotaW50IF9faW5pdCBtc25kX3JlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldikKK2ludCBtc25kX3JlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldikKIHsKIAlpbnQgaTsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL0tjb25maWcgYi9zb3VuZC9wY2kvS2NvbmZpZwppbmRleCBhMjA4MTgwLi5kMzczNDZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvS2NvbmZpZworKysgYi9zb3VuZC9wY2kvS2NvbmZpZwpAQCAtMjE2LDE0ICsyMTYsMTkgQEAKIAkgIFRoaXMgd29ya3MgYmV0dGVyIHRoYW4gdGhlIG9sZCBjb2RlLCBzbyBzYXkgWS4KIAogY29uZmlnIFNORF9DUzU1MzVBVURJTwotCXRyaXN0YXRlICJDUzU1MzUgQXVkaW8iCisJdHJpc3RhdGUgIkNTNTUzNS9DUzU1MzYgQXVkaW8iCiAJZGVwZW5kcyBvbiBTTkQgJiYgWDg2ICYmICFYODZfNjQKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfQUM5N19DT0RFQwogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciBhdWRpbyBvbiBDUzU1MzUgY2hpcHMuIEl0IGlzCiAJICByZWZlcnJlZCB0byBhcyBOUyBDUzU1MzUgSU8gb3IgQU1EIENTNTUzNSBJTyBjb21wYW5pb24gaW4KLQkgIHZhcmlvdXMgbGl0ZXJhdHVyZS4KKwkgIHZhcmlvdXMgbGl0ZXJhdHVyZS4gVGhpcyBkcml2ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQ1M1NTM2IGF1ZGlvCisJICBkZXZpY2UuIEhvd2V2ZXIsIGZvciBib3RoIGNoaXBzLCBvbiBjZXJ0YWluIGJvYXJkcywgeW91IG1heQorCSAgbmVlZCB0byB1c2UgYWM5N19xdWlyaz1ocF9vbmx5IGlmIHlvdXIgYm9hcmQgaGFzIHBoeXNpY2FsbHkgCisJICBtYXBwZWQgaGVhZHBob25lIG91dCB0byBtYXN0ZXIgb3V0cHV0LiBJZiB0aGF0IHdvcmtzIGZvciB5b3UsCisJICBzZW5kIGxzcGNpIC12dnYgb3V0cHV0IHRvIHRoZSBtYWlsaW5nIGxpc3Qgc28gdGhhdCB5b3VyIGJvYXJkCisJICBjYW4gYmUgaWRlbnRpZmllZCBpbiB0aGUgcXVpcmtzIGxpc3QuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHNuZC1jczU1MzVhdWRpby4KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwppbmRleCBkMDUyMDA3Li4wYWJmMjgwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCkBAIC0yNTMsNiArMjUzLDggQEAKIAlhYzk3LT5idXMtPm9wcy0+d3JpdGUoYWM5NywgcmVnLCB2YWx1ZSk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2FjOTdfd3JpdGUpOworCiAvKioKICAqIHNuZF9hYzk3X3JlYWQgLSByZWFkIGEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gcmVnaXN0ZXIKICAqIApAQCAtMjgxLDYgKzI4Myw4IEBACiAJcmV0dXJuIGFjOTctPnJlZ3NbcmVnXTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N19yZWFkKTsKKwogLyoqCiAgKiBzbmRfYWM5N193cml0ZV9jYWNoZSAtIHdyaXRlIGEgdmFsdWUgb24gdGhlIGdpdmVuIHJlZ2lzdGVyIGFuZCB1cGRhdGUgdGhlIGNhY2hlCiAgKiBAYWM5NzogdGhlIGFjOTcgaW5zdGFuY2UKQEAgLTMwMiw2ICszMDYsOCBAQAogCW11dGV4X3VubG9jaygmYWM5Ny0+cmVnX211dGV4KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N193cml0ZV9jYWNoZSk7CisKIC8qKgogICogc25kX2FjOTdfdXBkYXRlIC0gdXBkYXRlIHRoZSB2YWx1ZSBvbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIKICAqIEBhYzk3OiB0aGUgYWM5NyBpbnN0YW5jZQpAQCAtMzMxLDYgKzMzNyw4IEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N191cGRhdGUpOworCiAvKioKICAqIHNuZF9hYzk3X3VwZGF0ZV9iaXRzIC0gdXBkYXRlIHRoZSBiaXRzIG9uIHRoZSBnaXZlbiByZWdpc3RlcgogICogQGFjOTc6IHRoZSBhYzk3IGluc3RhbmNlCkBAIC0zNTYsNiArMzY0LDggQEAKIAlyZXR1cm4gY2hhbmdlOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3VwZGF0ZV9iaXRzKTsKKwogLyogbm8gbG9jayB2ZXJzaW9uIC0gc2VlIHNuZF9hYzk3X3VwZGF0X2JpdHMoKSAqLwogaW50IHNuZF9hYzk3X3VwZGF0ZV9iaXRzX25vbG9jayhzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHVuc2lnbmVkIHNob3J0IHJlZywKIAkJCQl1bnNpZ25lZCBzaG9ydCBtYXNrLCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSkKQEAgLTU2Myw3ICs1NzMsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NvbnRyb2xzX21pY19ib29zdCA9Ci0JQUM5N19TSU5HTEUoIk1pYyBCb29zdCAoKzIwZEIpIiwgQUM5N19NSUMsIDYsIDEsIDApOworCUFDOTdfU0lOR0xFKCJNaWMgQm9vc3QgKCsyMGRCKSBTd2l0Y2giLCBBQzk3X01JQywgNiwgMSwgMCk7CiAKIAogc3RhdGljIGNvbnN0IGNoYXIqIHN0ZF9yZWNfc2VsW10gPSB7Ik1pYyIsICJDRCIsICJWaWRlbyIsICJBdXgiLCAiTGluZSIsICJNaXgiLCAiTWl4IE1vbm8iLCAiUGhvbmUifTsKQEAgLTYwNSw3ICs2MTUsNyBAQAogQUM5N19TSU5HTEUoIjNEIENvbnRyb2wgLSBTd2l0Y2giLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMTMsIDEsIDApLAogQUM5N19TSU5HTEUoIkxvdWRuZXNzIChiYXNzIGJvb3N0KSIsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxMiwgMSwgMCksCiBBQzk3X0VOVU0oIk1vbm8gT3V0cHV0IFNlbGVjdCIsIHN0ZF9lbnVtWzJdKSwKLUFDOTdfRU5VTSgiTWljIFNlbGVjdCIsIHN0ZF9lbnVtWzNdKSwKK0FDOTdfRU5VTSgiTWljIFNlbGVjdCBDYXB0dXJlIFN3aXRjaCIsIHN0ZF9lbnVtWzNdKSwKIEFDOTdfU0lOR0xFKCJBREMvREFDIExvb3BiYWNrIiwgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDcsIDEsIDApCiB9OwogCkBAIC0xMjI2LDcgKzEyMzYsOCBAQAogCWFjOTctPnJlZ3NbQUM5N19DRU5URVJfTEZFX01BU1RFUl0gPSAweDgwODA7CiAKIAkvKiBidWlsZCBjZW50ZXIgY29udHJvbHMgKi8KLQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19DRU5URVJfTEZFX01BU1RFUikpIHsKKwlpZiAoKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIpKSAKKwkJJiYgIShhYzk3LT5mbGFncyAmIEFDOTdfQURfTVVMVEkpKSB7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfY2VudGVyWzBdLCBhYzk3KSkpIDwgMCkKIAkJCXJldHVybiBlcnI7CiAJCWlmICgoZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCA9IHNuZF9hYzk3X2NuZXcoJnNuZF9hYzk3X2NvbnRyb2xzX2NlbnRlclsxXSwgYWM5NykpKSA8IDApCkBAIC0xMjM4LDcgKzEyNDksOCBAQAogCX0KIAogCS8qIGJ1aWxkIExGRSBjb250cm9scyAqLwotCWlmIChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSKzEpKSB7CisJaWYgKChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X0NFTlRFUl9MRkVfTUFTVEVSKzEpKQorCQkmJiAhKGFjOTctPmZsYWdzICYgQUM5N19BRF9NVUxUSSkpIHsKIAkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfYWM5N19jbmV3KCZzbmRfYWM5N19jb250cm9sc19sZmVbMF0sIGFjOTcpKSkgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKChlcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsID0gc25kX2FjOTdfY25ldygmc25kX2FjOTdfY29udHJvbHNfbGZlWzFdLCBhYzk3KSkpIDwgMCkKQEAgLTEyNTAsNyArMTI2Miw4IEBACiAJfQogCiAJLyogYnVpbGQgc3Vycm91bmQgY29udHJvbHMgKi8KLQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19TVVJST1VORF9NQVNURVIpKSB7CisJaWYgKChzbmRfYWM5N190cnlfdm9sdW1lX21peChhYzk3LCBBQzk3X1NVUlJPVU5EX01BU1RFUikpIAorCQkmJiAhKGFjOTctPmZsYWdzICYgQUM5N19BRF9NVUxUSSkpIHsKIAkJLyogU3Vycm91bmQgTWFzdGVyICgweDM4KSBpcyB3aXRoIHN0ZXJlbyBtdXRlcyAqLwogCQlpZiAoKGVyciA9IHNuZF9hYzk3X2NtaXhfbmV3X3N0ZXJlbyhjYXJkLCAiU3Vycm91bmQgUGxheWJhY2siLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMSwgYWM5NykpIDwgMCkKIAkJCXJldHVybiBlcnI7CkBAIC0xMzM1LDkgKzEzNDgsMTEgQEAKIAl9CiAKIAkvKiBidWlsZCBBdXggY29udHJvbHMgKi8KLQlpZiAoc25kX2FjOTdfdHJ5X3ZvbHVtZV9taXgoYWM5NywgQUM5N19BVVgpKSB7Ci0JCWlmICgoZXJyID0gc25kX2FjOTdfY21peF9uZXcoY2FyZCwgIkF1eCBQbGF5YmFjayIsIEFDOTdfQVVYLCBhYzk3KSkgPCAwKQotCQkJcmV0dXJuIGVycjsKKwlpZiAoIShhYzk3LT5mbGFncyAmIEFDOTdfSEFTX05PX0FVWCkpIHsKKwkJaWYgKHNuZF9hYzk3X3RyeV92b2x1bWVfbWl4KGFjOTcsIEFDOTdfQVVYKSkgeworCQkJaWYgKChlcnIgPSBzbmRfYWM5N19jbWl4X25ldyhjYXJkLCAiQXV4IFBsYXliYWNrIiwgQUM5N19BVVgsIGFjOTcpKSA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQogCX0KIAogCS8qIGJ1aWxkIFBDTSBjb250cm9scyAqLwpAQCAtMTY4Miw2ICsxNjk3LDcgQEAKIAlyZXR1cm4gInVua25vd24gY29kZWMiOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X2dldF9zaG9ydF9uYW1lKTsKIAogLyogd2FpdCBmb3IgYSB3aGlsZSB1bnRpbCByZWdpc3RlcnMgYXJlIGFjY2Vzc2libGUgYWZ0ZXIgUkVTRVQKICAqIHJldHVybiAwIGlmIG9rLCBuZWdhdGl2ZSBub3QgcmVhZHkKQEAgLTE3NzQsNiArMTc5MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2FjOTdfYnVzKTsKKwogLyogc3RvcCBubyBkZXYgcmVsZWFzZSB3YXJuaW5nICovCiBzdGF0aWMgdm9pZCBhYzk3X2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKiBkZXYpCiB7CkBAIC0yMTE3LDYgKzIxMzUsNyBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X21peGVyKTsKIAogLyoKICAqIFBvd2VyIGRvd24gdGhlIGNoaXAuCkBAIC0yMTY2LDYgKzIxODUsOCBAQAogCXNuZF9hYzk3X3Bvd2VyZG93bihhYzk3KTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N19zdXNwZW5kKTsKKwogLyoKICAqIHJlc3RvcmUgYWM5NyBzdGF0dXMKICAqLwpAQCAtMjI2Nyw2ICsyMjg4LDggQEAKIAkJc25kX2FjOTdfcmVzdG9yZV9pZWM5NTgoYWM5Nyk7CiAJfQogfQorCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3Jlc3VtZSk7CiAjZW5kaWYKIAogCkBAIC0yNTkwLDI5ICsyNjEzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKgotICogIEV4cG9ydGVkIHN5bWJvbHMKLSAqLwotCi1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3dyaXRlKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfcmVhZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3dyaXRlX2NhY2hlKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfdXBkYXRlKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfdXBkYXRlX2JpdHMpOwotRVhQT1JUX1NZTUJPTChzbmRfYWM5N19nZXRfc2hvcnRfbmFtZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X2J1cyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X21peGVyKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfcGNtX2Fzc2lnbik7Ci1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3BjbV9vcGVuKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfcGNtX2Nsb3NlKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfcGNtX2RvdWJsZV9yYXRlX3J1bGVzKTsKIEVYUE9SVF9TWU1CT0woc25kX2FjOTdfdHVuZV9oYXJkd2FyZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3NldF9yYXRlKTsKLSNpZmRlZiBDT05GSUdfUE0KLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfcmVzdW1lKTsKLUVYUE9SVF9TWU1CT0woc25kX2FjOTdfc3VzcGVuZCk7Ci0jZW5kaWYKIAogLyoKICAqICBJTklUIHBhcnQKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwppbmRleCA0ZDljZjM3Li43ZjE5N2M3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCkBAIC00NjQsNiArNDY0LDEwIEBACiB7CiAJLyogV005NzA1LCBXTTk3MTAgKi8KIAlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfd29sZnNvbl93bTk3MDVfb3BzOworI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9XTTk3MDUKKwkvKiBXTTk3MDUgdG91Y2hzY3JlZW4gdXNlcyBBVVggYW5kIFZJREVPIGZvciB0b3VjaCAqLworCWFjOTctPmZsYWdzIHw9M0QgQUM5N19IQVNfTk9fVklERU8gfCBBQzk3X0hBU19OT19BVVg7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTM2Nyw2ICsxMzcxLDEzIEBACiAKIAlzbmRfYWM5N19yZXN0b3JlX2llYzk1OChhYzk3KTsKIH0KKworc3RhdGljIHZvaWQgYWQxODg4X3Jlc3VtZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcpCit7CisJYWQxOHh4X3Jlc3VtZShhYzk3KTsKKwlzbmRfYWM5N193cml0ZV9jYWNoZShhYzk3LCBBQzk3X0NPREVDX0NMQVNTX1JFViwgMHg4MDgwKTsKK30KKwogI2VuZGlmCiAKIGludCBwYXRjaF9hZDE4MTkoc3RydWN0IHNuZF9hYzk3ICogYWM5NykKQEAgLTE2MjcsNiArMTYzOCw3IEBACiAgKiAoU1MgdmVuZG9yIDw8IDE2IHwgZGV2aWNlKQogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IGFkMTk4MV9qYWNrc19ibGFja2xpc3RbXSA9IHsKKwkweDEwMTQwNTM3LCAvKiBUaGlua3BhZCBUNDFwICovCiAJMHgxMDE0MDU1NCwgLyogVGhpbmtwYWQgVDQycC9SNTBwICovCiAJMCAvKiBlbmQgKi8KIH07CkBAIC0xODM5LDcgKzE4NTEsNyBAQAogCS5idWlsZF9wb3N0X3NwZGlmID0gcGF0Y2hfYWQxOTh4X3Bvc3Rfc3BkaWYsCiAJLmJ1aWxkX3NwZWNpZmljID0gcGF0Y2hfYWQxODg4X3NwZWNpZmljLAogI2lmZGVmIENPTkZJR19QTQotCS5yZXN1bWUgPSBhZDE4eHhfcmVzdW1lLAorCS5yZXN1bWUgPSBhZDE4ODhfcmVzdW1lLAogI2VuZGlmCiAJLnVwZGF0ZV9qYWNrcyA9IGFkMTg4OF91cGRhdGVfamFja3MsCiB9OwpAQCAtMjA0OCw3ICsyMDYwLDEwIEBACiAJLyogRW5hYmxlIFNQRElGLUlOIG9ubHkgb24gUmV2LkUgYW5kIGFib3ZlICovCiAJdmFsID0gc25kX2FjOTdfcmVhZChhYzk3LCBBQzk3X0FMQzY1MF9DTE9DSyk7CiAJLyogU1BESUYgSU4gd2l0aCBwaW4gNDcgKi8KLQlpZiAoYWM5Ny0+c3BlYy5kZXZfZmxhZ3MpCisJaWYgKGFjOTctPnNwZWMuZGV2X2ZsYWdzICYmCisJICAgIC8qIEFTVVMgQTZLTSByZXF1aXJlcyBFQVBEICovCisJICAgICEgKGFjOTctPnN1YnN5c3RlbV92ZW5kb3IgPT0gMHgxMDQzICYmCisJICAgICAgIGFjOTctPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgxMTAzKSkKIAkJdmFsIHw9IDB4MDM7IC8qIGVuYWJsZSAqLwogCWVsc2UKIAkJdmFsICY9IH4weDAzOyAvKiBkaXNhYmxlICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wY20uYwppbmRleCA1MTJhMzU4Li5mNjg0YWEyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BjbS5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGNtLmMKQEAgLTMxNyw2ICszMTcsOCBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9hYzk3X3NldF9yYXRlKTsKKwogc3RhdGljIHVuc2lnbmVkIHNob3J0IGdldF9wc2xvdHMoc3RydWN0IHNuZF9hYzk3ICphYzk3LCB1bnNpZ25lZCBjaGFyICpyYXRlX3RhYmxlLCB1bnNpZ25lZCBzaG9ydCAqc3BkaWZfc2xvdHMpCiB7CiAJaWYgKCFhYzk3X2lzX2F1ZGlvKGFjOTcpKQpAQCAtNTUwLDYgKzU1Miw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2FjOTdfcGNtX2Fzc2lnbik7CisKIC8qKgogICogc25kX2FjOTdfcGNtX29wZW4gLSBvcGVucyB0aGUgZ2l2ZW4gQUM5NyBwY20KICAqIEBwY206IHRoZSBhYzk3IHBjbSBpbnN0YW5jZQpAQCAtNjMzLDYgKzYzNyw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N19wY21fb3Blbik7CisKIC8qKgogICogc25kX2FjOTdfcGNtX2Nsb3NlIC0gY2xvc2VzIHRoZSBnaXZlbiBBQzk3IHBjbQogICogQHBjbTogdGhlIGFjOTcgcGNtIGluc3RhbmNlCkBAIC02NTgsNiArNjY0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfYWM5N19wY21fY2xvc2UpOworCiBzdGF0aWMgaW50IGRvdWJsZV9yYXRlX2h3X2NvbnN0cmFpbnRfcmF0ZShzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKIAkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19ydWxlICpydWxlKQogewpAQCAtNzA5LDMgKzcxNyw1IEBACiAJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgLTEpOwogCXJldHVybiBlcnI7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX2FjOTdfcGNtX2RvdWJsZV9yYXRlX3J1bGVzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcHJvYy5jIGIvc291bmQvcGNpL2FjOTcvYWM5N19wcm9jLmMKaW5kZXggNGQ1MjNkZi4uMjExOGRmNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19wcm9jLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wcm9jLmMKQEAgLTQzMyw3ICs0MzMsNyBAQAogCXByZWZpeCA9IGFjOTdfaXNfYXVkaW8oYWM5NykgPyAiYWM5NyIgOiAibWM5NyI7CiAJc3ByaW50ZihuYW1lLCAiJXMjJWQtJWQiLCBwcmVmaXgsIGFjOTctPmFkZHIsIGFjOTctPm51bSk7CiAJaWYgKChlbnRyeSA9IHNuZF9pbmZvX2NyZWF0ZV9jYXJkX2VudHJ5KGFjOTctPmJ1cy0+Y2FyZCwgbmFtZSwgYWM5Ny0+YnVzLT5wcm9jKSkgIT0gTlVMTCkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGFjOTcsIDEwMjQsIHNuZF9hYzk3X3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgYWM5Nywgc25kX2FjOTdfcHJvY19yZWFkKTsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwogCQkJZW50cnkgPSBOVUxMOwpAQCAtNDQyLDEwICs0NDIsOSBAQAogCWFjOTctPnByb2MgPSBlbnRyeTsKIAlzcHJpbnRmKG5hbWUsICIlcyMlZC0lZCtyZWdzIiwgcHJlZml4LCBhYzk3LT5hZGRyLCBhYzk3LT5udW0pOwogCWlmICgoZW50cnkgPSBzbmRfaW5mb19jcmVhdGVfY2FyZF9lbnRyeShhYzk3LT5idXMtPmNhcmQsIG5hbWUsIGFjOTctPmJ1cy0+cHJvYykpICE9IE5VTEwpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBhYzk3LCAxMDI0LCBzbmRfYWM5N19wcm9jX3JlZ3NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgYWM5Nywgc25kX2FjOTdfcHJvY19yZWdzX3JlYWQpOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKLQkJZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gMTAyNDsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9hYzk3X3Byb2NfcmVnc193cml0ZTsKICNlbmRpZgogCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FjOTcvYWs0NTMxX2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYwppbmRleCAwZmI3YjM0Li45NGMyNmVjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYworKysgYi9zb3VuZC9wY2kvYWM5Ny9hazQ1MzFfY29kZWMuYwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNhcmQsICJhazQ1MzEiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGFrNDUzMSwgMTAyNCwgc25kX2FrNDUzMV9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGFrNDUzMSwgc25kX2FrNDUzMV9wcm9jX3JlYWQpOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hZDE4ODkuYyBiL3NvdW5kL3BjaS9hZDE4ODkuYwppbmRleCBlZWNlMWM3Li5kNDJiZjQ1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWQxODg5LmMKKysrIGIvc291bmQvcGNpL2FkMTg4OS5jCkBAIC03NTMsNyArNzUzLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCBjaGlwLT5jYXJkLT5kcml2ZXIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX2FkMTg4OV9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF9hZDE4ODlfcHJvY19yZWFkKTsKIH0KIAogc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMgYi9zb3VuZC9wY2kvYWxpNTQ1MS9hbGk1NDUxLmMKaW5kZXggZTJkYmMyMS4uNWRmZGJmNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsaTU0NTEvYWxpNTQ1MS5jCisrKyBiL3NvdW5kL3BjaS9hbGk1NDUxL2FsaTU0NTEuYwpAQCAtNDksNyArNDksNyBAQAogc3RhdGljIGludCBpbmRleCA9IFNORFJWX0RFRkFVTFRfSURYMTsJLyogSW5kZXggKi8KIHN0YXRpYyBjaGFyICppZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwogc3RhdGljIGludCBwY21fY2hhbm5lbHMgPSAzMjsKLXN0YXRpYyBpbnQgc3BkaWYgPSAwOworc3RhdGljIGludCBzcGRpZjsKIAogbW9kdWxlX3BhcmFtKGluZGV4LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBBTEkgTTU0NTEgUENJIEF1ZGlvLiIpOwpAQCAtMjE3Myw3ICsyMTczLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCWlmKCFzbmRfY2FyZF9wcm9jX25ldyhjb2RlYy0+Y2FyZCwgImFsaTU0NTEiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNvZGVjLCAxMDI0LCBzbmRfYWxpX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY29kZWMsIHNuZF9hbGlfcHJvY19yZWFkKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgc25kX2FsaV9yZXNvdXJjZXMoc3RydWN0IHNuZF9hbGkgKmNvZGVjKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FsczQwMDAuYyBiL3NvdW5kL3BjaS9hbHM0MDAwLmMKaW5kZXggNjA0MjNiMS4uYTlmMDgwNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FsczQwMDAuYworKysgYi9zb3VuZC9wY2kvYWxzNDAwMC5jCkBAIC03NDYsOCArNzQ2LDggQEAKIAkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5hbHRfcG9ydCwgY2hpcC0+aXJxKTsKIAogCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyggY2FyZCwgMCwgTVBVNDAxX0hXX0FMUzQwMDAsCi0JCQkJICAgICAgICBnY3IrMHgzMCwgMSwgcGNpLT5pcnEsIDAsCi0JCQkJICAgICAgICAmY2hpcC0+cm1pZGkpKSA8IDApIHsKKwkJCQkgICAgICAgIGdjcisweDMwLCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAorCQkJCQlwY2ktPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYWxzNDAwMDogbm8gTVBVLTQwMSBkZXZpY2UgYXQgMHglbHg/XG4iLCBnY3IrMHgzMCk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKaW5kZXggZDBmNzU5ZC4uZjE4YThjMCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cC5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMTUwNCw3ICsxNTA0LDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImF0aWl4cCIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX2F0aWl4cF9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF9hdGlpeHBfcHJvY19yZWFkKTsKIH0KICNlbHNlIC8qICFDT05GSUdfUFJPQ19GUyAqLwogI2RlZmluZSBzbmRfYXRpaXhwX3Byb2NfaW5pdChjaGlwKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jIGIvc291bmQvcGNpL2F0aWl4cF9tb2RlbS5jCmluZGV4IDEyYTM0YzMuLjQwNzM5MDUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdGlpeHBfbW9kZW0uYworKysgYi9zb3VuZC9wY2kvYXRpaXhwX21vZGVtLmMKQEAgLTExNzcsNyArMTE3Nyw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJhdGlpeHAtbW9kZW0iLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHNuZF9hdGlpeHBfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBzbmRfYXRpaXhwX3Byb2NfcmVhZCk7CiB9CiAjZWxzZQogI2RlZmluZSBzbmRfYXRpaXhwX3Byb2NfaW5pdChjaGlwKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwLmMKaW5kZXggMTI2ODcwZS4uOGEzYjExOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDAuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MC5jCkBAIC0yNjEsNiArMjYxLDEzIEBACiAJCXJldHVybiBlcnI7CiAJfQogCXNuZF92b3J0ZXhfd29ya2Fyb3VuZChwY2ksIHBjaWZpeFtkZXZdKTsKKworCS8vIENhcmQgZGV0YWlscyBuZWVkZWQgaW4gc25kX3ZvcnRleF9taWRpCisJc3RyY3B5KGNhcmQtPmRyaXZlciwgQ0FSRF9OQU1FX1NIT1JUKTsKKwlzcHJpbnRmKGNhcmQtPnNob3J0bmFtZSwgIkF1cmVhbCBWb3J0ZXggJXMiLCBDQVJEX05BTUVfU0hPUlQpOworCXNwcmludGYoY2FyZC0+bG9uZ25hbWUsICIlcyBhdCAweCVseCBpcnEgJWkiLAorCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPmlvLCBjaGlwLT5pcnEpOworCiAJLy8gKDQpIEFsbG9jIGNvbXBvbmVudHMuCiAJLy8gQURCIHBjbS4KIAlpZiAoKGVyciA9IHNuZF92b3J0ZXhfbmV3X3BjbShjaGlwLCBWT1JURVhfUENNX0FEQiwgTlJfQURCKSkgPCAwKSB7CkBAIC0zMjMsMTEgKzMzMCw2IEBACiAjZW5kaWYKIAogCS8vICg1KQotCXN0cmNweShjYXJkLT5kcml2ZXIsIENBUkRfTkFNRV9TSE9SVCk7Ci0Jc3RyY3B5KGNhcmQtPnNob3J0bmFtZSwgQ0FSRF9OQU1FX1NIT1JUKTsKLQlzcHJpbnRmKGNhcmQtPmxvbmduYW1lLCAiJXMgYXQgMHglbHggaXJxICVpIiwKLQkJY2FyZC0+c2hvcnRuYW1lLCBjaGlwLT5pbywgY2hpcC0+aXJxKTsKLQogCWlmICgoZXJyID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpLCBQQ0lfREVWSUNFX0lELAogCQkJCSAgJihjaGlwLT5kZXZpY2UpKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF9tcHU0MDEuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21wdTQwMS5jCmluZGV4IDg3M2Y0ODYuLmM3NWQzNjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21wdTQwMS5jCisrKyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX21wdTQwMS5jCkBAIC00Nyw3ICs0Nyw3IEBACiAJc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaTsKIAlpbnQgdGVtcCwgbW9kZTsKIAlzdHJ1Y3Qgc25kX21wdTQwMSAqbXB1OwotCWludCBwb3J0OworCXVuc2lnbmVkIGxvbmcgcG9ydDsKIAogI2lmZGVmIFZPUlRFWF9NUFU0MDFfTEVHQUNZCiAJLyogRW5hYmxlSGFyZENvZGVkTVBVNDAxUG9ydCgpICovCkBAIC03MCw5ICs3MCw2IEBACiAJdGVtcCB8PSAoTUlESV9DTE9DS19ESVYgPDwgOCkgfCAoKG1vZGUgPj4gMjQpICYgMHhmZikgPDwgNDsKIAlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX0NUUkwyLCB0ZW1wKTsKIAlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfQ01ELCBNUFU0MDFfUkVTRVQpOwotCS8qIFNldCBzb21lIGtpbmQgb2YgbW9kZSAqLwotCWlmIChtb2RlKQotCQlod3dyaXRlKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfQ01ELCBNUFU0MDFfRU5URVJfVUFSVCk7CiAKIAkvKiBDaGVjayBpZiBhbnl0aGluZyBpcyBPSy4gKi8KIAl0ZW1wID0gaHdyZWFkKHZvcnRleC0+bW1pbywgVk9SVEVYX01JRElfREFUQSk7CkBAIC05OCw3ICs5NSw4IEBACiAJcG9ydCA9ICh1bnNpZ25lZCBsb25nKSh2b3J0ZXgtPm1taW8gKyBWT1JURVhfTUlESV9EQVRBKTsKIAlpZiAoKHRlbXAgPQogCSAgICAgc25kX21wdTQwMV91YXJ0X25ldyh2b3J0ZXgtPmNhcmQsIDAsIE1QVTQwMV9IV19BVVJFQUwsIHBvcnQsCi0JCQkJIDEsIDAsIDAsICZybWlkaSkpICE9IDApIHsKKwkJCQkgTVBVNDAxX0lORk9fSU5URUdSQVRFRCB8IE1QVTQwMV9JTkZPX01NSU8sCisJCQkJIDAsIDAsICZybWlkaSkpICE9IDApIHsKIAkJaHd3cml0ZSh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMLAogCQkJKGh3cmVhZCh2b3J0ZXgtPm1taW8sIFZPUlRFWF9DVFJMKSAmCiAJCQkgfkNUUkxfTUlESV9QT1JUKSAmIH5DVFJMX01JRElfRU4pOwpAQCAtMTA3LDYgKzEwNSw5IEBACiAJbXB1ID0gcm1pZGktPnByaXZhdGVfZGF0YTsKIAltcHUtPmNwb3J0ID0gKHVuc2lnbmVkIGxvbmcpKHZvcnRleC0+bW1pbyArIFZPUlRFWF9NSURJX0NNRCk7CiAjZW5kaWYKKwkvKiBPdmVyd3JpdGUgTUlESSBuYW1lICovCisJc25wcmludGYocm1pZGktPm5hbWUsIHNpemVvZihybWlkaS0+bmFtZSksICIlcyBNSURJICVkIiwgQ0FSRF9OQU1FX1NIT1JUICwgdm9ydGV4LT5jYXJkLT5udW1iZXIpOworCiAJdm9ydGV4LT5ybWlkaSA9IHJtaWRpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfeHRhbGsuYyBiL3NvdW5kL3BjaS9hdTg4eDAvYXU4OHgwX3h0YWxrLmMKaW5kZXggNDUzNGUxOC4uYjQxNTFlMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F1ODh4MC9hdTg4eDBfeHRhbGsuYworKysgYi9zb3VuZC9wY2kvYXU4OHgwL2F1ODh4MF94dGFsay5jCkBAIC02NiwzMSArNjYsMjAgQEAKIAkwCiAJICAgIC8vMHg3RkZGLDB4N0ZGRiwweDdGRkYsMHg3RkZGLDB4N2ZmZiwweDdGRkYsMHg3RkZGLDB4N0ZGRiwweDdGRkYsMHg3ZmZmCiB9Owotc3RhdGljIHh0YWxrX2dhaW5zX3QgY29uc3QgYXNYdGFsa0dhaW5zWmVyb3MgPSB7Ci0JMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKK3N0YXRpYyB4dGFsa19nYWluc190IGNvbnN0IGFzWHRhbGtHYWluc1plcm9zOwogCi1zdGF0aWMgeHRhbGtfZGxpbmVfdCBjb25zdCBhbFh0YWxrRGxpbmVaZXJvcyA9IHsKLQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsCi0JMCwgMCwgMCwgMCwgMCwgMCwgMAotfTsKK3N0YXRpYyB4dGFsa19kbGluZV90IGNvbnN0IGFsWHRhbGtEbGluZVplcm9zOwogc3RhdGljIHh0YWxrX2RsaW5lX3QgY29uc3QgYWxYdGFsa0RsaW5lVGVzdCA9IHsKIAkweEZDMTgsIDB4MDNFOEZGRkYsIDB4MTg2QTAsIDB4Nzk2MEZGRkUsIDEsIDB4RkZGRkZGRkYsCiAJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIAkwLCAwLCAwLCAwCiB9OwogCi1zdGF0aWMgeHRhbGtfaW5zdGF0ZV90IGNvbnN0IGFzWHRhbGtJblN0YXRlWmVyb3MgPSB7IDAsIDAsIDAsIDAgfTsKK3N0YXRpYyB4dGFsa19pbnN0YXRlX3QgY29uc3QgYXNYdGFsa0luU3RhdGVaZXJvczsKIHN0YXRpYyB4dGFsa19pbnN0YXRlX3QgY29uc3QgYXNYdGFsa0luU3RhdGVUZXN0ID0KICAgICB7IDB4RkY4MCwgMHgwMDgwLCAweEZGRkYsIDB4MDAwMSB9Owotc3RhdGljIHh0YWxrX3N0YXRlX3QgY29uc3QgYXNYdGFsa091dFN0YXRlWmVyb3MgPSB7Ci0JezAsIDAsIDAsIDB9LAotCXswLCAwLCAwLCAwfSwKLQl7MCwgMCwgMCwgMH0sCi0JezAsIDAsIDAsIDB9LAotCXswLCAwLCAwLCAwfQotfTsKK3N0YXRpYyB4dGFsa19zdGF0ZV90IGNvbnN0IGFzWHRhbGtPdXRTdGF0ZVplcm9zOworCiBzdGF0aWMgc2hvcnQgY29uc3Qgc0RpYW1vbmRLTGVmdEVxID0gMHg0MDFkOwogc3RhdGljIHNob3J0IGNvbnN0IHNEaWFtb25kS1JpZ2h0RXEgPSAweDQwMWQ7CiBzdGF0aWMgc2hvcnQgY29uc3Qgc0RpYW1vbmRLTGVmdFh0ID0gMHhGOTBFOwpAQCAtMTYyLDEzICsxNTEsNyBAQAogCXswLCAwLCAwLCAwLCAwfQogfTsKIAotc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa0NvZWZzWmVyb3MgPSB7Ci0JezAsIDAsIDAsIDAsIDB9LAotCXswLCAwLCAwLCAwLCAwfSwKLQl7MCwgMCwgMCwgMCwgMH0sCi0JezAsIDAsIDAsIDAsIDB9LAotCXswLCAwLCAwLCAwLCAwfQotfTsKK3N0YXRpYyB4dGFsa19jb2Vmc190IGNvbnN0IGFzWHRhbGtDb2Vmc1plcm9zOwogc3RhdGljIHh0YWxrX2NvZWZzX3QgY29uc3QgYXNYdGFsa0NvZWZzUGlwZSA9IHsKIAl7MCwgMCwgMHgwRkEwLCAwLCAwfSwKIAl7MCwgMCwgMHgwRkEwLCAwLCAwfSwKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9henQzMzI4LmMgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCmluZGV4IDUyYTM2NDUuLjZlNjJkYWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9henQzMzI4LmMKKysrIGIvc291bmQvcGNpL2F6dDMzMjguYwpAQCAtMzMsMTQgKzMzLDIxIEBACiAgKiAgaW4gdGhlIGZpcnN0IHBsYWNlID46LVB9KSwKICAqICBJIHdhcyBmb3JjZWQgdG8gYmFzZSB0aGlzIGRyaXZlciBvbiByZXZlcnNlIGVuZ2luZWVyaW5nCiAgKiAgKDMgd2Vla3MnIHdvcnRoIG9mIGV2ZW5pbmdzIGZpbGxlZCB3aXRoIGRyaXZlciB3b3JrKS4KLSAqICAoYW5kIG5vLCBJIGRpZCBOT1QgZ28gdGhlIGVhc3kgd2F5OiB0byBwaWNrIHVwIGEgUENJMTI4IGZvciA5IEV1cm9zKQorICogIChhbmQgbm8sIEkgZGlkIE5PVCBnbyB0aGUgZWFzeSB3YXk6IHRvIHBpY2sgdXAgYSBTQiBQQ0kxMjggZm9yIDkgRXVyb3MpCiAgKgogICogIFRoZSBBWkYzMzI4IGNoaXAgKG5vdGU6IEFaRjMzMjgsICpub3QqIEFaVDMzMjgsIHRoYXQncyBqdXN0IHRoZSBkcml2ZXIgbmFtZQogICogIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMpIGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgogICoKICAqICAtIGJ1aWx0aW4gQUM5NyBjb25mb3JtYW50IGNvZGVjIChTTlIgb3ZlciA4MGRCKQotICogICAgKHJlYWxseSBBQzk3IGNvbXBsaWFudD8/IEkgcmVhbGx5IGRvdWJ0IGl0IHdoZW4gbG9va2luZwotICogICAgYXQgdGhlIG1peGVyIHJlZ2lzdGVyIGxheW91dCkKKyAqICAgIE5vdGUgdGhhdCAiY29uZm9ybWFudCIgIT0gImNvbXBsaWFudCIhISB0aGlzIGNoaXAncyBtaXhlciByZWdpc3RlciBsYXlvdXQKKyAqICAgICpkaWZmZXJzKiBmcm9tIHRoZSBzdGFuZGFyZCBBQzk3IGxheW91dDoKKyAqICAgIHRoZXkgY2hvc2UgdG8gbm90IGltcGxlbWVudCB0aGUgaGVhZHBob25lIHJlZ2lzdGVyICh3aGljaCBpcyBub3QgYQorICogICAgcHJvYmxlbSBzaW5jZSBpdCdzIG1lcmVseSBvcHRpb25hbCksIHlldCB3aGVuIGRvaW5nIHRoaXMsIHRoZXkgY29tbWl0dGVkCisgKiAgICB0aGUgZ3JhdmUgc2luIG9mIGxldHRpbmcgb3RoZXIgcmVnaXN0ZXJzIGZvbGxvdyBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mCisgKiAgICBrZWVwaW5nIGEgaGVhZHBob25lIGR1bW15IHJlZ2lzdGVyLCB0aGVyZWJ5IHNoaWZ0aW5nIHRoZSBtaXhlciByZWdpc3RlcgorICogICAgYWRkcmVzc2VzIGlsbGVnYWxseS4gU28gZmFyIHVuZm9ydHVuYXRlbHkgaXQgbG9va3MgbGlrZSB0aGUgdmVyeSBmbGV4aWJsZQorICogICAgQUxTQSBBQzk3IHN1cHBvcnQgaXMgc3RpbGwgbm90IGVub3VnaCB0byBlYXNpbHkgY29tcGVuc2F0ZSBmb3Igc3VjaCBhCisgKiAgICBncmF2ZSBsYXlvdXQgdmlvbGF0aW9uIGRlc3BpdGUgYWxsIHR3ZWFrcyBhbmQgcXVpcmtzIG1lY2hhbmlzbXMgaXQgb2ZmZXJzLgogICogIC0gYnVpbHRpbiBnZW51aW5lIE9QTDMKICAqICAtIGZ1bGwgZHVwbGV4IDE2Yml0IHBsYXliYWNrL3JlY29yZCBhdCBpbmRlcGVuZGVudCBzYW1wbGluZyByYXRlCiAgKiAgLSBNUFU0MDEgKCsgbGVnYWN5IGFkZHJlc3Mgc3VwcG9ydCkgRklYTUU6IGhvdyB0byBlbmFibGUgbGVnYWN5IGFkZHI/PwpAQCAtOTAsMTAgKzk3LDE1IEBACiAgKiAKICAqIFRPRE8KICAqICAtIHRlc3QgTVBVNDAxIE1JREkgcGxheWJhY2sgZXRjLgotICogIC0gcG93ZXIgbWFuYWdlbWVudC4gU2VlIGUuZy4gaW50ZWw4eDAgb3IgY3M0MjgxLgotICogICAgVGhpcyB3b3VsZCBiZSBuaWNlIHNpbmNlIHRoZSBjaGlwIHJ1bnMgYSBiaXQgaG90LCBhbmQgaXQncyAqcmVxdWlyZWQqCi0gKiAgICBhbnl3YXkgZm9yIHByb3BlciBBQ1BJIHBvd2VyIG1hbmFnZW1lbnQuCisgKiAgLSBhZGQgc29tZSBwb3dlciBtaWNyby1tYW5hZ2VtZW50IChkaXNhYmxlIHZhcmlvdXMgdW5pdHMgb2YgdGhlIGNhcmQKKyAqICAgIGFzIGxvbmcgYXMgdGhleSdyZSB1bnVzZWQpLiBIb3dldmVyIHRoaXMgcmVxdWlyZXMgSS9PIHBvcnRzIHdoaWNoIEkKKyAqICAgIGhhdmVuJ3QgZmlndXJlZCBvdXQgeWV0IGFuZCB3aGljaCB0aHVzIG1pZ2h0IG5vdCBldmVuIGV4aXN0Li4uCisgKiAgICBUaGUgc3RhbmRhcmQgc3VzcGVuZC9yZXN1bWUgZnVuY3Rpb25hbGl0eSBjb3VsZCBwcm9iYWJseSBtYWtlIHVzZSBvZgorICogICAgc29tZSBpbXByb3ZlbWVudCwgdG9vLi4uCiAgKiAgLSBmaWd1cmUgb3V0IHdoYXQgYWxsIHVua25vd24gcG9ydCBiaXRzIGFyZSByZXNwb25zaWJsZSBmb3IKKyAqICAtIGZpZ3VyZSBvdXQgc29tZSBjbGV2ZXJseSBldmlsIHNjaGVtZSB0byBwb3NzaWJseSBtYWtlIEFMU0EgQUM5NyBjb2RlCisgKiAgICBmdWxseSBhY2NlcHQgb3VyIHF1aXRlIGluY29tcGF0aWJsZSAiIkFDOTciIiBtaXhlciBhbmQgdGh1cyBzYXZlIHNvbWUKKyAqICAgIGNvZGUgKGJ1dCBJJ20gbm90IHRvbyBvcHRpbWlzdGljIHRoYXQgZG9pbmcgdGhpcyBpcyBwb3NzaWJsZSBhdCBhbGwpCiAgKi8KIAogI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgpAQCAtMjE0LDYgKzIyNiwxNiBAQAogCiAJc3RydWN0IHBjaV9kZXYgKnBjaTsKIAlpbnQgaXJxOworCisjaWZkZWYgQ09ORklHX1BNCisJLyogcmVnaXN0ZXIgdmFsdWUgY29udGFpbmVycyBmb3IgcG93ZXIgbWFuYWdlbWVudAorCSAqIE5vdGU6IG5vdCBhbHdheXMgZnVsbCBJL08gcmFuZ2UgcHJlc2VydmVkIChqdXN0IGxpa2UgV2luIGRyaXZlciEpICovCisJdTE2IHNhdmVkX3JlZ3NfY29kZWMgW0FaRl9JT19TSVpFX0NPREVDX1BNIC8gMl07CisJdTE2IHNhdmVkX3JlZ3NfaW8yICAgW0FaRl9JT19TSVpFX0lPMl9QTSAvIDJdOworCXUxNiBzYXZlZF9yZWdzX21wdSAgIFtBWkZfSU9fU0laRV9NUFVfUE0gLyAyXTsKKwl1MTYgc2F2ZWRfcmVnc19zeW50aFtBWkZfSU9fU0laRV9TWU5USF9QTSAvIDJdOworCXUxNiBzYXZlZF9yZWdzX21peGVyW0FaRl9JT19TSVpFX01JWEVSX1BNIC8gMl07CisjZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBzbmRfYXpmMzMyOF9pZHNbXSBfX2RldmluaXRkYXRhID0gewpAQCAtMzE3LDEwICszMzksOCBAQAogCWVsc2UKIAkJZHN0X3ZvbF9sZWZ0ICY9IH4weDgwOwogCi0JZG8KLQl7Ci0JCWlmICghbGVmdF9kb25lKQotCQl7CisJZG8geworCQlpZiAoIWxlZnRfZG9uZSkgewogCQkJaWYgKGN1cnJfdm9sX2xlZnQgPiBkc3Rfdm9sX2xlZnQpCiAJCQkJY3Vycl92b2xfbGVmdC0tOwogCQkJZWxzZQpAQCAtMzMwLDggKzM1MCw3IEBACiAJCQkgICAgbGVmdF9kb25lID0gMTsKIAkJCW91dGIoY3Vycl92b2xfbGVmdCwgcG9ydGJhc2UgKyAxKTsKIAkJfQotCQlpZiAoIXJpZ2h0X2RvbmUpCi0JCXsKKwkJaWYgKCFyaWdodF9kb25lKSB7CiAJCQlpZiAoY3Vycl92b2xfcmlnaHQgPiBkc3Rfdm9sX3JpZ2h0KQogCQkJCWN1cnJfdm9sX3JpZ2h0LS07CiAJCQllbHNlCkBAIC0zNDYsOCArMzY1LDcgQEAKIAkJfQogCQlpZiAoZGVsYXkpCiAJCQltZGVsYXkoZGVsYXkpOwotCX0KLQl3aGlsZSAoKCFsZWZ0X2RvbmUpIHx8ICghcmlnaHRfZG9uZSkpOworCX0gd2hpbGUgKCghbGVmdF9kb25lKSB8fCAoIXJpZ2h0X2RvbmUpKTsKIAlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIApAQCAtNTE0LDE1ICs1MzIsMTggQEAKIAkJCSAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHMxW10gPSB7Ci0JCSJNb2RlbU91dDEiLCAiTW9kZW1PdXQyIgorCQkiTWljMSIsICJNaWMyIgogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0czJbXSA9IHsKLQkJIk1vbm9TZWxlY3RTb3VyY2UxIiwgIk1vbm9TZWxlY3RTb3VyY2UyIgorCQkiTWl4IiwgIk1pYyIKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHMzW10gPSB7CiAgICAgICAgICAgICAgICAgIk1pYyIsICJDRCIsICJWaWRlbyIsICJBdXgiLAogCQkiTGluZSIsICJNaXgiLCAiTWl4IE1vbm8iLCAiUGhvbmUiCiAgICAgICAgIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXh0czRbXSA9IHsKKwkJInByZSAzRCIsICJwb3N0IDNEIgorICAgICAgICB9OwogCXN0cnVjdCBhemYzMzI4X21peGVyX3JlZyByZWc7CiAKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKQEAgLTUzMSwxNCArNTUyLDE5IEBACiAgICAgICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gcmVnLmVudW1fYzsKICAgICAgICAgaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiByZWcuZW51bV9jIC0gMVUpCiAgICAgICAgICAgICAgICAgdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbSA9IHJlZy5lbnVtX2MgLSAxVTsKLQlpZiAocmVnLnJlZyA9PSBJRFhfTUlYRVJfQURWQ1RMMikKLQl7Ci0JCWlmIChyZWcubGNoYW5fc2hpZnQgPT0gOCkgLyogbW9kZW0gb3V0IHNlbCAqLworCWlmIChyZWcucmVnID09IElEWF9NSVhFUl9BRFZDVEwyKSB7CisJCXN3aXRjaChyZWcubGNoYW5fc2hpZnQpIHsKKwkJY2FzZSA4OiAvKiBtb2RlbSBvdXQgc2VsICovCiAJCQlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHMxW3VpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1dKTsKLQkJZWxzZSAvKiBtb25vIHNlbCBzb3VyY2UgKi8KKwkJCWJyZWFrOworCQljYXNlIDk6IC8qIG1vbm8gc2VsIHNvdXJjZSAqLwogCQkJc3RyY3B5KHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLm5hbWUsIHRleHRzMlt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7Ci0JfQotCWVsc2UKKwkJCWJyZWFrOworCQljYXNlIDE1OiAvKiBQQ00gT3V0IFBhdGggKi8KKwkJCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0czRbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKICAgICAgICAgCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0czNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0KICk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtNTU0LDEyICs1ODAsMTAgQEAKICAgICAgICAgCiAJc25kX2F6ZjMzMjhfbWl4ZXJfcmVnX2RlY29kZSgmcmVnLCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CiAJdmFsID0gc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHJlZy5yZWcpOwotCWlmIChyZWcucmVnID09IElEWF9NSVhFUl9SRUNfU0VMRUNUKQotCXsKKwlpZiAocmVnLnJlZyA9PSBJRFhfTUlYRVJfUkVDX1NFTEVDVCkgewogICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICh2YWwgPj4gOCkgJiAocmVnLmVudW1fYyAtIDEpOwogICAgICAgICAJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVsxXSA9ICh2YWwgPj4gMCkgJiAocmVnLmVudW1fYyAtIDEpOwotCX0KLQllbHNlCisJfSBlbHNlCiAgICAgICAgIAl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHZhbCA+PiByZWcubGNoYW5fc2hpZnQpICYgKHJlZy5lbnVtX2MgLSAxKTsKIAogCXNuZF9hemYzMzI4X2RiZ21peGVyKCJnZXRfZW51bTogJTAyeCBpcyAlMDR4IC0+ICVkfCVkIChzaGlmdCAlMDJkLCBlbnVtX2MgJWQpXG4iLApAQCAtNTc5LDE2ICs2MDMsMTMgQEAKIAlzbmRfYXpmMzMyOF9taXhlcl9yZWdfZGVjb2RlKCZyZWcsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKIAlvcmVnID0gc25kX2F6ZjMzMjhfbWl4ZXJfaW53KGNoaXAsIHJlZy5yZWcpOwogCXZhbCA9IG9yZWc7Ci0JaWYgKHJlZy5yZWcgPT0gSURYX01JWEVSX1JFQ19TRUxFQ1QpCi0JeworCWlmIChyZWcucmVnID09IElEWF9NSVhFUl9SRUNfU0VMRUNUKSB7CiAgICAgICAgIAlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA+IHJlZy5lbnVtX2MgLSAxVSB8fAogICAgICAgICAgICAgCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPiByZWcuZW51bV9jIC0gMVUpCiAgICAgICAgICAgICAgICAgCXJldHVybiAtRUlOVkFMOwogICAgICAgICAJdmFsID0gKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPDwgOCkgfAogICAgICAgICAJICAgICAgKHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMV0gPDwgMCk7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKICAgICAgICAgCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID4gcmVnLmVudW1fYyAtIDFVKQogICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVJTlZBTDsKIAkJdmFsICY9IH4oKHJlZy5lbnVtX2MgLSAxKSA8PCByZWcubGNoYW5fc2hpZnQpOwpAQCAtNjI5LDEzICs2NTAsMTQgQEAKIAlBWkYzMzI4X01JWEVSX1ZPTF9NT05PKCJNb2RlbSBQbGF5YmFjayBWb2x1bWUiLCBJRFhfTUlYRVJfTU9ERU1PVVQsIDB4MWYsIDEpLAogCUFaRjMzMjhfTUlYRVJfU1dJVENIKCJNb2RlbSBDYXB0dXJlIFN3aXRjaCIsIElEWF9NSVhFUl9NT0RFTUlOLCAxNSwgMSksCiAJQVpGMzMyOF9NSVhFUl9WT0xfTU9OTygiTW9kZW0gQ2FwdHVyZSBWb2x1bWUiLCBJRFhfTUlYRVJfTU9ERU1JTiwgMHgxZiwgMSksCi0JQVpGMzMyOF9NSVhFUl9FTlVNKCJNb2RlbSBPdXQgU2VsZWN0IiwgSURYX01JWEVSX0FEVkNUTDIsIDIsIDgpLAotCUFaRjMzMjhfTUlYRVJfRU5VTSgiTW9ubyBTZWxlY3QgU291cmNlIiwgSURYX01JWEVSX0FEVkNUTDIsIDIsIDkpLAorCUFaRjMzMjhfTUlYRVJfRU5VTSgiTWljIFNlbGVjdCIsIElEWF9NSVhFUl9BRFZDVEwyLCAyLCA4KSwKKwlBWkYzMzI4X01JWEVSX0VOVU0oIk1vbm8gT3V0cHV0IFNlbGVjdCIsIElEWF9NSVhFUl9BRFZDVEwyLCAyLCA5KSwKKwlBWkYzMzI4X01JWEVSX0VOVU0oIlBDTSIsIElEWF9NSVhFUl9BRFZDVEwyLCAyLCAxNSksIC8qIFBDTSBPdXQgUGF0aCwgcGxhY2UgaW4gZnJvbnQgc2luY2UgaXQgY29udHJvbHMgKmJvdGgqIDNEIGFuZCBCYXNzL1RyZWJsZSEgKi8KIAlBWkYzMzI4X01JWEVSX1ZPTF9TUEVDSUFMKCJUb25lIENvbnRyb2wgLSBUcmVibGUiLCBJRFhfTUlYRVJfQkFTU1RSRUJMRSwgMHgwNywgMSwgMCksCiAJQVpGMzMyOF9NSVhFUl9WT0xfU1BFQ0lBTCgiVG9uZSBDb250cm9sIC0gQmFzcyIsIElEWF9NSVhFUl9CQVNTVFJFQkxFLCAweDA3LCA5LCAwKSwKIAlBWkYzMzI4X01JWEVSX1NXSVRDSCgiM0QgQ29udHJvbCAtIFN3aXRjaCIsIElEWF9NSVhFUl9BRFZDVEwyLCAxMywgMCksCi0JQVpGMzMyOF9NSVhFUl9WT0xfU1BFQ0lBTCgiM0QgQ29udHJvbCAtIFdpZGUiLCBJRFhfTUlYRVJfQURWQ1RMMSwgMHgwNywgMSwgMCksIC8qICIzRCBXaWR0aCIgKi8KLQlBWkYzMzI4X01JWEVSX1ZPTF9TUEVDSUFMKCIzRCBDb250cm9sIC0gU3BhY2UiLCBJRFhfTUlYRVJfQURWQ1RMMSwgMHgwMywgOCwgMCksIC8qICJIaWZpIDNEIiAqLworCUFaRjMzMjhfTUlYRVJfVk9MX1NQRUNJQUwoIjNEIENvbnRyb2wgLSBXaWR0aCIsIElEWF9NSVhFUl9BRFZDVEwxLCAweDA3LCAxLCAwKSwgLyogIjNEIFdpZHRoIiAqLworCUFaRjMzMjhfTUlYRVJfVk9MX1NQRUNJQUwoIjNEIENvbnRyb2wgLSBEZXB0aCIsIElEWF9NSVhFUl9BRFZDVEwxLCAweDAzLCA4LCAwKSwgLyogIkhpZmkgM0QiICovCiAjaWYgTUlYRVJfVEVTVElORwogCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIwIiwgSURYX01JWEVSX0FEVkNUTDIsIDAsIDApLAogCUFaRjMzMjhfTUlYRVJfU1dJVENIKCIxIiwgSURYX01JWEVSX0FEVkNUTDIsIDEsIDApLApAQCAtODEzLDIyICs4MzUsMTggQEAKIAl1bnNpZ25lZCBpbnQgaXNfcnVubmluZzsKIAogCXNuZF9hemYzMzI4X2RiZ2NhbGxlbnRlcigpOwotCWlmIChkb19yZWNvcmRpbmcpCi0JeworCWlmIChkb19yZWNvcmRpbmcpIHsKIAkJLyogYWNjZXNzIGNhcHR1cmUgcmVnaXN0ZXJzLCBpLmUuIHNraXAgcGxheWJhY2sgcmVnIHNlY3Rpb24gKi8KIAkJcG9ydGJhc2UgPSBjaGlwLT5jb2RlY19wb3J0ICsgMHgyMDsKIAkJaXNfcnVubmluZyA9IGNoaXAtPmlzX3JlY29yZGluZzsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQkvKiBhY2Nlc3MgdGhlIHBsYXliYWNrIHJlZ2lzdGVyIHNlY3Rpb24gKi8KIAkJcG9ydGJhc2UgPSBjaGlwLT5jb2RlY19wb3J0ICsgMHgwMDsKIAkJaXNfcnVubmluZyA9IGNoaXAtPmlzX3BsYXlpbmc7CiAJfQogCiAJLyogQVpGMzMyOCB1c2VzIGEgdHdvIGJ1ZmZlciBwb2ludGVyIERNQSBwbGF5YmFjayBhcHByb2FjaCAqLwotCWlmICghaXNfcnVubmluZykKLQl7CisJaWYgKCFpc19ydW5uaW5nKSB7CiAJCXVuc2lnbmVkIGxvbmcgYWRkcl9hcmVhMjsKIAkJdW5zaWduZWQgbG9uZyBjb3VudF9hcmVhcywgY291bnRfdG1wOyAvKiB3aWR0aCAzMmJpdCAtLSBvdmVyZmxvdyEhICovCiAJCWNvdW50X2FyZWFzID0gc2l6ZS8yOwpAQCAtOTYxLDYgKzk3OSwxMyBAQAogCQljaGlwLT5pc19wbGF5aW5nID0gMTsKIAkJc25kX2F6ZjMzMjhfZGJncGxheSgiU1RBUlRFRCBQTEFZQkFDS1xuIik7CiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJSRVNVTUUgUExBWUJBQ0tcbiIpOworCQkvKiByZXN1bWUgcGxheWJhY2sgaWYgd2Ugd2VyZSBhY3RpdmUgKi8KKwkJaWYgKGNoaXAtPmlzX3BsYXlpbmcpCisJCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNoaXAsIElEWF9JT19QTEFZX0ZMQUdTLAorCQkJCXNuZF9hemYzMzI4X2NvZGVjX2ludyhjaGlwLCBJRFhfSU9fUExBWV9GTEFHUykgfCBETUFfUkVTVU1FKTsKKwkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgogCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJTVE9QIFBMQVlCQUNLXG4iKTsKIApAQCAtOTg4LDYgKzEwMTMsMTIgQEAKIAkJY2hpcC0+aXNfcGxheWluZyA9IDA7CiAJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlNUT1BQRUQgUExBWUJBQ0tcbiIpOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlNVU1BFTkQgUExBWUJBQ0tcbiIpOworCQkvKiBtYWtlIHN1cmUgcGxheWJhY2sgaXMgc3RvcHBlZCAqLworCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNoaXAsIElEWF9JT19QTEFZX0ZMQUdTLAorCQkJc25kX2F6ZjMzMjhfY29kZWNfaW53KGNoaXAsIElEWF9JT19QTEFZX0ZMQUdTKSAmIH5ETUFfUkVTVU1FKTsKKwkJYnJlYWs7CiAgICAgICAgIGNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0ggTklZIVxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC05OTUsNiArMTAyNiw3IEBACiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFIE5JWSFcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkZJWE1FOiB1bmtub3duIHRyaWdnZXIgbW9kZSFcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogCX0KIAkKQEAgLTEwNjgsNiArMTEwMCwxMyBAQAogCQljaGlwLT5pc19yZWNvcmRpbmcgPSAxOwogCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJTVEFSVEVEIENBUFRVUkVcbiIpOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwkJc25kX2F6ZjMzMjhfZGJncGxheSgiUkVTVU1FIENBUFRVUkVcbiIpOworCQkvKiByZXN1bWUgcmVjb3JkaW5nIGlmIHdlIHdlcmUgYWN0aXZlICovCisJCWlmIChjaGlwLT5pc19yZWNvcmRpbmcpCisJCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNoaXAsIElEWF9JT19SRUNfRkxBR1MsCisJCQkJc25kX2F6ZjMzMjhfY29kZWNfaW53KGNoaXAsIElEWF9JT19SRUNfRkxBR1MpIHwgRE1BX1JFU1VNRSk7CisJCWJyZWFrOwogICAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlNUT1AgQ0FQVFVSRVxuIik7CiAKQEAgLTEwODgsNiArMTEyNywxMiBAQAogCQljaGlwLT5pc19yZWNvcmRpbmcgPSAwOwogCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJTVE9QUEVEIENBUFRVUkVcbiIpOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlNVU1BFTkQgQ0FQVFVSRVxuIik7CisJCS8qIG1ha2Ugc3VyZSByZWNvcmRpbmcgaXMgc3RvcHBlZCAqLworCQlzbmRfYXpmMzMyOF9jb2RlY19vdXR3KGNoaXAsIElEWF9JT19SRUNfRkxBR1MsCisJCQlzbmRfYXpmMzMyOF9jb2RlY19pbncoY2hpcCwgSURYX0lPX1JFQ19GTEFHUykgJiB+RE1BX1JFU1VNRSk7CisJCWJyZWFrOwogICAgICAgICBjYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CiAJCXNuZF9wcmludGsoS0VSTl9FUlIgIkZJWE1FOiBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIIE5JWSFcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA5NSw2ICsxMTQwLDcgQEAKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAiRklYTUU6IFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0UgTklZIVxuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRklYTUU6IHVua25vd24gdHJpZ2dlciBtb2RlIVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAJfQogCQpAQCAtMTE2Myw4ICsxMjA5LDcgQEAKIAkJc25kX2F6ZjMzMjhfY29kZWNfaW53KGNoaXAsIElEWF9JT19QTEFZX0lSUVRZUEUpLAogCQlzdGF0dXMpOwogCQkKLQlpZiAoc3RhdHVzICYgSVJRX1RJTUVSKQotCXsKKwlpZiAoc3RhdHVzICYgSVJRX1RJTUVSKSB7CiAJCS8qIHNuZF9hemYzMzI4X2RiZ3BsYXkoInRpbWVyICVsZFxuIiwgaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1RJTUVSX1ZBTFVFKSAmIFRJTUVSX1ZBTFVFX01BU0spOyAqLwogCQlpZiAoY2hpcC0+dGltZXIpCiAJCQlzbmRfdGltZXJfaW50ZXJydXB0KGNoaXAtPnRpbWVyLCBjaGlwLT50aW1lci0+c3RpY2tzKTsKQEAgLTExNzQsNTAgKzEyMTksNDMgQEAKIAkJc3Bpbl91bmxvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAkJc25kX2F6ZjMzMjhfZGJncGxheSgiYXp0MzMyODogdGltZXIgSVJRXG4iKTsKIAl9Ci0JaWYgKHN0YXR1cyAmIElSUV9QTEFZQkFDSykKLQl7CisJaWYgKHN0YXR1cyAmIElSUV9QTEFZQkFDSykgewogCQlzcGluX2xvY2soJmNoaXAtPnJlZ19sb2NrKTsKIAkJd2hpY2ggPSBzbmRfYXpmMzMyOF9jb2RlY19pbmIoY2hpcCwgSURYX0lPX1BMQVlfSVJRVFlQRSk7CiAJCS8qIGFjayBhbGwgSVJRIHR5cGVzIGltbWVkaWF0ZWx5ICovCiAJCXNuZF9hemYzMzI4X2NvZGVjX291dGIoY2hpcCwgSURYX0lPX1BMQVlfSVJRVFlQRSwgd2hpY2gpOwogICAgICAgICAgICAgICAgCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQkJaWYgKGNoaXAtPnBjbSAmJiBjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pCi0JCXsKKwkJaWYgKGNoaXAtPnBjbSAmJiBjaGlwLT5wbGF5YmFja19zdWJzdHJlYW0pIHsKIAkJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoY2hpcC0+cGxheWJhY2tfc3Vic3RyZWFtKTsKIAkJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlBMQVkgcGVyaW9kIGRvbmUgKCMleCksIEAgJXhcbiIsCiAJCQkJd2hpY2gsCiAJCQkJaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1BMQVlfRE1BX0NVUlJQT1MpKTsKLQkJfQotCQllbHNlCisJCX0gZWxzZQogCQkJc25kX2F6ZjMzMjhfZGJncGxheSgiYXp0MzMyODogb3VjaCwgaXJxIGhhbmRsZXIgcHJvYmxlbSFcbiIpOwogCQlpZiAod2hpY2ggJiBJUlFfUExBWV9TT01FVEhJTkcpCiAJCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJhenQzMzI4OiB1bmtub3duIHBsYXkgSVJRIHR5cGUgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iKTsKIAl9Ci0JaWYgKHN0YXR1cyAmIElSUV9SRUNPUkRJTkcpCi0JeworCWlmIChzdGF0dXMgJiBJUlFfUkVDT1JESU5HKSB7CiAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAJCXdoaWNoID0gc25kX2F6ZjMzMjhfY29kZWNfaW5iKGNoaXAsIElEWF9JT19SRUNfSVJRVFlQRSk7CiAJCS8qIGFjayBhbGwgSVJRIHR5cGVzIGltbWVkaWF0ZWx5ICovCiAJCXNuZF9hemYzMzI4X2NvZGVjX291dGIoY2hpcCwgSURYX0lPX1JFQ19JUlFUWVBFLCB3aGljaCk7CiAJCXNwaW5fdW5sb2NrKCZjaGlwLT5yZWdfbG9jayk7CiAKLQkJaWYgKGNoaXAtPnBjbSAmJiBjaGlwLT5jYXB0dXJlX3N1YnN0cmVhbSkKLQkJeworCQlpZiAoY2hpcC0+cGNtICYmIGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKSB7CiAJCQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKGNoaXAtPmNhcHR1cmVfc3Vic3RyZWFtKTsKIAkJCXNuZF9hemYzMzI4X2RiZ3BsYXkoIlJFQyAgcGVyaW9kIGRvbmUgKCMleCksIEAgJXhcbiIsCiAJCQkJd2hpY2gsCiAJCQkJaW5sKGNoaXAtPmNvZGVjX3BvcnQrSURYX0lPX1JFQ19ETUFfQ1VSUlBPUykpOwotCQl9Ci0JCWVsc2UKKwkJfSBlbHNlCiAJCQlzbmRfYXpmMzMyOF9kYmdwbGF5KCJhenQzMzI4OiBvdWNoLCBpcnEgaGFuZGxlciBwcm9ibGVtIVxuIik7CiAJCWlmICh3aGljaCAmIElSUV9SRUNfU09NRVRISU5HKQogCQkJc25kX2F6ZjMzMjhfZGJncGxheSgiYXp0MzMyODogdW5rbm93biByZWMgSVJRIHR5cGUgb2NjdXJyZWQsIHBsZWFzZSByZXBvcnQhXG4iKTsKIAl9CiAJLyogTVBVNDAxIGhhcyBsZXNzIGNyaXRpY2FsIElSUSByZXF1aXJlbWVudHMKIAkgKiB0aGFuIHRpbWVyIGFuZCBwbGF5YmFjay9yZWNvcmRpbmcsIHJpZ2h0PyAqLwotCWlmIChzdGF0dXMgJiBJUlFfTVBVNDAxKQotCXsKKwlpZiAoc3RhdHVzICYgSVJRX01QVTQwMSkgewogCQlzbmRfbXB1NDAxX3VhcnRfaW50ZXJydXB0KGlycSwgY2hpcC0+cm1pZGktPnByaXZhdGVfZGF0YSwgcmVncyk7CiAKIAkJLyogaG1tLCBkbyB3ZSBoYXZlIHRvIGFjayB0aGUgSVJRIGhlcmUgc29tZWhvdz8KQEAgLTE1MTEsOCArMTU0OSw3IEBACiAJc25kX2F6ZjMzMjhfZGJnY2FsbGVudGVyKCk7CiAJY2hpcCA9IHNuZF90aW1lcl9jaGlwKHRpbWVyKTsKIAlkZWxheSA9ICgodGltZXItPnN0aWNrcyAqIHNlcXRpbWVyX3NjYWxpbmcpIC0gMSkgJiBUSU1FUl9WQUxVRV9NQVNLOwotCWlmIChkZWxheSA8IDQ5KQotCXsKKwlpZiAoZGVsYXkgPCA0OSkgewogCQkvKiB1aG9oLCB0aGF0J3Mgbm90IGdvb2QsIHNpbmNlIHVzZXItc3BhY2Ugd29uJ3Qga25vdyBhYm91dAogCQkgKiB0aGlzIHRpbWluZyB0d2VhawogCQkgKiAod2UgbmVlZCB0byBkbyBpdCB0byBhdm9pZCBhIGxvY2t1cCwgdGhvdWdoKSAqLwpAQCAtMTc2Niw5ICsxODAzLDExIEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKKwljYXJkLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCiAJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KCBjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCSAgICAgICAgY2hpcC0+bXB1X3BvcnQsIDEsIHBjaS0+aXJxLCAwLAotCQkJCSAgICAgICAgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CisJCQkJICAgICAgICBjaGlwLT5tcHVfcG9ydCwgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKKwkJCQkJcGNpLT5pcnEsIDAsICZjaGlwLT5ybWlkaSkpIDwgMCkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJhemYzMzI4OiBubyBNUFUtNDAxIGRldmljZSBhdCAweCVseD9cbiIsIGNoaXAtPm1wdV9wb3J0KTsKIAkJZ290byBvdXRfZXJyOwogCX0KQEAgLTE3OTEsNiArMTgzMCw4IEBACiAJCX0KIAl9CiAKKwlvcGwzLT5wcml2YXRlX2RhdGEgPSBjaGlwOworCiAJc3ByaW50ZihjYXJkLT5sb25nbmFtZSwgIiVzIGF0IDB4JWx4LCBpcnEgJWkiLAogCQljYXJkLT5zaG9ydG5hbWUsIGNoaXAtPmNvZGVjX3BvcnQsIGNoaXAtPmlycSk7CiAKQEAgLTE4MzQsMTEgKzE4NzUsODAgQEAKIAlzbmRfYXpmMzMyOF9kYmdjYWxsbGVhdmUoKTsKIH0KIAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludAorc25kX2F6ZjMzMjhfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CisJc3RydWN0IHNuZF9hemYzMzI4ICpjaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCWludCByZWc7CisKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisJCisJc25kX3BjbV9zdXNwZW5kX2FsbChjaGlwLT5wY20pOworCisJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9NSVhFUl9QTSAvIDI7IHJlZysrKQorCQljaGlwLT5zYXZlZF9yZWdzX21peGVyW3JlZ10gPSBpbncoY2hpcC0+bWl4ZXJfcG9ydCArIHJlZyAqIDIpOworCisJLyogbWFrZSBzdXJlIHRvIGRpc2FibGUgbWFzdGVyIHZvbHVtZSBldGMuIHRvIHByZXZlbnQgbG9vcGluZyBzb3VuZCAqLworCXNuZF9hemYzMzI4X21peGVyX3NldF9tdXRlKGNoaXAsIElEWF9NSVhFUl9QTEFZX01BU1RFUiwgMSk7CisJc25kX2F6ZjMzMjhfbWl4ZXJfc2V0X211dGUoY2hpcCwgSURYX01JWEVSX1dBVkVPVVQsIDEpOworCQorCWZvciAocmVnID0gMDsgcmVnIDwgQVpGX0lPX1NJWkVfQ09ERUNfUE0gLyAyOyByZWcrKykKKwkJY2hpcC0+c2F2ZWRfcmVnc19jb2RlY1tyZWddID0gaW53KGNoaXAtPmNvZGVjX3BvcnQgKyByZWcgKiAyKTsKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IEFaRl9JT19TSVpFX0lPMl9QTSAvIDI7IHJlZysrKQorCQljaGlwLT5zYXZlZF9yZWdzX2lvMltyZWddID0gaW53KGNoaXAtPmlvMl9wb3J0ICsgcmVnICogMik7CisJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9NUFVfUE0gLyAyOyByZWcrKykKKwkJY2hpcC0+c2F2ZWRfcmVnc19tcHVbcmVnXSA9IGludyhjaGlwLT5tcHVfcG9ydCArIHJlZyAqIDIpOworCWZvciAocmVnID0gMDsgcmVnIDwgQVpGX0lPX1NJWkVfU1lOVEhfUE0gLyAyOyByZWcrKykKKwkJY2hpcC0+c2F2ZWRfcmVnc19zeW50aFtyZWddID0gaW53KGNoaXAtPnN5bnRoX3BvcnQgKyByZWcgKiAyKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOworCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOworCXBjaV9zYXZlX3N0YXRlKHBjaSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NuZF9hemYzMzI4X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmVnOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDApOworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IEFaRl9JT19TSVpFX0lPMl9QTSAvIDI7IHJlZysrKQorCQlvdXR3KGNoaXAtPnNhdmVkX3JlZ3NfaW8yW3JlZ10sIGNoaXAtPmlvMl9wb3J0ICsgcmVnICogMik7CisJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9NUFVfUE0gLyAyOyByZWcrKykKKwkJb3V0dyhjaGlwLT5zYXZlZF9yZWdzX21wdVtyZWddLCBjaGlwLT5tcHVfcG9ydCArIHJlZyAqIDIpOworCWZvciAocmVnID0gMDsgcmVnIDwgQVpGX0lPX1NJWkVfU1lOVEhfUE0gLyAyOyByZWcrKykKKwkJb3V0dyhjaGlwLT5zYXZlZF9yZWdzX3N5bnRoW3JlZ10sIGNoaXAtPnN5bnRoX3BvcnQgKyByZWcgKiAyKTsKKwlmb3IgKHJlZyA9IDA7IHJlZyA8IEFaRl9JT19TSVpFX01JWEVSX1BNIC8gMjsgcmVnKyspCisJCW91dHcoY2hpcC0+c2F2ZWRfcmVnc19taXhlcltyZWddLCBjaGlwLT5taXhlcl9wb3J0ICsgcmVnICogMik7CisJZm9yIChyZWcgPSAwOyByZWcgPCBBWkZfSU9fU0laRV9DT0RFQ19QTSAvIDI7IHJlZysrKQorCQlvdXR3KGNoaXAtPnNhdmVkX3JlZ3NfY29kZWNbcmVnXSwgY2hpcC0+Y29kZWNfcG9ydCArIHJlZyAqIDIpOworCisJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDApOworCXJldHVybiAwOworfQorI2VuZGlmCisKKworCisKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CiAJLm5hbWUgPSAiQVpGMzMyOCIsCiAJLmlkX3RhYmxlID0gc25kX2F6ZjMzMjhfaWRzLAogCS5wcm9iZSA9IHNuZF9hemYzMzI4X3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfYXpmMzMyOF9yZW1vdmUpLAorI2lmZGVmIENPTkZJR19QTQorCS5zdXNwZW5kID0gc25kX2F6ZjMzMjhfc3VzcGVuZCwKKwkucmVzdW1lID0gc25kX2F6ZjMzMjhfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguaCBiL3NvdW5kL3BjaS9henQzMzI4LmgKaW5kZXggZjQ4OWJkYS4uYjRmM2UzYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguaAorKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5oCkBAIC01LDYgKzUsOSBAQAogCiAvKioqIG1haW4gSS9PIGFyZWEgcG9ydCBpbmRpY2VzICoqKi8KIC8qIChvbmx5IDB4NzAgb2YgMHg4MCBieXRlcyBzYXZlZC9yZXN0b3JlZCBieSBXaW5kb3dzIGRyaXZlcikgKi8KKyNkZWZpbmUgQVpGX0lPX1NJWkVfQ09ERUMJMHg4MAorI2RlZmluZSBBWkZfSU9fU0laRV9DT0RFQ19QTQkweDcwCisKIC8qIHRoZSBkcml2ZXIgaW5pdGlhbGlzYXRpb24gc3VnZ2VzdHMgYSBsYXlvdXQgb2YgNCBtYWluIGFyZWFzOgogICogZnJvbSAweDAwIChwbGF5YmFjayksIGZyb20gMHgyMCAocmVjb3JkaW5nKSBhbmQgZnJvbSAweDQwIChtYXliZSBNUFU0MDE/PykuCiAgKiBBbmQgYW5vdGhlciBhcmVhIGZyb20gMHg2MCB0byAweDZmIChEaXJlY3RYIHRpbWVyLCBJUlEgbWFuYWdlbWVudCwKQEAgLTg3LDcgKzkwLDcgQEAKICNkZWZpbmUgSURYX0lPX1JFQ19ETUFfQ1VSUk9GUyAgMHgzNCAvKiBQVToweDAwMDAwMDAwICovCiAjZGVmaW5lIElEWF9JT19SRUNfU09VTkRGT1JNQVQgIDB4MzYgLyogUFU6MHgwMDAwICovCiAKLS8qKiBobW0sIHdoYXQgaXMgdGhpcyBJL08gYXJlYSBmb3I/IE1QVTQwMT8/IChhZnRlciBwbGF5YmFjaywgcmVjb3JkaW5nLCA/Pz8sIHRpbWVyKSAqKi8KKy8qKiBobW0sIHdoYXQgaXMgdGhpcyBJL08gYXJlYSBmb3I/IE1QVTQwMT8/IG9yIGV4dGVybmFsIERBQyB2aWEgSTJTPz8gKGFmdGVyIHBsYXliYWNrLCByZWNvcmRpbmcsID8/PywgdGltZXIpICoqLwogI2RlZmluZSBJRFhfSU9fU09NRVRISU5HX0ZMQUdTCTB4NDAgLyogZ2V0cyBzZXQgdG8gMHgzNCBqdXN0IGxpa2UgcG9ydCAweDAgYW5kIDB4MjAgb24gY2FyZCBpbml0LCBQVToweDAwMDAgKi8KIC8qIGdlbmVyYWwgKi8KICNkZWZpbmUgSURYX0lPXzQySAkJMHg0MiAvKiBQVToweDAwMDEgKi8KQEAgLTEwNyw3ICsxMTAsOCBAQAogICAjZGVmaW5lIElSUV9VTktOT1dOMgkJCTB4MDA4MCAvKiBwcm9iYWJseSB1bnVzZWQgKi8KICNkZWZpbmUgSURYX0lPXzY2SAkJMHg2NiAgICAvKiB3cml0aW5nIDB4ZmZmZiByZXR1cm5zIDB4MDAwMCAqLwogI2RlZmluZSBJRFhfSU9fU09NRV9WQUxVRQkweDY4CS8qIHRoaXMgaXMgc2V0IHRvIGUuZy4gMHgzZmYgb3IgMHgzMDAsIGFuZCB3cml0YWJsZTsgbWF5YmUgc29tZSBidWZmZXIgbGltaXQsIGJ1dCBJIGNvdWxkbid0IGZpbmQgb3V0IG1vcmUsIFBVOjB4MDBmZiAqLwotI2RlZmluZSBJRFhfSU9fNkFICQkweDZBCS8qIHRoaXMgV09SRCBjYW4gYmUgc2V0IHRvIGhhdmUgYml0cyAweDAwMjggYWN0aXZhdGVkOyBhY3R1YWxseSBpbmhpYml0cyBQQ00gcGxheWJhY2shISEgbWF5YmUgcG93ZXIgbWFuYWdlbWVudD8/ICovCisjZGVmaW5lIElEWF9JT182QUgJCTB4NkEJLyogdGhpcyBXT1JEIGNhbiBiZSBzZXQgdG8gaGF2ZSBiaXRzIDB4MDAyOCBhY3RpdmF0ZWQgKEZJWE1FOiBjb3JyZWN0Pz8pOyBhY3R1YWxseSBpbmhpYml0cyBQQ00gcGxheWJhY2shISEgbWF5YmUgcG93ZXIgbWFuYWdlbWVudD8/ICovCisgICNkZWZpbmUgSU9fNkFfUEFVU0VfUExBWUJBQ0sJCTB4MDIwMCAvKiBiaXQgOTsgc3VyZSwgdGhpcyBwYXVzZXMgcGxheWJhY2ssIGJ1dCB3aGF0IHRoZSBoZWNrIGlzIHRoaXMgcmVhbGx5IGFib3V0Pz8gKi8KICNkZWZpbmUgSURYX0lPXzZDSAkJMHg2QwogI2RlZmluZSBJRFhfSU9fNkVICQkweDZFCS8qIHdyaXRpbmcgMHhmZmZmIHJldHVybnMgMHg4M2ZlICovCiAvKiBmdXJ0aGVyIEkvTyBpbmRpY2VzIG5vdCBzYXZlZC9yZXN0b3JlZCwgc28gcHJvYmFibHkgbm90IHVzZWQgKi8KQEAgLTExNSwxNSArMTE5LDI1IEBACiAKIC8qKiogSS9PIDIgYXJlYSBwb3J0IGluZGljZXMgKioqLwogLyogKG9ubHkgMHgwNiBvZiAweDA4IGJ5dGVzIHNhdmVkL3Jlc3RvcmVkIGJ5IFdpbmRvd3MgZHJpdmVyKSAqLyAKKyNkZWZpbmUgQVpGX0lPX1NJWkVfSU8yCQkweDA4CisjZGVmaW5lIEFaRl9JT19TSVpFX0lPMl9QTQkweDA2CisKICNkZWZpbmUgSURYX0lPMl9MRUdBQ1lfQUREUgkweDA0CiAgICNkZWZpbmUgTEVHQUNZX1NPTUVUSElORwkJMHgwMSAvKiBPUEwzPz8gKi8KICAgI2RlZmluZSBMRUdBQ1lfSk9ZCQkJMHgwOAogCisjZGVmaW5lIEFaRl9JT19TSVpFX01QVQkJMHgwNAorI2RlZmluZSBBWkZfSU9fU0laRV9NUFVfUE0JMHgwNAorCisjZGVmaW5lIEFaRl9JT19TSVpFX1NZTlRICTB4MDgKKyNkZWZpbmUgQVpGX0lPX1NJWkVfU1lOVEhfUE0JMHgwNgogCiAvKioqIG1peGVyIEkvTyBhcmVhIHBvcnQgaW5kaWNlcyAqKiovCiAvKiAob25seSAweDIyIG9mIDB4NDAgYnl0ZXMgc2F2ZWQvcmVzdG9yZWQgYnkgV2luZG93cyBkcml2ZXIpCi0gKiBnZW5lcmFsbHkgc3Bva2VuOiBBQzk3IHJlZ2lzdGVyIGluZGV4ID0gQVpGMzMyOCBtaXhlciByZWcgaW5kZXggKyAyCi0gKiAoaW4gb3RoZXIgd29yZHM6IEFaRjMzMjggTk9UIGZ1bGx5IEFDOTcgY29tcGxpYW50KSAqLworICogVU5GT1JUVU5BVEVMWSBhemYzMzI4IGlzIE5PVCB0cnVseSBBQzk3IGNvbXBsaWFudDogc2VlIG1haW4gZmlsZSBpbnRybyAqLworI2RlZmluZSBBWkZfSU9fU0laRV9NSVhFUgkweDQwCisjZGVmaW5lIEFaRl9JT19TSVpFX01JWEVSX1BNCTB4MjIKKwogICAjZGVmaW5lIE1JWEVSX1ZPTFVNRV9SSUdIVF9NQVNLCTB4MDAxZgogICAjZGVmaW5lIE1JWEVSX1ZPTFVNRV9MRUZUX01BU0sJMHgxZjAwCiAgICNkZWZpbmUgTUlYRVJfTVVURV9NQVNLCQkweDgwMDAKQEAgLTE1NiwxNCArMTcwLDE0IEBACiAjZGVmaW5lIElEWF9NSVhFUl9BRFZDVEwxICAgICAgIDB4MWUKICAgLyogdW5saXN0ZWQgYml0cyBhcmUgdW5tb2RpZmlhYmxlICovCiAgICNkZWZpbmUgTUlYRVJfQURWQ1RMMV8zRFdJRFRIX01BU0sJMHgwMDBlCi0gICNkZWZpbmUgTUlYRVJfQURWQ1RMMV9ISUZJM0RfTUFTSwkweDAzMDAKLSNkZWZpbmUgSURYX01JWEVSX0FEVkNUTDIgICAgICAgMHgyMCAvKiByZXNlbWJsZXMgQUM5N19HRU5FUkFMX1BVUlBPU0UgcmVnISAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDFfSElGSTNEX01BU0sJMHgwMzAwIC8qIHl1cCwgdGhpcyBpcyBtaXNzaW5nIHRoZSBoaWdoIGJpdCB0aGF0IG9mZmljaWFsIEFDOTcgY29udGFpbnMsIHBsdXMgaXQgZG9lc24ndCBoYXZlIGxpbmVhciBiaXQgdmFsdWUgcmFuZ2UgYmVoYXZpb3VyIGJ1dCBpbnN0ZWFkIGFjdHMgd2VpcmRseSAocG9zc2libHkgd2UncmUgZGVhbGluZyB3aXRoIHR3byAqZGlmZmVyZW50KiAzRCBzZXR0aW5ncyBoZXJlPz8pICovCisjZGVmaW5lIElEWF9NSVhFUl9BRFZDVEwyICAgICAgIDB4MjAgLyogc3Vic2V0IG9mIEFDOTdfR0VORVJBTF9QVVJQT1NFIHJlZyEgKi8KICAgLyogdW5saXN0ZWQgYml0cyBhcmUgdW5tb2RpZmlhYmxlICovCi0gICNkZWZpbmUgTUlYRVJfQURWQ1RMMl9CSVQ3CQkweDAwODAgLyogV2F2ZU91dCAzRCBCeXBhc3M/IG11dGVzIFdhdmVPdXQgYXQgTGluZU91dCAqLwotICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfQklUOAkJMHgwMTAwIC8qIGlzIHRoaXMgTW9kZW0gT3V0IFNlbGVjdD8gKi8KLSAgI2RlZmluZSBNSVhFUl9BRFZDVEwyX0JJVDkJCTB4MDIwMCAvKiBNb25vIFNlbGVjdCBTb3VyY2U/ICovCi0gICNkZWZpbmUgTUlYRVJfQURWQ1RMMl9CSVQxMwkJMHgyMDAwIC8qIDNEIGVuYWJsZT8gKi8KLSAgI2RlZmluZSBNSVhFUl9BRFZDVEwyX0JJVDE1CQkweDgwMDAgLyogdW5rbm93biAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfTFBCSwkJMHgwMDgwIC8qIExvb3BiYWNrIG1vZGUgLS0gV2luIGRyaXZlcjogIldhdmVPdXQzREJ5cGFzcyI/IG11dGVzIFdhdmVPdXQgYXQgTGluZU91dCAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfTVMJCTB4MDEwMCAvKiBNaWMgU2VsZWN0IDA9TWljMSwgMT1NaWMyIC0tIFdpbiBkcml2ZXI6ICJNb2RlbU91dFNlbGVjdCI/PyAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfTUlYCQkweDAyMDAgLyogTW9ubyBvdXRwdXQgc2VsZWN0IDA9TWl4LCAxPU1pYzsgV2luIGRyaXZlcjogIk1vbm9TZWxlY3RTb3VyY2UiPz8gKi8KKyAgI2RlZmluZSBNSVhFUl9BRFZDVEwyXzNECQkweDIwMDAgLyogM0QgRW5oYW5jZW1lbnQgMT1vbiAqLworICAjZGVmaW5lIE1JWEVSX0FEVkNUTDJfUE9QCQkweDgwMDAgLyogUGNtIE91dCBQYXRoLCAwPXByZSAzRCwgMT1wb3N0IDNEICovCiAgIAogI2RlZmluZSBJRFhfTUlYRVJfU09NRVRISU5HMzBICTB4MzAgLyogdXNlZCwgYnV0IHVua25vd24/Pz8gKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2J0ODd4LmMgYi9zb3VuZC9wY2kvYnQ4N3guYwppbmRleCA5ZWUwN2Q0Li5jMzM2NDJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYnQ4N3guYworKysgYi9zb3VuZC9wY2kvYnQ4N3guYwpAQCAtNDQsNyArNDQsNyBAQAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IC0yfTsgLyogRXhjbHVkZSB0aGUgZmlyc3QgY2FyZCAqLwogc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCiBzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KLXN0YXRpYyBpbnQgZGlnaXRhbF9yYXRlW1NORFJWX0NBUkRTXSA9IHsgWzAgLi4uIChTTkRSVl9DQVJEUy0xKV0gPSAwIH07IC8qIGRpZ2l0YWwgaW5wdXQgcmF0ZSAqLworc3RhdGljIGludCBkaWdpdGFsX3JhdGVbU05EUlZfQ0FSRFNdOwkvKiBkaWdpdGFsIGlucHV0IHJhdGUgKi8KIHN0YXRpYyBpbnQgbG9hZF9hbGw7CS8qIGFsbG93IHRvIGxvYWQgdGhlIG5vbi13aGl0ZWxpc3RlZCBjYXJkcyAqLwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CkBAIC03ODEsMTAgKzc4MSwxMiBAQAogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzksIDB4MDA3MCwgMHgxM2ViLCAzMjAwMCksCiAJLyogVmlld2Nhc3QgT3NwcmV5IDIwMCAqLwogCUJUX0RFVklDRShQQ0lfREVWSUNFX0lEX0JST09LVFJFRV84NzgsIDB4MDA3MCwgMHhmZjAxLCA0NDEwMCksCi0JLyogQVZlck1lZGlhIFN0dWRpbyBOby4gMTAzLCAyMDMsIC4uLj8gKi8KLQlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDE0NjEsIDB4MDAwMywgNDgwMDApLAogCS8qIExlYWR0ZWsgV2luZmFzdCB0diAyMDAweHAgZGVsdXggKi8KIAlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDEwN2QsIDB4NjYwNiwgMzIwMDApLAorCS8qIFZvb2RvbyBUViAyMDAgKi8KKwlCVF9ERVZJQ0UoUENJX0RFVklDRV9JRF9CUk9PS1RSRUVfODc4LCAweDEyMWEsIDB4MzAwMCwgMzIwMDApLAorCS8qIEFWZXJNZWRpYSBTdHVkaW8gTm8uIDEwMywgMjAzLCAuLi4/ICovCisJQlRfREVWSUNFKFBDSV9ERVZJQ0VfSURfQlJPT0tUUkVFXzg3OCwgMHgxNDYxLCAweDAwMDMsIDQ4MDAwKSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgc25kX2J0ODd4X2lkcyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNi5oIGIvc291bmQvcGNpL2NhMDEwNi9jYTAxMDYuaAppbmRleCBjODEzMWVhLi45Y2I2NmM1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNi5oCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2LmgKQEAgLTUzNyw5ICs1MzcsOSBAQAogI2VuZGlmCiAKICNkZWZpbmUgQURDX01VWF9NQVNLCQkweDAwMDAwMDBmCS8vTWFzayBmb3IgQURDIE11eAorI2RlZmluZSBBRENfTVVYX1BIT05FCQkweDAwMDAwMDAxCS8vVmFsdWUgdG8gc2VsZWN0IFRBRCBhdCBBREMgTXV4IChOb3QgdXNlZCkKICNkZWZpbmUgQURDX01VWF9NSUMJCTB4MDAwMDAwMDIJLy9WYWx1ZSB0byBzZWxlY3QgTWljIGF0IEFEQyBNdXgKICNkZWZpbmUgQURDX01VWF9MSU5FSU4JCTB4MDAwMDAwMDQJLy9WYWx1ZSB0byBzZWxlY3QgTGluZUluIGF0IEFEQyBNdXgKLSNkZWZpbmUgQURDX01VWF9QSE9ORQkJMHgwMDAwMDAwMQkvL1ZhbHVlIHRvIHNlbGVjdCBUQUQgYXQgQURDIE11eCAoTm90IHVzZWQpCiAjZGVmaW5lIEFEQ19NVVhfQVVYCQkweDAwMDAwMDA4CS8vVmFsdWUgdG8gc2VsZWN0IEF1eCBhdCBBREMgTXV4CiAKICNkZWZpbmUgU0VUX0NIQU5ORUwgMCAgLyogVGVzdGluZyBjaGFubmVsIG91dHB1dHMgMD1Gcm9udCwgMT1DZW50ZXIvTEZFLCAyPVVua25vd24sIDM9UmVhciAqLwpAQCAtNjA0LDYgKzYwNCw4IEBACiAJdTMyIHNwZGlmX2JpdHNbNF07ICAgICAgICAgICAgIC8qIHMvcGRpZiBvdXQgc2V0dXAgKi8KIAlpbnQgc3BkaWZfZW5hYmxlOwogCWludCBjYXB0dXJlX3NvdXJjZTsKKwlpbnQgaTJjX2NhcHR1cmVfc291cmNlOworCXU4IGkyY19jYXB0dXJlX3ZvbHVtZVs0XVsyXTsKIAlpbnQgY2FwdHVyZV9taWNfbGluZV9pbjsKIAogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBidWZmZXI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9tYWluLmMKaW5kZXggZmQ4YmZlYi4uNTliZjliZCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21haW4uYwpAQCAtMTg2LDggKzE4Niw4IEBACiAJIC8qIE5ldyBBdWRpZ3kgU0UuIEhhcyBhIGRpZmZlcmVudCBEQUMuICovCiAJIC8qIFNCMDU3MDoKIAkgICogQ1RSTDpDQTAxMDYtREFUCi0JICAqIEFEQzogV004NzY4R0VEUwotCSAgKiBEQUM6IFdNODc3NUVEUworCSAgKiBBREM6IFdNODc3NUVEUworCSAgKiBEQUM6IFdNODc2OEdFRFMKIAkgICovCiAJIHsgLnNlcmlhbCA9IDB4MTAwYTExMDIsCiAJICAgLm5hbWUgICA9ICJBdWRpZ3kgU0UgW1NCMDU3MF0iLApAQCAtMTk1LDkgKzE5NSwxNCBAQAogCSAgIC5pMmNfYWRjID0gMSwKIAkgICAuc3BpX2RhYyA9IDEgfSAsCiAJIC8qIE1TSSBLOE4gRGlhbW9uZCBNb3RoZXJib2FyZCB3aXRoIG9uYm9hcmQgU0IgTGl2ZSAyNGJpdCB3aXRob3V0IEFDOTcgKi8KKwkgLyogU0IwNDM4CisJICAqIENUUkw6Q0EwMTA2LURBVAorCSAgKiBBREM6IFdNODc3NVNFRFMKKwkgICogREFDOiBDUzQzODItS1FaCisJICAqLwogCSB7IC5zZXJpYWwgPSAweDEwMDkxNDYyLAogCSAgIC5uYW1lICAgPSAiTVNJIEs4TiBEaWFtb25kIE1CIFtTQjA0MzhdIiwKLQkgICAuZ3Bpb190eXBlID0gMSwKKwkgICAuZ3Bpb190eXBlID0gMiwKIAkgICAuaTJjX2FkYyA9IDEgfSAsCiAJIC8qIFNodXR0bGUgWFBDIFNEMzFQIHdoaWNoIGhhcyBhbiBvbmJvYXJkIENyZWF0aXZlIExhYnMKIAkgICogU291bmQgQmxhc3RlciBMaXZlISAyNC1iaXQgRUFYCkBAIC0zMjYsNiArMzMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogVGhlIEFEQyBkb2VzIG5vdCBzdXBwb3J0IGkyYyByZWFkLCBzbyBvbmx5IHdyaXRlIGlzIGltcGxlbWVudGVkICovCiBpbnQgc25kX2NhMDEwNl9pMmNfd3JpdGUoc3RydWN0IHNuZF9jYTAxMDYgKmVtdSwKIAkJCQl1MzIgcmVnLAogCQkJCXUzMiB2YWx1ZSkKQEAgLTM0MCw2ICszNDYsNyBAQAogCX0KIAogCXRtcCA9IHJlZyA8PCAyNSB8IHZhbHVlIDw8IDE2OworCS8vIHNuZF9wcmludGsoIkkyQy13cml0ZTpyZWc9MHgleCwgdmFsdWU9MHgleFxuIiwgcmVnLCB2YWx1ZSk7CiAJLyogTm90IHN1cmUgd2hhdCB0aGlzIEkyQyBjaGFubmVsIGNvbnRyb2xzLiAqLwogCS8qIHNuZF9jYTAxMDZfcHRyX3dyaXRlKGVtdSwgSTJDX0QwLCAwLCB0bXApOyAqLwogCkBAIC0zNDgsOCArMzU1LDkgQEAKIAogCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDEwOyByZXRyeSsrKSB7CiAJCS8qIFNlbmQgdGhlIGRhdGEgdG8gaTJjICovCi0JCXRtcCA9IHNuZF9jYTAxMDZfcHRyX3JlYWQoZW11LCBJMkNfQSwgMCk7Ci0JCXRtcCA9IHRtcCAmIH4oSTJDX0FfQURDX1JFQUR8STJDX0FfQURDX0xBU1R8STJDX0FfQURDX1NUQVJUfEkyQ19BX0FEQ19BRERfTUFTSyk7CisJCS8vdG1wID0gc25kX2NhMDEwNl9wdHJfcmVhZChlbXUsIEkyQ19BLCAwKTsKKwkJLy90bXAgPSB0bXAgJiB+KEkyQ19BX0FEQ19SRUFEfEkyQ19BX0FEQ19MQVNUfEkyQ19BX0FEQ19TVEFSVHxJMkNfQV9BRENfQUREX01BU0spOworCQl0bXAgPSAwOwogCQl0bXAgPSB0bXAgfCAoSTJDX0FfQURDX0xBU1R8STJDX0FfQURDX1NUQVJUfEkyQ19BX0FEQ19BREQpOwogCQlzbmRfY2EwMTA2X3B0cl93cml0ZShlbXUsIEkyQ19BLCAwLCB0bXApOwogCkBAIC0xMTgxLDcgKzExODksNyBAQAogCTB4MDJmZiwKIAkweDA0MDAsCiAJMHgwNTIwLAotCTB4MDYwMCwKKwkweDA2MjAsIC8qIFNldCAyNCBiaXQuIFdhcyAweDA2MDAgKi8KIAkweDA4ZmYsCiAJMHgwYWZmLAogCTB4MGNmZiwKQEAgLTEyMDAsNiArMTIwOCwyMiBAQAogCTB4MTQwMCwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTJjX2FkY19pbml0W11bMl0gPSB7CisJeyAweDE3LCAweDAwIH0sIC8qIFJlc2V0ICovCisJeyAweDA3LCAweDAwIH0sIC8qIFRpbWVvdXQgKi8KKwl7IDB4MGIsIDB4MjIgfSwgIC8qIEludGVyZmFjZSBjb250cm9sICovCisJeyAweDBjLCAweDIyIH0sICAvKiBNYXN0ZXIgbW9kZSBjb250cm9sICovCisJeyAweDBkLCAweDA4IH0sICAvKiBQb3dlcmRvd24gY29udHJvbCAqLworCXsgMHgwZSwgMHhjZiB9LCAgLyogQXR0ZW51YXRpb24gTGVmdCAgMHgwMSA9IC0xMDNkQiwgMHhmZiA9IDI0ZEIgKi8KKwl7IDB4MGYsIDB4Y2YgfSwgIC8qIEF0dGVudWF0aW9uIFJpZ2h0IDAuNWRCIHN0ZXBzICovCisJeyAweDEwLCAweDdiIH0sICAvKiBBTEMgQ29udHJvbCAxICovCisJeyAweDExLCAweDAwIH0sICAvKiBBTEMgQ29udHJvbCAyICovCisJeyAweDEyLCAweDMyIH0sICAvKiBBTEMgQ29udHJvbCAzICovCisJeyAweDEzLCAweDAwIH0sICAvKiBOb2lzZSBnYXRlIGNvbnRyb2wgKi8KKwl7IDB4MTQsIDB4YTYgfSwgIC8qIExpbWl0ZXIgY29udHJvbCAqLworCXsgMHgxNSwgQURDX01VWF9MSU5FSU4gfSwgIC8qIEFEQyBNaXhlciBjb250cm9sICovCit9OworCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfY2EwMTA2X2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCiAJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqcGNpLAogCQkJCQkgc3RydWN0IHNuZF9jYTAxMDYgKipyY2hpcCkKQEAgLTEzNjEsNyArMTM4NSwxMiBAQAogICAgICAgICBzbmRfY2EwMTA2X3B0cl93cml0ZShjaGlwLCBDQVBUVVJFX1NPVVJDRSwgMHgwLCAweDMzMzMwMGU0KTsgLyogU2VsZWN0IE1JQywgTGluZSBpbiwgVEFEIGluLCBBVVggaW4gKi8KIAljaGlwLT5jYXB0dXJlX3NvdXJjZSA9IDM7IC8qIFNldCBDQVBUVVJFX1NPVVJDRSAqLwogCi0gICAgICAgIGlmIChjaGlwLT5kZXRhaWxzLT5ncGlvX3R5cGUgPT0gMSkgeyAvKiBUaGUgU0IwNDEwIGFuZCBTQjA0MTMgdXNlIEdQSU8gZGlmZmVyZW50bHkuICovCisgICAgICAgIGlmIChjaGlwLT5kZXRhaWxzLT5ncGlvX3R5cGUgPT0gMikgeyAvKiBUaGUgU0IwNDM4IHVzZSBHUElPIGRpZmZlcmVudGx5LiAqLworCQkvKiBGSVhNRTogU3RpbGwgbmVlZCB0byBmaW5kIG91dCB3aGF0IHRoZSBvdGhlciBHUElPIGJpdHMgZG8uIEUuZy4gRm9yIGRpZ2l0YWwgc3BkaWYgb3V0LiAqLworCQlvdXRsKDB4MCwgY2hpcC0+cG9ydCtHUElPKTsKKwkJLy9vdXRsKDB4MDBmMGUwMDAsIGNoaXAtPnBvcnQrR1BJTyk7IC8qIEFuYWxvZyAqLworCQlvdXRsKDB4MDA1ZjUzMDEsIGNoaXAtPnBvcnQrR1BJTyk7IC8qIEFuYWxvZyAqLworCX0gZWxzZSBpZiAoY2hpcC0+ZGV0YWlscy0+Z3Bpb190eXBlID09IDEpIHsgLyogVGhlIFNCMDQxMCBhbmQgU0IwNDEzIHVzZSBHUElPIGRpZmZlcmVudGx5LiAqLwogCQkvKiBGSVhNRTogU3RpbGwgbmVlZCB0byBmaW5kIG91dCB3aGF0IHRoZSBvdGhlciBHUElPIGJpdHMgZG8uIEUuZy4gRm9yIGRpZ2l0YWwgc3BkaWYgb3V0LiAqLwogCQlvdXRsKDB4MCwgY2hpcC0+cG9ydCtHUElPKTsKIAkJLy9vdXRsKDB4MDBmMGUwMDAsIGNoaXAtPnBvcnQrR1BJTyk7IC8qIEFuYWxvZyAqLwpAQCAtMTM3OSw3ICsxNDA4LDE5IEBACiAJb3V0bChIQ0ZHX0FDOTcgfCBIQ0ZHX0FVRElPRU5BQkxFLCBjaGlwLT5wb3J0K0hDRkcpOyAvKiBBQzk3IDIuMCwgRW5hYmxlIG91dHB1dHMuICovCiAKICAgICAgICAgaWYgKGNoaXAtPmRldGFpbHMtPmkyY19hZGMgPT0gMSkgeyAvKiBUaGUgU0IwNDEwIGFuZCBTQjA0MTMgdXNlIEkyQyB0byBjb250cm9sIEFEQy4gKi8KLQkgICAgICAgIHNuZF9jYTAxMDZfaTJjX3dyaXRlKGNoaXAsIEFEQ19NVVgsIEFEQ19NVVhfTElORUlOKTsgLyogRW5hYmxlIExpbmUtaW4gY2FwdHVyZS4gTUlDIGluIGN1cnJlbnRseSB1bnRlc3RlZC4gKi8KKwkJaW50IHNpemUsIG47CisKKwkJc2l6ZSA9IEFSUkFZX1NJWkUoaTJjX2FkY19pbml0KTsKKyAgICAgICAgICAgICAgICAvL3NuZF9wcmludGsoIkkyQzphcnJheSBzaXplPTB4JXhcbiIsIHNpemUpOworCQlmb3IgKG49MDsgbiA8IHNpemU7IG4rKykgeworCQkJc25kX2NhMDEwNl9pMmNfd3JpdGUoY2hpcCwgaTJjX2FkY19pbml0W25dWzBdLCBpMmNfYWRjX2luaXRbbl1bMV0pOworCQl9CisJCWZvciAobj0wOyBuIDwgNDsgbisrKSB7CisJCQljaGlwLT5pMmNfY2FwdHVyZV92b2x1bWVbbl1bMF09IDB4Y2Y7CisJCQljaGlwLT5pMmNfY2FwdHVyZV92b2x1bWVbbl1bMV09IDB4Y2Y7CisJCX0KKwkJY2hpcC0+aTJjX2NhcHR1cmVfc291cmNlPTI7IC8qIExpbmUgaW4gKi8KKwkgICAgICAgIC8vc25kX2NhMDEwNl9pMmNfd3JpdGUoY2hpcCwgQURDX01VWCwgQURDX01VWF9MSU5FSU4pOyAvKiBFbmFibGUgTGluZS1pbiBjYXB0dXJlLiBNSUMgaW4gY3VycmVudGx5IHVudGVzdGVkLiAqLwogCX0KICAgICAgICAgaWYgKGNoaXAtPmRldGFpbHMtPnNwaV9kYWMgPT0gMSkgeyAvKiBUaGUgU0IwNTcwIHVzZSBTUEkgdG8gY29udHJvbCBEQUMuICovCiAJCWludCBzaXplLCBuOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X21peGVyLmMKaW5kZXggMDZmZTA1NS4uMTQ2ZWVkNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfbWl4ZXIuYworKysgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9taXhlci5jCkBAIC0xNzEsNiArMTcxLDc2IEBACiAgICAgICAgIHJldHVybiBjaGFuZ2U7CiB9CiAKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9pMmNfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjaGFyICp0ZXh0c1s2XSA9IHsKKwkJIlBob25lIiwgIk1pYyIsICJMaW5lIGluIiwgIkF1eCIKKwl9OworCisJdWluZm8tPnR5cGUgPSBTTkRSVl9DVExfRUxFTV9UWVBFX0VOVU1FUkFURUQ7CisJdWluZm8tPmNvdW50ID0gMTsKKwl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyA9IDQ7CisJaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPiAzKQorICAgICAgICAgICAgICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSAzOworCXN0cmNweSh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCB0ZXh0c1t1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9pMmNfY2FwdHVyZV9zb3VyY2VfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2NhMDEwNiAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVtdS0+aTJjX2NhcHR1cmVfc291cmNlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfaTJjX2NhcHR1cmVfc291cmNlX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9jYTAxMDYgKmVtdSA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwl1bnNpZ25lZCBpbnQgc291cmNlX2lkOworCXVuc2lnbmVkIGludCBuZ2Fpbiwgb2dhaW47CisJaW50IGNoYW5nZSA9IDA7CisJdTMyIHNvdXJjZTsKKwkvKiBJZiB0aGUgY2FwdHVyZSBzb3VyY2UgaGFzIGNoYW5nZWQsCisJICogdXBkYXRlIHRoZSBjYXB0dXJlIHZvbHVtZSBmcm9tIHRoZSBjYWNoZWQgdmFsdWUKKwkgKiBmb3IgdGhlIHBhcnRpY3VsYXIgc291cmNlLgorCSAqLworCXNvdXJjZV9pZCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gOworCWNoYW5nZSA9IChlbXUtPmkyY19jYXB0dXJlX3NvdXJjZSAhPSBzb3VyY2VfaWQpOworCWlmIChjaGFuZ2UpIHsKKwkJc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfTVVYLCAwKTsgLyogTXV0ZSBpbnB1dCAqLworCQluZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF07IC8qIExlZnQgKi8KKwkJb2dhaW4gPSBlbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtlbXUtPmkyY19jYXB0dXJlX3NvdXJjZV1bMF07IC8qIExlZnQgKi8KKwkJaWYgKG5nYWluICE9IG9nYWluKQorCQkJc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDTCwgKChuZ2FpbikgJiAweGZmKSk7CisJCW5nYWluID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXTsgLyogTGVmdCAqLworCQlvZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW2VtdS0+aTJjX2NhcHR1cmVfc291cmNlXVsxXTsgLyogTGVmdCAqLworCQlpZiAobmdhaW4gIT0gb2dhaW4pCisJCQlzbmRfY2EwMTA2X2kyY193cml0ZShlbXUsIEFEQ19BVFRFTl9BRENSLCAoKG5nYWluKSAmIDB4ZmYpKTsKKwkJc291cmNlID0gMSA8PCBzb3VyY2VfaWQ7CisJCXNuZF9jYTAxMDZfaTJjX3dyaXRlKGVtdSwgQURDX01VWCwgc291cmNlKTsgLyogU2V0IHNvdXJjZSAqLworCQllbXUtPmkyY19jYXB0dXJlX3NvdXJjZSA9IHNvdXJjZV9pZDsKKwl9CisgICAgICAgIHJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9jYXB0dXJlX2xpbmVfaW5fc2lkZV9vdXRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzWzJdID0geyAiU2lkZSBvdXQiLCAiTGluZSBpbiIgfTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IDE7CisJdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbXMgPSAyOworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID4gMSkKKyAgICAgICAgICAgICAgICB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNuZF9jYTAxMDZfY2FwdHVyZV9taWNfbGluZV9pbl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKIHsKQEAgLTIwNywxNiArMjc3LDE2IEBACiAJaWYgKGNoYW5nZSkgewogCQllbXUtPmNhcHR1cmVfbWljX2xpbmVfaW4gPSB2YWw7CiAJCWlmICh2YWwpIHsKLQkJCXNuZF9jYTAxMDZfaTJjX3dyaXRlKGVtdSwgQURDX01VWCwgQURDX01VWF9QSE9ORSk7IC8qIE11dGUgaW5wdXQgKi8KKwkJCS8vc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfTVVYLCAwKTsgLyogTXV0ZSBpbnB1dCAqLwogCQkJdG1wID0gaW5sKGVtdS0+cG9ydCtHUElPKSAmIH4weDQwMDsKIAkJCXRtcCA9IHRtcCB8IDB4NDAwOwogCQkJb3V0bCh0bXAsIGVtdS0+cG9ydCtHUElPKTsKLQkJCXNuZF9jYTAxMDZfaTJjX3dyaXRlKGVtdSwgQURDX01VWCwgQURDX01VWF9NSUMpOworCQkJLy9zbmRfY2EwMTA2X2kyY193cml0ZShlbXUsIEFEQ19NVVgsIEFEQ19NVVhfTUlDKTsKIAkJfSBlbHNlIHsKLQkJCXNuZF9jYTAxMDZfaTJjX3dyaXRlKGVtdSwgQURDX01VWCwgQURDX01VWF9QSE9ORSk7IC8qIE11dGUgaW5wdXQgKi8KKwkJCS8vc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfTVVYLCAwKTsgLyogTXV0ZSBpbnB1dCAqLwogCQkJdG1wID0gaW5sKGVtdS0+cG9ydCtHUElPKSAmIH4weDQwMDsKIAkJCW91dGwodG1wLCBlbXUtPnBvcnQrR1BJTyk7Ci0JCQlzbmRfY2EwMTA2X2kyY193cml0ZShlbXUsIEFEQ19NVVgsIEFEQ19NVVhfTElORUlOKTsKKwkJCS8vc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfTVVYLCBBRENfTVVYX0xJTkVJTik7CiAJCX0KIAl9CiAgICAgICAgIHJldHVybiBjaGFuZ2U7CkBAIC0yMjUsMTIgKzI5NSwyMiBAQAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9jYTAxMDZfY2FwdHVyZV9taWNfbGluZV9pbiBfX2RldmluaXRkYXRhID0KIHsKIAkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9CQkiTWljL0xpbmUgaW4gQ2FwdHVyZSIsCisJLm5hbWUgPQkJIlNoYXJlZCBNaWMvTGluZSBpbiBDYXB0dXJlIFN3aXRjaCIsCiAJLmluZm8gPQkJc25kX2NhMDEwNl9jYXB0dXJlX21pY19saW5lX2luX2luZm8sCiAJLmdldCA9CQlzbmRfY2EwMTA2X2NhcHR1cmVfbWljX2xpbmVfaW5fZ2V0LAogCS5wdXQgPQkJc25kX2NhMDEwNl9jYXB0dXJlX21pY19saW5lX2luX3B1dAogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9jYTAxMDZfY2FwdHVyZV9saW5lX2luX3NpZGVfb3V0IF9fZGV2aW5pdGRhdGEgPQoreworCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0JCSJTaGFyZWQgTGluZSBpbi9TaWRlIG91dCBDYXB0dXJlIFN3aXRjaCIsCisJLmluZm8gPQkJc25kX2NhMDEwNl9jYXB0dXJlX2xpbmVfaW5fc2lkZV9vdXRfaW5mbywKKwkuZ2V0ID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9taWNfbGluZV9pbl9nZXQsCisJLnB1dCA9CQlzbmRfY2EwMTA2X2NhcHR1cmVfbWljX2xpbmVfaW5fcHV0Cit9OworCisKIHN0YXRpYyBpbnQgc25kX2NhMDEwNl9zcGRpZl9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewpAQCAtMzI5LDE1ICs0MDksODEgQEAKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCBzbmRfY2EwMTA2X2kyY192b2x1bWVfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisgICAgICAgIHVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworICAgICAgICB1aW5mby0+Y291bnQgPSAyOworICAgICAgICB1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworICAgICAgICB1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAyNTU7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNuZF9jYTAxMDZfaTJjX3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworICAgICAgICBzdHJ1Y3Qgc25kX2NhMDEwNiAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBzb3VyY2VfaWQ7CisKKwlzb3VyY2VfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKworICAgICAgICB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF07CisgICAgICAgIHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2NhMDEwNl9pMmNfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisgICAgICAgIHN0cnVjdCBzbmRfY2EwMTA2ICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisgICAgICAgIHVuc2lnbmVkIGludCBvZ2FpbjsKKyAgICAgICAgdW5zaWduZWQgaW50IG5nYWluOworCWludCBzb3VyY2VfaWQ7CisJaW50IGNoYW5nZSA9IDA7CisKKwlzb3VyY2VfaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlvZ2FpbiA9IGVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMF07IC8qIExlZnQgKi8KKwluZ2FpbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWlmIChuZ2FpbiA+IDB4ZmYpCisJCXJldHVybiAwOworCWlmIChvZ2FpbiAhPSBuZ2FpbikgeworCQlpZiAoZW11LT5pMmNfY2FwdHVyZV9zb3VyY2UgPT0gc291cmNlX2lkKQorCQkJc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDTCwgKChuZ2FpbikgJiAweGZmKSApOworCQllbXUtPmkyY19jYXB0dXJlX3ZvbHVtZVtzb3VyY2VfaWRdWzBdID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJCWNoYW5nZSA9IDE7CisJfQorCW9nYWluID0gZW11LT5pMmNfY2FwdHVyZV92b2x1bWVbc291cmNlX2lkXVsxXTsgLyogUmlnaHQgKi8KKwluZ2FpbiA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdOworCWlmIChuZ2FpbiA+IDB4ZmYpCisJCXJldHVybiAwOworCWlmIChvZ2FpbiAhPSBuZ2FpbikgeworCQlpZiAoZW11LT5pMmNfY2FwdHVyZV9zb3VyY2UgPT0gc291cmNlX2lkKQorCQkJc25kX2NhMDEwNl9pMmNfd3JpdGUoZW11LCBBRENfQVRURU5fQURDUiwgKChuZ2FpbikgJiAweGZmKSk7CisJCWVtdS0+aTJjX2NhcHR1cmVfdm9sdW1lW3NvdXJjZV9pZF1bMV0gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXTsKKwkJY2hhbmdlID0gMTsKKwl9CisKKwlyZXR1cm4gY2hhbmdlOworfQorCiAjZGVmaW5lIENBX1ZPTFVNRSh4bmFtZSxjaGlkLHJlZykgXAogewkJCQkJCQkJXAogCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCAubmFtZSA9IHhuYW1lLAlcCi0JLmluZm8gPSBzbmRfY2EwMTA2X3ZvbHVtZV9pbmZvLAkJCQlcCi0JLmdldCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX2dldCwJCQlcCi0JLnB1dCA9ICAgICAgICAgIHNuZF9jYTAxMDZfdm9sdW1lX3B1dCwJCQlcCisJLmluZm8gPQkgc25kX2NhMDEwNl92b2x1bWVfaW5mbywJCQlcCisJLmdldCA9ICAgc25kX2NhMDEwNl92b2x1bWVfZ2V0LAkJCQlcCisJLnB1dCA9ICAgc25kX2NhMDEwNl92b2x1bWVfcHV0LAkJCQlcCiAJLnByaXZhdGVfdmFsdWUgPSAoKGNoaWQpIDw8IDgpIHwgKHJlZykJCQlcCiB9CiAKKyNkZWZpbmUgSTJDX1ZPTFVNRSh4bmFtZSxjaGlkKSBcCit7CQkJCQkJCQlcCisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsIC5uYW1lID0geG5hbWUsCVwKKwkuaW5mbyA9ICBzbmRfY2EwMTA2X2kyY192b2x1bWVfaW5mbywJCQlcCisJLmdldCA9ICAgc25kX2NhMDEwNl9pMmNfdm9sdW1lX2dldCwJCQlcCisJLnB1dCA9ICAgc25kX2NhMDEwNl9pMmNfdm9sdW1lX3B1dCwJCQlcCisJLnByaXZhdGVfdmFsdWUgPSBjaGlkCQkJCQlcCit9CisKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9jYTAxMDZfdm9sdW1lX2N0bHNbXSBfX2RldmluaXRkYXRhID0gewogCUNBX1ZPTFVNRSgiQW5hbG9nIEZyb250IFBsYXliYWNrIFZvbHVtZSIsCkBAIC0zNjEsNiArNTA3LDExIEBACiAgICAgICAgIENBX1ZPTFVNRSgiQ0FQVFVSRSBmZWVkYmFjayBQbGF5YmFjayBWb2x1bWUiLAogCQkgIDEsIENBUFRVUkVfQ09OVFJPTCksCiAKKyAgICAgICAgSTJDX1ZPTFVNRSgiUGhvbmUgQ2FwdHVyZSBWb2x1bWUiLCAwKSwKKyAgICAgICAgSTJDX1ZPTFVNRSgiTWljIENhcHR1cmUgVm9sdW1lIiwgMSksCisgICAgICAgIEkyQ19WT0xVTUUoIkxpbmUgaW4gQ2FwdHVyZSBWb2x1bWUiLCAyKSwKKyAgICAgICAgSTJDX1ZPTFVNRSgiQXV4IENhcHR1cmUgVm9sdW1lIiwgMyksCisKIAl7CiAJCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCwKIAkJLmlmYWNlID0gICAgICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKQEAgLTM3OCwxMiArNTI5LDE5IEBACiAJfSwKIAl7CiAJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAotCQkubmFtZSA9CQkiQ2FwdHVyZSBTb3VyY2UiLAorCQkubmFtZSA9CQkiRGlnaXRhbCBDYXB0dXJlIFNvdXJjZSIsCiAJCS5pbmZvID0JCXNuZF9jYTAxMDZfY2FwdHVyZV9zb3VyY2VfaW5mbywKIAkJLmdldCA9CQlzbmRfY2EwMTA2X2NhcHR1cmVfc291cmNlX2dldCwKIAkJLnB1dCA9CQlzbmRfY2EwMTA2X2NhcHR1cmVfc291cmNlX3B1dAogCX0sCiAJeworCQkuaWZhY2UgPQlTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPQkJIkNhcHR1cmUgU291cmNlIiwKKwkJLmluZm8gPQkJc25kX2NhMDEwNl9pMmNfY2FwdHVyZV9zb3VyY2VfaW5mbywKKwkJLmdldCA9CQlzbmRfY2EwMTA2X2kyY19jYXB0dXJlX3NvdXJjZV9nZXQsCisJCS5wdXQgPQkJc25kX2NhMDEwNl9pMmNfY2FwdHVyZV9zb3VyY2VfcHV0CisJfSwKKwl7CiAJCS5pZmFjZSA9CVNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKIAkJLm5hbWUgPSAgICAgICAgIFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxERUZBVUxUKSwKIAkJLmNvdW50ID0JNCwKQEAgLTQ3Nyw3ICs2MzUsMTAgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCWlmIChlbXUtPmRldGFpbHMtPmkyY19hZGMgPT0gMSkgewotCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBzbmRfY3RsX25ldzEoJnNuZF9jYTAxMDZfY2FwdHVyZV9taWNfbGluZV9pbiwgZW11KSk7CisJCWlmIChlbXUtPmRldGFpbHMtPmdwaW9fdHlwZSA9PSAxKQorCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X2NhcHR1cmVfbWljX2xpbmVfaW4sIGVtdSkpOworCQllbHNlICAvKiBncGlvX3R5cGUgPT0gMiAqLworCQkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZzbmRfY2EwMTA2X2NhcHR1cmVfbGluZV9pbl9zaWRlX291dCwgZW11KSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9wcm9jLmMgYi9zb3VuZC9wY2kvY2EwMTA2L2NhMDEwNl9wcm9jLmMKaW5kZXggNjM3NTcyNy4uNzVjYTQyMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NhMDEwNi9jYTAxMDZfcHJvYy5jCisrKyBiL3NvdW5kL3BjaS9jYTAxMDYvY2EwMTA2X3Byb2MuYwpAQCAtNDMxLDMzICs0MzEsMzAgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCQogCWlmKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiaWVjOTU4IiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDEwMjQsIHNuZF9jYTAxMDZfcHJvY19pZWM5NTgpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2NhMDEwNl9wcm9jX2llYzk1OCk7CiAJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJjYTAxMDZfcmVnMzIiLCAmZW50cnkpKSB7Ci0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQzMik7Ci0JCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkMzIpOwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2NhMDEwNl9wcm9jX3JlZ193cml0ZTMyOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwogCX0KIAlpZighIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImNhMDEwNl9yZWcxNiIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQxNik7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQxNik7CiAJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJjYTAxMDZfcmVnOCIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAxMDI0LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQ4KTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIHNuZF9jYTAxMDZfcHJvY19yZWdfcmVhZDgpOwogCWlmKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiY2EwMTA2X3JlZ3MxIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkMSk7Ci0JCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkMSk7CiAJCWVudHJ5LT5jLnRleHQud3JpdGUgPSBzbmRfY2EwMTA2X3Byb2NfcmVnX3dyaXRlOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwogLy8JCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBlbXU7CiAJfQogCWlmKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiY2EwMTA2X2kyYyIsICZlbnRyeSkpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDEwMjQsIHNuZF9jYTAxMDZfcHJvY19pMmNfd3JpdGUpOwotCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIHNuZF9jYTAxMDZfcHJvY19pMmNfd3JpdGUpOwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2NhMDEwNl9wcm9jX2kyY193cml0ZTsKIAkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKIC8vCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gZW11OwogCX0KIAlpZighIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImNhMDEwNl9yZWdzMiIsICZlbnRyeSkpIAotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2NhMDEwNl9wcm9jX3JlZ19yZWFkMik7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfY2EwMTA2X3Byb2NfcmVnX3JlYWQyKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NtaXBjaS5jIGIvc291bmQvcGNpL2NtaXBjaS5jCmluZGV4IGU1Y2UyZGEuLjA5MzhjMTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jbWlwY2kuYworKysgYi9zb3VuZC9wY2kvY21pcGNpLmMKQEAgLTIxMjEsNyArMjEyMSw3IEBACiAJQ01JUENJX01JWEVSX1ZPTF9NT05PKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCBDTV9SRUdfTUlYRVIyLCBDTV9WQURNSUNfU0hJRlQsIDcpLAogCUNNSVBDSV9TQl9WT0xfTU9OTygiUGhvbmUgUGxheWJhY2sgVm9sdW1lIiwgQ01fUkVHX0VYVEVOVF9JTkQsIDUsIDcpLAogCUNNSVBDSV9ET1VCTEUoIlBob25lIFBsYXliYWNrIFN3aXRjaCIsIENNX1JFR19FWFRFTlRfSU5ELCBDTV9SRUdfRVhURU5UX0lORCwgNCwgNCwgMSwgMCwgMCksCi0JQ01JUENJX0RPVUJMRSgiUEMgU3BlYWtlciBQbGF5bmFjayBTd2l0Y2giLCBDTV9SRUdfRVhURU5UX0lORCwgQ01fUkVHX0VYVEVOVF9JTkQsIDMsIDMsIDEsIDAsIDApLAorCUNNSVBDSV9ET1VCTEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgQ01fUkVHX0VYVEVOVF9JTkQsIENNX1JFR19FWFRFTlRfSU5ELCAzLCAzLCAxLCAwLCAwKSwKIAlDTUlQQ0lfRE9VQkxFKCJNaWMgQm9vc3QgQ2FwdHVyZSBTd2l0Y2giLCBDTV9SRUdfRVhURU5UX0lORCwgQ01fUkVHX0VYVEVOVF9JTkQsIDAsIDAsIDEsIDAsIDApLAogfTsKIApAQCAtMjYwMiw3ICsyNjAyLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY20tPmNhcmQsICJjbWlwY2kiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNtLCAxMDI0LCBzbmRfY21pcGNpX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY20sIHNuZF9jbWlwY2lfcHJvY19yZWFkKTsKIH0KICNlbHNlIC8qICFDT05GSUdfUFJPQ19GUyAqLwogc3RhdGljIGlubGluZSB2b2lkIHNuZF9jbWlwY2lfcHJvY19pbml0KHN0cnVjdCBjbWlwY2kgKmNtKSB7fQpAQCAtMjkzMiw3ICsyOTMyLDcgQEAKIAl9CiAKIAlpbnRlZ3JhdGVkX21pZGkgPSBzbmRfY21pcGNpX3JlYWRfYihjbSwgQ01fUkVHX01QVV9QQ0kpICE9IDB4ZmY7Ci0JaWYgKGludGVncmF0ZWRfbWlkaSkKKwlpZiAoaW50ZWdyYXRlZF9taWRpICYmIG1wdV9wb3J0W2Rldl0gPT0gMSkKIAkJaW9taWRpID0gY20tPmlvYmFzZSArIENNX1JFR19NUFVfUENJOwogCWVsc2UgewogCQlpb21pZGkgPSBtcHVfcG9ydFtkZXZdOwpAQCAtMjk4MSw3ICsyOTgxLDkgQEAKIAogCWlmIChpb21pZGkgPiAwKSB7CiAJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfQ01JUENJLAotCQkJCQkgICAgICAgaW9taWRpLCBpbnRlZ3JhdGVkX21pZGksCisJCQkJCSAgICAgICBpb21pZGksCisJCQkJCSAgICAgICAoaW50ZWdyYXRlZF9taWRpID8KKwkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQgOiAwKSwKIAkJCQkJICAgICAgIGNtLT5pcnEsIDAsICZjbS0+cm1pZGkpKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY21pcGNpOiBubyBVQVJUNDAxIGRldmljZSBhdCAweCVseFxuIiwgaW9taWRpKTsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDI4MS5jIGIvc291bmQvcGNpL2NzNDI4MS5jCmluZGV4IGIzYzk0ZDguLmU3N2E0Y2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQyODEuYworKysgYi9zb3VuZC9wY2kvY3M0MjgxLmMKQEAgLTExODQsNyArMTE4NCw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJjczQyODEiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHNuZF9jczQyODFfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBzbmRfY3M0MjgxX3Byb2NfcmVhZCk7CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImNzNDI4MV9CQTAiLCAmZW50cnkpKSB7CiAJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CiAJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOwpAQCAtMTM3OSw2ICsxMzc5LDEzIEBACiAJY2hpcC0+YmEwX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpLCAwKTsKIAljaGlwLT5iYTFfYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDEpOwogCisJY2hpcC0+YmEwID0gaW9yZW1hcF9ub2NhY2hlKGNoaXAtPmJhMF9hZGRyLCBwY2lfcmVzb3VyY2VfbGVuKHBjaSwgMCkpOworCWNoaXAtPmJhMSA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5iYTFfYWRkciwgcGNpX3Jlc291cmNlX2xlbihwY2ksIDEpKTsKKwlpZiAoIWNoaXAtPmJhMCB8fCAhY2hpcC0+YmExKSB7CisJCXNuZF9jczQyODFfZnJlZShjaGlwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQogCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX2NzNDI4MV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwKIAkJCSJDUzQyODEiLCBjaGlwKSkgewogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKQEAgLTEzODcsMTMgKzEzOTQsNiBAQAogCX0KIAljaGlwLT5pcnEgPSBwY2ktPmlycTsKIAotCWNoaXAtPmJhMCA9IGlvcmVtYXBfbm9jYWNoZShjaGlwLT5iYTBfYWRkciwgcGNpX3Jlc291cmNlX2xlbihwY2ksIDApKTsKLQljaGlwLT5iYTEgPSBpb3JlbWFwX25vY2FjaGUoY2hpcC0+YmExX2FkZHIsIHBjaV9yZXNvdXJjZV9sZW4ocGNpLCAxKSk7Ci0JaWYgKCFjaGlwLT5iYTAgfHwgIWNoaXAtPmJhMSkgewotCQlzbmRfY3M0MjgxX2ZyZWUoY2hpcCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQkKIAl0bXAgPSBzbmRfY3M0MjgxX2NoaXBfaW5pdChjaGlwKTsKIAlpZiAodG1wKSB7CiAJCXNuZF9jczQyODFfZnJlZShjaGlwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eC5jCmluZGV4IDg0OGQ3NzIuLjc3MmRjNTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczQ2eHgvY3M0Nnh4LmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHguYwpAQCAtNDgsOCArNDgsOCBAQAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwogc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCi1zdGF0aWMgaW50IGV4dGVybmFsX2FtcFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Owotc3RhdGljIGludCB0aGlua3BhZFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Oworc3RhdGljIGludCBleHRlcm5hbF9hbXBbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCB0aGlua3BhZFtTTkRSVl9DQVJEU107CiBzdGF0aWMgaW50IG1tYXBfdmFsaWRbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxfTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNDZ4eC9jczQ2eHhfbGliLmMgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwppbmRleCA2OWRiZjU0Li41YzIxMTQ0IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYworKysgYi9zb3VuZC9wY2kvY3M0Nnh4L2NzNDZ4eF9saWIuYwpAQCAtMjg3NywxNCArMjg3NywxNSBAQAogCWlmIChjaGlwLT5yZWdpb24uaWR4WzBdLnJlc291cmNlKQogCQlzbmRfY3M0Nnh4X2h3X3N0b3AoY2hpcCk7CiAKKwlpZiAoY2hpcC0+aXJxID49IDApCisJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcCk7CisKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IDU7IGlkeCsrKSB7CiAJCXN0cnVjdCBzbmRfY3M0Nnh4X3JlZ2lvbiAqcmVnaW9uID0gJmNoaXAtPnJlZ2lvbi5pZHhbaWR4XTsKIAkJaWYgKHJlZ2lvbi0+cmVtYXBfYWRkcikKIAkJCWlvdW5tYXAocmVnaW9uLT5yZW1hcF9hZGRyKTsKIAkJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShyZWdpb24tPnJlc291cmNlKTsKIAl9Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQotCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCiAJaWYgKGNoaXAtPmFjdGl2ZV9jdHJsKQogCQljaGlwLT5hY3RpdmVfY3RybChjaGlwLCAtY2hpcC0+YW1wbGlmaWVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYyBiL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3MuYwppbmRleCBmNDA3ZDJhLi41Yzk3MTFjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M0Nnh4L2RzcF9zcG9zLmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvcy5jCkBAIC03NjcsNyArNzY3LDYgQEAKIAlpZiAoKGVudHJ5ID0gc25kX2luZm9fY3JlYXRlX2NhcmRfZW50cnkoY2FyZCwgImRzcCIsIGNhcmQtPnByb2Nfcm9vdCkpICE9IE5VTEwpIHsKIAkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKIAkJZW50cnktPm1vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOwogICAgICAgCiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKQEAgLTc4NCw3ICs3ODMsNiBAQAogCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwogCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKIAkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBjczQ2eHhfZHNwX3Byb2Nfc3ltYm9sX3RhYmxlX3JlYWQ7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKQEAgLTc5Nyw3ICs3OTUsNiBAQAogCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwogCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKIAkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBjczQ2eHhfZHNwX3Byb2NfbW9kdWxlc19yZWFkOwogCQlpZiAoc25kX2luZm9fcmVnaXN0ZXIoZW50cnkpIDwgMCkgewogCQkJc25kX2luZm9fZnJlZV9lbnRyeShlbnRyeSk7CkBAIC04MTAsNyArODA3LDYgQEAKIAkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKIAkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7CiAJCWVudHJ5LT5tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSOwotCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDUxMjsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gY3M0Nnh4X2RzcF9wcm9jX3BhcmFtZXRlcl9kdW1wX3JlYWQ7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKQEAgLTgyMyw3ICs4MTksNiBAQAogCQllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwogCQllbnRyeS0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKIAkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBjczQ2eHhfZHNwX3Byb2Nfc2FtcGxlX2R1bXBfcmVhZDsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpAQCAtODM2LDcgKzgzMSw2IEBACiAJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CiAJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSA1MTI7CiAJCWVudHJ5LT5jLnRleHQucmVhZCA9IGNzNDZ4eF9kc3BfcHJvY190YXNrX3RyZWVfcmVhZDsKIAkJaWYgKHNuZF9pbmZvX3JlZ2lzdGVyKGVudHJ5KSA8IDApIHsKIAkJCXNuZF9pbmZvX2ZyZWVfZW50cnkoZW50cnkpOwpAQCAtODQ5LDcgKzg0Myw2IEBACiAJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX1RFWFQ7CiAJCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBjaGlwOwogCQllbnRyeS0+bW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VTUjsKLQkJZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAxMDI0OwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBjczQ2eHhfZHNwX3Byb2Nfc2NiX3JlYWQ7CiAJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CiAJCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczQ2eHgvZHNwX3Nwb3Nfc2NiX2xpYi5jIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMKaW5kZXggMmM0ZWU0NS4uMzg0NGQxOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMKKysrIGIvc291bmQvcGNpL2NzNDZ4eC9kc3Bfc3Bvc19zY2JfbGliLmMKQEAgLTI2Nyw3ICsyNjcsNiBAQAogCQkJZW50cnktPnByaXZhdGVfZGF0YSA9IHNjYl9pbmZvOwogCQkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1I7CiAgICAgICAKLQkJCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gNTEyOwogCQkJZW50cnktPmMudGV4dC5yZWFkID0gY3M0Nnh4X2RzcF9wcm9jX3NjYl9pbmZvX3JlYWQ7CiAgICAgICAKIAkJCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vTWFrZWZpbGUgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vTWFrZWZpbGUKaW5kZXggMDhkOGVlNi4uMjkxMWE4YSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9NYWtlZmlsZQpAQCAtNCw1ICs0LDkgQEAKIAogc25kLWNzNTUzNWF1ZGlvLW9ianMgOj0gY3M1NTM1YXVkaW8ubyBjczU1MzVhdWRpb19wY20ubwogCitpZmRlZiBDT05GSUdfUE0KK3NuZC1jczU1MzVhdWRpby1vYmpzICs9IGNzNTUzNWF1ZGlvX3BtLm8KK2VuZGlmCisKICMgVG9wbGV2ZWwgTW9kdWxlIERlcGVuZGVuY3kKIG9iai0kKENPTkZJR19TTkRfQ1M1NTM1QVVESU8pICs9IHNuZC1jczU1MzVhdWRpby5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCmluZGV4IDJjMTIxM2EuLjkxYzE4YTEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCisrKyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIERyaXZlciBmb3IgYXVkaW8gb24gbXVsdGlmdW5jdGlvbiBDUzU1MzUgY29tcGFuaW9uIGRldmljZQorICogRHJpdmVyIGZvciBhdWRpbyBvbiBtdWx0aWZ1bmN0aW9uIENTNTUzNS82IGNvbXBhbmlvbiBkZXZpY2UKICAqIENvcHlyaWdodCAoQykgSmF5YSBLdW1hcgogICoKICAqIEJhc2VkIG9uIEphcm9zbGF2IEt5c2VsYSBhbmQgVGFrYXNoaSBJd2FpJ3MgZXhhbXBsZXMuCkBAIC00MCwxNiArNDAsMzYgQEAKIAogI2RlZmluZSBEUklWRVJfTkFNRSAiY3M1NTM1YXVkaW8iCiAKK3N0YXRpYyBjaGFyICphYzk3X3F1aXJrOworbW9kdWxlX3BhcmFtKGFjOTdfcXVpcmssIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYWM5N19xdWlyaywgIkFDJzk3IGJvYXJkIHNwZWNpZmljIHdvcmthcm91bmRzLiIpOworCitzdGF0aWMgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSBfX2RldmluaXRkYXRhID0geworI2lmIDAgLyogTm90IHlldCBjb25maXJtZWQgaWYgYWxsIDU1MzYgYm9hcmRzIGFyZSBIUCBvbmx5ICovCisJeworCQkuc3VidmVuZG9yID0gUENJX1ZFTkRPUl9JRF9BTUQsIAorCQkuc3ViZGV2aWNlID0gUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0FVRElPLCAKKwkJLm5hbWUgPSAiQU1EIFJESyIsICAgICAKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisjZW5kaWYKKwl7fQorfTsKIAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsKIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsKIHN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsKIAorbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciAiIERSSVZFUl9OQU1FKTsKK21vZHVsZV9wYXJhbV9hcnJheShpZCwgY2hhcnAsIE5VTEwsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgIiBEUklWRVJfTkFNRSk7Cittb2R1bGVfcGFyYW1fYXJyYXkoZW5hYmxlLCBib29sLCBOVUxMLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlLCAiRW5hYmxlICIgRFJJVkVSX05BTUUpOworCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgc25kX2NzNTUzNWF1ZGlvX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Ci0JeyBQQ0lfVkVORE9SX0lEX05TLCBQQ0lfREVWSUNFX0lEX05TX0NTNTUzNV9BVURJTywKLQkgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAsIH0sCi0JeyBQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfQ1M1NTM2X0FVRElPLAotCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OUywgUENJX0RFVklDRV9JRF9OU19DUzU1MzVfQVVESU8pIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9DUzU1MzZfQVVESU8pIH0sCiAJe30KIH07CiAKQEAgLTkwLDcgKzExMCw4IEBACiAJCXVkZWxheSgxKTsKIAl9IHdoaWxlICgtLXRpbWVvdXQpOwogCWlmICghdGltZW91dCkKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAiRmFpbHVyZSByZWFkaW5nIGNzNTUzNSBjb2RlY1xuIik7CisJCXNuZF9wcmludGsoS0VSTl9FUlIgIkZhaWx1cmUgcmVhZGluZyBjb2RlYyByZWcgMHgleCwiCisJCQkJCSJMYXN0IHZhbHVlPTB4JXhcbiIsIHJlZywgdmFsKTsKIAogCXJldHVybiAodW5zaWduZWQgc2hvcnQpIHZhbDsKIH0KQEAgLTE0OCw2ICsxNjksOCBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAorCXNuZF9hYzk3X3R1bmVfaGFyZHdhcmUoY3M1NTM1YXUtPmFjOTcsIGFjOTdfcXVpcmtzLCBhYzk3X3F1aXJrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNDcsNiArMzcwLDggQEAKIAlpZiAoKGVyciA9IHNuZF9jczU1MzVhdWRpb19jcmVhdGUoY2FyZCwgcGNpLCAmY3M1NTM1YXUpKSA8IDApCiAJCWdvdG8gcHJvYmVmYWlsX291dDsKIAorCWNhcmQtPnByaXZhdGVfZGF0YSA9IGNzNTUzNWF1OworCiAJaWYgKChlcnIgPSBzbmRfY3M1NTM1YXVkaW9fbWl4ZXIoY3M1NTM1YXUpKSA8IDApCiAJCWdvdG8gcHJvYmVmYWlsX291dDsKIApAQCAtMzgzLDYgKzQwOCwxMCBAQAogCS5pZF90YWJsZSA9IHNuZF9jczU1MzVhdWRpb19pZHMsCiAJLnByb2JlID0gc25kX2NzNTUzNWF1ZGlvX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzbmRfY3M1NTM1YXVkaW9fcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IHNuZF9jczU1MzVhdWRpb19zdXNwZW5kLAorCS5yZXN1bWUgPSBzbmRfY3M1NTM1YXVkaW9fcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX2NhcmRfY3M1NTM1YXVkaW9faW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmggYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uaAppbmRleCA1ZTU1YTFhLi40ZmQxZjMxIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uaAorKysgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW8uaApAQCAtNzQsNiArNzQsOCBAQAogI2RlZmluZSBQUk1fUkRZX1NUUwkJCTB4MDA4MDAwMDAKICNkZWZpbmUgQUNDX0NPREVDX0NOVExfV1JfQ01ECQkofjB4ODAwMDAwMDApCiAjZGVmaW5lIEFDQ19DT0RFQ19DTlRMX1JEX0NNRAkJMHg4MDAwMDAwMAorI2RlZmluZSBBQ0NfQ09ERUNfQ05UTF9MTktfU0hVVERPV04JMHgwMDA0MDAwMAorI2RlZmluZSBBQ0NfQ09ERUNfQ05UTF9MTktfV1JNX1JTVAkweDAwMDIwMDAwCiAjZGVmaW5lIFBSRF9KTVAJCQkJMHgyMDAwCiAjZGVmaW5lIFBSRF9FT1AJCQkJMHg0MDAwCiAjZGVmaW5lIFBSRF9FT1QJCQkJMHg4MDAwCkBAIC04OCw2ICs5MCw3IEBACiAJdm9pZCAoKmRpc2FibGVfZG1hKShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1KTsKIAl2b2lkICgqcGF1c2VfZG1hKShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1KTsKIAl2b2lkICgqc2V0dXBfcHJkKShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1LCB1MzIgcHJkX2FkZHIpOworCXUzMiAoKnJlYWRfcHJkKShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1KTsKIAl1MzIgKCpyZWFkX2RtYV9wbnRyKShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1KTsKIH07CiAKQEAgLTEwMywxMSArMTA2LDE0IEBACiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJdW5zaWduZWQgaW50IGJ1Zl9hZGRyLCBidWZfYnl0ZXM7CiAJdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlcywgcGVyaW9kczsKKwlpbnQgc3VzcGVuZGVkOworCXUzMiBzYXZlZF9wcmQ7CiB9OwogCiBzdHJ1Y3QgY3M1NTM1YXVkaW8gewogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2FjOTcgKmFjOTc7CisJc3RydWN0IHNuZF9wY20gKnBjbTsKIAlpbnQgaXJxOwogCXN0cnVjdCBwY2lfZGV2ICpwY2k7CiAJdW5zaWduZWQgbG9uZyBwb3J0OwpAQCAtMTE3LDYgKzEyMyw4IEBACiAJc3RydWN0IGNzNTUzNWF1ZGlvX2RtYSBkbWFzW05VTV9DUzU1MzVBVURJT19ETUFTXTsKIH07CiAKK2ludCBzbmRfY3M1NTM1YXVkaW9fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGNpLCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworaW50IHNuZF9jczU1MzVhdWRpb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaSk7CiBpbnQgX19kZXZpbml0IHNuZF9jczU1MzVhdWRpb19wY20oc3RydWN0IGNzNTUzNWF1ZGlvICpjczU1MzVhdWRpbyk7CiAKICNlbmRpZiAvKiBfX1NPVU5EX0NTNTUzNUFVRElPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYyBiL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpb19wY20uYwppbmRleCA2MGJiODJiLi5mMGE0ODY5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcGNtLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BjbS5jCkBAIC00Myw3ICs0Myw4IEBACiAJCSAJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKIAkJIAkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CiAJCSAJCVNORFJWX1BDTV9JTkZPX1BBVVNFIHwKLQkJCQlTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUCisJCQkJU05EUlZfUENNX0lORk9fU1lOQ19TVEFSVCB8CisJCQkJU05EUlZfUENNX0lORk9fUkVTVU1FCiAJCQkJKSwKIAkuZm9ybWF0cyA9CQkoCiAJCQkJU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUKQEAgLTE5Myw2ICsxOTQsMTEgQEAKIAljc193cml0ZWwoY3M1NTM1YXUsIEFDQ19CTTBfUFJELCBwcmRfYWRkcik7CiB9CiAKK3N0YXRpYyB1MzIgY3M1NTM1YXVkaW9fcGxheWJhY2tfcmVhZF9wcmQoc3RydWN0IGNzNTUzNWF1ZGlvICpjczU1MzVhdSkKK3sKKwlyZXR1cm4gY3NfcmVhZGwoY3M1NTM1YXUsIEFDQ19CTTBfUFJEKTsKK30KKwogc3RhdGljIHUzMiBjczU1MzVhdWRpb19wbGF5YmFja19yZWFkX2RtYV9wbnRyKHN0cnVjdCBjczU1MzVhdWRpbyAqY3M1NTM1YXUpCiB7CiAJcmV0dXJuIGNzX3JlYWRsKGNzNTUzNWF1LCBBQ0NfQk0wX1BOVFIpOwpAQCAtMjE5LDYgKzIyNSwxMSBAQAogCWNzX3dyaXRlbChjczU1MzVhdSwgQUNDX0JNMV9QUkQsIHByZF9hZGRyKTsKIH0KIAorc3RhdGljIHUzMiBjczU1MzVhdWRpb19jYXB0dXJlX3JlYWRfcHJkKHN0cnVjdCBjczU1MzVhdWRpbyAqY3M1NTM1YXUpCit7CisJcmV0dXJuIGNzX3JlYWRsKGNzNTUzNWF1LCBBQ0NfQk0xX1BSRCk7Cit9CisKIHN0YXRpYyB1MzIgY3M1NTM1YXVkaW9fY2FwdHVyZV9yZWFkX2RtYV9wbnRyKHN0cnVjdCBjczU1MzVhdWRpbyAqY3M1NTM1YXUpCiB7CiAJcmV0dXJuIGNzX3JlYWRsKGNzNTUzNWF1LCBBQ0NfQk0xX1BOVFIpOwpAQCAtMjg1LDkgKzI5NiwxNyBAQAogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNzNTUzNWF1KTsKIAkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJCWRtYS0+b3BzLT5lbmFibGVfZG1hKGNzNTUzNWF1KTsKKwkJZG1hLT5zdXNwZW5kZWQgPSAwOworCQlicmVhazsKIAljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CiAJCWRtYS0+b3BzLT5kaXNhYmxlX2RtYShjczU1MzVhdSk7CiAJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJZG1hLT5vcHMtPmRpc2FibGVfZG1hKGNzNTUzNWF1KTsKKwkJZG1hLT5zdXNwZW5kZWQgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmhhbmRsZWQgdHJpZ2dlclxuIik7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0zNzUsNiArMzk0LDcgQEAKICAgICAgICAgLmVuYWJsZV9kbWEgPSBjczU1MzVhdWRpb19wbGF5YmFja19lbmFibGVfZG1hLAogICAgICAgICAuZGlzYWJsZV9kbWEgPSBjczU1MzVhdWRpb19wbGF5YmFja19kaXNhYmxlX2RtYSwKICAgICAgICAgLnNldHVwX3ByZCA9IGNzNTUzNWF1ZGlvX3BsYXliYWNrX3NldHVwX3ByZCwKKyAgICAgICAgLnJlYWRfcHJkID0gY3M1NTM1YXVkaW9fcGxheWJhY2tfcmVhZF9wcmQsCiAgICAgICAgIC5wYXVzZV9kbWEgPSBjczU1MzVhdWRpb19wbGF5YmFja19wYXVzZV9kbWEsCiAgICAgICAgIC5yZWFkX2RtYV9wbnRyID0gY3M1NTM1YXVkaW9fcGxheWJhY2tfcmVhZF9kbWFfcG50ciwKIH07CkBAIC0zODQsNiArNDA0LDcgQEAKICAgICAgICAgLmVuYWJsZV9kbWEgPSBjczU1MzVhdWRpb19jYXB0dXJlX2VuYWJsZV9kbWEsCiAgICAgICAgIC5kaXNhYmxlX2RtYSA9IGNzNTUzNWF1ZGlvX2NhcHR1cmVfZGlzYWJsZV9kbWEsCiAgICAgICAgIC5zZXR1cF9wcmQgPSBjczU1MzVhdWRpb19jYXB0dXJlX3NldHVwX3ByZCwKKyAgICAgICAgLnJlYWRfcHJkID0gY3M1NTM1YXVkaW9fY2FwdHVyZV9yZWFkX3ByZCwKICAgICAgICAgLnBhdXNlX2RtYSA9IGNzNTUzNWF1ZGlvX2NhcHR1cmVfcGF1c2VfZG1hLAogICAgICAgICAucmVhZF9kbWFfcG50ciA9IGNzNTUzNWF1ZGlvX2NhcHR1cmVfcmVhZF9kbWFfcG50ciwKIH07CkBAIC00MTMsNiArNDM0LDcgQEAKIAlzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwgU05EUlZfRE1BX1RZUEVfREVWLAogCQkJCQlzbmRfZG1hX3BjaV9kYXRhKGNzNTUzNWF1LT5wY2kpLAogCQkJCQk2NCoxMDI0LCAxMjgqMTAyNCk7CisJY3M1NTM1YXUtPnBjbSA9IHBjbTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMgYi9zb3VuZC9wY2kvY3M1NTM1YXVkaW8vY3M1NTM1YXVkaW9fcG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQwZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvX3BtLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBQb3dlciBtYW5hZ2VtZW50IGZvciBhdWRpbyBvbiBtdWx0aWZ1bmN0aW9uIENTNTUzNSBjb21wYW5pb24gZGV2aWNlCisgKiBDb3B5cmlnaHQgKEMpIEpheWEgS3VtYXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlICJjczU1MzVhdWRpby5oIgorCitzdGF0aWMgdm9pZCBzbmRfY3M1NTM1YXVkaW9fc3RvcF9oYXJkd2FyZShzdHJ1Y3QgY3M1NTM1YXVkaW8gKmNzNTUzNWF1KQoreworCS8qIAorCXdlIGRlcGVuZCBvbiBzbmRfYWM5N19zdXNwZW5kIHRvIHRlbGwgdGhlCisJQUM5NyBjb2RlYyB0byBzaHV0ZG93bi4gdGhlIGFtZCBzcGVjIHN1Z2dlc3RzCisJdGhhdCB0aGUgTE5LX1NIVVRET1dOIGJlIGRvbmUgYXQgdGhlIHNhbWUgdGltZQorCXRoYXQgdGhlIGNvZGVjIHBvd2VyLWRvd24gaXMgaXNzdWVkLiBpbnN0ZWFkLAorCXdlIGRvIGl0IGp1c3QgYWZ0ZXIgcmF0aGVyIHRoYW4gYXQgdGhlIHNhbWUgCisJdGltZS4gZXhjbHVkaW5nIGNvZGVjIHNwZWNpZmljIGJ1aWxkX29wcy0+c3VzcGVuZAorCWFjOTcgcG93ZXJkb3duIGhpdHM6CisJMHg4MDAwIEVBUEQgCisJMHg0MDAwIEhlYWRwaG9uZSBhbXBsaWZpZXIgCisJMHgwMzAwIEFEQyAmIERBQyAKKwkweDA0MDAgQW5hbG9nIE1peGVyIHBvd2VyZG93biAoVnJlZiBvbikgCisJSSBhbSBub3Qgc3VyZSBpZiB0aGlzIGlzIHRoZSBiZXN0IHRoYXQgd2UgY2FuIGRvLgorCVRoZSByZW1haW5kZXIgdG8gYmUgaW52ZXN0aWdhdGVkIGFyZToKKwktIGFuYWxvZyBtaXhlciAodnJlZiBvZmYpIDB4MDgwMAorCS0gQUMtbGluayBwb3dlcmRvd24gMHgxMDAwCisJLSBjb2RlYyBpbnRlcm5hbCBjbG9jayAweDIwMDAKKwkqLworCisJLyogc2V0IExOS19TSFVURE9XTiB0byBzaHV0ZG93biBBQyBsaW5rICovCisJY3Nfd3JpdGVsKGNzNTUzNWF1LCBBQ0NfQ09ERUNfQ05UTCwgQUNDX0NPREVDX0NOVExfTE5LX1NIVVRET1dOKTsKKworfQorCitpbnQgc25kX2NzNTUzNWF1ZGlvX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaSwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBjczU1MzVhdWRpbyAqY3M1NTM1YXUgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJaW50IGk7CisKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DUzU1MzVBVURJT19ETUFTOyBpKyspIHsKKwkJc3RydWN0IGNzNTUzNWF1ZGlvX2RtYSAqZG1hID0gJmNzNTUzNWF1LT5kbWFzW2ldOworCQlpZiAoZG1hICYmIGRtYS0+c3Vic3RyZWFtICYmICFkbWEtPnN1c3BlbmRlZCkgCisJCQlkbWEtPnNhdmVkX3ByZCA9IGRtYS0+b3BzLT5yZWFkX3ByZChjczU1MzVhdSk7CisJfQorCXNuZF9wY21fc3VzcGVuZF9hbGwoY3M1NTM1YXUtPnBjbSk7CisJc25kX2FjOTdfc3VzcGVuZChjczU1MzVhdS0+YWM5Nyk7CisJLyogc2F2ZSBpbXBvcnRhbnQgcmVncywgdGhlbiBkaXNhYmxlIGFjbGluayBpbiBodyAqLworCXNuZF9jczU1MzVhdWRpb19zdG9wX2hhcmR3YXJlKGNzNTUzNWF1KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKKwlwY2lfc2F2ZV9zdGF0ZShwY2kpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzbmRfY3M1NTM1YXVkaW9fcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwY2kpCit7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7CisJc3RydWN0IGNzNTUzNWF1ZGlvICpjczU1MzVhdSA9IGNhcmQtPnByaXZhdGVfZGF0YTsKKwl1MzIgdG1wOworCWludCB0aW1lb3V0OworCWludCBpOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGNpKTsKKwlwY2lfZW5hYmxlX2RldmljZShwY2kpOworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CisKKwkvKiBzZXQgTE5LX1dSTV9SU1QgdG8gcmVzZXQgQUMgbGluayAqLworCWNzX3dyaXRlbChjczU1MzVhdSwgQUNDX0NPREVDX0NOVEwsIEFDQ19DT0RFQ19DTlRMX0xOS19XUk1fUlNUKTsKKworCXRpbWVvdXQgPSA1MDsKKwlkbyB7CisJCXRtcCA9IGNzX3JlYWRsKGNzNTUzNWF1LCBBQ0NfQ09ERUNfU1RBVFVTKTsKKwkJaWYgKHRtcCAmIFBSTV9SRFlfU1RTKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJaWYgKCF0aW1lb3V0KQorCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJGYWlsdXJlIGdldHRpbmcgQUMgTGluayByZWFkeVxuIik7CisKKwkvKiB3ZSBkZXBlbmQgb24gYWM5NyB0byBwZXJmb3JtIHRoZSBjb2RlYyBwb3dlciB1cCAqLworCXNuZF9hYzk3X3Jlc3VtZShjczU1MzVhdS0+YWM5Nyk7CisJLyogc2V0IHVwIHJhdGUgcmVncywgZG1hLiBhY3R1YWwgaW5pdGlhdGlvbiBpcyBkb25lIGluIHRyaWcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NTNTUzNUFVRElPX0RNQVM7IGkrKykgeworCQlzdHJ1Y3QgY3M1NTM1YXVkaW9fZG1hICpkbWEgPSAmY3M1NTM1YXUtPmRtYXNbaV07CisJCWlmIChkbWEgJiYgZG1hLT5zdWJzdHJlYW0gJiYgZG1hLT5zdXNwZW5kZWQpIHsKKwkJCWRtYS0+c3Vic3RyZWFtLT5vcHMtPnByZXBhcmUoZG1hLT5zdWJzdHJlYW0pOworCQkJZG1hLT5vcHMtPnNldHVwX3ByZChjczU1MzVhdSwgZG1hLT5zYXZlZF9wcmQpOworCQl9CisJfQorCQkKKwlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EMCk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMS5jCmluZGV4IDQyYjExYmEuLjU0OTY3M2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazEuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxLmMKQEAgLTQ2LDEzICs0NiwxMyBAQAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwogc3RhdGljIGludCBlbmFibGVbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9FTkFCTEVfUE5QOwkvKiBFbmFibGUgdGhpcyBjYXJkICovCi1zdGF0aWMgaW50IGV4dGluW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07Ci1zdGF0aWMgaW50IGV4dG91dFtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Oworc3RhdGljIGludCBleHRpbltTTkRSVl9DQVJEU107CitzdGF0aWMgaW50IGV4dG91dFtTTkRSVl9DQVJEU107CiBzdGF0aWMgaW50IHNlcV9wb3J0c1tTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDR9Owogc3RhdGljIGludCBtYXhfc3ludGhfdm9pY2VzW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gNjR9Owogc3RhdGljIGludCBtYXhfYnVmZmVyX3NpemVbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxMjh9Owotc3RhdGljIGludCBlbmFibGVfaXJbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAwfTsKLXN0YXRpYyB1aW50IHN1YnN5c3RlbVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9OyAvKiBGb3JjZSBjYXJkIHN1YnN5c3RlbSBtb2RlbCAqLworc3RhdGljIGludCBlbmFibGVfaXJbU05EUlZfQ0FSRFNdOworc3RhdGljIHVpbnQgc3Vic3lzdGVtW1NORFJWX0NBUkRTXTsgLyogRm9yY2UgY2FyZCBzdWJzeXN0ZW0gbW9kZWwgKi8KIAogbW9kdWxlX3BhcmFtX2FycmF5KGluZGV4LCBpbnQsIE5VTEwsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciB0aGUgRU1VMTBLMSBzb3VuZGNhcmQuIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX21haW4uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCmluZGV4IDZiZmEwODQuLjQyYTM1OGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jCkBAIC03NzcsMTQgKzc3Nyw2IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX2VtdV9jaGlwX2RldGFpbHMgZW11X2NoaXBfZGV0YWlsc1tdID0gewogCS8qIEF1ZGlneSAyIFZhbHVlIEFDMyBvdXQgZG9lcyBub3Qgd29yayB5ZXQuIE5lZWQgdG8gZmluZCBvdXQgaG93IHRvIHR1cm4gb2ZmIGludGVycG9sYXRvcnMuKi8KLQkvKiBBdWRpZ3k0IFNCMDQwMCAqLwotCXsudmVuZG9yID0gMHgxMTAyLCAuZGV2aWNlID0gMHgwMDA4LCAuc3Vic3lzdGVtID0gMHgxMDIxMTEwMiwKLQkgLmRyaXZlciA9ICJBdWRpZ3kyIiwgLm5hbWUgPSAiQXVkaWd5IDQgW1NCMDQwMF0iLCAKLQkgLmlkID0gIkF1ZGlneTIiLAotCSAuZW11MTBrMl9jaGlwID0gMSwKLQkgLmNhMDEwOF9jaGlwID0gMSwKLQkgLnNwazcxID0gMSwKLQkgLmFjOTdfY2hpcCA9IDF9ICwKIAkvKiBUZXN0ZWQgYnkgSmFtZXNAc3VwZXJidWcuY28udWsgM3JkIEp1bHkgMjAwNSAqLwogCS8qIERTUDogQ0EwMTA4LUlBVAogCSAqIERBQzogQ1M0MzgyLUtRCkBAIC03OTksMTMgKzc5MSw1OSBAQAogCSAuY2EwMTA4X2NoaXAgPSAxLAogCSAuc3BrNzEgPSAxLAogCSAuYWM5N19jaGlwID0gMX0gLAorCS8qIEF1ZGlneTQgKE5vdCBQUk8pIFNCMDYxMCAqLworCS8qIFRlc3RlZCBieSBKYW1lc0BzdXBlcmJ1Zy5jby51ayA0dGggQXByaWwgMjAwNiAqLworCS8qIEFfSU9DRkcgYml0cworCSAqIE91dHB1dAorCSAqIDA6ID8KKwkgKiAxOiA/CisJICogMjogPworCSAqIDM6IDAgLSBEaWdpdGFsIE91dCwgMSAtIExpbmUgaW4KKwkgKiA0OiA/CisJICogNTogPworCSAqIDY6ID8KKwkgKiA3OiA/CisJICogSW5wdXQKKwkgKiA4OiA/CisJICogOTogPworCSAqIEE6IEdyZWVuIGphY2sgc2Vuc2UgKEZyb250KQorCSAqIEI6ID8KKwkgKiBDOiBCbGFjayBqYWNrIHNlbnNlIChSZWFyL1NpZGUgUmlnaHQpCisJICogRDogWWVsbG93IGphY2sgc2Vuc2UgKENlbnRlci9MRkUvU2lkZSBMZWZ0KQorCSAqIEU6ID8KKwkgKiBGOiA/CisJICoKKwkgKiBEaWdpdGFsIE91dC9MaW5lIGluIHN3aXRjaCB1c2luZyBBX0lPQ0ZHIGJpdCAzICgweDA4KQorCSAqIDAgLSBEaWdpdGFsIE91dAorCSAqIDEgLSBMaW5lIGluCisJICovCisJLyogTWljIGlucHV0IG5vdCB0ZXN0ZWQuCisJICogQW5hbG9nIENEIGlucHV0IG5vdCB0ZXN0ZWQKKwkgKiBEaWdpdGFsIE91dCBub3QgdGVzdGVkLgorCSAqIExpbmUgaW4gd29ya2luZy4KKwkgKiBBdWRpbyBvdXRwdXQgNS4xIHdvcmtpbmcuIFNpZGUgb3V0cHV0cyBub3Qgd29ya2luZy4KKwkgKi8KKwkvKiBEU1A6IENBMTAzMDAtSUFUIExGCisJICogREFDOiBDaXJydXMgTG9naWMgQ1M0MzgyLUtRWgorCSAqIEFEQzogUGhpbGlwcyAxMzYxVAorCSAqIEFDOTc6IFNpZ21hdGVsIFNUQUM5NzUwCisJICogQ0EwMTUxOiBOb25lCisJICovCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsIC5zdWJzeXN0ZW0gPSAweDEwMjExMTAyLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJBdWRpZ3kgNCBbU0IwNjEwXSIsIAorCSAuaWQgPSAiQXVkaWd5MiIsCisJIC5lbXUxMGsyX2NoaXAgPSAxLAorCSAuY2EwMTA4X2NoaXAgPSAxLAorCSAuc3BrNzEgPSAxLAorCSAuYWRjXzEzNjF0ID0gMSwgIC8qIDI0IGJpdCBjYXB0dXJlIGluc3RlYWQgb2YgMTZiaXQgKi8KKwkgLmFjOTdfY2hpcCA9IDF9ICwKIAkvKiBBdWRpZ3kgMiBaUyBOb3RlYm9vayBDYXJkYnVzIGNhcmQuKi8KIAkvKiBUZXN0ZWQgYnkgSmFtZXNAc3VwZXJidWcuY28udWsgMjJ0aCBEZWNlbWJlciAyMDA1ICovCiAJLyogQXVkaW8gb3V0cHV0IDcuMS9IZWFkcGhvbmVzIHdvcmtpbmcuCiAJICogRGlnaXRhbCBvdXRwdXQgd29ya2luZy4gKEFDMyBub3QgY2hlY2tlZCwgb25seSBQQ00pCiAJICogQXVkaW8gaW5wdXRzIG5vdCB0ZXN0ZWQuCiAJICovIAotCS8qIERTUDogVGlueTIKKwkvKiBEU1A6IFRpbmEyCiAJICogREFDOiBXb2xmc29uIFdNODc2OC9XTTg1NjgKIAkgKiBBREM6IFdvbGZzb24gV004Nzc1CiAJICogQUM5NzogTm9uZQpAQCAtMTQyMSwxNiArMTQ1OSwzIEBACiAJfQogfQogI2VuZGlmCi0KLS8qIG1lbW9yeS5jICovCi1FWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3N5bnRoX2FsbG9jKTsKLUVYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfc3ludGhfZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3N5bnRoX2J6ZXJvKTsKLUVYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfc3ludGhfY29weV9mcm9tX3VzZXIpOwotRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9tZW1ibGtfbWFwKTsKLS8qIHZvaWNlLmMgKi8KLUVYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfdm9pY2VfYWxsb2MpOwotRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV92b2ljZV9mcmVlKTsKLS8qIGlvLmMgKi8KLUVYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfcHRyX3JlYWQpOwotRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9wdHJfd3JpdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazF4LmMKaW5kZXggZDUxMjkwYy4uMGZiMjdlNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMXguYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxeC5jCkBAIC0xMDU1LDggKzEwNTUsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAJCiAJaWYoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJlbXUxMGsxeF9yZWdzIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2VtdTEwazF4X3Byb2NfcmVnX3JlYWQpOwotCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIHNuZF9lbXUxMGsxeF9wcm9jX3JlZ19yZWFkKTsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9lbXUxMGsxeF9wcm9jX3JlZ193cml0ZTsKIAkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKIAkJZW50cnktPnByaXZhdGVfZGF0YSA9IGVtdTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCmluZGV4IDJhOWQxMmQuLmMzMWYzZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYwpAQCAtNzc3LDYgKzc3Nyw4IEBACiAJfTsKIAlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbW92ZV9jdGxzW10gPSB7CiAJCS8qIE1hc3Rlci9QQ00gY29udHJvbHMgb24gYWM5NyBvZiBBdWRpZ3kgaGFzIG5vIGVmZmVjdCAqLworCQkvKiBPbiB0aGUgQXVkaWd5MiB0aGUgQUM5NyBwbGF5YmFjayBpcyBwaXBlZCBpbnRvCisJCSAqIHRoZSBQaGlsaXBzIEFEQyBmb3IgMjRiaXQgY2FwdHVyZSAqLwogCQkiUENNIFBsYXliYWNrIFN3aXRjaCIsCiAJCSJQQ00gUGxheWJhY2sgVm9sdW1lIiwKIAkJIk1hc3RlciBNb25vIFBsYXliYWNrIFN3aXRjaCIsCkBAIC04MDQsNiArODA2LDQ3IEBACiAJCSJBTWljIFBsYXliYWNrIFZvbHVtZSIsICJNaWMgUGxheWJhY2sgVm9sdW1lIiwKIAkJTlVMTAogCX07CisJc3RhdGljIGNoYXIgKmF1ZGlneV9yZW1vdmVfY3Rsc18xMzYxdF9hZGNbXSA9IHsKKwkJLyogT24gdGhlIEF1ZGlneTIgdGhlIEFDOTcgcGxheWJhY2sgaXMgcGlwZWQgaW50bworCQkgKiB0aGUgUGhpbGlwcyBBREMgZm9yIDI0Yml0IGNhcHR1cmUgKi8KKwkJIlBDTSBQbGF5YmFjayBTd2l0Y2giLAorCQkiUENNIFBsYXliYWNrIFZvbHVtZSIsCisJCSJNYXN0ZXIgTW9ubyBQbGF5YmFjayBTd2l0Y2giLAorCQkiTWFzdGVyIE1vbm8gUGxheWJhY2sgVm9sdW1lIiwKKwkJIkNhcHR1cmUgU291cmNlIiwKKwkJIkNhcHR1cmUgU3dpdGNoIiwKKwkJIkNhcHR1cmUgVm9sdW1lIiwKKwkJIk1pYyBDYXB0dXJlIFZvbHVtZSIsCisJCSJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKKwkJIkhlYWRwaG9uZSBQbGF5YmFjayBWb2x1bWUiLAorCQkiM0QgQ29udHJvbCAtIENlbnRlciIsCisJCSIzRCBDb250cm9sIC0gRGVwdGgiLAorCQkiM0QgQ29udHJvbCAtIFN3aXRjaCIsCisJCSJMaW5lMiBQbGF5YmFjayBWb2x1bWUiLAorCQkiTGluZTIgQ2FwdHVyZSBWb2x1bWUiLAorCQlOVUxMCisJfTsKKwlzdGF0aWMgY2hhciAqYXVkaWd5X3JlbmFtZV9jdGxzXzEzNjF0X2FkY1tdID0geworCQkiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsICJNYXN0ZXIgQ2FwdHVyZSBTd2l0Y2giLAorCQkiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsICJNYXN0ZXIgQ2FwdHVyZSBWb2x1bWUiLAorCQkiV2F2ZSBNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgIk1hc3RlciBQbGF5YmFjayBWb2x1bWUiLAorCQkiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLCAiUEMgU3BlYWtlciBDYXB0dXJlIFN3aXRjaCIsCisJCSJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsICJQQyBTcGVha2VyIENhcHR1cmUgVm9sdW1lIiwKKwkJIlBob25lIFBsYXliYWNrIFN3aXRjaCIsICJQaG9uZSBDYXB0dXJlIFN3aXRjaCIsCisJCSJQaG9uZSBQbGF5YmFjayBWb2x1bWUiLCAiUGhvbmUgQ2FwdHVyZSBWb2x1bWUiLAorCQkiTWljIFBsYXliYWNrIFN3aXRjaCIsICJNaWMgQ2FwdHVyZSBTd2l0Y2giLAorCQkiTWljIFBsYXliYWNrIFZvbHVtZSIsICJNaWMgQ2FwdHVyZSBWb2x1bWUiLAorCQkiTGluZSBQbGF5YmFjayBTd2l0Y2giLCAiTGluZSBDYXB0dXJlIFN3aXRjaCIsCisJCSJMaW5lIFBsYXliYWNrIFZvbHVtZSIsICJMaW5lIENhcHR1cmUgVm9sdW1lIiwKKwkJIkNEIFBsYXliYWNrIFN3aXRjaCIsICJDRCBDYXB0dXJlIFN3aXRjaCIsCisJCSJDRCBQbGF5YmFjayBWb2x1bWUiLCAiQ0QgQ2FwdHVyZSBWb2x1bWUiLAorCQkiQXV4IFBsYXliYWNrIFN3aXRjaCIsICJBdXggQ2FwdHVyZSBTd2l0Y2giLAorCQkiQXV4IFBsYXliYWNrIFZvbHVtZSIsICJBdXggQ2FwdHVyZSBWb2x1bWUiLAorCQkiVmlkZW8gUGxheWJhY2sgU3dpdGNoIiwgIlZpZGVvIENhcHR1cmUgU3dpdGNoIiwKKwkJIlZpZGVvIFBsYXliYWNrIFZvbHVtZSIsICJWaWRlbyBDYXB0dXJlIFZvbHVtZSIsCisKKwkJTlVMTAorCX07CiAKIAlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+YWM5N19jaGlwKSB7CiAJCXN0cnVjdCBzbmRfYWM5N19idXMgKnBidXM7CkBAIC04MzQsNyArODc3LDEwIEBACiAJCQlzbmRfYWM5N193cml0ZV9jYWNoZShlbXUtPmFjOTcsIEFDOTdfTUFTVEVSLCAweDAwMDApOwogCQkJLyogc2V0IGNhcHR1cmUgc291cmNlIHRvIG1pYyAqLwogCQkJc25kX2FjOTdfd3JpdGVfY2FjaGUoZW11LT5hYzk3LCBBQzk3X1JFQ19TRUwsIDB4MDAwMCk7Ci0JCQljID0gYXVkaWd5X3JlbW92ZV9jdGxzOworCQkJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmFkY18xMzYxdCkKKwkJCQljID0gYXVkaWd5X3JlbW92ZV9jdGxzXzEzNjF0X2FkYzsKKwkJCWVsc2UgCisJCQkJYyA9IGF1ZGlneV9yZW1vdmVfY3RsczsKIAkJfSBlbHNlIHsKIAkJCS8qCiAJCQkgKiBDcmVkaXRzIGZvciBjYXJkcyBiYXNlZCBvbiBTVEFDOTc1ODoKQEAgLTg2MywxMSArOTA5LDE1IEBACiAJfQogCiAJaWYgKGVtdS0+YXVkaWd5KQotCQljID0gYXVkaWd5X3JlbmFtZV9jdGxzOworCQlpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+YWRjXzEzNjF0KQorCQkJYyA9IGF1ZGlneV9yZW5hbWVfY3Rsc18xMzYxdF9hZGM7CisJCWVsc2UKKwkJCWMgPSBhdWRpZ3lfcmVuYW1lX2N0bHM7CiAJZWxzZQogCQljID0gZW11MTBrMV9yZW5hbWVfY3RsczsKIAlmb3IgKDsgKmM7IGMgKz0gMikKIAkJcmVuYW1lX2N0bChjYXJkLCBjWzBdLCBjWzFdKTsKKwogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5zdWJzeXN0ZW0gPT0gMHgyMDA3MTEwMikgeyAgLyogQXVkaWd5IDQgUHJvICovCiAJCXJlbmFtZV9jdGwoY2FyZCwgIkxpbmUyIENhcHR1cmUgVm9sdW1lIiwgIkxpbmUxL01pYyBDYXB0dXJlIFZvbHVtZSIpOwogCQlyZW5hbWVfY3RsKGNhcmQsICJBbmFsb2cgTWl4IENhcHR1cmUgVm9sdW1lIiwgIkxpbmUyIENhcHR1cmUgVm9sdW1lIik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMKaW5kZXggOTBmMWM1Mi4uYjkzOWUwMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11cHJvYy5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYwpAQCAtNTMyLDU3ICs1MzIsNTEgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogI2lmZGVmIENPTkZJR19TTkRfREVCVUcKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJpb19yZWdzIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMTAyNCwgc25kX2VtdV9wcm9jX2lvX3JlZ19yZWFkKTsKLQkJZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gNjQ7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11X3Byb2NfaW9fcmVnX3JlYWQpOwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX2lvX3JlZ193cml0ZTsKIAkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKIAl9CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MwMGEiLCAmZW50cnkpKSB7Ci0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDAwYSk7Ci0JCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDAwYSk7CiAJCWVudHJ5LT5jLnRleHQud3JpdGUgPSBzbmRfZW11X3Byb2NfcHRyX3JlZ193cml0ZTAwOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwogCX0KIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJwdHJfcmVnczAwYiIsICZlbnRyeSkpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDY1NTM2LCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMDBiKTsKLQkJZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gNjQ7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMDBiKTsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9lbXVfcHJvY19wdHJfcmVnX3dyaXRlMDA7CiAJCWVudHJ5LT5tb2RlIHw9IFNfSVdVU1I7CiAJfQogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgInB0cl9yZWdzMjBhIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgNjU1MzYsIHNuZF9lbXVfcHJvY19wdHJfcmVnX3JlYWQyMGEpOwotCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSA2NDsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIHNuZF9lbXVfcHJvY19wdHJfcmVnX3JlYWQyMGEpOwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gc25kX2VtdV9wcm9jX3B0cl9yZWdfd3JpdGUyMDsKIAkJZW50cnktPm1vZGUgfD0gU19JV1VTUjsKIAl9CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAicHRyX3JlZ3MyMGIiLCAmZW50cnkpKSB7Ci0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCA2NTUzNiwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDIwYik7Ci0JCWVudHJ5LT5jLnRleHQud3JpdGVfc2l6ZSA9IDY0OworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdV9wcm9jX3B0cl9yZWdfcmVhZDIwYik7CiAJCWVudHJ5LT5jLnRleHQud3JpdGUgPSBzbmRfZW11X3Byb2NfcHRyX3JlZ193cml0ZTIwOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwogCX0KIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJwdHJfcmVnczIwYyIsICZlbnRyeSkpIHsKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDY1NTM2LCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMjBjKTsKLQkJZW50cnktPmMudGV4dC53cml0ZV9zaXplID0gNjQ7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11X3Byb2NfcHRyX3JlZ19yZWFkMjBjKTsKIAkJZW50cnktPmMudGV4dC53cml0ZSA9IHNuZF9lbXVfcHJvY19wdHJfcmVnX3dyaXRlMjA7CiAJCWVudHJ5LT5tb2RlIHw9IFNfSVdVU1I7CiAJfQogI2VuZGlmCiAJCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAiZW11MTBrMSIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCAyMDQ4LCBzbmRfZW11MTBrMV9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdTEwazFfcHJvY19yZWFkKTsKIAogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXUxMGsyX2NoaXApIHsKIAkJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZW11LT5jYXJkLCAic3BkaWYtaW4iLCAmZW50cnkpKQotCQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDIwNDgsIHNuZF9lbXUxMGsxX3Byb2Nfc3BkaWZfcmVhZCk7CisJCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdTEwazFfcHJvY19zcGRpZl9yZWFkKTsKIAl9CiAJaWYgKGVtdS0+Y2FyZF9jYXBhYmlsaXRpZXMtPmNhMDE1MV9jaGlwKSB7CiAJCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImNhcHR1cmUtcmF0ZXMiLCAmZW50cnkpKQotCQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbXUsIDIwNDgsIHNuZF9lbXUxMGsxX3Byb2NfcmF0ZXNfcmVhZCk7CisJCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgc25kX2VtdTEwazFfcHJvY19yYXRlc19yZWFkKTsKIAl9CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhlbXUtPmNhcmQsICJ2b2ljZXMiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGVtdSwgMjA0OCwgc25kX2VtdTEwazFfcHJvY192b2ljZXNfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW11LCBzbmRfZW11MTBrMV9wcm9jX3ZvaWNlc19yZWFkKTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVtdS0+Y2FyZCwgImZ4ODAxMF9ncHIiLCAmZW50cnkpKSB7CiAJCWVudHJ5LT5jb250ZW50ID0gU05EUlZfSU5GT19DT05URU5UX0RBVEE7CkBAIC02MTYsNyArNjEwLDYgQEAKIAkJZW50cnktPmNvbnRlbnQgPSBTTkRSVl9JTkZPX0NPTlRFTlRfVEVYVDsKIAkJZW50cnktPnByaXZhdGVfZGF0YSA9IGVtdTsKIAkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTyAvKnwgU19JV1VTUiovOwotCQllbnRyeS0+Yy50ZXh0LnJlYWRfc2l6ZSA9IDEyOCoxMDI0OwogCQllbnRyeS0+Yy50ZXh0LnJlYWQgPSBzbmRfZW11MTBrMV9wcm9jX2Fjb2RlX3JlYWQ7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvaW8uYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2lvLmMKaW5kZXggZWY1MzA0ZC4uMDI5ZTc4NSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvaW8uYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9pby5jCkBAIC02Miw2ICs2Miw4IEBACiAJfQogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3B0cl9yZWFkKTsKKwogdm9pZCBzbmRfZW11MTBrMV9wdHJfd3JpdGUoc3RydWN0IHNuZF9lbXUxMGsxICplbXUsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBjaG4sIHVuc2lnbmVkIGludCBkYXRhKQogewogCXVuc2lnbmVkIGludCByZWdwdHI7CkBAIC05Miw2ICs5NCw4IEBACiAJfQogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3B0cl93cml0ZSk7CisKIHVuc2lnbmVkIGludCBzbmRfZW11MTBrMV9wdHIyMF9yZWFkKHN0cnVjdCBzbmRfZW11MTBrMSAqIGVtdSwgCiAJCQkJCSAgdW5zaWduZWQgaW50IHJlZywgCiAJCQkJCSAgdW5zaWduZWQgaW50IGNobikKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL21lbW9yeS5jIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKaW5kZXggZTdlYzk4Ni4uNGZjYWVmZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvbWVtb3J5LmMKQEAgLTI4Nyw2ICsyODcsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfbWVtYmxrX21hcCk7CisKIC8qCiAgKiBwYWdlIGFsbG9jYXRpb24gZm9yIERNQQogICovCkBAIC0zODcsNiArMzg5LDcgQEAKIAlyZXR1cm4gKHN0cnVjdCBzbmRfdXRpbF9tZW1ibGsgKilibGs7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfc3ludGhfYWxsb2MpOwogCiAvKgogICogZnJlZSBhIHN5bnRoIHNhbXBsZSBhcmVhCkBAIC00MDksNiArNDEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9zeW50aF9mcmVlKTsKIAogLyogY2hlY2sgbmV3IGFsbG9jYXRpb24gcmFuZ2UgKi8KIHN0YXRpYyB2b2lkIGdldF9zaW5nbGVfcGFnZV9yYW5nZShzdHJ1Y3Qgc25kX3V0aWxfbWVtaGRyICpoZHIsCkBAIC01NDAsNiArNTQ0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZW11MTBrMV9zeW50aF9iemVybyk7CisKIC8qCiAgKiBjb3B5X2Zyb21fdXNlcihibGsgKyBvZmZzZXQsIGRhdGEsIHNpemUpCiAgKi8KQEAgLTU2OCwzICs1NzQsNSBAQAogCX0gd2hpbGUgKG9mZnNldCA8IGVuZF9vZmZzZXQpOwogCXJldHVybiAwOwogfQorCitFWFBPUlRfU1lNQk9MKHNuZF9lbXUxMGsxX3N5bnRoX2NvcHlfZnJvbV91c2VyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL3AxN3YuaCBiL3NvdW5kL3BjaS9lbXUxMGsxL3AxN3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRiNWJlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2VtdTEwazEvcDE3di5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIENvcHlyaWdodCAoYykgYnkgSmFtZXMgQ291cnRpZXItRHV0dG9uIDxKYW1lc0BzdXBlcmJ1Zy5kZW1vbi5jby51az4KKyAqICBEcml2ZXIgcDE3diBjaGlwcworICogIFZlcnNpb246IDAuMDEKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBdWRpZ3kyVmFsdWUgVGluYSAoUDE3VikgcG9pbnRlci1vZmZzZXQgcmVnaXN0ZXIgc2V0LAorICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgUFRSMjAgYW5kIERBVEEyNCByZWdpc3RlcnMgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAwMCAtIDA3OiBOb3QgdXNlZCAqLworI2RlZmluZSBQMTdWX1BMQVlCQUNLX0ZJRk9fUFRSCTB4MDgJLyogQ3VycmVudCBwbGF5YmFjayBmaWZvIHBvaW50ZXIKKwkJCQkJICogYW5kIG51bWJlciBvZiBzb3VuZCBzYW1wbGVzIGluIGNhY2hlLgorCQkJCQkgKi8gIAorLyogMDkgLSAxMjogTm90IHVzZWQgKi8KKyNkZWZpbmUgUDE3Vl9DQVBUVVJFX0ZJRk9fUFRSCTB4MTMJLyogQ3VycmVudCBjYXB0dXJlIGZpZm8gcG9pbnRlcgorCQkJCQkgKiBhbmQgbnVtYmVyIG9mIHNvdW5kIHNhbXBsZXMgaW4gY2FjaGUuCisJCQkJCSAqLyAgCisvKiAxNCAtIDE3OiBOb3QgdXNlZCAqLworI2RlZmluZSBQMTdWX1BCX0NITl9TRUwJCTB4MTgJLyogUDE3diBwbGF5YmFjayBjaGFubmVsIHNlbGVjdCAqLworI2RlZmluZSBQMTdWX1NFX1NMT1RfU0VMX0wJMHgxOQkvKiBTb3VuZCBFbmdpbmUgc2xvdCBzZWxlY3QgbG93ICovCisjZGVmaW5lIFAxN1ZfU0VfU0xPVF9TRUxfSAkweDFhCS8qIFNvdW5kIEVuZ2luZSBzbG90IHNlbGVjdCBoaWdoICovCisvKiAxYiAtIDFmOiBOb3QgdXNlZCAqLworLyogMjAgLSAyZjogTm90IHVzZWQgKi8KKy8qIDMwIC0gM2I6IE5vdCB1c2VkICovCisjZGVmaW5lIFAxN1ZfU1BJCQkweDNjCS8qIFNQSSBpbnRlcmZhY2UgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUDE3Vl9JMkNfQUREUgkJMHgzZAkvKiBJMkMgQWRkcmVzcyAqLworI2RlZmluZSBQMTdWX0kyQ18wCQkweDNlCS8qIEkyQyBEYXRhICovCisjZGVmaW5lIFAxN1ZfSTJDXzEJCTB4M2YJLyogSTJDIERhdGEgKi8KKworI2RlZmluZSBQMTdWX1NUQVJUX0FVRElPCTB4NDAJLyogU3RhcnQgQXVkaW8gYml0ICovCisvKiA0MSAtIDQ3OiBSZXNlcnZlZCAqLworI2RlZmluZSBQMTdWX1NUQVJUX0NBUFRVUkUJMHg0OAkvKiBTdGFydCBDYXB0dXJlIGJpdCAqLworI2RlZmluZSBQMTdWX0NBUFRVUkVfRklGT19CQVNFCTB4NDkJLyogUmVjb3JkIEZJRk8gYmFzZSBhZGRyZXNzICovCisjZGVmaW5lIFAxN1ZfQ0FQVFVSRV9GSUZPX1NJWkUJMHg0YQkvKiBSZWNvcmQgRklGTyBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBQMTdWX0NBUFRVUkVfRklGT19JTkRFWAkweDRiCS8qIFJlY29yZCBGSUZPIGNhcHR1cmUgaW5kZXggKi8KKyNkZWZpbmUgUDE3Vl9DQVBUVVJFX1ZPTF9ICTB4NGMJLyogUDE3diBjYXB0dXJlIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfQ0FQVFVSRV9WT0xfTAkweDRkCS8qIFAxN3YgY2FwdHVyZSB2b2x1bWUgY29udHJvbCAqLworLyogNGUgLSA0ZjogTm90IHVzZWQgKi8KKy8qIDUwIC0gNWY6IE5vdCB1c2VkICovCisjZGVmaW5lIFAxN1ZfU1JDU2VsCQkweDYwCS8qIFNSQzQ4IGFuZCBTUkNNdWx0aSBzYW1wbGUgcmF0ZSBzZWxlY3QKKwkJCQkJICogYW5kIG91dHB1dCBzZWxlY3QKKwkJCQkJICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfQUM5N18xMEsxX1ZPTF9MCTB4NjEJLyogMTBLIHRvIE1peGVyX0FDOTcgaW5wdXQgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgUDE3Vl9NSVhFUl9BQzk3XzEwSzFfVk9MX0gJMHg2MgkvKiAxMEsgdG8gTWl4ZXJfQUM5NyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0FDOTdfUDE3Vl9WT0xfTAkweDYzCS8qIFAxN1YgdG8gTWl4ZXJfQUM5NyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0FDOTdfUDE3Vl9WT0xfSAkweDY0CS8qIFAxN1YgdG8gTWl4ZXJfQUM5NyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0FDOTdfU1JQX1JFQ19WT0xfTAkweDY1CS8qIFNSUCBSZWNvcmQgdG8gTWl4ZXJfQUM5NyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0FDOTdfU1JQX1JFQ19WT0xfSAkweDY2CS8qIFNSUCBSZWNvcmQgdG8gTWl4ZXJfQUM5NyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworLyogNjcgLSA2ODogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgUDE3Vl9NSVhFUl9TcGRpZl8xMEsxX1ZPTF9MCTB4NjkJLyogMTBLIHRvIE1peGVyX1NwZGlmIGlucHV0IHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfU3BkaWZfMTBLMV9WT0xfSAkweDZBCS8qIDEwSyB0byBNaXhlcl9TcGRpZiBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX1NwZGlmX1AxN1ZfVk9MX0wJMHg2QgkvKiBQMTdWIHRvIE1peGVyX1NwZGlmIGlucHV0IHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfU3BkaWZfUDE3Vl9WT0xfSAkweDZDCS8qIFAxN1YgdG8gTWl4ZXJfU3BkaWYgaW5wdXQgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgUDE3Vl9NSVhFUl9TcGRpZl9TUlBfUkVDX1ZPTF9MCTB4NkQJLyogU1JQIFJlY29yZCB0byBNaXhlcl9TcGRpZiBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX1NwZGlmX1NSUF9SRUNfVk9MX0gJMHg2RQkvKiBTUlAgUmVjb3JkIHRvIE1peGVyX1NwZGlmIGlucHV0IHZvbHVtZSBjb250cm9sICovCisvKiA2ZiAtIDcwOiBSZXNlcnZlZCAqLworI2RlZmluZSBQMTdWX01JWEVSX0kyU18xMEsxX1ZPTF9MCTB4NzEJLyogMTBLIHRvIE1peGVyX0kyUyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0kyU18xMEsxX1ZPTF9ICTB4NzIJLyogMTBLIHRvIE1peGVyX0kyUyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0kyU19QMTdWX1ZPTF9MCTB4NzMJLyogUDE3ViB0byBNaXhlcl9JMlMgaW5wdXQgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgUDE3Vl9NSVhFUl9JMlNfUDE3Vl9WT0xfSAkweDc0CS8qIFAxN1YgdG8gTWl4ZXJfSTJTIGlucHV0IHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfSTJTX1NSUF9SRUNfVk9MX0wJMHg3NQkvKiBTUlAgUmVjb3JkIHRvIE1peGVyX0kyUyBpbnB1dCB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX01JWEVSX0kyU19TUlBfUkVDX1ZPTF9ICTB4NzYJLyogU1JQIFJlY29yZCB0byBNaXhlcl9JMlMgaW5wdXQgdm9sdW1lIGNvbnRyb2wgKi8KKy8qIDc3IC0gNzg6IFJlc2VydmVkICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfQUM5N19FTkFCTEUJCTB4NzkJLyogTWl4ZXIgQUM5NyBpbnB1dCBhdWRpbyBlbmFibGUgKi8KKyNkZWZpbmUgUDE3Vl9NSVhFUl9TUERJRl9FTkFCTEUJCTB4N0EJLyogTWl4ZXIgU1BESUYgaW5wdXQgYXVkaW8gZW5hYmxlICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfSTJTX0VOQUJMRQkJMHg3QgkvKiBNaXhlciBJMlMgaW5wdXQgYXVkaW8gZW5hYmxlICovCisjZGVmaW5lIFAxN1ZfQVVESU9fT1VUX0VOQUJMRQkJMHg3QwkvKiBBdWRpbyBvdXQgZW5hYmxlICovCisjZGVmaW5lIFAxN1ZfTUlYRVJfQVRUCQkJMHg3RAkvKiBTUlAgTWl4ZXIgQXR0ZW51YXRpb24gU2VsZWN0ICovCisjZGVmaW5lIFAxN1ZfU1JQX1JFQ09SRF9TUlIJCTB4N0UJLyogU1JQIFJlY29yZCBjaGFubmVsIHNvdXJjZSBTZWxlY3QgKi8KKyNkZWZpbmUgUDE3Vl9TT0ZUX1JFU0VUX1NSUF9NSVhFUgkweDdGCS8qIFNSUCBhbmQgbWl4ZXIgc29mdCByZXNldCAqLworCisjZGVmaW5lIFAxN1ZfQUM5N19PVVRfTUFTVEVSX1ZPTF9MCTB4ODAJLyogQUM5NyBPdXRwdXQgbWFzdGVyIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfQUM5N19PVVRfTUFTVEVSX1ZPTF9ICTB4ODEJLyogQUM5NyBPdXRwdXQgbWFzdGVyIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFAxN1ZfU1BESUZfT1VUX01BU1RFUl9WT0xfTAkweDgyCS8qIFNQRElGIE91dHB1dCBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgUDE3Vl9TUERJRl9PVVRfTUFTVEVSX1ZPTF9ICTB4ODMJLyogU1BESUYgT3V0cHV0IG1hc3RlciB2b2x1bWUgY29udHJvbCAqLworI2RlZmluZSBQMTdWX0kyU19PVVRfTUFTVEVSX1ZPTF9MCTB4ODQJLyogSTJTIE91dHB1dCBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wgKi8KKyNkZWZpbmUgUDE3Vl9JMlNfT1VUX01BU1RFUl9WT0xfSAkweDg1CS8qIEkyUyBPdXRwdXQgbWFzdGVyIHZvbHVtZSBjb250cm9sICovCisvKiA4NiAtIDg3OiBOb3QgdXNlZCAqLworI2RlZmluZSBQMTdWX0kyU19DSEFOTkVMX1NXQVBfUEhBU0VfSU5WRVJTRQkweDg4CS8qIEkyUyBvdXQgbW9ubyBjaGFubmVsIHN3YXAKKwkJCQkJCQkgKiBhbmQgcGhhc2UgaW52ZXJzZSAqLworI2RlZmluZSBQMTdWX1NQRElGX0NIQU5ORUxfU1dBUF9QSEFTRV9JTlZFUlNFCTB4ODkJLyogU1BESUYgb3V0IG1vbm8gY2hhbm5lbCBzd2FwCisJCQkJCQkJICogYW5kIHBoYXNlIGludmVyc2UgKi8KKy8qIDhBOiBOb3QgdXNlZCAqLworI2RlZmluZSBQMTdWX1NSUF9QMTdWX0VTUgkJMHg4QgkvKiBTUlBfUDE3ViBlc3RpbWF0ZWQgc2FtcGxlIHJhdGUgYW5kIHJhdGUgbG9jayAqLworI2RlZmluZSBQMTdWX1NSUF9SRUNfRVNSCQkweDhDCS8qIFNSUF9SRUMgZXN0aW1hdGVkIHNhbXBsZSByYXRlIGFuZCByYXRlIGxvY2sgKi8KKyNkZWZpbmUgUDE3Vl9TUlBfQllQQVNTCQkJMHg4RAkvKiBzcnBzIGNoYW5uZWwgYnlwYXNzIGFuZCBzcnBzIGJ5cGFzcyAqLworLyogOEUgLSA5MjogTm90IHVzZWQgKi8KKyNkZWZpbmUgUDE3Vl9JMlNfU1JDX1NFTAkJMHg5MwkvKiBJMlNJTiBtb2RlIHNlbCAqLworCisKKworCisKKwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvdGluYTIuaCBiL3NvdW5kL3BjaS9lbXUxMGsxL3RpbmEyLmgKaW5kZXggNWM0M2FiZi4uZjJkOGViNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvdGluYTIuaAorKysgYi9zb3VuZC9wY2kvZW11MTBrMS90aW5hMi5oCkBAIC0xLDExICsxLDcgQEAKIC8qCiAgKiAgQ29weXJpZ2h0IChjKSBieSBKYW1lcyBDb3VydGllci1EdXR0b24gPEphbWVzQHN1cGVyYnVnLmRlbW9uLmNvLnVrPgotICogIERyaXZlciBwMTZ2IGNoaXBzCi0gKiAgVmVyc2lvbjogMC4yMQotICoKLSAqCi0gKiAgVGhpcyBjb2RlIHdhcyBpbml0YWxseSBiYXNlZCBvbiBjb2RlIGZyb20gQUxTQSdzIGVtdTEwazF4LmMgd2hpY2ggaXM6Ci0gKiAgQ29weXJpZ2h0IChjKSBieSBGcmFuY2lzY28gTW9yYWVzIDxmbW9yYWVzQG5jLnJyLmNvbT4KKyAqICBEcml2ZXIgdGluYTIgY2hpcHMKKyAqICBWZXJzaW9uOiAwLjEKICAqCiAgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jIGIvc291bmQvcGNpL2VtdTEwazEvdm9pY2UuYwppbmRleCA1NmZmYjdkLi45NGVjYTgyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW11MTBrMS92b2ljZS5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL3ZvaWNlLmMKQEAgLTEzOSw2ICsxMzksOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfdm9pY2VfYWxsb2MpOworCiBpbnQgc25kX2VtdTEwazFfdm9pY2VfZnJlZShzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSwKIAkJCSAgIHN0cnVjdCBzbmRfZW11MTBrMV92b2ljZSAqcHZvaWNlKQogewpAQCAtMTUzLDMgKzE1NSw1IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX2VtdTEwazFfdm9pY2VfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW5zMTM3MC5jIGIvc291bmQvcGNpL2VuczEzNzAuYwppbmRleCBjYTllMzRlLi45ZDQ2YmJlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvZW5zMTM3MC5jCisrKyBiL3NvdW5kL3BjaS9lbnMxMzcwLmMKQEAgLTE5MTUsNyArMTkxNSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGVuc29uaXEtPmNhcmQsICJhdWRpb3BjaSIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZW5zb25pcSwgMTAyNCwgc25kX2Vuc29uaXFfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBlbnNvbmlxLCBzbmRfZW5zb25pcV9wcm9jX3JlYWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VzMTkzOC5jIGIvc291bmQvcGNpL2VzMTkzOC5jCmluZGV4IDZmOTA5NGMuLmNhNjYwM2YgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lczE5MzguYworKysgYi9zb3VuZC9wY2kvZXMxOTM4LmMKQEAgLTE3NTYsNyArMTc1Niw4IEBACiAJCX0KIAl9CiAJaWYgKHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQljaGlwLT5tcHVfcG9ydCwgMSwgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpIDwgMCkgeworCQkJCWNoaXAtPm1wdV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAorCQkJCWNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJlczE5Mzg6IHVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDFcbiIpOwogCX0gZWxzZSB7CiAJCS8vIHRoaXMgbGluZSBpcyB2aXRhbCBmb3IgTUlESSBpbnRlcnJ1cHQgaGFuZGxpbmcgb24gZXNzLXNvbG8xCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZXMxOTY4LmMgYi9zb3VuZC9wY2kvZXMxOTY4LmMKaW5kZXggNWZmNDE3NS4uYmZhMDg3NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VzMTk2OC5jCisrKyBiL3NvdW5kL3BjaS9lczE5NjguYwpAQCAtMTMyLDcgKzEzMiw3IEBACiBzdGF0aWMgaW50IHRvdGFsX2J1ZnNpemVbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxMDI0IH07CiBzdGF0aWMgaW50IHBjbV9zdWJzdHJlYW1zX3BbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSA0IH07CiBzdGF0aWMgaW50IHBjbV9zdWJzdHJlYW1zX2NbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAxIH07Ci1zdGF0aWMgaW50IGNsb2NrW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07CitzdGF0aWMgaW50IGNsb2NrW1NORFJWX0NBUkRTXTsKIHN0YXRpYyBpbnQgdXNlX3BtW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMn07CiBzdGF0aWMgaW50IGVuYWJsZV9tcHVbU05EUlZfQ0FSRFNdID0ge1swIC4uLiAoU05EUlZfQ0FSRFMgLSAxKV0gPSAyfTsKICNpZmRlZiBTVVBQT1JUX0pPWVNUSUNLCkBAIC0yNzI3LDcgKzI3MjcsOCBAQAogCX0KIAlpZiAoZW5hYmxlX21wdVtkZXZdKSB7CiAJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfTVBVNDAxLAotCQkJCQkgICAgICAgY2hpcC0+aW9fcG9ydCArIEVTTV9NUFU0MDFfUE9SVCwgMSwKKwkJCQkJICAgICAgIGNoaXAtPmlvX3BvcnQgKyBFU01fTVBVNDAxX1BPUlQsCisJCQkJCSAgICAgICBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAogCQkJCQkgICAgICAgY2hpcC0+aXJxLCAwLCAmY2hpcC0+cm1pZGkpKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMTk2ODogc2tpcHBpbmcgTVBVLTQwMSBNSURJIHN1cHBvcnQuLlxuIik7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9mbTgwMS5jIGIvc291bmQvcGNpL2ZtODAxLmMKaW5kZXggZDcyZmMyOC4uMGFmYTU3MyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2ZtODAxLmMKKysrIGIvc291bmQvcGNpL2ZtODAxLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqICAgIDMgPSBNZWRpYUZvcnRlIDY0LVBDUgogICogIEhpZ2ggMTYtYml0cyBhcmUgdmlkZW8gKHJhZGlvKSBkZXZpY2UgbnVtYmVyICsgMQogICovCi1zdGF0aWMgaW50IHRlYTU3NXhfdHVuZXJbU05EUlZfQ0FSRFNdID0geyBbMCAuLi4gKFNORFJWX0NBUkRTLTEpXSA9IDAgfTsKK3N0YXRpYyBpbnQgdGVhNTc1eF90dW5lcltTTkRSVl9DQVJEU107CiAKIG1vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgdGhlIEZNODAxIHNvdW5kY2FyZC4iKTsKQEAgLTE0NDgsNyArMTQ0OCw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfRk04MDEsCi0JCQkJICAgICAgIEZNODAxX1JFRyhjaGlwLCBNUFU0MDFfREFUQSksIDEsCisJCQkJICAgICAgIEZNODAxX1JFRyhjaGlwLCBNUFU0MDFfREFUQSksCisJCQkJICAgICAgIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCiAJCQkJICAgICAgIGNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiAJCXJldHVybiBlcnI7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL01ha2VmaWxlIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQppbmRleCBkZGZiNWZmLi5kYmFjYmE2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCisrKyBiL3NvdW5kL3BjaS9oZGEvTWFrZWZpbGUKQEAgLTEsNSArMSw1IEBACiBzbmQtaGRhLWludGVsLW9ianMgOj0gaGRhX2ludGVsLm8KLXNuZC1oZGEtY29kZWMtb2JqcyA6PSBoZGFfY29kZWMubyBoZGFfZ2VuZXJpYy5vIHBhdGNoX3JlYWx0ZWsubyBwYXRjaF9jbWVkaWEubyBwYXRjaF9hbmFsb2cubyBwYXRjaF9zaWdtYXRlbC5vIHBhdGNoX3NpMzA1NC5vCitzbmQtaGRhLWNvZGVjLW9ianMgOj0gaGRhX2NvZGVjLm8gaGRhX2dlbmVyaWMubyBwYXRjaF9yZWFsdGVrLm8gcGF0Y2hfY21lZGlhLm8gcGF0Y2hfYW5hbG9nLm8gcGF0Y2hfc2lnbWF0ZWwubyBwYXRjaF9zaTMwNTQubyBwYXRjaF9hdGloZG1pLm8KIGlmZGVmIENPTkZJR19QUk9DX0ZTCiBzbmQtaGRhLWNvZGVjLW9ianMgKz0gaGRhX3Byb2MubwogZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IDViZWUzYjUuLjhjMmE4MTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtODYsNiArODYsOCBAQAogCXJldHVybiByZXM7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY19yZWFkKTsKKwogLyoqCiAgKiBzbmRfaGRhX2NvZGVjX3dyaXRlIC0gc2VuZCBhIHNpbmdsZSBjb21tYW5kIHdpdGhvdXQgd2FpdGluZyBmb3IgcmVzcG9uc2UKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtMTA4LDYgKzExMCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NvZGVjX3dyaXRlKTsKKwogLyoqCiAgKiBzbmRfaGRhX3NlcXVlbmNlX3dyaXRlIC0gc2VxdWVuY2Ugd3JpdGVzCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTEyMiw2ICsxMjYsOCBAQAogCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBzZXEtPm5pZCwgMCwgc2VxLT52ZXJiLCBzZXEtPnBhcmFtKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX3NlcXVlbmNlX3dyaXRlKTsKKwogLyoqCiAgKiBzbmRfaGRhX2dldF9zdWJfbm9kZXMgLSBnZXQgdGhlIHJhbmdlIG9mIHN1YiBub2RlcwogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC0xNDAsNiArMTQ2LDggQEAKIAlyZXR1cm4gKGludCkocGFybSAmIDB4N2ZmZik7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9nZXRfc3ViX25vZGVzKTsKKwogLyoqCiAgKiBzbmRfaGRhX2dldF9jb25uZWN0aW9ucyAtIGdldCBjb25uZWN0aW9uIGxpc3QKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtMjU2LDYgKzI2NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudCk7CisKIC8qCiAgKiBwcm9jZXNzIHF1ZXVldWQgdW5zb2xpY2l0ZWQgZXZlbnRzCiAgKi8KQEAgLTM4NCw2ICszOTQsNyBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfYnVzX25ldyk7CiAKIC8qCiAgKiBmaW5kIGEgbWF0Y2hpbmcgY29kZWMgcHJlc2V0CkBAIC01ODcsNiArNTk4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NvZGVjX25ldyk7CisKIC8qKgogICogc25kX2hkYV9jb2RlY19zZXR1cF9zdHJlYW0gLSBzZXQgdXAgdGhlIGNvZGVjIGZvciBzdHJlYW1pbmcKICAqIEBjb2RlYzogdGhlIENPREVDIHRvIHNldCB1cApAQCAtNjA5LDYgKzYyMiw3IEBACiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCBmb3JtYXQpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfY29kZWNfc2V0dXBfc3RyZWFtKTsKIAogLyoKICAqIGFtcCBhY2Nlc3MgZnVuY3Rpb25zCkBAIC0xMjk0LDYgKzEzMDgsNyBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9oZGFfYnVpbGRfY29udHJvbHMpOwogCiAvKgogICogc3RyZWFtIGZvcm1hdHMKQEAgLTEzODIsNiArMTM5Nyw4IEBACiAJcmV0dXJuIHZhbDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NhbGNfc3RyZWFtX2Zvcm1hdCk7CisKIC8qKgogICogc25kX2hkYV9xdWVyeV9zdXBwb3J0ZWRfcGNtIC0gcXVlcnkgdGhlIHN1cHBvcnRlZCBQQ00gcmF0ZXMgYW5kIGZvcm1hdHMKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtMTY2Myw2ICsxNjgwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX2J1aWxkX3BjbXMpOwogCiAvKioKICAqIHNuZF9oZGFfY2hlY2tfYm9hcmRfY29uZmlnIC0gY29tcGFyZSB0aGUgY3VycmVudCBjb2RlYyB3aXRoIHRoZSBjb25maWcgdGFibGUKQEAgLTIxNjUsNiArMjE4Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX2hkYV9zdXNwZW5kKTsKKwogLyoqCiAgKiBzbmRfaGRhX3Jlc3VtZSAtIHJlc3VtZSB0aGUgY29kZWNzCiAgKiBAYnVzOiB0aGUgSERBIGJ1cwpAQCAtMjE4Nyw2ICsyMjA3LDggQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfaGRhX3Jlc3VtZSk7CisKIC8qKgogICogc25kX2hkYV9yZXN1bWVfY3RscyAtIHJlc3VtZSBjb250cm9scyBpbiB0aGUgbmV3IGNvbnRyb2wgbGlzdAogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC0yMjQ3LDI1ICsyMjY5LDYgQEAKICNlbmRpZgogCiAvKgotICogc3ltYm9scyBleHBvcnRlZCBmb3IgY29udHJvbGxlciBtb2R1bGVzCi0gKi8KLUVYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY19yZWFkKTsKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY193cml0ZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUpOwotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2dldF9zdWJfbm9kZXMpOwotRVhQT1JUX1NZTUJPTChzbmRfaGRhX3F1ZXVlX3Vuc29sX2V2ZW50KTsKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9idXNfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9jb2RlY19uZXcpOwotRVhQT1JUX1NZTUJPTChzbmRfaGRhX2NvZGVjX3NldHVwX3N0cmVhbSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfY2FsY19zdHJlYW1fZm9ybWF0KTsKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9idWlsZF9wY21zKTsKLUVYUE9SVF9TWU1CT0woc25kX2hkYV9idWlsZF9jb250cm9scyk7Ci0jaWZkZWYgQ09ORklHX1BNCi1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfc3VzcGVuZCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9oZGFfcmVzdW1lKTsKLSNlbmRpZgotCi0vKgogICogIElOSVQgcGFydAogICovCiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCmluZGV4IGU4MjFkNjUuLjQwNzBiNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYwpAQCAtODIsNiArODIsNyBAQAogCQkJICJ7SW50ZWwsIElDSDh9LCIKIAkJCSAie0FUSSwgU0I0NTB9LCIKIAkJCSAie0FUSSwgU0I2MDB9LCIKKwkJCSAie0FUSSwgUlM2MDB9LCIKIAkJCSAie1ZJQSwgVlQ4MjUxfSwiCiAJCQkgIntWSUEsIFZUODIzN0F9LCIKIAkJCSAie1NpUywgU0lTOTY2fSwiCkBAIC0xNjcsNiArMTY4LDEyIEBACiAjZGVmaW5lIFVMSV9QTEFZQkFDS19JTkRFWAk1CiAjZGVmaW5lIFVMSV9OVU1fUExBWUJBQ0sJNgogCisvKiBBVEkgSERNSSBoYXMgMSBwbGF5YmFjayBhbmQgMCBjYXB0dXJlICovCisjZGVmaW5lIEFUSUhETUlfQ0FQVFVSRV9JTkRFWAkwCisjZGVmaW5lIEFUSUhETUlfTlVNX0NBUFRVUkUJMAorI2RlZmluZSBBVElIRE1JX1BMQVlCQUNLX0lOREVYCTAKKyNkZWZpbmUgQVRJSERNSV9OVU1fUExBWUJBQ0sJMQorCiAvKiB0aGlzIG51bWJlciBpcyBzdGF0aWNhbGx5IGRlZmluZWQgZm9yIHNpbXBsaWNpdHkgKi8KICNkZWZpbmUgTUFYX0FaWF9ERVYJCTE2CiAKQEAgLTMzMSw2ICszMzgsNyBAQAogZW51bSB7CiAJQVpYX0RSSVZFUl9JQ0gsCiAJQVpYX0RSSVZFUl9BVEksCisJQVpYX0RSSVZFUl9BVElIRE1JLAogCUFaWF9EUklWRVJfVklBLAogCUFaWF9EUklWRVJfU0lTLAogCUFaWF9EUklWRVJfVUxJLApAQCAtMzQwLDYgKzM0OCw3IEBACiBzdGF0aWMgY2hhciAqZHJpdmVyX3Nob3J0X25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKIAlbQVpYX0RSSVZFUl9JQ0hdID0gIkhEQSBJbnRlbCIsCiAJW0FaWF9EUklWRVJfQVRJXSA9ICJIREEgQVRJIFNCIiwKKwlbQVpYX0RSSVZFUl9BVElIRE1JXSA9ICJIREEgQVRJIEhETUkiLAogCVtBWlhfRFJJVkVSX1ZJQV0gPSAiSERBIFZJQSBWVDgyeHgiLAogCVtBWlhfRFJJVkVSX1NJU10gPSAiSERBIFNJUzk2NiIsCiAJW0FaWF9EUklWRVJfVUxJXSA9ICJIREEgVUxJIE01NDYxIiwKQEAgLTEzOTMsMTAgKzE0MDIsMTAgQEAKIAkJbXNsZWVwKDEpOwogCX0KIAotCWlmIChjaGlwLT5yZW1hcF9hZGRyKQotCQlpb3VubWFwKGNoaXAtPnJlbWFwX2FkZHIpOwogCWlmIChjaGlwLT5pcnEgPj0gMCkKIAkJZnJlZV9pcnEoY2hpcC0+aXJxLCAodm9pZCopY2hpcCk7CisJaWYgKGNoaXAtPnJlbWFwX2FkZHIpCisJCWlvdW5tYXAoY2hpcC0+cmVtYXBfYWRkcik7CiAKIAlpZiAoY2hpcC0+YmRsLmFyZWEpCiAJCXNuZF9kbWFfZnJlZV9wYWdlcygmY2hpcC0+YmRsKTsKQEAgLTE0OTUsNiArMTUwNCwxMiBAQAogCQljaGlwLT5wbGF5YmFja19pbmRleF9vZmZzZXQgPSBVTElfUExBWUJBQ0tfSU5ERVg7CiAJCWNoaXAtPmNhcHR1cmVfaW5kZXhfb2Zmc2V0ID0gVUxJX0NBUFRVUkVfSU5ERVg7CiAJCWJyZWFrOworCWNhc2UgQVpYX0RSSVZFUl9BVElIRE1JOgorCQljaGlwLT5wbGF5YmFja19zdHJlYW1zID0gQVRJSERNSV9OVU1fUExBWUJBQ0s7CisJCWNoaXAtPmNhcHR1cmVfc3RyZWFtcyA9IEFUSUhETUlfTlVNX0NBUFRVUkU7CisJCWNoaXAtPnBsYXliYWNrX2luZGV4X29mZnNldCA9IEFUSUhETUlfUExBWUJBQ0tfSU5ERVg7CisJCWNoaXAtPmNhcHR1cmVfaW5kZXhfb2Zmc2V0ID0gQVRJSERNSV9DQVBUVVJFX0lOREVYOworCQlicmVhazsKIAlkZWZhdWx0OgogCQljaGlwLT5wbGF5YmFja19zdHJlYW1zID0gSUNINl9OVU1fUExBWUJBQ0s7CiAJCWNoaXAtPmNhcHR1cmVfc3RyZWFtcyA9IElDSDZfTlVNX0NBUFRVUkU7CkBAIC0xNjIxLDYgKzE2MzYsNyBAQAogCXsgMHg4MDg2LCAweDI4NGIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFaWF9EUklWRVJfSUNIIH0sIC8qIElDSDggKi8KIAl7IDB4MTAwMiwgMHg0MzdiLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX0FUSSB9LCAvKiBBVEkgU0I0NTAgKi8KIAl7IDB4MTAwMiwgMHg0MzgzLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX0FUSSB9LCAvKiBBVEkgU0I2MDAgKi8KKwl7IDB4MTAwMiwgMHg3OTNiLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX0FUSUhETUkgfSwgLyogQVRJIFJTNjAwIEhETUkgKi8KIAl7IDB4MTEwNiwgMHgzMjg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1ZJQSB9LCAvKiBWSUEgVlQ4MjUxL1ZUODIzN0EgKi8KIAl7IDB4MTAzOSwgMHg3NTAyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1NJUyB9LCAvKiBTSVM5NjYgKi8KIAl7IDB4MTBiOSwgMHg1NDYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBWlhfRFJJVkVSX1VMSSB9LCAvKiBVTEkgTTU0NjEgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmggYi9zb3VuZC9wY2kvaGRhL2hkYV9wYXRjaC5oCmluZGV4IGFjYWVmM2MuLjBiNjY4NzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX3BhdGNoLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcGF0Y2guaApAQCAtMTIsNiArMTIsOCBAQAogZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3NpZ21hdGVsW107CiAvKiBTaUxhYnMgMzA1NC8zMDU1IG1vZGVtIGNvZGVjcyAqLwogZXh0ZXJuIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X3NpMzA1NFtdOworLyogQVRJIEhETUkgY29kZWNzICovCitleHRlcm4gc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgc25kX2hkYV9wcmVzZXRfYXRpaGRtaVtdOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9jb2RlY19wcmVzZXQgKmhkYV9wcmVzZXRfdGFibGVzW10gPSB7CiAJc25kX2hkYV9wcmVzZXRfcmVhbHRlaywKQEAgLTE5LDUgKzIxLDYgQEAKIAlzbmRfaGRhX3ByZXNldF9hbmFsb2csCiAJc25kX2hkYV9wcmVzZXRfc2lnbWF0ZWwsCiAJc25kX2hkYV9wcmVzZXRfc2kzMDU0LAorCXNuZF9oZGFfcHJlc2V0X2F0aWhkbWksCiAJTlVMTAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYwppbmRleCBjYTUxNGE2Li5jMmYwZmU4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCkBAIC0xODIsNiArMTgyLDEwIEBACiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBPVVQiKTsKIAlpZiAoY2FwcyAmIEFDX1BJTkNBUF9IUF9EUlYpCiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBIUCIpOworCWlmIChjYXBzICYgQUNfUElOQ0FQX0VBUEQpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBFQVBEIik7CisJaWYgKGNhcHMgJiBBQ19QSU5DQVBfUFJFU19ERVRFQ1QpCisJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiBEZXRlY3QiKTsKIAlzbmRfaXByaW50ZihidWZmZXIsICJcbiIpOwogCWNhcHMgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfQ09ORklHX0RFRkFVTFQsIDApOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiAgUGluIERlZmF1bHQgMHglMDh4OiBbJXNdICVzIGF0ICVzICVzXG4iLCBjYXBzLApAQCAtMzE4LDcgKzMyMiw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNvZGVjLCAzMiAqIDEwMjQsIHByaW50X2NvZGVjX2luZm8pOworCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY29kZWMsIHByaW50X2NvZGVjX2luZm8pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwppbmRleCA0MGYwMDBiLi5kZDRlMDBhIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKQEAgLTc4OSw2ICs3ODksOCBAQAogCXsgLm1vZGVsbmFtZSA9ICIzc3RhY2siLAkuY29uZmlnID0gQUQxOTg2QV8zU1RBQ0sgfSwKIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxMGRlLCAucGNpX3N1YmRldmljZSA9IDB4Y2I4NCwKIAkgIC5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LCAvKiBBU1VTIEE4Ti1WTSBDU00gKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDQzLCAucGNpX3N1YmRldmljZSA9IDB4ODFiMywKKwkgIC5jb25maWcgPSBBRDE5ODZBXzNTVEFDSyB9LCAvKiBBU1VTIFA1UkQyLVZNIC8gUDVHUEwtWCBTRSAqLwogCXsgLm1vZGVsbmFtZSA9ICJsYXB0b3AiLAkuY29uZmlnID0gQUQxOTg2QV9MQVBUT1AgfSwKIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxNDRkLCAucGNpX3N1YmRldmljZSA9IDB4YzAxZSwKIAkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUCB9LCAvKiBGU0MgVjIwNjAgKi8KQEAgLTgwOSw2ICs4MTEsOCBAQAogCSAgLmNvbmZpZyA9IEFEMTk4NkFfTEFQVE9QX0VBUEQgfSwgLyogQVNVUyBaNjJGICovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwYWYsCiAJICAuY29uZmlnID0gQUQxOTg2QV9MQVBUT1BfRUFQRCB9LCAvKiBIUCBDb21wYXEgUHJlc2FyaW8gQjI4MDAgKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxN2FhLCAucGNpX3N1YmRldmljZSA9IDB4MjA2NiwKKwkgIC5jb25maWcgPSBBRDE5ODZBX0xBUFRPUF9FQVBEIH0sIC8qIExlbm92byAzMDAwIE4xMDAtMDc2ODRKVSAqLwogCXt9CiB9OwogCkBAIC05NjMsNyArOTY3LDcgQEAKIAl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJTb3VyY2UiLAogCQkuaW5mbyA9IGFkMTk4M19zcGRpZl9yb3V0ZV9pbmZvLAogCQkuZ2V0ID0gYWQxOTgzX3NwZGlmX3JvdXRlX2dldCwKIAkJLnB1dCA9IGFkMTk4M19zcGRpZl9yb3V0ZV9wdXQsCkBAIC0xMTAzLDcgKzExMDcsNyBAQAogCS8qIGlkZW50aWNhbCB3aXRoIEFEMTk4MyAqLwogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJSb3V0ZSIsCisJCS5uYW1lID0gU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLFBMQVlCQUNLLE5PTkUpICJTb3VyY2UiLAogCQkuaW5mbyA9IGFkMTk4M19zcGRpZl9yb3V0ZV9pbmZvLAogCQkuZ2V0ID0gYWQxOTgzX3NwZGlmX3JvdXRlX2dldCwKIAkJLnB1dCA9IGFkMTk4M19zcGRpZl9yb3V0ZV9wdXQsCkBAIC0xMzI5LDEzICsxMzMzLDYwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGNvbmZpZ3VyYXRpb24gZm9yIExlbm92byBUaGlua3BhZCBUNjAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBhZDE5ODFfdGhpbmtwYWRfbWl4ZXJzW10gPSB7CisJSERBX0NPREVDX1ZPTFVNRSgiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDB4MDUsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEUoIk1hc3RlciBQbGF5YmFjayBTd2l0Y2giLCAweDA1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19WT0xVTUUoIlBDTSBQbGF5YmFjayBWb2x1bWUiLCAweDExLCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJQQ00gUGxheWJhY2sgU3dpdGNoIiwgMHgxMSwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgUGxheWJhY2sgVm9sdW1lIiwgMHgxMiwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MTIsIDB4MCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ0QgUGxheWJhY2sgVm9sdW1lIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfTVVURSgiQ0QgUGxheWJhY2sgU3dpdGNoIiwgMHgxZCwgMHgwLCBIREFfT1VUUFVUKSwKKwlIREFfQ09ERUNfVk9MVU1FKCJNaWMgQm9vc3QiLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCisJSERBX0NPREVDX1ZPTFVNRSgiQ2FwdHVyZSBWb2x1bWUiLCAweDE1LCAweDAsIEhEQV9PVVRQVVQpLAorCUhEQV9DT0RFQ19NVVRFKCJDYXB0dXJlIFN3aXRjaCIsIDB4MTUsIDB4MCwgSERBX09VVFBVVCksCisJeworCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkJLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLAorCQkuaW5mbyA9IGFkMTk4eF9tdXhfZW51bV9pbmZvLAorCQkuZ2V0ID0gYWQxOTh4X211eF9lbnVtX2dldCwKKwkJLnB1dCA9IGFkMTk4eF9tdXhfZW51bV9wdXQsCisJfSwKKwkvKiBpZGVudGljYWwgd2l0aCBBRDE5ODMgKi8KKwl7CisJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCQkubmFtZSA9IFNORFJWX0NUTF9OQU1FX0lFQzk1OCgiIixQTEFZQkFDSyxOT05FKSAiU291cmNlIiwKKwkJLmluZm8gPSBhZDE5ODNfc3BkaWZfcm91dGVfaW5mbywKKwkJLmdldCA9IGFkMTk4M19zcGRpZl9yb3V0ZV9nZXQsCisJCS5wdXQgPSBhZDE5ODNfc3BkaWZfcm91dGVfcHV0LAorCX0sCisJeyB9IC8qIGVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfaW5wdXRfbXV4IGFkMTk4MV90aGlua3BhZF9jYXB0dXJlX3NvdXJjZSA9IHsKKwkubnVtX2l0ZW1zID0gMywKKwkuaXRlbXMgPSB7CisJCXsgIk1pYyIsIDB4MCB9LAorCQl7ICJNaXgiLCAweDIgfSwKKwkJeyAiQ0QiLCAweDQgfSwKKwl9LAorfTsKKwogLyogbW9kZWxzICovCi1lbnVtIHsgQUQxOTgxX0JBU0lDLCBBRDE5ODFfSFAgfTsKK2VudW0geyBBRDE5ODFfQkFTSUMsIEFEMTk4MV9IUCwgQUQxOTgxX1RISU5LUEFEIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaGRhX2JvYXJkX2NvbmZpZyBhZDE5ODFfY2ZnX3RibFtdID0gewogCXsgLm1vZGVsbmFtZSA9ICJocCIsIC5jb25maWcgPSBBRDE5ODFfSFAgfSwKIAkvKiBBbGwgSFAgbW9kZWxzICovCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLmNvbmZpZyA9IEFEMTk4MV9IUCB9LAorCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDMwYjAsIC5wY2lfc3ViZGV2aWNlID0gMHgxMDNjLAorCSAgLmNvbmZpZyA9IEFEMTk4MV9IUCB9LCAvKiBIUCBueDYzMjAgKHJldmVyc2VkIFNTSUQsIEgvVyBidWcpICovCisJeyAubW9kZWxuYW1lID0gInRoaW5rcGFkIiwgLmNvbmZpZyA9IEFEMTk4MV9USElOS1BBRCB9LAorCS8qIExlbm92byBUaGlua3BhZCBUNjAvWDYwL1o2eHggKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxN2FhLCAuY29uZmlnID0gQUQxOTgxX1RISU5LUEFEIH0sCisJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAxNCwgLnBjaV9zdWJkZXZpY2UgPSAweDA1OTcsCisJICAuY29uZmlnID0gQUQxOTgxX1RISU5LUEFEIH0sIC8qIFo2MG0vdCAqLwogCXsgLm1vZGVsbmFtZSA9ICJiYXNpYyIsIC5jb25maWcgPSBBRDE5ODFfQkFTSUMgfSwKIAl7fQogfTsKQEAgLTEzODEsNiArMTQzMiwxMCBAQAogCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQgPSBhZDE5ODFfaHBfaW5pdDsKIAkJY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCA9IGFkMTk4MV9ocF91bnNvbF9ldmVudDsKIAkJYnJlYWs7CisJY2FzZSBBRDE5ODFfVEhJTktQQUQ6CisJCXNwZWMtPm1peGVyc1swXSA9IGFkMTk4MV90aGlua3BhZF9taXhlcnM7CisJCXNwZWMtPmlucHV0X211eCA9ICZhZDE5ODFfdGhpbmtwYWRfY2FwdHVyZV9zb3VyY2U7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2F0aWhkbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjc0NDBmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hdGloZG1pLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBVbml2ZXJzYWwgSW50ZXJmYWNlIGZvciBJbnRlbCBIaWdoIERlZmluaXRpb24gQXVkaW8gQ29kZWMKKyAqCisgKiBIRCBhdWRpbyBpbnRlcmZhY2UgcGF0Y2ggZm9yIEFUSSBIRE1JIGNvZGVjcworICoKKyAqIENvcHlyaWdodCAoYykgMjAwNiBBVEkgVGVjaG5vbG9naWVzIEluYy4KKyAqCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBkcml2ZXIgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPHNvdW5kL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCisjaW5jbHVkZSAiaGRhX2xvY2FsLmgiCisKK3N0cnVjdCBhdGloZG1pX3NwZWMgeworCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OworCisJc3RydWN0IGhkYV9wY20gcGNtX3JlYzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGRhX3ZlcmIgYXRpaGRtaV9iYXNpY19pbml0W10gPSB7CisJLyogZW5hYmxlIGRpZ2l0YWwgb3V0cHV0IG9uIHBpbiB3aWRnZXQgKi8KKwl7IDB4MDMsIEFDX1ZFUkJfU0VUX1BJTl9XSURHRVRfQ09OVFJPTCwgUElOX09VVCB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKKy8qCisgKiBDb250cm9scworICovCitzdGF0aWMgaW50IGF0aWhkbWlfYnVpbGRfY29udHJvbHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGF0aWhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisKKwllcnIgPSBzbmRfaGRhX2NyZWF0ZV9zcGRpZl9vdXRfY3Rscyhjb2RlYywgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRpaGRtaV9pbml0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIGF0aWhkbWlfYmFzaWNfaW5pdCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KKy8qCisgKiByZXN1bWUKKyAqLworc3RhdGljIGludCBhdGloZG1pX3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlhdGloZG1pX2luaXQoY29kZWMpOworCXNuZF9oZGFfcmVzdW1lX3NwZGlmX291dChjb2RlYyk7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogRGlnaXRhbCBvdXQKKyAqLworc3RhdGljIGludCBhdGloZG1pX2RpZ19wbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3QgYXRpaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCitzdGF0aWMgaW50IGF0aWhkbWlfZGlnX3BsYXliYWNrX3BjbV9jbG9zZShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAorCQkJCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBhdGloZG1pX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlyZXR1cm4gc25kX2hkYV9tdWx0aV9vdXRfZGlnX2Nsb3NlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOworfQorCitzdGF0aWMgc3RydWN0IGhkYV9wY21fc3RyZWFtIGF0aWhkbWlfcGNtX2RpZ2l0YWxfcGxheWJhY2sgPSB7CisJLnN1YnN0cmVhbXMgPSAxLAorCS5jaGFubmVsc19taW4gPSAyLAorCS5jaGFubmVsc19tYXggPSAyLAorCS5uaWQgPSAweDIsIC8qIE5JRCB0byBxdWVyeSBmb3JtYXRzIGFuZCByYXRlcyBhbmQgc2V0dXAgc3RyZWFtcyAqLworCS5vcHMgPSB7CisJCS5vcGVuID0gYXRpaGRtaV9kaWdfcGxheWJhY2tfcGNtX29wZW4sCisJCS5jbG9zZSA9IGF0aWhkbWlfZGlnX3BsYXliYWNrX3BjbV9jbG9zZQorCX0sCit9OworCitzdGF0aWMgaW50IGF0aWhkbWlfYnVpbGRfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlzdHJ1Y3QgYXRpaGRtaV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IGhkYV9wY20gKmluZm8gPSAmc3BlYy0+cGNtX3JlYzsKKworCWNvZGVjLT5udW1fcGNtcyA9IDE7CisJY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKKworCWluZm8tPm5hbWUgPSAiQVRJIEhETUkiOworCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGF0aWhkbWlfcGNtX2RpZ2l0YWxfcGxheWJhY2s7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXRpaGRtaV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWtmcmVlKGNvZGVjLT5zcGVjKTsKK30KKworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfb3BzIGF0aWhkbWlfcGF0Y2hfb3BzID0geworCS5idWlsZF9jb250cm9scyA9IGF0aWhkbWlfYnVpbGRfY29udHJvbHMsCisJLmJ1aWxkX3BjbXMgPSBhdGloZG1pX2J1aWxkX3BjbXMsCisJLmluaXQgPSBhdGloZG1pX2luaXQsCisJLmZyZWUgPSBhdGloZG1pX2ZyZWUsCisjaWZkZWYgQ09ORklHX1BNCisJLnJlc3VtZSA9IGF0aWhkbWlfcmVzdW1lLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHBhdGNoX2F0aWhkbWkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IGF0aWhkbWlfc3BlYyAqc3BlYzsKKworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmIChzcGVjID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJY29kZWMtPnNwZWMgPSBzcGVjOworCisJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MgPSAwOwkgIC8qIG5vIGFuYWxvZyAqLworCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVscyA9IDI7CisJc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgPSAweDI7IC8qIE5JRCBmb3IgY29weWluZyBhbmFsb2cgdG8gZGlnaXRhbCwKKwkJCQkJICAgKiBzZWVtcyB0byBiZSB1bnVzZWQgaW4gcHVyZS1kaWdpdGFsCisJCQkJCSAgICogY2FzZS4gKi8KKworCWNvZGVjLT5wYXRjaF9vcHMgPSBhdGloZG1pX3BhdGNoX29wczsKKworCXJldHVybiAwOworfQorCisvKgorICogcGF0Y2ggZW50cmllcworICovCitzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9hdGloZG1pW10gPSB7CisJeyAuaWQgPSAweDEwMDI3OTNjLCAubmFtZSA9ICJBVEkgUlM2MDAgSERNSSIsIC5wYXRjaCA9IHBhdGNoX2F0aWhkbWkgfSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCBmMGU5YTljLi45OGI5ZjE2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMjE3NCw2ICsyMTc0LDcgQEAKIAogCXsgLm1vZGVsbmFtZSA9ICJsZyIsIC5jb25maWcgPSBBTEM4ODBfTEcgfSwKIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxODU0LCAucGNpX3N1YmRldmljZSA9IDB4MDAzYiwgLmNvbmZpZyA9IEFMQzg4MF9MRyB9LAorCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE4NTQsIC5wY2lfc3ViZGV2aWNlID0gMHgwMDY4LCAuY29uZmlnID0gQUxDODgwX0xHIH0sCiAKIAl7IC5tb2RlbG5hbWUgPSAibGctbHciLCAuY29uZmlnID0gQUxDODgwX0xHX0xXIH0sCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTg1NCwgLnBjaV9zdWJkZXZpY2UgPSAweDAwMTgsIC5jb25maWcgPSBBTEM4ODBfTEdfTFcgfSwKQEAgLTMxMDUsNiArMzEwNiw3IEBACiAJeyB9CiB9OwogCisjaWYgMCAvKiBzaG91bGQgYmUgaWRlbnRpY2FsIHdpdGggYWxjMjYwX2luaXRfdmVyYnM/ICovCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF9pbml0X3ZlcmJzW10gPSB7CiAJLyogSGVhZHBob25lIGFuZCBvdXRwdXQgKi8KIAl7MHgxMCwgQUNfVkVSQl9TRVRfUElOX1dJREdFVF9DT05UUk9MLCAweGMwfSwKQEAgLTMxNTEsNiArMzE1Myw3IEBACiAJezB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsICgweDcwMDAgfCAoMHgwMSA8PCA4KSl9LAogCXsgfQogfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGhkYV92ZXJiIGFsYzI2MF9ocF8zMDEzX2luaXRfdmVyYnNbXSA9IHsKIAkvKiBMaW5lIG91dCBhbmQgb3V0cHV0ICovCkBAIC0zODIyLDEyICszODI1LDE2IEBACiAJeyAubW9kZWxuYW1lID0gImJhc2ljIiwgLmNvbmZpZyA9IEFMQzI2MF9CQVNJQyB9LAogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwNGQsIC5wY2lfc3ViZGV2aWNlID0gMHg4MWJiLAogCSAgLmNvbmZpZyA9IEFMQzI2MF9CQVNJQyB9LCAvKiBTb255IFZBSU8gKi8KKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDRkLCAucGNpX3N1YmRldmljZSA9IDB4ODFjYywKKwkgIC5jb25maWcgPSBBTEMyNjBfQkFTSUMgfSwgLyogU29ueSBWQUlPIFZHTi1TM0hQICovCisJeyAucGNpX3N1YnZlbmRvciA9IDB4MTA0ZCwgLnBjaV9zdWJkZXZpY2UgPSAweDgxY2QsCisJICAuY29uZmlnID0gQUxDMjYwX0JBU0lDIH0sIC8qIFNvbnkgVkFJTyAqLwogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDE1MmQsIC5wY2lfc3ViZGV2aWNlID0gMHgwNzI5LAogCSAgLmNvbmZpZyA9IEFMQzI2MF9CQVNJQyB9LCAvKiBDVEwgVHJhdmVsIE1hc3RlciBVNTUzVyAqLwogCXsgLm1vZGVsbmFtZSA9ICJocCIsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKIAl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxMCwgLmNvbmZpZyA9IEFMQzI2MF9IUCB9LAogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDExLCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCi0JeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTIsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKKwl7IC5wY2lfc3VidmVuZG9yID0gMHgxMDNjLCAucGNpX3N1YmRldmljZSA9IDB4MzAxMiwgLmNvbmZpZyA9IEFMQzI2MF9IUF8zMDEzIH0sCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTMsIC5jb25maWcgPSBBTEMyNjBfSFBfMzAxMyB9LAogCXsgLnBjaV9zdWJ2ZW5kb3IgPSAweDEwM2MsIC5wY2lfc3ViZGV2aWNlID0gMHgzMDE0LCAuY29uZmlnID0gQUxDMjYwX0hQIH0sCiAJeyAucGNpX3N1YnZlbmRvciA9IDB4MTAzYywgLnBjaV9zdWJkZXZpY2UgPSAweDMwMTUsIC5jb25maWcgPSBBTEMyNjBfSFAgfSwKQEAgLTM4NjIsNyArMzg2OSw3IEBACiAJCS5taXhlcnMgPSB7IGFsYzI2MF9iYXNlX291dHB1dF9taXhlciwKIAkJCSAgICBhbGMyNjBfaW5wdXRfbWl4ZXIsCiAJCQkgICAgYWxjMjYwX2NhcHR1cmVfYWx0X21peGVyIH0sCi0JCS5pbml0X3ZlcmJzID0geyBhbGMyNjBfaHBfaW5pdF92ZXJicyB9LAorCQkuaW5pdF92ZXJicyA9IHsgYWxjMjYwX2luaXRfdmVyYnMgfSwKIAkJLm51bV9kYWNzID0gQVJSQVlfU0laRShhbGMyNjBfZGFjX25pZHMpLAogCQkuZGFjX25pZHMgPSBhbGMyNjBfZGFjX25pZHMsCiAJCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzI2MF9ocF9hZGNfbmlkcyksCkBAIC00MDk0LDIxICs0MTAxLDYgQEAKIAlIREFfQ09ERUNfTVVURSgiRnJvbnQgTWljIFBsYXliYWNrIFN3aXRjaCIsIDB4MGIsIDB4MSwgSERBX0lOUFVUKSwKIAlIREFfQ09ERUNfVk9MVU1FKCJQQyBTcGVha2VyIFBsYXliYWNrIFZvbHVtZSIsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCksCiAJSERBX0NPREVDX01VVEUoIlBDIFNwZWFrZXIgUGxheWJhY2sgU3dpdGNoIiwgMHgwYiwgMHgwNSwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfVk9MVU1FKCJDYXB0dXJlIFZvbHVtZSIsIDB4MDcsIDB4MCwgSERBX0lOUFVUKSwKLQlIREFfQ09ERUNfTVVURSgiQ2FwdHVyZSBTd2l0Y2giLCAweDA3LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMSwgMHgwOCwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAxLCAweDA4LCAweDAsIEhEQV9JTlBVVCksCi0JSERBX0NPREVDX1ZPTFVNRV9JRFgoIkNhcHR1cmUgVm9sdW1lIiwgMiwgMHgwOSwgMHgwLCBIREFfSU5QVVQpLAotCUhEQV9DT0RFQ19NVVRFX0lEWCgiQ2FwdHVyZSBTd2l0Y2giLCAyLCAweDA5LCAweDAsIEhEQV9JTlBVVCksCi0JewotCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLyogLm5hbWUgPSAiQ2FwdHVyZSBTb3VyY2UiLCAqLwotCQkubmFtZSA9ICJJbnB1dCBTb3VyY2UiLAotCQkuY291bnQgPSAzLAotCQkuaW5mbyA9IGFsYzg4Ml9tdXhfZW51bV9pbmZvLAotCQkuZ2V0ID0gYWxjODgyX211eF9lbnVtX2dldCwKLQkJLnB1dCA9IGFsYzg4Ml9tdXhfZW51bV9wdXQsCi0JfSwKIAl7IH0gLyogZW5kICovCiB9OwogCkBAIC00MzQyLDggKzQzMzQsNiBAQAogCQkubnVtX2RhY3MgPSBBUlJBWV9TSVpFKGFsYzg4Ml9kYWNfbmlkcyksCiAJCS5kYWNfbmlkcyA9IGFsYzg4Ml9kYWNfbmlkcywKIAkJLmRpZ19vdXRfbmlkID0gQUxDODgyX0RJR09VVF9OSUQsCi0JCS5udW1fYWRjX25pZHMgPSBBUlJBWV9TSVpFKGFsYzg4Ml9hZGNfbmlkcyksCi0JCS5hZGNfbmlkcyA9IGFsYzg4Ml9hZGNfbmlkcywKIAkJLmRpZ19pbl9uaWQgPSBBTEM4ODJfRElHSU5fTklELAogCQkubnVtX2NoYW5uZWxfbW9kZSA9IEFSUkFZX1NJWkUoYWxjODgyX2NoX21vZGVzKSwKIAkJLmNoYW5uZWxfbW9kZSA9IGFsYzg4Ml9jaF9tb2RlcywKQEAgLTQzNTUsOCArNDM0NSw2IEBACiAJCS5udW1fZGFjcyA9IEFSUkFZX1NJWkUoYWxjODgyX2RhY19uaWRzKSwKIAkJLmRhY19uaWRzID0gYWxjODgyX2RhY19uaWRzLAogCQkuZGlnX291dF9uaWQgPSBBTEM4ODJfRElHT1VUX05JRCwKLQkJLm51bV9hZGNfbmlkcyA9IEFSUkFZX1NJWkUoYWxjODgyX2FkY19uaWRzKSwKLQkJLmFkY19uaWRzID0gYWxjODgyX2FkY19uaWRzLAogCQkuZGlnX2luX25pZCA9IEFMQzg4Ml9ESUdJTl9OSUQsCiAJCS5udW1fY2hhbm5lbF9tb2RlID0gQVJSQVlfU0laRShhbGM4ODJfc2l4c3RhY2tfbW9kZXMpLAogCQkuY2hhbm5lbF9tb2RlID0gYWxjODgyX3NpeHN0YWNrX21vZGVzLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDhjNDQwZmIuLjM2ZjE5OTQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNkZWZpbmUgU1RBQ19SRUYJCTAKICNkZWZpbmUgU1RBQ19EOTQ1R1RQMwkJMQogI2RlZmluZSBTVEFDX0Q5NDVHVFA1CQkyCisjZGVmaW5lIFNUQUNfTUFDTUlOSQkJMwogCiBzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyB7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm1peGVyc1s0XTsKQEAgLTUyLDYgKzUzLDcgQEAKIAl1bnNpZ25lZCBpbnQgbWljX3N3aXRjaDogMTsKIAl1bnNpZ25lZCBpbnQgYWx0X3N3aXRjaDogMTsKIAl1bnNpZ25lZCBpbnQgaHBfZGV0ZWN0OiAxOworCXVuc2lnbmVkIGludCBncGlvX211dGU6IDE7CiAKIAkvKiBwbGF5YmFjayAqLwogCXN0cnVjdCBoZGFfbXVsdGlfb3V0IG11bHRpb3V0OwpAQCAtMjkzLDYgKzI5NSw3IEBACiAJcmVmOTIyeF9waW5fY29uZmlncywKIAlkOTQ1Z3RwM19waW5fY29uZmlncywKIAlkOTQ1Z3RwNV9waW5fY29uZmlncywKKwlOVUxMLAkJLyogU1RBQ19NQUNNSU5JICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGhkYV9ib2FyZF9jb25maWcgc3RhYzkyMnhfY2ZnX3RibFtdID0gewpAQCAtMzI0LDYgKzMyNyw5IEBACiAJeyAucGNpX3N1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsCiAJICAucGNpX3N1YmRldmljZSA9IDB4MDQxNywKIAkgIC5jb25maWcgPSBTVEFDX0Q5NDVHVFA1IH0sCS8qIEludGVsIEQ5NzVYQksgLSA1IFN0YWNrICovCisJeyAucGNpX3N1YnZlbmRvciA9IDB4ODM4NCwKKwkgIC5wY2lfc3ViZGV2aWNlID0gMHg3NjgwLAorCSAgLmNvbmZpZyA9IFNUQUNfTUFDTUlOSSB9LAkvKiBBcHBsZSBNYWMgTWluaSAoZWFybHkgMjAwNikgKi8KIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCkBAIC04NDEsNiArODQ3LDE5IEBACiAJCX0KIAl9CiAKKwlpZiAoaW11eC0+bnVtX2l0ZW1zID09IDEpIHsKKwkJLyoKKwkJICogU2V0IHRoZSBjdXJyZW50IGlucHV0IGZvciB0aGUgbXV4ZXMuCisJCSAqIFRoZSBTVEFDOTIyMSBoYXMgdHdvIGlucHV0IG11eGVzIHdpdGggaWRlbnRpY2FsIHNvdXJjZQorCQkgKiBOSUQgbGlzdHMuICBIb3BlZnVsbHkgdGhpcyB3b24ndCBnZXQgY29uZnVzZWQuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+bnVtX211eGVzOyBpKyspIHsKKwkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIHNwZWMtPm11eF9uaWRzW2ldLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfQ09OTkVDVF9TRUwsCisJCQkJCSAgICBpbXV4LT5pdGVtc1swXS5pbmRleCk7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQ2LDYgKzk2NSw0NSBAQAogCXJldHVybiAxOwogfQogCisvKgorICogRWFybHkgMjAwNiBJbnRlbCBNYWNpbnRvc2hlcyB3aXRoIFNUQUM5MjIwWDUgY29kZWNzIHNlZW0gdG8gaGF2ZSBhCisgKiBmdW5reSBleHRlcm5hbCBtdXRlIGNvbnRyb2wgdXNpbmcgR1BJTyBwaW5zLgorICovCisKK3N0YXRpYyB2b2lkIHN0YWM5MjJ4X2dwaW9fbXV0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IHBpbiwgaW50IG11dGVkKQoreworCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOworCisJZ3Bpb3N0YXRlID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsIDApOworCisJaWYgKCFtdXRlZCkKKwkJZ3Bpb3N0YXRlIHw9ICgxIDw8IHBpbik7CisJZWxzZQorCQlncGlvc3RhdGUgJj0gfigxIDw8IHBpbik7CisKKwlncGlvbWFzayA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCQkgICAgICBBQ19WRVJCX0dFVF9HUElPX01BU0ssIDApOworCWdwaW9tYXNrIHw9ICgxIDw8IHBpbik7CisKKwlncGlvZGlyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJCSAgICAgQUNfVkVSQl9HRVRfR1BJT19ESVJFQ1RJT04sIDApOworCWdwaW9kaXIgfD0gKDEgPDwgcGluKTsKKworCS8qIEFwcGxlSERBIHNlZW1zIHRvIGRvIHRoaXMgLS0gV1RGIGlzIHRoaXMgdmVyYj8/ICovCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwgMHg3ZTcsIDApOworCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSAgICBBQ19WRVJCX1NFVF9HUElPX01BU0ssIGdwaW9tYXNrKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJICAgIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCBncGlvZGlyKTsKKworCW1zbGVlcCgxKTsKKworCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9TRVRfR1BJT19EQVRBLCBncGlvc3RhdGUpOworfQorCiBzdGF0aWMgaW50IHN0YWM5Mnh4X2luaXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKQEAgLTk4Miw2ICsxMDQwLDExIEBACiAJCXN0YWM5Mnh4X2F1dG9fc2V0X3BpbmN0bChjb2RlYywgY2ZnLT5kaWdfaW5fcGluLAogCQkJCQkgQUNfUElOQ1RMX0lOX0VOKTsKIAorCWlmIChzcGVjLT5ncGlvX211dGUpIHsKKwkJc3RhYzkyMnhfZ3Bpb19tdXRlKGNvZGVjLCAwLCAwKTsKKwkJc3RhYzkyMnhfZ3Bpb19tdXRlKGNvZGVjLCAxLCAwKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTEzMiw3ICsxMTk1LDcgQEAKIAlzcGVjLT5ib2FyZF9jb25maWcgPSBzbmRfaGRhX2NoZWNrX2JvYXJkX2NvbmZpZyhjb2RlYywgc3RhYzkyMnhfY2ZnX3RibCk7CiAJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA8IDApCiAgICAgICAgICAgICAgICAgc25kX3ByaW50ZGQoS0VSTl9JTkZPICJoZGFfY29kZWM6IFVua25vd24gbW9kZWwgZm9yIFNUQUM5MjJ4LCB1c2luZyBCSU9TIGRlZmF1bHRzXG4iKTsKLQllbHNlIHsKKwllbHNlIGlmIChzdGFjOTIyeF9icmRfdGJsW3NwZWMtPmJvYXJkX2NvbmZpZ10gIT0gTlVMTCkgewogCQlzcGVjLT5udW1fcGlucyA9IDEwOwogCQlzcGVjLT5waW5fbmlkcyA9IHN0YWM5MjJ4X3Bpbl9uaWRzOwogCQlzcGVjLT5waW5fY29uZmlncyA9IHN0YWM5MjJ4X2JyZF90Ymxbc3BlYy0+Ym9hcmRfY29uZmlnXTsKQEAgLTExNTQsNiArMTIxNyw5IEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJaWYgKHNwZWMtPmJvYXJkX2NvbmZpZyA9PSBTVEFDX01BQ01JTkkpCisJCXNwZWMtPmdwaW9fbXV0ZSA9IDE7CisKIAljb2RlYy0+cGF0Y2hfb3BzID0gc3RhYzkyeHhfcGF0Y2hfb3BzOwogCiAJcmV0dXJuIDA7CkBAIC0xMjYyLDEzICsxMzI4LDEzIEBACiAJaW50IGNoYW5nZTsKIAogCWNoYW5nZSA9IHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwMiwgMCwgSERBX09VVFBVVCwgMCwKLQkJCQkJICAweDgwLCB2YWxwWzBdICYgMHg4MCk7CisJCQkJCSAgMHg4MCwgKHZhbHBbMF0gPyAwIDogMHg4MCkpOwogCWNoYW5nZSB8PSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIDB4MDIsIDEsIEhEQV9PVVRQVVQsIDAsCi0JCQkJCSAgIDB4ODAsIHZhbHBbMV0gJiAweDgwKTsKKwkJCQkJICAgMHg4MCwgKHZhbHBbMV0gPyAwIDogMHg4MCkpOwogCXNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgMHgwNSwgMCwgSERBX09VVFBVVCwgMCwKLQkJCQkgMHg4MCwgdmFscFswXSAmIDB4ODApOworCQkJCSAweDgwLCAodmFscFswXSA/IDAgOiAweDgwKSk7CiAJc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCAweDA1LCAxLCBIREFfT1VUUFVULCAwLAotCQkJCSAweDgwLCB2YWxwWzFdICYgMHg4MCk7CisJCQkJIDB4ODAsICh2YWxwWzFdID8gMCA6IDB4ODApKTsKIAlyZXR1cm4gY2hhbmdlOwogfQogCkBAIC0xMzcwLDYgKzE0MzYsMTIgQEAKICAJeyAuaWQgPSAweDgzODQ3NjgxLCAubmFtZSA9ICJTVEFDOTIyMEQvOTIyM0QgQTIiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTIyeCB9LAogIAl7IC5pZCA9IDB4ODM4NDc2ODIsIC5uYW1lID0gIlNUQUM5MjIxIEEyIiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyMnggfSwKICAJeyAuaWQgPSAweDgzODQ3NjgzLCAubmFtZSA9ICJTVEFDOTIyMUQgQTIiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTIyeCB9LAorIAl7IC5pZCA9IDB4ODM4NDc2MTgsIC5uYW1lID0gIlNUQUM5MjI3IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyMnggfSwKKyAJeyAuaWQgPSAweDgzODQ3NjE5LCAubmFtZSA9ICJTVEFDOTIyNyIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjJ4IH0sCisgCXsgLmlkID0gMHg4Mzg0NzYxNiwgLm5hbWUgPSAiU1RBQzkyMjgiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTIyeCB9LAorIAl7IC5pZCA9IDB4ODM4NDc2MTcsIC5uYW1lID0gIlNUQUM5MjI4IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyMnggfSwKKyAJeyAuaWQgPSAweDgzODQ3NjE0LCAubmFtZSA9ICJTVEFDOTIyOSIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5MjJ4IH0sCisgCXsgLmlkID0gMHg4Mzg0NzYxNSwgLm5hbWUgPSAiU1RBQzkyMjkiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTIyeCB9LAogIAl7IC5pZCA9IDB4ODM4NDc2MjAsIC5uYW1lID0gIlNUQUM5Mjc0IiwgLnBhdGNoID0gcGF0Y2hfc3RhYzkyN3ggfSwKICAJeyAuaWQgPSAweDgzODQ3NjIxLCAubmFtZSA9ICJTVEFDOTI3NEQiLCAucGF0Y2ggPSBwYXRjaF9zdGFjOTI3eCB9LAogIAl7IC5pZCA9IDB4ODM4NDc2MjIsIC5uYW1lID0gIlNUQUM5MjczWCIsIC5wYXRjaCA9IHBhdGNoX3N0YWM5Mjd4IH0sCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCmluZGV4IDMzNmRjNDguLmNhNzRmNWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5jCkBAIC0xMjgxLDkgKzEyODEsMTUgQEAKIAogCXRtcDIgPSB0bXAgPSBzbmRfaWNlMTcxMl9ncGlvX3JlYWQoaWNlKTsKIAlpZiAoZW5hYmxlKQotCQl0bXAgfD0gQVVSRU9OX0hQX1NFTDsKKwkJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciAhPSBWVDE3MjRfU1VCREVWSUNFX1BST0RJR1k3MUxUKQorCQkJdG1wIHw9IEFVUkVPTl9IUF9TRUw7CisJCWVsc2UKKwkJCXRtcCB8PSBQUk9ESUdZX0hQX1NFTDsKIAllbHNlCi0JCXRtcCAmPSB+IEFVUkVPTl9IUF9TRUw7CisJCWlmIChpY2UtPmVlcHJvbS5zdWJ2ZW5kb3IgIT0gVlQxNzI0X1NVQkRFVklDRV9QUk9ESUdZNzFMVCkKKwkJCXRtcCAmPSB+IEFVUkVPTl9IUF9TRUw7CisJCWVsc2UKKwkJCXRtcCAmPSB+IFBST0RJR1lfSFBfU0VMOwogCWlmICh0bXAgIT0gdG1wMikgewogCQlzbmRfaWNlMTcxMl9ncGlvX3dyaXRlKGljZSwgdG1wKTsKIAkJcmV0dXJuIDE7CkBAIC0yMDc5LDE2ICsyMDg1LDE2IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBwcm9kaWd5NzFsdF9lZXByb21bXSBfX2RldmluaXRkYXRhID0gewotCTB4MGIsCS8qIFNZU0NJTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLworCTB4NGIsCS8qIFNZU0NJTkY6IGNsb2NrIDUxMiwgc3BkaWYtaW4vQURDLCA0REFDcyAqLwogCTB4ODAsCS8qIEFDTElOSzogSTJTICovCiAJMHhmYywJLyogSTJTOiB2b2wsIDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMzLAkvKiBTUERVRjogb3V0LWVuLCBvdXQtaW50ICovCi0JMHgwMCwJLyogR1BJT19ESVIgKi8KLQkweDA3LAkvKiBHUElPX0RJUjEgKi8KLQkweDAwLAkvKiBHUElPX0RJUjIgKi8KLQkweGZmLAkvKiBHUElPX01BU0sgKi8KLQkweGY4LAkvKiBHUElPX01BU0sxICovCi0JMHhmZiwJLyogR1BJT19NQVNLMiAqLworCTB4YzMsCS8qIFNQRElGOiBvdXQtZW4sIG91dC1pbnQsIHNwZGlmLWluICovCisJMHhmZiwJLyogR1BJT19ESVIgKi8KKwkweGZmLAkvKiBHUElPX0RJUjEgKi8KKwkweDVmLAkvKiBHUElPX0RJUjIgKi8KKwkweDAwLAkvKiBHUElPX01BU0sgKi8KKwkweDAwLAkvKiBHUElPX01BU0sxICovCisJMHgwMCwJLyogR1BJT19NQVNLMiAqLwogCTB4MDAsCS8qIEdQSU9fU1RBVEUgKi8KIAkweDAwLAkvKiBHUElPX1NUQVRFMSAqLwogCTB4MDAsCS8qIEdQSU9fU1RBVEUyICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9hdXJlb24uaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCmluZGV4IDk4YTY3NTIuLjNiN2JlYTYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2F1cmVvbi5oCkBAIC01OCw1ICs1OCw2IEBACiAjZGVmaW5lIFBST0RJR1lfV01fQ1MJCSgxIDw8IDgpCiAjZGVmaW5lIFBST0RJR1lfU1BJX01PU0kJKDEgPDwgMTApCiAjZGVmaW5lIFBST0RJR1lfU1BJX0NMSwkJKDEgPDwgOSkKKyNkZWZpbmUgUFJPRElHWV9IUF9TRUwJCSgxIDw8IDUpCiAKICNlbmRpZiAvKiBfX1NPVU5EX0FVUkVPTl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9ld3MuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCmluZGV4IDJjNTI5ZTcuLmIxMzUzODkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL2V3cy5jCkBAIC0xMDMxLDYgKzEwMzEsOSBAQAogCQkubW9kZWwgPSAiZG14NmZpcmUiLAogCQkuY2hpcF9pbml0ID0gc25kX2ljZTE3MTJfZXdzX2luaXQsCiAJCS5idWlsZF9jb250cm9scyA9IHNuZF9pY2UxNzEyX2V3c19hZGRfY29udHJvbHMsCisJCS5tcHU0MDFfMV9uYW1lID0gIk1JREktRnJvbnQgRE1YNmZpcmUiLAorCQkubXB1NDAxXzJfbmFtZSA9ICJXYXZldGFibGUgRE1YNmZpcmUiLAorCQkubXB1NDAxXzJfaW5mb19mbGFncyA9IE1QVTQwMV9JTkZPX09VVFBVVCwKIAl9LAogCXsgfSAvKiB0ZXJtaW5hdG9yICovCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5jCmluZGV4IGM1Njc5M2IuLjg0NTkwNzEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmMKQEAgLTYxLDcgKzYxLDYgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvY3M4NDI3Lmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgotI2luY2x1ZGUgPHNvdW5kL21wdTQwMS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KIAogI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CkBAIC0xNTk2LDcgKzE1OTUsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhpY2UtPmNhcmQsICJpY2UxNzEyIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIDEwMjQsIHNuZF9pY2UxNzEyX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgaWNlLCBzbmRfaWNlMTcxMl9wcm9jX3JlYWQpOwogfQogCiAvKgpAQCAtMjM5OCwxMyArMjM5NywxNCBAQAogCXVkZWxheSgyMDApOwogCW91dGIoSUNFMTcxMl9OQVRJVkUsIElDRVJFRyhpY2UsIENPTlRST0wpKTsKIAl1ZGVsYXkoMjAwKTsKLQlpZiAoaWNlLT5lZXByb20uc3VidmVuZG9yID09IElDRTE3MTJfU1VCREVWSUNFX0RNWDZGSVJFICYmICFpY2UtPmR4cl9lbmFibGUpIHsKLSAgICAgICAgICAgICAgICAvKiBMaW1pdCBhY3RpdmUgQURDcyBhbmQgREFDcyB0byA2OyAgKi8KLSAgICAgICAgICAgICAgICAvKiBOb3RlOiBEWFIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKGljZS0+cGNpLCAweDYwLCAweDJhKTsKLQl9IGVsc2UgewotCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWNlLT5wY2ksIDB4NjAsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQ09ERUNdKTsKLQl9CisJaWYgKGljZS0+ZWVwcm9tLnN1YnZlbmRvciA9PSBJQ0UxNzEyX1NVQkRFVklDRV9ETVg2RklSRSAmJgorCSAgICAhaWNlLT5keHJfZW5hYmxlKQorCQkvKiAgU2V0IGVlcHJvbSB2YWx1ZSB0byBsaW1pdCBhY3RpdmUgQURDcyBhbmQgREFDcyB0byA2OworCQkgKiAgQWxzbyBkaXNhYmxlIEFDOTcgYXMgbm8gaGFyZHdhcmUgaW4gc3RhbmRhcmQgNmZpcmUgY2FyZC9ib3gKKwkJICogIE5vdGU6IERYUiBleHRlbnNpb25zIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZAorCQkgKi8KKwkJaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9DT0RFQ10gPSAweDNhOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShpY2UtPnBjaSwgMHg2MCwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9DT0RFQ10pOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShpY2UtPnBjaSwgMHg2MSwgaWNlLT5lZXByb20uZGF0YVtJQ0VfRUVQMV9BQ0xJTktdKTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWNlLT5wY2ksIDB4NjIsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfSTJTSURdKTsKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoaWNlLT5wY2ksIDB4NjMsIGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfU1BESUZdKTsKQEAgLTI3MzcsMjEgKzI3MzcsMzggQEAKIAogCWlmICghIGMtPm5vX21wdTQwMSkgewogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX0lDRTE3MTIsCi0JCQkJCSAgICAgICBJQ0VSRUcoaWNlLCBNUFUxX0NUUkwpLCAxLAorCQkJCQkgICAgICAgSUNFUkVHKGljZSwgTVBVMV9DVFJMKSwKKwkJCQkJICAgICAgIChjLT5tcHU0MDFfMV9pbmZvX2ZsYWdzIHwKKwkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQpLAogCQkJCQkgICAgICAgaWNlLT5pcnEsIDAsCiAJCQkJCSAgICAgICAmaWNlLT5ybWlkaVswXSkpIDwgMCkgewogCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KKwkJaWYgKGMtPm1wdTQwMV8xX25hbWUpCisJCQkvKiAgUHJlZmVyZWQgbmFtZSBhdmFpbGFibGUgaW4gY2FyZF9pbmZvICovCisJCQlzbnByaW50ZihpY2UtPnJtaWRpWzBdLT5uYW1lLAorCQkJCSBzaXplb2YoaWNlLT5ybWlkaVswXS0+bmFtZSksCisJCQkJICIlcyAlZCIsIGMtPm1wdTQwMV8xX25hbWUsIGNhcmQtPm51bWJlcik7CiAKLQkJaWYgKGljZS0+ZWVwcm9tLmRhdGFbSUNFX0VFUDFfQ09ERUNdICYgSUNFMTcxMl9DRkdfMnhNUFU0MDEpCisJCWlmIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAxX0NPREVDXSAmIElDRTE3MTJfQ0ZHXzJ4TVBVNDAxKSB7CisJCQkvKiAgMm5kIHBvcnQgdXNlZCAgKi8KIAkJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAxLCBNUFU0MDFfSFdfSUNFMTcxMiwKLQkJCQkJCSAgICAgICBJQ0VSRUcoaWNlLCBNUFUyX0NUUkwpLCAxLAorCQkJCQkJICAgICAgIElDRVJFRyhpY2UsIE1QVTJfQ1RSTCksCisJCQkJCQkgICAgICAgKGMtPm1wdTQwMV8yX2luZm9fZmxhZ3MgfAorCQkJCQkJCU1QVTQwMV9JTkZPX0lOVEVHUkFURUQpLAogCQkJCQkJICAgICAgIGljZS0+aXJxLCAwLAogCQkJCQkJICAgICAgICZpY2UtPnJtaWRpWzFdKSkgPCAwKSB7CiAJCQkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQorCQkJaWYgKGMtPm1wdTQwMV8yX25hbWUpCisJCQkJLyogIFByZWZlcmVkIG5hbWUgYXZhaWxhYmxlIGluIGNhcmRfaW5mbyAqLworCQkJCXNucHJpbnRmKGljZS0+cm1pZGlbMV0tPm5hbWUsCisJCQkJCSBzaXplb2YoaWNlLT5ybWlkaVsxXS0+bmFtZSksCisJCQkJCSAiJXMgJWQiLCBjLT5tcHU0MDFfMl9uYW1lLAorCQkJCQkgY2FyZC0+bnVtYmVyKTsKKwkJfQogCX0KIAogCXNuZF9pY2UxNzEyX3NldF9pbnB1dF9jbG9ja19zb3VyY2UoaWNlLCAwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaCBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MTIuaAppbmRleCAwNTNmOGU1Li5jZTI3ZWFjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzEyLmgKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcxMi5oCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8c291bmQvYWs0eHh4LWFkZGEuaD4KICNpbmNsdWRlIDxzb3VuZC9hazQxMTQuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9tcHU0MDEuaD4KIAogCiAvKgpAQCAtNDk1LDYgKzQ5NiwxMCBAQAogCWludCAoKmNoaXBfaW5pdCkoc3RydWN0IHNuZF9pY2UxNzEyICopOwogCWludCAoKmJ1aWxkX2NvbnRyb2xzKShzdHJ1Y3Qgc25kX2ljZTE3MTIgKik7CiAJdW5zaWduZWQgaW50IG5vX21wdTQwMTogMTsKKwl1bnNpZ25lZCBpbnQgbXB1NDAxXzFfaW5mb19mbGFnczsKKwl1bnNpZ25lZCBpbnQgbXB1NDAxXzJfaW5mb19mbGFnczsKKwljb25zdCBjaGFyICptcHU0MDFfMV9uYW1lOworCWNvbnN0IGNoYXIgKm1wdTQwMV8yX25hbWU7CiAJdW5zaWduZWQgaW50IGVlcHJvbV9zaXplOwogCXVuc2lnbmVkIGNoYXIgKmVlcHJvbV9kYXRhOwogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL2ljZTE3MjQuYwppbmRleCBiMWMwMDdlLi4zNGE1OGM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi9pY2UxNzI0LmMKKysrIGIvc291bmQvcGNpL2ljZTE3MTIvaWNlMTcyNC5jCkBAIC0xMjkzLDcgKzEyOTMsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhpY2UtPmNhcmQsICJpY2UxNzI0IiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIDEwMjQsIHNuZF92dDE3MjRfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIHNuZF92dDE3MjRfcHJvY19yZWFkKTsKIH0KIAogLyoKQEAgLTIzODgsNyArMjM4OCw4IEBACiAJaWYgKCEgYy0+bm9fbXB1NDAxKSB7CiAJCWlmIChpY2UtPmVlcHJvbS5kYXRhW0lDRV9FRVAyX1NZU0NPTkZdICYgVlQxNzI0X0NGR19NUFU0MDEpIHsKIAkJCWlmICgoZXJyID0gc25kX21wdTQwMV91YXJ0X25ldyhjYXJkLCAwLCBNUFU0MDFfSFdfSUNFMTcxMiwKLQkJCQkJCSAgICAgICBJQ0VSRUcxNzI0KGljZSwgTVBVX0NUUkwpLCAxLAorCQkJCQkJICAgICAgIElDRVJFRzE3MjQoaWNlLCBNUFVfQ1RSTCksCisJCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKIAkJCQkJCSAgICAgICBpY2UtPmlycSwgMCwKIAkJCQkJCSAgICAgICAmaWNlLT5ybWlkaVswXSkpIDwgMCkgewogCQkJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaWNlMTcxMi9wb250aXMuYyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCmluZGV4IGQyM2ZiM2YuLjBlZmNhZDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCisrKyBiL3NvdW5kL3BjaS9pY2UxNzEyL3BvbnRpcy5jCkBAIC02ODAsOSArNjgwLDggQEAKIHsKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGljZS0+Y2FyZCwgIndtX2NvZGVjIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGljZSwgMTAyNCwgd21fcHJvY19yZWdzX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGljZSwgd21fcHJvY19yZWdzX3JlYWQpOwogCQllbnRyeS0+bW9kZSB8PSBTX0lXVVNSOwotCQllbnRyeS0+Yy50ZXh0LndyaXRlX3NpemUgPSAxMDI0OwogCQllbnRyeS0+Yy50ZXh0LndyaXRlID0gd21fcHJvY19yZWdzX3dyaXRlOwogCX0KIH0KQEAgLTcwNSw5ICs3MDQsOCBAQAogc3RhdGljIHZvaWQgY3NfcHJvY19pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7Ci0JaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoaWNlLT5jYXJkLCAiY3NfY29kZWMiLCAmZW50cnkpKSB7Ci0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgaWNlLCAxMDI0LCBjc19wcm9jX3JlZ3NfcmVhZCk7Ci0JfQorCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGljZS0+Y2FyZCwgImNzX2NvZGVjIiwgJmVudHJ5KSkKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBpY2UsIGNzX3Byb2NfcmVnc19yZWFkKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaW50ZWw4eDAuYyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCmluZGV4IDBkZjc2MDIuLmVkYzE0NDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jCisrKyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCkBAIC02Niw3ICs2Niw3IEBACiAKIHN0YXRpYyBpbnQgaW5kZXggPSBTTkRSVl9ERUZBVUxUX0lEWDE7CS8qIEluZGV4IDAtTUFYICovCiBzdGF0aWMgY2hhciAqaWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KLXN0YXRpYyBpbnQgYWM5N19jbG9jayA9IDA7CitzdGF0aWMgaW50IGFjOTdfY2xvY2s7CiBzdGF0aWMgY2hhciAqYWM5N19xdWlyazsKIHN0YXRpYyBpbnQgYnVnZ3lfc2VtYXBob3JlOwogc3RhdGljIGludCBidWdneV9pcnEgPSAtMTsgLyogYXV0by1jaGVjayAqLwpAQCAtMTgwNyw2ICsxODA3LDEyIEBACiAJfSwKIAl7CiAJCS5zdWJ2ZW5kb3IgPSAweDEwMjgsCisJCS5zdWJkZXZpY2UgPSAweDAxNGUsCisJCS5uYW1lID0gIkRlbGwgRDgwMCIsIC8qIFNUQUM5NzUwLzUxICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnN1YnZlbmRvciA9IDB4MTAyOCwKIAkJLnN1YmRldmljZSA9IDB4MDE2MywKIAkJLm5hbWUgPSAiRGVsbCBVbmtub3duIiwJLyogU1RBQzk3NTAvNTEgKi8KIAkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQpAQCAtMjY0NSw3ICsyNjUxLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImludGVsOHgwIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBzbmRfaW50ZWw4eDBfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBzbmRfaW50ZWw4eDBfcHJvY19yZWFkKTsKIH0KICNlbHNlCiAjZGVmaW5lIHNuZF9pbnRlbDh4MF9wcm9jX2luaXQoeCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9pbnRlbDh4MG0uYyBiL3NvdW5kL3BjaS9pbnRlbDh4MG0uYwppbmRleCA3MjA2MzVmLi4yNDcwM2Q3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaW50ZWw4eDBtLmMKKysrIGIvc291bmQvcGNpL2ludGVsOHgwbS5jCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0YXRpYyBpbnQgaW5kZXggPSAtMjsgLyogRXhjbHVkZSB0aGUgZmlyc3QgY2FyZCAqLwogc3RhdGljIGNoYXIgKmlkID0gU05EUlZfREVGQVVMVF9TVFIxOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCi1zdGF0aWMgaW50IGFjOTdfY2xvY2sgPSAwOworc3RhdGljIGludCBhYzk3X2Nsb2NrOwogCiBtb2R1bGVfcGFyYW0oaW5kZXgsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGluZGV4LCAiSW5kZXggdmFsdWUgZm9yIEludGVsIGk4eDAgbW9kZW1jYXJkLiIpOwpAQCAtMTA5Miw3ICsxMDkyLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImludGVsOHgwbSIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgc25kX2ludGVsOHgwbV9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF9pbnRlbDh4MG1fcHJvY19yZWFkKTsKIH0KICNlbHNlIC8qICFDT05GSUdfUFJPQ19GUyAqLwogI2RlZmluZSBzbmRfaW50ZWw4eDBtX3Byb2NfaW5pdChjaGlwKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2tvcmcxMjEyL2tvcmcxMjEyLmMgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwppbmRleCBlMzlmYWQxLi42ZTk3OTMyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYworKysgYi9zb3VuZC9wY2kva29yZzEyMTIva29yZzEyMTIuYwpAQCAtMjA4NSw3ICsyMDg1LDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoa29yZzEyMTItPmNhcmQsICJrb3JnMTIxMiIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwga29yZzEyMTIsIDEwMjQsIHNuZF9rb3JnMTIxMl9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGtvcmcxMjEyLCBzbmRfa29yZzEyMTJfcHJvY19yZWFkKTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21hZXN0cm8zLmMgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwppbmRleCAxOTI4ZTA2Li4xYzM0NGZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvbWFlc3RybzMuYworKysgYi9zb3VuZC9wY2kvbWFlc3RybzMuYwpAQCAtMjg2MSw3ICsyODYxLDggQEAKICNpZiAwIC8qIFRPRE86IG5vdCBzdXBwb3J0ZWQgeWV0ICovCiAJLyogVE9ETyBlbmFibGUgTUlESSBJUlEgYW5kIEkvTyAqLwogCWVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2hpcC0+Y2FyZCwgMCwgTVBVNDAxX0hXX01QVTQwMSwKLQkJCQkgIGNoaXAtPmlvYmFzZSArIE1QVTQwMV9EQVRBX1BPUlQsIDEsCisJCQkJICBjaGlwLT5pb2Jhc2UgKyBNUFU0MDFfREFUQV9QT1JULAorCQkJCSAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKIAkJCQkgIGNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKTsKIAlpZiAoZXJyIDwgMCkKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibWFlc3RybzM6IG5vIE1JREkgc3VwcG9ydC5cbiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYyBiL3NvdW5kL3BjaS9taXhhcnQvbWl4YXJ0LmMKaW5kZXggMDljYzA3OC4uMzY2YzRhNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL21peGFydC9taXhhcnQuYworKysgYi9zb3VuZC9wY2kvbWl4YXJ0L21peGFydC5jCkBAIC0xMjQ0LDcgKzEyNDQsNiBAQAogCS8qIHRleHQgaW50ZXJmYWNlIHRvIHJlYWQgcGVyZiBhbmQgdGVtcCBtZXRlcnMgKi8KIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAiYm9hcmRfaW5mbyIsICZlbnRyeSkpIHsKIAkJZW50cnktPnByaXZhdGVfZGF0YSA9IGNoaXA7Ci0JCWVudHJ5LT5jLnRleHQucmVhZF9zaXplID0gMTAyNDsKIAkJZW50cnktPmMudGV4dC5yZWFkID0gc25kX21peGFydF9wcm9jX3JlYWQ7CiAJfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcGN4aHIvcGN4aHIuYyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCmluZGV4IGRhZmEyMjMuLjgxOTg4ODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCisrKyBiL3NvdW5kL3BjaS9wY3hoci9wY3hoci5jCkBAIC0xMTUwLDkgKzExNTAsOSBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAiaW5mbyIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgcGN4aHJfcHJvY19pbmZvKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBwY3hocl9wcm9jX2luZm8pOwogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJzeW5jIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBwY3hocl9wcm9jX3N5bmMpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHBjeGhyX3Byb2Nfc3luYyk7CiB9CiAvKiBlbmQgb2YgcHJvYyBpbnRlcmZhY2UgKi8KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jIGIvc291bmQvcGNpL3JpcHRpZGUvcmlwdGlkZS5jCmluZGV4IGQ4Y2M5ODUuLjU2MThlYzkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9yaXB0aWRlL3JpcHRpZGUuYworKysgYi9zb3VuZC9wY2kvcmlwdGlkZS9yaXB0aWRlLmMKQEAgLTE4MzYsMTEgKzE4MzYsMTEgQEAKIAkJVU5TRVRfR1JFU0VUKGNpZi0+aHdwb3J0KTsKIAkJa2ZyZWUoY2hpcC0+Y2lmKTsKIAl9CisJaWYgKGNoaXAtPmlycSA+PSAwKQorCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCWlmIChjaGlwLT5md19lbnRyeSkKIAkJcmVsZWFzZV9maXJtd2FyZShjaGlwLT5md19lbnRyeSk7CiAJcmVsZWFzZV9hbmRfZnJlZV9yZXNvdXJjZShjaGlwLT5yZXNfcG9ydCk7Ci0JaWYgKGNoaXAtPmlycSA+PSAwKQotCQlmcmVlX2lycShjaGlwLT5pcnEsIGNoaXApOwogCWtmcmVlKGNoaXApOwogCXJldHVybiAwOwogfQpAQCAtMTk5Miw3ICsxOTkyLDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhjaGlwLT5jYXJkLCAicmlwdGlkZSIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgNDA5Niwgc25kX3JpcHRpZGVfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCBzbmRfcmlwdGlkZV9wcm9jX3JlYWQpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbmRfcmlwdGlkZV9taXhlcihzdHJ1Y3Qgc25kX3JpcHRpZGUgKmNoaXApCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lMzIuYyBiL3NvdW5kL3BjaS9ybWUzMi5jCmluZGV4IDU1YjFkNDguLjJjYjlmZTkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWUzMi5jCisrKyBiL3NvdW5kL3BjaS9ybWUzMi5jCkBAIC0xMzY4LDE4ICsxMzY4LDE4IEBACiAJCXJldHVybiBlcnI7CiAJcm1lMzItPnBvcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocm1lMzItPnBjaSwgMCk7CiAKLQlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWUzMl9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCB8IFNBX1NISVJRLCAiUk1FMzIiLCAodm9pZCAqKSBybWUzMikpIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCXJtZTMyLT5pcnEgPSBwY2ktPmlycTsKLQogCWlmICgocm1lMzItPmlvYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShybWUzMi0+cG9ydCwgUk1FMzJfSU9fU0laRSkpID09IDApIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsCiAJCQkgICBybWUzMi0+cG9ydCwgcm1lMzItPnBvcnQgKyBSTUUzMl9JT19TSVpFIC0gMSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWlmIChyZXF1ZXN0X2lycShwY2ktPmlycSwgc25kX3JtZTMyX2ludGVycnVwdCwgU0FfSU5URVJSVVBUIHwgU0FfU0hJUlEsICJSTUUzMiIsICh2b2lkICopIHJtZTMyKSkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gZ3JhYiBJUlEgJWRcbiIsIHBjaS0+aXJxKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcm1lMzItPmlycSA9IHBjaS0+aXJxOworCiAJLyogcmVhZCB0aGUgY2FyZCdzIHJldmlzaW9uIG51bWJlciAqLwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgOCwgJnJtZTMyLT5yZXYpOwogCkBAIC0xNTc4LDcgKzE1NzgsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhybWUzMi0+Y2FyZCwgInJtZTMyIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBybWUzMiwgMTAyNCwgc25kX3JtZTMyX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgcm1lMzIsIHNuZF9ybWUzMl9wcm9jX3JlYWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2LmMgYi9zb3VuZC9wY2kvcm1lOTYuYwppbmRleCAzYzFiYzUzLi45OTFjYjE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTYuYworKysgYi9zb3VuZC9wY2kvcm1lOTYuYwpAQCAtMTE1MSw2ICsxMTUxLDI1IEBACiAJLm1hc2sgPSAwCiB9OwogCitzdGF0aWMgdm9pZAorcm1lOTZfc2V0X2J1ZmZlcl9zaXplX2NvbnN0cmFpbnQoc3RydWN0IHJtZTk2ICpybWU5NiwKKwkJCQkgc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywKKwkJCQkgICAgIFJNRTk2X0JVRkZFUl9TSVpFLCBSTUU5Nl9CVUZGRVJfU0laRSk7CisJaWYgKChzaXplID0gcm1lOTYtPnBsYXliYWNrX3BlcmlvZHNpemUpICE9IDAgfHwKKwkgICAgKHNpemUgPSBybWU5Ni0+Y2FwdHVyZV9wZXJpb2RzaXplKSAhPSAwKQorCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCisJCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywKKwkJCQkJICAgICBzaXplLCBzaXplKTsKKwllbHNlCisJCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsCisJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsCisJCQkJCSAgICZod19jb25zdHJhaW50c19wZXJpb2RfYnl0ZXMpOworfQorCiBzdGF0aWMgaW50CiBzbmRfcm1lOTZfcGxheWJhY2tfc3BkaWZfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKQEAgLTExODAsOCArMTE5OSw3IEBACiAgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9taW4gPSByYXRlOwogICAgICAgICAgICAgICAgIHJ1bnRpbWUtPmh3LnJhdGVfbWF4ID0gcmF0ZTsKIAl9ICAgICAgICAKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsIFNORFJWX1BDTV9IV19QQVJBTV9CVUZGRVJfQllURVMsIFJNRTk2X0JVRkZFUl9TSVpFLCBSTUU5Nl9CVUZGRVJfU0laRSk7Ci0Jc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9CWVRFUywgJmh3X2NvbnN0cmFpbnRzX3BlcmlvZF9ieXRlcyk7CisJcm1lOTZfc2V0X2J1ZmZlcl9zaXplX2NvbnN0cmFpbnQocm1lOTYsIHJ1bnRpbWUpOwogCiAJcm1lOTYtPndjcmVnX3NwZGlmX3N0cmVhbSA9IHJtZTk2LT53Y3JlZ19zcGRpZjsKIAlybWU5Ni0+c3BkaWZfY3RsLT52ZFswXS5hY2Nlc3MgJj0gflNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRTsKQEAgLTEyMTksOSArMTIzNyw3IEBACiAJcm1lOTYtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOwogCQotCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgUk1FOTZfQlVGRkVSX1NJWkUsIFJNRTk2X0JVRkZFUl9TSVpFKTsKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfcGVyaW9kX2J5dGVzKTsKLQorCXJtZTk2X3NldF9idWZmZXJfc2l6ZV9jb25zdHJhaW50KHJtZTk2LCBydW50aW1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI1NCw4ICsxMjcwLDcgQEAKICAgICAgICAgICAgICAgICBydW50aW1lLT5ody5yYXRlX21pbiA9IHJhdGU7CiAgICAgICAgICAgICAgICAgcnVudGltZS0+aHcucmF0ZV9tYXggPSByYXRlOwogCX0gICAgICAgIAotCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9CWVRFUywgUk1FOTZfQlVGRkVSX1NJWkUsIFJNRTk2X0JVRkZFUl9TSVpFKTsKLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLCAmaHdfY29uc3RyYWludHNfcGVyaW9kX2J5dGVzKTsKKwlybWU5Nl9zZXRfYnVmZmVyX3NpemVfY29uc3RyYWludChybWU5NiwgcnVudGltZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTEsOCArMTMwNiw3IEBACiAJcm1lOTYtPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwogCXNwaW5fdW5sb2NrX2lycSgmcm1lOTYtPmxvY2spOwogCi0Jc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLCBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX0JZVEVTLCBSTUU5Nl9CVUZGRVJfU0laRSwgUk1FOTZfQlVGRkVSX1NJWkUpOwotCXNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfQllURVMsICZod19jb25zdHJhaW50c19wZXJpb2RfYnl0ZXMpOworCXJtZTk2X3NldF9idWZmZXJfc2l6ZV9jb25zdHJhaW50KHJtZTk2LCBydW50aW1lKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTU2OSwxNyArMTU4MywxNyBAQAogCQlyZXR1cm4gZXJyOwogCXJtZTk2LT5wb3J0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHJtZTk2LT5wY2ksIDApOwogCisJaWYgKChybWU5Ni0+aW9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKHJtZTk2LT5wb3J0LCBSTUU5Nl9JT19TSVpFKSkgPT0gMCkgeworCQlzbmRfcHJpbnRrKEtFUk5fRVJSICJ1bmFibGUgdG8gcmVtYXAgbWVtb3J5IHJlZ2lvbiAweCVseC0weCVseFxuIiwgcm1lOTYtPnBvcnQsIHJtZTk2LT5wb3J0ICsgUk1FOTZfSU9fU0laRSAtIDEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlpZiAocmVxdWVzdF9pcnEocGNpLT5pcnEsIHNuZF9ybWU5Nl9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVHxTQV9TSElSUSwgIlJNRTk2IiwgKHZvaWQgKilybWU5NikpIHsKIAkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIGdyYWIgSVJRICVkXG4iLCBwY2ktPmlycSk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCXJtZTk2LT5pcnEgPSBwY2ktPmlycTsKIAotCWlmICgocm1lOTYtPmlvYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShybWU5Ni0+cG9ydCwgUk1FOTZfSU9fU0laRSkpID09IDApIHsKLQkJc25kX3ByaW50ayhLRVJOX0VSUiAidW5hYmxlIHRvIHJlbWFwIG1lbW9yeSByZWdpb24gMHglbHgtMHglbHhcbiIsIHJtZTk2LT5wb3J0LCBybWU5Ni0+cG9ydCArIFJNRTk2X0lPX1NJWkUgLSAxKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJLyogcmVhZCB0aGUgY2FyZCdzIHJldmlzaW9uIG51bWJlciAqLwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaSwgOCwgJnJtZTk2LT5yZXYpOwkKIAkKQEAgLTE4MDUsNyArMTgxOSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KHJtZTk2LT5jYXJkLCAicm1lOTYiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHJtZTk2LCAxMDI0LCBzbmRfcm1lOTZfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBybWU5Niwgc25kX3JtZTk2X3Byb2NfcmVhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwLmMKaW5kZXggNjFmODJmMC4uZWFmM2MyMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3JtZTk2NTIvaGRzcC5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3AuYwpAQCAtMzg5LDcgKzM4OSw3IEBACiAKIC8qIHVzZSBob3RwbHVnIGZpcm1lYXJlIGxvYWRlcj8gKi8KICNpZiBkZWZpbmVkKENPTkZJR19GV19MT0FERVIpIHx8IGRlZmluZWQoQ09ORklHX0ZXX0xPQURFUl9NT0RVTEUpCi0jaWZuZGVmIEhEU1BfVVNFX0hXREVQX0xPQURFUgorI2lmICFkZWZpbmVkKEhEU1BfVVNFX0hXREVQX0xPQURFUikgJiYgIWRlZmluZWQoQ09ORklHX1NORF9IRFNQKQogI2RlZmluZSBIRFNQX0ZXX0xPQURFUgogI2VuZGlmCiAjZW5kaWYKQEAgLTMxNjksOSArMzE2OSwxMCBAQAogCWNoYXIgKmNsb2NrX3NvdXJjZTsKIAlpbnQgeDsKIAotCWlmIChoZHNwX2NoZWNrX2Zvcl9pb2JveCAoaGRzcCkpCisJaWYgKGhkc3BfY2hlY2tfZm9yX2lvYm94IChoZHNwKSkgewogCQlzbmRfaXByaW50ZihidWZmZXIsICJObyBJL08gYm94IGNvbm5lY3RlZC5cblBsZWFzZSBjb25uZWN0IG9uZSBhbmQgdXBsb2FkIGZpcm13YXJlLlxuIik7CiAJCXJldHVybjsKKyAgICAgICAgfQogCiAJaWYgKGhkc3BfY2hlY2tfZm9yX2Zpcm13YXJlKGhkc3AsIDApKSB7CiAJCWlmIChoZHNwLT5zdGF0ZSAmIEhEU1BfRmlybXdhcmVDYWNoZWQpIHsKQEAgLTM0NzAsNyArMzQ3MSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGhkc3AtPmNhcmQsICJoZHNwIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwLCAxMDI0LCBzbmRfaGRzcF9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGhkc3AsIHNuZF9oZHNwX3Byb2NfcmVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNuZF9oZHNwX2ZyZWVfYnVmZmVycyhzdHJ1Y3QgaGRzcCAqaGRzcCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMgYi9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCmluZGV4IDcyMmI5ZTYuLmJiYTE2MTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKKysrIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwpAQCAtMjQ4OSw3ICsyNDg5LDcgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCFzbmRfY2FyZF9wcm9jX25ldyhoZHNwbS0+Y2FyZCwgImhkc3BtIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwgMTAyNCwKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBoZHNwbSwKIAkJCQkgICAgICBzbmRfaGRzcG1fcHJvY19yZWFkKTsKIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jIGIvc291bmQvcGNpL3JtZTk2NTIvcm1lOTY1Mi5jCmluZGV4IDc1ZDY0MDYuLjNiOTQ1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9ybWU5NjUyL3JtZTk2NTIuYworKysgYi9zb3VuZC9wY2kvcm1lOTY1Mi9ybWU5NjUyLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyBpbnQgaW5kZXhbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9JRFg7CS8qIEluZGV4IDAtTUFYICovCiBzdGF0aWMgY2hhciAqaWRbU05EUlZfQ0FSRFNdID0gU05EUlZfREVGQVVMVF9TVFI7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KIHN0YXRpYyBpbnQgZW5hYmxlW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfRU5BQkxFX1BOUDsJLyogRW5hYmxlIHRoaXMgY2FyZCAqLwotc3RhdGljIGludCBwcmVjaXNlX3B0cltTTkRSVl9DQVJEU10gPSB7IFswIC4uLiAoU05EUlZfQ0FSRFMtMSldID0gMCB9OyAvKiBFbmFibGUgcHJlY2lzZSBwb2ludGVyICovCitzdGF0aWMgaW50IHByZWNpc2VfcHRyW1NORFJWX0NBUkRTXTsJCQkvKiBFbmFibGUgcHJlY2lzZSBwb2ludGVyICovCiAKIG1vZHVsZV9wYXJhbV9hcnJheShpbmRleCwgaW50LCBOVUxMLCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kZXgsICJJbmRleCB2YWx1ZSBmb3IgUk1FIERpZ2k5NjUyIChIYW1tZXJmYWxsKSBzb3VuZGNhcmQuIik7CkBAIC0xNzg3LDcgKzE3ODcsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhybWU5NjUyLT5jYXJkLCAicm1lOTY1MiIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgcm1lOTY1MiwgMTAyNCwgc25kX3JtZTk2NTJfcHJvY19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBybWU5NjUyLCBzbmRfcm1lOTY1Ml9wcm9jX3JlYWQpOwogfQogCiBzdGF0aWMgdm9pZCBzbmRfcm1lOTY1Ml9mcmVlX2J1ZmZlcnMoc3RydWN0IHNuZF9ybWU5NjUyICpybWU5NjUyKQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3NvbmljdmliZXMuYyBiL3NvdW5kL3BjaS9zb25pY3ZpYmVzLmMKaW5kZXggOTFmOGJmMy4uZGNmNDAyOSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3NvbmljdmliZXMuYworKysgYi9zb3VuZC9wY2kvc29uaWN2aWJlcy5jCkBAIC01NCw4ICs1NCw4IEBACiBzdGF0aWMgaW50IGluZGV4W1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfSURYOwkvKiBJbmRleCAwLU1BWCAqLwogc3RhdGljIGNoYXIgKmlkW1NORFJWX0NBUkRTXSA9IFNORFJWX0RFRkFVTFRfU1RSOwkvKiBJRCBmb3IgdGhpcyBjYXJkICovCiBzdGF0aWMgaW50IGVuYWJsZVtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0VOQUJMRV9QTlA7CS8qIEVuYWJsZSB0aGlzIGNhcmQgKi8KLXN0YXRpYyBpbnQgcmV2ZXJiW1NORFJWX0NBUkRTXSA9IHtbMCAuLi4gKFNORFJWX0NBUkRTIC0gMSldID0gMH07Ci1zdGF0aWMgaW50IG1nZVtTTkRSVl9DQVJEU10gPSB7WzAgLi4uIChTTkRSVl9DQVJEUyAtIDEpXSA9IDB9Oworc3RhdGljIGludCByZXZlcmJbU05EUlZfQ0FSRFNdOworc3RhdGljIGludCBtZ2VbU05EUlZfQ0FSRFNdOwogc3RhdGljIHVuc2lnbmVkIGludCBkbWFpbyA9IDB4N2EwMDsJLyogRERNQSBpL28gYWRkcmVzcyAqLwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaW5kZXgsIGludCwgTlVMTCwgMDQ0NCk7CkBAIC0xMTQ0LDcgKzExNDQsNyBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhzb25pYy0+Y2FyZCwgInNvbmljdmliZXMiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHNvbmljLCAxMDI0LCBzbmRfc29uaWN2aWJlc19wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHNvbmljLCBzbmRfc29uaWN2aWJlc19wcm9jX3JlYWQpOwogfQogCiAvKgpAQCAtMTQ1Niw3ICsxNDU2LDcgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAJaWYgKChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19TT05JQ1ZJQkVTLAotCQkJCSAgICAgICBzb25pYy0+bWlkaV9wb3J0LCAxLAorCQkJCSAgICAgICBzb25pYy0+bWlkaV9wb3J0LCBNUFU0MDFfSU5GT19JTlRFR1JBVEVELAogCQkJCSAgICAgICBzb25pYy0+aXJxLCAwLAogCQkJCSAgICAgICAmbWlkaV91YXJ0KSkgPCAwKSB7CiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50LmMKaW5kZXggOTYyNGE1Zi4uNTYyOWI3ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudC5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnQuYwpAQCAtMTQ4LDcgKzE0OCw4IEBACiAJfQogCWlmICh0cmlkZW50LT5kZXZpY2UgIT0gVFJJREVOVF9ERVZJQ0VfSURfU0k3MDE4ICYmCiAJICAgIChlcnIgPSBzbmRfbXB1NDAxX3VhcnRfbmV3KGNhcmQsIDAsIE1QVTQwMV9IV19UUklENERXQVZFLAotCQkJCSAgICAgICB0cmlkZW50LT5taWRpX3BvcnQsIDEsCisJCQkJICAgICAgIHRyaWRlbnQtPm1pZGlfcG9ydCwKKwkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKIAkJCQkgICAgICAgdHJpZGVudC0+aXJxLCAwLCAmdHJpZGVudC0+cm1pZGkpKSA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWFpbi5jIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKaW5kZXggNTIxNzhiOC4uZDk5ZWQ3MiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tYWluLmMKQEAgLTMwNiw2ICszMDYsOCBAQAogCW91dGwobWFzaywgVFJJRF9SRUcodHJpZGVudCwgcmVnKSk7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3RyaWRlbnRfc3RhcnRfdm9pY2UpOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdm9pZCBzbmRfdHJpZGVudF9zdG9wX3ZvaWNlKHN0cnVjdCBzbmRfdHJpZGVudCAqIHRyaWRlbnQsIHVuc2lnbmVkIGludCB2b2ljZSkKIApAQCAtMzI4LDYgKzMzMCw4IEBACiAJb3V0bChtYXNrLCBUUklEX1JFRyh0cmlkZW50LCByZWcpKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zdG9wX3ZvaWNlKTsKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBpbnQgc25kX3RyaWRlbnRfYWxsb2NhdGVfcGNtX2NoYW5uZWwoc3RydWN0IHNuZF90cmlkZW50ICp0cmlkZW50KQogICAKQEAgLTUwMiw2ICs1MDYsOCBAQAogI2VuZGlmCiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3RyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyk7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBzbmRfdHJpZGVudF93cml0ZV9jc29fcmVnCiAgIApAQCAtMzMzMiw3ICszMzM4LDcgQEAKIAlpZiAodHJpZGVudC0+ZGV2aWNlID09IFRSSURFTlRfREVWSUNFX0lEX1NJNzAxOCkKIAkJcyA9ICJzaXM3MDE4IjsKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyh0cmlkZW50LT5jYXJkLCBzLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIHRyaWRlbnQsIDEwMjQsIHNuZF90cmlkZW50X3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgdHJpZGVudCwgc25kX3RyaWRlbnRfcHJvY19yZWFkKTsKIH0KIAogc3RhdGljIGludCBzbmRfdHJpZGVudF9kZXZfZnJlZShzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQpAQCAtMzg4NCw2ICszODkwLDggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9hbGxvY192b2ljZSk7CisKIHZvaWQgc25kX3RyaWRlbnRfZnJlZV92b2ljZShzdHJ1Y3Qgc25kX3RyaWRlbnQgKiB0cmlkZW50LCBzdHJ1Y3Qgc25kX3RyaWRlbnRfdm9pY2UgKnZvaWNlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zOTEyLDYgKzM5MjAsOCBAQAogCQlwcml2YXRlX2ZyZWUodm9pY2UpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X2ZyZWVfdm9pY2UpOworCiBzdGF0aWMgdm9pZCBzbmRfdHJpZGVudF9jbGVhcl92b2ljZXMoc3RydWN0IHNuZF90cmlkZW50ICogdHJpZGVudCwgdW5zaWduZWQgc2hvcnQgdl9taW4sIHVuc2lnbmVkIHNob3J0IHZfbWF4KQogewogCXVuc2lnbmVkIGludCBpLCB2YWwsIG1hc2tbMl0gPSB7IDAsIDAgfTsKQEAgLTM5OTMsMTMgKzQwMDMsMyBAQAogCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi1FWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X2FsbG9jX3ZvaWNlKTsKLUVYUE9SVF9TWU1CT0woc25kX3RyaWRlbnRfZnJlZV92b2ljZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N0YXJ0X3ZvaWNlKTsKLUVYUE9SVF9TWU1CT0woc25kX3RyaWRlbnRfc3RvcF92b2ljZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3MpOwotLyogdHJpZGVudF9tZW1vcnkuYyBzeW1ib2xzICovCi1FWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N5bnRoX2FsbG9jKTsKLUVYUE9SVF9TWU1CT0woc25kX3RyaWRlbnRfc3ludGhfZnJlZSk7Ci1FWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N5bnRoX2NvcHlfZnJvbV91c2VyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWVtb3J5LmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X21lbW9yeS5jCmluZGV4IDQ2YzY5ODIuLmFmZjNmODcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfbWVtb3J5LmMKKysrIGIvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9tZW1vcnkuYwpAQCAtMzQ5LDYgKzM0OSw3IEBACiAJcmV0dXJuIGJsazsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zeW50aF9hbGxvYyk7CiAKIC8qCiAgKiBmcmVlIGEgc3ludGggc2FtcGxlIGFyZWEKQEAgLTM2NSw2ICszNjYsNyBAQAogCXJldHVybiAwOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF90cmlkZW50X3N5bnRoX2ZyZWUpOwogCiAvKgogICogcmVzZXQgVExCIGVudHJ5IGFuZCBmcmVlIGtlcm5lbCBwYWdlCkBAIC00ODYsMyArNDg4LDQgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfdHJpZGVudF9zeW50aF9jb3B5X2Zyb21fdXNlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X3N5bnRoLmMgYi9zb3VuZC9wY2kvdHJpZGVudC90cmlkZW50X3N5bnRoLmMKaW5kZXggY2M3YWY4Yi4uOWI3ZGVlOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL3RyaWRlbnQvdHJpZGVudF9zeW50aC5jCisrKyBiL3NvdW5kL3BjaS90cmlkZW50L3RyaWRlbnRfc3ludGguYwpAQCAtOTE0LDcgKzkxNCw5IEBACiAJCQkJCQkgICAmY2FsbGJhY2tzLAogCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfQ0FQX1dSSVRFIHwgU05EUlZfU0VRX1BPUlRfQ0FQX1NVQlNfV1JJVEUsCiAJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9UWVBFX0RJUkVDVF9TQU1QTEUgfAotCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USCwKKwkJCQkJCSAgIFNORFJWX1NFUV9QT1JUX1RZUEVfU1lOVEggfAorCQkJCQkJICAgU05EUlZfU0VRX1BPUlRfVFlQRV9IQVJEV0FSRSB8CisJCQkJCQkgICBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRIRVNJWkVSLAogCQkJCQkJICAgMTYsIDAsCiAJCQkJCQkgICBuYW1lKTsKIAlpZiAocC0+Y2hzZXQtPnBvcnQgPCAwKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvdmlhODJ4eC5jIGIvc291bmQvcGNpL3ZpYTgyeHguYwppbmRleCAzOWRhZjYyLi4yNTI3YmJkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvdmlhODJ4eC5jCisrKyBiL3NvdW5kL3BjaS92aWE4Mnh4LmMKQEAgLTE3NzUsNiArMTc3NSwxMiBAQAogCQkubmFtZSA9ICJUYXJnYSBUcmF2ZWxsZXIgODExIiwKIAkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWSwKIAl9LAorCXsKKwkJLnN1YnZlbmRvciA9IDB4MTYxZiwKKwkJLnN1YmRldmljZSA9IDB4MjAzMiwKKwkJLm5hbWUgPSAibTY4MHgiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZLCAvKiBodHRwOi8vbGF1bmNocGFkLm5ldC9idWdzLzM4NTQ2ICovCisJfSwKIAl7IH0gLyogdGVybWluYXRvciAqLwogfTsKIApAQCAtMTk3Myw3ICsxOTc5LDcgQEAKIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2hpcC0+cGNpLCBWSUFfUE5QX0NPTlRST0wsIGxlZ2FjeV9jZmcpOwogCWlmIChjaGlwLT5tcHVfcmVzKSB7CiAJCWlmIChzbmRfbXB1NDAxX3VhcnRfbmV3KGNoaXAtPmNhcmQsIDAsIE1QVTQwMV9IV19WSUE2ODZBLAotCQkJCQltcHVfcG9ydCwgMSwKKwkJCQkJbXB1X3BvcnQsIE1QVTQwMV9JTkZPX0lOVEVHUkFURUQsCiAJCQkJCWNoaXAtPmlycSwgMCwgJmNoaXAtPnJtaWRpKSA8IDApIHsKIAkJCXByaW50ayhLRVJOX1dBUk5JTkcgInVuYWJsZSB0byBpbml0aWFsaXplIE1QVS00MDEiCiAJCQkgICAgICAgIiBhdCAweCVseCwgc2tpcHBpbmdcbiIsIG1wdV9wb3J0KTsKQEAgLTIwMTUsNyArMjAyMSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJ2aWE4Mnh4IiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBzbmRfdmlhODJ4eF9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF92aWE4Mnh4X3Byb2NfcmVhZCk7CiB9CiAKIC8qCkBAIC0yMzY1LDcgKzIzNzEsNyBAQAogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDA0NzAsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBNU0kgS1Q4ODAgRGVsdGEtRlNSICovCiAJCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4MzgwMCwgLmFjdGlvbiA9IFZJQV9EWFNfRU5BQkxFIH0sIC8qIE1TSSBLVDI2NiAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDU5MDEsIC5hY3Rpb24gPSBWSUFfRFhTX05PX1ZSQSB9LCAvKiBNU0kgS1Q2IERlbHRhLVNSICovCi0JCXsgLnN1YnZlbmRvciA9IDB4MTQ2MiwgLnN1YmRldmljZSA9IDB4NzAyMywgLmFjdGlvbiA9IFZJQV9EWFNfTk9fVlJBIH0sIC8qIE1TSSBLOFQgTmVvMi1GSSAqLworCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweDcwMjMsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBNU0kgSzhUIE5lbzItRkkgKi8KIAkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTIwLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEtUNFYgKi8KIAkJeyAuc3VidmVuZG9yID0gMHgxNDYyLCAuc3ViZGV2aWNlID0gMHg3MTQyLCAuYWN0aW9uID0gVklBX0RYU19FTkFCTEUgfSwgLyogTVNJIEs4TU0tViAqLwogCQl7IC5zdWJ2ZW5kb3IgPSAweDE0NjIsIC5zdWJkZXZpY2UgPSAweGIwMTIsIC5hY3Rpb24gPSBWSUFfRFhTX1NSQyB9LCAvKiBQNE04MDAvVklBODIzN1IgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMgYi9zb3VuZC9wY2kvdmlhODJ4eF9tb2RlbS5jCmluZGV4IGVmOTdlNTAuLjU3N2EyYjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4X21vZGVtLmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHhfbW9kZW0uYwpAQCAtOTI5LDcgKzkyOSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJ2aWE4Mnh4IiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBzbmRfdmlhODJ4eF9wcm9jX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF92aWE4Mnh4X3Byb2NfcmVhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2kuYwppbmRleCA2NWViZjVmLi4yNmFhNzc1IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaS5jCisrKyBiL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpLmMKQEAgLTMwOCw3ICszMDgsOCBAQAogCX0KIAlpZiAoY2hpcC0+bXB1X3JlcykgewogCQlpZiAoKGVyciA9IHNuZF9tcHU0MDFfdWFydF9uZXcoY2FyZCwgMCwgTVBVNDAxX0hXX1lNRlBDSSwKLQkJCQkJICAgICAgIG1wdV9wb3J0W2Rldl0sIDEsCisJCQkJCSAgICAgICBtcHVfcG9ydFtkZXZdLAorCQkJCQkgICAgICAgTVBVNDAxX0lORk9fSU5URUdSQVRFRCwKIAkJCQkJICAgICAgIHBjaS0+aXJxLCAwLCAmY2hpcC0+cmF3bWlkaSkpIDwgMCkgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAieW1mcGNpOiBjYW5ub3QgaW5pdGlhbGl6ZSBNUFU0MDEgYXQgMHglbHgsIHNraXBwaW5nLi4uXG4iLCBtcHVfcG9ydFtkZXZdKTsKIAkJCWxlZ2FjeV9jdHJsICY9IH5ZTUZQQ0lfTEVHQUNZX01JRU47IC8qIGRpc2FibGUgTVBVNDAxIGlycSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jIGIvc291bmQvcGNpL3ltZnBjaS95bWZwY2lfbWFpbi5jCmluZGV4IDhhYzVhYjUuLmY4OTQ3NTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS95bWZwY2kveW1mcGNpX21haW4uYworKysgYi9zb3VuZC9wY2kveW1mcGNpL3ltZnBjaV9tYWluLmMKQEAgLTE5MTksNyArMTkxOSw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAkKIAlpZiAoISBzbmRfY2FyZF9wcm9jX25ldyhjYXJkLCAieW1mcGNpIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBzbmRfeW1mcGNpX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgc25kX3ltZnBjaV9wcm9jX3JlYWQpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZl9jb3JlLmMgYi9zb3VuZC9wY21jaWEvcGRhdWRpb2NmL3BkYXVkaW9jZl9jb3JlLmMKaW5kZXggYmQwZDcwZi4uMWRmZTI5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNtY2lhL3BkYXVkaW9jZi9wZGF1ZGlvY2ZfY29yZS5jCisrKyBiL3NvdW5kL3BjbWNpYS9wZGF1ZGlvY2YvcGRhdWRpb2NmX2NvcmUuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeTsKIAogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNoaXAtPmNhcmQsICJwZGF1ZGlvY2YiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIDEwMjQsIHBkYWNmX3Byb2NfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgcGRhY2ZfcHJvY19yZWFkKTsKIH0KIAogc3RydWN0IHNuZF9wZGFjZiAqc25kX3BkYWNmX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwX29wcy5jIGIvc291bmQvcGNtY2lhL3Z4L3Z4cF9vcHMuYwppbmRleCA3ZjgyZjYxLi4xZWUwOTE4IDEwMDY0NAotLS0gYS9zb3VuZC9wY21jaWEvdngvdnhwX29wcy5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBfb3BzLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCWMgfD0gKGludCl2eF9pbmIoY2hpcCwgUlhNKSA8PCA4OwogCWMgfD0gdnhfaW5iKGNoaXAsIFJYTCk7CiAKLQlzbmRfcHJpbnRkZChLRVJOX0RFQlVHICJ4aWxpbng6IGRzcCBzaXplIHJlY2VpdmVkIDB4JXgsIG9yaWcgMHgleFxuIiwgYywgZnctPnNpemUpOworCXNuZF9wcmludGRkKEtFUk5fREVCVUcgInhpbGlueDogZHNwIHNpemUgcmVjZWl2ZWQgMHgleCwgb3JpZyAweCVaeFxuIiwgYywgZnctPnNpemUpOwogCiAJdnhfb3V0YihjaGlwLCBJQ1IsIElDUl9IRjApOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY21jaWEvdngvdnhwb2NrZXQuYyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCmluZGV4IDdlMGNkYTIuLmNhZmU2NjQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCisrKyBiL3NvdW5kL3BjbWNpYS92eC92eHBvY2tldC5jCkBAIC0yNjEsNyArMjYxLDcgQEAKIAogCWxpbmstPmRldl9ub2RlID0gJnZ4cC0+bm9kZTsKIAlrZnJlZShwYXJzZSk7Ci0JcmV0dXJuIDk7CisJcmV0dXJuIDA7CiAKIGNzX2ZhaWxlZDoKIAljc19lcnJvcihsaW5rLCBsYXN0X2ZuLCBsYXN0X3JldCk7CmRpZmYgLS1naXQgYS9zb3VuZC9wcGMvTWFrZWZpbGUgYi9zb3VuZC9wcGMvTWFrZWZpbGUKaW5kZXggZDZiYTk5NS4uNGQ5NWM2NSAxMDA2NDQKLS0tIGEvc291bmQvcHBjL01ha2VmaWxlCisrKyBiL3NvdW5kL3BwYy9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKICMgQ29weXJpZ2h0IChjKSAyMDAxIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KICMKIAotc25kLXBvd2VybWFjLW9ianMgOj0gcG93ZXJtYWMubyBwbWFjLm8gYXdhY3MubyBidXJndW5keS5vIGRhY2EubyB0dW1ibGVyLm8gdG9vbmllLm8ga2V5d2VzdC5vIGJlZXAubworc25kLXBvd2VybWFjLW9ianMgOj0gcG93ZXJtYWMubyBwbWFjLm8gYXdhY3MubyBidXJndW5keS5vIGRhY2EubyB0dW1ibGVyLm8ga2V5d2VzdC5vIGJlZXAubwogCiAjIFRvcGxldmVsIE1vZHVsZSBEZXBlbmRlbmN5CiBvYmotJChDT05GSUdfU05EX1BPV0VSTUFDKSArPSBzbmQtcG93ZXJtYWMubwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3BtYWMuYyBiL3NvdW5kL3BwYy9wbWFjLmMKaW5kZXggZjA3OTRlZi4uYjY3ODgxNCAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3BtYWMuYworKysgYi9zb3VuZC9wcGMvcG1hYy5jCkBAIC04NjcsOCArODY3LDYgQEAKIAl1bnNpZ25lZCBpbnQgKnByb3AsIGw7CiAJc3RydWN0IG1hY2lvX2NoaXAqIG1hY2lvOwogCi0JdTMyIGxheW91dF9pZCA9IDA7Ci0KIAlpZiAoIW1hY2hpbmVfaXMocG93ZXJtYWMpKQogCQlyZXR1cm4gLUVOT0RFVjsKIApAQCAtOTI5LDggKzkyNywxNCBAQAogCWlmIChwcm9wICYmICpwcm9wIDwgMTYpCiAJCWNoaXAtPnN1YmZyYW1lID0gKnByb3A7CiAJcHJvcCA9ICh1bnNpZ25lZCBpbnQgKikgZ2V0X3Byb3BlcnR5KHNvdW5kLCAibGF5b3V0LWlkIiwgTlVMTCk7Ci0JaWYgKHByb3ApCi0JCWxheW91dF9pZCA9ICpwcm9wOworCWlmIChwcm9wKSB7CisJCS8qIHBhcnRseSBkZXByZWNhdGUgc25kLXBvd2VybWFjLCBmb3IgdGhvc2UgbWFjaGluZXMKKwkJICogdGhhdCBoYXZlIGEgbGF5b3V0LWlkIHByb3BlcnR5IGZvciBub3cgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAic25kLXBvd2VybWFjIG5vIGxvbmdlciBoYW5kbGVzIGFueSAiCisJCQkJICJtYWNoaW5lcyB3aXRoIGEgbGF5b3V0LWlkIHByb3BlcnR5ICIKKwkJCQkgImluIHRoZSBkZXZpY2UtdHJlZSwgdXNlIHNuZC1hb2EuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCS8qIFRoaXMgc2hvdWxkIGJlIHZlcmlmaWVkIG9uIG9sZGVyIHNjcmVhbWVycyAqLwogCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShzb3VuZCwgInNjcmVhbWVyIikpIHsKIAkJY2hpcC0+bW9kZWwgPSBQTUFDX1NDUkVBTUVSOwpAQCAtOTYzLDM4ICs5NjcsNiBAQAogCQljaGlwLT5mcmVxX3RhYmxlID0gdHVtYmxlcl9mcmVxczsKIAkJY2hpcC0+Y29udHJvbF9tYXNrID0gTUFTS19JRVBDIHwgMHgxMTsgLyogZGlzYWJsZSBJRUUgKi8KIAl9Ci0JaWYgKGRldmljZV9pc19jb21wYXRpYmxlKHNvdW5kLCAiQU9BS2V5bGFyZ28iKSB8fAotCSAgICBkZXZpY2VfaXNfY29tcGF0aWJsZShzb3VuZCwgIkFPQWJhc2UiKSB8fAotCSAgICBkZXZpY2VfaXNfY29tcGF0aWJsZShzb3VuZCwgIkFPQUsyIikpIHsKLQkJLyogRm9yIG5vdywgb25seSBzdXBwb3J0IHZlcnkgYmFzaWMgVEFTMzAwNCBiYXNlZCBtYWNoaW5lcyB3aXRoCi0JCSAqIHNpbmdsZSBmcmVxdWVuY3kgdW50aWwgcHJvcGVyIGkycyBjb250cm9sIGlzIGltcGxlbWVudGVkCi0JCSAqLwotCQlzd2l0Y2gobGF5b3V0X2lkKSB7Ci0JCWNhc2UgMHgyNDoKLQkJY2FzZSAweDI5OgotCQljYXNlIDB4MzM6Ci0JCWNhc2UgMHg0NjoKLQkJY2FzZSAweDQ4OgotCQljYXNlIDB4NTA6Ci0JCWNhc2UgMHg1YzoKLQkJCWNoaXAtPm51bV9mcmVxcyA9IEFSUkFZX1NJWkUodHVtYmxlcl9mcmVxcyk7Ci0JCQljaGlwLT5tb2RlbCA9IFBNQUNfU05BUFBFUjsKLQkJCWNoaXAtPmNhbl9ieXRlX3N3YXAgPSAwOyAvKiBGSVhNRTogY2hlY2sgdGhpcyAqLwotCQkJY2hpcC0+Y29udHJvbF9tYXNrID0gTUFTS19JRVBDIHwgMHgxMTsvKiBkaXNhYmxlIElFRSAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgMHgzYToKLQkJCWNoaXAtPm51bV9mcmVxcyA9IEFSUkFZX1NJWkUodHVtYmxlcl9mcmVxcyk7Ci0JCQljaGlwLT5tb2RlbCA9IFBNQUNfVE9PTklFOwotCQkJY2hpcC0+Y2FuX2J5dGVfc3dhcCA9IDA7IC8qIEZJWE1FOiBjaGVjayB0aGlzICovCi0JCQljaGlwLT5jb250cm9sX21hc2sgPSBNQVNLX0lFUEMgfCAweDExOy8qIGRpc2FibGUgSUVFICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAic25kOiBVbmtub3duIGxheW91dCBJRCAweCV4XG4iLAotCQkJICAgICAgIGxheW91dF9pZCk7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQotCQl9Ci0JfQogCXByb3AgPSAodW5zaWduZWQgaW50ICopZ2V0X3Byb3BlcnR5KHNvdW5kLCAiZGV2aWNlLWlkIiwgTlVMTCk7CiAJaWYgKHByb3ApCiAJCWNoaXAtPmRldmljZV9pZCA9ICpwcm9wOwpkaWZmIC0tZ2l0IGEvc291bmQvcHBjL3BtYWMuaCBiL3NvdW5kL3BwYy9wbWFjLmgKaW5kZXggM2E5YmQ0ZC4uODM5NGU2NiAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3BtYWMuaAorKysgYi9zb3VuZC9wcGMvcG1hYy5oCkBAIC04NSw3ICs4NSw3IEBACiAKIGVudW0gc25kX3BtYWNfbW9kZWwgewogCVBNQUNfQVdBQ1MsIFBNQUNfU0NSRUFNRVIsIFBNQUNfQlVSR1VORFksIFBNQUNfREFDQSwgUE1BQ19UVU1CTEVSLAotCVBNQUNfU05BUFBFUiwgUE1BQ19UT09OSUUKKwlQTUFDX1NOQVBQRVIKIH07CiAKIHN0cnVjdCBzbmRfcG1hYyB7CkBAIC0xODgsNyArMTg4LDYgQEAKIGludCBzbmRfcG1hY19kYWNhX2luaXQoc3RydWN0IHNuZF9wbWFjICpjaGlwKTsKIGludCBzbmRfcG1hY190dW1ibGVyX2luaXQoc3RydWN0IHNuZF9wbWFjICpjaGlwKTsKIGludCBzbmRfcG1hY190dW1ibGVyX3Bvc3RfaW5pdCh2b2lkKTsKLWludCBzbmRfcG1hY190b29uaWVfaW5pdChzdHJ1Y3Qgc25kX3BtYWMgKmNoaXApOwogCiAvKiBpMmMgZnVuY3Rpb25zICovCiBzdHJ1Y3QgcG1hY19rZXl3ZXN0IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy9wb3dlcm1hYy5jIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKaW5kZXggZjQ5MDJhMi4uZmE5YTQ0YSAxMDA2NDQKLS0tIGEvc291bmQvcHBjL3Bvd2VybWFjLmMKKysrIGIvc291bmQvcHBjL3Bvd2VybWFjLmMKQEAgLTk0LDEzICs5NCw2IEBACiAJCWlmICggc25kX3BtYWNfdHVtYmxlcl9pbml0KGNoaXApIDwgMCB8fCBzbmRfcG1hY190dW1ibGVyX3Bvc3RfaW5pdCgpIDwgMCkKIAkJCWdvdG8gX19lcnJvcjsKIAkJYnJlYWs7Ci0JY2FzZSBQTUFDX1RPT05JRToKLQkJc3RyY3B5KGNhcmQtPmRyaXZlciwgIlBNYWMgVG9vbmllIik7Ci0JCXN0cmNweShjYXJkLT5zaG9ydG5hbWUsICJQb3dlck1hYyBUb29uaWUiKTsKLQkJc3RyY3B5KGNhcmQtPmxvbmduYW1lLCBjYXJkLT5zaG9ydG5hbWUpOwotCQlpZiAoKGVyciA9IHNuZF9wbWFjX3Rvb25pZV9pbml0KGNoaXApKSA8IDApCi0JCQlnb3RvIF9fZXJyb3I7Ci0JCWJyZWFrOwogCWNhc2UgUE1BQ19BV0FDUzoKIAljYXNlIFBNQUNfU0NSRUFNRVI6CiAJCW5hbWVfZXh0ID0gY2hpcC0+bW9kZWwgPT0gUE1BQ19TQ1JFQU1FUiA/ICJTY3JlYW1lciIgOiAiQVdBQ1MiOwpAQCAtMTg4LDExICsxODEsMTUgQEAKIAlpZiAoKGVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc25kX3BtYWNfZHJpdmVyKSkgPCAwKQogCQlyZXR1cm4gZXJyOwogCWRldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoU05EX1BNQUNfRFJJVkVSLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihkZXZpY2UpKSB7Ci0JCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmRfcG1hY19kcml2ZXIpOwotCQlyZXR1cm4gUFRSX0VSUihkZXZpY2UpOwotCX0KLQlyZXR1cm4gMDsKKwlpZiAoIUlTX0VSUihkZXZpY2UpKSB7CisJCWlmIChwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXZpY2UpKQorCQkJcmV0dXJuIDA7CisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGRldmljZSk7CisJCWVyciA9IC1FTk9ERVY7CisJfSBlbHNlCisJCWVyciA9IFBUUl9FUlIoZGV2aWNlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25kX3BtYWNfZHJpdmVyKTsKKwlyZXR1cm4gZXJyOwogCiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BwYy90b29uaWUuYyBiL3NvdW5kL3BwYy90b29uaWUuYwppbmRleCAxYWM3Yzg1Li5lNjlkZTI5IDEwMDY0NAotLS0gYS9zb3VuZC9wcGMvdG9vbmllLmMKKysrIGIvc291bmQvcHBjL3Rvb25pZS5jCkBAIC0xLDM3OCArMCwwIEBACi0vKgotICogTWFjIE1pbmkgInRvb25pZSIgbWl4ZXIgY29udHJvbAotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSBieSBCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc+Ci0gKgotICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQotICovCi0KLSNpbmNsdWRlIDxzb3VuZC9kcml2ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KLSNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+Ci0jaW5jbHVkZSAicG1hYy5oIgotCi0jdW5kZWYgREVCVUcKLQotI2lmZGVmIERFQlVHCi0jZGVmaW5lIERCRyhmbXQuLi4pIHByaW50ayhmbXQpCi0jZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKQotI2VuZGlmCi0KLXN0cnVjdCBwbWFjX2dwaW8gewotCXVuc2lnbmVkIGludCBhZGRyOwotCXU4IGFjdGl2ZV92YWw7Ci0JdTggaW5hY3RpdmVfdmFsOwotCXU4IGFjdGl2ZV9zdGF0ZTsKLX07Ci0KLXN0cnVjdCBwbWFjX3Rvb25pZQotewotCXN0cnVjdCBwbWFjX2dwaW8JaHBfZGV0ZWN0X2dwaW87Ci0Jc3RydWN0IHBtYWNfZ3BpbwlocF9tdXRlX2dwaW87Ci0Jc3RydWN0IHBtYWNfZ3BpbwlhbXBfbXV0ZV9ncGlvOwotCWludAkJCWhwX2RldGVjdF9pcnE7Ci0JaW50CQkJYXV0b19tdXRlX25vdGlmeTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QJZGV0ZWN0X3dvcms7Ci19OwotCi0KLS8qCi0gKiBncGlvIGFjY2VzcwotICovCi0jZGVmaW5lIGRvX2dwaW9fd3JpdGUoZ3AsIHZhbCkgXAotCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIChncCktPmFkZHIsIHZhbCkKLSNkZWZpbmUgZG9fZ3Bpb19yZWFkKGdwKSBcCi0JcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLCAoZ3ApLT5hZGRyLCAwKQotI2RlZmluZSB0dW1ibGVyX2dwaW9fZnJlZShncCkgLyogTk9QICovCi0KLXN0YXRpYyB2b2lkIHdyaXRlX2F1ZGlvX2dwaW8oc3RydWN0IHBtYWNfZ3BpbyAqZ3AsIGludCBhY3RpdmUpCi17Ci0JaWYgKCEgZ3AtPmFkZHIpCi0JCXJldHVybjsKLQlhY3RpdmUgPSBhY3RpdmUgPyBncC0+YWN0aXZlX3ZhbCA6IGdwLT5pbmFjdGl2ZV92YWw7Ci0JZG9fZ3Bpb193cml0ZShncCwgYWN0aXZlKTsKLQlEQkcoIihJKSBncGlvICV4IHdyaXRlICVkXG4iLCBncC0+YWRkciwgYWN0aXZlKTsKLX0KLQotc3RhdGljIGludCBjaGVja19hdWRpb19ncGlvKHN0cnVjdCBwbWFjX2dwaW8gKmdwKQotewotCWludCByZXQ7Ci0KLQlpZiAoISBncC0+YWRkcikKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBkb19ncGlvX3JlYWQoZ3ApOwotCi0JcmV0dXJuIChyZXQgJiAweGQpID09IChncC0+YWN0aXZlX3ZhbCAmIDB4ZCk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9hdWRpb19ncGlvKHN0cnVjdCBwbWFjX2dwaW8gKmdwKQotewotCWludCByZXQ7Ci0JaWYgKCEgZ3AtPmFkZHIpCi0JCXJldHVybiAwOwotCXJldCA9ICgoZG9fZ3Bpb19yZWFkKGdwKSAmIDB4MDIpICE9MCk7Ci0JcmV0dXJuIHJldCA9PSBncC0+YWN0aXZlX3N0YXRlOwotfQotCi0KLWVudW0geyBUT09OSUVfTVVURV9IUCwgVE9PTklFX01VVEVfQU1QIH07Ci0KLXN0YXRpYyBpbnQgdG9vbmllX2dldF9tdXRlX3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfcG1hYyAqY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKLQlzdHJ1Y3QgcG1hY190b29uaWUgKm1peCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc3RydWN0IHBtYWNfZ3BpbyAqZ3A7Ci0KLQlpZiAobWl4ID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCXN3aXRjaChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgewotCWNhc2UgVE9PTklFX01VVEVfSFA6Ci0JCWdwID0gJm1peC0+aHBfbXV0ZV9ncGlvOwotCQlicmVhazsKLQljYXNlIFRPT05JRV9NVVRFX0FNUDoKLQkJZ3AgPSAmbWl4LT5hbXBfbXV0ZV9ncGlvOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAhY2hlY2tfYXVkaW9fZ3BpbyhncCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdG9vbmllX3B1dF9tdXRlX3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQkgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3BtYWMgKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHBtYWNfdG9vbmllICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwotCXN0cnVjdCBwbWFjX2dwaW8gKmdwOwotCWludCB2YWw7Ci0KLQlpZiAoY2hpcC0+dXBkYXRlX2F1dG9tdXRlICYmIGNoaXAtPmF1dG9fbXV0ZSkKLQkJcmV0dXJuIDA7IC8qIGRvbid0IHRvdWNoIGluIHRoZSBhdXRvLW11dGUgbW9kZSAqLwotCi0JaWYgKG1peCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXN3aXRjaChrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSkgewotCWNhc2UgVE9PTklFX01VVEVfSFA6Ci0JCWdwID0gJm1peC0+aHBfbXV0ZV9ncGlvOwotCQlicmVhazsKLQljYXNlIFRPT05JRV9NVVRFX0FNUDoKLQkJZ3AgPSAmbWl4LT5hbXBfbXV0ZV9ncGlvOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JdmFsID0gISBjaGVja19hdWRpb19ncGlvKGdwKTsKLQlpZiAodmFsICE9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7Ci0JCXdyaXRlX2F1ZGlvX2dwaW8oZ3AsICEgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0b29uaWVfaHBfc3cgX19pbml0ZGF0YSA9IHsKLQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkubmFtZSA9ICJIZWFkcGhvbmUgUGxheWJhY2sgU3dpdGNoIiwKLQkuaW5mbyA9IHNuZF9wbWFjX2Jvb2xlYW5fbW9ub19pbmZvLAotCS5nZXQgPSB0b29uaWVfZ2V0X211dGVfc3dpdGNoLAotCS5wdXQgPSB0b29uaWVfcHV0X211dGVfc3dpdGNoLAotCS5wcml2YXRlX3ZhbHVlID0gVE9PTklFX01VVEVfSFAsCi19Owotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHRvb25pZV9zcGVha2VyX3N3IF9faW5pdGRhdGEgPSB7Ci0JLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCi0JLm5hbWUgPSAiUEMgU3BlYWtlciBQbGF5YmFjayBTd2l0Y2giLAotCS5pbmZvID0gc25kX3BtYWNfYm9vbGVhbl9tb25vX2luZm8sCi0JLmdldCA9IHRvb25pZV9nZXRfbXV0ZV9zd2l0Y2gsCi0JLnB1dCA9IHRvb25pZV9wdXRfbXV0ZV9zd2l0Y2gsCi0JLnByaXZhdGVfdmFsdWUgPSBUT09OSUVfTVVURV9BTVAsCi19OwotCi0vKgotICogYXV0by1tdXRlIHN0dWZmcwotICovCi1zdGF0aWMgaW50IHRvb25pZV9kZXRlY3RfaGVhZHBob25lKHN0cnVjdCBzbmRfcG1hYyAqY2hpcCkKLXsKLQlzdHJ1Y3QgcG1hY190b29uaWUgKm1peCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0JaW50IGRldGVjdCA9IDA7Ci0KLQlpZiAobWl4LT5ocF9kZXRlY3RfZ3Bpby5hZGRyKQotCQlkZXRlY3QgfD0gcmVhZF9hdWRpb19ncGlvKCZtaXgtPmhwX2RldGVjdF9ncGlvKTsKLQlyZXR1cm4gZGV0ZWN0OwotfQotCi1zdGF0aWMgdm9pZCB0b29uaWVfY2hlY2tfbXV0ZShzdHJ1Y3Qgc25kX3BtYWMgKmNoaXAsIHN0cnVjdCBwbWFjX2dwaW8gKmdwLCBpbnQgdmFsLAotCQkJICAgICAgaW50IGRvX25vdGlmeSwgc3RydWN0IHNuZF9rY29udHJvbCAqc3cpCi17Ci0JaWYgKGNoZWNrX2F1ZGlvX2dwaW8oZ3ApICE9IHZhbCkgewotCQl3cml0ZV9hdWRpb19ncGlvKGdwLCB2YWwpOwotCQlpZiAoZG9fbm90aWZ5KQotCQkJc25kX2N0bF9ub3RpZnkoY2hpcC0+Y2FyZCwgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCi0JCQkJICAgICAgICZzdy0+aWQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgdG9vbmllX2RldGVjdF9oYW5kbGVyKHZvaWQgKnNlbGYpCi17Ci0Jc3RydWN0IHNuZF9wbWFjICpjaGlwID0gKHN0cnVjdCBzbmRfcG1hYyAqKSBzZWxmOwotCXN0cnVjdCBwbWFjX3Rvb25pZSAqbWl4OwotCWludCBoZWFkcGhvbmU7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybjsKLQotCW1peCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0Jc25kX2Fzc2VydChtaXgsIHJldHVybik7Ci0KLQloZWFkcGhvbmUgPSB0b29uaWVfZGV0ZWN0X2hlYWRwaG9uZShjaGlwKTsKLQotCURCRygiaGVhZHBob25lOiAlZCwgbGluZW91dDogJWRcbiIsIGhlYWRwaG9uZSwgbGluZW91dCk7Ci0KLQlpZiAoaGVhZHBob25lKSB7Ci0JCS8qIHVubXV0ZSBoZWFkcGhvbmUvbGluZW91dCAmIG11dGUgc3BlYWtlciAqLwotCQl0b29uaWVfY2hlY2tfbXV0ZShjaGlwLCAmbWl4LT5ocF9tdXRlX2dwaW8sIDAsCi0JCQkJICBtaXgtPmF1dG9fbXV0ZV9ub3RpZnksIGNoaXAtPm1hc3Rlcl9zd19jdGwpOwotCQl0b29uaWVfY2hlY2tfbXV0ZShjaGlwLCAmbWl4LT5hbXBfbXV0ZV9ncGlvLCAxLAotCQkJCSAgbWl4LT5hdXRvX211dGVfbm90aWZ5LCBjaGlwLT5zcGVha2VyX3N3X2N0bCk7Ci0JfSBlbHNlIHsKLQkJLyogdW5tdXRlIHNwZWFrZXIsIG11dGUgb3RoZXJzICovCi0JCXRvb25pZV9jaGVja19tdXRlKGNoaXAsICZtaXgtPmFtcF9tdXRlX2dwaW8sIDAsCi0JCQkJICBtaXgtPmF1dG9fbXV0ZV9ub3RpZnksIGNoaXAtPnNwZWFrZXJfc3dfY3RsKTsKLQkJdG9vbmllX2NoZWNrX211dGUoY2hpcCwgJm1peC0+aHBfbXV0ZV9ncGlvLCAxLAotCQkJCSAgbWl4LT5hdXRvX211dGVfbm90aWZ5LCBjaGlwLT5tYXN0ZXJfc3dfY3RsKTsKLQl9Ci0JaWYgKG1peC0+YXV0b19tdXRlX25vdGlmeSkgewotCQlzbmRfY3RsX25vdGlmeShjaGlwLT5jYXJkLCBTTkRSVl9DVExfRVZFTlRfTUFTS19WQUxVRSwKLQkJCQkgICAgICAgJmNoaXAtPmhwX2RldGVjdF9jdGwtPmlkKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHRvb25pZV91cGRhdGVfYXV0b211dGUoc3RydWN0IHNuZF9wbWFjICpjaGlwLCBpbnQgZG9fbm90aWZ5KQotewotCWlmIChjaGlwLT5hdXRvX211dGUpIHsKLQkJc3RydWN0IHBtYWNfdG9vbmllICptaXg7Ci0JCW1peCA9IGNoaXAtPm1peGVyX2RhdGE7Ci0JCXNuZF9hc3NlcnQobWl4LCByZXR1cm4pOwotCQltaXgtPmF1dG9fbXV0ZV9ub3RpZnkgPSBkb19ub3RpZnk7Ci0JCXNjaGVkdWxlX3dvcmsoJm1peC0+ZGV0ZWN0X3dvcmspOwotCX0KLX0KLQotLyogaW50ZXJydXB0IC0gaGVhZHBob25lIHBsdWcgY2hhbmdlZCAqLwotc3RhdGljIGlycXJldHVybl90IHRvb25pZV9ocF9pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3Qgc25kX3BtYWMgKmNoaXAgPSBkZXZpZDsKLQotCWlmIChjaGlwLT51cGRhdGVfYXV0b211dGUgJiYgY2hpcC0+aW5pdGlhbGl6ZWQpIHsKLQkJY2hpcC0+dXBkYXRlX2F1dG9tdXRlKGNoaXAsIDEpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCXJldHVybiBJUlFfTk9ORTsKLX0KLQotLyogbG9vayBmb3IgYXVkaW8gZ3BpbyBkZXZpY2UgKi8KLXN0YXRpYyBpbnQgZmluZF9hdWRpb19ncGlvKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnBsYXRmb3JtLAotCQkJICAgc3RydWN0IHBtYWNfZ3BpbyAqZ3ApCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSAgCXUzMiAqYmFzZSwgYWRkcjsKLQotCWlmICghIChucCA9IGZpbmRfZGV2aWNlcygiZ3BpbyIpKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmb3IgKG5wID0gbnAtPmNoaWxkOyBucDsgbnAgPSBucC0+c2libGluZykgewotCQljaGFyICpwcm9wZXJ0eSA9IGdldF9wcm9wZXJ0eShucCwgImF1ZGlvLWdwaW8iLCBOVUxMKTsKLQkJaWYgKHByb3BlcnR5ICYmIHN0cmNtcChwcm9wZXJ0eSwgbmFtZSkgPT0gMCkKLQkJCWJyZWFrOwotCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIG5hbWUpKQotCQkJYnJlYWs7Ci0JfQotCWlmIChucCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWJhc2UgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiQUFQTCxhZGRyZXNzIiwgTlVMTCk7Ci0JaWYgKCEgYmFzZSkgewotCQliYXNlID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgInJlZyIsIE5VTEwpOwotCQlpZiAoIWJhc2UpIHsKLQkJCURCRygiKEUpIGNhbm5vdCBmaW5kIGFkZHJlc3MgZm9yIGRldmljZSAlcyAhXG4iLCBuYW1lKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCWFkZHIgPSAqYmFzZTsKLQkJaWYgKGFkZHIgPCAweDUwKQotCQkJYWRkciArPSAweDUwOwotCX0gZWxzZQotCQlhZGRyID0gKmJhc2U7Ci0KLQlncC0+YWRkciA9IGFkZHIgJiAweDAwMDBmZmZmOwotCi0JLyogVHJ5IHRvIGZpbmQgdGhlIGFjdGl2ZSBzdGF0ZSwgZGVmYXVsdCB0byAwICEgKi8KLQliYXNlID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgImF1ZGlvLWdwaW8tYWN0aXZlLXN0YXRlIiwgTlVMTCk7Ci0JaWYgKGJhc2UpIHsKLQkJZ3AtPmFjdGl2ZV9zdGF0ZSA9ICpiYXNlOwotCQlncC0+YWN0aXZlX3ZhbCA9ICgqYmFzZSkgPyAweDUgOiAweDQ7Ci0JCWdwLT5pbmFjdGl2ZV92YWwgPSAoKmJhc2UpID8gMHg0IDogMHg1OwotCX0gZWxzZSB7Ci0JCXUzMiAqcHJvcCA9IE5VTEw7Ci0JCWdwLT5hY3RpdmVfc3RhdGUgPSAwOwotCQlncC0+YWN0aXZlX3ZhbCA9IDB4NDsKLQkJZ3AtPmluYWN0aXZlX3ZhbCA9IDB4NTsKLQkJLyogSGVyZSBhcmUgc29tZSBjcnVkZSBoYWNrcyB0byBleHRyYWN0IHRoZSBHUElPIHBvbGFyaXR5IGFuZAotCQkgKiBvcGVuIGNvbGxlY3RvciBpbmZvcm1hdGlvbnMgb3V0IG9mIHRoZSBkby1wbGF0Zm9ybSBzY3JpcHQKLQkJICogYXMgd2UgZG9uJ3QgeWV0IGhhdmUgYW4gaW50ZXJwcmV0ZXIgZm9yIHRoZXNlIHRoaW5ncwotCQkgKi8KLQkJaWYgKHBsYXRmb3JtKQotCQkJcHJvcCA9ICh1MzIgKilnZXRfcHJvcGVydHkobnAsIHBsYXRmb3JtLCBOVUxMKTsKLQkJaWYgKHByb3ApIHsKLQkJCWlmIChwcm9wWzNdID09IDB4OSAmJiBwcm9wWzRdID09IDB4OSkgewotCQkJCWdwLT5hY3RpdmVfdmFsID0gMHhkOwotCQkJCWdwLT5pbmFjdGl2ZV92YWwgPSAweGM7Ci0JCQl9Ci0JCQlpZiAocHJvcFszXSA9PSAweDEgJiYgcHJvcFs0XSA9PSAweDEpIHsKLQkJCQlncC0+YWN0aXZlX3ZhbCA9IDB4NTsKLQkJCQlncC0+aW5hY3RpdmVfdmFsID0gMHg0OwotCQkJfQotCQl9Ci0JfQotCi0JREJHKCIoSSkgR1BJTyBkZXZpY2UgJXMgZm91bmQsIG9mZnNldDogJXgsIGFjdGl2ZSBzdGF0ZTogJWQgIVxuIiwKLQkgICAgbmFtZSwgZ3AtPmFkZHIsIGdwLT5hY3RpdmVfc3RhdGUpOwotCi0JcmV0dXJuIChucC0+bl9pbnRycyA+IDApID8gbnAtPmludHJzWzBdLmxpbmUgOiAwOwotfQotCi1zdGF0aWMgdm9pZCB0b29uaWVfY2xlYW51cChzdHJ1Y3Qgc25kX3BtYWMgKmNoaXApCi17Ci0Jc3RydWN0IHBtYWNfdG9vbmllICptaXggPSBjaGlwLT5taXhlcl9kYXRhOwotCWlmICghIG1peCkKLQkJcmV0dXJuOwotCWlmIChtaXgtPmhwX2RldGVjdF9pcnEgPj0gMCkKLQkJZnJlZV9pcnEobWl4LT5ocF9kZXRlY3RfaXJxLCBjaGlwKTsKLQlrZnJlZShtaXgpOwotCWNoaXAtPm1peGVyX2RhdGEgPSBOVUxMOwotfQotCi1pbnQgX19pbml0IHNuZF9wbWFjX3Rvb25pZV9pbml0KHN0cnVjdCBzbmRfcG1hYyAqY2hpcCkKLXsKLQlzdHJ1Y3QgcG1hY190b29uaWUgKm1peDsKLQotCW1peCA9IGttYWxsb2Moc2l6ZW9mKCptaXgpLCBHRlBfS0VSTkVMKTsKLQlpZiAoISBtaXgpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hpcC0+bWl4ZXJfZGF0YSA9IG1peDsKLQljaGlwLT5taXhlcl9mcmVlID0gdG9vbmllX2NsZWFudXA7Ci0KLQlmaW5kX2F1ZGlvX2dwaW8oImhlYWRwaG9uZS1tdXRlIiwgTlVMTCwgJm1peC0+aHBfbXV0ZV9ncGlvKTsKLQlmaW5kX2F1ZGlvX2dwaW8oImFtcC1tdXRlIiwgTlVMTCwgJm1peC0+YW1wX211dGVfZ3Bpbyk7Ci0JbWl4LT5ocF9kZXRlY3RfaXJxID0gZmluZF9hdWRpb19ncGlvKCJoZWFkcGhvbmUtZGV0ZWN0IiwKLQkJCQkJICAgICBOVUxMLCAmbWl4LT5ocF9kZXRlY3RfZ3Bpbyk7Ci0KLQlzdHJjcHkoY2hpcC0+Y2FyZC0+bWl4ZXJuYW1lLCAiUG93ZXJNYWMgVG9vbmllIik7Ci0KLQljaGlwLT5tYXN0ZXJfc3dfY3RsID0gc25kX2N0bF9uZXcxKCZ0b29uaWVfaHBfc3csIGNoaXApOwotCXNuZF9jdGxfYWRkKGNoaXAtPmNhcmQsIGNoaXAtPm1hc3Rlcl9zd19jdGwpOwotCi0JY2hpcC0+c3BlYWtlcl9zd19jdGwgPSBzbmRfY3RsX25ldzEoJnRvb25pZV9zcGVha2VyX3N3LCBjaGlwKTsKLQlzbmRfY3RsX2FkZChjaGlwLT5jYXJkLCBjaGlwLT5zcGVha2VyX3N3X2N0bCk7Ci0KLQlJTklUX1dPUksoJm1peC0+ZGV0ZWN0X3dvcmssIHRvb25pZV9kZXRlY3RfaGFuZGxlciwgKHZvaWQgKiljaGlwKTsKLQotCWlmIChtaXgtPmhwX2RldGVjdF9pcnEgPj0gMCkgewotCQlzbmRfcG1hY19hZGRfYXV0b211dGUoY2hpcCk7Ci0KLQkJY2hpcC0+ZGV0ZWN0X2hlYWRwaG9uZSA9IHRvb25pZV9kZXRlY3RfaGVhZHBob25lOwotCQljaGlwLT51cGRhdGVfYXV0b211dGUgPSB0b29uaWVfdXBkYXRlX2F1dG9tdXRlOwotCQl0b29uaWVfdXBkYXRlX2F1dG9tdXRlKGNoaXAsIDApOwotCi0JCWlmIChyZXF1ZXN0X2lycShtaXgtPmhwX2RldGVjdF9pcnEsIHRvb25pZV9ocF9pbnRyLCAwLAotCQkJCSJTb3VuZCBIZWFkcGhvbmUgRGV0ZWN0aW9uIiwgY2hpcCkgPCAwKQotCQkJbWl4LT5ocF9kZXRlY3RfaXJxID0gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2FtZDc5MzAuYyBiL3NvdW5kL3NwYXJjL2FtZDc5MzAuYwppbmRleCBkZmU5YmFjLi5iYTFiMmEzIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9hbWQ3OTMwLmMKKysrIGIvc291bmQvc3BhcmMvYW1kNzkzMC5jCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9zYnVzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogc3RhdGljIGludCBpbmRleFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX0lEWDsJLyogSW5kZXggMC1NQVggKi8KIHN0YXRpYyBjaGFyICppZFtTTkRSVl9DQVJEU10gPSBTTkRSVl9ERUZBVUxUX1NUUjsJLyogSUQgZm9yIHRoaXMgY2FyZCAqLwpAQCAtMzM1LDcgKzMzNiw2IEBACiAJaW50CQkJcGdhaW47CiAJaW50CQkJbWdhaW47CiAKLQlzdHJ1Y3Qgc2J1c19kZXYJCSpzZGV2OwogCXVuc2lnbmVkIGludAkJaXJxOwogCXVuc2lnbmVkIGludAkJcmVnc19zaXplOwogCXN0cnVjdCBzbmRfYW1kNzkzMAkqbmV4dDsKQEAgLTk0NiwxMSArOTQ2LDkgQEAKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNuZF9hbWQ3OTMwX2NyZWF0ZShzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCi0JCQkJICAgICBzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYsCiAJCQkJICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJwLAogCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZ19zaXplLAotCQkJCSAgICAgc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxX3Byb3AsCi0JCQkJICAgICBpbnQgZGV2LAorCQkJCSAgICAgaW50IGlycSwgaW50IGRldiwKIAkJCQkgICAgIHN0cnVjdCBzbmRfYW1kNzkzMCAqKnJhbWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTk2NCw3ICs5NjIsNiBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJmFtZC0+bG9jayk7CiAJYW1kLT5jYXJkID0gY2FyZDsKLQlhbWQtPnNkZXYgPSBzZGV2OwogCWFtZC0+cmVnc19zaXplID0gcmVnX3NpemU7CiAKIAlhbWQtPnJlZ3MgPSBzYnVzX2lvcmVtYXAocnAsIDAsIGFtZC0+cmVnc19zaXplLCAiYW1kNzkzMCIpOwpAQCAtOTc1LDE1ICs5NzIsMTQgQEAKIAogCWFtZDc5MzBfaWRsZShhbWQpOwogCi0JaWYgKHJlcXVlc3RfaXJxKGlycV9wcm9wLT5wcmksIHNuZF9hbWQ3OTMwX2ludGVycnVwdCwKKwlpZiAocmVxdWVzdF9pcnEoaXJxLCBzbmRfYW1kNzkzMF9pbnRlcnJ1cHQsCiAJCQlTQV9JTlRFUlJVUFQgfCBTQV9TSElSUSwgImFtZDc5MzAiLCBhbWQpKSB7CiAJCXNuZF9wcmludGsoImFtZDc5MzAtJWQ6IFVuYWJsZSB0byBncmFiIElSUSAlZFxuIiwKLQkJCSAgIGRldiwKLQkJCSAgIGlycV9wcm9wLT5wcmkpOworCQkJICAgZGV2LCBpcnEpOwogCQlzbmRfYW1kNzkzMF9mcmVlKGFtZCk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotCWFtZC0+aXJxID0gaXJxX3Byb3AtPnByaTsKKwlhbWQtPmlycSA9IGlycTsKIAogCWFtZDc5MzBfZW5hYmxlX2ludHMoYW1kKTsKIApAQCAtMTAxNyw0NyArMTAxMywyMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhbWQ3OTMwX2F0dGFjaChpbnQgcHJvbV9ub2RlLCBzdHJ1Y3Qgc2J1c19kZXYgKnNkZXYpCitzdGF0aWMgaW50IF9faW5pdCBhbWQ3OTMwX2F0dGFjaF9jb21tb24oc3RydWN0IHJlc291cmNlICpycCwgaW50IGlycSkKIHsKLQlzdGF0aWMgaW50IGRldjsKLQlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgcmVnX3Byb3A7Ci0Jc3RydWN0IGxpbnV4X3Byb21faXJxcyBpcnFfcHJvcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzLCAqcnA7CisJc3RhdGljIGludCBkZXZfbnVtOwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAlzdHJ1Y3Qgc25kX2FtZDc5MzAgKmFtZDsKIAlpbnQgZXJyOwogCi0JaWYgKGRldiA+PSBTTkRSVl9DQVJEUykKKwlpZiAoZGV2X251bSA+PSBTTkRSVl9DQVJEUykKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFlbmFibGVbZGV2XSkgewotCQlkZXYrKzsKKwlpZiAoIWVuYWJsZVtkZXZfbnVtXSkgeworCQlkZXZfbnVtKys7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAiaW50ciIsCi0JCQkgICAgICAgKGNoYXIgKikgJmlycV9wcm9wLCBzaXplb2YoaXJxX3Byb3ApKTsKLQlpZiAoZXJyIDwgMCkgewotCQlzbmRfcHJpbnRrKCJhbWQ3OTMwLSVkOiBGaXJtd2FyZSBub2RlIGxhY2tzIElSUSBwcm9wZXJ0eS5cbiIsIGRldik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWVyciA9IHByb21fZ2V0cHJvcGVydHkocHJvbV9ub2RlLCAicmVnIiwKLQkJCSAgICAgICAoY2hhciAqKSAmcmVnX3Byb3AsIHNpemVvZihyZWdfcHJvcCkpOwotCWlmIChlcnIgPCAwKSB7Ci0JCXNuZF9wcmludGsoImFtZDc5MzAtJWQ6IEZpcm13YXJlIG5vZGUgbGFja3MgcmVnaXN0ZXIgcHJvcGVydHkuXG4iLCBkZXYpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZiAoc2RldikgewotCQlycCA9ICZzZGV2LT5yZXNvdXJjZVswXTsKLQl9IGVsc2UgewotCQlycCA9ICZyZXM7Ci0JCXJwLT5zdGFydCA9IHJlZ19wcm9wLnBoeXNfYWRkcjsKLQkJcnAtPmVuZCA9IHJwLT5zdGFydCArIHJlZ19wcm9wLnJlZ19zaXplIC0gMTsKLQkJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9JTyB8IChyZWdfcHJvcC53aGljaF9pbyAmIDB4ZmYpOwotCX0KLQotCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2XSwgaWRbZGV2XSwgVEhJU19NT0RVTEUsIDApOworCWNhcmQgPSBzbmRfY2FyZF9uZXcoaW5kZXhbZGV2X251bV0sIGlkW2Rldl9udW1dLCBUSElTX01PRFVMRSwgMCk7CiAJaWYgKGNhcmQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTEwNjcsMTAgKzEwMzcsMTEgQEAKIAkJY2FyZC0+c2hvcnRuYW1lLAogCQlycC0+ZmxhZ3MgJiAweGZmTCwKIAkJcnAtPnN0YXJ0LAotCQlpcnFfcHJvcC5wcmkpOworCQlpcnEpOwogCi0JaWYgKChlcnIgPSBzbmRfYW1kNzkzMF9jcmVhdGUoY2FyZCwgc2RldiwgcnAsIHJlZ19wcm9wLnJlZ19zaXplLAotCQkJCQkgICZpcnFfcHJvcCwgZGV2LCAmYW1kKSkgPCAwKQorCWlmICgoZXJyID0gc25kX2FtZDc5MzBfY3JlYXRlKGNhcmQsIHJwLAorCQkJCSAgICAgIChycC0+ZW5kIC0gcnAtPnN0YXJ0KSArIDEsCisJCQkJICAgICAgaXJxLCBkZXZfbnVtLCAmYW1kKSkgPCAwKQogCQlnb3RvIG91dF9lcnI7CiAKIAlpZiAoKGVyciA9IHNuZF9hbWQ3OTMwX3BjbShhbWQpKSA8IDApCkBAIC0xMDg1LDcgKzEwNTYsOCBAQAogCWFtZC0+bmV4dCA9IGFtZDc5MzBfbGlzdDsKIAlhbWQ3OTMwX2xpc3QgPSBhbWQ7CiAKLQlkZXYrKzsKKwlkZXZfbnVtKys7CisKIAlyZXR1cm4gMDsKIAogb3V0X2VycjoKQEAgLTEwOTMsMjkgKzEwNjUsNzEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhbWQ3OTMwX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGFtZDc5MzBfb2Jpb19hdHRhY2goc3RydWN0IGRldmljZV9ub2RlICpkcCkKIHsKLQlzdHJ1Y3Qgc2J1c19idXMgKnNidXM7Ci0Jc3RydWN0IHNidXNfZGV2ICpzZGV2OwotCWludCBub2RlLCBmb3VuZDsKKwlzdHJ1Y3QgbGludXhfcHJvbV9yZWdpc3RlcnMgKnJlZ3M7CisJc3RydWN0IGxpbnV4X3Byb21faXJxcyAqaXJxcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzLCAqcnA7CisJaW50IGxlbjsKIAotCWZvdW5kID0gMDsKLQotCS8qIFRyeSB0byBmaW5kIHRoZSBzdW40YyAiYXVkaW8iIG5vZGUgZmlyc3QuICovCi0Jbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwotCW5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJhdWRpbyIpOwotCWlmIChub2RlICYmIGFtZDc5MzBfYXR0YWNoKG5vZGUsIE5VTEwpID09IDApCi0JCWZvdW5kKys7Ci0KLQkvKiBQcm9iZSBlYWNoIFNCVVMgZm9yIGFtZDc5MzAgY2hpcHMuICovCi0JZm9yX2FsbF9zYnVzZGV2KHNkZXYsIHNidXMpIHsKLQkJaWYgKCFzdHJjbXAoc2Rldi0+cHJvbV9uYW1lLCAiYXVkaW8iKSkgewotCQkJaWYgKGFtZDc5MzBfYXR0YWNoKHNkZXYtPnByb21fbm9kZSwgc2RldikgPT0gMCkKLQkJCQlmb3VuZCsrOwotCQl9CisJaXJxcCA9IG9mX2dldF9wcm9wZXJ0eShkcCwgImludHIiLCAmbGVuKTsKKwlpZiAoIWlycXApIHsKKwkJc25kX3ByaW50aygiJXM6IEZpcm13YXJlIG5vZGUgbGFja3MgSVJRIHByb3BlcnR5LlxuIiwKKwkJCSAgIGRwLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZXR1cm4gKGZvdW5kID4gMCkgPyAwIDogLUVJTzsKKwlyZWdzID0gb2ZfZ2V0X3Byb3BlcnR5KGRwLCAicmVnIiwgJmxlbik7CisJaWYgKCFyZWdzKSB7CisJCXNuZF9wcmludGsoIiVzOiBGaXJtd2FyZSBub2RlIGxhY2tzIHJlZ2lzdGVyIHByb3BlcnR5LlxuIiwKKwkJCSAgIGRwLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlycCA9ICZyZXM7CisJcnAtPnN0YXJ0ID0gcmVncy0+cGh5c19hZGRyOworCXJwLT5lbmQgPSBycC0+c3RhcnQgKyByZWdzLT5yZWdfc2l6ZSAtIDE7CisJcnAtPmZsYWdzID0gSU9SRVNPVVJDRV9JTyB8IChyZWdzLT53aGljaF9pbyAmIDB4ZmYpOworCisJcmV0dXJuIGFtZDc5MzBfYXR0YWNoX2NvbW1vbihycCwgaXJxcC0+cHJpKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYW1kNzkzMF9zYnVzX3Byb2JlKHN0cnVjdCBvZl9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gpCit7CisJc3RydWN0IHNidXNfZGV2ICpzZGV2ID0gdG9fc2J1c19kZXZpY2UoJmRldi0+ZGV2KTsKKworCXJldHVybiBhbWQ3OTMwX2F0dGFjaF9jb21tb24oJnNkZXYtPnJlc291cmNlWzBdLCBzZGV2LT5pcnFzWzBdKTsKK30KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYW1kNzkzMF9tYXRjaFtdID0geworCXsKKwkJLm5hbWUgPSAiYXVkaW8iLAorCX0sCisJe30sCit9OworCitzdGF0aWMgc3RydWN0IG9mX3BsYXRmb3JtX2RyaXZlciBhbWQ3OTMwX3NidXNfZHJpdmVyID0geworCS5uYW1lCQk9ICJhdWRpbyIsCisJLm1hdGNoX3RhYmxlCT0gYW1kNzkzMF9tYXRjaCwKKwkucHJvYmUJCT0gYW1kNzkzMF9zYnVzX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYW1kNzkzMF9pbml0KHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpkcDsKKworCS8qIFRyeSB0byBmaW5kIHRoZSBzdW40YyAiYXVkaW8iIG5vZGUgZmlyc3QuICovCisJZHAgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiLyIpOworCWRwID0gZHAtPmNoaWxkOworCXdoaWxlIChkcCkgeworCQlpZiAoIXN0cmNtcChkcC0+bmFtZSwgImF1ZGlvIikpCisJCQlhbWQ3OTMwX29iaW9fYXR0YWNoKGRwKTsKKworCQlkcCA9IGRwLT5zaWJsaW5nOworCX0KKworCS8qIFByb2JlIGVhY2ggU0JVUyBmb3IgYW1kNzkzMCBjaGlwcy4gKi8KKwlyZXR1cm4gb2ZfcmVnaXN0ZXJfZHJpdmVyKCZhbWQ3OTMwX3NidXNfZHJpdmVyLCAmc2J1c19idXNfdHlwZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbWQ3OTMwX2V4aXQodm9pZCkKQEAgLTExMzEsNiArMTE0NSw4IEBACiAJfQogCiAJYW1kNzkzMF9saXN0ID0gTlVMTDsKKworCW9mX3VucmVnaXN0ZXJfZHJpdmVyKCZhbWQ3OTMwX3NidXNfZHJpdmVyKTsKIH0KIAogbW9kdWxlX2luaXQoYW1kNzkzMF9pbml0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2NzNDIzMS5jIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKaW5kZXggYjNlZmM5YS4uZGE1NGQwNCAxMDA2NDQKLS0tIGEvc291bmQvc3BhcmMvY3M0MjMxLmMKKysrIGIvc291bmQvc3BhcmMvY3M0MjMxLmMKQEAgLTIyODQsMTUgKzIyODQsMTQgQEAKIAkJZm9yX2VhY2hfZWJ1c2RldihlZGV2LCBlYnVzKSB7CiAJCQlpbnQgbWF0Y2ggPSAwOwogCi0JCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25hbWUsICJTVU5XLENTNDIzMSIpKSB7CisJCQlpZiAoIXN0cmNtcChlZGV2LT5wcm9tX25vZGUtPm5hbWUsICJTVU5XLENTNDIzMSIpKSB7CiAJCQkJbWF0Y2ggPSAxOwotCQkJfSBlbHNlIGlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImF1ZGlvIikpIHsKLQkJCQljaGFyIGNvbXBhdFsxNl07CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoZWRldi0+cHJvbV9ub2RlLT5uYW1lLCAiYXVkaW8iKSkgeworCQkJCWNoYXIgKmNvbXBhdDsKIAotCQkJCXByb21fZ2V0c3RyaW5nKGVkZXYtPnByb21fbm9kZSwgImNvbXBhdGlibGUiLAotCQkJCQkgICAgICAgY29tcGF0LCBzaXplb2YoY29tcGF0KSk7Ci0JCQkJY29tcGF0WzE1XSA9ICdcMCc7Ci0JCQkJaWYgKCFzdHJjbXAoY29tcGF0LCAiU1VOVyxDUzQyMzEiKSkKKwkJCQljb21wYXQgPSBvZl9nZXRfcHJvcGVydHkoZWRldi0+cHJvbV9ub2RlLAorCQkJCQkJCSAiY29tcGF0aWJsZSIsIE5VTEwpOworCQkJCWlmIChjb21wYXQgJiYgIXN0cmNtcChjb21wYXQsICJTVU5XLENTNDIzMSIpKQogCQkJCQltYXRjaCA9IDE7CiAJCQl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NwYXJjL2RicmkuYyBiL3NvdW5kL3NwYXJjL2RicmkuYwppbmRleCBlNjIyZDA4Li41ZWVjZGQwIDEwMDY0NAotLS0gYS9zb3VuZC9zcGFyYy9kYnJpLmMKKysrIGIvc291bmQvc3BhcmMvZGJyaS5jCkBAIC05Miw3ICs5Miw3IEBACiAjZGVmaW5lIERfVVNSCSgxPDw0KQogI2RlZmluZSBEX0RFU0MJKDE8PDUpCiAKLXN0YXRpYyBpbnQgZGJyaV9kZWJ1ZyA9IDA7CitzdGF0aWMgaW50IGRicmlfZGVidWc7CiBtb2R1bGVfcGFyYW0oZGJyaV9kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGJyaV9kZWJ1ZywgIkRlYnVnIHZhbHVlIGZvciBTdW4gREJSSSBzb3VuZGNhcmQuIik7CiAKQEAgLTU5Myw3ICs1OTMsNyBAQAogLyogUmV0dXJuIGEgcG9pbnRlciB0byBkYnJpX3N0cmVhbWluZm8gKi8KICNkZWZpbmUgREJSSV9TVFJFQU0oZGJyaSwgc3Vic3RyZWFtKQkmZGJyaS0+c3RyZWFtX2luZm9bREJSSV9TVFJFQU1OTyhzdWJzdHJlYW0pXQogCi1zdGF0aWMgc3RydWN0IHNuZF9kYnJpICpkYnJpX2xpc3QgPSBOVUxMOwkvKiBBbGwgREJSSSBkZXZpY2VzICovCitzdGF0aWMgc3RydWN0IHNuZF9kYnJpICpkYnJpX2xpc3Q7CS8qIEFsbCBEQlJJIGRldmljZXMgKi8KIAogLyoKICAqIFNob3J0IGRhdGEgcGlwZXMgdHJhbnNtaXQgTFNCIGZpcnN0LiBUaGUgQ1M0MjE1IHJlY2VpdmVzIE1TQiBmaXJzdC4gR3Jyci4KQEAgLTI1MjEsMTEgKzI1MjEsMTEgQEAKIAlzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5OwogCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZGJyaS0+Y2FyZCwgInJlZ3MiLCAmZW50cnkpKQotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGRicmksIDEwMjQsIGRicmlfcmVnc19yZWFkKTsKKwkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBkYnJpLCBkYnJpX3JlZ3NfcmVhZCk7CiAKICNpZmRlZiBEQlJJX0RFQlVHCiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoZGJyaS0+Y2FyZCwgImRlYnVnIiwgJmVudHJ5KSkgewotCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGRicmksIDQwOTYsIGRicmlfZGVidWdfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgZGJyaSwgZGJyaV9kZWJ1Z19yZWFkKTsKIAkJZW50cnktPm1vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsJLyogUmVhZGFibGUgb25seS4gKi8KIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eC5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKaW5kZXggZmM3MzNiYi4uNTczZTM3MCAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4LmMKQEAgLTYzLDYgKzYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZW11eF9uZXcpOwogCiAvKgogICovCkBAIC0xMzYsNiArMTM3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZW11eF9yZWdpc3Rlcik7CiAKIC8qCiAgKi8KQEAgLTE3MSwxOCArMTczLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotCi1FWFBPUlRfU1lNQk9MKHNuZF9lbXV4X25ldyk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9lbXV4X3JlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0woc25kX2VtdXhfZnJlZSk7CiAKLUVYUE9SVF9TWU1CT0woc25kX2VtdXhfdGVybWluYXRlX2FsbCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9lbXV4X2xvY2tfdm9pY2UpOwotRVhQT1JUX1NZTUJPTChzbmRfZW11eF91bmxvY2tfdm9pY2UpOwotCi0vKiBzb3VuZGZvbnQuYyAqLwotRVhQT1JUX1NZTUJPTChzbmRfc2ZfbGluZWFyX3RvX2xvZyk7Ci0KIAogLyoKICAqICBJTklUIHBhcnQKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9wcm9jLmMgYi9zb3VuZC9zeW50aC9lbXV4L2VtdXhfcHJvYy5jCmluZGV4IDFiYTY4Y2UuLjU4Yjk2MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9wcm9jLmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3Byb2MuYwpAQCAtMTE5LDcgKzExOSw2IEBACiAKIAllbnRyeS0+Y29udGVudCA9IFNORFJWX0lORk9fQ09OVEVOVF9URVhUOwogCWVudHJ5LT5wcml2YXRlX2RhdGEgPSBlbXU7Ci0JZW50cnktPmMudGV4dC5yZWFkX3NpemUgPSAxMDI0OwogCWVudHJ5LT5jLnRleHQucmVhZCA9IHNuZF9lbXV4X3Byb2NfaW5mb19yZWFkOwogCWlmIChzbmRfaW5mb19yZWdpc3RlcihlbnRyeSkgPCAwKQogCQlzbmRfaW5mb19mcmVlX2VudHJ5KGVudHJ5KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYyBiL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zZXEuYwppbmRleCA4ZjAwZjA3Li5kMTc2Y2MwIDEwMDY0NAotLS0gYS9zb3VuZC9zeW50aC9lbXV4L2VtdXhfc2VxLmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3NlcS5jCkBAIC01NSw3ICs1NSw4IEBACiAJCQkJIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HTSB8XAogCQkJCSBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR1MgfFwKIAkJCQkgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX1hHIHxcCi0JCQkJIFNORFJWX1NFUV9QT1JUX1RZUEVfRElSRUNUX1NBTVBMRSkKKwkJCQkgU05EUlZfU0VRX1BPUlRfVFlQRV9IQVJEV0FSRSB8XAorCQkJCSBTTkRSVl9TRVFfUE9SVF9UWVBFX1NZTlRIRVNJWkVSKQogCiAvKgogICogSW5pdGlhbGlzZSB0aGUgRU1VWCBTeW50aCBieSBjcmVhdGluZyBhIGNsaWVudCBhbmQgcmVnaXN0ZXJpbmcKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvZW11eF9zeW50aC5jIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKaW5kZXggMjQ3MDVkMS4uMzczMzExOCAxMDA2NDQKLS0tIGEvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKKysrIGIvc291bmQvc3ludGgvZW11eC9lbXV4X3N5bnRoLmMKQEAgLTQzNCw2ICs0MzQsNyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+dm9pY2VfbG9jaywgZmxhZ3MpOwogfQogCitFWFBPUlRfU1lNQk9MKHNuZF9lbXV4X3Rlcm1pbmF0ZV9hbGwpOwogCiAvKgogICogVGVybWluYXRlIGFsbCB2b2ljZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwb3J0CkBAIC05NTEsNiArOTUyLDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPnZvaWNlX2xvY2ssIGZsYWdzKTsKIH0KIAorRVhQT1JUX1NZTUJPTChzbmRfZW11eF9sb2NrX3ZvaWNlKTsKKwogLyoKICAqLwogdm9pZCBzbmRfZW11eF91bmxvY2tfdm9pY2Uoc3RydWN0IHNuZF9lbXV4ICplbXUsIGludCB2b2ljZSkKQEAgLTk2NSwzICs5NjgsNSBAQAogCQkJICAgdm9pY2UsIGVtdS0+dm9pY2VzW3ZvaWNlXS5zdGF0ZSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT52b2ljZV9sb2NrLCBmbGFncyk7CiB9CisKK0VYUE9SVF9TWU1CT0woc25kX2VtdXhfdW5sb2NrX3ZvaWNlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMgYi9zb3VuZC9zeW50aC9lbXV4L3NvdW5kZm9udC5jCmluZGV4IDMyYzI3MTYuLjQ1NWU1MzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3N5bnRoL2VtdXgvc291bmRmb250LmMKKysrIGIvc291bmQvc3ludGgvZW11eC9zb3VuZGZvbnQuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCWJyZWFrOwogCWNhc2UgU05EUlZfU0ZOVF9SRU1PVkVfSU5GTzoKIAkJLyogcGF0Y2ggbXVzdCBiZSBvcGVuZWQgKi8KLQkJaWYgKHNmbGlzdC0+Y3VycnNmKSB7CisJCWlmICghc2ZsaXN0LT5jdXJyc2YpIHsKIAkJCXNuZF9wcmludGsoInNvdW5kZm9udDogcmVtb3ZlX2luZm86IHBhdGNoIG5vdCBvcGVuZWRcbiIpOwogCQkJcmMgPSAtRUlOVkFMOwogCQl9IGVsc2UgewpAQCAtODEwLDYgKzgxMCw5IEBACiAJcmV0dXJuIHY7CiB9CiAKK0VYUE9SVF9TWU1CT0woc25kX3NmX2xpbmVhcl90b19sb2cpOworCisKICNkZWZpbmUgT0ZGU0VUX01TRUMJCTY1MzExNwkJLyogYmFzZSA9IDEwMDAgKi8KICNkZWZpbmUgT0ZGU0VUX0FCU0NFTlQJCTg1MTc4MQkJLyogYmFzZSA9IDgxNzYgKi8KICNkZWZpbmUgT0ZGU0VUX1NBTVBMRVJBVEUJMTAxMTExOQkJLyogYmFzZSA9IDQ0MTAwICovCkBAIC0xNDg1LDQgKzE0ODgsMyBAQAogCXVubG9ja19wcmVzZXQoc2ZsaXN0KTsKIAlyZXR1cm4gMDsKIH0KLQpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYmF1ZGlvLmMgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwppbmRleCA0ZTYxNGFjLi42MjdkZTk1IDEwMDY0NAotLS0gYS9zb3VuZC91c2IvdXNiYXVkaW8uYworKysgYi9zb3VuZC91c2IvdXNiYXVkaW8uYwpAQCAtMjEzOCw3ICsyMTM4LDcgQEAKIAogCXNwcmludGYobmFtZSwgInN0cmVhbSVkIiwgc3RyZWFtLT5wY21faW5kZXgpOwogCWlmICghIHNuZF9jYXJkX3Byb2NfbmV3KGNhcmQsIG5hbWUsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgc3RyZWFtLCAxMDI0LCBwcm9jX3BjbV9mb3JtYXRfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgc3RyZWFtLCBwcm9jX3BjbV9mb3JtYXRfcmVhZCk7CiB9CiAKICNlbHNlCkBAIC0yNjI3LDkgKzI2MjcsMTAgQEAKIAkJaWYgKCFjc2VwICYmIGFsdHNkLT5iTnVtRW5kcG9pbnRzID49IDIpCiAJCQljc2VwID0gc25kX3VzYl9maW5kX2Rlc2MoYWx0cy0+ZW5kcG9pbnRbMV0uZXh0cmEsIGFsdHMtPmVuZHBvaW50WzFdLmV4dHJhbGVuLCBOVUxMLCBVU0JfRFRfQ1NfRU5EUE9JTlQpOwogCQlpZiAoIWNzZXAgfHwgY3NlcFswXSA8IDcgfHwgY3NlcFsyXSAhPSBFUF9HRU5FUkFMKSB7Ci0JCQlzbmRfcHJpbnRrKEtFUk5fRVJSICIlZDoldTolZCA6IG5vIG9yIGludmFsaWQgY2xhc3Mgc3BlY2lmaWMgZW5kcG9pbnQgZGVzY3JpcHRvclxuIiwKKwkJCXNuZF9wcmludGsoS0VSTl9XQVJOSU5HICIlZDoldTolZCA6IG5vIG9yIGludmFsaWQiCisJCQkJICAgIiBjbGFzcyBzcGVjaWZpYyBlbmRwb2ludCBkZXNjcmlwdG9yXG4iLAogCQkJCSAgIGRldi0+ZGV2bnVtLCBpZmFjZV9ubywgYWx0bm8pOwotCQkJY29udGludWU7CisJCQljc2VwID0gTlVMTDsKIAkJfQogCiAJCWZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNjQ4LDcgKzI2NDksNyBAQAogCQlpZiAoc25kX3VzYl9nZXRfc3BlZWQoZGV2KSA9PSBVU0JfU1BFRURfSElHSCkKIAkJCWZwLT5tYXhwYWNrc2l6ZSA9ICgoKGZwLT5tYXhwYWNrc2l6ZSA+PiAxMSkgJiAzKSArIDEpCiAJCQkJCSogKGZwLT5tYXhwYWNrc2l6ZSAmIDB4N2ZmKTsKLQkJZnAtPmF0dHJpYnV0ZXMgPSBjc2VwWzNdOworCQlmcC0+YXR0cmlidXRlcyA9IGNzZXAgPyBjc2VwWzNdIDogMDsKIAogCQkvKiBzb21lIHF1aXJrcyBmb3IgYXR0cmlidXRlcyBoZXJlICovCiAKQEAgLTI5ODAsNyArMjk4MSw3IEBACiAJCXJldHVybiAtRU5YSU87CiAJYWx0cyA9ICZpZmFjZS0+YWx0c2V0dGluZ1sxXTsKIAlhbHRzZCA9IGdldF9pZmFjZV9kZXNjKGFsdHMpOwotCWlmIChhbHRzLT5leHRyYWxlbiAhPSAxMSB8fCBhbHRzLT5leHRyYVsxXSAhPSBDU19BVURJT19JTlRFUkZBQ0UgfHwKKwlpZiAoYWx0cy0+ZXh0cmFsZW4gIT0gMTEgfHwgYWx0cy0+ZXh0cmFbMV0gIT0gVVNCX0RUX0NTX0lOVEVSRkFDRSB8fAogCSAgICBhbHRzZC0+Yk51bUVuZHBvaW50cyAhPSAxKQogCQlyZXR1cm4gLUVOWElPOwogCkBAIC0zMTk3LDkgKzMxOTgsOSBAQAogewogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgInVzYmJ1cyIsICZlbnRyeSkpCi0JCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgMTAyNCwgcHJvY19hdWRpb191c2JidXNfcmVhZCk7CisJCXNuZF9pbmZvX3NldF90ZXh0X29wcyhlbnRyeSwgY2hpcCwgcHJvY19hdWRpb191c2JidXNfcmVhZCk7CiAJaWYgKCEgc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgInVzYmlkIiwgJmVudHJ5KSkKLQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBjaGlwLCAxMDI0LCBwcm9jX2F1ZGlvX3VzYmlkX3JlYWQpOworCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHByb2NfYXVkaW9fdXNiaWRfcmVhZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNiYXVkaW8uaCBiL3NvdW5kL3VzYi91c2JhdWRpby5oCmluZGV4IDg4NzMzNTIuLjBmNGIyYjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JhdWRpby5oCisrKyBiL3NvdW5kL3VzYi91c2JhdWRpby5oCkBAIC0zMCwxMyArMzAsNiBAQAogI2RlZmluZSBVU0JfU1VCQ0xBU1NfTUlESV9TVFJFQU1JTkcJMHgwMwogI2RlZmluZSBVU0JfU1VCQ0xBU1NfVkVORE9SX1NQRUMJMHhmZgogCi0jZGVmaW5lIENTX0FVRElPX1VOREVGSU5FRAkJMHgyMAotI2RlZmluZSBDU19BVURJT19ERVZJQ0UJCQkweDIxCi0jZGVmaW5lIENTX0FVRElPX0NPTkZJR1VSQVRJT04JCTB4MjIKLSNkZWZpbmUgQ1NfQVVESU9fU1RSSU5HCQkJMHgyMwotI2RlZmluZSBDU19BVURJT19JTlRFUkZBQ0UJCTB4MjQKLSNkZWZpbmUgQ1NfQVVESU9fRU5EUE9JTlQJCTB4MjUKLQogI2RlZmluZSBIRUFERVIJCQkJMHgwMQogI2RlZmluZSBJTlBVVF9URVJNSU5BTAkJCTB4MDIKICNkZWZpbmUgT1VUUFVUX1RFUk1JTkFMCQkJMHgwMwpkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzYm1pZGkuYyBiL3NvdW5kL3VzYi91c2JtaWRpLmMKaW5kZXggMmI5ZDk0MC4uNTEwNWI2YiAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzYm1pZGkuYworKysgYi9zb3VuZC91c2IvdXNibWlkaS5jCkBAIC00OCw2ICs0OCw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3Jhd21pZGkuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc2VxdWVuY2VyLmg+CiAjaW5jbHVkZSAidXNiYXVkaW8uaCIKIAogCkBAIC0xMDEwLDk3ICsxMDExLDE1NyBAQAogICogIihwcm9kdWN0KSBNSURJIChuKSIgc2NoZW1hIGJlY2F1c2UgdGhleSBhcmVuJ3QgZXh0ZXJuYWwgTUlESSBwb3J0cywKICAqIHN1Y2ggYXMgaW50ZXJuYWwgY29udHJvbCBvciBzeW50aGVzaXplciBwb3J0cy4KICAqLwotc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgc3RydWN0IHBvcnRfaW5mbyB7CiAJdTMyIGlkOwotCWludCBwb3J0OwotCWNvbnN0IGNoYXIgKm5hbWVfZm9ybWF0OwotfSBzbmRfdXNibWlkaV9wb3J0X25hbWVzW10gPSB7CisJc2hvcnQgaW50IHBvcnQ7CisJc2hvcnQgaW50IHZvaWNlczsKKwljb25zdCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBzZXFfZmxhZ3M7Cit9IHNuZF91c2JtaWRpX3BvcnRfaW5mb1tdID0geworI2RlZmluZSBQT1JUX0lORk8odmVuZG9yLCBwcm9kdWN0LCBudW0sIG5hbWVfLCB2b2ljZXNfLCBmbGFncykgXAorCXsgLmlkID0gVVNCX0lEKHZlbmRvciwgcHJvZHVjdCksIFwKKwkgIC5wb3J0ID0gbnVtLCAudm9pY2VzID0gdm9pY2VzXywgXAorCSAgLm5hbWUgPSBuYW1lXywgLnNlcV9mbGFncyA9IGZsYWdzIH0KKyNkZWZpbmUgRVhURVJOQUxfUE9SVCh2ZW5kb3IsIHByb2R1Y3QsIG51bSwgbmFtZSkgXAorCVBPUlRfSU5GTyh2ZW5kb3IsIHByb2R1Y3QsIG51bSwgbmFtZSwgMCwgXAorCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9HRU5FUklDIHwgXAorCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUgfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9QT1JUKQorI2RlZmluZSBDT05UUk9MX1BPUlQodmVuZG9yLCBwcm9kdWN0LCBudW0sIG5hbWUpIFwKKwlQT1JUX0lORk8odmVuZG9yLCBwcm9kdWN0LCBudW0sIG5hbWUsIDAsIFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyB8IFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX0hBUkRXQVJFKQorI2RlZmluZSBST0xBTkRfU1lOVEhfUE9SVCh2ZW5kb3IsIHByb2R1Y3QsIG51bSwgbmFtZSwgdm9pY2VzKSBcCisJUE9SVF9JTkZPKHZlbmRvciwgcHJvZHVjdCwgbnVtLCBuYW1lLCB2b2ljZXMsIFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyB8IFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR00gfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dNMiB8IFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR1MgfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX1hHIHwgXAorCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUgfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USEVTSVpFUikKKyNkZWZpbmUgU09VTkRDQU5WQVNfUE9SVCh2ZW5kb3IsIHByb2R1Y3QsIG51bSwgbmFtZSwgdm9pY2VzKSBcCisJUE9SVF9JTkZPKHZlbmRvciwgcHJvZHVjdCwgbnVtLCBuYW1lLCB2b2ljZXMsIFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR0VORVJJQyB8IFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR00gfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX0dNMiB8IFwKKwkJICBTTkRSVl9TRVFfUE9SVF9UWVBFX01JRElfR1MgfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9NSURJX1hHIHwgXAorCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfTUlESV9NVDMyIHwgXAorCQkgIFNORFJWX1NFUV9QT1JUX1RZUEVfSEFSRFdBUkUgfCBcCisJCSAgU05EUlZfU0VRX1BPUlRfVFlQRV9TWU5USEVTSVpFUikKIAkvKiBSb2xhbmQgVUEtMTAwICovCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMDApLCAyLCAiJXMgQ29udHJvbCIgfSwKKwlDT05UUk9MX1BPUlQoMHgwNTgyLCAweDAwMDAsIDIsICIlcyBDb250cm9sIiksCiAJLyogUm9sYW5kIFNDLTg4NTAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwMyksIDAsICIlcyBQYXJ0IEEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMDMpLCAxLCAiJXMgUGFydCBCIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDAzKSwgMiwgIiVzIFBhcnQgQyIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwMyksIDMsICIlcyBQYXJ0IEQiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMDMpLCA0LCAiJXMgTUlESSAxIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDAzKSwgNSwgIiVzIE1JREkgMiIgfSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDAzLCAwLCAiJXMgUGFydCBBIiwgMTI4KSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDAzLCAxLCAiJXMgUGFydCBCIiwgMTI4KSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDAzLCAyLCAiJXMgUGFydCBDIiwgMTI4KSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDAzLCAzLCAiJXMgUGFydCBEIiwgMTI4KSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDAzLCA0LCAiJXMgTUlESSAxIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAwMywgNSwgIiVzIE1JREkgMiIpLAogCS8qIFJvbGFuZCBVLTggKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwNCksIDAsICIlcyBNSURJIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDA0KSwgMSwgIiVzIENvbnRyb2wiIH0sCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAwNCwgMCwgIiVzIE1JREkiKSwKKwlDT05UUk9MX1BPUlQoMHgwNTgyLCAweDAwMDQsIDEsICIlcyBDb250cm9sIiksCiAJLyogUm9sYW5kIFNDLTg4MjAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwNyksIDAsICIlcyBQYXJ0IEEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMDcpLCAxLCAiJXMgUGFydCBCIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDA3KSwgMiwgIiVzIE1JREkiIH0sCisJU09VTkRDQU5WQVNfUE9SVCgweDA1ODIsIDB4MDAwNywgMCwgIiVzIFBhcnQgQSIsIDY0KSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDA3LCAxLCAiJXMgUGFydCBCIiwgNjQpLAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwMDcsIDIsICIlcyBNSURJIiksCiAJLyogUm9sYW5kIFNLLTUwMCAqLwotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDBiKSwgMCwgIiVzIFBhcnQgQSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwYiksIDEsICIlcyBQYXJ0IEIiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMGIpLCAyLCAiJXMgTUlESSIgfSwKKwlTT1VORENBTlZBU19QT1JUKDB4MDU4MiwgMHgwMDBiLCAwLCAiJXMgUGFydCBBIiwgNjQpLAorCVNPVU5EQ0FOVkFTX1BPUlQoMHgwNTgyLCAweDAwMGIsIDEsICIlcyBQYXJ0IEIiLCA2NCksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAwYiwgMiwgIiVzIE1JREkiKSwKIAkvKiBSb2xhbmQgU0MtRDcwICovCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMGMpLCAwLCAiJXMgUGFydCBBIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDBjKSwgMSwgIiVzIFBhcnQgQiIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAwYyksIDIsICIlcyBNSURJIiB9LAorCVNPVU5EQ0FOVkFTX1BPUlQoMHgwNTgyLCAweDAwMGMsIDAsICIlcyBQYXJ0IEEiLCA2NCksCisJU09VTkRDQU5WQVNfUE9SVCgweDA1ODIsIDB4MDAwYywgMSwgIiVzIFBhcnQgQiIsIDY0KSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDBjLCAyLCAiJXMgTUlESSIpLAogCS8qIEVkaXJvbCBVTS04ODAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAxNCksIDgsICIlcyBDb250cm9sIiB9LAorCUNPTlRST0xfUE9SVCgweDA1ODIsIDB4MDAxNCwgOCwgIiVzIENvbnRyb2wiKSwKIAkvKiBFZGlyb2wgU0QtOTAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAxNiksIDAsICIlcyBQYXJ0IEEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMTYpLCAxLCAiJXMgUGFydCBCIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDE2KSwgMiwgIiVzIE1JREkgMSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAxNiksIDMsICIlcyBNSURJIDIiIH0sCisJUk9MQU5EX1NZTlRIX1BPUlQoMHgwNTgyLCAweDAwMTYsIDAsICIlcyBQYXJ0IEEiLCAxMjgpLAorCVJPTEFORF9TWU5USF9QT1JUKDB4MDU4MiwgMHgwMDE2LCAxLCAiJXMgUGFydCBCIiwgMTI4KSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDE2LCAyLCAiJXMgTUlESSAxIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAxNiwgMywgIiVzIE1JREkgMiIpLAogCS8qIEVkaXJvbCBVTS01NTAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyMyksIDUsICIlcyBDb250cm9sIiB9LAorCUNPTlRST0xfUE9SVCgweDA1ODIsIDB4MDAyMywgNSwgIiVzIENvbnRyb2wiKSwKIAkvKiBFZGlyb2wgU0QtMjAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyNyksIDAsICIlcyBQYXJ0IEEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMjcpLCAxLCAiJXMgUGFydCBCIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDI3KSwgMiwgIiVzIE1JREkiIH0sCisJUk9MQU5EX1NZTlRIX1BPUlQoMHgwNTgyLCAweDAwMjcsIDAsICIlcyBQYXJ0IEEiLCA2NCksCisJUk9MQU5EX1NZTlRIX1BPUlQoMHgwNTgyLCAweDAwMjcsIDEsICIlcyBQYXJ0IEIiLCA2NCksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAyNywgMiwgIiVzIE1JREkiKSwKIAkvKiBFZGlyb2wgU0QtODAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyOSksIDAsICIlcyBQYXJ0IEEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMjkpLCAxLCAiJXMgUGFydCBCIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDI5KSwgMiwgIiVzIE1JREkgMSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyOSksIDMsICIlcyBNSURJIDIiIH0sCisJUk9MQU5EX1NZTlRIX1BPUlQoMHgwNTgyLCAweDAwMjksIDAsICIlcyBQYXJ0IEEiLCAxMjgpLAorCVJPTEFORF9TWU5USF9QT1JUKDB4MDU4MiwgMHgwMDI5LCAxLCAiJXMgUGFydCBCIiwgMTI4KSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDI5LCAyLCAiJXMgTUlESSAxIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAyOSwgMywgIiVzIE1JREkgMiIpLAogCS8qIEVkaXJvbCBVQS03MDAgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyYiksIDAsICIlcyBNSURJIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDJiKSwgMSwgIiVzIENvbnRyb2wiIH0sCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAyYiwgMCwgIiVzIE1JREkiKSwKKwlDT05UUk9MX1BPUlQoMHgwNTgyLCAweDAwMmIsIDEsICIlcyBDb250cm9sIiksCiAJLyogUm9sYW5kIFZhcmlPUyAqLwotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDJmKSwgMCwgIiVzIE1JREkiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMmYpLCAxLCAiJXMgRXh0ZXJuYWwgTUlESSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAyZiksIDIsICIlcyBTeW5jIiB9LAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwMmYsIDAsICIlcyBNSURJIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAyZiwgMSwgIiVzIEV4dGVybmFsIE1JREkiKSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDJmLCAyLCAiJXMgU3luYyIpLAogCS8qIEVkaXJvbCBQQ1IgKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAzMyksIDAsICIlcyBNSURJIiB9LAotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDMzKSwgMSwgIiVzIDEiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwMzMpLCAyLCAiJXMgMiIgfSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDMzLCAwLCAiJXMgTUlESSIpLAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwMzMsIDEsICIlcyAxIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDAzMywgMiwgIiVzIDIiKSwKIAkvKiBCT1NTIEdTLTEwICovCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwM2IpLCAwLCAiJXMgTUlESSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDAzYiksIDEsICIlcyBDb250cm9sIiB9LAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwM2IsIDAsICIlcyBNSURJIiksCisJQ09OVFJPTF9QT1JUKDB4MDU4MiwgMHgwMDNiLCAxLCAiJXMgQ29udHJvbCIpLAogCS8qIEVkaXJvbCBVQS0xMDAwICovCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwNDQpLCAwLCAiJXMgTUlESSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDA0NCksIDEsICIlcyBDb250cm9sIiB9LAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwNDQsIDAsICIlcyBNSURJIiksCisJQ09OVFJPTF9QT1JUKDB4MDU4MiwgMHgwMDQ0LCAxLCAiJXMgQ29udHJvbCIpLAogCS8qIEVkaXJvbCBVUi04MCAqLwotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDQ4KSwgMCwgIiVzIE1JREkiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwNDgpLCAxLCAiJXMgMSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDA0OCksIDIsICIlcyAyIiB9LAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwNDgsIDAsICIlcyBNSURJIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDA0OCwgMSwgIiVzIDEiKSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDQ4LCAyLCAiJXMgMiIpLAogCS8qIEVkaXJvbCBQQ1ItQSAqLwotCXsgVVNCX0lEKDB4MDU4MiwgMHgwMDRkKSwgMCwgIiVzIE1JREkiIH0sCi0JeyBVU0JfSUQoMHgwNTgyLCAweDAwNGQpLCAxLCAiJXMgMSIgfSwKLQl7IFVTQl9JRCgweDA1ODIsIDB4MDA0ZCksIDIsICIlcyAyIiB9LAorCUVYVEVSTkFMX1BPUlQoMHgwNTgyLCAweDAwNGQsIDAsICIlcyBNSURJIiksCisJRVhURVJOQUxfUE9SVCgweDA1ODIsIDB4MDA0ZCwgMSwgIiVzIDEiKSwKKwlFWFRFUk5BTF9QT1JUKDB4MDU4MiwgMHgwMDRkLCAyLCAiJXMgMiIpLAogCS8qIEVkaXJvbCBVTS0zRVggKi8KLQl7IFVTQl9JRCgweDA1ODIsIDB4MDA5YSksIDMsICIlcyBDb250cm9sIiB9LAorCUNPTlRST0xfUE9SVCgweDA1ODIsIDB4MDA5YSwgMywgIiVzIENvbnRyb2wiKSwKIAkvKiBNLUF1ZGlvIE1pZGlTcG9ydCA4eDggKi8KLQl7IFVTQl9JRCgweDA3NjMsIDB4MTAzMSksIDgsICIlcyBDb250cm9sIiB9LAotCXsgVVNCX0lEKDB4MDc2MywgMHgxMDMzKSwgOCwgIiVzIENvbnRyb2wiIH0sCisJQ09OVFJPTF9QT1JUKDB4MDc2MywgMHgxMDMxLCA4LCAiJXMgQ29udHJvbCIpLAorCUNPTlRST0xfUE9SVCgweDA3NjMsIDB4MTAzMywgOCwgIiVzIENvbnRyb2wiKSwKIAkvKiBNT1RVIEZhc3RsYW5lICovCi0JeyBVU0JfSUQoMHgwN2ZkLCAweDAwMDEpLCAwLCAiJXMgTUlESSBBIiB9LAotCXsgVVNCX0lEKDB4MDdmZCwgMHgwMDAxKSwgMSwgIiVzIE1JREkgQiIgfSwKKwlFWFRFUk5BTF9QT1JUKDB4MDdmZCwgMHgwMDAxLCAwLCAiJXMgTUlESSBBIiksCisJRVhURVJOQUxfUE9SVCgweDA3ZmQsIDB4MDAwMSwgMSwgIiVzIE1JREkgQiIpLAogCS8qIEVtYWdpYyBVbml0b3I4L0FNVDgvTVQ0ICovCi0JeyBVU0JfSUQoMHgwODZhLCAweDAwMDEpLCA4LCAiJXMgQnJvYWRjYXN0IiB9LAotCXsgVVNCX0lEKDB4MDg2YSwgMHgwMDAyKSwgOCwgIiVzIEJyb2FkY2FzdCIgfSwKLQl7IFVTQl9JRCgweDA4NmEsIDB4MDAwMyksIDQsICIlcyBCcm9hZGNhc3QiIH0sCisJRVhURVJOQUxfUE9SVCgweDA4NmEsIDB4MDAwMSwgOCwgIiVzIEJyb2FkY2FzdCIpLAorCUVYVEVSTkFMX1BPUlQoMHgwODZhLCAweDAwMDIsIDgsICIlcyBCcm9hZGNhc3QiKSwKKwlFWFRFUk5BTF9QT1JUKDB4MDg2YSwgMHgwMDAzLCA0LCAiJXMgQnJvYWRjYXN0IiksCiB9OwogCitzdGF0aWMgc3RydWN0IHBvcnRfaW5mbyAqZmluZF9wb3J0X2luZm8oc3RydWN0IHNuZF91c2JfbWlkaSogdW1pZGksIGludCBudW1iZXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzbmRfdXNibWlkaV9wb3J0X2luZm8pOyArK2kpIHsKKwkJaWYgKHNuZF91c2JtaWRpX3BvcnRfaW5mb1tpXS5pZCA9PSB1bWlkaS0+Y2hpcC0+dXNiX2lkICYmCisJCSAgICBzbmRfdXNibWlkaV9wb3J0X2luZm9baV0ucG9ydCA9PSBudW1iZXIpCisJCQlyZXR1cm4gJnNuZF91c2JtaWRpX3BvcnRfaW5mb1tpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNuZF91c2JtaWRpX2dldF9wb3J0X2luZm8oc3RydWN0IHNuZF9yYXdtaWRpICpybWlkaSwgaW50IG51bWJlciwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3NlcV9wb3J0X2luZm8gKnNlcV9wb3J0X2luZm8pCit7CisJc3RydWN0IHNuZF91c2JfbWlkaSAqdW1pZGkgPSBybWlkaS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwb3J0X2luZm8gKnBvcnRfaW5mbzsKKworCS8qIFRPRE86IHJlYWQgcG9ydCBmbGFncyBmcm9tIGRlc2NyaXB0b3JzICovCisJcG9ydF9pbmZvID0gZmluZF9wb3J0X2luZm8odW1pZGksIG51bWJlcik7CisJaWYgKHBvcnRfaW5mbykgeworCQlzZXFfcG9ydF9pbmZvLT50eXBlID0gcG9ydF9pbmZvLT5zZXFfZmxhZ3M7CisJCXNlcV9wb3J0X2luZm8tPm1pZGlfdm9pY2VzID0gcG9ydF9pbmZvLT52b2ljZXM7CisJfQorfQorCiBzdGF0aWMgdm9pZCBzbmRfdXNibWlkaV9pbml0X3N1YnN0cmVhbShzdHJ1Y3Qgc25kX3VzYl9taWRpKiB1bWlkaSwKIAkJCQkgICAgICAgaW50IHN0cmVhbSwgaW50IG51bWJlciwKIAkJCQkgICAgICAgc3RydWN0IHNuZF9yYXdtaWRpX3N1YnN0cmVhbSAqKiByc3Vic3RyZWFtKQogewotCWludCBpOworCXN0cnVjdCBwb3J0X2luZm8gKnBvcnRfaW5mbzsKIAljb25zdCBjaGFyICpuYW1lX2Zvcm1hdDsKIAogCXN0cnVjdCBzbmRfcmF3bWlkaV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IHNuZF91c2JtaWRpX2ZpbmRfc3Vic3RyZWFtKHVtaWRpLCBzdHJlYW0sIG51bWJlcik7CkBAIC0xMTEwLDE0ICsxMTcxLDggQEAKIAl9CiAKIAkvKiBUT0RPOiByZWFkIHBvcnQgbmFtZSBmcm9tIGphY2sgZGVzY3JpcHRvciAqLwotCW5hbWVfZm9ybWF0ID0gIiVzIE1JREkgJWQiOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNuZF91c2JtaWRpX3BvcnRfbmFtZXMpOyArK2kpIHsKLQkJaWYgKHNuZF91c2JtaWRpX3BvcnRfbmFtZXNbaV0uaWQgPT0gdW1pZGktPmNoaXAtPnVzYl9pZCAmJgotCQkgICAgc25kX3VzYm1pZGlfcG9ydF9uYW1lc1tpXS5wb3J0ID09IG51bWJlcikgewotCQkJbmFtZV9mb3JtYXQgPSBzbmRfdXNibWlkaV9wb3J0X25hbWVzW2ldLm5hbWVfZm9ybWF0OwotCQkJYnJlYWs7Ci0JCX0KLQl9CisJcG9ydF9pbmZvID0gZmluZF9wb3J0X2luZm8odW1pZGksIG51bWJlcik7CisJbmFtZV9mb3JtYXQgPSBwb3J0X2luZm8gPyBwb3J0X2luZm8tPm5hbWUgOiAiJXMgTUlESSAlZCI7CiAJc25wcmludGYoc3Vic3RyZWFtLT5uYW1lLCBzaXplb2Yoc3Vic3RyZWFtLT5uYW1lKSwKIAkJIG5hbWVfZm9ybWF0LCB1bWlkaS0+Y2hpcC0+Y2FyZC0+c2hvcnRuYW1lLCBudW1iZXIgKyAxKTsKIApAQCAtMTM1OCw3ICsxNDEzLDcgQEAKIAlmb3IgKGNzX2Rlc2MgPSBob3N0aWYtPmV4dHJhOwogCSAgICAgY3NfZGVzYyA8IGhvc3RpZi0+ZXh0cmEgKyBob3N0aWYtPmV4dHJhbGVuICYmIGNzX2Rlc2NbMF0gPj0gMjsKIAkgICAgIGNzX2Rlc2MgKz0gY3NfZGVzY1swXSkgewotCQlpZiAoY3NfZGVzY1sxXSA9PSBDU19BVURJT19JTlRFUkZBQ0UpIHsKKwkJaWYgKGNzX2Rlc2NbMV0gPT0gVVNCX0RUX0NTX0lOVEVSRkFDRSkgewogCQkJaWYgKGNzX2Rlc2NbMl0gPT0gTUlESV9JTl9KQUNLKQogCQkJCWVuZHBvaW50LT5pbl9jYWJsZXMgPSAoZW5kcG9pbnQtPmluX2NhYmxlcyA8PCAxKSB8IDE7CiAJCQllbHNlIGlmIChjc19kZXNjWzJdID09IE1JRElfT1VUX0pBQ0spCkBAIC0xNDU3LDYgKzE1MTIsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCBzbmRfcmF3bWlkaV9nbG9iYWxfb3BzIHNuZF91c2JtaWRpX29wcyA9IHsKKwkuZ2V0X3BvcnRfaW5mbyA9IHNuZF91c2JtaWRpX2dldF9wb3J0X2luZm8sCit9OworCiBzdGF0aWMgaW50IHNuZF91c2JtaWRpX2NyZWF0ZV9yYXdtaWRpKHN0cnVjdCBzbmRfdXNiX21pZGkqIHVtaWRpLAogCQkJCSAgICAgIGludCBvdXRfcG9ydHMsIGludCBpbl9wb3J0cykKIHsKQEAgLTE0NzIsNiArMTUzMSw3IEBACiAJcm1pZGktPmluZm9fZmxhZ3MgPSBTTkRSVl9SQVdNSURJX0lORk9fT1VUUFVUIHwKIAkJCSAgICBTTkRSVl9SQVdNSURJX0lORk9fSU5QVVQgfAogCQkJICAgIFNORFJWX1JBV01JRElfSU5GT19EVVBMRVg7CisJcm1pZGktPm9wcyA9ICZzbmRfdXNibWlkaV9vcHM7CiAJcm1pZGktPnByaXZhdGVfZGF0YSA9IHVtaWRpOwogCXJtaWRpLT5wcml2YXRlX2ZyZWUgPSBzbmRfdXNibWlkaV9yYXdtaWRpX2ZyZWU7CiAJc25kX3Jhd21pZGlfc2V0X29wcyhybWlkaSwgU05EUlZfUkFXTUlESV9TVFJFQU1fT1VUUFVULCAmc25kX3VzYm1pZGlfb3V0cHV0X29wcyk7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvdXNibWl4ZXIuYyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCmluZGV4IGNlODYyODMuLjQ5MWU5NzUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi91c2JtaXhlci5jCisrKyBiL3NvdW5kL3VzYi91c2JtaXhlci5jCkBAIC00Niw2ICs0NiwyNyBAQAogLyogaWdub3JlIGVycm9yIGZyb20gY29udHJvbHMgLSBmb3IgZGVidWdnaW5nICovCiAvKiAjZGVmaW5lIElHTk9SRV9DVExfRVJST1IgKi8KIAorLyoKKyAqIFNvdW5kIEJsYXN0ZXIgcmVtb3RlIGNvbnRyb2wgY29uZmlndXJhdGlvbgorICoKKyAqIGZvcm1hdCBvZiByZW1vdGUgY29udHJvbCBkYXRhOgorICogRXh0aWd5OiAgICAgICB4eCAwMAorICogQXVkaWd5IDIgTlg6ICAwNiA4MCB4eCAwMCAwMCAwMAorICogTGl2ZSEgMjQtYml0OiAwNiA4MCB4eCB5eSAyMiA4MworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHJjX2NvbmZpZyB7CisJdTMyIHVzYl9pZDsKKwl1OCAgb2Zmc2V0OworCXU4ICBsZW5ndGg7CisJdTggIHBhY2tldF9sZW5ndGg7CisJdTggIG11dGVfbWl4ZXJfaWQ7CisJdTMyIG11dGVfY29kZTsKK30gcmNfY29uZmlnc1tdID0geworCXsgVVNCX0lEKDB4MDQxZSwgMHgzMDAwKSwgMCwgMSwgMiwgIDE4LCAweDAwMTMgfSwgLyogRXh0aWd5ICAgICAgICovCisJeyBVU0JfSUQoMHgwNDFlLCAweDMwMjApLCAyLCAxLCA2LCAgMTgsIDB4MDAxMyB9LCAvKiBBdWRpZ3kgMiBOWCAgKi8KKwl7IFVTQl9JRCgweDA0MWUsIDB4MzA0MCksIDIsIDIsIDYsICAyLCAgMHg2ZTkxIH0sIC8qIExpdmUhIDI0LWJpdCAqLworfTsKKwogc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgewogCXN0cnVjdCBzbmRfdXNiX2F1ZGlvICpjaGlwOwogCXVuc2lnbmVkIGludCBjdHJsaWY7CkBAIC01NSwxMSArNzYsNyBAQAogCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICoqaWRfZWxlbXM7IC8qIGFycmF5WzI1Nl0sIGluZGV4ZWQgYnkgdW5pdCBpZCAqLwogCiAJLyogU291bmQgQmxhc3RlciByZW1vdGUgY29udHJvbCBzdHVmZiAqLwotCWVudW0gewotCQlSQ19OT05FLAotCQlSQ19FWFRJR1ksCi0JCVJDX0FVRElHWTJOWCwKLQl9IHJjX3R5cGU7CisJY29uc3Qgc3RydWN0IHJjX2NvbmZpZyAqcmNfY2ZnOwogCXVuc2lnbmVkIGxvbmcgcmNfaHdkZXBfb3BlbjsKIAl1MzIgcmNfY29kZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCByY193YWl0cTsKQEAgLTE2NDcsNyArMTY2NCw3IEBACiBzdGF0aWMgdm9pZCBzbmRfdXNiX21peGVyX21lbW9yeV9jaGFuZ2Uoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAogCQkJCQlpbnQgdW5pdGlkKQogewotCWlmIChtaXhlci0+cmNfdHlwZSA9PSBSQ19OT05FKQorCWlmICghbWl4ZXItPnJjX2NmZykKIAkJcmV0dXJuOwogCS8qIHVuaXQgaWRzIHNwZWNpZmljIHRvIEV4dGlneS9BdWRpZ3kgMiBOWDogKi8KIAlzd2l0Y2ggKHVuaXRpZCkgewpAQCAtMTczMiwyMCArMTc0OSwxOSBAQAogCQkJCQkJIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IHVyYi0+Y29udGV4dDsKLQkvKgotCSAqIGZvcm1hdCBvZiByZW1vdGUgY29udHJvbCBkYXRhOgotCSAqIEV4dGlneToJeHggMDAKLQkgKiBBdWRpZ3kgMiBOWDoJMDYgODAgeHggMDAgMDAgMDAKLQkgKi8KLQlpbnQgb2Zmc2V0ID0gbWl4ZXItPnJjX3R5cGUgPT0gUkNfRVhUSUdZID8gMCA6IDI7CisJY29uc3Qgc3RydWN0IHJjX2NvbmZpZyAqcmMgPSBtaXhlci0+cmNfY2ZnOwogCXUzMiBjb2RlOwogCi0JaWYgKHVyYi0+c3RhdHVzIDwgMCB8fCB1cmItPmFjdHVhbF9sZW5ndGggPD0gb2Zmc2V0KQorCWlmICh1cmItPnN0YXR1cyA8IDAgfHwgdXJiLT5hY3R1YWxfbGVuZ3RoIDwgcmMtPnBhY2tldF9sZW5ndGgpCiAJCXJldHVybjsKLQljb2RlID0gbWl4ZXItPnJjX2J1ZmZlcltvZmZzZXRdOworCisJY29kZSA9IG1peGVyLT5yY19idWZmZXJbcmMtPm9mZnNldF07CisJaWYgKHJjLT5sZW5ndGggPT0gMikKKwkJY29kZSB8PSBtaXhlci0+cmNfYnVmZmVyW3JjLT5vZmZzZXQgKyAxXSA8PCA4OworCiAJLyogdGhlIE11dGUgYnV0dG9uIGFjdHVhbGx5IGNoYW5nZXMgdGhlIG1peGVyIGNvbnRyb2wgKi8KLQlpZiAoY29kZSA9PSAxMykKLQkJc25kX3VzYl9taXhlcl9ub3RpZnlfaWQobWl4ZXIsIDE4KTsKKwlpZiAoY29kZSA9PSByYy0+bXV0ZV9jb2RlKQorCQlzbmRfdXNiX21peGVyX25vdGlmeV9pZChtaXhlciwgcmMtPm11dGVfbWl4ZXJfaWQpOwogCW1peGVyLT5yY19jb2RlID0gY29kZTsKIAl3bWIoKTsKIAl3YWtlX3VwKCZtaXhlci0+cmNfd2FpdHEpOwpAQCAtMTgwMSwyMSArMTgxNywxNyBAQAogc3RhdGljIGludCBzbmRfdXNiX3NvdW5kYmxhc3Rlcl9yZW1vdGVfaW5pdChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCiB7CiAJc3RydWN0IHNuZF9od2RlcCAqaHdkZXA7Ci0JaW50IGVyciwgbGVuOworCWludCBlcnIsIGxlbiwgaTsKIAotCXN3aXRjaCAobWl4ZXItPmNoaXAtPnVzYl9pZCkgewotCWNhc2UgVVNCX0lEKDB4MDQxZSwgMHgzMDAwKToKLQkJbWl4ZXItPnJjX3R5cGUgPSBSQ19FWFRJR1k7Ci0JCWxlbiA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgVVNCX0lEKDB4MDQxZSwgMHgzMDIwKToKLQkJbWl4ZXItPnJjX3R5cGUgPSBSQ19BVURJR1kyTlg7Ci0JCWxlbiA9IDY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmNfY29uZmlncyk7ICsraSkKKwkJaWYgKHJjX2NvbmZpZ3NbaV0udXNiX2lkID09IG1peGVyLT5jaGlwLT51c2JfaWQpCisJCQlicmVhazsKKwlpZiAoaSA+PSBBUlJBWV9TSVpFKHJjX2NvbmZpZ3MpKQogCQlyZXR1cm4gMDsKLQl9CisJbWl4ZXItPnJjX2NmZyA9ICZyY19jb25maWdzW2ldOwogCisJbGVuID0gbWl4ZXItPnJjX2NmZy0+cGFja2V0X2xlbmd0aDsKKwkKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaXhlci0+cmNfd2FpdHEpOwogCWVyciA9IHNuZF9od2RlcF9uZXcobWl4ZXItPmNoaXAtPmNhcmQsICJTQiByZW1vdGUgY29udHJvbCIsIDAsICZod2RlcCk7CiAJaWYgKGVyciA8IDApCkBAIC0xOTk4LDcgKzIwMTAsNyBAQAogCQlpZiAoKGVyciA9IHNuZF9hdWRpZ3kybnhfY29udHJvbHNfY3JlYXRlKG1peGVyKSkgPCAwKQogCQkJZ290byBfZXJyb3I7CiAJCWlmICghc25kX2NhcmRfcHJvY19uZXcoY2hpcC0+Y2FyZCwgImF1ZGlneTJueCIsICZlbnRyeSkpCi0JCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIG1peGVyLCAxMDI0LAorCQkJc25kX2luZm9fc2V0X3RleHRfb3BzKGVudHJ5LCBtaXhlciwKIAkJCQkJICAgICAgc25kX2F1ZGlneTJueF9wcm9jX3JlYWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYyBiL3NvdW5kL3VzYi91c3gyeS91c3gyeWh3ZGVwcGNtLmMKaW5kZXggZmU2N2E5Mi4uODhiNzJiNSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3VzeDJ5L3VzeDJ5aHdkZXBwY20uYworKysgYi9zb3VuZC91c2IvdXN4MnkvdXN4Mnlod2RlcHBjbS5jCkBAIC02MzIsNyArNjMyLDcgQEAKIAkJZm9yIChzID0gMDsgcyA8IDI7ICsrcykgewogCQkJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc10uc3Vic3RyZWFtOwotCQkJaWYgKHN1YnN0cmVhbSAmJiBzdWJzdHJlYW0tPmZmaWxlICE9IE5VTEwpCisJCQlpZiAoU1VCU1RSRUFNX0JVU1koc3Vic3RyZWFtKSkKIAkJCQllcnIgPSAtRUJVU1k7CiAJCX0KIAl9Cg==